pax_global_header00006660000000000000000000000064132602064460014515gustar00rootroot0000000000000052 comment=c4830bd93c6ec68084425c05965ed07706026397 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/000077500000000000000000000000001326020644600207035ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/.gitignore000066400000000000000000000006001326020644600226670ustar00rootroot00000000000000syntax: glob *.orig *.swp *.gmo *.in *.m4 *.pyc *.pyo *~ autom4te.cache data/org.gajim.Gajim.appdata.xml data/org.gajim.Gajim.desktop libtool po/.intltool-merge-cache data/gajim-remote.desktop po/gajim.pot po/POTFILES po/stamp-it stamp-h1 Makefile __pycache__/ build/ dist/ gajim.egg-info/ src/gtk/ win/_build_root syntax: regexp ^config\.* ^config\/ ^scripts\/gajim.* !MANIFEST.in gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/.gitlab-ci.yml000066400000000000000000000031121326020644600233340ustar00rootroot00000000000000before_script: - sudo apt-get update -qq && sudo apt-get install -y -qq libtool pkg-config python3-openssl gir1.2-gtk-3.0 python3-gi python3-nbxmpp-nightly pylint3 - sudo apt-get build-dep -y -qq gajim-default-nightly stages: - test - build run-test: stage: test script: - python3 setup.py test_nogui run-pylint: stage: test script: - pylint3 --additional-builtins=_ --disable=all --enable=E0001,E0011,E0012,E0100,E0101,E0102,E0103,E0104,E0105,E0106,E0107,E0108,E0202,E0221,E0222,E0235,E0501,E0502,E0503,E0602,E0603,E0604,E0701,E0702,E1001,E1002,E1003,E1004,E1111,E1120,E1121,E1122,E1123,E1124,E1125,E1200,E1201,E1205,E1206,E1300,E1301,E1302,E1303,E1304,E1305,E1306,E1310,E1700,E1701,W0102 gajim run-build: stage: build script: - python3 setup.py sdist - cd dist - export FN="gajim-default-"$(date +%F)".tar" - mv gajim-*.tar.gz $FN.gz - mkdir tmp_add_plugins - mv $FN.gz tmp_add_plugins/ - cd tmp_add_plugins/ - tar xzf $FN.gz - rm $FN.gz - export GF=$(find . -maxdepth 1 -type d -name 'gajim-*') - mkdir -p $GF/gajim/data/plugins/ - cd $GF/gajim/data/plugins/ - curl -O https://ftp.gajim.org/plugins_1/plugin_installer.zip - unzip plugin_installer.zip - rm plugin_installer.zip - cd ../../../.. - tar czf ../$FN.gz gajim-* - cd .. - rm -rf tmp_add_plugins - scp $FN.gz panoramix:/var/www/gajim/downloads/snap/ci/gajim-default-$CI_COMMIT_SHA.tar.gz artifacts: name: "gajim-default-$CI_COMMIT_REF_NAME-$CI_COMMIT_SHA" expire_in: 1 week paths: - gajim-default-2???-??-??.tar.gz gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/.gitlab/000077500000000000000000000000001326020644600222235ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/.gitlab/issue_templates/000077500000000000000000000000001326020644600254315ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/.gitlab/issue_templates/Bug.md000066400000000000000000000004021326020644600264640ustar00rootroot00000000000000**Please first check if another issue has been opened for your problem** ## Versions - OS: - Gajim version: - GTK version: - Python-nbxmpp version: ## Steps to reproduce the problem 1. 1. 1. ## Expected behavior ## Actual behavior gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/.gitlab/issue_templates/Enhancement.md000066400000000000000000000001761326020644600302040ustar00rootroot00000000000000**Please note by far the quickest way to get a new feature is to file a Merge Request.** ## Description of the new feature gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/AUTHORS000066400000000000000000000000001326020644600217410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/COPYING000066400000000000000000001045131326020644600217420ustar00rootroot00000000000000 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 . gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/ChangeLog000066400000000000000000000542031326020644600224610ustar00rootroot00000000000000Gajim 1.0.1 (1 April 2018) * Improve MAM support * Image preview in file chooser dialog * Groupchat: Set minimize on auto join default True * Delete bookmark when we destroy a room * Fix account deletion * Fix custom font handling * Fix OpenPGP message decryption * Fix window position restore on multi-head setups * Fix scrolling in message window * Improve Windows build and build for 64 bits Gajim 1.0.0 (17 March 2018) * Ported to GTK3 / Python3 * Integrate HTTPUpload * Add Navigation buttons in History Window * Improvements for HiDPI Screens * Depend on the python keyring package for password storage * Flatpak support * Lots of refactoring * New Emoji support * New Chat Window design * New StartChat Window (Ctrl+N) * New ServerInfo Window * AccountWindow Redesign * Moved some encryption code out into Plugins (see PGP Plugin, Esessions Plugin) * OTR Plugin was not ported, use OMEMO * Added mam:1 and mam:2 support (mam:0 was removed) * Added MAM for MUCs support * Added support for showing XEP-0084 Avatars * Add support for geo: URIs * Added xmpp URI handling directly in Gajim * Removed Gajim-Remote * Removed XEP-0012 (Last Activity) * Removed XEP-0136 (Message Archiving) * Added XEP-0156 (Discovering Alternative XMPP Connection Methods) * Added XEP-0319 (Last User Interaction in Presence) * Added XEP-0368 (SRV records for XMPP over TLS) * Added XEP-0380 (Explicit Message Encryption) * Added Jingle FT:5 support * Lots of other small bugfixes KNOWN ISSUES: - Meta Contacts: Filtering the roster could lead to a crash in some circumstances. Use CTRL + N for starting new chats as a workaround - Audio/Video support is currently not maintained and most likely not working - Windows: Translation is not working currently Gajim 0.16.9 (30 November 2017) * Improve Zeroconf behavior * Fix showing normal message event * remove usage of OpenSSL.rand * a few minor bugfixes Gajim 0.16.8 (04 June 2017) * Fix rejoining MUCs after connection loss * Fix Groupchat invites * Fix encoding problems with newer GnuPG versions * Fix old messages randomly reappearing in the chat window * Fix some problems with IBB filetransfer * Make XEP-0146 Commands opt-in * Improve sending messages to your own resources * Improve reliability of delivery recipes * Many minor bugfixes Gajim 0.16.7 (30 January 2017) * Better compatibility with XEP-0191: Blocking Command * Windows Credential Vault is used for password storage on Windows * Gajim now depends on python-gnupg for PGP encryption * Add portable installer for Windows * Remove usage of demandimport * Many minor bugfixes Gajim 0.16.6 (02 October 2016) * Fix using gpg2 * Improve message receipts usage * Improve roster filtering * several minor bugs Gajim 0.16.5 (28 December 2015) * Improve MAM implementation * Improve security on connexion and for roster managment * Ability for emoticons to be sorted in menu Gajim 0.16.4 (26 September 2015) * Fix trusting GPG keys * Ability to disable synchronization of logs with server * Improve MAM usage Gajim 0.16.3 (31 July 2015) * Fix reading secret file * Fix reconnection after suspend * Fix sending GPG-encrypted file to non-trusted key Gajim 0.16.2 (24 July 2015) * improve Zeroconf under windows and with IPv6 * Fix errors with GnuPG * Minor fixes and improvements Gajim 0.16.1 (28 February 2015) * Fix sending Zeroconf messages * Make ipython compatible to version >= 1.0 * Support XEP-0313 MAM * Minor fixes and improvements Gajim 0.16 (04 October 2014) * Improve File transfer support by adding Jingle file transfer * use external python-nbxmpp library * Improve audio / Video calls and add screensharing feature * Support audio under windows * Support systemd-logind * Support XEP-0308 Last message correction * Support XEP-0224 Attention * Support XEP-0191 Blocking command * Better RTL languages support * use host command to resolve SRV records if it is available Gajim 0.15.4 (25 May 2013) * Fix usage of OTR plugin * Fix connection to non-SSL server * Fix receiving GPG-encrypted messages while offline. Gajim 0.15.3 (17 March 2013) * Better handling of SSL errors * Better handling of canceling file transfer * Improve farstream calls * Minor fixes and improvements Gajim 0.15.2 (30 October 2012) * Show punycode encoded urls if they contain non-ascii chars * Fix crash when pressing Esc in chat window * Support Network Manager 0.9 * decrypt GPG messages in the correct order Gajim 0.15.1 (29 August 2012) * Switch from python-farsight to python-farstream * improve performances * Fix roster filter with unicode chars * Fix connection to msn jabber server * Fix some GPG issues * Fix other small issues Gajim 0.15 (18 March 2012) * Plugin system * Whiteboard (via a plugin) * Message archiving * Stream managment * IBB * Nested roster group * Roster filtrering * UPower support * GPG support for windows * Spell checking support for windows Gajim 0.14.4 (22 July 2011) * Fix translation issue * other minor fixes Gajim 0.14.3 (19 June 2011) * Fix history viewer * Fix closing roster window * Prevent some erros with metacontacts Gajim 0.14.2 (07 June 2011) * Fix CPU usage when testing file transfer proxies * Fix invalid XML char regex * Fix subscription request window handling * Fix URL display in chat message banner * Other minor bugfixes Gajim 0.14.1 (26 October 2010) * Fix changing account name * Fix sending XHTML * Fix GnomeKayring usage * Fix some GPG bugs * Minor bugfixes Gajim 0.14 (02 September 2010) * Jingle audio / video chat * Improve Startup time * Copy emoticons, LaTeX expressions when they are selected * Fix status icon transparency by using gtk.statusicon * Groupchat auto-rejoin * geolocation (with geoclue) * use XDG standards * SCRAM-SHA-1 and SASL EXTERNAL authentication * MUC captcha * Lots of refactoring Gajim 0.13.4 (02 April 2010) * Add japanese translation * Fix some TLS connection * Don't raise a lot of "DB Error" dialog * Fix contact synchronisation * Minor fixes Gajim 0.13.3 (23 February 2010) * Fix facebook xmpp server connection * Fix copy / paste with Ctrl+C on non-latin keyboard * Fix sending PEP information when connecting * Fix parsing HTML messages that have ascii markup Gajim 0.13.2 (14 January 2010) * Fix some translations * Fix string comparison according to locales * Fix resizing of groupchat occupant treeview * Fix some gnomekeyring glitches * better SRV usage with libasyncns * copy emoticons when we copy / paste in conversations Gajim 0.13.1 (28 November 2009) * Fix a bug when no account exists and bonjour is not available * Fix a bug when opening advanced option in MUC * Fix a bug when using non-BOSH proxies Gajim 0.13 (24 November 2009) * Improve gtkspell (fix memleak) * BOSH connection * Roster versioning * Ability to send contacts * GUI to send XHTML messages * Improve sessions handling * pubsub storage (for bookmarks) * Ability to select account when joining a groupchat * Better Gnome keyring support * Ability to ignore occupants in groupchats * Ability to show / hide self contact row * Automatically go away when screensaver is enabled under windows * Ability to enable / disable accounts * better URL recognition * groupchat autoreconnect * Store passwords in KDE wallet if available * Better MUC errors handling * Fix sound player launch (don't create zombies anymore) * Optional shell like completion * New color theme Gajim 0.12.5 (08 August 2009) * Don't depend on GTK 2.14 Gajim 0.12.4 (07 August 2009) * Fix History manager * Fix file transfer proxy discovering at connection * Improve filetransfer with IPv6 * Fix zeroconf when receiving badly encoded info Gajim 0.12.3 (12 June 2009) * Fix PLAIN authentication (in particular with Gtalk * fix PEP discovery Gajim 0.12.2 (07 June 2009) * Better keepalive / ping behaviour * Fix custom port handling * Improve error messages handling * Totem support for played music * Fix SSL with some servers * Handle XFCE notification-daemon * Restore old behaviour of click on systray: left click to open events * Network manager 0.7 support * Move logs file under windows to $APPDATA/gajim * Improve Kerberos support * Many bugfixes here and there * Add -c option to history_manager Gajim 0.12.1 (21 December 2008) * Fix filetransfer * Updated german translation * Fix click on notifications when text string is empty * Improve systray popup menu Gajim 0.12 (17 December 2008) * Fix text rendering in notifications * Fix forward unread messages under Windows * Better sessions support * Better auto-away support * Fix banshee support * Quodlibet support * Fix GSSAPI authentification * Fix IPV4 filetransfer on Windows Vista when IPV6 is used too * Fix caps usage * Fix end to end encryption autonegotiation Gajim 0.12-beta1 (11 November 2008) * SECURITY * Implement Kerberos (GSSAPI) SASL Authentication mechanism * Prevent affiliation spoofing in groupchats * Improve GPG and E2E support * GUI * Highlight all valid IANA schemes * Improved E2E, Mood and Activity dialogs * Show number of participants in groupchats * Connection * Correctly parse IDNA names in SRV records * Disable proxy resolution (#4299) * Fix handling of namespace invalid XML * Do not freeze on connection failures (#4366, #4107) * OTHERS * Do not crash on fluxbox restarts * Update several hotkeys and make them work on non-latin keyboards * Prevent a user from sending invalid XML chars * Do not try to save a file with a too long filename when a nick is long * Implement XEP-0203 (Delayed Delivery) * Improved windows installer * Latex support for windows Gajim 0.12-alpha1 (12 August 2008) * Change licence from GPLv2 to GPLv3 * SECURITY * Support for End-To-End encryption (XEP-0116) * SSL certificate verification * Improve GPG support (#2390, #2783) * Ability to disable message previews in notify popups * GROUP CHATS * Support for sending files over group chats * List of bookmarked rooms is now sorted alphabetically * Support for transforming a one-to-one chat into a groupchat * Send invitation by drag-and-dropping a contact from roster * Send messages to conference using gajim-remote * Ability to destroy a room when we are owner, give a reason and alternative room jid * Ability to minimize group chats in roster * USABILITY * Files transfers using drag and drop * Ability to select and interact with status messages in chat windows (using libsexy) * Ability to set a custom avatar for a contact * Better handling of resource collisions * Option to Sign On as a Certain Status (#3314) * Block/Unblock contact directly from roster using privacy lists * GUI * Single window mode * Close change status windows after 15 seconds of inactivity * Simplified "Accounts" dialog * Preferences window redesign * New GUI for chat window * Roster treeview now uses modelfilter (way way much faster) * OTHER * Support of PEP (Personal Eventing Protocol) (XEP-0163) * User Mood (XEP-0107) * User Activity (XEP-0108) * User Tune (XEP-0118) * User Nickname (XEP-0172) * Support for Google Talk accounts with non gmail.com domain (+ GMail notifications) * Modified the format of emoticons list file, so we can choose the default code (#3696) * New Remote Controlling Option (XEP-0146): forward unread messages * Support for User Search (XEP-0055) * Support for jabber:x:data in message elements (Part of XEP-0004) * Added a «supported features» window * Latex support (#2796) * Link-local messaging with Windows (#2883) * Ability to send a custom status to a group, a contact or a transport * Support of Message Receipts (XEP-0184) Gajim 0.11.4 (06 December 2007) * Fix /nick command in groupchats * Better Metacontacts sorting * Fix Ctrl + PageUP/Down behaviour * Fix saving files from filetransfer under windows Gajim 0.11.3 (17 November 2007) * Fix bookmarks support detection * Improve file transfer on windows * Fix some zeroconf bugs * Fix focus bug in chat window * Fix nickname changement behaviour in groupchats Gajim 0.11.2 (22 September 2007) * Improve idle, transports support * Enable ellipsization in roster and chatwindow * Fixed some metacontacts problems (#2156, #2761) * Beter support of XEP-0070 (Verifying HTTP Requests via XMPP) * Make the same height of a banner for all chat tabs * Fix a bug with french translation and invitations (#3043) * Fix a bug with UTF-8 and emoticons * Corrected many bugs with passwords and gnome-keyring * Improve xhtml-im and pictures support * Improve Ad-Hoc support * And many other bufixes Gajim 0.11.1 (18 February 2007) * Fixes in gajim-remote and the way XMPP URI are handled * Fix Idle under Windows * Fix Gajim under non-ascii languages Windows * Fix International Domain Name usage * Fix when removing active privacy list * Fix problem with adhoc command and multi-step forms * Fixed avatars cache problems in group chats * KDE integration for XMPP URI * Support of Banshee Music player * Support of XEP-0202 (Entity Time) * Support of XEP-0199 (XMPP Ping) Gajim 0.11 (19 December 2006) * New build system, using GNU autotools. See README.html * Support for link-local messaging via Zeroconf using Avahi (XEP-0174) * Automatically connect and disconnect to accounts according to network availability (if Network Manager is present) * IPV6 support to connect to server * Ad-Hoc commands * GNOME Keyring Support (if GNOME keyring is available, manage passwords and save them in an encrypted file) * Introducing View Menu (GNOME HIG) * Ability to now hide the Transports group * Support for notify-python. So if notification-daemon is not available, we still can show cool popups * Connection lost is now a non-intrusive popup * Try to get contact desired nick when we add him to roster aka User Nickname (XEP-0172) * Support for Privacy Lists (XEP-0016) * Better design of User Profile window, with a progress bar * New Add User dialog, with possibility to register to transport directly from it * Completion for "Start Chat" input dialog * Metacontacts across accounts (#1596) * Ability to have a different spellchecking language in each chat window. (#2383 and #746) * Forbid to run multiple instances (but you can use differents profiles) * Ability to save avatar with right click on avatar in chat banner * Annotations (XEP-0145) * XHTML Support * Rhythmbox and Muine song change notification * Ability to operate on more than one contact at once in roster (#1514) * Send single message to a whole group * Delete a whole group * Gajim now remembers if GPG encyption was enabled per contact * Priority can be changed automatically when we change status * Fuzzyclock support * Mute sounds from systray menu * Add possibility to start a chat or see contact's infos from subscription request window * Use different colors for each participant in groupchats * Ability to show only Join/Leave in groupchats instead of all status changes * New possibilities to insert nickname of a participant in groupchat conversations: Tab in an empty line now cycles through nicks, maj+right click->inserts nickname, maj+click on name in gc-roster, /names command to show all users presence * Fixed bugs when removing or renaming an account with tabs open (#2369 and #2370) * New translations: Croatian, Esperanto, British English, Belarusian Gajim 0.10.1 (06 June 2006) * Freeze and lost contacts in roster (#1953) * Popup menus are correctly placed * High CPU usage on FreeBSD (#1963) * Nickname can contain '|' (#1913) * Update pl, cs, fr translations * Don't play sound when no event is shown (#1970) * Set gajim icon for history manager * gajim.desktop is generated with translation (#834) * Preventing several TBs and annoyances (r6273, r6275, r6279, r6301, r6308, r6311, r6323, r6326, r6327, r6335, r6342, r6346, r6348) Gajim 0.10 (01 May 2006) * One Messages Window ability (default to it) with tab reordering ability * Non blocking socket connections. Gajim no longer remains unresponsive. * Gajim now uses less memory * File Transfer improvements (now should work out of the box for all) * Meta Contacts ability (relationships between contacts) * Support for legacy composing event (JEP-0022). Now 'Contact is composing a message' will always work * Gajim now defaults to theme that uses GTK colors * Roster Management Improvements (f.e. editablity of transport names, extended Drag and Drop Functionality) * History (chat logs) Manager (search globally, delete, etc) * Animated Emoticons ability * Support for GTalk email notifications for GMail * Room administrators can modify room ban list * Gajim no longer optionally depends on pydns or dnspython. Requires dnsutils (or whatever package provides the nslookup binary) * gajim-remote has extended functionality * Improved Preset Status Messages Experience * Detection for CRUX as user's operating system * New art included, appropriate sizes of icons used where available * Translations under Windows now work okay * Tons of fixes for bugs and annoyances: http://trac.gajim.org/query?status=closed&milestone=0.10 Gajim 0.9.1 (27 December 2005) * Fix bug when joining a Groupchat * Fix bug when starting Gajim without old logs Gajim 0.9 (23 December 2005) * Avatars and status messages in roster window * Improved service discovery window * Emoticons selector, Cooler Popup Windows (notification-daemon). Read more information in case you did not notice something different in http://trac.gajim.org/wiki/GajimDBus#notif_daemon * Caching of Avatars, Less UI freezing * New Account creation wizard * Better History Window with searching capabilities * Gajim now tries to reconnect to a jabber server if connection is lost * Queue for all events (File Transfer, private messages, etc) * A lot of new irc-like commands in group chat. Do for example /help invite * X11 Session Management support * Gajim registers and handles xmpp: and xmpp:// (GNOME/gconfd only) * Use pysqlite for conversation history. Automigration for old logs * New translations: Italian, Swedish, Slovak, Basque Gajim 0.8.2 (06 Sep 2005) * Fix so Gajim runs in pygtk2.8.x * Gajim can use pydns too (apart from dnspython) to do SRV lookup * Other minor fixes Gajim 0.8.1 (02 Sep 2005) * Systray icon for windows * Gajim is available in Dutch * Gajim can use gpg-agent Gajim 0.8 (18 Aug 2005) * Avatars (JEP-0153) * Chat state notifications aka. typing notification (JEP-0085) * Bookmark storage (JEP-0048) * File Transfer (JEP-0096) * Major changes to adhere to GNOME HIG * Complete vcard fields support * New and better user interface for chat and groupchat windows * SRV capabilities and custom hostname/port * Many improvements in group chat and IRC emulation (eg. nick autocompletation and cycling) * Gajim can now send and receive single messages * New iconsets and new dialog for customizing the user interface * Mouseover information for contacts in the roster window (aka tooltips) * DBus Capabilities. Now Gajim can be remote controlled * Authenticating HTTP Requests via XMPP (JEP-0070) * Now you can lookup a word in Wikipedia, dictionary or in search engine * XML Console * Gajim is now also available in norwegian and czech language Gajim 0.7.1 (5 Jun 2005) * Transports icon as an option and error/mesage icon for transports * Gajim is more HIG compatible * Editing registration information on transports * Messages stanza without element are not printed * SASL bugfix * GtkSpell capabilities * Support SSL (legacy) connection * Assign gpg key to specific contact * Contacts are sortable by status * Gajim remembers last lines when reopening chat * New translations available: German, Russian, Spanish, Bulgarian Gajim 0.7 (23 May 2005) * Ability for groupchat reserved rooms with full affiliations and roles support * Popup notification for incoming events * Protocol icons for contacts from transports * Gajim's user interface is now more HIG compliant * Gajim now detects and can send operating system information * Gajim now can inform the user about new version availability * Gajim jabber library migration from jabberpy to xmpppy * Rewrite the plugin system to remove threads and improve latency * Gajim now supports Nodes in Service Discovery * Greek and Polish translations Gajim 0.6.1 (03 April 2005) * Rewrite of service discovery. It doesn't freeze Gajim anymore. * More HIG Compliant. * Gajim is faster (do not redraw preferences_window each time we open it, use of psyco if available) Gajim 0.6 (23 March 2005) * Gajim's user interface is now nicer. * Groupchat just got better. * URL, mailto and ascii formatin (* / _) detection * Better transports detection, group management, and many minor additions/bugfixes Gajim 0.5.1 (27 February 2005) * Minor bugfixes. Gajim 0.5 (26 February 2005) * Possibility to use tabbed chat window * Sound support under GNU/linux * Autoaway available under Microsoft Windows Gajim 0.4.1 (23 January 2005) * Bugfix in config file parser (fix config file parser to handle emoticons) * Bugfix with GPG signatures Gajim 0.4 (21 January 2005) * New option: regroup accounts * Emoticons support with a binder * GUI improvements * Bugfixes Gajim 0.3 (18 December 2004) * GUI improvements * group chat support with MUC (JEP 45) * New agent browser (JEP 30) * GnuPG support * Autoconnect at startup * New socket plugin Gajim 0.2.1 (1 July 2004) * bugfixes : when configfile is incomplete * icon in systray with popup menu (for linux) * "auto away even if not online" option * always show contacts with unread messages * new imageCellRenderer to show animated gifs * allow agents unregistration Gajim 0.2 (8 June 2004) * bugfix for french translation * multi-resource support * auto away support (for linux) * invisible support * priority support Gajim 0.1 (21 May 2004) * Initial release. gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/MANIFEST.in000066400000000000000000000002001326020644600224310ustar00rootroot00000000000000include COPYING recursive-include po *.po recursive-include data *.1 *.in recursive-include test *.py recursive-exclude * *.pyc gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/README.md000066400000000000000000000045761326020644600221760ustar00rootroot00000000000000# Welcome to Gajim ### Runtime Requirements - python3.5 or higher - python3-gi - python3-gi-cairo - gir1.2-gtk-3.0 (>=3.22) - python3-nbxmpp - python3-openssl (>=0.14) - python3-pyasn1 ### Optional Runtime Requirements - python3-pil (pillow) for support of webp avatars - python3-crypto to enable End to end encryption - python3-gnupg to enable GPG encryption - For zeroconf (bonjour) you need dbus-glib, python-avahi - gir1.2-gspell-1 and hunspell-LANG where lang is your locale eg. en, fr etc - gir1.2-secret-1 for GNOME Keyring or KDE support as password storage - D-Bus running to have gajim-remote working. Some distributions split dbus-x11, which is needed for dbus to work with Gajim. Version >= 0.80 is required. - python3-dbus bindings (>=1.2.0) - gir1.2-farstream-0.2, gir1.2-gstreamer-1.0 and gir1.2-gst-plugins-base-1.0 for audio and video calls - gir1.2-gupnpigd-1.0 for better NAT traversing - gir1.2-networkmanager-1.0 for network lose detection - gir1.2-geoclue-2.0 for sharing your location - python3-idna and python3-precis-i18n for correctly parsing JIDs ### Compile-time Requirements - python-setuptools ### Installation Procedure #### Packages - [Arch](https://aur.archlinux.org/packages/gajim-git/) - [Debian](https://packages.debian.org/source/experimental/gajim) (tested with Debian ``testing`` and ``unstable``) #### Snapshots - [Daily Linux](https://www.gajim.org/downloads/snap/?M=D) - [Daily Windows](https://gajim.org/downloads/snap/win) #### Linux ``./setup.py install --root=/`` or ``pip install .`` (python-pip is required) #### Mac see [Wiki](https://dev.gajim.org/gajim/gajim/wikis/help/gajimmacosx#python3brew) #### Developing For developing you dont have to install Gajim. After installing all dependencys execute ``./launch.py`` #### Flatpak see [README](./flatpak/README.md) #### Windows see [README](./win/README.md) ### Miscellaneous #### Debugging Execute gajim with --verbose #### Links - [FAQ](https://dev.gajim.org/gajim/gajim/wikis/help/gajimfaq) - [Wiki](https://dev.gajim.org/gajim/gajim/wikis/home) That is all, **enjoy**! (C) 2003-2018 The Gajim Team [https://gajim.org](https://gajim.org) We use original art and parts of sounds and other art from Psi, Gossip, Gnomebaker, Gaim and some icons from various gnome-icons (mostly Dropline Etiquette) we found at art.gnome.org. If you think we're violating a license please inform us. Thank you. gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/appveyor.yml000066400000000000000000000032661326020644600233020ustar00rootroot00000000000000environment: matrix: - MSYSTEM: MINGW64 MSYS_ARCH: "x86_64" ARCH: "64bit" - MSYSTEM: MINGW32 MSYS_ARCH: "i686" ARCH: "32bit" branches: only: - gajim_1.0 clone_depth: 1 # init: # - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) build_script: - C:\msys64\usr\bin\pacman -Syuu --needed --noconfirm --ask=127 - ps: | $env:TIME_STRING=(get-date -UFormat "%Y-%m-%d").ToString() $env:BUILDROOT="C:\msys64\home\appveyor\gajim\win\_build_root" function bash($command) { Write-Host $command -NoNewline C:\msys64\usr\bin\sh.exe --login -c $command } bash "git clone C:/projects/gajim C:/msys64/home/appveyor/gajim" bash "C:/msys64/home/appveyor/gajim/win/build.sh $($env:MSYS_ARCH)" Push-AppveyorArtifact "$($env:BUILDROOT)/Gajim.exe" -FileName "Gajim-1.0.1-$($env:ARCH)-$($env:TIME_STRING).exe" Push-AppveyorArtifact "$($env:BUILDROOT)/Gajim-Portable.exe" -FileName "Gajim-Portable-1.0.1-$($env:ARCH)-$($env:TIME_STRING).exe" # on_finish: # - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) deploy: # FTP deployment provider settings - provider: FTP protocol: ftp host: panoramix.gajim.org username: secure: SNcOJDhUtBjfddbKXudE2w== password: secure: tQkYbcUb6nChCp0cdqo4CA== folder: win_snap active_mode: false beta: true # enable alternative FTP library for 'ftp' and 'ftps' modes debug: true gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/data/000077500000000000000000000000001326020644600216145ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/data/gajim-history-manager.1000066400000000000000000000043561326020644600261040ustar00rootroot00000000000000.Dd January 21, 2018 .Dt GAJIM-HISTORY-MANAGER 1 URM .Os UNIX .Sh NAME .Nm gajim-history-manager .Nd a tool to manage .Xr gajim 1 logs .Sh SYNOPSIS .Nm .Fl h .Nm .Op Fl c Ar directory .Sh DESCRIPTION .Nm is a tool to manage .Po do some cleanup Pc log file of .Xr gajim 1 . Use this program to delete or export logs. For more information on database logs see . .Sh OPTIONS .Bl -tag -width Ds .It Fl h Fl Fl help Show help options .It Fl c Fl Fl config-path Em directory Where to look for logs file .El .Sh FILES .Bl -tag -width Ds .It $XDG_DATA_HOME/gajim/logs.db The history database log file used when .Op Fl c is not specified. .El .Sh AUTHORS .An -nosplit .Nm is written and maintained by .An Yann Leboulanger , and .An Denis Fomin , with contributions and patches merged from many individuals around the world. See files .Pa AUTHORS and .Pa THANKS , for a complete list. .Sh COPYRIGHT Copyright (C) 2003-2018 Gajim Team .Pp .Nm 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; version 3 only. .Pp .Nm 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. .Pp You should have received a copy of the GNU General Public License along with .Nm . If not, see . .Sh FEEDBACK You can report bugs or feature requests in our bug tracker at .Em https://dev.gajim.org/gajim/gajim/issues or in the .Em gajim-devel mailing list; if you want to send us a patch, please do so in our bug tracker. You can also find us in our chat room. .Sh WWW https://www.gajim.org/ .Sh XMPP You are welcome to join us at gajim@conference.gajim.org .Sh MAILING LIST Below are public mailing lists on lists.gajim.org .Bd -literal -offset indent https://lists.gajim.org/cgi-bin/listinfo/gajim-devel https://lists.gajim.org/cgi-bin/listinfo/translators .Ed .Pp More mailing lists at .Bd -literal -offset indent https://lists.gajim.org/cgi-bin/listinfo .Ed .Sh BUGS Please submit bugs at https://dev.gajim.org/gajim/gajim/issues .Sh SEE ALSO .Xr gajim 1 .Xr gajim-remote 1 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/data/gajim-remote.1000066400000000000000000000103121326020644600242530ustar00rootroot00000000000000.Dd January 21, 2018 .Dt GAJIM-REMOTE 1 URM .Os UNIX .Sh NAME .Nm gajim-remote .Nd a remote control utility for .Xr gajim 1 .Sh SYNOPSIS .Nm .Ar command .Sh DESCRIPTION .Nm is a script to control and communicate with a running instance of .Xr gajim 1 by D-Bus. .Sh OPTIONS .Bl -tag -width Ds .It Available commands .El .Ss account_info Aq account Gets detailed info on a account .Ss change_avatar Ao picture Ac Bq account Change the avatar .Ss change_status Bo status Bc Bo message Bc Bq account Changes the status of account or accounts .Ss check_gajim_running Check if Gajim is running .Ss contact_info Aq jid Gets detailed info on a contact .Ss get_status Bq account Returns current status (the global one unless account is specified) .Ss get_status_message Bq account Returns current status message (the global one unless account is specified) .Ss get_unread_msgs_number Returns number of unread messages .Ss help Bq command Shows a help on specific command .Ss list_accounts Prints a list of registered accounts .Ss list_contacts Bq account Prints a list of all contacts in the roster. Each contact appears on a separate line .Ss prefs_del Aq key Deletes a preference item .Ss prefs_list Lists all preferences and their values .Ss prefs_put Aq key=value Sets value of 'key' to 'value'. .Ss prefs_store Writes the current state of Gajim preferences to the .config file .Ss remove_contact Ao jid Ac Bq account Removes contact from roster .Ss send_chat_message Ao jid Ac Ao message Ac Bo PGP key Bc Bq account Sends new chat message to a contact in the roster. Both OpenPGP key and account are optional. If you want to set only 'account', without 'OpenPGP key', just set 'OpenPGP key' to ''. .Ss send_file Ao file Ac Ao jid Ac Bq account Sends file to a contact .Ss send_groupchat_message Ao room_jid Ac Ao message Ac Bq account Sends new message to a groupchat you've joined. .Ss send_single_message Ao jid subject Ac Ao message Ac Bo PGP key Bc Bq account Sends new single message to a contact in the roster. Both OpenPGP key and account are optional. If you want to set only 'account', without 'OpenPGP key', just set 'OpenPGP key' to ''. .Ss send_xml Ao xml Ac Bq account Sends custom XML .Ss set_priority Ao priority Ac Bq account Changes the priority of account or accounts .Ss show_next_pending_event Pops up a window with the next pending event .Ss toggle_ipython Shows or hides the ipython window .Ss toggle_roster_appearance Shows or hides the roster window .Sh EXAMPLES Open a URI of group chat gajim .Pp .Dl $ gajim-remote handle_uri xmpp:gajim@conferenc.gajim.org?join .Pp Send custom XML .Pp .Dl $ gajim-remote send_xml $(cat Pa filename.xml ) Qq your@jabber.id .Sh AUTHORS .An -nosplit .Nm is written and maintained by .An Yann Leboulanger , and .An Denis Fomin , with contributions and patches merged from many individuals around the world. See files .Pa AUTHORS and .Pa THANKS , for a complete list. .Sh COPYRIGHT Copyright (C) 2003-2018 Gajim Team .Pp .Nm 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; version 3 only. .Pp .Nm 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. .Pp You should have received a copy of the GNU General Public License along with .Nm . If not, see . .Sh FEEDBACK You can report bugs or feature requests in our bug tracker at .Em https://dev.gajim.org/gajim/gajim/issues or in the .Em gajim-devel mailing list; if you want to send us a patch, please do so in our bug tracker. You can also find us in our chat room. .Sh WWW https://www.gajim.org/ .Sh XMPP You are welcome to join us at gajim@conference.gajim.org .Sh MAILING LIST Below are public mailing lists on lists.gajim.org .Bd -literal -offset indent https://lists.gajim.org/cgi-bin/listinfo/gajim-devel https://lists.gajim.org/cgi-bin/listinfo/translators .Ed .Pp More mailing lists at .Bd -literal -offset indent https://lists.gajim.org/cgi-bin/listinfo .Ed .Sh BUGS Please submit bugs at https://dev.gajim.org/gajim/gajim/issues .Sh SEE ALSO .Xr gajim 1 .Xr gajim-history-manager 1 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/data/gajim.1000066400000000000000000000074571326020644600230020ustar00rootroot00000000000000.Dd January 21, 2018 .Dt GAJIM 1 URM .Os UNIX .Sh NAME .Nm gajim .Nd a Jabber/XMPP client .Sh SYNOPSIS .Nm .Fl h .Nm .Op Fl q .Op Fl v .Op Fl w .Op Fl l Ar subsystem=level .Op Fl p Ar name .Op Fl s .Op Fl c Ar directory .Sh DESCRIPTION .Nm is a Jabber/XMPP client written in Python and GTK+. .Nm works nicely with GNOME, yet it does not require it to run. .Nm is designed for novice and advanced users as one, as well for XMPP server admins. .Pp XMPP is the Extensible Messaging and Presence Protocol, a set of open technologies for instant messaging, presence, multi-party chat, voice and video calls, collaboration, lightweight middleware, content syndication, and generalized routing of XML data. For more information on the XMPP protocol see . .Sh OPTIONS .Bl -tag -width Ds .It Fl h Fl Fl help Show help options .It Fl q Fl Fl quiet Show only critical errors .It Fl s Fl Fl separate Separate profiles completely (even history db and plugins) .It Fl v Fl Fl verbose Print xml stanzas and other debug information .It Fl w Fl Fl warnings Show all GTK warnings with traceback .It Fl l Fl Fl loglevel Em subsystem=level Bq , Em subsystem=level Bq Em ... Configure logging system. Subsystem can be .Em gajim.interface , .Em gajim.c.connection , .Em .nbxmpp.client_nb , etc. Level can be .Em DEBUG , .Em INFO , .Em WARNING , .Em ERROR or .Em CRITICAL . .It Fl p Fl Fl profile Em name Run .Nm using .Pa config.name in configuration directory .It Fl c Fl Fl config-path Em directory Where to look for configuration files .El .Sh FILES .Bl -tag -width Ds .It $XDG_CACHE_HOME/gajim/cache.db Cache database file of transports, caps, roster entry, and roster group. .It $XDG_CACHE_HOME/gajim/avatars/ Cache directory of avatars. .It $XDG_CACHE_HOME/gajim/vcards/ Cache directory of vCards (virtual cards). .It $XDG_CONFIG_HOME/gajim/ The config-path used when .Op Fl c is not specified. .It $XDG_DATA_HOME/gajim/certs/ Directory where certificates are stored. .It $XDG_DATA_HOME/gajim/logs.db The history database log file. For more information on database logs see . .El .Sh AUTHORS .An -nosplit .Nm is written and maintained by .An Yann Leboulanger and .An Philipp Hörist , with contributions and patches merged from many individuals around the world. See the About Dialog for a complete list. .Sh COPYRIGHT Copyright (C) 2003-2018 Gajim Team .Pp .Nm 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; version 3 only. .Pp .Nm 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. .Pp You should have received a copy of the GNU General Public License along with .Nm . If not, see . .Sh FEEDBACK You can report bugs or feature requests in our bug tracker at .Em https://dev.gajim.org/gajim/gajim/issues or in the .Em gajim-devel mailing list; if you want to send us a patch, please do so in our bug tracker. You can also find us in our chat room. .Sh WWW https://www.gajim.org/ .Sh XMPP You are welcome to join us at gajim@conference.gajim.org .Sh MAILING LIST Below are public mailing lists on lists.gajim.org .Bd -literal -offset indent https://lists.gajim.org/cgi-bin/listinfo/gajim-devel https://lists.gajim.org/cgi-bin/listinfo/translators .Ed .Pp More mailing lists at .Bd -literal -offset indent https://lists.gajim.org/cgi-bin/listinfo .Ed .Sh BUGS Please submit bugs at .Bd -literal -offset indent https://dev.gajim.org/gajim/gajim/issues https://dev.gajim.org/gajim/gajim-plugins https://dev.gajim.org/gajim/python-nbxmpp .Ed .Sh SEE ALSO .Xr gajim-remote 1 .Xr gajim-history-manager 1 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/data/org.gajim.Gajim.appdata.xml.in000066400000000000000000000060661326020644600272670ustar00rootroot00000000000000 org.gajim.Gajim.desktop gajim.desktop CC-BY-SA-3.0 GPL-3.0 Gajim A GTK+ Jabber client

Gajim is a chat client to be used with Jabber.org, Live Journal Talk, Nimbuzz, Ovi, Talkonaut, and thousands of other services run by companies and ISPs, and volunteers around the world.

If you have a few accounts on different servers, if you want to be in contact with your friends and family all the time, then Gajim is for you.

Features:

  • Tabbed chat window and single window modes
  • Group chat support (with Multi-User Chat protocol), invitation, chat to group chat transformation
  • Emoticons, avatars, PEP (user activity, mood and tune)
  • Audio / video conferences
  • File transfer, room bookmarks
  • Metacontacts support
  • Trayicon, speller, extended chat history functionalities
  • TLS, GPG and End-To-End encryption support
  • Transport registration support
  • Service discovery including nodes, user search
  • Wikipedia, dictionary and search engine lookup
  • Multiple accounts support
  • XML console interface
  • Link local (bonjour / zeroconf), BOSH
  • Other features via plugins
GNOME GTK InstantMessaging Network https://gajim.org/imgs/gajim_roster.png Roster, list of contacts https://gajim.org/imgs/gajim_tabbed_chat.png Tabbed chat window https://gajim.org/imgs/groupchat_window.png Group chat support https://gajim.org/imgs/history_window.png Chat history https://gajim.org/imgs/gajim_plugins.png Plugin manager Gajim Team gajim-devel_AT_gajim.org https://gajim.org/ https://dev.gajim.org/gajim/gajim https://dev.gajim.org/gajim/gajim/wikis/help/gajimfaq https://dev.gajim.org/gajim/gajim/wikis/help/home https://gajim.org/dev.php#donate https://dev.gajim.org/gajim/gajim/wikis/development/DevTranslate gajim
gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/data/org.gajim.Gajim.desktop.in000066400000000000000000000010551326020644600265200ustar00rootroot00000000000000[Desktop Entry] Categories=Network;InstantMessaging;GTK;GNOME; Name=Gajim GenericName=Jabber IM Client Comment=A GTK+ Jabber client # Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! Keywords=chat;messaging;im;xmpp;bonjour;voip; Version=1.0 Exec=gajim %u # Translators: Do NOT translate or transliterate this text (this is an icon file name)! Icon=org.gajim.Gajim StartupNotify=true StartupWMClass=Gajim Terminal=false Type=Application MimeType=x-scheme-handler/xmpp; gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/doc/000077500000000000000000000000001326020644600214505ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/doc/epydoc.conf000066400000000000000000000011441326020644600236020ustar00rootroot00000000000000[epydoc] # Information about the project. name: Gajim url: http://gajim.org verbosity: 3 imports: yes redundant-details: yes docformat: restructuredtext # top: gajim # The list of modules to document. Modules can be named using # dotted names, module filenames, or package directory names. # This option may be repeated. modules: gajim/* test/* # Write html output to the directory "apidocs" #output: pdf output: html target: doc/apidocs/ # Include all automatically generated graphs. These graphs are # generated using Graphviz dot. graph: all dotpath: /usr/bin/dot graph-font: Sans graph-font-size: 10 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/flatpak/000077500000000000000000000000001326020644600223255ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/flatpak/CVE-2013-7459.patch000066400000000000000000000073401326020644600247600ustar00rootroot00000000000000From 8dbe0dc3eea5c689d4f76b37b93fe216cf1f00d4 Mon Sep 17 00:00:00 2001 From: Legrandin Date: Sun, 22 Dec 2013 22:24:46 +0100 Subject: [PATCH] Throw exception when IV is used with ECB or CTR The IV parameter is currently ignored when initializing a cipher in ECB or CTR mode. For CTR mode, it is confusing: it takes some time to see that a different parameter is needed (the counter). For ECB mode, it is outright dangerous. This patch forces an exception to be raised. --- lib/Crypto/SelfTest/Cipher/common.py | 31 +++++++++++++++++++++++-------- src/block_template.c | 11 +++++++++++ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/lib/Crypto/SelfTest/Cipher/common.py b/lib/Crypto/SelfTest/Cipher/common.py index 420b6ff..a5f8a88 100644 --- a/lib/Crypto/SelfTest/Cipher/common.py +++ b/lib/Crypto/SelfTest/Cipher/common.py @@ -239,19 +239,34 @@ def shortDescription(self): return """%s .decrypt() output of .encrypt() should not be garbled""" % (self.module_name,) def runTest(self): - for mode in (self.module.MODE_ECB, self.module.MODE_CBC, self.module.MODE_CFB, self.module.MODE_OFB, self.module.MODE_OPENPGP): + + ## ECB mode + mode = self.module.MODE_ECB + encryption_cipher = self.module.new(a2b_hex(self.key), mode) + ciphertext = encryption_cipher.encrypt(self.plaintext) + decryption_cipher = self.module.new(a2b_hex(self.key), mode) + decrypted_plaintext = decryption_cipher.decrypt(ciphertext) + self.assertEqual(self.plaintext, decrypted_plaintext) + + ## OPENPGP mode + mode = self.module.MODE_OPENPGP + encryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv) + eiv_ciphertext = encryption_cipher.encrypt(self.plaintext) + eiv = eiv_ciphertext[:self.module.block_size+2] + ciphertext = eiv_ciphertext[self.module.block_size+2:] + decryption_cipher = self.module.new(a2b_hex(self.key), mode, eiv) + decrypted_plaintext = decryption_cipher.decrypt(ciphertext) + self.assertEqual(self.plaintext, decrypted_plaintext) + + ## All other non-AEAD modes (but CTR) + for mode in (self.module.MODE_CBC, self.module.MODE_CFB, self.module.MODE_OFB): encryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv) ciphertext = encryption_cipher.encrypt(self.plaintext) - - if mode != self.module.MODE_OPENPGP: - decryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv) - else: - eiv = ciphertext[:self.module.block_size+2] - ciphertext = ciphertext[self.module.block_size+2:] - decryption_cipher = self.module.new(a2b_hex(self.key), mode, eiv) + decryption_cipher = self.module.new(a2b_hex(self.key), mode, self.iv) decrypted_plaintext = decryption_cipher.decrypt(ciphertext) self.assertEqual(self.plaintext, decrypted_plaintext) + class PGPTest(unittest.TestCase): def __init__(self, module, params): unittest.TestCase.__init__(self) diff --git a/src/block_template.c b/src/block_template.c index f940e0e..d555ceb 100644 --- a/src/block_template.c +++ b/src/block_template.c @@ -170,6 +170,17 @@ ALGnew(PyObject *self, PyObject *args, PyObject *kwdict) "Key cannot be the null string"); return NULL; } + if (IVlen != 0 && mode == MODE_ECB) + { + PyErr_Format(PyExc_ValueError, "ECB mode does not use IV"); + return NULL; + } + if (IVlen != 0 && mode == MODE_CTR) + { + PyErr_Format(PyExc_ValueError, + "CTR mode needs counter parameter, not IV"); + return NULL; + } if (IVlen != BLOCK_SIZE && mode != MODE_ECB && mode != MODE_CTR) { PyErr_Format(PyExc_ValueError, gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/flatpak/README.md000066400000000000000000000014511326020644600236050ustar00rootroot00000000000000Run the following steps from a directory containing the gajim source dir. Install gajim flatpak repo -------------------------- 1. `flatpak --user remote-add --from gnome https://sdk.gnome.org/gnome.flatpakrepo` 1. `flatpak --user install gnome org.gnome.Platform//3.26` 1. `flatpak --user install gnome org.gnome.Sdk//3.26` 1. `flatpak-builder --repo=repo directory gajim/org.gajim.Gajim.json` 1. `flatpak --user remote-add --no-gpg-verify repo repo` 1. `flatpak --user install repo org.gajim.Gajim` 1. `flatpak run org.gajim.Gajim` Update gajim flatpak repo ------------------------- 1. update your gajim source repository 1. `rm -r directory` 1. `flatpak-builder --repo=repo directory gajim/org.gajim.Gajim.json` 1. `flatpak --user update` Note: remove `--user` if you want a system-wide installation gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/000077500000000000000000000000001326020644600217725ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/__init__.py000066400000000000000000000005021326020644600241000ustar00rootroot00000000000000import subprocess __version__ = "1.0.1" try: p = subprocess.Popen('git rev-parse --short=12 HEAD', shell=True, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL) node = p.communicate()[0] if node: __version__ += '+' + node.decode('utf-8').strip() except Exception: pass gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/accounts_window.py000066400000000000000000000631651326020644600255650ustar00rootroot00000000000000from functools import partial from gi.repository import Gtk, Gio, GLib, Gdk from gajim.common import app from gajim.gtkgui_helpers import get_image_button from gajim import gtkgui_helpers from gajim import gui_menu_builder from gajim.common import passwords from gajim import dialogs from gajim import config from gajim.common import helpers from gajim.common.connection import Connection from gajim.common.zeroconf.connection_zeroconf import ConnectionZeroconf from gajim.options_dialog import OptionsDialog, OptionsBox from gajim.common.const import Option, OptionKind, OptionType class AccountsWindow(Gtk.ApplicationWindow): def __init__(self): Gtk.ApplicationWindow.__init__(self) self.set_application(app.app) self.set_position(Gtk.WindowPosition.CENTER) self.set_show_menubar(False) self.set_name('AccountsWindow') self.set_size_request(500, -1) self.set_resizable(False) self.need_relogin = {} glade_objects = [ 'stack', 'box', 'actionbar', 'headerbar', 'back_button', 'menu_button', 'account_page', 'account_list'] self.builder = gtkgui_helpers.get_gtk_builder('accounts_window.ui') for obj in glade_objects: setattr(self, obj, self.builder.get_object(obj)) self.set_titlebar(self.headerbar) menu = Gio.Menu() menu.append(_('Merge Accounts'), 'app.merge') menu.append(_('Use PGP Agent'), 'app.agent') self.menu_button.set_menu_model(menu) button = get_image_button('list-add-symbolic', _('Add')) button.set_action_name('app.add-account') self.actionbar.pack_start(button) accounts = app.config.get_per('accounts') accounts.sort() for account in accounts: self.need_relogin[account] = self.get_relogin_options(account) account_item = Account(account, self) self.account_list.add(account_item) account_item.set_activatable() self.add(self.box) self.builder.connect_signals(self) self.connect('destroy', self.on_destroy) self.connect('key-press-event', self.on_key_press) self.show_all() def on_key_press(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.destroy() def on_destroy(self, *args): self.check_relogin() del app.interface.instances['accounts'] def on_child_visible(self, stack, *args): page = stack.get_visible_child_name() if page is None: return if page == 'main': self.menu_button.show() self.back_button.hide() self.check_relogin() else: self.back_button.show() self.menu_button.hide() def on_back_button(self, *args): page = self.stack.get_visible_child_name() child = self.stack.get_visible_child() self.remove_all_pages() if page == 'account': child.toggle.set_active(False) self.stack.add_named(self.account_page, 'main') self.stack.set_visible_child_name('main') self.update_accounts() else: self.stack.add_named(child.parent, 'account') self.stack.set_visible_child_name('account') def update_accounts(self): for row in self.account_list.get_children(): row.get_child().update() @staticmethod def on_row_activated(listbox, row): row.get_child().on_row_activated() def remove_all_pages(self): for page in self.stack.get_children(): self.stack.remove(page) def set_page(self, page, name): self.remove_all_pages() self.stack.add_named(page, name) page.update() page.show_all() self.stack.set_visible_child(page) def update_proxy_list(self): page = self.stack.get_child_by_name('connetion') if page is None: return page.options['proxy'].update_values() def check_relogin(self): for account in self.need_relogin: options = self.get_relogin_options(account) active = app.config.get_per('accounts', account, 'active') if options != self.need_relogin[account]: self.need_relogin[account] = options if active: self.relog(account) break def relog(self, account): if app.connections[account].connected == 0: return if account == app.ZEROCONF_ACC_NAME: app.connections[app.ZEROCONF_ACC_NAME].update_details() return def login(account, show_before, status_before): """ Login with previous status """ # first make sure connection is really closed, # 0.5 may not be enough app.connections[account].disconnect(True) app.interface.roster.send_status( account, show_before, status_before) def relog(account): show_before = app.SHOW_LIST[app.connections[account].connected] status_before = app.connections[account].status app.interface.roster.send_status( account, 'offline', _('Be right back.')) GLib.timeout_add(500, login, account, show_before, status_before) dialogs.YesNoDialog( _('Relogin now?'), _('If you want all the changes to apply instantly, ' 'you must relogin.'), transient_for=self, on_response_yes=lambda *args: relog(account)) @staticmethod def get_relogin_options(account): if account == app.ZEROCONF_ACC_NAME: options = ['zeroconf_first_name', 'zeroconf_last_name', 'zeroconf_jabber_id', 'zeroconf_email', 'keyid'] else: options = ['client_cert', 'proxy', 'resource', 'use_custom_host', 'custom_host', 'custom_port', 'keyid'] values = [] for option in options: values.append(app.config.get_per('accounts', account, option)) return values def on_remove_account(self, button, account): if app.events.get_events(account): app.interface.raise_dialog('unread-events-on-remove-account') return if app.config.get_per('accounts', account, 'is_zeroconf'): # Should never happen as button is insensitive return win_opened = False if app.interface.msg_win_mgr.get_controls(acct=account): win_opened = True elif account in app.interface.instances: for key in app.interface.instances[account]: if (app.interface.instances[account][key] and key != 'remove_account'): win_opened = True break # Detect if we have opened windows for this account def remove(account): if (account in app.interface.instances and 'remove_account' in app.interface.instances[account]): dialog = app.interface.instances[account]['remove_account'] dialog.window.present() else: if account not in app.interface.instances: app.interface.instances[account] = {} app.interface.instances[account]['remove_account'] = \ config.RemoveAccountWindow(account) if win_opened: dialogs.ConfirmationDialog( _('You have opened chat in account %s') % account, _('All chat and groupchat windows will be closed. ' 'Do you want to continue?'), on_response_ok=(remove, account), transient_for=self) else: remove(account) def remove_account(self, account): for row in self.account_list.get_children(): if row.get_child().account == account: self.account_list.remove(row) del self.need_relogin[account] break def add_account(self, account): account_item = Account(account, self) self.account_list.add(account_item) account_item.set_activatable() self.account_list.show_all() self.stack.show_all() self.need_relogin[account] = self.get_relogin_options(account) def select_account(self, account): for row in self.account_list.get_children(): if row.get_child().account == account: self.account_list.emit('row-activated', row) break @staticmethod def enable_account(account): if account == app.ZEROCONF_ACC_NAME: app.connections[account] = ConnectionZeroconf(account) else: app.connections[account] = Connection(account) # update variables app.interface.instances[account] = { 'infos': {}, 'disco': {}, 'gc_config': {}, 'search': {}, 'online_dialog': {}, 'sub_request': {}} app.interface.minimized_controls[account] = {} app.connections[account].connected = 0 app.groups[account] = {} app.contacts.add_account(account) app.gc_connected[account] = {} app.automatic_rooms[account] = {} app.newly_added[account] = [] app.to_be_removed[account] = [] if account == app.ZEROCONF_ACC_NAME: app.nicks[account] = app.ZEROCONF_ACC_NAME else: app.nicks[account] = app.config.get_per( 'accounts', account, 'name') app.block_signed_in_notifications[account] = True app.sleeper_state[account] = 'off' app.encrypted_chats[account] = [] app.last_message_time[account] = {} app.status_before_autoaway[account] = '' app.transport_avatar[account] = {} app.gajim_optional_features[account] = [] app.caps_hash[account] = '' helpers.update_optional_features(account) # refresh roster if len(app.connections) >= 2: # Do not merge accounts if only one exists app.interface.roster.regroup = app.config.get('mergeaccounts') else: app.interface.roster.regroup = False app.interface.roster.setup_and_draw_roster() gui_menu_builder.build_accounts_menu() @staticmethod def disable_account(account): app.interface.roster.close_all(account) if account == app.ZEROCONF_ACC_NAME: app.connections[account].disable_account() app.connections[account].cleanup() del app.connections[account] del app.interface.instances[account] del app.interface.minimized_controls[account] del app.nicks[account] del app.block_signed_in_notifications[account] del app.groups[account] app.contacts.remove_account(account) del app.gc_connected[account] del app.automatic_rooms[account] del app.to_be_removed[account] del app.newly_added[account] del app.sleeper_state[account] del app.encrypted_chats[account] del app.last_message_time[account] del app.status_before_autoaway[account] del app.transport_avatar[account] del app.gajim_optional_features[account] del app.caps_hash[account] if len(app.connections) >= 2: # Do not merge accounts if only one exists app.interface.roster.regroup = app.config.get('mergeaccounts') else: app.interface.roster.regroup = False app.interface.roster.setup_and_draw_roster() gui_menu_builder.build_accounts_menu() class Account(Gtk.Box): def __init__(self, account, parent): Gtk.Box.__init__(self, orientation=Gtk.Orientation.HORIZONTAL, spacing=12) self.account = account if account == app.ZEROCONF_ACC_NAME: self.options = ZeroConfPage(account) else: self.options = AccountPage(account) self.parent = parent switch = Gtk.Switch() switch.set_active(app.config.get_per('accounts', account, 'active')) switch.set_vexpand(False) switch.set_valign(Gtk.Align.CENTER) switch.set_halign(Gtk.Align.START) if account == app.ZEROCONF_ACC_NAME and not app.HAVE_ZEROCONF: switch.set_sensitive(False) switch.set_active(False) switch.connect('notify::active', self.on_switch, self.account) account_label = app.config.get_per('accounts', account, 'account_label') self.label = Gtk.Label(label=account_label or account) self.label.set_halign(Gtk.Align.START) self.label.set_hexpand(True) self.add(switch) self.add(self.label) if account != app.ZEROCONF_ACC_NAME: button = get_image_button('list-remove-symbolic', _('Remove')) button.connect('clicked', parent.on_remove_account, account) self.add(button) def set_activatable(self): if self.account == app.ZEROCONF_ACC_NAME: self.get_parent().set_activatable(app.HAVE_ZEROCONF) def on_switch(self, switch, param, account): old_state = app.config.get_per('accounts', account, 'active') state = switch.get_active() if old_state == state: return if (account in app.connections and app.connections[account].connected > 0): # connecting or connected app.interface.raise_dialog('connected-on-disable-account') switch.set_active(not state) return if state: self.parent.enable_account(account) else: self.parent.disable_account(account) app.config.set_per('accounts', account, 'active', state) def on_row_activated(self): self.options.update_states() self.parent.set_page(self.options, 'account') def update(self): account_label = app.config.get_per( 'accounts', self.account, 'account_label') self.label.set_text(account_label or self.account) class GenericOptionPage(Gtk.Box): def __init__(self, account, parent, options): Gtk.Box.__init__(self, orientation=Gtk.Orientation.VERTICAL, spacing=12) self.account = account self.parent = parent self.toggle = get_image_button('document-edit-symbolic', _('Rename account label'), toggle=True) self.toggle.connect('toggled', self.set_entry_text) self.entry = Gtk.Entry() self.entry.set_sensitive(False) self.entry.set_name('AccountNameEntry') self.set_entry_text(self.toggle, update=True) box = Gtk.Box() if isinstance(self, AccountPage): box.pack_start(self.toggle, False, True, 0) box.pack_start(self.entry, True, True, 0) self.listbox = OptionsBox(account) self.listbox.set_selection_mode(Gtk.SelectionMode.NONE) for option in options: self.listbox.add_option(option) self.listbox.update_states() self.pack_start(box, False, False, 0) self.pack_start(self.listbox, True, True, 0) self.listbox.connect('row-activated', self.on_row_activated) def update_states(self): self.listbox.update_states() def on_row_activated(self, listbox, row): self.toggle.set_active(False) row.get_child().on_row_activated() def set_entry_text(self, toggle, update=False): account_label = app.config.get_per( 'accounts', self.account, 'account_label') if update: self.entry.set_text(account_label or self.account) return if toggle.get_active(): self.entry.set_sensitive(True) self.entry.grab_focus() else: self.entry.set_sensitive(False) value = self.entry.get_text() if not value: value = account_label or self.account app.config.set_per('accounts', self.account, 'account_label', value or self.account) if app.config.get_per('accounts', self.account, 'active'): app.interface.roster.draw_account(self.account) gui_menu_builder.build_accounts_menu() def update(self): self.set_entry_text(self.toggle, update=True) def set_page(self, options, name): options.update_states() self.get_toplevel().set_page(options, name) class AccountPage(GenericOptionPage): def __init__(self, account, parent=None): general = partial( self.set_page, GeneralPage(account, self), 'general') connection = partial( self.set_page, ConnectionPage(account, self), 'connection') options = [ Option(OptionKind.LOGIN, _('Login'), OptionType.DIALOG, props={'dialog': LoginDialog}), Option(OptionKind.ACTION, _('Profile'), OptionType.ACTION, '-profile', props={'action_args': account}), Option(OptionKind.CALLBACK, _('General'), name='general', props={'callback': general}), Option(OptionKind.CALLBACK, _('Connection'), name='connection', props={'callback': connection}), Option(OptionKind.ACTION, _('Import Contacts'), OptionType.ACTION, '-import-contacts', props={'action_args': account}), Option(OptionKind.DIALOG, _('Client Certificate'), OptionType.DIALOG, props={'dialog': CertificateDialog}), Option(OptionKind.GPG, _('OpenPGP Key'), OptionType.DIALOG, props={'dialog': None}), ] GenericOptionPage.__init__(self, account, parent, options) class GeneralPage(GenericOptionPage): def __init__(self, account, parent=None): options = [ Option(OptionKind.SWITCH, _('Connect on startup'), OptionType.ACCOUNT_CONFIG, 'autoconnect'), Option(OptionKind.SWITCH, _('Reconnect when connection is lost'), OptionType.ACCOUNT_CONFIG, 'autoreconnect'), Option(OptionKind.SWITCH, _('Save conversations for all contacts'), OptionType.ACCOUNT_CONFIG, 'no_log_for', desc=_('Store conversations on the harddrive')), Option(OptionKind.SWITCH, _('Server Message Archive'), OptionType.ACCOUNT_CONFIG, 'sync_logs_with_server', desc=_('Messages get stored on the server.\n' 'The archive is used to sync messages\n' 'between multiple devices.\n' 'XEP-0313')), Option(OptionKind.SWITCH, _('Global Status'), OptionType.ACCOUNT_CONFIG, 'sync_with_global_status', desc=_('Synchronise the status of all accounts')), Option(OptionKind.SWITCH, _('Message Carbons'), OptionType.ACCOUNT_CONFIG, 'enable_message_carbons', desc=_('All your other online devices get copies\n' 'of sent and received messages.\n' 'XEP-0280')), Option(OptionKind.SWITCH, _('Use file transfer proxies'), OptionType.ACCOUNT_CONFIG, 'use_ft_proxies'), ] GenericOptionPage.__init__(self, account, parent, options) class ConnectionPage(GenericOptionPage): def __init__(self, account, parent=None): options = [ Option(OptionKind.SWITCH, 'HTTP_PROXY', OptionType.ACCOUNT_CONFIG, 'use_env_http_proxy', desc=_('Use environment variable')), Option(OptionKind.PROXY, _('Proxy'), OptionType.ACCOUNT_CONFIG, 'proxy', name='proxy'), Option(OptionKind.SWITCH, _('Warn on insecure connection'), OptionType.ACCOUNT_CONFIG, 'warn_when_insecure_ssl_connection'), Option(OptionKind.SWITCH, _('Send keep-alive packets'), OptionType.ACCOUNT_CONFIG, 'keep_alives_enabled'), Option(OptionKind.HOSTNAME, _('Hostname'), OptionType.DIALOG, desc=_('Manually set the hostname for the server'), props={'dialog': CutstomHostnameDialog}), Option(OptionKind.ENTRY, _('Resource'), OptionType.ACCOUNT_CONFIG, 'resource'), Option(OptionKind.PRIORITY, _('Priority'), OptionType.DIALOG, props={'dialog': PriorityDialog}), ] GenericOptionPage.__init__(self, account, parent, options) class ZeroConfPage(GenericOptionPage): def __init__(self, account, parent=None): options = [ Option(OptionKind.DIALOG, _('Profile'), OptionType.DIALOG, props={'dialog': ZeroconfProfileDialog}), Option(OptionKind.SWITCH, _('Connect on startup'), OptionType.ACCOUNT_CONFIG, 'autoconnect', desc=_('Use environment variable')), Option(OptionKind.SWITCH, _('Save conversations for all contacts'), OptionType.ACCOUNT_CONFIG, 'no_log_for', desc=_('Store conversations on the harddrive')), Option(OptionKind.SWITCH, _('Global Status'), OptionType.ACCOUNT_CONFIG, 'sync_with_global_status', desc=_('Synchronize the status of all accounts')), Option(OptionKind.GPG, _('OpenPGP Key'), OptionType.DIALOG, props={'dialog': None}), ] GenericOptionPage.__init__(self, account, parent, options) class ZeroconfProfileDialog(OptionsDialog): def __init__(self, account, parent): options = [ Option(OptionKind.ENTRY, _('First Name'), OptionType.ACCOUNT_CONFIG, 'zeroconf_first_name'), Option(OptionKind.ENTRY, _('Last Name'), OptionType.ACCOUNT_CONFIG, 'zeroconf_last_name'), Option(OptionKind.ENTRY, _('Jabber ID'), OptionType.ACCOUNT_CONFIG, 'zeroconf_jabber_id'), Option(OptionKind.ENTRY, _('Email'), OptionType.ACCOUNT_CONFIG, 'zeroconf_email'), ] OptionsDialog.__init__(self, parent, _('Profile'), Gtk.DialogFlags.MODAL, options, account) class PriorityDialog(OptionsDialog): def __init__(self, account, parent): neg_priority = app.config.get('enable_negative_priority') if neg_priority: range_ = (-128, 127) else: range_ = (0, 127) options = [ Option(OptionKind.SWITCH, _('Adjust to status'), OptionType.ACCOUNT_CONFIG, 'adjust_priority_with_status', 'adjust'), Option(OptionKind.SPIN, _('Priority'), OptionType.ACCOUNT_CONFIG, 'priority', enabledif=('adjust', False), props={'range_': range_}), ] OptionsDialog.__init__(self, parent, _('Priority'), Gtk.DialogFlags.MODAL, options, account) self.connect('destroy', self.on_destroy) def on_destroy(self, *args): # Update priority if self.account not in app.connections: return show = app.SHOW_LIST[app.connections[self.account].connected] status = app.connections[self.account].status app.connections[self.account].change_status(show, status) class CutstomHostnameDialog(OptionsDialog): def __init__(self, account, parent): options = [ Option(OptionKind.SWITCH, _('Enable'), OptionType.ACCOUNT_CONFIG, 'use_custom_host', name='custom'), Option(OptionKind.ENTRY, _('Hostname'), OptionType.ACCOUNT_CONFIG, 'custom_host', enabledif=('custom', True)), Option(OptionKind.ENTRY, _('Port'), OptionType.ACCOUNT_CONFIG, 'custom_port', enabledif=('custom', True)), ] OptionsDialog.__init__(self, parent, _('Connection Options'), Gtk.DialogFlags.MODAL, options, account) class CertificateDialog(OptionsDialog): def __init__(self, account, parent): options = [ Option(OptionKind.FILECHOOSER, _('Client Certificate'), OptionType.ACCOUNT_CONFIG, 'client_cert', props={'filefilter': (_('PKCS12 Files'), '*.p12')}), Option(OptionKind.SWITCH, _('Encrypted Certificate'), OptionType.ACCOUNT_CONFIG, 'client_cert_encrypted'), ] OptionsDialog.__init__(self, parent, _('Certificate Options'), Gtk.DialogFlags.MODAL, options, account) class LoginDialog(OptionsDialog): def __init__(self, account, parent): options = [ Option(OptionKind.ENTRY, _('Password'), OptionType.ACCOUNT_CONFIG, 'password', name='password', enabledif=('savepass', True)), Option(OptionKind.SWITCH, _('Save Password'), OptionType.ACCOUNT_CONFIG, 'savepass', name='savepass'), Option(OptionKind.CHANGEPASSWORD, _('Change Password'), OptionType.DIALOG, callback=self.on_password_change, props={'dialog': None}), ] OptionsDialog.__init__(self, parent, _('Login Options'), Gtk.DialogFlags.MODAL, options, account) self.connect('destroy', self.on_destroy) def on_password_change(self, new_password, data): self.get_option('password').entry.set_text(new_password) def on_destroy(self, *args): savepass = app.config.get_per('accounts', self.account, 'savepass') if not savepass: passwords.save_password(self.account, '') gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/adhoc_commands.py000066400000000000000000000545511326020644600253150ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## src/adhoc_commands.py ## ## Copyright (C) 2006 Nikos Kouremenos ## Copyright (C) 2006-2007 Tomasz Melcer ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2008 Jonathan Schleifer ## Stephan Erb ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## # FIXME: think if we need caching command list. it may be wrong if there will # be entities that often change the list, it may be slow to fetch it every time from gi.repository import GLib from gi.repository import Gtk import nbxmpp from gajim.common import app from gajim.common import dataforms from gajim import gtkgui_helpers from gajim import dialogs from gajim import dataforms_widget class CommandWindow: """ Class for a window for single ad-hoc commands session Note, that there might be more than one for one account/jid pair in one moment. TODO: Maybe put this window into MessageWindow? consider this when it will be possible to manage more than one window of one. TODO: Account/jid pair in MessageWindowMgr. TODO: GTK 2.10 has a special wizard-widget, consider using it... """ def __init__(self, account, jid, commandnode=None): """ Create new window """ # an account object self.account = app.connections[account] self.jid = jid self.commandnode = commandnode self.data_form_widget = None self.stage_finish_cb = None self.stage_back_button_cb = None self.stage_forward_button_cb = None self.stage_execute_button_cb = None self.stage_close_button_cb = None self.stage_restart_button_cb = None self.stage_window_delete_cb = None # retrieving widgets from xml self.xml = gtkgui_helpers.get_gtk_builder('adhoc_commands_window.ui') self.window = self.xml.get_object('adhoc_commands_window') self.window.connect('delete-event', self.on_adhoc_commands_window_delete_event) for name in ('restart_button', 'back_button', 'forward_button', 'execute_button', 'finish_button', 'close_button', 'stages_notebook', 'retrieving_commands_stage_vbox', 'command_list_stage_vbox', 'command_list_vbox', 'sending_form_stage_vbox', 'sending_form_progressbar', 'notes_label', 'no_commands_stage_vbox', 'error_stage_vbox', 'error_description_label'): setattr(self, name, self.xml.get_object(name)) self.initiate() def initiate(self): self.pulse_id = None # to satisfy self.setup_pulsing() self.commandlist = None # a list of (commandname, commanddescription) # command's data self.sessionid = None self.dataform = None self.allow_stage3_close = False # creating data forms widget if self.data_form_widget: self.sending_form_stage_vbox.remove(self.data_form_widget) self.data_form_widget.destroy() self.data_form_widget = dataforms_widget.DataFormWidget() self.data_form_widget.show() self.sending_form_stage_vbox.pack_start(self.data_form_widget, True, True, 0) if self.commandnode: # Execute command self.stage3() else: # setting initial stage self.stage1() # displaying the window self.window.set_title(_('Ad-hoc Commands - Gajim')) self.xml.connect_signals(self) self.window.show_all() self.restart_button.set_sensitive(False) # These functions are set up by appropriate stageX methods. def stage_finish(self, *anything): if self.stage_finish_cb: self.stage_finish_cb(*anything) # Widget callbacks... def on_back_button_clicked(self, *anything): if self.stage_back_button_cb: return self.stage_back_button_cb(*anything) return False def on_forward_button_clicked(self, *anything): if self.stage_forward_button_cb: return self.stage_forward_button_cb(*anything) return False def on_execute_button_clicked(self, *anything): if self.stage_execute_button_cb: return self.stage_execute_button_cb(*anything) return False def on_finish_button_clicked(self, *anything): if self.stage_finish_button_cb: return self.stage_finish_button_cb(*anything) return False def on_close_button_clicked(self, *anything): if self.stage_close_button_cb: return self.stage_close_button_cb(*anything) return False def on_restart_button_clicked(self, *anything): if self.stage_restart_button_cb: return self.stage_restart_button_cb(*anything) return False def on_adhoc_commands_window_destroy(self, *anything): # TODO: do all actions that are needed to remove this object from memory self.remove_pulsing() def on_adhoc_commands_window_delete_event(self, *anything): if self.stage_window_delete_cb: return self.stage_window_delete_cb(self.window) return False def __del__(self): print('Object has been deleted.') # stage 1: waiting for command list def stage1(self): """ Prepare the first stage. Request command list, set appropriate state of widgets """ # close old stage... self.stage_finish() # show the stage self.stages_notebook.set_current_page( self.stages_notebook.page_num( self.retrieving_commands_stage_vbox)) # set widgets' state self.close_button.set_sensitive(True) self.back_button.set_sensitive(False) self.forward_button.set_sensitive(False) self.execute_button.set_sensitive(False) self.finish_button.set_sensitive(False) # request command list self.request_command_list() self.setup_pulsing( self.xml.get_object('retrieving_commands_progressbar')) # setup the callbacks self.stage_finish_cb = self.stage1_finish self.stage_close_button_cb = self.stage1_close_button_clicked self.stage_restart_button_cb = self.stage1_restart_button_clicked self.stage_window_delete_cb = \ self.stage1_adhoc_commands_window_delete_event def stage1_finish(self): self.remove_pulsing() def stage1_close_button_clicked(self, widget): # cancelling in this stage is not critical, so we don't # show any popups to user self.stage_finish() self.window.destroy() def stage1_restart_button_clicked(self, widget): self.stage_finish() self.restart() def stage1_adhoc_commands_window_delete_event(self, widget): self.stage1_finish() return True # stage 2: choosing the command to execute def stage2(self): """ Populate the command list vbox with radiobuttons FIXME: If there is more commands, maybe some kind of list, set widgets state """ # close old stage self.stage_finish() assert len(self.commandlist)>0 self.stages_notebook.set_current_page( self.stages_notebook.page_num(self.command_list_stage_vbox)) self.close_button.set_sensitive(True) self.back_button.set_sensitive(False) self.forward_button.set_sensitive(True) self.execute_button.set_sensitive(False) self.finish_button.set_sensitive(False) # build the commands list radiobuttons first_radio = None for (commandnode, commandname) in self.commandlist: radio = Gtk.RadioButton.new_with_label_from_widget(first_radio, commandname) radio.connect("toggled", self.on_command_radiobutton_toggled, commandnode) if not first_radio: first_radio = radio self.commandnode = commandnode self.command_list_vbox.pack_start(radio, False, True, 0) self.command_list_vbox.show_all() self.stage_finish_cb = self.stage2_finish self.stage_close_button_cb = self.stage2_close_button_clicked self.stage_restart_button_cb = self.stage2_restart_button_clicked self.stage_forward_button_cb = self.stage2_forward_button_clicked self.stage_window_delete_cb = None def stage2_finish(self): """ Remove widgets we created. Not needed when the window is destroyed """ def remove_widget(widget, param): self.command_list_vbox.remove(widget) self.command_list_vbox.foreach(remove_widget, None) def stage2_close_button_clicked(self, widget): self.stage_finish() self.window.destroy() def stage2_restart_button_clicked(self, widget): self.stage_finish() self.restart() def stage2_forward_button_clicked(self, widget): self.stage3() def on_command_radiobutton_toggled(self, widget, commandnode): self.commandnode = commandnode def on_check_commands_1_button_clicked(self, widget): self.stage1() # stage 3: command invocation def stage3(self): # close old stage self.stage_finish() self.form_status = None self.stages_notebook.set_current_page( self.stages_notebook.page_num( self.sending_form_stage_vbox)) self.restart_button.set_sensitive(True) self.close_button.set_sensitive(True) self.back_button.set_sensitive(False) self.forward_button.set_sensitive(False) self.execute_button.set_sensitive(False) self.finish_button.set_sensitive(False) self.stage3_submit_form() self.stage_finish_cb = None self.stage_back_button_cb = self.stage3_back_button_clicked self.stage_forward_button_cb = self.stage3_forward_button_clicked self.stage_execute_button_cb = self.stage3_execute_button_clicked self.stage_finish_button_cb = self.stage3_finish_button_clicked self.stage_close_button_cb = self.stage3_close_button_clicked self.stage_restart_button_cb = self.stage3_restart_button_clicked self.stage_window_delete_cb = self.stage3_close_button_clicked def stage3_can_close(self, cb): if self.form_status == 'completed': cb() return def on_yes(button): self.send_cancel() dialog.destroy() cb() dialog = dialogs.HigDialog(self.window, Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, _('Cancel confirmation'), _('You are in process of executing command. Do you really want to ' 'cancel it?'), on_response_yes=on_yes) dialog.popup() def stage3_close_button_clicked(self, widget): """ We are in the middle of executing command. Ask user if he really want to cancel the process, then cancel it """ # this works also as a handler for window_delete_event, so we have to # return appropriate values if self.allow_stage3_close: return False def on_ok(): self.allow_stage3_close = True self.window.destroy() self.stage3_can_close(on_ok) return True # Block event, don't close window def stage3_restart_button_clicked(self, widget): def on_ok(): self.restart() self.stage3_can_close(on_ok) def stage3_back_button_clicked(self, widget): self.stage3_submit_form('prev') def stage3_forward_button_clicked(self, widget): self.stage3_submit_form('next') def stage3_execute_button_clicked(self, widget): self.stage3_submit_form('execute') def stage3_finish_button_clicked(self, widget): self.stage3_submit_form('complete') def stage3_submit_form(self, action='execute'): self.data_form_widget.set_sensitive(False) if self.data_form_widget.get_data_form(): df = self.data_form_widget.get_data_form() if not df.is_valid(): app.interface.raise_dialog( 'invalid-form', transient_for=self.window) self.data_form_widget.set_sensitive(True) return self.data_form_widget.data_form.type_ = 'submit' else: self.data_form_widget.hide() self.close_button.set_sensitive(True) self.back_button.set_sensitive(False) self.forward_button.set_sensitive(False) self.execute_button.set_sensitive(False) self.finish_button.set_sensitive(False) self.sending_form_progressbar.show() self.setup_pulsing(self.sending_form_progressbar) self.send_command(action) def stage3_next_form(self, command): if not isinstance(command, nbxmpp.Node): self.stage5(error=_('Service sent malformed data'), senderror=True) return self.remove_pulsing() self.sending_form_progressbar.hide() if not self.sessionid: self.sessionid = command.getAttr('sessionid') elif self.sessionid != command.getAttr('sessionid'): self.stage5(error=_('Service changed the session identifier.'), senderror=True) return self.form_status = command.getAttr('status') self.commandnode = command.getAttr('node') if command.getTag('x'): self.dataform = dataforms.ExtendForm(node=command.getTag('x')) self.data_form_widget.set_sensitive(True) try: self.data_form_widget.selectable = True self.data_form_widget.data_form = self.dataform except dataforms.Error: self.stage5(error=_('Service sent malformed data'), senderror=True) return self.data_form_widget.show() if self.data_form_widget.title: self.window.set_title(_('%s - Ad-hoc Commands - Gajim') % \ self.data_form_widget.title) else: self.data_form_widget.hide() actions = command.getTag('actions') if actions: # actions, actions, actions... self.close_button.set_sensitive(True) self.back_button.set_sensitive(actions.getTag('prev') is not None) self.forward_button.set_sensitive( actions.getTag('next') is not None) self.execute_button.set_sensitive(True) self.finish_button.set_sensitive(actions.getTag('complete') is not \ None) else: self.close_button.set_sensitive(True) self.back_button.set_sensitive(False) self.forward_button.set_sensitive(False) self.execute_button.set_sensitive(True) self.finish_button.set_sensitive(False) if self.form_status == 'completed': self.close_button.set_sensitive(True) self.back_button.hide() self.forward_button.hide() self.execute_button.hide() self.finish_button.hide() self.close_button.show() self.stage_window_delete_cb = self.stage3_close_button_clicked note = command.getTag('note') if note: self.notes_label.set_text(note.getData()) self.notes_label.set_no_show_all(False) self.notes_label.show() else: self.notes_label.set_no_show_all(True) self.notes_label.hide() def restart(self): self.commandnode = None self.initiate() # stage 4: no commands are exposed def stage4(self): """ Display the message. Wait for user to close the window """ # close old stage self.stage_finish() self.stages_notebook.set_current_page( self.stages_notebook.page_num(self.no_commands_stage_vbox)) self.close_button.set_sensitive(True) self.back_button.set_sensitive(False) self.forward_button.set_sensitive(False) self.execute_button.set_sensitive(False) self.finish_button.set_sensitive(False) self.stage_finish_cb = None self.stage_close_button_cb = self.stage4_close_button_clicked self.stage_restart_button_cb = self.stage4_restart_button_clicked self.stage_window_delete_cb = None def stage4_close_button_clicked(self, widget): self.window.destroy() def stage4_restart_button_clicked(self, widget): self.restart() def on_check_commands_2_button_clicked(self, widget): self.stage1() # stage 5: an error has occured def stage5(self, error=None, errorid=None, senderror=False): """ Display the error message. Wait for user to close the window """ # FIXME: sending error to responder # close old stage self.stage_finish() assert errorid or error if errorid: # we've got error code, display appropriate message try: errorname = nbxmpp.NS_STANZAS + ' ' + str(errorid) errordesc = nbxmpp.ERRORS[errorname][2] error = errordesc del errorname, errordesc except KeyError: # when stanza doesn't have error description error = _('Service returned an error.') elif error: # we've got error message pass else: # we don't know what's that, bailing out assert False self.stages_notebook.set_current_page( self.stages_notebook.page_num(self.error_stage_vbox)) self.close_button.set_sensitive(True) self.back_button.hide() self.forward_button.hide() self.execute_button.hide() self.finish_button.hide() self.error_description_label.set_text(error) self.stage_finish_cb = None self.stage_close_button_cb = self.stage5_close_button_clicked self.stage_restart_button_cb = self.stage5_restart_button_clicked self.stage_window_delete_cb = None def stage5_close_button_clicked(self, widget): self.window.destroy() def stage5_restart_button_clicked(self, widget): self.restart() # helpers to handle pulsing in progressbar def setup_pulsing(self, progressbar): """ Set the progressbar to pulse. Makes a custom function to repeatedly call progressbar.pulse() method """ assert not self.pulse_id assert isinstance(progressbar, Gtk.ProgressBar) def callback(): progressbar.pulse() return True # important to keep callback be called back! # 12 times per second (80 miliseconds) self.pulse_id = GLib.timeout_add(80, callback) def remove_pulsing(self): """ Stop pulsing, useful when especially when removing widget """ if self.pulse_id: GLib.source_remove(self.pulse_id) self.pulse_id = None # handling xml stanzas def request_command_list(self): """ Request the command list. Change stage on delivery """ query = nbxmpp.Iq(typ='get', to=nbxmpp.JID(self.jid), queryNS=nbxmpp.NS_DISCO_ITEMS) query.setQuerynode(nbxmpp.NS_COMMANDS) def callback(response): '''Called on response to query.''' # FIXME: move to connection_handlers.py # is error => error stage error = response.getError() if error: # extracting error description self.stage5(errorid=error) return # no commands => no commands stage # commands => command selection stage query = response.getTag('query') if query and query.getAttr('node') == nbxmpp.NS_COMMANDS: items = query.getTags('item') else: items = [] if len(items)==0: self.commandlist = [] self.stage4() else: self.commandlist = [(t.getAttr('node'), t.getAttr('name')) \ for t in items] self.stage2() self.account.connection.SendAndCallForResponse(query, callback) def send_command(self, action='execute'): """ Send the command with data form. Wait for reply """ # create the stanza assert action in ('execute', 'prev', 'next', 'complete') stanza = nbxmpp.Iq(typ='set', to=self.jid) cmdnode = stanza.addChild('command', namespace=nbxmpp.NS_COMMANDS, attrs={'node':self.commandnode, 'action':action}) if self.sessionid: cmdnode.setAttr('sessionid', self.sessionid) if self.data_form_widget.data_form: cmdnode.addChild(node=self.data_form_widget.data_form.get_purged()) def callback(response): # FIXME: move to connection_handlers.py err = response.getError() if err: self.stage5(errorid = err) else: self.stage3_next_form(response.getTag('command')) self.account.connection.SendAndCallForResponse(stanza, callback) def send_cancel(self): """ Send the command with action='cancel' """ assert self.commandnode if self.sessionid and self.account.connection: # we already have sessionid, so the service sent at least one reply. stanza = nbxmpp.Iq(typ='set', to=self.jid) stanza.addChild('command', namespace=nbxmpp.NS_COMMANDS, attrs={ 'node':self.commandnode, 'sessionid':self.sessionid, 'action':'cancel' }) self.account.connection.send(stanza) else: # we did not received any reply from service; # FIXME: we should wait and then send cancel; for now we do nothing pass gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/advanced_configuration_window.py000066400000000000000000000326071326020644600304370ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/advanced.py ## ## Copyright (C) 2005 Travis Shirk ## Vincent Hanquez ## Copyright (C) 2005-2014 Yann Leboulanger ## Copyright (C) 2005-2007 Nikos Kouremenos ## Copyright (C) 2006 Dimitur Kirov ## Copyright (C) 2006-2007 Jean-Marie Traissard ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from enum import IntEnum, unique from gi.repository import Gtk from gajim import gtkgui_helpers from gi.repository import GLib from gi.repository import Pango from gajim.common import app @unique class Column(IntEnum): PREFERENCE_NAME = 0 VALUE = 1 TYPE = 2 def rate_limit(rate): """ Call func at most *rate* times per second """ def decorator(func): timeout = [None] def f(*args, **kwargs): if timeout[0] is not None: GLib.source_remove(timeout[0]) timeout[0] = None def timeout_func(): func(*args, **kwargs) timeout[0] = None timeout[0] = GLib.timeout_add(int(1000.0 / rate), timeout_func) return f return decorator def tree_model_iter_children(model, treeiter): it = model.iter_children(treeiter) while it: yield it it = model.iter_next(it) def tree_model_pre_order(model, treeiter): yield treeiter for childiter in tree_model_iter_children(model, treeiter): for it in tree_model_pre_order(model, childiter): yield it class AdvancedConfigurationWindow(object): def __init__(self): self.xml = gtkgui_helpers.get_gtk_builder('advanced_configuration_window.ui') self.window = self.xml.get_object('advanced_configuration_window') self.window.set_transient_for( app.interface.instances['preferences'].window) self.entry = self.xml.get_object('advanced_entry') self.desc_label = self.xml.get_object('advanced_desc_label') self.restart_box = self.xml.get_object('restart_box') self.reset_button = self.xml.get_object('reset_button') # Format: # key = option name (root/subopt/opt separated by \n then) # value = array(oldval, newval) self.changed_opts = {} # For i18n self.right_true_dict = {True: _('Activated'), False: _('Deactivated')} self.types = { 'boolean': _('Boolean'), 'integer': _('Integer'), 'string': _('Text'), 'color': _('Color')} treeview = self.xml.get_object('advanced_treeview') self.treeview = treeview self.model = Gtk.TreeStore(str, str, str) self.fill_model() self.model.set_sort_column_id(0, Gtk.SortType.ASCENDING) self.modelfilter = self.model.filter_new() self.modelfilter.set_visible_func(self.visible_func) renderer_text = Gtk.CellRendererText() col = Gtk.TreeViewColumn(_('Preference Name'), renderer_text, text = 0) treeview.insert_column(col, -1) col.set_resizable(True) renderer_text = Gtk.CellRendererText() renderer_text.connect('edited', self.on_config_edited) renderer_text.set_property('ellipsize', Pango.EllipsizeMode.END) col = Gtk.TreeViewColumn(_('Value'),renderer_text, text = 1) treeview.insert_column(col, -1) col.set_cell_data_func(renderer_text, self.cb_value_column_data) col.props.resizable = True col.props.expand = True col.props.sizing = Gtk.TreeViewColumnSizing.FIXED renderer_text = Gtk.CellRendererText() col = Gtk.TreeViewColumn(_('Type'), renderer_text, text = 2) treeview.insert_column(col, -1) col.props.sizing = Gtk.TreeViewColumnSizing.FIXED treeview.set_model(self.modelfilter) # connect signal for selection change treeview.get_selection().connect('changed', self.on_advanced_treeview_selection_changed) self.xml.connect_signals(self) self.restart_box.set_no_show_all(True) self.window.show_all() app.interface.instances['advanced_config'] = self def cb_value_column_data(self, col, cell, model, iter_, data): """ Check if it's boolen or holds password stuff and if yes make the cellrenderertext not editable, else - it's editable """ optname = model[iter_][Column.PREFERENCE_NAME] opttype = model[iter_][Column.TYPE] if opttype == self.types['boolean'] or optname == 'password': cell.set_property('editable', False) else: cell.set_property('editable', True) @staticmethod def get_option_path(model, iter_): # It looks like path made from reversed array # path[0] is the true one optname # path[1] is the key name # path[2] is the root of tree # last two is optional path = [model[iter_][0]] parent = model.iter_parent(iter_) while parent: path.append(model[parent][0]) parent = model.iter_parent(parent) return path def on_advanced_treeview_selection_changed(self, treeselection): model, iter_ = treeselection.get_selected() # Check for GtkTreeIter if iter_: opt_path = self.get_option_path(model, iter_) # Get text from first column in this row desc = None if len(opt_path) == 3: desc = app.config.get_desc_per(opt_path[2], opt_path[0]) elif len(opt_path) == 1: desc = app.config.get_desc(opt_path[0]) if desc: self.desc_label.set_text(desc) else: #we talk about option description in advanced configuration editor self.desc_label.set_text(_('(None)')) if len(opt_path) == 3 or (len(opt_path) == 1 and not \ model.iter_has_child(iter_)): self.reset_button.set_sensitive(True) else: self.reset_button.set_sensitive(False) else: self.reset_button.set_sensitive(False) def remember_option(self, option, oldval, newval): if option in self.changed_opts: self.changed_opts[option] = (self.changed_opts[option][0], newval) else: self.changed_opts[option] = (oldval, newval) def on_advanced_treeview_row_activated(self, treeview, path, column): modelpath = self.modelfilter.convert_path_to_child_path(path) modelrow = self.model[modelpath] option = modelrow[0] if modelrow[2] == self.types['boolean']: for key in self.right_true_dict.keys(): if self.right_true_dict[key] == modelrow[1]: modelrow[1] = str(key) newval = {'False': True, 'True': False}[modelrow[1]] if len(modelpath.get_indices()) > 1: optnamerow = self.model[modelpath.get_indices()[0]] optname = optnamerow[0] modelpath.up() keyrow = self.model[modelpath] key = keyrow[0] self.remember_option(option + '\n' + key + '\n' + optname, modelrow[1], newval) app.config.set_per(optname, key, option, newval) else: self.remember_option(option, modelrow[1], newval) app.config.set(option, newval) modelrow[1] = self.right_true_dict[newval] self.check_for_restart() def check_for_restart(self): self.restart_box.hide() for opt in self.changed_opts: opt_path = opt.split('\n') if len(opt_path)==3: restart = app.config.get_restart_per(opt_path[2], opt_path[1], opt_path[0]) else: restart = app.config.get_restart(opt_path[0]) if restart: if self.changed_opts[opt][0] != self.changed_opts[opt][1]: self.restart_box.set_no_show_all(False) self.restart_box.show_all() break def on_config_edited(self, cell, path, text): # convert modelfilter path to model path path=Gtk.TreePath.new_from_string(path) modelpath = self.modelfilter.convert_path_to_child_path(path) modelrow = self.model[modelpath] option = modelrow[0] if modelpath.get_depth() > 2: modelpath.up() # Get parent keyrow = self.model[modelpath] key = keyrow[0] modelpath.up() # Get parent optnamerow = self.model[modelpath] optname = optnamerow[0] self.remember_option(option + '\n' + key + '\n' + optname, modelrow[1], text) app.config.set_per(optname, key, option, text) else: self.remember_option(option, modelrow[1], text) app.config.set(option, text) modelrow[1] = text self.check_for_restart() @staticmethod def on_advanced_configuration_window_destroy(widget): del app.interface.instances['advanced_config'] def on_reset_button_clicked(self, widget): model, iter_ = self.treeview.get_selection().get_selected() # Check for GtkTreeIter if iter_: path = model.get_path(iter_) opt_path = self.get_option_path(model, iter_) if len(opt_path) == 1: default = app.config.get_default(opt_path[0]) elif len(opt_path) == 3: default = app.config.get_default_per(opt_path[2], opt_path[0]) if model[iter_][Column.TYPE] == self.types['boolean']: if self.right_true_dict[default] == model[iter_][Column.VALUE]: return modelpath = self.modelfilter.convert_path_to_child_path(path) modelrow = self.model[modelpath] option = modelrow[0] if len(modelpath) > 1: optnamerow = self.model[modelpath[0]] optname = optnamerow[0] keyrow = self.model[modelpath[:2]] key = keyrow[0] self.remember_option(option + '\n' + key + '\n' + optname, modelrow[Column.VALUE], default) app.config.set_per(optname, key, option, default) else: self.remember_option(option, modelrow[Column.VALUE], default) app.config.set(option, default) modelrow[Column.VALUE] = self.right_true_dict[default] self.check_for_restart() else: if str(default) == model[iter_][Column.VALUE]: return self.on_config_edited(None, path.to_string(), str(default)) def on_advanced_close_button_clicked(self, widget): self.window.destroy() def fill_model(self, node=None, parent=None): for item, option in app.config.get_children(node): name = item[-1] if option is None: # Node newparent = self.model.append(parent, [name, '', '']) self.fill_model(item, newparent) else: # Leaf if len(item) == 1: type_ = self.types[app.config.get_type(name)] elif len(item) == 3: type_ = self.types[app.config.get_type_per(item[0], item[2])] if name == 'password': value = _('Hidden') else: if type_ == self.types['boolean']: value = self.right_true_dict[option] else: try: value = str(option) except: value = option self.model.append(parent, [name, value, type_]) def visible_func(self, model, treeiter, data): search_string = self.entry.get_text().lower() for it in tree_model_pre_order(model, treeiter): if model[it][Column.TYPE] != '': opt_path = self.get_option_path(model, it) if len(opt_path) == 3: desc = app.config.get_desc_per(opt_path[2], opt_path[0]) elif len(opt_path) == 1: desc = app.config.get_desc(opt_path[0]) if search_string in model[it][Column.PREFERENCE_NAME] or (desc and \ search_string in desc.lower()): return True return False @rate_limit(3) def on_advanced_entry_changed(self, widget): self.modelfilter.refilter() if not widget.get_text(): # Maybe the expanded rows should be remembered here ... self.treeview.collapse_all() else: # ... and be restored correctly here self.treeview.expand_all() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/app_actions.py000066400000000000000000000254161326020644600246540ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## src/app_actions.py ## ## Copyright (C) 2017 Philipp Hörist ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gi.repository import Gtk from gajim.common import app from gajim.common import helpers from gajim.common.app import interface from gajim.common.exceptions import GajimGeneralException from gajim import config from gajim import dialogs from gajim import features_window from gajim import shortcuts_window from gajim import accounts_window import gajim.plugins.gui from gajim import history_window from gajim import disco from gajim.history_sync import HistorySyncAssistant from gajim.server_info import ServerInfoDialog class AppActions(): ''' Action Callbacks ''' def __init__(self, application: Gtk.Application): self.application = application # General Actions def on_add_contact_jid(self, action, param): dialogs.AddNewContactWindow(None, param.get_string()) # Application Menu Actions def on_preferences(self, action, param): if 'preferences' in interface.instances: interface.instances['preferences'].window.present() else: interface.instances['preferences'] = \ config.PreferencesWindow() def on_plugins(self, action, param): if 'plugins' in interface.instances: interface.instances['plugins'].window.present() else: interface.instances['plugins'] = gajim.plugins.gui.PluginsWindow() def on_accounts(self, action, param): if 'accounts' in app.interface.instances: app.interface.instances['accounts'].present() else: app.interface.instances['accounts'] = accounts_window.AccountsWindow() def on_history_manager(self, action, param): from gajim.history_manager import HistoryManager HistoryManager() def on_manage_bookmarks(self, action, param): config.ManageBookmarksWindow() def on_quit(self, action, param): interface.roster.on_quit_request() def on_new_chat(self, action, param): if 'start_chat' in app.interface.instances: app.interface.instances['start_chat'].present() else: app.interface.instances['start_chat'] = dialogs.StartChatDialog() # Accounts Actions def on_profile(self, action, param): interface.edit_own_details(param.get_string()) def on_activate_bookmark(self, action, param): dict_ = param.unpack() account, jid, nick, password = \ dict_['account'], dict_['jid'], None, None if 'nick' in dict_: nick = dict_['nick'] if 'password' in dict_: password = dict_['password'] interface.join_gc_room(account, jid, nick, password) def on_send_server_message(self, action, param): account = param.get_string() server = app.config.get_per('accounts', account, 'hostname') server += '/announce/online' dialogs.SingleMessageWindow(account, server, 'send') def on_service_disco(self, action, param): account = param.get_string() server_jid = app.config.get_per('accounts', account, 'hostname') if server_jid in interface.instances[account]['disco']: interface.instances[account]['disco'][server_jid].\ window.present() else: try: # Object will add itself to the window dict disco.ServiceDiscoveryWindow(account, address_entry=True) except GajimGeneralException: pass def on_join_gc(self, action, param): account = param.get_string() invisible_show = app.SHOW_LIST.index('invisible') if app.connections[account].connected == invisible_show: app.interface.raise_dialog('join-while-invisible') return if 'join_gc' in interface.instances[account]: interface.instances[account]['join_gc'].present() else: interface.instances[account]['join_gc'] = \ dialogs.JoinGroupchatWindow(account, None) def on_add_contact(self, action, param): dialogs.AddNewContactWindow(param.get_string()) def on_single_message(self, action, param): dialogs.SingleMessageWindow(param.get_string(), action='send') def on_merge_accounts(self, action, param): action.set_state(param) value = param.get_boolean() app.config.set('mergeaccounts', value) if len(app.connections) >= 2: # Do not merge accounts if only one active app.interface.roster.regroup = value else: app.interface.roster.regroup = False app.interface.roster.setup_and_draw_roster() def on_use_pgp_agent(self, action, param): action.set_state(param) app.config.set('use_gpg_agent', param.get_boolean()) def on_add_account(self, action, param): if 'account_creation_wizard' in app.interface.instances: app.interface.instances['account_creation_wizard'].window.present() else: app.interface.instances['account_creation_wizard'] = \ config.AccountCreationWizardWindow() def on_import_contacts(self, action, param): account = param.get_string() if 'import_contacts' in app.interface.instances: app.interface.instances['import_contacts'].dialog.present() else: app.interface.instances['import_contacts'] = \ dialogs.SynchroniseSelectAccountDialog(account) # Advanced Actions def on_archiving_preferences(self, action, param): account = param.get_string() if 'archiving_preferences' in interface.instances[account]: interface.instances[account]['archiving_preferences'].window.\ present() else: interface.instances[account]['archiving_preferences'] = \ dialogs.Archiving313PreferencesWindow(account) def on_history_sync(self, action, param): account = param.get_string() if 'history_sync' in interface.instances[account]: interface.instances[account]['history_sync'].present() else: interface.instances[account]['history_sync'] = \ HistorySyncAssistant(account, interface.roster.window) def on_privacy_lists(self, action, param): account = param.get_string() if 'privacy_lists' in interface.instances[account]: interface.instances[account]['privacy_lists'].window.present() else: interface.instances[account]['privacy_lists'] = \ dialogs.PrivacyListsWindow(account) def on_server_info(self, action, param): account = param.get_string() if 'server_info' in interface.instances[account]: interface.instances[account]['server_info'].present() else: interface.instances[account]['server_info'] = \ ServerInfoDialog(account) def on_xml_console(self, action, param): account = param.get_string() if 'xml_console' in interface.instances[account]: interface.instances[account]['xml_console'].present() else: interface.instances[account]['xml_console'] = \ dialogs.XMLConsoleWindow(account) def on_manage_proxies(self, action, param): if 'manage_proxies' in app.interface.instances: app.interface.instances['manage_proxies'].window.present() else: app.interface.instances['manage_proxies'] = \ config.ManageProxiesWindow(interface.roster.window) # Admin Actions def on_set_motd(self, action, param): account = param.get_string() server = app.config.get_per('accounts', account, 'hostname') server += '/announce/motd' dialogs.SingleMessageWindow(account, server, 'send') def on_update_motd(self, action, param): account = param.get_string() server = app.config.get_per('accounts', account, 'hostname') server += '/announce/motd/update' dialogs.SingleMessageWindow(account, server, 'send') def on_delete_motd(self, action, param): account = param.get_string() server = app.config.get_per('accounts', account, 'hostname') server += '/announce/motd/delete' app.connections[account].send_motd(server) # Help Actions def on_contents(self, action, param): helpers.launch_browser_mailer( 'url', 'https://dev.gajim.org/gajim/gajim/wikis') def on_faq(self, action, param): helpers.launch_browser_mailer( 'url', 'https://dev.gajim.org/gajim/gajim/wikis/help/gajimfaq') def on_keyboard_shortcuts(self, action, param): shortcuts_window.show(self.application.get_active_window()) def on_features(self, action, param): features_window.FeaturesWindow() def on_about(self, action, param): dialogs.AboutDialog() # View Actions def on_file_transfers(self, action, param): if interface.instances['file_transfers']. \ window.get_property('visible'): interface.instances['file_transfers'].window.present() else: interface.instances['file_transfers'].window.show_all() def on_history(self, action, param): if 'logs' in interface.instances: interface.instances['logs'].window.present() else: interface.instances['logs'] = history_window.\ HistoryWindow() def on_open_event(self, action, param): dict_ = param.unpack() app.interface.handle_event(dict_['account'], dict_['jid'], dict_['type_']) # Other Actions def toggle_ipython(self, action, param): """ Show/hide the ipython window """ win = app.ipython_window if win and win.window.is_visible(): win.present() else: app.interface.create_ipython_window() def show_next_pending_event(self, action, param): """ Show the window(s) with next pending event in tabbed/group chats """ if app.events.get_nb_events(): account, jid, event = app.events.get_first_systray_event() if not event: return app.interface.handle_event(account, jid, event.type_) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/atom_window.py000066400000000000000000000121041326020644600246710ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/atom_window.py ## ## Copyright (C) 2006 Tomasz Melcer ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2007 Nikos Kouremenos ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gi.repository import Gdk from gi.repository import GLib from gajim import gtkgui_helpers from gajim.common import helpers from gajim.common import i18n class AtomWindow: window = None entries = [] @classmethod def newAtomEntry(cls, entry): """ Queue new entry, open window if there's no one opened """ cls.entries.append(entry) if cls.window is None: cls.window = AtomWindow() else: cls.window.updateCounter() @classmethod def windowClosed(cls): cls.window = None def __init__(self): """ Create new window... only if we have anything to show """ assert len(self.__class__.entries) self.entry = None # the entry actually displayed self.xml = gtkgui_helpers.get_gtk_builder('atom_entry_window.ui') self.window = self.xml.get_object('atom_entry_window') for name in ('new_entry_label', 'feed_title_label', 'feed_title_eventbox', 'feed_tagline_label', 'entry_title_label', 'entry_title_eventbox', 'last_modified_label', 'close_button', 'next_button'): self.__dict__[name] = self.xml.get_object(name) self.displayNextEntry() self.xml.connect_signals(self) self.window.show_all() self.entry_title_eventbox.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) self.feed_title_eventbox.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) def displayNextEntry(self): """ Get next entry from the queue and display it in the window """ assert len(self.__class__.entries)>0 newentry = self.__class__.entries.pop(0) # fill the fields if newentry.feed_link is not None: self.feed_title_label.set_markup( '%s' % \ GLib.markup_escape_text(newentry.feed_title)) else: self.feed_title_label.set_markup(GLib.markup_escape_text( newentry.feed_title)) self.feed_tagline_label.set_markup( '%s' % GLib.markup_escape_text( newentry.feed_tagline)) if newentry.title: if newentry.uri is not None: self.entry_title_label.set_markup( '%s' % \ GLib.markup_escape_text(newentry.title)) else: self.entry_title_label.set_markup(GLib.markup_escape_text( newentry.title)) else: self.entry_title_label.set_markup('') self.last_modified_label.set_text(newentry.updated) # update the counters self.updateCounter() self.entry = newentry def updateCounter(self): """ Display number of events on the top of window, sometimes it needs to be changed """ count = len(self.__class__.entries) if count: self.new_entry_label.set_text(i18n.ngettext( 'You have received new entries (and %d not displayed):', 'You have received new entries (and %d not displayed):', count, count, count)) self.next_button.set_sensitive(True) else: self.new_entry_label.set_text(_('You have received new entry:')) self.next_button.set_sensitive(False) def on_close_button_clicked(self, widget): self.window.destroy() self.windowClosed() def on_next_button_clicked(self, widget): self.displayNextEntry() def on_entry_title_eventbox_button_press_event(self, widget, event): #FIXME: make it using special gtk2.10 widget if event.button == 1: # left click uri = self.entry.uri if uri is not None: helpers.launch_browser_mailer('url', uri) return True def on_feed_title_eventbox_button_press_event(self, widget, event): #FIXME: make it using special gtk2.10 widget if event.button == 1: # left click uri = self.entry.feed_uri if uri is not None: helpers.launch_browser_mailer('url', uri) return True gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/cell_renderer_image.py000066400000000000000000000136741326020644600263260ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/cell_renderer_image.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2005 Vincent Hanquez ## Copyright (C) 2005-2007 Nikos Kouremenos ## Copyright (C) 2006 Travis Shirk ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gi.repository import GLib from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GObject class CellRendererImage(Gtk.CellRendererPixbuf): __gproperties__ = { 'image': (GObject.TYPE_OBJECT, 'Image', 'Image', GObject.ParamFlags.READWRITE), } def __init__(self, col_index, tv_index): super(CellRendererImage, self).__init__() self.image = None self.col_index = col_index self.tv_index = tv_index self.iters = {} def do_set_property(self, pspec, value): setattr(self, pspec.name, value) def do_get_property(self, pspec): return getattr(self, pspec.name) def do_activate(event, widget, path, bg_area, cell_area, flags): """Renderers cannot be activated; always return True.""" return True def do_editing_started(event, widget, path, fb_area, cell_area, flags): """Renderers cannot be edited; always return None.""" return None def func(self, model, path, iter_, image_tree): image, tree = image_tree if model.get_value(iter_, self.tv_index) != image: return self.redraw = 1 col = tree.get_column(self.col_index) cell_area = tree.get_cell_area(path, col) tree.queue_draw_area(cell_area.x, cell_area.y, cell_area.width, cell_area.height) def animation_timeout(self, tree, image): if image.get_storage_type() != Gtk.ImageType.ANIMATION: return self.redraw = 0 iter_ = self.iters[image] timeval = GLib.TimeVal() timeval.tv_sec = GLib.get_monotonic_time() / 1000000 iter_.advance(timeval) model = tree.get_model() if model: model.foreach(self.func, (image, tree)) if self.redraw: GLib.timeout_add(iter_.get_delay_time(), self.animation_timeout, tree, image) elif image in self.iters: del self.iters[image] def do_render(self, ctx, widget, background_area, cell_area, flags): if not self.image: return if self.image.get_storage_type() == Gtk.ImageType.ANIMATION: if self.image not in self.iters: if not isinstance(widget, Gtk.TreeView): return animation = self.image.get_animation() timeval = GLib.TimeVal() timeval.tv_sec = GLib.get_monotonic_time() / 1000000 iter_ = animation.get_iter(timeval) self.iters[self.image] = iter_ GLib.timeout_add(iter_.get_delay_time(), self.animation_timeout, widget, self.image) pix = self.iters[self.image].get_pixbuf() elif self.image.get_storage_type() == Gtk.ImageType.PIXBUF: pix = self.image.get_pixbuf() else: return calc_width = self.get_property('xpad') * 2 + pix.get_width() calc_height = self.get_property('ypad') * 2 + pix.get_height() x_pos = cell_area.x + self.get_property('xalign') * \ (cell_area.width - calc_width - self.get_property('xpad')) y_pos = cell_area.y + self.get_property('yalign') * \ (cell_area.height - calc_height - self.get_property('ypad')) Gdk.cairo_set_source_pixbuf(ctx, pix, x_pos, y_pos) ctx.paint() def do_get_preferred_height(self, widget): """ Return the height we need for this cell. Each cell is drawn individually and is only as wide as it needs to be, we let the TreeViewColumn take care of making them all line up. """ if not self.image: return 0, 0 if self.image.get_storage_type() == Gtk.ImageType.ANIMATION: animation = self.image.get_animation() timeval = GLib.TimeVal() timeval.tv_sec = GLib.get_monotonic_time() / 1000000 pix = animation.get_iter(timeval).get_pixbuf() elif self.image.get_storage_type() == Gtk.ImageType.PIXBUF: pix = self.image.get_pixbuf() else: return 0, 0, 0, 0 calc_height = self.get_property('ypad') * 2 + pix.get_height() return calc_height, calc_height def do_get_preferred_width(self, widget): """ Return the width we need for this cell. Each cell is drawn individually and is only as wide as it needs to be, we let the TreeViewColumn take care of making them all line up. """ if not self.image: return 0, 0 if self.image.get_storage_type() == Gtk.ImageType.ANIMATION: animation = self.image.get_animation() timeval = GLib.TimeVal() timeval.tv_sec = GLib.get_monotonic_time() / 1000000 pix = animation.get_iter(timeval).get_pixbuf() elif self.image.get_storage_type() == Gtk.ImageType.PIXBUF: pix = self.image.get_pixbuf() else: return 0, 0, 0, 0 calc_width = self.get_property('xpad') * 2 + pix.get_width() return calc_width, calc_width gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/chat_control.py000066400000000000000000002074411326020644600250330ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/chat_control.py ## ## Copyright (C) 2006 Dimitur Kirov ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Nikos Kouremenos ## Travis Shirk ## Copyright (C) 2007 Lukas Petrovicky ## Julien Pivotto ## Copyright (C) 2007-2008 Brendan Taylor ## Stephan Erb ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import os import time from gi.repository import Gtk from gi.repository import Gio from gi.repository import GdkPixbuf from gi.repository import Pango from gi.repository import GLib from gajim import gtkgui_helpers from gajim import gui_menu_builder from gajim import message_control from gajim import dialogs from gajim.common import app from gajim.common import helpers from gajim.common import ged from gajim.common import i18n from gajim.common.stanza_session import EncryptedStanzaSession, ArchivingStanzaSession from gajim.common.contacts import GC_Contact from gajim.common.logger import KindConstant from nbxmpp.protocol import NS_XHTML, NS_XHTML_IM, NS_FILE, NS_MUC from nbxmpp.protocol import NS_JINGLE_RTP_AUDIO, NS_JINGLE_RTP_VIDEO from nbxmpp.protocol import NS_JINGLE_ICE_UDP, NS_JINGLE_FILE_TRANSFER_5 from nbxmpp.protocol import NS_CHATSTATES from gajim.common.connection_handlers_events import MessageOutgoingEvent from gajim.common.const import AvatarSize from gajim.command_system.implementation.hosts import ChatCommands from gajim.chat_control_base import ChatControlBase ################################################################################ class ChatControl(ChatControlBase): """ A control for standard 1-1 chat """ ( JINGLE_STATE_NULL, JINGLE_STATE_CONNECTING, JINGLE_STATE_CONNECTION_RECEIVED, JINGLE_STATE_CONNECTED, JINGLE_STATE_ERROR ) = range(5) TYPE_ID = message_control.TYPE_CHAT old_msg_kind = None # last kind of the printed message # Set a command host to bound to. Every command given through a chat will be # processed with this command host. COMMAND_HOST = ChatCommands def __init__(self, parent_win, contact, acct, session, resource=None): ChatControlBase.__init__(self, self.TYPE_ID, parent_win, 'chat_control', contact, acct, resource) self.last_recv_message_id = None self.last_recv_message_marks = None self.last_message_timestamp = None self._formattings_button = self.xml.get_object('formattings_button') self.emoticons_button = self.xml.get_object('emoticons_button') self.toggle_emoticons() self.widget_set_visible(self.xml.get_object('banner_eventbox'), app.config.get('hide_chat_banner')) self.authentication_button = self.xml.get_object( 'authentication_button') id_ = self.authentication_button.connect('clicked', self._on_authentication_button_clicked) self.handlers[id_] = self.authentication_button self.sendfile_button = self.xml.get_object('sendfile_button') self.sendfile_button.set_action_name('win.send-file-' + \ self.control_id) # Add lock image to show chat encryption self.lock_image = self.xml.get_object('lock_image') # Menu for the HeaderBar self.control_menu = gui_menu_builder.get_singlechat_menu( self.control_id) settings_menu = self.xml.get_object('settings_menu') settings_menu.set_menu_model(self.control_menu) self._audio_banner_image = self.xml.get_object('audio_banner_image') self._video_banner_image = self.xml.get_object('video_banner_image') self.audio_sid = None self.audio_state = self.JINGLE_STATE_NULL self.audio_available = False self.video_sid = None self.video_state = self.JINGLE_STATE_NULL self.video_available = False self.update_toolbar() self._pep_images = {} self._pep_images['mood'] = self.xml.get_object('mood_image') self._pep_images['activity'] = self.xml.get_object('activity_image') self._pep_images['tune'] = self.xml.get_object('tune_image') self._pep_images['location'] = self.xml.get_object('location_image') self.update_all_pep_types() self.show_avatar() # Hook up signals message_tv_buffer = self.msg_textview.get_buffer() id_ = message_tv_buffer.connect('changed', self._on_message_tv_buffer_changed) self.handlers[id_] = message_tv_buffer widget = self.xml.get_object('avatar_eventbox') widget.set_property('height-request', AvatarSize.CHAT) id_ = widget.connect('button-press-event', self.on_avatar_eventbox_button_press_event) self.handlers[id_] = widget widget = self.xml.get_object('location_eventbox') id_ = widget.connect('button-release-event', self.on_location_eventbox_button_release_event) self.handlers[id_] = widget id_ = widget.connect('enter-notify-event', self.on_location_eventbox_enter_notify_event) self.handlers[id_] = widget id_ = widget.connect('leave-notify-event', self.on_location_eventbox_leave_notify_event) self.handlers[id_] = widget for key in ('1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '0', '#'): widget = self.xml.get_object(key + '_button') id_ = widget.connect('pressed', self.on_num_button_pressed, key) self.handlers[id_] = widget id_ = widget.connect('released', self.on_num_button_released) self.handlers[id_] = widget self.dtmf_window = self.xml.get_object('dtmf_window') self.dtmf_window.get_child().set_direction(Gtk.TextDirection.LTR) id_ = self.dtmf_window.connect('focus-out-event', self.on_dtmf_window_focus_out_event) self.handlers[id_] = self.dtmf_window widget = self.xml.get_object('dtmf_button') id_ = widget.connect('clicked', self.on_dtmf_button_clicked) self.handlers[id_] = widget widget = self.xml.get_object('mic_hscale') id_ = widget.connect('value_changed', self.on_mic_hscale_value_changed) self.handlers[id_] = widget widget = self.xml.get_object('sound_hscale') id_ = widget.connect('value_changed', self.on_sound_hscale_value_changed) self.handlers[id_] = widget self.info_bar = Gtk.InfoBar() content_area = self.info_bar.get_content_area() self.info_bar_label = Gtk.Label() self.info_bar_label.set_use_markup(True) self.info_bar_label.set_halign(Gtk.Align.START) self.info_bar_label.set_valign(Gtk.Align.START) content_area.add(self.info_bar_label) self.info_bar.set_no_show_all(True) widget = self.xml.get_object('vbox2') widget.pack_start(self.info_bar, False, True, 5) widget.reorder_child(self.info_bar, 1) # List of waiting infobar messages self.info_bar_queue = [] self.subscribe_events() if not session: # Don't use previous session if we want to a specific resource # and it's not the same if not resource: resource = contact.resource session = app.connections[self.account].find_controlless_session( self.contact.jid, resource) self.setup_seclabel(self.xml.get_object('label_selector')) if session: session.control = self self.session = session if session.enable_encryption: self.print_esession_details() # Enable encryption if needed self.no_autonegotiation = False self.add_actions() self.update_ui() self.set_lock_image() self.encryption_menu = self.xml.get_object('encryption_menu') self.encryption_menu.set_menu_model( gui_menu_builder.get_encryption_menu(self.control_id, self.type_id)) self.set_encryption_menu_icon() # restore previous conversation self.restore_conversation() self.msg_textview.grab_focus() app.ged.register_event_handler('pep-received', ged.GUI1, self._nec_pep_received) if self.TYPE_ID == message_control.TYPE_CHAT: # Dont connect this when PrivateChatControl is used app.ged.register_event_handler('update-roster-avatar', ged.GUI1, self._nec_update_avatar) app.ged.register_event_handler('failed-decrypt', ged.GUI1, self._nec_failed_decrypt) app.ged.register_event_handler('chatstate-received', ged.GUI1, self._nec_chatstate_received) app.ged.register_event_handler('caps-received', ged.GUI1, self._nec_caps_received) app.ged.register_event_handler('message-sent', ged.OUT_POSTCORE, self._message_sent) app.ged.register_event_handler( 'mam-decrypted-message-received', ged.GUI1, self._nec_mam_decrypted_message_received) # PluginSystem: adding GUI extension point for this ChatControl # instance object app.plugin_manager.gui_extension_point('chat_control', self) self.update_actions() def add_actions(self): super().add_actions() actions = [ ('invite-contacts-', self._on_invite_contacts), ('add-to-roster-', self._on_add_to_roster), ('information-', self._on_information), ] for action in actions: action_name, func = action act = Gio.SimpleAction.new(action_name + self.control_id, None) act.connect("activate", func) self.parent_win.window.add_action(act) act = Gio.SimpleAction.new_stateful( 'toggle-audio-' + self.control_id, None, GLib.Variant.new_boolean(False)) act.connect('change-state', self._on_audio) self.parent_win.window.add_action(act) act = Gio.SimpleAction.new_stateful( 'toggle-video-' + self.control_id, None, GLib.Variant.new_boolean(False)) act.connect('change-state', self._on_video) self.parent_win.window.add_action(act) def update_actions(self): win = self.parent_win.window online = app.account_is_connected(self.account) # Add to roster if not isinstance(self.contact, GC_Contact) \ and _('Not in Roster') in self.contact.groups and \ app.connections[self.account].roster_supported and online: win.lookup_action( 'add-to-roster-' + self.control_id).set_enabled(True) else: win.lookup_action( 'add-to-roster-' + self.control_id).set_enabled(False) # Audio win.lookup_action('toggle-audio-' + self.control_id).set_enabled( online and self.audio_available) # Video win.lookup_action('toggle-video-' + self.control_id).set_enabled( online and self.video_available) # Send file (HTTP File Upload) httpupload = win.lookup_action( 'send-file-httpupload-' + self.control_id) httpupload.set_enabled( online and app.connections[self.account].httpupload) # Send file (Jingle) jingle_conditions = ( (self.contact.supports(NS_FILE) or self.contact.supports(NS_JINGLE_FILE_TRANSFER_5)) and self.contact.show != 'offline') jingle = win.lookup_action('send-file-jingle-' + self.control_id) jingle.set_enabled(online and jingle_conditions) # Send file win.lookup_action( 'send-file-' + self.control_id).set_enabled( jingle.get_enabled() or httpupload.get_enabled()) # Set File Transfer Button tooltip ft_pref = app.config.get_per('accounts', self.account, 'filetransfer_preference') tooltip_text = None if httpupload.get_enabled() and jingle.get_enabled(): if ft_pref == 'httpupload': tooltip_text = _('HTTP File Upload') else: tooltip_text = _('Jingle File Transfer') elif httpupload.get_enabled(): tooltip_text = _('HTTP File Upload') elif jingle.get_enabled(): tooltip_text = _('Jingle File Transfer') elif online: tooltip_text = _('No File Transfer available') self.sendfile_button.set_tooltip_text(tooltip_text) # Convert to GC if app.config.get_per('accounts', self.account, 'is_zeroconf'): win.lookup_action( 'invite-contacts-' + self.control_id).set_enabled(False) else: if self.contact.supports(NS_MUC) and online: win.lookup_action( 'invite-contacts-' + self.control_id).set_enabled(True) else: win.lookup_action( 'invite-contacts-' + self.control_id).set_enabled(False) # Information win.lookup_action( 'information-' + self.control_id).set_enabled(online) def _on_add_to_roster(self, action, param): dialogs.AddNewContactWindow(self.account, self.contact.jid) def _on_information(self, action, param): app.interface.roster.on_info(None, self.contact, self.account) def _on_invite_contacts(self, action, param): """ User wants to invite some friends to chat """ dialogs.TransformChatToMUC(self.account, [self.contact.jid]) def _on_audio(self, action, param): action.set_state(param) state = param.get_boolean() self.on_jingle_button_toggled(state, 'audio') def _on_video(self, action, param): action.set_state(param) state = param.get_boolean() self.on_jingle_button_toggled(state, 'video') def subscribe_events(self): """ Register listeners to the events class """ app.events.event_added_subscribe(self.on_event_added) app.events.event_removed_subscribe(self.on_event_removed) def unsubscribe_events(self): """ Unregister listeners to the events class """ app.events.event_added_unsubscribe(self.on_event_added) app.events.event_removed_unsubscribe(self.on_event_removed) def _update_toolbar(self): # Formatting # TODO: find out what encryption allows for xhtml and which not if self.contact.supports(NS_XHTML_IM): self._formattings_button.set_sensitive(True) self._formattings_button.set_tooltip_text(_( 'Show a list of formattings')) else: self._formattings_button.set_sensitive(False) if self.contact.supports(NS_XHTML_IM): self._formattings_button.set_tooltip_text(_('Formatting is not ' 'available so long as GPG is active')) else: self._formattings_button.set_tooltip_text(_('This contact does ' 'not support HTML')) # Jingle detection if self.contact.supports(NS_JINGLE_ICE_UDP) and \ app.HAVE_FARSTREAM and self.contact.resource: self.audio_available = self.contact.supports(NS_JINGLE_RTP_AUDIO) self.video_available = self.contact.supports(NS_JINGLE_RTP_VIDEO) else: if self.video_available or self.audio_available: self.stop_jingle() self.video_available = False self.audio_available = False def update_all_pep_types(self): for pep_type in self._pep_images: self.update_pep(pep_type) def update_pep(self, pep_type): if isinstance(self.contact, GC_Contact): return if pep_type not in self._pep_images: return pep = self.contact.pep img = self._pep_images[pep_type] if pep_type in pep: img.set_from_pixbuf(gtkgui_helpers.get_pep_as_pixbuf(pep[pep_type])) img.set_tooltip_markup(pep[pep_type].asMarkupText()) img.show() else: img.hide() def _nec_pep_received(self, obj): if obj.conn.name != self.account: return if obj.jid != self.contact.jid: return if obj.pep_type == 'nickname': self.update_ui() self.parent_win.redraw_tab(self) self.parent_win.show_title() else: self.update_pep(obj.pep_type) def _update_jingle(self, jingle_type): if jingle_type not in ('audio', 'video'): return banner_image = getattr(self, '_' + jingle_type + '_banner_image') state = getattr(self, jingle_type + '_state') if state == self.JINGLE_STATE_NULL: banner_image.hide() else: banner_image.show() if state == self.JINGLE_STATE_CONNECTING: banner_image.set_from_icon_name( Gtk.STOCK_CONVERT, Gtk.IconSize.MENU) elif state == self.JINGLE_STATE_CONNECTION_RECEIVED: banner_image.set_from_icon_name( "network-workgroup", Gtk.IconSize.MENU) elif state == self.JINGLE_STATE_CONNECTED: banner_image.set_from_icon_name( Gtk.STOCK_CONNECT, Gtk.IconSize.MENU) elif state == self.JINGLE_STATE_ERROR: banner_image.set_from_icon_name( "dialog-warning", Gtk.IconSize.MENU) self.update_toolbar() def update_audio(self): self._update_jingle('audio') hbox = self.xml.get_object('audio_buttons_hbox') if self.audio_state == self.JINGLE_STATE_CONNECTED: # Set volume from config input_vol = app.config.get('audio_input_volume') output_vol = app.config.get('audio_output_volume') input_vol = max(min(input_vol, 100), 0) output_vol = max(min(output_vol, 100), 0) self.xml.get_object('mic_hscale').set_value(input_vol) self.xml.get_object('sound_hscale').set_value(output_vol) # Show vbox hbox.set_no_show_all(False) hbox.show_all() elif not self.audio_sid: hbox.set_no_show_all(True) hbox.hide() def update_video(self): self._update_jingle('video') def change_resource(self, resource): old_full_jid = self.get_full_jid() self.resource = resource new_full_jid = self.get_full_jid() # update app.last_message_time if old_full_jid in app.last_message_time[self.account]: app.last_message_time[self.account][new_full_jid] = \ app.last_message_time[self.account][old_full_jid] # update events app.events.change_jid(self.account, old_full_jid, new_full_jid) # update MessageWindow._controls self.parent_win.change_jid(self.account, old_full_jid, new_full_jid) def stop_jingle(self, sid=None, reason=None): if self.audio_sid and sid in (self.audio_sid, None): self.close_jingle_content('audio') if self.video_sid and sid in (self.video_sid, None): self.close_jingle_content('video') def _set_jingle_state(self, jingle_type, state, sid=None, reason=None): if jingle_type not in ('audio', 'video'): return if state in ('connecting', 'connected', 'stop', 'error') and reason: str = _('%(type)s state : %(state)s, reason: %(reason)s') % { 'type': jingle_type.capitalize(), 'state': state, 'reason': reason} self.print_conversation(str, 'info') states = {'connecting': self.JINGLE_STATE_CONNECTING, 'connection_received': self.JINGLE_STATE_CONNECTION_RECEIVED, 'connected': self.JINGLE_STATE_CONNECTED, 'stop': self.JINGLE_STATE_NULL, 'error': self.JINGLE_STATE_ERROR} jingle_state = states[state] if getattr(self, jingle_type + '_state') == jingle_state or state == 'error': return if state == 'stop' and getattr(self, jingle_type + '_sid') not in (None, sid): return setattr(self, jingle_type + '_state', jingle_state) if jingle_state == self.JINGLE_STATE_NULL: setattr(self, jingle_type + '_sid', None) if state in ('connection_received', 'connecting'): setattr(self, jingle_type + '_sid', sid) getattr(self, '_' + jingle_type + '_button').set_active(jingle_state != self.JINGLE_STATE_NULL) getattr(self, 'update_' + jingle_type)() def set_audio_state(self, state, sid=None, reason=None): self._set_jingle_state('audio', state, sid=sid, reason=reason) def set_video_state(self, state, sid=None, reason=None): self._set_jingle_state('video', state, sid=sid, reason=reason) def _get_audio_content(self): session = app.connections[self.account].get_jingle_session( self.contact.get_full_jid(), self.audio_sid) return session.get_content('audio') def on_num_button_pressed(self, widget, num): self._get_audio_content()._start_dtmf(num) def on_num_button_released(self, released): self._get_audio_content()._stop_dtmf() def on_dtmf_button_clicked(self, widget): self.dtmf_window.show_all() def on_dtmf_window_focus_out_event(self, widget, event): self.dtmf_window.hide() def on_mic_hscale_value_changed(self, widget, value): self._get_audio_content().set_mic_volume(value / 100) # Save volume to config app.config.set('audio_input_volume', value) def on_sound_hscale_value_changed(self, widget, value): self._get_audio_content().set_out_volume(value / 100) # Save volume to config app.config.set('audio_output_volume', value) def on_avatar_eventbox_button_press_event(self, widget, event): """ If right-clicked, show popup """ if event.button == 3: # right click menu = Gtk.Menu() menuitem = Gtk.MenuItem.new_with_mnemonic(_('Save _As')) if self.TYPE_ID == message_control.TYPE_CHAT: sha = app.contacts.get_avatar_sha( self.account, self.contact.jid) name = self.contact.get_shown_name() else: sha = self.gc_contact.avatar_sha name = self.gc_contact.get_shown_name() id_ = menuitem.connect('activate', gtkgui_helpers.on_avatar_save_as_menuitem_activate, sha, name) self.handlers[id_] = menuitem menu.append(menuitem) menu.show_all() menu.connect('selection-done', lambda w: w.destroy()) # show the menu menu.show_all() menu.attach_to_widget(widget, None) menu.popup(None, None, None, None, event.button, event.time) return True def on_location_eventbox_button_release_event(self, widget, event): if 'location' in self.contact.pep: location = self.contact.pep['location']._pep_specific_data if ('lat' in location) and ('lon' in location): uri = 'https://www.openstreetmap.org/?' + \ 'mlat=%(lat)s&mlon=%(lon)s&zoom=16' % {'lat': location['lat'], 'lon': location['lon']} helpers.launch_browser_mailer('url', uri) def on_location_eventbox_leave_notify_event(self, widget, event): """ Just moved the mouse so show the cursor """ cursor = gtkgui_helpers.get_cursor('LEFT_PTR') self.parent_win.window.get_window().set_cursor(cursor) def on_location_eventbox_enter_notify_event(self, widget, event): cursor = gtkgui_helpers.get_cursor('HAND2') self.parent_win.window.get_window().set_cursor(cursor) def update_ui(self): # The name banner is drawn here ChatControlBase.update_ui(self) self.update_toolbar() def _update_banner_state_image(self): contact = app.contacts.get_contact_with_highest_priority(self.account, self.contact.jid) if not contact or self.resource: # For transient contacts contact = self.contact show = contact.show jid = contact.jid # Set banner image icon = gtkgui_helpers.get_iconset_name_for(show) banner_status_img = self.xml.get_object('banner_status_image') banner_status_img.set_from_icon_name(icon, Gtk.IconSize.DND) def draw_banner_text(self): """ Draw the text in the fat line at the top of the window that houses the name, jid """ contact = self.contact jid = contact.jid banner_name_label = self.xml.get_object('banner_name_label') name = contact.get_shown_name() if self.resource: name += '/' + self.resource if self.TYPE_ID == message_control.TYPE_PM: name = i18n.direction_mark + _( '%(nickname)s from group chat %(room_name)s') % \ {'nickname': name, 'room_name': self.room_name} name = i18n.direction_mark + GLib.markup_escape_text(name) # We know our contacts nick, but if another contact has the same nick # in another account we need to also display the account. # except if we are talking to two different resources of the same contact acct_info = '' for account in app.contacts.get_accounts(): if account == self.account: continue if acct_info: # We already found a contact with same nick break for jid in app.contacts.get_jid_list(account): other_contact_ = \ app.contacts.get_first_contact_from_jid(account, jid) if other_contact_.get_shown_name() == \ self.contact.get_shown_name(): acct_info = i18n.direction_mark + ' (%s)' % \ GLib.markup_escape_text(self.account) break status = contact.status if status is not None: banner_name_label.set_ellipsize(Pango.EllipsizeMode.END) self.banner_status_label.set_ellipsize(Pango.EllipsizeMode.END) status_reduced = helpers.reduce_chars_newlines(status, max_lines=1) else: status_reduced = '' status_escaped = GLib.markup_escape_text(status_reduced) font_attrs, font_attrs_small = self.get_font_attrs() st = app.config.get('displayed_chat_state_notifications') cs = contact.chatstate if cs and st in ('composing_only', 'all'): if contact.show == 'offline': chatstate = '' elif st == 'all' or cs == 'composing': chatstate = helpers.get_uf_chatstate(cs) else: chatstate = '' label_text = '%s%s %s' \ % (font_attrs, name, font_attrs_small, acct_info, chatstate) if acct_info: acct_info = i18n.direction_mark + ' ' + acct_info label_tooltip = '%s%s %s' % (name, acct_info, chatstate) else: # weight="heavy" size="x-large" label_text = '%s%s' % \ (font_attrs, name, font_attrs_small, acct_info) if acct_info: acct_info = i18n.direction_mark + ' ' + acct_info label_tooltip = '%s%s' % (name, acct_info) if status_escaped: status_text = self.urlfinder.sub(self.make_href, status_escaped) status_text = '%s' % (font_attrs_small, status_text) self.banner_status_label.set_tooltip_text(status) self.banner_status_label.set_no_show_all(False) self.banner_status_label.show() else: status_text = '' self.banner_status_label.hide() self.banner_status_label.set_no_show_all(True) self.banner_status_label.set_markup(status_text) # setup the label that holds name and jid banner_name_label.set_markup(label_text) banner_name_label.set_tooltip_text(label_tooltip) def close_jingle_content(self, jingle_type): sid = getattr(self, jingle_type + '_sid') if not sid: return setattr(self, jingle_type + '_sid', None) setattr(self, jingle_type + '_state', self.JINGLE_STATE_NULL) session = app.connections[self.account].get_jingle_session( self.contact.get_full_jid(), sid) if session: content = session.get_content(jingle_type) if content: session.remove_content(content.creator, content.name) getattr(self, '_' + jingle_type + '_button').set_active(False) getattr(self, 'update_' + jingle_type)() def on_jingle_button_toggled(self, state, jingle_type): img_name = 'gajim-%s_%s' % ({'audio': 'mic', 'video': 'cam'}[jingle_type], {True: 'active', False: 'inactive'}[state]) path_to_img = gtkgui_helpers.get_icon_path(img_name) if state: if getattr(self, jingle_type + '_state') == \ self.JINGLE_STATE_NULL: if jingle_type == 'video': video_hbox = self.xml.get_object('video_hbox') video_hbox.set_no_show_all(False) if app.config.get('video_see_self'): fixed = self.xml.get_object('outgoing_fixed') fixed.set_no_show_all(False) video_hbox.show_all() out_da = self.xml.get_object('outgoing_drawingarea') out_da.realize() if os.name == 'nt': out_xid = out_da.get_window().handle else: out_xid = out_da.get_window().get_xid() else: out_xid = None video_hbox.show_all() in_da = self.xml.get_object('incoming_drawingarea') in_da.realize() in_xid = in_da.get_window().get_xid() sid = app.connections[self.account].start_video( self.contact.get_full_jid(), in_xid, out_xid) else: sid = getattr(app.connections[self.account], 'start_' + jingle_type)(self.contact.get_full_jid()) getattr(self, 'set_' + jingle_type + '_state')('connecting', sid) else: video_hbox = self.xml.get_object('video_hbox') video_hbox.set_no_show_all(True) video_hbox.hide() fixed = self.xml.get_object('outgoing_fixed') fixed.set_no_show_all(True) self.close_jingle_content(jingle_type) img = getattr(self, '_' + jingle_type + '_button').get_property('image') img.set_from_file(path_to_img) def set_lock_image(self): loggable = self.session and self.session.is_loggable() encryption_state = {'visible': self.encryption is not None, 'enc_type': self.encryption, 'authenticated': False} if self.encryption: app.plugin_manager.extension_point( 'encryption_state' + self.encryption, self, encryption_state) self._show_lock_image(**encryption_state) def _show_lock_image(self, visible, enc_type='', authenticated=False): """ Set lock icon visibility and create tooltip """ if authenticated: authenticated_string = _('and authenticated') self.lock_image.set_from_icon_name( 'security-high', Gtk.IconSize.MENU) else: authenticated_string = _('and NOT authenticated') self.lock_image.set_from_icon_name( 'security-low', Gtk.IconSize.MENU) tooltip = _('%(type)s encryption is active %(authenticated)s.') % {'type': enc_type, 'authenticated': authenticated_string} self.authentication_button.set_tooltip_text(tooltip) self.widget_set_visible(self.authentication_button, not visible) context = self.msg_scrolledwindow.get_style_context() self.lock_image.set_sensitive(visible) def _on_authentication_button_clicked(self, widget): if self.encryption: app.plugin_manager.extension_point( 'encryption_dialog' + self.encryption, self) def _nec_mam_decrypted_message_received(self, obj): if obj.conn.name != self.account: return if obj.with_ != self.contact.jid: return kind = '' # incoming if obj.kind == KindConstant.CHAT_MSG_SENT: kind = 'outgoing' self.print_conversation(obj.msgtxt, kind, tim=obj.timestamp, encrypted=obj.encrypted, correct_id=obj.correct_id, msg_stanza_id=obj.message_id, additional_data=obj.additional_data) def _message_sent(self, obj): if obj.conn.name != self.account: return if obj.jid != self.contact.jid: return if not obj.message: return self.last_sent_msg = obj.stanza_id id_ = obj.msg_iq.getID() xep0184_id = None if self.contact.jid != app.get_jid_from_account(self.account): if app.config.get_per('accounts', self.account, 'request_receipt'): xep0184_id = id_ if obj.label: displaymarking = obj.label.getTag('displaymarking') else: displaymarking = None if self.correcting: self.correcting = False gtkgui_helpers.remove_css_class( self.msg_textview, 'msgcorrectingcolor') self.print_conversation(obj.message, self.contact.jid, tim=obj.timestamp, encrypted=obj.encrypted, xep0184_id=xep0184_id, xhtml=obj.xhtml, displaymarking=displaymarking, msg_stanza_id=id_, correct_id=obj.correct_id, additional_data=obj.additional_data) def send_message(self, message, keyID='', chatstate=None, xhtml=None, process_commands=True, attention=False): """ Send a message to contact """ if self.encryption: self.sendmessage = True app.plugin_manager.extension_point( 'send_message' + self.encryption, self) if not self.sendmessage: return message = helpers.remove_invalid_xml_chars(message) if message in ('', None, '\n'): return None contact = self.contact keyID = contact.keyID chatstates_on = app.config.get('outgoing_chat_state_notifications') != \ 'disabled' chatstate_to_send = None if contact is not None: if contact.supports(NS_CHATSTATES): # send active chatstate on every message (as XEP says) chatstate_to_send = 'active' contact.our_chatstate = 'active' self._schedule_activity_timers() ChatControlBase.send_message(self, message, keyID, type_='chat', chatstate=chatstate_to_send, xhtml=xhtml, process_commands=process_commands, attention=attention) def on_cancel_session_negotiation(self): msg = _('Session negotiation cancelled') ChatControlBase.print_conversation_line(self, msg, 'status', '', None) def print_archiving_session_details(self): """ Print esession settings to textview """ archiving = bool(self.session) and isinstance(self.session, ArchivingStanzaSession) and self.session.archiving if archiving: msg = _('This session WILL be archived on server') else: msg = _('This session WILL NOT be archived on server') ChatControlBase.print_conversation_line(self, msg, 'status', '', None) def print_esession_details(self): """ Print esession settings to textview """ e2e_is_active = bool(self.session) and self.session.enable_encryption if e2e_is_active: msg = _('This session is encrypted') if self.session.is_loggable(): msg += _(' and WILL be logged') else: msg += _(' and WILL NOT be logged') ChatControlBase.print_conversation_line(self, msg, 'status', '', None) if not self.session.verified_identity: ChatControlBase.print_conversation_line(self, _("Remote contact's identity not verified. Click the shield button for more details."), 'status', '', None) else: msg = _('E2E encryption disabled') ChatControlBase.print_conversation_line(self, msg, 'status', '', None) self._show_lock_image(e2e_is_active, 'E2E', self.session and self.session.verified_identity) def print_session_details(self, old_session=None): if isinstance(self.session, EncryptedStanzaSession) or \ (old_session and isinstance(old_session, EncryptedStanzaSession)): self.print_esession_details() elif isinstance(self.session, ArchivingStanzaSession): self.print_archiving_session_details() def get_our_nick(self): return app.nicks[self.account] def print_conversation(self, text, frm='', tim=None, encrypted=None, subject=None, xhtml=None, simple=False, xep0184_id=None, displaymarking=None, msg_log_id=None, correct_id=None, msg_stanza_id=None, additional_data=None): """ Print a line in the conversation If frm is set to status: it's a status message. if frm is set to error: it's an error message. The difference between status and error is mainly that with error, msg count as a new message (in systray and in control). If frm is set to info: it's a information message. If frm is set to print_queue: it is incomming from queue. If frm is set to another value: it's an outgoing message. If frm is not set: it's an incomming message. """ contact = self.contact if additional_data is None: additional_data = {} if frm == 'status': if not app.config.get('print_status_in_chats'): return kind = 'status' name = '' elif frm == 'error': kind = 'error' name = '' elif frm == 'info': kind = 'info' name = '' else: if not frm: kind = 'incoming' name = contact.get_shown_name() elif frm == 'print_queue': # incoming message, but do not update time kind = 'incoming_queue' name = contact.get_shown_name() else: kind = 'outgoing' name = self.get_our_nick() if not xhtml and not encrypted and \ app.config.get('rst_formatting_outgoing_messages'): from gajim.common.rst_xhtml_generator import create_xhtml xhtml = create_xhtml(text) if xhtml: xhtml = '%s' % (NS_XHTML, xhtml) ChatControlBase.print_conversation_line(self, text, kind, name, tim, subject=subject, old_kind=self.old_msg_kind, xhtml=xhtml, simple=simple, xep0184_id=xep0184_id, displaymarking=displaymarking, msg_log_id=msg_log_id, msg_stanza_id=msg_stanza_id, correct_id=correct_id, additional_data=additional_data, encrypted=encrypted) if text.startswith('/me ') or text.startswith('/me\n'): self.old_msg_kind = None else: self.old_msg_kind = kind def get_tab_label(self): unread = '' if self.resource: jid = self.contact.get_full_jid() else: jid = self.contact.jid num_unread = len(app.events.get_events(self.account, jid, ['printed_' + self.type_id, self.type_id])) if num_unread == 1 and not app.config.get('show_unread_tab_icon'): unread = '*' elif num_unread > 1: unread = '[' + str(num_unread) + ']' name = self.contact.get_shown_name() if self.resource: name += '/' + self.resource label_str = GLib.markup_escape_text(name) if num_unread: # if unread, text in the label becomes bold label_str = '' + unread + label_str + '' return label_str def get_tab_image(self, count_unread=True): if self.resource: jid = self.contact.get_full_jid() else: jid = self.contact.jid if app.config.get('show_avatar_in_tabs'): scale = self.parent_win.window.get_scale_factor() surface = app.contacts.get_avatar( self.account, jid, AvatarSize.TAB, scale) if surface is not None: return surface if count_unread: num_unread = len(app.events.get_events(self.account, jid, ['printed_' + self.type_id, self.type_id])) else: num_unread = 0 # Set tab image (always 16x16); unread messages show the 'event' image tab_img = None if num_unread and app.config.get('show_unread_tab_icon'): img_16 = app.interface.roster.get_appropriate_state_images( self.contact.jid, icon_name='event') tab_img = img_16['event'] else: contact = app.contacts.get_contact_with_highest_priority( self.account, self.contact.jid) if not contact or self.resource: # For transient contacts contact = self.contact img_16 = app.interface.roster.get_appropriate_state_images( self.contact.jid, icon_name=contact.show) tab_img = img_16[contact.show] return tab_img def prepare_context_menu(self, hide_buttonbar_items=False): """ Set compact view menuitem active state sets active and sensitivity state for history_menuitem (False for tranasports) and file_transfer_menuitem and hide()/show() for add_to_roster_menuitem """ if app.jid_is_transport(self.contact.jid): menu = gui_menu_builder.get_transport_menu(self.contact, self.account) else: menu = gui_menu_builder.get_contact_menu(self.contact, self.account, use_multiple_contacts=False, show_start_chat=False, show_encryption=True, control=self, show_buttonbar_items=not hide_buttonbar_items) return menu def send_chatstate(self, state, contact=None): """ Send OUR chatstate as STANDLONE chat state message (eg. no body) to contact only if new chatstate is different from the previous one if jid is not specified, send to active tab """ # JEP 85 does not allow resending the same chatstate # this function checks for that and just returns so it's safe to call it # with same state. # This functions also checks for violation in state transitions # and raises RuntimeException with appropriate message # more on that http://xmpp.org/extensions/xep-0085.html#statechart # do not send if we have chat state notifications disabled # that means we won't reply to the from other peer # so we do not broadcast jep85 capabalities chatstate_setting = app.config.get('outgoing_chat_state_notifications') if chatstate_setting == 'disabled': return # Dont leak presence to contacts # which are not allowed to see our status if contact and contact.sub in ('to', 'none'): return if self.contact.jid == app.get_jid_from_account(self.account): return elif chatstate_setting == 'composing_only' and state != 'active' and\ state != 'composing': return if contact is None: contact = self.parent_win.get_active_contact() if contact is None: # contact was from pm in MUC, and left the room so contact is None # so we cannot send chatstate anymore return # Don't send chatstates to offline contacts if contact.show == 'offline': return if not contact.supports(NS_CHATSTATES): return if contact.our_chatstate == False: return # if the new state we wanna send (state) equals # the current state (contact.our_chatstate) then return if contact.our_chatstate == state: return # if wel're inactive prevent composing (XEP violation) if contact.our_chatstate == 'inactive' and state == 'composing': # go active before app.log('chatstates').info('%-10s - %s', 'active', self.contact.jid) app.nec.push_outgoing_event(MessageOutgoingEvent(None, account=self.account, jid=self.contact.jid, chatstate='active', control=self)) contact.our_chatstate = 'active' self.reset_kbd_mouse_timeout_vars() app.log('chatstates').info('%-10s - %s', state, self.contact.jid) app.nec.push_outgoing_event(MessageOutgoingEvent(None, account=self.account, jid=self.contact.jid, chatstate=state, control=self)) contact.our_chatstate = state if state == 'active': self.reset_kbd_mouse_timeout_vars() def shutdown(self): # PluginSystem: removing GUI extension points connected with ChatControl # instance object app.plugin_manager.remove_gui_extension_point('chat_control', self) app.ged.remove_event_handler('pep-received', ged.GUI1, self._nec_pep_received) if self.TYPE_ID == message_control.TYPE_CHAT: app.ged.remove_event_handler('update-roster-avatar', ged.GUI1, self._nec_update_avatar) app.ged.remove_event_handler('failed-decrypt', ged.GUI1, self._nec_failed_decrypt) app.ged.remove_event_handler('chatstate-received', ged.GUI1, self._nec_chatstate_received) app.ged.remove_event_handler('caps-received', ged.GUI1, self._nec_caps_received) app.ged.remove_event_handler('message-sent', ged.OUT_POSTCORE, self._message_sent) self.unsubscribe_events() # Send 'gone' chatstate self.send_chatstate('gone', self.contact) self.contact.chatstate = None self.contact.our_chatstate = None for jingle_type in ('audio', 'video'): self.close_jingle_content(jingle_type) # disconnect self from session if self.session: self.session.control = None # Clean events app.events.remove_events(self.account, self.get_full_jid(), types=['printed_' + self.type_id, self.type_id]) # Remove contact instance if contact has been removed key = (self.contact.jid, self.account) roster = app.interface.roster if key in roster.contacts_to_be_removed.keys() and \ not roster.contact_has_pending_roster_events(self.contact, self.account): backend = roster.contacts_to_be_removed[key]['backend'] del roster.contacts_to_be_removed[key] roster.remove_contact(self.contact.jid, self.account, force=True, backend=backend) # remove all register handlers on widgets, created by self.xml # to prevent circular references among objects for i in list(self.handlers.keys()): if self.handlers[i].handler_is_connected(i): self.handlers[i].disconnect(i) del self.handlers[i] self.conv_textview.del_handlers() self.msg_textview.destroy() # PluginSystem: calling shutdown of super class (ChatControlBase) to let # it remove it's GUI extension points super(ChatControl, self).shutdown() def minimizable(self): return False def safe_shutdown(self): return False def allow_shutdown(self, method, on_yes, on_no, on_minimize): if time.time() - app.last_message_time[self.account]\ [self.get_full_jid()] < 2: # 2 seconds def on_ok(): on_yes(self) def on_cancel(): on_no(self) dialogs.ConfirmationDialog( #%s is being replaced in the code with JID _('You just received a new message from "%s"') % \ self.contact.jid, _('If you close this tab and you have history disabled, '\ 'this message will be lost.'), on_response_ok=on_ok, on_response_cancel=on_cancel, transient_for=self.parent_win.window) return on_yes(self) def _nec_chatstate_received(self, obj): """ Handle incoming chatstate that jid SENT TO us """ self.draw_banner_text() # update chatstate in tab for this chat self.parent_win.redraw_tab(self, self.contact.chatstate) def _nec_caps_received(self, obj): if obj.conn.name != self.account: return if self.TYPE_ID == 'chat' and obj.jid != self.contact.jid: return if self.TYPE_ID == 'pm' and obj.fjid != self.contact.jid: return self.update_ui() def _nec_ping_reply(self, obj): if obj.control: if obj.control != self: return else: if self.contact != obj.contact: return self.print_conversation(_('Pong! (%s s.)') % obj.seconds, 'status') def show_avatar(self): if not app.config.get('show_avatar_in_chat'): return scale = self.parent_win.window.get_scale_factor() if self.TYPE_ID == message_control.TYPE_CHAT: surface = app.contacts.get_avatar( self.account, self.contact.jid, AvatarSize.CHAT, scale) else: surface = app.interface.get_avatar( self.gc_contact.avatar_sha, AvatarSize.CHAT, scale) image = self.xml.get_object('avatar_image') if surface is None: image.set_from_icon_name('avatar-default', Gtk.IconSize.DIALOG) else: image.set_from_surface(surface) def _nec_update_avatar(self, obj): if obj.account != self.account: return if obj.jid != self.contact.jid: return self.show_avatar() def _on_drag_data_received(self, widget, context, x, y, selection, target_type, timestamp): if not selection.get_data(): return # get contact info (check for PM = private chat) if self.TYPE_ID == message_control.TYPE_PM: c = self.gc_contact.as_contact() else: c = self.contact if target_type == self.TARGET_TYPE_URI_LIST: # file drag and drop (handled in chat_control_base) self.drag_data_file_transfer(c, selection, self) else: # chat2muc treeview = app.interface.roster.tree model = treeview.get_model() data = selection.get_data() path = treeview.get_selection().get_selected_rows()[1][0] iter_ = model.get_iter(path) type_ = model[iter_][2] if type_ != 'contact': # source is not a contact return dropped_jid = data dropped_transport = app.get_transport_name_from_jid(dropped_jid) c_transport = app.get_transport_name_from_jid(c.jid) if dropped_transport or c_transport: return # transport contacts cannot be invited dialogs.TransformChatToMUC(self.account, [c.jid], [dropped_jid]) def _on_message_tv_buffer_changed(self, textbuffer): super()._on_message_tv_buffer_changed(textbuffer) if textbuffer.get_char_count() and self.encryption: app.plugin_manager.extension_point( 'typing' + self.encryption, self) def restore_conversation(self): jid = self.contact.jid # don't restore lines if it's a transport if app.jid_is_transport(jid): return # number of messages that are in queue and are already logged, we want # to avoid duplication pending = len(app.events.get_events(self.account, jid, ['chat', 'pm'])) if self.resource: pending += len(app.events.get_events(self.account, self.contact.get_full_jid(), ['chat', 'pm'])) rows = app.logger.get_last_conversation_lines( self.account, jid, pending) local_old_kind = None self.conv_textview.just_cleared = True for row in rows: # time, kind, message, subject, additional_data msg = row.message additional_data = row.additional_data if not msg: # message is empty, we don't print it continue if row.kind in (KindConstant.CHAT_MSG_SENT, KindConstant.SINGLE_MSG_SENT): kind = 'outgoing' name = self.get_our_nick() elif row.kind in (KindConstant.SINGLE_MSG_RECV, KindConstant.CHAT_MSG_RECV): kind = 'incoming' name = self.contact.get_shown_name() elif row.kind == KindConstant.ERROR: kind = 'status' name = self.contact.get_shown_name() tim = float(row.time) if app.config.get('restored_messages_small'): small_attr = ['small'] else: small_attr = [] xhtml = None if msg.startswith(' ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Nikos Kouremenos ## Travis Shirk ## Copyright (C) 2007 Lukas Petrovicky ## Julien Pivotto ## Copyright (C) 2007-2008 Brendan Taylor ## Stephan Erb ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import os import time from gi.repository import Gtk from gi.repository import Gdk from gi.repository import Pango from gi.repository import GLib from gi.repository import Gio from gajim import gtkgui_helpers from gajim.gtkgui_helpers import Color from gajim import message_control from gajim import dialogs from gajim import history_window from gajim import notify import re from gajim import emoticons from gajim.common import events from gajim.common import app from gajim.common import helpers from gajim.common import ged from gajim.message_control import MessageControl from gajim.conversation_textview import ConversationTextview from gajim.message_textview import MessageTextView from gajim.common.contacts import GC_Contact from gajim.common.connection_handlers_events import MessageOutgoingEvent from gajim.command_system.implementation.middleware import ChatCommandProcessor from gajim.command_system.implementation.middleware import CommandTools # The members of these modules are not referenced directly anywhere in this # module, but still they need to be kept around. Importing them automatically # registers the contained CommandContainers with the command system, thereby # populating the list of available commands. from gajim.command_system.implementation import standard from gajim.command_system.implementation import execute if app.HAVE_SPELL: from gi.repository import Gspell ################################################################################ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): """ A base class containing a banner, ConversationTextview, MessageTextView """ keymap = Gdk.Keymap.get_default() try: keycode_c = keymap.get_entries_for_keyval(Gdk.KEY_c)[1][0].keycode except TypeError: keycode_c = 54 try: keycode_ins = keymap.get_entries_for_keyval(Gdk.KEY_Insert)[1][0].keycode except TypeError: keycode_ins = 118 except IndexError: # There is no KEY_Insert (MacOS) keycode_ins = None def make_href(self, match): url_color = app.config.get('urlmsgcolor') url = match.group() if not '://' in url: url = 'http://' + url return '%s' % (url, url_color, match.group()) def get_font_attrs(self): """ Get pango font attributes for banner from theme settings """ theme = app.config.get('roster_theme') bannerfont = app.config.get_per('themes', theme, 'bannerfont') bannerfontattrs = app.config.get_per('themes', theme, 'bannerfontattrs') if bannerfont: font = Pango.FontDescription(bannerfont) else: font = Pango.FontDescription('Normal') if bannerfontattrs: # B attribute is set by default if 'B' in bannerfontattrs: font.set_weight(Pango.Weight.HEAVY) if 'I' in bannerfontattrs: font.set_style(Pango.Style.ITALIC) font_attrs = 'font_desc="%s"' % font.to_string() # in case there is no font specified we use x-large font size if font.get_size() == 0: font_attrs = '%s size="x-large"' % font_attrs font.set_weight(Pango.Weight.NORMAL) font_attrs_small = 'font_desc="%s" size="small"' % font.to_string() return (font_attrs, font_attrs_small) def get_nb_unread(self): jid = self.contact.jid if self.resource: jid += '/' + self.resource type_ = self.type_id return len(app.events.get_events(self.account, jid, ['printed_' + type_, type_])) def draw_banner(self): """ Draw the fat line at the top of the window that houses the icon, jid, etc Derived types MAY implement this. """ self.draw_banner_text() self._update_banner_state_image() app.plugin_manager.gui_extension_point('chat_control_base_draw_banner', self) def update_toolbar(self): """ update state of buttons in toolbar """ self._update_toolbar() app.plugin_manager.gui_extension_point( 'chat_control_base_update_toolbar', self) def draw_banner_text(self): """ Derived types SHOULD implement this """ pass def update_ui(self): """ Derived types SHOULD implement this """ self.draw_banner() def repaint_themed_widgets(self): """ Derived types MAY implement this """ self.draw_banner() def _update_banner_state_image(self): """ Derived types MAY implement this """ pass def _update_toolbar(self): """ Derived types MAY implement this """ pass def _nec_our_status(self, obj): if self.account != obj.conn.name: return if obj.show == 'offline' or (obj.show == 'invisible' and \ obj.conn.is_zeroconf): self.got_disconnected() else: # Other code rejoins all GCs, so we don't do it here if not self.type_id == message_control.TYPE_GC: self.got_connected() if self.parent_win: self.parent_win.redraw_tab(self) def _nec_ping_sent(self, obj): if self.contact != obj.contact: return self.print_conversation(_('Ping?'), 'status') def _nec_ping_error(self, obj): if self.contact != obj.contact: return self.print_conversation(_('Error.'), 'status') def status_url_clicked(self, widget, url): helpers.launch_browser_mailer('url', url) def setup_seclabel(self, combo): self.seclabel_combo = combo self.seclabel_combo.hide() self.seclabel_combo.set_no_show_all(True) lb = Gtk.ListStore(str) self.seclabel_combo.set_model(lb) cell = Gtk.CellRendererText() cell.set_property('xpad', 5) # padding for status text self.seclabel_combo.pack_start(cell, True) # text to show is in in first column of liststore self.seclabel_combo.add_attribute(cell, 'text', 0) if app.connections[self.account].seclabel_supported: app.connections[self.account].seclabel_catalogue(self.contact.jid, self.on_seclabels_ready) def on_seclabels_ready(self): lb = self.seclabel_combo.get_model() lb.clear() i = 0 sel = 0 catalogue = app.connections[self.account].seclabel_catalogues[ self.contact.jid] for label in catalogue[2]: lb.append([label]) if label == catalogue[3]: sel = i i += 1 self.seclabel_combo.set_active(sel) self.seclabel_combo.set_no_show_all(False) self.seclabel_combo.show_all() def __init__(self, type_id, parent_win, widget_name, contact, acct, resource=None): # Undo needs this variable to know if space has been pressed. # Initialize it to True so empty textview is saved in undo list self.space_pressed = True if resource is None: # We very likely got a contact with a random resource. # This is bad, we need the highest for caps etc. c = app.contacts.get_contact_with_highest_priority(acct, contact.jid) if c and not isinstance(c, GC_Contact): contact = c MessageControl.__init__(self, type_id, parent_win, widget_name, contact, acct, resource=resource) if self.TYPE_ID != message_control.TYPE_GC: # Create banner and connect signals widget = self.xml.get_object('banner_eventbox') id_ = widget.connect('button-press-event', self._on_banner_eventbox_button_press_event) self.handlers[id_] = widget self.urlfinder = re.compile( r"(www\.(?!\.)|[a-z][a-z0-9+.-]*://)[^\s<>'\"]+[^!,\.\s<>\)'\"\]]") self.banner_status_label = self.xml.get_object('banner_label') if self.banner_status_label is not None: id_ = self.banner_status_label.connect('populate_popup', self.on_banner_label_populate_popup) self.handlers[id_] = self.banner_status_label # Init DND self.TARGET_TYPE_URI_LIST = 80 self.dnd_list = [Gtk.TargetEntry.new('text/uri-list', 0, self.TARGET_TYPE_URI_LIST), Gtk.TargetEntry.new('MY_TREE_MODEL_ROW', Gtk.TargetFlags.SAME_APP, 0)] id_ = self.widget.connect('drag_data_received', self._on_drag_data_received) self.handlers[id_] = self.widget self.widget.drag_dest_set(Gtk.DestDefaults.MOTION | Gtk.DestDefaults.HIGHLIGHT | Gtk.DestDefaults.DROP, self.dnd_list, Gdk.DragAction.COPY) # Create textviews and connect signals self.conv_textview = ConversationTextview(self.account) id_ = self.conv_textview.connect('quote', self.on_quote) self.handlers[id_] = self.conv_textview.tv id_ = self.conv_textview.tv.connect('key_press_event', self._conv_textview_key_press_event) self.handlers[id_] = self.conv_textview.tv # FIXME: DND on non editable TextView, find a better way self.drag_entered = False id_ = self.conv_textview.tv.connect('drag_data_received', self._on_drag_data_received) self.handlers[id_] = self.conv_textview.tv id_ = self.conv_textview.tv.connect('drag_motion', self._on_drag_motion) self.handlers[id_] = self.conv_textview.tv id_ = self.conv_textview.tv.connect('drag_leave', self._on_drag_leave) self.handlers[id_] = self.conv_textview.tv self.conv_textview.tv.drag_dest_set(Gtk.DestDefaults.MOTION | Gtk.DestDefaults.HIGHLIGHT | Gtk.DestDefaults.DROP, self.dnd_list, Gdk.DragAction.COPY) self.conv_scrolledwindow = self.xml.get_object( 'conversation_scrolledwindow') self.conv_scrolledwindow.add(self.conv_textview.tv) widget = self.conv_scrolledwindow.get_vadjustment() id_ = widget.connect('changed', self.on_conversation_vadjustment_changed) self.handlers[id_] = widget vscrollbar = self.conv_scrolledwindow.get_vscrollbar() id_ = vscrollbar.connect('button-release-event', self._on_scrollbar_button_release) self.handlers[id_] = vscrollbar self.correcting = False self.last_sent_msg = None # add MessageTextView to UI and connect signals self.msg_textview = MessageTextView() self.msg_scrolledwindow = ScrolledWindow() self.msg_scrolledwindow.add(self.msg_textview) hbox = self.xml.get_object('hbox') hbox.pack_start(self.msg_scrolledwindow, True, True, 0) id_ = self.msg_textview.connect('key_press_event', self._on_message_textview_key_press_event) self.handlers[id_] = self.msg_textview id_ = self.msg_textview.connect('populate_popup', self.on_msg_textview_populate_popup) self.handlers[id_] = self.msg_textview # Setup DND id_ = self.msg_textview.connect('drag_data_received', self._on_drag_data_received) self.handlers[id_] = self.msg_textview self.msg_textview.drag_dest_set(Gtk.DestDefaults.MOTION | Gtk.DestDefaults.HIGHLIGHT, self.dnd_list, Gdk.DragAction.COPY) # the following vars are used to keep history of user's messages self.sent_history = [] self.sent_history_pos = 0 self.received_history = [] self.received_history_pos = 0 self.orig_msg = None self.set_emoticon_popover() # Attach speller self.spell_checker = None self.set_speller() self.conv_textview.tv.show() # For XEP-0172 self.user_nick = None self.command_hits = [] self.last_key_tabs = False # chatstate timers and state self.reset_kbd_mouse_timeout_vars() self.possible_paused_timeout_id = None self.possible_inactive_timeout_id = None message_tv_buffer = self.msg_textview.get_buffer() id_ = message_tv_buffer.connect('changed', self._on_message_tv_buffer_changed) self.handlers[id_] = message_tv_buffer if parent_win is not None: id_ = parent_win.window.connect('motion-notify-event', self._on_window_motion_notify) self.handlers[id_] = parent_win.window self._schedule_activity_timers() self.encryption = self.get_encryption_state() # PluginSystem: adding GUI extension point for ChatControlBase # instance object (also subclasses, eg. ChatControl or GroupchatControl) app.plugin_manager.gui_extension_point('chat_control_base', self) app.ged.register_event_handler('our-show', ged.GUI1, self._nec_our_status) app.ged.register_event_handler('ping-sent', ged.GUI1, self._nec_ping_sent) app.ged.register_event_handler('ping-reply', ged.GUI1, self._nec_ping_reply) app.ged.register_event_handler('ping-error', ged.GUI1, self._nec_ping_error) # This is bascially a very nasty hack to surpass the inability # to properly use the super, because of the old code. CommandTools.__init__(self) def add_actions(self): action = Gio.SimpleAction.new_stateful( "set-encryption-%s" % self.control_id, GLib.VariantType.new("s"), GLib.Variant("s", self.encryption or 'disabled')) action.connect("change-state", self.change_encryption) self.parent_win.window.add_action(action) action = Gio.SimpleAction.new( 'browse-history-%s' % self.control_id, GLib.VariantType.new('s')) action.connect('activate', self._on_history) self.parent_win.window.add_action(action) action = Gio.SimpleAction.new( 'send-file-%s' % self.control_id, None) action.connect('activate', self._on_send_file) action.set_enabled(False) self.parent_win.window.add_action(action) action = Gio.SimpleAction.new( 'send-file-httpupload-%s' % self.control_id, None) action.connect('activate', self._on_send_httpupload) action.set_enabled(False) self.parent_win.window.add_action(action) action = Gio.SimpleAction.new( 'send-file-jingle-%s' % self.control_id, None) action.connect('activate', self._on_send_jingle) action.set_enabled(False) self.parent_win.window.add_action(action) # Actions def _on_history(self, action, param): """ When history menuitem is pressed: call history window """ jid = param.get_string() if jid == 'none': jid = self.contact.jid if 'logs' in app.interface.instances: app.interface.instances['logs'].window.present() app.interface.instances['logs'].open_history(jid, self.account) else: app.interface.instances['logs'] = \ history_window.HistoryWindow(jid, self.account) def change_encryption(self, action, param): encryption = param.get_string() if encryption == 'disabled': encryption = None if self.encryption == encryption: return if encryption: plugin = app.plugin_manager.encryption_plugins[encryption] if not plugin.activate_encryption(self): return else: if not self.widget_name == 'groupchat_control': self.terminate_esessions() action.set_state(param) self.set_encryption_state(encryption) self.set_encryption_menu_icon() self.set_lock_image() def set_encryption_state(self, encryption): config_key = '%s-%s' % (self.account, self.contact.jid) self.encryption = encryption app.config.set_per('encryption', config_key, 'encryption', self.encryption or '') def get_encryption_state(self): config_key = '%s-%s' % (self.account, self.contact.jid) state = app.config.get_per('encryption', config_key, 'encryption') if not state: return None if state not in app.plugin_manager.encryption_plugins: self.set_encryption_state(None) return None return state def set_encryption_menu_icon(self): image = self.encryption_menu.get_image() if image is None: image = Gtk.Image() self.encryption_menu.set_image(image) if not self.encryption: image.set_from_icon_name('channel-insecure-symbolic', Gtk.IconSize.MENU) else: image.set_from_icon_name('channel-secure-symbolic', Gtk.IconSize.MENU) def set_speller(self): if not app.HAVE_SPELL or not app.config.get('use_speller'): return gspell_lang = self.get_speller_language() if gspell_lang is None: return self.spell_checker = Gspell.Checker.new(gspell_lang) spell_buffer = Gspell.TextBuffer.get_from_gtk_text_buffer( self.msg_textview.get_buffer()) spell_buffer.set_spell_checker(self.spell_checker) spell_view = Gspell.TextView.get_from_gtk_text_view(self.msg_textview) spell_view.set_inline_spell_checking(False) spell_view.set_enable_language_menu(True) self.spell_checker.connect('notify::language', self.on_language_changed) def get_speller_language(self): per_type = 'contacts' if self.type_id == 'gc': per_type = 'rooms' lang = app.config.get_per( per_type, self.contact.jid, 'speller_language') if not lang: # use the default one lang = app.config.get('speller_language') if not lang: lang = app.LANG gspell_lang = Gspell.language_lookup(lang) if gspell_lang is None: gspell_lang = Gspell.language_get_default() return gspell_lang def on_language_changed(self, checker, param): gspell_lang = checker.get_language() per_type = 'contacts' if self.type_id == message_control.TYPE_GC: per_type = 'rooms' if not app.config.get_per(per_type, self.contact.jid): app.config.add_per(per_type, self.contact.jid) app.config.set_per(per_type, self.contact.jid, 'speller_language', gspell_lang.get_code()) def on_banner_label_populate_popup(self, label, menu): """ Override the default context menu and add our own menutiems """ item = Gtk.SeparatorMenuItem.new() menu.prepend(item) menu2 = self.prepare_context_menu() i = 0 for item in menu2: menu2.remove(item) menu.prepend(item) menu.reorder_child(item, i) i += 1 menu.show_all() def shutdown(self): super(ChatControlBase, self).shutdown() # Disconnect timer callbacks if self.possible_paused_timeout_id: GLib.source_remove(self.possible_paused_timeout_id) if self.possible_inactive_timeout_id: GLib.source_remove(self.possible_inactive_timeout_id) # PluginSystem: removing GUI extension points connected with ChatControlBase # instance object app.plugin_manager.remove_gui_extension_point('chat_control_base', self) app.plugin_manager.remove_gui_extension_point( 'chat_control_base_draw_banner', self) app.ged.remove_event_handler('our-show', ged.GUI1, self._nec_our_status) def on_msg_textview_populate_popup(self, textview, menu): """ Override the default context menu and we prepend an option to switch languages """ item = Gtk.MenuItem.new_with_mnemonic(_('_Undo')) menu.prepend(item) id_ = item.connect('activate', self.msg_textview.undo) self.handlers[id_] = item item = Gtk.SeparatorMenuItem.new() menu.prepend(item) item = Gtk.MenuItem.new_with_mnemonic(_('_Clear')) menu.prepend(item) id_ = item.connect('activate', self.msg_textview.clear) self.handlers[id_] = item menu.show_all() def on_quote(self, widget, text): self.msg_textview.remove_placeholder() text = '>' + text.replace('\n', '\n>') + '\n' message_buffer = self.msg_textview.get_buffer() message_buffer.insert_at_cursor(text) # moved from ChatControl def _on_banner_eventbox_button_press_event(self, widget, event): """ If right-clicked, show popup """ if event.button == 3: # right click self.parent_win.popup_menu(event) def _conv_textview_key_press_event(self, widget, event): # translate any layout to latin_layout valid, entries = self.keymap.get_entries_for_keyval(event.keyval) keycode = entries[0].keycode if (event.get_state() & Gdk.ModifierType.CONTROL_MASK and keycode in ( self.keycode_c, self.keycode_ins)): return False if event.get_state() & Gdk.ModifierType.SHIFT_MASK and \ event.keyval in (Gdk.KEY_Page_Down, Gdk.KEY_Page_Up): self._on_scroll(None, event.keyval) return False self.parent_win.notebook.event(event) return True def _on_message_textview_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_space: self.space_pressed = True elif (self.space_pressed or self.msg_textview.undo_pressed) and \ event.keyval not in (Gdk.KEY_Control_L, Gdk.KEY_Control_R) and \ not (event.keyval == Gdk.KEY_z and event.get_state() & Gdk.ModifierType.CONTROL_MASK): # If the space key has been pressed and now it hasnt, # we save the buffer into the undo list. But be carefull we're not # pressiong Control again (as in ctrl+z) _buffer = widget.get_buffer() start_iter, end_iter = _buffer.get_bounds() self.msg_textview.save_undo(_buffer.get_text(start_iter, end_iter, True)) self.space_pressed = False # Ctrl [+ Shift] + Tab are not forwarded to notebook. We handle it here if self.widget_name == 'groupchat_control': if event.keyval not in (Gdk.KEY_ISO_Left_Tab, Gdk.KEY_Tab): self.last_key_tabs = False if event.get_state() & Gdk.ModifierType.SHIFT_MASK: # CTRL + SHIFT + TAB if event.get_state() & Gdk.ModifierType.CONTROL_MASK and \ event.keyval == Gdk.KEY_ISO_Left_Tab: self.parent_win.move_to_next_unread_tab(False) return True # SHIFT + PAGE_[UP|DOWN]: send to conv_textview elif event.keyval == Gdk.KEY_Page_Down or \ event.keyval == Gdk.KEY_Page_Up: self.conv_textview.tv.event(event) return True elif event.get_state() & Gdk.ModifierType.CONTROL_MASK: if event.keyval == Gdk.KEY_Tab: # CTRL + TAB self.parent_win.move_to_next_unread_tab(True) return True message_buffer = self.msg_textview.get_buffer() event_state = event.get_state() if event.keyval == Gdk.KEY_Tab: start, end = message_buffer.get_bounds() position = message_buffer.get_insert() end = message_buffer.get_iter_at_mark(position) text = message_buffer.get_text(start, end, False) splitted = text.split() if (text.startswith(self.COMMAND_PREFIX) and not text.startswith(self.COMMAND_PREFIX * 2) and len(splitted) == 1): text = splitted[0] bare = text.lstrip(self.COMMAND_PREFIX) if len(text) == 1: self.command_hits = [] for command in self.list_commands(): for name in command.names: self.command_hits.append(name) else: if (self.last_key_tabs and self.command_hits and self.command_hits[0].startswith(bare)): self.command_hits.append(self.command_hits.pop(0)) else: self.command_hits = [] for command in self.list_commands(): for name in command.names: if name.startswith(bare): self.command_hits.append(name) if self.command_hits: message_buffer.delete(start, end) message_buffer.insert_at_cursor(self.COMMAND_PREFIX + \ self.command_hits[0] + ' ') self.last_key_tabs = True return True if self.widget_name != 'groupchat_control': self.last_key_tabs = False if event.keyval == Gdk.KEY_Up: if event_state & Gdk.ModifierType.CONTROL_MASK: if event_state & Gdk.ModifierType.SHIFT_MASK: # Ctrl+Shift+UP self.scroll_messages('up', message_buffer, 'received') else: # Ctrl+UP self.scroll_messages('up', message_buffer, 'sent') return True elif event.keyval == Gdk.KEY_Down: if event_state & Gdk.ModifierType.CONTROL_MASK: if event_state & Gdk.ModifierType.SHIFT_MASK: # Ctrl+Shift+Down self.scroll_messages('down', message_buffer, 'received') else: # Ctrl+Down self.scroll_messages('down', message_buffer, 'sent') return True elif event.keyval == Gdk.KEY_Return or \ event.keyval == Gdk.KEY_KP_Enter: # ENTER message_textview = widget message_buffer = message_textview.get_buffer() emoticons.replace_with_codepoint(message_buffer) start_iter, end_iter = message_buffer.get_bounds() message = message_buffer.get_text(start_iter, end_iter, False) xhtml = self.msg_textview.get_xhtml() if event_state & Gdk.ModifierType.SHIFT_MASK: send_message = False else: is_ctrl_enter = bool(event_state & Gdk.ModifierType.CONTROL_MASK) send_message = is_ctrl_enter == app.config.get('send_on_ctrl_enter') if send_message and app.connections[self.account].connected < 2: # we are not connected app.interface.raise_dialog('not-connected-while-sending') elif send_message: self.send_message(message, xhtml=xhtml) else: message_buffer.insert_at_cursor('\n') mark = message_buffer.get_insert() iter_ = message_buffer.get_iter_at_mark(mark) if message_buffer.get_end_iter().equal(iter_): GLib.idle_add(gtkgui_helpers.scroll_to_end, self.msg_scrolledwindow) return True elif event.keyval == Gdk.KEY_z: # CTRL+z if event_state & Gdk.ModifierType.CONTROL_MASK: self.msg_textview.undo() return True return False def _on_drag_data_received(self, widget, context, x, y, selection, target_type, timestamp): """ Derived types SHOULD implement this """ pass def _on_drag_leave(self, widget, context, time): # FIXME: DND on non editable TextView, find a better way self.drag_entered = False self.conv_textview.tv.set_editable(False) def _on_drag_motion(self, widget, context, x, y, time): # FIXME: DND on non editable TextView, find a better way if not self.drag_entered: # We drag new data over the TextView, make it editable to catch dnd self.drag_entered_conv = True self.conv_textview.tv.set_editable(True) def drag_data_file_transfer(self, contact, selection, widget): # get file transfer preference ft_pref = app.config.get_per('accounts', self.account, 'filetransfer_preference') win = self.parent_win.window con = app.connections[self.account] httpupload = win.lookup_action( 'send-file-httpupload-%s' % self.control_id) jingle = win.lookup_action('send-file-jingle-%s' % self.control_id) # we may have more than one file dropped uri_splitted = selection.get_uris() for uri in uri_splitted: path = helpers.get_file_path_from_dnd_dropped_uri(uri) if not os.path.isfile(path): # is it a file? continue if self.type_id == message_control.TYPE_GC: # groupchat only supports httpupload on drag and drop if httpupload.get_enabled(): # use httpupload con.check_file_before_transfer( path, self.encryption, contact, self.session, groupchat=True) else: if httpupload.get_enabled() and jingle.get_enabled(): if ft_pref == 'httpupload': con.check_file_before_transfer( path, self.encryption, contact, self.session) else: ft = app.interface.instances['file_transfers'] ft.send_file(self.account, contact, path) elif httpupload.get_enabled(): con.check_file_before_transfer( path, self.encryption, contact, self.session) elif jingle.get_enabled(): ft = app.interface.instances['file_transfers'] ft.send_file(self.account, contact, path) def get_seclabel(self): label = None if self.seclabel_combo is not None: idx = self.seclabel_combo.get_active() if idx != -1: cat = app.connections[self.account].seclabel_catalogues[self.contact.jid] lname = cat[2][idx] label = cat[1][lname] return label def send_message(self, message, keyID='', type_='chat', chatstate=None, resource=None, xhtml=None, process_commands=True, attention=False): """ Send the given message to the active tab. Doesn't return None if error """ if not message or message == '\n': return None if process_commands and self.process_as_command(message): return # refresh timers self.reset_kbd_mouse_timeout_vars() notifications = app.config.get('outgoing_chat_state_notifications') if (self.contact.jid == app.get_jid_from_account(self.account) or notifications == 'disabled'): chatstate = None label = self.get_seclabel() if self.correcting and self.last_sent_msg: correct_id = self.last_sent_msg else: correct_id = None app.nec.push_outgoing_event(MessageOutgoingEvent(None, account=self.account, jid=self.contact.jid, message=message, keyID=keyID, type_=type_, chatstate=chatstate, resource=resource, user_nick=self.user_nick, xhtml=xhtml, label=label, control=self, attention=attention, correct_id=correct_id, automatic_message=False, encryption=self.encryption)) # Record the history of sent messages self.save_message(message, 'sent') # Be sure to send user nickname only once according to JEP-0172 self.user_nick = None # Clear msg input message_buffer = self.msg_textview.get_buffer() message_buffer.set_text('') # clear message buffer (and tv of course) def check_for_possible_paused_chatstate(self, arg): """ Did we move mouse of that window or write something in message textview in the last 5 seconds? If yes - we go active for mouse, composing for kbd. If not - we go paused if we were previously composing """ contact = self.contact jid = contact.jid current_state = contact.our_chatstate if current_state is False: # jid doesn't support chatstates self.possible_paused_timeout_id = None return False # stop looping if current_state == 'composing': if not self.kbd_activity_in_last_5_secs: if self.msg_textview.has_text(): self.send_chatstate('paused', self.contact) else: self.send_chatstate('active', self.contact) elif current_state == 'inactive': if (self.mouse_over_in_last_5_secs and jid == self.parent_win.get_active_jid()): self.send_chatstate('active', self.contact) # assume no activity and let the motion-notify or 'insert-text' make them # True refresh 30 seconds vars too or else it's 30 - 5 = 25 seconds! self.reset_kbd_mouse_timeout_vars() return True # loop forever def check_for_possible_inactive_chatstate(self, arg): """ Did we move mouse over that window or wrote something in message textview in the last 30 seconds? if yes - we go active. If no - we go inactive """ contact = self.contact current_state = contact.our_chatstate if current_state is False: # jid doesn't support chatstates self.possible_inactive_timeout_id = None return False # stop looping if self.mouse_over_in_last_5_secs or self.kbd_activity_in_last_5_secs: return True # loop forever if not self.mouse_over_in_last_30_secs or \ self.kbd_activity_in_last_30_secs: self.send_chatstate('inactive', contact) # assume no activity and let the motion-notify or 'insert-text' make them # True refresh 30 seconds too or else it's 30 - 5 = 25 seconds! self.reset_kbd_mouse_timeout_vars() return True # loop forever def _schedule_activity_timers(self): if self.possible_paused_timeout_id: GLib.source_remove(self.possible_paused_timeout_id) if self.possible_inactive_timeout_id: GLib.source_remove(self.possible_inactive_timeout_id) self.possible_paused_timeout_id = GLib.timeout_add_seconds(5, self.check_for_possible_paused_chatstate, None) self.possible_inactive_timeout_id = GLib.timeout_add_seconds(30, self.check_for_possible_inactive_chatstate, None) def reset_kbd_mouse_timeout_vars(self): self.kbd_activity_in_last_5_secs = False self.mouse_over_in_last_5_secs = False self.mouse_over_in_last_30_secs = False self.kbd_activity_in_last_30_secs = False def _on_window_motion_notify(self, widget, event): """ It gets called no matter if it is the active window or not """ if not self.parent_win: # when a groupchat is minimized there is no parent window return if self.parent_win.get_active_jid() == self.contact.jid: # if window is the active one, change vars assisting chatstate self.mouse_over_in_last_5_secs = True self.mouse_over_in_last_30_secs = True def _on_message_tv_buffer_changed(self, textbuffer): self.kbd_activity_in_last_5_secs = True self.kbd_activity_in_last_30_secs = True if not self.msg_textview.has_text(): return self.send_chatstate('composing', self.contact) def save_message(self, message, msg_type): # save the message, so user can scroll though the list with key up/down if msg_type == 'sent': history = self.sent_history pos = self.sent_history_pos else: history = self.received_history pos = self.received_history_pos size = len(history) scroll = False if pos == size else True # are we scrolling? # we don't want size of the buffer to grow indefinately max_size = app.config.get('key_up_lines') for i in range(size - max_size + 1): if pos == 0: break history.pop(0) pos -= 1 history.append(message) if not scroll or msg_type == 'sent': pos = len(history) if msg_type == 'sent': self.sent_history_pos = pos self.orig_msg = None else: self.received_history_pos = pos def print_conversation_line(self, text, kind, name, tim, other_tags_for_name=None, other_tags_for_time=None, other_tags_for_text=None, count_as_new=True, subject=None, old_kind=None, xhtml=None, simple=False, xep0184_id=None, graphics=True, displaymarking=None, msg_log_id=None, msg_stanza_id=None, correct_id=None, additional_data=None, encrypted=None): """ Print 'chat' type messages correct_id = (message_id, correct_id) """ jid = self.contact.jid full_jid = self.get_full_jid() textview = self.conv_textview end = False if self.conv_textview.autoscroll or kind == 'outgoing': end = True if other_tags_for_name is None: other_tags_for_name = [] if other_tags_for_time is None: other_tags_for_time = [] if other_tags_for_text is None: other_tags_for_text = [] if additional_data is None: additional_data = {} textview.print_conversation_line(text, jid, kind, name, tim, other_tags_for_name, other_tags_for_time, other_tags_for_text, subject, old_kind, xhtml, simple=simple, graphics=graphics, displaymarking=displaymarking, msg_stanza_id=msg_stanza_id, correct_id=correct_id, additional_data=additional_data, encrypted=encrypted) if xep0184_id is not None: textview.add_xep0184_mark(xep0184_id) if not count_as_new: return if kind == 'incoming': if not self.type_id == message_control.TYPE_GC or \ app.config.get('notify_on_all_muc_messages') or \ app.config.get_per('rooms', jid, 'notify_on_all_messages') or \ 'marked' in other_tags_for_text: # it's a normal message, or a muc message with want to be # notified about if quitting just after # other_tags_for_text == ['marked'] --> highlighted gc message app.last_message_time[self.account][full_jid] = time.time() if kind in ('incoming', 'incoming_queue'): # Record the history of received messages self.save_message(text, 'received') if kind in ('incoming', 'incoming_queue', 'error'): gc_message = False if self.type_id == message_control.TYPE_GC: gc_message = True if ((self.parent_win and (not self.parent_win.get_active_control() or \ self != self.parent_win.get_active_control() or \ not self.parent_win.is_active() or not end)) or \ (gc_message and \ jid in app.interface.minimized_controls[self.account])) and \ kind in ('incoming', 'incoming_queue', 'error'): # we want to have save this message in events list # other_tags_for_text == ['marked'] --> highlighted gc message if gc_message: if 'marked' in other_tags_for_text: event_type = events.PrintedMarkedGcMsgEvent else: event_type = events.PrintedGcMsgEvent event = 'gc_message_received' else: if self.type_id == message_control.TYPE_CHAT: event_type = events.PrintedChatEvent else: event_type = events.PrintedPmEvent event = 'message_received' show_in_roster = notify.get_show_in_roster(event, self.account, self.contact, self.session) show_in_systray = notify.get_show_in_systray(event, self.account, self.contact, event_type.type_) event = event_type(text, subject, self, msg_log_id, show_in_roster=show_in_roster, show_in_systray=show_in_systray) app.events.add_event(self.account, full_jid, event) # We need to redraw contact if we show in roster if show_in_roster: app.interface.roster.draw_contact(self.contact.jid, self.account) if not self.parent_win: return if (not self.parent_win.get_active_control() or \ self != self.parent_win.get_active_control() or \ not self.parent_win.is_active() or not end) and \ kind in ('incoming', 'incoming_queue', 'error'): self.parent_win.redraw_tab(self) if not self.parent_win.is_active(): self.parent_win.show_title(True, self) # Enabled Urgent hint else: self.parent_win.show_title(False, self) # Disabled Urgent hint def toggle_emoticons(self): """ Hide show emoticons_button """ if app.config.get('emoticons_theme'): self.emoticons_button.set_no_show_all(False) self.emoticons_button.show() else: self.emoticons_button.set_no_show_all(True) self.emoticons_button.hide() def set_emoticon_popover(self): if not app.config.get('emoticons_theme'): return if not self.parent_win: return popover = emoticons.get_popover() popover.set_callbacks(self.msg_textview) emoticons_button = self.xml.get_object('emoticons_button') emoticons_button.set_popover(popover) def on_color_menuitem_activate(self, widget): color_dialog = Gtk.ColorChooserDialog(None, self.parent_win.window) color_dialog.set_use_alpha(False) color_dialog.connect('response', self.msg_textview.color_set) color_dialog.show_all() def on_font_menuitem_activate(self, widget): font_dialog = Gtk.FontChooserDialog(None, self.parent_win.window) start, finish = self.msg_textview.get_active_iters() font_dialog.connect('response', self.msg_textview.font_set, start, finish) font_dialog.show_all() def on_formatting_menuitem_activate(self, widget): tag = widget.get_name() self.msg_textview.set_tag(tag) def on_clear_formatting_menuitem_activate(self, widget): self.msg_textview.clear_tags() def update_tags(self): self.conv_textview.update_tags() def clear(self, tv): buffer_ = tv.get_buffer() start, end = buffer_.get_bounds() buffer_.delete(start, end) def _on_history_menuitem_activate(self, widget=None, jid=None): """ When history menuitem is pressed: call history window """ if not jid: jid = self.contact.jid if 'logs' in app.interface.instances: app.interface.instances['logs'].window.present() app.interface.instances['logs'].open_history(jid, self.account) else: app.interface.instances['logs'] = \ history_window.HistoryWindow(jid, self.account) def _on_send_file(self, action, param): # get file transfer preference ft_pref = app.config.get_per('accounts', self.account, 'filetransfer_preference') win = self.parent_win.window httpupload = win.lookup_action( 'send-file-httpupload-%s' % self.control_id) jingle = win.lookup_action('send-file-jingle-%s' % self.control_id) if httpupload.get_enabled() and jingle.get_enabled(): if ft_pref == 'httpupload': httpupload.activate() else: jingle.activate() elif httpupload.get_enabled(): httpupload.activate() elif jingle.get_enabled(): jingle.activate() def _on_send_httpupload(self, action, param): app.interface.send_httpupload(self) def _on_send_jingle(self, action, param): self._on_send_file_jingle() def _on_send_file_jingle(self, gc_contact=None): """ gc_contact can be set when we are in a groupchat control """ def _on_ok(c): app.interface.instances['file_transfers'].show_file_send_request( self.account, c) if self.type_id == message_control.TYPE_PM: gc_contact = self.gc_contact if gc_contact: # gc or pm gc_control = app.interface.msg_win_mgr.get_gc_control( gc_contact.room_jid, self.account) self_contact = app.contacts.get_gc_contact(self.account, gc_control.room_jid, gc_control.nick) if gc_control.is_anonymous and gc_contact.affiliation not in ['admin', 'owner'] and self_contact.affiliation in ['admin', 'owner']: contact = app.contacts.get_contact(self.account, gc_contact.jid) if not contact or contact.sub not in ('both', 'to'): prim_text = _('Really send file?') sec_text = _('If you send a file to %s, he/she will know your ' 'real JID.') % gc_contact.name dialog = dialogs.NonModalConfirmationDialog(prim_text, sec_text, on_response_ok=(_on_ok, gc_contact)) dialog.popup() return _on_ok(gc_contact) return _on_ok(self.contact) def on_minimize_menuitem_toggled(self, widget): """ When a grouchat is minimized, unparent the tab, put it in roster etc """ old_value = True non_minimized_gc = app.config.get_per('accounts', self.account, 'non_minimized_gc').split() if self.contact.jid in non_minimized_gc: old_value = False minimize = widget.get_active() if not minimize and not self.contact.jid in non_minimized_gc: non_minimized_gc.append(self.contact.jid) if minimize and self.contact.jid in non_minimized_gc: non_minimized_gc.remove(self.contact.jid) if old_value != minimize: app.config.set_per('accounts', self.account, 'non_minimized_gc', ' '.join(non_minimized_gc)) def on_notify_menuitem_toggled(self, widget): app.config.set_per('rooms', self.contact.jid, 'notify_on_all_messages', widget.get_active()) def set_control_active(self, state): if state: self.set_emoticon_popover() jid = self.contact.jid if self.conv_textview.autoscroll: # we are at the end type_ = ['printed_' + self.type_id] if self.type_id == message_control.TYPE_GC: type_ = ['printed_gc_msg', 'printed_marked_gc_msg'] if not app.events.remove_events(self.account, self.get_full_jid(), types=type_): # There were events to remove self.redraw_after_event_removed(jid) # send chatstate inactive to the one we're leaving # and active to the one we visit if self.msg_textview.has_text(): self.send_chatstate('paused', self.contact) else: self.send_chatstate('active', self.contact) self.reset_kbd_mouse_timeout_vars() self._schedule_activity_timers() else: self.send_chatstate('inactive', self.contact) def scroll_to_end(self, force=False): self.conv_textview.scroll_to_end(force) def _on_edge_reached(self, scrolledwindow, pos): if pos != Gtk.PositionType.BOTTOM: return # Remove all events and set autoscroll True app.log('autoscroll').info('Autoscroll enabled') self.conv_textview.autoscroll = True if self.resource: jid = self.contact.get_full_jid() else: jid = self.contact.jid types_list = [] type_ = self.type_id if type_ == message_control.TYPE_GC: type_ = 'gc_msg' types_list = ['printed_' + type_, type_, 'printed_marked_gc_msg'] else: # Not a GC types_list = ['printed_' + type_, type_] if not len(app.events.get_events(self.account, jid, types_list)): return if not self.parent_win: return if self.parent_win.get_active_control() == self and \ self.parent_win.window.is_active(): # we are at the end if self.type_id == message_control.TYPE_GC: if not app.events.remove_events(self.account, jid, types=types_list): self.redraw_after_event_removed(jid) elif self.session and self.session.remove_events(types_list): # There were events to remove self.redraw_after_event_removed(jid) def _on_scrollbar_button_release(self, scrollbar, event): if event.get_button()[1] != 1: # We want only to catch the left mouse button return if not gtkgui_helpers.at_the_end(scrollbar.get_parent()): app.log('autoscroll').info('Autoscroll disabled') self.conv_textview.autoscroll = False def _on_scroll(self, widget, event): if not self.conv_textview.autoscroll: # autoscroll is already disabled return if widget is None: # call from _conv_textview_key_press_event() # SHIFT + Gdk.KEY_Page_Up if event != Gdk.KEY_Page_Up: return else: # On scrolliung UP disable autoscroll # get_scroll_direction() sets has_direction only TRUE # if smooth scrolling is deactivated. If we have smooth # smooth scrolling we have to use get_scroll_deltas() has_direction, direction = event.get_scroll_direction() if not has_direction: direction = None smooth, delta_x, delta_y = event.get_scroll_deltas() if smooth: if delta_y < 0: direction = Gdk.ScrollDirection.UP elif delta_y > 0: direction = Gdk.ScrollDirection.DOWN elif delta_x < 0: direction = Gdk.ScrollDirection.LEFT elif delta_x > 0: direction = Gdk.ScrollDirection.RIGHT else: app.log('autoscroll').warning( 'Scroll directions cant be determined') if direction != Gdk.ScrollDirection.UP: return # Check if we have a Scrollbar adjustment = self.conv_scrolledwindow.get_vadjustment() if adjustment.get_upper() != adjustment.get_page_size(): app.log('autoscroll').info('Autoscroll disabled') self.conv_textview.autoscroll = False def on_conversation_vadjustment_changed(self, adjustment): self.scroll_to_end() def redraw_after_event_removed(self, jid): """ We just removed a 'printed_*' event, redraw contact in roster or gc_roster and titles in roster and msg_win """ self.parent_win.redraw_tab(self) self.parent_win.show_title() # TODO : get the contact and check notify.get_show_in_roster() if self.type_id == message_control.TYPE_PM: room_jid, nick = app.get_room_and_nick_from_fjid(jid) groupchat_control = app.interface.msg_win_mgr.get_gc_control( room_jid, self.account) if room_jid in app.interface.minimized_controls[self.account]: groupchat_control = \ app.interface.minimized_controls[self.account][room_jid] contact = app.contacts.get_contact_with_highest_priority( self.account, room_jid) if contact: app.interface.roster.draw_contact(room_jid, self.account) if groupchat_control: groupchat_control.draw_contact(nick) if groupchat_control.parent_win: groupchat_control.parent_win.redraw_tab(groupchat_control) else: app.interface.roster.draw_contact(jid, self.account) app.interface.roster.show_title() def scroll_messages(self, direction, msg_buf, msg_type): if msg_type == 'sent': history = self.sent_history pos = self.sent_history_pos self.received_history_pos = len(self.received_history) else: history = self.received_history pos = self.received_history_pos self.sent_history_pos = len(self.sent_history) size = len(history) if self.orig_msg is None: # user was typing something and then went into history, so save # whatever is already typed start_iter = msg_buf.get_start_iter() end_iter = msg_buf.get_end_iter() self.orig_msg = msg_buf.get_text(start_iter, end_iter, False) if pos == size and size > 0 and direction == 'up' and \ msg_type == 'sent' and not self.correcting and (not \ history[pos - 1].startswith('/') or history[pos - 1].startswith('/me')): self.correcting = True gtkgui_helpers.add_css_class( self.msg_textview, 'msgcorrectingcolor') message = history[pos - 1] msg_buf.set_text(message) return if self.correcting: # We were previously correcting gtkgui_helpers.remove_css_class( self.msg_textview, 'msgcorrectingcolor') self.correcting = False pos += -1 if direction == 'up' else +1 if pos == -1: return if pos >= size: pos = size message = self.orig_msg self.orig_msg = None else: message = history[pos] if msg_type == 'sent': self.sent_history_pos = pos else: self.received_history_pos = pos if self.orig_msg is not None: message = '> %s\n' % message.replace('\n', '\n> ') msg_buf.set_text(message) def widget_set_visible(self, widget, state): """ Show or hide a widget """ # make the last message visible, when changing to "full view" if not state: self.scroll_to_end() widget.set_no_show_all(state) if state: widget.hide() else: widget.show_all() def got_connected(self): self.msg_textview.set_sensitive(True) self.msg_textview.set_editable(True) self.update_toolbar() def got_disconnected(self): self.msg_textview.set_sensitive(False) self.msg_textview.set_editable(False) self.conv_textview.tv.grab_focus() self.no_autonegotiation = False self.update_toolbar() class ScrolledWindow(Gtk.ScrolledWindow): def __init__(self, *args, **kwargs): Gtk.ScrolledWindow.__init__(self, *args, **kwargs) self.set_overlay_scrolling(False) self.set_max_content_height(100) self.set_propagate_natural_height(True) self.get_style_context().add_class('scrolled-no-border') self.get_style_context().add_class('no-scroll-indicator') self.get_style_context().add_class('scrollbar-style') self.set_shadow_type(Gtk.ShadowType.IN) def do_get_preferred_height(self): min_height, natural_height = Gtk.ScrolledWindow.do_get_preferred_height(self) # Gtk Bug: If policy is set to Automatic, the ScrolledWindow # has a min size of around 46-82 depending on the System. Because # we want it smaller, we set policy NEVER if the height is < 90 # so the ScrolledWindow will shrink to around 26 (1 line heigh). # Once it gets over 90 its no problem to restore the policy. if natural_height < 90: GLib.idle_add(self.set_policy, Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.NEVER) else: GLib.idle_add(self.set_policy, Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) return min_height, natural_height gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/command_system/000077500000000000000000000000001326020644600250145ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/command_system/__init__.py000066400000000000000000000016031326020644600271250ustar00rootroot00000000000000# Copyright (C) 2009-2010 Alexander Cherniuk # # 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 . """ The command system providing scalable, clean and convenient architecture in combination with declarative way of defining commands and a fair amount of automatization for routine processes. """ gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/command_system/dispatcher.py000066400000000000000000000071661326020644600275260ustar00rootroot00000000000000# Copyright (c) 2010, Alexander Cherniuk (ts33kr@gmail.com) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ Backbone of the command system. Provides smart and controllable dispatching mechanism with an auto-discovery functionality. In addition to automatic discovery and dispatching, also features manual control over the process. """ from gajim.command_system.tools import remove COMMANDS = {} CONTAINERS = {} def add_host(host): CONTAINERS[host] = [] def remove_host(host): remove(CONTAINERS, host) def add_container(container): for host in container.HOSTS: CONTAINERS[host].append(container) def remove_container(container): for host in container.HOSTS: remove(CONTAINERS[host], container) def add_commands(container): commands = COMMANDS.setdefault(container, {}) for command in traverse_commands(container): for name in command.names: commands[name] = command def remove_commands(container): remove(COMMANDS, container) def traverse_commands(container): for name in dir(container): attribute = getattr(container, name) if is_command(attribute): yield attribute def is_command(attribute): from gajim.command_system.framework import Command return isinstance(attribute, Command) def is_root(namespace): metaclass = namespace.get("__metaclass__", None) if not metaclass: return False return issubclass(metaclass, Dispatchable) def get_command(host, name): for container in CONTAINERS[host]: command = COMMANDS[container].get(name) if command: return command def list_commands(host): for container in CONTAINERS[host]: commands = COMMANDS[container] for name, command in commands.items(): yield name, command class Dispatchable(type): def __init__(self, name, bases, namespace): parents = super(Dispatchable, self) parents.__init__(name, bases, namespace) if not is_root(namespace): self.dispatch() def dispatch(self): if self.AUTOMATIC: self.enable() class Host(Dispatchable): def enable(self): add_host(self) def disable(self): remove_host(self) class Container(Dispatchable): def enable(self): add_container(self) add_commands(self) def disable(self): remove_commands(self) remove_container(self) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/command_system/errors.py000066400000000000000000000030561326020644600267060ustar00rootroot00000000000000# Copyright (C) 2009-2010 Alexander Cherniuk # # 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 . class BaseError(Exception): """ Common base for errors which relate to a specific command. Encapsulates everything needed to identify a command, by either its object or name. """ def __init__(self, message, command=None, name=None): self.message = message self.command = command self.name = name if command and not name: self.name = command.first_name super(BaseError, self).__init__() def __str__(self): return self.message class DefinitionError(BaseError): """ Used to indicate errors occured on command definition. """ pass class CommandError(BaseError): """ Used to indicate errors occured during command execution. """ pass class NoCommandError(BaseError): """ Used to indicate an inability to find the specified command. """ pass gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/command_system/framework.py000066400000000000000000000303471326020644600273720ustar00rootroot00000000000000# Copyright (C) 2009-2010 Alexander Cherniuk # # 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 . """ Provides a tiny framework with simple, yet powerful and extensible architecture to implement commands in a straight and flexible, declarative way. """ from types import FunctionType from inspect import getargspec, getdoc from gajim.command_system.dispatcher import Host, Container from gajim.command_system.dispatcher import get_command, list_commands from gajim.command_system.mapping import parse_arguments, adapt_arguments from gajim.command_system.errors import DefinitionError, CommandError, NoCommandError class CommandHost(metaclass=Host): """ Command host is a hub between numerous command processors and command containers. Aimed to participate in a dispatching process in order to provide clean and transparent architecture. The AUTOMATIC class variable, which must be defined by a command host, specifies whether the command host should be automatically dispatched and enabled by the dispatcher or not. """ __metaclass__ = Host class CommandContainer(metaclass=Container): """ Command container is an entity which holds defined commands, allowing them to be dispatched and proccessed correctly. Each command container may be bound to a one or more command hosts. The AUTOMATIC class variable, which must be defined by a command processor, specifies whether the command processor should be automatically dispatched and enabled by the dispatcher or not. Bounding is controlled by the HOSTS class variable, which must be defined by the command container. This variable should contain a sequence of hosts to bound to, as a tuple or list. """ __metaclass__ = Container class CommandProcessor(object): """ Command processor is an immediate command emitter. It does not participate in the dispatching process directly, but must define a host to bound to. Bounding is controlled by the COMMAND_HOST variable, which must be defined in the body of the command processor. This variable should be set to a specific command host. """ # This defines a command prefix (or an initializer), which should # precede a text in order for it to be processed as a command. COMMAND_PREFIX = '/' def process_as_command(self, text): """ Try to process text as a command. Returns True if it has been processed as a command and False otherwise. """ prefix = text.startswith(self.COMMAND_PREFIX) length = len(text) > len(self.COMMAND_PREFIX) if not (prefix and length): return False body = text[len(self.COMMAND_PREFIX):] body = body.strip() parts = body.split(None, 1) name, arguments = parts if len(parts) > 1 else (parts[0], None) flag = self.looks_like_command(text, body, name, arguments) if flag is not None: return flag self.execute_command(name, arguments) return True def execute_command(self, name, arguments): command = self.get_command(name) args, opts = parse_arguments(arguments) if arguments else ([], []) args, kwargs = adapt_arguments(command, arguments, args, opts) if self.command_preprocessor(command, name, arguments, args, kwargs): return value = command(self, *args, **kwargs) self.command_postprocessor(command, name, arguments, args, kwargs, value) def command_preprocessor(self, command, name, arguments, args, kwargs): """ Redefine this method in the subclass to execute custom code before command gets executed. If returns True then command execution will be interrupted and command will not be executed. """ pass def command_postprocessor(self, command, name, arguments, args, kwargs, value): """ Redefine this method in the subclass to execute custom code after command gets executed. """ pass def looks_like_command(self, text, body, name, arguments): """ This hook is being called before any processing, but after it was determined that text looks like a command. If returns value other then None - then further processing will be interrupted and that value will be used to return from process_as_command. """ pass def get_command(self, name): command = get_command(self.COMMAND_HOST, name) if not command: raise NoCommandError("Command does not exist", name=name) return command def list_commands(self): commands = list_commands(self.COMMAND_HOST) commands = dict(commands) return sorted(set(commands.values()), key=lambda k: k.__repr__()) class Command(object): def __init__(self, handler, *names, **properties): self.handler = handler self.names = names # Automatically set all the properties passed to a constructor # by the command decorator. for key, value in properties.items(): setattr(self, key, value) def __call__(self, *args, **kwargs): try: return self.handler(*args, **kwargs) # This allows to use a shortcuted way of raising an exception # inside a handler. That is to raise a CommandError without # command or name attributes set. They will be set to a # corresponding values right here in case if they was not set by # the one who raised an exception. except CommandError as error: if not error.command and not error.name: raise CommandError(error.message, self) raise # This one is a little bit too wide, but as Python does not have # anything more constrained - there is no other choice. Take a # look here if command complains about invalid arguments while # they are ok. except TypeError: raise CommandError("Command received invalid arguments", self) def __repr__(self): return "" % ', '.join(self.names) def __cmp__(self, other): if self.first_name > other.first_name: return 1 if self.first_name < other.first_name: return -1 return 0 @property def first_name(self): return self.names[0] @property def native_name(self): return self.handler.__name__ def extract_documentation(self): """ Extract handler's documentation which is a doc-string and transform it to a usable format. """ return getdoc(self.handler) def extract_description(self): """ Extract handler's description (which is a first line of the documentation). Try to keep them simple yet meaningful. """ documentation = self.extract_documentation() return documentation.split('\n', 1)[0] if documentation else None def extract_specification(self): """ Extract handler's arguments specification, as it was defined preserving their order. """ names, var_args, var_kwargs, defaults = getargspec(self.handler) # Behavior of this code need to be checked. Might yield # incorrect results on some rare occasions. spec_args = names[:-len(defaults) if defaults else len(names)] spec_kwargs = list(zip(names[-len(defaults):], defaults)) if defaults else {} # Removing self from arguments specification. Command handler # should receive the processors as a first argument, which # should be self by the canonical means. if spec_args.pop(0) != 'self': raise DefinitionError("First argument must be self", self) return spec_args, spec_kwargs, var_args, var_kwargs def command(*names, **properties): """ A decorator for defining commands in a declarative way. Provides facilities for setting command's names and properties. Names should contain a set of names (aliases) by which the command can be reached. If no names are given - the the native name (the one extracted from the command handler) will be used. If native=True is given (default) and names is non-empty - then the native name of the command will be prepended in addition to the given names. If usage=True is given (default) - then command help will be appended with autogenerated usage info, based of the command handler arguments introspection. If source=True is given - then the first argument of the command will receive the source arguments, as a raw, unprocessed string. The further mapping of arguments and options will not be affected. If raw=True is given - then command considered to be raw and should define positional arguments only. If it defines only one positional argument - this argument will receive all the raw and unprocessed arguments. If the command defines more then one positional argument - then all the arguments except the last one will be processed normally; the last argument will get what is left after the processing as raw and unprocessed string. If empty=True is given - this will allow to call a raw command without arguments. If extra=True is given - then all the extra arguments passed to a command will be collected into a sequence and given to the last positional argument. If overlap=True is given - then all the extra arguments will be mapped as if they were values for the keyword arguments. If expand=True is given (default) - then short, one-letter options will be expanded to a verbose ones, based of the comparison of the first letter. If more then one option with the same first letter is given - then only first one will be used in the expansion. """ names = list(names) native = properties.get('native', True) usage = properties.get('usage', True) source = properties.get('source', False) raw = properties.get('raw', False) empty = properties.get('empty', False) extra = properties.get('extra', False) overlap = properties.get('overlap', False) expand = properties.get('expand', True) if empty and not raw: raise DefinitionError("Empty option can be used only with raw commands") if extra and overlap: raise DefinitionError("Extra and overlap options can not be used together") properties = { 'usage': usage, 'source': source, 'raw': raw, 'extra': extra, 'overlap': overlap, 'empty': empty, 'expand': expand } def decorator(handler): """ Decorator which receives handler as a first argument and then wraps it in the command which then returns back. """ command = Command(handler, *names, **properties) # Extract and inject a native name if either no other names are # specified or native property is enabled, while making # sure it is going to be the first one in the list. if not names or native: names.insert(0, command.native_name) command.names = tuple(names) return command # Workaround if we are getting called without parameters. Keep in # mind that in that case - first item in the names will be the # handler. if names and isinstance(names[0], FunctionType): return decorator(names.pop(0)) return decorator def doc(text): """ This decorator is used to bind a documentation (a help) to a command. """ def decorator(target): if isinstance(target, Command): target.handler.__doc__ = text else: target.__doc__ = text return target return decorator gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/command_system/implementation/000077500000000000000000000000001326020644600300415ustar00rootroot00000000000000__init__.py000066400000000000000000000015311326020644600320730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/command_system/implementation# Copyright (C) 2009-2010 Alexander Cherniuk # # 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 . """ The implementation and auxilary systems which implement the standard Gajim commands and also provide an infrastructure for adding custom commands. """ custom.py000066400000000000000000000110141326020644600316430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/command_system/implementation# Copyright (c) 2009-2010, Alexander Cherniuk (ts33kr@gmail.com) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ This module contains examples of how to create your own commands, by creating a new command container, bounded to a specific command host, and definding a set of commands inside of it. Keep in mind that this module is not being loaded from anywhere, so the code in here will not be executed and commands defined here will not be detected. """ from gajim.command_system.framework import CommandContainer, command, doc from gajim.command_system.implementation.hosts import ChatCommands, PrivateChatCommands, GroupChatCommands class CustomCommonCommands(CommandContainer): """ The AUTOMATIC class variable, set to a positive value, instructs the command system to automatically discover the command container and enable it. This command container bounds to all three available in the default implementation command hosts. This means that commands defined in this container will be available to all: chat, private chat and a group chat. """ AUTOMATIC = True HOSTS = ChatCommands, PrivateChatCommands, GroupChatCommands @command def dance(self): """ First line of the doc string is called a description and will be programmatically extracted and formatted. After that you can give more help, like explanation of the options. This one will be programatically extracted and formatted too. After all the documentation - there will be autogenerated (based on the method signature) usage information appended. You can turn it off, if you want. """ return "I don't dance." class CustomChatCommands(CommandContainer): """ This command container bounds only to the ChatCommands command host. Therefore commands defined inside of the container will be available only to a chat. """ AUTOMATIC = True HOSTS = ChatCommands, @command("squal", "bawl") def sing(self): """ This command has an additional aliases. It means the command will be available under three names: sing (the native name), squal (the first alias), bawl (the second alias). You can turn off the usage of the native name, if you want, and specify a name or a set of names, as aliases, under which a command will be available. """ return "Buy yourself a stereo." class CustomPrivateChatCommands(CommandContainer): """ This command container bounds only to the PrivateChatCommands command host. Therefore commands defined inside of the container will be available only to a private chat. """ AUTOMATIC = True HOSTS = PrivateChatCommands, @command #Example string. Do not translate @doc(_("The same as using a doc-string, except it supports translation")) def make_coffee(self): return "I'm not a coffee machine!" class CustomGroupChatCommands(CommandContainer): """ This command container bounds only to the GroupChatCommands command host. Therefore commands defined inside of the container will be available only to a group chat. """ AUTOMATIC = True HOSTS = GroupChatCommands, @command def fetch(self): return "Buy yourself a dog." execute.py000066400000000000000000000101441326020644600317760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/command_system/implementation# Copyright (c) 2010, Alexander Cherniuk (ts33kr@gmail.com) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ Provides facilities to safely execute expressions inside a shell process and capture the resulting output, in an asynchronous fashion, avoiding deadlocks. If the process execution time reaches the threshold - it is forced to terminate. Consists of a tiny framework and a couple of commands as a frontend. """ from subprocess import Popen, PIPE from os.path import expanduser from gi.repository import GLib from gajim.command_system.framework import CommandContainer, command, doc from gajim.command_system.implementation.hosts import ChatCommands, PrivateChatCommands, GroupChatCommands class Execute(CommandContainer): AUTOMATIC = True HOSTS = ChatCommands, PrivateChatCommands, GroupChatCommands DIRECTORY = "~" POLL_INTERVAL = 100 POLL_COUNT = 5 @command("exec", raw=True) @doc(_("Execute expression inside a shell, show output")) def execute(self, expression): Execute.spawn(self, expression) @classmethod def spawn(cls, processor, expression): pipes = dict(stdout=PIPE, stderr=PIPE) directory = expanduser(cls.DIRECTORY) popen = Popen(expression, shell=True, cwd=directory, **pipes) cls.monitor(processor, popen) @classmethod def monitor(cls, processor, popen): poller = cls.poller(processor, popen) GLib.timeout_add(cls.POLL_INTERVAL, next, poller) @classmethod def poller(cls, processor, popen): for _ in range(cls.POLL_COUNT): yield cls.brush(processor, popen) cls.overdue(processor, popen) yield False @classmethod def brush(cls, processor, popen): if popen.poll() is not None: cls.terminated(processor, popen) return False return True @classmethod def terminated(cls, processor, popen): stdout, stderr = cls.fetch(popen) success = popen.returncode == 0 if success and stdout: processor.echo(stdout) elif not success and stderr: processor.echo_error(stderr) @classmethod def overdue(cls, processor, popen): popen.terminate() @classmethod def fetch(cls, popen): data = popen.communicate() return map(cls.clean, data) @staticmethod def clean(text): strip = chr(10) + chr(32) return text.decode().strip(strip) class Show(Execute): @command("sh", raw=True) @doc(_("Execute expression inside a shell, send output")) def show(self, expression): Show.spawn(self, expression) @classmethod def terminated(cls, processor, popen): stdout, stderr = cls.fetch(popen) success = popen.returncode == 0 if success and stdout: processor.send(stdout) elif not success and stderr: processor.echo_error(stderr) hosts.py000066400000000000000000000026231326020644600314770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/command_system/implementation# Copyright (C) 2009-2010 Alexander Cherniuk # # 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 . """ The module defines a set of command hosts, which are bound to a different command processors, which are the source of commands. """ from gajim.command_system.framework import CommandHost class ChatCommands(CommandHost): """ This command host is bound to the command processor which processes commands from a chat. """ AUTOMATIC = True class PrivateChatCommands(CommandHost): """ This command host is bound to the command processor which processes commands from a private chat. """ AUTOMATIC = True class GroupChatCommands(CommandHost): """ This command host is bound to the command processor which processes commands from a group chat. """ AUTOMATIC = True middleware.py000066400000000000000000000156161326020644600324620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/command_system/implementation# Copyright (c) 2009-2010, Alexander Cherniuk (ts33kr@gmail.com) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ Provides a glue to tie command system framework and the actual code where it would be dropped in. Defines a little bit of scaffolding to support interaction between the two and a few utility methods so you don't need to dig up the code itself to write basic commands. """ from traceback import print_exc from gi.repository import Pango from gajim.common import app from gajim.command_system.framework import CommandProcessor from gajim.command_system.errors import CommandError, NoCommandError class ChatCommandProcessor(CommandProcessor): """ A basic scaffolding to provide convenient interaction between the command system and chat controls. It will be merged directly into the controls, by ChatCommandProcessor being among superclasses of the controls. """ def process_as_command(self, text): self.command_succeeded = False parents = super(ChatCommandProcessor, self) flag = parents.process_as_command(text) if flag and self.command_succeeded: self.add_history(text) self.clear_input() return flag def execute_command(self, name, arguments): try: parents = super(ChatCommandProcessor, self) parents.execute_command(name, arguments) except NoCommandError as error: details = dict(name=error.name, message=error.message) message = "%(name)s: %(message)s\n" % details message += "Try using the //%(name)s or /say /%(name)s " % details message += "construct if you intended to send it as a text." self.echo_error(message) except CommandError as error: self.echo_error("%s: %s" % (error.name, error.message)) except Exception: self.echo_error(_("Error during command execution!")) print_exc() else: self.command_succeeded = True def looks_like_command(self, text, body, name, arguments): # Command escape stuff goes here. If text was prepended by the # command prefix twice, like //not_a_command (if prefix is set # to /) then it will be escaped, that is sent just as a regular # message with one (only one) prefix removed, so message will be # /not_a_command. if body.startswith(self.COMMAND_PREFIX): self.send(body) return True def command_preprocessor(self, command, name, arguments, args, kwargs): # If command argument contain h or help option - forward it to # the /help command. Dont forget to pass self, as all commands # are unbound. And also don't forget to print output. if 'h' in kwargs or 'help' in kwargs: help = self.get_command('help') self.echo(help(self, name)) return True def command_postprocessor(self, command, name, arguments, args, kwargs, value): # If command returns a string - print it to a user. A convenient # and sufficient in most simple cases shortcut to a using echo. if value and isinstance(value, str): self.echo(value) class CommandTools: """ Contains a set of basic tools and shortcuts you can use in your commands to perform some simple operations. These will be merged directly into the controls, by CommandTools being among superclasses of the controls. """ def __init__(self): self.install_tags() def install_tags(self): buffer = self.conv_textview.tv.get_buffer() name = "Monospace" font = Pango.FontDescription(name) command_ok_tag = buffer.create_tag("command_ok") command_ok_tag.set_property("font-desc", font) command_ok_tag.set_property("foreground", "#3465A4") command_error_tag = buffer.create_tag("command_error") command_error_tag.set_property("font-desc", font) command_error_tag.set_property("foreground", "#F57900") def shift_line(self): buffer = self.conv_textview.tv.get_buffer() iter = buffer.get_end_iter() if iter.ends_line() and not iter.is_start(): buffer.insert_with_tags_by_name(iter, "\n", "eol") def append_with_tags(self, text, *tags): buffer = self.conv_textview.tv.get_buffer() iter = buffer.get_end_iter() buffer.insert_with_tags_by_name(iter, text, *tags) def echo(self, text, tag="command_ok"): """ Print given text to the user, as a regular command output. """ self.shift_line() self.append_with_tags(text, tag) def echo_error(self, text): """ Print given text to the user, as an error command output. """ self.echo(text, "command_error") def send(self, text): """ Send a message to the contact. """ self.send_message(text, process_commands=False) def set_input(self, text): """ Set given text into the input. """ buffer = self.msg_textview.get_buffer() buffer.set_text(text) def clear_input(self): """ Clear input. """ self.set_input(str()) def add_history(self, text): """ Add given text to the input history, so user can scroll through it using ctrl + up/down arrow keys. """ self.save_message(text, 'sent') @property def connection(self): """ Get the current connection object. """ return app.connections[self.account] @property def full_jid(self): """ Get a full JID of the contact. """ return self.contact.get_full_jid() standard.py000066400000000000000000000340251326020644600321400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/command_system/implementation# Copyright (C) 2009-2010 Alexander Cherniuk # # 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 . """ Provides an actual implementation for the standard commands. """ from time import localtime, strftime from datetime import date from gajim import dialogs from gajim.common import app from gajim.common import helpers from gajim.common.exceptions import GajimGeneralException from gajim.common.logger import KindConstant from gajim.command_system.errors import CommandError from gajim.command_system.framework import CommandContainer, command, doc from gajim.command_system.mapping import generate_usage from gajim.command_system.implementation.hosts import ChatCommands, PrivateChatCommands, GroupChatCommands class StandardCommonCommands(CommandContainer): """ This command container contains standard commands which are common to all - chat, private chat, group chat. """ AUTOMATIC = True HOSTS = ChatCommands, PrivateChatCommands, GroupChatCommands @command(overlap=True) @doc(_("Show help on a given command or a list of available commands if -a is given")) def help(self, command=None, all=False): if command: command = self.get_command(command) documentation = _(command.extract_documentation()) usage = generate_usage(command) text = [] if documentation: text.append(documentation) if command.usage: text.append(usage) return '\n\n'.join(text) elif all: for command in self.list_commands(): names = ', '.join(command.names) description = command.extract_description() self.echo("%s - %s" % (names, description)) else: help = self.get_command('help') self.echo(help(self, 'help')) @command(raw=True) @doc(_("Send a message to the contact")) def say(self, message): self.send(message) @command(raw=True) @doc(_("Send action (in the third person) to the current chat")) def me(self, action): self.send("/me %s" % action) @command('lastlog', overlap=True) @doc(_("Show logged messages which mention given text")) def grep(self, text, limit=None): results = app.logger.search_log(self.account, self.contact.jid, text) if not results: raise CommandError(_("%s: Nothing found") % text) if limit: try: results = results[len(results) - int(limit):] except ValueError: raise CommandError(_("Limit must be an integer")) for row in results: contact = row.contact_name if not contact: if row.kind == KindConstant.CHAT_MSG_SENT: contact = app.nicks[self.account] else: contact = self.contact.name time_obj = localtime(row.time) date_obj = date.fromtimestamp(row.time) date_ = strftime('%Y-%m-%d', time_obj) time_ = strftime('%H:%M:%S', time_obj) if date_obj == date.today(): formatted = "[%s] %s: %s" % (time_, contact, row.message) else: formatted = "[%s, %s] %s: %s" % (date_, time_, contact, row.message) self.echo(formatted) @command(raw=True, empty=True) #Do not translate online, away, chat, xa, dnd @doc(_(""" Set the current status Status can be given as one of the following values: online, away, chat, xa, dnd. """)) def status(self, status, message): if status not in ('online', 'away', 'chat', 'xa', 'dnd'): raise CommandError("Invalid status given") for connection in app.connections.values(): if not app.config.get_per('accounts', connection.name, 'sync_with_global_status'): continue if connection.connected < 2: continue connection.change_status(status, message) @command(raw=True, empty=True) @doc(_("Set the current status to away")) def away(self, message): if not message: message = _("Away") for connection in app.connections.values(): if not app.config.get_per('accounts', connection.name, 'sync_with_global_status'): continue if connection.connected < 2: continue connection.change_status('away', message) @command('back', raw=True, empty=True) @doc(_("Set the current status to online")) def online(self, message): if not message: message = _("Available") for connection in app.connections.values(): if not app.config.get_per('accounts', connection.name, 'sync_with_global_status'): continue if connection.connected < 2: continue connection.change_status('online', message) class StandardCommonChatCommands(CommandContainer): """ This command container contans standard commands, which are common to a chat and a private chat only. """ AUTOMATIC = True HOSTS = ChatCommands, PrivateChatCommands @command @doc(_("Clear the text window")) def clear(self): self.conv_textview.clear() @command @doc(_("Send a ping to the contact")) def ping(self): if self.account == app.ZEROCONF_ACC_NAME: raise CommandError(_('Command is not supported for zeroconf accounts')) app.connections[self.account].sendPing(self.contact) @command @doc(_("Send DTMF sequence through an open audio session")) def dtmf(self, sequence): if not self.audio_sid: raise CommandError(_("No open audio sessions with the contact")) for tone in sequence: if not (tone in ("*", "#") or tone.isdigit()): raise CommandError(_("%s is not a valid tone") % tone) gjs = self.connection.get_jingle_session session = gjs(self.full_jid, self.audio_sid) content = session.get_content("audio") content.batch_dtmf(sequence) @command @doc(_("Toggle audio session")) def audio(self): if not self.audio_available: raise CommandError(_("Audio sessions are not available")) # An audio session is toggled by inverting the state of the # appropriate button. state = self._audio_button.get_active() self._audio_button.set_active(not state) @command @doc(_("Toggle video session")) def video(self): if not self.video_available: raise CommandError(_("Video sessions are not available")) # A video session is toggled by inverting the state of the # appropriate button. state = self._video_button.get_active() self._video_button.set_active(not state) @command(raw=True) @doc(_("Send a message to the contact that will attract his (her) attention")) def attention(self, message): self.send_message(message, process_commands=False, attention=True) class StandardChatCommands(CommandContainer): """ This command container contains standard commands which are unique to a chat. """ AUTOMATIC = True HOSTS = ChatCommands, class StandardPrivateChatCommands(CommandContainer): """ This command container contains standard commands which are unique to a private chat. """ AUTOMATIC = True HOSTS = PrivateChatCommands, class StandardGroupChatCommands(CommandContainer): """ This command container contains standard commands which are unique to a group chat. """ AUTOMATIC = True HOSTS = GroupChatCommands, @command @doc(_("Clear the text window")) def clear(self): self.conv_textview.clear() self.gc_count_nicknames_colors = -1 self.gc_custom_colors = {} @command(raw=True) @doc(_("Change your nickname in a group chat")) def nick(self, new_nick): try: new_nick = helpers.parse_resource(new_nick) except Exception: raise CommandError(_("Invalid nickname")) self.connection.join_gc(new_nick, self.room_jid, None, change_nick=True) self.new_nick = new_nick @command('query', raw=True) @doc(_("Open a private chat window with a specified occupant")) def chat(self, nick): nicks = app.contacts.get_nick_list(self.account, self.room_jid) if nick in nicks: self.on_send_pm(nick=nick) else: raise CommandError(_("Nickname not found")) @command('msg', raw=True) @doc(_("Open a private chat window with a specified occupant and send him a message")) def message(self, nick, a_message): nicks = app.contacts.get_nick_list(self.account, self.room_jid) if nick in nicks: self.on_send_pm(nick=nick, msg=a_message) else: raise CommandError(_("Nickname not found")) @command(raw=True, empty=True) @doc(_("Display or change a group chat topic")) def topic(self, new_topic): if new_topic: self.connection.send_gc_subject(self.room_jid, new_topic) else: return self.subject @command(raw=True, empty=True) @doc(_("Invite a user to a room for a reason")) def invite(self, jid, reason): self.connection.send_invite(self.room_jid, jid, reason) return _("Invited %(jid)s to %(room_jid)s") % {'jid': jid, 'room_jid': self.room_jid} @command(raw=True, empty=True) @doc(_("Join a group chat given by a jid")) def join(self, jid): if '@' not in jid: jid = jid + '@' + app.get_server_from_jid(self.room_jid) app.interface.join_gc_minimal(self.account, room_jid=jid) @command('part', 'close', raw=True, empty=True) @doc(_("Leave the groupchat, optionally giving a reason, and close tab or window")) def leave(self, reason): self.parent_win.remove_tab(self, self.parent_win.CLOSE_COMMAND, reason) @command(raw=True, empty=True) @doc(_(""" Ban user by a nick or a jid from a groupchat If given nickname is not found it will be treated as a jid. """)) def ban(self, who, reason): if who in app.contacts.get_nick_list(self.account, self.room_jid): contact = app.contacts.get_gc_contact(self.account, self.room_jid, who) who = contact.jid self.connection.gc_set_affiliation(self.room_jid, who, 'outcast', reason or str()) @command(raw=True, empty=True) @doc(_("Kick user by a nick from a groupchat")) def kick(self, who, reason): if not who in app.contacts.get_nick_list(self.account, self.room_jid): raise CommandError(_("Nickname not found")) self.connection.gc_set_role(self.room_jid, who, 'none', reason or str()) @command(raw=True) #Do not translate moderator, participant, visitor, none @doc(_("""Set occupant role in group chat. Role can be given as one of the following values: moderator, participant, visitor, none""")) def role(self, who, role): if role not in ('moderator', 'participant', 'visitor', 'none'): raise CommandError(_("Invalid role given")) if not who in app.contacts.get_nick_list(self.account, self.room_jid): raise CommandError(_("Nickname not found")) self.connection.gc_set_role(self.room_jid, who, role) @command(raw=True) #Do not translate owner, admin, member, outcast, none @doc(_("""Set occupant affiliation in group chat. Affiliation can be given as one of the following values: owner, admin, member, outcast, none""")) def affiliate(self, who, affiliation): if affiliation not in ('owner', 'admin', 'member', 'outcast', 'none'): raise CommandError(_("Invalid affiliation given")) if not who in app.contacts.get_nick_list(self.account, self.room_jid): raise CommandError(_("Nickname not found")) contact = app.contacts.get_gc_contact(self.account, self.room_jid, who) self.connection.gc_set_affiliation(self.room_jid, contact.jid, affiliation) @command @doc(_("Display names of all group chat occupants")) def names(self, verbose=False): ggc = app.contacts.get_gc_contact gnl = app.contacts.get_nick_list get_contact = lambda nick: ggc(self.account, self.room_jid, nick) get_role = lambda nick: get_contact(nick).role nicks = gnl(self.account, self.room_jid) nicks = sorted(nicks) nicks = sorted(nicks, key=get_role) if not verbose: return ", ".join(nicks) for nick in nicks: contact = get_contact(nick) role = helpers.get_uf_role(contact.role) affiliation = helpers.get_uf_affiliation(contact.affiliation) self.echo("%s - %s - %s" % (nick, role, affiliation)) @command('ignore', raw=True) @doc(_("Forbid an occupant to send you public or private messages")) def block(self, who): self.on_block(None, who) @command('unignore', raw=True) @doc(_("Allow an occupant to send you public or private messages")) def unblock(self, who): self.on_unblock(None, who) @command @doc(_("Send a ping to the contact")) def ping(self, nick): if self.account == app.ZEROCONF_ACC_NAME: raise CommandError(_('Command is not supported for zeroconf accounts')) gc_c = app.contacts.get_gc_contact(self.account, self.room_jid, nick) app.connections[self.account].sendPing(gc_c, self) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/command_system/mapping.py000066400000000000000000000325321326020644600270260ustar00rootroot00000000000000# Copyright (C) 2009-2010 Alexander Cherniuk # # 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 . """ The module contains routines to parse command arguments and map them to the command handler's positonal and keyword arguments. Mapping is done in two stages: 1) parse arguments into positional arguments and options; 2) adapt them to the specific command handler according to the command properties. """ import re from operator import itemgetter from gajim.command_system.errors import DefinitionError, CommandError # Quite complex piece of regular expression logic to parse options and # arguments. Might need some tweaking along the way. ARG_PATTERN = re.compile(r'(\'|")?(?P(?(1).+?|\S+))(?(1)\1)') OPT_PATTERN = re.compile(r'(?[\w-]+)(?:(?:=|\s)(\'|")?(?P(?(2)[^-]+?|[^-\s]+))(?(2)\2))?') # Option keys needs to be encoded to a specific encoding as Python does # not allow to expand dictionary with raw unicode strings as keys from a # **kwargs. KEY_ENCODING = 'UTF-8' # Defines how complete representation of command usage (generated based # on command handler argument specification) will be rendered. USAGE_PATTERN = 'Usage: %s %s' def parse_arguments(arguments): """ Simple yet effective and sufficient in most cases parser which parses command arguments and returns them as two lists. First list represents positional arguments as (argument, position), and second representing options as (key, value, position) tuples, where position is a (start, end) span tuple of where it was found in the string. Options may be given in --long or -short format. As --option=value or --option value or -option value. Keys without values will get None as value. Arguments and option values that contain spaces may be given as 'one two three' or "one two three"; that is between single or double quotes. """ args, opts = [], [] def intersects_opts(given_start, given_end): """ Check if given span intersects with any of options. """ for key, value, (start, end) in opts: if given_start >= start and given_end <= end: return True return False def intersects_args(given_start, given_end): """ Check if given span intersects with any of arguments. """ for arg, (start, end) in args: if given_start >= start and given_end <= end: return True return False for match in re.finditer(OPT_PATTERN, arguments): if match: key = match.group('key') value = match.group('value') or None position = match.span() opts.append((key, value, position)) for match in re.finditer(ARG_PATTERN, arguments): if match: body = match.group('body') position = match.span() args.append((body, position)) # Primitive but sufficiently effective way of disposing of # conflicted sectors. Remove any arguments that intersect with # options. for arg, position in args[:]: if intersects_opts(*position): args.remove((arg, position)) # Primitive but sufficiently effective way of disposing of # conflicted sectors. Remove any options that intersect with # arguments. for key, value, position in opts[:]: if intersects_args(*position): opts.remove((key, value, position)) return args, opts def adapt_arguments(command, arguments, args, opts): """ Adapt args and opts got from the parser to a specific handler by means of arguments specified on command definition. That is transform them to *args and **kwargs suitable for passing to a command handler. Dashes (-) in the option names will be converted to underscores. So you can map --one-more-option to a one_more_option=None. If the initial value of a keyword argument is a boolean (False in most cases) - then this option will be treated as a switch, that is an option which does not take an argument. If a switch is followed by an argument - then this argument will be treated just like a normal positional argument. """ spec_args, spec_kwargs, var_args, var_kwargs = command.extract_specification() norm_kwargs = dict(spec_kwargs) # Quite complex piece of neck-breaking logic to extract raw # arguments if there is more, then one positional argument specified # by the command. In case if it's just one argument which is the # collector - this is fairly easy. But when it's more then one # argument - the neck-breaking logic of how to retrieve residual # arguments as a raw, all in one piece string, kicks in. if command.raw: if arguments: spec_fix = 1 if command.source else 0 spec_len = len(spec_args) - spec_fix arguments_end = len(arguments) - 1 # If there are any optional arguments given they should be # either an unquoted postional argument or part of the raw # argument. So we find all optional arguments that can # possibly be unquoted argument and append them as is to the # args. for key, value, (start, end) in opts[:spec_len]: if value: end -= len(value) + 1 args.append((arguments[start:end], (start, end))) args.append((value, (end, end + len(value) + 1))) else: args.append((arguments[start:end], (start, end))) # We need in-place sort here because after manipulations # with options order of arguments might be wrong and we just # can't have more complex logic to not let that happen. args.sort(key=itemgetter(1)) if spec_len > 1: try: stopper, (start, end) = args[spec_len - 2] except IndexError: raise CommandError(_("Missing arguments"), command) # The essential point of the whole play. After # boundaries are being determined (supposingly correct) # we separate raw part from the rest of arguments, which # should be normally processed. raw = arguments[end:] raw = raw.strip() or None if not raw and not command.empty: raise CommandError(_("Missing arguments"), command) # Discard residual arguments and all of the options as # raw command does not support options and if an option # is given it is rather a part of a raw argument. args = args[:spec_len - 1] opts = [] args.append((raw, (end, arguments_end))) else: # Substitue all of the arguments with only one, which # contain raw and unprocessed arguments as a string. And # discard all the options, as raw command does not # support them. args = [(arguments, (0, arguments_end))] opts = [] else: if command.empty: args.append((None, (0, 0))) else: raise CommandError(_("Missing arguments"), command) # The first stage of transforming options we have got to a format # that can be used to associate them with declared keyword # arguments. Substituting dashes (-) in their names with # underscores (_). for index, (key, value, position) in enumerate(opts): if '-' in key: opts[index] = (key.replace('-', '_'), value, position) # The second stage of transforming options to an associatable state. # Expanding short, one-letter options to a verbose ones, if # corresponding optin has been given. if command.expand: expanded = [] for spec_key, spec_value in norm_kwargs.items(): letter = spec_key[0] if len(spec_key) > 1 else None if letter and letter not in expanded: for index, (key, value, position) in enumerate(opts): if key == letter: expanded.append(letter) opts[index] = (spec_key, value, position) break # Detect switches and set their values accordingly. If any of them # carries a value - append it to args. for index, (key, value, position) in enumerate(opts): if isinstance(norm_kwargs.get(key), bool): opts[index] = (key, True, position) if value: args.append((value, position)) # Sorting arguments and options (just to be sure) in regarding to # their positions in the string. args.sort(key=itemgetter(1)) opts.sort(key=itemgetter(2)) # Stripping down position information supplied with arguments and # options as it won't be needed again. args = list(map(lambda t: t[0], args)) opts = list(map(lambda t: (t[0], t[1]), opts)) # If command has extra option enabled - collect all extra arguments # and pass them to a last positional argument command defines as a # list. if command.extra: if not var_args: spec_fix = 1 if not command.source else 2 spec_len = len(spec_args) - spec_fix extra = args[spec_len:] args = args[:spec_len] args.append(extra) else: raise DefinitionError("Can not have both, extra and *args") # Detect if positional arguments overlap keyword arguments. If so # and this is allowed by command options - then map them directly to # their options, so they can get propert further processings. spec_fix = 1 if command.source else 0 spec_len = len(spec_args) - spec_fix if len(args) > spec_len: if command.overlap: overlapped = args[spec_len:] args = args[:spec_len] for arg, (spec_key, spec_value) in zip(overlapped, spec_kwargs): opts.append((spec_key, arg)) else: raise CommandError(_("Too many arguments"), command) # Detect every switch and ensure it will not receive any arguments. # Normally this does not happen unless overlapping is enabled. for key, value in opts: initial = norm_kwargs.get(key) if isinstance(initial, bool): if not isinstance(value, bool): raise CommandError("%s: Switch can not take an argument" % key, command) # Inject the source arguments as a string as a first argument, if # command has enabled the corresponding option. if command.source: args.insert(0, arguments) # Return *args and **kwargs in the form suitable for passing to a # command handler and being expanded. return tuple(args), dict(opts) def generate_usage(command, complete=True): """ Extract handler's arguments specification and wrap them in a human-readable format usage information. If complete is given - then USAGE_PATTERN will be used to render the specification completly. """ spec_args, spec_kwargs, var_args, var_kwargs = command.extract_specification() # Remove some special positional arguments from the specifiaction, # but store their names so they can be used for usage info # generation. sp_source = spec_args.pop(0) if command.source else None sp_extra = spec_args.pop() if command.extra else None kwargs = [] letters = [] for key, value in spec_kwargs: letter = key[0] key = key.replace('_', '-') if isinstance(value, bool): value = str() else: value = '=%s' % value if letter not in letters: kwargs.append('-(-%s)%s%s' % (letter, key[1:], value)) letters.append(letter) else: kwargs.append('--%s%s' % (key, value)) usage = str() args = str() if command.raw: spec_len = len(spec_args) - 1 if spec_len: args += ('<%s>' % ', '.join(spec_args[:spec_len])) + ' ' args += ('(|%s|)' if command.empty else '|%s|') % spec_args[-1] else: if spec_args: args += '<%s>' % ', '.join(spec_args) if var_args or sp_extra: args += (' ' if spec_args else str()) + '<<%s>>' % (var_args or sp_extra) usage += args if kwargs or var_kwargs: if kwargs: usage += (' ' if args else str()) + '[%s]' % ', '.join(kwargs) if var_kwargs: usage += (' ' if args else str()) + '[[%s]]' % var_kwargs # Native name will be the first one if it is included. Otherwise, # names will be in the order they were specified. if len(command.names) > 1: names = '%s (%s)' % (command.first_name, ', '.join(command.names[1:])) else: names = command.first_name return USAGE_PATTERN % (names, usage) if complete else usage gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/command_system/tools.py000066400000000000000000000031001326020644600265200ustar00rootroot00000000000000# Copyright (c) 2010, Alexander Cherniuk (ts33kr@gmail.com) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. def remove(sequence, target): if isinstance(sequence, list): if target in sequence: sequence.remove(target) elif isinstance(sequence, dict): if target in sequence: del sequence[target] gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/000077500000000000000000000000001326020644600232625ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/__init__.py000066400000000000000000000000001326020644600253610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/account.py000066400000000000000000000021171326020644600252710ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/contacts.py ## ## Copyright (C) 2009 Stephan Erb ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## class Account(object): def __init__(self, name, contacts, gc_contacts): self.name = name self.contacts = contacts self.gc_contacts = gc_contacts def change_contact_jid(self, old_jid, new_jid): self.contacts.change_contact_jid(old_jid, new_jid) def __repr__(self): return self.name def __hash__(self): return hash(self.name) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/app.py000066400000000000000000000437371326020644600244320ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## gajim/common/app.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2005-2006 Dimitur Kirov ## Travis Shirk ## Nikos Kouremenos ## Copyright (C) 2006 Junglecow J ## Stefan Bethge ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2007-2008 Brendan Taylor ## Stephan Erb ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import os import sys import logging import locale import uuid from distutils.version import LooseVersion as V from collections import namedtuple import gi import nbxmpp import hashlib from gi.repository import GLib from gajim.common import config as c_config from gajim.common import configpaths from gajim.common import ged as ged_module from gajim.common.contacts import LegacyContactsAPI from gajim.common.events import Events interface = None # The actual interface (the gtk one for the moment) thread_interface = lambda *args: None # Interface to run a thread and then a callback config = c_config.Config() version = config.get('version') connections = {} # 'account name': 'account (connection.Connection) instance' avatar_cache = {} ipython_window = None app = None # Gtk.Application ged = ged_module.GlobalEventsDispatcher() # Global Events Dispatcher nec = None # Network Events Controller plugin_manager = None # Plugins Manager glog = logging.getLogger('gajim') logger = None gajimpaths = configpaths.gajimpaths VCARD_PATH = gajimpaths['VCARD'] AVATAR_PATH = gajimpaths['AVATAR'] MY_EMOTS_PATH = gajimpaths['MY_EMOTS'] MY_ICONSETS_PATH = gajimpaths['MY_ICONSETS'] MY_MOOD_ICONSETS_PATH = gajimpaths['MY_MOOD_ICONSETS'] MY_ACTIVITY_ICONSETS_PATH = gajimpaths['MY_ACTIVITY_ICONSETS'] MY_CACERTS = gajimpaths['MY_CACERTS'] MY_PEER_CERTS_PATH = gajimpaths['MY_PEER_CERTS'] TMP = gajimpaths['TMP'] DATA_DIR = gajimpaths['DATA'] ICONS_DIR = gajimpaths['ICONS'] HOME_DIR = gajimpaths['HOME'] PLUGINS_DIRS = [gajimpaths['PLUGINS_BASE'], gajimpaths['PLUGINS_USER']] PLUGINS_CONFIG_DIR = gajimpaths['PLUGINS_CONFIG_DIR'] MY_CERT_DIR = gajimpaths['MY_CERT'] RecentGroupchat = namedtuple('RecentGroupchat', ['room', 'server', 'nickname']) try: LANG = locale.getdefaultlocale()[0] # en_US, fr_FR, el_GR etc.. except (ValueError, locale.Error): # unknown locale, use en is better than fail LANG = None if LANG is None: LANG = 'en' else: LANG = LANG[:2] # en, fr, el etc.. os_info = None # used to cache os information transport_type = {} # list the type of transport last_message_time = {} # list of time of the latest incomming message # {acct1: {jid1: time1, jid2: time2}, } encrypted_chats = {} # list of encrypted chats {acct1: [jid1, jid2], ..} contacts = LegacyContactsAPI() gc_connected = {} # tell if we are connected to the room or not # {acct: {room_jid: True}} gc_passwords = {} # list of the pass required to enter a room # {room_jid: password} automatic_rooms = {} # list of rooms that must be automaticaly configured # and for which we have a list of invities #{account: {room_jid: {'invities': []}}} new_room_nick = None # if it's != None, use this nick instead of asking for # a new nickname when there is a conflict. groups = {} # list of groups newly_added = {} # list of contacts that has just signed in to_be_removed = {} # list of contacts that has just signed out events = Events() notification = None nicks = {} # list of our nick names in each account # should we block 'contact signed in' notifications for this account? # this is only for the first 30 seconds after we change our show # to something else than offline # can also contain account/transport_jid to block notifications for contacts # from this transport block_signed_in_notifications = {} con_types = {} # type of each connection (ssl, tls, tcp, ...) sleeper_state = {} # whether we pass auto away / xa or not #'off': don't use sleeper for this account #'online': online and use sleeper #'autoaway': autoaway and use sleeper #'autoxa': autoxa and use sleeper status_before_autoaway = {} # jid of transport contacts for which we need to ask avatar when transport will # be online transport_avatar = {} # {transport_jid: [jid_list]} # Is Gnome configured to activate on single click ? single_click = False SHOW_LIST = ['offline', 'connecting', 'online', 'chat', 'away', 'xa', 'dnd', 'invisible', 'error'] # zeroconf account name ZEROCONF_ACC_NAME = 'Local' # These will be set in app.gui_interface. idlequeue = None socks5queue = None HAVE_ZEROCONF = True try: __import__('avahi') except ImportError: try: __import__('pybonjour') except Exception: # Linux raises ImportError, Windows raises WindowsError HAVE_ZEROCONF = False HAVE_PYCRYPTO = True try: __import__('Crypto') except ImportError: HAVE_PYCRYPTO = False HAVE_GPG = True GPG_BINARY = 'gpg' try: import gnupg ''' We need https://pypi.python.org/pypi/python-gnupg but https://pypi.python.org/pypi/gnupg shares the same package name. It cannot be used as a drop-in replacement. We test with a version check if python-gnupg is installed as it is on a much lower version number than gnupg Also we need at least python-gnupg 0.3.8 ''' v_gnupg = gnupg.__version__ if V(v_gnupg) < V('0.3.8') or V(v_gnupg) > V('1.0.0'): glog.info('Gajim needs python-gnupg >= 0.3.8') HAVE_GPG = False except ImportError: HAVE_GPG = False else: import subprocess def test_gpg(binary='gpg'): if os.name == 'nt': gpg_cmd = binary + ' -h >nul 2>&1' else: gpg_cmd = binary + ' -h >/dev/null 2>&1' if subprocess.call(gpg_cmd, shell=True): return False return True if test_gpg(binary='gpg2'): GPG_BINARY = 'gpg2' if not test_gpg(binary='gpg'): HAVE_GPG = False HAVE_PYOPENSSL = True try: import OpenSSL.SSL import OpenSSL.crypto ver = OpenSSL.__version__ ver_l = [int(i) for i in ver.split('.')] if ver_l < [0, 12]: raise ImportError except Exception: HAVE_PYOPENSSL = False HAVE_FARSTREAM = True try: if os.name == 'nt': os.environ['FS_PLUGIN_PATH'] = 'gtk\\lib\\farstream-0.1' os.environ['GST_PLUGIN_PATH'] = 'gtk\\lib\\gstreamer-0.10' gi.require_version('Farstream', '0.2') from gi.repository import Farstream gi.require_version('Gst', '1.0') from gi.repository import Gst from gi.repository import GLib try: Gst.init(None) conference = Gst.ElementFactory.make('fsrtpconference', None) session = conference.new_session(Farstream.MediaType.AUDIO) del session del conference except Exception as e: glog.info(e) HAVE_FARSTREAM = False except (ImportError, ValueError): HAVE_FARSTREAM = False HAVE_GEOCLUE = True try: gi.require_version('Geoclue', '2.0') from gi.repository import Geoclue except (ImportError, ValueError): HAVE_GEOCLUE = False HAVE_UPNP_IGD = True try: gi.require_version('GUPnPIgd', '1.0') from gi.repository import GUPnPIgd gupnp_igd = GUPnPIgd.SimpleIgd() except ValueError: HAVE_UPNP_IGD = False HAVE_PYCURL = True try: __import__('pycurl') except ImportError: HAVE_PYCURL = False try: from gajim.common import sleepy if sleepy.SUPPORTED: HAVE_IDLE = True except Exception: glog.info(_('Unable to load idle module')) HAVE_IDLE = False HAVE_SPELL = False try: spell_log = logging.getLogger('gajim.speller') gi.require_version('Gspell', '1') from gi.repository import Gspell langs = Gspell.language_get_available() for lang in langs: spell_log.info('%s (%s) dict available', lang.get_name(), lang.get_code()) if langs: HAVE_SPELL = True else: spell_log.info('No dicts available') except (ImportError, ValueError): pass gajim_identity = {'type': 'pc', 'category': 'client', 'name': 'Gajim'} gajim_common_features = [nbxmpp.NS_BYTESTREAM, nbxmpp.NS_SI, nbxmpp.NS_FILE, nbxmpp.NS_MUC, nbxmpp.NS_MUC_USER, nbxmpp.NS_MUC_ADMIN, nbxmpp.NS_MUC_OWNER, nbxmpp.NS_MUC_CONFIG, nbxmpp.NS_COMMANDS, nbxmpp.NS_DISCO_INFO, 'ipv6', 'jabber:iq:gateway', nbxmpp.NS_LAST, nbxmpp.NS_PRIVACY, nbxmpp.NS_PRIVATE, nbxmpp.NS_REGISTER, nbxmpp.NS_VERSION, nbxmpp.NS_DATA, nbxmpp.NS_ENCRYPTED, 'msglog', 'sslc2s', 'stringprep', nbxmpp.NS_PING, nbxmpp.NS_TIME_REVISED, nbxmpp.NS_SSN, nbxmpp.NS_MOOD, nbxmpp.NS_ACTIVITY, nbxmpp.NS_NICK, nbxmpp.NS_ROSTERX, nbxmpp.NS_SECLABEL, nbxmpp.NS_HASHES_2, nbxmpp.NS_HASHES_MD5, nbxmpp.NS_HASHES_SHA1, nbxmpp.NS_HASHES_SHA256, nbxmpp.NS_HASHES_SHA512, nbxmpp.NS_CONFERENCE, nbxmpp.NS_CORRECT, nbxmpp.NS_EME, 'urn:xmpp:avatar:metadata+notify'] # Optional features gajim supports per account gajim_optional_features = {} # Capabilities hash per account caps_hash = {} def get_an_id(): return str(uuid.uuid4()) def get_nick_from_jid(jid): pos = jid.find('@') return jid[:pos] def get_server_from_jid(jid): pos = jid.find('@') + 1 # after @ return jid[pos:] def get_name_and_server_from_jid(jid): name = get_nick_from_jid(jid) server = get_server_from_jid(jid) return name, server def get_room_and_nick_from_fjid(jid): # fake jid is the jid for a contact in a room # gaim@conference.jabber.no/nick/nick-continued # return ('gaim@conference.jabber.no', 'nick/nick-continued') l = jid.split('/', 1) if len(l) == 1: # No nick l.append('') return l def get_real_jid_from_fjid(account, fjid): """ Return real jid or returns None, if we don't know the real jid """ room_jid, nick = get_room_and_nick_from_fjid(fjid) if not nick: # It's not a fake_jid, it is a real jid return fjid # we return the real jid real_jid = fjid if interface.msg_win_mgr.get_gc_control(room_jid, account): # It's a pm, so if we have real jid it's in contact.jid gc_contact = contacts.get_gc_contact(account, room_jid, nick) if not gc_contact: return # gc_contact.jid is None when it's not a real jid (we don't know real jid) real_jid = gc_contact.jid return real_jid def get_room_from_fjid(jid): return get_room_and_nick_from_fjid(jid)[0] def get_contact_name_from_jid(account, jid): c = contacts.get_first_contact_from_jid(account, jid) return c.name def get_jid_without_resource(jid): return jid.split('/')[0] def construct_fjid(room_jid, nick): # fake jid is the jid for a contact in a room # gaim@conference.jabber.org/nick return room_jid + '/' + nick def get_resource_from_jid(jid): jids = jid.split('/', 1) if len(jids) > 1: return jids[1] # abc@doremi.org/res/res-continued else: return '' def get_number_of_accounts(): """ Return the number of ALL accounts """ return len(connections.keys()) def get_number_of_connected_accounts(accounts_list = None): """ Returns the number of CONNECTED accounts. Uou can optionally pass an accounts_list and if you do those will be checked, else all will be checked """ connected_accounts = 0 if accounts_list is None: accounts = connections.keys() else: accounts = accounts_list for account in accounts: if account_is_connected(account): connected_accounts = connected_accounts + 1 return connected_accounts def get_connected_accounts(): """ Returns a list of CONNECTED accounts """ account_list = [] for account in connections: if account_is_connected(account): account_list.append(account) return account_list def account_is_connected(account): if account not in connections: return False if connections[account].connected > 1: # 0 is offline, 1 is connecting return True else: return False def account_is_disconnected(account): return not account_is_connected(account) def zeroconf_is_connected(): return account_is_connected(ZEROCONF_ACC_NAME) and \ config.get_per('accounts', ZEROCONF_ACC_NAME, 'is_zeroconf') def in_groupchat(account, room_jid): if room_jid not in gc_connected[account]: return False return gc_connected[account][room_jid] def get_number_of_securely_connected_accounts(): """ Return the number of the accounts that are SSL/TLS connected """ num_of_secured = 0 for account in connections.keys(): if account_is_securely_connected(account): num_of_secured += 1 return num_of_secured def account_is_securely_connected(account): if account_is_connected(account) and \ account in con_types and con_types[account] in ('tls', 'ssl'): return True else: return False def get_transport_name_from_jid(jid, use_config_setting = True): """ Returns 'aim', 'gg', 'irc' etc If JID is not from transport returns None. """ #FIXME: jid can be None! one TB I saw had this problem: # in the code block # it is a groupchat presence in handle_event_notify # jid was None. Yann why? if not jid or (use_config_setting and not config.get('use_transports_iconsets')): return host = get_server_from_jid(jid) if host in transport_type: return transport_type[host] # host is now f.e. icq.foo.org or just icq (sometimes on hacky transports) host_splitted = host.split('.') if len(host_splitted) != 0: # now we support both 'icq.' and 'icq' but not icqsucks.org host = host_splitted[0] if host in ('aim', 'irc', 'icq', 'msn', 'sms', 'tlen', 'weather', 'yahoo', 'mrim', 'facebook'): return host elif host == 'gg': return 'gadu-gadu' elif host == 'jit': return 'icq' elif host == 'facebook': return 'facebook' else: return None def jid_is_transport(jid): # if not '@' or '@' starts the jid then it is transport if jid.find('@') <= 0: return True return False def get_jid_from_account(account_name): """ Return the jid we use in the given account """ name = config.get_per('accounts', account_name, 'name') hostname = config.get_per('accounts', account_name, 'hostname') jid = name + '@' + hostname return jid def get_our_jids(): """ Returns a list of the jids we use in our accounts """ our_jids = list() for account in contacts.get_accounts(): our_jids.append(get_jid_from_account(account)) return our_jids def get_hostname_from_account(account_name, use_srv = False): """ Returns hostname (if custom hostname is used, that is returned) """ if use_srv and connections[account_name].connected_hostname: return connections[account_name].connected_hostname if config.get_per('accounts', account_name, 'use_custom_host'): return config.get_per('accounts', account_name, 'custom_host') return config.get_per('accounts', account_name, 'hostname') def get_notification_image_prefix(jid): """ Returns the prefix for the notification images """ transport_name = get_transport_name_from_jid(jid) if transport_name in ('aim', 'icq', 'msn', 'yahoo', 'facebook'): prefix = transport_name else: prefix = 'jabber' return prefix def get_name_from_jid(account, jid): """ Return from JID's shown name and if no contact returns jids """ contact = contacts.get_first_contact_from_jid(account, jid) if contact: actor = contact.get_shown_name() else: actor = jid return actor def get_muc_domain(account): return connections[account].muc_jid.get('jabber', None) def get_recent_groupchats(account): recent_groupchats = config.get_per( 'accounts', account, 'recent_groupchats').split() recent_list = [] for groupchat in recent_groupchats: jid = nbxmpp.JID(groupchat) recent = RecentGroupchat( jid.getNode(), jid.getDomain(), jid.getResource()) recent_list.append(recent) return recent_list def add_recent_groupchat(account, room_jid, nickname): recent = config.get_per( 'accounts', account, 'recent_groupchats').split() full_jid = room_jid + '/' + nickname if full_jid in recent: recent.remove(full_jid) recent.insert(0, full_jid) if len(recent) > 10: recent = recent[0:9] config_value = ' '.join(recent) config.set_per( 'accounts', account, 'recent_groupchats', config_value) def get_priority(account, show): """ Return the priority an account must have """ if not show: show = 'online' if show in ('online', 'chat', 'away', 'xa', 'dnd', 'invisible') and \ config.get_per('accounts', account, 'adjust_priority_with_status'): prio = config.get_per('accounts', account, 'autopriority_' + show) else: prio = config.get_per('accounts', account, 'priority') if prio < -128: prio = -128 elif prio > 127: prio = 127 return prio def log(domain): root = 'gajim.' return logging.getLogger(root + domain) def prefers_app_menu(): if sys.platform == 'darwin': return True if sys.platform == 'win32': return False return app.prefers_app_menu() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/atom.py000066400000000000000000000130541326020644600245770ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## src/common/atom.py ## ## Copyright (C) 2006 Jean-Marie Traissard ## Tomasz Melcer ## Copyright (C) 2006-2014 Yann Leboulanger ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## """ Atom (rfc 4287) feed parser, used to read data from atom-over-pubsub transports and services. Very simple. Actually implements only atom:entry. Implement more features if you need """ # suggestion: rewrite functions that return dates to return standard python time tuples, # exteneded to contain timezone import nbxmpp import time class PersonConstruct(nbxmpp.Node, object): """ Not used for now, as we don't need authors/contributors in pubsub.com feeds. They rarely exist there """ def __init__(self, node): ''' Create person construct from node. ''' nbxmpp.Node.__init__(self, node=node) def get_name(self): return self.getTagData('name') name = property(get_name, None, None, '''Conveys a human-readable name for the person. Should not be None, although some badly generated atom feeds don't put anything here (this is non-standard behavior, still pubsub.com sometimes does that.)''') def get_uri(self): return self.getTagData('uri') uri = property(get_uri, None, None, '''Conveys an IRI associated with the person. Might be None when not set.''') def get_email(self): return self.getTagData('email') email = property(get_email, None, None, '''Conveys an e-mail address associated with the person. Might be None when not set.''') class Entry(nbxmpp.Node, object): def __init__(self, node=None): nbxmpp.Node.__init__(self, 'entry', node=node) def __repr__(self): return '' % self.getAttr('id') class OldEntry(nbxmpp.Node, object): """ Parser for feeds from pubsub.com. They use old Atom 0.3 format with their extensions """ def __init__(self, node=None): ''' Create new Atom 0.3 entry object. ''' nbxmpp.Node.__init__(self, 'entry', node=node) def __repr__(self): return '' % self.getAttr('id') def get_feed_title(self): """ Return title of feed, where the entry was created. The result is the feed name concatenated with source-feed title """ if self.parent is not None: main_feed = self.parent.getTagData('title') else: main_feed = None if self.getTag('feed') is not None: source_feed = self.getTag('feed').getTagData('title') else: source_feed = None if main_feed is not None and source_feed is not None: return '%s: %s' % (main_feed, source_feed) elif main_feed is not None: return main_feed elif source_feed is not None: return source_feed else: return '' feed_title = property(get_feed_title, None, None, ''' Title of feed. It is built from entry''s original feed title and title of feed which delivered this entry. ''') def get_feed_link(self): """ Get source link """ try: return self.getTag('feed').getTags('link', {'rel':'alternate'})[1].getData() except Exception: return None feed_link = property(get_feed_link, None, None, ''' Link to main webpage of the feed. ''') def get_title(self): """ Get an entry's title """ return self.getTagData('title') title = property(get_title, None, None, ''' Entry's title. ''') def get_uri(self): """ Get the uri the entry points to (entry's first link element with rel='alternate' or without rel attribute) """ for element in self.getTags('link'): if 'rel' in element.attrs and element.attrs['rel']!='alternate': continue try: return element.attrs['href'] except AttributeError: pass return None uri = property(get_uri, None, None, ''' URI that is pointed by the entry. ''') def get_updated(self): """ Get the time the entry was updated last time This should be standarized, but pubsub.com sends it in human-readable format. We won't try to parse it. (Atom 0.3 uses the word «modified» for that). If there's no time given in the entry, we try with and elements. """ for name in ('updated', 'modified', 'published', 'issued'): date = self.getTagData(name) if date is not None: break if date is None: # it is not in the standard format return time.asctime() return date updated = property(get_updated, None, None, ''' Last significant modification time. ''') feed_tagline = '' gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/caps_cache.py000066400000000000000000000373571326020644600257240ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/caps_cache.py ## ## Copyright (C) 2007 Tomasz Melcer ## Travis Shirk ## Copyright (C) 2007-2014 Yann Leboulanger ## Copyright (C) 2008 Brendan Taylor ## Jonathan Schleifer ## Copyright (C) 2008-2009 Stephan Erb ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## """ Module containing all XEP-115 (Entity Capabilities) related classes Basic Idea: CapsCache caches features to hash relationships. The cache is queried through ClientCaps objects which are hold by contact instances. """ import base64 import hashlib from collections import namedtuple import logging log = logging.getLogger('gajim.c.caps_cache') import nbxmpp from nbxmpp import (NS_XHTML_IM, NS_ESESSION, NS_CHATSTATES, NS_JINGLE_ICE_UDP, NS_JINGLE_RTP_AUDIO, NS_JINGLE_RTP_VIDEO, NS_JINGLE_FILE_TRANSFER_5) # Features where we cannot safely assume that the other side supports them FEATURE_BLACKLIST = [NS_CHATSTATES, NS_XHTML_IM, NS_ESESSION, NS_JINGLE_ICE_UDP, NS_JINGLE_RTP_AUDIO, NS_JINGLE_RTP_VIDEO, NS_JINGLE_FILE_TRANSFER_5] # Query entry status codes NEW = 0 QUERIED = 1 CACHED = 2 # got the answer FAKED = 3 # allow NullClientCaps to behave as it has a cached item ################################################################################ ### Public API of this module ################################################################################ capscache = None muc_caps_cache = None def initialize(logger): """ Initialize this module """ global capscache global muc_caps_cache capscache = CapsCache(logger) muc_caps_cache = MucCapsCache() def client_supports(client_caps, requested_feature): lookup_item = client_caps.get_cache_lookup_strategy() cache_item = lookup_item(capscache) supported_features = cache_item.features if requested_feature in supported_features: return True elif not supported_features and cache_item.status in (NEW, QUERIED, FAKED): # assume feature is supported, if we don't know yet, what the client # is capable of return requested_feature not in FEATURE_BLACKLIST else: return False def create_suitable_client_caps(node, caps_hash, hash_method, fjid=None): """ Create and return a suitable ClientCaps object for the given node, caps_hash, hash_method combination. """ if not node or not caps_hash: if fjid: client_caps = NoClientCaps(fjid) else: # improper caps, ignore client capabilities. client_caps = NullClientCaps() elif not hash_method: client_caps = OldClientCaps(caps_hash, node) else: client_caps = ClientCaps(caps_hash, node, hash_method) return client_caps def compute_caps_hash(identities, features, dataforms=None, hash_method='sha-1'): """ Compute caps hash according to XEP-0115, V1.5 dataforms are nbxmpp.DataForms objects as common.dataforms don't allow several values without a field type list-multi """ if dataforms is None: dataforms = [] def sort_identities_key(i): return (i['category'], i.get('type', ''), i.get('xml:lang', '')) def sort_dataforms_key(dataform): f = dataform.getField('FORM_TYPE') return (bool(f), f.getValue()) S = '' identities.sort(key=sort_identities_key) for i in identities: c = i['category'] type_ = i.get('type', '') lang = i.get('xml:lang', '') name = i.get('name', '') S += '%s/%s/%s/%s<' % (c, type_, lang, name) features.sort() for f in features: S += '%s<' % f dataforms.sort(key=sort_dataforms_key) for dataform in dataforms: # fields indexed by var fields = {} for f in dataform.getChildren(): fields[f.getVar()] = f form_type = fields.get('FORM_TYPE') if form_type: S += form_type.getValue() + '<' del fields['FORM_TYPE'] for var in sorted(fields.keys()): S += '%s<' % var values = sorted(fields[var].getValues()) for value in values: S += '%s<' % value if hash_method == 'sha-1': hash_ = hashlib.sha1(S.encode('utf-8')) elif hash_method == 'md5': hash_ = hashlib.md5(S.encode('utf-8')) else: return '' return base64.b64encode(hash_.digest()).decode('utf-8') ################################################################################ ### Internal classes of this module ################################################################################ class AbstractClientCaps(object): """ Base class representing a client and its capabilities as advertised by a caps tag in a presence """ def __init__(self, caps_hash, node): self._hash = caps_hash self._node = node self._hash_method = None def get_discover_strategy(self): return self._discover def _discover(self, connection, jid): """ To be implemented by subclassess """ raise NotImplementedError def get_cache_lookup_strategy(self): return self._lookup_in_cache def _lookup_in_cache(self, caps_cache): """ To be implemented by subclassess """ raise NotImplementedError def get_hash_validation_strategy(self): return self._is_hash_valid def _is_hash_valid(self, identities, features, dataforms): """ To be implemented by subclassess """ raise NotImplementedError class ClientCaps(AbstractClientCaps): """ The current XEP-115 implementation """ def __init__(self, caps_hash, node, hash_method): AbstractClientCaps.__init__(self, caps_hash, node) assert hash_method != 'old' self._hash_method = hash_method def _lookup_in_cache(self, caps_cache): return caps_cache[(self._hash_method, self._hash)] def _discover(self, connection, jid): connection.discoverInfo(jid, '%s#%s' % (self._node, self._hash)) def _is_hash_valid(self, identities, features, dataforms): computed_hash = compute_caps_hash(identities, features, dataforms=dataforms, hash_method=self._hash_method) return computed_hash == self._hash class OldClientCaps(AbstractClientCaps): """ Old XEP-115 implemtation. Kept around for background competability """ def __init__(self, caps_hash, node): AbstractClientCaps.__init__(self, caps_hash, node) self._hash_method = 'old' def _lookup_in_cache(self, caps_cache): return caps_cache[('old', self._node + '#' + self._hash)] def _discover(self, connection, jid): connection.discoverInfo(jid) def _is_hash_valid(self, identities, features, dataforms): return True class NoClientCaps(AbstractClientCaps): """ For clients that don't support XEP-0115 """ def __init__(self, fjid): AbstractClientCaps.__init__(self, fjid, fjid) self._hash_method = 'no' def _lookup_in_cache(self, caps_cache): return caps_cache[('no', self._node)] def _discover(self, connection, jid): connection.discoverInfo(jid) def _is_hash_valid(self, identities, features, dataforms): return True class NullClientCaps(AbstractClientCaps): """ This is a NULL-Object to streamline caps handling if a client has not advertised any caps or has advertised them in an improper way Assumes (almost) everything is supported. """ _instance = None def __new__(cls, *args, **kwargs): """ Make it a singleton. """ if not cls._instance: cls._instance = super(NullClientCaps, cls).__new__( cls, *args, **kwargs) return cls._instance def __init__(self): AbstractClientCaps.__init__(self, None, None) self._hash_method = 'dummy' def _lookup_in_cache(self, caps_cache): # lookup something which does not exist to get a new CacheItem created cache_item = caps_cache[('dummy', '')] # Mark the item as cached so that protocol/caps.py does not update it cache_item.status = FAKED return cache_item def _discover(self, connection, jid): pass def _is_hash_valid(self, identities, features, dataforms): return False class CapsCache(object): """ This object keeps the mapping between caps data and real disco features they represent, and provides simple way to query that info """ def __init__(self, logger=None): # our containers: # __cache is a dictionary mapping: pair of hash method and hash maps # to CapsCacheItem object # __CacheItem is a class that stores data about particular # client (hash method/hash pair) self.__cache = {} class CacheItem(object): # __names is a string cache; every string long enough is given # another object, and we will have plenty of identical long # strings. therefore we can cache them __names = {} def __init__(self, hash_method, hash_, logger): # cached into db self.hash_method = hash_method self.hash = hash_ self._features = [] self._identities = [] self._logger = logger self.status = NEW self._recently_seen = False def _get_features(self): return self._features def _set_features(self, value): self._features = [] for feature in value: self._features.append(self.__names.setdefault(feature, feature)) features = property(_get_features, _set_features) def _get_identities(self): list_ = [] for i in self._identities: # transforms it back in a dict d = dict() d['category'] = i[0] if i[1]: d['type'] = i[1] if i[2]: d['xml:lang'] = i[2] if i[3]: d['name'] = i[3] list_.append(d) return list_ def _set_identities(self, value): self._identities = [] for identity in value: # dict are not hashable, so transform it into a tuple t = (identity['category'], identity.get('type'), identity.get('xml:lang'), identity.get('name')) self._identities.append(self.__names.setdefault(t, t)) identities = property(_get_identities, _set_identities) def set_and_store(self, identities, features): self.identities = identities self.features = features if self.hash_method != 'no': self._logger.add_caps_entry(self.hash_method, self.hash, identities, features) self.status = CACHED def update_last_seen(self): if not self._recently_seen: self._recently_seen = True if self.hash_method != 'no': self._logger.update_caps_time(self.hash_method, self.hash) def is_valid(self): """ Returns True if identities and features for this cache item are known. """ return self.status in (CACHED, FAKED) self.__CacheItem = CacheItem self.logger = logger def initialize_from_db(self): self._remove_outdated_caps() for hash_method, hash_, identities, features in \ self.logger.iter_caps_data(): x = self[(hash_method, hash_)] x.identities = identities x.features = features x.status = CACHED def _remove_outdated_caps(self): """ Remove outdated values from the db """ self.logger.clean_caps_table() def __getitem__(self, caps): if caps in self.__cache: return self.__cache[caps] hash_method, hash_ = caps x = self.__CacheItem(hash_method, hash_, self.logger) self.__cache[(hash_method, hash_)] = x return x def query_client_of_jid_if_unknown(self, connection, jid, client_caps): """ Start a disco query to determine caps (node, ver, exts). Won't query if the data is already in cache """ lookup_cache_item = client_caps.get_cache_lookup_strategy() q = lookup_cache_item(self) if q.status == NEW: # do query for bare node+hash pair # this will create proper object q.status = QUERIED discover = client_caps.get_discover_strategy() discover(connection, jid) else: q.update_last_seen() def forget_caps(self, client_caps): hash_method = client_caps._hash_method hash = client_caps._hash key = (hash_method, hash) if key in self.__cache: del self.__cache[key] class MucCapsCache: DiscoInfo = namedtuple('DiscoInfo', ['identities', 'features', 'data']) def __init__(self): self.cache = {} def append(self, stanza): jid = stanza.getFrom() identities, features, data = [], [], [] query_childs = stanza.getQueryChildren() if not query_childs: from gajim.common import app app.log('gajim.muc').warning('%s returned empty disco info', jid) return for child in query_childs: if child.getName() == 'identity': attr = {} for key in child.getAttrs().keys(): attr[key] = child.getAttr(key) identities.append(attr) elif child.getName() == 'feature': features.append(child.getAttr('var')) elif child.getName() == 'x': if child.getNamespace() == nbxmpp.NS_DATA: data.append(nbxmpp.DataForm(node=child)) if nbxmpp.NS_MUC not in features: # Not a MUC, dont cache info return self.cache[jid] = self.DiscoInfo(identities, features, data) def is_cached(self, jid): return jid in self.cache def supports(self, jid, feature): if jid in self.cache: if feature in self.cache[jid].features: return True return False def has_mam(self, jid): try: if nbxmpp.NS_MAM_2 in self.cache[jid].features: return True if nbxmpp.NS_MAM_1 in self.cache[jid].features: return True except (KeyError, AttributeError): return False def get_mam_namespace(self, jid): try: if nbxmpp.NS_MAM_2 in self.cache[jid].features: return nbxmpp.NS_MAM_2 elif nbxmpp.NS_MAM_1 in self.cache[jid].features: return nbxmpp.NS_MAM_1 except (KeyError, AttributeError): return gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/check_X509.py000066400000000000000000000145251326020644600254450ustar00rootroot00000000000000import logging log = logging.getLogger('gajim.c.check_X509') import OpenSSL.SSL import OpenSSL.crypto from pyasn1.type import univ, constraint, char, namedtype, tag from pyasn1.codec.der.decoder import decode from gajim.common.helpers import prep, InvalidFormat MAX = 64 oid_xmppaddr = '1.3.6.1.5.5.7.8.5' oid_dnssrv = '1.3.6.1.5.5.7.8.7' class DirectoryString(univ.Choice): componentType = namedtype.NamedTypes( namedtype.NamedType( 'teletexString', char.TeletexString().subtype( subtypeSpec=constraint.ValueSizeConstraint(1, MAX))), namedtype.NamedType( 'printableString', char.PrintableString().subtype( subtypeSpec=constraint.ValueSizeConstraint(1, MAX))), namedtype.NamedType( 'universalString', char.UniversalString().subtype( subtypeSpec=constraint.ValueSizeConstraint(1, MAX))), namedtype.NamedType( 'utf8String', char.UTF8String().subtype( subtypeSpec=constraint.ValueSizeConstraint(1, MAX))), namedtype.NamedType( 'bmpString', char.BMPString().subtype( subtypeSpec=constraint.ValueSizeConstraint(1, MAX))), namedtype.NamedType( 'ia5String', char.IA5String().subtype( subtypeSpec=constraint.ValueSizeConstraint(1, MAX))), namedtype.NamedType( 'gString', univ.OctetString().subtype( subtypeSpec=constraint.ValueSizeConstraint(1, MAX))), ) class AttributeValue(DirectoryString): pass class AttributeType(univ.ObjectIdentifier): pass class AttributeTypeAndValue(univ.Sequence): componentType = namedtype.NamedTypes( namedtype.NamedType('type', AttributeType()), namedtype.NamedType('value', AttributeValue()), ) class RelativeDistinguishedName(univ.SetOf): componentType = AttributeTypeAndValue() class RDNSequence(univ.SequenceOf): componentType = RelativeDistinguishedName() class Name(univ.Choice): componentType = namedtype.NamedTypes( namedtype.NamedType('', RDNSequence()), ) class GeneralName(univ.Choice): componentType = namedtype.NamedTypes( namedtype.NamedType('otherName', univ.Sequence().subtype( implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 0x0))), namedtype.NamedType('rfc822Name', char.IA5String().subtype( implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1))), namedtype.NamedType('dNSName', char.IA5String().subtype( implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 2))), namedtype.NamedType('x400Address', univ.Sequence().subtype( implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 0x3))), namedtype.NamedType('directoryName', Name().subtype( implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 0x4))), namedtype.NamedType('ediPartyName', univ.Sequence().subtype( implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 0x5))), namedtype.NamedType('uniformResourceIdentifier', char.IA5String().subtype( implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 6))), namedtype.NamedType('iPAddress', univ.OctetString().subtype( implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 7))), namedtype.NamedType('registeredID', univ.ObjectIdentifier().subtype( implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 8))), ) class GeneralNames(univ.SequenceOf): componentType = GeneralName() sizeSpec = univ.SequenceOf.sizeSpec + constraint.ValueSizeConstraint(1, MAX) def _parse_asn1(asn1): obj = decode(asn1, asn1Spec=GeneralNames())[0] r = {} for o in obj: name = o.getName() if name == 'dNSName': if name not in r: r[name] = [] r[name].append(str(o.getComponent())) if name == 'otherName': if name not in r: r[name] = {} tag = str(tuple(o.getComponent())[0]) val = str(tuple(o.getComponent())[1]) if tag not in r[name]: r[name][tag] = [] r[name][tag].append(val) if name == 'uniformResourceIdentifier': r['uniformResourceIdentifier'] = True return r def check_certificate(cert, domain): cnt = cert.get_extension_count() if '.' in domain: compared_domain = domain.split('.', 1)[1] else: compared_domain = '' srv_domain = '_xmpp-client.' + domain compared_srv_domain = '_xmpp-client.' + compared_domain for i in range(0, cnt): ext = cert.get_extension(i) if ext.get_short_name() == b'subjectAltName': try: r = _parse_asn1(ext.get_data()) except: log.error('Wrong data in certificate: subjectAltName=%s' % \ ext.get_data()) continue if 'otherName' in r: if oid_xmppaddr in r['otherName']: for host in r['otherName'][oid_xmppaddr]: try: host = prep(None, host, None) except InvalidFormat: continue if host == domain: return True if oid_dnssrv in r['otherName']: for host in r['otherName'][oid_dnssrv]: if host.startswith('_xmpp-client.*.'): if host.replace('*.', '', 1) == compared_srv_domain: return True continue if host == srv_domain: return True if 'dNSName' in r: for host in r['dNSName']: if host.startswith('*.'): if host[2:] == compared_domain: return True continue if host == domain: return True if r: return False break subject = cert.get_subject() if subject.commonName == domain: return True return False gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/check_paths.py000066400000000000000000000313501326020644600261120ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/check_paths.py ## ## Copyright (C) 2005-2006 Travis Shirk ## Nikos Kouremenos ## Copyright (C) 2005-2014 Yann Leboulanger ## Copyright (C) 2006 Dimitur Kirov ## Copyright (C) 2007 Tomasz Melcer ## Copyright (C) 2008 Jean-Marie Traissard ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import os import shutil import sys from gajim.common import app from gajim.common import logger # DO NOT MOVE ABOVE OF import gajim import sqlite3 as sqlite def create_log_db(): print(_('creating logs database')) con = sqlite.connect(logger.LOG_DB_PATH) os.chmod(logger.LOG_DB_PATH, 0o600) # rw only for us cur = con.cursor() # create the tables # kind can be # status, gcstatus, gc_msg, (we only recv for those 3), # single_msg_recv, chat_msg_recv, chat_msg_sent, single_msg_sent # to meet all our needs # logs.jid_id --> jids.jid_id but Sqlite doesn't do FK etc so it's done in python code # jids.jid text column will be JID if TC-related, room_jid if GC-related, # ROOM_JID/nick if pm-related. # also check optparser.py, which updates databases on gajim updates cur.executescript( ''' CREATE TABLE jids( jid_id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, jid TEXT UNIQUE, type INTEGER ); CREATE TABLE unread_messages( message_id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, jid_id INTEGER, shown BOOLEAN default 0 ); CREATE INDEX idx_unread_messages_jid_id ON unread_messages (jid_id); CREATE TABLE logs( log_line_id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, account_id INTEGER, jid_id INTEGER, contact_name TEXT, time INTEGER, kind INTEGER, show INTEGER, message TEXT, subject TEXT, additional_data TEXT, stanza_id TEXT, encryption TEXT, encryption_state TEXT, marker INTEGER ); CREATE TABLE last_archive_message( jid_id INTEGER PRIMARY KEY UNIQUE, last_mam_id TEXT, oldest_mam_timestamp TEXT, last_muc_timestamp TEXT ); CREATE INDEX idx_logs_jid_id_time ON logs (jid_id, time DESC); ''' ) con.commit() con.close() def create_cache_db(): print(_('creating cache database')) con = sqlite.connect(logger.CACHE_DB_PATH) os.chmod(logger.CACHE_DB_PATH, 0o600) # rw only for us cur = con.cursor() cur.executescript( ''' CREATE TABLE transports_cache ( transport TEXT UNIQUE, type INTEGER ); CREATE TABLE caps_cache ( hash_method TEXT, hash TEXT, data BLOB, last_seen INTEGER); CREATE TABLE rooms_last_message_time( jid_id INTEGER PRIMARY KEY UNIQUE, time INTEGER ); CREATE TABLE IF NOT EXISTS roster_entry( account_jid_id INTEGER, jid_id INTEGER, name TEXT, subscription INTEGER, ask BOOLEAN, avatar_sha TEXT, PRIMARY KEY (account_jid_id, jid_id) ); CREATE TABLE IF NOT EXISTS roster_group( account_jid_id INTEGER, jid_id INTEGER, group_name TEXT, PRIMARY KEY (account_jid_id, jid_id, group_name) ); ''' ) con.commit() con.close() def split_db(): print('spliting database') if os.name == 'nt': try: OLD_LOG_DB_FOLDER = os.path.join(os.environ['appdata'], 'Gajim') except KeyError: OLD_LOG_DB_FOLDER = '.' else: OLD_LOG_DB_FOLDER = os.path.expanduser('~/.gajim') tmp = logger.CACHE_DB_PATH logger.CACHE_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, 'cache.db') create_cache_db() back = os.getcwd() os.chdir(OLD_LOG_DB_FOLDER) con = sqlite.connect('logs.db') os.chdir(back) cur = con.cursor() cur.execute('''SELECT name FROM sqlite_master WHERE type = 'table';''') tables = cur.fetchall() # we get [('jids',), ('unread_messages',), ... tables = [t[0] for t in tables] cur.execute("ATTACH DATABASE '%s' AS cache" % logger.CACHE_DB_PATH) for table in ('caps_cache', 'rooms_last_message_time', 'roster_entry', 'roster_group', 'transports_cache'): if table not in tables: continue try: cur.executescript( 'INSERT INTO cache.%s SELECT * FROM %s;' % (table, table)) con.commit() cur.executescript('DROP TABLE %s;' % table) con.commit() except sqlite.OperationalError as e: print('error moving table %s to cache.db: %s' % (table, str(e)), file=sys.stderr) con.close() logger.CACHE_DB_PATH = tmp def check_and_possibly_move_config(): LOG_DB_PATH = logger.LOG_DB_PATH CACHE_DB_PATH = logger.CACHE_DB_PATH vars = {} vars['VCARD_PATH'] = app.VCARD_PATH vars['AVATAR_PATH'] = app.AVATAR_PATH vars['MY_EMOTS_PATH'] = app.MY_EMOTS_PATH vars['MY_ICONSETS_PATH'] = app.MY_ICONSETS_PATH vars['MY_MOOD_ICONSETS_PATH'] = app.MY_MOOD_ICONSETS_PATH vars['MY_ACTIVITY_ICONSETS_PATH'] = app.MY_ACTIVITY_ICONSETS_PATH from gajim.common import configpaths MY_DATA = configpaths.gajimpaths['MY_DATA'] MY_CONFIG = configpaths.gajimpaths['MY_CONFIG'] MY_CACHE = configpaths.gajimpaths['MY_CACHE'] if os.path.exists(LOG_DB_PATH): # File already exists return if os.name == 'nt': try: OLD_LOG_DB_FOLDER = os.path.join(os.environ['appdata'], 'Gajim') except KeyError: OLD_LOG_DB_FOLDER = '.' else: OLD_LOG_DB_FOLDER = os.path.expanduser('~/.gajim') if not os.path.exists(OLD_LOG_DB_FOLDER): return OLD_LOG_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, 'logs.db') OLD_CACHE_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, 'cache.db') vars['OLD_VCARD_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'vcards') vars['OLD_AVATAR_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'avatars') vars['OLD_MY_EMOTS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'emoticons') vars['OLD_MY_ICONSETS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'iconsets') vars['OLD_MY_MOOD_ICONSETS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'moods') vars['OLD_MY_ACTIVITY_ICONSETS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'activities') OLD_CONFIG_FILES = [] OLD_DATA_FILES = [] for f in os.listdir(OLD_LOG_DB_FOLDER): if f == 'config' or f.startswith('config.'): OLD_CONFIG_FILES.append(f) if f == 'secrets' or f.startswith('secrets.'): OLD_DATA_FILES.append(f) if f == 'cacerts.pem': OLD_DATA_FILES.append(f) if not os.path.exists(OLD_LOG_DB_PATH): return if not os.path.exists(OLD_CACHE_DB_PATH): # split database split_db() to_move = {} to_move[OLD_LOG_DB_PATH] = LOG_DB_PATH to_move[OLD_CACHE_DB_PATH] = CACHE_DB_PATH for folder in ('VCARD_PATH', 'AVATAR_PATH', 'MY_EMOTS_PATH', 'MY_ICONSETS_PATH', 'MY_MOOD_ICONSETS_PATH', 'MY_ACTIVITY_ICONSETS_PATH'): src = vars['OLD_' + folder] dst = vars[folder] to_move[src] = dst # move config files for f in OLD_CONFIG_FILES: src = os.path.join(OLD_LOG_DB_FOLDER, f) dst = os.path.join(MY_CONFIG, f) to_move[src] = dst # Move data files (secrets, cacert.pem) for f in OLD_DATA_FILES: src = os.path.join(OLD_LOG_DB_FOLDER, f) dst = os.path.join(MY_DATA, f) to_move[src] = dst for src, dst in to_move.items(): if os.path.exists(dst): continue if not os.path.exists(src): continue print(_('moving %(src)s to %(dst)s') % {'src': src, 'dst': dst}) shutil.move(src, dst) app.logger.init_vars() app.logger.attach_cache_database() def check_and_possibly_create_paths(): LOG_DB_PATH = logger.LOG_DB_PATH LOG_DB_FOLDER, LOG_DB_FILE = os.path.split(LOG_DB_PATH) CACHE_DB_PATH = logger.CACHE_DB_PATH CACHE_DB_FOLDER, CACHE_DB_FILE = os.path.split(CACHE_DB_PATH) VCARD_PATH = app.VCARD_PATH AVATAR_PATH = app.AVATAR_PATH from gajim.common import configpaths MY_DATA = configpaths.gajimpaths['MY_DATA'] MY_CONFIG = configpaths.gajimpaths['MY_CONFIG'] MY_CACHE = configpaths.gajimpaths['MY_CACHE'] XTLS_CERTS = configpaths.gajimpaths['MY_PEER_CERTS'] LOCAL_XTLS_CERTS = configpaths.gajimpaths['MY_CERT'] PLUGINS_CONFIG_PATH = app.PLUGINS_CONFIG_DIR if not os.path.exists(MY_DATA): create_path(MY_DATA) elif os.path.isfile(MY_DATA): print(_('%s is a file but it should be a directory') % MY_DATA) print(_('Gajim will now exit')) sys.exit() if not os.path.exists(MY_CONFIG): create_path(MY_CONFIG) elif os.path.isfile(MY_CONFIG): print(_('%s is a file but it should be a directory') % MY_CONFIG) print(_('Gajim will now exit')) sys.exit() if not os.path.exists(MY_CACHE): create_path(MY_CACHE) elif os.path.isfile(MY_CACHE): print(_('%s is a file but it should be a directory') % MY_CACHE) print(_('Gajim will now exit')) sys.exit() if not os.path.exists(VCARD_PATH): create_path(VCARD_PATH) elif os.path.isfile(VCARD_PATH): print(_('%s is a file but it should be a directory') % VCARD_PATH) print(_('Gajim will now exit')) sys.exit() if not os.path.exists(AVATAR_PATH): create_path(AVATAR_PATH) elif os.path.isfile(AVATAR_PATH): print(_('%s is a file but it should be a directory') % AVATAR_PATH) print(_('Gajim will now exit')) sys.exit() if not os.path.exists(LOG_DB_FOLDER): create_path(LOG_DB_FOLDER) elif os.path.isfile(LOG_DB_FOLDER): print(_('%s is a file but it should be a directory') % LOG_DB_FOLDER) print(_('Gajim will now exit')) sys.exit() if not os.path.exists(PLUGINS_CONFIG_PATH): create_path(PLUGINS_CONFIG_PATH) elif os.path.isfile(PLUGINS_CONFIG_PATH): print(_('%s is a file but it should be a directory') % PLUGINS_CONFIG_PATH) print(_('Gajim will now exit')) sys.exit() if not os.path.exists(CACHE_DB_FOLDER): create_path(CACHE_DB_FOLDER) elif os.path.isfile(CACHE_DB_FOLDER): print(_('%s is a file but it should be a directory') % CACHE_DB_FOLDER) print(_('Gajim will now exit')) sys.exit() check_and_possibly_move_config() if not os.path.exists(LOG_DB_PATH): if os.path.exists(CACHE_DB_PATH): os.remove(CACHE_DB_PATH) create_log_db() app.logger.init_vars() elif os.path.isdir(LOG_DB_PATH): print(_('%s is a directory but should be a file') % LOG_DB_PATH) print(_('Gajim will now exit')) sys.exit() if not os.path.exists(CACHE_DB_PATH): create_cache_db() app.logger.attach_cache_database() elif os.path.isdir(CACHE_DB_PATH): print(_('%s is a directory but should be a file') % CACHE_DB_PATH) print(_('Gajim will now exit')) sys.exit() if not os.path.exists(XTLS_CERTS): create_path(XTLS_CERTS) if not os.path.exists(LOCAL_XTLS_CERTS): create_path(LOCAL_XTLS_CERTS) def create_path(directory): head, tail = os.path.split(directory) if not os.path.exists(head): create_path(head) if os.path.exists(directory): return print(('creating %s directory') % directory) os.mkdir(directory, 0o700) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/commands.py000066400000000000000000000443731326020644600254500ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/commands.py ## ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2006-2007 Tomasz Melcer ## Copyright (C) 2007 Jean-Marie Traissard ## Copyright (C) 2008 Brendan Taylor ## Stephan Erb ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import nbxmpp from gajim.common import helpers from gajim.common import dataforms from gajim.common import app from gajim.common.connection_handlers_events import MessageOutgoingEvent import logging log = logging.getLogger('gajim.c.commands') class AdHocCommand: commandnode = 'command' commandname = 'The Command' commandfeatures = (nbxmpp.NS_DATA,) @staticmethod def isVisibleFor(samejid): """ This returns True if that command should be visible and invokable for others samejid - True when command is invoked by an entity with the same bare jid. """ return True def __init__(self, conn, jid, sessionid): self.connection = conn self.jid = jid self.sessionid = sessionid def buildResponse(self, request, status = 'executing', defaultaction = None, actions = None): assert status in ('executing', 'completed', 'canceled') response = request.buildReply('result') cmd = response.getTag('command', namespace=nbxmpp.NS_COMMANDS) cmd.setAttr('sessionid', self.sessionid) cmd.setAttr('node', self.commandnode) cmd.setAttr('status', status) if defaultaction is not None or actions is not None: if defaultaction is not None: assert defaultaction in ('cancel', 'execute', 'prev', 'next', 'complete') attrs = {'action': defaultaction} else: attrs = {} cmd.addChild('actions', attrs, actions) return response, cmd def badRequest(self, stanza): self.connection.connection.send(nbxmpp.Error(stanza, nbxmpp.NS_STANZAS + ' bad-request')) def cancel(self, request): response = self.buildResponse(request, status = 'canceled')[0] self.connection.connection.send(response) return False # finish the session class ChangeStatusCommand(AdHocCommand): commandnode = 'change-status' commandname = _('Change status information') def __init__(self, conn, jid, sessionid): AdHocCommand.__init__(self, conn, jid, sessionid) self.cb = self.first_step @staticmethod def isVisibleFor(samejid): """ Change status is visible only if the entity has the same bare jid """ return samejid def execute(self, request): return self.cb(request) def first_step(self, request): # first query... response, cmd = self.buildResponse(request, defaultaction = 'execute', actions = ['execute']) cmd.addChild(node = dataforms.SimpleDataForm( title = _('Change status'), instructions = _('Set the presence type and description'), fields = [ dataforms.Field('list-single', var = 'presence-type', label = 'Type of presence:', options = [ ('chat', _('Free for chat')), ('online', _('Online')), ('away', _('Away')), ('xa', _('Extended away')), ('dnd', _('Do not disturb')), ('offline', _('Offline - disconnect'))], value = 'online', required = True), dataforms.Field('text-multi', var = 'presence-desc', label = _('Presence description:'))])) self.connection.connection.send(response) # for next invocation self.cb = self.second_step return True # keep the session def second_step(self, request): # check if the data is correct try: form = dataforms.SimpleDataForm(extend = request.getTag('command').\ getTag('x')) except Exception: self.badRequest(request) return False try: presencetype = form['presence-type'].value if not presencetype in \ ('chat', 'online', 'away', 'xa', 'dnd', 'offline'): self.badRequest(request) return False except Exception: # KeyError if there's no presence-type field in form or # AttributeError if that field is of wrong type self.badRequest(request) return False try: presencedesc = form['presence-desc'].value except Exception: # same exceptions as in last comment presencedesc = '' response, cmd = self.buildResponse(request, status = 'completed') cmd.addChild('note', {}, _('The status has been changed.')) # if going offline, we need to push response so it won't go into # queue and disappear self.connection.connection.send(response, now = presencetype == 'offline') # send new status app.interface.roster.send_status(self.connection.name, presencetype, presencedesc) return False # finish the session def find_current_groupchats(account): from gajim import message_control rooms = [] for gc_control in app.interface.msg_win_mgr.get_controls( message_control.TYPE_GC) + \ app.interface.minimized_controls[account].values(): acct = gc_control.account # check if account is the good one if acct != account: continue room_jid = gc_control.room_jid nick = gc_control.nick if room_jid in app.gc_connected[acct] and \ app.gc_connected[acct][room_jid]: rooms.append((room_jid, nick,)) return rooms class LeaveGroupchatsCommand(AdHocCommand): commandnode = 'leave-groupchats' commandname = _('Leave Groupchats') def __init__(self, conn, jid, sessionid): AdHocCommand.__init__(self, conn, jid, sessionid) self.cb = self.first_step @staticmethod def isVisibleFor(samejid): """ Change status is visible only if the entity has the same bare jid """ return samejid def execute(self, request): return self.cb(request) def first_step(self, request): # first query... response, cmd = self.buildResponse(request, defaultaction = 'execute', actions=['execute']) options = [] account = self.connection.name for gc in find_current_groupchats(account): options.append(('%s' %(gc[0]), _('%(nickname)s on %(room_jid)s') % \ {'nickname': gc[1], 'room_jid': gc[0]})) if not len(options): response, cmd = self.buildResponse(request, status = 'completed') cmd.addChild('note', {}, _('You have not joined a groupchat.')) self.connection.connection.send(response) return False cmd.addChild(node=dataforms.SimpleDataForm( title = _('Leave Groupchats'), instructions = _('Choose the groupchats you want to leave'), fields=[ dataforms.Field('list-multi', var = 'groupchats', label = _('Groupchats'), options = options, required = True)])) self.connection.connection.send(response) # for next invocation self.cb = self.second_step return True # keep the session def second_step(self, request): # check if the data is correct try: form = dataforms.SimpleDataForm(extend = request.getTag('command').\ getTag('x')) except Exception: self.badRequest(request) return False try: gc = form['groupchats'].values except Exception: # KeyError if there's no groupchats in form self.badRequest(request) return False account = self.connection.name try: for room_jid in gc: gc_control = app.interface.msg_win_mgr.get_gc_control(room_jid, account) if not gc_control: gc_control = app.interface.minimized_controls[account]\ [room_jid] gc_control.shutdown() app.interface.roster.remove_groupchat(room_jid, account) continue gc_control.parent_win.remove_tab(gc_control, None, force = True) except Exception: # KeyError if there's no such room opened self.badRequest(request) return False response, cmd = self.buildResponse(request, status = 'completed') note = _('You left the following groupchats:') for room_jid in gc: note += '\n\t' + room_jid cmd.addChild('note', {}, note) self.connection.connection.send(response) return False class ForwardMessagesCommand(AdHocCommand): # http://www.xmpp.org/extensions/xep-0146.html#forward commandnode = 'forward-messages' commandname = _('Forward unread messages') @staticmethod def isVisibleFor(samejid): """ Change status is visible only if the entity has the same bare jid """ return samejid def execute(self, request): account = self.connection.name # Forward messages events = app.events.get_events(account, types=['chat', 'normal', 'printed_chat']) j, resource = app.get_room_and_nick_from_fjid(self.jid) for jid in events: for event in events[jid]: ev_typ = event.type_ if ev_typ == 'printed_chat': ev_typ = 'chat' app.nec.push_outgoing_event(MessageOutgoingEvent(None, account=account, jid=j, message=event.message, type_=ev_typ, subject=event.subject, resource=resource, forward_from=jid, delayed=event.time_)) # Inform other client of completion response, cmd = self.buildResponse(request, status = 'completed') cmd.addChild('note', {}, _('All unread messages have been forwarded.')) self.connection.connection.send(response) return False # finish the session class FwdMsgThenDisconnectCommand(AdHocCommand): commandnode = 'fwd-msd-disconnect' commandname = _('Forward unread message then disconnect') @staticmethod def isVisibleFor(samejid): """ Change status is visible only if the entity has the same bare jid """ return samejid def execute(self, request): account = self.connection.name # Forward messages events = app.events.get_events(account, types=['chat', 'normal']) j, resource = app.get_room_and_nick_from_fjid(self.jid) for jid in events: for event in events[jid]: ev_typ = event.type_ if ev_typ == 'printed_chat': ev_typ = 'chat' app.nec.push_outgoing_event(MessageOutgoingEvent(None, account=account, jid=j, message=event.message, type_=ev_typ, subject=event.subject, resource=resource, forward_from=jid, delayed=event.time_, now=True)) response, cmd = self.buildResponse(request, status = 'completed') cmd.addChild('note', {}, _('The status has been changed.')) # if going offline, we need to push response so it won't go into # queue and disappear self.connection.connection.send(response, now = True) # send new status app.interface.roster.send_status(self.connection.name, 'offline', '') # finish the session return False class ConnectionCommands: """ This class depends on that it is a part of Connection() class """ def __init__(self): # a list of all commands exposed: node -> command class self.__commands = {} if app.config.get('remote_commands'): for cmdobj in (ChangeStatusCommand, ForwardMessagesCommand, LeaveGroupchatsCommand, FwdMsgThenDisconnectCommand): self.__commands[cmdobj.commandnode] = cmdobj # a list of sessions; keys are tuples (jid, sessionid, node) self.__sessions = {} def getOurBareJID(self): return app.get_jid_from_account(self.name) def isSameJID(self, jid): """ Test if the bare jid given is the same as our bare jid """ return nbxmpp.JID(jid).getStripped() == self.getOurBareJID() def commandListQuery(self, con, iq_obj): iq = iq_obj.buildReply('result') jid = helpers.get_full_jid_from_iq(iq_obj) q = iq.getTag('query') # buildReply don't copy the node attribute. Re-add it q.setAttr('node', nbxmpp.NS_COMMANDS) for node, cmd in self.__commands.items(): if cmd.isVisibleFor(self.isSameJID(jid)): q.addChild('item', { # TODO: find the jid 'jid': self.getOurBareJID() + '/' + self.server_resource, 'node': node, 'name': cmd.commandname}) self.connection.send(iq) def commandInfoQuery(self, con, iq_obj): """ Send disco#info result for query for command (JEP-0050, example 6.). Return True if the result was sent, False if not """ try: jid = helpers.get_full_jid_from_iq(iq_obj) except helpers.InvalidFormat: log.warning('Invalid JID: %s, ignoring it' % iq_obj.getFrom()) return node = iq_obj.getTagAttr('query', 'node') if node not in self.__commands: return False cmd = self.__commands[node] if cmd.isVisibleFor(self.isSameJID(jid)): iq = iq_obj.buildReply('result') q = iq.getTag('query') q.addChild('identity', attrs = {'type': 'command-node', 'category': 'automation', 'name': cmd.commandname}) q.addChild('feature', attrs = {'var': nbxmpp.NS_COMMANDS}) for feature in cmd.commandfeatures: q.addChild('feature', attrs = {'var': feature}) self.connection.send(iq) return True return False def commandItemsQuery(self, con, iq_obj): """ Send disco#items result for query for command. Return True if the result was sent, False if not. """ jid = helpers.get_full_jid_from_iq(iq_obj) node = iq_obj.getTagAttr('query', 'node') if node not in self.__commands: return False cmd = self.__commands[node] if cmd.isVisibleFor(self.isSameJID(jid)): iq = iq_obj.buildReply('result') self.connection.send(iq) return True return False def _CommandExecuteCB(self, con, iq_obj): jid = helpers.get_full_jid_from_iq(iq_obj) cmd = iq_obj.getTag('command') if cmd is None: return node = cmd.getAttr('node') if node is None: return sessionid = cmd.getAttr('sessionid') if sessionid is None: # we start a new command session... only if we are visible for the jid # and command exist if node not in self.__commands.keys(): self.connection.send( nbxmpp.Error(iq_obj, nbxmpp.NS_STANZAS + ' item-not-found')) raise nbxmpp.NodeProcessed newcmd = self.__commands[node] if not newcmd.isVisibleFor(self.isSameJID(jid)): return # generate new sessionid sessionid = self.connection.getAnID() # create new instance and run it obj = newcmd(conn = self, jid = jid, sessionid = sessionid) rc = obj.execute(iq_obj) if rc: self.__sessions[(jid, sessionid, node)] = obj raise nbxmpp.NodeProcessed else: # the command is already running, check for it magictuple = (jid, sessionid, node) if magictuple not in self.__sessions: # we don't have this session... ha! return action = cmd.getAttr('action') obj = self.__sessions[magictuple] try: if action == 'cancel': rc = obj.cancel(iq_obj) elif action == 'prev': rc = obj.prev(iq_obj) elif action == 'next': rc = obj.next(iq_obj) elif action == 'execute' or action is None: rc = obj.execute(iq_obj) elif action == 'complete': rc = obj.complete(iq_obj) else: # action is wrong. stop the session, send error raise AttributeError except AttributeError: # the command probably doesn't handle invoked action... # stop the session, return error del self.__sessions[magictuple] return # delete the session if rc is False if not rc: del self.__sessions[magictuple] raise nbxmpp.NodeProcessed gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/config.py000066400000000000000000001511501326020644600251040ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/config.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2004-2005 Vincent Hanquez ## Copyright (C) 2005 Stéphan Kochen ## Copyright (C) 2005-2006 Dimitur Kirov ## Alex Mauer ## Nikos Kouremenos ## Copyright (C) 2005-2007 Travis Shirk ## Copyright (C) 2006 Stefan Bethge ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2007 James Newton ## Julien Pivotto ## Copyright (C) 2007-2008 Brendan Taylor ## Stephan Erb ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import re from gi.repository import GLib from enum import IntEnum, unique import gajim @unique class Option(IntEnum): TYPE = 0 VAL = 1 DESC = 2 # If Option.RESTART is True - we need restart to use our changed option # Option.DESC also should be there RESTART = 3 opt_int = [ 'integer', 0 ] opt_str = [ 'string', 0 ] opt_bool = [ 'boolean', 0 ] opt_color = [ 'color', '^(#[0-9a-fA-F]{6})|()|rgb\(\d+,\d+,\d+\)|rgba\(\d+,\d+,\d+,[01]\.?\d*\)$' ] opt_one_window_types = ['never', 'always', 'always_with_roster', 'peracct', 'pertype'] opt_show_roster_on_startup = ['always', 'never', 'last_state'] opt_treat_incoming_messages = ['', 'chat', 'normal'] class Config: DEFAULT_ICONSET = 'dcraven' DEFAULT_MOOD_ICONSET = 'default' DEFAULT_ACTIVITY_ICONSET = 'default' DEFAULT_OPENWITH = 'xdg-open' DEFAULT_BROWSER = 'firefox' DEFAULT_MAILAPP = 'mozilla-thunderbird -compose' DEFAULT_FILE_MANAGER = 'xffm' __options = ({ # name: [ type, default_value, help_string ] 'verbose': [ opt_bool, False, '', True ], 'autopopup': [ opt_bool, False ], 'notify_on_signin': [ opt_bool, True ], 'notify_on_signout': [ opt_bool, False ], 'notify_on_new_message': [ opt_bool, True ], 'autopopupaway': [ opt_bool, False ], 'autopopup_chat_opened': [ opt_bool, False, _('Show desktop notification even when a chat window is opened for this contact and does not have focus') ], 'sounddnd': [ opt_bool, False, _('Play sound when user is busy')], 'showoffline': [ opt_bool, False ], 'show_only_chat_and_online': [ opt_bool, False, _('Show only online and free for chat contacts in roster.')], 'show_transports_group': [ opt_bool, True ], 'autoaway': [ opt_bool, True ], 'autoawaytime': [ opt_int, 5, _('Time in minutes, after which your status changes to away.') ], 'autoaway_message': [ opt_str, _('$S (Away as a result of being idle more than $T min)'), _('$S will be replaced by current status message, $T by autoawaytime.') ], 'autoxa': [ opt_bool, True ], 'autoxatime': [ opt_int, 15, _('Time in minutes, after which your status changes to not available.') ], 'autoxa_message': [ opt_str, _('$S (Not available as a result of being idle more than $T min)'), _('$S will be replaced by current status message, $T by autoxatime.') ], 'ask_online_status': [ opt_bool, False ], 'ask_offline_status': [ opt_bool, False ], 'trayicon': [opt_str, 'always', _("When to show notification area icon. Can be 'never', 'on_event', 'always'."), False], 'allow_hide_roster': [opt_bool, False, _("Allow to hide the roster window even if the tray icon is not shown."), False], 'iconset': [ opt_str, DEFAULT_ICONSET, '', True ], 'mood_iconset': [ opt_str, DEFAULT_MOOD_ICONSET, '', True ], 'activity_iconset': [ opt_str, DEFAULT_ACTIVITY_ICONSET, '', True ], 'use_transports_iconsets': [ opt_bool, True, '', True ], 'inmsgcolor': [ opt_color, '#a40000', _('Incoming nickname color.'), True ], 'outmsgcolor': [ opt_color, '#3465a4', _('Outgoing nickname color.'), True ], 'inmsgtxtcolor': [ opt_color, '', _('Incoming text color.'), True ], 'outmsgtxtcolor': [ opt_color, '#555753', _('Outgoing text color.'), True ], 'statusmsgcolor': [ opt_color, '#4e9a06', _('Status message text color.'), True ], 'markedmsgcolor': [ opt_color, '#ff8080', '', True ], 'urlmsgcolor': [ opt_color, '#204a87', '', True ], 'notif_signin_color': [ opt_color, '#32CD32', _('Contact signed in notification color.') ], # limegreen 'notif_signout_color': [ opt_color, '#FF0000', _('Contact signout notification color') ], # red 'notif_message_color': [ opt_color, '#1E90FF', _('New message notification color.') ], # dodgerblue 'notif_ftrequest_color': [ opt_color, '#F0E68C', _('File transfer request notification color.') ], # khaki 'notif_fterror_color': [ opt_color, '#B22222', _('File transfer error notification color.') ], # firebrick 'notif_ftcomplete_color': [ opt_color, '#9ACD32', _('File transfer complete or stopped notification color.') ], # yellowgreen 'notif_invite_color': [ opt_color, '#D2B48C', _('Groupchat invitation notification color') ], # tan1 'notif_status_color': [ opt_color, '#D8BFD8', _('Background color of status changed notification') ], # thistle2 'notif_other_color': [ opt_color, '#FFFFFF', _('Other dialogs color.') ], # white 'inmsgfont': [ opt_str, '', _('Incoming nickname font.'), True ], 'outmsgfont': [ opt_str, '', _('Outgoing nickname font.'), True ], 'inmsgtxtfont': [ opt_str, '', _('Incoming text font.'), True ], 'outmsgtxtfont': [ opt_str, '', _('Outgoing text font.'), True ], 'statusmsgfont': [ opt_str, '', _('Status message text font.'), True ], 'collapsed_rows': [ opt_str, '', _('List (space separated) of rows (accounts and groups) that are collapsed.'), True ], 'roster_theme': [ opt_str, _('default'), '', True ], 'mergeaccounts': [ opt_bool, False, '', True ], 'sort_by_show_in_roster': [ opt_bool, True, '', True ], 'sort_by_show_in_muc': [ opt_bool, False, '', True ], 'use_speller': [ opt_bool, False, ], 'ignore_incoming_xhtml': [ opt_bool, False, ], 'speller_language': [ opt_str, '', _('Language used by speller')], 'print_time': [ opt_str, 'always', _('\'always\' - print time for every message.\n\'sometimes\' - print time every print_ichat_every_foo_minutes minute.\n\'never\' - never print time.')], 'print_time_fuzzy': [ opt_int, 0, _('Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. This is used only if print_time is \'sometimes\'.') ], 'emoticons_theme': [opt_str, 'noto-emoticons', '', True ], 'ascii_emoticons': [opt_bool, True, _('Enable ASCII emoticons'), True], 'ascii_formatting': [ opt_bool, True, _('Treat * / _ pairs as possible formatting characters.'), True], 'show_ascii_formatting_chars': [ opt_bool, True, _('If True, do not ' 'remove */_ . So *abc* will be bold but with * * not removed.')], 'rst_formatting_outgoing_messages': [ opt_bool, False, _('Uses ReStructured text markup to send HTML, plus ascii formatting if selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html (If you want to use this, install docutils)')], 'sounds_on': [ opt_bool, True ], # 'aplay', 'play', 'esdplay', 'artsplay' detected first time only 'soundplayer': [ opt_str, '' ], 'openwith': [ opt_str, DEFAULT_OPENWITH ], 'custombrowser': [ opt_str, DEFAULT_BROWSER ], 'custommailapp': [ opt_str, DEFAULT_MAILAPP ], 'custom_file_manager': [ opt_str, DEFAULT_FILE_MANAGER ], 'gc-hpaned-position': [opt_int, 430], 'gc_refer_to_nick_char': [opt_str, ',', _('Character to add after nickname when using nick completion (tab) in group chat.')], 'gc_proposed_nick_char': [opt_str, '_', _('Character to propose to add after desired nickname when desired nickname is used by someone else in group chat.')], 'msgwin-max-state': [opt_bool, False], 'msgwin-x-position': [opt_int, -1], # Default is to let the window manager decide 'msgwin-y-position': [opt_int, -1], # Default is to let the window manager decide 'msgwin-width': [opt_int, 500], 'msgwin-height': [opt_int, 440], 'chat-msgwin-x-position': [opt_int, -1], # Default is to let the window manager decide 'chat-msgwin-y-position': [opt_int, -1], # Default is to let the window manager decide 'chat-msgwin-width': [opt_int, 480], 'chat-msgwin-height': [opt_int, 440], 'gc-msgwin-x-position': [opt_int, -1], # Default is to let the window manager decide 'gc-msgwin-y-position': [opt_int, -1], # Default is to let the window manager decide 'gc-msgwin-width': [opt_int, 600], 'gc-msgwin-height': [opt_int, 440], 'pm-msgwin-x-position': [opt_int, -1], # Default is to let the window manager decide 'pm-msgwin-y-position': [opt_int, -1], # Default is to let the window manager decide 'pm-msgwin-width': [opt_int, 480], 'pm-msgwin-height': [opt_int, 440], 'single-msg-x-position': [opt_int, 0], 'single-msg-y-position': [opt_int, 0], 'single-msg-width': [opt_int, 400], 'single-msg-height': [opt_int, 280], 'save-roster-position': [opt_bool, True, _('If True, Gajim will save roster position when hiding roster, and restore it when showing roster.')], 'roster_x-position': [ opt_int, 0 ], 'roster_y-position': [ opt_int, 0 ], 'roster_width': [ opt_int, 200 ], 'roster_height': [ opt_int, 400 ], 'roster_hpaned_position': [opt_int, 200], 'roster_on_the_right': [opt_bool, False, _('Place the roster on the right in single window mode'), True], 'history_window_width': [ opt_int, 650 ], 'history_window_height': [ opt_int, 450 ], 'history_window_x-position': [ opt_int, 0 ], 'history_window_y-position': [ opt_int, 0 ], 'latest_disco_addresses': [ opt_str, '' ], 'time_stamp': [ opt_str, '[%X] ', _('This option let you customize timestamp that is printed in conversation. For exemple "[%H:%M] " will show "[hour:minute] ". See python doc on strftime for full documentation: http://docs.python.org/lib/module-time.html') ], 'before_nickname': [ opt_str, '', _('Characters that are printed before the nickname in conversations') ], 'after_nickname': [ opt_str, ':', _('Characters that are printed after the nickname in conversations') ], 'use_gpg_agent': [ opt_bool, False ], 'change_roster_title': [ opt_bool, True, _('Add * and [n] in roster title?')], 'restore_lines': [opt_int, 10, _('How many history messages should be restored when a chat tab/window is reopened?')], 'restore_timeout': [opt_int, -1, _('How far back in time (minutes) history is restored. -1 means no limit.')], 'muc_restore_lines': [opt_int, 100, _('How many lines to request from server when entering a groupchat. -1 means no limit')], 'muc_restore_timeout': [opt_int, -1, _('Minutes of backlog to request when entering a groupchat. -1 means no limit')], 'muc_autorejoin_timeout': [opt_int, 1, _('How many seconds to wait before trying to autorejoin to a conference you are being disconnected from. Set to 0 to disable autorejoining.')], 'muc_autorejoin_on_kick': [opt_bool, False, _('Should autorejoin be activated when we are being kicked from a conference?')], 'send_on_ctrl_enter': [opt_bool, False, _('Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ Client default behaviour).')], 'last_roster_visible': [opt_bool, True], 'key_up_lines': [opt_int, 25, _('How many lines to store for Ctrl+KeyUP.')], 'version': [ opt_str, gajim.__version__ ], # which version created the config 'search_engine': [opt_str, 'https://www.google.com/search?&q=%s&sourceid=gajim'], 'dictionary_url': [opt_str, 'WIKTIONARY', _("Either custom url with %%s in it where %%s is the word/phrase or 'WIKTIONARY' which means use wiktionary.")], 'always_english_wikipedia': [opt_bool, False], 'always_english_wiktionary': [opt_bool, True], 'remote_control': [opt_bool, False, _('If checked, Gajim can be controlled remotely using gajim-remote.'), True], 'outgoing_chat_state_notifications': [opt_str, 'all', _('Sent chat state notifications. Can be one of all, composing_only, disabled.')], 'displayed_chat_state_notifications': [opt_str, 'all', _('Displayed chat state notifications in chat windows. Can be one of all, composing_only, disabled.')], 'autodetect_browser_mailer': [opt_bool, True, '', True], 'print_ichat_every_foo_minutes': [opt_int, 5, _('When not printing time for every message (print_time==sometimes), print it every x minutes.')], 'confirm_close_muc': [opt_bool, True, _('Ask before closing a group chat tab/window.')], 'confirm_close_muc_rooms': [opt_str, '', _('Always ask for confirmation before closing groupchats with any of the JIDs on this space separated list.')], 'noconfirm_close_muc_rooms': [opt_str, '', _('Never ask for confirmation before closing groupchats with any of the JIDs on this space separated list.')], 'confirm_close_multiple_tabs': [opt_bool, True, _('Ask before closing tabbed chat window if there are controls that can lose data (chat, private chat, groupchat that will not be minimized)')], 'notify_on_file_complete': [opt_bool, True], 'file_transfers_port': [opt_int, 28011], 'ft_add_hosts_to_send': [opt_str, '', _('Comma separated list of hosts that we send, in addition of local interfaces, for File Transfer in case of address translation/port forwarding.')], 'conversation_font': [opt_str, ''], 'use_kib_mib': [opt_bool, False, _('IEC standard says KiB = 1024 bytes, KB = 1000 bytes.')], 'notify_on_all_muc_messages': [opt_bool, False], 'trayicon_notification_on_events': [opt_bool, True, _('Notify of events in the notification area.')], 'trayicon_blink': [opt_bool, True, _('If False, Gajim will display a static event icon instead of the blinking status icon in the notification area when notifying on event.')], 'last_save_dir': [opt_str, ''], 'last_send_dir': [opt_str, ''], 'last_emoticons_dir': [opt_str, ''], 'last_sounds_dir': [opt_str, ''], 'tabs_position': [opt_str, 'top'], 'tabs_always_visible': [opt_bool, False, _('Show tab when only one conversation?')], 'tabs_border': [opt_bool, False, _('Show tabbed notebook border in chat windows?')], 'tabs_close_button': [opt_bool, True, _('Show close button in tab?')], 'esession_modp': [opt_str, '15,16,14', _('A list of modp groups to use in a Diffie-Hellman, highest preference first, separated by commas. Valid groups are 1, 2, 5, 14, 15, 16, 17 and 18. Higher numbers are more secure, but take longer to calculate when you start a session.')], 'tooltip_status_online_color': [opt_color, '#73D216'], 'tooltip_status_free_for_chat_color': [opt_color, '#3465A4'], 'tooltip_status_away_color': [opt_color, '#EDD400'], 'tooltip_status_busy_color': [opt_color, '#F57900'], 'tooltip_status_na_color': [opt_color, '#CC0000'], 'tooltip_status_offline_color': [opt_color, '#555753'], 'tooltip_affiliation_none_color': [opt_color, '#555753'], 'tooltip_affiliation_member_color': [opt_color, '#73D216'], 'tooltip_affiliation_administrator_color': [opt_color, '#F57900'], 'tooltip_affiliation_owner_color': [opt_color, '#CC0000'], 'tooltip_account_name_color': [opt_color, '#888A85'], 'tooltip_idle_color': [opt_color, '#888A85'], 'notification_preview_message': [opt_bool, True, _('Preview new messages in notification popup?')], 'notification_position_x': [opt_int, -1], 'notification_position_y': [opt_int, -1], 'muc_highlight_words': [opt_str, '', _('A semicolon-separated list of words that will be highlighted in group chats.')], 'quit_on_roster_x_button': [opt_bool, False, _('If True, quits Gajim when X button of Window Manager is clicked. This setting is taken into account only if notification icon is used.')], 'hide_on_roster_x_button': [opt_bool, False, _('If True, Gajim hides the Roster window on pressing the X button instead of minimizing into the Dock.')], 'show_unread_tab_icon': [opt_bool, False, _('If True, Gajim will display an icon on each tab containing unread messages. Depending on the theme, this icon may be animated.')], 'show_status_msgs_in_roster': [opt_bool, True, _('If True, Gajim will display the status message, if not empty, for every contact under the contact name in roster window.'), True], 'show_avatars_in_roster': [opt_bool, True, '', True], 'show_mood_in_roster': [opt_bool, True, '', True], 'show_activity_in_roster': [opt_bool, True, '', True], 'show_tunes_in_roster': [opt_bool, True, '', True], 'show_location_in_roster': [opt_bool, True, '', True], 'avatar_position_in_roster': [opt_str, 'right', _('Define the position of the avatar in roster. Can be left or right'), True], 'print_status_in_chats': [opt_bool, False, _('If False, Gajim will no longer print status line in chats when a contact changes his or her status and/or his or her status message.')], 'print_status_in_muc': [opt_str, 'none', _('Can be "none", "all" or "in_and_out". If "none", Gajim will no longer print status line in groupchats when a member changes his or her status and/or his or her status message. If "all" Gajim will print all status messages. If "in_and_out", Gajim will only print FOO enters/leaves group chat.')], 'log_contact_status_changes': [opt_bool, False], 'log_xhtml_messages': [opt_bool, False, _('Log XHTML messages instead of plain text messages.')], 'just_connected_bg_color': [opt_str, '#adc3c6', _('Background color of contacts when they just signed in.')], 'just_disconnected_bg_color': [opt_str, '#ab6161', _('Background color of contacts when they just signed out.')], 'restored_messages_color': [opt_color, '#555753'], 'restored_messages_small': [opt_bool, True, _('If True, restored messages will use a smaller font than the default one.')], 'hide_avatar_of_transport': [opt_bool, False, _('Don\'t show avatar for the transport itself.')], 'roster_window_skip_taskbar': [opt_bool, False, _('Don\'t show roster in the system taskbar.')], 'use_urgency_hint': [opt_bool, True, _('If True and installed GTK+ and PyGTK versions are at least 2.8, make the window flash (the default behaviour in most Window Managers) when holding pending events.')], 'notification_timeout': [opt_int, 5], 'send_sha_in_gc_presence': [opt_bool, True, _('Jabberd1.4 does not like sha info when one join a password protected group chat. Turn this option to False to stop sending sha info in group chat presences.')], 'one_message_window': [opt_str, 'always', #always, never, peracct, pertype should not be translated _('Controls the window where new messages are placed.\n\'always\' - All messages are sent to a single window.\n\'always_with_roster\' - Like \'always\' but the messages are in a single window along with the roster.\n\'never\' - All messages get their own window.\n\'peracct\' - Messages for each account are sent to a specific window.\n\'pertype\' - Each message type (e.g. chats vs. groupchats) is sent to a specific window.')], 'show_roster_on_startup':[opt_str, 'always', _('Show roster on startup.\n\'always\' - Always show roster.\n\'never\' - Never show roster.\n\'last_state\' - Restore the last state roster.')], 'show_avatar_in_chat': [opt_bool, True, _('If False, you will no longer see the avatar in the chat window.')], 'escape_key_closes': [opt_bool, True, _('If True, pressing the escape key closes a tab/window.')], 'hide_groupchat_banner': [opt_bool, False, _('Hides the banner in a group chat window')], 'hide_chat_banner': [opt_bool, False, _('Hides the banner in two persons chat window')], 'hide_groupchat_occupants_list': [opt_bool, False, _('Hides the group chat occupants list in group chat window.')], 'chat_merge_consecutive_nickname': [opt_bool, False, _('In a chat, show the nickname at the beginning of a line only when it\'s not the same person talking than in previous message.')], 'chat_merge_consecutive_nickname_indent': [opt_str, ' ', _('Indentation when using merge consecutive nickname.')], 'gc_nicknames_colors': [ opt_str, '#4e9a06:#f57900:#ce5c00:#3465a4:#204a87:#75507b:#5c3566:#c17d11:#8f5902:#ef2929:#cc0000:#a40000', _('List of colors, separated by ":", that will be used to color nicknames in group chats.'), True ], 'ctrl_tab_go_to_next_composing': [opt_bool, True, _('Ctrl-Tab go to next composing tab when none is unread.')], 'confirm_metacontacts': [ opt_str, '', _('Should we show the confirm metacontacts creation dialog or not? Empty string means we never show the dialog.')], 'confirm_block': [ opt_str, '', _('Should we show the confirm block contact dialog or not? Empty string means we never show the dialog.')], 'confirm_custom_status': [ opt_str, '', _('Should we show the confirm custom status dialog or not? Empty string means we never show the dialog.')], 'enable_negative_priority': [ opt_bool, False, _('If True, you will be able to set a negative priority to your account in account modification window. BE CAREFUL, when you are logged in with a negative priority, you will NOT receive any message from your server.')], 'show_contacts_number': [opt_bool, True, _('If True, Gajim will show number of online and total contacts in account and group rows.')], 'treat_incoming_messages': [ opt_str, '', _('Can be empty, \'chat\' or \'normal\'. If not empty, treat all incoming messages as if they were of this type')], 'scroll_roster_to_last_message': [opt_bool, True, _('If True, Gajim will scroll and select the contact who sent you the last message, if chat window is not already opened.')], 'change_status_window_timeout': [opt_int, 15, _('Time of inactivity needed before the change status window closes down.')], 'max_conversation_lines': [opt_int, 500, _('Maximum number of lines that are printed in conversations. Oldest lines are cleared.')], 'attach_notifications_to_systray': [opt_bool, False, _('If True, notification windows from notification-daemon will be attached to notification icon.')], 'check_idle_every_foo_seconds': [opt_int, 2, _('Choose interval between 2 checks of idleness.')], 'uri_schemes': [opt_str, 'aaa:// aaas:// acap:// cap:// cid: crid:// data: dav: dict:// dns: fax: file:/ ftp:// geo: go: gopher:// h323: http:// https:// iax: icap:// im: imap:// info: ipp:// iris: iris.beep: iris.xpc: iris.xpcs: iris.lwz: ldap:// mid: modem: msrp:// msrps:// mtqp:// mupdate:// news: nfs:// nntp:// opaquelocktoken: pop:// pres: prospero:// rtsp:// service: shttp:// sip: sips: sms: snmp:// soap.beep:// soap.beeps:// tag: tel: telnet:// tftp:// thismessage:/ tip:// tv: urn:// vemmi:// xmlrpc.beep:// xmlrpc.beeps:// z39.50r:// z39.50s:// about: apt: cvs:// daap:// ed2k:// feed: fish:// git:// iax2: irc:// ircs:// ldaps:// magnet: mms:// rsync:// ssh:// svn:// sftp:// smb:// webcal:// aesgcm://', _('Valid uri schemes. Only schemes in this list will be accepted as "real" uri. (mailto and xmpp are handled separately)'), True], 'shell_like_completion': [ opt_bool, False, _('If True, completion in groupchats will be like a shell auto-completion')], 'show_self_contact': [opt_str, 'when_other_resource', _('When is self contact row displayed. Can be "always", "when_other_resource" or "never"'), True], 'audio_input_device': [opt_str, 'autoaudiosrc ! volume name=gajim_vol'], 'audio_output_device': [opt_str, 'autoaudiosink'], 'video_input_device': [opt_str, 'autovideosrc'], 'video_output_device': [opt_str, 'autovideosink'], 'video_framerate': [opt_str, '', _('Optionally fix jingle output video framerate. Example: 10/1 or 25/2')], 'video_size': [opt_str, '', _('Optionally resize jingle output video. Example: 320x240')], 'video_see_self': [opt_bool, True, _('If True, You will also see your webcam')], 'audio_input_volume': [opt_int, 50], 'audio_output_volume': [opt_int, 50], 'use_stun_server': [opt_bool, False, _('If True, Gajim will try to use a STUN server when using Jingle. The one in "stun_server" option, or the one given by the XMPP server.')], 'stun_server': [opt_str, '', _('STUN server to use when using Jingle')], 'show_affiliation_in_groupchat': [opt_bool, True, _('If True, Gajim will show affiliation of groupchat occupants by adding a colored square to the status icon')], 'global_proxy': [opt_str, '', _('Proxy used for all outgoing connections if the account does not have a specific proxy configured')], 'ignore_incoming_attention': [opt_bool, False, _('If True, Gajim will ignore incoming attention requestd ("wizz").')], 'remember_opened_chat_controls': [ opt_bool, True, _('If enabled, Gajim will reopen chat windows that were opened last time Gajim was closed.')], 'positive_184_ack': [ opt_bool, False, _('If enabled, Gajim will show an icon to show that sent message has been received by your contact')], 'show_avatar_in_tabs': [ opt_bool, False, _('Show a mini avatar in chat window tabs and in window icon')], 'use_keyring': [opt_bool, True, _('If True, Gajim will use the Systems Keyring to store account passwords.')], 'pgp_encoding': [ opt_str, '', _('Sets the encoding used by python-gnupg'), True], 'remote_commands': [opt_bool, False, _('If True, Gajim will execute XEP-0146 Commands.')], 'mam_blacklist': [opt_str, '', _('All non-compliant MAM Groupchats')], }, {}) __options_per_key = { 'accounts': ({ 'name': [ opt_str, '', '', True ], 'account_label': [ opt_str, '', '', False ], 'hostname': [ opt_str, '', '', True ], 'anonymous_auth': [ opt_bool, False ], 'avatar_sha': [opt_str, '', '', False], 'client_cert': [ opt_str, '', '', True ], 'client_cert_encrypted': [ opt_bool, False, '', False ], 'savepass': [ opt_bool, False ], 'password': [ opt_str, '' ], 'resource': [ opt_str, 'gajim.$rand', '', True ], 'priority': [ opt_int, 5, '', True ], 'adjust_priority_with_status': [ opt_bool, True, _('Priority will change automatically according to your status. Priorities are defined in autopriority_* options.') ], 'autopriority_online': [ opt_int, 50], 'autopriority_chat': [ opt_int, 50], 'autopriority_away': [ opt_int, 40], 'autopriority_xa': [ opt_int, 30], 'autopriority_dnd': [ opt_int, 20], 'autopriority_invisible': [ opt_int, 10], 'autoconnect': [ opt_bool, False, '', True ], 'autoconnect_as': [ opt_str, 'online', _('Status used to autoconnect as. Can be online, chat, away, xa, dnd, invisible. NOTE: this option is used only if restore_last_status is disabled'), True ], 'restore_last_status': [ opt_bool, False, _('If enabled, restore the last status that was used.') ], 'autoreconnect': [ opt_bool, True ], 'autoauth': [ opt_bool, False, _('If True, Contacts requesting authorization will be automatically accepted.')], 'active': [ opt_bool, True, _('If False, this account will be disabled and will not appear in roster window.'), True], 'proxy': [ opt_str, '', '', True ], 'keyid': [ opt_str, '', '', True ], 'gpg_sign_presence': [ opt_bool, True, _('If disabled, don\'t sign presences with GPG key, even if GPG is configured.') ], 'keyname': [ opt_str, '', '', True ], 'enable_esessions': [opt_bool, True, _('Enable ESessions encryption for this account.'), True], 'autonegotiate_esessions': [opt_bool, False, _('Should Gajim automatically start an encrypted session when possible?')], 'allow_plaintext_connection': [ opt_bool, False, _('Allow plaintext connections')], 'tls_version': [ opt_str, '1.2', '' ], 'cipher_list': [ opt_str, 'HIGH:!aNULL:RC4-SHA', '' ], 'authentication_mechanisms': [ opt_str, '', _('List (space separated) of authentication mechanisms to try. Can contain ANONYMOUS, EXTERNAL, GSSAPI, SCRAM-SHA-1-PLUS, SCRAM-SHA-1, DIGEST-MD5, PLAIN, X-MESSENGER-OAUTH2 or XEP-0078') ], 'action_when_plaintext_connection': [ opt_str, 'warn', _('Show a warning dialog before sending password on an plaintext connection. Can be \'warn\', \'connect\', \'disconnect\'') ], 'warn_when_insecure_ssl_connection': [ opt_bool, True, _('Show a warning dialog before using standard SSL library.') ], 'warn_when_insecure_password': [ opt_bool, True, _('Show a warning dialog before sending PLAIN password over a plain connection.') ], 'ssl_fingerprint_sha1': [ opt_str, '', '', True ], 'ssl_fingerprint_sha256': [ opt_str, '', '', True ], 'ignore_ssl_errors': [ opt_str, '', _('Space separated list of ssl errors to ignore.') ], 'use_srv': [ opt_bool, True, '', True ], 'use_custom_host': [ opt_bool, False, '', True ], 'custom_port': [ opt_int, 5222, '', True ], 'custom_host': [ opt_str, '', '', True ], 'sync_with_global_status': [ opt_bool, False, ], 'no_log_for': [ opt_str, '', _('Space separated list of JIDs for which you do not want to store logs. You can also add account name to log nothing for this account.')], 'sync_logs_with_server': [ opt_bool, True, _('On startup, Gajim will download logs stored on server, provided the server supports XEP-0313')], 'allow_no_log_for': [ opt_str, '', _('Space separated list of JIDs for which you accept to not log conversations if he does not want to.')], 'non_minimized_gc': [ opt_str, '' ], 'attached_gpg_keys': [ opt_str, '' ], 'keep_alives_enabled': [ opt_bool, True, _('Whitespace sent after inactivity')], 'ping_alives_enabled': [ opt_bool, True, _('XMPP ping sent after inactivity')], # send keepalive every N seconds of inactivity 'keep_alive_every_foo_secs': [ opt_int, 55 ], 'ping_alive_every_foo_secs': [ opt_int, 120 ], 'time_for_ping_alive_answer': [ opt_int, 60, _('How many seconds to wait for the answer of ping alive packet before we try to reconnect?') ], # try for 1 minutes before giving up (aka. timeout after those seconds) 'try_connecting_for_foo_secs': [ opt_int, 60 ], 'http_auth': [opt_str, 'ask'], # yes, no, ask 'dont_ack_subscription': [opt_bool, False, _('Jabberd2 workaround')], # proxy65 for FT 'file_transfer_proxies': [opt_str, ''], 'use_ft_proxies': [opt_bool, False, _('If checked, Gajim will use your IP and proxies defined in file_transfer_proxies option for file transfer.'), True], 'test_ft_proxies_on_startup': [opt_bool, False, _('If True, Gajim will test file transfer proxies on startup to be sure it works. Openfire\'s proxies are known to fail this test even if they work.')], 'msgwin-x-position': [opt_int, -1], # Default is to let the wm decide 'msgwin-y-position': [opt_int, -1], # Default is to let the wm decide 'msgwin-width': [opt_int, 480], 'msgwin-height': [opt_int, 440], 'is_zeroconf': [opt_bool, False], 'last_status': [opt_str, 'online'], 'last_status_msg': [opt_str, ''], 'zeroconf_first_name': [ opt_str, '', '', True ], 'zeroconf_last_name': [ opt_str, '', '', True ], 'zeroconf_jabber_id': [ opt_str, '', '', True ], 'zeroconf_email': [ opt_str, '', '', True ], 'use_env_http_proxy': [opt_bool, False], 'answer_receipts': [opt_bool, True, _('Answer to receipt requests')], 'request_receipt': [opt_bool, True, _('Sent receipt requests')], 'publish_tune': [opt_bool, False], 'publish_location': [opt_bool, False], 'subscribe_mood': [opt_bool, True], 'subscribe_activity': [opt_bool, True], 'subscribe_tune': [opt_bool, True], 'subscribe_nick': [opt_bool, True], 'subscribe_location': [opt_bool, True], 'ignore_unknown_contacts': [ opt_bool, False ], 'send_os_info': [ opt_bool, True, _("Allow Gajim to send information about the operating system you are running.") ], 'send_time_info': [ opt_bool, True, _("Allow Gajim to send your local time.") ], 'log_encrypted_sessions': [opt_bool, True, _('When negotiating an encrypted session, should Gajim assume you want your messages to be logged?')], 'send_idle_time': [ opt_bool, True ], 'roster_version': [opt_str, ''], 'subscription_request_msg': [opt_str, '', _('Message that is sent to contacts you want to add')], 'enable_message_carbons': [ opt_bool, True, _('If enabled and if server supports this feature, Gajim will receive messages sent and received by other resources.')], 'ft_send_local_ips': [ opt_bool, True, _('If enabled, Gajim will send your local IPs so your contact can connect to your machine to transfer files.')], 'oauth2_refresh_token': [ opt_str, '', _('Latest token for OAuth 2.0 authentication.')], 'oauth2_client_id': [ opt_str, '0000000044077801', _('client_id for OAuth 2.0 authentication.')], 'oauth2_redirect_url': [ opt_str, 'https%3A%2F%2Fgajim.org%2Fmsnauth%2Findex.cgi', _('redirect_url for OAuth 2.0 authentication.')], 'opened_chat_controls': [opt_str, '', _('Space separated list of JIDs for which we want to re-open a chat window on next startup.')], 'recent_groupchats': [ opt_str, '' ], 'httpupload_verify': [ opt_bool, True, _('HTTP Upload: Enable HTTPS Verification')], 'filetransfer_preference' : [ opt_str, 'httpupload', _('Preferred file transfer mechanism for file drag&drop on chat window. Can be \'httpupload\' (default) or \'jingle\'')], }, {}), 'statusmsg': ({ 'message': [ opt_str, '' ], 'activity': [ opt_str, '' ], 'subactivity': [ opt_str, '' ], 'activity_text': [ opt_str, '' ], 'mood': [ opt_str, '' ], 'mood_text': [ opt_str, '' ], }, {}), 'defaultstatusmsg': ({ 'enabled': [ opt_bool, False ], 'message': [ opt_str, '' ], }, {}), 'soundevents': ({ 'enabled': [ opt_bool, True ], 'path': [ opt_str, '' ], }, {}), 'proxies': ({ 'type': [ opt_str, 'http' ], 'host': [ opt_str, '' ], 'port': [ opt_int, 3128 ], 'useauth': [ opt_bool, False ], 'user': [ opt_str, '' ], 'pass': [ opt_str, '' ], 'bosh_uri': [ opt_str, '' ], 'bosh_useproxy': [ opt_bool, False ], 'bosh_wait': [ opt_int, 30 ], 'bosh_hold': [ opt_int, 2 ], 'bosh_content': [ opt_str, 'text/xml; charset=utf-8' ], 'bosh_http_pipelining': [ opt_bool, False ], 'bosh_wait_for_restart_response': [ opt_bool, False ], }, {}), 'themes': ({ 'accounttextcolor': [ opt_color, 'black', '', True ], 'accountbgcolor': [ opt_color, 'white', '', True ], 'accountfont': [ opt_str, '', '', True ], 'accountfontattrs': [ opt_str, 'B', '', True ], 'grouptextcolor': [ opt_color, 'black', '', True ], 'groupbgcolor': [ opt_color, 'white', '', True ], 'groupfont': [ opt_str, '', '', True ], 'groupfontattrs': [ opt_str, 'I', '', True ], 'contacttextcolor': [ opt_color, 'black', '', True ], 'contactbgcolor': [ opt_color, 'white', '', True ], 'contactfont': [ opt_str, '', '', True ], 'contactfontattrs': [ opt_str, '', '', True ], 'bannertextcolor': [ opt_color, 'black', '', True ], 'bannerbgcolor': [ opt_color, '', '', True ], 'bannerfont': [ opt_str, '', '', True ], 'bannerfontattrs': [ opt_str, 'B', '', True ], 'msgcorrectingcolor': [opt_color, '#eee8aa'], # http://www.pitt.edu/~nisg/cis/web/cgi/rgb.html 'state_inactive_color': [ opt_color, 'grey62' ], 'state_composing_color': [ opt_color, 'green4' ], 'state_paused_color': [ opt_color, 'mediumblue' ], 'state_gone_color': [ opt_color, 'grey' ], # MUC chat states 'state_muc_msg_color': [ opt_color, 'mediumblue' ], 'state_muc_directed_msg_color': [ opt_color, 'red2' ], }, {}), 'contacts': ({ 'speller_language': [ opt_str, '', _('Language for which we want to check misspelled words')], }, {}), 'encryption': ({'encryption': [ opt_str, '', _('The currently active encryption for that contact')], },{}), 'rooms': ({ 'speller_language': [ opt_str, '', _('Language for which we want to check misspelled words')], 'muc_restore_lines': [opt_int, -2, _('How many lines to request from server when entering a groupchat. -1 means no limit, -2 means global value')], 'muc_restore_timeout': [opt_int, -2, _('Minutes of backlog to request when entering a groupchat. -1 means no limit, -2 means global value')], 'notify_on_all_messages': [opt_bool, False, _('State whether we want a notification for every message in this room')], }, {}), 'plugins': ({ 'active': [opt_bool, False, _('State whether plugins should be activated on startup (this is saved on Gajim exit). This option SHOULD NOT be used to (de)activate plug-ins. Use GUI instead.')], },{}), } statusmsg_default = { _('Sleeping'): [ 'ZZZZzzzzzZZZZZ', 'inactive', 'sleeping', '', 'sleepy', '' ], _('Back soon'): [ _('Back in some minutes.'), '', '', '', '', '' ], _('Eating'): [ _("I'm eating, so leave me a message."), 'eating', 'other', '', '', '' ], _('Movie'): [ _("I'm watching a movie."), 'relaxing', 'watching_a_movie', '', '', '' ], _('Working'): [ _("I'm working."), 'working', 'other', '', '', '' ], _('Phone'): [ _("I'm on the phone."), 'talking', 'on_the_phone', '', '', '' ], _('Out'): [ _("I'm out enjoying life."), 'relaxing', 'going_out', '', '', '' ], '_last_online': ['', '', '', '', '', ''], '_last_chat': ['', '', '', '', '', ''], '_last_away': ['', '', '', '', '', ''], '_last_xa': ['', '', '', '', '', ''], '_last_dnd': ['', '', '', '', '', ''], '_last_invisible': ['', '', '', '', '', ''], '_last_offline': ['', '', '', '', '', ''], } defaultstatusmsg_default = { 'online': [ False, _("I'm available.") ], 'chat': [ False, _("I'm free for chat.") ], 'away': [ False, _('Be right back.') ], 'xa': [ False, _("I'm not available.") ], 'dnd': [ False, _('Do not disturb.') ], 'invisible': [ False, _('Bye!') ], 'offline': [ False, _('Bye!') ], } soundevents_default = { 'attention_received': [True, 'attention.wav'], 'first_message_received': [ True, 'message1.wav' ], 'next_message_received_focused': [ True, 'message2.wav' ], 'next_message_received_unfocused': [ True, 'message2.wav' ], 'contact_connected': [ False, 'connected.wav' ], 'contact_disconnected': [ False, 'disconnected.wav' ], 'message_sent': [ False, 'sent.wav' ], 'muc_message_highlight': [ True, 'gc_message1.wav', _('Sound to play when a group chat message contains one of the words in muc_highlight_words, or when a group chat message contains your nickname.')], 'muc_message_received': [ False, 'gc_message2.wav', _('Sound to play when any MUC message arrives.') ], } themes_default = { # sorted alphanum _('default'): [ '', '', '', 'B', '', '', '', 'I', '', '', '', '', '', '', '', 'B' ], _('green'): [ '', '#94aa8c', '', 'B', '#0000ff', '#eff3e7', '', 'I', '#000000', '', '', '', '', '#94aa8c', '', 'B' ], _('grocery'): [ '', '#6bbe18', '', 'B', '#12125a', '#ceefad', '', 'I', '#000000', '#efb26b', '', '', '', '#108abd', '', 'B' ], _('human'): [ '', '#996442', '', 'B', '#ab5920', '#e3ca94', '', 'I', '#000000', '', '', '', '', '#996442', '', 'B' ], _('marine'): [ '', '#918caa', '', 'B', '', '#e9e7f3', '', 'I', '#000000', '', '', '', '', '#918caa', '', 'B' ], } proxies_default = { _('Tor'): ['socks5', 'localhost', 9050], } def foreach(self, cb, data=None): for opt in self.__options[1]: cb(data, opt, None, self.__options[1][opt]) for opt in self.__options_per_key: cb(data, opt, None, None) dict_ = self.__options_per_key[opt][1] for opt2 in dict_.keys(): cb(data, opt2, [opt], None) for opt3 in dict_[opt2]: cb(data, opt3, [opt, opt2], dict_[opt2][opt3]) def get_children(self, node=None): """ Tree-like interface """ if node is None: for child, option in self.__options[1].items(): yield (child, ), option for grandparent in self.__options_per_key: yield (grandparent, ), None elif len(node) == 1: grandparent, = node for parent in self.__options_per_key[grandparent][1]: yield (grandparent, parent), None elif len(node) == 2: grandparent, parent = node children = self.__options_per_key[grandparent][1][parent] for child, option in children.items(): yield (grandparent, parent, child), option else: raise ValueError('Invalid node') def is_valid_int(self, val): try: ival = int(val) except Exception: return None return ival def is_valid_bool(self, val): if val == 'True': return True if val == 'False': return False ival = self.is_valid_int(val) if ival: return True if ival is None: return None return False def is_valid_string(self, val): return val def is_valid(self, type_, val): if not type_: return None if type_[0] == 'boolean': return self.is_valid_bool(val) elif type_[0] == 'integer': return self.is_valid_int(val) elif type_[0] == 'string': return self.is_valid_string(val) else: if re.match(type_[1], val): return val else: return None def set(self, optname, value): if optname not in self.__options[1]: return value = self.is_valid(self.__options[0][optname][Option.TYPE], value) if value is None: return self.__options[1][optname] = value self._timeout_save() def get(self, optname=None): if not optname: return list(self.__options[1].keys()) if optname not in self.__options[1]: return None return self.__options[1][optname] def get_default(self, optname): if optname not in self.__options[0]: return None return self.__options[0][optname][Option.VAL] def get_type(self, optname): if optname not in self.__options[0]: return None return self.__options[0][optname][Option.TYPE][0] def get_desc(self, optname): if optname not in self.__options[0]: return None if len(self.__options[0][optname]) > Option.DESC: return self.__options[0][optname][Option.DESC] def get_restart(self, optname): if optname not in self.__options[0]: return None if len(self.__options[0][optname]) > Option.RESTART: return self.__options[0][optname][Option.RESTART] def add_per(self, typename, name): # per_group_of_option if typename not in self.__options_per_key: return opt = self.__options_per_key[typename] if name in opt[1]: # we already have added group name before return 'you already have added %s before' % name opt[1][name] = {} for o in opt[0]: opt[1][name][o] = opt[0][o][Option.VAL] self._timeout_save() def del_per(self, typename, name, subname = None): # per_group_of_option if typename not in self.__options_per_key: return opt = self.__options_per_key[typename] if subname is None: del opt[1][name] # if subname is specified, delete the item in the group. elif subname in opt[1][name]: del opt[1][name][subname] self._timeout_save() def set_per(self, optname, key, subname, value): # per_group_of_option if optname not in self.__options_per_key: return if not key: return dict_ = self.__options_per_key[optname][1] if key not in dict_: self.add_per(optname, key) obj = dict_[key] if subname not in obj: return typ = self.__options_per_key[optname][0][subname][Option.TYPE] value = self.is_valid(typ, value) if value is None: return obj[subname] = value self._timeout_save() def get_per(self, optname, key=None, subname=None): # per_group_of_option if optname not in self.__options_per_key: return None dict_ = self.__options_per_key[optname][1] if not key: return list(dict_.keys()) if key not in dict_: if subname in self.__options_per_key[optname][0]: return self.__options_per_key[optname][0][subname][1] return None obj = dict_[key] if not subname: return obj if subname not in obj: return None return obj[subname] def get_default_per(self, optname, subname): if optname not in self.__options_per_key: return None dict_ = self.__options_per_key[optname][0] if subname not in dict_: return None return dict_[subname][Option.VAL] def get_type_per(self, optname, subname): if optname not in self.__options_per_key: return None dict_ = self.__options_per_key[optname][0] if subname not in dict_: return None return dict_[subname][Option.TYPE][0] def get_desc_per(self, optname, subname=None): if optname not in self.__options_per_key: return None dict_ = self.__options_per_key[optname][0] if subname not in dict_: return None obj = dict_[subname] if len(obj) > Option.DESC: return obj[Option.DESC] return None def get_restart_per(self, optname, key=None, subname=None): if optname not in self.__options_per_key: return False dict_ = self.__options_per_key[optname][0] if not key: return False if key not in dict_: return False obj = dict_[key] if not subname: return False if subname not in obj: return False if len(obj[subname]) > Option.RESTART: return obj[subname][Option.RESTART] return False def should_log(self, account, jid): """ Should conversations between a local account and a remote jid be logged? """ no_log_for = self.get_per('accounts', account, 'no_log_for') if not no_log_for: no_log_for = '' no_log_for = no_log_for.split() return (account not in no_log_for) and (jid not in no_log_for) def _init_options(self): for opt in self.__options[0]: self.__options[1][opt] = self.__options[0][opt][Option.VAL] def _really_save(self): from gajim.common import app if app.interface: app.interface.save_config() self.save_timeout_id = None return False def _timeout_save(self): if self.save_timeout_id: return self.save_timeout_id = GLib.timeout_add(1000, self._really_save) def __init__(self): #init default values self._init_options() self.save_timeout_id = None for event in self.soundevents_default: default = self.soundevents_default[event] self.add_per('soundevents', event) self.set_per('soundevents', event, 'enabled', default[0]) self.set_per('soundevents', event, 'path', default[1]) for status in self.defaultstatusmsg_default: default = self.defaultstatusmsg_default[status] self.add_per('defaultstatusmsg', status) self.set_per('defaultstatusmsg', status, 'enabled', default[0]) self.set_per('defaultstatusmsg', status, 'message', default[1]) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/configpaths.py000066400000000000000000000161661326020644600261530ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/configpaths.py ## ## Copyright (C) 2006 Jean-Marie Traissard ## Junglecow J ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2007 Brendan Taylor ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import os import sys import tempfile from enum import Enum, unique @unique class Type(Enum): CONFIG = 0 CACHE = 1 DATA = 2 # Note on path and filename encodings: # # In general it is very difficult to do this correctly. # We may pull information from environment variables, and what encoding that is # in is anyone's guess. Any information we request directly from the file # system will be in filesystemencoding, and (parts of) paths that we write in # this source code will be in whatever encoding the source is in. (I hereby # declare this file to be UTF-8 encoded.) # # To make things more complicated, modern Windows filesystems use UTF-16, but # the API tends to hide this from us. # # I tried to minimize problems by passing Unicode strings to OS functions as # much as possible. Hopefully this makes the function return an Unicode string # as well. If not, we get an 8-bit string in filesystemencoding, which we can # happily pass to functions that operate on files and directories, so we can # just leave it as is. Since these paths are meant to be internal to Gajim and # not displayed to the user, Unicode is not really necessary here. def windowsify(s): if os.name == 'nt': return s.capitalize() return s def get(key): return gajimpaths[key] class ConfigPaths: def __init__(self): # {'name': (type, path), } type can be Type.CONFIG, Type.CACHE, Type.DATA # or None self.paths = {} if os.name == 'nt': try: # Documents and Settings\[User Name]\Application Data\Gajim # How are we supposed to know what encoding the environment # variable 'appdata' is in? Assuming it to be in filesystem # encoding. self.config_root = self.cache_root = self.data_root = \ os.path.join(os.environ['appdata'], 'Gajim') except KeyError: # win9x, in cwd self.config_root = self.cache_root = self.data_root = '.' else: # Unices # Pass in an Unicode string, and hopefully get one back. expand = os.path.expanduser base = os.getenv('XDG_CONFIG_HOME') if base is None or base[0] != '/': base = expand('~/.config') self.config_root = os.path.join(base, 'gajim') base = os.getenv('XDG_CACHE_HOME') if base is None or base[0] != '/': base = expand('~/.cache') self.cache_root = os.path.join(base, 'gajim') base = os.getenv('XDG_DATA_HOME') if base is None or base[0] != '/': base = expand('~/.local/share') self.data_root = os.path.join(base, 'gajim') import pkg_resources basedir = pkg_resources.resource_filename("gajim", ".") self.add('DATA', None, os.path.join(basedir, 'data')) self.add('GUI', None, os.path.join(basedir, 'data', 'gui')) self.add('ICONS', None, os.path.join(basedir, 'data', 'icons')) self.add('HOME', None, os.path.expanduser('~')) self.add('PLUGINS_BASE', None, os.path.join(basedir, 'data', 'plugins')) def add(self, name, type_, path): self.paths[name] = (type_, path) def __getitem__(self, key): type_, path = self.paths[key] if type_ == Type.CONFIG: return os.path.join(self.config_root, path) elif type_ == Type.CACHE: return os.path.join(self.cache_root, path) elif type_ == Type.DATA: return os.path.join(self.data_root, path) return path def get(self, key, default=None): try: return self[key] except KeyError: return default def items(self): for key in self.paths.keys(): yield (key, self[key]) def init(self, root=None, profile='', profile_separation=False): if root is not None: self.config_root = self.cache_root = self.data_root = root self.init_profile(profile) if len(profile) > 0 and profile_separation: profile = u'.' + profile else: profile = '' d = {'LOG_DB': 'logs.db', 'MY_CACERTS': 'cacerts.pem', 'MY_EMOTS': 'emoticons', 'MY_ICONSETS': 'iconsets', 'MY_MOOD_ICONSETS': 'moods', 'MY_ACTIVITY_ICONSETS': 'activities', 'PLUGINS_USER': 'plugins'} for name in d: d[name] += profile self.add(name, Type.DATA, windowsify(d[name])) if len(profile): self.add('MY_DATA', Type.DATA, 'data.dir') else: self.add('MY_DATA', Type.DATA, '') d = {'CACHE_DB': 'cache.db', 'VCARD': 'vcards', 'AVATAR': 'avatars'} for name in d: d[name] += profile self.add(name, Type.CACHE, windowsify(d[name])) if len(profile): self.add('MY_CACHE', Type.CACHE, 'cache.dir') else: self.add('MY_CACHE', Type.CACHE, '') if len(profile): self.add('MY_CONFIG', Type.CONFIG, 'config.dir') else: self.add('MY_CONFIG', Type.CONFIG, '') try: self.add('TMP', None, tempfile.gettempdir()) except IOError as e: print('Error opening tmp folder: %s\nUsing %s' % (str(e), os.path.expanduser('~')), file=sys.stderr) self.add('TMP', None, os.path.expanduser('~')) def init_profile(self, profile): conffile = windowsify('config') secretsfile = windowsify('secrets') pluginsconfdir = windowsify('pluginsconfig') certsdir = windowsify(u'certs') localcertsdir = windowsify(u'localcerts') if len(profile) > 0: conffile += '.' + profile secretsfile += '.' + profile pluginsconfdir += '.' + profile certsdir += u'.' + profile localcertsdir += u'.' + profile self.add('SECRETS_FILE', Type.DATA, secretsfile) self.add('MY_PEER_CERTS', Type.DATA, certsdir) self.add('CONFIG_FILE', Type.CONFIG, conffile) self.add('PLUGINS_CONFIG_DIR', Type.CONFIG, pluginsconfdir) self.add('MY_CERT', Type.CONFIG, localcertsdir) gajimpaths = ConfigPaths() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/connection.py000066400000000000000000003631351326020644600260060ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/connection.py ## ## Copyright (C) 2003-2005 Vincent Hanquez ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2005 Alex Mauer ## Stéphan Kochen ## Copyright (C) 2005-2006 Dimitur Kirov ## Travis Shirk ## Nikos Kouremenos ## Copyright (C) 2006 Junglecow J ## Stefan Bethge ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2007 Tomasz Melcer ## Julien Pivotto ## Copyright (C) 2007-2008 Stephan Erb ## Copyright (C) 2008 Brendan Taylor ## Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import os import random import socket import operator import string import time import locale import hmac import hashlib import json from functools import partial try: randomsource = random.SystemRandom() except Exception: randomsource = random.Random() randomsource.seed() import signal if os.name != 'nt': signal.signal(signal.SIGPIPE, signal.SIG_DFL) import nbxmpp from gajim import common from gajim.common import helpers from gajim.common import app from gajim.common import gpg from gajim.common import passwords from gajim.common import exceptions from gajim.common import check_X509 from gajim.common.connection_handlers import * from gajim.common.helpers import version_condition from gajim.common.contacts import GC_Contact from gajim.gtkgui_helpers import get_action if app.HAVE_PYOPENSSL: import OpenSSL.crypto if os.name == 'nt': import certifi from nbxmpp import Smacks from string import Template import logging log = logging.getLogger('gajim.c.connection') ssl_error = { 2: _("Unable to get issuer certificate"), 3: _("Unable to get certificate CRL"), 4: _("Unable to decrypt certificate's signature"), 5: _("Unable to decrypt CRL's signature"), 6: _("Unable to decode issuer public key"), 7: _("Certificate signature failure"), 8: _("CRL signature failure"), 9: _("Certificate is not yet valid"), 10: _("Certificate has expired"), 11: _("CRL is not yet valid"), 12: _("CRL has expired"), 13: _("Format error in certificate's notBefore field"), 14: _("Format error in certificate's notAfter field"), 15: _("Format error in CRL's lastUpdate field"), 16: _("Format error in CRL's nextUpdate field"), 17: _("Out of memory"), 18: _("Self signed certificate"), 19: _("Self signed certificate in certificate chain"), 20: _("Unable to get local issuer certificate"), 21: _("Unable to verify the first certificate"), 22: _("Certificate chain too long"), 23: _("Certificate revoked"), 24: _("Invalid CA certificate"), 25: _("Path length constraint exceeded"), 26: _("Unsupported certificate purpose"), 27: _("Certificate not trusted"), 28: _("Certificate rejected"), 29: _("Subject issuer mismatch"), 30: _("Authority and subject key identifier mismatch"), 31: _("Authority and issuer serial number mismatch"), 32: _("Key usage does not include certificate signing"), 50: _("Application verification failure") #100 is for internal usage: host not correct } SERVICE_START_TLS = 'xmpp-client' SERVICE_DIRECT_TLS = 'xmpps-client' class CommonConnection: """ Common connection class, can be derivated for normal connection or zeroconf connection """ def __init__(self, name): self.name = name # self.connected: # 0=>offline, # 1=>connection in progress, # 2=>online # 3=>free for chat # ... self.connected = 0 self.connection = None # xmpppy ClientCommon instance self.on_purpose = False self.is_zeroconf = False self.password = '' self.server_resource = self._compute_resource() self.gpg = None self.USE_GPG = False if app.HAVE_GPG: self.USE_GPG = True self.gpg = gpg.GnuPG() self.status = '' self.old_show = '' self.priority = app.get_priority(name, 'offline') self.time_to_reconnect = None self.bookmarks = [] self.blocked_list = [] self.blocked_contacts = [] self.blocked_groups = [] self.blocked_all = False self.seclabel_supported = False self.seclabel_catalogues = {} self.pep_supported = False self.pep = {} # Do we continue connection when we get roster (send presence,get vcard..) self.continue_connect_info = None # Remember where we are in the register agent process self.agent_registrations = {} # To know the groupchat jid associated with a sranza ID. Useful to # request vcard or os info... to a real JID but act as if it comes from # the fake jid self.groupchat_jids = {} # {ID : groupchat_jid} self.privacy_rules_supported = False self.vcard_supported = False self.private_storage_supported = False self.archiving_namespace = None self.archiving_supported = False self.archiving_313_supported = False self.roster_supported = True self.blocking_supported = False self.addressing_supported = False self.carbons_available = False self.muc_jid = {} # jid of muc server for each transport type self._stun_servers = [] # STUN servers of our jabber server self.awaiting_cids = {} # Used for XEP-0231 self.nested_group_delimiter = '::' self.get_config_values_or_default() def _compute_resource(self): resource = app.config.get_per('accounts', self.name, 'resource') # All valid resource substitution strings should be added to this hash. if resource: rand = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(8)) resource = Template(resource).safe_substitute({ 'hostname': socket.gethostname(), 'rand': rand }) app.config.set_per('accounts', self.name, 'resource', resource) return resource def dispatch(self, event, data): """ Always passes account name as first param """ app.ged.raise_event(event, self.name, data) def reconnect(self): """ To be implemented by derivated classes """ raise NotImplementedError def quit(self, kill_core): if kill_core and app.account_is_connected(self.name): self.disconnect(on_purpose=True) def test_gpg_passphrase(self, password): """ Returns 'ok', 'bad_pass' or 'expired' """ if not self.gpg: return False self.gpg.passphrase = password keyID = app.config.get_per('accounts', self.name, 'keyid') signed = self.gpg.sign('test', keyID) self.gpg.password = None if signed == 'KEYEXPIRED': return 'expired' elif signed == 'BAD_PASSPHRASE': return 'bad_pass' return 'ok' def get_signed_msg(self, msg, callback = None): """ Returns the signed message if possible or an empty string if gpg is not used or None if waiting for passphrase callback is the function to call when user give the passphrase """ signed = '' keyID = app.config.get_per('accounts', self.name, 'keyid') if keyID and self.USE_GPG: if self.gpg.passphrase is None and not self.gpg.use_agent: # We didn't set a passphrase return None signed = self.gpg.sign(msg, keyID) if signed == 'BAD_PASSPHRASE': self.USE_GPG = False signed = '' app.nec.push_incoming_event(BadGPGPassphraseEvent(None, conn=self)) return signed def _on_disconnected(self): """ Called when a disconnect request has completed successfully """ self.disconnect(on_purpose=True) app.nec.push_incoming_event(OurShowEvent(None, conn=self, show='offline')) def get_status(self): return app.SHOW_LIST[self.connected] def check_jid(self, jid): """ This function must be implemented by derivated classes. It has to return the valid jid, or raise a helpers.InvalidFormat exception """ raise NotImplementedError def _prepare_message(self, obj): if not self.connection or self.connected < 2: return 1 if isinstance(obj.jid, list): for jid in obj.jid: try: self.check_jid(jid) except helpers.InvalidFormat: app.nec.push_incoming_event(InformationEvent( None, dialog_name='invalid-jid', args=jid)) return else: try: self.check_jid(obj.jid) except helpers.InvalidFormat: app.nec.push_incoming_event(InformationEvent( None, dialog_name='invalid-jid', args=obj.jid)) return if obj.message and not obj.xhtml and app.config.get( 'rst_formatting_outgoing_messages'): from gajim.common.rst_xhtml_generator import create_xhtml obj.xhtml = create_xhtml(obj.message) if not obj.message and obj.chatstate is None and obj.form_node is None: return self._build_message_stanza(obj) def _build_message_stanza(self, obj): if obj.jid == app.get_jid_from_account(self.name): fjid = obj.jid else: fjid = obj.get_full_jid() if obj.type_ == 'chat': msg_iq = nbxmpp.Message(body=obj.message, typ=obj.type_, xhtml=obj.xhtml) else: if obj.subject: msg_iq = nbxmpp.Message(body=obj.message, typ='normal', subject=obj.subject, xhtml=obj.xhtml) else: msg_iq = nbxmpp.Message(body=obj.message, typ='normal', xhtml=obj.xhtml) if obj.correct_id: msg_iq.setTag('replace', attrs={'id': obj.correct_id}, namespace=nbxmpp.NS_CORRECT) # XEP-0359 obj.stanza_id = self.connection.getAnID() msg_iq.setID(obj.stanza_id) if obj.message: msg_iq.setOriginID(obj.stanza_id) if obj.form_node: msg_iq.addChild(node=obj.form_node) if obj.label: msg_iq.addChild(node=obj.label) # XEP-0172: user_nickname if obj.user_nick: msg_iq.setTag('nick', namespace=nbxmpp.NS_NICK).setData( obj.user_nick) # XEP-0203 if obj.delayed: our_jid = app.get_jid_from_account(self.name) + '/' + \ self.server_resource timestamp = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime(obj.delayed)) msg_iq.addChild('delay', namespace=nbxmpp.NS_DELAY2, attrs={'from': our_jid, 'stamp': timestamp}) # XEP-0224 if obj.attention: msg_iq.setTag('attention', namespace=nbxmpp.NS_ATTENTION) if isinstance(obj.jid, list): if self.addressing_supported: msg_iq.setTo(app.config.get_per('accounts', self.name, 'hostname')) addresses = msg_iq.addChild('addresses', namespace=nbxmpp.NS_ADDRESS) for j in obj.jid: addresses.addChild('address', attrs = {'type': 'to', 'jid': j}) else: iqs = [] for j in obj.jid: iq = nbxmpp.Message(node=msg_iq) iq.setTo(j) iqs.append(iq) msg_iq = iqs else: msg_iq.setTo(fjid) r_ = obj.resource if not r_ and obj.jid != fjid: # Only if we're not in a pm r_ = app.get_resource_from_jid(fjid) if r_: contact = app.contacts.get_contact(self.name, obj.jid, r_) else: contact = app.contacts.get_contact_with_highest_priority( self.name, obj.jid) # Mark Message as MUC PM if isinstance(contact, GC_Contact): msg_iq.setTag('x', namespace=nbxmpp.NS_MUC_USER) # chatstates - if peer supports xep85, send chatstates # please note that the only valid tag inside a message containing a # tag is the active event if obj.chatstate and contact and contact.supports(nbxmpp.NS_CHATSTATES): msg_iq.setTag(obj.chatstate, namespace=nbxmpp.NS_CHATSTATES) only_chatste = False if not obj.message: only_chatste = True if only_chatste and not obj.session.enable_encryption: msg_iq.setTag('no-store', namespace=nbxmpp.NS_MSG_HINTS) # XEP-0184 if obj.jid != app.get_jid_from_account(self.name): request = app.config.get_per('accounts', self.name, 'request_receipt') if obj.message and request: msg_iq.setTag('request', namespace=nbxmpp.NS_RECEIPTS) if obj.forward_from: addresses = msg_iq.addChild('addresses', namespace=nbxmpp.NS_ADDRESS) addresses.addChild('address', attrs = {'type': 'ofrom', 'jid': obj.forward_from}) if obj.session: # XEP-0201 obj.session.last_send = time.time() msg_iq.setThread(obj.session.thread_id) self._push_stanza_message_outgoing(obj, msg_iq) def _push_stanza_message_outgoing(self, obj, msg_iq): obj.conn = self if isinstance(msg_iq, list): for iq in msg_iq: obj.msg_iq = iq app.nec.push_incoming_event( StanzaMessageOutgoingEvent(None, **vars(obj))) else: obj.msg_iq = msg_iq app.nec.push_incoming_event( StanzaMessageOutgoingEvent(None, **vars(obj))) def log_message(self, obj, jid): if not obj.is_loggable: return if obj.forward_from: return if obj.session and not obj.session.is_loggable(): return if not app.config.should_log(self.name, jid): return if obj.xhtml and app.config.get('log_xhtml_messages'): obj.message = '%s' % (nbxmpp.NS_XHTML, obj.xhtml) if obj.message is None: return app.logger.insert_into_logs(self.name, jid, obj.timestamp, obj.kind, message=obj.message, subject=obj.subject, additional_data=obj.additional_data, stanza_id=obj.stanza_id) def ack_subscribed(self, jid): """ To be implemented by derivated classes """ raise NotImplementedError def ack_unsubscribed(self, jid): """ To be implemented by derivated classes """ raise NotImplementedError def request_subscription(self, jid, msg='', name='', groups=None, auto_auth=False): """ To be implemented by derivated classes """ raise NotImplementedError def send_authorization(self, jid): """ To be implemented by derivated classes """ raise NotImplementedError def refuse_authorization(self, jid): """ To be implemented by derivated classes """ raise NotImplementedError def unsubscribe(self, jid, remove_auth = True): """ To be implemented by derivated classes """ raise NotImplementedError def unsubscribe_agent(self, agent): """ To be implemented by derivated classes """ raise NotImplementedError def update_contact(self, jid, name, groups): if self.connection and self.roster_supported: self.connection.getRoster().setItem(jid=jid, name=name, groups=groups) def update_contacts(self, contacts): """ Update multiple roster items """ if self.connection and self.roster_supported: self.connection.getRoster().setItemMulti(contacts) def new_account(self, name, config, sync=False): """ To be implemented by derivated classes """ raise NotImplementedError def _on_new_account(self, con=None, con_type=None): """ To be implemented by derivated classes """ raise NotImplementedError def account_changed(self, new_name): self.name = new_name def request_os_info(self, jid, resource): """ To be implemented by derivated classes """ raise NotImplementedError def get_settings(self): """ To be implemented by derivated classes """ raise NotImplementedError def get_bookmarks(self): """ To be implemented by derivated classes """ raise NotImplementedError def store_bookmarks(self): """ To be implemented by derivated classes """ raise NotImplementedError def get_metacontacts(self): """ To be implemented by derivated classes """ raise NotImplementedError def send_agent_status(self, agent, ptype): """ To be implemented by derivated classes """ raise NotImplementedError def gpg_passphrase(self, passphrase): if self.gpg: if self.gpg.use_agent: self.gpg.passphrase = None else: self.gpg.passphrase = passphrase def ask_gpg_keys(self, keyID=None): if self.gpg: if keyID: return self.gpg.get_key(keyID) return self.gpg.get_keys() return None def ask_gpg_secrete_keys(self): if self.gpg: return self.gpg.get_secret_keys() return None def load_roster_from_db(self): # Do nothing by default return def _event_dispatcher(self, realm, event, data): if realm == '': if event == nbxmpp.transports_nb.DATA_RECEIVED: app.nec.push_incoming_event(StanzaReceivedEvent(None, conn=self, stanza_str=data)) elif event == nbxmpp.transports_nb.DATA_SENT: app.nec.push_incoming_event(StanzaSentEvent(None, conn=self, stanza_str=data)) def change_status(self, show, msg, auto=False): if not msg: msg = '' sign_msg = False if not auto and not show == 'offline': sign_msg = True if show != 'invisible': # We save it only when privacy list is accepted self.status = msg if show != 'offline' and self.connected < 1: # set old_show to requested 'show' in case we need to # recconect before we auth to server self.old_show = show self.on_purpose = False self.server_resource = self._compute_resource() if app.HAVE_GPG: self.USE_GPG = True self.gpg = gpg.GnuPG() app.nec.push_incoming_event(BeforeChangeShowEvent(None, conn=self, show=show, message=msg)) self.connect_and_init(show, msg, sign_msg) return if show == 'offline': self.connected = 0 if self.connection: app.nec.push_incoming_event(BeforeChangeShowEvent(None, conn=self, show=show, message=msg)) p = nbxmpp.Presence(typ = 'unavailable') p = self.add_sha(p, False) if msg: p.setStatus(msg) self.connection.RegisterDisconnectHandler(self._on_disconnected) self.connection.send(p, now=True) self.connection.start_disconnect() else: self._on_disconnected() return if show != 'offline' and self.connected > 0: # dont'try to connect, when we are in state 'connecting' if self.connected == 1: return if show == 'invisible': app.nec.push_incoming_event(BeforeChangeShowEvent(None, conn=self, show=show, message=msg)) self._change_to_invisible(msg) return if show not in ['offline', 'online', 'chat', 'away', 'xa', 'dnd']: return -1 was_invisible = self.connected == app.SHOW_LIST.index('invisible') self.connected = app.SHOW_LIST.index(show) idle_time = None if auto: if app.HAVE_IDLE and app.config.get('autoaway'): idle_sec = int(app.interface.sleeper.getIdleSec()) idle_time = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime(time.time() - idle_sec)) app.nec.push_incoming_event(BeforeChangeShowEvent(None, conn=self, show=show, message=msg)) if was_invisible: self._change_from_invisible() self._update_status(show, msg, idle_time=idle_time) class Connection(CommonConnection, ConnectionHandlers): def __init__(self, name): CommonConnection.__init__(self, name) ConnectionHandlers.__init__(self) # this property is used to prevent double connections # If we succeed to connect, remember it so next time we try (after a # disconnection) we try only this type. self.lang = None if locale.getdefaultlocale()[0]: self.lang = locale.getdefaultlocale()[0].split('_')[0] # increase/decrease default timeout for server responses self.try_connecting_for_foo_secs = 45 # holds the actual hostname to which we are connected self.connected_hostname = None # Holds the full jid we received on the bind event self.registered_name = None self.redirected = None self.last_time_to_reconnect = None self.new_account_info = None self.new_account_form = None self.annotations = {} self.last_io = app.idlequeue.current_time() self.last_sent = [] self.password = passwords.get_password(name) self.music_track_info = 0 self.location_info = {} self.register_supported = False self.pubsub_publish_options_supported = False # Do we auto accept insecure connection self.connection_auto_accepted = False self.pasword_callback = None self.on_connect_success = None self.on_connect_failure = None self.retrycount = 0 self.jids_for_auto_auth = [] # list of jid to auto-authorize self.available_transports = {} # list of available transports on this # server {'icq': ['icq.server.com', 'icq2.server.com'], } self.private_storage_supported = True self.privacy_rules_requested = False self.streamError = '' self.secret_hmac = str(random.random())[2:].encode('utf-8') self.removing_account = False self.sm = Smacks(self) # Stream Management app.ged.register_event_handler('privacy-list-received', ged.CORE, self._nec_privacy_list_received) app.ged.register_event_handler('agent-info-error-received', ged.CORE, self._nec_agent_info_error_received) app.ged.register_event_handler('agent-info-received', ged.CORE, self._nec_agent_info_received) app.ged.register_event_handler('message-outgoing', ged.OUT_CORE, self._nec_message_outgoing) app.ged.register_event_handler('gc-message-outgoing', ged.OUT_CORE, self._nec_gc_message_outgoing) app.ged.register_event_handler('gc-stanza-message-outgoing', ged.OUT_CORE, self._nec_gc_stanza_message_outgoing) app.ged.register_event_handler('stanza-message-outgoing', ged.OUT_CORE, self._nec_stanza_message_outgoing) # END __init__ def cleanup(self): ConnectionHandlers.cleanup(self) app.ged.remove_event_handler('privacy-list-received', ged.CORE, self._nec_privacy_list_received) app.ged.remove_event_handler('agent-info-error-received', ged.CORE, self._nec_agent_info_error_received) app.ged.remove_event_handler('agent-info-received', ged.CORE, self._nec_agent_info_received) app.ged.remove_event_handler('message-outgoing', ged.OUT_CORE, self._nec_message_outgoing) app.ged.remove_event_handler('gc-message-outgoing', ged.OUT_CORE, self._nec_gc_message_outgoing) app.ged.remove_event_handler('gc-stanza-message-outgoing', ged.OUT_CORE, self._nec_gc_stanza_message_outgoing) app.ged.remove_event_handler('stanza-message-outgoing', ged.OUT_CORE, self._nec_stanza_message_outgoing) def get_config_values_or_default(self): if app.config.get_per('accounts', self.name, 'keep_alives_enabled'): self.keepalives = app.config.get_per('accounts', self.name, 'keep_alive_every_foo_secs') else: self.keepalives = 0 if app.config.get_per('accounts', self.name, 'ping_alives_enabled'): self.pingalives = app.config.get_per('accounts', self.name, 'ping_alive_every_foo_secs') else: self.pingalives = 0 self.client_cert = app.config.get_per('accounts', self.name, 'client_cert') self.client_cert_passphrase = '' def check_jid(self, jid): return helpers.parse_jid(jid) def get_own_jid(self, warn=False): """ Return the last full JID we received on a bind event. In case we were never connected it returns the bare JID from config. """ if self.registered_name: # This returns the full jid we received on the bind event return self.registered_name else: if warn: log.warning('only bare JID available') # This returns the bare jid return nbxmpp.JID(app.get_jid_from_account(self.name)) def reconnect(self): # Do not try to reco while we are already trying self.time_to_reconnect = None if self.connected < 2: # connection failed log.debug('reconnect') self.connected = 1 app.nec.push_incoming_event(OurShowEvent(None, conn=self, show='connecting')) self.retrycount += 1 self.on_connect_auth = self._discover_server_at_connection self.connect_and_init(self.old_show, self.status, self.USE_GPG) else: # reconnect succeeded self.time_to_reconnect = None self.retrycount = 0 # We are doing disconnect at so many places, better use one function in all def disconnect(self, on_purpose=False): app.interface.music_track_changed(None, None, self.name) self.reset_awaiting_pep() self.on_purpose = on_purpose self.connected = 0 self.time_to_reconnect = None self.privacy_rules_supported = False self.avatar_presence_sent = False if on_purpose: self.sm = Smacks(self) if self.connection: # make sure previous connection is completely closed app.proxy65_manager.disconnect(self.connection) self.terminate_sessions() self.remove_all_transfers() self.connection.disconnect() self.connection = None def set_oldst(self): # Set old state if self.old_show: self.connected = app.SHOW_LIST.index(self.old_show) app.nec.push_incoming_event(OurShowEvent(None, conn=self, show=self.connected)) else: # we default to online self.connected = 2 app.nec.push_incoming_event(OurShowEvent(None, conn=self, show=app.SHOW_LIST[self.connected])) def disconnectedReconnCB(self): """ Called when we are disconnected """ log.info('disconnectedReconnCB called') if app.account_is_connected(self.name): # we cannot change our status to offline or connecting # after we auth to server self.old_show = app.SHOW_LIST[self.connected] self.connected = 0 if not self.on_purpose: if not (self.sm and self.sm.resumption): app.nec.push_incoming_event(OurShowEvent(None, conn=self, show='offline')) else: self.sm.enabled = False app.nec.push_incoming_event(OurShowEvent(None, conn=self, show='error')) if self.connection: self.connection.UnregisterDisconnectHandler( self.disconnectedReconnCB) self.disconnect() if app.config.get_per('accounts', self.name, 'autoreconnect'): self.connected = -1 app.nec.push_incoming_event(OurShowEvent(None, conn=self, show='error')) if app.status_before_autoaway[self.name]: # We were auto away. So go back online self.status = app.status_before_autoaway[self.name] app.status_before_autoaway[self.name] = '' self.old_show = 'online' # this check has moved from reconnect method # do exponential backoff until less than 5 minutes if self.retrycount < 2 or self.last_time_to_reconnect is None: self.last_time_to_reconnect = 5 self.last_time_to_reconnect += randomsource.randint(0, 5) if self.last_time_to_reconnect < 200: self.last_time_to_reconnect *= 1.5 self.time_to_reconnect = int(self.last_time_to_reconnect) log.info("Reconnect to %s in %ss", self.name, self.time_to_reconnect) app.idlequeue.set_alarm(self._reconnect_alarm, self.time_to_reconnect) elif self.on_connect_failure: self.on_connect_failure() self.on_connect_failure = None else: # show error dialog self._connection_lost() else: if self.redirected: self.disconnect(on_purpose=True) self.connect() return else: self.disconnect() self.on_purpose = False # END disconnectedReconnCB def _connection_lost(self): log.debug('_connection_lost') self.disconnect(on_purpose = False) if self.removing_account: return app.nec.push_incoming_event(ConnectionLostEvent(None, conn=self, title=_('Connection with account "%s" has been lost') % self.name, msg=_('Reconnect manually.'))) def _event_dispatcher(self, realm, event, data): CommonConnection._event_dispatcher(self, realm, event, data) if realm == nbxmpp.NS_REGISTER: if event == nbxmpp.features_nb.REGISTER_DATA_RECEIVED: # data is (agent, DataFrom, is_form, error_msg) if self.new_account_info and \ self.new_account_info['hostname'] == data[0]: # it's a new account if not data[1]: # wrong answer reason = _('Server %(name)s answered wrongly to ' 'register request: %(error)s') % {'name': data[0], 'error': data[3]} app.nec.push_incoming_event(AccountNotCreatedEvent( None, conn=self, reason=reason)) return is_form = data[2] conf = data[1] if data[4] is not '': helpers.replace_dataform_media(conf, data[4]) if self.new_account_form: def _on_register_result(result): if not nbxmpp.isResultNode(result): reason = result.getErrorMsg() or result.getError() app.nec.push_incoming_event(AccountNotCreatedEvent( None, conn=self, reason=reason)) return if app.HAVE_GPG: self.USE_GPG = True self.gpg = gpg.GnuPG() app.nec.push_incoming_event( AccountCreatedEvent(None, conn=self, account_info = self.new_account_info)) self.new_account_info = None self.new_account_form = None if self.connection: self.connection.UnregisterDisconnectHandler( self._on_new_account) self.disconnect(on_purpose=True) # it's the second time we get the form, we have info user # typed, so send them if is_form: #TODO: Check if form has changed iq = nbxmpp.Iq('set', nbxmpp.NS_REGISTER, to=self._hostname) iq.setTag('query').addChild(node=self.new_account_form) self.connection.SendAndCallForResponse(iq, _on_register_result) else: if list(self.new_account_form.keys()).sort() != \ list(conf.keys()).sort(): # requested config has changed since first connection reason = _('Server %s provided a different ' 'registration form') % data[0] app.nec.push_incoming_event(AccountNotCreatedEvent( None, conn=self, reason=reason)) return nbxmpp.features_nb.register(self.connection, self._hostname, self.new_account_form, _on_register_result) return app.nec.push_incoming_event(NewAccountConnectedEvent(None, conn=self, config=conf, is_form=is_form)) self.connection.UnregisterDisconnectHandler( self._on_new_account) self.disconnect(on_purpose=True) return if not data[1]: # wrong answer app.nec.push_incoming_event(InformationEvent( None, dialog_name='invalid-answer', kwargs={'name': data[0], 'error': data[3]})) return is_form = data[2] conf = data[1] app.nec.push_incoming_event(RegisterAgentInfoReceivedEvent( None, conn=self, agent=data[0], config=conf, is_form=is_form)) elif realm == nbxmpp.NS_PRIVACY: if event == nbxmpp.features_nb.PRIVACY_LISTS_RECEIVED: # data is (list) app.nec.push_incoming_event(PrivacyListsReceivedEvent(None, conn=self, lists_list=data)) elif event == nbxmpp.features_nb.PRIVACY_LIST_RECEIVED: # data is (resp) if not data: return rules = [] name = data.getTag('query').getTag('list').getAttr('name') for child in data.getTag('query').getTag('list').getChildren(): dict_item = child.getAttrs() childs = [] if 'type' in dict_item: for scnd_child in child.getChildren(): childs += [scnd_child.getName()] rules.append({'action':dict_item['action'], 'type':dict_item['type'], 'order':dict_item['order'], 'value':dict_item['value'], 'child':childs}) else: for scnd_child in child.getChildren(): childs.append(scnd_child.getName()) rules.append({'action':dict_item['action'], 'order':dict_item['order'], 'child':childs}) app.nec.push_incoming_event(PrivacyListReceivedEvent(None, conn=self, list_name=name, rules=rules)) elif event == nbxmpp.features_nb.PRIVACY_LISTS_ACTIVE_DEFAULT: # data is (dict) app.nec.push_incoming_event(PrivacyListActiveDefaultEvent( None, conn=self, active_list=data['active'], default_list=data['default'])) def _select_next_host(self, hosts): """ Selects the next host according to RFC2782 p.3 based on it's priority. Chooses between hosts with the same priority randomly, where the probability of being selected is proportional to the weight of the host """ hosts_by_prio = sorted(hosts, key=operator.itemgetter('prio')) try: lowest_prio = hosts_by_prio[0]['prio'] except IndexError: raise ValueError("No hosts to choose from!") hosts_lowest_prio = [h for h in hosts_by_prio if h['prio'] == lowest_prio] if len(hosts_lowest_prio) == 1: return hosts_lowest_prio[0] else: rndint = random.randint(0, sum(h['weight'] for h in hosts_lowest_prio)) weightsum = 0 for host in sorted(hosts_lowest_prio, key=operator.itemgetter( 'weight')): weightsum += host['weight'] if weightsum >= rndint: return host def connect(self, data=None): """ Start a connection to the XMPP server Returns connection, and connection type ('tls', 'ssl', 'plain', '') data MUST contain hostname, proxy, use_custom_host, custom_host (if use_custom_host), custom_port (if use_custom_host) """ if self.connection: return self.connection, '' if self.sm.resuming and self.sm.location: # If resuming and server gave a location, connect from there hostname = self.sm.location self.try_connecting_for_foo_secs = app.config.get_per('accounts', self.name, 'try_connecting_for_foo_secs') use_custom = False proxy = helpers.get_proxy_info(self.name) elif data: hostname = data['hostname'] self.try_connecting_for_foo_secs = 45 p = data['proxy'] if p and p in app.config.get_per('proxies'): proxy = {} proxyptr = app.config.get_per('proxies', p) for key in proxyptr.keys(): proxy[key] = proxyptr[key] else: proxy = None use_srv = True use_custom = data['use_custom_host'] if use_custom: custom_h = data['custom_host'] custom_p = data['custom_port'] else: hostname = app.config.get_per('accounts', self.name, 'hostname') self.try_connecting_for_foo_secs = app.config.get_per('accounts', self.name, 'try_connecting_for_foo_secs') proxy = helpers.get_proxy_info(self.name) use_srv = app.config.get_per('accounts', self.name, 'use_srv') if self.redirected: use_custom = True custom_h = self.redirected['host'] custom_p = self.redirected['port'] else: use_custom = app.config.get_per('accounts', self.name, 'use_custom_host') if use_custom: custom_h = app.config.get_per('accounts', self.name, 'custom_host') custom_p = app.config.get_per('accounts', self.name, 'custom_port') try: helpers.idn_to_ascii(custom_h) except Exception: app.nec.push_incoming_event(InformationEvent( None, dialog_name='invalid-custom-hostname', args=custom_h)) use_custom = False # create connection if it doesn't already exist self.connected = 1 h = hostname p = 5222 ssl_p = 5223 if use_custom: h = custom_h p = custom_p ssl_p = custom_p if not self.redirected: use_srv = False self.redirected = None # SRV resolver self._proxy = proxy self._hosts = [ {'host': h, 'port': p, 'type': 'tls', 'prio': 10, 'weight': 10, 'alpn': False}, {'host': h, 'port': ssl_p, 'type': 'ssl', 'prio': 10, 'weight': 10, 'alpn': False}, {'host': h, 'port': p, 'type': 'plain', 'prio': 10, 'weight': 10, 'alpn': False} ] self._hostname = hostname if h: app.resolver.resolve('_xmppconnect.' + helpers.idn_to_ascii(h), self._on_resolve_txt, type_='txt') if use_srv and self._proxy is None: self._srv_hosts = [] services = [SERVICE_START_TLS, SERVICE_DIRECT_TLS] self._num_pending_srv_records = len(services) for service in services: record_name = '_' + service + '._tcp.' + helpers.idn_to_ascii(h) app.resolver.resolve(record_name, self._on_resolve_srv) else: self._connect_to_next_host() def _append_srv_record(self, record, con_type): tmp = record.copy() tmp['type'] = con_type if tmp in self._srv_hosts: return self._srv_hosts.append(tmp) def _on_resolve_srv(self, host, result): for record in result: service = host[1:] if service.startswith(SERVICE_START_TLS): record['alpn'] = False self._append_srv_record(record, 'tls') self._append_srv_record(record, 'plain') elif service.startswith(SERVICE_DIRECT_TLS): record['alpn'] = True self._append_srv_record(record, 'ssl') self._num_pending_srv_records -= 1 if self._num_pending_srv_records: return if self._srv_hosts: self._hosts = self._srv_hosts.copy() self._connect_to_next_host() def _on_resolve_txt(self, host, result_array): for res in result_array: if res.startswith('_xmpp-client-xbosh='): url = res[19:] found = False proxies = app.config.get_per('proxies') for p in proxies: if app.config.get_per('proxies', p, 'type') == 'bosh' \ and app.config.get_per('proxies', p, 'bosh_uri') == url: found = True break if not found: h = app.config.get_per('accounts', self.name, 'hostname') p = 'bosh_' + h i = 0 while p in proxies: i += 1 p = 'bosh_' + h + str(i) app.config.add_per('proxies', p) app.config.set_per('proxies', p, 'type', 'bosh') app.config.set_per('proxies', p, 'bosh_uri', url) def _connect_to_next_host(self, retry=False): log.debug('Connection to next host') if not self._hosts: if not retry and self.retrycount == 0: log.debug("Out of hosts, giving up connecting to %s", self.name) self.time_to_reconnect = None if self.on_connect_failure: self.on_connect_failure() self.on_connect_failure = None else: # shown error dialog self._connection_lost() else: # try reconnect if connection has failed before auth to server self.disconnectedReconnCB() return connection_types = ['tls', 'ssl'] allow_plaintext_connection = app.config.get_per('accounts', self.name, 'allow_plaintext_connection') if allow_plaintext_connection: connection_types.append('plain') if self._proxy and self._proxy['type'] == 'bosh': # with BOSH, we can't do TLS negotiation with , we do only "plain" # connection and TLS with handshake right after TCP connecting ("ssl") scheme = nbxmpp.transports_nb.urisplit(self._proxy['bosh_uri'])[0] if scheme == 'https': connection_types = ['ssl'] else: connection_types = ['plain'] host = self._select_next_host(self._hosts) self._hosts.remove(host) # Skip record if connection type is not supported. if host['type'] not in connection_types: log.debug("Skipping connection record with unsupported type: %s" % host['type']) self._connect_to_next_host(retry) return self._current_host = host if self.redirected: self.disconnect(on_purpose=True) self.connect() return self._current_type = self._current_host['type'] port = self._current_host['port'] cacerts = '' if os.name == 'nt': cacerts = certifi.where() mycerts = common.app.MY_CACERTS tls_version = app.config.get_per('accounts', self.name, 'tls_version') cipher_list = app.config.get_per('accounts', self.name, 'cipher_list') secure_tuple = (self._current_type, cacerts, mycerts, tls_version, cipher_list, self._current_host['alpn']) con = nbxmpp.NonBlockingClient( domain=self._hostname, caller=self, idlequeue=app.idlequeue) # increase default timeout for server responses nbxmpp.dispatcher_nb.DEFAULT_TIMEOUT_SECONDS = \ self.try_connecting_for_foo_secs # FIXME: this is a hack; need a better way if self.on_connect_success == self._on_new_account: con.RegisterDisconnectHandler(self._on_new_account) if self.client_cert and app.config.get_per('accounts', self.name, 'client_cert_encrypted'): app.nec.push_incoming_event(ClientCertPassphraseEvent( None, conn=self, con=con, port=port, secure_tuple=secure_tuple)) return self.on_client_cert_passphrase('', con, port, secure_tuple) def on_client_cert_passphrase(self, passphrase, con, port, secure_tuple): self.client_cert_passphrase = passphrase self.log_hosttype_info(port) con.connect( hostname=self._current_host['host'], port=port, on_connect=self.on_connect_success, on_proxy_failure=self.on_proxy_failure, on_connect_failure=self._connect_to_next_host, on_stream_error_cb=self._StreamCB, proxy=self._proxy, secure_tuple=secure_tuple) def log_hosttype_info(self, port): msg = '>>>>>> Connecting to %s [%s:%d], type = %s' % (self.name, self._current_host['host'], port, self._current_type) log.info(msg) if self._proxy: msg = '>>>>>> ' if self._proxy['type']=='bosh': msg = '%s over BOSH %s' % (msg, self._proxy['bosh_uri']) if self._proxy['type'] in ['http', 'socks5'] or self._proxy['bosh_useproxy']: msg = '%s over proxy %s:%s' % (msg, self._proxy['host'], self._proxy['port']) log.info(msg) def _connect_failure(self, con_type=None): if not con_type: # we are not retrying, and not conecting if not self.retrycount and self.connected != 0: self.disconnect(on_purpose = True) if self._proxy: pritxt = _('Could not connect to "%(host)s" via proxy "%(proxy)s"') %\ {'host': self._hostname, 'proxy': self._proxy['host']} else: pritxt = _('Could not connect to "%(host)s"') % {'host': \ self._hostname} sectxt = _('Check your connection or try again later.') if self.streamError: # show error dialog key = nbxmpp.NS_XMPP_STREAMS + ' ' + self.streamError if key in nbxmpp.ERRORS: sectxt2 = _('Server replied: %s') % nbxmpp.ERRORS[key][2] app.nec.push_incoming_event(InformationEvent(None, conn=self, level='error', pri_txt=pritxt, sec_txt='%s\n%s' % (sectxt2, sectxt))) return # show popup app.nec.push_incoming_event(ConnectionLostEvent(None, conn=self, title=pritxt, msg=sectxt)) def on_proxy_failure(self, reason): log.error('Connection to proxy failed: %s' % reason) self.time_to_reconnect = None self.on_connect_failure = None self.disconnect(on_purpose = True) app.nec.push_incoming_event(ConnectionLostEvent(None, conn=self, title=_('Connection to proxy failed'), msg=reason)) def _connect_success(self, con, con_type): if not self.connected: # We went offline during connecting process # FIXME - not possible, maybe it was when we used threads return _con_type = con_type if _con_type != self._current_type: log.info('Connecting to next host beacuse desired type is %s and returned is %s' % (self._current_type, _con_type)) self._connect_to_next_host() return con.RegisterDisconnectHandler(self._on_disconnected) if _con_type == 'plain' and app.config.get_per('accounts', self.name, 'action_when_plaintext_connection') == 'warn': app.nec.push_incoming_event(PlainConnectionEvent(None, conn=self, xmpp_client=con)) return True if _con_type == 'plain' and app.config.get_per('accounts', self.name, 'action_when_plaintext_connection') == 'disconnect': self.disconnect(on_purpose=True) app.nec.push_incoming_event(OurShowEvent(None, conn=self, show='offline')) return False if _con_type in ('tls', 'ssl') and con.Connection.ssl_lib != 'PYOPENSSL' \ and app.config.get_per('accounts', self.name, 'warn_when_insecure_ssl_connection') and \ not self.connection_auto_accepted: # Pyopenssl is not used app.nec.push_incoming_event(InsecureSSLConnectionEvent(None, conn=self, xmpp_client=con, conn_type=_con_type)) return True return self.connection_accepted(con, con_type) def connection_accepted(self, con, con_type): if not con or not con.Connection: self.disconnect(on_purpose=True) app.nec.push_incoming_event(ConnectionLostEvent(None, conn=self, title=_('Could not connect to account %s') % self.name, msg=_('Connection with account %s has been lost. Retry ' 'connecting.') % self.name)) return self._hosts = [] self.connection_auto_accepted = False self.connected_hostname = self._current_host['host'] self.on_connect_failure = None con.UnregisterDisconnectHandler(self._on_disconnected) con.RegisterDisconnectHandler(self.disconnectedReconnCB) log.debug('Connected to server %s:%s with %s' % ( self._current_host['host'], self._current_host['port'], con_type)) if app.config.get_per('accounts', self.name, 'anonymous_auth'): name = None else: name = app.config.get_per('accounts', self.name, 'name') hostname = app.config.get_per('accounts', self.name, 'hostname') self.connection = con try: errnum = con.Connection.ssl_errnum except AttributeError: errnum = 0 cert = con.Connection.ssl_certificate if errnum > 0 and str(errnum) not in app.config.get_per('accounts', self.name, 'ignore_ssl_errors').split(): text = _('The authenticity of the %s certificate could be invalid' ) % hostname if errnum in ssl_error: text += _('\nSSL Error: %s') % ssl_error[errnum] else: text += _('\nUnknown SSL error: %d') % errnum fingerprint_sha1 = cert.digest('sha1').decode('utf-8') fingerprint_sha256 = cert.digest('sha256').decode('utf-8') pem = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, cert).decode('utf-8') app.nec.push_incoming_event(SSLErrorEvent(None, conn=self, error_text=text, error_num=errnum, cert=pem, fingerprint_sha1=fingerprint_sha1, fingerprint_sha256=fingerprint_sha256, certificate=cert)) return True if cert: fingerprint_sha1 = cert.digest('sha1').decode('utf-8') fingerprint_sha256 = cert.digest('sha256').decode('utf-8') saved_fingerprint_sha1 = app.config.get_per('accounts', self.name, 'ssl_fingerprint_sha1') if saved_fingerprint_sha1: # Check sha1 fingerprint if fingerprint_sha1 != saved_fingerprint_sha1: if not check_X509.check_certificate(cert, hostname): app.nec.push_incoming_event(FingerprintErrorEvent( None, conn=self, certificate=cert, new_fingerprint_sha1=fingerprint_sha1, new_fingerprint_sha256=fingerprint_sha256)) return True app.config.set_per('accounts', self.name, 'ssl_fingerprint_sha1', fingerprint_sha1) saved_fingerprint_sha256 = app.config.get_per('accounts', self.name, 'ssl_fingerprint_sha256') if saved_fingerprint_sha256: # Check sha256 fingerprint if fingerprint_sha256 != saved_fingerprint_sha256: if not check_X509.check_certificate(cert, hostname): app.nec.push_incoming_event(FingerprintErrorEvent( None, conn=self, certificate=cert, new_fingerprint_sha1=fingerprint_sha1, new_fingerprint_sha256=fingerprint_sha256)) return True app.config.set_per('accounts', self.name, 'ssl_fingerprint_sha256', fingerprint_sha256) if not check_X509.check_certificate(cert, hostname) and \ '100' not in app.config.get_per('accounts', self.name, 'ignore_ssl_errors').split(): pem = OpenSSL.crypto.dump_certificate( OpenSSL.crypto.FILETYPE_PEM, cert).decode('utf-8') txt = _('The authenticity of the %s certificate could be ' 'invalid.\nThe certificate does not cover this domain.') %\ hostname app.nec.push_incoming_event(SSLErrorEvent(None, conn=self, error_text=txt, error_num=100, cert=pem, fingerprint_sha1=fingerprint_sha1, fingerprint_sha256=fingerprint_sha256, certificate=cert)) return True self._register_handlers(con, con_type) auth_mechs = app.config.get_per('accounts', self.name, 'authentication_mechanisms') auth_mechs = auth_mechs.split() for mech in auth_mechs: if mech not in nbxmpp.auth_nb.SASL_AUTHENTICATION_MECHANISMS | set(['XEP-0078']): log.warning("Unknown authentication mechanisms %s" % mech) if len(auth_mechs) == 0: auth_mechs = None else: auth_mechs = set(auth_mechs) con.auth(user=name, password=self.password, resource=self.server_resource, sasl=True, on_auth=self.__on_auth, auth_mechs=auth_mechs) def ssl_certificate_accepted(self): if not self.connection: self.disconnect(on_purpose=True) app.nec.push_incoming_event(ConnectionLostEvent(None, conn=self, title=_('Could not connect to account %s') % self.name, msg=_('Connection with account %s has been lost. Retry ' 'connecting.') % self.name)) return if app.config.get_per('accounts', self.name, 'anonymous_auth'): name = None else: name = app.config.get_per('accounts', self.name, 'name') self._register_handlers(self.connection, 'ssl') self.connection.auth(name, self.password, self.server_resource, 1, self.__on_auth) def _register_handlers(self, con, con_type): self.peerhost = con.get_peerhost() app.con_types[self.name] = con_type # notify the gui about con_type app.nec.push_incoming_event(ConnectionTypeEvent(None, conn=self, connection_type=con_type)) ConnectionHandlers._register_handlers(self, con, con_type) def __on_auth(self, con, auth): if not con: self.disconnect(on_purpose=True) app.nec.push_incoming_event(ConnectionLostEvent(None, conn=self, title=_('Could not connect to "%s"') % self._hostname, msg=_('Check your connection or try again later.'))) if self.on_connect_auth: self.on_connect_auth(None) self.on_connect_auth = None return if not self.connected: # We went offline during connecting process if self.on_connect_auth: self.on_connect_auth(None) self.on_connect_auth = None return if hasattr(con, 'Resource'): self.server_resource = con.Resource if con._registered_name is not None: log.info('Bound JID: %s', con._registered_name) self.registered_name = con._registered_name if app.config.get_per('accounts', self.name, 'anonymous_auth'): # Get jid given by server old_jid = app.get_jid_from_account(self.name) app.config.set_per('accounts', self.name, 'name', con.User) new_jid = app.get_jid_from_account(self.name) app.nec.push_incoming_event(AnonymousAuthEvent(None, conn=self, old_jid=old_jid, new_jid=new_jid)) if auth: self.last_io = app.idlequeue.current_time() self.connected = 2 self.retrycount = 0 if self.on_connect_auth: self.on_connect_auth(con) self.on_connect_auth = None else: if not app.config.get_per('accounts', self.name, 'savepass'): # Forget password, it's wrong self.password = None log.debug("Couldn't authenticate to %s" % self._hostname) self.disconnect(on_purpose = True) app.nec.push_incoming_event(OurShowEvent(None, conn=self, show='offline')) app.nec.push_incoming_event(InformationEvent(None, conn=self, level='error', pri_txt=_('Authentication failed with "%s"') % \ self._hostname, sec_txt=_('Please check your login and password' ' for correctness.'))) if self.on_connect_auth: self.on_connect_auth(None) self.on_connect_auth = None # END connect def add_lang(self, stanza): if self.lang: stanza.setAttr('xml:lang', self.lang) def get_privacy_lists(self): if not app.account_is_connected(self.name): return nbxmpp.features_nb.getPrivacyLists(self.connection) def send_keepalive(self): # nothing received for the last foo seconds if self.connection: self.connection.send(' ') def _on_xmpp_ping_answer(self, iq_obj): self.awaiting_xmpp_ping_id = None def sendPing(self, pingTo=None, control=None): """ Send XMPP Ping (XEP-0199) request. If pingTo is not set, ping is sent to server to detect connection failure at application level If control is set, display result there """ if not app.account_is_connected(self.name): return id_ = self.connection.getAnID() if pingTo: to = pingTo.get_full_jid() app.nec.push_incoming_event(PingSentEvent(None, conn=self, contact=pingTo)) else: to = app.config.get_per('accounts', self.name, 'hostname') self.awaiting_xmpp_ping_id = id_ iq = nbxmpp.Iq('get', to=to) iq.addChild(name='ping', namespace=nbxmpp.NS_PING) iq.setID(id_) def _on_response(resp): timePong = time.time() if not nbxmpp.isResultNode(resp): app.nec.push_incoming_event(PingErrorEvent(None, conn=self, contact=pingTo)) return timeDiff = round(timePong - timePing, 2) app.nec.push_incoming_event(PingReplyEvent(None, conn=self, contact=pingTo, seconds=timeDiff, control=control)) if pingTo: timePing = time.time() self.connection.SendAndCallForResponse(iq, _on_response) else: self.connection.SendAndCallForResponse(iq, self._on_xmpp_ping_answer) app.idlequeue.set_alarm(self.check_pingalive, app.config.get_per( 'accounts', self.name, 'time_for_ping_alive_answer')) def get_active_default_lists(self): if not app.account_is_connected(self.name): return nbxmpp.features_nb.getActiveAndDefaultPrivacyLists(self.connection) def del_privacy_list(self, privacy_list): if not app.account_is_connected(self.name): return def _on_del_privacy_list_result(result): if result: app.nec.push_incoming_event(PrivacyListRemovedEvent(None, conn=self, list_name=privacy_list)) else: app.nec.push_incoming_event(InformationEvent( None, dialog_name='privacy-list-error', args=privacy_list)) nbxmpp.features_nb.delPrivacyList(self.connection, privacy_list, _on_del_privacy_list_result) def get_privacy_list(self, title): if not app.account_is_connected(self.name): return nbxmpp.features_nb.getPrivacyList(self.connection, title) def set_privacy_list(self, listname, tags): if not app.account_is_connected(self.name): return nbxmpp.features_nb.setPrivacyList(self.connection, listname, tags) def set_active_list(self, listname): if not app.account_is_connected(self.name): return nbxmpp.features_nb.setActivePrivacyList(self.connection, listname, 'active') def set_default_list(self, listname): if not app.account_is_connected(self.name): return nbxmpp.features_nb.setDefaultPrivacyList(self.connection, listname) def build_privacy_rule(self, name, action, order=1): """ Build a Privacy rule stanza for invisibility """ iq = nbxmpp.Iq('set', nbxmpp.NS_PRIVACY, xmlns='') l = iq.setQuery().setTag('list', {'name': name}) i = l.setTag('item', {'action': action, 'order': str(order)}) i.setTag('presence-out') return iq def build_invisible_rule(self): iq = nbxmpp.Iq('set', nbxmpp.NS_PRIVACY, xmlns='') l = iq.setQuery().setTag('list', {'name': 'invisible'}) if self.name in app.interface.status_sent_to_groups and \ len(app.interface.status_sent_to_groups[self.name]) > 0: for group in app.interface.status_sent_to_groups[self.name]: i = l.setTag('item', {'type': 'group', 'value': group, 'action': 'allow', 'order': '1'}) i.setTag('presence-out') if self.name in app.interface.status_sent_to_users and \ len(app.interface.status_sent_to_users[self.name]) > 0: for jid in app.interface.status_sent_to_users[self.name]: i = l.setTag('item', {'type': 'jid', 'value': jid, 'action': 'allow', 'order': '2'}) i.setTag('presence-out') i = l.setTag('item', {'action': 'deny', 'order': '3'}) i.setTag('presence-out') return iq def set_invisible_rule(self): if not app.account_is_connected(self.name): return iq = self.build_invisible_rule() self.connection.send(iq) def get_max_blocked_list_order(self): max_order = 0 for rule in self.blocked_list: order = int(rule['order']) if order > max_order: max_order = order return max_order def block_contacts(self, contact_list, message): if self.privacy_default_list is None: self.privacy_default_list = 'block' if not self.privacy_rules_supported: if self.blocking_supported: #XEP-0191 iq = nbxmpp.Iq('set', xmlns='') query = iq.setQuery(name='block') query.setNamespace(nbxmpp.NS_BLOCKING) for contact in contact_list: query.addChild(name='item', attrs={'jid': contact.jid}) self.connection.send(iq) return for contact in contact_list: contact.show = 'offline' self.send_custom_status('offline', message, contact.jid) max_order = self.get_max_blocked_list_order() new_rule = {'order': str(max_order + 1), 'type': 'jid', 'action': 'deny', 'value': contact.jid} self.blocked_list.append(new_rule) self.blocked_contacts.append(contact.jid) self.set_privacy_list(self.privacy_default_list, self.blocked_list) if len(self.blocked_list) == 1: self.set_default_list(self.privacy_default_list) def unblock_contacts(self, contact_list): if not self.privacy_rules_supported: if self.blocking_supported: #XEP-0191 iq = nbxmpp.Iq('set', xmlns='') query = iq.setQuery(name='unblock') query.setNamespace(nbxmpp.NS_BLOCKING) for contact in contact_list: query.addChild(name='item', attrs={'jid': contact.jid}) self.connection.send(iq) return self.new_blocked_list = [] self.to_unblock = [] for contact in contact_list: self.to_unblock.append(contact.jid) if contact.jid in self.blocked_contacts: self.blocked_contacts.remove(contact.jid) for rule in self.blocked_list: if rule['action'] != 'deny' or rule['type'] != 'jid' \ or rule['value'] not in self.to_unblock: self.new_blocked_list.append(rule) if len(self.new_blocked_list) == 0: self.blocked_list = [] self.blocked_contacts = [] self.blocked_groups = [] self.set_default_list('') self.del_privacy_list(self.privacy_default_list) else: self.set_privacy_list(self.privacy_default_list, self.new_blocked_list) if not app.interface.roster.regroup: show = app.SHOW_LIST[self.connected] else: # accounts merged show = helpers.get_global_show() if show == 'invisible': return for contact in contact_list: self.send_custom_status(show, self.status, contact.jid) # Send a presence Probe to get the current Status probe = nbxmpp.Presence(contact.jid, 'probe', frm=self.get_own_jid()) self.connection.send(probe) def block_group(self, group, contact_list, message): if not self.privacy_rules_supported: return self.blocked_groups.append(group) for contact in contact_list: self.send_custom_status('offline', message, contact.jid) max_order = self.get_max_blocked_list_order() new_rule = {'order': str(max_order + 1), 'type': 'group', 'action': 'deny', 'value': group} self.blocked_list.append(new_rule) self.set_privacy_list(self.privacy_default_list, self.blocked_list) if len(self.blocked_list) == 1: self.set_default_list(self.privacy_default_list) def unblock_group(self, group, contact_list): if not self.privacy_rules_supported: return if group in self.blocked_groups: self.blocked_groups.remove(group) self.new_blocked_list = [] for rule in self.blocked_list: if rule['action'] != 'deny' or rule['type'] != 'group' or \ rule['value'] != group: self.new_blocked_list.append(rule) if len(self.new_blocked_list) == 0: self.blocked_list = [] self.blocked_contacts = [] self.blocked_groups = [] self.set_default_list('') self.del_privacy_list(self.privacy_default_list) else: self.set_privacy_list(self.privacy_default_list, self.new_blocked_list) if not app.interface.roster.regroup: show = app.SHOW_LIST[self.connected] else: # accounts merged show = helpers.get_global_show() if show == 'invisible': return for contact in contact_list: self.send_custom_status(show, self.status, contact.jid) def send_invisible_presence(self, msg, signed, initial = False): if not app.account_is_connected(self.name): return if not self.privacy_rules_supported: app.nec.push_incoming_event(OurShowEvent(None, conn=self, show=app.SHOW_LIST[self.connected])) app.nec.push_incoming_event(InformationEvent( None, dialog_name='invisibility-not-supported', args=self.name)) return # If we are already connected, and privacy rules are supported, send # offline presence first as it's required by XEP-0126 if self.connected > 1 and self.privacy_rules_supported: self.on_purpose = True p = nbxmpp.Presence(typ='unavailable') p = self.add_sha(p, False) if msg: p.setStatus(msg) self.remove_all_transfers() self.connection.send(p) # try to set the privacy rule iq = self.build_invisible_rule() self.connection.SendAndCallForResponse(iq, self._continue_invisible, {'msg': msg, 'signed': signed, 'initial': initial}) def _continue_invisible(self, con, iq_obj, msg, signed, initial): if iq_obj.getType() == 'error': # server doesn't support privacy lists return # active the privacy rule self.set_active_list('invisible') self.connected = app.SHOW_LIST.index('invisible') self.status = msg priority = app.get_priority(self.name, 'invisible') p = nbxmpp.Presence(priority=priority) p = self.add_sha(p, True) if msg: p.setStatus(msg) if signed: p.setTag(nbxmpp.NS_SIGNED + ' x').setData(signed) self.connection.send(p) self.priority = priority app.nec.push_incoming_event(OurShowEvent(None, conn=self, show='invisible')) if initial: # ask our VCard self.request_vcard(self._on_own_avatar_received) # Get bookmarks from private namespace self.get_bookmarks() # Get annotations self.get_annotations() # Inform GUI we just signed in app.nec.push_incoming_event(SignedInEvent(None, conn=self)) def get_signed_presence(self, msg, callback = None): if app.config.get_per('accounts', self.name, 'gpg_sign_presence'): return self.get_signed_msg(msg, callback) return '' def connect_and_auth(self): self.on_connect_success = self._connect_success self.on_connect_failure = self._connect_failure self.connect() def connect_and_init(self, show, msg, sign_msg): self.continue_connect_info = [show, msg, sign_msg] self.on_connect_auth = self._discover_server_at_connection self.connect_and_auth() def _discover_server_at_connection(self, con): self.connection = con if not app.account_is_connected(self.name): return self.connection.set_send_timeout(self.keepalives, self.send_keepalive) self.connection.set_send_timeout2(self.pingalives, self.sendPing) self.connection.onreceive(None) self.privacy_rules_requested = False # If we are not resuming, we ask for discovery info # and archiving preferences if not self.sm.supports_sm or (not self.sm.resuming and self.sm.enabled): our_jid = app.get_jid_from_account(self.name) our_server = app.config.get_per('accounts', self.name, 'hostname') self.discoverInfo(our_jid, id_prefix='Gajim_') self.discoverInfo(our_server, id_prefix='Gajim_') self.sm.resuming = False # back to previous state # Discover Stun server(s) if self._proxy is None: hostname = app.config.get_per('accounts', self.name, 'hostname') app.resolver.resolve('_stun._udp.' + helpers.idn_to_ascii(hostname), self._on_stun_resolved) def _on_stun_resolved(self, host, result_array): if len(result_array) != 0: self._stun_servers = self._hosts = [i for i in result_array] def _request_privacy(self): if not app.account_is_connected(self.name) or not self.connection: return iq = nbxmpp.Iq('get', nbxmpp.NS_PRIVACY, xmlns='') id_ = self.connection.getAnID() iq.setID(id_) self.awaiting_answers[id_] = (PRIVACY_ARRIVED, ) self.connection.send(iq) def _request_blocking(self): if not app.account_is_connected(self.name) or not self.connection: return iq = nbxmpp.Iq('get', xmlns=None) iq.setQuery('blocklist').setNamespace(nbxmpp.NS_BLOCKING) self.connection.send(iq) def _continue_connection_request_privacy(self): if self.privacy_rules_supported: if not self.privacy_rules_requested: self.privacy_rules_requested = True self._request_privacy() else: if self.continue_connect_info and self.continue_connect_info[0]\ == 'invisible': # Trying to login as invisible but privacy list not # supported self.disconnect(on_purpose=True) app.nec.push_incoming_event(OurShowEvent(None, conn=self, show='offline')) app.nec.push_incoming_event(InformationEvent( None, dialog_name='invisibility-not-supported', args=self.name)) return if self.blocking_supported: self._request_blocking() # Ask metacontacts before roster self.get_metacontacts() def _nec_agent_info_error_received(self, obj): if obj.conn.name != self.name: return hostname = app.config.get_per('accounts', self.name, 'hostname') if obj.id_[:6] == 'Gajim_' and obj.fjid == hostname: self._continue_connection_request_privacy() def _nec_agent_info_received(self, obj): if obj.conn.name != self.name: return is_muc = False transport_type = '' for identity in obj.identities: if 'category' in identity and identity['category'] in ('gateway', 'headline') and 'type' in identity: transport_type = identity['type'] if 'category' in identity and identity['category'] == 'server' and \ 'type' in identity and identity['type'] == 'im': transport_type = 'jabber' # it's a jabber server if 'category' in identity and identity['category'] == 'conference' \ and 'type' in identity and identity['type'] == 'text': is_muc = True if transport_type != '' and obj.fjid not in app.transport_type: app.transport_type[obj.fjid] = transport_type app.logger.save_transport_type(obj.fjid, transport_type) if obj.id_[:6] == 'Gajim_': hostname = app.config.get_per('accounts', self.name, 'hostname') our_jid = app.get_jid_from_account(self.name) if obj.fjid == our_jid: if nbxmpp.NS_MAM_2 in obj.features: self.archiving_namespace = nbxmpp.NS_MAM_2 elif nbxmpp.NS_MAM_1 in obj.features: self.archiving_namespace = nbxmpp.NS_MAM_1 if self.archiving_namespace: self.archiving_supported = True self.archiving_313_supported = True get_action(self.name + '-archive').set_enabled(True) for identity in obj.identities: if identity['category'] == 'pubsub': self.pep_supported = identity.get('type') == 'pep' break if nbxmpp.NS_PUBSUB_PUBLISH_OPTIONS in obj.features: self.pubsub_publish_options_supported = True else: # Remove stored bookmarks accessible to everyone. self.send_pb_purge(our_jid, 'storage:bookmarks') self.send_pb_delete(our_jid, 'storage:bookmarks') if obj.fjid == hostname: if nbxmpp.NS_SECLABEL in obj.features: self.seclabel_supported = True if nbxmpp.NS_VCARD in obj.features: self.vcard_supported = True get_action(self.name + '-profile').set_enabled(True) if nbxmpp.NS_REGISTER in obj.features: self.register_supported = True if nbxmpp.NS_BLOCKING in obj.features: self.blocking_supported = True if nbxmpp.NS_ADDRESS in obj.features: self.addressing_supported = True if nbxmpp.NS_CARBONS in obj.features: self.carbons_available = True if app.config.get_per('accounts', self.name, 'enable_message_carbons'): # Server supports carbons, activate it iq = nbxmpp.Iq('set') iq.setTag('enable', namespace=nbxmpp.NS_CARBONS) self.connection.send(iq) if nbxmpp.NS_PRIVACY in obj.features: self.privacy_rules_supported = True get_action(self.name + '-privacylists').set_enabled(True) self._continue_connection_request_privacy() if nbxmpp.NS_BYTESTREAM in obj.features and \ app.config.get_per('accounts', self.name, 'use_ft_proxies'): our_fjid = helpers.parse_jid(our_jid + '/' + \ self.server_resource) testit = app.config.get_per('accounts', self.name, 'test_ft_proxies_on_startup') app.proxy65_manager.resolve(obj.fjid, self.connection, our_fjid, default=self.name, testit=testit) if nbxmpp.NS_MUC in obj.features and is_muc: type_ = transport_type or 'jabber' self.muc_jid[type_] = obj.fjid if transport_type: if transport_type in self.available_transports: self.available_transports[transport_type].append(obj.fjid) else: self.available_transports[transport_type] = [obj.fjid] def send_custom_status(self, show, msg, jid): if not show in app.SHOW_LIST: return -1 if not app.account_is_connected(self.name): return sshow = helpers.get_xmpp_show(show) if not msg: msg = '' if show == 'offline': p = nbxmpp.Presence(typ='unavailable', to=jid) p = self.add_sha(p, False) if msg: p.setStatus(msg) else: signed = self.get_signed_presence(msg) priority = app.get_priority(self.name, sshow) p = nbxmpp.Presence(typ=None, priority=priority, show=sshow, to=jid) p = self.add_sha(p) if msg: p.setStatus(msg) if signed: p.setTag(nbxmpp.NS_SIGNED + ' x').setData(signed) self.connection.send(p) def _change_to_invisible(self, msg): signed = self.get_signed_presence(msg) self.send_invisible_presence(msg, signed) def _change_from_invisible(self): if self.privacy_rules_supported: self.set_active_list('') def _update_status(self, show, msg, idle_time=None): xmpp_show = helpers.get_xmpp_show(show) priority = app.get_priority(self.name, xmpp_show) p = nbxmpp.Presence(typ=None, priority=priority, show=xmpp_show) p = self.add_sha(p) if msg: p.setStatus(msg) signed = self.get_signed_presence(msg) if signed: p.setTag(nbxmpp.NS_SIGNED + ' x').setData(signed) if idle_time: idle = p.setTag('idle', namespace=nbxmpp.NS_IDLE) idle.setAttr('since', idle_time) if self.connection: self.connection.send(p) self.priority = priority app.nec.push_incoming_event(OurShowEvent(None, conn=self, show=show)) def send_motd(self, jid, subject='', msg='', xhtml=None): if not app.account_is_connected(self.name): return msg_iq = nbxmpp.Message(to=jid, body=msg, subject=subject, xhtml=xhtml) self.connection.send(msg_iq) def _nec_message_outgoing(self, obj): if obj.account != self.name: return self._prepare_message(obj) def _nec_stanza_message_outgoing(self, obj): if obj.conn.name != self.name: return config_key = '%s-%s' % (self.name, obj.jid) encryption = app.config.get_per('encryption', config_key, 'encryption') if encryption: app.plugin_manager.extension_point( 'encrypt' + encryption, self, obj, self.send_message) if not obj.encrypted: # Dont propagate event return True else: self.send_message(obj) def send_message(self, obj): obj.timestamp = time.time() obj.stanza_id = self.connection.send(obj.msg_iq, now=obj.now) app.nec.push_incoming_event(MessageSentEvent(None, **vars(obj))) if isinstance(obj.jid, list): for j in obj.jid: if obj.session is None: obj.session = self.get_or_create_session(j, '') self.log_message(obj, j) else: self.log_message(obj, obj.jid) def send_contacts(self, contacts, fjid, type_='message'): """ Send contacts with RosterX (Xep-0144) """ if not app.account_is_connected(self.name): return if type_ == 'message': if len(contacts) == 1: msg = _('Sent contact: "%(jid)s" (%(name)s)') % { 'jid': contacts[0].get_full_jid(), 'name': contacts[0].get_shown_name()} else: msg = _('Sent contacts:') for contact in contacts: msg += '\n "%s" (%s)' % (contact.get_full_jid(), contact.get_shown_name()) stanza = nbxmpp.Message(to=app.get_jid_without_resource(fjid), body=msg) elif type_ == 'iq': stanza = nbxmpp.Iq(to=fjid, typ='set') x = stanza.addChild(name='x', namespace=nbxmpp.NS_ROSTERX) for contact in contacts: x.addChild(name='item', attrs={'action': 'add', 'jid': contact.jid, 'name': contact.get_shown_name()}) self.connection.send(stanza) def send_stanza(self, stanza): """ Send a stanza untouched """ if not self.connection: return self.connection.send(stanza) def ack_subscribed(self, jid): if not app.account_is_connected(self.name): return log.debug('ack\'ing subscription complete for %s' % jid) p = nbxmpp.Presence(jid, 'subscribe') self.connection.send(p) def ack_unsubscribed(self, jid): if not app.account_is_connected(self.name): return log.debug('ack\'ing unsubscription complete for %s' % jid) p = nbxmpp.Presence(jid, 'unsubscribe') self.connection.send(p) def request_subscription(self, jid, msg='', name='', groups=None, auto_auth=False, user_nick=''): if not app.account_is_connected(self.name): return if groups is None: groups = [] log.debug('subscription request for %s' % jid) if auto_auth: self.jids_for_auto_auth.append(jid) # RFC 3921 section 8.2 infos = {'jid': jid} if name: infos['name'] = name iq = nbxmpp.Iq('set', nbxmpp.NS_ROSTER) q = iq.setQuery() item = q.addChild('item', attrs=infos) for g in groups: item.addChild('group').setData(g) self.connection.send(iq) p = nbxmpp.Presence(jid, 'subscribe') if user_nick: p.setTag('nick', namespace = nbxmpp.NS_NICK).setData(user_nick) p = self.add_sha(p) if msg: p.setStatus(msg) self.connection.send(p) def send_authorization(self, jid): if not app.account_is_connected(self.name): return p = nbxmpp.Presence(jid, 'subscribed') p = self.add_sha(p) self.connection.send(p) def refuse_authorization(self, jid): if not app.account_is_connected(self.name): return p = nbxmpp.Presence(jid, 'unsubscribed') p = self.add_sha(p) self.connection.send(p) def unsubscribe(self, jid, remove_auth = True): if not app.account_is_connected(self.name): return if remove_auth: self.connection.getRoster().delItem(jid) jid_list = app.config.get_per('contacts') for j in jid_list: if j.startswith(jid): app.config.del_per('contacts', j) else: self.connection.getRoster().Unsubscribe(jid) self.update_contact(jid, '', []) def unsubscribe_agent(self, agent): if not app.account_is_connected(self.name): return iq = nbxmpp.Iq('set', nbxmpp.NS_REGISTER, to=agent) iq.setQuery().setTag('remove') id_ = self.connection.getAnID() iq.setID(id_) self.awaiting_answers[id_] = (AGENT_REMOVED, agent) self.connection.send(iq) self.connection.getRoster().delItem(agent) def send_new_account_infos(self, form, is_form): if is_form: # Get username and password and put them in new_account_info for field in form.iter_fields(): if field.var == 'username': self.new_account_info['name'] = field.value if field.var == 'password': self.new_account_info['password'] = field.value else: # Get username and password and put them in new_account_info if 'username' in form: self.new_account_info['name'] = form['username'] if 'password' in form: self.new_account_info['password'] = form['password'] self.new_account_form = form self.new_account(self.name, self.new_account_info) def new_account(self, name, config, sync=False): # If a connection already exist we cannot create a new account if self.connection: return self._hostname = config['hostname'] self.new_account_info = config self.name = name self.on_connect_success = self._on_new_account self.on_connect_failure = self._on_new_account self.connect(config) app.resolver.resolve('_xmppconnect.' + helpers.idn_to_ascii( self._hostname), self._on_resolve_txt, type_='txt') def _on_new_account(self, con=None, con_type=None): if not con_type: if self._hosts: # There are still other way to try to connect return reason = _('Could not connect to "%s"') % self._hostname app.nec.push_incoming_event(NewAccountNotConnectedEvent(None, conn=self, reason=reason)) return self.on_connect_failure = None self.connection = con nbxmpp.features_nb.getRegInfo(con, self._hostname) def request_os_info(self, jid, resource, groupchat_jid=None): """ groupchat_jid is used when we want to send a request to a real jid and act as if the answer comes from the groupchat_jid """ if not app.account_is_connected(self.name): return # If we are invisible, do not request if self.connected == app.SHOW_LIST.index('invisible'): self.dispatch('OS_INFO', (jid, resource, _('Not fetched because of invisible status'), _('Not fetched because of invisible status'))) return to_whom_jid = jid if resource: to_whom_jid += '/' + resource iq = nbxmpp.Iq(to=to_whom_jid, typ='get', queryNS=nbxmpp.NS_VERSION) id_ = self.connection.getAnID() iq.setID(id_) if groupchat_jid: self.groupchat_jids[id_] = groupchat_jid self.version_ids.append(id_) self.connection.send(iq) def request_entity_time(self, jid, resource, groupchat_jid=None): """ groupchat_jid is used when we want to send a request to a real jid and act as if the answer comes from the groupchat_jid """ if not app.account_is_connected(self.name): return # If we are invisible, do not request if self.connected == app.SHOW_LIST.index('invisible'): self.dispatch('ENTITY_TIME', (jid, resource, _('Not fetched because of invisible status'))) return to_whom_jid = jid if resource: to_whom_jid += '/' + resource iq = nbxmpp.Iq(to=to_whom_jid, typ='get') iq.addChild('time', namespace=nbxmpp.NS_TIME_REVISED) id_ = self.connection.getAnID() iq.setID(id_) if groupchat_jid: self.groupchat_jids[id_] = groupchat_jid self.entity_time_ids.append(id_) self.connection.send(iq) def request_gateway_prompt(self, jid, prompt=None): def _on_prompt_result(resp): app.nec.push_incoming_event(GatewayPromptReceivedEvent(None, conn=self, stanza=resp)) if prompt: typ_ = 'set' else: typ_ = 'get' iq = nbxmpp.Iq(typ=typ_, to=jid) query = iq.addChild(name='query', namespace=nbxmpp.NS_GATEWAY) if prompt: query.setTagData('prompt', prompt) self.connection.SendAndCallForResponse(iq, _on_prompt_result) def get_settings(self): """ Get Gajim settings as described in XEP 0049 """ if not app.account_is_connected(self.name): return iq = nbxmpp.Iq(typ='get') iq2 = iq.addChild(name='query', namespace=nbxmpp.NS_PRIVATE) iq2.addChild(name='gajim', namespace='gajim:prefs') self.connection.send(iq) def seclabel_catalogue(self, to, callback): if not app.account_is_connected(self.name): return self.seclabel_catalogue_request(to, callback) server = app.get_jid_from_account(self.name).split("@")[1] # Really, no better way? iq = nbxmpp.Iq(typ='get', to=server) iq2 = iq.addChild(name='catalog', namespace=nbxmpp.NS_SECLABEL_CATALOG) iq2.setAttr('to', to) self.connection.send(iq) def _nec_privacy_list_received(self, obj): roster = app.interface.roster if obj.conn.name != self.name: return if obj.list_name != self.privacy_default_list: return self.blocked_contacts = [] self.blocked_groups = [] self.blocked_list = [] self.blocked_all = False for rule in obj.rules: if rule['action'] == 'allow': if not 'type' in rule: self.blocked_all = False elif rule['type'] == 'jid' and rule['value'] in \ self.blocked_contacts: self.blocked_contacts.remove(rule['value']) elif rule['type'] == 'group' and rule['value'] in \ self.blocked_groups: self.blocked_groups.remove(rule['value']) elif rule['action'] == 'deny': if not 'type' in rule: self.blocked_all = True elif rule['type'] == 'jid' and rule['value'] not in \ self.blocked_contacts: self.blocked_contacts.append(rule['value']) elif rule['type'] == 'group' and rule['value'] not in \ self.blocked_groups: self.blocked_groups.append(rule['value']) self.blocked_list.append(rule) if 'type' in rule: if rule['type'] == 'jid': roster.draw_contact(rule['value'], self.name) if rule['type'] == 'group': roster.draw_group(rule['value'], self.name) def bookmarks_available(self): if self.private_storage_supported: return True if self.pubsub_publish_options_supported: return True return False def _request_bookmarks_xml(self): if not app.account_is_connected(self.name): return iq = nbxmpp.Iq(typ='get') iq2 = iq.addChild(name='query', namespace=nbxmpp.NS_PRIVATE) iq2.addChild(name='storage', namespace='storage:bookmarks') self.connection.send(iq) app.log('bookmarks').info('Request Bookmarks (PrivateStorage)') def _check_bookmarks_received(self): if not self.bookmarks: self._request_bookmarks_xml() def get_bookmarks(self, storage_type=None): """ Get Bookmarks from storage or PubSub if supported as described in XEP 0048 storage_type can be set to xml to force request to xml storage """ if not app.account_is_connected(self.name): return if storage_type != 'xml': if self.pep_supported and self.pubsub_publish_options_supported: self.send_pb_retrieve('', 'storage:bookmarks') app.log('bookmarks').info('Request Bookmarks (PubSub)') # some server (ejabberd) are so slow to answer that we # request via XML if we don't get answer in the next 30 seconds app.idlequeue.set_alarm(self._check_bookmarks_received, 30) return self._request_bookmarks_xml() def get_bookmarks_storage_node(self): NS_GAJIM_BM = 'xmpp:gajim.org/bookmarks' storage_node = nbxmpp.Node( tag='storage', attrs={'xmlns': 'storage:bookmarks'}) for bm in self.bookmarks: conf_node = storage_node.addChild(name="conference") conf_node.setAttr('jid', bm['jid']) conf_node.setAttr('autojoin', bm['autojoin']) conf_node.setAttr('name', bm['name']) conf_node.setTag( 'minimize', namespace=NS_GAJIM_BM).setData(bm['minimize']) # Only add optional elements if not empty # Note: need to handle both None and '' as empty # thus shouldn't use "is not None" if bm.get('nick', None): conf_node.setTagData('nick', bm['nick']) if bm.get('password', None): conf_node.setTagData('password', bm['password']) if bm.get('print_status', None): conf_node.setTag( 'print_status', namespace=NS_GAJIM_BM).setData(bm['print_status']) return storage_node @staticmethod def get_bookmark_publish_options(): options = nbxmpp.Node(nbxmpp.NS_DATA + ' x', attrs={'type': 'submit'}) f = options.addChild('field', attrs={'var': 'FORM_TYPE', 'type': 'hidden'}) f.setTagData('value', nbxmpp.NS_PUBSUB_PUBLISH_OPTIONS) f = options.addChild('field', attrs={'var': 'pubsub#access_model'}) f.setTagData('value', 'whitelist') return options def store_bookmarks(self, storage_type=None): """ Send bookmarks to the storage namespace or PubSub if supported storage_type can be set to 'pubsub' or 'xml' so store in only one method else it will be stored on both """ if not app.account_is_connected(self.name): return storage_node = self.get_bookmarks_storage_node() if storage_type != 'xml': if self.pep_supported and self.pubsub_publish_options_supported: self.send_pb_publish( '', 'storage:bookmarks', storage_node, 'current', options=self.get_bookmark_publish_options()) app.log('bookmarks').info('Bookmarks published (PubSub)') if storage_type != 'pubsub': iq = nbxmpp.Iq('set', nbxmpp.NS_PRIVATE, payload=storage_node) self.connection.send(iq) app.log('bookmarks').info('Bookmarks published (PrivateStorage)') def get_annotations(self): """ Get Annonations from storage as described in XEP 0048, and XEP 0145 """ self.annotations = {} if not app.account_is_connected(self.name): return iq = nbxmpp.Iq(typ='get') iq2 = iq.addChild(name='query', namespace=nbxmpp.NS_PRIVATE) iq2.addChild(name='storage', namespace='storage:rosternotes') self.connection.send(iq) def store_annotations(self): """ Set Annonations in private storage as described in XEP 0048, and XEP 0145 """ if not app.account_is_connected(self.name): return iq = nbxmpp.Iq(typ='set') iq2 = iq.addChild(name='query', namespace=nbxmpp.NS_PRIVATE) iq3 = iq2.addChild(name='storage', namespace='storage:rosternotes') for jid in self.annotations.keys(): if self.annotations[jid]: iq4 = iq3.addChild(name = "note") iq4.setAttr('jid', jid) iq4.setData(self.annotations[jid]) self.connection.send(iq) def get_roster_delimiter(self): """ Get roster group delimiter from storage as described in XEP 0083 """ if not app.account_is_connected(self.name): return iq = nbxmpp.Iq(typ='get') iq2 = iq.addChild(name='query', namespace=nbxmpp.NS_PRIVATE) iq2.addChild(name='roster', namespace='roster:delimiter') id_ = self.connection.getAnID() iq.setID(id_) self.awaiting_answers[id_] = (DELIMITER_ARRIVED, ) self.connection.send(iq) def set_roster_delimiter(self, delimiter='::'): """ Set roster group delimiter to the storage namespace """ if not app.account_is_connected(self.name): return iq = nbxmpp.Iq(typ='set') iq2 = iq.addChild(name='query', namespace=nbxmpp.NS_PRIVATE) iq3 = iq2.addChild(name='roster', namespace='roster:delimiter') iq3.setData(delimiter) self.connection.send(iq) def get_metacontacts(self): """ Get metacontacts list from storage as described in XEP 0049 """ if not app.account_is_connected(self.name): return iq = nbxmpp.Iq(typ='get') iq2 = iq.addChild(name='query', namespace=nbxmpp.NS_PRIVATE) iq2.addChild(name='storage', namespace='storage:metacontacts') id_ = self.connection.getAnID() iq.setID(id_) self.awaiting_answers[id_] = (METACONTACTS_ARRIVED, ) self.connection.send(iq) def store_metacontacts(self, tags_list): """ Send meta contacts to the storage namespace """ if not app.account_is_connected(self.name): return iq = nbxmpp.Iq(typ='set') iq2 = iq.addChild(name='query', namespace=nbxmpp.NS_PRIVATE) iq3 = iq2.addChild(name='storage', namespace='storage:metacontacts') for tag in tags_list: for data in tags_list[tag]: jid = data['jid'] dict_ = {'jid': jid, 'tag': tag} if 'order' in data: dict_['order'] = data['order'] iq3.addChild(name='meta', attrs=dict_) self.connection.send(iq) def request_roster(self): version = None features = self.connection.Dispatcher.Stream.features if features and features.getTag('ver', namespace=nbxmpp.NS_ROSTER_VER): version = app.config.get_per('accounts', self.name, 'roster_version') iq_id = self.connection.initRoster(version=version) self.awaiting_answers[iq_id] = (ROSTER_ARRIVED, ) def send_agent_status(self, agent, ptype): if not app.account_is_connected(self.name): return show = helpers.get_xmpp_show(app.SHOW_LIST[self.connected]) p = nbxmpp.Presence(to=agent, typ=ptype, show=show) p = self.add_sha(p, ptype != 'unavailable') self.connection.send(p) def send_captcha(self, jid, form_node): if not app.account_is_connected(self.name): return iq = nbxmpp.Iq(typ='set', to=jid) captcha = iq.addChild(name='captcha', namespace=nbxmpp.NS_CAPTCHA) captcha.addChild(node=form_node) self.connection.send(iq) def check_unique_room_id_support(self, server, instance): if not app.account_is_connected(self.name): return iq = nbxmpp.Iq(typ='get', to=server) iq.setAttr('id', 'unique1') iq.addChild('unique', namespace=nbxmpp.NS_MUC_UNIQUE) def _on_response(resp): if not nbxmpp.isResultNode(resp): app.nec.push_incoming_event(UniqueRoomIdNotSupportedEvent( None, conn=self, instance=instance, server=server)) return app.nec.push_incoming_event(UniqueRoomIdSupportedEvent(None, conn=self, instance=instance, server=server, room_id=resp.getTag('unique').getData())) self.connection.SendAndCallForResponse(iq, _on_response) def join_gc(self, nick, room_jid, password, change_nick=False, rejoin=False): # FIXME: This room JID needs to be normalized; see #1364 if not app.account_is_connected(self.name): return show = helpers.get_xmpp_show(app.SHOW_LIST[self.connected]) if show == 'invisible': # Never join a room when invisible return self.discoverMUC( room_jid, partial(self._join_gc, nick, show, room_jid, password, change_nick, rejoin)) def _join_gc(self, nick, show, room_jid, password, change_nick, rejoin): # Check time first in the FAST table last_date = app.logger.get_room_last_message_time( self.name, room_jid) if not last_date: last_date = 0 p = nbxmpp.Presence(to='%s/%s' % (room_jid, nick), show=show, status=self.status) h = hmac.new(self.secret_hmac, room_jid.encode('utf-8'), hashlib.md5).\ hexdigest()[:6] id_ = self.connection.getAnID() id_ = 'gajim_muc_' + id_ + '_' + h p.setID(id_) if app.config.get('send_sha_in_gc_presence'): p = self.add_sha(p) self.add_lang(p) if change_nick: self.connection.send(p) return t = p.setTag(nbxmpp.NS_MUC + ' x') if muc_caps_cache.has_mam(room_jid): # The room is MAM capable dont get MUC History t.setTag('history', {'maxchars': '0'}) else: # Request MUC History (not MAM) tags = {} timeout = app.config.get_per('rooms', room_jid, 'muc_restore_timeout') if timeout is None or timeout == -2: timeout = app.config.get('muc_restore_timeout') if last_date == 0 and timeout >= 0: last_date = time.time() - timeout * 60 elif not rejoin and timeout >= 0: last_date = max(last_date, time.time() - timeout * 60) last_date = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime( last_date)) tags['since'] = last_date nb = app.config.get_per('rooms', room_jid, 'muc_restore_lines') if nb is None or nb == -2: nb = app.config.get('muc_restore_lines') if nb >= 0: tags['maxstanzas'] = nb if tags: t.setTag('history', tags) if password: t.setTagData('password', password) self.connection.send(p) def _nec_gc_message_outgoing(self, obj): if obj.account != self.name: return if not app.account_is_connected(self.name): return if not obj.xhtml and app.config.get('rst_formatting_outgoing_messages'): from gajim.common.rst_xhtml_generator import create_xhtml obj.xhtml = create_xhtml(obj.message) msg_iq = nbxmpp.Message(obj.jid, obj.message, typ='groupchat', xhtml=obj.xhtml) obj.stanza_id = self.connection.getAnID() msg_iq.setID(obj.stanza_id) if obj.message: msg_iq.setOriginID(obj.stanza_id) if obj.correct_id: msg_iq.setTag('replace', attrs={'id': obj.correct_id}, namespace=nbxmpp.NS_CORRECT) if obj.chatstate: msg_iq.setTag(obj.chatstate, namespace=nbxmpp.NS_CHATSTATES) if obj.label is not None: msg_iq.addChild(node=obj.label) obj.msg_iq = msg_iq obj.conn = self app.nec.push_incoming_event(GcStanzaMessageOutgoingEvent(None, **vars(obj))) def _nec_gc_stanza_message_outgoing(self, obj): if obj.conn.name != self.name: return config_key = '%s-%s' % (self.name, obj.jid) encryption = app.config.get_per('encryption', config_key, 'encryption') if encryption: app.plugin_manager.extension_point( 'gc_encrypt' + encryption, self, obj, self.send_gc_message) else: self.send_gc_message(obj) def send_gc_message(self, obj): obj.stanza_id = self.connection.send(obj.msg_iq) app.nec.push_incoming_event(MessageSentEvent( None, conn=self, jid=obj.jid, message=obj.message, keyID=None, chatstate=None, automatic_message=obj.automatic_message, stanza_id=obj.stanza_id, additional_data=obj.additional_data)) def send_gc_subject(self, jid, subject): if not app.account_is_connected(self.name): return msg_iq = nbxmpp.Message(jid, typ='groupchat', subject=subject) self.connection.send(msg_iq) def request_gc_config(self, room_jid): if not app.account_is_connected(self.name): return iq = nbxmpp.Iq(typ='get', queryNS=nbxmpp.NS_MUC_OWNER, to=room_jid) self.add_lang(iq) self.connection.send(iq) def destroy_gc_room(self, room_jid, reason = '', jid = ''): if not app.account_is_connected(self.name): return iq = nbxmpp.Iq(typ='set', queryNS=nbxmpp.NS_MUC_OWNER, to=room_jid) destroy = iq.setQuery().setTag('destroy') if reason: destroy.setTagData('reason', reason) if jid: destroy.setAttr('jid', jid) self.connection.send(iq) i = 0 for bm in self.bookmarks: if bm['jid'] == room_jid: del self.bookmarks[i] break i += 1 self.store_bookmarks() def send_gc_status(self, nick, jid, show, status, auto=False): if not app.account_is_connected(self.name): return if show == 'invisible': show = 'offline' ptype = None if show == 'offline': ptype = 'unavailable' xmpp_show = helpers.get_xmpp_show(show) p = nbxmpp.Presence(to='%s/%s' % (jid, nick), typ=ptype, show=xmpp_show, status=status) h = hmac.new(self.secret_hmac, jid.encode('utf-8'), hashlib.md5).\ hexdigest()[:6] id_ = self.connection.getAnID() id_ = 'gajim_muc_' + id_ + '_' + h p.setID(id_) if app.config.get('send_sha_in_gc_presence') and show != 'offline': p = self.add_sha(p, ptype != 'unavailable') self.add_lang(p) if auto: if app.HAVE_IDLE and app.config.get('autoaway'): idle_sec = int(app.interface.sleeper.getIdleSec()) idle_time = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime(time.time() - idle_sec)) idle = p.setTag('idle', namespace=nbxmpp.NS_IDLE) idle.setAttr('since', idle_time) # send instantly so when we go offline, status is sent to gc before we # disconnect from jabber server self.connection.send(p) def gc_set_role(self, room_jid, nick, role, reason=''): """ Role is for all the life of the room so it's based on nick """ if not app.account_is_connected(self.name): return iq = nbxmpp.Iq(typ='set', to=room_jid, queryNS=nbxmpp.NS_MUC_ADMIN) item = iq.setQuery().setTag('item') item.setAttr('nick', nick) item.setAttr('role', role) if reason: item.addChild(name='reason', payload=reason) self.connection.send(iq) def gc_set_affiliation(self, room_jid, jid, affiliation, reason = ''): """ Affiliation is for all the life of the room so it's based on jid """ if not app.account_is_connected(self.name): return iq = nbxmpp.Iq(typ='set', to=room_jid, queryNS=nbxmpp.NS_MUC_ADMIN) item = iq.setQuery().setTag('item') item.setAttr('jid', jid) item.setAttr('affiliation', affiliation) if reason: item.addChild(name = 'reason', payload = reason) self.connection.send(iq) def send_gc_affiliation_list(self, room_jid, users_dict): if not app.account_is_connected(self.name): return iq = nbxmpp.Iq(typ='set', to=room_jid, queryNS=nbxmpp.NS_MUC_ADMIN) item = iq.setQuery() for jid in users_dict: item_tag = item.addChild('item', {'jid': jid, 'affiliation': users_dict[jid]['affiliation']}) if 'reason' in users_dict[jid] and users_dict[jid]['reason']: item_tag.setTagData('reason', users_dict[jid]['reason']) self.connection.send(iq) def get_affiliation_list(self, room_jid, affiliation): if not app.account_is_connected(self.name): return iq = nbxmpp.Iq(typ='get', to=room_jid, queryNS=nbxmpp.NS_MUC_ADMIN) item = iq.setQuery().setTag('item') item.setAttr('affiliation', affiliation) self.connection.send(iq) def send_gc_config(self, room_jid, form): if not app.account_is_connected(self.name): return iq = nbxmpp.Iq(typ='set', to=room_jid, queryNS=nbxmpp.NS_MUC_OWNER) query = iq.setQuery() form.setAttr('type', 'submit') query.addChild(node = form) self.connection.send(iq) def change_password(self, password): if not app.account_is_connected(self.name): return hostname = app.config.get_per('accounts', self.name, 'hostname') username = app.config.get_per('accounts', self.name, 'name') iq = nbxmpp.Iq(typ='set', to=hostname) q = iq.setTag(nbxmpp.NS_REGISTER + ' query') q.setTagData('username', username) q.setTagData('password', password) self.connection.send(iq) def get_password(self, callback, type_): if app.config.get_per('accounts', self.name, 'anonymous_auth') and \ type_ != 'ANONYMOUS': app.nec.push_incoming_event(NonAnonymousServerErrorEvent(None, conn=self)) self._on_disconnected() return self.pasword_callback = (callback, type_) if type_ == 'X-MESSENGER-OAUTH2': client_id = app.config.get_per('accounts', self.name, 'oauth2_client_id') refresh_token = app.config.get_per('accounts', self.name, 'oauth2_refresh_token') if refresh_token: renew_URL = 'https://oauth.live.com/token?client_id=' \ '%(client_id)s&redirect_uri=https%%3A%%2F%%2Foauth.live.' \ 'com%%2Fdesktop&grant_type=refresh_token&refresh_token=' \ '%(refresh_token)s' % locals() result = helpers.download_image(self.name, {'src': renew_URL})[0] if result: dict_ = json.loads(result) if 'access_token' in dict_: self.set_password(dict_['access_token']) return script_url = app.config.get_per('accounts', self.name, 'oauth2_redirect_url') token_URL = 'https://oauth.live.com/authorize?client_id=' \ '%(client_id)s&scope=wl.messenger%%20wl.offline_access&' \ 'response_type=code&redirect_uri=%(script_url)s' % locals() helpers.launch_browser_mailer('url', token_URL) self.disconnect(on_purpose=True) app.nec.push_incoming_event(Oauth2CredentialsRequiredEvent(None, conn=self)) return if self.password: self.set_password(self.password) return app.nec.push_incoming_event(PasswordRequiredEvent(None, conn=self)) def set_password(self, password): self.password = password if self.pasword_callback: callback, type_ = self.pasword_callback if self._current_type == 'plain' and type_ == 'PLAIN' and \ app.config.get_per('accounts', self.name, 'warn_when_insecure_password'): app.nec.push_incoming_event(InsecurePasswordEvent(None, conn=self)) return callback(password) self.pasword_callback = None def accept_insecure_password(self): if self.pasword_callback: callback, type_ = self.pasword_callback callback(self.password) self.pasword_callback = None def unregister_account(self, on_remove_success): # no need to write this as a class method and keep the value of # on_remove_success as a class property as pass it as an argument def _on_unregister_account_connect(con): self.on_connect_auth = None self.removing_account = True if app.account_is_connected(self.name): hostname = app.config.get_per('accounts', self.name, 'hostname') iq = nbxmpp.Iq(typ='set', to=hostname) id_ = self.connection.getAnID() iq.setID(id_) iq.setTag(nbxmpp.NS_REGISTER + ' query').setTag('remove') def _on_answer(con, result): if result.getID() == id_: on_remove_success(True) return app.nec.push_incoming_event(InformationEvent( None, dialog_name='unregister-error', kwargs={'server': hostname, 'error': result.getErrorMsg()})) on_remove_success(False) con.RegisterHandler('iq', _on_answer, 'result', system=True) con.SendAndWaitForResponse(iq) return on_remove_success(False) self.removing_account = False if self.connected == 0: self.on_connect_auth = _on_unregister_account_connect self.connect_and_auth() else: _on_unregister_account_connect(self.connection) def send_invite(self, room, to, reason='', continue_tag=False): """ Send invitation """ if not app.account_is_connected(self.name): return contact = app.contacts.get_contact_from_full_jid(self.name, to) if contact and contact.supports(nbxmpp.NS_CONFERENCE): # send direct invite message=nbxmpp.Message(to=to) attrs = {'jid': room} if reason: attrs['reason'] = reason if continue_tag: attrs['continue'] = 'true' password = app.gc_passwords.get(room, '') if password: attrs['password'] = password c = message.addChild(name='x', attrs=attrs, namespace=nbxmpp.NS_CONFERENCE) self.connection.send(message) return message=nbxmpp.Message(to=room) c = message.addChild(name='x', namespace=nbxmpp.NS_MUC_USER) c = c.addChild(name='invite', attrs={'to': to}) if continue_tag: c.addChild(name='continue') if reason != '': c.setTagData('reason', reason) self.connection.send(message) def decline_invitation(self, room, to, reason=''): """ decline a groupchat invitation """ if not app.account_is_connected(self.name): return message=nbxmpp.Message(to=room) c = message.addChild(name='x', namespace=nbxmpp.NS_MUC_USER) c = c.addChild(name='decline', attrs={'to': to}) if reason != '': c.setTagData('reason', reason) self.connection.send(message) def request_voice(self, room): """ Request voice in a moderated room """ if not app.account_is_connected(self.name): return message = nbxmpp.Message(to=room) x = nbxmpp.DataForm(typ='submit') x.addChild(node=nbxmpp.DataField(name='FORM_TYPE', value=nbxmpp.NS_MUC + '#request')) x.addChild(node=nbxmpp.DataField(name='muc#role', value='participant', typ='text-single')) message.addChild(node=x) self.connection.send(message) def check_pingalive(self): if not app.config.get_per('accounts', self.name, 'active'): # Account may have been disabled return if self.awaiting_xmpp_ping_id: # We haven't got the pong in time, disco and reconnect log.warning("No reply received for keepalive ping. Reconnecting.") self.disconnectedReconnCB() def _reconnect_alarm(self): if not app.config.get_per('accounts', self.name, 'active'): # Account may have been disabled return if self.time_to_reconnect: if self.connected < 2: self.reconnect() else: self.time_to_reconnect = None def request_search_fields(self, jid): iq = nbxmpp.Iq(typ='get', to=jid, queryNS=nbxmpp.NS_SEARCH) self.connection.send(iq) def send_search_form(self, jid, form, is_form): iq = nbxmpp.Iq(typ='set', to=jid, queryNS=nbxmpp.NS_SEARCH) item = iq.setQuery() if is_form: item.addChild(node=form) else: for i in form.keys(): item.setTagData(i, form[i]) def _on_response(resp): app.nec.push_incoming_event(SearchResultReceivedEvent(None, conn=self, stanza=resp)) self.connection.SendAndCallForResponse(iq, _on_response) def load_roster_from_db(self): app.nec.push_incoming_event(RosterReceivedEvent(None, conn=self)) # END Connection gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/connection_handlers.py000066400000000000000000002634141326020644600276650ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/connection_handlers.py ## ## Copyright (C) 2006 Dimitur Kirov ## Junglecow J ## Copyright (C) 2006-2007 Tomasz Melcer ## Travis Shirk ## Nikos Kouremenos ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2007 Julien Pivotto ## Copyright (C) 2007-2008 Brendan Taylor ## Jean-Marie Traissard ## Stephan Erb ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import os import base64 import binascii import operator import hashlib from time import (altzone, daylight, gmtime, localtime, strftime, time as time_time, timezone, tzname) from gi.repository import GLib import nbxmpp from gajim.common import caps_cache as capscache from gajim.common.pep import LOCATION_DATA from gajim.common import helpers from gajim.common import app from gajim.common import dataforms from gajim.common import jingle_xtls from gajim.common.caps_cache import muc_caps_cache from gajim.common.commands import ConnectionCommands from gajim.common.pubsub import ConnectionPubSub from gajim.common.protocol.caps import ConnectionCaps from gajim.common.protocol.bytestream import ConnectionSocks5Bytestream from gajim.common.protocol.bytestream import ConnectionIBBytestream from gajim.common.message_archiving import ConnectionArchive313 from gajim.common.httpupload import ConnectionHTTPUpload from gajim.common.connection_handlers_events import * from gajim.common import ged from gajim.common import nec from gajim.common.nec import NetworkEvent from gajim.common.jingle import ConnectionJingle import logging log = logging.getLogger('gajim.c.connection_handlers') # kind of events we can wait for an answer AGENT_REMOVED = 'agent_removed' METACONTACTS_ARRIVED = 'metacontacts_arrived' ROSTER_ARRIVED = 'roster_arrived' DELIMITER_ARRIVED = 'delimiter_arrived' PRIVACY_ARRIVED = 'privacy_arrived' PEP_CONFIG = 'pep_config' class ConnectionDisco: """ Holds xmpppy handlers and public methods for discover services """ def discoverItems(self, jid, node=None, id_prefix=None): """ According to XEP-0030: jid is mandatory; name, node, action is optional. """ id_ = self._discover(nbxmpp.NS_DISCO_ITEMS, jid, node, id_prefix) self.disco_items_ids.append(id_) def discoverInfo(self, jid, node=None, id_prefix=None): """ According to XEP-0030: For identity: category, type is mandatory, name is optional. For feature: var is mandatory. """ id_ = self._discover(nbxmpp.NS_DISCO_INFO, jid, node, id_prefix) self.disco_info_ids.append(id_) def discoverMUC(self, jid, callback): if muc_caps_cache.is_cached(jid): callback() return disco_info = nbxmpp.Iq(typ='get', to=jid, queryNS=nbxmpp.NS_DISCO_INFO) self.connection.SendAndCallForResponse( disco_info, self.received_muc_info, {'callback': callback}) def received_muc_info(self, conn, stanza, callback): if nbxmpp.isResultNode(stanza): app.log('gajim.muc').info( 'Received MUC DiscoInfo for %s', stanza.getFrom()) muc_caps_cache.append(stanza) callback() else: error = stanza.getError() if error == 'item-not-found': # Groupchat does not exist callback() return app.nec.push_incoming_event( InformationEvent( None, dialog_name='unable-join-groupchat', args=error)) def request_register_agent_info(self, agent): if not self.connection or self.connected < 2: return None iq = nbxmpp.Iq('get', nbxmpp.NS_REGISTER, to=agent) id_ = self.connection.getAnID() iq.setID(id_) # Wait the answer during 30 secondes self.awaiting_timeouts[app.idlequeue.current_time() + 30] = (id_, _('Registration information for transport %s has not arrived in ' 'time') % agent) self.connection.SendAndCallForResponse(iq, self._ReceivedRegInfo, {'agent': agent}) def _agent_registered_cb(self, con, resp, agent): if resp.getType() == 'result': app.nec.push_incoming_event(InformationEvent( None, dialog_name='agent-register-success', args=agent)) self.request_subscription(agent, auto_auth=True) self.agent_registrations[agent]['roster_push'] = True if self.agent_registrations[agent]['sub_received']: p = nbxmpp.Presence(agent, 'subscribed') p = self.add_sha(p) self.connection.send(p) if resp.getType() == 'error': app.nec.push_incoming_event(InformationEvent( None, dialog_name='agent-register-error', kwargs={'agent': agent, 'error': resp.getError(), 'error_msg': resp.getErrorMsg()})) def register_agent(self, agent, info, is_form=False): if not self.connection or self.connected < 2: return if is_form: iq = nbxmpp.Iq('set', nbxmpp.NS_REGISTER, to=agent) query = iq.setQuery() info.setAttr('type', 'submit') query.addChild(node=info) self.connection.SendAndCallForResponse(iq, self._agent_registered_cb, {'agent': agent}) else: # fixed: blocking nbxmpp.features_nb.register(self.connection, agent, info, self._agent_registered_cb, {'agent': agent}) self.agent_registrations[agent] = {'roster_push': False, 'sub_received': False} def _discover(self, ns, jid, node=None, id_prefix=None): if not self.connection or self.connected < 2: return iq = nbxmpp.Iq(typ='get', to=jid, queryNS=ns) id_ = self.connection.getAnID() if id_prefix: id_ = id_prefix + id_ iq.setID(id_) if node: iq.setQuerynode(node) self.connection.send(iq) return id_ def _ReceivedRegInfo(self, con, resp, agent): nbxmpp.features_nb._ReceivedRegInfo(con, resp, agent) self._IqCB(con, resp) def _discoGetCB(self, con, iq_obj): """ Get disco info """ if not self.connection or self.connected < 2: return frm = helpers.get_full_jid_from_iq(iq_obj) to = iq_obj.getAttr('to') id_ = iq_obj.getAttr('id') iq = nbxmpp.Iq(to=frm, typ='result', queryNS=nbxmpp.NS_DISCO, frm=to) iq.setAttr('id', id_) query = iq.setTag('query') query.setAttr('node', 'http://gajim.org#' + app.version.split('-', 1)[ 0]) for f in (nbxmpp.NS_BYTESTREAM, nbxmpp.NS_SI, nbxmpp.NS_FILE, nbxmpp.NS_COMMANDS, nbxmpp.NS_JINGLE_FILE_TRANSFER_5, nbxmpp.NS_JINGLE_XTLS, nbxmpp.NS_PUBKEY_PUBKEY, nbxmpp.NS_PUBKEY_REVOKE, nbxmpp.NS_PUBKEY_ATTEST): feature = nbxmpp.Node('feature') feature.setAttr('var', f) query.addChild(node=feature) self.connection.send(iq) raise nbxmpp.NodeProcessed def _DiscoverItemsErrorCB(self, con, iq_obj): log.debug('DiscoverItemsErrorCB') app.nec.push_incoming_event(AgentItemsErrorReceivedEvent(None, conn=self, stanza=iq_obj)) def _DiscoverItemsCB(self, con, iq_obj): log.debug('DiscoverItemsCB') app.nec.push_incoming_event(AgentItemsReceivedEvent(None, conn=self, stanza=iq_obj)) def _DiscoverItemsGetCB(self, con, iq_obj): log.debug('DiscoverItemsGetCB') if not self.connection or self.connected < 2: return if self.commandItemsQuery(con, iq_obj): raise nbxmpp.NodeProcessed node = iq_obj.getTagAttr('query', 'node') if node is None: result = iq_obj.buildReply('result') self.connection.send(result) raise nbxmpp.NodeProcessed if node == nbxmpp.NS_COMMANDS: self.commandListQuery(con, iq_obj) raise nbxmpp.NodeProcessed def _DiscoverInfoGetCB(self, con, iq_obj): log.debug('DiscoverInfoGetCB') if not self.connection or self.connected < 2: return node = iq_obj.getQuerynode() if self.commandInfoQuery(con, iq_obj): raise nbxmpp.NodeProcessed id_ = iq_obj.getAttr('id') if id_[:6] == 'Gajim_': # We get this request from echo.server raise nbxmpp.NodeProcessed iq = iq_obj.buildReply('result') q = iq.setQuery() if node: q.setAttr('node', node) q.addChild('identity', attrs=app.gajim_identity) client_version = 'http://gajim.org#' + app.caps_hash[self.name] if node in (None, client_version): for f in app.gajim_common_features: q.addChild('feature', attrs={'var': f}) for f in app.gajim_optional_features[self.name]: q.addChild('feature', attrs={'var': f}) if q.getChildren(): self.connection.send(iq) raise nbxmpp.NodeProcessed def _DiscoverInfoErrorCB(self, con, iq_obj): log.debug('DiscoverInfoErrorCB') app.nec.push_incoming_event(AgentInfoErrorReceivedEvent(None, conn=self, stanza=iq_obj)) def _DiscoverInfoCB(self, con, iq_obj): log.debug('DiscoverInfoCB') if not self.connection or self.connected < 2: return app.nec.push_incoming_event(AgentInfoReceivedEvent(None, conn=self, stanza=iq_obj)) class ConnectionVcard: def __init__(self): self.own_vcard = None self.room_jids = [] self.avatar_presence_sent = False app.ged.register_event_handler('presence-received', ged.GUI2, self._vcard_presence_received) app.ged.register_event_handler('gc-presence-received', ged.GUI2, self._vcard_gc_presence_received) def _vcard_presence_received(self, obj): if obj.conn.name != self.name: return if obj.avatar_sha is None: # No Avatar is advertised return if self.get_own_jid().bareMatch(obj.jid): app.log('avatar').info('Update (vCard): %s %s', obj.jid, obj.avatar_sha) current_sha = app.config.get_per( 'accounts', self.name, 'avatar_sha') if obj.avatar_sha != current_sha: app.log('avatar').info( 'Request (vCard): %s', obj.jid) self.request_vcard(self._on_own_avatar_received) else: app.log('avatar').info( 'Avatar already known (vCard): %s %s', obj.jid, obj.avatar_sha) return if obj.avatar_sha == '': # Empty tag, means no avatar is advertised app.log('avatar').info( '%s has no avatar published (vCard)', obj.jid) # Remove avatar app.log('avatar').debug('Remove: %s', obj.jid) app.contacts.set_avatar(self.name, obj.jid, None) own_jid = self.get_own_jid().getStripped() app.logger.set_avatar_sha(own_jid, obj.jid, None) app.interface.update_avatar(self.name, obj.jid) else: app.log('avatar').info( 'Update (vCard): %s %s', obj.jid, obj.avatar_sha) current_sha = app.contacts.get_avatar_sha(self.name, obj.jid) if obj.avatar_sha != current_sha: app.log('avatar').info( 'Request (vCard): %s', obj.jid) self.request_vcard(self._on_avatar_received, obj.jid) else: app.log('avatar').info( 'Avatar already known (vCard): %s %s', obj.jid, obj.avatar_sha) def _vcard_gc_presence_received(self, obj): if obj.conn.name != self.name: return server = app.get_server_from_jid(obj.room_jid) if server.startswith('irc') or obj.avatar_sha is None: return if obj.show == 'offline': return gc_contact = app.contacts.get_gc_contact( self.name, obj.room_jid, obj.nick) if gc_contact is None: app.log('avatar').error('no gc contact found: %s', obj.nick) return if obj.avatar_sha == '': # Empty tag, means no avatar is advertised, remove avatar app.log('avatar').info( '%s has no avatar published (vCard)', obj.nick) app.log('avatar').debug('Remove: %s', obj.nick) gc_contact.avatar_sha = None app.interface.update_avatar(contact=gc_contact) else: app.log('avatar').info( 'Update (vCard): %s %s', obj.nick, obj.avatar_sha) path = os.path.join(app.AVATAR_PATH, obj.avatar_sha) if not os.path.isfile(path): app.log('avatar').info( 'Request (vCard): %s', obj.nick) obj.conn.request_vcard( self._on_avatar_received, obj.fjid, room=True) return if gc_contact.avatar_sha != obj.avatar_sha: app.log('avatar').info( '%s changed his Avatar (vCard): %s', obj.nick, obj.avatar_sha) gc_contact.avatar_sha = obj.avatar_sha app.interface.update_avatar(contact=gc_contact) else: app.log('avatar').info( 'Avatar already known (vCard): %s', obj.nick) def send_avatar_presence(self): show = helpers.get_xmpp_show(app.SHOW_LIST[self.connected]) p = nbxmpp.Presence(typ=None, priority=self.priority, show=show, status=self.status) p = self.add_sha(p) self.connection.send(p) app.interface.update_avatar(self.name, self.get_own_jid().getStripped()) def _node_to_dict(self, node): dict_ = {} for info in node.getChildren(): name = info.getName() if name in ('ADR', 'TEL', 'EMAIL'): # we can have several dict_.setdefault(name, []) entry = {} for c in info.getChildren(): entry[c.getName()] = c.getData() dict_[name].append(entry) elif info.getChildren() == []: dict_[name] = info.getData() else: dict_[name] = {} for c in info.getChildren(): dict_[name][c.getName()] = c.getData() return dict_ def request_vcard(self, callback, jid=None, room=False): """ Request the VCARD """ if not self.connection or self.connected < 2: return if room: room_jid = app.get_room_from_fjid(jid) if room_jid not in self.room_jids: self.room_jids.append(room_jid) iq = nbxmpp.Iq(typ='get') if jid: iq.setTo(jid) iq.setQuery('vCard').setNamespace(nbxmpp.NS_VCARD) self.connection.SendAndCallForResponse( iq, self._parse_vcard, {'callback': callback}) def send_vcard(self, vcard, sha): if not self.connection or self.connected < 2: return iq = nbxmpp.Iq(typ='set') iq2 = iq.setTag(nbxmpp.NS_VCARD + ' vCard') for i in vcard: if i == 'jid': continue if isinstance(vcard[i], dict): iq3 = iq2.addChild(i) for j in vcard[i]: iq3.addChild(j).setData(vcard[i][j]) elif isinstance(vcard[i], list): for j in vcard[i]: iq3 = iq2.addChild(i) for k in j: iq3.addChild(k).setData(j[k]) else: iq2.addChild(i).setData(vcard[i]) self.connection.SendAndCallForResponse( iq, self._avatar_publish_result, {'sha': sha}) def _avatar_publish_result(self, con, stanza, sha): if stanza.getType() == 'result': current_sha = app.config.get_per( 'accounts', self.name, 'avatar_sha') if (current_sha != sha and app.SHOW_LIST[self.connected] != 'invisible'): if not self.connection or self.connected < 2: return app.config.set_per( 'accounts', self.name, 'avatar_sha', sha or '') own_jid = self.get_own_jid().getStripped() app.contacts.set_avatar(self.name, own_jid, sha) self.send_avatar_presence() app.log('avatar').info('%s: Published: %s', self.name, sha) app.nec.push_incoming_event( VcardPublishedEvent(None, conn=self)) elif stanza.getType() == 'error': app.nec.push_incoming_event( VcardNotPublishedEvent(None, conn=self)) def _get_vcard_photo(self, vcard, jid): try: photo = vcard['PHOTO']['BINVAL'] except (KeyError, AttributeError, TypeError): avatar_sha = None photo_decoded = None else: if photo == '': avatar_sha = None photo_decoded = None else: try: photo_decoded = base64.b64decode(photo.encode('utf-8')) except binascii.Error as error: app.log('avatar').warning('Invalid avatar for %s: %s', jid, error) return None, None avatar_sha = hashlib.sha1(photo_decoded).hexdigest() return avatar_sha, photo_decoded def _parse_vcard(self, con, stanza, callback): frm_jid = stanza.getFrom() room = False if frm_jid is None: frm_jid = self.get_own_jid() elif frm_jid.getStripped() in self.room_jids: room = True resource = frm_jid.getResource() jid = frm_jid.getStripped() stanza_error = stanza.getError() if stanza_error in ('service-unavailable', 'item-not-found', 'not-allowed'): app.log('avatar').info('vCard not available: %s %s', frm_jid, stanza_error) callback(jid, resource, room, {}) return vcard_node = stanza.getTag('vCard', namespace=nbxmpp.NS_VCARD) if vcard_node is None: app.log('avatar').info('vCard not available: %s', frm_jid) app.log('avatar').debug(stanza) return vcard = self._node_to_dict(vcard_node) if self.get_own_jid().bareMatch(jid): if 'NICKNAME' in vcard: app.nicks[self.name] = vcard['NICKNAME'] elif 'FN' in vcard: app.nicks[self.name] = vcard['FN'] app.nec.push_incoming_event( VcardReceivedEvent(None, conn=self, vcard_dict=vcard)) callback(jid, resource, room, vcard) def _on_own_avatar_received(self, jid, resource, room, vcard): avatar_sha, photo_decoded = self._get_vcard_photo(vcard, jid) app.log('avatar').info( 'Received own (vCard): %s', avatar_sha) self.own_vcard = vcard if avatar_sha is None: app.log('avatar').info('No avatar found (vCard)') app.config.set_per('accounts', self.name, 'avatar_sha', '') self.send_avatar_presence() return current_sha = app.config.get_per('accounts', self.name, 'avatar_sha') if current_sha == avatar_sha: path = os.path.join(app.AVATAR_PATH, current_sha) if not os.path.isfile(path): app.log('avatar').info( 'Caching (vCard): %s', current_sha) app.interface.save_avatar(photo_decoded) if self.avatar_presence_sent: app.log('avatar').debug('Avatar already advertised') return else: app.interface.save_avatar(photo_decoded) app.config.set_per('accounts', self.name, 'avatar_sha', avatar_sha) if app.SHOW_LIST[self.connected] == 'invisible': app.log('avatar').info( 'We are invisible, not publishing avatar') return self.send_avatar_presence() self.avatar_presence_sent = True def _on_avatar_received(self, jid, resource, room, vcard): """ Called when we receive a vCard Parse the vCard and trigger Events """ avatar_sha, photo_decoded = self._get_vcard_photo(vcard, jid) app.interface.save_avatar(photo_decoded) # Received vCard from a contact if room: app.log('avatar').info( 'Received (vCard): %s %s', resource, avatar_sha) contact = app.contacts.get_gc_contact(self.name, jid, resource) if contact is not None: contact.avatar_sha = avatar_sha app.interface.update_avatar(contact=contact) else: app.log('avatar').info('Received (vCard): %s %s', jid, avatar_sha) own_jid = self.get_own_jid().getStripped() app.logger.set_avatar_sha(own_jid, jid, avatar_sha) app.contacts.set_avatar(self.name, jid, avatar_sha) app.interface.update_avatar(self.name, jid) class ConnectionPEP(object): def __init__(self, account, dispatcher, pubsub_connection): self._account = account self._dispatcher = dispatcher self._pubsub_connection = pubsub_connection self.reset_awaiting_pep() def pep_change_account_name(self, new_name): self._account = new_name def reset_awaiting_pep(self): self.to_be_sent_activity = None self.to_be_sent_mood = None self.to_be_sent_tune = None self.to_be_sent_nick = None self.to_be_sent_location = None def send_awaiting_pep(self): """ Send pep info that were waiting for connection """ if self.to_be_sent_activity: self.send_activity(*self.to_be_sent_activity) if self.to_be_sent_mood: self.send_mood(*self.to_be_sent_mood) if self.to_be_sent_tune: self.send_tune(*self.to_be_sent_tune) if self.to_be_sent_nick: self.send_nick(self.to_be_sent_nick) if self.to_be_sent_location: self.send_location(self.to_be_sent_location) self.reset_awaiting_pep() def _pubsubEventCB(self, xmpp_dispatcher, msg): ''' Called when we receive with pubsub event. ''' app.nec.push_incoming_event(PEPReceivedEvent(None, conn=self, stanza=msg)) def send_activity(self, activity, subactivity=None, message=None): if self.connected == 1: # We are connecting, keep activity in mem and send it when we'll be # connected self.to_be_sent_activity = (activity, subactivity, message) return if not self.pep_supported: return item = nbxmpp.Node('activity', {'xmlns': nbxmpp.NS_ACTIVITY}) if activity: i = item.addChild(activity) if subactivity: i.addChild(subactivity) if message: i = item.addChild('text') i.addData(message) self._pubsub_connection.send_pb_publish('', nbxmpp.NS_ACTIVITY, item, '0') def retract_activity(self): if not self.pep_supported: return self.send_activity(None) # not all client support new XEP, so we still retract self._pubsub_connection.send_pb_retract('', nbxmpp.NS_ACTIVITY, '0') def send_mood(self, mood, message=None): if self.connected == 1: # We are connecting, keep mood in mem and send it when we'll be # connected self.to_be_sent_mood = (mood, message) return if not self.pep_supported: return item = nbxmpp.Node('mood', {'xmlns': nbxmpp.NS_MOOD}) if mood: item.addChild(mood) if message: i = item.addChild('text') i.addData(message) self._pubsub_connection.send_pb_publish('', nbxmpp.NS_MOOD, item, '0') def retract_mood(self): if not self.pep_supported: return self.send_mood(None) # not all client support new XEP, so we still retract self._pubsub_connection.send_pb_retract('', nbxmpp.NS_MOOD, '0') def send_tune(self, artist='', title='', source='', track=0, length=0, items=None): if self.connected == 1: # We are connecting, keep tune in mem and send it when we'll be # connected self.to_be_sent_tune = (artist, title, source, track, length, items) return if not self.pep_supported: return item = nbxmpp.Node('tune', {'xmlns': nbxmpp.NS_TUNE}) if artist: i = item.addChild('artist') i.addData(artist) if title: i = item.addChild('title') i.addData(title) if source: i = item.addChild('source') i.addData(source) if track: i = item.addChild('track') i.addData(track) if length: i = item.addChild('length') i.addData(length) if items: item.addChild(payload=items) self._pubsub_connection.send_pb_publish('', nbxmpp.NS_TUNE, item, '0') def retract_tune(self): if not self.pep_supported: return self.send_tune(None) # not all client support new XEP, so we still retract self._pubsub_connection.send_pb_retract('', nbxmpp.NS_TUNE, '0') def send_nickname(self, nick): if self.connected == 1: # We are connecting, keep nick in mem and send it when we'll be # connected self.to_be_sent_nick = nick return if not self.pep_supported: return item = nbxmpp.Node('nick', {'xmlns': nbxmpp.NS_NICK}) item.addData(nick) self._pubsub_connection.send_pb_publish('', nbxmpp.NS_NICK, item, '0') def retract_nickname(self): if not self.pep_supported: return self._pubsub_connection.send_pb_retract('', nbxmpp.NS_NICK, '0') def send_location(self, info): if self.connected == 1: # We are connecting, keep location in mem and send it when we'll be # connected self.to_be_sent_location = info return if not self.pep_supported: return item = nbxmpp.Node('geoloc', {'xmlns': nbxmpp.NS_LOCATION}) for field in LOCATION_DATA: if info.get(field, None): i = item.addChild(field) i.addData(info[field]) self._pubsub_connection.send_pb_publish('', nbxmpp.NS_LOCATION, item, '0') def retract_location(self): if not self.pep_supported: return self.send_location({}) # not all client support new XEP, so we still retract self._pubsub_connection.send_pb_retract('', nbxmpp.NS_LOCATION, '0') # basic connection handlers used here and in zeroconf class ConnectionHandlersBase: def __init__(self): # List of IDs we are waiting answers for {id: (type_of_request, data), } self.awaiting_answers = {} # List of IDs that will produce a timeout is answer doesn't arrive # {time_of_the_timeout: (id, message to send to gui), } self.awaiting_timeouts = {} # keep the jids we auto added (transports contacts) to not send the # SUBSCRIBED event to gui self.automatically_added = [] # keep track of sessions this connection has with other JIDs self.sessions = {} # IDs of sent messages (https://trac.gajim.org/ticket/8222) self.sent_message_ids = [] # We decrypt GPG messages one after the other. Keep queue in mem self.gpg_messages_to_decrypt = [] app.ged.register_event_handler('iq-error-received', ged.CORE, self._nec_iq_error_received) app.ged.register_event_handler('presence-received', ged.CORE, self._nec_presence_received) app.ged.register_event_handler('gc-presence-received', ged.CORE, self._nec_gc_presence_received) app.ged.register_event_handler('message-received', ged.CORE, self._nec_message_received) app.ged.register_event_handler('mam-message-received', ged.CORE, self._nec_message_received) app.ged.register_event_handler('mam-gc-message-received', ged.CORE, self._nec_message_received) app.ged.register_event_handler('decrypted-message-received', ged.CORE, self._nec_decrypted_message_received) app.ged.register_event_handler('gc-message-received', ged.CORE, self._nec_gc_message_received) def cleanup(self): app.ged.remove_event_handler('iq-error-received', ged.CORE, self._nec_iq_error_received) app.ged.remove_event_handler('presence-received', ged.CORE, self._nec_presence_received) app.ged.remove_event_handler('gc-presence-received', ged.CORE, self._nec_gc_presence_received) app.ged.remove_event_handler('message-received', ged.CORE, self._nec_message_received) app.ged.remove_event_handler('mam-message-received', ged.CORE, self._nec_message_received) app.ged.remove_event_handler('mam-gc-message-received', ged.CORE, self._nec_message_received) app.ged.remove_event_handler('decrypted-message-received', ged.CORE, self._nec_decrypted_message_received) app.ged.remove_event_handler('gc-message-received', ged.CORE, self._nec_gc_message_received) def _nec_iq_error_received(self, obj): if obj.conn.name != self.name: return def _nec_presence_received(self, obj): account = obj.conn.name if account != self.name: return jid = obj.jid resource = obj.resource or '' statuss = ['offline', 'error', 'online', 'chat', 'away', 'xa', 'dnd', 'invisible'] obj.old_show = 0 obj.new_show = statuss.index(obj.show) obj.contact_list = [] highest = app.contacts.get_contact_with_highest_priority(account, jid) obj.was_highest = (highest and highest.resource == resource) # Update contact obj.contact_list = app.contacts.get_contacts(account, jid) obj.contact = None resources = [] for c in obj.contact_list: resources.append(c.resource) if c.resource == resource: obj.contact = c break if obj.contact: if obj.contact.show in statuss: obj.old_show = statuss.index(obj.contact.show) # nick changed if obj.contact_nickname is not None and \ obj.contact.contact_name != obj.contact_nickname: obj.contact.contact_name = obj.contact_nickname obj.need_redraw = True elif obj.old_show != obj.new_show or obj.contact.status != \ obj.status: obj.need_redraw = True else: obj.contact = app.contacts.get_first_contact_from_jid(account, jid) if not obj.contact: # Presence of another resource of our jid # Create self contact and add to roster if resource == obj.conn.server_resource: return # Ignore offline presence of unknown self resource if obj.new_show < 2: return obj.contact = app.contacts.create_self_contact(jid=jid, account=account, show=obj.show, status=obj.status, priority=obj.prio, keyID=obj.keyID, resource=obj.resource) app.contacts.add_contact(account, obj.contact) obj.contact_list.append(obj.contact) elif obj.contact.show in statuss: obj.old_show = statuss.index(obj.contact.show) if (resources != [''] and (len(obj.contact_list) != 1 or \ obj.contact_list[0].show not in ('not in roster', 'offline'))) and \ not app.jid_is_transport(jid): # Another resource of an existing contact connected obj.old_show = 0 obj.contact = app.contacts.copy_contact(obj.contact) obj.contact_list.append(obj.contact) obj.contact.resource = resource obj.need_add_in_roster = True if not app.jid_is_transport(jid) and len(obj.contact_list) == 1: # It's not an agent if obj.old_show == 0 and obj.new_show > 1: if not jid in app.newly_added[account]: app.newly_added[account].append(jid) if jid in app.to_be_removed[account]: app.to_be_removed[account].remove(jid) elif obj.old_show > 1 and obj.new_show == 0 and \ obj.conn.connected > 1: if not jid in app.to_be_removed[account]: app.to_be_removed[account].append(jid) if jid in app.newly_added[account]: app.newly_added[account].remove(jid) obj.need_redraw = True obj.contact.show = obj.show obj.contact.status = obj.status obj.contact.priority = obj.prio attached_keys = app.config.get_per('accounts', account, 'attached_gpg_keys').split() if jid in attached_keys: obj.contact.keyID = attached_keys[attached_keys.index(jid) + 1] else: # Do not override assigned key obj.contact.keyID = obj.keyID obj.contact.contact_nickname = obj.contact_nickname obj.contact.idle_time = obj.idle_time if app.jid_is_transport(jid): return # It isn't an agent # reset chatstate if needed: # (when contact signs out or has errors) if obj.show in ('offline', 'error'): obj.contact.our_chatstate = obj.contact.chatstate = None # TODO: This causes problems when another # resource signs off! self.stop_all_active_file_transfers(obj.contact) # disable encryption, since if any messages are # lost they'll be not decryptable (note that # this contradicts XEP-0201 - trying to get that # in the XEP, though) # there won't be any sessions here if the contact terminated # their sessions before going offline (which we do) for sess in self.get_sessions(jid): sess_fjid = sess.jid.getStripped() if sess.resource: sess_fjid += '/' + sess.resource if obj.fjid != sess_fjid: continue if sess.control: sess.control.no_autonegotiation = False if sess.enable_encryption: sess.terminate_e2e() if app.config.get('log_contact_status_changes') and \ app.config.should_log(self.name, obj.jid): show = app.logger.convert_show_values_to_db_api_values(obj.show) if show is not None: app.logger.insert_into_logs(self.name, nbxmpp.JID(obj.jid).getStripped(), time_time(), KindConstant.STATUS, message=obj.status, show=show) def _nec_gc_presence_received(self, obj): if obj.conn.name != self.name: return for sess in self.get_sessions(obj.fjid): if obj.fjid != sess.jid: continue if sess.enable_encryption: sess.terminate_e2e() def _nec_message_received(self, obj): if obj.conn.name != self.name: return app.plugin_manager.extension_point( 'decrypt', self, obj, self._on_message_received) if not obj.encrypted: # XEP-0380 enc_tag = obj.stanza.getTag('encryption', namespace=nbxmpp.NS_EME) if enc_tag: ns = enc_tag.getAttr('namespace') if ns: if ns == 'urn:xmpp:otr:0': obj.msgtxt = _('This message was encrypted with OTR ' 'and could not be decrypted.') elif ns == 'jabber:x:encrypted': obj.msgtxt = _('This message was encrypted with Legacy ' 'OpenPGP and could not be decrypted. You can install ' 'the PGP plugin to handle those messages.') elif ns == 'urn:xmpp:openpgp:0': obj.msgtxt = _('This message was encrypted with ' 'OpenPGP for XMPP and could not be decrypted.') else: enc_name = enc_tag.getAttr('name') if not enc_name: enc_name = ns obj.msgtxt = _('This message was encrypted with %s ' 'and could not be decrypted.') % enc_name self._on_message_received(obj) def _on_message_received(self, obj): if isinstance(obj, MessageReceivedEvent): app.nec.push_incoming_event( DecryptedMessageReceivedEvent( None, conn=self, msg_obj=obj, stanza_id=obj.unique_id)) else: app.nec.push_incoming_event( MamDecryptedMessageReceivedEvent(None, **vars(obj))) def _nec_decrypted_message_received(self, obj): if obj.conn.name != self.name: return # Receipt requested # TODO: We shouldn't answer if we're invisible! contact = app.contacts.get_contact(self.name, obj.jid) nick = obj.resource gc_contact = app.contacts.get_gc_contact(self.name, obj.jid, nick) if obj.sent: jid_to = obj.stanza.getFrom() else: jid_to = obj.stanza.getTo() reply = False if not jid_to: reply = True else: fjid_to = helpers.parse_jid(str(jid_to)) jid_to = app.get_jid_without_resource(fjid_to) if jid_to == app.get_jid_from_account(self.name): reply = True if obj.jid != app.get_jid_from_account(self.name): if obj.receipt_request_tag and app.config.get_per('accounts', self.name, 'answer_receipts') and ((contact and contact.sub \ not in ('to', 'none')) or gc_contact) and obj.mtype != 'error' and \ reply: receipt = nbxmpp.Message(to=obj.fjid, typ='chat') receipt.setTag('received', namespace='urn:xmpp:receipts', attrs={'id': obj.id_}) if obj.thread_id: receipt.setThread(obj.thread_id) self.connection.send(receipt) # We got our message's receipt if obj.receipt_received_tag and app.config.get_per('accounts', self.name, 'request_receipt'): ctrl = obj.session.control if not ctrl: # Received doesn't have the element # or control is not bound to session? # --> search for it ctrl = app.interface.msg_win_mgr.search_control(obj.jid, obj.conn.name, obj.resource) if ctrl: id_ = obj.receipt_received_tag.getAttr('id') if not id_: # old XEP implementation id_ = obj.id_ ctrl.conv_textview.show_xep0184_ack(id_) if obj.mtype == 'error': if not obj.msgtxt: obj.msgtxt = _('message') self.dispatch_error_message(obj.stanza, obj.msgtxt, obj.session, obj.fjid, obj.timestamp) return True elif obj.mtype == 'groupchat': app.nec.push_incoming_event(GcMessageReceivedEvent(None, conn=self, msg_obj=obj, stanza_id=obj.unique_id)) return True def _check_for_mam_compliance(self, room_jid, stanza_id): namespace = muc_caps_cache.get_mam_namespace(room_jid) if stanza_id is None and namespace == nbxmpp.NS_MAM_2: helpers.add_to_mam_blacklist(room_jid) def _nec_gc_message_received(self, obj): if obj.conn.name != self.name: return self._check_for_mam_compliance(obj.jid, obj.unique_id) if (app.config.should_log(obj.conn.name, obj.jid) and obj.msgtxt and obj.nick): # if not obj.nick, it means message comes from room itself # usually it hold description and can be send at each connection # so don't store it in logs app.logger.insert_into_logs(self.name, obj.jid, obj.timestamp, KindConstant.GC_MSG, message=obj.msgtxt, contact_name=obj.nick, additional_data=obj.additional_data, stanza_id=obj.unique_id) app.logger.set_room_last_message_time(obj.room_jid, obj.timestamp) # process and dispatch an error message def dispatch_error_message(self, msg, msgtxt, session, frm, tim): error_msg = msg.getErrorMsg() if not error_msg: error_msg = msgtxt msgtxt = None subject = msg.getSubject() if session.is_loggable(): app.logger.insert_into_logs(self.name, nbxmpp.JID(frm).getStripped(), tim, KindConstant.ERROR, message=error_msg, subject=subject) app.nec.push_incoming_event(MessageErrorEvent(None, conn=self, fjid=frm, error_code=msg.getErrorCode(), error_msg=error_msg, msg=msgtxt, time_=tim, session=session, stanza=msg)) def get_sessions(self, jid): """ Get all sessions for the given full jid """ if not app.interface.is_pm_contact(jid, self.name): jid = app.get_jid_without_resource(jid) try: return list(self.sessions[jid].values()) except KeyError: return [] def get_or_create_session(self, fjid, thread_id): """ Return an existing session between this connection and 'jid', returns a new one if none exist """ pm = True jid = fjid if not app.interface.is_pm_contact(fjid, self.name): pm = False jid = app.get_jid_without_resource(fjid) session = self.find_session(jid, thread_id) if session: return session if pm: return self.make_new_session(fjid, thread_id, type_='pm') else: return self.make_new_session(fjid, thread_id) def find_session(self, jid, thread_id): try: if not thread_id: return self.find_null_session(jid) else: return self.sessions[jid][thread_id] except KeyError: return None def terminate_sessions(self, send_termination=False): """ Send termination messages and delete all active sessions """ for jid in self.sessions: for thread_id in self.sessions[jid]: self.sessions[jid][thread_id].terminate(send_termination) self.sessions = {} def delete_session(self, jid, thread_id): if not jid in self.sessions: jid = app.get_jid_without_resource(jid) if not jid in self.sessions: return del self.sessions[jid][thread_id] if not self.sessions[jid]: del self.sessions[jid] def find_null_session(self, jid): """ Find all of the sessions between us and a remote jid in which we haven't received a thread_id yet and returns the session that we last sent a message to """ sessions = list(self.sessions[jid].values()) # sessions that we haven't received a thread ID in idless = [s for s in sessions if not s.received_thread_id] # filter out everything except the default session type chat_sessions = [s for s in idless if isinstance(s, app.default_session_type)] if chat_sessions: # return the session that we last sent a message in return sorted(chat_sessions, key=operator.attrgetter('last_send'))[ -1] else: return None def get_latest_session(self, jid): """ Get the session that we last sent a message to """ if jid not in self.sessions: return None sessions = self.sessions[jid].values() if not sessions: return None return sorted(sessions, key=operator.attrgetter('last_send'))[-1] def find_controlless_session(self, jid, resource=None): """ Find an active session that doesn't have a control attached """ try: sessions = list(self.sessions[jid].values()) # filter out everything except the default session type chat_sessions = [s for s in sessions if isinstance(s, app.default_session_type)] orphaned = [s for s in chat_sessions if not s.control] if resource: orphaned = [s for s in orphaned if s.resource == resource] return orphaned[0] except (KeyError, IndexError): return None def make_new_session(self, jid, thread_id=None, type_='chat', cls=None): """ Create and register a new session thread_id=None to generate one. type_ should be 'chat' or 'pm'. """ if not cls: cls = app.default_session_type sess = cls(self, nbxmpp.JID(jid), thread_id, type_) # determine if this session is a pm session # if not, discard the resource so that all sessions are stored bare if not type_ == 'pm': jid = app.get_jid_without_resource(jid) if not jid in self.sessions: self.sessions[jid] = {} self.sessions[jid][sess.thread_id] = sess return sess class ConnectionHandlers(ConnectionArchive313, ConnectionVcard, ConnectionSocks5Bytestream, ConnectionDisco, ConnectionCommands, ConnectionPubSub, ConnectionPEP, ConnectionCaps, ConnectionHandlersBase, ConnectionJingle, ConnectionIBBytestream, ConnectionHTTPUpload): def __init__(self): ConnectionArchive313.__init__(self) ConnectionVcard.__init__(self) ConnectionSocks5Bytestream.__init__(self) ConnectionIBBytestream.__init__(self) ConnectionCommands.__init__(self) ConnectionPubSub.__init__(self) ConnectionPEP.__init__(self, account=self.name, dispatcher=self, pubsub_connection=self) ConnectionHTTPUpload.__init__(self) # Handle presences BEFORE caps app.nec.register_incoming_event(PresenceReceivedEvent) ConnectionCaps.__init__(self, account=self.name, capscache=capscache.capscache, client_caps_factory=capscache.create_suitable_client_caps) ConnectionJingle.__init__(self) ConnectionHandlersBase.__init__(self) # keep the latest subscribed event for each jid to prevent loop when we # acknowledge presences self.subscribed_events = {} # IDs of jabber:iq:version requests self.version_ids = [] # IDs of urn:xmpp:time requests self.entity_time_ids = [] # IDs of disco#items requests self.disco_items_ids = [] # IDs of disco#info requests self.disco_info_ids = [] # ID of urn:xmpp:ping requests self.awaiting_xmpp_ping_id = None self.continue_connect_info = None self.privacy_default_list = None app.nec.register_incoming_event(PrivateStorageBookmarksReceivedEvent) app.nec.register_incoming_event(BookmarksReceivedEvent) app.nec.register_incoming_event( PrivateStorageRosternotesReceivedEvent) app.nec.register_incoming_event(RosternotesReceivedEvent) app.nec.register_incoming_event(StreamConflictReceivedEvent) app.nec.register_incoming_event(StreamOtherHostReceivedEvent) app.nec.register_incoming_event(MessageReceivedEvent) app.nec.register_incoming_event(ArchivingErrorReceivedEvent) app.nec.register_incoming_event( Archiving313PreferencesChangedReceivedEvent) app.nec.register_incoming_event(NotificationEvent) app.ged.register_event_handler('http-auth-received', ged.CORE, self._nec_http_auth_received) app.ged.register_event_handler('version-request-received', ged.CORE, self._nec_version_request_received) app.ged.register_event_handler('last-request-received', ged.CORE, self._nec_last_request_received) app.ged.register_event_handler('time-request-received', ged.CORE, self._nec_time_request_received) app.ged.register_event_handler('time-revised-request-received', ged.CORE, self._nec_time_revised_request_received) app.ged.register_event_handler('roster-set-received', ged.CORE, self._nec_roster_set_received) app.ged.register_event_handler('private-storage-bookmarks-received', ged.CORE, self._nec_private_storate_bookmarks_received) app.ged.register_event_handler('private-storage-rosternotes-received', ged.CORE, self._nec_private_storate_rosternotes_received) app.ged.register_event_handler('roster-received', ged.CORE, self._nec_roster_received) app.ged.register_event_handler('iq-error-received', ged.CORE, self._nec_iq_error_received) app.ged.register_event_handler('ping-received', ged.CORE, self._nec_ping_received) app.ged.register_event_handler('subscribe-presence-received', ged.CORE, self._nec_subscribe_presence_received) app.ged.register_event_handler('subscribed-presence-received', ged.CORE, self._nec_subscribed_presence_received) app.ged.register_event_handler('subscribed-presence-received', ged.POSTGUI, self._nec_subscribed_presence_received_end) app.ged.register_event_handler('unsubscribed-presence-received', ged.CORE, self._nec_unsubscribed_presence_received) app.ged.register_event_handler('unsubscribed-presence-received', ged.POSTGUI, self._nec_unsubscribed_presence_received_end) app.ged.register_event_handler('agent-removed', ged.CORE, self._nec_agent_removed) app.ged.register_event_handler('stream-other-host-received', ged.CORE, self._nec_stream_other_host_received) app.ged.register_event_handler('blocking', ged.CORE, self._nec_blocking) def cleanup(self): ConnectionHandlersBase.cleanup(self) ConnectionCaps.cleanup(self) ConnectionArchive313.cleanup(self) ConnectionPubSub.cleanup(self) ConnectionHTTPUpload.cleanup(self) app.ged.remove_event_handler('http-auth-received', ged.CORE, self._nec_http_auth_received) app.ged.remove_event_handler('version-request-received', ged.CORE, self._nec_version_request_received) app.ged.remove_event_handler('last-request-received', ged.CORE, self._nec_last_request_received) app.ged.remove_event_handler('time-request-received', ged.CORE, self._nec_time_request_received) app.ged.remove_event_handler('time-revised-request-received', ged.CORE, self._nec_time_revised_request_received) app.ged.remove_event_handler('roster-set-received', ged.CORE, self._nec_roster_set_received) app.ged.remove_event_handler('private-storage-bookmarks-received', ged.CORE, self._nec_private_storate_bookmarks_received) app.ged.remove_event_handler('private-storage-rosternotes-received', ged.CORE, self._nec_private_storate_rosternotes_received) app.ged.remove_event_handler('roster-received', ged.CORE, self._nec_roster_received) app.ged.remove_event_handler('iq-error-received', ged.CORE, self._nec_iq_error_received) app.ged.remove_event_handler('ping-received', ged.CORE, self._nec_ping_received) app.ged.remove_event_handler('subscribe-presence-received', ged.CORE, self._nec_subscribe_presence_received) app.ged.remove_event_handler('subscribed-presence-received', ged.CORE, self._nec_subscribed_presence_received) app.ged.remove_event_handler('subscribed-presence-received', ged.POSTGUI, self._nec_subscribed_presence_received_end) app.ged.remove_event_handler('unsubscribed-presence-received', ged.CORE, self._nec_unsubscribed_presence_received) app.ged.remove_event_handler('unsubscribed-presence-received', ged.POSTGUI, self._nec_unsubscribed_presence_received_end) app.ged.remove_event_handler('agent-removed', ged.CORE, self._nec_agent_removed) app.ged.remove_event_handler('stream-other-host-received', ged.CORE, self._nec_stream_other_host_received) app.ged.remove_event_handler('blocking', ged.CORE, self._nec_blocking) def add_sha(self, p, send_caps=True): c = p.setTag('x', namespace=nbxmpp.NS_VCARD_UPDATE) sha = app.config.get_per('accounts', self.name, 'avatar_sha') app.log('avatar').info( '%s: Send avatar presence: %s', self.name, sha or 'empty') c.setTagData('photo', sha) if send_caps: return self._add_caps(p) return p def _add_caps(self, p): ''' advertise our capabilities in presence stanza (xep-0115)''' c = p.setTag('c', namespace=nbxmpp.NS_CAPS) c.setAttr('hash', 'sha-1') c.setAttr('node', 'http://gajim.org') c.setAttr('ver', app.caps_hash[self.name]) return p def build_http_auth_answer(self, iq_obj, answer): if not self.connection or self.connected < 2: return if answer == 'yes': confirm = iq_obj.getTag('confirm') reply = iq_obj.buildReply('result') if iq_obj.getName() == 'message': reply.addChild(node=confirm) self.connection.send(reply) elif answer == 'no': err = nbxmpp.Error(iq_obj, nbxmpp.protocol.ERR_NOT_AUTHORIZED) self.connection.send(err) def _nec_http_auth_received(self, obj): if obj.conn.name != self.name: return if obj.opt in ('yes', 'no'): obj.conn.build_http_auth_answer(obj.stanza, obj.opt) return True def _HttpAuthCB(self, con, iq_obj): log.debug('HttpAuthCB') app.nec.push_incoming_event(HttpAuthReceivedEvent(None, conn=self, stanza=iq_obj)) raise nbxmpp.NodeProcessed def _ErrorCB(self, con, iq_obj): log.debug('ErrorCB') app.nec.push_incoming_event(IqErrorReceivedEvent(None, conn=self, stanza=iq_obj)) def _IqCB(self, con, iq_obj): id_ = iq_obj.getID() app.nec.push_incoming_event(NetworkEvent('raw-iq-received', conn=self, stanza=iq_obj)) # Check if we were waiting a timeout for this id found_tim = None for tim in self.awaiting_timeouts: if id_ == self.awaiting_timeouts[tim][0]: found_tim = tim break if found_tim: del self.awaiting_timeouts[found_tim] if id_ not in self.awaiting_answers: return if self.awaiting_answers[id_][0] == AGENT_REMOVED: jid = self.awaiting_answers[id_][1] app.nec.push_incoming_event(AgentRemovedEvent(None, conn=self, agent=jid)) del self.awaiting_answers[id_] elif self.awaiting_answers[id_][0] == METACONTACTS_ARRIVED: if not self.connection: return if iq_obj.getType() == 'result': app.nec.push_incoming_event(MetacontactsReceivedEvent(None, conn=self, stanza=iq_obj)) else: if iq_obj.getErrorCode() not in ('403', '406', '404'): self.private_storage_supported = False self.get_roster_delimiter() del self.awaiting_answers[id_] elif self.awaiting_answers[id_][0] == DELIMITER_ARRIVED: del self.awaiting_answers[id_] if not self.connection: return if iq_obj.getType() == 'result': query = iq_obj.getTag('query') if not query: return delimiter = query.getTagData('roster') if delimiter: self.nested_group_delimiter = delimiter else: self.set_roster_delimiter('::') else: self.private_storage_supported = False # We can now continue connection by requesting the roster self.request_roster() elif self.awaiting_answers[id_][0] == ROSTER_ARRIVED: if iq_obj.getType() == 'result': if not iq_obj.getTag('query'): account_jid = app.get_jid_from_account(self.name) roster_data = app.logger.get_roster(account_jid) roster = self.connection.getRoster(force=True) roster.setRaw(roster_data) self._getRoster() elif iq_obj.getType() == 'error': self.roster_supported = False self.discoverItems(app.config.get_per('accounts', self.name, 'hostname'), id_prefix='Gajim_') if app.config.get_per('accounts', self.name, 'use_ft_proxies'): self.discover_ft_proxies() app.nec.push_incoming_event(RosterReceivedEvent(None, conn=self)) GLib.timeout_add_seconds(10, self.discover_servers) del self.awaiting_answers[id_] elif self.awaiting_answers[id_][0] == PRIVACY_ARRIVED: del self.awaiting_answers[id_] if iq_obj.getType() != 'error': for list_ in iq_obj.getQueryPayload(): if list_.getName() == 'default': self.privacy_default_list = list_.getAttr('name') self.get_privacy_list(self.privacy_default_list) break # Ask metacontacts before roster self.get_metacontacts() else: # That should never happen, but as it's blocking in the # connection process, we don't take the risk self.privacy_rules_supported = False self._continue_connection_request_privacy() elif self.awaiting_answers[id_][0] == PEP_CONFIG: del self.awaiting_answers[id_] if iq_obj.getType() == 'error': return if not iq_obj.getTag('pubsub'): return conf = iq_obj.getTag('pubsub').getTag('configure') if not conf: return node = conf.getAttr('node') form_tag = conf.getTag('x', namespace=nbxmpp.NS_DATA) if form_tag: form = dataforms.ExtendForm(node=form_tag) app.nec.push_incoming_event(PEPConfigReceivedEvent(None, conn=self, node=node, form=form)) def _nec_iq_error_received(self, obj): if obj.conn.name != self.name: return if obj.id_ in self.version_ids: app.nec.push_incoming_event(VersionResultReceivedEvent(None, conn=self, stanza=obj.stanza)) return True if obj.id_ in self.entity_time_ids: app.nec.push_incoming_event(TimeResultReceivedEvent(None, conn=self, stanza=obj.stanza)) return True if obj.id_ in self.disco_items_ids: app.nec.push_incoming_event(AgentItemsErrorReceivedEvent(None, conn=self, stanza=obj.stanza)) return True if obj.id_ in self.disco_info_ids: app.nec.push_incoming_event(AgentInfoErrorReceivedEvent(None, conn=self, stanza=obj.stanza)) return True def _nec_private_storate_bookmarks_received(self, obj): if obj.conn.name != self.name: return app.log('bookmarks').info('Received Bookmarks (PrivateStorage)') resend_to_pubsub = False bm_jids = [b['jid'] for b in self.bookmarks] for bm in obj.bookmarks: if bm['jid'] not in bm_jids: self.bookmarks.append(bm) # We got a bookmark that was not in pubsub resend_to_pubsub = True if resend_to_pubsub: self.store_bookmarks('pubsub') def _nec_private_storate_rosternotes_received(self, obj): if obj.conn.name != self.name: return for jid in obj.annotations: self.annotations[jid] = obj.annotations[jid] def _PrivateCB(self, con, iq_obj): """ Private Data (XEP 048 and 049) """ log.debug('PrivateCB') app.nec.push_incoming_event(PrivateStorageReceivedEvent(None, conn=self, stanza=iq_obj)) def _SecLabelCB(self, con, iq_obj): """ Security Label callback, used for catalogues. """ log.debug('SecLabelCB') query = iq_obj.getTag('catalog') to = query.getAttr('to') items = query.getTags('item') labels = {} ll = [] default = None for item in items: label = item.getAttr('selector') labels[label] = item.getTag('securitylabel') ll.append(label) if item.getAttr('default') == 'true': default = label if to not in self.seclabel_catalogues: self.seclabel_catalogues[to] = [[], None, None, None] self.seclabel_catalogues[to][1] = labels self.seclabel_catalogues[to][2] = ll self.seclabel_catalogues[to][3] = default for callback in self.seclabel_catalogues[to][0]: callback() self.seclabel_catalogues[to][0] = [] def seclabel_catalogue_request(self, to, callback): if to not in self.seclabel_catalogues: self.seclabel_catalogues[to] = [[], None, None, None] self.seclabel_catalogues[to][0].append(callback) def _rosterSetCB(self, con, iq_obj): log.debug('rosterSetCB') app.nec.push_incoming_event(RosterSetReceivedEvent(None, conn=self, stanza=iq_obj)) raise nbxmpp.NodeProcessed def _nec_roster_set_received(self, obj): if obj.conn.name != self.name: return for jid in obj.items: item = obj.items[jid] app.nec.push_incoming_event(RosterInfoEvent(None, conn=self, jid=jid, nickname=item['name'], sub=item['sub'], ask=item['ask'], groups=item['groups'])) account_jid = app.get_jid_from_account(self.name) app.logger.add_or_update_contact(account_jid, jid, item['name'], item['sub'], item['ask'], item['groups']) if obj.version: app.config.set_per('accounts', self.name, 'roster_version', obj.version) def _VersionCB(self, con, iq_obj): log.debug('VersionCB') if not self.connection or self.connected < 2: return app.nec.push_incoming_event(VersionRequestEvent(None, conn=self, stanza=iq_obj)) raise nbxmpp.NodeProcessed def _nec_version_request_received(self, obj): if obj.conn.name != self.name: return send_os = app.config.get_per('accounts', self.name, 'send_os_info') if send_os: iq_obj = obj.stanza.buildReply('result') qp = iq_obj.getQuery() qp.setTagData('name', 'Gajim') qp.setTagData('version', app.version) qp.setTagData('os', helpers.get_os_info()) else: iq_obj = obj.stanza.buildReply('error') err = nbxmpp.ErrorNode(name=nbxmpp.NS_STANZAS + \ ' service-unavailable') iq_obj.addChild(node=err) self.connection.send(iq_obj) def _LastCB(self, con, iq_obj): log.debug('LastCB') if not self.connection or self.connected < 2: return app.nec.push_incoming_event(LastRequestEvent(None, conn=self, stanza=iq_obj)) raise nbxmpp.NodeProcessed def _nec_last_request_received(self, obj): if obj.conn.name != self.name: return if app.HAVE_IDLE and app.config.get_per('accounts', self.name, 'send_idle_time'): iq_obj = obj.stanza.buildReply('result') qp = iq_obj.setQuery() qp.attrs['seconds'] = int(app.interface.sleeper.getIdleSec()) else: iq_obj = obj.stanza.buildReply('error') err = nbxmpp.ErrorNode(name=nbxmpp.NS_STANZAS + \ ' service-unavailable') iq_obj.addChild(node=err) self.connection.send(iq_obj) def _VersionResultCB(self, con, iq_obj): log.debug('VersionResultCB') app.nec.push_incoming_event(VersionResultReceivedEvent(None, conn=self, stanza=iq_obj)) def _TimeCB(self, con, iq_obj): log.debug('TimeCB') if not self.connection or self.connected < 2: return app.nec.push_incoming_event(TimeRequestEvent(None, conn=self, stanza=iq_obj)) raise nbxmpp.NodeProcessed def _nec_time_request_received(self, obj): if obj.conn.name != self.name: return if app.config.get_per('accounts', self.name, 'send_time_info'): iq_obj = obj.stanza.buildReply('result') qp = iq_obj.setQuery() qp.setTagData('utc', strftime('%Y%m%dT%H:%M:%S', gmtime())) qp.setTagData('tz', tzname[daylight]) qp.setTagData('display', strftime('%c', localtime())) else: iq_obj = obj.stanza.buildReply('error') err = nbxmpp.ErrorNode(name=nbxmpp.NS_STANZAS + \ ' service-unavailable') iq_obj.addChild(node=err) self.connection.send(iq_obj) def _TimeRevisedCB(self, con, iq_obj): log.debug('TimeRevisedCB') if not self.connection or self.connected < 2: return app.nec.push_incoming_event(TimeRevisedRequestEvent(None, conn=self, stanza=iq_obj)) raise nbxmpp.NodeProcessed def _nec_time_revised_request_received(self, obj): if obj.conn.name != self.name: return if app.config.get_per('accounts', self.name, 'send_time_info'): iq_obj = obj.stanza.buildReply('result') qp = iq_obj.setTag('time', namespace=nbxmpp.NS_TIME_REVISED) qp.setTagData('utc', strftime('%Y-%m-%dT%H:%M:%SZ', gmtime())) isdst = localtime().tm_isdst zone = -(timezone, altzone)[isdst] / 60.0 tzo = (zone / 60, abs(zone % 60)) qp.setTagData('tzo', '%+03d:%02d' % (tzo)) else: iq_obj = obj.stanza.buildReply('error') err = nbxmpp.ErrorNode(name=nbxmpp.NS_STANZAS + \ ' service-unavailable') iq_obj.addChild(node=err) self.connection.send(iq_obj) def _TimeRevisedResultCB(self, con, iq_obj): log.debug('TimeRevisedResultCB') app.nec.push_incoming_event(TimeResultReceivedEvent(None, conn=self, stanza=iq_obj)) def _rosterItemExchangeCB(self, con, msg): """ XEP-0144 Roster Item Echange """ log.debug('rosterItemExchangeCB') app.nec.push_incoming_event(RosterItemExchangeEvent(None, conn=self, stanza=msg)) raise nbxmpp.NodeProcessed def _messageCB(self, con, msg): """ Called when we receive a message """ log.debug('MessageCB') app.nec.push_incoming_event(NetworkEvent('raw-message-received', conn=self, stanza=msg, account=self.name)) def _dispatch_gc_msg_with_captcha(self, stanza, msg_obj): msg_obj.stanza = stanza app.nec.push_incoming_event(GcMessageReceivedEvent(None, conn=self, msg_obj=msg_obj)) def _on_bob_received(self, conn, result, cid): """ Called when we receive BoB data """ if cid not in self.awaiting_cids: return if result.getType() == 'result': data = result.getTags('data', namespace=nbxmpp.NS_BOB) if data.getAttr('cid') == cid: for func in self.awaiting_cids[cid]: cb = func[0] args = func[1] pos = func[2] bob_data = data.getData() def recurs(node, cid, data): if node.getData() == 'cid:' + cid: node.setData(data) else: for child in node.getChildren(): recurs(child, cid, data) recurs(args[pos], cid, bob_data) cb(*args) del self.awaiting_cids[cid] return # An error occured, call callback without modifying data. for func in self.awaiting_cids[cid]: cb = func[0] args = func[1] cb(*args) del self.awaiting_cids[cid] def get_bob_data(self, cid, to, callback, args, position): """ Request for BoB (XEP-0231) and when data will arrive, call callback with given args, after having replaced cid by it's data in args[position] """ if cid in self.awaiting_cids: self.awaiting_cids[cid].appends((callback, args, position)) else: self.awaiting_cids[cid] = [(callback, args, position)] iq = nbxmpp.Iq(to=to, typ='get') data = iq.addChild(name='data', attrs={'cid': cid}, namespace=nbxmpp.NS_BOB) self.connection.SendAndCallForResponse(iq, self._on_bob_received, {'cid': cid}) def _presenceCB(self, con, prs): """ Called when we receive a presence """ log.debug('PresenceCB') app.nec.push_incoming_event(NetworkEvent('raw-pres-received', conn=self, stanza=prs)) def _nec_subscribe_presence_received(self, obj): account = obj.conn.name if account != self.name: return if app.jid_is_transport(obj.fjid) and obj.fjid in \ self.agent_registrations: self.agent_registrations[obj.fjid]['sub_received'] = True if not self.agent_registrations[obj.fjid]['roster_push']: # We'll reply after roster push result return True if app.config.get_per('accounts', self.name, 'autoauth') or \ app.jid_is_transport(obj.fjid) or obj.jid in self.jids_for_auto_auth \ or obj.transport_auto_auth: if self.connection: p = nbxmpp.Presence(obj.fjid, 'subscribed') p = self.add_sha(p) self.connection.send(p) if app.jid_is_transport(obj.fjid) or obj.transport_auto_auth: #TODO!?!? #self.show = 'offline' #self.status = 'offline' #emit NOTIFY pass if obj.transport_auto_auth: self.automatically_added.append(obj.jid) self.request_subscription(obj.jid, name=obj.user_nick) return True if not obj.status: obj.status = _('I would like to add you to my roster.') def _nec_subscribed_presence_received(self, obj): account = obj.conn.name if account != self.name: return # BE CAREFUL: no con.updateRosterItem() in a callback if obj.jid in self.automatically_added: self.automatically_added.remove(obj.jid) return True # detect a subscription loop if obj.jid not in self.subscribed_events: self.subscribed_events[obj.jid] = [] self.subscribed_events[obj.jid].append(time_time()) block = False if len(self.subscribed_events[obj.jid]) > 5: if time_time() - self.subscribed_events[obj.jid][0] < 5: block = True self.subscribed_events[obj.jid] = \ self.subscribed_events[obj.jid][1:] if block: app.config.set_per('account', self.name, 'dont_ack_subscription', True) return True def _nec_subscribed_presence_received_end(self, obj): account = obj.conn.name if account != self.name: return if not app.config.get_per('accounts', account, 'dont_ack_subscription'): self.ack_subscribed(obj.jid) def _nec_unsubscribed_presence_received(self, obj): account = obj.conn.name if account != self.name: return # detect a unsubscription loop if obj.jid not in self.subscribed_events: self.subscribed_events[obj.jid] = [] self.subscribed_events[obj.jid].append(time_time()) block = False if len(self.subscribed_events[obj.jid]) > 5: if time_time() - self.subscribed_events[obj.jid][0] < 5: block = True self.subscribed_events[obj.jid] = \ self.subscribed_events[obj.jid][1:] if block: app.config.set_per('account', self.name, 'dont_ack_subscription', True) return True def _nec_unsubscribed_presence_received_end(self, obj): account = obj.conn.name if account != self.name: return if not app.config.get_per('accounts', account, 'dont_ack_subscription'): self.ack_unsubscribed(obj.jid) def _nec_agent_removed(self, obj): if obj.conn.name != self.name: return for jid in obj.jid_list: log.debug('Removing contact %s due to unregistered transport %s' % \ (jid, obj.agent)) self.unsubscribe(jid) # Transport contacts can't have 2 resources if jid in app.to_be_removed[self.name]: # This way we'll really remove it app.to_be_removed[self.name].remove(jid) def _StanzaArrivedCB(self, con, obj): self.last_io = app.idlequeue.current_time() def _MucOwnerCB(self, con, iq_obj): log.debug('MucOwnerCB') app.nec.push_incoming_event(MucOwnerReceivedEvent(None, conn=self, stanza=iq_obj)) def _MucAdminCB(self, con, iq_obj): log.debug('MucAdminCB') app.nec.push_incoming_event(MucAdminReceivedEvent(None, conn=self, stanza=iq_obj)) def _IqPingCB(self, con, iq_obj): log.debug('IqPingCB') app.nec.push_incoming_event(PingReceivedEvent(None, conn=self, stanza=iq_obj)) raise nbxmpp.NodeProcessed def _nec_ping_received(self, obj): if obj.conn.name != self.name: return if not self.connection or self.connected < 2: return iq_obj = obj.stanza.buildReply('result') q = iq_obj.getTag('ping') if q: iq_obj.delChild(q) self.connection.send(iq_obj) def _PrivacySetCB(self, con, iq_obj): """ Privacy lists (XEP 016) A list has been set. """ log.debug('PrivacySetCB') if not self.connection or self.connected < 2: return result = iq_obj.buildReply('result') q = result.getTag('query') if q: result.delChild(q) self.connection.send(result) for list_ in iq_obj.getQueryPayload(): if list_.getName() == 'list': self.get_privacy_list(list_.getAttr('name')) raise nbxmpp.NodeProcessed def _getRoster(self): log.debug('getRosterCB') if not self.connection: return self.connection.getRoster(self._on_roster_set) self.discoverItems(app.config.get_per('accounts', self.name, 'hostname'), id_prefix='Gajim_') if app.config.get_per('accounts', self.name, 'use_ft_proxies'): self.discover_ft_proxies() def discover_ft_proxies(self): cfg_proxies = app.config.get_per('accounts', self.name, 'file_transfer_proxies') our_jid = helpers.parse_jid(app.get_jid_from_account(self.name) + \ '/' + self.server_resource) testit = app.config.get_per('accounts', self.name, 'test_ft_proxies_on_startup') if cfg_proxies: proxies = [e.strip() for e in cfg_proxies.split(',')] for proxy in proxies: app.proxy65_manager.resolve(proxy, self.connection, our_jid, testit=testit) def discover_servers(self): if not self.connection: return servers = [] for c in app.contacts.iter_contacts(self.name): s = app.get_server_from_jid(c.jid) if s not in servers and s not in app.transport_type: servers.append(s) for s in servers: self.discoverInfo(s) def _on_roster_set(self, roster): app.nec.push_incoming_event(RosterReceivedEvent(None, conn=self, xmpp_roster=roster)) def _nec_roster_received(self, obj): if obj.conn.name != self.name: return our_jid = app.get_jid_from_account(self.name) if self.connected > 1 and self.continue_connect_info: msg = self.continue_connect_info[1] sign_msg = self.continue_connect_info[2] signed = '' send_first_presence = True if sign_msg: signed = self.get_signed_presence(msg, self._send_first_presence) if signed is None: app.nec.push_incoming_event(GPGPasswordRequiredEvent(None, conn=self, callback=self._send_first_presence)) # _send_first_presence will be called when user enter # passphrase send_first_presence = False if send_first_presence: self._send_first_presence(signed) if obj.received_from_server: for jid in obj.roster: if jid != our_jid and app.jid_is_transport(jid) and \ not app.get_transport_name_from_jid(jid): # we can't determine which iconset to use self.discoverInfo(jid) app.logger.replace_roster(self.name, obj.version, obj.roster) for contact in app.contacts.iter_contacts(self.name): if not contact.is_groupchat() and contact.jid not in obj.roster\ and contact.jid != our_jid: app.nec.push_incoming_event(RosterInfoEvent(None, conn=self, jid=contact.jid, nickname=None, sub=None, ask=None, groups=())) for jid, info in obj.roster.items(): app.nec.push_incoming_event(RosterInfoEvent(None, conn=self, jid=jid, nickname=info['name'], sub=info['subscription'], ask=info['ask'], groups=info['groups'], avatar_sha=info['avatar_sha'])) def _send_first_presence(self, signed=''): show = self.continue_connect_info[0] msg = self.continue_connect_info[1] sign_msg = self.continue_connect_info[2] if sign_msg and not signed: signed = self.get_signed_presence(msg) if signed is None: app.nec.push_incoming_event(BadGPGPassphraseEvent(None, conn=self)) self.USE_GPG = False signed = '' self.connected = app.SHOW_LIST.index(show) sshow = helpers.get_xmpp_show(show) # send our presence if show == 'invisible': self.send_invisible_presence(msg, signed, True) return if show not in ['offline', 'online', 'chat', 'away', 'xa', 'dnd']: return priority = app.get_priority(self.name, sshow) p = nbxmpp.Presence(typ=None, priority=priority, show=sshow) if msg: p.setStatus(msg) if signed: p.setTag(nbxmpp.NS_SIGNED + ' x').setData(signed) p = self.add_sha(p) if self.connection: self.connection.send(p) self.priority = priority app.nec.push_incoming_event(OurShowEvent(None, conn=self, show=show)) if self.vcard_supported: # ask our VCard self.request_vcard(self._on_own_avatar_received) # Get bookmarks from private namespace self.get_bookmarks() # Get annotations from private namespace self.get_annotations() # Inform GUI we just signed in app.nec.push_incoming_event(SignedInEvent(None, conn=self)) self.send_awaiting_pep() self.continue_connect_info = None def _SearchCB(self, con, iq_obj): log.debug('SearchCB') app.nec.push_incoming_event(SearchFormReceivedEvent(None, conn=self, stanza=iq_obj)) def _search_fields_received(self, con, iq_obj): jid = jid = helpers.get_jid_from_iq(iq_obj) tag = iq_obj.getTag('query', namespace = nbxmpp.NS_SEARCH) if not tag: self.dispatch('SEARCH_FORM', (jid, None, False)) return df = tag.getTag('x', namespace=nbxmpp.NS_DATA) if df: self.dispatch('SEARCH_FORM', (jid, df, True)) return df = {} for i in iq_obj.getQueryPayload(): df[i.getName()] = i.getData() self.dispatch('SEARCH_FORM', (jid, df, False)) def _PubkeyGetCB(self, con, iq_obj): log.info('PubkeyGetCB') jid_from = helpers.get_full_jid_from_iq(iq_obj) sid = iq_obj.getAttr('id') jingle_xtls.send_cert(con, jid_from, sid) raise nbxmpp.NodeProcessed def _PubkeyResultCB(self, con, iq_obj): log.info('PubkeyResultCB') jid_from = helpers.get_full_jid_from_iq(iq_obj) jingle_xtls.handle_new_cert(con, iq_obj, jid_from) def _BlockingSetCB(self, con, iq_obj): log.debug('_BlockingSetCB') app.nec.push_incoming_event( BlockingEvent(None, conn=self, stanza=iq_obj)) reply = nbxmpp.Iq(typ='result', attrs={'id': iq_obj.getID()}, to=iq_obj.getFrom(), frm=iq_obj.getTo(), xmlns=None) self.connection.send(reply) raise nbxmpp.NodeProcessed def _BlockingResultCB(self, con, iq_obj): log.debug('_BlockingResultCB') app.nec.push_incoming_event( BlockingEvent(None, conn=self, stanza=iq_obj)) raise nbxmpp.NodeProcessed def _nec_blocking(self, obj): if obj.conn.name != self.name: return if obj.unblock_all: self.blocked_contacts = [] elif obj.blocklist: self.blocked_contacts = obj.blocklist else: for jid in obj.blocked_jids: if jid not in self.blocked_contacts: self.blocked_contacts.append(jid) contact_list = app.contacts.get_contacts(self.name, jid) for contact in contact_list: contact.show = 'offline' for jid in obj.unblocked_jids: if jid in self.blocked_contacts: self.blocked_contacts.remove(jid) # Send a presence Probe to get the current Status probe = nbxmpp.Presence(jid, 'probe', frm=self.get_own_jid()) self.connection.send(probe) def _nec_stream_other_host_received(self, obj): if obj.conn.name != self.name: return self.redirected = obj.redirected def _StreamCB(self, con, obj): log.debug('StreamCB') app.nec.push_incoming_event(StreamReceivedEvent(None, conn=self, stanza=obj)) def _register_handlers(self, con, con_type): # try to find another way to register handlers in each class # that defines handlers con.RegisterHandler('message', self._messageCB) con.RegisterHandler('presence', self._presenceCB) # We use makefirst so that this handler is called before _messageCB, and # can prevent calling it when it's not needed. # We also don't check for namespace, else it cannot stop _messageCB to # be called con.RegisterHandler('message', self._pubsubEventCB, makefirst=True) con.RegisterHandler('iq', self._rosterSetCB, 'set', nbxmpp.NS_ROSTER) con.RegisterHandler('iq', self._siSetCB, 'set', nbxmpp.NS_SI) con.RegisterHandler('iq', self._rosterItemExchangeCB, 'set', nbxmpp.NS_ROSTERX) con.RegisterHandler('iq', self._siErrorCB, 'error', nbxmpp.NS_SI) con.RegisterHandler('iq', self._siResultCB, 'result', nbxmpp.NS_SI) con.RegisterHandler('iq', self._discoGetCB, 'get', nbxmpp.NS_DISCO) con.RegisterHandler('iq', self._bytestreamSetCB, 'set', nbxmpp.NS_BYTESTREAM) con.RegisterHandler('iq', self._bytestreamResultCB, 'result', nbxmpp.NS_BYTESTREAM) con.RegisterHandler('iq', self._bytestreamErrorCB, 'error', nbxmpp.NS_BYTESTREAM) con.RegisterHandlerOnce('iq', self.IBBAllIqHandler) con.RegisterHandler('iq', self.IBBIqHandler, ns=nbxmpp.NS_IBB) con.RegisterHandler('message', self.IBBMessageHandler, ns=nbxmpp.NS_IBB) con.RegisterHandler('iq', self._DiscoverItemsCB, 'result', nbxmpp.NS_DISCO_ITEMS) con.RegisterHandler('iq', self._DiscoverItemsErrorCB, 'error', nbxmpp.NS_DISCO_ITEMS) con.RegisterHandler('iq', self._DiscoverInfoCB, 'result', nbxmpp.NS_DISCO_INFO) con.RegisterHandler('iq', self._DiscoverInfoErrorCB, 'error', nbxmpp.NS_DISCO_INFO) con.RegisterHandler('iq', self._VersionCB, 'get', nbxmpp.NS_VERSION) con.RegisterHandler('iq', self._TimeCB, 'get', nbxmpp.NS_TIME) con.RegisterHandler('iq', self._TimeRevisedCB, 'get', nbxmpp.NS_TIME_REVISED) con.RegisterHandler('iq', self._LastCB, 'get', nbxmpp.NS_LAST) con.RegisterHandler('iq', self._VersionResultCB, 'result', nbxmpp.NS_VERSION) con.RegisterHandler('iq', self._TimeRevisedResultCB, 'result', nbxmpp.NS_TIME_REVISED) con.RegisterHandler('iq', self._MucOwnerCB, 'result', nbxmpp.NS_MUC_OWNER) con.RegisterHandler('iq', self._MucAdminCB, 'result', nbxmpp.NS_MUC_ADMIN) con.RegisterHandler('iq', self._PrivateCB, 'result', nbxmpp.NS_PRIVATE) con.RegisterHandler('iq', self._SecLabelCB, 'result', nbxmpp.NS_SECLABEL_CATALOG) con.RegisterHandler('iq', self._HttpAuthCB, 'get', nbxmpp.NS_HTTP_AUTH) con.RegisterHandler('iq', self._CommandExecuteCB, 'set', nbxmpp.NS_COMMANDS) con.RegisterHandler('iq', self._DiscoverInfoGetCB, 'get', nbxmpp.NS_DISCO_INFO) con.RegisterHandler('iq', self._DiscoverItemsGetCB, 'get', nbxmpp.NS_DISCO_ITEMS) con.RegisterHandler('iq', self._IqPingCB, 'get', nbxmpp.NS_PING) con.RegisterHandler('iq', self._SearchCB, 'result', nbxmpp.NS_SEARCH) con.RegisterHandler('iq', self._PrivacySetCB, 'set', nbxmpp.NS_PRIVACY) con.RegisterHandler('iq', self._ArchiveCB, ns=nbxmpp.NS_MAM_1) con.RegisterHandler('iq', self._ArchiveCB, ns=nbxmpp.NS_MAM_2) con.RegisterHandler('iq', self._PubSubCB, 'result') con.RegisterHandler('iq', self._PubSubErrorCB, 'error') con.RegisterHandler('iq', self._JingleCB, 'result') con.RegisterHandler('iq', self._JingleCB, 'error') con.RegisterHandler('iq', self._JingleCB, 'set', nbxmpp.NS_JINGLE) con.RegisterHandler('iq', self._ErrorCB, 'error') con.RegisterHandler('iq', self._IqCB) con.RegisterHandler('iq', self._StanzaArrivedCB) con.RegisterHandler('iq', self._ResultCB, 'result') con.RegisterHandler('presence', self._StanzaArrivedCB) con.RegisterHandler('message', self._StanzaArrivedCB) con.RegisterHandler('unknown', self._StreamCB, nbxmpp.NS_XMPP_STREAMS, xmlns=nbxmpp.NS_STREAMS) con.RegisterHandler('iq', self._PubkeyGetCB, 'get', nbxmpp.NS_PUBKEY_PUBKEY) con.RegisterHandler('iq', self._PubkeyResultCB, 'result', nbxmpp.NS_PUBKEY_PUBKEY) con.RegisterHandler('iq', self._BlockingSetCB, 'set', nbxmpp.NS_BLOCKING) con.RegisterHandler('iq', self._BlockingResultCB, 'result', nbxmpp.NS_BLOCKING) connection_handlers_events.py000066400000000000000000003323421326020644600311670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common# -*- coding:utf-8 -*- ## src/common/connection_handlers_events.py ## ## Copyright (C) 2010-2014 Yann Leboulanger ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## # pylint: disable=no-init # pylint: disable=attribute-defined-outside-init from calendar import timegm import datetime import hashlib import hmac import logging import sys import os from time import time as time_time import nbxmpp from nbxmpp.protocol import NS_CHATSTATES from gajim.common import atom from gajim.common import nec from gajim.common import helpers from gajim.common import app from gajim.common import i18n from gajim.common import dataforms from gajim.common import exceptions from gajim.common.zeroconf.zeroconf import Constant from gajim.common.logger import LOG_DB_PATH, KindConstant from gajim.common.pep import SUPPORTED_PERSONAL_USER_EVENTS from gajim.common.jingle_transport import JingleTransportSocks5 from gajim.common.file_props import FilesProp from gajim.common.nec import NetworkEvent if app.HAVE_PYOPENSSL: import OpenSSL.crypto log = logging.getLogger('gajim.c.connection_handlers_events') CONDITION_TO_CODE = { 'realjid-public': 100, 'affiliation-changed': 101, 'unavailable-shown': 102, 'unavailable-not-shown': 103, 'configuration-changed': 104, 'self-presence': 110, 'logging-enabled': 170, 'logging-disabled': 171, 'non-anonymous': 172, 'semi-anonymous': 173, 'fully-anonymous': 174, 'room-created': 201, 'nick-assigned': 210, 'banned': 301, 'new-nick': 303, 'kicked': 307, 'removed-affiliation': 321, 'removed-membership': 322, 'removed-shutdown': 332, } class HelperEvent: def get_jid_resource(self, check_fake_jid=False): if check_fake_jid and hasattr(self, 'id_') and \ self.id_ in self.conn.groupchat_jids: self.fjid = self.conn.groupchat_jids[self.id_] del self.conn.groupchat_jids[self.id_] else: self.fjid = helpers.get_full_jid_from_iq(self.stanza) self.jid, self.resource = app.get_room_and_nick_from_fjid(self.fjid) def get_id(self): self.id_ = self.stanza.getID() def get_gc_control(self): self.gc_control = app.interface.msg_win_mgr.get_gc_control(self.jid, self.conn.name) # If gc_control is missing - it may be minimized. Try to get it # from there. If it's not there - then it's missing anyway and # will remain set to None. if not self.gc_control: minimized = app.interface.minimized_controls[self.conn.name] self.gc_control = minimized.get(self.jid) def _generate_timestamp(self, tag): # Make sure we use only int/float Epoch time if tag is None: self.timestamp = time_time() return try: tim = helpers.datetime_tuple(tag) self.timestamp = timegm(tim) except Exception: log.error('wrong timestamp, ignoring it: ' + tag) self.timestamp = time_time() def get_chatstate(self): """ Extract chatstate from a stanza Requires self.stanza and self.msgtxt """ self.chatstate = None # chatstates - look for chatstate tags in a message if not delayed delayed = self.stanza.getTag('x', namespace=nbxmpp.NS_DELAY) is not None if not delayed: children = self.stanza.getChildren() for child in children: if child.getNamespace() == NS_CHATSTATES: self.chatstate = child.getName() break def get_oob_data(self, stanza): oob_node = stanza.getTag('x', namespace=nbxmpp.NS_X_OOB) if oob_node is not None: if 'gajim' not in self.additional_data: self.additional_data['gajim'] = {} oob_url = oob_node.getTagData('url') if oob_url is not None: self.additional_data['gajim']['oob_url'] = oob_url oob_desc = oob_node.getTagData('desc') if oob_desc is not None: self.additional_data['gajim']['oob_desc'] = oob_desc def get_stanza_id(self, stanza, query=False): if query: # On a MAM query the stanza-id is maybe not set, so # get the id of the stanza return stanza.getAttr('id') stanza_id, by = stanza.getStanzaIDAttrs() if by is None: # We can not verify who set this stanza-id, ignore it. return if stanza.getType() == 'groupchat': if stanza.getFrom().bareMatch(by): # by attribute must match the server return stanza_id elif self.conn.get_own_jid().bareMatch(by): # by attribute must match the server return stanza_id return @staticmethod def get_forwarded_message(stanza): forwarded = stanza.getTag('forwarded', namespace=nbxmpp.NS_FORWARD, protocol=True) if forwarded is not None: return forwarded.getTag('message', protocol=True) def _is_self_message(self, message): if self.self_message is not None: return self.self_message own_jid = self.conn.get_own_jid() frm = message.getFrom() to = message.getTo() # If 'to' is not set we assume own jid self.self_message = frm.bareMatch(to or own_jid) return self.self_message def _is_muc_pm(self, message): if self.muc_pm is not None: return self.muc_pm self.muc_pm = False muc_user = message.getTag('x', namespace=nbxmpp.NS_MUC_USER) if muc_user is not None: self.muc_pm = muc_user.getChildren() == [] return self.muc_pm class HttpAuthReceivedEvent(nec.NetworkIncomingEvent): name = 'http-auth-received' base_network_events = [] def generate(self): self.opt = app.config.get_per('accounts', self.conn.name, 'http_auth') self.iq_id = self.stanza.getTagAttr('confirm', 'id') self.method = self.stanza.getTagAttr('confirm', 'method') self.url = self.stanza.getTagAttr('confirm', 'url') # In case it's a message with a body self.msg = self.stanza.getTagData('body') return True class VersionResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'version-result-received' base_network_events = [] def generate(self): self.get_id() self.get_jid_resource(check_fake_jid=True) if self.id_ in self.conn.version_ids: self.conn.version_ids.remove(self.id_) self.client_info = '' self.os_info = '' if self.stanza.getType() == 'error': return True qp = self.stanza.getTag('query') if qp.getTag('name'): self.client_info += qp.getTag('name').getData() if qp.getTag('version'): self.client_info += ' ' + qp.getTag('version').getData() if qp.getTag('os'): self.os_info += qp.getTag('os').getData() return True class TimeResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'time-result-received' base_network_events = [] def generate(self): self.get_id() self.get_jid_resource(check_fake_jid=True) if self.id_ in self.conn.entity_time_ids: self.conn.entity_time_ids.remove(self.id_) self.time_info = '' if self.stanza.getType() == 'error': return True qp = self.stanza.getTag('time') if not qp: # wrong answer return tzo = qp.getTag('tzo').getData() if tzo.lower() == 'z': tzo = '0:0' try: tzoh, tzom = tzo.split(':') except Exception as e: # wrong tzo return utc_time = qp.getTag('utc').getData() ZERO = datetime.timedelta(0) class UTC(datetime.tzinfo): def utcoffset(self, dt): return ZERO def tzname(self, dt): return "UTC" def dst(self, dt): return ZERO class contact_tz(datetime.tzinfo): def utcoffset(self, dt): return datetime.timedelta(hours=int(tzoh), minutes=int(tzom)) def tzname(self, dt): return "remote timezone" def dst(self, dt): return ZERO if utc_time[-1:] == 'Z': # Remove the trailing 'Z' utc_time = utc_time[:-1] elif utc_time[-6:] == "+00:00": # Remove the trailing "+00:00" utc_time = utc_time[:-6] else: log.info("Wrong timezone defintion: %s" % utc_time) return try: t = datetime.datetime.strptime(utc_time, '%Y-%m-%dT%H:%M:%S') except ValueError: try: t = datetime.datetime.strptime(utc_time, '%Y-%m-%dT%H:%M:%S.%f') except ValueError as e: log.info('Wrong time format: %s' % str(e)) return t = t.replace(tzinfo=UTC()) self.time_info = t.astimezone(contact_tz()).strftime('%c') return True class RosterItemExchangeEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'roster-item-exchange-received' base_network_events = [] def generate(self): self.get_id() self.get_jid_resource() self.exchange_items_list = {} items_list = self.stanza.getTag('x').getChildren() if not items_list: return self.action = items_list[0].getAttr('action') if self.action is None: self.action = 'add' for item in self.stanza.getTag('x', namespace=nbxmpp.NS_ROSTERX).\ getChildren(): try: jid = helpers.parse_jid(item.getAttr('jid')) except helpers.InvalidFormat: log.warning('Invalid JID: %s, ignoring it' % item.getAttr('jid')) continue name = item.getAttr('name') contact = app.contacts.get_contact(self.conn.name, jid) groups = [] same_groups = True for group in item.getTags('group'): groups.append(group.getData()) # check that all suggested groups are in the groups we have for # this contact if not contact or group not in contact.groups: same_groups = False if contact: # check that all groups we have for this contact are in the # suggested groups for group in contact.groups: if group not in groups: same_groups = False if contact.sub in ('both', 'to') and same_groups: continue self.exchange_items_list[jid] = [] self.exchange_items_list[jid].append(name) self.exchange_items_list[jid].append(groups) if self.exchange_items_list: return True class VersionRequestEvent(nec.NetworkIncomingEvent): name = 'version-request-received' base_network_events = [] class LastRequestEvent(nec.NetworkIncomingEvent): name = 'last-request-received' base_network_events = [] class TimeRequestEvent(nec.NetworkIncomingEvent): name = 'time-request-received' base_network_events = [] class TimeRevisedRequestEvent(nec.NetworkIncomingEvent): name = 'time-revised-request-received' base_network_events = [] class RosterReceivedEvent(nec.NetworkIncomingEvent): name = 'roster-received' base_network_events = [] def generate(self): if hasattr(self, 'xmpp_roster'): self.version = self.xmpp_roster.version self.received_from_server = self.xmpp_roster.received_from_server self.roster = {} raw_roster = self.xmpp_roster.getRaw() our_jid = app.get_jid_from_account(self.conn.name) for jid in raw_roster: try: j = helpers.parse_jid(jid) except Exception: print(_('JID %s is not RFC compliant. It will not be added ' 'to your roster. Use roster management tools such as ' 'http://jru.jabberstudio.org/ to remove it') % jid, file=sys.stderr) else: infos = raw_roster[jid] if jid != our_jid and (not infos['subscription'] or \ infos['subscription'] == 'none') and (not infos['ask'] or \ infos['ask'] == 'none') and not infos['name'] and \ not infos['groups']: # remove this useless item, it won't be shown in roster # anyway self.conn.connection.getRoster().delItem(jid) elif jid != our_jid: # don't add our jid self.roster[j] = raw_roster[jid] self.roster[j]['avatar_sha'] = None else: # Roster comes from DB self.received_from_server = False self.version = app.config.get_per('accounts', self.conn.name, 'roster_version') self.roster = app.logger.get_roster(app.get_jid_from_account( self.conn.name)) if not self.roster: app.config.set_per( 'accounts', self.conn.name, 'roster_version', '') return True class RosterSetReceivedEvent(nec.NetworkIncomingEvent): name = 'roster-set-received' base_network_events = [] def generate(self): frm = helpers.get_jid_from_iq(self.stanza) our_jid = app.get_jid_from_account(self.conn.name) if frm and frm != our_jid and frm != app.get_server_from_jid(our_jid): return self.version = self.stanza.getTagAttr('query', 'ver') self.items = {} for item in self.stanza.getTag('query').getChildren(): try: jid = helpers.parse_jid(item.getAttr('jid')) except helpers.InvalidFormat: log.warning('Invalid JID: %s, ignoring it' % item.getAttr('jid')) continue name = item.getAttr('name') sub = item.getAttr('subscription') ask = item.getAttr('ask') groups = [] for group in item.getTags('group'): groups.append(group.getData()) self.items[jid] = {'name': name, 'sub': sub, 'ask': ask, 'groups': groups} if len(self.items) > 1: reply = nbxmpp.Iq(typ='error', attrs={'id': self.stanza.getID()}, to=self.stanza.getFrom(), frm=self.stanza.getTo(), xmlns=None) self.conn.connection.send(reply) return if self.conn.connection and self.conn.connected > 1: reply = nbxmpp.Iq(typ='result', attrs={'id': self.stanza.getID()}, to=self.stanza.getFrom(), frm=self.stanza.getTo(), xmlns=None) self.conn.connection.send(reply) return True class RosterInfoEvent(nec.NetworkIncomingEvent): name = 'roster-info' base_network_events = [] def init(self): self.avatar_sha = None class MucOwnerReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'muc-owner-received' base_network_events = [] def generate(self): self.get_jid_resource() qp = self.stanza.getQueryPayload() self.form_node = None for q in qp: if q.getNamespace() == nbxmpp.NS_DATA: self.form_node = q self.dataform = dataforms.ExtendForm(node=self.form_node) return True class MucAdminReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'muc-admin-received' base_network_events = [] def generate(self): self.get_jid_resource() items = self.stanza.getTag('query', namespace=nbxmpp.NS_MUC_ADMIN).getTags('item') self.users_dict = {} for item in items: if item.has_attr('jid') and item.has_attr('affiliation'): try: jid = helpers.parse_jid(item.getAttr('jid')) except helpers.InvalidFormat: log.warning('Invalid JID: %s, ignoring it' % \ item.getAttr('jid')) continue affiliation = item.getAttr('affiliation') self.users_dict[jid] = {'affiliation': affiliation} if item.has_attr('nick'): self.users_dict[jid]['nick'] = item.getAttr('nick') if item.has_attr('role'): self.users_dict[jid]['role'] = item.getAttr('role') reason = item.getTagData('reason') if reason: self.users_dict[jid]['reason'] = reason return True class PrivateStorageReceivedEvent(nec.NetworkIncomingEvent): name = 'private-storage-received' base_network_events = [] def generate(self): query = self.stanza.getTag('query') self.storage_node = query.getTag('storage') if self.storage_node: self.namespace = self.storage_node.getNamespace() return True class BookmarksHelper: def parse_bookmarks(self): self.bookmarks = [] NS_GAJIM_BM = 'xmpp:gajim.org/bookmarks' confs = self.storage_node.getTags('conference') for conf in confs: autojoin_val = conf.getAttr('autojoin') if not autojoin_val: # not there (it's optional) autojoin_val = False minimize_val = conf.getTag('minimize', namespace=NS_GAJIM_BM) if not minimize_val: # not there, try old Gajim behaviour minimize_val = conf.getAttr('minimize') if not minimize_val: # not there (it's optional) minimize_val = False else: minimize_val = minimize_val.getData() print_status = conf.getTag('print_status', namespace=NS_GAJIM_BM) if not print_status: # not there, try old Gajim behaviour print_status = conf.getTagData('print_status') if not print_status: # not there, try old Gajim behaviour print_status = conf.getTagData('show_status') else: print_status = print_status.getData() try: jid = helpers.parse_jid(conf.getAttr('jid')) except helpers.InvalidFormat: log.warning('Invalid JID: %s, ignoring it' % conf.getAttr('jid')) continue bm = {'name': conf.getAttr('name'), 'jid': jid, 'autojoin': autojoin_val, 'minimize': minimize_val, 'password': conf.getTagData('password'), 'nick': conf.getTagData('nick'), 'print_status': print_status} bm_jids = [b['jid'] for b in self.bookmarks] if bm['jid'] not in bm_jids: self.bookmarks.append(bm) class PrivateStorageBookmarksReceivedEvent(nec.NetworkIncomingEvent, BookmarksHelper): name = 'private-storage-bookmarks-received' base_network_events = ['private-storage-received'] def generate(self): self.conn = self.base_event.conn self.storage_node = self.base_event.storage_node if self.base_event.namespace != nbxmpp.NS_BOOKMARKS: return self.parse_bookmarks() return True class BookmarksReceivedEvent(nec.NetworkIncomingEvent): name = 'bookmarks-received' base_network_events = ['private-storage-bookmarks-received', 'pubsub-bookmarks-received'] def generate(self): self.conn = self.base_event.conn self.bookmarks = self.base_event.bookmarks return True class PrivateStorageRosternotesReceivedEvent(nec.NetworkIncomingEvent): name = 'private-storage-rosternotes-received' base_network_events = ['private-storage-received'] def generate(self): self.conn = self.base_event.conn if self.base_event.namespace != nbxmpp.NS_ROSTERNOTES: return notes = self.base_event.storage_node.getTags('note') self.annotations = {} for note in notes: try: jid = helpers.parse_jid(note.getAttr('jid')) except helpers.InvalidFormat: log.warning('Invalid JID: %s, ignoring it' % note.getAttr('jid')) continue annotation = note.getData() self.annotations[jid] = annotation if self.annotations: return True class RosternotesReceivedEvent(nec.NetworkIncomingEvent): name = 'rosternotes-received' base_network_events = ['private-storage-rosternotes-received'] def generate(self): self.conn = self.base_event.conn self.annotations = self.base_event.annotations return True class PubsubReceivedEvent(nec.NetworkIncomingEvent): name = 'pubsub-received' base_network_events = [] def generate(self): self.jid = self.stanza.getFrom() self.pubsub_node = self.stanza.getTag('pubsub') if not self.pubsub_node: return self.items_node = self.pubsub_node.getTag('items') if not self.items_node: return return True class PubsubBookmarksReceivedEvent(nec.NetworkIncomingEvent, BookmarksHelper): name = 'pubsub-bookmarks-received' base_network_events = ['pubsub-received'] def generate(self): self.conn = self.base_event.conn self.item_node = self.base_event.items_node.getTag('item') if not self.item_node: return children = self.item_node.getChildren() if not children: return self.storage_node = children[0] ns = self.storage_node.getNamespace() if ns != nbxmpp.NS_BOOKMARKS: return self.parse_bookmarks() return True class SearchFormReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'search-form-received' base_network_events = [] def generate(self): self.get_jid_resource() self.data = None self.is_dataform = False tag = self.stanza.getTag('query', namespace=nbxmpp.NS_SEARCH) if not tag: return True self.data = tag.getTag('x', namespace=nbxmpp.NS_DATA) if self.data: self.is_dataform = True return True self.data = {} for i in self.stanza.getQueryPayload(): self.data[i.getName()] = i.getData() return True class SearchResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'search-result-received' base_network_events = [] def generate(self): self.get_jid_resource() self.data = None self.is_dataform = False tag = self.stanza.getTag('query', namespace=nbxmpp.NS_SEARCH) if not tag: return True self.data = tag.getTag('x', namespace=nbxmpp.NS_DATA) if self.data: self.is_dataform = True return True self.data = [] for item in tag.getTags('item'): # We also show attributes. jid is there f = item.attrs for i in item.getPayload(): f[i.getName()] = i.getData() self.data.append(f) return True class IqErrorReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'iq-error-received' base_network_events = [] def generate(self): self.get_id() self.get_jid_resource(check_fake_jid=True) self.errmsg = self.stanza.getErrorMsg() self.errcode = self.stanza.getErrorCode() return True class PingReceivedEvent(nec.NetworkIncomingEvent): name = 'ping-received' base_network_events = [] class StreamReceivedEvent(nec.NetworkIncomingEvent): name = 'stream-received' base_network_events = [] class StreamConflictReceivedEvent(nec.NetworkIncomingEvent): name = 'stream-conflict-received' base_network_events = ['stream-received'] def generate(self): if self.base_event.stanza.getTag('conflict'): self.conn = self.base_event.conn return True class StreamOtherHostReceivedEvent(nec.NetworkIncomingEvent): name = 'stream-other-host-received' base_network_events = ['stream-received'] def generate(self): self.conn = self.base_event.conn self.stanza = self.base_event.stanza other_host = self.stanza.getTag('see-other-host') if other_host and self.conn._current_type in ('ssl', 'tls'): host = other_host.getData() if ':' in host: host_l = host.split(':', 1) h = host_l[0] p = host_l[1] else: h = host p = 5222 if h.startswith('[') and h.endswith(']'): h = h[1:-1] self.redirected = {'host': h, 'port': p} return True class PresenceHelperEvent: def _generate_show(self): self.show = self.stanza.getShow() if self.show not in ('chat', 'away', 'xa', 'dnd'): self.show = '' # We ignore unknown show if not self.ptype and not self.show: self.show = 'online' elif self.ptype == 'unavailable': self.show = 'offline' def _generate_ptype(self): self.ptype = self.stanza.getType() if self.ptype == 'available': self.ptype = None rfc_types = ('unavailable', 'error', 'subscribe', 'subscribed', 'unsubscribe', 'unsubscribed') if self.ptype and not self.ptype in rfc_types: self.ptype = None class PresenceReceivedEvent(nec.NetworkIncomingEvent, HelperEvent, PresenceHelperEvent): name = 'presence-received' base_network_events = ['raw-pres-received'] def _generate_keyID(self, sig_tag): self.keyID = '' if sig_tag and self.conn.USE_GPG and self.ptype != 'error': # error presences contain our own signature # verify sig_msg = sig_tag.getData() self.keyID = self.conn.gpg.verify(self.status, sig_msg) self.keyID = helpers.prepare_and_validate_gpg_keyID(self.conn.name, self.jid, self.keyID) def _generate_prio(self): self.prio = self.stanza.getPriority() try: self.prio = int(self.prio) except Exception: self.prio = 0 def generate(self): self.conn = self.base_event.conn self.stanza = self.base_event.stanza self.need_add_in_roster = False self.need_redraw = False self.popup = False # Do we want to open chat window ? if not self.conn or self.conn.connected < 2: log.debug('account is no more connected') return self._generate_ptype() try: self.get_jid_resource() except Exception: log.warning('Invalid JID: %s, ignoring it' % self.stanza.getFrom()) return jid_list = app.contacts.get_jid_list(self.conn.name) self.timestamp = None self.get_id() self.is_gc = False # is it a GC presence ? sig_tag = None self.avatar_sha = None # XEP-0172 User Nickname self.user_nick = self.stanza.getTagData('nick') or '' self.contact_nickname = None self.transport_auto_auth = False # XEP-0203 delay_tag = self.stanza.getTag('delay', namespace=nbxmpp.NS_DELAY2) if delay_tag: self._generate_timestamp(self.stanza.timestamp) # XEP-0319 self.idle_time = None idle_tag = self.stanza.getTag('idle', namespace=nbxmpp.NS_IDLE) if idle_tag: time_str = idle_tag.getAttr('since') tim = helpers.datetime_tuple(time_str) self.idle_time = timegm(tim) xtags = self.stanza.getTags('x') for x in xtags: namespace = x.getNamespace() if namespace.startswith(nbxmpp.NS_MUC): self.is_gc = True elif namespace == nbxmpp.NS_SIGNED: sig_tag = x elif namespace == nbxmpp.NS_VCARD_UPDATE: self.avatar_sha = x.getTagData('photo') self.contact_nickname = x.getTagData('nickname') elif namespace == nbxmpp.NS_DELAY and not self.timestamp: # XEP-0091 self._generate_timestamp(self.stanza.timestamp) elif namespace == 'http://delx.cjb.net/protocol/roster-subsync': # see http://trac.gajim.org/ticket/326 agent = app.get_server_from_jid(self.jid) if self.conn.connection.getRoster().getItem(agent): # to be sure it's a transport contact self.transport_auto_auth = True if not self.is_gc and self.id_ and self.id_.startswith('gajim_muc_') \ and self.ptype == 'error': # Error presences may not include sent stanza, so we don't detect # it's a muc presence. So detect it by ID h = hmac.new(self.conn.secret_hmac, self.jid.encode('utf-8'), hashlib.md5).hexdigest()[:6] if self.id_.split('_')[-1] == h: self.is_gc = True self.status = self.stanza.getStatus() or '' self._generate_show() self._generate_prio() self._generate_keyID(sig_tag) self.errcode = self.stanza.getErrorCode() self.errmsg = self.stanza.getErrorMsg() if self.is_gc: app.nec.push_incoming_event( GcPresenceReceivedEvent( None, conn=self.conn, stanza=self.stanza, presence_obj=self)) return if self.ptype == 'subscribe': app.nec.push_incoming_event(SubscribePresenceReceivedEvent(None, conn=self.conn, stanza=self.stanza, presence_obj=self)) elif self.ptype == 'subscribed': # BE CAREFUL: no con.updateRosterItem() in a callback app.nec.push_incoming_event(SubscribedPresenceReceivedEvent(None, conn=self.conn, stanza=self.stanza, presence_obj=self)) elif self.ptype == 'unsubscribe': log.debug(_('unsubscribe request from %s') % self.jid) elif self.ptype == 'unsubscribed': app.nec.push_incoming_event(UnsubscribedPresenceReceivedEvent( None, conn=self.conn, stanza=self.stanza, presence_obj=self)) elif self.ptype == 'error': return if not self.ptype or self.ptype == 'unavailable': our_jid = app.get_jid_from_account(self.conn.name) if self.jid == our_jid and self.resource == self.conn.server_resource: # We got our own presence app.nec.push_incoming_event(OurShowEvent(None, conn=self.conn, show=self.show)) elif self.jid in jid_list or self.jid == our_jid: return True class ZeroconfPresenceReceivedEvent(nec.NetworkIncomingEvent): name = 'presence-received' base_network_events = [] def generate(self): self.jid, self.resource = app.get_room_and_nick_from_fjid(self.fjid) self.resource = 'local' self.prio = 0 self.keyID = None self.timestamp = 0 self.contact_nickname = None self.avatar_sha = None self.need_add_in_roster = False self.need_redraw = False if self.show == 'offline': self.ptype = 'unavailable' else: self.ptype = None self.is_gc = False self.user_nick = '' self.transport_auto_auth = False self.errcode = None self.errmsg = '' self.popup = False # Do we want to open chat window ? return True class GcPresenceReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'gc-presence-received' base_network_events = [] def generate(self): self.ptype = self.presence_obj.ptype self.fjid = self.presence_obj.fjid self.jid = self.presence_obj.jid self.room_jid = self.presence_obj.jid self.nick = self.presence_obj.resource self.show = self.presence_obj.show self.status = self.presence_obj.status self.avatar_sha = self.presence_obj.avatar_sha self.errcode = self.presence_obj.errcode self.errmsg = self.presence_obj.errmsg self.errcon = self.stanza.getError() self.get_gc_control() self.gc_contact = app.contacts.get_gc_contact(self.conn.name, self.room_jid, self.nick) if self.ptype == 'error': return True if self.ptype and self.ptype != 'unavailable': return if app.config.get('log_contact_status_changes') and \ app.config.should_log(self.conn.name, self.room_jid): if self.gc_contact: jid = self.gc_contact.jid else: jid = self.stanza.getJid() st = self.status if jid: # we know real jid, save it in db st += ' (%s)' % jid show = app.logger.convert_show_values_to_db_api_values(self.show) if show is not None: fjid = nbxmpp.JID(self.fjid) app.logger.insert_into_logs(self.conn.name, fjid.getStripped(), time_time(), KindConstant.GCSTATUS, contact_name=fjid.getResource(), message=st, show=show) # NOTE: if it's a gc presence, don't ask vcard here. # We may ask it to real jid in gui part. self.status_code = [] ns_muc_user_x = self.stanza.getTag('x', namespace=nbxmpp.NS_MUC_USER) if ns_muc_user_x: destroy = ns_muc_user_x.getTag('destroy') else: destroy = None if ns_muc_user_x and destroy: # Room has been destroyed. see # http://www.xmpp.org/extensions/xep-0045.html#destroyroom self.reason = _('Room has been destroyed') r = destroy.getTagData('reason') if r: self.reason += ' (%s)' % r if destroy.getAttr('jid'): try: jid = helpers.parse_jid(destroy.getAttr('jid')) self.reason += '\n' + \ _('You can join this room instead: %s') % jid except helpers.InvalidFormat: pass self.status_code = ['destroyed'] else: self.reason = self.stanza.getReason() conditions = self.stanza.getStatusConditions() if conditions: self.status_code = [] for condition in conditions: if condition in CONDITION_TO_CODE: self.status_code.append(CONDITION_TO_CODE[condition]) else: self.status_code = self.stanza.getStatusCode() self.role = self.stanza.getRole() self.affiliation = self.stanza.getAffiliation() self.real_jid = self.stanza.getJid() self.actor = self.stanza.getActor() self.new_nick = self.stanza.getNewNick() return True class SubscribePresenceReceivedEvent(nec.NetworkIncomingEvent): name = 'subscribe-presence-received' base_network_events = [] def generate(self): self.jid = self.presence_obj.jid self.fjid = self.presence_obj.fjid self.status = self.presence_obj.status self.transport_auto_auth = self.presence_obj.transport_auto_auth self.user_nick = self.presence_obj.user_nick return True class SubscribedPresenceReceivedEvent(nec.NetworkIncomingEvent): name = 'subscribed-presence-received' base_network_events = [] def generate(self): self.jid = self.presence_obj.jid self.resource = self.presence_obj.resource return True class UnsubscribedPresenceReceivedEvent(nec.NetworkIncomingEvent): name = 'unsubscribed-presence-received' base_network_events = [] def generate(self): self.jid = self.presence_obj.jid return True class OurShowEvent(nec.NetworkIncomingEvent): name = 'our-show' base_network_events = [] class BeforeChangeShowEvent(nec.NetworkIncomingEvent): name = 'before-change-show' base_network_events = [] class MamMessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'mam-message-received' base_network_events = ['raw-mam-message-received'] def __init__(self, name, base_event): ''' Pre-Generated attributes on self: :conn: Connection instance :stanza: Complete stanza Node :forwarded: Forwarded Node :result: Result Node ''' self._set_base_event_vars_as_attributes(base_event) self.additional_data = {} self.encrypted = False self.groupchat = False self.nick = None self.self_message = None self.muc_pm = None def generate(self): account = self.conn.name archive_jid = self.stanza.getFrom() own_jid = self.conn.get_own_jid() if archive_jid and not archive_jid.bareMatch(own_jid): # MAM Message not from our Archive return False self.msg_ = self.forwarded.getTag('message', protocol=True) if self.msg_.getType() == 'groupchat': return False # use stanza-id as unique-id self.unique_id, origin_id = self.get_unique_id() self.message_id = self.msg_.getID() # Check for duplicates if app.logger.find_stanza_id(account, own_jid.getStripped(), self.unique_id, origin_id): return self.msgtxt = self.msg_.getTagData('body') frm = self.msg_.getFrom() # Some servers dont set the 'to' attribute when # we send a message to ourself to = self.msg_.getTo() if to is None: to = own_jid if frm.bareMatch(own_jid): self.with_ = to self.kind = KindConstant.CHAT_MSG_SENT else: self.with_ = frm self.kind = KindConstant.CHAT_MSG_RECV delay = self.forwarded.getTagAttr( 'delay', 'stamp', namespace=nbxmpp.NS_DELAY2) if delay is None: log.error('Received MAM message without timestamp') log.error(self.stanza) return self.timestamp = helpers.parse_datetime( delay, check_utc=True, epoch=True) if self.timestamp is None: log.error('Received MAM message with invalid timestamp: %s', delay) log.error(self.stanza) return # Save timestamp added by the user user_delay = self.msg_.getTagAttr( 'delay', 'stamp', namespace=nbxmpp.NS_DELAY2) if user_delay is not None: self.user_timestamp = helpers.parse_datetime( user_delay, check_utc=True, epoch=True) if self.user_timestamp is None: log.warning('Received MAM message with ' 'invalid user timestamp: %s', user_delay) log.warning(self.stanza) log.debug('Received mam-message: unique id: %s', self.unique_id) return True def get_unique_id(self): stanza_id = self.get_stanza_id(self.result, query=True) if self._is_self_message(self.msg_) or self._is_muc_pm(self.msg_): origin_id = self.msg_.getOriginID() return stanza_id, origin_id if self.conn.get_own_jid().bareMatch(self.msg_.getFrom()): # message we sent origin_id = self.msg_.getOriginID() return stanza_id, origin_id # A message we received return stanza_id, None class MamGcMessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'mam-gc-message-received' base_network_events = ['raw-mam-message-received'] def __init__(self, name, base_event): ''' Pre-Generated attributes on self: :conn: Connection instance :stanza: Complete stanza Node :forwarded: Forwarded Node :result: Result Node :muc_pm: True, if this is a MUC PM propagated to MamDecryptedMessageReceivedEvent ''' self._set_base_event_vars_as_attributes(base_event) self.additional_data = {} self.encrypted = False self.groupchat = True self.kind = KindConstant.GC_MSG def generate(self): account = self.conn.name self.msg_ = self.forwarded.getTag('message', protocol=True) if self.msg_.getType() != 'groupchat': return False try: self.room_jid = self.stanza.getFrom().getStripped() except AttributeError: log.warning('Received GC MAM message ' 'without from attribute\n%s', self.stanza) return False self.unique_id = self.get_stanza_id(self.result, query=True) self.message_id = self.msg_.getID() # Check for duplicates if app.logger.find_stanza_id(account, self.room_jid, self.unique_id, groupchat=True): return self.msgtxt = self.msg_.getTagData('body') self.with_ = self.msg_.getFrom().getStripped() self.nick = self.msg_.getFrom().getResource() # Get the real jid if we have it self.real_jid = None muc_user = self.msg_.getTag('x', namespace=nbxmpp.NS_MUC_USER) if muc_user is not None: self.real_jid = muc_user.getTagAttr('item', 'jid') delay = self.forwarded.getTagAttr( 'delay', 'stamp', namespace=nbxmpp.NS_DELAY2) if delay is None: log.error('Received MAM message without timestamp') log.error(self.stanza) return self.timestamp = helpers.parse_datetime( delay, check_utc=True, epoch=True) if self.timestamp is None: log.error('Received MAM message with invalid timestamp: %s', delay) log.error(self.stanza) return # Save timestamp added by the user user_delay = self.msg_.getTagAttr( 'delay', 'stamp', namespace=nbxmpp.NS_DELAY2) if user_delay is not None: self.user_timestamp = helpers.parse_datetime( user_delay, check_utc=True, epoch=True) if self.user_timestamp is None: log.warning('Received MAM message with ' 'invalid user timestamp: %s', user_delay) log.warning(self.stanza) log.debug('Received mam-gc-message: unique id: %s', self.unique_id) return True class MamDecryptedMessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'mam-decrypted-message-received' base_network_events = [] def generate(self): self.correct_id = None if not self.msgtxt: # For example Chatstates, Receipts, Chatmarkers log.debug('Received MAM message without text') return replace = self.msg_.getTag('replace', namespace=nbxmpp.NS_CORRECT) if replace is not None: self.correct_id = replace.getAttr('id') self.get_oob_data(self.msg_) if self.groupchat: return True if not self.muc_pm: # muc_pm = False, means only there was no muc#user namespace # This could still be a muc pm, we check the database if we # know this jid. If not we disco it. self.muc_pm = app.logger.jid_is_room_jid(self.with_.getStripped()) if self.muc_pm is None: # Check if this event is triggered after a disco, so we dont # run into an endless loop if hasattr(self, 'disco'): log.error('JID not known even after sucessful disco') log.error(self.with_.getStripped()) return # we don't know this JID, we need to disco it. server = self.with_.getDomain() if server not in self.conn.mam_awaiting_disco_result: self.conn.mam_awaiting_disco_result[server] = [self] self.conn.discoverInfo(server) else: self.conn.mam_awaiting_disco_result[server].append(self) return if self.muc_pm: self.with_ = str(self.with_) else: self.with_ = self.with_.getStripped() return True class MessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'message-received' base_network_events = ['raw-message-received'] def init(self): self.additional_data = {} def generate(self): self.conn = self.base_event.conn self.stanza = self.base_event.stanza self.get_id() self.forwarded = False self.sent = False self.encrypted = False self.self_message = None self.muc_pm = None account = self.conn.name if self.stanza.getFrom() == self.conn.get_own_jid(warn=True): # Drop messages sent from our own full jid # It can happen that when we sent message to our own bare jid # that the server routes that message back to us log.info('Received message from self: %s, message is dropped', self.stanza.getFrom()) return # check if the message is a roster item exchange (XEP-0144) if self.stanza.getTag('x', namespace=nbxmpp.NS_ROSTERX): app.nec.push_incoming_event(RosterItemExchangeEvent(None, conn=self.conn, stanza=self.stanza)) return # check if the message is a XEP-0070 confirmation request if self.stanza.getTag('confirm', namespace=nbxmpp.NS_HTTP_AUTH): app.nec.push_incoming_event(HttpAuthReceivedEvent(None, conn=self.conn, stanza=self.stanza)) return try: self.get_jid_resource() except helpers.InvalidFormat: log.warning('Invalid JID: %s, ignoring it', self.stanza.getFrom()) return # Check for duplicates self.unique_id = self.get_unique_id() # Check groupchat messages for duplicates, # We do this because of MUC History messages type_ = self.stanza.getType() if type_ == 'groupchat' or self.self_message or self.muc_pm: if type_ == 'groupchat': archive_jid = self.stanza.getFrom().getStripped() else: archive_jid = self.conn.get_own_jid().getStripped() if app.logger.find_stanza_id(account, archive_jid, self.unique_id, groupchat=type_ == 'groupchat'): return address_tag = self.stanza.getTag('addresses', namespace=nbxmpp.NS_ADDRESS) # Be sure it comes from one of our resource, else ignore address element if address_tag and self.jid == app.get_jid_from_account(account): address = address_tag.getTag('address', attrs={'type': 'ofrom'}) if address: try: self.fjid = helpers.parse_jid(address.getAttr('jid')) except helpers.InvalidFormat: log.warning('Invalid JID: %s, ignoring it', address.getAttr('jid')) return self.jid = app.get_jid_without_resource(self.fjid) carbon_marker = self.stanza.getTag('sent', namespace=nbxmpp.NS_CARBONS) if not carbon_marker: carbon_marker = self.stanza.getTag('received', namespace=nbxmpp.NS_CARBONS) # Be sure it comes from one of our resource, else ignore forward element if carbon_marker and self.jid == app.get_jid_from_account(account): forward_tag = carbon_marker.getTag('forwarded', namespace=nbxmpp.NS_FORWARD) if forward_tag: msg = forward_tag.getTag('message') self.stanza = nbxmpp.Message(node=msg) self.get_id() if carbon_marker.getName() == 'sent': to = self.stanza.getTo() frm = self.stanza.getFrom() if not frm: frm = app.get_jid_from_account(account) self.stanza.setTo(frm) if not to: to = app.get_jid_from_account(account) self.stanza.setFrom(to) self.sent = True elif carbon_marker.getName() == 'received': full_frm = str(self.stanza.getFrom()) frm = app.get_jid_without_resource(full_frm) if frm == app.get_jid_from_account(account): # Drop 'received' Carbons from ourself, we already # got the message with the 'sent' Carbon or via the # message itself log.info( 'Drop "received"-Carbon from ourself: %s' % full_frm) return try: self.get_jid_resource() except helpers.InvalidFormat: log.warning('Invalid JID: %s, ignoring it', self.stanza.getFrom()) return self.forwarded = True result = self.stanza.getTag('result', protocol=True) if result and result.getNamespace() in (nbxmpp.NS_MAM_1, nbxmpp.NS_MAM_2): if result.getAttr('queryid') not in self.conn.mam_query_ids: log.warning('Invalid MAM Message: unknown query id') log.debug(self.stanza) return forwarded = result.getTag('forwarded', namespace=nbxmpp.NS_FORWARD, protocol=True) if not forwarded: log.warning('Invalid MAM Message: no forwarded child') return app.nec.push_incoming_event( NetworkEvent('raw-mam-message-received', conn=self.conn, stanza=self.stanza, forwarded=forwarded, result=result)) return # Mediated invitation? muc_user = self.stanza.getTag('x', namespace=nbxmpp.NS_MUC_USER) if muc_user: if muc_user.getTag('decline'): app.nec.push_incoming_event( GcDeclineReceivedEvent( None, conn=self.conn, room_jid=self.fjid, stanza=muc_user)) return if muc_user.getTag('invite'): app.nec.push_incoming_event( GcInvitationReceivedEvent( None, conn=self.conn, jid_from=self.fjid, mediated=True, stanza=muc_user)) return else: # Direct invitation? direct = self.stanza.getTag( 'x', namespace=nbxmpp.NS_CONFERENCE) if direct: app.nec.push_incoming_event( GcInvitationReceivedEvent( None, conn=self.conn, jid_from=self.fjid, mediated=False, stanza=direct)) return self.thread_id = self.stanza.getThread() self.mtype = self.stanza.getType() if not self.mtype or self.mtype not in ('chat', 'groupchat', 'error'): self.mtype = 'normal' self.msgtxt = self.stanza.getBody() self.get_gc_control() if self.gc_control and self.jid == self.fjid: if self.mtype == 'error': self.msgtxt = _('error while sending %(message)s ( %(error)s )'\ ) % {'message': self.msgtxt, 'error': self.stanza.getErrorMsg()} if self.stanza.getTag('html'): self.stanza.delChild('html') # message from a gc without a resource self.mtype = 'groupchat' self.session = None if self.mtype != 'groupchat': if app.interface.is_pm_contact(self.fjid, account) and \ self.mtype == 'error': self.session = self.conn.find_session(self.fjid, self.thread_id) if not self.session: self.session = self.conn.get_latest_session(self.fjid) if not self.session: self.session = self.conn.make_new_session(self.fjid, self.thread_id, type_='pm') else: self.session = self.conn.get_or_create_session(self.fjid, self.thread_id) if self.thread_id and not self.session.received_thread_id: self.session.received_thread_id = True self.session.last_receive = time_time() self._generate_timestamp(self.stanza.timestamp) return True def get_unique_id(self): ''' Messages to self: Messages to self are stored multiple times in MAM so we cant use stanza-id to deduplicate. We use origin-id instead. Its not perfect but there is no better way for now. We drop "received"-Carbons of Message to self, so we dont have to parse origin-id in that case. MUC PMs: MUC PMs are also stored multiple times, we also depend on origin-id for now. ''' if self.stanza.getType() == 'groupchat': # TODO: Disco the MUC check if 'urn:xmpp:mam:2' is announced return self.get_stanza_id(self.stanza) elif self.stanza.getType() != 'chat': return # Messages we receive live if self.conn.archiving_namespace != nbxmpp.NS_MAM_2: # Only mam:2 ensures valid stanza-id return # Sent Carbon sent_carbon = self.stanza.getTag('sent', namespace=nbxmpp.NS_CARBONS, protocol=True) if sent_carbon is not None: message = self.get_forwarded_message(sent_carbon) if self._is_self_message(message) or self._is_muc_pm(message): return message.getOriginID() return self.get_stanza_id(message) # Received Carbon received_carbon = self.stanza.getTag('received', namespace=nbxmpp.NS_CARBONS, protocol=True) if received_carbon is not None: message = self.get_forwarded_message(received_carbon) if self._is_muc_pm(message): return message.getOriginID() return self.get_stanza_id(message) # Normal Message if self._is_self_message(self.stanza) or self._is_muc_pm(self.stanza): return self.stanza.getOriginID() return self.get_stanza_id(self.stanza) class ZeroconfMessageReceivedEvent(MessageReceivedEvent): name = 'message-received' base_network_events = [] def get_jid_resource(self): self.fjid =self.stanza.getFrom() if self.fjid is None: for key in self.conn.connection.zeroconf.contacts: if self.ip == self.conn.connection.zeroconf.contacts[key][ Constant.ADDRESS]: self.fjid = key break self.jid, self.resource = app.get_room_and_nick_from_fjid(self.fjid) def generate(self): self.base_event = nec.NetworkIncomingEvent(None, conn=self.conn, stanza=self.stanza) return super(ZeroconfMessageReceivedEvent, self).generate() class GcInvitationReceivedEvent(nec.NetworkIncomingEvent): name = 'gc-invitation-received' base_network_events = [] def generate(self): account = self.conn.name if not self.mediated: # direct invitation try: self.room_jid = helpers.parse_jid(self.stanza.getAttr('jid')) except helpers.InvalidFormat: log.warning('Invalid JID: %s, ignoring it', self.stanza.getAttr('jid')) return self.reason = self.stanza.getAttr('reason') self.password = self.stanza.getAttr('password') self.is_continued = False self.is_continued = self.stanza.getAttr('continue') == 'true' else: self.invite = self.stanza.getTag('invite') self.room_jid = self.jid_from try: self.jid_from = helpers.parse_jid(self.invite.getAttr('from')) except helpers.InvalidFormat: log.warning('Invalid JID: %s, ignoring it', self.invite.getAttr('from')) return self.reason = self.invite.getTagData('reason') self.password = self.stanza.getTagData('password') self.is_continued = self.stanza.getTag('continue') is not None if self.room_jid in app.gc_connected[account] and \ app.gc_connected[account][self.room_jid]: # We are already in groupchat. Ignore invitation return jid = app.get_jid_without_resource(self.jid_from) ignore = app.config.get_per( 'accounts', account, 'ignore_unknown_contacts') if ignore and not app.contacts.get_contacts(account, jid): return return True class GcDeclineReceivedEvent(nec.NetworkIncomingEvent): name = 'gc-decline-received' base_network_events = [] def generate(self): account = self.conn.name decline = self.stanza.getTag('decline') try: self.jid_from = helpers.parse_jid(decline.getAttr('from')) except helpers.InvalidFormat: log.warning('Invalid JID: %s, ignoring it', decline.getAttr('from')) return jid = app.get_jid_without_resource(self.jid_from) ignore = app.config.get_per( 'accounts', account, 'ignore_unknown_contacts') if ignore and not app.contacts.get_contacts(account, jid): return self.reason = decline.getTagData('reason') return True class DecryptedMessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'decrypted-message-received' base_network_events = [] def generate(self): self.stanza = self.msg_obj.stanza self.additional_data = self.msg_obj.additional_data self.id_ = self.msg_obj.id_ self.unique_id = self.msg_obj.unique_id self.jid = self.msg_obj.jid self.fjid = self.msg_obj.fjid self.resource = self.msg_obj.resource self.mtype = self.msg_obj.mtype self.thread_id = self.msg_obj.thread_id self.msgtxt = self.msg_obj.msgtxt self.gc_control = self.msg_obj.gc_control self.session = self.msg_obj.session self.timestamp = self.msg_obj.timestamp self.encrypted = self.msg_obj.encrypted self.forwarded = self.msg_obj.forwarded self.sent = self.msg_obj.sent self.conn = self.msg_obj.conn self.muc_pm = self.msg_obj.muc_pm self.popup = False self.msg_log_id = None # id in log database self.attention = False # XEP-0224 self.correct_id = None # XEP-0308 self.msghash = None self.receipt_request_tag = self.stanza.getTag('request', namespace=nbxmpp.NS_RECEIPTS) self.receipt_received_tag = self.stanza.getTag('received', namespace=nbxmpp.NS_RECEIPTS) self.subject = self.stanza.getSubject() self.displaymarking = None self.seclabel = self.stanza.getTag('securitylabel', namespace=nbxmpp.NS_SECLABEL) if self.seclabel: self.displaymarking = self.seclabel.getTag('displaymarking') if self.stanza.getTag('attention', namespace=nbxmpp.NS_ATTENTION): delayed = self.stanza.getTag('x', namespace=nbxmpp.NS_DELAY) is not\ None if not delayed: self.attention = True self.form_node = self.stanza.getTag('x', namespace=nbxmpp.NS_DATA) if app.config.get('ignore_incoming_xhtml'): self.xhtml = None else: self.xhtml = self.stanza.getXHTML() # XEP-0172 User Nickname self.user_nick = self.stanza.getTagData('nick') or '' self.get_chatstate() self.get_oob_data(self.stanza) replace = self.stanza.getTag('replace', namespace=nbxmpp.NS_CORRECT) if replace: self.correct_id = replace.getAttr('id') return True class ChatstateReceivedEvent(nec.NetworkIncomingEvent): name = 'chatstate-received' base_network_events = [] def generate(self): self.stanza = self.msg_obj.stanza self.jid = self.msg_obj.jid self.fjid = self.msg_obj.fjid self.resource = self.msg_obj.resource self.chatstate = self.msg_obj.chatstate return True class GcMessageReceivedEvent(nec.NetworkIncomingEvent): name = 'gc-message-received' base_network_events = [] def generate(self): self.stanza = self.msg_obj.stanza if not hasattr(self.msg_obj, 'additional_data'): self.additional_data = {} else: self.additional_data = self.msg_obj.additional_data self.id_ = self.msg_obj.stanza.getID() self.unique_id = self.msg_obj.unique_id self.fjid = self.msg_obj.fjid self.msgtxt = self.msg_obj.msgtxt self.jid = self.msg_obj.jid self.room_jid = self.msg_obj.jid self.nickname = self.msg_obj.resource self.timestamp = self.msg_obj.timestamp self.xhtml_msgtxt = self.stanza.getXHTML() self.encrypted = self.msg_obj.encrypted self.correct_id = None # XEP-0308 if app.config.get('ignore_incoming_xhtml'): self.xhtml_msgtxt = None if self.msg_obj.resource: # message from someone self.nick = self.msg_obj.resource else: # message from server self.nick = '' self.has_timestamp = bool(self.stanza.timestamp) self.subject = self.stanza.getSubject() if self.subject is not None: app.nec.push_incoming_event(GcSubjectReceivedEvent(None, conn=self.conn, msg_event=self)) return conditions = self.stanza.getStatusConditions() if conditions: self.status_code = [] for condition in conditions: if condition in CONDITION_TO_CODE: self.status_code.append(CONDITION_TO_CODE[condition]) else: self.status_code = self.stanza.getStatusCode() if not self.stanza.getTag('body'): # no # It could be a config change. See # http://www.xmpp.org/extensions/xep-0045.html#roomconfig-notify if self.stanza.getTag('x'): if self.status_code != []: app.nec.push_incoming_event(GcConfigChangedReceivedEvent( None, conn=self.conn, msg_event=self)) if self.msg_obj.form_node: return True return self.displaymarking = None seclabel = self.stanza.getTag('securitylabel') if seclabel and seclabel.getNamespace() == nbxmpp.NS_SECLABEL: # Ignore message from room in which we are not self.displaymarking = seclabel.getTag('displaymarking') self.captcha_form = None captcha_tag = self.stanza.getTag('captcha', namespace=nbxmpp.NS_CAPTCHA) if captcha_tag: self.captcha_form = captcha_tag.getTag('x', namespace=nbxmpp.NS_DATA) for field in self.captcha_form.getTags('field'): for media in field.getTags('media'): for uri in media.getTags('uri'): uri_data = uri.getData() if uri_data.startswith('cid:'): uri_data = uri_data[4:] found = False for data in self.stanza.getTags('data', namespace=nbxmpp.NS_BOB): if data.getAttr('cid') == uri_data: uri.setData(data.getData()) found = True if not found: self.conn.get_bob_data(uri_data, self.fjid, self.conn._dispatch_gc_msg_with_captcha, [self.stanza, self.msg_obj], 0) return replace = self.stanza.getTag('replace', namespace=nbxmpp.NS_CORRECT) if replace: self.correct_id = replace.getAttr('id') return True class GcSubjectReceivedEvent(nec.NetworkIncomingEvent): name = 'gc-subject-received' base_network_events = [] def generate(self): self.conn = self.msg_event.conn self.stanza = self.msg_event.stanza self.room_jid = self.msg_event.room_jid self.nickname = self.msg_event.nickname self.fjid = self.msg_event.fjid self.subject = self.msg_event.subject self.msgtxt = self.msg_event.msgtxt self.has_timestamp = self.msg_event.has_timestamp return True class GcConfigChangedReceivedEvent(nec.NetworkIncomingEvent): name = 'gc-config-changed-received' base_network_events = [] def generate(self): self.conn = self.msg_event.conn self.stanza = self.msg_event.stanza self.room_jid = self.msg_event.room_jid self.status_code = self.msg_event.status_code return True class MessageSentEvent(nec.NetworkIncomingEvent): name = 'message-sent' base_network_events = [] def generate(self): if not self.automatic_message: self.conn.sent_message_ids.append(self.stanza_id) # only record the last 20000 message ids (should be about 1MB [36 byte per uuid] # and about 24 hours if you send out a message every 5 seconds) self.conn.sent_message_ids = self.conn.sent_message_ids[-20000:] return True class MessageNotSentEvent(nec.NetworkIncomingEvent): name = 'message-not-sent' base_network_events = [] class MessageErrorEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'message-error' base_network_events = [] def generate(self): self.get_id() #only alert for errors of explicitly sent messages (see https://trac.gajim.org/ticket/8222) if self.id_ in self.conn.sent_message_ids: self.conn.sent_message_ids.remove(self.id_) return True return False class AnonymousAuthEvent(nec.NetworkIncomingEvent): name = 'anonymous-auth' base_network_events = [] class JingleRequestReceivedEvent(nec.NetworkIncomingEvent): name = 'jingle-request-received' base_network_events = [] def generate(self): self.fjid = self.jingle_session.peerjid self.jid, self.resource = app.get_room_and_nick_from_fjid(self.fjid) self.sid = self.jingle_session.sid return True class JingleConnectedReceivedEvent(nec.NetworkIncomingEvent): name = 'jingle-connected-received' base_network_events = [] def generate(self): self.fjid = self.jingle_session.peerjid self.jid, self.resource = app.get_room_and_nick_from_fjid(self.fjid) self.sid = self.jingle_session.sid return True class JingleDisconnectedReceivedEvent(nec.NetworkIncomingEvent): name = 'jingle-disconnected-received' base_network_events = [] def generate(self): self.fjid = self.jingle_session.peerjid self.jid, self.resource = app.get_room_and_nick_from_fjid(self.fjid) self.sid = self.jingle_session.sid return True class JingleTransferCancelledEvent(nec.NetworkIncomingEvent): name = 'jingleFT-cancelled-received' base_network_events = [] def generate(self): self.fjid = self.jingle_session.peerjid self.jid, self.resource = app.get_room_and_nick_from_fjid(self.fjid) self.sid = self.jingle_session.sid return True class JingleErrorReceivedEvent(nec.NetworkIncomingEvent): name = 'jingle-error-received' base_network_events = [] def generate(self): self.fjid = self.jingle_session.peerjid self.jid, self.resource = app.get_room_and_nick_from_fjid(self.fjid) self.sid = self.jingle_session.sid return True class ArchivingReceivedEvent(nec.NetworkIncomingEvent): name = 'archiving-received' base_network_events = [] def generate(self): self.type_ = self.stanza.getType() if self.type_ not in ('result', 'set', 'error'): return return True class ArchivingErrorReceivedEvent(nec.NetworkIncomingEvent): name = 'archiving-error-received' base_network_events = ['archiving-received'] def generate(self): self.conn = self.base_event.conn self.stanza = self.base_event.stanza self.type_ = self.base_event.type_ if self.type_ == 'error': self.error_msg = self.stanza.getErrorMsg() return True class ArchivingCountReceived(nec.NetworkIncomingEvent): name = 'archiving-count-received' base_network_events = [] def generate(self): return True class ArchivingIntervalFinished(nec.NetworkIncomingEvent): name = 'archiving-interval-finished' base_network_events = [] def generate(self): return True class ArchivingQueryID(nec.NetworkIncomingEvent): name = 'archiving-query-id' base_network_events = [] def generate(self): return True class Archiving313PreferencesChangedReceivedEvent(nec.NetworkIncomingEvent): name = 'archiving-313-preferences-changed-received' base_network_events = ['archiving-received'] def generate(self): self.conn = self.base_event.conn self.stanza = self.base_event.stanza self.type_ = self.base_event.type_ self.items = [] self.default = None self.id = self.stanza.getID() self.answer = None prefs = self.stanza.getTag('prefs') if self.type_ != 'result' or not prefs: return self.default = prefs.getAttr('default') for item in prefs.getTag('always').getTags('jid'): self.items.append((item.getData(), 'Always')) for item in prefs.getTag('never').getTags('jid'): self.items.append((item.getData(), 'Never')) return True class AccountCreatedEvent(nec.NetworkIncomingEvent): name = 'account-created' base_network_events = [] class AccountNotCreatedEvent(nec.NetworkIncomingEvent): name = 'account-not-created' base_network_events = [] class NewAccountConnectedEvent(nec.NetworkIncomingEvent): name = 'new-account-connected' base_network_events = [] def generate(self): try: self.errnum = self.conn.connection.Connection.ssl_errnum except AttributeError: self.errnum = 0 # we don't have an errnum self.ssl_msg = '' if self.errnum > 0: from gajim.common.connection import ssl_error self.ssl_msg = ssl_error.get(self.errnum, _('Unknown SSL error: %d') % self.errnum) self.ssl_cert = '' self.ssl_fingerprint_sha1 = '' self.ssl_fingerprint_sha256 = '' if self.conn.connection.Connection.ssl_certificate: cert = self.conn.connection.Connection.ssl_certificate self.ssl_cert = OpenSSL.crypto.dump_certificate( OpenSSL.crypto.FILETYPE_PEM, cert).decode('utf-8') self.ssl_fingerprint_sha1 = cert.digest('sha1').decode('utf-8') self.ssl_fingerprint_sha256 = cert.digest('sha256').decode('utf-8') return True class NewAccountNotConnectedEvent(nec.NetworkIncomingEvent): name = 'new-account-not-connected' base_network_events = [] class ConnectionTypeEvent(nec.NetworkIncomingEvent): name = 'connection-type' base_network_events = [] class VcardPublishedEvent(nec.NetworkIncomingEvent): name = 'vcard-published' base_network_events = [] class VcardNotPublishedEvent(nec.NetworkIncomingEvent): name = 'vcard-not-published' base_network_events = [] class StanzaReceivedEvent(nec.NetworkIncomingEvent): name = 'stanza-received' base_network_events = [] def init(self): self.additional_data = {} def generate(self): return True class StanzaSentEvent(nec.NetworkIncomingEvent): name = 'stanza-sent' base_network_events = [] def init(self): self.additional_data = {} class AgentRemovedEvent(nec.NetworkIncomingEvent): name = 'agent-removed' base_network_events = [] def generate(self): self.jid_list = [] for jid in app.contacts.get_jid_list(self.conn.name): if jid.endswith('@' + self.agent): self.jid_list.append(jid) return True class BadGPGPassphraseEvent(nec.NetworkIncomingEvent): name = 'bad-gpg-passphrase' base_network_events = [] def generate(self): self.account = self.conn.name self.use_gpg_agent = app.config.get('use_gpg_agent') self.keyID = app.config.get_per('accounts', self.conn.name, 'keyid') return True class ConnectionLostEvent(nec.NetworkIncomingEvent): name = 'connection-lost' base_network_events = [] def generate(self): app.nec.push_incoming_event(OurShowEvent(None, conn=self.conn, show='offline')) return True class PingSentEvent(nec.NetworkIncomingEvent): name = 'ping-sent' base_network_events = [] class PingReplyEvent(nec.NetworkIncomingEvent): name = 'ping-reply' base_network_events = [] class PingErrorEvent(nec.NetworkIncomingEvent): name = 'ping-error' base_network_events = [] class CapsPresenceReceivedEvent(nec.NetworkIncomingEvent, HelperEvent, PresenceHelperEvent): name = 'caps-presence-received' base_network_events = ['raw-pres-received'] def _extract_caps_from_presence(self): caps_tag = self.stanza.getTag('c', namespace=nbxmpp.NS_CAPS) if caps_tag: self.hash_method = caps_tag['hash'] self.node = caps_tag['node'] self.caps_hash = caps_tag['ver'] else: self.hash_method = self.node = self.caps_hash = None def generate(self): self.conn = self.base_event.conn self.stanza = self.base_event.stanza try: self.get_jid_resource() except Exception: return self._generate_ptype() self._generate_show() self._extract_caps_from_presence() return True class CapsDiscoReceivedEvent(nec.NetworkIncomingEvent): name = 'caps-disco-received' base_network_events = [] class CapsReceivedEvent(nec.NetworkIncomingEvent): name = 'caps-received' base_network_events = ['caps-presence-received', 'caps-disco-received'] def generate(self): self.conn = self.base_event.conn self.fjid = self.base_event.fjid self.jid = self.base_event.jid self.resource = self.base_event.resource self.client_caps = self.base_event.client_caps return True class GPGTrustKeyEvent(nec.NetworkIncomingEvent): name = 'gpg-trust-key' base_network_events = [] class GPGPasswordRequiredEvent(nec.NetworkIncomingEvent): name = 'gpg-password-required' base_network_events = [] def generate(self): self.keyid = app.config.get_per('accounts', self.conn.name, 'keyid') return True class PEPReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'pep-received' base_network_events = [] def generate(self): if not self.stanza.getTag('event'): return if self.stanza.getTag('error'): log.debug('PEPReceivedEvent received error stanza. Ignoring') return try: self.get_jid_resource() except Exception: return self.event_tag = self.stanza.getTag('event') for pep_class in SUPPORTED_PERSONAL_USER_EVENTS: pep = pep_class.get_tag_as_PEP(self.fjid, self.conn.name, self.event_tag) if pep: self.pep_type = pep.type_ return True items = self.event_tag.getTag('items') if items: # for each entry in feed (there shouldn't be more than one, but to # be sure... for item in items.getTags('item'): entry = item.getTag('entry', namespace=nbxmpp.NS_ATOM) if entry: app.nec.push_incoming_event(AtomEntryReceived(None, conn=self.conn, node=entry)) raise nbxmpp.NodeProcessed class AtomEntryReceived(nec.NetworkIncomingEvent): name = 'atom-entry-received' base_network_events = [] def generate(self): self.atom_entry = atom.OldEntry(node=self.node) return True class PlainConnectionEvent(nec.NetworkIncomingEvent): name = 'plain-connection' base_network_events = [] class InsecurePasswordEvent(nec.NetworkIncomingEvent): name = 'insecure-password' base_network_events = [] class InsecureSSLConnectionEvent(nec.NetworkIncomingEvent): name = 'insecure-ssl-connection' base_network_events = [] class SSLErrorEvent(nec.NetworkIncomingEvent): name = 'ssl-error' base_network_events = [] class FingerprintErrorEvent(nec.NetworkIncomingEvent): name = 'fingerprint-error' base_network_events = [] class UniqueRoomIdSupportedEvent(nec.NetworkIncomingEvent): name = 'unique-room-id-supported' base_network_events = [] class UniqueRoomIdNotSupportedEvent(nec.NetworkIncomingEvent): name = 'unique-room-id-not-supported' base_network_events = [] class PrivacyListsReceivedEvent(nec.NetworkIncomingEvent): name = 'privacy-lists-received' base_network_events = [] class PrivacyListReceivedEvent(nec.NetworkIncomingEvent): name = 'privacy-list-received' base_network_events = [] class PrivacyListRemovedEvent(nec.NetworkIncomingEvent): name = 'privacy-list-removed' base_network_events = [] class PrivacyListActiveDefaultEvent(nec.NetworkIncomingEvent): name = 'privacy-list-active-default' base_network_events = [] class NonAnonymousServerErrorEvent(nec.NetworkIncomingEvent): name = 'non-anonymous-server-error' base_network_events = [] class VcardReceivedEvent(nec.NetworkIncomingEvent): name = 'vcard-received' base_network_events = [] def generate(self): return True class UpdateGCAvatarEvent(nec.NetworkIncomingEvent): name = 'update-gc-avatar' base_network_events = [] def generate(self): return True class UpdateRosterAvatarEvent(nec.NetworkIncomingEvent): name = 'update-roster-avatar' base_network_events = [] def generate(self): return True class PEPConfigReceivedEvent(nec.NetworkIncomingEvent): name = 'pep-config-received' base_network_events = [] class MetacontactsReceivedEvent(nec.NetworkIncomingEvent): name = 'metacontacts-received' base_network_events = [] def generate(self): # Metacontact tags # http://www.xmpp.org/extensions/xep-0209.html self.meta_list = {} query = self.stanza.getTag('query') storage = query.getTag('storage') metas = storage.getTags('meta') for meta in metas: try: jid = helpers.parse_jid(meta.getAttr('jid')) except helpers.InvalidFormat: continue tag = meta.getAttr('tag') data = {'jid': jid} order = meta.getAttr('order') try: order = int(order) except Exception: order = 0 if order is not None: data['order'] = order if tag in self.meta_list: self.meta_list[tag].append(data) else: self.meta_list[tag] = [data] return True class ZeroconfNameConflictEvent(nec.NetworkIncomingEvent): name = 'zeroconf-name-conflict' base_network_events = [] class PasswordRequiredEvent(nec.NetworkIncomingEvent): name = 'password-required' base_network_events = [] class Oauth2CredentialsRequiredEvent(nec.NetworkIncomingEvent): name = 'oauth2-credentials-required' base_network_events = [] class FailedDecryptEvent(nec.NetworkIncomingEvent): name = 'failed-decrypt' base_network_events = [] def generate(self): self.conn = self.msg_obj.conn self.fjid = self.msg_obj.fjid self.timestamp = self.msg_obj.timestamp self.session = self.msg_obj.session return True class SignedInEvent(nec.NetworkIncomingEvent): name = 'signed-in' base_network_events = [] class RegisterAgentInfoReceivedEvent(nec.NetworkIncomingEvent): name = 'register-agent-info-received' base_network_events = [] class AgentItemsReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'agent-items-received' base_network_events = [] def generate(self): q = self.stanza.getTag('query') self.node = q.getAttr('node') if not self.node: self.node = '' qp = self.stanza.getQueryPayload() self.items = [] if not qp: qp = [] for i in qp: # CDATA payload is not processed, only nodes if not isinstance(i, nbxmpp.simplexml.Node): continue attr = {} for key in i.getAttrs(): attr[key] = i.getAttrs()[key] if 'jid' not in attr: continue try: attr['jid'] = helpers.parse_jid(attr['jid']) except helpers.InvalidFormat: # jid is not conform continue self.items.append(attr) self.get_jid_resource() hostname = app.config.get_per('accounts', self.conn.name, 'hostname') self.get_id() if self.id_ in self.conn.disco_items_ids: self.conn.disco_items_ids.remove(self.id_) if self.fjid == hostname and self.id_[:6] == 'Gajim_': for item in self.items: self.conn.discoverInfo(item['jid'], id_prefix='Gajim_') else: return True class AgentItemsErrorReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'agent-items-error-received' base_network_events = [] def generate(self): self.get_jid_resource() self.get_id() if self.id_ in self.conn.disco_items_ids: self.conn.disco_items_ids.remove(self.id_) return True class AgentInfoReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'agent-info-received' base_network_events = [] def generate(self): self.get_id() if self.id_ in self.conn.disco_info_ids: self.conn.disco_info_ids.remove(self.id_) if self.id_ is None: log.warning('Invalid IQ received without an ID. ' 'Ignoring it: %s', self.stanza) return # According to XEP-0030: # For identity: category, type is mandatory, name is optional. # For feature: var is mandatory self.identities, self.features, self.data, self.node = self.parse_stanza(self.stanza) if not self.identities: # ejabberd doesn't send identities when we browse online users # see http://www.jabber.ru/bugzilla/show_bug.cgi?id=225 self.identities = [{'category': 'server', 'type': 'im', 'name': self.node}] self.get_jid_resource() return True @classmethod def parse_stanza(cls, stanza): identities, features, data, node = [], [], [], None q = stanza.getTag('query') node = q.getAttr('node') if not node: node = '' qc = stanza.getQueryChildren() if not qc: qc = [] for i in qc: if i.getName() == 'identity': attr = {} for key in i.getAttrs().keys(): attr[key] = i.getAttr(key) identities.append(attr) elif i.getName() == 'feature': var = i.getAttr('var') if var: features.append(var) elif i.getName() == 'x' and i.getNamespace() == nbxmpp.NS_DATA: data.append(nbxmpp.DataForm(node=i)) return identities, features, data, node class AgentInfoErrorReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'agent-info-error-received' base_network_events = [] def generate(self): self.get_jid_resource() self.get_id() if self.id_ in self.conn.disco_info_ids: self.conn.disco_info_ids.remove(self.id_) return True class FileRequestReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'file-request-received' base_network_events = [] def init(self): self.jingle_content = None self.FT_content = None def generate(self): self.get_id() self.fjid = self.conn._ft_get_from(self.stanza) self.jid = app.get_jid_without_resource(self.fjid) if self.jingle_content: secu = self.jingle_content.getTag('security') self.FT_content.use_security = bool(secu) if secu: fingerprint = secu.getTag('fingerprint') if fingerprint: self.FT_content.x509_fingerprint = fingerprint.getData() if not self.FT_content.transport: self.FT_content.transport = JingleTransportSocks5() self.FT_content.transport.set_our_jid( self.FT_content.session.ourjid) self.FT_content.transport.set_connection( self.FT_content.session.connection) sid = self.stanza.getTag('jingle').getAttr('sid') self.file_props = FilesProp.getNewFileProp(self.conn.name, sid) self.file_props.transport_sid = self.FT_content.transport.sid self.FT_content.file_props = self.file_props self.FT_content.transport.set_file_props(self.file_props) self.file_props.streamhosts.extend( self.FT_content.transport.remote_candidates) for host in self.file_props.streamhosts: host['initiator'] = self.FT_content.session.initiator host['target'] = self.FT_content.session.responder self.file_props.session_type = 'jingle' self.file_props.stream_methods = nbxmpp.NS_BYTESTREAM desc = self.jingle_content.getTag('description') if self.jingle_content.getAttr('creator') == 'initiator': file_tag = desc.getTag('file') self.file_props.sender = self.fjid self.file_props.receiver = self.conn._ft_get_our_jid() else: file_tag = desc.getTag('file') h = file_tag.getTag('hash') h = h.getData() if h else None n = file_tag.getTag('name') n = n.getData() if n else None pjid = app.get_jid_without_resource(self.fjid) file_info = self.conn.get_file_info(pjid, hash_=h, name=n,account=self.conn.name) self.file_props.file_name = file_info['file-name'] self.file_props.sender = self.conn._ft_get_our_jid() self.file_props.receiver = self.fjid self.file_props.type_ = 's' for child in file_tag.getChildren(): name = child.getName() val = child.getData() if val is None: continue if name == 'name': self.file_props.name = val if name == 'size': self.file_props.size = int(val) if name == 'hash': self.file_props.algo = child.getAttr('algo') self.file_props.hash_ = val if name == 'date': self.file_props.date = val else: si = self.stanza.getTag('si') self.file_props = FilesProp.getNewFileProp(self.conn.name, si.getAttr('id')) self.file_props.transport_sid = self.file_props.sid profile = si.getAttr('profile') if profile != nbxmpp.NS_FILE: self.conn.send_file_rejection(self.file_props, code='400', typ='profile') raise nbxmpp.NodeProcessed feature_tag = si.getTag('feature', namespace=nbxmpp.NS_FEATURE) if not feature_tag: return form_tag = feature_tag.getTag('x', namespace=nbxmpp.NS_DATA) if not form_tag: return self.dataform = dataforms.ExtendForm(node=form_tag) for f in self.dataform.iter_fields(): if f.var == 'stream-method' and f.type_ == 'list-single': values = [o[1] for o in f.options] self.file_props.stream_methods = ' '.join(values) if nbxmpp.NS_BYTESTREAM in values or \ nbxmpp.NS_IBB in values: break else: self.conn.send_file_rejection(self.file_props, code='400', typ='stream') raise nbxmpp.NodeProcessed file_tag = si.getTag('file') for name, val in file_tag.getAttrs().items(): if val is None: continue if name == 'name': self.file_props.name = val if name == 'size': self.file_props.size = int(val) mime_type = si.getAttr('mime-type') if mime_type is not None: self.file_props.mime_type = mime_type self.file_props.sender = self.fjid self.file_props.receiver = self.conn._ft_get_our_jid() self.file_props.request_id = self.id_ file_desc_tag = file_tag.getTag('desc') if file_desc_tag is not None: self.file_props.desc = file_desc_tag.getData() self.file_props.transfered_size = [] return True class FileRequestErrorEvent(nec.NetworkIncomingEvent): name = 'file-request-error' base_network_events = [] def generate(self): self.jid = app.get_jid_without_resource(self.jid) return True class FileTransferCompletedEvent(nec.NetworkIncomingEvent): name = 'file-transfer-completed' base_network_events = [] def generate(self): jid = str(self.file_props.receiver) self.jid = app.get_jid_without_resource(jid) return True class GatewayPromptReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): name = 'gateway-prompt-received' base_network_events = [] def generate(self): self.get_jid_resource() query = self.stanza.getTag('query') if query: self.desc = query.getTagData('desc') self.prompt = query.getTagData('prompt') self.prompt_jid = query.getTagData('jid') else: self.desc = None self.prompt = None self.prompt_jid = None return True class NotificationEvent(nec.NetworkIncomingEvent): name = 'notification' base_network_events = ['decrypted-message-received', 'gc-message-received', 'presence-received'] def detect_type(self): if self.base_event.name == 'decrypted-message-received': self.notif_type = 'msg' if self.base_event.name == 'gc-message-received': self.notif_type = 'gc-msg' if self.base_event.name == 'presence-received': self.notif_type = 'pres' def get_focused(self): self.control_focused = False if self.control: parent_win = self.control.parent_win if parent_win and self.control == parent_win.get_active_control() \ and parent_win.window.get_property('has-toplevel-focus'): self.control_focused = True def handle_incoming_msg_event(self, msg_obj): # don't alert for carbon copied messages from ourselves if msg_obj.sent: return if not msg_obj.msgtxt: return self.jid = msg_obj.jid if msg_obj.session: self.control = msg_obj.session.control else: self.control = None self.get_focused() # This event has already been added to event list if not self.control and len(app.events.get_events(self.conn.name, \ self.jid, [msg_obj.mtype])) <= 1: self.first_unread = True if msg_obj.mtype == 'pm': nick = msg_obj.resource else: nick = app.get_name_from_jid(self.conn.name, self.jid) if self.first_unread: self.sound_event = 'first_message_received' elif self.control_focused: self.sound_event = 'next_message_received_focused' else: self.sound_event = 'next_message_received_unfocused' if app.config.get('notification_preview_message'): self.popup_text = msg_obj.msgtxt if self.popup_text and (self.popup_text.startswith('/me ') or \ self.popup_text.startswith('/me\n')): self.popup_text = '* ' + nick + self.popup_text[3:] else: # We don't want message preview, do_preview = False self.popup_text = '' if msg_obj.mtype == 'normal': # single message self.popup_msg_type = 'normal' self.popup_event_type = _('New Single Message') self.popup_image = 'gajim-single_msg_recv' self.popup_title = _('New Single Message from %(nickname)s') % \ {'nickname': nick} elif msg_obj.mtype == 'pm': self.popup_msg_type = 'pm' self.popup_event_type = _('New Private Message') self.popup_image = 'gajim-priv_msg_recv' self.popup_title = _('New Private Message from group chat %s') % \ msg_obj.jid if self.popup_text: self.popup_text = _('%(nickname)s: %(message)s') % \ {'nickname': nick, 'message': self.popup_text} else: self.popup_text = _('Messaged by %(nickname)s') % \ {'nickname': nick} else: # chat message self.popup_msg_type = 'chat' self.popup_event_type = _('New Message') self.popup_image = 'gajim-chat_msg_recv' self.popup_title = _('New Message from %(nickname)s') % \ {'nickname': nick} if app.config.get('notify_on_new_message'): if self.first_unread or (app.config.get('autopopup_chat_opened') \ and not self.control_focused): if app.config.get('autopopupaway'): # always show notification self.do_popup = True if app.connections[self.conn.name].connected in (2, 3): # we're online or chat self.do_popup = True if msg_obj.attention and not app.config.get( 'ignore_incoming_attention'): self.popup_timeout = 0 self.do_popup = True else: self.popup_timeout = app.config.get('notification_timeout') if msg_obj.attention and not app.config.get( 'ignore_incoming_attention') and app.config.get_per('soundevents', 'attention_received', 'enabled'): self.sound_event = 'attention_received' self.do_sound = True elif self.first_unread and helpers.allow_sound_notification( self.conn.name, 'first_message_received'): self.do_sound = True elif not self.first_unread and self.control_focused and \ helpers.allow_sound_notification(self.conn.name, 'next_message_received_focused'): self.do_sound = True elif not self.first_unread and not self.control_focused and \ helpers.allow_sound_notification(self.conn.name, 'next_message_received_unfocused'): self.do_sound = True def handle_incoming_gc_msg_event(self, msg_obj): if not msg_obj.msg_obj.gc_control: # we got a message from a room we're not in? ignore it return self.jid = msg_obj.jid sound = msg_obj.msg_obj.gc_control.highlighting_for_message( msg_obj.msgtxt, msg_obj.timestamp)[1] if msg_obj.nickname != msg_obj.msg_obj.gc_control.nick: self.do_sound = True if sound == 'received': self.sound_event = 'muc_message_received' elif sound == 'highlight': self.sound_event = 'muc_message_highlight' else: self.do_sound = False else: self.do_sound = False self.do_popup = False def get_path_to_generic_or_avatar(self, generic, jid=None, suffix=None): """ Choose between avatar image and default image Returns full path to the avatar image if it exists, otherwise returns full path to the image. generic must be with extension and suffix without """ if jid: # we want an avatar puny_jid = helpers.sanitize_filename(jid) path_to_file = os.path.join(app.AVATAR_PATH, puny_jid) + suffix path_to_local_file = path_to_file + '_local' for extension in ('.png', '.jpeg'): path_to_local_file_full = path_to_local_file + extension if os.path.exists(path_to_local_file_full): return path_to_local_file_full for extension in ('.png', '.jpeg'): path_to_file_full = path_to_file + extension if os.path.exists(path_to_file_full): return path_to_file_full return os.path.abspath(generic) def handle_incoming_pres_event(self, pres_obj): if app.jid_is_transport(pres_obj.jid): return True account = pres_obj.conn.name self.jid = pres_obj.jid resource = pres_obj.resource or '' # It isn't an agent for c in pres_obj.contact_list: if c.resource == resource: # we look for other connected resources continue if c.show not in ('offline', 'error'): return True # no other resource is connected, let's look in metacontacts family = app.contacts.get_metacontacts_family(account, self.jid) for info in family: acct_ = info['account'] jid_ = info['jid'] c_ = app.contacts.get_contact_with_highest_priority(acct_, jid_) if not c_: continue if c_.jid == self.jid: continue if c_.show not in ('offline', 'error'): return True if pres_obj.old_show < 2 and pres_obj.new_show > 1: event = 'contact_connected' show_image = 'online.png' suffix = '_notif_size_colored' server = app.get_server_from_jid(self.jid) account_server = account + '/' + server block_transport = False if account_server in app.block_signed_in_notifications and \ app.block_signed_in_notifications[account_server]: block_transport = True if helpers.allow_showing_notification(account, 'notify_on_signin') \ and not app.block_signed_in_notifications[account] and \ not block_transport: self.do_popup = True if app.config.get_per('soundevents', 'contact_connected', 'enabled') and not app.block_signed_in_notifications[account] and\ not block_transport and helpers.allow_sound_notification(account, 'contact_connected'): self.sound_event = event self.do_sound = True elif pres_obj.old_show > 1 and pres_obj.new_show < 2: event = 'contact_disconnected' show_image = 'offline.png' suffix = '_notif_size_bw' if helpers.allow_showing_notification(account, 'notify_on_signout'): self.do_popup = True if app.config.get_per('soundevents', 'contact_disconnected', 'enabled') and helpers.allow_sound_notification(account, event): self.sound_event = event self.do_sound = True # Status change (not connected/disconnected or error (<1)) elif pres_obj.new_show > 1: event = 'status_change' # FIXME: we don't always 'online.png', but we first need 48x48 for # all status show_image = 'online.png' suffix = '_notif_size_colored' else: return True transport_name = app.get_transport_name_from_jid(self.jid) img_path = None if transport_name: img_path = os.path.join(helpers.get_transport_path( transport_name), '48x48', show_image) if not img_path or not os.path.isfile(img_path): iconset = app.config.get('iconset') img_path = os.path.join(helpers.get_iconset_path(iconset), '48x48', show_image) self.popup_image_path = self.get_path_to_generic_or_avatar(img_path, jid=self.jid, suffix=suffix) self.popup_timeout = app.config.get('notification_timeout') nick = i18n.direction_mark + app.get_name_from_jid(account, self.jid) if event == 'status_change': self.popup_title = _('%(nick)s Changed Status') % \ {'nick': nick} self.popup_text = _('%(nick)s is now %(status)s') % \ {'nick': nick, 'status': helpers.get_uf_show(pres_obj.show)} if pres_obj.status: self.popup_text = self.popup_text + " : " + pres_obj.status self.popup_event_type = _('Contact Changed Status') elif event == 'contact_connected': self.popup_title = _('%(nickname)s Signed In') % {'nickname': nick} self.popup_text = '' if pres_obj.status: self.popup_text = pres_obj.status self.popup_event_type = _('Contact Signed In') elif event == 'contact_disconnected': self.popup_title = _('%(nickname)s Signed Out') % {'nickname': nick} self.popup_text = '' if pres_obj.status: self.popup_text = pres_obj.status self.popup_event_type = _('Contact Signed Out') def generate(self): # what's needed to compute output self.conn = self.base_event.conn self.jid = '' self.control = None self.control_focused = False self.first_unread = False # For output self.do_sound = False self.sound_file = '' self.sound_event = '' # gajim sound played if not sound_file is set self.show_popup = False self.do_popup = False self.popup_title = '' self.popup_text = '' self.popup_event_type = '' self.popup_msg_type = '' self.popup_image = '' self.popup_image_path = '' self.popup_timeout = -1 self.do_command = False self.command = '' self.show_in_notification_area = False self.show_in_roster = False self.detect_type() if self.notif_type == 'msg': self.handle_incoming_msg_event(self.base_event) elif self.notif_type == 'gc-msg': self.handle_incoming_gc_msg_event(self.base_event) elif self.notif_type == 'pres': self.handle_incoming_pres_event(self.base_event) return True class MessageOutgoingEvent(nec.NetworkOutgoingEvent): name = 'message-outgoing' base_network_events = [] def init(self): self.additional_data = {} self.message = None self.keyID = None self.type_ = 'chat' self.kind = None self.timestamp = None self.subject = '' self.chatstate = None self.stanza_id = None self.resource = None self.user_nick = None self.xhtml = None self.label = None self.session = None self.forward_from = None self.form_node = None self.delayed = None self.callback = None self.callback_args = [] self.now = False self.is_loggable = True self.control = None self.attention = False self.correct_id = None self.automatic_message = True self.encryption = '' self.encrypted = False def get_full_jid(self): if self.resource: return self.jid + '/' + self.resource if self.session: return self.session.get_to() return self.jid def generate(self): if self.type_ == 'chat': self.kind = KindConstant.CHAT_MSG_SENT else: self.kind = KindConstant.SINGLE_MSG_SENT return True class StanzaMessageOutgoingEvent(nec.NetworkOutgoingEvent): name='stanza-message-outgoing' base_network_events = [] def generate(self): return True class GcStanzaMessageOutgoingEvent(nec.NetworkOutgoingEvent): name='gc-stanza-message-outgoing' base_network_events = [] def generate(self): return True class GcMessageOutgoingEvent(nec.NetworkOutgoingEvent): name = 'gc-message-outgoing' base_network_events = [] def init(self): self.additional_data = {} self.message = '' self.chatstate = None self.xhtml = None self.stanza_id = None self.label = None self.callback = None self.callback_args = [] self.is_loggable = True self.control = None self.correct_id = None self.automatic_message = True def generate(self): return True class ClientCertPassphraseEvent(nec.NetworkIncomingEvent): name = 'client-cert-passphrase' base_network_events = [] class InformationEvent(nec.NetworkIncomingEvent): name = 'information' base_network_events = [] def init(self): self.args = None self.kwargs = {} self.dialog_name = None self.popup = True def generate(self): if self.args is None: self.args = () else: self.args = (self.args,) return True class BlockingEvent(nec.NetworkIncomingEvent): name = 'blocking' base_network_events = [] def init(self): self.blocklist = [] self.blocked_jids = [] self.unblocked_jids = [] self.unblock_all = False def generate(self): block_list = self.stanza.getTag( 'blocklist', namespace=nbxmpp.NS_BLOCKING) if block_list is not None: for item in block_list.getTags('item'): self.blocklist.append(item.getAttr('jid')) app.log('blocking').info( 'Blocklist Received: %s', self.blocklist) return True block_tag = self.stanza.getTag('block', namespace=nbxmpp.NS_BLOCKING) if block_tag is not None: for item in block_tag.getTags('item'): self.blocked_jids.append(item.getAttr('jid')) app.log('blocking').info( 'Blocking Push - blocked JIDs: %s', self.blocked_jids) unblock_tag = self.stanza.getTag( 'unblock', namespace=nbxmpp.NS_BLOCKING) if unblock_tag is not None: if not unblock_tag.getTags('item'): self.unblock_all = True app.log('blocking').info('Blocking Push - unblocked all') return True for item in unblock_tag.getTags('item'): self.unblocked_jids.append(item.getAttr('jid')) app.log('blocking').info( 'Blocking Push - unblocked JIDs: %s', self.unblocked_jids) return True class HTTPUploadStartEvent(nec.NetworkIncomingEvent): name = 'httpupload-start' base_network_events = [] def generate(self): return True class HTTPUploadProgressEvent(nec.NetworkIncomingEvent): name = 'httpupload-progress' base_network_events = [] def generate(self): return Truegajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/const.py000066400000000000000000000044311326020644600247640ustar00rootroot00000000000000from enum import IntEnum, unique from collections import namedtuple Option = namedtuple('Option', 'kind label type value name callback data desc enabledif props') Option.__new__.__defaults__ = (None,) * len(Option._fields) @unique class OptionKind(IntEnum): ENTRY = 0 SWITCH = 1 SPIN = 2 ACTION = 3 LOGIN = 4 DIALOG = 5 CALLBACK = 6 PROXY = 7 HOSTNAME = 8 PRIORITY = 9 FILECHOOSER = 10 CHANGEPASSWORD = 11 GPG = 12 @unique class OptionType(IntEnum): ACCOUNT_CONFIG = 0 CONFIG = 1 VALUE = 2 ACTION = 3 DIALOG = 4 class AvatarSize(IntEnum): TAB = 16 ROSTER = 32 CHAT = 48 NOTIFICATION = 48 PROFILE = 64 TOOLTIP = 125 VCARD = 200 class ArchiveState(IntEnum): NEVER = 0 ALL = 1 THANKS = u"""\ Alexander Futász Alexander V. Butenko Alexey Nezhdanov Alfredo Junix Anaël Verrier Anders Ström Andrew Sayman Anton Shmigirilov Christian Bjälevik Christophe Got Christoph Neuroth David Campey Dennis Craven Fabian Neumann Filippos Papadopoulos Francisco Alburquerque Parra (Membris Khan) Frederic Lory Fridtjof Bussefor Geobert Quach Guillaume Morin Gustavo J. A. M. Carneiro Ivo Anjo Josef Vybíral Juraj Michalek Kjell Braden Luis Peralta Michael Scherer Michele Campeotto Mike Albon Miguel Fonseca Norman Rasmussen Oscar Hellström Peter Saint-Andre Petr Menšík Sergey Kuleshov Stavros Giannouris Stian B. Barmen Thilo Molitor Thomas Klein-Hitpaß Urtzi Alfaro Witold Kieraś Yakov Bezrukov Yavor Doganov """.strip().split("\n") ARTISTS = u"""\ Anders Ström Christophe Got Dennis Craven Dmitry Korzhevin Guillaume Morin Gvorcek Spajreh Josef Vybíral Membris Khan Rederick Asher Jakub Szypulka """.strip().split("\n") DEVS_CURRENT = u"""\ Yann Leboulanger (asterix AT lagaule.org) Philipp Hörist (philipp AT hoerist.com) """.strip().split("\n") DEVS_PAST = u"""\ Stefan Bethge (stefan AT lanpartei.de) Alexander Cherniuk (ts33kr AT gmail.com) Stephan Erb (steve-e AT h3c.de) Vincent Hanquez (tab AT snarc.org) Dimitur Kirov (dkirov AT gmail.com) Nikos Kouremenos (kourem AT gmail.com) Julien Pivotto (roidelapluie AT gmail.com) Jonathan Schleifer (js-gajim AT webkeks.org) Travis Shirk (travis AT pobox.com) Brendan Taylor (whateley AT gmail.com) Jean-Marie Traissard (jim AT lapin.org) """.strip().split("\n") gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/contacts.py000066400000000000000000000766221326020644600254670ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/contacts.py ## ## Copyright (C) 2006 Dimitur Kirov ## Travis Shirk ## Nikos Kouremenos ## Copyright (C) 2006-2014 Yann Leboulanger ## Jean-Marie Traissard ## Copyright (C) 2007 Lukas Petrovicky ## Tomasz Melcer ## Julien Pivotto ## Copyright (C) 2007-2008 Stephan Erb ## Copyright (C) 2008 Brendan Taylor ## Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## try: from gajim.common import caps_cache from gajim.common.account import Account from gajim import common except ImportError as e: if __name__ != "__main__": raise ImportError(str(e)) class XMPPEntity(object): """ Base representation of entities in XMPP """ def __init__(self, jid, account, resource): self.jid = jid self.resource = resource self.account = account class CommonContact(XMPPEntity): def __init__(self, jid, account, resource, show, status, name, our_chatstate, chatstate, client_caps=None): XMPPEntity.__init__(self, jid, account, resource) self.show = show self.status = status self.name = name self.client_caps = client_caps or caps_cache.NullClientCaps() # please read xep-85 http://www.xmpp.org/extensions/xep-0085.html # this holds what WE SEND to contact (our current chatstate) self.our_chatstate = our_chatstate # this is contact's chatstate self.chatstate = chatstate def get_full_jid(self): raise NotImplementedError def get_shown_name(self): raise NotImplementedError def supports(self, requested_feature): """ Return True if the contact has advertised to support the feature identified by the given namespace. False otherwise. """ if self.show == 'offline': # Unfortunately, if all resources are offline, the contact # includes the last resource that was online. Check for its # show, so we can be sure it's existant. Otherwise, we still # return caps for a contact that has no resources left. return False else: return caps_cache.client_supports(self.client_caps, requested_feature) class Contact(CommonContact): """ Information concerning a contact """ def __init__(self, jid, account, name='', groups=None, show='', status='', sub='', ask='', resource='', priority=0, keyID='', client_caps=None, our_chatstate=None, chatstate=None, idle_time=None, avatar_sha=None): if not isinstance(jid, str): print('no str') if groups is None: groups = [] CommonContact.__init__(self, jid, account, resource, show, status, name, our_chatstate, chatstate, client_caps=client_caps) self.contact_name = '' # nick choosen by contact self.groups = [i if i else _('General') for i in set(groups)] # filter duplicate values self.avatar_sha = avatar_sha self.sub = sub self.ask = ask self.priority = priority self.keyID = keyID self.idle_time = idle_time self.pep = {} def get_full_jid(self): if self.resource: return self.jid + '/' + self.resource return self.jid def get_shown_name(self): if self.name: return self.name if self.contact_name: return self.contact_name return self.jid.split('@')[0] def get_shown_groups(self): if self.is_observer(): return [_('Observers')] elif self.is_groupchat(): return [_('Groupchats')] elif self.is_transport(): return [_('Transports')] elif not self.groups: return [_('General')] else: return self.groups def is_hidden_from_roster(self): """ If contact should not be visible in roster """ # XEP-0162: http://www.xmpp.org/extensions/xep-0162.html if self.is_transport(): return False if self.sub in ('both', 'to'): return False if self.sub in ('none', 'from') and self.ask == 'subscribe': return False if self.sub in ('none', 'from') and (self.name or len(self.groups)): return False if _('Not in Roster') in self.groups: return False return True def is_observer(self): # XEP-0162: http://www.xmpp.org/extensions/xep-0162.html is_observer = False if self.sub == 'from' and not self.is_transport()\ and self.is_hidden_from_roster(): is_observer = True return is_observer def is_groupchat(self): for account in common.app.gc_connected: if self.jid in common.app.gc_connected[account]: return True return False def is_transport(self): # if not '@' or '@' starts the jid then contact is transport return self.jid.find('@') <= 0 class GC_Contact(CommonContact): """ Information concerning each groupchat contact """ def __init__(self, room_jid, account, name='', show='', status='', role='', affiliation='', jid='', resource='', our_chatstate=None, chatstate=None, avatar_sha=None): CommonContact.__init__(self, jid, account, resource, show, status, name, our_chatstate, chatstate) self.room_jid = room_jid self.role = role self.affiliation = affiliation self.avatar_sha = avatar_sha def get_full_jid(self): return self.room_jid + '/' + self.name def get_shown_name(self): return self.name def get_avatar(self, *args, **kwargs): return common.app.interface.get_avatar(self.avatar_sha, *args, **kwargs) def as_contact(self): """ Create a Contact instance from this GC_Contact instance """ return Contact(jid=self.get_full_jid(), account=self.account, name=self.name, groups=[], show=self.show, status=self.status, sub='none', client_caps=self.client_caps, avatar_sha=self.avatar_sha) class LegacyContactsAPI: """ This is a GOD class for accessing contact and groupchat information. The API has several flaws: * it mixes concerns because it deals with contacts, groupchats, groupchat contacts and metacontacts * some methods like get_contact() may return None. This leads to a lot of duplication all over Gajim because it is not sure if we receive a proper contact or just None. It is a long way to cleanup this API. Therefore just stick with it and use it as before. We will try to figure out a migration path. """ def __init__(self): self._metacontact_manager = MetacontactManager(self) self._accounts = {} def change_account_name(self, old_name, new_name): self._accounts[new_name] = self._accounts[old_name] self._accounts[new_name].name = new_name del self._accounts[old_name] self._metacontact_manager.change_account_name(old_name, new_name) def add_account(self, account_name): self._accounts[account_name] = Account(account_name, Contacts(), GC_Contacts()) self._metacontact_manager.add_account(account_name) def get_accounts(self): return list(self._accounts.keys()) def remove_account(self, account): del self._accounts[account] self._metacontact_manager.remove_account(account) def create_contact(self, jid, account, name='', groups=None, show='', status='', sub='', ask='', resource='', priority=0, keyID='', client_caps=None, our_chatstate=None, chatstate=None, idle_time=None, avatar_sha=None): if groups is None: groups = [] # Use Account object if available account = self._accounts.get(account, account) return Contact(jid=jid, account=account, name=name, groups=groups, show=show, status=status, sub=sub, ask=ask, resource=resource, priority=priority, keyID=keyID, client_caps=client_caps, our_chatstate=our_chatstate, chatstate=chatstate, idle_time=idle_time, avatar_sha=avatar_sha) def create_self_contact(self, jid, account, resource, show, status, priority, name='', keyID=''): conn = common.app.connections[account] nick = name or common.app.nicks[account] account = self._accounts.get(account, account) # Use Account object if available self_contact = self.create_contact(jid=jid, account=account, name=nick, groups=['self_contact'], show=show, status=status, sub='both', ask='none', priority=priority, keyID=keyID, resource=resource) self_contact.pep = conn.pep return self_contact def create_not_in_roster_contact(self, jid, account, resource='', name='', keyID=''): # Use Account object if available account = self._accounts.get(account, account) return self.create_contact(jid=jid, account=account, resource=resource, name=name, groups=[_('Not in Roster')], show='not in roster', status='', sub='none', keyID=keyID) def copy_contact(self, contact): return self.create_contact(contact.jid, contact.account, name=contact.name, groups=contact.groups, show=contact.show, status=contact.status, sub=contact.sub, ask=contact.ask, resource=contact.resource, priority=contact.priority, keyID=contact.keyID, client_caps=contact.client_caps, our_chatstate=contact.our_chatstate, chatstate=contact.chatstate, idle_time=contact.idle_time, avatar_sha=contact.avatar_sha) def add_contact(self, account, contact): if account not in self._accounts: self.add_account(account) return self._accounts[account].contacts.add_contact(contact) def remove_contact(self, account, contact): if account not in self._accounts: return return self._accounts[account].contacts.remove_contact(contact) def remove_jid(self, account, jid, remove_meta=True): self._accounts[account].contacts.remove_jid(jid) if remove_meta: self._metacontact_manager.remove_metacontact(account, jid) def get_contacts(self, account, jid): return self._accounts[account].contacts.get_contacts(jid) def get_contact(self, account, jid, resource=None): return self._accounts[account].contacts.get_contact(jid, resource=resource) def get_avatar(self, account, *args, **kwargs): return self._accounts[account].contacts.get_avatar(*args, **kwargs) def get_avatar_sha(self, account, jid): return self._accounts[account].contacts.get_avatar_sha(jid) def set_avatar(self, account, jid, sha): self._accounts[account].contacts.set_avatar(jid, sha) def iter_contacts(self, account): for contact in self._accounts[account].contacts.iter_contacts(): yield contact def get_contact_from_full_jid(self, account, fjid): return self._accounts[account].contacts.get_contact_from_full_jid(fjid) def get_first_contact_from_jid(self, account, jid): return self._accounts[account].contacts.get_first_contact_from_jid(jid) def get_contacts_from_group(self, account, group): return self._accounts[account].contacts.get_contacts_from_group(group) def get_contacts_jid_list(self, account): return self._accounts[account].contacts.get_contacts_jid_list() def get_jid_list(self, account): return self._accounts[account].contacts.get_jid_list() def change_contact_jid(self, old_jid, new_jid, account): return self._accounts[account].change_contact_jid(old_jid, new_jid) def get_highest_prio_contact_from_contacts(self, contacts): if not contacts: return None prim_contact = contacts[0] for contact in contacts[1:]: if int(contact.priority) > int(prim_contact.priority): prim_contact = contact return prim_contact def get_contact_with_highest_priority(self, account, jid): contacts = self.get_contacts(account, jid) if not contacts and '/' in jid: # jid may be a fake jid, try it room, nick = jid.split('/', 1) contact = self.get_gc_contact(account, room, nick) return contact return self.get_highest_prio_contact_from_contacts(contacts) def get_nb_online_total_contacts(self, accounts=None, groups=None): """ Return the number of online contacts and the total number of contacts """ if not accounts: accounts = self.get_accounts() if groups is None: groups = [] nbr_online = 0 nbr_total = 0 for account in accounts: our_jid = common.app.get_jid_from_account(account) for jid in self.get_jid_list(account): if jid == our_jid: continue if common.app.jid_is_transport(jid) and not \ _('Transports') in groups: # do not count transports continue if self.has_brother(account, jid, accounts) and not \ self.is_big_brother(account, jid, accounts): # count metacontacts only once continue contact = self._accounts[account].contacts._contacts[jid][0] if _('Not in roster') in contact.groups: continue in_groups = False if groups == []: in_groups = True else: for group in groups: if group in contact.get_shown_groups(): in_groups = True break if in_groups: if contact.show not in ('offline', 'error'): nbr_online += 1 nbr_total += 1 return nbr_online, nbr_total def __getattr__(self, attr_name): # Only called if self has no attr_name if hasattr(self._metacontact_manager, attr_name): return getattr(self._metacontact_manager, attr_name) else: raise AttributeError(attr_name) def create_gc_contact(self, room_jid, account, name='', show='', status='', role='', affiliation='', jid='', resource='', avatar_sha=None): account = self._accounts.get(account, account) # Use Account object if available return GC_Contact(room_jid, account, name, show, status, role, affiliation, jid, resource, avatar_sha=avatar_sha) def add_gc_contact(self, account, gc_contact): return self._accounts[account].gc_contacts.add_gc_contact(gc_contact) def remove_gc_contact(self, account, gc_contact): return self._accounts[account].gc_contacts.remove_gc_contact(gc_contact) def remove_room(self, account, room_jid): return self._accounts[account].gc_contacts.remove_room(room_jid) def get_gc_list(self, account): return self._accounts[account].gc_contacts.get_gc_list() def get_nick_list(self, account, room_jid): return self._accounts[account].gc_contacts.get_nick_list(room_jid) def get_gc_contact(self, account, room_jid, nick): return self._accounts[account].gc_contacts.get_gc_contact(room_jid, nick) def is_gc_contact(self, account, jid): return self._accounts[account].gc_contacts.is_gc_contact(jid) def get_nb_role_total_gc_contacts(self, account, room_jid, role): return self._accounts[account].gc_contacts.get_nb_role_total_gc_contacts(room_jid, role) def set_gc_avatar(self, account, room_jid, nick, sha): contact = self.get_gc_contact(account, room_jid, nick) if contact is None: return contact.avatar_sha = sha class Contacts(): """ This is a breakout of the contact related behavior of the old Contacts class (which is not called LegacyContactsAPI) """ def __init__(self): # list of contacts {jid1: [C1, C2]}, } one Contact per resource self._contacts = {} def add_contact(self, contact): if contact.jid not in self._contacts: self._contacts[contact.jid] = [contact] return contacts = self._contacts[contact.jid] # We had only one that was offline, remove it if len(contacts) == 1 and contacts[0].show == 'offline': # Do not use self.remove_contact: it deteles # self._contacts[account][contact.jid] contacts.remove(contacts[0]) # If same JID with same resource already exists, use the new one for c in contacts: if c.resource == contact.resource: self.remove_contact(c) break contacts.append(contact) def remove_contact(self, contact): if contact.jid not in self._contacts: return if contact in self._contacts[contact.jid]: self._contacts[contact.jid].remove(contact) if len(self._contacts[contact.jid]) == 0: del self._contacts[contact.jid] def remove_jid(self, jid): """ Remove all contacts for a given jid """ if jid in self._contacts: del self._contacts[jid] def get_contacts(self, jid): """ Return the list of contact instances for this jid """ return self._contacts.get(jid, []) def get_contact(self, jid, resource=None): ### WARNING ### # This function returns a *RANDOM* resource if resource = None! # Do *NOT* use if you need to get the contact to which you # send a message for example, as a bare JID in Jabber means # highest available resource, which this function ignores! """ Return the contact instance for the given resource if it's given else the first contact is no resource is given or None if there is not """ if jid in self._contacts: if not resource: return self._contacts[jid][0] for c in self._contacts[jid]: if c.resource == resource: return c return self._contacts[jid][0] def get_contact_strict(self, jid, resource): """ Return the contact instance for the given resource or None """ if jid in self._contacts: for c in self._contacts[jid]: if c.resource == resource: return c def get_avatar(self, jid, size=None, scale=None): if jid not in self._contacts: return None for resource in self._contacts[jid]: if resource.avatar_sha is None: continue avatar = common.app.interface.get_avatar( resource.avatar_sha, size, scale) if avatar is None: self.set_avatar(jid, None) return avatar def get_avatar_sha(self, jid): if jid not in self._contacts: return None for resource in self._contacts[jid]: if resource.avatar_sha is not None: return resource.avatar_sha return None def set_avatar(self, jid, sha): if jid not in self._contacts: return for resource in self._contacts[jid]: resource.avatar_sha = sha def iter_contacts(self): for jid in list(self._contacts.keys()): for contact in self._contacts[jid][:]: yield contact def get_jid_list(self): return list(self._contacts.keys()) def get_contacts_jid_list(self): return [jid for jid, contact in self._contacts.items() if not contact[0].is_groupchat()] def get_contact_from_full_jid(self, fjid): """ Get Contact object for specific resource of given jid """ barejid, resource = common.app.get_room_and_nick_from_fjid(fjid) return self.get_contact_strict(barejid, resource) def get_first_contact_from_jid(self, jid): if jid in self._contacts: return self._contacts[jid][0] def get_contacts_from_group(self, group): """ Return all contacts in the given group """ group_contacts = [] for jid in self._contacts: contacts = self.get_contacts(jid) if group in contacts[0].groups: group_contacts += contacts return group_contacts def change_contact_jid(self, old_jid, new_jid): if old_jid not in self._contacts: return self._contacts[new_jid] = [] for _contact in self._contacts[old_jid]: _contact.jid = new_jid self._contacts[new_jid].append(_contact) del self._contacts[old_jid] class GC_Contacts(): def __init__(self): # list of contacts that are in gc {room_jid: {nick: C}}} self._rooms = {} def add_gc_contact(self, gc_contact): if gc_contact.room_jid not in self._rooms: self._rooms[gc_contact.room_jid] = {gc_contact.name: gc_contact} else: self._rooms[gc_contact.room_jid][gc_contact.name] = gc_contact def remove_gc_contact(self, gc_contact): if gc_contact.room_jid not in self._rooms: return if gc_contact.name not in self._rooms[gc_contact.room_jid]: return del self._rooms[gc_contact.room_jid][gc_contact.name] # It was the last nick in room ? if not len(self._rooms[gc_contact.room_jid]): del self._rooms[gc_contact.room_jid] def remove_room(self, room_jid): if room_jid in self._rooms: del self._rooms[room_jid] def get_gc_list(self): return self._rooms.keys() def get_nick_list(self, room_jid): gc_list = self.get_gc_list() if not room_jid in gc_list: return [] return list(self._rooms[room_jid].keys()) def get_gc_contact(self, room_jid, nick): nick_list = self.get_nick_list(room_jid) if not nick in nick_list: return None return self._rooms[room_jid][nick] def is_gc_contact(self, jid): """ >>> gc = GC_Contacts() >>> gc._rooms = {'gajim@conference.gajim.org' : {'test' : True}} >>> gc.is_gc_contact('gajim@conference.gajim.org/test') True >>> gc.is_gc_contact('test@jabbim.com') False """ jid = jid.split('/') if len(jid) != 2: return False gcc = self.get_gc_contact(jid[0], jid[1]) return gcc != None def get_nb_role_total_gc_contacts(self, room_jid, role): """ Return the number of group chat contacts for the given role and the total number of group chat contacts """ if room_jid not in self._rooms: return 0, 0 nb_role = nb_total = 0 for nick in self._rooms[room_jid]: if self._rooms[room_jid][nick].role == role: nb_role += 1 nb_total += 1 return nb_role, nb_total class MetacontactManager(): def __init__(self, contacts): self._metacontacts_tags = {} self._contacts = contacts def change_account_name(self, old_name, new_name): self._metacontacts_tags[new_name] = self._metacontacts_tags[old_name] del self._metacontacts_tags[old_name] def add_account(self, account): if account not in self._metacontacts_tags: self._metacontacts_tags[account] = {} def remove_account(self, account): del self._metacontacts_tags[account] def define_metacontacts(self, account, tags_list): self._metacontacts_tags[account] = tags_list def _get_new_metacontacts_tag(self, jid): if not jid in self._metacontacts_tags: return jid #FIXME: can this append ? assert False def iter_metacontacts_families(self, account): for tag in self._metacontacts_tags[account]: family = self._get_metacontacts_family_from_tag(account, tag) yield family def _get_metacontacts_tag(self, account, jid): """ Return the tag of a jid """ if not account in self._metacontacts_tags: return None for tag in self._metacontacts_tags[account]: for data in self._metacontacts_tags[account][tag]: if data['jid'] == jid: return tag return None def add_metacontact(self, brother_account, brother_jid, account, jid, order=None): tag = self._get_metacontacts_tag(brother_account, brother_jid) if not tag: tag = self._get_new_metacontacts_tag(brother_jid) self._metacontacts_tags[brother_account][tag] = [{'jid': brother_jid, 'tag': tag}] if brother_account != account: common.app.connections[brother_account].store_metacontacts( self._metacontacts_tags[brother_account]) # be sure jid has no other tag old_tag = self._get_metacontacts_tag(account, jid) while old_tag: self.remove_metacontact(account, jid) old_tag = self._get_metacontacts_tag(account, jid) if tag not in self._metacontacts_tags[account]: self._metacontacts_tags[account][tag] = [{'jid': jid, 'tag': tag}] else: if order: self._metacontacts_tags[account][tag].append({'jid': jid, 'tag': tag, 'order': order}) else: self._metacontacts_tags[account][tag].append({'jid': jid, 'tag': tag}) common.app.connections[account].store_metacontacts( self._metacontacts_tags[account]) def remove_metacontact(self, account, jid): if not account in self._metacontacts_tags: return found = None for tag in self._metacontacts_tags[account]: for data in self._metacontacts_tags[account][tag]: if data['jid'] == jid: found = data break if found: self._metacontacts_tags[account][tag].remove(found) common.app.connections[account].store_metacontacts( self._metacontacts_tags[account]) break def has_brother(self, account, jid, accounts): tag = self._get_metacontacts_tag(account, jid) if not tag: return False meta_jids = self._get_metacontacts_jids(tag, accounts) return len(meta_jids) > 1 or len(meta_jids[account]) > 1 def is_big_brother(self, account, jid, accounts): family = self.get_metacontacts_family(account, jid) if family: nearby_family = [data for data in family if account in accounts] bb_data = self._get_metacontacts_big_brother(nearby_family) if bb_data['jid'] == jid and bb_data['account'] == account: return True return False def _get_metacontacts_jids(self, tag, accounts): """ Return all jid for the given tag in the form {acct: [jid1, jid2],.} """ answers = {} for account in self._metacontacts_tags: if tag in self._metacontacts_tags[account]: if account not in accounts: continue answers[account] = [] for data in self._metacontacts_tags[account][tag]: answers[account].append(data['jid']) return answers def get_metacontacts_family(self, account, jid): """ Return the family of the given jid, including jid in the form: [{'account': acct, 'jid': jid, 'order': order}, ] 'order' is optional """ tag = self._get_metacontacts_tag(account, jid) return self._get_metacontacts_family_from_tag(account, tag) def _get_metacontacts_family_from_tag(self, account, tag): if not tag: return [] answers = [] for account in self._metacontacts_tags: if tag in self._metacontacts_tags[account]: for data in self._metacontacts_tags[account][tag]: data['account'] = account answers.append(data) return answers def _metacontact_key(self, data): """ Data is {'jid': jid, 'account': account, 'order': order} order is optional """ show_list = ['not in roster', 'error', 'offline', 'invisible', 'dnd', 'xa', 'away', 'chat', 'online', 'requested', 'message'] jid = data['jid'] account = data['account'] # contact can be null when a jid listed in the metacontact data # is not in our roster contact = self._contacts.get_contact_with_highest_priority( account, jid) show = show_list.index(contact.show) if contact else 0 priority = contact.priority if contact else 0 has_order = 'order' in data order = data.get('order', 0) transport = common.app.get_transport_name_from_jid(jid) server = common.app.get_server_from_jid(jid) myserver = common.app.config.get_per('accounts', account, 'hostname') return (bool(contact), show > 2, has_order, order, bool(transport), show, priority, server == myserver, jid, account) def get_nearby_family_and_big_brother(self, family, account): """ Return the nearby family and its Big Brother Nearby family is the part of the family that is grouped with the metacontact. A metacontact may be over different accounts. If accounts are not merged then the given family is split account wise. (nearby_family, big_brother_jid, big_brother_account) """ if common.app.config.get('mergeaccounts'): # group all together nearby_family = family else: # we want one nearby_family per account nearby_family = [data for data in family if account == data['account']] if not nearby_family: return (None, None, None) big_brother_data = self._get_metacontacts_big_brother(nearby_family) big_brother_jid = big_brother_data['jid'] big_brother_account = big_brother_data['account'] return (nearby_family, big_brother_jid, big_brother_account) def _get_metacontacts_big_brother(self, family): """ Which of the family will be the big brother under wich all others will be ? """ return max(family, key=self._metacontact_key) if __name__ == "__main__": import doctest doctest.testmod() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/crypto.py000066400000000000000000000056711326020644600251650ustar00rootroot00000000000000# common crypto functions (mostly specific to XEP-0116, but useful elsewhere) # -*- coding:utf-8 -*- ## src/common/crypto.py ## ## Copyright (C) 2007 Brendan Taylor ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import sys import os import math from hashlib import sha256 as SHA256 # convert a large integer to a big-endian bitstring def encode_mpi(n): if n >= 256: return encode_mpi(n // 256) + bytes([n % 256]) else: return bytes([n]) # convert a large integer to a big-endian bitstring, padded with \x00s to # a multiple of 16 bytes def encode_mpi_with_padding(n): return pad_to_multiple(encode_mpi(n), 16, '\x00', True) # pad 'string' to a multiple of 'multiple_of' with 'char'. # pad on the left if 'left', otherwise pad on the right. def pad_to_multiple(string, multiple_of, char, left): mod = len(string) % multiple_of if mod == 0: return string else: padding = (multiple_of - mod) * char if left: return padding + string else: return string + padding # convert a big-endian bitstring to an integer def decode_mpi(s): if len(s) == 0: return 0 else: return 256 * decode_mpi(s[:-1]) + s[-1] def sha256(string): sh = SHA256() sh.update(string) return sh.digest() base28_chr = "acdefghikmopqruvwxy123456789" def sas_28x5(m_a, form_b): sha = sha256(m_a + form_b + b'Short Authentication String') lsb24 = decode_mpi(sha[-3:]) return base28(lsb24) def base28(n): if n >= 28: return base28(n // 28) + base28_chr[n % 28] else: return base28_chr[n] def random_bytes(bytes_): return os.urandom(bytes_) def generate_nonce(): return random_bytes(8) # generate a random number between 'bottom' and 'top' def srand(bottom, top): # minimum number of bytes needed to represent that range bytes = int(math.ceil(math.log(top - bottom, 256))) # in retrospect, this is horribly inadequate. return (decode_mpi(random_bytes(bytes)) % (top - bottom)) + bottom # a faster version of (base ** exp) % mod # taken from def powmod(base, exp, mod): square = base % mod result = 1 while exp > 0: if exp & 1: # exponent is odd result = (result * square) % mod square = (square * square) % mod exp //= 2 return result gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/dataforms.py000066400000000000000000000465761326020644600256360ustar00rootroot00000000000000# this will go to src/common/xmpp later, for now it is in src/common # -*- coding:utf-8 -*- ## src/common/dataforms.py ## ## Copyright (C) 2006-2007 Tomasz Melcer ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2007 Stephan Erb ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## """ This module contains wrappers for different parts of data forms (JEP 0004). For information how to use them, read documentation """ import nbxmpp from gajim.common import helpers # exceptions used in this module # base class class Error(Exception): pass # when we get nbxmpp.Node which we do not understand class UnknownDataForm(Error): pass # when we get nbxmpp.Node which contains bad fields class WrongFieldValue(Error): pass # helper class to change class of already existing object class ExtendedNode(nbxmpp.Node, object): @classmethod def __new__(cls, *a, **b): if 'extend' not in b.keys() or not b['extend']: return object.__new__(cls) extend = b['extend'] assert issubclass(cls, extend.__class__) extend.__class__ = cls return extend # helper to create fields from scratch def Field(typ, **attrs): ''' Helper function to create a field of given type. ''' f = { 'boolean': BooleanField, 'fixed': StringField, 'hidden': StringField, 'text-private': StringField, 'text-single': StringField, 'jid-multi': JidMultiField, 'jid-single': JidSingleField, 'list-multi': ListMultiField, 'list-single': ListSingleField, 'text-multi': TextMultiField, }[typ](typ=typ, **attrs) return f def ExtendField(node): """ Helper function to extend a node to field of appropriate type """ # when validation (XEP-122) will go in, we could have another classes # like DateTimeField - so that dicts in Field() and ExtendField() will # be different... typ=node.getAttr('type') f = { 'boolean': BooleanField, 'fixed': StringField, 'hidden': StringField, 'text-private': StringField, 'text-single': StringField, 'jid-multi': JidMultiField, 'jid-single': JidSingleField, 'list-multi': ListMultiField, 'list-single': ListSingleField, 'text-multi': TextMultiField, } if typ not in f: typ = 'text-single' return f[typ](extend=node) def ExtendForm(node): """ Helper function to extend a node to form of appropriate type """ if node.getTag('reported') is not None: return MultipleDataForm(extend=node) else: return SimpleDataForm(extend=node) class DataField(ExtendedNode): """ Keeps data about one field - var, field type, labels, instructions... Base class for different kinds of fields. Use Field() function to construct one of these """ def __init__(self, typ=None, var=None, value=None, label=None, desc=None, required=False, options=None, extend=None): if extend is None: ExtendedNode.__init__(self, 'field') self.type_ = typ self.var = var if value is not None: self.value = value if label is not None: self.label = label if desc is not None: self.desc = desc self.required = required self.options = options @property def type_(self): """ Type of field. Recognized values are: 'boolean', 'fixed', 'hidden', 'jid-multi', 'jid-single', 'list-multi', 'list-single', 'text-multi', 'text-private', 'text-single'. If you set this to something different, DataField will store given name, but treat all data as text-single """ t = self.getAttr('type') if t is None: return 'text-single' return t @type_.setter def type_(self, value): assert isinstance(value, str) self.setAttr('type', value) @property def var(self): """ Field identifier """ return self.getAttr('var') @var.setter def var(self, value): assert isinstance(value, str) self.setAttr('var', value) @var.deleter def var(self): self.delAttr('var') @property def label(self): """ Human-readable field name """ l = self.getAttr('label') if not l: l = self.var return l @label.setter def label(self, value): assert isinstance(value, str) self.setAttr('label', value) @label.deleter def label(self): if self.getAttr('label'): self.delAttr('label') @property def description(self): """ Human-readable description of field meaning """ return self.getTagData('desc') or '' @description.setter def description(self, value): assert isinstance(value, str) if value == '': del self.description else: self.setTagData('desc', value) @description.deleter def description(self): t = self.getTag('desc') if t is not None: self.delChild(t) @property def required(self): """ Controls whether this field required to fill. Boolean """ return bool(self.getTag('required')) @required.setter def required(self, value): t = self.getTag('required') if t and not value: self.delChild(t) elif not t and value: self.addChild('required') @property def media(self): """ Media data """ media = self.getTag('media', namespace=nbxmpp.NS_DATA_MEDIA) if media: return Media(media) @media.setter def media(self, value): del self.media self.addChild(node=value) @media.deleter def media(self): t = self.getTag('media') if t is not None: self.delChild(t) def is_valid(self): return True class Uri(nbxmpp.Node): def __init__(self, uri_tag): nbxmpp.Node.__init__(self, node=uri_tag) @property def type_(self): """ uri type """ return self.getAttr('type') @type_.setter def type_(self, value): self.setAttr('type', value) @type_.deleter def type_(self): self.delAttr('type') @property def uri_data(self): """ uri data """ return self.getData() @uri_data.setter def uri_data(self, value): self.setData(value) @uri_data.deleter def uri_data(self): self.setData(None) class Media(nbxmpp.Node): def __init__(self, media_tag): nbxmpp.Node.__init__(self, node=media_tag) @property def uris(self): """ URIs of the media element. """ return map(Uri, self.getTags('uri')) @uris.setter def uris(self, value): del self.uris for uri in value: self.addChild(node=uri) @uris.deleter def uris(self): for element in self.getTags('uri'): self.delChild(element) class BooleanField(DataField): @property def value(self): """ Value of field. May contain True, False or None """ v = self.getTagData('value') if v in ('0', 'false'): return False if v in ('1', 'true'): return True if v is None: return False # default value is False raise WrongFieldValue @value.setter def value(self, value): self.setTagData('value', value and '1' or '0') @value.deleter def value(self): t = self.getTag('value') if t is not None: self.delChild(t) class StringField(DataField): """ Covers fields of types: fixed, hidden, text-private, text-single """ @property def value(self): """ Value of field. May be any string """ return self.getTagData('value') or '' @value.setter def value(self, value): assert isinstance(value, str) if value == '' and not self.required: del self.value return self.setTagData('value', value) @value.deleter def value(self): try: self.delChild(self.getTag('value')) except ValueError: # if there already were no value tag pass class ListField(DataField): """ Covers fields of types: jid-multi, jid-single, list-multi, list-single """ @property def options(self): """ Options """ options = [] for element in self.getTags('option'): v = element.getTagData('value') if v is None: raise WrongFieldValue l = element.getAttr('label') if not l: l = v options.append((l, v)) return options @options.setter def options(self, values): del self.options for value, label in values: self.addChild('option', {'label': label}).setTagData('value', value) @options.deleter def options(self): for element in self.getTags('option'): self.delChild(element) def iter_options(self): for element in self.iterTags('option'): v = element.getTagData('value') if v is None: raise WrongFieldValue l = element.getAttr('label') if not l: l = v yield (v, l) class ListSingleField(ListField, StringField): """ Covers list-single field """ def is_valid(self): if not self.required: return True if not self.value: return False return True class JidSingleField(ListSingleField): """ Covers jid-single fields """ def is_valid(self): if self.value: try: helpers.parse_jid(self.value) return True except: return False if self.required: return False return True class ListMultiField(ListField): """ Covers list-multi fields """ @property def values(self): """ Values held in field """ values = [] for element in self.getTags('value'): values.append(element.getData()) return values @values.setter def values(self, values): del self.values for value in values: self.addChild('value').setData(value) @values.deleter def values(self): for element in self.getTags('value'): self.delChild(element) def iter_values(self): for element in self.getTags('value'): yield element.getData() def is_valid(self): if not self.required: return True if not self.values: return False return True class JidMultiField(ListMultiField): """ Covers jid-multi fields """ def is_valid(self): if len(self.values): for value in self.values: try: helpers.parse_jid(value) except: return False return True if self.required: return False return True class TextMultiField(DataField): @property def value(self): """ Value held in field """ value = '' for element in self.iterTags('value'): value += '\n' + element.getData() return value[1:] @value.setter def value(self, value): del self.value if value == '': return for line in value.split('\n'): self.addChild('value').setData(line) @value.deleter def value(self): for element in self.getTags('value'): self.delChild(element) class DataRecord(ExtendedNode): """ The container for data fields - an xml element which has DataField elements as children """ def __init__(self, fields=None, associated=None, extend=None): self.associated = associated self.vars = {} if extend is None: # we have to build this object from scratch nbxmpp.Node.__init__(self) if fields is not None: self.fields = fields else: # we already have nbxmpp.Node inside - try to convert all # fields into DataField objects if fields is None: for field in self.iterTags('field'): if not isinstance(field, DataField): ExtendField(field) self.vars[field.var] = field else: for field in self.getTags('field'): self.delChild(field) self.fields = fields @property def fields(self): """ List of fields in this record """ return self.getTags('field') @fields.setter def fields(self, fields): del self.fields for field in fields: if not isinstance(field, DataField): ExtendField(field) self.addChild(node=field) @fields.deleter def fields(self): for element in self.getTags('field'): self.delChild(element) def iter_fields(self): """ Iterate over fields in this record. Do not take associated into account """ for field in self.iterTags('field'): yield field def iter_with_associated(self): """ Iterate over associated, yielding both our field and associated one together """ for field in self.associated.iter_fields(): yield self[field.var], field def __getitem__(self, item): return self.vars[item] def is_valid(self): for f in self.iter_fields(): if not f.is_valid(): return False return True class DataForm(ExtendedNode): def __init__(self, type_=None, title=None, instructions=None, extend=None): if extend is None: # we have to build form from scratch nbxmpp.Node.__init__(self, 'x', attrs={'xmlns': nbxmpp.NS_DATA}) if type_ is not None: self.type_=type_ if title is not None: self.title=title if instructions is not None: self.instructions=instructions @property def type_(self): """ Type of the form. Must be one of: 'form', 'submit', 'cancel', 'result'. 'form' - this form is to be filled in; you will be able soon to do: filledform = DataForm(replyto=thisform) """ return self.getAttr('type') @type_.setter def type_(self, type_): assert type_ in ('form', 'submit', 'cancel', 'result') self.setAttr('type', type_) @property def title(self): """ Title of the form Human-readable, should not contain any \\r\\n. """ return self.getTagData('title') @title.setter def title(self, title): self.setTagData('title', title) @title.deleter def title(self): try: self.delChild('title') except ValueError: pass @property def instructions(self): """ Instructions for this form Human-readable, may contain \\r\\n. """ # TODO: the same code is in TextMultiField. join them value = '' for valuenode in self.getTags('instructions'): value += '\n' + valuenode.getData() return value[1:] @instructions.setter def instructions(self, value): del self.instructions if value == '': return for line in value.split('\n'): self.addChild('instructions').setData(line) @instructions.deleter def instructions(self): for value in self.getTags('instructions'): self.delChild(value) class SimpleDataForm(DataForm, DataRecord): def __init__(self, type_=None, title=None, instructions=None, fields=None, \ extend=None): DataForm.__init__(self, type_=type_, title=title, instructions=instructions, extend=extend) DataRecord.__init__(self, fields=fields, extend=self, associated=self) def get_purged(self): c = SimpleDataForm(extend=self) del c.title c.instructions = '' to_be_removed = [] for f in c.iter_fields(): if f.required: # add if there is not if hasattr(f, 'value') and not f.value: f.value = '' # Keep all required fields continue if (hasattr(f, 'value') and not f.value and f.value != 0) or ( hasattr(f, 'values') and len(f.values) == 0): to_be_removed.append(f) else: del f.label del f.description del f.media for f in to_be_removed: c.delChild(f) return c class MultipleDataForm(DataForm): def __init__(self, type_=None, title=None, instructions=None, items=None, extend=None): DataForm.__init__(self, type_=type_, title=title, instructions=instructions, extend=extend) # all records, recorded into DataRecords if extend is None: if items is not None: self.items = items else: # we already have nbxmpp.Node inside - try to convert all # fields into DataField objects if items is None: self.items = list(self.iterTags('item')) else: for item in self.getTags('item'): self.delChild(item) self.items = items reported_tag = self.getTag('reported') self.reported = DataRecord(extend=reported_tag) @property def items(self): """ A list of all records """ return list(self.iter_records()) @items.setter def items(self, records): del self.items for record in records: if not isinstance(record, DataRecord): DataRecord(extend=record) self.addChild(node=record) @items.deleter def items(self): for record in self.getTags('item'): self.delChild(record) def iter_records(self): for record in self.getTags('item'): yield record # @property # def reported(self): # """ # DataRecord that contains descriptions of fields in records # """ # return self.getTag('reported') # # @reported.setter # def reported(self, record): # try: # self.delChild('reported') # except: # pass # # record.setName('reported') # self.addChild(node=record) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/dbus_support.py000066400000000000000000000124441326020644600263720ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/dbus_support.py ## ## Copyright (C) 2005 Andrew Sayman ## Dimitur Kirov ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2005-2014 Yann Leboulanger ## Copyright (C) 2006 Jean-Marie Traissard ## Stefan Bethge ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import sys import logging from gajim.common import app from gajim.common import exceptions _GAJIM_ERROR_IFACE = 'org.gajim.dbus.Error' log = logging.getLogger('gajim.c.dbus') try: import dbus from dbus.mainloop.glib import DBusGMainLoop DBusGMainLoop(set_as_default=True) except ImportError: supported = False if sys.platform == 'linux': # windows and mac have no dbus print(_('D-Bus python bindings are missing in this computer')) print(_('D-Bus capabilities of Gajim cannot be used')) else: try: # test if dbus-x11 is installed bus = dbus.SystemBus() bus = dbus.SessionBus() supported = True # does user have D-Bus bindings? except dbus.DBusException: supported = False if sys.platform == 'linux': # windows and mac have no dbus print(_('D-Bus does not run correctly on this machine')) print(_('D-Bus capabilities of Gajim cannot be used')) except exceptions.SystemBusNotPresent: print(_('D-Bus does not run correctly on this machine: system bus not ' 'present')) except exceptions.SessionBusNotPresent: print(_('D-Bus does not run correctly on this machine: session bus not ' 'present')) class SystemBus: """ A Singleton for the DBus SystemBus """ def __init__(self): self.system_bus = None def SystemBus(self): if not supported: raise exceptions.DbusNotSupported if not self.present(): raise exceptions.SystemBusNotPresent return self.system_bus def bus(self): return self.SystemBus() def present(self): if not supported: return False if self.system_bus is None: try: self.system_bus = dbus.SystemBus() except dbus.DBusException: self.system_bus = None return False if self.system_bus is None: return False # Don't exit Gajim when dbus is stopped self.system_bus.set_exit_on_disconnect(False) return True system_bus = SystemBus() class SessionBus: """ A Singleton for the D-Bus SessionBus """ def __init__(self): self.session_bus = None def SessionBus(self): if not supported: raise exceptions.DbusNotSupported if not self.present(): raise exceptions.SessionBusNotPresent return self.session_bus def bus(self): return self.SessionBus() def present(self): if not supported: return False if self.session_bus is None: try: self.session_bus = dbus.SessionBus() except dbus.DBusException: self.session_bus = None return False if self.session_bus is None: return False return True session_bus = SessionBus() def get_interface(interface, path, start_service=True): """ Get an interface on the current SessionBus. If the interface isn't running, try to start it first """ if not supported: return None if session_bus.present(): bus = session_bus.SessionBus() else: return None try: obj = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus') dbus_iface = dbus.Interface(obj, 'org.freedesktop.DBus') running_services = dbus_iface.ListNames() started = True if interface not in running_services: # try to start the service if start_service and dbus_iface.StartServiceByName(interface, dbus.UInt32(0)) == 1: started = True else: started = False if not started: return None obj = bus.get_object(interface, path) return dbus.Interface(obj, interface) except Exception as e: log.debug(str(e)) return None if supported: class MissingArgument(dbus.DBusException): _dbus_error_name = _GAJIM_ERROR_IFACE + '.MissingArgument' class InvalidArgument(dbus.DBusException): '''Raised when one of the provided arguments is invalid.''' _dbus_error_name = _GAJIM_ERROR_IFACE + '.InvalidArgument' gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/dh.py000066400000000000000000000233311326020644600242310ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/dh.py ## ## Copyright (C) 2007-2014 Yann Leboulanger ## Copyright (C) 2008 Brendan Taylor ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## """ This module defines a number of constants; specifically, large primes suitable for use with the Diffie-Hellman key exchange These constants have been obtained from RFC2409 and RFC3526. """ import string generators = [ None, # one to get the right offset 2, 2, None, None, 2, None, None, None, None, None, None, None, None, 2, # group 14 2, 2, 2, 2 ] _HEX_PRIMES = [ None, # group 1 '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 A63A3620 FFFFFFFF FFFFFFFF''', # group 2 '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381 FFFFFFFF FFFFFFFF''', # XXX how do I obtain these? None, None, # group 5 '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D 670C354E 4ABC9804 F1746C08 CA237327 FFFFFFFF FFFFFFFF''', None, None, None, None, None, None, None, None, # group 14 '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D 670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 15728E5A 8AACAA68 FFFFFFFF FFFFFFFF''', # group 15 '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D 670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64 ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7 ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 43DB5BFC E0FD108E 4B82D120 A93AD2CA FFFFFFFF FFFFFFFF''', # group 16 '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D 670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64 ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7 ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7 88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA 2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6 287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED 1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9 93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34063199 FFFFFFFF FFFFFFFF''', # group 17 '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D 670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64 ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7 ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7 88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA 2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6 287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED 1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9 93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34028492 36C3FAB4 D27C7026 C1D4DCB2 602646DE C9751E76 3DBA37BD F8FF9406 AD9E530E E5DB382F 413001AE B06A53ED 9027D831 179727B0 865A8918 DA3EDBEB CF9B14ED 44CE6CBA CED4BB1B DB7F1447 E6CC254B 33205151 2BD7AF42 6FB8F401 378CD2BF 5983CA01 C64B92EC F032EA15 D1721D03 F482D7CE 6E74FEF6 D55E702F 46980C82 B5A84031 900B1C9E 59E7C97F BEC7E8F3 23A97A7E 36CC88BE 0F1D45B7 FF585AC5 4BD407B2 2B4154AA CC8F6D7E BF48E1D8 14CC5ED2 0F8037E0 A79715EE F29BE328 06A1D58B B7C5DA76 F550AA3D 8A1FBFF0 EB19CCB1 A313D55C DA56C9EC 2EF29632 387FE8D7 6E3C0468 043E8F66 3F4860EE 12BF2D5B 0B7474D6 E694F91E 6DCC4024 FFFFFFFF FFFFFFFF''', # group 18 '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D 670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64 ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7 ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7 88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA 2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6 287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED 1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9 93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34028492 36C3FAB4 D27C7026 C1D4DCB2 602646DE C9751E76 3DBA37BD F8FF9406 AD9E530E E5DB382F 413001AE B06A53ED 9027D831 179727B0 865A8918 DA3EDBEB CF9B14ED 44CE6CBA CED4BB1B DB7F1447 E6CC254B 33205151 2BD7AF42 6FB8F401 378CD2BF 5983CA01 C64B92EC F032EA15 D1721D03 F482D7CE 6E74FEF6 D55E702F 46980C82 B5A84031 900B1C9E 59E7C97F BEC7E8F3 23A97A7E 36CC88BE 0F1D45B7 FF585AC5 4BD407B2 2B4154AA CC8F6D7E BF48E1D8 14CC5ED2 0F8037E0 A79715EE F29BE328 06A1D58B B7C5DA76 F550AA3D 8A1FBFF0 EB19CCB1 A313D55C DA56C9EC 2EF29632 387FE8D7 6E3C0468 043E8F66 3F4860EE 12BF2D5B 0B7474D6 E694F91E 6DBE1159 74A3926F 12FEE5E4 38777CB6 A932DF8C D8BEC4D0 73B931BA 3BC832B6 8D9DD300 741FA7BF 8AFC47ED 2576F693 6BA42466 3AAB639C 5AE4F568 3423B474 2BF1C978 238F16CB E39D652D E3FDB8BE FC848AD9 22222E04 A4037C07 13EB57A8 1A23F0C7 3473FC64 6CEA306B 4BCBC886 2F8385DD FA9D4B7F A2C087E8 79683303 ED5BDD3A 062B3CF5 B3A278A6 6D2A13F8 3F44F82D DF310EE0 74AB6A36 4597E899 A0255DC1 64F31CC5 0846851D F9AB4819 5DED7EA1 B1D510BD 7EE74D73 FAF36BC3 1ECFA268 359046F4 EB879F92 4009438B 481C6CD7 889A002E D5EE382B C9190DA6 FC026E47 9558E447 5677E9AA 9E3050E2 765694DF C81F56E8 80B96E71 60C980DD 98EDD3DF FFFFFFFF FFFFFFFF''' ] _ALL_ASCII = ''.join(map(chr, range(256))) def hex_to_decimal(stripee): if not stripee: return None return int(stripee.translate(_ALL_ASCII).translate( str.maketrans("", "", string.whitespace)), 16) primes = list(map(hex_to_decimal, _HEX_PRIMES)) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/events.py000066400000000000000000000400241326020644600251400ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/events.py ## ## Copyright (C) 2006 Jean-Marie Traissard ## Nikos Kouremenos ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2007 Julien Pivotto ## Copyright (C) 2007-2008 Stephan Erb ## Copyright (C) 2008 Brendan Taylor ## Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import time class Event: """ Information concerning each event """ def __init__(self, time_=None, show_in_roster=False, show_in_systray=True): """ type_ in chat, normal, file-request, file-error, file-completed, file-request-error, file-send-error, file-stopped, gc_msg, pm, printed_chat, printed_gc_msg, printed_marked_gc_msg, printed_pm, gc-invitation, subscription_request, unsubscribedm jingle-incoming parameters is (per type_): chat, normal, pm: [message, subject, kind, time, encrypted, resource, msg_log_id] where kind in error, incoming file-*: file_props gc_msg: None printed_chat: [message, subject, control, msg_log_id] printed_*: None messages that are already printed in chat, but not read gc-invitation: [room_jid, reason, password, is_continued, jid_from] subscription_request: [text, nick] unsubscribed: contact jingle-incoming: (fulljid, sessionid, content_types) """ if time_: self.time_ = time_ else: self.time_ = time.time() self.show_in_roster = show_in_roster self.show_in_systray = show_in_systray # Set when adding the event self.jid = None self.account = None class ChatEvent(Event): type_ = 'chat' def __init__ (self, message, subject, kind, time, encrypted, resource, msg_log_id, correct_id=None, xhtml=None, session=None, form_node=None, displaymarking=None, sent_forwarded=False, time_=None, show_in_roster=False, show_in_systray=True, additional_data=None): Event.__init__(self, time_, show_in_roster=show_in_roster, show_in_systray=show_in_systray) self.message = message self.subject = subject self.kind = kind self.time = time self.encrypted = encrypted self.resource = resource self.msg_log_id = msg_log_id self.correct_id = correct_id self.xhtml = xhtml self.session = session self.form_node = form_node self.displaymarking = displaymarking self.sent_forwarded = sent_forwarded if additional_data is None: additional_data = {} self.additional_data = additional_data class NormalEvent(ChatEvent): type_ = 'normal' class PmEvent(ChatEvent): type_ = 'pm' class PrintedChatEvent(Event): type_ = 'printed_chat' def __init__(self, message, subject, control, msg_log_id, time_=None, show_in_roster=False, show_in_systray=True): Event.__init__(self, time_, show_in_roster=show_in_roster, show_in_systray=show_in_systray) self.message = message self.subject = subject self.control = control self.msg_log_id = msg_log_id class PrintedGcMsgEvent(PrintedChatEvent): type_ = 'printed_gc_msg' class PrintedMarkedGcMsgEvent(PrintedChatEvent): type_ = 'printed_marked_gc_msg' class PrintedPmEvent(PrintedChatEvent): type_ = 'printed_pm' class SubscriptionRequestEvent(Event): type_ = 'subscription_request' def __init__(self, text, nick, time_=None, show_in_roster=False, show_in_systray=True): Event.__init__(self, time_, show_in_roster=show_in_roster, show_in_systray=show_in_systray) self.text = text self.nick = nick class UnsubscribedEvent(Event): type_ = 'unsubscribed' def __init__(self, contact, time_=None, show_in_roster=False, show_in_systray=True): Event.__init__(self, time_, show_in_roster=show_in_roster, show_in_systray=show_in_systray) self.contact = contact class GcInvitationtEvent(Event): type_ = 'gc-invitation' def __init__(self, room_jid, reason, password, is_continued, jid_from, time_=None, show_in_roster=False, show_in_systray=True): Event.__init__(self, time_, show_in_roster=show_in_roster, show_in_systray=show_in_systray) self.room_jid = room_jid self.reason = reason self.password = password self.is_continued = is_continued self.jid_from = jid_from class FileRequestEvent(Event): type_ = 'file-request' def __init__(self, file_props, time_=None, show_in_roster=False, show_in_systray=True): Event.__init__(self, time_, show_in_roster=show_in_roster, show_in_systray=show_in_systray) self.file_props = file_props class FileSendErrorEvent(FileRequestEvent): type_ = 'file-send-error' class FileErrorEvent(FileRequestEvent): type_ = 'file-error' class FileRequestErrorEvent(FileRequestEvent): type_ = 'file-request-error' class FileCompletedEvent(FileRequestEvent): type_ = 'file-completed' class FileStoppedEvent(FileRequestEvent): type_ = 'file-stopped' class FileHashErrorEvent(FileRequestEvent): type_ = 'file-hash-error' class JingleIncomingEvent(Event): type_ = 'jingle-incoming' def __init__(self, peerjid, sid, content_types, time_=None, show_in_roster=False, show_in_systray=True): Event.__init__(self, time_, show_in_roster=show_in_roster, show_in_systray=show_in_systray) self.peerjid = peerjid self.sid = sid self.content_types = content_types class Events: """ Information concerning all events """ def __init__(self): self._events = {} # list of events {acct: {jid1: [E1, E2]}, } self._event_added_listeners = [] self._event_removed_listeners = [] def event_added_subscribe(self, listener): """ Add a listener when an event is added to the queue """ if not listener in self._event_added_listeners: self._event_added_listeners.append(listener) def event_added_unsubscribe(self, listener): """ Remove a listener when an event is added to the queue """ if listener in self._event_added_listeners: self._event_added_listeners.remove(listener) def event_removed_subscribe(self, listener): """ Add a listener when an event is removed from the queue """ if not listener in self._event_removed_listeners: self._event_removed_listeners.append(listener) def event_removed_unsubscribe(self, listener): """ Remove a listener when an event is removed from the queue """ if listener in self._event_removed_listeners: self._event_removed_listeners.remove(listener) def fire_event_added(self, event): for listener in self._event_added_listeners: listener(event) def fire_event_removed(self, event_list): for listener in self._event_removed_listeners: listener(event_list) def change_account_name(self, old_name, new_name): if old_name in self._events: self._events[new_name] = self._events[old_name] del self._events[old_name] def add_account(self, account): self._events[account] = {} def get_accounts(self): return self._events.keys() def remove_account(self, account): del self._events[account] def add_event(self, account, jid, event): # No such account before ? if account not in self._events: self._events[account] = {jid: [event]} # no such jid before ? elif jid not in self._events[account]: self._events[account][jid] = [event] else: self._events[account][jid].append(event) event.jid = jid event.account = account self.fire_event_added(event) def remove_events(self, account, jid, event=None, types=None): """ If event is not specified, remove all events from this jid, optionally only from given type return True if no such event found """ if types is None: types = [] if account not in self._events: return True if jid not in self._events[account]: return True if event: # remove only one event if event in self._events[account][jid]: if len(self._events[account][jid]) == 1: del self._events[account][jid] else: self._events[account][jid].remove(event) self.fire_event_removed([event]) return else: return True if types: new_list = [] # list of events to keep removed_list = [] # list of removed events for ev in self._events[account][jid]: if ev.type_ not in types: new_list.append(ev) else: removed_list.append(ev) if len(new_list) == len(self._events[account][jid]): return True if new_list: self._events[account][jid] = new_list else: del self._events[account][jid] self.fire_event_removed(removed_list) return # no event nor type given, remove them all self.fire_event_removed(self._events[account][jid]) del self._events[account][jid] def change_jid(self, account, old_jid, new_jid): if account not in self._events: return if old_jid not in self._events[account]: return if new_jid in self._events[account]: self._events[account][new_jid] += self._events[account][old_jid] else: self._events[account][new_jid] = self._events[account][old_jid] del self._events[account][old_jid] def get_nb_events(self, types=None, account=None): if types is None: types = [] return self._get_nb_events(types = types, account = account) def get_events(self, account, jid=None, types=None): """ Return all events from the given account of the form {jid1: [], jid2: []}. If jid is given, returns all events from the given jid in a list: [] optionally only from given type """ if types is None: types = [] if account not in self._events: return [] if not jid: events_list = {} # list of events for jid_ in self._events[account]: events = [] for ev in self._events[account][jid_]: if not types or ev.type_ in types: events.append(ev) if events: events_list[jid_] = events return events_list if jid not in self._events[account]: return [] events_list = [] # list of events for ev in self._events[account][jid]: if not types or ev.type_ in types: events_list.append(ev) return events_list def get_first_event(self, account=None, jid=None, type_=None): """ Return the first event of type type_ if given """ if not account: return self._get_first_event_with_attribute(self._events) events_list = self.get_events(account, jid, type_) # be sure it's bigger than latest event first_event_time = time.time() + 1 first_event = None for event in events_list: if event.time_ < first_event_time: first_event_time = event.time_ first_event = event return first_event def _get_nb_events(self, account=None, jid=None, attribute=None, types=None): """ Return the number of pending events """ if types is None: types = [] nb = 0 if account: accounts = [account] else: accounts = self._events.keys() for acct in accounts: if acct not in self._events: continue if jid: jids = [jid] else: jids = self._events[acct].keys() for j in jids: if j not in self._events[acct]: continue for event in self._events[acct][j]: if types and event.type_ not in types: continue if not attribute or \ attribute == 'systray' and event.show_in_systray or \ attribute == 'roster' and event.show_in_roster: nb += 1 return nb def _get_some_events(self, attribute): """ Attribute in systray, roster """ events = {} for account in self._events: events[account] = {} for jid in self._events[account]: events[account][jid] = [] for event in self._events[account][jid]: if attribute == 'systray' and event.show_in_systray or \ attribute == 'roster' and event.show_in_roster: events[account][jid].append(event) if not events[account][jid]: del events[account][jid] if not events[account]: del events[account] return events def _get_first_event_with_attribute(self, events): """ Get the first event events is in the form {account1: {jid1: [ev1, ev2], },. } """ # be sure it's bigger than latest event first_event_time = time.time() + 1 first_account = None first_jid = None first_event = None for account in events: for jid in events[account]: for event in events[account][jid]: if event.time_ < first_event_time: first_event_time = event.time_ first_account = account first_jid = jid first_event = event return first_account, first_jid, first_event def get_nb_systray_events(self, types=None): """ Return the number of events displayed in roster """ if types is None: types = [] return self._get_nb_events(attribute='systray', types=types) def get_systray_events(self): """ Return all events that must be displayed in systray: {account1: {jid1: [ev1, ev2], },. } """ return self._get_some_events('systray') def get_first_systray_event(self): events = self.get_systray_events() return self._get_first_event_with_attribute(events) def get_nb_roster_events(self, account=None, jid=None, types=None): """ Return the number of events displayed in roster """ if types is None: types = [] return self._get_nb_events(attribute='roster', account=account, jid=jid, types=types) def get_roster_events(self): """ Return all events that must be displayed in roster: {account1: {jid1: [ev1, ev2], },. } """ return self._get_some_events('roster') gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/exceptions.py000066400000000000000000000101041326020644600260110ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/exceptions.py ## ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2005-2014 Yann Leboulanger ## Copyright (C) 2006 Jean-Marie Traissard ## Copyright (C) 2007 Brendan Taylor ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## class PysqliteOperationalError(Exception): """ Sqlite2 raised pysqlite2.dbapi2.OperationalError """ def __init__(self, text=''): Exception.__init__(self) self.text = text def __str__(self): return self.text class DatabaseMalformed(Exception): """ The databas can't be read """ def __init__(self, path=''): Exception.__init__(self) self.path = path def __str__(self): return _('The database file (%s) cannot be read. ' 'Try to repair it (see ' 'https://dev.gajim.org/gajim/gajim/wikis/help/DatabaseBackup)' ' or remove it (all history will be lost).') % self.path class ServiceNotAvailable(Exception): """ This exception is raised when we cannot use Gajim remotely' """ def __init__(self): Exception.__init__(self) def __str__(self): return _('Service not available: Gajim is not running, or remote_control is False') class DbusNotSupported(Exception): """ D-Bus is not installed or python bindings are missing """ def __init__(self): Exception.__init__(self) def __str__(self): return _('D-Bus is not present on this machine or python module is missing') class SessionBusNotPresent(Exception): """ This exception indicates that there is no session daemon """ def __init__(self): Exception.__init__(self) def __str__(self): return _('Session bus is not available.\nTry reading %(url)s') % \ {'url': 'https://dev.gajim.org/gajim/gajim/wikis/help/GajimDBus'} class SystemBusNotPresent(Exception): """ This exception indicates that there is no session daemon """ def __init__(self): Exception.__init__(self) def __str__(self): return _('System bus is not available.\nTry reading %(url)s') % \ {'url': 'https://dev.gajim.org/gajim/gajim/wikis/help/GajimDBus'} class NegotiationError(Exception): """ A session negotiation failed """ pass class DecryptionError(Exception): """ A message couldn't be decrypted into usable XML """ pass class Cancelled(Exception): """ The user cancelled an operation """ pass class LatexError(Exception): """ LaTeX processing failed for some reason """ def __init__(self, text=''): Exception.__init__(self) self.text = text def __str__(self): return self.text class GajimGeneralException(Exception): """ This exception is our general exception """ def __init__(self, text=''): Exception.__init__(self) self.text = text def __str__(self): return self.text class PluginsystemError(Exception): """ Error in the pluginsystem """ def __init__(self, text=''): Exception.__init__(self) self.text = text def __str__(self): return self.text class StanzaMalformed(Exception): """ Malfromed Stanza """ def __init__(self, message, stanza=''): Exception.__init__(self, message, stanza) self._msg = '{}\n{}'.format(message, stanza) def __str__(self): return self._msg gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/file_props.py000066400000000000000000000116701326020644600260030ustar00rootroot00000000000000""" This module is in charge of taking care of all the infomation related to individual files. Files are identified by the account name and its sid. >>> print FilesProp.getFileProp('jabberid', '10') None >>> fp = FilesProp() Traceback (most recent call last): ... Exception: this class should not be instatiated >>> print FilesProp.getAllFileProp() [] >>> fp = FilesProp.getNewFileProp('jabberid', '10') >>> fp2 = FilesProp.getFileProp('jabberid', '10') >>> fp == fp2 True """ class FilesProp: _files_props = {} def __init__(self): raise Exception('this class should not be instatiated') @classmethod def getNewFileProp(cls, account, sid): fp = FileProp(account, sid) cls.setFileProp(fp, account, sid) return fp @classmethod def getFileProp(cls, account, sid): if (account, sid) in cls._files_props.keys(): return cls._files_props[account, sid] @classmethod def getFilePropByAccount(cls, account): # Returns a list of file_props in one account file_props = [] for account, sid in cls._files_props: if account == account: file_props.append(cls._files_props[account, sid]) return file_props @classmethod def getFilePropByType(cls, type_, sid): # This method should be deleted. Getting fileprop by type and sid is not # unique enough. More than one fileprop might have the same type and sid files_prop = cls.getAllFileProp() for fp in files_prop: if fp.type_ == type_ and fp.sid == sid: return fp @classmethod def getFilePropBySid(cls, sid): # This method should be deleted. It is kept to make things compatible # This method should be replaced and instead get the file_props by # account and sid files_prop = cls.getAllFileProp() for fp in files_prop: if fp.sid == sid: return fp @classmethod def getFilePropByTransportSid(cls, account, sid): files_prop = cls.getAllFileProp() for fp in files_prop: if fp.account == account and fp.transport_sid == sid: return fp @classmethod def getAllFileProp(cls): return list(cls._files_props.values()) @classmethod def setFileProp(cls, fp, account, sid): cls._files_props[account, sid] = fp @classmethod def deleteFileProp(cls, file_prop): files_props = cls._files_props a = s = None for account, sid in files_props: fp = files_props[account, sid] if fp is file_prop: a = account s = sid if a != None and s != None: del files_props[a, s] class FileProp(object): def __init__(self, account, sid): # Do not instatiate this class directly. Call FilesProp.getNeFileProp # instead self.streamhosts = [] self.transfered_size = [] self.started = False self.completed = False self.paused = False self.stalled = False self.connected = False self.stopped = False self.is_a_proxy = False self.proxyhost = None self.proxy_sender = None self.proxy_receiver = None self.streamhost_used = None # method callback called in case of transfer failure self.failure_cb = None # method callback called when disconnecting self.disconnect_cb = None self.continue_cb = None self.sha_str = None # transfer type: 's' for sending and 'r' for receiving self.type_ = None self.error = None # Elapsed time of the file transfer self.elapsed_time = 0 self.last_time = None self.received_len = None # full file path self.file_name = None self.name = None self.date = None self.desc = None self.offset = None self.sender = None self.receiver = None self.tt_account = None self.size = None self._sid = sid self.transport_sid = None self.account = account self.mime_type = None self.algo = None self.direction = None self.syn_id = None self.seq = None self.hash_ = None self.fd = None self.startexmpp = None # Type of the session, if it is 'jingle' or 'si' self.session_type = None self.request_id = None self.proxyhosts = None self.dstaddr = None def getsid(self): # Getter of the property sid return self._sid def setsid(self, value): # The sid value will change # we need to change the in _files_props key as well del FilesProp._files_props[self.account, self._sid] self._sid = value FilesProp._files_props[self.account, self._sid] = self sid = property(getsid, setsid) if __name__ == "__main__": import doctest doctest.testmod() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/fuzzyclock.py000077500000000000000000000056141326020644600260500ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/fuzzyclock.py ## ## Copyright (C) 2006 Christoph Neuroth ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2007 Jean-Marie Traissard ## Copyright (C) 2009 Benjamin Richter
## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## """ Python class to show a "fuzzy clock". Homepage of the original: http://home.gna.org/fuzzyclock/ Project Page of the original: http://gna.org/projects/fuzzyclock The class is based on a port from PHP code by Henrique Recidive which was in turn based on the Fuzzy Clock Applet of Frerich Raabe (KDE). So most of the credit goes to this guys, thanks :-) """ class FuzzyClock: HOUR_NAMES = [ _('twelve'), _('one'), _('two'), _('three'), _('four'), _('five'), _('six'), _('seven'), _('eight'), _('nine'), _('ten'), _('eleven') ] #Strings to use for the output. %(0)s will be replaced with the preceding hour #(e.g. "x PAST %(0)s"), %(1)s with the coming hour (e.g. "x TO %(0)s"). ''' FUZZY_TIME = [ _("%(0)s o'clock"), _('five past %(0)s'), _('ten past %(0)s'), _('quarter past %(0)s'), _('twenty past %(0)s'), _('twenty five past %(0)s'), _('half past %(0)s'), _('twenty five to %(1)s'), _('twenty to %(1)s'), _('quarter to %(1)s'), _('ten to %(1)s'), _('five to %(1)s'), _("%(1)s o'clock") ] FUZZY_DAYTIME = [ _('Night'), _('Early morning'), _('Morning'), _('Almost noon'), _('Noon'), _('Afternoon'), _('Evening'), _('Late evening'), _('Night') ] FUZZY_WEEK = [ _('Start of week'), _('Middle of week'), _('Middle of week'), _('Middle of week'), _('End of week'), _('Weekend!'), _('Weekend!') ] def fuzzy_time(self, fuzzyness, now): if fuzzyness == 1 or fuzzyness == 2: if fuzzyness == 1: sector = int(round(now.tm_min / 5.0)) else: sector = int(round(now.tm_min / 15.0)) * 3 return self.FUZZY_TIME[sector] % { '0': self.HOUR_NAMES[now.tm_hour % 12], '1': self.HOUR_NAMES[(now.tm_hour + 1) % 12]} elif fuzzyness == 3: return self.FUZZY_DAYTIME[int(round(now.tm_hour / 3.0))] else: return self.FUZZY_WEEK[now.tm_wday] gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/ged.py000066400000000000000000000060501326020644600243740ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## ''' Global Events Dispatcher module. :author: Mateusz Biliński :since: 8th August 2008 :copyright: Copyright (2008) Mateusz Biliński :copyright: Copyright (2011) Yann Leboulanger :license: GPL ''' import traceback from nbxmpp import NodeProcessed import logging log = logging.getLogger('gajim.c.ged') PRECORE = 10 CORE = 20 POSTCORE = 30 PREGUI = 40 PREGUI1 = 50 GUI1 = 60 POSTGUI1 = 70 PREGUI2 = 80 GUI2 = 90 POSTGUI2 = 100 POSTGUI = 110 OUT_PREGUI = 10 OUT_PREGUI1 = 20 OUT_GUI1 = 30 OUT_POSTGUI1 = 40 OUT_PREGUI2 = 50 OUT_GUI2 = 60 OUT_POSTGUI2 = 70 OUT_POSTGUI = 80 OUT_PRECORE = 90 OUT_CORE = 100 OUT_POSTCORE = 110 class GlobalEventsDispatcher(object): def __init__(self): self.handlers = {} def register_event_handler(self, event_name, priority, handler): if event_name in self.handlers: handlers_list = self.handlers[event_name] i = 0 for i, h in enumerate(handlers_list): if priority < h[0]: break else: # no event with smaller prio found, put it at the end i += 1 handlers_list.insert(i, (priority, handler)) else: self.handlers[event_name] = [(priority, handler)] def remove_event_handler(self, event_name, priority, handler): if event_name in self.handlers: try: self.handlers[event_name].remove((priority, handler)) except ValueError as error: log.warning('''Function (%s) with priority "%s" never registered as handler of event "%s". Couldn\'t remove. Error: %s''' %(handler, priority, event_name, error)) def raise_event(self, event_name, *args, **kwargs): log.debug('%s Args: %s'%(event_name, str(args))) if event_name in self.handlers: node_processed = False for priority, handler in self.handlers[event_name]: try: if handler(*args, **kwargs): return True except NodeProcessed: node_processed = True except Exception: log.error('Error while running an event handler: %s', handler) traceback.print_exc() if node_processed: raise NodeProcessed gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/gpg.py000066400000000000000000000130561326020644600244160ustar00rootroot00000000000000## src/common/gpg.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2005 Alex Mauer ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2007 Stephan Erb ## Copyright (C) 2008 Jean-Marie Traissard ## Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import os import logging from gajim.common import app if app.HAVE_GPG: import gnupg gnupg.logger = logging.getLogger('gajim.c.gnupg') class GnuPG(gnupg.GPG): def __init__(self): use_agent = app.config.get('use_gpg_agent') gnupg.GPG.__init__(self, gpgbinary=app.GPG_BINARY, use_agent=use_agent) encoding = app.config.get('pgp_encoding') if encoding: self.encoding = encoding self.decode_errors = 'replace' self.passphrase = None self.always_trust = [] # list of keyID to always trust def encrypt(self, str_, recipients, always_trust=False): trust = always_trust if not trust: # check if we trust all keys trust = True for key in recipients: if key not in self.always_trust: trust = False if not trust: # check that we'll be able to encrypt result = super(GnuPG, self).list_keys(keys=recipients) for key in result: if key['trust'] not in ('f', 'u'): if key['keyid'][-8:] not in self.always_trust: return '', 'NOT_TRUSTED ' + key['keyid'][-8:] else: trust = True result = super(GnuPG, self).encrypt(str_.encode('utf8'), recipients, always_trust=trust, passphrase=self.passphrase) if result.ok: error = '' else: error = result.status return self._stripHeaderFooter(str(result)), error def decrypt(self, str_, keyID): data = self._addHeaderFooter(str_, 'MESSAGE') result = super(GnuPG, self).decrypt(data.encode('utf8'), passphrase=self.passphrase) return result.data.decode('utf8') def sign(self, str_, keyID): result = super(GnuPG, self).sign(str_.encode('utf8'), keyid=keyID, detach=True, passphrase=self.passphrase) if result.fingerprint: return self._stripHeaderFooter(str(result)) if hasattr(result, 'status') and result.status == 'key expired': return 'KEYEXPIRED' return 'BAD_PASSPHRASE' def verify(self, str_, sign): if str_ is None: return '' # Hash algorithm is not transfered in the signed presence stanza so try # all algorithms. Text name for hash algorithms from RFC 4880 - section 9.4 hash_algorithms = ['SHA512', 'SHA384', 'SHA256', 'SHA224', 'SHA1', 'RIPEMD160'] for algo in hash_algorithms: data = os.linesep.join( ['-----BEGIN PGP SIGNED MESSAGE-----', 'Hash: ' + algo, '', str_, self._addHeaderFooter(sign, 'SIGNATURE')] ) result = super(GnuPG, self).verify(data.encode('utf8')) if result.valid: return result.key_id return '' def get_key(self, keyID): return super(GnuPG, self).list_keys(keys=[keyID]) def get_keys(self, secret=False): keys = {} result = super(GnuPG, self).list_keys(secret=secret) for key in result: # Take first not empty uid keys[key['keyid'][8:]] = [uid for uid in key['uids'] if uid][0] return keys def get_secret_keys(self): return self.get_keys(True) def _stripHeaderFooter(self, data): """ Remove header and footer from data """ if not data: return '' lines = data.splitlines() while lines[0] != '': lines.remove(lines[0]) while lines[0] == '': lines.remove(lines[0]) i = 0 for line in lines: if line: if line[0] == '-': break i = i+1 line = '\n'.join(lines[0:i]) return line def _addHeaderFooter(self, data, type_): """ Add header and footer from data """ out = "-----BEGIN PGP %s-----" % type_ + os.linesep out = out + "Version: PGP" + os.linesep out = out + os.linesep out = out + data + os.linesep out = out + "-----END PGP %s-----" % type_ + os.linesep return out gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/helpers.py000066400000000000000000001564251326020644600253130ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/helpers.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2005-2006 Dimitur Kirov ## Nikos Kouremenos ## Copyright (C) 2006 Alex Mauer ## Copyright (C) 2006-2007 Travis Shirk ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2007 Lukas Petrovicky ## James Newton ## Julien Pivotto ## Copyright (C) 2007-2008 Stephan Erb ## Copyright (C) 2008 Brendan Taylor ## Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import sys import re import os import subprocess import urllib import webbrowser import errno import select import base64 import hashlib import shlex from gajim.common import caps_cache import socket import time from datetime import datetime, timedelta, timezone, tzinfo from distutils.version import LooseVersion as V from encodings.punycode import punycode_encode from string import Template import nbxmpp from gajim.common.i18n import Q_ from gajim.common.i18n import ngettext try: import precis_i18n.codec HAS_PRECIS_I18N = True except ImportError: HAS_PRECIS_I18N = False try: import idna HAS_IDNA = True except ImportError: HAS_IDNA = False HAS_SOUND = True if sys.platform == 'win32': try: import winsound # windows-only built-in module for playing wav except ImportError: HAS_SOUND = False print('Gajim is not able to playback sound because' 'pywin32 is missing', file=sys.stderr) elif sys.platform == 'darwin': try: from AppKit import NSSound except ImportError: HAS_SOUND = False print('Gajim is not able to playback sound because' 'pyobjc is missing', file=sys.stderr) try: import wave # posix-only fallback wav playback import ossaudiodev as oss except Exception: pass import logging log = logging.getLogger('gajim.c.helpers') special_groups = (_('Transports'), _('Not in Roster'), _('Observers'), _('Groupchats')) # Patterns for DateTime parsing XEP-0082 PATTERN_DATETIME = re.compile( r'([0-9]{4}-[0-9]{2}-[0-9]{2})' r'T' r'([0-9]{2}:[0-9]{2}:[0-9]{2})' r'(\.[0-9]{0,6})?' r'(?:[0-9]+)?' r'(?:(Z)|(?:([-+][0-9]{2}):([0-9]{2})))$' ) PATTERN_DELAY = re.compile( r'([0-9]{4}-[0-9]{2}-[0-9]{2})' r'T' r'([0-9]{2}:[0-9]{2}:[0-9]{2})' r'(\.[0-9]{0,6})?' r'(?:[0-9]+)?' r'(?:(Z)|(?:([-+][0]{2}):([0]{2})))$' ) ZERO = timedelta(0) HOUR = timedelta(hours=1) SECOND = timedelta(seconds=1) STDOFFSET = timedelta(seconds=-time.timezone) if time.daylight: DSTOFFSET = timedelta(seconds=-time.altzone) else: DSTOFFSET = STDOFFSET DSTDIFF = DSTOFFSET - STDOFFSET class LocalTimezone(tzinfo): ''' A class capturing the platform's idea of local time. May result in wrong values on historical times in timezones where UTC offset and/or the DST rules had changed in the past. ''' def fromutc(self, dt): assert dt.tzinfo is self stamp = (dt - datetime(1970, 1, 1, tzinfo=self)) // SECOND args = time.localtime(stamp)[:6] dst_diff = DSTDIFF // SECOND # Detect fold fold = (args == time.localtime(stamp - dst_diff)) return datetime(*args, microsecond=dt.microsecond, tzinfo=self, fold=fold) def utcoffset(self, dt): if self._isdst(dt): return DSTOFFSET else: return STDOFFSET def dst(self, dt): if self._isdst(dt): return DSTDIFF else: return ZERO def tzname(self, dt): return 'local' def _isdst(self, dt): tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday(), 0, 0) stamp = time.mktime(tt) tt = time.localtime(stamp) return tt.tm_isdst > 0 class InvalidFormat(Exception): pass def decompose_jid(jidstring): user = None server = None resource = None # Search for delimiters user_sep = jidstring.find('@') res_sep = jidstring.find('/') if user_sep == -1: if res_sep == -1: # host server = jidstring else: # host/resource server = jidstring[0:res_sep] resource = jidstring[res_sep + 1:] else: if res_sep == -1: # user@host user = jidstring[0:user_sep] server = jidstring[user_sep + 1:] else: if user_sep < res_sep: # user@host/resource user = jidstring[0:user_sep] server = jidstring[user_sep + 1:user_sep + (res_sep - user_sep)] resource = jidstring[res_sep + 1:] else: # server/resource (with an @ in resource) server = jidstring[0:res_sep] resource = jidstring[res_sep + 1:] return user, server, resource def parse_jid(jidstring): """ Perform stringprep on all JID fragments from a string and return the full jid """ # This function comes from http://svn.twistedmatrix.com/cvs/trunk/twisted/words/protocols/jabber/jid.py return prep(*decompose_jid(jidstring)) def idn_to_ascii(host): """ Convert IDN (Internationalized Domain Names) to ACE (ASCII-compatible encoding) """ from encodings import idna labels = idna.dots.split(host) converted_labels = [] for label in labels: if label: converted_labels.append(idna.ToASCII(label).decode('utf-8')) else: converted_labels.append('') return ".".join(converted_labels) def ascii_to_idn(host): """ Convert ACE (ASCII-compatible encoding) to IDN (Internationalized Domain Names) """ from encodings import idna labels = idna.dots.split(host) converted_labels = [] for label in labels: converted_labels.append(idna.ToUnicode(label)) return ".".join(converted_labels) def puny_encode_url(url): _url = url if '//' not in _url: _url = '//' + _url try: o = urllib.parse.urlparse(_url) p_loc = idn_to_ascii(o.netloc) except Exception: log.debug('urlparse failed: %s', url) return False return url.replace(o.netloc, p_loc) def parse_resource(resource): """ Perform stringprep on resource and return it """ if resource: try: if HAS_PRECIS_I18N: return resource.encode('Nickname').decode('utf-8') else: from nbxmpp.stringprepare import resourceprep return resourceprep.prepare(resource) except UnicodeError: raise InvalidFormat('Invalid character in resource.') def prep(user, server, resource): """ Perform stringprep on all JID fragments and return the full jid """ # This function comes from #http://svn.twistedmatrix.com/cvs/trunk/twisted/words/protocols/jabber/jid.py ip_address = False try: socket.inet_aton(server) ip_address = True except socket.error: pass if not ip_address and hasattr(socket, 'inet_pton'): try: socket.inet_pton(socket.AF_INET6, server.strip('[]')) server = '[%s]' % server.strip('[]') ip_address = True except (socket.error, ValueError): pass if not ip_address: if server is not None: if server.endswith('.'): # RFC7622, 3.2 server = server[:-1] if len(server) < 1 or len(server.encode('utf-8')) > 1023: raise InvalidFormat(_('Server must be between 1 and 1023 bytes')) try: if HAS_IDNA: server = idna.encode(server).decode('utf-8') else: from nbxmpp.stringprepare import nameprep server = nameprep.prepare(server) except UnicodeError: raise InvalidFormat(_('Invalid character in hostname.')) else: raise InvalidFormat(_('Server address required.')) if user is not None: if len(user) < 1 or len(user.encode('utf-8')) > 1023: raise InvalidFormat(_('Username must be between 1 and 1023 bytes')) try: if HAS_PRECIS_I18N: user = user.encode('UsernameCaseMapped').decode('utf-8') else: from nbxmpp.stringprepare import nodeprep user = nodeprep.prepare(user) except UnicodeError: raise InvalidFormat(_('Invalid character in username.')) else: user = None if resource is not None: if len(resource) < 1 or len(resource.encode('utf-8')) > 1023: raise InvalidFormat(_('Resource must be between 1 and 1023 bytes')) try: if HAS_PRECIS_I18N: resource = resource.encode('OpaqueString').decode('utf-8') else: from nbxmpp.stringprepare import resourceprep resource = resourceprep.prepare(resource) except UnicodeError: raise InvalidFormat(_('Invalid character in resource.')) else: resource = None if user: if resource: return '%s@%s/%s' % (user, server, resource) else: return '%s@%s' % (user, server) else: if resource: return '%s/%s' % (server, resource) else: return server def windowsify(s): if os.name == 'nt': return s.capitalize() return s def temp_failure_retry(func, *args, **kwargs): while True: try: return func(*args, **kwargs) except (os.error, IOError, select.error) as ex: if ex.errno == errno.EINTR: continue else: raise def get_uf_show(show, use_mnemonic = False): """ Return a userfriendly string for dnd/xa/chat and make all strings translatable If use_mnemonic is True, it adds _ so GUI should call with True for accessibility issues """ if show == 'dnd': if use_mnemonic: uf_show = _('_Busy') else: uf_show = _('Busy') elif show == 'xa': if use_mnemonic: uf_show = _('_Not Available') else: uf_show = _('Not Available') elif show == 'chat': if use_mnemonic: uf_show = _('_Free for Chat') else: uf_show = _('Free for Chat') elif show == 'online': if use_mnemonic: uf_show = Q_('?user status:_Available') else: uf_show = Q_('?user status:Available') elif show == 'connecting': uf_show = _('Connecting') elif show == 'away': if use_mnemonic: uf_show = _('A_way') else: uf_show = _('Away') elif show == 'offline': if use_mnemonic: uf_show = _('_Offline') else: uf_show = _('Offline') elif show == 'invisible': if use_mnemonic: uf_show = _('_Invisible') else: uf_show = _('Invisible') elif show == 'not in roster': uf_show = _('Not in Roster') elif show == 'requested': uf_show = Q_('?contact has status:Unknown') else: uf_show = Q_('?contact has status:Has errors') return uf_show def get_css_show_color(show): if show in ('online', 'chat', 'invisible'): return 'status-online' elif show in ('offline', 'not in roster', 'requested'): return None elif show in ('xa', 'dnd'): return 'status-dnd' elif show in ('away'): return 'status-away' def get_uf_sub(sub): if sub == 'none': uf_sub = Q_('?Subscription we already have:None') elif sub == 'to': uf_sub = _('To') elif sub == 'from': uf_sub = _('From') elif sub == 'both': uf_sub = _('Both') else: uf_sub = _('Unknown') return uf_sub def get_uf_ask(ask): if ask is None: uf_ask = Q_('?Ask (for Subscription):None') elif ask == 'subscribe': uf_ask = _('Subscribe') else: uf_ask = ask return uf_ask def get_uf_role(role, plural = False): ''' plural determines if you get Moderators or Moderator''' if role == 'none': role_name = Q_('?Group Chat Contact Role:None') elif role == 'moderator': if plural: role_name = _('Moderators') else: role_name = _('Moderator') elif role == 'participant': if plural: role_name = _('Participants') else: role_name = _('Participant') elif role == 'visitor': if plural: role_name = _('Visitors') else: role_name = _('Visitor') return role_name def get_uf_affiliation(affiliation): '''Get a nice and translated affilition for muc''' if affiliation == 'none': affiliation_name = Q_('?Group Chat Contact Affiliation:None') elif affiliation == 'owner': affiliation_name = _('Owner') elif affiliation == 'admin': affiliation_name = _('Administrator') elif affiliation == 'member': affiliation_name = _('Member') else: # Argl ! An unknown affiliation ! affiliation_name = affiliation.capitalize() return affiliation_name def get_sorted_keys(adict): keys = sorted(adict.keys()) return keys def to_one_line(msg): msg = msg.replace('\\', '\\\\') msg = msg.replace('\n', '\\n') # s1 = 'test\ntest\\ntest' # s11 = s1.replace('\\', '\\\\') # s12 = s11.replace('\n', '\\n') # s12 # 'test\\ntest\\\\ntest' return msg def from_one_line(msg): # (? 48: hash = hashlib.md5(filename.encode('utf-8')) filename = base64.b64encode(hash.digest()).decode('utf-8') # make it latin chars only filename = punycode_encode(filename).decode('utf-8') filename = filename.replace('/', '_') if os.name == 'nt': filename = filename.replace('?', '_').replace(':', '_')\ .replace('\\', '_').replace('"', "'").replace('|', '_')\ .replace('*', '_').replace('<', '_').replace('>', '_') return filename def reduce_chars_newlines(text, max_chars = 0, max_lines = 0): """ Cut the chars after 'max_chars' on each line and show only the first 'max_lines' If any of the params is not present (None or 0) the action on it is not performed """ def _cut_if_long(string): if len(string) > max_chars: string = string[:max_chars - 3] + '…' return string if max_lines == 0: lines = text.split('\n') else: lines = text.split('\n', max_lines)[:max_lines] if max_chars > 0: if lines: lines = [_cut_if_long(e) for e in lines] if lines: reduced_text = '\n'.join(lines) if reduced_text != text: reduced_text += '…' else: reduced_text = '' return reduced_text def get_account_status(account): status = reduce_chars_newlines(account['status_line'], 100, 1) return status def datetime_tuple(timestamp): """ Convert timestamp using strptime and the format: %Y%m%dT%H:%M:%S Because of various datetime formats are used the following exceptions are handled: - Optional milliseconds appened to the string are removed - Optional Z (that means UTC) appened to the string are removed - XEP-082 datetime strings have all '-' cahrs removed to meet the above format. """ date, tim = timestamp.split('T', 1) date = date.replace('-', '') tim = tim.replace('z', '') tim = tim.replace('Z', '') zone = None if '+' in tim: sign = -1 tim, zone = tim.split('+', 1) if '-' in tim: sign = 1 tim, zone = tim.split('-', 1) tim = tim.split('.')[0] tim = time.strptime(date + 'T' + tim, '%Y%m%dT%H:%M:%S') if zone: zone = zone.replace(':', '') tim = datetime.fromtimestamp(time.mktime(tim)) if len(zone) > 2: zone = time.strptime(zone, '%H%M') else: zone = time.strptime(zone, '%H') zone = timedelta(hours=zone.tm_hour, minutes=zone.tm_min) tim += zone * sign tim = tim.timetuple() return tim def parse_datetime(timestring, check_utc=False, convert='utc', epoch=False): ''' Parse a XEP-0082 DateTime Profile String https://xmpp.org/extensions/xep-0082.html :param timestring: a XEP-0082 DateTime profile formated string :param check_utc: if True, returns None if timestring is not a timestring expressing UTC :param convert: convert the given timestring to utc or local time :param epoch: if True, returns the time in epoch Examples: '2017-11-05T01:41:20Z' '2017-11-05T01:41:20.123Z' '2017-11-05T01:41:20.123+05:00' return a datetime or epoch ''' if convert not in (None, 'utc', 'local'): raise TypeError('"%s" is not a valid value for convert') if check_utc: match = PATTERN_DELAY.match(timestring) else: match = PATTERN_DATETIME.match(timestring) if match: timestring = ''.join(match.groups('')) strformat = '%Y-%m-%d%H:%M:%S%z' if match.group(3): # Fractional second addendum to Time strformat = '%Y-%m-%d%H:%M:%S.%f%z' if match.group(4): # UTC string denoted by addition of the character 'Z' timestring = timestring[:-1] + '+0000' try: date_time = datetime.strptime(timestring, strformat) except ValueError: pass else: if not check_utc and convert == 'utc': date_time = date_time.astimezone(timezone.utc) if convert == 'local': date_time = date_time.astimezone(LocalTimezone()) if epoch: return date_time.timestamp() return date_time return None from gajim.common import app if app.HAVE_PYCURL: import pycurl from io import StringIO def convert_bytes(string): suffix = '' # IEC standard says KiB = 1024 bytes KB = 1000 bytes # but do we use the standard? use_kib_mib = app.config.get('use_kib_mib') align = 1024. bytes_ = float(string) if bytes_ >= align: bytes_ = round(bytes_/align, 1) if bytes_ >= align: bytes_ = round(bytes_/align, 1) if bytes_ >= align: bytes_ = round(bytes_/align, 1) if use_kib_mib: #GiB means gibibyte suffix = _('%s GiB') else: #GB means gigabyte suffix = _('%s GB') else: if use_kib_mib: #MiB means mibibyte suffix = _('%s MiB') else: #MB means megabyte suffix = _('%s MB') else: if use_kib_mib: #KiB means kibibyte suffix = _('%s KiB') else: #KB means kilo bytes suffix = _('%s KB') else: #B means bytes suffix = _('%s B') return suffix % str(bytes_) def get_contact_dict_for_account(account): """ Create a dict of jid, nick -> contact with all contacts of account. Can be used for completion lists """ contacts_dict = {} for jid in app.contacts.get_jid_list(account): contact = app.contacts.get_contact_with_highest_priority(account, jid) contacts_dict[jid] = contact name = contact.name if name in contacts_dict: contact1 = contacts_dict[name] del contacts_dict[name] contacts_dict['%s (%s)' % (name, contact1.jid)] = contact1 contacts_dict['%s (%s)' % (name, jid)] = contact elif contact.name: if contact.name == app.get_nick_from_jid(jid): del contacts_dict[jid] contacts_dict[name] = contact return contacts_dict def launch_browser_mailer(kind, uri): # kind = 'url' or 'mail' if kind == 'url' and uri.startswith('file://'): launch_file_manager(uri) return if kind in ('mail', 'sth_at_sth') and not uri.startswith('mailto:'): uri = 'mailto:' + uri if kind == 'url' and uri.startswith('www.'): uri = 'http://' + uri if not app.config.get('autodetect_browser_mailer'): if kind == 'url': command = app.config.get('custombrowser') elif kind in ('mail', 'sth_at_sth'): command = app.config.get('custommailapp') if command == '': # if no app is configured return command = build_command(command, uri) try: exec_command(command) except Exception: pass else: webbrowser.open(uri) def launch_file_manager(path_to_open): if not path_to_open.startswith('file://'): uri = 'file://' + path_to_open if os.name == 'nt': try: os.startfile(path_to_open) # if pywin32 is installed we open except Exception: pass else: if not app.config.get('autodetect_browser_mailer'): command = app.config.get('custom_file_manager') if command == '': # if no app is configured return else: command = 'xdg-open' command = build_command(command, path_to_open) try: exec_command(command) except Exception: pass def play_sound(event): if not app.config.get('sounds_on'): return path_to_soundfile = app.config.get_per('soundevents', event, 'path') play_sound_file(path_to_soundfile) def check_soundfile_path(file_, dirs=(app.gajimpaths.data_root, app.DATA_DIR)): """ Check if the sound file exists :param file_: the file to check, absolute or relative to 'dirs' path :param dirs: list of knows paths to fallback if the file doesn't exists (eg: ~/.gajim/sounds/, DATADIR/sounds...). :return the path to file or None if it doesn't exists. """ if not file_: return None elif os.path.exists(file_): return file_ for d in dirs: d = os.path.join(d, 'sounds', file_) if os.path.exists(d): return d return None def strip_soundfile_path(file_, dirs=(app.gajimpaths.data_root, app.DATA_DIR), abs=True): """ Remove knowns paths from a sound file Filechooser returns absolute path. If path is a known fallback path, we remove it. So config have no hardcoded path to DATA_DIR and text in textfield is shorther. param: file_: the filename to strip. param: dirs: list of knowns paths from which the filename should be stripped. param: abs: force absolute path on dirs """ if not file_: return None name = os.path.basename(file_) for d in dirs: d = os.path.join(d, 'sounds', name) if abs: d = os.path.abspath(d) if file_ == d: return name return file_ def play_sound_file(path_to_soundfile): if path_to_soundfile == 'beep': exec_command('beep') return path_to_soundfile = check_soundfile_path(path_to_soundfile) if path_to_soundfile is None: return elif sys.platform == 'win32' and HAS_SOUND: try: winsound.PlaySound(path_to_soundfile, winsound.SND_FILENAME|winsound.SND_ASYNC) except Exception: log.exception('Sound Playback Error') elif sys.platform == 'linux': if app.config.get('soundplayer') == '': def _oss_play(): sndfile = wave.open(path_to_soundfile, 'rb') (nc, sw, fr, nf, comptype, compname) = sndfile.getparams() dev = oss.open('/dev/dsp', 'w') dev.setparameters(sw * 8, nc, fr) dev.write(sndfile.readframes(nf)) sndfile.close() dev.close() app.thread_interface(_oss_play) return player = app.config.get('soundplayer') command = build_command(player, path_to_soundfile) exec_command(command) elif sys.platform == 'darwin' and HAS_SOUND: sound = NSSound.alloc() sound.initWithContentsOfFile_byReference_(path_to_soundfile, True) sound.play() def get_global_show(): maxi = 0 for account in app.connections: if not app.config.get_per('accounts', account, 'sync_with_global_status'): continue connected = app.connections[account].connected if connected > maxi: maxi = connected return app.SHOW_LIST[maxi] def get_global_status(): maxi = 0 for account in app.connections: if not app.config.get_per('accounts', account, 'sync_with_global_status'): continue connected = app.connections[account].connected if connected > maxi: maxi = connected status = app.connections[account].status return status def statuses_unified(): """ Test if all statuses are the same """ reference = None for account in app.connections: if not app.config.get_per('accounts', account, 'sync_with_global_status'): continue if reference is None: reference = app.connections[account].connected elif reference != app.connections[account].connected: return False return True def get_icon_name_to_show(contact, account = None): """ Get the icon name to show in online, away, requested, etc """ if account and app.events.get_nb_roster_events(account, contact.jid): return 'event' if account and app.events.get_nb_roster_events(account, contact.get_full_jid()): return 'event' if account and account in app.interface.minimized_controls and \ contact.jid in app.interface.minimized_controls[account] and app.interface.\ minimized_controls[account][contact.jid].get_nb_unread_pm() > 0: return 'event' if account and contact.jid in app.gc_connected[account]: if app.gc_connected[account][contact.jid]: return 'muc_active' else: return 'muc_inactive' if contact.jid.find('@') <= 0: # if not '@' or '@' starts the jid ==> agent return contact.show if contact.sub in ('both', 'to'): return contact.show if contact.ask == 'subscribe': return 'requested' transport = app.get_transport_name_from_jid(contact.jid) if transport: return contact.show if contact.show in app.SHOW_LIST: return contact.show return 'not in roster' def get_full_jid_from_iq(iq_obj): """ Return the full jid (with resource) from an iq """ return parse_jid(str(iq_obj.getFrom())) def get_jid_from_iq(iq_obj): """ Return the jid (without resource) from an iq """ jid = get_full_jid_from_iq(iq_obj) return app.get_jid_without_resource(jid) def get_auth_sha(sid, initiator, target): """ Return sha of sid + initiator + target used for proxy auth """ return hashlib.sha1(("%s%s%s" % (sid, initiator, target)).encode('utf-8')).\ hexdigest() def remove_invalid_xml_chars(string): if string: string = re.sub(app.interface.invalid_XML_chars_re, '', string) return string def get_random_string_16(): """ Create random string of length 16 """ rng = list(range(65, 90)) rng.extend(range(48, 57)) char_sequence = [chr(e) for e in rng] from random import sample return ''.join(sample(char_sequence, 16)) def get_os_info(): if app.os_info: return app.os_info app.os_info = 'N/A' if os.name == 'nt' or sys.platform == 'darwin': import platform app.os_info = platform.system() + " " + platform.release() elif os.name == 'posix': try: import distro app.os_info = distro.name(pretty=True) except ImportError: import platform app.os_info = platform.system() return app.os_info def allow_showing_notification(account, type_='notify_on_new_message', is_first_message=True): """ Is it allowed to show nofication? Check OUR status and if we allow notifications for that status type is the option that need to be True e.g.: notify_on_signing is_first_message: set it to false when it's not the first message """ if type_ and (not app.config.get(type_) or not is_first_message): return False if app.config.get('autopopupaway'): # always show notification return True if app.connections[account].connected in (2, 3): # we're online or chat return True return False def allow_popup_window(account): """ Is it allowed to popup windows? """ autopopup = app.config.get('autopopup') autopopupaway = app.config.get('autopopupaway') if autopopup and (autopopupaway or \ app.connections[account].connected in (2, 3)): # we're online or chat return True return False def allow_sound_notification(account, sound_event): if app.config.get('sounddnd') or app.connections[account].connected != \ app.SHOW_LIST.index('dnd') and app.config.get_per('soundevents', sound_event, 'enabled'): return True return False def get_chat_control(account, contact): full_jid_with_resource = contact.jid if contact.resource: full_jid_with_resource += '/' + contact.resource highest_contact = app.contacts.get_contact_with_highest_priority( account, contact.jid) # Look for a chat control that has the given resource, or default to # one without resource ctrl = app.interface.msg_win_mgr.get_control(full_jid_with_resource, account) if ctrl: return ctrl elif highest_contact and highest_contact.resource and \ contact.resource != highest_contact.resource: return None else: # unknown contact or offline message return app.interface.msg_win_mgr.get_control(contact.jid, account) def get_notification_icon_tooltip_dict(): """ Return a dict of the form {acct: {'show': show, 'message': message, 'event_lines': [list of text lines to show in tooltip]} """ # How many events must there be before they're shown summarized, not per-user max_ungrouped_events = 10 accounts = get_accounts_info() # Gather events. (With accounts, when there are more.) for account in accounts: account_name = account['name'] account['event_lines'] = [] # Gather events per-account pending_events = app.events.get_events(account = account_name) messages, non_messages, total_messages, total_non_messages = {}, {}, 0, 0 for jid in pending_events: for event in pending_events[jid]: if event.type_.count('file') > 0: # This is a non-messagee event. messages[jid] = non_messages.get(jid, 0) + 1 total_non_messages = total_non_messages + 1 else: # This is a message. messages[jid] = messages.get(jid, 0) + 1 total_messages = total_messages + 1 # Display unread messages numbers, if any if total_messages > 0: if total_messages > max_ungrouped_events: text = ngettext( '%d message pending', '%d messages pending', total_messages, total_messages, total_messages) account['event_lines'].append(text) else: for jid in messages.keys(): text = ngettext( '%d message pending', '%d messages pending', messages[jid], messages[jid], messages[jid]) contact = app.contacts.get_first_contact_from_jid( account['name'], jid) text += ' ' if jid in app.gc_connected[account['name']]: text += _('from room %s') % (jid) elif contact: name = contact.get_shown_name() text += _('from user %s') % (name) else: text += _('from %s') % (jid) account['event_lines'].append(text) # Display unseen events numbers, if any if total_non_messages > 0: if total_non_messages > max_ungrouped_events: text = ngettext( '%d event pending', '%d events pending', total_non_messages, total_non_messages,total_non_messages) account['event_lines'].append(text) else: for jid in non_messages.keys(): text = ngettext('%d event pending', '%d events pending', non_messages[jid], non_messages[jid], non_messages[jid]) text += ' ' + _('from user %s') % (jid) account[account]['event_lines'].append(text) return accounts def get_notification_icon_tooltip_text(): text = None # How many events must there be before they're shown summarized, not per-user # max_ungrouped_events = 10 # Character which should be used to indent in the tooltip. indent_with = ' ' accounts = get_notification_icon_tooltip_dict() if len(accounts) == 0: # No configured account return _('Gajim') # at least one account present # Is there more that one account? if len(accounts) == 1: show_more_accounts = False else: show_more_accounts = True # If there is only one account, its status is shown on the first line. if show_more_accounts: text = _('Gajim') else: text = _('Gajim - %s') % (get_account_status(accounts[0])) # Gather and display events. (With accounts, when there are more.) for account in accounts: account_name = account['name'] # Set account status, if not set above if (show_more_accounts): message = '\n' + indent_with + ' %s - %s' text += message % (account_name, get_account_status(account)) # Account list shown, messages need to be indented more indent_how = 2 else: # If no account list is shown, messages could have default indenting. indent_how = 1 for line in account['event_lines']: text += '\n' + indent_with * indent_how + ' ' text += line return text def get_accounts_info(): """ Helper for notification icon tooltip """ accounts = [] accounts_list = sorted(app.contacts.get_accounts()) for account in accounts_list: status_idx = app.connections[account].connected # uncomment the following to hide offline accounts # if status_idx == 0: continue status = app.SHOW_LIST[status_idx] message = app.connections[account].status single_line = get_uf_show(status) if message is None: message = '' else: message = message.strip() if message != '': single_line += ': ' + message accounts.append({'name': account, 'status_line': single_line, 'show': status, 'message': message}) return accounts def get_iconset_path(iconset): if os.path.isdir(os.path.join(app.DATA_DIR, 'iconsets', iconset)): return os.path.join(app.DATA_DIR, 'iconsets', iconset) elif os.path.isdir(os.path.join(app.MY_ICONSETS_PATH, iconset)): return os.path.join(app.MY_ICONSETS_PATH, iconset) def get_mood_iconset_path(iconset): if os.path.isdir(os.path.join(app.DATA_DIR, 'moods', iconset)): return os.path.join(app.DATA_DIR, 'moods', iconset) elif os.path.isdir(os.path.join(app.MY_MOOD_ICONSETS_PATH, iconset)): return os.path.join(app.MY_MOOD_ICONSETS_PATH, iconset) def get_activity_iconset_path(iconset): if os.path.isdir(os.path.join(app.DATA_DIR, 'activities', iconset)): return os.path.join(app.DATA_DIR, 'activities', iconset) elif os.path.isdir(os.path.join(app.MY_ACTIVITY_ICONSETS_PATH, iconset)): return os.path.join(app.MY_ACTIVITY_ICONSETS_PATH, iconset) def get_transport_path(transport): if os.path.isdir(os.path.join(app.DATA_DIR, 'iconsets', 'transports', transport)): return os.path.join(app.DATA_DIR, 'iconsets', 'transports', transport) elif os.path.isdir(os.path.join(app.MY_ICONSETS_PATH, 'transports', transport)): return os.path.join(app.MY_ICONSETS_PATH, 'transports', transport) # No transport folder found, use default jabber one return get_iconset_path(app.config.get('iconset')) def prepare_and_validate_gpg_keyID(account, jid, keyID): """ Return an eight char long keyID that can be used with for GPG encryption with this contact If the given keyID is None, return UNKNOWN; if the key does not match the assigned key XXXXXXXXMISMATCH is returned. If the key is trusted and not yet assigned, assign it. """ if app.connections[account].USE_GPG: if keyID and len(keyID) == 16: keyID = keyID[8:] attached_keys = app.config.get_per('accounts', account, 'attached_gpg_keys').split() if jid in attached_keys and keyID: attachedkeyID = attached_keys[attached_keys.index(jid) + 1] if attachedkeyID != keyID: # Get signing subkeys for the attached key subkeys = [] for key in app.connections[account].gpg.list_keys(): if key['keyid'][8:] == attachedkeyID: subkeys = [subkey[0][8:] for subkey in key['subkeys'] \ if subkey[1] == 's'] break if keyID not in subkeys: # Mismatch! Another gpg key was expected keyID += 'MISMATCH' elif jid in attached_keys: # An unsigned presence, just use the assigned key keyID = attached_keys[attached_keys.index(jid) + 1] elif keyID: full_key = app.connections[account].ask_gpg_keys(keyID=keyID) # Assign the corresponding key, if we have it in our keyring if full_key: for u in app.contacts.get_contacts(account, jid): u.keyID = keyID keys_str = app.config.get_per('accounts', account, 'attached_gpg_keys') keys_str += jid + ' ' + keyID + ' ' app.config.set_per('accounts', account, 'attached_gpg_keys', keys_str) elif keyID is None: keyID = 'UNKNOWN' return keyID def update_optional_features(account = None): if account: accounts = [account] else: accounts = [a for a in app.connections] for a in accounts: app.gajim_optional_features[a] = [] if app.config.get_per('accounts', a, 'subscribe_mood'): app.gajim_optional_features[a].append(nbxmpp.NS_MOOD + '+notify') if app.config.get_per('accounts', a, 'subscribe_activity'): app.gajim_optional_features[a].append(nbxmpp.NS_ACTIVITY + \ '+notify') if app.config.get_per('accounts', a, 'publish_tune'): app.gajim_optional_features[a].append(nbxmpp.NS_TUNE) if app.config.get_per('accounts', a, 'publish_location'): app.gajim_optional_features[a].append(nbxmpp.NS_LOCATION) if app.config.get_per('accounts', a, 'subscribe_tune'): app.gajim_optional_features[a].append(nbxmpp.NS_TUNE + '+notify') if app.config.get_per('accounts', a, 'subscribe_nick'): app.gajim_optional_features[a].append(nbxmpp.NS_NICK + '+notify') if app.config.get_per('accounts', a, 'subscribe_location'): app.gajim_optional_features[a].append(nbxmpp.NS_LOCATION + \ '+notify') if app.config.get('outgoing_chat_state_notifactions') != 'disabled': app.gajim_optional_features[a].append(nbxmpp.NS_CHATSTATES) if not app.config.get('ignore_incoming_xhtml'): app.gajim_optional_features[a].append(nbxmpp.NS_XHTML_IM) if app.HAVE_PYCRYPTO \ and app.config.get_per('accounts', a, 'enable_esessions'): app.gajim_optional_features[a].append(nbxmpp.NS_ESESSION) if app.config.get_per('accounts', a, 'answer_receipts'): app.gajim_optional_features[a].append(nbxmpp.NS_RECEIPTS) app.gajim_optional_features[a].append(nbxmpp.NS_JINGLE) if app.HAVE_FARSTREAM: app.gajim_optional_features[a].append(nbxmpp.NS_JINGLE_RTP) app.gajim_optional_features[a].append(nbxmpp.NS_JINGLE_RTP_AUDIO) app.gajim_optional_features[a].append(nbxmpp.NS_JINGLE_RTP_VIDEO) app.gajim_optional_features[a].append(nbxmpp.NS_JINGLE_ICE_UDP) app.gajim_optional_features[a].append( nbxmpp.NS_JINGLE_FILE_TRANSFER_5) app.gajim_optional_features[a].append(nbxmpp.NS_JINGLE_XTLS) app.gajim_optional_features[a].append(nbxmpp.NS_JINGLE_BYTESTREAM) app.gajim_optional_features[a].append(nbxmpp.NS_JINGLE_IBB) # Give plugins the possibility to add their features app.plugin_manager.extension_point('update_caps', a) app.caps_hash[a] = caps_cache.compute_caps_hash([app.gajim_identity], app.gajim_common_features + app.gajim_optional_features[a]) # re-send presence with new hash connected = app.connections[a].connected if connected > 1 and app.SHOW_LIST[connected] != 'invisible': app.connections[a].change_status(app.SHOW_LIST[connected], app.connections[a].status) def jid_is_blocked(account, jid): return ((jid in app.connections[account].blocked_contacts) or \ app.connections[account].blocked_all) def group_is_blocked(account, group): return ((group in app.connections[account].blocked_groups) or \ app.connections[account].blocked_all) def get_subscription_request_msg(account=None): s = app.config.get_per('accounts', account, 'subscription_request_msg') if s: return s s = _('I would like to add you to my contact list.') if account: s = _('Hello, I am $name.') + ' ' + s our_jid = app.get_jid_from_account(account) vcard = app.connections[account].own_vcard name = '' if vcard: if 'N' in vcard: if 'GIVEN' in vcard['N'] and 'FAMILY' in vcard['N']: name = vcard['N']['GIVEN'] + ' ' + vcard['N']['FAMILY'] if not name and 'FN' in vcard: name = vcard['FN'] nick = app.nicks[account] if name and nick: name += ' (%s)' % nick elif nick: name = nick s = Template(s).safe_substitute({'name': name}) return s def replace_dataform_media(form, stanza): import nbxmpp found = False for field in form.getTags('field'): for media in field.getTags('media'): for uri in media.getTags('uri'): uri_data = uri.getData() if uri_data.startswith('cid:'): uri_data = uri_data[4:] for data in stanza.getTags('data', namespace=nbxmpp.NS_BOB): if data.getAttr('cid') == uri_data: uri.setData(data.getData()) found = True return found def get_proxy_info(account): p = app.config.get_per('accounts', account, 'proxy') if not p: if app.config.get_per('accounts', account, 'use_env_http_proxy'): try: try: env_http_proxy = os.environ['HTTP_PROXY'] except Exception: env_http_proxy = os.environ['http_proxy'] env_http_proxy = env_http_proxy.strip('"') # Dispose of the http:// prefix env_http_proxy = env_http_proxy.split('://')[-1] env_http_proxy = env_http_proxy.split('@') if len(env_http_proxy) == 2: login = env_http_proxy[0].split(':') addr = env_http_proxy[1].split(':') else: login = ['', ''] addr = env_http_proxy[0].split(':') proxy = {'host': addr[0], 'type' : 'http', 'user':login[0]} if len(addr) == 2: proxy['port'] = addr[1] else: proxy['port'] = 3128 if len(login) == 2: proxy['pass'] = login[1] proxy['useauth'] = True else: proxy['pass'] = '' return proxy except Exception: proxy = None p = app.config.get('global_proxy') if p and p in app.config.get_per('proxies'): proxy = {} proxyptr = app.config.get_per('proxies', p) if not proxyptr: return proxy for key in proxyptr.keys(): proxy[key] = proxyptr[key] return proxy def _get_img_direct(attrs): """ Download an image. This function should be launched in a separated thread. """ mem = b'' alt = '' max_size = 2*1024*1024 if 'max_size' in attrs: max_size = attrs['max_size'] # Wait maximum 10s for connection socket.setdefaulttimeout(10) try: req = urllib.request.Request(attrs['src']) req.add_header('User-Agent', 'Gajim ' + app.version) f = urllib.request.urlopen(req) except Exception as ex: log.debug('Error loading image %s ' % attrs['src'] + str(ex)) pixbuf = None alt = attrs.get('alt', 'Broken image') else: # Wait 2s between each byte try: f.fp._sock.fp._sock.settimeout(2) except Exception: pass # On a slow internet connection with ~1000kbps you need ~10 seconds for 1 MB deadline = time.time() + (10 * (max_size / 1048576)) while True: if time.time() > deadline: log.debug('Timeout loading image %s ' % attrs['src']) mem = '' alt = attrs.get('alt', '') if alt: alt += '\n' alt += _('Timeout loading image') break try: temp = f.read(100) except socket.timeout as ex: log.debug('Timeout loading image %s ' % attrs['src'] + str(ex)) alt = attrs.get('alt', '') if alt: alt += '\n' alt += _('Timeout loading image') break if temp: mem += temp else: break if len(mem) > max_size: alt = attrs.get('alt', '') if alt: alt += '\n' alt += _('Image is too big') break f.close() return (mem, alt) def _get_img_proxy(attrs, proxy): """ Download an image through a proxy. This function should be launched in a separated thread. """ if not app.HAVE_PYCURL: return '', _('PyCURL is not installed') mem, alt, max_size = '', '', 2*1024*1024 if 'max_size' in attrs: max_size = attrs['max_size'] try: b = StringIO() c = pycurl.Curl() c.setopt(pycurl.URL, attrs['src'].encode('utf-8')) c.setopt(pycurl.FOLLOWLOCATION, 1) # Wait maximum 10s for connection c.setopt(pycurl.CONNECTTIMEOUT, 10) # On a slow internet connection with ~1000kbps you need ~10 seconds for 1 MB c.setopt(pycurl.TIMEOUT, 10 * (max_size / 1048576)) c.setopt(pycurl.MAXFILESIZE, max_size) c.setopt(pycurl.WRITEFUNCTION, b.write) c.setopt(pycurl.USERAGENT, 'Gajim ' + app.version) # set proxy c.setopt(pycurl.PROXY, proxy['host'].encode('utf-8')) c.setopt(pycurl.PROXYPORT, proxy['port']) if proxy['useauth']: c.setopt(pycurl.PROXYUSERPWD, proxy['user'].encode('utf-8')\ + ':' + proxy['pass'].encode('utf-8')) c.setopt(pycurl.PROXYAUTH, pycurl.HTTPAUTH_ANY) if proxy['type'] == 'http': c.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_HTTP) elif proxy['type'] == 'socks5': c.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5) x = c.perform() c.close() t = b.getvalue() return (t, attrs.get('alt', '')) except pycurl.error as ex: alt = attrs.get('alt', '') if alt: alt += '\n' if ex.errno == pycurl.E_FILESIZE_EXCEEDED: alt += _('Image is too big') elif ex.errno == pycurl.E_OPERATION_TIMEOUTED: alt += _('Timeout loading image') else: alt += _('Error loading image') except Exception as ex: log.debug('Error loading image %s ' % attrs['src'] + str(ex)) pixbuf = None alt = attrs.get('alt', 'Broken image') return ('', alt) def download_image(account, attrs): proxy = get_proxy_info(account) if proxy and proxy['type'] in ('http', 'socks5'): return _get_img_proxy(attrs, proxy) return _get_img_direct(attrs) def version_condition(current_version, required_version): if V(current_version) < V(required_version): return False return True def get_available_emoticon_themes(): emoticons_themes = [] emoticons_data_path = os.path.join(app.DATA_DIR, 'emoticons') font_theme_path = os.path.join( app.DATA_DIR, 'emoticons', 'font-emoticons', 'emoticons_theme.py') folders = os.listdir(emoticons_data_path) if os.path.isdir(app.MY_EMOTS_PATH): folders += os.listdir(app.MY_EMOTS_PATH) file = 'emoticons_theme.py' if os.name == 'nt' and not os.path.exists(font_theme_path): # When starting Gajim from source .py files are available # We test this with font-emoticons and fallback to .pyc files otherwise file = 'emoticons_theme.pyc' for theme in folders: theme_path = os.path.join(emoticons_data_path, theme, file) if os.path.exists(theme_path): emoticons_themes.append(theme) emoticons_themes.sort() return emoticons_themes def get_emoticon_theme_path(theme): emoticons_data_path = os.path.join(app.DATA_DIR, 'emoticons', theme) if os.path.exists(emoticons_data_path): return emoticons_data_path emoticons_user_path = os.path.join(app.MY_EMOTS_PATH, theme) if os.path.exists(emoticons_user_path): return emoticons_user_path def add_to_mam_blacklist(jid): config_value = app.config.get('mam_blacklist') if not config_value: config_value = [jid] else: if jid in config_value: return config_value = config_value.split(',') config_value.append(jid) log.warning('Found not-compliant MUC. %s added to MAM Blacklist', jid) app.config.set('mam_blacklist', ','.join(config_value)) def get_mam_blacklist(): config_value = app.config.get('mam_blacklist') if not config_value: return [] return config_value.split(',') gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/httpupload.py000066400000000000000000000343411326020644600260250ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # This file is part of Gajim. # # Gajim 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; version 3 only. # # Gajim 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 Gajim. If not, see . import os import threading import ssl import urllib from urllib.request import Request, urlopen from urllib.parse import urlparse import io import mimetypes import logging import nbxmpp from nbxmpp import NS_HTTPUPLOAD from gi.repository import GLib from gajim.common import app from gajim.common import ged from gajim.common.connection_handlers_events import InformationEvent from gajim.common.connection_handlers_events import HTTPUploadProgressEvent from gajim.common.connection_handlers_events import MessageOutgoingEvent from gajim.common.connection_handlers_events import GcMessageOutgoingEvent if os.name == 'nt': import certifi log = logging.getLogger('gajim.c.httpupload') class ConnectionHTTPUpload: """ Implement HTTP File Upload (XEP-0363, https://xmpp.org/extensions/xep-0363.html) """ def __init__(self): self.httpupload = False self.encrypted_upload = False self.component = None self.max_file_size = None # maximum file size in bytes app.ged.register_event_handler('agent-info-received', ged.GUI1, self.handle_agent_info_received) app.ged.register_event_handler('stanza-message-outgoing', ged.OUT_PREGUI, self.handle_outgoing_stanza) app.ged.register_event_handler('gc-stanza-message-outgoing', ged.OUT_PREGUI, self.handle_outgoing_stanza) self.messages = [] def cleanup(self): app.ged.remove_event_handler('agent-info-received', ged.GUI1, self.handle_agent_info_received) app.ged.remove_event_handler('stanza-message-outgoing', ged.OUT_PREGUI, self.handle_outgoing_stanza) app.ged.remove_event_handler('gc-stanza-message-outgoing', ged.OUT_PREGUI, self.handle_outgoing_stanza) def handle_agent_info_received(self, event): if (NS_HTTPUPLOAD not in event.features or not app.jid_is_transport(event.jid)): return if not event.id_.startswith('Gajim_'): return account = event.conn.name if account != self.name: return self.component = event.jid for form in event.data: form_dict = form.asDict() if form_dict.get('FORM_TYPE', None) != NS_HTTPUPLOAD: continue size = form_dict.get('max-file-size', None) if size is not None: self.max_file_size = int(size) break if self.max_file_size is None: log.warning('%s does not provide maximum file size', account) else: log.info('%s has a maximum file size of: %s MiB', account, self.max_file_size/(1024*1024)) self.httpupload = True for ctrl in app.interface.msg_win_mgr.get_controls(acct=self.name): ctrl.update_actions() def handle_outgoing_stanza(self, event): if event.conn.name != self.name: return message = event.msg_iq.getTagData('body') if message and message in self.messages: self.messages.remove(message) # Add oob information before sending message to recipient, # to distinguish HTTP File Upload Link from pasted URL oob = event.msg_iq.addChild('x', namespace=nbxmpp.NS_X_OOB) oob.addChild('url').setData(message) if 'gajim' in event.additional_data: event.additional_data['gajim']['oob_url'] = message else: event.additional_data['gajim'] = {'oob_url': message} def check_file_before_transfer(self, path, encryption, contact, session, groupchat=False): if not path or not os.path.exists(path): return invalid_file = False stat = os.stat(path) if os.path.isfile(path): if stat[6] == 0: invalid_file = True msg = _('File is empty') else: invalid_file = True msg = _('File does not exist') if self.max_file_size is not None and \ stat.st_size > self.max_file_size: invalid_file = True size = GLib.format_size_full(self.max_file_size, GLib.FormatSizeFlags.IEC_UNITS) msg = _('File is too large, ' 'maximum allowed file size is: %s') % size if invalid_file: self.raise_information_event('open-file-error2', msg) return mime = mimetypes.MimeTypes().guess_type(path)[0] if not mime: mime = 'application/octet-stream' # fallback mime type log.info("Detected MIME type of file: %s", mime) try: file = File(path, contact, mime=mime, encryption=encryption, update_progress=self.raise_progress_event, session=session, groupchat=groupchat) app.interface.show_httpupload_progress(file) except Exception as error: log.exception('Error while loading file') self.raise_information_event('open-file-error2', str(error)) return if encryption is not None: app.interface.encrypt_file(file, self.request_slot) else: self.request_slot(file) @staticmethod def raise_progress_event(status, file, seen=None, total=None): app.nec.push_incoming_event(HTTPUploadProgressEvent( None, status=status, file=file, seen=seen, total=total)) @staticmethod def raise_information_event(dialog_name, args=None): app.nec.push_incoming_event(InformationEvent( None, dialog_name=dialog_name, args=args)) def request_slot(self, file): GLib.idle_add(self.raise_progress_event, 'request', file) iq = nbxmpp.Iq(typ='get', to=self.component) id_ = app.get_an_id() iq.setID(id_) request = iq.setTag(name="request", namespace=NS_HTTPUPLOAD) request.addChild('filename', payload=os.path.basename(file.path)) request.addChild('size', payload=file.size) request.addChild('content-type', payload=file.mime) log.info("Sending request for slot") app.connections[self.name].connection.SendAndCallForResponse( iq, self.received_slot, {'file': file}) @staticmethod def get_slot_error_message(stanza): tmp = stanza.getTag('error').getTag('file-too-large') if tmp is not None: max_file_size = int(tmp.getTag('max-file-size').getData()) return _('File is too large, maximum allowed file size is: %s') % \ GLib.format_size_full(max_file_size, GLib.FormatSizeFlags.IEC_UNITS) return stanza.getErrorMsg() def received_slot(self, conn, stanza, file): log.info("Received slot") if stanza.getType() == 'error': self.raise_progress_event('close', file) self.raise_information_event('request-upload-slot-error', self.get_slot_error_message(stanza)) log.error(stanza) return try: file.put = stanza.getTag("slot").getTag("put").getData() file.get = stanza.getTag("slot").getTag("get").getData() except Exception: log.error("Got unexpected stanza: %s", stanza) log.exception('Error') self.raise_progress_event('close', file) self.raise_information_event('request-upload-slot-error2') return if (urlparse(file.put).scheme != 'https' or urlparse(file.get).scheme != 'https'): self.raise_progress_event('close', file) self.raise_information_event('unsecure-error') return try: file.stream = StreamFileWithProgress(file) except Exception: log.exception('Error') self.raise_progress_event('close', file) self.raise_information_event('open-file-error') return log.info('Uploading file to %s', file.put) log.info('Please download from %s', file.get) thread = threading.Thread(target=self.upload_file, args=(file,)) thread.daemon = True thread.start() def upload_file(self, file): GLib.idle_add(self.raise_progress_event, 'upload', file) try: headers = {'User-Agent': 'Gajim %s' % app.version, 'Content-Type': file.mime, 'Content-Length': file.size} request = Request( file.put, data=file.stream, headers=headers, method='PUT') log.info("Opening Urllib upload request...") if not app.config.get_per('accounts', self.name, 'httpupload_verify'): context = ssl.create_default_context() context.check_hostname = False context.verify_mode = ssl.CERT_NONE log.warning('CERT Verification disabled') transfer = urlopen(request, timeout=30, context=context) else: if os.name == 'nt': transfer = urlopen( request, cafile=certifi.where(), timeout=30) else: transfer = urlopen(request, timeout=30) file.stream.close() log.info('Urllib upload request done, response code: %s', transfer.getcode()) GLib.idle_add(self.upload_complete, transfer.getcode(), file) return except UploadAbortedException as exc: log.info(exc) error_msg = exc except urllib.error.URLError as exc: if isinstance(exc.reason, ssl.SSLError): error_msg = exc.reason.reason if error_msg == 'CERTIFICATE_VERIFY_FAILED': log.exception('Certificate verify failed') else: log.exception('URLError') error_msg = exc.reason except Exception as exc: log.exception("Exception during upload") error_msg = exc GLib.idle_add(self.raise_progress_event, 'close', file) GLib.idle_add(self.on_upload_error, file, error_msg) def upload_complete(self, response_code, file): self.raise_progress_event('close', file) if 200 <= response_code < 300: log.info("Upload completed successfully") message = file.get if file.user_data: message += '#' + file.user_data message = self.convert_to_aegscm(message) else: self.messages.append(message) if file.groupchat: app.nec.push_outgoing_event(GcMessageOutgoingEvent( None, account=self.name, jid=file.contact.jid, message=message, automatic_message=False, session=file.session)) else: app.nec.push_outgoing_event(MessageOutgoingEvent( None, account=self.name, jid=file.contact.jid, message=message, keyID=file.keyID, type_='chat', automatic_message=False, session=file.session)) else: log.error('Got unexpected http upload response code: %s', response_code) self.raise_information_event('httpupload-response-error', response_code) def on_upload_error(self, file, reason): self.raise_progress_event('close', file) self.raise_information_event('httpupload-error', str(reason)) @staticmethod def convert_to_aegscm(url): return 'aesgcm' + url[5:] class File: def __init__(self, path, contact, **kwargs): for k, v in kwargs.items(): setattr(self, k, v) self.encrypted = False self.contact = contact self.keyID = None if hasattr(contact, 'keyID'): self.keyID = contact.keyID self.stream = None self.path = path self.put = None self.get = None self.data = None self.user_data = None self.size = None self.event = threading.Event() self.load_data() def load_data(self): with open(self.path, 'rb') as content: self.data = content.read() self.size = len(self.data) def get_data(self, full=False): if full: return io.BytesIO(self.data).getvalue() return io.BytesIO(self.data) class StreamFileWithProgress: def __init__(self, file): self.file = file self.event = file.event self.backing = file.get_data() self.backing.seek(0, os.SEEK_END) self._total = self.backing.tell() self.backing.seek(0) self._callback = file.update_progress self._seen = 0 def __len__(self): return self._total def read(self, size): if self.event.isSet(): raise UploadAbortedException data = self.backing.read(size) self._seen += len(data) if self._callback: GLib.idle_add(self._callback, 'update', self.file, self._seen, self._total) return data def close(self): return self.backing.close() class UploadAbortedException(Exception): def __str__(self): return "Upload Aborted" gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/i18n.py000066400000000000000000000074701326020644600244230ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/i18n.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2004 Vincent Hanquez ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2009 Benjamin Richter
## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import locale import gettext import os import unicodedata # May be changed after GTK is imported direction_mark = '\u200E' def paragraph_direction_mark(text): """ Determine paragraph writing direction according to http://www.unicode.org/reports/tr9/#The_Paragraph_Level Returns either Unicode LTR mark or RTL mark. """ for char in text: bidi = unicodedata.bidirectional(char) if bidi == 'L': return '\u200E' elif bidi == 'AL' or bidi == 'R': return '\u200F' return '\u200E' APP = 'gajim' # set '' so each part of the locale that should be modified is set # according to the environment variables locale.setlocale(locale.LC_ALL, '') ## For windows: set, if needed, a value in LANG environmental variable ## if os.name == 'nt': lang = os.getenv('LANG') if lang is None: default_lang = locale.getdefaultlocale()[0] # en_US, fr_FR, el_GR etc.. if default_lang: lang = default_lang if lang: os.environ['LANG'] = lang localedir = "../po" else: # try to find domain in localedir path = gettext.find(APP) if path: # extract localedir from localedir/language/LC_MESSAGES/domain.mo path, tail = os.path.split(path) path, tail = os.path.split(path) localedir, tail = os.path.split(path) else: # fallback to user locale base = os.getenv('XDG_DATA_HOME') if base is None or base[0] != '/': base = os.path.expanduser('~/.local/share') localedir = os.path.join(base, "locale") if hasattr(locale, 'bindtextdomain'): locale.bindtextdomain(APP, localedir) gettext.install(APP, localedir) if gettext._translations: _translation = list(gettext._translations.values())[0] else: _translation = gettext.NullTranslations() def Q_(text): """ Translate the given text, optionally qualified with a special construction, which will help translators to disambiguate between same terms, but in different contexts. When translated text is returned - this rudimentary construction will be stripped off, if it's present. Here is the construction to use: Q_("?vcard:Unknown") Everything between ? and : - is the qualifier to convey the context to the translators. Everything after : - is the text itself. """ text = _(text) if text.startswith('?'): qualifier, text = text.split(':', 1) return text def ngettext(s_sing, s_plural, n, replace_sing = None, replace_plural = None): """ Use as: i18n.ngettext('leave room %s', 'leave rooms %s', len(rooms), 'a', 'a, b, c') In other words this is a hack to ngettext() to support %s %d etc.. """ text = _translation.ngettext(s_sing, s_plural, n) if n == 1 and replace_sing is not None: text = text % replace_sing elif n > 1 and replace_plural is not None: text = text % replace_plural return text gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/idle.py000066400000000000000000000061671326020644600245630ustar00rootroot00000000000000## src/common/idle.py ## ## (C) 2008 Thorsten P. 'dGhvcnN0ZW5wIEFUIHltYWlsIGNvbQ==\n'.decode("base64") ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . import ctypes import ctypes.util class XScreenSaverInfo(ctypes.Structure): _fields_ = [ ('window', ctypes.c_ulong), ('state', ctypes.c_int), ('kind', ctypes.c_int), ('til_or_since', ctypes.c_ulong), ('idle', ctypes.c_ulong), ('eventMask', ctypes.c_ulong) ] XScreenSaverInfo_p = ctypes.POINTER(XScreenSaverInfo) display_p = ctypes.c_void_p xid = ctypes.c_ulong c_int_p = ctypes.POINTER(ctypes.c_int) try: libX11path = ctypes.util.find_library('X11') if libX11path == None: raise OSError('libX11 could not be found.') libX11 = ctypes.cdll.LoadLibrary(libX11path) libX11.XOpenDisplay.restype = display_p libX11.XOpenDisplay.argtypes = ctypes.c_char_p, libX11.XDefaultRootWindow.restype = xid libX11.XDefaultRootWindow.argtypes = display_p, libXsspath = ctypes.util.find_library('Xss') if libXsspath == None: raise OSError('libXss could not be found.') libXss = ctypes.cdll.LoadLibrary(libXsspath) libXss.XScreenSaverQueryExtension.argtypes = display_p, c_int_p, c_int_p libXss.XScreenSaverAllocInfo.restype = XScreenSaverInfo_p libXss.XScreenSaverQueryInfo.argtypes = (display_p, xid, XScreenSaverInfo_p) dpy_p = libX11.XOpenDisplay(None) if dpy_p == None: raise OSError('Could not open X Display.') _event_basep = ctypes.c_int() _error_basep = ctypes.c_int() if libXss.XScreenSaverQueryExtension(dpy_p, ctypes.byref(_event_basep), ctypes.byref(_error_basep)) == 0: raise OSError('XScreenSaver Extension not available on display.') xss_info_p = libXss.XScreenSaverAllocInfo() if xss_info_p == None: raise OSError('XScreenSaverAllocInfo: Out of Memory.') rootwindow = libX11.XDefaultRootWindow(dpy_p) xss_available = True except OSError: # Logging? xss_available = False def getIdleSec(): global xss_available """ Return the idle time in seconds """ if not xss_available: return 0 if libXss.XScreenSaverQueryInfo(dpy_p, rootwindow, xss_info_p) == 0: return 0 else: return int(xss_info_p.contents.idle) / 1000 def close(): global xss_available if xss_available: libX11.XFree(xss_info_p) libX11.XCloseDisplay(dpy_p) xss_available = False if __name__ == '__main__': import time time.sleep(2.1) print(getIdleSec()) close() print(getIdleSec()) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/jingle.py000066400000000000000000000220411326020644600251030ustar00rootroot00000000000000## ## Copyright (C) 2006 Gajim Team ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . """ Handles the jingle signalling protocol """ #TODO: # * things in XEP 0176, including: # - http://xmpp.org/extensions/xep-0176.html#protocol-restarts # - http://xmpp.org/extensions/xep-0176.html#fallback # * XEP 0177 (raw udp) # * UI: # - make state and codec informations available to the user # - video integration # * config: # - codecs import logging import nbxmpp from gajim.common import helpers from gajim.common import app from gajim.common.jingle_session import JingleSession, JingleStates from gajim.common.jingle_ft import JingleFileTransfer from gajim.common.jingle_transport import JingleTransportSocks5, JingleTransportIBB if app.HAVE_FARSTREAM: from gajim.common.jingle_rtp import JingleAudio, JingleVideo logger = logging.getLogger('gajim.c.jingle') class ConnectionJingle(object): """ This object depends on that it is a part of Connection class. """ def __init__(self): # dictionary: sessionid => JingleSession object self._sessions = {} # dictionary: (jid, iq stanza id) => JingleSession object, # one time callbacks self.__iq_responses = {} self.files = [] def delete_jingle_session(self, sid): """ Remove a jingle session from a jingle stanza dispatcher """ if sid in self._sessions: #FIXME: Move this elsewhere? for content in list(self._sessions[sid].contents.values()): content.destroy() self._sessions[sid].callbacks = [] del self._sessions[sid] def _JingleCB(self, con, stanza): """ The jingle stanza dispatcher Route jingle stanza to proper JingleSession object, or create one if it is a new session. TODO: Also check if the stanza isn't an error stanza, if so route it adequatelly. """ # get data try: jid = helpers.get_full_jid_from_iq(stanza) except helpers.InvalidFormat: logger.warning('Invalid JID: %s, ignoring it', stanza.getFrom()) return id_ = stanza.getID() if (jid, id_) in self.__iq_responses.keys(): self.__iq_responses[(jid, id_)].on_stanza(stanza) del self.__iq_responses[(jid, id_)] raise nbxmpp.NodeProcessed jingle = stanza.getTag('jingle') # a jingle element is not necessary in iq-result stanza # don't check for that if jingle: sid = jingle.getAttr('sid') else: sid = None for sesn in self._sessions.values(): if id_ in sesn.iq_ids: sesn.on_stanza(stanza) return # do we need to create a new jingle object if sid not in self._sessions: #TODO: tie-breaking and other things... newjingle = JingleSession(con=self, weinitiate=False, jid=jid, iq_id=id_, sid=sid) self._sessions[sid] = newjingle # we already have such session in dispatcher... self._sessions[sid].collect_iq_id(id_) self._sessions[sid].on_stanza(stanza) # Delete invalid/unneeded sessions if sid in self._sessions and \ self._sessions[sid].state == JingleStates.ENDED: self.delete_jingle_session(sid) raise nbxmpp.NodeProcessed def start_audio(self, jid): if self.get_jingle_session(jid, media='audio'): return self.get_jingle_session(jid, media='audio').sid jingle = self.get_jingle_session(jid, media='video') if jingle: jingle.add_content('voice', JingleAudio(jingle)) else: jingle = JingleSession(self, weinitiate=True, jid=jid) self._sessions[jingle.sid] = jingle jingle.add_content('voice', JingleAudio(jingle)) jingle.start_session() return jingle.sid def start_video(self, jid, in_xid, out_xid): if self.get_jingle_session(jid, media='video'): return self.get_jingle_session(jid, media='video').sid jingle = self.get_jingle_session(jid, media='audio') if jingle: jingle.add_content('video', JingleVideo(jingle, in_xid=in_xid, out_xid=out_xid)) else: jingle = JingleSession(self, weinitiate=True, jid=jid) self._sessions[jingle.sid] = jingle jingle.add_content('video', JingleVideo(jingle, in_xid=in_xid, out_xid=out_xid)) jingle.start_session() return jingle.sid def start_file_transfer(self, jid, file_props, request=False): logger.info("start file transfer with file: %s", file_props) contact = app.contacts.get_contact_with_highest_priority(self.name, app.get_jid_without_resource(jid)) if app.contacts.is_gc_contact(self.name, jid): gcc = jid.split('/') if len(gcc) == 2: contact = app.contacts.get_gc_contact(self.name, gcc[0], gcc[1]) if contact is None: return use_security = contact.supports(nbxmpp.NS_JINGLE_XTLS) jingle = JingleSession(self, weinitiate=True, jid=jid, werequest=request) # this is a file transfer jingle.session_type_ft = True self._sessions[jingle.sid] = jingle file_props.sid = jingle.sid if contact.supports(nbxmpp.NS_JINGLE_BYTESTREAM): transport = JingleTransportSocks5() elif contact.supports(nbxmpp.NS_JINGLE_IBB): transport = JingleTransportIBB() senders = 'initiator' if request: senders = 'responder' c = JingleFileTransfer(jingle, transport=transport, file_props=file_props, use_security=use_security, senders=senders) file_props.transport_sid = transport.sid file_props.algo = self.__hash_support(contact) jingle.add_content('file' + helpers.get_random_string_16(), c) jingle.start_session() return c.transport.sid def __hash_support(self, contact): if contact.supports(nbxmpp.NS_HASHES_2): if contact.supports(nbxmpp.NS_HASHES_BLAKE2B_512): return 'blake2b-512' elif contact.supports(nbxmpp.NS_HASHES_BLAKE2B_256): return 'blake2b-256' elif contact.supports(nbxmpp.NS_HASHES_SHA3_512): return 'sha3-512' elif contact.supports(nbxmpp.NS_HASHES_SHA3_256): return 'sha3-256' elif contact.supports(nbxmpp.NS_HASHES_SHA512): return 'sha-512' elif contact.supports(nbxmpp.NS_HASHES_SHA256): return 'sha-256' return None def iter_jingle_sessions(self, jid, sid=None, media=None): if sid: return (session for session in self._sessions.values() if \ session.sid == sid) sessions = (session for session in self._sessions.values() if \ session.peerjid == jid) if media: if media not in ('audio', 'video', 'file'): return tuple() else: return (session for session in sessions if \ session.get_content(media)) else: return sessions def set_file_info(self, file_): # Saves information about the files we have transfered in case they need # to be requested again. self.files.append(file_) def get_file_info(self, peerjid, hash_=None, name=None, account=None): if hash_: for f in self.files: # DEBUG #if f['hash'] == '1294809248109223': if f['hash'] == hash_ and f['peerjid'] == peerjid: return f elif name: for f in self.files: if f['name'] == name and f['peerjid'] == peerjid: return f def get_jingle_session(self, jid, sid=None, media=None): if sid: if sid in self._sessions: return self._sessions[sid] else: return None elif media: if media not in ('audio', 'video', 'file'): return None for session in self._sessions.values(): if session.peerjid == jid and session.get_content(media): return session return None gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/jingle_content.py000066400000000000000000000221221326020644600266350ustar00rootroot00000000000000## ## Copyright (C) 2006 Gajim Team ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . """ Handles Jingle contents (XEP 0166) """ import os from gajim.common import app import nbxmpp from gajim.common.jingle_xtls import SELF_SIGNED_CERTIFICATE from gajim.common.jingle_xtls import load_cert_file contents = {} def get_jingle_content(node): namespace = node.getNamespace() if namespace in contents: return contents[namespace](node) class JingleContentSetupException(Exception): """ Exception that should be raised when a content fails to setup. """ class JingleContent: """ An abstraction of content in Jingle sessions """ def __init__(self, session, transport, senders): self.session = session self.transport = transport # will be filled by JingleSession.add_content() # don't uncomment these lines, we will catch more buggy code then # (a JingleContent not added to session shouldn't send anything) self.creator = None self.name = None self.accepted = False self.sent = False self.negotiated = False self.media = None self.senders = senders if self.senders is None: self.senders = 'both' self.allow_sending = True # Used for stream direction, attribute 'senders' # These were found by the Politie self.file_props = None self.use_security = None self.callbacks = { # these are called when *we* get stanzas 'content-accept': [self.__on_transport_info, self.__on_content_accept], 'content-add': [self.__on_transport_info], 'content-modify': [], 'content-reject': [], 'content-remove': [], 'description-info': [], 'security-info': [], 'session-accept': [self.__on_transport_info, self.__on_content_accept], 'session-info': [], 'session-initiate': [self.__on_transport_info], 'session-terminate': [], 'transport-info': [self.__on_transport_info], 'transport-replace': [self.__on_transport_replace], 'transport-accept': [], 'transport-reject': [], 'iq-result': [], 'iq-error': [], # these are called when *we* sent these stanzas 'content-accept-sent': [self.__fill_jingle_stanza, self.__on_content_accept], 'content-add-sent': [self.__fill_jingle_stanza], 'session-initiate-sent': [self.__fill_jingle_stanza], 'session-accept-sent': [self.__fill_jingle_stanza, self.__on_content_accept], 'session-terminate-sent': [], } def is_ready(self): return self.accepted and not self.sent def __on_content_accept(self, stanza, content, error, action): self.on_negotiated() def on_negotiated(self): if self.accepted: self.negotiated = True self.session.content_negotiated(self.media) def add_remote_candidates(self, candidates): """ Add a list of candidates to the list of remote candidates """ self.transport.remote_candidates = candidates def on_stanza(self, stanza, content, error, action): """ Called when something related to our content was sent by peer """ if action in self.callbacks: for callback in self.callbacks[action]: callback(stanza, content, error, action) def __on_transport_replace(self, stanza, content, error, action): content.addChild(node=self.transport.make_transport()) def __on_transport_info(self, stanza, content, error, action): """ Got a new transport candidate """ candidates = self.transport.parse_transport_stanza( content.getTag('transport')) if candidates: self.add_remote_candidates(candidates) def __content(self, payload=None): """ Build a XML content-wrapper for our data """ if payload is None: payload = [] return nbxmpp.Node('content', attrs={'name': self.name, 'creator': self.creator, 'senders': self.senders}, payload=payload) def send_candidate(self, candidate): """ Send a transport candidate for a previously defined transport. """ content = self.__content() content.addChild(node=self.transport.make_transport([candidate])) self.session.send_transport_info(content) def send_error_candidate(self): """ Sends a candidate-error when we can't connect to a candidate. """ content = self.__content() tp = self.transport.make_transport(add_candidates=False) tp.addChild(name='candidate-error') content.addChild(node=tp) self.session.send_transport_info(content) def send_description_info(self): content = self.__content() self._fill_content(content) self.session.send_description_info(content) def __fill_jingle_stanza(self, stanza, content, error, action): """ Add our things to session-initiate stanza """ self._fill_content(content) self.sent = True content.addChild(node=self.transport.make_transport()) def _fill_content(self, content): description_node = nbxmpp.simplexml.Node( tag=nbxmpp.NS_JINGLE_FILE_TRANSFER_5 + ' description') file_tag = description_node.setTag('file') if self.file_props.name: node = nbxmpp.simplexml.Node(tag='name') node.addData(self.file_props.name) file_tag.addChild(node=node) if self.file_props.date: node = nbxmpp.simplexml.Node(tag='date') node.addData(self.file_props.date) file_tag.addChild(node=node) if self.file_props.size: node = nbxmpp.simplexml.Node(tag='size') node.addData(self.file_props.size) file_tag.addChild(node=node) if self.file_props.type_ == 'r': if self.file_props.hash_: file_tag.addChild('hash', attrs={'algo': self.file_props.algo}, namespace=nbxmpp.NS_HASHES_2, payload=self.file_props.hash_) else: # if the file is less than 10 mb, then it is small # lets calculate it right away if self.file_props.size < 10000000 and not self.file_props.hash_: hash_data = self._compute_hash() if hash_data: file_tag.addChild(node=hash_data) pjid = app.get_jid_without_resource(self.session.peerjid) file_info = {'name' : self.file_props.name, 'file-name' : self.file_props.file_name, 'hash' : self.file_props.hash_, 'size' : self.file_props.size, 'date' : self.file_props.date, 'peerjid' : pjid } self.session.connection.set_file_info(file_info) desc = file_tag.setTag('desc') if self.file_props.desc: desc.setData(self.file_props.desc) if self.use_security: security = nbxmpp.simplexml.Node( tag=nbxmpp.NS_JINGLE_XTLS + ' security') certpath = os.path.join(app.MY_CERT_DIR, SELF_SIGNED_CERTIFICATE)\ + '.cert' cert = load_cert_file(certpath) if cert: try: digest_algo = (cert.get_signature_algorithm() .decode('utf-8').split('With')[0]) except AttributeError: # Old py-OpenSSL is missing get_signature_algorithm digest_algo = "sha256" security.addChild('fingerprint').addData(cert.digest( digest_algo).decode('utf-8')) for m in ('x509', ): # supported authentication methods method = nbxmpp.simplexml.Node(tag='method') method.setAttr('name', m) security.addChild(node=method) content.addChild(node=security) content.addChild(node=description_node) def destroy(self): self.callbacks = None del self.session.contents[(self.creator, self.name)] gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/jingle_ft.py000066400000000000000000000424711326020644600256050ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## """ Handles Jingle File Transfer (XEP 0234) """ import hashlib import logging import os import threading from enum import IntEnum, unique import nbxmpp from gajim.common import app from gajim.common import configpaths from gajim.common import jingle_xtls from gajim.common.jingle_content import contents, JingleContent from gajim.common.jingle_transport import JingleTransportSocks5, TransportType from gajim.common import helpers from gajim.common.connection_handlers_events import FileRequestReceivedEvent from gajim.common.jingle_ftstates import ( StateInitialized, StateCandSent, StateCandReceived, StateTransfering, StateCandSentAndRecv, StateTransportReplace) log = logging.getLogger('gajim.c.jingle_ft') @unique class State(IntEnum): NOT_STARTED = 0 INITIALIZED = 1 # We send the candidates and we are waiting for a reply CAND_SENT = 2 # We received the candidates and we are waiting to reply CAND_RECEIVED = 3 # We have sent and received the candidates # This also includes any candidate-error received or sent CAND_SENT_AND_RECEIVED = 4 TRANSPORT_REPLACE = 5 # We are transfering the file TRANSFERING = 6 class JingleFileTransfer(JingleContent): def __init__(self, session, transport=None, file_props=None, use_security=False, senders=None): JingleContent.__init__(self, session, transport, senders) log.info("transport value: %s", transport) # events we might be interested in self.callbacks['session-initiate'] += [self.__on_session_initiate] self.callbacks['session-initiate-sent'] += [ self.__on_session_initiate_sent] self.callbacks['content-add'] += [self.__on_session_initiate] self.callbacks['session-accept'] += [self.__on_session_accept] self.callbacks['session-terminate'] += [self.__on_session_terminate] self.callbacks['session-info'] += [self.__on_session_info] self.callbacks['transport-accept'] += [self.__on_transport_accept] self.callbacks['transport-replace'] += [self.__on_transport_replace] self.callbacks['session-accept-sent'] += [self.__transport_setup] # fallback transport method self.callbacks['transport-reject'] += [self.__on_transport_reject] self.callbacks['transport-info'] += [self.__on_transport_info] self.callbacks['iq-result'] += [self.__on_iq_result] self.use_security = use_security self.x509_fingerprint = None self.file_props = file_props self.weinitiate = self.session.weinitiate self.werequest = self.session.werequest if self.file_props is not None: if self.session.werequest: self.file_props.sender = self.session.peerjid self.file_props.receiver = self.session.ourjid else: self.file_props.sender = self.session.ourjid self.file_props.receiver = self.session.peerjid self.file_props.session_type = 'jingle' self.file_props.sid = session.sid self.file_props.transfered_size = [] self.file_props.transport_sid = self.transport.sid log.info("FT request: %s", file_props) if transport is None: self.transport = JingleTransportSocks5() self.transport.set_connection(session.connection) self.transport.set_file_props(self.file_props) self.transport.set_our_jid(session.ourjid) log.info('ourjid: %s', session.ourjid) self.session = session self.media = 'file' self.nominated_cand = {} if app.contacts.is_gc_contact(session.connection.name, session.peerjid): roomjid = session.peerjid.split('/')[0] dstaddr = hashlib.sha1(('%s%s%s' % (self.file_props.sid, session.ourjid, roomjid)) .encode('utf-8')).hexdigest() self.file_props.dstaddr = dstaddr self.state = State.NOT_STARTED self.states = { State.INITIALIZED : StateInitialized(self), State.CAND_SENT : StateCandSent(self), State.CAND_RECEIVED : StateCandReceived(self), State.TRANSFERING : StateTransfering(self), State.TRANSPORT_REPLACE : StateTransportReplace(self), State.CAND_SENT_AND_RECEIVED : StateCandSentAndRecv(self) } if jingle_xtls.PYOPENSSL_PRESENT: cert_name = os.path.join(configpaths.gajimpaths['MY_CERT'], jingle_xtls.SELF_SIGNED_CERTIFICATE) if not (os.path.exists(cert_name + '.cert') and os.path.exists(cert_name + '.pkey')): jingle_xtls.make_certs(cert_name, 'gajim') def __state_changed(self, nextstate, args=None): # Executes the next state action and sets the next state current_state = self.state st = self.states[nextstate] st.action(args) # state can have been changed during the action. Don't go back. if self.state == current_state: self.state = nextstate def __on_session_initiate(self, stanza, content, error, action): log.debug("Jingle FT request received") app.nec.push_incoming_event(FileRequestReceivedEvent(None, conn=self.session.connection, stanza=stanza, jingle_content=content, FT_content=self)) if self.session.request: # accept the request self.session.approve_content(self.media, self.name) self.session.accept_session() def __on_session_initiate_sent(self, stanza, content, error, action): pass def __send_hash(self): # Send hash in a session info checksum = nbxmpp.Node(tag='checksum', payload=[nbxmpp.Node(tag='file', payload=[self._compute_hash()])]) checksum.setNamespace(nbxmpp.NS_JINGLE_FILE_TRANSFER_5) self.session.__session_info(checksum) pjid = app.get_jid_without_resource(self.session.peerjid) file_info = {'name' : self.file_props.name, 'file-name' : self.file_props.file_name, 'hash' : self.file_props.hash_, 'size' : self.file_props.size, 'date' : self.file_props.date, 'peerjid' : pjid } self.session.connection.set_file_info(file_info) def _compute_hash(self): # Caculates the hash and returns a xep-300 hash stanza if self.file_props.algo is None: return try: file_ = open(self.file_props.file_name, 'rb') except IOError: # can't open file return h = nbxmpp.Hashes2() hash_ = h.calculateHash(self.file_props.algo, file_) file_.close() # DEBUG #hash_ = '1294809248109223' if not hash_: # Hash alogrithm not supported return self.file_props.hash_ = hash_ h.addHash(hash_, self.file_props.algo) return h def on_cert_received(self): self.session.approve_session() self.session.approve_content('file', name=self.name) def __on_session_accept(self, stanza, content, error, action): log.info("__on_session_accept") con = self.session.connection security = content.getTag('security') if not security: # responder can not verify our fingerprint self.use_security = False else: fingerprint = security.getTag('fingerprint') if fingerprint: fingerprint = fingerprint.getData() self.x509_fingerprint = fingerprint if not jingle_xtls.check_cert(app.get_jid_without_resource( self.session.responder), fingerprint): id_ = jingle_xtls.send_cert_request(con, self.session.responder) jingle_xtls.key_exchange_pend(id_, self.continue_session_accept, [stanza]) raise nbxmpp.NodeProcessed self.continue_session_accept(stanza) def continue_session_accept(self, stanza): con = self.session.connection if self.state == State.TRANSPORT_REPLACE: # If we are requesting we don't have the file if self.session.werequest: raise nbxmpp.NodeProcessed # We send the file self.__state_changed(State.TRANSFERING) raise nbxmpp.NodeProcessed self.file_props.streamhosts = self.transport.remote_candidates # Calculate file hash in a new thread # if we haven't sent the hash already. if self.file_props.hash_ is None and self.file_props.algo and \ not self.werequest: self.hash_thread = threading.Thread(target=self.__send_hash) self.hash_thread.start() for host in self.file_props.streamhosts: host['initiator'] = self.session.initiator host['target'] = self.session.responder host['sid'] = self.file_props.sid fingerprint = None if self.use_security: fingerprint = 'client' if self.transport.type_ == TransportType.SOCKS5: sid = self.file_props.transport_sid app.socks5queue.connect_to_hosts(self.session.connection.name, sid, self.on_connect, self._on_connect_error, fingerprint=fingerprint, receiving=False) raise nbxmpp.NodeProcessed self.__state_changed(State.TRANSFERING) raise nbxmpp.NodeProcessed def __on_session_terminate(self, stanza, content, error, action): log.info("__on_session_terminate") def __on_session_info(self, stanza, content, error, action): pass def __on_transport_accept(self, stanza, content, error, action): log.info("__on_transport_accept") def __on_transport_replace(self, stanza, content, error, action): log.info("__on_transport_replace") def __on_transport_reject(self, stanza, content, error, action): log.info("__on_transport_reject") def __on_transport_info(self, stanza, content, error, action): log.info("__on_transport_info") cand_error = content.getTag('transport').getTag('candidate-error') cand_used = content.getTag('transport').getTag('candidate-used') if (cand_error or cand_used) and \ self.state >= State.CAND_SENT_AND_RECEIVED: raise nbxmpp.NodeProcessed if cand_error: if not app.socks5queue.listener.connections: app.socks5queue.listener.disconnect() self.nominated_cand['peer-cand'] = False if self.state == State.CAND_SENT: if not self.nominated_cand['our-cand'] and \ not self.nominated_cand['peer-cand']: if not self.weinitiate: return self.__state_changed(State.TRANSPORT_REPLACE) else: response = stanza.buildReply('result') response.delChild(response.getQuery()) self.session.connection.connection.send(response) self.__state_changed(State.TRANSFERING) raise nbxmpp.NodeProcessed else: args = {'candError' : True} self.__state_changed(State.CAND_RECEIVED, args) return if cand_used: streamhost_cid = cand_used.getAttr('cid') streamhost_used = None for cand in self.transport.candidates: if cand['candidate_id'] == streamhost_cid: streamhost_used = cand break if streamhost_used is None or streamhost_used['type'] == 'proxy': if app.socks5queue.listener and \ not app.socks5queue.listener.connections: app.socks5queue.listener.disconnect() if content.getTag('transport').getTag('activated'): self.state = State.TRANSFERING jid = app.get_jid_without_resource(self.session.ourjid) app.socks5queue.send_file(self.file_props, self.session.connection.name, 'client') return args = {'content': content, 'sendCand': False} if self.state == State.CAND_SENT: self.__state_changed(State.CAND_SENT_AND_RECEIVED, args) self.__state_changed(State.TRANSFERING) raise nbxmpp.NodeProcessed else: self.__state_changed(State.CAND_RECEIVED, args) def __on_iq_result(self, stanza, content, error, action): log.info("__on_iq_result") if self.state == State.NOT_STARTED: self.__state_changed(State.INITIALIZED) elif self.state == State.CAND_SENT_AND_RECEIVED: if not self.nominated_cand['our-cand'] and \ not self.nominated_cand['peer-cand']: if not self.weinitiate: return self.__state_changed(State.TRANSPORT_REPLACE) return # initiate transfer self.__state_changed(State.TRANSFERING) def __transport_setup(self, stanza=None, content=None, error=None, action=None): # Sets up a few transport specific things for the file transfer if self.transport.type_ == TransportType.IBB: # No action required, just set the state to transfering self.state = State.TRANSFERING else: self._listen_host() def on_connect(self, streamhost): """ send candidate-used stanza """ log.info('send_candidate_used') if streamhost is None: return args = {'streamhost' : streamhost, 'sendCand' : True} self.nominated_cand['our-cand'] = streamhost self.__send_candidate(args) def _on_connect_error(self, sid): log.info('connect error, sid=' + sid) args = {'candError' : True, 'sendCand' : True} self.__send_candidate(args) def __send_candidate(self, args): if self.state == State.CAND_RECEIVED: self.__state_changed(State.CAND_SENT_AND_RECEIVED, args) else: self.__state_changed(State.CAND_SENT, args) def _store_socks5_sid(self, sid, hash_id): # callback from socsk5queue.start_listener self.file_props.hash_ = hash_id def _listen_host(self): receiver = self.file_props.receiver sender = self.file_props.sender sha_str = helpers.get_auth_sha(self.file_props.sid, sender, receiver) self.file_props.sha_str = sha_str port = app.config.get('file_transfers_port') fingerprint = None if self.use_security: fingerprint = 'server' listener = app.socks5queue.start_listener(port, sha_str, self._store_socks5_sid, self.file_props, fingerprint=fingerprint, typ='sender' if self.weinitiate else 'receiver') if not listener: # send error message, notify the user return def is_our_candidate_used(self): ''' If this method returns true then the candidate we nominated will be used, if false, the candidate nominated by peer will be used ''' if not self.nominated_cand['peer-cand']: return True if not self.nominated_cand['our-cand']: return False peer_pr = int(self.nominated_cand['peer-cand']['priority']) our_pr = int(self.nominated_cand['our-cand']['priority']) if peer_pr != our_pr: return our_pr > peer_pr return self.weinitiate def start_ibb_transfer(self): if self.file_props.type_ == 's': self.__state_changed(State.TRANSFERING) def get_content(desc): return JingleFileTransfer contents[nbxmpp.NS_JINGLE_FILE_TRANSFER_5] = get_content gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/jingle_ftstates.py000066400000000000000000000213371326020644600270270ustar00rootroot00000000000000## ## Copyright (C) 2006 Gajim Team ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . import nbxmpp from gajim.common import app from gajim.common.jingle_transport import TransportType from gajim.common.socks5 import Socks5ReceiverClient, Socks5SenderClient import logging log = logging.getLogger('gajim.c.jingle_ftstates') class JingleFileTransferStates: ''' This class implements the state machine design pattern ''' def __init__(self, jingleft): self.jft = jingleft def action(self, args=None): ''' This method MUST be overriden by a subclass ''' raise NotImplementedError('This is an abstract method!') class StateInitialized(JingleFileTransferStates): ''' This state initializes the file transfer ''' def action(self, args=None): if self.jft.weinitiate: # update connection's fileprops self.jft._listen_host() # Listen on configured port for file transfer else: fingerprint = None if self.jft.use_security: fingerprint = 'client' # Connect to the candidate host, on success call on_connect method app.socks5queue.connect_to_hosts(self.jft.session.connection.name, self.jft.file_props.transport_sid, self.jft.on_connect, self.jft._on_connect_error, fingerprint=fingerprint) class StateCandSent(JingleFileTransferStates): ''' This state sends our nominated candidate ''' def _send_candidate(self, args): if 'candError' in args: self.jft.nominated_cand['our-cand'] = False self.jft.send_error_candidate() return # Send candidate used streamhost = args['streamhost'] self.jft.nominated_cand['our-cand'] = streamhost content = nbxmpp.Node('content') content.setAttr('creator', 'initiator') content.setAttr('name', self.jft.name) transport = nbxmpp.Node('transport') transport.setNamespace(nbxmpp.NS_JINGLE_BYTESTREAM) transport.setAttr('sid', self.jft.transport.sid) candidateused = nbxmpp.Node('candidate-used') candidateused.setAttr('cid', streamhost['candidate_id']) transport.addChild(node=candidateused) content.addChild(node=transport) self.jft.session.send_transport_info(content) def action(self, args=None): self._send_candidate(args) class StateCandReceived(JingleFileTransferStates): ''' This state happens when we receive a candidate. It takes the arguments: canError if we receive a candidate-error ''' def _recv_candidate(self, args): if 'candError' in args: return content = args['content'] streamhost_cid = content.getTag('transport').getTag('candidate-used').\ getAttr('cid') streamhost_used = None for cand in self.jft.transport.candidates: if cand['candidate_id'] == streamhost_cid: streamhost_used = cand break if streamhost_used is None: log.info("unknow streamhost") return # We save the candidate nominated by peer self.jft.nominated_cand['peer-cand'] = streamhost_used def action(self, args=None): self._recv_candidate(args) class StateCandSentAndRecv(StateCandSent, StateCandReceived): ''' This state happens when we have received and sent the candidates. It takes the boolean argument: sendCand in order to decide whether we should execute the action of when we receive or send a candidate. ''' def action(self, args=None): if args['sendCand']: self._send_candidate(args) else: self._recv_candidate(args) class StateTransportReplace(JingleFileTransferStates): ''' This state initiates transport replace ''' def action(self, args=None): self.jft.session.transport_replace() class StateTransfering(JingleFileTransferStates): ''' This state will start the transfer depeding on the type of transport we have. ''' def _start_ibb_transfer(self, con): self.jft.file_props.transport_sid = self.jft.transport.sid fp = open(self.jft.file_props.file_name, 'rb') con.OpenStream(self.jft.file_props.sid, self.jft.session.peerjid, fp, blocksize=4096) def _start_sock5_transfer(self): # It tells wether we start the transfer as client or server mode = None if self.jft.is_our_candidate_used(): mode = 'client' streamhost_used = self.jft.nominated_cand['our-cand'] app.socks5queue.remove_server(self.jft.file_props.transport_sid) else: mode = 'server' streamhost_used = self.jft.nominated_cand['peer-cand'] app.socks5queue.remove_client(self.jft.file_props.transport_sid) app.socks5queue.remove_other_servers(streamhost_used['host']) if streamhost_used['type'] == 'proxy': self.jft.file_props.is_a_proxy = True if self.jft.file_props.type_ == 's' and self.jft.weinitiate: self.jft.file_props.proxy_sender = streamhost_used['initiator'] self.jft.file_props.proxy_receiver = streamhost_used['target'] else: self.jft.file_props.proxy_sender = streamhost_used['target'] self.jft.file_props.proxy_receiver = streamhost_used[ 'initiator'] if self.jft.file_props.type_ == 's': s = app.socks5queue.senders for sender in s: if s[sender].host == streamhost_used['host'] and \ s[sender].connected: return elif self.jft.file_props.type_ == 'r': r = app.socks5queue.readers for reader in r: if r[reader].host == streamhost_used['host'] and \ r[reader].connected: return else: raise TypeError self.jft.file_props.streamhost_used = True streamhost_used['sid'] = self.jft.file_props.transport_sid self.jft.file_props.streamhosts = [] self.jft.file_props.streamhosts.append(streamhost_used) self.jft.file_props.proxyhosts = [] self.jft.file_props.proxyhosts.append(streamhost_used) if self.jft.file_props.type_ == 's': app.socks5queue.idx += 1 idx = app.socks5queue.idx sockobj = Socks5SenderClient(app.idlequeue, idx, app.socks5queue, _sock=None, host=str(streamhost_used['host']), port=int(streamhost_used['port']), fingerprint=None, connected=False, file_props=self.jft.file_props) else: sockobj = Socks5ReceiverClient(app.idlequeue, streamhost_used, transport_sid=self.jft.file_props.transport_sid, file_props=self.jft.file_props, fingerprint=None) sockobj.proxy = True sockobj.streamhost = streamhost_used app.socks5queue.add_sockobj(self.jft.session.connection.name, sockobj) streamhost_used['idx'] = sockobj.queue_idx # If we offered the nominated candidate used, we activate # the proxy if not self.jft.is_our_candidate_used(): app.socks5queue.on_success[self.jft.file_props.transport_sid]\ = self.jft.transport._on_proxy_auth_ok # TODO: add on failure else: jid = app.get_jid_without_resource(self.jft.session.ourjid) app.socks5queue.send_file(self.jft.file_props, self.jft.session.connection.name, mode) def action(self, args=None): if self.jft.transport.type_ == TransportType.IBB: self._start_ibb_transfer(self.jft.session.connection) elif self.jft.transport.type_ == TransportType.SOCKS5: self._start_sock5_transfer() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/jingle_rtp.py000066400000000000000000000451121326020644600257740ustar00rootroot00000000000000## ## Copyright (C) 2006 Gajim Team ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . """ Handles Jingle RTP sessions (XEP 0167) """ import logging import socket import nbxmpp import gi from gi.repository import Farstream gi.require_version('Gst', '1.0') from gi.repository import Gst from gi.repository import GLib from gajim.common import app from gajim.common.jingle_transport import JingleTransportICEUDP from gajim.common.jingle_content import contents, JingleContent, JingleContentSetupException from gajim.common.connection_handlers_events import InformationEvent from gajim.common.jingle_session import FailedApplication from collections import deque log = logging.getLogger('gajim.c.jingle_rtp') class JingleRTPContent(JingleContent): def __init__(self, session, media, transport=None): if transport is None: transport = JingleTransportICEUDP(None) JingleContent.__init__(self, session, transport) self.media = media self._dtmf_running = False self.farstream_media = { 'audio': Farstream.MediaType.AUDIO, 'video': Farstream.MediaType.VIDEO}[media] self.pipeline = None self.src_bin = None self.stream_failed_once = False self.candidates_ready = False # True when local candidates are prepared # TODO self.conference = None self.funnel = None self.p2psession = None self.p2pstream = None self.callbacks['session-initiate'] += [self.__on_remote_codecs] self.callbacks['content-add'] += [self.__on_remote_codecs] self.callbacks['description-info'] += [self.__on_remote_codecs] self.callbacks['content-accept'] += [self.__on_remote_codecs] self.callbacks['session-accept'] += [self.__on_remote_codecs] self.callbacks['session-terminate'] += [self.__stop] self.callbacks['session-terminate-sent'] += [self.__stop] def setup_stream(self, on_src_pad_added): # pipeline and bus self.pipeline = Gst.Pipeline() bus = self.pipeline.get_bus() bus.add_signal_watch() bus.connect('message', self._on_gst_message) # conference self.conference = Gst.ElementFactory.make('fsrtpconference', None) self.pipeline.add(self.conference) self.funnel = None self.p2psession = self.conference.new_session(self.farstream_media) participant = self.conference.new_participant() # FIXME: Consider a workaround, here... # pidgin and telepathy-gabble don't follow the XEP, and it won't work # due to bad controlling-mode params = {'controlling-mode': self.session.weinitiate, 'debug': False} if app.config.get('use_stun_server'): stun_server = app.config.get('stun_server') if not stun_server and self.session.connection._stun_servers: stun_server = self.session.connection._stun_servers[0]['host'] if stun_server: try: ip = socket.getaddrinfo(stun_server, 0, socket.AF_UNSPEC, socket.SOCK_STREAM)[0][4][0] except socket.gaierror as e: log.warning('Lookup of stun ip failed: %s', str(e)) else: params['stun-ip'] = ip self.p2pstream = self.p2psession.new_stream(participant, Farstream.StreamDirection.BOTH) self.p2pstream.connect('src-pad-added', on_src_pad_added) self.p2pstream.set_transmitter_ht('nice', params) def is_ready(self): return JingleContent.is_ready(self) and self.candidates_ready def make_bin_from_config(self, config_key, pipeline, text): pipeline = pipeline % app.config.get(config_key) try: gst_bin = Gst.parse_bin_from_description(pipeline, True) return gst_bin except GLib.GError as e: app.nec.push_incoming_event( InformationEvent( None, conn=self.session.connection, level='error', pri_txt=_('%s configuration error') % text.capitalize(), sec_txt=_('Couldn’t setup %(text)s. Check your ' 'configuration.\n\nPipeline was:\n%(pipeline)s\n\n' 'Error was:\n%(error)s') % {'text': text, 'pipeline': pipeline, 'error': str(e)})) raise JingleContentSetupException def add_remote_candidates(self, candidates): JingleContent.add_remote_candidates(self, candidates) # FIXME: connectivity should not be etablished yet # Instead, it should be etablished after session-accept! if self.sent: self.p2pstream.add_remote_candidates(candidates) def batch_dtmf(self, events): """ Send several DTMF tones """ if self._dtmf_running: raise Exception("There is a DTMF batch already running") events = deque(events) self._dtmf_running = True self._start_dtmf(events.popleft()) GLib.timeout_add(500, self._next_dtmf, events) def _next_dtmf(self, events): self._stop_dtmf() if events: self._start_dtmf(events.popleft()) GLib.timeout_add(500, self._next_dtmf, events) else: self._dtmf_running = False def _start_dtmf(self, event): if event in ('*', '#'): event = {'*': Farstream.DTMFEvent.STAR, '#': Farstream.DTMFEvent.POUND}[event] else: event = int(event) self.p2psession.start_telephony_event(event, 2) def _stop_dtmf(self): self.p2psession.stop_telephony_event() def _fill_content(self, content): content.addChild(nbxmpp.NS_JINGLE_RTP + ' description', attrs={'media': self.media}, payload=list(self.iter_codecs())) def _setup_funnel(self): self.funnel = Gst.ElementFactory.make('funnel', None) self.pipeline.add(self.funnel) self.funnel.link(self.sink) self.sink.set_state(Gst.State.PLAYING) self.funnel.set_state(Gst.State.PLAYING) def _on_src_pad_added(self, stream, pad, codec): if not self.funnel: self._setup_funnel() pad.link(self.funnel.get_request_pad('sink_%u')) def _on_gst_message(self, bus, message): if message.type == Gst.MessageType.ELEMENT: name = message.get_structure().get_name() log.debug('gst element message: %s: %s', name, message) if name == 'farstream-new-active-candidate-pair': pass elif name == 'farstream-recv-codecs-changed': pass elif name == 'farstream-codecs-changed': if self.sent and self.p2psession.props.codecs_without_config: self.send_description_info() if self.transport.remote_candidates: # those lines MUST be done after we get info on our # codecs self.p2pstream.add_remote_candidates( self.transport.remote_candidates) self.transport.remote_candidates = [] self.p2pstream.set_property('direction', Farstream.StreamDirection.BOTH) elif name == 'farstream-local-candidates-prepared': self.candidates_ready = True if self.is_ready(): self.session.on_session_state_changed(self) elif name == 'farstream-new-local-candidate': candidate = self.p2pstream.parse_new_local_candidate(message)[1] self.transport.candidates.append(candidate) if self.sent: # FIXME: Is this case even possible? self.send_candidate(candidate) elif name == 'farstream-component-state-changed': state = message.get_structure().get_value('state') if state == Farstream.StreamState.FAILED: reason = nbxmpp.Node('reason') reason.setTag('failed-transport') self.session.remove_content(self.creator, self.name, reason) elif name == 'farstream-error': log.error('Farstream error #%d!\nMessage: %s', message.get_structure().get_value('error-no'), message.get_structure().get_value('error-msg')) elif message.type == Gst.MessageType.ERROR: # TODO: Fix it to fallback to videotestsrc anytime an error occur, # or raise an error, Jingle way # or maybe one-sided stream? if not self.stream_failed_once: app.nec.push_incoming_event( InformationEvent( None, dialog_name='gstreamer-error', kwargs={'error': message.get_structure().get_value('gerror'), 'debug': message.get_structure().get_value('debug')})) sink_pad = self.p2psession.get_property('sink-pad') # Remove old source self.src_bin.get_static_pad('src').unlink(sink_pad) self.src_bin.set_state(Gst.State.NULL) self.pipeline.remove(self.src_bin) if not self.stream_failed_once: # Add fallback source self.src_bin = self.get_fallback_src() self.pipeline.add(self.src_bin) self.src_bin.link(sink_pad) self.stream_failed_once = True else: reason = nbxmpp.Node('reason') reason.setTag('failed-application') self.session.remove_content(self.creator, self.name, reason) # Start playing again self.pipeline.set_state(Gst.State.PLAYING) @staticmethod def get_fallback_src(): return Gst.ElementFactory.make('fakesrc', None) def on_negotiated(self): if self.accepted: if self.p2psession.get_property('codecs'): # those lines MUST be done after we get info on our codecs if self.transport.remote_candidates: self.p2pstream.add_remote_candidates( self.transport.remote_candidates) self.transport.remote_candidates = [] # TODO: Farstream.StreamDirection.BOTH only if senders='both' # self.p2pstream.set_property('direction', # Farstream.StreamDirection.BOTH) JingleContent.on_negotiated(self) def __on_remote_codecs(self, stanza, content, error, action): """ Get peer codecs from what we get from peer """ codecs = [] for codec in content.getTag('description').iterTags('payload-type'): if not codec['id'] or not codec['name'] or not codec['clockrate']: # ignore invalid payload-types continue c = Farstream.Codec.new(int(codec['id']), codec['name'], self.farstream_media, int(codec['clockrate'])) if 'channels' in codec: c.channels = int(codec['channels']) else: c.channels = 1 for p in codec.iterTags('parameter'): c.add_optional_parameter(p['name'], str(p['value'])) codecs.append(c) if codecs: try: self.p2pstream.set_remote_codecs(codecs) except GLib.Error: raise FailedApplication def iter_codecs(self): codecs = self.p2psession.props.codecs_without_config for codec in codecs: attrs = { 'name': codec.encoding_name, 'id': codec.id, 'channels': codec.channels } if codec.clock_rate: attrs['clockrate'] = codec.clock_rate if codec.optional_params: payload = [nbxmpp.Node('parameter', {'name': p.name, 'value': p.value}) for p in codec.optional_params] else: payload = [] yield nbxmpp.Node('payload-type', attrs, payload) def __stop(self, *things): self.pipeline.set_state(Gst.State.NULL) def __del__(self): self.__stop() def destroy(self): JingleContent.destroy(self) self.p2pstream.disconnect_by_func(self._on_src_pad_added) self.pipeline.get_bus().disconnect_by_func(self._on_gst_message) class JingleAudio(JingleRTPContent): """ Jingle VoIP sessions consist of audio content transported over an ICE UDP protocol """ def __init__(self, session, transport=None): JingleRTPContent.__init__(self, session, 'audio', transport) self.setup_stream() def set_mic_volume(self, vol): """ vol must be between 0 ans 1 """ self.mic_volume.set_property('volume', vol) def set_out_volume(self, vol): """ vol must be between 0 ans 1 """ self.out_volume.set_property('volume', vol) def setup_stream(self): JingleRTPContent.setup_stream(self, self._on_src_pad_added) # Configure SPEEX # Workaround for psi (not needed since rev # 147aedcea39b43402fe64c533d1866a25449888a): # place 16kHz before 8kHz, as buggy psi versions will take in # account only the first codec codecs = [ Farstream.Codec.new(Farstream.CODEC_ID_ANY, 'SPEEX', Farstream.MediaType.AUDIO, 16000), Farstream.Codec.new(Farstream.CODEC_ID_ANY, 'SPEEX', Farstream.MediaType.AUDIO, 8000)] self.p2psession.set_codec_preferences(codecs) # the local parts # TODO: Add queues? self.src_bin = self.make_bin_from_config('audio_input_device', '%s ! audioconvert', _("audio input")) self.sink = self.make_bin_from_config('audio_output_device', 'audioconvert ! volume name=gajim_out_vol ! %s', _("audio output")) self.mic_volume = self.src_bin.get_by_name('gajim_vol') self.out_volume = self.sink.get_by_name('gajim_out_vol') # link gst elements self.pipeline.add(self.sink) self.pipeline.add(self.src_bin) self.src_bin.get_static_pad('src').link(self.p2psession.get_property( 'sink-pad')) # The following is needed for farstream to process ICE requests: self.pipeline.set_state(Gst.State.PLAYING) class JingleVideo(JingleRTPContent): def __init__(self, session, transport=None, in_xid=0, out_xid=0): JingleRTPContent.__init__(self, session, 'video', transport) self.in_xid = in_xid self.out_xid = out_xid self.out_xid_set = False self.setup_stream() def setup_stream(self): # TODO: Everything is not working properly: # sometimes, one window won't show up, # sometimes it'll freeze... JingleRTPContent.setup_stream(self, self._on_src_pad_added) bus = self.pipeline.get_bus() bus.enable_sync_message_emission() bus.connect('sync-message::element', self._on_sync_message) # the local parts if app.config.get('video_framerate'): framerate = 'videorate ! video/x-raw,framerate=%s ! ' % \ app.config.get('video_framerate') else: framerate = '' try: w, h = app.config.get('video_size').split('x') except: w = h = None if w and h: video_size = 'video/x-raw,width=%s,height=%s ! ' % (w, h) else: video_size = '' if app.config.get('video_see_self'): tee = '! tee name=t ! queue ! videoscale ! ' + \ 'video/x-raw,width=160,height=120 ! videoconvert ! ' + \ '%s t. ! queue ' % app.config.get( 'video_output_device') else: tee = '' self.src_bin = self.make_bin_from_config('video_input_device', '%%s %s! %svideoscale ! %svideoconvert' % (tee, framerate, video_size), _("video input")) self.pipeline.add(self.src_bin) self.pipeline.set_state(Gst.State.PLAYING) self.sink = self.make_bin_from_config('video_output_device', 'videoscale ! videoconvert ! %s', _("video output")) self.pipeline.add(self.sink) self.src_bin.get_static_pad('src').link(self.p2psession.get_property( 'sink-pad')) # The following is needed for farstream to process ICE requests: self.pipeline.set_state(Gst.State.PLAYING) def _on_sync_message(self, bus, message): if message.get_structure() is None: return False if message.get_structure().get_name() == 'prepare-window-handle': message.src.set_property('force-aspect-ratio', True) imagesink = message.src if app.config.get('video_see_self') and not self.out_xid_set: imagesink.set_window_handle(self.out_xid) self.out_xid_set = True else: imagesink.set_window_handle(self.in_xid) def get_fallback_src(self): # TODO: Use avatar? pipeline = 'videotestsrc is-live=true ! video/x-raw,framerate=10/1 ! videoconvert' return Gst.parse_bin_from_description(pipeline, True) def destroy(self): JingleRTPContent.destroy(self) self.pipeline.get_bus().disconnect_by_func(self._on_sync_message) def get_content(desc): if desc['media'] == 'audio': return JingleAudio elif desc['media'] == 'video': return JingleVideo contents[nbxmpp.NS_JINGLE_RTP] = get_content gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/jingle_session.py000066400000000000000000001064231326020644600266550ustar00rootroot00000000000000## ## Copyright (C) 2006 Gajim Team ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . """ Handles Jingle sessions (XEP 0166) """ #TODO: # * 'senders' attribute of 'content' element # * security preconditions # * actions: # - content-modify # - session-info # - security-info # - transport-accept, transport-reject # - Tie-breaking # * timeout import logging from enum import Enum, unique import nbxmpp from gajim.common import app from gajim.common.jingle_transport import get_jingle_transport, JingleTransportIBB from gajim.common.jingle_content import get_jingle_content, JingleContentSetupException, JingleContent from gajim.common.jingle_ft import State from gajim.common.connection_handlers_events import ( FilesProp, JingleRequestReceivedEvent, JingleDisconnectedReceivedEvent, JingleTransferCancelledEvent, JingleConnectedReceivedEvent, JingleErrorReceivedEvent) log = logging.getLogger("app.c.jingle_session") # FIXME: Move it to JingleSession.States? @unique class JingleStates(Enum): """ States in which jingle session may exist """ ENDED = 0 PENDING = 1 ACTIVE = 2 class OutOfOrder(Exception): """ Exception that should be raised when an action is received when in the wrong state """ class TieBreak(Exception): """ Exception that should be raised in case of a tie, when we overrule the other action """ class FailedApplication(Exception): """ Exception that should be raised in case responder supports none of the payload-types offered by the initiator """ class JingleSession: """ This represents one jingle session, that is, one or more content types negotiated between an initiator and a responder. """ def __init__(self, con, weinitiate, jid, iq_id=None, sid=None, werequest=False): """ con -- connection object, weinitiate -- boolean, are we the initiator? jid - jid of the other entity """ self.contents = {} # negotiated contents self.connection = con # connection to use # our full jid self.ourjid = app.get_jid_from_account(self.connection.name) if con.server_resource: self.ourjid = self.ourjid + '/' + con.server_resource self.peerjid = jid # jid we connect to # jid we use as the initiator self.initiator = self.ourjid if weinitiate else self.peerjid # jid we use as the responder self.responder = self.peerjid if weinitiate else self.ourjid # are we an initiator? self.weinitiate = weinitiate # Are we requesting or offering a file? self.werequest = werequest self.request = False # what state is session in? (one from JingleStates) self.state = JingleStates.ENDED if not sid: sid = con.connection.getAnID() self.sid = sid # sessionid # iq stanza id, used to determine which sessions to summon callback # later on when iq-result stanza arrives if iq_id is not None: self.iq_ids = [iq_id] else: self.iq_ids = [] self.accepted = True # is this session accepted by user # Tells whether this session is a file transfer or not self.session_type_ft = False # callbacks to call on proper contents # use .prepend() to add new callbacks, especially when you're going # to send error instead of ack self.callbacks = { 'content-accept': [self.__ack, self.__on_content_accept, self.__broadcast], 'content-add': [self.__ack, self.__on_content_add, self.__broadcast ], #TODO 'content-modify': [self.__ack], #TODO 'content-reject': [self.__ack, self.__on_content_remove], 'content-remove': [self.__ack, self.__on_content_remove], 'description-info': [self.__ack, self.__broadcast], #TODO 'security-info': [self.__ack], #TODO 'session-accept': [self.__ack, self.__on_session_accept, self.__on_content_accept, self.__broadcast], 'session-info': [self.__ack, self.__broadcast, self.__on_session_info], 'session-initiate': [self.__ack, self.__on_session_initiate, self.__broadcast], 'session-terminate': [self.__ack, self.__on_session_terminate, self.__broadcast_all], 'transport-info': [self.__ack, self.__broadcast], 'transport-replace': [self.__ack, self.__broadcast, self.__on_transport_replace], #TODO 'transport-accept': [self.__ack], #TODO 'transport-reject': [self.__ack], #TODO 'iq-result': [self.__broadcast], 'iq-error': [self.__on_error], } def collect_iq_id(self, iq_id): if iq_id is not None: self.iq_ids.append(iq_id) def approve_session(self): """ Called when user accepts session in UI (when we aren't the initiator) """ self.accept_session() def decline_session(self): """ Called when user declines session in UI (when we aren't the initiator) """ reason = nbxmpp.Node('reason') reason.addChild('decline') self._session_terminate(reason) def cancel_session(self): """ Called when user declines session in UI (when we aren't the initiator) """ reason = nbxmpp.Node('reason') reason.addChild('cancel') self._session_terminate(reason) def approve_content(self, media, name=None): content = self.get_content(media, name) if content: content.accepted = True self.on_session_state_changed(content) def reject_content(self, media, name=None): content = self.get_content(media, name) if content: if self.state == JingleStates.ACTIVE: self.__content_reject(content) content.destroy() self.on_session_state_changed() def end_session(self): """ Called when user stops or cancel session in UI """ reason = nbxmpp.Node('reason') if self.state == JingleStates.ACTIVE: reason.addChild('success') else: reason.addChild('cancel') self._session_terminate(reason) def get_content(self, media=None, name=None): if media is None: return for content in self.contents.values(): if content.media == media: if name is None or content.name == name: return content def add_content(self, name, content, creator='we'): """ Add new content to session. If the session is active, this will send proper stanza to update session Creator must be one of ('we', 'peer', 'initiator', 'responder') """ assert creator in ('we', 'peer', 'initiator', 'responder') if (creator == 'we' and self.weinitiate) or (creator == 'peer' and \ not self.weinitiate): creator = 'initiator' elif (creator == 'peer' and self.weinitiate) or (creator == 'we' and \ not self.weinitiate): creator = 'responder' content.creator = creator content.name = name self.contents[(creator, name)] = content if (creator == 'initiator') == self.weinitiate: # The content is from us, accept it content.accepted = True def remove_content(self, creator, name, reason=None): """ Remove the content `name` created by `creator` by sending content-remove, or by sending session-terminate if there is no content left. """ if (creator, name) in self.contents: content = self.contents[(creator, name)] self.__content_remove(content, reason) self.contents[(creator, name)].destroy() if not self.contents: self.end_session() def modify_content(self, creator, name, transport=None): ''' Currently used for transport replacement ''' content = self.contents[(creator, name)] transport.set_sid(content.transport.sid) transport.set_file_props(content.transport.file_props) content.transport = transport # The content will have to be resend now that it is modified content.sent = False content.accepted = True def on_session_state_changed(self, content=None): if self.state == JingleStates.ENDED: # Session not yet started, only one action possible: session-initiate if self.is_ready() and self.weinitiate: self.__session_initiate() elif self.state == JingleStates.PENDING: # We can either send a session-accept or a content-add if self.is_ready() and not self.weinitiate: self.__session_accept() elif content and (content.creator == 'initiator') == self.weinitiate: self.__content_add(content) elif content and self.weinitiate: self.__content_accept(content) elif self.state == JingleStates.ACTIVE: # We can either send a content-add or a content-accept. However, if # we are sending a file we can only use session_initiate. if not content: return we_created_content = (content.creator == 'initiator') \ == self.weinitiate if we_created_content and content.media == 'file': self.__session_initiate() if we_created_content: # We initiated this content. It's a pending content-add. self.__content_add(content) else: # The other side created this content, we accept it. self.__content_accept(content) def is_ready(self): """ Return True when all codecs and candidates are ready (for all contents) """ return (any((content.is_ready() for content in self.contents.values())) and self.accepted) def accept_session(self): """ Mark the session as accepted """ self.accepted = True self.on_session_state_changed() def start_session(self): """ Mark the session as ready to be started """ self.accepted = True self.on_session_state_changed() def send_session_info(self): pass def send_content_accept(self, content): assert self.state != JingleStates.ENDED stanza, jingle = self.__make_jingle('content-accept') jingle.addChild(node=content) self.connection.connection.send(stanza) def send_transport_info(self, content): assert self.state != JingleStates.ENDED stanza, jingle = self.__make_jingle('transport-info') jingle.addChild(node=content) self.connection.connection.send(stanza) self.collect_iq_id(stanza.getID()) def send_description_info(self, content): assert self.state != JingleStates.ENDED stanza, jingle = self.__make_jingle('description-info') jingle.addChild(node=content) self.connection.connection.send(stanza) def on_stanza(self, stanza): """ A callback for ConnectionJingle. It gets stanza, then tries to send it to all internally registered callbacks. First one to raise nbxmpp.NodeProcessed breaks function """ jingle = stanza.getTag('jingle') error = stanza.getTag('error') if error: # it's an iq-error stanza action = 'iq-error' elif jingle: # it's a jingle action action = jingle.getAttr('action') if action not in self.callbacks: self.__send_error(stanza, 'bad-request') return # FIXME: If we aren't initiated and it's not a session-initiate... if action not in ['session-initiate', 'session-terminate'] \ and self.state == JingleStates.ENDED: self.__send_error(stanza, 'item-not-found', 'unknown-session') return else: # it's an iq-result (ack) stanza action = 'iq-result' callables = self.callbacks[action] try: for call in callables: call(stanza=stanza, jingle=jingle, error=error, action=action) except nbxmpp.NodeProcessed: pass except TieBreak: self.__send_error(stanza, 'conflict', 'tiebreak') except OutOfOrder: # FIXME self.__send_error(stanza, 'unexpected-request', 'out-of-order') except FailedApplication: reason = nbxmpp.Node('reason') reason.addChild('failed-application') self._session_terminate(reason) def __ack(self, stanza, jingle, error, action): """ Default callback for action stanzas -- simple ack and stop processing """ response = stanza.buildReply('result') response.delChild(response.getQuery()) self.connection.connection.send(response) def __on_error(self, stanza, jingle, error, action): # FIXME text = error.getTagData('text') error_name = None for child in error.getChildren(): if child.getNamespace() == nbxmpp.NS_JINGLE_ERRORS: error_name = child.getName() break elif child.getNamespace() == nbxmpp.NS_STANZAS: error_name = child.getName() self.__dispatch_error(error_name, text, error.getAttr('type')) def transport_replace(self): transport = JingleTransportIBB() # For debug only, delete this and replace for a function # that will identify contents by its sid for creator, name in self.contents: self.modify_content(creator, name, transport) cont = self.contents[(creator, name)] cont.transport = transport stanza, jingle = self.__make_jingle('transport-replace') self.__append_contents(jingle) self.__broadcast(stanza, jingle, None, 'transport-replace') self.connection.connection.send(stanza) self.state = JingleStates.PENDING def __on_transport_replace(self, stanza, jingle, error, action): for content in jingle.iterTags('content'): creator = content['creator'] name = content['name'] if (creator, name) in self.contents: transport_ns = content.getTag('transport').getNamespace() if transport_ns == nbxmpp.NS_JINGLE_ICE_UDP: # FIXME: We don't manage anything else than ICE-UDP now... # What was the previous transport?!? # Anyway, content's transport is not modifiable yet pass elif transport_ns == nbxmpp.NS_JINGLE_IBB: transport = JingleTransportIBB() self.modify_content(creator, name, transport) self.state = JingleStates.PENDING self.contents[(creator, name)].state = State.TRANSPORT_REPLACE self.__ack(stanza, jingle, error, action) self.__session_accept() else: stanza, jingle = self.__make_jingle('transport-reject') content = jingle.setTag('content', attrs={'creator': creator, 'name': name}) content.setTag('transport', namespace=transport_ns) self.connection.connection.send(stanza) raise nbxmpp.NodeProcessed else: # FIXME: This ressource is unknown to us, what should we do? # For now, reject the transport stanza, jingle = self.__make_jingle('transport-reject') content = jingle.setTag('content', attrs={'creator': creator, 'name': name}) content.setTag('transport', namespace=transport_ns) self.connection.connection.send(stanza) raise nbxmpp.NodeProcessed def __on_session_info(self, stanza, jingle, error, action): # TODO: active, (un)hold, (un)mute payload = jingle.getPayload() if payload[0].getName() == 'ringing': # ignore ringing raise nbxmpp.NodeProcessed if self.state != JingleStates.ACTIVE: raise OutOfOrder for child in payload: if child.getName() == 'checksum': hash_ = child.getTag('file').getTag(name='hash', namespace=nbxmpp.NS_HASHES_2) algo = hash_.getAttr('algo') if algo in nbxmpp.Hashes2.supported: file_props = FilesProp.getFileProp(self.connection.name, self.sid) file_props.algo = algo file_props.hash_ = hash_.getData() raise nbxmpp.NodeProcessed self.__send_error(stanza, 'feature-not-implemented', 'unsupported-info', type_='modify') raise nbxmpp.NodeProcessed def __on_content_remove(self, stanza, jingle, error, action): for content in jingle.iterTags('content'): creator = content['creator'] name = content['name'] if (creator, name) in self.contents: content = self.contents[(creator, name)] # TODO: this will fail if content is not an RTP content app.nec.push_incoming_event(JingleDisconnectedReceivedEvent( None, conn=self.connection, jingle_session=self, media=content.media, reason='removed')) content.destroy() if not self.contents: reason = nbxmpp.Node('reason') reason.setTag('success') self._session_terminate(reason) def __on_session_accept(self, stanza, jingle, error, action): # FIXME if self.state != JingleStates.PENDING: raise OutOfOrder self.state = JingleStates.ACTIVE @staticmethod def __on_content_accept(stanza, jingle, error, action): """ Called when we get content-accept stanza or equivalent one (like session-accept) """ # check which contents are accepted for content in jingle.iterTags('content'): creator = content['creator'] # TODO name = content['name'] def __on_content_add(self, stanza, jingle, error, action): if self.state == JingleStates.ENDED: raise OutOfOrder parse_result = self.__parse_contents(jingle) contents = parse_result[0] rejected_contents = parse_result[1] # for name, creator in rejected_contents: # TODO # content = JingleContent() # self.add_content(name, content, creator) # self.__content_reject(content) # self.contents[(content.creator, content.name)].destroy() app.nec.push_incoming_event(JingleRequestReceivedEvent(None, conn=self.connection, jingle_session=self, contents=contents)) def __on_session_initiate(self, stanza, jingle, error, action): """ We got a jingle session request from other entity, therefore we are the receiver... Unpack the data, inform the user """ if self.state != JingleStates.ENDED: raise OutOfOrder self.initiator = jingle['initiator'] self.responder = self.ourjid self.peerjid = self.initiator self.accepted = False # user did not accept this session yet # TODO: If the initiator is unknown to the receiver (e.g., via presence # subscription) and the receiver has a policy of not communicating via # Jingle with unknown entities, it SHOULD return a # error. # Lets check what kind of jingle session does the peer want contents, contents_rejected, reason_txt = self.__parse_contents(jingle) # If we are not receivin a file # Check if there's already a session with this user: if contents[0].media != 'file': for session in self.connection.iter_jingle_sessions(self.peerjid): if session is not self: reason = nbxmpp.Node('reason') alternative_session = reason.setTag('alternative-session') alternative_session.setTagData('sid', session.sid) self.__ack(stanza, jingle, error, action) self._session_terminate(reason) raise nbxmpp.NodeProcessed else: # Stop if we don't have the requested file or the peer is not # allowed to request the file request = contents[0].senders == 'responder' if request: self.request = True hash_tag = request.getTag('file').getTag('hash') hash_data = hash_tag.getData() if hash_tag else None n = request.getTag('file').getTag('name') n = n.getData() if n else None pjid = app.get_jid_without_resource(self.peerjid) file_info = self.connection.get_file_info(pjid, hash_data, n, self.connection.name) if not file_info: log.warning('The peer %s is requesting a ' \ 'file that we dont have or ' \ 'it is not allowed to request', pjid) self.decline_session() raise nbxmpp.NodeProcessed # If there's no content we understand... if not contents: # TODO: http://xmpp.org/extensions/xep-0166.html#session-terminate reason = nbxmpp.Node('reason') reason.setTag(reason_txt) self.__ack(stanza, jingle, error, action) self._session_terminate(reason) raise nbxmpp.NodeProcessed self.state = JingleStates.PENDING # Send event about starting a session app.nec.push_incoming_event(JingleRequestReceivedEvent(None, conn=self.connection, jingle_session=self, contents=contents[0])) def __broadcast(self, stanza, jingle, error, action): """ Broadcast the stanza contents to proper content handlers """ #if jingle is None: # it is a iq-result stanza # for cn in self.contents.values(): # cn.on_stanza(stanza, None, error, action) # return # special case: iq-result stanza does not come with a jingle element if action == 'iq-result': for cn in self.contents.values(): cn.on_stanza(stanza, None, error, action) return for content in jingle.iterTags('content'): name = content['name'] creator = content['creator'] if (creator, name) not in self.contents: text = 'Content %s (created by %s) does not exist' % (name, creator) self.__send_error(stanza, 'bad-request', text=text, type_='_modify') raise nbxmpp.NodeProcessed else: cn = self.contents[(creator, name)] cn.on_stanza(stanza, content, error, action) def __on_session_terminate(self, stanza, jingle, error, action): self.connection.delete_jingle_session(self.sid) reason, text = self.__reason_from_stanza(jingle) if reason not in ('success', 'cancel', 'decline'): self.__dispatch_error(reason, text) if text: text = '%s (%s)' % (reason, text) else: # TODO text = reason if reason == 'cancel' and self.session_type_ft: app.nec.push_incoming_event(JingleTransferCancelledEvent(None, conn=self.connection, jingle_session=self, media=None, reason=text)) def __broadcast_all(self, stanza, jingle, error, action): """ Broadcast the stanza to all content handlers """ for content in self.contents.values(): content.on_stanza(stanza, None, error, action) def __parse_contents(self, jingle): # TODO: Needs some reworking contents = [] contents_rejected = [] reasons = set() for element in jingle.iterTags('content'): senders = element.getAttr('senders') transport = get_jingle_transport(element.getTag('transport')) if transport: transport.ourjid = self.ourjid content_type = get_jingle_content(element.getTag('description')) if content_type: try: if transport: content = content_type( self, transport=transport, senders=senders) self.add_content(element['name'], content, 'peer') contents.append(content) else: reasons.add('unsupported-transports') contents_rejected.append((element['name'], 'peer')) except JingleContentSetupException: reasons.add('failed-application') else: contents_rejected.append((element['name'], 'peer')) reasons.add('unsupported-applications') failure_reason = None # Store the first reason of failure for reason in ('failed-application', 'unsupported-transports', 'unsupported-applications'): if reason in reasons: failure_reason = reason break return (contents, contents_rejected, failure_reason) def __dispatch_error(self, error=None, text=None, type_=None): if text: text = '%s (%s)' % (error, text) if type_ != 'modify': app.nec.push_incoming_event(JingleErrorReceivedEvent(None, conn=self.connection, jingle_session=self, reason=text or error)) @staticmethod def __reason_from_stanza(stanza): # TODO: Move to GUI? reason = 'success' reasons = [ 'success', 'busy', 'cancel', 'connectivity-error', 'decline', 'expired', 'failed-application', 'failed-transport', 'general-error', 'gone', 'incompatible-parameters', 'media-error', 'security-error', 'timeout', 'unsupported-applications', 'unsupported-transports' ] tag = stanza.getTag('reason') text = '' if tag: text = tag.getTagData('text') for r in reasons: if tag.getTag(r): reason = r break return (reason, text) def __make_jingle(self, action, reason=None): stanza = nbxmpp.Iq(typ='set', to=nbxmpp.JID(self.peerjid), frm=self.ourjid) attrs = { 'action': action, 'sid': self.sid, 'initiator' : self.initiator } jingle = stanza.addChild('jingle', attrs=attrs, namespace=nbxmpp.NS_JINGLE) if reason is not None: jingle.addChild(node=reason) return stanza, jingle def __send_error(self, stanza, error, jingle_error=None, text=None, type_=None): err_stanza = nbxmpp.Error(stanza, '%s %s' % (nbxmpp.NS_STANZAS, error)) err = err_stanza.getTag('error') if type_: err.setAttr('type', type_) if jingle_error: err.setTag(jingle_error, namespace=nbxmpp.NS_JINGLE_ERRORS) if text: err.setTagData('text', text) self.connection.connection.send(err_stanza) self.__dispatch_error(jingle_error or error, text, type_) @staticmethod def __append_content(jingle, content): """ Append element to element """ jingle.addChild('content', attrs={'name': content.name, 'creator': content.creator, 'senders': content.senders}) def __append_contents(self, jingle): """ Append all elements to """ # TODO: integrate with __appendContent? # TODO: parameters 'name', 'content'? for content in self.contents.values(): if content.is_ready(): self.__append_content(jingle, content) def __session_initiate(self): assert self.state == JingleStates.ENDED stanza, jingle = self.__make_jingle('session-initiate') self.__append_contents(jingle) self.__broadcast(stanza, jingle, None, 'session-initiate-sent') self.connection.connection.send(stanza) self.collect_iq_id(stanza.getID()) self.state = JingleStates.PENDING def __session_accept(self): assert self.state == JingleStates.PENDING stanza, jingle = self.__make_jingle('session-accept') self.__append_contents(jingle) self.__broadcast(stanza, jingle, None, 'session-accept-sent') self.connection.connection.send(stanza) self.collect_iq_id(stanza.getID()) self.state = JingleStates.ACTIVE def __session_info(self, payload=None): assert self.state != JingleStates.ENDED stanza, jingle = self.__make_jingle('session-info') if payload: jingle.addChild(node=payload) self.connection.connection.send(stanza) def _JingleFileTransfer__session_info(self, payload): # For some strange reason when I call # self.session.__session_info(payload) from the jingleFileTransfer object # within a thread, this method gets called instead. Even though, it # isn't being called explicitly. self.__session_info(payload) def _session_terminate(self, reason=None): stanza, jingle = self.__make_jingle('session-terminate', reason=reason) self.__broadcast_all(stanza, jingle, None, 'session-terminate-sent') if self.connection.connection and self.connection.connected >= 2: self.connection.connection.send(stanza) # TODO: Move to GUI? reason, text = self.__reason_from_stanza(jingle) if reason not in ('success', 'cancel', 'decline'): self.__dispatch_error(reason, text) if text: text = '%s (%s)' % (reason, text) else: text = reason self.connection.delete_jingle_session(self.sid) app.nec.push_incoming_event(JingleDisconnectedReceivedEvent(None, conn=self.connection, jingle_session=self, media=None, reason=text)) def __content_add(self, content): # TODO: test assert self.state != JingleStates.ENDED stanza, jingle = self.__make_jingle('content-add') self.__append_content(jingle, content) self.__broadcast(stanza, jingle, None, 'content-add-sent') id_ = self.connection.connection.send(stanza) self.collect_iq_id(id_) def __content_accept(self, content): # TODO: test assert self.state != JingleStates.ENDED stanza, jingle = self.__make_jingle('content-accept') self.__append_content(jingle, content) self.__broadcast(stanza, jingle, None, 'content-accept-sent') id_ = self.connection.connection.send(stanza) self.collect_iq_id(id_) def __content_reject(self, content): assert self.state != JingleStates.ENDED stanza, jingle = self.__make_jingle('content-reject') self.__append_content(jingle, content) self.connection.connection.send(stanza) # TODO: this will fail if content is not an RTP content app.nec.push_incoming_event(JingleDisconnectedReceivedEvent(None, conn=self.connection, jingle_session=self, media=content.media, reason='rejected')) def __content_modify(self): assert self.state != JingleStates.ENDED def __content_remove(self, content, reason=None): assert self.state != JingleStates.ENDED if self.connection.connection and self.connection.connected > 1: stanza, jingle = self.__make_jingle('content-remove', reason=reason) self.__append_content(jingle, content) self.connection.connection.send(stanza) # TODO: this will fail if content is not an RTP content app.nec.push_incoming_event(JingleDisconnectedReceivedEvent(None, conn=self.connection, jingle_session=self, media=content.media, reason='removed')) def content_negotiated(self, media): app.nec.push_incoming_event(JingleConnectedReceivedEvent(None, conn=self.connection, jingle_session=self, media=media)) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/jingle_transport.py000066400000000000000000000421111326020644600272170ustar00rootroot00000000000000## ## Copyright (C) 2006 Gajim Team ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . """ Handles Jingle Transports (currently only ICE-UDP) """ import logging import socket from enum import IntEnum, unique import nbxmpp from gajim.common import app log = logging.getLogger('gajim.c.jingle_transport') transports = {} def get_jingle_transport(node): namespace = node.getNamespace() if namespace in transports: return transports[namespace](node) @unique class TransportType(IntEnum): """ Possible types of a JingleTransport """ ICEUDP = 1 SOCKS5 = 2 IBB = 3 class JingleTransport: """ An abstraction of a transport in Jingle sessions """ __slots__ = ['type_', 'candidates', 'remote_candidates', 'connection', 'file_props', 'ourjid', 'sid'] def __init__(self, type_): self.type_ = type_ self.candidates = [] self.remote_candidates = [] self.connection = None self.file_props = None self.ourjid = None self.sid = None def _iter_candidates(self): for candidate in self.candidates: yield self.make_candidate(candidate) def make_candidate(self, candidate): """ Build a candidate stanza for the given candidate """ pass def make_transport(self, candidates=None): """ Build a transport stanza with the given candidates (or self.candidates if candidates is None) """ if not candidates: candidates = list(self._iter_candidates()) else: candidates = (self.make_candidate(candidate) for candidate in candidates) transport = nbxmpp.Node('transport', payload=candidates) return transport def parse_transport_stanza(self, transport): """ Return the list of transport candidates from a transport stanza """ return [] def set_connection(self, conn): self.connection = conn if not self.sid: self.sid = self.connection.connection.getAnID() def set_file_props(self, file_props): self.file_props = file_props def set_our_jid(self, jid): self.ourjid = jid def set_sid(self, sid): self.sid = sid class JingleTransportSocks5(JingleTransport): """ Socks5 transport in jingle scenario Note: Don't forget to call set_file_props after initialization """ def __init__(self, node=None): JingleTransport.__init__(self, TransportType.SOCKS5) self.connection = None self.remote_candidates = [] self.sid = None if node and node.getAttr('sid'): self.sid = node.getAttr('sid') def make_candidate(self, candidate): log.info('candidate dict, %s', candidate) attrs = { 'cid': candidate['candidate_id'], 'host': candidate['host'], 'jid': candidate['jid'], 'port': candidate['port'], 'priority': candidate['priority'], 'type': candidate['type'] } return nbxmpp.Node('candidate', attrs=attrs) def make_transport(self, candidates=None, add_candidates=True): if add_candidates: self._add_local_ips_as_candidates() self._add_additional_candidates() self._add_proxy_candidates() transport = JingleTransport.make_transport(self, candidates) else: transport = nbxmpp.Node('transport') transport.setNamespace(nbxmpp.NS_JINGLE_BYTESTREAM) transport.setAttr('sid', self.sid) if self.file_props.dstaddr: transport.setAttr('dstaddr', self.file_props.dstaddr) return transport def parse_transport_stanza(self, transport): candidates = [] for candidate in transport.iterTags('candidate'): typ = 'direct' # default value if candidate.has_attr('type'): typ = candidate['type'] cand = { 'state': 0, 'target': self.ourjid, 'host': candidate['host'], 'port': int(candidate['port']), 'candidate_id': candidate['cid'], 'type': typ, 'priority': candidate['priority'] } candidates.append(cand) # we need this when we construct file_props on session-initiation if candidates: self.remote_candidates = candidates return candidates def _add_candidates(self, candidates): for cand in candidates: in_remote = False for cand2 in self.remote_candidates: if cand['host'] == cand2['host'] and \ cand['port'] == cand2['port']: in_remote = True break if not in_remote: self.candidates.append(cand) def _add_local_ips_as_candidates(self): if not app.config.get_per('accounts', self.connection.name, 'ft_send_local_ips'): return if not self.connection: return port = int(app.config.get('file_transfers_port')) #type preference of connection type. XEP-0260 section 2.2 type_preference = 126 priority = (2**16) * type_preference hosts = set() local_ip_cand = [] candidate = { 'host': self.connection.peerhost[0], 'candidate_id': self.connection.connection.getAnID(), 'port': port, 'type': 'direct', 'jid': self.ourjid, 'priority': priority } hosts.add(self.connection.peerhost[0]) local_ip_cand.append(candidate) try: for addrinfo in socket.getaddrinfo(socket.gethostname(), None): addr = addrinfo[4][0] if not addr in hosts and not addr.startswith('127.') and \ addr != '::1': candidate = { 'host': addr, 'candidate_id': self.connection.connection.getAnID(), 'port': port, 'type': 'direct', 'jid': self.ourjid, 'priority': priority, 'initiator': self.file_props.sender, 'target': self.file_props.receiver } hosts.add(addr) local_ip_cand.append(candidate) except socket.gaierror: pass # ignore address-related errors for getaddrinfo try: from netifaces import interfaces, ifaddresses, AF_INET, AF_INET6 for ifaceName in interfaces(): addresses = ifaddresses(ifaceName) if AF_INET in addresses: for address in addresses[AF_INET]: addr = address['addr'] if addr in hosts or addr.startswith('127.'): continue candidate = { 'host': addr, 'candidate_id': self.connection.connection.getAnID(), 'port': port, 'type': 'direct', 'jid': self.ourjid, 'priority': priority, 'initiator': self.file_props.sender, 'target': self.file_props.receiver } hosts.add(addr) local_ip_cand.append(candidate) if AF_INET6 in addresses: for address in addresses[AF_INET6]: addr = address['addr'] if addr in hosts or addr.startswith('::1') or \ addr.count(':') != 7: continue candidate = { 'host': addr, 'candidate_id': self.connection.connection.getAnID(), 'port': port, 'type': 'direct', 'jid': self.ourjid, 'priority': priority, 'initiator': self.file_props.sender, 'target': self.file_props.receiver } hosts.add(addr) local_ip_cand.append(candidate) except ImportError: pass self._add_candidates(local_ip_cand) def _add_additional_candidates(self): if not self.connection: return type_preference = 126 priority = (2**16) * type_preference additional_ip_cand = [] port = int(app.config.get('file_transfers_port')) ft_add_hosts = app.config.get('ft_add_hosts_to_send') if ft_add_hosts: hosts = [e.strip() for e in ft_add_hosts.split(',')] for host in hosts: candidate = { 'host': host, 'candidate_id': self.connection.connection.getAnID(), 'port': port, 'type': 'direct', 'jid': self.ourjid, 'priority': priority, 'initiator': self.file_props.sender, 'target': self.file_props.receiver } additional_ip_cand.append(candidate) self._add_candidates(additional_ip_cand) def _add_proxy_candidates(self): if not self.connection: return type_preference = 10 priority = (2**16) * type_preference proxy_cand = [] socks5conn = self.connection proxyhosts = socks5conn._get_file_transfer_proxies_from_config(self.file_props) if proxyhosts: self.file_props.proxyhosts = proxyhosts for proxyhost in proxyhosts: candidate = { 'host': proxyhost['host'], 'candidate_id': self.connection.connection.getAnID(), 'port': int(proxyhost['port']), 'type': 'proxy', 'jid': proxyhost['jid'], 'priority': priority, 'initiator': self.file_props.sender, 'target': self.file_props.receiver } proxy_cand.append(candidate) self._add_candidates(proxy_cand) def get_content(self): sesn = self.connection.get_jingle_session(self.ourjid, self.file_props.sid) for content in sesn.contents.values(): if content.transport == self: return content def _on_proxy_auth_ok(self, proxy): log.info('proxy auth ok for ' + str(proxy)) # send activate request to proxy, send activated confirmation to peer if not self.connection: return sesn = self.connection.get_jingle_session(self.ourjid, self.file_props.sid) if sesn is None: return iq = nbxmpp.Iq(to=proxy['jid'], frm=self.ourjid, typ='set') auth_id = "au_" + proxy['sid'] iq.setID(auth_id) query = iq.setTag('query', namespace=nbxmpp.NS_BYTESTREAM) query.setAttr('sid', proxy['sid']) activate = query.setTag('activate') activate.setData(sesn.peerjid) iq.setID(auth_id) self.connection.connection.send(iq) content = nbxmpp.Node('content') content.setAttr('creator', 'initiator') content_object = self.get_content() content.setAttr('name', content_object.name) transport = nbxmpp.Node('transport') transport.setNamespace(nbxmpp.NS_JINGLE_BYTESTREAM) transport.setAttr('sid', proxy['sid']) activated = nbxmpp.Node('activated') cid = None if 'cid' in proxy: cid = proxy['cid'] else: for host in self.candidates: if host['host'] == proxy['host'] and host['jid'] == proxy['jid'] \ and host['port'] == proxy['port']: cid = host['candidate_id'] break if cid is None: raise Exception('cid is missing') activated.setAttr('cid', cid) transport.addChild(node=activated) content.addChild(node=transport) sesn.send_transport_info(content) class JingleTransportIBB(JingleTransport): def __init__(self, node=None, block_sz=None): JingleTransport.__init__(self, TransportType.IBB) if block_sz: self.block_sz = block_sz else: self.block_sz = '4096' self.connection = None self.sid = None if node and node.getAttr('sid'): self.sid = node.getAttr('sid') def make_transport(self): transport = nbxmpp.Node('transport') transport.setNamespace(nbxmpp.NS_JINGLE_IBB) transport.setAttr('block-size', self.block_sz) transport.setAttr('sid', self.sid) return transport try: from gi.repository import Farstream except ImportError: pass class JingleTransportICEUDP(JingleTransport): def __init__(self, node): JingleTransport.__init__(self, TransportType.ICEUDP) def make_candidate(self, candidate): types = { Farstream.CandidateType.HOST: 'host', Farstream.CandidateType.SRFLX: 'srflx', Farstream.CandidateType.PRFLX: 'prflx', Farstream.CandidateType.RELAY: 'relay', Farstream.CandidateType.MULTICAST: 'multicast' } attrs = { 'component': candidate.component_id, 'foundation': '1', # hack 'generation': '0', 'ip': candidate.ip, 'network': '0', 'port': candidate.port, 'priority': int(candidate.priority), # hack 'id': app.get_an_id() } if candidate.type in types: attrs['type'] = types[candidate.type] if candidate.proto == Farstream.NetworkProtocol.UDP: attrs['protocol'] = 'udp' else: # we actually don't handle properly different tcp options in jingle attrs['protocol'] = 'tcp' return nbxmpp.Node('candidate', attrs=attrs) def make_transport(self, candidates=None): transport = JingleTransport.make_transport(self, candidates) transport.setNamespace(nbxmpp.NS_JINGLE_ICE_UDP) if self.candidates and self.candidates[0].username and \ self.candidates[0].password: transport.setAttr('ufrag', self.candidates[0].username) transport.setAttr('pwd', self.candidates[0].password) return transport def parse_transport_stanza(self, transport): candidates = [] for candidate in transport.iterTags('candidate'): foundation = str(candidate['foundation']) component_id = int(candidate['component']) ip = str(candidate['ip']) port = int(candidate['port']) base_ip = None base_port = 0 if candidate['protocol'] == 'udp': proto = Farstream.NetworkProtocol.UDP else: # we actually don't handle properly different tcp options in # jingle proto = Farstream.NetworkProtocol.TCP priority = int(candidate['priority']) types = { 'host': Farstream.CandidateType.HOST, 'srflx': Farstream.CandidateType.SRFLX, 'prflx': Farstream.CandidateType.PRFLX, 'relay': Farstream.CandidateType.RELAY, 'multicast': Farstream.CandidateType.MULTICAST } if 'type' in candidate and candidate['type'] in types: type_ = types[candidate['type']] else: log.warning('Unknown type %s', candidate['type']) type_ = Farstream.CandidateType.HOST username = str(transport['ufrag']) password = str(transport['pwd']) ttl = 0 cand = Farstream.Candidate.new_full(foundation, component_id, ip, port, base_ip, base_port, proto, priority, type_, username, password, ttl) candidates.append(cand) self.remote_candidates.extend(candidates) return candidates transports[nbxmpp.NS_JINGLE_ICE_UDP] = JingleTransportICEUDP transports[nbxmpp.NS_JINGLE_BYTESTREAM] = JingleTransportSocks5 transports[nbxmpp.NS_JINGLE_IBB] = JingleTransportIBB gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/jingle_xtls.py000066400000000000000000000240351326020644600261620ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/jingle_xtls.py ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import logging import os import nbxmpp from gajim.common import app log = logging.getLogger('gajim.c.jingle_xtls') PYOPENSSL_PRESENT = False # key-exchange id -> [callback, args], accept that session once key-exchange completes pending_contents = {} def key_exchange_pend(id_, cb, args): # args is a list pending_contents[id_] = [cb, args] def approve_pending_content(id_): cb = pending_contents[id_][0] args = pending_contents[id_][1] cb(*args) try: import OpenSSL.SSL PYOPENSSL_PRESENT = True except ImportError: log.info("PyOpenSSL not available") if PYOPENSSL_PRESENT: from OpenSSL import SSL, crypto TYPE_RSA = crypto.TYPE_RSA TYPE_DSA = crypto.TYPE_DSA SELF_SIGNED_CERTIFICATE = 'localcert' DH_PARAMS = 'dh_params.pem' DEFAULT_DH_PARAMS = 'dh4096.pem' def default_callback(connection, certificate, error_num, depth, return_code): log.info("certificate: %s", certificate) return return_code def load_cert_file(cert_path, cert_store=None): """ This is almost identical to the one in nbxmpp.tls_nb """ if not os.path.isfile(cert_path): return None try: f = open(cert_path) except IOError as e: log.warning('Unable to open certificate file %s: %s', cert_path, str(e)) return None lines = f.readlines() i = 0 begin = -1 for line in lines: if 'BEGIN CERTIFICATE' in line: begin = i elif 'END CERTIFICATE' in line and begin > -1: cert = ''.join(lines[begin:i+2]) try: x509cert = OpenSSL.crypto.load_certificate( OpenSSL.crypto.FILETYPE_PEM, cert) if cert_store: cert_store.add_cert(x509cert) f.close() return x509cert except OpenSSL.crypto.Error as exception_obj: log.warning('Unable to load a certificate from file %s: %s', cert_path, exception_obj.args[0][0][2]) except: log.warning('Unknown error while loading certificate from file ' '%s', cert_path) begin = -1 i += 1 f.close() def get_context(fingerprint, verify_cb=None, remote_jid=None): """ constructs and returns the context objects """ ctx = SSL.Context(SSL.SSLv23_METHOD) flags = (SSL.OP_NO_SSLv2 | SSL.OP_NO_SSLv3 | SSL.OP_SINGLE_DH_USE \ | SSL.OP_NO_TICKET) ctx.set_options(flags) ctx.set_cipher_list('HIGH:!aNULL:!3DES') if fingerprint == 'server': # for testing purposes only ctx.set_verify(SSL.VERIFY_NONE|SSL.VERIFY_FAIL_IF_NO_PEER_CERT, verify_cb or default_callback) elif fingerprint == 'client': ctx.set_verify(SSL.VERIFY_PEER, verify_cb or default_callback) cert_name = os.path.join(app.MY_CERT_DIR, SELF_SIGNED_CERTIFICATE) ctx.use_privatekey_file((cert_name + '.pkey').encode('utf-8')) ctx.use_certificate_file((cert_name + '.cert').encode('utf-8')) # Try to load Diffie-Hellman parameters. # First try user DH parameters, if this fails load the default DH parameters dh_params_name = os.path.join(app.MY_CERT_DIR, DH_PARAMS) try: with open(dh_params_name, "r") as dh_params_file: ctx.load_tmp_dh(dh_params_name.encode('utf-8')) except FileNotFoundError as err: default_dh_params_name = os.path.join(app.DATA_DIR, 'other', DEFAULT_DH_PARAMS) try: with open(default_dh_params_name, "r") as default_dh_params_file: ctx.load_tmp_dh(default_dh_params_name.encode('utf-8')) except FileNotFoundError as err: log.error('Unable to load default DH parameter file: %s, %s', default_dh_params_name, err) raise if remote_jid: store = ctx.get_cert_store() path = os.path.join(os.path.expanduser(app.MY_PEER_CERTS_PATH), remote_jid) + '.cert' if os.path.exists(path): load_cert_file(path, cert_store=store) log.debug('certificate file %s loaded fingerprint %s', path, fingerprint) return ctx def read_cert(certpath): certificate = '' with open(certpath, 'r') as certfile: for line in certfile.readlines(): if not line.startswith('-'): certificate += line return certificate def send_cert(con, jid_from, sid): certpath = os.path.join(app.MY_CERT_DIR, SELF_SIGNED_CERTIFICATE) + \ '.cert' certificate = read_cert(certpath) iq = nbxmpp.Iq('result', to=jid_from) iq.setAttr('id', sid) pubkey = iq.setTag('pubkeys') pubkey.setNamespace(nbxmpp.NS_PUBKEY_PUBKEY) keyinfo = pubkey.setTag('keyinfo') name = keyinfo.setTag('name') name.setData('CertificateHash') cert = keyinfo.setTag('x509cert') cert.setData(certificate) con.send(iq) def handle_new_cert(con, obj, jid_from): jid = app.get_jid_without_resource(jid_from) certpath = os.path.join(os.path.expanduser(app.MY_PEER_CERTS_PATH), jid) certpath += '.cert' id_ = obj.getAttr('id') x509cert = obj.getTag('pubkeys').getTag('keyinfo').getTag('x509cert') cert = x509cert.getData() f = open(certpath, 'w') f.write('-----BEGIN CERTIFICATE-----\n') f.write(cert) f.write('-----END CERTIFICATE-----\n') f.close() approve_pending_content(id_) def check_cert(jid, fingerprint): certpath = os.path.join(os.path.expanduser(app.MY_PEER_CERTS_PATH), jid) certpath += '.cert' if os.path.exists(certpath): cert = load_cert_file(certpath) if cert: try: digest_algo = cert.get_signature_algorithm().decode('utf-8').\ split('With')[0] except AttributeError as e: # Old py-OpenSSL is missing get_signature_algorithm digest_algo = "sha256" if cert.digest(digest_algo) == fingerprint: return True return False def send_cert_request(con, to_jid): iq = nbxmpp.Iq('get', to=to_jid) id_ = con.connection.getAnID() iq.setAttr('id', id_) pubkey = iq.setTag('pubkeys') pubkey.setNamespace(nbxmpp.NS_PUBKEY_PUBKEY) con.connection.send(iq) return str(id_) # the following code is partly due to pyopenssl examples def createKeyPair(type_, bits): """ Create a public/private key pair. Arguments: type_ - Key type, must be one of TYPE_RSA and TYPE_DSA bits - Number of bits to use in the key Returns: The public/private key pair in a PKey object """ pkey = crypto.PKey() pkey.generate_key(type_, bits) return pkey def createCertRequest(pkey, digest="sha256", **name): """ Create a certificate request. Arguments: pkey - The key to associate with the request digest - Digestion method to use for signing, default is sha256 **name - The name of the subject of the request, possible arguments are: C - Country name ST - State or province name L - Locality name O - Organization name OU - Organizational unit name CN - Common name emailAddress - E-mail address Returns: The certificate request in an X509Req object """ req = crypto.X509Req() subj = req.get_subject() for (key, value) in name.items(): setattr(subj, key, value) req.set_pubkey(pkey) req.sign(pkey, digest) return req def createCertificate(req, issuerCert, issuerKey, serial, notBefore, notAfter, digest="sha256"): """ Generate a certificate given a certificate request. Arguments: req - Certificate reqeust to use issuerCert - The certificate of the issuer issuerKey - The private key of the issuer serial - Serial number for the certificate notBefore - Timestamp (relative to now) when the certificate starts being valid notAfter - Timestamp (relative to now) when the certificate stops being valid digest - Digest method to use for signing, default is sha256 Returns: The signed certificate in an X509 object """ cert = crypto.X509() cert.set_serial_number(serial) cert.gmtime_adj_notBefore(notBefore) cert.gmtime_adj_notAfter(notAfter) cert.set_issuer(issuerCert.get_subject()) cert.set_subject(req.get_subject()) cert.set_pubkey(req.get_pubkey()) cert.sign(issuerKey, digest) return cert def make_certs(filepath, CN): """ make self signed certificates filepath : absolute path of certificate file, will be appended the '.pkey' and '.cert' extensions CN : common name """ key = createKeyPair(TYPE_RSA, 4096) req = createCertRequest(key, CN=CN) cert = createCertificate(req, req, key, 0, 0, 60*60*24*365*5) # five years with open(filepath + '.pkey', 'wb') as f: os.chmod(filepath + '.pkey', 0o600) f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, key)) with open(filepath + '.cert', 'wb') as f: f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert)) if __name__ == '__main__': make_certs('./selfcert', 'gajim') gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/location_listener.py000066400000000000000000000071741326020644600273620ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## src/common/location_listener.py ## ## Copyright (C) 2009-2014 Yann Leboulanger ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from datetime import datetime import logging from gajim.common import app import gi gi.require_version('Geoclue', '2.0') from gi.repository import Geoclue from gi.repository import GLib log = logging.getLogger('gajim.c.location_listener') class LocationListener: _instance = None @classmethod def get(cls): if cls._instance is None: cls._instance = cls() return cls._instance def __init__(self): self._data = {} # Note: do not remove third parameter `paramSpec` # because notify signal expects three parameters def _on_location_update(self, simple, paramSpec=None): location = simple.get_location() timestamp = location.get_property("timestamp")[0] lat = location.get_property("latitude") lon = location.get_property("longitude") alt = location.get_property("altitude") # in XEP-0080 it's horizontal accuracy acc = location.get_property("accuracy") # update data with info we just received self._data = {'lat': lat, 'lon': lon, 'alt': alt, 'accuracy': acc} self._data['timestamp'] = self._timestamp_to_utc(timestamp) self._send_location() def _on_simple_ready(self, obj, result): try: self.simple = Geoclue.Simple.new_finish(result) except GLib.Error as e: if e.domain == 'g-dbus-error-quark': log.warning("Could not enable geolocation: %s", e.message) else: raise else: self.simple.connect('notify::location', self._on_location_update) self._on_location_update(self.simple) def get_data(self): Geoclue.Simple.new("org.gajim.Gajim", Geoclue.AccuracyLevel.EXACT, None, self._on_simple_ready) def start(self): self.location_info = {} self.get_data() def _send_location(self): accounts = app.connections.keys() for acct in accounts: if not app.account_is_connected(acct): continue if not app.config.get_per('accounts', acct, 'publish_location'): continue if self.location_info == self._data: continue if 'timestamp' in self.location_info and 'timestamp' in self._data: last_data = self.location_info.copy() del last_data['timestamp'] new_data = self._data.copy() del new_data['timestamp'] if last_data == new_data: continue app.connections[acct].send_location(self._data) self.location_info = self._data.copy() def _timestamp_to_utc(self, timestamp): time = datetime.utcfromtimestamp(timestamp) return time.strftime('%Y-%m-%dT%H:%MZ') def enable(): listener = LocationListener.get() listener.start() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/logger.py000066400000000000000000001314131326020644600251160ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/logger.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2004-2005 Vincent Hanquez ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2006 Dimitur Kirov ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2007 Tomasz Melcer ## Julien Pivotto ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## """ This module allows to access the on-disk database of logs """ import os import sys import time import datetime import calendar import json from collections import namedtuple from gzip import GzipFile from io import BytesIO from gi.repository import GLib from enum import IntEnum, unique from gajim.common import exceptions from gajim.common import app import sqlite3 as sqlite LOG_DB_PATH = app.gajimpaths['LOG_DB'] LOG_DB_FOLDER, LOG_DB_FILE = os.path.split(LOG_DB_PATH) CACHE_DB_PATH = app.gajimpaths['CACHE_DB'] import logging log = logging.getLogger('gajim.c.logger') @unique class JIDConstant(IntEnum): NORMAL_TYPE = 0 ROOM_TYPE = 1 @unique class KindConstant(IntEnum): STATUS = 0 GCSTATUS = 1 GC_MSG = 2 SINGLE_MSG_RECV = 3 CHAT_MSG_RECV = 4 SINGLE_MSG_SENT = 5 CHAT_MSG_SENT = 6 ERROR = 7 def __str__(self): return str(self.value) @unique class ShowConstant(IntEnum): ONLINE = 0 CHAT = 1 AWAY = 2 XA = 3 DND = 4 OFFLINE = 5 @unique class TypeConstant(IntEnum): AIM = 0 GG = 1 HTTP_WS = 2 ICQ = 3 MSN = 4 QQ = 5 SMS = 6 SMTP = 7 TLEN = 8 YAHOO = 9 NEWMAIL = 10 RSS = 11 WEATHER = 12 MRIM = 13 NO_TRANSPORT = 14 @unique class SubscriptionConstant(IntEnum): NONE = 0 TO = 1 FROM = 2 BOTH = 3 class Logger: def __init__(self): self._jid_ids = {} self.con = None self.commit_timout_id = None if not os.path.exists(LOG_DB_PATH): # this can happen only the first time (the time we create the db) # db is not created here but in src/common/checks_paths.py return self.init_vars() if not os.path.exists(CACHE_DB_PATH): # this can happen cache database is not present when gajim is launched # db will be created in src/common/checks_paths.py return self.attach_cache_database() @staticmethod def namedtuple_factory(cursor, row): """ Usage: con.row_factory = namedtuple_factory """ fields = [col[0] for col in cursor.description] Row = namedtuple("Row", fields) named_row = Row(*row) if 'additional_data' in fields: named_row = named_row._replace( additional_data=json.loads(named_row.additional_data or '{}')) return named_row def dispatch(self, event, error): app.ged.raise_event(event, None, str(error)) def close_db(self): if self.con: self.con.close() self.con = None self.cur = None def open_db(self): self.close_db() # FIXME: sqlite3_open wants UTF8 strings. So a path with # non-ascii chars doesn't work. See #2812 and # http://lists.initd.org/pipermail/pysqlite/2005-August/000134.html back = os.getcwd() os.chdir(LOG_DB_FOLDER) # if locked, wait up to 20 sec to unlock # before raise (hopefully should be enough) self.con = sqlite.connect(LOG_DB_FILE, timeout=20.0, isolation_level='IMMEDIATE') os.chdir(back) self.con.row_factory = self.namedtuple_factory # DB functions self.con.create_function("like", 1, self._like) self.con.create_function("get_timeout", 0, self._get_timeout) self.cur = self.con.cursor() self.set_synchronous(False) def attach_cache_database(self): try: self.cur.execute("ATTACH DATABASE '%s' AS cache" % \ CACHE_DB_PATH.replace("'", "''")) except sqlite.Error as e: log.debug("Failed to attach cache database: %s" % str(e)) def set_synchronous(self, sync): try: if sync: self.cur.execute("PRAGMA synchronous = NORMAL") else: self.cur.execute("PRAGMA synchronous = OFF") except sqlite.Error as e: log.debug("Failed to set_synchronous(%s): %s" % (sync, str(e))) def init_vars(self): self.open_db() self.get_jid_ids_from_db() @staticmethod def _get_timeout(): """ returns the timeout in epoch """ timeout = app.config.get('restore_timeout') now = int(time.time()) if timeout > 0: timeout = now - (timeout * 60) return timeout @staticmethod def _like(search_str): return '%{}%'.format(search_str) def commit(self): try: self.con.commit() except sqlite.OperationalError as e: print(str(e), file=sys.stderr) self.commit_timout_id = None return False def _timeout_commit(self): if self.commit_timout_id: return self.commit_timout_id = GLib.timeout_add(500, self.commit) def simple_commit(self, sql_to_commit): """ Helper to commit """ self.cur.execute(sql_to_commit) self._timeout_commit() def get_jid_ids_from_db(self): """ Load all jid/jid_id tuples into a dict for faster access """ rows = self.con.execute( 'SELECT jid_id, jid, type FROM jids').fetchall() for row in rows: self._jid_ids[row.jid] = row def get_jids_in_db(self): return self._jid_ids.keys() def jid_is_from_pm(self, jid): """ If jid is gajim@conf/nkour it's likely a pm one, how we know gajim@conf is not a normal guy and nkour is not his resource? we ask if gajim@conf is already in jids (with type room jid) this fails if user disables logging for room and only enables for pm (so higly unlikely) and if we fail we do not go chaos (user will see the first pm as if it was message in room's public chat) and after that all okay """ if jid.find('/') > -1: possible_room_jid = jid.split('/', 1)[0] return self.jid_is_room_jid(possible_room_jid) else: # it's not a full jid, so it's not a pm one return False def jid_is_room_jid(self, jid): """ Return True if it's a room jid, False if it's not, None if we don't know """ self.cur.execute('SELECT type FROM jids WHERE jid=?', (jid,)) row = self.cur.fetchone() if row is None: return None else: if row.type == JIDConstant.ROOM_TYPE: return True return False @staticmethod def _get_family_jids(account, jid): """ Get all jids of the metacontacts family :param account: The account :param jid: The JID returns a list of JIDs' """ family = app.contacts.get_metacontacts_family(account, jid) if family: return [user['jid'] for user in family] return [jid] def get_account_id(self, account): jid = app.get_jid_from_account(account) return self.get_jid_id(jid, type_=JIDConstant.NORMAL_TYPE) def get_jid_id(self, jid, kind=None, type_=None): """ Get the jid id from a jid. In case the jid id is not found create a new one. :param jid: The JID :param kind: The KindConstant :param type_: The JIDConstant return the jid id """ if kind in (KindConstant.GC_MSG, KindConstant.GCSTATUS): type_ = JIDConstant.ROOM_TYPE elif kind is not None: type_ = JIDConstant.NORMAL_TYPE result = self._jid_ids.get(jid, None) if result is not None: return result.jid_id sql = 'SELECT jid_id, jid, type FROM jids WHERE jid = ?' row = self.con.execute(sql, [jid]).fetchone() if row is not None: self._jid_ids[jid] = row return row.jid_id if type_ is None: raise ValueError( 'Unable to insert new JID because type is missing') sql = 'INSERT INTO jids (jid, type) VALUES (?, ?)' lastrowid = self.con.execute(sql, (jid, type_)).lastrowid Row = namedtuple('Row', 'jid_id jid type') self._jid_ids[jid] = Row(lastrowid, jid, type_) self._timeout_commit() return lastrowid def convert_kind_values_to_db_api_values(self, kind): """ Convert from string style to constant ints for db """ if kind == 'status': kind_col = KindConstant.STATUS elif kind == 'gcstatus': kind_col = KindConstant.GCSTATUS elif kind == 'gc_msg': kind_col = KindConstant.GC_MSG elif kind == 'single_msg_recv': kind_col = KindConstant.SINGLE_MSG_RECV elif kind == 'single_msg_sent': kind_col = KindConstant.SINGLE_MSG_SENT elif kind == 'chat_msg_recv': kind_col = KindConstant.CHAT_MSG_RECV elif kind == 'chat_msg_sent': kind_col = KindConstant.CHAT_MSG_SENT elif kind == 'error': kind_col = KindConstant.ERROR return kind_col def convert_show_values_to_db_api_values(self, show): """ Convert from string style to constant ints for db """ if show == 'online': return ShowConstant.ONLINE elif show == 'chat': return ShowConstant.CHAT elif show == 'away': return ShowConstant.AWAY elif show == 'xa': return ShowConstant.XA elif show == 'dnd': return ShowConstant.DND elif show == 'offline': return ShowConstant.OFFLINE elif show is None: return ShowConstant.ONLINE else: # invisible in GC when someone goes invisible # it's a RFC violation .... but we should not crash return None def convert_human_transport_type_to_db_api_values(self, type_): """ Convert from string style to constant ints for db """ if type_ == 'aim': return TypeConstant.AIM if type_ == 'gadu-gadu': return TypeConstant.GG if type_ == 'http-ws': return TypeConstant.HTTP_WS if type_ == 'icq': return TypeConstant.ICQ if type_ == 'msn': return TypeConstant.MSN if type_ == 'qq': return TypeConstant.QQ if type_ == 'sms': return TypeConstant.SMS if type_ == 'smtp': return TypeConstant.SMTP if type_ in ('tlen', 'x-tlen'): return TypeConstant.TLEN if type_ == 'yahoo': return TypeConstant.YAHOO if type_ == 'newmail': return TypeConstant.NEWMAIL if type_ == 'rss': return TypeConstant.RSS if type_ == 'weather': return TypeConstant.WEATHER if type_ == 'mrim': return TypeConstant.MRIM if type_ == 'jabber': return TypeConstant.NO_TRANSPORT return None def convert_api_values_to_human_transport_type(self, type_id): """ Convert from constant ints for db to string style """ if type_id == TypeConstant.AIM: return 'aim' if type_id == TypeConstant.GG: return 'gadu-gadu' if type_id == TypeConstant.HTTP_WS: return 'http-ws' if type_id == TypeConstant.ICQ: return 'icq' if type_id == TypeConstant.MSN: return 'msn' if type_id == TypeConstant.QQ: return 'qq' if type_id == TypeConstant.SMS: return 'sms' if type_id == TypeConstant.SMTP: return 'smtp' if type_id == TypeConstant.TLEN: return 'tlen' if type_id == TypeConstant.YAHOO: return 'yahoo' if type_id == TypeConstant.NEWMAIL: return 'newmail' if type_id == TypeConstant.RSS: return 'rss' if type_id == TypeConstant.WEATHER: return 'weather' if type_id == TypeConstant.MRIM: return 'mrim' if type_id == TypeConstant.NO_TRANSPORT: return 'jabber' def convert_human_subscription_values_to_db_api_values(self, sub): """ Convert from string style to constant ints for db """ if sub == 'none': return SubscriptionConstant.NONE if sub == 'to': return SubscriptionConstant.TO if sub == 'from': return SubscriptionConstant.FROM if sub == 'both': return SubscriptionConstant.BOTH def convert_db_api_values_to_human_subscription_values(self, sub): """ Convert from constant ints for db to string style """ if sub == SubscriptionConstant.NONE: return 'none' if sub == SubscriptionConstant.TO: return 'to' if sub == SubscriptionConstant.FROM: return 'from' if sub == SubscriptionConstant.BOTH: return 'both' def insert_unread_events(self, message_id, jid_id): """ Add unread message with id: message_id """ sql = 'INSERT INTO unread_messages VALUES (%d, %d, 0)' % (message_id, jid_id) self.simple_commit(sql) def set_read_messages(self, message_ids): """ Mark all messages with ids in message_ids as read """ ids = ','.join([str(i) for i in message_ids]) sql = 'DELETE FROM unread_messages WHERE message_id IN (%s)' % ids self.simple_commit(sql) def set_shown_unread_msgs(self, msg_log_id): """ Mark unread message as shown un GUI """ sql = 'UPDATE unread_messages SET shown = 1 where message_id = %s' % \ msg_log_id self.simple_commit(sql) def reset_shown_unread_messages(self): """ Set shown field to False in unread_messages table """ sql = 'UPDATE unread_messages SET shown = 0' self.simple_commit(sql) def get_unread_msgs(self): """ Get all unread messages """ all_messages = [] try: self.cur.execute( 'SELECT message_id, shown from unread_messages') unread_results = self.cur.fetchall() except Exception: unread_results = [] for message in unread_results: msg_log_id = message.message_id shown = message.shown # here we get infos for that message, and related jid from jids table # do NOT change order of SELECTed things, unless you change function(s) # that called this function self.cur.execute(''' SELECT logs.log_line_id, logs.message, logs.time, logs.subject, jids.jid, logs.additional_data FROM logs, jids WHERE logs.log_line_id = %d AND logs.jid_id = jids.jid_id ''' % msg_log_id ) results = self.cur.fetchone() if results is None: # Log line is no more in logs table. remove it from unread_messages self.set_read_messages([msg_log_id]) continue all_messages.append((results, shown)) return all_messages def get_last_conversation_lines(self, account, jid, pending): """ Get recent messages Pending messages are already in queue to be printed when the ChatControl is opened, so we dont want to request those messages. How many messages are requested depends on the 'restore_lines' config value. How far back in time messages are requested depends on _get_timeout(). :param account: The account :param jid: The jid from which we request the conversation lines :param pending: How many messages are currently pending so we dont request those messages returns a list of namedtuples """ restore = app.config.get('restore_lines') if restore <= 0: return [] kinds = map(str, [KindConstant.SINGLE_MSG_RECV, KindConstant.SINGLE_MSG_SENT, KindConstant.CHAT_MSG_RECV, KindConstant.CHAT_MSG_SENT, KindConstant.ERROR]) jids = self._get_family_jids(account, jid) sql = ''' SELECT time, kind, message, subject, additional_data FROM logs NATURAL JOIN jids WHERE jid IN ({jids}) AND kind IN ({kinds}) AND time > get_timeout() ORDER BY time DESC, log_line_id DESC LIMIT ? OFFSET ? '''.format(jids=', '.join('?' * len(jids)), kinds=', '.join(kinds)) try: messages = self.con.execute( sql, tuple(jids) + (restore, pending)).fetchall() except sqlite.DatabaseError: self.dispatch('DB_ERROR', exceptions.DatabaseMalformed(LOG_DB_PATH)) return [] messages.reverse() return messages def get_unix_time_from_date(self, year, month, day): # year (fe 2005), month (fe 11), day (fe 25) # returns time in seconds for the second that starts that date since epoch # gimme unixtime from year month day: d = datetime.date(year, month, day) local_time = d.timetuple() # time tuple (compat with time.localtime()) # we have time since epoch baby :) start_of_day = int(time.mktime(local_time)) return start_of_day def get_conversation_for_date(self, account, jid, date): """ Load the complete conversation with a given jid on a specific date :param account: The account :param jid: The jid for which we request the conversation :param date: datetime.datetime instance example: datetime.datetime(year, month, day) returns a list of namedtuples """ jids = self._get_family_jids(account, jid) delta = datetime.timedelta( hours=23, minutes=59, seconds=59, microseconds=999999) sql = ''' SELECT contact_name, time, kind, show, message, subject, additional_data, log_line_id FROM logs NATURAL JOIN jids WHERE jid IN ({jids}) AND time BETWEEN ? AND ? ORDER BY time, log_line_id '''.format(jids=', '.join('?' * len(jids))) return self.con.execute(sql, tuple(jids) + (date.timestamp(), (date + delta).timestamp())).fetchall() def search_log(self, account, jid, query, date=None): """ Search the conversation log for messages containing the `query` string. The search can either span the complete log for the given `account` and `jid` or be restriced to a single day by specifying `date`. :param account: The account :param jid: The jid for which we request the conversation :param query: A search string :param date: datetime.datetime instance example: datetime.datetime(year, month, day) returns a list of namedtuples """ jids = self._get_family_jids(account, jid) if date: delta = datetime.timedelta( hours=23, minutes=59, seconds=59, microseconds=999999) between = ''' AND time BETWEEN {start} AND {end} '''.format(start=date.timestamp(), end=(date + delta).timestamp()) sql = ''' SELECT contact_name, time, kind, show, message, subject, additional_data, log_line_id FROM logs NATURAL JOIN jids WHERE jid IN ({jids}) AND message LIKE like(?) {date_search} ORDER BY time, log_line_id '''.format(jids=', '.join('?' * len(jids)), date_search=between if date else '') return self.con.execute(sql, tuple(jids) + (query,)).fetchall() def get_days_with_logs(self, account, jid, year, month): """ Request the days in a month where we received messages for a given `jid`. :param account: The account :param jid: The jid for which we request the days :param year: The year :param month: The month returns a list of namedtuples """ jids = self._get_family_jids(account, jid) kinds = map(str, [KindConstant.STATUS, KindConstant.GCSTATUS]) # Calculate the start and end datetime of the month date = datetime.datetime(year, month, 1) days = calendar.monthrange(year, month)[1] - 1 delta = datetime.timedelta( days=days, hours=23, minutes=59, seconds=59, microseconds=999999) sql = """ SELECT DISTINCT CAST(strftime('%d', time, 'unixepoch', 'localtime') AS INTEGER) AS day FROM logs NATURAL JOIN jids WHERE jid IN ({jids}) AND time BETWEEN ? AND ? AND kind NOT IN ({kinds}) ORDER BY time """.format(jids=', '.join('?' * len(jids)), kinds=', '.join(kinds)) return self.con.execute(sql, tuple(jids) + (date.timestamp(), (date + delta).timestamp())).fetchall() def get_last_date_that_has_logs(self, account, jid): """ Get the timestamp of the last message we received for the jid. :param account: The account :param jid: The jid for which we request the last timestamp returns a timestamp or None """ jids = self._get_family_jids(account, jid) kinds = map(str, [KindConstant.STATUS, KindConstant.GCSTATUS]) sql = ''' SELECT MAX(time) as time FROM logs NATURAL JOIN jids WHERE jid IN ({jids}) AND kind NOT IN ({kinds}) '''.format(jids=', '.join('?' * len(jids)), kinds=', '.join(kinds)) # fetchone() returns always at least one Row with all # attributes set to None because of the MAX() function return self.con.execute(sql, tuple(jids)).fetchone().time def get_first_date_that_has_logs(self, account, jid): """ Get the timestamp of the first message we received for the jid. :param account: The account :param jid: The jid for which we request the first timestamp returns a timestamp or None """ jids = self._get_family_jids(account, jid) kinds = map(str, [KindConstant.STATUS, KindConstant.GCSTATUS]) sql = ''' SELECT MIN(time) as time FROM logs NATURAL JOIN jids WHERE jid IN ({jids}) AND kind NOT IN ({kinds}) '''.format(jids=', '.join('?' * len(jids)), kinds=', '.join(kinds)) # fetchone() returns always at least one Row with all # attributes set to None because of the MIN() function return self.con.execute(sql, tuple(jids)).fetchone().time def get_date_has_logs(self, account, jid, date): """ Get single timestamp of a message we received for the jid in the time range of one day. :param account: The account :param jid: The jid for which we request the first timestamp :param date: datetime.datetime instance example: datetime.datetime(year, month, day) returns a timestamp or None """ jids = self._get_family_jids(account, jid) kinds = map(str, [KindConstant.STATUS, KindConstant.GCSTATUS]) delta = datetime.timedelta( hours=23, minutes=59, seconds=59, microseconds=999999) sql = ''' SELECT time FROM logs NATURAL JOIN jids WHERE jid IN ({jids}) AND time BETWEEN ? AND ? '''.format(jids=', '.join('?' * len(jids))) return self.con.execute(sql, tuple(jids) + (date.timestamp(), (date + delta).timestamp())).fetchone() def get_room_last_message_time(self, account, jid): """ Get the timestamp of the last message we received in a room. :param account: The account :param jid: The jid for which we request the last timestamp returns a timestamp or None """ sql = ''' SELECT time FROM rooms_last_message_time NATURAL JOIN jids WHERE jid = ? ''' row = self.con.execute(sql, (jid,)).fetchone() if not row: return self.get_last_date_that_has_logs(account, jid) return row.time def set_room_last_message_time(self, jid, timestamp): """ Set the timestamp of the last message we received in a room. :param jid: The jid :param timestamp: The timestamp in epoch """ jid_id = self.get_jid_id(jid, type_=JIDConstant.ROOM_TYPE) sql = '''REPLACE INTO rooms_last_message_time VALUES (:jid_id, COALESCE( (SELECT time FROM rooms_last_message_time WHERE jid_id = :jid_id AND time >= :time), :time))''' self.con.execute(sql, {"jid_id": jid_id, "time": timestamp}) self._timeout_commit() def save_transport_type(self, jid, type_): """ Save the type of the transport in DB """ type_id = self.convert_human_transport_type_to_db_api_values(type_) if not type_id: # unknown type return self.cur.execute( 'SELECT type from transports_cache WHERE transport = "%s"' % jid) results = self.cur.fetchone() if results: if results.type == type_id: return sql = 'UPDATE transports_cache SET type = %d WHERE transport = "%s"' %\ (type_id, jid) self.simple_commit(sql) return sql = 'INSERT INTO transports_cache VALUES ("%s", %d)' % (jid, type_id) self.simple_commit(sql) def get_transports_type(self): """ Return all the type of the transports in DB """ self.cur.execute( 'SELECT * from transports_cache') results = self.cur.fetchall() if not results: return {} answer = {} for result in results: answer[result.transport] = self.convert_api_values_to_human_transport_type( result.type) return answer # A longer note here: # The database contains a blob field. Pysqlite seems to need special care for # such fields. # When storing, we need to convert string into buffer object (1). # When retrieving, we need to convert it back to a string to decompress it. # (2) # GzipFile needs a file-like object, StringIO emulates file for plain strings def iter_caps_data(self): """ Iterate over caps cache data stored in the database The iterator values are pairs of (node, ver, ext, identities, features): identities == {'category':'foo', 'type':'bar', 'name':'boo'}, features being a list of feature namespaces. """ # get data from table # the data field contains binary object (gzipped data), this is a hack # to get that data without trying to convert it to unicode try: self.cur.execute('SELECT hash_method, hash, data FROM caps_cache;') except sqlite.OperationalError: # might happen when there's no caps_cache table yet # -- there's no data to read anyway then return # list of corrupted entries that will be removed to_be_removed = [] for row in self.cur: # for each row: unpack the data field # (format: (category, type, name, category, type, name, ... # ..., 'FEAT', feature1, feature2, ...).join(' ')) # NOTE: if there's a need to do more gzip, put that to a function try: data = GzipFile(fileobj=BytesIO(row.data)).read().decode('utf-8').split('\0') except IOError: # This data is corrupted. It probably contains non-ascii chars to_be_removed.append((row.hash_method, row.hash)) continue i = 0 identities = list() features = list() while i < (len(data) - 3) and data[i] != 'FEAT': category = data[i] type_ = data[i + 1] lang = data[i + 2] name = data[i + 3] identities.append({'category': category, 'type': type_, 'xml:lang': lang, 'name': name}) i += 4 i+=1 while i < len(data): features.append(data[i]) i += 1 # yield the row yield row.hash_method, row.hash, identities, features for hash_method, hash_ in to_be_removed: sql = '''DELETE FROM caps_cache WHERE hash_method = "%s" AND hash = "%s"''' % (hash_method, hash_) self.simple_commit(sql) def add_caps_entry(self, hash_method, hash_, identities, features): data = [] for identity in identities: # there is no FEAT category if identity['category'] == 'FEAT': return data.extend((identity.get('category'), identity.get('type', ''), identity.get('xml:lang', ''), identity.get('name', ''))) data.append('FEAT') data.extend(features) data = '\0'.join(data) # if there's a need to do more gzip, put that to a function string = BytesIO() gzip = GzipFile(fileobj=string, mode='w') gzip.write(data.encode('utf-8')) gzip.close() data = string.getvalue() self.cur.execute(''' INSERT INTO caps_cache ( hash_method, hash, data, last_seen ) VALUES (?, ?, ?, ?); ''', (hash_method, hash_, memoryview(data), int(time.time()))) # (1) -- note above self._timeout_commit() def update_caps_time(self, method, hash_): sql = '''UPDATE caps_cache SET last_seen = %d WHERE hash_method = "%s" and hash = "%s"''' % \ (int(time.time()), method, hash_) self.simple_commit(sql) def clean_caps_table(self): """ Remove caps which was not seen for 3 months """ sql = '''DELETE FROM caps_cache WHERE last_seen < %d''' % \ int(time.time() - 3*30*24*3600) self.simple_commit(sql) def replace_roster(self, account_name, roster_version, roster): """ Replace current roster in DB by a new one accout_name is the name of the account to change. roster_version is the version of the new roster. roster is the new version. """ # First we must reset roster_version value to ensure that the server # sends back all the roster at the next connexion if the replacement # didn't work properly. app.config.set_per('accounts', account_name, 'roster_version', '') account_jid = app.get_jid_from_account(account_name) # Execute get_jid_id() because this ensures on new accounts that the # jid_id will be created self.get_jid_id(account_jid, type_=JIDConstant.NORMAL_TYPE) # Delete old roster self.remove_roster(account_jid) # Fill roster tables with the new roster for jid in roster: self.add_or_update_contact(account_jid, jid, roster[jid]['name'], roster[jid]['subscription'], roster[jid]['ask'], roster[jid]['groups'], commit=False) self._timeout_commit() # At this point, we are sure the replacement works properly so we can # set the new roster_version value. app.config.set_per('accounts', account_name, 'roster_version', roster_version) def del_contact(self, account_jid, jid): """ Remove jid from account_jid roster """ try: account_jid_id = self.get_jid_id(account_jid) jid_id = self.get_jid_id(jid) except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) self.cur.execute( 'DELETE FROM roster_group WHERE account_jid_id=? AND jid_id=?', (account_jid_id, jid_id)) self.cur.execute( 'DELETE FROM roster_entry WHERE account_jid_id=? AND jid_id=?', (account_jid_id, jid_id)) self._timeout_commit() def add_or_update_contact(self, account_jid, jid, name, sub, ask, groups, commit=True): """ Add or update a contact from account_jid roster """ if sub == 'remove': self.del_contact(account_jid, jid) return try: account_jid_id = self.get_jid_id(account_jid) jid_id = self.get_jid_id(jid, type_=JIDConstant.NORMAL_TYPE) except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) # Update groups information # First we delete all previous groups information self.cur.execute( 'DELETE FROM roster_group WHERE account_jid_id=? AND jid_id=?', (account_jid_id, jid_id)) # Then we add all new groups information for group in groups: self.cur.execute('INSERT INTO roster_group VALUES(?, ?, ?)', (account_jid_id, jid_id, group)) if name is None: name = '' self.cur.execute(''' REPLACE INTO roster_entry (account_jid_id, jid_id, name, subscription, ask) VALUES(?, ?, ?, ?, ?)''', ( account_jid_id, jid_id, name, self.convert_human_subscription_values_to_db_api_values(sub), bool(ask))) if commit: self._timeout_commit() def get_roster(self, account_jid): """ Return the accound_jid roster in NonBlockingRoster format """ data = {} account_jid_id = self.get_jid_id(account_jid, type_=JIDConstant.NORMAL_TYPE) # First we fill data with roster_entry informations self.cur.execute(''' SELECT j.jid, re.jid_id, re.name, re.subscription, re.ask, re.avatar_sha FROM roster_entry re, jids j WHERE re.account_jid_id=? AND j.jid_id=re.jid_id''', (account_jid_id,)) for row in self.cur: #jid, jid_id, name, subscription, ask jid = row.jid name = row.name data[jid] = {} data[jid]['avatar_sha'] = row.avatar_sha if name: data[jid]['name'] = name else: data[jid]['name'] = None data[jid]['subscription'] = \ self.convert_db_api_values_to_human_subscription_values( row.subscription) data[jid]['groups'] = [] data[jid]['resources'] = {} if row.ask: data[jid]['ask'] = 'subscribe' else: data[jid]['ask'] = None data[jid]['id'] = row.jid_id # Then we add group for roster entries for jid in data: self.cur.execute(''' SELECT group_name FROM roster_group WHERE account_jid_id=? AND jid_id=?''', (account_jid_id, data[jid]['id'])) for row in self.cur: group_name = row.group_name data[jid]['groups'].append(group_name) del data[jid]['id'] return data def remove_roster(self, account_jid): """ Remove the roster of an account :param account_jid: The jid of the account """ try: jid_id = self.get_jid_id(account_jid) except ValueError: # This happens if the JID never made it to the Database # because the account was never connected return sql = ''' DELETE FROM roster_entry WHERE account_jid_id = {jid_id}; DELETE FROM roster_group WHERE account_jid_id = {jid_id}; '''.format(jid_id=jid_id) self.con.executescript(sql) self._timeout_commit() def search_for_duplicate(self, account, jid, timestamp, msg): """ Check if a message is already in the `logs` table :param account: The account :param jid: The jid as string :param timestamp: The timestamp in UTC epoch :param msg: The message text """ # Add 10 seconds around the timestamp start_time = timestamp - 10 end_time = timestamp + 10 account_id = self.get_account_id(account) log.debug('start: %s, end: %s, jid: %s, message: %s', start_time, end_time, jid, msg) sql = ''' SELECT * FROM logs NATURAL JOIN jids WHERE jid = ? AND message = ? AND account_id = ? AND time BETWEEN ? AND ? ''' result = self.con.execute( sql, (jid, msg, account_id, start_time, end_time)).fetchone() if result is not None: log.debug('Message already in DB') return True return False def find_stanza_id(self, account, archive_jid, stanza_id, origin_id=None, groupchat=False): """ Checks if a stanza-id is already in the `logs` table :param account: The account :param archive_jid: The jid of the archive the stanza-id belongs to only used if groupchat=True :param stanza_id: The stanza-id :param origin_id: The origin-id :param groupchat: stanza-id is from a groupchat return True if the stanza-id was found """ ids = [] if stanza_id is not None: ids.append(stanza_id) if origin_id is not None: ids.append(origin_id) if not ids: return False archive_id = self.get_jid_id(archive_jid) account_id = self.get_account_id(account) if groupchat: # Stanza ID is only unique within a specific archive. # So a Stanza ID could be repeated in different MUCs, so we # filter also for the archive JID which is the bare MUC jid. sql = ''' SELECT stanza_id FROM logs WHERE stanza_id IN ({values}) AND jid_id = ? AND account_id = ? LIMIT 1 '''.format(values=', '.join('?' * len(ids))) result = self.con.execute( sql, tuple(ids) + (archive_id, account_id)).fetchone() else: sql = ''' SELECT stanza_id FROM logs WHERE stanza_id IN ({values}) AND account_id = ? AND kind != ? LIMIT 1 '''.format(values=', '.join('?' * len(ids))) result = self.con.execute( sql, tuple(ids) + (account_id, KindConstant.GC_MSG)).fetchone() if result is not None: log.info('Found duplicated message, stanza-id: %s, origin-id: %s, ' 'archive-jid: %s, account: %s', stanza_id, origin_id, archive_jid, account_id) return True return False def insert_jid(self, jid, kind=None, type_=JIDConstant.NORMAL_TYPE): """ Insert a new jid into the `jids` table. This is an alias of get_jid_id() for better readablility. :param jid: The jid as string :param kind: A KindConstant :param type_: A JIDConstant """ return self.get_jid_id(jid, kind, type_) def insert_into_logs(self, account, jid, time_, kind, unread=True, **kwargs): """ Insert a new message into the `logs` table :param jid: The jid as string :param time_: The timestamp in UTC epoch :param kind: A KindConstant :param unread: If True the message is added to the`unread_messages` table. Only if kind == CHAT_MSG_RECV :param kwargs: Every additional named argument must correspond to a field in the `logs` table """ jid_id = self.get_jid_id(jid, kind=kind) account_id = self.get_account_id(account) if 'additional_data' in kwargs: if not kwargs['additional_data']: del kwargs['additional_data'] else: kwargs['additional_data'] = json.dumps(kwargs["additional_data"]) sql = ''' INSERT INTO logs (account_id, jid_id, time, kind, {columns}) VALUES (?, ?, ?, ?, {values}) '''.format(columns=', '.join(kwargs.keys()), values=', '.join('?' * len(kwargs))) lastrowid = self.con.execute( sql, (account_id, jid_id, time_, kind) + tuple(kwargs.values())).lastrowid log.info('Insert into DB: jid: %s, time: %s, kind: %s, stanza_id: %s', jid, time_, kind, kwargs.get('stanza_id', None)) if unread and kind == KindConstant.CHAT_MSG_RECV: sql = '''INSERT INTO unread_messages (message_id, jid_id) VALUES (?, (SELECT jid_id FROM jids WHERE jid = ?))''' self.con.execute(sql, (lastrowid, jid)) self._timeout_commit() return lastrowid def set_avatar_sha(self, account_jid, jid, sha=None): """ Set the avatar sha of a jid on an account :param account_jid: The jid of the account :param jid: The jid that belongs to the avatar :param sha: The sha of the avatar """ account_jid_id = self.get_jid_id(account_jid) jid_id = self.get_jid_id(jid, type_=JIDConstant.NORMAL_TYPE) sql = ''' UPDATE roster_entry SET avatar_sha = ? WHERE account_jid_id = ? AND jid_id = ? ''' self.con.execute(sql, (sha, account_jid_id, jid_id)) self._timeout_commit() def get_archive_timestamp(self, jid, type_=None): """ Get the last archive id/timestamp for a jid :param jid: The jid that belongs to the avatar """ jid_id = self.get_jid_id(jid, type_=type_) sql = '''SELECT * FROM last_archive_message WHERE jid_id = ?''' return self.con.execute(sql, (jid_id,)).fetchone() def set_archive_timestamp(self, jid, **kwargs): """ Set the last archive id/timestamp :param jid: The jid that belongs to the avatar :param last_mam_id: The last MAM result id :param oldest_mam_timestamp: The oldest date we requested MAM history for :param last_muc_timestamp: The timestamp of the last message we received in a MUC """ jid_id = self.get_jid_id(jid) exists = self.get_archive_timestamp(jid) if not exists: sql = '''INSERT INTO last_archive_message VALUES (?, ?, ?, ?)''' self.con.execute(sql, (jid_id, kwargs.get('last_mam_id', None), kwargs.get('oldest_mam_timestamp', None), kwargs.get('last_muc_timestamp', None))) else: args = ' = ?, '.join(kwargs.keys()) + ' = ?' sql = '''UPDATE last_archive_message SET {} WHERE jid_id = ?'''.format(args) self.con.execute(sql, tuple(kwargs.values()) + (jid_id,)) log.info('Save archive timestamps: %s', kwargs) self._timeout_commit() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/logging_helpers.py000066400000000000000000000130711326020644600270060ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/logging_helpers.py ## ## Copyright (C) 2009 Bruno Tarquini ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import logging import os import sys def parseLogLevel(arg): """ Eiter numeric value or level name from logging module """ if arg.isdigit(): return int(arg) elif arg.isupper() and hasattr(logging, arg): return getattr(logging, arg) else: print(_('%s is not a valid loglevel') % repr(arg)) return 0 def parseLogTarget(arg): """ [gajim.]c.x.y -> gajim.c.x.y .other_logger -> other_logger -> gajim """ arg = arg.lower() if not arg: return 'gajim' elif arg.startswith('.'): return arg[1:] elif arg.startswith('gajim'): return arg else: return 'gajim.' + arg def parseAndSetLogLevels(arg): """ [=]LOGLEVEL -> gajim=LOGLEVEL gajim=LOGLEVEL -> gajim=LOGLEVEL .other=10 -> other=10 .=10 -> c.x.y=c.z=20 -> gajim.c.x.y=20 gajim.c.z=20 gajim=10,c.x=20 -> gajim=10 gajim.c.x=20 """ for directive in arg.split(','): directive = directive.strip() if not directive: continue if '=' not in directive: directive = '=' + directive targets, level = directive.rsplit('=', 1) level = parseLogLevel(level.strip()) for target in targets.split('='): target = parseLogTarget(target.strip()) if target: logging.getLogger(target).setLevel(level) print("Logger %s level set to %d" % (target, level)) class colors: NONE = chr(27) + "[0m" BLACk = chr(27) + "[30m" RED = chr(27) + "[31m" GREEN = chr(27) + "[32m" BROWN = chr(27) + "[33m" BLUE = chr(27) + "[34m" MAGENTA = chr(27) + "[35m" CYAN = chr(27) + "[36m" LIGHT_GRAY = chr(27) + "[37m" DARK_GRAY = chr(27) + "[30;1m" BRIGHT_RED = chr(27) + "[31;1m" BRIGHT_GREEN = chr(27) + "[32;1m" YELLOW = chr(27) + "[33;1m" BRIGHT_BLUE = chr(27) + "[34;1m" PURPLE = chr(27) + "[35;1m" BRIGHT_CYAN = chr(27) + "[36;1m" WHITE = chr(27) + "[37;1m" def colorize(text, color): return color + text + colors.NONE class FancyFormatter(logging.Formatter): """ An eye-candy formatter with colors """ colors_mapping = { 'DEBUG': colors.BLUE, 'INFO': colors.GREEN, 'WARNING': colors.BROWN, 'ERROR': colors.RED, 'CRITICAL': colors.BRIGHT_RED, } def __init__(self, fmt, datefmt=None, use_color=False): logging.Formatter.__init__(self, fmt, datefmt) self.use_color = use_color def formatTime(self, record, datefmt=None): f = logging.Formatter.formatTime(self, record, datefmt) if self.use_color: f = colorize(f, colors.DARK_GRAY) return f def format(self, record): level = record.levelname record.levelname = '(%s)' % level[0] if self.use_color: c = FancyFormatter.colors_mapping.get(level, '') record.levelname = colorize(record.levelname, c) record.name = colorize(record.name, colors.CYAN) else: record.name += ':' return logging.Formatter.format(self, record) def init(): """ Iinitialize the logging system """ use_color = False if os.name != 'nt': use_color = sys.stderr.isatty() consoleloghandler = logging.StreamHandler() consoleloghandler.setFormatter( FancyFormatter( '%(asctime)s %(levelname)s %(name)s %(message)s', '%x %H:%M:%S', use_color ) ) # fake the root logger so we have 'gajim' root name instead of 'root' root_log = logging.getLogger('gajim') root_log.setLevel(logging.WARNING) root_log.addHandler(consoleloghandler) root_log.propagate = False # handle nbxmpp logs too root_log = logging.getLogger('nbxmpp') root_log.setLevel(logging.WARNING) root_log.addHandler(consoleloghandler) root_log.propagate = False def set_loglevels(loglevels_string): parseAndSetLogLevels(loglevels_string) def set_verbose(): parseAndSetLogLevels('gajim=DEBUG') parseAndSetLogLevels('.nbxmpp=INFO') def set_quiet(): parseAndSetLogLevels('gajim=CRITICAL') parseAndSetLogLevels('.nbxmpp=CRITICAL') # tests if __name__ == '__main__': init() set_loglevels('gajim.c=DEBUG,INFO') log = logging.getLogger('gajim') log.debug('debug') log.info('info') log.warning('warn') log.error('error') log.critical('critical') log = logging.getLogger('gajim.c.x.dispatcher') log.debug('debug') log.info('info') log.warning('warn') log.error('error') log.critical('critical') gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/message_archiving.py000066400000000000000000000354431326020644600273230ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/message_archiving.py ## ## Copyright (C) 2009 Anaël Verrier ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import logging from datetime import datetime, timedelta import nbxmpp from gajim.common import app from gajim.common import ged from gajim.common import helpers from gajim.common.logger import KindConstant, JIDConstant from gajim.common.const import ArchiveState from gajim.common.caps_cache import muc_caps_cache import gajim.common.connection_handlers_events as ev log = logging.getLogger('gajim.c.message_archiving') class ConnectionArchive313: def __init__(self): self.archiving_313_supported = False self.mam_awaiting_disco_result = {} self.iq_answer = [] self.mam_query_ids = [] app.nec.register_incoming_event(ev.MamMessageReceivedEvent) app.nec.register_incoming_event(ev.MamGcMessageReceivedEvent) app.ged.register_event_handler('agent-info-error-received', ged.CORE, self._nec_agent_info_error) app.ged.register_event_handler('agent-info-received', ged.CORE, self._nec_agent_info) app.ged.register_event_handler('mam-decrypted-message-received', ged.CORE, self._nec_mam_decrypted_message_received) app.ged.register_event_handler( 'archiving-313-preferences-changed-received', ged.CORE, self._nec_archiving_313_preferences_changed_received) def cleanup(self): app.ged.remove_event_handler('agent-info-error-received', ged.CORE, self._nec_agent_info_error) app.ged.remove_event_handler('agent-info-received', ged.CORE, self._nec_agent_info) app.ged.remove_event_handler('mam-decrypted-message-received', ged.CORE, self._nec_mam_decrypted_message_received) app.ged.remove_event_handler( 'archiving-313-preferences-changed-received', ged.CORE, self._nec_archiving_313_preferences_changed_received) def _nec_archiving_313_preferences_changed_received(self, obj): if obj.id in self.iq_answer: obj.answer = True def _nec_agent_info_error(self, obj): if obj.jid in self.mam_awaiting_disco_result: log.warn('Unable to discover %s, ignoring those logs', obj.jid) del self.mam_awaiting_disco_result[obj.jid] def _nec_agent_info(self, obj): if obj.jid not in self.mam_awaiting_disco_result: return for identity in obj.identities: if identity['category'] != 'conference': continue # it's a groupchat for msg_obj in self.mam_awaiting_disco_result[obj.jid]: app.logger.insert_jid(msg_obj.with_.getStripped(), type_=JIDConstant.ROOM_TYPE) app.nec.push_incoming_event( ev.MamDecryptedMessageReceivedEvent( None, disco=True, **vars(msg_obj))) del self.mam_awaiting_disco_result[obj.jid] return # it's not a groupchat for msg_obj in self.mam_awaiting_disco_result[obj.jid]: app.logger.insert_jid(msg_obj.with_.getStripped()) app.nec.push_incoming_event( ev.MamDecryptedMessageReceivedEvent( None, disco=True, **vars(msg_obj))) del self.mam_awaiting_disco_result[obj.jid] @staticmethod def parse_iq(stanza): if not nbxmpp.isResultNode(stanza): log.error('Error on MAM query: %s', stanza.getError()) raise InvalidMamIQ fin = stanza.getTag('fin') if fin is None: log.error('Malformed MAM query result received: %s', stanza) raise InvalidMamIQ set_ = fin.getTag('set', namespace=nbxmpp.NS_RSM) if set_ is None: log.error( 'Malformed MAM query result received (no "set" Node): %s', stanza) raise InvalidMamIQ return fin, set_ def parse_from_jid(self, stanza): jid = stanza.getFrom() if jid is None: # No from means, iq from our own archive jid = self.get_own_jid().getStripped() else: jid = jid.getStripped() return jid def _result_finished(self, conn, stanza, query_id, start_date, groupchat): try: fin, set_ = self.parse_iq(stanza) except InvalidMamIQ: return last = set_.getTagData('last') if last is None: log.info('End of MAM query, no items retrieved') return jid = self.parse_from_jid(stanza) complete = fin.getAttr('complete') app.logger.set_archive_timestamp(jid, last_mam_id=last) if complete != 'true': self.mam_query_ids.remove(query_id) query_id = self.get_query_id() query = self.get_archive_query(query_id, jid=jid, after=last) self._send_archive_query(query, query_id, groupchat=groupchat) else: self.mam_query_ids.remove(query_id) if start_date is not None: app.logger.set_archive_timestamp( jid, last_mam_id=last, oldest_mam_timestamp=start_date.timestamp()) log.info('End of MAM query, last mam id: %s', last) def _intervall_result_finished(self, conn, stanza, query_id, start_date, end_date, event_id): try: fin, set_ = self.parse_iq(stanza) except InvalidMamIQ: return self.mam_query_ids.remove(query_id) jid = self.parse_from_jid(stanza) if start_date: timestamp = start_date.timestamp() else: timestamp = ArchiveState.ALL last = set_.getTagData('last') if last is None: app.nec.push_incoming_event(ev.ArchivingIntervalFinished( None, event_id=event_id)) app.logger.set_archive_timestamp( jid, oldest_mam_timestamp=timestamp) log.info('End of MAM query, no items retrieved') return complete = fin.getAttr('complete') if complete != 'true': self.request_archive_interval(event_id, start_date, end_date, last) else: log.info('query finished') app.logger.set_archive_timestamp( jid, oldest_mam_timestamp=timestamp) app.nec.push_incoming_event(ev.ArchivingIntervalFinished( None, event_id=event_id, stanza=stanza)) def _received_count(self, conn, stanza, query_id, event_id): try: _, set_ = self.parse_iq(stanza) except InvalidMamIQ: return self.mam_query_ids.remove(query_id) count = set_.getTagData('count') log.info('message count received: %s', count) app.nec.push_incoming_event(ev.ArchivingCountReceived( None, event_id=event_id, count=count)) def _nec_mam_decrypted_message_received(self, obj): if obj.conn.name != self.name: return namespace = self.archiving_namespace blacklisted = False if obj.groupchat: namespace = muc_caps_cache.get_mam_namespace(obj.room_jid) blacklisted = obj.room_jid in helpers.get_mam_blacklist() if namespace != nbxmpp.NS_MAM_2 or blacklisted: # Fallback duplicate search without stanza-id duplicate = app.logger.search_for_duplicate( self.name, obj.with_, obj.timestamp, obj.msgtxt) if duplicate: # dont propagate the event further return True app.logger.insert_into_logs(self.name, obj.with_, obj.timestamp, obj.kind, unread=False, message=obj.msgtxt, contact_name=obj.nick, additional_data=obj.additional_data, stanza_id=obj.unique_id) def get_query_id(self): query_id = self.connection.getAnID() self.mam_query_ids.append(query_id) return query_id def request_archive_on_signin(self): own_jid = self.get_own_jid().getStripped() archive = app.logger.get_archive_timestamp(own_jid) # Migration of last_mam_id from config to DB if archive is not None: mam_id = archive.last_mam_id else: mam_id = app.config.get_per('accounts', self.name, 'last_mam_id') start_date = None query_id = self.get_query_id() if mam_id: log.info('MAM query after: %s', mam_id) query = self.get_archive_query(query_id, after=mam_id) else: # First Start, we request the last week start_date = datetime.utcnow() - timedelta(days=7) log.info('First start: query archive start: %s', start_date) query = self.get_archive_query(query_id, start=start_date) self._send_archive_query(query, query_id, start_date) def request_archive_on_muc_join(self, jid): archive = app.logger.get_archive_timestamp( jid, type_=JIDConstant.ROOM_TYPE) query_id = self.get_query_id() start_date = None if archive is not None: log.info('Query Groupchat MAM Archive %s after %s:', jid, archive.last_mam_id) query = self.get_archive_query( query_id, jid=jid, after=archive.last_mam_id) else: # First Start, we dont request history # Depending on what a MUC saves, there could be thousands # of Messages even in just one day. start_date = datetime.utcnow() - timedelta(days=1) log.info('First join: query archive %s from: %s', jid, start_date) query = self.get_archive_query(query_id, jid=jid, start=start_date) self._send_archive_query(query, query_id, start_date, groupchat=True) def request_archive_count(self, event_id, start_date, end_date): query_id = self.get_query_id() query = self.get_archive_query( query_id, start=start_date, end=end_date, max_=0) self.connection.SendAndCallForResponse( query, self._received_count, {'query_id': query_id, 'event_id': event_id}) def request_archive_interval(self, event_id, start_date, end_date, after=None): query_id = self.get_query_id() query = self.get_archive_query(query_id, start=start_date, end=end_date, after=after, max_=30) app.nec.push_incoming_event(ev.ArchivingQueryID( None, event_id=event_id, query_id=query_id)) self.connection.SendAndCallForResponse( query, self._intervall_result_finished, {'query_id': query_id, 'start_date': start_date, 'end_date': end_date, 'event_id': event_id}) def _send_archive_query(self, query, query_id, start_date=None, groupchat=False): self.connection.SendAndCallForResponse( query, self._result_finished, {'query_id': query_id, 'start_date': start_date, 'groupchat': groupchat}) def get_archive_query(self, query_id, jid=None, start=None, end=None, with_=None, after=None, max_=30): # Muc archive query? namespace = muc_caps_cache.get_mam_namespace(jid) if namespace is None: # Query to our own archive namespace = self.archiving_namespace iq = nbxmpp.Iq('set', to=jid) query = iq.addChild('query', namespace=namespace) form = query.addChild(node=nbxmpp.DataForm(typ='submit')) field = nbxmpp.DataField(typ='hidden', name='FORM_TYPE', value=namespace) form.addChild(node=field) if start: field = nbxmpp.DataField(typ='text-single', name='start', value=start.strftime('%Y-%m-%dT%H:%M:%SZ')) form.addChild(node=field) if end: field = nbxmpp.DataField(typ='text-single', name='end', value=end.strftime('%Y-%m-%dT%H:%M:%SZ')) form.addChild(node=field) if with_: field = nbxmpp.DataField(typ='jid-single', name='with', value=with_) form.addChild(node=field) set_ = query.setTag('set', namespace=nbxmpp.NS_RSM) set_.setTagData('max', max_) if after: set_.setTagData('after', after) query.setAttr('queryid', query_id) return iq def request_archive_preferences(self): if not app.account_is_connected(self.name): return iq = nbxmpp.Iq(typ='get') id_ = self.connection.getAnID() iq.setID(id_) iq.addChild(name='prefs', namespace=self.archiving_namespace) self.connection.send(iq) def set_archive_preferences(self, items, default): if not app.account_is_connected(self.name): return iq = nbxmpp.Iq(typ='set') id_ = self.connection.getAnID() self.iq_answer.append(id_) iq.setID(id_) prefs = iq.addChild(name='prefs', namespace=self.archiving_namespace, attrs={'default': default}) always = prefs.addChild(name='always') never = prefs.addChild(name='never') for item in items: jid, preference = item if preference == 'always': always.addChild(name='jid').setData(jid) else: never.addChild(name='jid').setData(jid) self.connection.send(iq) def _ArchiveCB(self, con, iq_obj): app.nec.push_incoming_event(ev.ArchivingReceivedEvent(None, conn=self, stanza=iq_obj)) raise nbxmpp.NodeProcessed class InvalidMamIQ(Exception): pass gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/multimedia_helpers.py000066400000000000000000000102661326020644600275150ustar00rootroot00000000000000## ## Copyright (C) 2009 Thibaut GIRKA ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . import gi import logging gi.require_version('Gst', '1.0') from gi.repository import Gst log = logging.getLogger('gajim.c.multimedia_helpers') class DeviceManager(object): def __init__(self): self.devices = {} def detect(self): self.devices = {} def get_devices(self): if not self.devices: self.detect() return self.devices def detect_element(self, name, text, pipe='%s'): if Gst.ElementFactory.find(name): element = Gst.ElementFactory.make(name, '%spresencetest' % name) if element is None: log.warning('could not create %spresencetest', name) if hasattr(element.props, 'device'): element.set_state(Gst.State.READY) devices = element.get_properties('device') if devices: self.devices[text % _('Default device')] = pipe % name for device in devices: if device is None: continue element.set_state(Gst.State.NULL) element.set_property('device', device) element.set_state(Gst.State.READY) device_name = element.get_property('device-name') self.devices[text % device_name] = pipe % \ '%s device=%s' % (name, device) element.set_state(Gst.State.NULL) else: self.devices[text] = pipe % name else: log.info('element %s not found', name) class AudioInputManager(DeviceManager): def detect(self): self.devices = {} # Test src self.detect_element('audiotestsrc', _('Audio test'), '%s is-live=true name=gajim_vol') # Auto src self.detect_element('autoaudiosrc', _('Autodetect'), '%s ! volume name=gajim_vol') # Alsa src self.detect_element('alsasrc', _('ALSA: %s'), '%s ! volume name=gajim_vol') # Pulseaudio src self.detect_element('pulsesrc', _('Pulse: %s'), '%s ! volume name=gajim_vol') class AudioOutputManager(DeviceManager): def detect(self): self.devices = {} # Fake sink self.detect_element('fakesink', _('Fake audio output')) # Auto sink self.detect_element('autoaudiosink', _('Autodetect')) # Alsa sink self.detect_element('alsasink', _('ALSA: %s'), '%s sync=false') # Pulseaudio sink self.detect_element('pulsesink', _('Pulse: %s'), '%s sync=true') class VideoInputManager(DeviceManager): def detect(self): self.devices = {} # Test src self.detect_element('videotestsrc', _('Video test'), '%s is-live=true ! video/x-raw,framerate=10/1') # Auto src self.detect_element('autovideosrc', _('Autodetect')) # V4L2 src self.detect_element('v4l2src', _('V4L2: %s')) # Funny things, just to test... # self.devices['GOOM'] = 'audiotestsrc ! goom' self.detect_element('ximagesrc', _('Screen'), '%s ! ffmpegcolorspace') class VideoOutputManager(DeviceManager): def detect(self): self.devices = {} # Fake video output self.detect_element('fakesink', _('Fake video output')) # Auto sink self.detect_element('xvimagesink', _('X Window System (X11/XShm/Xv): %s')) # ximagesink self.detect_element('ximagesink', _('X Window System (without Xv)')) self.detect_element('autovideosink', _('Autodetect')) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/nec.py000066400000000000000000000150031326020644600244000ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## ''' Network Events Controller. :author: Mateusz Biliński :since: 10th August 2008 :copyright: Copyright (2008) Mateusz Biliński :copyright: Copyright (2011) Yann Leboulanger :license: GPL ''' #from plugins.helpers import log from gajim.common import app class NetworkEventsController(object): def __init__(self): self.incoming_events_generators = {} ''' Keys: names of events Values: list of class objects that are subclasses of `NetworkIncomingEvent` ''' self.outgoing_events_generators = {} ''' Keys: names of events Values: list of class objects that are subclasses of `NetworkOutgoingEvent` ''' def register_incoming_event(self, event_class): for base_event_name in event_class.base_network_events: event_list = self.incoming_events_generators.setdefault( base_event_name, []) if not event_class in event_list: event_list.append(event_class) def unregister_incoming_event(self, event_class): for base_event_name in event_class.base_network_events: if base_event_name in self.incoming_events_generators: self.incoming_events_generators[base_event_name].remove( event_class) def register_outgoing_event(self, event_class): for base_event_name in event_class.base_network_events: event_list = self.outgoing_events_generators.setdefault( base_event_name, []) if not event_class in event_list: event_list.append(event_class) def unregister_outgoing_event(self, event_class): for base_event_name in event_class.base_network_events: if base_event_name in self.outgoing_events_generators: self.outgoing_events_generators[base_event_name].remove( event_class) def push_incoming_event(self, event_object): if event_object.generate(): if not app.ged.raise_event(event_object.name, event_object): self._generate_events_based_on_incoming_event(event_object) def push_outgoing_event(self, event_object): if event_object.generate(): if not app.ged.raise_event(event_object.name, event_object): self._generate_events_based_on_outgoing_event(event_object) def _generate_events_based_on_incoming_event(self, event_object): ''' :return: True if even_object should be dispatched through Global Events Dispatcher, False otherwise. This can be used to replace base events with those that more data computed (easier to use by handlers). :note: replacing mechanism is not implemented currently, but will be based on attribute in new network events object. ''' base_event_name = event_object.name if base_event_name in self.incoming_events_generators: for new_event_class in self.incoming_events_generators[ base_event_name]: new_event_object = new_event_class(None, base_event=event_object) if new_event_object.generate(): if not app.ged.raise_event(new_event_object.name, new_event_object): self._generate_events_based_on_incoming_event( new_event_object) def _generate_events_based_on_outgoing_event(self, event_object): ''' :return: True if even_object should be dispatched through Global Events Dispatcher, False otherwise. This can be used to replace base events with those that more data computed (easier to use by handlers). :note: replacing mechanism is not implemented currently, but will be based on attribute in new network events object. ''' base_event_name = event_object.name if base_event_name in self.outgoing_events_generators: for new_event_class in self.outgoing_events_generators[ base_event_name]: new_event_object = new_event_class(None, base_event=event_object) if new_event_object.generate(): if not app.ged.raise_event(new_event_object.name, new_event_object): self._generate_events_based_on_outgoing_event( new_event_object) class NetworkEvent(object): name = '' def __init__(self, new_name, **kwargs): if new_name: self.name = new_name self.init() self._set_kwargs_as_attributes(**kwargs) def init(self): pass def generate(self): ''' Generates new event (sets it's attributes) based on event object. Base event object name is one of those in `base_network_events`. Reference to base event object is stored in `self.base_event` attribute. Note that this is a reference, so modifications to that event object are possible before dispatching to Global Events Dispatcher. :return: True if generated event should be dispatched, False otherwise. ''' return True def _set_kwargs_as_attributes(self, **kwargs): for k, v in kwargs.items(): if k not in ('name', 'base_network_events'): setattr(self, k, v) def _set_base_event_vars_as_attributes(self, event): for k, v in vars(event).items(): if k not in ('name', 'base_network_events'): setattr(self, k, v) class NetworkIncomingEvent(NetworkEvent): base_network_events = [] ''' Names of base network events that new event is going to be generated on. ''' class NetworkOutgoingEvent(NetworkEvent): base_network_events = [] ''' Names of base network events that new event is going to be generated on. ''' gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/optparser.py000066400000000000000000001155421326020644600256630ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/optparser.py ## ## Copyright (C) 2003-2005 Vincent Hanquez ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2005-2006 Dimitur Kirov ## Nikos Kouremenos ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2007 James Newton ## Brendan Taylor ## Tomasz Melcer ## Stephan Erb ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import os import sys import re from time import time from gajim.common import app from gajim.common import helpers from gajim.common import caps_cache import sqlite3 as sqlite from gajim.common import logger import logging log = logging.getLogger('gajim.c.optparser') class OptionsParser: def __init__(self, filename): self.__filename = os.path.realpath(filename) self.old_values = {} # values that are saved in the file and maybe # no longer valid def read(self): try: fd = open(self.__filename, encoding='utf-8') except Exception: if os.path.exists(self.__filename): #we talk about a file print(_('Error: cannot open %s for reading') % self.__filename, file=sys.stderr) return False new_version = app.config.get('version') new_version = new_version.split('+', 1)[0] seen = set() regex = re.compile(r"(?P[^.=]+)(?:(?:\.(?P.+))?\.(?P[^.=]+))?\s=\s(?P.*)") for line in fd: match = regex.match(line) if match is None: log.warn('Invalid configuration line, ignoring it: %s', line) continue optname, key, subname, value = match.groups() if key is None: self.old_values[optname] = value app.config.set(optname, value) else: if (optname, key) not in seen: if optname in self.old_values: self.old_values[optname][key] = {} else: self.old_values[optname] = {key: {}} app.config.add_per(optname, key) seen.add((optname, key)) self.old_values[optname][key][subname] = value app.config.set_per(optname, key, subname, value) old_version = app.config.get('version') if '+' in old_version: old_version = old_version.split('+', 1)[0] elif '-' in old_version: old_version = old_version.split('-', 1)[0] self.update_config(old_version, new_version) self.old_values = {} # clean mem fd.close() return True def write_line(self, fd, opt, parents, value): if value is None: return # convert to utf8 before writing to file if needed value = str(value) s = '' if parents: if len(parents) == 1: return for p in parents: s += p + '.' s += opt fd.write(s + ' = ' + value + '\n') def write(self): (base_dir, filename) = os.path.split(self.__filename) self.__tempfile = os.path.join(base_dir, '.' + filename) try: f = os.fdopen(os.open(self.__tempfile, os.O_CREAT|os.O_WRONLY|os.O_TRUNC, 0o600), 'w', encoding='utf-8') except IOError as e: return str(e) try: app.config.foreach(self.write_line, f) except IOError as e: return str(e) f.flush() os.fsync(f.fileno()) f.close() if os.path.exists(self.__filename): if os.name == 'nt': # win32 needs this try: os.remove(self.__filename) except Exception: pass try: os.rename(self.__tempfile, self.__filename) except IOError as e: return str(e) def update_config(self, old_version, new_version): old_version_list = old_version.split('.') # convert '0.x.y' to (0, x, y) old = [] while len(old_version_list): old.append(int(old_version_list.pop(0))) new_version_list = new_version.split('.') new = [] while len(new_version_list): new.append(int(new_version_list.pop(0))) if old < [0, 9] and new >= [0, 9]: self.update_config_x_to_09() if old < [0, 10] and new >= [0, 10]: self.update_config_09_to_010() if old < [0, 10, 1, 1] and new >= [0, 10, 1, 1]: self.update_config_to_01011() if old < [0, 10, 1, 2] and new >= [0, 10, 1, 2]: self.update_config_to_01012() if old < [0, 10, 1, 3] and new >= [0, 10, 1, 3]: self.update_config_to_01013() if old < [0, 10, 1, 4] and new >= [0, 10, 1, 4]: self.update_config_to_01014() if old < [0, 10, 1, 5] and new >= [0, 10, 1, 5]: self.update_config_to_01015() if old < [0, 10, 1, 6] and new >= [0, 10, 1, 6]: self.update_config_to_01016() if old < [0, 10, 1, 7] and new >= [0, 10, 1, 7]: self.update_config_to_01017() if old < [0, 10, 1, 8] and new >= [0, 10, 1, 8]: self.update_config_to_01018() if old < [0, 11, 0, 1] and new >= [0, 11, 0, 1]: self.update_config_to_01101() if old < [0, 11, 0, 2] and new >= [0, 11, 0, 2]: self.update_config_to_01102() if old < [0, 11, 1, 1] and new >= [0, 11, 1, 1]: self.update_config_to_01111() if old < [0, 11, 1, 2] and new >= [0, 11, 1, 2]: self.update_config_to_01112() if old < [0, 11, 1, 3] and new >= [0, 11, 1, 3]: self.update_config_to_01113() if old < [0, 11, 1, 4] and new >= [0, 11, 1, 4]: self.update_config_to_01114() if old < [0, 11, 1, 5] and new >= [0, 11, 1, 5]: self.update_config_to_01115() if old < [0, 11, 2, 1] and new >= [0, 11, 2, 1]: self.update_config_to_01121() if old < [0, 11, 4, 1] and new >= [0, 11, 4, 1]: self.update_config_to_01141() if old < [0, 11, 4, 2] and new >= [0, 11, 4, 2]: self.update_config_to_01142() if old < [0, 11, 4, 3] and new >= [0, 11, 4, 3]: self.update_config_to_01143() if old < [0, 11, 4, 4] and new >= [0, 11, 4, 4]: self.update_config_to_01144() if old < [0, 12, 0, 1] and new >= [0, 12, 0, 1]: self.update_config_to_01201() if old < [0, 12, 1, 1] and new >= [0, 12, 1, 1]: self.update_config_to_01211() if old < [0, 12, 1, 2] and new >= [0, 12, 1, 2]: self.update_config_to_01212() if old < [0, 12, 1, 3] and new >= [0, 12, 1, 3]: self.update_config_to_01213() if old < [0, 12, 1, 4] and new >= [0, 12, 1, 4]: self.update_config_to_01214() if old < [0, 12, 1, 5] and new >= [0, 12, 1, 5]: self.update_config_to_01215() if old < [0, 12, 3, 1] and new >= [0, 12, 3, 1]: self.update_config_to_01231() if old < [0, 12, 5, 1] and new >= [0, 12, 5, 1]: self.update_config_from_0125() self.update_config_to_01251() if old < [0, 12, 5, 2] and new >= [0, 12, 5, 2]: self.update_config_to_01252() if old < [0, 12, 5, 3] and new >= [0, 12, 5, 3]: self.update_config_to_01253() if old < [0, 12, 5, 4] and new >= [0, 12, 5, 4]: self.update_config_to_01254() if old < [0, 12, 5, 5] and new >= [0, 12, 5, 5]: self.update_config_to_01255() if old < [0, 12, 5, 6] and new >= [0, 12, 5, 6]: self.update_config_to_01256() if old < [0, 12, 5, 7] and new >= [0, 12, 5, 7]: self.update_config_to_01257() if old < [0, 12, 5, 8] and new >= [0, 12, 5, 8]: self.update_config_to_01258() if old < [0, 13, 10, 0] and new >= [0, 13, 10, 0]: self.update_config_to_013100() if old < [0, 13, 10, 1] and new >= [0, 13, 10, 1]: self.update_config_to_013101() if old < [0, 13, 90, 1] and new >= [0, 13, 90, 1]: self.update_config_to_013901() if old < [0, 14, 0, 1] and new >= [0, 14, 0, 1]: self.update_config_to_01401() if old < [0, 14, 90, 0] and new >= [0, 14, 90, 0]: self.update_config_to_014900() if old < [0, 16, 0, 1] and new >= [0, 16, 0, 1]: self.update_config_to_01601() if old < [0, 16, 4, 1] and new >= [0, 16, 4, 1]: self.update_config_to_01641() if old < [0, 16, 10, 1] and new >= [0, 16, 10, 1]: self.update_config_to_016101() if old < [0, 16, 10, 2] and new >= [0, 16, 10, 2]: self.update_config_to_016102() if old < [0, 16, 10, 3] and new >= [0, 16, 10, 3]: self.update_config_to_016103() if old < [0, 16, 10, 4] and new >= [0, 16, 10, 4]: self.update_config_to_016104() if old < [0, 16, 10, 5] and new >= [0, 16, 10, 5]: self.update_config_to_016105() if old < [0, 16, 11, 1] and new >= [0, 16, 11, 1]: self.update_config_to_016111() if old < [0, 16, 11, 2] and new >= [0, 16, 11, 2]: self.update_config_to_016112() if old < [0, 98, 2] and new >= [0, 98, 2]: self.update_config_to_0982() if old < [0, 98, 3] and new >= [0, 98, 3]: self.update_config_to_0983() if old < [0, 99, 2] and new >= [0, 99, 2]: self.update_config_to_0992() app.logger.init_vars() app.logger.attach_cache_database() app.config.set('version', new_version) caps_cache.capscache.initialize_from_db() @staticmethod def assert_unread_msgs_table_exists(): """ Create table unread_messages if there is no such table """ back = os.getcwd() os.chdir(logger.LOG_DB_FOLDER) con = sqlite.connect(logger.LOG_DB_FILE) os.chdir(back) cur = con.cursor() try: cur.executescript( ''' CREATE TABLE IF NOT EXISTS unread_messages ( message_id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, jid_id INTEGER ); ''' ) con.commit() app.logger.init_vars() except sqlite.OperationalError: pass con.close() @staticmethod def update_ft_proxies(to_remove=None, to_add=None): if to_remove is None: to_remove = [] if to_add is None: to_add = [] for account in app.config.get_per('accounts'): proxies_str = app.config.get_per('accounts', account, 'file_transfer_proxies') proxies = [p.strip() for p in proxies_str.split(',')] for wrong_proxy in to_remove: if wrong_proxy in proxies: proxies.remove(wrong_proxy) for new_proxy in to_add: if new_proxy not in proxies: proxies.append(new_proxy) proxies_str = ', '.join(proxies) app.config.set_per('accounts', account, 'file_transfer_proxies', proxies_str) @staticmethod def call_sql(db_path, sql): con = sqlite.connect(db_path) cur = con.cursor() try: cur.executescript(sql) con.commit() except sqlite.OperationalError as e: if str(e).startswith('duplicate column name:'): log.info(str(e)) else: log.exception('Error') con.close() def update_config_x_to_09(self): # Var name that changed: # avatar_width /height -> chat_avatar_width / height if 'avatar_width' in self.old_values: app.config.set('chat_avatar_width', self.old_values['avatar_width']) if 'avatar_height' in self.old_values: app.config.set('chat_avatar_height', self.old_values['avatar_height']) if 'use_dbus' in self.old_values: app.config.set('remote_control', self.old_values['use_dbus']) # always_compact_view -> always_compact_view_chat / _gc if 'always_compact_view' in self.old_values: app.config.set('always_compact_view_chat', self.old_values['always_compact_view']) app.config.set('always_compact_view_gc', self.old_values['always_compact_view']) # new theme: grocery, plain d = ['accounttextcolor', 'accountbgcolor', 'accountfont', 'accountfontattrs', 'grouptextcolor', 'groupbgcolor', 'groupfont', 'groupfontattrs', 'contacttextcolor', 'contactbgcolor', 'contactfont', 'contactfontattrs', 'bannertextcolor', 'bannerbgcolor', 'bannerfont', 'bannerfontattrs'] for theme_name in (_('grocery'), _('default')): if theme_name not in app.config.get_per('themes'): app.config.add_per('themes', theme_name) theme = app.config.themes_default[theme_name] for o in d: app.config.set_per('themes', theme_name, o, theme[d.index(o)]) # Remove cyan theme if it's not the current theme if 'cyan' in app.config.get_per('themes'): app.config.del_per('themes', 'cyan') if _('cyan') in app.config.get_per('themes'): app.config.del_per('themes', _('cyan')) # If we removed our roster_theme, choose the default green one or another # one if doesn't exists in config if app.config.get('roster_theme') not in app.config.get_per('themes'): theme = _('green') if theme not in app.config.get_per('themes'): theme = app.config.get_per('themes')[0] app.config.set('roster_theme', theme) # new proxies in accounts.name.file_transfer_proxies self.update_ft_proxies(to_add=['proxy.netlab.cz']) app.config.set('version', '0.9') def update_config_09_to_010(self): if 'usetabbedchat' in self.old_values and not \ self.old_values['usetabbedchat']: app.config.set('one_message_window', 'never') if 'autodetect_browser_mailer' in self.old_values and \ self.old_values['autodetect_browser_mailer'] is True: app.config.set('autodetect_browser_mailer', False) if 'useemoticons' in self.old_values and \ not self.old_values['useemoticons']: app.config.set('emoticons_theme', '') if 'always_compact_view_chat' in self.old_values and \ self.old_values['always_compact_view_chat'] != 'False': app.config.set('always_hide_chat_buttons', True) if 'always_compact_view_gc' in self.old_values and \ self.old_values['always_compact_view_gc'] != 'False': app.config.set('always_hide_groupchat_buttons', True) self.update_ft_proxies(to_remove=['proxy65.jabber.autocom.pl', 'proxy65.jabber.ccc.de'], to_add=['transfer.jabber.freenet.de']) # create unread_messages table if needed self.assert_unread_msgs_table_exists() app.config.set('version', '0.10') def update_config_to_01011(self): if 'print_status_in_muc' in self.old_values and \ self.old_values['print_status_in_muc'] in (True, False): app.config.set('print_status_in_muc', 'in_and_out') app.config.set('version', '0.10.1.1') def update_config_to_01012(self): # See [6456] if 'emoticons_theme' in self.old_values and \ self.old_values['emoticons_theme'] == 'Disabled': app.config.set('emoticons_theme', '') app.config.set('version', '0.10.1.2') def update_config_to_01013(self): """ Create table transports_cache if there is no such table """ self.call_sql(logger.LOG_DB_PATH, ''' CREATE TABLE IF NOT EXISTS transports_cache ( transport TEXT UNIQUE, type INTEGER ); ''' ) app.config.set('version', '0.10.1.3') def update_config_to_01014(self): """ Apply indeces to the logs database """ print(_('migrating logs database to indices')) self.call_sql(logger.LOG_DB_PATH, ''' CREATE INDEX idx_logs_jid_id_kind ON logs (jid_id, kind); CREATE INDEX idx_unread_messages_jid_id ON unread_messages (jid_id); ''' ) app.config.set('version', '0.10.1.4') def update_config_to_01015(self): """ Clean show values in logs database """ con = sqlite.connect(logger.LOG_DB_PATH) cur = con.cursor() status = dict((i[5:].lower(), logger.constants.__dict__[i]) for i in \ logger.constants.__dict__.keys() if i.startswith('SHOW_')) for show in status: cur.execute('update logs set show = ? where show = ?;', (status[show], show)) cur.execute('update logs set show = NULL where show not in (0, 1, 2, 3, 4, 5);') con.commit() cur.close() # remove this in 2007 [pysqlite old versions need this] con.close() app.config.set('version', '0.10.1.5') def update_config_to_01016(self): """ #2494 : Now we play gc_received_message sound even if notify_on_all_muc_messages is false. Keep precedent behaviour """ if 'notify_on_all_muc_messages' in self.old_values and \ self.old_values['notify_on_all_muc_messages'] == 'False' and \ app.config.get_per('soundevents', 'muc_message_received', 'enabled'): app.config.set_per('soundevents',\ 'muc_message_received', 'enabled', False) app.config.set('version', '0.10.1.6') def update_config_to_01017(self): """ trayicon_notification_on_new_messages -> trayicon_notification_on_events """ if 'trayicon_notification_on_new_messages' in self.old_values: app.config.set('trayicon_notification_on_events', self.old_values['trayicon_notification_on_new_messages']) app.config.set('version', '0.10.1.7') def update_config_to_01018(self): """ chat_state_notifications -> outgoing_chat_state_notifications """ if 'chat_state_notifications' in self.old_values: app.config.set('outgoing_chat_state_notifications', self.old_values['chat_state_notifications']) app.config.set('version', '0.10.1.8') def update_config_to_01101(self): """ Fill time_stamp from before_time and after_time """ if 'before_time' in self.old_values: app.config.set('time_stamp', '%s%%X%s ' % ( self.old_values['before_time'], self.old_values['after_time'])) app.config.set('version', '0.11.0.1') def update_config_to_01102(self): """ Fill time_stamp from before_time and after_time """ if 'ft_override_host_to_send' in self.old_values: app.config.set('ft_add_hosts_to_send', self.old_values['ft_override_host_to_send']) app.config.set('version', '0.11.0.2') def update_config_to_01111(self): """ Always_hide_chatbuttons -> compact_view """ if 'always_hide_groupchat_buttons' in self.old_values and \ 'always_hide_chat_buttons' in self.old_values: app.config.set('compact_view', self.old_values['always_hide_groupchat_buttons'] and \ self.old_values['always_hide_chat_buttons']) app.config.set('version', '0.11.1.1') def update_config_to_01112(self): """ GTK+ theme is renamed to default """ if 'roster_theme' in self.old_values and \ self.old_values['roster_theme'] == 'gtk+': app.config.set('roster_theme', _('default')) app.config.set('version', '0.11.1.2') def update_config_to_01113(self): self.call_sql(logger.LOG_DB_PATH, ''' CREATE TABLE IF NOT EXISTS caps_cache ( node TEXT, ver TEXT, ext TEXT, data BLOB ); ''' ) app.config.set('version', '0.11.1.3') def update_config_to_01114(self): # add default theme if it doesn't exist d = ['accounttextcolor', 'accountbgcolor', 'accountfont', 'accountfontattrs', 'grouptextcolor', 'groupbgcolor', 'groupfont', 'groupfontattrs', 'contacttextcolor', 'contactbgcolor', 'contactfont', 'contactfontattrs', 'bannertextcolor', 'bannerbgcolor', 'bannerfont', 'bannerfontattrs'] theme_name = _('default') if theme_name not in app.config.get_per('themes'): app.config.add_per('themes', theme_name) if app.config.get_per('themes', 'gtk+'): # copy from old gtk+ theme for o in d: val = app.config.get_per('themes', 'gtk+', o) app.config.set_per('themes', theme_name, o, val) app.config.del_per('themes', 'gtk+') else: # copy from default theme theme = app.config.themes_default[theme_name] for o in d: app.config.set_per('themes', theme_name, o, theme[d.index(o)]) app.config.set('version', '0.11.1.4') def update_config_to_01115(self): self.call_sql(logger.LOG_DB_PATH, '''DELETE FROM caps_cache;''') app.config.set('version', '0.11.1.5') def update_config_to_01121(self): # remove old unencrypted secrets file from gajim.common.configpaths import gajimpaths new_file = gajimpaths['SECRETS_FILE'] old_file = os.path.dirname(new_file) + '/secrets' if os.path.exists(old_file): os.remove(old_file) app.config.set('version', '0.11.2.1') def update_config_to_01141(self): self.call_sql(logger.LOG_DB_PATH, ''' CREATE TABLE IF NOT EXISTS caps_cache ( node TEXT, ver TEXT, ext TEXT, data BLOB ); ''' ) app.config.set('version', '0.11.4.1') def update_config_to_01142(self): """ next_message_received sound event is splittedin 2 events """ app.config.add_per('soundevents', 'next_message_received_focused') app.config.add_per('soundevents', 'next_message_received_unfocused') if app.config.get_per('soundevents', 'next_message_received'): enabled = app.config.get_per('soundevents', 'next_message_received', 'enabled') path = app.config.get_per('soundevents', 'next_message_received', 'path') app.config.del_per('soundevents', 'next_message_received') app.config.set_per('soundevents', 'next_message_received_focused', 'enabled', enabled) app.config.set_per('soundevents', 'next_message_received_focused', 'path', path) app.config.set('version', '0.11.1.2') def update_config_to_01143(self): self.call_sql(logger.LOG_DB_PATH, ''' CREATE TABLE IF NOT EXISTS rooms_last_message_time( jid_id INTEGER PRIMARY KEY UNIQUE, time INTEGER ); ''' ) app.config.set('version', '0.11.4.3') def update_config_to_01144(self): back = os.getcwd() os.chdir(logger.LOG_DB_FOLDER) con = sqlite.connect(logger.LOG_DB_FILE) os.chdir(back) cur = con.cursor() try: cur.executescript('DROP TABLE caps_cache;') con.commit() except sqlite.OperationalError: pass try: cur.executescript( ''' CREATE TABLE IF NOT EXISTS caps_cache ( hash_method TEXT, hash TEXT, data BLOB ); ''' ) con.commit() except sqlite.OperationalError: pass con.close() app.config.set('version', '0.11.4.4') def update_config_to_01201(self): if 'uri_schemes' in self.old_values: new_values = self.old_values['uri_schemes'].replace(' mailto', '').\ replace(' xmpp', '') app.config.set('uri_schemes', new_values) app.config.set('version', '0.12.0.1') def update_config_to_01211(self): if 'trayicon' in self.old_values: if self.old_values['trayicon'] == 'False': app.config.set('trayicon', 'never') else: app.config.set('trayicon', 'always') app.config.set('version', '0.12.1.1') def update_config_to_01212(self): for opt in ('ignore_unknown_contacts', 'send_os_info', 'log_encrypted_sessions'): if opt in self.old_values: val = self.old_values[opt] for account in app.config.get_per('accounts'): app.config.set_per('accounts', account, opt, val) app.config.set('version', '0.12.1.2') def update_config_to_01213(self): msgs = app.config.statusmsg_default for msg_name in app.config.get_per('statusmsg'): if msg_name in msgs: app.config.set_per('statusmsg', msg_name, 'activity', msgs[msg_name][1]) app.config.set_per('statusmsg', msg_name, 'subactivity', msgs[msg_name][2]) app.config.set_per('statusmsg', msg_name, 'activity_text', msgs[msg_name][3]) app.config.set_per('statusmsg', msg_name, 'mood', msgs[msg_name][4]) app.config.set_per('statusmsg', msg_name, 'mood_text', msgs[msg_name][5]) app.config.set('version', '0.12.1.3') def update_config_to_01214(self): for status in ['online', 'chat', 'away', 'xa', 'dnd', 'invisible', 'offline']: if 'last_status_msg_' + status in self.old_values: app.config.add_per('statusmsg', '_last_' + status) app.config.set_per('statusmsg', '_last_' + status, 'message', self.old_values['last_status_msg_' + status]) app.config.set('version', '0.12.1.4') def update_config_to_01215(self): """ Remove hardcoded ../data/sounds from config """ dirs = ['../data', app.gajimpaths.data_root, app.DATA_DIR] if os.name != 'nt': dirs.append(os.path.expanduser('~/.gajim')) for evt in app.config.get_per('soundevents'): path = app.config.get_per('soundevents', evt, 'path') # absolute and relative passes are necessary path = helpers.strip_soundfile_path(path, dirs, abs=False) path = helpers.strip_soundfile_path(path, dirs, abs=True) app.config.set_per('soundevents', evt, 'path', path) app.config.set('version', '0.12.1.5') def update_config_to_01231(self): self.call_sql(logger.LOG_DB_PATH, ''' CREATE TABLE IF NOT EXISTS roster_entry( account_jid_id INTEGER, jid_id INTEGER, name TEXT, subscription INTEGER, ask BOOLEAN, PRIMARY KEY (account_jid_id, jid_id) ); CREATE TABLE IF NOT EXISTS roster_group( account_jid_id INTEGER, jid_id INTEGER, group_name TEXT, PRIMARY KEY (account_jid_id, jid_id, group_name) ); ''' ) app.config.set('version', '0.12.3.1') def update_config_from_0125(self): # All those functions need to be called for 0.12.5 to 0.13 transition self.update_config_to_01211() self.update_config_to_01213() self.update_config_to_01214() self.update_config_to_01215() self.update_config_to_01231() def update_config_to_01251(self): self.call_sql(logger.LOG_DB_PATH, '''ALTER TABLE unread_messages ADD COLUMN 'shown' BOOLEAN default 0;''' ) app.config.set('version', '0.12.5.1') def update_config_to_01252(self): if 'alwaysauth' in self.old_values: val = self.old_values['alwaysauth'] for account in app.config.get_per('accounts'): app.config.set_per('accounts', account, 'autoauth', val) app.config.set('version', '0.12.5.2') def update_config_to_01253(self): if 'enable_zeroconf' in self.old_values: val = self.old_values['enable_zeroconf'] for account in app.config.get_per('accounts'): if app.config.get_per('accounts', account, 'is_zeroconf'): app.config.set_per('accounts', account, 'active', val) else: app.config.set_per('accounts', account, 'active', True) app.config.set('version', '0.12.5.3') def update_config_to_01254(self): vals = {'inmsgcolor': ['#a34526', '#a40000'], 'outmsgcolor': ['#164e6f', '#3465a4'], 'restored_messages_color': ['grey', '#555753'], 'statusmsgcolor': ['#1eaa1e', '#73d216'], 'urlmsgcolor': ['#0000ff', '#204a87'], 'gc_nicknames_colors': ['#a34526:#c000ff:#0012ff:#388a99:#045723:#7c7c7c:#ff8a00:#94452d:#244b5a:#32645a', '#4e9a06:#f57900:#ce5c00:#3465a4:#204a87:#75507b:#5c3566:#c17d11:#8f5902:#ef2929:#cc0000:#a40000']} for c in vals: if c not in self.old_values: continue val = self.old_values[c] if val == vals[c][0]: # We didn't change default value, so update it with new default app.config.set(c, vals[c][1]) app.config.set('version', '0.12.5.4') def update_config_to_01255(self): vals = {'statusmsgcolor': ['#73d216', '#4e9a06'], 'outmsgtxtcolor': ['#a2a2a2', '#555753']} for c in vals: if c not in self.old_values: continue val = self.old_values[c] if val == vals[c][0]: # We didn't change default value, so update it with new default app.config.set(c, vals[c][1]) app.config.set('version', '0.12.5.5') def update_config_to_01256(self): vals = {'gc_nicknames_colors': ['#4e9a06:#f57900:#ce5c00:#3465a4:#204a87:#75507b:#5c3566:#c17d11:#8f5902:#ef2929:#cc0000:#a40000', '#f57900:#ce5c00:#204a87:#75507b:#5c3566:#c17d11:#8f5902:#ef2929:#cc0000:#a40000']} for c in vals: if c not in self.old_values: continue val = self.old_values[c] if val == vals[c][0]: # We didn't change default value, so update it with new default app.config.set(c, vals[c][1]) app.config.set('version', '0.12.5.6') def update_config_to_01257(self): if 'iconset' in self.old_values: if self.old_values['iconset'] in ('nuvola', 'crystal', 'gossip', 'simplebulb', 'stellar'): app.config.set('iconset', app.config.DEFAULT_ICONSET) app.config.set('version', '0.12.5.7') def update_config_to_01258(self): self.update_ft_proxies(to_remove=['proxy65.talkonaut.com', 'proxy.jabber.org', 'proxy.netlab.cz', 'transfer.jabber.freenet.de', 'proxy.jabber.cd.chalmers.se'], to_add=['proxy.eu.jabber.org', 'proxy.jabber.ru', 'proxy.jabbim.cz']) app.config.set('version', '0.12.5.8') def update_config_to_013100(self): self.call_sql(logger.LOG_DB_PATH, '''ALTER TABLE caps_cache ADD COLUMN 'last_seen' INTEGER default %d;''' % int(time()) ) app.config.set('version', '0.13.10.0') def update_config_to_013101(self): self.call_sql(logger.LOG_DB_PATH, ''' DROP INDEX IF EXISTS idx_logs_jid_id_kind; CREATE INDEX IF NOT EXISTS idx_logs_jid_id_time ON logs (jid_id, time DESC); ''' ) app.config.set('version', '0.13.10.1') def update_config_to_013901(self): schemes = 'aaa:// aaas:// acap:// cap:// cid: crid:// data: dav: dict:// dns: fax: file:/ ftp:// geo: go: gopher:// h323: http:// https:// iax: icap:// im: imap:// info: ipp:// iris: iris.beep: iris.xpc: iris.xpcs: iris.lwz: ldap:// mid: modem: msrp:// msrps:// mtqp:// mupdate:// news: nfs:// nntp:// opaquelocktoken: pop:// pres: prospero:// rtsp:// service: shttp:// sip: sips: sms: snmp:// soap.beep:// soap.beeps:// tag: tel: telnet:// tftp:// thismessage:/ tip:// tv: urn:// vemmi:// xmlrpc.beep:// xmlrpc.beeps:// z39.50r:// z39.50s:// about: apt: cvs:// daap:// ed2k:// feed: fish:// git:// iax2: irc:// ircs:// ldaps:// magnet: mms:// rsync:// ssh:// svn:// sftp:// smb:// webcal://' app.config.set('uri_schemes', schemes) app.config.set('version', '0.13.90.1') def update_config_to_01401(self): if 'autodetect_browser_mailer' not in self.old_values or 'openwith' \ not in self.old_values or \ (self.old_values['autodetect_browser_mailer'] == False and \ self.old_values['openwith'] != 'custom'): app.config.set('autodetect_browser_mailer', True) app.config.set('openwith', app.config.DEFAULT_OPENWITH) app.config.set('version', '0.14.0.1') def update_config_to_014900(self): if 'use_stun_server' in self.old_values and self.old_values[ 'use_stun_server'] and not self.old_values['stun_server']: app.config.set('use_stun_server', False) if os.name == 'nt': app.config.set('autodetect_browser_mailer', True) def update_config_to_01601(self): if 'last_mam_id' in self.old_values: last_mam_id = self.old_values['last_mam_id'] for account in app.config.get_per('accounts'): app.config.set_per('accounts', account, 'last_mam_id', last_mam_id) app.config.set('version', '0.16.0.1') def update_config_to_01641(self): for account in self.old_values['accounts'].keys(): connection_types = self.old_values['accounts'][account][ 'connection_types'].split() if 'plain' in connection_types and len(connection_types) > 1: connection_types.remove('plain') app.config.set_per('accounts', account, 'connection_types', ' '.join(connection_types)) app.config.set('version', '0.16.4.1') def update_config_to_016101(self): if 'video_input_device' in self.old_values: if self.old_values['video_input_device'] == 'autovideosrc ! videoscale ! ffmpegcolorspace': app.config.set('video_input_device', 'autovideosrc') if self.old_values['video_input_device'] == 'videotestsrc is-live=true ! video/x-raw-yuv,framerate=10/1': app.config.set('video_input_device', 'videotestsrc is-live=true ! video/x-raw,framerate=10/1') app.config.set('version', '0.16.10.1') def update_config_to_016102(self): for account in self.old_values['accounts'].keys(): app.config.del_per('accounts', account, 'minimized_gc') self.call_sql(logger.LOG_DB_PATH, '''ALTER TABLE logs ADD COLUMN 'additional_data' TEXT;''' ) app.config.set('version', '0.16.10.2') def update_config_to_016103(self): self.call_sql(logger.LOG_DB_PATH, '''ALTER TABLE logs ADD COLUMN 'stanza_id' TEXT; ALTER TABLE logs ADD COLUMN 'encryption' TEXT; ALTER TABLE logs ADD COLUMN 'encryption_state' TEXT; ALTER TABLE logs ADD COLUMN 'marker' INTEGER; ''' ) app.config.set('version', '0.16.10.3') def update_config_to_016104(self): app.config.set('emoticons_theme', 'noto-emoticons') app.config.set('version', '0.16.10.4') def update_config_to_016105(self): app.config.set('muc_restore_timeout', -1) app.config.set('restore_timeout', -1) app.config.set('version', '0.16.10.5') def update_config_to_016111(self): self.call_sql(logger.CACHE_DB_PATH, '''ALTER TABLE roster_entry ADD COLUMN 'avatar_sha' TEXT; ''' ) app.config.set('version', '0.16.11.1') def update_config_to_016112(self): self.call_sql(logger.LOG_DB_PATH, ''' CREATE TABLE IF NOT EXISTS last_archive_message( jid_id INTEGER PRIMARY KEY UNIQUE, last_mam_id TEXT, oldest_mam_timestamp TEXT, last_muc_timestamp TEXT ); ALTER TABLE logs ADD COLUMN 'account_id' INTEGER; ''' ) app.config.set('version', '0.16.11.2') def update_config_to_0982(self): # This fixes a typo in update_config_to_016112() self.call_sql(logger.LOG_DB_PATH, ''' ALTER TABLE logs ADD COLUMN 'account_id' INTEGER; ALTER TABLE logs ADD COLUMN 'additional_data' TEXT; ''' ) app.config.set('version', '0.98.2') def update_config_to_0983(self): for account in self.old_values['accounts'].keys(): password = self.old_values['accounts'][account]['password'] if password == "winvault:": app.config.set_per('accounts', account, 'password', 'keyring:') elif password == "libsecret:": app.config.set_per('accounts', account, 'password', '') app.config.set('version', '0.98.3') def update_config_to_0992(self): self.call_sql(logger.LOG_DB_PATH, ''' CREATE INDEX IF NOT EXISTS idx_logs_stanza_id ON logs (stanza_id); ''' ) app.config.set('version', '0.99.2') gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/passwords.py000066400000000000000000000114531326020644600256650ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/passwords.py ## ## Copyright (C) 2006 Gustavo J. A. M. Carneiro ## Nikos Kouremenos ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2007 Jean-Marie Traissard ## Julien Pivotto ## Copyright (C) 2008 Stephan Erb ## Copyright (c) 2009 Thorsten Glaser ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import logging from gajim.common import app __all__ = ['get_password', 'save_password'] log = logging.getLogger('gajim.password') keyring = None try: import keyring except ImportError: log.debug('python-keyring missing, falling back to plaintext storage') class PasswordStorage(object): """Interface for password stores""" def get_password(self, account_name): """Return the password for account_name, or None if not found.""" raise NotImplementedError def save_password(self, account_name, password): """Save password for account_name. Return a bool indicating success.""" raise NotImplementedError class SecretPasswordStorage(PasswordStorage): """ Store password using Keyring """ identifier = 'keyring:' def __init__(self): self.keyring = keyring.get_keyring() def save_password(self, account_name, password): try: self.keyring.set_password('gajim', account_name, password) return True except: log.exception('error:') return False def get_password(self, account_name): log.debug('getting password') return self.keyring.get_password('gajim', account_name) class PasswordStorageManager(PasswordStorage): """Access all the implemented password storage backends, knowing which ones are available and which we prefer to use. Also implements storing directly in gajim config.""" def __init__(self): self.preferred_backend = None self.secret = None self.connect_backends() self.set_preferred_backend() def connect_backends(self): """Initialize backend connections, determining which ones are available. """ # TODO: handle disappearing backends if app.config.get('use_keyring') and keyring: self.secret = SecretPasswordStorage() def get_password(self, account_name): pw = app.config.get_per('accounts', account_name, 'password') if not pw: return pw if pw.startswith(SecretPasswordStorage.identifier) and self.secret: backend = self.secret else: backend = None if backend: pw = backend.get_password(account_name) if backend != self.preferred_backend: # migrate password to preferred_backend self.save_password(account_name, pw) # TODO: remove from old backend return pw def save_password(self, account_name, password): if self.preferred_backend: if self.preferred_backend.save_password(account_name, password): app.config.set_per('accounts', account_name, 'password', self.preferred_backend.identifier) if account_name in app.connections: app.connections[account_name].password = password return True app.config.set_per('accounts', account_name, 'password', password) if account_name in app.connections: app.connections[account_name].password = password return True def set_preferred_backend(self): if self.secret: self.preferred_backend = self.secret else: self.preferred_backend = None passwordStorageManager = None def get_storage(): global passwordStorageManager if not passwordStorageManager: passwordStorageManager = PasswordStorageManager() return passwordStorageManager def get_password(account_name): return get_storage().get_password(account_name) def save_password(account_name, password): if account_name in app.connections: app.connections[account_name].set_password(password) return get_storage().save_password(account_name, password) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/pep.py000066400000000000000000000527131326020644600244300ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/pep.py ## ## Copyright (C) 2007 Piotr Gaczkowski ## Copyright (C) 2007-2014 Yann Leboulanger ## Copyright (C) 2008 Brendan Taylor ## Jean-Marie Traissard ## Jonathan Schleifer ## Stephan Erb ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## MOODS = { 'afraid': _('Afraid'), 'amazed': _('Amazed'), 'amorous': _('Amorous'), 'angry': _('Angry'), 'annoyed': _('Annoyed'), 'anxious': _('Anxious'), 'aroused': _('Aroused'), 'ashamed': _('Ashamed'), 'bored': _('Bored'), 'brave': _('Brave'), 'calm': _('Calm'), 'cautious': _('Cautious'), 'cold': _('Cold'), 'confident': _('Confident'), 'confused': _('Confused'), 'contemplative': _('Contemplative'), 'contented': _('Contented'), 'cranky': _('Cranky'), 'crazy': _('Crazy'), 'creative': _('Creative'), 'curious': _('Curious'), 'dejected': _('Dejected'), 'depressed': _('Depressed'), 'disappointed': _('Disappointed'), 'disgusted': _('Disgusted'), 'dismayed': _('Dismayed'), 'distracted': _('Distracted'), 'embarrassed': _('Embarrassed'), 'envious': _('Envious'), 'excited': _('Excited'), 'flirtatious': _('Flirtatious'), 'frustrated': _('Frustrated'), 'grateful': _('Grateful'), 'grieving': _('Grieving'), 'grumpy': _('Grumpy'), 'guilty': _('Guilty'), 'happy': _('Happy'), 'hopeful': _('Hopeful'), 'hot': _('Hot'), 'humbled': _('Humbled'), 'humiliated': _('Humiliated'), 'hungry': _('Hungry'), 'hurt': _('Hurt'), 'impressed': _('Impressed'), 'in_awe': _('In Awe'), 'in_love': _('In Love'), 'indignant': _('Indignant'), 'interested': _('Interested'), 'intoxicated': _('Intoxicated'), 'invincible': _('Invincible'), 'jealous': _('Jealous'), 'lonely': _('Lonely'), 'lost': _('Lost'), 'lucky': _('Lucky'), 'mean': _('Mean'), 'moody': _('Moody'), 'nervous': _('Nervous'), 'neutral': _('Neutral'), 'offended': _('Offended'), 'outraged': _('Outraged'), 'playful': _('Playful'), 'proud': _('Proud'), 'relaxed': _('Relaxed'), 'relieved': _('Relieved'), 'remorseful': _('Remorseful'), 'restless': _('Restless'), 'sad': _('Sad'), 'sarcastic': _('Sarcastic'), 'satisfied': _('Satisfied'), 'serious': _('Serious'), 'shocked': _('Shocked'), 'shy': _('Shy'), 'sick': _('Sick'), 'sleepy': _('Sleepy'), 'spontaneous': _('Spontaneous'), 'stressed': _('Stressed'), 'strong': _('Strong'), 'surprised': _('Surprised'), 'thankful': _('Thankful'), 'thirsty': _('Thirsty'), 'tired': _('Tired'), 'undefined': _('Undefined'), 'weak': _('Weak'), 'worried': _('Worried')} ACTIVITIES = { 'doing_chores': {'category': _('Doing Chores'), 'buying_groceries': _('Buying Groceries'), 'cleaning': _('Cleaning'), 'cooking': _('Cooking'), 'doing_maintenance': _('Doing Maintenance'), 'doing_the_dishes': _('Doing the Dishes'), 'doing_the_laundry': _('Doing the Laundry'), 'gardening': _('Gardening'), 'running_an_errand': _('Running an Errand'), 'walking_the_dog': _('Walking the Dog')}, 'drinking': {'category': _('Drinking'), 'having_a_beer': _('Having a Beer'), 'having_coffee': _('Having Coffee'), 'having_tea': _('Having Tea')}, 'eating': {'category': _('Eating'), 'having_a_snack': _('Having a Snack'), 'having_breakfast': _('Having Breakfast'), 'having_dinner': _('Having Dinner'), 'having_lunch': _('Having Lunch')}, 'exercising': {'category': _('Exercising'), 'cycling': _('Cycling'), 'dancing': _('Dancing'), 'hiking': _('Hiking'), 'jogging': _('Jogging'), 'playing_sports': _('Playing Sports'), 'running': _('Running'), 'skiing': _('Skiing'), 'swimming': _('Swimming'), 'working_out': _('Working out')}, 'grooming': {'category': _('Grooming'), 'at_the_spa': _('At the Spa'), 'brushing_teeth': _('Brushing Teeth'), 'getting_a_haircut': _('Getting a Haircut'), 'shaving': _('Shaving'), 'taking_a_bath': _('Taking a Bath'), 'taking_a_shower': _('Taking a Shower')}, 'having_appointment': {'category': _('Having an Appointment')}, 'inactive': {'category': _('Inactive'), 'day_off': _('Day Off'), 'hanging_out': _('Hanging out'), 'hiding': _('Hiding'), 'on_vacation': _('On Vacation'), 'praying': _('Praying'), 'scheduled_holiday': _('Scheduled Holiday'), 'sleeping': _('Sleeping'), 'thinking': _('Thinking')}, 'relaxing': {'category': _('Relaxing'), 'fishing': _('Fishing'), 'gaming': _('Gaming'), 'going_out': _('Going out'), 'partying': _('Partying'), 'reading': _('Reading'), 'rehearsing': _('Rehearsing'), 'shopping': _('Shopping'), 'smoking': _('Smoking'), 'socializing': _('Socializing'), 'sunbathing': _('Sunbathing'), 'watching_tv': _('Watching TV'), 'watching_a_movie': _('Watching a Movie')}, 'talking': {'category': _('Talking'), 'in_real_life': _('In Real Life'), 'on_the_phone': _('On the Phone'), 'on_video_phone': _('On Video Phone')}, 'traveling': {'category': _('Traveling'), 'commuting': _('Commuting'), 'cycling': _('Cycling'), 'driving': _('Driving'), 'in_a_car': _('In a Car'), 'on_a_bus': _('On a Bus'), 'on_a_plane': _('On a Plane'), 'on_a_train': _('On a Train'), 'on_a_trip': _('On a Trip'), 'walking': _('Walking')}, 'working': {'category': _('Working'), 'coding': _('Coding'), 'in_a_meeting': _('In a Meeting'), 'studying': _('Studying'), 'writing': _('Writing')}} TUNE_DATA = ['artist', 'title', 'source', 'track', 'length'] LOCATION_DATA = { 'accuracy': _('accuracy'), 'alt': _('alt'), 'area': _('area'), 'bearing': _('bearing'), 'building': _('building'), 'country': _('country'), 'countrycode': _('countrycode'), 'datum': _('datum'), 'description': _('description'), 'error': _('error'), 'floor': _('floor'), 'lat': _('lat'), 'locality': _('locality'), 'lon': _('lon'), 'postalcode': _('postalcode'), 'region': _('region'), 'room': _('room'), 'speed': _('speed'), 'street': _('street'), 'text': _('text'), 'timestamp': _('timestamp'), 'uri': _('uri')} from gi.repository import GLib import logging log = logging.getLogger('gajim.c.pep') import nbxmpp from gajim.common import app class AbstractPEP(object): type_ = '' namespace = '' @classmethod def get_tag_as_PEP(cls, jid, account, event_tag): items = event_tag.getTag('items', {'node': cls.namespace}) if items: log.debug("Received PEP 'user %s' from %s" % (cls.type_, jid)) return cls(jid, account, items) else: return None def __init__(self, jid, account, items): self._pep_specific_data, self._retracted = self._extract_info(items) self._update_contacts(jid, account) if jid == app.get_jid_from_account(account): self._update_account(account) self._on_receive(jid, account) def _extract_info(self, items): '''To be implemented by subclasses''' raise NotImplementedError def _update_contacts(self, jid, account): for contact in app.contacts.get_contacts(account, jid): if self._retracted: if self.type_ in contact.pep: del contact.pep[self.type_] else: contact.pep[self.type_] = self def _update_account(self, account): acc = app.connections[account] if self._retracted: if self.type_ in acc.pep: del acc.pep[self.type_] else: acc.pep[self.type_] = self def asMarkupText(self): '''SHOULD be implemented by subclasses''' return '' def _on_receive(self, jid, account): '''SHOULD be implemented by subclasses''' pass class UserMoodPEP(AbstractPEP): '''XEP-0107: User Mood''' type_ = 'mood' namespace = nbxmpp.NS_MOOD def _extract_info(self, items): mood_dict = {} for item in items.getTags('item'): mood_tag = item.getTag('mood') if mood_tag: for child in mood_tag.getChildren(): name = child.getName().strip() if name == 'text': mood_dict['text'] = child.getData() else: mood_dict['mood'] = name retracted = items.getTag('retract') or not 'mood' in mood_dict return (mood_dict, retracted) def asMarkupText(self): assert not self._retracted untranslated_mood = self._pep_specific_data['mood'] mood = self._translate_mood(untranslated_mood) markuptext = '%s' % GLib.markup_escape_text(mood) if 'text' in self._pep_specific_data: text = self._pep_specific_data['text'] markuptext += ' (%s)' % GLib.markup_escape_text(text) return markuptext def _translate_mood(self, mood): if mood in MOODS: return MOODS[mood] else: return mood class UserTunePEP(AbstractPEP): '''XEP-0118: User Tune''' type_ = 'tune' namespace = nbxmpp.NS_TUNE def _extract_info(self, items): tune_dict = {} for item in items.getTags('item'): tune_tag = item.getTag('tune') if tune_tag: for child in tune_tag.getChildren(): name = child.getName().strip() data = child.getData().strip() if child.getName() in TUNE_DATA: tune_dict[name] = data retracted = items.getTag('retract') or not ('artist' in tune_dict or 'title' in tune_dict) return (tune_dict, retracted) def asMarkupText(self): assert not self._retracted tune = self._pep_specific_data artist = tune.get('artist', _('Unknown Artist')) artist = GLib.markup_escape_text(artist) title = tune.get('title', _('Unknown Title')) title = GLib.markup_escape_text(title) source = tune.get('source', _('Unknown Source')) source = GLib.markup_escape_text(source) tune_string = _('"%(title)s" by %(artist)s\n' 'from %(source)s') % {'title': title, 'artist': artist, 'source': source} return tune_string class UserActivityPEP(AbstractPEP): '''XEP-0108: User Activity''' type_ = 'activity' namespace = nbxmpp.NS_ACTIVITY def _extract_info(self, items): activity_dict = {} for item in items.getTags('item'): activity_tag = item.getTag('activity') if activity_tag: for child in activity_tag.getChildren(): name = child.getName().strip() data = child.getData().strip() if name == 'text': activity_dict['text'] = data else: activity_dict['activity'] = name for subactivity in child.getChildren(): subactivity_name = subactivity.getName().strip() activity_dict['subactivity'] = subactivity_name retracted = items.getTag('retract') or not 'activity' in activity_dict return (activity_dict, retracted) def asMarkupText(self): assert not self._retracted pep = self._pep_specific_data activity = pep['activity'] subactivity = pep['subactivity'] if 'subactivity' in pep else None text = pep['text'] if 'text' in pep else None if activity in ACTIVITIES: # Translate standard activities if subactivity in ACTIVITIES[activity]: subactivity = ACTIVITIES[activity][subactivity] activity = ACTIVITIES[activity]['category'] markuptext = '' + GLib.markup_escape_text(activity) if subactivity: markuptext += ': ' + GLib.markup_escape_text(subactivity) markuptext += '' if text: markuptext += ' (%s)' % GLib.markup_escape_text(text) return markuptext class UserNicknamePEP(AbstractPEP): '''XEP-0172: User Nickname''' type_ = 'nickname' namespace = nbxmpp.NS_NICK def _extract_info(self, items): nick = '' for item in items.getTags('item'): child = item.getTag('nick') if child: nick = child.getData() break retracted = items.getTag('retract') or not nick return (nick, retracted) def _update_contacts(self, jid, account): nick = '' if self._retracted else self._pep_specific_data for contact in app.contacts.get_contacts(account, jid): contact.contact_name = nick def _update_account(self, account): if self._retracted: app.nicks[account] = app.config.get_per('accounts', account, 'name') else: app.nicks[account] = self._pep_specific_data class UserLocationPEP(AbstractPEP): '''XEP-0080: User Location''' type_ = 'location' namespace = nbxmpp.NS_LOCATION def _extract_info(self, items): location_dict = {} for item in items.getTags('item'): location_tag = item.getTag('geoloc') if location_tag: for child in location_tag.getChildren(): name = child.getName().strip() data = child.getData().strip() if child.getName() in LOCATION_DATA: location_dict[name] = data retracted = items.getTag('retract') or not location_dict return (location_dict, retracted) def _update_account(self, account): AbstractPEP._update_account(self, account) con = app.connections[account].location_info = \ self._pep_specific_data def asMarkupText(self): assert not self._retracted location = self._pep_specific_data location_string = '' for entry in location.keys(): text = location[entry] text = GLib.markup_escape_text(text) # Translate standart location tag tag = LOCATION_DATA.get(entry, entry) location_string += '\n%(tag)s: %(text)s' % \ {'tag': tag.capitalize(), 'text': text} return location_string.strip() class AvatarNotificationPEP(AbstractPEP): '''XEP-0084: Avatars''' type_ = 'avatar-notification' namespace = 'urn:xmpp:avatar:metadata' def _extract_info(self, items): self.avatar = None for item in items.getTags('item'): info = item.getTag('metadata').getTag('info') if info is not None: self.avatar = info.getAttrs() break return (None, False) def _on_receive(self, jid, account): con = app.connections[account] if self.avatar is None: # Remove avatar app.log('avatar').debug('Remove (Pubsub): %s', jid) app.contacts.set_avatar(account, jid, None) own_jid = con.get_own_jid().getStripped() app.logger.set_avatar_sha(own_jid, jid, None) app.interface.update_avatar(account, jid) else: sha = app.contacts.get_avatar_sha(account, jid) app.log('avatar').info( 'Update (Pubsub): %s %s', jid, self.avatar['id']) if sha == self.avatar['id']: app.log('avatar').info( 'Avatar already known (Pubsub): %s %s', jid, self.avatar['id']) return app.log('avatar').info('Request (Pubsub): %s', jid) con.get_pubsub_avatar(jid, 'urn:xmpp:avatar:data', self.avatar['id']) SUPPORTED_PERSONAL_USER_EVENTS = [ UserMoodPEP, UserTunePEP, UserActivityPEP, UserNicknamePEP, UserLocationPEP, AvatarNotificationPEP] gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/protocol/000077500000000000000000000000001326020644600251235ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/protocol/__init__.py000066400000000000000000000000741326020644600272350ustar00rootroot00000000000000""" Implementations of specific XMPP protocols and XEPs """ gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/protocol/bytestream.py000066400000000000000000001175121326020644600276630ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/connection_handlers.py ## ## Copyright (C) 2006 Dimitur Kirov ## Junglecow J ## Copyright (C) 2006-2007 Tomasz Melcer ## Travis Shirk ## Nikos Kouremenos ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2007 Julien Pivotto ## Copyright (C) 2007-2008 Brendan Taylor ## Jean-Marie Traissard ## Stephan Erb ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import socket import base64 from gi.repository import GLib import time import nbxmpp from gajim.common import app from gajim.common import helpers from gajim.common import ged from gajim.common import jingle_xtls from gajim.common.file_props import FilesProp from gajim.common.socks5 import Socks5SenderClient import logging log = logging.getLogger('gajim.c.p.bytestream') def is_transfer_paused(file_props): if file_props.stopped: return False if file_props.completed: return False if file_props.disconnect_cb: return False return file_props.paused def is_transfer_active(file_props): if file_props.stopped: return False if file_props.completed: return False if not file_props.started: return False if file_props.paused: return True return not file_props.paused def is_transfer_stopped(file_props): if not file_props: return True if file_props.error: return True if file_props.completed: return True if not file_props.stopped: return False return True class ConnectionBytestream: def __init__(self): app.ged.register_event_handler('file-request-received', ged.GUI1, self._nec_file_request_received) def cleanup(self): app.ged.remove_event_handler('file-request-received', ged.GUI1, self._nec_file_request_received) def _ft_get_our_jid(self): our_jid = app.get_jid_from_account(self.name) resource = self.server_resource return our_jid + '/' + resource def _ft_get_receiver_jid(self, file_props): return file_props.receiver.jid + '/' + file_props.receiver.resource def _ft_get_from(self, iq_obj): return helpers.get_full_jid_from_iq(iq_obj) def _ft_get_streamhost_jid_attr(self, streamhost): return helpers.parse_jid(streamhost.getAttr('jid')) def send_file_request(self, file_props): """ Send iq for new FT request """ if not self.connection or self.connected < 2: return file_props.sender = self._ft_get_our_jid() fjid = self._ft_get_receiver_jid(file_props) iq = nbxmpp.Iq(to=fjid, typ='set') iq.setID(file_props.sid) si = iq.setTag('si', namespace=nbxmpp.NS_SI) si.setAttr('profile', nbxmpp.NS_FILE) si.setAttr('id', file_props.sid) file_tag = si.setTag('file', namespace=nbxmpp.NS_FILE) file_tag.setAttr('name', file_props.name) file_tag.setAttr('size', file_props.size) desc = file_tag.setTag('desc') if file_props.desc: desc.setData(file_props.desc) file_tag.setTag('range') feature = si.setTag('feature', namespace=nbxmpp.NS_FEATURE) _feature = nbxmpp.DataForm(typ='form') feature.addChild(node=_feature) field = _feature.setField('stream-method') field.setAttr('type', 'list-single') field.addOption(nbxmpp.NS_BYTESTREAM) field.addOption(nbxmpp.NS_IBB) self.connection.send(iq) def send_file_approval(self, file_props): """ Send iq, confirming that we want to download the file """ # user response to ConfirmationDialog may come after we've disconneted if not self.connection or self.connected < 2: return # file transfer initiated by a jingle session log.info("send_file_approval: jingle session accept") if file_props.session_type == 'jingle': session = self.get_jingle_session(file_props.sender, file_props.sid) if not session: return content = None for c in session.contents.values(): if c.transport.sid == file_props.transport_sid: content = c break if not content: return if not session.accepted: content = session.get_content('file', content.name) if content.use_security: fingerprint = content.x509_fingerprint if not jingle_xtls.check_cert( app.get_jid_without_resource(file_props.sender), fingerprint): id_ = jingle_xtls.send_cert_request(self, file_props.sender) jingle_xtls.key_exchange_pend(id_, content.on_cert_received, []) return session.approve_session() session.approve_content('file', content.name) return iq = nbxmpp.Iq(to=file_props.sender, typ='result') iq.setAttr('id', file_props.request_id) si = iq.setTag('si', namespace=nbxmpp.NS_SI) if file_props.offset: file_tag = si.setTag('file', namespace=nbxmpp.NS_FILE) range_tag = file_tag.setTag('range') range_tag.setAttr('offset', file_props.offset) feature = si.setTag('feature', namespace=nbxmpp.NS_FEATURE) _feature = nbxmpp.DataForm(typ='submit') feature.addChild(node=_feature) field = _feature.setField('stream-method') field.delAttr('type') if nbxmpp.NS_BYTESTREAM in file_props.stream_methods: field.setValue(nbxmpp.NS_BYTESTREAM) else: file_props.transport_sid = file_props.sid field.setValue(nbxmpp.NS_IBB) self.connection.send(iq) def send_file_rejection(self, file_props, code='403', typ=None): """ Inform sender that we refuse to download the file typ is used when code = '400', in this case typ can be 'strean' for invalid stream or 'profile' for invalid profile """ # user response to ConfirmationDialog may come after we've disconneted if not self.connection or self.connected < 2: return if file_props.session_type == 'jingle': if file_props.sid in self._sessions: jingle = self._sessions[file_props.sid] jingle.cancel_session() return iq = nbxmpp.Iq(to=file_props.sender, typ='error') iq.setAttr('id', file_props.request_id) if code == '400' and typ in ('stream', 'profile'): name = 'bad-request' text = '' else: name = 'forbidden' text = 'Offer Declined' err = nbxmpp.ErrorNode(code=code, typ='cancel', name=name, text=text) if code == '400' and typ in ('stream', 'profile'): if typ == 'stream': err.setTag('no-valid-streams', namespace=nbxmpp.NS_SI) else: err.setTag('bad-profile', namespace=nbxmpp.NS_SI) iq.addChild(node=err) self.connection.send(iq) def _siResultCB(self, con, iq_obj): file_props = FilesProp.getFileProp(self.name, iq_obj.getAttr('id')) if not file_props: return if file_props.request_id: # we have already sent streamhosts info return file_props.receiver = self._ft_get_from(iq_obj) si = iq_obj.getTag('si') file_tag = si.getTag('file') range_tag = None if file_tag: range_tag = file_tag.getTag('range') if range_tag: offset = range_tag.getAttr('offset') if offset: file_props.offset = int(offset) length = range_tag.getAttr('length') if length: file_props.length = int(length) feature = si.setTag('feature') if feature.getNamespace() != nbxmpp.NS_FEATURE: return form_tag = feature.getTag('x') form = nbxmpp.DataForm(node=form_tag) field = form.getField('stream-method') if field.getValue() == nbxmpp.NS_BYTESTREAM: self._send_socks5_info(file_props) raise nbxmpp.NodeProcessed if field.getValue() == nbxmpp.NS_IBB: sid = file_props.sid file_props.transport_sid = sid fp = open(file_props.file_name, 'rb') self.OpenStream(sid, file_props.receiver, fp) raise nbxmpp.NodeProcessed def _siSetCB(self, con, iq_obj): from gajim.common.connection_handlers_events import FileRequestReceivedEvent app.nec.push_incoming_event(FileRequestReceivedEvent(None, conn=self, stanza=iq_obj)) raise nbxmpp.NodeProcessed def _nec_file_request_received(self, obj): pass def _siErrorCB(self, con, iq_obj): si = iq_obj.getTag('si') profile = si.getAttr('profile') if profile != nbxmpp.NS_FILE: return file_props = FilesProp.getFileProp(self.name, iq_obj.getAttr('id')) if not file_props: return jid = self._ft_get_from(iq_obj) file_props.error = -3 from gajim.common.connection_handlers_events import FileRequestErrorEvent app.nec.push_incoming_event(FileRequestErrorEvent(None, conn=self, jid=jid, file_props=file_props, error_msg='')) raise nbxmpp.NodeProcessed class ConnectionSocks5Bytestream(ConnectionBytestream): def send_success_connect_reply(self, streamhost): """ Send reply to the initiator of FT that we made a connection """ if not self.connection or self.connected < 2: return if streamhost is None: return None iq = nbxmpp.Iq(to=streamhost['initiator'], typ='result', frm=streamhost['target']) iq.setAttr('id', streamhost['id']) query = iq.setTag('query', namespace=nbxmpp.NS_BYTESTREAM) stream_tag = query.setTag('streamhost-used') stream_tag.setAttr('jid', streamhost['jid']) self.connection.send(iq) def stop_all_active_file_transfers(self, contact): """ Stop all active transfer to or from the given contact """ for file_props in FilesProp.getAllFileProp(): if is_transfer_stopped(file_props): continue receiver_jid = file_props.receiver if contact.get_full_jid() == receiver_jid: file_props.error = -5 self.remove_transfer(file_props) from gajim.common.connection_handlers_events import \ FileRequestErrorEvent app.nec.push_incoming_event(FileRequestErrorEvent(None, conn=self, jid=contact.jid, file_props=file_props, error_msg='')) sender_jid = file_props.sender if contact.get_full_jid() == sender_jid: file_props.error = -3 self.remove_transfer(file_props) def remove_all_transfers(self): """ Stop and remove all active connections from the socks5 pool """ for file_props in FilesProp.getAllFileProp(): self.remove_transfer(file_props, remove_from_list=False) def remove_transfer(self, file_props, remove_from_list=True): if file_props is None: return self.disconnect_transfer(file_props) sid = file_props.sid def disconnect_transfer(self, file_props): if file_props is None: return if file_props.hash_: app.socks5queue.remove_sender(file_props.hash_) if file_props.streamhosts: for host in file_props.streamhosts: if 'idx' in host and host['idx'] > 0: app.socks5queue.remove_receiver(host['idx']) app.socks5queue.remove_sender(host['idx']) def _send_socks5_info(self, file_props): """ Send iq for the present streamhosts and proxies """ if not self.connection or self.connected < 2: return receiver = file_props.receiver sender = file_props.sender sha_str = helpers.get_auth_sha(file_props.sid, sender, receiver) file_props.sha_str = sha_str port = app.config.get('file_transfers_port') listener = app.socks5queue.start_listener(port, sha_str, self._result_socks5_sid, file_props) if not listener: file_props.error = -5 from gajim.common.connection_handlers_events import FileRequestErrorEvent app.nec.push_incoming_event(FileRequestErrorEvent(None, conn=self, jid=receiver, file_props=file_props, error_msg='')) self._connect_error(file_props.sid, error='not-acceptable', error_type='modify') else: iq = nbxmpp.Iq(to=receiver, typ='set') file_props.request_id = 'id_' + file_props.sid iq.setID(file_props.request_id) query = iq.setTag('query', namespace=nbxmpp.NS_BYTESTREAM) query.setAttr('sid', file_props.sid) self._add_addiditional_streamhosts_to_query(query, file_props) self._add_local_ips_as_streamhosts_to_query(query, file_props) self._add_proxy_streamhosts_to_query(query, file_props) self._add_upnp_igd_as_streamhost_to_query(query, file_props, iq) # Upnp-igd is ascynchronous, so it will send the iq itself def _add_streamhosts_to_query(self, query, sender, port, hosts): for host in hosts: streamhost = nbxmpp.Node(tag='streamhost') query.addChild(node=streamhost) streamhost.setAttr('port', str(port)) streamhost.setAttr('host', host) streamhost.setAttr('jid', sender) def _add_local_ips_as_streamhosts_to_query(self, query, file_props): if not app.config.get_per('accounts', self.name, 'ft_send_local_ips'): return try: my_ips = [self.peerhost[0]] # The ip we're connected to server with # all IPs from local DNS for addr in socket.getaddrinfo(socket.gethostname(), None): if not addr[4][0] in my_ips and not addr[4][0].startswith('127') and not addr[4][0] == '::1': my_ips.append(addr[4][0]) sender = file_props.sender port = app.config.get('file_transfers_port') self._add_streamhosts_to_query(query, sender, port, my_ips) except socket.gaierror: from gajim.common.connection_handlers_events import InformationEvent app.nec.push_incoming_event( InformationEvent(None, dialog_name='wrong-host')), def _add_addiditional_streamhosts_to_query(self, query, file_props): sender = file_props.sender port = app.config.get('file_transfers_port') ft_add_hosts_to_send = app.config.get('ft_add_hosts_to_send') additional_hosts = [] if ft_add_hosts_to_send: additional_hosts = [e.strip() for e in ft_add_hosts_to_send.split(',')] else: additional_hosts = [] self._add_streamhosts_to_query(query, sender, port, additional_hosts) def _add_upnp_igd_as_streamhost_to_query(self, query, file_props, iq): if not app.HAVE_UPNP_IGD: self.connection.send(iq) return my_ip = self.peerhost[0] # check if we are connected with an IPv4 address try: socket.inet_aton(my_ip) except socket.error as e: self.connection.send(iq) return def ip_is_local(ip): if '.' not in ip: # it's an IPv6 return True ip_s = ip.split('.') ip_l = int(ip_s[0])<<24 | int(ip_s[1])<<16 | int(ip_s[2])<<8 | \ int(ip_s[3]) # 10/8 if ip_l & (255<<24) == 10<<24: return True # 172.16/12 if ip_l & (255<<24 | 240<<16) == (172<<24 | 16<<16): return True # 192.168 if ip_l & (255<<24 | 255<<16) == (192<<24 | 168<<16): return True return False if not ip_is_local(my_ip): self.connection.send(iq) return self.no_gupnp_reply_id = 0 def cleanup_gupnp(): if self.no_gupnp_reply_id: GLib.source_remove(self.no_gupnp_reply_id) self.no_gupnp_reply_id = 0 app.gupnp_igd.disconnect(self.ok_id) app.gupnp_igd.disconnect(self.fail_id) def ok(s, proto, ext_ip, re, ext_port, local_ip, local_port, desc): log.debug('Got GUPnP-IGD answer: external: %s:%s, internal: %s:%s', ext_ip, ext_port, local_ip, local_port) if local_port != app.config.get('file_transfers_port'): sender = file_props.sender receiver = file_props.receiver sha_str = helpers.get_auth_sha(file_props.sid, sender, receiver) listener = app.socks5queue.start_listener(local_port, sha_str, self._result_socks5_sid, file_props.sid) if listener: self._add_streamhosts_to_query(query, sender, ext_port, [ext_ip]) else: self._add_streamhosts_to_query(query, file_props.sender, ext_port, [ext_ip]) self.connection.send(iq) cleanup_gupnp() def fail(s, error, proto, ext_ip, local_ip, local_port, desc): log.debug('Got GUPnP-IGD error') self.connection.send(iq) cleanup_gupnp() def no_upnp_reply(): log.debug('Got not GUPnP-IGD answer') # stop trying to use it app.HAVE_UPNP_IGD = False self.no_gupnp_reply_id = 0 self.connection.send(iq) cleanup_gupnp() return False self.ok_id = app.gupnp_igd.connect('mapped-external-port', ok) self.fail_id = app.gupnp_igd.connect('error-mapping-port', fail) port = app.config.get('file_transfers_port') self.no_gupnp_reply_id = GLib.timeout_add_seconds(10, no_upnp_reply) app.gupnp_igd.add_port('TCP', 0, my_ip, port, 3600, 'Gajim file transfer') def _add_proxy_streamhosts_to_query(self, query, file_props): proxyhosts = self._get_file_transfer_proxies_from_config(file_props) if proxyhosts: file_props.proxy_receiver = file_props.receiver file_props.proxy_sender = file_props.sender file_props.proxyhosts = proxyhosts for proxyhost in proxyhosts: self._add_streamhosts_to_query(query, proxyhost['jid'], proxyhost['port'], [proxyhost['host']]) def _get_file_transfer_proxies_from_config(self, file_props): configured_proxies = app.config.get_per('accounts', self.name, 'file_transfer_proxies') shall_use_proxies = app.config.get_per('accounts', self.name, 'use_ft_proxies') if shall_use_proxies: proxyhost_dicts = [] proxies = [] if configured_proxies: proxies = [item.strip() for item in configured_proxies.split(',')] default_proxy = app.proxy65_manager.get_default_for_name(self.name) if default_proxy: # add/move default proxy at top of the others if default_proxy in proxies: proxies.remove(default_proxy) proxies.insert(0, default_proxy) for proxy in proxies: (host, _port, jid) = app.proxy65_manager.get_proxy(proxy, self.name) if not host: continue host_dict = { 'state': 0, 'target': file_props.receiver, 'id': file_props.sid, 'sid': file_props.sid, 'initiator': proxy, 'host': host, 'port': str(_port), 'jid': jid } proxyhost_dicts.append(host_dict) return proxyhost_dicts else: return [] def _result_socks5_sid(self, sid, hash_id): """ Store the result of SHA message from auth """ file_props = FilesProp.getFilePropBySid(sid) file_props.hash_ = hash_id return def _connect_error(self, sid, error, error_type, msg=None): """ Called when there is an error establishing BS connection, or when connection is rejected """ if not self.connection or self.connected < 2: return file_props = FilesProp.getFileProp(self.name, sid) if file_props is None: log.error('can not send iq error on failed transfer') return if file_props.type_ == 's': to = file_props.receiver else: to = file_props.sender iq = nbxmpp.Iq(to=to, typ='error') iq.setAttr('id', file_props.request_id) err = iq.setTag('error') err.setAttr('type', error_type) err.setTag(error, namespace=nbxmpp.NS_STANZAS) self.connection.send(iq) if msg: self.disconnect_transfer(file_props) file_props.error = -3 from gajim.common.connection_handlers_events import \ FileRequestErrorEvent app.nec.push_incoming_event(FileRequestErrorEvent(None, conn=self, jid=to, file_props=file_props, error_msg=msg)) def _proxy_auth_ok(self, proxy): """ Called after authentication to proxy server """ if not self.connection or self.connected < 2: return file_props = FilesProp.getFileProp(self.name, proxy['sid']) iq = nbxmpp.Iq(to=proxy['initiator'], typ='set') auth_id = "au_" + proxy['sid'] iq.setID(auth_id) query = iq.setTag('query', namespace=nbxmpp.NS_BYTESTREAM) query.setAttr('sid', proxy['sid']) activate = query.setTag('activate') activate.setData(file_props.proxy_receiver) iq.setID(auth_id) self.connection.send(iq) # register xmpppy handlers for bytestream and FT stanzas def _bytestreamErrorCB(self, con, iq_obj): id_ = iq_obj.getAttr('id') frm = helpers.get_full_jid_from_iq(iq_obj) query = iq_obj.getTag('query') app.proxy65_manager.error_cb(frm, query) jid = helpers.get_jid_from_iq(iq_obj) id_ = id_[3:] file_props = FilesProp.getFilePropBySid(id_) if not file_props: return file_props.error = -4 from gajim.common.connection_handlers_events import FileRequestErrorEvent app.nec.push_incoming_event(FileRequestErrorEvent(None, conn=self, jid=jid, file_props=file_props, error_msg='')) raise nbxmpp.NodeProcessed def _bytestreamSetCB(self, con, iq_obj): target = iq_obj.getAttr('to') id_ = iq_obj.getAttr('id') query = iq_obj.getTag('query') sid = query.getAttr('sid') file_props = FilesProp.getFileProp(self.name, sid) streamhosts = [] for item in query.getChildren(): if item.getName() == 'streamhost': host_dict = { 'state': 0, 'target': target, 'id': id_, 'sid': sid, 'initiator': self._ft_get_from(iq_obj) } for attr in item.getAttrs(): host_dict[attr] = item.getAttr(attr) if 'host' not in host_dict: continue if 'jid' not in host_dict: continue if 'port' not in host_dict: continue streamhosts.append(host_dict) file_props = FilesProp.getFilePropBySid(sid) if file_props is not None: if file_props.type_ == 's': # FIXME: remove fast xmlns # only psi do this if file_props.streamhosts: file_props.streamhosts.extend(streamhosts) else: file_props.streamhosts = streamhosts app.socks5queue.connect_to_hosts(self.name, sid, self.send_success_connect_reply, None) raise nbxmpp.NodeProcessed else: log.warning('Gajim got streamhosts for unknown transfer. Ignoring it.') raise nbxmpp.NodeProcessed file_props.streamhosts = streamhosts def _connection_error(sid): self._connect_error(sid, 'item-not-found', 'cancel', msg='Could not connect to given hosts') if file_props.type_ == 'r': app.socks5queue.connect_to_hosts(self.name, sid, self.send_success_connect_reply, _connection_error) raise nbxmpp.NodeProcessed def _ResultCB(self, con, iq_obj): # if we want to respect xep-0065 we have to check for proxy # activation result in any result iq real_id = iq_obj.getAttr('id') if not real_id.startswith('au_'): return frm = self._ft_get_from(iq_obj) id_ = real_id[3:] file_props = FilesProp.getFilePropByTransportSid(self.name, id_) if file_props.streamhost_used: for host in file_props.proxyhosts: if host['initiator'] == frm and 'idx' in host: app.socks5queue.activate_proxy(host['idx']) raise nbxmpp.NodeProcessed def _bytestreamResultCB(self, con, iq_obj): frm = self._ft_get_from(iq_obj) real_id = iq_obj.getAttr('id') query = iq_obj.getTag('query') app.proxy65_manager.resolve_result(frm, query) try: streamhost = query.getTag('streamhost-used') except Exception: # this bytestream result is not what we need pass id_ = real_id[3:] file_props = FilesProp.getFileProp(self.name, id_) if file_props is None: raise nbxmpp.NodeProcessed if streamhost is None: # proxy approves the activate query if real_id.startswith('au_'): if file_props.streamhost_used is False: raise nbxmpp.NodeProcessed if not file_props.proxyhosts: raise nbxmpp.NodeProcessed for host in file_props.proxyhosts: if host['initiator'] == frm and \ query.getAttr('sid') == file_props.sid: app.socks5queue.activate_proxy(host['idx']) break raise nbxmpp.NodeProcessed jid = self._ft_get_streamhost_jid_attr(streamhost) if file_props.streamhost_used is True: raise nbxmpp.NodeProcessed if real_id.startswith('au_'): if file_props.stopped: self.remove_transfer(file_props) else: app.socks5queue.send_file(file_props, self.name, 'server') raise nbxmpp.NodeProcessed proxy = None if file_props.proxyhosts: for proxyhost in file_props.proxyhosts: if proxyhost['jid'] == jid: proxy = proxyhost if file_props.stopped: self.remove_transfer(file_props) raise nbxmpp.NodeProcessed if proxy is not None: file_props.streamhost_used = True file_props.streamhosts.append(proxy) file_props.is_a_proxy = True idx = app.socks5queue.idx sender = Socks5SenderClient(app.idlequeue, idx, app.socks5queue, _sock=None, host=str(proxy['host']), port=int(proxy['port']), fingerprint=None, connected=False, file_props=file_props) sender.streamhost = proxy app.socks5queue.add_sockobj(self.name, sender) proxy['idx'] = sender.queue_idx app.socks5queue.on_success[file_props.sid] = self._proxy_auth_ok raise nbxmpp.NodeProcessed else: if file_props.stopped: self.remove_transfer(file_props) else: app.socks5queue.send_file(file_props, self.name, 'server') raise nbxmpp.NodeProcessed class ConnectionIBBytestream(ConnectionBytestream): def __init__(self): ConnectionBytestream.__init__(self) self._streams = {} def IBBIqHandler(self, conn, stanza): """ Handles streams state change. Used internally. """ typ = stanza.getType() log.debug('IBBIqHandler called typ->%s' % typ) if typ == 'set' and stanza.getTag('open'): self.StreamOpenHandler(conn, stanza) elif typ == 'set' and stanza.getTag('close'): self.StreamCloseHandler(conn, stanza) elif typ == 'set' and stanza.getTag('data'): sid = stanza.getTagAttr('data', 'sid') file_props = FilesProp.getFilePropByTransportSid(self.name, sid) if not file_props: conn.send(nbxmpp.Error(stanza, nbxmpp.ERR_ITEM_NOT_FOUND)) elif file_props.connected and self.IBBMessageHandler(conn, stanza): reply = stanza.buildReply('result') reply.delChild('data') conn.send(reply) elif not file_props.connected: log.debug('Received IQ for closed filetransfer, IQ dropped') elif typ == 'error': app.socks5queue.error_cb() else: conn.send(nbxmpp.Error(stanza, nbxmpp.ERR_BAD_REQUEST)) raise nbxmpp.NodeProcessed def StreamOpenHandler(self, conn, stanza): """ Handles opening of new incoming stream. Used internally. """ err = None sid = stanza.getTagAttr('open', 'sid') blocksize = stanza.getTagAttr('open', 'block-size') log.debug('StreamOpenHandler called sid->%s blocksize->%s' % (sid, blocksize)) file_props = FilesProp.getFilePropByTransportSid(self.name, sid) try: blocksize = int(blocksize) except: err = nbxmpp.ERR_BAD_REQUEST if not sid or not blocksize: err = nbxmpp.ERR_BAD_REQUEST elif not file_props: err = nbxmpp.ERR_UNEXPECTED_REQUEST if err: rep = nbxmpp.Error(stanza, err) else: log.debug("Opening stream: id %s, block-size %s" % (sid, blocksize)) rep = nbxmpp.Protocol('iq', stanza.getFrom(), 'result', stanza.getTo(), {'id': stanza.getID()}) file_props.block_size = blocksize file_props.direction = '<' file_props.seq = 0 file_props.received_len = 0 file_props.last_time = time.time() file_props.error = 0 file_props.paused = False file_props.connected = True file_props.completed = False file_props.disconnect_cb = None file_props.continue_cb = None file_props.syn_id = stanza.getID() file_props.fp = open(file_props.file_name, 'wb') conn.send(rep) def CloseIBBStream(self, file_props): file_props.connected = False file_props.fp.close() file_props.stopped = True to = file_props.receiver if file_props.direction == '<': to = file_props.sender self.connection.send( nbxmpp.Protocol('iq', to, 'set', payload=[nbxmpp.Node(nbxmpp.NS_IBB + ' close', {'sid':file_props.transport_sid})])) if file_props.completed: app.socks5queue.complete_transfer_cb(self.name, file_props) elif file_props.session_type == 'jingle': peerjid = \ file_props.receiver if file_props.type_ == 's' else file_props.sender session = self.get_jingle_session(peerjid, file_props.sid, 'file') # According to the xep, the initiator also cancels the jingle session # if there are no more files to send using IBB if session.weinitiate: session.cancel_session() def OpenStream(self, sid, to, fp, blocksize=4096): """ Start new stream. You should provide stream id 'sid', the endpoind jid 'to', the file object containing info for send 'fp'. Also the desired blocksize can be specified. Take into account that recommended stanza size is 4k and IBB uses base64 encoding that increases size of data by 1/3. """ file_props = FilesProp.getFilePropBySid(sid) file_props.direction = '>' file_props.block_size = blocksize file_props.fp = fp file_props.seq = 0 file_props.error = 0 file_props.paused = False file_props.received_len = 0 file_props.last_time = time.time() file_props.connected = True file_props.completed = False file_props.disconnect_cb = None file_props.continue_cb = None syn = nbxmpp.Protocol('iq', to, 'set', payload=[nbxmpp.Node( nbxmpp.NS_IBB + ' open', {'sid': file_props.transport_sid, 'block-size': blocksize, 'stanza': 'iq'})]) self.connection.send(syn) file_props.syn_id = syn.getID() return file_props def SendHandler(self, file_props): """ Send next portion of data if it is time to do it. Used internally. """ log.debug('SendHandler called') if file_props.completed: self.CloseIBBStream(file_props) if file_props.paused: return if not file_props.connected: #TODO: Reply with out of order error return chunk = file_props.fp.read(file_props.block_size) if chunk: datanode = nbxmpp.Node(nbxmpp.NS_IBB + ' data', { 'sid': file_props.transport_sid, 'seq': file_props.seq}, base64.b64encode(chunk).decode('ascii')) file_props.seq += 1 file_props.started = True if file_props.seq == 65536: file_props.seq = 0 file_props.syn_id = self.connection.send( nbxmpp.Protocol(name='iq', to=file_props.receiver, typ='set', payload=[datanode])) current_time = time.time() file_props.elapsed_time += current_time - file_props.last_time file_props.last_time = current_time file_props.received_len += len(chunk) if file_props.size == file_props.received_len: file_props.completed = True app.socks5queue.progress_transfer_cb(self.name, file_props) else: log.debug('Nothing to read, but file not completed') def IBBMessageHandler(self, conn, stanza): """ Receive next portion of incoming datastream and store it write it to temporary file. Used internally. """ sid = stanza.getTagAttr('data', 'sid') seq = stanza.getTagAttr('data', 'seq') data = stanza.getTagData('data') log.debug('ReceiveHandler called sid->%s seq->%s' % (sid, seq)) try: seq = int(seq) data = base64.b64decode(data.encode('utf-8')) except Exception: seq = '' data = b'' err = None file_props = FilesProp.getFilePropByTransportSid(self.name, sid) if file_props is None: err = nbxmpp.ERR_ITEM_NOT_FOUND else: if not data: err = nbxmpp.ERR_BAD_REQUEST elif seq != file_props.seq: err = nbxmpp.ERR_UNEXPECTED_REQUEST else: log.debug('Successfull receive sid->%s %s+%s bytes' % (sid, file_props.fp.tell(), len(data))) file_props.seq += 1 file_props.started = True file_props.fp.write(data) current_time = time.time() file_props.elapsed_time += current_time - file_props.last_time file_props.last_time = current_time file_props.received_len += len(data) app.socks5queue.progress_transfer_cb(self.name, file_props) if file_props.received_len >= file_props.size: file_props.completed = True if err: log.debug('Error on receive: %s' % err) conn.send(nbxmpp.Error(nbxmpp.Iq(to=stanza.getFrom(), frm=stanza.getTo(), payload=[nbxmpp.Node(nbxmpp.NS_IBB + ' close')]), err, reply=0)) else: return True def StreamCloseHandler(self, conn, stanza): """ Handle stream closure due to all data transmitted. Raise xmpppy event specifying successfull data receive. """ sid = stanza.getTagAttr('close', 'sid') log.debug('StreamCloseHandler called sid->%s' % sid) # look in sending files file_props = FilesProp.getFilePropByTransportSid(self.name, sid) if file_props: reply = stanza.buildReply('result') reply.delChild('close') conn.send(reply) # look in receiving files file_props.fp.close() file_props.completed = file_props.received_len >= file_props.size if not file_props.completed: file_props.error = -1 app.socks5queue.complete_transfer_cb(self.name, file_props) else: conn.send(nbxmpp.Error(stanza, nbxmpp.ERR_ITEM_NOT_FOUND)) def IBBAllIqHandler(self, conn, stanza): """ Handle remote side reply about if it agree or not to receive our datastream. Used internally. Raises xmpppy event specfiying if the data transfer is agreed upon. """ syn_id = stanza.getID() log.debug('IBBAllIqHandler called syn_id->%s' % syn_id) for file_props in FilesProp.getAllFileProp(): if not file_props.direction or not file_props.connected: # It's socks5 bytestream # Or we closed the IBB stream continue if file_props.syn_id == syn_id: if stanza.getType() == 'error': if file_props.direction[0] == '<': conn.Event('IBB', 'ERROR ON RECEIVE', file_props) else: conn.Event('IBB', 'ERROR ON SEND', file_props) elif stanza.getType() == 'result': self.SendHandler(file_props) break class ConnectionSocks5BytestreamZeroconf(ConnectionSocks5Bytestream): def _ft_get_from(self, iq_obj): return iq_obj.getFrom() def _ft_get_our_jid(self): return app.get_jid_from_account(self.name) def _ft_get_receiver_jid(self, file_props): return file_props.receiver.jid def _ft_get_streamhost_jid_attr(self, streamhost): return streamhost.getAttr('jid') gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/protocol/caps.py000066400000000000000000000113031326020644600264210ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/protocol/caps.py ## ## Copyright (C) 2009 Stephan Erb ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## """ Module containing the network portion of XEP-115 (Entity Capabilities) """ import logging log = logging.getLogger('gajim.c.p.caps') from gajim.common import app from gajim.common import ged from gajim.common.connection_handlers_events import CapsPresenceReceivedEvent, \ CapsDiscoReceivedEvent, CapsReceivedEvent class ConnectionCaps(object): def __init__(self, account, capscache, client_caps_factory): self._account = account self._capscache = capscache self._create_suitable_client_caps = client_caps_factory app.nec.register_incoming_event(CapsPresenceReceivedEvent) app.nec.register_incoming_event(CapsReceivedEvent) app.ged.register_event_handler('caps-presence-received', ged.GUI1, self._nec_caps_presence_received) app.ged.register_event_handler('agent-info-received', ged.GUI1, self._nec_agent_info_received_caps) def cleanup(self): app.ged.remove_event_handler('caps-presence-received', ged.GUI1, self._nec_caps_presence_received) app.ged.remove_event_handler('agent-info-received', ged.GUI1, self._nec_agent_info_received_caps) def caps_change_account_name(self, new_name): self._account = new_name def _nec_caps_presence_received(self, obj): if obj.conn.name != self._account: return obj.client_caps = self._create_suitable_client_caps(obj.node, obj.caps_hash, obj.hash_method, obj.fjid) if obj.show == 'offline' and obj.client_caps._hash_method == 'no': self._capscache.forget_caps(obj.client_caps) obj.client_caps = self._create_suitable_client_caps(obj.node, obj.caps_hash, obj.hash_method) else: self._capscache.query_client_of_jid_if_unknown(self, obj.fjid, obj.client_caps) self._update_client_caps_of_contact(obj) def _update_client_caps_of_contact(self, obj): contact = self._get_contact_or_gc_contact_for_jid(obj.fjid) if contact: contact.client_caps = obj.client_caps else: log.info('Received Caps from unknown contact %s' % obj.fjid) def _get_contact_or_gc_contact_for_jid(self, jid): contact = app.contacts.get_contact_from_full_jid(self._account, jid) if contact is None: room_jid, nick = app.get_room_and_nick_from_fjid(jid) contact = app.contacts.get_gc_contact(self._account, room_jid, nick) return contact def _nec_agent_info_received_caps(self, obj): """ callback to update our caps cache with queried information after we have retrieved an unknown caps hash and issued a disco """ if obj.conn.name != self._account: return contact = self._get_contact_or_gc_contact_for_jid(obj.fjid) if not contact: log.info('Received Disco from unknown contact %s' % obj.fjid) return lookup = contact.client_caps.get_cache_lookup_strategy() cache_item = lookup(self._capscache) if cache_item.is_valid(): # we already know that the hash is fine and have already cached # the identities and features return else: validate = contact.client_caps.get_hash_validation_strategy() hash_is_valid = validate(obj.identities, obj.features, obj.data) if hash_is_valid: cache_item.set_and_store(obj.identities, obj.features) else: node = caps_hash = hash_method = None contact.client_caps = self._create_suitable_client_caps( obj.node, caps_hash, hash_method) log.info('Computed and retrieved caps hash differ.' + 'Ignoring caps of contact %s' % contact.get_full_jid()) app.nec.push_incoming_event(CapsDiscoReceivedEvent(None, conn=self, fjid=obj.fjid, jid=obj.jid, resource=obj.resource, client_caps=contact.client_caps)) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/proxy65_manager.py000066400000000000000000000411361326020644600266670ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/proxy65_manager.py ## ## Copyright (C) 2006 Dimitur Kirov ## Jean-Marie Traissard ## Copyright (C) 2007-2014 Yann Leboulanger ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import socket import struct import errno import logging log = logging.getLogger('gajim.c.proxy65_manager') import nbxmpp from gajim.common import app from gajim.common import helpers from gajim.common.socks5 import Socks5 from nbxmpp.idlequeue import IdleObject from gajim.common.file_props import FilesProp S_INITIAL = 0 S_STARTED = 1 S_RESOLVED = 2 S_ACTIVATED = 3 S_FINISHED = 4 CONNECT_TIMEOUT = 20 class Proxy65Manager: """ Keep records for file transfer proxies. Each time account establishes a connection to its server call proxy65manger.resolve(proxy) for every proxy that is convigured within the account. The class takes care to resolve and test each proxy only once """ def __init__(self, idlequeue): # dict {proxy: proxy properties} self.idlequeue = idlequeue self.proxies = {} # dict {account: proxy} default proxy for account self.default_proxies = {} def resolve(self, proxy, connection, sender_jid, default=None, testit=True): """ Start if testit=False, Gajim won't try to resolve it """ if proxy in self.proxies: resolver = self.proxies[proxy] else: # proxy is being ressolved for the first time resolver = ProxyResolver(proxy, sender_jid, testit) self.proxies[proxy] = resolver resolver.add_connection(connection) if default: # add this proxy as default for account self.default_proxies[default] = proxy def disconnect(self, connection): for resolver in self.proxies.values(): resolver.disconnect(connection) def resolve_result(self, proxy, query): if proxy not in self.proxies: return jid = None for item in query.getChildren(): if item.getName() == 'streamhost': host = item.getAttr('host') jid = item.getAttr('jid') port = item.getAttr('port') try: port = int(port) except (ValueError, TypeError) as e: port = 1080 if not host or not jid: self.proxies[proxy]._on_connect_failure() self.proxies[proxy].resolve_result(host, port, jid) # we can have only one streamhost raise nbxmpp.NodeProcessed def error_cb(self, proxy, query): sid = query.getAttr('sid') for resolver in self.proxies.values(): if resolver.sid == sid: resolver.keep_conf() break def get_default_for_name(self, account): if account in self.default_proxies: return self.default_proxies[account] def get_proxy(self, proxy, account): if proxy in self.proxies: resolver = self.proxies[proxy] if resolver.state == S_FINISHED: return (resolver.host, resolver.port, resolver.jid) return (None, 0, None) class ProxyResolver: def resolve_result(self, host, port, jid): """ Test if host has a real proxy65 listening on port """ self.host = str(host) self.port = int(port) self.jid = str(jid) if not self.testit: self.state = S_FINISHED return self.state = S_INITIAL log.info('start resolving %s:%s' % (self.host, self.port)) self.receiver_tester = ReceiverTester(self.host, self.port, self.jid, self.sid, self.sender_jid, self._on_receiver_success, self._on_connect_failure) self.receiver_tester.connect() def _on_receiver_success(self): log.debug('Receiver successfully connected %s:%s' % (self.host, self.port)) self.host_tester = HostTester(self.host, self.port, self.jid, self.sid, self.sender_jid, self._on_connect_success, self._on_connect_failure) self.host_tester.connect() def _on_connect_success(self): log.debug('Host successfully connected %s:%s' % (self.host, self.port)) iq = nbxmpp.Protocol(name='iq', to=self.jid, typ='set') query = iq.setTag('query') query.setNamespace(nbxmpp.NS_BYTESTREAM) query.setAttr('sid', self.sid) activate = query.setTag('activate') activate.setData('test@gajim.org/test2') if self.active_connection: log.debug('Activating bytestream on %s:%s' % (self.host, self.port)) self.active_connection.SendAndCallForResponse(iq, self._result_received) self.state = S_ACTIVATED else: self.state = S_INITIAL def _result_received(self, data): self.disconnect(self.active_connection) if data.getType() == 'result': self.keep_conf() else: self._on_connect_failure() def keep_conf(self): log.debug('Bytestream activated %s:%s' % (self.host, self.port)) self.state = S_FINISHED def _on_connect_failure(self): log.debug('Connection failed with %s:%s' % (self.host, self.port)) self.state = S_FINISHED self.host = None self.port = 0 self.jid = None def disconnect(self, connection): if self.host_tester: self.host_tester.disconnect() FilesProp.deleteFileProp(self.host_tester.file_props) self.host_tester = None if self.receiver_tester: self.receiver_tester.disconnect() FilesProp.deleteFileProp(self.receiver_tester.file_props) self.receiver_tester = None try: self.connections.remove(connection) except ValueError: pass if connection == self.active_connection: self.active_connection = None if self.state != S_FINISHED: self.state = S_INITIAL self.try_next_connection() def try_next_connection(self): """ Try to resolve proxy with the next possible connection """ if self.connections: connection = self.connections.pop(0) self.start_resolve(connection) def add_connection(self, connection): """ Add a new connection in case the first fails """ self.connections.append(connection) if self.state == S_INITIAL: self.start_resolve(connection) def start_resolve(self, connection): """ Request network address from proxy """ self.state = S_STARTED self.active_connection = connection iq = nbxmpp.Protocol(name='iq', to=self.proxy, typ='get') query = iq.setTag('query') query.setNamespace(nbxmpp.NS_BYTESTREAM) connection.send(iq) def __init__(self, proxy, sender_jid, testit): """ if testit is False, don't test it, only get IP/port """ self.proxy = proxy self.state = S_INITIAL self.active_connection = None self.connections = [] self.host_tester = None self.receiver_tester = None self.jid = None self.host = None self.port = None self.sid = helpers.get_random_string_16() self.sender_jid = sender_jid self.testit = testit class HostTester(Socks5, IdleObject): """ Fake proxy tester """ def __init__(self, host, port, jid, sid, sender_jid, on_success, on_failure): """ Try to establish and auth to proxy at (host, port) Calls on_success, or on_failure according to the result. """ self.host = host self.port = port self.jid = jid self.on_success = on_success self.on_failure = on_failure self._sock = None self.file_props = FilesProp.getNewFileProp(jid, sid) self.file_props.is_a_proxy = True self.file_props.proxy_sender = sender_jid self.file_props.proxy_receiver = 'test@gajim.org/test2' Socks5.__init__(self, app.idlequeue, host, port, None, None, None) self.sid = sid def connect(self): """ Create the socket and plug it to the idlequeue """ if self.host is None: self.on_failure() return None self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self._sock.setblocking(False) self.fd = self._sock.fileno() self.state = 0 # about to be connected app.idlequeue.plug_idle(self, True, False) self.do_connect() self.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) return None def read_timeout(self): self.idlequeue.remove_timeout(self.fd) self.pollend() def pollend(self): self.disconnect() self.on_failure() def pollout(self): self.idlequeue.remove_timeout(self.fd) if self.state == 0: self.do_connect() return elif self.state == 1: # send initially: version and auth types data = self._get_auth_buff() self.send_raw(data) else: return self.state += 1 # unplug and plug for reading app.idlequeue.plug_idle(self, False, True) app.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) def pollin(self): self.idlequeue.remove_timeout(self.fd) if self.state == 2: self.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) # begin negotiation. on success 'address' != 0 buff = self.receive() if buff == b'': # end connection self.pollend() return # read auth response if buff is None or len(buff) != 2: return None version, method = struct.unpack('!BB', buff[:2]) if version != 0x05 or method == 0xff: self.pollend() return data = self._get_request_buff(self._get_sha1_auth()) self.send_raw(data) self.state += 1 log.debug('Host authenticating to %s:%s' % (self.host, self.port)) elif self.state == 3: log.debug('Host authenticated to %s:%s' % (self.host, self.port)) self.on_success() self.disconnect() self.state += 1 else: assert False, 'unexpected state: %d' % self.state def do_connect(self): try: self._sock.connect((self.host, self.port)) self._sock.setblocking(False) log.debug('Host Connecting to %s:%s' % (self.host, self.port)) self._send = self._sock.send self._recv = self._sock.recv except Exception as ee: errnum = ee.errno # 56 is for freebsd if errnum in (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK): # still trying to connect return # win32 needs this if errnum not in (0, 10056, errno.EISCONN): # connection failed self.on_failure() return # socket is already connected self._sock.setblocking(False) self._send = self._sock.send self._recv = self._sock.recv self.buff = b'' self.state = 1 # connected log.debug('Host connected to %s:%s' % (self.host, self.port)) self.idlequeue.plug_idle(self, True, False) return class ReceiverTester(Socks5, IdleObject): """ Fake proxy tester """ def __init__(self, host, port, jid, sid, sender_jid, on_success, on_failure): """ Try to establish and auth to proxy at (host, port) Call on_success, or on_failure according to the result. """ self.host = host self.port = port self.jid = jid self.on_success = on_success self.on_failure = on_failure self._sock = None self.file_props = FilesProp.getNewFileProp(jid, sid) self.file_props.is_a_proxy = True self.file_props.proxy_sender = sender_jid self.file_props.proxy_receiver = 'test@gajim.org/test2' Socks5.__init__(self, app.idlequeue, host, port, None, None, None) self.sid = sid def connect(self): """ Create the socket and plug it to the idlequeue """ if self.host is None: self.on_failure() return None self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self._sock.setblocking(False) self.fd = self._sock.fileno() self.state = 0 # about to be connected app.idlequeue.plug_idle(self, True, False) self.do_connect() self.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) return None def read_timeout(self): self.idlequeue.remove_timeout(self.fd) self.pollend() def pollend(self): self.disconnect() self.on_failure() def pollout(self): self.idlequeue.remove_timeout(self.fd) if self.state == 0: self.do_connect() return elif self.state == 1: # send initially: version and auth types data = self._get_auth_buff() self.send_raw(data) else: return self.state += 1 # unplug and plug for reading app.idlequeue.plug_idle(self, False, True) app.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) def pollin(self): self.idlequeue.remove_timeout(self.fd) if self.state in (2, 3): self.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) # begin negotiation. on success 'address' != 0 buff = self.receive() if buff == b'': # end connection self.pollend() return if self.state == 2: # read auth response if buff is None or len(buff) != 2: return None version, method = struct.unpack('!BB', buff[:2]) if version != 0x05 or method == 0xff: self.pollend() return log.debug('Receiver authenticating to %s:%s' % (self.host, self.port)) data = self._get_request_buff(self._get_sha1_auth()) self.send_raw(data) self.state += 1 elif self.state == 3: # read connect response if buff is None or len(buff) < 2: return None version, reply = struct.unpack('!BB', buff[:2]) if version != 0x05 or reply != 0x00: self.pollend() return log.debug('Receiver authenticated to %s:%s' % (self.host, self.port)) self.on_success() self.disconnect() self.state += 1 else: assert False, 'unexpected state: %d' % self.state def do_connect(self): try: self._sock.setblocking(False) self._sock.connect((self.host, self.port)) log.debug('Receiver Connecting to %s:%s' % (self.host, self.port)) self._send = self._sock.send self._recv = self._sock.recv except Exception as ee: errnum = ee.errno # 56 is for freebsd if errnum in (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK): # still trying to connect return # win32 needs this if errnum not in (0, 10056, errno.EISCONN): # connection failed self.on_failure() return # socket is already connected self._sock.setblocking(False) self._send = self._sock.send self._recv = self._sock.recv self.buff = '' self.state = 1 # connected log.debug('Receiver connected to %s:%s' % (self.host, self.port)) self.idlequeue.plug_idle(self, True, False) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/pubsub.py000066400000000000000000000251461326020644600251440ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/pubsub.py ## ## Copyright (C) 2006 Tomasz Melcer ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2007 Jean-Marie Traissard ## Copyright (C) 2008 Stephan Erb ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import base64 import binascii import nbxmpp from gajim.common import app #TODO: Doesn't work #from common.connection_handlers import PEP_CONFIG PEP_CONFIG = 'pep_config' from gajim.common import ged from gajim.common.connection_handlers_events import PubsubReceivedEvent from gajim.common.connection_handlers_events import PubsubBookmarksReceivedEvent from gajim.common.exceptions import StanzaMalformed import logging log = logging.getLogger('gajim.c.pubsub') class ConnectionPubSub: def __init__(self): self.__callbacks = {} app.nec.register_incoming_event(PubsubBookmarksReceivedEvent) app.ged.register_event_handler('pubsub-bookmarks-received', ged.CORE, self._nec_pubsub_bookmarks_received) def cleanup(self): app.ged.remove_event_handler('pubsub-bookmarks-received', ged.CORE, self._nec_pubsub_bookmarks_received) def send_pb_subscription_query(self, jid, cb, *args, **kwargs): if not self.connection or self.connected < 2: return query = nbxmpp.Iq('get', to=jid) pb = query.addChild('pubsub', namespace=nbxmpp.NS_PUBSUB) pb.addChild('subscriptions') id_ = self.connection.send(query) self.__callbacks[id_] = (cb, args, kwargs) def send_pb_subscribe(self, jid, node, cb, *args, **kwargs): if not self.connection or self.connected < 2: return our_jid = app.get_jid_from_account(self.name) query = nbxmpp.Iq('set', to=jid) pb = query.addChild('pubsub', namespace=nbxmpp.NS_PUBSUB) pb.addChild('subscribe', {'node': node, 'jid': our_jid}) id_ = self.connection.send(query) self.__callbacks[id_] = (cb, args, kwargs) def send_pb_unsubscribe(self, jid, node, cb, *args, **kwargs): if not self.connection or self.connected < 2: return our_jid = app.get_jid_from_account(self.name) query = nbxmpp.Iq('set', to=jid) pb = query.addChild('pubsub', namespace=nbxmpp.NS_PUBSUB) pb.addChild('unsubscribe', {'node': node, 'jid': our_jid}) id_ = self.connection.send(query) self.__callbacks[id_] = (cb, args, kwargs) def send_pb_publish(self, jid, node, item, id_=None, options=None): """ Publish item to a node """ if not self.connection or self.connected < 2: return query = nbxmpp.Iq('set', to=jid) e = query.addChild('pubsub', namespace=nbxmpp.NS_PUBSUB) p = e.addChild('publish', {'node': node}) attrs = {} if id_: attrs = {'id': id_} p.addChild('item', attrs, [item]) if options: p = e.addChild('publish-options') p.addChild(node=options) self.connection.send(query) @staticmethod def get_pb_retrieve_iq(jid, node, item_id=None): """ Get IQ to query items from a node """ query = nbxmpp.Iq('get', to=jid) r = query.addChild('pubsub', namespace=nbxmpp.NS_PUBSUB) r = r.addChild('items', {'node': node}) if item_id is not None: r.addChild('item', {'id': item_id}) return query def send_pb_retrieve(self, jid, node, item_id=None, cb=None, *args, **kwargs): """ Get items from a node """ if not self.connection or self.connected < 2: return query = self.get_pb_retrieve_iq(jid, node, item_id) id_ = self.connection.send(query) if cb: self.__callbacks[id_] = (cb, args, kwargs) def get_pubsub_avatar(self, jid, node, item_id): query = self.get_pb_retrieve_iq(jid, node, item_id) self.connection.SendAndCallForResponse( query, self._nec_pubsub_avatar_received, {'jid': jid}) def send_pb_retract(self, jid, node, id_): """ Delete item from a node """ if not self.connection or self.connected < 2: return query = nbxmpp.Iq('set', to=jid) r = query.addChild('pubsub', namespace=nbxmpp.NS_PUBSUB) r = r.addChild('retract', {'node': node, 'notify': '1'}) r = r.addChild('item', {'id': id_}) self.connection.send(query) def send_pb_purge(self, jid, node): """ Purge node: Remove all items """ if not self.connection or self.connected < 2: return query = nbxmpp.Iq('set', to=jid) d = query.addChild('pubsub', namespace=nbxmpp.NS_PUBSUB_OWNER) d = d.addChild('purge', {'node': node}) self.connection.send(query) def send_pb_delete(self, jid, node, on_ok=None, on_fail=None): """ Delete node """ if not self.connection or self.connected < 2: return query = nbxmpp.Iq('set', to=jid) d = query.addChild('pubsub', namespace=nbxmpp.NS_PUBSUB_OWNER) d = d.addChild('delete', {'node': node}) def response(con, resp, jid, node): if resp.getType() == 'result' and on_ok: on_ok(jid, node) elif on_fail: msg = resp.getErrorMsg() on_fail(jid, node, msg) self.connection.SendAndCallForResponse(query, response, {'jid': jid, 'node': node}) def send_pb_create(self, jid, node, configure=False, configure_form=None): """ Create a new node """ if not self.connection or self.connected < 2: return query = nbxmpp.Iq('set', to=jid) c = query.addChild('pubsub', namespace=nbxmpp.NS_PUBSUB) c = c.addChild('create', {'node': node}) if configure: conf = c.addChild('configure') if configure_form is not None: conf.addChild(node=configure_form) self.connection.send(query) def send_pb_configure(self, jid, node, form): if not self.connection or self.connected < 2: return query = nbxmpp.Iq('set', to=jid) c = query.addChild('pubsub', namespace=nbxmpp.NS_PUBSUB_OWNER) c = c.addChild('configure', {'node': node}) c.addChild(node=form) self.connection.send(query) def _PubSubCB(self, conn, stanza): log.debug('_PubsubCB') try: cb, args, kwargs = self.__callbacks.pop(stanza.getID()) cb(conn, stanza, *args, **kwargs) except Exception: pass app.nec.push_incoming_event(PubsubReceivedEvent(None, conn=self, stanza=stanza)) def _nec_pubsub_bookmarks_received(self, obj): if obj.conn.name != self.name: return app.log('bookmarks').info('Received Bookmarks (PubSub)') bm_jids = [b['jid'] for b in self.bookmarks] for bm in obj.bookmarks: if bm['jid'] not in bm_jids: self.bookmarks.append(bm) # We got bookmarks from pubsub, now get those from xml to merge them self.get_bookmarks(storage_type='xml') def _validate_avatar_node(self, stanza): jid = stanza.getFrom() if jid is None: jid = self.get_own_jid().getStripped() else: jid = jid.getStripped() if nbxmpp.isErrorNode(stanza): raise StanzaMalformed(stanza.getErrorMsg()) pubsub_node = stanza.getTag('pubsub') if pubsub_node is None: raise StanzaMalformed('No pubsub node', stanza) items_node = pubsub_node.getTag('items') if items_node is None: raise StanzaMalformed('No items node', stanza) if items_node.getAttr('node') != 'urn:xmpp:avatar:data': raise StanzaMalformed('Wrong namespace', stanza) item = items_node.getTag('item') if item is None: raise StanzaMalformed('No item node', stanza) sha = item.getAttr('id') data_tag = item.getTag('data', namespace='urn:xmpp:avatar:data') if sha is None or data_tag is None: raise StanzaMalformed('No id attr or data node found', stanza) data = data_tag.getData() if data is None: raise StanzaMalformed('Data node empty', stanza) data = base64.b64decode(data.encode('utf-8')) return jid, sha, data def _nec_pubsub_avatar_received(self, conn, stanza, jid): try: jid, sha, data = self._validate_avatar_node(stanza) except (StanzaMalformed, binascii.Error) as error: app.log('avatar').warning( 'Error loading Avatar (Pubsub): %s %s', jid, error) return app.log('avatar').info( 'Received Avatar (Pubsub): %s %s', jid, sha) app.interface.save_avatar(data) if self.get_own_jid().bareMatch(jid): app.config.set_per('accounts', self.name, 'avatar_sha', sha) else: own_jid = self.get_own_jid().getStripped() app.logger.set_avatar_sha(own_jid, jid, sha) app.contacts.set_avatar(self.name, jid, sha) app.interface.update_avatar(self.name, jid) def _PubSubErrorCB(self, conn, stanza): log.debug('_PubsubErrorCB') pubsub = stanza.getTag('pubsub') if not pubsub: return items = pubsub.getTag('items') if not items: return if items.getAttr('node') == 'storage:bookmarks': # Receiving bookmarks from pubsub failed, so take them from xml self.get_bookmarks(storage_type='xml') def request_pb_configuration(self, jid, node): if not self.connection or self.connected < 2: return query = nbxmpp.Iq('get', to=jid) e = query.addChild('pubsub', namespace=nbxmpp.NS_PUBSUB_OWNER) e = e.addChild('configure', {'node': node}) id_ = self.connection.getAnID() query.setID(id_) self.awaiting_answers[id_] = (PEP_CONFIG,) self.connection.send(query) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/resolver.py000066400000000000000000000125131326020644600254770ustar00rootroot00000000000000## common/resolver.py ## ## Copyright (C) 2006 Dimitur Kirov ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import sys import logging import functools from gi.repository import Gio, GLib log = logging.getLogger('gajim.c.resolver') def get_resolver(): return GioResolver() class CommonResolver(): def __init__(self): # dict {"host+type" : list of records} self.resolved_hosts = {} # dict {"host+type" : list of callbacks} self.handlers = {} def resolve(self, host, on_ready, type_='srv'): host = host.lower() log.debug('resolve %s type=%s' % (host, type_)) assert(type_ in ['srv', 'txt']) if not host: # empty host, return empty list of srv records on_ready([]) return if host + type_ in self.resolved_hosts: # host is already resolved, return cached values log.debug('%s already resolved: %s' % (host, self.resolved_hosts[host + type_])) on_ready(host, self.resolved_hosts[host + type_]) return if host + type_ in self.handlers: # host is about to be resolved by another connection, # attach our callback log.debug('already resolving %s' % host) self.handlers[host + type_].append(on_ready) else: # host has never been resolved, start now log.debug('Starting to resolve %s using %s' % (host, self)) self.handlers[host + type_] = [on_ready] self.start_resolve(host, type_) def _on_ready(self, host, type_, result_list): # practically it is impossible to be the opposite, but who knows :) host = host.lower() log.debug('Resolving result for %s: %s' % (host, result_list)) if host + type_ not in self.resolved_hosts: self.resolved_hosts[host + type_] = result_list if host + type_ in self.handlers: for callback in self.handlers[host + type_]: callback(host, result_list) del(self.handlers[host + type_]) def start_resolve(self, host, type_): pass class GioResolver(CommonResolver): """ Asynchronous resolver using GIO. process() method has to be called in order to proceed the pending requests. """ def __init__(self): super().__init__() self.gio_resolver = Gio.Resolver.get_default() def start_resolve(self, host, type_): if type_ == 'txt': callback = functools.partial(self._on_ready_txt, host) type_ = Gio.ResolverRecordType.TXT else: callback = functools.partial(self._on_ready_srv, host) type_ = Gio.ResolverRecordType.SRV resq = self.gio_resolver.lookup_records_async(host, type_, None, callback) def _on_ready_srv(self, host, source_object, result): try: variant_results = source_object.lookup_records_finish(result) except GLib.Error as e: if e.domain == 'g-resolver-error-quark': result_list = [] log.info("Could not resolve host: %s", e.message) else: raise else: result_list = [ { 'weight': weight, 'prio': prio, 'port': port, 'host': host, } for prio, weight, port, host in variant_results ] super()._on_ready(host, 'srv', result_list) def _on_ready_txt(self, host, source_object, result): try: variant_results = source_object.lookup_records_finish(result) except GLib.Error as e: if e.domain == 'g-resolver-error-quark': result_list = [] log.warning("Could not resolve host: %s", e.message) else: raise else: result_list = [res[0][0] for res in variant_results] super()._on_ready(host, 'txt', result_list) # below lines is on how to use API and assist in testing if __name__ == '__main__': from gi.repository import Gtk resolver = get_resolver() def clicked(widget): global resolver host = text_view.get_text() def on_result(host, result_array): print('Result:\n' + repr(result_array)) resolver.resolve(host, on_result) win = Gtk.Window() win.set_border_width(6) win.connect('remove', Gtk.main_quit) text_view = Gtk.Entry() text_view.set_text('_xmpp-client._tcp.jabber.org') hbox = Gtk.HBox() hbox.set_spacing(3) but = Gtk.Button(' Lookup SRV ') hbox.pack_start(text_view, 5, True, 0) hbox.pack_start(but, 0, True, 0) but.connect('clicked', clicked) win.add(hbox) win.show_all() Gtk.main() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/rst_xhtml_generator.py000066400000000000000000000147231326020644600277350ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/rst_xhtml_generator.py ## ## Copyright (C) 2006 Santiago Gala ## Nikos Kouremenos ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2007 Jean-Marie Traissard ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## try: from docutils import io from docutils.core import Publisher from docutils.parsers.rst import roles from docutils import nodes, utils from docutils.parsers.rst.roles import set_classes except ImportError: print("Requires docutils 0.4 for set_classes to be available") def create_xhtml(text): return None else: def pos_int_validator(text): """ Validates that text can be evaluated as a positive integer """ result = int(text) if result < 0: raise ValueError("Error: value '%(text)s' " "must be a positive integer") return result def generate_uri_role( role_name, aliases, anchor_text, base_url, interpret_url, validator): """ Create and register a uri based "interpreted role" Those are similar to the RFC, and PEP ones, and take role_name: name that will be registered aliases: list of alternate names anchor_text: text that will be used, together with the role base_url: base url for the link interpret_url: this, modulo the validated text, will be added to it validator: should return the validated text, or raise ValueError """ def uri_reference_role(role, rawtext, text, lineno, inliner, options=None, content=None): if options is None: options = {} try: valid_text = validator(text) except ValueError as e: msg = inliner.reporter.error( e.message % dict(text=text), line=lineno) prb = inliner.problematic(rawtext, rawtext, msg) return [prb], [msg] ref = base_url + interpret_url % valid_text set_classes(options) node = nodes.reference(rawtext, anchor_text + utils.unescape(text), refuri=ref, **options) return [node], [] uri_reference_role.__doc__ = """Role to make handy references to URIs. Use as :%(role_name)s:`71` (or any of %(aliases)s). It will use %(base_url)s+%(interpret_url)s validator should throw a ValueError, containing optionally a %%(text)s format, if the interpreted text is not valid. """ % locals() roles.register_canonical_role(role_name, uri_reference_role) from docutils.parsers.rst.languages import en en.roles[role_name] = role_name for alias in aliases: en.roles[alias] = role_name generate_uri_role('xep-reference', ('jep', 'xep'), 'XEP #', 'http://www.xmpp.org/extensions/', 'xep-%04d.html', pos_int_validator) generate_uri_role('gajim-ticket-reference', ('ticket', 'gtrack'), 'Gajim Ticket #', 'https://dev.gajim.org/gajim/gajim/issues/', '%d', pos_int_validator) class HTMLGenerator: """ Really simple HTMLGenerator starting from publish_parts It reuses the docutils.core.Publisher class, which means it is *not* threadsafe. """ def __init__(self, settings_spec=None, settings_overrides=None, config_section='general'): if settings_overrides is None: settings_overrides = {'report_level': 5, 'halt_level': 5} self.pub = Publisher(reader=None, parser=None, writer=None, settings=None, source_class=io.StringInput, destination_class=io.StringOutput) self.pub.set_components(reader_name='standalone', parser_name='restructuredtext', writer_name='html') # hack: JEP-0071 does not allow HTML char entities, so we hack our way # out of it. # — == u"\u2014" # a setting to only emit charater entities in the writer would be nice # FIXME: several   are emitted, and they are explicitly forbidden # in the JEP #   == u"\u00a0" self.pub.writer.translator_class.attribution_formats['dash'] = ( '\u2014', '') self.pub.process_programmatic_settings(settings_spec, settings_overrides, config_section) def create_xhtml(self, text, destination=None, destination_path=None, enable_exit_status=None): """ Create xhtml for a fragment of IM dialog. We can use the source_name to store info about the message """ self.pub.set_source(text, None) self.pub.set_destination(destination, destination_path) output = self.pub.publish(enable_exit_status=enable_exit_status) # kludge until we can get docutils to stop generating (rare)   # entities return '\u00a0'.join(self.pub.writer.parts['fragment'].strip().split( ' ')) Generator = HTMLGenerator() def create_xhtml(text): return Generator.create_xhtml(text) if __name__ == '__main__': print("test 1\n" + Generator.create_xhtml(""" test:: >>> print 1 1 *I* like it. It is for :JEP:`71` this `` should trigger`` should trigger the   problem. """)) print("test 2\n" + Generator.create_xhtml(""" *test1 test2_ """)) print("test 3\n" + Generator.create_xhtml(""":ticket:`316` implements :xep:`71`""")) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/sleepy.py000066400000000000000000000104301326020644600251330ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/sleepy.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2007 Jean-Marie Traissard ## Copyright (C) 2008 Mateusz Biliński ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gajim.common import app import os import logging log = logging.getLogger('gajim.c.sleepy') STATE_UNKNOWN = 'OS probably not supported' STATE_XA = 'extended away' STATE_AWAY = 'away' STATE_AWAKE = 'awake' SUPPORTED = True try: if os.name == 'nt': import ctypes GetTickCount = ctypes.windll.kernel32.GetTickCount GetLastInputInfo = ctypes.windll.user32.GetLastInputInfo class LASTINPUTINFO(ctypes.Structure): _fields_ = [('cbSize', ctypes.c_uint), ('dwTime', ctypes.c_uint)] lastInputInfo = LASTINPUTINFO() lastInputInfo.cbSize = ctypes.sizeof(lastInputInfo) # one or more of these may not be supported before XP. OpenInputDesktop = ctypes.windll.user32.OpenInputDesktop CloseDesktop = ctypes.windll.user32.CloseDesktop SystemParametersInfo = ctypes.windll.user32.SystemParametersInfoW else: # unix from gajim.common import idle idle.xss_available except Exception: log.debug('Unable to load idle module') SUPPORTED = False class SleepyWindows: def __init__(self, away_interval = 60, xa_interval = 120): self.away_interval = away_interval self.xa_interval = xa_interval self.state = STATE_AWAKE # assume we are awake def getIdleSec(self): GetLastInputInfo(ctypes.byref(lastInputInfo)) idleDelta = float(GetTickCount() - lastInputInfo.dwTime) / 1000 return idleDelta def poll(self): """ Check to see if we should change state """ if not SUPPORTED: return False # screen saver, in windows >= XP saver_runing = ctypes.c_int(0) # 0x72 is SPI_GETSCREENSAVERRUNNING if SystemParametersInfo(0x72, 0, ctypes.byref(saver_runing), 0) and \ saver_runing.value: self.state = STATE_XA return True desk = OpenInputDesktop(0, False, 0) if not desk: # Screen locked self.state = STATE_XA return True CloseDesktop(desk) idleTime = self.getIdleSec() # xa is stronger than away so check for xa first if idleTime > self.xa_interval: self.state = STATE_XA elif idleTime > self.away_interval: self.state = STATE_AWAY else: self.state = STATE_AWAKE return True def getState(self): return self.state def setState(self, val): self.state = val class SleepyUnix: def __init__(self, away_interval = 60, xa_interval = 120): global SUPPORTED self.away_interval = away_interval self.xa_interval = xa_interval self.state = STATE_AWAKE # assume we are awake def getIdleSec(self): return idle.getIdleSec() def poll(self): """ Check to see if we should change state """ if not SUPPORTED: return False idleTime = self.getIdleSec() # xa is stronger than away so check for xa first if idleTime > self.xa_interval: self.state = STATE_XA elif idleTime > self.away_interval: self.state = STATE_AWAY else: self.state = STATE_AWAKE return True def getState(self): return self.state def setState(self, val): self.state = val if os.name == 'nt': Sleepy = SleepyWindows else: Sleepy = SleepyUnix gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/socks5.py000066400000000000000000001571161326020644600250560ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/socks5.py ## ## Copyright (C) 2005-2006 Dimitur Kirov ## Nikos Kouremenos ## Copyright (C) 2005-2014 Yann Leboulanger ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import socket import struct import hashlib import os import time from errno import EWOULDBLOCK from errno import ENOBUFS from errno import EINTR from errno import EISCONN from errno import EINPROGRESS from errno import EAFNOSUPPORT from nbxmpp.idlequeue import IdleObject from gajim.common.file_props import FilesProp from gajim.common import app from gajim.common import jingle_xtls if jingle_xtls.PYOPENSSL_PRESENT: import OpenSSL import logging log = logging.getLogger('gajim.c.socks5') MAX_BUFF_LEN = 65536 # after foo seconds without activity label transfer as 'stalled' STALLED_TIMEOUT = 10 # after foo seconds of waiting to connect, disconnect from # streamhost and try next one CONNECT_TIMEOUT = 30 # nothing received for the last foo seconds - stop transfer # if it is 0, then transfer will wait forever READ_TIMEOUT = 180 # nothing sent for the last foo seconds - stop transfer # if it is 0, then transfer will wait forever SEND_TIMEOUT = 180 class SocksQueue: """ Queue for all file requests objects """ def __init__(self, idlequeue, complete_transfer_cb=None, progress_transfer_cb=None, error_cb=None): self.connected = 0 self.readers = {} self.senders = {} self.idx = 1 self.listener = None self.sha_handlers = {} # handle all io events in the global idle queue, instead of processing # each foo seconds self.idlequeue = idlequeue self.complete_transfer_cb = complete_transfer_cb self.progress_transfer_cb = progress_transfer_cb self.error_cb = error_cb self.on_success = {} # {id: cb} self.on_failure = {} # {id: cb} def start_listener(self, port, sha_str, sha_handler, file_props, fingerprint=None, typ='sender'): """ Start waiting for incomming connections on (host, port) and do a socks5 authentication using sid for generated SHA """ log.debug('Start listening for socks5 connection') sid = file_props.sid self.sha_handlers[sha_str] = (sha_handler, sid) if self.listener is None or self.listener.connections == []: self.listener = Socks5Listener(self.idlequeue, port, file_props, fingerprint=fingerprint) self.listener.queue = self self.listener.bind() else: # There is already a listener, we update the file's information # on the new connection. self.listener.file_props = file_props self.connected += 1 return self.listener def send_success_reply(self, file_props, streamhost): if file_props.streamhost_used == True: for proxy in file_props.proxyhosts: if proxy['host'] == streamhost['host']: self.on_success[file_props.transport_sid](proxy) return 1 return 0 for host in file_props.streamhosts: if streamhost['state'] == 1: return 0 streamhost['state'] = 1 self.on_success[file_props.transport_sid](streamhost) return 1 def connect_to_hosts(self, account, transport_sid, on_success=None, on_failure=None, fingerprint=None, receiving=True): self.on_success[transport_sid] = on_success self.on_failure[transport_sid] = on_failure file_props = FilesProp.getFilePropByTransportSid(account, transport_sid) file_props.failure_cb = on_failure streamhosts_to_test = [] # Remove local IPs to not connect to ourself for streamhost in file_props.streamhosts: if streamhost['host'] == '127.0.0.1' or streamhost['host'] == '::1': continue streamhosts_to_test.append(streamhost) if not streamhosts_to_test: on_failure(file_props.transport_sid) # add streamhosts to the queue for streamhost in streamhosts_to_test: if 'type' in streamhost and streamhost['type'] == 'proxy': fp = None else: fp = fingerprint if receiving: if 'candidate_id' in streamhost: log.debug('Trying to connect as receiver to cid ' + \ streamhost['candidate_id']) else: log.debug('Trying to connect as receiver to jid ' + \ streamhost['jid']) file_props.type_ = 'r' socks5obj = Socks5ReceiverClient(self.idlequeue, streamhost, transport_sid, file_props, fingerprint=fp) self.add_sockobj(account, socks5obj) else: if 'candidate_id' in streamhost: log.debug('Trying to connect as sender to cid ' + \ streamhost['candidate_id']) else: log.debug('Trying to connect as sender to jid ' + \ streamhost['jid']) if file_props.sha_str: idx = file_props.sha_str else: idx = self.idx self.idx = self.idx + 1 file_props.type_ = 's' if 'type' in streamhost and streamhost['type'] == 'proxy': file_props.is_a_proxy = True file_props.proxy_sender = streamhost['target'] file_props.proxy_receiver = streamhost['initiator'] socks5obj = Socks5SenderClient(self.idlequeue, idx, self, _sock=None,host=str(streamhost['host']), port=int(streamhost['port']),fingerprint=fp, connected=False, file_props=file_props, initiator=streamhost['initiator'], target=streamhost['target']) socks5obj.streamhost = streamhost self.add_sockobj(account, socks5obj) streamhost['idx'] = socks5obj.queue_idx def _socket_connected(self, streamhost, file_props): """ Called when there is a host connected to one of the senders's streamhosts. Stop other attempts for connections """ if 'candidate_id' in streamhost: log.debug('Connected to cid ' + streamhost['candidate_id']) else: log.debug('Connected to jid ' + streamhost['jid']) for host in file_props.streamhosts: if host != streamhost and 'idx' in host: if host['state'] == 1: # remove current if file_props.type_ == 's': self.remove_sender(streamhost['idx'], False) else: self.remove_receiver(streamhost['idx']) return # set state -2, meaning that this streamhost is stopped, # but it may be connectected later if host['state'] >= 0: if file_props.type_ == 's': self.remove_sender(host['idx'], False) else: self.remove_receiver(host['idx']) host['idx'] = -1 host['state'] = -2 def reconnect_client(self, client, streamhost): """ Check the state of all streamhosts and if all has failed, then emit connection failure cb. If there are some which are still not connected try to establish connection to one of them """ self.idlequeue.remove_timeout(client.fd) self.idlequeue.unplug_idle(client.fd) file_props = client.file_props streamhost['state'] = -1 # boolean, indicates that there are hosts, which are not tested yet unused_hosts = False for host in file_props.streamhosts: if 'idx' in host: if host['state'] >= 0: return elif host['state'] == -2: unused_hosts = True if unused_hosts: for host in file_props.streamhosts: if host['state'] == -2: host['state'] = 0 # FIXME: make the sender reconnect also client = Socks5ReceiverClient(self.idlequeue, host, client.sid, file_props) self.add_sockobj(client.account, client) host['idx'] = client.queue_idx # we still have chances to connect return if file_props.received_len == 0: # there are no other streamhosts and transfer hasn't started self._connection_refused(streamhost, file_props, client.queue_idx) else: # transfer stopped, it is most likely stopped from sender client.disconnect() file_props.error = -1 self.process_result(-1, client) def _connection_refused(self, streamhost, file_props, idx): """ Called when we loose connection during transfer """ if 'candidate_id' in streamhost: log.debug('Connection refused to cid ' + streamhost['candidate_id']) else: log.debug('Connection refused to jid ' + streamhost['jid']) if file_props is None: return streamhost['state'] = -1 # FIXME: should only the receiver be remove? what if we are sending? self.remove_receiver(idx, False) for host in file_props.streamhosts: if host['state'] != -1: return self.readers = {} # failure_cb exists - this means that it has never been called if file_props.failure_cb: file_props.failure_cb(file_props.transport_sid) file_props.failure_cb = None def add_sockobj(self, account, sockobj): """ Add new file a sockobj type receiver or sender, and use it to connect to server """ if sockobj.file_props.type_ == 'r': self._add(sockobj, self.readers, sockobj.file_props, self.idx) else: self._add(sockobj, self.senders, sockobj.file_props, self.idx) sockobj.queue_idx = self.idx sockobj.queue = self sockobj.account = account self.idx += 1 result = sockobj.connect() self.connected += 1 if result is not None: result = sockobj.main() self.process_result(result, sockobj) return 1 return None def _add(self, sockobj, sockobjects, file_props, hash_): ''' Adds the sockobj to the current list of sockobjects ''' keys = (file_props.transport_sid, file_props.name, hash_) sockobjects[keys] = sockobj def result_sha(self, sha_str, idx): if sha_str in self.sha_handlers: props = self.sha_handlers[sha_str] props[0](props[1], idx) def activate_proxy(self, idx): if not self.isHashInSockObjs(self.senders, idx): return for key in self.senders.keys(): if idx in key: sender = self.senders[key] if sender.file_props.type_ != 's': return sender.state = 6 if sender.connected: sender.file_props.error = 0 sender.file_props.disconnect_cb = sender.disconnect sender.file_props.started = True sender.file_props.completed = False sender.file_props.paused = False sender.file_props.stalled = False sender.file_props.elapsed_time = 0 sender.file_props.last_time = time.time() sender.file_props.received_len = 0 sender.pauses = 0 # start sending file to proxy self.idlequeue.set_read_timeout(sender.fd, STALLED_TIMEOUT) self.idlequeue.plug_idle(sender, True, False) result = sender.write_next() self.process_result(result, sender) def send_file(self, file_props, account, mode): for key in self.senders.keys(): if file_props.name in key and file_props.transport_sid in key \ and self.senders[key].mode == mode: log.info('socks5: sending file') sender = self.senders[key] file_props.streamhost_used = True sender.account = account sender.file_props = file_props result = sender.send_file() self.process_result(result, sender) def isHashInSockObjs(self, sockobjs, hash): ''' It tells wether there is a particular hash in sockobjs or not ''' for key in sockobjs: if hash in key: return True return False def on_connection_accepted(self, sock, listener): sock_hash = sock.__hash__() if listener.file_props.type_ == 's' and \ not self.isHashInSockObjs(self.senders, sock_hash): sockobj = Socks5SenderServer(self.idlequeue, sock_hash, self, sock[0], sock[1][0], sock[1][1], fingerprint=None, file_props=listener.file_props) self._add(sockobj, self.senders, listener.file_props, sock_hash) # Start waiting for data self.idlequeue.plug_idle(sockobj, False, True) self.connected += 1 if listener.file_props.type_ == 'r' and \ not self.isHashInSockObjs(self.readers, sock_hash): sh = {} sh['host'] = sock[1][0] sh['port'] = sock[1][1] sh['initiator'] = None sh['target'] = None sockobj = Socks5ReceiverServer(idlequeue=self.idlequeue, streamhost=sh,transport_sid=None, file_props=listener.file_props, fingerprint=None) self._add(sockobj, self.readers, listener.file_props, sock_hash) sockobj.set_sock(sock[0]) sockobj.queue = self self.connected += 1 def process_result(self, result, actor): """ Take appropriate actions upon the result: [ 0, - 1 ] complete/end transfer [ > 0 ] send progress message [ None ] do nothing """ if result is None: return if result in (0, -1) and self.complete_transfer_cb is not None: account = actor.account if account is None and actor.file_props.tt_account: account = actor.file_props.tt_account self.complete_transfer_cb(account, actor.file_props) elif self.progress_transfer_cb is not None: self.progress_transfer_cb(actor.account, actor.file_props) def remove_receiver_by_key(self, key, do_disconnect=True): reader = self.readers[key] self.idlequeue.unplug_idle(reader.fd) self.idlequeue.remove_timeout(reader.fd) if do_disconnect: reader.disconnect() else: if reader.streamhost is not None: reader.streamhost['state'] = -1 del(self.readers[key]) def remove_sender_by_key(self, key, do_disconnect=True): sender = self.senders[key] if do_disconnect: sender.disconnect() self.idlequeue.unplug_idle(sender.fd) self.idlequeue.remove_timeout(sender.fd) del(self.senders[key]) if self.connected > 0: self.connected -= 1 def remove_receiver(self, idx, do_disconnect=True, remove_all=False): """ Remove reciver from the list and decrease the number of active connections with 1 """ if idx != -1: for key in list(self.readers.keys()): if idx in key: self.remove_receiver_by_key(key, do_disconnect=do_disconnect) if not remove_all: break def remove_sender(self, idx, do_disconnect=True, remove_all=False): """ Remove sender from the list of senders and decrease the number of active connections with 1 """ if idx != -1: for key in list(self.senders.keys()): if idx in key: self.remove_sender_by_key(key, do_disconnect=do_disconnect) if not remove_all: break if len(self.senders) == 0 and self.listener is not None: self.listener.disconnect() self.listener = None self.connected -= 1 def remove_by_mode(self, transport_sid, mode, do_disconnect=True): for (key, sock) in self.senders.copy().items(): if key[0] == transport_sid and sock.mode == mode: self.remove_sender_by_key(key) for (key, sock) in self.readers.copy().items(): if key[0] == transport_sid and sock.mode == mode: self.remove_receiver_by_key(key) def remove_server(self, transport_sid, do_disconnect=True): self.remove_by_mode(transport_sid, 'server') def remove_client(self, transport_sid, do_disconnect=True): self.remove_by_mode(transport_sid, 'client') def remove_other_servers(self, host_to_keep): for (key, sock) in self.senders.copy().items(): if sock.host != host_to_keep and sock.mode == 'server': self.remove_sender_by_key(key) class Socks5(object): def __init__(self, idlequeue, host, port, initiator, target, sid): if host is not None: try: self.host = host self.ais = socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_STREAM) except socket.gaierror: self.ais = None self.idlequeue = idlequeue self.fd = -1 self.port = port self.initiator = initiator self.target = target self.sid = sid self._sock = None self.account = None self.state = 0 # not connected self.pauses = 0 self.size = 0 self.remaining_buff = b'' self.file = None self.connected = False self.mode = '' self.ssl_cert = None self.ssl_errnum = 0 def _is_connected(self): if self.state < 5: return False return True def ssl_verify_cb(self, ssl_conn, cert, error_num, depth, return_code): if depth == 0: self.ssl_cert = cert self.ssl_errnum = error_num return True def connect(self): """ Create the socket and plug it to the idlequeue """ if self.ais is None: return None for ai in self.ais: try: self._sock = socket.socket(*ai[:3]) if self.fingerprint is not None: if self.file_props.type_ == 's': remote_jid = app.get_jid_without_resource( self.file_props.receiver) else: remote_jid = app.get_jid_without_resource( self.file_props.sender) self._sock = OpenSSL.SSL.Connection( jingle_xtls.get_context('client', verify_cb=self.ssl_verify_cb, remote_jid=remote_jid), self._sock) # this will not block the GUI self._sock.setblocking(False) self._server = ai[4] break except socket.error as e: if e.errno == EINPROGRESS: break # for all other errors, we try other addresses continue self.fd = self._sock.fileno() self.state = 0 # about to be connected self.idlequeue.plug_idle(self, True, False) self.do_connect() self.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) return None def do_connect(self): try: self._sock.connect(self._server) self._send=self._sock.send self._recv=self._sock.recv except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError) as e: pass except Exception as ee: errnum = ee.errno self.connect_timeout += 1 if errnum == 111 or self.connect_timeout > 1000: self.queue._connection_refused(self.streamhost, self.file_props, self.queue_idx) self.connected = False return None # win32 needs this elif errnum not in (10056, EISCONN) or self.state != 0: return None else: # socket is already connected self._sock.setblocking(False) self._send=self._sock.send self._recv=self._sock.recv self.buff = '' self.connected = True self.file_props.connected = True self.file_props.disconnect_cb = self.disconnect self.file_props.paused = False self.state = 1 # connected # stop all others connections to sender's streamhosts self.queue._socket_connected(self.streamhost, self.file_props) self.idlequeue.plug_idle(self, True, False) return 1 # we are connected def read_timeout(self): self.idlequeue.remove_timeout(self.fd) if self.state > 5: # no activity for foo seconds if self.file_props.stalled == False: self.file_props.stalled = True self.queue.process_result(-1, self) if not self.file_props.received_len: self.file_props.received_len = 0 if SEND_TIMEOUT > 0: self.idlequeue.set_read_timeout(self.fd, SEND_TIMEOUT) else: # stop transfer, there is no error code for this self.pollend() else: if self.mode == 'client': self.queue.reconnect_client(self, self.streamhost) def open_file_for_reading(self): if self.file is None: try: self.file = open(self.file_props.file_name, 'rb') if self.file_props.offset: self.size = self.file_props.offset self.file.seek(self.size) self.file_props.received_len = self.size except IOError as e: self.close_file() raise IOError(str(e)) def close_file(self): # Close file we're sending from if self.file: if not self.file.closed: try: self.file.close() except Exception: pass self.file = None # Close file we're receiving into if self.file_props.fd and self.state >= 7: try: self.file_props.fd.close() except Exception: pass def get_fd(self): """ Test if file is already open and return its fd, or just open the file and return the fd """ if self.file_props.fd: fd = self.file_props.fd else: offset = 0 opt = 'wb' if self.file_props.offset: offset = self.file_props.offset opt = 'ab' fd = open(self.file_props.file_name, opt) self.file_props.fd = fd self.file_props.elapsed_time = 0 self.file_props.last_time = time.time() self.file_props.received_len = offset return fd def rem_fd(self, fd): if self.file_props.fd: self.file_props.fd = None try: fd.close() except Exception: pass def receive(self): """ Read small chunks of data. Call owner's disconnected() method if appropriate """ received = b'' try: add = self._recv(64) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, OpenSSL.SSL.WantX509LookupError) as e: log.info('SSL rehandshake request : ' + repr(e)) raise e except Exception: add = b'' received += add if len(add) == 0: self.disconnect() return add def send_raw(self, raw_data): """ Write raw outgoing data """ try: self._send(raw_data) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, OpenSSL.SSL.WantX509LookupError) as e: log.info('SSL rehandshake request :' + repr(e)) raise e except Exception: self.disconnect() return len(raw_data) def write_next(self): if self.remaining_buff != b'': buff = self.remaining_buff else: try: self.open_file_for_reading() except IOError: self.state = 8 # end connection self.disconnect() self.file_props.error = -7 # unable to read from file return -1 buff = self.file.read(MAX_BUFF_LEN) if len(buff) > 0: lenn = 0 try: lenn = self._send(buff) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, OpenSSL.SSL.WantX509LookupError) as e: log.info('SSL rehandshake request :' + repr(e)) raise e except Exception as e: if e.errno not in (EINTR, ENOBUFS, EWOULDBLOCK): # peer stopped reading self.state = 8 # end connection self.disconnect() self.file_props.error = -1 return -1 self.size += lenn current_time = time.time() self.file_props.elapsed_time += current_time - \ self.file_props.last_time self.file_props.last_time = current_time self.file_props.received_len = self.size if self.size >= self.file_props.size: self.state = 8 # end connection self.file_props.error = 0 self.disconnect() return -1 if lenn != len(buff): self.remaining_buff = buff[lenn:] else: self.remaining_buff = b'' self.state = 7 # continue to write in the socket if lenn == 0: return None self.file_props.stalled = False return lenn else: self.state = 8 # end connection self.disconnect() return -1 def get_file_contents(self, timeout): """ Read file contents from socket and write them to file """ if self.file_props is None or not self.file_props.file_name: self.file_props.error = -2 return None fd = None if self.remaining_buff != b'': try: fd = self.get_fd() except IOError: self.disconnect() self.file_props.error = -6 # file system error return 0 fd.write(self.remaining_buff) lenn = len(self.remaining_buff) current_time = time.time() self.file_props.elapsed_time += current_time - \ self.file_props.last_time self.file_props.last_time = current_time self.file_props.received_len += lenn self.remaining_buff = b'' if self.file_props.received_len == self.file_props.size: self.rem_fd(fd) self.disconnect() self.file_props.error = 0 self.file_props.completed = True return 0 else: try: fd = self.get_fd() except IOError: self.disconnect() self.file_props.error = -6 # file system error return 0 try: buff = self._recv(MAX_BUFF_LEN) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, OpenSSL.SSL.WantX509LookupError) as e: log.info('SSL rehandshake request :' + repr(e)) raise e except Exception: buff = b'' current_time = time.time() self.file_props.elapsed_time += current_time - \ self.file_props.last_time self.file_props.last_time = current_time self.file_props.received_len += len(buff) if len(buff) == 0: # Transfer stopped somehow: # reset, paused or network error self.rem_fd(fd) self.disconnect() self.file_props.error = -1 return 0 try: fd.write(buff) except IOError: self.rem_fd(fd) self.disconnect() self.file_props.error = -6 # file system error return 0 if self.file_props.received_len >= self.file_props.size: # transfer completed self.rem_fd(fd) self.disconnect() self.file_props.error = 0 self.file_props.completed = True return 0 # return number of read bytes. It can be used in progressbar if fd is not None: self.file_props.stalled = False if fd is None and self.file_props.stalled is False: return None if self.file_props.received_len: if self.file_props.received_len != 0: return self.file_props.received_len return None def disconnect(self): """ Close open descriptors and remover socket descr. from idleque """ # be sure that we don't leave open file self.close_file() self.idlequeue.remove_timeout(self.fd) self.idlequeue.unplug_idle(self.fd) if self.mode == 'server' and self.queue.listener: try: self.queue.listener.connections.remove(self._sock) except ValueError: pass # Not in list if self.queue.listener.connections == []: self.queue.listener.disconnect() try: if isinstance(self._sock, OpenSSL.SSL.Connection): self._sock.shutdown() else: self._sock.shutdown(socket.SHUT_RDWR) self._sock.close() except Exception: # socket is already closed pass self.connected = False self.fd = -1 self.state = -1 def _get_auth_buff(self): """ Message, that we support 1 one auth mechanism: the 'no auth' mechanism """ return struct.pack('!BBB', 0x05, 0x01, 0x00) def _parse_auth_buff(self, buff): """ Parse the initial message and create a list of auth mechanisms """ if buff[0] != 5: return None num_auth = buff[1] return list(buff[2:2+num_auth]) def _get_auth_response(self): """ Socks version(5), number of extra auth methods (we send 0x00 - no auth) """ return struct.pack('!BB', 0x05, 0x00) def _get_connect_buff(self): """ Connect request by domain name """ buff = struct.pack('!BBBBB%dsBB' % len(self.host), 0x05, 0x01, 0x00, 0x03, len(self.host), self.host.encode('utf-8'), self.port >> 8, self.port & 0xff) return buff def _get_request_buff(self, msg, command = 0x01): """ Connect request by domain name, sid sha, instead of domain name (jep 0096) """ if isinstance(msg, str): msg = msg.encode('utf-8') buff = struct.pack('!BBBBB%dsBB' % len(msg), 0x05, command, 0x00, 0x03, len(msg), msg, 0, 0) return buff def _parse_request_buff(self, buff): try: # don't trust on what comes from the outside req_type, host_type, = struct.unpack('!xBxB', buff[:4]) if host_type == 0x01: host_arr = struct.unpack('!iiii', buff[4:8]) host, = '.'.join(str(s) for s in host_arr) host_len = len(host) elif host_type == 0x03: host_len = buff[4] host, = struct.unpack('!%ds' % host_len, buff[5:5 + host_len]) portlen = len(buff[host_len + 5:]) if portlen == 1: port, = struct.unpack('!B', buff[host_len + 5]) elif portlen == 2: port, = struct.unpack('!H', buff[host_len + 5:]) # file data, comes with auth message (Gaim bug) else: port, = struct.unpack('!H', buff[host_len + 5: host_len + 7]) self.remaining_buff = buff[host_len + 7:] except Exception: return (None, None, None) return (req_type, host, port) def read_connect(self): """ Connect response: version, auth method """ try: buff = self._recv().decode('utf-8') except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, OpenSSL.SSL.WantX509LookupError) as e: log.info("SSL rehandshake request : " + repr(e)) raise e try: version, method = struct.unpack('!BB', buff) except Exception: version, method = None, None if version != 0x05 or method == 0xff: self.disconnect() def continue_paused_transfer(self): if self.state < 5: return if self.file_props.type_ == 'r': self.idlequeue.plug_idle(self, False, True) else: self.idlequeue.plug_idle(self, True, False) def _get_sha1_auth(self): """ Get sha of sid + Initiator jid + Target jid """ if self.file_props.is_a_proxy: return hashlib.sha1(('%s%s%s' % (self.sid, self.file_props.proxy_sender, self.file_props.proxy_receiver)).\ encode('utf-8')).hexdigest() return hashlib.sha1(('%s%s%s' % (self.sid, self.initiator, self.target)).encode('utf-8')).hexdigest() class Socks5Sender(IdleObject): """ Class for sending file to socket over socks5 """ def __init__(self, idlequeue, sock_hash, parent, _sock, host=None, port=None, fingerprint = None, connected=True, file_props=None): self.fingerprint = fingerprint self.queue_idx = sock_hash self.queue = parent self.file_props = file_props self.proxy = False self._sock = _sock if _sock is not None: if self.fingerprint is not None and not isinstance(self._sock, OpenSSL.SSL.Connection): self._sock = OpenSSL.SSL.Connection( jingle_xtls.get_context('server'), _sock) else: self._sock.setblocking(False) self.fd = _sock.fileno() self._recv = _sock.recv self._send = _sock.send self.connected = connected self.state = 1 # waiting for first bytes self.connect_timeout = 0 self.file_props.error = 0 self.file_props.disconnect_cb = self.disconnect self.file_props.started = True self.file_props.completed = False self.file_props.paused = False self.file_props.continue_cb = self.continue_paused_transfer self.file_props.stalled = False self.file_props.connected = True self.file_props.elapsed_time = 0 self.file_props.last_time = time.time() self.file_props.received_len = 0 def start_transfer(self): """ Send the file """ return self.write_next() def set_connection_sock(self, _sock): self._sock = _sock if self.fingerprint is not None: self._sock = OpenSSL.SSL.Connection( jingle_xtls.get_context('client'), _sock) else: self._sock.setblocking(False) self.fd = _sock.fileno() self._recv = _sock.recv self._send = _sock.send self.connected = True self.state = 1 # waiting for first bytes self.file_props = None # start waiting for data self.idlequeue.plug_idle(self, False, True) def send_file(self): """ Start sending the file over verified connection """ self.pauses = 0 self.state = 7 # plug for writing self.idlequeue.plug_idle(self, True, False) return self.write_next() # initial for nl byte def disconnect(self, cb=True): """ Close the socket """ # close connection and remove us from the queue Socks5.disconnect(self) if self.file_props is not None: self.file_props.connected = False self.file_props.disconnect_cb = None if self.queue is not None: self.queue.remove_sender(self.queue_idx, False) class Socks5Receiver(IdleObject): def __init__(self, idlequeue, streamhost, sid, file_props = None, fingerprint=None): """ fingerprint: fingerprint of certificates we shall use, set to None if TLS connection not desired """ self.queue_idx = -1 self.streamhost = streamhost self.queue = None self.fingerprint = fingerprint self.connect_timeout = 0 self.connected = False self.pauses = 0 self.sid = sid self.file_props = file_props self.file_props.disconnect_cb = self.disconnect self.file_props.error = 0 self.file_props.started = True self.file_props.completed = False self.file_props.paused = False self.file_props.continue_cb = self.continue_paused_transfer self.file_props.stalled = False self.file_props.received_len = 0 def receive_file(self): """ Start receiving the file over verified connection """ if self.file_props.started: return self.file_props.error = 0 self.file_props.disconnect_cb = self.disconnect self.file_props.started = True self.file_props.completed = False self.file_props.paused = False self.file_props.continue_cb = self.continue_paused_transfer self.file_props.stalled = False self.file_props.connected = True self.file_props.elapsed_time = 0 self.file_props.last_time = time.time() self.file_props.received_len = 0 self.pauses = 0 self.state = 7 # plug for reading self.idlequeue.plug_idle(self, False, True) return self.get_file_contents(0) # initial for nl byte def start_transfer(self): """ Receive the file """ return self.get_file_contents(0) def set_sock(self, _sock): self._sock = _sock self._sock.setblocking(False) self.fd = _sock.fileno() self._recv = _sock.recv self._send = _sock.send self.connected = True self.state = 1 # waiting for first bytes # start waiting for data self.idlequeue.plug_idle(self, False, True) def disconnect(self, cb=True): """ Close the socket. Remove self from queue if cb is True """ # close connection Socks5.disconnect(self) if cb is True: self.file_props.disconnect_cb = None if self.queue is not None: self.queue.remove_receiver(self.queue_idx, False) class Socks5Server(Socks5): def __init__(self, idlequeue, host, port, initiator, target, sid): Socks5.__init__(self, idlequeue, host, port, initiator, target, sid) self.mode = 'server' def main(self): """ Initial requests for verifying the connection """ if self.state == 1: # initial read buff = self.receive() if not self.connected: return -1 mechs = self._parse_auth_buff(buff) if mechs is None: return -1 # invalid auth methods received elif self.state == 3: # get next request buff = self.receive() req_type, self.sha_msg = self._parse_request_buff(buff)[:2] if req_type != 0x01: return -1 # request is not of type 'connect' self.state += 1 # go to the next step # unplug & plug for writing self.idlequeue.plug_idle(self, True, False) return None def pollin(self): self.idlequeue.remove_timeout(self.fd) if self.connected: try: if self.state < 5: result = self.main() if self.state == 4: self.queue.result_sha(self.sha_msg, self.queue_idx) if result == -1: self.disconnect() elif self.state == 5: self.state = 7 if self.file_props.type_ == 's': # We wait for the end of the negotiation to # send the file self.idlequeue.plug_idle(self, False, False) else: # We plug for reading self.idlequeue.plug_idle(self, False, True) return elif self.state == 7: if self.file_props.paused: self.file_props.continue_cb = \ self.continue_paused_transfer self.idlequeue.plug_idle(self, False, False) return self.idlequeue.set_read_timeout(self.fd, STALLED_TIMEOUT) result = self.start_transfer() # send self.queue.process_result(result, self) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, OpenSSL.SSL.WantX509LookupError) as e: log.info('caught SSL exception, ignored') else: self.disconnect() def pollend(self): self.state = 8 # end connection self.disconnect() self.file_props.error = -1 self.queue.process_result(-1, self) def pollout(self): if not self.connected: self.disconnect() return self.idlequeue.remove_timeout(self.fd) try: if self.state == 2: # send reply with desired auth type self.send_raw(self._get_auth_response()) elif self.state == 4: # send positive response to the 'connect' self.send_raw(self._get_request_buff(self.sha_msg, 0x00)) elif self.state == 7: if self.file_props.paused: self.file_props.continue_cb = self.continue_paused_transfer self.idlequeue.plug_idle(self, False, False) return result = self.start_transfer() # send self.queue.process_result(result, self) if result is None or result <= 0: self.disconnect() return self.idlequeue.set_read_timeout(self.fd, STALLED_TIMEOUT) elif self.state == 8: self.disconnect() return else: self.disconnect() except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, OpenSSL.SSL.WantX509LookupError) as e: log.info('caught SSL exception, ignored') return if self.state < 5: self.state += 1 # unplug and plug this time for reading self.idlequeue.plug_idle(self, False, True) class Socks5Client(Socks5): def __init__(self, idlequeue, host, port, initiator, target, sid): Socks5.__init__(self, idlequeue, host, port, initiator, target, sid) self.mode = 'client' def main(self, timeout=0): """ Begin negotiation. on success 'address' != 0 """ result = 1 buff = self.receive() if buff == b'': # end connection self.pollend() return if self.state == 2: # read auth response if buff is None or len(buff) != 2: return None version, method = struct.unpack('!BB', buff[:2]) if version != 0x05 or method == 0xff: self.disconnect() elif self.state == 4: # get approve of our request if buff is None: return None sub_buff = buff[:4] if len(sub_buff) < 4: return None version, address_type = struct.unpack('!BxxB', buff[:4]) addrlen = 0 if address_type == 0x03: addrlen = buff[4] address = struct.unpack('!%ds' % addrlen, buff[5:addrlen + 5]) portlen = len(buff[addrlen + 5:]) if portlen == 1: port, = struct.unpack('!B', buff[addrlen + 5]) elif portlen == 2: port, = struct.unpack('!H', buff[addrlen + 5:]) else: # Gaim bug :) port, = struct.unpack('!H', buff[addrlen + 5:addrlen + 7]) self.remaining_buff = buff[addrlen + 7:] self.state = 5 # for senders: init file_props and send '\n' if self.queue.on_success: result = self.queue.send_success_reply(self.file_props, self.streamhost) if self.file_props.type_ == 's' and self.proxy: self.queue.process_result(self.send_file(), self) return if result == 0: self.state = 8 self.disconnect() # for senders: init file_props if result == 1 and self.state == 5: if self.file_props.type_ == 's': self.file_props.error = 0 self.file_props.disconnect_cb = self.disconnect self.file_props.started = True self.file_props.completed = False self.file_props.paused = False self.file_props.stalled = False self.file_props.elapsed_time = 0 self.file_props.last_time = time.time() self.file_props.received_len = 0 self.pauses = 0 # start sending file contents to socket #self.idlequeue.set_read_timeout(self.fd, STALLED_TIMEOUT) #self.idlequeue.plug_idle(self, True, False) self.idlequeue.plug_idle(self, False, False) else: # receiving file contents from socket self.idlequeue.plug_idle(self, False, True) self.file_props.continue_cb = self.continue_paused_transfer # we have set up the connection, next - retrieve file self.state = 6 if self.state < 5: self.idlequeue.plug_idle(self, True, False) self.state += 1 return None def send_file(self): if self.ssl_errnum > 0: log.error('remote certificate does not match the announced one.' + \ '\nSSL Error: %d\nCancelling file transfer' % self.ssl_errnum) self.file_props.error = -12 return -1 return super(Socks5Client, self).send_file() def pollin(self): self.idlequeue.remove_timeout(self.fd) if self.connected: try: if self.file_props.paused: self.idlequeue.plug_idle(self, False, False) return if self.state < 5: self.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) result = self.main(0) self.queue.process_result(result, self) elif self.state == 5: # wait for proxy reply pass elif self.file_props.type_ == 'r': self.idlequeue.set_read_timeout(self.fd, STALLED_TIMEOUT) result = self.start_transfer() # receive self.queue.process_result(result, self) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, OpenSSL.SSL.WantX509LookupError) as e: log.info('caught SSL exception, ignored') return else: self.disconnect() def pollout(self): self.idlequeue.remove_timeout(self.fd) try: if self.state == 0: self.do_connect() return elif self.state == 1: # send initially: version and auth types self.send_raw(self._get_auth_buff()) elif self.state == 3: # send 'connect' request self.send_raw(self._get_request_buff(self._get_sha1_auth())) elif self.file_props.type_ != 'r': if self.file_props.paused: self.idlequeue.plug_idle(self, False, False) return result = self.start_transfer() # send self.queue.process_result(result, self) return except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, OpenSSL.SSL.WantX509LookupError) as e: log.info('caught SSL exception, ignored') return self.state += 1 # unplug and plug for reading self.idlequeue.plug_idle(self, False, True) self.idlequeue.set_read_timeout(self.fd, CONNECT_TIMEOUT) def pollend(self): if self.state >= 5: # error during transfer self.disconnect() self.file_props.error = -1 self.queue.process_result(-1, self) else: self.queue.reconnect_client(self, self.streamhost) class Socks5SenderClient(Socks5Client, Socks5Sender): def __init__(self, idlequeue, sock_hash, parent,_sock, host=None, port=None, fingerprint = None, connected=True, file_props=None, initiator=None, target=None): Socks5Client.__init__(self, idlequeue, host, port, initiator, target, file_props.transport_sid) Socks5Sender.__init__(self,idlequeue, sock_hash, parent,_sock, host, port, fingerprint , connected, file_props) class Socks5SenderServer(Socks5Server, Socks5Sender): def __init__(self, idlequeue, sock_hash, parent,_sock, host=None, port=None, fingerprint = None, connected=True, file_props=None): Socks5Server.__init__(self, idlequeue, host, port, None, None, file_props.transport_sid) Socks5Sender.__init__(self,idlequeue, sock_hash, parent, _sock, host, port, fingerprint , connected, file_props) class Socks5ReceiverClient(Socks5Client, Socks5Receiver): def __init__(self, idlequeue, streamhost, transport_sid, file_props=None, fingerprint=None): Socks5Client.__init__(self, idlequeue, streamhost['host'], int(streamhost['port']), streamhost['initiator'], streamhost['target'], transport_sid) Socks5Receiver.__init__(self, idlequeue, streamhost, transport_sid, file_props, fingerprint) class Socks5ReceiverServer(Socks5Server, Socks5Receiver): def __init__(self, idlequeue, streamhost, transport_sid, file_props=None, fingerprint=None): Socks5Server.__init__(self, idlequeue, streamhost['host'], int(streamhost['port']), streamhost['initiator'], streamhost['target'], transport_sid) Socks5Receiver.__init__(self, idlequeue, streamhost, transport_sid, file_props, fingerprint) class Socks5Listener(IdleObject): def __init__(self, idlequeue, port, fp, fingerprint=None): """ Handle all incomming connections on (0.0.0.0, port) This class implements IdleObject, but we will expect only pollin events though fingerprint: fingerprint of certificates we shall use, set to None if TLS connection not desired """ self.port = port self.ais = socket.getaddrinfo(None, port, socket.AF_UNSPEC, socket.SOCK_STREAM, socket.SOL_TCP, socket.AI_PASSIVE) self.ais.sort(reverse=True) # Try IPv6 first self.queue_idx = -1 self.idlequeue = idlequeue self.queue = None self.started = False self._sock = None self.fd = -1 self.fingerprint = fingerprint self.file_props = fp self.connections = [] def bind(self): for ai in self.ais: # try the different possibilities (ipv6, ipv4, etc.) try: self._serv = socket.socket(*ai[:3]) if self.fingerprint is not None: self._serv = OpenSSL.SSL.Connection( jingle_xtls.get_context('server'), self._serv) except socket.error as e: if e.errno == EAFNOSUPPORT: self.ai = None continue raise self._serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self._serv.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) self._serv.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) # Under windows Vista, we need that to listen on ipv6 AND ipv4 # Doesn't work under windows XP if os.name == 'nt': ver = os.sys.getwindowsversion() if (ver[3], ver[0]) == (2, 6): # Win Vista + # 47 is socket.IPPROTO_IPV6 # 27 is socket.IPV6_V6ONLY under windows, but not defined ... self._serv.setsockopt(41, 27, 0) # will fail when port as busy, or we don't have rights to bind try: self._serv.bind(ai[4]) f = ai[4] self.ai = ai break except Exception: self.ai = None continue if not self.ai: log.error('unable to bind to port ' + str(self.port)) return None self._serv.listen(socket.SOMAXCONN) self._serv.setblocking(False) self.fd = self._serv.fileno() self.idlequeue.plug_idle(self, False, True) self.started = True def pollend(self): """ Called when we stop listening on (host, port) """ self.disconnect() def pollin(self): """ Accept a new incomming connection and notify queue """ sock = self.accept_conn() self.queue.on_connection_accepted(sock, self) def disconnect(self): """ Free all resources, we are not listening anymore """ self.idlequeue.remove_timeout(self.fd) self.idlequeue.unplug_idle(self.fd) self.fd = -1 self.state = -1 self.started = False try: self._serv.close() except Exception: pass def accept_conn(self): """ Accept a new incomming connection """ _sock = self._serv.accept() _sock[0].setblocking(False) self.connections.append(_sock[0]) return _sock gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/stanza_session.py000066400000000000000000001214671326020644600267120ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/common/stanza_session.py ## ## Copyright (C) 2007-2014 Yann Leboulanger ## Copyright (C) 2007 Julien Pivotto ## Copyright (C) 2007-2008 Brendan Taylor ## Jean-Marie Traissard ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gajim.common import app import nbxmpp from gajim.common.exceptions import DecryptionError, NegotiationError import nbxmpp.c14n import itertools import random import string import time import base64 import os from hashlib import sha256 from hmac import HMAC from gajim.common import crypto import logging log = logging.getLogger('gajim.c.stanza_session') if app.HAVE_PYCRYPTO: from Crypto.Cipher import AES from Crypto.PublicKey import RSA from gajim.common import dh from gajim import secrets XmlDsig = 'http://www.w3.org/2000/09/xmldsig#' class StanzaSession(object): ''' ''' def __init__(self, conn, jid, thread_id, type_): ''' ''' self.conn = conn self.jid = jid self.type_ = type_ self.resource = jid.getResource() if thread_id: self.received_thread_id = True self.thread_id = thread_id else: self.received_thread_id = False if type_ == 'normal': self.thread_id = None else: self.thread_id = self.generate_thread_id() self.loggable = True self.last_send = 0 self.last_receive = 0 self.status = None self.negotiated = {} def is_loggable(self): return self.loggable and app.config.should_log(self.conn.name, self.jid.getStripped()) def get_to(self): to = str(self.jid) return app.get_jid_without_resource(to) + '/' + self.resource def remove_events(self, types): """ Remove events associated with this session from the queue Returns True if any events were removed (unlike events.py remove_events) """ any_removed = False for j in (self.jid, self.jid.getStripped()): for event in app.events.get_events(self.conn.name, j, types=types): # the event wasn't in this session if (event.type_ == 'chat' and event.session != self) or \ (event.type_ == 'printed_chat' and event.control.session != \ self): continue # events.remove_events returns True when there were no events # for some reason r = app.events.remove_events(self.conn.name, j, event) if not r: any_removed = True return any_removed def generate_thread_id(self): return ''.join([f(string.ascii_letters) for f in itertools.repeat( random.choice, 32)]) def send(self, msg): if self.thread_id: msg.NT.thread = self.thread_id msg.setAttr('to', self.get_to()) self.conn.send_stanza(msg) if isinstance(msg, nbxmpp.Message): self.last_send = time.time() def reject_negotiation(self, body=None): msg = nbxmpp.Message() feature = msg.NT.feature feature.setNamespace(nbxmpp.NS_FEATURE) x = nbxmpp.DataForm(typ='submit') x.addChild(node=nbxmpp.DataField(name='FORM_TYPE', value='urn:xmpp:ssn')) x.addChild(node=nbxmpp.DataField(name='accept', value='0')) feature.addChild(node=x) if body: msg.setBody(body) self.send(msg) self.cancelled_negotiation() def cancelled_negotiation(self): """ A negotiation has been cancelled, so reset this session to its default state """ if self.control: self.control.on_cancel_session_negotiation() self.status = None self.negotiated = {} def terminate(self, send_termination = True): # only send termination message if we've sent a message and think they # have XEP-0201 support if send_termination and self.last_send > 0 and \ (self.received_thread_id or self.last_receive == 0): msg = nbxmpp.Message() feature = msg.NT.feature feature.setNamespace(nbxmpp.NS_FEATURE) x = nbxmpp.DataForm(typ='submit') x.addChild(node=nbxmpp.DataField(name='FORM_TYPE', value='urn:xmpp:ssn')) x.addChild(node=nbxmpp.DataField(name='terminate', value='1')) feature.addChild(node=x) self.send(msg) self.status = None def acknowledge_termination(self): # we could send an acknowledgement message to the remote client here self.status = None class ArchivingStanzaSession(StanzaSession): def __init__(self, conn, jid, thread_id, type_='chat'): StanzaSession.__init__(self, conn, jid, thread_id, type_='chat') self.archiving = False def archiving_logging_preference(self, initiator_options=None): return self.conn.logging_preference(self.jid, initiator_options) def negotiate_archiving(self): self.negotiated = {} request = nbxmpp.Message() feature = request.NT.feature feature.setNamespace(nbxmpp.NS_FEATURE) x = nbxmpp.DataForm(typ='form') x.addChild(node=nbxmpp.DataField(name='FORM_TYPE', value='urn:xmpp:ssn', typ='hidden')) x.addChild(node=nbxmpp.DataField(name='accept', value='1', typ='boolean', required=True)) x.addChild(node=nbxmpp.DataField(name='logging', typ='list-single', options=self.archiving_logging_preference(), required=True)) x.addChild(node=nbxmpp.DataField(name='disclosure', typ='list-single', options=['never'], required=True)) x.addChild(node=nbxmpp.DataField(name='security', typ='list-single', options=['none'], required=True)) feature.addChild(node=x) self.status = 'requested-archiving' self.send(request) def respond_archiving(self, form): field = form.getField('logging') options = [x[1] for x in field.getOptions()] values = field.getValues() logging = self.archiving_logging_preference(options) self.negotiated['logging'] = logging response = nbxmpp.Message() feature = response.NT.feature feature.setNamespace(nbxmpp.NS_FEATURE) x = nbxmpp.DataForm(typ='submit') x.addChild(node=nbxmpp.DataField(name='FORM_TYPE', value='urn:xmpp:ssn')) x.addChild(node=nbxmpp.DataField(name='accept', value='true')) x.addChild(node=nbxmpp.DataField(name='logging', value=logging)) self.status = 'responded-archiving' feature.addChild(node=x) if not logging: response = nbxmpp.Error(response, nbxmpp.ERR_NOT_ACCEPTABLE) feature = nbxmpp.Node(nbxmpp.NS_FEATURE + ' feature') n = nbxmpp.Node('field') n['var'] = 'logging' feature.addChild(node=n) response.T.error.addChild(node=feature) self.send(response) def we_accept_archiving(self, form): if self.negotiated['logging'] == 'mustnot': self.loggable = False log.debug('archiving session accepted: %s' % self.loggable) self.status = 'active' self.archiving = True if self.control: self.control.print_archiving_session_details() def archiving_accepted(self, form): negotiated = {} ask_user = {} not_acceptable = [] if form['logging'] not in self.archiving_logging_preference(): raise self.negotiated['logging'] = form['logging'] accept = nbxmpp.Message() feature = accept.NT.feature feature.setNamespace(nbxmpp.NS_FEATURE) result = nbxmpp.DataForm(typ='result') result.addChild(node=nbxmpp.DataField(name='FORM_TYPE', value='urn:xmpp:ssn')) result.addChild(node=nbxmpp.DataField(name='accept', value='1')) feature.addChild(node=result) self.send(accept) if self.negotiated['logging'] == 'mustnot': self.loggable = False log.debug('archiving session accepted: %s' % self.loggable) self.status = 'active' self.archiving = True if self.control: self.control.print_archiving_session_details() class EncryptedStanzaSession(ArchivingStanzaSession): """ An encrypted stanza negotiation has several states. They arerepresented as the following values in the 'status' attribute of the session object: 1. None: default state 2. 'requested-e2e': this client has initiated an esession negotiation and is waiting for a response 3. 'responded-e2e': this client has responded to an esession negotiation request and is waiting for the initiator to identify itself and complete the negotiation 4. 'identified-alice': this client identified itself and is waiting for the responder to identify itself and complete the negotiation 5. 'active': an encrypted session has been successfully negotiated. messages of any of the types listed in 'encryptable_stanzas' should be encrypted before they're sent. The transition between these states is handled in app.py's handle_session_negotiation method. """ def __init__(self, conn, jid, thread_id, type_='chat'): ArchivingStanzaSession.__init__(self, conn, jid, thread_id, type_='chat') self.xes = {} self.es = {} self.n = 128 self.enable_encryption = False # _s denotes 'self' (ie. this client) self._kc_s = None # _o denotes 'other' (ie. the client at the other end of the session) self._kc_o = None # has the remote contact's identity ever been verified? self.verified_identity = False def _get_contact(self): c = app.contacts.get_contact(self.conn.name, self.jid, self.resource) if not c: c = app.contacts.get_contact(self.conn.name, self.jid) return c def _is_buggy_gajim(self): c = self._get_contact() if c and c.supports(nbxmpp.NS_ROSTERX): return False return True def set_kc_s(self, value): """ Keep the encrypter updated with my latest cipher key """ self._kc_s = value self.encrypter = self.cipher.new(self._kc_s, self.cipher.MODE_CTR, counter=self.encryptcounter) def get_kc_s(self): return self._kc_s def set_kc_o(self, value): """ Keep the decrypter updated with the other party's latest cipher key """ self._kc_o = value self.decrypter = self.cipher.new(self._kc_o, self.cipher.MODE_CTR, counter=self.decryptcounter) def get_kc_o(self): return self._kc_o kc_s = property(get_kc_s, set_kc_s) kc_o = property(get_kc_o, set_kc_o) def encryptcounter(self): self.c_s = (self.c_s + 1) % (2 ** self.n) return crypto.encode_mpi_with_padding(self.c_s) def decryptcounter(self): self.c_o = (self.c_o + 1) % (2 ** self.n) return crypto.encode_mpi_with_padding(self.c_o) def sign(self, string): if self.negotiated['sign_algs'] == (XmlDsig + 'rsa-sha256'): hash_ = crypto.sha256(string) return crypto.encode_mpi(app.pubkey.sign(hash_, '')[0]) def encrypt_stanza(self, stanza): encryptable = [x for x in stanza.getChildren() if x.getName() not in ('error', 'amp', 'thread')] # FIXME can also encrypt contents of elements in stanzas @type = # 'error' # (except for child elements) old_en_counter = self.c_s for element in encryptable: stanza.delChild(element) plaintext = ''.join(map(str, encryptable)) m_compressed = self.compress(plaintext) m_final = self.encrypt(m_compressed) c = stanza.NT.c c.setNamespace('http://www.xmpp.org/extensions/xep-0200.html#ns') c.NT.data = base64.b64encode(m_final).decode('utf-8') # FIXME check for rekey request, handle elements m_content = (''.join(map(str, c.getChildren()))).encode('utf-8') c.NT.mac = base64.b64encode(self.hmac(self.km_s, m_content + \ crypto.encode_mpi(old_en_counter))).decode('utf-8') msgtxt = '[This is part of an encrypted session. ' \ 'If you see this message, something went wrong.]' lang = os.getenv('LANG') if lang is not None and lang != 'en': # we're not english msgtxt = _('[This is part of an encrypted session. ' 'If you see this message, something went wrong.]') + ' (' + \ msgtxt + ')' stanza.setBody(msgtxt) return stanza def is_xep_200_encrypted(self, msg): msg.getTag('c', namespace=nbxmpp.NS_STANZA_CRYPTO) def hmac(self, key, content): return HMAC(key, content, self.hash_alg).digest() def generate_initiator_keys(self, k): return (self.hmac(k, b'Initiator Cipher Key'), self.hmac(k, b'Initiator MAC Key'), self.hmac(k, b'Initiator SIGMA Key')) def generate_responder_keys(self, k): return (self.hmac(k, b'Responder Cipher Key'), self.hmac(k, b'Responder MAC Key'), self.hmac(k, b'Responder SIGMA Key')) def compress(self, plaintext): if self.compression is None: return plaintext def decompress(self, compressed): if self.compression is None: return compressed def encrypt(self, encryptable): padded = crypto.pad_to_multiple(encryptable, 16, ' ', False) return self.encrypter.encrypt(padded) def decrypt_stanza(self, stanza): """ Delete the unencrypted explanation body, if it exists """ orig_body = stanza.getTag('body') if orig_body: stanza.delChild(orig_body) c = stanza.getTag(name='c', namespace='http://www.xmpp.org/extensions/xep-0200.html#ns') stanza.delChild(c) # contents of , minus , minus whitespace macable = ''.join(str(x) for x in c.getChildren() if x.getName() != 'mac') macable = macable.encode('utf-8') received_mac = base64.b64decode(c.getTagData('mac')) calculated_mac = self.hmac(self.km_o, macable + \ crypto.encode_mpi_with_padding(self.c_o)) if not calculated_mac == received_mac: raise DecryptionError('bad signature') m_final = base64.b64decode(c.getTagData('data')) m_compressed = self.decrypt(m_final) plaintext = self.decompress(m_compressed).decode('utf-8') try: parsed = nbxmpp.Node(node='' + plaintext + '') except Exception: raise DecryptionError('decrypted not parseable as XML') for child in parsed.getChildren(): stanza.addChild(node=child) # replace non-character unicode body = stanza.getBody() if body: stanza.setBody( self.conn.connection.Dispatcher.replace_non_character(body)) return stanza def decrypt(self, ciphertext): return self.decrypter.decrypt(ciphertext) def logging_preference(self): if app.config.get_per('accounts', self.conn.name, 'log_encrypted_sessions'): return ['may', 'mustnot'] else: return ['mustnot', 'may'] def get_shared_secret(self, e, y, p): if (not 1 < e < (p - 1)): raise NegotiationError('invalid DH value') return crypto.sha256(crypto.encode_mpi(crypto.powmod(e, y, p))) def c7lize_mac_id(self, form): kids = form.getChildren() macable = [x for x in kids if x.getVar() not in ('mac', 'identity')] return ''.join(nbxmpp.c14n.c14n(el, self._is_buggy_gajim()) for el in \ macable) def verify_identity(self, form, dh_i, sigmai, i_o): m_o = base64.b64decode(form['mac']) id_o = base64.b64decode(form['identity']) m_o_calculated = self.hmac(self.km_o, crypto.encode_mpi(self.c_o) + id_o) if m_o_calculated != m_o: raise NegotiationError('calculated m_%s differs from received m_%s' % (i_o, i_o)) if i_o == 'a' and self.sas_algs == 'sas28x5': # we don't need to calculate this if there's a verified retained secret # (but we do anyways) self.sas = crypto.sas_28x5(m_o, self.form_s.encode('utf-8')) if self.negotiated['recv_pubkey']: plaintext = self.decrypt(id_o) parsed = nbxmpp.Node(node='' + plaintext + '') if self.negotiated['recv_pubkey'] == 'hash': # fingerprint = parsed.getTagData('fingerprint') # FIXME find stored pubkey or terminate session raise NotImplementedError() else: if self.negotiated['sign_algs'] == (XmlDsig + 'rsa-sha256'): keyvalue = parsed.getTag(name='RSAKeyValue', namespace=XmlDsig) n, e = (crypto.decode_mpi(base64.b64decode( keyvalue.getTagData(x))) for x in ('Modulus', 'Exponent')) eir_pubkey = RSA.construct((n, int(e))) pubkey_o = nbxmpp.c14n.c14n(keyvalue, self._is_buggy_gajim()) else: # FIXME DSA, etc. raise NotImplementedError() enc_sig = parsed.getTag(name='SignatureValue', namespace=XmlDsig).getData() signature = (crypto.decode_mpi(base64.b64decode(enc_sig)), ) else: mac_o = self.decrypt(id_o) pubkey_o = b'' c7l_form = self.c7lize_mac_id(form) content = self.n_s + self.n_o + crypto.encode_mpi(dh_i) + pubkey_o if sigmai: self.form_o = c7l_form.encode('utf-8') content += self.form_o else: form_o2 = c7l_form.encode('utf-8') content += self.form_o.encode('utf-8') + form_o2 mac_o_calculated = self.hmac(self.ks_o, content) if self.negotiated['recv_pubkey']: hash_ = crypto.sha256(mac_o_calculated) if not eir_pubkey.verify(hash_, signature): raise NegotiationError('public key signature verification failed!') elif mac_o_calculated != mac_o: raise NegotiationError('calculated mac_%s differs from received mac_%s' % (i_o, i_o)) def make_identity(self, form, dh_i): if self.negotiated['send_pubkey']: if self.negotiated['sign_algs'] == (XmlDsig + 'rsa-sha256'): pubkey = secrets.secrets().my_pubkey(self.conn.name) fields = (pubkey.n, pubkey.e) cb_fields = [base64.b64encode(crypto.encode_mpi(f)) for f in fields] pubkey_s = b'%s%s' % \ tuple(cb_fields) else: pubkey_s = b'' form_s2 = ''.join(nbxmpp.c14n.c14n(el, self._is_buggy_gajim()) for el \ in form.getChildren()) old_c_s = self.c_s content = self.n_o + self.n_s + crypto.encode_mpi(dh_i) + pubkey_s + \ self.form_s.encode('utf-8') + form_s2.encode('utf-8') mac_s = self.hmac(self.ks_s, content) if self.negotiated['send_pubkey']: signature = self.sign(mac_s) sign_s = '' '%s' % base64.b64encode(signature) if self.negotiated['send_pubkey'] == 'hash': b64ed = base64.b64encode(self.hash(pubkey_s)) pubkey_s = '%s' % b64ed id_s = self.encrypt(pubkey_s + sign_s) else: id_s = self.encrypt(mac_s) m_s = self.hmac(self.km_s, crypto.encode_mpi(old_c_s) + id_s) if self.status == 'requested-e2e' and self.sas_algs == 'sas28x5': # we're alice; check for a retained secret # if none exists, prompt the user with the SAS self.sas = crypto.sas_28x5(m_s, self.form_o.encode('utf-8')) if self.sigmai: # FIXME save retained secret? self.check_identity(tuple) return (nbxmpp.DataField(name='identity', value=base64.b64encode(id_s).decode('utf-8')), nbxmpp.DataField(name='mac', value=base64.b64encode(m_s).decode('utf-8'))) def negotiate_e2e(self, sigmai): self.negotiated = {} request = nbxmpp.Message() feature = request.NT.feature feature.setNamespace(nbxmpp.NS_FEATURE) x = nbxmpp.DataForm(typ='form') x.addChild(node=nbxmpp.DataField(name='FORM_TYPE', value='urn:xmpp:ssn', typ='hidden')) x.addChild(node=nbxmpp.DataField(name='accept', value='1', typ='boolean', required=True)) # this field is incorrectly called 'otr' in XEPs 0116 and 0217 x.addChild(node=nbxmpp.DataField(name='logging', typ='list-single', options=self.logging_preference(), required=True)) # unsupported options: 'disabled', 'enabled' x.addChild(node=nbxmpp.DataField(name='disclosure', typ='list-single', options=['never'], required=True)) x.addChild(node=nbxmpp.DataField(name='security', typ='list-single', options=['e2e'], required=True)) x.addChild(node=nbxmpp.DataField(name='crypt_algs', value='aes128-ctr', typ='hidden')) x.addChild(node=nbxmpp.DataField(name='hash_algs', value='sha256', typ='hidden')) x.addChild(node=nbxmpp.DataField(name='compress', value='none', typ='hidden')) # unsupported options: 'iq', 'presence' x.addChild(node=nbxmpp.DataField(name='stanzas', typ='list-multi', options=['message'])) x.addChild(node=nbxmpp.DataField(name='init_pubkey', options=['none', 'key', 'hash'], typ='list-single')) # FIXME store key, use hash x.addChild(node=nbxmpp.DataField(name='resp_pubkey', options=['none', 'key'], typ='list-single')) x.addChild(node=nbxmpp.DataField(name='ver', value='1.0', typ='hidden')) x.addChild(node=nbxmpp.DataField(name='rekey_freq', value='4294967295', typ='hidden')) x.addChild(node=nbxmpp.DataField(name='sas_algs', value='sas28x5', typ='hidden')) x.addChild(node=nbxmpp.DataField(name='sign_algs', value='http://www.w3.org/2000/09/xmldsig#rsa-sha256', typ='hidden')) self.n_s = crypto.generate_nonce() x.addChild(node=nbxmpp.DataField(name='my_nonce', value=base64.b64encode(self.n_s).decode('utf-8'), typ='hidden')) modp_options = [ int(g) for g in app.config.get('esession_modp').split( ',') ] x.addChild(node=nbxmpp.DataField(name='modp', typ='list-single', options=[[None, y] for y in modp_options])) x.addChild(node=self.make_dhfield(modp_options, sigmai)) self.sigmai = sigmai self.form_s = ''.join(nbxmpp.c14n.c14n(el, self._is_buggy_gajim()) for \ el in x.getChildren()) feature.addChild(node=x) self.status = 'requested-e2e' self.send(request) def verify_options_bob(self, form): """ 4.3 esession response (bob) """ negotiated = {'recv_pubkey': None, 'send_pubkey': None} not_acceptable = [] ask_user = {} fixed = { 'disclosure': 'never', 'security': 'e2e', 'crypt_algs': 'aes128-ctr', 'hash_algs': 'sha256', 'compress': 'none', 'stanzas': 'message', 'init_pubkey': 'none', 'resp_pubkey': 'none', 'ver': '1.0', 'sas_algs': 'sas28x5' } self.encryptable_stanzas = ['message'] self.sas_algs = 'sas28x5' self.cipher = AES self.hash_alg = sha256 self.compression = None for name in form.asDict(): field = form.getField(name) options = [x[1] for x in field.getOptions()] values = field.getValues() if not field.getType() in ('list-single', 'list-multi'): options = values if name in fixed: if fixed[name] in options: negotiated[name] = fixed[name] else: not_acceptable.append(name) elif name == 'rekey_freq': preferred = int(options[0]) negotiated['rekey_freq'] = preferred self.rekey_freq = preferred elif name == 'logging': my_prefs = self.logging_preference() if my_prefs[0] in options: # our first choice is offered, select it pref = my_prefs[0] negotiated['logging'] = pref else: # see if other acceptable choices are offered for pref in my_prefs: if pref in options: ask_user['logging'] = pref break if not 'logging' in ask_user: not_acceptable.append(name) elif name == 'init_pubkey': for x in ('key'): if x in options: negotiated['recv_pubkey'] = x break elif name == 'resp_pubkey': for x in ('hash', 'key'): if x in options: negotiated['send_pubkey'] = x break elif name == 'sign_algs': if (XmlDsig + 'rsa-sha256') in options: negotiated['sign_algs'] = XmlDsig + 'rsa-sha256' else: # FIXME some things are handled elsewhere, some things are # not-implemented pass return (negotiated, not_acceptable, ask_user) def respond_e2e_bob(self, form, negotiated, not_acceptable): """ 4.3 esession response (bob) """ response = nbxmpp.Message() feature = response.NT.feature feature.setNamespace(nbxmpp.NS_FEATURE) x = nbxmpp.DataForm(typ='submit') x.addChild(node=nbxmpp.DataField(name='FORM_TYPE', value='urn:xmpp:ssn')) x.addChild(node=nbxmpp.DataField(name='accept', value='true')) for name in negotiated: # some fields are internal and should not be sent if not name in ('send_pubkey', 'recv_pubkey'): x.addChild(node=nbxmpp.DataField(name=name, value=negotiated[name])) self.negotiated = negotiated # the offset of the group we chose (need it to match up with the dhhash) group_order = 0 modp_f = form.getField('modp') if not modp_f: return self.modp = int(modp_f.getOptions()[group_order][1]) x.addChild(node=nbxmpp.DataField(name='modp', value=self.modp)) g = dh.generators[self.modp] p = dh.primes[self.modp] self.n_o = base64.b64decode(form['my_nonce']) dhhashes_f = form.getField('dhhashes') if not dhhashes_f: return dhhashes = dhhashes_f.getValues() self.negotiated['He'] = base64.b64decode(dhhashes[group_order].encode( 'utf8')) bytes = int(self.n / 8) self.n_s = crypto.generate_nonce() # n-bit random number self.c_o = crypto.decode_mpi(crypto.random_bytes(bytes)) self.c_s = self.c_o ^ (2 ** (self.n - 1)) self.y = crypto.srand(2 ** (2 * self.n - 1), p - 1) self.d = crypto.powmod(g, self.y, p) to_add = {'my_nonce': self.n_s, 'dhkeys': crypto.encode_mpi(self.d), 'counter': crypto.encode_mpi(self.c_o), 'nonce': self.n_o} for name in to_add: b64ed = base64.b64encode(to_add[name]).decode('utf-8') x.addChild(node=nbxmpp.DataField(name=name, value=b64ed)) self.form_o = ''.join(nbxmpp.c14n.c14n(el, self._is_buggy_gajim()) for \ el in form.getChildren()) self.form_s = ''.join(nbxmpp.c14n.c14n(el, self._is_buggy_gajim()) for \ el in x.getChildren()) self.status = 'responded-e2e' feature.addChild(node=x) if not_acceptable: response = nbxmpp.Error(response, nbxmpp.ERR_NOT_ACCEPTABLE) feature = nbxmpp.Node(nbxmpp.NS_FEATURE + ' feature') for f in not_acceptable: n = nbxmpp.Node('field') n['var'] = f feature.addChild(node=n) response.T.error.addChild(node=feature) self.send(response) def verify_options_alice(self, form): """ 'Alice Accepts' """ negotiated = {} ask_user = {} not_acceptable = [] if not form['logging'] in self.logging_preference(): not_acceptable.append(form['logging']) elif form['logging'] != self.logging_preference()[0]: ask_user['logging'] = form['logging'] else: negotiated['logging'] = self.logging_preference()[0] for r, a in (('recv_pubkey', 'resp_pubkey'), ('send_pubkey', 'init_pubkey')): negotiated[r] = None if a in form.asDict() and form[a] in ('key', 'hash'): negotiated[r] = form[a] if 'sign_algs' in form.asDict(): if form['sign_algs'] in (XmlDsig + 'rsa-sha256', ): negotiated['sign_algs'] = form['sign_algs'] else: not_acceptable.append(form['sign_algs']) return (negotiated, not_acceptable, ask_user) def accept_e2e_alice(self, form, negotiated): """ 'Alice Accepts', continued """ self.encryptable_stanzas = ['message'] self.sas_algs = 'sas28x5' self.cipher = AES self.hash_alg = sha256 self.compression = None self.negotiated = negotiated accept = nbxmpp.Message() feature = accept.NT.feature feature.setNamespace(nbxmpp.NS_FEATURE) result = nbxmpp.DataForm(typ='result') self.c_s = crypto.decode_mpi(base64.b64decode(form['counter'])) self.c_o = self.c_s ^ (2 ** (self.n - 1)) self.n_o = base64.b64decode(form['my_nonce']) mod_p = int(form['modp']) p = dh.primes[mod_p] x = self.xes[mod_p] e = self.es[mod_p] self.d = crypto.decode_mpi(base64.b64decode(form['dhkeys'])) self.k = self.get_shared_secret(self.d, x, p) result.addChild(node=nbxmpp.DataField(name='FORM_TYPE', value='urn:xmpp:ssn')) result.addChild(node=nbxmpp.DataField(name='accept', value='1')) result.addChild(node=nbxmpp.DataField(name='nonce', value=base64.b64encode(self.n_o).decode('utf-8'))) self.kc_s, self.km_s, self.ks_s = self.generate_initiator_keys(self.k) if self.sigmai: self.kc_o, self.km_o, self.ks_o = self.generate_responder_keys(self.k) self.verify_identity(form, self.d, True, 'b') else: srses = secrets.secrets().retained_secrets(self.conn.name, self.jid.getStripped()) rshashes = [self.hmac(self.n_s, rs[0]) for rs in srses] if not rshashes: # we've never spoken before, but we'll pretend we have rshash_size = self.hash_alg().digest_size rshashes.append(crypto.random_bytes(rshash_size)) rshashes = [base64.b64encode(rshash).decode('utf-8') for rshash in \ rshashes] result.addChild(node=nbxmpp.DataField(name='rshashes', value=rshashes)) result.addChild(node=nbxmpp.DataField(name='dhkeys', value=base64.b64encode(crypto.encode_mpi(e)).decode('utf-8'))) self.form_o = ''.join(nbxmpp.c14n.c14n(el, self._is_buggy_gajim()) \ for el in form.getChildren()) # MUST securely destroy K unless it will be used later to generate the # final shared secret for datafield in self.make_identity(result, e): result.addChild(node=datafield) feature.addChild(node=result) self.send(accept) if self.sigmai: self.status = 'active' self.enable_encryption = True else: self.status = 'identified-alice' def accept_e2e_bob(self, form): """ 4.5 esession accept (bob) """ response = nbxmpp.Message() init = response.NT.init init.setNamespace(nbxmpp.NS_ESESSION_INIT) x = nbxmpp.DataForm(typ='result') for field in ('nonce', 'dhkeys', 'rshashes', 'identity', 'mac'): # FIXME: will do nothing in real world... assert field in form.asDict(), "alice's form didn't have a %s field" \ % field # 4.5.1 generating provisory session keys e = crypto.decode_mpi(base64.b64decode(form['dhkeys'])) p = dh.primes[self.modp] if crypto.sha256(crypto.encode_mpi(e)) != self.negotiated['He']: raise NegotiationError('SHA256(e) != He') k = self.get_shared_secret(e, self.y, p) self.kc_o, self.km_o, self.ks_o = self.generate_initiator_keys(k) # 4.5.2 verifying alice's identity self.verify_identity(form, e, False, 'a') # 4.5.4 generating bob's final session keys srs = b'' srses = secrets.secrets().retained_secrets(self.conn.name, self.jid.getStripped()) rshashes = [base64.b64decode(rshash) for rshash in form.getField( 'rshashes').getValues()] for s in srses: secret = s[0] if self.hmac(self.n_o, secret) in rshashes: srs = secret break # other shared secret # (we're not using one) oss = b'' k = crypto.sha256(k + srs + oss) self.kc_s, self.km_s, self.ks_s = self.generate_responder_keys(k) self.kc_o, self.km_o, self.ks_o = self.generate_initiator_keys(k) # 4.5.5 if srs: srshash = self.hmac(srs, b'Shared Retained Secret') else: srshash = crypto.random_bytes(32) x.addChild(node=nbxmpp.DataField(name='FORM_TYPE', value='urn:xmpp:ssn')) x.addChild(node=nbxmpp.DataField(name='nonce', value=base64.b64encode( self.n_o).decode('utf-8'))) x.addChild(node=nbxmpp.DataField(name='srshash', value=base64.b64encode( srshash).decode('utf-8'))) for datafield in self.make_identity(x, self.d): x.addChild(node=datafield) init.addChild(node=x) self.send(response) self.do_retained_secret(k, srs) if self.negotiated['logging'] == 'mustnot': self.loggable = False self.status = 'active' self.enable_encryption = True if self.control: self.control.print_esession_details() def final_steps_alice(self, form): srs = b'' srses = secrets.secrets().retained_secrets(self.conn.name, self.jid.getStripped()) try: srshash = base64.b64decode(form['srshash']) except IndexError: return for s in srses: secret = s[0] if self.hmac(secret, b'Shared Retained Secret') == srshash: srs = secret break oss = b'' k = crypto.sha256(self.k + srs + oss) del self.k self.do_retained_secret(k, srs) # ks_s doesn't need to be calculated here self.kc_s, self.km_s, self.ks_s = self.generate_initiator_keys(k) self.kc_o, self.km_o, self.ks_o = self.generate_responder_keys(k) # 4.6.2 Verifying Bob's Identity self.verify_identity(form, self.d, False, 'b') # Note: If Alice discovers an error then she SHOULD ignore any encrypted # content she received in the stanza. if self.negotiated['logging'] == 'mustnot': self.loggable = False self.status = 'active' self.enable_encryption = True if self.control: self.control.print_esession_details() def do_retained_secret(self, k, old_srs): """ Calculate the new retained secret. determine if the user needs to check the remote party's identity. Set up callbacks for when the identity has been verified """ new_srs = self.hmac(k, b'New Retained Secret') self.srs = new_srs account = self.conn.name bjid = self.jid.getStripped() self.verified_identity = False if old_srs: if secrets.secrets().srs_verified(account, bjid, old_srs): # already had a stored secret verified by the user. secrets.secrets().replace_srs(account, bjid, old_srs, new_srs, True) # continue without warning. self.verified_identity = True else: # had a secret, but it wasn't verified. secrets.secrets().replace_srs(account, bjid, old_srs, new_srs, False) else: # we don't even have an SRS secrets.secrets().save_new_srs(account, bjid, new_srs, False) def _verified_srs_cb(self): secrets.secrets().replace_srs(self.conn.name, self.jid.getStripped(), self.srs, self.srs, True) def _unverified_srs_cb(self): secrets.secrets().replace_srs(self.conn.name, self.jid.getStripped(), self.srs, self.srs, False) def make_dhfield(self, modp_options, sigmai): dhs = [] for modp in modp_options: p = dh.primes[modp] g = dh.generators[modp] x = crypto.srand(2 ** (2 * self.n - 1), p - 1) # FIXME this may be a source of performance issues e = crypto.powmod(g, x, p) self.xes[modp] = x self.es[modp] = e if sigmai: dhs.append(base64.b64encode(crypto.encode_mpi(e)).decode('utf-8')) name = 'dhkeys' else: He = crypto.sha256(crypto.encode_mpi(e)) dhs.append(base64.b64encode(He).decode('utf-8')) name = 'dhhashes' return nbxmpp.DataField(name=name, typ='hidden', value=dhs) def terminate_e2e(self): self.enable_encryption = False if self.control: self.control.print_session_details() self.terminate() def acknowledge_termination(self): StanzaSession.acknowledge_termination(self) self.enable_encryption = False def fail_bad_negotiation(self, reason, fields=None): """ Send an error and cancels everything If fields is None, the remote party has given us a bad cryptographic value of some kind. Otherwise, list the fields we haven't implemented. """ err = nbxmpp.Error(nbxmpp.Message(), nbxmpp.ERR_FEATURE_NOT_IMPLEMENTED) err.T.error.T.text.setData(reason) if fields: feature = nbxmpp.Node(nbxmpp.NS_FEATURE + ' feature') for field in fields: fn = nbxmpp.Node('field') fn['var'] = field feature.addChild(node=feature) err.addChild(node=feature) self.send(err) self.status = None self.enable_encryption = False # this prevents the MAC check on decryption from succeeding, # preventing falsified messages from going through. self.km_o = '' def cancelled_negotiation(self): StanzaSession.cancelled_negotiation(self) self.enable_encryption = False self.km_o = '' gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/zeroconf/000077500000000000000000000000001326020644600251075ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/zeroconf/__init__.py000066400000000000000000000000001326020644600272060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/zeroconf/client_zeroconf.py000066400000000000000000000746451326020644600306640ustar00rootroot00000000000000## common/zeroconf/client_zeroconf.py ## ## Copyright (C) 2006 Stefan Bethge ## 2006 Dimitur Kirov ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gajim.common import app import nbxmpp from nbxmpp.idlequeue import IdleObject from nbxmpp import dispatcher_nb, simplexml from nbxmpp.plugin import * from nbxmpp.transports_nb import DATA_RECEIVED, DATA_SENT, DATA_ERROR from gajim.common.zeroconf import zeroconf from nbxmpp.protocol import * import socket import ssl import errno import sys import os import string from random import Random import logging log = logging.getLogger('gajim.c.z.client_zeroconf') from gajim.common.zeroconf import roster_zeroconf MAX_BUFF_LEN = 65536 TYPE_SERVER, TYPE_CLIENT = range(2) # wait XX sec to establish a connection CONNECT_TIMEOUT_SECONDS = 10 # after XX sec with no activity, close the stream ACTIVITY_TIMEOUT_SECONDS = 30 class ZeroconfListener(IdleObject): def __init__(self, port, conn_holder): """ Handle all incomming connections on ('0.0.0.0', port) """ self.port = port self.queue_idx = -1 #~ self.queue = None self.started = False self._sock = None self.fd = -1 self.caller = conn_holder.caller self.conn_holder = conn_holder def bind(self): flags = socket.AI_PASSIVE if hasattr(socket, 'AI_ADDRCONFIG'): flags |= socket.AI_ADDRCONFIG ai = socket.getaddrinfo(None, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, flags)[0] self._serv = socket.socket(ai[0], ai[1]) self._serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self._serv.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) self._serv.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) if os.name == 'nt': ver = os.sys.getwindowsversion() if (ver[3], ver[0]) == (2, 6): # Win Vista + # 47 is socket.IPPROTO_IPV6 # 27 is socket.IPV6_V6ONLY under windows, but not defined ... self._serv.setsockopt(41, 27, 0) # will fail when port is busy, or we don't have rights to bind try: self._serv.bind((ai[4][0], self.port)) except Exception: # unable to bind, show error dialog return None self._serv.listen(socket.SOMAXCONN) self._serv.setblocking(False) self.fd = self._serv.fileno() app.idlequeue.plug_idle(self, False, True) self.started = True def pollend(self): """ Called when we stop listening on (host, port) """ self.disconnect() def pollin(self): """ Accept a new incomming connection and notify queue """ sock = self.accept_conn() # loop through roster to find who has connected to us from_jid = None ipaddr = sock[1][0] for jid in self.conn_holder.getRoster().keys(): entry = self.conn_holder.getRoster().getItem(jid) for address in entry['addresses']: if (address['address'] == ipaddr): from_jid = jid break P2PClient(sock[0], [{'host': ipaddr, 'address': ipaddr, 'port': sock[1][1]}], self.conn_holder, [], from_jid) def disconnect(self, message=''): """ Free all resources, we are not listening anymore """ log.info('Disconnecting ZeroconfListener: %s' % message) app.idlequeue.remove_timeout(self.fd) app.idlequeue.unplug_idle(self.fd) self.fd = -1 self.started = False try: self._serv.close() except socket.error: pass self.conn_holder.kill_all_connections() def accept_conn(self): """ Accept a new incoming connection """ _sock = self._serv.accept() _sock[0].setblocking(False) return _sock class P2PClient(IdleObject): def __init__(self, _sock, addresses, conn_holder, stanzaqueue, to=None, on_ok=None, on_not_ok=None): self._owner = self self.Namespace = 'jabber:client' self.protocol_type = 'XMPP' self.defaultNamespace = self.Namespace self._component = 0 self._registered_name = None self._caller = conn_holder.caller self.conn_holder = conn_holder self.stanzaqueue = stanzaqueue self.to = to #self.Server = addresses[0]['host'] self.on_ok = on_ok self.on_not_ok = on_not_ok self.Connection = None self.sock_hash = None if _sock: self.sock_type = TYPE_SERVER else: self.sock_type = TYPE_CLIENT self.fd = -1 conn = P2PConnection('', _sock, addresses, self._caller, self.on_connect, self) self.Server = conn.host # set Server to the last host name / address tried if not self.conn_holder: # An error occured, disconnect() has been called if on_not_ok: on_not_ok('Connection to host could not be established.') return self.sock_hash = conn._sock.__hash__ self.fd = conn.fd self.conn_holder.add_connection(self, self.Server, conn.port, self.to) # count messages in queue for val in self.stanzaqueue: stanza, is_message = val if is_message: if self.fd == -1: if on_not_ok: on_not_ok( 'Connection to host could not be established.') return thread_id = stanza.getThread() id_ = stanza.getID() if not id_: id_ = self.Dispatcher.getAnID() if self.fd in self.conn_holder.ids_of_awaiting_messages: self.conn_holder.ids_of_awaiting_messages[self.fd].append(( id_, thread_id)) else: self.conn_holder.ids_of_awaiting_messages[self.fd] = [(id_, thread_id)] self.on_responses = {} def add_stanza(self, stanza, is_message=False): if self.Connection: if self.Connection.state == -1: return False self.send(stanza, is_message) else: self.stanzaqueue.append((stanza, is_message)) if is_message: thread_id = stanza.getThread() id_ = stanza.getID() if not id_: id_ = self.Dispatcher.getAnID() if self.fd in self.conn_holder.ids_of_awaiting_messages: self.conn_holder.ids_of_awaiting_messages[self.fd].append((id_, thread_id)) else: self.conn_holder.ids_of_awaiting_messages[self.fd] = [(id_, thread_id)] return True def on_message_sent(self, connection_id): id_, thread_id = \ self.conn_holder.ids_of_awaiting_messages[connection_id].pop(0) if self.on_ok: self.on_ok(id_) # use on_ok only on first message. For others it's called in # ClientZeroconf self.on_ok = None def on_connect(self, conn): self.Connection = conn self.Connection.PlugIn(self) dispatcher_nb.Dispatcher().PlugIn(self) self._register_handlers() def StreamInit(self): """ Send an initial stream header """ self.Dispatcher.Stream = simplexml.NodeBuilder() self.Dispatcher.Stream._dispatch_depth = 2 self.Dispatcher.Stream.dispatch = self.Dispatcher.dispatch self.Dispatcher.Stream.stream_header_received = self._check_stream_start self.Dispatcher.Stream.features = None if self.sock_type == TYPE_CLIENT: self.send_stream_header() def send_stream_header(self): self.Dispatcher._metastream = Node('stream:stream') self.Dispatcher._metastream.setNamespace(self.Namespace) self.Dispatcher._metastream.setAttr('version', '1.0') self.Dispatcher._metastream.setAttr('xmlns:stream', NS_STREAMS) self.Dispatcher._metastream.setAttr('from', self.conn_holder.zeroconf.name) if self.to: self.Dispatcher._metastream.setAttr('to', self.to) self.Dispatcher.send("%s>" % str( self.Dispatcher._metastream)[:-2]) def _check_stream_start(self, ns, tag, attrs): if ns != NS_STREAMS or tag != 'stream': log.error('Incorrect stream start: (%s,%s).Terminating!' % (tag, ns), 'error') self.Connection.disconnect() if self.on_not_ok: self.on_not_ok('Connection to host could not be established: ' 'Incorrect answer from server.') return if self.sock_type == TYPE_SERVER: if 'from' in attrs: self.to = attrs['from'] self.send_stream_header() if 'version' in attrs and attrs['version'] == '1.0': # other part supports stream features features = Node('stream:features') self.Dispatcher.send(features) while self.stanzaqueue: stanza, is_message = self.stanzaqueue.pop(0) self.send(stanza, is_message) elif self.sock_type == TYPE_CLIENT: while self.stanzaqueue: stanza, is_message = self.stanzaqueue.pop(0) self.send(stanza, is_message) def on_disconnect(self): if self.conn_holder: if self.fd in self.conn_holder.ids_of_awaiting_messages: del self.conn_holder.ids_of_awaiting_messages[self.fd] self.conn_holder.remove_connection(self.sock_hash) if 'Dispatcher' in self.__dict__: self.Dispatcher.PlugOut() if 'P2PConnection' in self.__dict__: self.P2PConnection.PlugOut() self.Connection = None self._caller = None self.conn_holder = None def force_disconnect(self): if self.Connection: self.disconnect() else: self.on_disconnect() def _on_receive_document_attrs(self, data): if data: self.Dispatcher.ProcessNonBlocking(data) if not hasattr(self, 'Dispatcher') or \ self.Dispatcher.Stream._document_attrs is None: return self.onreceive(None) if 'version' in self.Dispatcher.Stream._document_attrs and \ self.Dispatcher.Stream._document_attrs['version'] == '1.0': #~ self.onreceive(self._on_receive_stream_features) #XXX continue with TLS return self.onreceive(None) return True def remove_timeout(self): pass def _register_handlers(self): self._caller.peerhost = self.Connection._sock.getsockname() self.RegisterHandler('message', lambda conn, data:self._caller._messageCB(self.Server, conn, data)) self.RegisterHandler('iq', self._caller._siSetCB, 'set', nbxmpp.NS_SI) self.RegisterHandler('iq', self._caller._siErrorCB, 'error', nbxmpp.NS_SI) self.RegisterHandler('iq', self._caller._siResultCB, 'result', nbxmpp.NS_SI) self.RegisterHandler('iq', self._caller._bytestreamSetCB, 'set', nbxmpp.NS_BYTESTREAM) self.RegisterHandler('iq', self._caller._bytestreamResultCB, 'result', nbxmpp.NS_BYTESTREAM) self.RegisterHandler('iq', self._caller._bytestreamErrorCB, 'error', nbxmpp.NS_BYTESTREAM) self.RegisterHandler('iq', self._caller._DiscoverItemsGetCB, 'get', nbxmpp.NS_DISCO_ITEMS) self.RegisterHandler('iq', self._caller._JingleCB, 'result') self.RegisterHandler('iq', self._caller._JingleCB, 'error') self.RegisterHandler('iq', self._caller._JingleCB, 'set', nbxmpp.NS_JINGLE) class P2PConnection(IdleObject, PlugIn): def __init__(self, sock_hash, _sock, addresses=None, caller=None, on_connect=None, client=None): IdleObject.__init__(self) self._owner = client PlugIn.__init__(self) self.sendqueue = [] self.sendbuff = None self.buff_is_message = False self._sock = _sock self.sock_hash = None self.addresses = addresses self.on_connect = on_connect self.client = client self.writable = False self.readable = False self._exported_methods = [self.send, self.disconnect, self.onreceive] self.on_receive = None if _sock: self.host = addresses[0]['host'] self.port = addresses[0]['port'] self._sock = _sock self.state = 1 self._sock.setblocking(False) self.fd = self._sock.fileno() self.on_connect(self) else: self.state = 0 self.addresses_ = self.addresses self.get_next_addrinfo() def get_next_addrinfo(self): address = self.addresses_.pop(0) self.host = address['host'] self.port = address['port'] try: self.ais = socket.getaddrinfo(address['host'], address['port'], socket.AF_UNSPEC, socket.SOCK_STREAM) except socket.gaierror as e: log.info('Lookup failure for %s: %s[%s]', self.host, e[1], repr(e[0]), exc_info=True) if len(self.addresses_) > 0: return self.get_next_addrinfo() else: self.connect_to_next_ip() def connect_to_next_ip(self): if len(self.ais) == 0: log.error('Connection failure to %s', str(self.host), exc_info=True) if len(self.addresses_) > 0: return self.get_next_addrinfo() self.disconnect() return ai = self.ais.pop(0) log.info('Trying to connect to %s through %s:%s', str(self.host), ai[4][0], ai[4][1], exc_info=True) try: self._sock = socket.socket(*ai[:3]) self._sock.setblocking(False) self._server = ai[4] except socket.error: if sys.exc_value[0] != errno.EINPROGRESS: # for all errors, we try other addresses self.connect_to_next_ip() return self.fd = self._sock.fileno() app.idlequeue.plug_idle(self, True, False) self.set_timeout(CONNECT_TIMEOUT_SECONDS) self.do_connect() def set_timeout(self, timeout): app.idlequeue.remove_timeout(self.fd) if self.state >= 0: app.idlequeue.set_read_timeout(self.fd, timeout) def plugin(self, owner): self.onreceive(owner._on_receive_document_attrs) self._plug_idle() return True def plugout(self): """ Disconnect from the remote server and unregister self.disconnected method from the owner's dispatcher """ self.disconnect() self._owner = None def onreceive(self, recv_handler): if not recv_handler: if hasattr(self._owner, 'Dispatcher'): self.on_receive = self._owner.Dispatcher.ProcessNonBlocking else: self.on_receive = None return _tmp = self.on_receive # make sure this cb is not overriden by recursive calls if not recv_handler(None) and _tmp == self.on_receive: self.on_receive = recv_handler def send(self, packet, is_message=False, now=False): """ Append stanza to the queue of messages to be send if now is False, else send it instantly """ if self.state <= 0: return r = packet if now: self.sendqueue.insert(0, (r, is_message)) self._do_send() else: self.sendqueue.append((r, is_message)) self._plug_idle() def read_timeout(self): ids = self.client.conn_holder.ids_of_awaiting_messages if self.fd in ids and len(ids[self.fd]) > 0: for (id_, thread_id) in ids[self.fd]: if hasattr(self._owner, 'Dispatcher'): self._owner.Dispatcher.Event('', DATA_ERROR, ( self.client.to, thread_id)) else: self._owner.on_not_ok('connection timeout') ids[self.fd] = [] self.pollend() def do_connect(self): errnum = 0 try: self._sock.connect(self._server[:2]) self._sock.setblocking(False) except Exception as ee: errnum = ee.errno errstr = ee.strerror errors = (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK) if 'WSAEINVAL' in errno.__dict__: errors += (errno.WSAEINVAL,) if errnum in errors: return # win32 needs this elif errnum not in (0, 10056, errno.EISCONN) or self.state != 0: log.error('Could not connect to %s: %s [%s]', str(self.host), errnum, errstr) self.connect_to_next_ip() return else: # socket is already connected self._sock.setblocking(False) self.state = 1 # connected # we are connected self.on_connect(self) def pollout(self): if self.state == 0: self.do_connect() return app.idlequeue.remove_timeout(self.fd) self._do_send() def pollend(self): if self.state == 0: # error in connect()? #self.disconnect() self.connect_to_next_ip() else: self.state = -1 self.disconnect() def pollin(self): """ Reads all pending incoming data. Call owner's disconnected() method if appropriate """ received = '' errnum = 0 try: # get as many bites, as possible, but not more than RECV_BUFSIZE received = self._sock.recv(MAX_BUFF_LEN) except Exception as e: errnum = e.errno # "received" will be empty anyhow if errnum == ssl.SSL_ERROR_WANT_READ: pass elif errnum in [errno.ECONNRESET, errno.ENOTCONN, errno.ESHUTDOWN]: self.pollend() # don't proccess result, cas it will raise error return elif not received : if errnum != ssl.SSL_ERROR_EOF: # 8 EOF occurred in violation of protocol self.pollend() if self.state >= 0: self.disconnect() return if self.state < 0: return if self.on_receive: if self._owner.sock_type == TYPE_CLIENT: self.set_timeout(ACTIVITY_TIMEOUT_SECONDS) if received.strip(): log.debug('received: %s', received) if hasattr(self._owner, 'Dispatcher'): self._owner.Dispatcher.Event('', DATA_RECEIVED, received) self.on_receive(received) else: # This should never happed, so we need the debug log.error('Unhandled data received: %s' % received) self.disconnect() return True def disconnect(self, message=''): """ Close the socket """ app.idlequeue.remove_timeout(self.fd) app.idlequeue.unplug_idle(self.fd) try: self._sock.shutdown(socket.SHUT_RDWR) self._sock.close() except socket.error: # socket is already closed pass self.fd = -1 self.state = -1 if self._owner: self._owner.on_disconnect() def _do_send(self): if not self.sendbuff: if not self.sendqueue: return None # nothing to send self.sendbuff, self.buff_is_message = self.sendqueue.pop(0) self.sent_data = self.sendbuff try: send_count = self._sock.send(self.sendbuff) if send_count: self.sendbuff = self.sendbuff[send_count:] if not self.sendbuff and not self.sendqueue: if self.state < 0: app.idlequeue.unplug_idle(self.fd) self._on_send() self.disconnect() return # we are not waiting for write self._plug_idle() self._on_send() except socket.error as e: if e.errno == ssl.SSL_ERROR_WANT_WRITE: return True if self.state < 0: self.disconnect() return self._on_send_failure() return if self._owner.sock_type == TYPE_CLIENT: self.set_timeout(ACTIVITY_TIMEOUT_SECONDS) return True def _plug_idle(self): readable = self.state != 0 if self.sendqueue or self.sendbuff: writable = True else: writable = False if self.writable != writable or self.readable != readable: app.idlequeue.plug_idle(self, writable, readable) def _on_send(self): if self.sent_data and self.sent_data.strip(): log.debug('sent: %s' % self.sent_data) if hasattr(self._owner, 'Dispatcher'): self._owner.Dispatcher.Event('', DATA_SENT, self.sent_data) self.sent_data = None if self.buff_is_message: self._owner.on_message_sent(self.fd) self.buff_is_message = False def _on_send_failure(self): log.error('Socket error while sending data') self._owner.on_disconnect() self.sent_data = None class ClientZeroconf: def __init__(self, caller): self.caller = caller self.zeroconf = None self.roster = None self.last_msg = '' self.connections = {} self.recipient_to_hash = {} self.ip_to_hash = {} self.hash_to_port = {} self.listener = None self.ids_of_awaiting_messages = {} self.disconnect_handlers = [] self.disconnecting = False def connect(self, show, msg): self.port = self.start_listener(self.caller.port) if not self.port: return False self.zeroconf_init(show, msg) if not self.zeroconf.connect(): self.disconnect() return None self.roster = roster_zeroconf.Roster(self.zeroconf) return True def remove_announce(self): if self.zeroconf: return self.zeroconf.remove_announce() def announce(self): if self.zeroconf: return self.zeroconf.announce() def set_show_msg(self, show, msg): if self.zeroconf: self.zeroconf.txt['msg'] = msg self.last_msg = msg return self.zeroconf.update_txt(show) def resolve_all(self): if self.zeroconf: self.zeroconf.resolve_all() def reannounce(self, txt): self.remove_announce() self.zeroconf.txt = txt self.zeroconf.port = self.port self.zeroconf.username = self.caller.username return self.announce() def zeroconf_init(self, show, msg): self.zeroconf = zeroconf.Zeroconf(self.caller._on_new_service, self.caller._on_remove_service, self.caller._on_name_conflictCB, self.caller._on_disconnected, self.caller._on_error, self.caller.username, self.caller.host, self.port) self.zeroconf.txt['msg'] = msg self.zeroconf.txt['status'] = show self.zeroconf.txt['1st'] = self.caller.first self.zeroconf.txt['last'] = self.caller.last self.zeroconf.txt['jid'] = self.caller.jabber_id self.zeroconf.txt['email'] = self.caller.email self.zeroconf.username = self.caller.username self.zeroconf.host = self.caller.host self.zeroconf.port = self.port self.last_msg = msg def disconnect(self): # to avoid recursive calls if self.disconnecting: return if self.listener: self.listener.disconnect() self.listener = None if self.zeroconf: self.zeroconf.disconnect() self.zeroconf = None if self.roster: self.roster.zeroconf = None self.roster._data = None self.roster = None self.disconnecting = True for i in reversed(self.disconnect_handlers): log.debug('Calling disconnect handler %s' % i) i() self.disconnecting = False def start_disconnect(self): self.disconnect() def kill_all_connections(self): for connection in self.connections.values(): connection.force_disconnect() def add_connection(self, connection, ip, port, recipient): sock_hash=connection.sock_hash if sock_hash not in self.connections: self.connections[sock_hash] = connection self.ip_to_hash[ip] = sock_hash self.hash_to_port[sock_hash] = port if recipient: self.recipient_to_hash[recipient] = sock_hash def remove_connection(self, sock_hash): if sock_hash in self.connections: del self.connections[sock_hash] for i in self.recipient_to_hash: if self.recipient_to_hash[i] == sock_hash: del self.recipient_to_hash[i] break for i in self.ip_to_hash: if self.ip_to_hash[i] == sock_hash: del self.ip_to_hash[i] break if sock_hash in self.hash_to_port: del self.hash_to_port[sock_hash] def start_listener(self, port): for p in range(port, port + 5): self.listener = ZeroconfListener(p, self) self.listener.bind() if self.listener.started: return p self.listener = None return False def getRoster(self): if self.roster: return self.roster.getRoster() return {} def send(self, stanza, is_message=False, now=False, on_ok=None, on_not_ok=None): to = stanza.getTo() if to is None: # Can’t send undirected stanza over Zeroconf. return -1 to = to.getStripped() stanza.setFrom(self.roster.zeroconf.name) try: item = self.roster[to] except KeyError: # Contact offline return -1 # look for hashed connections if to in self.recipient_to_hash: conn = self.connections[self.recipient_to_hash[to]] id_ = stanza.getID() or '' if conn.add_stanza(stanza, is_message): if on_ok: on_ok(id_) return the_address = None for address in item['addresses']: if address['address'] in self.ip_to_hash: the_address = address if the_address and the_address['address'] in self.ip_to_hash: hash_ = self.ip_to_hash[the_address['address']] if self.hash_to_port[hash_] == the_address['port']: conn = self.connections[hash_] id_ = stanza.getID() or '' if conn.add_stanza(stanza, is_message): if on_ok: on_ok(id_) return # otherwise open new connection if not stanza.getID(): stanza.setID('zero') addresses_ = [] for address in item['addresses']: addresses_ += [{'host': address['address'], 'address': address['address'], 'port': address['port']}] P2PClient(None, addresses_, self, [(stanza, is_message)], to, on_ok=on_ok, on_not_ok=on_not_ok) def getAnID(self): """ Generate a random id """ return ''.join(Random().sample(string.ascii_letters + string.digits, 6)) def RegisterDisconnectHandler(self, handler): """ Register handler that will be called on disconnect """ self.disconnect_handlers.append(handler) def UnregisterDisconnectHandler(self, handler): """ Unregister handler that is called on disconnect """ self.disconnect_handlers.remove(handler) def SendAndWaitForResponse(self, stanza, timeout=None, func=None, args=None): """ Send stanza and wait for recipient's response to it. Will call transports on_timeout callback if response is not retrieved in time Be aware: Only timeout of latest call of SendAndWait is active. """ # if timeout is None: # timeout = DEFAULT_TIMEOUT_SECONDS def on_ok(_waitid): # if timeout: # self._owner.set_timeout(timeout) to = stanza.getTo() to = app.get_jid_without_resource(to) try: item = self.roster[to] except KeyError: # Contact offline item = None conn = None if to in self.recipient_to_hash: conn = self.connections[self.recipient_to_hash[to]] elif item: the_address = None for address in item['addresses']: if address['address'] in self.ip_to_hash: the_address = address if the_address and the_address['address'] in self.ip_to_hash: hash_ = self.ip_to_hash[the_address['address']] if self.hash_to_port[hash_] == the_address['port']: conn = self.connections[hash_] if func: conn.Dispatcher.on_responses[_waitid] = (func, args) conn.onreceive(conn.Dispatcher._WaitForData) conn.Dispatcher._expected[_waitid] = None self.send(stanza, on_ok=on_ok) def SendAndCallForResponse(self, stanza, func=None, args=None): """ Put stanza on the wire and call back when recipient replies. Additional callback arguments can be specified in args. """ self.SendAndWaitForResponse(stanza, 0, func, args) connection_handlers_zeroconf.py000066400000000000000000000063221326020644600333310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/zeroconf## ## Copyright (C) 2006 Gajim Team ## ## Contributors for this file: ## - Yann Leboulanger ## - Nikos Kouremenos ## - Dimitur Kirov ## - Travis Shirk ## - Stefan Bethge ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import nbxmpp from gajim.common import app from gajim.common.commands import ConnectionCommands from gajim.common.protocol.bytestream import ConnectionSocks5BytestreamZeroconf from gajim.common.connection_handlers_events import ZeroconfMessageReceivedEvent import logging log = logging.getLogger('gajim.c.z.connection_handlers_zeroconf') STATUS_LIST = ['offline', 'connecting', 'online', 'chat', 'away', 'xa', 'dnd', 'invisible'] # kind of events we can wait for an answer AGENT_REMOVED = 'agent_removed' from gajim.common import connection_handlers class ConnectionVcard(connection_handlers.ConnectionVcard): def add_sha(self, p, *args): return p def add_caps(self, p): return p def request_vcard(self, *args): pass def send_vcard(self, *args): pass class ConnectionHandlersZeroconf(ConnectionVcard, ConnectionSocks5BytestreamZeroconf, ConnectionCommands, connection_handlers.ConnectionPEP, connection_handlers.ConnectionHandlersBase, connection_handlers.ConnectionJingle): def __init__(self): ConnectionVcard.__init__(self) ConnectionSocks5BytestreamZeroconf.__init__(self) ConnectionCommands.__init__(self) connection_handlers.ConnectionJingle.__init__(self) connection_handlers.ConnectionHandlersBase.__init__(self) def _messageCB(self, ip, con, msg): """ Called when we receive a message """ log.debug('Zeroconf MessageCB') app.nec.push_incoming_event(ZeroconfMessageReceivedEvent(None, conn=self, stanza=msg, ip=ip)) return def store_metacontacts(self, tags): """ Fake empty method """ # serverside metacontacts are not supported with zeroconf # (there is no server) pass def _DiscoverItemsGetCB(self, con, iq_obj): log.debug('DiscoverItemsGetCB') if not self.connection or self.connected < 2: return if self.commandItemsQuery(con, iq_obj): raise nbxmpp.NodeProcessed node = iq_obj.getTagAttr('query', 'node') if node is None: result = iq_obj.buildReply('result') self.connection.send(result) raise nbxmpp.NodeProcessed if node==nbxmpp.NS_COMMANDS: self.commandListQuery(con, iq_obj) raise nbxmpp.NodeProcessed connection_zeroconf.py000066400000000000000000000365361326020644600314630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/zeroconf## common/zeroconf/connection_zeroconf.py ## ## Contributors for this file: ## - Yann Leboulanger ## - Nikos Kouremenos ## - Dimitur Kirov ## - Travis Shirk ## - Stefan Bethge ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2003-2004 Vincent Hanquez ## Copyright (C) 2006 Nikos Kouremenos ## Dimitur Kirov ## Travis Shirk ## Norman Rasmussen ## Stefan Bethge ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import os import socket import random random.seed() import nbxmpp import signal if os.name != 'nt': signal.signal(signal.SIGPIPE, signal.SIG_DFL) import getpass from gi.repository import GLib from gajim.common.connection import CommonConnection from gajim.common import app from gajim.common import ged from gajim.common.zeroconf import client_zeroconf from gajim.common.zeroconf import zeroconf from gajim.common.zeroconf.connection_handlers_zeroconf import * from gajim.common.connection_handlers_events import * log = logging.getLogger('gajim.c.connection_zeroconf') class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf): def __init__(self, name): ConnectionHandlersZeroconf.__init__(self) # system username self.username = None self.server_resource = '' # zeroconf has no resource, fake an empty one self.call_resolve_timeout = False # we don't need a password, but must be non-empty self.password = 'zeroconf' self.autoconnect = False self.httpupload = False CommonConnection.__init__(self, name) self.is_zeroconf = True app.ged.register_event_handler('stanza-message-outgoing', ged.OUT_CORE, self._nec_stanza_message_outgoing) def get_config_values_or_default(self): """ Get name, host, port from config, or create zeroconf account with default values """ self.host = socket.gethostname() app.config.set_per('accounts', app.ZEROCONF_ACC_NAME, 'hostname', self.host) self.port = app.config.get_per('accounts', app.ZEROCONF_ACC_NAME, 'custom_port') self.autoconnect = app.config.get_per('accounts', app.ZEROCONF_ACC_NAME, 'autoconnect') self.sync_with_global_status = app.config.get_per('accounts', app.ZEROCONF_ACC_NAME, 'sync_with_global_status') self.first = app.config.get_per('accounts', app.ZEROCONF_ACC_NAME, 'zeroconf_first_name') self.last = app.config.get_per('accounts', app.ZEROCONF_ACC_NAME, 'zeroconf_last_name') self.jabber_id = app.config.get_per('accounts', app.ZEROCONF_ACC_NAME, 'zeroconf_jabber_id') self.email = app.config.get_per('accounts', app.ZEROCONF_ACC_NAME, 'zeroconf_email') if not self.username: self.username = getpass.getuser() app.config.set_per('accounts', app.ZEROCONF_ACC_NAME, 'name', self.username) else: self.username = app.config.get_per('accounts', app.ZEROCONF_ACC_NAME, 'name') # END __init__ def check_jid(self, jid): return jid def get_own_jid(self): return nbxmpp.JID(self.username + '@' + self.host) def reconnect(self): # Do not try to reco while we are already trying self.time_to_reconnect = None log.debug('reconnect') self.disconnect() self.change_status(self.old_show, self.status) def disable_account(self): self.disconnect() def _on_resolve_timeout(self): if self.connected: self.connection.resolve_all() diffs = self.roster.getDiffs() for key in diffs: self.roster.setItem(key) app.nec.push_incoming_event(RosterInfoEvent(None, conn=self, jid=key, nickname=self.roster.getName(key), sub='both', ask='no', groups=self.roster.getGroups(key))) app.nec.push_incoming_event(ZeroconfPresenceReceivedEvent( None, conn=self, fjid=key, show=self.roster.getStatus(key), status=self.roster.getMessage(key))) #XXX open chat windows don't get refreshed (full name), add that return self.call_resolve_timeout # callbacks called from zeroconf def _on_new_service(self, jid): self.roster.setItem(jid) app.nec.push_incoming_event(RosterInfoEvent(None, conn=self, jid=jid, nickname=self.roster.getName(jid), sub='both', ask='no', groups=self.roster.getGroups(jid))) app.nec.push_incoming_event(ZeroconfPresenceReceivedEvent( None, conn=self, fjid=jid, show=self.roster.getStatus(jid), status=self.roster.getMessage(jid))) def _on_remove_service(self, jid): self.roster.delItem(jid) # 'NOTIFY' (account, (jid, status, status message, resource, priority, # keyID, timestamp, contact_nickname)) app.nec.push_incoming_event(ZeroconfPresenceReceivedEvent( None, conn=self, fjid=jid, show='offline', status='')) def disconnectedReconnCB(self): """ Called when we are disconnected. Comes from network manager for example we don't try to reconnect, network manager will tell us when we can """ if app.account_is_connected(self.name): # we cannot change our status to offline or connecting # after we auth to server self.old_show = STATUS_LIST[self.connected] self.connected = 0 app.nec.push_incoming_event(OurShowEvent(None, conn=self, show='offline')) # random number to show we wait network manager to send us a reconenct self.time_to_reconnect = 5 self.on_purpose = False def _on_name_conflictCB(self, alt_name): self.disconnect() app.nec.push_incoming_event(OurShowEvent(None, conn=self, show='offline')) app.nec.push_incoming_event(ZeroconfNameConflictEvent(None, conn=self, alt_name=alt_name)) def _on_error(self, message): app.nec.push_incoming_event(InformationEvent( None, dialog_name='avahi-error', args=message)) def connect(self, show='online', msg=''): self.get_config_values_or_default() if not self.connection: self.connection = client_zeroconf.ClientZeroconf(self) if not zeroconf.test_zeroconf(): app.nec.push_incoming_event(OurShowEvent(None, conn=self, show='offline')) self.status = 'offline' app.nec.push_incoming_event(ConnectionLostEvent(None, conn=self, title=_('Could not connect to "%s"') % self.name, msg=_('Please check if Avahi or Bonjour is installed.'))) self.disconnect() return result = self.connection.connect(show, msg) if not result: app.nec.push_incoming_event(OurShowEvent(None, conn=self, show='offline')) self.status = 'offline' if result is False: app.nec.push_incoming_event(ConnectionLostEvent(None, conn=self, title=_('Could not start local service'), msg=_('Unable to bind to port %d.' % self.port))) else: # result is None app.nec.push_incoming_event(ConnectionLostEvent(None, conn=self, title=_('Could not start local service'), msg=_('Please check if avahi-daemon is running.'))) self.disconnect() return else: self.connection.announce() self.roster = self.connection.getRoster() app.nec.push_incoming_event(RosterReceivedEvent(None, conn=self, xmpp_roster=self.roster)) # display contacts already detected and resolved for jid in self.roster.keys(): app.nec.push_incoming_event(RosterInfoEvent(None, conn=self, jid=jid, nickname=self.roster.getName(jid), sub='both', ask='no', groups=self.roster.getGroups(jid))) app.nec.push_incoming_event(ZeroconfPresenceReceivedEvent( None, conn=self, fjid=jid, show=self.roster.getStatus(jid), status=self.roster.getMessage(jid))) self.connected = STATUS_LIST.index(show) # refresh all contacts data every five seconds self.call_resolve_timeout = True GLib.timeout_add_seconds(5, self._on_resolve_timeout) return True def disconnect(self, on_purpose=False): self.connected = 0 self.time_to_reconnect = None if self.connection: self.connection.disconnect() self.connection = None # stop calling the timeout self.call_resolve_timeout = False def reannounce(self): if self.connected: txt = {} txt['1st'] = app.config.get_per('accounts', app.ZEROCONF_ACC_NAME, 'zeroconf_first_name') txt['last'] = app.config.get_per('accounts', app.ZEROCONF_ACC_NAME, 'zeroconf_last_name') txt['jid'] = app.config.get_per('accounts', app.ZEROCONF_ACC_NAME, 'zeroconf_jabber_id') txt['email'] = app.config.get_per('accounts', app.ZEROCONF_ACC_NAME, 'zeroconf_email') self.connection.reannounce(txt) def update_details(self): if self.connection: port = app.config.get_per('accounts', app.ZEROCONF_ACC_NAME, 'custom_port') if port != self.port: self.port = port last_msg = self.connection.last_msg self.disconnect() if not self.connect(self.status, last_msg): return if self.status != 'invisible': self.connection.announce() else: self.reannounce() def connect_and_init(self, show, msg, sign_msg): # to check for errors from zeroconf check = True if not self.connect(show, msg): return if show != 'invisible': check = self.connection.announce() else: self.connected = STATUS_LIST.index(show) app.nec.push_incoming_event(SignedInEvent(None, conn=self)) # stay offline when zeroconf does something wrong if check: app.nec.push_incoming_event(OurShowEvent(None, conn=self, show=show)) else: # show notification that avahi or system bus is down self.connected = 0 app.nec.push_incoming_event(OurShowEvent(None, conn=self, show='offline')) self.status = 'offline' app.nec.push_incoming_event(ConnectionLostEvent(None, conn=self, title=_('Could not change status of account "%s"') % self.name, msg=_('Please check if avahi-daemon is running.'))) def _change_to_invisible(self, msg): if self.connection.remove_announce(): app.nec.push_incoming_event(OurShowEvent(None, conn=self, show='invisible')) else: # show notification that avahi or system bus is down app.nec.push_incoming_event(OurShowEvent(None, conn=self, show='offline')) self.status = 'offline' app.nec.push_incoming_event(ConnectionLostEvent(None, conn=self, title=_('Could not change status of account "%s"') % self.name, msg=_('Please check if avahi-daemon is running.'))) def _change_from_invisible(self): self.connection.announce() def _update_status(self, show, msg, idle_time=None): if self.connection.set_show_msg(show, msg): app.nec.push_incoming_event(OurShowEvent(None, conn=self, show=show)) else: # show notification that avahi or system bus is down app.nec.push_incoming_event(OurShowEvent(None, conn=self, show='offline')) self.status = 'offline' app.nec.push_incoming_event(ConnectionLostEvent(None, conn=self, title=_('Could not change status of account "%s"') % self.name, msg=_('Please check if avahi-daemon is running.'))) def _nec_stanza_message_outgoing(self, obj): if obj.conn.name != self.name: return def on_send_ok(stanza_id): app.nec.push_incoming_event(MessageSentEvent(None, conn=self, jid=obj.jid, message=obj.message, keyID=obj.keyID, automatic_message=obj.automatic_message, chatstate=None, stanza_id=stanza_id)) self.log_message(obj, obj.jid) def on_send_not_ok(reason): reason += ' ' + _('Your message could not be sent.') app.nec.push_incoming_event(MessageErrorEvent(None, conn=self, fjid=obj.jid, error_code=-1, error_msg=reason, msg=None, time_=None, session=obj.session)) # Dont propagate event return True ret = self.connection.send( obj.msg_iq, obj.message is not None, on_ok=on_send_ok, on_not_ok=on_send_not_ok) if ret == -1: # Contact Offline app.nec.push_incoming_event(MessageErrorEvent(None, conn=self, fjid=obj.jid, error_code=-1, error_msg=_( 'Contact is offline. Your message could not be sent.'), msg=None, time_=None, session=obj.session)) # Dont propagate event return True def send_stanza(self, stanza): # send a stanza untouched if not self.connection: return if not isinstance(stanza, nbxmpp.Node): stanza = nbxmpp.Protocol(node=stanza) self.connection.send(stanza) def _event_dispatcher(self, realm, event, data): CommonConnection._event_dispatcher(self, realm, event, data) if realm == '': if event == nbxmpp.transports_nb.DATA_ERROR: thread_id = data[1] frm = data[0] session = self.get_or_create_session(frm, thread_id) app.nec.push_incoming_event(MessageErrorEvent( None, conn=self, fjid=frm, error_code=-1, error_msg=_( 'Connection to host could not be established: Timeout while ' 'sending data.'), msg=None, time_=None, session=session)) # END ConnectionZeroconf gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/zeroconf/roster_zeroconf.py000066400000000000000000000110231326020644600307010ustar00rootroot00000000000000## common/zeroconf/roster_zeroconf.py ## ## Copyright (C) 2006 Stefan Bethge ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gajim.common.zeroconf import zeroconf from gajim.common.zeroconf.zeroconf import Constant, ConstantRI class Roster: def __init__(self, zeroconf): self._data = None self.zeroconf = zeroconf # our zeroconf instance self.version = '' self.received_from_server = True def update_roster(self): for val in self.zeroconf.contacts.values(): self.setItem(val[Constant.NAME]) def getRoster(self): if self._data is None: self._data = {} self.update_roster() return self def getDiffs(self): """ Update the roster with new data and return dict with jid -> new status pairs to do notifications and stuff """ diffs = {} old_data = self._data.copy() self.update_roster() for key in old_data.keys(): if key in self._data: if old_data[key] != self._data[key]: diffs[key] = self._data[key]['status'] return diffs def setItem(self, jid, name='', groups=''): contact = self.zeroconf.get_contact(jid) if not contact: return addresses = [] i = 0 for ri in contact[Constant.RESOLVED_INFO]: addresses += [{}] addresses[i]['host'] = ri[ConstantRI.HOST] addresses[i]['address'] = ri[ConstantRI.ADDRESS] addresses[i]['port'] = ri[ConstantRI.PORT] i += 1 txt = contact[Constant.TXT] self._data[jid]={} self._data[jid]['ask'] = 'none' self._data[jid]['subscription'] = 'both' self._data[jid]['groups'] = [] self._data[jid]['resources'] = {} self._data[jid]['addresses'] = addresses txt_dict = self.zeroconf.txt_array_to_dict(txt) status = txt_dict.get('status', '') if not status: status = 'avail' nm = txt_dict.get('1st', '') if 'last' in txt_dict: if nm != '': nm += ' ' nm += txt_dict['last'] if nm: self._data[jid]['name'] = nm else: self._data[jid]['name'] = jid if status == 'avail': status = 'online' self._data[jid]['txt_dict'] = txt_dict if 'msg' not in self._data[jid]['txt_dict']: self._data[jid]['txt_dict']['msg'] = '' self._data[jid]['status'] = status self._data[jid]['show'] = status def setItemMulti(self, items): for i in items: self.setItem(jid=i['jid'], name=i['name'], groups=i['groups']) def delItem(self, jid): if jid in self._data: del self._data[jid] def getItem(self, jid): if jid in self._data: return self._data[jid] def __getitem__(self, jid): return self._data[jid] def getItems(self): # Return list of all [bare] JIDs that the roster currently tracks. return self._data.keys() def keys(self): return self._data.keys() def getRaw(self): return self._data def getResources(self, jid): return {} def getGroups(self, jid): return self._data[jid]['groups'] def getName(self, jid): if jid in self._data: return self._data[jid]['name'] def getStatus(self, jid): if jid in self._data: return self._data[jid]['status'] def getMessage(self, jid): if jid in self._data: return self._data[jid]['txt_dict']['msg'] def getShow(self, jid): return self.getStatus(jid) def getPriority(self, jid): return 5 def getSubscription(self, jid): return 'both' def Subscribe(self, jid): pass def Unsubscribe(self, jid): pass def Authorize(self, jid): pass def Unauthorize(self, jid): pass gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/zeroconf/zeroconf.py000066400000000000000000000030561326020644600273120ustar00rootroot00000000000000## common/zeroconf/zeroconf.py ## ## Copyright (C) 2006 Stefan Bethge ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from enum import IntEnum, unique @unique class Constant(IntEnum): NAME = 0 DOMAIN = 1 RESOLVED_INFO = 2 BARE_NAME = 3 TXT = 4 @unique class ConstantRI(IntEnum): INTERFACE = 0 PROTOCOL = 1 HOST = 2 APROTOCOL = 3 ADDRESS = 4 PORT = 5 def test_avahi(): try: import avahi except ImportError: return False return True def test_bonjour(): try: import pybonjour except ImportError: return False except WindowsError: # pylint: disable=undefined-variable return False return True def test_zeroconf(): return test_avahi() or test_bonjour() if test_avahi(): from gajim.common.zeroconf import zeroconf_avahi Zeroconf = zeroconf_avahi.Zeroconf elif test_bonjour(): from gajim.common.zeroconf import zeroconf_bonjour Zeroconf = zeroconf_bonjour.Zeroconf gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/zeroconf/zeroconf_avahi.py000066400000000000000000000446171326020644600304720ustar00rootroot00000000000000## common/zeroconf/zeroconf.py ## ## Copyright (C) 2006 Stefan Bethge ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import logging log = logging.getLogger('gajim.c.z.zeroconf_avahi') try: import dbus.exceptions except ImportError: pass from gajim.common.zeroconf.zeroconf import Constant, ConstantRI class Zeroconf: def __init__(self, new_serviceCB, remove_serviceCB, name_conflictCB, disconnected_CB, error_CB, name, host, port): self.avahi = None self.domain = None # specific domain to browse self.stype = '_presence._tcp' self.port = port # listening port that gets announced self.username = name self.host = host self.txt = {} # service data #XXX these CBs should be set to None when we destroy the object # (go offline), because they create a circular reference self.new_serviceCB = new_serviceCB self.remove_serviceCB = remove_serviceCB self.name_conflictCB = name_conflictCB self.disconnected_CB = disconnected_CB self.error_CB = error_CB self.service_browser = None self.domain_browser = None self.bus = None self.server = None self.contacts = {} # all current local contacts with data self.entrygroup = None self.connected = False self.announced = False self.invalid_self_contact = {} ## handlers for dbus callbacks def entrygroup_commit_error_CB(self, err): # left blank for possible later usage pass def error_callback1(self, err): log.debug('Error while resolving: ' + str(err)) def error_callback(self, err): log.debug(str(err)) # timeouts are non-critical if str(err) != 'Timeout reached': self.disconnect() self.disconnected_CB() def new_service_callback(self, interface, protocol, name, stype, domain, flags): log.debug('Found service %s in domain %s on %i.%i.' % (name, domain, interface, protocol)) if not self.connected: return # synchronous resolving self.server.ResolveService( int(interface), int(protocol), name, stype, domain, self.avahi.PROTO_UNSPEC, dbus.UInt32(0), reply_handler=self.service_resolved_callback, error_handler=self.error_callback1) def remove_service_callback(self, interface, protocol, name, stype, domain, flags): log.debug('Service %s in domain %s on %i.%i disappeared.' % (name, domain, interface, protocol)) if not self.connected: return if name != self.name: for key in self.contacts.keys(): val = self.contacts[key] if val[Constant.BARE_NAME] == name: # try to reduce instead of delete first resolved_info = val[Constant.RESOLVED_INFO] if len(resolved_info) > 1: for i in range(len(resolved_info)): if resolved_info[i][ConstantRI.INTERFACE] == interface and resolved_info[i][ConstantRI.PROTOCOL] == protocol: del self.contacts[key][Constant.RESOLVED_INFO][i] # if still something left, don't remove if len(self.contacts[key][Constant.RESOLVED_INFO]) > 1: return del self.contacts[key] self.remove_serviceCB(key) return def new_service_type(self, interface, protocol, stype, domain, flags): # Are we already browsing this domain for this type? if self.service_browser: return object_path = self.server.ServiceBrowserNew(interface, protocol, \ stype, domain, dbus.UInt32(0)) self.service_browser = dbus.Interface(self.bus.get_object( self.avahi.DBUS_NAME, object_path), self.avahi.DBUS_INTERFACE_SERVICE_BROWSER) self.service_browser.connect_to_signal('ItemNew', self.new_service_callback) self.service_browser.connect_to_signal('ItemRemove', self.remove_service_callback) self.service_browser.connect_to_signal('Failure', self.error_callback) def new_domain_callback(self, interface, protocol, domain, flags): if domain != 'local': self.browse_domain(interface, protocol, domain) def txt_array_to_dict(self, txt_array): txt_dict = {} for els in txt_array: key, val = '', None for c in els: c = chr(c) if val is None: if c == '=': val = '' else: key += c else: val += c if val is None: # missing '=' val = '' txt_dict[key] = val return txt_dict def service_resolved_callback(self, interface, protocol, name, stype, domain, host, aprotocol, address, port, txt, flags): log.debug('Service data for service %s in domain %s on %i.%i:' % (name, domain, interface, protocol)) log.debug('Host %s (%s), port %i, TXT data: %s' % (host, address, port, self.txt_array_to_dict(txt))) if not self.connected: return bare_name = name if name.find('@') == -1: name = name + '@' + name # we don't want to see ourselves in the list if name != self.name: resolved_info = [(interface, protocol, host, aprotocol, address, port)] if name in self.contacts: # Decide whether to try to merge with existing resolved info: old_name, old_domain, old_resolved_info, old_bare_name, old_txt = self.contacts[name] if name == old_name and domain == old_domain and bare_name == old_bare_name: # Seems similar enough, try to merge resolved info: for i in range(len(old_resolved_info)): # for now, keep a single record for each (interface, protocol) pair # # Note that, theoretically, we could both get IPv4 and # IPv6 aprotocol responses via the same protocol, # so this probably needs to be revised again. if old_resolved_info[i][0:2] == (interface, protocol): log.debug('Deleting resolved info for interface %i, protocol %i, host %s, aprotocol %i, address %s, port %i' % old_resolved_info[i]) del old_resolved_info[i] break resolved_info = resolved_info + old_resolved_info log.debug('Collected resolved info is now: %s' % (resolved_info,)) self.contacts[name] = (name, domain, resolved_info, bare_name, txt) self.new_serviceCB(name) else: # remember data # In case this is not our own record but of another # gajim instance on the same machine, # it will be used when we get a new name. self.invalid_self_contact[name] = (name, domain, (interface, protocol, host, aprotocol, address, port), bare_name, txt) # different handler when resolving all contacts def service_resolved_all_callback(self, interface, protocol, name, stype, domain, host, aprotocol, address, port, txt, flags): if not self.connected: return bare_name = name if name.find('@') == -1: name = name + '@' + name # update TXT data only, as intended according to resolve_all comment old_contact = self.contacts[name] self.contacts[name] = old_contact[0:Constant.TXT] + (txt,) + old_contact[Constant.TXT+1:] def service_added_callback(self): log.debug('Service successfully added') def service_committed_callback(self): log.debug('Service successfully committed') def service_updated_callback(self): log.debug('Service successfully updated') def service_add_fail_callback(self, err): log.debug('Error while adding service. %s' % str(err)) if 'Local name collision' in str(err): alternative_name = self.server.GetAlternativeServiceName(self.username) self.name_conflictCB(alternative_name) return self.error_CB(_('Error while adding service. %s') % str(err)) self.disconnect() def server_state_changed_callback(self, state, error): log.debug('server state changed to %s' % state) if state == self.avahi.SERVER_RUNNING: self.create_service() elif state in (self.avahi.SERVER_COLLISION, self.avahi.SERVER_REGISTERING): self.disconnect() self.entrygroup.Reset() elif state == self.avahi.CLIENT_FAILURE: # does it ever go here? log.debug('CLIENT FAILURE') def entrygroup_state_changed_callback(self, state, error): # the name is already present, so recreate if state == self.avahi.ENTRY_GROUP_COLLISION: log.debug('zeroconf.py: local name collision') self.service_add_fail_callback('Local name collision') elif state == self.avahi.ENTRY_GROUP_FAILURE: self.disconnect() self.entrygroup.Reset() log.debug('zeroconf.py: ENTRY_GROUP_FAILURE reached(that' ' should not happen)') # make zeroconf-valid names def replace_show(self, show): if show in ['chat', 'online', '']: return 'avail' elif show == 'xa': return 'away' return show def avahi_txt(self): return self.avahi.dict_to_txt_array(self.txt) def create_service(self): try: if not self.entrygroup: # create an EntryGroup for publishing self.entrygroup = dbus.Interface(self.bus.get_object( self.avahi.DBUS_NAME, self.server.EntryGroupNew()), self.avahi.DBUS_INTERFACE_ENTRY_GROUP) self.entrygroup.connect_to_signal('StateChanged', self.entrygroup_state_changed_callback) txt = {} # remove empty keys for key, val in self.txt.items(): if val: txt[key] = val txt['port.p2pj'] = self.port txt['version'] = 1 txt['txtvers'] = 1 # replace gajim's show messages with compatible ones if 'status' in self.txt: txt['status'] = self.replace_show(self.txt['status']) else: txt['status'] = 'avail' self.txt = txt log.debug('Publishing service %s of type %s' % (self.name, self.stype)) self.entrygroup.AddService(self.avahi.IF_UNSPEC, self.avahi.PROTO_UNSPEC, dbus.UInt32(0), self.name, self.stype, '', '', dbus.UInt16(self.port), self.avahi_txt(), reply_handler=self.service_added_callback, error_handler=self.service_add_fail_callback) self.entrygroup.Commit(reply_handler=self.service_committed_callback, error_handler=self.entrygroup_commit_error_CB) return True except dbus.DBusException as e: log.debug(str(e)) return False def announce(self): if not self.connected: return False state = self.server.GetState() if state == self.avahi.SERVER_RUNNING: if self.create_service(): self.announced = True return True return False def remove_announce(self): if self.announced == False: return False try: if self.entrygroup.GetState() != self.avahi.ENTRY_GROUP_FAILURE: self.entrygroup.Reset() self.entrygroup.Free() # .Free() has mem leaks self.entrygroup._obj._bus = None self.entrygroup._obj = None self.entrygroup = None self.announced = False return True else: return False except dbus.DBusException: log.debug("Can't remove service. That should not happen") def browse_domain(self, interface, protocol, domain): self.new_service_type(interface, protocol, self.stype, domain, '') def avahi_dbus_connect_cb(self, a, connect, disconnect): if connect != "": log.debug('Lost connection to avahi-daemon') self.disconnect() if self.disconnected_CB: self.disconnected_CB() else: log.debug('We are connected to avahi-daemon') # connect to dbus def connect_dbus(self): try: import dbus except ImportError: log.debug('Error: python-dbus needs to be installed. No ' 'zeroconf support.') return False if self.bus: return True try: self.bus = dbus.SystemBus() self.bus.add_signal_receiver(self.avahi_dbus_connect_cb, 'NameOwnerChanged', 'org.freedesktop.DBus', arg0='org.freedesktop.Avahi') except Exception as e: # System bus is not present self.bus = None log.debug(str(e)) return False else: return True # connect to avahi def connect_avahi(self): if not self.connect_dbus(): return False try: import avahi self.avahi = avahi except ImportError: log.debug('Error: python-avahi needs to be installed. No ' 'zeroconf support.') return False if self.server: return True try: self.server = dbus.Interface(self.bus.get_object(self.avahi.DBUS_NAME, self.avahi.DBUS_PATH_SERVER), self.avahi.DBUS_INTERFACE_SERVER) self.server.connect_to_signal('StateChanged', self.server_state_changed_callback) except Exception as e: # Avahi service is not present self.server = None log.debug(str(e)) return False else: return True def connect(self): self.name = self.username + '@' + self.host # service name if not self.connect_avahi(): return False self.connected = True # start browsing if self.domain is None: # Explicitly browse .local self.browse_domain(self.avahi.IF_UNSPEC, self.avahi.PROTO_UNSPEC, 'local') # Browse for other browsable domains self.domain_browser = dbus.Interface(self.bus.get_object( self.avahi.DBUS_NAME, self.server.DomainBrowserNew( self.avahi.IF_UNSPEC, self.avahi.PROTO_UNSPEC, '', self.avahi.DOMAIN_BROWSER_BROWSE, dbus.UInt32(0))), self.avahi.DBUS_INTERFACE_DOMAIN_BROWSER) self.domain_browser.connect_to_signal('ItemNew', self.new_domain_callback) self.domain_browser.connect_to_signal('Failure', self.error_callback) else: self.browse_domain(self.avahi.IF_UNSPEC, self.avahi.PROTO_UNSPEC, self.domain) return True def disconnect(self): if self.connected: self.connected = False if self.service_browser: try: self.service_browser.Free() except dbus.DBusException as e: log.debug(str(e)) self.service_browser._obj._bus = None self.service_browser._obj = None if self.domain_browser: try: self.domain_browser.Free() except dbus.DBusException as e: log.debug(str(e)) self.domain_browser._obj._bus = None self.domain_browser._obj = None self.remove_announce() self.server._obj._bus = None self.server._obj = None self.server = None self.service_browser = None self.domain_browser = None # refresh txt data of all contacts manually (no callback available) def resolve_all(self): if not self.connected: return for val in self.contacts.values(): # get txt data from last recorded resolved info # TODO: Better try to get it from last IPv6 mDNS, then last IPv4? ri = val[Constant.RESOLVED_INFO][0] self.server.ResolveService(int(ri[ConstantRI.INTERFACE]), int(ri[ConstantRI.PROTOCOL]), val[Constant.BARE_NAME], self.stype, val[Constant.DOMAIN], self.avahi.PROTO_UNSPEC, dbus.UInt32(0), reply_handler=self.service_resolved_all_callback, error_handler=self.error_callback) def get_contacts(self): return self.contacts def get_contact(self, jid): if not jid in self.contacts: return None return self.contacts[jid] def update_txt(self, show = None): if show: self.txt['status'] = self.replace_show(show) txt = self.avahi_txt() if self.connected and self.entrygroup: self.entrygroup.UpdateServiceTxt(self.avahi.IF_UNSPEC, self.avahi.PROTO_UNSPEC, dbus.UInt32(0), self.name, self.stype, '', txt, reply_handler=self.service_updated_callback, error_handler=self.error_callback) return True else: return False # END Zeroconf gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/common/zeroconf/zeroconf_bonjour.py000066400000000000000000000264751326020644600310620ustar00rootroot00000000000000## common/zeroconf/zeroconf_bonjour.py ## ## Copyright (C) 2006 Stefan Bethge ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gajim.common import app import select import re import logging from gajim.common.zeroconf.zeroconf import Constant log = logging.getLogger('gajim.c.z.zeroconf_bonjour') try: import pybonjour except ImportError: pass resolve_timeout = 1 class Zeroconf: def __init__(self, new_serviceCB, remove_serviceCB, name_conflictCB, disconnected_CB, error_CB, name, host, port): self.domain = None # specific domain to browse self.stype = '_presence._tcp' self.port = port # listening port that gets announced self.username = name self.host = host self.txt = pybonjour.TXTRecord() # service data # XXX these CBs should be set to None when we destroy the object # (go offline), because they create a circular reference self.new_serviceCB = new_serviceCB self.remove_serviceCB = remove_serviceCB self.name_conflictCB = name_conflictCB self.disconnected_CB = disconnected_CB self.error_CB = error_CB self.contacts = {} # all current local contacts with data self.connected = False self.announced = False self.invalid_self_contact = {} self.resolved = [] def browse_callback(self, sdRef, flags, interfaceIndex, errorCode, serviceName, regtype, replyDomain): log.debug('Found service %s in domain %s on %i(type: %s).' % (serviceName, replyDomain, interfaceIndex, regtype)) if not self.connected: return if errorCode != pybonjour.kDNSServiceErr_NoError: return if not (flags & pybonjour.kDNSServiceFlagsAdd): self.remove_service_callback(serviceName) return # asynchronous resolving resolve_sdRef = pybonjour.DNSServiceResolve(0, interfaceIndex, serviceName, regtype, replyDomain, self.service_resolved_callback) try: while not self.resolved: ready = select.select([resolve_sdRef], [], [], resolve_timeout) if resolve_sdRef not in ready[0]: log.debug('Resolve timed out') break pybonjour.DNSServiceProcessResult(resolve_sdRef) else: self.resolved.pop() finally: resolve_sdRef.close() def remove_service_callback(self, name): log.debug('Service %s disappeared.' % name) if not self.connected: return if name != self.name: for key in self.contacts.keys(): if self.contacts[key][Constant.BARE_NAME] == name: del self.contacts[key] self.remove_serviceCB(key) return def new_domain_callback(self, interface, protocol, domain, flags): if domain != "local": self.browse_domain(domain) # takes a TXTRecord instance def txt_array_to_dict(self, txt): items = pybonjour.TXTRecord.parse(txt)._items return dict((v[0], v[1]) for v in items.values()) def service_resolved_callback(self, sdRef, flags, interfaceIndex, errorCode, fullname, hosttarget, port, txtRecord): # TODO: do proper decoding... escaping= { r'\.': '.', r'\032': ' ', r'\064': '@', } # Split on '.' but do not split on '\.' result = re.split('(? ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2005 Alex Podaras ## Stéphan Kochen ## Copyright (C) 2005-2006 Dimitur Kirov ## Nikos Kouremenos ## Copyright (C) 2006 Junglecow J ## Copyright (C) 2006-2007 Travis Shirk ## Stefan Bethge ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2007 James Newton ## Julien Pivotto ## Copyright (C) 2007-2008 Stephan Erb ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import os from gi.repository import Gtk from gi.repository import Gdk from gi.repository import Pango from gi.repository import GObject from gi.repository import GLib from gajim.common import config as c_config from gajim.common import sleepy from gajim.common.i18n import Q_ from gajim import gtkgui_helpers from gajim import dialogs from gajim import cell_renderer_image from gajim import message_control from gajim.chat_control_base import ChatControlBase from gajim.gajim_themes_window import GajimThemesWindow from gajim.advanced_configuration_window import AdvancedConfigurationWindow from gajim import dataforms_widget from gajim import gui_menu_builder from gajim.common import helpers from gajim.common import app from gajim.common import connection from gajim.common import dataforms from gajim.common import ged from gajim.accounts_window import AccountsWindow try: from gajim.common.multimedia_helpers import AudioInputManager, AudioOutputManager from gajim.common.multimedia_helpers import VideoInputManager, VideoOutputManager HAS_GST = True except (ImportError, ValueError): HAS_GST = False if app.HAVE_SPELL: from gi.repository import Gspell #---------- PreferencesWindow class -------------# class PreferencesWindow: """ Class for Preferences window """ def on_preferences_window_destroy(self, widget): """ Close window """ del app.interface.instances['preferences'] def on_close_button_clicked(self, widget): self.window.destroy() def __init__(self): """ Initialize Preferences window """ self.xml = gtkgui_helpers.get_gtk_builder('preferences_window.ui') self.window = self.xml.get_object('preferences_window') self.window.set_transient_for(app.interface.roster.window) self.notebook = self.xml.get_object('preferences_notebook') self.one_window_type_combobox = self.xml.get_object( 'one_window_type_combobox') self.iconset_combobox = self.xml.get_object('iconset_combobox') self.notify_on_signin_checkbutton = self.xml.get_object( 'notify_on_signin_checkbutton') self.notify_on_signout_checkbutton = self.xml.get_object( 'notify_on_signout_checkbutton') self.auto_popup_away_checkbutton = self.xml.get_object( 'auto_popup_away_checkbutton') self.auto_popup_chat_opened_checkbutton = self.xml.get_object( 'auto_popup_chat_opened_checkbutton') self.sound_dnd_checkbutton = self.xml.get_object('sound_dnd_checkbutton') self.auto_away_checkbutton = self.xml.get_object('auto_away_checkbutton') self.auto_away_time_spinbutton = self.xml.get_object( 'auto_away_time_spinbutton') self.auto_away_message_entry = self.xml.get_object( 'auto_away_message_entry') self.auto_xa_checkbutton = self.xml.get_object('auto_xa_checkbutton') self.auto_xa_time_spinbutton = self.xml.get_object( 'auto_xa_time_spinbutton') self.auto_xa_message_entry = self.xml.get_object('auto_xa_message_entry') ### General tab ### # Display avatars in roster st = app.config.get('show_avatars_in_roster') self.xml.get_object('show_avatars_in_roster_checkbutton'). \ set_active(st) # Display status msg under contact name in roster st = app.config.get('show_status_msgs_in_roster') self.xml.get_object('show_status_msgs_in_roster_checkbutton'). \ set_active( st) # Display PEP in roster st1 = app.config.get('show_mood_in_roster') st2 = app.config.get('show_activity_in_roster') st3 = app.config.get('show_tunes_in_roster') st4 = app.config.get('show_location_in_roster') w = self.xml.get_object('show_pep_in_roster_checkbutton') if st1 == st2 == st3 == st4: w.set_active(st1) else: w.set_inconsistent(True) # Sort contacts by show st = app.config.get('sort_by_show_in_roster') self.xml.get_object('sort_by_show_in_roster_checkbutton').set_active(st) st = app.config.get('sort_by_show_in_muc') self.xml.get_object('sort_by_show_in_muc_checkbutton').set_active(st) # emoticons emoticons_combobox = self.xml.get_object('emoticons_combobox') emoticon_themes = helpers.get_available_emoticon_themes() emoticons_combobox.append_text(_('Disabled')) for theme in emoticon_themes: emoticons_combobox.append_text(theme) config_theme = app.config.get('emoticons_theme') if config_theme not in emoticon_themes: config_theme = _('Disabled') emoticons_combobox.set_id_column(0) emoticons_combobox.set_active_id(config_theme) # Set default for single window type choices = c_config.opt_one_window_types type_ = app.config.get('one_message_window') if type_ in choices: self.one_window_type_combobox.set_active(choices.index(type_)) else: self.one_window_type_combobox.set_active(0) # Show roster on startup show_roster_combobox = self.xml.get_object('show_roster_on_startup') choices = c_config.opt_show_roster_on_startup type_ = app.config.get('show_roster_on_startup') if type_ in choices: show_roster_combobox.set_active(choices.index(type_)) else: show_roster_combobox.set_active(0) # Ignore XHTML st = app.config.get('ignore_incoming_xhtml') self.xml.get_object('xhtml_checkbutton').set_active(st) # use speller if app.HAVE_SPELL: st = app.config.get('use_speller') self.xml.get_object('speller_checkbutton').set_active(st) else: self.xml.get_object('speller_checkbutton').set_sensitive(False) # XEP-0184 positive ack st = app.config.get('positive_184_ack') self.xml.get_object('positive_184_ack_checkbutton').set_active(st) # Show avatar in tabs st = app.config.get('show_avatar_in_tabs') self.xml.get_object('show_avatar_in_tabs_checkbutton').set_active(st) ### Style tab ### # Themes theme_combobox = self.xml.get_object('theme_combobox') cell = Gtk.CellRendererText() theme_combobox.pack_start(cell, True) theme_combobox.add_attribute(cell, 'text', 0) self.update_theme_list() # iconset iconsets_list = os.listdir(os.path.join(app.DATA_DIR, 'iconsets')) if os.path.isdir(app.MY_ICONSETS_PATH): iconsets_list += os.listdir(app.MY_ICONSETS_PATH) # new model, image in 0, string in 1 model = Gtk.ListStore(Gtk.Image, str) renderer_image = cell_renderer_image.CellRendererImage(0, 0) renderer_text = Gtk.CellRendererText() renderer_text.set_property('xpad', 5) self.iconset_combobox.pack_start(renderer_image, False) self.iconset_combobox.pack_start(renderer_text, True) self.iconset_combobox.add_attribute(renderer_text, 'text', 1) self.iconset_combobox.add_attribute(renderer_image, 'image', 0) self.iconset_combobox.set_model(model) l = [] for dir in iconsets_list: if not os.path.isdir(os.path.join(app.DATA_DIR, 'iconsets', dir)) \ and not os.path.isdir(os.path.join(app.MY_ICONSETS_PATH, dir)): continue if dir != '.svn' and dir != 'transports': l.append(dir) if l.count == 0: l.append(' ') for i in range(len(l)): preview = Gtk.Image() files = [] files.append(os.path.join(helpers.get_iconset_path(l[i]), '16x16', 'online.png')) files.append(os.path.join(helpers.get_iconset_path(l[i]), '16x16', 'online.gif')) for file_ in files: if os.path.exists(file_): preview.set_from_file(file_) model.append([preview, l[i]]) if app.config.get('iconset') == l[i]: self.iconset_combobox.set_active(i) # Use transports iconsets st = app.config.get('use_transports_iconsets') self.xml.get_object('transports_iconsets_checkbutton').set_active(st) # Color widgets self.draw_color_widgets() # Font for messages font = app.config.get('conversation_font') # try to set default font for the current desktop env fontbutton = self.xml.get_object('conversation_fontbutton') if font == '': fontbutton.set_sensitive(False) self.xml.get_object('default_chat_font').set_active(True) else: fontbutton.set_font_name(font) ### Personal Events tab ### # outgoing send chat state notifications st = app.config.get('outgoing_chat_state_notifications') combo = self.xml.get_object('outgoing_chat_states_combobox') if st == 'all': combo.set_active(0) elif st == 'composing_only': combo.set_active(1) else: # disabled combo.set_active(2) # displayed send chat state notifications st = app.config.get('displayed_chat_state_notifications') combo = self.xml.get_object('displayed_chat_states_combobox') if st == 'all': combo.set_active(0) elif st == 'composing_only': combo.set_active(1) else: # disabled combo.set_active(2) ### Notifications tab ### # On new event on_event_combobox = self.xml.get_object('on_event_combobox') if app.config.get('autopopup'): on_event_combobox.set_active(0) elif app.config.get('notify_on_new_message'): on_event_combobox.set_active(1) else: on_event_combobox.set_active(2) # notify on online statuses st = app.config.get('notify_on_signin') self.notify_on_signin_checkbutton.set_active(st) # notify on offline statuses st = app.config.get('notify_on_signout') self.notify_on_signout_checkbutton.set_active(st) # autopopupaway st = app.config.get('autopopupaway') self.auto_popup_away_checkbutton.set_active(st) # autopopup_chat_opened st = app.config.get('autopopup_chat_opened') self.auto_popup_chat_opened_checkbutton.set_active(st) # sounddnd st = app.config.get('sounddnd') self.sound_dnd_checkbutton.set_active(st) # Systray systray_combobox = self.xml.get_object('systray_combobox') if app.config.get('trayicon') == 'never': systray_combobox.set_active(0) elif app.config.get('trayicon') == 'on_event': systray_combobox.set_active(1) else: systray_combobox.set_active(2) # sounds if app.config.get('sounds_on'): self.xml.get_object('play_sounds_checkbutton').set_active(True) else: self.xml.get_object('manage_sounds_button').set_sensitive(False) #### Status tab ### # Autoaway st = app.config.get('autoaway') self.auto_away_checkbutton.set_active(st) # Autoawaytime st = app.config.get('autoawaytime') self.auto_away_time_spinbutton.set_value(st) self.auto_away_time_spinbutton.set_sensitive(app.config.get('autoaway')) # autoaway message st = app.config.get('autoaway_message') self.auto_away_message_entry.set_text(st) self.auto_away_message_entry.set_sensitive(app.config.get('autoaway')) # Autoxa st = app.config.get('autoxa') self.auto_xa_checkbutton.set_active(st) # Autoxatime st = app.config.get('autoxatime') self.auto_xa_time_spinbutton.set_value(st) self.auto_xa_time_spinbutton.set_sensitive(app.config.get('autoxa')) # autoxa message st = app.config.get('autoxa_message') self.auto_xa_message_entry.set_text(st) self.auto_xa_message_entry.set_sensitive(app.config.get('autoxa')) if not sleepy.SUPPORTED: self.xml.get_object('autoaway_table').set_sensitive(False) # ask_status when online / offline st = app.config.get('ask_online_status') self.xml.get_object('prompt_online_status_message_checkbutton').\ set_active(st) st = app.config.get('ask_offline_status') self.xml.get_object('prompt_offline_status_message_checkbutton').\ set_active(st) # Default Status messages self.default_msg_tree = self.xml.get_object('default_msg_treeview') self.fill_default_msg_treeview() # Status messages self.msg_tree = self.xml.get_object('msg_treeview') renderer = Gtk.CellRendererText() renderer.connect('edited', self.on_msg_cell_edited) renderer.set_property('editable', True) col = Gtk.TreeViewColumn('name', renderer, text=0) self.msg_tree.append_column(col) self.fill_msg_treeview() buf = self.xml.get_object('msg_textview').get_buffer() buf.connect('end-user-action', self.on_msg_textview_changed) ### Audio / Video tab ### def create_av_combobox(opt_name, device_dict, config_name=None, key=None): combobox = self.xml.get_object(opt_name + '_combobox') cell = Gtk.CellRendererText() cell.set_property('ellipsize', Pango.EllipsizeMode.END) cell.set_property('ellipsize-set', True) combobox.pack_start(cell, True) combobox.add_attribute(cell, 'text', 0) model = Gtk.ListStore(str, str) combobox.set_model(model) if config_name: config = app.config.get(config_name) else: config = app.config.get(opt_name + '_device') for index, (name, value) in enumerate(sorted(device_dict.items(), key=key)): model.append((name, value)) if config == value: combobox.set_active(index) if HAS_GST and app.HAVE_FARSTREAM: create_av_combobox('audio_input', AudioInputManager().get_devices()) create_av_combobox('audio_output', AudioOutputManager().get_devices( )) create_av_combobox('video_input', VideoInputManager().get_devices()) create_av_combobox('video_output', VideoOutputManager().get_devices( )) create_av_combobox('video_framerate', {_('Default'): '', '15fps': '15/1', '10fps': '10/1', '5fps': '5/1', '2.5fps': '5/2'}, 'video_framerate', key=lambda x: -1 if \ not x[1] else float(x[0][:-3])) create_av_combobox('video_size', {_('Default'): '', '800x600': '800x600', '640x480': '640x480', '320x240': '320x240'}, 'video_size', key=lambda x: -1 if \ not x[1] else int(x[0][:3])) st = app.config.get('video_see_self') self.xml.get_object('video_see_self_checkbutton').set_active(st) else: for opt_name in ('audio_input', 'audio_output', 'video_input', 'video_output', 'video_framerate', 'video_size'): combobox = self.xml.get_object(opt_name + '_combobox') combobox.set_sensitive(False) # STUN cb = self.xml.get_object('stun_checkbutton') st = app.config.get('use_stun_server') cb.set_active(st) entry = self.xml.get_object('stun_server_entry') entry.set_text(app.config.get('stun_server')) if not st: entry.set_sensitive(False) ### Advanced tab ### # open links with if os.name == 'nt': applications_frame = self.xml.get_object('applications_frame') applications_frame.set_no_show_all(True) applications_frame.hide() else: self.applications_combobox = self.xml.get_object( 'applications_combobox') self.xml.get_object('custom_apps_frame').hide() self.xml.get_object('custom_apps_frame').set_no_show_all(True) if app.config.get('autodetect_browser_mailer'): self.applications_combobox.set_active(0) else: self.applications_combobox.set_active(1) self.xml.get_object('custom_apps_frame').show() self.xml.get_object('custom_browser_entry').set_text( app.config.get('custombrowser')) self.xml.get_object('custom_mail_client_entry').set_text( app.config.get('custommailapp')) self.xml.get_object('custom_file_manager_entry').set_text( app.config.get('custom_file_manager')) # log status changes of contacts st = app.config.get('log_contact_status_changes') self.xml.get_object('log_show_changes_checkbutton').set_active(st) # log encrypted chat sessions w = self.xml.get_object('log_encrypted_chats_checkbutton') st = self.get_per_account_option('log_encrypted_sessions') if st == 'mixed': w.set_inconsistent(True) else: w.set_active(st) # send os info w = self.xml.get_object('send_os_info_checkbutton') st = self.get_per_account_option('send_os_info') if st == 'mixed': w.set_inconsistent(True) else: w.set_active(st) # send absolute time info w = self.xml.get_object('send_time_info_checkbutton') st = self.get_per_account_option('send_time_info') if st == 'mixed': w.set_inconsistent(True) else: w.set_active(st) # send idle time w = self.xml.get_object('send_idle_time_checkbutton') st = self.get_per_account_option('send_idle_time') if st == 'mixed': w.set_inconsistent(True) else: w.set_active(st) self.update_proxy_list() # Ignore messages from unknown contacts w = self.xml.get_object('ignore_events_from_unknown_contacts_checkbutton') st = self.get_per_account_option('ignore_unknown_contacts') if st == 'mixed': w.set_inconsistent(True) else: w.set_active(st) self.xml.connect_signals(self) self.msg_tree.get_model().connect('row-changed', self.on_msg_treemodel_row_changed) self.msg_tree.get_model().connect('row-deleted', self.on_msg_treemodel_row_deleted) self.default_msg_tree.get_model().connect('row-changed', self.on_default_msg_treemodel_row_changed) self.theme_preferences = None self.sounds_preferences = None self.notebook.set_current_page(0) self.xml.get_object('close_button').grab_focus() self.window.show_all() gtkgui_helpers.possibly_move_window_in_current_desktop(self.window) def on_preferences_notebook_switch_page(self, widget, page, page_num): GLib.idle_add(self.xml.get_object('close_button').grab_focus) def on_preferences_window_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.window.hide() def get_per_account_option(self, opt): """ Return the value of the option opt if it's the same in all accounts else returns "mixed" """ if len(app.connections) == 0: # a non existant key return default value return app.config.get_per('accounts', '__default__', opt) val = None for account in app.connections: v = app.config.get_per('accounts', account, opt) if val is None: val = v elif val != v: return 'mixed' return val def on_checkbutton_toggled(self, widget, config_name, change_sensitivity_widgets=None): app.config.set(config_name, widget.get_active()) if change_sensitivity_widgets: for w in change_sensitivity_widgets: w.set_sensitive(widget.get_active()) def on_per_account_checkbutton_toggled(self, widget, config_name, change_sensitivity_widgets=None): for account in app.connections: app.config.set_per('accounts', account, config_name, widget.get_active()) if change_sensitivity_widgets: for w in change_sensitivity_widgets: w.set_sensitive(widget.get_active()) def _get_all_controls(self): for ctrl in app.interface.msg_win_mgr.get_controls(): yield ctrl for account in app.connections: for ctrl in app.interface.minimized_controls[account].values(): yield ctrl def _get_all_muc_controls(self): for ctrl in app.interface.msg_win_mgr.get_controls( message_control.TYPE_GC): yield ctrl for account in app.connections: for ctrl in app.interface.minimized_controls[account].values(): yield ctrl def on_sort_by_show_in_roster_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'sort_by_show_in_roster') app.interface.roster.setup_and_draw_roster() def on_sort_by_show_in_muc_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'sort_by_show_in_muc') # Redraw groupchats for ctrl in self._get_all_muc_controls(): ctrl.draw_roster() def on_show_avatars_in_roster_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'show_avatars_in_roster') app.interface.roster.setup_and_draw_roster() # Redraw groupchats (in an ugly way) for ctrl in self._get_all_muc_controls(): ctrl.draw_roster() def on_show_status_msgs_in_roster_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'show_status_msgs_in_roster') app.interface.roster.setup_and_draw_roster() for ctrl in self._get_all_muc_controls(): ctrl.update_ui() def on_show_pep_in_roster_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'show_mood_in_roster') self.on_checkbutton_toggled(widget, 'show_activity_in_roster') self.on_checkbutton_toggled(widget, 'show_tunes_in_roster') self.on_checkbutton_toggled(widget, 'show_location_in_roster') app.interface.roster.setup_and_draw_roster() def on_emoticons_combobox_changed(self, widget): active = widget.get_active() model = widget.get_model() emot_theme = model[active][0] if emot_theme == _('Disabled'): app.config.set('emoticons_theme', '') else: app.config.set('emoticons_theme', emot_theme) app.interface.init_emoticons() app.interface.make_regexps() self.toggle_emoticons() def toggle_emoticons(self): """ Update emoticons state in Opened Chat Windows """ for ctrl in self._get_all_controls(): ctrl.toggle_emoticons() def on_one_window_type_combo_changed(self, widget): active = widget.get_active() config_type = c_config.opt_one_window_types[active] app.config.set('one_message_window', config_type) app.interface.msg_win_mgr.reconfig() def on_show_roster_on_startup_changed(self, widget): active = widget.get_active() config_type = c_config.opt_show_roster_on_startup[active] app.config.set('show_roster_on_startup', config_type) def on_xhtml_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'ignore_incoming_xhtml') helpers.update_optional_features() def apply_speller(self): for ctrl in self._get_all_controls(): if isinstance(ctrl, ChatControlBase): ctrl.set_speller() def on_speller_checkbutton_toggled(self, widget): active = widget.get_active() app.config.set('use_speller', active) if not active: return lang = app.config.get('speller_language') gspell_lang = Gspell.language_lookup(lang) if gspell_lang is None: gspell_lang = Gspell.language_get_default() if gspell_lang is None: dialogs.AspellDictError(lang) app.config.set('use_speller', False) widget.set_active(False) else: app.config.set('speller_language', gspell_lang.get_code()) self.apply_speller() def on_positive_184_ack_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'positive_184_ack') def on_show_avatar_in_tabs_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'show_avatar_in_tabs') def on_theme_combobox_changed(self, widget): model = widget.get_model() active = widget.get_active() config_theme = model[active][0].replace(' ', '_') app.config.set('roster_theme', config_theme) # begin repainting themed widgets throughout app.interface.roster.repaint_themed_widgets() app.interface.roster.change_roster_style(None) gtkgui_helpers.load_css() def update_theme_list(self): theme_combobox = self.xml.get_object('theme_combobox') model = Gtk.ListStore(str) theme_combobox.set_model(model) i = 0 for config_theme in app.config.get_per('themes'): theme = config_theme.replace('_', ' ') model.append([theme]) if app.config.get('roster_theme') == config_theme: theme_combobox.set_active(i) i += 1 def on_manage_theme_button_clicked(self, widget): if self.theme_preferences is None: self.theme_preferences = GajimThemesWindow() else: self.theme_preferences.window.present() self.theme_preferences.select_active_theme() def on_iconset_combobox_changed(self, widget): model = widget.get_model() active = widget.get_active() icon_string = model[active][1] app.config.set('iconset', icon_string) gtkgui_helpers.reload_jabber_state_images() def on_transports_iconsets_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'use_transports_iconsets') gtkgui_helpers.reload_jabber_state_images() def on_outgoing_chat_states_combobox_changed(self, widget): active = widget.get_active() old_value = app.config.get('outgoing_chat_state_notifications') if active == 0: # all app.config.set('outgoing_chat_state_notifications', 'all') elif active == 1: # only composing app.config.set('outgoing_chat_state_notifications', 'composing_only') else: # disabled app.config.set('outgoing_chat_state_notifications', 'disabled') new_value = app.config.get('outgoing_chat_state_notifications') if 'disabled' in (old_value, new_value): # we changed from disabled to sth else or vice versa helpers.update_optional_features() def on_displayed_chat_states_combobox_changed(self, widget): active = widget.get_active() if active == 0: # all app.config.set('displayed_chat_state_notifications', 'all') elif active == 1: # only composing app.config.set('displayed_chat_state_notifications', 'composing_only') else: # disabled app.config.set('displayed_chat_state_notifications', 'disabled') def on_ignore_events_from_unknown_contacts_checkbutton_toggled(self, widget): widget.set_inconsistent(False) self.on_per_account_checkbutton_toggled(widget, 'ignore_unknown_contacts') def on_on_event_combobox_changed(self, widget): active = widget.get_active() if active == 0: app.config.set('autopopup', True) app.config.set('notify_on_new_message', False) elif active == 1: app.config.set('autopopup', False) app.config.set('notify_on_new_message', True) else: app.config.set('autopopup', False) app.config.set('notify_on_new_message', False) def on_notify_on_signin_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'notify_on_signin') def on_notify_on_signout_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'notify_on_signout') def on_auto_popup_away_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'autopopupaway') def on_auto_popup_chat_opened_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'autopopup_chat_opened') def on_sound_dnd_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'sounddnd') def on_systray_combobox_changed(self, widget): active = widget.get_active() if active == 0: app.config.set('trayicon', 'never') app.interface.systray_enabled = False app.interface.systray.hide_icon() elif active == 1: app.config.set('trayicon', 'on_event') app.interface.systray_enabled = True app.interface.systray.show_icon() else: app.config.set('trayicon', 'always') app.interface.systray_enabled = True app.interface.systray.show_icon() def on_play_sounds_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'sounds_on', [self.xml.get_object('manage_sounds_button')]) def on_manage_sounds_button_clicked(self, widget): if self.sounds_preferences is None: self.sounds_preferences = ManageSoundsWindow() else: self.sounds_preferences.window.present() def update_text_tags(self): """ Update color tags in opened chat windows """ for ctrl in self._get_all_controls(): ctrl.update_tags() def on_preference_widget_color_set(self, widget, text): color = widget.get_color() color_string = color.to_string() app.config.set(text, color_string) self.update_text_tags() def on_preference_widget_font_set(self, widget, text): if widget: font = widget.get_font_name() else: font = '' app.config.set(text, font) gtkgui_helpers.load_css() def on_incoming_nick_colorbutton_color_set(self, widget): self.on_preference_widget_color_set(widget, 'inmsgcolor') def on_outgoing_nick_colorbutton_color_set(self, widget): self.on_preference_widget_color_set(widget, 'outmsgcolor') def on_incoming_msg_colorbutton_color_set(self, widget): self.on_preference_widget_color_set(widget, 'inmsgtxtcolor') def on_outgoing_msg_colorbutton_color_set(self, widget): self.on_preference_widget_color_set(widget, 'outmsgtxtcolor') def on_url_msg_colorbutton_color_set(self, widget): self.on_preference_widget_color_set(widget, 'urlmsgcolor') def on_status_msg_colorbutton_color_set(self, widget): self.on_preference_widget_color_set(widget, 'statusmsgcolor') def on_muc_highlight_colorbutton_color_set(self, widget): self.on_preference_widget_color_set(widget, 'markedmsgcolor') def on_conversation_fontbutton_font_set(self, widget): self.on_preference_widget_font_set(widget, 'conversation_font') def on_default_chat_font_toggled(self, widget): font_widget = self.xml.get_object('conversation_fontbutton') if widget.get_active(): font_widget.set_sensitive(False) font_widget = None else: font_widget.set_sensitive(True) self.on_preference_widget_font_set(font_widget, 'conversation_font') def draw_color_widgets(self): col_to_widget = {'inmsgcolor': 'incoming_nick_colorbutton', 'outmsgcolor': 'outgoing_nick_colorbutton', 'inmsgtxtcolor': ['incoming_msg_colorbutton', 'incoming_msg_checkbutton'], 'outmsgtxtcolor': ['outgoing_msg_colorbutton', 'outgoing_msg_checkbutton'], 'statusmsgcolor': 'status_msg_colorbutton', 'urlmsgcolor': 'url_msg_colorbutton', 'markedmsgcolor': 'muc_highlight_colorbutton'} for c in col_to_widget: col = app.config.get(c) if col: if isinstance(col_to_widget[c], list): rgba = Gdk.RGBA() rgba.parse(col) self.xml.get_object(col_to_widget[c][0]).set_rgba(rgba) self.xml.get_object(col_to_widget[c][0]).set_sensitive(True) self.xml.get_object(col_to_widget[c][1]).set_active(True) else: rgba = Gdk.RGBA() rgba.parse(col) self.xml.get_object(col_to_widget[c]).set_rgba(rgba) else: rgba = Gdk.RGBA() rgba.parse('#000000') if isinstance(col_to_widget[c], list): self.xml.get_object(col_to_widget[c][0]).set_rgba(rgba) self.xml.get_object(col_to_widget[c][0]).set_sensitive(False) self.xml.get_object(col_to_widget[c][1]).set_active(False) else: self.xml.get_object(col_to_widget[c]).set_rgba(rgba) def on_reset_colors_button_clicked(self, widget): col_to_widget = {'inmsgcolor': 'incoming_nick_colorbutton', 'outmsgcolor': 'outgoing_nick_colorbutton', 'inmsgtxtcolor': 'incoming_msg_colorbutton', 'outmsgtxtcolor': 'outgoing_msg_colorbutton', 'statusmsgcolor': 'status_msg_colorbutton', 'urlmsgcolor': 'url_msg_colorbutton', 'markedmsgcolor': 'muc_highlight_colorbutton'} for c in col_to_widget: app.config.set(c, app.interface.default_colors[c]) self.draw_color_widgets() self.update_text_tags() def _set_color(self, state, widget_name, option): """ Set color value in prefs and update the UI """ if state: color = self.xml.get_object(widget_name).get_rgba() color_string = color.to_string() else: color_string = '' app.config.set(option, color_string) def on_incoming_msg_checkbutton_toggled(self, widget): state = widget.get_active() self.xml.get_object('incoming_msg_colorbutton').set_sensitive(state) self._set_color(state, 'incoming_msg_colorbutton', 'inmsgtxtcolor') def on_outgoing_msg_checkbutton_toggled(self, widget): state = widget.get_active() self.xml.get_object('outgoing_msg_colorbutton').set_sensitive(state) self._set_color(state, 'outgoing_msg_colorbutton', 'outmsgtxtcolor') def on_auto_away_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'autoaway', [self.auto_away_time_spinbutton, self.auto_away_message_entry]) def on_auto_away_time_spinbutton_value_changed(self, widget): aat = widget.get_value_as_int() app.config.set('autoawaytime', aat) app.interface.sleeper = sleepy.Sleepy( app.config.get('autoawaytime') * 60, app.config.get('autoxatime') * 60) def on_auto_away_message_entry_changed(self, widget): app.config.set('autoaway_message', widget.get_text()) def on_auto_xa_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'autoxa', [self.auto_xa_time_spinbutton, self.auto_xa_message_entry]) def on_auto_xa_time_spinbutton_value_changed(self, widget): axt = widget.get_value_as_int() app.config.set('autoxatime', axt) app.interface.sleeper = sleepy.Sleepy( app.config.get('autoawaytime') * 60, app.config.get('autoxatime') * 60) def on_auto_xa_message_entry_changed(self, widget): app.config.set('autoxa_message', widget.get_text()) def on_prompt_online_status_message_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'ask_online_status') def on_prompt_offline_status_message_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'ask_offline_status') def fill_default_msg_treeview(self): model = self.default_msg_tree.get_model() model.clear() status = [] for status_ in app.config.get_per('defaultstatusmsg'): status.append(status_) status.sort() for status_ in status: msg = app.config.get_per('defaultstatusmsg', status_, 'message') msg = helpers.from_one_line(msg) enabled = app.config.get_per('defaultstatusmsg', status_, 'enabled') iter_ = model.append() uf_show = helpers.get_uf_show(status_) model.set(iter_, 0, status_, 1, uf_show, 2, msg, 3, enabled) def on_default_msg_cell_edited(self, cell, row, new_text): model = self.default_msg_tree.get_model() iter_ = model.get_iter_from_string(row) model.set_value(iter_, 2, new_text) def default_msg_toggled_cb(self, cell, path): model = self.default_msg_tree.get_model() model[path][3] = not model[path][3] def on_default_msg_treemodel_row_changed(self, model, path, iter_): status = model[iter_][0] message = model[iter_][2] message = helpers.to_one_line(message) app.config.set_per('defaultstatusmsg', status, 'enabled', model[iter_][3]) app.config.set_per('defaultstatusmsg', status, 'message', message) def save_status_messages(self, model): for msg in app.config.get_per('statusmsg'): app.config.del_per('statusmsg', msg) iter_ = model.get_iter_first() while iter_: val = model[iter_][0] if model[iter_][1]: # we have a preset message if not val: # no title, use message text for title val = model[iter_][1] app.config.add_per('statusmsg', val) msg = helpers.to_one_line(model[iter_][1]) app.config.set_per('statusmsg', val, 'message', msg) i = 2 # store mood / activity for subname in ('activity', 'subactivity', 'activity_text', 'mood', 'mood_text'): val2 = model[iter_][i] if not val2: val2 = '' app.config.set_per('statusmsg', val, subname, val2) i += 1 iter_ = model.iter_next(iter_) def on_msg_treemodel_row_changed(self, model, path, iter_): self.save_status_messages(model) def on_msg_treemodel_row_deleted(self, model, path): self.save_status_messages(model) def on_av_combobox_changed(self, combobox, config_name): model = combobox.get_model() active = combobox.get_active() device = model[active][1] app.config.set(config_name, device) def on_audio_input_combobox_changed(self, widget): self.on_av_combobox_changed(widget, 'audio_input_device') def on_audio_output_combobox_changed(self, widget): self.on_av_combobox_changed(widget, 'audio_output_device') def on_video_input_combobox_changed(self, widget): self.on_av_combobox_changed(widget, 'video_input_device') def on_video_output_combobox_changed(self, widget): self.on_av_combobox_changed(widget, 'video_output_device') def on_video_framerate_combobox_changed(self, widget): self.on_av_combobox_changed(widget, 'video_framerate') def on_video_size_combobox_changed(self, widget): self.on_av_combobox_changed(widget, 'video_size') def on_video_see_self_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'video_see_self') def on_stun_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'use_stun_server', [self.xml.get_object('stun_server_entry')]) def stun_server_entry_changed(self, widget): app.config.set('stun_server', widget.get_text()) def on_applications_combobox_changed(self, widget): if widget.get_active() == 0: app.config.set('autodetect_browser_mailer', True) self.xml.get_object('custom_apps_frame').hide() elif widget.get_active() == 1: app.config.set('autodetect_browser_mailer', False) self.xml.get_object('custom_apps_frame').show() def on_custom_browser_entry_changed(self, widget): app.config.set('custombrowser', widget.get_text()) def on_custom_mail_client_entry_changed(self, widget): app.config.set('custommailapp', widget.get_text()) def on_custom_file_manager_entry_changed(self, widget): app.config.set('custom_file_manager', widget.get_text()) def on_log_show_changes_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'log_contact_status_changes') def on_log_encrypted_chats_checkbutton_toggled(self, widget): widget.set_inconsistent(False) self.on_per_account_checkbutton_toggled(widget, 'log_encrypted_sessions') def on_send_os_info_checkbutton_toggled(self, widget): widget.set_inconsistent(False) self.on_per_account_checkbutton_toggled(widget, 'send_os_info') def on_send_time_info_checkbutton_toggled(self, widget): widget.set_inconsistent(False) self.on_per_account_checkbutton_toggled(widget, 'send_time_info') def on_send_idle_time_checkbutton_toggled(self, widget): widget.set_inconsistent(False) self.on_per_account_checkbutton_toggled(widget, 'send_idle_time') def fill_msg_treeview(self): self.xml.get_object('delete_msg_button').set_sensitive(False) model = self.msg_tree.get_model() model.clear() preset_status = [] for msg_name in app.config.get_per('statusmsg'): if msg_name.startswith('_last_'): continue preset_status.append(msg_name) preset_status.sort() for msg_name in preset_status: msg_text = app.config.get_per('statusmsg', msg_name, 'message') msg_text = helpers.from_one_line(msg_text) activity = app.config.get_per('statusmsg', msg_name, 'activity') subactivity = app.config.get_per('statusmsg', msg_name, 'subactivity') activity_text = app.config.get_per('statusmsg', msg_name, 'activity_text') mood = app.config.get_per('statusmsg', msg_name, 'mood') mood_text = app.config.get_per('statusmsg', msg_name, 'mood_text') iter_ = model.append() model.set(iter_, 0, msg_name, 1, msg_text, 2, activity, 3, subactivity, 4, activity_text, 5, mood, 6, mood_text) def on_msg_cell_edited(self, cell, row, new_text): model = self.msg_tree.get_model() iter_ = model.get_iter_from_string(row) model.set_value(iter_, 0, new_text) def on_msg_treeview_cursor_changed(self, widget, data = None): sel = self.msg_tree.get_selection() if not sel: return (model, iter_) = sel.get_selected() if not iter_: return self.xml.get_object('delete_msg_button').set_sensitive(True) buf = self.xml.get_object('msg_textview').get_buffer() msg = model[iter_][1] buf.set_text(msg) def on_new_msg_button_clicked(self, widget, data = None): model = self.msg_tree.get_model() iter_ = model.append() model.set(iter_, 0, _('status message title'), 1, _('status message text')) self.msg_tree.set_cursor(model.get_path(iter_)) def on_delete_msg_button_clicked(self, widget, data = None): sel = self.msg_tree.get_selection() if not sel: return (model, iter_) = sel.get_selected() if not iter_: return buf = self.xml.get_object('msg_textview').get_buffer() model.remove(iter_) buf.set_text('') self.xml.get_object('delete_msg_button').set_sensitive(False) def on_msg_textview_changed(self, widget, data = None): sel = self.msg_tree.get_selection() if not sel: return (model, iter_) = sel.get_selected() if not iter_: return buf = self.xml.get_object('msg_textview').get_buffer() first_iter, end_iter = buf.get_bounds() model.set_value(iter_, 1, buf.get_text(first_iter, end_iter, True)) def on_msg_treeview_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Delete: self.on_delete_msg_button_clicked(widget) def on_proxies_combobox_changed(self, widget): active = widget.get_active() proxy = widget.get_model()[active][0] if proxy == _('None'): proxy = '' app.config.set('global_proxy', proxy) def on_manage_proxies_button_clicked(self, widget): if 'manage_proxies' in app.interface.instances: app.interface.instances['manage_proxies'].window.present() else: app.interface.instances['manage_proxies'] = ManageProxiesWindow( self.window) def update_proxy_list(self): our_proxy = app.config.get('global_proxy') if not our_proxy: our_proxy = _('None') proxy_combobox = self.xml.get_object('proxies_combobox') model = proxy_combobox.get_model() model.clear() l = app.config.get_per('proxies') l.insert(0, _('None')) for i in range(len(l)): model.append([l[i]]) if our_proxy == l[i]: proxy_combobox.set_active(i) def on_open_advanced_editor_button_clicked(self, widget, data = None): if 'advanced_config' in app.interface.instances: app.interface.instances['advanced_config'].window.present() else: app.interface.instances['advanced_config'] = \ AdvancedConfigurationWindow() #---------- ManageProxiesWindow class -------------# class ManageProxiesWindow: def __init__(self, transient_for=None): self.xml = gtkgui_helpers.get_gtk_builder('manage_proxies_window.ui') self.window = self.xml.get_object('manage_proxies_window') self.window.set_transient_for(transient_for) self.proxies_treeview = self.xml.get_object('proxies_treeview') self.proxyname_entry = self.xml.get_object('proxyname_entry') self.proxytype_combobox = self.xml.get_object('proxytype_combobox') self.init_list() self.block_signal = False self.xml.connect_signals(self) self.window.show_all() # hide the BOSH fields by default self.show_bosh_fields() def show_bosh_fields(self, show=True): if show: self.xml.get_object('boshuri_entry').show() self.xml.get_object('boshuri_label').show() self.xml.get_object('boshuseproxy_checkbutton').show() else: cb = self.xml.get_object('boshuseproxy_checkbutton') cb.hide() cb.set_active(True) self.on_boshuseproxy_checkbutton_toggled(cb) self.xml.get_object('boshuri_entry').hide() self.xml.get_object('boshuri_label').hide() def fill_proxies_treeview(self): model = self.proxies_treeview.get_model() model.clear() iter_ = model.append() model.set(iter_, 0, _('None')) for p in app.config.get_per('proxies'): iter_ = model.append() model.set(iter_, 0, p) def init_list(self): self.xml.get_object('remove_proxy_button').set_sensitive(False) self.proxytype_combobox.set_sensitive(False) self.xml.get_object('proxy_table').set_sensitive(False) model = Gtk.ListStore(str) self.proxies_treeview.set_model(model) col = Gtk.TreeViewColumn('Proxies') self.proxies_treeview.append_column(col) renderer = Gtk.CellRendererText() col.pack_start(renderer, True) col.add_attribute(renderer, 'text', 0) self.fill_proxies_treeview() self.xml.get_object('proxytype_combobox').set_active(0) def on_manage_proxies_window_destroy(self, widget): if 'accounts' in app.interface.instances: app.interface.instances['accounts'].\ update_proxy_list() del app.interface.instances['manage_proxies'] def on_add_proxy_button_clicked(self, widget): model = self.proxies_treeview.get_model() proxies = app.config.get_per('proxies') i = 1 while ('proxy' + str(i)) in proxies: i += 1 iter_ = model.append() model.set(iter_, 0, 'proxy' + str(i)) app.config.add_per('proxies', 'proxy' + str(i)) self.proxies_treeview.set_cursor(model.get_path(iter_)) def on_remove_proxy_button_clicked(self, widget): sel = self.proxies_treeview.get_selection() if not sel: return (model, iter_) = sel.get_selected() if not iter_: return proxy = model[iter_][0] model.remove(iter_) app.config.del_per('proxies', proxy) self.xml.get_object('remove_proxy_button').set_sensitive(False) self.block_signal = True self.on_proxies_treeview_cursor_changed(self.proxies_treeview) self.block_signal = False def on_close_button_clicked(self, widget): self.window.destroy() def on_useauth_checkbutton_toggled(self, widget): if self.block_signal: return act = widget.get_active() proxy = self.proxyname_entry.get_text() app.config.set_per('proxies', proxy, 'useauth', act) self.xml.get_object('proxyuser_entry').set_sensitive(act) self.xml.get_object('proxypass_entry').set_sensitive(act) def on_boshuseproxy_checkbutton_toggled(self, widget): if self.block_signal: return act = widget.get_active() proxy = self.proxyname_entry.get_text() app.config.set_per('proxies', proxy, 'bosh_useproxy', act) self.xml.get_object('proxyhost_entry').set_sensitive(act) self.xml.get_object('proxyport_entry').set_sensitive(act) def on_proxies_treeview_cursor_changed(self, widget): #FIXME: check if off proxy settings are correct (see # http://trac.gajim.org/changeset/1921#file2 line 1221 proxyhost_entry = self.xml.get_object('proxyhost_entry') proxyport_entry = self.xml.get_object('proxyport_entry') proxyuser_entry = self.xml.get_object('proxyuser_entry') proxypass_entry = self.xml.get_object('proxypass_entry') boshuri_entry = self.xml.get_object('boshuri_entry') useauth_checkbutton = self.xml.get_object('useauth_checkbutton') boshuseproxy_checkbutton = self.xml.get_object('boshuseproxy_checkbutton') self.block_signal = True proxyhost_entry.set_text('') proxyport_entry.set_text('') proxyuser_entry.set_text('') proxypass_entry.set_text('') boshuri_entry.set_text('') #boshuseproxy_checkbutton.set_active(False) #self.on_boshuseproxy_checkbutton_toggled(boshuseproxy_checkbutton) #useauth_checkbutton.set_active(False) #self.on_useauth_checkbutton_toggled(useauth_checkbutton) sel = widget.get_selection() if sel: (model, iter_) = sel.get_selected() else: iter_ = None if not iter_: self.xml.get_object('proxyname_entry').set_text('') self.xml.get_object('proxytype_combobox').set_sensitive(False) self.xml.get_object('proxy_table').set_sensitive(False) self.block_signal = False return proxy = model[iter_][0] self.xml.get_object('proxyname_entry').set_text(proxy) if proxy == _('None'): # special proxy None self.show_bosh_fields(False) self.proxyname_entry.set_editable(False) self.xml.get_object('remove_proxy_button').set_sensitive(False) self.xml.get_object('proxytype_combobox').set_sensitive(False) self.xml.get_object('proxy_table').set_sensitive(False) else: proxytype = app.config.get_per('proxies', proxy, 'type') self.show_bosh_fields(proxytype=='bosh') self.proxyname_entry.set_editable(True) self.xml.get_object('remove_proxy_button').set_sensitive(True) self.xml.get_object('proxytype_combobox').set_sensitive(True) self.xml.get_object('proxy_table').set_sensitive(True) proxyhost_entry.set_text(app.config.get_per('proxies', proxy, 'host')) proxyport_entry.set_text(str(app.config.get_per('proxies', proxy, 'port'))) proxyuser_entry.set_text(app.config.get_per('proxies', proxy, 'user')) proxypass_entry.set_text(app.config.get_per('proxies', proxy, 'pass')) boshuri_entry.set_text(app.config.get_per('proxies', proxy, 'bosh_uri')) types = ['http', 'socks5', 'bosh'] self.proxytype_combobox.set_active(types.index(proxytype)) boshuseproxy_checkbutton.set_active( app.config.get_per('proxies', proxy, 'bosh_useproxy')) useauth_checkbutton.set_active( app.config.get_per('proxies', proxy, 'useauth')) self.block_signal = False def on_proxies_treeview_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Delete: self.on_remove_proxy_button_clicked(widget) def on_proxyname_entry_changed(self, widget): if self.block_signal: return sel = self.proxies_treeview.get_selection() if not sel: return (model, iter_) = sel.get_selected() if not iter_: return old_name = model.get_value(iter_, 0) new_name = widget.get_text() if new_name == '': return if new_name == old_name: return config = app.config.get_per('proxies', old_name) app.config.del_per('proxies', old_name) app.config.add_per('proxies', new_name) for option in config: app.config.set_per('proxies', new_name, option, config[option]) model.set_value(iter_, 0, new_name) def on_proxytype_combobox_changed(self, widget): if self.block_signal: return types = ['http', 'socks5', 'bosh'] type_ = self.proxytype_combobox.get_active() self.show_bosh_fields(types[type_]=='bosh') proxy = self.proxyname_entry.get_text() app.config.set_per('proxies', proxy, 'type', types[type_]) def on_proxyhost_entry_changed(self, widget): if self.block_signal: return value = widget.get_text() proxy = self.proxyname_entry.get_text() app.config.set_per('proxies', proxy, 'host', value) def on_proxyport_entry_changed(self, widget): if self.block_signal: return value = widget.get_text() proxy = self.proxyname_entry.get_text() app.config.set_per('proxies', proxy, 'port', value) def on_proxyuser_entry_changed(self, widget): if self.block_signal: return value = widget.get_text() proxy = self.proxyname_entry.get_text() app.config.set_per('proxies', proxy, 'user', value) def on_boshuri_entry_changed(self, widget): if self.block_signal: return value = widget.get_text() proxy = self.proxyname_entry.get_text() app.config.set_per('proxies', proxy, 'bosh_uri', value) def on_proxypass_entry_changed(self, widget): if self.block_signal: return value = widget.get_text() proxy = self.proxyname_entry.get_text() app.config.set_per('proxies', proxy, 'pass', value) class FakeDataForm(Gtk.Table, object): """ Class for forms that are in XML format value1 infos in a table {entry1: value1} """ def __init__(self, infos, selectable=False): GObject.GObject.__init__(self) self.infos = infos self.selectable = selectable self.entries = {} self._draw_table() def _draw_table(self): """ Draw the table """ nbrow = 0 if 'instructions' in self.infos: nbrow = 1 self.resize(rows = nbrow, columns = 2) label = Gtk.Label(label=self.infos['instructions']) if self.selectable: label.set_selectable(True) self.attach(label, 0, 2, 0, 1, 0, 0, 0, 0) for name in self.infos.keys(): if name in ('key', 'instructions', 'x', 'registered'): continue if not name: continue nbrow = nbrow + 1 self.resize(rows = nbrow, columns = 2) label = Gtk.Label(label=name.capitalize() + ':') self.attach(label, 0, 1, nbrow - 1, nbrow, 0, 0, 0, 0) entry = Gtk.Entry() entry.set_activates_default(True) if self.infos[name]: entry.set_text(self.infos[name]) if name == 'password': entry.set_visibility(False) self.attach(entry, 1, 2, nbrow - 1, nbrow, 0, 0, 0, 0) self.entries[name] = entry if nbrow == 1: entry.grab_focus() def get_infos(self): for name in self.entries.keys(): self.infos[name] = self.entries[name].get_text() return self.infos class ServiceRegistrationWindow: """ Class for Service registration window. Window that appears when we want to subscribe to a service if is_form we use dataforms_widget else we use service_registarion_window """ def __init__(self, service, infos, account, is_form): self.service = service self.account = account self.is_form = is_form self.xml = gtkgui_helpers.get_gtk_builder('service_registration_window.ui') self.window = self.xml.get_object('service_registration_window') self.window.set_transient_for(app.interface.roster.window) if self.is_form: dataform = dataforms.ExtendForm(node = infos) self.data_form_widget = dataforms_widget.DataFormWidget(dataform) if self.data_form_widget.title: self.window.set_title('%s - Gajim' % self.data_form_widget.title) grid = self.xml.get_object('grid') grid.attach(self.data_form_widget, 0, 0, 2, 1) else: if 'registered' in infos: self.window.set_title(_('Edit %s') % service) else: self.window.set_title(_('Register to %s') % service) self.data_form_widget = FakeDataForm(infos) grid = self.xml.get_object('grid') grid.attach(self.data_form_widget, 0, 0, 2, 1) self.xml.connect_signals(self) self.window.show_all() def on_cancel_button_clicked(self, widget): self.window.destroy() def on_ok_button_clicked(self, widget): # send registration info to the core if self.is_form: form = self.data_form_widget.data_form app.connections[self.account].register_agent(self.service, form, True) # True is for is_form else: infos = self.data_form_widget.get_infos() if 'instructions' in infos: del infos['instructions'] if 'registered' in infos: del infos['registered'] app.connections[self.account].register_agent(self.service, infos) self.window.destroy() class GroupchatConfigWindow: def __init__(self, account, room_jid, form=None): self.account = account self.room_jid = room_jid self.form = form self.remove_button = {} self.affiliation_treeview = {} self.start_users_dict = {} # list at the beginning self.affiliation_labels = {'outcast': _('Ban List'), 'member': _('Member List'), 'owner': _('Owner List'), 'admin':_('Administrator List')} self.xml = gtkgui_helpers.get_gtk_builder('data_form_window.ui', 'data_form_window') self.window = self.xml.get_object('data_form_window') self.window.set_transient_for(app.interface.roster.window) if self.form: config_vbox = self.xml.get_object('config_vbox') self.data_form_widget = dataforms_widget.DataFormWidget(self.form) # hide scrollbar of this data_form_widget, we already have in this # widget sw = self.data_form_widget.xml.get_object( 'single_form_scrolledwindow') sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER) if self.form.title: self.xml.get_object('title_label').set_text(self.form.title) else: self.xml.get_object('title_hseparator').set_no_show_all(True) self.xml.get_object('title_hseparator').hide() self.data_form_widget.show() config_vbox.pack_start(self.data_form_widget, True, True, 0) else: self.xml.get_object('title_label').set_no_show_all(True) self.xml.get_object('title_label').hide() self.xml.get_object('title_hseparator').set_no_show_all(True) self.xml.get_object('title_hseparator').hide() self.xml.get_object('config_hseparator').set_no_show_all(True) self.xml.get_object('config_hseparator').hide() # Draw the edit affiliation list things add_on_vbox = self.xml.get_object('add_on_vbox') for affiliation in self.affiliation_labels.keys(): self.start_users_dict[affiliation] = {} hbox = Gtk.HBox(spacing=5) add_on_vbox.pack_start(hbox, False, True, 0) label = Gtk.Label(label=self.affiliation_labels[affiliation]) hbox.pack_start(label, False, True, 0) bb = Gtk.HButtonBox() bb.set_layout(Gtk.ButtonBoxStyle.END) bb.set_spacing(5) hbox.pack_start(bb, True, True, 0) add_button = Gtk.Button(stock=Gtk.STOCK_ADD) add_button.connect('clicked', self.on_add_button_clicked, affiliation) bb.pack_start(add_button, True, True, 0) self.remove_button[affiliation] = Gtk.Button(stock=Gtk.STOCK_REMOVE) self.remove_button[affiliation].set_sensitive(False) self.remove_button[affiliation].connect('clicked', self.on_remove_button_clicked, affiliation) bb.pack_start(self.remove_button[affiliation], True, True, 0) # jid, reason, nick, role liststore = Gtk.ListStore(str, str, str, str) self.affiliation_treeview[affiliation] = Gtk.TreeView(liststore) self.affiliation_treeview[affiliation].get_selection().set_mode( Gtk.SelectionMode.MULTIPLE) self.affiliation_treeview[affiliation].connect('cursor-changed', self.on_affiliation_treeview_cursor_changed, affiliation) renderer = Gtk.CellRendererText() col = Gtk.TreeViewColumn(_('JID'), renderer) col.add_attribute(renderer, 'text', 0) col.set_resizable(True) col.set_sort_column_id(0) self.affiliation_treeview[affiliation].append_column(col) if affiliation == 'outcast': renderer = Gtk.CellRendererText() renderer.set_property('editable', True) renderer.connect('edited', self.on_cell_edited) col = Gtk.TreeViewColumn(_('Reason'), renderer) col.add_attribute(renderer, 'text', 1) col.set_resizable(True) col.set_sort_column_id(1) self.affiliation_treeview[affiliation].append_column(col) elif affiliation == 'member': renderer = Gtk.CellRendererText() col = Gtk.TreeViewColumn(_('Nick'), renderer) col.add_attribute(renderer, 'text', 2) col.set_resizable(True) col.set_sort_column_id(2) self.affiliation_treeview[affiliation].append_column(col) renderer = Gtk.CellRendererText() col = Gtk.TreeViewColumn(_('Role'), renderer) col.add_attribute(renderer, 'text', 3) col.set_resizable(True) col.set_sort_column_id(3) self.affiliation_treeview[affiliation].append_column(col) sw = Gtk.ScrolledWindow() sw.add(self.affiliation_treeview[affiliation]) add_on_vbox.pack_start(sw, True, True, 0) app.connections[self.account].get_affiliation_list(self.room_jid, affiliation) self.xml.connect_signals(self) self.window.show_all() def on_cancel_button_clicked(self, widget): self.window.destroy() def on_cell_edited(self, cell, path, new_text): model = self.affiliation_treeview['outcast'].get_model() new_text = new_text iter_ = model.get_iter(path) model[iter_][1] = new_text def on_add_button_clicked(self, widget, affiliation): if affiliation == 'outcast': title = _('Banning…') #You can move '\n' before user@domain if that line is TOO BIG prompt = _('Whom do you want to ban?\n\n') elif affiliation == 'member': title = _('Adding Member…') prompt = _('Whom do you want to make a member?\n\n') elif affiliation == 'owner': title = _('Adding Owner…') prompt = _('Whom do you want to make an owner?\n\n') else: title = _('Adding Administrator…') prompt = _('Whom do you want to make an administrator?\n\n') prompt += _('Can be one of the following:\n' '1. user@domain/resource (only that resource matches).\n' '2. user@domain (any resource matches).\n' '3. domain/resource (only that resource matches).\n' '4. domain (the domain itself matches, as does any user@domain,\n' 'domain/resource, or address containing a subdomain).') def on_ok(jid): if not jid: return model = self.affiliation_treeview[affiliation].get_model() model.append((jid, '', '', '')) dialogs.InputDialog(title, prompt, ok_handler=on_ok) def on_remove_button_clicked(self, widget, affiliation): selection = self.affiliation_treeview[affiliation].get_selection() model, paths = selection.get_selected_rows() row_refs = [] for path in paths: row_refs.append(Gtk.TreeRowReference.new(model, path)) for row_ref in row_refs: path = row_ref.get_path() iter_ = model.get_iter(path) model.remove(iter_) self.remove_button[affiliation].set_sensitive(False) def on_affiliation_treeview_cursor_changed(self, widget, affiliation): self.remove_button[affiliation].set_sensitive(True) def affiliation_list_received(self, users_dict): """ Fill the affiliation treeview """ for jid in users_dict: affiliation = users_dict[jid]['affiliation'] if affiliation not in self.affiliation_labels.keys(): # Unknown affiliation or 'none' affiliation, do not show it continue self.start_users_dict[affiliation][jid] = users_dict[jid] tv = self.affiliation_treeview[affiliation] model = tv.get_model() reason = users_dict[jid].get('reason', '') nick = users_dict[jid].get('nick', '') role = users_dict[jid].get('role', '') model.append((jid, reason, nick, role)) def on_data_form_window_destroy(self, widget): del app.interface.instances[self.account]['gc_config'][self.room_jid] def on_ok_button_clicked(self, widget): if self.form: form = self.data_form_widget.data_form app.connections[self.account].send_gc_config(self.room_jid, form) for affiliation in self.affiliation_labels.keys(): users_dict = {} actual_jid_list = [] model = self.affiliation_treeview[affiliation].get_model() iter_ = model.get_iter_first() # add new jid while iter_: jid = model[iter_][0] actual_jid_list.append(jid) if jid not in self.start_users_dict[affiliation] or \ (affiliation == 'outcast' and 'reason' in self.start_users_dict[ affiliation][jid] and self.start_users_dict[affiliation][jid]\ ['reason'] != model[iter_][1]): users_dict[jid] = {'affiliation': affiliation} if affiliation == 'outcast': users_dict[jid]['reason'] = model[iter_][1] iter_ = model.iter_next(iter_) # remove removed one for jid in self.start_users_dict[affiliation]: if jid not in actual_jid_list: users_dict[jid] = {'affiliation': 'none'} if users_dict: app.connections[self.account].send_gc_affiliation_list( self.room_jid, users_dict) self.window.destroy() #---------- RemoveAccountWindow class -------------# class RemoveAccountWindow: """ Ask for removing from gajim only or from gajim and server too and do removing of the account given """ def on_remove_account_window_destroy(self, widget): if self.account in app.interface.instances: del app.interface.instances[self.account]['remove_account'] def on_cancel_button_clicked(self, widget): self.window.destroy() def __init__(self, account): self.account = account xml = gtkgui_helpers.get_gtk_builder('remove_account_window.ui') self.window = xml.get_object('remove_account_window') active_window = app.app.get_active_window() self.window.set_transient_for(active_window) self.remove_and_unregister_radiobutton = xml.get_object( 'remove_and_unregister_radiobutton') self.window.set_title(_('Removing %s account') % self.account) xml.connect_signals(self) self.window.show_all() def on_remove_button_clicked(self, widget): def remove(): if self.account in app.connections and \ app.connections[self.account].connected and \ not self.remove_and_unregister_radiobutton.get_active(): # change status to offline only if we will not remove this JID from # server app.connections[self.account].change_status('offline', 'offline') if self.remove_and_unregister_radiobutton.get_active(): if not self.account in app.connections: dialogs.ErrorDialog( _('Account is disabled'), _('To unregister from a server, account must be ' 'enabled.'), transient_for=self.window) return if not app.connections[self.account].password: def on_ok(passphrase, checked): if passphrase == -1: # We don't remove account cause we canceled pw window return app.connections[self.account].password = passphrase app.connections[self.account].unregister_account( self._on_remove_success) dialogs.PassphraseDialog( _('Password Required'), _('Enter your password for account %s') % self.account, _('Save password'), ok_handler=on_ok, transient_for=self.window) return app.connections[self.account].unregister_account( self._on_remove_success) else: self._on_remove_success(True) if self.account in app.connections and \ app.connections[self.account].connected: dialogs.ConfirmationDialog( _('Account "%s" is connected to the server') % self.account, _('If you remove it, the connection will be lost.'), on_response_ok=remove, transient_for=self.window) else: remove() def on_remove_responce_ok(self, is_checked): if is_checked[0]: self._on_remove_success(True) def _on_remove_success(self, res): # action of unregistration has failed, we don't remove the account # Error message is send by connect_and_auth() if not res: dialogs.ConfirmationDialogDoubleRadio( _('Connection to server %s failed') % self.account, _('What would you like to do?'), _('Remove only from Gajim'), _('Don\'t remove anything. I\'ll try again later'), on_response_ok=self.on_remove_responce_ok, is_modal=False, transient_for=self.window) return # Close all opened windows app.interface.roster.close_all(self.account, force=True) if self.account in app.connections: app.connections[self.account].disconnect(on_purpose=True) app.connections[self.account].cleanup() del app.connections[self.account] app.logger.remove_roster(app.get_jid_from_account(self.account)) app.config.del_per('accounts', self.account) del app.interface.instances[self.account] if self.account in app.nicks: del app.interface.minimized_controls[self.account] del app.nicks[self.account] del app.block_signed_in_notifications[self.account] del app.groups[self.account] app.contacts.remove_account(self.account) del app.gc_connected[self.account] del app.automatic_rooms[self.account] del app.to_be_removed[self.account] del app.newly_added[self.account] del app.sleeper_state[self.account] del app.encrypted_chats[self.account] del app.last_message_time[self.account] del app.status_before_autoaway[self.account] del app.transport_avatar[self.account] del app.gajim_optional_features[self.account] del app.caps_hash[self.account] if len(app.connections) >= 2: # Do not merge accounts if only one exists app.interface.roster.regroup = app.config.get('mergeaccounts') else: app.interface.roster.regroup = False app.interface.roster.setup_and_draw_roster() app.app.remove_account_actions(self.account) gui_menu_builder.build_accounts_menu() if 'accounts' in app.interface.instances: app.interface.instances['accounts'].remove_account(self.account) self.window.destroy() #---------- ManageBookmarksWindow class -------------# class ManageBookmarksWindow: def __init__(self): self.xml = gtkgui_helpers.get_gtk_builder('manage_bookmarks_window.ui') self.window = self.xml.get_object('manage_bookmarks_window') self.window.set_transient_for(app.interface.roster.window) self.ignore_events = False # Account-JID, RoomName, Room-JID, Autojoin, Minimize, Passowrd, Nick, # Show_Status self.treestore = Gtk.TreeStore(str, str, str, bool, bool, str, str, str) self.treestore.set_sort_column_id(1, Gtk.SortType.ASCENDING) # Store bookmarks in treeview. for account in app.connections: if app.connections[account].connected <= 1: continue if app.connections[account].is_zeroconf: continue if not app.connections[account].private_storage_supported: continue iter_ = self.treestore.append(None, [None, account, None, None, None, None, None, None]) for bookmark in app.connections[account].bookmarks: if not bookmark['name']: # No name was given for this bookmark. # Use the first part of JID instead... name = bookmark['jid'].split("@")[0] bookmark['name'] = name # make '1', '0', 'true', 'false' (or other) to True/False autojoin = helpers.from_xs_boolean_to_python_boolean( bookmark['autojoin']) minimize = helpers.from_xs_boolean_to_python_boolean( bookmark['minimize']) print_status = bookmark.get('print_status', '') if print_status not in ('', 'all', 'in_and_out', 'none'): print_status = '' self.treestore.append(iter_, [ account, bookmark['name'], bookmark['jid'], autojoin, minimize, bookmark['password'], bookmark['nick'], print_status ]) self.print_status_combobox = self.xml.get_object('print_status_combobox') model = Gtk.ListStore(str, str) self.option_list = {'': _('Default'), 'all': Q_('?print_status:All'), 'in_and_out': _('Enter and leave only'), 'none': Q_('?print_status:None')} opts = sorted(self.option_list.keys()) for opt in opts: model.append([self.option_list[opt], opt]) self.print_status_combobox.set_model(model) self.print_status_combobox.set_active(1) self.view = self.xml.get_object('bookmarks_treeview') self.view.set_model(self.treestore) self.view.expand_all() renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn('Bookmarks', renderer, text=1) self.view.append_column(column) self.selection = self.view.get_selection() self.selection.connect('changed', self.bookmark_selected) #Prepare input fields self.title_entry = self.xml.get_object('title_entry') self.title_entry.connect('changed', self.on_title_entry_changed) self.nick_entry = self.xml.get_object('nick_entry') self.nick_entry.connect('changed', self.on_nick_entry_changed) self.server_entry = self.xml.get_object('server_entry') self.server_entry.connect('changed', self.on_server_entry_changed) self.room_entry = self.xml.get_object('room_entry') self.room_entry_changed_id = self.room_entry.connect('changed', self.on_room_entry_changed) self.pass_entry = self.xml.get_object('pass_entry') self.pass_entry.connect('changed', self.on_pass_entry_changed) self.autojoin_checkbutton = self.xml.get_object('autojoin_checkbutton') self.minimize_checkbutton = self.xml.get_object('minimize_checkbutton') self.xml.connect_signals(self) self.window.show_all() # select root iter first_iter = self.treestore.get_iter_first() if first_iter: self.selection.select_iter(first_iter) def on_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.window.destroy() def on_add_bookmark_button_clicked(self, widget): """ Add a new bookmark """ # Get the account that is currently used # (the parent of the currently selected item) (model, iter_) = self.selection.get_selected() if not iter_: # Nothing selected, do nothing return parent = model.iter_parent(iter_) if parent: # We got a bookmark selected, so we add_to the parent add_to = parent else: # No parent, so we got an account -> add to this. add_to = iter_ account = model[add_to][1] nick = app.nicks[account] iter_ = self.treestore.append(add_to, [account, _('New Group Chat'), '@', False, False, '', nick, 'in_and_out']) self.view.expand_row(model.get_path(add_to), True) self.view.set_cursor(model.get_path(iter_)) def on_remove_bookmark_button_clicked(self, widget): """ Remove selected bookmark """ (model, iter_) = self.selection.get_selected() if not iter_: # Nothing selected return if not model.iter_parent(iter_): # Don't remove account iters return self.ignore_events = True model.remove(iter_) self.selection.unselect_all() self.clear_fields() self.ignore_events = False def check_valid_bookmark(self): """ Check if all neccessary fields are entered correctly """ (model, iter_) = self.selection.get_selected() if not model.iter_parent(iter_): #Account data can't be changed return if self.server_entry.get_text() == '' or \ self.room_entry.get_text() == '': dialogs.ErrorDialog(_('This bookmark has invalid data'), _('Please be sure to fill out server and room fields or remove this' ' bookmark.')) return False return True def on_ok_button_clicked(self, widget): """ Parse the treestore data into our new bookmarks array, then send the new bookmarks to the server. """ (model, iter_) = self.selection.get_selected() if iter_ and model.iter_parent(iter_): #bookmark selected, check it if not self.check_valid_bookmark(): return for account in self.treestore: acct = account[1] app.connections[acct].bookmarks = [] for bm in account.iterchildren(): # Convert True/False/None to '1' or '0' autojoin = str(int(bm[3])) minimize = str(int(bm[4])) name = bm[1] jid = bm[2] pw = bm[5] nick = bm[6] # create the bookmark-dict bmdict = { 'name': name, 'jid': jid, 'autojoin': autojoin, 'minimize': minimize, 'password': pw, 'nick': nick, 'print_status': bm[7]} app.connections[acct].bookmarks.append(bmdict) app.connections[acct].store_bookmarks() gui_menu_builder.build_bookmark_menu(acct) self.window.destroy() def on_cancel_button_clicked(self, widget): self.window.destroy() def bookmark_selected(self, selection): """ Fill in the bookmark's data into the fields. """ (model, iter_) = selection.get_selected() if not iter_: # After removing the last bookmark for one account # this will be None, so we will just: return widgets = [ self.title_entry, self.nick_entry, self.room_entry, self.server_entry, self.pass_entry, self.autojoin_checkbutton, self.minimize_checkbutton, self.print_status_combobox] if model.iter_parent(iter_): # make the fields sensitive for field in widgets: field.set_sensitive(True) else: # Top-level has no data (it's the account fields) # clear fields & make them insensitive self.clear_fields() for field in widgets: field.set_sensitive(False) return # Fill in the data for childs self.title_entry.set_text(model[iter_][1]) room_jid = model[iter_][2] (room, server) = room_jid.split('@') self.room_entry.handler_block(self.room_entry_changed_id) self.room_entry.set_text(room) self.room_entry.handler_unblock(self.room_entry_changed_id) self.server_entry.set_text(server) self.autojoin_checkbutton.set_active(model[iter_][3]) self.minimize_checkbutton.set_active(model[iter_][4]) # sensitive only if auto join is checked self.minimize_checkbutton.set_sensitive(model[iter_][3]) if model[iter_][5] is not None: password = model[iter_][5] else: password = None if password: self.pass_entry.set_text(password) else: self.pass_entry.set_text('') nick = model[iter_][6] if nick: self.nick_entry.set_text(nick) else: self.nick_entry.set_text('') print_status = model[iter_][7] opts = sorted(self.option_list.keys()) self.print_status_combobox.set_active(opts.index(print_status)) def on_title_entry_changed(self, widget): if self.ignore_events: return (model, iter_) = self.selection.get_selected() if iter_: # After removing a bookmark, we got nothing selected if model.iter_parent(iter_): # Don't clear the title field for account nodes model[iter_][1] = self.title_entry.get_text() def on_nick_entry_changed(self, widget): if self.ignore_events: return (model, iter_) = self.selection.get_selected() if iter_: nick = self.nick_entry.get_text() try: nick = helpers.parse_resource(nick) except helpers.InvalidFormat: dialogs.ErrorDialog(_('Invalid nickname'), _('Character not allowed'), transient_for=self.window) self.nick_entry.set_text(model[iter_][6]) return True model[iter_][6] = nick def on_server_entry_changed(self, widget): if self.ignore_events: return (model, iter_) = self.selection.get_selected() if not iter_: return server = widget.get_text() if not server: return if '@' in server: dialogs.ErrorDialog(_('Invalid server'), _('Character not allowed'), transient_for=self.window) widget.set_text(server.replace('@', '')) room = self.room_entry.get_text().strip() if not room: return room_jid = room + '@' + server.strip() try: room_jid = helpers.parse_jid(room_jid) except helpers.InvalidFormat as e: dialogs.ErrorDialog(_('Invalid server'), _('Character not allowed'), transient_for=self.window) self.server_entry.set_text(model[iter_][2].split('@')[1]) return True model[iter_][2] = room_jid def on_room_entry_changed(self, widget): if self.ignore_events: return (model, iter_) = self.selection.get_selected() if not iter_: return room = widget.get_text() if not room: return if '@' in room: room, server = room.split('@', 1) widget.set_text(room) if server: self.server_entry.set_text(server) self.server_entry.grab_focus() server = self.server_entry.get_text().strip() if not server: return room_jid = room.strip() + '@' + server try: room_jid = helpers.parse_jid(room_jid) except helpers.InvalidFormat: dialogs.ErrorDialog(_('Invalid room'), _('Character not allowed'), transient_for=self.window) return True model[iter_][2] = room_jid def on_pass_entry_changed(self, widget): if self.ignore_events: return (model, iter_) = self.selection.get_selected() if iter_: model[iter_][5] = self.pass_entry.get_text() def on_autojoin_checkbutton_toggled(self, widget): if self.ignore_events: return (model, iter_) = self.selection.get_selected() if iter_: model[iter_][3] = self.autojoin_checkbutton.get_active() self.minimize_checkbutton.set_sensitive(model[iter_][3]) def on_minimize_checkbutton_toggled(self, widget): if self.ignore_events: return (model, iter_) = self.selection.get_selected() if iter_: model[iter_][4] = self.minimize_checkbutton.get_active() def on_print_status_combobox_changed(self, widget): if self.ignore_events: return active = widget.get_active() model = widget.get_model() print_status = model[active][1] (model2, iter_) = self.selection.get_selected() if iter_: model2[iter_][7] = print_status def clear_fields(self): widgets = [ self.title_entry, self.nick_entry, self.room_entry, self.server_entry, self.pass_entry ] for field in widgets: field.set_text('') self.autojoin_checkbutton.set_active(False) self.minimize_checkbutton.set_active(False) self.print_status_combobox.set_active(1) class AccountCreationWizardWindow: def __init__(self): self.xml = gtkgui_helpers.get_gtk_builder( 'account_creation_wizard_window.ui') self.window = self.xml.get_object('account_creation_wizard_window') active_window = app.app.get_active_window() self.window.set_transient_for(active_window) # Connect events from comboboxtext_entry server_comboboxtext = self.xml.get_object('server_comboboxtext') entry = self.xml.get_object('server_comboboxtext_entry') entry.connect('key_press_event', self.on_server_comboboxentry_key_press_event, server_comboboxtext) server_comboboxtext1 = self.xml.get_object('server_comboboxtext1') self.update_proxy_list() # parse servers.xml servers_xml = os.path.join(app.DATA_DIR, 'other', 'servers.xml') servers = gtkgui_helpers.parse_server_xml(servers_xml) servers_model = self.xml.get_object('server_liststore') for server in servers: servers_model.append((server,)) server_comboboxtext.set_model(servers_model) server_comboboxtext1.set_model(servers_model) # Generic widgets self.notebook = self.xml.get_object('notebook') self.cancel_button = self.xml.get_object('cancel_button') self.back_button = self.xml.get_object('back_button') self.forward_button = self.xml.get_object('forward_button') self.finish_button = self.xml.get_object('finish_button') self.advanced_button = self.xml.get_object('advanced_button') self.finish_label = self.xml.get_object('finish_label') self.go_online_checkbutton = self.xml.get_object( 'go_online_checkbutton') self.show_vcard_checkbutton = self.xml.get_object( 'show_vcard_checkbutton') self.progressbar = self.xml.get_object('progressbar') # some vars self.update_progressbar_timeout_id = None self.notebook.set_current_page(0) self.xml.connect_signals(self) self.window.show_all() app.ged.register_event_handler('new-account-connected', ged.GUI1, self._nec_new_acc_connected) app.ged.register_event_handler('new-account-not-connected', ged.GUI1, self._nec_new_acc_not_connected) app.ged.register_event_handler('account-created', ged.GUI1, self._nec_acc_is_ok) app.ged.register_event_handler('account-not-created', ged.GUI1, self._nec_acc_is_not_ok) def on_wizard_window_destroy(self, widget): page = self.notebook.get_current_page() if page in (4, 5) and self.account in app.connections: # connection instance is saved in app.connections and we canceled # the addition of the account del app.connections[self.account] if self.account in app.config.get_per('accounts'): app.config.del_per('accounts', self.account) app.ged.remove_event_handler('new-account-connected', ged.GUI1, self._nec_new_acc_connected) app.ged.remove_event_handler('new-account-not-connected', ged.GUI1, self._nec_new_acc_not_connected) app.ged.remove_event_handler('account-created', ged.GUI1, self._nec_acc_is_ok) app.ged.remove_event_handler('account-not-created', ged.GUI1, self._nec_acc_is_not_ok) del app.interface.instances['account_creation_wizard'] def on_register_server_features_button_clicked(self, widget): helpers.launch_browser_mailer('url', 'http://www.jabber.org/network/oldnetwork.shtml') def on_save_password_checkbutton_toggled(self, widget): self.xml.get_object('password_entry').grab_focus() def on_cancel_button_clicked(self, widget): self.window.destroy() def on_back_button_clicked(self, widget): cur_page = self.notebook.get_current_page() self.forward_button.set_sensitive(True) if cur_page in (1, 2): self.notebook.set_current_page(0) self.back_button.set_sensitive(False) elif cur_page == 3: self.xml.get_object('form_vbox').remove(self.data_form_widget) self.notebook.set_current_page(2) # show server page elif cur_page == 4: if self.account in app.connections: del app.connections[self.account] self.notebook.set_current_page(2) self.xml.get_object('form_vbox').remove(self.data_form_widget) elif cur_page == 6: # finish page self.forward_button.show() if self.modify: self.notebook.set_current_page(1) # Go to parameters page else: self.notebook.set_current_page(2) # Go to server page def on_anonymous_checkbutton1_toggled(self, widget): active = widget.get_active() self.xml.get_object('username_entry').set_sensitive(not active) self.xml.get_object('password_entry').set_sensitive(not active) self.xml.get_object('save_password_checkbutton').set_sensitive( not active) def show_finish_page(self): self.cancel_button.hide() self.back_button.hide() self.forward_button.hide() if self.modify: finish_text = '%s\n\n%s' % ( _('Account has been added successfully'), _('You can set advanced account options by pressing the ' 'Advanced button, or later by choosing the Accounts menu item ' 'under the Edit menu from the main window.')) else: finish_text = '%s\n\n%s' % ( _('Your new account has been created successfully'), _('You can set advanced account options by pressing the ' 'Advanced button, or later by choosing the Accounts menu item ' 'under the Edit menu from the main window.')) self.finish_label.set_markup(finish_text) self.finish_button.show() self.finish_button.set_property('has-default', True) self.advanced_button.show() self.go_online_checkbutton.show() img = self.xml.get_object('finish_image') if self.modify: img.set_from_icon_name(Gtk.STOCK_APPLY, Gtk.IconSize.DIALOG) else: path_to_file = gtkgui_helpers.get_icon_path('org.gajim.Gajim', 48) img.set_from_file(path_to_file) self.show_vcard_checkbutton.set_active(not self.modify) self.notebook.set_current_page(6) # show finish page def on_forward_button_clicked(self, widget): cur_page = self.notebook.get_current_page() if cur_page == 0: widget = self.xml.get_object('use_existing_account_radiobutton') if widget.get_active(): self.modify = True self.notebook.set_current_page(1) else: self.modify = False self.notebook.set_current_page(2) self.back_button.set_sensitive(True) return elif cur_page == 1: # We are adding an existing account anonymous = self.xml.get_object('anonymous_checkbutton1').\ get_active() username = self.xml.get_object('username_entry').get_text().strip() if not username and not anonymous: pritext = _('Invalid username') sectext = _( 'You must provide a username to configure this account.') dialogs.ErrorDialog(pritext, sectext) return server = self.xml.get_object('server_comboboxtext_entry').\ get_text().strip() savepass = self.xml.get_object('save_password_checkbutton').\ get_active() password = self.xml.get_object('password_entry').get_text() if anonymous: jid = '' else: jid = username + '@' jid += server # check if jid is conform to RFC and stringprep it try: jid = helpers.parse_jid(jid) except helpers.InvalidFormat as s: pritext = _('Invalid JID') dialogs.ErrorDialog(pritext, str(s)) return self.account = server i = 1 while self.account in app.config.get_per('accounts'): self.account = server + str(i) i += 1 username, server = app.get_name_and_server_from_jid(jid) if self.xml.get_object('anonymous_checkbutton1').get_active(): self.save_account('', server, False, '', anonymous=True) else: self.save_account(username, server, savepass, password) self.show_finish_page() elif cur_page == 2: # We are creating a new account server = self.xml.get_object('server_comboboxtext_entry1').\ get_text() if not server: dialogs.ErrorDialog(_('Invalid server'), _('Please provide a server on which you want to register.')) return self.account = server i = 1 while self.account in app.config.get_per('accounts'): self.account = server + str(i) i += 1 config = self.get_config('', server, '', '') # Get advanced options proxies_combobox = self.xml.get_object('proxies_combobox') active = proxies_combobox.get_active() proxy = proxies_combobox.get_model()[active][0] if proxy == _('None'): proxy = '' config['proxy'] = proxy config['use_custom_host'] = self.xml.get_object( 'custom_host_port_checkbutton').get_active() custom_port = self.xml.get_object('custom_port_entry').get_text() try: custom_port = int(custom_port) except Exception: dialogs.ErrorDialog(_('Invalid entry'), _('Custom port must be a port number.')) return config['custom_port'] = custom_port config['custom_host'] = self.xml.get_object( 'custom_host_entry').get_text() if self.xml.get_object('anonymous_checkbutton2').get_active(): self.modify = True self.save_account('', server, False, '', anonymous=True) self.show_finish_page() else: self.notebook.set_current_page(5) # show creating page self.back_button.hide() self.forward_button.hide() self.update_progressbar_timeout_id = GLib.timeout_add(100, self.update_progressbar) # Get form from serveur con = connection.Connection(self.account) app.connections[self.account] = con con.new_account(self.account, config) elif cur_page == 3: checked = self.xml.get_object('ssl_checkbutton').get_active() if checked: hostname = app.connections[self.account].new_account_info[ 'hostname'] # Check if cert is already in file certs = '' if os.path.isfile(app.MY_CACERTS): f = open(app.MY_CACERTS) certs = f.read() f.close() if self.ssl_cert in certs: dialogs.ErrorDialog(_('Certificate Already in File'), _('This certificate is already in file %s, so it\'s ' 'not added again.') % app.MY_CACERTS) else: f = open(app.MY_CACERTS, 'a') f.write(hostname + '\n') f.write(self.ssl_cert + '\n\n') f.close() app.connections[self.account].new_account_info[ 'ssl_fingerprint_sha1'] = self.ssl_fingerprint_sha1 app.connections[self.account].new_account_info[ 'ssl_fingerprint_sha256'] = self.ssl_fingerprint_sha256 self.notebook.set_current_page(4) # show fom page elif cur_page == 4: if self.is_form: form = self.data_form_widget.data_form else: form = self.data_form_widget.get_infos() app.connections[self.account].send_new_account_infos(form, self.is_form) self.xml.get_object('form_vbox').remove(self.data_form_widget) self.xml.get_object('progressbar_label').set_markup( 'Account is being created\n\nPlease wait…') self.notebook.set_current_page(5) # show creating page self.back_button.hide() self.forward_button.hide() self.update_progressbar_timeout_id = GLib.timeout_add(100, self.update_progressbar) def update_proxy_list(self): proxies_combobox = self.xml.get_object('proxies_combobox') model = Gtk.ListStore(str) proxies_combobox.set_model(model) l = app.config.get_per('proxies') l.insert(0, _('None')) for i in range(len(l)): model.append([l[i]]) proxies_combobox.set_active(0) def on_manage_proxies_button_clicked(self, widget): if 'manage_proxies' in app.interface.instances: app.interface.instances['manage_proxies'].window.present() else: app.interface.instances['manage_proxies'] = \ ManageProxiesWindow() def on_custom_host_port_checkbutton_toggled(self, widget): self.xml.get_object('custom_host_hbox').set_sensitive(widget.\ get_active()) def update_progressbar(self): self.progressbar.pulse() return True # loop forever def _nec_new_acc_connected(self, obj): """ Connection to server succeded, present the form to the user """ # We receive events from all accounts from GED if obj.conn.name != self.account: return if self.update_progressbar_timeout_id is not None: GLib.source_remove(self.update_progressbar_timeout_id) self.back_button.show() self.forward_button.show() self.is_form = obj.is_form empty_config = True if obj.is_form: dataform = dataforms.ExtendForm(node=obj.config) self.data_form_widget = dataforms_widget.DataFormWidget() self.data_form_widget.selectable = True self.data_form_widget.set_data_form(dataform) empty_config = False else: self.data_form_widget = FakeDataForm(obj.config, selectable=True) for field in obj.config: if field in ('key', 'instructions', 'x', 'registered'): continue empty_config = False break self.data_form_widget.show_all() self.xml.get_object('form_vbox').pack_start(self.data_form_widget, True, True, 0) if empty_config: self.forward_button.set_sensitive(False) self.notebook.set_current_page(4) # show form page return self.ssl_fingerprint_sha1 = obj.ssl_fingerprint_sha1 self.ssl_fingerprint_sha256 = obj.ssl_fingerprint_sha256 self.ssl_cert = obj.ssl_cert if obj.ssl_msg: # An SSL warning occured, show it hostname = app.connections[self.account].new_account_info[ 'hostname'] self.xml.get_object('ssl_label').set_markup(_( 'Security Warning' '\n\nThe authenticity of the %(hostname)s SSL certificate could' ' be invalid.\nSSL Error: %(error)s\n' 'Do you still want to connect to this server?') % { 'hostname': hostname, 'error': obj.ssl_msg}) if obj.errnum in (18, 27): text = _('Add this certificate to the list of trusted ' 'certificates.\nSHA-1 fingerprint of the certificate:\n' '%(sha1)s\nSHA-256 fingerprint of the certificate:\n' '%(sha256)s') % {'sha1': obj.ssl_fingerprint_sha1, 'sha256': obj.ssl_fingerprint_sha256} self.xml.get_object('ssl_checkbutton').set_label(text) else: self.xml.get_object('ssl_checkbutton').set_no_show_all(True) self.xml.get_object('ssl_checkbutton').hide() self.notebook.set_current_page(3) # show SSL page else: self.notebook.set_current_page(4) # show form page def _nec_new_acc_not_connected(self, obj): """ Account creation failed: connection to server failed """ # We receive events from all accounts from GED if obj.conn.name != self.account: return if self.account not in app.connections: return if self.update_progressbar_timeout_id is not None: GLib.source_remove(self.update_progressbar_timeout_id) del app.connections[self.account] if self.account in app.config.get_per('accounts'): app.config.del_per('accounts', self.account) self.back_button.show() self.cancel_button.show() self.go_online_checkbutton.hide() self.show_vcard_checkbutton.hide() img = self.xml.get_object('finish_image') img.set_from_icon_name("dialog-error", Gtk.IconSize.DIALOG) finish_text = '%s\n\n%s' % ( _('An error occurred during account creation'), obj.reason) self.finish_label.set_markup(finish_text) self.notebook.set_current_page(6) # show finish page def _nec_acc_is_ok(self, obj): """ Account creation succeeded """ # We receive events from all accounts from GED if obj.conn.name != self.account: return self.create_vars(obj.account_info) self.show_finish_page() if self.update_progressbar_timeout_id is not None: GLib.source_remove(self.update_progressbar_timeout_id) def _nec_acc_is_not_ok(self, obj): """ Account creation failed """ # We receive events from all accounts from GED if obj.conn.name != self.account: return self.back_button.show() self.cancel_button.show() self.go_online_checkbutton.hide() self.show_vcard_checkbutton.hide() del app.connections[self.account] if self.account in app.config.get_per('accounts'): app.config.del_per('accounts', self.account) img = self.xml.get_object('finish_image') img.set_from_icon_name("dialog-error", Gtk.IconSize.DIALOG) finish_text = '%s\n\n%s' % (_( 'An error occurred during account creation'), obj.reason) self.finish_label.set_markup(finish_text) self.notebook.set_current_page(6) # show finish page if self.update_progressbar_timeout_id is not None: GLib.source_remove(self.update_progressbar_timeout_id) def on_advanced_button_clicked(self, widget): if 'accounts' in app.interface.instances: app.interface.instances['accounts'].present() else: app.interface.instances['accounts'] = AccountsWindow() app.interface.instances['accounts'].select_account(self.account) self.window.destroy() def on_finish_button_clicked(self, widget): go_online = self.xml.get_object('go_online_checkbutton').get_active() show_vcard = self.xml.get_object('show_vcard_checkbutton').get_active() self.window.destroy() if show_vcard: app.interface.show_vcard_when_connect.append(self.account) if go_online: app.interface.roster.send_status(self.account, 'online', '') def on_username_entry_key_press_event(self, widget, event): # Check for pressed @ and jump to combobox if found if event.keyval == Gdk.KEY_at: entry = self.xml.get_object('server_comboboxtext_entry') entry.grab_focus() entry.set_position(-1) return True def on_server_comboboxentry_key_press_event(self, widget, event, combobox): # If backspace is pressed in empty field, return to the nick entry field backspace = event.keyval == Gdk.KEY_BackSpace empty = len(combobox.get_active_text()) == 0 if backspace and empty and self.modify: username_entry = self.xml.get_object('username_entry') username_entry.grab_focus() username_entry.set_position(-1) return True def get_config(self, login, server, savepass, password, anonymous=False): config = {} config['name'] = login config['hostname'] = server config['savepass'] = savepass config['password'] = password config['anonymous_auth'] = anonymous config['priority'] = 5 config['autoconnect'] = True config['no_log_for'] = '' config['sync_with_global_status'] = True config['proxy'] = '' config['use_custom_host'] = False config['custom_port'] = 0 config['custom_host'] = '' config['keyname'] = '' config['keyid'] = '' return config def save_account(self, login, server, savepass, password, anonymous=False): if self.account in app.connections: dialogs.ErrorDialog(_('Account name is in use'), _('You already have an account using this name.')) return con = connection.Connection(self.account) con.password = password config = self.get_config(login, server, savepass, password, anonymous) if not self.modify: con.new_account(self.account, config) return app.connections[self.account] = con self.create_vars(config) def create_vars(self, config): app.config.add_per('accounts', self.account) if not config['savepass']: config['password'] = '' for opt in config: app.config.set_per('accounts', self.account, opt, config[opt]) # update variables app.interface.instances[self.account] = {'infos': {}, 'disco': {}, 'gc_config': {}, 'search': {}, 'online_dialog': {}, 'sub_request': {}} app.interface.minimized_controls[self.account] = {} app.connections[self.account].connected = 0 app.connections[self.account].keepalives = app.config.get_per( 'accounts', self.account, 'keep_alive_every_foo_secs') app.groups[self.account] = {} app.contacts.add_account(self.account) app.gc_connected[self.account] = {} app.automatic_rooms[self.account] = {} app.newly_added[self.account] = [] app.to_be_removed[self.account] = [] app.nicks[self.account] = config['name'] app.block_signed_in_notifications[self.account] = True app.sleeper_state[self.account] = 'off' app.encrypted_chats[self.account] = [] app.last_message_time[self.account] = {} app.status_before_autoaway[self.account] = '' app.transport_avatar[self.account] = {} app.gajim_optional_features[self.account] = [] app.caps_hash[self.account] = '' helpers.update_optional_features(self.account) # action must be added before account window is updated app.app.add_account_actions(self.account) # refresh accounts window if 'accounts' in app.interface.instances: app.interface.instances['accounts'].add_account(self.account) # refresh roster if len(app.connections) >= 2: # Do not merge accounts if only one exists app.interface.roster.regroup = app.config.get('mergeaccounts') else: app.interface.roster.regroup = False app.interface.roster.setup_and_draw_roster() gui_menu_builder.build_accounts_menu() class ManagePEPServicesWindow: def __init__(self, account): self.xml = gtkgui_helpers.get_gtk_builder('manage_pep_services_window.ui') self.window = self.xml.get_object('manage_pep_services_window') self.window.set_transient_for(app.interface.roster.window) self.xml.get_object('configure_button').set_sensitive(False) self.xml.get_object('delete_button').set_sensitive(False) self.xml.connect_signals(self) self.account = account self.init_services() self.xml.get_object('services_treeview').get_selection().connect( 'changed', self.on_services_selection_changed) app.ged.register_event_handler('pep-config-received', ged.GUI1, self._nec_pep_config_received) app.ged.register_event_handler('agent-items-received', ged.GUI1, self._nec_agent_items_received) self.window.show_all() def on_manage_pep_services_window_destroy(self, widget): '''close window''' del app.interface.instances[self.account]['pep_services'] app.ged.remove_event_handler('pep-config-received', ged.GUI1, self._nec_pep_config_received) app.ged.remove_event_handler('agent-items-received', ged.GUI1, self._nec_agent_items_received) def on_close_button_clicked(self, widget): self.window.destroy() def on_services_selection_changed(self, sel): self.xml.get_object('configure_button').set_sensitive(True) self.xml.get_object('delete_button').set_sensitive(True) def init_services(self): self.treeview = self.xml.get_object('services_treeview') # service, access_model, group self.treestore = Gtk.ListStore(str) self.treeview.set_model(self.treestore) col = Gtk.TreeViewColumn('Service') self.treeview.append_column(col) cellrenderer_text = Gtk.CellRendererText() col.pack_start(cellrenderer_text, True) col.add_attribute(cellrenderer_text, 'text', 0) our_jid = app.get_jid_from_account(self.account) app.connections[self.account].discoverItems(our_jid) def _nec_agent_items_received(self, obj): our_jid = app.get_jid_from_account(self.account) for item in obj.items: if 'jid' in item and item['jid'] == our_jid and 'node' in item: self.treestore.append([item['node']]) def node_removed(self, jid, node): if jid != app.get_jid_from_account(self.account): return model = self.treeview.get_model() iter_ = model.get_iter_first() while iter_: if model[iter_][0] == node: model.remove(iter_) break iter_ = model.iter_next(iter_) def node_not_removed(self, jid, node, msg): if jid != app.get_jid_from_account(self.account): return dialogs.WarningDialog(_('PEP node was not removed'), _('PEP node %(node)s was not removed: %(message)s') % {'node': node, 'message': msg}) def on_delete_button_clicked(self, widget): selection = self.treeview.get_selection() if not selection: return model, iter_ = selection.get_selected() node = model[iter_][0] our_jid = app.get_jid_from_account(self.account) app.connections[self.account].send_pb_delete(our_jid, node, on_ok=self.node_removed, on_fail=self.node_not_removed) def on_configure_button_clicked(self, widget): selection = self.treeview.get_selection() if not selection: return model, iter_ = selection.get_selected() node = model[iter_][0] our_jid = app.get_jid_from_account(self.account) app.connections[self.account].request_pb_configuration(our_jid, node) def _nec_pep_config_received(self, obj): def on_ok(form, node): form.type_ = 'submit' our_jid = app.get_jid_from_account(self.account) app.connections[self.account].send_pb_configure(our_jid, node, form) window = dialogs.DataFormWindow(obj.form, (on_ok, obj.node)) title = _('Configure %s') % obj.node window.set_title(title) window.show_all() class ManageSoundsWindow: def __init__(self): self.xml = gtkgui_helpers.get_gtk_builder('manage_sounds_window.ui') self.window = self.xml.get_object('manage_sounds_window') self.window.set_transient_for( app.interface.instances['preferences'].window) # sounds treeview self.sound_tree = self.xml.get_object('sounds_treeview') # active, event ui name, path to sound file, event_config_name model = Gtk.ListStore(bool, str, str, str) self.sound_tree.set_model(model) col = Gtk.TreeViewColumn(_('Active')) self.sound_tree.append_column(col) renderer = Gtk.CellRendererToggle() renderer.set_property('activatable', True) renderer.connect('toggled', self.sound_toggled_cb) col.pack_start(renderer, True) col.add_attribute(renderer, 'active', 0) col = Gtk.TreeViewColumn(_('Event')) self.sound_tree.append_column(col) renderer = Gtk.CellRendererText() col.pack_start(renderer, True) col.add_attribute(renderer, 'text', 1) self.fill_sound_treeview() self.xml.connect_signals(self) self.sound_tree.get_model().connect('row-changed', self.on_sounds_treemodel_row_changed) self.window.show_all() def on_sounds_treemodel_row_changed(self, model, path, iter_): sound_event = model[iter_][3] app.config.set_per('soundevents', sound_event, 'enabled', bool(model[path][0])) app.config.set_per('soundevents', sound_event, 'path', model[iter_][2]) def sound_toggled_cb(self, cell, path): model = self.sound_tree.get_model() model[path][0] = not model[path][0] def fill_sound_treeview(self): model = self.sound_tree.get_model() model.clear() model.set_sort_column_id(1, Gtk.SortType.ASCENDING) # NOTE: sounds_ui_names MUST have all items of # sounds = app.config.get_per('soundevents') as keys sounds_dict = { 'attention_received': _('Attention Message Received'), 'first_message_received': _('First Message Received'), 'next_message_received_focused': _('Next Message Received Focused'), 'next_message_received_unfocused': _('Next Message Received Unfocused'), 'contact_connected': _('Contact Connected'), 'contact_disconnected': _('Contact Disconnected'), 'message_sent': _('Message Sent'), 'muc_message_highlight': _('Group Chat Message Highlight'), 'muc_message_received': _('Group Chat Message Received'), } for sound_event_config_name, sound_ui_name in sounds_dict.items(): enabled = app.config.get_per('soundevents', sound_event_config_name, 'enabled') path = app.config.get_per('soundevents', sound_event_config_name, 'path') model.append((enabled, sound_ui_name, path, sound_event_config_name)) def on_treeview_sounds_cursor_changed(self, widget, data = None): sounds_entry = self.xml.get_object('sounds_entry') sel = self.sound_tree.get_selection() if not sel: sounds_entry.set_text('') return (model, iter_) = sel.get_selected() if not iter_: sounds_entry.set_text('') return path_to_snd_file = model[iter_][2] sounds_entry.set_text(path_to_snd_file) def on_browse_for_sounds_button_clicked(self, widget, data = None): sel = self.sound_tree.get_selection() if not sel: return (model, iter_) = sel.get_selected() if not iter_: return def on_ok(widget, path_to_snd_file): self.dialog.destroy() model, iter_ = self.sound_tree.get_selection().get_selected() if not path_to_snd_file: model[iter_][2] = '' self.xml.get_object('sounds_entry').set_text('') model[iter_][0] = False return directory = os.path.dirname(path_to_snd_file) app.config.set('last_sounds_dir', directory) path_to_snd_file = helpers.strip_soundfile_path(path_to_snd_file) self.xml.get_object('sounds_entry').set_text(path_to_snd_file) model[iter_][2] = path_to_snd_file # set new path to sounds_model model[iter_][0] = True # set the sound to enabled def on_cancel(widget): self.dialog.destroy() path_to_snd_file = model[iter_][2] self.dialog = dialogs.SoundChooserDialog(path_to_snd_file, on_ok, on_cancel, transient_for=self.window) def on_sounds_entry_changed(self, widget): path_to_snd_file = widget.get_text() model, iter_ = self.sound_tree.get_selection().get_selected() model[iter_][2] = path_to_snd_file # set new path to sounds_model def on_play_button_clicked(self, widget): sel = self.sound_tree.get_selection() if not sel: return model, iter_ = sel.get_selected() if not iter_: return snd_event_config_name = model[iter_][3] helpers.play_sound(snd_event_config_name) def on_close_button_clicked(self, widget): self.window.hide() def on_manage_sounds_window_delete_event(self, widget, event): self.window.hide() return True # do NOT destroy the window gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/conversation_textview.py000066400000000000000000001555201326020644600270250ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/conversation_textview.py ## ## Copyright (C) 2005 Norman Rasmussen ## Copyright (C) 2005-2006 Alex Mauer ## Travis Shirk ## Copyright (C) 2005-2007 Nikos Kouremenos ## Copyright (C) 2005-2014 Yann Leboulanger ## Copyright (C) 2006 Dimitur Kirov ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2008 Jonathan Schleifer ## Julien Pivotto ## Stephan Erb ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from threading import Timer # for smooth scrolling from gi.repository import Gtk from gi.repository import Gdk from gi.repository import Pango from gi.repository import GObject from gi.repository import GLib import time import os from gajim import dialogs import queue import urllib from gajim import gtkgui_helpers from gajim.common import app from gajim.common import helpers from gajim.common import i18n from calendar import timegm from gajim.common.fuzzyclock import FuzzyClock from gajim import emoticons from gajim.htmltextview import HtmlTextView NOT_SHOWN = 0 ALREADY_RECEIVED = 1 SHOWN = 2 import logging log = logging.getLogger('gajim.conversation_textview') def is_selection_modified(mark): name = mark.get_name() if name and name in ('selection_bound', 'insert'): return True else: return False def has_focus(widget): return widget.get_state_flags() & Gtk.StateFlags.FOCUSED == \ Gtk.StateFlags.FOCUSED class TextViewImage(Gtk.Image): def __init__(self, anchor, text): super(TextViewImage, self).__init__() self.anchor = anchor self._selected = False self._disconnect_funcs = [] self.connect('parent-set', self.on_parent_set) self.set_tooltip_markup(text) self.anchor.plaintext = text def _get_selected(self): parent = self.get_parent() if not parent or not self.anchor: return False buffer_ = parent.get_buffer() position = buffer_.get_iter_at_child_anchor(self.anchor) bounds = buffer_.get_selection_bounds() if bounds and position.in_range(*bounds): return True else: return False def get_state(self): parent = self.get_parent() if not parent: return Gtk.StateType.NORMAL if self._selected: if has_focus(parent): return Gtk.StateType.SELECTED else: return Gtk.StateType.ACTIVE else: return Gtk.StateType.NORMAL def _update_selected(self): selected = self._get_selected() if self._selected != selected: self._selected = selected self.queue_draw() def _do_connect(self, widget, signal, callback): id_ = widget.connect(signal, callback) def disconnect(): widget.disconnect(id_) self._disconnect_funcs.append(disconnect) def _disconnect_signals(self): for func in self._disconnect_funcs: func() self._disconnect_funcs = [] def on_parent_set(self, widget, old_parent): parent = self.get_parent() if not parent: self._disconnect_signals() return if isinstance(parent, Gtk.EventBox): parent = parent.get_parent() if not parent: self._disconnect_signals() return self._do_connect(parent, 'style-set', self.do_queue_draw) self._do_connect(parent, 'focus-in-event', self.do_queue_draw) self._do_connect(parent, 'focus-out-event', self.do_queue_draw) textbuf = parent.get_buffer() self._do_connect(textbuf, 'mark-set', self.on_mark_set) self._do_connect(textbuf, 'mark-deleted', self.on_mark_deleted) def do_queue_draw(self, *args): self.queue_draw() return False def on_mark_set(self, buf, iterat, mark): self.on_mark_modified(mark) return False def on_mark_deleted(self, buf, mark): self.on_mark_modified(mark) return False def on_mark_modified(self, mark): if is_selection_modified(mark): self._update_selected() class ConversationTextview(GObject.GObject): """ Class for the conversation textview (where user reads already said messages) for chat/groupchat windows """ __gsignals__ = dict( quote = (GObject.SignalFlags.RUN_LAST | GObject.SignalFlags.ACTION, None, # return value (str, ) # arguments ) ) MESSAGE_CORRECTED_PIXBUF = gtkgui_helpers.get_icon_pixmap( 'document-edit-symbolic') MESSAGE_ENCRYPTED_PIXBUF = gtkgui_helpers.get_icon_pixmap( 'channel-secure-croped-symbolic') # smooth scroll constants MAX_SCROLL_TIME = 0.4 # seconds SCROLL_DELAY = 33 # milliseconds def __init__(self, account, used_in_history_window = False): """ If used_in_history_window is True, then we do not show Clear menuitem in context menu """ GObject.GObject.__init__(self) self.used_in_history_window = used_in_history_window self.line = 0 self.message_list = [] self.corrected_text_list = {} self.fc = FuzzyClock() # no need to inherit TextView, use it as atrribute is safer self.tv = HtmlTextView() # we have to override HtmlTextView Event handlers # because we dont inherit self.tv.hyperlink_handler = self.hyperlink_handler self.tv.connect_tooltip(self.query_tooltip) # set properties self.tv.set_border_width(1) self.tv.set_accepts_tab(True) self.tv.set_editable(False) self.tv.set_cursor_visible(False) self.tv.set_wrap_mode(Gtk.WrapMode.WORD_CHAR) self.tv.set_left_margin(2) self.tv.set_right_margin(2) self.handlers = {} self.images = [] self.image_cache = {} self.xep0184_marks = {} # self.last_sent_message_id = msg_stanza_id self.last_sent_message_id = None # last_received_message_id[name] = (msg_stanza_id, line_start_mark) self.last_received_message_id = {} self.autoscroll = True # connect signals id_ = self.tv.connect('populate_popup', self.on_textview_populate_popup) self.handlers[id_] = self.tv id_ = self.tv.connect('button_press_event', self.on_textview_button_press_event) self.handlers[id_] = self.tv self.account = account self.cursor_changed = False self.last_time_printout = 0 style = self.tv.get_style_context() style.add_class('font_custom') buffer_ = self.tv.get_buffer() end_iter = buffer_.get_end_iter() buffer_.create_mark('end', end_iter, False) self.tagIn = buffer_.create_tag('incoming') color = app.config.get('inmsgcolor') font = Pango.FontDescription(app.config.get('inmsgfont')) self.tagIn.set_property('foreground', color) self.tagIn.set_property('font-desc', font) self.tagOut = buffer_.create_tag('outgoing') color = app.config.get('outmsgcolor') font = Pango.FontDescription(app.config.get('outmsgfont')) self.tagOut.set_property('foreground', color) self.tagOut.set_property('font-desc', font) self.tagStatus = buffer_.create_tag('status') color = app.config.get('statusmsgcolor') font = Pango.FontDescription(app.config.get('satusmsgfont')) self.tagStatus.set_property('foreground', color) self.tagStatus.set_property('font-desc', font) self.tagInText = buffer_.create_tag('incomingtxt') color = app.config.get('inmsgtxtcolor') font = Pango.FontDescription(app.config.get('inmsgtxtfont')) if color: self.tagInText.set_property('foreground', color) self.tagInText.set_property('font-desc', font) self.tagOutText = buffer_.create_tag('outgoingtxt') color = app.config.get('outmsgtxtcolor') if color: font = Pango.FontDescription(app.config.get('outmsgtxtfont')) self.tagOutText.set_property('foreground', color) self.tagOutText.set_property('font-desc', font) colors = app.config.get('gc_nicknames_colors') colors = colors.split(':') for i, color in enumerate(colors): tagname = 'gc_nickname_color_' + str(i) tag = buffer_.create_tag(tagname) tag.set_property('foreground', color) self.tagMarked = buffer_.create_tag('marked') color = app.config.get('markedmsgcolor') self.tagMarked.set_property('foreground', color) self.tagMarked.set_property('weight', Pango.Weight.BOLD) tag = buffer_.create_tag('time_sometimes') tag.set_property('foreground', 'darkgrey') #Pango.SCALE_SMALL tag.set_property('scale', 0.8333333333333) tag.set_property('justification', Gtk.Justification.CENTER) tag = buffer_.create_tag('small') #Pango.SCALE_SMALL tag.set_property('scale', 0.8333333333333) tag = buffer_.create_tag('restored_message') color = app.config.get('restored_messages_color') tag.set_property('foreground', color) self.tv.create_tags() tag = buffer_.create_tag('bold') tag.set_property('weight', Pango.Weight.BOLD) tag = buffer_.create_tag('italic') tag.set_property('style', Pango.Style.ITALIC) tag = buffer_.create_tag('underline') tag.set_property('underline', Pango.Underline.SINGLE) buffer_.create_tag('focus-out-line', justification = Gtk.Justification.CENTER) self.displaymarking_tags = {} tag = buffer_.create_tag('xep0184-received') tag.set_property('foreground', '#73d216') # One mark at the begining then 2 marks between each lines size = app.config.get('max_conversation_lines') size = 2 * size - 1 self.marks_queue = queue.Queue(size) self.allow_focus_out_line = True # holds a mark at the end of --- line self.focus_out_end_mark = None self.just_cleared = False def query_tooltip(self, widget, x_pos, y_pos, keyboard_mode, tooltip): window = widget.get_window(Gtk.TextWindowType.TEXT) x_pos, y_pos = self.tv.window_to_buffer_coords( Gtk.TextWindowType.TEXT, x_pos, y_pos) if Gtk.MINOR_VERSION > 18: iter_ = self.tv.get_iter_at_position(x_pos, y_pos)[1] else: iter_ = self.tv.get_iter_at_position(x_pos, y_pos)[0] for tag in iter_.get_tags(): tag_name = tag.get_property('name') if tag_name == 'focus-out-line': tooltip.set_text(_( 'Text below this line is what has ' 'been said since the\nlast time you paid attention to this ' 'group chat')) return True if getattr(tag, 'is_anchor', False): text = getattr(tag, 'title', False) if text: if len(text) > 50: text = text[:47] + '…' tooltip.set_text(text) window.set_cursor(gtkgui_helpers.get_cursor('HAND2')) self.cursor_changed = True return True if tag_name in ('url', 'mail', 'xmpp', 'sth_at_sth'): window.set_cursor(gtkgui_helpers.get_cursor('HAND2')) self.cursor_changed = True return False try: text = self.corrected_text_list[tag_name] tooltip.set_markup(text) return True except KeyError: pass if self.cursor_changed: window.set_cursor(gtkgui_helpers.get_cursor('XTERM')) self.cursor_changed = False return False def del_handlers(self): for i in self.handlers.keys(): if self.handlers[i].handler_is_connected(i): self.handlers[i].disconnect(i) del self.handlers self.tv.destroy() def update_tags(self): self.tagIn.set_property('foreground', app.config.get('inmsgcolor')) self.tagOut.set_property('foreground', app.config.get('outmsgcolor')) self.tagStatus.set_property('foreground', app.config.get('statusmsgcolor')) self.tagMarked.set_property('foreground', app.config.get('markedmsgcolor')) color = app.config.get('urlmsgcolor') self.tv.tagURL.set_property('foreground', color) self.tv.tagMail.set_property('foreground', color) self.tv.tagXMPP.set_property('foreground', color) self.tv.tagSthAtSth.set_property('foreground', color) def scroll_to_end(self, force=False): if self.autoscroll or force: gtkgui_helpers.scroll_to_end(self.tv.get_parent()) def correct_message(self, correct_id, kind, name): allowed = True if kind == 'incoming': try: if correct_id in self.last_received_message_id[name]: start_mark = self.last_received_message_id[name][1] else: allowed = False except KeyError: allowed = False elif kind == 'outgoing': if self.last_sent_message_id[0] == correct_id: start_mark = self.last_sent_message_id[1] else: allowed = False else: allowed = False if not allowed: log.debug('Message correctiong not allowed') return None end_mark, index = self.get_end_mark(correct_id, start_mark) if not index: log.debug('Could not find line to correct') return None buffer_ = self.tv.get_buffer() if not end_mark: end_iter = self.tv.get_buffer().get_end_iter() else: end_iter = buffer_.get_iter_at_mark(end_mark) start_iter = buffer_.get_iter_at_mark(start_mark) old_txt = buffer_.get_text(start_iter, end_iter, True) buffer_.delete(start_iter, end_iter) buffer_.delete_mark(start_mark) return index, end_mark, old_txt def add_xep0184_mark(self, id_): if id_ in self.xep0184_marks: return buffer_ = self.tv.get_buffer() buffer_.begin_user_action() self.xep0184_marks[id_] = buffer_.create_mark( None, buffer_.get_end_iter(), left_gravity=True) buffer_.end_user_action() def show_xep0184_ack(self, id_): if id_ not in self.xep0184_marks: return buffer_ = self.tv.get_buffer() buffer_.begin_user_action() if app.config.get('positive_184_ack'): begin_iter = buffer_.get_iter_at_mark(self.xep0184_marks[id_]) buffer_.insert_with_tags_by_name(begin_iter, ' ✓', 'xep0184-received') buffer_.end_user_action() del self.xep0184_marks[id_] def show_focus_out_line(self): if not self.allow_focus_out_line: # if room did not receive focus-in from the last time we added # --- line then do not readd return print_focus_out_line = False buffer_ = self.tv.get_buffer() if self.focus_out_end_mark is None: # this happens only first time we focus out on this room print_focus_out_line = True else: focus_out_end_iter = buffer_.get_iter_at_mark(self.focus_out_end_mark) focus_out_end_iter_offset = focus_out_end_iter.get_offset() if focus_out_end_iter_offset != buffer_.get_end_iter().get_offset(): # this means after last-focus something was printed # (else end_iter's offset is the same as before) # only then print ---- line (eg. we avoid printing many following # ---- lines) print_focus_out_line = True if print_focus_out_line and buffer_.get_char_count() > 0: buffer_.begin_user_action() # remove previous focus out line if such focus out line exists if self.focus_out_end_mark is not None: end_iter_for_previous_line = buffer_.get_iter_at_mark( self.focus_out_end_mark) begin_iter_for_previous_line = end_iter_for_previous_line.copy() # img_char+1 (the '\n') begin_iter_for_previous_line.backward_chars(21) # remove focus out line buffer_.delete(begin_iter_for_previous_line, end_iter_for_previous_line) buffer_.delete_mark(self.focus_out_end_mark) # add the new focus out line end_iter = buffer_.get_end_iter() buffer_.insert(end_iter, '\n' + '―' * 20) end_iter = buffer_.get_end_iter() before_img_iter = end_iter.copy() # one char back (an image also takes one char) before_img_iter.backward_chars(20) buffer_.apply_tag_by_name('focus-out-line', before_img_iter, end_iter) self.allow_focus_out_line = False # update the iter we hold to make comparison the next time self.focus_out_end_mark = buffer_.create_mark(None, buffer_.get_end_iter(), left_gravity=True) buffer_.end_user_action() self.scroll_to_end() def clear(self, tv = None): """ Clear text in the textview """ buffer_ = self.tv.get_buffer() start, end = buffer_.get_bounds() buffer_.delete(start, end) size = app.config.get('max_conversation_lines') size = 2 * size - 1 self.marks_queue = queue.Queue(size) self.focus_out_end_mark = None self.just_cleared = True def visit_url_from_menuitem(self, widget, link): """ Basically it filters out the widget instance """ helpers.launch_browser_mailer('url', link) def on_textview_populate_popup(self, textview, menu): """ Override the default context menu and we prepend Clear (only if used_in_history_window is False) and if we have sth selected we show a submenu with actions on the phrase (see on_conversation_textview_button_press_event) """ separator_menuitem_was_added = False if not self.used_in_history_window: item = Gtk.SeparatorMenuItem.new() menu.prepend(item) separator_menuitem_was_added = True item = Gtk.MenuItem.new_with_mnemonic(_('_Clear')) menu.prepend(item) id_ = item.connect('activate', self.clear) self.handlers[id_] = item if self.selected_phrase: if not separator_menuitem_was_added: item = Gtk.SeparatorMenuItem.new() menu.prepend(item) if not self.used_in_history_window: item = Gtk.MenuItem.new_with_mnemonic(_('_Quote')) id_ = item.connect('activate', self.on_quote) self.handlers[id_] = item menu.prepend(item) _selected_phrase = helpers.reduce_chars_newlines( self.selected_phrase, 25, 2) item = Gtk.MenuItem.new_with_mnemonic( _('_Actions for "%s"') % _selected_phrase) menu.prepend(item) submenu = Gtk.Menu() item.set_submenu(submenu) phrase_for_url = urllib.parse.quote(self.selected_phrase.encode( 'utf-8')) always_use_en = app.config.get('always_english_wikipedia') if always_use_en: link = 'http://en.wikipedia.org/wiki/Special:Search?search=%s'\ % phrase_for_url else: link = 'http://%s.wikipedia.org/wiki/Special:Search?search=%s'\ % (app.LANG, phrase_for_url) item = Gtk.MenuItem.new_with_mnemonic(_('Read _Wikipedia Article')) id_ = item.connect('activate', self.visit_url_from_menuitem, link) self.handlers[id_] = item submenu.append(item) item = Gtk.MenuItem.new_with_mnemonic(_('Look it up in _Dictionary')) dict_link = app.config.get('dictionary_url') if dict_link == 'WIKTIONARY': # special link (yeah undocumented but default) always_use_en = app.config.get('always_english_wiktionary') if always_use_en: link = 'http://en.wiktionary.org/wiki/Special:Search?search=%s'\ % phrase_for_url else: link = 'http://%s.wiktionary.org/wiki/Special:Search?search=%s'\ % (app.LANG, phrase_for_url) id_ = item.connect('activate', self.visit_url_from_menuitem, link) self.handlers[id_] = item else: if dict_link.find('%s') == -1: # we must have %s in the url if not WIKTIONARY item = Gtk.MenuItem.new_with_label(_( 'Dictionary URL is missing an "%s" and it is not WIKTIONARY')) item.set_property('sensitive', False) else: link = dict_link % phrase_for_url id_ = item.connect('activate', self.visit_url_from_menuitem, link) self.handlers[id_] = item submenu.append(item) search_link = app.config.get('search_engine') if search_link.find('%s') == -1: # we must have %s in the url item = Gtk.MenuItem.new_with_label( _('Web Search URL is missing an "%s"')) item.set_property('sensitive', False) else: item = Gtk.MenuItem.new_with_mnemonic(_('Web _Search for it')) link = search_link % phrase_for_url id_ = item.connect('activate', self.visit_url_from_menuitem, link) self.handlers[id_] = item submenu.append(item) item = Gtk.MenuItem.new_with_mnemonic(_('Open as _Link')) id_ = item.connect('activate', self.visit_url_from_menuitem, link) self.handlers[id_] = item submenu.append(item) menu.show_all() def on_quote(self, widget): self.emit('quote', self.selected_phrase) def on_textview_button_press_event(self, widget, event): # If we clicked on a taged text do NOT open the standard popup menu # if normal text check if we have sth selected self.selected_phrase = '' # do not move belove event button check! if event.button != 3: # if not right click return False x, y = self.tv.window_to_buffer_coords(Gtk.TextWindowType.TEXT, int(event.x), int(event.y)) iter_ = self.tv.get_iter_at_location(x, y) if isinstance(iter_, tuple): iter_ = iter_[1] tags = iter_.get_tags() if tags: # we clicked on sth special (it can be status message too) for tag in tags: tag_name = tag.get_property('name') if tag_name in ('url', 'mail', 'xmpp', 'sth_at_sth'): return True # we block normal context menu # we check if sth was selected and if it was we assign # selected_phrase variable # so on_conversation_textview_populate_popup can use it buffer_ = self.tv.get_buffer() return_val = buffer_.get_selection_bounds() if return_val: # if sth was selected when we right-clicked # get the selected text start_sel, finish_sel = return_val[0], return_val[1] self.selected_phrase = buffer_.get_text(start_sel, finish_sel, True) elif iter_.get_char() and ord(iter_.get_char()) > 31: # we clicked on a word, do as if it's selected for context menu start_sel = iter_.copy() if not start_sel.starts_word(): start_sel.backward_word_start() finish_sel = iter_.copy() if not finish_sel.ends_word(): finish_sel.forward_word_end() self.selected_phrase = buffer_.get_text(start_sel, finish_sel, True) def on_open_link_activate(self, widget, kind, text): helpers.launch_browser_mailer(kind, text) def on_copy_link_activate(self, widget, text): clip = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) clip.set_text(text, -1) def on_start_chat_activate(self, widget, jid): app.interface.new_chat_from_jid(self.account, jid) def on_join_group_chat_menuitem_activate(self, widget, room_jid): # Remove ?join room_jid = room_jid.split('?')[0] app.interface.join_gc_minimal(self.account, room_jid) def on_add_to_roster_activate(self, widget, jid): dialogs.AddNewContactWindow(self.account, jid) def make_link_menu(self, event, kind, text): xml = gtkgui_helpers.get_gtk_builder('chat_context_menu.ui') menu = xml.get_object('chat_context_menu') childs = menu.get_children() if kind == 'url': id_ = childs[0].connect('activate', self.on_copy_link_activate, text) self.handlers[id_] = childs[0] id_ = childs[1].connect('activate', self.on_open_link_activate, kind, text) self.handlers[id_] = childs[1] childs[2].hide() # copy mail address childs[3].hide() # open mail composer childs[4].hide() # jid section separator childs[5].hide() # start chat childs[6].hide() # join group chat childs[7].hide() # add to roster else: # It's a mail or a JID # load muc icon join_group_chat_menuitem = xml.get_object('join_group_chat_menuitem') text = text.lower() if text.startswith('xmpp:'): text = text[5:] id_ = childs[2].connect('activate', self.on_copy_link_activate, text) self.handlers[id_] = childs[2] id_ = childs[3].connect('activate', self.on_open_link_activate, kind, text) self.handlers[id_] = childs[3] id_ = childs[5].connect('activate', self.on_start_chat_activate, text) self.handlers[id_] = childs[5] id_ = childs[6].connect('activate', self.on_join_group_chat_menuitem_activate, text) self.handlers[id_] = childs[6] if self.account and app.connections[self.account].\ roster_supported: id_ = childs[7].connect('activate', self.on_add_to_roster_activate, text) self.handlers[id_] = childs[7] childs[7].show() # show add to roster menuitem else: childs[7].hide() # hide add to roster menuitem if kind == 'xmpp': id_ = childs[0].connect('activate', self.on_copy_link_activate, 'xmpp:' + text) self.handlers[id_] = childs[0] childs[2].hide() # copy mail address childs[3].hide() # open mail composer childs[4].hide() # jid section separator elif kind == 'mail': childs[4].hide() # jid section separator childs[5].hide() # start chat childs[6].hide() # join group chat childs[7].hide() # add to roster if kind != 'xmpp': childs[0].hide() # copy link location childs[1].hide() # open link in browser menu.attach_to_widget(self.tv, None) menu.popup(None, None, None, None, event.button.button, event.time) def hyperlink_handler(self, texttag, widget, event, iter_, kind): if event.type == Gdk.EventType.BUTTON_PRESS: begin_iter = iter_.copy() # we get the begining of the tag while not begin_iter.begins_tag(texttag): begin_iter.backward_char() end_iter = iter_.copy() # we get the end of the tag while not end_iter.ends_tag(texttag): end_iter.forward_char() # Detect XHTML-IM link word = getattr(texttag, 'href', None) if word: if word.startswith('xmpp'): kind = 'xmpp' elif word.startswith('mailto:'): kind = 'mail' elif app.interface.sth_at_sth_dot_sth_re.match(word): # it's a JID or mail kind = 'sth_at_sth' else: word = self.tv.get_buffer().get_text(begin_iter, end_iter, True) if event.button.button == 3: # right click self.make_link_menu(event, kind, word) return True else: self.plugin_modified = False app.plugin_manager.extension_point( 'hyperlink_handler', word, kind, self, self.tv.get_toplevel()) if self.plugin_modified: return # we launch the correct application if kind == 'xmpp': word = word[5:] if '?' in word: (jid, action) = word.split('?') if action == 'join': app.interface.join_gc_minimal(None, jid) else: self.on_start_chat_activate(None, jid) else: self.on_start_chat_activate(None, word) # handle geo:-URIs elif word[:4] == 'geo:': location = word[4:] lat, _, lon = location.partition(',') if lon == '': return uri = 'https://www.openstreetmap.org/?' \ 'mlat=%(lat)s&mlon=%(lon)s&zoom=16' % \ {'lat': lat, 'lon': lon} helpers.launch_browser_mailer(kind, uri) # other URIs else: helpers.launch_browser_mailer(kind, word) def detect_and_print_special_text(self, otext, other_tags, graphics=True, iter_=None, additional_data=None): """ Detect special text (emots & links & formatting), print normal text before any special text it founds, then print special text (that happens many times until last special text is printed) and then return the index after *last* special text, so we can print it in print_conversation_line() """ if not otext: return if additional_data is None: additional_data = {} buffer_ = self.tv.get_buffer() if other_tags: insert_tags_func = buffer_.insert_with_tags_by_name else: insert_tags_func = buffer_.insert # detect_and_print_special_text() is also used by # HtmlHandler.handle_specials() and there tags is Gtk.TextTag objects, # not strings if other_tags and isinstance(other_tags[0], Gtk.TextTag): insert_tags_func = buffer_.insert_with_tags index = 0 # Too many special elements (emoticons, LaTeX formulas, etc) # may cause Gajim to freeze (see #5129). # We impose an arbitrary limit of 100 specials per message. specials_limit = 100 # add oob text to the end try: gajim_data = additional_data['gajim'] oob_url = gajim_data['oob_url'] except KeyError: pass else: oob_desc = additional_data['gajim'].get('oob_desc', None) if oob_desc is None: oob_desc = _('URL:') otext += '\n{} {}'.format(oob_desc, oob_url) # basic: links + mail + formatting is always checked (we like that) if app.config.get('emoticons_theme') and graphics: # search for emoticons & urls iterator = app.interface.emot_and_basic_re.finditer(otext) else: # search for just urls + mail + formatting iterator = app.interface.basic_pattern_re.finditer(otext) if iter_: end_iter = iter_ else: end_iter = buffer_.get_end_iter() for match in iterator: start, end = match.span() special_text = otext[start:end] if start > index: text_before_special_text = otext[index:start] if not iter_: end_iter = buffer_.get_end_iter() # we insert normal text if other_tags: insert_tags_func(end_iter, text_before_special_text, *other_tags) else: buffer_.insert(end_iter, text_before_special_text) index = end # update index # now print it self.print_special_text(special_text, other_tags, graphics=graphics, iter_=end_iter, additional_data=additional_data) specials_limit -= 1 if specials_limit <= 0: break # add the rest of text located in the index and after insert_tags_func(end_iter, otext[index:], *other_tags) return end_iter def print_special_text(self, special_text, other_tags, graphics=True, iter_=None, additional_data=None): """ Is called by detect_and_print_special_text and prints special text (emots, links, formatting) """ if additional_data is None: additional_data = {} # PluginSystem: adding GUI extension point for ConversationTextview self.plugin_modified = False app.plugin_manager.extension_point('print_special_text', self, special_text, other_tags, graphics, additional_data, iter_) if self.plugin_modified: return tags = [] use_other_tags = True text_is_valid_uri = False is_xhtml_link = None show_ascii_formatting_chars = \ app.config.get('show_ascii_formatting_chars') buffer_ = self.tv.get_buffer() # Detect XHTML-IM link ttt = buffer_.get_tag_table() tags_ = [(ttt.lookup(t) if isinstance(t, str) else t) for t in other_tags] for t in tags_: is_xhtml_link = getattr(t, 'href', None) if is_xhtml_link: break # Check if we accept this as an uri schemes = app.config.get('uri_schemes').split() for scheme in schemes: if special_text.startswith(scheme): text_is_valid_uri = True if iter_: end_iter = iter_ else: end_iter = buffer_.get_end_iter() pixbuf = emoticons.get_pixbuf(special_text) if app.config.get('emoticons_theme') and pixbuf and graphics: # it's an emoticon anchor = buffer_.create_child_anchor(end_iter) img = TextViewImage(anchor, GLib.markup_escape_text(special_text)) img.set_from_pixbuf(pixbuf) img.show() self.images.append(img) self.tv.add_child_at_anchor(img, anchor) elif special_text.startswith('www.') or \ special_text.startswith('ftp.') or \ text_is_valid_uri and not is_xhtml_link: tags.append('url') elif special_text.startswith('mailto:') and not is_xhtml_link: tags.append('mail') elif special_text.startswith('xmpp:') and not is_xhtml_link: tags.append('xmpp') elif app.interface.sth_at_sth_dot_sth_re.match(special_text) and\ not is_xhtml_link: # it's a JID or mail tags.append('sth_at_sth') elif special_text.startswith('*'): # it's a bold text tags.append('bold') if special_text[1] == '/' and special_text[-2] == '/' and\ len(special_text) > 4: # it's also italic tags.append('italic') if not show_ascii_formatting_chars: special_text = special_text[2:-2] # remove */ /* elif special_text[1] == '_' and special_text[-2] == '_' and \ len(special_text) > 4: # it's also underlined tags.append('underline') if not show_ascii_formatting_chars: special_text = special_text[2:-2] # remove *_ _* else: if not show_ascii_formatting_chars: special_text = special_text[1:-1] # remove * * elif special_text.startswith('/'): # it's an italic text tags.append('italic') if special_text[1] == '*' and special_text[-2] == '*' and \ len(special_text) > 4: # it's also bold tags.append('bold') if not show_ascii_formatting_chars: special_text = special_text[2:-2] # remove /* */ elif special_text[1] == '_' and special_text[-2] == '_' and \ len(special_text) > 4: # it's also underlined tags.append('underline') if not show_ascii_formatting_chars: special_text = special_text[2:-2] # remove /_ _/ else: if not show_ascii_formatting_chars: special_text = special_text[1:-1] # remove / / elif special_text.startswith('_'): # it's an underlined text tags.append('underline') if special_text[1] == '*' and special_text[-2] == '*' and \ len(special_text) > 4: # it's also bold tags.append('bold') if not show_ascii_formatting_chars: special_text = special_text[2:-2] # remove _* *_ elif special_text[1] == '/' and special_text[-2] == '/' and \ len(special_text) > 4: # it's also italic tags.append('italic') if not show_ascii_formatting_chars: special_text = special_text[2:-2] # remove _/ /_ else: if not show_ascii_formatting_chars: special_text = special_text[1:-1] # remove _ _ else: # It's nothing special if use_other_tags: insert_tags_func = buffer_.insert_with_tags_by_name if other_tags and isinstance(other_tags[0], Gtk.TextTag): insert_tags_func = buffer_.insert_with_tags if other_tags: insert_tags_func(end_iter, special_text, *other_tags) else: buffer_.insert(end_iter, special_text) if tags: all_tags = tags[:] if use_other_tags: all_tags += other_tags # convert all names to TextTag all_tags = [(ttt.lookup(t) if isinstance(t, str) else t) for t in all_tags] buffer_.insert_with_tags(end_iter, special_text, *all_tags) if 'url' in tags: puny_text = helpers.puny_encode_url(special_text) if puny_text != special_text: puny_tags = [] if use_other_tags: puny_tags += other_tags if not puny_text: puny_text = _('Invalid URL') puny_tags = [(ttt.lookup(t) if isinstance(t, str) else t) for t in puny_tags] buffer_.insert_with_tags(end_iter, " (%s)" % puny_text, *puny_tags) def print_empty_line(self, iter_=None): buffer_ = self.tv.get_buffer() if not iter_: iter_ = buffer_.get_end_iter() buffer_.insert_with_tags_by_name(iter_, '\n', 'eol') self.just_cleared = False def get_end_mark(self, msg_stanza_id, start_mark): for index, msg in enumerate(self.message_list): if msg[2] == msg_stanza_id and msg[1] == start_mark: try: end_mark = self.message_list[index + 1][1] end_mark_name = end_mark.get_name() except IndexError: # We are at the last message end_mark = None end_mark_name = None log.debug('start mark: %s, end mark: %s, ' 'replace message-list index: %s', start_mark.get_name(), end_mark_name, index) return end_mark, index log.debug('stanza-id not in message list') return None, None def get_insert_mark(self, timestamp): # message_list = [(timestamp, line_start_mark, msg_stanza_id)] # We check if this is a new Message try: if self.message_list[-1][0] <= timestamp: return None, None except IndexError: # We have no Messages in the TextView return None, None # Not a new Message # Search for insertion point for index, msg in enumerate(self.message_list): if msg[0] > timestamp: return msg[1], index # Should not happen, but who knows return None, None def print_conversation_line(self, text, jid, kind, name, tim, other_tags_for_name=None, other_tags_for_time=None, other_tags_for_text=None, subject=None, old_kind=None, xhtml=None, simple=False, graphics=True, displaymarking=None, msg_stanza_id=None, correct_id=None, additional_data=None, encrypted=None): """ Print 'chat' type messages """ if additional_data is None: additional_data = {} buffer_ = self.tv.get_buffer() buffer_.begin_user_action() insert_mark = None insert_mark_name = None if kind == 'incoming_queue': kind = 'incoming' if old_kind == 'incoming_queue': old_kind = 'incoming' if not tim: # For outgoing Messages and Status prints tim = time.time() corrected = False if correct_id: try: index, insert_mark, old_txt = \ self.correct_message(correct_id, kind, name) if correct_id in self.corrected_text_list: self.corrected_text_list[msg_stanza_id] = \ self.corrected_text_list[correct_id] + '\n{}' \ .format(GLib.markup_escape_text(old_txt)) del self.corrected_text_list[correct_id] else: self.corrected_text_list[msg_stanza_id] = \ _('Message corrected. Original message:\n{}') \ .format(GLib.markup_escape_text(old_txt)) corrected = True except TypeError: log.debug('Message was not corrected !') if not corrected: # Get insertion point into TextView insert_mark, index = self.get_insert_mark(tim) if insert_mark: insert_mark_name = insert_mark.get_name() log.debug( 'Printed Line: %s, %s, %s, inserted after: %s' ', stanza-id: %s, correct-id: %s', self.line, text, tim, insert_mark_name, msg_stanza_id, correct_id) if not insert_mark: # Texview is empty or Message is new iter_ = buffer_.get_end_iter() # Insert new Line if Textview is not empty if buffer_.get_char_count() > 0 and not corrected: buffer_.insert_with_tags_by_name(iter_, '\n', 'eol') else: iter_ = buffer_.get_iter_at_mark(insert_mark) # Create a temporary mark at the start of the line # with gravity=Left, so it will not move # even if we insert directly at the mark iter temp_mark = buffer_.create_mark('temp', iter_, left_gravity=True) if text.startswith('/me '): direction_mark = i18n.paragraph_direction_mark(str(text[3:])) else: direction_mark = i18n.paragraph_direction_mark(text) # don't apply direction mark if it's status message if kind == 'status': direction_mark = i18n.direction_mark # print the time stamp self.print_time(text, kind, tim, simple, direction_mark, other_tags_for_time, iter_) if encrypted: buffer_.insert_pixbuf(iter_, self.MESSAGE_ENCRYPTED_PIXBUF) # If there's a displaymarking, print it here. if displaymarking: self.print_displaymarking(displaymarking, iter_=iter_) # kind = info, we print things as if it was a status: same color, ... if kind in ('error', 'info'): kind = 'status' other_text_tag = self.detect_other_text_tag(text, kind) text_tags = [] if other_tags_for_text: text_tags = other_tags_for_text[:] # create a new list if other_text_tag: text_tags.append(other_text_tag) else: # not status nor /me if app.config.get('chat_merge_consecutive_nickname'): if kind != old_kind or self.just_cleared: self.print_name(name, kind, other_tags_for_name, direction_mark=direction_mark, iter_=iter_) else: self.print_real_text(app.config.get( 'chat_merge_consecutive_nickname_indent'), mark=insert_mark, additional_data=additional_data) else: self.print_name(name, kind, other_tags_for_name, direction_mark=direction_mark, iter_=iter_) if kind == 'incoming': text_tags.append('incomingtxt') elif kind == 'outgoing': text_tags.append('outgoingtxt') self.print_subject(subject, iter_=iter_) iter_ = self.print_real_text(text, text_tags, name, xhtml, graphics=graphics, mark=insert_mark, additional_data=additional_data) if corrected: # Show Correction Icon buffer_.create_tag(tag_name=msg_stanza_id) buffer_.insert(iter_, ' ') buffer_.insert_pixbuf( iter_, ConversationTextview.MESSAGE_CORRECTED_PIXBUF) tag_start_iter = iter_.copy() tag_start_iter.backward_chars(2) buffer_.apply_tag_by_name(msg_stanza_id, tag_start_iter, iter_) # If we inserted a Line we add a new line at the end if insert_mark: buffer_.insert_with_tags_by_name(iter_, '\n', 'eol') # We delete the temp mark and replace it with a mark # that has gravity=right temp_iter = buffer_.get_iter_at_mark(temp_mark) buffer_.delete_mark(temp_mark) new_mark = buffer_.create_mark( str(self.line), temp_iter, left_gravity=False) if not index: # New Message self.message_list.append((tim, new_mark, msg_stanza_id)) elif corrected: # Replace the corrected message self.message_list[index] = (tim, new_mark, msg_stanza_id) else: # We insert the message at index self.message_list.insert(index, (tim, new_mark, msg_stanza_id)) if kind == 'incoming': self.last_received_message_id[name] = (msg_stanza_id, new_mark) elif kind == 'outgoing': self.last_sent_message_id = (msg_stanza_id, new_mark) if not insert_mark: if self.autoscroll or kind == 'outgoing': # we are at the end or we are sending something self.scroll_to_end(force=True) self.just_cleared = False buffer_.end_user_action() self.line += 1 return iter_ def get_time_to_show(self, tim, direction_mark=''): """ Get the time, with the day before if needed and return it. It DOESN'T format a fuzzy time """ format_ = '' # get difference in days since epoch (86400 = 24*3600) # number of days since epoch for current time (in GMT) - # number of days since epoch for message (in GMT) diff_day = int(int(timegm(time.localtime())) / 86400 -\ int(timegm(tim)) / 86400) if diff_day == 0.0: day_str = '' else: #%i is day in year (1-365) day_str = i18n.ngettext('Yesterday', '%(nb_days)i days ago', diff_day, {'nb_days': diff_day}, {'nb_days': diff_day}) if day_str: # strftime Windows bug has problems with Unicode # see: http://bugs.python.org/issue8304 if os.name != 'nt': format_ += i18n.direction_mark + day_str + direction_mark + ' ' else: format_ += day_str + ' ' timestamp_str = app.config.get('time_stamp') timestamp_str = helpers.from_one_line(timestamp_str) format_ += timestamp_str tim_format = time.strftime(format_, tim) return tim_format def detect_other_text_tag(self, text, kind): if kind == 'status': return kind elif text.startswith('/me ') or text.startswith('/me\n'): return kind def print_time(self, text, kind, tim, simple, direction_mark, other_tags_for_time, iter_): local_tim = time.localtime(tim) buffer_ = self.tv.get_buffer() current_print_time = app.config.get('print_time') if current_print_time == 'always' and kind != 'info' and not simple: timestamp_str = self.get_time_to_show(local_tim, direction_mark) timestamp = time.strftime(timestamp_str, local_tim) timestamp = direction_mark + timestamp + direction_mark if other_tags_for_time: buffer_.insert_with_tags_by_name(iter_, timestamp, *other_tags_for_time) else: buffer_.insert(iter_, timestamp) elif current_print_time == 'sometimes' and kind != 'info' and not simple: every_foo_seconds = 60 * app.config.get( 'print_ichat_every_foo_minutes') seconds_passed = tim - self.last_time_printout if seconds_passed > every_foo_seconds: self.last_time_printout = tim if app.config.get('print_time_fuzzy') > 0: tim_format = self.fc.fuzzy_time( app.config.get('print_time_fuzzy'), local_tim) else: tim_format = self.get_time_to_show(local_tim, direction_mark) buffer_.insert_with_tags_by_name(iter_, tim_format + '\n', 'time_sometimes') def print_displaymarking(self, displaymarking, iter_=None): bgcolor = displaymarking.getAttr('bgcolor') or '#FFF' fgcolor = displaymarking.getAttr('fgcolor') or '#000' text = displaymarking.getData() if text: buffer_ = self.tv.get_buffer() if iter_: end_iter = iter_ else: end_iter = buffer_.get_end_iter() tag = self.displaymarking_tags.setdefault(bgcolor + '/' + fgcolor, buffer_.create_tag(None, background=bgcolor, foreground=fgcolor)) buffer_.insert_with_tags(end_iter, '[' + text + ']', tag) end_iter = buffer_.get_end_iter() buffer_.insert_with_tags(end_iter, ' ') def print_name(self, name, kind, other_tags_for_name, direction_mark='', iter_=None): if name: name_tags = [] buffer_ = self.tv.get_buffer() if iter_: end_iter = iter_ else: end_iter = buffer_.get_end_iter() if other_tags_for_name: name_tags = other_tags_for_name[:] # create a new list name_tags.append(kind) before_str = app.config.get('before_nickname') before_str = helpers.from_one_line(before_str) after_str = app.config.get('after_nickname') after_str = helpers.from_one_line(after_str) format_ = before_str + name + direction_mark + after_str + ' ' buffer_.insert_with_tags_by_name(end_iter, format_, *name_tags) def print_subject(self, subject, iter_=None): if subject: # if we have subject, show it too! subject = _('Subject: %s\n') % subject buffer_ = self.tv.get_buffer() if iter_: end_iter = iter_ else: end_iter = buffer_.get_end_iter() buffer_.insert(end_iter, subject) self.print_empty_line(end_iter) def print_real_text(self, text, text_tags=None, name=None, xhtml=None, graphics=True, mark=None, additional_data=None): """ Add normal and special text. call this to add text """ if text_tags is None: text_tags = [] if additional_data is None: additional_data = {} buffer_ = self.tv.get_buffer() if not mark: iter_ = buffer_.get_end_iter() else: iter_ = buffer_.get_iter_at_mark(mark) if xhtml: try: if name and (text.startswith('/me ') or text.startswith('/me\n')): xhtml = xhtml.replace('/me', '* %s' % (name,), 1) self.tv.display_html(xhtml, self.tv, self, iter_=iter_) return except Exception as e: log.debug('Error processing xhtml: ' + str(e)) log.debug('with |' + xhtml + '|') # /me is replaced by name if name is given if name and (text.startswith('/me ') or text.startswith('/me\n')): text = '* ' + name + text[3:] text_tags.append('italic') # PluginSystem: adding GUI extension point for ConversationTextview self.plugin_modified = False app.plugin_manager.extension_point('print_real_text', self, text, text_tags, graphics, iter_, additional_data) if self.plugin_modified: if not mark: return buffer_.get_end_iter() else: return buffer_.get_iter_at_mark(mark) if not mark: iter_ = buffer_.get_end_iter() else: iter_ = buffer_.get_iter_at_mark(mark) # detect urls formatting and if the user has it on emoticons return self.detect_and_print_special_text(text, text_tags, graphics=graphics, iter_=iter_, additional_data=additional_data) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/000077500000000000000000000000001326020644600227035ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/000077500000000000000000000000001326020644600250475ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/000077500000000000000000000000001326020644600264735ustar00rootroot00000000000000doing_chores/000077500000000000000000000000001326020644600310575ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/defaultbuying_groceries.png000066400000000000000000000016151326020644600351270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/doing_choresPNG  IHDRa+tEXtCreation Time 23 2008 12:31:23 +0300ΜtIME 32h&m pHYs  ~gAMA aIDATx}R]HSa>ssm`䌁n ". эٍ"nnL"'?msnn,l}g=?/I9IqH>Q"E0HfzXwp\Eaᨒp4,2]ft"0`0\ өTjsK$2Hrr S !g{{{Co666F|@' XPX,Vxkk!x^doh4- (kD£Rt/$I)@5TT:,」-?T_qX,<99a3ʮ삑fBxC: ĻVD"W}}}@sdtnnn՚ SSSɊc\.iJAoʐC766Jblnn Tl6@*d H<ʎ1fv.BSV`n8EYE@Q.wvv---%+wĪ/|~~~zddQ.p^}(h4saV#vЏ(L& {p×'R`2XbUU1+ vf{<88؆~?80mlԟVi i^zjGGG?\0q|||ek{y?{:!IENDB`category.png000066400000000000000000000015261326020644600334060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/doing_choresPNG  IHDRa+tEXtCreation Time 26 2008 20:52:41 +0300tIME .=W pHYsԂbgAMA aIDATxڅOQϼx#V !t nL 6t41muwnZh BTml*1X p~w 6=&s|"?bzzznhhS{{f}<88-Zz{{  B>IzdYVՂKKK?oąrT2vՕj%k???!<:fUb2TNOO9|r9e\\\R\ d~ >/x'x@.vvvT o2lBٙ~x5^0!jdm,r:*`{{'bo"J=5ar[,/fUI`0⁢(*LU!|,P׉vju9v `3y'0%H$AtZ} @a$Q<-[1TDDKU Td2z &%Izff.O4T4@@tuu:왱Gy=Ͻf  {N8,9 hA_ p#:::LmnnSikk㗗AAbͬp+D"!R|E"G! @˷\~+,Ȋ+!q RybYM8H ,,࢘6 n:8-A֏C_aV*bd,$*?%u>KKPmm߿70v>3pqq1\z92@ՂX__? q>{ tttryQ4` @;ƐpHyASW^~b对Lqqq"""*** c/X3qh/CJy_ 3ħƱ(2鳱02?y䖐,0N:*)) [` 0^YaКNpyN ;7._ W\vh͛7?~ ''p.e|3N?xΝ;7PTTT]ҥK@:rHߏen4u'=}j֍oDw~^~}--- {'&~>z7_q Jb2f$;;IENDB`cooking.png000066400000000000000000000017551326020644600332260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/doing_choresPNG  IHDRa*tEXtCreation Time 6 2006 13:11:59 +0300z~||\y!0 ÌnTVfwtNO{Z\.78ph|u7d.%N_}#s_ߺVZezzz*L!3Y] RG2~))<Lf|S@O?oo OR8 'đɹSKϽrB,;<4Tf#4{Lyx0>w|.""%CG ض *`H 'TAm;{9NcY@͖ U5QWk]>)Ja~RSd˃B]'K R{MOETDT"!hHq@ rfm Qģ'4ĎM~BoxX:.)8VIHy)"?̅56v0x1& :FqDB`Ŧ080lOQh#P7B0Hy&}păg6A ~V[-lvm2._*c,Vo5>=w?lUeQUqﳸ‰]8=ԳpTO,|5⁐H؊ ҩĕM{F}xmoT3dnUw{^1V5v3&g31M^^QUZua|jv؈w?B,IENDB`doing_maintenance.png000066400000000000000000000016751326020644600352400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/doing_choresPNG  IHDRa*tEXtCreation Time 4 2008 15:29:42 +0300(qtIME :"(i pHYsiTSgAMA aIDATxڍS]HQ?͑tM b5M7hEXSV`A=$AKL!ƆTf:&ۜߙT^;M"4K ozzzW_# EEE񻺺<1[.].h4.++kkhh%333ZX,~‚3N'h4HKK;\RRR{fmh4qmXjj3~+~=X*Tf`w0Vkjj#""lbNׯP(JeȈKI vX,q ggg=EEEMx:1X%`\Q&f,攔ɤEU@=55ullll.5iqsj]p %ol&OD=\7+5e8r*ew+ 9B Āղ> ={dA Šq81n.ɹ@E4P>퇮< "Ba&r .ͷs{sh^gn@m\A^bf "H/6xm]#_Ms)F:511\&4|>+䃰($*87;/7,XXIENDB`doing_the_dishes.png000066400000000000000000000016241326020644600350670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/doing_choresPNG  IHDRatIME1^P; pHYsiTSgAMA a#IDATxڍYhQ4͞fԦ[iR[lj+Ѻhu QAEE}v{Q|pyPDARj7bS-6iӘ4M2i23 ^8^=pZ1jرy[SER4 N@i)͕۫eF=9FBq<"N!1BeCAfA+;=G;j.Ψ4${튉d֮C|R> }Y 9km}b]໿cQ}n}Uek GR'&\t亽K[6y{緺ߢ ܼq }Ԏ`=gG FFߵg`RrN풫 V7`:'.$ aY׿-T6[]\Wb^ :x:Ti2,dz6 rڵO`1a t$%s 8i) &39J吋IRd4A@c RᙟY3R>b*^|M&(~MMH |o>y\6$qyxǎ8 } Ƞ/"aCϓ^V1oѕYbphZELRo!:ˊ"фP=^/lжp@H+-9V(|H(h:k!'H$(~qKoeE8 hDgǾ z6%bt"61[+׿AO( 8SJUvMIz!i愴tWog0.XfIENDB`doing_the_laundry.png000066400000000000000000000014501326020644600352630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/doing_choresPNG  IHDRa*tEXtCreation Time 7 2008 12:15:41 +0300)S_tIME +7ɶ pHYsiTSgAMA aIDATxڕMh@3d7V⊈RPJ=bAQAzЋ*Ux,ED(AwziK_:wCdO04pA'ּtqdߢǕrrmW*k&[MWxm.}Mbh;|w/q-v~ceC.jE~}8ZPloeNڃbSVkAH)(M))QÏg4f_LEhLKZjFF#mdpH~ibjy5/Čх!"tE A*HiѢM-F&7(4〢9V^3z>T>ss^>u:8SعzT*]T*5N_r%PV]͸  P\P`J%wX\xq8RTbxI?l#( Kb1ZYYdB4ϗ6n" Fyh4z#)g\͖pݷP: q<;͖/VE(@<yPlnn`DH$2ø0t:lWض\T^/Ad2Y,|>rqr lx<`l-4^ީT*1].G ϘL&j6Kz= ~ĎqjV `^`IbTvfL&7z K,WNCIENDB`running_an_errand.png000066400000000000000000000017241326020644600352620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/doing_choresPNG  IHDRa*tEXtCreation Time 8 2008 13:47:28 +0300&;htIME  )ӉE pHYs  ~gAMA a-IDATxڍ]l k3v_g9MEGT_pzV "9 7 "B$BԅDpGV#m{֪~t?33xv \x'3[6yz: kzkјOF+g1<vRG֮Bϵ$ pXtv`/1E 0x늒׍[Xnna!ʁݲ t+lFޗ:n v#06+X.\Cen9'޾-4:WpEhO.~sj`"XT`y8{8}d?2x7oE(3XZ_S\N>d iƎm,I|5a_[Q$ak R P[4U]-ajww(P?tcu:8^lV6o58ὰ[XVg "'>G#@a"@o||8*Y*דIJ4Ec"*eH<|],慥hZ +%qk*=f#rCLʞɬ:^tՔHjJy>@|- ?ͿVXa4sHٷ~5f(KƄIENDB`walking_the_dog.png000066400000000000000000000015731326020644600347200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/doing_choresPNG  IHDRa*tEXtCreation Time 8 2008 14:25:16 +0300itIME !r pHYs  ~gAMA aIDATxڥRMOQ=Lg2mZ H E(DD;… #$n1$&ug4 .P@> vfҖi} (s;硏8xSIy>}Muw 5[Vͭjs@ݼ Z>VCazp۠ |C!2 :ppEGkHL/A(gQ氃at("9lņL&c^ $G;N]+Ecv1lr &ȝbXldp9>ak:N&a4 RY#q86M`brr2ւ=@QeX r9f "89L#jʶ:JJ22>5@ NKM.$EDzJ$()4o(R7<xs,,)z^UMAI)i lj{!,’ouzE ߲1TZjNPbӿV /w<9|i% I'#$ MzlDH]DS/ZRD"Krt ,&џTS*$a2I;GK(%)#_zl($鼗|Kfb`5H2,TR#}v=/ .7d*.v6IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/drinking/000077500000000000000000000000001326020644600303005ustar00rootroot00000000000000category.png000066400000000000000000000013021326020644600325400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/drinkingPNG  IHDRa+tEXtCreation Time 23 2008 13:18:35 +0300[tIME  1KF pHYs  ~gAMA aIDATxڅMoQg~1 ib acYNm¿PbBHpWII ֘Še!$&Hmf/L :gy̔3i4ˊ`d_q8"iđytZ !^۵W>9bQ]\oRA>NSY؊bf/՚=(VO[-5c\DX;:rY 8G2 x1:^wJE\`͍\.ܦGn}n7!Ǖ)z3ՒLvtEӼͭht KQIENDB`having_a_beer.png000066400000000000000000000016121326020644600335000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/drinkingPNG  IHDRa*tEXtCreation Time 6 2006 10:43:18 +0300itIME 6 $u pHYs'dgAMA aIDATxu]HSaƟs6ù Ӽ".#@Z)DY^TJv>vv{N/8y`mno [՞(W ##.lZs+Ǐs|08U8R[Q05C[Z[𪪡 ̄"t3 *##<ڇ׆al37;nLMO!NO/*)FqY)$!LF$s(z<&Mf|/A BN~Njb[ill|uA%k 01,Mg@nK;777F".Y-tuHhl, +RK@ЉV#u8je66JqRIRN46iI*RqQQAQun;Oz6+hH X,kf-\61r }k𦧧z%M.S9\jBӑe΀iYMjb:::P.ήdVbfG-PdX$Yĸ<;wWֻ/{yiP&YB+ܣao:V?/Y\I IENDB`having_coffee.png000066400000000000000000000016261326020644600335170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/drinkingPNG  IHDRa*tEXtCreation Time 6 2006 11:42:56 +0300HitIME 7 : pHYsiTSgAMA aIDATxڍR]HSa~s|/=<.[[[kRA"N6n)2LFDԕjPv""tuu}.F+C\. ;<888<77 (Q^oZ'Fid4P.qfse,[ZZȍ~l2:K6\AVW7%Kժ $N{ H\u!Tó  ̉C֯S+UX,8w#va\&d(9 hD  O@4€kUIjWVܽ8uf9`9&FR d8 3ғ RJxPMC@ p!^D"OE%%`6ceA*ht=fzv@撈ǁ9<4 6@^t:ݪt9jǨh4WY2KdY|>vPxL&:H`~ >zO r CVȾfe>zG#%`\~ėfl2I4-t}$ Ȏy ;EXM.:{6s}I5 T[yX+Jd߂$m܄T\x96/* jI \JSZaMT]ڗUോ9bD43_it0K |qôoMr]31&~C'kD\2xC>v hd`(jB#NEg tͬ` ~9 g" u\QvɢjC:8V54_Gw0ׅD&ygOU|s9'׆Q`zixZkDVTxoH5Q5oGV!y7N^-S='>MWd۟of{H 0Z|6 &$6j69+ P2qvoϝRF^1 x2Tp< Vc7tt~DF"Z`[32GU9䐝}nq0GIvoA)H7Ҭ|-E"č»Ŭ|\:IENDB`having_a_snack.png000066400000000000000000000016121326020644600333240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/eatingPNG  IHDRa+tEXtCreation Time 11 2008 15:19:45 +0300kctIME 8jE pHYs  ~gAMA aIDATxڍ[H߾ݝsñ97,-e{DODTK^QRfT>AD̖2m7m|[]r^:բ^~>;"{Ŀn:)SCx&r#~\.󌋁Vo緶ի;5_PQxV^kT˘xj'q|RPw=e!y$(Kd(cFhؠ}2 b8 2.UU$b oFk;EUю)UiG=䓅uHfG,~oG %l7h 5  dRV\RUfqd $MT_,'`^\<^Lwul8J&"aG)Epz}#sͻu["ۅAUip󖐵RP( Gelooæ7Sd>*JeZK-EWT!CsNvvR>+xfH -3_:;uFr$y,6XpcQѐL8,'u5R(\'(L'"PB!߻cg۞vr^U]HKUEDc92eL慃n5c&IL~p}Z0XCIENDB`having_breakfast.png000066400000000000000000000015141326020644600336700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/eatingPNG  IHDRa+tEXtCreation Time 11 2008 17:21:36 +0300_/YtIME E6x pHYs  ~gAMA aIDATxڅS]HQ=w:kh EЛA HOA>Tc=DATEPTIA`&ijϝݙ]a?޹sϹ GD|ji^UǎʣRs‡n~{o,/|V&:Ypָd w sa?NBYLLZ H.Ս: A%$JF>zoӅ`݃Gz~_0HvªR&"|x3JiЩM DMx, ,C 'fM BYJ zYsGU Uբ.ԙ+VcʓIwj^R2?@ YA`Eա(* #_/J:! !ɊUD I@eAhmei\\FNKiP688Q8aD$5"~ba*[Г>*|y:0-o3΃[^o⫵m@iv> 2A ֛Yr^0`]c'.PH#44lN*)/7j.@kyٓ;vlo>aZU #EܢzX.冗پBK**BĠǫIENDB`having_dinner.png000066400000000000000000000017111326020644600332040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/eatingPNG  IHDRatEXtCopyrightCopyright 2006LF+tEXtCreation Time 12 2008 11:32:24 +03003縟tIME  !(< pHYs.#.#x?vgAMA aIDATxڥSOq}t:XR6hM:@`D"=g5&^hԛ=F A1"""tu$Ƹ|}OjTUX5$D:/vmNs]ʹP3`mx#2wt_ W@<|RkK_`1PR2)fqn޳^GO<|GmP>0AfAfbD=i4G-)J 68wy"az \Y%CAD0ds8"z޵CV3 $ÏcJ0 @,tp!ihmvCPcL4tv5gIMb&‚3W _O7)P2p$$CF! 0uQ3*0 f39X呈Cc&ŗ7Ø- @D"񏥥Zh"hJDAV"µf H@oNDk TT<'oXTJGf,"NeiLpKZ^I0i#v_]{Zl4SXJY7Z PT׬_ /ݺ̷H>Mv~RNgEf^LVV8+ɒxyއ}^`1 l6f˲Fٝi$}zGxwCs|QQhs]\|FM?$0եs[Qr&>R)EQ^YYbK_xnn_F(ݿuEpo^ {^8x `r* 'J"3*Fe.ҕ[W) Wϼ{ fP% BuL "96,!&s9;UM,dRJMd^O"[puDaE` Hz$ߧݖЮayL!yf}zUUQcHK"8AF:;)j#m0AF%ȏ$"9Z7s ġ*~wBc7r\aMWmu CQ"k8q>M7ZpRMeHd<І2 xˀwJM|M/?tJ "4[m*- ^Cc~+G=R<33+HxBex!:,qَkz[Tڅ A&ADPDEV rnv^^m؟oMNaDyv:%_~>IY/М yT6X-~IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/exercising/000077500000000000000000000000001326020644600306335ustar00rootroot00000000000000category.png000066400000000000000000000016201326020644600330760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/exercisingPNG  IHDRa*tEXtCreation Time 8 2008 15:31:23 +0300tIME -#Ie pHYs  ~gAMA aIDATxڍRYHQξ8NX.劥ecQb AHAAHSCDKs[ѓED EfFآ89Φ3үQ-t>s1C @.XtP1p;ۨ:+\(CɖNݱS( I[ {l6\< {a6*Q5AXj x476+z>gŧ }TCIzpg֝. #&iOPnފE=gwbB4gtܳQh!e+rLU%C}H}wQcSEUԮTA%d5x.n=KQg7jhV4eW]D-F="RA|Ъ4tl.tVio&ݞf|'= .7O˳1Qn#<Y.H1#f '0\"b 26go,..z|>qvwwt>+&8YxAh"&P*RT\.Z-JـʺK?CvpNMMA @$^Sb1)~1??/ϬyuÙdn566  A,DVWWiٛJ}}vɺ W3XLp\5s$IR T*B.{{{3P(Rtv{>,!<;{Ggff@j&qo,,,t`qfT#9Z[[7"aݎ?Fӓd{uc2|>J4B2BRykIENDB`dancing.png000066400000000000000000000016751326020644600326760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/exercisingPNG  IHDRa*tEXtCreation Time 6 2008 12:00:27 +0300ctIME 9j pHYs  d_gAMA aIDATxڕ[Lg/m- )RF E 1%c… ,cndż/Ƌye[ hF=tH DRK8;48c9]gd5_bMDYlœ#^%+Dk`U/6_kٜf6bWSY$-+H N!_J_Ҩ7:W=Fp{{k=iF#T98RkIl6|z|@}#I7YI I~z^\{)/XJ\ˇ(/b$!t>gՐGF66U)F&Vgoz_cxADXĭ'74>}ͨ*/ #)w9Y ff߾aL -մM ]BZś B @0pqr1x)볲p JHng620nI-$?>~uDo='.".e"^fPbG3l۲,??x\~fx':y;#RxKRSҋ-˿Xپ~2m3cNIENDB`jogging.png000066400000000000000000000011611326020644600327050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/exercisingPNG  IHDRa+tEXtCreation Time 12 2008 15:43:00 +0300͏tIME 5.: pHYs  ~gAMA aIDATxc` 4$HJHݰ~7< !|򞃓<3.gJ!>HkCﲪ ¢b֠cĦʕ+B3L'$,pLæ W $$$XAw֜F@Ojqmsk7o+k6k̝;7aeeii~o6Q ?(DO =_0~>^QQQ#3&Co^]pjtu8'';###ys?;٘z^yΝc +an5np1Nqq=yauVq,p(/KW>i0* y:~Z4wvw ٙ?|>zPFN^bɥײIENDB`playing_sports.png000066400000000000000000000015761326020644600343500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/exercisingPNG  IHDRa+tEXtCreation Time 12 2008 16:06:42 +0300{"DtIME .Ғ pHYs  ~gAMA aIDATxuSKKQf2jIHZ(D]$4K 7;Rt&tP\C`7MA_T#QszΡ-™;3|}*guuu5mllt]R[[k[[[y/=,_:[0u=}}}?!//777WvM}tt S  3})EUru9_ܾQ]+'~qgF|UefWf&.Nm;g^zざiIEt7)>l-;;7"ϼÇ_k(2g{)E @eo;S>J 2}r뺌OBx JJv5ǃ4E %-dX|gaab~UBQs35u#'6_VV=yw=0>˶9s- #"'Nd~i?ןťuIzjއ/_fDV4O ظJvn17瓏]RQ93͙3G{i39ĺreVMǦ%86?6W'# l|Ίp:8i/D>&.j !pL{}ϯkV̎0`bf~☑ov.&/~?)KfQY;/?aQIENDB`swimming.png000066400000000000000000000016041326020644600331150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/exercisingPNG  IHDRa+tEXtCreation Time 14 2008 13:26:11 +0300|tIME 5B<& pHYsiTSgAMA aIDATxڅSmHSQ~wtCY!iίMg.?!F%ba )"H2~a`f"MMS0E\~Pz}9}s('dJUl\S?(Э*ﻟx*fhRf6٩(Rq"/./]Bh*"Pm+Osv%:Ԧ9PQG8D0kteӹ1@h]njӵZV.1 P'^Y`0y`:$=1[ƶ* 8Zpˬ઻zotch3g,v~;=`z4 7ajSZm>DO/"RX'+4XOD86k!I'`}zlM ʆ Hh<H6( b gȨ! ?A 0pȇzR$u#r>ת$ʘT?ZS00uqڼv&F">"KbJ,Hɜ5ŌJ®ng4-Kޓ&T O? CS~ׇ//h_"d*h>Lq{ C2 '!r w)tUXȘi8;|^qkVȨA?6y_&aPECgt̂E1QIY/Aƌ_>KcZֹy{v7mB`$mIENDB`working_out.png000066400000000000000000000015161326020644600336340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/exercisingPNG  IHDRa+tEXtCreation Time 14 2008 13:47:23 +0300ttIME  0: pHYs  ~gAMA aIDATxeSMoRQQhBg,.%&&"M\jbܸ7r]c\.]YM&mP iPڔF<"d޽o̙s$[>N`0VIT[[[?QM9\.Kwgbb#Oggg4772 V/?Z366NS{zzJp.fMd5>c^]]^?nu$ mZ__/rUmZF}4;pZ lll?<T*$]6GX,n`}X&It9A|FkEqjttq"#N @ w70m\!QDi_ Bl4q Ed h4jLO3Z TEL&ʈyb@$R K:v?J}h4Rl|fvH X#TwW|V(0 ZcB p,"2ɉTz\TX,/`ƪ@ d*J]^ ~e撹 K`0O[U\krRL&Su>_G a\8_aETu>iIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/grooming/000077500000000000000000000000001326020644600303145ustar00rootroot00000000000000at_the_spa.png000066400000000000000000000021671326020644600330600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/groomingPNG  IHDRa*tEXtCreation Time 8 2006 14:37:42 +0300W tIME  42ڝ pHYs  d_gAMA aIDATxeSmLwzܕzjAeAdN&9q/eٲ,q.ms3?d%.F Q3nAY Nm[--wmc>}_~_ɓpH% 孖?nt`5 MAf8'ZWb׮4hJI""k0$'EzΜ P K,Ԇ"lHOHւwfsR2>(,6}9Uatex~e֔US3ӓZ!'3I):CYL{f:UP}yo?5 X^rNXqAr:`gڎo LދkmKtUDA/\.ɕevq?3^fIENDB`brushing_teeth.png000066400000000000000000000012311326020644600337520ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/groomingPNG  IHDRa+tEXtCreation Time 15 2008 15:13:51 +0300H褷tIME 6Ӈ\ pHYsiTSgAMA aIDATxS=Q=olL4* hcam,4m B!`a( [ʐfE̗_$dfv&盈vxq{Z^{Rv(ۢ($m6jzR<,;⯓Fr95Lb:b0X,a}~[Umv]4Mƛ|>g Xl6^1kZたpvⴓm#"!N)ɠP(Fʱ̲(1@RE6cEQ.Yp]=1gZtـo8%.őBH>~P0Ҵu>O؆ux@9$jԥXDh ͘cX:HAeeXEޘkی(No7G$)DX y+|V}rDڐ!("QGy=0sWo=}(44IENDB`category.png000066400000000000000000000017651326020644600325710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/groomingPNG  IHDRa*tEXtCreation Time 8 2008 20:08:43 +0300b*tIME * Zn pHYs  ~gAMA aNIDATxڕKhW4W3#YǖRm%RA" V4!&)w R7B.Nl &T!귕رi$4=\Hý9|p.>}<>/gL [/Hݩ Օ#uXCAʡE>46k㉬>:{  zHUTT D?y;W,Vs./if1/v~?@@*^CLl*>KY@f$ՌaG40<O/A$I24wLi667AȲ^oMK0ןMG0[M&B(% }4ST%//HĪ8X]Jfs_j||KيQ/tZqqY"pM8tvvh4hٷ/|Gp/v݆M|<l>y[H711044~b$ ￑z0vѺT`RR|e1066y J{{{WGGnO kx IENDB`getting_a_haircut.png000066400000000000000000000013671326020644600344320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/groomingPNG  IHDRa+tEXtCreation Time 20 2008 03:40:31 +0300?rtIME6'u pHYs  ~gAMA aOIDATxc`@n a 0#0x 6llvF5z< OlWWׅaz1dX..sonu쬬xqqk;ρ_̄uѱMPPP&73[66`!i \\j:nϟ }Aƍۼyxɲ g1l}ׯqnee厛7o:zL?~23?ly xxNʱ""mq"6 ca d~]o#˳2_mxxi23@g&d?43#oߖ&&<Y1V8IENDB`shaving.png000066400000000000000000000012611326020644600324020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/groomingPNG  IHDRa+tEXtCreation Time 25 2008 14:32:54 +0300FtIME %: pHYsiTSgAMA a IDATxڍSMRa>p!h_%k#?pV0jMLލ& ?66&AZF$*KJqlz Hve~A T*T(!Ulӽw~Ӟ1@ HP( kڋ}+F LS2J%rl.W**HPłB 9[؇ 00N{te&%l2jnr b1*yOha@>8N7MN%IV\h4X,j x0Jһ@]PV+rL#`1Dp8$;UZOQaxF ߽ҧإ9IENDB`taking_a_bath.png000066400000000000000000000020701326020644600335150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/groomingPNG  IHDRa*tEXtCreation Time 8 2006 14:37:42 +0300W tIME 9ɱH pHYs  d_gAMA aIDATxmS[Lg~m)@[J R *&+QႨ[ݹ%KeYv41sB\& tn]iCˡh -?vFM|=o-(g)2Jmkl<299w;б %fA̩#BEHw(S&;g ֳϾoZ2oA B g@Z`waDč+_tt~wFڣ+V~׎oP^)X r' d5u ƝH}EͶ#huV_K(yR$qݟquҾqmA7l Rd&RD&. (!o,_Z]_Vx؊  䋉ݩ@g aZ"{'fO+((6~R;םaL#3t-6 ;DyX(41 !w.ݦT$WoTT{Zqrӽ8 oDѮu@ br{- w&܍?bWWbrS{1>B4 .YܱpaAéX]KꥏE_%>z5y?,MD)Nbx)5 -S qo̼/<bl;IENDB`taking_a_shower.png000066400000000000000000000014311326020644600341060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/groomingPNG  IHDRa+tEXtCreation Time 25 2008 15:21:38 +0300fyLtIME  9G+ pHYsiTSgAMA aqIDATxKSaǟ9.7̦*K؏f!$Xa."*"rD02!"YczBh:hIsgl̝]}o}y^?vIhcn2i"RQ(ycVm"r=<~NFR&j-9 okݻ{"LW1_uyOm?/,/|tiggq"Dn3ׇ^`0HMDQ(L^t-,]{(  le<ǡ?`s>eZ{+og8"\:X I2ăt~[7o RoXeUiN{ZZv9UUAĀ( `J reYi~h T-/D hJRp:U RcO`c!8'^?j1 "R@T.gӁJ4wD)Ҁۢ ĭDnJ NFh4 ODO1ykrVʙzuڿH-+ F&r9R 4*,LZ(bC (PUz,@Cp3(&-xo.ò‘g&pw3P"Ц%xP*fw߻MNJhq)VN`) %_ 6^]ss_Q;] Cfwcą.?~t4f}/T$i֪\tjhzw] |IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/inactive/000077500000000000000000000000001326020644600302755ustar00rootroot00000000000000category.png000066400000000000000000000017251326020644600325460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/inactivePNG  IHDRa+tEXtCreation Time 11 2008 11:47:57 +0300zywtIME Mq pHYsiTSgAMA a-IDATx}mLUi mE q2l95K&`,FbddH/.٦_ܗ}Zbf b`t:cӸp6`@-Ж_O.%ܗ^0v{2w^sc<4Ù?|Xbr曚F}`w#J>yTe'dDZtV(ÁV,*9e/<\SʤP3 4}^]_Eb+Jcliabʵ6LTWTt͒y9&eśIpKf[^-A!EGkR~7̝0ęUSc^HI rI?G>1ސEm&O/W;dJl$ts~ yRҩIENDB`day_off.png000066400000000000000000000011151326020644600323310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/inactivePNG  IHDRa*tEXtCreation Time 1 2008 12:26:43 +0300etIME  Vj pHYs  ~gAMA aIDATxڭQKKQ>s,ǑR@Jhc&0H~k[@?Ev[آ퀉2hZqgwEPr|34.CZ#9W,%"C;L`_P~Ϊsp[[Wtw&x3R-KΦlGEԧ[ꝛ5{ ɤe *ߐni}t-1GiՑ6'MK)WgݑF;:323S7+ݟ]+ y*aa1ƥ/M.૫nn%Im[Q^MCgf3QcR%t $pGxo@m8uYaʟ?a.{AJ`Izѻ&* VwU"[aSb\ X$KJlwDSNjFe:G-s.]8'5a *(Ԥî}}࣠/S.w}ek5lRVj[ brAˆNyĢ\+A95E­op+L,\gB6O2+b}@ qSEz}Ġ_:1d0=orJ~5w<~|љ ,Xw/#IENDB`hiding.png000066400000000000000000000013601326020644600321660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/inactivePNG  IHDRa+tEXtCreation Time 16 2008 09:23:25 +0300|tIME 0&ޫM pHYs  ~gAMA aHIDATxڕSkQ&nGmP/& ^rГxj[D/МՋśKx xrBI a+.ӏӬ '4@vߺB#oSJ3-2i>jo[iTMr#kAݜlhWT^!clz?:&ڛ ð_=W-]A cv^6v~00bsͼVw=&/pSƯ7}).(.P\N6k>P1Ԛ.lt (focBuJL r(4ǨnD)abT1Eh+v?%c~߫ɚyI(ul1VEhÈ:Иu26 ݁me8udad&)TⰭ_[L&G̒ؑJȆ w;RLBfp?0+@Hh=HOhF^^ S5J w[/ϙ(}c)e B`<IENDB`on_vacation.png000066400000000000000000000016251326020644600332300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/inactivePNG  IHDRa+tEXtCreation Time 23 2008 14:20:35 +0300stIME  !-q% pHYs  ~gAMA aIDATx}]HSaǟsv:m95m*V~䴅 Ԙ%AAEE]D7AwA] M-4 ˏc157snsv>vJA}E)nl3x-ckAyWDfz tr?\ $L" BF9:ۜzkmK1Џ!*OǙ7JQr"89\B`!>)vm2T)eZ(OB*M:*nE_§)fJMw^WBF $c8kzeɦMt<͘L^&AnY }8S ! | )F٫VXbk^b2T 688 (*wga P4R-r<v6Y!Es7.ڭ0y Y.!F7P؇+MZFܩɂt03b jVu bP*a1=o (S+& F޾T^՚ SǸ/>Ĵ% |OA5\mԗSy'  ܗp xVw$qqw=%[f?ģ2+ϱC_jw)m?Edf^kyTM(׷';0ڈ|̷dJJNyG*Ržq?.~*Z;z/&]FDzhIENDB`praying.png000066400000000000000000000015621326020644600324010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/inactivePNG  IHDRa+tEXtCreation Time 31 2008 12:06:41 +0300o1OtIME  P pHYs  d_gAMA aIDATxڅ]Haͦ:3Mԕ2oA# (L~+:: 4H3M3+i ge4mo}ðv'ǡR,. ,PB܆~f1¸9IM*w3e fNV[#\+7R_pd6"E۱$an$gwO]ь%^?;s]P]+E&߸k.~NIENDB`scheduled_holiday.png000066400000000000000000000012771326020644600344040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/inactivePNG  IHDRa+tEXtCreation Time 22 2008 13:34:51 +0300T,tIME  "\M pHYsaa?igAMA aIDATxc`T Ue5eϚZrq)ŻWoxYel_}$l,-. fS,4+(k.TUy͋+.˱q()*թDտ>*+gffn!n_}+3+oZ*9pcsDxxxS9SoX3;|&-8)WO?>HǪ&)[YMKo?;~'-~ O]<"o>|.)a,G>z R0p6OOL^W?# /g@x HwFݟ/n=oRÂmn+?>~x:T4k &8*:.r f$yK(")|1& եʄ H*6Sbݸ#ʢݷ @I²"b\"%?}xߖk\͡=IENDB`sleeping.png000066400000000000000000000017451326020644600325410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/inactivePNG  IHDRa+tEXtCreation Time 22 2007 14:02:43 +0300bptIME  * @ pHYs  ~gAMA a=IDATxMR[LSY]Ŷʣ)lR F!Q3$cbH0j CMf CQ|QQDDh R,g-SқsZ{7d27͛A~#uπ\ \n7lFFAx{և*e6:#KxmmD&|) \طيmY K֙ӧ oJX*sB%DD)Ρլbnmg[\TnV6cnd//gU6#3Zn!8"7.5odtCmmy&GT URP,|yPRޫm),]% W_ł"ke t?yZ&/:\P뽣 sZoyG=+\pmˮ)wIENDB`thinking.png000066400000000000000000000017071326020644600325440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/inactivePNG  IHDRa*tEXtCreation Time 8 2006 14:27:25 +0300eZtIME  $[ pHYs  d_gAMA a IDATxڅ{HQǿw.mjsԞQYiT[=(ITPYу"{SVR҃b-5[ss?wS|8s/1mkB&8&.Vy\n첷V<&zYep!H68BTg=.1'uY,Ècz d2Eؠ^Vr qr !/Fg[Q)Oh fQQQ2R3`eEp`/A>55 5Oȟ[*Yp$g ֿVdb6[ޭ)rjKT#գk2 bunDWzuAl橒2dmX̲cXQK7s|M n,L mB4lBNTV#;[Ѯ$FBY?#2PmϜ*hQ5Wo*n60&NV . Aq&hDY r ] caV#kj.12)UU!^dDž-5:%x\oG >h^u3xTWDz+<10*-|zΨ$poG6ŀy'Gdzo0*Yx=\Oџ xhFXGb87v{?Lr+IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/relaxing/000077500000000000000000000000001326020644600303045ustar00rootroot00000000000000category.png000066400000000000000000000015071326020644600325530ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/relaxingPNG  IHDRa+tEXtCreation Time 11 2008 12:32:58 +0300StIME !:He pHYs  ~gAMA aIDATxڅR]HQ>lZaE/+RA/==A$R[($`hZϬL>D{r{ ,4" qe'Z(fTWMUg/PDz"0ϋR!\ qo+uUWpN;/\77ʱ1G} dc7[ZFff8+& MTOox,k Ue%-e 4" 4LcSa& 7Ma/԰61Fg6ҧu]vmzG/T8g4YSdvU3ⴋBܵ{WŴci-km}isʊ5I:Kn1?dfJ>S7rNp:eäEXTd֒J/"уFыjP=EešE%6i2̚lnBm_sי`Dց{=s]3$r2\,))񖗗_x5DQG2Ͷwzzaaa!N= -99*Nacҥ6C;2mxoU {:Ά\}{`ހ%m]B#O⛈xV*j'FV˦ EjBAWk'\2ΘjK}+775n,1^?Dp+?R_ ӣx5D@>aHR]]u̩cO+>;Te9 }p~ |E"pu][͛ 8Բ΃7ސ1yyyz}x& HVT*Ur)񢻧ς e?\tL*" b1vC׃bLkd2"HًA8.1HD8;I 6O6tT`nnn#?B!Kގ!++ '(///vKR"GImPL&OE'"### +䊈;I FlJLHI{_ eӁh&Ki0 Ì/p jH8QG(Uұ7c%^@IENDB`going_out.png000066400000000000000000000014311326020644600327240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/relaxingPNG  IHDRa+tEXtCreation Time 22 2008 14:00:00 +0300WG[tIME  !V pHYsiTSgAMA aqIDATxڥMOQ߹ѡ40`hDLL [WnvtaaԽ$"he0Rj[3svIINrr{{3~J|UU`sض(~ߴyG(bN4(B7 #0s7+JGYFHScrtV*A0ԅ*NBN:kTPS3حf٤RH؛X1>ԇB(du?fFVN=KӤ1`R(O`ށIhFܺ,WEgX8ܸSr\9MЃ{ H"<` 1H@/Ŝ26T\O䁃_dKgP`]\A B@F,$|v k-# k{潵%|波h/G D,hL }. _瓊h_d.R(!2)/x-p:?|Wu#dZê1$ZNVO,NL&#ﮁTIc d*tEƇ_\ܩJ{zK@?Vwip5^fEIENDB`partying.png000066400000000000000000000017361326020644600325770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/relaxingPNG  IHDRa*tEXtCreation Time 6 2008 12:00:27 +0300ctIME   pHYs  d_gAMA a7IDATxukLgoEEeCve]$0"}qY~03YB>m[Ö.RqZAҖЖv*Y6|=9ϫgn;f_KX}_*LH.gĆj#c=ouX[IM~NQGۮg myfRG S;[e1^ eV&MZ}n":ov+G *,Kb1ѿ@Q6 ?.a'{UUurs0c<]OXIV''k;Nuե%[K0crJG"aA,dF3*+Ga:`vNmSءY>_csUnt"2nKXy4Xe-f)%R JvLnrg Wfa '٭4"tŠϑQ*P6I #a3r, U7_̭1GzJd:zF;NPi t,JKV|uR zv_k)VYX¾taك|gW&}ocv{p4j?AX%4ӱ| ֔# !MSj /92x MܬRMeV)\s-s+eW b>8;9gXשp~i8$Sp=<')w,bD?Ψ.{3c_u^:9hOI4H&r-#3u2:fqmøg{hTMbܸQN, 2L ZD)pbrSqV4&@?Ra#@kjh+Dqd'(#;3 !Y`[ӦrQ|!0BeoOw6|3ct Oy"+vnf2 6y~Ϸ$ ,5e.DIA*qqaˎ"&KeJ%bma=hs#^R*?"~<ۋ-ggC\ZZi4}nR6{SUPyY| "P);|Kp~9uه u*6h#;:lB1HH>8EE[%ؕ}ͭh5*>[{CPT;t<6Ұ ۍI$œW*X.~1G-@G9%*$NWmݻy{_x^Y.ݘ)Na0!js57( W`4Y_{e6;5MJQyIENDB`shopping.png000066400000000000000000000017041326020644600325640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/relaxingPNG  IHDRa*tEXtCreation Time 6 2008 15:33:02 +0300ɦtIME  XC pHYs  ~gAMA aIDATxڍSMhGvfw][eo⟺Q\ؔІrq!9d0$\J%KN\=!Sn?Ɋfdٍ!9ty{߼yC?􅮮jԶx<>6::X,VOMMMikkk?0g?HhYYY{333Oƴparr2z0 5LK988]^^2v.<}=wqdh.o0ƊBLUHRL&sn4 UZO džLOr>qI:Fa}o߹LX\m^$.Q?ao]tѦnϮAo?@^gdo/"ԁ*"_QZݭ$Wf'x-6QwX;7KL 9 h*9ahjVӧr, yAV*arqN-}͟ nmlIǩ:FeCɀFed )W T\{V˿O%3k_o02tFO4W'5&?;"q~4IENDB`smoking.png000066400000000000000000000011551326020644600324040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/relaxingPNG  IHDRa*tEXtCreation Time 6 2006 13:33:33 +0300кftIME -%Ή pHYs'dgAMA aIDATxcf@@ME~ӗ_aeff'{4C^י`6kkkzzz:={Vp?y矑pI .¥/_j^bH?~p֭[Js}'K5G kw=ܺK_tKO8q:&& 6՗Ŝ>jL{ZmBΩlydor=m=n /No^濛N|Qːbxݾzl3H0`ii |ض?CgNnckmdn`V;+eDkfdLK|ֱNcokhygfr!њdU.%i{'0q6LF WpIENDB`socializing.png000066400000000000000000000016741326020644600332560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/relaxingPNG  IHDRa*tEXtCreation Time 8 2006 14:27:25 +0300eZtIME $G{ pHYs  d_gAMA aIDATx}RiHTQtlTr\H h!-MGY(G?$dP` TPZf`)iTfڴ4l}jQ]ǹsVl\|FْDt:BgGC!ǟxOچ&OcHǧth~APDdd_ bںaY"< .~2\Y"L<3sH@|$Bry3QYWNwfg٥P'W#2*D-vyY s(YSX0h{GmV/ٙ6K ߔڒ)u`Htx+S#*+:HÅGN,j>ʯ5\ p s:J1K!J<0f*o,s-U@ܼpI0B`5U3q t߰~\ ^L S \$#}W ϊv^}No(l{F`H r`r}g/ZXH=Ckk)6|Ƒ$c[[ 66àLp5ێ .sؕ&u<` <YLmĆW=)'аe-x5pg(,$q W s#%ڈ[.\1'+"pF)G6h~E`:IENDB`sunbathing.png000066400000000000000000000016761326020644600331070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/relaxingPNG  IHDRa+tEXtCreation Time 11 2008 11:47:57 +0300zywtIME ;'!JHz pHYsiTSgAMA aIDATxuSMh\U=߽{o~2M2Nu*I6.4EDQ]hƮ*BV.t&"R1TGĦMlLg2y7c*r9;经poZPw4'I@?5/*%L.S8}hQut "(BX `;M).T9fX$ aNyfWd)'}'m_Tdy`F0:,i A#[Z mYe᠚9OKc.v;!:mRl" &;2e|pLӄ[7qi<^=J.mmᣗ~۠wWRg̣V4C"\8sSMD YkFEÎ |G'OCe ~%lS=cXZyAo Lm=^@rm#4T&87xhp'Dlo0,s-=g1y~*lI;Ol!n, 7wqf"aGpu>"K]융&BùSɱ;}`[i}0Ƈ -Pw 6ݱa-5*yjmz/['.P֥ΝK.DYAB+Ii6Jf@30WVO|||.c1pԄÎ!1"Әt^F\ڂ%ʽ]cĭnIP:}|e* ,]q?2|Go3 Ir/ OB 0*5i404rr%Цjd I8&;w19T `Aܳ݇r`.YB(tA$Ua Tv Qڶf쫅@h *) x -xRHhҥm2Hj*=Ty,+«? FV3͎=HG9rsԕas3ui5z]xd f`t*Ȅ(>}zcF[өٳ%뜐ד0!PnZs*uyg_< J+~=x(l228}y7uN &kv1B")`/ߜ6}mXҧ a#zf0ZE}Lb^$t VT?x0'q;z6 Ey`LFDV(u$N#߽o05=gϰ;칮3Io. b,I(Q]eڍ..ML]׹o^F>TU^cv3G EHIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/talking/000077500000000000000000000000001326020644600301245ustar00rootroot00000000000000category.png000066400000000000000000000015041326020644600323700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/talkingPNG  IHDRa*tEXtCreation Time 5 2006 13:18:30 +0300RRtIME7Ć pHYs  d_gAMA aIDATxڵSQHZaK&bQы5D*AИ{Ї(A"el{ a/l2H%833B*3k؁_?w c~}V\__RZ/J%PհYbD"]__@j8vfgg_IRJj%ySSӔJ҉Dcb#8A.s X*dOLL\^^looM (38;;˜kq~~NCgg'd2 qkkkZss]hԤ:2l6}``sssqflFkk+zqqqSң/{{{`LNHDg388t:@ BJ1-ckk CCCH$XXX_̶!Q, @3KC'''rvA$VVVz%1+X,lǸEbyy|,mhL> Y*bʣxK-$囿>{^FZT ?sa O[3P)& G(5n@;Ht1457n.0Ʈ-p=8/K$0}UbDQ=]uÓLg7p-/g "&uDf >H{OIENDB`on_the_phone.png000066400000000000000000000012131326020644600332150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/talkingPNG  IHDRa+tEXtCreation Time 22 2007 13:59:12 +03006MtIME :6* pHYs  ~gAMA aIDATxcdĊ̯ϟ?ѣ, '|pppXX2|Uq7o4Jag333Û N|fp%C\| .`bbb``Ppc_naGQFFF6V6Wl.nnD@60#+i?ok~1x>}tԉ4U_?~|M\̱{߿C Á8~PYY[VV&Wjym``;HǏ +WӉysJJϋ/O> "" £WCta YY٭@g 06???éSnذ[yiii]!W\6!!!P,<]zu7o l ٿ={͍h0O>}6PXǧtvUUSl\H@pIENDB`on_video_phone.png000066400000000000000000000015411326020644600335470ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/talkingPNG  IHDRa+tEXtCreation Time 13 2008 16:03:03 +0300(tIME  |N pHYsiTSgAMA aIDATxڍS[K~6wLe82g /+/;ta I*mYyVz^}| ΆVV JD"Qr<===q̔WONN~] FSԟ DG>G7Ӂ; 0\饳{Je:8!O@UnH"?:Kț'---H$JQàZRjXu"ĄMWlfvoo/577Ha6˅*^/C{R* k766ޱt@ nbep8dX kkk.Nd2i%%wͦbZmwwwcgg+++hll䭭2Lt.#nkff E YdcpQ$KKK^2`nx`(eٯPhy{{AgtT3588E$ ӧvHk:b"QAlٞd2=0).?zl|IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/traveling/000077500000000000000000000000001326020644600304665ustar00rootroot00000000000000category.png000066400000000000000000000020601326020644600327300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/travelingPNG  IHDRa+tEXtCreation Time 17 2008 21:11:26 +0300礰tIME pHYsiTSgAMA aIDATx]Skh[e~rtݒ&mҙ,:{yY:?ܴ? *TERXQUvNeVfYM699xRp<Y]krksG񐬨nI,gC-iGqt6ߌzb.@TBK'|>l|}~]:qyuTz{>pW~t^Jy Ͳ7%Mc4=6p*X<˙/X|Jkb=˖ ,K30;s6ס5Z<k ^'H*I+Kh;#1xv.`E+f^zGIX0 Qkc#e(ȝNpE#!Ps WO /e{ D } Zv@ҪZ+JPT`Xäk3{E XP)L!/Ǧ `ir`~p5z.X-f fo#TxdQ.n~,xX Cuxz}<0ikjYRuU:ya7L͌!pND:Z$LUѠhρv{uC3-PO>M?Zy^Y٦=«=F{gԆP>ud2 )1Ka2t:::HUNa X09,+­h *Sv8ZeŎWed"K$ (Pw୽6xIENDB`commuting.png000066400000000000000000000015441326020644600331230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/travelingPNG  IHDRa*tEXtCreation Time 5 2006 15:48:06 +0300ztIME  x- pHYs  ~gAMA aIDATxڍSKkAgfI&$` |A$"?Ջx$=Kh#j̋wuwvfvvǚB PttUUw3 {^u]#.(yqܘz5;IۋcA[G/RSë69&.O^Tӏ %33gI#Ih8簥gК%$LfÌPZks킕hLUT&[) ![F0i?@"ORuW}A@s|\Pt0q$ebfa<,:fF.@GaH)}ͿK?DK"T),ҲF-4cX[{RpLgN /98㷒ZjȆ7pj9dž8@iq?~7;J i)à$ m&C:d8;.$iU`RU"R0D=`яY{ܔ`ݷ&jmdvD4EBFYPDq ,̆$’aUQI|(alBG^dIL@ԎJ @`۷Y{Yxv !ɃQհO_ݝ{Xy޻R F{;;յVz+iK?j_V֞n+๱ cwҁp~IENDB`cycling.png000066400000000000000000000017261326020644600325530ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/travelingPNG  IHDRa+tEXtCreation Time 13 2008 16:43:40 +0300OtIME  8' # pHYs  ~gAMA a.IDATxڅSkHSa9;9Kw,ל4Dd94bQm#!ן`(1&! 0"/.keksN$|<>o{p߳PvXt >?Lbi|>rffFh2B<fyvD^gNNeT%D:ZYo#+rGjkm;j)U_YSNɫWAw A .[뚝N-*àXeaa! .7#*t+quUrm_CڜPH~D";bؐA/]Rcq iغ w yZCm6Gp8QE#\5L[\^MӴ4(}P> t&ԡYE.h,mRBCE7Z[[B"h .9T* ~?!&dN!͊ ˧MrZV\4f+8:}"%{J\jlV3%N7$a'o|{^8G+-8L3t(⬛|ߞwutp1.IENDB`driving.png000066400000000000000000000017001326020644600325550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/travelingPNG  IHDRa+tEXtCreation Time 15 2008 13:39:26 +0300R1tIME  :D pHYs  ~gAMA aIDATxڅS]La~He(*^Кlh`"Lt lnБSZ]Yd\U15M"LLLBO:.<7sj{{{wB %%Q`08O!q8GݫD"sPϧ---=P{{{)bs]]666f`0js8NR V5tWUUCCC\.UWWy&HJo䵵5y}}f&477 mkko~{``@FP(B@]TT Pf@, z5&wpx LOOOdF!(QVVEIII| ጌ ra}}կ$L&Chyy\.>#E6770E+++rrrB񠽽ݩh蕕v<ᤶeggݎ|wtt\P+Q!okk3F#nBL.g[HNɧlU*xiff&[[[1u|G(^Mt& Î@(VSSo H"R8NAJ$&&crwLp$Pd\n? [߰s*Da+ƉQ=}BcPVyIENDB`in_a_car.png000066400000000000000000000012701326020644600326500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/travelingPNG  IHDRa+tEXtCreation Time 15 2008 14:33:04 +0300tIME  #(fX pHYs  ~gAMA aIDATxSKRQMLp!%h44FѨQ5ap$37>&NBI|\_j E4 a:?7Xjz(2T*xcX bQp80Ll^g2Dh/CP䇧)L& l^mN|1ͮـR),<͊  N.WWjKFs\46 4MVfEV'*xpot:d2 D4rfzs|>XҝNVN X Vޗe~'SQÉ3 7m\n \s\>7)Hd| B2_^nZ^|7J$S67֌b_W* mFiOBIENDB`on_a_bus.png000066400000000000000000000016011326020644600327000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/travelingPNG  IHDRa+tEXtCreation Time 15 2008 17:06:48 +0300l1tIME  8r pHYs  ~gAMA aIDATxeMhTW7G23&fX EK)ŅJtҍJ҅  B$B ]Jjfb>y7yyބ U{{Ϲb2kr,pV ha*t֡N#MXu2a/WNܤX b~dj7%#~fpwƃg3I+XmcKFjCXi5̾f(Ǜ&9u˶[t_Kh3#;uIENDB`on_a_plane.png000066400000000000000000000014051326020644600332100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/travelingPNG  IHDRa+tEXtCreation Time 20 2008 12:20:57 +03001tIME #\ pHYs  ~gAMA a]IDATxc`[X,))'&&ͤ;777fkkkYB_())nmm݆KsyTTQ~߿gA8͛7g 0hkk3kjjzZj/fCCCO###KYYw߿g|g!ƌ ݻ===]~ɰm63g|g<<<9>}ĐhѣG0 `ddxb (((ř⬁ 1W~~ Z_~i`HII u;@2hii11l;mڴ@ ]Νێ=Fyyy]zzz朜 """ 1Cɓ' /^p5[lImvvv222 LLL @g28p້ /|ݻn3g|l ľz >~V#IIIN]]]Fu__;hoh ~ƭGY*fz'Rmll4 uP?~@eI@$$$L| }J% ` ͛7{5 E?m XyvIENDB`on_a_train.png000066400000000000000000000014711326020644600332310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/travelingPNG  IHDRa+tEXtCreation Time 21 2008 13:29:06 +03002tIME  (&h pHYs  ~gAMA aIDATxڍKkQw$d:$5Ժ,v!.ܸVt~ŵԝWA BLڦHL&3w=p8ܙ{ߙB0㺮{M;}ݛ! Øi.ݽd~_^*UՓG J^mdJ"j7(l6自P.'Qx"Y^Bw|}B!N3C-:VcyyQ[tv~`vvBnJ˃NA0Bg+ hhh>=?VXRJp1sΞFcssU`Fn$ .ArAXRIE-S0OYݾfڽK/4EZ]TL%+8N"iX,_ 3t!IE4!1|Ehxy3*0LFko{]K<@@mFd?b `SVi\-XLC.rWB*mcC&89f'B 0eJ.$%u&G[k ζ)Y*uq`hR\|*soL?&":IENDB`on_a_trip.png000066400000000000000000000017021326020644600330670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/travelingPNG  IHDRa+tEXtCreation Time 21 2008 14:40:21 +0300<tIME  8/ pHYs  ~gAMA aIDATxuSYHQ868.Fb"CQb QT/APAeDT/Cm$RYe5N4싧CF{;s  !IQ@?bq;MQFHdhcm|5nc#¹ijy~VF?0j,Qnv)(i #%4pA67/X+G' vړ jL&eU nZְU5$[YO*H3?l:#1ʓ ¡   hLɅ (u(eqi5.;E)+!Dڂ]$=em!dY̫֓qÖ%Wv0Ѣ @ⓐ$`Iu2߮bfeIzca 0xIn6EȌvn`wgF!d44R:_|zgG#`R|Õ},_: @HzH|ܭ#!"O~ +g#~F>Er-Z٠$xYG|XM18'|_"wRq<]ءr(KB":޷R_<DI.y9r{+*tY - QVW.KE1k! cp(7׺aфl⯪.CgdJ0gdRIENDB`walking.png000066400000000000000000000014351326020644600325540ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/travelingPNG  IHDRa+tEXtCreation Time 22 2008 11:51:39 +0300tIME  rm{ pHYs  ~gAMA auIDATxڍR]Ha~SU6?ZHEDQAh?f&/ !^MPҝDI&,/t nN&ۯsSs<yx c=ts Yp\lkPC b--KBOQ[PL6')V^8g +sg3^8?K*M,QUG9cY a;a B~d |D*g'%X~u*U5THx;Nw{_-.Ϲko^GӕڬwC($W`VbbޏtSUCGG\S#[D6Ɓv1wJG]+܃Ȅ79|RkD|i9оmɕb~-,.X 8ŏABN( ˆ}[ooc5oH  Ŵͅm:}i 2 S~CW)grS edFEG^ ù[x~/I i6ܸ:Z}^ %H9[E[V/#0(3roK\,!ZslK)t}zP)jn) }rIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/unknown/000077500000000000000000000000001326020644600301725ustar00rootroot00000000000000category.png000066400000000000000000000005311326020644600324350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/unknownPNG  IHDRasRGBbKGD pHYs  IDAT8˵1j@?%RˀS4)Bn<*"Le? `f`}Zi4 y4M`8<ڶ$UU%K몺|1𔦩${/Xβ,$-"`9 ?<_˲{cm}1FosiGyUk^H$υ+Ee\ bL 7 mzIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/working/000077500000000000000000000000001326020644600301535ustar00rootroot00000000000000category.png000066400000000000000000000014571326020644600324260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/workingPNG  IHDRa*tEXtCreation Time 4 2006 13:35:39 +0300UtIME'^Ţ pHYs'dgAMA aIDATxm]La?OemYRLLDWiEݸ#W. 3U7 *7u7u^#ʳ}>(dJ"C@4ۏ 7bf3JJfz5(Q^D:׮&t 9#9ݍ\y_I X(NCsV9%4^+Rx^/*jӋzI9Y)\HO`e{2Ccn1,>~bCPӧ/>~0sB q LblC&r5z!D'IENDB`in_a_meeting.png000066400000000000000000000017551326020644600332300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/workingPNG  IHDRa+tEXtCreation Time 13 2007 17:30:18 +0300tIME -~9 pHYs  ~gAMA aEIDATxڅmhSWͽyibcSosZWA[/uuKQt8-~7 c1ql/TDƬZmlES]M֤inr= _vs<&Gx${fCOO˗LMGLVJKi_Bظ½e:s Wԣ!5"8f#7 8eK#Q".@;Q3ݜ,L=[ҴlF5I_+p'7sX܀U)|hK6JfSQ !u $p^EJ?Y5>8BIUVHHG~lo Q^%`2Uʘ!ɐS-NlEeYf[kDdX^^$AW }T-]g.wGВ Ww!炠`G/_7|]_q(],} VTJ`ӊ<1#C'cD^FØ*"_ntu*q2CnJ}؎53)kA7<^FWq,'r*tW f!KL&ήlYYzoi] yl`4ώ ΡnaSpEG=IENDB`studying.png000066400000000000000000000013261326020644600324520ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/activities/default/workingPNG  IHDRatIME / pHYsiTSgAMA aeIDATxڥMhQ'&MZӄ(,``JL4A{&*xE/"y#V`sRj$A&LkJZ$%_4g$"=3x?9Bp\3T*y8`0(VիryX,zk hQ@`l^lZ>ܥF@^2CrѢ 0Ft~(0rXJXyWdY^$)c8& Cd La=y 0V%!A/'dOn^C2^~Bvi'nI$<bXOpDz LKA|=1jRWtbai(Jl>.@Cn| s`̇OPE8 "EꕒɌFa7+kg;j@-(j<vwpnCeNadR"X#>>+t^p[dJ2eˆ!*iw*m:-,J)9(oM{1,|EEQ<[d^_2G(u_v?}#Q>*شMZwJe9E,)mV',djn =gP1瀞 d"UBT4 rQ"?뼢s!]FxQ.0}]ws+r.*"pyt}Y뛺ſ8?ۍWlC~X蓦i<-7׾/)Jw8CFdCX iOu}{}Op:˶.ʍ4r1>vi7PyU*ߴotו?<ᾑ7b'|Mue=L{}wAȿAE~_rPEͨ~ǚQR{P}9첒SQ}("9pRWsZMſnp7+ו_wE5Hg>&[MwZ_n}3*MΜ^TT1߂\MnfsFmQo-+UvUo[S }t.+uNYɍ)<(rSZ|tD“s^ds=la&/e[E:(awTgC>䲔nM *ꔕ_J?ѾM[P6Rh:e%7sџ;ߞb+9'v=TEMx 9@Qy SZ]EK/-'2IwO at,m tۓb9CA2kF%]C3*>laOU:&G"K&ʥ(GI[[9T?x1:5IJ#$M*^1ߪ .N3!m[iLjcl$|:9ڹC,Q*Μ|UYtMHݾMB8v!!YE~)+Q~Þg4s0AXȃ޳`ek,>hQQiȩBEɧ-Xdg!vߥj]Oa#ўPaàVކuCA\2msb{\4 ؾ]o M’/|j<ޱ?!Cm_#$p7@^^ٱK抌rJN/)+>׾O_e؈%_xe/p0;] }36& Nw9Ц,^\Fefsִ&>3$QVz mnxp?$.R|H޾r2\q}uB7 ߕǖJ]˔ڂ7Axz^mp& ۴2^ds&2ݞ20܌唾w/d~ɘQa@1mv8G_ZW?>cq8w ~gzt|ZAӹ@KHpbxZr*:SteEGW.7).puPMf /qr@i13f]S@f)S2d@0p, â PЬ;j o3f4EW^y͛7ջj._r[="BvdTa~G_Z /& w, r|?6\X6뷚uiË'%ǀ0o}rIMeT pH}_j{ AMY+dkO=CKle_شv c۷?~*m"'C9:gNKKF4\ro ۹C_<7?EG5r/-rڭy|l )niL;0e6q9?n|,[?$-}iq=ͬ{ٙ1ibSJw\f58wR_ ο+W?R~-1m|'뮻+4ip:? kt&?ɣ3Իxϳ[8󩪪?j m1wחIJն}rĊ;+.y-k۷#rŢO}v42a1TbW4}) v{~60{pmg]H6y;uuޝymryoUxbN&j_W=coSYgzŕ6ƒ./-vt~ 7$-iiEdzu+l~xߛ杉oviOԆ]u>saZ$ǜ$]X1vtC|Gq/#HMfA~w7+39UpYEx 30Vs439._m}_14s& utE-IrT!w? 0oE__0uj-c AYMf$FZDhyàBCW׶3[L'qPO> JFm;/c\q#F([0 !f&J? ^!.$ȏ/|cD5&B^ٮ2vh}m3 2 =6fK[y!QN7{vMЪKscGAIus̄pn9r;ؼdx̃ 8ׅU>dRqx=;EW˨U7EE\V*T *YY+1-ӽ~k;v:a[Yo6e^Q=ϥIw9uJS'ӧ4Q,aI_=+[;!̴c?o,Oƍgg-G➲_I^hL_4Kmd%d?U%^^9˖~Q[s :xc2kL _r"C~ azڟ 1QACkѵ=~_FWĆ?M#햭=hD-BQ$J}OD_镭0 vxZ6l79psZWBD-lm20 w& 8 0zPFslmGA 6ZaEħͰ퐿`6A{[ kb~RC0N7[ Muf­?<6ps9.¿uP$g<↑†&;@GkuHd *jj .C6y.#4)KWkE~huGDyC?Ɵ%?m!;^wN5&̈5nC9 6hLx.m[ٺu+oVBg\ oD"Tz*<7l(o#-ga`"չ(ỹ~:z2A\ܖavf`3,/ۻ5쁸 I08oVFWrl~tV=붚3l#2]Ll+>.cw`}la$Ww|*4{/lDuI\|T ,#ۇJk7X u9RCIߘDf2%.};L=8y'CuBz~|} D))p).p:R{w2Vmrg'oƨALmŋ-J nO}C|wՅHռ |ŢO2)3eA~~~}۾64M7'1վ U &u74:LCukP(.Zk!5mf$v47dV8~tPG6':BtS#ꄿ !cds. BKI'b;MgqެP!k6Ëa QΛNms&,+O?F(6; G6ˆh>RG/dz c񇎈]8NbpHuF>M֭[=.\zWADR$9p N-_oYMܐ9p t14uvT~2(}!gT[2;k:8N+?5vP`zCm ]Μqr-CdZICwCd++Yu E9- 7Ә42MxDA,އKzEGUgPpDy~Q.?JJaLDe4Iďq Ng"chopܱGg>2\v#j;dY,A&U7_)V0$o7P:g[E1oV+k-;zp!)OhInrwzض Y:;|Fd8$Qm0qMZ7b1oQ 4 hM&NAx 0N[^(M&폻m,A.:'] AIA{4mBw_ ۓ&F@aAڬh 7aFP8sܧ R ܐ cT^pTlvmx44 ?c@;0_UV1j(礻3mF}4i .LqCܾhZ$ H@12b`apq,: T:hTPuP]z|TN *[,VqcѮG/ E-EM=>Q7s7*hm0.. \yBҕ6~k(:0՛@Thh6Sb(C[U琗)s޷4dO~7ߞISyR.5\~v)cN`n"38`,'r }"CJ~P?xebZ\MssLtb* |hk=L}݈7 ^AӊLVd^Adm{+Ҿ|rCxh4טhSAe(0 Ff\%o,=U_ % Qx`8GDt*ü5 4wl!Ն? a͠FoS/7 OxM{tj"-QtOkŮ]Xtiw3=QVy.MYďoz2.ם@K|6Ј7ըA"@;yԽO?O'y:z]f!xD :jdx,ȩGv}ʲӔƚ?]Ǯn.O9 lD$p{?i2Hkͥ%>5}_{"C 40 .;iY v\lf%?H_m[8v?v F uF7p山aknD7??`n8}ܕz\_܈)۶ݾvl«:xAPUiu]+LM*Wgf:9V0VQa#FX3*0f^FkMڿloxѣk$f5rUdwӰ~hħHȈ"6.~(?,7[ n{&O,c;H$?>Ƌ:? {;gϢpBi c-3)ɫ(a(ٟV1~Xd(?AQ/9ur__~%vk!`\og4-ko*Xm6s`tܾp&j$+  pp>Jʋb M)=D4%Q$C!Ic߫Sּh^ωv>@xXg+;W`ˤ}-oGgs듙vk.lb Ta6yj^#EYI_ w-b.SGE8kz(i,Fk.`\h&0zڎg;hTl:X&q#Ɏ)"qSY Mwz[`.Ià*$/N@Kԇ k>,"Y6nه_QP[uPdEɜ~F7/u ]Z\ * KXPk2(gM 1!t;CUMa߿қC[x 3ؾe=?8e;SG%V0ҿ~vY[(Gŗh83` Jځ -{p5wԾ.p0J;W6^Nŏ MfYX  F,w=0!E/>V8ڝRլ²5>Uo w( nkWuDۛ]߸䡗ә"@,U: W0{]D[H'BŸLANmoi `(fn $ {Kt%Zt\A#bxԾp}9\zt#KŚ1]|>V(ȿ<2Dž%AM+747^dG_-p]{la"" ms0GD;I[%ZZ|:kިp;T^x}cYݞjAC3zI#GP:[ʯd ae`уaoZ7? ?ns2#* +t|M]ocq7gޒp'[4B㒻; I8nLaze8&'CQb|2T0|w/2:[-{#y fN53f-r❭wM,{]m߹xv~zԐ4mGݚ2%{;YþUܾ: ;ѓ ;_/}e%\QYN$)xL 3\*甕ܨ)oHJU(/Uo߹;dU8pN)Wڕ`>Lݫ>!hK1b2[IWu4Tzي &&=^Ҍi\?u[N$OcmxQPe׺jUS4±P= -Je,Ol"NYi7 ,@.kZ+gc:_OA}ںK/9]V|"ʏɻ݆W[_;Wtq 2U4?ro;$"Ni"r]u eN-}{ۓ?aK& qSd< >rIjP:}S?2c-0U=L1 :gF֪2*S+6Ok[EHQIۍ;n`$1]|'D`8ă6[`/w6 e:ǫ2q@ *, lDX*bCڷS25D&ǟ*R3A`,6,yEl?uo߽lSވ?+~K ;5rdοǯ8)O B0M=~__ba7+jiϖF6o t? 1ܬA^aUEUbچg _!:gPkDH"F[2ugɱaa}xaw,U/ O>:؇7:A/]w(.,Jl+uΠBۈ e>YlLDb69tKҩ/@Vnc_LѴ_T%OUh%;ʷ5y%m!"N>.*OWﭥ_2G(\ĭ"سd-=-,|EEQӧZIbɯۧ7>SwM+5pXc/[@~N%LV?fUB;'2~{C=AxK{[1=7fSsO/r5x-I+@h8eވotKF&-|b>fuh(i\ 9e"S>e2ysKSt NB\@QA2V/r gE'W4n߲rӹmV',: Ng rbDܭi9(ؾ Or̶ u;3(s@crd5( 1xڴ}?= 8Mg4_>t1"ԝmfTϜAANJ9ILQ ,yʬ>#ǯ qN^ɵzIU6x?W _PyGE<`qzEuR֕=-"lFdGDe[?F lL/ˊ/@("fTcͨx_gr=^ $ˤ^ !wMW[_O߲cEt-^$Ov$T\떉c 8x!+{^pA8lQMý8{~qH7ߠ"Wm~ yE'# `If?.N7g sMlt^"N7/hYёߊt!wVԙW:_bs:+ۓbDK?(AE'tE)]w.*Y;.-=(Ag^O;*/yEFu 3;+Wr "/vGy эk~FK$~vJʋt~y9weh9hicXLbx 1o82:μݔ爼@ם/@T^L1YK @ R[b’S*"i~6R4QyFM鸝nAUnqʊS5ˊ/T.\S!{^ѥ ſnҋ*9EMU1"e%)34=vkv[T)+TzZ~'"r +IV)-^D;urUՙWrmJyE*r'|*cǩ;e?PnK޶g##eR\@ Z1RxA +ѹųR_=)p]Zr*3rn'1Dvi|`ng|ޚV~zG_ڇ)-7*)}􊄛"'. tdkS7-yW>;н'h212|u{Z~6{n&ἒ}bTEMx-:J yQ?gT|aO?h2=W]f/jaP] >vŝ蟶%ߞ\KC2j Ԋ?ẋ m)N!ÿ-^I>o 'b||w(9re9{nB#ɬk}vZk[=ZVr,{|"eҙEb9NϺ==W/{.wr>r?{޸AGw?iu6& {ؙe8<?gPѻ7o/($#U.0\y(~+U?;Ϥ20"ėqp@w5 tQ~ޱoiI2>*&LBB@@`Ʒ?qNmk8BJ?OJ+1˸Niq qər94EeٜI?,~ȓHAOoӝ=N(T{!?_Nc}bg3S[EgJƁCW}"45)=}BY7Ozw}puS/|# iIޭ-{*uK]ɹr}j\ݏayEG#^U3YL N9T&75{wt^N5x h wܝUdSqr7ϺU> .8<j 3!'|) v"qK߫}qKL)8m^׳3lz ޱ3볫׳#Vd~>wvKRiry\p6OX~6Y'/1 0F>dQ#X1z'’4l;_3;$ʬ12]v4C n/fh/= h߳o]zFa^CMlaEFC|F`ѳ0[R  Q\P?~WF{bN:+[\oq0<_7xҸc'}39ĝ~jYq\aMŠb>ݘtf$A4D &4ԅխ˩ʩΛѢm'w)!za"̃"Wߘ暓6ߡ3xn~,S41ct4)6,}N+YXgq?_e^zrN׿u(1ADѐX\5 *ԛg<51QyZ6Pƭ0  ޒ:!U~e[LLCٯAv6N:>{nbTyB6 5rFYj&Ύ Muf­T$A|[>F6 /e⤉aΘ:-t~bݓc:YiSH+ 赵lnraI' $!i'ΞN5 ܄$5>kLH [%O0:c{3Ϛo/8712&6"ӑsX4K% GG90!`ߦ1lR?Q;  Lν3+1ctưpS4893< ɹ?ϵwVO,(ahˇZn4n._B ++ ;|L!%ڗ1Cd{'apI:XK 8>#"kaYWղZذ(5jK#+]1:!lmGak.McxÐ'ƒ%`%mОHڿr],=h/q`6hm0RoIZ r xt>[ί `Pv?bwT<~qd?/ͯ|Ԏ9c'iLuk۳w &:dO_7WP2?7噟TQ2_ "\$} WtG[ b]Vǯ\oҖJ l:-Z$z!?+}ϛqNyla8#CukP(.Zk!$hC D.mc:)DM,~rN w@! ,o#'IJV?-3\-KY_74ʸ7+ qYrs\tT]uEN!EF**M.:*y?tN6_T'10Y.ư;'yFJi2&D[||H?Ӑ3CdvKÑ|Px[cyb-E"Gg6dqS44 Gp:>}Jlq*'_'5ھ}01JK]omAZZ5ɛ%ܵa=C.3QEЧ$YAPY55BQ~r`7 7Mgqެ$b0(LP;=\F[}o6갃5ퟬ_rtIQ.=mUFd :ed^(]$` \^Zn vmB#4?|4ods׳Q+նP*\^}~{qӿeS;XffIT  Ž:d(9˨0VмيH?^ +۾W5gqH0.|"ban?{Rhs^[H3n^y5KQ 4 hM&ZD Erφ&~6qa1Ѱ`tAMխO!y@Lh\hZ,_&^6(;|D7pM0W&8#hO*W^9A wgBs3\~yA˳D:ή.cr$Yo`bGJJlֿ4D/E E(6З-? ZG0l|ØQPpש+ؿ1c(cKI1Cps%;j 24f.#C(*U+nJȝuW㿉bUh݇$@& Ql=2.+A0F fP v=o٬Ingza;_ _~p'Dp9a˲ Ne'O 34`uɋLC0&./}y<<ʕ'ֵ9Q.4y*GDӵ6f 04Yڰ|7IJ{2fp_`?W R{{g{A^  \[ֱ[hXsI2TE:* ǣqڔUk# WXƍ~}哂ͥ,WUEA_ wqu_bs ±Xe 5y„^.]>G!G- 9iTՙl1e5 u!J)6'OWd۞Jv""7H_AӒ/J_^A/hv_=xci%vB"}`*p03AHsήG74ӛY ?;>[U"6k@:R{U;}hTv{C]iDdCN"}! =frƴ&<޼}sYu3Êl.'~Z0R/ҵKDܐACU1# !3`1qyz=u\ vv uiGu$jt'݉h8߮"!@p|=nO<ۓbdZId}Zpv &кu{Leb~5S&b ӍryUH>&̎_<τDؿ!?{Ϯ:՛-~v#C:(J434(7u:*~%U;#ĤI;>/E"BhY&M66{EI;3#W=h3pQ&7%+ΉɧڏIan&k_8b?~弙~丏ޱ~jb;poy{i 5 }rEW//gCtA?e^\Cu<܌:=cdV^+>%1@O`־XЕ]d3~jII ?O<Mr) 1U?+y軵 [L.m6W$h"=t\a~{y ꚨxׅ׺.Wnqش刱z4^7 \۽pqc+0vK~n (^5&S=~$ vR-@A+K0H\\GhIV6ҝ=`gB3/RH od'%6?91ClN%Q՚8{6pc\|ׯϸ=]u!qՉ-F T7Vncr%]WF:uO/:TH'qQ3E['16g˸HjC*wg.Ȍ^DU~z%sg:r׾aʔQaVnM쩉̡w@ܠ$=cnbLe1_ި9d N/߱}6.fg'ş5l H`TO;93,lxJK}猩A!>q Ӏ.mڿNbS}H.0^ˏKtmZUV$xyz@ۡ齌!2@_Oʏ pfm*;!ΛDNIC?2tԿTdqYt|Ømm~ۏ͏qv0ՌWvu&h. :0 f;Yϼ#ƆټwEN 6&5w~>+xNd nsP. @'LFM2KA5&s^̂fUnmC7dmn__I8~Z\ MqNb:8"$i\vL#Si4T6w~Cd-ZQQ`컵cnW4Z- 8Чk%)nzQ <Ö~v $c0xs!%IWH'~~`9+0yNFUHsZ7;]j>]oډ{$$#CfCߥ2?d ؃l7)WWOQ##svzUd7iΐm8-: Q*6bvƿh姬/@L~q#?8݁S^75]w4ME0r;m\G|;d[>o/z=>)n:+tMb5'u} CVv:!uL_2YQg]BkF2reޑtytH Sal#ICð!U=8'U٬SPFϜi!z%4yGyo;f | ѝ`נuSQiǞ+9;@#a?E+ͻʱL?(9}KJ_A,/܍>􊽳޽r_0aBwK3E;5caC8)"76T r9GCo9O퀾b零yW%t /T%{sF8qͬgmlSɔ-b t]j\' eiN/櫪U 0E.?3(P\X'1XRAQO?2U8sУF,6T^ϼ~#]U2EYdk >oҥKNt~ L»@fe k8S:y^rZ":I  x6b P\]dLIvȿں#ap8!RXbCUQ}O>f̘>rerׇ?XRGaȔcHsiw]Yʕ+7*䴱\. ! >E)PE(XhZh_*!m*w KhtlvjHFθ{X~I~QK3<~1꙲ikg: 1ܬA:ϖF6oom/K#Qǎ-r֞bUc{~z\ Q739EXVvt%v̪عG1[Td 53Dl7N封m{Z7fڇ_w~]M DDw|0fΜ+.g%EԉU)K+ %٘QIŦm{c!- bzJ&o۹{\9 f hY; lLzՏd_U 1_i1}ߕJnؾW맙Swd{Kӟd8 q|CUJQV?)û]2G(\ĭ"R9{E'!r.T2#}ZJwC; !gL$1cSbЧLx:gPбgrd!T A2kuNײC\=ITthkN24)}qm޳$qsQlIIAYȓM?gP1g#z$RʓfCn?gP1瀞 dH ]IW&O6,d4yxqEQmOvwBӦ|sȏ,BfOuW˟/1仈EtQLyѓnh|U;+W,F/8Tw+Zx$uy#&>uR֕vYɩ>@SOrD>4cPy\z]9ۜT*ݖ6r5ck]);dRK r5u]/-*t\囶.~~?]?ѲcEx]nƚ^lWJoBښVJW w_~xo~̙cWF:@QDoo܇trQ<`_r]ϳX3*^b>p)=|{R~v}GE~GϺ:טQhY-洊_t(Di~A7כ?1Q-/rec x4ԝ1'@~Qn輒[DA"cs;;/-vќ^qwGzZ?n{8E7(GEmM=fsFm#kZOR˜F IK r-S*SV[kvKs:Fot y /jie<=x 2kFc9e%7j3CsZ}ʽ{ď^cNx 9'8*^ -߉ߞWxWll40 0M<QsHE;4 ADcNx(ٳoҢk{X~: =ߞ]ȟ_9d|ϜwɞAʯ={pA˿s( wd3>n㮿!YhY=_Zs'{rQ0eJnXn9KmjY3W>"~cWd cGO4\,riDM1aF?p~خ1[_2^Zot/o)׉.-I+Voӛ[neY00>Ik]pZyLd&i~4soiɡ=oߨX?ʄ+b{Z?~T;J!Cgå%\uݙy{QmW܉i[po Ԋ?|S ?i. w+>dgQ섈`PX@YNS<;ѹEG!o38$m_/[^(sZ1-rQ=wAG5f.M҆c'{&`?S ^F^?}{rQN QۿWwYښb,tym>WW^?:㟙\to.W+֧_6Xt.7[њL0L!6]ojt({laDjŦE/3 Wb3`QuwQEQa# w_~%WfP8O'0h۷`ʕG<<귷rK[s )-,z/8_#EWotYA9%ǩwy{.W=CS$lh62/-`zwH1-efsaRd_q|#i~响ߘυ&1,w.G86Yo˟2)_UÝߪcp,Cp߷:Rx8e]<-fr}9HSe%3@u؛^aĆ_JuN+涧2 㾘u9;?Idzt^-L?74ysi eƭb][Yp AXbUD,+M;sL\MnWJ:ܑ?IG}5>*DNin<~pZ= 1ornh{G}pos\(SYmʁSZe_rL2_Am&$\'Io.iw`'bs ͍[ cPp9FuQQEQE^S__yyGUUEGH.r?|/_N^#ZUr *:S`xʊ>&Eˊl7Cћ "a?ݴ DT:w&4;`C5:]w2ټ;.{h8J;2jc1ڭ#Li[->:G ?wQ̃~#8Lݸd6E\œ W 56X,4q?n7xv~B;%$V޸uFk;gr-s m  +p*r$dC(檱 L OosR=߼3s\^XqbrF`$0/q0mf7suΠCt-{~(t.)Jw#/>'y,H8*8uOkt.=&{RowqCf]>eMɚ4* ~:$]!?xJVqjbB m}W?*o{7M:k>܃iᤴC4*|QnqK5>!pj]5/VEΊv}q]{z܇m?6 gX%h֟%%FarQ-1?cXoDwӹ4N8$Ha`gM8yB6zs`Yc!Яa|YNFAbsY-OKӕ;.c64}t̴:^XQ? sS'd_|T()p8`@bB:w\xD3Yn\EevEn j jC&O"GN"mFV!GYEch5=EQ/!| N4U3I|׏eo3JsQA􏪈HMeb&nBm!O4=o$I^DFcZ~_~\'lj7N84qVmbJȵwVO%Cx~y23$yNagbr% vC m @IK?Q?.Ž\64ReF뿎a j.ɆGp,711sHpܟoyʇ[uX)Bf#U塞mڈ9Zt 'cD+' 89 NxܐAhIVg 0slpkLt%:L"7c]C85.̐B ; s?A/" k 5&ܻH]Y3p'cdCEǧiISglwwch(]V:qHaO7 _Sle qР(~r+a"eNp^hb[fPyUj%\|dVa9bMΜz4n!ԖaQ+7 cў?] 3xs붚Dm eATK0wKVzKGk}5.H._.Ud*ȝ쪾:ٻ Gi74_~PyguahmħA/ӱbFMFMƔZzRa,)"s3\~yA¬"8+cAʿWZn49bj~y.E[|l6(u=Nǚ3iȄQ޼mA?I0yHyL#7 l;ǥwN2*5z/#1>cPFmxWWsƴ0ghB>E.3wdf+VxkRt#}J- wE*L84cmAAKAܹ cP!hH\߄x?q'Gm0AtD_W1$y3P[pv+L|# &nɈteImaϏl)֧ |(v+_M0QѮ$"$GmX·$= [bU/d2ѪRClӍ΂U>+qد&S/ep鱍\ztcIWȨUcFy ~ FOoyc$]~AF8&AQnQۉYJG4;L+Ia8NLZFt4Lr-B2ɘ7cvute뷙,-&"0qлCDHdU^c` )!2Մq߳^mg:7\ǟo T֛4}r]nЋ+CGSrZm,:>Em: @w’7~ƐB_ck r{!og#O#kw^Xn4r9 ohH(nG5hMGRb)G4vtcm~g+U~ʶ>WS*"]xO>F֭[ǨQUV1x`Yd 8h`oOy7;0\  }8-&f_y?G^Sxmm$Qj|lqSY$[^-ؗë񺮝)=8U4eC34;J/x_gL`O~տ!1aJ \ r:U+_VJ1<ŶjB_dgBF:( B]=l*6W@qW&ժ7=BxEF킿dS"}U1R w_ j.!-coqڔ0ן@ h]䱷ҙLt_9b\ˎiH$go*39}J>ˋX3p J)۞_7Wlj'1c?A*̜7+`X%ګ޹ʄa;8\8#W> $k^IߟgIL`##Nϲ5>N:|WKoڤ"\|T#yA ɟDԿ#SQy薀7&4b[ cp_2YKRBu:kzy6]ZHU=,Om'I6cko>-dCA4D]@?`P~[FG^}ڲ 7<ͧLq7lOY8חԦڴY:W>I##9qTX.K/-xmM5 ~s,p=TTK`*M?QN)"i +Н 'b|83p&'b=f qp|L^ZyiwHVɛihX%YcbwפѴl]pTQ^48W@3,"Oi"(x+IU`ޝzAwG%*̤SA܅ NIks@7v4 xߓYydٲe?P(9r$[l_~| 4ֲ6l`*;xa Z h>ׄagMMN=76o5Qkt7b<zOe&} &sIIQL0tL0_Cߴ~"q#>h~#ZOJ6VvI!K,dz?Nj`赵y{.oHd܎꧸=&E:*B ?}g@c1j`k%))gZ=ɯ.K))0cty+, \JIK Qcp3!̯Up}XÌ>_;ry'UIȹ.O@tg']*gj_n5y)AŽ:S&2Yh\jn3هXz+$$Xo YЬnܩ[M"S'/ Spum<lu|Twg&7hf6voMB[ˤX7pwu7tSg7p]C& ǥK^tK.B{7{;^%%$+P3zR~kzy!rg^ɵ*=!l.-;p~6,PG1C|cF`AT3Z?j A"Q " (YZE#khZF(k`BA"_֚ſͺ1C[AM~lb\$hXvZo :C}1PgE&/.Zb*'_1IY'I1@[WT?c"YR:ũ5#l'~f 7pl:'{O~6K~%b;|ؕfܺ삽ÏSkbۘVg?7ySi* 8$ 4g;KĭLGSH!J/ڊqb+Ctn,1F#*ƝiE3E=髺;iϵ;8K7 L#~XzW {Zxإ'%_Eru UIU~~_7/@!V!e\\#F %[Zr*7g ,DNkZ1򗕜z{Lޕ5)+>=-BͩOܘ_t\{\CUӜ^1;{P~S4±P=# ߦӲ>eC+lL_хu/SNsz3-W4UdԞpCX:|7|Q ގ#L@HHZ0.ӷ蜒a'*0A<'*2AoXLevaLɯĴmuk>e*!WҾ0'`RokUP`a2bce-~e",t=[gA㞤0W?r DA6#5煮$ 2  X&^&+ݰ}!a9Ail-:}S?hԓ!<DD%PyEfl"܊ȹq$5 !SԊW[~Gк$FM'`z/ ;5KLܥHl`!iQy>|UakYb1ʎؚ෤ۮY]/_1(+cxIMLwӶUs=\|u]Ĝ(/,8%W)Wھ+귤S#G$ ZZggOoOb!fFq|4Գ|gA,*fFU3|"F=6oai,(.pP峥QY0`wB H.mhfXƇ)?Ӷ؇}؇}؇}؇>9g"1dRw6,5ߞ;Ϛy[O=Udd! ;6u_v;~a OU5*Dފܢ4TWH- h`K넊#^p)}GvY$kOTЂ?}W~Tt Х3?p,(.~:*nE}Y`N>ec>[dLu^p[dJ՝t_1xOoL+5pXco-%cN0Mg!ʩT~- bzYN%[K2:hcjVZY-3=vCX`@L Ԇeˮƴ-_eخ=L|U*-/S?/aQ_6~|HfS8TD \8̜[̝^wk}g<+Ñt2["~@;qgl+8YH?DQĦ9翢!al9ДIm]٘zQIŦm{>,iKH>OhE̢[+6^T^B'-8,35{uSB9۶OHUwlu'BU222^[ j`AyyyS]= 8RU卵_|~!E,RsیeC4x\a?w$;#>uTF!LEL"6YNlil: c]ӦZqʽxE;j\Y@*y2;x7T_YYY}2|l"v0uurK_]][|Gpˋ3نMЩ 6R5h:?;NǟgfY:.TPXw{7 ޒM=&Ql{E"{Y`a{̜޽wM~@rkfs]γ=vݕ`s)@ۢsk?ؙ2>/$Elqy@ۂO՗Um?5g@4rׄ Ai'BD}F]V/{}jd ^>ۘ3?}E8 6z7vvŲ^%"\ͮ?"蟌I[s/~U^]Ku]="BFZ )fGE%U /%p{z } HY1EXrv&[Ýzn䶈 lL*=UbgnFV rEu\Q DiY4;vv\+azr׿t*>@N.V%S:YL^`7vh-rBbYnsVV^RLnk*oo]nj*ߥrȕ.plQ~裏> /-b|q >ꜤwdA+s&˓w,}(7o+4'יiԙjǕ?/ ^{$bdh_y YJoL u܄x^5I"``X;bc9u--1'msGunc&^䗓'Yݔ݄L)m%Jpu,߸#dُdSEQ$rXX{?]qO$?NndN Єʶ#Q%H`Z>u-O]>ٽm5VW~G̥]jaSS%>u(7ڷ3W6nM.!վVϨa= `é}r}P70r|+lk\:cBwre9+0bĈq"IN)^#pbɟɽ%~aYݷ ɒf?]Oi? n m Fvw]|U)_D]أ8?SI&N 1p8+m+V\UleGTy"m@|7lYye`Ho~s'LhcŸ`6,Xc=\3ɥxָi  ڤq%ܬ&)cK-0m)?μ3T sRݩVsWporm] ޵k}Q=UU%o^Rlݏ_^zILؿ) טOvQ1tG&N^D 5i7M__#o_%/AgHWP?k@u$X4BMe9(|>IA +@(Dv棰ӵ8E7Zp3X= g g$6|έ`#97:FUw?wI/Ju۵qIAi^)jg{R[jV+[\#ᶶ@cΪ$+[رcY<ýQu ȉZ^yw}"/?*)ԆV 9Ug2 k/D.'*zs=WTMW sUvԅT |Wny9p왘=$~0 Gz0T]-zMۗخ+u [˷?}*$J8 `BX!I[{~]`6s&-~g,\!7nQBz8\pxUCM2G}&xJ7ax|B+o.+$kT>EL'`ZD͖~RO^ $5O]⛲%ً&0r~hWTl**QqrדnwDFtfKsN*Iɗ̙H3~eEG(MwLF:8gzl*w͟=qyf}{n>1ȷq˔3k OH}mp]-{$'mY]Q鳰|~LBhh::.m86yyiEҕ3-3-]~43Ol#m_Sڝ6}@3S]|~ܥ38aO}덉='+27|³Rv)QF]) B>+{W)5C\uOkw1U~ߏw_T(;bpdu1/  `ܳD]Mq7.]viiiL{/k=k Dc0Dbk)(&e[RR2):0<˱4,R]]UW]A'6 t|M,XW\PW ^`wSsIbb ٸoy )"]w`׀ZWM& uAl3&G3(q]twn䌻r04m ۼzCj-_F$E<68[GUQK:>" *Z !eF—Q]߭0nv!Ui϶ ^U7ݳG]rbʫj0 ޅwUqYϐ1?6`v/ \ִ3=lɶ[[NkSYȍ dbP6A qFRK6E(d{RQ =_o JLDip}OW] V1q+8p6dVGPkw/fQ숏$P3-+34h&ۚWOqƦ}˪9 O~wǥ5{ ۪ :8ҺiC xSp? vѸT]̅644D_钭*cZ5~03I'm-e&YMV}WB[!"utBV}u߲~ygҁ(lSLJ5pȪՋ.|ntnpz|t sbF'iONu`s#lڴ)S0y&iNcHh֮]awҰ:;qQSS{Lw-NE:z* Ydp'Wo3n!nC[*/z/{E9{j3CYɀa3UGdoPQHg5h?hcxWh&Gibqܦx>P m^jBAyp^v O|S..7RDŽe}(l~/UYIw{d_.K7 nUlKlA^{'꛼}G?~ƅn]x60 .]yG&q[];vGA _yW2}E":*5(DeU`}w¢0.]`6{U+ lCv=]W0X&}{.|͞ 2S)!08)]sߎȥkIp`~ ~L_S&9>goX'Ө33h`x:2pwS__O޽9F5Nd?'_CQ"z*SUUI'a|'ڢଳ΢^x=ܳb4_г6/dqaN2BB?HsQvÀI_}\~\}K'CcʗbZCD.y}"`xgh6bnXVa e(= եp@aYclf\ b;")]{7FCU<5ʂsCܴ$K%iebO3z9^ϫ_)0:zc7i *g-CcnõLt"Z3$VY\Fd{ He%Qo Îj%Ӏtn^[8jdSxtnK>mn=6JVȳ8 ~+{K|tr(qjz~%+kmW._{lYmeRjrɃd<<&n%n=2 s@,޴57l_K%. t Ÿr2F&3{$uP[ n3[4麁m5tnC])_G~C `kɌILr$3n8aq "-kM?8lAm3;4 kܚrpZ*?Bb_vC0aӽ7 x_^ 0 '%)Ӏ@f4/+{`(Z~UdmuPv|:;c@ B MKiaǁ$K "Bq,fLtꁨmQlx x'no*5;h s~W4öu?޶MMgBq ;,.rA ꨏ K FU .0_Ç'|ޖ_gFFbF%l(v"VO$4*OBl0kf?<}`v5^ķbvayv-\;@m:XMD#Xw7oV8׹ Q滤%,xz7"3_ӗ`O_b\L=1Ėrk/7{zM5zutR۝E)#VxJ/>׿7c4.ϋ_=\j`0*/R vONE] DpUr>gZcBMRSWp"p{CZ~kMqG!v1'G}{a^[(LqsO/J_xˢ9 ڽ0AC7wv# I1=/믿fK,2aAߌk]3H6سt+O^QvѸ,0LۈO0! ='ݥ >Ľ篫Boq-leKjt I1pOE/ u:ȋ-~M ER_ ΀bs-+iES2" FzP [/u0ϐ!C/_^ x^ ʙ"WmKw4pz^s 91VQ?zgv/Pj"ʭ`:шT wGq$^ < u_A)&b>ulQ(Jog ӨEбH7q hFLܯÇﱠ1M4My66gqMY61pMu A J0FcVXM3{M`ݕ78,׍4Xנ{WTAW cٌ,<(̰ rȘVbCu w"N=ncȦ HiF z4QtrW0By;=_Ί/WШ &3gS9i\IULϟ7CyxE\05V+gR׼\~i!WQO7kq>k?^JyQ6*G:F!x>gͼ`ZEOQhU`\Mgv.QnDFk(1%w=%J5-jf?–Yo;֨X1*\ *h@&\ooXhE7ލnOaWp^9]uPh|n !8aQq&aq(rS(:m39{jNRE9y+j{9C9!Qo *N;4 :jF fdkf`Di` 3Jf)GY\}b=Cڜ:%œσ,d-ߟPE[p /(әyLˤQ]qҨdG8[ 7ty)cj?*rB#E4[[QG)~e"Dez/a\OjPzi- ga .D/u[e:V,%qH}}Cխۙ$MiG5D>CkD9}@B x@8 8^RE+T4W0,mTN8RiQd4D4N4f Osp;$ ?&*$~0Pp0/Iq]a^>dnA6QȎ 2@ѼΞ}|Oii l&{ s=}[`K_1H!uYɝV|b&$E3E@4ABvRpׅz-g94?? ಮv =[&$}ho\Cvt<ׅ5&hYdHUF=:@(; qټ0)(bv֔aCcP_۶1Myb~E- oZ \H}jU4j"O/ bᇎqШ`*{E1& >:dN狞uU^HY=ԯ ?_n.eP2zɡs Mkм4ܮ阖 0BWpf.\E[iw| hzPp>1\$&yY#b5IqYʿ~_sәT 8\rt8ɔ/"3.s,8 e|FZ#Ӽ1xm`C#h |\zZ ҨҦ?mHŋ ¡ݔ? >iBQ&lk+B07 :SO3Xbޓ2h=8 zKk\ v;.@pdCZ^~EIc`AVYge7:MpլmOt4SE|7_ﯤ3mBiƐx~ *biSSjؒNo܈AtBԵ'^H0" ߭x4:P& Kp~Fthҍ%3;ua6kϤWKnҔ؁ sR3+h ݱґFH:3 >Ek|XCB XWfqs,hkf+SF8ztRFp÷OձA!*E 2,yN /%uOdMmöml7+_U|;d>]\YPz&ii2'h_ke¶*gy&MՄ H~W${n~,5fxl{m'SMl8P1>"+J-\4];Kl7Gdvds%M@8 |tiv\t+ ;-tLۍ2"ݔbGr(3 A@1khJwV)gMP퍖8&e8.qs9OqdiVqvsٳeA~\缾I:S^;PFqW)(( }dN{5O6Cun,.uخ]U +fF k_ zVxCk~aSN^Gnm :w6BU:4SЄ``fē`@AkD4qcWn@:8f,+&ijٞ5z XG9b82wql}b%F^1 94fS|}Hl [H%#D>n?Hc(8A=mT >^"HiٙnXUjqٜ=5E%G£8<{m5=R d}.Ҫ%xC䮺 Hs/Ѳ3̳ M >$f?ŃW5$}`MϷS;or>1n8Dž}M3G9퀎|ŚhnGaG_*Y~&.nS|!R2 @%/Tvd\Ų, .a_o/!,`>cSKnj&4^2c!?+W^+l̃گfSY4"}&A$ecn?=+bB4 R@m$*' )=:besU~~xC2w8N:(ԘD5$=7uWOF}n .)r״)T~n]'dLmFi2>KńA蛬ʝl@覍'Le޼y|Y^Η=Ba>|8_P/ 7tб/=H BI֥?l2Si'--zUu lUʯ| DIV/P0E$R|XPDD@`~rij)%(҃.a7?AR][s_ʑ&glu@s5csYOB̺}0F`Z z8`pԸ{iSSI&ɐs]߯Wn^T /:-vf7}:9ɇnu_5I XhWvV܎$ Fx|}.'G V_J%gfVS'4pX$.O~ p/sMɊR:5]/.ĭNqLm hȂ N8w@UZgN=v,eۿE")ds Czg9mº2Wk랽m/4 \RX B{]Fhx/-k:ħGcuppcID7re+.WMH-)*"&qqxkl .k׮~7᪫OFDVihu99x.u|͹DcE&=4l&}Iƿ~nul/7^*N~¿"FԥCLqU>H1p/gj53v030mÚ$Cu1SWVcTk?0BlEJ(V"O|]У}ڢ['Wtƴ 7 jMI hʷ5X |B"Hu!aDց:+R&)/5qԇmtv}D!9}l;C׀j`ߎ8!HzA{#Hz ;_Pe;Uq۶ F ^CQ('H`CUyTD3x |+[Ow'wsI^c9j\'D$4X@cDE , M,K2}/BЏ5U^ 5otP#:Q5-:io}A8bj &Du7,)zHl `ozCt^q|1I/:(l193;MIWK@kv& yAP]FdA ʺM+^ĉ#|,X[VTxib X|-IEwٌ{T^k'+6'A7oxOf@|j[SzmvP}k if8Ⱥ1i]|Q8ŒOpLVN&,ٳ%UKOǹ)z>)/Vſy3.%¸.ddc1>ތ^ă uԎcIxG.M[sS$~?0` cS -7%`v NM/J#Vefŝ}:[g6J,m3mf%: BVB-m۷X\eAPQϟosa-4(zn+[sŋБcvݾOpȼa}W5Zk{3R:2D`o5RLnk,K [7 }soر(1i{f_nL{&Z+aL euZ>殣~mNۿPʔyi 9~R.sb3MWFk_{^cA#ǬFK]xj x/JAC4'n~5Y~k2 Zrv[^ G&nIi;Ϛ |֤sCBW /݄- wZ΃%|}WNS*,V;ɛk4QNMu|#̩1Ƥ@ąq.vS`}o\1@IšdKƸͥ,H0) )SXUUUu4>^!_cK '|B&6{;+{V'G?IE *.1 ALסІ={Zhܜ3k]bSd ω)PFXX|PmgUһlF=bViGǁ0H[Y(as+tV~pG+}؏ٌBq+Cwd򶥝[W#'hEIVDkз*vӣkQ*2NѪ EI/qߒTLg} }T {x绬VD:׾Iir8 eB:_o[6up,%sXv5=d_DG8k6+7^ R.*++W^jFjKռ{!Z|@XAX۶|-34unAw#/4crLܴq7z=ksǚַ@):8+6EDڣ#Tqwmwރ\SR0Vw3e S Q1,yiE.rڛߡ X(Wo[=hvQRN4jOI/; ޯz;*Իq8؝$ԨQE‿WHpP1ԁ*k Z!"-".Zn [2s5b_cD4P0k?|gQE[wA+ܞXVV4%alVR] &"7b6wU (쎺 L- (ݚj@kt?VQ|fv4 a4?1Ƽ9'N Q!+;K [{ih.x]Pm-ݫ6upۢUhy²333;OnMg=\Cfx;<4! , Ø#6M).-=D0חEY BuK̕Veeo c qóevu4Sޓ"|޷;\*T"Lڰ.ɟI^=0̄Mt}.a\nwǟ tbTN.C1̇{>T2$4Ms8SEOzyu Dπl jmq6NS&Zж?\.BK0+FOR=OEF+t3U^\}PwN?~j}\jG:~fn?BLW=`x*u?.N"^+v-PnR G;= W?q8J桷?cqƞ랢"Rk~I[p3/} Q_~ڴp>uU*T"roOwO{C+wJ/쳃%O>"׫o w]w%$zUu=1|#:T>=gj /\u H\؜A8g75nZ}y YR=s&p&;Y ŕoO=:5YцYZ;W6AÞۯZDS&cJ]] >a-aˎ Z9;gl[Ξ>J-п]+-p_ ^JS 0 \%8kjj⋝R^c|lu~%ep+f.zʈJUT5K~Y4󈫧r+5l]Ǚ\JA]]}}V*KU{?܀7yOEs!U?egvׯ'0w鹑91(35T_%3Z8,'~[K<.P[U:;齏~-꽡#u?Tf.sfD]w_k.[vWG;i:>t:`>޽#X/Ri?OPtBu"a Òݿ7{x wxE:6\v^cɬq~WEղ䧟*%Aq%ЄnY97;5vSRZ YijqqS⧟vZ5~syT?յ0ޏo߾=7n]Wޫ؆ & ^RRbD"ORzrl4j>URRrjII +k^{~fkTgcnjufw5[RZ~=bG{l#sdrK\a9栨y ?d< Oמ<3蓕 =r !C;3Ou^d3}""{S/~!Qgƈ(E p9#hF5+Rޱgf4}f{"RjGO(L}`Q)ڇ(oѲ):g9 غS}*# =,t'cegV9ri"٪ieK3h Fh 7C-{q1uN*:w/";̌x̠r?n)fMM'˅ RrYFc:;1g9҆BPK01֔ w?hސIi>vϛ"QlWO3.YʎMճwKg=UNqVcى״d)Yh|+ 05=z]]o:PqiK/ȩyoޭmGP V~O`L8#ɟXsvߝsAݏD\uU&V^}x  0MUU{=D2222*⊏MӼ;\Vxҍ̞2l#Nik^ܓ_SAnF?lWwKWPH8W2L32Hry ܓ_,AUaݺu,YRRvv֭[OU9 :`(wWf&m:œ\kʦd!lp sВw8#rׁO'}Sou x9I q ofsAT~VZOIQũm:l_\u?]v6ڽzwP4x88yme'm̭~=?(7?Y]:tA؇" w~価}EC/k b,О#݆YE #Oג]g= ?0dX~<z(^Q8!鞄"ciOФ|=d AD_Ts![ /*UYE(:YK*UtR4h%"p_b }\{L]UCd֐Sw/+(VyDA5Gٰo4_VeU%]o"![W[\zad\B96#賬CrpQS럛qQg|/7ʿC#1 ۶^npd쬨/̙|Ɍ)M k ϊp[Mp墺MJ*f젋|Rս222۷/aVϼM|dffҽ{mh%)`1t45Q1+ Q2׫F407}hhd ẟ+ Y|ۉ=(O#MD￾I4ؖ=aQ7wPh6;AGs2'{)4/nӶ 3YC~%x4ǀ52cYE 0M#vG":=s/j4MH1㏉Iℶdeop\%*{V8/}ܓJ^ۙv6Wxd+3wҰa 3nس%NZ˻.2zvﱃxOaK}cƌ\U .N+F-?@SFC42薙v?ڶ@03%HFie@MSUx<$7l.idSh7AUL`}Q!!W_|"Um"D46l{,ibv3A=i{W/O9<7rckl%*F/;?s= AQ[zz?=)N7OYU%={U<Ǩز*2ZHܯ }M&J>.u,՚/w#tJT;7j;ўϼlȬM^ O|\iOhZ{[}$y 6IE+w'+Lh+n)4͐Һ!@GBG׻@CwZ!%fẀe\÷?aQzvP i,^ڋ~y{yQ[_KC9>#X?Evȟ/зo®d _UE ۶4MU z(sܬaYǏgxl=;-0S:N!w-=o r^= o^{QUođJמǟ$=;R!L>̌." fR z Kw6e7 4{ρdl;RmkqYy=0˾K _:A? >R!⦮J]iȧ|U_%Lq>K篔uw@+.HDfmm 7Mo1Rt9)O2Kn쀿hіrF,֢!Mr{k+8˜>nya+ș:zó, "~˨Ί;T7z=s+k֪R9 dI 4D|,c4{LdʔK>m/>=p; 7AnMe}saa <+6[0/'4Ч[c0-zgfu'%%/櫫A9r!;9iQL%`$CgRNNHzзk'Nܧ'M߮}Fq~^hԠM%8sfMM뺮W&ϟϙgYgțjjjS⭂4 ;sVZ%D$3Oؙ/.7}U(+_ym^[>i'C蕝A}.ꖛZ>&[俿_YѢ!j7!{,{{y9wW}I_INZ.UuA͊PRِƢMc@/l=oZHY(`1u`|VrIw-Ok}.;"E>Ҹ!;__+?/p1{ Ok;3?,p{_~8a "`&3|L 58/*QQ>g{%f{ I%X`bG ┿5dV8Vm6~"0[7z۩ڱ@ŵHKc5?/-DkW^>XM<~ir=PRR&iwф3x饗ꪫa 'A's0` =UDZz mWIK0_aA~pX9xيO Kko~:2zwbHP`_ 3]ezQnp;1xoZpy\h}V?]G=vUSZB>7!oNa"B)3蝝N3e$lcpeDضġq;4{GYbf&D0$kfLm{o&^0LWXbRh^eoL)rr#aףeo/Bel8*?KdHC+VSku9s5uO|3/״dTV:g.H K$^b)r]-a1UM$ ůuR^^&b1LӬ9rd~qqkv5_>EaolmOpѐ,.k,KiD3V[~^?y&e1fjlD -Pv&/y|Gtp/쳃1 t!OkQVVF~ϖXO=~!?#9]dr%w{L;HY (ZQ_mV:wp_mToփY\XCL5$iO#h8G4-2K|$`݇$( *hӵNÝ'(6 wNI7x>PtQdV9OȺty oҶhumIMxUaufcOeXWU?rs|`aȀ K#2Е PA0eZ١UPI")2İm7ۘT.>,ee-]\.<"ς`itDm; "VuƲtwWز-oX&@yygAל+r)+Oo3bͱQW[ʹy=( 3g ݽ^0-XSlJM;m}c;>c><-RПk~>3R\)1Ly7Y@BxZۼa `G-9?Ț-)WoBU׭Xב+I\2|paÒ#UX,kGbw"ު>7hАh?/a3ͶD9O%i87ίǿNQ+lG[1˧egwP8ʘ2v-${wt' 3j4?@}u|6m`̚5X,F^Xs+ҷx8z+˗/gҤIl] (rl wqƾW=tC!czGp;p!ɒ4^o"nbm 59KÕң64Q6O6x'4dփqhT*U3jNt( ҜRγdmp=]'W $`Pj7<p!sEoS 8HbT[1\3 e{Hu/Xv,h]W\;@<+<#^Iu,w{l)5=xg54W NnO3FvL-z*cWДHdkҤoV=Rk8qu'ɷa:#Ȳ]xGsGw~QIs?,n=frp~ ty& /XW_k6N ~:Wլ #iV1oª 9<Vx8e:d3fM8@m~C~vƀ'ΩM [$6Q C ETڊ\U>ѣӎYFAN#hX!~iȺׅ$Tc3q"еgױ2~7Ws3ng1Ӣ]b~C n9MƟ@B(8yĽcƌQ~L@1RDvyv"RQܧ2@c uGs=>廕kYj }z,";Ki ꫹ӟ9眓/XBR让ܤԘTESN[)jQiK'ڿS(O UȐ2 '.$ѣ: &Wh7i1ƨŠX[7ѽ:a&P0_=op̽jҦB7ɧ/&0a<@"uus~u*6l'x"mOW9@ St$|e+xKŝSB3!X3Ǒ >:KF̆*eHV-1`3UdMװ[>S1/ɴ,KKC w}ڪpk` nyEI8mށ!UXuZY>/.,.O.4a+G[,-*4(uѺ[m$5W`aɚ Cɧlp>0 EMSN{޾n+3uzB>0f;*dlYVr=YV^N$2 %=% >^DڏW%+>e=sQrzuǺމ&јI8'h)˰nyy=[x޵+}Ց7~%9bCWfsj ߮HgGyWWWjG(?Q{fN=4M}mn櫂{Fq%AZD[sg_}p͆Ydz0OH4D pqSEZf~iKUU?W*~e50|-A+ 9AK|lZsg.ܷ LALլKk~DG; LQ͎3Z0 &o5.JQ=5-Ÿ禳*ϧ?گôP"F~}5۲󱍎ɂFm>[WOˋn="DwWWehUlPڃD&ϽS>r};%V ϼ׍}2NvV)!OܸVr󖛿[66"; P}fs#QZܧ;aÆCUm,>jԨ9=*4VEe6a) -(L殯uX^pAqEvEmOvkhKPtT+$ ;'LpUWyZo.ه:. U8)LIL\l3NliO" qȷԺ>jNfd vω* ho n@ZWA6 &{yj7L-e]L #䵚GmXU(Vzg@ >^j}xlZ s(k I|v31I^{;>/[b5Y͑vg+@N{pcFvU"-wj$c!zm?f\d[XKI\pBP>?B-kWZh{g Ѥ_;K /k."Uinn= \6E;~)adaEZI*e˚)TIwV6\mnzFm}* 5>˺ɇӊiUY8i5v *{ 7~ӧ]zo1E+1d}zb48~S6 wc͆VM0n9@nJߟxıA1_RV[aݲ#㉈ w{oSvNĢZ[k3.- {V)Mt+Br8rX 5?8| /%H<ǷHeU0_vY\<|~r Ff+[?(ҕ?Gߜig3wÆ [;R[[m{i::3N}W_I?W4'OܜXXw+\-ޯ\䣪UHRuTvAx}=Gl&2qq7Pн;Vx0-N}KSFh Lo8W|\G}x@v$|ZT# X`uu%E/ x}ͪe143GcrJUDڣ7CY,Y珌Ihh<3P5l[@L R8?_7ژP6چk$QUuU P}DI HZZit{8".}USڳOTd/CȬKT9b/-?nB&g Y$"o.]v;dl.iMwY"rK]# IhվU .p5 _#+ųEg*obgy0䇠Kz''L*Z[]˛hq*TC9K2,ujt[m Ck}$sr{H3͹iߣ쪪ė,Z[lM@Z # nHD {o9iH$/rL75D86wU<0]3ұ; [89+;2A7Y5>^&i֓\{fGk=8ugӜ[P9Ykts5 {Α#z5i};{ƙ9{vՏ>{B֊.Iv퐰Wd/RYUdo_l "bȵŶmرDd}'(G Ag5Ujw/bG'Vp՚75kS*_e*δedcƍcqԅGU.k.CQBYfdY˳xIXHOhUu)G$mld,1xg%ۅ3\ YeOLE+sT=mk1풿U|etG_Ba_XĄ.a9gzOm^F*7P'nĻG5*{4G-\̈́˞:&]rD g\$Zi߾$7f.;DŔn\ Ujpf:BE7j9>= U-3F%ePm 8䣵j͵zG.|Ӥ5Ƒi3 .][=+L&2q+C3]݌>MD]ng*⾾-qa3_1i?s9c6X0#rkpߝF& PP3 fo N|TGo~4Cd@8*8s`qH2qI+5{n[}muOU{uy+@03UfkV9ol|Q巆پ5o{qՎ+ˢmvMEjCx$^4MZ|LǴ Z)_KW9n _Ӑhr*ug`ᄋJc\Xڝ,𳡪e2f̘3f̸)rȆbSϨ6]Q1Cm-3 U~4c 8"lWW!j {ӯ M3ӏ~;1MC Qž=tlpŽ{n2T>@0Tősaz3{Æ gI=mۿ/L]n]6mϼz$)fpK>zpU% OAOK1ӏ!50yv)2܏ J~ J71'ekhH2Hx˦`h`N6Ch3li66;ȗ| c/_FfUx9 m沣"MR4{(gKJz7cjs˖% ]l@xVYz驅#|?szVF̅["w kǐL%,$$Wl ,iW}nIb}sWdhS{)+Kc`.++ .3s/]@dVۈ,[wV<`pu@?;," q}.2Jf.k| v_L֌U(}%ۅ)k *17κtyE!Ee(H=&.|gl@ °44haI֥O*zoU9) βъ lA*> MTcw7GO Df%Gzg(:En{?Ë3N1ZY)3^,}Ef@#cRg^yӦE}h0DZ|t@r㶙}34z_z̏w"}r֌v5E3&մy8E:LoSYˤ}%J  rDR5YY]rP$׸(+]Qw-zm0X]I( |JC}]Zr9E'PZ)Ӹ$' \XPF3q0]sYB5o} g/ |dI}!p$݉-op-Gav#ѐ@vq}Rn<Ÿ.]vGţpHtz,lumCs=RVi*TKi-32I;[7S/ѠpSeRH" ]l><6-<Uߌ\lKZ •9  ^zI&>< [.\[%C|z>l-@3SYQOG6z$09KL|ra Gu׮{igLz@W SW+n=}q;MjǕoz_DZr)宒m/]?[N;a&ٯRngN;t7>jdr]wKZZZzUUCeŊHf:^6a,W^E)--%r܁O17dkȓ<5Ot.P#~£]Pm*S-pl,OU/PD-QgΞ+yqwwJ~q8 ,˪5jTNg\+]-GufuivvВd8NYlT8fB]R.R0pe=_]+jꛨ:^L[O=S3mgN;uI$u@'\UwWR[Z!rϐ~XUN0D;WlW@U#؆uWGsO5?"zt*eWoysN'Ew;{eHDX@1DcXbM5MS4&b"h"RE)"V"羯㞝ٙٝ]>a\3g\\ÀVv}΢I&`l@{ nTiKB$w!Q%10 c zbԑ;֊pbj|L*XRb$rס] z"K|&u$IL>V\ {2Sce! Ea833~uU2T@5>SW+RY BVc_.->數PdNag ++ ؿ?\.י[o r=s` $蟿>fo -+@/'ipw9rXU_l!DgINX,~3S_p<ʿ z$ ڸFp_g hBV9 `7^ڃ/XQM l~>I[&_aD:f Vf $w+߁R/KUYpC_zsr(Z$-[n=˪b_ʗ|)_ʗ򥜕uwk.4Õ0`>~۞sDeee< `D=x7tMAȏB?0[֞Wf‡G lqzt>cƌ>ߣ`J {TCYW0ty:`)# b;@tK7㕊 K^o0i:4*5+ nZ‰-|bц 6]w?YQQa?1mMkGi n_Nn&SϠۇu{o}Mh)- ҟ/cw/[ -*  @+6Wn|h%cU@?6I|ELxMuuYv&xR c1߭yp8Ɛ5ՆUOb6lV34Mp<)1ժឳZSm\Ǚd\"5A0̜wN6IDATgů^apY%n3( ~R'n=;}MΩ+&5J$a>0"B_\őM| 1@44#WO_ WU,p-> զOVZPg8:"Uq󫫫yǞw36BUi$Gz灸:w2a~ I#/WWW%_Ɉ ˚ݫ=GV)@q͟oN03GGNYB?/ XW:3iҤ,?(.>T=GDc` +SSt=JHxbx.}UXQ'7gXωk .R_J!ì|'7?)s0&hl4جyU~x|#oÝ }~ v@U'+e%;/Δ4!FjM \*Iok.Ը]?0OU΁P54weQ*k7ſk׆o=@k4 CxH0p7F:4mkV$h YmU׭3"d#x]ا"##e6>XɿTU% U<[QQj`dt'7Zj1b>t ?Y<"zل>^!6BpSCCÐ_9wƤM7>Ni WH"KU4{^U]F7H r`%Gh ω5WNRy ː!AfG"3}"ƈ 0\'yV1o4N>]1pF%魊ϞF'[k>F c3V aӧ+.yTplmVߺ \)3eӏ.`RҦˇO~~Y|(/\)b\>Ǧ1?yp|%KbfY7nϬ0~DE9Lo#&c_[3Я)嚶mafމG/ izzQr9]' ˯|:`w6FG z +͍۞@ t7NA[od3m䷇?Ks0/Nv֧F7~}ˈm˷WpNaNԞ™>o'p/-1r {dH1'1b=b!VmFADU 1cYT(&|'>~vGLcz>?f>z1j>fr|%T7&|ۧO}ta31}Οegd +0'fR F0~DVI} W¦ݩxؽ/0sR/[MS9{j8 TUzf]0y}sxc^p% _ Oaڰ||)=:vGS/˚`ɁV}.OSax(N5 9 DFR6=y.HA^J{IX9k{p+++'h\ ZQ'9{uE|Fo`)=KfEgLAA}{ #w/lȊZ#ng?> gg*+#r;k>nW#>K.`uѴHZ3f0ΚA:`yS,4^v,<܀뗴E(B˽;'~}_g?5k?Cw_>()˽މɯe@Zr9Rʑ1)" ;+c{)>6*0el&,ƴّY;%SQ?(q gy&,*OsZH˟ܘ\sP}l&#&0 s0b E~X/8fKdq9ѹ3gB3>wsg!"#عӟGQLb"gvs~>ba `?!q#GsD 0)>m0>JJYeٳ2tXf16OL0\:Y10N$1驉sb\i̕NEd.K17"њ< 1z1-J 97e%cLA mQP|H1SlQn@Yɖ/$m4f!3{Cﷺ3ձ^4R!bғ3;>X8\Aϧ}NTHQ+>.[bEG2|YC> ߶mLvٚ5!}HK39acܻpٟAG*4Ľ46!ayCOgQQ%BL^_.3/ПS#T✉A pBkm% ??X.U:Alyʐ?u'I\zÍ_nwRl] ?CCgH#%q 9 Cē!xS^ 'P}$>36`8GUt>L\zd,ϢIB$DurI%x d0Ee>z"cS?$q؝ppx#?5 ]8GVb8؆D ILtG7ڻQѡQ 6URƒ67..jDŽRVo ,0hZw. n_iӫ72HM>Ē%Slpʐ\) =G72 eIƌ 9H1elShFF^1cy~8fq\gFMFWF`}dCѿ'A|'nU"+9j72ig>v&KW7f0YZu!r2:6iqfvCd1U K U$6>aO HlLᐢ'_]U ?ĝ *lWw=~W%?|&;-ٸtvRDY^u ol`RD{d|A?rzգW̝@qvxݼYUkv|w;f[Ss:q\8َ|WfNE5Q]Վ/$Tks־^-+/Ҫ 1m |>?-'ǖ.Gb)x@.TK 8UXDk,Y0@%ƚTbp&C Tg#l iD%[ qMra2:J `P$XL28̅f,9CeĘ # ȰJFT&9'͘e"1X v0U هs !qy(LEAz l֠)0)! s0.7,l4V "U1^a3l gw)PN~B?MƶS+FsZkNCl.W/ !rYu׳ 7Co_N cǎmݿ?@PCF VDK.XߜŔ S,M;NC0~Ah08 %yɐtYV,]S8^?lf5t0d&+ ^e\1>';8W n斆1_Q'%`Qe9jtdK|퍍Pd3.ps4كS`5=jù,)#tuܼC 4>*洛eI1@m /mOus:1!zkw(u~oש32 ,*䫿"wr&MP o=3'OKj;رk/mOV{s_S4ÖdyWIH1u&kw!5EW{OLΫaS&fe%bXݗ>XJi~taAhh"O0/ԧaFn%t^†xA'kvTmFv .&cv)a $9؆n(ɾ#O{;Vo_IĴ>L,u.?6 NYaLZ7nWb`;W\Nմȣpxt:D+>6܋Da/"sU_!1$'[tj puŊߑ%h6 ;Vj\c1)hp&6?0/|" 0YAN?>1) -v{|^ͫƟ6EIdd&%W,= !b3} 17^g|E"ٗ\یDs EKb$}1Yx}~o l_wOW߿A:n?? !MSH|0 [#||^߰;&;T<cH>#'Nc1?8#'N>&45~5dϠ dV4P { @G[=hPK|hs-t*] B3~I5h֎héP!|N>~Gp=h6ᶧɷco>vn{z N{,zK+F8^~9/W7|uqA{Õ+Ϋ.ˎtɑ1N7 {G3oU/ĝT ɑi%S̨,׃oG kbw;[G_~T3SMD)$IƔ@tiXwȎONOXwȎ.rL(MQ(GӒK31@Cp>v-x):u&e4#%IG .x\݂)c;c::^ӌN"2ݵtv.~TͮDCKgօEL~-ܼp:{L,\6dUj@skw 9i  ;#y)悜dfMC^ vOF~ *lB~%_(&J؂dݞ(HV0؊b/MO.(JM1IID8=^&aVY! SQ' . nfoڛ5 >rE{kظ7`fjuCp nϙ(IIMWW?؏GjqDdC'p-6|즯Ti)6p~W nHƾrߣ z OwDWfZ < ]/JdŮ9fhs{ I<OZѥ%E=@j`֛:ǫojS}T_5JľzCmj`-BWІ͢hd֟K4l93{zD .o-WoHpjEeYL΂"](Ho D$$YL|"d|~ ]@1dx_p\U5/ _P.&Cb, ;M2o4T5Af$De;͊~M4MqI J fE"E kg?`4flP"7"Axi#ϙJ8{.EUg? HX-sQ ՅRY}JN㚋Bg+ғnՑxeAjg_Y0NqE+iq sfD~7XӬ7ry:;K1CSi!'krZp^ЉWwCbv )E!~kRQ@S[Ca̙W~'a]Ou-5톤 ӎT[0Dhߝ]}HO v7lpvvz pnJ {^$Z `eL=GvI gz7t^~մlV41ȷ{<- ؽPemuk>nOs/b2ސd}/ox"ҿ_]0~㳸{)0OM MɊlaoR0F 5d=P_PS7۟~̫c/e&'d]>'F( U ,Inm_p㚝Ux1yl^ɨ5h% 73&MJZMhpJ7GF/fWM>bjۑ$11YI'ښ^7 2IOjc7G^JMN%IUM=ˀP5d*wc,"%N]{U:r۶U_1>`֌PP fŪNvɯim-scaW$)TEn|L'Bbf`'ْURukT[L,FQ@GgR`^OVUQeɯm@oĀdO v/g[z,Q# ?'j/'\Y1D`] w&%hD5g~Ԛh% be#";3Ғ"I?ד )ʾޙy]XD 6?SLQWaoA%feK+>`~{NQ'ttw\mvQ/,74+,/n`@n?m,;]lP"Y_N,́nމ'X=1A̍?u._4~~<^̯.j6?]LQ4^??6ۍF9 xxECo^ݤH~<}q" sMJǯ[[CۙS_p'!0Ѓ?b֟WUt77!Rfᙰv F(#ڻ{5@+c_` dOD~Fơ:3YsgPD:hJP5QcojhrzZnjx}vFc:~eoiɆ38%N6AK{w,˦h{" 4zIylȬ RG#x4BK]AEa8wq$8\p"͊aH}_[#:xg-_N߯W$?NskL2%&߯ag~{|ɿoق~~-=ֶes~y'm,|feL~IQ7G}M J b3i5uW۔) s(6hHӍn;4 Նn;}*"^, #*7\ Q^o"v^s D-r2q ;n߾t|p ˇOD3p ʂ|3ȏU vQ5+12,]%B_ñ}0 'KmX4M?!7Rrk{P#^/mZ?PMwmx˭ ,fm 򲂯#`.x d4࿖_<]ݯew ˯onӝa.?:o`?ϨHXzQғ/ nXW}o_Ʒ~>U_&3ǥ ubXKO4EHҔa>&z CO$xcC$9|ʊç̟Ow|t?Sv}v>; /.~|{]Dc͚梟:p{\N<xխ~;pv"ip0>+** v6qOE-OK-}~0߾.tnw #18iC[oŏEKj;reة&#?&GƔgؼh́bwrBFW[&? R1%z<~q?B#SNgCbW8e4>7@5Iv"1ůy".`!sq}{Er1^궋Gp̽]qեEÈĥ^..>}̛0 mpQRVI0"|$I%qzqQ)Vv#E5]_Ć'E {}~44 2`TƮy̦_r[\ Oޓha|S.f2>R/_rìDٰi`ZRFh;D5ďoqaI&PZRMq{ ְ7|d˗bY>w*LF whFqnh17|x}{ Ʀ?SLʅ V <88^{ h=wک^y S`4CgGKB :?>1% 89tص1x+}̘2U0> gdir?]. ;O9 {STT4K#uǡƇGkcUAҙv:;(f۳.iʒVok ~C`'YnW$iIۨ–zEt00KRV|oszE8V+~L7@»  X-3o?z41GZS_\K6| %4ť?VqzE]v)-y>QR/&zv"<"'ϋ7+_jW] 4a &M3t5/ K;3!9(/y:<Θov ¬$f% <io_؞"1&ly:<=/ +_hOc%#-Ɇ$ۀΓ9z$[ |iwx%<*sOhq5tY6$t4_vtv?t87thCN<>(&ZawGj%*$3] ƞFtEࢉ\430 =%YxοΧXW!ObI5}+zJu:l% A`&ҡw`ThX|4^ţ3s5A|§BK'k 6t臷;)ibm{Ί㉻&׈0Qn@&V腳s'6@:>\ϊkI|)tFD`>H^֝>  D$..ma/L?I+<" P- VtYOn~6SfX.@*c%`7pgAf+ ]q]Ϟ;/ΔU @:.޸]g5g\^y䂠ƳWN$!dDꉳןzk=_b``h$Vm@ԊNz}}LoPʀFhs:B5?ӾA`5&=aXϒYIwQ11V/x},Uy& =pN;3⋘@$Iֆc _X*H0< 9i/dzq{_]]|01yQ4<?`O5?9aAA`x'/+)y1C%IdmHAl/-c"e*vb~δpt 2N20VbzXF`N3/<+MO?1:u =+?U Ccv I[Ίe "  NxaY_ BZF@!AT [ק8&iglK}㎗>4+6HW,_j+NИ +^mH&M46*>!EEEK'߿xq&{%.a%ϮPMEEEػl|":1voZ"(wKKoxmHwFO~~~I% 0E1.I}zICC|<;%F/‹fD±]Ɠq)?ln7Ujs/4 m4w o3#?wrIqi>k*^0|θ/QD"jIIG_G g/`P)lWV~p[4:>)i+7n_>gSlsQƍQۇS0W6^l('M>Ƕl>`f1F'߽fbFׅqo~9*|g>(gt<-1쓟o6(b2| 󂶶|8qDF뒺| Ʈ1@'zVĉ)D1ɇ?ЫY+pc `dLxo͏nũ?'ydVY=wa'>C=&ԟK3y6kX~CC!l16K~{d0I0= 1=1>rY_#9&v}0F>hK_Wz~47+|[L{Ơ 5O|A5%:V4(t]]3}YD_>mպ7|lԻҠ(Y>ڧ@&֯TyX,>w!L=+Y>zNx/Ly=}!>tO|@hT{`J~4ypD"zlF_%,ͣ 1 f 1$EZ8/oiլOW̜<)**M׆A#Q7-avm3nzz&r%]b/&0cX>FDV^|N2,tw gӱ|q9r~_'G|;rh9555YeI}ĉIGgˇ!3_uA8FkVqJنWnHV|ϒ%PdVY???_Vɗ ƹ<~8|o;gx}]lr_m r#XhfH1`2|8:]M+h<<,Q #M'c Q}`G#>< 7 U?60Z3)ըpwM1<V" "ꮆ|mL><=1_?V{cx VHu5Gy ژ*MA0xmj196x#qd5@z]Ho M!0x1a!FhGZ42 iZ#z$v(Hpwg?|קnED0 yвU:we8ytOgj`~ $5)_՘ Ǽ"D;d)䟜T0,*BKDxd< nnxT ^j اtABmi*$GOPߗO%=,q(.驮&xO<x~g`2`6mݎ>M4ɝ7@,$V־i=?K3>`R^xT(Ibp$Jnqq ЫW}>h>?|.+^(~S$F'tۂ>US1 {^J"ˣ'D8f`!T@ L~~c8pp00*AU5KP$ `$.a-?q ` U~!zĠpchݞaaXp^UiPj ƠpY% @aO_&^1ܱYԎ9%p8#i\LF hW 9^ۮƵWj?+]=A@sX*Đ[7O&#:1-A ?pP9.yM/jEރh^1[΀)&IuhUcpZW) d(i!/[w90>svA8H0;b LbQsrAcJ39l62g30I,G EP#F4-IrR]{#IB9!G:OL#DD% z5ggLH )M&Ȓ MS $΁`4Gb 1 AhߋM{ʝ 6i 9QP !8xZ\|t _@{VK4z@]v/p p;W9bBjż~ldC#WIY>L s`1?Ni<%ڦ(9 /4Հ b&C^3be\-mFx=@{1ڻ=>/B58ǼY_K x_Kޤ e\) )3𳁣0"n ^@; fer0}b6dys,]mԡ=hLHE 7YƅV ƒs`DI;iɘR;<@oR9vA#>B9;h./$R ߫By`=/r.{Ȓ  SB A\NpI88@>,p|ZD<4_0[BCb>(|_Loi&`4 6O Ke)XEW}xHLDh|j#A"Is1t3TU! ?(tLh.7'h E7\,*!M4=  6Ow (CUg7zO|_h,%a+ْF?MKs*MLi V`"K$jTq#-LCmS/$||/gdjTq Ft 1"gA5~A9#d 57r֢ t@$5L߇:`PbO 'ᵍ{818%.B]_ݼ Ӡ=@L֬ ~WC˗%%IŔR3(Țp΄l" ?} ,*˲"@ebϑf4:bUy (3'09x| ջ!rp%clNzԙV?[)Dak 0Xx#r6,<_/..^s_@ M߸qpS><@hn _sr\TwA1vv<~r׮]k* vO<˯&*\q!)b1prW"?NS'g0& AC{#b!{{%YKIaA|o$#$ &[t Ln}TVz9gH3e|=/jɄ"?p/.wҫ-ɒ l(R7+rm[KaQԅMOE]"Tl$N5%IFaV" ,2KS҂V~OUpKZ )IKg"g^RVK`ߩ_ߧjx=zu SPV:0/T70Fz<|w 7i ";ӝ\X<)7^يV;pHp3o]-/=M/> ͆[,D^khl?3[87a? =˄I2\9I/h\nOś[HO (3pե2}^|=HvxM` 8.e+"Wc qȅ=-*8E\1gU0)%yX:m. Y1 #WHN`26n|]?>,l"?vwd8uI~(ữ fp5rj؝pOƎO=;>߽̎W#mk?"5|0H~?O~ίD{s޵χG˧kG*?_'_?ovJ\+2kG.5~_kVL+f#D_]YepP_sl'p6yxaVɶݱ<`⼄ `xlImF}Cɻgp{>e8KJ(Р BI J2CyaJ vvF htLׇhFY#%&a\1ȯŮ/@gZ*Nuf-2IX %&YByvFv':-@g}N4t+NLUثa;̺&-c-'ށf@T|cR^@_.Hv?=>|?Anq(sfZ-$~'Xs!s}pZn>\58p0$BA~}4/EwS!|>h^jCFavG>̫߬ LJC]g5XpBB/%; {ͽN\8= 0V] 25-+NEF WΟrT'pՀ:Jw8W( ]8},6\<=2y؜i0'% !k%9t3`sxBI: f&D\\bxTڇ wl,ň%Tň;V3B0[)LEr yIlE-!`.>Ql\2m<^8#Ԑkc_ (7-Q}>;ZuH`2LVDY n"M%;ZA!~c3FLJD#4ag@D$DN~?{0Wx&b#'5|ɑݎC஺em>U!7#rC31tlg}.. 7) 'DڿǏ] pz/,/DnrG"^SW/>;uܵ ]E&f}N/$Y nדHPa^v4Ϊ#xm/ΝI7@ ^A n>Bdnċw^UV]-N[8f=.$E<耠PU`_DXQC?W1I®ϫB,V!>T3F[|>.)_|{a"zrPOey  "]7I~$u2u{ǵV4`xax/guPsᘥ=MgHԺIצ?BAR^]}CKZ=mG?u|yEUuJ{;ڛ 5u#b)*/mvc^g+@*|"tyY1V,۷xLkO7tsdފ+%ND?0 @Wm;j#}<`E"o8zyp拭8V ؾ  (&^1u(isW1o>^, 4B_) Ɲk#ӯSo1 &Xt~S?֮u8{#1V dP!9b64WAM|uUIA> V j8 !@B`Mv%:V RH`6`'2[=\`4)"y}8 X;= ~-:!?7p Vp9,f ՠG6%l" c??|co ? ƒaGAHǧXXRBȔ4II1j |8mwA$@$3%3G=>#L F8ܾB`IaXߧ 8| S#`p*2yƧq)&t6ۺekM.@\;Mg'KLD 0`ۇpfwD]mu]hkWm> I:m<]j!ɁΞYytS>^M>ؑ ;rCYN페~c.o8}vÙgZc4o; v}*\\{>v"fga ~^fBG9 sof4&Mbq| p8:Ь6hV:3__nLa~ҟ|.7T#9]pMi=fpwܲaX˒0@" \۰|-|A}'F deL;E6C_N~ ?>7?K/Ͱ|M/4S%mXGŬG?DK^SO$-$J?bsh]5[~1 tF[Vq1gU;7Xl?, t:] d1t#3Y5,[Uo_,ÝD"1\61)m39,ڥ~g;#Ks+"7u SF,`M<uyቮ`g4TMn( -Ykǁ+sL./D^zJKOz};s͈{PUOd2~x}7&P=*dbfKOXR仿t˜`cӯHb2݀b]n$լlzyV\,8Q)+̀d._znӝaǣd6Lo'?=^FU/w{Wnmί>~ϷI20(Ĩޕܸ{ߵK~V:n$%$Ğ$qL_$nVPrqh9֎׾z0X 8O҂ (<`\SW\ߍӫ33 wM{9ݸl%UWTT ˿xᲦO6ߍ+/.5 'Krp+/#eE9Âv!:r@FR@$q>/L޸I&)&|cfZz՜L{eUϭsH&YL3m0S !ѱ'X6_^33+xww rRC3u3pdh p?m~irt>fNΛ_]NC|B0Kݎ.{ R͙ >!#%['tZEاNcR~aք\OZL vtNGnS[< ؊l3 q]?We4CHXێC[QQ>MOEJbf٩asE(Zs*[,*.qL)pVQ,HA-)fi/_[, WqYƔr8rL_N_ UU-+n~\XR8HVqOF|d?Ŋ¯$6d?֙o,PkTKA#VRoNNsiŊAJ%''jzzEֻv!F7?w9sp#үY<;.{q׷ q$王_2e]u{7|?,}ܚs\z]/c,[53=*?mp랷߃we: 3ewDB=Kb *~F;-\`Hg~| {FβeAq_XnHWU-%`&u`eg`FߖsX%cKZƁ]0yR6?J!-9zΞ>ѿ<o-eS:ғAb$M=#qho3> :>A 64G3&/%6`Zi<*n4×tg)-*ZJnDT(GUUkFKw`li}}ƨ/\O趡1F$.n9 Yn *h\<"~->$p| .%)= 6}}ϓ3*{vpD,[f'i8>*p}O];">~ S{'j& ͓7I)?a5_2hSor&_`u^QLhH+My'ܵ߫yQ٦YJfo RRFsFvi//geۡd-L s:`h$i/ϋcy(.)(80nbxT72wk<̲sPW0t;"t j^ڞ2q0}.XnδW*P ǿgOXT08'XLwג9'$%;{:>hpG%aA5kV2\LLjSm)fSj,p:{jzPC9 I𦌟q aXQ$vԔtk3wԎWݡUqgEEn 'd s)9 rQqJm`ǯQ1g@MOEE?c'dj'dd'%*Ƹ8cw:ң(P%ޝ\ 0 }*5FF"ޚ>@+1f3p#Я?ڈ+sVn%F1IJS#)#ʼpV|J@H`lb}|Jr ;ϊߵWTr0L>e ] O7cxeItVcppӧ+>/`0xٌg4 XgGq'8z}ewLu/$'،fGcp d} m}Mnf>ӧOWTU677ke٘|)_I\ޫ^ !޼O %7KR/SVXa(4]&1 %=;DÀg޼yG%%xÆ F(+5Ge~|cwUUUż;w {BӉF&Ľ[1.' 0@9>^߿رcg߶fEi!u>zmo|g~EEa:Whַ>8;TTT$x΅D41QtpGp-osmGr2n8YQ] j8pV]cg2 Ъ1Zqso~>猳y|`Z2)7Z&/nYgܸq6뽛 hy@[[\SH$\4@b ,{.ǁP,?fOq8M&,I~Edzl6_SR2~0`7jkGǽ X墼`ilVYs"%|O80*W1(:/d|gʟC'?} m''O0as$I(JcLRd1IJ@ B<.ի9ѣ˲< +$eqI$G5MkGմ?bѨH(MYIxK3 0RUOG;b"cMRȺ}3Bkkj,c%R.KY,Cdȁ USiGhFԘn6ȉ|i!|O{`w/+x0u3/{ۋ+,?G?Y2n{/~mD|Fm[7| + /> cw~x 0rm?a|/? /ʇ@goG|1EEqǦ[_5&OJFV &YyB@}l24Ն9Y%K/.߷ ː8 u9cP$ fFEY>,n7g|M7_Yi㓐> B(2GiK./o{/]o$) mna9d F!(!f@UYdV{<|>.T4`@ ~HA yY G\@4폌CD"z l}$B`SG3͑/?!?cl˿k2#{e^ CVQQF#DMxyϡCC򷽼ԑIyi˗ݼvHieF?=hz[ m1cƔAFn*--}fH:&s%YgDizp\@*qrġ 'nbI ܈&S\jءF sb_siPd%@O}¢~LӢ>iMMMclYwuJ8q"#֓=pEOV_apm"^U-ш6ϳ}kb/(ȔD9`$n DCfWB 0 ·3no5GceAO^ tGH_C)E&|3W1ozdf 7} m_| aN@zȮЄD1JjOPw]\k#RPc3(0 %3eS>mLVJЄ_CFEF]{Nt'r| WWAf^l饝5`4#_.qu5߽J4vK)iIePd=nrb {pQҬ,πͪƊ1ph /v)&2τD20)_'ǘ f&& &]ypz}K@ sXwzuHO1|dYdE_t: MsB`_߅4:\psX`gAa]n }cA=~U 99d$KDz\al|{Ս@ ȀP;y?{b1e'"qn> szՉ@sQկ $fQd}xnܓ UqZrH%puҒmLK_׿7bHJ((K~Im$9آT C SpP+8Fdc #Nv>8$aLv [1iBV%$ _ĂY]( O9e-Xm5_ _$\4m{ ]v$"=Y)~}*d`%c0~L*{#;ن>&IY}\ _m•59>ëar SsX>9`B^&WEEAnODn|~LDeQngJ7oW "}c6n9NPQDyϢ]$IT,^Z|kݽojx>\:s2.T=7:lFF E#J_߯lJQNzOȲf$b}u MU7Ar2lO̱şK%)2'-=~;Gí^hMTadJKҒ<'cG#< h&lHYgFWw?|@^y[)p=\g қ{:iPpׄF݁>tgVvvQӍ${μ]*8U[3#Vgk&vgUvsz2Aנ&aLvZ]=O;g ;>ܸ|<'-8,&% )'\Cuشw:@RB~%[6 NAEr zG;lGdEٙmIXL ~ktG,*;FCǥ=g5 VS@s"3h +J[ Jv1v(jan{/;듩NGd'"fŖ]q?)|J"$zmomБzZaoD# c ]ع>>;hLF9A>i Ftݱ |XXֶnlٶ흽`̅h,.Pf3T}PF;֦ہiwPx||͜gp'=. ܰ{4F'&yF`{amn6c s3bf'%|3@!]d*OCIM'11/qE!4he;ݐb=gvcV#T76 +Yblf) Bwd8|7d&? ƯTaIW}Gy)In+'g$n|@Y0sC|M]8m,ƔFo"d?%M6^Y9r0Ue tu3RhhtQyLx,6,̀fŀ{MP|cDZp0dNb=emV>] -0(KJ?„1Agz⛬ZƌA/2drA^:% ,QKL@Z_uq9$IY^,w4cmQ1gX0`uUemH;?ũu%'f\2I-FeSbdž4d]O8Up+4h=;[z崈]:ڝ_vzщz%&h -o߷qϽhȻwukAGww9GYX[pn>s׹$m)}gwF__U,m)'qיĶ؜l}G S po繷^$>EBV==.))VA9Ö{T$)Q:l1ANޖawy^VrR|HOC3}9`0! ' /3ß5/DvF 4UCOS3Yvq_Ok2i)6$&Z!43:` ?#7Y-Oy๸w6@) f$Zn>kKQrTg?Uչ'fs$9c1`sc L`r@(Far{G~w=us\慌ۺ5Y6E4L'gIͦ^ْ1fE|͂âa@8L,@Aon5C{;`nFI±M~5h9`=[AT߹vm|mP-6$r0ID)]Ml='L% l͇NSٸk_?x?[8f(9f$Ghi9Ґ>Q;> b{tOק;?ҝN$ E{짮0™ ԧ5@taR%c>bj|N]} .oێ/XJ)"&/;_S{Vl'RHKcF>VFW փMڷ)+K1MUlr+9$O|S-}kB0hk']~4weWJW'^|jղey%@g@i< Ȼ!;́`w&Ϛ5~e˖M,QxɅ6|#%5ydgϨByEqܲfPłnZm^7ory㷂ͱ[> kHe-\lL-Gr6Ԝwtv[~8t>:>RȶNޗ==J;% %> MGf2W.?:xxe$D#mޔ;`="EO+/ pҴv8ؖ5 &-oY}*el.:-~{Oˋ !/]<ӶA

ߜ߭is/B}Zivy> #Nç_nK.b&O(ROʈUk订"fQ{##O&6=jq͚5"Y(LDSԝjDÐd(Pi Pq[ܕR (G_Sp/bG/b}+]uB;|Gyu*6~'.ǭZօ}>>! _w/jO=H{{8[W {ң[31%oJ(1]@Wi@S 3Ч 8: I !Э8JFQܽžei"0.uGq'-VQe]kԬ[dM-:: lxbӫ.HKpj}"=a^h Mjت]__yxQwvtOdjH# IS^J&cBI!=#G3.B˃Xp$J8{R(zOʨA9mNmd"إH z{MS0 Ö\v-[/[.1qI)M|o?s.[?6ߥ)N*b+I)yYsw;斶kÙvox9=~ܠTَUEb ~vHKU7/wL)vI<<9%%G[#nH6EqFl!G@10-g140j7B͈?(1||MxnQi־*X95l+ͪQ0Uu?k>qC "dtCl=PZ+RUǓrDp9KtuuuvEQ~˯}CcƔILZ7b1M(?/Ue_<~o?ikF4'೹g_=q2kKfk?ڙ4ܺONO]]@fΧ߯*3{|T9uu1kמAcrUr׳kj>|3j ( />v΢EtE?tm{mמAP*?[o7^{g~Tx1woli@0yAb:J,@ڏ=*8}ڏ8M},Y|lE4ls (&S s;:?tmמA( UWɝw|zc'N_lY(O zCM[xzW-n(Kf+;sgqok5?\T`G{ <1NDzN!XE!_hwUU(Pc%)ܼ"Bɂ^rC='Ͽ'7Ղ{=,7; Oբ󯽙 [[wo|շඹSd$PGSrf_REˢqnm8m|zyn{/봝q~AV?uK-aӶ]d?p$_ VpϪ?0__g +?ﻋ|xΣzɿNs|eh?.|[%^:?~Egx,EQV 0BN J) /F|o:1?2_7$~8GD?2ߐ7Oi g|͢ GK:HuX}pkEWvBu'v-@!+ר9o4RŇ*?yrX7!id$\q pECO\NΛ7"(Yu4E`&hU7]G6YYH|Un8BX_GZG%۹"H?珈( ܸn?P[E@gݓȯxYP; 㿼WoDDU\)!Vȃ ^#O%FQ27qH$H$b&14BPXXH /iZ908YYYY|)6!Fz,􋯿|HO~wJMM H0(//' U %L6,,,,L6p9?x7Z':OA3blWJuҥWZ5Jгۖ-RbcL0tYYYYP'l̨Sey)LS`Q~ߙˢZpJ)iM;vȈ[9sw;K,Vy gF"XnvPHL@S8,r8bd0qcQwχIgȶ8x 0X, +>2`܁x[ LU%E 11.,44#1"s8#eK:K ڄ v(ӗ?E֭Qb1E%5mk7 BHMEsS'fÞ&: B;MSfm\QGp:Jޘ>j(L;<:>g{hp9qcGB_E?DOGF_u0ԁ' QF-],?Q9g4S +bZo Vo#yǂ7seqLÜju+73$޿Hq9L9յ7 cMQ0H+0e߾~{jkk(2П?w)Phoh t~LUQ?p c7` kZ9^U%A9!{lϘqsSB}}0a!^ rÇGXc1y-;!;,bkx9D_7g_"~ej2IωM|vfM)̘qF94h~^|+.#4!s}G0G|]gQ>u-bps^[tdm|R9 q<,"`Ǔ2əC7W/1Y#L*E?n}`ҧE  Q]vc(`(7_7&_R .ʟ 7%L҅?Oj2m|5bz"{X141,k2>7㊘Ww/_6?/[L3xa *JZ+LXTՊbeW^]y N&'C670M0eo>9ՏߐClU<_e )})%BMxm*eYVܖ[V.Le SבFo4Ma`&~GOܾsΥ)q>b^b]ow!Q4ɭ>dc'gvo\գw/i2wG\z<g6 O8j[Lo6 I/*&_Il) pJ33ǭ0 {qηzSRZ2|;ߞ"%_Q/XzY-pu fziYf ^`&ʲ]e'C0$n$;%h9q:XK;r&Ef|N+S6ųrY<+I&Ed9ld;E0U,JVd) yp:> 뫪%^!M34>RIɑ ,x&+3p&1eDDhGOO0*v b7q>J4i"wpy(bƔQ/8tW`lKq4u WZ(vַ#r'FvQO̰sI 0|d؍7v}ּGM#?܊l&D1}L5=/9ؔɥRUgzpK;@ fL<E_r*"aHH٬,=gP/3mڨ|C-BǂeiM}3G MUQ(Ͷ @蒅#ٯJצ,oFPg=p A<`:}]-cgRaq룅Bǚ6<-i2T`P)?zt-d펷wrӊsjaٹ %߰9  .GǛ>J^QAiv'S}<{FG![c֎1Jr;D=d8Ͼd{۫ƻYSfs=UjհA]=1=!iS_$)g0L&& *[m&uD.3f__I˸dj!O UuD?}:GO$[4;9SYhhB´b{zyN;"3QE==>e>DC*& > (61MSm Vah$ ]7I MfxoK_C:&>bݔ$ Uhf>mHǦ\0eQU r\ZjԔ 8" ܪtμaVRp @Q$+uf yyD߬Z깞Bq {y|[ O*Ti vSpaנIp-xb:MYPcNR y0I o&K._Ha^()|oq]/)䃠 J45}+))K[~z(U=D6uqYZk0&%e?B蔗dqC+K|@eVsڱ"M;`$Λ73'yo  ?qm툰qW¼blj+)'d9zd[(RTf?yNICbtOi q;dSuv*"~* ;+ׂ@Wr׶uuq]9w&u_1HoA|W](4tk Xg_]K]}r׵˱ @ZXD'a|ySyv}E fVu2Z҄|orlaN}F'_Cׅ%Mi4}$fL g5p[Y}1k!ǡbQ{F^#(J8=TzB^F;@c+^7;aEtu:$9dǹa~77-Oq^׹s&F`a75%Ͼ>e|Ƌ ظ7f;رsfM3 `P|sh'dY8W.΃'uc8r,]! ϊGY2gfy |.YΡS]ldCڊXDzSɎ wFC̚X5GZc*5^ 9ۤ#Dk|7NFo YSzVEj:!ڂQNQ0'kƒXfʾf+9u*<>ڒ(k[iyM79xBO0{d\!j{v{qyh:Sk+9oΤ^{$?Ë\<&0kDj9 _yn P {즬85e[ncJVtA,\#{>q(`zr݌/ <Ċ|&1v0>2ů,gr"`os\Ji? hPըs3 sFGX[^/ˊ7S_8VJr<x=TőiUVοGHK6U8(p+Y.gu~eu$ )GC" 41MEѸӣ* g.=A 0vM岅Yennh:-Jў9G'Dmӄ!EU,j2ߥr#{4DCR7 ,45}㲳d8STbX;օL*kv`iOSIf;.0_dn‰y fKJp4%?ݔ\2u[rŅtpά߼Ό9TO]l'wf l{q-L)e˞dIȡ ˨ڿSJ=oN+ۏ61':Z͢18ɮ. 3⟬@awۑT;pZPkIu1*C[=mψU[CV]H)7 UVVYQo5ULmyi]~'(͍nBˉAi;"v2|"Q[:0Mw=.^6'~߼gYFOfg)kbJ'YnOQq.ezز8+\D0ߣ*3Ŕ+ϝݪ^)qqE3ɲx;y.;.GGK#$H V;)k?9N&qUڣ8l‰'B7 WESig?^œYi让#G;g3@oG@Jlَ|1߆A[pS:Z?ɓipT d+H@=dzmdd&Ԕٔ )FWU5dĎ}G9tW$әA' {S3dӔ>x ?/l\Hc4=iI(_Ο+nL:\d>f:l݇/!+K$l4u3 (7-q? if܉Y1{0tްʒ|vS2Bָ|St [a~m1]!/t`4ՙ_* [ggڏ9Ĥ )NC: uD0LMҰ`,OFۻpL0;.r]v!4ir>w>FVyeC)%i?.vx"‘Elݚ `87@.+-¥'~>zVˊ8Քܷ*xjp^A(,7`[+L赟CToSNT\{{0_G5Oϩv?E9n!1rT}z(AP\N0A]G4i qZXiY;m; EY4wtvO,n#M >}C;⥩NW>tP2uqqnXۃe C4tQR\~wYyOn, 1(9N/?nė\r>ܑu:ě$<&M%¶nݚ3cy9Artٰ@&ʋZL>;$92K~F 5JFK&7'Jiqfmf oCsGIjo,SK^S|OKQ]Rs},ɉGK!hf<$c|~@mAG#C U4T]l&ia;bL*K;v{œ5TˀH`@< ? I˘9)9y퍄{qb0Z1㣦,d5K>Wa;w9gF3f?P$/hF7̌15i ZuiSඐJO]g=5m#EտcuG!M;'}=[|A֍Gr˸l.]P03'k$(o93q9|TIƝDq>xpz*@:xX0ݏ&i"˒v]=dB(R*!g}z3W,_頾5wQR'|Y#6" G; q;,t<\7ŊOdJI*V 3ɦn*KZTG:,> UuY̙ al;gA*PKEủFI㩿nx5uYdn'@8~/mQ!M"m­V" IѴvG"=4oS^ao"mﵟP8}[2GlxTXi.i'p'3g`~'hMYn6U!C8^ oh;qR"wVC̪I?q iK41V!B&T:#ĶD}nL1>vj l(-"D}N7EY=u5h"L.+0wPx#D_+>v؆?ֺEΪWA^)%>M-4ut囊)Sf(+&M7>Ue4nb&ߌ>Ct>2-׭嫶4LdRV*QLSvΌilw٬S}8ú>n#W?v pUXL basS7ƭ_Gݦ1&U0LN496؋>.wh mhZ2#U]g:uUǽ}d}WU='HEcAu)"M_quuu%4a7@ۑMIF ZdۢKZM驫ڷjt^om|IX0Ma>k< f]rFu>veK H[_}ʎTM4%5%Gxklnn~I)r>iě+^Rt?buit\<Ѭvyo`T_V#@J׷Ś5iȜ3^t~UY~fT'sK 5<."+G lsiZ9Y,v4CQYe/;Nv^ňb ]T#G ;-/dpl)n" 7Q1qVl+5(}aG2Fܐli>2Z;R 'ar4,t0tC$b.jQ8"Áf*Xa'rx?wok9 >2(?gW|[יt7}48Ĝ9D\yxJ*+|I){TU4}&.vӈ⥷z0RXf(qDBT泟ЉXR zPG Goߞ_"9HV'.gw%X)v<Ʃ۩QѕwGU_g~Jw~ @#hBR*WϾNW~>q> `ѷ2GU>y oC:λ\OgqL]{WƾVZq" @8ΡSq.x;F| ;ctGl@髋c.;H)Rf ->v3;7-}/l#BH Up:ٹ޻ߘ349n,RAM~axBv0r+Q[7~=o?`,2k,S')&LHkQw>RD\[RvFG&fL\[QqFٓꤢRTwF{mTJQS}z3+SNsM%׮.L*庒:ȩqԾt '--?ۃi羛SY$ѥE|u䎟L==*յ) 7_Cnv;[a%ť\YZΓ$X} y,)k\.Fp+BKVP-\X^NEeic/첔NFq%> iؼERYUŸj")} STU4iN;_L+fͧhV+UQ;LEÞmG+96[׿pCq5yC^Ht;i.ŋgmC H^qŻp\xqf;iRdw8lLs>dH}Qg@J|kX>76eƟ-woeYOSˌ:5uaoWR΃w24YU]VK=n <,/ϘRP^WuH݋~19߲L;Y9EWEWe饿Q>|!W~Qa-QwhWe_BUDۇϋEѵĈ*ëVɘvqrl/esz`Vy-F`(^|ǡRgʗW[눺jX׌!F?;J)eE^߻u t$^y7馯KV;dʱA^ZB ;]_KN}r7WآqGޡh۔/GǨ|)̒ϋm]J ]ztw]ףP\ذ"W4֯~}_MqV`.#s!TƷG 8v?mlۯR8xpBJ`E|?<8-2vD\22*N􆋖pƶ&Tf߯GRCp+S~K0ԙ2*x0) ?/~4~{TrNUՐL.GЋZq2?`jTJ=q4bAUDeLbgBu|)yf ł(l75*;u-AYQ LFN0LK$u !5 ~bFa0X ~w,|be'aT%4q{4r^O Ӭ (¸[1BO4̪n$zD܆/Z~bH9!y06HH9R޷kN,Y$\K)GEQ5K)<'(F m͇sMAh6-g"@h$"QT#LbaK=c|f&O_bQn a2UMaհ1H) aiJXj3ȲrU!԰JL=NKiDAT%,]6*`b +<|*sUU!ZհT9|UA4nJ؂8|x"FUQªW^@(hcېGH fl)iZ"AWΚ+8׀8{化Aܶn~|W1qżHS9]qj6-$4eX80D!x&-X-b3o tE[Vf MR3tX6-–_a2bJHb˽[sBXmq[-[^6,lTUq%20Go8QUqhKyF#IvECZg$dW8tEêh,7kx"VE(B?NE ',|rnI#=J}eʧq3n_}#-UTMFi/2QK]ZT3MEiɋk(ECw)ִfǎ3ʯ^jR$h:~/]l<-{ͫ>̙3)RΓR*[v}R"֌z2m4MQ~$K)HH޽{O2$~$8?i?n}M9 R ŗO5ϴw"G'{2KyJE,ؐv[(閡9??v9&0b+wG(],?.7A}Pc_5o^~\^8(+ܼgL'ʣGjUSeԈeb_ΡNV+%>-\s1W?qc-₋>̘>̝V>P.xu)/53_˖ȯ @b "\W$^@]l={F\@2T?z݀tTC;_gV$ccK_bdl)\]Ǫese!͵>fHlB,r7UH&&!Sz)2S!?>'np0o\]1_Œ̝6F>_2V1󫫫3 U.PY̔d')_zq)T̘+1_JQh5Ԍ}d c"Ǧ>6/e(C^W3%w麳=3`#d6@= >̘/u|A|ac+23}jYÏJ c^[3͛7/_mb`~eb<̂W?us@`(ĭ̂{dg >$S}7/Q^­̂' )oihuY8E,6P-ɌiFdg"Ag_=U {O\oUl=]1m6W1YEy9cfggWOU !pa'_$3&tQFg9?h\(.?xfnMdʏOӧz7y8}ɥNQIdGU&Vr*J UuH>c`eRݔy2)ɟGק8Ye>B&tj %9}c"g0_R-W[SW[S!lC slV@pyZ\D7㘦4 $EP UXhO4MW@( w}L/lmءd,SN@Eu {G?u [0Ne^Y_bxTCuWJYot$,^G;xζV\:FUI u1{rB ϼV.BQj&MںMϿ=GkQ]'堺(l.  uixA|7|zubUڠsbp`=;#9= \AP+\u'{zs<6*7Y!{_׏4X|X)xOĠ ڌק_\FէRcMo LLIok]~a556ppټ%̆ ݯGsxezLٕ`y?mD\RbI4.Z`bڨׄ8rPSL))ʵ5^y/aRtvlٿmWwחƢrAIڛ- &w<׏h^ˏρ]:B>P n#չXv5p8ƚd|T-wq΂)d{rqhyiw-M*@G廩(&ذeszgqyJ)sQZ7}|,BJTk2{S$>BY^9j,cUHxژZ^րoa|Q7^\郿aV{8NfL* ;4SVI ?[Ϭ"(e&N63ǝ'߭2ԅ"GbHaI6GɳqNM'ÜJvO7Z^Q(hnj 5l;Vϩ^|H=[_c7 afA(*RD  spʋoO"70d˓9_FlzHo`6'X~FRӍԳIkgm-aV͜bX(4LSňHDtB;|<#Gh…xMY&VaL!Oȱ0{FǤx[?P82AA< [A tIKתX'm3ak5Ʊe„RJG` dadP7΁S.j~#*ɬY% Ui 1|mq~Tq=/"i8nvu\ ]XR΍WdAlrg a`dbMġdf<'8A *j8LKAn^,ZGgd'{(( f6bp!tl~X,8h0p9ٻH9/0.KC1vi&;0LviI_yF# &1#1fۦ GcI"'r@ڈ|`BQB'}܉ir`$٩O*-Șow$; 'Kh)+|4%;;%;lvd#0ˁS @yU.mɎvSE6;Yn'DuVdW%0{56 ' 9Es Jd:Q({G7${tٳ^vO'6mh8#Q6swPS;ݡ=9YYCs&'WфΩacl=ƭQ(SƇ$O-&dZh3)s|Wxvu7w2ÇݘYyYiAX͒)vE+"M 'A |Ut7Wh-e(Ѱ=fhc^8υ4'ػ;u;m~MyY8Q]hψ?!?4Kdi1ɡsMol HWK,+bL^(z$bkwy8-ۯx8磹٠nHͳ&M9qp3f)&m(:F[^go}ۮ:=~ToeEY,YE%cϩ}Vl aƬ,_PE=$]Y"su$K6W>aCiJ,$5wp _8乹 q,RbJ)|T'ݻ# KNiIx TnMHlU8+)`Ԍ&RZuڹd$,)MLi* ϚD' 2e=Qw0YC<8m}jė6H^+\-sZ:|7w Xq^>|j*];IE$X5O$==kgdS=6},ɀ6"Y.VΜYTEp̉f'p<: @0kVE2i]oH_>jd{`Β<߲d]2hz"M~`9y=gYf]8{'~oMjjK>~` ĵ+EUg7L,5V^}cs+ϼÑF‘8HX3;eVOq Dyo&aHQՒߔYNO쨏d$9)# nocVKyA79x$m GlQynwBt9j_dHF7(RR|s&S;3|ϧhs3;J,82O6 7WؔomSoQJ$r>eUI2>EyN=@ԳMG?5SJ:{n 'Cڭrܴ$TbW41"LkW6Ƶ6!O݁{ tͬD^_WY-~aCOKMˊYu-̟QKkK' fMjȌq}a*ZT 0Yd&,s(&?' ָ}EN57,_K5ʆ]ٜ7;]hPYEɎ~v/xӴ^;m7?KP]NWʧZ#I0}a8 3A0D+i%[ 3?5 }3'0k3,9~֮[u0wb;sD[J!3>/ibR.lĂG;i[RnnpdNe@`\Ar_ҁ(9 ~DծeJ$DYy\:Ǘ~DzSJ:ǚgMlҊa=:lc97-#UEm#In0N2J?a8ǖ||lMܻ8e%y^}Bl.YG1q,e_&=몳,ea*pUj 0!l|^ޚrf+o4iYT{$AUǞ{SF| D\W[kuW9Ք|x<} -̛A˅#m^k?{`Ɣr+ʌ, *QNN'6sN'DZYyV<9xtt~<#ը(H)u-8]6OJwiҕ 3ߴRU< O6:̟̒sq)^rdKz6zj3wB &2oR R# C*t$~!_-$v٘ThcjQj&Њ ː_Y=[j?mua5yTR[ja\A6#-־uЗs)Y%Ԕ_g=Vuy}g6׈?̞_l&T1+'vw>j7 :KngMOiI%%̚>HΒ}~6C}nZU@q<'S%"=6&}>}v5ELuUVr*9.q9IN{`OszKW7әeu9v)K{}o݆'}&Nڌa 7[ihyhJKhXTCM+h{{^,t*+7Q5z&c4ԵihIθc8&Ms|L$O%M->BW8A/9H$ 4MVUy&t^0 /}3LH3H,%"DMbNPҔ_7gzRJN!T"LӔcҧ `a;=m%ҥg O0$hH{YUȔ؏n4uP,tDtfsd>y|^|~Lä+&aMB䳚H$ƕN'G7Ô1TFBJ©a&gP,]!"0hK`.Jکuݤ-0 ==8 1x>ߐ ͉<weEy8!ǭ43Fg߉26K]DGKنի7sfJAA.y5Z\_OdT;ƓhK/MBu(ҎÑK{gl'kbd\qB&ԔrM .ߦZyc<IƶeE^V䃽<فay.09roeSZy.bB{,ey4BGdkڍgcER཭m=z?wl6_{( łHGmd.f!7'P>rl}Vk=|MUpجDbq C'_ަIdgx[K ,55<_JiaDCc zUX}uH)+)͗L(? ahGH{J&8|)$)kJ":f}TUfʼn:v]P5}6 N9?$YjI}h*N=֗&Ґ#LQM ϣxROEd{juo9m{qOGs_uzǓ/0OZ j9P17W_a_u->y_uF._8~-U˿ss{߯or+޶hoiȿdA ,OWaz]wam>w ]伅j/}^j&^E Ͻp[]oV3VU)";j(qL|hHpy&) X)wX8yjm񥢴 )R_?˗ogo[e~ݱ0ϼl|h_8B \ͪqUŽםjhXkj;OYdm_&SV`E\nc';oztkwin=ڻп'&S:2˷{gY.'&N`Yx=owX0S8ߡKo<3I"wo;}Է7̚+ jʷozvFy~5PFX0@ߍL-F>g-G̣W;@0uٹ@ϋ^i;}o{^K:~uoy~>m:|ݽAjc'`Τ |jB' z%!ko3~c1OE-BHFj_.o!Wǫ=-mE5M#ts-[O?:L\ҹil;k&[ڻnϩaG_Vo=EtNEUL];ns8s=Hj_W4[T(^}$=- $-Rs811U3v\bGWww|g4Mi )Γ//eKJ_,{ U26/* ([Xҽ,dDsq_Yu/;P8*A]eͣ#7fdc^AU8lVW;V@utSH0ٹ$Mm^J RI,dc;h4L/WꯐR#LG:GZO}$_G<#i|4 ?ʗ*RJߧ}8op64_y)%?ʗ'7P@HV߽js5"-OμؽpɉKp8؆3_Σ LX Nf)::#6.2yrb&-Rk\N\Nw =O ק(nÔh4#gjDN{yV)pV6F4SE&u7zLZ=_(ԂL-=QY|<'&4>u=IDx.|Giã[v&pX`x6dOxAޓ _ &g~o+I׿׿pCq5yvpjDB7ަ9gD(YY >o_lbip1BFN1W3XP?,oݧH~6`#B,qgasr3P(3£Zib+`1r/,? SIS^(6Y~tI'B2++Oo"`UXNԔf'̛΁ UvͶ~| g) &&7eSl >˧h|q%fk?s(&ZhJLGSyW^c'oz.O`cæ9vp7Ň#&;>?3_z??s6 t:<ף+h); '{0U ~s`Oޭܬo}.5?_[%jH<֝ kw> o}8?#DʌpĐdw݇*#PYyoF|ctfLqhk?gGEGV~ws\>4>{Gܹß[)3O?g:YP|N4ͿqŹ?}?WTԊs1N/3lfچN;shWi"Z3V~w4A: 1xF^/2V g_hDy!]OGՉ2i: (ney/XYkUv'FutBp.}G1hc"76tpI g,,`7a~.8Ƌ:)؆) lrS5|1Z\RSBeMIa|gC-e]ʘkh~յn,MN iww >6~nJ!يuMKHDz]EeZԱP;4$e*,ȥ-ҥ).#)2ts'KU]z,2L~'pmHcŝvHs2GMi{ɐ,M}u$sfu}xݔGZl_~Fէ}7?3L߾Oar(('2ID0Hd08z:16^6`&DRy$&Ρ'jR^_=_@ӧzO=N.Q? _ ߲-cѾ~n +jv&A@;b]Kr֡_ָht=p?4?HfLi!$\yH^uwhڏ쩿QU4q#MU* ,iuVnULŦaē4eyB|B{ID#ϲ9A"TX<&u>#f#MPm&w 24tF'B"b1)-i.dLdc'h|6~N?'\ω6dh,I dhRLڊ4hݦoX(?s࿟w򿉐ZK׎D4*jȊt Y,:OhJXq͝f1nIWG:' d¦;PyNhDҴl.TUi^c'ߦYV"˦i6ThO4~%I8eB`4͎4}=v X]L.&rBM,s9~Sx{"<~NNvMA=*By 4Np@׌N6O?=CHEGKa\^7o^?4444xi;mc}*`)g2٧dz&a2٩-)%u*Lץ.05 ,:??zN}-[X,U"9YJߘ:!mƌŚY0Y<)D@Bm۶mN3 C'6>p Yvƌb˒! O"Z">8k㶍+OP[q@@j >8|p pC>p ; Τ&?YymJu&{xtuPT~g{* M= àQk_LMn~ǤwvEȯ|P>}z&/rh|uӶm#썙I#K!_v o]=bsgalRꛛFOiii./bH|СC|t !gxz`!lߥ}2 Lb&>&MA4ڑB T44d12(D_}{=K5u- fXR{ 0w\rxe;{rLrh%#j}̝7i#!ݥFϸqCan :+nK 3aĻw6ɝ_wu;Z(;)- NHt,Ht*`@eNOO_bs؉ھt8K$?}{nuMH=W\JOΝ;7mn?i%ؤO?('>H92xhH.h(?op::gvSM{(H\ } -vl š%\a4 "mmDQ\C/䫪zY8=B0*BQԷL Ӵ'D"iLbO/Z44?L\i TP F4Ņ3-O>DP0Be|[;lý3 ~"_ #i9p8K :A'O, ׇ߷ÎnGuײ0HaOL&57Phkmלыo&M(mĢ3=IJƆW/ HP0BQ8te`;^7c0IDATFU+:5!Npss!BOz|pA#4?ͅ0r} 1CaDsm6]Fߺ=qv:?P2}KDZuC>v\ÑeϛW; ?Y%+w֬9h@J),C*sXXaz}9t:sSps45Wq_y՚a28]U=xFOKN~oKk+>ݰ~~&`BWu]oaM_Z 1^4QITCa.d+^w]2)+3ܽ 6o-u *o%孼bq>}%'C՗rեLDoiMgAbwU92( T۝H(lʎ-j=p`(9,+V WBHO Kp(\tyfn?'14;.~ss3EF†`EXfV ,RA;Mh. Ba9'Ei$ 1nC@|Ʋs, gRIH!S<B4+ap,.߭.نP !Ή~>r31BHMrv{Ǩ8Ziv2u:)9PUebI2BEQT*6꛷0X"-*zsޜv ðH&IBS4MAl6u[ i!&?ލSU0,IҔ$LtEi`UYi#zvu Ӓ$MôP@WU4U|`,Cv-4x>Hnc&(m#aj3N>_&U͟d+czqR-('327%B'6 D\bQY畏Pͮ pxG8~ձO, FhtϨ†!\E!c8ܒ-ˮm zEY\wH^Ϭ%m R6~|fXHFvH#xhYL4+"{% P1;3IаPE--|X~>*1:d:҄ԸfC}t6:,oDBZ[h:( E+Fh׹#",Qo ;Zv츢clm& L R5 p4yr/~qX~[]uH؈KTxQ&4u銟uchd2 K+]1,b>jp$7_q>wϦ=GyM3"yӍ7˗)H2ފN W>^;puO؈mG8 yޢoH;!'^/%שjd-HK 8Z: ${ΔIgn^C;$oj 5Sv<]cڥʸ񔔖[oeX>Rʉcb|{v,^Ÿ_/DZo?@մſ>Wrop!gLOi^|)烔N{p34AI_J)="7syOFgaW݈ skyt^>\[xߘl|A[tW܃5iۺ:_J2tʳ!-j A< tt}&[d1jC-{&hW6TUmFL^jPe~{RJCr<.ΟZFC0 s7w~gUdX>%#Z~7umFՋdoU=(Bف&;-~f\|N3SsN]f+T>s+ Y_ n.Kq1#2xկ/\E#?Ko{Y1<h&2~^>c*n֍Dmiw˪\0e\6Ss<ԷƉ$x̟TDON浿l\0N0c&E0~U`RQ.y~0I&`s'[]OY~6at}-Ų< >/9$ {w4 ʬ!o&/*ۑ@մ?\fT;~+?8X+=oxmdR>y͏ ټ:bc hgQ|>7 {z% M[sɸ]yIQ˂-",pNAVpH0V {9\ݖri3)\nO)dz^ Sr%\%:[d[drq~q r2@}{M'3bZʦVe3*іdϕuȑA 'dA-;T6V\M=fށMa46= P+3W/ `ۻ0紳h=;-ŦikCfeBOrxsKF;|?;BH<6'p ]w}>_t-˗/?YYsSH}ᅷy͏?E͗}ngZ|TKå8zg5<'T5"4X"-CSJ<%7+Ua}m}7kn ᶣ`ʘܠǷ:%9ч5V#3@GPSWdiǭRo9އD[H(@ܠ翪%Jgټ)Qb1H->]" ]3{:&~g^,EYH/ۑk.} շij *vt iPeul=X߇mb8.>6v kPgs%CmQm5Qq )H:lh=eoM*~fC ?+Yڬt~ 7~N>5vEsjnW|ʕ+LELxx*?B-y3޲ų'*]G}_J~ nDUql#-H2t+]>ƆkkycFZ;0(i,PZ?!|@!Sdmi,׭*]ߝ16ɖ0%օHoS\KjmHSߎp] T) ۔WVڕL fj<|{*sJd4,a'ԹH)ZL0&63E\4M!_CY~1NyI>~uF|3_u᫫sqc0SĮ#,zS[/_-]]g)f| :/;ß1i,<..UOpUaes}o_GYqj59v5i!îv8k" g 0-Kg 2S4͵vj=sƺUwJK[cdCҕ]q͕?3lZ7bg;y,ηRݾK:i-ˈ%1;㮋L-/U2:7`C6W%' ERݯ^׿tecy_g\iAJӶGȘ%M,+R|pɒ}%yu%08IeLS4Rh>7.N/dq#m}LK$K]շ2ǣr$>gUMJT>3-dq3G,s&LX2鿋dxcOt+>iQ~rk%9L쒒o\p@UFRnz"nO3~ wI'/ÅM/-[/&/'#"=cqڴng>\7.F?]]´ۂ4 h,䡳݉׮҄߭:p?kL )8gT]5=˂(@ P]zT:phD0)ώ ͡T MTlWIgEk|'}2 ށn'"ƴ,ZZQқTi 6}+Mɹ5n~Qlje(B0iLA7q?]>xw7E'?1MH꭭0ӭ˥=!hOM{ M`Yph"uu[ఫTG/;wq7eaTLӤ@$LwOoG̼J*gt'?D,KpIXwz#e`ˮ.#;Ëi P)cB`Z&3;tnr`e&q;L@cp*~F!@";~]4Zx>'.eJZCD# \/BZ:}/IJu ]`Y2%LIŏ6飘fGc4 Ӣ`$8;.Ik8JN~~Z˝Ze`\~\?8"V~lF. }tw_{+cEysS4GUMГ|?p?ſpS19cl7 ? /aTE0$rMSkc'ynn{wF(BP߿ڵlRqٔK{域miZ6\6Ӓ# 3~z^g/~aH~O,i8%!tSIyB$at"c|Yix7oi$z|ަ sO=^4M'n>EcqT?mr|!t/Eu)G28TgOěl/k1wƤfΜ pf_J )P5mg:>~'ԑWqm?֚>?Pˁ>-Fʈ+W$=jZi85 4b+Wb!0&)l3ژ1?i4 h_M4| TږŇ%/U="14^z?B^yo=kwOw}֬J p η4 ։l~}5ml_ eH#4hPwsK8@uGu6?nH}oPkOajM4H4%Zj3Ч0iԴuDri 4L^oZ|Iw;QX3H]) x8+?#ꓭG^y;3lϞ>KlacDyMJd7?@5G["8D]}.Iы;T6h虎7#x_{ưE[]s㛒?a4v Z:"k TwbX~VM5Iڃa R.ƛ=5 =+~%͆cR~SHUuA;mH$`!>?p.m'Qgx~I!kUyS7:8RąM!!Db1PFݍp|AemO=tqR (p|UXHvv>voπ@ޅ_1ԵnF{(ΦunnNҒ m ) =g#'MG'8J}{fu|=9fr"WY*9Tt^ Oj '{𸜄"Qh3"?;6;c--X H9wu$;v /a1Z;NZ.}[T֥uxbϑfx]h`$S *[Ssl iJ*[4 \3#  [;BT?iQ5D=թ0wh+%8 |ᓝN>AqqCwrJK7:~t5o5vw'_\l̋GN]שohcgٹ'?xo aZmwWGRJ~z|K|MGL69ږDS{BO=b>_UƩhhM,i^ة,TU@shsyBNTxYFS54{xV` 7Rv7>uP,ݦ3kLfOiyml9KUtIMe*K\}^׿F^;T4ߛ|y тo%ٲe R',iXd*ܽbogTjL;{E/^r"%BpC+/]LA %w/KX/9u7-gO cGBcу?o1UX/;K&y8k]A R;ú?׿\d93i ǎi^o&u,ϿϚϲ0-Y-J<.}@(9o `&7_7n"?7 pwMsk5ښ[7=X H=;nkp~h歘Vgh>4H R‚E\x9NSk6%7F۷e'cu=q,)ogDgq)4 V%SY==}74tH-Ꚑ&e=q4njiidbɔ iL_Yb.v*\(ă׵RemR Lk7Xn7%uHة*_ ?Ң_rwW)% .v*’r5H?x]g~ة*fr\y$2S!+թH/`(K'{8w ojEO]g~:SI/L.cWVۮ"$+ n,7wf\A6crhv7ҒavWξ`߻#NH:>n/|(fu0- +g^Jk^%*N /B"vZMww5}뮻n94`w8*/k /WIk'cs}vhumIww'_;1q^ˁò}w_tbymLh2.,'ο޸3k6m.JQ]\}/?a~:}/^;grcfҮ8>.01i q/bbv5"q7f ѕ'C/U;S̲"<#Kl9& \-{NMS˻1S{/ÆTF]>q8'@7\¿ %-|}=NK=86 ǭ{T;MJe>FÇc1.=}ƌl7pL g&mȻggmrj4DGtHS^_+⟞~P7xQ)Ý+*5uyfaB3Y)KNjzSucHK"/@Ojru#ZU3 Oyyv,۳hN:G9N?.SsmPryo&ƸN컄56*aWrj\ӈ;gLo˾Ks&Ŵ]A0c2N>`䔌a̬yDEMگIY4dƨ Sqy4m4Mcyy_A;ؓ.j&cY|np #Oi4$sJxq[9'3&#d!G?F&-`,!{މܧj%eyyQB]ʾԹ0f<&Mti>MӘ8i_{v)I_1_ 9%Yg0g<~qo]w '_V*[nl U?̝;Wϕ.(LJMfJ1ьOk5iܞeO2f͚*^Ge UA[GV[UyF](k k'Rs4eY^zk|Cx܎SķwO|Փ¯-fKY2H)igC{x, S'n##_9fOnXI1iޯo^R6ǒ5DzK-řSݪ\O|^D/3 O*ߔve9Y0L[uRl W`K,BT%ƮI, .GfP8wz3G{}De-}3[,m<},_,%>'\ru}_0## fij"}yX}Cofi9Q-~ΟilK{ω)9ZN jv/_ggZ0XKG*5Aٿe ,(a ݚ"p^B;;.[>GDnUwX"q@ puaGiMZ7|+0\I㫖 kl=ͦ_4̓WeRe솭tZaʓ'e#bFU5LjXK -IE薸Vjɓ;t*VTEH$N.ڵS?vMj4~0S?ˆj2~XP; GbQ3{r[KV:O2^F(ʘIΛ>$)vjr~0O?+Բ" kA´4i%ћ9btl?.ǭe EEk3IJ<PCL'$H) &Dbxf4LDA"c 1PN߈HaЎ~s"H Z1"NO/;?CӊiRGJ}l7 ,D)X"Tigh!E4K'哀튛hy|S7 K&4bܒO H\>'&t5]rI8sKlQUyC4͟=#/1-pM:g摙0Cm y:~34?mgo>vv>20lΌg:i *,ez\(/~N_覺E}"fw;tMmwL>1h;}AKUy1s"֘7vDEiON?t1\qgG]TқOi׾?:ʚ=eRĝẇwxZ}̘16!C2ej}c[9a[Z>fɇ@Ojj'xlNY`X!CBrd"d>K=zXUQR[V&BD0UWگK^C۳uPceg],; _kM`֜-mApd4yW?dap.-377/tYv8;sW:N}.;$׼pEp8oN]QQj}ҮH377o^lYv(;sW4}v4r3<s٥f[X0wAE[8t|EHk\Aw%x$|wnn۳N4.oҋP(v97bt\9^eܤLߙ]G5~S6sڎj}.a&e{] \C>\5{ȉcYL&N⋖8#`> ̝wH"~\k˖م;b")H!^J!fSkƆ nǏ{]sr@*U/׭=rdH~[УDg+PF _*q#9(]+//T٤W^/|O@.=mZ!;v1U="ijҒW@ Bjy}iZK}K^@twݧg"/?J3կm>X8+줋 hecTaYWW=6o~w!ux-r $?Wq> 7u lQ\>sREQH/MM+/2s lܸɓ&kۦ`ęs62blcxҘ|1c޹T,={*ki,)#o裚ra9✅s^6nDI߱i~k01n#MM#-7dqNfX|ͦM2HURvVfO-;wSA} M (f0-a.ӦM˷ ˷ܙ6oWuci%`V?,>cZj " r;gر6)#ʴ~nh" .AcC=L¡0q#uW^m÷ ܜ\ICCBa[ E1?׭$r:0LgG'R[8:>.`q(2hӝ6;9$& uDa|cL:ZuAnN> DBafdXք kxdRňW0mpdRFF"ҡ ?WZhՆOѥi:ZKS?־v?f δi?B߲cǀ x…ZGl0-]'$)T_# .[Z(gl۶mX/ԨrD|EXg\pۋ7[0B}YZ["}IaYgҡ;X(bYwI~NOOOk_t"?Hy-?C-rH>գG;@J]*c9pXF_ecM?ք*IyE(w_FGgRzUL_p.aH7̘1#C(9}tnxG( AQ #,7>Ra|w 9eeeCi=*==]._ J>(]5$ۿ Nɤ&7g|Ms9idEB5$8}\d(ķ-ʳ0eS8E[!ڣf'֧xH}\6ct;pӮX䆻n7BU9ltE̤"utޑ>etL&APb'mp} !$A$Ǘ3H&i|#i=D?=#:w8~L&#Nd2@ B Ȅ}`ዤLHbsCܪ*9szߌ0;iiTi|׃\UrduM%g/N_xc7c묀I-Ue9fULX%f5$B(Hi%0(9蝇5T$QT˰S-(`cmL+p`<1.>8&PL@Z]AiN&Gw&=OW'PeJ!$,t8()*$rĮJYٔhim)J01-yN.>&vM!N X tE$(X/$B&K/|CY b(r؉%u\]'f 3@TeaZp!f]1TDE` <PvvΚN8 T,v ~n)/?/>`H,A$j8vN;~|γPK4 h0ɬ!J/,_TӯP۔j E|U=/?7V~{L!%6]#4p\tl%ee???qK!h2 B*W>~o)5shlF>",)<& Cw9ttbi R*`Z+Lyv\\6E=|~$B{$XCX )%0*\c;y,U>yP'}sEծmTgQJb8q#-vl Ȝ+-*7 P ;?^ÝWgEI^[OU8H}+a5"SW ^1B ʰwXD-!uyZ rYPd(܉9jϋcܰhTgۇ[qL>[}rODkbB ړ4>6r&1Y rJzG)!k -LK*<7⚻)̊w튟͇yƤp{NVf]ScE5| +Y05-)gee9uRmpޜ&| ݵgM+ #ީ;fj[iXul|g#㧥糷jeqm]S[QǛuJMO/}­Md5x=+~vֳsɳ)4Mr|'O/[$M%MB5nz19Y!|"^xcɤ1 _PѪWVTob-aOH\ogr|eE5cRjA.TMs=n$Fnvo<}Κ3֎ch~_W9yl ÐXRVJALJ ϡECc WHē|~S3=SС]hyK2|^H/0ٸ]S8wv Y]ɔ>痹GW#jm'Mɾ86Upx7nW|YFtD3$iX[ gMMsބ~v{Fo\e3Zh ԶuQP4mZT>(tʵ}m-gw*ki Yvk8\Uׇ/lٶϟsjͮY M}W.F蠭@KM=,מInwZ|]{k];Q."m$ -YgPܰ5ٶoSZ|J }:DwX4J0wBbYwD-o&_1{'y$ ǀRY5/'nJ)H;m/ëwoe޴v/j;7U_{oEP̬,mka[//_[KϞF8=wr%yn`Gk(),0okLs.aeWUJdXV^hȘG:7Np)Ͷ%y<<;'++K-ziY>AaObs8,Ź4{>^CideePs#1&1.GׁRZ45PlqWׇԟcLBn<& 6>տ\Gm `nȕ( R{/\@Nf^{}rʚFpљ|g"\_HbE,K0at]f^gmmA@ DߥBU>YŖ}u!|` !)icɔ>HAGCQ`gmM}+(xp0hBGs* 8ڇP<`T)ʐd~s4*JS_syW7ipyU+J q.-w}>;xf_ӋMVMϟkm{_?Ǒ4U/|yvnZ/zԁKqS>vsm⵷!G*2'b'^'W6fq۷o |՘5~4ϯ Ͼ7~>{ThGC|,*܅.}}Gky i GGOmsw7#JZdxT{ ՝v8xL l?N"^CCz?H){OmGO8ʮz‰TMT᝛Ѹ_qF{~}b`$􈟡doJinMW-2'ۯܯg^~3n…Ҽ# WbѸBWK+傾'>Ln8;/ #"6L$1`8JSze}gL?y%Z e ɷK32vg}cJ N`Z!]SK(i}(qÒidRD䈡Q)}c\(}X2ɋϑcTa!',eYTۇuq1xXa @?xt?J|*.!xgߺ8gO.3l2H ;]sqNF7?u; ?7(+-8w_g[7sؒ|n~ 9WSݻ,Eŏ?j7ٙ9{Zq~q KUnm"?4?cB{~Gc7>gc$?;mz7QL(<6~ܜ13u_;Kex1?]ԇ?sL*NO FŶ⿿ɻR$:[]?|6Ϝ=g~mw柶 7~:$I^+aY}cp׭mivn:1q`H~>aau7ct~iO#ӛ?>:IG'yvTMCBs.1L*8g!%ʿ迓뫹tn muhWXMiSrwq + W, /ߪ]co_0PIcŒOUNam cs]6upL*kS?2l!/M_xLŖ9k2ǎJq&>/`&;W `H 8YevojmvcwSy$t>-Qvv/EG[ۆi$7pY#>JS@ɃDqw&گ c[D\6ln;zlv)Q:?}"xw_o=_`TZug&OOxpxk)q7~;-"kժ;J;0Pkń^|?U+IYiorpl-qݏ?Z^~g+o'~M఩zzv~giWitw[+o?vM,ų۵zχ[x)P#󏠲.僦Xlp,@J݇X0s"J:'Iϋa@e{#|fSFX=cjm`wٸX!in&+.;NNq^*H hZ8lpH IW#3I\ݦbTfDE-^7~cư6l=eIٝl9JkzdzgDZSǕfjq5@lM!qpL3R1lH0zsS>"5n x#>0U@GYezވOIJzo<۟v3:|;=f?C/qkX9&zBF, }h~o} jZiĨl ST7Hv9m0$4M"=c f20L;-hIWԶu4SB 2Q+bulc * 4;E3~%W$tat+U԰v>VTG/_"= >]fN3<"+~"1*4ďƄ= $%ah1F[9"իH3٨?!C{s T}({矶@w>g5e/{z;|l`g^B$g7DdaZC{s'DIv>>aXiOP7%5I h8&T'Ivu1>Q T6# e#@][@'_!SJ}{so4dwu,!ѧS[45:/}mNZ2)xH\b2 |Kt]N;;?~`I)yH̼x|UQ6]`RHP1ߔ=BCkvհHsR0@J!O|MI쮋Qٚ@)A\ÔdYL*eRP-k( #}p-XTXy]eMKܴOB<`_X !5iqMКtmヨo} OXr\_97K)WUeŋr}BF_tq?ۚ5*)Fs< o>v\ӚuR+~Mʾ<*s/qKˍgq t )M4Ϻz -oƍq3rjtiY|kB W/c7*K~PxX,ˢ9&azʏVh;26Y5%Qk,{ʧ:!/_|s=̝i:ĮU'5vq{0}7w.{SbO yJp|]/W{=p.i}[HwrX>h8 YvliZ쨗eD.t%ٶ>+ LbSP[#:Dz$[kb KŽb[<vVSczNMMM:h]:]O;zV$>,^ $Wdr )#.mmaՆtYS=l+]jh{^`on [a=1#++xi>/Bٖ( l-e\'>ɻci3(ud֌]Pl'W\i{#aYR(my|ך987ֵsDIOBv#9n9 ߂ p~>6N/m%Sy4Eل'81 :f&ä"ϥ98.}*Tд9k$!*bD}4DGcwQ$K}egp-V,qiөu6JeexfB/`̻V˻בf4q4kw|ǓB``7,DpĘxp5\OzYy#Kan2lRبJMTfr$q1P},=9hYw Za'RF"Eށ9Q> TP̈C"SSoWS}0>ieɓ_8_`u[g3/іw9ܗoN'ZY76yC؜S?~Un| E+WS&1_ޘQ$wɱN|kX4wjuuRcJ&8?*[I96~W憲i{BY_kF$ޒB!ܚ#l㉷_=ݸboIYw;Ea)<]_snxEzG/ǔ*\9 E\7YO?bE([}Y5} |)U.xrŃ,/d>{k t"D^=IwHt.l{U5Uj|]X{B)xniƿ=:N%YoJi/Gㅼ"nt~U^8^Q{Jç݋S[4'!oJѕҋN?~O 1X/_dD{&i%Q6.T񇊟D&Oz_2,0}4>CŏR<> GPwᇳC{ Kh:e`ph -$IE!gT "؃-迨7-~-9m~^bOIJ7\րNB, Ʌ7}Z?G2GQۺR,ŤRMo;Q59?i<>~W" kA´>>!J277r~T]7ySEơO1_ꉓƷk 7DrE̗}Zٝ{,j/%gWhH- ʞao6W:CLѶlF눤ztOL?"D?XNCgp'잇O ow<\Jen(RwXE,@Hi#ʯN_=nRGJm75>D)X"Tia=BHh#q<>uIg$ E&Q5 :i|3uekǥ KI(), rEO>v5-;hU"cA`;߮)MU&%6j v?KiFA ]Q NUw]tj0enN2g]G::W3b`goXc}dha7fSٜux&*Œn8uxqjZE}"ۡhj%4~}Ncw&tPU|oyiKxj H"oG'JhG?};|1DVi?OM>??O˪R1 qΎ_x#~YfE!f۩G4JP5mH&vNi;mK6lm#\!|@)z) XuTl8PeBk 1_HP/ kOlxtk! dD VDl֮=rBۭD\e@eeY91.u/KKY!,!la=kCS3fUB /$,]v? @"X  W>!gna Q)hBNSו)NR jC'gie ȓ ER=sӶOV>KJPKnk:t' ՇA-RpPX͚5k0-<ٺc ?{ Dap6!%Q[_xY,}{j=?R &).}o|8e#? @R6YBޯ_}KOG08I[wl{rp>4Iޡ#G< }" ޯ^[Ϝ9aY)K@mٱkP:.y3X/ )Z|7iYC?i\jIon+0RgϞK2B Oqݷeǎ?|byC/`pߢ[WY6{v%Q76\bI) ##߳d4Dk~{7͝;o%AA@eYl۵kw~ܯKj,5o[=bgPɰ o_P:ek_HW?"~"H/[w_6zO??tHk_pkZX=F.f͘2-Uw츁4ߪD|䊧_"V}xd?,]>6aeQ6fS鿀UV^8[1ϑMJĕ~7`I]CrˎilUjiW.텴Z &gk2}}ʷ7QFWVTVͿ  hҘ_gϞ]$ cBu[vJ/fZ|)0ubSOIX>t+_)x']n^|ү|iΟ~~ڕ/KMK?aӭ|3&mׯXO[neK3i V̝93m{ҭ|rv?,72}>eG +&=,_MX?NrIAu!,?˙IǤ!5JJmD|)Z>Z#GX>}#_'\&n *+Ipyy x7R(_Θժ6M5 *y*}i|jiUP+0b%D|KKʴ߸bID~w|xk p-//r|iYϝ6mX;Z^kwnXgRK߲^6wx}ƍWo A+/I#$c)X^^nCPZU`"-gyyMao״Ѧ JzSOcBqe|PSML0|~iхCmg?cƌaH rLrnx0((3GC3p,JM$_#1#$|1_LʴLU%W\WrY-]0[ 5o;}E>R˗B(d.';zG6>3bجJ g}3 =͔ue L-g&dTdP4A2$=B泒qTqz|ڲrr`ge$*nE\0ٹl~oʤq=uI9$'5'*n$EWg NS9,VDg> ri2%S+BE(:  3/d(? 0,gLj)4#p6eHs'M4lHKMaH۸,Ff0L ܠEU4Umnar`0eqe%QZȨhƆieHsW3ilۮYBu]3}&׊eQM&iD EO)Kb0}r2\̘K'U1NM(waB0E ǣ1A3 -*[{(/.J? p1}\=U^;/ O>A{s3NgX}qUK~o p-RÇR(`,c,UaZ2m>H ɹv2"`RBEKk&PAYA}h r8Ԇiidv"$FGpAGG/'۟O,@E%DfWQ Y0sbb"S 3%а|̔R {&~o N{1 7s-tDo}L7Gg>sr=܂2=}Z'|<;yc~gJxl {bDտ9^e9z_f)e+?sEs^Dӑ$O" a=[5'CG<$Bn f({]~8Ԣn4i9+=de T SRR—3?җg.,K0s}h6CArF#ggK,D@*B;h&(,+O[eW_[+ٷm =[㰡9:,{z?^okePs+^d2N,ޗuqEKy]w V$JimwhLUTMvsYVZ[x34e>`0w\,Zx6]u)(p{3Tٜ ~zijl/uCUqa&ņ7kt-kzY^ _EݡFLj ?V6k* KhEwL/,w^}` 8>jUj?UBU촵ifz>:DQa9Y><"!\R,X|Zfbp5CqZL)& dznj&<+WT[J|r@8tpܢ%lPշ'Hkǡ26ӎ0Mʕ(+Wcj`f'h GSLFI]๥RY9R !nmG*wZe-d":;u\w]w1_\v.HϷWO=;W, 7?|L":qvg))#;k4fm]L͸Lb$ ~Í2el6.Ʀi# !qM)p0>FҒ4 }nI֘oǩ 6VEiפ\Ffa&-0SWq10Mc!s=e`} 5hƋ OMEJI#Y|ljnrwsZ/22iR sQ 7ԫ$H,6 љi 9D]8Tֶ{O& U6SV:PMhz/ iv1Ti s;B 0L*ےy8>4Mz#-~ Hs鄅! `C'M|37#MUjL0InBF:Mp\EfnJlTM 0ạC(ZM[)-*ZQU7_6@[KP|T_Yf2$`"r:˲{|o}oqH>RTKi/9{fAk{U׻Dzhh w/ ]cXېNhEӕnhZm־7>ƀ +r|JV[vTʛ7׳}WaPҵv_XsN)Fg4ΆCʽ0+XemZ#[E9&2Vq͎]ч[WҶ_qj*M}kaS?ˢc?5G6?ipԶ98EM7>6PT~愚A9Fg=>ShmՠyU8\^Z;ijEQ:h9?ޜo>h8ںmhGtJ* ޅH#nx3-~.tMp3;o0pP$F{WEQ k^{.-~g}uαPtNGȤFw%IB1pEUB=gKT}fdth"t1!OE7{@Q5^z[KsBC[t]挛]@Lr|#gϨ,rj"ėyb"epu1"o\wd7Z$H' ѕ b oCIa.i0Z,+Vt4 p@fF2!²BNl>D]Y05!Ûhnz>OL]HIuӽ5'5Ї>1#iSYN~WL/pdozyWu/|YΚNny%˖pQӽ!;qW6#:Nva*jqdeb3z#NTUAta7zF\rKY/¥QYU,[F_HnkYvZ|Ge93IeK"s2,?)1Pi{m#M~eݪ?y+(*e$"l}Tqg9E ^ztHOz=+ H6ue*[VbbKDrVtKېWype!U=nWH_,E8{uۡOvn>%SgTUϿ5e!⌁I'ZI\(¶-t*ڪBJ !ql\ XBk%' T0B&g5t=k@})}孴R(aT׹Y6fZaLqLX]7~s%}_5[FadFr_kH2rCKqιahAqa2w NIG=Mק+JYaC +{#HNQ{ KhTd8TA'Q덚 V2SOLPdm]= tfYw"?br7_Ȑ m۴ wqn%!)7Go0"'Ԡ3imׁԲRy͗ؾG!^F߯n4 uvj_>?I6ݔ{Ck 4.e礭w-[ZM7͝söG?oےވIWq:Np_Snئ+b$qbc-['w7aO+?1-7*7GG麟o=ϊ3Ii% H&O<|!w&f#/jM^%=.>;a]e?-ٻ(<8ں{c4ƨ9r2hEJ1_Kwi%aaKO)-=k´hM&9 7myl?yРڋ?h^fڱW%@ ;{Bno]9xlpK@I\uUG"qDG#'ZinAIXB!N"qj{h  ?/!cǤ׀EWdXӠ{,!0-Z{M:Bz#Z YXZԅ7}oe鍪v$żYñvg?D2|؈kjb2۳o /ۉDS3c0.?u!P@_ihDFO8ڊSϭTXCFb#3+f<} n? 78XbaO|O2`qMcǷf;vIk"-;75 l~k4v?s{'⇣m\:xC>Ҁ;5dZ1:{3-'il Qߒ :ݡ;Rv&;ޣmi3&z~s2aKxmE&le$5[Y*Gf]q5qWHҩQgǼƊhpeIV2G599mC>~k -,jprOH/I4F`RGŽ z%g-YK Tk?{W;hZZf&mCv%'sUS:xi%>L85" ǛX43)L)8BSYۉ U}2bD M=p)B ʂukn͂a|wTl]s˹ê"WʪyCjnr9]oūMrB+`^yêt 7w_i7ka=, 2afq__V=U@OYzU;W|Fzy_ECfW:zHs{W_r6\}\=x[;_?y!,!&o<syr@hX IS.kh \u셟~DQŮe*[rz{<#J<"]`K&p]cx6 \OuF`I5ƣWO+/9#nX)5U?ӓ hnǽ|jJrk^~̓Tdl˛;?w^)ɖD w cxep2,%<k(GWk0 #JHԤXbM!Z^2'9rZ<:";}I74,-ВU)x.2ߟ6B4xn'RcޞM 煎d8T.S=n_}Xn/|fj`uwT[~A Kğo\{+桷.q{]T _'x〉m`;eeR6'b/Z=h L=(6r Q> .*J{Et:vU{D$P45\Y?\ 'Y XQڍ_#abt /{޼cBja OP]syx;_O}[G8t8DDh!'GZV5'A9?|3/n(~1zh:xiJmmB\3'.N6:9?sm⻼&X,̙3:HGs43Ps6m=tD$9B*9k[zyMMͩu"˙[W ɁxTkj.=eN_g {Ut5~=尿 T+_9ݗEN39Z[}:\?.RGEb\f,9 Cs ʛȒ޽sp[X6a1?p6=Dj݉Wiw|_ P 1)}F+7mrx-l%ף8Ȯ\Hxql3AE02l˾֛u??Pnڴi}gc,:083Vȯgy_|FyfdȂil8+c="gLG e}ƃ{h鵵KX.oG$E a% 7pp+**5M~f|8>e1C8[/Zt>ۢb[%_|_Cu"CQp0[~G?ELP\^{B8`']-XܹK/@UUP+-a0u|ΙK?}~/[kj_  0Xt)K.#;wcOd;{^gfŹ8x0Yxg9:>ѹ/Mh NjaLNk'u+Mva)uDZ-FDQ-$ EQ).E 4 >H,!kaD4v~DQ=*Z]d0}Ȟ ˲hhG($)?u<36|QdO]⟤PȭM֔鷾;HXEI|)wp/Vxh\442kg2OmC# ˲FPV]6V^_mh䲏^?J̘{뾯i:K ղ,(2ގ20Lbay?ޱZK˶hiO.`WS-S>L-di/{pH<>?~]r/o܃_\g(K?A>sdBp#ȝuM3!,}t}˽ xH;ݱw?Gwv%ضM,<"$~d<}񛛛imm^:Ve^O>rzKUU?8͊ږa&\FFk8V -:->w|;DqvL8G K/ĻG3?,n!g>-GSSlݙ̌tgD cWUMV~m节Gs[QFzRڶFU|>,~Ķ }RZ6 "mkFSXpPJOO57jEIXcߊ>mcY'Q?Ӳ,"n¶G^P5ONUmߴbU"ĩϟ ?D/.SN}QJt/*">4~MM͹չ~ZׯM:+vHqڊ W_ 0ۖ2_H@Qz,!<ϱ78uKelU%"Mvˣ[yc?p9(= c>%%%YNE%T5KJ,U| NS-^[a"C@)*>Ξq?ʬS-^ER hMM)S(fźRp㲓 hq"|Ԧ=#3?Gؙ8%G=Hc` "?5})Uwg֠XnLeS Tm+DT;\(Db6vM41)ݪE%,!;tG yڈOӭj Zdv̤>b鉙0ZEC J cpy@hIJ)Rr U_8yĕVY|y |XU@1ROB7;o>@̈N"VBbH޴v]O>._*)`"B厧zwjp [B|g#z[uuG8%Kb<  Ҷx}f|VN00&h+">59 ,S`2msB 6CGBkxk4t$jIJ.9S[&~D 1-6>ms]#$IB3b>HEI?#@⽥LGT_,[rwy-7ۥ$H0/ 6./D0l{_Od1G tDtE'EJbvX w^r `AJs? x%!&#سgR\yLhsk?ؤ[ Θ|}$H)s['Oey _J9`HqcâEEfw),lgtQZZd*1!_JiW?e)5I^kž|J3|sT;;yǛstNH|c/{r8l?-=}*!dq(;6fϕs8|t/*By%S}Μ9CU_H'!TWO7J {67җvpgg{ʴ͉!|gđvqD 6t;9n|Q{OICS\YHd]i_H=}YQvX_T)%onG뛜8uژIqH VWer|UHKua?k$BLTl0{=mI@4t*FdBhR J(ո-EQg(ScY` ^5y|7I+H&OvWH焹 #QKR}Oxen8O/qh3n 4P ȟ4 25q}Ԡ$9y} }ic{-gxQ(Q1*2v"ݺ]]iOJ1y>2}}&9R:@QEQ-?w"ŒQ7{kʵr-|*a nNG d&ƾFyGY.K˓6tP'+>]$!%-~Yf`ı}(bx#Ir#8!ߩ;&ܕ QNZ횐fQ.kaSQ90=ѧ$?b9,]}2SGP ob}JrFR{q"$$f廱rI#&a&QF+.Z`X9NCgptӟ#gUUU}ȭCWXP^ҩ%LeJGa]ςiS,Һip:t2Dž9S|< 2ngH*迋|Qe΢)j+ c&$rcWTup02*_1 z_4V/8+?mmxA¡4W?4@Vv6眽/ۈ;?o}>[Z a[ָ|V +:XHL!W2f]iqYlٞ [PXܒ֡Wn/B8%M>^Mѧ^ၿҭϟ2Lyi jFO #iS̜ i몂)8t.vNNLT2I’jkt%N'8GJ_%ՑVÔLiZhtEATtU#(]uugveֶLڸn}}Y^Wuzl>s(+JoWlv`/\0ǕMV ]KvpfȐ؁wOAry \4ǝ=>~.|d6M8!i*1]/fI4VkԈNV>qCe3YqnFk;2 y̞k1|#AE_[_ m@txL'.N4χ[1!:L߯OQ5/R=n2- H(i\Gsir:ȵ,*2u K}8ThN~);ۏg'4|$2J ѵe 5kӥnP_93+Y< E8q`|.W_'Bw_l:ZRE􀔸NfϘƲy5}5Ptr KKSӸ|.s[cmZڍe1pϹHMK=kv p {ȭQ'oxNx6AyԴ8\{:~L6V$B|%8@3I$RzC .6_hBUi&]ŕJRm?SU.>*ĩ ܺڧ:9G&s>4[Pi/)!OXk'H+E 8gyEє -T4ϗsx 趂k\2]q.fT MUֽ7?CoFJs>9t˚xdp:˞CW1zCuHj(,/+=HHK (sQ͙48ܖ j߅[M3@tj Z9ډ2gx%J&Z 7LN,uf6gpy= o}/0mn!2ep))V6_WU[H>n8o} ~'~o:J2_+JOĦ#j3)-V7;4*d5I5ՁPqtEUAp-}EcJw<f i-JR;pleY4 r2vtB=FQ6mcb2=lw:Wĥk ROai]Ovrd2͔lSq']O^ZEqv6İ.ɧ,;[ш69xc+~|{N-G~3v1cGp\-XW%߾Dzs"Y- ewGbGQOk{{>wۿf\̭×NU~#ҫ?e>.drMkO\Fd|{q;Ӫ(-}u^7.)bI^3|"%i[˻N0(Ue".Woӷ>}aӁv*VKg`KF3{y{YlRtSv\63u:=%:z^Y;E }dbNT#37_Vn=R\AeT]$fa<1 ǟɮ晼rl{*+]+s2 dmþ+Yw2 [3o?Rky@BsB$dOmKǻFci !:XdxAZ5$ɣ[5?#m} gRL?##n5oJ:rdImYJ'Ge& Wu62srAAܩ"+`ZNT3UҞBnk_d}r9`x'#:lWj鬄x{7\.c]x6W{رWf ˯ yθhQµ(G>^!f1=WosO5u\(.,U θꊢ`u^^ɤua%'Y4PoVڒ3S3EQ= ZPuh="Q^3386%] T0h %}yj#ԄǕ ZkmalL󱣤gTԫ3{^wiWF%KrJ-33S8~,Tl@&"x!*8`,!(Pcۑpϳo,Oc%m|cWpkV̠anNήn9RoJK 7.M圹EL(BgG^dD_5:?>kkϤLJr=I'[ ڟxk9hUc 8D4n ̦sCD1^)IXY?bDvXRs^ɴZ0 Wt{xEϜSMQ&(]9wn[2g|Tj=з?t N=G"qnGrҖ]eXy]IMʉy7)JWq,9xs3]Vs`&3p;D.Ӵ__|`ӦMʚ`M.h#/^xڟ<ޞR`EsΈWjXBeok)>Jqo˗\ܢܾ2Y1*!#]苏VʾDB9~:yߥ7m[5j=N2[!`(%HTY$q ;՝?L͏%oSe9fma.g|i:B: rNddfA_ZBrl/ױHkp;]r7B9"8Ҍgw'7jfuq9Ӌpa6dkND3^~ͯ~I]MQ/ /aK@6M"K\4i$W!7C4/3OF._48=Dz4bo%7N 0#9JzAQ@6.p_/Dgײȍ&rm?]xyxga: :!?-= \^DMW3:pG=kcf8GOQQр5<4>?Oؘ7Ȕ(6>~}†3("oDm.'-}Cq1͋kBqzx}՘d"(ny2?ζ?ܢ>؇?D;H%z6V,ί66H(;OW}K;񘝓u?A_krD%+8젝j<[{:ovGVG~#~oyLfn <4uҡDJeg8+ Bf]2w~qʿg7n|o)n;57twG@0Ã5lk)g?YoR}vu>J|T7ܾmG|,qܲhG*E=!5MO[LwQؖUn\XeRHU͕ڟN6fX:59`&}Gynv4&R~oT:.vr6~mi~g>}K?/E?O%W)m: 37JAGk9%76H*VTeHaNͣD[0*R\^3{CŶ[u8i6tcZ3Q}vvճX,Ʋlrd#N8y,$薴= elꍭ@%'"D r.t1pp-d[]98ڢK11Uq˱;7MLbZa wu980&_JB\ 駓Vد}~r|}>iJr % iM_ӹOnxGDq`+aN{VUxC s۷oO9~zqhB^n|i`U^nFVr N)6m/bcv G}O~3?5b%ow`o%inxዡɵV˾ڡN,N&eJ#+$@o–-tܦ˄=յ#ިX֘܌Z,*ZFf7߸q'~!77YYY={|[z#[rõC|$uX{U,_?ZI-ƚ˙H~ab>=U*1-]]>|VI*o}psffT었O>ٵ[7OGju]G ΛW>_L_UF,LOvU^VD/y$۫߼w)d|>`˪G?K_RKVUA3p ~rU^jdXqE0g"<$'/t%~ ʎokEKhf*ء.QEUYlk׭cYgQimMSPxu*/"h4~c -;Bt<)LE>}>aÆh4z~~x<.:RND3{6O^[6wf2guם_۴`A99@Vj*-eKu64_MYŽ83z/3Ol*5U nҲGj-3d<ٹd)mKJ6GϖTO6 {+UU%Egkggy©>6D[++UEXBI?s{B}K{'ŷҖ%6el/]yR> UMUO28Ϗa]~MoT}V>3[n〝{I+Xbf~tV6'*[ZiJ*-$_,|;;#GG"k=4Zte +oh }7'?c|DjY=si7A*{w\=omH+?wUЙ -+xe>nFKϊ ) ŝ]+mnITWW!wZE4efn!{ja&`?O]{G'~g,.F~ Sr` ~FF_ vӘ|Z!"p8*F? ;D/-4u.7W5/mQ+epZ೻]٥PoZ3w/F8&FyW{懻UUݰe4hofx8ިͷ-޼[.z oxZq_ڲD$l._Xvw+Pfl~۶batxdU vDnWNՌR?jQqj?F^~̌QEkw'jjк-c$gq'囵p?f$W[9}]^QÈکϦ_lXvPUURґpx(EgܖEE ARs8B^L|ӈ&]ӆwF1q&=}PiC/]!BIx" ?OA QJ3+~JLڢ2mnNS3 g9' 44<2Հ&,뤟GvQ7B[YdD0q Kp|iX,Xy9~P6 ӔlC.i>+KM;֑[{V]aJ u33vM~[ZmH@Op|ՈL +R9j˶*UGMDus.DgVX⼞lo>SڒfĭzSdтՆQq;L=ʩ㔖/5qevU'V*,bXOhbukngu]Rh:#?a|*?9==Dp8׭z D<+FAO;wl5w,w򭨂i<;{_ǟaْ{CP}'bW"|⼓D5 ~  ?>?y%RlFWDM!n&,H$BۇmC%j4=.'NEmߴb6ݹl$TǨO](fe^{7NFK-hy3)Ob=mGܬi֮ A&EN/bͽv==otFMs\)76UzƾrP{MK7~IO])T yOw̼7 +λ HQTOtOo4|3a7.QU5 FZi^Jm-xٰt*E@["W4'r˩SYV U)EKI7RKxŴ8qw\tNgKIpXg?x'4ˢE1gYHCQ !~}׮S+EB,}"iDl?\rQ0?+F1rXC쩭ϔrbg#D-a4vTӯ>4]ض@$DjGEyXӴ۷|˒% cnr_Iu?׋,YD#MBQ:\cϞI߹c$7 1RNEẵ;#MiK{dncwHz]uuul\_fKAgYI=I=gN(cG4_YLG{}ϓn}/Sާߙ>SN-=>pouMͤ;r؄\znmo!Ƽ2w|]پgk2O.|U7'Ѵ[srkDO.SLWc]#:ZgJU}K L\?c-Ze᚝{7WZxKH9ԓE^cNpѢ\[ނ4ض綥OUAAp%`BB\sĉ3g\krhQK(=Wtض–}.^?0")w'ԑ#;6$Hx$Kys\G B >6tWG EwG ¶N:!߶f $_ԥҭbR| __hQ|aL/쯯I#_0}&i(-MW3iECxt4_zj)j9Ϥ|򡩥im'ԩK9iK!W=]YF~ƌx΅Bʴs-~ /}h޼ $BjB>t!IGOpbO>-w`)~taT_(<߶ӦM pXQ\².K"46mR;F}6%GL^CUD;nh2p -S7JX4S)&%-~^XL~$vZӭOo_jRV6i}"-ӧ]n7ٔSU͜J/`S|̜Ԋ" (`m{NS-o/5KWe6 *;x|wpx/ !Xx/m{K~gBŸ#>=> &OPG(:^JNNزU!3&!(Dw>5&烚3Q?0y¶;p4&ϷEz=ӭ۫O~Dz;qqRUa֔{W[,c9ċǵcvGSUV.+[G;˖̟x~&,{7W/>GO4Nz%=}@E@A@ge/m3_({K֎WJIqªy.'dz5T, M2U1'-2Bz8fхuNnlWdk8(Bߴ~Wly{_HUlDZ_ESݱH#DHU%81w5 < B#y}mz4G䂢J"y?joof I4rZ*ҺV4na`ۣTh)%RwAZ|"{ )BŖ6 Q4 l["hieٓkZRMXXփNOáɔWL|.]c/dM>|qSc2Z);$%P~9f=c ?,dw]ǂYSĽ:t]0~חq$/kNGčd\)mj˟HSgn6}qt <1_W8MW#!:ɍXR"ԉODcSJ{x1ɓ!DСCӧOՂ*CM͈?]: C ?"ؔ Dߌǟ_|HUDF(*Kcgo]JʲdM* w}`me .&~N4Pm@ax"-\0Wqrǚu;awDR=.~ z5~rJ 2ܬY4&%9)OϊBbEQ,.൝tƆ…QF#, YO{f]en^=f_QQ((q^CD+A`k(ʋ)$*D2=q9m4Us'w2}J1hP4ˡ8t{뗼m (]CaK6@EUTPBc7Xĸ%e.eI BU4Mk*"xmg=-ቁ#U^2*%٠ T$-4F+W0L Ӷ1mU4UES!x Z{N^ [( g5mx\%u:дdɌw\|MUٸ~9_w1_r_)'pHf|ɷ5,(bB:=?{.M;1`?>"(/ 22,_PĖu"@Hx5 1RE@Ey.D+xx:L(n(`Y ,e_(bvq>2^?TC(GM`&п>|f2ASl&aaph*>{]8YЇٶTusҮXUhk6KU8"G6Q,ʚel;DS{-UM v ej!U*dXV 95^Ei_D"p;+Ԅ:O)g̡J@lO53(26"*KN{\@yr9wy'yU{3F)V,>HH!z^~%qezҟq6w_N8։L/g{]A2á{ٴtQ''V]dcb XۖT?Y8 +:LɝORL%sK{.֯Z ZOQp sXC/,[(Uhܹ}e'=N sֹL`>USJ̬~ǩvi9[6 G.Mdws O TxDHre|}cjBQVExO9k9VOOj$,UVO%*33cmGN*t 8uJJr$3Kmsu^}E dS ٶ('  Gq:t%̬,!;ǿv2 xb@5roFs ]nGy)M|tc C˶mz\(DjJyy%l[G%OߟK% 1.%O 0}L]JĺtRJ^}}/ho?T]_H6u)[fG-H $L3QV!Yῳ^Ng XdyLGJill/Zʯ^өOÎinǒ%SK(H?Y.<B^Tk*u:CG` J^n7-}PhBfK(kiI7X3K5>)UEa .X4qc?lw4Me 2!ƷH*[x]\u:gGx)9˼rg^2>~˨\~7T|\ͥ.糟g5^;7Osӌ_|Q'gAKR=Lz6MsjpNDT~b6or*˖jKR=8E[-yam|wgcdSof\{&&qfrdٗSW+jihO6PEiCR2X6&jx ׬8Wl_yy-3k ܖl~k0~SK [SOUEz|i-\dgi8T7J]e}R=&GDk80| 'cWu3=ufyfŗ("ǛçC BuV+m*?Yچ^H"Am{9 P&T}M/kS2]<:u[KW_\;;(e[`:N_S?%O~W)30Ts;3Ba˛x{a}i;m+I^UQx`;?\++j#.LFP8pDϮh'Ǚ]|55,$7CUtP>#Q6J] L]p^ЩΩJZf=܏<$gr>1ԍQy'CX>\=y<x艗թo;] G;pU2 0M51-9CZQDI\r|d_B0@z"/쁃Ws2y_dsRϽ~ ߤ$>{}b)ս!\K.nLJfk~7mRj-uoLN#Zus[q3(x,Y0ϦM׿w(w%)͡#|$c>ߩčHi/oZ}>s wd.䖂{b iǥk9`j*VZe@Q|P<{-W9/'n3?UuqxG*HW~M|ˏ o=3ź/tVoQNO3o|OR_̬LnUo#M_./s(P]4MM/RbÒy^nt YI]}b۞tbLedy#l3M3-cn}ҡ 곬eA&?PG]Ŵ'76qӆ34w<7B9tG g>ocKcqP$Es+K]GyQrƳ=5O壙1[Zvs%`-ey M(L+=Iu\~>|dJYT1_Hvq3-}RXvr`yT6H-qDdݾ #ŷ1Ry ]2|(fՌ)?`H)ɀ/?B$m{c3lhV"/waNj%;hY*uʓ_]Oj*xc쪔MGPŨX 0Gp.?@n`G_$G|pEIK6mڤl/'8AuF#xq,lCXןQG׬MPB#qqU^jPSN&n'. k(./$+sI½N¶lBm}$B&78yI}Ꞿ1o鞒+.s". ]{V 0_zm|Dž6-$Gc]u_zw~HjttؖMok~]`n+Q}CW-pRwpӭ6+y{]I&tLbxtv [4U-; 'gK܎icM&䷑%yթY8^۲ QdNi!~3wjܽ;>}K? ki`QRo;M xR (9U%!l3 *Sh>or '"yɵP$xril`>]In<.ےtF%Z'>CiOͪ\ .]`$'a!LYN ;ϑĩiMc{'}(B|ɿr`ns|}qV /y lKj#J&*uvѧϲ_e_~Q~6ؖjzBpԁ3{k0*5\*;ΖCA~px'8_ba[q7m?&*=זazT{}'okսرpsׁc0^M?ʝ}gČx5#)_w_͉\n'mQɉb^nEI;. ƬD/2&>y5Ccuhh[rw4)0yH곷[('*ui N-MZC&w׬&I:R>M?' ZChD {:Cz"q@2 ݫŬ| VK OkG6;c/lI%h,Y=5nZ^'G2%L>nԶq{hzL ?aJ$h Y27L]DL־/j"=St @(̮,^/C8#K6_m O}m[kb|M{~/ӯ#1}cokᥝG_=xy[vқzjUY:Mh,;;p #X2G&?F,a:il\o#ZcMKTwN;'Lɱ1^!N]10Zn@5ΆiՃ3kHՋa&?vDE 0`A{Qɑa=!1gL>byl=ī{X@k%`sͳU誤'2yiO#9+=d +n"mۦA Q[FluL^nFFgOO+P"1hF4--2ݨCc ښFU"8o}]{۶IG!L+#)u0<d2*xUUMnbM;0mvl!K:n"nb۶nZGTz FG:i~v1e(as5Nmg-ճ2,Ɏ(QFthۦ97QbMAڔOI@ ^Bw"nSπ)=1i>ʠq:1, @4=X|I+^ޛx{6Ay $^'6DǾxoxڛ];^xu|D@V׷E$綴uIBڬ˩w6>")O)9rv*q@M;m}=ۘɞ#>-}HkRۙ\uÒv&h'0EOKO]`VzCg/I4a`G&O.gNM֣ԛ^^fXb}C蔱C.~+𺇜V)ŬcX~c 9_uyRZV0,⒥]uBxI C%B:Q*u'MӜxXY\`$OϜgmZ nΩvR|_>{=ӓteT=}~\}U G+׿+~{uOKI!7\̛U>P'qkŹ+{>O\T zFYQ6l+L@ܺ+='μԟHe(㯓Bz󯶼+}=/-'B2(sLuB<59 34.gv3ۯ#y:' 4WY -2O\nX7 iM /S+z@x݇ȉ-&ʲ8cfgJĔq0+ɬv5dN]8GV X 0l*lk x=1cO.bEgotK +7 qd)X8c]~n*şE_pT;._lܸFLۑ"'P(Hn;/މҖl??ޜ:pOn G?Nqo-'322nסRb6~/Hw󽇟8i?>]eQe6nmK;"iǥ,G~`]X G332x_ȁ5"'.]AJh58n $My5y7Qooksٽ۲, 4u8<ȡJ3}$_~շ1sK}FBU +6xr?i?և2&^aLf?<(>ϗ}o+DYeKo1(XMGW~:lq s]MsIC#pK.Q9>S$p=SJP$M]o9X]tqc)7<"mT-bMsxMH)Y'5CPgdyn.mذ("//o_~(+,/ M,Dtް}ޥ+ i-M iaKiٖ:8j۽vpSJ,x2'vzbGrs6mv]'E4CUUöe[r60_pfL/&;9u\cSlhbב6!PհmIKMGW+9-U;=OK_ml(jH[ZR_u/ xdyd2EՓxG1?;^On%M'B PŲ.u]QW݆]ŵ+. 顄PBH77}>)g[dxws3t3'k CQUÖRFv TTYdS]d5UTow1%a! EU )lnPKQOKL,=-4~7Ě$l$$e5/gOɆ^_N_)4{ƿOo_ ?;)WW>so<,{{Ǘig~~L=(l7-j)~cvCSS->ZP%٧GHQ[n(!\J?>Y3SJb!'))-O[5>S !D5G 6iN*+ Y[E,[h4p8[|l=|^mmmm{Fcշr떑t~=+Y%;=BZɹSo.<^_&r"XIU2z;C%]'#i\~[WEXD]b;X!*N#\[@Pr0.b5iE[ΧDMϼD=,?>?v|Yǭ:߻~zߛꇰcv,c)M@B޽cٖt&k2X *dչvnWl[Ff,P\~$lB>)M/P0GigT#zN yO(_O'~Ԅ I[I.B@b\:Bs̖:\RmXi-ŷl`W9F ʝ*Uh,9uRd#RulՅt,) _B@X9Qx=6qRЄeYdsY27e勤?7MT*_~O'$67Tke{e>zߌm[[װmE 6t_veBUu@ f:뼕[Wt~HƪV>8g7EZ-*P'UEA#NH=2L`tomYWfL,[,m0+_H"tm#+E9g4ɡ.(»p>XTNQ?8 RL, |r*1s4ֲ]$̯8+J)Gs&]̥TS }p*wdAk)ꦺzw1?Ak LB4MC446駟d2OMQVVvBs#˸ض!n7pThiiI~#n/sv۹lTj4{QO4|y|M=UʂW>yd܃aWHB# t1W7|{l7|w%x=upzR\?4^{"e=Yêp𻣿V?6}`A7 x,7,jt:KCe a$&2Rq|9'qIIΤ} p98̝B6a*=|P,31<}4}4qFF#xƿt65˭Z 1+K??Kq_̮LL/TE?[/K:~bbd2dX,Fkk+6m2sHD:B| 5 <~ŠlTN[I 3iLr i*h3s9D&{RyR%߮ J^ل>:~":ݓSJ^yrOJJr'_}N+'g O??(p`l6mlݺ344Ė-[X 7^$yd.ss2STO*\be +'Lgqxl2۹3;Sϐ0e2u6)w29;z.P\>|b6)'os&'oY)m-"wȴ-yrmRe \'i'??qLØL)xEYYB6mD*Q{*]YN8^aN?t.;ö%Rʈ"-Rhkk',^8ؘ))LSkjj_UU 5!FoooWWW׏/Vn/TUU}> ylٲwIl۹X=˟MQ_j={:_8իWr[\z"8gMQr˚}B_8Pl!|!MBtn%B}R4U847^s}qQI(b˞G"kGMq1Ϳ[ޱjժ-Y$0W]>|w|򓟼NŋwoۿXO]ş/_~^RuK>vǂWܴ ˭w0ϥƧs[ZZܪ"|k/ZA {%o9/Iא#[|<6m.ztP [~{<2 6l׿Oz~[7ۊs+V\f#27D>(?}*m+< **98u磪*cccO>\pf> 63;#/u-/MG۫ ( dMlzf֧ ..Z>mxjz{f jjj˹K?.oii"j6lgճ*֞!;Ͼ}+Wmo{[=t%/JJJb~eʕ_wuo<Llٲ8Nx^|>>"pi65Tx NH$&[u1s[ZZ(6ۍvicl&͒NIXۊ[[[',KB^{37SKyU5oTVאN3RJr5\}3HwWq{ kjj(~tx/XmH%J˫l}O~HowqT5=:;;~tV~d2yDUՌ -Z 02i׏{0?0eYnX~}L [`Av; E*/Tjz"&B57( 6T,9M$1IeUIɌ~v!f2^~0_}RsPU&YSŒ9'Þ#}3n 8+!Ig+C}?}?ڣ>] w&ﺋL:=~~cE_|\Ȃ|.yWQsLr׾>R>7&@Szzz/'f[uŮ]Er d/u/X\L6˽߽B!ȑ#9s1 ߹sJ]wJί*/a`xt2ޮ]bWSes]M`YYdGx{8JףL^3.))-+/[\Lض{CN?(!Ʋ Aoe㹃yÇ;f2l 8vIDAT_" ]CzJ>eYYȦ: H͇n )_p {+k׮1_ ki7O_9/mZz=\w]?oͪ.!!cޏ0TOɟKR)Fb[s[>]%_Ұ_{VЯqً1.߳V֞gijqi*UƧ6oR>f6CQA@W6k߼K<#fk:sCs/8-wzoI2c ,wl(KSY^7l?e&JeŊ_kV?U0 h(Ԗ zs_;{OoM3<-h\to9}Ŋ-U?}tD![>M\]|՗O]]4_AuMپЇ]vTĭ4db8rJgFt9!grJ~.]GӖ5bIٜa蚆ۥpAJI0_vv᠎Grҹ[:!Y#N6#4yT!PUhߥz;Pg<}+') 9 m[u_Ɏixinn;/gϾ\v%-u̵Xdɜqͪ)EW=y$&d&k1Z2'6}ܺJuygRξciٸ+ RQ~oN12t#}~v38J,!vix=.B,2JB}Bnϟ-ZM*i"qsw4ɌA:gk*]<衡U/5>ut\t.[%̒׶m..8z4͇t[V)Zٶm\6arD¬;v&¹`Q]kn^ToG2v߾} N_;/UU9cb|^Ԫ匕ց aYn/W\.>Qh"e/h,31]Y>y~OCS #)ke({|h J>R<۶mAVD -ե)q)Uq=?w^FFFqf* 8c"Zj nGR/Y [PR:ӧUŅF_ HeΌySqe/A}U$ 2@,ԬlV=}Y9+4M̲l^xy/睽[w mXd^7Z][Vk+4Tƪ<eʁ^.ƥ9ܫ?*MK:Rk:U~UT3eے9VUA4e^*/FYy̶P@h*"(NWP0*Kh̨*qsD1s[·3FcMlB,떨`ww]ESSvRνQ8mi#lIΰ(/ d](`ˮ|/ވ|;A9B:^>7Cwtu]3KNGUTGvJa j|Քvl<.iTE;P˻zϫ4nt~uJWNmX](zQt$Eט`n},VU]@e`,ܺiۨ@%YZ]"[w0>x|?8 ! 5eO$4* #nʂ&AE}UՌq4BJ;;_pފ&u3O20<ڂTEXҀ#^\E39b4UQ>DS!\:ə$9¾CcI^7F$&V(nEu:9S6l ?P0M,H`X$) tKǥ6,R: ͵2U2ИqS48%c᝘34 wRYa9 l:a\۶3vpr93sShQi1Dn$Nk$"uS]@TɉNбi'%MjU9#Žʁ:CcO܎ 8%TǷds[QkCNߟup;ѝ&vzURzpIdr r VU$4wԴK7/#+-^+-<TE|ٖS%Yz .Ώ [q˹ӹ(wGv;C~q0'2RqEBᥗYŬ]H] ;=OU8Cc>HAyć{`%\R<{;uM-J#4T!80c(nqR榩ą[Uח%OGv̰) :?,*<[3H2?SEo߾N`LW% }[RA 8q5iCitU"LPem<)|3/蘆/^HCy]UkOsҝ zFh=X҂t"Bwk>Mr':: :tRsєEg`4nK} ~]Aa~QM2M_SKO;>Pյʜ|+$rm=^8R[qo5ɜj9x?DWQ '7m++緲7r~oҥP#;P[\{wПoUi2βSQ..$FԖa`ԉ_iF= C74}MgӦ++"|}o Һ9h SY3Ȑd-72_+P[4>~io7RX9`N>ecZ6pyK G !}BN#Ga3(9LKbZMť+Wʏj2 en}IJ"8M+4cfFE\|x>gk7rZ5jTE p^aa/9S /3l׾(s,o7\r%NTM:șB9i]p?h*ՖQRR؁i+ 3%[`X|ӶmqfmVf>\X?'% 0-Xue~{4tc 1~՝0՜|[kGYj "~/> k5!ܚӼ+F39M~* Ƕ%5Y*SSK.Y,<͍ i `,p P mD! .KnVw>0Dnlfd(A*E+N^=?2n[B4iZܯNh=WM|Kv!mI<"sII7iK羍/˯5$C"Ki¶lCqr,O#Xw23o/̗`08ߺ-i$evQU3W.X#޹seLv۲ KP)dNJX},qaYScYnK7g04.aWSMu(_Wȹi<|xS5u5liO3Mod*ϗsUU')upEא{^MuI#m`~MIncKp!Y7 硾 DlxLcm [J:8;T4`!v锄K?4[Jz8:+O3qi*a3C$ASUXXh~4c1T?A6YinUH`4cMES9(Ld]d 3/vGcN-jJ'vD@*2y%@(A:'U6$E }җۙS+?kYN]8#\*M.?+PQr>?f:.]$贿tlѧ4ŕX3i9V_6g@)v3tl1M9)'9ӢkT8̘ ߴ$] l=1-/&-Ț$3& *c)s Nk^ʦ[xhmIe;fm9u.0Lp"Xjcsڶ,uk}'|k r h~޾(i#]t94Ƒ~G/|Wv\0pWa,,8#cI~f޸SE; DiYD$O3<֞ ً$ QEƔdLIF2^T ~[Tv;uT!v:th\|!N}zF%PG/?<ܫ:$w>u'@HNl%I,YX6n?ȡ.'ʼ|=O,-8KeX6i"3mGzRLO/a~Mw\X}:3'I)>W ƙ5|VLWb]#<:i(; {2^2M$s6]^]aM䔓sM)R98]cEMD=o~PPW9{eۦwDgUi1?<3^6bb,r%k{=t +,{ ltǓ}!n;¢j0L.g!GIV5K\?z{lٲe-^~]},w r1^V-m¥eZ0?JC3=iY6wPWA$eYc%*|8MRq'M[қʵA^*ȨA>GRC&֖0tN_ŧ+TuTyq1n;m9FAiyQG} spSOhv:?X֘í[TF$nC\f]c96lXm? :wپB^B異,B0Xx osҥiK晞9d󌞉GWTήA46T5"j],m`K͊E>:?HA #CT9")DnJλ|ٴxSs'iT tls1*OFR~!g >{-y{>QR~͍mB—# ͗?+$*\nKΎm^~jcyÆsZYp\_ɍJ6_Ll;v7<+|4P1e%e0ӚۂxsGQ)(xuo̱#I}U{hp3`41|rc[gqs"VUtZbxGzH&8}V>L$,y}lɝOXFIE,Zdb$=~_]n|E6U8;I %,Z݇Da9_0BNSQiۍ$1ZG#/]mB(cÃoE#KNkݾ.FL#eֱ׿(G^>rNlEpIru-RU3~llo{< p8񿏴u0e#Q !<&K89 {mo{ۛӧ:>Hz,F*6̯  _FiEq;Ѻ\lxtp"PB%*WnYGKHr]3?zaUiK?{^z'fr]d됒u{5UmE¾_o&G|uVUEDs _tu@B \!,@Բϖ /4lfӾ&e,U=8ce?yEwئɯzzk/hd$vxQra&1JʚUycےmOrzc]װ,hC]'ȬnKٛȘdmsˁj6>h3QUi&2vOO.?00`a!hiY -K1rNgGwybꓔYL@Kk\kڱy'o:|}Y|p̔󇋼q{{{PhBۺ&&L''͜LJI__lԱEh^hypuh*ʆ<_;AFԂ>uSրŲeWTTl é?nݽϸu7 ---ٌJ=}D 5(=XO_w×?1P(u0x#5h>B)q#*c$]ws[oKSYy{߆|=@T4{+{844>4#sBsdop\xzhW7~Ogo/ZDKڤ|O=sG!c}ćG({{޾G_#"MϤO`EhZFS\ۏ_}ҦA^nଫFv)фA,e|mG~d"3)BHF寧x2E2S)FU,)#G۶mYKۇ\ k׮L&n\3r{N_xO>N '( <j-|z3j׶mz{{پ}{m۷o?~Ԓ\l߾n򚏯Du5c?|ERʟy~?RJ.b?ߔ.;9:Hdxkk}?g?Yt |v\z5 =|?ϯ|  7/̡;FiQW^${e`ӑrn ~Uyz~gr9(+_vKJJpi={ W}MwϩXu>;ƺ yegxr^lae^Ahx韉w͝_doe JK(ukv̯%K>aYVo~K\~͛I٢DMs4x(--%i]i!R]]MYYR7t{fO øJ?<t]'DpMɐdbDQlۦH$R>J|3i244D$O}Svm#mRN淴4Ei ']vqA-ZĝwWU<eeeSRҶ%8r^)p">]>'Z_zvtt/)))0 FFFb&g2B4ǎ:zzz477j7ZJ[(Xt:=JQ<pp8\0755w5(MӜgى+[G"/6!&&ǯX,Fkk+69;-3Mw)`s?7_r,G/RRR2fXiH)V` x;?/<.oiV}d/Yi~󭯫әu]јR)FGGinnv/~_S?_~___KYY: RVVFYYقƧz4fiS^^>S`EQ][}֭߿!lf '#[|v!hˀSBcr9lf۶m47;/߾};g-\NEw'xjN8p[ii)`@ 015n{K:t />`0Hkk+lvb6Nrϛ_VVF0O I >RRm/))qasd.v\144ĦMHRtuu1::J6GKg܍8G9_vO7o9D~~1-lqgOӞl6디$@4)L!1h`0666x<^/td2IS3cccc!pF|!Lf$8:oq|C:&JMM8V#Xsʩre|-cժU?ZdI`:]v};Bdz?{mRaeo Vd ueIwK~R.Ͻ? ݯbf>IO@bݣʜDͳ]F?7B{sI[~^}7{'Y[=VO>h~F_c@ܞ$\}Lv!|kPO{__3Ǯ },gk҆ڣg2joWO>ZcRȼ>NgnkΎ]o&|L9Iť <3[oׯ)jn-ɰaÆo~_T1O6s?)F̛U>cBn7$Ln eߖȗo<''IO\S7og$J!$RN6{Bz2/6's 4?P#@?QsÆ `Tl} qr9-_2Eh+ d=}蓖$/e/h ->턃&0Yߜ+=Xh͚5ɒu~s/2ouw :+UO>9h*/qқu7S?9/3+آ =:r"QmAMyOV4}̵ 2ͳs -8|a Y5Dְ5~>bKW!D߇@bi7nZr/|m۶ F&Hf9`Aref{{v֯_t*ߘHB0St29vO|icKA"P].l]xOC&ƘBnĆbX_^|񬆝;²TU;V?R\;IQ'e/m~텭ޱl}6vk8>}g8>=uDz;n|q-^_y]hEkt:"ƒ;p9M0 ק\(7 AAQt ЕI)G+?fϳ}.]V+V %;FdF]9"AM˕!]Xr\$#ͮ/>W~Oji$vfigTUDXZ:h$(JU`]NdNYyVEeQ"ȡL !^ȩfs?>>Fw?iS'- gg4ͮHB2Cȼ>>BĽ!#O%x*4Fׁsj}jU۹V;=v>ǽ~ToEYI}Co}Wہiw5ꐆ,K 9Pm Khjjzw{}8]3~8R˧HGb$z+V Wv 57dE#u$ TF!ulwmn fR;Y+tBH[*݌|r9glֽ b4sӗ! xyvPW<.bZ\KZmض&(OdȾ}6OnM4#u|ua⌦&0bY錼'6$.pE/!Ew_ds22RTVU> 5cns e%!ڙ_#Y)g)PUuyiZ5TĩC(=!yzY=h(SIޗ-N/t}Wh/ x":?wv)Yr_'}ITh}TYTFy/[S޶A6tϡt9B֖UAn*>cw_e|C/[=8e#p|_=|o 5|vV>@b,&`(I2v$q %ե6a29whѧPu$˥KH2 P]QEur&ϼ[&ay6mK q8`]YGS39@TY\WiK4dpiί?Vti4Mb!*eJ<.2(N`A) XR, \ VUp؃O$;FS ƴm@) ]%uc&ãHȁ?LOxu<A74">Aƴe,BMHǥ*'lN}qx){ <(B5͂ dtAtMe06㘉^:fB~ި]G}\uhAݧvY^,lHwp +ۧu~Kٙ݇]YE U\wՅ,WLyG{kPU8G;Y{FKAmP[AyYsk>QPďǥMfqeA=T( yi Fy(~yǣYɒŽ]p2Fȣԅ7cS?R Ǔ4G v {z4UPb[w`xE\x(ߴĎ5!"9,j9w%7k'yuw۴_Z{D}u9_}zd\`"ZF23 m45VQV]24zFnEjq9#$9c~+Bnٺ(}~::D֖qM֒ &L*uhV!Rҕc\[otulV\Qa Ǔp(eA?+*y\8}C|fV> K91b~9;ZPWKX8IMIvXx5:LB>kyOxq>nz= ZNcm%="voѮ*PU\xz#vyAͯdq e%A^F1??-4ׅIeMqfKmh Sr{GQdxYT0m-,![Hid)% b0pwd0JE(߭Sh/n1}ucYB05 _%3j0vF|m2zhxܸ5Tw4N,?u#akG,7 '+ս*,_rfQP Rkd۶Y$K79_k?{эpӵXTe^~,Gu z[}WصD*b^~41qGxzۑiu΁a֗Xyñ(_ey>α+=֮4Qg:wYͯ`Jk^(eisI({_ẖ |X6 @CM⹽!xfI ciM){qi*=#c?{:͕Wwwidj3|цi Xn ep6xQA͔~&?;3aP_ ]??uҶױ祔"f>T|R*%:f~/LKLؓ|Zpָ>W@PSēw|ӞlƗ7O'rIy5uKZZ/Aup08H+Jg-@D_m/|r.\r/}j'Hnd囩,Ƕ! E~D0)#[Yc^|5eagT-FeGhpS pR?!?ii\Epv;ӝ@sE giz^)gEK:?yI8ubn[q`nY, ;@Ӵy,˱m.):r^>O&`GHA@ 'aί'd$sRU "$]0 Y&76QTc!f|?o e2!uۍ` g'ْl6XOFFu>G^g *"R1?~F93ꡀ3W. >0H|YLiIsݺEͽqXTO vzu|Nwc_W|0t9 Y<. <6blY^) {nGWdDK`O;i*-1Sk*%d:Cr<`I"5/?ɪjw<-53MN]XW|=ߺǙ |jit?xR_p:y\V:uFFH;3Cu#:)KiFϸuG3pĥ J|'2'GϷ?u1?|HtM%sd:CUH[&u:>Y?#u#?G S$=m$1,oq>XY_Ids3pdO}΋\':8g&Mi`̯8ħ?j~74~Ankk۪(b'X*HlL GH34a{7f|[[V!~<> 9)9x&K[0=17&<xOoSv wzH>tivw=f_ñ˓'$`^> GTf۞.cqضA*ώgo>݃Q087?ݓM6g;/Z_^19>hFsdMIw,`ϯO0Fccc bcc3-F EvJO˭װ['%TbtVn؊2 '>.^< 34W탮W30ƑXXvtfxקg aLl?IPwR>t5MW3f0oaZ>Ot1Jd s _7lذ+|̨k?>˘=c9S)[EEaiK ߚ_ַͧzjL"6lXO'>Id5M %0, E<.˶Yd zy= nǫ*+$6XMy#/1]?* t?Qo噞y'C/lx0MۧM|U7Z0?LW+1ZI:`>}oolmekk/1C}G M6-90@۞axRx 族ƩM~y~ThX6zz 6E9:R#{P:e*mAUmW5&Y6 )ޯ&GU|t> -?rl۪÷ !xu{noC H$CVl9e3,+]ux%?rRmb'oaIuM@px(\nJc')ߴ1?8:4ѡcG{&ۣia8][I et;MQT"x+Xq974N0~lo?|۶2@?*UDj8s&.10|[pށ"7/ ;")s Tcw g/B |*pfMjˌu\>&:h|ƺނ1jӠήR5Ԙ(9݇3=)MãcV]@e͇ŝ %*);_B:mvO>#͙̇j3' >~ԥ[o>,nr" jv@p3Ӡ~7s7:Ԉ~džiPŽggםYGjy mJrCJVgp$4|in}޻f^?NwW!TQxTΒ&_K#pp+<ؿN߾nĹ5K~BBkt4 ^ߟ B ͋hl^4suW1^Fg|rŋYx^حk=/dRa"")z :oWcޭ(tٗIB^[nM5o@ GtT֮qCn{< ~+> kXf#Gpg Tj,AMЯǹg3 4Tôs||Yd+[P-c&h5y RZrHĆQҪT4&^k|UKز*ij崵d2tzrJ1e&쏎yڜy{ cszA*-I|Gy1Fmz._jlB`xA"m$n&3/ۏ<7]Bw'N8hLߞet* .mmmٳ֬?N^|u/?)+_H/,\#g~|CL#R\J@FDOէg0Ap WP͌x(Eik^}>=c}q+ !AOSE֖]<? gT8wv,2ضn߾ڪwx; 4 W5YmKCuK5#ݸݟrH6{{ =Px]9!|Wհްr΃)"~*[_ʠa<1[_M7(~]ߘf8s (̍o6oSzϞE͕͜)ȼ"O8?vN?S쓦ب$H<hKyM|[H>{!7 ?2-@e,Mt[!g#csg.Y>*#3~K'#%TvV>}Wxn4^AiBe5|so!wDC&Qee93<ט|7mE¯}/Yq-3Kq1cB~i-ׇWyi|b 3[F}Jk9?s\vg}7 >7ZS)aif=M/Dt(B~H=(F᥷2͜0߯zG;::֗p4MFGGbdYEEQxD^%=y!~/K"ecqu__1M>o}]]Q^^ŋYr%Wfլ\EQZZZS444vqdǟu&AO)5}NjgI?6{$go^+?s D~8ځn+--% _0h 22C9t^x!g}6`V,CCCD"|>+˹N&mEBLvJ2PX 7$b?[KpvM>v? @Jhm38wfS1\#cĦ"X:|-N{,SRRBocР{0w =MCǃ%NL&' XC'@u]7%<ױd>???şn9x0854[53N٩rGە/H)?(Jmۭ@/Pb0R{C?|ߜ~K))))qʜo7+67wxH)T;v8dILيz{̛z6~{nH)l3ƈBq׮yMnN<ҦNj§g!OetXK^\]e )&S'Lٷf$7۪oT^ةbRyhmc(.~3vQ۶IXoXNOOO񏳼o F`N6)e R>#8'?K⬷?Q[Un)H3$Htޏ3p6ioR(_wNRi?=>jJ)='߯eiӽ`>B(_GSi,\=QTBɗf2-{\7/K |s՛|/7.SS|0䟰cK)-UOB\oLH޹rW?q&jV{]_΍w۪cl|?]w|g'MSXEc) g;[w|g EUm?pSԂ0.r !?d\>Dord_ع-6?'[Yt}#2d﮼?ӒzK>:@p{5.^\kgh1ۃ2~N ?j{2h;_<'o''/>\m'<ۍFuTU-8F&Ķml&͒N@`n{JUOq^Gi~O?uahkk{))ӊ(bK) |?C| Eaw\r(lP] Ҷ1Rif&w3O8vm2 EQR<3^lVjkkR[/7Yp?'n:?͞/?KYSD"X'?55,x=V7|EX: E I`&3_{sg˗RhjjbxxT*5 (I#t 14 NOOOgRSP y Oo]㊕Afz!3RtNū{@#=X,O5.]bf\idvDIoy _-M}|\'O2{ V>~ xiD5>/#=N!9|=[ }t8fR=TdLr0y@_-V>f}\iDV6촜kF:@=jO&W嫺_\ZZJii)d2Xi(hA_+$نa4g !rN_U^F.gd}!D}N?]/---Uo?.ןYJE-e {vAƕڷ+)c|ZSOX {oy`]\uW|}=ÔLEo*;W[Qw4?3D ouED +c⎩}^.Mv['|}dxb+ҲHg⛭_j)Q|mu?ٖh#HS8$-l(!mXՇO]?۟z:]7VUWS؈2m%3$6>Жg?ICl<}()]Sw.^WuPsK>t͇?>ҶBL㣨7+)mM[H̨Oڒtn~G^]eK epX-9-}mm>~WHطAQݾëy䪫Z+ʾGJBZww%:oZf;otq:˟K9H}nzU+,}3l߯T 5V>]p ݷPIkTOcR 'Oy`]u7הqElܳ9Eŕƌ.p4U&x!u%3X]$2%LF€gwebۊeY MiIYuW]@KS/D嬮-#H1Kp{a#Y.[(*Y]eU]LNG) ؙ S^QR4T !9GOF# K”4P۰R,T \Ol^}lVnxԔxY\-ƚϣy*Igs2[Ch: ϭ!&Gsa~ueԗXl9dY,iF(*;2ص9%Ѹ)m7]5H,ƥZD|^LO2e 7T ќ+f~s㪴eMW|o&5"A4Id&w/+\Ugo04n-#5UW?tWI[3/_Gㆴeg/j cJT|?LUHeeć9ӖD8mI 4Ig M'alO+Htv-M~qŘB$¶O6C(*IreO;g^ ReZ GځfA$gQ|޽ϖ!Y wǾKs_sd.+~Gz( {\P=+qUu}o~7}~N_XvEm2K*s;hl`ɢZ(Ѯn7?|9';{kvEUPRSc0k mI]E#Iz{w?z]_Cs63]vu!P79SPoWorFMH#+;+m0pV&%=|T}XM4k.;ϼ4onLeTas[ò&ҫyᄏ^^bxrV U[?Ml|e7lKHh{qU\o5k]Ed,kR Q Q=ߵg撈{X\B_}:Eu?# {]Gy\˃ iJgid/ $l(q &icQ~yF׏OOċ[3qMʼ|!bp>o9{ٺдzvӥY:/_7V8GPz{ ; @e[ӄ۶8V} gksTU5"n)6/ߒ׭WGI:GƦc0@EO,)gi# m4*r>4U7²}NT(ιVඬeKZ7O8~@T:{0L!t]Cc?Fg7bgԖ 2c6#8s?xQK{}عv:2bKD~_q@_CQ{{35xƖ<T4GRA[C݅irrҕT|?|ZIb ~yi[\vLk6A]W֬Y^ql~lz G 7vQ|NsY@WJ6l?LO4:J^%nܫ(UAgL/K@$O_7T8@4JE qd0<7947(?=X=_/. k^uL+Ҽy6M?ooG_phrԮڢyǪ6T:<9q =={X׿szX2}9ן=)Q:➗>{Fk jK*]4K;&c⎃E`˜_ܸ 'Kk*h,Lw&\:-T6nj2BPp6ǙҮsu?VͲZ/RzYT40l9<9Mh@"!5u$wG^ڈm-rZ21 b}s`ض--7_t*t8 etvK+FVJAP0m,Kko;2cBԔRRqY˶Gj3 %l'CWp'i !U| 3<>R B`X6m* g6סC3vS"$qt3-IB {x[,yYZŲ,vDwe <?+yN^| ૟]MOK#e|?~ '>*[kr:S_SFeS[D}JZJ=zaNs==˒tr̟R*Ho7 =.x{~{7u9Ϭِ}VK_fӈ\g~%9Q:a2x9~L㴙H cDni }ьr<vtX9w RvL)W@[Ԡf-?dvb:]ن N*n4vs#L Gԧ'ޙJsb&Xi0բԴv%_@?j|Д6WiXTjڻi o]&4M?d_HbST Զw59aͨ|yw˹%r'P%#M_>9s?ܩ yvhEƫcM%/.&Ѝ8V[0 ;:?;əgeIIq`g"}0w6w&ſGbGROS=v\v+!OQ:u޶lg}]š)& 10Wuޛ4be?}vH5@Sᴢ i.3&Xvv'd$?)vӊhDK)T&N fM.Kr% 9}Z 09m2䮴 /~9p4q]OY<BH),P|f~,Rg$/H_VUSʁgjq<翻OpɂB_3 pdU+8g~esG" 'L{)G/W,M ?b}_HeGV_O =d8L6٨fٷr:ݻ7z̙W{-N @/ȇ;n̓GYXiFj,n6 _n G'm, p:~|fPg4Vv6tR0a5z>$^pT3amUѴٷvL}ۻ7z$}[cOL%->hνI )ofмbٻwotbii/^%ǝ7Ox[D/@SĠ7%o?EԦNB+G`"O{?m3'qɭm޿lYRN}oY"W^x&^M;C=rkcO?rQdi@|:>uTu宎O?v񵱑NS7`8S\D IwxiY>*̉L oz}C@?jRg:̻S ~I+ yk :m8m|PQ˳w߽d<ɋD"g%FTÑ( xRo`-Ba#$>:7`*mdZT'[90ٰ}?yٞA|-o kIOf݃72?e!cUX7BS --.V_@TTB{vuhIUL &o3l8unik)7G>१^uOk2д `˾Rvjy!7xJ^|q{ {33 hL6k {٬tupAR[-6o=G*3OH ĚPR7l@|fG~}{ѸhN{n 9jgwk&ELi9xφGص6K/S9gwV& "4-B =zsm`- X.8k>?W.CN3oY4{4vh{]5`9i^ʗ^[{7..iSo[T5rةo磵:/GzlbK/wX4t`Ya~ZvB*V||7wZVF7փʹDvR_Ut\:4K{(>kQް0^û6ӿ)r4Er#wghvlcqZ0/0MYn$ DY$<~s ]x^?_Y 86>aʴE<&|G]*䖙:b&FpxcYe rX>5?(ϐ5/q2SF >kλs/LE=.nL3 kx1w^d>7 ͡df/w\VCofeC"bbPs 93fB,v{pUi\Pٍ"cqZfri# AFW03!bAjV¤4rKXek?dGxbNZR%%bq^AvTh~][mk%I.7i^矫jIEOF8On톤irSnVi1|qI3Ӝ w-WƋkQ# S~,~CSRԥe%UwYuVoXKis*!%/󭊐nMyOkX'dc4γ$?jw^3'#QTǐ3{Y3>7~ޜ [kDb ]vZh6&>}쌫/;Ӑ̨kgZLԴXq;bOIqn8?6j瘇_ dѣ:lG4C;x/c%X8L,& #͢go(X̘MD#Qp;ۤ:x/yw:ZI?`E:Ѩ/h#m>x/[[r/b-tI0&AfigoxתaCA0K)nKK L !7gV%eG"p).j,h^}g‡rSΰ ܏#}{za^y M*mj{-|c(mF˖yCYiKH (m9BkM=vz[xʹvJ,XR: ׽>׻EnuQpȫ'cSį B=ϻAs߿xև(~/QtFM}|@ 1 B0M0n#u%)@i뵨/}IwKHoPwf;)x{)Ԍk#oloH^^H {>k1Ls(O ~mvRޠJx tu{;i0~V-oߗ7{h V{Ø!Y%km߾IPz5/MQ \/^?jJ#j #aBaow o|$ںh!Euy(6 ]ks1 A Ѻ&Vکmfx὏ n0 ;:;,wOQ5V%5EAVP07sqV}˳Wu}?_b+jzF)B;Gls3Gw6phZVw?OVPpzos?xB~;dkv$*Webfc*/*3Zg7Z|eǏ\O([ǍO4~6ۛ1R4s.['w]YĦp:Mu:GNg׬N*X !unsy}ǎ@4Q|lۺg6>b2=<_^WlIn?=V@L?-u'25pHs?>4-񤟰C.GT6;:mwpt_i}g[[yGIQ権 QE\Ν;b4/Z7rnQkRB,aoqi~qF)R«^ҭ$;wǵyi1'(OKK^ټe9պx 'z\ͺ˭*9!1>{|soh*LsN fMlj2Z(}q͔7s4HH (C.͝ ?.~ņq55-G?o~\MSB#/F/&uG ie09; 3;X;MI.[dHBgDE]'zꞱZ(viwW3Ɠ3dlh<3_,ۿ[PP0?8GU8b+ʼnKF^:oE/[ρRZFaF)"t2fTvW8*`S q@})gs(T \ g]HS OoU'o]?t%(rWݗmşͥӑü:UE' cr&b\[2W[m ҴiEIIIއ \NIi),հڅaPŁ+&]8bt DoaOTw:t2\͵+"mnz&NA7|pn_I:dD} JljHEywU ݲx_{74)vӕB{g¨)c?==R&m5m10?sxd s/OKO{6|SԞP­WEu7r_|mӟ;vA,d͒},ҟOnrxKk0eONTr|odP2g=sN_o &}Xl&iK[zFyzޝtO> =8pגdKgs(d5#Lj:-a~{w5)b6pAP~6egj [b&V-'I;&q~kD^JWCt?xi < \*9V_O@U40h {\v,X~n>~C+?i@UDjhrP{SƵm*,H)T)OhSZ H&N?wC]{`'tm%~&aA$-w$A0L}.397j%. z⽒6l@8fwEXTހ fPZ C^wb,ot~DpVjaƞMW#C5W;@(ʉbV\5J'F[_7SieɎvۆ{z#ѡH?aF5d 4K3'RlŸ=uFt \Gأv>y·Ǘ m?4,IYQJ%XlEZFW+fMD-)ؽ!֤QG9Y<\x'JS;GƠTx̴rtd䄪Hj_0s Thtٓ4?e iokN`# RXbh'3" wi*!.pKJ5 to#Ah*ζ.FVyY)L}^$]GG!v ?*5R毡w<~зOзΓ'_t]w|>4M]zI(Dp8L4EQS?Bٽb^ 94\7~WL_v6!EW4f_;}ىo}hd>?]QB+IͥŬ.{]g>3Σɖѻ7 5_ %G忳;*.KgA%#Ԯ՛pa8/(2Mf: oQN9vnx C~~wuwu8?gemwJA=`)epyH.J=^"a1o`Z)Lr ڏ?糹9q='P^;w $~\˓T9)|;םp юqM [k?g'&WN*V>)WoWnDyy9^vnϐMEcN|S\.3 Ʒ6$&%.+v%8^HqayY]M0͇]uT (KNGBleƫDKXkk+u_ zd~4APR:{e,_SR3_$ÎO4}SvN A>)lR/,&.@ S|IoOOOOtҥR !}w<dSG'GH!7YJ&HFqFxI O4٤('/$> .`( t@1wmJ)))ǢJbh04A CTU AR%b&hZ|SWW 5KS LJIdĻ&7o¯rbĻ8!8)"y_3ig،2EQ>Md X~4`?(_1UUZImBXz'4骮%ŏF-$B1]> 5?rĒ_J .IUD7k䫪L ?(&L'CRg&HēSSSomq:S[IюvI[lѤ'['%59}kOK3c*w_nOo'$3R.=ؤ))) /9^&@jz (F+##|igf궰l~jfq-͌hcO>ӎOLIB32labr<|BgSd+ɷ;H)gh9'l\^CW#:ZZK9215QNgC]dQoiC1iR?Uڨ|<^>!jO񏏯g<OJ$c9@w\`S~c~+ #xYÉFDfp*+_/&/a7^{P6G&{SyI;W~bCPPz&~T>"_~'LOדq?~}lN 3ߓ+XtQ Z,糨<2>g_\?'nҥ!JtRF?45ao{zjF |Y :/FtۨܗƮG{neDj 5ZlfUuc򏬞sHE7g5tPQG#p桽o3/0&>4GlDUisdg=GS1&I=_˷H4ʻKemfzpQiQP$H@ >^ˣF0"5@uvk<\N;_0[GN DP@EWO~8kBLEFI(Bŝ'=E"4XB[>1?Gyr| MS(+r2cD Q+zԊ?`a&za1sL}4!'r(|Y% j1&DѰ׫aMIT7AbZGK4U Yݤf11MA8itlj 7*`!UY5W|yY" 90K7򑒤2~%CRnrӏ)B BC5[X'7M0Mdkb5DPB p޹!g✹EZ -ņO,j-Z`4mIRGM3cEg ~)VV`Dz~*&i!#dȊ [! ?5PVxt\SiU]pجmcq}TΝn-Vڭt:hH)vj ٮ5,G>`Ѥ.5-V MצX例jVUa2RG??:ͅNo.>7kRO0`啍Y>B+lHj4/_]p7f 3[ ΙM'ŷ Z mT'Og:LfqǴsS RLZUu M{1LIQtGlJ~ʨH=aM3gK9vַ=)R~ 3j'hՏ59x\.[ߑWy{O_Yiz޷S-~VC/`ה1e\ 'ECQ`OS7 lዘҷCMxd]vjں{!ַħ|xW`T>YԮL*)UQ"XT2/ ~x)X;+L6"][jm8CgoA/ღ?X*r_n=5f\ٶfT ۻaݞWZ9{jQYŷwcZIOs K(-AA߰)c֬܇ &xn b=?B@ ٰ7AGԪnT@4/^ 2o]PAFV:5-=!X) ?FOo\thBsoiJ )G"EdXM|B#%AJWT)_JYC6R}=0T!Cbƻ;[H ]6*Lִ̋W8;̡&ITkR04#ML)/dJ*u)Ei+H AS҃@?H 9^EB$?HP$8+JȪ'SJ{_n`uٰ8kPdGhoP~*Rd nH$:nws2W;{jJ"CYWғ1" p->_1uW6 ˕HI$'ɠuCekʈtp7l&A.+5|MSF.S=0=q}ڂ:y)5 8,*v(CG+!.܎0%płbI_);"kdګoPyrb~ vX:m* &Κǝ|r˖b\ U?gvjOKB&_-F~5=]HoyK\ e=kpZ)?I.iMOY Rg)wXhAzz*6kx,fًf\~f_>;r0n=% N#FZwN0٬ e\|~wVvgH]'Ū &x:`KFG['ҝ3.~mU*ʙഐ:p٬J*[aר҉ş}-maf#1AC A8֦Oϸ۞_@$0? =GT7IK' Q6.~Yn{j 7,Pqs. e?DBr\4ոi0F"n2.Uw۬ڨ2DmD|3rK{4/ CLȈRom?J(@s-zSܗ/֎|SΩ&܈*++#Ϝ/s Σ0~6eVX BfL 9L̋ʭM%?_Y 86>?^vix5L,Γ;j?T9AS.o NɁ F "'7&Ƹ4 ?VSvqcgȁDbAP)Z26Rq0~fRnMl<ou{-6'Aw._~OQ-nӿt,]ܰf}Vn܉w_gLBBsV+mlؼF_*Jol-*[6s;@ u?=)}mRU l ׀ FMv5K9>HW#i뢥LJ Eck蟟4HFb\"[V& /Oa.;vK"qAJ!%.iM,$׍Z*۳8oٗHs9}|Uuko %ߔw=m9up_#k;ho]rcGZ؍^F7$s˲ع;sfMdW]Q` Y˞ ;bIgӒaLǔ +{QMuO)>z|4Gys_2fgM( |KxrBivݎ![Kq>1y~Eiif͘^Q,z 30,6L  躳!i>L`dق<^*B 9GD)^y-7`Up'/pƘ[ay5}\7*S^ I]ުHܳfTmDu9|?˯;z0%nc:6 fJf7/ ;Pk`Cj H CBaqs[x`kl$S򳰥1%L3n^yŒTUr,ۃ :R7 ɼ?j[i>qܹogL-n/?U܆߾?S4H0oݣW i夦L@3U޵ߙB¼%>7*>B̊&sA!k&LFK":$ٽ=Q]`TXZ:/VCYvƐwln$?9nT@*!\a.A|z~_)%"i~3 `׽b1,_7J.qW3 )_@7_⏘4"!C,&h /l8n#N1s!4 !0ˈbUVPN'k|1E#&Mt@{(ͭm(‚;-4‚)%17--m\|E?'|n5Y_eǸ[<&|G7,/.[lybQQz _ܵjB|r ؋.X58c\s;| gkoU4ny+XpzU~oo7xٜG,t1$id 'fz= ־x #̜TH$KN _/0ͱ_b[IC&zmii_C!Kuw6VKWv[v7v[ݠ>cJ~:Qz11YS|L}|RT m⃃5/ 5-~lKXdlirS+@"$~Ң_q+.cWgK]km#M@g-=6_|):f~`o/B='c1;^GzfKݸ; =chAs_~'^ Lz}S)ڍ],R,(7䭍P`]tўX,ի{@~wpSᜂ|j=P0Y%C m\|G$䶩5Fvd3W(eX:LwV ѨDzm&6f3H'FIIn8i9Sr?Wr'Mgv)Wώbc|jM]8岨8<^uε+ȥs K#%Fy rś|~م~,;kW Wj+7ol{ "rJ$2w}[䞖Ek Zg|l[܉ayz)ZsA>ݞ<_rD Z|/rMwLm](;{)9gocW^|l} WƗ>߄7W~KE?ͷN_9go Ūr+s}ϊ4?̺4qu.[=tEՊ.6^yg#**ǿvEas l⎿^Q]ԗ4EWOkb|_y0qye-?(G"Kv5œ1 ޫ@wEAR:{\60*q /,7"TTڅҷg?`諿!Đ>>tH2i>.>K7i])"ӤWQY, L#W Q t [Xz<|nʖ&m}|" zoA $_UE}֔sbݭlOK ?ءf :n~}r5?CXiaJ60u >#g3OxZWGx4? f{(cVgEi?_cʼ+t]nsu;{cwtoHSgCff=@.] Y=~oO?#GGGAZ 4P =]&3 UIGC0> qs$Db aBѯ6&?ÃPzN2$?z&cDO_ee'-?]_CG-8>TCM8M ƾD.}r=bfF*)E(_@9/GW#sS3r9cP']b!7_NaOfQGxsΰz BQGӧE\OBu#$DEb_0- Fȗ7g;BbOӢ qX͓2b]"T ZF?5?H5?du5?x: JºVgL6tЉ&0R3M& ]gWr|h|u?_EG[Y\?^ɥz9\nC40*.HH) E;a,G N=Fbh k!DdZHahr)& LD Gv311Si 0E{F?M31U 6> 0/æ:ԟ(y$2v__ō+ԵSRn*Ty"48,(bi > DDbbuQ4C/=aZ5b&Ut/ 7F4GR#&Պ(K 㷓EY u'߫fS2"ҔEC:qF1 DؘEs] _i_0 ˮJgB?͋"ƐHnou!~zȑR6+ @Urďo΁7>Va=A")ݨ.bPf]xٶGbÎC 1u~}vM4sM0Y8݅aXji.ͥo:.j:&HiZ'ύžvLSܥ:O'_w\5k_BC׉FG7ϐ6ktɒ%=;L0M6) 9u@x_UBplO6uՅiWShAx⏷I YATYxZug̘kQn~RkTɘwtL(pnsw{ߟ~*WZ7.ة\UƷ ץ y鍸VUs?bRυgդrߤ wWia O}AbW?̓5y{krb,d(MaiqvBAQEOD1OBS[[^)bƻŹӿyK-ݍq}R'\"j5,'mv55?3S3)w zw7u6,A>},e|U_$fjhϺ, LI˅ l%}ԧ`:ggLԵ:uKo}))~\SXkhusႩ<;иo^gRHҧa'Q ,tsF[+VnNN &dZ4ٙl\cRɜ<‰1n¶ìuI6lt+h$Y,XAW!~Ͽ7Y)9`]%# JBxBJrHN6;4gcz|Im9qO w*nٰhzcΘ1"fl4&#!&wP$ljٳg_M4YH>k8ߞ^Kqd2fP7cO>KΘ}DHүOyeq}>}P͗[ifᾥe12OdN ST (/s"1w^d3kwFτO$8}!@2]f]W]8k,ӧv8kt8>B[!cJ}QIO8:ݙ꬟;cƘ~lUo؞Vmq\ y>} Y}\3'% ֤堀 }gGH<@Gjr3֧lUU )/m_#cj#N_ 8ת( K)uovw 0HIMŕfOW4tÿVU+HIWjC%Gb/-T;/6eʔT /$N`$P1WάWUb#ߐVL@y<"dsSRU_2DY)S*R cᕊQKrπGգo9L+?O?sfyòS$q}̣D#x#n4gΜ=z}0L l?cM*q}xȄqӔFgH%r }BHɺYr #I/0/U]W^X8"`MSb(c~K' a&B/Fc'5FϷѨkЯOgOn~x M1͑Bi킯AaA[ {aN( t0Y+zƣ/M`Oe >.ƞ}A*; E<}CڣfnHL Z{r#)#%./%BS'd|"}mS fmR Jg0S GAT0ǯtK>5> ;z~X*XiQјWýV~X MG * -]Wxo.XM+Զ H6e$>~_])RR0too/L$%5T7N'V Mi#qOg5(-c}pfYlT&~#)= -G !vu#و|P~W(PpŇ5)(ppCQCr`Zq|!c{#q/ΘL ]޸ma#d81k̙7ؽ{7.4$]$EE0_]j{zJj4Too/B@JJ HREFKEQX,cV?>mӑF4Q;jy"bC.s7mh"G?!3+*VVoxFG$xbƿnv3Ol}n\O>άp`} pb_QQWTaI%5{'P{p/5T_͔uׯЇl.UVVFVsv$Kp;'!9]>xǣ0, XElF`}/HNL˵Qe>b\VQa{OR;S&P]_AX4p{\.vǢdǸni+Sj!'R\;-`0;V‘Hzyؾe Hl,3R~J&+J `tâ:La1斷1RQ3%?Ocךw8̞CMz슙L_|ah4HK/o)6'8Hhc1Cj3YĹ^9n{zzx|q#H|b5n!fl`E\s #Y>!oT Νb59u,6b"M5aHP;@Xx]Sbl6+ݮYLLSiCƮ^U7" tCʉ ÙCJ<~|}l ÙtS9`!eutA|5ʢٽlؑ6Ģ) @*d'C̮|+sk+j8 >ZclZJLD{ək3OVM͈l̞˖ì:FU:6a+r/:gB<^h*X[>lw|JffI۪G~ nVԞzÝdX23{0Rfk|4k ,-ձݜf _~_l޺LnJh!ڀ/Hq~[VY8{Xl1v-`B: 7aSJq; e7*F^TZ;w#0xp`,p[T_aa\JP<,i|c3"eK؝c͠wWׇ9PYfefQ%?-¬L6n^IΡO8l׌ɒLi3Y4\~ IUGt+UX]x@Eana02=-U9/ :>v@B08}f%篥6=#P_l1N3e{Fno 0'1kR6VK_Z&cH@}P=*\@iYZoc%m sl?Xc>:{ _܄e:3}lXr孯.p!4AKmPXw~y޳գ6T<Ծ~R|ӅԷt ƂSx_78/oY3{.͇lqK):#D_6mӯ߾XÞ{l/M p4;U|asҍ_VmzP`R U뎑8"C5{Xw}oL6lׅ!Y< 8w%+Sʨ:r!i"[Q[dT\ ȝA !rirl@0vz%+K熷\z7ܒX| WK HHs9^݁ {[Juvؘ\#Iڼ^,L˱ڰYB W~}#ꟗҝr~6v5 hom”wrP*~2Q&.ۃi覾`c^Pl"L)ϘY!ˋ#ϳݼ%ʄ#Qգ+z~LZW6GجnVWK {iW\v&OXFXO-BCf;mm5T6u+&kqrfOfQF#?S!R4TV7ƕ3W&l 0IE&ccߺkTdVKoυ3*MV728,6MEfݪ<~23;eNƅSpRm^g;O<;94?uҔ*sDDp%[^A'gM.uojiI-*Sl*EH.?v4[2?>DbTŔrHR-^0ngYd:! ]TwJpQ--@JUW-*-'U}&g("'iQ 6xZҪ*UB&7ؤlTpx_1ͶmV)ALR͈7>D ?D 7R&ddL71Fx_E @`.(o!i#ߣ󳩮<&d?.X?>B@F\vDΘ7bFJ Ҹ`~ iLƌ|;ʙE +NN!_.&0IqrZa.͚̼E#ߣŊ9 2R4aŊ&6Nd O+*c|yZ)"i ݺd/>jSsowz19O9xi*\{TǏM)ƭ˓ׯnoj&XT:x.J<{D[45v/ R"![[WOWs2ۀ^t˪`@p@IOȅW9ֶ{V=D+իö@jZ0L/$Bqh߾h*3Ofzz~xCzA~ |l?{n8~vM[l񥕻9Xa*{=!a[ Iqaތ!K\兹n\θU5vֆ#DC.y{c%G;Źn3҇XOhE .[ܭjb>'2LLD7YuOmW*{LLȱ/Y<)/|B-MkC 6+tX-ey,WQ3^/Wq흿a۾!-{p흿ۿ~Eg?~B/)H3~iM8`I9gNZj1Z~qX<4_%96$W?(fJIo|T?_I]{.mG?_ɋNq ˁA53XRbjcK4$+vޑo#ͮr~EJNzf>l!;s3)?}͝]~-ug92@opOh| eg u&!o*uC[d[22!$ Je7fI?l_CضL٫T1/L*ngQeG%G:U[FeU3[mR#eML*$khj9ǡo'z "2oUl[_٫ -^#Sm]ZA]Sw zpV/@/@]GO⽊,nQA|æ%z9`G/Fb!Nm||3ҮGU4LSwFuD !r2A}-ajXKK)ny7=r˃}fT˰/ˏ2W 9ICW/ڿ3&B~7 +4Ŭ 'ZW/Ӽ*:U<4i^Y;N^*eբVO,_0sΘʬ)%CSYrΘE,??ꣶliaN`6=K8’aЀu=F>B?ì\ ( bO*e*E ;|Ԧ|NEa׍|3s LtѲaSG~q*_yxՄH)M颳?씊H;zy뽏xwvP(OqGw_NoUjX@8Ǵh꧗ܸ{&[Bl D"M|[m7)~?fM#(EMϚa* !˅_뺿|SJDi>qܹo0Kׯ|o7͗ѢܠG;-҂ b=U=8:>̟R(rP1t4M"ҴCTuD}{9(l dˡndW]3@ou]]XlM .];d8#򏬼W]Jvۤ>bKe}cW?e.o=ܾ^!c{Qî]4MfKS ?b> <%a蚉c쁗'38[ G"B蓆"K rtEwMJ_KobXS^),Y\WP&]ut |hK/ץ:RMz[mny!/_+V/!>WWGKXzR鋎ʫ%B^Zr$%MT7Xxu  ; Vf0c:fLG 9pQؐ9  6n(+nx[` K_SJ;;|=AtD@ __iVz:@nq} +BimcsmK{'45ќzX`9˕]9޵vqk?WT(4Hۼzٟ#t(*7җ˿4qN\?㲯g|p|CUW(# 1)C*㽊p/8Ǡ@ՅX`0?" Aߚn/NנQT1 QB8noÆ>A$rLBpT'ձqPUnwQƮ+c&aڷ45k VmP/ bLbuPHԋߐؼ0J:&`AH/Hїupv8Bqv3zBwԧէ4p߻ͽQo4+\vϨ l;ę/x\N= nvo_Bawh6m*MSqk'|3=EkZ/85Aw1g/^<4-Y%tO?t󶄳+wwv,NOF 3s wvv,]ROX &qQr/%= dT:/뒛*G'?K?RW ϻӷW^?⪊wDʺ,X1s7:pf-\L+[9cKZguk@PĬp_4Leoj3>Gq*ޑ& 9;˝?pV!yCQO^Z 4pǝ߹{~GjJc%cK~JO/?}}ckC9&7\%7wǛ;ym<6NZt$ۘ/<~>m(/lm-<;#ok¿1u;z>VoǺ>61Kȇ|RPgx #wnu;|Afz\h80c&G_94M;Xi['3域M ǧC~i.g*bz3MisLb@}hK$,bϑ6ip]t]7vuT}85${9*A6 NvS!X=\]5oZin릲zZaf@ػw ~ į%\Ѧ!%M }qL0vDNpwi') \9E'_X61/,/OdܹM8:cG[3kN]xfJgjxz?m/ﯿ)?5r<}#%ģi!lh-mirFX){o̿WϽfk\0{b?~iQR~W[LwFGY3!'_Ӧ4ڢiI=8ۧ>~9R_NRQ1pA65G6o=i }ӹ3oKZFvӛI =v> x2c>Z,9c:]}=̴,:=%44x>u3v(OW3 "?(-l14CՍG~i~DCc;")I| s/M{!00iCN 2_ʹ"$'+=)iCTOT4M$ٴ3 4t~xqL7ٴ1>Ѽ JXA^g2AHאl{L{a>cAE1rpEbdbyMoZ|G>7|ϝNCV#1b8Jr LR7:^w#GDtR06 wD'tPtO0?:eRPT,\'_`)(JJV /Z>MS-,Jȍ@|5QpK+ ع\Y3Kŧ|s#djsҁ_2oG0'z4e]3/tuXF-)}nəœ9-<0%E^.Ԍo(Y ]3fp3_grQ$ieˢv B&)N;2{jkZeK>4~y ?Mw4&e2(3|%H;˗,,ys{[ʲe;_S 񠩄.c/h0[-ye @<j//>T7+s+̍%>VB1~߼}߲/ѳ-RJogy[vQe_P֏;9s_I0IcۖCG!ci rs ->nG"J -~\C{шQowO/ٺJ"JC~,+0͡:jo%#ePmzo%} _Ǿiyi3eM''7o$A)K.i~Jj&ğ͓+{L_LFaIL x"9%'_6y eS? I1dANnsENG T]3T. 6iQ g6( fbbz!-uyMAkuſS 3&s4( 0HfyX~q~|D-Alc ;gWVC3yF)'vή )"9[m$!Tx"aG=ſ3p1 B R'ױG^{-|_;>#g e(O6=nWPgoemw>bL}pצKZ!%tKaԬ:txbN̘MwX|! Z;BJ9I &1:TMe+@p0t,$3n !D(k[ٯ?T!ꆆa(eȭ(ʰ~6lچz??4spEZәŃ˵EYIM4Dǭu,xj>%#"&P4y͑X|N'[~7'|%KrRK>i_ UAv ߾k졏_(Ieo4>'ʪW׍8;.B)D_6Фʆ npf*ʇz(%埲SvN)jw}7bKUO!0wՕު&稜%@ $!&'g^wk{ʼn &2d $%Qhr]U&{ hnst=7{N21pRfͦ[vmdin~ȶ9Sڕ^)Q̧ĺg7qGpvBޕu%&Baw8sI"k^?Owv"% Ə)2RG1_[H{8<%-'ȷnj #N}F{EL/%"vIUfn }wkSp +v]ޕuo_=`t/9$ɮ.XW in>wJe73f[2> Hiܳwê/@j‘޼O4 с%Mu\|M|9Oϼ='UǸH޳Ky )W{ww"4Xsi/5[EEBl0n}r){m7F#c(́9H7H8" cVBNGn|y,eNw{wΥnJ F.= {;nsqzww<|Tn_7?ow3gkw >!'?o D]?NOusp~,x ~4MzA==zq=4͆PU ~Xʜ/XC&[?$$׆P|& &+>p80g k|:͏ cmSm#gεoRǪ9Ckc;^i~#V|vbD~ݪ xr!@JI2$  Eww@D2}"+|){p+Q[sZŞ#1KÓ+|=>iSM?Ʃft|aƜ ;m1W6a8|d10,IG{)O&^T5J șbl* 88Mo3; 6PL'n'b@'G8^f/6#L4 1l^ )Бfdo fo+I@s{2P3 Q4 =IHk5іZÃ#wf>)hv dc7IvQ)rK˱;ϟͫ{Xʾ1Z  yM9.g!|dY?4_*աkaS}뫅41*@ qQzvBo5  ;.Tr.HQD;r|xzvTKj$iMiR1ox _9ơm_ee'Hml2ZW D|XE*N:&߫T~W0)Ǫ@U|2!]H*hJHq4ݎsKή|&WSm-t{~#ͷ'o8ۚf9xIU/=FG{76uccY&{bm&L9K!b8Ĝ0~?ɗ1F8`Xoun7>q]?_Řtvz\z~Ͼ>\z4>neS[s1/Id^sf \߸_Z4FLЬla:m !MB)>+G~v7/BSsӦ𱁂h#],(+{VΈ??4z uΊfL)f5Y+ߓK?%zƟ،8"Ch(a9^SeS͈|̞? _'l<̮v>:G[-lLvV]=Nܜ$ܝI-wڽ {>Wy;5x(ɑ]g_㉟m?`vc&U[7g;=Vԕnzcqx':PzLqtBzŃ槴ks4C{#+ r8MbVWOnJ?:{ Ҝ"Zdͪ)Ff,_(e4AZO)Ɏ Go>zEg_7̱vL)=4uW^nќ).ԍuhL~C@q2_*À/DJs2|O LĘӞ!x#mc>00&t118H DctNKvк1>!0#T{€/aHz㦵0d Jf9^UFl{6DW-a% ?M$I .E#E')LBrݬLXR7h|pÓoN (:q<@O&ѓIn<֭\HׅiK$ BQv_l#E*s*0ˎiaO B8G;_{mY8%E>vMv\ ڤ!& "I(ۏ>HdVJOP$6UKH7vChmdb1eY>=NT(M @"#nr$A&v0 [s|Y/%< s`X{pZ1xm<ח_)%sD n)!mߏqq;T8peYE2j|NXpK7tF(fԓMr`$]a 1f i:[ 3&oj4RIe^ְvۘVA,bqFfL>mXqOJHuΌ .5uje nfͰ{̟Q0hG)z{c3B,a9:E~rHs)za^^i6}7<_QǀykV,d͊}Q?To7[sag(eRKzpMџŔoo`B<̛^}pك7?̘ 6߹lje % ,ҿH(p,>=?}~׸Yl@>b^A3Hud6Uca|E*?eˈ|);sG%+i f9<δ.^ڒC:,K+.XG?pmfVV@ww ˵loWY)$7s|MadpFO?ܓ_␻\RQYbS6ߥQw:k:H&bў]$KdY"e=lh4 H3g_kl Gz66 G"Ks3)>YP5.nMrdz30/%e==+4~ZPHDv1<'wP^`HLjwiY̞Y¿妋βܫ1a2Kf24+>[7,٭ ^ϙo4S68Y^|k'{eSKirV%>6n~mD0EW/3z7곻h5MڼMοȑG~|_T^nh Dz)VvJ`,z/|דQd(M0/|zX~sP~"%Lq{ObCaO&/oͿާjǓDb?zH"i)! 5n㯿jh,No8uGˏmTƍ}7bq.?ϊxhc>H2Sxhc>=֗l݊.J|Mko:?Rn@?:PJ(ON[gO\SyKV^)˜[=P_A$?9X_AOZcW=t)ߞ̟f9H,{UMQ{UMYM%nfP_dѤɮ7!#FudgJy`^O&JBOLZ$A\2NEB@:eCà,ײ+L˲8!D(8kYv2z?mm0sJ@m`)&̷5F^nN)ַv"|^߽65&c}2=hսg1P9 Fg5ӥ҇?aiV*xx[wrĝ63n>@._v=?n$TBx}mkx~2(i7|+-)L`YԷYO>?+*?!!?6s+BȔ7@zU{p{|uj(ߐ}?~'.^0Vb|S)[zփ.=>R1'n4RAf%˦ c_;4XymcgOl6A4oVybK \؆M|]鑋 KO?,~Xͻ.p0[᥷1M׮aϷ]kŇ#)7"aΩX=]xk^n5oZڶ)%[ zO{Һ>{MXpzk*c9Ҋӡ`}M=9 HΜW(,wwgR߹xiȕKC_ݑ`k M0`xP]w1@rF EE.7X<=V¿f"E + XGGZ;4 7u9ډXXlސ"҉?r?pKX 9w5蒚.WZE#YekϴZ(;aB}TOXyS-54'K0b .+ 4܇4/o&k17W^2pbuD!uBk1#Μ_~J϶1uz qXW-7j<\0٦_0a~/W<ӊ(/W j/LU#SZEYLASIDAT"o'̿0_^o#gcŔaЖ /V!SR@GüG=}?c+hP8tjE1LIC2@?C`9v|9m@uYA)L//d)7grrc*19S-%mYJb >(?fN/xM5m1 (~VT8GNd'Y~c19gޟ1(Hu/lٱ-;e _AkÑ&T7d!9afL[ey\6pl ӗ/A;ݡreS}mmOQ\>o&?өr"뾸l00"#}b?q1IAi 륷"]OֆG94+""6?X?iW~sD'4'# "%~|n]u2fcr H~ڨzc8M#74~quCWB{EniEnsD-ÌT/;XiP D/ :7 ߰fin/~ݞF9Mc|=sb_@lmq8|`w}Q$/87aPb@k.>|ړdw`w >8ՠzgxtx+~9M=pp6/MoyC P}QriGskM@kMmF%5?> }/mtKkG6Vz%}'|f|{ѭvm5]I{t'ly|쒕w'|?~57^ZYSıf;k^Knx6:>/]`Smg$ 0cdMi}cu4{n/oKShn y|>qx]|n5^ZFӭ3Nt& $Rݡ3;N[Z!%Go4F|m{Fseu*D\FNo[fe9_ E;R}t5]@w~qwr|;B~ezͭ[t7_p?@eE.bmAۂDQ_>N_<-qAW0AWo-:N?so}gL#Ca2ִ@ѼvyKK*$%RuL[/BԻolZ^_[WHOC#uU75ϴ{4 #o޼'q<-vIZ3Nی7`tm"x2iڵ=Q<u˸Ճ#b*̩L7ď8twZ{ZNIϓfI۽ynӓGۊ]gU *OߓyY͙W]R2).jD[@ ctjӟevZ4oXQ@c.uk쭉̞. YldZe %E:2wf[s;z98YKEQΐJ0cckoTiA{Bq:N 4$1RD oܤ#4 'c#9,2䇳ڶ: ? E"V q9q9B \c4HEH1x&vN.>pЅIayKߣ8.W}iͮP m')E>IfS,{')v[m_.I gK~0)>t|M7}X'^. y(y!DOLĽ.˺x yOqomz9 ^fӶ@i[\V#Yms8e_<眳M=Ms}QgX'Aԙ$my[~I_6`C5B@F̓Ο1!5\h|l{x]K"|aX (.n(X,}7qCY !ҭbc--y~_A~kGǞ<0s>~a}M?1 Fxa_r0,Ә۞s/ ?tݰfnNqXzyL}mOq퇆}xLZ,3uû߱qͱ=^],,ZO};p-ɸ%.a9粷S'?gSf Y'bJ*Y>{ZW!=gt~<o H֝t-ݹY;i>|9xȷu_-N$|[Hc#_d퍣o#_vY!\16jz”o1wvcDڐ4Wٹy\쳟MX|=sJu~4hл|B dd~w+3+gRF(撿 YZ<w1Z94(WyW+.-N%Y/ l~{7҄sZ9d%yŖ\[?>w*E02}o e `CJ^]>owy&/r?0"M|J{wn'ܿ0p#2qN_t_~w*={7 I{ R8BL ck|!5)hNl?](RB,.GSN_DړW$g||Z|Ř$G"Hۿ*Szv qk>ݷ5ե9;P1ώ|nޜJ\ "H},/;?3r df2~vAS+*%3/K+(4T3oBú3#\x0+Vuɫ|--y Ywޙ\̡W"z@yλ!g-ʥ3:_ ׮;Ͷ@M~&vMa|M|66adF0+䷦zη_Lsb rCFqGG|Iۍ*Gîǣ dM=sD{2ˆXw rm ~|$b:b?#3!'PCTzXآI!yxx #Lr̼pR>^SBY.  0)~CƦ^),dvr|ˡ~せϾT(\%E}DlR@HR pW80m: q/Kҿ/Oi9k9U|_vN)~{J<ᥓ YϘѡ*&d +1CJq?LI !+]Vji9-崜rZN#~\ˑJ S#S_TCAB8%|C% SuJ@M9yʵLC^P E jJ݆ Q*Mqsɲ"L"4ePniKO>SLY$  K(G͔@35uu'ˮtڶC"!Nwt ]hf~9s'ek7ްgPȇx=܅ w\tŏHtwC"XTQkSq4ߔ³usNҲno8gh$H哣gD,p% 9alwE]c18|5^5*~||>^mO:>o<] Ĩ|COozzߘȏQBB\蟾OMf<5}4闷N>SN͐p- |=)>'w.u8l'v}_ȺdTN{:H|u8pWmjLZII YsLn?m;ÆtOSsՏ=xڔ>%p)&g{\_BmhH PVZʗ5c/|hLU5^ gv"~eETMu(EcxHiٻv:!d0'NUg'([r\IŗN%q9(!5[EEB/kir;sa]&VqJ7o&F!RօXgϞqxz{^ af[G?~<{#6"ia!V]7#popo: f^==;wm# ,xe<_x!xb!BIfV]]ܱ.qEȉ #6~`_aR״֨ 478ǟ  юi D"kKVUUj޼yF?ާ|rص rrsq:҂1H$q#Mox#o +}ٽ\=K<܉|O<*:o\Sm~ +DzOT\xGG]"//EwWM`d2~tTRZ R EűImT---޿nؐC|{7Ü/=F[[ۈt"09*qS-U@b(4b|}(#4ba;n% 5#80* VOJwD[7*)8o ~o[w LjSQ3˙Zrm<94}dY7˴\GʵcۧjC幙7g*S. U{O'B/ibF)Ώ!<^QY̿~clzn?yi̟bPIA&&ܝ*0-HSwfN`gHM @ @`$%n%.1ucR]7f*6B$RJf-+`%vz!TqDcRdq5_xV' fGUbqXBEJpMNݠW &3_Ț ED"1L)x.6{?WǕa꘦:R(†ē!:{M?{J^ n4L 6]Squr6$aHt5U`S6U5^PG WOUUlMSQ>89={'v pŚv;>6 F775eqǧf '> mp#x :ΘǕ~HFތ@ rj,OIui<8]6O{sz dZcE1lql4ԧdvm,(/(ZҝWVH0#8xXmhpgM 1+Oۿǎ;&22f4 7tbTsנb v4t<ߐ2cǮ[HxZt#4_ ¡XE[>*F" @(>iE(2Y[ :{>^HȨD֣ɾ_H1R0n7i;ZX i1jQȮv*]7?3)ۺD pEnW&K&5Q q^ߞE{&m^]gܷsӛkJd$Q o2z5G0TOr6MaFy6mLCu]"/ۥU<vu,ʡ8bT)#0\N7wM!DqyvF5grQ:Tm5K{)0?_/Z9쳰4~> ɗ𣓚$[S`'BA:XLjL#1&x6fg34sز=[k>p 3LͱϟaG}nLƶwmL/ʣ"/ eP왕mDc#NT!:[4:)̉kV ᠡՁ@+?f:40ǟ݄8\āzKH$!4ŋo}pfxiBttb{ljD-,'io wɱp i*5)7jZR۝!wޛwRS-l1thjڔvo쮣=iH$׏ҥ J2aٕf1J{MiYw\K/s&ݡRG Eu7vYן=6w7X﹋-65&u!9nl}䜝#'*ѻro8iVh vM5w(O|xW(v/jIShT6kh꠭ [̈yc+r\,&hjMi70",wlF}LW,-krUA8aқg 0+AWUdx>'i RÜQKi?10'u]OZ\ WnS6rx,ZP f}`N'e~EB@ߤM`_v$uRm9_w;B^l֌C(+#SQ圽S|v$X6ymòOe=;jzܖ8D&,(t>>fqޜ={ Ü/@m[DSJ[jvDR |:77]/17oR􌇕o)k/k.᝝Ə4%vEu!uKݴuZR&'<uwm]aV/`͢ :lZy>)8W;} 6vAkO5 ֬(Bj&cv55HjM ^j;RhױT@gRhj;{5ҩL7$}?owEU[|1m[] pƮ]!kmsW9ǚfEs2W-wrJRB1,`Ai߽tLS3?rj=~өG^ϼ k9S¶HM2RSņJi̋o]ilcPemˬ=Gxڔv[wױ}XV'kw:Uǘ4帔̙}{t[lI]Ez.ƞFAVd*LcjrA韚oU9e˽ -jciv^=KF[:t8=^$[[R_g~k[Z`ͼ\J:NRhbΞ?H)C;9z~ڗ*`Ͼ:^޴3Ҧ=P ngE+#SZ';7R{Um&/Y>Y}<>=ehw'8| ݍ1fkh kWAMswM9`7mp["|p+[h?D&9+PLl _sl߿E3AO\^J]k?㭟*vOk {0,jBSpS 0Fq6,鹳9|ÇZhz\ e"ouy!T\>D}+qa*rz(u*rv߳o<=_BY,V2%p9,j海>̘;eK΋GUUdZ#%>}ˋj&k–1nEB_"*PnܩTk|V)k|`~ʸ `yˏWvD@U׻Uz8>L5Ԅ/9jʔܭ@pL&[xZUlWpy-V. Da[52&?mEOmU3ʲ.,,YHE^}lD]έXi&̱L]&[YϏ"ʭqxs7gzb*J 08BvhGA>=-{<3ϰ1%`Ȳ=Ba.FtGcWfTX^ߠ<v ib,fM>Bp/&޷hvoxr~sQV8|Bй3{3955׭-y3wX7˃a=}233'Y/+gU7_Q zKd==>Ĥyn@4,>Po փG\~DŽ݀Z{+*>pWNxpʊp~xoWT2!c6N0~̸*_`({#:atjb x/7w#,~@[Ozm`"xkDnWGFdŌvtZ٪AUD`5_d̜eo^ rɹ*Aok;HXt6fU,/=k͜O~gLʯ"zW~3qa Cd T3gYߌ/6DoL7*d'BwwĪXIQ77{Ԙ_l_ @[eZFuak5mYbsve轣qkr)*V]];YiQa6~#ڊ  Z~]%'ò''Å.sW 2n˝i5Aҳ7ZO[Ct2rMSp[wnd}a50@O'O UkI~;h6Z"C5;2w~ h{i@y|3q0{}'jW{@g aG_mcZea&x`o4}r>c0r[) 0ƩNRݝd˰ r|U*5ttFTML>_sfqe۾1˶O((ߓ7/'5Aωe&Ɨ33deD>lm R 7T-/d mxs7AK1,UdfE<.K}Āv->%zo?dwS.s~pp2Pu5;[Ϣ6mM$60}Zka#%h׷|vG⋾ep sH n r-@piD}$Oc[suc7-Սq3a}}iI̺$$unJ>ƶOFf&M]yj{o;8SA0Sg[m'*‧^OZLRI:ӧ . I]>5Jk 9ۭE膁L-\Trτ7?y7~_408cu'Sr>y~/ib&yCwݽ ~ f3>~lw/f]!?< _ɯ4: uݸ aա11C0aCwp[mɰy-׊xȺ70!7}qsUÄҊjOyJb?u-7\{ a9e񧭛0Ƈ~d}s|R ?E] ])Y 9oak`&7^'jUWJ!Vb E޿y_lx+\rs@e*KhŽ_8;gxwf"5,gkR<)-2^s %Ɂ/P@*f|Wx,/5p-HroL+9Wlmak%,;cs2gz5)Mc\!x$P4t#d<g ɞC4&cTw$"eNʲ3M31kmƇ 5 Ӥu K @+}ے|3=_[8ܟpF!T9չ*F yw?:y%Sk Wu˱pfdB0fysXVut4eg^p-nq㉉y^Wx?֞{/nNo;in}n~I4LrcMSO}f2i}2}#M&ͯK[T,H&Mۉ4t !Ϩ苓ǽ[L)}nn ˆiH] {4X{'Ϳ蚱 S.ۮb޿y_i@ 'tMS4x2iį1̅/QUu3uF֎,~pjDG)lޙ9ss2Ms9?lx->|سP{'N>ؾ?s:2F+Ep#ik C[p"8ۧl` J0lge ϑ/ؓ  Eu!,YB)$^hզp ~Ijkky /D^^ޘ|a\9}EV?o6.16>FױsYtW UQxŞ9&$l{4;[·qۤ쓛o٧5}PZ1 _3 j`{ 67;} 2e W^ugXiѷζ76rßpm۶NCCgwoseW"c̓)$;x}Y9 qM' g)//{>^w݀ ]uGk|,^KpmȟLaaaZRdE\e.D`i _~푥 BRu|\+?eGQQۦTͫ⟮++O:ϼ}=st~sx曷7ovќݟ/\ ,P444pB|L>q_gz>2Qأ/OW_<ʇnοG;?=|N:_"߽QWvI4>O3ɬ4>1Ҭs3fiXwQɬʱFYm +{Ǽbeh0_+;֐7a{rc#π>90gAS:#:G=v=ҥWyLU'`})$Xuy\xvb>%)I&QU0O#'S<7>Vj<v%^_nGHK_ !)2,Ц_la /]fV==H)RF; M^S&LQ17|{k=5SFF]]׿t_{H.O>3Cݏ{mh@Wdeg3 \{>ciڍdtK({ԲSCofX;Z4E>i&_x_h$lƺQg}UuL{Ǐt۶Q>FpunhG I'F9u?:NK)~s9⋬YO~lݺu 5O~,$Pe(gɓO>ɢEyWp M<> ]ʑTU<ߔa?‘mbh=_q<~NL89~4gtƓ;~|9~dnY~̓Ρ|OfV!^D1bX]?23uۅ]Xv;u="mX{kSWɛ=7޸;G'ozpM(q4M&®! 9. ;O?+W/q_?dE>ZZ4 _6Ar]ؤ1& ] %Dz9W3-uN>_D!y崌GtZh!ׅh0HdhgήãƐ%%3MU}]$t*yvMCøURwTS\=ӿ6wq_?BSm~+v=FHq hE-oĿ}w^#f WO|'ˮE!'!s_om*Kf9e6lwqV Fk>ZWW8g}#^k8*`hc+]MHB`g[\ɔ =R)/ha/epc5;CYTfWQQO?cӎۀHav?vo)Yy /s=}\9MefۧePU@]aBݝ *`ޔ ߈?H9աR)6yXOw型U›iwJZ/!V\@ ]a w_7C﹫ + d|R|龫覯oPjH&&v]ş0>B_nj}|O ?g ŘM,;g KC a{#G}/^p͡3SXb SY'UOqJY*!p͊ҋ%~VՍK^Hu፭ u(@ _0x4 M>9'[<7χ>1|FmB NU?ypziSeQTLn: ;! W;1ui8RR'R">K5oVbކ=GG6㘹iT]#HBnIk4qL[xJû{S>4[qJ=lCYg{JA:K7b i簫DmO2ɖalBc0)4}=^L-7cۡZF4''55#KV)YđEUt(;U(Ykfznջ9cwXtE6vƹkX6uEhJѝZ35Oye碑1MhjhJ>|ړ/uƹ$}T$߷ֲ'1&T.j;^yh,XFVBq)b,s5R>x[߰>,ltk.`tEZF@w Qɪwذ۟^qWOsͦƒl13h"in>@HAH>pyhsaH jgAo?h O?u>COlk -v9ːCʼl~³-Z9A3KV,.~T)˴SakôHjO~3La4'*29"?>Ac[] v*a "<}z, ~ !B{QZpt j )-X&Os|:CȽ eP=~jcb㿭MFKlvp?:i|)I)ϲ Doi;3'oRyi0}Օqr/M ^:nGuᤉVM4$BªiVP1c"D8OʈƭgN+1?=,8#90!nJĴ 1GrpA>8?he Gb0m2HW?iCǝNM>?sj6)0wP;Q{ĭZ H-s]QLzc򥎚 !dŰV}X;=C`h>M/Fo+z=Ќ h?QE 4Ǥz۵mpKɃ;a>[޵raSm.HN>H_ٮ ٧\^ZZjhhzVaK)(C:|GMO l6`ϩG[7R՗9l"d#ҴOr,YH)(zǚii@ӞEl^9>2!BO&b$:f?NU겫8GuR7Q46׆YZbWs0Ά(HPug4hbj"%caE+5?az22{ #j+?V+ h iDM~2lO}K)ɱOjV,ON6aa`8:զR IO&TB`S6vMESUz1d_ OwݵaԚ [ͮWid{AH~ l%#أ-BSp8C7JLoPk+Iŏ7ﱜo( ,;[Ix0 %oݵ݃#TE`ه؇`&i|SORq(_(W_-u'#/i\7y7}ji8!-%F =O=O_ھ岥g;-86Ϫa,aFbo1;vef`IL}te>(7=zt P/ain`޴&˧l~`ӻ:]ve)!)B"O qIf*K Xl.&s3|dsPd0(HMF8L Y)BQ44A"Ʀqr֣|BN0T:H!9?>6M<r=:օa؏ær ]#IԇD-OCcWNB0jwfhj)gpjm \6Ao$i &DI-1AjSU\H AA#-6r2q4HCه'{b84/8`t>= 1L O>6:D7&"jKI! D_x1!T8H$&b\|b7B8zaAOa4vRqjC:3m^"|# G0F<[d:$N<*G>~" \M(@'PH=fD93sh./rxTݶAf|)pV2%u䎳˦8僛J2tڨcG70LP$ ,/KWN<7;y%`~E@\gXOTc_.iͬ T?@D[=.~'3ڡnru $ AO';3aAs`^ WsI)IFSylBGJvF"SIqAapT WƩojwK4Ht;jsnTB M* R*vl .¦ =EHiHFh܍)M@$)4s(0%ne4%E~|)%$up$[1 9}< 9 )sx0l ^)2ۆ1A95N҄P୚5Ivj u)) gϬ݆aGJ(7ee~6n'zrɬa|;ؗ}?sMk:P~{&Zlϐe31 D0߯FsgVww޼y!jy|~=\ώ}GP.|Ix*>~*2%ztK7v?i8>+}0"XOm]+Gj8(CSe2LK[7pE4 {鹄CQ;^zϸC 3Dc[%GR]ŒEB'{W knzkof4xAs ɂehOQc P84`O:7 77=P`oݷf:Cڃaf[ntuh 08UQ7iJ^}WO/,, wuu|Hk C{cE8SE݇QK!6eff ㇇)+<,f Q#T/a:5Wv杯p}YزƎmUl~#VN2JpZ.=:Cws=Ghhvl.f$@_/m8<`|Os$xZo>FO=?uewnjps;=-TvV=^?]m^Z>@酏${ix~hhDTh9oTe xHp>g~G w_=N0{"|y}c")z$즡njã Gb]I^?"n?=npc]>ؑ#G:Z[7tx1z Ch;v¿}h30j~:j{mO)oDt1Un!܎Y"q~:fGqU#E#ןwF.͵CSu~uX̟QƏz?}92/Hע|t[_ʿ=cm|k;'PYϧn# g"d41^{-CnUh qbӆqso0%+ffIz,9"ث4E*KRϜCgO/`bi _~Z> Ucf+OEA~~V JaJA@U5|CmwjrV,j)YD (vÃdHGٮ+YvԱwyH$ףas{2PT uCn9_a=t_A,uxq|(JŬ衆bs4YTd T=(E/%O4A3r0{i HϦ˅4 [`qh 4* 2P]~MESV{ɤ5X4ZSevF,HSG^"J'#=/?H0CÙQ3)GT#"j6M%R6,L?XޤT_zH$=)HgG[KәUc=G1Ӛb/4| uuMOD+(o |>@^, 90w1UU!{ƙ,Irut;DOk"ўh+~ /Sl rdjU}+V)s=o)NM_|[JW{Dlh^ :SiUMLCgfRcFެSK`FjqvMSEqFeI>3*{Æ.Br@()!OR?&M(Ϥh4)GP ?7MB7PfBVYDQĈ|EalJ0ĖiBRr7U |` 2N*|n'&I穩~kQ٘lLE=\ZH)`Ō^V̰jA`6!kQ 3ow6}x6.<(\p.8{AE M(,_0 DXKb4E*寺㞚=,|P4/OE̞Q>i&K{y uNC(fF55MOy5Y%]yMS.XZ>^K=g:\LɅ)V }g"Q$FIYd4/? [9;dRio!0M*dx)Ȱ2X~6銛?*d^~{u3Yy.9(/<[SA**+X;R c ۫,5{)&"h,UzqJ\4픗L{k/,SJX41 |~΂:ٕ%̙맵biiJ((#;((‘gZfk45Ty<ٕRS>qQ4J&kv_\ZNqY%"$cg߱VsᚎcEy/d r[&#h}ٜ ":?ZMۖswPu7 HgߒRE>6 AS䯼eルx˫+gPqAohWP _v #[fsqZmp_qc&k9ћ?tvm9e,\wmZ{tug3D qGo&}ˉYYM܊ٷƴx;-{gM) % mؾ@;\6[.}Շ칿:>aj,.GSߔig̟ˍkkk/^p_#j.VL7Du`+q1L-{0/B1 ѵhF;Yf+0q"P]n\$L` j%D}"fh4F<WS5f\wՎFE0wle_@\R2nm[͆"8r j͝RH:уwzMqijhr/Up~*mFyf{ dɎ G B0'jF5i7{( |6ZwC]FR$DTEn>lcU6 _PdLm[3HD@厏 xB`Ԕ8RU{72oo/]ap… )wLFVAAݠ[6uwM{ RTAͱ2kAiB5ǃx9@&-[DĴF??~|0nNK;flae..4Zs(EB 'qῑ5j-ND%?*m c]]@>$mIQsW . u}ɣYpMT/tT w= *>oYTA%u[Km K-w?(// dFsC(҇!B 9X,] nQPP0l0>476@AbtݎYX̖G̠/ 45hGAD٣0[,] =j4ކh!ͳsX(VQU=[cZAJW[ÚJtբYwfЬf>7Cg$OW]׃A^&P 5iT~͆^tz 9kc;? Ab6NdٖRfpazᯝ?_ALfƆJjZ>_Lߪ.nN?zV^1P iMj 9g\y7hXD>Px-VʫBs; rx!K~W4A)#x%bIRB0{G"tkVUG~zz.?#a"-0;u+KN~]dG~ۣGw#NP+PՄSѪ_!퇘jxy9O>4V=B@@KٔrhRѵIf&.ͪ",N nSs׵ժW!wMfZhlif";:&& @WmG{ O-&<~l P|KՌtcw~kOUkպCT:=~P}c6ix<^]3M))"jNətuE24KS~9tOtu,fQ-%os#VOI! ;:w:desAV$&wLPmo ~iJQ&(0sXL) 00_4ޥ*M$_"wz~zMm%N2ax~|nn!JF z6o RrΈnWhѝ1MǠwCc F璕%m<g^L|wW4^߃hjpd';2y i17hq(oI3;k:k1w~ )!3%g5 .s RjǏ?*_~_bI,%=k9bSPPތį<őDZהǞ~ !}YC=rM3?z% {;*~_kǜ w,m:w=f6^`z7k*èxf&n»O_o>jx>ISnަLkSJ0%VFݽD~)nb~=-"a# !uYCvAXC9GvUmzZo4@{&j禜0E}T笪o˯ _{`tZO:͚vخsss"M~iB"RhGķQA0|#u~îOw=Cdtϐ>|WcԜo%9#lkL־;^]Cn}B?qPeu9WIףeW@k\u ww 4k"G `MB΄[ Xwf;^M*a 5f~?kkOv`b= axl]> sל~1_=Tmp Դ&f%YCg/]sM~iܵl-%K|x e'Ͽ7#-@_6Lޛoz7cw\v2E>1_ |Aw^~;*R{A\,@Gc/}6Kq;kmi7Ƥ?<~t!?H*>ԽJ<[:t+&M=!?WϑR'a<[zEK+l26s)ѳ'ϛR2ŒP8߷{|o\JqϚW8v%g819@v-Xj93d%'"q#FNˏqAW_s$4oO8iBJ Z?lky6%:>RKӽIݛ0UZ>l5ܦYZM7"Gn#/Lv{'-;{S6t{iN_zՈoo-joK3&/w ?λBJ`'O!1~[a]=EzcժZ1>{9wϫY<̴! jmI +s|)ঋ/I|ﶎnR=eK`}e6-pޞTxG k!5^_57:ۓ O_{t%\q/Y֑r{a@[C%= @'44{]rBO_Kz[\ K|If[j:{Z.?lG]H.P @tm9׆LO|fͼAjƣ׬xÃn]7-ृkFS/T?>0 CӴc [0WE?қ*++SjkkO?6=a;柲SvN);e씝ذ-v빋 AP EUD^_3 Fl'N,6ȑR*ܹ?QHC,ڃB'[sO,HRWY}JrsH)]( GTLŐkux:O?aEQVJ)/"tʑZ!Z?gϞ_)b%e)J Bk]'[&8m6e}Z!ZG| 3aZIha!Z%K6}D]IM^SB 6}-2SJ IX,nٲeX xNw* !IvB>khz8?aYQn|Z pG_fSz;4_v..#l}Nؕ;R.~idL0qT6@R> NX f TBV1R6‚k{BiRQRnw8p|Ur"E"kA O> Vw)Y! drxOOL BJE@rf'B_J.| y;I~!l߽{D/\)0㓒{߰vDҙ~ϺFOQAOD#ee#[_x'I%h?&N!!&[w?d3' `ȅw!-?!# O4- /enٱ#&?/d(.nmLy'MUFF_]-STT4I1,_B rѣGc>re WH}H{_!  ~jժiNBCEپso_|P~Q۲+ ;>KgN^C͜vf)),\!#9|X[.XZ \~}%*MXm׮R"6pj_zukGsΌɫe|`L&aXv<[\צN :5(wH(@$RwgN&Rn$Rr"L5.+BDǗ$a.Y2cRȍ/IR;Wal|$ x$??j>mRJP@J- `ڤIR>=T e򾩓&O|$"NHy߂1{:y!>KgL%RfĮOq~/e|)}E1o]v֪h W^-?}ʔU1$_O<9j6H"jYSVŐ|>gf6 jm/m;n;%C6uĹ&_wL8qP 8(`!+R]|(N>]"j>BXÈ )V]*׬OA ^Ohoʏ!buMXgΊ$c3 ";mqR0q06#"O>KfO'>)'>EEERaD}Yb#e|1?9}A2JuE WfN4u@o b ~a fO~`0"_QRϷ[S"2%2?}Ӝ(R' pbDaYaɘhF,#àl-;}|;I#]+!"܅3JO#G;hjfHID~4ec>Y$3vsx$2PQ 9ÈȇEz,f<|dJ, q3zOS%/n[WsM`A1$lҸ[OnKßQE/BJB )I / EDp(`ri:'0 F9>"mcna >Q`Bn$+|s)AT/ u+C\'1N֤I-hdi-;W V2!Nb6q7|e/?zBG=!w6S״?>0$D]|2fC(09FI MK20~TiIԵuHEωC!>b=؂saf>1?>2JqD]dN0[:V3_-d#Ϙ\ߺa߾b)M!2_ ηYHN(l ЕW@0S׷؈OK349^g Ԙm%a/9-$g~j 2cztf*.~x؜)m9GSðHlM瓭|=!c1.ll.\n.wh+݊n#1ڷ?w>EM},| H!=d|e H G>ťg5i=IX""LqPBJBxvѨ$lV[ O>"Ȍn!>8Ռ$RKD|_@{;'\AB\jt✣h$hb30 Uf|uDo&0VdX^+I1sއ }p~J3SM5 F`=~#QbfQGX'L)p&^Z ~h\*jlK0shV|})5 e|I;m},دvQITBcn}&R@sCUMa '0(EeRX'fZ)L1өm%5^Mϰ`5 VxDGHBtӒp4tFRNjq> wjGԤ@܁*[:z~cr3nymӎl3'35n2>ۺ\unr3u\gL.m?slnNrݏI8eKsk)o =x_<%~m^R$"qx<+mWQQu9sD}!>Dw'R 9ؽׇݚJVi]F[ic2`~ Ϥ5|d:Y8#4>t3-ʲ qȵ z:d'X4&`hD2,NlYҎ?!עןUѝzrbOautŏdpi\4}asEvg1UHaeny7VEړ24ݤE9s0m_=yST4Gxn3=V;~4U87TɛEbd֝f.9+?*(N5SV-\VJfvRn nB7~TEPDqZm|)E@~]g1;;U㜡%B@:c HweaZeX6lfˮPXjR](JD:9E1qx=;v6;vQV~V՞52KDFE};{/[HE}QK~#PhzNysxP#t>N~BF?iì4wlj +VJ+o-FxJjZ0*~Μ\]ܒcX0n3YdnϙS?1/#Ǫ$`jydx']/nLBKj ؗe`|v+/~bm^^E)e}e`ģO6.}%g$ ?ObMSؼ  ۏZYdH$I+T! }.64Uhm+j?PKzZ{VaN,:{v/yAT늟ʼdC՗f9/-Ư+.8SHxETQOc~S7 ,_nբ1> ),f%"W-`jO7$"f% fI+´d鰚|!d=@+snC@ҐȮosRy6!ZBt]{Y? ~GܰlB|z3ky]n\ iz1Ñ]xw,;grڥ5>tҫz? } 8c̜=?{*oB2olQ"Cj !"GnToD?YrU{n@$~7~[oJ GU@tSY }]a/ix@6)DZ[B·zP"VЊ 4nk\dvش'u v[믩5T6n̛;_{YX, v?Eҧ5. a c:l`GHA/`Me|dsؼ%NL=M~# }axnrS=:DU+U)I@ɿ|N3K&?W?6KӢ̾%r+VU2R򣉟xbGZWi! ?Q)"X^iďIS:ĝ7?zD{wUMѩqol_ggξn1?G?fU4'#a\H8RagTz)&{^8r}m}$uayഇڊ4$da{0h%vm8(B`wz^ZCw!7#\uӇx&wȪ}mdą y&t!n6ψQCg(…4w"@ 'JlV3]G忔]ΛgF?4󉗶["zUdwpf4|>e77~ _$D @Ye(-&Ӝ^U /q"TVH%/j Z uجfr2Bw7^[2RsۺnE̗R@0iI'8WS x;VKev;.}ZCcR5MK X"F>*ఄ~vO6W(fmpuM"zCcꨊKK+HM >EQ߄'O [x&6oդ W8j;{E1)oBt#P6λOQ믨jMo~굨~k+"ބG6Ɩ/}E~/}ET|!C-p{zǫsCAʳSe{s83Z`~!Š?MA='t/ZztV=>`/_7|x] ;n};zu <?>_]} R-"Wͺ.u|ѯ0N2Ԃn Q @0H@j@ZQ7vdY?j^eH~XFm ?նifZ_oM{&8)Fk$ǥ~߀Vfև )#EC~epv'"@7`J>  (1h 0(0V±BDGQF0C˓iH)DZ1sv,~̗R ?R#??XtYA4~)D|Ebˮ.bW{.|^Q6rtw52p{z' $lIk0kp{{H0F=!4W FzIdtAg G+!Jɶ!| m+,tCi-*i)akgv.AA]kz%0&Y^wIQCeoAʕtA>XAY,j%?E zR,&,?F4"Msyz^/6&;ﰲwRFf~Gni(PN?NwWovyz;T)# QJAWh@j**0LxA67w(z%d*Qą[f)YD\.v`TZK6W$1.~9I\|f(mʻo›) "pX\&e)v},_^E+38qŽ C{Rynu/Ma^]ڐKsM! wL&+wwP赙H G)!r2u޿Hr;^J=e1yo,Ks+ % dsIk?mM{Eg':hL:ICr@r,U0A$aհ| Ev)7{/V/)ɉ,]*//WXᴅ>Ve#PRp;U?+mG6,~>NH7tcdiy\'yx/Iv[sx~΢,] X+&=L: ~pQ.6'Xھ:d+eTfEvsJ-mս9I!j^|e/{+H\K (,hHE]3#|\9(T7tRbRA2qV$vʛ–Gn PL 6!c6wO?~Mk;umL$kܴagE(hW%o7u|fҔӐ S&/,%g*v&i  WD]!ʥgO?)pFPiONƻ!# \:Ņ4U \02#e+#%+Բpw^zl% a4ηۙ_܀[w:𠘑o273jw9*@> w ;?QHߌR ]/ެh|ֿmiXxOfʥIw% |L|MESd2!6&p aDhS:Ancd#nڶtp쵇]?:ig. #'7KB{'BOUyLܺll\[<*F b9܂aAJ.[_ pɳ[BRˈ fqu(krho)kRFM)U Ev_0>oo̡lǙԕM!gQ82O>j2wR8e#Τz$\ҧxILZ?;7"}Ν5yaMz!2,E$݃9c iZ.*̖b2%$2%I:Y9B .+GBW.T/T־ĵ w;\@-m?Ytuz(O57yCsT߳Xߍtc|u}fB\ލG;'yo??>K?b9Tg xXVlm$g_QU5Gj+US?(.\ &0XZ'q.,7_ƉT! 458 7H֢v|z6K >?KAG;NC1g<;CQ>2~5qA^e}MyFOrd.oOOy {?|ٳ K'ķu01y}]0朌 Ϻ;I.8绀a>!(tԔW㴇mpΚx{Fe>#pSfnwyLyO zjLϜޏ対3jo]?a9:cføvw?>i7 ݷXg/pNe&_tT݃~tXWq>s_ Ϭ)Ƣl짿*nL R jhOq:Dp#֪״}o~q#/%,x!^+hÿ/Z Ix 8_C9љg %)1s@D}>SC.['bSo⏃u _{2>z8~|b;HA{[`o#=̱q wn5o6w'bE CU!g>} 5a_JaA>;'ꖯ6 Yxa&g:RB:쩭'ajbO[RZxn* B C֞7t0,7Z"mGoo2NH2u ޴/>F s >9d9z>$G*-%R8 ?c$jE|p5 @=6pZŀ׷Vv  9tu7"O͸QC=/ "?T ZlP`"FCV# g=5K1=}ļF7Ky2N/,>`f7}BRSvN);e̻qT&h@B@A?,G֕jji~PGG=Q cpm-ɤ}KVGpsn( %Q[r4" FWR'a~#x|,I1St IM^SB%ӧ'o)(3%2@ ؤw߲EEE K%̔FH(u6B{\ЩxJq /k1ZKo׭H6aEQVJ)/BdBZ=!ᱝ;wN+A^. Q\S-'?,0i)+? )~[wL0uV=|XpYWwB[=ׂbTR )E" OF#K6_ 1SHINE57lٲo?rŖ7_L/7`ٰdsnIHG)z!b o>%%%0+>SG(0x #˯NekrxG[TEHfr۞EWam+ʪ:'[ 7O?ktwvV.3Dy1xVH́[vm*UA#[w2fͮK! Jϻ-&Odwxc5-JswӬ x̭;GDlx;A$ QM ~k~/wdމ"AIX{۠/錉_j׈w""/ϭ/_S# y6iO_2|Rʟo߽{D/\)Rodt椟 GG#ӧ'"#ee#߲l}R1]!ŽaF&N6rRBH)ݶk׈_m>%-ܻ躵 #}rȕE0r}Ι9ۆWl>%ߖB "c1=3 5de9Y4}\{ԚЄ\&TWDnoIU`A-4!2{Ҩ>Z`lmnmeҒǙbGPJ~/*GWA-jsP~^f| Y&`b(0 /H !|x/MnEIAT|!y?g椇/xMb<$/-,^-WFUV?k&&O^޶kW׭&JsΌɫe|` /aXz_yş~7E6iү޺kWL_+QO/1O>gϘ+>nM_!_ʧ;"Ԕ{g;yg _pf),֖?Y>5<_ޑ?;7YnX\ĴcWQħÒa3˟ESϕBR[F?{Ĺ3m8?."6>Rqر.;HbU/);}ʔ_Fl|!Ī;wF_Hݰ&*Y#MSRP>V-/yf CezcÛє>y,CʘBe[w_.% %&>B.[͗l}Ξ>yPbG lݦ)-(eRQ=ztX%booM0D뚆X<5mya[S9ƥbjԤP^KoÃI|=,ڰuӈ4Ms?UE Pz8C1cF!vcFΏ;_R4~+^_ R&F|)]SNˊy?_Y2cR14]̎輼"I "@,|;ڲ1"j2z5v}0|oPKyd0(>-2o^o/Jr$"߭{jA"('eE=>-"; %>9?h1qі# )\(_X+3it':pu,; D/=)lc `Do"ĀXP"';͉ Gv)/Q q=J >, elTY%c'[9~,#U$?qDZ x-;U끞UȰ2߮|!<]@P)z[Wշ1\d !NsvjS& m2kd|)D׈' wQ,HəC7𭋫9kvsB 6$lҸ[OnK {_Q|a!B($2RD&3{rc RF9>"mcni? >Q`Bn$+|G#AT/)r=&c&f5B/?}1^3?5\ t:74ŋj6ws@q,oGfw|b|늳lTag=g+0}Ԯg֤OX39wt#:8ZUPvWj}MqaNŹI:sIS1&-jCS̔Z :7) &̚FG&R?45UAST̚JyC3 -(w t[d^:V3_u!&?cr)w|C<T6Ưz I?DfI"9)Iyb\NOeFZɥ$8C˱%ݘmd1k]3=UEVvvmX>&UOruX}O!d3_4E-1.Ɛބ9:/E8?̍)Hx6p&c,aQnwqʚBf emiVZ c$(W=NQdL3)]#jHM =G>]B!rKYLވEQK3}bI?V~5Y.&Y*`{+dm ݧ #^cL4[E<N٨}yK w7#D^~kiJ2RHz spZi{_vR }{sMBr֬fĩM]v͏p{|C e(_$:4+`̥)~'H $c_jhA~;Tt*c-ʰ5@CO@RAIf*viX~Qz G ?Vp!㟄քb-GS%c ],BA.=t?z_P;zWc@05?EEejAqjgBλð3ڳߺ00ՑhtM4u/VR؁ͪ`k/Lqڳ#|qct(4 [ѥc3);DSϞgčNOOu:3.jÏ:=)A_F`3Ο/w7p!!ͯi5&/ -p?Κ.00u p|xϿo_caV|})? 8] ""|Y*cK@R|!yYsD>iAZ:I/ 5atnc>6] a(/ 5N?}&r޼bRvVqE)LOBA g=W 31♚etG`|B B+Ƌ,|_ٓG317og -|Fg1WBts /)ޒ6ml`1;,9[ Θƥv;=ʇ)ﺳ>s}eZ6EKM2vBMUj]&UPj$Qszn%RbLVjZNra7hW>RLIZsC!qk,[P/ws4&ykK5-ffMjέ7މmgr_q7/d_zcWs+i׾U"2碊ϟ?H9Шo"yeQnإeBP ~V`RŻLM ==06Rf)Y`eR7H[.bGQLu뷅[={Pծ^4"7 ~w[)nw?WRhb8Ph1ULK Ѹ@lR޶'vGeR>u㼟k !CŢ QW;o ŕU F*J+~k(C(7 Ļ_zU-ӆYSnngU^i S)hsr@ȫo?m3ۋn,v%=R»YqhƨD[FidubIVj ?w?E׍>|Ko}ij|-4g8tKFٵ׉"'>|wF7wn?&$8G{FYӫm&xl~}59RM.*)aj>J ETWKkJt`o}n>Ih=.44gBFf43p5sV 3R Œ?ˑ)ܾ*rFeY >ϟ?Ѵ5Lrm0W≠\vkTլ8cz~bFEѢ^5_oŤ)Q? OظO^yRv\GJ򙆔A,fSϗB0My]{Mw7#?`I vәRJTя%iw{sgκ?Y4$膁IU TEAp=\Mk>rH~_M1-Y0 fӫRb$+@4?6DZ;?˞3oigV]з/"o%=fӢe%wmd|IIQSja=|T ,$-Kɒ~"xwbd:cdXxvٿD,fJ7>%M[_^?E)zEdӸSRԿsPHWPRZp'&o-~W{|Szs7J\~${n\A**8TL㱛y [I ޺Oo\0ܔa%;K IfmqyYQAEQMojU_N-T[3Ll=ZmO`JD?eFR U$@٘0;kMKL-3kZش5_qR2S(ۯk81>8{pbm0(k~/5O!Ł:L-߼($۩\uF/aMj~Zu(5'ls(djA 'v7$fdi/LOk+3Oִ#cTͷؐKPؿ=ڢTq̬EUO>{g MGs2j~Ejb; MÆY;Y4jӶ?D>cj1}\GT;Xߠ7 @~ngU껟ǐ"*عoʯp3:\ 8ע⫩k͈)jeWOX X;˙"ffZ{;Z LI~;'țxG߬\>:;B?ISוx'uO@涻P3p{'JN{G_gu&5$ t3/vk>rX*+[75[ƚe@zxLϿkϾEK幼M 5嬨|նkƚ5 xo"=Q@g};}ҘkϔSE֝Ɇ5L Ak_uW4VM u!2:CO9٩9{;05&>൅͆mEk{n^fYb@I=⦭5됕`_.d -wڇ=Gp蓣7UzlV;_+Qg -1qY1kz=>Cς5d= QKk&3,}ZB2@0hB` TZiVcL55]|]:(]Y7k1Z|}AGa]5~/Vznʯwgh0`gTB>\; ~qEؠȝ)_ɛ9lݐ+ :PB를* Īo;~|]Wٺq<{73mXz 56?= wc]=(_j53u!kݟ0bn>ey_ ʿ=7Gd&3w- JԔ=A])_5h8`|LY/cJ t u ;ztĽ멖? έ?]RUa/3['Dh!0߱6iPڱƏ[XA /oôJ j*[cq̽|$fY_ B`ǰc2on uo9` Kz1ީP*p='l/+q]7հpVhScs;n:X 7WLb|U ́C=͘бºᣣֆ!{ Uu&L!͏TCZ5|$ׇgʖRHVԱ%& $c %09}"8|eo^)X-@у:!7/c1W>I+X b5aӐ?(E؆~K])Do6 P`ț[%?ߨ;gKHix^[S{i$-Fg ] ok .|x8~cۿJ @t- twjL1ɠ-$'%TΡJ)tZ 9 s֟ul붰|8IMJr:ZUurmgal"nOIL>:=A`I塛)fIp1NW m>4=+{7՜q(vt@.3I6#eV#&mHZ&ϡFJ =>OgOeR__n3p9f[Wqr!Qɇ[B>?7T` S@Ge(ޖσO̯E?-Maנ#bAMչ8HK Ӻe{=wDrcH=z>Ҍm*11Ah󮣡DŽ&=J)ٶ@!|/AǀLC7@4T ZHlC߹D*KgL)8)Nv{)S811*~''~Dsaz230 8pj`8HN //؉nYn s<555L`Ri'}xfAn%?R0rPKǂٓM_?϶kR=s vk*{'zvYPz^cw득d mY7ȶ6g]Vp-zASUF\M-4UUmvhXxzSAmm֖7--.k775hO^ :[\A]A:ZO4<ʛnYrmu}<>Z\͉8 VR=_®fQr9wL%A! 9 WSf5G]/ RkyΫp0%"M897͘33B茟|IYeHEDl} uIW`^xk@FGBm'9`1Ņt;*XrNd,/tR`Y4#S€)F\ 9"lh {}e@Co>t9?!/vrͿ⋏VUC[U5oKs/m݇@#>0'f~HCm +^WO{]T~ۄa_֧w>=ʑ-45vͼj\ f+X rj A>9\ㄔwYb-m?Ytu( 2}ruhQ93wF3/od\ʫTKJf}Eͬ?T17BcUgpͬ#H0:g_B}-W*hqw#?)-!H)I Ӹ#ll?Y$h62p2 &##SwEaιN!gQq0$$$->,l6<(W8"Q58%g8 EF>@1Y+NR`ӾNSq) rzc|AT5D`c>MaYxv4*}Ɠv10$} '3䓄$P x ^+Y WN6jjAJvdg()+CJ8X\׌. `9S82>y`-} 5xF_G 5#9D<#XT9؈s?J{#kM.;}!`B/~'[kQY\(6m6GGBd}RĒ "2`d *">{_m/u`1 y_'"J-(SzWI0pHc] Z_лbV }d@Ty(G'SodhD}ikABֺDO/a*M``e^K䋄$z{ِǤ&!џQq1@^&OHah"[{\\x9}5F2ס?=ܯn>k5kmg> {XaGO ~[>6,ÿ="񽳨:4xvX'}_0"3IzD4%E$R Z9kunŘ4NFȟˠQໃ]{_Cŷe>z.HA[GcT ZyTRL*p {R[|zBntet&Ot?<H&HL3 ;tcq,rlg!}2&=,Sn>I@ eQAشnD8m(H 29?_Q g I#0`ҳ}< o*jBAaeN"H*`9;2Mj {; T~F )7ρsmN)E~[9,&i|=r5!-9)@)~|0TΆ P}FVW`9Ttj.Gk׊ȱS*S;[vrX4 Fe]) NuWj)5ZYYC~~&>SyƗ_e qsku!g[kUհ7!m|+=1N !dr۞_=ත0 ysCSkM›XV^{Aڼ3R*d2ωbY'7\ʠHZ[IZKlLhB(/jPGjk,WӪ/~۶LU 1yiILIFGmYZ+r-r$+:)U2U \k^C4ZhըOj1/_f띗+A#n籚2UQ,s3R❙fMBy4q⌘ p"@ xw? k0:uB׿/"Bm}c ?z3tB p!Txo=aӧ_(r N)6xݯN\1g ! SvCN96mV W5&&nY. 6Ɔ#ϙ3MR!i^زk׈YnV18_*iFR.܀a߭+$M["ˑY>g-yU iDraº-#gԨQ6t-R(JHD9Rn QMO8ۨn ,/g3I-,֟?  5CKJ9FmkǠi9&` .{uQ=3 5d_jq .arǷq~EJv@,BUSߒ?|cP9 g~qiȝb\`/Yl2EW9;:\ՃN Lp''dŤ]1pe&&`uGZ&'N3KFa/SQ|̠rζJoǑ&ߠf,YFhԆ?Z~^f@ Ĝ'frj.߈ȿeٙB)EC\VEo_xkʬy.DZ|ZvΎaIe|1. -6{}Gx52jWe@[ X-6Gkǐc~5;Gp1"jFְ|ʏHxf#ccnsgFh +㛬MU@X ڧY0/A|6:ͬjް|X!_= qT[zZ˅_~J&d1zHM-}R( I lڿ?"ݳWfkO@T|Ep̒o>DצMV>^ M`Sd}fUuQeM@`|[-zKXPd<§M$6T۷G_7TK'[Oz_j;_DOqaH=_ʠ.Diyy~-`o/O@=3~VaX*^ rCwPD~'{]|iXck;jFspRPdhx-MYP3<+6roȈkƠ y{kfWߝ|5CYDw'_UB:瘶X f>^eؒHQǒ|$L&%xzSTEŏ]?Z}T-x,@@FtU~bK)-:}_ЊkK3-)*aD_b|t}X#GN+RBӤߓ#U$?kڂe'PVJ;>d!{2k{ El=(?+1<mVP|֬QA*0 ^7QwjUDq "_u{mFǟi*#O&Y'U#Qcx]ˁrߐ;z`9Z9,'$_gR7Xoޱ|No}m̘1q0f2lB{~kHy::K%HKs@y_=rX~>m,ό YMaS:"?šqVy6ZXaOrڙ7i9p-:,{~Ԥ~:fSE 91@^g'Z)[ j~nV*IIj "wHaBi~r_9ܺ>j_4;jF!=Eh4SoG!i7g7c5kjr!lRL$%X{VWE!Ϊ`LiVHv=]@RFn3qV VuO !0i*vDXRzOq1گ`ScRkdX 7?%ջŨ0xp~o:-L⬡^7&ClXW2sRmí Pgd`8l:Q{/{(˖+ϡNׇaH6 N86~E͹b$1] eCDEP.w3u<ؘyg'00_@' hIU0U*:-]ԃG)L63>ӂ/ H L *[8Ŧ}AR/  ]+ &FMK;[wIfl&IMgɬΜނ[T?s4UA9@k1CWoRB.=.\s#?x׷}`2iA 1;.P qy;Gѽ}Rz$vbAH)QeX~>>L c R)MpLU:"0 Q34E{+ *aatg뚹v>+s%zXڥ@͚JIf*E=(e 7"TJylvt"`;m_$#mތÈdNFSoރӀ"c+`\l/wUSU>3ß17!`|l!r#Դv _\gn]i AQ &:WIʝSslk0Px̛dO78"qSm򲘚GM!_}!/%I 2*KIŝL(4ͨ /IΘJq{-wd&mHupSS4KwΜ9'28d;vT7j~\$8 T %55% )Mf|Gͷz|V`j$YHK +IZx+vQI5Ĥ516݂ͤhWIsjdkd'Hwj$TfT 5bGt,5fb5i$m9HpGj DAZ(nϐ|L0uVₜ3X=0íW'#ۺQw"j `&rpŋ{/qE>NvL 王cLZoHuh,(qoQѺ[">]wl3iNcR3Rs6 jWIHtHEo1-bX2 MHz`! ψ|_54M5Rfmq̈ 1.0T;4iJ[~V| 00UIQUEfE'#&_T0_xRSնܔĈ4+ Eì 1e ^gLβl|3-"5$9=߂e @~31.'a <{T7MMbrA-h_>ǟRڡ$hl7hO*W^p&c8` X$@0PJڠͳarwEl~^vW_swpWՐ|S g&ysٿ?D[{(._SslݏCK0{b7xwq;%F4"C񎦥=ȶC'H:YxZN>~.X8AĈ<T¢q^F_rh}P`;޳Ǘr U0c :C6r2h\mC;`[\VoNئsӥ9aN圍K|9_=NWdE_^\W4:W^eD~% 9sVzj>5شe\N!z2IL_Q6(3)uLv~N?_I %8/92./9!uNI:..[lwwuJ*l-19yIG9ڧ F|aqQ,^(3#wxkT;HGEW3:kGK`[M (B􏘖,VtG$|Oa ]UjhP}3e}Zu{k1L,TE7b' E~sC@҇y\O=/S9mL'Wϙ}h9ϔ8>zM ؟/W/ Ik7nȗ;Sa?={?JX:-0ߛVv?k61cX`(byII*5;<3$na**˳m?ƨ4,gTQ%/?᝘ I>㶡^$?Mgfљ[ÌI]}<^GIVJޚzrSTGYNg,"\0ѷrhVK쑍{Y? U( $M_ST K>#­5BQƏ.0ME/|əh%'o}9&,MK< ƁtkĂ*E!z2isfLM_1k'9^0yF*C.U V -ŅiIn=ʹ1={iÝL8tYOb7J.@e[} V4@&nK–Q_'Td:P(BN_>uRx8)p\@J~E!5ɍv P׷uL{H]`S(/<*|F eX}+ׯ77tW@U±F' - <Ȇہ3+?TPo; h}0LKW"ӣNtkniG Gil$y ə'Uo=t;:cX_Fi*&mA"Sgt~ZgcC[`ݯn]yėQvMv,FLh D-,u>7"@?d#⼩wB9t}"XTՒBz)MuGBqΗ_WSU-Gԝh$ >.<.ҿ4o&/mmSUM)DM[;)ΉO-ԐH E7Uee$ϯoxy[/NUʣoߛl tSS@_Kj5ߘJaZBd&Gøt "Kmj._p} /Bs2#*ָ) {F;C 'ZT|:ƖV:PIKnp,0rvYQ.ضc qz+;ThbbE G_㴩")B1fFuO-_o뚇8^H^n:֣{(AA^&G> 'cbh(됬߶[$'O/$4G |!r3C̞GNX&GulX7,mT9ol$ݭҫMHĔt-2Ww3ӻlEuRNH?~`ԨQeu9Y0>̮_qQ$dEonnjQEdE@BYZֆ_Fzg= v؂iIJ]O;]ZB;TN5k$e˒(= - EUcB.U*?iS?$~i7ҤDe!T: "t.?^{InaJ>H$R>p(ԋ.}+?鿮sIfm? ruHT> OwiтK8K!7 iUUD߷wўQNӠ$MǡXd`{@̤{'D姈4wuDׇ?g)*p9f, %71eY뎄<,5^r: ovy9iXb7aь,򪄻smAL"-#H*+#a~]nN*pX4,IJNWN 5y [Tն_S XRu9Iq'rc կ`آWII2_h;Y#%•bDNWv46j҄/.(<pv2S:h0of)^O>~_[uO\@D&I%KN?@%5fUuP\h"Bqr9c7cF-^rr;2\Gwx8lMqth1K9M&IȰpi YIv ٩ДmYD 'R4I%tN?b~)pPk0 n]Ucη#&Wt*jDt#w/Y~;&unO-庿fYZXy/<D9E9KF))8ǃf?8Aq:ُ [^]--ՊFF<_M+81>/qt^ԶE1:(L(jq]'췆qS}) ͘so03l4 2>iSϟrQͪ53_IKi6g~L[<C t5`ncљz1QAH-=8$N*#竎gYꄏPĞk[34GoxuF,µ-8'՝4b~j0iގPdϐ|Xv,:voU9\RFFI5p[Vsd e5JE$_a?^ȞC];ycR rm[Yʱ ɗ ;vHK.Pd^ujrxopqe'Z;hL&5niÊx|:LJV#Dc3:-4b遤!T@<kZ#Mɷ'pw3l6(g`tm\7H;ªXa16qz"u'=F$ 2<_hmwϼJw9MfӢNKzϞOC/ BOڇc?&vsNԬ'b?7`awgta:јO/|Z]DS%&ll}†Ŏp(A4Xw..y$̇~0W@ i1| WE45&?gPeE!(lƎ7E8E%JiOvio\ٗcu!mq׋/~dk&~s=>|UW+d'C87vva'_Ͼ`8.lOsZK)شmG$+xDȵgr%zgD͞x%kxڈ?oaE˵vU#K-z/# -__<$_c ٘AM=a9Hغ:_ \od(a{/l?ǜ]xpe u#qPuXu#nhgKAWՂv"n쯣wWU/_(z>`_CNgNat#1}1M1kM745\;V#Vx,Ι #dlQi1듊zﵘj\ EsJgڄQ̛5/z)F/$S*HIPRQⳄz:r>miN9${f{)O$}P9 ~MNM:x}zeepBa+Yp~x[M%yuG1LU<۾+ے&'6$wZ@AJڛ7[ôxK5RY=6J XLX?:~ʠaJ;gz4Y%bC$i&%A7ʂ۴$8|Ӓ,Kɱ&@JHbtBI,ݗE !(TŢ%Ʋ䝮5X+Ώ{X&_`/qg帲qe=KUt:wk|Ɓ^ꏁ; R b)Y#5qso;)+yیXޔX 5R(w.}=s+޹2wRpgfkTkKy[F_޸sT?qgz;tDF ߬zceXVج>jۢ0!-Z'ܾ\#`{?YN}[J Iq-@mkkdȳ#L4>˗zΦjjQK9Z_p|ёbqV \jƻXС55vhDMPZnI'ɟx˗qhlolY%^]rޝ6_0q],_yǚA_[x0ZATr(#uo3WN.V.ћ= u)G#&PC\}|6mw|KQKvqha>JK{O#w$^Mƣr[4&f騪iZl!k0t8)^g( i^yl5Q[g95bҡ.];QQ{FQgzIFuX+Krc.+ ?|{P5!-:L] ?]s5 DW%:G^:{5*MQ|Gu6`:EQ(Ȅɷ6!-LꞍ;g܃DHwp_H]z랍#)&'`e ǓŢέ5o:NX8xіF d1r-b}̺gO "ԉ3ugf?H7+{2ZT8>f٧B/$*`E.cz)RyϾ" [ZL=k.;NR,yxj[|v,Cljr]ɡZR8K3 I5kL{0JGbY2)6|۸s4=s8g6x>οױ,DS2i#}i60u='tz qGvO )I&o#|9}8HGiyȩzbY&_”|lQޯ<>O.~B\ v~p_~_e}Q A#_ 4ss_e=6a)Tp;kctɫ)sn񺯼w2j >t pq_V{^l+8_w#}p9:rн31Wg!́7J^,%kS$w= S_t1?B8]AJs|H$罹r*Nl+(8GQqRѣO9nl@Mߒuhr$Z}HO;Lc$Z'`Nc!C2#: ÷=N>% MYsqX*V };^gp0,S5k25:[s~BI v,!/AZI -H aF Q5јhҁf0vJZ"|K|We4(jPЌQBtDH{{s(6Q=: }#uŦMJN);ZH#.ǝSʯNO)),Tꓽߐ/563hNK;l$іIgf(ˉt@`z I[6$%\񚧞紅NCJ3K1bs/EujGVSӑ4ѣٙZ=ÌĜ딩*ړV/IDAT$fUR7 @7jy!}MD|ЕϣY,M<7_hR<ؐB<ן]l)yo_r^P5*?_/+)P Y.-q)AqBXrp>[oFO#oҦ )Or){_r>&B bm߾=a7;LNG\1Žq+$6”ª%_{&aVK!ʥ½/ȊKrg?lv+I~8!XeEx˗71 8]B{]/\*)xh{}}|ɆiErDcqzv 9A@ oJ]aF_%ЬdC Etw8_TM-,7L )E_ܺukB?*[|4o-wZl|) b@)BTU|V%oH뮹HdvܥT [>pf2ȹ"_k>7 $LP ED_OP{.89ΕR܂Toڹرc !&(P [P%]E^)4KK d1-pwX8_SI). RXMS-R^AS[zQ-K>BB8eىc`.p%d4uOf࿁8>Rv7./OoF@"|QKD[R )Ep@>sق+ S||˔HԘb\x8<}p"l>!R-ΗXSr@\ >Rӥ+(򩍁dA-8| ktG_G?oI)7b\h貲}-ҙ3gƂϟ+/_ʏsR2NJqer?%61I.Z,ÅRqRpe5zN!++#8!YfY5m_Q럺Y)bː,3O> I!.EMVVqى8 )ҼfaHy~_vK䬵k,)f oh=9.?b˲f=; /ofTVWUe<ˀudX@fW RO f;^4wh},{gh}5q>tlQ^pyt+ysoso12͛S NRxj׬YiS45k֜2y~o&g{ꊛ?sM)gޚ5?KNrӒٕ7yP5kȁ奥7\u)TkԻ-e/4'}󦺺iL!*!~\&N }Uo99Z l_RXU_j,Ck:s T5rϳsBa?AUo.-ibA| GX" :~ _[:A$eO=-7)+3-茘l>6BSǿqp}>eG~6n!R؄UUU#O5*E.;~ϵ?&wۃU<ǚ=mh'5tm[5(ݯo s𸏪Z_bc7͋ӿ-dr1‘Hbxmo}2>w_~A=HC3ǚ| pUՠiYNRrD""ל?i ׯ_ߔH$!,05.'NgV+DP]ڛKĚ ?Y>ZB.} yrW"ekҳ~=IS5+ĥޤ*zqEE~ 4~&eUo֟]^#NsP~K_9I:^zϑ욤Zb/Ͻ0I#"Y>B$ڿwSpƐ/|InKJ #daǕE0OD "IIޔ&L};d{9쏿>5t&9ݵt|TS?0?UDOആ'RRD8 |RK秥PSap~̼h줜6J:ZxqU@#_AȲ35_'hmO8F )f[d@6mòC='!G3 >vm&IxcX}>hJ @Vg; l=t4FNzAR;4u>"Fn> $+K%@ 8;$А<0Oׯg6hkm]e=5P$0]?!{b'9q0ϟ?ӽpLٺa=A_4|݈,>ztJMM }--#ON&KH5ĴcY" -.\F;,x (1C-Jn uv^2?L_ϯw)#V_3iYA&o~3~[Iߜ|_cϽf}EQƴڢϊ_6*BF(REvTkH1$b|g'<:tib>?>u)rş!(<c>bw}'yYߨߏB E9d_]#kW_X-daZ(6EDqJIG@EJB >zm=mDDv):R"?,[&A~jEQ!L3 H$ eRac$b -C#5gu/~ރTn~]Xg$k aòEҋ}YnCT,kuPwCz(~tDzJ)7&ItT]7LzJ.MS[oOOW^+,"vxХϬ_Hyk 3͚b)1}Fv?>.-ee桪+-d-$ X+^8o|?9˙3gzp*Jee;vlEiqzo#f0naLi/@~=}6D=þSR/D3ol "櫎ۙNFj^ \ -a);0eL^{DzYz2@oWcZ]Muk5('bvĽ^Y)IL*#m?6/ (BMK[o̠|<R/juFnyYHJ8+鐸v鉗 ux5}vw2$H  4$$}wI͵w!@34,!EC';#B3I:,aZ]S4{m55uO WxIu)6߂%Qh@jl|p$@]0=>|kqe$X~DQ4EASm?>xaJw\@X?$z%޽ ~! O^ $\zRGgNa=CzE#Kwl_}iH (%3'lxs+..0---pa烜BHo+,1B3+P(B2aۯ>mWUǜ/k/3Qص~'7@Qg̘Cq;rv}g$?kyYScIO.] ŏY39kzqvgNcByV7},сR4٣bηfHz9cl)sǔƜm`Fy!{)w1qT'yYvTI$#-JjsނRJEMٓ]b/]viIfs]!t;niW&.3B(Tg%"RD|g42tE8t[b`lY&j$jꤺ&:ܺssRPKK&e84ӁKb`L^B)ne1dpWNt--!д \!stΜJ$[ uZ!{Y/&2'OAv2GRmaKI2|SUW0>yiۯ)ʰ|G̈H93R gMsṍkt{M,9+?CAÂ?ߺKb}R85(jq+%&T]]%!G'CSmigoMCgSj?;u~k}R\]i$|/M;M:kwn/sCAo ¤1\6?|}L]zՒUU{.w{gߡFb[{Ow͞* ; a~:)vjUDߞWޡfEؽjAm[G-DGwwB)$=nhs0PCSin1op&eY,d. E y Pz$ ?_*)"rg؍Toq?' UU08ŧQ @EI:G~U,'RaוcLs.?4(gg0hJœi_rI,k| rD7P,b/EZ53nAϯkHoRl@@ H f̉B ?36$ltr/>_Ui31fTa?u."6X0S|9"~,_0T Jh$D=V$?UE`L.[P꾑0?bڎ,;sƔJT1p{d&=~xE ?dXo mE'% ܜ(7F_'5==-yccHȕ_}9ja^N:;qw kc4iiԺyb,)'-.a/KU# 󛲳mQIw\>%GlJ-a~{n=`֨">CnMC˨ˡmlWDq $BSvrZe;ɞ6S7iT({H~bϙ²EsH?rÕPQ~WZ |$]dYi5K+oRRz2}f)>Ғ]$SVS6< 6GX84JaNy&$ͣX!H!ݤ4JqjEŶZBQ)DB qr⨀F:B( %.E2ٴ+!dU"lU3gM"Z|a AIEzj2Ool؄ ;r̞[L*z2?W+C]ߜ#- abݓon(T+Umu~Ȳ混 /s+-v gW ۶ ŶM5@vXԽauؗ '0QfEkItmk*Co4wv/4Ť.C.2-::w n oDkzv: :mph<ʗߓ0= ]et448]Pb`-͝zv>vCo7!whMX:zUCߞbB7I;ooKmjѝWw_/m˚JAL=E46mN4bZ&nWYc7K(Nz^̉y]]yJb/c"Z&dgׇ. ) "< `KJrRL--k1>ZY4ZZOVza1Yڙ=1hN(/j(7h|[,<ʱolIn>m2K8gN%InJ g+/4&IN mb[mfy_HR{ʮ)q梭gJqG;q?9wkCp;P͑6w:vݴ#XE7C5PPM&6k+kO5ֶE%a7Zut;tTĭo==X E Nb{͢F=I0[ 3ܺ4^^ȋټ7n4i9!m~k>t z ){1EjH.~w݇? 7޵W`tt6/EVI$ܣeZu~IJJ)Ǵpm O=]6-ong13骧G`ӵ0ڶ(o ګ.$]+0h.շu#VO]*%H, j "]3S>HK>@elؕi%G5L}Zm-np)T1^1}rKq.67.M>6z%ۏxg&9gmx: M24 j~3OM0m(|~*z +D71夸(@^TVgGlxc|C0K0ESEٱ5*\`#M/=f%iD PA7֫J\?b~#e_%=M0P #)6+VPh)e~gO͋5n7v?w6q*p]_& T{Μ9 c v{4K/U \t:cG;saX~>KZ9FTE P/$k)=%J=y:C1_!L0$0c ŴKW /?w_TǬ I՚bшBKO~ +?jg1 _xK FF ٲ;\cL۳C7s~s z *a$_q9g͚Y&ŞihqC-{bs;ik@ʝdeLE!c*z50M=_@;9^g`Y5L˨tFǞ = 5> 0E~F~jP\0j:ȉ^8E&e KIk,5v6.F>B/eKzA˳ƅYBp~NZOM7giT//8}ށ@E_Lm/[[g?rK[Oǿ񆥺S}P"\QVf-eݏ sZX/jQZ5 [n'?- |9/-YKDIJn_O9[Z-9uY, ;Wx,bFZ|H5 OΕ9ѫ9t䥛Izyg8\e1ڃSO r_r0cH)q&y^9wg̬X>O28vc0GgR--/"qEDȜ8Ti_BӡPu K8$9Z:]ٲX~R6"( pEv R$Nyj g3?N"rn ]7t $Az:_ϙO8)h\4)4u"?ӏk\*wzԲVdJn]Axkfm*%߽7=4uѹdUDls'Oc漉,oRל /ܽw(i*=̎fn>4R}=O~E)mMŧ'B|H'sǩOP"HvۭP_ p᪪˓ [yBޏ!C͂oxq) R"+0H.e늴,,m޹Gb)S ~ŗӏ(w#Kڠ"-%o:ݽ`n)oC6޽rΦ}AvWBs%R.jiW=cETgOCWUzHdqE@+ozpiI^7Rƫ>)yWE=S!F$R9{b>X=/'̟uPQ)%^>9m\rRq!~H[p푯R}pEoT|g#hc D"Za\pNOA]p8̫$a]G*?!4.-9#Cxw3Nd5dط&o^ه;>t%4]Iht5/Ŀ)1fԴ:~ȍ^粃G&0u!FW+5χËXx'fՒ7z;S7Mo@ʑhv 3j}g'%5R>aLmO~1#^Pk#)7tpL8D:^$q1DJ=TspS_qH\0wςk6c$rmS 1{S1WS ..mkGڒţxS:9mAwSqN9k?D57{iw2?37C1m\xO5e'$^g  AUM^04^y&~[*&p7R_݈ CټlI|n6p3ߏJ4GO$i ֽ2~7\B0r(D mY*[?<#n!lXqגG^NÑݓ+a~u; T ,ê %>އqG-auR~WC -`, JqɉANkiޜ .Iwe񚯃{}' UyEH)RaHOƨ:O q|Đ{FJh2 9LFq{?\eJ"dcǺ+ya_'L9i~[ld~EN>ᎳR!~3:T䷼FZpp3m> z,tIe̕k#/@_I"uϮaP_ltN94{x8lrBƾܜS_a/8tr~xo8uʋP.!naûy/_o>;oAO5[w>s/,9V| 7Ӈ?DּF\+yO#;OϾ;Dgs -4ob}B-8R%%URWIZp.0(F {C6ޚw'y9uZ:g, SYAߝɃ^zUVq)zf2o #;۽b>i L9P0!D#駔oSi #Hcd||ӄA9·f9A-;4WĈJ>N**&wt\wg8:~/cL|GF?;f$NQ+ƧϦbsq#]]go7(DpPs_ |?3_ KI)#s0=;c0;?@(I>G-[8_pd 7}!!Z~G=P0=|#Z>FF _ ဒ|ک;Ր|t:TTY1} ?X߷-/3-D[7j|=}Lfe-n{Rf #؜C-rf :aF:\ġe#=QkϬOJ4#46LD}%>aRZ1rwUQ sӊl 2pgNo5=/9/*ًl+3azG ,瓐lWx4P)O'bF>WNrqvg;Losni CNjﮠy-I>bI-g +GޛJ,?pWa PRRťΝS*'DDdǏ=C;/6avnlA FuRs;"~na3 /$)j:sDR32[9g;G KlgT4"'OɵMcB{@gň u='H)|P(@J=WUXA,v/ڏk]IP=Y[Y(DJIqJDB?cC':8u*WV6? 1Ya=0E"}H_/ݔ Xhw֬Y@-5k~3A# +{MA\a!\4=[CI&yr !D' xh퟉+" nypBrUXu=k|&InrBUVL4ob|X<3\zh˅`ZŠ)k%/w~ɓGK!.B5XjZ)KQ^޶mgUsPP-Z"9_3{Q e yjY:shK#EbeZ[ϦOEqhsE)ZY)_>xg>ߔ,΢Eomm]y(5M֮YSaӝ ď?L^Y} ƇGyR O-rH-)~Oy#Dh''ϨaG:rdW^h 5= $1. xQM~yo$I&9 G駟W:!|xi/ysI|1nZ?B}&Muv 1BhHySUUՈ_;i ޳xY.(Gr ŋg-\0nP IqѹEԹRh$ OWN!++Gė~Eg>ϞW>SVWHyi6=-$w2B!޼s҄zNU}#0ެ?Bp>i)qS7\:B}B~qP@Jy#' R/\0WwygGVRBa)Rdmsw^p!CRy~$_1sMB !ZL߾~j3g3TRAKU|mVJPsC7GR?6S'O>ObD|kΝ yFR5,3<RȻ81}*ϓ#!:tHBҊec WYqfWR9 c-)e*Io!w^tc o^'4e2}b|ۺcGBuO.? you,=1>o~>KKOJCUU#{ٹKMK>rB a|ԩaXizeRR$DkLϪϠ;YWDkG%2 !o9o{bwdJ\k]}%IBpKK}21ќv&wu -uA헐z# Mż>[rŻ~'=8 c# <􃫹㲹LU9Orb |V廊⺾WHt&qe!n!p HU̙Bi^'ؑ>*\j`^9 nT?_¬Fggv" &K^)j ph@q,16!'f?w_Ώo8o8UC#QLJ?>nL.KpU OK2TgF6?q'L+gbA@egDtRF01[.Gy)C1JӧLyX =|)K(kfL|O^j)|$$k['? X_}d"7 A%W{V,[Ry@.ʭKlLPdB|^p^e /ᕒRJu]D3kKkYxzKg>"t/ɘB.Zx%~e =(ʰ|aVTLH)"]BndRNa}Q`R]3}lO)d\YFgGGS`h7ntsQa|v[ QcHq)JejIFQG5AB/ ˢ"/;ز~&pNL"Ivu)^-?\9kTΞ1ˉdPPJLRR.W6NH*BE8t4EdLna*hLB 20KNd5UxB/qqbrS%ǎUݑ7/>!L,˖ ݀iFev6bB6sy;$/IS-Wð T:+1#ȈV&iW p$̏ #0pL!"a\<0Ҕh.ݩ0 ,SciM4lիm#HDuq$y#/D3oluE<+Pt'ӌbI% i?ĉrH2%cK3 $W@HE%,3"9w؈DU4ՁiYXdLN&PM҂-?c;BhH™5\sA=eO2Ϯ 6rn|ՇQ4HJKr + _bShF ˊ$(CsLDtz[OnOLM Mf2K+@sOtɮg;3H\NNf+ntE/':Щ,ezYR֪auLi':O?*P,:_B^kDg!h!.NԘgd(ֈF2q|FҳY"$:p%;QK#܉r:Lw#Wd_DMd22^$/uG0|] !)No4T!T$;ck:yY8u-aDXL[*Dp8NPtaF$yr5$W\NwDU#jRLGGQD|M!*ȱYLZ8 U0LÔ$9AKVEʹtMǩeHQ"Q4)Ht(드R X֖=(D)) esO)J 'Al',FJ Y7-RB؇8Q`ДxV%kSHd|)dֈlrD~ j)m$MBm4A(x2E ,9ToC 1|SZ? d%{4‘5:H/A(Bnj Y) e|\)$p[ *T|Q4AZJɷ`X~>FeQVS׈au E%%5 0aT&nʖ # pMsQ Az^Db':q-ǃGHGJU`(5o*㦻u= Cc:DH8 hB1<xZQTA4b _[ <ōKR/H/NRz҂^ɺlܓuF/}v 4&Ǘkk?fP,Kg{'קd{ E/HAQt:=5`cy~_o/]dq:4vmd1A=0!NxIDOFSkr@Qz^訡#!}.M¶?ơԴSW#uuwd%P\X49nG .)@3krv u Sr:nbqw>_aڽbeYv0UT:RJv?U7b'ٓ' UUW^hp+ j͇inp3+?%ҥ CSW^htq6Gh@-Qb,].]Hdxmuhc۱::m+?řiҥk"l+ E,}MbY 6s!$Khn>زR(&}RtCyuk}OBpÕ-W=FEp~ĜПi]*;wq|C}\iɥdmzrEv?_[g|y&`QNNfҀҺ~GA"=eŒe"BC(*꠭=gQ5k$q!IY#&i5,ivpSW՞ǥ2?E.BaH$+!l㍄/qE$ ô0.7Ɓ&{OB`bn[َh-8^'^~qi2 V\pҒt8HGx:rͦuE,f2 8 @c=)hxh&=7:ur9,%\Mgx[֏e9cVƏw3͘sߥO(b;܉eH+G3p%v边L&o G[a;L H4@$8h[¨?W|" 3ooNQ=4.j9ʼUi/H뻋Yya@ۑ`g<?'4![˗dse pѹaEZ;|mN`(;ΡN]YVq/_o9`LTe;8XwJ'LU1Y6;_|_:&e34ӰؖUƫi|85l@BUXⱗZ gPl~iNIiZ ΫV<{zPhU,k4!UgIEebZHEb|mhhFѪ us~܏e[PyU_Km%MEdقFc/MNcU!zfغ7 L!+bɻH:3WGy+YKRT/߾Ξ3%oK[l~hyD^); -9")quۿZ=MoòGTAw4ޤTNcS}q=wr ": @NJ =|+Mim-";%s_}x^_v:KW9&= QQFv `݃7ISGy%ڙ |$Y7>ǕדK';6Pc5"Jʹ1cbInI~JS(NF `RƤԄӲfG5f:t!(H)MwPSd".՘'̟^gz\ԲB.'U%/- eKKFTqӊ 4aÚX-vCv[v칦oû"KlǾeW$5,.~8<9<ټn!oN#! }vF94Li Z`́mسy1FRlj t?;<_Ξؕ^iC]y% cOcqFf%H#ː]ήR&?%S= XjK4hE_W"lSj/@u8VKylV5?HSu_뺇ߨ[g|硄;>hœɼKT((|Y^Λ;=ǚxo?b8;ѩ1>z@A!%vzKfht!h:K[T< X_͎]GQJj )H\U׶ۉ=tӒk@\"@\L`Ex4Qno~e)qyV#lDO/xd_]:ۄ 1DESڰLP[]+#`OC\&GU\D.\|qsi</_ fc&VtMKK޹\|qϥg, n ~7t{! gΙ̴)L U̚1ӊ |;n4~y/,%_vˣUx?+㯿}LpBU0<˔tP`ZE.~ÿ2^x䁗hb_uP^ǥ>PTK.:3b;c:$Xaz\/䤲t(ZQ*(K'VL/5mL9sJ=jϴ"R)w2(z|C+D%dSJ{CZZ@NdjUOli)&)mdkK w;.5Ν>sgjA@,Ԯ8i霨’# o>}'bM8ݽi1[vb]s C>QS:)U]˖cQ7LvCv6[Ѻ+YՂic?!'5SFK^vT_.Qn?va?ؼ/En >ΣzŢKv^x+Wbo=|XңO m"-n)stw1'ޏDAhG>O|0b^aD>~:?݃!~g>˗9,?OO uKrϡ|Q"(3{ vhB-*@;B~M,aܳeA}eQZRS7Ф4&ZPB~M;HС[{B&#KVf*JMDK %t!%E.]J%O/@0d"#ō8}N4uRQa %DK}vIg< \.3V  w+G8iF8ӧ9k7+xϾIwthTۭ`0J+XaRy6OӹiYw7npQvO(jؕqy&p_?uW蛏WԙFWUJl}Q"J7.?JoYrdG>~)|gvgcU/ _AKy+?I[9sDn3>F&O@!杘fQ,"~W6_ 8^TwB48k[\P z_Js_G }d$K{.Fz_5IdHCkY&! -@˔a.?;>˳Ru(a nAr̉ >S$rŷ? dKŨ|ϫ*kPO[< h)K\w`{=ޓ>В1)Ź9i_NNbL^Sߒq7 }izaC 'СlX9 A+}eGr`)y( i8W:;^`?'ǗbO+SbNZ쑎F?,+##El`q_iZ[ؿkƐ@WTX!$п& QT^=0-C;B wY߳|}!EV:4UTÚ?6oa'LUJpTUy̅󣚦Lmg*o.>SߝqH;x#ط+Jf{n4\=)7JR8۹`㻟:>?|$oj?jxF$+/<]HRSБ&v~,.!^ڶ(tR&nM߀9>>uvqVlC:/@ŕ}Gu(j?eRÁN_Q)j;^žV~k O_GդHQKM'X\_z ~G]T_߶Jy7G;͢斎(DNW/Q$v7mم8 BOEoanÖ&෗] -W*C?{XP?΁L&hDŽrSŖ(Ο"GKw?G#sϚJfz ?WɚgW`Zֈ۱VD8hgN.&:oC=揽)Ȅ ;%-aWQK&j+Ce_M,mt&m$n͍u v36$OTl<tLo !۳ifhLr<~غ;l>6Ip 2\ٺ?p1אƔ= kr) !I)qYdFlm"P>!&VnıscuE~Fj\!`X>R=ho*ȶ?2B:iwR>}N\Lc{RyH}ػseZT" ckAw]\{]@ ғd{IBL}>y?>$3>=̙{$Zzjٌd5AyAVR=/s~{Pۍ0^~FtFBbEpC]Злl^h$ېOρ*[ 4@$7bR6ΰCf̧{,\iW-L~j͘tB `hT?:(G7bTj0(5GB?d~b*b|ј<(s!f_NvK+&>kknaq؂g[\/FvagUMD XfYýA]3q!}0\s秐e/>C :?<5S_SUcPY$cկB#gގrhT!kJH'ގʢ';;ˏAMՀՎ|!VG4&lGޚS/h }o ӗ_,e% !ڀ #\4 YR0.;#HɁBiH6hqC?_4IGo>!Us!y8EyH 3w[(B0Ƽ_ԦpZE8vNDgqIOKC3u_g7;mw !_闞_t|NѢEyYO>AaOC}+v04{OUCh=E']ɏlLɹO'CЯa-s![A"vDҌH8,mnŰ&kVS"gKE~5#L'q3mӁ6t~&ͤH[gPyK?bSNA$0J={CVi tnO={JKEz~>6/YspRD˽J`ՓŐ.w.nF o)\~YI `j9z D£`Lǭo\ |%~D xې;ߙEUy4;Ic>I B5[|E/_gDN!PsC I8 7/H~.vɞp:o6#Q/G}倮#H<߮ෑ? vpAn QESҮ$ YMOz)NxSTB]h@r@~Y!v\`Ǣ,uMz94֮ˏv\`2} I \HD] -CB' BmO# PWB,gQ@ԕktp1#p&%D.(8Y(HAB{g<!R;k( mGM{ڟ1Phg.BB@-lHLv9iZv`4Iq _յ|[ Ɩo}{eP"\ƨ$Μnj)߮˷C`5Gw3{#PWӡzz~3n[|{bI=ScQ)'n(DXp{'fNI(^eʵ^kFzͷ.8|{h0la[Am5-emYi=-3`SB0`Nְ(Gxkl1!lv}୺b,-: UݠLJnrm)\i1v " zx6oҴ Jҟ 0%ϼu9&퀸B냡T%_u߿t3'DJ>go3_+?[f!D`x"}kngnpjf`` j~n7Oq&'kOs, L̓&v;+4 Zd|v73 M'N}c@7cj&o\>`xFDvq_"g[D|NvڒF7W]cDH񲬉@R`glxN7 6}.O/B*k%7澹x`"b<1O$(i}|w/N-iLIЯSyE~$ D['|Τϧ߯2!MR͜[lxɘDLg^%`u'O|緬֩i 7CH>ɗkX$cHp^]OkD _;Z/lPbzrcжLhKs=ND@y٧/^FeexLZ5P4@1N6rذ '5.p/@u?^ca`+p qZ-o,yP5*p/.0@ר?k|V=〶ձAb=pGV?Q]jrrf{ h3tug3 Fn"[1/{kLQ~1X[1/==oSQ j01 r6*+k{<۳X8lU7El  O@v{ MOOq6m1Vɏ[tv?q'B5>C0+?6kؤ~}ihC[zr<\'kn c%%R&FrDO烠$`HapV3FO3Smu$0N~nO mFD'Ns\H ;?*H/&a$?!:[e $>A܀?c 5N`AxU ^z+|!՛^aN B 'k**6_Ѱ͑ӕ~g; \!|n{bD>m?Q}<c5/ܹpe/=8Iu3 @!` J$dny sr\'3 *dyϞ=~L$sPu3}Az"@7oP~C3K!!d.D!$is^^^}9>R%F9C-`ݣmS%~Nd-q!Ox#mwy겂n wW9BA|o_;> k~]B GHKo~͞bO@ @qn~yvw_1׶ HN-.']˥X= )]~k<p}0}oh?ou:o5v  DBUaKuа`miIIA4!*J%';Aw̙nw]65YppBnjA_1oڽ/~Ú#GLJrsOȬ{:m?ͥ$UBuc߽d{^]MM [%ȕ#D{K/ B@@5H]?k\ֽ~~eVqE!" Bx 8OKIL~~A3F\&Z[ζz، #%QjTTGeU5>}zQ6hoֆVӽ˧_YZ?#6ʈPD-0ƒNŧ_`3@AͤF;7ݣ͖a&ִ5xoٷ9=>}h7򊍝m`hg y~̷`4&8Z@ ,X*sڍ` $3JE^ߏ P:>~5n˜5f\Azq Djj kIBUOt_`(b !(^bĈ$/圷`V>[o/R .B~P t_`(U}bh>e3'=v(RNX=kl򓞔4J/:X%x^\HuםEdh[9Z rE &2ΞӍ\6={E C+kṇn'8wjNF\Hm{Q"!62 !AeE:~Ye.1m|2 mg610adRu~2 f4!H#*.T&!-{ڪK@hSv #D$7Gfݧ޾pZ%}0u\-nZT 3MS_]sLa_i <,aFib" ?k`?{2p\4"4?|% v֑֮ä}} ,& k@͑qmY9m6;b1cg_"-)i98o0&ėqqqϝ;緟#Q|mKv>貿n]]X S@D~k)*d;7]\bӎH|#Y#p奨}*= nQo\[w\3K_5m|'^]V?*>}Eq r?@QsA !1%fĶ@ gqu?-ǣ81°h'X~Uc2H:=>}\`k nE>%1BVZ-sh {Kaw ݣ B`lj( Gy$CjH(s8XX]t=ul.퇀` :Nޣ8z&/?ΏCBr<^`yBdjweQڋ+fb9"H1 8o36vg‚jM>}ᨪsZ) 5  CQeUV NM 铀ʦZvٽDAŃ!ڤHُ Giٗ_"@%A%su0#=6v@TXxd=c?0#ﭽ|QW_ |o 09Sc_zkqر ?;.33vב#~Vq~9ׯ_0vθدw Occ MbUs-3|ZG{?gMAYGo˴0i[Ey9ւ#ζx| }HK^q,Ucӏ'Q^QWgpy,-7 Q[BnNtֵЏ0bxF?DPPX _kqT|v7Ot(5N3i02NCc kٮ¦pNt=0Z~F!3!!oFt: &jΖꬕf9dŕ:B.-Aok  O̺69uZ\Z\jwf.a2a2zvոGuD!4JSG̘DSpͶX'8V;$+#<!:eY^+cC}jj!w? 2^;Sƾ*-)R~PMaHuVHwFFE I::#\%*jJR|"/FtxT tGQaFܰ;=]٥SQAԻ8n]ˏ:2+16 vR_SmH`P =6UsJwDFΕU‘˧a̰1FXyU? oPRQWwO 3 ^ֲ#CPk~PORD!#)-w1Cbqp}vO3@Lu6"`\&rK[ݞf'D!=&-FädwAwP!hdy-^o{4>I I Ϛ@VBLF^s^0;5n EbLj] |\h5Lć5ZYVn{%)). kĘ~)ZDj1A#aYj)hSH#?LP#Rd$#_ s%l@T8NU 5re9AXjgFH-@ +]`l{}E3—p 3eՐ-D9z>$jw#bST><$!Aq`ZdHsxo_6SgF!9>:m8!0$pazDjtU A/?گE?8áմ7|| ^d` t9d1f+Dq15s&pӦje\`*'W518 D A Ԋ8UU-1iH!=1$`>}1iQZhpDOGF&8ȧJIA3BjL$R$UnMg6$26 Feh_S&\"P9-|!DjQJ^&" fƿٗ0N3<[Z.$x ,9c; 5WN U S~1IP:~}ioڋrwDn@aIO_eӆ1?钦m;un%I(v߾!"V;49NV'q{MD9vO ʷ!"HNC8[<J_,`GfgaoVO dV#{QQw~^s/A~YƁRX.~m͞ZuH)C!xbc_?? ?7cIoLivia+)}ŧZ]̙W,uKE>}KE5W\:>/-/l6ԄP7'5>尹E:~}u͡:7'5Rxȷ 3N/ I s)**+Ku_iһXOg_e$4 #t =T;f#=JbwĚ&?ÁÜ9愲Tw]1]@S9j\#h5dEli#Ӆ]g~8WkbOBP8l, 'wIu'){/||`}(FBӊEU:}C<^5.0ǽߜEn|JOckȣ}z')aNqc1p(h$ R73X+pr^S'# kas5((_z4ݓ sn.֒}PPLbMKeU>x+l!BCd;p@k'r TPtH׹#d߹`~A^sHĚ:jt7)e}"9pQ Ry9d1i*wTi;3$Z'T]?x`joU.Ozl\^]~ZA i5-˂aaŔLzkMn յ?ι0gX9kh̚ !0~ MƐAM8]V/ɑ2#ep)1\Fb#{{&|T`a֨P$Dx Tq! ?:#veL1,ڪ~&`r5j9Xv5j;rYNjJHadǠו[t>>mۦI$S? VoOڧ)ZfdIT~}y)2ԏĨq;xЖ3)2ǟ0\bbl#n 6PN-'.TƬ&֩8x à o "A6 Y~f H`8-;WtTY8Qz~e'VԆZB fwK W#nMX@mh"IyʯA6>njcX0H x`DxN h(=\▍hS{e=k/M0#D)ˉmѱƎd.Y:5 h-W #z9lޅoL0ns@ݧ@l`ئuj̳dz5/aXUs9E=?<y"ԤǘAԔ~9 N1B`]^@f<ap}NWE;<p!"DGtT?h):v3}_ި9\fGxO }~FY_=7l.lmSUko׷/~K7j{Za[?Cd7U\ t`Vt;ϿvC} 0~Ӯo_ä~Gz=ۿO0m~:׷_#ꇁ~}~QG[k{gmTttar,xDD1:pp8*: ޹T7'Z k"*|_oʨH\sdH>Vtb"|V_0ޜ,ws-4NEӵyM>=gڲf[bTliѫ?06]X {y.hC3ܸ346-5\܊?|y?n=j݄lBҰ N|c,( UQX` y/5kUSj/GmywSt})ۿs-FHx0p \6C1v&Yc4"sikVC{k*tȝ}ϣB  \\002=x"便tZO-\/[dm3GI;p{]r_ {IQ>;Eyc*} X I O7]p8wsYiѐTӥ6>Pd`X={[w~Ho 0Z^tz:5o `Zh]+j*_V۫sU]$^ _[Ou^eV jD}I՜Z濽8?M[+0 HcvIg tR_!qO=m^(DǪp=00`- s=@B 0(iWI0*1`Ѐ;{z4S/(`\ m}0 * ʸG;`@h  > \ Jv¬ Y^4 w@D Q`}K|ZFm|V1Iމ-[zN #"{BI"?bn91IȚAheμ?^iŒsF̩6}; 0,ˢ_Ge|'N_\m`ܲ,;6~ӯKTv'ÆA4ɏ&|} 뾋}?bZ̄_ 7rUtTG+ S-o~?| ړ y nc~N9RΏ3B`2( Q;Z pԉe珐;4Iu^_QqLX'˪pYf!=wh޹m&|s˛?i=M~6~xZ>~8~!tҬۻOZuv+]o|c@[7eٍ_e~Z o$ŬX)!}N^GK:v[ ΕL@6EaO$/(h!w =(*&aE:BP3RZLGU{Gn蚏By+ ie.ބZ.\+StaH'|U5o0,Q h1j뽧z -mWv*ߦ~z Sva%q鴮7MƛG.3ySz ~t?h7o߇??kwj3Zlo6Ư>ϛy( Շaw`Y~4^}A:fTˁ߆;"?0Qd#&zO;<; l8gi6IqYZ'׃G$5n(Lʛ ~!hڋK$Tu7i4@>O ݧMm?imo^? ݗDeqA(ZC9]?{=WwL?el͔Xäݪ+q!0v\(ڊ jU F:ᡰ +p9>pg!+n .ڝ?"h?#:#! r"t쏡^lc"38ځR| 'w-h F36Ǝsw)rQ>|쫪嗝Y]o3f;g^z I uޓ?F}?sǏ?+OȝFB̒O6WLOaR\s{@' 1w[%Cƾtn)O.h`[cJ}jD7#7?_r> HtSqӿhbH!CE=k5I~nq?W&a1W5,h `cn<2w̚ Ip85&o6.Oܴ pi[M(b@}`!}BBZ\9qz2ҿ@8qr+màTRF}Tԑ<;?9QMsciHtthDL(QKO /:>h,'iA,aMrF~G~{@0v~d[v~g"Lhg mv@\!0H|tQ߂zp|'fGlaisD(}2d#c*"woPZw/^3dz76]Qn໠ i~"*4;K:=:SQnEufl (>Ye8pTZ*!p2--~dĝ,pnP~ muh;J<l.ڞ"'{k|1ΛdZ;myZw~=!v] I+ ڝ=@*kSqϾe8}f6 uԪ+P_`9#R,Ϸm$Oz/Nx5v,NKÓPrv( 6kx2v\ީQ~*fr4._q,~"rB đ>򓥮iZ/qR[`nD<^~#JK"^t99B ў,1D-GF (ڝGgQ! m3pߖC5c}GLJ*vgf4#`H ^*i[MmۙGہoK}fTJk;b,m;!׭H!=˷Ct̓A#VѦmgw;vͣ6oY~ۦm|gdw8h";|llpbwsL _.:|u-uuGAWx+#6 8zp僷ͪk>R/wVn^f-k`Scn7:ڶ_O>()i7EQ)4?7~S,,% &o >Z ~ȾDnpD>} Ad__fgV?&>rs \[y}%YhXͯZxo M苾苾h=-q&1*'.9w/ Ɖ3Vz[] Lp*;afCwzc `v6?F/`*Qi~~~@ވnwiM@I@_w{Rm?W?Pr9SMd{ z@=֪Kt٫&!53lywffI= k5oǏw]cNv ަBzFX-353Ӥ3{@zVߺLfhS= V<~]욘 481d{H1"H˽6p#_|?y"y< *pi?ٳGu9RcpC 8Pt8Y $2 _0?1$E$D<(#!8<ϝ;Sxc >?Mb/~h't)-??sȑ"ڱ6tOW⩫'7_2_r:`qbgg~k3ys5&8<]X0rЊE.xC2‚}u{gsGrAR6ϡfGU_>jc 8e?|0,Ⱦv}ϬYE>|B-l=]OZRR|G0 //;u&1pQpw,D "X D!׷Kg ? v}uBf -r4}g\뾯PGn~.;| 4q~OzJ! D;v}`_&Y 1l-6>y+7Bd#lg[a>w``+ٙ&]iAO.v8;rJ6^[`-*)3;]'o>\ ~fm8UKO\a-3.;X3z웓? >_? ^zj{SWog3ߝ P* j Z~oچr]Gk>8}ۋv~|umۍ| O.B$S?PD?bU,#>P"ǩǻ):\ T.>@ '$>mj{B| ?Ғ~v3~7ZXb.9EZmPwwFV$Fg>DLm}Q@Q5ڴD>$hISFiӣh f_`V/ڔLFXckV4ՏAz ]^|hU?A;UgHأB!fP]h~K/\֭#?z/?98yS*@fߵ_/dyW X2jĈ^hַd%; .p̝YV\ jSzĠ:/ SwxiG_İ.7+rxDҐl?ebk#23>DI"0YV'@0aPjߺ~D{gu~Kp U#|E_c3Xp}B?k>ԋ~ຳ6ߜvcR깤2/뀻೿_7uߧ&'y]ﵿԩ &<~ƿ?>V=C!O' gA 10?ykōzw3E3$wǯ0-K)`p߼vw|>>=Ng_  x_=t0_ !ǣoU/wQ+Wv<ǔ|@]5=1.ӂEZZ LE-[.._ay`MvMD|1deD!5!U68PI~F7 -J2CH wvD^~$04EΊ]gZ,JΈ;TU5qΓ].׷[>xeG N"2.0's}_f˖-7!BSSS<^D+oOc$$ٲCfo|:0/%g_^|Wo~.(/G@G G ;-:i6̿ 1)ڰhz%> y{5z Bjj*z}s!)?9B4v(_;) O3޴ϬE'֭~w]HB+5Ȱ TO5XQ<"~l Yh\1&*#xBt˰!3`9NXwl5' ~0t ?0,!˛:a!6]ed2M \R\2š>̻""Ed8fü`388'z-GAʼn |cH 7x4.˯s 66 *ka4l'?$^TX.5{ĉ>ƚB$ip֠rg*j" enUG* I"L,Kp$u.Zpɓ]ώxD(Tԥoc;Bz/p]c|FjCZ$9l0q > {j3wgee%'Q<8uU 5hP\sY6%= "?D{yh׮]1t NNvxh$*kOӭZ:/1Bld2"o&àha~:DNA&.vx;{vi/?1H@D"_p 2*J&& &8/K^%E# dB5b"]dDtpzoYC&L{VV`_1璦/lER|?|YZcw4`֭Y, NnQE!\$,6/pJ$%LF-N֪nF J~4|ad`É*RT! ص}kYsƝau:UNp ﲮ'<8f\t6d{/OEX^gQ1vl\Z ofE8X> RW8Ԅ5V}y7ڌ]aϑD0[q6="I4ZiѢEdgg; 㼿V%s'۟=rwĔSw7=1phFs}'iFsDl,Q~x _MNGBl0敵=V%5eBu%?3EaM%(9Ql .T!' $f#?F BjLJm3(3#6,x1" >*++m? &8 ӂNX0zGSb-X'~m520s KeEf4VHçOX<}r%=s2|6gʱi6~c1HEMYRo`~!zWXX?#$F)A]OQBU_G"BrFI UӪdIq#1BBDLHHkBF1v\4)c**g1>.XQ]Oa?/o[~4d_8fO4 [>}FΖa35}L ߡ3HhiHk4 ʫԑ-s$ H|J~dFWWC{>k<H (Ňm(6chB˥֊͈0 SNŀD|iS'I*IŸ?#E"rSY8uę0$u~ ( zeߟI(-U$~ju0ƺ'!:QctBE ;5kv`"Qkvۏ5aՃ+~pD9\ h b(P <5 50BU4g0 *_X|a 3YoW"HXo^.BdB" Pz~/nE_<o 뫏SPU],668}9ba_?|S0bXjNNUް%-oEW|}NC␙&?WL͋]n;Gr S3 KG}ŀt=} Yqa_my~b"v 2 7|qphDc_B==9y邂N}` lt<>xMeڴi~MOLƊgu]IVkQFr,Uh$z&]S?: UhxfpQ}GKR,I\]}s֨b_=K0aڦZ/NSZ1zj Ӿ ౧ԁdLMKN}_u("q>(ӿ){9:t\7ܯ7Dg;x6ckC4v(阈'jޭk z >Z@' Ć{:*Tʼ-C<0{?8W)يy#:{NXB轮h@rs{y}Fefv˲0)t[u-꫼#CBzOǻ\^VTCH &o;v u#:G#1~Y l(3 GV)?ufKt~zj՗.Nպm;+~W,;1b;p^]sd-;zş{V*gܸxA~Ǽ@ 7]]+~HוܟKߐ"8*wؖ9i A8x$ZYq FHA@^ X_@I|ַLum|GV5UZR;\]ù#8[ㆧj)Qޣ{VVZG-.׶i:(6D7PB=% %-))ٳmQg.̞=t qPAvOU~G@*zwT?TIy~:YwNCuh-BNJY ,>w [ա^e-@Dpםf1y!zIbi!܁A0+[N:Vh: `__kowHΜE2:k[>شZ{LUӿ 2TQ-zMS~NFթQ~( 3yPbvC OV`vv:Y$8tɸ9~zYFEezȚw)F%m|Mm|!_~Q }(HwT?BimAwT?ө[h;@<=׺tT?$ol^~p~g7~]Ӱ@ ;. D@)l.bб w= d%?}@ %ܽS0';&?VTw+ T]Nv=ロ.%VSbsHс6`7K_;~?Zm*xkfhS : !v!ÍGùoS"BR@ۉƣEzb82Ӣ!Wل8^PUϬqY"#Zaph֓7 %'~nOUĹvvCn<(,GE]H>iGcl B>0Ei!n"P>V%ͼG~s o]>ғq4.t~Ъ`e;KvCGkڋ !& wCq7O>f +.WOv*V3ض;NEU :;;ʬǚdlѥ& :+G_n;OV] [u * bmcMb=ʆ"_\2L:*n[:tM,I)s\V2Jץx'#\ `STUs&ғ/~ݯ<7Kl[>WiwpOy5&֮l]'o^=|Oy^ːbu86֏ʗҟ䫇K/D!wi}~;|%l#|B-DX$9 Z$vf8K]ܷAϋD"n+{OkCM` f+qڼGnz_XL*"6KnV".ADNFߥKoZ_3x )8gIB ODTʝ4;߄vVx4~鷿x3="BLᎽ\IU8QlC%m~ ZRKx&lI*{WX׿ |GF̙6\Z~qCDT@ΞĬ)_pozf@w 3ⅩS/ ;]Uop >[w> H\𽷼tCoO})6M3 n l' ܞ :Ow"9TÌw"X-_̈́ө%/CDv CUhE\ByA&u\xzܖ%UEp0w 6O_ai>wh3;_hc7Az9 g$5sAk DvYhxa1T'BD, 5wx0a:"c1^|2F3ulTJ03 |2<^hP${Ʀ $¢æbkFzYYp3rd1p6qz@КCw5xt[w]7I n67I];JriUXHЃ/|ÿtTW}71[ ăo<Cpmc_|݆>?-?T+ʏ wҟq3p=Bحz׷ϭ$=pe;`2}/ ^W~ NX!~oB%ӷ{!?0} Υ3p#B`K/}_sX,LĮ&UsBpuOoΩ־z<,%٤r?苾苾ދǶ}R7wpHzeo=FrܥvuιD?PG_tU!$IW6l .orɀ}}qߜ. O(Ŀ6mmϓ7I>}ŸqbW8#3Of]˭)F,\<}&/MJyGLu{J0 gE~ruˤ;Ws{Q9g#s vm㩫'хfO#'^x癧 {?uaL>t&]zu?v:dW/FeZm~㎀;޹qd Tɣ*N&_' ÇI2{arq;>d0g<#g﫟Σ~:sL3N©jǿx1"#.kt뮟i 1UXv:aw8iGh>B\8~s{ H.3~H4#&yoϙj+ G5Fb#S3̂G5O@\"R"BR 1LV$c7cʕ,33#j4k_]0\ 1QC5MϧJR@|MUPbJ`ucӝsLYr(:t fcӨ)& \.%n1nEmRv]bNP=MN˘revUK,Nu.5ee(]V%N222.݃h]? ߺ~ ~u,ߺ~Ɂ  9Ϭ, "WCd/3 :-[vt:-XIa*X|B "2@$FV(:bzK,$ Ic I̛*0D/{IZΠ 6 @T H${ ӓ7Q5ڴD>FG T0Ukԑ6=Jщh% Z,kS#02?dI?R){\> I0-'鍚? Ds׽diA)-7Ffe?f bkIoLI>9d}hH0cPUUIQ== ʜA:}AcU- ˸H}QF -xHONL۩"%گV0Q.`~{1xW?3pi~<22\0̂;<j)BV5x'60,2\6m 2ZJ.[= FC`hhA &iSo+ ݪP{q&\0!+m@`7#NJ#i4D!>v%Kw2@W"{[NHriXk#23>D%CL'֯\W #L"glX0z]8^iq [xDMԜmG)A\vNb ǏA> \jKI)A(a{5yy[Pe|MK=;#3M=Ga,`~{0o~iGvQqXp% P/*1q18CautB\/}b # ÉpHUt?n *6e p=0p8p@>}Nw%ϼQfpE DO#@ݯ>>/sҜNps5??WOvɤD:UI4/0 ~> )PL;>'~A4#zzWI>q18 W,lT|^CL(̛= fO{3>C {Fz˄2./h,?AJ9`ZV֋D4 =9o[?{<`DW??{@3$Ϝ۩Y@N٦~8](* "0-(ֽ-!5$N48|\v$jjjso!ѱ[$IhJj@M;b @\I3Vyl k=8tcuحfѧ}fյf]Y^٘6Wn|;aW]kuzaY!^i0_5KU3̅e_75ԭ O)vѽ;x0`>2>0bK%޳2 9"T72qaKˊ¯E^hy6KڊiKk޳afawf,5e=y~" _=K l|s{~t-@9 Z 3,.B7ICmaKo°ȅ{ҖMoȅ,={" Ȫ1fa&iN. :&"d!N۫ Tʋ.Kn&ǟ3L{?@W䚰;inµ!B:CZTKw{GUE!B*19sCݰᯄŝ^ [o^KUz0%./Um|ߵ!پy;<J";n~O,v|Na6_@n>D앁󷼳S/}N{{'z1?woD];Yʻvy!ԡ*On6W>|リ˭V\u=F? }Mqﱟw׬/Ŏa͞J%6|zG~i:~l.s`=WoK;N޵@9ܮ5j\.ŝG8Q.j>2vMhߤs׈z /˹oq3KhwHpWOȏ~\A܅@,(ǽԞ_>ݭ|5kuu^}(X3Iy /Bފ>Ufj~x%< .*оQda i==mG\O43&:~?Jsymm!?/|ayΜ챿5C̕lBC~~D]&2tZ,AbXbB^V}I^'+{zRaƂyۗ9l֦&"AZ~Y)9ӥôRVxl9$-mM~b7_o^qvˇxy9M~H_|[_vWn?~܎A`+<kox[/걟'G׏CҷkCwBpih ,Z !r[9p ԤϣX GV揅V?w9zEѪaaHe X\Y?Gq71NSsdԃ]?mC!C`{{q9 )ך6儇@5v_q5j@_ akusH\<  W1x}=߿#`A@A P:Ap*KeA^ TYfAHpm_`P=|%ePɻԾR2" 6~]|ՏtJ(٠z3%&Y=cUI:/eDJ@e:ۺiK8 ]~~ L&4V Tuvخߜv} f{m]~n9gJdUgϮRKO~|͏9w_d0Y$)V@{VS\^ew5IQtD!y*l51> ~O#2S2|{ik'Mvgd± Y1T?]N} PL&2ܵ L-~ PM(0 _$0Stb] `z%G~N*NM*@,\l۵,QS.*-6㬀KWU ,6j\|:౵S1[c5mVIuXkSP? |E={aȱڀYE(LKQ5i4IK,uQoufl3 F k!pl쒂 Z][wAIԵ Ad 8y{]Pߣ( Ƅ蒯HZ!- ξ-4B&k| ! jo^=h Z~TILr3{N6j`w-?O9O)h~jHn~Z]?cћn4vjX>S ;&Abb..3OzOyQlWwM'|\:)Az'vT@:RqNaK%H'/~r+*2a?}&rF^pt1 u1eO8L%,c]J4Xܧ,uOd_~E|eQKVOEKs-@e퍓K?o+,#t-?OfyAMqۂOV?!`Ӟ?O{^ \?My>NnoeN{pl, vgLU%{ןJ/@KjRB@šȜWj]?@ӑϾws˽?C_R-9*7::{Je'緟1W+z՟v׫=}>VTw+ OTKt!"m9j#\^mაorܞ^upE#o\@c=w)\3}?|x pFQ>߯L j{q&~_ ~,pR]c$r-զ>ý ,Uw dgWOt}n7{2;eշ>4=r׌U{3CAA+1~Gswp=|$Wc?p_;a7\ ס ,Eu7mG]mlߵՊ; Bo$@@8~˫Kz<4GQg9@xnH| \lUe_ ^nHo}/ j;a=W*ЇKHo5g/W*GVwB]U9,Qg-)ؑ~tD^Â譆oj|r( Q`t  N5l?;3|%>E_p! A-_=-|뒿ע{~nN`x;>*Lk{kXw 5,])D̯؎,33Rts| E 5FEvz~M;8bp_xtMN (u6>;]kӥ9U\e8}~.0 D6t Ej|=m>wp-Y+QoeԸMϴ!궄ˀO[uhuTsgK؉i#GpM @Be2Ջ?/`h@;|"ZN01Gx% $@wYU{~ ^wHoK~/ Ffa"3v b =UW>HQH^ف燍mrhuȀ/ 4yO}Z`JMH#fP)0o}]~Qll~ƗܺyV~jqe˖5O~zB yA2+4#rc=~{byC>˷-:ѱM\>ppqV^}=s^zFn |^|'!PI*w~,~;Py @J7]y`U6׮[~Uo+.88?ϫkv.w7TOh_bԩ?fdORi_om1U=F8ʆN]̫?uT׌P1]Gw˞PY6~nT8aX,-ݻ_#\C+HʩS5Nc Ir}ւk+ U=`Ww+?!J $g_jn#kPE/Xzs}@S6CXRYAArwQTogfmzZ- &";V+"EP{BHݙ$tR}>OLyٳٙ9sN~@`M{wS~.]HTvܹ39s\]>HD[Ϟ=[ q:u![naDԩS[v.IRg,9qA<|18cV>bhW?}]5gOѽ;=/>Q EGȰaaFV?E;qt!ɻJ "Wjμ{uG4dAB Om0dUB);vV8>^Rdǎ?~+_pWrVzoZ75mr8H؂PVտ]ѻwo޽{O1}s֬߻)Oyz;aw TId0ر:#λDi=ڒwq]]RI4 pȐ^wP ȯ`xᢑ LE%3}_>@~Fn^:h_l0 (+/f􏖼з 62dljG?) JX-|YB}fP) "eIM?ó \++H٘\_~.*jLPZJ_9t +7&$4mERV[k/^KqMpQr 4&ĉh[x`},gDMZaM}4kC:z)K-V~Ե~7e&OyII`OlS]tkZVӧO7i1qDI&˲GD:sVqec*ʿnݚ'$p(B}# `x1=}աXb1q>Ƭi'Ub^e.<V{<A~Hg,QW-{{N`-蝟4ZcGiOllsȊjgW6zUÓAꁢы':UugmO!I6g/ Jy5#*ȉjD'ui5(-39rQQQ}fmI!nBbP-?xHŎ?;)ӣN@:^IKUQ $^VIݽ{'N٨/:.-eٴDu_inwuܽys=ozߪq? @kW_JS>4F8&攻j+:  c%?ƀc$-oİ^*TXL=>0#.￿PL{ ,%E u]O=bUxY:G-zajjf=&~ nV[Gty_`FydZH OVLXcذaω6ŅVk/Vk 4zSbS[sZ7  J85b}_fȒQ*QnCRA>pOM4˯nWPöM>3i^)ޓwIP+іvs[{N% W6W^⶟ϱ'LgTrZ!-ei]65 {f%;G/Z_v$KׄK-q,#S -=7氘8xMʘ#6Q5g&{Uo~Oс@3YuSJϕo& GA;D+5)ܪ7LU]计'Լo%Pup1XN'>bPY'1Q>Rnc2] dYw;ְa&X,&?\qo=֭[1{,nƽ[QIy68(9 #ό}OXC )ƣcgdC9fa1v cD#lFgƀ&ɞИjx[/BE(L{v'_=sxU m[O{GDpWbi|?gЩ-r#/ݲxKW;"2ny2>7#*V-yzfKyeo=;"R |5V+(CV޺Zl?aٹE[S#\E Dj {\fQXT5zkE ^E]2Uֹ k~&x[v(J+43쒡୲+i>ILWU<Ǔda56%WI;48F8xwW?ϟ<ਧW/.dk0K Ns{\X_7wJ7{d :=p̭H+ߚo\aw<)km-^/r|sAx/*[o?|q=+=n1Þx2Jʸ|SQ/?7UhisQ=C2#oj1Ӱzy(|%hL&2Me>m/갷7̜ Mma0C;ӽ׳`*K¼^`(+ƞcz0 v׸p":nmLܶ[;RhkC€eP+LyWS_Wkƭ¡Cv 3Q^f "cjG(QF`_<9_#98K@!0>X@ xf5vBMi|~ kŴQL8q ]/5gV11i{Ut} .L Yb֢`up*Aސt=Z / 9"Z*bCjFޠYN)VP2ef:wHrs AYyN%b 0(L+0n0(9> ~2W5(3i/ۚ,\o(,p!]<|gPF{gD;OF]*ջY ?@=g\dq안ɰ6Iqc˝4Ow=~nOá#v$]{p*Hkac(M>]'G<9]'G *x5DD^ } fDt5VaټvhҠTrg `o'd;D$]!dG-t11d`1vUD) 9ofw[I‰ Y[V?0(A ~DSRE XJv EE2,ӝouk o<*;Iz&~B+]HT?11^' b_ wu9(xztrz7 onn|ϤS;ؘEz&Ϳ88:~'Q<JJ,0p8zo!>怜sd1Vsp-+&sIT؈3v@e qC Zf6hР)Q&&2`I`@ ǐ覞WKW:ݧ}ޮ]=w-90mڴz@AANk_5\kl_k^\۹m;Uo\йc3+e\б]8~k^ڶukHJ~8P W?w\)pu3숵vo\lV: <+%"VSbGMPL AƪuWʿD f=ĺB7(xJMٿn4>:p ,Wjx{h| :kmrfAs(ɜbVkh| D^^d =ݎyFZ^ٚ+$!&K5;̘.]O*p8҄A-[r vAM팥h t:ݒ;w~ƌ2 D1Pq 8;f +Q8 WOK fkˀ +<'?u[}(o]6}Yhjҏ-.)JW!n8O/S|)C9)5 E%:5 @&tk}LB:A^vFE&=yYW59ap֏`=j%͌=mX,+EYgȐ!&IDԗ>th?s٫GA;0=N>d2"`*Mx;_e>X,*M>{vPh&~8RAF*2/1@{:NdsEf{+'$$nq !qfkoYx(=!!AvQxJ8U}0PY+`@g&O936/#)׵V^xo&}L48v;=t-ݖ;6KcYDiLmS{D}1=J_xfZn2[E0HKV߷g&+U`PWo՘Ty{ 0 x@ʐ2!oBV)a >zgq\\4y| Bニ1|W>%,U_RfR0E),;/f/51ieup5#ž&)lo:E"d[[%(@J^VxM!'@-E"d1lkqc`tM ,t $la%ږˌ#nѵ(71 bxyܖ]2fR0REfE1`-bA R9nm'8n^~7n޴|_ߦLrVnZscǎC:]^-n}\-C՞-ssoCo^vlNxzmH 0a]m VQj3,.M7y%$4^C~PA4Hf|IDAT%zv?9'OO:i}]vݡuqsIZPڱ#aΝ Yli o-"2\e0cKHQ-AXzK94udKf8fCNhF<#矫m۶^^^^ ~ǎM[b30N׺`u3+뚐%TCy l&F<8S6MMV*'ϼ1E[E~СCvڕ , 0Tp=륧Ta`TEGDnAK2A Y"Ȳ$ 0Sq>:UTb17ؾ}{2ʧtj([REXݸ M)f]2Xm$DEbK$0[Z6ƷdL 坖穤qo0p[.?floߙ[=d#1go߈Ϗh߾}sͫk֭[?:}tWc4zVjG25[_[ }ؽ{wF3nC&NӠC9o~0fs~R6fQudW*W|@r\??#J=c+JfqS#z%%++4*0 1V١qM PVCD#SC )i/Rt88,tc`" 6lΝ;6-0^Rl~s$0 EԎRȊBOc/{O5ioM61`g|qI_9> p~?5ҧh;Pt;igr 38x| 5H ߵdi)ύXppP&;sBV{i9('QAXX[Hn{okMx!;;[t[xAO̎l{oO7GBv۶[h͟aPp=.qPyWϺÇ?_~ꛯ$͙3Ǚ~Kcԩǝ&|bh3 / /H/ W]/4{;5ԫY0oڄM 2bl̲Y,&JU6f`6L]̥lG5b:PKe/#C-vlve:ݹHhult5i^?"pqڦx%  瘳zIz"C6D*rjkXwIC<سy*<|otD3Aj7̟:9կ?{TV q_#qn̟05cľE Jf㍆/|hZ$ |:rB}RSS Vw+C\x\:#<=:j_W>.jg:6./|7no 2q"#♗ ]᳓ϫҒ>nki:R2^69*SZn)weF/DxaZS?<8p#bj\uFUNkZ˅5Ž_3Nk,)?Z\f(Tf2# ȅz4Qh6&(6%xaa^^xke q$QR̅}-ެϗ]*8~VrXS]%$$ycK10;`7+n@~gA7gj=c2"F1Q0 -=foe,&I8칆fAb}L.ߗ{`'cF\>O8G=ӽ]iӱNx DOvyz| }rRXx;@&NOl|w7דmDO֥q{'jqxhC EjN05ɑ=[^?:ɶ>.685"z2*"bz|#iȯ?Ϊw5w_3|}:8կ?{uw_3kȟ6aNqCc <Ȃ)wg#ci)W]xv)If=m+zSƩOU+ ##;!^q!בC?!QLjWi lҨd]GrkSS{|XxDyK(#yY?jn1mrթuݢ+ ڱqRM :[Y[ozN͸:iJ] MU矻DVVF/&%:Z}eV~_L26)x^.Kyrj_}YnY?UǵJO<M=5`r_5re~Ha3m U} LnRgܱ;&k-g#孽UW_1= +Ƽ>_gDB ,㺴Mh}Ū@{ϻd>G|< Ea{6Ηw7_}:woS|eɄDST\K8i1 + %gи}O?:ʁ+>42ޱ(W;)|6 uʈNI_,9cl>Z ÆvXTRi*3:pq/?jO2]ݱӾT{rT:S|-q?S^o\ (x/<ȩeRP.]Nݟ+춢Bc32" ~8QYס*? lM6K v_}ͷi Zw |E7ۅFaݽmjZFGoQ9l.BBKc$a*#SޠL8Iwln]?U-t#$GHKL?_mc~_$Si/Kv! _O;|]5 ׃RxԳU(!Z31a>}lٍ՞HV-!3'zj~@LR~0Od8f/\/*3Ժ_xycL&Yz{2Ɔ~ؕ́W2,_Eqxǣ,s{t=?M僧@D{#""70ra;s?sވ^չxп{3c~{C.\R$$ (W2\ 1 S TGt0 ۫W]^p⃪)!@6C@Cgo=%A cehؤ[t;rtP:>so#UHN8cdW~gnO$_>cjGsQ#nx84XMMGbnș򿜳ە6'J"V~F=>>ߖpyO~+3 CޯP)Z?_oYmNltow;_!D즿ZL-Ο9 v/؞t|l\+~oAQ9dl8gY_~nD3`^_s-au>~~urC_<Lϋ<yG梛ΣK)sSA!Y`.I, `y?nPh(V`R'o՛yxpԈ=o4DA޹UEÿ]:ez?FD眩Bb#" tHR=x_YZQvQ" p`hD{ˀZ'aCO(?$:CcGV*+ȅr~w.eg9;?YUd4cyd^i5 ^.rwQ,Zٳ!yvY_XU{~y `4sƇVѷ_hhub5<%e k+8剩,[dm2chEOsRepdF]ҧFR0W ,LPXh2#6Z_zSc6[8ZwLV&3lSVoSu!Ӄ V{gawƪ\MJ[?#wŕ?nMpZ?}l)/Z4T7(8A[?] sL>ܢqT%(3LvE=pGJmC&xliJ7hoȃ/[`&7tob2%ձ*8c_ z=!<yI)'e|ܽ nL>w ɝKp(5US}9w)+c4/'$䢐A C*&)2lN\uQCUqP2{/ޓ$[dCkĤ"7:~)`<@:o2|ŋ7?LDS^p4T{L X&LA;",?q̇0D;UfM-oKrع.S寘a"L*K-B҉R5ךϻo 4;u6m-̽90L7fUDs3E39rGDCN˟2z9-:Mu.qZ\^cN;-lnjxRE<"*:2 LpeOu8I 9^6I2.пAm2jf~LX[$ *WQ.dEW$$&"aXUb܌pҕ2z'q'Q45VX'xr[ܓ  :q{_mo,L 7_/֭[YpU;7čGu69IA6GřjW05;>6q A(ttajvnYrʱ'"3^ "s>cś%ƀ@v6e2^%SsyTWfKڑ odɒ%IZhѢ&(㞽ꊛn/?/~$ioݠoK >䄥̲Үx.bxאe_! )e]#k?Ү݂huP$s `} K3e{HstrOfvA4>2j)air *,/A׉>#dx$,`۾CsY7;:1a1|d +2?X+t/yS:&Y}7,7.0s'M,[7퇣2+|#&Y>wZ${_&ĜvA!OE_LNi_giνFyuS̟1}\jpg_o{zsT{,01L3";| ^J>UF;\,ϘUyqrVKЄFLJ[1} u2wWUcWĸ@Km==$TmӨ;*A<ֳȊ9X .̬Dh@k@]rQ?dY~Vl37Lwi1 RM2 y6 Lǐg%\5< F68:O`sW, pzY>k (4SNja54idCY"D-ZM$(W@+3sg"n5 `@A{}*[oC!92ݺ>KΕ_PhƐGMmpHs;pϰ5bƐٶ l_se:LLH^cvԐ`X}^bsyu噐/ \S'{پ\7<ㅽkt:AЇ֕?.kHW?V'2I([{x~9l+ϟRUN?lƬ(ϟ<'Ch_gȁkJI7XȤfuOq<<J8|}#0XOvFX;w*b:IsZG\Ե?mo_JO=0PiQV`=Z_ F"^NJYUx_/-rin.13ZW /?~()SņnQN0Y_׶#~>{$IZ`clB=; 񟝅4Z{4.ycXo1SQ zp n&;Aj/U#n.&gX#1p)8JsqjO fgtW--oo\Y\z7rtM#_VڷwƵek9+3 .z> ߢ*L낼7tbO.(hdRߺC|9g{$ea\hQ>y}_l>pvߝ(`%a>X:® .sGB(.pZ}ZR}P١5NSviglz.{jlójDY! LiLoDy` Z:I/˓\0F[4 ,P}G Ԛ|4*k~1^$w?yfOߪ%ɫ(K~û/V#؊sGq<-.$B!@C!ƅAݘ^RYh&q^\W^ _ P9w@Qԝ862aλ17FJRwXd2:'w H.:%ƾhfp~<`z؅s$;Pl: s7_M 3SJp Zة­SBl(2sp31oubԊ)ygQ :£( gB;]m--/zf0v%c5BWž8@`03_xbQE3SpEoCzf h99T?%!\Y"N߆ cWtmvU47>לO4vFt ȧc)W]BhhkԫjEG0{:OX_qp;Lj>L<3qSH^c# =,?ݩeХmOVAG雓?ɢ\(8wҦ[koL2%L8+ 9#E>恨 #J|`wï2KO22<D ޅ2n។gptcq"Ǟ-tbK[  !\YAw*~ϲ!t]S|7ǎ:4j Ԃ™ҰW6Z"_s4IG:ptG{4E~kϭ|OOz8P<=x(2/z1?د+o6ӗ+T/L~u1>E)h{3tkDH`d5}32 :ծV@p @8nI2$W e-; 0@k-DW} .EX9!)Wʫe~He ʲlt$b!#3 UE~䢛g:VN8);eo͟it3tg-8c҃\njs(f' @?У Ƥ3nCQM=wdq3=޵2A£ n$c.AP(U#BXw699J3ti93ۏ=A1Kf 'd] c#PagV(?if#JHT ͷq1(t"E; PqA!Ԉؽu7h2a!^:A*%j#<,x{b|hǣfW[6K~7\ND] 8.nE88tZU €A鋄ϴa SHPy0: 1oyc,A冺)7P*XDdžmйc(\57?Dt|k=IS>@t?\7M?`EuLW`d?~C0W|29mV\rߚ?S6(liP _ӑ,^oVXֻ}L_$m@FxAMدޘĘtb0`uXʪrҕzNKSex؝L96WRiu?HHH.q4$PLF^&p~ V^@g0wt@ Z5&5lzo: S>kĭOثuš >#ZD˙`\Nٯ8>w 6bR`mڛ w$Ny t%QAzgKD` uNnVa=g 8cAOI. \Ɂ6~GB]́F)4ϵ!5]={ѹ~ QB]%-9ͱBpҦ@ ι~6 `"EhɶXbNi͟b&;ꀻV _U4&~+J͵P{NIT@4M(Hf[wpt:d` Z:d'~>CV[oћMEG8WVy5 q "Gw;ASp~)?qs7c{CnV0e (3vB}q=4K9GQk.l}}45H"0Lw`t[A~fU/݃A :GOryÊ}?4cDi \P"'- suW(? JWW@Ia:6 DGp }`n))}_P/BD;dZ$bm=/9'mR1cP9MjPE=-8o͟JK""lfG(LJJc`\n;|E '6 t Psf yYCu w/8}M);֣wOug]'*2u}S)a!^]0}g^C#Wf0[@?g8~H1pcQ {6Ov!_?[Y%DXo8+a]rȍr$z9HXVUqJ7ƞv0*U"J1.5;7W s@=UP{\ZPv*Tezɾm&y(K&ZSio͟9,Bg,4{ok#Jj2ju.()NE:Nڟjq-ǢH/(EX_s9ݐcE!~mjǾ1gT\˿fC]{,oPhܶ'9TOBr WUeᰜ ok4Oރa3:7ko|X+/}~GnS wBg?o5\Ѵ,? SFb@t3u[NX#gAĈDjtg{_v4@1zNk9{GnhpN~05?=kkFkFkFkݺu ѣG!iFl66Dnnc }=~Dq[ߞ?ѴhXI@߾}5#O(flY'jy$YKn*ȏ3YxGdA2]m.wTb߾uI1SGts,|N2ɹ3f,fx˹=O=Z5ZyѨl0/*W.biJ-/ɶh`)Nevj8SRa!G3K-8 xCq:S}ɪYf@S}8vB#og@y;ay;G-#ogFkFX5[ "0qh5}G⪉ cVC YFdy過֨y~tbTP+8 D`wѢc/TJ| A_/ѩ>dw[@\@%$*nK w[oWFkF[nEh]\瘮oU8ohZ׳NghH@|<R*-1qLEѵwV*)~ې@h1E۵WTJ!Nowwڞҩ%}1zF66gύÂ!!͝;zF,{I˪sQ'&'(n ,ps._R#8nSn{N<'PQIXd\PFxNVŒǝ^EY,Vl5jF pΝ ߱h#c$[zH/0-c$M.2SB$KiNwO"*c)shǀzM\;[It7  ՋOI2 foMҟ٩YvZV2Cg^&dOH5*;i L%INɟ{,s7T9%7]SX˦b8!d(9wkS>NLXLi$ 0k`eB`;>Aj m>);a#n vY LEdH\:Ġ3xe X L$s"8YS;O~/9sdq#$@A)a޽c Ig;g3/}F[aBac#Q0D|lm9Q3Q(t|(9(7w!F[-dn ~_8~a`Qs> $ Dݯd?mc I`Ugkc86lVKC5O$F'y+쯘 #`I;&35|$V'W7ukgΜ# ra`=oP+Mڨ~Ʊ=oO[b]W}-o8煻?jkT;0waW^KI^~1칻-+} Dy?M(,m%{ŗdY yt 'YH3ɷŗI{.~I9.(@`F1`ʇg$K+M-C/(e  A+L+WC&|QLE#V\y}&TOy%(p(QVQ~ƈ؊ďf5'HX/q,BE#_?ٷɾȄ> BPD0FZA11'jۚ?FSM H! GMǗ:}A-mI uФC9\*0 -2H :~㨩S ]/ LOg[$ LC}r~ѯ.#'m!ēw눌/p$qˆld;GIE㎏=2Ox&`{x8F:%HpW9%jBai|ic)S?j+眒?u/9Inr!O7ZlPE2Gd +؍gؗ55 jN0+#^};W+;V&/2I~enjN+D&OJMjds_Q/4߲l'MZJ?qj巋^X$ýݬjN 5ĉc%ɵ_9Jflھ$c,pM1eA,U3v% ZMo*EbuP}6(F~T^Z;3df0n~'V+O P 3*_$Z Yc0WrS^T]?52 A}Zw1%kh0\d;cLK״k0+Ap#-!~Wsd'@PqI>v C.``g g=r_`s.{*O];jt+pND5/\ aq(7'<B %c2jRYozkس—:3{TmPFhu7%J}*|ǟ߻n !|U.eIV+0&BTgs-mqMGR瑤qTR>^٬] i UM2a;Q1uq]RI=O<ڥGVS^L} gU5KM\<ɭAkSY_.W--6{+b@KZ_[]w-`)}7~KSruNfPl{~GdCUiÝw^* 4OWՒsɟtN/rs>/?'K ڸV[x=1"Y #zо7([9(I~N."&LV<8 c *b؃ʘMu'A0 enknx0mg#g7W睴ReAaxU *πw/?y|. `DH0yn^T9 ~'eO@|9)["we(џ.٤_S,g-M,a)]@Ỳ(ʖS\86y8 \:ލ|p5+Xc{q՚O)?4lpS8̯_EOUi003lî[99K"8Z,uqaS+j^Xtхl>j~~iL (6y!} qg5f'zdTޯ1L.fT2f{F"dmE:'<*c-*0h2zx}A!Wxmه$(?A'dr2} Z&s Yc%?i&h_(MZx$UktW{^qXJ\R6;,*8:nF=iDƦq;܊._P`7xO`*.EZd8oi+p@^uH6ExJ ͜*Ǣ>­/4WE\vE`CpvQEpc),7>3A?)o egj$Fh[{O)xQ5 )Q=jPπLY^TmokG# ueÇΪgW8D_96205Ң"qZ)WZ.ɥym?=_gx'7w$֩d0d3T I-.ܥ_Ap8[?^ɷ5gCg T>6t, n5 Ymv+pqs{}lvT}h-|u}ɇKDZB _ Ҋq1h:,_JVWm)mU*"L )?Qԃ)K#avJ`Udƶ꺒缴6tcr%`|z>zklWW]pug̣,efvYq`{ȳgRWe({t{2&Ĕ٧p& @?"qz)^?y@-cUN_ܣfyL~2NXXpmimUZ¿~ *zUQghKP(IY?“/XRƑ?f>zՙ?(y|y]_S!"%i7`9{qAĚ(,?戊w05F=j}2y=m 5NUk[VϭȜ^C.gPˑʇE Oh K\Z# oEW9y1&U?rD}uWan?pNTIѺ|l#t'cqYdw]%NWĹ_x i^=/5:D0]b-F(|'-]HyE>PgRBt<jã8ӷJ1+=8ȕbQ4Dq Ƥ3n nen>.?8;4?V|좄2UB)3`K ӊ^kWԷ}V~m(3AD7]㎵k,\SV3 Tj1kK'||2Ig_(5޾:%`~:L=t**z;$\~gO\Mv`'RumvQOVo-z`vWzοQD pk`'D_~6/Z?\lH?K)I~d$7Yqs_ȴA&*9eʤIZYِZ޴~]Aj|@WșC'tecd?':߿qZW!-Ha?Ʃ[vuHr>{έ]Iv,wCg?sߵcǮ<C^T5)C-wqa2-cƋХ[v>|zܐ>ߜxYPZf~>ҥ?Ov}U4+pw3􉟝[.X^~CYxi]2X:~HwXm~th?WӝOњ?c=1_A{_-!ZFȌɀ, >,z+#E-GD=HG+m?nk5TLhn5oUT䧘W?W,Kf"F^EJ&3dK=m~˩=p Ak[4*D'c;|,cٰ]UInNnQE+-}N;uf~<4?_͂=PwR#{:~@|DŽx~yTxq'Y6?C۴u|_Ww'h[a+|7i~!{{,5=V[rK9"䢫~Z\pTz܂>aU?`";!?+ۖbBJ{um둔_ |jw֩εWrRn@~ȲL]&:yc}W] &SV__q7:N=|9֭see2._2a~& 0?lލ>?Y|!]u㒔1Û_ͥP#Bzd.0} y'.yDMzpZW7QFTfjک?ucIjr#CtpѱBj&+3PҴ3잳4AU[ȀLbPr<5Iw@>+!+9wz_3̑`5}*X&Jq|ӟ {bHܑ#ww2 ;4?e[ܑ]CoռYRnE=R_^/Q$:^Z1dQPl޻sR##JӘKj7fuZm6Mc63 g|4vbo^4#@P^?)anwZ6.KJLJ9q dv׶-2 ?# \F:qүY4˿7Yfwm!0H/NoBF?q"zxk?M&vסm2{ؖ+G3\ O7O\:7"vׅC3.?DŽh0\nxV_YʩweMS $ )Lu9`R7Z2E`+#b+?Ԃ2+}dcϽwZ2ɤ 5PD E\]e׵ 4{ņ K@z~=?& H&=̽5'gN>EEh#H+0 +WOپLQ,j4mx$+`WΛ0c:b p[jX_o[Oiü7"BJXnw6Ww_:9ko1[c У40ѓX](Wg}E> ˫kQNxy)="M\_;FXV h?!qYXAˏw"T FB/rxބ -2'&dFo9n.XI(l6g`$j(m9SaMjWToe߶v`Ԗ'p޹|M#}o@zjۏ/*>y 'OV"'a5!bvUz|kQJK|*'PrEO}.ޤ> ~l%3DT>g{&_X>l`qN~ uݜDgy`u+!P8miwꏤ\{65>NY{~9%DOr?7ߔiOlK_ݦT?X?LFL7 *pd=O!a #/P?J˿<sĨa1 vFGZ.OyJ@]X8{ y 1*K?JqO7.XC@Y7;m_M8e맂*qoqՌn7ND%Ɗ tL\q48K`8;{[}J8;3(D  m1v_% ~A8UhOwqZ-΄Gxt޿dnin>^8u:ms:3OݚiGl;3}Tz;$ +ιnڟ3%m QZH>ΫV  ~`f'k A@?;P+@,GcKzA |8} G/"3-kGb'[N-.K?K>H@#Imڇ!h]3`d|rtfd{dڇo׻,zsFpsa h&|y!ϙD[OH>|5sn|Y>(}@fl?UyP_f׆7b2; Ԭ"ë36DQQ60. b8 ,ko?u2OOnmK$79\хSf~0YTUO̘^"pSx9/=觯,oo{D `K: 8gyU3L&*b[4W(&wj>gfxdUQV1' yG&2 : _/I}0=x}wL +;@($Amuh3 i`*$J$,M m%B;)Ja4h">;7ӿ?4rfDb('jwͫ yG&vTߵO󯍙 Fwt2;-_>`Ug:V7 : ęqyNc.`"`ųjnNxvur~LcG0ǎ}/@tR?lrJGdVǃu ,oa0{ږ}$ إvNCx"M/o]>oN*c= z]4߱aۖa.fTe .PGxƟs@:{}+ [iT[$}S+ke|ߝ<0|Jd`vn.)"urg] T6sM}S} x`]G<>~l;@BK$p6^_`pKܬ+-J`w%“HN]<vSh"Rl:,v#凔*UE \?i?u؈p%퀇ڌ[7*hb^$umN9,F“pCC}lZѪ@¢P?ˌz~stzr˛?D)_8mrXY8ǒ^CKԬ7ŎtXQ vב[{ӷ~P("SwL /=f*Xg=~b˅V՗9 *}jƀ׈gfdud:PȕIxvƏy Yn d;C"+K?4Brty"p;^tLS:my3=p a>~߯K.˗ߙ ۖ_/.)+zcu[v9y_mgLث2dMh>csLE9u!-1a&7( M0M]WsB*6ټ (6Oɻ'GDU@ n/"E&K~w>i,7CdT| 7 ]B/r_5~u~3Mk|ŅҤ‡tC>7ˏ.%ӯ0Y4:F{/byDV$@T8A7?d]_u~O-s~:3ZX (,&eM͏nWKo~rŻόR! 255/\,z2-J! XDuU@I=6-sU#! T:=_zj%Q{yᐧVªb|Tg;J -:(7s1XP4'2&szvUh=^MQbX tR.,O!/Ār~+'Ff|?\T[\~X$JgG|W+Xl:Az';@/͡ d6d<; b֩9N5{ķ\,/ d6&;ʷ>olkG0`VETW|4(GSˆAi;f Fuo{#~xfT*qϛ1B?B-i@͈Jq}7 T u*'{sg=G܎ B ;o>fƊ Ofe$F_zL]tOfZ1Ԕ_9fGʈwSp7&\4U, gtSǖɇM' !:sg&-]=|Tuў7]'ف^9LZTJ"tGpO]BiY5 T;jꮢ_!x43VVgMf]%+,ru!MĆ fP!>%c_i+3?}]D"kh2FF]wMiz@8p7l [ƟzIϲ?_9k>򘴂ǻ[]bb%N<`SۻX;rP@IY㋑{fطwKxv}K2, ʠ{[WƇX;ڌ^%YvA ߩ0k_^S+kd`3A[X;V%ab߹3r[@ؤ`k1~/||" l>筀6icm-3~[ڿ:t|,c{--~;U %J`vfPmo?b;thbx!ʘ˯AٿF4E#{b_'4gؼ#7 S| 3#1B?r.k"_ [] }M֦^;@YaTMcoY}bJvseXq#IX^:^>*WU4{{ YU;W}=@d(3 A]htý+~ 2A+bsğQQQ߃9^Tjn'A ޺q:@S]ΧkđcP7 n;o=_Tm`T*f Ex3HClr;4%-o7W%y߃h"Ɵz($q~}&-9wڇ ogY^Aدt·B6~_zN]}^N,|O;aCCヶ/y8'|FxM;S7-籷{A=Tޯ1p:Ѧ1 '&4|@;AG[#KHvb^q"$󡡏6cr 'kH]ЮHv^I3{hPh؉vM|pHޡwQ|^fG Q"Uzh}(Ns`eA>P IX8wF'?Ӌ__@FL !?ݝ>x!42mf`sM'/%z\Xf ;}(¢ 53l?[t/,UFn&Ppy/M㖟T=ۧ`Y`w Uq [8n鳇xy319NI[η=o켮O⪜\}w723Rq;v"쫭gYRGOퟋRוm\{` wk?.2TPAaOm]_1 &T AK&9!ʐ{F=b*\u0IP7W|bxq]j>#bDQ< `ǩJi퉀vWSUQ1U/_J6h"?W2R$1e~O''Uv7ϾwtWiÒM׿Tkv%&5|x$^kInQq55ٗQ(j >ڹ )່1WEVɾjp@dݦm^MPԇ^ {s3/Uؚ_?okOZS;V?okON\D`u(*Čf|=nzT̹@ F}bk脊/(lzT\l`j׶3j_x|mQkt39v}o`'vw(/q`to@ō#uK4뭃NrTuK^׈sP{ⅮvWV[5V^f%B#@9]ihN6+҈!puUb GKPeA3~^PqepN S#fA<5g.^_~ӫ2F_Ŧ_8 H\Tg͡ԛ: 'A,@-$aQh 8kfwN2e}'NW7%$B#0 uC^:az20s,l F㏌x)6wQ&*[,`jDZ-)):uʪZ-u)Oz:>%l6|>hl/Z Dɟ qgt^.\ٲOcGTebp-M`6ysik7Gz;fYcLUcuVgCϪ_]S&in0{Iwv.j8C`usҽ4'{AOsU[dr:HF^ {E_1E?k۾w\4 |c|w7lȮLQPUoYTpoxʲ.\vqknA "iKH?vVj~vYIV/^iUg%=|ꬦΞ[?7oOjmE,ɩv4,mm>wl*ooIN_)|R׿UzP4.PRRmoX6_䛽 aE +)*mX*5Ħ7tCџCK*K |WMc /q[ڼLxosժK[wgk[غƝ3ֶsc5><& @ɳ߲rbun꟬Zɳ:VR s.v.Qů3[KeKtJ ]L%@r?R(.;΢c5fOZU zhN2ڟ_8q[-~c(Lu@kK*EYpUTV! SUA ":VA5ѶR}TT Bs 0աz-_REEU|h* z['h0ա@%_Sm+G1K {GSڮλAUIvR ĊDH}o``$ȒE}E/ocC+zV_TZWuR)Ȃq) iPVAGxEJ BxŋydQHY!i^}U+AU_<;! *^Z>m+FB⥁}~H@ a>3fj7pF`QLx8F[r]כr?A8hwŜ&ȁE+ٷiFڝnoSmGL{}>#9sP>cl袥ioX QnXzx"ʚX_~|j $ߞAsmX%i..%@}F-ݴɭnUn^`qp[eX UY|RUI7;Z7q/ǵW'At{W$7&7S iAZ߷oIkoITn@r\?| I ԯKɭVRUZsP^.J,΀ (mvUQQc UU,iO!M}?RwxVYpH *w#j?TseuHM45~C!>|X&ĩ%;|g4rؽ'9^vt_|%o@qxz^J۹Iv0+ûbTkQ3^VӚÛ7?ܝk 1OЊ,VBl~?ޏ ˅tl +v\ϸQ$A,4tFC t0퓪( 8jt6N } **َ`$c. dnZx)HCȶ~Jg>zxLتA;?`,Ģ /Gy?*A+>VĶ"#JqtII3L4U2U5w(/X "qՎCKO֛o܄ /9LȱHYbB!2#LZ E@loχo(G B{3x%@fNAɘc*N%>|q{ +3#N=0aN|^$Bٜ[ZU]w׵Q|If=!tvoI6WkF@^z01jE} = +`A KF#6m/n}azd_Kxdn Ce>L҅ n8L+/ywDC`<76qKOܰ` (Lqڛ3[_bw[]{ƚ=+Ie4ۛᇽ3?LLaZq~# hسmۆ. MM+Xୄʼ~8s]ͤ-KϽ}md[Ǚ7-aC:1;" Hm?m_ʲ\A^HbR[:l֛l 鶯s]Z&ԁ@Y{PBD={%נsYv% T`of"$AzcǻPnIbxZqDK"U~2;&K/-Vƙ Mк's,B<<-W`fueĘ 1U_z>/W])^u:m^pW6?x_߅x#{w%נsN;c$yBL +6+ Zi#.u?GRd Lrk+Ys>58y_嬳KoX؃}{vvVjqA~SnaM@ 9m/8AI"s[dvId?G0pXUu~  }1LXas> ƒE!{3> |dt._Uy/|]`EQx#5<#M4ePWźsdY#/$8n0ef 4!ζ YI 6 ̫ž3zžN{^YDXlKn[gë?m Xw"ߑX !|ҖǠɣ>8D~l9ˮ^8е.EM=s?qˮ&+z/׮o/O<*+_v4hq*0ܢm ՝& _%Șz;Uqk Me݂ov.z0a_ļ@ӗf :?աߛ|DzE!kf>@%6#`3@]Yr* ̰90m>XH@P5>=hB Ka ;}lf.Klέz%~ =;HaF";@h tTU=3CJ&E%$B| yފ}`lV._Do  P ǐ`cs_xýu3lek{VU@U~K^) Jxcs_}YYymm DtYV3s73imgot>}r;|өƶmO ~ t?q꿋 o.,B=ONyy3Ÿ=uq27)ݺuJn?z}?>߉P~p8+|N{]e'[?ۺu2Jѧ|WUqgm`#> |<4Eа"߆l E} a}U{-&c{pϋWZﺎG[ĸKcZ0)ۅڕQ%/pz9*J=3vv\ qqq/lW}_TeFٿMwteZCcqGܲAb C~3ؾm7?8vT\m5nrט]z&:1q?mF51(Gg(DcE&ap~7CVID PôokmnM$E I@ 2m?t[ uQ@PP㎪i[="G󧝎Y`Fc&"?>蒗5_"צ&ĭ/)g}2e3{|N;j& *!hm֎qxAD7q~Ӿgo5ۿwj0 Loj{}y?,i3/|'ٲ@KcK ^Tf!~O-o2zL7 R/f1gA>Oj_eIYM̓@xA]2/:dx:їWzaPc5b=\ O7?T=-H;N콐%i[GǺSG6+'_u!Okzӻf\> JηJO{lLygƚ#*ybf2m I9sAuP'kGVl&(0@M$6wSm%նQ_}>RkVJmpS>Дנʤ?DdRirFŌ9*zd꺀g,nlń93C"'ybSOح0GsThѢa2Kx+1瓑z |z {{]*6RESPo49'#w>JT]oe E nFD?>{;'J_O>T< Qbe:uF#+> m2S*f$ \3J=wE% ĶcUT[x>fS2͠Ǜ}G -?4zP WY \?LZ!NQ-럗v^=# H,W^XP޲Y^K 5^4xҲ3T-Qx=I9xֲ|.琺QAnqekU|[-*U ;$zml⫣ʴ2.]U~m90T/ ⊯6)lv6jI;OY~ʲ:={[s:+҇*ҕ؟1_9qPQ%)_K:<6a}T?q١Nnzz}QC UL}S}'zUuxԫrh+&cX%_ T8AE':ܝoi%='ޡ-QOfdrx̏=C=UPqOlf_ ^ІFV(}NO/ 68fpOC҉3뀫!"6Ҟu=5C<~˿7be"2sNɴ&ĈO /41?f9>&aâ=Xt`ͩTMCo"BԤH/'sNnֈMvc._t:lVM@L1C-, 5U[+N4E{|JQb:!1&>wGoƱ:3HP4XM'cEs1O Gt`h(2~>Eмhm4N)H/_]FUʜ9)]k'Poh}MM(JS5s`> )r,z;NS?mpRQ`(J NYADHК!Td lB SFa2@IU.`s|lN:Lq`Y$1?씎3gcYrCn,hSϰ? 1[Z4 6>,~py[ hSAN3cƌq:2$ Aܷ//׮|(*󖓒`w8 ̛ TU<}{=%z5|*kTWZwէ)-Ufv~=_HؓV?VZ٩ 9nQ{9aV]q;s!r׿N9Dhf^BdC{dEdg@AQ.*w` /)-DlV_o8?yEڨH㚺 Co@R94w] nd(]QI;`s'!T¦6g \%qs'E|gm[9  U[̭/ydq~^XysNʻf;Lhq>6$奛#*~;o{6@@IҊjÀ}ǚ?ӦM `-Cpf]ʺ|% G@^Tk9((X۽G  "u3gl}+@*':h8VÓ' ~amZO? ]"$*EIC*_И+/EKq 7U#ݏA{14Y~Ŋ E0u>;@u:U mQȐX<=`J>  oiyNL z еM LY\bGjS>w]gn`\7jܞD ~d{@<찿cS#ı7 Pfrgb4~ =_sv 4rׇC4"ϤD;{\s!ӆMgg UC'b,t6pM]G_3kdriчOclf}b'"*Ď{|tym`,J[>j'ް5.ё]ޟ*? XTT=k֬9 Anx. 8WtaPOr:9T!C"W\y2**Ǚfٖ{UqPh?Bp/.Z/=oojS6{ {*.(^9N E. >`IS'lѩ[_'>rLs*YVw{(r*nJVO6hgt FY~vI9uZtN [!"ZI…PVXm={ QUY %  ՠCD(uZdn'Ǐ0@凖|鋫=>~T`Xl%Ν0 *ԇt1S ,9n[,`tFm 3`%$_}YM}F>^Ͽ{SIXF<ꖟa<4t-o?2U$aV寜9B C>Y_=}T&c[f2eNb׬Y|T"8y_f̘*U#'WUfBF0p48$t''P }O>hZo|*x1:?=hD¾ˠaVђ;&|$= 1AsݭdŌrWMt'@e lj,x1!y[Jdw|M3Nr"'!F|/@}_u oO' [&F#&C>jOpDF-a8ٶZ0z{lNfAc59-Z*17'J,^7k~I2T*vf]3"Xp>^P.-P,Wғ U_MD܇UUn207jk_sAW!3A}F'2@uA֧%g܇*LL|3f\b| N8Va滈ȖO>}?~3f ^yܾ~6UKD?rkC߃w7-i$-5%\sYzuV 5@rVRV )2ttf t (xMu;74.zY`yeq&6: j|јd/s2+LAI^p 4 +)$XK㺤o㻛ᰗdGvfj>zˢ|Puµ˚"Z˧O|eeu)&LXf͞my!}?}7+++_nc„ dzx"u˿o7#MTXrD@DP]Rj"\1k7A iy,.Ct?r)UڂٳnxVJjSV:A%KZy_1աz0UeA/p :资km"ڜ{i<s8vD"pҥ_|f"pJHŏ𸟱Yj ǍqGf!U{jU3bB"}ƚ獿k"o1BV.[ VVtd+'`$tJˮ A&V=;!(T,x8S5cc^m%dQ8%0w<;DW}U+GQ=;ᔆZ>pJKjF):{8wDpd4(nҷWaՌH ='jw=['s׵oA\1sJn!U/`a$$$nٴ j_ UTnQZP;dh i*nA}J!-|k} *J j_>\?D@M}<Âs/P[x̯@KjէTM\|$ءӃ/F; ==ݽ@včx ) C}Ӄךi]'옹zwwOO>`$ю%mx@`!9=o4yAH8MgDYq9$p~ J +j1 bTU9ezg"P]YNц)bs/ D"_e0a1{?dS:lm_K/ ;|p0/@錖GOO# [uP2H{Ǜ]leX4{y!Ҁ(@e~hQT'v4IA+>VĶ"#JqtIzĪhG*j ; {ėDA,C_8Pnjݡ'G|Ä>p*&{>z)?̈́EPdĖ{,p6 .o_kkC*@V6{mߦӵP ĭ56P[-N\Sֿ9`rEw~a(9?7_2Az)1wm{3JVgg?uy_~ *sMe j߼`ZV e=w -$fHDuSACỲ`KdbnբE =7jRIbxZqDK"*'f7ZBa@s3g,owH耍݆f{c 4|<\c%'ܿN=}fN1)jm;dxyy̿rcC___WOV| &ʬud Dž12-[Cq/3}OG=/lAx_qҖ%7Q)'?z{{b?cnO}/@3wo}do!#oug YI Eˆ6 ̫,ۓsh|UWmB<[?7P'һC_=KKS>}žN{^YDX,Kq[gyy,q~zk;(ZRzx`Ech'"KZs'ʔD,N~1< -_'bN71`2?5|ʗ3 ~Mܯ̳~mLlk./_?Y7v_?AZ>= TTxԯ  o[!p[-H[+jЂ0TA O{MHD_fytSBd_2VDmΡANHՎ2wnm|[NP+>RNw3T{ĤNYJCz_/޾YMwtU{|"kueN/ߺ\\}D=ԯt;3½ܤ~/tۯ}|;hMvӝ$ @RZ%M~m|ݷtY8k'eX((_ g P1tI &.[SM}n,ywB_Z)+⋌Դ?w/MTV|`0|7j+qIcU^؂zĉʫ.2H?q: |׭SpOx>u)ݺhH7Y??#3 6>d+zo招4Q֭PR،>Upm^_6W7'N\,(4ȃ÷Ouʳud'؂^t_n2~q䔣"[ngw?źv{K=yG8{JDǛ LmTɷ/>~כ=‚.&_6ү+X0*7߶xnW%WYhjFq+f f ;En}w;yW$P?ߔI}aqMZ)_4iQzڵb;5}q=6Q'?aI -ydE瓟o6=>F';"qz~l|񀻾Z '?{//[[7 P0-ϧ_>M}U~ɃH忇pa۾?WZ/n$EO>~QTG!j@زgYӱGSf;HC75鿑v-xbDDe+vtym?οh#H>ͨz~?Klt"&א}`#r'V]vlzm8w{=nče/iӮ߽ ;̎׶lX&=įgֿ6.; o%+_'(:Qnlhw$ r= 20Rg/zI܀ ."N'7iԓ䲕gݯ%l*R'PPڝ^"+ lE{/w TVekbmo?HhԳ~O-nn,ֻ*˜' nꯜ?N2c>U>gO-m; }n?oDx{J^-^_a+>6{tvM}gJ&NZ6?zzt RgX~_\qU%QۿwL6^,kýO pm Qf|Qb5()!&Cx@Z?5-_ +AHPb䇤dyH=`n\tN"Sc?D `unQNz6B gW~9i]6@I9bR?_G`|f/lb)@Cg:?;4 ukr9r1C'bFTUY).t Ǒ&)k? Q }_xA<\<"*Hw]UܦGV(  4{;?xyK⑳$hg n3:8 uip} $r*(/J~襳E8_gϝNKh H$V.V&5?vd.lEb`ϱ(s%diCY-H3lAl[劽%Gd8YRQ8}scâgiM/L 2fTtƽ'ԄSߒD;=]C axV<9VYV@Pan[*q_]Bh0$:0yv\~*T]6gYxK7.yh@ :fBa$*qǠ]%X in[т1H0h9*wF$Hm[3VM_aLTc8maR)ן-ľ8Z$`` cAܔ=͡*Q* E#'pPw|jY=KکPT1)2K}1>2D/[w=D{P?wS_ghHbsQc~l/r2`Rk| &;}>XprBTPz?蜮ϒơl&].IJnFPN q5Bgu] DXֻF\NyǠ& i_;DdEbz,7?4R,4F@/D&c͜!JY%%!*޻c }7Awi7.%e!83#$+DL"R#B*;P|?['jRPgvb!ޭӢJ6tuYai$pW6޳oߚQ?wdlL!qc#_oK5G+KM˵/j0Ѷ-l '݅@**4!Xq*|/,CWv#\mcVY.;+*wa&mF?RǍx{o 'EnH=bFa&C}PL1Jd{@XuTmkv0كƈwAE@;:~7_:605 wTZNg0 k-8vDL#GAE6 T::83xК#TH:Q ( @d7t^exv :< @l %Nt5 |R[D hpf@Ԁ&D%:y (cQ?6&>RywBÌp5{! 2?/!1RDX`u}Uw42 $(PTs 6qB"l„U~ȩpx5OAf@)/d;= g fc>g]nFU4Z(lm?T[up7VYI]TKI~m"\ 3N@b *- 4q?4/kOB1@֣M2A\; vC1 h^1- q<ꛂà5#D_F4 $¤8ej M1wKD 㟰Ȩ|u`}tOaB>]R(Q?'E{??_ 0` t=4+ 64o &>hn?MzMѤk_@!Ҕh]YC654/g0 惯{-cjK<;R?7FjR[+|ϕdGi'<)lU#=>RVU5FriidYO|w޿ÝID F ֮ ]S Z/ 孰XQXQ2*78d (Vסh/VU56A=j36'eEANQ1.f1ِbj%T pvl򍄍R\ENQ1EuOGHPi^l_%tֹ( xOG//W l &tt Mȕ11m?X  B8]J~|~en|7l"{ۜ|~;N -Ӽ;p/ >Si[Ç=o51r-q ^9};q3t)kc,׿GS0Ynޯbc+D ۖJ났;c{k;SZmbȊ Q GSSV6 PlVl˪㌀;8QٜuFW7jp~Kʫ7hc/;]|i;DSVq$ʆ#4.(¡3aw:j4s7r~[{;aMHW!JuO5ٟmO,wDjq[ jt}2|xS.ߢxApu '|[\rw'zlXlΝ}tV/S&-U0![[ ))E_yf£mvdBr9vv&fnݺ=zĉ5MunSTAZޢEiC# UfyGתK5&^.wח42$S)+ цL+͎[K5ˠ6CE QPK~E7L6_mת,%f<} ɦK߲ [e9e#_R1t}v`UQZo@U jڀ`N2v}6(dQ,Zx * 5?1n* KE2C} XmO,B`ֈ EPE( bzG4(V-|+,V-K@M~z 6;zwKW@ښʰ׽/m}Z\n)#f+:GomBdWc@~Nfz!$4% K0Ҧ"7I~6q((-#'"+0F/ ~#Ǝ8o@dMA0%pG?cZ*ϧ#zwG4rM C߱Gh~7KPRz_Px>8`qS%f?ZM Dw#øZj}TFL4VBUd[EPx鴐"B$\aU*Ҳ,TΒEBjaj!":-2rjop/.U|7 m]oQVAQRi"}أ LFo7!Q!pd/f$`{p(ϻ*cfelR&7#7'?l?Bɪn&|AV{E⼽ t*iXxU~1pvGC,z!1tnRku=?]n/w2@ "y3|n4=|]<~3F}~Xjj2"O& $$s'+(&j+c_  6T*\NMi0-j֪xyG3m+ <,wAþv5)~ջ_zh6J#kXN_nO Y]톗vhx25>p))D=)h/DrUWދ" [;^WͤR*vbQGy1DA@7+]/Aq"1":-4=Ö 5" *3~f~P9>j)1P9>Vs#6ٗU!D:_"("6,3s0R9\xaiF~b&ADñs(*Lixh[߭f7+C>aR~WZURRRRjju {q oݶ=aCp= jiCtmz l4 7  lWӏl k;w֭z4 "1)%+!D,Xp?)h 4:u[ȊamVz|yO^Q?!m?KYVt-(+zTgo{nY-QT:>v6o۾d8ձI^0` gʜ>Vu{q"+Y9/B_V%N#XZT|0^\Wkf{$`fH• uA `l| j~eK5^]03TAtBq3;\JUUC):> Z@zZJ+FPT_Ĝ!C?"nNh} H2L>Lc#7!,CVL :tCQ)111h#_gzu7Xg;K>; 2򋕩ՊT<;=\.E]Ue:@'v߶hق:w'4$ t ef |GoexuY3YKYy($BкklN#Mqk% =rJ&ue W*L1aX~Na15|^dNh]Es 8o1hn 7 @x_5EicgkZo|"Fe1$IK۷oτ D??lX=g4jw&~ssĉ/֭B: *:'h6^2QP!Ͷ ث̪*vحIUIDhdܦ9{ U ŢSLڴ tft^b`/"_t4ifG+ 2U\t yY^( (Nt hRf\Q/vklNgd0/& ah~_9B6x%hU*:1~{ܦ#׍@(/?\"=uRUպ99RѫW, `3'3` YLi=LagA:߹=% МvMƭ{;3h,N#n\}\ug=,yx.vuVz_=\&t(GgQSwёcuoŭV~4CAD"K=3|RGN4BHDdxW! Wmϟ0@"3*V܊[}C'ʊ6>LBL 7x:q#m ?Z) Pջ[w[ǿV Ə Ia]C.,z7ٳOo$cK 񧗴4ḒoyQ4>KW}Znq7$zg%'=0]o|}W^=z|`Ԏ NpftBԳcz]6 nnuϠɽzF> Q];v߶m[SBǭi1ꙿ vIJ'tv7S䍯*jG*$GoIVdߘvj*>}.gN/DkݣV;֬O?ƭLP»7_WCvf8qpݣ }_\S,pScӁ,ěoze _k3jY6ČSv_-2U#f=;f&bԣ[oeP®ǭi<|&r$$ @HR77&  M W\w0x>X zǃX//|痔k&3m,H_2֯sYv  Xe<]C6.,HQkyEeSTVIe.?ԭ[|6`u~j3e> x&哉- 0;vzbEyfvEtՎZ;ov` ٧yZ Q&\[)3(L|\\Sf6oN@7_37J2Ӭ]T4 %ʔ`5Z~vDV>sǎ/ L{6qO-}aO;,CMgn~M=}GUݦNz! w( `Hc9֨=xDPIJDtwCI$3Z){p_aOs'k]3 x|[[So}1cȲ4cXD]a*N`y2BV=)o:,׊b֝]Zo s]6V WEz>h$!0Kǎ^WOXN"7 0U#; c@ pLcw9+!-  Ba0ŒU~}zз':o ѳr0_mµaV*Ė>#0'!6v9Ǒ?A҄ES{w}[ǡ}p :!.+| ioG#z?{5^:u@uw9Ro_s^ږ16",Vm| j~I΀FXjbFW)i{oK2O/Lm7’nUY^@Zo0pӋ3;pu\5Nו9RyC)[HC[x3 ?S KQ/&hɔ;ԇ2k`UD2l):hDG8¯]'D5"YHH⨢k5!y3 W~[A Y`qk+Gm61M˶Eq+觛m|kZ^>U^Om+n3dPoOo ogxgG$~>A;kw>6RApK'JEH9_Y^Ҕ-]UˊF涿W$- gQ`5szﶲh}Z&pG"|AX Ug c|A90;c )@oX:/> ]@x:J;aou%An0EX$&?'!V訐v?e݄ cB` I7PE7*Su'>ዬf†o&។dègA`t72"ȶ!\}ڃ12jؒ:}ܽym N}#$1Q7xv@LTUΔiG~!]eOލ~Evo9E?|,,N?.c'2d e:N;?Ѣ2IT1֣ı*~sop|au$ߜzsU^ҶK.k9]ʨi/m1د?lLT@LАeTc?檹Etײ]qQtF5Z/'-6˹N40׽Xސ'щ.غi& ,7u/aGaU;. 0A(ғum .zgm[YS Vşb^Eikw[Rj@ 0 q\a̓sA~j!s_t=~ay[gܫ?ЋŬ<䁱qsەt2|:0ƽㅿ|bcbP?a8?^ɐBg/ϿPw'' ܉lWs>X+1zpwhEnum 10zF@О;=8Isy:T߹Cݡ̳-T0f@(Th Bfhkw~`8!iE̕*}30 XĶFYH-SW,x Az!*u@h%8wka8ݯWZ׎cphD3#A'´33oѼp0;kNh9~0`(% !zF+΂8V"L :*skgM@rG;b^ʤ`T56 Ts gTSs&"z3 H}y ` 2_s3ՂBQm_k9(Q#gxP?i)UFy3pQ`ЋH⵻]]{V: AL i5겥yw=~'_ޏ4O/lx K!\]~;?)KR ~,~lh(hV`/Ȝw<[ρaqRˡopQuFYu?8JIzMA86\b !P-hPho+9JS5*\$;@0r#lo_hm-:LsrJySUE1qYy}3{ueQ_X֒wG#-{sAY[a`17Y1ZZ7}й(?»`]?ۼ{@lz_}AYl?a` J``A/i 4<۵8}Sgnrx{_}CCĄ5Z:mKO1|I:!O}?Ueg%|a;lP>Z Dk{زv`]Wqe@=GuAU$Z8k_⬥[fѾ:$&4 v>RǑs?vvP^WsЈ(3qI+MZ_PDMy{G6~gO^GW*?0+3rς[*678 (3G\zZI;AL>wzgh5'`޾_n[K"G?l` D' j'PoOgNưs^2bnN>91Ϲ8a15:ԭ&@g>6?ȻObwfL04:ZTn :pL$ bˆ~(E~H35(D Y8d~'/ !dʿԱ׶f۠ǤgϓMHc3 4H[tbiJear̳ w}6bڶ5o*yU}cx34v.D*;Z<;G>1n!CX}IߡbJ\}fD2V ԯ#А2F̠gSʧ/,W[G}Nj% i¸d&"P39c3QD檏T8–0F9N*b <>||HzgT4P?wz*a͘;͔pe[ cE 37eSz ~C2ϗQ/8%Q8Tՙz￀dO0߳.Gay3BYo"2G|d\3˛Xoc1SR{JZo_5;͔? iYo_׳eV{l[2k\FM Z0H[d?1BX80ݺ*]k cKD" qK^YjFXN $ CgkAȵ hx"wX )vشZjςZ[%]pւS<+#c$t"| ;OO7UqCwUr _o}A/,]5ťݍ-Dˬ@~W_5y_yT[QŸtoݣJQt W~PmUABK g{dێ}ϝWK[yݰ}.A` CMڲQ|>e bT=gU)aJzݥ{\ukSUJ%“)ЛbIЉȾ9-+}W=|R$$gb`%L97;Q&#WN}K ]{_RQ_~GzC%o2F{͝ C ʩZgmIЄJ_#7ov1Vs|^wyzU]~}2:_瘊㻀g!]<(ь] 5B*}]j fDuTe-_nR2B+)e9ޘUQg@hlQ2eo=l:*p3,;RP&SUYSR_eH6]_h4wył|@nTQ[fx+zK/k FG؂>tw%`yv[\GWMx𸺑;)M`Ϛ+*'INT]~G\Z<~Wngq'cD C Cǀ9{kg:w2M |çm>tϫsdH{]ȯӧZבqȷI|qYK@΃s :k`F 5 WQNZ pڂ5_\HTҠyvN l}>鷹 ~2'c) +_3MZݯX?"9 "n_*۾f?'^UU"_wq)e\Z/_ډq2S%Vq.{×_5_?~JYGՠ|y\+ }^ߠ+B;8'Yd}!10r玧HfzX ˸ WMâwVLQ'Lu9y1d^9;+)04JΊ)DqBak]"@2B`)(LPTu9wYVIjB込q :v:\}1}g\`?_ v:{nZxq)h-|xqų_6-cW~GufV|XB3cWnD6<UsFb?Т<==Ӧy,!TL!B'%_u:}k7§e 4qS*}{B0;RR徾]~a 쐢XF kQ!;ɓҭ^O<zj],#]˟|O,e*ՋRvfC, >%{ÃSlGj:^ӧZR 5}+Ru]n?ǷCB5}FڣjW)HtZInr_^$80k0bEKPl™v 06P3j;^'*bi;8_K[ 9y}(JK$՝YIJs% 䋝 =^q6@^T8'X$ywH5H#},_ru(vyKEzv"@V͘NXR%9}?w|>luQJ=Dq1K^̟SFlF|R 65ima |IbRQro5EKm`c/e$x̼Q3Əɗ tޮ~ ⦌t܈"H^С q'?^xkLRtf1s+VZ‚wMkk96٫Ιf˻j_P۠ 姓#_7õ q:eNllи#x`f>=74K4aH2c1YpEf]Ь :݄hiC/dž7sw&$f*}"/Zzxc-@ˎo5bRZ}5h'=)Wܔk>>% Ā8}11j t-l#jyv(PhG?$ӂ^8> kmGؕCȿjퟎ>#5 ${>.ؿqCmѽ_mO,B.P̜Xlu/Cs}؏G܏-+ʂ> me&Կ0FG?VN9 w߻٢7OpcA|Zc}ƨbgǜ;=PRyW/VN U|Lـc̘s= ))EplTr1wus^%%>}d^V^<(8[Ӯ%wf=b4}lZu;GRb`80Cj~vj8-~}v;5#ywE0Aܰ ?v4mH)00P`.Fѻ8(Ca߿ukZ=W`qЏPo70r# 0|0q)kNq`Ob880k# ] |0-ow+oFpd/~eoT&Q ?` cl4(g1jH.Soy始CrSQ~̦1sz'h| Q?pr_&CBʇ4 EB.cLrܔB:U;g>==.ޠ dc܁dM *JN[ $~rteeCnE'Ni<@A7D??/b⬥@C|Z~=!Sln0ogUߌ<xxƬf @b(y(9#XM^WO rKR. HfۼJS6tuܑL0".yK(y(9F_i$rJ&F^)2t̵yxF]Mj?+?;y?]zTI[6tex{ ?f(?sAoeV6+)o ^}(st?^s7S|otNUzߊ_HǸ(8,ŭ.Ϳ7Z L@>l# ^_*S}HР"/Vc~Փ' >nشclHY'R{+rg-^?x cۿCNf $w,NKQ=x|Ҋ'?0UDwF0c J`uZ?v?~ϿMf`0m H_7dHuÆg[~ lG0KpJOZfy׈ kO~i CMl7XnßI?8ɛc66K"$'ΉCG#Ok2l,ȖSd$>ÆҏO5$' 5䋑_P?iXaS kD:*FvzGGřW^8zsdv)oetplyߤ7k /ȫZ",\;%Ӣž]:W?"#ijф?iS̾̾-hFOHk_U87<_/Y/Y9|mCiт?4Z7b =s֞ZP]w @;UEXSCM҇~6<jAz]W+'i菭t{9pwS+-}F}BaKCL9>\ wc} EIK-NDQI2d^0o+DoY-*~58w6h'ϯ LsWrDZЙF?B!3YK`w:}y;UEfYxxs~b rKyO[,}ּs !2ځT٠} _|_D]SzpQuWxlaRzlp}}79U9/>wa^plC -{_|F]U|N{V6,o3Sl3H/ uߩ5WT pVdCivl4確M9$J9UP*3cCfK ?Oeygnzbn.WyU*Y f*5;y69mzO9$Bb@>aK_'#/@fض-җe@t;j\i,1\Ā ~_:"zC)g`2G#͏~[r7MX>rQ_o8ʭeO N^ A]_xÉɪV.>X"gmG&矸?ȝy*eeJIpGϸ.Ҋn$λ%Mc|qZqќ:Ms-cvnEi/e;};vmE7G˝/i[8[iN:'񥄕x)\wfg>wbG9mVo>x^z?;]]ʢ8R^4z([\پW J=G  k _{ Zk6#MŐz=eH۱t6foks97ZzK/7[og7v܎T)ܳG'B[qH7f^s66Ur]_ixg[ -ER[SvJT1K:J=ho;wAޅb~2_p_[K<0(ReY-9FH[3Ur{}oO̭b+Q8 # BcS"))$ZlWVOlio=O2v/\_}m~8~RR7,!IGW\=g矯ЊI h9ItWg?_5^ 6ݞXWK-?XMRZ?8զ~)oO]<ˎUAB>$DB)G*y"4hV# g:nǟvMk zOጮ=p|ؽ'w̅Ugf[G{vMGG_V-n ʹXuӧBѾRe%%JJ,35Uӧҳ >bخpО? |4A}tXVlw*:gNV11+gA=7O|h87DȰQ_!}Hf!&Jm!ZkzY~SUᝮf$kw鵴V_e.s~#;VK_qk5J{OW-GҞ\׷͌5ɓ}H<,#¨yUF>%+_}}pMw_b<"LN[,kߖ0YHkE^fNwhF3WE{?ɓ}DoMAf|ުa^uOd6 8MÝ8`~󘨸p08 6wuDHX AP2N#kE1N&dJ;q k|oSnU(tew 8+۝$;)IU35)iP/Lz)K7+ }*Vy$D涿7 w1S|^.__w/϶+z9 ;r;su)Ԫ>sWnT҉|RU|?y:;+JB]w x%VKKEQw{+DК0k>>w+T*~Z_W(Tw?%^uR-kq[R~ur?82OɁFIqOfqP"zt=|S4Ј.LOh/q:wH@ہn',l5>?[vѭaT)Ĺ{4X=@P;N1BtwH􈏆qqN24'K~ #Fz.{+GKzBW|YUVx5H[?)=zHw1Sҫ{tS}ew}6cxs "I/:TPm: 1 2Lq8wd$.[Goєe{/|ҀSې(5#vwT=c+ei*s;wdވ40φwCa.g0Ù7O_2Ψ:4q↺qcp~O{hY"] `xkg?_sOhywl%3o:+Ӑ`XIOi_kf6HW_=:argfF? B }Ԡ*~T¾ .v1C|xuquKW(t.6{_LԇWv Br@|diO R],:)RwW |@# ݃UG`+yIe㣅;|@ lբگ. ӄ(tIp~Hga}Bv,曕_Xq^7hx.Ϧlqo7G^ܠ[ axyndRU%؎3g4yִ5tx,jyn4ce5(B*\.74yx͒@!A>~Yݸ 5@sPT o'QRL@DUwh#G5A9n/-,O() ʜ|HYYcW" CU0+kY\?zyyhƘ1 H>]y'%QFDC/£Nnn'+ԫ5!H4pS_x$C$nYKQ`|p냝o/Mu=v^ɿ~F~~<Үt\޼O7jI};NޥYݑ/^;~|I=O{g 5#k?8dyÞ1KCΟ8w|X+Ɏu/093:.Bާ;R8W/m[fJ$}‚ y;7>IKF艂 ~G(*hNiy))˟o/ 9sb%vB)Bpw1ίFƐ+ʊb\A85~:ip$fdoel]x&z}: I1iN+'~ T|hؽBqFU/ ϔ =#-a.u/4Vb )qwI}'e>#Xb3[|2huH@ҤϺ X \ K4vSv/*m.C҂[+FM`k˟qKD&oQ841Dˆf,IS/uyBus`l[dA=n0:k $1aH?>0~-ȵK4{K;KLFaOd ;lZ|@\g,RͦfW,^)YBLrnHY6tW!;_O}c #)6[|;_:";7=I GJVqߖI1MZi]ȎWμmch:Dey3uwt]g6Cʌff`QUZ`CTv|T}%UyHq*> Iɕd_>Sd븬߰8Fs7.u \'Gu`,xn@JiIQ1ЈPlQaއ/?0 >aXd=7>e6JF 2l%c?eNaHȁ2UlPo_NXHṫmB8 nUB~N}M(w}Y,E*!?zuT:""]R@0{uLIHi]W`ԈzRW7eX>"AELJ"#P+tnHSg zc7afV,rGԿc7g5֧@Cf6/{,_ҷ07c"Ne-3y/+#bn_sWO}\.WO h3ܯ7Y o11vS}4$\:=6drr=M ngWHΎ0PU"?s*s%LH~e?w'(m&{Fk(SP F՞BW$/Lbh헓,>y `RXMDI5,AN3>98-{R5`:%~8a5ªeE&deCHO5ȿqPRbC~~)ɦRO6E=T` p%# ZdCQFVJ2]8@~kV FJ)a-E 1Cݚ A/.5>VN^~ԇ t[Tkds+]i_ IIJK斕ݿe"leF{?9p|`Shjx}=:sy.g82/Mo{ 0p~ۿ|jP={Om.uu,Zꦣ[@x_w}E5WQe 2 "Qc TEmg'*b*~D6 ՝YIJs)X?Esj 060}ۯUcb<cGeEt h;mnZQ6$bϬX3=?Moa;j74Y4ZF~}ݟMf PK}~n|hnچƸф#F?MOݕHU_WO&q%ǚ6YTguD L☜5;_P=2e{QusQoÕ"(V<;+W njQ-bS9X/S9G>]޾ ڧ*|L#໳1GVC鰛R~KtNjWs8ڨ!uO֫Tu'ĀeUuyĄFt 6ͥN$}P5?U[Ћ>\v"%eN3Y49y`'M| A *Q~sT}A1!&hoIb8zͿ=PhFdY`s?-udտG3X{OgѼhO܍Պnj&B4I4fՌn4N>IM?onV}tQб$( ;W?odKYA+御1iM \l K]+ Ea8/cسk掐A>#tT gȠ0 {Q5`H8GN^o0R ɞ Pv> \WgZ}a@&[HG^#vܬz @r&JBJ~֮A~a7BZ Q'꾹./i?xM*H*Šck?ižMgzމfBk> hq_W;td_w9^3 *\LL{qtfkt<F@Vgo{&ȇb #U͊Pd.̨:c?f

?r7'l8-8OzΜ,6*TMt-:r7>l̅bOTI#clxUHv*C:D猝1CP'u21-lwIe1 6mlpdBsAHr v~Qb+\3r[ B^cWPVE+ES}e3;x)\GlƘ,kGR#ESHn ١ 93Fd5A>՗0vl0f='g7bp/BĘmNa 0f!selc0lo!q7gcsx\f'kEtcBFi,#l!e0~!ث裦'()[0DcF_Lg!3][ Ү6ʟy@0.(/&8}_}/C[3jqN]GY#/2)(ޑЏ,>~aֹ4]X@@>@ !L:E;s~ Jw j 1qt҂_S>xG|ߦ/:MPƮ~Í c%g?8n]@Ly+}߸3)(ѿBEŷ0ѧN|arw||Are'/wGsS[w5?zw•^Xs|\M0{Q<<\smۿߎq+`"^ªc!PӬ'@CuFo;"͗i' Imۿ!^;( щZi]eWw01jD/la+?_?.2&d~iώ궝6jH ףh?\ZV.ܺ6r61l{W}93caG Ql3zX2B 6yhvۣ8]|'>REbkBfO81P=pvs=)|Njcũ2Z>ۼ{Su5O\(g>QuNbc%ώ#ZS#iM^Z0<`Yaׯm5 )o~}cE |FUH9?ߩ=Cӈ[nO$ϓoŎF f*ropnsfNŀOXſRAoV3,eO_8W+rycVSyT6cT!i+DYÀHx gcB#d3p<^!Z]Syujj1a_{o᯻o#YRg0UG*K 9_փ8AadTS.Խw-]$~3g(p>_+))IQCat@vXyۿ_k-ڬ SGsqM3Œ{Zn3 pI?Ge!yқن&ou}b=O?7Q1riSeJ@)ѣ~yf_ PU4t GݔLM栌Aۼι1 ?V* aU! {cXio&L3Ou30D| |Eܶ)!nNCŘz׍,ZJ]ݶ QM740luLuvMs3ynx+b䍫Z?8զ~W9S-${}}jF`֬2;i)tfY^c(]Qw|dvBjҦVg U~n sK͌0AU|jhq>9,1n ڦnׇx4q'Qݜ$\iVT?FwnU}&ϓ>9 %w5r>|G,;P :~ 2GDq9]K B(\IBF)a@0K5֠0+pɞq*.KU#@- UJIX|ULZ7_o½>qc} nb.Pfx!k»'G/8R;m5-?!įRBN"t,lXV11-?>=F 1:NJCdrřᤤ$T\bjnEBһmz%aw}"VQn9oRFVu[oUFZIhVקȲ>[MPBVNX_*.,ހ% 1l7 ?k?~x/w$I7or݁3nip&[;e^Sd7lJoDPI?^K|Ah;pd3~xgٗ$Ƨ>TsR4pB#R0*?FVgvg:f UP(%P)D`H hNJJ߭|1P*:NcYp%s0XxkUp!Nh_>],Dgma(Zܫn*tDk?cH ` |* o$:KgathNSŊZ/C 6z1)tM4H: Vn޼+<8 /i-Vw7EF_K}i{-5nk ou}Z5>&sكIS/RKKl~ N_.D4^lo4j:.&.H/}[ԅ =޲$|j%^GQ1%f_We!?Bg$ݕez3߇\ޮ 6: 8Y-B+~sOjyf-6"4؅}xHXKO#C) 5jе<]؎vNDQ1 `?d#O#Z@MQW/E7r~;tѝs[3dyG"MLfJ,1*qӴуF:twH􈏆qzH?L|%\ϏmG#\!WKP~q$uw?ƪ 06KzC[] lD}p@w k߃AH b"3XO>u'iO ,R  $FLG HY^Jdxl`5PT.F"}Xť ׍]i8Z]H VѪ ./COW+(("(N +Cn0TXE)3iءQs$>$bD*J|]PA,W1㊻o=9 3bWv͔K꼉Ujr,YlF::cdsFq~.G}M|޾ߛo +oJsC;ų-B쏐`"O-|zDrΓ-0MmPvtBGiš45@X 47]<9oOX?}uШFу0g|B~h 6>{ VDu~>: ޹zqqf*BuED/BuhKXsS8zlTPa uh0]@; 6 "!ތGdQv"77]8,OBX/‚="OU˧M@-h@X‚h@䳋'^GM+)g>!4>8U2"FEoG.rYtv(:~38*a_]?0䣆 ϻBz,Ӵ"ݟܸ-ǹVl !x$4@V E?oM/ΥJlj *G RYfp&E |pG(bތqa wvC_pZB 6E:_AA_FxNO!ύJu`ud`9 Z~v׀nτ@XP*evkHZ@_DK0 -dDvY~(S/C~NN(99AP [N&%J3·Yr RvY쫖dYs XJNbu7/Hf#$M. `e+.`?%JrqQ=wEv a&ćqb ,V{i~6.^%1}).SVW ߼S5JllJKFD Eu͛76o!V0julEJS7Y*scxMûLDkpvnRR3 jr +6&g]bpfVBQBYۤS\AK<3RP(?JJ&eW cӁ;^എ@6[K ߙTkナЭwħ/`Fߔ.y&5ȗhR=]۔a Oy"\xtI'dhGԌ/Mag52Vն{c۴M4aW.>c4Ҕ3ϠUzVrsſPyư=yr-+ C;z#;\  c_26اA+ O?UʟrJhQqYp62hEhy} :Bh'hmeQ.h%^Ʌ7'ӷ‘`ߵ_0_ 8AĘw$:`* 6 Χr5_CxC6ؗ q$纏 x^@l_r`cD@ `_4_-₥">q'B}W;G#A ;n _BXdYVy=_ŠǶ@{["9q;{mFaTG9)Cf6M~8Zn@?3&xy<c;TQ;ꝘLԿv!_AT^bwt]]яH`>; rN_< h@~[w0BrV@[U5 NMymsMSb ˈtل㮌7zhb̓r> da]ڔRVN-m rК { nhߘٯIMѷ}QŮ)TWxܯ|e>)WiC{ +(NJׯbw1s:#"&\Hq!uI,snͅe0?|ptm>3f!'(aNohҲgi@nYq@3Q\b8R`bua4E%0Qfsp7>2sSMb_LFA@KEտFAR+ Jm4PttWsDj$ho6(-`V%qmir]m 򳲲jzE (a 0* Biֶx $i%1n n 0p<^YgooGH66Ay$n9}IoE WEawQD 8`9`]y[k@ É?xsksVb#Aj?(eZϚc]<+6r8ˡ  *{>RZzbIW-u8 b {%YZHU_')/C/r{v_7&}EtE7|/@D 6w@0s G;36766Dlqπ" -d9PtfHn{# CZ%y(*# ~ axkZ{{w2oH[.L [ XױXmOkZj{3 @ ,+5>VmW:M4m;oߑ U0FZQ`)o` J*߷H?1,% ɔ'@ o[" FB3ޞ5cPkρ@aE^ TBa U_stDTp|ná +L!<.Sׇq\c Shx-U )UÚRxNOWs.`@v$n9*~u)))c-𐪪u޹ TUF(rTU"7w+ {~l`T9 ^hL}lddfNlψ}%s cT•"T0ӼeΓ?e*.Efq)gtNb{sTbDT{;~4?lolDo7ÃE 'y7WqTCԊr.\8͋sGƜ]7ZuƢ=)w}>>oiNZbi?G^zc`v " |~b=WruN|G?yFTĮ)4h5ţ @}9 K2߳ESW3Uh۽] к9F8]S ɟc :g,Cɾ(UrG ?H'j ܲ;6'A YmG!SBKG^~BC͡qEVND $2r8\<]|-@hgLz2|l89Ң2X K#9|vJKJ,(+ +/ܞ(SWԧC)q82W루TlK.v)f{KN^=[y2sr].l|%2Vhl >F?aOI' #95xսzB"<䕜@ӪHdb%$tfGSVa9TYY)=4Ol99 UX!,AeeV4O|羰+.OQccq1Ue+8 1iu8nlu*DrPVWiv vWGQ%Tl@> U_W^NtPh!ϱ7U C :++r5e^9Ydlwt  |NGX MqV&HPK @F{#VA)<)PRTxˊ0mo U{M[Nޓ>peB$!d^ڱ!.~*:eV-UN\iU/`9boSS 10NI< X1 O6oL8vWx,?w#/>WN]L4wLЦUn]mq# C+FR'l2"U1ttw?CI6ZN}nޑ1m3eķؠCۡ@6-ZtcI vEs2=k?끲1=}O2 JtMGJ:.5ďΝUv6%Vۏp@tIHCh\Nsdg1P_Z6I}v?1e!=}O2#E.@P.Qu%'%%%geZ= x:")GZ~{#Lŕ;hTXĵ3ࡒ{S?4߮c x0}q}ƴʸ|_HJͺd54`>66+u7UXqƴja<7}S§:@B}ܐ.M/(=0K!/Ǎhս%ӷ^Kx$/UBMDqw9W5Q2}Bu }cuw>c}l NqaSw3J6lwD%|BPW5.jNP"Ǩ.p/c ~1\T}xHgga>j 3rj+,QEK=HnBp3D|H)¨#.7M00B9/OUS55Ǩ>5[A#6\|dJkA7n W*{#0n 2ho9E_\!>0 W2cpY(d+3eCl@D !.؜<^2`!;x i222uddo֬1l @?o9ﯾ,3]Bb T̍3;vJ2 7e2C^+vUfrh v5>> Qdݳ1/Gpt~w>=y {T>=Jk_93JQro>$ﵚ.T*c(a9ps=(ܬ7L6j9K]xI) !Z=$zc$ҏ~1po@00M[(-)%`:_=~K|AC8^ʟςE*w8s8R(+J}z7,ceoT #a< (!@Kwo3 v!_SBx N!(jVfцQF5S:'-&7eO`~^4\%.gG2dPqrO_ ʾh3Su`*__O@"3pmx3dh0X0:~=+"( h~k@rFz%DXy2H}S}(ψ֐_;(@UH G^~:-2=G'ڪsǔN_"]<|-Jo>Mey8C$Du=RrN< ~gZ3?+j`ožeWS~@㖛|dGC,6 @e܏z{$*oʃ0`f@,)aYq2O0A{tn%1TQ_s0y%Xq\Ѭ" S}1N}fRUi- Wxl:d'FVG)F=J ˽&!$@Šn|mWD|@yL5`v vNI݌Rߺ3W@Ac2Y{0 !E Lۄ 7_5DлE:A<{p"Nn] OB6 TTgS%%swaNVokE49}&+85-~E٤D><9 i}T<6®R`PJ/^8JACAEf`Ty1l}0wT¡J KE5gބ<'h=cȅ<ônҼCV ԹS2}6t};XOl' >-ԻCqBp;mo1L3Olk%㞣U63dܑRgzm;OG99=`"hٱXtJޘ}n|'o>vdg6-!槒DP+f0 R`qR$p%,Pʰ1h4_*Aq;*x73W JQjBˮETٖu-kD+X!֙97= /0939s`cyq9kmۚgw8I%Q\2~aL<Y}  x>%\J9QdO0wh8~u[~L p.W11˓VSzv~fzի^03gNFUUU?PUua g.?\jǰ>C_!V_d/999qUUUCf4mVBm^^il!,0 e֬YCmv4 yyyGw s ?\|́K[IFfWYv+O8EvF|QcоN~a/%}p_",*n5+cѢpOSP6}s{ؙ-$ JJy"R=H=HZhNY{uպ׷wrj/߈hypc~ܫ/9Z1a1FhU'׾NTrg8~3_;[߽X^ˏ%[!s D,x=s^;*oD{3KM9'^;[_ m̿ƛ/ЯlYE`!X"|"6dap׾su덫/ʽBm!EpΘn6qgc-B^~cz?,?V];_!€e6@>6)~u)gcƎϮM(;Ӭ=τ@辭œjڰzA BoZe`&|xuNN"V/j_7 )2b f\Ѵ g,p t` I$b),]/Y~W^՗- ̭G 0P7o^!7Yu?| 椘!2?lD5w̑3hig& 8#"8z^NⶡZqٓ0nͅ732& ?#J_>$gBP◝rzߦ^hfꚹsSN{Z h̝jS`y-YbUTXJ[ĺzyKVi@(wcbUBiHO֠( -XnXRsGm6 ۙQ$CMMaQԑXGcxBO|#H6'X3H ikH$H }%l4_7iO{ߕ#WZqѴ ,{qzh@^P4[xb(~l9ANn5oyBV_/̋1 TT*ۇLi~c} Er yo\6jWdo- h( 0:\0 q֭?3%%h/?niY2/-ďZ~fo ,猪Nv8Ƃ<6e;̖OPTX=_PO ~W^'S㇈X0 bgЯ3NO6^``Yfrb g"vbh34m=c N+Z5óv2u2 ;Y=-/mpr'`GDž|IhQ1?׼xܸC!A1^1U?y{P^g)vXoV9-?3cb fqAfWOxy`{Rcy'kVNOwUE_pS?Jw?+C/GQ3pUpn , 9k0oJ%@T Gbae40u ރrT:2! jn:~@eFd~^j?DE7P{S8܊sD cVl;cG y[b;iH@_o)5yg1s2&QW3N/#) Ѵ;ӓ5Hx9HJ9|,X3=)osSy3QG0PRmm\Rm' /#ǡ6nr:פLB_E\ɪ=hKM!,qd$^♚k'wD%w\0`E[*t jK8Kq[g뻳R0yEuZN5^ _Z0KP>Ye@Vj@XP>;PשSK +C/̟RyC#/ԩSoݘߥ[4Ojxz z ~&uD#P𓵱^p3  Cb62d0 -T<54YXjKF- q7+nCܘzM NN^ֺR|'|Š{^Lj{,P>i) F_i )>P?X~8ýI^'cp{|&&wܤTL¦QUc/Eܔ<8|Mo ѥ ^1oD-+V_9sƍqcь28]_ë[3QQ@q˞KxBߩ%aL+ɩ)4s=AUL+ufR@" Vԛhꉰ|͖fS~W^o[.̽ kq2IM+wb6^s6}룳ml/m\'0$F?tˈ7V\5C&[hjXxГ%\ س[@2|1P-OusՐoy~1_m՘ &~rgCOgn]qaE^Z)(Ɛj>ZG+SwǿIyч s/_aXz%yga_Le|s#'gܔpCono 7E;g8y}6d?WWH c鲣sS_]ŠAPR^[\?#pؾŲzҟ^|^* #V_H[o:Q\nEG_&A.~{vfVԹ .Z~ [hDi _/q*D k"cP#zqM K}lngzaksƌ-a7m55s}2aтq45m`fƾ|N|ƻFS$ Wܼ`<_ FӘ\غh՟`ƛ!sZֽsk5buC\Dьk j[͗GO~3U)7aۑVRޙ`@ֽw O}ӝ%*Y_cT]۹'QY6=6];@@珪-첯VU;Nv_|>-o9vɅ( C _m* 0qkʗ@.(ڋam 8-Ɲ{S"ߊZMf}fD˭ .{v0ՁZ#^acڈw<Hz^Y_S#;{~hx.jMzruz ǜY/ RǨB{nHQhu >ڷ1{{V߭^yjGm>zjѺ`T.5]?^ k[n[̅V 6/ϬeE]| /u7W>RF:gy7X@KGSGFj((^>wL8[L߱&Vzœ%#'胰{w N?~ش:?G㐝BCD(F|ز763ʂ?NEvZ&6/i`}J )AiSZZj3;:g#=EAAfZe6|/a@ !8gL=ғdeQRnǮϒ!$G~Cn' >R4/1e?kA.[}4[?LnS*k0gr5ʫ;8^ QOlR,?2SB7eCq;q5 Zi4PUƸHI " $((⡲$KЈG䇓(Wd 4bc?v> U9j3E'xLZ#éf<Nў_vX~]7'P/KG{~1~`C紟ЎIL"/M%AY>~FUǠ30̺Wgar*PVcEUf^ OuP, :ޠt[~k.4$$ ήCA}%|JHEH6ilۀM{0RW>LŊ%;GodtXRlt7אPeXaс aOQcPF*LX: ~-ל~qA {ql>?:9.AGz 4ةoFD@RZW_Vʲ LTk7O;TAOjYC1 #k򣖟il<s'7,)+_xDhqށ Pq<+HM|/QOϋc`w!ggM"E<P,w/V\2(2[Q 1l3UԝC`PO6t|~kpN,R[ƣ8=bC g bـ/ Ag)o/ M8DmYҪS:cdf/.@oV?GS*V\?7ax ygfj ^$;up[:kE\KHu3 @gf`JjdYKp}5 be LB6P(!jW@6ӃXF +5Y#P;"wޔ?^qu#u<1y$F6nX/ 㳁QaMB3 bD}мA$8k+3s&~ v1m؁F.aU/$'"$t}};}' HS ^A 1}LRUZ3I b t&.$ar߰9ѯ?I^|̿ypda]X?5њGwBh| ލ; נczԥ'cgm=]?6}2M ~8349*?/"?TcL3uI S 4k4=xM~8Z^bq`P"I_įx!fXiLhsuza0*{ DjŻߤ 'H?t ƐLxPD b RۭU2,kD–[AN~`YQscGQ"t8~|NOb[u#Pbw:CQDNkC%9OX\~:j .} tR ~5xTԪxng:[0*-&kkm Gk }%;uL3NݞѩopPV ;SNi;P>6ok5i4{xcO$?cOe34ķ{z2~U2 .x~g*2w?+ F8[SBsر& +Lnŷy"QSj%+vIB/u~;@@b)QZn4LŗHtI|ɂ: *5\ թ+; nkCJ(F"zAIaow (\|͊DWJp*"'3FucHhsrM) Ie8v|.vl9MJ.!\S=P"ϵðu! ]c[ l[9o*YB t @2B}aѶn 6$qr A 6D#[F@a `CiLC 1H V0B(XdUOYi;W{}q7>.ZA;@M/'o-4rqu7x~ݑO3W?!xa�k+`]-w0`+J*SЕڸo+b+e }if^[W E_EᒗJޱYTLXUxU1/F }3Sa?@c ǵ0g(C+!|[9^<>!qW|WaCο]q4з?%Cw`^"/??c=݀[:pU,Gg7ΧQ3{&í 'OaNwugPL+~4^dY hY a[cGpOƓ[o0l&רjlMt>?v'B3 nGI󷎮oohxkhƿ@0 s NP|QNƐz)ߗssqj.ƻ~ ]=Ħ ?,Z\>NOvT/*~B"C*UQjo54Tz[HIסM~c Ɏ'k-&4+7{H?IEE]*&)5Vl< gTj@ %6TnJ3pC@:e8Qȹ/ߙ:A8#m1@)?Q9t_0݌۬Iw@ /sFdR%|aX#;ZH9c.-c Un`"LKSg>wgLI!֬Ev_)ʱvBf \5姘 9 ߕ_w >~[ps?Zw4LL?0Upu0On2ο# ـ`٧W`AE{2܊ȇ߭CjdB V;cOCoMbq9~p~[QWa8 }/-G?H_]^>a>++O5kun>O~3|!_~3Fb|✹pf,l|8uAk^R3n)cphmo,jkQ~8:d _)Ŀ yga!๡}%h>IBi 'T:ch7-?Ȟ`Hy ^οWsK޿k'QϬE>v cpR<62 M)3v2;NjhYEU6ٛOM~(KјlM-R1*qbSbNytD.y{bx`6ohhL](i 5[54b6s9v܌3{4D#d$0\so7Y@W3—zkCY0LK̒?k~|&YS ۟V86}&jg6' G Af~ȰT1N>'uP,6\}Nim*iڟVk㨈Zݵyߨ,fgFlg4E\"FZ3,N1V\L7]?\},tL ,H?='~`̽ `0i6q $ 2r ̸d0$_ LYC,P j w|gɅG\[$jiT+}OIIp_">ܗʰ[ xJX! F:}?`AniV"X)rUB6l/)Q6@P øa6*^Qa$L׵%$Z ̭@1W7:`?vR̾CN|Yu(Nwbv*wY@'1NDoOd~LC[mG, ߖ97Mc$%)S osEVEP;È3L'5ABأ߿[ zի^{Ǐ畔\zw G_y啅E=zȌkw7I?Ȯ[`9bNd]˷Rg^tm?iwpVv+??j;㤡: k_u{Ъwڭs58`q?:,dž%[!s D,x;Ow_ ĜL =Ꮏma iURʳ@/az?,?^z%+3?(u))TZZ:X9Oƍ^Eź %%%D %iLKI( GiםS2I R x-k'+{/e)p|=v㮿;]9Wѥ,$LT};NuS'3ɕ:Ki;~ꧧ̿yhedw8}suǖ}:;}^uQ| o|coοH;[x職ons9R-cD  rks|/w7|s2x >5w}}0z|MG⮻꘸4 6W@@7AwfeE ܄v>PH~a|]R% Ia7D8y_5W  @m헡JhDzuJ^.n@)ăQTw] юo n౔h{dhl`nx!P7o^3+'rrT2?~U7_.ȹAM?t,L$iaf$'מ|ߓcuO# c{zp 2sϚ|gMb|uB>.t`'+kahx*%5* kW'㿺ںT}멬ުZ8էv_uR!ޚ᫫=h=+ E۾C7kYLbo3hpؔ8$y_xR}[^U:TV"1!.GvG/@,~t! 4`L/,YGX/g^ߌ-ZT+< D$;AHcݻΡaس+ϯu 5l:E#|AZM C EUIؒ&6~.B"Frr[/ =YY:w*kjrI$hɄ`\4Kl9|~,F'tlx''3uW]=o^:ZraIlIG,H߬er #۱ 0׃bD㧺FdHȥʏ~Qkp w+_UVu  VaN}ƀ\~'WǷmEr*+^7PlH™)+%AHo0^‘gPW\ zi~Ж__^{\+OU(M]y%4&}tj|$쯮l+Ά$%P[UU醮I-4?HƣaSP۠!iA7Aa_^zi~mj/,-CbB< K7=e5ݘ4qذ6ߴa /LD>~0'Y2k@>3fJx R4\0 ԃRW<;>`/A~Pz|ᅜf^gBJ&1+<}wE`L We@u6AWKS죠а,1^4o_aUհ8h O&j :߲n0੭n޺:$#.=uevg"FG!%jZU!%5).TV^L_?e8aQ n@b. jvPM\z"fف*kqU5꓉8^\jolT3pUpn -( 9k0oJ%@Tљ|3B~5ƟOY!-_^[Uaj |IhQ1? q=ƥE:ߑq_)'SZv52~MqgȔ&:,MADO { 1.j/B7&' ͝j9 KC m$]9E!IqGY0:ljQR("m294j O"dM04s~ uG}q 'ѓ@]p{YA/cG y[$i'Q)>A?7%RO5\=ޕֳ6~iLfU(wxHNE`o_:e>K|pv ǰ* ۷/u(u{ txC&"X[~k^5/tu >dI-CJ0`yl1v_ܒg:P+QEe9P+` 7^g",P[!U7u(b >}uu`fHC:k Kʼ[tؕbr*ʓwQ(f?n,/?Ys7lxvI,m4qI= 0,,w<ļG߯xj7`܇e^ƭVbZuʯ6z|bՃ0/()-JDK?9R܆}0s}I cz | ƇzV~0w}A3bIHC ,͛Jm|3|3"Ž^QV? Õd?WѱNJ *G]o'NZQHZ`E3?%-ﰓ%s(?YqM9ND5a).5_l{fʂZniM3HaҚʯ!|P(>? Q( \ ]Q4/fr"Q(a\ v,MizL1߽j hׂBZRK+-_/}9vM~AD$嵆 ;Kڝ^6f.? A|-҆s~@M´skԁHp%PýK'(:i +px0zp;>IO^K$>)mq4l~= Km8\@??OXhcDgG~O盐WFSb5XB+Ψ![M9F+HxPQ2_oX,YT2axh9\ Eg) C_-p {k^L?u# ~*in Adž|oզ96|k*+@DpPQ]f9!&F'mmH稠;m2GG\˶=ГR*h|| C N]p~{A+ݦχo/~ݐ`ن5IWIJoY)IvKˣz6{֜pyt!Us8*nYN|Ёt0Ob͒% 4t *־ӑ XrE[Ń/ǕʰZ@YϿnQUv>ThFΨ/mħ$ѺB~S_,Q&85 ܪCq$?Νܦ^6g3`#s[zrsO?|->{tF: W3Q3[>{t x=4xZ떵]q SѩbnSZW3Vc^6Մ8ע ";,o3lZn:PhdO%a)pD@vkϤٶ ۴,$@4Xm!m^70`+Nl{h@bv|gakoXF;KBhZ7~L$ȹѰGWLB|_>eMgϭ=~ݔ ,'"4]7h?ytKYpB ?f;}S3?j,CO±}t,oŠPR^[ 1KeǰtؾŲ:ҟ^|^* #V_cUu՝c'AIoFSyCv#U9 i <d_{ Td<~Z(i/5,s`*' /.WiCj%YxQVoρ%[(?3z=N.y  Ua_⇳_XJkn8w 0;`jIM N%;(!kCs#o3vcQ7.s&n&ʉ?ssO[PCٿ$׎ph؂kv@Q `ٰg? [>6aCG$4`bt@u/'؇P uf L # y0a[L!Ahe=;iVyy ķ bxC M6@8ySXX!I ,_FCl{9 [|@vY [8 _oz`msDXXLon{-__7dX=os9„)w^牄 ._=oMus)Dxy '6`,BC0d# f:͸t(S([4 8~>̄iP /0Kjo(gѺvwЫƁ쇠sOG:},  +@PWCB0`O͟ϱ{WL(j |X`T4 %*@o@![&Ej2al> @žz ol;TY6gQ3hjB`_uъˌu4G-/7ߎ O'5lGzЉy_!enp, .RYݭ Lh=\ UrhKg~O6FX{n_~apW7-ϛ3]ӥI%k8vRXcX-_xoK#7$!jt&`^1mGx M X,)!w-s1?T0/S>1(PY67%0YlK?k@5L5P<17~aɺJJzB%;;N¸>}/Z_<ȫ!l2;QA~MlVX> D՜r„|D-PS_0Q vX*$@M|6z@mm# rrl/q.,?}BM{=.)X_1mp~ [X=:%𧔒rt0E g57/}6隡 @F6!ʲKߥr..Yv 5 kmz}:ey" m${C_^LW7h$d_S̺FVT3Ȗ",hWFrv/\)1밙-f2QX~Ɂ}p$&3sV5wLG4$|?ki?~ԙLgYp9][.`Ͼd3MOE\čEb~$ I-CMj?mj-*cHiRA8YK4zIAwP?_s4%Pڶ8e^I}5l C^h*ZMB 1n)6iU?AyΈF$$|IMҐVwJd^jn_VC=%Σn|d`QJ/w]5*ZU6mE{Tۦ?>tv]W2ڑHV/Ꙧ 9WߎbORbk|`vP4S,J,o8QdUbj|[)B n' >ͧCtx5iZ!+#疡?M0@>S >Y~۱dSCBU!$r`jW[w2p  7)d#+#x qNP\,3|Q+q둒DPH7PPbǗCI?,a]B147ϪL|] ;AІFhr`$ S jEbΤ䌫FI;^|7%6(Z - cOЦ;?pZ]?N;͒$()҃H3+%.H4~\zi\Hj^`NB舁"'dR.a*.A?LIT9A )OX˖ 10ᰅ^[AtGk9e l&~}Б v՗?JAZ&cPF*LX: ~୮ iåO k$x }RŌUpWYۖYYKio.8?SbI1)Q%ٍSi5:Mysqށ Pq<xD3?(D֋ -/^sGUb]<-;҃nK_?"ՆIqcC8eՀe#y:7ݏaܘ9/XѪeY>gZj ju+ \W3Y|^ė B !`5A W`]f͢i &$uK@0`h WK#p-ɎCc:BQ0t UՐFv<fL*0RB( C7 /YV V(̡: ]"{`1I6Eb@0 K4u7c4!XFK~݀!%TUC"QY]㌑-M6.V&v,_a0}L= -TAOSP՗Ĥ/bڌgm%aU/ ݧcx_*m?a0 pY`S%4oqyP[!޷p{_߈߇x#AXTLSͧehUmf=/+%|{o1umÆ EOaWbSG@@BM~"RAdqgSy(?q^D~8}1eΊ6O]JoCL_7`iG{6σnXO~3|6qքwtŪbzTooۺ ~ jx j|ƋDa+)"\0 $6,f3 5z}C W-T?CXi\@ǃRHYa4A=} j!7)MfáSmjn7(#-aFkJi}HJ.Ca}GZ %bGHOб{\C!]g3,٩˽xngtqĎ=[޺AO&*jU<3G-HpÇ ^y>|y'voH7Ywf<$+;$$Et\t369h80'y $ n6w$9tpkfާnOi{0'~/)"? etl( o~x >N>_}Nڏ$D{z\f1 JIƆH?yDt^oR ܺ8f݁Z=Y , 8{@p5pu]nom)3% <•Gb<)1o0w$$HWrqqp&& u" W cwooǐ!쓈D.?%pէ)ˮ ;݁+*6.d[:?59 >f#=5IHKNiÆ =5ͱ3'1e#ބ?`s=&ഒ78wKut6 Ԅ>!3H6`;xhqY8?է-yY>)?%\2 (V(\JI;cQA8oPёpvv@q&^> |..l9MBo5|(ΙL6?9ΤлC, |c$&*>G?BCIxc9r0(j~qBO6N qx1iѣt6L{/ '߲LLۯ܂ /bw⃷/eF16?vv^=xGWNt򩌵_jK6}D(gnjYy?**ZՕbS:y4ĥ_|{їOf LL)MP\)p$G=Io_\V'muX(IN$&EZ?q_NXiVSa!ީleΝE;c5=5f 3-:C JJntƻ\d E5wJV%K ICK?k>|H 2pAwW _V5 f~%Nb–Hf:hO k!,.}g4K&=EEbK 8и$:h2׭;[.@_O]=&{hLU ݵkA56I8Ɔ h+ChߧHb_w! vy`=tb>H{ﶓݕ&y8CIl@XCJHJB61+~~gz 9Uz^p՜C CJ@XUE!(*%,m]+˩zkphC!D#_UF E(叼~+=GSm| '7GdA"4U( $!X?m޼Eg>Ԡ!}p,y;4A@QI7 "%&`}IȐdFpZ0[:) 6I3)fj'+ QO=`1m/ Fld2!@.c' 2U2%Q?ґ4b-\ļ/؏'jT%S0ӃziZ_͇4&Qh™Id'DO#aK2lzi}5!#]L7>z~^^[U&̔A"C4cK6&$Π׿ Ç~xn&#π04epq.DE9)Hϔildh֗ i".lr2;.ޫ^W8G]Ι|yJts̘]lUzիXZ))z_)1~+l?bʔ'c[\0e O9*ѭb]UppW;&.f }Ąψdbf-M?ubv3CvV.Mv. }I [}ռ. Bcauy-lSWapqAv>>ZVv>17zGfשvD|S]5bܚ>G A`ss6 p{_=ky=ǿg%Ky9=o/QyWpO=??/OsϚ9k,1>Z "31^|n ZǕ4,ec?Wu?@f"y{jy;5HE.fd?\s|5_.o K"?O=e,*olS婔tr7D8u'R)r~Cg! &S5iEf񏔒PAJ`B@0,-I߀ABR3PElAO:,$؊Vjb MZn8b:W}ªēbih ^yZŢ8:8ڤ:A-CfEl( +ںPWUujp@ nSEjQfX"r+ɓk!Fl*lv ֖~ '@I|H!Y-Fح~\bn$K|hi+F(ֱus m> ^/<>?t]n- IC3ŝV.4۱_ Ru7UuIXs?} +, $!ժ7hto7AX2ض/ oon}I|\3xΪ.Z պ`PoZ5k2\ *6HA!ߢR~kV<5_ Z A~oao6'a) R, nJ {Pڮ<}%BgH,Y3`\S| x 'RKF@B!ئ\C[/!Nz7t$3:O֘pmc[]Bx "uLp͠Y:wsC3 4  !t?|%@'g4 A@׬x5Ϳ pD:^}3:p@|}ӁN?"'. k=&k$q}G:m:`)aaOuNY\e>`C?bj03,6l.g|tՀ97uwu^HɰZU8][=܁?:^*ఊҳ60U+K+!ۑI]j`Uv>o>ӥmO3ï-؞*kΧE56t4Gh*KK$f5&~ae_._8hloMm39) O#!1d,aՠYL7ߵeU\OC`oXPW-NLtf@UizW飦, Z=O3af BO/wYPDr\hĕ V.;uTc]d0Y,\S>0 8/V|zI3MQsURd"V@`Kt3C@lҾIrq Ir 1 v>!>2[m:Q&=>ȩ/,`Y#g|nPFm76%yl$˲/!91Q/m %W{6@@ pg&Mqeo dO80|9P˘}!d0|INy&"f~i_64n?q넏M5)a:nQq !*L_j,6$H͹VR@Cuľ!i^_4$"[b6B=d~lS }Y֒KBX ܵ);гB@ZB [xZ)dǯMrMPYAmC:Pc,zl>d^7HL(F9ɠ~$*FݾP*iyV(V0f[t |>izkh #!H((_jǬU xxSa:U]+A`xb Uġ%# t>)GhȳBwF SK3}5gjIhټB)iJ@@&>56ɧU8W@);j PPk5}/`VH;@|Yu-!&+6VTI]$(|js&5&h5=w5wf LTbqmsV,|4珮i ͌R#Z&~tč7' BēRkh?\fhxD|&@ʵuk hR1& J\[zC`b6f_-`A Aq"Ikiu@hlA@C 0t,%HH^H= +5#^X\1bH5UCNϧAJ +_G6  Ք%l6)̡ǝ)6~adπ@D.hܝzpĿy(v+ Q|%3#B`m bw@aW2]G׆:s?.p{D6l*t3smvi.k|so 9[|2Uuu/_Ψgqlޮ ^;Q?_6ǥ{.h0oTZ+h Ϣ_EM8A]L@x謹Q[ ІoET{o8`P5F寿~ .9(h 8[ol:=mS?NaOtGZC B.#_P\WV H4 @Eu ~4TTPST~?7~B YWWC4ԕ!13jL|Wju zi:*+ &# " .QS@}`T5$ǩP(6;2=%|8zBxVV" xQ)d"b2 zӬ\;SG#)78rv㗞kІUXZA V k|9gU-w~&)ߪZd;JiLI]l|@i,[QEVAS~wﳪHPي.38lEWhK|4rwA,.MD5%4:tO ~iBK_<gRbyMA!N'TEWjR@A/)DKM% V jKJK3'=!抛/Rs8dv TUAEE]Kh3yZ@iKK&clUjHpYಷ&t%VeKK(K_6O+?zq.'l6 _F:Rz7cɒ%&eÿ o*v v0h@Rho7-{IÑeX:;]-Nx[ FybpZ*)?w}@ܹ<|27jA]{^oj&{|s3;ab]9=ƲUfq$~cي7Ib}o)?iDp=Y@z?d04yZ&8 CK?1,ߙt>x=h-V d߮OtP'CEWo0QTU%ح d%槧$̀baCJTԢFfEb|?Fi>ئ}XA h:4mXFP|OW$&Yg.F1ib "Q&] u`w\509.K]_B]]ɜe.\`WuZaKv&P#qX&#v~g{-N$JOC`0ԕ]^$v; Ap&'#ez0JxۚO'j >ADO3C TW5VUeWAwL֣m,tؑ!)5d$KDYEUsD z) "bi7ÅZf+gF s|tEƥ|eNVS]wڝ'.Yk|YkaseLvr;g}~P).8?0 z_CLǞ&•4]bK%,ߙ$g]],4:D'5bCl08x+|s8@vߢHOIA4 Uy40yqaB_$ ){RXS,bX$k|BvOEHa/$f? S|CWf?xv\5u uh dSR99I/D !u ai[u!1WDTP,mG lwWۏi=:q)UѣGJF%Bi>:,m 2&QNGhmn'6aG\$;'> hQxX|JD,?1= u BK1}n" 1o}| ZjҸqǷ> Šduq7w[')aic˧DZ-щQ(o # s:t" 'Z ɴƚ}]~1Gف?zn"Ѕ|vL#[C|Km-V&C@7t+H'JNbܰ[h(~ ܰ{Yd-7n<%>v>Gr|`jξi~F'G:ҭ:52lK飦\׭p&Jhm;On?\o ~ 8PƙEۆ ?}XeЎ1D21 vÆ9y٠٫cg"älm_1&Otيv_xb\vbWpׄ`rOekg,Ձ5$UzՓ  gb!2?vh2Pg|ʳ %~u8528{U;]|yk,cwۥ3>#6uZ]so|pG^ |⛬Cgwvݫ^W|,O#f,j 3g| ,j ,sXqu5<+o?@,S>pu^gmFI`%%Wo[HH8 cuI{J2uFB}Ȍnv_& u$)dAdž̸[[IPF ' qlmw+3m#$c=AoLHpJUwuł囑\KG;?bAk>Uzի^?-Q5 3"4JAu2a8vm-(ޗv>wM\$6ˌOw;жU ZIdf:Ƿ< +snv~7x% mƭv;SVXIL-n߶x*+%xSk;'y@IՒ#8kِ8Od(Je3*ضn6# $2󑁖ʧZ60L1( LGPT\fɳ$9 p-1)Vkٌn]46)| ?D8T}l (!<>;`?5"5ޜ` FeS)½FzE? %vJBN- (}"u?efS sZ) LMIAhvS, -S?~ԙMIYE)o삙nyj4)@˟DŽ8W ]f |w#[Q 4dVG>wa4r+1mM2|U` 2c{S`( n ~pE2c4P@ 4% 2ki%f>qmД-A@L{O=o Q>=GVĨhdL:eg|qj|DcK^ԩgX<5>" ^ArM7&>(gش(6OB1 rBil%[w3T)c))όZv7)t!bSc3|ȧೌ%GL=k?g 7z~hHc]h6tcmͭP|V!"i,hn5L1[BPؼvmw0;zMz nS[`&v"ZoEJ^>zOM|ϴ`=%yJ|~"ϧd'9EYtSm/ooEPCSmΘ-bmVm鏍O?LM,mWU~p '*g&jŧf&1w?5{rn\2=M̉UpkNU#ۻVP$):j=7v"*W=|J\6/`kn qCDn+zi҇m;u:5 y){RLٷ6|gfOiLkm'DNa6:*vgL܊oJ+~)|=;O?8kxvh{d~?zt˃]:3﹩K|)؄?%>?3]sټ.&$sa`4;&yaLъϣۗZ܊/Gd@߾'p+k|jI#@_[V|ɑ6$t{_g޾ZG87`F g۸{?߸/Xy=tI>zϏo~AXy1OT\;؜Ryy&/mrMp-MD/K|O iOih=QMtR(.st@k%~Y惩R\ ES%[S+%˫ 7/l=8 @pNMQ}6jINf0_M.1c{?0C3C" KӤRn1kСUZT7ʁEd/LݷtUhi5"ŏێ:|u»Go[ iPW2Rx_Dܶ!^]x# ZDL^kӰbn۱bΠ_vgvmi`>_|^+hd dj[xE W$Af~lA*m4?,)?!oЫ /s %A/?DmX1tBJyGƒ@m NС3xezf+ncnVfO/%ڈ2õ3$aej\9Yߝv<>68 $^ ӟ'yU@]8C\%6PSD(H(s/;ٓX"kqu]rg&~ E\n߁0gRЩ+f˻t'UКXvU3N%-cu_1'u[gNRm+I%lxM;"x D!>1Ӿ=:ޭ#Cc$̼akݴnkG ~ 2e矉gǾ'V]1ɯL@xx~sUݷl ˮG FYez}ֺRϘ;jw)fm_q?hz=}l~ޒ 7]g&wփˎDCFeVgk0hb[s$qj", Z^yH,8K"M_>1hykl}hic@ 3[u9NJE)on6TN6o_Ѝ'L7er!zI؊?Ok ­EDB|kfvoUE| !7ۈ䏏֗193X\yIHŖ?=M$ =0bM%fWm0mybށmmA f*{V?}3݈$KD6T1 d]!=uJq|3zD2OLd1۫'x~4?@4P&~FvByr1Vήqݏ#;]3ƜI!ǘ3l7D L]M*D|m|PI1|%L?tgY3 ~S[@3ff #>_ն߰KpEzy_FW(2Nhگ5motՅFR2Խ [~Wz"!ݶiM|AK==/>0A! Mz(&E. `{Bc`{M:x]1;S yUM!ގ'{4NFYm=""S'{qt::8яAD"q{M:UW [Lp(72vL c#b:lv29ˉ1u5|+nKn_t0c?˥)ɧt%ƿc?'x_G a$@(`DX>hG4QPWn5fIT<~nmy"~Nf6w8Tc# !gMhqD3?XG43x묠RHRv^ϫCZ'V]"2(;Œ=A"pM/ɯ2PplӮ]|ܕ|h7lWar}LwE RU۾|p.)?~~^2C*ePr4)YÆc?s&OZ2ᘺxT7؞G>ɋ׏?n+&5cWO}@j0=Q7WذtI #E!2~k%Qos:@hO*TcV[| CgQv~}\^eg:ʁǏEUۍIht`]3S'ީ3e,yQQ;@P\NTM,H ~&"s❇LG uzn8*'ӑp Na*$;m5e&QlHUsv[t!e~satR6GLGؔsB{*/}kLkۇ+Ŀz}bHPJO >'oys /R,]VU>˿˪Ci_p~6͏Rzɡl w&-R7< kK 4 c`gW% L@TeZ\ee0c{Ѱ-In $9R48wY   {lBmB0Me=N"f{]5fGCUo}s+z5x+|f~hGm4YsNG"lWn| hd-TpdaI>/z\/0Ë-7a!Ou,9>[;[ȿC~,6C Upoxˠ8-#zϜWY2O4L5ԣrYەAuYm~[nsl'i_S1 po:R+=fOwɨ O,UhZ9pmu |gl-  ڱr۞%.U;=D}`w?K(3DIi @Ux *AU(%,ضTܥoEAGJeIt$_r$?,Pls],Cu$~l=A4g◊zc+~H%G__w U磲:o3kLK\k|SZ!3_r9}۽~cgVbBAV2p8! O$};*l- ϻaeIh༫nR\E@Q&ЁGYO:'i'W4vKIT–(Qe|ߣɴKj?K# %.W1"_!zd~4K4_dI>q!Qp:)bQBe#.<+s9-=~0o}ogK9ulç~>#ox&9|([~[[#?W!Όmf ,c_el6W{T 2G $ FZBIy 5W߸pݣ +ɟG|z=y}ەR*iGg"E^|N>Ezn"TIgBFCfPq\d}a;/P<~^S(ǒt h3I1>8;%?w2яW"#UR l7iڇO` *i}y)y}*iK=>ץ*?nٸyW^ZfJsUJC Fř:@U'!$;Wm|N+GLLPgbΪo_W] <+X%Pd ;N!R<V]4 gV<3q9b_0AV#M}gl'H 6vrk-lQU!RSۨw2Mڢ u_U)AV<3bh]wsj&ٚ~T 0,Eks}gL]zr'ߟ"HɠOLkfx][uģ=z $J ޏŦ >vV,m?\sIt'L~@x?toME77CmnݛuWOpC}&|<_|ì/ۮ7{س7Vc/LQ g7(j2%G?c' PU]]fxFϞߠkgl'2{pYoʠb{g 7=t(fx8J>3Ƭ˒s.xףff4y 眺W77ck&`7yQES٧<o|l}q'!V>("?0mza\%6!n!9Qlp 1S;Cmyt31nNZnMwm& cŜL zQ7ӒE$Ix "o\ټ}9ԜO<smE~Е q+7}7]|ke~PWЕ̸/*j~Jkd^*;ھ^MÕOΪ սʨ-+Ij~Wٵ5 Tͩk˫w{o++ Tyb7 a{U85NNIm3pI$̥tbL$WϲSͮ^D)vV/+\Yѱ_0ௗ2t~vV/+yz2cZxT'{ h`un'1p'qp7uu=:~~_P`.88w'0 gO9tL&9H'!q$r|&oyӋʩ~bEFS <>E}5@!حH 9I[SS`O&~9.oЄycrlXzݭ`\(3!Yn-Ѱ{'z>ܜ]Y?fcR_lFzUr`r~"Ի|n>Q%crc}ʑgL]oLK3! Sq?o?Cݝ `"|wUDXDLRa>h_`)`˯HoB x0i/JOt=2Ϯ5$e|",!>[_iw!Pc@ kZ̪/*N rQZƙ wie0({C c#JI~%K̳H+໶uP),y~M8|q[~,!ۗb]ι=M-]fהOYtOxhSɊ/q0}=|}03w]/'igvu )ߏtSC~ we;ȯ$` Qy22^ vI~& Mf\Z#^v}ͩMƷ gic2`0{L#'h&Ϭ䢾/27C@O\p"~⾃=/WuQzmW)e3P'd|sR x0d=E&B^AA\6͗~35rP-0(3˖e|iӈe`D0wg-No]KLǭ>ƭf_062(ٗ^pgDdc| sDm8]$Gł>գa|RL כ%dC g|E}NȌH1pKB6DzTiT2~DӜZgx< L::!-1O})@ҏ-7#HPϡ2dD:&; e]ee|E}0%eQQ_d7ɢ>g]=Ȉ->_3,6\UZXOɪ ,R 14WwFaiԇ`oVdE+ަcĉp38[<啷BGmH(jmѨnG7?e-پ3[{ 4bzjRgSᘢy?Ξeh~E{;M|xOb 3 כntx϶XqiBOCQHNXtӞ.D1Jik '|MV/L/~\7*W+'p$pO2|2 30Q\D~vh>;CގˋgIx9f<3./ۗ+HpTbƍc kEP>./vl!XC\wGoz 'K=H\ kY s{yVSw@Ù+ot/V-緭>$޻Xϭ+⭳v[g R\ꗜH#}a4xs#Vznf&zmqx*c{r}]<}h}hw r8/.f&?{MWٱc M/ dڔPq^{7\_./n_ΖOVp׺Pw5br鿧5_W:vnc u5qfqݯ8SuCP+8"W DuВ!ࠝ8޺HgUI'_QSࠝ _! GLf$ȌK JwE]w_ V%HHԴA1k.MYoWE+`:gU~QQZ\ 3]O.Hpz5}d@oQsďl`+6T$I4n]{ aȕiewwrbnc%@@W]7dZ=>%\[>#L<=1- 6O Lr{'b[LS{Qpg<3y Ƒ?4]U`ߟQ(L&'}[ P'ʡGP䮓UQx{#LjhFۏV &yND:ܞD@R?jg<{t2c[2O$SET7r$ĥӒH ֏1@ƺO&UUc0la6L{A l>06D#G`:=$kd{AB(|o`k'aʽ!L)ͧ{x϶`9-s9؞/ {xN2qEzAra7+$@Dƥϛ\ݶzNf\a-ny-$2Ft_-3Laòbio2GۿTx)] uB)Pʗc_-j-yRR!H$\iD XK021vg=L\;&5{^Vv[ i ([릻hyr ng oWib@K?baIj1J L",1|UQHzH_X$"D+>}#,e, @$qm,ߵ+[_6|7.]rY;l23!_1i)l"v5'>AYיRYKj&^ZJ3X `: 7DiddK.6ѴT_:~;ӊ+J̏6D"f5#pjY_4CKRONO׺'/ _KR^-O5Pڑc J7%Iv0ӫSNPځo&9ӾÉ%&(0ځ$דi YS`N- T)ڙ2ݚ͖f>SWDuӡFDC&4oߗ™ V^s3/^֌¬׾?x%c뙨gC%0ƈ:륭6*OֶK 欓亣?fg38p&?" Խ}t~!=J_?۱r.Kj9,?^SԧmWZ Rࠝi|W[ײ.ښ7үhWVU}&{f~YE'f{~ssAȿߣU5V-WlŐꫫ.35Ֆ [~fb X E3 _x#ОRGhTLR793>/ ~$Ό>dED D-~n7DzLpqya&Ib2Bqe\9f4})͆޾egc%ïsmgxbF q]@Q C TĞbA-WP/(SE">sB@(+C[/FMQ2]8ti`49_l#ux'MMDtQ秇h*u _f'`ST- !.9vBU  8nn>T a.:}@iDn'<%L0RMBEgbPA % 4ۡ%TÒ"CGiTE`<|Z@)f\o}o`%BU`χX$[4m~p)wrWxU7}!L<hޚ~Ub8J|GlBIm &5[ۆ`Rken`)]|3X3w^1z0 "*OHa ή$'1"'P 3#:cVIDAT,zTsf>iңq0up` 0CٷUYg/N0`TU ־(!N&,0$#K ̰E#E;/xc)% t`fC=!C3aeUPǝ c2MevC2n'uNoV}7=c4gy cʅMҎ:{$c!(D =Ugݝb)D@Qf*Lfŏb83Hi"ö}&aR,#aQ "?4S'(Dc46+?R2Bшm_H69Ed?.ŸK$t)d~~(/1D_b-< }XDb`݄!ѳ[\z<Htv>TсDaH=eu?c}HvvNs/iȲPP0H= H!a>Xk>H pҔH|+N}Zq?&q /%M.cH3` ع?`(x@͘c|G+0$:936LV"G;+(n1qͦks(|C 4{/e4r;yJ#tmvjQ ],g܃X4'zrj9^)ni]qU&F9K7d,x~}KDxrc0B(3iӡ!rTzY8 '0Pn_9BAˇ@1]LF'B(֞a\}HxnX~=@<U0P1k!!Bou-?RA )@0$\J+*zݖ z#>pW[V~ϱ=C1Can"̆nd A/Ӻ.[~  Sšn"` -^Sܳcl[`403b8"1*C8!PSYꪊ{= פ6uv@FKONSdC.qDt0wl,ð4x":G,끷B^|Ȍd#~bQ8~C^D:'ʽ20lWpakOiΕ"kv&/.v݊7ǞCճg*ݏvA|Ίݿϕ6Pc!U>WznH ~-qa2jp LTUq'#DU}!tL?a ;`TE :} twPafDL ;(ql'zP󣫷';b˜zqq;y1KhBБ|13{\Jh>'4C7ߘ Jm\9Tk?&b8}>8<?\?g6-T:8hnhnn߳u->dxO3]gQ?U5><8]=YܺiͰu#4g~Ϡ2*U3WPy(=~S'N1 \b<ⵛ@7W_ BVƏЩ^H@rƇ𻠇bda9 y NAV.# &?(dHTꁳPOo3[Yɓy\JventwBS=X ׉p$z/E<;? }qh s+htT wI4U ΤOv.'.2 5C ~=`&yL @0bV5eѸ+VC/3}ޮ>TUv$FA|t(.z^'x6.[Veg:Jl6d:8TՙR70p eS Jc{gL?\wx횫!Y懢i@MuqS}jN3Z;4w2¾Skjk1h 'aTf3u'NqMSؗ%|Sla>Ȟv; % MTa(@U?7?vK6lğR[АCwF/0_itGv~0n╗s+dFĺP|5t 3Cq%Gf:hR24͈tPSTUEF4oM54w2"aRqb ux++&;9,#2$&9"²l֗a?`0 ]7P^#jPDZ ~&BQyThѐ"֯yLW\.'>:|55*/* j2kn5Tm0h`Jw@ו9 |ՆVrjt'E nh?uՕm>(\x-Tv$*!Eh*Kii'V^Է]9jiP]NfR X}r*Caiv}SZ{!T 4MnmG6ϖ^D;4~)ݴ<.8rr:M?Pᴜ)jM3-^s#HZb܉.sڔnW0a=y}=T0=7[_roN=O<~4߳@x%>_;GRC!v8ENw˽||yo0AEY?[f:8n ը*/"]?ixLmyܨl ·]3i"⺎AOZ.34co=rf_P4%ʼ*4ٛy3gwNrxg840ƏCߗݘZ+xawމo\EfWQ} 2e rg*բqSӲ@5xe:-q$%+V }v~$g]{JqYH|_[O@ȖomN$<;ˆ 6'2X6g[~vs"~31 hsMzӄ+.y"(:Wܿ;~pe&~_ϑA3i ƃ?)^:699SŶ=-0(  v|1lJ0?Ϗ"<Ț2 gY3\ V)+$J%&x{)'ބlwiBS|҄D龠?]X҄ĥ/X҄4?ۙPPtᰀw\9;u {Ά}uɤ@F-_1G?qoYQK޿_l_ 7pG? m-̂!!slM_ʠK-wBR^l+z)/Q˺b埽fu)p3׃ ?aJA^ :^  ;}"5ͻvk>v>[kmЪ/z%T΄ߧFhaI~wz; OЪ]_摷&LDƅ>S/Evb> 3q;7%곷Qg hpqwKW(1\׼wKP cfruIEw(t//Y>œ;J{`'|,9wކm%vbнdX 9moo~Ǧs|@jeѤ5})slu5d} W^&^}D'ELx`4% 6> 6Pe`tՆ%??}"$7fI]}k-CsmWt^wλy'&^@]/?S|u5DwC]}M9:FW[&ɨ&@2)xǡ+?iхDg)P?ݺF7[|Jxq<T*'B.3 /hХ߹S9Vy=( ]>skFܹL9Y.%gC@w3ybeJyLXH̩| RDYl2e<B R7b{vWL@&w2)I._>.ߡǯU"1EN`I ;tǚրZJ: xL/tU)ϟw赇5L?|\CO~eXSbq-~/H~\Cc!LjIIW wUhfxe7Aq6EМm77sjob&ķ;$g477ygnb7+I˞1ܛqr¾6E/D G?*9Xofy:1l&n]5іGIL7K!n;蝹= ytU?>fn&V>֨^MLBܶioFVXߥmFWlYA 4Z]`D3Fn^rw7}ƞ}yVc+#M.1%6s& WZӻ%cP?2Dv¢5" ~: y"n4`OG>j~XyM`~x`C>V.y07csFw9Ԏj"b+;;cw]Q?1[5__}DM 1nM&p`d̤nIt;\,mu香%屻%s?{i5wnڸ;\L9}{71wڱ٧hrl+'麻Aܽ&I/=?֢͚ f(! #؎e.$iC`lgQl+ML!Y;j~CkĚ$mgP~f+gh/^7M"inܣ/2 o1IqWS*ۮ˫ ݜSL8 o'4f]7R?*#M̘)tB(Eo8'vTO'2b\ `yZQ6Qԩ;7cULtb 3d* :7.[\ņBHP/VFq~[yc@QH%#0HUҗ=dMƮ b_(8Ϥy0Oz<߶t3x Wb(2,2~[dVcOѶw]3a W 5 mZ &olrܙļܾ?ą2LX9&z?io\vLr y!0>фfqg q_ʶ*ѽ^@$ %3c퐸\Ӵh9'({K0 K]"jz.3"ޭH 6R7yі ɗG<.bDk/m K9Rm}h \O+/6@1,j+f.]F ˮ%A ߸ۙr>F[KK?8U@h;gjGt̏|(?|*Jo ⬀% =n^@&S0v)=ZU7df2 0pVc ` Н&9Gш ?Y^@Lg!qU46sCdjݼf.Й 0'@q%8#Us6R 8Sq}Kl8 !u]WA$g0҃fI{"^sg%5Il\ [@&,_"+lҒ鋕XO8bi dDA̖R b,pq+,4ЩZrBdEܶib%!3/vĕCM}D\1'TJ/^P)J!7ӒŜ((JL3_vR BnF0lxFb2"LLPmPD01L 73)&4BBa0Lb<TKL 6T}xJ_0x31My~Eo5oÝZ_\Ha?闔r0?2%]O?壭Vm3oGx-z?I?nFI7Eyc{N(%^7eњ~n'G9m}퉼Uso'%7GI[DK^$/(Oh3y܁ j=MK.MzD YAX0:)95u:R,~iJЙOdfB7YJO%/:SwYQzHW@(LX24 GD~xfUjEgjA1ltM&|gNHmw.Su ~$lؓ×,N%~껂ӾtNBa$K^]biHcN/c ({$J߾ Kڗ2}&VaTl_~"Ȕ@VPje˖)e$SK! &RS~b*|J$8+=5S}OjF8%$OEEMӨ^Q7d^?&U7GG/ۙonmUu# <QYm7#[ƽ8qyfD!Wo\q[^Il\~S g⍛_x%o60phi="e`<|#ZtAj7Ic<~@|O@ >2b_{60btz#qCOILU /6߶AR1cvD0=ɠ5j<>i} cO@0j"=@"?BU;||4ۇ`' ơ~+|* :Hc`tO^ ;?V,:p pUE}`Z pʴ`° SIkڇWudoj#1&Tup?/KT井O>+:L~΢>1SUmj'5)E Y;ʸ LgUtG3k$Ҿnŷ䇥y<@iD'/S 'g.W/H+CLD _Rj#'*`"lf}P4  \ v{O c:j Adgt>!8=VN~8QnopqtD!Д*C_?9!|*8>!|eӉ11QAH6-9A)sC1ݲ‰ʤ34y~q9x؀,Ě_&|NcC7 HOCa,Mg3qC|Ɨwueş;;2@RfxY*Ze9+`p>?뽬[3Y|LY/J`ܓ"$SfƗ]je'> 8ގ!3LѮ@<9TSM:֊{~t0ncH_CCt M|uб31*Id=c3.vu7a%vp4mQHC;2 ,$wk~l#yu\H>޺ymoOPq&?M*-+2{ qz;{>%/ӛT0ܖPL~^~҅- ZZ JBtذ^iY+]KR+άq' J73YrMl)ҵR D׌;~ߥ(hJ,^.+qY y 3F>gZ;?L@؀)}:dv/71c윾b?]~ 3;D7];~zJbp3HwSfa_|N\M':TBKm JGͺ-X͙DiAȪHKO+aNpzgP9+X[(fS).M6zx}|K`[l[nqeۭmoM5:?>#X1M%1'lJB`SQh"F6wStB1n4 4rU׎WJ@gѝ9G"Csg Md'OUxEn/;ט(kEu1LZiH F!%TV("Ԝ>11]"30 P3 'K/ܑ ~(`i0 =}H&3r=%ȏRb\ 3|A+dj+:+U'(|1_ BzS=RݢA +ŦGLYWdG&D:~|)[#G*QO/sV~?Jw]DgR=NW\52=mɢJ;̙b$p}M'K`T!L~e|,~i$ ƞLG:LęK)ITt:~N$K21#g_  >e2O^I48Zo|bC84@EcA8oX.[="{ÁĘiA(ǯ^xuOWyj`n4$=`CB:h )P]aR^l_k~e }ݜ+D8,~ioB=EӠhb b3:INҢu8ֲ7Ma:nM\΄/z\ܛ_pcػiMr/10iJ]TN|;kpN~Ī9 9# M"$ZbMQr!寽1cͭ?ϝM/}K4 ] > MCq@1qq4jZ5<̆ɟj0>Mw%tSdl^Lg!>,>MT=rB[#l62\&X?~l7 |d Jso$2saǫ2,fM-W`zes@[sNy"SAZ}-M=sm0@Э9<I`s DGmBܚkS胙9sڷvj9$ŷ#T )-ߣ~VmMLc5甧BJO2gk9 K]361$ĭSub-LnckD1qXL?ǍA<䙎=i_ iڇqBٳPqў g 9mfӻYo Z?,Ǻ1x šAsxSONנƬ@T/szOp\΄p3~pSW  a;y 3g8МZ<瑧3>6h>3:sR Gvoǹwwp^yGu]9wwP3CQ`=:TwrN`NJ}悾C~$3 G"?\{sMK2`-]+?Dc /|*Ct$˟Ⳣ1pުJTL[}2>* weG}D_0YBM?:[|LjQ0b q)9Ckq^_ژlwNDueǎ [c;?F|^ms8+> |=J~(Y;!ߌgL%"}΁?L9ǹkˮs4^7柿`yQ6n vvhr|ꫯsLYh۟dn7 ;=q/|3Y|ہj}@_Ϝv++^tVoLߩ T}!ϩL&ƕ9VoǶW?QV~|LgWߙ?T|^︆~l^}(RWJ{syz ;IxN![T૭N{].C1Ƀrux*.+tw;%+~f pgP^Ƙq(pwA~Њ*FlC\8=q *Ux] BLڱ*wd5I:ȉS& Օpy6.[\x5"X91MJ4(ў  UP"-dyw|"wh{*'@sP0y}JA?(ڈAOQAp "B]}Nj7>ǻ?_q"&@Ja3Dr'|vgOn_(2zX % ̆%}Qpӕm r{%%mEr xƔW:*w0uĎA,zTK@HlL}rb#tҢ/!.2Pkk*]e}Oq^b"lMj(վJ{SLLǿj/z %?TxJ[0$&*o_)/a*5WTOhxH/4f5>v2x DK2&A8!>mC}^2dL"2 \px!G~4f© YLY|ВtG A<|C,{ ZWҐ0qޣL Fw^MG^4 j F<:DMz$ Ob6Z߇. /(+wgǏLi1nΚAۖk HuUև/]y|Yky$QxT'1ݝ'mVc{~$$3> WdE$_: *PzX]{w0U ) ?ں m|f0tn(Y>Pg03_ C5W&v}}_B+U4dJ뷼;~˾'s=7 _cufEܥ D_Ӯ|顕  r=GQ5O] 5O؞GNF1@_p}N僚BC//£ͿٱbWrqTE}b|mœZ}K͛C'0qBQm~񕧑ZKzws8PZWb6w:m\r<< wyTWIbF޲5g^>GW&|CƩAm<9iyW 4.~>@;V@؀۩@S䘡Ƶ?o钜nT̟U?ky37Y+l` ~LZf|97 Ď='dY>d >Ω!,)5Ò'}1 ~@kO10i?0>~rٟqs~7 oPeÔE?y+ͿU/* } }2?_=i?8T%Q^WWS܇)U9J^[UYe!?LZtw^yrO`?,x~Z'AC}O| 䧾h4a<<>$?_r=|г*߄O {k Ul7SYQ-T&aseB/<[ľ]1?[&9B/<[Mork *0Fׅ섯AE|۪w:woa% gzŝڔnaN\gzL]q[H/,WՑ]B ۗ;x zD#|FN_%-;~Q,~lĔ/|ž$s)w"6wGvR>wnJ.[Z|&;o?|h+=|> @?v}7J ,W1z>v;9g|wg/cAGBk\=XlC"bqkնOk\}  `PB^3oö>#]s׶7#ʿr͖cH.p,x}[ipL]`'p>ޘx=_B%Ǐ7lx̞O0Վ}|]7-_ '~!'P~_9i{@609e8R+niU?Ww@󑖭w l^;~y_}Q+spC@!%HWڍKEBM}8*۾7J']um?8Jˏ7^ $_HqoSP0ݸm( )GDn{ؾO8jm{!m=;ȾtT_ͣ@ >pGv|KG EӒC131 ogm/i9W4øc)TYSsi㚠4KJ]qt('1Uy׮8j$lPLO(~~B^5ZJ\t0MJ$%E'›R&-\_އc`Qޔ$އ_6oU+z$W^MtC/$?U?c-^f1Wئi46u@Til~}Isq )>m\-nݳ$Վ~Eg6CKTˏ_Hsz$=oQ3vhu4(pGMô燌h^Ѕ ΨI,b⿄D]˵Sd[Mc apu Z.~go[TCl,wE=?^u|Frū%[^J&]$ \.@~¤qGsЏν!.0>a{Ytn~s8:R!ͫj."LZf1R!jH "tIŞy1KૅD# TD>ĞU;px:7ăʍ`L#ZIb:#I~ c/]ǮsOG<74&?tF2>qp|/_r|љqj»sL?ҶyL@6)jۣo隙_GX۬[4-Φux38^5s2Go۴́DK}[1G ޾o[]~dCD-9˧0g  黈"BSTK: ZdPT"c4Q`6pEQTu@x\eރDE%'~TSYLrv"&Eܞ.}PZˤEkK[Z7ɉ k{(pjj8`2𢡊XqT@DM60"*рCPөTHiY%- SD".f(ʀ{<Ћ-%W<d^hԺ Hb^?mo_9'?U/.'|ozq7.,X|CbQ,2> GgI↉׏Ə74ݿm+,%~ Gܼς,k(34#<ze #l 'pZE|fa=Y~oqkkyr'ZrUQmZMcw4|UUYbZkxt`jm < yJfC`Ѷ34!=<,8u?&^kxz [S[Z,vG[}؞>{x϶rΌD=7F or$}itר;V\m[gzd9߿벅 >*~Ɲ㕕O@cX-?w4ȷMj*P^8-ۢևߢi";w?p^?Ӄ3gJ/CLdqu[h-<߾il?GN^8"]55[+[ +{Z?, DۭAQE/A)*k[zZ޼+Īӈ ?504t(z8D`SuUx[zJl5l\xC)wTG'}>+ ƎRE+[*ׯw2㭳 /H7KT@ۉfI[ }Ѯ>5$r3~%㳸YGv"9eQ8$-_n _0g&h;rˤE{;O._ltWg(N[,a~iSRI5rMN7'F2S &U5ں{72+N"ש:*髀FC5'Ci?uƧON'K<$>OgQ_ybi>?a0/kXLWj=?6s&@1*]`Fp Bb6 z]n \S8B(e~!DϸAwU<:S !F4 C=D]9f2ˢ x<7ԖXuLD0t SҧAp53"o"Pq(Jv!|\yz]{=!Y9[chZ] $fdw,-NE?\:$WwY n0"`@0KfNuH;V_~?7?n |q"bQs2T9T{;痳0>k1 Fjp$RT !)ͫ[؎,BWUMUdNXղe͈<Kp) AQQ=k]UO9w C@aWݳB1An;W7c/1j>r= b}Αьr_3A3E| h O](߬I|`F65*_08~ сz(k?t>p`/%`YBAD૭*4 Y\''GW "#xmĢ`}:qDG3o[=<̌ӧ?DO_ck(yW֞gkcyɇg}Gۙx[ihQ{ZH8G~,VeDCoVQRw95uWt7C3 jx`!Ӊ$(((hb͛t$Ƞ2<1QИhA1&&h3GuWWuv,Z,osʣ-eqLBѲX4YK+*U$&}ie9R-RN̮VYʲ5_[ K= IWM5VL)J/ahm;No1uSt&S:_vbuHV=>a3:49Lp +/s L̸r.t""E;C͑{,+i q::A@ w6c>Χ,B4mww## "¾e|PYY`0lj'bc>?Gc| |d_V@$&rtu"B1 јHfs jWڐ|"„Q\T#8مz]'#W6>CS I Fvե&w!Upf㨿=8I@\\YF٦iQ{g _Z @u h]DeG;)|USRC\t*)m`__{EΟvP4V7Eʻ/}QOW'z(TU ^~OO=ᘄ*Lo<%]/:OA4D4uQʜHdtAYd] TD| `ťdͧ-Q*HϼtA-(%؟-9_F,P0}7 f P T E E$؛SmzkxP~qHHŻEP4EQ4H(*%Ѯ7h>Qi*H qTT hEPU(J$HDQV>(jG3 ! -q̨d&SӠ PMUIBe-{pЌỶ@(pf?T*SݏDp$*,-<[h-NgLfU("\̋qnH=nme%WVAɞq x+9T囇 0`቙@PF4  O"@|6Կ jDz4("anUpW=7O^ f8j![0,ԉ&9~uno{LD9H  "Iē;t 9>-rÈei[ה̶|t5K͘e_>[lL[gM)u{"AӰHY."sA4 oePv/!A;0I@(LDAyiFṼEQ`YKRK:{ \Ha?T" QZS7EA4L //Xp2$,B19ZnD ]!Ș `0@5h&)E.#g9ޱ\z4 2t0>pLUDѾӠzb1g'wj妮#4tH @ 8AD; .V\nXj3E`Lb`nZ¨J4ct:!(7>V+^6wԼ6F(eTInxL3XZkӣՆ,0Ywݲ{24u5=_o^vɎPm゙Հ@Ϩ/ܴ˧;-O!ut2`h_;ڲ:-6vݴin.4<ݡ-93q ֡z4 Wڿdsx<wAp{lGۉpw7Hڧw9U|Dc\V?3~2bC9N_q pnjDf(xHpz]#]/(wt9U)~a!Ms.ΖňhhD΃P6n |)a(}_ْQֻ~)v?O*[tpxSN,! kԡ/ΖE4g?kv*pUE(-/L9,%GȢ&sI G^_w$ߙD$[Ai MEǡCxH1stUo'[N7 B^작s߰pzN|Uh֭cd 8ۧoe79'Bհ28>w(yp5/hgߜ|#x6փvC-pwLi3t *K ؎)+3~Ǟ_/{ll=-p7p4F p+k,4M&@Ik71wC k۬靌gq+Yb˯WH,?@I?nm|Em1D#رrʙ˟:FfF~WPKUo\0 TK gs㮌w]v# Zh p:áy6U:@EWf_ن|SA,%BG4*@Dw^&OIFxI?)z ) ]h/t>v\2/`NtBQ`JzWqh^g-]?ȇBRd E 2'7> d'CSfSJhh/vkahTQTX,q1x\. LCu*+_/#;.:\ƌĐ +EX.s6Oxd8͘+ wQZ9[/sNƖ:Uo'CnY聳08"!r瑭_6Ŷ|/xbaX|!8)J elZ貚H[6 Jħ'nB"]\ )920!m!O`8QRRpHG.mJS;Zh̄']@M_P\?s%R%^/*ղGߘ:x/L юp(lzݠͯO2+/e; -Ҽͯ?10Y/u@؞O7V5Irۋ`:7[om IJT j%PV=S'}xfcP i̶|H'J{OH"VLCʃT#v ?ffX( Wi*Κ` Ǣ Q6چ:_t>@.|.U'@g_O`p)PYrNk;C(-.9SF4R_o;9쩴C)#$"`b=8BPlZH" [Å#(X iY0! ?XMNft8)+ZPlY E4MDA}>8\<KBQU(W 2˯Jcqi!!@D(Z_8HMS{N=FiY伱8n˥B3R;ldfΚdd%_Tj?qc'.g1_ZVBo<$++ᦷv2($.Ziy 7uM;/'NxԾ )DV^ AzV=ʍ,dQU(/-GG0a Ґ`+\ e$P/W!k ^`ZJ kQ?3-7L 3US.Cɐt&zSn|ie{9$U}4_h1 ݖ*|šf+l`WLZ`PhKlAl+@5UA&E? 9*e\/U_SKGBG;fDGgI':փ=fXGzB@-y __4H^=Fd;<%?ֆsφO ՍO^QBTyh nvNİqc`Fcvt"މϏVs#G:O _O^FGGA]]7Bwg@ǏRVO9Syrq y9^r}&\}ZI$3E2mۼNiZWZ@?qO_9Jf~]"rbjX;|cd ie)n+ܰ\ŸS183`{>76[:ރp 9 A=-)'FLJCw>|d5<-m"7˅h Cs M߱=te4>sn|SC(і.3~¿+`>{t>W5pLDw ]~=A=A{|5@\ i| ܿn=g3=$G,P*d_GwЍe{]*BF?tdпrr>n,aà)>{gIR=_RX]*P< [CRxǖ;v F*DRLO>)=Jw@ a'YT'BsP)*Cx°J/F*EAKt(EbT/ư /F)E O>Rr2f ޺CD${- 7zvCDmV932&061CDL#XI4}]LpaX!՚|dN|)% ʏ -1*Dë}h| C4>1Ag">Aa^8Z~nr?(-ԠiI4aPO٬EEph _nP aG|;pjp;Pֿptt;fn.j:8_S&Y>P*th|1vlrAq3@@:?SkӣՖ$'BɈK&lK"nS$~ӣ Y* 8?@EUYĤoJ̓Ul|H`i゙Li`vN7f"OVOֿtjAvJ;Q_Tz;_H}QK4oza>p<f\6GT/}WYWpf~}<ԸgA(}plȯM+}T6_+Buo>Ews32p~m\/R2" <X|þM1S͈D,paWͦGc,)b S3C8uSphiM8  mPV?)k <`Ǝ)h=l'654;>M45N5įZ׬5 PijyJ{7Q%kòώwM|)n GO:ep p i? GKŵꮛV?gb gIJˠ|wx)+Id烹@|כ>|P9=?.Q.UO6M<{Qc>}pمwJ+tڻW]$=WfG]Z~xz3GugܓR*MDt\'#[dM2a@`c}?r 3ca:H'ڡBC!B` {3η_2 @&nH_8"~`z1Csit}~ 3?0%a1C2Y1}bQ7`aYe0[γg_:Dh*iie̒-xv%(鄈OȲ, ӔeY,%[`zlψ˥ND?Iil1,]t>~~} R[lIYZ@쳍v7QzyaqE%lkz`i,!P6#_nјBx\pp:5\byVAbfa(3dL5\E^̘=d"~EÇYXwq1Y%' _$Gee<'^7CYcL7vFe^ n@S2,EC"#(.*D ɼކ'̘atmi ~C?4t|"JSkvޭ`Z! ϣtğ4{+hs⏟t+(?>9^D| 4?ƷIAkb~(ZQ9'x(ZaOa|CS ˟S|0Bcﲠ)/O;4(] v :{B8]-o,Ds s(|G|G="fi=%1K%R2 QĂ!.߉{}'_:JU[e޵9P tt:{;:{/J`cûsw+nj@L]]AcowP /ba[vk,S b?_ C{ȋD4S?@ KwP*Q:~DCƗ"':~mίot+p 3: 5Ls]k7 L:j-4ٵy.1Y:Uۧ;/~Ͳ'E; :@ >vCm}l< sX6[0^ȑlKWdjm%ힺǫʍx+\m @b׷Q~ vۻ?>I2=d{~s&eZcbmVW-r88!k_ϕȸ%Y/Z=T3y "~UȐxp?;~o^k ӴTDqMHJ ?63g%O/$1|bgZ_jvxw u]gp]{`/M?ck>0Ϧ]59,M9zOi~3B$K}Ҽ{cd :LB2q>Vc>vZw^'_U$qI~XbyZ;qX_|U qX*ؖWO9yb K>_$g~ӣ ajo8M?6'RP1Ŕj\3゙ՀQ? R!cR>w_:nJ& DY}` c'JN+'ɘG=:X.ɡ\\”\fJ$xy5e`I2ږmÆW#U:"7cߜ|}6 <ԷݐZs蒪=Gr g!f3.3 Àܿu5;w~}8+!>W?ADm~ |%I]{r׋+H2mq.dOd )+ 2\; y!FN2>nCT-K 󙨋 kڰ+/=|FH, /|ٗCIYzK9NRf 2 hj})gvX_}8Mr^,eO3$Fw$~L4^yԩ9KYb*0!$! ʬG:l]Xr*10 ܻ~f``2]:銆.2eb ȄI3A5Ռs:@\0O #qb쫦MG|GP4ȸV@`SZ6Ve{TvF2q~?e H UEGklOLk[!A6 {ki~Ro|Sx~uHDE0mۢ;^M34' S5qVw5C__!q#]?8~~˞,`0y8_]Vzކ7,?Z `?zvT9$@DԶx=̶yOO|dDeCMѢjMu$x8=Ќ7'?BL"!n b*7ȹm-mR?-3?2WF?q> Weq0x0fPȋ?G峭)b;iY< L7 qv:E<<_n6׀qZ䀂̛}|A `oJ^> oެ)7F߼N<6l>7e^pA.3Euu|&܌H8_WW|^0&ɸ2_ TP&;.;|s/ʧf3@B%w>[@yz:0@2:Ըu1O>[۹wW2Ãj6PG:(vV-z@S|}[u*CxoXƶIss xB}i}$E\40j!F[IPQr\{ ^  LvSK8TEIR9Aɓ#. Na@AtiJHJg.gқ'Gl o&?4(HU|ց?ڱ~d, /ӪmXxMw\>$Cʔ﬍>5+7?ok&_0k-wOsw @Q ~n\ q>+܇Kw2fCW,wW-ܫ|$?+Osv2a#I:(+xC'(`l6ޘwOK['l4-|?]+L]-W$!7_UܶkI"6jb׊Ӓcېļwv-s5Z3dP0%zB&:}:N`4CTKu;\ZL{;HGathI4i#Gq'cz>ߘ*I?2#5 ;MҼ݁{k7#yOثHޗ|0F|)ڻveO$c?2 @0彀v=E?a{bKF":L34-B=&vM Xe)5 {e1z9x3H)|0Ht@?hUGo!oNĻ9(hO_*?OWaP!!CwSӟ|Ȧ9XS˰SGE$O9Cb<P>=DӤ -`ݒnUVo!:@yUNT:Q^@J6qbh$)]b#(z1qh7,{85f4V3龺ϟ4@L-րq"H3-4 W}M ӵz,[,"e\ih1[~kӣ`uCKd#oec37=9ЭD#Fz# `/AqԒL VGJ[sb`8k{y|}eXB3hy0;x%o(B&m'mj""[iYh mjb{dt ">{m G{gw|$_DG;)>ϛDOQXi^>qOv2~p~ʛG~O j+h>k az)5VTnY3 p; =.p4:oUUQV\!E(p9瑤40 c1ta)1QIƒAVR4Y2Ri >@ [>?A&kY}sH dOL"9Z8L؆ 5%cV(-(L>L0Q%1cg[~,w8|G풅 >a'N"p2 )|"an=@~|$3n4$CzV`~>۟_(H4r<{l9u.:փnF~^Q9eB^;=E,)?َ0b1BA2dOGG躉HDIY)(? &LC"s$ykC˱Dg?zM{Ba Lm5%#Z0La1tClH!(ՒR"::{C$C4C(ܨu%0V$r3lI0x-" #ksIPZMZ)͌|oZ`Np^QJlR8*Ni1)KN=9m6ibf2?~-Tϯn|˽MHoZ@|gw$:DJ3zO氌nI?9oZ3:}:$N(u n7U+ӲXs&LBϏfdtK$yƌ-ȑ2~s~ G- /s |8g8G`f8)xX/`xc?bRq'._؀/d /tJ2 5䁖V-x{;8r8Ntt3! X[;hG{6ĉ.:N33nd*^շ>DjPԀOa8wA}IO ;M)$SxBz߷>LU?QjzAi-`t^-OfX Lj p~&Q֋BHD?iID a^ AJa}70tI`mm(]ŠrP TŎoA%)kxp$@B@(c=uɀ5)**(*bW18A(%k _@i^ ?g0zI`J⛖m'1nHT + z/[ wZMK-H($$a^V!rg`NhLi5ak! _"BaE9JFWm`wq_]so)q C9WT% JKP4 ԇJܻUHq _ (*ҋ`F,ܴU%50~AD ^2_Hgqo?*,0t~5Eį٪ae;j$7OYaejbT8" If L2PHY3b4'J" 6@{ [r iH~g)FV&L㷏l8meie t/ !ҺYg#Oc \?Q0,y'tC̴Y3v 18CA~0BX<6#cԧS'{N$~k *<vt-v P j_cHPMttxdܹqgV1#/phdтϽM_DXԛxlf\; :փѽ4U`TY=A)co&&e=1يdԨ)g 57~wq1'Q ߛ,oZfmQ-r=ʪ^Q+ԉ)g WLlL5'%K7YKe8r G'k1#Jp}=G5tK!73Nؗ->ql(/**,T=(+dl-@ &+j#6u+%Hy}9@,Je0XCqXdzr?@,/f,Ue ^L[,p~%cV 0nX̄Hob12$0MNo2b/2a-[X~`L<RQ]LHNg?ĩkΙ链BU##p >-Hd>]["Hasb߭/`;V = NS{p.Ssk";?Y:~DוvI@ق/0_UU/3i (DDs vyM컖G:xH's֤1Ήa.(_06^{f可Ad,=Rz5? 1/*vh?Kv/t#|I򹗟 (/8ph&rqo!4SAY+F^RJ}7#znSf->+t;f|-FF8WiTU-?7_hi3[Z#:KD0b AAGS.[=:8aZbzKEe,F,O}(E^bˏČz=fݝA4d-]!^H'pHG4j 6p^;IXԪ7L>=!4-n1-VgPHF~1- .Krb[?G|ᖶ63f-XбӌGJ]Ch>Ҋx+0sp*_> ߾PV۷Nm\&h-}\(SmgܡMOtahNG S{>3L G[pE?~J1%dw*R/ݱp[c5ƸQvXyMI6mޝ |6_ˠ; L$|0(BNf嗎rty?` tX~?wR~Ee4]0JAModWNvGg s/$գq616{Q, r+-c,δg߶EeILH-hVgE!+R G"p(vt.u ~C$t ]@QKKQX=A(#CsW'}-~Oӑr/5IXxk>ٷ@Ab]EtBAQe4 <;ms-OuCM#O LnPsE!2T^*h; l ={ݏ=[{zy  $V5Qr2@"ɬ8UzhjpYq{?-?$&BGhuUQȔRVR1Fbߡ#P@p]r*/Ƀ1_6? K80㿝3}vc܉nm'P:;'Ή$hGp3.aKr %=1twQQYKt,[_ Hm ,Bʽ8cp[gPkϏ'Nb\Hf?v~sb;B8?"8VN^o{*#I¡u?sǍx+M2'xaǪE?eN_Rۭx7J PP-[wn Pȣ¥ th8[Lȉ~(?+QX'cTU%JTX޸`ƻ>dcܸSF'&di^Y8=Э$(ͤ $pkeFLmmK&pM͋ڦ2K@Y &.ˋڊ;\0!2Oȼv٦VƤ80.X)?/eoI F_|1n1.$Vho;f.n4b=xqKo;&?ذf=n؉v.=B |·.ɋc]Q׭^U|!ٜH’W߿>/3Q _aE 3̻ 3wnܕMstc4;q 8 ^ab?0ߘHl1G:*%P+Axqy5./%:zz$iNW%/8&΋uK@DW˱KWpVK7\~F ʽ9JPXd~B腅v_vӼ|)%n}̈*rxa,2 _ʹ=}Ll]=fX_S֖%+Wmx饼փ5L83y?5AR 9|nД6L-|0b)ļh57/V` lB}0v;UOMa=O;[gmQ[`>E;;u1? \vk]Q !ְt;yJ77Qg}MwZcT 0{ZwQaE1Nc4>;bӧCҲ=j?cݸ`/NҖ6=zŷ^|hI!t゙՛qˊCgKϭ^>-ꆊ9s\:gΜ@ 3fΜ9O>;mZz,~iܹLNՖ`=us穯6`SN%Ϛ5Yf7]iZrZ|"UEOocXΙ!O1"rZe7ͽ}M׮{߯/^> S=ń!̏1e|re))ep9m\Yj>6>PxlRC߸ɕ?\. kkkٶm6MW! >sU3~>!Pޫ_=D̙33s:ݼk7%*Μ9@֭-s./Y0 R04.Ѷn0bC|~>-xq̴`16In3s~@2in&XH3' :e~u4$qշ_6xcw+#.0>PLY1y1466ill_Jr=7ffϞm[0=F1|05 C?uïW67!>P`6lX3$ڴjw>ac~JѼc!᯿s g|EW@H4o\pŐ_si{n7ͽm4}+yٳfbΜ9nBcX_:+<gGi$:+p ݊<{{^JJdFmK=i\"z Ν[1̠|5\4(?kE1H`ytL}ǔb'gO~>K{>Xf۞߈|_pd`c36}5y"I?glZh掕ھbI^bH(6.1sOmX8=/D/3!}麙{jMd哐1gaQ,*`9/_%g͚uW\3Eϴ/9&*2'ھ |Z|ρgN{HXO/$#TSQ,^Ok6!o,tTp2h۽u^ r۶mf橳gϾ_argoOO{nПƘSǚ.=.-nllfY0o{oн'nRzy˜9s.5 Edɨ;\nn̏݋`R?3p+Y|JN|Dq>^g5_@W&eGb&g&"VgEN֢'/*_X)G?=3V e0~_ `w @@ߘrWߎN!!M3f;wLf|߁LkGuHxBoޖO|;b`hƵǿuC kOlX7~ 00A*wS~6Zdk9c;V,OD6II絛n˯;q^u1O{._k `!wA,q+oҵ·{ ƪwރXg/zjWc狉1DʇG_Axljk\SG~ODH)(5|,C=mZ|Mƻo}i{_Xy#> NTs-O%`)ӴP-K%K ' [Zj^/KJO?"aYH&i@!bMSo DKoMS/ң*M\/bojq> ~>o[:ߡ__/6!L-"CIkȪ^4Xt3@8$RӴrq_zJL|xr Џ0"/Os*Izzw" cehmvb& ogg6&@ل@ [.o`gUx:|}eS퓯"Az \X蘧ҒsF^?f01gGXk7N}HA@@nm6{UXrϜ}C=,sMr<;};~ɖ%*D X[o=Q~" 4 #^OX!! x-$̠^~pZ 4 W*`Y$ZtiJ ( 8ƃIeoN#3ɭ ZMy@I ߘz{ z_MЛg{& F*XB |P?fЌ:b=Ryq2jX3OdaJׁ{2q^뷯\4~aQBfA;=v Gw0hE.3 |M#k{3pva-h 7'iўOVO?9XˠAq>%&0A6Ei|IJ Ot3}M+dc?&^>O&M%3a;'?|9gӏ@wqDcd?j}f(UѲ':aI8пщ7oV!nH/0}+:e׊5-a_ĽW]zz:e/,?Z>ư |.=_uuuwdIkT_Qҹ:@2vђ#a1^.7o,3j"ہH{PX]V( 'KX 2K(|%~m5Ipbh,#'+t r!(=dD[/H pдSK`ir4{啤g"[tz"*SҍZcxJw4Wg)0(pC k;fE@Ƌ f\ oZim}xQ%L8DԾԠ.d8A?P*A7][{yT&72_wwqg8^Џn3{oL5n&MD|5|dB?ef}Rf-'fz\~5$׸>?u_?Jg2c&eE_$I?ךSwn|s7SXÔx&%3/7,bZ}}K/xf|ecTۖ=OP/]zȰŊ; "yEyxgGm>t6젶^<K^^OH wӹxl9fܠ/Z3yxOs@XX{1L8ix'|xiw3-]RT`?)4|9F__<%ǵ\:)VZVхpJwT<̵3U5_^Σ@M3CFf#>{ exn^9=/x vTqVtp \0T/RR8 }ye`,a൞(=R)(/:t@AE9H\(5RHӺ.+f@s"-k!{%O {ZD?6 cc@Bb&TQb엲ny/2|N`Me"@?VW#iq 'q4?_V Jf ULT^0?lcZ1^$Ə5Cd>Q|)]Sc Icqx'@/'0m-}0@3fP=x=`05&g^M'&F _|z V*9_O|F~"fJկ"O}~جL7׫ mπW8?MO[ |p.>L~~1<-SMUneAxs8>A$mR/Mt wnE` ;~#A{ٛ1qRSNkƔc; dY3}O7Lb/@S7tc?QSx(4.*\m4o?o[N,9CRp)Nl_98&MEs@s:Í?~w~7R^SwPT&73T.sU߱jqNog?]A ԿyAwb 9{$Tt՛x3rns)h/@SLYS>.U(]vӼk7?7!IvQA`UVHB-Y 34V,1\~!?m v@3އ)+GZ HT$aAD( F& uh ~J6< eG"09-ӂeX :3#%U=C5"~>E;-À uz8`{'q~4ȋoRO| 8i2 |"j,σza;\Ā2c \"")ϣO?e"~>.iI &#5"P#S.>2I?EFu>GLT;A4lPW f$a}Ғ0-qc=a %F}=?.IjzAx@FqT>["qIR+ aʤIS^}MRN?=̰3RTa)QƯ0ᒤV7>I|N)n)RLnw2g'i7-ǫU&gu>T9LuU~w[\]{6;i6M~Hmo.K>ܿnx.e xM:fOog:;, w'ze'jzo>ذÍk Y_tt2.A]sfܴrћM]W7|n: _W"`{idgGؼq77,q]}/0rI@./Z>GVz'%Yb޼yo,v5q~޳. Хd8p. giH{oU '+be |i8*S}aúd WQD|F`re"l^fN/`)ĂMSQPз A3GW,8 {Bp;狉ޟ3Z OLIH$+Q9wWXc@y% 1XR0?px@ Ԣğ+ P?dˏ𔖀Q*Rw cN( EE "h??ѓ_!HNOGB: .";9I?ʣK?>'u ?|o|xӻsz?ӡpK!0pnDĂoAs|s>|8W5i^]! /oLP1y1o0e@x3+]e0>%yƇzsb2H8d bd\L/^5۶>'Cxŏ#A(Y{k㥙?ܱr=omLD 0'KZg|q+BP?gKmW=e7]$>M}Rcg7't: /BG{^A9.]'iZ0ýTY}h5'3̨  Xtv?fQXQ`)+MKnjB4ru}Rj| W5;hV;4e3wXһpdb8 47!뾠 B(}~dR{fδHF8 A'*> auv[Ux/A_åJGpX9T-:0p J4OɭF0Ͷ'0sV>X&m'9w/@N0Y$/ecyGe{f9*%^"0DKF Jjb1?gQic[|$A YQ-z ,b"?YdڙEI|ɉ_ĞDB?'ά%Cw%G ͈OR?i|ce¿ee7{} 9̈/"*nC*DG/+_Zo+g>-*1d,;k3(tRA8 ".Dbexr?P<pO9 7K@Gp~{qJ]?78r<(vlEkk'|gZ))nǍaU13\%r t!Tpx>ƌZqvhf3 >fiVe^a*B$13`I0Ӕ|ld*yYBQ\„|)(E?Hy?Н_B $W*nf(FϮ= |>0eNG"-Sck>@$ĸȬ_sh0ivLSFN]|&ǔY,+kI AD|pH;;">RR<Ͻk.4%{Z_5,h04/_V-NVOG'|=ׄ{U7/~n+mE AVL ڃz=(no"C࿐Cpbf͑BZLHKKv] sJh@;b YJ;}8"Yֲ|@3H]!l!+Lh6K8c tuq) bb5-'|==yY< w-9z,\o>’{SXTD@kwK/3mRgoClM};~ӔdINʟ4^?gPV{~DVמ~t|Wtg?Yf}5Mϖdko|Rg3'~guR#?xp~ad%#s{ 0'p[ogԧ•—R>=gΜs`&#+3XO)xX:4![ю:?8`K"O_GG}l1A q؎p()O1b4p4xe"@:a'{b8E$O K(Ǥ8yΏcOtt>Z5>=hȴm]mMu=)t?Vm2m’&'p݉>̿9Ο160~}*@cilO)O֮D @l\w1u4Hoh}7|l MwLNz_~ӵ1NMgK5׫_+fӔ$a &r7mfP~suO1qÍkc6vAM]`K落v7,qpM~Ɯ9sK)wl۶_pߗE< V~D~Z@-]#~*SN&!NaQ솣 i1ذZ!Gc;8Υ+vu'unUZN0Nf|bwQ\%E ! M 4oCҏ54~ώX՝LG@; ., RZL+{?&ςD1:wuw=duX*D"p'8QP˒.Pac,3 '{ݏ]lt.>a'z8"p۩ %`Ivk![X~;ܻՍnchyACn5rw(*)*BI 4CŅ?/+)g93lZCE'U/g,t4nO?4I+PyΤY*7O fmJ_z )2?t|?&y۫|C94>*??{I|ЎU^Efڴ`)n5(-i'psg͚u?)i4Afi_,ȽRc{S:dot&sL3Wt"΃Ϗ}O3Ӊc%+=vs2ɚNȿb];wӵ'sc -D+l7eyr$ "pSo5E59֔UU) l!Aw݅‚UjA;Gh*j/ߟ?փI@&};o-:Q>[o6 ؼ)WWeJ@B?1(},opAq,?Ci޿rK XzNi 7! \.gUK7-ߵ!'OJAy"2 nRoϜa]ᥗlb׮]L;v@>C,_p c<%kP' Oj"r^C k?KlO]o3lyg+?\žw}yK*֬Y@DpWO!ϔv˖-/&30Ț@տx}AYB 1Q4h i4QꂊA#JQ. Ny%ayf>{J3@0C`+b'? X@DkxAG?s)CHq=!bϥ^eP!76lh1hiN)7.׺cx;X*"8in~'/v335\z^rv|CLK9!b ߆ߡǏeY_(aDƍ:~;}>s=&MJ }V|3,@M Wrՙ 'Ysl(¼P}`eY.{??/q^$X, 0*iZO۽yPxeÒIUt8챿ˏ9,lܸqǍ75]iZ oBNT4c:Jn ˲ ,}F:%sWIȮ6_vcgzeyJƠ~;3}P5;&wj^='S&`dn)ݩ.U#UINu3 !jhUNNN`vWyy͚1999׷S?zw͚i5FzLONZCiԨQ_8Dtnñ"~ E`iء! -c`ő|pgV*fkvLi:V#4"@Z?߰Z!3323j`Y!~06EQV_q.wu R7M&`&LQam82o?8_ lM*޼l ?ۺYͳNZ7.mĉ=0o8''iY|'h|O$ P ,l<5h <.:c4'Гާl.'\.]Nk;5v84#N!~|d3gڸ,iӦM_1#~ IwѺ|Hދ)N8qaDPwv|OP{Ifˏ&]`η_1wMLϟ}.0e=IiVg(KJfҤI-Ҕ4iҤR5]_47?$eW@2OOD W/=W/=ʧ$Re)ݺ?Dge&YYIztdUU Z "H$#X^BQ|0ooZ0 `oշ-zw3/Px][ΙN #bm }٭UU|pֳhP][m۟m_ulS9eŬKZaG^Xz ['يfxu;zbFмiWyvwt򥦮};,^h-{,vsKnSwڤ$=ئ:BvotH7Dꊊmͦe6o,1p?و̦hZ߲y2R~7/ TU 4-[Z[`y|G?{ KF@P-+L^CzJ'=mxF>Üɾs!p">dE|PM,GmϷF~ :cl9o`>o;OlM77Gl80mG4'܂o $裂KBlz όn^r$g-f$-eMEo0ˢ9#[<F0B7"_]aʙU3/޳[ܪK>sPo6;o-fiA8EB^M &9#̓pu&4R%EARc=u~nQ5Pk5=u~nnÚօڐꐖ8^$"*I3꼤.e|]R})9t @?~_^ZgZ<^` oeL}m(/=Y]r]ny #qK\P<+;Kڶgf௜yQ/! 1o%Q9g˦L=պ_"?fMrLz䥛:^[1ҋOXV"O0=SQU׫[۳;nW8@ݺ$e?D)_Gk]fBdyfHޗ(~_m#?/ !Ntˇ C(Ж&~-{̐Q |RheD<`Ӓ&~ޢ[$z@(uO_ED-Qf=nl/,O?7GFr֨&?odDP?)?3s*rߟiӦoڴiv3?X'`+Yx拿z~wMf3ŀ_.'f^;|z3_~b94u\wwF[{g1l*I [{z7nLgZ*y2IO7=iKѧH;-dӕdySNK*x]0}^FrF嫚S/~\!Ȫ)*H#ݓJNMArdQJ֗Ufc`=3B O2\aXn))n &d3ɠgk+ץ&%#Ms%ezD#\*덊d{ϭ?d>hR%guI^uӘaCuY-Rq Ea= uxřggfRyeJ+*^ݳIgJui &<`ْ`QJ_ `"cjdѻ8< 7@RK*Py9 I%a(/LDaȡC&D6&@o0C^0`\Bwh\2K0m_=& ڸ,ZG/ {Lu9L9v2C@3Rf%7S-=tGf'*^%~A.!fp3>RILQ>S;d-?TmzCe7Q95%`|/5?mEk}6>Ynje}fpO/>.;f?-#a( ̋y4o$po]Gi 2o͆1;83_ln^:n~k^ JGDfl~>4bG!^n- ah^6swckּt@Ds BLJxy74HB/$EG֟a05t˺ ہ}EO\!qp=8eo!?3GʹqWjrDh~jP7>{ϖEs( | !348%lҲ=%3!+[zʙߋ~SX֟>8S5>p[TV̺;|/!>s"v:=y"@SO /s4> R:M GHѾBQ3^x vh(E2$G.+-LIDH[#×ܮ["R/|niyKHm%dz\~R*'W`#d6I d@fQhE-se%gX%=BO$3 J--$mv,~|z9ZH*4ad1$3KdB-5~_ъBP_ \1Mm'fKLY$DpSK(8e>2~|7/=R~-MB u%%*).Fr׮p%(X[ e%!Cfz}NRU:dd. RR\HK$7~(4+g^|$ v(NGS@B]ϭ!٣^`W FÞ8uM.? ,0 Lȱ"鞍̴Aqy9fdg.(8^ !.ztNyT` c,$[q7.bG HZ&np!@ѿpLq>)F 4m3  \uĘǠ!92#?5]sdsE`JK@D,ش37'Lt!ui @ D&om0[AR>[tk?F3>yL4҉[fGiRG$G.yT?p)Ę i*k6iɋ@ 4HR9e-y.d:c#y̰ٔ-a P, & `([$@W xEn_dg~! REi } `, @N&[#f A0cI`"U9  ?~i1Gvd< "%CZCϗ%HjYL 3weɴi<#8„ SJ\>CL w8霋2UIIFyIS4` q`*$7d3 R|&d`6& e!zF2 ~ hlմ??/lhKT^^2lOh6QVUR6?EŀeB"^\d9Dt&|zJ 5Ը) k/y`)2Aj RnxLHR#.XSa.Sp:%GJ Y`WI#`) 9OUh)Ti6EKh(KVd1Qb K.ep*5@|KwSj*Z*%ϳTRP 7 1,EQPbPI R2"l|٣zon(K i`l+)+i n[VF KHݳQU[ô6G;]?`51~ Pnڀ-IL7|Ih@~{+\n,0=" hTVÕ< H2`ߙ+X``E'jCup&{ JjL|ӛ+Pb(1{Nh%60|Pp/~ޫR$O٢W~ѩem6q(CKN"Ɵw9D/o-ߊj$5'Kݟԫp,optoV" /:\I2POė@@΂ S/(x| .om8/Ƒ~A4@~0,~ .x!6xdߨ0:.c? :K!g GԿ 5A@ ;<1u =O,@H׌>3L?ZT&Q nj ǫ EW6o/2Mb ",DD2tdzjGn`SvzeuCs"YLzi{•UNj`viiVE/BiޫEHwrT{ӣMEΟr-T׭jJsrYI-ͦ"%ōRQDs<3%9`ӔƷܭꦬ4+CʺhWS >U)^N ډ !ݺ"Kz3EzZ*:z`@vf:J+JU[ ipڛK$e,i(=2If;{ |l_A,ʗ|! |SKg`!5_A3)L A A("Oc& &AxtMmKaψ60Ec h{<T(1_Eq"> 0p"k4g| 4/h0`m[,.<,ZW^60FD8ћ(_Р2.J2 PdQA1(Z|oXVԿ~ֆ &MGl1k Z7MJCa"#f05!{`)jLâl0w Q,e?EOW-#jƇl hw|oeg ĄD܂V:')Z3Z,i> -%!hSR"̬;"`Y.3Kb]) "LVjiq-2&CeuL@Ν"T&ZiI6a* dfW;i>1\ xI,Rɬ/D=A˪2{u)__7 ?py+hfA7`iM|^ڀ=EC mZ F_JH$߉B̋VLkJPs>a@ ':8}(H s[޺tb_>ѣ,>c|ŬQ+f%7G|[p;|z*@$Yb_cF HHv |d_rtf%ƣ L%lE|{ qBU2KI (HD@f$>~&;D_gDNg\HzxN@mVy.IӥUrP8xE t''m_?f74Ajgyj2e?O,~j_VGoܕ|&ywIs3 Мso炊myrR\҃ nԌO^5[ q*>w&X˕MOC]y3vEKbDsoe%5`0N[fJUmn:[2f..u:CS2*jNτ/4r8,ZA 3Sp (>73;3%%ϟ:iGKPyZyl-Ul|![px[4B|gJR2D[@k>jdȄֿᲵ(C {hb R7h/äaC% a'A$Ţc*o|O6-T2HtX{X5_r6KO9i~q?Њܦ PTr DdLý%.τ0B}X{H;IYBiZeϯ3|˱NUUED?{GgB;5Ǹ<:f^o]qm 6,0[b"&c[c<9~C~bX(8VR$: ik^ΝK2o#!k|BnމmW|W?Ge5SS So|ū> ;xPJ^$;M|풝gbCA-P}%Oh1@cv|Zq1 ,E!ʕD-W2 Dwrm Pn-0z-.?s >V]+O_kJVhq3Wm kͅvrzd6aEV}ԿŎ0ʵkZVW"FX[]E٥Λ)"HrS7u ]z®K\$(0hZX\o$GFM wpC;s*R#@J/C^UZ!>+'Ȁ_gf| /%R1ḟb\2Jm[,|_\㘇o_^`u5/kӇ63bh|&~o#n&>ՇbGv'.,rz>gm1Vv{M'߄r/:Oz~LM&ЅL\ h,@aٚ\*%*D۵ e?)wrvݲ_8+n ;. 3;emƷ8 xoz.F|>=anKyC oќ `Y[7gC`ͣʏ[_1kTBL;{CΩS' u-9uJB>{nChnk9}nS[6oJY%-)9=X'TKſzP n9' "iY:c`vcst?^\6"2nR:\!G݆_tBim;͋~M~I.smO2ȑ7{"N*/ܼr7wO=I>=(|3jr2IH|#v_зo|sȀ~CďZq;rv ;F1~!~ÎG'ϙCN?{v<:i!~4v &`4;IP? . kN/?q,x)>bg<|n<.qH*qmeѲlZX7,bM(Lіܖ+ܡ?63)R>Е7$gD~C5ucǓ- /?Kaƒa\}ĭu%Nas9|V(ύj~$+] <W䷛F߱Q[YxSK7:6҈~O*:taak5ёLo/>ZԴ:6Q>v Oúa?:/ܧuZdc_M]Lmsv=g?arLlTjFeٯ2 ĶKk\eb1AUQH.2H{NX+0]G`ݣx Ͽb1/U'6Emohta`>nßW$VݐߪirJDb,w?dPd_Q͒K^_wPQ؃~zC5_L;dG`r,1֎xwf5eu%"J`\D /**-^jsv;[ʢ3Ӳi)5kj2GUGF[w3&c}„euӒqIV 1 {DIDAT 5M¼\-'-rbu\4|59uHԝˌq$jZUSPp5&rU;{Ы$u }\4uZFA[`T֧]y86O2* h̋ CKfe+.. kAif _꡴ŜRԺDJCyX3oP]]wp% &s(:7`u]n9o}.l9vpEkc6S5Qfc2/? a;@MZbFW%6k힘 TIW7!npڔ-y 9# Wv'Bx"Ɛii?-'S]YTEHy]`Ccf{OgЃwf|gFDD"7}t/[sQn+~+>˧GD̓Ylş=rVXٟ=w`=j{jݛ+y?[0d[<ɏMb}7<iZb[5>Vݎ g^tQywæ>s1ӫB[gߔ>%-[ WmrciiV,E0GWfӷ(Ghb"b0Q(;<~6i {_[4MDGՇ}n6/WifDq=ᶄK#- a>={m6/x0F03d(BU9O[4'K/D`.XւbEstU78!ŬQy ~[8cŽzC!*p)5$9ur@9iA_{ loSib~H~wuzMɿ7zJ|#o,)U7.9&CeoDJ??b#/y1H j[NkXɫl@ôԑP (ͦ3IL0* =.ƙq]r; k_ya].6-yLPO/ɏϞ/uvU화YgiK< E|^pj`d^Q6O;-zp@D GG)NRJ?Ad TYgݪDB!6DػA!ghLIJbOROt H,xuGA~ZnҔJn'Rbq㚧Դ3 BiZ?NRt&-܍ Gz1< }ۈV~Xg'А=W)Lb3 TE_}nP6$wˆ+5 |&Аٰd4oXcňPm603,]lee•>WeL2c- om⛦DYI ! = >,0=wmox4qQQ#K*0,"vs(äښ v,M͒6Ptġ4 =6nMapO]Z(z5=g evn B^=>z@? N+_jCSʌ17<{rKq_j8iqp'D5V+07=`3?+k",oќ5[ aZ-dlͣ֬yg H[Sy8H ~bE$jH!$E/2% 0 C fgbOP̈CHEagDArlTGuA!puOo+%gBf~]Lԕ̸ĝRA>H4 Bjx\? zW  /P^Z.IO[ex zf9-́tzf:PQUgKj;@,iJ$w󑑞gg9 ݲQpǎ%2ߡY##5~Ӧ(ѵi [[ghWO욦n]|C|9\3#kHb 9ߘ7)V@ς s #~l5LT]%×Mio/nNyۉnDo:`(z3$F}Fi9%*ĹCl | `3_ p3>~)~w?AYw9w-?An/$n ;O-|N[+uhw  #G^0<%*ot?s:T"!cm KgSO(\GMq 0=-o}֡w 4o +g^|R U;`+?Nȿce|fn[\kUHar[vs2]N|.jzsUꕟsā=;23RSKFS͌d+;3]33(gG  nɰ"&Hl%S{‡6$3 GشWZ`ڜΟCp>sQɗk6mO2ð(J6 ߴ[.3ӒPZ$O)%7\S/ /D4OLr.d E>`pBS9^$vkZm-El?q`lܺMwω Y-y-ObRЖ3G{WwO\(9uʺۧM` X7ּ,]Bt^n# -.AoSuX =+ڮa:i'y0>u0 )gm)0- KNħ123hS>CDao7[ٴשX^+lص:M.iVVzz۬5(KbT9CQ4,.!)!?Cu)գ(ڽVC,4~Rb@ļ?G߿oDB~0~h|xa5ڴ̐u "!]:!覙 ~8'_[Ǟp'ayoA`)x2YjԷxӸǮ9iȔs<%o<ܶKx|L&7ּl:)>0z+NOoRS|~kCwd| !~0R7N2х(.dUo'?9YkL;"5hM Ign'|YVՠp~u"%Ҵ@vO'-:T+bONqFIqm+):g3I. H/P ~bŇ5#558qM&(0M w8{_<5f9,d'KJP6iIj_XOTZG9P" T&,*AcH ݇ϧNFޙ#L[PUǎ,d9v[8rDFu+Htՠi ˦P;SP[ju>22}PBuMYқ"S<>Af7 X %GBݠ*+*NgiY45fML<Ĺ["0]튚o>iq׉E/#Ńݠ-&GI#k'+uzEt>/GőRSGgv_T XSӌ/Q~$z1m7JFua>2@ w/Q]xcǪ2!岡 %%uz;Fɢ~E5յ I;lEUaFಫNw KEfCTD @y^]o3d;|;?}@x\wHǙGQQSėqzF \xc_8$0 7{BIpu-)^+ST߾j?\l_m?|b?rn\U=XsW0|fA38T+hؘ;3)Y;=ѓcn]y7|&C=~F{W/~}$8+m\URA&ʿCdM'WZPB!0D348n?ƞn]ivéP6Uh/`CH3ef@{fCPmvE?PPe8VX`zHȄjS 3u e!V%{4DN\j1$4]#@D|~|{8!>=A`۠* (?3P*Ots=D MiXאvҏ(iI,Rr=I6qPWKȏl1^nWҔ;RW7;8|4Q\)JIFe~H00iNgB8|L1+KsKN$ u昮I7/ys,y)b2]aSEe~L夿>?ut D䛦o?dNMN‘c [7zE8'mc>a"WU}1Dv8vCpwnশ|I['6#t\0?sm'{{2K\WtaZ-?۞3A ڮKW+fW~_9aL|U/ beu)mLSz`at^5B#z[ / =D*LIDpfF+:gG aOCTF/$d ]T_ZoVtLfϲg;KTG& i7@*xRUNJfA<DŽNe$~ АFcGQfMu)XB)HM@5`\ `4$Eը/oZ*rf6"U~9PZ a`c k@b{-DmqIYK*@E%PVV lLk¼5rTGgG@( 2F*J6&_5|11Dee%k:ꕆ.5/^}|1ZQ0P^wxU4'VG eg`cE[# ث`~A逪8A(ZAcg@0] 3"y7]tmw~|>Uˬe]/p 慾? 8ѹ@[>pWe9vE]l(qW'U s4um}mcyC|ci⏾r/V (^Q5xe3:ȏF5gW~<5ĵC?[ uZZ;Nn/|nj) f:ktO3d ]ƙA4 <Νk-uv^p wzjîQ@}N of4BuufeD$_2}n @+9 $P]01"?;K0=wnIy 5^D ԤG D_l/{tnCiXM}0%Bo/] OFZ2)Zյu  ¨Kz:l|vZ+f|_KF-AH$5>kG7gRy5!l*]9 E4Z.<u弘랶[zvkKh6DxӡmPoԻ%P n]W:]vwyY=TU ґݦ]?}d;jk*6]Ug@U aBK^uU~*jsz+P aS5%.Di?V Q`_zD7C]ZΎwLM_JwmO/U!6l]vJsz46|5vS⯘5K|7LіOkO)_ajPw-~}))Z' FzH]"cXR]Ñj3tc:7n,L@aE"1 e}Wj*<ė&tydH^g4 t|f G J.=.u2יfti7KCWpT 9.;io9Y* S2zeZ\?#8x*Y>0ΟN uaGXq9g5P!=5Yx ?n 877G%ШoKZnlLewles~NJ-e _yi^[ꦴy++ 7"uD=X<^ m?\q~@?{lzm@? C.ӓ Wr" u?vÙ.0,r̔T7<^BAuu!uup8n=ӦMKJ]> ]ED({aJTL85N/qG Cz\nkf:2RQWGye ʏY-bIa3Dx"7qtL?-DS曖3O KNƆgrZ'yo=E4 bOu) F (mcer|B#hn6"yIa,8l `$_P{TgE5uF( wFl: >Uropt2r/}DávH)G d/^=_!l bסI_τl ۍdE piJ@u?ZjtTԋ15|0X2C|L.-٥dHݐ.Ipfx W Ws$r/?`p}pmgJ*5 t0c`N$P{efweqzo$8}>UJ17=d%0#')TEf{>;,q{*KeLMq#9zMEǢSd?g{ ]Q%3L׭ Aa4QZXEt˿y틸g~o?0~IZO, ]eLtIOdE%O#r~nOſY>lijwQ*~z57A][6g[u/VH[,4_#HrI3qRZV`o822Z1 .I9~0#۲ gX )$:33zwnq, #I!?f^1k MzDDmONNԖO 6 cGTݗ=Uqd${Z5ADG?{ݙSq}îYaKxQ/;3=ڒRjjPqB5p$23cAW޳ Ֆ˝J!XUYp&P_^P}= !\Wǻד97$Nj~_I)NuAd{8Q]Aqt3ޔTσ3\˟OV$;#uϥMz58*j e#&\vuǭ=Y] 뷭Mz>8v2 J*ѷ{7$p Uu>5HN풕w'$c/~G;柗k["0IDBo*F+ʼU5[<%>'ɠf;e@QͯU߽)L-a4=R}s<}Ֆ2ߐ%tzgbp1h?g^u|d4#TYЌN3TviHhn}`9Rztr{\`c;'u2-hם l 2%N ػuTHjZϒ Mf){w e|tÄ>X[P`?~i]0hhk-D嘉}Cٗ돈EL~yuV^UՊO@~{6}Cˆ/]Ҷqt])9\Y_n9ִ0G͡R!Sk~k D Vi.q_zι{D́rМNDP4B:oӟ(K, tޗ[@uM hv@fCeQDAS"'q9w/H[Նʝ[f PUEǪ FLMS"Nn:M/~弗?u.1VCS6U lHh :.MU[rԤrz$qN~4:z#Nw?OHgI_ZfP)6O[ӱuLc^h k.Bv*x|Ƹ.̔ ˣWyuJ|0.Ny4kb,?zqzEĄF~(/rA8Gqy˄iPհ&DFfW1SOLqPm/VDB tN |nksGzANAc,kn0|Dmu݄eS7GiӔpjĝ?(ʷ7[QH> Nˎ_$ ǐ_s$KP@j˩y5~xw#UMrrY)/ :㦘@EM]L~uhM:NlD \..  k›A鴕R<oz ԇt?mu쵯|Q\BYДRͧ |]|)7?4*hu]HxYEuqEMںRYڵK;x瓯Gl]1-FY-`:Il6jcX.͘޻F˰Gpu(Lc1ͻXK1J"e)d[ϱr]KkLNO? i ºtQV};(:(0B<.ʥokj8ݺl|}3U,gfh.')?3v ЩćA4; E h0F4?pV05@D8[ֆáE:̻ѢAMF+u˨X`Ls~fХ8j]k*3gge OI:|nQg>)! y{m'NuZqk)ffڪ/_]ng\=6 :H8 \qIQͼF1Zzu(l֏}>zUdӭzs5kWƗ:d7ѾΟp\~/wf4%(mX՞Pݰઃ(# :uotP:ǟ6MM*^StuO n}Rfw}h^}Vt;:iӦ)_{syJnPT.jߵ}±Jt7:ŏ'fm+q @m;֒d/J;3֚_iIԁ sAs\>C*Vۥ{G6ihQHxwrC!sꔸ|KJ(B'=?!L%Z%_؝r#IJZc:#덩rw]2dPSX;MlE e]̆)$-.w]I㏕L*>wJxN#k-]?O9wgށ0kIt;{y늼,zX&ߟ4[<%'3ﰴ(x5.\#d)@ӧ[~~Wa`ב[U}ͼ,yӧP{gz5Xe~J{U]K.ͳYt ]k>+U aaJ7h]jCv ׮]kxB?iU&QV-|㽼?,XJqkq.@$_@P u&F 3|3^ u&ğ+HW}*]Roܷ}F?Qy93!)y`]Ϳ¶w`Ʊ/*?[6-s]#8>iuL4fk_te]O~P!@4>; `N}Ƅ+3~i&2>t)UWjlOs)acr^+k{W>w@@= ؤNaؤV'uS )jlI% ^48۫w;f&K4?^Is%K巳awuV B~cujuPe*js(77W?h'eugq~P~Ie3&e+OϤ3z{/sגguR6k3.xsCٓ{3l~kј&@-4hD튿UW1&m>0G$:Sτ9O:[:k2?aζ.λey[M|bsǓnYnj"&Iz؇qW lVWa?^N_3g%8G)X R7猹DN.;Ts)ӱONy9ánA84.4eF7t˒5z\s|=}8 E4kQ??/7W%t\`QKL% pQ\ Fdڵ'?NNr׬Txg~=%ޣ5}3*YW/vp( sZcRՎ8|*BGz+VՎO͇^o;%~ޢ9YP?)魚fL"Q} Ϋ.-5%. ^1a:!t+wW3)O=zխOCwWi(S ;QB|ec6X XbbBq,O`1Q4o"8d?&l`Ug9$n9`/_8%N i? F,z]8_L=/;MƍaM}L{,IA{q!Y#Ɵss0h^!1(sy?&FHn\{Pv0=d;Q1D?:ƿ+;`=@&`Q7]_~{WfӮ+?"FW`Bqf}hy_ug3-N@^*Met.vn yUsᴅN ԥϴ6si uW8\Ϲ̓:홯W4(j`R[O( .`3a;76YTGG^ g:qng'%Gq.|kkj~^BWd.0{;@|>?#Y&}hWy~N`нn O m>GDD9A N:!ɠߙ )ߍ;0 ^f6EףGSJ{e8<`"WS{D gnjީ~Z}AY `zōP^DaPޙkSވDbnZKSc71}pɺ,_߹w`ߵxwxOp@}I]~ؼ3_oOAXWyܰIkgcbaaY2}>3y#@;πypDl65.2΄|nQK;/zwKw eOqN]6 &OK.!LJJs}.JVڢ30kPx-, ]7<ӪvΝ:t(`tTۗwȑKTU[vvv%Tc/1/0#噑'~z ÇkvbDA bs8kWiˆL).?QT>9{?V3ma*&uw Һ%\9i^EcC0HE$薰j71n u!l+㒗~b=ݔGmK%ifb (_bԠ @ռsކ)E\˄۷Hr$ϰͯIWws>L] Zp%ŁUcm}s,]Y? ޙS2tq3bLsIʷ?C4@0д)C8V0v?}I`~ [ LI1&zG⯤td>b =@> yH|{7$zN6L?N=C~:ͷz?@$k }4t?vZjnՏe{+0-N3as7:*,,t,yoiiEEEowUW]P~~M{~=}}bÎ(DHoƼ^͋k [J>}I)g)@i.>Y*q4]dYr۪=^XTeXcD%'+ ļɷ=ٲ^"Ku]c6-) ( 뀰`Sa?_.۴ 6zu+'_,奆q/poKV&8?%E9tz&n< Swޓ<w=38|E>~Gϸw1 |׮K97wjְBl0]\!?glo]@=Ӟ0R\va}F6t2b ;fM@5K d$ $J'{.KKѾ7V$$ t G.0k=>7WuK- "HW-I* V00MX*xeg'ːJzX:`[;7IGtg%;͗k}qK)ĝ+kħgϲ<{N;1"6i̬xw4xZXǺu>YdIn{Ƌ/y7əNDm63OhѢ:r9ܣkx`f),;_|{Ko^yG>P?bBW^6fNJY̵ E]Jy$)eӪxܦtvN.6q꿗 uˮ6-WH@KEUзrٙݳ&V'[8ݿxs!jD6- ְ"R@N􏗂he4i3 ][1oӟݵko:yxEb\OrُL+ywYq/B}?a2876}Ǚi=Xuo"? j<?ڌ=3|lkw}Ց|UD&`?Ij]`eR~'a PybF!C5o옚S p?MXT_dA=s4W\|wm y{AպgQH}VSqa"af@'k/XvO׾h뜸}>4; 3Ǎj^y2` !Գ@v<}]F >ܵk׮ڻh]v%̨]_{]˗/owX:z(~^}}mcDbo_y9=Ӂ.A咲Dn)XA^0^yp{{RgE`<(4 +Ft^ !Pa`l<4ͥ?'zSP1v,bBeh 1G0xZu3:|+A|4Y?{LK 4fH3^wxSa;{,";CTD+$jH?}C BCG%hx4) RG㥜ѩEEA;NoOzk8u40~aϟxW)g0[.65'Boۻ a]E i,g-g-̀G!}dAgB/j bÄ^TUv"t`TԁAۃehP'ԫ)5j6}/PSUw'|qw{ oa DP:gBv| V7ŧoe3}[qh0`u/?x(iK_9Fgqơ~MOr=й_o߾aЄ BC}a…ڸc/Ҧ+VH٘?>ڇgH !$))Bi>5Rj Vh)&!nGg8I$'@~o"gf{3k%4̟?uNjoq2#ʏ?t xz;"NMú;=;w°;Ŋk >tG ϟԲeˉti=qX8f {˥P65A-`ZzzbT'ѣ`0?RWM{JD]Vki^^^!Gn>[u`׶LuM}hWDrb8z3\.IE]9y}tp!`l0úN%.`׿06!r[b0QZ Lgh&K~>`p|c)L\\zh%7AsEv"ZUR\ܧ  <8s!vV|b[ۑv' ~M kyGG=^8L>|($Sk/9pιʽW@fE ܨIemS՞\{|ɣ]Ƀgv{,s- &~=3U%;X|G7o^tܺukjՊzN6Sy3ft_JIIi:%$$UV^Fqɓ>}=guj_~7|3 _Tf{7ĉs: -\Y^o{fCՆ_7]:sVv̙ϙB01x0 O4ꍻ;1F,̙3]ݫ+BbN3oִ^z~Mo7pO|||-ܒw?ߧ/45b_ܥINhu 4gj%$pXm'Pp2dJ]:?EyWy9AWSUi5R?.ܗ&bpTP[1 0٣ck^*aw||SژN G=]bRq84¢V Z13U (+vhr=Bk:g.!u|!ԳU'$_0Zo}`vfxTRw1yDCxBAG^=QN(QxvnA,> 5j> '>PcUCjԟfP)#..]n+x4m3V?Wh4b(,,of͚ *ŋ˖-wQQQ!\vic_eOYDVC#Գ]I}oΜ"}na6k;4cxt qmݩk,v A;śa?SCZ,4X+:!moVM"' v?̯7XooOXFد<`L|?O?9rH{ '^| w|9ܿpzLe7t ;0uqe 3{{_Nj*UV@9R)-- +og0k,O;5M+?o߾nZs ^˗ZqqqѧOc|OVVdgvO\>Ƶ 5e !~a5_pVs~vL/Uu2=icG08(-qVMվ&wnqV6' w;` μbX~&̴7w+cWS1yS XL"[ꌢs+_a Xz>~ /Wp|Mi|~=2*VC5>i0ܴoE &''۷o뮻{3g| \f~]wѸq 太*&Ov{5o-?w;#'iӦaΜ9(((cccѸqc;ѣb`۶m QeZΝFO2#+tQKW5eYpQYO>SovpH70w/~ؙ$?>JV5[nW=G.vZEN| t4F%˯+/M:#&?7EFw.[T"EOUY'KI*C-2oCWV]-nU-'&m[\fHEϒxd=#<-.|q_|6͉OFAj5UY_Z^ ,@BC[o`^3r=ˬp[#:uZ9c[l}{,x}sាN:\>Ix,̯ {. Y-Nn7;c?ܧaϘ}= ?a/0&ЕB3jS;,ruҎ7x)S,;vl~bb"GBu4yӦM5a„?}ܷop,Ye> ĉѼy}Ȫv)K9sM ;;}կHI?o/ A~7}\ɧpOϞ0ܭޓ $;s.[UWn&xű-rٵ]Ss_±9+]I EDWgaJftژ9Zڣ.˟˯~<$ÿZTJenW'\V>6=y&@C9X:2jŬm:>7@ '>p#mq5Tb朩]@'9è'o\HhN@zp ؚAV?F,}%N dOLK^6aP^oj/Bκ?嗀QTCJ r% @0F1@5PxKS?(:2,-):ۢ-` dy-)zT=ճZSuTGfi~ѣꖿ%1QE@f燐]rT:'&&+= jAi\(_Ǣ{_QcUp⛵+^Dd]m322x4?׻￯0q[,\t`͚5>}]ګW%kJɈɷ% ׭윢|i+,S΄9a,GVMP^usإ;Wؤٳgk 4 $T?W sY:,%,t+H> 4f5 Hn9 qVȘ9'*^eӜH+v gKODʢ<"Y.4CnMС䙥|gDo_e%/Z}ú2!Ii7$dq0ux̼[ŊhO=j 7j6vίTNpO䊙VJvPt% a B@  ԟ^L,>L_ӊ QqX|@5p[˕/x o^TTڇS;uVSK %b d\`׌390aw֓O@ ͻ Q-/+bux/jWP:Dx)ׄ*/H\||#X>+W.^X0~9mDrʃI}z,ZxDfkXv;,X֭[ھgt/$$dkޘ8%PvV  kWM S[m'-zw%[."Txۢ49w{%>5 YدapƸ+Q(1QF<\%V= ŕ (EXFe:@UnbwFMvd{j0N3ɚLo ,u%r͕KE@dߒ;2rC T+(EɁSYf0ViiHG:923ax:W~*r6nn{ M.-Lf/j(`孹(-і:g͹|DUK*)E(ͭiR#Id_wJSJ {,,nh,s(_ĐUWdE"+.^GqQ VqٹB5Q46 YjnKm: (jm.!T:j,_Sʹ0Ui!xX㝇0L]=n.΃po!88xRʥAAAYfO>@DDz聩Sb刉Aii)Ng13jゃS #V(1ku8~)rasxd5Xn/rcoYf"r)h/:]O |/\ol`#[ݷgTm@$V Z>KbH9vAxӊ6"C&NN.S$\06l~cOxM}} ]Σ`F1Lx7rQ+f~'5tvZ1sVL1;9 կhN+f=J"T LzQnbw;NK@-:W֕TTn=~%İk(RI1E';-Rt_"4PFl Xtqwrƒj0f;Pte+8A` rE; 5|uw =XQܲKK^ X }T9k A^ .Ҽ|_X&$x }؊wR .RPX`AV+려__3ĎbdO1[47Vhٵaud,6W _,e"dW@_n~  v*.u4mܨ⻫ !1v䶺 1'c὿bܗ@4ޟQ5jt } yРA= Uv ?`Ȭz Tn#21-%nUԼyKx\J[rz:)YXg(0uepK Icȟl5l#X`PFsgrٳ^q3} o0դ܀v\<;6cwpć'ɇ1G}@3r}fV&<:<U盜esMB b]B/ {CVlWT7&;2n`5f`DXbWhmrjʻ%>uVCRSZKf摫Qϼa?3C! p\eQo)Q>z jk*~LLWO8ݭ)ݲ /ݦK`Im::JtV YqY\ z3rbSs_.u ,N KAڋKʎ!epSOlZ\鰇. vT FoWbfA5ABo2]"^-ozNz/C gɐp84 *]VI r-^% '?Sk+/MzYҤS0(ѥmNYvL`P"w)ni.U/k:tfXmvxufl6A!(2.;~hpg. 0\qXx+7K.̺Y5WG>ԞG|ni'Mrիe#LuNe6R"r0 ?}ZwuB:7گy캐3%FA~ϜN I,;\x_E,KC>Z5ԃ2ד bʔiV><Gλ%: Ur?c>!رtyu)OD\`Z耧µhJE nժ9 Nh<}MC˝;*QהbܐfB(g{0߂ҥ$!mRJTT (f͚kW IDSRR\VlIHT½T1$"_{6_5mYLBڴ>J2\6oG LLteJLy,^BCH=q5sxĔ@'Jei"zsUW3X$p{I[f\SXRD {,JzZ3'yfQKf~1VyS0sJȢkޥr"9J|KIb?=&׬&ROr*_:/oó˾biL. [ej(4&Nll3&~UXX۷p<\'c޵DllBzX,XQZZ:ĉ5??6oog̻&f:/dVVI<2vۀc!G} [Jͻ?-TF ieKPuqZhJok*\]3_HoX!;6 LH{?:چ -topK%+>А{իՙn#Wԛsq|fI~W"WX.ј&/GNN."L^Ԡ'BfޥJU*+/@D/p>3}4*v&(L,O/0ߞSEmcӎ*Sƕ3>3G4D7y; 'Fo֣Yt$rpL2>>Z}]^pNm \;G⢥u9X.8 l3?cNrzYRg`ܑ1sWffN5.u:=(5j9Mxlst2_̂!AtxB}3iUFxa|[| rM\א{Jb}M|͎hMX(+ Ebê9cؐ>gn0.8waYJeK^R|[)ˌySb #C8dy)URpJx^?A }dƒ"66vyvhZ?ƾ `01w=~޴.ǂyFqmp/̝;%`x85f+j–KmиA ʰj^ۢiP ,Gǂy3KaaWGeG(gAqKD޾ί "&nF_cHmz2)lGzyf޾}% : [nallZۧ5kyfѣӏ͘1cobbMfz{{:b]+H7diu#޵t[%֢Z)W_&Sj׸buڰTm#vxW򒯱9r_&PAl-:Z|!v&} .YwdHuWK%FLugbA[BbUhx(FU`9PȘ]K >%}ۃ`MٯGÑZN+fzS'j Mt][H`1ѩyStnai;DqRg' W e1 W;es;50)x޴1̼u(f, ]49]o 4 Bf~@h|]t `iJJJ˺ڕ#{z!ܚ;pU[#1"IC[|>㔤Z27jMf~lĈ4n8YfʰGYY,{RRRju#>6~p8/^W=zt6Hnc2LsӧO=nt+y)Qr'x>pj^LxX;Ɓ<^&oK|(>C:svu8B>-:Vp} }d 0N"Y/ 61=r6?eXDIPteb]״#/6~]vVUuSfͺΝ;P{9L&!Cxk׮?5Jsvܹ 3[333;I)h4>C5tu]UyժUm.Zhfog<³۬W^0wg /* :AlJ}zg(= \U,!F%3@z>w˕,dQӨdB-tRfr~wq#̕c2C_My7 &ь\8_idK*ȡKPJHo/Ķn͛YhG_Kzl0 e3%%ܿ! be'Ý,7#;-. c+6#][ ! &_o\ vwt3|>o ^yyyEi˦*w@sHܩq^.d9aOL̳el33Q.*0@g]u_M3xЏMoWt!"z_c'͠[/P/r/a]}fZKEd3<{/X`KΝ;:t"3&&&RqPU {=ž={1..Z3[@DIB$}O0Wʡ>X+vGOZSr"i!=w§iTtF?T KPVa Kѽ:qnw٬'&m8I=:25U|ntu0м[eiHc,T+PleRAjo1p"֝nu82!L*:w4s#g-Y)%Q+v0g#W>$bW'W*xVOTE@Ը?u潡tBLUƒB cؘ9bBWcbb6߻S--V EEh瑜.-)KKm73ݟn`%o2 l5`sh)3~jPC61111[#XD4Yظ -Vtn[:tۡ*ʷBj0}d0Mm:\u0mqٌѱdKmҍZgAYt=Z,eY]Z+K.X:k,ر2v_~%6l؀k`i! |;5n\i0Dխ.!VK:NXzy;rį_Uf**pa,~dfoqƞ|nN^tzB8/xà0TH9hg/- O"3`[-XH5NIM*{ f|TP%yv//2fΝ;o BK,o߾Ȯz0o޼<8pToaW+0=cBI>ATnHǀu xLPTfF~JkC\9:f^]B@@O+%1f`0ULB]A_porc0A]W(:5r&t}=uI#ƜZZk r|!ݺCdDԂ-.A@Pw"`v\^( 3gz"Lo~k8'ʿLFLer,yH`~D4Ȑ!^ٳ2e Ν _vSapc &յحSX^Teld$n2O3N!ls_A`ϱ}oe'~^f+ SI bƊ-Y÷hc~t?XNj10[9800nBBB믎9rDw|駝TO<QPz$ PYG;PY^SOO0e]WCf56侩A \5_7zS' Z+rg못IN8~1@otmm4Bnr=>Ma2c\mp!p< J'ƛ6#c!G6j1g-;=0-C$om(#sԘM-X*$(qqqE=}&{NN|AO/(dGc+P͵8e,rx;aZeY3dA+ݲ31*Ua`"e[B=7J/tn۲Q p"='ұi>~{OjXi'Pd 0[BN S–}tO.>Q\eHvm*n\ʺ6l0s&$%%'''W%k׮?ѣG"yqqqRνJij]`~; uk*_{68 {5  '~߯\H$|,jA>bruf~x[[Q9곁^jGAX*e6uJ}Q y VX`E 6vfؼiϝZ ~Ո?8L@. ;,X#cm#vL#bV>6:|݁cpdÙS 5˥3Jlv|v2"W|x;Qk[tۤӊu-ILsCk7~uWf|Yk5~湉I[E6' 7N˞ud̼يB.g)Ƅ+\EO|3(5  Cwa,BCġћpсz +{Ϡ!␪ҍtzSbWν@t<"v {G3.=xÃ,]`1,01'`C( }IG A]^$Pu2v@Cy(Xu IO$C(XRCwC;urgeeaӦ4 :x`~Nߗ`-C ûg1j˾R#찟0W34yh>ybgSS;4fQ `ص~ٗ ;\ZY3e_ kuaM u@47\KW;68(#P,0&!`a+-HII9߫W?VZ{ԩu'C{t޽۠(Ju/222"""lڴ)wq6K/m۰aCwi^k]/D[N*z_9}4/\ rQE>U૓7щt %BQzQhJ̺ /Yԫ(r{DNҌ Cr3& ^$ q)Po6;vhPQ9E *tYO pL*Ö =>7H²=, 68i.!;xA: \ du#NC,7jyMtt4]YP|"ɠ0* A`Ɉx'v1ߚacD+A0@^6f>Œ(! Jלּgfy%]}u̮,_~o;v*~]|޽.]8}t_|?OޯM&\AgZ: w,wЉ]{[7e6f|Ez5W*+rЀt36•gzU+ʷ[فf1pe~ܯ+u(rX< WPpxiRGRz8n.BʘOV-GY%U׉thm<[h?@pYWi+E`>tG?6t2Lj>b|+Ϫ0tc XnN=4\f7"%6>~#a6ֽ.[9f>SfOѠmL߫7Nr ` b@7HbM۝KrxȂJ"sLzQ~23]1uD;.((ZSFKBEeBzmOҹ'{ސR1hWx9@s' 6_|pU~ёKbE hm2t4J'UDU`D`t o/<7̳f4U`#A EIV(+sݎ8zt_7rXԀ>k׮oE5jT l[\\;w@RRҞ믿Gy/ԦMCѤI攔sРAg躮(aա]v ߷o_PK^e/pLVOW Y)q^`3ᅎL-Db@N~;+q WMßGOaˡ4؝hAM vZ>v &~Pć^TĿ I]z7yP2%1=73 `ΦM;`ʕ .&''WDLH_~R=]6 _3 ؞9sP7SiQ/&{f(Bҩ8s{OXn-Wօ/IhM>Sx]뮻.JQɥW_!66RJK+:(ptU!g}8t %;t!1d{AA)))UbS~/@~~~~2iҤ!_|Gz*p iq׮]M:O>i<%%e>PAӁ&U u &nn۠aO@ʮ8m_@/p+3i+fVI Ӣ\Xv.@pUɴ%jŌZ;ZD+RObu'{ڭ>#o;6 %E/-o%Oj唙%Mݞ zIil>R Midژ0 r_ig7etr2Q0Kki Jz39tbږ50ipu9Sx>y! <. ۹s綊޽8urr̉)))/@Δ D\V+ OL ]IUѻjJ#ai3)y4p[{Tq)q巅cvд.GO="~ȑN$?5;{Sh_ "&&u _}bbb?Rz:7￸FqqXXݯ_?א:ۇ?#Fo>y=Z ͛7AAA?ӾܫW3gl6P`61mڴܹsv';Z~<Yg&#T{H noYS|&Ԑ!cU~j<>j-g0ݮJ~%\1 5JvPU_]՜#گy;8>FjxTy#jȘ;Q:yw]y{X'ԉXy'>w0ZaNyiXiNgB +g%5D޳K Û]Ԏ\#'Ph~sp*EQY XҐ_& ư$j框ʮ ٳ: <-+6ojtA=hAȍk.555,k'fS}ѼyS63x:=h05K8wZ|'bUo]JLNu#rzس5!.. 덊"nt]}x چ5/ls8-(.:4Ǹ7ǏV_6@d 7R^ϱflܸwHbjNzjvhҤ5""Bv̔Ff^p8i1o߾Ւ8p͑#G*Ǐ?tYf]?yIIID2O)3+]_R <MJJ;v3LK)W(z0\6d ;k1aٳwk"߱IbTϠ;e^ CRu|_ ⽦ԕe&@aR?>tU?@Sژ]$όZ9k;>ԇ JfϨ7gw4m봛 +L1FQ;x>u9['+jSwc%jH/vÿwZ>5f@4dAW+3:::XU]pU{<W@صe ȝ֥X"x¤˞>r^|@o7`c|?XWu 4 *dB=fW%Ϝkf(WmڴSJܑZ]ڵki=)3pQj׮ݡ5ebbb)&.fRRҧ]ty`0?S~#C:ٵkWiO$WrDFF(bOMM58cn/t;HEwPǦ1OaOw}~5oشB5xM#wΖ믩[&M@E4wކb>>pwcVX+oieօ3R5uXo΢'8>n&)VjDuEeVlh*4- /N¯Rss&Qԣ1oQįFuT[Y z+ H ^מG}d=p0󔔔NSc?AfL ]T\ThL]n!)#Xm7jn.Y,=aW;c>Ho;}G\\\ 3C6'= SԸW$m/zN'u躗 ~=D@8IJɏ[U/|\䠾VȲհraf-%%l'03OHIS?py&bˠ<{Uf)7ȳ54vKW>}M}kӈ3 w2sWfnBDE|RQ8pEփ IWu#:::`0nߎΝ;wlGO8qE{u/z"5%NNSŋ}Tu,}߰xb5V~rEs3`;χgeRּG:gu\'.n 桀baⲼ`wAqTiOGiL] OyeB1A~hwsƮPtX=4%+8CNAXG}/x)?9XbEjs?8jpx$HbAȟ_|@F+W=ԩf(\JyOD ?̼(%%es]rx~Wp Ûuh*Ǎ|̉ϳHDਂs8w>lM+ooW[<+N[L?.΀V!]5)TX}=T`HMۚuU# fnܜ,i+V !Q+KheHL(FBU>tbBKLI )rk1ǯxo¤yWKsHL$k"T@~q!Xr ȺLW^ᚤ\=z]VVAee z 8KmϨA3@nll %@ݝwv}Bp)dleTΤ ]/+'&ރSWB[R[M*ǣYf8y$>pRJٳtqrL_˿ 5莌w$>ۛcd=uIq*6ir٥׃3.aKBB-{4><`@Ƹe2+f@S/1Q ^EC.[n5Ns ۂ# '`/0:Tc+Ru\t2<ľׁXR}\¾_0T] og{k4bz6)qS0=xaRdu*RznB&0WzT?p*p*pA7PxP!Ubl`,V|¦R7P#nduֺ(+vQ8"/'n?Lx(Į,Pib %84:E;0U_rZۯy>ȷJTB1 ~dt\>kMFIOYDݣ;نE!͏zdANtGt |!)5- B> ApR~׃By8 pl7nǀ^uEn_ёoGHU_),Ngo M|||r8EQn={6nrzsиq 1h;v[lll\0j~$('ZKM78&rJLLv1#1u?}}Br `}u;.{wQ-A8[d'3@ w "]rγ˞b\F|Pp]^0t"P@v 㺵F|\,;rLN3o+ \%~YêR\U1_ړJ9;/&&B~*xD _[RItъ?fض(1rVbR*wBfZySbG CԸXfZ^F{AB}ԢR aFf, F#=99{~~]t!շ>NMڔI/QWKk E"_o:}_Xv^ܒzUBhV {ֻ Rd* yq6uI <޵)ڰ;2~/"k%23-N@r:=.A8~o}۶1MX?zî:p6 @TaBQNxB=U T~2Щ T*eW3KD.`^DR,s?%N0QKݎe?)-Pu' q`o| |;stU6 ['XנN{ƸȈ5b. yp1L5XhLQOVk e9 eP|̸'jŬ 24#M;Lp "ԑ#Xj4﹯l;>+wo~:ټP ּqW]<'KN;l|BA>gZl #Bζy0GG`vܛ 4K_^ z!ԩS&L &?i޽_v%2%}  ^# &sj4-lpN%S[BlZ[ "EXk\)=|yӁCd [@'Ids#iSh5sJ,;̢5PlBQ!fDkV^4-Sֺ]Od2[% ʢ3wu6frHA! L4MPVDWz3qM;-IM '=3-`ULδ`~oG(^0$p7Tfqri jn۠0 h'|@F; LMG6 싵*RִhgI?y3 pE$}B ɝ3Grťk,őoA Av*S80j iur 2?ύ|k 0I@BV#s>]B_&vO ~Y಺t}4o%y5VN0D3<wE`ǼmsQ;}*oQ:r3t 7I>:=¿"+[hqE:@ z/:K<c'?*7%`0yJ^}Uyǭp @BH_c'0n`7[5`םMغuMꯍv;^f@>B3y'?\ڃ!m: z9ޔu=X:췁v^`Do/ķiAHFUeɹF4Xsïv>LTozu#`ă PgwGM18Gf/yɒ5^/ț6y|Q` g*Syz( ȺDP8ʲQu'?3IT&Lցv  ЖA` жG$"BD\lThBZ0ruiV {;<үgG40\x[!wt_ώ&NȑU?`9vִ`Mn%9@ '&9)'Nj#2 ~E ԋYnzs%D{S2neHkE/ eH@m\~pz6݊%d\㗌b8|&3tܾoꇦv͙*.@H>!pnYܹs App㙙xx[=ԧ|x8XG5j|b[#{v ;ߛPg^Q CqĉTR71w`oF/>a-.k);X`fEj0? nW ' ̳s@Oz?㏝ϝUA5rW#]o= dHLL{ u=@JIRʼ_6_*~ğ?M5n?a`n)Љ;c<q{8ɽ#b 29b0 L 0ȽE=YS[m=eQ' 5*I4=BC&r.@pjdfBVvz-íL|H6Fy)?iHi^SVDId-PqUIa.5#}--eX*M5t/`r5Jϴ#?`5j U]C`>;qn1X$oV-@ ԩo?AM%[P(BBMq E@+ ~~  /U=lyh[}Sؘ ,:Xu/"vS9s5ti`ʽã = p6)W.ݖH-).ldp8h׮n6m|WԿ>8aEGp:~8%?~~NScccGy{{'ǧ+<@~pcbbah4NմϬ¡<߄z̹odٯ$MRKNs^RJ/ɓsԵkWBRUUs)r !~w>RJMzn(F۝hy ${6G MMӦş<蘖k54q6UijKצ|7-,ÙʮO UP_8=3<,smV[+HYkFm߶7fm-uYW誝,PZwgZ}ԁ͞^#pnZs-A^*$?``f=JiK_NKP5i8Ј2q3uN n$:9Y=kVq Xj88xf11R R2@j>jEb-`?t$`8v P$"TMϷSsVT~nh"JϕEj.ŸiJD#[\UC@\sk]»;P,io :AK6)F v?kㇾ<|֭WѸZR50}tl߾ɓ'IHHw`ȯBQEٓh8 5eg8'M!yב#Gu~^JJmN1{a:-eF N|%""_gOg}p l>>>6l?ÇC4(eKKK.W.мysܹsp:0PE7NPMR;,8V?XpGg eZI:C5~eƾ☑B ȣ@$ ɩ;fm5ue8\9!at4JTߑ0yqS| GV [4p^*b.B SPBP=u \d"NK| ?q=l| `_nN dP") (;̻++rPϼ"/JWF53,0Tx_"=l붌Ųݤ5̍/ ' `Zs2E!z|GFMp isC1;@@Td}+!G#_oZG(!4tiqjoq-< YB{^ʳEӀc UBϨߕV'B54 /fO`DnO6mq2U;ˈAOuMnʇ6477Dx"ɦN;C@BHx[5xf1;~` [mZzjg}@f=b^Ud juUʑ۸C;DVt#.|;ykupY|뵧1Ss njA7!o^hh8$oB+J0a! @4C~&$\UN'హC]b,RKmY Y\ 'hxpѬ&Py CJU&6m1*0;ѝ{.]üөb]r74FF9Zev=[/7ѱKrR)4v앿C+JfdSpj&5|xLz3ze]^\`}Ћ b 3E/6aRYMe欣G,LfY'\ {i1N!(hz()'Y{y6D^7DXO\;?w:pA޷nZnʕIbB`:200fOUd`+ @Ęă g5x%5d)Q+->?Nuۯq:A|pf:5!Ŀv^ 1V;rBF .-zʷ|FC뉰 3d2hP㲈6QRui_8o;1@'w6(* .-ㆿrDFBawȊ,f#Z¨ { ^wW̋6׏㿖ٲ]x36_ē7̞p dX \jE9}]EgWe' gv ~sSV76+~'x'h658 4kWJӿ^0} vjok}́C3M+^?v]}0qBe6m{[8%%vmK򮪦[?0LBqK`80ڊs{{=h-f$o22 JKl%Wt:V`V.e ݟҵkW&]3fJ)պztB9!QZ>oKBJh ~2#3ԬٗٳMȽh^ ǽՓ@W>]-ĶF#¯W$rP]mrfUf1Bj1YP62oP4,V^]HYh2ej xAwkHF7J:MB~ՃКkfwg|?xҌ0v1hϠ1tbB1g>`nVa=vy~CjS2A˂J PkB~u,:{eQOy$te& JlӶid ||hr]xj+BWtt!xFQl*26u?ؙwP(-n]g637o֭[י۷2TEQ֔z[,5r =@-kky8*mNEpxܛH_Qf46 P[2 6_-i C״1sVV[{8n4 GQ`p5yG\EрTxf7w75!5OzDMAÂ5Bѳ.ǀt9KKb;:铪4elzgn@TMP- j^#CqޏkSQA}|es{?v}Ciii/JJJq6vI5Hk *Ljx o0_(+8Q%uܼN$ypMaߊPϕqT$|B'PJ/{eO//|֠ʳZ˔CBj]Qmf^Hk|_Ioa8n̩,!`6[5FljI[IU6C/D"VgOLa5sؖXzT -ŨB Hcx.D@N6J\)(p{jwJ\A/ʶM5b*^  8PJbxuл}](*dgw Y#yŸx{{?sM̼|TF om+s!_=w.͹1sH*'ygª;1uc Bd-T ! MjY p*l|ugtũs+2i7}[9G (8lawrCPMӒ\9s&-ZTCxb>}B )))`=WV|oO8jR0?ŅBw6VN֛"P [w3yM;CBj*Dzef!@DX9floR]MBQ+[Qd1AAms+'@1Kp/z<533:+q܅U#B p(0NLWL?..'}T]o^ L O/-@dLu `mA@2& c[ ,09 ƽ{SJ38>pe)&elHx/֥|UT8~?kf!@B %(  RzT젠GT(6:tB 5z~|}./̚מ=rM  k ,Ḙ_/WĻ94hq9OxNZ7æyt; '>@9cM7gqHз9rPR\Pe{FFxfވF{| $#Jq1 # OMz+(AVgbbꄻIp^yK͈5Nl4Z pupXf@ di@LD)zN>N9U@255=zt'|{98x&:͛VZZZZ=!8pTf:t(c&okmV녯okɬB+$EvcFA-Ҋ'}չr_Uvƶm>ޝ}||to0.m۶w\e˒8ooFy!D`6((ömۊZ=o0F9 ʀ\y &BK{ d Gg`]ūZ2t4Sxt(T)!&|2EvO0uR7޽T?/ت h-z눊s_] u&t$a=zq>RDWbThoE]U*7QEE *,(!^:ͽ{R }cX&t 'N_jtI+yU7G1rx:Xo9Gƽcd

|ĩjɥ]#4"^4a*6`9~βoO9ujˋl0/x_(=YsFYa~rӮf?E4PU}VN2p"NMbOZ7WGX5'O_YvqKIp'y xwR&os1VzS1dKDc:=7)gM;ʝg)]_:GCmAJo2nF)'f7@H<ԭ$\*=P[ \y-*,h5]h`8m=R>M06a"Hgjs⺋ c?Q/B Z;` .os6%0?\t%.ɣt]2[mEԆl6GuhTm͸]+ v'/1̣:eImXݙW(7CCRJ>ZR7(`S6`:QQK,E W^ |ajgjxuG|}eեpPW 9'`禪PUVQu$%\s$jʻxхv %IG7 o?kXg&pp x"؜С7Yaw$jO;ZGh,VA =_ w~fx@H,r~C揘p5ʼ >P1:⛚]Ip[T`SsC{[ \%FP% utTf@uĽ` ۆ%MhqV{!<"A3rj(#?i e; J;JPl벍e6ۯ{`Pΰ6gvDQ)+h-J*t06\X'<& _/&oP]M UZd (ԕď'b(]ExpT|gcZZZz 1110XpvEQ&:tRbbbsK)gSRRZ槮J]vIq/1h~G\9r74=Dc o뜛|yP\?T+ح<*V\$܆W We˂_[PƗ  CtYҊ&c$Bs̘tUnAK L?:_Dua:"ži)̃'ù'8@ \r$5P#H_6Lwy?gTI;Dۍ/@(/8twJTSr^RXT rcjJV6ƪV" Uȋns!F%4`/**S UQ[mr v:4 FIh\?̙=03pq]Nf6(+Hu5Os_p"4L~ 4)C&Щr3kpѽ\^]jdp|`e 'r ps8Leo̸I֖ԻMԅK.keϿ:e0r=ʌ"sBw4!u}CS K)?O$$$ᅦ̡CnWEJJJ2*=z'?bz0sO"@R)YO}_:"Eo G^Zd}h"a n(p*ԇpkeBm2< ,`ncjCn+>xSwTB.D{?yl%.Ö iw揈FWn1إ!(('&3Ih܏cuj6N }߷ΣہTh8dt*#}?Ni`NkloVD BNmhof;1{\/rWDʝ\b8yzj'NkƼ{kiɉ˟o$Wn!lj> i-`B 8?+pb4ў>>[yt; Ug#4fp|(; 9VgU hPM0)$ʜ,uDe֤ o+@nԩR8xOoץ\r!'?BN$fSkaH=R}^^T IK}@kij!t  Kq0cAdٳ/ v Ca^^(U`I k+T0\uwR-'b Uo~sV=.uNMz5)lt{-وC{RCTgN1(ޙ VA87 #~Iæ:.UcO%F߉vYtT]G2)[|^\U2a(#FiOQ xښ$ Y?>qca4Z ?Rofՙ` h ڪa) JcoۙۆC/n]J+a&R}pu @`,/0+P7-Ypz g0(tpEq`P= |p ]oU^ e-̡M{*C|Wyhv ~`2t[3] dJ .H~73T@(R®bcϼlQwF"z@zqq-WE+ U? 8UH/pIG&}9G0dž<8 7 bgg513y `~ wh |f7ZWc([n\njDC}& 9綘_h$Z237*@<BtI~$ݿ9 H!}Bi$~#[㉻ќsCyd#E̸MgC!g]Z杭4]OTpe,o:<}2VnwsH >k g%8ƀqomgPЈ0sˊC׿9$%%E@2Q7D(\a擊l?tPRm7xHs "y'* 0A9cһЍ$b̼̒ůMj{Mْ}e^"IB'_X'cI(r2e\z6Xd$$L:BǖMCJ߱dJ]} 0M[ҏdqfL$`ʨ< pC䑔tfot20{ ]qrM.[Mɬ]"ҦHe1:01p kiЕf(xOY)_=:K\7/.F x7W+>F )_x43 EMng "r@^t_85$%%kvܤm53WDh< _@k o!]!= [S 7D2_aqׯ*K9!pΕJCHjD1#^!:)[gD1%h6H6Ҷ^%hӥiRJ3(bS劢(رc?dN5?I}pd;tH.Y~ ȧW?LPM&NlY?ߦx?K!?y}9Uyѐ%pXInw@&Kp5_+<S%9]8v. ̀Ih0oe ￘MYUo1gdu]ti'݂N\aGi [# خ sU c;**Φ:mW%cy"bȇ۽0QsNN~k)6΀Q=a?-G ;5ssO=Y).$|övghE70$R:V'$s'6hѡtܱvQQRwDAJJʙ3g*Wѕ;rt]p /":O>t1!f'BP_B  /r!C:8]IVkbyMW^! @^ ҥzG3I'.qva F_*1HEyر>NڃrbD^~eŶRnfii'-{/!Q)`l4?qljIoMx)w3;jg5 ^cJ$0Kno255񊊏 ȨMp®קa~{?_,|z?P}ۛUVs_?& Qm)> |l"M]x6w); ٠ld\tC0 Lx xuҥK;EQҕw|([#K'`&"]icHv.= 8N.sv(] zck9W;̋5.;&-ݟ1*~oVi]|)_TUFMe5v>DM4tGyp GċnP#ju޵k$!ԋyKnBFc>㋩ףnṛZhL~hU0%BOjVGJ`q_1 R# L[9{dY/}_/++{Z1c(x:o[aXzt985uIRwkud+("Xˌ8ԍUԜC-7T[@I01!#jmY?bs1u A-]1~ȶs^AaPxZi"h qn1 n` B|dF# ;Gҍ"3 5Lѓۚ$*DkBn?>zr{ntǢN]4FO\U"}IRRuSUNy3=:x 6' -׬Ne6DZ5nc.ͣ\^-qmpOzpr. X\ZH2FwT54@p3oN^VY$ˀ%N?a0/þp;WBCŸ?>힝W<}U_Ņ-.,Wd A?~5hÖ]' aAZYv Q;Xf" ِ{3#Ma!D2jM>رc=QGllly=s_~YlʤF )coAORXS#a08_2n 򵍒Ƽ'tf'FH~ h*@}hΊ yaw>+lNucIIɬ!CܺuJ?Jk'P/t0'r="1 {ݵܴݸ6!ՠ6M%jaSO6PFpќ6x ѶFÉc{)yT{;h&v`TT bg WgLK!/zo]aa[ɷaVЁ [X|thTWoB2A=qw%a`XmvZnMO>ҥKck;xj|M[)A?p#9(GHƍUǾ荠/ Xc5ƲoOQ? yՎF덫KHNN Aj7F8-F @U$zv)\ЃogUj EMj f>ho2\oNe O<-34eS6ʤڔٽsh @Wu/FU?Iĥa;;vbP@ArrrY&)VLH]7[,:imxy q/o5񔷛Uש6հ}LE/wgbE2gc(,ō.kV`}t\aޟ~ QI" u,ڗ} `= ~YKQZ’oL.\μȦ8r'~kb!7$`F;_~\۷j~W4 ց =X5aB`w^?_\IOt]׻[vqփ{}wl@xpy;ISUEfpWѡ>, ] 6zuL&؝)\(/#0x[5X k9M0p3I&r.R|;FEbDlt ,ƶZ-d5:8Y%,-;boUM3k~{Cꄅ6'n.!vƬ}բ1w{A%]_yu9+_Ԃw+kl:`P)*~-8ݎ*th[a@ jɳ`Bqe]VWX΂>n?k:蒷20ˇgUOJSۘQV1`@9Q5yA5\eVv8[xM?B%s׹txyyo߾Wsy#iLx|#0Z΀h)F%rpiDZ `Ls __V+`7 o75 ZxN+&(F |$&!{{wziR`_tG{%@ca?RDƿ3N,Һ +nC[OU>?;T:U0n$U=>jO~޼t|[W3;8rKJ~E̪uS\|0NR>ǶFi>V yb5U (kH2atFOZbBl!ЭR=V%YI?pW.l@%@545m85k/nC׿,= /fD+RQ>%3?w\<\wO}*!p ؃`Gc>[$Raqzb8x|gX2큭IR=ae@X֜6ꊊz(*JSm.E'uqQxnkpC88\{$#|fIo͠QoZa sFuq:}\%N:q޽B@UU\]׍${1,!l!5HEwYZN!(UЙ;W~nի߼\= @ 392nzAXiQ;1+55?YUG6ǶiӦf> "B2蔃,uT JԈ2y۱0Xb6T}-_.7zKSPPl- VtkaPW1?yovX`TƖBIUi9s0;wƠA oaa!s fq{>0MD 3uSBЖ{\)1jĈNATf308oh6hGǵtv`"[;\ն{/Q2$g m9ܟFG@q2{m䍣p]^xn.1d. z䷴ʛov_>$!ܙ@ĉe/|nO_1}1܏B>ЌlcH O;(U+X5:`x@u~a:n׎aڎj/޾|QF'50lUj/:Ah*C-Nϻ7z_j>J@psaHx %??Z[/°07 @`"5j}~ gL=>}~X;s6/=u 9]GR_p'ZuBq1xvD?x5yС\r}sN\x9r$F 8qo߾PU^%::N]p{VJ yUƷ ]B%%VSa$[0,6;p\ 0) {5 pZ X5;g¬H_gۃ:-NK p[ `֬Y;N>}:"!+}TJt;\-L/չHcWUqN&} Df5}0tJyfQ׮6&PLPT> QO1@UI7~:d@daյڎ;h ̚.$x^)|?dr=Z߾03Z,vL&4Gn@ 'fbE" M0+a?#<с{ƊJE~!\/=;zvw.'狪Cmfߙ}k'zt-`tei{Uwz₏nUw*uuɔjG(oKi/#vѠfݻ.++nӧOd#F0gӦM+:  Ey"+ѱC\H 6y""D(tW]sB!`zr%?&cz![RR%K`whĽދoN~)6l zyyGk.wZjW,1f}QX&E0U xp?|%~=X@KӳN; /XM]:3Zgr` GNp}''&ꡪzB^7l,BBB`Xis?u{NfCa6lذAjg~ԩ_guuyM焲dWb>O ؎On1=uZ;8M4 k=ɟ^ۡ"BDyPl^*I!=|L^)<;,8].^)]D4L\ գl]0WhN'.>=8pQJJ;n}8yȐAѳ;.ȥǎ|l;`C<¿JF: cff8 gi6R}GPcW4tm!nlwJ>j ڎ):񏨗MĈv'ťuõQv5RnnMw9!x|(,!4Ɔ 0n8|'ҥ ˱pBKMɮ* Bʯض&YP*U8v3Xy5<*v5^-Dul[ 2F[Vgo(xRV6c>.A%%%uM{Qbѣ:&bq'j&JTǸxSt `PmqzUYptk2FU &L,3R:>q?:`]۝?\M);h GSӫV ɲv{l_(o.S;6CN"XYu!Qt96 (ogu -^P:m|Lz0M K*ԆD ;f ]#\( ]" n9aަ툼˕=թܧo,gpeԕt/a߃Q'/Z|kc]]NK$;hBeA;!]O4類*mH8Q9IJlE̬ _ R{ 5~c/%' 77sual&t@An ,<'\FLh*5W˞P3sfWhR'LH6 ǘ}K-8!mGnt/wU4;#R cpy:/]rۦ=GYa"d0^:.;]p52)GN\p XHή>>;Lc] IDAT$ x `T76s;A_,)o@bf w婏;#*.ߠpeQ ]?B̶lÛhH;sr!}_w#r}{v""ښf<nR}~X`Ο?PVk׮°h"$$$`J(]ױeL6 ̬4QSV Uy&< 0]NQ ]W*o mZ{fޔ00}MD_NPUi%Qh14*(6(ť6yP~˅;v,N>JѵkW^6[ݵsyY*༽k/hyW|찻]EۙԺZ徏̷+d~r@xpu' ֍ @;>`ٗ@m<\[?[~)<`$x,LL eTQl Dt茈=j4>պ9ϺP ؖVo,֥n.3NlK@Ɔ*䷇oP/u"vp@( c#|"v_3~&~7}04n%"peR%~J,QpH/CP>{5kIڠ_4CA0SFۡeX!"j+F8rB*{L7q2KF̍\m` ٯoѷQ3.KB\9I<Ӱ @uMnz )%f3xBQ >~ܭ~;"š$(ֲ;Qvk0@K0'iWnպ\fg^oN=ܯ>>Y` FeY6 75Bqp`8 :V9$3ۑ<1Ώ`f;]@/p &OߋjXPx OEx=^y5Jopkw__0"׶;k!KD0Lxˆ#oٲr9s7>>޳q-;-E eymp  sk/ePΧϖBg42Uʺ}ʕ9~RJ "(**_ ͆cƫ;v4Z:%<І׫8)Xp AR,7Ki3\>S=s3'Bp8 WF.Hޯ=)ɕy /^DbȞ;e{%oۦJJK6 YYYhݺ5֯_Cra׮]ӧ_ukᾛ62N@ä0, yk\:[3A BC ]nF-Q{(wC5{QP3yXrek\DtLS}Wn$^Hrru"US`WGG^ܣBs@J3έ&99Y2צ߾TcQYjpDC TW8 z0 VdNFm۶zw;`0媛Xe2 F&x3h_` 66XU\j COfT,p`f`q~@ؚ=&>I"Vku& t{#[B`Q*] $c/Tߗ&5R}c1ra1 D5CY"RX|Vw{9l(s/d[A`tV<Я:#Qݡ8dSEAk~?,놽PM(~c_ ]ED(Z%,NNGt[.ypq8^jh줔ٕo4,{jBW֭ k +c+CLG{2&A i .z{۹pT}'YקOj# Gĉ۷>׾{뮻PPP_iP#FsҥvO1)c9] -T!KT|3{zB"MRXStLx(R" wxw8_c8dWm8 K ~ I99 PfP&Q/ .zj/ۻzbip'p>HC^:75xvWoŝ50N}Q,MI3&u<Bڼc$:HvE)[uX#bJ |C47҄o1pH7^ȲԣGnRʄuF"͆bjjdLECK,Bkd$A-'ؽx:N ,L<*\m$2ڿBWߠjXWʸ" ӷ+ʦhHux-P4C/=\=9=k{ZàK뻥\;Qԭ9l޼뾊4Ӕ`bSX}#lue _o+˘UPar陙+3gb۶mFBBBu\n;@^p8ٌoh׮v Ʉ[n*^|UVձx5U!!.>#8cvis#EB `X%PCjZTu\qτpŌny>9cs »F~rh`9KV͡kN>,בիC Yz*[XX4RJk B4[wbZcwV&@f1cޙ#ȳlScE ^Rlj8.'\ۼOՐmCOa)*Z'K^xylp$9f #L&8~75 Njvqu{7q,II]ѯC; s !:o.4rP(wD\Kf]>UPdplPսP6b !A^ީhWK\!~KJJp1dggW^իЫW/J73\ x*Ac@+ pOo:HuUGa b32|hΜkwgd*-4&P u2TM01݉Dv'B%1;K^\#-һlNaaBQ5Nxmddd_~ "76) -m}CwX Qtuni_znoVu#1SyS.9&<,lv;u銯W,GJl9zR>{u ۃɶׯ}〺pyyyxWi^y9TڻxaŮ,abձy BU0 c눭)Or0<Ģ/_!R@aibUtV΋ \-FwOx;''9ַ-}Y$$ݬ+܋/I7  |Y#?;^]`Xn:\xO=JJJ]I81}-Kd;mn>6#jO?x[BWNBY^d>!~+i&{ۻeuVom5"]Ր&j/'-0!fa_Z~r1w`n2PaFU%h^oHUOhH/ϢGn BZ;s~i;3&-~Mpv*veƉI0d7RfKY,YI!VIEGg-]1|-X5arƤP=ckW]k`6RaRpy*䑉N`0BD͛7# 7B̬leee(bֳgF\Koz,l"h%Na,tj}g ]b]20J4l@н#---TU՗LA~:ߤhl;!D8R"$$ YZi`q`w(W=&bEIiz25z">~~vn~Uŝw 뀱Y|k)xK I[̮@z"a[i)ĉGfU8y1gka'5Ruͬe+V?"ՈϷn[?6'C`` |||.˙ hg䏒 ܧwYE3CJG߈;Eo(B 2nHJ91Ic)"?}$]W# YDz5 B^*&o/+GӍ] "  n+@!̢y^҈sW)qGbbb"O*A9;H> ZYf^E+ ~Oh hq#,2$~m darGf/[3=zPŃ]Dͻ}ue=y% ;yŻN e`d[K)x*E4 D&i4o*|@CdBM& )Jc|!bllrh#WjwmnB &flUF` l̼KQoZju/7J -Cf6uĴ/XwFfȑ^EE/WTBQ](J|ټdÆ -۬ N% Pw%`04LWWӓ'4`qI @IBs( T'>;d81mC[ `( /+]3XlWi3|/._=61Pb=Lz 8x(=(j%?Td%Tzz[5Q, =,dBKtdl4\SKxI \Dk_ ѣ@fhSb+ EbQVr>)f(_!R!q:3fq8LO@GNMv~$uk,*~[WAa0a @.}B4{?6m& (DT SӴuÇo4Cv\ۍ&$9))|UNWN9gFfVҔwwD5{gcCo5gź>b-M7B (+Ҵ!`f`el ?? 'FjNX9k'yiʨ4MB|iMγ9],Fb4-{`Si hͺxše|IOom4yH5GbIC_K}@SnC+vGb}% TANsj>>]7ɩyoJC`c6ˢ:|Bװ3jb"5OQ\zjUMW^ᚁծxF)*H߉ӮaY ίos$&JM0jESq?]UKź IԀpVVV1@c QBH˒65aD=O_3SFFƓD4@aff/$!t]/x0Axxx.h\}GRU;6¼+GJ6=hhVض| {AO9OVؼ*`c<+ߖO܇%'' ̑G0@Tsk!n~iŚ|ݻwO2/Z~9hDNQIx[kvZ\mĖiv8p`OدOpzަU6x8n}# h-];P%[Jz\;k ~Tpɢ,9_yMԧyӂV4(j 1!w^>f;vl6ҵw1p\τ fd`ªUJ[*sM—aM kn{#]q8cTE?bM?\HJJ v\ݙѣsWL/!>R*H:bbhh[LLL#j:kPTmLϟ `0mGb_ר&̟2!N24`'Q"DW-;X^:F(3u{msΝԻwoh4^KrMiUpqJb n2.Q}8uk7}9~a0]%ac蔿2:!٨ׁ٘}ɶsȶ俴A8{l2s+.1[AD2s?"1 ###[OOO^Pi4Os;1j !/Ѣ̑D3Gϝ2n-|uQ{8lZNW%xzl JUɌM (.7bƭ)3?N^P#BOLLOIIwF=z~@1 qys3D`NM0A,">mʕ*9x >]"Ɔu=$9CGM9uaسMn!y1/ݏ"EEe(**S`bZPzPOhqMqng"Wr}>fz^/^Q=Նiz!C0jC:zכ}%BxWIo=箩$1##If.3f~+=d?"ѻ`lw/ČDJy: ܢ1, 7U\vpٹ$A6xYPPa3 ȌsVC'Bz&ƳK;.q;!yR6 mg~mGh#Mԑ3Lix(lȨ?k븧N= ?٣q]x~ڇLQbbb"3s D6m wɂW{]@DǏmӦoVk|hNݞǼZ5ּڷo+C@;6E|f ExhQK箝R8Z5檳=2Ayywc3sبJd*C?YƽcVo9<ڶG_NzNnxLxo322.򲲲䄄njyhr̙3&EQbs:,hfgT|@(Oj[< wŝ;s?A? dQXRkwB,.JLǣ`C7q`:ƍ:<\Bc5] FI8ܾշ =4<^fcF7J.EP]((% 7.,m5v!P(B$.ّ)tS /difb<櫧t"??}k:'3eWp0̀>]8$yӪhÎ{~yߝ{Dht3aEjy2|栈`Eҏ>GSm @ZnNQqˢj`г8 1ǻuQ)[*L l tq|M4!?L)̻3L>y!ЇC<裒,8Ï`D{fquS}:*x\k׮zG /{5Lܯ9 žÑ8r*_~5ɍ&tiv۪ǹ+j #rwRJ\cJPBpݘaܲeՓmrr?e;ekg- |Ɋy)tϱǕȯQaLfC023B6mѣwv#!dFeŋQTPz{4m&su1WXui۩;\e)a0. Y6wxUbmNw`q4UM_ |ADa i M2qN{׼)VW?T$Oz)/o9^M5;9iS mr{0f^^^_?y +qƷ< !I\I@QJg(Zfḟݎn01{.,AT0t0#z:?Yb4Op0*1uG:uB8r64axo{1w7ӌ)&ĄH2ּT6ێr?w+/Fxn|6Ck?Ӹ`!!xrsӒ/^{O[݉^;TУ X2{33Ոe,u+uVǾjuaH_%\DݞX rǂ9|,u.\{@B Y 򋌺{}oLKGӨax`ҟF=s(uo()\nadbQS!XʇDypZOFә g_t[#䥯M<>nR}"”<܀MhG>ˌs.$~Q';kSu.ZPwԩ6jǺNpfplD'^{ܫ=~/}nIx.YO&.1@m{~.]XE?KkB1#r|"@,U:_Y+u4#| `[q!9JU[[2#++ħ_t]fAa;@dD\|+X6{[jb|Tr Ę^O{ݼmM٫mX!m6ԥm1Ɵ9>BVv/&1p66C9r`ҳPCB~ٰ* “ahk8$䲌 ß.i(=f\^hdta{ TNkSίZu|kfR!I_{Yݧ|71f\ί[էw֭劄~c U\?oD)2=w{3//E\ xhGpWbc8ʛ"ͽPICG1/!W ҁF~Rh|iP""Z<qiii8|n/88]vE޽裏;Zѣ{G@vzŏ]\tѡ$:tu^vs׽ZAWiF+oz:ۊg"=<"#+7(&,+/[G: ×D&vW6 #f0""Z٨R%ЂjO'[Su0yBX;a;c@w9QQpRsŕ0ձ痯}. `˖-5k QPP;w.\>u'g}iiuu=tOk׮QUcI| >`L> x;:׭9WH(qdBP(f- L '4R&7;>FH`.zX'ʟ@r A9 5x N``25^hS q:.…\.+xm;^\X&keLf}fŨ9O?JNV=H`wcЫz7&90y K7Y0 ψN4xđ~W (o_Ui{ Uzi?^^F (ƿ)ohd?5a}%06a.l?j—[,cE.<W㝙ޢ >>:4*' uaT6?T $~-'U<{k /o3N}Ɵ@N^b,ԂM7Z-8v;Նs GTK(BnpWo^3Bp„Ϭ^m7ml+L˶\hI_;Sd_%paws_SO$|]S>|n/t}1j(uΝ6AAAՃ=z(ڶm //3ڴis+%_M2WTр项w?` r,䗈h#?'[X|HHD;)Ęa W8V.cO"¸SBBB&ᡇg޽{z+nV+/_˗/훽{œu ۺRSn}=&Ѧm4r1`0>cƌAӅ?]D=k!R,9ӷpp98"66kj4,N͍ꒀ Os6NwAiiƉ͞3_^Dķ76 pZ cuGN u lN1"_Kש K6XƼ1^\;A>. 0;5K>܎ZC۷q.[I`wvǽ&L`"xf<@Ð[Qn7_@0RLroN }[|%~c3cˑ[,_,{=NI _#ox{=FUy]dHW"v}8WխPca܁Ț BGf|c5w}H)q>We[?b,pミ gq $CD*è=eYG=&|c*sS?#L,qۘV;g2ѝNx&*R,ӣeק+ ^.-F$|G=`fSբ}X`/_5k܉=zyyyx1d} OFls/0?Q[Թ JB ilڢ b^#ZjwDH9߈6$E8#:S 35Ę#bkkqH, OVT/N>>x:Y=& ߼iU V`W`~FSQ]X`f,'mBj[/ T){:۬(.OKOpGqOY$7}nK*++dΕLDbԻN$]3T Jwfvi !`Q;/.m6UcĮ/.v OOĿa*bT5 PvFw]v0@+4yMLxHԈoxI{ƅo/0WVYmJP:ZgЏ3o*I]HKZUѼN:ѭG@@;vc 6im{n΃z˾݄} Έx?4l~9њ߀u,WLx2zGEg:|Q9.[IqјUV5{h:i o9S4VU^>߿QYYDȒsWq-K({0."B.]4*[.^Dzzf!Ne4B^aKlAMGR+4l$zQLmj_ajw7+a9PhKhS׈^x> 16Yk28SPZ%j` "%ιtq=z%>JEJ/6{!OŀtW ?j:}JQyazKHsK $ɎR 4ɞCР+ʮ$@ v@-K&*d%ws;5b +^qY&@/C^eWܟ`3w?i|] U3-:Gag++JNIG?WnS:?7wժFGϬ^;  9M:]'9g`PT٧N6o>cP Ld; %4("^|4j3Yu9wIwԾ}{膟ꃱdUTdcyo,m8<)`)z;$];jNC+zB| E oC\iH]Xp5}t?˗*mۆpx{{njL'X" =BV3j3 0_T/3PPhO %y[SSWf>X):LQ!}ݍ0o#d2 :>vbBˀD)_*aP_Wڹyx:~z`&4 |9̇$B6 NBR8V1z:=lBFֹ">KBl QQQp:"00v‘#kb#|A7:Ex-NQK:z=13rss( d#g͡oN,*;H =s?3j7'`A7^LbFmDL풩Q(E#PH@b3Ы[ﵢGD2q 4A iEPWB _n6[:#XX羓JU`_ @\W9:u+;iV)(5$1=X 8$RvPXN6y>GBvhEϠ.l `:P%}' jD|%=V< ?3\`-ɗ4ϻ7RSPT^ WdԢC[=7Gq:BtWߠ Vf**]^z]jusfcWfu/Oy;wcFT9|CB5& <=r`hݻw!***륗^jo̜Ծ8]n>$1:nA0ʍBZ4Ij̽YO"kOe\l0@9zGYnf~`;o@bB3Bij.ӧcؽ{7x GV{X t-POĹ"}0î9;ϣxh 6a 0C EՌC:쀾S֧tU ueѷ{w=rj P5+d@ݠXm,!\:kԟ4ZS vk՛2R(Ľ놱kp8ey_dAa 6`dv%mi DxD .8c;FCpT鈨?iobϞ=Xp!VZ߱cG;zȯ^6~>.S=8Œ~~~׭Xyyyƺrqz0wdd+999o2s2Ӝ/= A{,+:_ " ^GQI9VN\7k7ڌ.AX@2 n%^N1$Q1*`Hj+%uFMڨ<4 ]3Nm BڵkoٲeW|kuҥ&$ྑԿmGՕ]%hPnh$ߡ>ݥl^u:ݹlTvh6wFhrؙм!<~MQ W#3iR׮]]wu}) /ٳg4zԌш v7Vw(î/ ]9{쏧fFB[qF%jhGe \&pJ\Y{TJ çv" i."ϣzoQJ):.\vl[!bԸ͹ uId` Ct61*7u)_Ig@[{M?6DEpd?>;(ʇi0:t(͛ Ŕ)S/Cw^A D6P D4'((\UUcf"x!KMz>pĈe@T`!Z13NSB  l߅9k-8s> m#|cXv"r0t@ݢBdQ#R>ǡszl>Ǭ[WQUCr=4T ^㎑g  W|N:AnҪ;&X{'8 WP*9Ӫ$${@5Ϸ$/}p xξR_5<$#z%,6=5pٖСmDú Ρ]}Ɲ6)Մ5sC8VwT_.-krkq8J8z+:'}ARǓeY^cg{ ݺɵ/q̻wvgnxWvkX,Z lIWU rsE-djT{'2gٯMd;KQc[Ծ۶Hsx@h<p){K:k9H iB/...ڰaCȡCrmm6̙3gzDBtPc7>[`W*Y۱ӣ&, UD]}~Bގ' y7[$4pj~}PJd*).D./.Zg/k݄8+MyǾ_<~;Kh S fj+' }pm6j4t6q=w2|aFp|W轜cơqM|%sjkH}%:h 4ndl/4fv% ĜtRӵ,YSh9*-6TZp(*bÃeh7jOhI;KPZ[: Ɔ;Zaѝ:39][s`4~?@̹}յc]f/ma֚E tWR-4dHlq4@\夕m UvȀ{c`'v"e0 Sw0[2" `^}ܷicw;5w[i&Gx0p=Wĉ džKd]YAneIb$K3[FvU!PЀSD3fFfI;L8'0<*_Ў#㆓S廧2$zBLRz 2f`bWftǎ+322>F ϲwp܊B-xNL\#IRؿǟݺuk `P司y _/xDD$fQ>J ?ز:aZK:?~ .{nK}Ϳf%!Lz-vK(v^SF@L@0Cfov`3>~nm^JQ@SLq??6ƣЀJ@D,͙DCr5uO^>[1ݡr/iXΛМ)\/PXm y)j"wJVa*%,0Dw:Է$H%F{4c ʘkkn % ?KmʘOgk ø9Oc/aGB] YM"r=mڴ KqsnL:;v.c2$?=fIO^ fPd:8랫v%p n̜nA@mWyG:Te#e/2(ӱ;ѣޕcٳgWϗJJJ\Go4O(w;6m uƳޮAД/7 g> S6lu%٤ vkoOiVF Lڞ3Դ>h}Q.]V}#+WG|~>QhA)7 N {lO<+F) <3{GJ_~7|c=Vkp'ޕvͱc\+i9KX>cv "m6MKmW@AGhA))곫Z]޹eh0)8\N>j'Dws b;A4 `00t _[6H[rek _4MOuVp8nt=D/kWI())3}7P]] nI\wu7 :4?73\ﰭǥZjuQEujnfhth*k 6X}\›f֠NpS,YWiiǎMOGC3\ڮȧ@a֨Fv9پ7GR8L䡅 U5J#J$d뵦+m?6;5/(h1n7h…/{kι?ϕ Yse&xI/$oё[;})>>,EEE\qϫ3@M&>:&#, o4iyI r?~򗞂 5ݗpDp]fJK˄]q 0 wBxl`kgoFh/2MQg,mbv4dzVݺu}.7n\YntЖbd2A4ۖ-[ 7n~2s͛xFaĉ 4p@DDD4 . ..._$?O>|ټcǎE>\.++;}hdx\LLDUU\ZL B5eB<*`DCB3*s$ S풱ф= Xձ?:;jZ kA`q%hٳwz=/Y);2УXcj=[a]) BM[v~xA=G'ċlާsUͺrR=mWT}7"W+dQ _mufdy\z=r/Ļ8dY~o d'n}]RE4GC֬bv,s=k1iB|sAǺ`?h3г0( :O*, 8tmB۶m[tFC|Acm~럎4и󑡆6[xI'TGAv\}թtd [3JZ'EhmV!dAUHMB=OGiH TwkHǗM3l͆R\?4zqgL=պ p<+ѭ0إd񗏖 7ןamW+/66vmVV M>KP:G&t;m`wUk8&C `asa_ ݓeJϫQxƄߞHI y{`"B[:5HJJ}{9\7#ՠk'[g?'BÓ SU iڛ}G |/) u-W9c@(道~Z6FQ$NBEDzds gE}/C_j;ZݿYP S|K&m:GMX_뻾ʷRٻѣqPc:Uc9~;v(cBӴkjcjRRQ8;gϞ0@$WHMM݇uiiiqݠ׾H#ެ` `J,β@Fh lw~1Q` j_V_ʴq? .%h޳IZGӧy}ӡ0C G/ʼ#͠ʂܗ6GaWygtOn2KМVūZ%9/xfJ)fGnHNN+}U8t,K`،€96Hbyz׹KRئ*4ZƓ))%͸}rYA_>^^D0ɔFIDAv蝑q3JDCh.&u3h>mU5S%,X҈xrJs(j??{qu ׽PA%?.)B-L}kLJ Q7vY(@g4~rz_Z/+?Q G]Qalye 1pgPբwOe%6܃4ABs5j0 S[٩! &EQ ˲|o\JTUw w4V!rᬧ. "T:DVdh!'4Wf$QMt2N; o  a:Nsq^,I5nukX6hf5%DuY3omTod~Ÿdx/0V tM?߯Uw )3&~,'rvvv,6mڔ]^>%#ϮZOY<.]zѣGI3֭[i'O^}fp_^222VW_^Ӻ:' ˳3Ky111[[Z֚cYʚ]R`KJJjNc9rVV퍉Ej&x]v K&M 4$]L$5 Q'`2IG p8k:5_">x/ WB$&&.\pszbg S%~ Zt},OPcǎ=i*"xuo"?Yop!]HHȯ`)ʡ}΃#(Nsѭu]5}^&߮p67EU`೥3&|.+d`J Vɓ[481IB`AӣW6ШmeEǻA bo|ԲN@m6hlLLR搞>>,C"33zfH: D4?&&3mp2B3~f?p0 \ⳬџLƷ3A5^- ߻`uʅ.Ez8u-@7Dn:JTӴADT'" 55$I FD!5%(%|_'N,PUu3` o":̏;vQ >YfPQy62ʟ8;|Ba)ck6hԨQw(*8iޒ;'[#6ѣdR53pzz"q3IT&UUCf4P[*2;11FW}O=䭣 ݎw6lAŪ Sb.tAx&-SN7 kLt *fM FQWeD+MB j 6㜓M@333fǥ+U`-f9..΍ҥKC%I@M8..@tf^r r}"@EImmQgubP=#` Ǣ3.zY`0Ȩ6ۮ:+`4a:i@ȖRx@Wd.jLGX4VUձS3gʠ[n}Ѐ 7m֬Y 'h0##|ɓ='GaҶnXzݿ4h7W`\ L/9gV-1e.9?Gi<_zH/Zk.4|x;NV8@잷`RnG6|DdE| Y~l=GϞ=o4gZZڢu}Hxx[aaaSNَ=zC.]t:Z}sKQѪ}j[9A(j (9y Iq}+),& 0~?iOF0> ݣG1[FGiI?0r}r3Bv&߿`Uʋ 4*>z' ~!Pl>,+B["J3 NJOڠ̇5 F$)^elpx&&ʲwApx#Y#6,3sm;AԱwB p6'gs1c•k2sǴDXWƼ-O8>+HS~f`Ԑ7@?01k  !urP]h" )+++RӴt`ܛ [HM(.СC<;g{ V5-"Ұ? ^G G5^? v%p h3 S u}**ٯwd2y 轼h1 $"ys!C4|Lp8>Ci\dK#E舊뵵}d3׮$W2D`CFڰ"/Uu]nv"666~ѢEϟ?k@y.oȗTϚ[=5 0#lԈϬ\a+wa&!i97YaS" ޯx4I* qZP4;3 QתO bkKkJZGݟ+`!ı&ɴ={ѣGzw"2vʮEs]EszG U/[ PjοDgN&m=;t a t^xߔw{ONBqVݭh,ӠBV}2F>k'*&Y O]" NѨ-j31Qmc3`sĚ5&MztAآik3ǟn V鬱o#Y{vLjZ1E"j l)&kFD ;RsU}gG0#zB~i9"q1%ҹ=n$!9]*BC GlCh⧀Wc-swk;KAgn|@H]j|[y"YFš36PCzuِ.DDDTgddw ߐXҥKowiK% G0@'mm9p'3 +Hf׎\m- ] ($j#'Ց ! :@A55*u:ŝɖ >FCF6`@?@vqA^!f׈p#_4))Uʷ>ճf:RVVV+C_m¿!=/+(`0FyWZ/xׁvNxFR\Ej}h~{@D]s;Ԏ!/@"[ѽ{h__6l薒r`#Pc+{oA gJ tѣko VK]@`$@Ce8.>=gZf``81(zsLbdqYp8r!RAӰ.'OB &~i&5^/:*iB'qǻ[B~AA*<-VU$TUbfsrCY`6x @{8@0& 5G_2YgeG5._QUFCUd_\@_b b'롦iM^C-!ߴl܂OFYVk;pp Ep~c"g~vo$J;,P %+8xrd,4mB1ȡA7B j;UOp Ra5\QUc8664+Н/(@1vLnnẋ%`Aw gf~kSupx ro"ЦۄwƖlp>;,f/As'dl0}d8چxeWݻybBzj[&)yIIIW}50|A{P.|f V&y\8$xķ P[]`G漶w;uuYF 3/,-wӱÇ5!#vN%EbHڮ]}|X^/J 'y<[r2୪C-2էЏ@EG< M,~rfۍ7x`O!QA_Ϡ. UwGk\l???D5ƿK9vD .B ў6CR͒8vF^@ /4# ~sm"IBGy$||o;d#dzGƴБG=} ρs7l!Ao0`No@ށLYG@LfϞ^]+WzC. 3 6,Yk'%%وh! v6` EIY+A#rw[%_9TW@~>x zUVDixS? [ ǖgq/@9)=K{п s4LEDeg1 dlK.ugW `< vw ͩm 111{:(쥃t|v}*(By뿋mԁ6=>'m" ?_g7-Ln\3gmT}껗;j~jd"--ѣ &liiigQ/pGT%"꥚/n޼'O>iZ7̩;#GϨ?iĿ ?lw]ckIG}fMr#gpj{#T+F`€d=*99Y<͆,d Im1mhtnm Mw0M,j: K4y+uBsc+p"LTF$Aߠ!\h"4T2gÂd EiguDTb̋j7Cc7cbbRZoX'e ݥR@Q{Ԝȭi-QUZ Ke9 :\Ft>ш~I?[UT{NZU\6 " Xs\9E dddנAA7'$٦٬EhX+#jbTpJ?_ߗBCC}}||`6u! mڌM'(fHz,s$.ȵ)UCեس(;}j^U ͓'O/Zh,waJ,^8̙3Kf[6Rݸ'\; KI01gVm#&CS#7eĀޓG5swx+): &= JdWV>oGa]/A3r]kafIӹKb222R222J 233Ǻ_R+JD`(˅ I3322~483!vdeggJT*Iʮy!C:oVqQF%ʮUIJW%k ʫ$Qyu39-C&:N~;MGz{CU/7A9ˏtk۰Rl2DиDLK*TEmP`Yաԗ h3dܻxik3o3bSooh3/.ZMt3W`|+p)q\Ai%':md9ʃj/O s '4FD~9~lgO+2[Q(3݃U*AFOvfBmD4633zw^Xzjt&+W" Xr0`L{jbL]ї?]aXv粟Wꐩ~^u !W \Weai; vE,IR]wr|UAua>3 ߊ 袷T PR(ijW&#a `\!k7$*|3cs"7|7Jxafe[3_]۬uҦ޽yj=YlvC3C]0@!2 rw"NvN-q$Dw3vv&O1;KlTUᱝ;w=(f^@cb$ ixDo9ou "h3s5 +:鶚P6n,##]xzD@ Bhuh իhfZ$fPeu1 o E7J*QXTj$Ćdџ`v%)|RNۣ>7``@Xh(.^(۵b3)Piַ w9;jl6L&f8T۔5Jnn}zmI3@ex[,&*qbCo)n7===j?WTT`Ŋ/g^=܃[naOaC]> ڦi('k?/\T; -?<7V*-+#-W=lȾ\0ޮH" ԌֵˠCZZiFImCc4|K[U549_fff6)K%VW5 1pW!.<.`n)lCD V>]V;Lp\Aβ+Ȓ*kWqoJ9|{NQ ]b6c_0aHzG􃏽ѕH(9.F*\,F]|2| ugƷ>w:f\cH(Re>-UvG/nN.wV ` M`UHrwBFHl]狌){0^F)i~S:>LzH š8t%vr>p`٤{/|~Җ˪f_w7mv>}r K=yF^C4mGFFƤߚd-/^ L8…`"ڸ`/>#`_7!ql"zCbry(X ]-Ei:4y@Qy// +5)^=| CVv!._AUylD@j+SnZݮl˓+j2 % aHxQI PLv_$Gm !IPT5]j_Щ5Pkp&6 /"{](g;k@A`!lp m, (ΐ'BF3.bR,XyyyhӦ y8q}@ 6`ĉx뭷`Xp7nLbxs@/^ knz5==ACtL%B}2Ȱx*sY023Ncō'~AS̆ P}Y4uOrsWvFݎ=?kߊ=נ"ێ*Nma0 KQ+js#n4]2RC'Bf3V| EQIn*X/9!-$tfF &tճ@9ɓ~HIo3 |.`/n·UE}USO=5[eI:_@JFFX 1ߐ0 󾫾v23}:պ+KfoĈïw>9"B aP-D*;ef߻^(-u-O-F=IO`G3Q,%0٨ ~m۶M.\+Sv2Ie i$DO|}Ⱥ\ NFl0 z۪]g5S_^2~~/( !T5:Cvvx쫪 ABn*U|\2v0 =۾]N]x iHC(f:Oh[dBT·1H0o߆dY7!j;#yV[/cA!)&/XÓAB{fɧky * :b7V[.\. "tEo9L6gd`Dxco5f5Lxt2|r>&w@ ӣE&TVmA^ILzTK\AJ*QM"@\w3`EgK`u>(=E[nj*»@k.};+!yk@'=kJNyVN!ݦm|mR-Uz}CH{r.K/Bb AegWbFw `¤d= q*m5KKp e526jSwTg#~K3{WnIxCdk^vW-ݾSNȲlBO3&çڥ$2Ykft܅zefώHؙ!Bįve |zDBnl7Յ PG*0f|ffbʕ(*r]pׯj.E?ЄX^ٱ'N_N{6:f6@e~H6)Dp3p1з С͚l\ qq`fbfjR`V!|rZ9D94\E 8C'L#<'|.\-=ÝvRYMoU0/ygN0Qk:߱  8WwX!66ֵ/!!xwo⧟\ăPU۶m9vv-)yF_v?OTs&Ah Xz|}ѧAAH{wޣ!&#MFL@dS7|ѭg7jdfT5cB]vruyVB|SWI`_F&$E.]tS`@䡗V #m`U]H0v>AN: Z`q%%Cp[B{>fbR UcQ!BK |f&B|,5X/[1. ,mw,? ihPS^m Bw"0`LċO QRpx҆GCٰ탷vN&,1ijN"--/bVv≨ ""2n3Hݏ}8H0" b|̍ŘKuzѲ+(; bk&wْ$G:Ֆ'==w38t֮]'ODYY/_^{ 5kJJJk.4?u 1[ $0}Wn#pmG5l&5ZIrO []cUPU[mKi,SkrqibƀA'NUUK;:z{4W݌q%ؕ:[Gs3i$Ϝ`wzj1x)_F$Tz%l. rm2VRsn G{AWӍWt;s[!(k29`O?nuUM#2v0OfQdoXM݈{`9 ._ y ǃmh9[ PL:_݁/`jđw<6Wzt#%⏍8yHЛ3ֳ$k R}S*"z6>nGee%hLJ؂VJ^:$Ȳ k4!z dHD4XEZY[aw轼^FDQ< 4M; !!!vcڴiӧ>clٲ{Œ%KЧOq ZW5 Zo*5'ml=u[`҅j%&9rBq}j fx" Q¢Qos QX^jGay֖i+^K+߇7j 6Bxg7$s> ʭ&9^ {"jR(Ґi!x6IvcfI 0 :ϸ@= iJE|:ATC 8$L~g:e+ ʻE*<S_Y݅57Aeg}ego5L[YnazvgǎC3/jFE͕T6~¤8+Y`fHx ج܊,"vEEQE5ʪ-M.VkkydMiG`(GigZM2q?<Y˷vX\W)CƫdԳ' 2c{+ 0 , 6m䱄DUU(.QTB@bb"dYFVVΝ3gh4+*fmx~,Ils܍Z]PGɓ'ڷ#k2e Fv$Ij?^')Z=3s=G/ے^2cXȡdU%__AP$?>?cb+A!=u-͜ .:t}jBua656[ᜠ(02y90 I2$Xi͝?66IfGDJFFɠZP^0䕔#cb x\ZNJ QiѬk|Mʂ?FEϼt`op݈u1ѽXck8 2 nA=_rJ;t;d߾}x0b<5b}mڵ;>>se_:۶m@>}+ʬ͸ |jOpJ}hfYz{ S ]rSoH~_9Cw)} ||}k,Tz>{+-- :t@rr2 ΝCa4!ϝjB):&  ")ǬsbǎC.]Чjbĉ۷/l6`Za4C!!!`1cj ڵM"aA4E=$YfڅD@[gAX4 UaU gkO=g qF#L:$ eV+5grg;wh* :jQ(J4D,3ߊ˲$&9EP4 $dd3/k̶DUii)aSXA^FeXX_ ì_`ʽY$=|F$ TھBvwyg/3< -bc" F8AKВm$33"-35J&D&[1BKOAmwЎ ď`4Hbl Ӂ\FyW۫xYEaA❚*1nR' &4!AA`*PYKV%"̙3:xmrk*>" ?Bӣ4'Yڡ%t Kp&j kexT>m0/a{|}|pHQؚ] "’c]^fmdw?j]T0LHLl̫߶m[x{{#)mAmj.[>⾿t x%$,zTQZeFI>nJr-\(QNfg^??kC3T8bYΛ6 47>A߇ZufFVٹ#0p8\xK,Qp8CB|.yLϮZ`#csC\`I>nEQI4M[vZa̘1š5kpEWCN`&}Mfu[<?Knyˇp I4#fdd<g5/\gӵ<ڵ̜ir,!6<3B$"}UTTԔ#G\6Z`ϝ;w6 t:i! ֺ5 2U iP``3nֲiwt no?"W_0uMs :\M':`u?w`RitZ0\_Z] kUeO3,lmMIK )^\YA'4> } GAб/Bwm:>F&8ٗ`x+ߧ[ĸDT֒|MG/njBbzlɌ]3İ~ᴖ=br &F_a8n$1&vi7ad}4͕EӫW/|w.bII 4MCII bcc7`hBGtt %1>_c98s).!.<lń ƓFOܰfWjļ&/!ټXpmgv7{ՂCQ΅s;z4x ]vѷw/2yPZJtaE/;3Mҥ$":u*:wkbʕtxꩧ< WqqqM7ygvRi3+0xS:5_U~Mطnmi͑ ʯ aM*Z~NDhtKV2s9"f~pm옘DEA/K 111w۷ɤ8Ԙl+}l r "o uM0orҮx?գ(C aA9:{˲C]K xew<Ѻ+%6ES(˅x$Uu/O#U޸d)'bo?%o%yβ_Z0lye?3NKL+}sAP߯~Dwvw'*Ңؗ a-5I`Hu.M9Kʭ6G y|ϭZi@`RػIMU9 .;1 ƿzmRRT"ѝpDBi(vpτ?1Z ccceddu{Hiu̯Ĵ~5fuײgw]16DA 2ZYYZmy%$EK,&m#Z )Ĝ01==.vzJgwmyXSL-ɾྋ/>ID#3wWzv@Ou /Un0>>ɲ`gϞq+M&zB~~~… }ZKxc4JCrK>I/ߖXJA@,b#5 s߽N0 \<x0:'f8]ܻ&ۗ-w*7泫wap/&b%E3n?0s5O_Tz-&ۘywQQѲ!{TYO20g-*^S_Yx3ƻͦ}HfG}[ x[JVC+hHUQks]ܶmے)DNv;} OFZZLq\hK)D2s \"R1+ɢQi-SmQ; uic²L|cK;?Yz+R KUmE>wMH=MJ:M۩π.?[,mbz:H* tKz˅ :ɲ塹?|tU9 fzī̖|wdv%BwL&ScvmIIIzl6ٳ?s/jZ)ĉ')k!h+:͘'TnZхn$p #K8M~j:6 ^-4B"@ 0,qAY 2xuUm|okizBy_ri=>cRBZk[h'%4YF]l>ܨˑv5ݺyEwMag|_F0 0Ὑ߾-0i4 ~ ښU7x={b9Vx .3fw!83!.ظK4]Ǔo)"B;[pɛv׻t흘i :2Z,6~(D899оwll84$Y'NPBJ/^2cٜ RS6ܨev]o.k{`zl'CP24{];i4t T.K }h.4Za'd_CxteWhX`x=X1b]֣7O˲N@c1R;t1/8/h1ͯwsxx5'+_xj,hǎHPZ\$UbVvE=ipFVW mR Gֹ;s M h**?N /+;A]GSSMx?'P'rw!󛾯*]H+;g4TZIǮa?#>ǎ6+kzDYI@^6f-?ݫWsaɏcBpך̮d]~q AIx÷|Ǜ=ڛ+'@Cؑ5m`vŋ3n\UKIY(O 0aCg 0-3c V4se5f0x f&!u h/n @щҺtxN/#}$$0;\| MF;'"m /]s/jb'a2[5\H AlV 1qNo*OAA M3 7Įo 2b4ʕW@Uv({0CLM#4A!"3 BbUT Ai*`@[Er,TBEłt-zNN7y~w_d̞r*/ u:-<T'Z~l@vo:zm=1Q8#ff1*u)ǯݐ~?ӭs񿿛nO zמ5Fe?B@'0^ ,\צi;i<侚V ?_s= k%G֣H|;)}p7VmN)yet7|٫fKya7-Sz_|#hnD `RCn).quJ{ϰ^QeƵąc`RfpHYN?hDŽ`Z*LDG&˜Mc2Vc]^ & Vll쌩wƠr  OJEL哋%%.x=0^& `Wbu=i)|_++cTTJIc}ڹ3m6% 2J}83bf\_K >(fM5eb:j,qΛnէkbs@H ,X` Qmڴ1v%ȆQXa ],kuwO" ^+B@*3w1W~;P+@ ?r7rGPj.5v +3[3^I<L!Bѱؿے_DL==9Xv{+uM`PE [Kl@o靿`k)U'l+9 ?80`:us6O碌%D,wϧl {QG/v=ȄGmSA Ӗ6%n ע֏0G_0Bz<4hsQ| a!$f^,-As%)0a?5 6l|-kseMvd2μ#[cup0anl+&rfgBIP$ [Kh?7&mӁA w0+n2 @5 LsSDFga!@o AU Ć;ك JƗG6n6OB0  pP#fR9z= GU<82^9z0 i ZgRơVJiiRq&b } jhPvOX,=z{̈x3-xqqq8qFc w'>`:]Vn(.XE!"| ГAP MfBeV aVgo J̙"@301ҳ:>`Kڜ;\yѺH:H!y敾[_~_uq#'U@7#ns< "tRO] Hp h"Hff (ނ]Xao2T,ʿZ};OV*(F dxaMtxi~FpmsXm:S{oݥ_l@' <#I B?Wn]X,YQQQo7 "4 \:\^ .aPv u#K9u׋אe\\qkܓI=,iInZ\T4{r@⋏6f>_[꿀aOJ3Ƒ>#,/a/6$-c8E7ASؾn%R/]u$eM2͇#/'50 %aj`L/jxg@BWHB 뀣.f|ˎNvG1wJb%4` PE97Bom͟|Q'\ƛ?Z*|.d _IIQR׏pRst;b :sv 'KB~laj |oB3vmA-Ջg_ׂy}FSw0?!r,jzKQYFPb"YkP5{˞\F!JdA:޷о+q}.@mKl0z|>Z:$&cBj s \?$bi_ yޟXS)ʷ]Jye~A~p;\k,O!On!GqLcNP3f/~VE7NK c }v麫Ǝұ,XrBΙ.qN#ux#U&V0ҁJ"Ok}8.BVB-^hN(0aVb-L2*+CCL7nRxUQ*O—[;X|m HڷPCJi忉 +ț|`wFXaʊQ߈`SWc|_NF|>RW\tV9^FE-h4}ҼKKE5(+(b̔tdoApx( pYa2 7>8@\e@µ.,+_\.M $߀kۣ/tMfxxHUr\7$xKZS TU% aLA;> \yl/__J+碚K0o=KPtkxa"QC}0(wdHVq+V @I-vNiA%c!)+Xs:ι ]\K(n({ p8]hٵ#7O۰ƭ#e x8`)0 3w?5Xr..lbBJ/h)0@9{b| *N+P =U"/))iM,)F~x'..C(@6*.t#h Bm0_é\l)h_]Np8c#;o@|5Lzm:;ZAQ7R/tɡopt9æ4]R~}[ nKYէstO8 HuثP?s3&NDU+*Jd_z1qFVݟW@sZZ$'8M-"+KxY{?ط_$U>z,`ܹz$w1x]9Ko|0#W8ӖχEiFPv_LŒ+\aPN]%'\'äԥ=UQq1(Ԯq*Ztm]q DF#*6|H¢# Qƥ6Sg˼@ܝ* dR+$.\o(nSxD`? M' ,K/^JV=fd~3#O %z1  =&S퓺jTrw1*kb=C~&f=qa 0xok(}MK =..N瞊 5AjYAQ*BƷ(3FXwCקi DQ~> Zz$RSS=-[tն] P+)nuCg͚5qԛc3ufF=(6mfWоW7t _!e'F˿BxeZtBOצ cii#i"V$ Je@ϸ`BzjBB2K#Dy?P$0\E0 ^AǛzZQ.rVb$Q jB@ @NW^>D}N9#_Q6!y=q ߤC)v݃MhODqSTka@_?ھ^?CtC ۧ{I7>?T13FJ Ɖjn]4*5w9Lb }dV&D\Uy@GJƷ(/:B(3םW}`B`a0+x\4 QY4~L]n0>V,C{EڧXPl|4 +ˏly;YT_62rJJ:t*RWp"ha+EQjUAw#ELm 4MÕӍ&ְ&bB؆2+)Ȉ^^xtY{ D.`. _盀`/96MJlTa479z_61ӹA3in_ r ; !ӮGިo/ с:wv5Zܺc7R_Ql `WuqQ|ޝ"D |]c´N-LsgNI˗/v(XlNLWq֭ә*?_xzD@kb/0^ɏƈ,G+wفm -{}'o@KU kKH0h*jJV3n1 QTe.MEyy5!62gDvZ *QU#-<VX>|+f<^4bTNJnj%jw{,'+*:oUV@Gz4/kVgZE(2*2/^vUl`&dB5_~󓂡U/=럠KQcOb=[_1ު*.Sd~,ŒHB,pwmDJ:A< H:"Sp[\g{@UBLUX2ǐд]sD7Aq~QbP3/g{SS.>٤-L" V_za/ ͹ = qKL@uJtM!X~*,Kv8]4,`X=}?n6-a2/Ub|}uM74Y*@ IbH}j73CL"/{om)P1 6tV_2JO0(W'A~UMTX%O(Q :yo}HK e`[n= bd^a z>cb (Vm'klÐlYUlôCx6x2;, bL]2~;NAtjnI=BL]aݨK{g.𯞾i~ۓw顾+J#,^_<~Gᔕ㻺hxS]b%W+~b^n?\Ȑ %㏔tT>Gx~נk  #_A&v phE ljz]iɛ[zpsK.e*H0 4H7)2e S*xkt:T͍\C&+-Ʌ5?3?^T5p4-qif^ B&`HD1119/^< ` PNT /\ 'jTp9Y0 j@hb}{yBg`躾hF r] ^ntM ?lZqw%PoɁ5Sif?j0Q#|RH[HUuһfj 9d +?bA4HeCƞ@U' mvmkl0AW:^xo%NS,sK?B6zmƴEm{jw{O @s$B*>QT)9Ӳ>F(@)]{qMKy ,N=i{-)LF~zӵ: ^uķSj`&XM"5+t@ҲѣHw˨ n&R+)uAHz/f N9Ph@'1s`kAEi1sկxx8t!gmU$7pAQBS3^}j3"4l5~A[XV9sflBB $|n /|73?D$#D ͐FBDRKDUQ|TtZw넼td`% anWI\SUB^U1]I ڹ=6]HUJ(1 >*8+|+5 *dѠ%H5hR3(/>A۸#- [,;Lȑgmsxa9 Ƽq_\2LN/.٥@fc={$mݬ!ZfE2UO@CYR3t3t#£/4op}Ҋf&BXӾ୴f%>t8lgv57bpts",!4\oƽ`4czLMOvb ~`>0 @T zS,X[jFM9y7b|, S,5R:!>,_Ů͝aʗM-ųwh; _P a!nvXV ,= GhF0:`g}]%\Kʨƍ[^ ^.踢 1n \.yTڷt^~*W=)h62Mxx΋P I4QX8XK=^ ÷+cӀNnUcYp̍^}hBo,k춘jd˗GD?oujN.ze'QYN}R5Xm\"l6:L$*fvq#bLgd&zn*A)J!3<9mJtkHunCvP!"o(;%lq"oיp`@M]%ݹW>n5^xo曈Y2h[ >![f+c%F8ߋԪ~zJߩcl;#% R(O)]yW4ocш1xk۶ΰ]@&Uw{r1u%X)ģxbrطȾ;Po{p'>UGپ84GY [xɳGOEK\ EֵHZ =L?퉪'j+ӴuҷČP5`зXg%?P@3{u+0yM[R` ڶ ` ~Oښ [/⯱{6m7OG\fSn6L]jt1KR$cX*dA-5G!--xp?N`/P- iu}Xv>u޽9<;}^Æ@>&̌m z޵I g-o}ji"'f;w}#sL<nӧ朵jd8>B !~h;ϜZp9{6{^yoj+7+Ҡeq*}wvaIa_˭0D@?eTUu2\nTAs73 }>L'YܺaS~ <ջ״)?Ud~PŢNOY`UzWAN~#]?y)(YҪ+hQ9hu1ki{|/1&B07N/XU\Ӷ5ڴn\{ ^"bn`W/y\Ιm1mCX+ldBwNeׯe| :: 4M[!򥔧TU٨Qq.^Wp\\\4 " QmS ع(iM!I J`!FЙ@bLXήMJuޤ?5T 1$|Lݩy_{f67C@lm;ÅD`@F}8Oj oByM\#6|7{>WVL}/6}6: ,^(K'JWL',7-cWw!z%|nG/z|˦m&@/Hӓc:8Ibt>x <ޛjga!PHD)ǃ7(u tn%z^ӳq+EHQr,uMs^soaam>t"@3)Zȷg2^||\ME%طNYX<_o@VV]ElBQޖDQxVf"8tǼ.72^ւ}Z w)Yz|ԍx6QΏNF'6NsP4~ d(L ~57c}wuvm۶mB7oǑDsrr w\bޟn]]BtqfܥӜNU~Jedd`+U{}_?N},qԵ)r3k[fɱ[a=ݳg$jeM+5$0 zO+~ c+gO8XC?8K<-ޔG^xX2iM!\ckB> %5OЩF{uN]JGGk–bue?&(-B^$!efhǂC"A.3ϘkDx EqdykQ_ ¥lWӈT'۹M7"+K` #M_TK r6Bg' FlT/<#0go֊o~ֱJsv 0i32sǠ_~Q-[e, }:+ص0G~q!#b:ҾFoqC-:o*yʉgwߍBk轼ZSYDD 5|׍FvDh0ZLEjӿ>TWzIkS/Gkmo^>Тح=NBy̚|I 6l3ɸS: coP>piEyGۺƨ6SĠ`csYn p*B:PL^HF3np+X,6_dg0]5ԫ؏Z7C'/<=*M|wC)}qɞW&䙤pEϟu]όn1u(w.|{cKV3K`L%U\s y.!G~iTxW[xyGSDjI^]6$FReߩdֺCd|1Д~cݏY_[/q7` k_D߀n;v޼ysN~D(3E_~J(ck6x c8ub<{%-c1R6lOT٬^r=P5n%#+ii6@U9F%%@@ @%S'eW $PEy4 9 '0О|!eb?9 5*36bz+[y΃yUFzG)6CV/^$5卯9>nիkRhcH|NW@DOjo] v';V 2bb](~ɜ3K<_QloSd~-<63__x酿qYY6Z;cO)i}xY4%RTq^94 x6/ <4̽-/jy-Gb2:T%z""lU]kYQ'|uj эeqI<ޟ)W|7!1@@&i(*фSg)*)2'uF.33l%*GĶžd|stbEc$II (B Bc1~dWbz[P^qx hǒ_HE3?HNNn○W^eFDt"zLJyh̓reIDAT_8;//F7Ewgbbb$&&"߿ _BD7\$8`Y]C=g 6l/))ɘze֨ڮ . {jsgo>?\%3fp>!g~M:K\%JFC9^ EpwGڶH XRJҀo o '@#!럌()IP4}o=o @U#&tqC}w}eHbɭw4ݲXd7X6LZtAM[ u0.wJ{^o&9j Ak׎KןvyvѼsk4 ;FέۺyrRŒj&=y u2C}#xkf$9M[A#KU֜\EPgXokb fK| @7Ǟiȯa5MD,j?tpmɽa=6@Wư% sT׆ٙ,E tz[4sLhSVa @xSV}1QT^E(V)TUU.(LtMk @qP_B0NQv˗/o۳gkjlTFn.W{,,,nJL>{Ǐ=VިX\X SRx/x5MZC^\._K9ObjgFHHp={3E=1Q@cu)OՇ [LVu{-auh -A 6O<6Dnv Mr(^tpPuzՂIԮ tC'{s޴3qG6B5}>[&.)NY.!S~!gjYS:j1)w#u{| A&ײEܜ^akzrV@G@ "3P6,Xk- ` ) Ԡ(*π6&W/YOoF\@<d6Lk~⣩;D-~>"8ƪFA5PTQʟeGn&b+mQyMeޘG+#))I9sLS pShu]㹤6YcΝ,pZ^Rӊ5^27~p\ydnlv=}=#s,i0=BDfj0;2_!X|u)]v-jxNϼ*C<ϯhR }&Qh['=&xUǞr {ą367!p;) ؓ65 ">"R5[OJ(!aQPg?vSvD#4"ɅH ~7 b>É^/JBLY1ӡJ28`5Sdxb8|$0_%''_,~c;&''.&qkR< ƪg/ 8p ðlށl9gQwv=:lx=&/YyWoARRҼu z:BIi(*r{<^-v7,,,lǟڴjIOL}>Ʉ=N>ϓ88i.Y̦4AM3Y_>9mZEdmg l+bF%8;JܾуCl!]XaWŀLCΘ. }{MvTE>9vAO4E.4>ozzXUWf. sQ'↠`w,?WLfkg`r 4CQy%򫳐+p!,#_BW5SMA~MAxT. I_aZsQ~|]lf{OAϺ KQrڀ"yulDd{άg[GjWS]b"`]wiz_a`@-Kәg5{+mK;V4ͫ!?3zK&m.]Z`6wСǑ#GgϾlX^sk7#I-Lix YG ]: v- `$xt`c=+zͩzl,S7 ,"smA:6ElT1;g-48Ӝ#P~,,C/ ڳc\|d;|? i_"۩ x5[,wO4M@/BiaW4|4`WaQ4o5U2Fm5f I|o@jkƚ何= !,0kp|o8@m"TwM3v}ǍI:=oj'C(}`ig@C(8Z~nC ‰h{_޲eRSV SJP׮eׯB7o~yȐ!C=[QR vaH]gKԐt{nyw_2rrb=~ANfrMB(-,*'N*W33C@mw~㳲s Y)Mu]P*Gq{*6}{B-W1_c"~}ATZ4O@ (*.'OE>{.Mi:zrKu`wX`n1w|b_C"no?ybŰ5V%l#jPb/ c:ؐ;bX.'nک6O}lf'䤵Iyq9̄ &IcIu^@.ᤵIUez#sP G"Ya;3%&1ؒ{B#tќ%Z}NrSwђ[Cvᡵk 廡(Tf|+_S;uC+ c9|3Ę[۬ji1`k |#m/uk'l;~[^Dl@B " h$صWyIo:z ,aXQl)n#@zN(7>;vl Q4hЧmWox{L]Ƶ8x\^GQS"$ !D0X,M `L,`ߩRbç[90xC;vTR!9λ)fjlX<hkӆcMt:6}m΄٬;hh 7){^e+@$sp0? lp8ع{7QXT! "j&Ui|280LV3FQ ¡K̫sQI2xS0 =C\: Sg称b SJ$ʆC *^}x͇osjޥ@Lz&z5(@׻y,NGUzC4/Yl3W7ۚ5:0\2;`wCD0dMm8՝3?:>>Dڎ 6#5EEFYEa 8U<FS7E>6ml)R"X :0JiC=y;mGhtW7n¾is"4WrjnMı<|"ey&~ZC,8n_J%6s-VLi. E>X 3P)W!A[psMһ.*przAL?KUATg@%tPm SqyVZda:NCKڤwZ|}uF%maE:{$7'\ [մ5ө@ׄ"\gTFG1&>?ؐ'6Ʒ [*ތmejDHp-i^QbV_m`_:W|3ݶ(-}jeمc-W-M:)RmD6ORݝr;W%hg=6Ц7 N `MGh%7cUY3fdKy'fV\XEv ?+0@/K{SAKK,ijb ^hok?ۦ,:5i, ,WƦx )Z)╕0Q `֣4J]?9 @ }N'Əbf &.7pO:{ P7sg; I߲ehTӹ.?[  tc ~]c 506 E֔ɓ+G7h/|MoFyk26k6oV+W~p8N<8i"R\3L{θL>46AZnvil4)q6-gpJNjn(JLB|8V{5,*G!XT[P@oKN!Q WNTV\vN&vpO/L<ױR@-BRzL JɝQd;"TH=3`5V~ޜ"E!lZ ȯT^нG^˩d8DMq]7($Lۇ@V~}, ^"*-&n0T*3A=#ğU#l1^{noQN!ۡ \ QoΪ7+##8@MHL R("_9R#DE/š S{)V ‹+,tqwyo8X=0W IHgYp@#NZ>ǣ N4V!vZ- 5?k@v9_."<*߿Wl^[G$}FQnj$ϋ<ĤH'*m]ޓN]{d'Pq M` !!|ߘף_XBB:rXnGf7 h'CppEs(<0i"Y_ FBUUg4mtM^}&|! LEǎI`BYKCVF^91&PS@p*g.u@AApV!|Bж7.߳ݿRb<`Y4 &IUEHg4@"P,N~~/8P/(jAxr-_ͮ\N*Vv_`loqMiB!lvQ\׾ f0NI=%YBWF C"ϤldY ".*YN,?>|$eҡWD_P@˘P )O:& =;!!f"ڀ?S̒ew|ǚ44Z9;];zP ʟߞY2n`Qt'&OWKX}XYZBg3" 6jl* 2G?A{vqgH|MivM]\nߐ ^/,ixIS\8ӛf])so28w9Mu\7[I)oxnt9 NɒV}QkӼ օT~FFK U 3`R<-,Ϭ~Bt4@0r5:co GHI%SV&?\ o1rtB0}~MŲq}V|Iv]^wWMKTL𴓒:ZsnccSphTւX0ڃe؂(kTY`!_(j0pA% %==0~zb,lZNDtźoy&l3ae?.7*2 ￧lݺuUmOLL4pI{2O>)p+}$+VkRQ1OKe n; * O|~^</n~K-By<|@“Qnp*C^PIK)b !1ţ+~-{J8C!,&4xV8$旬m{ rڶBa4e|:/H̩Bގm@;E^Ag; x&ʚ7`6],l A8=jT#qn( /=t5n}w|SӨ42BT5mM0y&gwW=UvdiGx=q~Nv6JXȂ\Dž&V`MК׿93'kVV}j8 G~ R5:p@GYAu ( A^S`1BuxۥTPdۼ.wv@yj>^0VR=‘4z8/1wvLO]=8 'f600"&uk&tHsYƞPO2iCEN3k捌 )h¶ @ *3(󕨚b9a51FI+ U*#De.!0n:$h,ˢ.F1GUck<UՁx X^c(X mLg܂rKPtתg掻6i& Muph`3'V q,fE:<Dc,bs85 ̮!oi%' 0((4F*i˖->,MA+/7)Jfks8W_6b1nϱעd՜}.\j OfHb"Zmn1/m+_u}}˖'7H)!@@~0x`,[ g4'CӸXL4JӉ .\ǜ#3d p vss ?jg/ON;PUitKz.r(@Wљ%qEG?V$4Cހ.o`Z(0䵱o8}"i/b~K=iwfr IqN^c;OŹ$ ݐ瞇u7L=G:epbABMaSVc"HIht>yFļ ~nAYG8k1~0X{ӭG=馼YK]'p<%^b ?r =y#Lbf(=s8 Ms^'-u cp4~C Q+`"˙!F{KwRX|^(ſp(yi'v}QmZ޴\zpp p~&dav 0ú &ߣW1t:M@IXqJ/B\i6uEfK %~FX*Yύ 13^` q8=_ۡxtwEp23Y:sڎl_["1=;Wla p| V](HV-\8[yI.hf"'ը4Nv,DI[ ,x2 K:ګ˩r]q^Y՚w3䅺( XGE~)Oy :'{]Y^Xy]3 8<e}sۿD  8iWΊG\uҸ~5;~:p% ⵱}`1fKbHY@jgj#7"s3|D& 2l 0mR[`|hP0x2%u68$b2e9tJjO階K'.vP>\2/_Eз35QRcmlĴ`+$HxMGQϟ{f_2:<gP, T\ @KL⧄/@SOCį>K'~s_z@Y~Lst|@>{no tA[-?zr( Bfa Sw8O/0 篿je֢"R\nвEs_OXE(((UUjCDD$#stss1=<όBUm_ӑ_R}ྗA1TX(.RA%H ! kQZHԥi Iڡ[ú_> w)XWIP VW>jT]LMnᾒ}Yлn'#;-W=t'5geZ⺔Yz`R&2VluyJ": J%]n#\*  j4g='pJ!S咘*>S/2n6(UޒK5xf7,,܁׸q`mGƃq78eEO~;toIEθ;kv !R:PB{H!Cdn1BAm(29^#u81 5)QWCUPῂ|\ΚC5rBjqyRǑA7u\fL*4Pp&. nKX||,ub۲0xړGۮb_"ؘiƃ̴!vst^<ܣ:ԶF 5$|5iY cI@6?͈<0M<5?k3Vu.л[/a?PRXU<bp{E{3 SG A$sq(z[;  (a]=r}~yVO76*FYewgsRQm枂$]{DbkK 'H\U1L("uv/4Ր/9â d8L$ELx{Wx(N3A &i?.8s~ۊdc~<l~kRꢰG,h-W/((ݷN|| z s" 3tU[$&&& ! !&EEAT)[ :r"88^vaݙ}/)Wl {w<xg-߃ŚN(|tdޯ^zp ⫟n҅Պ7Q@t z*$LF?#lVxc0B3KFh8^8K/rCU,[ˏsJ+ΦW K;UA{g'=+,sx?z>](@1Xf|ɇw&?gޟsG0塛ʎ!;,N2Uy1r60CG"}hC\H(PBϸYC 1(k5D!|WԅNS0i*=InIRK:n0'&uTjUNJK1 UꊯB&>蕂̱s*,ǗV`ß=.rde]ϒVoH&{_ v6` +c&Yt4 q;T"OX>дyh߻BF8E3S&3 ;ӐxE HS:sUn4l` U* ވ Ʒ`jV=!Ǎ\*ƒaɄ{z~t꿿(Kמ#طi.@?tJZV^A D?i.gn|5:0"橑kbVjx-->e5V#Je hba ߪB ($''l-[k4f`"7lذ&l x<5^On=<<䫊R+++kTq<‹ {8rsz<넴t|l9rpwȱ0sK8|:u쀜QevP3 @&QA#vp1%Af#J+2_0wP="$8g-rĥΓx(]†ѿ͇ l5eLxn>rV|V_*!y+\2L1(>TDU[jMZ~O5|[yVg&%>SLr t9.ػu1nC渨Kd?mzk׫`hPUv9ޱ_< @sw@`PM!?lV#<^]Jʨ(+?I|oS.ޭ{0y?KˑEWT)}NT@ޔRB/kN0 4Y E)QmwF&%W<=x jį' V{X *DtiG I<cHZR(%Fun{x< ^n08W(Yv.X9om[&k*Kԩ7rE8nٶLZ?cȡϏu-?1cX}da3J8FkG0lrw 0FU ut(b,9U=1R?dؐo@dqQ8݂x#|{QpR95߈Fƀ`~7À6~a1j*R]+$ P:}nw5 7 T{6o633 }{a۱yk2^~}vi!yN~'z|* Fu'nێ>~~~((,lNiHP&Tast8Bu,8 [\VCaU\uz~Ω`G *-̲ &M B+'׮S*x*톒ϴT0s֍sGoJ_1~t?)*R/=%n@E..0u\N}xhnB" YY]@f*p( Gnm+ޟ׍ұaxbWJ}Dp^^ęru.HЍ^ ;ÂmLjmץ"g+2EW3!19Y~ ȣ?MZ1<.%p˯p%At(mq14h§/(4Y]9fJ'&C@ 3#, \m=#va5 n`~s_=PcVD@Ua{S;˄'zHl9dc0`~YJ+r`{n}զ֑W%FHk~j'[/( M~NLLT5G7gJH(+̅/[塵U1)ҁeVշpsQIxS&sS5]{WQm׽fvO$7Ћ$tAQ񨠢`{WT읚*J/';ͬcg$}}_ɔ5kfϬ{\PaTtT4Pa6\T\\;.(.{鬠bAl(+/M&ƍxBQ f=ƍ(-+L^ŹohSRetz1# `ݤgn5ct1-^DIX裟yNbz%~yS|\r׵ЏߓiR1eVt?88~AcgZŅTC`i]}CmjWZD0IT3k>q/PrIv^ָGʛX'9]|7fEd3y)M^x{aO{F& ˍy;@W+ Lx`j1AQ0z/`~)ybevU%a|sAmקi? \]%w@5 xnnVq gǫtFbK|+_E;tSU<}37g^;2G;bg3̘u/0OǺ6*m)b10c9wk~wFaqƇ2KFry/gX-PZhKzg~ޥҥ2m1lBdgkVCC#»^RydVLLTrjjUB S;ۃk2馣,Dd ZjEPTTo˖}pCF'Lk7oAڋ׶^xoR2[>K!a:I_.Kn~d:iYa~baDlAޚz/ݻ?"6حFa^nE!1\yuhWv&]?YU_3gVE'RlycOҽ#@@Ӻҕ!Ͱqkl$w>]@jhڍy/|a&L B.@_ĹA6+ @p&&ޯg-|Be^t'ǹt&rW~]sS${+ń7/|> ř,9W绷Bi''XjT& r(j#gdQny~=_jr%ޔUN l] G@jG!`]t7iii>+\lk}O{)\r2?P%3pk;>|AV~w6 Ϳ1O E5[ߨ>^푭\pҥK^ݱlˮoҥ+.uT^{}칹oMtq[MB»~C'wd3㎀TV$*A 6/LxQego0<Їߟ~~Ґ@se m`z>]gHELSWrF_\>/x{'ͽ @ H¤ kM%_~)N[X;5-fa1Js|+ |is=mv:)٦(`=ww4(89mtxsWQ=}Aȟ7:2?{0`!&#HQAqFJgV֡ب#PGK8y K!(hTd)3-I}=$ɠ;/ں }L GFvS@X%Ŧ,a%_컨s|ͼv(kKg-8Z95I'Ϸ͊׺ &?Ees]jiE &64&^1cif39S[,-w~xƫFE›}6N_KF'߮ =KB`╛S'F'yx澘y L,1֯^Ƒl6._t"TJykfff`&0rWUkBZ hg BӏϤi ʶ}ݱ~y/:rلG|mG ,]Y1W\*l]Z`%xc'Opun"'mAwuWCzx~4XY *Q"H&Y] w/1>9L 6,]  ƃɐ5x՘k=(W ?gXu߹˷.ubx{{j{_z}2O{#Cާ>/K\04;j]FW,-vXf;,N8NNg-L>_Rk .&`noxu[;NJfgR <.fLy}Pz>WCXŒFF u7E;"7FT'`IVJ?9v]#绚FAl_(/n +pI+:|s'7}E cLqnrʛ3k'v=uB2/F0%۬SWx5 ?蛏q] b&G"P#~3JepǷD^VLd ?bxLi [222Ǔ8gUÑl/}wU$j?䎽:w8ܹ|e?}={ߴ܃|>Ԏvl}F{_S a6e@6*VBB* &^E6QyO4Tѳx̼' %-ɟl@ K"Вop-42 {+]>Oj%~`[8`}3T1S;C &K7KRw d1 Us0%.Tʌ£a3|0w6ϵ5uy$Z%J*T⡑ w4MO9BMh8} @~kk 獺A 63 =&uA^* iؖt^mԎ2xTȎW7{qhr>bp]k3>d >|U]k]*qR}"=r7 ܍We0}}ݕ}p%$=M4{? TvԦ#2)##?tcNO ?w.e?~^r(R49ZG/+-EL~uϑ4_bҚTpÐ̴p2C|ۦ U[GOb"1 k~ሉ/ t| kҼ?jyezb>`3|~hyfrTGB+$of򻯉yO2 B6{Sxlȟ牖>qNny'%-BVRsIQ wQK"`~}V to%BbWb"'>`4\lfp[Lx#M?:`PCL _|V}3kޘnIW/Klf/hfqx&x{ٯu'J!fKߊ#F`K222o?צ3_v٠_k KU%s=A!f_<&mׯ>_;oTp 3"𒮋g,;{s]>y@碛cțO쫲Q:@]MlAu^'NTG[^\q9bڴ6Z6[1@Y9e0$NaУ TZIPjzr$W,2 @ȲIuL/*1>s_,[TD9ZVzTm`B7y xJ}q,qƓ)037+_AڂٟS`~ӵK|/33/7kMPwKxm̒ʟ~k=:Wk%"m rEm!3CKg sf e }$0u3&FTL`x} ~# d6mPOu!IJ'('`2Pkۿ;xs?\Bh؉"cM Xai?>YZHxd08kd yޙ\3i߮u/2A?F>d4*)Taх3*Htj;o' msӀZ^)àG01׆Di5YO,OzAsfee6HKzn}m{kKk_%/~6'S ODTfrD{8?2iڞ&Zjխ /+F#+G3 J=sY}89ӟ~;WkS {w[S!K Cu^BӟJYjY<ܥ3ԖRx ~e0cYkڅ$O$BK" `FzM06. SJ,ҵ`f/#x 6 9w !H#yޯoyr?SXżO ~Bw|Eb}7mf a2^%ظ>3y35>O)i g>K*{0ڀ#Vo}$!IZE )[d:$(N[F ĉu66j29mKdx"D'?o6<4k ?8dLȸé#gL-1`7OJk;mFEGj7l ຽ|ut !2~8q~r[-}0`k˝ܧ=C btU " O_0ԏ50L#k@h1f&D8kږf1J=Sn&ȟydV$. t"4L^  ̢dyfMJj#,xڂ }!]K{`$Ո3?~h6/35n}ֆ/"Fb|ȲŽ{XYoCc8.,4HyӧmJ8Z/%\eRk_LCsO4g>aack2?jɓCoܟZ:Z=<3T0%!͖c ?e-1u06SZ:jY(!Fhۅ-Q4]3l =` @O>) ej|s{:(}HX0"\&P5`AiqnO[Zoo&ӳw_AXzU[80EA=%Pz03J**Idl?[+'Po͛YkYQbmCW1mGn\8QQoJ¡C ۄ^R`c0^X pjIy67 :tcy۳vɷɕ\/KߚI717xE ~MN6Jm * 5܀t p][RZ i]tU[[K/=D鏏hkiW(;j[inֳgh/on4-juvꢢm keJw7Z!% O`$ [Pa* ].Wya&f 6mXlLl}'OY2 Y2iE H5׳R5$5'qWZCi521ɴI!Z$P #H`6}Pڙ 4mA5<3L _TRޝ1cHPJEܐ/D/?>DBt ϐJ!ׂ1@2Qpo/?iH_K뛺ncx{+ׂnO^zmVW0s[nB *̜>f Wa~6>4K&NT-x# iKyKXѢ!3ڶng3LKj/Х nS^U9'>1QeWrEN 7 SLRrcN:&"<m[Dmh;S#QT]0gGXL&0@3Gfѭ^~U\ukVmJ$+p߉=j_S u5o7'z{ U#F~.a3V I ^R cm b#曷=b׊˂T!FQP\(@ڍBS&Y\[ `/Da} @=UnXGM_ 9CGm? m`=L?ldHbq@ykk) 1ֽf6B %#'I(QNBBH"b!L> \|i'!I!.QՔS9#)kсbSMf2:X@Y1b9uk'%ks"Mޥ0!<< BLDX/SN0q$A x>a TLz)Z#@իZ_s{~cw {;05 zC77Y%3xIͧ ԓ2CnR+ \no ؍9ˀfaL߭h'KK97G3a]~vuϯ*dJ6ϝMl@U`7g?7$ \Pt=a@\ @p{I!!NŠеMʝ8]X&yeH2&<Rg> 2it&{yoo-{\:s' bRJ fDJoTqUj7ǚ(TO8x-igxrG8n}1)ey JtnJJ7NPZn>^mWv`%w.GP.æVj MRm-zRZn_N7iλ{'=w\17$8մB5WE@76cgM>a0Jj-{b[(н\o]ND/>}Hܦ .>Md^ BWR8fh/NBKaG6}abK|Q%!-ۨ wʙQKWq1 ⟙hLgxQPZ]GOi`^CO:B\宠[QjV0Q|(3 dgboIWuBWq5@-PKrnR,\\P] ) %C['O΢5G .MS{ߞ24>nAQaq1uǠv<"+6$%5>o/Uc+ 6S 5?kOo>a'@uqY&iw #7vփ7(sXh߽ dl䃯>,sW ~zUH"eX q`qjT%@@E읩mx@C^DBT_< F[(rfYGHYG8!:.)vV>'sAFZjD;'RJN$0(fߊ!Ž)e΢\ee6rf2w00ߪt(3``Iw;+kAfDZJM"eSv.(Y͘vf PEY `vgI_0a]h7AMNI2^Id?9#<~q0$ ԗfviEDW_sLK 3 Bۂ{ .Ⴉ-)=uK&敨Oo ]"-fV(9AJfJQ 7e&ܜbAVjҬEY Oe$3Z 3-OʛGGMύ#mK/ nC{=h[P4QR I Az͙1O˼%-s_s.;iO^Jk1Ɫ7ũW?Zax{ o;JKl93__ vK16"ĆqQ0 ='aT. qlav΁ vTBDc #!H]f%@|ʽ,eԥK [I^`gL\e{&9kߢ&yQ^㧭n3bqn,.yEp6i_ Uݞ ,ݠ܏x@O%PÏ-&{I*iZH=;|D/V]ǘ=SWXIx#Te TMz0*֋FƷw< B]TXm0U"a3CL'*f'?jp=eZ Yzy;+K(!t(Bn^]5P?F|z/&ɅZJ?Ocdq>[5S j}f뒆a$ 8!Yԁ@}` n핊o= wYb;YI3H @KOB X@d E&;F=& <1G[4޿pᯞZ= D#@ DAʅkӟ~ -.^}iV֯擉w1D}DLӟL,؅+%7XgE7ޤy70y(CIQGy5)⑩ ˽(H1# _X(n3?&5#4AUN@4gv0c[?~w4ޘk'!6sVq'L!QFbfTn;bxsx*x[@Ks"Is$c Pm[DJ*\}Q:3$zuhUQA 9 !PXzUaud3 (XB7b% ǨH(Vf rW;V0PdKbeAn)qö00wx<[U@(u5?=9k.u;uZ8 {9 .-0D^FyC>~TfܨQ#ըxGVY2H(7mI&@pQB'{Hͽib!+L&0cM\4JRr@iC zs>,ыAN`ҥyrNط/r0~-wԆv~մ-hłhMʀe_Sm`?wр(+3>p$l֐ 7CAjI6[~Ж ;P0iLR[u:L8 A?(c)^U ,:4FY,] ɔ%ɐh9J 6醤 N1vL \-빠_6xbpw"r@IOȬ2s$|A0P.`xq:QF, ,5jx}+P F1DuBunB]mOt =K.Δ{eSQ\Hu8K]noIjӇS3OH<)'{OF͊<K3F$T}gXeZWf 2N4I0%! u=FyBCPujiVa6V~ _gOċ'2p]^! S]1P.Ze`="У]B qa(wy ˿?[\-pL'@ O77$E`DZmd_s}svGٞF`ѲpiUe:&=qS[ i>X=i5UWOn2X鼛qVgV!o`PU=!^à;ru~īc,.hqtW7D8.n"= Z4 I fA$#5 ~<̘1$ 5^*Z9ZfoLmE-۪\l@oPm $b+_'SAMڝ%"O]nJMg߳'X䳞#(F7lk:\IQ]8C>A2^A=u ?#E1֨@Z Rn0 xr?Sj&s`0z_sg*yF$+0*~P97oJ}J:l*blHz.hIA ^6zQ@V6ZcƓ)ulDO 0%$!!WASbKxO{ܰ_8=;ܴ9d2AC!Ya GXMpk^i`QA:!A@uLPJ6Q)E E8&䗔@mh;yV?TxE@0H-pwE] /G|W(+ )GoåwYC5fQkk_n-+Ka3 6]lXX{כߺ 5MBY\R\/I :uP3&wX7 K(P!ڵrг8,=`0?O]",ҕ :zQ' |0@&\k5FܫU> fck>mYѲޙe-.B;KxӟL̉cbuU)͢}g+;ډcӟLk -ꝨUSz: dli|˓C֋G ˉ .&:2i}:+~U0H= sf0,R(4&?s]DT>CJ=Б۴[=uzo]F;uw! f~,SHVMY+v0*DC|v$E@A>Up!so|Yf\=B~ ڭR z 0 3\LO|L_Y |oDtJg F!  [ @fbXtx * b<@~e+%N{-p_MD5)I'c&c`~c ߃4f5gFk77>usCǐCHg])>^ wsɬkۏ㟢l.cSƠ#rl_Pwhw(9tO>U`9D`fuk[m@U6= χ}|d!\1vmp{j^߶Ε Z{^lY^ [=9v05 "$QO^:}!'b։!woRM&:VV(iTAT,+R>oQk9<>̫P5 Ie_g}d3!h,W~(m`N-<>(M 0mG{~Y@&JFڡs̏|bgS !FӲn5-ӝs[ï^(Y tf`2hQŶM>40hEHs͂mՉϗ˸Em UR). |N1'!*l| ]} #ӧqP1Ii-qmBڰ`zݽcڔPօPuy ?sD4Վ7<9ţRCjSqШu25 Ç^f7&rLvn-?NUK F 1 ~I[د[snI\e9gfjC[K(7/fyOi@8 [ѷ`&r*qBYf+ ΪBL`*9րDy)G>6/CdXC@b& -Y{MK q2/e1Ja@)Fʞ9d *eN%3[rͻ}pnjW5Pu*/sv8#@tWN$o P2|$o3z$!t@g>m=/_.BKK8\ƺ".ub<$ "c׹ Lm֣ K*ۃ=GsbGۋ0GU27 5 @g\j®1c_Җ-JlXLخVWױsjT|`[ )?rs?P Tkp)W"HUli}r6I |EȐ.y245IeOt+&@H!3y}c/.f]͝|Êzym@`y ɾozy$a&_৉dByiLhLH@NC`uhEX F2}Rc#\\/HW AJ\JbX'Ky5ow̝ٙÈRʨPVVB Cyu!A8Ȓ9> $`(` 4t / R`prP72/dggIR~NIC*jb $=gVVMf@NrNR/Դ?4- ĊJR0M}M(U/񼬆](ysaHEY&#I)! t % ҇;c%i3X(  +_CjUkI%3r}0 Bpkp[%?&1"G7aY# P$ҵrn >18̏-ck6|R0{r ϑʲ([I mhgF&DD6j,ܽwѪ |Nx@G[ ~Q{r>xXW:\҇.8F۳.R _e 'ƑKT@(j"W'$Dta)cRKAn`&B ff /L~,_l19+z}_/߁?-3 ̑`X`HƋRrO箧=^imtUf10X4ǞpSS} Lf8J&Lon;na⓪(T]C'=.O_F 짨%79yڰZkN9n26lt,Zk3ހgf7 hNYcYYKN&p݀!5ght5'wte`ߵ'+4{P zQYiRnrhk~V/ث&CB렬;rSu}>:gpY#(7RbL;+M:3?l\u~}Ay=<1,eZ֯O6իhcsg7t th+ϙD/7N 3:aalɏ~m8& @%{)<9&.)ʀ)Z~`H/A ba8^-)(kӠY]J( nFH"MN P΄j hZfU"A_UՍYw.4HinqbnW`{Q+G3{C!A޿A.?8;c}k~F6VFNW#d W+NË3ЎNRb%㢻ZDd ndQحեv=%ahpA;ح Sj, -5`L'C 9{~"T IbynNA%ax=TQ7|Ckcq*qu QŇ<_8]f>ϭ0 ?:>Js˞x+}d׃G$1$K6T+gu*WRzN&H0RJW-zQڹFMirBm7F/B&6Et-e':NxQٜJ'H9qLcCkViGFDO!, U4󉴦=^Z6~XKm [HN2%cnH]5L0xϨXʀI EJ7D="niK0zΥ)'zzޟ2){!_;J sq> Z߿~GaJZLݐ4  7?ܽ% Qu91d-]߳azMvŌ[pw _۫5B uW-2tOvXp*nfU9]YPZ܂H:*<:+\Le_L6( #YW{[oCG2wv'87AC:6PP(_hv"U&WO|KM*g54͙?cnJA:!9ZfN6*FMA &TZ=Ԣ|%]K)c.c.3EV&2H.R"*ag +Š<jC;+`Jɀnnf7AYGl,:]#.4pGְB!oiY8Ys4ZڰF&Aޟe.9ZWӟJy`%;ˤVš>uuce 9d4t)aݥAJfG5=ݬH'b~~a32;aCeXZN'WE- 'z8XaG%K%Rk]t-WLېތka]UZ5߹[!e B_Xʵv~ $~)Ze1b*ɢ{1PLQh`Y1ѱ av/spJ[\nǵBN(**‘;V|w}ADzazB/F♶}>.C{[4B jU %,ԆynwRIU]u_> fg*H@{ts[C\G*@pGQmHwF^iƖQ !&ͅ`x>ˇ0CUhs:zg߿_LnA $-V;]?wܻ| 4p弒fcZE'Ig9ZyŒLJwee~w=Ye=~+]}ĉk|Cs0ĉ[' xԭBWnYXVM[ĎkPGY*h>k!h- E/wQ1ZFCtY!#u#"'_g+1TWoҨi:ܰ(00|Dž~0t~rYu&#RkUG,^h@| "uGm{z:Gh5z D g7?-X?$GH/T4$*~ LNKJyڭWF@Glmt-7n޻F3'v=9M& ]0g0C]ݨ|eױ{[ߖ9&tbq3b&/ze7"M;J6Z;u,2bIOqζD'E h68**Eo'Oe@y֯{?H bKV:|lw(p$>3+#qR@+kPEշO[Z=O3O;cƐPM|9V~NW ^֜{z-_~vM>6:ykW!iT`U>Cļ\>oMxOa魯w0uw(c^mm B/9dƊͣI+ ymfi7 L8Qi5HrYQıjm !ydxt{`їKA7nky 4[F  /o')?opSD@RxxNR|_r8 M*"Lݙi8pZ{S2u>`6?i( B1ײU-1&N5A${}_ܵ`ss':#k"fUhB8p0 8+C\O)i S[QPQD}jۛj3cJwy/@MutS+q4A`!1[ʩ r$ռNϻ];7֑; dHn,ç7\|yg@dlE*؎F곉-+W$h&v_H} ~j0Wko_mPũ\?77bp̠UGCG8 ;FY|Vo{ C(-)@z/{x!CBw7= Bmv.,1#H,=>gqAϡBr:@-A0p0`\m𸍷g}痁h G M(؆)2=e}q}|sro06uv3}(ġ[{4n}ն08'ĸ𜳤-kߞlwG^\9a`e`=|ܔ6H3ufgɿ!\ Gi{W\`Iz x}`$`ȳ@eҡ§li-VN5'5ׯ9z<![mLY‡}9Wx0tS9{W<{IlR>Ѯ/k4a|9Tf~A&o=kZ^hSg"aQbi$"ҥSG2Nj#3+^I=R?fGyJAj)+OkG"պNWſh)<7.:%_&౿j|tub஠Ɨ}-ct߷ LkZ ]m}VԮDzN`1/@3Cƶqm%{Cw|CFF }l##4Hz 2ы+pPp%SL8S: Fz "jc WCU H ^M+?jNsO<EFqcӡ} @ Z,*mٯVLfL:4f75o*vo|tgEԽcZs.}믟l~K|: TeP/~Y0cPG'>R>ۂY@}\3\GG[KԳaX"@ #v+`Arj9z&% M Hg{inj*Mc6P%(UT6f[X2qmSyNOO+^[Š}qѶuwh5 5IIG8.dh͌FՈE?Rc+//O5!""a2w%yn:"5xpL>.37ٷCArq׋>e sEOY c*/ʊwf z8#+\)S~0.g_j\f>a.3+_}l fB+pOUq *ĨKi2M_[ul;GVPl]ꭣG5|pSD\1F1u@u @(d6H(0P#.od a_o`WV։ p!%O4mQZ]$ *(m陡y. yC@Nnk8R 0nxtmqa6q3VOcIl>+^euPJ _<[o " 2 3/Y2<`f2Exβ_6i|yM=+ MlD m:d 0KHriSm/whlt 9BHdn^8@'OLԃ䯦dnz+ۮC~ \~ݗ2u} HcAcP<]y$ υ ^>|g6ԱxT| >mzzsdڄXl>xQRR![B,h9Ae%m}<2ut"&V`6=>B[ǎ2xؔ9+T1B_Ù9DG`j_wQr&N@$:*$:zi#t|zث3Z;=Ǡ/#}}QG_y_vzֱKl} u1X]n+;6.PG$!hootߘ˛żrq&y͈+čfԷovQB_0!ҹ+mۣl(Ќ VRT0 ]-}y_'qșivf O1*%CUk P-hH`%ʏ(jxd#>xz 3ˍpNo;bº6dRΈZ)?|.׳- @̡Q'72+\>8~Tr9 Rs콭G.{yeF I Hywy#\ `a64M< ,P eB:*hDX>IA(0XBQ+CNpϙ xEp j.@@VJk+@(Wedqs >RG0A[4̠;޺z;? BKV0@ Y)0,up9@Og XaL߭h'KKV¹i=L 0%< Z[ތ3bC 6}[Xu:1ԍ -|=10$ɤpyAMyUck+VA Z(&%y̡Zm!&Ձ@u?a4Lefzu|A&4ueөu2?# Q|5,pe]# ` @)3}y~{$NHRuY 4bʄ0b/ X :}gFF*#̏3q"l0ç/F&%@Ea2*Qh[lϐ鴄* Pg\бHz&QBʟUj٪J}aؽ{E@J*c0нpV`za㣍tGo_nV#0ۇP ;-4Vja ;/꾯@PK 7Q^E 등zBN|8^֧X{SYS"fӟ["ӐLyE7ƭ;vYY ״8tvap!nsI^i5 Pz~X!;L |-t%%wޙC||BQDJK}^OIhD\+#0E%`fvC'%%%X.Q"%cA 8{ZV?aȱB:-SkV/[,"޿^u̿0ed婍q`Ԡ@h8\{v(]&BѕV8/lH_V8v@מ*T?һ#, ]Ϫ»aPE8sڅ 6:ѡ ɢ :d0t QrQ~H^\R1QdWph̅#X?*WEW #h;S8W%bsB-h:BŃ5 3m>|Iu];^.m:X7n<@-{cg0e8t=A" H. ݹ (l7@ f|0vCؼChճGDd1<Q(z"KfXK0}x Xy*t-0K#`KLe*#G  @6VlPL5h 'txwm2^0 @[Jyum{^ccV/pvM^z`w:'}zzΓ¯'A>Q:=p;_b݆},dFI1$%t `2/L*-N7j| ~u rDK"l_6G[N*&e"ajhq533 QTX fd*sF%ticd g1qc_mk2z3USvŃ]Y;4jt%"⹤yo([CzOf@/1#5mcjs};U`N߇"(f3uP[ˍ22֘^m[PLM7 o8Q @'3"#9*[13' :Iu հ&p<=T<&w%(_1 a/{ŖQ]@AU <ft`TH :/ű#py UbzNX-KjLyzd.68{ξ&p,@7nPDy;h<6U&NL39x{IaDkx)3ij܆ SJ!A؊.kSC~&ۋnE5 ڶo0䟫"nV< $MVlD/ovp@K 2qZB~[B `~7В!Bw=8cK"[-.Å_V"av2[=n`Ub33z0F98z8t?60AjK2Yyel®fl 0{P$PZ\c"8;Y)-*=~ޙ}dɒf%>E(jXî>ld;G#Dv7Vv` 7zAWù6pY3eň,)y%((dn&el ]Z=8qk+^0cGxuv!-D"2E W0 UrRA&Q+ʮ632:$ `FH?tJdlNa}*$1f 1BFZh"#5UeȫV-{)A q٪t8+ " i0[nhցqVl ]!Q۹gZξvF v0,@_>H*UmJa6]Cp! **pJ-u>^nx&TIz@Zե^}ӢT"@^Jʸp..`{O[u}<ܡν6o/ۊsfmQJj"XӳAv9[{yr߁d$>a# pHhd`b pYZeCKn_<$.%nw\?ϕ<5@ʕCy@*]'`S6{!DIgB{O;2 fvǀZ3 `(g׶x>4Nu*J6޼ Z=? O|̆-a^ p7"@u'Snض{q-|~ſ֫ E)%'=n/ pn[F&PMh0cQgOyc(89N --Ag|MNBlbo>y6rb("LʰBaq<-***c*8NDdSHzpΟzE{\rD&k+߁#G7V=_  ojHL[mG`[6iM*Ӵ<6<6fEo| # ~}jdlVB.͐ "t5 ROi H<"#I PqQCܧ*s> HpǕB!X2RC ܀ ע/&D\}J) YH}Ό)def_lJȋ, l!*66wrڷ**vOKYۗ؋$+zNpM^V5` *"~vþQ-0~jG3Oȯ  0,pX뮀;;Up„9 R'>3 @DqRTܓ 00A2bQQyװkvͺΚu ku]sƬ (H9 LΡcuUG{ztשS{间=d@?qI n:cܷj:1cνalzkp~Oh,;l ;rM$|e"ٚ1I0{Ef`!E8>$V}M 4@[$sO<5n_;kjI&D.&$صLDϠX1Cq:ɠP փKO ntiQ)Lzs9?b{P r"MQfh:iXrҦ_^I?WvՆdTȸ:{y +Q [zxTs0ȞV.Lk>亿 hc 'BƤ<4HXuv- ´Z<)cj@p &qJ2\H@_H[lI1qQr [ޙߟ($ ${zzqcኛ`CP1 U("n!$wlC_ṟ}n Z  wU,nl·8ɩ 9-36aڃ]a /Vj +;bSnvv e@ *s[ wwvR+n Ц.7i|h6/}Ӿ E;WyYju[Wm=?o`o,q7al7ktƒebĐi|Iv0~ASp<@= Le]LW@d_ @K o011Disjp" \ >0XvhC`:t>cfhU ` kEQT(G;<RRT!F;F,^eTĥ*vLup0d 9yiPRso)\mW:E]ya,U\ԥ,ف ^c]!.x0,i50@!チ ʰand `5 n oCI,VݾHȂY[ݒ$wʙH㭨|nBMIe[vIP@DEI)GLq բz?lN> dK>h˒hl<#(q@47ć qeDR!(&k+E0c5*Ph|dK8{ N8PKi oyC]zWx z]0m+&c݋jaM(K J D%}梂576ɃץWqiüm,v:؈Yc䖹_@Abv_u [r_6r=GagAv.#~)giy%lRqB@(W_o #:+6®!N${lEeU K|N@m՟'rKVb|@n86J!n}YC6KpD*r\=w:,)--M iE,ӂ$¾rGx]%f5OZ> ' 0 "P F&Ag_ ꏘ=?PYv[K8Ю = ]1yyY{ HV){suB%+}d$/?Zp n?5nvލz#SFv5c#7?gJk\2~-*Z=DEAiRmiHT'NEM˲zOش{ |F6HD2bPD FH@G3(ol0s"_K2jo$UsdvToc@D ף/eBt0 //^fYfxZ{MX;_.S9‚H ?&PvCutȴ8؎*,]ca ~XIb;>mH{|s=S;NK,Nb`4zkKҰXTPl;3{VcloFu `96=4owk(܉qyaᰁ@v)4790ʍ˷^Z2<@ mS7p ]ÏDo-D/=~E[@Ԏ[S ʘ^pԳtf/q4E#,`v-bsc5-)-IҒf_̊RCDoة+#McpNEU :tt {3C+lT)€!ABƜh'7Cߴ]3|Pq*mc`R`ڗZ"dg"1!jO߹e74V!DI !l022?:6R+ZkSznB"?-BChm@VxA6›7|k16"хF 73HNw4VAh!$Bf3eFo!\͌Fለh ȑj_}  ;qXk$L*jF(J{ uX8,Ҭ bQ"_fCM=_#߽qnA`m']5ރl&pFMl6(C ;?ױ ǃ@F9ZŔlHʶ4L,cf\$ F(ȨZC=j‚# uviN5 30Nsq" } b,`sC{_-bɦh%ђN䤜%K7oC6NJxqbDBbb_l xc$_q-̮93(.֨]O9.u'[K]Avǖ eX"&,݄0 a4sO1dȬ&S<¹=n,ŭ}n"A0 6\dqlOQzhi%C^7jX/|&9AU.hh7eG-ФڲfB9f.+>cTC싽7 aBjx1_b8gȼ\-Kwnlg#ݾn9²BH? IH:.QTTI,)>%Ikvn5e TZ=_?GːyHpnwʝ=GMlji1݃EfKyƂKp̀߁9YC& c؀wc!s`<.CCM09Z%[[RfzCzh`9*JYu%0X²,!1aY Âa+?ګ=#hftqHt ޒXnZ1q/8ig:崜 >v\u*>G1h̷ۙ2%NU|c,1nH@6jcjOۅ{l~IZ(l1q2\\6Ny'1 2.=K~УOY1%$b Ԩ>d ,tB?įj!-?|~u,QA7!P  'Xz'}ݒ:fa_P̌[Fb]_0"0;dF`c.y"btXYOwqGEObGZ*>_-#"5(*ԁwr-`,U!4)!K6?~m9/6\(քo'ݎ8It3yk;dE*g30$e85٫dus@JґVcz_,/;-xAʤv:X綘3Kz6iYn~CO_\Žn%Uh$ǀŤRg!tEx7 %ŀUA 3ʑjHaHA[]:~ `|o6Q0.\s@_b}]߯;g"lip 1nGN>}qbM3,<auYw9kQa#m^e+]&要xfw":a s.YSwt7FݗzSN|p|,dX@'ܩ|KNFZm߿m얙G&i& ѻ@GRڳW#=iFΪ&Ss}!ݿ}jiՎ ~jwtdc0m; {dvs g3RG=ڠPLNO!3hDt_.P]wF ]"l<}/n/62@ g?Q{Xu`pɳ(J5e`Z!zU>N觘xc7GU[3Oi5JWU‚|$G̬F Xlt+M cz/M¸ (v"l oO 8^J9RAR FdKst.%f/ۙw xYNehǴ}W0)TIC7+ B8?vۮ !5u?MǎkRIߡr Ykj;}rhMV1Qa!V>4{N+1b ,ٳ]!uzu*O ~E=Ojj\Mղ&`ָUYė}==M/I=G3( E:HU-}apȡ/eLj9pS&3[ Zٳu3[}jqxZY0+z+U\H.Q!?]]r3~¾-iCI*gH@(@R%Mݒ=YR1POL[iZe|[sXg0cpP͠-Ԓ=N<"Wtb> AHv:Bd ld/gYyύc^Џ i[? Wx LkgSb3aulϠ,0gӔ$ 8[̆ZxôMwPZ<&hYIR2O<;a揣'+d?NIBIr'pwLla{âB5-j+޹Y:)h3{b\?wRjaHN$>[T0a!LaiEMo8 oN/mz/S RIojEj3 {9@ ¢]c?V!D{7?1Gݶwzz~?G q ߃C%7Pfӄ$fzr;bCs%7^ʳr} i+t@wj4ߪf?o~9)ΩɴjBNx@Lcν~KY|0X @R$CG[I ,T\17z2G>YI02(3z ϙйӐ'gb^9jw^n& ҊPR4D{ODXXҲL||- $Oa=c߰~ ]IUs>>zX(O[]&=`("U0Xa Ba7kSo+t2Zk)[N~ =3崳6xN<݆),(P\ &U?6^xx@&yWƺwxYMy?l &Įux >?y[XoråZHrکqpj&Qsa_SU<Բ 6K >8Ht\_oTD!mͻɌՁr s; R!>9"{kȯrܰ^ݏ.&vGij8HD ׍CfVj\dхHʡu3o `5O꘢A ,?qajw q`̎u<g;|2C5?u]RqI+8:M~$'AA6PW 5Īʔ4ᭋ{23e,{> 1  %F,-EEW+>G}Q"))  Jfn+4,r- p(3`GeUo%2H^r׸Tb!*>桍;bqW8֣ҠءxL#J(#:e{иggODt9{#[F' ?gXi՝v޷4'rϹOھj݋e yUȚqQ+2B Ar<(ot\4YyHxd](f׽%}xg_ĚbQF XmD"\Ϗ<&8HebCUvLPƤף.dC͜M-!#S54/*І1x7;a3Vja*0MYi_ŕvbx45/4ˠ{\mq̄V})6JW0iVٵ׏ f\\.RΰTi,=3/M O.4]mHr I|rСVnm+w7飶JUxJ!u_@EURPU5uMHIP~NPQ3)NƧn)zꭧ솉=^ RȬdh{ hv奢 #C95a w]@A/IE%fϞXv͘7zwѦ07YB_9 w@'#/Bqԙ.O|˴⹫ǘț)鞌`@GUE\N.@~$7j0- .몯.<fCnˇ.<눮r#"n ;: MDi$'%e``;b^ )jbL{@rB^5qx;t/*, ,o 7ś]TXq p)Kl鮱7uo53NUӲҘ[Hؓ8 f#-? P=wL]%x_:3 o5o[BDLEbPs*e~З)i27@ զ?WX T#SA#>J+{Ⱦķg!ם3& R Euatij/n),f[ھMovg!`Ǖc@!ƐD?eDUfB\تZCD#|_  (iy{:b$[pZ6D8]͎ @XSn{#eu):T,B}1<njPHU"X%p̃ / %'XਰpjipۆCj}˯oJtljJQ,2ŁW|K@~LC"[HL&@ ͦ* HcX2t N$‡/ҩEExЍO:)j$d_8-#>E,ԃ-` V V#RS ŝLt*JmO|)?0h#omUSFHf_}²Np3 /<{moB(zIv;s}.2pUa9o%-7HYEYE\7.d?ީjOydkЭf(_^tt3HkaJ1lB >H35/Hڨ^<ײs׮J7r?ܶ]2aiq1L)ݾL.C`9 "@Ɉ1T*O+B!n -d   2&9\Ì\#D7H\ootׁ/C{xm܁ͻj蔋 \-},JxNsBGRXH&ZXvɾ8OI<ӛG~= '0ͳg) >@11DG_=4W,,y~OQA4,ŀaٶPcS\^QmhW恪naٷnF7D'aSNUH2n|J S8`U֊4H"DM*+5lDN`$ ̔avp#¡dLVAaU6eQp%ţ@96o&3IDK}T#HeH_feTX0܄撬UEli $4(<%'5a(Cft~Ui. 8lCպ U|'<,xrtkvXRldGEw h%odJ 7x,4VS ~cp=lgUAMJǔX;E9&) Hw DڂE w"4:$SOcn][Vnܿ%%U_*b"pat lM8:?nBf,`"C ${gUSTHK6P ]`s(,Ҵv\xiYعO*ȅg''|U4:&?RqC]v;X*[ BҹxyxHyّI[]وCQFZFf.1wliUGozH^yG[k85,`SǑЉS\4k44Haw0^pDh-6"R `5RHHzKGRW:'*+;SR[).ݴIJmnH>bzUcAymvu5-'k 46yg#p g׈gfRU#lrϪU g_?Őoa@NWDf}MO =  &3yHi;+_lߔҺ:p' 8㦕ʋ=2Ʋ@muK%} Ȕe.dYсlt`&م2,f,0`DrDL&DB"Tnpja @ԗ/e}p6+JJ8 T}-7= lX .oH ~z zǚhR9:|78go7 J>̟?iBvՍ^>i7%{I ǀ4np`5@Nf2"IqO;زi%4)I^Z/73>؊(> peUM5+ټia7U!P#bUd?yu}4z(׷dnw>?NQWp9tt;/%Ώ>ϐڵu׍LUvnT2Mzpa[29{ ڐ.&KjIP@G| ~SfSt 萅穰Ϻl*FUe">g?Eg=|8XoDɘ!19Ą] خjTi«& |XD8MXI.ތO?W1htLDC%ZcN`1 bL xgC@J4rP5ˉiǂmNXE` Rq ЬDJ@KGѨۺdমnxiXo·kxzH]&f1GH*[FvdwߍaVc 7q̼p(ζn>2ѧ9'x+\ 5~ZtW2a、 3s^J8y2zySl}%5'UW$zu3zD+M鷱]6pr=f}%1 DE2PJn: &Y(ߢGUস3F,W Hm @2` O"xr] .[^ff i7!81j(Ӣu) It-=.JۀTy1ڿBMi+W 845a @~w\/;n>eaAD Y̒2S}d'F_C%Ct[Ĝ:"(f aѼE&ޣ7zvup"LcjVjFwrBLF?~ܹ#nkƍC~D6.4 ѻT1luDwifS 603T ! etNJKbq ˆd/G/:s]|6(q-34.FSYWlkcS<KZ^ޭeIm1Օ (]?!37uYޜ.j(aSkAm[<X~\KѸwS0 =,gG?Ҿ̬ g ,_9 恖U~o48r vD7ۑ+1˟xsvioxlZ5U|cw r R^,z"D'={Rwƙ?)"[tJC,< p7Ϛz3,emwҋ֦\j)v}?JF!O8]+ڽ 0}#RJ 5,,?ꫜHjK #=tjPld<.U_3~̙W9e:N+C4ME7wkf*\l0W dSHKA8* b*D i׌R.7iN"R?OќġΦm%p\U)9@c܍;g'5?P}#Р>ih8hB`I)d *B a%2\cIԊ]1Ɨɣ /o5]BhQcaer5Tkj. r@j|<2NsF”$aA6'hp1l\KAy*.~Guu]{U*f8I(7vbjd_mݢdމkOFد(fn(wCVj~Fvq˅ 2 [ d+\Q斯a}ڰ wawezWWs{s<}ѿkʊ=$g2NDa(ɜzi{ݺndd@V#l_/5ieT槢4',UIACEeЁ=^,/Mŧ;5CCQa "E֣I! `"\h%$ $P7dX Q<eۤ- 3(JCxT5P >y6A +P%1Pl,M݈c2n "^YC"ja ;wNe$}(By^ŋcNyi>ԥ8,+d6("^OsXpظe-O`(M#/_s0t"{R-jUS$P[`kz)=mu#J/ߟB  y`Ok΀ d.)M_O@,1({( #Q{NX0(ywS=_!^;}`fXD7MayQ_phvcz!P;*"zhwyS*mCȩ۷&d*YU5ڴͦɽ ??p85,oBP\T) 'DaFKΝ=[ߨ鵐B^B!Ʒ{p=͒twԋ{}O cJ/j`~BX œA3Uݚڻ TtᡖVm}Sfrb\>eXJo5#oLRn!c\67XxDMoD8KǀICXާk]^qع-|f7exo>$V)˾څoXaA}y Avw7ow3}RHtJL3Q"s|, {FI`7"dWQs^pƊeȄehȐ@h %ɂү!`buqªlLH^)k|e"vp1)d|f74UÞmXv$D0B:#ؚCJ4%'iߊm Dxu%Т8;a Ax~ 1amZ-84ư_&ܞNp{  !ӮpE2TJF;O M/ϱ)4 Kb.Wk;1@=9"+ " coaZ,v,<2& Ơ]heC^c-\n`\}Y:KCPIbنjE@4 |D e1Aq.Vؐd֡BiHkī^(f8ھt LBc]#⡨mmrk;) )8 OHxFhf}w~e_e~D0O?2%Evm-71zB-PDtLlNYw--dcU?,_9ضΆ lv ]eÑpo>uݼQN lj%r ="`¨i#RS  PlPTg]({{`bAZة5dw pLյv[~3$IDATU544_-ry͘_WPݠWHi]5[Z뤵1E=gvM8pt4eϴϷBq8HJ֞WH]9JK]0tlN8U]>vG3  TA(Sbd F?- z>iƸ(#z `Mk[e`PSA+#Ea?tXE?>:ٻ;ʰx~6 I MUu_H3r1dۜ[s fH#uNA0 )fMlGvx3b^? .y+Qr@tmoЈѺa~ "C!Vσsa?8k+ 75͛n1ÌX#$8t9QWGB u$T46d-_qÿ3 7VdӴn=N#ap$@Wsz!rz,UUArZ煖0Lx⢓bwlu"Yw^*Y}:,GpiЬ9ISp(("Ci wR^.@>7jJ&d=%sjJC +}u ;SVopf K抺,vAۡ`t`z=XË!׈ve@߷ͥLÎ ۝2}~$d&%47 O#|CM gry] ]*c_\ĭrD=Ž"^ τ%*@.ZWM8Α[hi8JRᮐo8"Xc*@XF$ ;ɵ-'SecE NvcA4 4H.Pa!AHSPڟ~I! ,N"5{j]x z8tGdG4=CqؐԜ\m@uqtkܮns %t l=V_ kݰ#^;S'_'L~~];.k7xQ|Sp'wu7ܔؿ +''7Ui,mWeV(OKIH!GL;P@0 ]Ejq`NEH>@p@Z AkF,]OQMc~"(8rC"Ph=}`0j:_:DoM 6hwuM1' t)8h1/.ށ b&=G7@NE^XYPUM:"0 ˰`Y@In03n;h|Aֲ.p,E{w`QYiC2+I)ͲWoؽe$N,+6N;-U FKe3NԮ00e3Į2n1LMSp85no{$4o43m&PPK1Γ`PDžHX^R@DM}dmźݕSky} rJ   [cE߇򯿀6RiC{!U76pŐʗm^u;MB;fxa}V;'^)#P^â4KGɦr_FDdF #y1KZ!;sX>l l#S !EJ 'vE @TJ%2,邱 \< l[e~l{.Mp4ʌnK£W4E߲}idZ M/lU{ʟ-sg S .d6@yjŨQa6DpBC[?sJmQ>_ a`S9c@A7,z7"p}&AתbBIfah;D/X3=_r P[[et.Z6XLHULJt{5UM903NSJ4ֵ.> Ǘ? ݏAZ7~'p4tpKw!><''}8,XmLXd)`;3?uKi} `_̊'yUT>`ed'oNI]۶VD;{M~ަ@2V3* MJQ'ڵ6Eb\p.Z4Mmy;|3!PJ"XkF7)\IH2Jz>,aZ"@T w_4k.0.l(ۼ,qkܱ556lR>lJDiŮlF~}%+8["u#)Ky' }fWqiU|x_^F|#Oށ$υ4LGcM媦T"+xPհj1d;kYpDoa?61 LhAN&"DfG |;|zXzƄ=0vE #2 4U#PR4 @Qu"v{n*i?zLk ^~TD;c!#0'=,h?:WRo^g=%a?M+p$T˄f#|>r;=퐶oQtA<M?A͚z{~y!4'( 7!TQ ra4Cǁ$ؖ1N}!#!U a)ƬtL! )H 0-yܿ>xqO!!G vBB\ 4~~ZɌ0{>&ƌ ʼno6cN(AJ%Q[Cb. hg|%*Y-̒/~I`7n?H?nd |VoKLÌR0* -hx]qIJ+Q: ?-+K:hKV8 U2T)L9+_P5 0M\gӊ9ӧn_sO#8'Kd d=8m9`UDȷGb9SDYEc7ULl*wlCTl~ (aFFڧx|FrctmPacWjv{֎5qL%ƧO#ވwĝ&Mj|f;,kdM򸁋8bVaҌ e&MXUeɨ;0w:r"~a`5 R~I: _eWSMkĞ_{K P#:ateK"N>`_hfedK{spXpGp Z?[+;p$AI01lFIgt31;-Nw}3 4~dRpuІdB672XQ=|kƱ#GvzY"# D90aW>"EaXM50kJ#U3ܙTͦ\ޑx =*ʀ5aظiB!))ɷ'.,i I9LTΤ+N$Rré!UHNB 5׃ YN /6[ 4\qY9+|rqkd$eJ8ݝ=Ѻ֠?`)awwj4YW-_X~,*]:iӊ;ǥF&hNbfgx]?kp ԉHXlӵm){…Lj>̦퀌 I~pEfVq+yU'X!Jq@1J(V-ڏ_#Z OF[TQ{8)ӗqןϊHl; Z{Rkg->9.3Ah6<˸ ŻrFDblic 7.w,6V#\]_ ~瓻:+-'&ScD\9@ F =I'RIshK[,ٮ[% k(u(NK0_ K}HD.Xft\7`]HJLܗQD3l7qzi*B &6{tn]詷޷?z?9O8BQy],}_~ TlڈCCM' 1,k`lf_tQ7/U [=*,I E$E,rA*7j я>{7.be 8DzcRj-%v%4zӇg-;%UhUvQS@]W}7?_$n e drsf]7y=DžW ďF"!e! zrxr+Nl.v:6l~?-GHtE$7c[XNᶺJMZQ&=Mq-63 ='N%*u?\{kh e=vuj;ݠLGO`*(ufGv5jҌ'7v5?)H9ZjhNvwF'LeHAh /G} wm;w;/L_ fZB_O5w=kۗ'\=G_Nc.,,?p\ bS!뮾'|=uu ;^4Ma WHN5W/"qwDRD,_9s Z-;EG90~n3s`u۷-_>WZN~7DȷXA-"`0֑2JB)U;Vbw &|.H̟zü_~,*,P5!MسSUAMlHl]llFDlqؕ'MMPV,0IAwҴu+w|6v^ փЁ^,7Ë-vpk*v3AFJ\K5qXZC 449 ؕ&5vMAWmG[q}!'>c - f8<٧qZ<y<@ 5`^I47C\  36gO;)⧝ [qoL(5 99;xd:fԮƧJi3P]I Wʩ=F57hZ|l>܍+hj #"p3'#R5(0 [(xW: !BÎ$NgшP#& @ Xn*yk7v5׍}7@1B7I_X"D7A {BpDɀxE2lյ8aA08 |JQ*XLx u) 3ߵ{+'B:+V(شO}*SEa\:DDo}I=}-H{X)/mc 5!JAkp$|Ic_!%9@h C{nPRw8m-˄߸-Ԥs;~r"NHLsڵ ~ NmWv_z}AMc8lo"f!x;䀴Ʈ#݊)UHܹ33AO1H73%wȋwEz/ÄNM;w' AoX[N-5?;8IOIYR0'R^^q u?υ[gW. 8pγPmD.:bnjX|||1*18 8>ifeHuKNofP/ax4.L'[;?r! @,=3_sibd“/-v%[w~wڬ2X4,zwU 0SuL}v/N,7eX&f'ܵ>,|O\GJ|2BVmRUէz{;Vzn0Uxq:fan$nx>3[`9[B(fb7"=^[*φb#}z)HhOu(90>_F8GcC v{z{h[XE8 cNk@X7llBwfq'I[p7@Ù0]1wĠXia!d•>Bs9HVSӣA&19)$pRe[XX.Cn؄%N҄ >u~# ~J+5١ؖSw\W-n݈,-Bt\X(yv֠瓔p v6lf#D/]H<^骟={2nܸƌeY; %%- 80n8-W@to;vln/ʓ2]1%6pH S_XW@2 W '>s[&)ViD5Q_WyPq-`T}kBE~k|?l,Y/;W?PUM_~hP KD¯|g Q sk!Ȇ#M ea] $ oNC(a8$z/ n:ɛFBՐ3."1l+ {ߍmP<13֣эCw`gߏ.mI('.:;T7]rnxFcŐF(#09pk@4ʟ1pVxČnЫg΄*"YL`2q%,"q wSx}cQIDu^KJpH-]?C%Xb+Ld n\dQRaFϬP?œK>Le%_mT?dibn憗y=v_*k_QYFwwrIwtTUqΝ IW\aꫯc[jTrÇE}`"LW{Qn!3? 6L-̥_$%A" \m[_Ӛ?'*9Q sG l\]gE 1BZdƥ{T3Ufܰp͟khW荱s$oLHD<.1SQu{-uP^ قۿǒw=ucG^ش}gcc͉٩>@bv2ti0Hfj&{D-sWL^ Z}6o%V]]đjF'<5Cv,Ĝֵ>k'N8xd-ZNSOw)qf20-XA4.x`7(H~VG֭[Q/H}>$h>v}]%.5ѹyűúh-OLx4w["m4F2 |)I'%RAZ)SQ>F0-j @~IBee۶_H)O7љի>ҰuHZQ.R=jܺquӛL( ؔm?}{f{/KKj'Euʷ⥝[5_,ec4JfW\c}']kQV}b'$"oTV뻃R@&b< p;[Q"e}v3^zccg/Ť>ِ$5k$ @f Դgt۪Wx% HݼRmFxA-tCnI2\J"g#o0,ezWqm,;bRңޞDps` ǖJμvs*:}hZZ{i]{<NJ,!1(ҨH+P:L\no?k$3dqӱnq*RaKxv kդ`~hß|].(kmuyHFu֌ߟ¡6riDlܸ)S&0j` GLڪ2e #A<ŗJ[ןԓTUYcRT[[bכy"UA`RHmU[fnǷŪ!&v TTTxme~Z8 iƩ]jurss1i1_R]2\Q yʎq??#&wEDTl j[ݖʨ0%%j+iy>lj|v C>c^@O S;Pft<!hI]UM?`vIcJM|ț$6m'4mbjp"g`$4\s-[΍ײBU9SE6e[ȰZ\@{V^\\6mZ3ѣGs饝 *FBToR;"$6␉'_vNy2RJx`ۛa[\u;&zK*H8H,n7wpɒ/bvE"UA_5R`ȅq#gm=O8)525(cS8?"i]ݛN2q@/u?-]9dX~ˡwiYLis'j#zVR ALFco0E>`XU艨޳~y5WMe}Ɠ9MMS҄KA_!s{אF61U!<LĪh":PG@X+戎&]iVkȌ4fKU[_z̃BvHҮEwr9瀣}>MGN? 0⠀Cȋzx$Yڥux+ae8Gsvߎ )5.T(1|9_I. !NXzS?Oc\%%ۣ@L4{ isKH˓!ֻLt b }xu(27U1Okޭ{)7s\]2 cl#2mYl޴LJN`zN9jq?;W߳QqN6v]/錪 P^DCp "MfOUP=SW jlb#_0 Thxܿ$(GHi4Ԓo%WJ\Cl۶Dffߺ'ND4L39@ m3CH1oTOr%%%#,xzʂ{ÖFkx1̪7aGьح"9K$k5Q:&ոYo6pͤu\Ԛl OǖUpn1BȪ]"y \RE85պ hKC/v5`DPғr#fbʔ:d)%9/`/f /O}xLK(ͭ= <:ubxD,گ{҅h$J[ty-!rK01b?|aJ\]9li~W+Ɂ;n_vx%s]͍Y-j)6 23g2sL^/ smR'YѪHqdf?W?LR3h@,ddS-0'BEڙ)UB(QBY`O'<ՍO"8^<2 WGiV M&#<#Qgo#\q#xSSiX1KKwFy;XwnkϖTe47 VR(՝1C84'h[`JZWtsLXS=_%rëI=oQ1S*rgeY?ߣVتفL$C p( g ?cssxjoyeZ%׵ HN;/}ƈwiT𗗗^(F.bYҥf|Ͽ䥗_U<O?&I! O 47v$U-o>oGo4g;G Lh H;uV7W>ڲ%YBa6U_g=eR4xU5q\n7;`z^-C&4w169uu E@'@sVӱZ߿ 厉ķ;}٠!mAbI4FՅzU̝9'-ӖJW2~m"=0{=k5aHh\ח?=1 xO$=KxFP޽a2 V =}I#XooҨe~Uc|[tR`Pt sh鄷;/dtCx?lNjko+Ɗ݄ %;%3z:C䪪"5 Bg8_duA.N2 [9eYCmʹ\KH+gkW գ9f62KHL=XfTQ̷zYy%/`7UqOU׿51.O?4O?4_}g|>=QvpIł.nr#t4m vڃvYՀe-< %kZ}6^6@kd6; za٠ahHhбcȖo1M À5$؀;>i*u^NWNfm-T1 XĢ1ͦY4¶,"4XHxx/UVh퉽Q182d?Sct[fH̄HK()w#X9"eΝСCѕFB**|J£bi 7̲YΟ_-JYf3[I Єўxty=/{\zbW\۰qlm[HǶ%`[GA(Ԇ~|t=i"iW;_v!}'r\Z*s⤸,$/5Xl~apK 22[wc#<. GaQy.CNoTYQ͗xi4BGHH[qEHͦcWo9Yɦ`ǕVB2DSzf#7wN=Lc+k7J+vF~2ž:TԓH}"x]fv;ߋאA(H6ތdF^p"ӖWyHDƒì-?D<(fWuK: eԉVJN-\]H#2pt q.Q}qEu+|Zp XkXA!j] ##zu7;5yi^Ǫ_YieݳTƸ0 HLIc bX{*[{nB-V ExSM!Fl `vlE1 mtR\ޫ êVX,uIN)x}/~邤u!VNw>"ş馺>kw -8z!=k֬^{MvB](4݁a$Cq}eNMM-GLPa#ȹB$?GN\4.Z s'Gq+rs"4Đ" C8m[cx@c.=h8,[,>׶a6Fth$vmjmTĜ_9R8ƋbRG8[(G톏#lVNOKޞi >{mGvl-uLI.R4Y)v`uBrR )#`-P{v-C͝$j?crp' TG PX8t!?Ah4iI] _<[ۗ1/0'ٞiAJ[J(Mᘙd7ԧ,MdA\.lI9^!`&'{.3ݕlmo ơ4.}Pـ NuPZGsxppeKz%"J$0@8 :s6ԹuOS}ީޞBd[DCC־IVU9oM!F %cڴiߋV%2ۻG B;0֬Y뷚^~w]:brid3Ъ*W֑3.A:JJ×{D \^Fdc23JRR&;7ZwJvGD2ȣԇu>-ϥm߇7S/PY| E)v89fC8s"#Ek[Bg#|Q`~ U0t L#a"ֽ =fͽ`hjm”weF3z.h)B[ܷ~[^r%"??%kqC=ġ K4ԚjpCMuTJ-!hc/agp$%iljحtQϷmjk߱yv쩢cqq )'dɏL4Q$u9[6M{kظi 8q#UJY_%X4㥩lgΧ\%AQ3-nɞ />Q Vo'/Iݴ9o[a*+0n47labgb7c,$J'FMDp#ik 2 UdUxx_7/pk򻉗;4 &;[i]u%lKs< ݫk"!f$>~YȜj=R,WuҋEl5DE icNg+nzi:Vxc@ \El7fzN#nrE .3,aлDھ,@8<`YX ˏH#F,%':Á=a6ѹ#lQ&uB2_@Q^HXK9u=(^|cu#08bO07>ka}!"Dr^ypڊ+_8cք纮G]km# [rē]me'tܖ~ܱN-%vr.c6iHHc8;sjSNYߟO9sJP3r^5di~T7XNuP_)H$b4^r}Dgp:CAY8a:T(LAUI_]OGAM`{f $H} % rԺBi Đb.Y-f?Fsqiק1%8ch\YRȿbUͺ3lb޵IOl'˷ 4zZ hgU"E3i'.gh/={\' UK.Ҷa/e43YٷXn]xҤIwK)2MS<Ӕy`^a.FTJp(;ڶo!DXJyD%+J$֍ OTff浧rrZss3;w?4 2q H-&??b,Bak >/ݲ$Y$1!-# }^Wx,F$9r?`0 `׊o=&f*l#1 2:3)]Fˈol&=] Zi|p…u&? -؟f2YZ ғv[/FlOȋտv…Y篭'3f.hDӼz:ѽݓ|9tĄ-lV2!m{QKpuHB[ !xb5m񵬬gDHwtnsŞU~Ujxpg.뭏66?t>g8vԱyvִb1v+LXMDpS7mk.328bHмlH41 f)r!}qVPqj#/Aڇ֧RSSo}\zy_իiIےF%^Y~g6[E $K3\4ٓ n\gsQY2pkdeeDU\RRRS^^~ h4J$>&^bݾ1c:>ʪ.DzΞN7N۶F#Z3B PBx9tdO^Yt NURJGm Bژ:p A M/ȣQ# aۗcBiOoP|#5K(vP=:-lr7xɆV Uxlc@xdi]՝ t[?<#COo:W=1Z2)&іvߵ+}\WmUlo@\f e HO7Vw9x)/00ԍ.vƷMp ^I<'2䋭:rꑄf$ oG3( ۂ[% H4ho#vbaWoYg{MkAY⿦ijkIp_y+}ฉw65{Ye'bݷ9C"UV6wtYY6 #<ғnL8ѣGپ}/ύt(X,`0#??qƓ)Sz͕ҀMS); t GFڸybǀz NtoӊuP*{q36L>Hݤ2 B%PF1.h`޾3;ފOuƜ#%){[K7FaSi謫1"#cylXwTfqZrs}e?\qEi^3jPD4aD USUCSqhZ744o@ru)RpVc)=]J"VZZz ˲x'{ʳ>׿xG"*|EӴVZ}Ֆe,fΒK}t7 !>oo?|SnnEJ,fruuiZ0Hu[ G:܌:{:}*-l˯mm÷-!q3fF>ˋp(mmZIMHx#iuf 5ה ňV! G^% 4smLc$ݖW%nP [GS  eeƳ.*m"JҤ_FDET`ك>zs=H37\:%>lմágў\9{MYғBms. ۄ"PT1v&"՞nXMJ߀Yn$h򁨥iX9+wcڃx._ +֌]!]ldXؖ׶)k+tXXr[Q;г t:??~Ʉp8aha$n>3f\Wۚ|tQ8aU+lܸSΘ1c4h?#?I4Tqx(JZt8Buu:ϴsOn|qSaT:D \Ua\AazrP#UVHR~EHj_~ow_xzGjݵGo_ L5TGZ`pVF,#isJ'+V]ll^岭)!<V0 ![l)ŁJ:`Ys |\y  WVV /}4 {衇uق"v5Tg^+KN/@)lw]Cu(OdEPKHr0צ$UQoJlWKЧ t#bU yĉk|ŧ+7QӶ#b{upm#u-^TD^y :ʊwnXHC-HB* 4T[~nBca%V*!_TMۦ(iۦjϖr(ȎZJ>ɦC:%Ņ5 ot8WJ)z0$Np8p8G"+͛ׯpwyۘ1c>iDtdO t]EL߱տbvarxR9)Ǔ>dk׭6mヽ]ɿD]?@XwŒ }W84uFl0܃ʇp3h ##*Ÿ@-a:@-aMz/X6"}ΟXܚf/Z.{Wλ!H`h _+@P)TmD)uS.wkC,Hw#%gԶ|RJU̹wHYU+=MƁ)E5c'LXg[6RJ|)izA<e[S(Ԃia&M:o@ᱮWx-q}SzD`HR\s/l?]BZ[[/F'ضH)Q%im?5k֬y@եG %%F %@.Rw_~wDoL;><ž'E*CQh#fV _M:Jᶗߙ6K/Cd{н$k߁W>"˫/5dHn:J²hu 5ͭq˶o2y5՞hzRg+"/92ػk,~Yg۶mʽR~ NqMAOMXpǗW4©Ni)77^:bLgHA_c7[ZÃH#`IPK/C)<ȿalsٶG}} ɳ=W R>Qҽ;t[٣kll&#GzFXz<g(ӟ:a2R~VWf/UЮ4u{8kНQ'LQ ?ZnI_Yv >R-\1bu3XtH;.3iq:\;zPIxkyg1@Rvoi)i[)^'"O{&RJe7ٳEQj].הiӦ px[8ٖbI`7BsW/{*AV`mcLb)9V~ـ-5j*X3QI!e~zXxn n!<У{8U:Miii7N:[nkSSSҲq8ɪx(yϬw`Ei>)k ;o|WQQQ1!@ RjEQ1cF]+}fOB30⵶mWkgyI4}]CVُSK+.tD9NMݰyȐlwnjvl%Lu6!VuMY7̿ro9~/ACPݤWLPPfHd"ɐRzіbDnskF|r=^[bČug Gb\g;/8:WrvoS<_ѸriJt #`-u,,j+.SDmH9HE?g(斘R~!l5{eS=EZs@)%VCٚr k׮,III5Mò,ڐR{jUs衇+heOyC1j*?ܰpa3h+d )׸#ˮ< C|gvcuZ?h+WzWk9m !֮]?=˖}w(" 'WLsKѓm͐ x@d*5=-/-B8;& ZZkñKK K)={v TTT ()))m)%%% S~kdy hl{y3'gb]&P{+j1*ta#1LV>XP{.iKx>Ccc|_5CSXsΝv"1#5}Cv=a$hlmr2T_A~P154Gyb0 FgJ)KQP)붬/i*LU[Vuj7gY;j+QTyDAv^LN??|<|E+ R҄|3-?lx8d8p<959=ᶥO/>r|w+6%yy?|GxX[sJUg=3Ȯ1wl ~w : poJs@aU||A 4[ڼ c˲}ty'p?xQ| ˴Zg=yENOuIњd~A4[c^Y!d e'b%#[r0UYEvbl)totiNat^pma=-P7yGuP`09)%E^Lynĉ5Mpʕ!pYt?C%긣S4jbƞS~3yX~_ NNIi/B8>4G(n݆ T<";< .Kmmyyyኊ+** 0f3fM_}ϨlM0?=X `+t=a459Ƹ:c=nvճtӀ\㰭ЬH sx [0)|~.}k[[[mttU]~۽LJmҪUBU WQ'!Je#-mQ)ens A6k>olk$n("ńݢWӞM/P&y|aS@ݲĎ?z ZWO:O+NJ++W^7. K1ZCT 1#ijJVᶱjrz|}!GN}gFπju-[PU_U7-Ê^>}_#0"9ۉ$ |}7O;{KJ0׻:7ڙ۝nCW.ifI| paoe\*>ľ|[)sXuеwV=(3\iZl)t\kfEJJˉH9QƦ''zl]G\/Qxߐd CnEFbH1#`RmPuO#sY̙B<)؍$"~>a„t!=)Rqicalݕiu/rsʂynyӏFcv߰"蛤OjjQYZL$eىwԏ7j1[1HʅD{FMcX.ßMNv M/f Xy/"nT66 !pŵ ~u摞5e6d1VHWS C$, U$m˶M?(WnqB3xgŚ5xٍ ?౑pa85\vN~\> .{Y=z̙3o^|yL6LAJ<^Dο$ς@ @jZa!tWT)'#Fؗ(Q^Qc5vk(N+gG}#N:.7NNW-UVשD§kj,KAD.>xEQZ3+>O(W}漖Z__ k g (x(!l:]O)0[[{ BrCIQJQOX %͎3,WM̺?\_Lm|4GƽJVuP ְ[tH3mڗ |ͤ%WEN j{Qڃ@A'Ji#TL\Au "ÛelbIXJ WJPiDv\ofܼ5k|!rh[ve=<–=RJD}AHq墇~I/r_L˭HgY;cn$Up:rQkUt_jzWWHD _cПBԥ B߆YA<Oߖ*m۫GC1\Nn]c426?1i '5 T{DnKhO kf jYÌ SJA۱ͮ< ,$;_ݓk]V$&p/$:qׅΠӧXmwG]xa_r.l>9wx9BuΧ[@D"Ɩ^wn(u LHt}cc5jZ[G­Bɿp+H֖f5UmH)UL!kn)QmK)5)4s@ϭ)WoMpV֮^ļT ~N~C+p@g#Km?S̓\}⑇ TP\6dԾ?o!*fʑC2Lϙs;(E(a3] AQU^UWNMhil UYB1d~DA7[wDMRƣ[\ Pmw,ݏd{PGI@ro>u-Ht섒bkVT٭^=#6}m #J"J<ЄVm(K=M|`po6k"=ܫ :PTY.9ژ:b[1uYM+>攸U pFgz}2^JbJGxCZݦ%6x.+dF.e-Q%}f*Sz}2^x/%%L#2EVh0jFd.-Qn)"cpL<=ݶ~җI/֣dp HC1Of>i8rV_ֿyy*9dR53y ya<7Oʌfvׯ__ò-m;h /ᵰΕ+d5]]NA9SSbhZZA˩#P={Fe׾MSr2+7!?|naF4i[8f"'8h foќTQ 4IZNqmkK>mC޻#%}8hsa{&ej#> zMTVL[]CC^[DA-OMڑ@Mˆ`UF^Q!PR,1Th# wCH#zu!Jf0B~ 9c'¯aq9YԼ(cotivL}X|+~P ;VRg}]36kv2:;JS=E]_K~4]3Xd%ʙծ/m "߻Cd_Ern96)<% t=5ʝ;n,:m-̋Ba.z,50+$Ps;^zϮ]vG~yLA\YHKák45(EP5MPU]׫ {.)g;|C4_%p՛W 41lQX,m4UvhL{KJ슲w$E9i=fM4,s0 V3~zk?/_4GC*8-.T|sy%s^:6C8yIq ͉Y/B~ẅ7ml\mYXR7-!_lA$Bpqj(A@zkl4X9 =ۊ*Ih;D>rBD ) Vxg+++'$̘Dmi&9KG8HQl;wP u 86ȡR5t3,ު:tl+1fLl)o-\xZMׄ,EͤfW7TcnHpf?pL< 2YXyx#`>|3;u%67 ^5!%Lb"ZZ8U - S\$7c&X g^SѵBs=&7PU dz\lih%'kh.j#yW gjP>,W3`;TXOZPg-S/ZpAfq=73ny՛w^S5a8R7{^>\G fGwj–Ĭ54jjnǕ_I.!U?sҦaڂa˝2sx/eP vH߶95SMma[Z ⴗ|$yӏ U5Vhܛ۷m1---&$RPP@ AI ,{܅UAJ=)e7qfk1 W'P4ՁHR'b"Bf(77wpվm>c'hI ܽ۽I~_e˛@$()N(FQ %a2!(:N->fu+|5ˮH,.R^3<>?U#i5wjn  Ŷ E.4Kw$Y:(=5EĢ1VN=š*loi =5)T sMxcsCsP2߿ {JށUd18)=[Tə.82KϼP|i$xH.A Ac$4)'-X>ymYhOlӇq D1p aGT%K"h2^ܵ;ZVʇYSVViZ,޼tJboC05~kkp_'ϳfSPpornjWZ=on.TG&[zC52d~J?vgR]cel_} VUّ(u`ۿC2]jR6>,t7?kfklPnwShFvw4aj+oZas4mo&-{B.x^ϐHhm]=ׂޒcl)3H,>uۈ*@2܆4 PT@Qsٲ@81Cܽ{={W<_ߥ\H َLC"IRJAs0I)~{!SVZq!EX9 ZZ5w"F8G"C5ȶ* i:i^(.89LӼq{9OJy(JE`- E~HD;۶PrRwF46XfD4@-BRjw>~gu=&~jAdd}4$.ef ЊGQ3|xl۾IHEESpqI ?d}̸ۡ*ӽޟ&81魯Wwl-5R|v!Z,f -z_Z_!ekvAi{N\MUj2:;;QSlW%4ff DA7KG î8iGlWA DGZ4G&6|z˲w.hU.UE5ף9\0טR1cƋk8'?:k4S'FQVی @4T͋eS;ٺgM -co_wxiG'uM}3fiJA&UU=(묜.Rvw|1l+$O6gXPC?fu&OJ4kv2Gw$ѝن oVdpm2KKKW.C(I?IMRQ:C94;NMw9(L%h cU=>=(|w%75*q6+%qtEC{ެ:k ɺ`uZH֩Ssm Ga*4Tv{IbjꕔZMIusF_wkˎ:̣G$5%Μx= q0Suᛉ' řiAr p(v )Җ4ԷPU&4,eWɞKUQZ{룐|ٙN=^MA۸Çt}Xx7/i6ښRbh6눾chزPŰPTͽi囱&tI=^Va]D8pw3uLWrhpԷ +s1n›9E5Jsbb Vg@QQ̘QiFvvv7QCZ{hnuh ?\=rɏa68=n'=={ikEqq{kş%7/YW8ox38I -i $&$`D % pW7EN'2= 8ĪߋUA*}HTj E-R.!TMwl3vhR<{n#/իoLli{: XTRRrzyyiBwoܸW;s5hl)|T5ukafZDY[^ˡGۓHEQ,坃ZNnHjҲ646nn~##\gsPΛc?K{ Q"Xs؇׭~{#׫k<Ҧ]YE"V܋&Hk_IH2dR`Im_k\PPи{[=ӦMcڴiq apddD"ivt!Ct[iӫ<|z-!ڻ|(v֎o\z`@Ksp띭 Z[Q"JVvrm"܈v)!J&NL̵f! =Ǜ1woC+9Z7kii9yktv{0\s=?{_\}Suʩ|lj#k^rnۮ{{tSC Bp1M'4[:n_AIot_-74E{jVIP"ƕ%dclճR~?@֥ٻv] ȞRi%YHz٭,@;5!`ϵM;$&70t{LFQ>}8">gq>vnw1<;ѹ{:]N߫6wc[Ta.-28@>хFZ{Н(B>@ cEWLuRԱeo|,DX+ٶxbSJyn.;]0YCǻkA#8?0ߑ1q*+6}'^vTs Ov \c8'Z{lV|G嘋3>|;.Q-]X,/H҈@)N~B)[+=ohj  u/<}"Hh)SVR΄m{k# 횈aD$0 x53Prt-%-_>o˔gEU+m=9ț,v6G%g.2j$gG&v.i#ơftЯ݉33܉3k9''RN>2yyy=Uāb٭}퓂,eo-+vVpIGri2z{a .,|do:Cx/,]SNw,qn>\߼7JwTN[q[33nJQ=z9ڠY8t+}ekfF*fF-I3TG +9ZMh+J rn"vߣ+U#6;Vm۽ݻwoR.`p8Lkk+XbE47 5o B"gGRrzD;m53vnLNcptR} $BTr󓃹ӥ3v|1҈/B淃6%ޟ4?2 Ccv6p FkKdJPpG}v(nE5s;_nhyk+`֭0a± ;[O:s?z\bן{7oߓ>B}ӎ r{kw TQϵ>6ՂW1,`x)ji4WI3qĤݢ3k~0Pq]] _ :-wiYvYs5F3ˮ8y~3g[֖#y=(^+dאt# ћ*k@0[f͚։'6yZ例o-91bWug1= K`Kz !YTsE urSé)ԴEwT4!0%kޖAB@bۖ!ޓR Mg΄D0P ! 죶^GzN߇rsМnuQE0#M#iv7 pǞYiGVdC BuqN7]:d6ocЙ,`mC󇾣&E~:*V̚%ڠ 3F9jд?fg>)DLHB,7)Fc(Ϻ\D !7P،=sL%aw 0c6oWއW,*n,kUcc,//X,_v:}ߎh}2IaQ\Н68]\yZ.;ky=iңL۶T'rڕ$pP_BKSg2= QUh󷷅7>>[jߥV;T(VѮ% ~:{ UJ ɿOF^F _l $pי+^{֊#UOBaꮼk~]56Z+>{Qkv._*ع1ǝ"R+wJaë>nff WAfC (bWv,x]^!hRlRBI:3NBNy}̚{̞YZwV!IR}t^Eݿ3R58LlyT8ǥ|=.wVX<2!1})4iѾjJ*[mDyOĞW5!:d\3!ui.``gV.l/ߣPj˷kq]\ZZ5&Yf|!|+'J)_֭npJ)>^nyUm:gjw(jA+Ÿ+8E(bt ?$12UՎ>_rw'6C>yZw^2;剫 Uw[>45א?Acc5mӦM3z&EtifGI?xƲ엍tMm6)eߥRkX 2o>Kup8G9#6@nb-]gU:HOGp؎N C<+tJv3a!b"}R9GSЬ/4;OMRxPkb}]S'v8CU^?+)l=,GWEmG7w|0._;*_?hxQ.JɄ?`R]/޽ɹJŠ#!V9rxRb'Q җ78?BU n*MT@`\#D'eYt11 u~SZ~>=DN)$E:uE!%Jͮ#l؛#{&Ft}8p@oUU&%Wބj)EQ|]ޘIҮdƽtbEQp|hZo6lXUG;.&w3sC \m̑E-,Y2U.fD^_Eе{ < 7бXYNhc\f~Fٳq[ҷY*`ňC2fjCTI_2d9}}0e@AMÇOuΕ.?=UG־BaM]csޚˏNΎ}m(r-&y]d%l9Id?3''Y$AG+T9E5ΐ[)xç3516!*͏pyރE KM)<Xf!CLV.J/5CźuvLKLXSZ(Ďx [檀_yqi\aܿaEGGZhp hA={X2ޑRAJx[n\|= UuBMDŽp7kӪ/_:[:OsYuhZWVT\U+/+ڕ<|˒-nov pIyPM%%#$ &{?()IхC Id°S;4l_nqFJw݀Za" ʸgm|d֤註ҿ]RpW{Dzæn嚔R"M֋Zו-BKvld;ef3Z *+CcEQd"av1BDr. Ґ|QVܦ9+33S95;?vsaouJ-߀tN;h:-PvA5TL8r 6*EoR HK"U?r[{) (瑉Ii3o8E(e7=ms! ܔ!ڊ9nȗMʼn 6w(wgLIH8+MS,Q{˄Z c(nRmZvf-@0J7(!`*,O_qaGC.|Kt_b 1,@(yy ;J*tøn֭a1JSUSwuUGd}d!7K{Ga*sVܡ447MSjU '`{}=z8fjMAA3\с.u֭ 1aJ[ Ŝ9qm25E\pj#et&ZXs9ofv.^T[Ǧ_8oL"ld [ )'+-gY%^u<[Uc[ϐrr:+k%rP,6M丟!M|cG\Eⲳt뢌ЇCݹO'qym=RJ5//o;@n40F3ՕަvLbP[[[ {u^XsmBzzH)m,i1i_M|mhEJ_L J%0ncW&p8|;4SAG :%4Ohuǖ%fjҔ Z3 U܎gR?Hai ٧JA1>vh 4mfuvDEז4 ۷75/5ܞ ! \s"}oS:u@7;/mNFRVLR[%sVq !.uؔ'Qv uj:/5SrfLzxWE %?HqϚv<%EW4Mr* n`Pׯ޽#7''gV}0U0%(;__=7d+m[49u%¯PH|PlKuQ\][AEM>Оo)7?6ǼPG1~F|ĭ@%)-]RvE@M ت6rkee ",B4qT |krKNF Pi9_n܆/4{KuZ 銢!8šs8X, ^W);_[ >tUU)Rh)*p'd%>>ÖWvc􏎍0)ą 2Gw5M?Mwyơs%D W^ n;"SUJ>Vo ` g"dP~RnUSfGUNݻ6`[n2KnKbD_Y&^ ZՏaÆy&<@o &b֭ǬA Sʻ$ZaTg#ϋjRJ;4Bz֠CB߻w B B$3Q.]Kxd [eϲz4o.lqqqHiFyފڊ k |ϟx`Nn1tc ϫyyVa'gM+l+Aͼc=qH)-^q-a}ebc3<Ƥ;kԠGUEi@SXrTn,~/R:!Ǭ[pYt k"R!VdPJ lvT]nܩdߝ+m%h5;2(ɥK;n]*;s62HZvqqob1 Bq)c*?7_sBd?LUY=j6e"ܞ61?~s{*̈WBr+pj TQ =T)q U96vSݙy4x+"6>0YΥ1W\94ͬĜ]h6b$88va999gZr:Ճ!ԧ_5ެe)R.F/Eom!s+_QKD/Fn%/~Kˆ<k.Lg FDT9.CZ5}zy'aY*S ?4dt!}?sCg`0 {+ ӐB#3BC5f;'l߂D@$-pQppg4+ ]`Ue2r: `@ 'sEOdiQ7~[92:ax;LQT<)kFSOfo6 ddGի5xjtϞ='%%ޱc_s=Ԭ% eCH)Ļ+%KTL4R(clO~lƥ'.Yz}B0vxޟ0xdL!?F ˡ ɵ\H6cȐ!3ϘJĔ ;I(rnC Q# /Kyk=tfZe07k:R5}Vö45&:IiJom)ˋa&{sC%0/yXƤ> XYy NoW.vRמ<% O*U.{Y8[X$ +3oaNRpZʺ[ #1;,W5ؿmQ:8Q`01x?*iaK!)MSpk=sS qy-'(R*av@I*bGI1k˪VQ0cipMoٕbˮ߽ccb] ݠ d=wm,lø 2RV7|3SߟP%2Y&o s6RZecc-yUU(BQv.xoϧzr"Dd~chvjFEE0oTTT_˵? ^BäBJqWV"\O͜\3f43S'_Dh&#1K?dxaX3. 1+ P+UNwU79+ ƛfch$y*~c)_ '[}hRE}}zd}8֭[_ x@rȐ!Rq;q2SS>]x6cזZ@Jrz*~{r:g[o;"d>oJ4@M59ǁu޶7cI WԖr;O_PT\1d;c#xQ2.`N^\[:xoaM$s?= =%'hy9Y;ZgNxo`m $-GۘBL݀OnFyy /c΢@w5g3@lE,:< |pPU(yw\𞥙;:2i7=t+!1&?d?h^9?E+NT~ggd&UB{x#*"6!p︸'V|2ոY '!?*S V ٘lFBY ]R[ɬ9>>Q `-<+}j.!99!Ȩ#4߫iㅮ111AR s}>JGE\/{^ʷ(_Z)@76)KC[ mmDj;ވw3w]Jはr|e]̿~_199Fdf06hrU376háh8UGΦ!TxuXT6T<{3/8>ٹbOY?uṟF9:4|w/tmвߎiqݢ(#5Q{F Z7ri83'k< Hq'j{:psc1"en=z8PP4Q@@͡;%)K{wbFɖ~ԹY>ʈUg\v"ekk |gJKN?Ӧ"NǔRʛ _ܡJbr)ĊRgߟ_-mDSc<ģ/sSH(ozJ0v[qqv)hѣ111 UUU8ph$\PGa¢j$ʷH1ĨHAU Q ^Tm233MABte.Я!4hfffWP_K \1vs hu9cʚ࡙oBh:"OJS^>hB ۶ (⦭?m)]4E V;RF4niwHH[2>--yMf› 0%TԹx1TĒySbPJi8粁Y1vTOȫOBxNɥz91r3+tۊ?]z.UD|6J Om^i&~!F'r3P Biq]"Y2D6<)ޫ&S' [xe~Roy LaqTUɉvHs' Mnϼ{+g2ḖvgJN@| b=$!8U1papPt&} ) עޖ>%~V}F!I(TnK;6SQ-}r!w".ܽԯϮtںHM!2AMg\S@ BzL#&fAQ6ԴOH2k*Ň6W"09c1K쁽(񧠖3ֆ@܅ɲQ\D(Zn3o'4͊hl6yyy:tXbbbh5XJ)qTUUQQQi$$$p8RJypa_f^W0e?ҏ(ɷ[vJ_L)"qI!%_Rz@Ckp0I'[lR8?ӈ!cXqчGsv3hL']v#N[g؏}QUlcMi D {@ج 3G1 %v|Q"F!EHFt.䲁QIPhgzHt]LG#-յFv.߾1*\CDz0Υٯ3ӔtJaո,-U _SudyyG]⊟:M~,Qvrxō.ԏK~6٦Jg 昺ؠ s!RvS?_$zP*$ B5%bjS_ *C dD0wgk]E(l2M7uTuҥpȑkEVuz Tn4Bٝ(@0E,]{EE.H_1BSXv<8_(Z,Ppf^1a` &&R9X @iRTn'!!h mS,,RRLW\CĨHJk__N;MY'K)?7k)"ܸ~^-7>EKrj2i>:c;tG՚oOk VzD?򇏧7n,:tz/`aXk ,Ɓt,ز{Kx'>EP9[Hl, YfP3W|Ŧ`v-eRV/v6l[?XW?֟1՜҄¦:}6l[?sr傋.=%l{c)_6Qֺ1Ve}=8G.ݖm)APL1"S , ي1~-Loc=O{`r))9}`hZ1ۋ_WyqDXEՒ[T|,XV`{qU>;5?gdn8fMoۓ]úu_Vn<O~}y_+9ǿYUoXGKiHAry_U^!U7 ِcQOLS%xAS͉orXlBB TY_?Ja1옗TKTN3\b%sWDi$$\/L곟OX/Ϙn*g<6{]]WGJwL9)-^~̔9l;[L9 EZ@Yu$^~EW4sFY!*(Mf΢ALXq3Pq!]Tx$F K-歍CInX89IB j9!K)娎|ei}× n|?^_^7:j81Q̞87~w K^|mZl)ъ05>% ]|Tu 8f*BӀ0f^‚ɕ)j<# % !u9C66mb p&`¥g΢Ypeۖv J0u//=I\E*sGSRuIEYMiz 6ag{Ηzo39w^~Θ&>@TbI*3G})'J6*Sh^!7?$DݣWN3,z9J)¥?Ci󲖎N78:Ǟ۴^{O3pn>=ӐQ̹Go%hp#:<9yZjD'Ĵj橭c(-l8RI,îujm|n'^]cC~'A +v`yx<,<2UHáhf ƴA;bbmuמ<*1ܯB@ 8qE2'@!|9(f=j# 曽PyM*#aPJ17}|>?v!`D j[)_ySYͪеk{+8vQ )EK=%`@o>7wX5.Ճe8XL{&GsŨ^zMw 3>X y~~k*ە_>w5BEBpA\q[zf_iH{m'KD=o8/ؒ`K)`*Lv)xgbdvu3M5eH9&vX Wuz0}RGOCQ¿{.(U 4+d@ʼyjB^R)))uK1gDU&FDw?`CJE( 4z4fDwP4 ?=cg"(iUR8񾭥kbwEb4̱*̀/f{KZUk&M:ߗc+;>BZ>t崜yY-,@߆lnI |{uJQ_^WE~\Q @ؑd au`K琉Wv ܻx96^)ORSKjJMü?ꊮGkOJMnp'GKFi7%h")o^kesqS"v/]t<殪e$9EV)-!i Xr-+ObSAZ23`KA C%hQ<2I}O-<)H+bʀ<)3{tn_wa z%t,-~DB6@EGV" 2gQREKZp @1`Ng΢GwHj|{BNEǀRDoe %rHb>$uWx|;.Kq;mY zac;%D%iN)aa w-[`XFO߉u 0nfQ}Ţׄ^^~va᪶]E͇ )4 Pj@S[0׏yyO;!3lGqʿWcioMݓvJ/H„e;X}4K 'HSb&M$_iAL h!ZM aWTHWRTR&O }SI%BXX6,V;#lͣNwyyym.dPM:č%F޿Q*ըBېuTk>j׏PPTTJr.~i [Ʃ3bwt)V?#M(ӡ!̣HXSl5xKh_JҼᘝ {&楏͸gN~ WβhτYI)3[bʉUZ!Q $W lBb7UI\jHkZ!INEDE@I5l]?Fd_ =Ka ?u^ScP^mhv]˶c Y(d4^mj;rd4^u~y"Eva2KNjYpԿ=`Wi$Gj3z;8hH)[[RPy׿uJĪk._Ҙ';HP8X\+d/o5do1ίe!tSR"@mRi۔[qH۔`k &,E/cvF[ͽmcy& ?4"sW'KcL$%4ي}$)>-1>ܲjz6_WҠ|L=' rHJ1ebS 2(77oB4տcrn( T:(E*˯gF6F*<1w !iP}BEMxpl>՛.3OiA3]y|x:U6 SC*v+d&]̡ȭahZ1SkgGqGj"T=۬´"awS$1b=L]/!Z @˅tNe U<{wt杍CbOO2W#ݿ~a|AC6~#Pշ* qDbawr8ad9^{['GW_rwOӰSҵkBnC =l>H "0H4Xzb+!ˆP>XQ lE-1A)CohYOW/7^DU$PՎm-KHFʡLL6KF7/ 5$֐RM* 挩I֍ꠅXVvtW8x`4?r-!1`*C;BDV .g#nx6ݡgMH$,uLF~8TĐ/  RϢlWv/Dۗ~Y=s5?G/6FJANe?vNd>ݫ caIRz2{ͺ?D3^<ܬINHxzH%쳑Rۑ4b~볿WH Ȉ9s*cM'[=s?kF1:!Af !'d.lx )Y#c&>YIJg \Q1?3^~S巅 [Oj: _w1ujM7,F>`/W[yTyCm]@g<vr7W$71;+,{a l1oΡZ'0.,'woN@(<##GnnQOQڣP~'I"!d׌2thHC/T`pB-X~I sI RV&$ >zIC3tv j]_ ۜ& $$`M_ï]iJ9~_4|0w_2ť$!2@ȓ/;'B—6)$~lWM;4zre-/XIkB !rtm)\ #@{<j6oӦ:C T2|2bakq0{ao!93Q-:rvHx+$况C/ !&)z_^B| S8{Nc1=p|N'V1|߭u鎹OġdT7["%[Gog@E,gOPu|WJ V5df*{ a !GlBġdfFfY/K+_%)ihʽ~L>S ~=ܩU_WdWoz'&;lSHE q3b|]J*!BghQ5c[Pdۑ2D@GTzv y?,<+̛!Cæ.?~n1wgfFBm2):HѼLބhizvP[{f/@H 2}2mzS Ui)U[tF܏ gTP m#Gs"Rfc ϑM:cX#] %&PZ@u!M)E 🌌 "&G&#j EQ*BljgIĔTb ZbB ,2`il|ԍX5p1]›l.TvB+@Dl)CQnt,- d\!y=a𽋖 ]Dc@m6sqZnDИ. MWO==dxsbiMMxpr$q%ETE*322*CT.MY{L{Ձ93##!~CMa '*aڵ낖&=?O 綟Q dbaQp֥1d* i0\16Wfl$ҘlXO>#El;L~ye-Dkyu@-=9kZ _V!"'r%{kI@EvYN]DEȻ =wUBLR ~14LzĔHIbҶG ʛf]Ar i=`Ϯzk+fU I#}r5| h3繤GQG:xa44@7:|xZ]KD([jZ(DoA1P9Dl;F7T 9AmHf}/yao0liJcDriC~ao·gwphw nLUm-w>,W2w`n+Y=R>]% :A5lReϘ|?j2YOD/\b{?H"*,;M6KOzZ)]+8-[LjXw݁UU]QWQf 躾49]tiZZ:\U/쪚Hk&&nٶ%Kʯ; 4 z 7!-1$5!QQQ^otҶOƼB9C|mᾬ%J*_IITBP8闆exSSu]P Xl֯Lr]GӡJo87J|1XtgqgzKԌ%nX-r@1fmiWEWof1 ى7֖ ̟oszq!#Ժtt /ntBANtt/M_`_G/H88KɂSm H27|QfR{Y Kk- |W_=ޮDUB> 2p'so: [?V"→Q<\SH):U:xuGb*wVD_Z!#1-._o阇f^zm &j(B'3.=ja~28!2Wke0ބ%cIs40_q 6ko;]=;z09 +ƛߍ/8 T0+_?uyaW ޜ^ $Z*<׋ r)*nӕ-P+HJb iSבX h>ARkVۧqV)JhBth5\OxԄ+~poI1ȐϼIj^ ț3x 1}r 9SYwιO7>8s b,s[%b52 }8Dn,F(;.FoU=a|ev}pO昑jәkG}')- !:_,L"qk>U;wfJ, gnhbIYSMEISg n[:-DgN3lD*$?>z'D XWZ0H^cZv9Wi>6;ܽL=QX-s"o}7yI~aD*@w XȝV|Fk&.hV 4B_']cȣ3iƌ=ŕ#Bd-eĤnlˋ;V@ ,xm*BDkI4{Nje}1培xabGgҐ:^b*=$%!)5*С"M\iP?^ y8=!RwsO=.\R: |#Diԩju(貾5-r[3ܩ&Btȟj۶V7JM`BPme7U'' rDEw%vSJ),8'1SٸA;}ހYj;SϹd5~_FdIf_x/@xM}ph|SnghWQ'5yCpJR|#]KG{XvilT5e}C3SJ A9,>! Y ]tS ,k'G1~P,=}ŅȜ$lXFQƑ]O|VYSSE'".%&ykʭ|Ɛ!$ݻAIzу׺_礼M ??hPBIÎm}=V0-Z{ƼfV9Zm꿢Ȳ̽^3_6̜6=/k;VNNǷZ:wZ *Bf\zL\ѣ"U՝-$!=. )=TĮI/߲hikDVm,iQGe|>&5qbc3/m=RSWFc~3V}֖1{1%YR`F]bbzX,VK x"^ vW.<ok NoؾP㣛|aԱ-V 󢳉q9)楯נ w]<%,e# M۹19t^f SGo׆>6V>q)_;wJtߙn 9:$CNcWRYPA^vnQIQLڍa$Sq%s$zݛVHO}?("WQbfz䈞}>o.8]4yٿg{ JL2fM9Wt81 e·5aQ?4udŴSz W*%rڂ輑=M9)e+;ȡ@8҄X]7oU 9ntW6^J9\1Z"Rjv$B hSQ|W \xg^ +%@J2`}|M 8^V))e^o_ mVcKU0YPG'’ uWqIvVԸJ|H`/ޜ-RB4nˎӅ05M9IJSׄb[ZIAe IёքHLS(WfoR2$ p0(4Wֽ|Q݊yv9Gb_{d6a*?5I3 1myX\si<ŪF>ZkUqW+Ψ(2dw9'SݒG?}Sn7 p$3Qj~ U?ST'i#nNeC7%mJEtO盐nsJ֎fOܱ5}Ʒz;jP&攔tZJo}U5O}-o;ė5g?;S"ęzY a2YFl3zk~u[܆va5.6$*L'KEsm2-,qo?I:r IS~Ͻ|ۣQ5BM<: wc#Uw]8MF{W .V?3`@!"8טXg4Y4t7PZS˻~oGFǗ(o8~ܠA}GՕ Д8APuD:HN\Zc fpŸ0?;hIDAT=b[nyƔܼxE\)#lһiI=驽Ư.kƱ.ak&[rۿ7tKI$n4M%' u_)1QLM¯&?+bl^ިo@i3z%篑Ҥi#2TF$J|2 IKz4-=XZ5_PgKB#AU,]5g( gdw 4PPQOl5+Qw~x7>YQH`BjMKEXlJԸ4]h3W^(X09?LesK廿:?mtaJ@r#qkV3^1'yiM0U^WpgtR-zc?dfzH\UPݖ @{WM Z0oA59|{ٽ}W#]Lr$b|JNxُ [54/꒴k^}snEԺ vgl_nw BҌ75*隔w;~l؟CjL4A`CA~s~S(u!VoۍMMlwڧ} i[2\1+q _pѮ]5/>@-e(Rz#R⚞Qtu8/o݇(1g^sb=fHM_@xmic#5ƙ 0 %2ىHe#= t / w1qjC \.%$[ԱG ܱ~Wi];%@3_d暯W4k;%_IfLۘ|FUyZ ? (0H` PQL/eG^7OՔߌ<s/yF.TLr""{QBWVPKZ . >\j:T˦SC# EbG^ :[7_|㑴u<0M;m@*)PKdO2R2D'[T y_UӬA*IC b^33~bb!L&[sL >KLP]ݎ`wW褵y/:DG].T$ S'>RH1oiRbSIBdM(j2cHFC:@:?>21ʁ"_% jp$ǴԽYڅ&qV:M6pM³6ZsysK;oٵeNƻVl4RE )Vhx~q[SB, U d2uqOՅ^Rbul:ҧwgyV%.dqZ1QX׋RN~!DCX{z[(?N 0%|q'Sg*a Ǝ>@ |ƪ⧿?3{YcoggP\zuoRP /7WfUgM '^$ˍc;fZwْ G AĵO"4 5_9@J㎪!ؿ3!g`; Y 2UZ!+?5>K瞳C(ݧ<ѪMsqYcb\ FJ)~^bBa|pXmpN;iyEr1m,>ɓ^CWN4FFs{=8HpXgBަ|hjLVrmO=xսaM~o+?a=%*acQl:7jt<,ѓwptcH`t:je8l@?B5QQ v!*J4b iATG %$ )c_nEȆQi|cކHoD&ER +tN#5*G&evYaT*0`P1fޭV`?8`%U)2@HKG|sXÔ6TŶE+a)kUc`Z [W2"=*F;F;v 4az_w!(JU%95 vy &Z>^*vF%yF9JS }ye m<9)''7ϸ/ھCnΒ 8 &lwm^vzĨ} ׁ)WKTowkǚ׃4q!cCK UYӨ"e/6)?Dsd7G$`J",Bߤzv]TL jC+BEP\g5 R\]L"g Km#1+ pw# SnCp7{~݀QY^^/CkK~+Ox5Sd6EN0o@|ٔh..N ,VKWχa}Ţ@mOeyoϑCDŽ{b.F]W%)nxU@t8XQ3M0@5c;wG]UǚR{((!oDu%g_/;gft{suEmn{>i$7r>o۷e!E\FZjjU6pA!@Jb|\jB|BIEeő2ʪj]:E#75{Wv f DJN!6ټַ[f3yYw7ڋ88Ҕ3jX#{WA=P$~e\㪡F ;>Yx7ţD5~fq)#ȭ#y퇎`HIhh(z%E-g1񎉈m R39m䔻 vU _"(HvTF$fXʠjsl5Ί$b|u?Dc[`}I>WFݳ@sP3tN 'v@fxcNv^1/? Uȣ4mJKH@ '^:PhAJ F?sX/@z$&>6v =͡Iّb2am^\?Eu&4.acoʼЄhHCDeR4~8dAFWH*jS 6WfA @‘^D8+v (No_p=@(&^Bw wĖP=}g+YVE9P2~`1+߾Ĭ-Ǩ,1waz6m-&mnֽn__z1{RnI XrAߎm{Kz(W"( u!'*i4ኾ޳h`fiE25 ܶJfnuO窵{ 8 8r͜ fܚ5>b;/ ):&àǁ k#/da/^IzN$͔ݚ YW꽟  M"v9Xm; ݃ JJ; va=Q%e]C-tJΑZwHYEEHK1ӆ") b%f:[.?5P-·[L7}*ƻ57%ÏH^׋5MӊzQv o z4(!4[LJꢼ.[TE!mG:cEDoEHiA\nRKzMIb0%~I :Ņ̓kˠjkL5qoaW1 *b9Ye=dz9zp0BIM1hUsBB? s#ً$d]ޕ_U*O'|A P Qb%X:|(x<(TcQ=cQ(fYw$r=}DO4ӸSRN-X{+ރxͫM@7XXjf,'.1Ri8;5$M;j@ԐLQDPkgTr isQ^{M1yBM:;-ؕm8(=8WRdR)Ew%SR %-TkxDi3+BM7L͢X\uadWy/n(ybrz3@,$a` <;QE^]PZae] ȞZOHNJjT7)-$h4K7]'aPD )(֤}U c_!3IgbѢѴDX!KSˆWHMcwkf%4[o[kbWjv*/M ^ #|>bMQ1iӀ`Tx֙j`N{ \PﵤPQG{>H'{W" fCnu[(DQXa̳_S 5n2s<[rKH,FL=NM"nkw͒Α5W%pZ" JyV@m*2;;Ƚv@. vor:B"MSMzŪXo5Z%*. mwTXp/3"Nf߱NIuL&IL3vDvf[0FΣ~tSk-i(*3:6a$ҔXl!8PnEQn۝6lv[ ĥ$3m|z1*=bj>5`ǡT%4l Q3@A"Oa+J(vz6;;hLxK c < b*G+/^^Y=.uI{ *sBZ(CJwތ wGbƮ.̀.E(.x=iy#ߑD fƽmU(l;{ofGVձvM:ww,@wIaA fza` x Bvv;ZUiN{wO޵Ow]݀D_26U{f;`˰]G>f!d ˀkx[ƚXݥ|h߼l:.79pWJ#Yݓo0UY߭7b#VTKR\[Wo~2R TWpխ#̦mgll&\ p; d5͙Wf;"qƞp|V1Ӈ315zފ S`, EM9e֙5|Uo:~0^7 Neu'1Yt)ȵueAΓ=3Iѧ #tYR;{@:y8@RFF-fܘj@0c3[J@]e\`YBݫ";UC%ϷG 팸8R<ڰ}n?na^ ` PD] 4vݴhM{#RW}Q=8Pgɑ9n6Y,}.##rJ1Y+LACV }yV4&XvP ȼFlk-گ6WMSrJߡz-ww;ɥvBﲭMH*dJP]7>`mUgUon|M5}fl 25AXӶ ԰ڐ+eDW%ԳLw9Q1sMPyl4B{fi_ x~IknWũ*?S$x\ԶKUj hL0<`A\OHbb"u}NR*FmXo~{)E|6e\m2q1=%W=Ls!/7|?Vlp|OVMפ[UT\s*CJ\E*wpU|BF $WW~<~(|q,2J w)Gjq{L|<{wyq^:mjZĺ0W5ZՆ!?>C~݁0(.e綽#p!en@Eذ2 蜼P$m{sbUqd"cOGb-8;H&ҟ[%4~ E$j [Љ;z^CI]/>pn,M#df:7U]W)FLf?=:+*tNB(?𦅓;LU'}5, %b eو .{b+s6_7y1',fm-Wp~ v{0j҂2r,R}v" SV\ƎpnJv!l۶/)=@MeMHb`P_9 Y%N$SH$A BG_C\R2V829;]B4l63KW ]:EsTÉH\kF8\ ՈZ2(f佖OE;n" *I4s>HQq}Wp)f_r4n+o1ϗm8gR.l/EqaG*A+U3Yp}\|@n{ߩhh R>ϦL:b]D}ith` T-E ^F[y 5^hf.0Rqqsz/R}fIa4l'{d;=.jΊoWML9N^lQDquDNw0bV&[]ƚđw?mFl,Knftqd>O Q8WNnfjicww Ƒ28X5 wRut[} ǗQLՄK:/ۀ 1qW:*|rwR rU~wcz5#[6301@Y"MC~R&pn;}TROxi¡ 'eeŻ85>~UVۅa:Rr\vڂPh%v)I2G#QY{l)55ʆa)6е5>.)eyh;bhpYnB5#UKKgRp̑:瘆5Kfhuv8urg]<mV5>;jGM|/N,k?糱,jIVq(p_Q4oeSR,\XQ1,PcpIqZ5bt Oxfsۮ,gA$4<R^lqpR}-ɱJpe02@ƄIifH 5tiBژ孆Lh-qBPe"4l 2qǻ(3x8J; 0T xMi`K#@9c:xZ25$n9n`TEbr,OqjW?ܼA Lq9DNj&|mq qB=1AI⠰i_oON=%X[ONط%%M$7!AE րU/߬\9_  = =r5zU!}{1_oP.9Te wj{\=abri GrŔfK}nrll8Q"U3پ @FT-)K'.x /`SFvVC~4FpևXSP]exZĠL_Oms{رt4[~o۰DumŎڵQwzDV3hLn#dH4Zs݃FpqR=[yI#>;tG p>۴_}}Yy3Ol_m5&9^=Pdk;.1vVlgZB|1|.N Æ3@  N Nh]ڏ=Pх;ߚx12$mʵè)"mcxۅPRĎ;N19*n珻7!3>̕-?D9^ߖJn>|/VQrQNm;#۾ iylmydzQ(|[ !ax6'>Rr\.7"V$!X[%9@MD"0`ˊ}aT8g>xQ{1;^3U_Ni;=rSN'*mX:sDغ>&.75*d)|BtLZ |]mpyǭcdt_Vo8z"ݻwb{\Si28Ө5=5Fw{r).|1FL;'s5xcOw-O%ض'p#n2@Տ86{)N~5'ǎ$&}QMq{EW`u}RMu:@y@qVWm`T'7߮jT1pa/vF_ /3 YK\<zхE-uSP-fA,_-  C!˲ - l8`LD:m -otK\}`?iG~V򓦪՚FP񉟖C(@Dxؗ ? hBJڅ êxHMɮ|"P!XqI)b\д YvHE8R- ||]F n= ɾkם|jЯA咖y`yy)%We>l}Gdzxg*K  Iڀ [W D?X ?:ªui?K66~Y2U薖[Nm~Ջi3>ڿixK [>Ba 6rc"m?!F_ 쮶]^tM2tZK=,1$ɪ`EmPPRP2>9̜·TߤZpKMr|1R UN/}e*lpo6j_w(xYDcd> 7.5ITѲӘ&D|P ՅʬYOvf;.g{CHmux?Xzap?@ IӘ.b% Vo!SŹ_,]t^`?6ږuY86]чDD_ ۶%$pU.Ͷj:}w pOCO +ݨ}}$eb8PުS 4ٓ&UD+q *a|1XOz:v (D.>q.#ΈS;=X?=v@*q<xmbjI07ۻG[TXx 1fDB|(pqCZw= ͫ|aqm80t5OUhqєI%p?2*U_h!aUSDw'W؎%# kA@ֺkjp%bG~Dl$j'rp+OerPw#YIBg]̝f]*e~K9qvwe<_| r޸̌N+ R;epy|Mw겥m'2 Hkr X uRo̲K=!e7-3(&xwfM}AM:%WpUybQ<%_!|.vcpl;u  Wku-kmtt0xɹ#1n4$>?//uT߫pQ'A( #BBt[7פ;Qш.3-}Ą3G cm}eʗ~k^zg/DwyhF+G|x!%uɚC2}RqÇ |zhF>[#h ˲ ^ 'L2|nso$PFbL1r~jf@˝ fRxiwt`as%b΋jSmG@Uf982F \N6SLTN}E{#[),s*œsn$f]:}~p;^;P%ʯ1J]vtq[^25QWmnQi2vY_/Çxߡ[FuiWIFUdK]\0w]dCB #G:/" 6D.kWqwEyK>n!)~7o+t@++Kll&-B*aN?C(:vO%xu֢<Ѯ{8Z"t*[ew~CׂSm1i-|8ֵ@U=ym7tP0̜]gV<}ʯE_~Paw|DžiNzPgz,3{pQy裦XqK\?QNUC^?<3ZG _04V[WzT6W_5+HCGՐ} `d_ wrwAUSόϸk׊"".UZE\.:"#FDDĮ;nu>r2]{̘1Hx ɢ;>ig|6_}~l7JnSg&'VtMـc6tydU,d*GKawK\U > $D*:T_%I#+Ek$*)^Nk{|;C+w%{`XqS+(I}:?(i;9Ffpڐ\U>_W6ܢڄ< Vv͖KxE_H25G4q,o@.{8N]=zaG*=~w;Pٿ4?RA"_L9**paO;X9PN?`̘[/yv2m׾m{.<ݱ<~|5֍PU!ڈQ8uun C0DuL$1;Π:p$wxe3fLf$9MDZuz^@8>y?޳h)V0dp&ZN̑wg<"U:PZȴxgN$5}9)z]b3i4 oOĪC0'7.=U8y,ںD0$ϹcpE z\UA :&4-e_를.V7>l`4?p#OuT 9p ٳ zJ(-x?åy/NAѦ@#Ϡ֞VحεAhMq&owJNqbBJr< \y9{ޢ^2e>VZ)}0ԹEEOj5*#-9rdOqΰ,k%Ț GGc9=3 |)o~GxsH1Wa!iO/bچE%#zc.[bhv.͉~]k5t-y}sl:v"#@tA}9aw@ij/>¡IEn5ى'ŋrYQ>ugC~5ǖ4#OsN0Q]yF7__ݺO>HaŬwNme&`I 8U `T 6!dOAmh>|hU]eT%w%kv&Q1N=kW})]7}=㩕kqXTQr`sO wDk];cVk=(ctc,\h B%m^C8dv]3 6 '$6t{ϦBO 襪҄ Y{ڳsLccn2&7ALr"Z)#NzNzJFL%G䰛59"ͦld ?v%$"ջG(N rSUkݟCrغjU܀Ϊ]*\)?{;0yԳs#dŊvX4+㧟~bȑ9}%+gLt gQK胹}3͸1^1 ty4{c߅0uW .ߍrséwւke˪vEM肝f.쩦)qh3 #YU[ _ uvEE۫' bKU*v'vw"˶'Ȃ4#w`_?ñAd*|6G:6Yq_㸜PNP,GŖ9>&RU ۜqU+&8s/$(,:%FB (L͊ *!ZCL#xtXbX Q]=+Ƥ$Ui(X /fHFӸߑ4lKqm!XChknq a|1{E`׿So4m ί!=SţaK9Mg1|gY̑sc5Ԥu1 ~?ڛ1਌8kQc .>e)6s0]܇3M%ll/̝MDK=̼84軧O`tឋ'ykGNuPW|b⒥?{LԥރX%W;)o>#|uGz <0bY:<0^}VU͔ڤyqr!pnIá]{;ڲ %5>ge'2\}|a(ݵgǿҗksu['@@p0brzMeXq#uA BQ6S~<.WR)pZ]iܑĆ= kw$H3 O@_֋&}SxμL_8y%%: LzZbkQ')ɔsEQޤIT`f|{;|Nsy.#bHf.#qy:1ŅK:zX~ZY6{v2a{'$% & dvN5++jqj8C'' UouJD{IFUGay%q/޼dr_vVYVZM$tuDjҺ1} [8Xi-y4·1Ӗ]ba>-B}{r\LC)ZiӆU0mذ27eu#0[eN䳢onhc0v{LCZi]v~4*c@yaQ&k5P|U\i9q+ӃeP\ax>^Ѓdŀ\?rj9"gRr',;kz39*K޺ TE/h͙0_EIEUxUj,W7mekOf`L:(DW_ziu/3mr<^Žp3 {Ju'8QBD/Iѯ}e8'-Za“8"Y"6#0L  oT9"TwZ_Lg9pV*U.ͪ[sԇWa][t*eRW01~D[ӿ% psqzW[q+tN%ɇi@em{ C~#^\t7:YZYy}ʾS+Đ^* ۽6 1uoai.9U%k>p琷gly,"N =8 sW?Gl{̇?qbj.ۘ~Q3/]Z-!.qq3#!.;u!<>VCR>w;eQ @\`t#M"@(bhcrR>j?|Piam" `V6I."(2JT϶ĽHčQU ${R&twhEV"(;9J6{<]ҙ7`mI٨2vgl'Y[$챦~?[=qs)<]Ed.y>]Oy]UE-eUe )p!M-ޠ6pqK{{]EtwD m%%(ݺ\.zP#.9ͤb1n p=H1z 8Anq@)Jb(Ecm37b-\v$p1$Gr;sm~'VG}F3RV5?uZHذ"5ƻuUDV$qCOq5_0WnV穨9\kT6T\I7/&j-}me5\u:59G]x ܶǟuɓ]2KTP-8$WO9`oya# ~U{],OIJaDrBtM}tI 1W.d޺ | V}[ ՙ?RPU˭?L|{swqޏߏ8va_Pf:ȟL>v7s9YM hrlK{:K.>ܺD<icHڌt "q'gokX|XYwQY\s,My_ʯMCɁVu̞+|j<4{VM%y] rpDzێKh\,MGTK"`8Zr+%@mpk'xM c7~oyzj;iHA&J*꾏:e7I2\\_E |hNN8Z)_-BU@x҂KUu9MOڰ҅]" 8h θ)4y̜69s'3UPw79X x[e5gֲaWxpùXa3we%ZY+|."2Ƚe7@ 9Eko~_" ,X4?,u.ӕqk~F9&d7T?W+V>[G6XQ܉5;z3k/Cjp9*zˌǪV krIN± `o#KKr㼵'5+Nf_]ld9I'UX3(_Mgs')* \[6ڮME2mM jkB 'lplq0qNE>0 pЀkt\|~XͶs]#N棆˿5NZ|x_}ҰNfϟUAI `GɂGAWL/ny^?ƈ.~l2@xgv{詋X^N=;=akX>޵CHy)a7=ANR")=\)w՛d 2 rTy7]z.ڞVUGA{S8'c@Kx`Ɣfeݽ87{QGow"t* S+F4I1pkoO`W >WC2(e({|6-' 3;y?yLyqYm5֍Խ.,r9x XZC$aG%Vv<˛7L"h~ڬnH 졨2U=:q.wNdeX`t%@b^v6P-M|rvg\Zr*kxjkrl Q&lez&7AuYWB鼜Le\rNy 6e(=(Wa<9`8պXLc_aR6HRW1j|[tW2r{Fϱ=9/rC|$7;\W[4`&b#bfs|b [i7#}2٦ozě/A a7{`w+Ԧ,Uwrmew BxyO q {=ߏ!8х0VԆB<7%+/KW1W70/&ۏ{1aoήܺJVrWs?{)_hm wޔTհ|N6eH"ڳf;qz^FK.rx48d/5K'ۧSSVfAwT>5t {SrA•%xS5E+ԸAffm2 a)M"bg%%h*-)7cSOie¬^(=K.C\TX)b+aD } Um}e/qu-PgVWb[v0&`eM$$X]IUUڂql|<ַH}uʱmF^[,?Rgc^e\.Y@Y\]W۱G2-&Za TJRUE AVNd q)}fe%~|-\ F1'I 4ʞR'Q 9a!63O\zuoDgECO=—na>z-TSV~mEym6d6DԈkYW`{sIeaB'/AE0L{欫otW4Tt d)n t flG9 >Z`0(-1ሊZݷ2q.zt>=yE [3Oܪ};VՉ2 49^IeDɇK,`&]S~} ga"|œj[F luҥ NuXf'Cluhؠ/UhZBasV*^oɭK:ٝ⚕T7A+!0!puy؉Huէb.c;Ι-!4M> 5l plM.{+-5aj cw1 ätQ㱛H-ذTU5VM)YV?ؖ;I0:hq? r9{^ftV%&/[>Mߢ}.l|]Dzh'c=K\" bu؅k]#eā\G #"q9t . g? .svg}P@8ec_ɅU$[U=5{M?չoJ_97o#=1$F"U_GNz4{LacE)aʴ[2j*yߪ*58UqT/nqUӦ)|:W IzlTav doGn:z0q, `4Kϫ[v2KTK@6#id[QVBn+ ;ݻ-[O"M%mH 1kWiQaU $Ԗq7;rNugxqXnW#>;]@s$qg0o ) :M=:{MR;!':+z'/Kc!Bb((m&"grfNvOy_W)m{. u?)!E3]%:kh)Uw{ qPEFm9oJސMKNCd/CX[gn4@í.7;تWIg,6o@l.h_kFTOȼ ؊v0aHyq"9wB};1GW>y5|݅:skR[k]Lx68m w6Վ`qydI>籺&{s=?9x$$x9*]/@8ab<0w}b Nh8#[ܷs&&DgL_{h~֏bym &FStM!$ H-?H 7k2HNNFNߐ]XR֍3rJhN[gcu@cxvZצfX-~+Q^YWQ^z%л<Ğ@talJ60ĥ&8̽W5Txzɯ.%> K_jUCGxTmE Zpa(^&K Iy9s"Ok'KZ.{}P^Spu{ .A%qiMIU e -R.;BVۙ8t_{uuSNhrXj7KQτڊm;B3蜕 0 ndd& 8MeXz?pX_l2=ދ8s҉0_aexX^LmpLzۤx=(> [噠cxֻm՟ׇy't^!ѫG`guiT+sBoL;쒂/eGR'j/YIhNL;busz-ΌzWunwNRz<O{߆D.@?o?7Kנo8(j-6Dx~[ \;]~76+ >=&`>ᓟ|}ZXE> J<F -|TӟMt=%9 OngS^DA]Z?n&x6A/*-_uxy=1QO`g˖22Sصc/MtJ˪sxdG5pugUHZ<{Lal1Xi `?2x\6F=͸Q;ǡn$Nj>gݑ]<!ZTBE[_}uQ r3&ӑ~dҞ@r]Vq64jr `uΡkFյsʌï졅hxUv_ kKxCb;qyߥ=fe<5Fq=k*66[.^lUDa_lk %06KvʊƵ;kՂmîuqV7=<~T=>O{b*9wW BiY1LDNEǔ7%_+n$0Q4|.~չGJPam9m@!i/|*WhӾ` 4ʒ\kGZUg| ҙ#f<ݠ.۔ Gonby9Yݥl-,$WaooGPSQcGTg,B(HIN2 [XdSZ3n2zޝ Zl!H"13^W%m# uUBѬm5ec)iոwQU}_ o}ݳt*:K7) (ƫZjc%ioP K5q K9N>Mjş:Һ>,)9ңpIu#OxbE|Fzf<r@#GZDf)̺m;?㼘"S~yҩUM< c sԭ[ܟJ&Nt?A,_ U4HM@d/@KC3GIxP5555>9 <@-cժUҼCxpy7̗-[":`tuT_PrKEDxr%?Ȃq"rPcy !V;cct}4\is: .[wA>e.8orhREq1kRQ? s/[s"0_AN\?v жov©:E|yrZTe҂¢#,UwrMuaQXQs-7xym~0ˍSJðԈ9c7ƅJ׬iu  %0? 0|_ǩޜ}%w]|K7;-Y۶1bDaժUVl, óGMiW9{N/ {D3DϚʜ#-j" *Q=tȿ[6/GClՓDpT j0Qݰv?lw0%CQdPO\:_mpki[Q:T  L2\3?wb o$q+FrTX^4Ү=) Ӧ[\^ӂV!)p|͜ Q˓LXPŖsPE(rݓ{#>鵒\NzϧR XV=]<+vۻ>3EF0~$,>;)~uUFg+&kc~ \+W|xeȑz2>sD5q_p_V6uo r{.v-Xr8v@g¼anx1.-pi:1l_t0&FaCn,JgjdZ3akǾijUT_ 7*Ո~'Womb?HɁ rTk] @QdЛ63mަy,&qK7?f-Gy5/GwPi7 zy<3cq(.1ۈ{ZZRZܯڬ7vlv<y]fmXu{l1mS21>q޾`&}St7FL\Xx9Y@ 9c5b!7݁h8~+2(A*$6 Ql/[gpig.DQ݉5wz_4a^;x{AM铗a ܠ˼ $g qZH*zVQEN*O1dQ%fRS?\m[2|Am%04;ЏS (/ L5 XƠrfQvFacN4ם||y=rGCh_Pf_?6X:p{@ "tH3y-W~1?@б 7f̘HOX #Fq͖a}ȶ>ڎl 2U8Un?! Te?PZ\;9,ݮeGoSg7]|N&FofGUlwqqt,ÑUB]Ed$$~LU5tm#!By)b~I ؤfNѐ'X䀱|$aa"bxk }q<hQeeDU=82p,==}A%hBQUڟaǎUBpM8xǎyݻwZcs܂ ۞~}A(9eb=;v϶,o}nơKmizki\ꂺRo odi#ZT_OVz!}^x>ÇO{E$IU8^t6Ĩ vj*!"k :G4ϊfޝ eqdf,,mߞ6ܰ"t 鍪肢N-L4+r݀&jh aED&-N塓%WҎ ER({>Cՠ#vU")k#bsVPGrfȑ=U570NFOJa'ضAD֫j};I\YGTD7OD5w ^R;`e _M}0g1wT{RZL*sCtr><("fNp. ?2cFΛĩa̧]fۭp(o ar 0^Gah6~^»O>0lf*$a(A7%ק,NwsY3}xN>!Cr5fYœO>ɵ^l?ofjE8j*^y'. U@3#FؤZrwH;^Y4:aM@8,TUێ;.ٶmۯ{\۷QdS9"ަm ݣ].;v츻cǎ D4hBzX=zckZ?m?s92o*caqEVUט_j}H鸛H_]Kq뽍g 'c}Y]х]St(cQ_T1v7pt @N*!aiY6|=u'_ݬ]vʳQj CW$<1')ÁTDirPdԎ\|9NF16RG< "1޺)!u_4]0,S%2XX?NF_7L;R΄1|-}S-X1R8zU!MwJ_ Tx˚9B;㵡C7MkRSSMpض fbD{( ƶ;;>mKv0{&cFO[Ⱥ&+=kN lШ :Y7 =Ar\',(*txRm GqqD~,%WK67#ěv4y#6šxN\tQAC#*?: qR.BA+= Z?SL~_j՚fTZM"(G8`FSf8S~ZyyÇa)._G'gz"]7oY؟➶sѭ yլ'VѕcbG[T;,pRiqQBF s ToE䥎| | #03K$vVѪ\TO~to%V&Y<2QmSrt,$gfǤ^z&aiXi 9z?DEm(|%'hoOǹ3ό9e˖1f̘X5j+Vh%>l㧟~wW>[ӯ\r73G mxg]eUfӽ B&TTaJf<–?0>0iY %PO=]f &<'g޽]]֓𞪞ZM!@_oT.b_8FdsxהOٳ4 ?r4ݔnJu:H -~ Ac;qxCq1 k֬Y5r{UGVh3 mȶ87h[󈌝\|?mLOn9a('=O罰Wf͓Sڷ4;?`bm"DR^O7{b4*Q[ ZL[ڡ/b\X ZYٙO#m77xk;+) ̃^ o_*+eMdO'_NޞPKR>_pكz}nU16R37/]b}~O.X=Oi*$Hѧ;0QiO*j?GjjSq9ؕ.9! S&Erޘ~DVi;=?C$ U`A%7R=GW)YZVs7Eȥ@.ڮHЧh#"ūzb诙_xjZ.=sC֮ɿ:f/UԴC=\XZ1k)^u?=̆!͂}Z_F+U^}(>c['ig;0k;|~M0ԍۂ:-/^ wu{8 ʝ< ϊr3;5&Sp&qW#ECќW$*jJÿ8sBًr-v7D= ܧ3)iՆA5gfl6|Q"O}rW>Էf<߬7W,(_-⪓'uP#ġ{Ҫ%XvTy18w#Mz}TP&(?$P[H"Վ%"ł:cj^FA :4cNID|ѺpP$Be!׳+;q U2zw_}-Sm sy Gd&׏s:Kt;X!hFܕYN Fq}OnD۾F1S/_1OAҢE b9[ bҥnqƎO)U~Ɇ20%&IfK[49@b_[DDw,Gݾ}@ ^CUSm6?,7?XGue5:8!.>UG;'l.A<u`ŽoC%ۀNݙTlMIzѫ8tk>0O #_}P#4=el)w73pK0'\! m\sf-vzN)7[SƳJR2y0R^q/_Ҋ\X[U] Jkk̲\&a605)r] 6IIκCQ?YڏN_1ob_{R̆ !ҤdIYT[&.Z'-=$R=A*#^&A;7{=LUg BrrUU3 L췑';;K.^tGvyQ}C/iԥ{~Ӣw 1M*U0!j Hxݲ#GSQQ7oy&?ӺG(LS[yvz;nx.N ;]L0|R`/Ĉk ,;~O7|]Ӑњ26mTx{g&2{ގ {djNhFGܪo)\w&v:0_sDuo9rwq_:_|C}"bjlM]˶X A.'a(*Vf2*NW~Ҝ0~oE=Sl?P 3>ЕShJ׋*.^N %)G(O럯4K/ Bq_嬨QX'd53*++Ϡy+5o;\}R\\?n',_P(~w!FhvÿM7Fjԙi ! TU_Uճfq~)/7=4ke1 8U)ϐX5ͨWZ}+Cuq )-h[(9ǯ&kp+WLN,#؁+}{SNn1p)m+kGN htF֓DŽ'pf92&DVMa[uJqX}d$x) ؅carvײ&8';yEGpgwj] RWQ2R皏 'u.́?I%$BJ)"Ό 5 ~k9 Y\θybO+z ݱO|Y <Q7CnL,KqC 75#ҪByu_w|UWM>|˵RDz|WXqa/B4EU+V\v>|ow+pBs@AO(ۖ|˖uH-toaMUKo (9I Y6z;zv^3;[\{SPtD#]2CqQPܐ F_>{_Ty0R-P!&:.>vQ: = [l-*q_mIq/Zb s*Q! pȈ#"[k29A#]TUk [EOꍠv+! Qo_Ut* n.#R;<;Ͻw&H&AI `UT UWEW׆=Uw-`w#U HS}~Lz {ιg9y1ͼɓ'3ydN7wsV|YL<MӹZ:_ɓ93ٳ''ON4ˮϧJSԸJ* i3ϝPȟ(~O\zÇjXӂ*nwuY%;y+9bҘ |>&X4)ZDJ_0]"nSmwĞ8N< czn@nq1(ӯF\ buMk\4@_ԵY"zpXj2W>C<a>!,6ysJ^.J B[T>s*[v;oDW5o-REӀOj)aaS 2խ4F)@cZG4uL%FQ3FHZ۠,Rb8 WBOBp<($He̓?nfyln-(ШVƦ}7>S/s2K|"}]M(2J2Ms@Uhڸ4p;+yzs/9t aCѯl,,8J}o-UE*,Lo׵u:]WTņ8xdCS.p~afaZc F@yم8mc'^Z$@`Q;.}&-Aadb p-]Ǚ=x`42Ѿ;l=_"[2|/*?QQtinOQxO;d?>O$QSg_bo 7Z6sMmb"2Vхv wtV'U"""0v"*$"qnvY%rZ@qFXPR_2LaaA ^#-6`F]^Xs0w~)7w|)؃gy]ƊCV:L*N!lhliDgBsILj.4湺{ycbbN-((@DPJFh_oY|{^[;d8Klxj#aElҰ'O}`<iW]F* 1*msm"r(Si`> \l#NWQA}n0êEuބPᑱߗK|(w8{ǴؗW'ÜŰM2eZ5V9`3*/l5:EUVAzp*Î1eE;ɯϼ0{p1>K#FBvF34e1"J1" 5%DfiͿ쏙;ux1Ą3m~c͕npo6(âFjٴ>O٪,OM3jG '$Ukږ"Wh*On\T?4y(R[t̄=(X*)*v[g E:~,o腷vyҫ\6W|\/M1h" G)|ʕL>,F0ׯO>([ ޵kݺu@.Y`/pApEI_(r*Y*zԲRYQ[Zv{cV+PeSa 03>jP4҃UJuu9F Ћ(޹J'9l-,13/8gU0^?w x q  v@"IhQen/ vGahҜ)&trHOeU> K 5΅LبD?ri"4I\̰ȣl(J . w4~ȂXdq6e70 Y)))%"J cRS+99yB0Bv\NZCaE^C[q-27P|wJ"',:#Be>7ܩѪop}Zӑn@DNXAU== .,/l $. <2DrVvpKiD)f|A=pwWDT\Q_TtJTx8IM6Pp? Y&Qxw’gx~EEI?U SY5t)qvJuԥ;絥)^KcҊņ"9/eoy +<;HpZpXWUy}Z}le\qxwŮ¿9w\?m8 y>99'`p8^...q uРAgi68P37o@ _n~ U*@ē){|d0_ӛ Zloۉ@.U/ObQӸV|ߵ~eQ4A/Kby+\2Q0`wYWl9+|+;·l.;:KSӌ |S`Ăy\Ü0H@<'X֙(:#H7PE|Q&pQVzxDT5TJazkO-;^rGQ|h ~>:"r0 6VO6/$2ػzE9'"̓O>y'\Or\|'tСݤ⧟~⤓N"+>/Ž;Q'Û`Ԏ?U| W.!>e-ah:2NbI3iAJ9݋!/@v^ћ`9s+N'sSTNϒ>7N?u|—[^@ԟ{]WT= wذD8V!͡"'#ru(Q-kT wJd Q1gYotЃc}R~bnyeDS}U2=-WOuE^i%]4* ^Kc.]H,!m2;g^()^Ys%%|_4 0w(ẗ"شׯ ^?ul1U);6PMUufCU:ɠ/5L$Ž.U EVЦhSWaWQ*}fş/WJT:/^:R#̝v\Z j&b3 ;{pXq5o># KS~t\rr_ ˬx恵Ĕ+MӜheꒃWCKzf ,;[0`*|@M xq7{>J DާV{&=7Ze w|>/_ч8tc/]v>gyNvOsA]o1!'A_g7ѹVOB˟-xWKθxsc+aTǪб'2BۙPxwW*5È<) }lȶH<##ۨb{3f?ygZ IMEGb&i65Ϗ8*(f-*^a'eoxۋ[%%%M4w$-*\B`՛ݯݰcF6B)t=|W ʹ]DACɶdfܹus(tU[xH ^:9Q[T4|ĶCcz,'Zxu?&8Ȩ@b"#ppc> K.dOqAvWl'y3n61cS~"^lzWY)nea:*tMd_v>}'u(l{Q-jWu+YѻCeih&~I\<~1dER`vJƗk€lpqOӦ)4Xт:+׀Gv`u_ԩR?ﱹ>ɉ=cBX]OX}i?*\DL]R[%f` WGGQ8gZcUsک ַx,*|ewrM ]?تg'ն~C&L~jr n )Մ"fL&xk{D) P%0_{l|?)wg.98m/v .;s>p ;iM= |BL{|?u(?ߺs~z\NW>D,^MA-ASf=<͛?嶯y󼾀ࠧEYcDRz hV+ _1;kC*_jQ9[gґ;f|iA֓UW@v"SpN_]uv= ; B I>t>0ֲsoT*&l˧zt};"õG/9^Tqk333|n4'#3 {x%d(h|FUKO= Dػf9=߲;Pp@,0 ˶Ca|VDLX{_p?p~aPaAnG(,^w,*XaYd9w{Na{#κx)-VC sy~mJ ED uxSdV&^'V zZ/Ē%Te2%;iz<,JO8[G~Tf1E%b`0Y)LRQq4w:vO7ҨSp<\UJPrfjn`E>}S'DjhPg҆} \;iEU.jC1 0 lEb: DJ(]ė5 Q [fzTxih|n(BԠ F 8(X( $V(Zou!>_V^3zB/.Q(=zPnĸ8;$p4;W_qѝ[=+O<u@3 \e%Jj"o#Lu{3m]8b/WPlϛmST~W5SƏܓ&k{J]ޫUx:{Tph YkO_iwW3s5T x%bWE.-{{P*Lq}u}ο euTia~I~%S"ޣ~<=b{!um%#A#]S-6;̩'TU5;lmېȫEݪ'SqE.aZ&ihETd%uw5]?~4 No?ϫۯPHn[. N^+?|mUưKC4=%/_8y3R7Z_?'?cP:?Od~;u DT,{z d?sVEzS]o/>zOpx>ZK ZnM _R޼2ugM.jT>Cg5Е^M|7&f"CA% vF7InA"ԎHF=C>g=IKoK*>9Tz-kj>J|n|ޜ-ݓwӪ"Y\W-/ޗ^<'POΜ7бNC(kh':ϖLh4u @)-^`p0mc?ѕD L4[7z#6%Nsx#hDi- |qK>te'\m;&: RYӼ0ޖw6ɸEMVkJ{&g/5afGN<輙TKݹjG8E|ʩ^}{+sE_{b+.jTIJ ˲nز̜tL)u|ocܴ'NPwSW+j(nū;9))MƘyi=MVKII*" 4͗DdEFF5m nΛsf- )h_8eQJ/uL2UU+=-[M*kOPtLNJXկWs!ׅyhwpqG1'"|[S(Cĩ,E@Q{/ ҁ:ʇllU-g";t奫3s^/|hV>֔o=6]k/g }Ji) %d(M=vmʧt,na\(0I 4Oc=-ؼ/=48sǡ׻0YE-{@ +4\&lu[ŋsB[C*"nkrCFzzM:"z+.7n ӖkeffN|aeff W;Rj h60>oR}Wi\gc9(zE 5333Pɟ\'J)kifڂ/諡?r B+¼~ 3=c5NW!w> aܨ ^N;QFJ7N͙7 z4Jutꍍw7vJL𻟞4ZMuO̸q pۢbRەYʒ;韔$SU;0<+5~BP:NY.@W56y4yȁiW\4= 6A,,''gw^^ݛ7on@3S"tyMy!XJQ&sm),܎R*a}+s/QUuԕ~q{Ɗ&0RiEW><ֳۤ$Ξ1OV{ .G OY pnPx%dA􄜜Ұ ?'(VE:*6k*i񻐊)E-Q.}CC:~>Y?E1䛖Ǹkoܬ^>>% B0ºUyLY>7hF҂EQǟylI=HKC+g%9 73>,Whb٧iimcEj{/zUI~a)EXqӗߦ2\;K=}e^b<?;d0r &7YΩqQ,/0env0PNư\(k* 雍0BSMO\1#x8Qܜ<0ZmM'W$E?E=c_lsÐ!Cr8#KJJ£0`^nݺqرe˖ؽ{.\x–</Fpm)G-rg4NҔKPMDtRnjcMC{Z?=֫W/Ç4Mv{l{R.(%.xEhTQsӛ,_4ߍtzO~£͐v+byσ[ZS5$0n$U,7Q^BP#M[._=8n7ſh ~EI[k͚(JE*eOΘ΀oEOt笳"1VP]84.> `+70Y <c;5Q>*%ꉒa!GW3Z//7Ǣ7. n?{/aYxظK-!L`dXj(P:KMTUpz$znzZ[زeK)WItuɓ9xҥ 잞~?=jݚ{G#fcӅ*"ƙGݜ %XL}9cikrwFuvTK?~Vh"0O5`q۪Y/L,B&B*C|ǏeC2xnܕg"sAи}tE fO(5OKeIV:M*''ﭶ/))A,&GmZLʕ +}3z-Aj|~SQaOvYaAiUB+N jLiS]Ӵ۔ѫ; UnnY rDC'O]Ԙ3*(2v8hA` 0yA}%HxL*zLJJJٳg?]^^~Ç~Zl{[o1c5M5k4H$Lz){u[9@-)'#`;c^Qã+MWRRRR4M[fYC^I4DQJo>JKKKNN͟f_ӧ=1j& ?m(ꥍtС)"Rm4Rq]vm֤AQ/gn--M9'z{a];_~v#}Q5zhK/p:;w5k׶HDF`t1i%3E$@)^Y.?>|=#T\~Y=Pt+f̘ڵa`r{W[^6@pvUHH|܄{5Q~^NW M}h L|66zo[*^c%|{Ismw؟zXss+ѿDj5"3 "R>ED ɲ홴V&ސG̓gS}jЅOh>q*kN(%_sC !h4lGs갱e{ҤIsss߶m[oDDtI0 )99`5X#55(--= .Wyyh[qk]xt`'O֟zӇjkIݳ*qn19bS[-PD[5`tՐMg=_b({縹+TN~0;@RqY~k%)_ 7}NH"ŎH"\E4Cܫge1txYJëj-ou_(b^[6_[E)tbdGS=\>'ꇕe%&A_MiW٭ _tG9+yJTwڡb7{ \وWǏB1&|y^pQVRӫb(y?k~-Cȝ UEM!YeGV;u+KP[,yh"U!H+Ra x5ݱ [G Y :8tu,^Av-Ukt 6vyY00܆$UQ mr =|RƯbYa.{ˆ_,gwЈ<JqօRwJ *x H,˚OW`|Dvﬗ;/ ҵY%w)Sb6nܘ8tYoNPVV믿Νww߭ڵ+v4644tԩS;viٓ|So~?lB#W."2ODu=4i ]n}Mʜ.]7@W1/Kk,XGp(:nJ^;op'mi2/g2eDٙ7}47|Kn=wunWfX҆ F7evv7jSZliM=85QW --up9w!yA|k QK =LlZ{ I @iW_H?or R_-̕ǘ/#uW4?,WIXr\rkc|T:?O1F|M޿RjG PD6f͕ ࡎHʁu}gթC~I?f͚(PƍK(:\ëiF``*)$''^ ʋYf0;o,m=sm# O曗 :tƍ[{Z\\SNmjKޝС'774ZK瞦iуo *;UO5B&l#;͂ЩVkPF b JNx滷 :!TVFC!ܕN*+6D.`4w sh2^D&y7ġ ?z&pkĆ PuF.mHX#ǡo.ccpO&אѬ@r*(AX&Z~wlhcsذ#֔4F0}.Ѭ9|rx**4.b3씔s<_٬C\wBCڎEhHcEvn\ W׫WUvD5rxj9> ,441, njvyD=)A5l?WHrW v 6,#ōH."1X16V:{ YlJWti΂u| QH ,9hQx[^l6ۼ^z)hHOn-Yʼ+.2M__Nv @Ϥag72f`)3_<\[Ya@E<tW$6?RR񌺑jVe]-NF11DiHrH#٧[p]|cDz&ڸGp ]jJ7m03b.d1,lI}ߑXzb`="rj9.w(+<{w>׶\Ѯ5G;Aԩzq>C+wMʼ|SG W=DAe{'ԧml{j8\-uTEN%a31-W%Ȯ{@\30iO <9iTls;G34YlϹ7wp3~NditK 3i NKT,^ulvnUTՃO|~ ;܆tOVtV%M<BJEwQvPPR|2r' ۨYyۼ2`G5H8p"r~Scc6װ]n}z׎zJ#HctXp//oF\+>T03eU2ѵca%_q[OS& ME=x֧wku-e|4v<Æ @Ӵ7oHL|'9% mަc FO>2,ӝ #1[Gۜ6VH4O0euS4w2촛qw3d'x~2㭬GLb}^K47GA a$u0n[Xz8H^|Г"^ٸ╁IJUź>5yz:+}eƄ59(muC{qꁸ G 0DkRPLrJIw1Bnit:Sږ|l5Ͷ^!qR\Z4(vz]㮯|&sKДbsߡk%}`״0(%1yŝ)e{"W1GZ8&إyVC֔x} =FxX,6Fa ^UFVW~lLi;Y6ܖKÝ_Ѫ}*Qo,1۩ ~U-l][Ww.YY7p' ySgͽO)EO z8͆g=(.7 0tfRtrjf4'+*ݼUC3o]kG3Q ϮG(f##'p?Z µccL4Ӯ>\s\KXER^w[9dȐd˲&vkEMj?KM#ګCWx,+T6lx&))iVfff'99y&ĉe4i0!FĉYt)))q5d."(/ ŒV3(Rm^T TLO~MxH|^E56n d+/MBâlM~zS/ fvگ[WeʌF4A9/H¿+eersRi[jSE6AnPuR /"r?4mVfWɓZNfms#ޣߧZ]Z Zu" [TAMUF״(bfWZ\+(QuaҕZ^"5 a˝ߦP8po B lf:Tj4b~|[}ZᶌB %U%$2/^ &q'?R_JX汚!0*Ҷu3 h>eӨt(kD;)F Uk0^OwI HꞡS ׼UsS 9,1pM_9X čt]X{-.h&>(˝v_~OZs ivВ1_;ziQu>uS->\_+汃T,x+kUp\|\wu-̤8q"'N䡇\)szz;@xff&̘1nݺꫯ߶@,̙3;w. ]e4=`443jeMj׾@D54QGoy~Jm?-{-{" P# r?0U {73?L )FhmrMoP!]'#2<q-'kn[76NGJ$ RwE\# w ȓ*g[l;$4KDk/7e900I sFQʨG@)%qۆB0b›NoO mCOGعo۱{ ms$g7nxaB#<ؽö5Aܾfx.NY757 }p^{mFZx,UMQ|.AQcvߎ{R 5H6 Ⲣ?੭:nvL@ʖW1=ReX~mQ#Qԃ:oeVۅ2,˚Lb={o[^xMcz̘1;w&,[V:g/cAT}; 손yF/8#Aa5ٯka\d4@Nh?e`bƛ&?mW" } DDDr(˲%&&&js$`OjLvXE|VUIUM%Vn@x P< Q +**n&?Ȩz: ,;xU7)^o2gB2@v*(a[_pG jt1PJ4(E# 5ӝ }󪧦O] LW\8.EU;={uǻ͊ǭmlXŀ<`c'(-[ubm+7I_'_ǟJW9wv'%%=edd4r'훥;kwLj"#v/8*,.4MٖE*Y@*KY=M.'MM_~B>lTE侊>,k֬! Gy>}yx^~KDDO=5Ovw *Otx ĈJGju\_PRO( "% g'IEoL0ZM ]%&GfdټŁ]fI{ h$xdx`G7f j {x~79M&Ӈ&Fi, ߡʆ`u[p@rry=ưIDɱ^U[}[[jpr䡄wLa-_jEl+WeyTC rS\/Tm6.'ֳ݆4GHAY˲2ÃT25 }X0fGJ㍩(5WZ[.iRR7H7Xp{+MHu3:"mI^׃>Qa ٪kvEVX$V֠:Yf6u]\D)>UY\xwM(hVڼo֖Mۻ Y}&X@8:LYxGʀ[wjq.oz*fz=Tc>EEX̞~QLzxI'Ց\;VmLd* RYOS Gaݤfe~#kn;`V>ݚY.eŦmSRR,1O"Tߖ O:U߽{w.222ZlR[k_5E1hRGrr`9U߅R2~rr|j79>`xseRRRߋȔEMMMM5վ̯222r̨|pU\\\xii)ϾM2]⋟:t`ӭ[[zꩯwL82߯ QCZ_@]h36Hx*uo_*NS%Ju&%%uRJʘfY[l|iQQn4{oZ[I3R\gddW{X) "eff6Y:%%e&RWSTo|"2$33I1ތMKNN̬iCnڤ`!Zi6o(wnРAu]0ѵкP5ϣil޼Q!CN,kDjӧO… M}:@:m |~[k*iFR3ߜ4B)%n (޺mn´b]Q䶈Id8F7ض4 giQ镧mIMjqG8f0.4͛7 U2d(˲V~Moϥܞ}ɺ7jrxt]{趂LQY B鵯THV  R@T '_|3J@Uw/)g;‰+~ x:ϣzi?z4mRٳWBDhSDf)vbS=ADDEEEiw7onQXpy'xf(MlkT6G/ilUIII)NznPZ=75 4'w1MFeff2dȹe]lMlٲk}ϡ׭RY0==}aJJU"2 XjұMl@ཌ:Nh KJJ ;i- _'K-J4/z{߶E!*z+jy_SR7"R-|vU6bĈ]._`a/oܸ1 ,[7pT0nTJUxVlٲ%))i222@ļX=79hРiZMq͘Q̧v(}eYOOCyyz0))RjeYI[l)O,Mp/jBDJJʋ"bdddl|RR+'33Ya={/ DxrƔ|nuR#yﳳX+AoMKKdͫx,Y"]#BW?PnG^9W'æͤ2bٴ7;i 搜<XD~jw_4!C,z4v5ʌiGaQak6)ʦND|J3m':N:eYߋOӴ36o|^?^PJ] 3##o雜|p|9ߛZ(PdUL(]M8X/k}657f[ub3/8aJ߂9kDh \RSCF ; "ZaaiUY룢:TlNh y$ߋvAzzֻbС1]UceYToޛӇOR ԅRӺo4LZy3VCvd/,۩g-H]3E)?IhYH|}u9,:'dQ;ʹ1YmڅOE63TGj}ѦBr\-)⦖K8pUjDxhEdJ5+䘆9>Ɯ5CyNQO&4Jeӆ(QԂ?-sڈ'u&攞7*.Ȁ(E$nvj;Q|pO-T VVrύ2 ZؓScӻ>̂uRijF̂{Fz 'vA-IMP{O<6@JUǔVL\~tKK"P ?w̺H]z4$Pm7b=ZlL ݘ=+;D(҆S=yw ܶ/3h.%DZ;u}+gEvT4}bJcl{EŜ~jh4,%yuNm6[IUY%2gF0roMd_6n `G w 0&0x[kwȋEG|]',k^X,MM5:C@Txm#_R]\}ՏuC~k}b7Tw)<A{*:R`S>;qXrsI*K b&nݺ9dž~2B||<(^.lBh9ulP4%Ȃ#["uܽ@WD)PODMPm.nf?ԎNX3O`zlaKwDnoQT}mS3SHQ꼘9z\?Ԗ$+ǰ˴TeYMQXׂ@mZoYڽ7 ifcjA莈~i`4;^s3Mהܿ2 q(~:dLEn8P#ޡ~,H֪#d3L[ꋶ _Ң#-+BG["O_zCZPNdw|ը]$g?TJ! ߭j̢M Ew9v# hgDŽw")i=w9gz-/ʖ*Q'xE$<RA]` ~? u2*Yf!li95Q] 0aYn@WK L1 "gj5K&5XA"ui_Оz3R0sdiB?5NgP4|;\1@}n@XR;E $omcI.%yJ̷.yu!h^tPX>h_(A4euwiô{W 1UKA"غӶo)I_< Ч+.鷿{GWQ1JS=ZF )Rp6\C+*h%h3z/YPPpd ϯM>iH>c)J;6)u5@K1}{٣+W,f7[ \S{Jp. j/Խ.JsW|K~c}F ׶̫iWKyP0ZXHtim΅1+E_2//J./+g9ױq6DehuhG3'fݖ6L?3,y[GjTp͗w f6cPi|7"l=n4R322XHGٵ!L?@'''r֖?Gϒ?\(ԠFY<3ܟܼC`QpzW^ŭI tMŃIQq Ppuӆ_4pٲ8w螺FXaĉewyՁ@RSCliggO@Ad7RzjꘆCVbrU!%4/$l"UǂP} Ow |R7Tyzghd ZRܜp$_cWAT4",>|`T5/ݓ_[ö́,WOJ] "Q5uGWV5YdRZG ~+ ~=r6@ Ғݖe:6*8ve#V+@YqCBU _J΍}mLCÞQAaϬx7]s-׸,X.ހX,ݧڮ +mOk`4O;Et)4aT<+qz٧o4Y*\("_qPcфA)bsaOK2Ius[t;Ti^K1B&&Gf&huPTr Q])ȷ# >} Do7Y>3>g҈v:gL `8UE smI#9RS:v_^\cY(s*Y=+IRʽt#8(hLnn7|su]װƛǞog{NKeY†Mƞ~=W?oz2z)cE tZ6ņ[~փ6O܆itGҸRca]P?+HJj0CnG0vZlC 9c wg 9v ߞk?n Lo ;)$(JU*D?xE#,(0w+ MmU\z|Uы}@Avbͦ|b*]Ӵk鮖v_[DݳpaSӦdEtޖWXrNxf{޽{[CnFI^xWp&J=șA n=g]`\G3ݧu/^nӇuswNMLx׼OxrƅguVY6mZmO͸v{\izvz^[_ϝi|!ek: ]]{Ƣ5RA{Ü^Aw|E ZiRJY$''EӴE7oPJ~xSS KGOmY1CA|vdNS:mAtCyE-RD4M PJ1M;˲~l].#XtVIDATBQ\B}/?E*=KYWD˙]?JvUP_4Gh&iW>V*oWwq~̩xx~v+=]\HU`VI]zQz&soU5oY{ʺP0 ٘`qÈ, 9۲#@u\/cFvFAyR qz3/۩ҵ/sӭm_ݰ|g=~sĎ8dqe%܋f!P6%~|ENaq5Wg9iZ#WV9Aǘ6bE=Z. r6T `˲Ț!C’j PyZ\,~[SJ?=iR]EPff撶]w(̥vEɋL1u6{i {(TJ)Diڿ233ڣ1 M>zOZMtR) ,7T`x  ?EOXTY̹XE 8iϫwX> ѩͼɖeZ>˷PʷO4PśOzҐStt@a![b9݂^-E"x }a5}S"Uaha=\J/2^·.:b,/κ|d)ퟺ(L)byƜ(ˉSA"Q~dHp0Jq.؊&)֜*T WwA=T'cRW3~Mo'7[+d%@،2U("4 ƛYϳ׬x8 ˏORХj,T5YHDu!\`j`wK];nY|礽vTɰL'9bԩCCC.kGW]iI;qp?lFٓs6o#m1vF͞yD}4g{EKܐqfme8Xٙ~G!W̸`@Fyco =CVYo[vNY΢PM  R,^mZsNtuRj`spfL/((3A\ "hx]*Xޱ:ʰ$Yjnꋦvm@i^T~kbWWqҸ0u>a}ʰEz^B;tbP>r[9sr?@a }8=ktlLILq8kp a#n]Z؆4l:5:-%âF) s݆⦭Q۾;e~D}dhjaZXJ}2[W= zŽ鲻UI4\{w2/?;IF@,G4W(-+'=Q F g"RS(lp>W^}ˈw?*r~M~8;B7=[p؅ǯO~BN_5n~MJp?'f.IC1$BՔt#u݂*Pe:uL jC uL"*5JYNSj#.@:6`MAIIy|c<>I``][j۽{ `dQQѮJ~R9u~a-c-X_}di޵y68 *(trjrk|SUW;zCϸ( 2X CuTP`鶊 {Op~!cHډ7~ZQ'au/_MgH.r!YdrV-`b6tski}ocǹ ǎ#ޠ_u$}OxnB wiYh",^v}A?3)ZxT3>69.DdQ[owv 957v71-5-eȓΑm%8"c2JX\ƀ* ٥ Ӫ털zvU`E+MC 14#wG'u&飸WV7Iؒ=G@(%62Cw°քf=l1Nv @, uE©vl?.%=5_ZbhCuSYa]Y!LNkOQQW^ ެpuKw(~,)J>Vg]ߎoշ˜8cd*%}ÈIeB.1Ekއع򕍏eثG!w\XA*!Z?l ىYy/|,VS=Q 䪲amN0܋euTu5go) =L)%=Mtj}bܜگoƑ D)iɂ&15һe ۖABf{ ԙs6x݇P l+ Mjѯ 1T:ҽyowާ?9š M3KEBNCK`RbkЈq ]׉ nFthD\*!|㥲4.;U,Fby*9~ڬ <whiy]>mh^eT:W8LgmE%uaH@{a>m&O;%' -x,os2[1gƲF+I20 D߫6hJ!"(MC,[.J&PU~OK%~'Pso*M!ȀJ6CgUB^iGP^2Nwgt͋#$(GG3(ͱbC`6"(t#h~ݨ? CY`R18Ȟ51 wY^-h2r(cQW@WS_ECӌ~_FGEgخ4 Cћ^ |XFu_rV$N똊tj YlٲIhIeM z%7~cmхBHƳ).KB6ZfOk;cuVtY6g%Zm,J-zB+JCP䪱]QzmiUش:Zj]Bnt.Spj9Xj܉r39&da._q tj2GђV 6b8;G]ވs`K{˖~@>CfYFT M'T ,lϋW`Y3u "XeS,cx[ǷHKU &,ϽR|7.ЩW%`?W4 R4 I]zJ s&,Ͻb"R7Ӡ=5W `+I< Vl%/ac99AfV-a` &%o;݆>+'>\/=á^Fwm/LV$Ÿ +m{  x1l(aQJ#4"^4EY~zy \ P 5"*}:~92goeiLCs#vtMx`0x=F9p}zzlϞ}z˙VRRLxDaG": jќ=Ϩ,%H+/;V8(7}&a?D䊢vŝ]? ^ TTT\iw8q\uܭ }?N~1^?+8=<v,˗%"瘦)99\fm t>c /66|׹/΍+D4@\ ^sm g\-i> b(sFvÿ jYMaGqztucY/`<}: ${?ቿ-%(U`hJ[7`nYkMMG5>YFmJ+EwQ9RSUsPJKKbźcc r48R nh;葔|| = {}/׾7WvGDf(eְχUaC|(4ĿqGWms"r+J>aIyK'v]T OTX1&,a)RU1JUY#G F׮[DC)ŝ0L@<t/@ 7rB0>:djz6HkTԈGY20kZiDbX0X.t-f/NyJ'7Won>?w?xy?()9yʭZ?k·?󤥏gcnc[q?V;jR܌l,M8 0wCX\2\`yYwW vL"2=PT\ Q1ii:L̦|G7ma`ؖl6C;N2K3ED"@t!< KD.̬# 9~w>(iEKˮU);v#7`Vq{E_5"gU,[^n30藓Sn}|V:я0w(D^J(59Y]jUmGwO߸t39p*ex3:g!&IR b*񱀋IQV*aLeyFhP닀kP+Kw *ҳ $]κYT 2@Ta@'J Xŗ27UI'J&FE?-k-4d̉UD2l)S y`tV'^0O:RJ_0LܺŸd fFnޕP^n=OS,<8}wM;C@'DƦ_"y3^.;С YMRO_`)ݜLy=w@~TlK2G}@'S,[S uӊ*-[pWuY֕rKː d1 n> @o ?hD2_LrM-d]•%b4k4놧RNL0CVby8VrVsR)P!LDxPG'r)s͹U/j߾VAP%iN3#ơLvE 3AD̼u^W^\W$,,41:DkT6kԡpD+"o6Wʷzrs0u`[{TDLoQCqUNY~χni.p>t=U+ .Сi"z]Vo sҥ4 EqKé}`ZΝ/öU| `Άm%`.yvx✳B}/[d dh w2͵kSr[9 n7qrㅷmgm;Z$$f[ǖv;̌2ZB:4f u  ˯jq( Fo`f>s[mTLiIG%l^1U0ʜrgLA/nNQ y7|Kgdl0>:yEl sU3x̪֡KR]4#b[o 4*߫&|sMa(|"H'T2 =EW=oOzܓ'urٜTu\C{3Hf sXt@dllfjV^a\{O)3L (%I{"'rl]t#""̼3r7 ..CgBq3<]Ү]R$_<$ d%2Xd; :v8}>Ad^GqvVB(/ܼuV uSN>]RgbC`~$i2dw*7= Dhq#N@ƽAq)) ,8kʸ@("]"ySg ڶT nRh,NΎ0^eXX2v9!9(#\\2vTVx4MI_V)l2# )cݻH5ZoBR+ (HLAŒ-!HGCr(H# (%0T*2 (p*C7xvLdr Ct}CCZRl+`{fD;<,I}WQvJ%ӑ2a~5ҩuE`19 ]򕮊?Cʺ dZ=АL34'% 3gl׮]R&|Jon޼Ymsέi׮6QG`f eYWɬw-,,(É;FqۥKl̙3W7oy7_J캋/  N*f*..VΞ={ <<($iTAx @}0dPj0qĈ;~(d7mFޞHʶ3(@D֢)ƙ2 80}[o| LBRcxzh, /O?RIB^~ڴ )4;*Vq-qIzJT_x,ӶFV<ڄh{-˲*e{t^ٿEco/gHKMǟ'֭ۧEQd릻([*R.ShH<ƣʊ~PI[: BC`EuVv)2D|u(( TۘpR LE[kM͗3wl"L@M)RXޫ(ڱqZ*0[Qi @$ v=(٫':4bHaGTum 1QP@yZ*KFiM/x66xh=:3:WZh W`a~.Ż*1A R/$R=v&y8=3]Ûc3hڶ33fkDs#( D, ϒ$ DQK If-`] hp+ŗ Γgks+oր,˟( 3ڵkլ-:tUtt7%%%rY%xZ$-!r^[R$@$a`Ad n&4CAQVsBw*d9YÕ=(M=pJ@xw݋AŸ$?hd Ѕ;8~Q;F2r]͞-Z/`*˪6WĿMG>I*` d @`liHj"9DL:U 7ۭRl6m\0j]qÿDY|$t&p0..~u"9?@훹v^g}Xfo"zgzB1NUrG"?puH!=ޱoCàϲ# |2ܻ#_K޿_zϒ#G PԎ%^iyO?(=CBB 94@;l1SUK3D\j 8$8dNDva s{5 ?|FD@6?0Mpܲ7nlF~-tTvpVR&|Oѳ%7jeÅg}s TL-*|C^z=ݰG9܅e{ɸ6i^V9케ᮆf (4agc3͌kO;D$_Y{4~sïB= `{զ2)>QɈ!}I'2p%+}I̵'x?r#UU "?HzhH,3Rm|fwy5nPi+, ֢ 7宫{`&$%:E@W\vrɠwȻ}w#'|C['I܄S!H˚n^ȠbsqX;̡ 6bT"bZ p=wv QR%0e{Nupjhݸ9 w\`A^PY3_tV g^.1CdH8!NN:R]UWR:<S{t$_nަ 6F| <0gor" }E H(@DEV_:/<񳳣 J IQX\IzX~9+C:f0c_ŹcVMakOX2v0{öW B֒6ٸI$@)=ĀMj,%Z`yApn{vWĠ$'n6(*Ab/Ineb֚Kq9\sp6x97||9׳+ePɯ Sg6nBi=KΨptVڠݼ~3V'31pR0 "iP] ! ܲ4$y/.|\jxM^;XUhtLJz1@ rS{IdpZ0G"N\(Ĕ":29~VuPi\ЁABQWH49bY.ufTuQ[3ZR Ғ P* w0|!J+KHUXJpRC,*0(Dd>dbD&>s>w!0r#WShBޘfE׷lqįaogh<+/@%+;@ԵxU NSX`&l2̈$GJVN4l|XH>bp14`sF:,Jw0h'ٛ~;{}yHU;wٛqƤ-Z4H&: ru7vvtD^a E<`/);d6X?g&@1E<;|'Ze6o\5jUxj.|B a%\?.eC~2ڋFY0av5bd}R$—^hүagš8W#mYg20`_0i=ТCf9*)u+&Yr|y]kUxu s"(a6Hk)mMpL7 %ȗIykF 2HY.p.grS¹,;(4H5MqsJ}ewZ`bHK+nM~%{B %F']^}Dգq ."eܸFhQ A)z4P_`YQPUЧ3-30!HϰyJxׄ%T5iz%TwMd3'ܦwLk"KrM=tͯ0%;쏞^nNyK@mQjh blq[&m+ªk#3 D`l!&*`g=ڊXhN ?& @L m`JsF':X2#!Cf9Qiiul̈?oj@6t۶ї__~^gJ;a]{߁jGub?iu o/)QQ".F#>59|Ӿ{++mfmBܗDc}0->,*P!xeS$g+`:I)ZݚIEM\|DtV8j"zy3HS[/(%B`lRgV%꤀:w!I޸UpMz3J\׿EDJYgK T[hKJހsWo[d4>yxܓEv0^b`ߓeDf 0,lq *_WY7.X>ygڲs74$=oljRkl8{2bJrYm5xe}HadS(hߧ#-[%95?uV#IjxQ/.-Ws͟juً2!pSy+'TJ,W_rwld%C!a-P)N9=hϧD6odz0g#^~; ,->Ť񚜤_G>>6ۂ,928}$":uFR]4oJpuvDv^b>-*JJ?w'#0?d܈es7n fmٺ(a+z(`(Ιg=}CTfXOD-0ÓT<`ٶO]pxyS3AaL/"wWt%Z$\==m |Ju }F,I^3K̵1&T2bgo NOtupXq,+l ͛c ,u 1QhDdlʣ {RP QTZDR\ƞ l(W0*@XL,6o?DP pXFAh 0\Am @Nti W$lvAk'%h[QK3=̠y& EC>8w71`0q-F9>ǜ ;3!DYD,j`7cD]d?QOSzt)V]030nݜS\T,jH!p`(Q9R.Aj^!Ygcn}Q=#{|7ow ﳒb9 `@=(3 zYJ|::aP;?4tS+]^O+rb _=as=rPW OKrQl2;78{dodࢇbo4mAΎL I L[Da+{KE2]e;3L hOL]~FE>3;u`'XQsUcPj  ,ȞWYY; <8\l|uxfo_ɿo_U]poFI&[J&]^VCQU`ǭj׷l݉1i8sa;/L$=ڪ6WƶM0 Y ~A rf2.&g]e/Kd4s2e vfu #59yɁ̞1h[eݴ5ԭ;$iy"$鹚Ra&#P ރ922Z!V̿w ~{`ptkR s< aA+ҷ_ C>QxJfzk֬ٝ 0[;bLk:y8)$~ j ]AQɛMu:< шa̡D"/&; oM&CQNIV Ӳϙ61ެo=ɰ-OF1/˗%{F˲@w)l*`"LgF#< )=KT ZǦNLWd+̓t/KQZ'Xq.+D30 ufo1*o9*?p<2> df:g݊>0gcpThxoö3(]mԵ⋂s?f!^^A>M+UE(vg-þȠ3jX71?+JkME89!prx#) t8e;}O O2 uwPH+2!)׈ۡ;=vk`E,ȘP}\I%s~yI{&C0VFK0 ?ntְ\!GQ i+^d6)=.Y3t"C?G% GMpƔyoHbt֔J/5u55. u^ȡʗ @7Ml p*ѕ(6_<2GwV I3 7䂘 Z"N\ݹ3ć^mj> Irl*Cβ{kE`a_ 0BG&A_@lن(#&ȻdsYr AK23~ (kl(6ʌ7n՝L&B;1XVB4ф|EkbRg1,Cϯy85r@w0\TPT\WפW̕%I]ү{GdE>˨&6W{zW[Doؙ`q-Ͽ~Z<7/#}[aU a@ } 1B^tq ~3d]g9t4pO]Fna1(m=Ǫ+)cg`4gy>*+"3(4̕[¹k7(x9ƀWeqV6\_g=U~9)=/u~Qn~6=;jgй⒃o.aoW [T9  Eu%.A$hZV Oh#)Ń`#<܏qK2LH7!ZL(P;:A9QRyZo8a_9X:EʷpPt8ϟt}@&06$ bY >ٺ1+NCbDdm,[+v§\ "Vp󅜟 >KYf˼ wR-w3ra伴aH7&w`8^.Nn{hy0y:@qOܿB-;Qo_p2Hn8B2pOTPuSL2l6.S<l rS3qjko'wLSN4O'*|ThsoE_b" B{f^b5 %NnqAz^qᅿ'O{f{Ә x,30Gy Yw@6`:(> 1w;9*8/ƃA 9ѿWS_fn Okf¤[>~;?}A][en0 p!@ۧ {}3Pu~R /eϟK0N> 2 W~@ #gq"&F*|9&-:p8 h ~lo2o.(_2 E+e<vʷy4Pe|G\ũ55*'H[lMo , {`ЎZ*tX/DcxO&z$)ZTVŊQnN.,p*3+شL0X顲,dH@Mk y:2ntV7ɑDA`@~Q ^,sČܩV`u)$gjfoUvI9}<65<_8٣c/Nܹÿ>܊%[ڴ(QOtF|z(<9ԥ]Ǝ1e ߋ&].1i˘`Y]wI&&~TǼ]E6bX~.h|/a u ҡΟ{wԪ|6y<>FWzM+1@ 1?f|/: .Bl2@ں QJ?J8G(_+ԐtO%ǚ[^i?kkѨqpAapRRBQ\Q2! $-7`24ЭO)=WxE5k'%+W鳜vHlk.UœEgLxb@+"F:2t執_gM_.$x|]N-n*^;),6Mb W}h0rWS`0GhJ9%B-ׯq>-& !3S!ph\M@jiRQ;–oԺwjU}rWD6=0{%A"d&'A-s|ؽB+vYk O7?r ,j UHL?rMԡ0I„HHJ'Y.;^>~VѴ=zdQA~nQ% ɜU51jOC4a0/=y˜G_v(XśK`Jc{6`c;4+V9zu7I&Xcuƅ?OyC*を"s llUb6dL(\mwa|>|AP}e-hPej"|M-PA ,6:,@$]At[~'IOhJ Yz4 ka}rSƋ>n_YC.u2l=rf,ĝ k+R0C׺5޺bILA70}+sq=ޮIPėxėxPF( 0&Z%@RDb'܁> 47bl916On }Tv?'qvTo;[ a q-pQ/9&ah{]W(OD;d]WmQ7m%{[C3T@qa. s"^w = 9Po*sr${w UPW.-_l5&:h]ݥ[Qy*:SmCO@4SC\k ,ԨQnQ"~scӝ0%_GgUs2%RLWY]o65,'ૹ ٬8!+qT?(rf`rrE񷑪D#XJ6-L(,N-2SܨoqMڷTdF~Gq"+A'O|ឭ֍[lKbOqt;(av DH w?7M0ClaWEUO$N($E:窂<t__S[kL;jpBj0ng5\Jz>Ϸ ]/|;(ͻ[Z0%tgS!+ V$6x3O=Yk0~wR^Dj롆F4h9Yܑ!%*'RS.YD&H8R$ ШA6<"ܑFКJU$){9 XIl3M' ?ktԏVTk>{-TfM4IDCk]`.⸚(u(aIPry8& hn܊YDߴxsޞe.PUQT$ ".٪9/5$аv]_Ȉihqa3_L8cҗ_Vk1+(}725:[^ ;g胊n nh\~t`ׯḠ1p![gѦ_U67wl0Jbη{Mc ?Eϑ$ ^!p%.,HY0F:-oU7>r6(8,ukܝH c2umw7l_H_ *;6n?w'gDiр pV[ "22PyL&$$ YW;`RsQy}:k`RA\[fo1ueAF$)%H.D̜mXV$ǗB!\XbJQ^(:ul{hDU{fƔGaNY_܄ϭf~~mm!78v-҅g-@cJ?V[S' dΩ&Lm)pOϾ`9( IJ {*:ADLژr_`Avv[v!ww; &rGd޸`ǎ,޴/dzn0Z$=obh}f0yʬ[=AW輪LxL {DA9\rszdOZsޮ2h0!n3G' ШU hH& ,C2-ѣX"myP΢浏]8ݭy kҤ;>ه_"x9;%FSub|+9EN-%`$YDTĮǃ$ىQ6\V0LЗzq ,VUj㮽aW@w+ :qut*F"rFKjv7LLT+]i]IiYfvIDHR1Yɫ^ `uu ʎ$1;jܨ$`FQacA~ZcF3[6y P?l`GimIdës6 ig2<+7 DnUÈ B~WX6*e٤'HIpLipyQxe}B.{輪D( 콥)1SEl0 JPX`ubРS+jy t#ݎ5zE4뜽+-7{{hSd <,{4ẘ([b _I.Jy@!+ *hb5t^'eg?`47 ;gw[F\uC#!  5WP3t C34}!X9ΦW=oglf9U&sb ќP&޽:WbmSOs~uģ}}b3@\u+Q!fwLc0;9 ةY ؗA,3dfȲIfI$#3g_LLSrÛt%OjIrLFA2F;v亅(b|P:sP$ ̱V{b&H$(.ﲉ5?gS&5s'4-M, qpAy ֹ o{xV[̸{ң[1rr$#_ZX#12$m KںUё {cIQ+11NuqG]]*nw3 @*QqJ15? Ȃ< 7KZJd;\$LzK0T؏M[ת!Ͽ٫4dGYHUb{Di׻P!3\? \Ys/JWƷJ P+O|}/I&q4J02Z@M%mvPJIZ2ğONT@%df ,<=Ӷ55\4v lOS6npU >'oHf dYwKJ &o\[zVdrP `0 oӀZU Фcj^Y΂Њ!AN#Y0ُ "g`*3=J@hYnkRA|YVRj9 q(Ь"?7,W;w !gОH Io N"*טOә*׵ےs?~#XiRÄg]~9jY8U+җM+-1xO_I/72$K( 7A4\(|'*n2BE\d0"D$pT*Fa6פpP$"Ir4E/ɜc`0V{LGk׉ jO=jwE )z@F3zV $)wDt4P(&>}@Д3mQ$*M=1g(!!%gH20cku/&u{;uUogL0/nE_/ˍI>?po]-["Œ3 u31QV$!*6u036{!W߂߆ZS{Jx}5i*c{zov)OkߙE:SfVY[h&jcE `=0'#69noh|r|»dVN#pYxTUK.`ʆw0eN0xS6o+. *=@U|x&Wu yS]]=UX$Ta{G@zkV@JPW|Ju8e˻/ ē[S; N֧ޙ4ZxE5L7)>%y]6-T'==';?|Lhg67.yرcVfOTr!NjGKGMK.ю "Čm]ⷚUY-e):MOCs̼qr[f[jN8cǎt͗o ]R ~+f }N~NX 9+?+nٙFfeܹwLbVm3Ѵy믿FӦ0qٳgdv&M'$$XvdTJPBٚ7(PZ N 1ffaOI7iXBzM_7cs{|'oT]Bѭm-MBf^1{[2;=_B߾Qmrv_Câڢ{X#CDH9W?z;!11 xpOWiNUs)F=$CeB"01ݔdX!+;IW23Vuڵ& uVyr'QRVZo׮]%.˲r[Fpp07uYu&N, ;&xN, S+۶m:r*wyt[˶_kk׮jX&۶5kFS[}v?!3}|5}|ѵkJ\z 777ؽwsթfKCT~o"iz޳ ޳,q,#!~μM; _С˙WM hӶO?a^RY^gҤIXx1z%%%͛ؠILIQǥAuyݳÉ@dE53 w?"_gl Լc=l`k ه:PG@sÉ=zjz>NAq8u%Y0=VX뗀_#aQmѹe峧1c&O Xf `ӦMhڴ)v삝pj ~~nUMACY͙vAAcH2j"gφ8ǽj&<9~1_tJVe{Vܹs "k׮f3ScΪ{PīCHz[%kJ퓕ePO~~>rss| 233ϔSE .ϒS?3z#{M~p-+BerJYYY%uCj(?o!~_uR>gUpmGTY}Ք2WkOolݚo4:P_$7nq+!!.]4ڵk[eYvÆ spww8""bB]RJľ+hǺO tttڴ]üM6ptt=g#/m}WPϤJ=GFC! =zߣG P_ha_H)r9| EOp3ᩁ!"*ٲE)Qgs1zL7kkؤ=~Bl"Z[\3ew]׭[}Q-ۇo;2׮][-hJB;w8o>[9Yǎؾ};v\lg޽Xvm,ӧOofw[{VCR-kHf寮;~݋uU:~{Ou 5~S_7 G&?"S"wƻ7t州Y^ŁF&*W)Z?e¡7xA2TOT*ջoҥKj*F( YH)ImۆO?!!!9s… ?`i>@V⪦^}t~Ywݦ@}L~S #QҴ)EE js;yrs΢`Ov.%Z^גG$R#|y-q7KBP4s g:2 ]" ==\ӧO>`ߖjW 'QU߯QaAz4eNp͢Ej:YV֬޳*JJJ駟/r_ш3g"&&\n5k`hӦU~A&QZo?'h Z 7Uw}^Ǘ/W o" VZs巚y?'Jlz9tqq8pxCޡ8_M~3oAb~vT6o߾}`Epp0V2oO~3f Ν;gɓxgtR˗/GϞ=!IRw GhK&M<;&//&Mo/J0|^Y `cZA[sb[m0`4-`Y<%:<ֳ%ߌN4uC8M: TF@ qMV8M/'NDBB0c C'FBE@FXbAݽvx\oF֭[ݽڶݽjK/)"?PYK,iP~0Lشim۶a6 peԚ"p䈥/_}'#n^t?[~yL$uկ־wJoWr߄/z?o7z-ذ(v۷Kc Ǐǂ uVϘ9s&&MZuރ7A@۶mpN78ĵwkr_+W",*Gh BT3?XW Ċ+пyh B!sKhv>G$5 *6oތ7o~:L&H:IY1H0𘫇' r͵EǍ3f(JKw@ @lkVмʡ>͵o[wWi y'N7ߘ\'µv)))哺M⩧,-TTzY|?cT֋&ՖL\9˖-Rěo-3E#22֭'|ѣGcx,#;wjj^g5oU<~ɟZsb ^jw^ }ԜZ$f*fۚ` ?^`8<+oR8;;7W];wСCطo֯_gbٲeذa:t(..Ʈ]AD*݀E@ʶPvW;;AeT6|`eȜY|YYY1b $$V7(J^*#A:K Hg2o׮<<vz4|v$ P-:?o<v޺ϛ7f;[3_tv5;S{wW^x뭷lҥKYl?@-:}A>}䷫䠤4ɤTx8Ctsd2*$Z-eYff#Fԩ2`.^c9{J5^۷oCR]͛u._k,s~˲۷o} *$ W R>cU\|* J.Y!j8X~+V|{%@F DAn6@4u /oW ` *.k]=*r*pU`2P(P(@RU"yJWT =zli6~qׯGll,VX~^YEt:L4 QQQx?j3(BPرc裏qڔ6(**:yh(A IWcZPEEEVˠVI Ti>*RG?fѳ)!4ՙа)3BؽhY#GUX$>==8j(_SO=#Gb֬Y!C %%,'e7gV= ,]ܸq۷Gxx8nܸaq>??7oJ`*7;0TzEZuBPPa97)((ŋ (E*)B0+>3h͛7/B辺 (LF#NtiӦh޼yc`)):hVa֬YG~~>f͚e?f̘d\ T4c َZd ߏT;-OJUku:Eok߷:Zˏ:'CV_u2Z-n݊__Y҅_ǏGHHbbbtIW}ǏVEFa :;v쨴`h믿޲za}OAAۇ;w؜Z?%Rɓm>q1K6b„ ShA.ߎٳqQ=zg϶ٮ?ǭ@ڒߦ~ّDp[nݳNTWv:L⻢׬tg>|m,'9R+X\=Pue.]j4ȓ'OӲyI Zk׮!66cƌ?lq ,_w|ӊSM޽{#++ $!22⼟ƌ[+噾 wZZW(Xpsq)Srl'`Rٿw-;'inVv~Yg_9ӭ1ķ܆VMի3Aqǃ޽{[n5t N)u& g?s333q% d??.]dۮ̌-Z &&ӧOG}duKGذa~?s{1u777!;;ڶp!WDbO{?aE _C_f+ZVW#Gz*H9f3#jJ-eZzN$ aÆaȑ69% NJdTk)(`k k")) ^y/dQ9uHt0^`mQa9q's.:gLAAN EpgcQISD~"[_6q2WYߏgmOm? i(~B1ck.1#FXU~"²eЯ_?;v s̱ڮKg}V,Ŀ()xսLNYx\}3{?{,oUT[&FUڡSn 6glX~=lNF;~3I2_@̭4Z"wuHOOǪU{3 ng$ɲo\3.Q][hӦ . \YE6`ٗGp 7g8GD0=YX '@{2DC/͝;6meظq#͛Z MDvE+q ?R~iUyՋӦM?>./(?d -\`P'O]wwwǂ e㧾+J|ᇈdi䄗_~ΔV_N&gu_{5l޼& P8w=? .&U} Y`AC~IpE(j}1o?9AД&NK L@2 ^x殧Ƴ/?rH1--6|p`lk֠ј=z-ZTgϞ=:jߵ兏t8O'22|)))hժK%IBLL bG$ªoUl7{==!y: Tq+q#}ə{R?{aL0vܣ1 YzO)ķNry槮hcQ9,X-VWFު_{@j>ݫ+Ygr ұWUBe?c_NGxxxYLav}5VI]z?Z;?y;eYᅬ#Gu{ 33Q{JE*C=VM6YdggCo0ϝ_cCW&=_S.~ <qUXbX1uiݡǯV:&5;nک<3r"LauVcǎ/_~d2cxWd|W={\KMMY k)׽7o="by,M (qxWU Ș?AJous("%IFrfLYݨx;g`4cpcO\=nݺ*uмysr[M1t.+eM 84mB_GnA#Rd^>k(n/ Hq31jlW~츏f&<-~5V?/U[hRحαݱo>!x^^^Xp*VfNj巧kdU?U?5ߴiS=zߚeY!r$HźJYo8^r5 -[QΞ="5Vb{ 6С{U&NI/NݿZ%"fx}Jb̙HKKCb^IzE #Z/^8p"rl8\L>MYPx dadxiʚ,ZWqB"- iؽ{w~A8Z?Za>*ZRѠ*>pp_:ӛwԟ̳I{A6mBYÙ3?$weOP~_/2u/K^O7$=iK_!axn)< S~|C1k֬)x3ѓ/c#""Q?ȯR,oi_Ծ1w),> &k3YAːz/OxC{6"ܺu CD3V-*wQj9&Y{bNjE`H,9fbOO+O<+ؗZ^_X믿'`zMK),8d;Rkvi${.&bj>B۴Chvm7Lj|~ՀԌ7RSJKM+55,ԥ.z{(KO(r^}9͗ ˕/-"XWG߹Lb#W}2w᷆2/o ~~~7o?//ϢZS}䏉 CįO'+㿡ѡMcAqez)#!'':Aw*3+y`}tH?KJ|Kƍ dgJQi4%ղW^s=x$x쓓FhuI2o'hf3L ;UKh.Ɛ?~ Gul%Q}g$>r-Jl+0֌o>#Exv`/<ٯ P Ec.Hǎ˸_%NFtt{UADhꋎ$.k9ZI멸x+æg^p:0 *ֻanare˖AJVK[o]+2!onUU /@yJ27/eF%COK.?w,lsR Yov6s /;7yd8::bٲeY`$^媗X#=iMZC_I?vJ0 6mvpMK!&9j͸Z(h7=dQy'ܝ̎SZJE3˳>1OU6#`7AVw/uZG7&@#:@N*>kНk%n&_[SГj!v- w7͍ȒQYX4v ̴R=>o㶚 1N^ 0k bs{AФoe "$3Kg/UwߌN^us`! OST+KFC"p?iSs95)dȿ+L/թ?.Th334'~{?QJ^7m;`*3=J@hHM~gYKL,60oÎo]dP0= YE~n ĿՊ͸*~@#"[GedTǟbZ;w HM $Gr%9SW,pਖ <)y|}:{F.uORtp}@G=ژJbLR]p $IFf6<{?ۯDp. lEVf 3L朊Q=ۘԏ=`pw2'gEZUl]$ \low7GS`o]@?*&LDT/ZTK~OgIVAyDj$B #ˉ i| NWN_{g`4E"Rn+81VDқ Lpf/uzJ`6qhMg ?:CRwID  "NrSMzlA{"[W"q(&__^p2P;5ftJ[럊&J܌_Tξ^vwu}Ȍ)Ϫ[u]`T+m n 2};rft?.DH9=ۖ0VTRt T( R@UM_הWn+F+f^I60b"4 Q& 8yv|~BlfRKv{Cl!"/k*2fƘ7[mpA"CK܀ꭜ%{Lx4p1X_ ?H'WGw]N*1gW/~+ VUX#>̏>>]`:/~V nNwH̼D:d3rpWßx\Im=9ãWuh׮0K7z\!'QR, UwwwGXXXe -Jεk̴^oMJa?VgV(I֦Mㅦ.o ۷S?u?cWpիWt k,ՙu{U=hZYTK;WHЃUvС3*~)BUϵo߾oUuˎ{@ox4pD=G5ۡSuKOi7OH_uf76 Q`qS$`Id g:lQ4 ""'ý}޺@ `C($!q/4uʫ\u|MwKګhUge/=AV-%k|r?uTlR^,-t u[ZC.u!݋ee7끴{Nf6 ^Zk~[&芨oRrDxU}쁫,m9mMut$u Vwf|!MѴ:ydDқ*F_SjYuAff&xY?++ Rzei*ᖽUG~k={п8p=_5g/NU`0ƐrSR  / U*Ղm͉e%I!m/`6Gh>,D)_J4X '@h+#"/Z]UT[8=sj*iQB( (EzMT`ǫ^+Į(z5vNk(6@ĖA@*ԙ~$?{<<95kkkeG9Ch?`*G 0SG9_H( ~w?t~{gGZpCjFQtcwy׷C*֯_w}'wyqw/A!ڿj*Z _}_;!ony%}'KsV. E`~o9,q4 3b#ADt&;~o~Ç` 0f5~Ί$>}ғIr ׅc4XZuO><3b#Ѥl[W9~gm}LLm7]{ථN#;Gڅ8l^ƕW^Y$BR"@G O=9UĶ?# ߏUVaͿJk"33-’%KF][o+V`ӫW/c͐R)?ߍ} lcPcK;~?h!M^L xƺF{4Mڜt G}:-N IWhfPkRgm5L3BC'}]V n|\PTpS҄T=+rDADpiD4#wp9>^)]A4z@{f%߯70tpwg)S$]t͛z 'b B\y啘1ck Pc>??@AAA74$hS"C߱cL)S`ǎ]%oɓe˖v'N@yyyUUn9s&qX'O2z!<0 x1w. oڴ &L@jj_ /R$$${(v_VMzn vکĖVul~ir9+!<Ù@lX' Շz].{Oo~Y얔W.->c/#`7nϊg7s9{œO>}[>&̜(1)?|3%K`ܸq?~<}wraa!y[b 5)=\{/ Z{_dI/ľ}pwcȑ9r$xv7 3gl+1q6^hEŋq9砪 V¿o5 #G>S]|o1|`;vl>?Nh4"55Fc-J`k7ݻ7Naz>?3L:'Nlv'lIT8dv]VrYN;=+!تQ'Ji^ .@z!]L-yanSe/pFl-FfnammmCPfuu58TYY٤]1]a7 C16H"( mA2<}A4 00Wĩx7i&L2zᯭoa۶m-:{w3s-o̙3ś{ō7?00wu;^[Sٯݐ"Ԫmߟw.j?<~<3>"~yퟮ.]h8&*$jyG뮃`ݞZ;SLM۲e nTWW#/ϫ;w- 4dgg#''cǎ}mtt4|gO}n,Z. WW^i7gfW_a(//GBBv;4M'8s Q믷YqXfM dޥ/g^z z+W}~odQ_~~<[O=T췚Q*q'`U(3?@-v*k@~sҪqsצ4@-A@-W (V~ OW@ZeB8.oH3Q&4^ 62UU ;Opq̟?w]rvWB.kvq}!##&LAD4iR'_"(({/.R~sz5]m?ॗAc̘1m{gϞXܯ-k__rmH0 t}WYQhsr(a&+Q'@,W}Wf>VZE; |=/XM'O!4:s>gEGU>4'smѣ$͊`棂~+u|+//Ǜo0pOZkns=܃ ⥗^w/yaΜ9Xz5v9_9&ηhZw*Eb`HǃkoGO|ooQ !ﺂJ~kJ@šxb}#xBg5yJ|kϨ]Ƈ{_ At49o`ժUXv_ηkK[Ή\x|GMZXXp!ZebOk]GoE,o:u9瞋r8˟zvFo/|u/G}?2?C,^?pI}` rDҒC5E܅SqbX No[:Zϯh[G]Tیv.kmݸ.rzINa @gDr;v! qLؗ;KQ"3 ))7x#ѧODEE;O?ݖ)Ns}tP$rhnqZsCGqq1***$2iCjm7̙3gWw3)cDV %%%}Wmek ǽ^v]5|䊚]]#kė8p&1ļ{`Ȑ!/ko-hcF^ N/ۦ  d^ rWّr3"/ڵݜ[<2oxs`|o1A0.e_ēsFl.h׊{ꤼ1t'gjl_Fܹ+V@ڵF#=Vd죓#2َ?e}Q2;>˩ 6NiP|nS:Ӝڑ q/9N{5}i~i#m/92/=vx(g{Ԣ{h1Ҹ܆2:9WB_X/:ojO敲 fy^ՐRs_TE73/ݻwo{A ~oKjUrS_ Fp+k6Kçɴw\]:R_?Վ[f6ַ/ayޜKc 2d2%n:r{[g)T W>txik&JI,a5Ļt>F[ڀƢ#%ڵo=`3buT`F^[ks"E=h͏6lX)*_@qI#oNkapY ͱ%rz rg]>xCxXkgU Ǧ- 7 1c z.[Ή o9_8^~z=]{Ǒ/;ȿ{&?e}1kqMn8]Ekv SU>M;`l;h:#m/)?̫AN/6ys|Q ??D ~xob4i|X.2vW[8l3XASiP]sn{ڿq.8LQf#l91x"ZAy";*l-*5(IE`[{J@>@G;US!NzW׈S-FYȧzQx=X@R /HbL۩0$SXCu(@))))h4 kdi*pVҼe}q /cJjOD8vl4cSI{^(?0Ӊ)Ng*Nh?/.\ZVn5D#DXsNsXU<~ ~Έ `:SoTm.![p}}ѽ 2ӈhF]Q8x|j.ef[TЂ!~&"I>oXvV3\T&V$pb~ѧвuR]? ͎pJ <X8c-ެ=+Nt@M]Zf4L_zV ju'+ 3Q`ʕ+zFt/.#h7~φf]!~to!l:8b"Zje3@2"2CYA A\+<|oGVkT+l f Pgӓ'O{2;9`wV| 3H^VuÃ49]Iu۬)' `){ aN Ѝס2Y>o^Mg-+n+V'嵭 8#2P{>] Ti|&gW .66}K#t!%)yZQMa49/ 6LݜrNm4;4W{-. ` 3#oai 4Y{ [7ENNMwh>3TEvKDԮ0:KIL7oG[<$YH,RjK`cI|d "ª-[ⅮP8A**Q$EG(H Ï @031=B7L~UxM=b%̨/\L̋wFz?dXI%W^ƻ?quAPtN~5{S @T;-(d`aRm3o·05feJ31% BxwI:rO\?IB5.τu:š1$*ؼ`t :mn "eCLg.oz]&n֋NN!Ivj ˎ7z\0#z8ί=΂wxlf׬#g@=vѴC=mPg͊Y-)D?/*B16"1)Y ӗ##,}q!0.V =rd%cGpn|X6 `  [ႂHJ 1@ot_>yV~-9ʆ/33bTHM򏍜/>w9_PXn76?`2PX[ ܕc;3k{5%Ԍ6 xWϊpgrWa ~ /B~Yݴ͚xy,+5k w?qh-WεhxX\ '܈߆y[Wܒy ^ؕS\vE[u_A;S1ӵ V).]ȽjP/).=[TC^QyE/FM11߾[3E{j[k\r5D]NI[n1.Xz^G ~UX/8svauc-* ܟLzo;d=At0cfQ߿`4 T-J"׳v1EE&{ԟ oн:pwVx03J&wg&nhk$Vc:jܛ_2)N1xZzZ .-N=s{w? C:ٗeᾟyi rԷ,ؾ|9`sO{0bQaڏ"MűQ]3g3Ύ=plH"SLr婈ly)Y4}P@@gFM_~ә)& `hOSVv6? й 5.Mh=0= ]ⴲ7-dXObY(=]ʹFqtxs8[?i-nV& +H>MUaPE+hk#v/Zl.- JJ<{lKϨlg6|~;yME1y )#* W]]zF#̧kj[\*وn daD`Fy999)~tK dR&8ۤE8B7I2q閣NkZZgp/o{ ko܉/X $[oRгv20 t%< jPtڤ)(߳ Ƹ\T'Ԝ3zp /E;b&1?88H}P yI}-4̗<* HAD(xtn)av_%7NYhDWnBLp!N|<_w ?DzI̳c@jP|[.dУR/B{?4[aaa[H.è[!`bt^3_%NX𧐘 ?{X@0~G<7;΄'}NIC<֩X9Ee_V9k w)94ǃ`kߝ'AwT<rr8s/?*B7L0zu[!k6C1]= n`l{86h,}X}8!Gk+1rא>*X쒒dEtbVBo8v>OG֟,)t~KRs0 @\PPS() V~<&0ɌK.t5HfDt"4Њ` WVĩb™ =`+TisӘ7a0(ȡkEUUZ-X"0 0v*X;^C'gV`AF"z >΀+q'#Yř9uĞGlX<|b/U_1U&k. q͚ʂWahA|:1Ƚ!"Z6Lk" mp5 ;<yYwn{l/K%ԝ JC*;i%0_Jp!ēOe+xi_ 95t'ؗ^J`?;+,)i%{UMsK %p^S{~p: $fDۘ/$ 61?'“zM_f.3RUkp,<5ShMj@t/8Çd-@9~j[u|7@Aj 4_=`!r4mړ[T>T/'`<((S &ѝy'_UU8G4),Ԇ9 s՞Ƨ*[4}]`ǜjU5 ܢL ]QDvs1;uAUR?$=""sJWbp46X+*&Cy&3#e0( (q1m׭.5sDbebܡv˕TL "\Ml51:-ϭGf ! q7xt%v&ZQQ < gڄ+3Tܧk4 qe o{Cs!(z/(̬攔AOF33EU]Eīn4mϽ.)0`b 7T}=(CY u) W/+J 5.;хћYrh?0Do=7u#S .&}QRYSs$,&TAp:j5Ȑ`ĄBU].-(B@kI>Sc% f5/֤f6DgچAVN̿yYܺ%NN{mj |j|M5xugpgL$!2жܙT_چ+@"/g]T %1`P1SבU\@U T Z 3@t"9#A`$ 3e8vl#2 bTBb*I ub w pW}#2a_|=QbHnl 9M*Qt9']ޔqv, J*ꐛBrh[Ѭ9)?JR%V&5s*4< Qn1?~ܬT RJ0`Fiu J63RU8Hj*M͈ԓ/دҁnXK,A@q @B@L4&u]>_E% &|jz[Z:%E`+DߕPpJ>Oռ=ٱ#]W֨Jgx$dof4 vaTLtGzO(  |iCֈ.RIc$jDL`47lbӝ(З= Gвga`,ؖ ~dO[r,H=dd0ޱ?A3N/UH#T90* ƶEpw&cak#ᨄC/̌YkFWE^mb26“X}FpdK+F)n/NSw4]l}aAE^pFl|VuOq&'2h yŒ!dǞ[|qH-M/*O߀x 1-D~Ɍ9.gnpfNi|L3uI+x A:V %nRfUIFVɠaMtsEح4RST 5OB4{ 4p 5Jᐈq:!uѻRsXS{3W+0Bvaה5w^cqQR30k߽q,+;u]`]d3-9#W';`Iፐ| Hϼ_ NDE<`>pl8߭U( E "3Pi+]GqU5ܺAu(BeOt]n d 0R > 0ԞQg9?z*yݬ_>tܭKs H5U",`Y̕+KK=`iycϜ٧w&QQQQ5G JϪBrDdYt5((hd,>W'Kbo 9D/23*os:Ak:ut`v'J**jYGemmFEm 9]vCtf#zGG!i2E F*Kf3+مE7@h```-^٧{wqRu~ :`mC yQs^ >J).UP_^Lx?,gxUQ$q_Z` ^z$@w5 u``%%Z'@bz@ˊrpIB@J [#4=nwJ Ɉ{[\7d`= <x/{Z6ݮ|koQ `X3\5gQjPzٺk(?Oȏ(./A*ٚV$w3c]N-6f@SR2 L3ЁX=ܖ ʼn|yK4`ќ~UrJJ (43@;|,GKh״r? 5))e[+c/nxA3#$Sx ~Ͳ<6sHۂ3tV-!VOS)!\b2\ S d߷Iz\ߘ%[Wpí*YZ UU6Jjd5#bPeʓa6+QU'r.x6 FąwmN,FCcUUmQh6Rj}u)&T(`n[א]T]6΃Ʒ`!CcȻ &Z 0CCGb"_HmֽEE٧JV;ZK f(P"Ib%"LM: xNxD੯iPS۱$LE\wnԜab `5E'vev pҿ/)zځN5)uy\0ű<03>O&J!6g5e[RMPÄK }4!ElV;R6ei*?A_\sVjTw!MJvdq`jh WȠ3sG] `XbkNU .i[f,p8َMFZ`1h 麎ŠJdRmKZfoK zuam<3N)yMT" 66'):"}=)M7&jë` ª[)7 Nzn0 Uꗠc9w= +`F2S<˘Z)qpVߖiL+i TM[ٸ]] ӫVְȄrA.0hDüpOz@/VƤځP8I#j]&F8x^KB5+E+R~lR{SnA{D)o9͑S\' 33N@׹OlB0>J~pk2[#[x臢~tL sR Џ MO*SWʗ*䇂ϙyWfNQ3 g9#/@h54}Ϳ-);oʗ`f,*.pFR/*VI= @ %6''%2HN{E'حIPPi߷e|kuIenK AݬF}qf]GOr[&3nևnF{O322JcFHz‰W@nINvm  L@D@^If3b#.Xw('^:uOܤKg0(ό13͇ WXrev3ޠ(Z<ʋ$ B͎@ˁY2h?mF7چ@;G()y/>wDAkYqe/lR'yӲ>@PGkxs.7A :)o>pFlb#1ńh#9E $=P`cA*dJkK˓'%p^܇6LP ŖVת~mp&ל"ޔ\r @S Cn]Ծlـ3B]->-+I"HHk}_ 'E/o`*@S[l1oaa`xgA%J78sTx}AIO I`]wՇ&h~W-f5)-D> ܊wOGhPmB>o).&BÁ%rsN˭N'zDE(HMJJA3TE.%Qml@e~[\Ҿˍ.]4ɷsK+h8hZt].cT(=b'kB8pUw`rms}yӽ#G~k_8l>:~`q`=݄{C#6[ӡAu"Gd5=V~کSn\?Zbx}reŞŠI8?{f ŵ!cJ\A?!!*y0pV%HnS8ͼnfM[U&[vn][@u3*c~Ŋ:_7w(,ZL0FuNt]PI ̀*[-(ln6iahs4^Ϗ\;^ kô2h0!gIU\첛3Po»m+(n |? g~ؤn;xtyqKr dА˓44AQjm@4_fMqwW^-}أG[Z:)ؠ([P PeڻN+fItZ_f=+6~V!M<$7LJD|2!jUT-S  @װmig;ew!> D÷@|B*z޵-~h_\gEaC\0- (P5^mCcʪMq׀i)@VKB̀K# Mf \EF*QoW'yZn`* 5'YY%tI@POMގWa)&꤬Wt}2ɢoTNCv ĊO-v(`#ە $)B|z@ؗ&gJ!Fy@ '^=`d޽{5N{!.M7Z̞=|Dˍjڝ0  @;`sz=B*O <4"6֖STԮ64B2;'drnɦu`kbb* Ue-dhw\+ty]M%(sJWyngmvV@R$'7S>_4MA54MGyM ‚qwmР7FO5A6Sk#Q-wι?=6>vʢ@3Η/dtۚÅu,p+3{oλ^2sw"rqL'ۘem.I"CI|ǖn) Vz"R%kt[,wXۇ n w[ne뾣ovѠB0 /zE/*THCouɽ968;!g lqAh\n1095<Գy&$'FOS9'I)E>]_ UUi2@#cWDXUvT3_u@ǍcWx5c;?X|u\n`Xw\z&Hc<) AK9] LηA yR!v 4@eOHص?Z @pܬ$& ΃84r:`? 4u$(V 3!DFЛAp tSAhB+#Eq' +eFmJ>TbЩZ;i9 `$4݂!@䗂 ^Uȑg^ݡؽ 79nU4EHILշoRukDt_茙qT'=: jmf(=4Jxh"EG7$<$Tq 9'xn.bTS7npZglT֖Gor\˜nw Q$[PTQM ,K57+p ٨5b]YF4S= d)Y A.k}f9 pc#QD7η } )p|~jKb($snjd0/X +Ljݥ``f]nl~РA.fߓF/bu:;Mg>bC>1hCKXeM-.ÇM'X6K@vAvfXGJ-* TZzVC#}ztu}ys'g0>s]…}9V0znϪQ_a-O]q4 ,?c59>NsyeTU 9g߃:yPguZ.Ù[fpLe4 TA0)g=m{ #n2U#H3.!CFuʯuRB21wy[W)LY,7pHjےbT(6vP3 -uoZf1Ӛ}i$r,|kZ-X 9Za|2[o:P/ ]kV]ςr #-ܻվ|`^  jX`@cYN8͡|h&$8.V4ws)_Tn5(pt'3xWIy>!Od3.f8p&?뗸.TT۠ITAPrA=m(+:Ÿ'WV;Xrp&Ss_56B>И_V !`s:A䱭-Ԣғ)+GSo 8n/!od憐ٲpeIӉ`mZhy˚8_bx!5- ok 5,(r8%>b_ = T`ԁ:,hJʪ#C|VRdTUit`1I|77xYwV b!4N 2{B~z-v\R[{âW}tf+%gt5x:W_ܮڶ>_gO`Ev;/|-GĐp63.6Hldw1Z9ȕꤼt,M}}7oUSվtDx+%fou+gH ́V+;͎j][S:ߪE'Ro) ܚf$"A soZ3&V_od0#e1}Fwi_LTl%f'Aix~E=XF<ӼrYփj]"Vثjz[+I KІIܙqߓ#&mG\B][JSOԜ9#rT3&btäLł9y EUckW +~%Ecym ~R5-`v"3/S][[Iyļ!V&:1I0a4ǵZsmwz娱,c_??a^x}ـ3ל/ 4 @ŽCY^׹BT$TΨ~}>mGP:qzx-^l.YrTX)|zع6cK,z`xr Х$"BŲّ8#v7Ff:_PT,#`ŗf tmX"7'wP`~UEߣ~7v .p)oƐ*P 2A3)h,(0h7ȵ[|57a^N.QZY-Ri2+0C~s?TRk:YΈ-eO  <)P\qm6) >8Dr&y6 ]_G ;?wJS\Pj3ҊKZVUNm$`i9{.GUL}ſJSچ+A 53GE |~x%.Qp~]x`!V fNB'T3b@{k!b;"6Kƞ w~{f-H{qV|]O TTgBuL>j?R'7Y*罃4hQۭ,mאO(fwRvV1eˮYڍWLDT ,נfc`c: )c fDŽYrҧ_s/k6/B͗L7H4-5~U@S3 >aI?Oo)#%QӬk>m,~O]3KgZ{c|*_'ʤjQZZ NgI\f^ &(UW"srGS吮Ofgg?ɓS7fu<سgϿرcS{ĉs^zEU<_ 1i5^29#5+.=|g ֓95Ġ8!g$ B4"R(:?۷O~tfR\Sn+^*I%zVܝ <86^vļqϽ!l"|bDgKߖ L×5[Ya洽:f&Fq0t |}ި^|$xIJM\2q ӇU۝=siRS][L0nA,x~ǜ>j^`=9|7P0tdߊp Oi<'?}%M~u/,:DsK6@ 1VA z!pVڳ`W/յt3Ak=je.3#DZ(jxѣO28qD"H)_A\{͖Rw+V%TJ ={2//ﷶo{?0% \RY 3O2NJR^ @[`z& :4UU@@@7߬Ξ=UUUqa;7 w !9lذ wjU*ou"!OS{6=sSWjRIfx].~TP|38Uh>c#3k@PIQT^Bo,/vV.GAtZruՇ|,|? ոс뼖X&*"-تXwOgAzckp'Ҋ9:l 3?ۯa ~'zY j~٫4.`$,- 1Ľs&*DȮp/ƂwA[P` eRI̸H~%Zx7iKңԄ[T0 &xڐG'vaնSݰy/_wv{P_C @0@(r} B@jF΍,"sr)DI`W'R3 H]Jq99Ƽ'O8qcNN޽{_ 'N8Y_5>ޫW=#;;[KHHh5e{w|1Ve#tM!PBq)*l&FuN;5fгt`WW|n=m/)gǴQ2dnjj*?cJ@@SM`7="***!Cc׮]Qy ߗZ$a~k zVˊ: MF{_ϊ{@0NbWg;?B<@,xAGH]5E: (}&𒒫Xe^,7!AN5uE%W(}T=>1& \S; Nkq;5K3#QƏ#c b0.ʫsk4JLVHXXXcdN&H!5QeK[4 [3bߨz^tҔ=.DbPpm/]3'uS֓ӎPg|*fvqe5 Ƙ_I1_۶8 ⛊ ߦF 13pC:D(mйޘ9E~;zX9BmG;tT=)8%aԤRFLa,]vM0F(Y0x4*@.PYpyQ7}O>o|f{XIQQ7NB;l07Q6:hy齃/)mh?N9kL-6,2`Bn8@s02"$&,rkqn]6 @ֲJ̘چ71Uw3z{Dȇ\ GURHD;~SM6}H{o֣~yuX!X~y><{<$GBrQIOsX9^O3O!eD;+ܛB攜:|[HڋJ+݆юMMMهo/Ε+NkdB5/0aChς@Q+]hX8;ͨ$^jytcd}OTf;H .{4Z~&2mȜ EUN{;R0+R`!=7~ݤ [XS֯ SHaeWOX%D}8Ƕ=iRK_*"צlfj[S6Z_QCކԘS3 2:_ѡQݛݻxiϞ=!O rrrt]xD1vڅAZ@u{މh&3+D{5b3mQks})ܺhT&)Kjuˀb^a3qhDIWko坃4xu/ f59ܳ7KJZ70hР0!WCs9S;5k@UUh>=z&LՙggϞ /",6@!D*nQ4.WZxe%C KhNXve?ɟs@ڥ_uRnZkpwmii˒gΠLɞ 8l+!Xڏum҄([7o.]7en-ʼ*4]*4m`?MP,&0묧ø(0ηCϸfѪ^& /<- boA`gm3k XLۑ>X0:N> @\J]0-{0:N`{+n7e4@޹\<{3%U/7o8X]psjˌF mc|DtkUTޚrTYp8eCa+3,MNV7)EQR3 fjegsssK]{ȑ#xGuZlҥx)ofggGrFx}Nu#xdvM;өɨ)V82@X f0w3(16Ta8ܪ_0C}˚ Y%QLY_pϧ'?s<ϒwj\x""\BII }Q|8n:̝;jݺue]á EQ7N¡K}ܢidb,W81X3V CM{J҆thO8u;uu?#粤|9K)'bdIOX-.uRޯPJ~g^Dz['ѹyļ{=ږ'-MvـX^=@ˊ޽Gszp!B6xLB!].r ۝nlZox ٻ >!ݬx^@MI eċ5KcO_x+ l#(mۣP+LbzM/!2rWOy]|.NmKlL2ߤQI7@a^Z3 H[EΒ {:}/2B#b"B4,c^\˯ZBPyY ;ɶƑcptlhDķqm<43+~1n#hDrcm3.>Nc';xY*=Π!8i{+L^D@׽{w :)cƌMjDHRjW޽|au~'p:du!&DO. 2U܆0F*IDAT* .VZlRbua5-ZvI__&٩4”̂Ь}aU00%ٛNyVjFe׿~SY)i/o'HQnCII +|t\uUXx1H<1sLRRRk%K jgJoH6uCv8(zTcQE}>mjFCL46*<Lݻ]uhe`ZQSS38g:DW^WCz{([} O覩a!0P2C@s*;L, ;! U Z*B*$jlg.1EP|߀ affv7FjF@UǘRc|FY*+<5:tvᖌb>:i+ͶinH^=t[|+P]}=W^Xr%L&1wu^|Irss1{lR^k׮H `'A:= nkH$H{];#CX$ʆ}^?}jLzDw[AŪcT`~G|3CȬ4玝8{-iggJ;tdh8w\5qcY!VA4RוΪ)yԷxn&]\Q ;zۑ\([84_n۲ " wFtӎe ;\@]hj()Z.lܯegQ[`WZ- xsDiX>|,Rݿ(vA<N)^!9_J:*Z}@r1t'MgU N24=9_8Tmq>vcGZnLk]/3uнW,@@Dl`́Bi?uB$9U1Uçn9rjҚQ14i^L:oв6:Hď{An_Q\dD 3U}0?eC; (VJ iq"Y 2d\wGæJQulvKͬI\u&Nf&ME.UduЭh:Qk<vU,f-/{,zMICA,f9s nl )/*ss37oFa , ݂7D>{C"1rHϚ8_ѣG@ÇKEQfܹ 3@Pbo M@1~.O zn۫?`瞟 16)RI}&C˒/EkP6B Ԕ y֡CK {,p1m~Gx7?ac՞~{$DH/}ˮnYm5@R4)o@+ixӣa?`e̚9z<1k>Gp?=㌞u 00 ioGKO%YLI8-''e  >O)v%&>;L!xo-`$Ӝy~z(@s<C{V`k";#QѼCв~7/roۇ99at 6r|@|4 aA32''8*xh|q㪫Bpp0`+!ĭR!Cnow{3 {|QD@*9X&CB ;&ζ= D-Tz[Q@WY;#H,ud!@`7@pz~@H]g8OcrfùNk&{ WCl`E\fA (k׮mѮ>o{!E~O] k8,^ 'AI?Q΁fs.VD/e [QS[bs~8>S r'3&KAj$n A|’L$!?PKǚU֫cHi[n;0 %g\a yl5T6ХĔ9$ɓ> @J-a@17L Le;FU =$d&)IT:$B?jKvJ># P"ĽsU1 N]9b~?iOD3 x Z,̹¼OPUu%pø.~n-\q0Ú <QFR7f^,uH6 ~.[0츄)0|>wz]6CBmd{A/[`%0v$WW$tz8L@,8'/ 3@m0z71;߉Y [%Е'ae`#,xJ^\65lWʁ4)*fC-gEK1^9"1pfD`C>Vw.Oqw,xﮭk2g+2~kzfnFO\8ܼ {KI6hr>l,{:!L ܃ X>?&4y=lwb^Z0e~|Sՠ}UPw=x'TWA<[_v'+']:" cH{b4FlLba_d4 >&Vh> vco1]DSN `F'y[nݻg5O!-tc/E YEdcjRTiv 2ti*g^ɺ[gD[^hjASW|w`\K ՎSRJ̿0;{Xyz0ك\BYlǕBٳ2n}/Fff&Ν͛OgTbÆ PF/j6;ս5j5byk.87SHΐ{ќ0Y4hQ7heoͦc(L k>U{]Eo|j61)&$j |p:<" &?LC+W@*<i~Zvy3XQ>ZN Xq(,| X>&WXq? p~( n! -PP)\5$|zR ̟ub, Gְ/ϐē4ˏ.y%wLP,A&ъ>PALbR޲Ƃ)NY_P'/\dcJϞ/Cq*ZKEFajLݻwgG8so|>5n~)x8fv TD)ݍnT\̒٤1 .BY7/.deLùϊoptx77Л;9mA99?WV9 Mͳs.޻-N7ZXWDb[fȑ#¯j}z|y8xxa,X7pF~gu nQwTn-M++ 3 B%3en!{^EյkϜׄ&@B+VPQ(+=`bKBAz H%23{}}uٳgϜ9{ }e!צʞ2+ eN,ȫ#|YUw]6{XCƳ e!LTwC&%)ϳzSw$k RX1t/y4r\i ?j痲MԺ%QJɓwSAѱKLr * mZ~2"d f+Rym Z!ӏY]?c/[<=?̠,+1.<c1r{n`6}ݘ]9vGxk[*~L]„DusRA̕6FH*Ł1Ha9`2U XZ̲h+i*8@P>(ChTÂpdAH)qQXLE.afwVag8fFF25<+]߿=ܣnݺ' vmªUÇc„ X,1cX33,Y2k;wn4F!c4@*C?`隩;Hw:ɦ@>fn  K+M ܆!ah⋩k{ze :$XޚP t^x{O^=:YgJTצI.$%)Sey]7$ {wh˞ QZr̤rq Ő.G8O*1? ̀Q <@QƵ )&7ryMYv1V$y4_Ogx| _ړ_^灂`)eHJj[M7OZ`wZ]WLG:|%Hfx/}/.f-| {(؎>JjGL$" Vt1Ti<䱙wG:G>Mj[h+4M &W:ƄLcr[!"V[~,#9iiHkoN(`"8YB쪀^f<:38v:>3U|ZsM"0;`F[j7Þ-b?='hڀ`B9%mdMB ԛ `p:YG]W~tDs `Yq`6?6"aP^{k$ȩRL 0M~aPB7}q )8+symT a˖-WUWW^>'hdEkpWc˖-ꫯBCUƯ7. [n=4q2Ѕ;3l>~={9|ϐ4a{P>'Rzw.䮁 {6!r-T`p$%GZls=0mzHf irZq,BL!-FyYu& /0.B_;7xiF_{Z۾|[/Akƅ@sJ~q}=fRVܒdٵDf ])ڸu_PTqLAh"߿-;758=;ayOH۪gm7 6g_߰Q9=.` Ioh{,X+ p_%oJU5MKo/BAC/$2d- ŒȂAy%M27qAhxm7! ),S7(7-&0ykQtHn !_;s_nɓ'ѩoѣ[^x!*++xb]Jݻ>S)!{^cF!DxĂM5U:zKR Գ5HV M_R#y<~ppQ]Se_>|gvʩd5KI^,ް;}@/6̣k٭NBV h) ~Z8Y̵kJQtAaGs6|uc՝MC[L${/%@ėyN7o!mĘ$fuF贋Xi*Vl sYOTl ,6-K1l8w]+XY9LÙĢ̪6k'Є2oH|H /z6P ִ͵xƎ u`[1p'R~#S>z$H]v/T"ompwW~7yie97_fOS= 0 Bܰ!gD~ΫJ+d!c\d5^M^Utъw5ko)۷*;;{μmo%&y9U ® .wJ:U+.j1^&,t(.u3,ePtZl4^b23򏢃JnSY>)@vȬ-/`s[>5i/8[ϟ8|pSOfѣ{K/?,Ng%/* I\pI3QʕFa=z`H<2@U{'1a`G3\MMBHMrc3+\}j02Jpy5fY4K9fߢyt mV'fd莭9li_aްa2 ֤!Q9ںرjH&U{Ai y҄$@ k6֏m`set UX!fƜc!=t ]]N~*ExgƮVF/, D3)3)5)ȂPA4Fz߂-quNf,7^!җ4}$;s^>i! x:ap-0g 0%_>GEl"NEM40XRF<f 33 @zD:s> WӴkGƗf {5|C;YF1|> Y9C6Y%d?#=XANZ9r[\ARz%lX}At;o `[IyKh3|-YcYYYC rݺu[Yjjj0|4/r͆ht#F[qiv*?'lюSIea8Z8ƐûSg$KS_-|ŦQGIO蛰ž/.DhH!AMc >1^ u`xl%".ZN HvĢizs^j@Av٫p*Sr%n`e0U=idGWBj,'[ J4l|۰y0[2K޿xuy;٣_/+\\0r˜=] _,&Hۥ6c\ ucB2Ԕ|i eYOHc'HYvh( ,ZF:ғbVeP/rA5IGt:y?0T0zM^✕S?zCBqFz |GP^Do}_gPM0,~.by 56p]ra#m+z2KY{f>uk@^C|+GyaU%mˈ0aќ'6/{Y_AFt;cbv/:#)NI$p>2ALGC'WN!#c\_wPT !ҥˏsj"P0r.-O{Qw`t{Rz> Эom=-ǟ:2$ H곗BbNY $\&9#D|mEw'O6ݹsr!x"Bpmm-/^qa̙XhQ𭬬qׯ/R&ڵ;j~,Z 2A ȋ3Z IЀЅ;i*|ԵXT Aw%KU[}X*uQXcFn֐!92&sD 3k64 A(k}9c,${YA$e +8&nךAus9D 05aduQW`>xL%y-|Fo`1nF{1޾y~kH}(ZcDxYs|K7]+S=W@fƿ4IhL|F_:|Wv꠭}A0]l4LQ$eU5} K^ 4;)e kTQG>-8qb!Ih}7سg jŁvBU-5.>ʭh7y QR2yb~| ZV@"p3EKk[`N'$2,# ¦L"\Rkƴ0&(F1$"tQ`quk 0 d2=LDH)Um! pA}֭.|SJb[fPkvJqanx,c JHVq m|Ϝ9?Ơ$-ACrV4Ut< !G6Guy5- w6mܓG@ˈ=y@_0uln&v 199 9{?bɵqJhTN#kʾkL:Jh\׆Ⱦ:Y~:G}f:q}QxhQhd#`7oÊ}tm|:[zχ>܇p7́MJ\ B(ßϢ6zf%/7<3e>n_.J(X`&9c֪r3999 '"'{\qOI]ɣobƸTDA76"|<=ĀBUUBB`"5 asVV?3ӯ($Vl,zӯV19=Ty<<6ohq F,q7SVG_hI}xo).ugW=Ff,|Ԕu_m `[: '(sP(A|!1dB0PM[Tsy}AIUomtD$eLr]xΖ|]#"j) fcb +l쥤}=L`꘳S♰Yfj/Jߧͽ 4(l6nmYFuP, |Y3c [ Rk'/$&&&۷oGd*5  -,5?7:ͨ6̸kLӘ9b+zz]WM)ؽyRZX D8DŽjП߾tt-YzoاEq юq^mR=ffe!M?cw<8Ahz|| hᝆ3NoItGЕ 6mdӬ6i9_ PiJ\g שA)<kK9Cf^`1u}'hn8H)ng8'-Koen:FiJL$;ow;0|`1H@όKk,@02P"VE)yO uqgy)grG1dȐRպˁݳgOB##PN}3 q8Xyb>cŎ6RhxS 6̤iMv͚mi )톦x"}z&?O_6]GNEB:tsY32T6w+-Â<40ELhHy^% ' 1e t<g,yCtW6]~ BE`'yg4ƵU(՘G Bh405c0J`,[ F^›m'` !e2c]Ţ1 _%JEع``1p-e]ɓCK  k{px& I ]ce&mG^?4kLuD3.! e$v:`"Oo1 @ã5Zf%9>iCjjV,Q =>nT]Kq'ZRm:?¯s`e^@iI!DbCύ̬Ց3Wpv<ߣܮu )bT@ $T& fHĂx $iRT6 w\8"޽jÆ g:k0|x[% ] B?Vk(sko@ό]zGWuQwjOv+zZ[gVG>y&YCűIwZjj~҈}o[-3\}jh肺xzIb0fd3 j1%͆pn4sBx&08?[_hm < >s?ixl-ǻz EI< qC>Hnf_^~اf9KRd}^)4ЫĸA!`;Pz5NP_( ^T2$/b N6Op-J;yAP/xEy`Ih 22gE F%vԤx@(ުeLk~'(n@Ww&et#K ^6$'@D pځo=1bwBV?/@32cosKhF+xY?T rU7xs?|S?/"yM :gR߇k]4&("jj@\a2;٥uҬ ӵ.R/^?^@0R,2'BNe/T#YK»3i xIу}қ.2{+NO',WR4!R:gд]k3?@yuԧ|K}M$pVwbQ"3V*'iLnX-&</9k^؉I TS}d8C3džm8w@t ";7&ggDv?R6.p'z8uv:&g;3,@9& s5lSMRѳڭ0Y`4W9BZk~Ns̏~h[7\J$D035],9"ٴke s" s;Yfor^l~䮡B##l撔BAφP E >$S).6ai;}p2~{(M瀄D0\Ոv\ܖ󟵞o9*?!Ddۯ8AkN_H~t-sɓm2@nT~0%?pL2 [;$~l`ƸnmƏ:jNTruErfg%oTWY9]y'|3_@=*>xpߑ SH5J?:?=^x r|H"К _ZOkP^f&EsUc[p1)g!/A~< U nGkafuzRci:u4F,ض |La@> ='N}e_'k>E7#OU=uq &H"<zaJjj4ɣ#w9œϕSv`N^N45l걘g;xxg)j֧P8wզvxA.4_qك[AlR Q.} ߛFi kGV?+T eXWM(# d NZ&DMąP`C&bd\;OMۊ Ng됪1&bYs&uw] -BK&5biETb N"$t{p8t-x}#/|s^˂7q3jQ_uGxK Ǡ(^? m>{R7.K f'ab >Sn0&;!4H߫gƻ5Ff=3&@όw0?GzaovY-DʲnWDV[/8YU/嘽l$s{ 4No\3k5?]" SbLmm_9,,I=j> D>Ճs",Q(5#QKg bj+}AE&@yQ44 ow$] ~~*ƑҔIPWxMb ZkH6|!5՛.(1teJMQũXyn`{t9v &6 gf@G%F$u;NVx؅.P5qC1rt$xȐ!N uvɓ'+\pջt?oj}SIH#:ߝvYX} :Ь0~yGN" 4fyr :$,,wU_$.iG0s[$Gar7q G@!"L p/bGWј$갅VAvMIJ*8|45z U5XAo=𷨷4[,&n՘v é Rn?;jOvJ+[@َat՗Y2i%M+O`T7uy#a& f@&kMkE}'"zS"}!HNJޕm,|w&|&} D AyGES1w!)@o'HSDf/\aУ,X640/VZit3yP ^dA]Zis6Ш`oK[ZF>}e|yJe_)'Hdj W0 9A0gV38u'0z(4T6vWRwzwܪ=#LZiS q}Qoo ,]o-L4|V~p/@ki;ZN~>))?N|ďY^|pi1xcxz2j=Q_;lpZy\wx2b~*9=}nvB۳Ʃ{[LF~ Ȃc2}~nv7lޮ3%x|3 vNIףK9Pf,X։!etޗۀ˧rЯJ#^DY=`ooUlDlF^dxi7yk&k4\qM]Eԉ8"yE;w:M R (Sny3⤖p Lq`oemߝs@!q&9t#9=q^;)f}ǂ?hVXt6U(UӀ/\sϿ]o=gGU{V6JS}yb/{Ezظe4Pxw{97r~jrjfZPfgX1@jz VWWYk |t* RοC׮]>.dmd&$Qkp J'G .UNXd΢N{!$}6٠X d JO C0r6d`:1+X`l?q(nW0pY`,P,NÊPϥ0ܨ=F?T[Af{\-<*$1 g]PG/;mZ5񊗨M?.KzL?V]NBf= aɊԷSz|VDRtYH]8<"eԤ?'y IF') A.Ãme*1unVN1e}Tt++ovhְdj1^E:jcaq䪪o9ޘ.[@[MJD4oWߜ}0v+\J@q]#msNsWkaɓ>rcAߛ:2o"7Hl-> =FfTS3>Ws6U7UB)IRFk"S/3d:V4~؁k_ I(MIX(0+4A 3Q5qAc$Fм'lFb_ &2^/έ/:a_څ6dhؘ:t ~;UbڿW_}m6۷6l@AAOٰa󣋌ĪUaٳK.ETT~2 f/dgQf牦+蟁V,EcǑvSy"EYQ\k k #¶GNhDC̀oEEQaXg8arJ+7͒@isZYIii8v[~o}՛cŨ/W)n/3<%e?*>'6آxW?O,6cX$^rY_9y`U-q^ ^>giơH;i,)C{'0bv J~y'JfG¡ЈJMW/~d7LIP Kc#kerMBO}rf[35d$.ڹ>k";H_)oq ̜j#4 ~͹1{ESϜ:6AI_>Wɱ}ǘUox ]r`d62wW4t 5O˚!8QaCSwUʬ(Gly|whڴiQ+? OvܠAرYfM ]tܹsΝ;[weu,vs?|5_Q@.*OT e rc[Ltaxl-g'ge|b+-CpT{uU}hjI, PkS@ϱkT Jwj %( N!{Ek't^=n`Y)V)3DӀƆR4ۃs3pjy:́Γ?A`CM_} b/TgiPFЋvIP%pRd!D#Q)ܼbWsG63)wrz"Ma25_ SDw~h'ܣ0mp] uIر*c\3J. EI_3@rAYmJ-xFoņȦ]6AY'YA1rBzI N/^O_>y*=jhH0j:'hX[*~ל?J`N'DY}7|)d׿/>k(ʍhB}Fva| 227H{uxS.?taQt9?W9Ѱmܤ3BWU.9Ź366HL>G&EEFƱrS4?r^mp˪0՜~ź޲.#jW^ؽ{wQ>EAS7D27yweǾ{Ώw1a'l_RWDίDؑ|"Hڠ5^ * l@V m(RH6-t֘\2 9(aVQy_ݵ䭾'ǩha+!:f^T+qi,,qkw4BlGu&:ߟ-u[=n]1+`~'!KOA?2/U ǀZIx@0ʓ2D33w7Pu"\+0H䥼O~b4}ڰ}rkbѕ cr7=Ʃ*f3jm ;Tv f`9>Vz2U|W@0^ M 9=:OrA{URRI=.0#1I3?><7{:<\x'T> s6Ռ&dED)? GM]s3ݍT t뭠O^kKr-ׯ2󟓡RC* ϐPruV{o,kyv-~q@Ĩ-@!Վ~MmhqHp:6A` gSNCKX Uآ*X_(EwU"Uo99a]`ap R0K@ei ?oMP]c=Lԫ@;0f䂰2X~ pLfDA޵ ! +Rwث7432fLD>D./M8uL=B<WQ$N|5G.ȶtC}>tno<@+Y wq4ji\vZ㱛\O̟Q^5"ᘬ{7@f _ 2}K&w`um",_8q`Z jtiy7P 51:o(oaW>`Խ8J}~Sj+TG 4 uw6E~4w/&lpQD6L=uy=['ҹgm۶X"HӅ{AP IHHhDUE%\*4q/84O7Y!.7oU=DUwukϘ Ș"VHrwZ!(5C}VX V [UYKR.=x$ps=Z0+lHz^)(  uG\ l13?[%|L>Kefz@gr{gB* tYSqΦd3N4#׎8'Ʉn|MT&|O{Y; Hb.5_Ʃj.-^KXBFp lQ(N5"$%1?0VME0PA?E놞oJᅃ(2aAtkGmc\:>gjҽJdg\/|I[9J׼L. -1Zz:la퀩J`:7,mGc@b*5R O(>=?n*|@yLIw-6RX" /wCv9'$tE 7&)l^kO@V|4X:pÓ`t($UiB+nQx^pCs Ųn zzdT!+56CAXA[eakWZv*i Ųя/PaO[liҪkww;6& 77klqk_yIlۜ=w:]>mDMͼBQ仼%Rj @wi1aDbcIJb^iFF^iJ▒9 7 |e5յbQ(II\\0kp$@Aj/']iV͔wcۼ/LIyI ܛ_0M9Y&j9>F]*Y޲$GOExj^Q!75斿4ٮa +/0pyFEXY;ulZTGPo) ɑ?}p8cz4-Gwϯ#?Z 61ݷiC-#ssszW+(]6') e1D@L#e; 21W @ҔK n=`|f|zv7 x|6,A:D/&:1W>CDƸ/kvx3lmI ^چTCq_RyA4yLwz-1yVp:`TVS prT~ܦBΚԮMWE4G_ۻiCFR )/0븫 lg6s)Ikb< ޸fzk`AWn~0;:@A[m½>.ѐ<+YЂS/ 69-p1Z"-!Cl6+ Ptas)l;#26NXdf9>tZL!՚+BmEۏ{OR [3N75k8ר/SPUY :)E_[dy)ג!_@/CnjJz LBZm#,m-奢iaLzFoU^ZٹR3X :f8_}-_97!AB<פ)08"4z[`sfa= Y@ ! bN30W@i7: kP0} IMKf>罗[h7aV\׼qMr`uJl7=!̃s6ӊW铌m#*..=3Q-zH:ư&$ NnhR}H +qDDT.Ֆ7x)6?W2pY`W5_j;x :بK|#-xl{IBqhB#w{ZNB"BUukrƼ;b7{XW^fG !zG(G|NX "x`薐F TgHd]X-`^wP ځR DT'DQ.-B])} ٌ\ ̝]g/)|KOs7\>i) a^ 4Mi=.<`ݳɺ Hڣ624;`hL(` tvڿ"κ|wQ,j 04e^zZJC'b5FK7gc7CƸ @p ɓXG2W[u(=dV Xf@Q.05=0F>ks$Bx0 \PSqzt77zMȮ $_gz^7A zvUU ԟZiSW/픅8B JA1S֦}RL\f#m'|) I۹CcTsXAt%d(nS&6@W٣ơ~w]&C{K3g<2)/4j~2*&UI 9ץC {t?u׈ukc W h̝TF8ꫫ}/|߮M]̮6cߝ0SEArײhb;~8R wX~ZbW0-߬ߩarw_T(&&K\RU8# X%2(^3. v;4HReFƩW+]М͈2- tqfpX_QS65`=zi hnv<_ Y^F$ {tKעdz#?#EFFYu\) sעVMY8ʐ\&}Hm|HU\ܫuK yj %WT? ۝ WTqP>.L|NW]7l He] ֜ӞѧA>ts,EХĐe[} jNϚ CP@̯C4:Pbbb3"O1\ARmeSpQRޮA{26s"7ԇ Bꃽ?׋^7n4$,W[ۉ9SSߏ0D_,aa\0' 8 BUD$}uEB׿D4&f$(t#@dʃH0"(8xrw0"bkaaڈTQ?"bt߆ScKTv2oa5/^]NљTK$W8ZC9.J2YֻU7UלetϲL-h$bWj>yJ z0V )h୅x7[ݗp]PCD=|.ne)9-oWʞc#7zzt.*RZ g4?Ň*|P:'XuzlXָk'- Ia̲EINL s+f7_5 i@€5uc6f2) -Q@L5J/yAkHnj ĭ>m(&Pۆ clԮ~>4aŌ96SJ$dL @'% Ⱥ@>L~ˎѷo0} _ ||ކ230`@hVVA3aΟ25l 򘟥'5pk=h$LBdW{hNTTW!,_/Ў9{W:쳋!,#~q4}̼Eq={ Řğ {8mlT\Ŷ:xGg'4z-魍>>&c0᫐7wϚjgH&|wO0`9.K鼿4%1A 'kmhX 9='u;xL-;FF9@Pa2褺 5@C rL.tݘV/HH LU'3K_j0λI8%N&TT߿GN/wI2)) .f_.Z^l p׾Œ{;j&BdYٓo.w93:BM, &IO>;7kö7 ~ OV50E,ܞ14mO%s,M1|d wPnGy{#tE_ dYR^JKÄ^~hD`N7_ ހ!hAߝ䬋L_d!y_w1io]Zazc)=:93)PGUǜȌWgnR~踉7U;63Aަ[C2u+TU}k?ڵC-OP @xmNkOS+dL*&~J\֝O$,h-'({ Gi۟I?8DEenx ~g z&>G?\2rT(h@΅}ud ,>4@x\W}M7\;SUai;-{M 6G[{ ص>-:.<^}?rfw8&6NF=|t43͗i=@)z4f\'B?%442b7$x<|Lķd$ŞG^'[[^9 םN3/GiaFv0& !2_jڛp t:H|:=ʒAAadPT;iu-e_&9;GU&|_^ >#))o~k/.}`D&aHavmR #4t?{QQĔfRutX蒭v'!i9uT/a*hŤ"AP ּOCrYJ@$uaBw Fw] oD+Ό.O.e0ЕctVA3] GsI1XvhLxgL-BG_9Mk1AGc)F7N tZcuL%| #ϣߝ02ŮHJz0 2b?m̖sOQHOuxӥ[NImnt9?g kTø6/S \VLBk7nWNflWW} Bb;=%;ӑmLfQp(0Pd) Ŗ'^ vu(rèNw35 <16W8:{c΅}pA`F0(M7Ī{,\c 6v`6dPBxCJ"TJdA Dk~/=MvU-ۙ*&~O5N;Qm~'bBR *Dsi-&f}m4Jax%!wq޻+D9w7'!׾}YK\c20s Q 0O˹.6z<4dunr_2󏊢|߹sT»FYyk€5^#+}?w>G' G*2>|o¸lA8r:*?fKGwr͗0(@`"LoXgg , Ư)7ID1PC~t~1[wEY܆qt)e0U +WlGslvd2aNjӮ>- owco9U杲SxoaAV|O629QS5T$ ko&IёÂ R.~c@%jbH]7Ip6l(+**bEQaP```.r9YAÐ0رc:ڈZrt@ i?f m.:`PUUB!"%::ݎ>}0 ;vػw3[QA|Сڥ+9~h9%O<Եk3.]: vbVLb Z^#NxZXu,=ZakLf EEޱ$6&*}WO[#LXZYw}JR0عޅ#S<;M0;7)vYI&Sz+j 4L |[M#aVXaDt%B%]v'ԣ4%q&T^lA FǫCj)7V:V+biسa~~`f dbHak ;r|k E,ܮ_ǣ7߁n=p>|uT(i_hk=#T2:xk zsQ_Hޯ+At-eoHNgG0W Kgkb@jڝ8?!֪ )Ə?J2XYQ+66V\wuٳ'f3݋/'OzdZ,7|OSKP$86[,^ q~éZTr/؉Hfeu . mB-:ЃBE*'|l? 2fLjj~`9g WGC강O2Dii)N'3bA>}`XPWJTHڵkG% q%gc5x@ÆN~+"L)3̼}ֿkg1++FVRML+ gN}@)n0=߬ \ђDoBB4f#999_~QN | 00yy`MӠi GBBBǏrltt/!:ĎmJ4G C)T9Jj^f\^:sϰ­^& l$KŃ&ՈC#wHtaa:JsQRUS !ue~1[Ж x$O^CSp>6Gt7?2"<4 v gZT2ePp@(`еr$]`^Ư|DwqYw8".geƄII98{'6j0F7[XF&N8]/+̝;WǏGbb"nXG:O4_ xjDϹT[y_DmGtYkb@jz_򜼵U4moRA^7/p 0#[0[X@Yܶ:_5SK͹@Ku5$b׹1 ,2GI"33AԯU7ܹ75?_0:.|aH~uGgggcTfOt{hhcLgdX]ߧu똳o4MPW^}Ν;w߉W]umnToe풰l).덂ɽΛƬڤAIzʉǽ+l#+@{ީ:uGݻwbԭEMoShԨQ!C$5?~ر -I{˲'rvkH{Ǐ'YBUg &*HX nu0-~V0pAp;]0[jXjCHxgM('-l>YSsy}[Px&_QƸ57t2!S KV05 d"@ ,S#0hX)`Rfy ]'?˄\w+ Dɚ(?FҩB/'vWVTϚ5 ݺuQSS۶m3fgK^wm.5<%5ս;rF "Z5hPNĉDy=̛WAO>La^ʢn37ǂKՏa9F+p5C/Q` aM`fKv= ܓO&y=']7l"Gl!8"B3i'3\5 LC}7EZ~V_=0Wy 20B)K]ҡ٥k tVP H*C-&DF¸Lq9s8 gdƅV򢂇Ni~2~mkqkcW W ^sN[N*wm,vU+&xߍNNeV}HM^quh׈8ұd|Gue犊E >A,RP6N `FB5]ʎs, DchxK0/t:1~xk`fx Q=52秥/zfja~e\*AfϪi51A:S*C{B{`kqlCpTVBJ[@ "` ʨP0w:gLY]m2[pӓ/4\gW6_۞{ 5FW-\SJIPܞƞ KHCIm 1E1)G* ')>``KoO+ _9x]F5IJ\ppL4 O\㦛n\r /^ "B>}ii=[uO4,(Sɐ_ʮfhQM3zZ fT]ߙ{!M<ZF=7pUgl E &pmg;ޣsG^=pƿ>~=+^ .qTi `N+Lj kxD 5H8&e4SU*vH&*RWOu/ Ce%"aDu4RB4X,03jjj`Q, !d}r\0L mRpܡ$1`0⻇ kw'x=yp?{}^ !FQ\b'~t6 [*wO<3m!hƽ+QBDiV!e&g7CUHb+M^UüaZ/cfe̘1:u*aHK.Xbkg}xڃI&^zU+ [w:7Y^s<51]<@DjB_kAI@э}~ eeVZu5!D4udd$CnBeN{?zH;^q@@N+X5-cE4>B^X_ #u `pžn^AN*BF 7j0@uB?R"t /f?^ސ`h4aVSA8b\E~VfV#8u݊qB>ByX+%X)(W96πiA,`kunx ?g/jq5Z!KΗ4h⃛W6> +9}fs/[]E0H`G#Q̲cxNL4ɧ=n`,v.iom[kz`0tҥэ\5]*B.TM1m[xȽr^ e(y1 zZ KQU͙0u]0A%^ו#Wn0E8~rmBw^ʳxv.(4 IApxKX-($zUn4Zw/8O?WyQ!Ο8H 4JP+ 3ͩQ 4 bW5<]WDQ.PeuXŠN q [G_7>{l|wB`֬YxꩧP^^gyś<1\eE<0{W>~nʭdX|o/*舀jU፵Y_MQ># &Nm / `q5/Ϟ_-1KnFy@0_9 æ;p.zM >~cs' bztc{Uӗ ï/Uv,X ,7*** /5?ƾOj{MӎrByjzs_˧RZ,-R-?L+r*3OC@A6/1 \q%6swqYAwmret>zdO/e5g<"5]_~%])GϞ=U_)5SGy~muK ;{mѝ7~h(c3g`j`U]H)5PTHLANǽǙhqVD!i'qLD: mL &3+ۉp|ل;<@Jo̅J{@`oW 躎_GY U"ӄŠJ* [W왞 E%xK4x!?{ʕH6y;l6^{5lݺ&M¬Y0h(9;;۶m(P :!e GN TQ `+G5-럀Vpԙ1ڄ+$nqЧI 'gZ2A"GD3.8T{YˮPQV;'ah6Cąchե㐺ViPl0,/xEҍ~es`;4>˷'r˦{Bv9@祉 EQ@~@+v+< xX4,bZ{P3G[[;,%y \!pV処tOW٨wƎPk6ucn8-w53AL"*,, :u*~KVUdgg 7P+כYfUĜ>}ӧOC=~oA޽qL&Ӱe P"Ʉhݶz[h:V$! s<}'9_=}}jޑao?Bwj+#ny/q6?#WZ.0bb3/r\g:(u*7F$&'y֑TD뱭aNʇe `?^=XUR14X"..O7HADiii'NP~騨@NP^^]Uޚ" @M 68ܵ,=8G*z*8IʘJt&NPNt0.:xg "; |0d-J?bК 垚.r~83V=Vٙ^.'p3eQvU% VlBWyn;xDTVD8CnvP˱tkN5v[1yBI:tnOv0:t4MK9yvcB`„ _j*l6̘1| Ο?l{オQW/_)9Z M>M.acH0~uަ63ڇv*=lRl KQvQ5Lۦȑlg>AO<_mgbF઀v:j}kN:AahYc?Fhչ ";v_H rQQ~=JӊA oLa: F@*J u!e| (#"LLS>aFZ0֣(WԲMTqqq(B9Dt j)r T\!#UCJ[TC0In7Mӄϖ_}*)*񹬕8w\c{6|x3FY#_}z7[iYT^ޒ"QF3!DcO=Ta߾}!ŋ =sjq}bƌ>>>3ܘLq,)4\CP&:4qQI 0 gR) AFl) f /G٘@{Q#7u r.U;u)PzRh.E|/ ֪(ԫ4t:ݶ'MtV0#(pۯS둍Fz\[?:{OR&8g"%VѶS>4UoP^^y/_'n6L8ի<ҳbٰ8x`_^wa cX?9Нi24z{b!DYKNMc~ '9vmeݟlNf~ݟf?]">g:'"l t{xxhե;deD=][/!B|rageB:AB:!L*t3U@D3>P9¯c mp)B ա Y- LzLkfUUkv݉T*)ew/ܚa;3_Qc :ky`9ұ-qx9VfzumSf9קk7^(oR#X򩭗Sҁ!ٝp;}}1XTC{Cyܑ#GGң *}sS:o`ψiQrII}lꡯѡ:u6 X|9] [ĉѡCfu}E r][p Htx2ͷ#sSu1)9N(#Ƒ΅G{3DT;3=>>rĿ]vǴG߀,GS2yA;lq^Z&\єeۢ3c5N= $޶ /hdLwrE?.˂uG_l㍓ֽ8ǹ=A ۊ9"B߾}3`„ n ш_~pRׂ,rFe@ = 窗`zh.>Z6&HN_7wxvW ,VV2h&ܾjr]z?V>>(ÅS'prnH)ѹw\=["mBX\h [yiQԴ̺-}Gf5EU2ˋ5 &z_s|ssX*nZbЬ0f:l_n~o=<<:9g9)N}e4b0BcjNZ񚡉yP]0,M W0@-fݐcb`d!Ƶ%>_4ȪQk J}:ȸ5/rSNqB~Dži̗SzJ78I<3R`PF8@Q+gGD3suElFTT1j(tQQQUηjDTk2'0*T\zECk/J8}0q &(bbO!>Ɉ3 hN(EPj*r*Fn9B`K7EvoʂkPE+%} ۱:t@qZcܸq;wlDTRo$%7Ud)5  VU*R6m3,]w+[dEdˊ#GjslſyQ?B04$tCs8( hEQP|@I%QÎ2G42IJ,`J;n))#O`~:jT %Y2|ggtҟCe=#z{a};Syur3-^&?"aYná&qoҒ+Ъ __4OV}NLL,IDjfB*hokA(|pl:~bK Od8.*5գc©O拏^h~# 9X_=񝱴0qZ?\ژGojTlP`!'YOUV(hdSWU̓W`OؠekDRUfV3YaZ]UlպukL&l6lZ+`<ܦMZR3z"I &BL6`3$B[zx #׊iQU]}w1ρ ^487=<@A(Q*iePpOMje2xp:XK=CP >w֨=DLov/͜wQ Cd^M=;vW^رc.Mqł9s 8vєn<<<mۢo߾PU<RRR$''WӲgsM&?P;Ulھ@olv?_ 7J25!@$߶:{C =,n{9[ܘ*9RKMyaT.9pX(υ"׈w躆\UYTf❖o_zbz7dž%qH }&O/^ tX߮py r˗fȠ !'rKJtA;L׫eoM@@VM4hxÆ ^{˺׻*FUgƺ.[<|p+(O 2OWirvmUR *wgJ]#|ᓊ2nn_oH#T80M;TWB WE|`q# zT*~17-f-|r5-^_e`{c6lT$NSǏ˫gb}+d'%UǓ-0Wd&R\Q?##urݧN<==n~~>"#k.\Pc +$`B ]Ss0K˨\)P|63 oTL/2h U2R+BކՊXLXeˈkґw7^  4 2PF6컥ǰHOd]@q]{ti0uǤcv1Zt\qsv\{y9u ~[[5cQ$mNWA P]ef\QzUV-y,/޽{p`J*dmڴqöi)u]V{r@$wK58`ݝLYsGcY ||=rV힑ǖxvFa|J+Y Qn w4a+GBҬ?x^o-Jh4{quUbݺuXxfJN-oM`*nm15k1;۶m91iJ]pI2gٚxbλg/y 8m-%E^>ؽ6Js o{6߼M93SSprn&DEן6zzTn-2~F%8ԭ_c@Is>dZ=|ظ+z kP;w{]KP$tM#$5zcNㅲ(Aotƍ44.::@(GЈFD {ХKRAmu{ߙ7jVoM7MY;>~=dq6a-+>kz ~`|75[Fu |بB ؤ2‚|08&AGY2 @1 nYewԓU` p?܋WÙ-3T-r0"Btަu!8}m1׳1L7tα=zFg~7z{/R_R f њѣGO𓷷ʏ>yMHMM}d24y/ijYts<bG~Ә}CXO*XR4@mIp[fUt  " O0hGvN:hl|j$ ɔ^3|J8**`+xJJ:9sSNi4)RG4M׶m?:gh<@Y^5wјk.ױjd}d~S2 4VMt"3I޽~ YH)QVTÎ(B7/[ـCr~ak(kyK$ Bpd+ L(7W1̥|ٝbYڄ5@񐶏v}) 0V(8֌YN*+GeqȪ~oM>0ÇJ7dg##yӦE]wF~jw8b+,Іh(EGd:a6?~zHNN>׫WRʥh5%&&nm|oVta8释ӄ]ЌB Xg qY\9EWMyٙ<*,u|)3U(..ZTly:1Jk%Z6֪C`v߻.K{(^hSRnwM%B;u  BtY>n[ݮHoX狼ݍRM6 qlgza23B9 G պsFEEŶ6mkDnөlSidTr;MV79z.FĕWj 63I x14kFLJM5@UUo$)BBLDuWM; 1\p!BmKTrD]!wٙD3(n5s# {οjq2)71s'S^Vl2 Ma}&5IVj4Qd)ЅP–@:XEd7De5;h<(!0O}e3O-MUIΗ &Oiرc8Ǥ%/=* Db*7n|[tt5B)<}duԆyZlƟFia]:7~v?j03:ylB]iojC39$'K/I` ֍L&S^GZ2a;D-2Z-N~'2 ٿi+WѣG/e/瀿ݕܳODpdF#'t"M+ELLLgf~F# ˞lxplcM%U>Ij#b6/9r_ `tON7r9زe[fBD 3v=_T]ell–?*,ƅi() ୭nZbbbLJJEU8#%%T z1N]/"Bu\&&&&SMJJ fe%YѤ ۷oY*u`֭O=TǤf;p}{qi: ԗ"0j]9;fm?}0z ``dfc݆?m+P*tLQlv %**[U4L/%y?YWϻƝvxAaA|##K'X@5b0t 0{].]{tt90iJ%b1Ofg.\o Ǐ)┦?#\ludxm(ޤ+&ȩBuIUQzWK 5"C{/[si_ǿԠS$XTTc]WT)R>;j2Ie;;P2z5kRZ^^`Rzk3e}Ad3附#Ky'cA:8|+p])ٳn!J)AR P/ ^TTtzʕ'7B Wf~~DCLLY@•FHApL?4dߏ&)S( :Λ\ԱBkP|Lhuڰ&@5@NG"j@{EQ~0\;w0 L"`,@ϧCpcqطEdDc{ɷϰ ۢ)s$ӝ"?U XH2]#;6>몚y ƾ@wYo3?'߲yAJޱX%LLLW^D@]d3s8M.\xڴWj}=Q5?RC)~mQlY.X1& ;1ؒɒ֥DM:i sy!yell󉉉^*PgGGGMD7#KWKvPՊY[?⥘QQQ}sIkr3Eu4.***0n. o']_Dь3Gk:cmK/XBk x#2pRcSh4v&mԆo"jZ<l^w"4&l-DêJ;v4EGGm111k:vhjlCV0 @3;:7b9}@Ӆ@]+!ӣ9¨pBmNȀUz4ZJDoe<:))[RRҌ7Q'sTB<5mvx |D؄Cs}p[DgёƴV7>$ 9O];:.|;n6m$lJ)$ 鏝^]uO]τ6o3(f5;ԉ` tdV5oF:kCO ,::/j3dWnA^GK#]% J0Ĭ2eʊѣGvmwyg7ߜqwR0Kt96}F\Q"U,NuEwH4/z;v׈_ 'j?8 ܾǘv2-D,Af\uH@Jr}"&m0>tJ'"AMWB q\O(o~ؽ_srnhH9->jpMZҤJc@2099H 3f,V=?K`>=sqeee8y$K"'4KSokмni4Xv y =5z@fe*0]V1`@?I΂O0] TJۗ8gfk>'}[dO>#߿Yf|4h\!ZTA+)'uM<{{5\!̈NU~}'`#:+buW{X ۿNdao=799yRcη ށA5uLVA:z2 >.'+O;l?HO <6, ¼ADU%T{ܰ]rH:t' yvϡ_W\{ꞯibEMz?J+OLs]zpokL4*111T9[ Flٲ/h鮻uɪ;Ɵs8odeW8[ <ؚB:`hfv_6ĭޙg.BGEٕ1v4L]Dcxz/aG%fnⳘ% (=FzB32'#pJ@^D'.gk,C;wIc{n+WNm\mן('q$Q-2exyȑ랇;E΄HHݻ NBLlW,;Y_v,/vT\:ԟGh{VL1aw+Y$q_:jβl37kh> פc^sgϿlMoxxbJ@<rx`M#.Q>GkwxFFZQO/E߆>ocrfGGGbT)%-ZiӦ?GVǏdԩXnܲ]G Dv쌊smvh.Fl~`֋)cvfBҥ [pO X-aM\^9m.Z91V;=oR>(mH[ZE3]; ;#e= Gn!Vh=c Y֛z2fw&;VK}}쏁yVCzyD]*Cرc1rA7Æ ^?q ZXea^ѣ` gj 7}Kנk޾KRui1d6{jHKK3… xwkJQ>+\ LW t ft[)=>m{xW m8pGttNV%@yuTqԩScbb^oNQ0` tt aG;#`lo@E59oZ^g"²U'AFx ]j O_W+,t ortPhŘg 58?i$75~٪A ^鲍%`痭L \B 0kMO)e%5fgȻViwLa lhj]LH]|v .6GJm< !os>}6C&q4qYnvUDHckiՅ}k^sl 5r70E@Z陵0Kw2UH-)Daz.MW5BhVғAM!DR!`?"0}S< V G{wyGe3Kl&,#ۇصȮ1n!m:MSރkP[MyNɡoK9w1ۗ9>^kWkZz[P㞫rh ^Vؚ 3klNE&%%P5aqu'X5x1ϗY\t_da_H.e?D 3X'6о2c%%~P#A O5"j|]ʞ#0"7Lu:J,%8ro3n?i?Ex䡧#ُFT"wKd?ߝt1?'p(mlfnn$ⳍU )!3cD`m58òr@b \\nzCn3ETS:<2ǚg˂_o;3y A?xf"n)Q_!U-NF࢝geCOVuC*.STFF%K|Bc ǥŇgLLL7Uif^(JDtVU11.Z[flygD.h*?_hAak u+\0C:Q& u[Tڒ$.^[ QcҫffF(n۶mͨ-izi?!ԥiW&']z UQQ _JqYED5ok2mҧ{  @5& $\\W?!6N`?˶;s6Wo&0(-*@n=C6w3pJʑmG J<`ft.QϾKoՂfUŭV;o Uy#lUUFxMe-:&k.v~ E}LVg 7nؚ0zZ}$s-C&_b[qr1†ڳ8EU((,[έ~oQ7K}1ch4"?3i^ |h K!D(J[łW含˒kb< 2A}B%Wl?{kiE6y4"\-nމͶ_F#XxqXwTXn ƸK\mO)!a![,8=`rT{.ʥN̯VO cxaiWznVP0uc߱O1 1b@*6 ~mb `uַ[Eߪ:G}<׶u?wc[k|RS ]]s?5πCjѻ%Ys6/΃9e\NO1VF*1} k;% ܝv,.e=8BZ@Ghx?Ez(*C8i.e(j#G6[Uc||<̝|̙3> bcbju:22u bbbpl6())VNO~ ga$fC3瞴ڽ۪4Tx T&DV_YK_pH)7 0iP -0qa6QP]T S鷯q`y(7&sç@ =9vJ]L!RSBPrd `Y!ը4f.J"i@!$v7»FZ\ 8Ob|N>r]+a{q-4|8 ыPCZ{ iaŵ՞!tH~E̿'٤kl x 'C+A}WZ %''7AZl a , n*WuגH3 p-־wu}OHNxޞ:ir랯.T2ŏU+ z:_+'] A+ 0VewNQ} m۶MygOY\L9 \@aa)2Vlb߿\,()Xs~ܸ ;^+[?oق'N4ZN5@%^om<`Ĩ7ј-FQf:s {Mё^dza9) 6=7Z}Um?f&$*NX9]| m}ZMTq`rbF#{ʾIέ8QRNNaL-yՄ;x7~l&rKH jǕس~;ҎѰ2Ԑz{܉#;Q[Peۡi/1cP^^'Nl6[nBZj}FX+( lR[P ..1Th qyӞfwsO3߇)41i.uGamXKn@Va&-m6A!SC~qEd[C9k*C黧#@G> jU]ηk04#Dl-a@9c3 yچ>ǙtKǴo٘ #[5''t+S7aCh$d`u D'hGP vi`8}$,&yr>|H@jb lQRMp5lp8p|t)bcb0|x+kbΝ;Wk uҤI>9r"j 4+j.XӴIII]PMtڼ댪qmu@ h:o٫G7:nܷ1E ;Us]QU?l $ƌaa*"УuKthCXÅxF* YK[gyiNm >J}b.0cPABᖤѣ9{';8J˝7pnP%'' 7TR+wqڱN[0U BvU@*j6C\+>.株V: .r{&5%Z/ @/X).E@5j)=[4\Eik/gB\wa40Cם0N)xѣɻ%A D (˒ ݮ&&#t:j_-ޏugƝY a 3CJx֓x``',v,(ر01ZGb A@nf?UP|_ q`X p-TUm\+b{ҟ !T}˫-vo}N3KϨO6-þr:: $&.:eYuWqGBOZz#Gk1BХˠmY=39RFd/8}wq:~풼'z pUcC' DGG'p௻}LPR {lF,̔R%s-秝KF!2M8pbʐHkpK7|:?g@|UMgiK3G] VΙ3$@7oI6g^Fd7Ŧ?GQx7kpEt\;v8g6:N!+‹/̓luݥ/|RJ3yf5{#L3LNNn-r2f`W!"uѮ[\ Ǯh RsuZ紹;v4T٣o"#q>T'Ĕ.Xȑ#cmQlW_ٳ;$%%R8gTVH[<:u|5~⡭0M*hyC^F/Njnѷ%^ ^ PLLE-O"`)'%U=x`&.!uti!hW$ :a.*M*LYix!g'Vd ==_e#s{O&%%5\Lo٢2 ?%I/OHDqU+ŋ߭l)Iy~O߼RtMWaB?~$ ;R}ll'(=oERInAhΜ9D4shʛR^zD]|O'`o| 3c6il&@$r>M>ѣG !Ĝz#@]BpMSE;%6h/4%D?S,τ7>Y> eu7;F"Bc4ƙ2 .qD`a%@us)e3_LVdqq1JJJЦMH)v2{„ CKR7*ik⍤+Zqھb0MuO|%Y*R+.Kǵ)Q\\SOulWj%͆^Wʨ \tR.G,Q+^^kl{%*fw|Cô<޵j!"4mѣG6e5I?*`/ vVGW2 "l3Ĵ=/SotSAǎF$ܕ!:qGhc@ة0~ q(k?_% 0o7Z4s멇_`2 `0Ļ`41lٲ 6ST5V"27//_u/fΗR>3yMrh/".ؙy՜qztOӦӯ\!"cbbnNvR-* f=m F(ixF-xb1B-**,*42[sdzjU20o[_vʨ-:0^#24!T7)׆xo fľ dǡkZGBd?! Wbz1}[A%vzI8ֽWbsx+ ⷨK ;\E|Be'IDAT]eq矞ov OMX%fC|A12~D%隃x*fʮZi6R"tZħNp;Xy[WCJ&޻e;ߋf$87*Qy: UҢeh.f+/%R↏?F$^X&Ac5Mɗ]hDWL4IIIIOJJz9عs羳~~#G6To["*1ӐRp{a%'' wϤ[;}PDD d%@1XSOn}EpF l`c[O]'W|/l9L~Ig xf P~e UR 5Q[}~5\}NL5Iz]_i?]K3\սxjn1`Q~O{Lm<}s96,V`Dߥ(x!?ZZԠ@V5?ܶyuө rӧ^ K ZO Q O(ZB|n?<&۵VUP0ΚZYuV C܄; NG~z+}s-&\K_C> [c@CU1ǾR>D4N%&&.(++[_t:a0M6i.\vU%r#FƠDŽ 4$_^ f-~~d[॰v 8 :Nv㥰@*'Nhw-M\jV4 * @LIP(wU$պLyumW * VDpO V7y@!0 %ù,躎JҢ߾j3ӑ\edb'b,d"'?gΧC=VXYИ&S'^'TbmKr^-=R}4MF|Q 05XHi"&óq6#Ķ&T,i7 F<w 8e ´V7}x, 1:9Kzu3wFDog`_(q B4 yD 4at+RqcWn1woLP*Pʤ&Rjbrd 77 8-зW J+bE||zi\ʁvfFZF&ݴbdIY9==z(̹ԹԳOϭ;Wàh]Tg]DNA!8x.{Kc=4a2r"ۚ{!NxKDW]`2T SLa(~yljSÍ ZmCW axI''ۣ~9k,]0)V ‚3/8H_ױf[e=g<}`Ҵù/+֣Gh):zh5iOǎ-O>$q+`@DxqmaXl^{5L< EQs<N:feemX,!|ͤIWZskˁU!3>_\"`3GorWYիW)J}<+8zDrr7 elMHsp@oO& wExDZ̘ uxmU5|J~yx;k(mA=#{: #Vb剼OOw1>dU$(_}o0D;"@4<"g:0صÙ'|K o'f? Iuhp]8Sb%7</{~75[GWum߿ֶ{p 8 -uPw;۩PC U RáP$K=ֺ?v(<}5c%s{nxJQHȍMM w}뙌fNW&3/ڑ"t}Dkݐ*Q&h yqJܮʢMHH !!נ|UWri Ї<Q Ai׮":"qt4"vY<̋k+$.ҧ[TDg^~ӭSbkKьP-z6a*_fKt1δg+;T{Ry.k?5R@b=;kr]ےݻ POnL p/cṦ' Arv}9Iܾ[* |d͈- ơV*|@35Dg$ `sܻkC i4CQ>Io+.4R^OR۞_UƷ16oLTT{cʔ)ٳ7x_~n*\|? 5J7xL:uԦsQV,"{>pZZ;PxJ3B4"0[W{!ַӛk*E䝧hR,^Jn?S8t-D z˾.P=m3o=TXDТNjU+v[>͝jfLݡWoW?ẁjVuVzV&LRa2M³Ld{Pݼ;ʩgGsʥ/ⷒ?*~͖ޯ7Ϣ(ͷ*|l^ws@]iR޿:ƪRK.?Y]\ T0(vh?iW5q %e>^>M!j4o|_QqB&vPZ+AlG2f۶oHtBtDibZb՟<>alGdXor4ټc7]≉ od ,$^@X$(WJ[|EEE̹)WP`0a! Ij+\P=yOJ3#i1 0C,܃.Jr{%}{ |pɧ ^n%Mzj|o/^mʒvוwRuHG*/=de\V}\VXD+UZ};_ >.sN#fwe9,.@ ^sEqhѱd?pMvV޾t;ӓrVvB D A.N]:ٚ)$GYVWyľp~Q [65 . C-a+>x]߽mil{nƮN8qDGCpLlcQ$Jjh| 22ZL[y8{A4]$PPb8ȡ~vge$1jA^T7gO 2@ 4(UD4͋lٲ3SSS1o޼z[PP8) mhEˆqca*eQB}}Z)!"+F `_pMdouϬ#+8h6Ilƽ ۜD>buP&qή + [3;d*MTE&tQ©N&[)O6gpƕ3{ n4>mJ}zW|맸5OYJA~7/qqqM^Cbz= A^54nC||mHmupv.NpzvDAL?l>B~a ~v㉋l }?6~5F.} QJE|_ڣ۷U[QJmgӀĶ(kb15z-)}ΞP2mm.uSC'=iBzKw\2 0͵ +M(4 Ɣ+:Rh!(&ۘ'%Q<{@SKjSkfކ#U|6[ Pv\u]p אz뭷1cs{=.rrrr(--`(=`@WJox|m]8Cp-#uɉp$]7 ҁ3g}MgJj[["9#. sp=122 ;5X}10+͗,g=p8+m pmf|̙R­gA*^ؿW!6&ļx0&^󐂾"& mА[RPWVRWcf{W&d]4SʚbCO|2V 5PAPv a*J5*v5DSeY݁; nRX"*Gya$&Y܊''XJv喑}s!ra1^գ+!:2GPH'7F\tq3FIg ۻzY_)5#--WRhd6S0Sk=K^; /5sWL!]/BA`P~=-չ爲(<# iMG{W&>Dg8n] jh2BDMt6h2Wr8;Q|05:JEz{>}:#G߾g<ȝw6-_{~t:2di2i$GRg<1 JUb"WgpR(lYC*]GLVtEW3 Jགྷ!Jl_.ehAjRRoGX(SG'),&S:[۴Fm7xΩU)꼁BA3VD5 XcQo_崲pgDBٸy6DscBM^>^ejښcKݔ9ݤe381h0FS1p0/ku3R$0CP7skܼ/ʨ/)gWCd'\(/&9^9CN P;DZ>/5d ќ/(z3aV,Ii$H]\YSwLcX/om2'7witi~_i[N=0Epa(MCkXܹpKc(%ڣ{i Vȏۏ sUUNyZZZ~M槫<a#GUUUQcǎƋCy*M]"}.j[4*a`xtWm+?Pf"u8",uwLw"ك5#D>+-,ϸ\B枞ENx{|ԚK/ڧK'&L`ʔ) 0xgx =Z!;>bjYyd !{ys UUa[=$6LO7;,t]]eF4MpeŽEމz$ 5BB~vOJkX(6ds͆s26m&ABe+K'_=Hbh_zKF.v_CqU&dNO{1A=5 e, ͭp#b;2\Z%%02pn>a2Ҩ^Dؾg?ёDm%3'*kuU2*N ( :Gc;@`'l5_4ݢn|nE9MOO1xi>껔|zSJ, 4hܙ衃᝺d<17;CSg+19 3P|$ WjG|5/g7eTy)x׼5P>\LӍ H򥨚yI-H^g?Q :D?;&Jw܏INr-̟?nxl{ri pFVXQGv; ̟?I&В70u몟/4j[^eQF廒=2wxW%9YKh5pJ)輸LPHkp ǝBh@Tx]kDŽq9z=@u+0M3NK`mS䗬q))=ThTX0e*2BiEwvJ[Hץ4uk G HP3 ;(:fўq7oȲ$CFڨ{ݰ\RːFT68ٰX%>0~6 #d'@f͍dg;  eцECO>#tէ h!]Ϝ[Lԁc=X-#3}(}AO5oU W"RW~1:K""+P<(ނ dʌ 1͠?4B n}[iψi^*k\t#zş={  u؅ѿo?6LD)yd'>: BAX)E=Cp@СCAph# !]v;tHYYӭkWB)K|Lx|?i G3˗^9Æ]-y>bcJJJi]ͧu]_f@`:zwɏb~5j|iHl c&aMEPE%5B¤vxKt&̣֨s~?7]YW>ʰ&P㳏g{W$\ehSJiJ_P֬ʤOwZBR EZM=sL zoң{Y n1).04m!IS0k@s>Rv36[TaZ{L}F +&Jݡ,&*l㲛Iܵvﮀo~/'ছn?f֬.J8{s+/8| ?,Po|su(P7\wE޿{{A|L4_ WN;.eCu*"Rjyb|ؔ1+ O}0b~+a7F#v )kJ,>Ц帊h9};g?rՍOG7|m[7K/wi*+pݣ79ka_غukZ?&L`)))9 q`B*.dݧ8SӴf~sv5-@tWvumj/)4Rٌ&tq\0x{ýw_~3Π0Gwok|@s{y/440 O$S.wnwo7U?_q&=+(dhҏp|AʪkL=]Va ;cM  yWNԲj9^[fC5TjAF؜j;$0ρ>@Hu!^_Yij~bqDQ-Bt汑PEcΗ_~ɫqx;hUְsu`47MEfndԸb?UWk=Y%:kXA1:­7 "WtH=߾ȗz5jw,.h󫊋<5X|Hiv&)NCXpVcN>;ʳȓO>Fռ  jge\.A{^5qo388ax:P<%JYT90u98֎/թhrꭡ(vK{ .]^9tc@i>oluǟQqQ{ykUo8,ۛːNhJH"vXVq|(bx8VXwZӻ6Nx=+vmdd& un5O~HEMSCa.?IC@Pjv[o.ᇇ;]]zw@ Zf^pb簚!: +*\3~II6Ro6HUqyMxvnк* U u ,S,<ؕp|umfƙW(?7. ݠ~cUv^%>>>۠v/Tg\ʦKXQ}!-@z ۯqcS=4FxaяOWLo{OvDQ+,Ҵnm DV*hK1ET_k~5} Qhg{ ]Lϸ#( JMB1J4%/Mo3~OMY,c Vr~OJdU0FW.ثF)` mEE @-|}Gh%,}rx'v_Y*5m6pw/65um]Y (E"́Ct@BYN)ʺW/?,j}l-v_"R;TKբ  ƴikE#P@# j^MWG&f^HJZJp+3^+0t{R *^NKK[-`a>~ /0O?%''App0!!!Npp0G4Ͳ?3F)usZZZE6K"W_3gأ+ 6 \ܑ6!1e6l| |߳@JNXm7:˅oP:ʨp>_Fk)h8`M, lIw=xF-\(nZ[Eӯ>{]u4AYu ?kvii74 œ@_Df4JOMk]I Uo|:'G띻T G+fΜ7"VQ9炚`x(A |bƐ_H7` =! OBKz[=s16}P+>8VM9P^~oi~5n-946ﺥI߸ˊ"趀̐.^{mF2K\ if(StSWϙ1n~p"o^= qY$P9ZW{v瘟^N?ȚN= CZXY5&-!55U|Rt91ZC}۾l˻4hPWh޼ynʠA#++24Mc$%%駟HHzzzRNjƠ3&})`_Ί&8mT?ף-sNj⟷&-Oe!64[4|S&P2;4I ϟݚ}rgs`pޢ*[ر0U-/() Oc5AVoR-LӜiZFZZڔ555?)OIIc3zeŦMNjkZ548o<{} u3Wɇʌv㜽 5WP?Hh lYIVk28|̸ox߀g^sN\{YB BP^EWD{ r,choLYh%" B[LYJGz{*mЏAGbU][#3nؽowp^_߹Suxtڛ[g¬y޼& 0Pؘx1XD~mkQ^\zRaŹE? YcЌx ʝU9e%r\@MmjN;o"nrܹ3]taҥ"1(futF=U Kasf.FE9J׽1kGfwDt  $nx%˻2ae\VT(=[?rgMZ 2iƸ!U׶6k0KߺO^VP4YPOJgL\sy*Y"q_5j%* %dcRLB@zz!J3R=ECý^RRRHOO?94 ;$<}`ąRR機ҹO?7ئc>X 3y f_ kjϚxSP ~֦SETzSlAavuLυ̞S>y$@D_ܩ0 N_Wcή^|~}_[,CX2vғ*jTP]+ID^vƿwůT5Wƒlo{I6=gogjő k׳[zzlv]X,V, Ng c;p:} ?.4p8zx6; p]X,,ZZJBj"VWw{ᱟ=W6M5M)"p<@bx=-]"N]eC_ 'd~v#CMZf~4?SRRV9Rr^h8OhPzhh>E^2jgVՁ 㩶6z 4WJ^.hnⵙMAƯyR mWt_9~Zl/ @U#(/=˱ZׇQjwl2pAƷ*sm[>/Ғm{^zW p&$9Cڦtٗάc<+}LƝΎ>ʈѓ:ž[?p(Sמtٗ%K~T-½P2Zisǰso^]>?5UC3KNȁrtMq(q I;Tk MS0yE8r8zGioZh$~/C>uIXNՅF"ij:k;R 4mQg#ek@<wMl֚ͣz}fSfG|U[}TMM =i@MM 555TWW^HQQQ%"kẙ|CFx? |vd*LD`jVztQ4@|FyRp loWH?󤤑q֒jjʁTx]|j` ;򜝂_]u_]ߕ!oY\x#kjj,O|9h{6lnS}>uPCYans 2M`qCkʋ&}_eHytYW};uǷc^WYM//霶û':E|~wMIIyDjɡ+z5_;Mr*}YUf8ZѤ\ W/"w"CՒo(δD#V`+OUw4qE5+ļT0TDHTp"ſ#KUY4M4u=߾$|@lQY0s6Y'/8LCoٖyJmٷgR;Ҍ[7RS[ܿUKY/_=hzyƨ͇ۤ pҎK1)!i^/ EFN)׌foPF۬5n pB^I+mG ()~ch}UIpAvr҂ L/I>Uəݶ%e^陂}z(*LTX~G[9M~I~e :}ذ[5= @Phh[u㩮P)))LXIE;H*ځU6_$?]hoZV41_&W6@4 siJ4a4_,ǒϡb ~cYټm҉O_Oc52;38w>a)[*˯z唢{݆Ǡ|ȵG֍ԡܿU&}Qs%]:Zr4٨x^Zcj~P3ڮ9\7AG7 1"_4gY# RY!Ҥ.Ok~tiaW8^=Ȅeb}?Rmz7t 8H1-EYկLX&4/&G[) }w@/r6b Av6=~Q8{i <4:wcwE5=zeoM` bOsV'Hwu>*+8c:?&6a79?֏'Yꊕ^paՇw&n]gU }dqXna-hv>wJg/7sfJ'O>5q]o>Ӣ3\U<'eΪm޾ Vt[Bu\XِKs; w@4 bhߞ$q:uݪ}mxeH w6.oQ[/ d7Ui 3GyH`JMο4"NݬdRaR4f1u6,..6Vk̼ Iei"^rRQL7/7=[E{%?hٸ PtkV64/e!MvHN>q}^-bRO-n'."0}VL`MXI{?,%ŸqS#Mfi N ˷${?B^E4(Jh54M{HD> y݆Ղh2,eR87!C) &A]V^)g^[YYցqVf|׾/6 _԰(B-\ˎ)<&;i>emuYC](M-=>(ʮ4]Q2X^bYenRN42JazW*rtUQ {yʀ(Lȫk]q;*t4 (Gp(4&AeOtT;>% ${{ZiMM 0K=؃ fu=Bfo]̻a"qǙA{h<gނ5{:+6"6ԏjY;N`Tά>[S^Dc*YW8'ވoQuEml}%ޙ}󴣧5\r(1:aqp$lt7 "6ȱQ{{4$M猟-MIιt}ieni}= =ν&amtVAԢԤo#^EמV{1N]T }md4թ(ܮh/{: ,+Wv0aB7TTzzmp h`ȩ8q$ P9R uv+lW+$Uݪ@#*Cŕgt:KYE3`~5 K2amU}.I߹2wܷ`v2)*+g]c~4 ;wQR{)))3L)S)񼙞DąjV{7kVh26}S%1WQ5v~c5W_hN},x菨D6[12O@d{F-coGA="^xxk]=;>X__T>0`j]o ZeԺk r^ESl*qUr4Rc=_))6>Z3eAE0N#/`z ooAiY>tTke,yb+1㬩gPTV?\;{ nC,(r1D:7S:ᒮ m;[_]uLW2Ɖ>0`2_LEW QjjhJ}&80dΠ`|8S;țTzj+F,\@r\iú1yV]㋍\0~Z\0 ݠ_0?$'&*5V$Wj7i"LiҼ^!0H4~&>gQ~:e&8W0  4ߎR./o׎(<\q+"z7ߝgݺukj*h6@YQDɃ cp;)PR;F驻{كӌT}z:]?(enGUԞ0;iJ&{븪V%;Vy 8pd^}!Ck .Q"k/2JoTm#\sO]o\\cu4DndN}<6^}mca.=+B4v99[*ƞ+ڴIpFP,1Yys6檛 Ȫ_U$R䜡ɘba!< @V=4 hOVMB o\<,8T1`GS .tV{EQ{K_#-՜ے~ 6aXsm]Zլy/k ǧMr \Q}{J͚?7$N:+`0~H w& 0n)./g g5 K`@5߄(_ߟi^zc"`l#ĽL!h SVo.E Ifnv lȦ&d^t \Tᬱ}G;S"oۮx+NOh(m|Ҵw8Z@]8 alTzMM!Ԣ;B]'آl/sҺ"\CޡBG[ HޢKj[X|nckӦMՃ>U?7ܮӎ=Y㹴r隦]4?bMjyuM{ukN9MȎ<%oSD8 8gp.y7\"D Cef@?ďL=Bʽh7kxnJT7I[VBе-7Žu![߆$MS.):Fa_va E`瑢nORav=L\e(Vj{W͛j!=˪c2b&]k6`D_5ǀ.ߗ4t^{A~V3nH, *:LeoNàdl*tt=N^t4Vڢ*/C-t\-HL0M&DEpDvMI)*@CB@S(0?SJNox[zpv>f`-D)p'1mw@ xtb9F"77kx>_&n]^M7Kpy8EcdWPRb)*-!y8hyNJK`«YVcRVn|(N^j6ҍXMx .B:͡/PQ%#[Z۾ckHaӵFДNO=2heNYCԤD ;3*a]-X4E3^>jLO~~<Z3rIh;&JJոزb wISI*-1@($-։ijhDjTUz͞{'l~9k  ?*ބJun"wơ5M3+7N-X"Hkt;0 !Cլ3?zuAPyNPG/[qfkl,洮{Ij*+:Ϣcj|A彩[>tP{VƟaݪJwe(3-AEm80y +l maQ/84"?7q5~&}|NҴLJ[wHN #S>m۶֥ W:l_{H? *TH@@ Ug(@DVJm*uhJ](L*#L'IRZ WQLUKJF ߑ谷%24WNg|8c4#h(CyﳚiXPvGąO!"$oXL?[ aԖu Mڝ{8gp %ﶠt#~¡۰tkݹɯRFI6ƋUc5}C>}.^qR7ڢlR?\wx ~406jT]V-(S閠1ěS$J}Z A+% wVDKmH>;yin={4C|^/5?n,N;l"e>o麖Y=+{(Ż"qe|ftNgLNJn#&eh4SחANISwfwVSSi3Xe.lފkP^dڿ).aP&.M,Vnu ІV*oR:y]J5Gw&ҲUػ dW)Gh8)~^Rw~nK&}}mC j2Ps:O]1pG{iA^//T!6Mn1N8@Ѣ"*zM(@EII nҲ2xrYSEyy9\NJJJ5#&~cs8zK'Tٓz%̃7 2pI??\FfxE0vL1a 9rwٿrX- _h(& (<tت YS֎Oxf)^a.mJp+V(a0SDfclm\0á V)TT/5EA s&[)J fᣰW_mv]Nu~1-j^w~R\.EYwnAAadjtI~.`TcUB7|kPRݫA+g!^mc;]apcǍ dQ(1qV/+1Mg_}E=}b>jRVv9 ux *o~ɨ-|x^PӋx *(lFPJ*/y5U+3`jy}VcQ`d/4&}jG~⛟1>6^7&i^q7Rurz5 15O۱v{LbxL KWe\ơjRw[U1N>x~׽ ˠX7oi 1] z S2Vq="Z9./] c7k|郻 w6U~K=--ܻ+&8-yG׍-xn6UWUzl;x*O MDw~X-X.1pey0guHU4UFEq*!ߊ/P?XEi9kpA)Dv^o*- ƪ3ݫ66+X.)5Rފ5ʄjc{}U.58V+01Ŭ WVxqzho|QVW^cl%h߯uNEөmN]w =n$'%[ t R™籰Zy_d@H>=ʪmXt }bVjr=P7PK+]V%#ǐ.h/ֳ-a&M QCg@eSz=z~c-܆еcX>Qy',˽ag73gǽpk);"O&fơwz+OՔJ6Ѣ4S'SM@YRUYNdT,!!lK@pH~dpCNmj:.Ey85%RS]EyY hƶ JM Kف, O댩'ݑ*c 2;o}kUF}ϻ@MMͱ,͠p0ӻ*Ba 7I6{WƯQ_릧UꍣokFd}5=b~DזA^t~Y9O/^aM JX[@`Tقcp{O?$&.v˪C!h_Ī}hּ' kNQX jD،}wXx.ՂwuCU_Xp\[^y\&W!.v?\œ?o墔Μ-P?+N/;rK*pWmiG/qKL^N&$LI/АpCRAd]{bZ),%:6=a1ʨMb/* sJ]UѼ'dWs;$EUMiv,!^CI|_8%U ޢoE59<7*xʿRW⎺-Q؛,4MZ-{j10-,fftRKK&#L5ѷ|:&ҥ[CPtGZ"hDMv_ 8;TԀP¬?m$;<\S ;U䦝evQ&\^5/]"X֗ 'CwhRo;hsW}h՗/!zBWiw@3ͅ]J"Ax|؎t܂@oS(FFuƃ9Q98f"Ί2RJa֮79o ?7_׮W0ßk~Ǩwlk :zh9 ?syz݊nPS[,?\ IfVԵ} n[&]]ٌC5)~BXYeE*C|0q-E:[=~:'EjyJ*D(%~"?^z"`/g׎@FQwM4[,a\UppY9Z)bc=׀+cl[NOh pE5oi.DJj _F5uPD*Qrss{r qSG'f̌i?8(y@3Gxg=&1Y ܱ \rf.11& 1]C̡ UODlnx{ѱGд2 ߀<խez+ -3 n-=' _s@~Qh|q3hZfx\|-Q/1&r{r/;%avkN7g|7ejV JB=qEΒrRZP&6$IQ;}av<X"La 0kэn j MӬ7UU SZMuC*n篫v{S9̛||)WBb8!buD+9TsZVkSϸaZ4qsyElL#JPx1]fL*T/O[k7*[!g 9{vuNGf8H:ųc5Ry46߭;Vs}Ub EC 6#@ı9Y,F8>{P tؙ>jXxd埝U4k%(b2n2_/wrzl؞;7ȇ_dɛ27ktRu-=(._^&TG9 MC?@0r|y8IF;3(N/R11;m M8TX ƅaQWѢ$d~W&PzS}lDLܡ ,d2EI9Ta|(B3fIGr`4/XGWABqHoijf9v(3M^Sz'8 ARnQSTbeY-,"ЭVڙ:Gb~ˡv Yg+B,^'g95튒cp:~aewuĴ@Vubܥi(Mεn5w#%%J`|fE_x95릞=#[_EF_lp8#zjW\cVOZ9ăǖOy#U!0MMasx~G1{^W)Qxc[7Eyu sy}m'9 "/>1@UO3odA^rPXA;ׯk09;+V(3"8=n :x/DDI2Zϓj|^=E\Ri(4T"bc+"sns'H1/U(mWnl ~n O",:5j=`l%q9V_M瞝qs'z{mLX{R2ӄMfyc;"n;Q"x[Z'|!ׯ_y]qi>壎-P3`4&+9^Eb-kr@DCI(\LZh63fR*ZR霶y? ?W@N5j4OM^9(o67:8MD)*D$ #"x$==* .[f*DTA@$Pbi7?|KZ.=Ixۺu<:`@SRRƠ؇Oچf1ˊZ8vy֭[ן}1"8".~EEuuJD*0:CMȁ믮,1g'L䣤se 34W9G-3·/ڦ>fQ\PNdYqx1z3̗o,OH4*wd#J)k ?v9C{B]O{uzGyfUCC~֮6MWftB5=RcRE\(`q*ͻdKhb׻wO?4o6֯_rw˻[ZYYMII]ii'ʼnp>7㢻Nj^GM :\t5tP4͵u&a>}[D&!:""D䈦iNP4gp?iʡeoo[~DӲ5%)W/m0ZrrJ[-6*:lP@TUTx(w=k>x/R@)QT}ff{67$)zK(HDZHT,bC (H5t$!3s~$M%ٝyΙyy}KC;-:sdJ~Z3iCTTch$u@6pl'"nCbz&(B1}-ι/ݲ7LH`|$%%9va+ ]3_ngo-&1ܹs+{::cT.udӱqF۷odgg?@;2Pzk##~5DEE16m7s6suǼ0z䠭"$$d! g H9115 }#!CHG'YT;zRt Γd ȥ A׶maEBW\D%E(_&WZC6F{bﻴ`B_%K`6'!v&4cp0 #ܫW/^ `BiiiwZ5\AAA# ,e7Bܑduii[hh;9gHg76E*34BW)RVn?4t}yx] kv)QFVΦBgd>A 2a%''07((hD"R\\~j5ϣo߾Fvv4Pw|ֻq- L6TJ* TYs 1>H#3,;;(ml1 7& !x#ނK)q)>JZuEIv&t#V[@/B!3H8|R'5LPy_"9M=EH9<`+bT#!tJi4*eKAvPJgB~ -m܁](0Y6Nmy. /֚NT[)p)ѾY'272ZV(l2LJڀ!]͎)Meguo;<fbxƍImuF.k6#+"+8Uب_i>B`#Xki4H)%H5I۷_|h/:UAkX/,&ceS8͗wA-&eY⩧VV?H ˦#Q'^t=)E5\k^ʕ+qi(J<˗ * o^[  XJ`1:P PA /PYߠXj1K&PwX9K cO\rA&hY?ikG!5s34 >Wҹْ bsmW0Z3L(}Qn<*~ ,P߱||BH/F]^(Nڵ *ho===ae˖&L80 ~GLL rr*J!رG5 &pq>ѓRś٨Gsʘ[_*w4yeU*a罍oLF\.hɐ@NtD"ҏ>H48YJ1L 0X1lD3dW@ ZzDJe<,5+Ⱥ=j[ն`؆#[ BS1Ց;s 04j5222pQ<0pt {یxneܳ(` /rr{oG")!#zXZg2%_i=WlCyR Ġ]AV(GTk%%%HIyҧVѱcǪs+QnXZ$/f$`  2FKˊ+n\jٳCUG!O .\HFжm:GThqFn^ t ˗fB.W嗟DX,CBBj[Td(C9++ Ɯ9sj*\t ӦMÖ-[0{v͖W???9u֭իWjD(F9` Qt'RBZ\a[ƯauQQQmv-@)Db<-`N*e9M+* 7e@lH|LQ&$T%Vגå`Fo5Y2z(M{Ic/6ë4r5 mhdyXv-`Xp;wFNz7-M5D'xElj MvAAART"bOJ`BHJ , X,ԩSL&mZ]t ^$[QVjRQraw w߹g^2)GIN&٨! [{(rooPZ`O$-I(2#У>EE|r񠢈+pM;GVRJ !%9Lr\ Rcƌ)S͛7#++ ~~~ؽaeqΝ &AFnݺA.cӦMT8;:٫H k,,X}_d4;^A_A K.훚XPP|Q&=vSNjREů_ˆ]x1 Ν;PJ]IIɀ>[[kAA1 5Z$Û5uq}1嚧2JToUjYԛ]dZ輼<&,#>>\p… K,R&! ~[}xVGebUjPPcVV¹s0}t 4}* K._"!3EQj( J TJi]@E,$ ΣO8zL?^SE}G+UM)N Gg V*cZh4^&8ЦoX||ްmh2=?y]Ҁ5= oz?̙3UTL!Xұ]v:V]bƌH$BRRv܉wީ9ٌ;wgϞ3f `XVZA:8pJ)%o5oGffM8 |3_P>{k;~&4}_ªrp)fGZ7b.]Ne) !?Ni@0²,?~ٺu+ò,vT ɔamp AhQ\2G*O=لqÆš&qǯ~$>;6J%̙.gRtGk/8;U6 w^F~OɩVXEGU1ퟝоDQFـF?EEEظq#^4j ذa!Z1% +nEidAq8nlUk8|- B}BP;Pf ?w'|v~ȑ#'Oҋ/j5zzVo||XIJl\č7f<\ġ Zw0z:HHH8бӼq7PRګRl'5#M`ooAAE={&?bA||<*"""vϟNQHh(74lWEǡ[=i!Bp,.7 FlD!6L(姞z$Ҫ_ !$RJa, xWZ:,<|*Za]B*2)JR"իWȑ#x0c dСCQ_yPڴRh4.<ϣkhMV ,ah|J{U/NX3y^ aW }ս|BK3{"?Sƶ l=DiMe qA~'hO8*yϴR6j_ m-ߊO]2Z!hBQi&7ÇKǏkbǎxWay,Ⱦ̙L`QMFmY'V[uڡo.]{,B[Ak9#oa251YJ`f8HdʵHY]t=ndbdd2Ye~$&& MBBRZosm'݉JȵT" 魒tކYn߻W1#==˖-!!ġCpPر#}/ݰl)a]]'zQXñH/(|/ݶ?t1M&RJ ^: ˵xkHp4 i+ze;e1k}6G|Ռu0)0X"y dd2]qq(BH$!fBH+)Y.w}ĉ3gNQQQ ###r<)st(A U4J)DQlqh{prK%m0^^pϯ'-}ώ!I%gvѸg$9>f}}V46!eI(>=@R_0J̔H2Ξ"N`%Yyiojoɵg@Xp@)mogg qʔ)wRSSbE#33nBnn.6mjufYYY bsif͚57xC2zh0z}#-3$ҊߗQ/,>pwvmFu/f8pZ}şbx,=` I!Za\`tpyQSJ쪶n:Tokk#sra]9ɗ_7nGWJz>ښ) CLDŽב#WAaâ gpRiqbl0F;w6i\a Ws222p,^'NΝ;qqt0((T!xp}ܺu^~/iMHfl쟱Ih BGfa Fqp"qHrż1M _V<>gBQL ^P4䛿b M@q^RTCY79ܽNޜ:ۢOyr(aJid!09FC&i;XJW4|\WwnٻpdhyAVu. @ Փz{0QOv1_sꯏ>B1 }6:| .Ŕk&_ Ck" 5e/oTu':0|^uocf*ՔC}} :=\w֭  ,oZ^i6!KX,߉Vpp ))iWhh~26~kHc ѣGxu0LEYn4KnvVd@vfR/$m6GCX7m¢e]Ǽ;~Fʙ]; ۸ݻ7Gh*K9eAZǏc^w?@goe-{Ⱥ?5 ɯ[;y!hJ]PP+Vs+R:nś7oZM۷Fxxϝ;wN7ך5kHHH\]Zz,ɔi2gСCJ:E}cgC+O ׮fj!5S>9T8 zGf+ykߞqw_ÍS8|r^#]wc W@mXQO:JxA riZ3G+B7_ʵx^4TOjظq#6W"5Qp/9l8 QbٳMΧ=|P@HTnan].H77@M`-n6lsE鯫sb ?2Y*jRNW4:O~x0HI=×bMl@/;~g Zk9`? ] !b=RJux!>G; 5iyW>xmXeO<n>%) ^b{^ްaCr!!!A-wLDEqL&0qaq "sŌ)S/*k zoI"~aA<ΌO G p] 1˗mߧ%F!}l=Q/ʀӤ<%A(u7a9{yfIIݻ9|U#eizcҕ+(((X_ !T|q @VVVvlllViiLpvv:v܎asRE1111%kkku۫CJXmccc?~3͜9֭d2d2RRRpE\x񢇇G~^Pf{Ͷo%GD 1>&H$2聠oi#8z{X,v0΍][](! 2')EV 8"B ?IQJ֠wD؉$+]B:\R$''#2q$n?|- a>Ħ T'&&ে/R(+/c0+{ReA2!?ˎ _v"BoQ^YRjE"W~Le xJlTpt@-#ZV)ERRӡT֢}o:Rbx9eaLFmB!!!㓒 pZ,LT& 'N?ɓ'CXXlnN25^y 0Utڬ1"5 |&㚷2 k(]|~B {`G)c@޼7&}p~k|]8zB҆a" \,`- c#sc\:tQXoy4:dz{ oO/KII7 {v-T)Hkľ Ν?'߾Aa=矗ᇹ xCɲlv>}Rrrr0o޼ . IPɆvO?}bǎB"""DA,q&ihy&=iu0>%9B; B}荔p-(bSB/[%JPXF4F(`HV!Lb6[)=?q;}ʊ=kӶ#z2(4Tx< /?&Q۸iiVƏ[W+ﯜоNs`1c=蔜m/t&x%| &8DZGnklkЗfߊ>R '%%} E*j(ߺBjUz2[U(Z{ʓSTT-{#)| ,r܃a;ar |Pxq֭kxKR Cwe儆B>t=FclݺK,?F}a׮] CDD<==FرcHMMz/^lTjGyAChCO4QJF3E# BjJX}C)  cZu6q;ݐft''ŅB(`J$JK/^hxcbb~}enKxj+lSه\A۷oV[!L"o:_*9=˪Ok<^\n6GRj,))ip%3gsZZZcVRRI2GtH$ oAAv%=z4&<:Wﶒ\#}HRֲ \Bf@HH_|qMߩ;Sa1f2x+|pD``ҔèP^hyN֑_V?۵rV#z/ZMIrF#\Z#`عNEȽr㟘c:}Yi%&&nio3|A Sknv*ݪw\,]N@3T6zѢEjB*֧U899U6QJ?_h e]y=H9Զmo鮪T:'88!99*C zN)o}+7|섫UtgϞErr2 A(0 byy~e_-lȾ5TxQHֽ2޲mH.mP-u?0 pi^Uv7`=Gn$y=@gd W+_.u}T)9?FY`Ic8NMP&5*ǰtCdc s TSJk,˾`6g)U>\ʃk&gRx0?Z]/; Ɲb5:h)%RG Fd>t7ny|h4hP(1L5 !`0eLP\'O0 9O)]Q9<<\|rbbbU+((Ȇd}2)-zT D A PQe*/;*?HMMu'&(EQFR޽kSQQWssݴf9$A^AaR^G*?>ur-<<ܙv&00 \c!((ȱ}v^#Xz;v4\N\!d*R)!ľkQQ*<~mN۷‟J&ee$)/"vr"**N;NKl۾+dIcKd(1?4^EoBHoJi/BHO!DQܔt]KsI;nyF&X@#9S)u[IQNVݸgϞ&UϚ5KiXf?n9JA$$$/ r-%6R$&&~Wxk ,/(uEA0L!athCM$IJ_ NӤdٶ+(3 ˈaI/7 y5h_4R]rr-4cƌm2J$~Oϛ ͼ.w.azMì-1 -%>KҍMתj"*6JMggMػvYkGBc[7"Y(חSӦ}gdd8 Rڤk[Vvjm-˟M*HROAx0 C)uaf)~{(&0XA`PAFVy.3^ ?kXxG0n)fWr*WFX𤋮 rѹs^Owvlz䉫`ԇC;N$7SSeu6@7fӘ?\j.n.wFPPfRTSy?%6%XFn,بsW/l?a Q L%WqQ3ݚPCX@/R!nйcX*ݤШrEQ 2 *bB  ϕR;0 W(.7\\zqP0ȑAemAT aDh0 J>)^|Cu_A$ !p^Oj3^Y' qrB9h?4(S]1tY.ls_˞KwpB` J ץg@@{ aJMMҜ<SJhJ&"PPHρ@Y2.퓕CiSGsyS+5`ZZ#^$owh NEf!VeH֢VpIB`ɻ)+~C@(aN'-iO4k@긆+ƈDPyŠP 6?V#3oXP 0W{[QF;5WcnM%x&ߟx-򃧾irZ:e"Mo fB׺murĞ;9gȺ7 lŃ0?TRN*rr"«F5aQYTvջ \A5L@tJ;W^u^j(**Byy9ʠhm@WVurqsGQY9J5ZةU(`Rhd\(rr[XXYSgD;BtdjS Y`9;L^+8@ W;B(ž<=pKPg `%j"@ߍTQfCIR΂hJ (sS UD;r?J4h>PіI)Xd:k:%IGBhT"ž2D'J!5]q ˴򭑞u~[Nw]87| N6TJ@PA/0<; ͗It3/ImqJJJ6\%= ,Q!fDƷvX:FweO>Wlٲyݻ]CBBz6Dؾ}{'ujςa/sɊKksJX*VOC1&w=~~3_шtشiSנA*4A!'i5ݽ:&z{222<rNNN-<==ѡCV9wkujLqG;[z^HEh4:\ܷRv  e}sWFEGw0`| , dhC_QTOK;>f݈̫ ;{b@(7!b$0P̣^/ƩdL4 iT5N('WާBOR"q!'3ЫCHId6xkS7q7. z =92ށ-dq#`r,,& 2ofK WJ!",.nʋ 2EZ:얪m7x Xb򷽰%imIwGq{SS*FR4,B9\=M!eΎR;Z鎶*O)O)L"D/ glR)S5aGsBX`u2r#줻1UGH(t !x5^'5u/k8ŪVJMկt !E/\~_k}ͱ,Xx)SN%֭;Ga];. BfY1&s(9 @X[}X-Nנo&ېFرt:N:,B (^ƈ7^{9`R+NZ9TTXhQ6 :-6 [RU駟۷/tq(ի7:w :Rt:h4Fsi:i_w"ŭ(cYv e v`*zKmR 01<Y1m)4p7gee 5L,WP"ɹAAk@*2dёa7uwwN)m0rmN_&exM{Ya|gɗ=hl[|9ov)V5A)<P7a1Arבr$2fN=>ۗB_fJXPPu2x| ˀ0fRξ u5=gYr䩈W \?珀 Z/oIB`#񾭱oa[7 Cx:m38;/_We0k;Rx iݼ2YVUv["Xe@IŰ<J@P4%jِ:?3\UXO䅧fBt[gX+WEXd&O{kՐ_P A}+(:op Oֽ;cZq96Y t$ ŝ,p~UәU7ñc w}w|xxVk,%](gJ][kW=N $Y{EX* RiVJ-:7 R3g6750 ƌ#%%8;;Usx饗_+6e;EEB\ζr\A ul,r\Ae ߂~o1tT1DxBm4nA6!VgDF)pj7Lk#cr:_к^jOO)$''מ={׾r%1e[ץ\2c;x-a*h 9ث3":i({agnJtH^ LwQŎ zOOT$gUQ-⹞&L0ʳH@\ǂ{9\fU[btXW+Ң_`/A~"X ?8Ý;w@)aXҎǧPXB6̈g~/I!iңgǺu;ʕ+?>R)|'Z5_T9۶mCEۼ}5sC֣S Rxb݌r8?`WgȜ1kNHhhh6!Dj6v0TĈޡe[9c#٬봅t:۷ΫG i6v(TM u+آ(СCCYYꊶm"??olA3~۷d2x8 Eepu iYy!Q*!Xuis8v1NX/u P=݅ϵ"~ /hJəwa("ǧ}ʷ0@~H5"7ϓi1N{.ꯝJW]7` A$*b `O{BDF+ ye(/J;%- ֙ U7 F&X<ŧB* yi%pk !E 6B3vP'2ngC* m;[QDBt\<,nEIB ~?"r\'7ũm]L%UgSsu`/> Ѓ(Սb{ inF4]ʊ:;FHFw [ȅ Hkt6N9[O૗]r`0>x~!QT"tAݐLY DdžNݗpNhƨr?xD-ʕcҤIXf Zn EiY3LÅ p $*乇57'E0Z6ex=FnJq\Ư'IKKZ~ 0sO?֌5OG7[ʬJӧvsa6Q Ȕ&9`^oًx;"0Fԗׯ_o֘1ᥗ޽s=e T {ZepspbDzt=R×(Ҁ{sB ђ~A & `g<'pV?6f݈Qq!2:g=`sW#U`#33XCT_pvH<l>ՓXSr""|Ekargoѯ!d9WF2=,_ @jy!,& O߮ C@E !7Ad|2.]*p sHHB9,RXvk], v13fh?QݽʚR00)*kYV𓙱p.y֎Ew7xvvvX |;4Q(yHHH*IJE۶m6ٳ'! YV`ydN²r,[x&3 &,BrݺV08 YFwMb *!-2@S3ي<|9FGxl)JH1_p((wQ oɄ~Z@@+a};hw-df=xo|v  @?vŁ3ak{r,!IЮ[GY~9HU/ (A@ Z*7UdL3ү?N%2c}N_OYD/{6P!'X$XL&>qJH䟣yR޸6G`%Q~}|+h<5C`lB4Ss" `h#W7!lZw^UCeiif͚57xC2zh"M(8O! Ik ^}ѽ va&lތ#=ݑpCuܼz'|k"## ?鍨QJQ*`x$C9`8 MR0>fR8q·O>~iwM޳"b*tMXJYkFvg>02 KRR?֎3Ls$KRb2+!JaشaYYYw666u AEl޼vvvpqq ₔ¸qܻw_QFV B̼ɌYu>T*˲ضm1{vݢQNÇ bfEDeU*N5[qľoJqP'%%ٳ[ÜLJ%KwM ΍h]v*Ξ=+RJV(xgdq!Rfn4H^ݻOյkWtܹܹt4((++CYu(By;ە,D͇#ʵZdRu0 {X,u(ثJ7{ KAȹ!?Yso<˲qb"<~NF D JSWgt@ GFl|ܹs*yM?2$I3噛FS_6d򀊮_OW,yɷvX/Ȫ8TJ[œoRX]Wyqy| ؗ)pkjp-G6*8< &xC+[^$ДRc[I&Hѱ]G+jKhU%Af)Xq5NwfW\i$o%iM^ '`?!hBg 222pE͹E6"1u"VkB)8Qr f(.\ aN_KId7ԯi%ӗ_&Nx9Ow)3V㳬^x&9 3jy)$RGNBE<,Z4h y~%NV,!(/H J" 'k-DE`wFW6,P҈x/ZBtseQC-m&JoR ?~3f,5kӵkWd2d2ŋpMHH9 çΝ*E=q^z~z&..~8-ƃ^}݊OÃ0,"Z"X жJ-2LBI2Lhs13kKSSSϟ瞋mٲEAχ''N8w < vO 2J"khˠZ ݊X)?.Lz=J58Al9(x{;bPJa4ݻٹ `XP^^FT[ѓ{`O=,렸w @g0A&A@^~gA*22`(J)!`:3+q)XNϨ+-wq=8kך>cYdt32UVZKPR_j*"H!".uٵ_yRBa cu[nq sRU8o<ּ ,jтF֏ě,Jɭ}u.eG o'9mΣrFAq5I%)D#?_ٲ\JIZE>`fmH,`1XJ`BdhmݻyOرc@ADD(9d2X,;ƫ++[8NQ@gCF 7MjN;zhLddT*T*}.k.7 QwGOصkO-30 (+ ]bAE^n: Q|sydذa$44N$qcH%_DEEnűB"R8G0d[oL 6@[5?| ' '۰46**񈳫?5+A !0,$3 w'~z+Iͯ:-uzA*Y|ر#&L+WT_5UV?tGbb3 sXr,VL/+iݺmGGG>11l6>`0!d]LcChhh;_ E|ڵ+z쉱cZ9rҥK5f#--- @b9AUﯟ=F{F~v rѪ]GoՈ_:`k牢aX A7ya^1Huvnv=ۍD2B WPo B}AxZ"y~˲$,,FFFrC lڴ 裏,(L<6*nb}i{)#{IDAT6Y0 mRO~K2R?#=͵PT*/^lqUC9`BBW0vvv...YJhffW^Hhh-  .fM9)q[ҹsmݻٳ2a,Fʦ$ [k*2l5vf9h6/^ QHCz^iXFfX,L&X,&qhBR|⫯ZxN_V4iB Eqq EQ٦Msxx`RZZc|||m5EdtvW';h }u(4A:AA莦= 8I : sRW;ԩ PjO'''[/)n"(?E)=Ųq+[۷w[iX&x3..mAhB(eee a !Ŕ6 A+*6N./x@~׮]h,(J(jBpm`w B(#DQLE'ΔrRxzOPz]PL*fgu kc}(/ăG?|;9fx^b$x3o@5Wq:~MGak `x8/o nv`o}ix8/Fm@PM$b&v.2F(2ԏԖ%$"`hY'Fmh)?X$PJa޼>~yϰ4:MQؗ-oìv*5˗#)GHl ,CJ@7 V_PJ pYZnHͤǮ ./J^t{8v,/(ja+X,qưmmL;\RfRaAfYlۿIǓFSYv')cXn&]K+gb$FW5mA F\^V/X3erP`aόoAtڣ iDIb? D %)ȳSaaaz~;R53{W!syR7mNpɓ+?Ci^T`rjJqE qCzPW@;AOBP չd՝/0tby:z:W< sKN?cY7\[[GἰW@ T:7IO~ɂ0?A =N\TxiK?Ex hR=55~ϪI,xg_:B>WӮ(|u7d/jg?3WxjO !02FQQfe`,ryy4/WzPɣW/z`m:r3%)=-AT"g\焫_[VrKB@ϼ^OW~TLhhkү\A~|z9~j-JO/7tx+҈# VJ r骯E۱8𘽵D+{ ,]S=<(0 :wel!6Mnmޗ2P8 E}B>ܭg@vhߚ.ߊt. 퇜u5Y)B @ JĠyK.NGz̩|0\?e$T.h4J~#@@ 8Aɏa1痑M8NL&+)FlHFQ k+@F *K$BԿcNIc&4"^Kd# 1 D3 ڻԑeդхM$=^Db*@(zO)X=82fĚ+>}Qlii,yqyky+l.k}pb&B&#@ 7W!lH'~V)򉊊OKr0"s+7E<% 'p`Cø)zaChhG|N)^{WQuS{! $ޫ (A)DXc`WJI{%~̬>rg=̙{׺Wgg Yo8ԯ6x^N7x +*]~/ ;`Tzηc3 v4x~ܿm*DUPXl$QFSa\Tzsuo6]ĠP õoGPf^c~*f0:ăd=u/Nx-8R {LaQm#&;S렍LvgL>.~]}4n D{`vi z$tJhSZ¦h!64;-_<-6 y#vmĒ nx%9$},@^8{)F5ߤ'W^qM tU#4C'47\i/` xx`c~Rd-8'!P2+1HWIW7? 8}; jZWz3o&}ly]{ еpʕ NpUV[[~@IRgOV;!-GzϤPJPzt1_KLI8}3ڋPo UV0 xξ{h'1aNv{1HcI`6R39ڎ&rhzA(@؄}BJ+֗7CaEn@$ѓzq%?JJ13J yG0O2Q:e(񾈷UH*(}x~Mgjj>+G̳X}b䫂P󿈏 OԀI9?gAaU>'{nZV(ll" *.]BRE5GVe+,X@>3lD z/[nZ:۷$| I E㷲M }U6[H0,nw5aأb3Mgq" ֒ " z 2ĉЎ8l'˄#[tX$='+gIvذ ̌2oz, w8nBbdN.8זӥ)NV(Rt-YFtcN*FX8=z 3;гG=ldǫd}@! =KovIĹ~|_\6x#&i~d<`qRnq':Crj l|FtU !:;De"e!<pBcf(9,|Ed >Nhq[cVN(+)0"^Ҧ@t$sB] l)FnG݀VRaKk; WA"`ǡg ]F\+ t;i0:R1tΝR[Οz?<|~OB#n3Eƫ/ee-:*+ѽ,lH%r^=IP@FzzG?m@~Ȟ_m$|sa;OߛU|7= | +wgΜ9Q%G: @m^ocS :˽,ස'"N^ E$-a&m'3MF܀.E#klyɋ:2H `6RʗibP6PADP^$_T >y\pSWi|-'(/I/6Fz^n-=Lۛ rFBV7fc}_SCJM_>imQb̌<]W$8BzZ .]N aVzT&Jnf% n,㏝fyG):HagsRUU;9 6tA$U>=`I6)pD$kLhWZJDg 6jmhk,5D~I>㩬5@M>2&棒n 7m.ڗj` tFzkYz"%݈Tgu jە}x>кuw.[wܐ)vzՓz#V0;Ou;gQҠQvz!I?&*s~Xj d j? Rf <,=X/E\dh: y :t̢UTipjxw';ݺ7} UI}P+v|PpjjhT~±ʑ񸈆*5gl;1˯' UtwkW  5_>@a*̈́aM"m*x|i赥ewC*4= .!{`tRPOXN$FCϫ7jUDDG[gJ[娚-d;'[,|SWm߶,1)RQ*aW$?.Qs-/A Ftkơ>h`+ @ #Mij|i1]\վ ۽T{^ m.ź;&_wCQPFfe!m%tp\iB ^mӹ^uvl'- w ;۶/;CO=ڵQU_&̆E\4 `b9stZHФ}'\?wb]u΀ƫرS'g>|턯{1W rTCV *%Ia'nFӢ7yH?oI,7<xDq*&ʎ7W?UF>_ۘnk)RgŇB 8oV+a6pfŴE <Ǟ\x ‚(zZ2hL¡榃#Z^#&O|CA%>Q lOs oTܹt Y:^y ]Cj:m=#MZJlw鼼'. k[shgѻ^H2+\pZ6ֽ |K6gΜuT4L^ ؉IΈr)˚kyj믱#hƤ8z . 9Jx3j{ζ|ٵ 0V~Q?A:y1G-$f^"䏬ΧxǢ,&wVT's"i9tU/ D=lԖ+MҀ3 jL *$2]s"wkh$>;nْ9i㎆Y g72ݽn{zԙƤ/" 4>9:ҹd{d><^FHYo5vǎ9\ͺ7/\t~𦱋xо2 .,Ҝ/ ?Y ;]x7l/tpvh[ -N5m/ Bsk>E8d #B59%+Y eB}J/b D:I6ҩph?Y7lNhj6qgREXn S_Zl:&&'@0Pg%c4 73 (Jէ&"w'wCAne_O7CwM}ۭH,EgY̬)lڻvbD4]_.AETH Q`h$d%ħi/;j/<+{@x˶{97+㑏lZmV4[Kn>xGq׮qZ}!C0%Q>y:u!.ӝ^yw{MHI=QA0rCK\> `v<{̋At = (b4qxafb\Gď)ZlcfKfVh5D#Q$j{5KLS-U_h(ζ+bչWJi:*Um!YVRs߭+>`w!i)6TN=AlsD/ JĞI_NFh  w"&AMӚ%b;il;N<ٯs\ȪHy9,}2=x"di']D'APӴ΢lEH` t sO!v}Kh42|R%Q吠46 2 ]< 7ςa_HA{&PU\D~ֹREO 'Cjl !I"|6dKPWf|~-#KBK;kS\]⠨-E PfP pD*CaT]z˜oµSq >JDx,5Ӡyl!˞ JT_]܈0ҩń=lʁ?8$ wPJh%@eq7S@fs\숇xB䂂RͰ2Sw r&նkd}J,@NBR\bVPryDBuTmeo?ĕtn_װ3U.,!̂ )E8x wlN(4җ_Y8I)UKfΥ)Fty=[ͦ']NWsYe#~ڨؿ *)Pz~Z: %V-˾'ٯ]!+oOשi'~bOۖj+Ν;%%5q5@Z>qF{O8V9PRjw )!|}(mB|`HԠ` ꮝ E7rԟøh5\1!{rZWpRbʺ@x T)tM!kDW JU!zT+D0k ĩ,?J$΁R*fRg_;1Z_B2kdAA^"+'9|6Xn,ă=ou!bC!'TЩ)bbATVगg+]!GEh(nYMeG_gmfג9`A))9MgVNV]-t;"O뵊+VrU !*:ME`s*'@V}ńt)`ryձJu=P5~%S~eʫHٶhgHq V!%]N:9S+64Z?Ϗ9ݼ}Y8+Ov+=mM3|OA\?ۈl·^O@Ӡ$c|-, Q6@%^=A* Xzn[ YE$'p>S*B/T<>U:X+[ۯߊY07rGjD+4 T.-acA=j8wF+1F|Ad_z#'E[I ܽ^8uVYܹ۪9n$T8JcgϞ+bǎoQ44P\=Tm zwܒ`#diXF)Ǔ?HFY-dƟj KC ,7W0̙3u*esNwEQeƝ{?g6w貺-_Vt%E-7 3q"|u>oE\UĬL"4 FͰ)89}6*ȷ{U9: 'Ԏ7™j RW6*o m!j58>~?‡!ЩNmeЁ0YQH Br.sQ`-Ɛ׺|Sno^a6NgiܬaIM@B])iV61M9LX DU_咎y>n.VOUZo-s[5h4<*P]gOg'{.efnYuLYh0 *lu>dz5T2 %7)2M;ǂ8|%N>]+ս"lٲ%XUգD'" Cj>2=1u ?_ȿe0ߘ1w:*KoOZ3nm VT5|Pexő"L vzwW {~~}7USBZJv.PWgZa}B :W9Qxvlfܟ}!ɀ]ETÈAmfiS 4 "g) 51P}`Ѡ}7K- wT@GA$d$;k4:EF*IaW+UHD#Uj֫c_s/5}':p&IljwE9pKB}#,T>MŸ回$%hknGtDlyɬm7 8FQڨElM&uZEU~5}S_Xl2SٿSxoyHM;EDIEJt 7AirX+rQ]eW5`*:"=i91~f/I1sƊc? 84 O)2GTVUEUZff:irޅp>^\4iB|ǀA,pwRX32)^8uT"+$IO$&&߼GBv]CoԘr5Ω}(;`ml @|s{矂w6v (2DEӹ2#yn\Es?ScFAy@ /&T>z4,6ҐTjXNSF>fFg+{{hZ|oy?hi Yb!Z~XpVȓE Ҳif6٬zߋ._qgEb^^`BcMƭb."`U%<\̎]KeD^`RQ.fqƞ(" E+ O g'ÕlKVvqInV.N+lK+O-iIaJv0Z7=cQھJ)St̟X*9zV *FRq2?. ;92I$,YㅌK6Z)`a5OaAxu*( #WㄳnfS걖3?"}>9Z'䛁IM8u]A~Ěج :y$4h_ 95uL%ׄ.s*G:Ϙ+VHej&— vz_oGW._koĮk# g:7wWx^Q9~ߦ>x3v][ś lhz@VkbآqGNy !Mͪ%D/T2}Ŧvg3Ⱦ~ӃU㧵e:EMD8d4 ˀ  ݇Bzu1g~?U|+j+YJF'Fm A5:C-LOVco`Ar0Ta[B0?Q1zNݓ8|Z+3V{}ޞ/Y;qLf`i-yȄa,HHVwߩ͊u֐ .t߿!ɴUo~tișY]?~ Ewlπ`_Umu10ED/ٝ< *$!SVz 2 [YW ? IK,ԥm! O.(>7T,P>Q<\;Ÿ [S],[_Yg?HT8h}zuG`E d$9՚/x} :Žp3}6I}0z.gVM9 H&w\iGC%ߤ&FF/[fFJEOx ݼ8@D`?)/|ݽ6oHjJ^~쫆 2'2ǮwYW+W4i~&k2~>}>#f$yZȞP]< {u bzĜ (7)\L^4ZD^PH-4@|^I@+|x *?Sӡ{V V2Wd>)vRyܫ˨ϯ7|XQ͚5_vKbm+]G˾79W.v^Ojk!3t2  EjUd{>u )@TL:J3 Dj"Ҷe߲_8*"BQV"4I26pݫ!g0<i$N2譙.VG>ܥL}ۻiN%k=L`X;dUDxYf 7f_ gnD+ d4زܝf/|OrR3 mfO40zYVcGƢH !"\M-!"@G*޳O~x|4nf[Fե]UƯ?~Gp(ؐe\ U#%i0!I'^ѾB.zugm!O٣ԨR4n$ ΊEq⚄nVWg}}ZzEBBv}RTXbv6( *Hw!zD֒ۀ a(Uh:rV\*@P*7 a UVDS>;D Yз~Ysj_.@$O ̾on4XV|^wW~A C/xܧ7vh+LhF= I.boWnTĘ~YjI47:z}-.Gh<ճn.8e?\7ɮ;("[a _F xsLoWj4Դ>o)gF[HǼw(OlB̈ _pR̛p_uߧNZE&Je k%(:1: û~ ?:Y&.yMSA;H;].8mR*A6|ӯ•ĉ $$dEtt90mT,}S=|=#}=#?X0/zY~^6}!d_(@ i `wrd* *C20 Q> O8/mVU۷[xl62s3f~gZZV 3!f]EZ;Ĵ卑WOۖ=tOOJ9{QQ_!L&vT8|u-i3R| ɀ>χzd?"꾆 ]fi*q]|zeN>7b4cͬqZN Iz}{_K_Nuaݿh51Mu}.ؙYHwS/C `ش/bJ=6^mA,>N%tQT7q]P nlk[bڲX0ON ּrԨ>7 EA0H9>VN`"Oy%#W@>mۯq"eDza=QQUU,; &lQ+'4y֭W5kV``#F\߿۷oÇo۷iȐ!Kuݱcի7oFߺu\ƿif`{LimڹEk"Vye&5C [fi {u<o5&.WivdY&Ș1"mZ6Gߟ_UpG ]>U8իiϾ_Bn>>g;Z<3رN-WW p:w_Ѐڕ>]+ Oz_).k3EXa\w;hЫ.c.Sa;\!1}EһӿF7ޚ2}8bd1D?Abr/4{ Y_,pls a+/ 'k)w|/03p"\4**<6`9/=Tozhb'A8FĠ15yx&POv2 ~|bGz\$E򃈊Tk/ήFiѼK+Yg}ALYL֐0 ^w V.mFJ) mf@3 h)HFB=$8yMYw;"& rBH$ؖpA, UU{Esrr<Ҿ}{WfOwڵ{5mڴO˖-G4h4v!wҲs7DeŘoqCݠ琾-ujW~ZtoC cZ2iW8%V(Dj?޸,􃳴b"*v7\ºڞ#!ў{h~'_{ M;wÅ<z 0nh [VolSNU5S+>n;fGI0Hέ#t%AإWňZ> Uz #a(#WeJƕLb%Vv?kسZ5ݽ|M7 [г]*lCρurA m.FZY*z*RZZ-N'''`:}0[#2eAeFlUu؜]%ozh%H\=xM勾W|Z5_?.@MѪG;%{\;}_? _<-f'Dq [:rڲ0gsJb3΢T+|7]SmA 7NKLDT߫*ψ )j G]ɬ  poj`ndIY_#63K[muHQn"Kj0e%G 0sHTqQ-Z ;; >|8fVEpp0;w $$~"H.^W~N sE:^ r9ձ;^$F]U2 "'whEnȘ)0}`9 J) 6xE'E\i1{~A .(rDfS9=ʛ_XϟWD\x5Fq%֥_AG></gNoüSQձ|"cկe@=7wls {3^K٫JEcJoPd &=7xD4 nUeqO7\U} Zk l:x%[*j0zK/HUa}8Ud蘧+N=@;(((ҥK(w ĘG#Sgh.]*gO5eNa/v5R 6k)Y#*MY~3],/VsrsFx3$4j*k<ƒq~wO`^W&i[?N/=)5c_H5y0Tk% 6Ax}iY+'/UDͣbI@vm}cxtqwݜ3Qs/b|TzMdg|Bk N;~Ggza 0p+] &E #"ѣ1/// 2Ա:ϱJDZ{f rwJ}]O,LNSY-i|3w]Dnev-]Lpor4A&::7x$@ a:Uo S}fYKU~8~DkfC$_EP{;^|!&>,ND $xqPP7wUzK%E (Ji̘> :/(;3Ob;M]ejs *)r[{?BvfEOHsϷJFyӥlotBC¿xa`uKF~Sr-5O.bcŞw8Oe ƆZ|i+r;pZ!Ay}C2ߊ76mZ;a>k`G~WYBް]֫'O -nU!pHY%?INut4r$*I-eu!?L agȖkbbhک$N4afԶOGѿ~WآbFBU*Pv\2wvG:薃=ik I瓓\>v*1s*2d 6y^NჁnhg&6HQYfRmx6̞E/~ ' dZX_ ?;=}]Tj/Gژ> ۴/V,ǻ}KE^/g܀F~0j4'~ 5H~یC^hNz'r@iv=杬Pß+Z]U Kz.&#LH؆ Rūߩ 8+*BPA~{lWk};==sÍm*hU5E֣b:h4uxsPԫ9 MBrt8,\ }u|'+3#..\hFM86x]NfY={f58""B$:DDDW.dKe ZM;OP*[hҡ9\< xy!y.>niPw\9~aXZbj/H}M("D_cr%AQzvId%| `6\w Lp/h}Bu28Ti!3됩kZVYN//^j!??qqqGBB T욮^\g0rI&Nդ'/(R J+IW?pި7;;;sv{,{Z ƿW VLaN ::7R$̈́_0 ǜi ẍ0U{(4XF`0`?ѥ{wǶl$ ?]ݾORǦ5״/'VTPޜطy] èZ\T~GޏFm¯~@S+BQ_ >;Td {y,˽=pwJQc4pv?u7xxx8WzprF*jq[ wh tvz[`h..nW\]@m^]1B*<=O ]+8 `ðJ˱} E| }+ Z7[(C']C{ͻpuO\UQeY*Ȝ֮C `rڴvH7Nn.5ܯ&] (>jǥc;\pN%IX$7pjɃ}Aļ/cjlb%WV oeJS.r'%g cn4?4rc.鱣 pkNS0۝wJЂ!`Ƃ7{eEu%_PgϞpL`t='ersF0q3z=]=J+9+#"zY8 BcŬc0=v7;9;CgСuH+'."-15V_ujb< IOj\`!ױ+ V8Ls @ƙxK 6LYT\\N>]z aӧիݻ.Qt3jkeXdJx]iکeUQmV*Q}$$ƭ<[U<&Pm/2djs|*i4]0!Q1UUwBP+0\T s ;AS՘|p;TLv1 ܦHy1ovXܫ# <}amDVeQ"Ƌ ߮p0$,[7@0r6(p|נ]]\:} 0yMС>HXE`' ,xB} j_S-}`}Br_>?[ֳT% R 7+3h&_e#0]BK*RrWC :rSry咪Xߺ=!i$deI\FӘ3 ] 򃫗;djAf) Tdi<^x,`\l(18p(VضBCCnXP>J"(( U7lO|ٌkc?߼wnv)j֩e76CgNٮKJx;G*3oː?O"uM&f~Q/^:@5GC=[&l'Ц?,0㳷b֕ 2BņN1 $mĪ-0jCEpvvFXX5 $ib&uJ7&v ^}5W4ʴe|zg?֪g;+pn47ИlJ"vZA PיR_4F*I\7 cw *:Ϣ$GG H {#o׈vVXUۯ`Ut2նu\IO\AW偕|K w5օ͢pm^ŝ"Ix-Rx 6OXry$17z>`Sw0b#{zM]un}OӃ[&o0 [a >9*"tx+3фmU/`,ݷo؁Ck.dx 0~7U>$r $*znVn7gzP}tWP5Dʙ0Y7[םsbE9ypru@U{|ÒrfmvF{O3§/<|=qezͻW@ymEQRs/8{,v܉ Xbl)KD_7r8GPL݋/b֭n₧z=^:aog[< %cqm^{G}owЧ;Cy9<O+gxJ+eg %_%3d~51(v 1uPMZdbZh,/uv`p2~.x-xTOj6CBzu;s1oBama9d4.lPz`W5 HH`?Xze@)$ac;.*ER9M1?7NW;x$ o"_xY|FhsbeY%RU~ ptypx/l*y,5Ͷ܆R,('&R "U|^~ P 8| Slw$[\ʗ*5M$iv9twz]|y 0Z 4$BXHDV}A EUadV A3;Q8Yω7(0^ݜ\P%."DGhB~s[ #vlw?xz_4&\z5u/`0l7'7n^߇?JuY@fЬY)O]yb>Fݹ&u ?Ák?ffwOjn5SqOZlA蹰Eɛl.E^AIū1N0?,o5ZelZwK~ #gz TWw]q+VW'0ȁ :˓(㼤21ȥ d`@΁zep*`(9*&.<깝wpdE[1mqXJݜ'&7_¤ cӍ*)B?$|7) O"tGCKGGT7qToO(h Q^N:M1Eg59|{V"ڕOe-f3vjx$ ۷GJhE䉻7!dAv{N_}}.F=|=\ $&+3!5+hѢZhWWf";@#ts \ z9ث̈rݓ:a'7g׌OA퇕BUJ"Mc?|ҎE zEӧbbbгgWWW/V|X,Ϸ~7u6f_>^/a߾};qD[gh ֝k_|kp`1{-ljlzhYdyEeVo:+yOg.اַl7ӻޜ^'7sJdd f~/ohG3l̕v@~vV~.0c/ kN^NRqJe3yG oF-Lz-qak;| cL8T? I+,Z3La~!F"Y_#2ǎ`/@=3%cyIXXJ,VI m +e|R=q։t+'s삼6E5~o|K :ˢ_޶S l||JPK|-1s3gH5d2a͚5J-X#~iB_K}gX PQ`id3<\8!/3~vs b~HJ촬GBU+9]s×L7%Vw.>~td-V/<~޸x\)bS[{{{Wn:m۶nrm+hϸ(Z);lj7qZy4믿_/YfAY_2Y3'\ ^]f嫱!WuBN_yAsrͶf|{d2|n)R)/m\tu:b&WbqՎb%3~1#z! `a?%dch{VY-py 36Y)㖠Z8//;a[# V tLrX̌ynV'֤>HzHp;@y2?%j雴ס|00xߍf[䃸 |UX f! ?q Ti߅fǻoqSX]&Wf($ 도8z#ĬG;;sX]HeV[h|VA{aj4پM w2`;@̛CM/9e:۷/j߾=ׯBœHzB=^뫧L+\8=)iY~˕`p1"73.OBήi'ϩqf(Ը}3zW q}0s!I *ܺu 'N)S$I*(\pHJ=7G L퐄_U{-\KW*k*\$28JsDڟs4*v<ӧ܊Pg> fx**XdJ1Kኪ``FZ|0 ^"-.L1,G1uEԈ_^ :"1V]⡊,c¯`CkM|0ؘڜYQ L?77TA?K 5YhU8;rll` 53[&jt&o@ @C<˞2cZ F ɷh! G2Å?LzhT`3ŮգHzHlm,}Y=u|T;orEߝ;]LvY>e?Ҿ|?[`w}x_SPˡE &SN^F^O&l!r,#l^#PԎ m΋܋VΝybف֍Q PetEe.;5s@xI#YV8<|={ Y0YG~zF۷fb`@AA4 $IBNN݋1oM9*bpsҶUAZf|=09 )5e7OOJܨ]3x[E9EW#2̛x+"/=EJ|WvzBpYVXN4sA;]ft;}TU۴4ݻ.h4ūaggt 6Ya$i箢e쒞m94m 4(u7lb 6d䛠E.=˫tF GޮգD\OPoÏgnaȷʦWFQt4\R@| ߎw (z}s:%St*-texq/b#1?r7҈^ں*"bptffcs/”5| EDb-n>+fK s/Zwdt%i1d쳗b{>"E|P(@oƟp{?!+FeY:'yH]A'/Zd$8`c .tc*1V]w|Txv@dah< Y)rX-{wh4n".WtU{}RǭV+f3 CWEdddKN][4h55ߦ3! "T'UHDT~|\L/Z B]ʂj:؟zeKǂaA@E5aaAdnd *~}5ͻf0.W+G: #;@3k=̟VVVEDx=gZ6֏wL^H~c s $zش_x3n)ܾ:/|)SKK{0S[0aBE/Xmc㍛ښ91#^+b]5&j8bߦORo06;xRm"%p+i3XSrrǍ2|ֶ5%!PLIKL{bDlMO.3%}`X/IVUDW-_uՅiIs@}S(~TޓO>'|Ա?x%IfU9_S,A UE9VYAyQ0]B16NLq\Db}0?O/F^00qskW޶cϪ+V5gV`F͝0|Cem]Ij w?2V//G>L_>ɆX=JLmȷ$io~8-Gx]@ds {l${_-p(ѫ"fqhOh*\w0fz }nwaNN+&շB72|PU.G%T'k1?&AWN\ˋJZu c9Ys<=Ydd$eś ܗ[&/ZUӕpR;0T.]BUTLո EUoT4bOqGOM!Oh4 F98 {Q,T8/k_x_(:į`eᵥ0 |;%kBoEƠQ1Z_i+D(fV{A3_bU){xZ_U!k=ʊɋFBkk|Or/@kSjA[^^_֞)uїlj*bK71eTs11@ȗ#Υ?5'DJ`B03ݹsg=C,մɂ ODh"g}p!/u)՞f~ãDhY;ˤBkaԩn_Ka`` \qױ`B+6m%@Py{hmy}O?sLպ>||^7Z㰐#̎YQO|Ԩs׃(s1o܅Ъɫܠ"F3Vҥp4Fbyk#Zh j=$g?Ww?c ,X]>'2biӦ^:n%V<̙3_>!({É۵x2h oީM4*=£* zDTaB1!92 s};Ӿ6 anIOgm1'/+=?+.)A8>s^dpug8:Z@zhX̗ؾ<75 ZiAQU1!E U HL~bxEa7: <ہ$F#*@(lIQ3WoE⧊3^;{$ )š7 \7|2l,+Wa22 _sTTa߁0U,l0c(6ں ]Gkg*זħ~@@JM+mV&2qbhttņ^ na pBRf!]ӷRw;MϿbЊ6+Zf2oU@ީNt̙ߴ'rH|q?۷įB|RČ7quJx=cYyGb>B#1Q+k*A<8OD&^G,}jޏ*ʟP w[e{Mg]ú̘OqlnF!KA~7Oa+rQ|\.1-jonz$NqȑxLiC[D}8σU O ƎsdQ3 'eKe< V4}}D0#P>a.6Enk* 3ѓ@j9_ݧu~rj楨!7LjٮҫkγV^}[o]J=o)*glc^p#Y )7&u֣ǯq >5vi 'Z!Wc`$v%~2C\SP37J0]"*k @)jrn 3{M' @ۦ8{lMl 0Q; Gw6ZJsXUQ}4.N/88@!*M`!P&j&0oRDn")( gygw5:d7k2x ䷐xuӚ0Q*MD5'|_آ]]+rafp-Z>HD݈T#7t_% ]\"fu;Y[o5 ^nt]+Z h{JT-*=XH}r_#O)u}V7(C3gw>OpH"|ضKS.W)𖪨<= YP1mKQ$8x:> ho;n Dxm|YTgt=Z+@?)Q)z _AdCHb^'GWc»)%;cBxsn],G)aB1sF-GV5s'JrJ c>HU@9#<* :2IPZqڬsg|%+V$\|Ez-Յ3oQp¿""sM'g3}<}_δiuAVPP<#V<? ڕWhpĝ3 CW$'-TC13N4_[=?ObX(X#*]hRsW*x4N}/RB2V"#W1 {rA?@$c᫮D$4gÕun> ,EoXkR^5-[Rv-Zxџͪ$e )ڎ rP2w^_|?+,`İ `=Kq/멬| $2 ԏǏǢ .3nBF$^u5 qW}9jT9c`_.OyCGqM^H#JPzoQ3zR%sI9 ſFzxzJIU]UҢo^BAR`5$iߵv]־kѣG\ȷܹ>>*j(bÑSh_]KJ W0-5Ώ,ҸmeӜ=6"cOLF?]t`Qw ^ξ" Ьصǚ|TNC69U@_Z扲m1m2tӢWr^AYs"GfVf6'{ubv,A eǓƖFFx_7A IxA4 ͌]s}nE ~yيw[vV H_?~9cˌ^l m KxL*&s[.s"O?;,~ER p5Ml/(&H6fBPۗ|[a|R,VѸ9'.rK$Qs ܄*B`OH5)[[ B=yjNQ˟ 0jԯݷj]NRJN)qe[  ymn=z8{RNm*idku4Udŵ - 7a;_Ihe0pR+|r4af$Z(x&5rӡ .@IU3]$een=Ye4+;nDYJ$H+m0֬kjY=LPd嫙1kޟ;~D9y#9iʯY`E صK%'aPpfT]2ml ft]=A8:Wg, ^UiރvFQO;@,_ToZtyGG Y&a߻W6֟?mѓ/^ԛ_DD v2Ku :  آOݽ!}Oga[MtҫMeZ)CS A @oy#U}CvXIs/_m{(}>3=C :{PE vWDA} BE.H轅^ϜMA|kdg9XpvQ@YZ"g֊/T?flV,/bDO3šZ 1jp2+ #?1z;Q6{FyuA" v?\.&MS k.y1zk`;%zLJ$beMz8|>EՔvW+`$mI9`HE-BAbA Ԥe8oړ+Dp@|HL^36a&;@R2s])=J5^Sa>,EzI%z,>y 1cȪ]|Qp!##3ipx8v:ݹۅ7چi1)nqt:`f U}Zs=;>Ac9iD7Eơ /ΊevݱDzy;Я 2V%e5ؒ[7ob/}eόP?ß2 ԍҟG̖֚:)FF,DxkA`A?U'J}9D]q.HO.6P*Lccc*+MR-mNˆ?3qvF(+YR߭ӖˍscyF9FFz f8jW,D-ny},Nw_֝5O$u\BBtS9bH`b۴ִ >~CO9t& }%h¥~Rh #̙0kg3d1M,[n7kתEcf}Q0P3:O;vQb# .sR/F}`Xr ?];0@']qq1Fc\ u 0hbZF v@:@Pw"Ap:X?TX3;2d{ؾq?J,z4(*XJg=y^^uJa^^Uz@RMl%&ga8a7YYPB^4B yu51njAE.KM=%}cJ>᦭ ,4A+h䃮Z#2фag òf\7]Qx[%N*ڰɲFnXP]'4\E4ٖLBq{B0u(A-,Ys4jF}n^TI˻eI(I EU&ԸN52JJ <8ٛ2y;ԺE9˖~{# a$5s*'A<9b >Ғj6-6iD >MᅯVAF}8jx!؇fV^$Ъ }ꭤu+ݝܱCb A7X5g5f⺷>7\xMڬBfBo瑴ͤWgLxFF͟82'5Ɯ#F.aȢءĄ% .dێۣʹ~!|nΓ/ck(2JTTSqu=3 %^JhVASQYͦ> ~&o5JftjߠP=6[Lϟynt#^#N` (]`OjjjBğG ^5rX--Ź[hҰb9BՄsY]O[&zTq~~W/`WH+VmJ+ftF gϞ{=m6Ku}Be_\!(t Ycu]^F~Iٕ3GwihZcɿGvynn=6/9魤vuw(T֢-Fe ":"c\ŘM" ʘX\3yD4w*1}2nڮ? "d +e+kK* :DUPfZ6*//U P.|> n`z&6洍e^ 0)p_ns V1cPP[q`l$ 6X%5܁W:rj%F 'y~|zv7\e7?;4ىɇr"!P[ W)QfR zOg':o9*aRy_B~U0;قU?g\O2O{x,t2S 7o+al[F SQLE A`"+ʠm 74J b*ȹR?<f[&|<1ʿ{);5J TeDf8>}}`ݕjqiKD?x;%%eцR+$sB9$!wGS/TԅVӖ#‚FkD(qRV:"­)o\&mTl)0ۚhٽ,˳EQܲo>iӦBTTAx} Ϳ)" 2؊PڳgK,?vSb҆HVEpԍo8#EfRv4OZNۥ@?o 4\7`e"5|@$-+ b"(趓>4 ٩b_  r.FXf$QSVj{Err;21}hŀ[Z r8(SZ> C5NIN0@4ښFo]tijCgμ*mЙ-[POjԪ{"ȊW{BWcf& %( skJ#ǿ?fȷ~X kR`g@WåʩDFAق"xvbrH"ݚƂ=(>M u5W%M$5.W *O7>;Ț<?q䶊wb{K+8ܭuybV]@ҹ:A&Tq^> 1((Jȑ'5EX^F{j 866~f^(„Ǐ(뉉v@Gƨ;&]bU5,OH';fQUSVyaڊZIJ 94]b *'5=?_S@_y! kMK%D$ 0qDDvAĠS'~KS^֘[p( YVBz7K*NXÇ4%v]AK[(Я|F)|JzQ ~=tOZ(ʂݵ%lzym6iG=W|n} E%cA 3s3_MvRu5y{E]iS''a\曭8/|\?,ݲ׿_Ta{b/.\Fw_~\jf|:ڊ\qWD{DCԟ/I>d |c$QydY$Z` a!?0hiO5=w,onRk^YQL:e>{=y\\f~_QRp D?|0Ul oe7 PEѝs+zBmI ֵ5hwN;:U>([Ǖ4DHS,OlR75o8W2&3"`f-8 1d`?/ %Rvm-,a5^ӭĴeP968R$Ib"@@M: IF[ݺZR+prA EMw|b#RbWdjuE%J6 Ұ.BoɶB뽂.*ߏlm^eǘ'rI|_ӆ2yXF[D4f}0nؗ|Mkf%}X"pѷ/Cac w#ιӓ4ʏKLii@BB eW|UM۫)Ot#hOo$[M>WWl[e 3d('9춃`4gOV_u@5JV,I -f޼@a0LYOܼإ- Ӆ/i[P,TT}N:G@! (q[#maj)>`9V'!aw LfbLgvG{]ܳdZDz])YI ;&%߿AEQIP%d<={ѧOz#G69b ;_5Y*)`Z]{-+RN(ŖIxEj&{/fn8xeimVCjI\uCuEu/m/,B() 4 v)]Ff oRiՙEƬ4#}SzO>ANy;Mł[ !}*Ŗ{11D8~Esq>>}j1 0V]yK=:;Cq**aά%Q A.]2; zJ`s/A PLMWlp5 V/`RLuA";L>h֊z Мq>gƴJ zCxʳ&$Duݾxoxㇿߒ"Є#sL9#w7mG+_V4ĻnKZ#uܧ(/E3_Y5y'jG^Gb`Pɍ2gTZiON]fQgV?~0kpꢕXXZzϞJNn]Nt=:4b٥D*2 ?:V^n!; ?k}rn~#?f[3OĴ-j<ȳJ8"ڻú?(o_~ܙhr?8p PQ$wł <("*O7ӧOUAA`JU*\YKI~J֐s}myi~ fª::m?{Veݭe6-B\ʶ *ȓ4g/h% S\T}[I?*$kʮ|0VN<0ihAo/_ IZJk3ѧ< Fŋ=}:1Ԩ[zi^1bk3k^z^*‡Ʒc88[ Bu62JU^iS1M@mѻT_>-U olz0[bŐ;q#f]pfAeyTO'`oxX<;nk=ABfN.4y!ۿVk?VÑ}ԸS1p 2_Ap#-K⚾HQZbRj=vl_'Ȓ_kNԠ$Rf`?$wQxA9nۑvǖBfn1pؚ]xveJ<wEU9,Po]}JYSϞ=]Z{Jf62>}r5 Fձ.Y:M.Ҵr5a1YqRE&3󍟺*,$ (v&}PhEH.e~kgfQRܪFY\UVf?uwF/2qkd55z*huL߿| (ݥ^9evVQV',_h߹T&^ @l۲yNcK_/A V+Tbqh}^N)p ɿǠ'lU̙8$JqD0起#æx[+m׀J'Sᄡ͡JJe+LLTlw\̛:;vO$)ox~ͤuޮU<,6q7+8o'jta3cY,Du?M{*JY`?_ Ve{\sV `InSc:d$3Fv9CF ǧXx~6`V/+Hykg_l]{>-g"p5qM;)ĦM4Sz]C!c=xW~w[|a#L`ҙp^ѠҮ;s k$;~}E!ZuJ7ݻ3jD?Fg =aA(wAKt `YZBGho+K2όuYw1{䰿=奷qn(ޟ0Is*S^aʡt4Uf~9-cb`&aZbuSY& ^'1cŚz2& X]#>>3%qk]L\3 E`naOٞ *6+x@fFQ?:/U' bm<`U~ <"ᬞ `=%6MdoZvj1_֜5W.5)!"p]o?6Pe\˖!?(@%瘱K=\j2  )%$= dYu۶mW] po(BuAP{wW7L4кW J/!߮ tPo\YP-]7񹚕YQF%k0#1yC@O?ofH~ ("P=m8ߪjXk{S7 i?qఖPvzƼDQsQe_?jg.:՞i.MwEW"y!=o܈8oy / 7[q- s'x떍.FRr#|BHHQ%lU^gKX\s0`QXءgX WTOZjHXLk=_hoQucf'&WԆs 60]aULLŪ?ձ=4^9Y`gʥA\\|f^-GllSz'= . rGjL@ JMdSj>wԩvB:Q*j{eFog$&O7~⳻i+u> pf=x _;` ^X~?>rW]fXDaR^2}4319 *n4m,o #B)2Nka6a/EDj"Q%YVeeCz"wpy$"ۘytտ|PQ111N8Qg;)K$'FWS{*t^ho qdƊUmMUgU=cdEf@V7-ުY@-&7@Ҏo}B{q> LL0x ~#+;{lGhѢ4'OjŹsk.Z~ ?jկ_vmGN+ H gcYԏùޒx>ڈ͙f8~ @paZk7a= xy*_U*>=3qCZ 26f.h[/]Ve-aٲ & CXQ|I^NEɃWPi2ɢ@Ei7^QdI"Л>wYU0FQX[N aSl,9$k=kl QfykG s”oe4ңy+/>=D<99U궲A;(e+2 eDC .0d T.*/Y2W<3)`?ߣ>/PfA8?<4!5J> 7mV;[[ Pg&@7 B$ CNe (ՒH eLפw5ElysQ=iBzj2kM3Y; ADI$^'Ay $fQqDZqπ>ۼBwonv>Z̨EvF t^>ڿСiW\"]Vz]F9ij#79gܨ>:_8LaO9utxf'K38*O*2ٿĉ1yd 5?FAll,bcc1yd|HLLtjgܹG,A~͂1caRh9hi|H<쿀ӱ1.eZeT0@P ̩PR?aYk0 ;W-[jǏgHq .mN,X!Muv̔,<>{1y1:_%}"x+QmTzx?06@(m$USMANBNJ}[/=b\\|;tw8HC*1 g|||ǫڴi!I_]kx,_v>Iұ8n_>B;8ī4 sɧSPK{f⚳|E9(\4L DB7^3} #-NjOXqYoefRM* (Ź^7C5PM0%|pJJY5@7_a.1PSaJҘ*}O/0BA~ndMq w4賻@BBhTiY֛wV4!!aTBBB8**J듙ypy=&L=j7xyE}.>\Z @b_d3J,ֈBJKGZvI>h&A8w^&T;{]-AX1*P?g 3nׇ,*0AT}>Mv6o_ A)?_*U C[Tqc5WrVfocL4EQxPR\UKH3!Q-^.Ϸ.@Fc$6m|VEypt ,^-ǎ;$-3Xߐksg`_dv6SIoaZw(zNYVp{PElS1cñe< Xcq&|eCDF "H/vpd]F$@IQ!_ԱĒ=ǿfԜ.nk;'C4^K<]X//TVhҵi?^Px oRR؎=a7慵/~q KNLJpՈWnsBRC as8W\Yr.X PGV$چԊXsS%+/W/g=Vtd@ Ɗ__r 1>1++kl6HVF~W_UIo߾v2`ᶍ0pl{o=l!Lש Z neg͚gݺu}ݵ,g9$NӔq#' fDoHT|SnSmlbd݂_H7~ m,yQ&)-)ԉӵZ=ķ83ܨ3E/7dgo{, .; LEs I4 E)aDTQKDeX5-Jm[ݹ.!BBcGf{355u;.ɹ~M8|<+ PG|ׇߌ6荞}vZא}]X8rd̤YB| Q!9őJJ4gqewCun0J>wmքxhڤn< Ri6۵ǭ۷W%kHj&QjXHOIOևXll4*o#tuج87:{ǹH;r]=.8pXG p }d6&GC>j+ `]<9D b3)QEQl~=(**Z`6='NX|AЀ~aXbVdWiw$wtt*PQL˼n>fg ʻF LmbDG5J~Ev?bovMǡln sxFb@vq=Ĵp8 >?/κ}i?+V4oѢEرc߉m:D*I W;LFAN5aP֦xv$r_4lFuA%f06ZM˛"+i i*5QۘrðV8ah dnZ# ;DI6HjִN _ηK;3` cw;͏{\vJxho [=жNn!8Rό7;~4nx[8P|j¾V>! 3P@ Ť A:m&i01@@3(v+k`Qnv;PF]o߾&y7~iZ Wŋ!ڴiz f=gfٷ#jj(D3 +e'ѴPdVlV3vGp`&g?ffÕy~!=j^ε+i{4>>~w)V'wW``v% |T/mw'8 dh%AiƠG1%p_EV}8??_QmХ+'O_Ƴ>SQF>(u^0m0d{+Mds*R+gBՎ]$ Au/jj(`צ^i.\R绚ibbbz=߭EU**ɔVg~lȾvYKI'Ou%Om /ݺlke$$$` W !Y(.|;=ۅMo8Va w{R"iXl:E0~:zpa[ 8+iU9yH5#W/tadHT*4iM<ݑ=R|FsWPiշ~~ 5 ff3 H$H tF|z uQRtLl<{a |C[8*[|{ BO%{[JCfೋEar*B1L+2sq})BU9y >tBmp*ZC2& (33򭎯 GqӠ܍M )rJ(-SE snfD2t( Y;ҨQ!Äk<|pij]4mfҺuO-vY,(A5J P%"666p23g >Ҳo&mOlް͠aYlt~A*q%fVdCY֔S; AymOHH՞0ٻ)|KjdG*)lWl0;F_?)ifv͆_OCa88 $J$ jTDl]L+țHa`; 1٭.Js& `Dyl8EQhԮ# oGPX⺫{yׯ~RެC(IbxϾxqəЛ ֊U=L_Tv&QsU3Udl!MKCp%;܂{؏ͩ}Ȝqþ:TX>_"`4?qAE9 )o),lEYY<=319 cA:TB RL< n!(,~U%/-FkPjbwnnaAQ%HB|(Bj5T-T5$Qr۶mr;)$A&FXJY{9Ѵsۙ[{uСC5K$w8\kb/{m4cyCA„HB|8gWq{;D9W48{8ն 0`jw;C.kSjHVd1;v'`0 >>Gj-HJJBNU- >ã#تQq5i5oq%,V 9Tu_[рbGB烹VYdakO@F+w0u2KI1/C:G[TKLpgVSxG믿v4hڴS*ҫ4Z۫"0ZKKr˞;~ď IIY~]P$.(l\͌׶@BB愧.|?Jj2_=0 _*ÇKN<QRH"5r*]b*).6\˓!J<(2A$@E((@P`6hazeo;Mu0J^+9Q<.BVaZ 1m.΃ @ˇ7NlZ_c  3Z(ʸZ)&L5y¨#xZF~z+?I8Ihhณ9 Ǧm\毹Oz=BݣŨWCb9{z u9q#<Q6t @e\܃HjUr0Te;d,[ZITtz4o_0Ǻ56Oo#{!Yv&bp%A@xl\wM6a; Ǐ%$$`˖-ѣ ^`"Z ›G6@Av^]zr׭( x:jpԁ6 .nkK՝ :Sׄ%7:Rvls 0HZSw2(2Z7dj[ViJy]C?lݻ]GkEIfͷaK2`/Pm#LDk t)%ĸ pyLp*R)}FS=2 e1Q?WM(n}ZWmq ͌l υ.\ㄩ| e˴uU&eިQ{0cY@또6Y4ߦ+F&JZs}θ?8EXQ 8 */K;bSF~㷲\e-- /Iҝ%fB|A wLG+ ws*uսqPSSA$$o!EEGL%Y;uE烢P,!J!-PY+ ʹV%èLPō+iGX*jb:a]rm?0( Ub&Z~:WG>k Ơϝݵ0[wֺ]$ow_f*_)))Z ,LpZWGZt ǹIk7nDR}I5ʖjåfqc]k{3`3L-Gq=P9_pU1Z+]WCjsG3Ţ'ݢ˜7~X*[j?-ˬ?y @(TA1k~by&YDx[fydfDph#|Vp@)z}UO=[ ̢^p̵.LE.Fj= sQnJA֥(E}An '˘"G4*IfCV`DjI]Xݧ/lZa7~@."1/aMIaU Բ~]0}`MCs.U܋ {V^M;_CowÂRR2~rh߾=>\c|JJ z]>!!=+q5(u_S5cClq\gСUbO9xs~ ;(rS_`3'}rˬPEQEC u9. og\ 65 {MXQ|mfG^}Μܲh3|9x`E;a*KQ|@b5ʳAxn|f΂ohgE!OWv?<+1M#w-n6 rXzSyf% Bȫ|a{xZeޜ SA V"zʯPbnfUfi$hgS [z3BԢE˨` ʼx6έaFȿyJd|'Wt;?~gVdz)j9a̴Ͽ~~E #GΆ"PJf._sq¨Q1N5z%.a>; Q/(!J1`񦝏JZ;RL)s|@m*ncWb׻j9OʆlkJl4 k,(ٔG:|M3~U,#-KyθHxyHj5"[rmsx'E6EיvZ~0x;KfeR wg֠QèBQC jCŊ"sEɵ+XwWG @0= vf[@=}/V4A xW_̂b3l{OdAzTgM Pط5vRRzUaj4ٳ5Q}?McBmO+ ꝵJz-+ف, Tns\mnt ʊ{-kwoLX3#i};WɲfhM yFݘl]HʞH]}~߳eyb`Y<3wk@D6nk{Ý}>{o_(t`X, Ν; _ui \}> 2t]]V4:oN YLd(@z*ARUd2X%z xԟ_oԺ.]lORZҨ=4`Hغ%gd2h+ %YVͧә t- eeq:=j!Jzα1Ǧ_W,لը`RӮ=Upl*Sd.~׏z{F103OQN< dJJ5dY5 ufocg7"k&R`S!`3!3n3פoJ 3<ܡn"Q2,7ơ WϿbP!^sSxsq ؎McNqwi-gݼ ^mWX1C$y1EFNI) LS)0| EZs`۴#\Sp1BD";;}+(袻Ft;nQ0 O`cP~}f U KhfTЮ`V a~sVur(wr&?!yuv2Ϳ5b;%K4iڴi"O?aƍ`fh4,˛+PdX]i`\)FŎEm2vWrP~$QC#V㥆@VĘpx/NzEewh~t >u#k&$g&Ytu֩%7,ȕ#Tmu$g{83Aa]æ"Y ȒJe P4}+I DbFy}7a~'Y0 @4~>mrqO60V m ٭ ҂'~f7GBMssAKt>uъ[Ex o 0@Rжm v66 /*f$}܊c#BK,ĨR83U YQdKIqh6qG|zcK 9ykyre;ZLNv1)f˻f `0QsǏH|5ĴaӍEa@̝oMoTƛg@,ϯ>`y,zR'7!(4{-R'Yˊ$>n8R P).AIRoʄp?Xѥo\CT:8:sQa;TDIv8߸u6:ԤWY%{?..Ȯs( _Atar\+DkEYƥ:"LٶG_' :ę-VR MV۷k#2zkPPbʝt04sY}zġ__ Qq# v7u3]o..=]F2+eQ?k|u&!!!n.ϽTDլ^>#*V!|ljj]+r$LZ0y΂46szGpc;qsM`iq93 [$p2Lg%R7 k%.ݜ;R-'Pނ G}`1M6 6lS#O>e,,(p}'W'$ mGӛjr S;)`0sq]Yn뽼CA$6,Ņ]/_P u%*8!IXPTF*e2 WtNA-;_T%0hh"Cq$O wvlll &> ͱ?&?%Eh|j6Ln5^z}3jblkzͮ(d.f"7K ˦U[ EJ]?vY?e2*Ill첣k\ s)ڶ=3o>vX\\ÖL\KJ ~փm_K.]X*fD13CBRg¸qEaL -!`f%[8-c b.H YDûtСCE.YHٰ prIP 6J`W#9hY.pi3LQJ`PFX QOMM=]#GWP RDձ?_5bw7VmE̯pi,+t@pdwxb}g߃X?/\ydֆzdw{xxlf Q]Ũ;T]t: >zN{bR;HFwv<30Ju_~b;,%?ͦ.8h3IA=(JZ].h4橔#uj3[Ld3[Nl)?ZT`ξDO;yfzlWoRf JMPZ Z-IP| z;{I-3+U^N Xy=̼p6sD٪O':.&&}@jwRSSn"sLͦz}Ѩm۶Zyl:{ 'UD] 1n3wRF/AN^f+v'L':)UBJ0̤ b z ZlR(,6 \sɋL A:; o0aB"zMN_ѡv<"#(.[-g]0Ie")))7ڷڪzOggLMM!<`ސ~cT>G@ Fٜc&2+rӝg"y?U [+V5v%Mqzfb8[~<8y灜+.o*?fSk6BLLkpv~j(ٝ$a&lg=Z+0Ss?=D.]pka'W z1Lzi<<UdE&!Kݪ[4dѐZnUK"&,8.*L+5j%Maq+O̰"yjY@ x5m]I歒v'ܓ E߾}=hdkZu\^W Djl0ݻw M[4o4'coUJղ_j扶jo, Gz`R^MH00`LCWJʇ dpzg _X7c²eZyΤU.(>>>㙨K.=ZXۘ&?MII^cfi-ws' {dQIygX=:7=G >g:J\݋!| LQsbb 4P}vSs,/T塢b!=vAeۃ1Y1sPYk@D3\e*{&+4kkìk ($?`8PR \|v)`! %JJb'-R87G A $=T\\37gQ))!OTƍ~> ̅<*FIF;>hp!YЈBUV4NP`}ɤH7.NokeÇoM{,m>u^ݹY 7 FbYl'Lr6xOh,`te-- O {tp]ȘAV9' heLzf"l6q[Қ WҠNP1( AO*`džfz| >ƌ;D)_złj$Ahe9,$f3W qU.JBHߖONb}It=Eu$6JDeV䪟U3U > Oʗ€!P`[p4к^ߙ{9- ܖ/7(9n#6-`dL>, :©]_< F:فWnV,J;qߑK.NC {/P6혯}rb **V.b / Di=cw #A7O<J-p+z0TL${ &5"dn}u!pIk\F n`ƿ_ye3"ܧw cB'Aॆ̿XRdȗizC>a zCc#vr:ǘ2_ ;p>\ʗwYy Ŏ4FS~e{=|ies@&7}ځW~[?vlv*z vygAVҲCw~?:+U]rVFqwj$3h=w# 23M&ZVzߑSaku^L ޕΞQШaGR"ЀϏ)8`Nil|G4ᒏ\6(vr8/E 1, (^7 J'ms'(c߁zMV=H*2\C J=΂1Q.Zۂ;% ZgVD<m?Eݐ#`1`шN0h 0xhqVn9OeUx| lmWɺGϷcLW]^ܹW3V!ޅ[ tFۃ'ȟ\ZoՉ /.X~Y-*b!.ȩpKM@5*}K/9 GFgmֻ  *A@f;VjWLTj"R U>Tݨ[0+I Wƻws.{חZ"qadxL99IV @` 4/iy>1"xѾN|H_u:3#.~qt]d Qpl/\=?$; 4 5Gi ;/v5n/*uw]Ѯ/흍{uFpG g?Ӟ?9j&Ł]eũ|EooKϿ D#^蓛}W/("TPW&?rٜ0>8Ł]-WNkQUd6h5657|s9/8\|K5 ꪽn;כà!Re /zO9TS]H"FwFdA%n1x &gs]D㿏; jo'#R+׿TA.?e(v_NlUXuaz6rz&]κ)ՉR>fx)J.m>#fLw{%cok:! '_lt>:DCZ{C BotwFXKFwwd5H J_iš7YlZ⨡w5PKUC3Y6w+?6"FDkO`?_npe8Q| MGUN:jrIfO_^Zm_B_=~n$IӉ8"U 4ܭڔo9k!&WAGdLЪ<9|na`% "" OC!(w%/pp"Zy-[o=z\Y"AAceL x{3<Hп r3wh^Y~5Z(f3_{a-:NBA5s'I(/ IDATm?sATaDx(6$Ǹ!$o䗂٩C R}vWC \~X XKzyP%wO}Q1yHcZ%ܫU3*,; K,_zVJom,~A?^_CpY$-<|=cÃðDNfT9WkXାKTu?wלF?O _M<]|6c`,2 j7\ɯW55-vjO/ ^rrdQs"trv@u.j@ղ.j_M[!0$T6j0" H39SZiBxo5UleL3 @b'k|& q1s¼h|ge:e Xag+lPQ VھIIhj/ޔ?ލ\ ~wFL``ȑb~59 I2j2|SFٜ}Ĺ5w/c.Y|wI܂+k 8qM&PKzl=? uZ™`ƫr ) ~DrGD=߰^<0%LfvcX(9YA5x"r(oGÄ\xs􉮘ܭ,kœpgY (ϽUG5A؂rꨦo,c[iZP U*=5{(.? |qK[oYFCI.fݱ#| h]E{!K7KFϦw| ~;-C`P\Ⱥ{k|V& y{?x2|㢱߂K `oqzvLU;wZܘF刋c_M!,O^Ǐu,oᷣ=OB%=CђwnVM@D5n C(mGt]go8A #blq~ʡ\|'Yvnji#C,8PdߩwkSzΓ[Ȕ>;pd]#@CL}.>;P@tD2"hkgx0۴ӧϨuͫ>{wFqtDm81] eE馀RO` FP5(2 ;&DF8>?꓎ ʭ,ޜubd:hOsv~)@;>UwMƖ7zŶb-gq;sYf%FOC9k=uLq$LEѕI.6-"{t' wwsVMltoGAp`?-+֜?e7);T s5ְb:f~?1eeb>ZW,Wv 9j$w-k#wKr! pU: }*3<M{v@i_[*\pm\o?g⾕նƾ-Un{^=G0;&y2Ev^w|ϸG$\8$.V&2⮃$ocŅD{L'ӟ {JNV6ӟ7R_[Uٺ[qzbp6` փS+$&2|!ڙO*SiW+C 7nABZǥen 3M{oMNC?h ׉gw ]0UZ!$MX'[2 ilEQ^RRxqRZV5Aܥiq?=9`OBе2;ޙsqߺ\7zރN}ϯYn lq6̽+9v+oulx?:bڅTD<4L%{d|i-[ )$k }pӿbc!"}q|ɏc>y7rwC{w*'t^{jp{AJGX: ^{5,XO|"M?FU'éGc'1*<#`oφT:JmyE7sDвNKF!Kkůqrl/]r+fyk<'e֕LP_fź?|wW4HEЍ׆Ygs6quk#+USP,᪬y;~+ppvm\'MWp]eE<K*" gstdmעdןlZto~ Zʧ`7oEw F\z9ZSr-VCkޭ]cD~lu_zrN|/7tUᚹ+sw!O)֑-pv>qK&^k?NyvbC[>VAe>}$wp˫jt9`ZݏoxObHujb!ܣEV7WK([0*zMh ؟WO?۶^#lWxx$@[S9 >~>ȽԶ)) øVmpJȽ{y}7p[J\@*ҥ ;v2x݆12Z85!=z`v肣qmBy]3iɯ~t!7g[Xk9{<6m++{[w(*1 WaMQ.n֛VN?O8Դƫ2 YǔiSnlud} 2Z#u4 GYNۆߋl,(2yW:c݁c"P i^J/1t5/;p]4igWؼHI lW꓎(O Lw:s Ψ(qXnv?|1O.YŸw39K[IH?N^kM ;mO]j>ii_7vxq5Ȫ3곅^|E Ec@-5.p007pG\Rڵ,eꃷ*O8 bMWT~C&յG7 ܁oOlS].ѳ Z`_Bá?sQD9(x3o);qŧr Orp.?ŭ#Hށ5?TB0o\zpgrgJwdma CqU\n1%--_{̟:oo=u{<=l߲=Ob;\CNXOp']%ZW_S6E׶-ya=c:vbf1G]P'l+4kWź=䮜;/7dqOSzM(j3Iq ڞ關vghnNM߈pޱXm_KV傗3ؒ[Yyo >߰ +[RR?@r6>a _5hTU!~Jm(`Sb)>[Y}ˬ?mo#ٞKBVILඨhf֨빛s \e-RysrQ|7Y[> X8 Y<0qeAT?cq*=9;m]TȞ;'ۼZE%oa?(Ѯ xS.}Ya:pĴ%45f#M0UY3WVna2IO{ioZqeuD*Z1Ysѯ-eQ'g~D+$2 %=Xp}2m"\<&2z<cFYʵsW2f ~ؑO0筫)Oҁ߃#7p?pD4+i+w|~R5r>m?Ο4n*931bMmO$Ĉ틳mn7_s w_Vݗ 1&=gخq7",u^i7 '0֑6쎤Km,\NXvW(k<;"SG@֣omzVĉ`#|ۍ>m[mߖ @eazFtpN|>e7\;^Ĕ$FgiD V\{.£ {xuB^?%9?lŷ?gP.l[߳nUƉ8:2MA#۶5B=W= OEQD4m,/sw|"їǠ]؈F׭+uoW*l_TxBw*F8 moA_o[Jֽ:u4!`+9^.y5O}̥eX3ϼ)(VO̓ga'}X9S;`gaktw͒oz:FcDoE]j66|{ T+$`kpU=u:yVSX8` 'b /7]Ԣ.zt;T|G!ambFNoOPPѲˮ{D2_ , FxŦ(?}/#労lĿi OtzOY3Uq)=4 qL%g{CWz.fOvr5QY_)q[ |sס=_g oeŗK+gk(ƾYOzy9 Hx%Ⰻ ɺkލ/Ij9#vҽ]i{a:3uDΏ{{QouY\?C*juZ{jCao_r[V{k M9QF[U,G-5eX P0DQ|=V߲9؎W vY"Zy`k^F,_b>_v e,aСkwpk+^峄9+9aڧ29vw%Ȯ:4˲8=ٳg 3O}c\ܰA6NnÆq'~}'שXnt)a7DhQx]zo9JG3-cc P߱K'-1LJ˿mKp X!~VIق+=D[>Kvca[ N=qv#*[oĻ~]8p*;7'fi63F5sW2h-sQ̈k8<ƗKx*}LJIӺ3!9Kp~8};/GM*/m-f;-Ua-Z),ߖ˖}{d:uY\XmYUE/5%E7}ځy<{`s!5n@N{bv[݃(Ȭ mOֲ0m<:9PaP_?K#?'TcCv`DR|F X(,ޱU/9u"J-Y^&VWEY^̬TH½ *?-i_"i"|z%=-:Xa/Öw)ō6UobmIn; [XF;\y,W{G>O+GYQ`>?|!߯ z"]}zZgr0\6²N,<ۓ^rz6@ Qluiŵc 5dxg/̘`<7R$pRʆW5-MGO a|bg_ݹ-53>Kgъzi~abcvf-ܜn>:G[)u0{p'؇jPt_>O7h (Q W]|B+3l9ÂO#6dhAbfmp4,Ti@v8[E;@06)zAz-!u58UUl}-13N9pc߾! ֳhS~mO ZXO>sucukLҥ=ڷ,m-GmG:|rNPև}Uasʀq*7X?zhr`0^?ۣھ{"Bk*4lDw9?6S=g7? >8&~e M?0t"̟/̹xc+a¯0'b]߁'j B̿tyC"o\Epj:usD$e'wO=|Y7 sZp(U(]*٠[mSӽ34 CG*z@.m'6΅V4KkЁ 8C]m|ag۲o@lfpc Gإ Ѷ/px݆9[xv(-pragzƉ|jq)E}vUtz (売P&c'v1/8(jw@[,[w_Ujs9@.Zڎ@a|)9P'`۴tѹM$;×O )Y= *}P'qD(,<۟ʯ sw N+ޅ"עojό$"Oۋ=䘄c,sՈpV9lpVZCB"\=-"F咅j#%={ 6*fMsz);\'m,|s)iC3jz#g̔R3nQ䩲^ yR3sf)*`2-֡ÖaYf8.7*LKo=7BpHx%z㡏-"L]ٺbuɜڥ-xo,ip~͙ϧХpraKjYY'_yTBL,Od%yyo/p<{+]bra͙j9?e%EGsߕ!@l"*Ff(`HfqKcTcYvYX Ԭx b,Rm$9vɟԵZhBQ2R>je;Z;7 prF]@aᮭ.~Al X{MIX@ֶpBc)YYZuOvCBp\mJL{&@pMt;~WiDD``D igQ'1nH0K!8iu+i_ov2> K vgش7WSSί nn~Y *S>цNq6'y\^h%55": 3Qʪ_~l~sa3p1.7哇m] Q1HIݭpDG$T}ꇪ1dΦe0_ Zu\QGudO϶y[Hwd꒬jHuuդt6VEav?ŐNŃ-T Zi:svejmBJfrU1ԽD1vTXSSŠ| fw]fx.N͊:OIPn |^R}Q*:cK҇כ_\ ̯IEn5HEf  @zJCU8sFx n=w'/oMujh1܀oJVt?\.P4(p |NےB-:j&+o9q[[9︎43s2}V]X>D}sW#yzCp9/w6ܜvb{ _FlAU%;hu~Pr'GBlsnrۺ:P55,,bzӎg}uGu zp(UEfN"`ev}r+qҬ-|WN`%f^Q*rv꒜󐫊3 %C/ ;!%#ۧU&tcsFj穊cik+ *6y*)KNޔ>4PM3䌔؇N;?g)*F`j_t}N9Fw 3<-{r} ˆkTlMz0 pesT8}@ @xIpJFj̬'PyAл0 :PU})%= #5;2R\.p”+3R;,8x'vR5w "G8.P7[oto6N7=~wb36a!ϫԶrmPD;2Pr렊:f֌q 119關ȧp+ Ŵ hS6gZLO_>.qTvmȩ=6..>|1`-# oO(rXmpe⶗"ZDF jo {"m:$NIWܫ}ƈ`Hfц(Mӗ$/]]HIϺ gX䦌ؐq!upE5\9̜"1&#}Nv eaNI\avʞA .%e{ zj LpMFrM=oUVDa| ؇!iK;V/PF(:$3%>cJzv Bg)q4whSmE@Z nۿaocT[.7O0[U'v>l3@А܌e+ nvŰ<*ސ /{^.P͛_zRC+kK, 0H:|s=ӿ #뽘/ܮ/[GC7̔t*T](^:$Yu%gdM?-Md@aHQw543ghmH]\U!*|dOԨ~Y%;oStH@}nR˚k|0)V#]3uIv2bmBoNGC3h1WUK4:uހI3H Gߔ̜KS2~ Xo> 2tUB 7O/HKERӾYn"TiВ+3f$ߕwgFj?3SbǦč e|9GlWw~aWD:AqD=֛n}ADq'nP7ZfQ.V}Ⱥm-1{G C*e[;1 !>,<䢝KEN[RƋ"iePV0ogG0unhgxwq$"z6*ZEg|}0+\2%<,p,w+a.'eW ì=`:E9sP Qe9jݨBu!}hܧWלeCasc\|ClRgTUA&DD {uDqB8ѩYYom~kj63H}g<5.VE*MցMIϹ}Q-Sd^<بP[3/U4UQuVK305O}rS^٪}RSe᪃YJz#>|c!%#k HɩZwKMдe@Fr9%> t)h)#5n{JzֵTh+H"9#G%Wx:z&:h߁)oQ4~wұݳ]mHR+y>Nry1"/=N<|n_r {y` ٧+ .2D (a{@fΗ%LxҒf>~\{viG9t0^;wjмQ) yp^nHVw[< < 4[NI%δQV`sC}/jucfJ|Vb X*q \TBrUySzSPXh@L'S3}Fk_ثrWx|tb+.{!РWZKV !]?m+9o O!X qLu9sHfKc=n$R5h[巙{dY72Sb?J.ξVU:hZ4dޢ!#5~UJFAVeB, ]R:l_xKzg\vqYwN»hGL]>_H 6SgH"}FbdaF$+^D9(A֜3Nrc+L|%^ثLz'~)'x_awsPaѱn/*k\Y0!,^2vq+єx+~ugrk]!p{JzNi1j}=dvjFF >AJƎ/+]fFӋ ]?%}m^E4SXSwC_4[w|'ĦP((޸R3sF"PƷPN6T$gd:bAT,j/Ҧ>gX}'ǿz]mT̳Z%kS5;-Wu:>]p]GN ]' IB^r ~ZV/VS8N~+G  a9怜pBK|Z|s? ؒeҥE67]X=GrcC0:/ak[bQj 7[mK/@c/31Xy鎮 Qi-#gP )9m#Eڳ *+UUוQ_e&D0-oFj| ^Tj×g5q}[oK6#> KIϭ{T"G_"W0726!O3^4!L-#9mۼA~3 a7lۊ !Ă֕G댤] ߵ͹)cz C@p s>cgq\5"{% C9*X"mNwpP5پIb=Dad@}ڷߨz5aS܆3cH=ڛ? ˀCU):a]CDͱ=GؤWҌԸvH}nP!Tp?jp * vZM̺6e 5ԯؔk(U`>H^f>K)*w[w.J* 3 ()u{ӓ_j,{U3rdui(Zs.hvHx96v3ב**z78~X*A0c}Xutm/lO@19!/gV/@ͥcPU2@kPb|j™rV6kjm:e{086}kTup@%e}ꆘބE Ӈ}$ƪnE2i3PVQR|G:Msu*u֯莪tW,GjGue"UE2sL!x;%=H}UЯLTQ3{=[1]̜$-kqHEgw66?53gkE!٭ _C% ˢ.NWCM(;v]zJh̜\:kYUW wO>Y} QNV@GjO0@ȴ7ئc ")9ZJPOZU$gd?'5#ho l 9GHHH@!Kv/2R^O1l՗ISL( NS.+bZ[7.ӡnY#[] oJV}b۶,l)yFtpNzn+N8cS+4H6ef{͙9\g$іn'ǵ|}<B~T>^)$G]s?ב\NZ5/gz66*yGyfp9!­E(C6=LrXXPXV).NUަ~!!K6KlQKuLD6WsҬ_DtvrFvj=m%w%<Gk0-Vثj̄-#&7m#0O`+߯TK٩C2Q/4巧̀gIrh[T ¨pVY> wNj}wɰN{ H29e8pVs5nTq7$3vK:wc]D0!=%m4:Ƿ>HasW 5l)9s3r^Ly1%=S2'{jFv;&{pjn_\Cqx 5?|ÈzotnngOLrW`!šg98;at;9 L=|Gvq{"+~{"J GGi Q Q2~vѾ]^^:X2$Ge|{8*XU>4.}-Uw*"+ y>Ӳ-Z7jApᨐVD@t eEup;m]TT dM1l={EW║7я!ޝ{>"7au-TيQeQBYgS`#|'y' ZJ [N0jd`)Wvbw_}tвfki9 ʉ wf$M= D>V3(gq4eTMrF}ITe/u̜P}eTM芝;^5ƿ7@i}߈Դz:"I7.,@f8>]v'c72]lGG#YpyYjSE6e^.wbYW"\=y.J||Q-nGmN\5"*\9D/Z*5Яw%騦kL>B>UrV +?OtA&jP̔/^tr_4ĝu*Si? |-T*r&PM*.u5 _W?ۺ.&M8l{bDtoBkݿtjZ/9J 2PVFv쪿^o/``nv / OF#kpr0?_QV)lHVh]򸛬Ry_* (l̲&*`B~&J w)aUӡ7 np_ GrFR3"Yy0#5nʟӣ:X%[C6ey['ǎ4"Jg˝,Uce5MY3nt?:Aĉ'9p0cûy#+3)Y=|*z9tT+[NaYT'GuE@ zr9hwa`tE+dƏTa."`yy{#Wۚd 71xOUkW5*p_ 5oX$P^XcYRF*){{gƆ !%=،*Rҳb(WnH{*%=*DHmTv5JrfpQd(d𝈼dH̜ VOoS--0xsʀI_lzbjY==ח5ڜ2Ș; .6zmD[iMץj܋p#5J]:"o:qLn_s `[2,~ǟݧ𿃠2ٞXY:$~w$9#_ߜک^UIș7zGwNZRkFQeooU\}Ё "#WFRe[Rdı3̍*o.'t,5|AУ2m*3 G*QP_ *ؿgbUo\[60{mLIp'k҆Ƥ4 :wW,I`xcpo!SlNusyq|&Oonv-.)9`DF8"1Q-䫯Dxg&*qMʗzILQSoޔq3zƛ(Kۅ`ţlT~ALLy8S:n֠U > }!t ƾ}?vm}@Wgiܧ4"8W$jEߥ4ޙ`آxӒsOiC6:wN}IK.nv{y6(1IW:}v|GKa(7=0wfYa#GlqS6n@U)(, :v{SRj}… g3Xr78Tpo*P %4㢘k6 n/;q{AY6OXava0n;kݤ>WOg|#qkz(p&F3VJbU_pij+l4MB>Dː锛>tU|U,&HjV{WMAU&̀3OLʕO=q#@'tsQg6l+o\c/dRc}wl~iLޛ&& yRu+]̭?o꽇3;;ċs)h{U?B)w'lƒMZ˔Kƭi k,񙎞n9daFYċĖ ۶LMKMM=~x[l\СCٳ'.WPi&9x nͪk …6~tޟG[aS[oC5>~h" T 9\,qĘѓqGM}ۆ 4܉}/k" 8Kܯ,f#j+; o N!XR. |='c€1 ՁY<; ryqBb)gnǐLo2`~os}3uMkOKA+\*%^&phv#A Қ Fh0Ja֍BIZ"Fw1S >A}'-imȉBC:t%/X>o5\_Odd:.>}ЧOz^~e̙P璡C]dM\J>~AOm,S)]{_>qhUfPy!aXOwh1ޓ4&|ƐlɌċEu.zE=igx +,\}pwz*LC%ؙ%iWFL~Bn1[K"FbQh{ZjǩGF!B[Ҽ>QiGpSC N%s|_v8YF-ЕR]DuUCTgrVu=fwZBYj!zP*b$Q8C ( AˮVV@n*Sӕ]CfTM#[|f[*  0eXrJCmoZׯa!!nq gpdx l[?O &؋ӯgbȢ׳c./_gq ^tp֕7خ#<{ NOꮊ \bf~ƥuU/)IݽiIý3Gxr_&ƿUZ&o. t(}#&n7=XA1I Vlj0g@6 Y6K`@1 bh!z'm3`1 o<YlGc[ tL܌5œѲ؊w09Yki;s61 S O{nG7lTjZ+ w>^>GTrh J+/7W$GR5O\HlET XURh:Mo6^7}v$v<0<_80I -BV^i:"4O{ELîa/8w  o:P_[o㧌J/Rt['!B1=6/h.J}/^_:EoZ~Z#˃Mt"g$iy~ &Oݮэ5aׯH %>5~ +3=![p~|g&YfLрC`pD[C٤WKf& y,\EH.{3S\6XM5a5^KBŚ9rd,9IIIbՁT{1nVGܟt8w/OWv]`m3IqenweM]VFN+@x5~MY/k{U㝑.Sމ2n}ƈV=^/`nnG`*8 t`_ҁn+~ϔQ==(˰7{uil; *t;g}0؄wKʎ+D̀Ъ^ЅF`ŒJ43a_y8EӻJjߟ-T.14Y(uӨ(L^/\3eX]R2'7t&#dX:ST%kGL֩TsKhG ox/k;0O?y^gՆ. cCSIUIn{YMmMFw) ]A2;h6ÒB"B׾-8>5+ײT [<îCg/F~\oru tn;.9{q>M g(܁2M p ^Wi7-iAUA e`QOqOZ9pRRDg\޻etYH{. >l/JPljr:Pq/_eRe/3Bn;×ֻX8 ۸Uw x<\sM B.rW3{nYPiIH5(./ό^gU;f w53@pmw[E,(kn\gɚ0LeQf|m .-{suDP}1^_q( "Eӵ(r.ei)SෟC5X%~.#~SlTG~#i[Y5 #X"0β˸TWKiȿdHp1dO, aP; g4a-kڠ̳% djk @닋kr=@Xpȷz C$eLRBOB~(ˁxѪ-5_b"C 6oB1 SH~fH^G˞m\Vh!-CVt\ƉC0tZ ym"CaʃL iV_!;rBSXۆi^)*޴^ [ךjߩɶ0UEaʷI-u״n.=m%L l|srRw=g{V |f^擒U\ѪU+:͛ٲe aлwoڸʆ_=~!%%%qB(0VT[UV✁VߢA}028\.߰ln\>rH~a{1l ڶ?7̋/\D-9r$^7<7TiF#.Wi2~EBHHrQ, \X_;řk;잰 <.vvQ^nuCTf!J 1+zyj8. f Sf_.d{@*=*2dƏPS th@鲎gZ kЊt'h`HZ5ZIQ=Awo ? 4[6 QV kirM`Ya=6< +4ğ/fxo+nmk0E1q6\)JoQ~Pԉז<#3}[-3ZբDthEXKui,|IuJJ%1Ogg>Qa<6w·LĒNÞŲEzf&uV/ /_pM\ E9̲1i: |UՖYPU\R2*dx^x~qLenlrCڪ'T}!R~Eo_ m0ݥ_lQ~B^@^sҳʈoXm9<\7W>}PFC\chos8120[~כ nvR}晿8ZDG4_|4uԨh+N_3&yg$M*|2[-E[N۳`u޽ @l,(iYlYMu]>kYljdUur]|qj{f-ؤ#QY})ٙ:'xV`pܑlC ƈ LX'0u ͌UNWtjYr]Pˠ&]5 }"IAHvml@LY/Nu~6{gsiIG"%$]o' 0zZ7,PQXOjjL aadf@KEEveQZz`y+kbĤ ՂGo%=döNQ;dV7-VY((Qo\~e#erek ޴c~Ah b}][^ t.=~SmYGceWdd$~ zUsr'V ^@RRR߶];Qя~3WvNE~qu]׭!'m*D%(zUf0 K徨64v {}1-^TB'- $#'lĬ\`U 9{Gxz=s?})^u)jWXWEkfwRQ`aku}?yͿ.tp2EPW}P۞8om۪N$M3eƛY B1\@W )\xSgz31P81ȉ֔%^#0Wdn.?%]*(xf& F) *\us (<1~7%iސKޙIW"=EIa|\2瞪Q.WC^e]a_'njf{⦏=3>L㑪=3-K98ՓTmD,uOܘrپ-ݦo6}ѫ/,P4e݈cW][ ÈXr@Af>ۜ *Myjєu0R]@XrAql}ÐcU8ĆNXNk`)(.~/Pyhkx67fֺnxRqD$sVƘzRbf}!}CŚ!Qg54/xwmqVjX& #F.jJR޸o+7Hi e:ˠ2iBb (r'VX\<$65f8w&(@=!Mך~*IKzFԸj'<^ ~nqYh]'E%R}_AADGGjS-6!ժ^15j},l3 CTn:ی<#Ah5_<#%_CQ*@[[ݰ{s #W]Բki8VD:(»gcW]4R7vۙ!=v锺[?hxMɚ Aù']lVoUtC1Yz~g\z+ CTvsd/+]hp^uהH.T9w}Z7EgZ7 M _H(2͌ucLo7-YM4 + ڨFNd^> T<^պj[w O8A!J m랴qaZ'ۙ0aSLߵ5L̙3:"ˍ۷S\\iyG RTAi5756R=EJHޢYci.Bht^Pb/eL2VQNp&<{#pem m1Wrfm}ʋ)|ʛy3!2;Qy A֒jq]iѦa ;}^}{/4`E%IKZ䛕=bw#&m盕ݓH@l'lk]nӴ{b~U?WAvO+/ŀm=!f1FVnygM.0*Ƴ5tϝͥ"O]n֭KKC7n }񘊴7_a iۣo0 c{~lٲߪ;w.Zebr4hP5լs[jqAk,mZ7JY$xtxpS ȉ5wk$$Ftн.#lsUqP|oQg4+zUz9H\36RV-9 >VC l+L3;AO٠6ɥ>=s?0D}ՅK@w >~õ7\9.C!H*TB7Q]QҰpXq57"u5#ФrK9<vu& _B*rZ±[U%+2Dk/Ga:mdw\-bIUKč{g$BeUt]k"|†=i(9 [$Zx*4d?@̤ f>0Jfz Bn(kTْ.IVV "ό5oQ&u8vjEݼ~ٞjb%iW BR|ry|^o^|E6o̵^K޽6o;r5fm'\1 '`\YPpW_]s޻ d*cʚecW_h;fdh?^Ӷzo9罧Ed1Z5ox ǯ;&4uE'ϛR|]mԫ.;y{ C>s΂>{C&e5TZpl3M@՗|x"*W^5fC #SFIA_Ōm"owES.9ATZ ;Ar헻[ғ2գ[-[SByGϾK@>j|#nuOY5$'\=K6V )6xl̅=ԖK9D;zC&p vsȞf&R{z)fߠH. :p]/w S`yR>`PޑUS :D^){{1dOP<3`CIRUїys"疟wyɪt>Wu2/ASm(PYWXrG 1i}|ا2|k7Kmǔs{MysAg 3ݎ;F`% a&*r ElAmN|tsb]m0TxXe~}[Q A^<=D̝ݫ\V V8 pB1V+L]佻w=Qq\VSu)pI.5æL f4gȸEIXxrwU4Ԁ!ȔgFa-,I}m\-TjS-_En: eBm۲m(\ ->eJF$-!ivB?ҁ`pղcJmkyl6{1ikZmM ""@5XD6m/zM\=Fz JF0bR4xcO9@k^)oq=Jo)4;]a|:.j{.3{ md5k <\ѫ.|Aػ~0)o Am|}'~ r|e[ʎi9W6ˌd=nuch"eI_k-/[4P)V4aa盦ӲwTV7 =O|s"tKU)z1L/?9#? KahkT?2fwYJô5s8Q =*,ehCKN{i;缷[V}"O*>N$a!fؔs|\ Ǵ+/r% `{;h`/#1yA~/[zלHP j%f(R봱9(Z Wb񟻶oWʅ"ý3{FW۸&U-^OZn~޿,!4-rVA l@do1krT\'"\>׮%AYAHY*Z`5ti| jG8Bт 3RUqI(;ƫ5U~v0S^iߪʧ`$Vqβ)XBmЌҎ @@v{? &P~ Trza{ km+;ɭ9>5;aFqjӓ;OZ3#1Dl)ذq#%2vۡ"~%~]>LoC=q q \WdF=\6\2#%=D[[DITeVS>*F[y 5(6\ "_ue!/vСc hbP3?*1믿 bvju zR|$a{w"_o&ӎKI iA#晞4;AaMKL۹NxӒQa4 ѪZӮ:o\hh@fD|p9Mf#y 2mF5CE+0bDN(\ZgqL:yCBߦ`WT9|DMEz^@0%JGt6+yҧ]kpvmu/z}`*C|, uDx~C8S˵.kg.Ȉ9z{M}w{BQDk;.؏2֘F?9 ~)¥(ST5PtsԄ-m*wv6]/#SmWe}x<7}S2=  .VVEII[-QOܔ :͂t+;>q_Sy"&nz%UNHPP*ӏ+x.g"'n*u>%K>t_=yI-Zꫯk҇nZ?cw'瞴aF]2 Afx}%{z_I njtӽZz6}X^(bKOZz%zs=i@Wtm5Tcۨ6;3# ؖC ˲ ُЋ)'R[Ivh z[]$͜dɖl9ݼ̝3W̜{=}sN>6D|htMnZsN>_ns&I{Rs9u:7Į{A@j1#uU~Bt jU ͠v"btB2 )%LR!n94Ṵn<EM鶴(|6A+B{#Fpoo8甏EJ}7lKo;-qǙ6LG'"ըuyܢS%Mkքő? jн.>1k]{_Aw3pULZL4g¢',k C=a9.9ߴ0{333 zHVVV}[%J"={|833?ƣ_}!u4~?=G!pE*8ǑU yET„M',g‚eƞ܈KN1vb1k{# Y9#ֳO> xH2c ^SJ,JmqAAHG۶1X2LɶaJȡKHZS%u*rik*fUmWOT_iU,JrjURUhG1ZXnˆ>;O_==8O>7Ӹ龽~z`ܚ5~kka4.Yηwl gMa#dYֱ6l;ن`:7Ovcoj"ĶnIȿ>8ph,&g\h@:{cVPŖ? x^jO8ܰu(qhPS\2MG2%rɷbH:騣}+:z_ůбaZ鷊I֊z؄i _HQշ:8t2яznvlvlv_:dO$!QSRf-ȿLEn$> yXza Y`b) LCgL9owmhBUtwm(Cd)/pyoQL9:6@n nd637tr{vAm8~Pߴc;׃_=:يG5ׄVI[`fW]cb8&$,G+2j\Njydww:a;j޷#xEN&\H 64[ZrU\!!bBřD0.Ͽͯ#qiz= "Qe~lkOǨ*?, 2UZEŦ%fF8sb2[as0qW=Ҵ=P[ki:;'Qf+ S_AF*+ UxDtaK Ia}? % 1 uPY1+F~|tMO1<`vǫ~k)kBs CsѮٯj 6Tv οK˓-m)D+}toffqvmџz8rwo y_ 2n`EP;_+r;Hnmu97sk,*gŽ]cX60 V6xJ*ˀcTGbmmoRrTm_(êFe~ƒ(O&? Bך }ͦ̾\GDD釅D㥻֚EUX%Տ_?iɹVqE5n۶l_qk-MDŽ:3?8PVq4M:7?^bo¶UsUp* ڶ \Qp\±=meQ %͟!V,в;C]7YҪSߪPaKz A$PSѵD-j OKi@/^-]{0]"U,/QʬWw-]{P U[6 6 ׀ (0_ZU>[E)}zaHܻ7[ruƝe7njVIM4^#pSQU7'k`\Dv6fQm_ @'Ƕ עEߪnbj']C0"JKf:-xHRFX./ :-e; %m9a9fzC4@oqfka[Q}3ʌPy-3ȶ2%¤&g?"խHhŸ@wPHw+Ž-t:ְz!Yu ^:tyIAE+ m1HևWT8ۖGMWsEړEu$"iFKXD_3HqtV\^ZOՑ*>]췀%hTo&~K<-mW}4NnΉ 7ڛ,7uibj͍K9,?倸_; 7P}*Ə~o1yC5/i q+, xҡ%NQZ^{c3VIRRsc߁^_>^??@~E>oڌSC(,xn F0O At2e1R)u;sM\w6ښkqV?W;q}iéq[o<O>SʄUsgt8uHnL2$b 4J +I=g1)oR(1 mga속7}n)ߢF"V>R!.הWa߭<@'P{m;b`ؾA?;ay'ȠțϬEe,8ӁV96pkŕamJHNp)%]oOqvuS޴>h85R;>lQmu;q۲Ù?X\` oϸ:qo/y ͡sz켂;_er`Ef,o%H^,{;0i ZWSNڮ`p utP[+(Ms*{ۢ7<:7o7/6|D/D.-1As TPBasAxm:!MgF#xZ8ވÝu,Gn}~/O׼>|ym@F٦|Ք,k^ja; O^X9/Y[P8׶セ.} \ѐyn!8nQ_yJ z}m1ZVPyq6 2KB"AGK 2d) Jo( Pn#.blEfuŵJHT>n뇅vHWCCEm3si'$f6tH]0(#Yͥ Q 5[ ǿ86JQԲmt|[vF͖f~g}a sBcOA\f𲙝{]_oTղ)j+3K* *pUs7uhU)89S'"w&du WgW9.c:h;մMWm2yCVT3OFTNv<@RQ-W 4P{z@_5˗O0Teo'0s8lS 0m8Q$G72/Zgo W=)P׊rQDnRץis5ۧRdq,W?yjW597d?jNwjivT@'q_~I/pFgr:U⯹{ %Gr<:;#߭I(Whkqȇ˲3CGĥV(b+fM#X{/.hR /q^Фty*:ST= T^P'M,QT~?%:SВP d:'1nz B?nS-fAw 7Sq ڬ er@:l1ߖ"T^p67Eܡ{S @s[B6; A؝j ( r&fWF[oW]*/8a/DCeO)QWm IXN VN00!:8GrY-r*Hlf8v `ں@vQE$r$sü7ڠePxo3  f{Z N>`Y:qpS>˽uJڳ [^Oݣk[j3dBCcpTiWfԠ򤷼|. p) \ݎÎ7AiUrVnY8riԗ :1x|[Ȗ",KrV[O;;&nym5, {wm4.,)|E:mԕZ]?RlPyY[kW'S\d ְʷG^} U=Z:*Ěh#2|vҬ*0T"mPG=שo3/:W;X٥)h̢ŖTd_4pJc[jwj7)qvFDI +  #zS%ѐ8*Cۜ :7?GT靔b&1} oV6vr0g&<4UZ}nu>_ᮺ`PB2lp/$e ld?U2mO/P<4e%%.fn@öQXy S5KIķe.Yy_e6n_1GWdز6@in QdwG5Mv>kY ph+W|_;mԂ9m{x6)*.{]]l õWTPף:/69,cyD|޼D$j^ k Q#cŹl*϶ӰJKrӘ?D="z쩚De)P#5fa i<7<ߛW )!: Y'S0M{oH] wV~%/[0 JR [+|kZ!eYNAEP6 fPI̶fmE=EWE"1b:wψs$|*ud['42n{JypD:<޲M0]QxEd Qk+ mp𘘽@1X41N c]QxE0_l.lk^mZBkWt;֙o tq#[Siթ5(xO9 Gf%}kLٷ_(-=h} szz^E@rdWzZU=}:{G51NIhcɮ+ckK0q,+hPV~oW>bWiW!z`h9s+e+׌rL3" " 7Jr/Ⱥ(UO+W;[+b_7w\"2?r&ڷMtoxLVe24KxiK^o;Qk#] VMo |SdWoUD2ˊUjŭ2Drn>kjZU8o,xw^z3Z_oй_M/FF,.(./NEV_%a!؈e8# 01HiUekAA[ VFlCyv2߱+ _9:C ПxT[4;Yj}VhU^TGqǫ648R aXyLJgW=aܬn{b;̏qx}&9+q~^/c,zLcLo^R+Qŕga>pdV0?9"T7Å hM6OA/ xSΎZ~0ny*)8A&B(ql DjGɖ`Lu#E-p$w#欜 7Lđ !gV>]!.&H-|V$n=8_[;>TU~3ސq9M-Yʆ$c"-ŵI Te=)GjhlХLmћ.veQJ^tgЮ)r(p̒vgj;FRQy-T^7Crꗟ'K*v2:"WvXg@G&Uj9#GOMNCVђ~&ܬIG|SpQt 8I)" 7USo@M9"r ':X!kOGBI^ p׷"I_hθV߅C[P~m$$H%/gP4_bNs!b;E?QcTX{M6$-|jX2,>Ĩ;慱gfΉXf #pdVuR'ot@-sA}f=7m4[gaÖ.KF|`jv)pysCo)DhFS\6U(P0\R+tY\=.ϟ}!ê>NjHUY66Ku@qz`DNV[*SK9Ksucu A*h5i:'naEul#޾[-]{PVg$o+u y9oߛ<]C}sSrA*^^\yŭ<-ҠAa+Aj@оV#H)nU>+NUaAk5˒;ʺ@"<γ9Rv |AH|\49DKqkÁ“A-2֮N UA qY_:92^X ʰW}hR+-`r|C"E$:ߍfQaWK\Î60&핊AK+ vԥWE+t9 &,ͦ5ɮ}[0(^a X-?EUmK^rߛ{u[b[e޿psDFfU平+'v9l:py Gmiozlp·B@H,*Hnúʒ^aWߑms苤69STki +OkP8b᰽4۲_^L =vˆ,IL x4 7s7;TNKfiWջ|[@i/$U\VƜϱeq3HYғ^KY~0B}e9* gW;]I$RUT_1ኂP7 mUݑDpEy(:eURT q;6fm/.! +"8N c9E5TQ!9_c1s4U.Y (a'XvUT9Sq)(gsRZۑe)v[m[@؜"ryS\6+ wgm[4a}=V[#۱۱#vlvl0T[̉y\DwB/bAHAuPL;m:~Я/젔.^l]V{Z a&вA=dc$_0(^yD¦]uVR$StvPp=龴ƋeHT ])(a[uĺs7;iY},=s PyVm[h㷉ytvVXvqD CekJ)$?e4M@qET@H; 4,8A$w8fK`) YNfTo_.מ)h1^ _%~Ha|K~m`A{9e3n-4c$vxڷ9"a\rH?[}}n _tJ%7 {M[9&lCwr[|_ݤ< [3T?Bk<Rpy)*κ(ov**H.#|Lr8* 7\kēՌTaV\- Q kvӅzu+ ܮٍ>9~T@A_oPv ,`~DmSo#wHJ#d_En4<2-[R5:Q@8/\U(zDIkm+o19C9 GA%zA4ڛ[ݑY2G* oَ:ȃ]_0mp;-Q =IZ }nጦIJ{NIj/*#̜4W3+ : ( ;tcZ'ҺpUQ,KMo;."ժhq4x0;('42ިo7wtK^woe ʁ=N< rLwԂ M!*o jgF|#*L>+*Py1Y-j"GÁzGqtNhk_`rX1 }!W9%/Ca~YBX  :X=nO*2=ɸyiȲ贮mPfrP_[utܖG͢1-JU_l3m`ܬ>nN{Uʻvy*QY_:&Q=[V+DŰE$ᨧ-[-qyYсc](#HLeT˴om˶ س[5RwikU>4AEx=+{t\*9K8jFT&[.թ"z 2G+̦1v 7-;`V;ˇϪ~=U__UߎmFq`nڱuDc޼J5G 爹{yIICk~ofew9]ƨY({ |*oWTc;@Uw(Nh?lrgm^n~}wjR4Āf(Đn *q*{|i:CJWaa$@ VqÁEpuq |F}SF7~eb,3Vq[|C?x#oj׀0"vjK,kj376`/]_qΦy $`-(?)Y {CN678pRscθduRrg A(Pաd*bDZi &rD~rб\~ST_ljcuf@|Ӈ+.+&df‘I3yW#αOc [VF΍MT9>>0V"No`2檩Gܳ?LS~ɣXQf#眜1}fVЃѰo]<~jgC4n+Ԡrր FGBJ./:`U$(bZ2YƬ78]Q8 1E6!pĐ?>rG_uA@lq7f]v}I"chd@ ~Ǎ;06k'JAm@ 嚆ky Eo5 g,‰!}Xք~WG8!gdINtrz`~DIkMnw pyD[H ( mwho G׮}݃CuNk.ߌ b:*ͶI%ӁtFrnY?G'q[eη-mO☞7~뻃7w&ߥ[+j/;chcITjuJ)\`ݘiN[>~gƵGuLqu6%> 5mf"vT5];,H0E_Ƿ5y6}(T?}\a n`_}}!ޖi$ˉKK4r^ aeLf[Izd?a;z?01@h9MpoF6̃"OgM#յkC  ]s{\=nL_s!I^yпk*H]ӷvʹc4˿L:N lDXpN4S4/ӎr&Ãee冺7Cz"m΀*+H6RcL:}0M硱Οc Dm~iǖSd@ 1d ǒ!6춉y,fLE"fmU2َ$`UPdO i8`3+WU6'In%tbhޖekFʨ4~4r|B" ;6l[g70 y~n{兯 ֮£Ns 7JҊv&!_dTIIB`휘)PbcqAom7=ر."N=zh%L$ & s#p5ܷ׃c*`pE+/㾎]!%Uia$D%@k̝2o< MY4cmF ?xx\6ha}6x}#6!"W ӥň9;Ñ(>k+)3Umჭ 59B\ľscN9 {5aPKq}@80|mgXrbSGe Ljo]qkBtC4Vowy5P^lYORHr5f7!JZY6QAl(lē۴^eu;+_[o]3딁R>k a π O-XeЏK #s @U{|Iaf4\(h$ 'p[`C) HBpU*ָ3" *JTZ(\"*n1Fϥl}Mg H&! rmeeCs6$x U".&]c[l65mjMLPs ȨR{Qf?U,.46k'++]m!)%ЪDwQɂ6Q2dF SPx'wȖ܋; F ~A5c˳km6~{in3qpy4=l噎XCU5cX/&e\tvZjjjX~=7;wK.ѣG Y|k&na˶ړch  V pf0#w2K}E$9iKSpC3dW hSO:! Dz-.uNh&7ELw{)ϯ7Rd<KZDքKtRYnܐNPd<O H}\ ÈHmQ6$ w5)~:ngx^dш.lK#AGݵ=zCDQuc{C9q礴X Χ ͙1f@JIK˼3 wleoO*+⚬C\į߿ka΄+qK,n] e7$ xĩ#nPV֛d-0y5xݚZvczHea1hPWeݑcDIV>cHCzAW ևaժU8Wq`()]+4!"Faca61: :P >Y#Or>0UTD8 K cVqՌpEqOJ~y(JdCe*S >b5czd6kk!h@.T媵{?h̓{N_B@ݸ!*'8)Z ?m^=pu[rk9{uO.QL¹.Ley&rgUOO_9@YRYC>(+U6YvG8ib`bx&N;{y]YŠk~&Z2`g6N*+>(t`w©*=ziņL:VY3p>A˰/øk+la7c!:)Sʍ[Gp]Qx%hR2<`W܄g툖vf{*Y 8߰?XsEغ ^= 15WK/W0U,8h办#Fl/Qw:_ =FF2"}!G1tW),u!:8wmZ.#\rT?Be2enH9R+sH" v02̬][ȿG4\^+۬/1F8UT[vVo`"|f6f&G.C$ dܶlg|߮l慖3=ȓ\٫yW%8%a5ʙ=4qKg,QE%Kqb3AB#ʖk`=f a;F%PTp$_ Ns–AkAo^{C)XjW?]]v#ookFQ;.kaxxRY('2];S>[OL}Dxʢ ^܈1D5kiM sQܸ~VK ͰJ*  zb][ID-UJ82[cvNËpBo>cQD߯Z.~;wR~$ /T*"ª&X-UR7 ȱoan.t۬u[OtꆨP4t:l<}*Nmv a?E\vn6Fc|٪<``|^nz5k)ޭ;Z7vq*8TOTȈQ24ήMB;&ܮr?u6mAJ׆DyU./p jJL8\Qp +.ٻo~s7u+Dqh}ׂ6\0ź&<R6 &˵$(p@;cp$Cypm׾ץuPY9牘} ei*f"z3Zm9E Eh*?g_^㔁 L9kܢ= =tio+qSJp(|HQh "h`o Fa$Drynu3~1\_~8)eg{}Śڿ뫽Q7__: + =6Vqq9گ-VZ`GQzXr) WBoCSdV3}8qqH&)h'Ba;ce(ِ8X6+ Qpc[paL=Z.~b* TX??Fk}_2Uy߿'3/D`՜9t'Wձv˪YhЕffM@}GrgxIM0!&e4AZzF{Uogee3C־ ٤]e__O*+ٱQחdG-Z*ƇwRD.`ӣۊ/INFB~M{ 2^wn/nvNOO"S+쵞^ f_*jq{I/**r5gKs/\jsoOj9?0 0 #/bՅ@U;LʒtIdaqj<O?C+c/|$Y Ö%9/v8쿧X$-@|tKnka*; !߹>|޲s[55s;0+WD$[V̒dTs`; gDTQ\U:Cy5 AwAq5tơV`qSˮ+9\ ^z 죺v̶BCu~)IDp`6]cD*۳8`HlC"[`8ңmq[,җ_%+V6ނ.2U/B-ϣk3סGC¼Gvá׼.yO\p!zױ!ÖU稯J۔4DŘNRWG`YF~1WߴVr]eE@+:xysI)*n1QָE6ܿ4-҃YR@8 eTwH%g;c;~Y4a=?O4BXfɃmÉi uXS? ]YCmQY/׮y KBceIKኂ)4z.Mnܐl3u?~q]{o_9v{mQaEUwIg볎ڥG 4,kϨ/V[A !V[Cyk;K  [? yU'm T:ӲAu'Aa:_lυIeEʹa+W"$zpmՖ$e纕'Sח*kdJ|/ޱ۱uИ- r@cq* ]*&G )`ٰ8uZr7pWYJl& %_$Qye^_`\J8|Bvlv+* 9W{}WKsxC4lGv0"ǭsCt#d!Gxt>2峕)>CtXa+c64IT.Y%Qjeef65?9^Zt0d @Te^> ݞ$lAl@f֍r6hs(SU7~ȱ?B5xPӁIzSr׻e~w{MD=p30?xYehA rO;␒ t})) <[߿#SxG1q!ٛςν4Y=n tz~X=n ^΃fgE{Vd U54)_$ͶyWkaZW?c >  U0ew5ެ^kkpkkBÔi7c衩7Ѯ- rIgYb'd7bup2/:YVr1+8ssRVfc[i-J?NRw9 H:V8^TykDfq~zn;<76x}wjcN&^Tz@$E-8+wONu'632=}O"[QyܽO /oş.YO[v mlx}{u!љBtnzeCRr6OxH55TLQyrRwH f~e֍E-c\ PV7nZ֦f]wx^\gPQ38 t9lZiª'B}," jNnNvF;AAG*zӔ5 I`{h׭*zH8gfȳ41M(aqZeWhI1"/K *Nj)#oYL;鰕<% =W:dk ㏃tR/^9`K8luh::]6O0UID/jۘ"{2@9ĉLEo3,=-Q7n1mQqC{M_~7n?խRe te.c+0et ܤQn{qǍ+/&kߊƺ[znPɦNm@^k+ 8*kY, `Vqkaa=5 ÿ||8^_ޠEume>|~a>蠑2d{&U. _臅᰾/Ils>i׼&'I]*+SyUjFĖv Ox:hl*TNjՅ'U?-kٵug"L0ű70;F*/_di3&W"ifE\[[ pJ8q%`F{3ຖ0$vLvÆt꒕a?m=fD@v nl{P$"su굶JUkI\wvqd7䟿Wh5Aޫ[Ok4@G ?"RtRUx|wN8৮D;Rk^_uou#8;"bNqjY'cKLZ:$NxCn/άL$ 1yT G=$*յN]F*"eNس.Ŝk]Y]١kS\TV@YCxGR׹AuV[Js`;|ٻ?&1aE 8nozjET  ہcm15ص a{53UMAGr+γDNX_K_.DjJM2Oq5?pg.exlu`~f(t  `Zucwߊ} ZߺCU!8>ji/A3ʂEgMM ϸ+0s3EX7g~RWa^^֦ ;`7PrG.q3Gh4ILN\;ݜ|#⨿f9`Ka[&X0.܌6=|^5qj 3:RZTp@hWVGڢҥK6 0Yk*!}єp6>}}Z;K֑*Y 1*vT}XD2$r'OE _Z~i554idfx}T[~^D] h72ϒC.,Zl_DLx$>7I)mu$J6n}IjeC8;^75JQl=dMXxKgc:?7ܿk&`Z`㺻4} 7 l8~PT/TᵺqMlN:~LEQtokfevU^ {O&F{>;U'l-<`=TpxrtԾK6aS2,i@IqZ0b* %Q$Uf"yq0CN[Bw[v<v_+H<=\k+mn~=)Ua`a?M8]zk}rHfOm~4s"J5Kt=5=5Z!|[[NQb!" ag9x| ].3(7 ag׺|SۃuC%6WbSգQvY;۰I"=a壹vBhDnYԻAǸO4Tܒ,kȲ:bo{Tpd EeJ ʋ ]M~tt~ve2JJ-Z"ΠNQɔR!Ey/x:g9:G{ܛ۳vĢ9B^1ǫ±qoCV͵d3M$|!K\)Euuu`0X;*")g؋/|ts60Cva/PM@ӿ"η@\8j-ZbXŒ6/T5k`#瞏Ə?^^Rc[N/^lN =|qCh1Uhbf9(K,0etYn1wZ6(nEp Uw@ZoWO@cCϰ:풧d5ɭQݰKެ[6g8nUa]YӦ }thMJ5 5D/gڡgR;]{'j7<h1蛨 #İ`Xt%97pe U %y3Zɽ oŵ9I'T!ݥttxd^#/ ۞,*U ЫnQ)*lh WdeG+19nZY`Zߝ}WnǞ RVDB=랝u ϼs2} ab]sc[:jS?޸3REXq:Ț YCoafPqv$.Oc;R%3 nyjۚd]䟿vsM zoGpTv, H%KHpO?'ЅHxKDªζC :0Ką:lzF&Z;M!٩C>\}G0Jk&-~N8\Dwո A|K1eM'2*v2^oοnFUy5xtFnn~W&ho*I TX)}4^á.V)gluNYny^{ [VnR Ѭz7ofʝGEn$q |,DHGJ+/;@*ww6d[`h4DG./.vT^O/KwJ/-L>PdS[H1s]sSUrĨ4Ug4f-q_2Q k rw-\F٫rOa}xhN0aǑcRpDρX{oCJA7Bю+]E0e C ~pcZz%Kfx'?!"J|ٶ}.쒒éa1]/yg QU6M+M׭Y'].ڦ:W=k 8y$7RtuBE97<6sG yO56 Q谖+3icf3optYO3r6%a[ϼM ZIWKky؜]>'%bFqY QķpC [L5q;TW``w|W )HpD޽xˀrbwߴwڬM4ΪJ{]'<ʦ[cᆝs|]'p ] ay}5fc]{&|őS|JH:%HV'R$\5ww6D[&\š˅lۄ@hAEY0`sTPPQdG?Dt7O"/ݐ׆æ.j̨quBky3j7JhMk ;Q6=ǂV"\tW|ov /eldi}"}Ġ۩4 T̫2ЫnAFL*O&{Uq)CІ) A]3#WC0l"SoJOgDnZ]f;{>;in~c-S`ܶZx֝CAt "q691$iA*uO@ K(vHNx&dMn uҼ-Y2϶ ʐqK#Ba,yHOXD 20`%KLN0\DTUg6ADqW>biL?ƜpT1`w{7G|zJ < JUV(|݉13_+mrb$|ey̝w)s$!pHHj#Zl4:OHjg]]FI#%Ij9xDTRVu}5{}߈ʄ^xޣd̼i E<3Dz0Z*|HzaW.Kѱz2I6IX24{wv[&akvvbYQwg4eed= 'NX쾭&wvj8,+Ziq%qoZ[K"iV,/u+AH,lmlW%eʖ-;FT7A/g2 9H\oqXx7ZڪQDuF}E΄Բ~<мQT£i+ԼCd& dx@H=Wa:6@h !vP,9q!!AηUK $Y֍LR# 6-Lx$LX m?XQiQvvО-<6 ryq{} p֔N0.AiCyq^ێűE ol_MMM;QQ11//e}I[dd.褸 @1VIeڑașhc{R 4e:=d4) #3IE;9B[.Z:2ʹPon;1u<<[C7-:sJ;A3ʂ_w#nyJD;m/0,OKӀ?Vee+~9;uꪱkJئ B~9ep֜BHxBkyK#J ص{᜖ 0y6n}84͢oy#Կv?N]u7}8MQ}?'+D<i?;jdf$Ɏaux='WE.=%fN7YbVZPGVRCJ6tpaO͐r"zy{ '~874y,<.p0@pk/79 66*7b0`U@lqgi7gYG&ޛe£]aibY1U QR/mqe|낿n}oZ#z?"و:_pL2C3X; Hd#R'\ފc}VQoCY*+Kko \ҕdr"z$?mi"z0RY"w76oy$Y[A9|,]\A:ģ){UTuae+u򾝀nu򾝺yAm)@=fW.* r|ϩOȽM2&A+}S_l9"VUZuiɿ~}'9qFTV-5r!0]f\P97lȧ_q? F>0WDK8tF0f_M{2cIDAT/ZՅ!ďFZ oҽ=K֣jx82 ֭ ?q [Du ԋHpQd{3wg\7gyAI&@ islnשbjQ{=579OIz$7nd[K',Ia,%}7g6{a3'P& ʼ?,&$aGQNeWPgw_I~ڤ3 2 F{tDc f ysG'U4B:pԸYvn9J{@.N@%^#^_M׷"7(הkjz})Jgהkkj1:n6&N̼XIh3GGi, 6mn<̛2=D6a+G<~Cz5s;2TZ%~Ӆe-d,BըY{)Dk][6XȞ{l]Dձ)5j ;RPwFye`> D},hӱ'  e*" Xңe.G!zv8ܺq|5pŖ^qN)@z귨jh\s1F9or~cg2?솣O@YϩHS4)$gI9ˢw&}l)JښJU%3a&qWI0LQ5D]_q 2/JT3ASJ5yB;xƘ^SH*#PhsOchFYjUGϓk!WXy98zђSR}+%Rx/Vקq-rERZl*<׃>(U8VXzMc-20E6[q+DN=vGrj20w{fVI~8Ƚip`| a'Gi;Do4{ sU/ݙ\(STV6M1fmP&MzʅèL9_TduuQZ@x>-,'>!qK/:<¢S/4D֣NJ"ɵ 0Uf mp-N(m+uక1OT}0M3ham8ap #e9 mߠb"Q-+' <ŧZ6h+=1ݡE'j(% r;PX1b})pytmEˬ};w{cxEyݚ#鄝>N_+|R-@d:#DO$<%kUR42BbIƷ#%_G;0.;"*Cۭi8,YIJeeƕ5S]LtWknWDoVĔ},8j@cB(I0]Jve/*NttdSW&fl]"mW؄\|)c~(][~GN3Q,+hU݃f&ZFv^8#[ \[}o#7Um+By)OlYq>4/GgrNJɡ(Ad󞣮hYqz["  2vk` 2ļ[PV璤" i跾ltut0lU*^c",ڴ񅷏٭ɣ-9SUƴܟR5/]ca-(t nj;UƐcE9VQTU~07m2 3+{9XG9V`(7@f'ƻnmD<yBa_VeL2z7nOfM*i1Rѡ@n$Z`*Kۋ%Kp4K>?{_E?m@ZU@AA D{Yeu."$$3~o ~z{]ñcǎt!}R y0"8߃Lˏ+04l[ܐ.A*d|у{KfkR.VQ|Vq^jTC.iSʓgiOAIeEWܑofۣЫhUV$)OS~,QSRnЉjFy޾Uu.V \T^^%RFmȲTѶ_\]OUR;@윟J r %RaIAIٱV#3.ʿW*,),8׵"y|qA{L̟?Guɔ<{QI=<~m!D 򆹟oyC'yyy򧥔Fim,)e˖G(hnAH@E/QPRY!8 72_HIUK] ek~-9O-܎"-R-(,gYZ5y ?ZӦmq@p|i^ z9G"y;mسDD~$"{^0Eb8m]XNAH j"ҾY&zik"l>M9ĩٶA55eߐ-Uq#ۑͿ!%;M`5{%.L~LVū-LY^ՄxY9`$ Օ4GUUx<zGJ̐j6$?Z>%>-+zw| JNMRRӷbA%GpŇ|[>껙b,yHfH!M6{'nT 2&_&^Z;`f] uIAqXUL@Wɬc6~u$"8Gd嫀@wP99 '7Y4t'DO|}JM` b“^dWhpf8%H8 PSwYP#<Pm w-@|oG{lCeH9vV}3ʸI%5e0|P{9K79ңNWƽUnܟ!#\LBV8m<(]/^2jPBwx}ȝ+?E3PRwYAi;x$Ek Ė?hРen+%a {z£L#互N^R[DבR P\dAI|n ,YT] (FGb~'/GK-~i-6!:1 +`E{.9G!LPn|Dԩ-c( 4D8I1.ଣ#+^Ѱ 2]28 0!AM;m͉ ).x "?a(ʘgIB61O#S&odI|eTDȽA|ʠBoNuA)5glԉ\KA=!|<,ٝj+[u1Yk2 e0ukh+@"|%&e_YmwĔ-vaI04F]CYY`{}&h-BVm8Yy")xޚg$"@>uoStq+aWf,Q/cT =_pu!`{)u-6EpG aH#OΫ)B Vb*!BzT[rPF=d65uҧ7E%Ƚ ן0O Y't[#]Wa5 ɦUokuN PF>|AV/B_a\i7#["<% :n61ಀ~X䮧};7˥N^$QdVzяjYYY|V:{;KSE"#}fVF98 jvi,]򗰦N_Hv`@_qqBnųs~*,rGajhPrc]Sp .噀m!Y@=,:wu{Uo 8*h&qW?Ŗ-[RBb^(JĶ} GLzĶ?y4U#8FEWHVR7ԋ/RMR#Ȓ٬*~=AJR|֥H.z7}<؅;lBI8xV_@~,'%Jx8wAI'§Dj!oo/,/>xx v(̌n`_x[SZ% 3tđȲBd|¯E .0 2Ƚ\{05.(# tQVeГ Xj-oڭߣ{9NGU-Sb %$^ :݁9<4݄ "#Z{^B$@:wֶo/}~ 5wMƷiD$2S41ǵ'rD3m] x75s6kHqiiQhu]\så'} q837Oi [)~S9VkZ$1j`>݅E?EV(atY ^T5qײ9CQW,[*-?,€()ފqC9B 3r`F8YZ'r:Wl7u)C(1Lx}|?*Sٹ , 5H4H a"WI>!C\c~`U<=ٺ:7-݊ˌ)eE{ݶ*lP *c_4,(M+ ?l` lPQE?K/dCȶn3FF?gzEdbG qNւ]_H,åȘ MK?D@[glmϷX#BcDQZI[lJ)?BB1x}?eOYYY+Q-̪_OaIepm,hR2+ɣ!@\(~$*,I,:LW?y$O?uT|WIg CJEQk:'VL 8 ~Y.uY!'1;&BCQxS!dt&5ugA8#ilsUn̕>W``͎#%s"c&"ma悧5|k ][#Ώ$=[k7!_3' r!P?跘uPo+"Q tOvzA&DlDL )==Ԑ1: }^5ux~Y6xo|H 'dSl\I)g3Pf0g !BK)g BC{2H|QbE V ZYKp# >Ii0RES%Hzاڳ  q9Osvx" KCRU`zDN)#ۆ9$/Mbۻ, (7es@6[tD8ı(@A WzXzѷ~"PƽH9{}9H-UnG|!02DqDbX]݅_l$(XЀ(O>AAL)8 "cH/OkbF`VeBz-:IdO!%%EVw1qTK ғRۥk:h]vՌ$[ZRw% *:w,ܒCJ s/)/ H+PhP+oKALR"VA' N]U67#X>_IyIתBDUʸWP{io8 eQ&B| _2zaԀxP݋:m 74(͈)(CA3uIv8Ɇ /`x*{QZ+s @t5ړR!,}QROdC)2 !D D̈Ғ3ZWi\A R!6 Ւ(}NZKTP} NPmHG P!SY= iYGB?EdFa2 DTc;QO7ֵGN6ޅ.(2)DCK) Y}]O\wc;rBdNGCp@˪-4|A$ 簯웼ԀAU6l[Q,[եXTXwRIQߪ{Ak9MP*+a/4ӵ Cv܏:8w=&R@[j0X*ot - Zdj#Q݋^OmBC>H2@Y1|ƶԈ`JA|7QnON4;}*ukPj3}hvDa@4 V]'`Jʜ9}U0.7݈[EOG`5 ~{LF`@~~~3,f.鹢USg ₠6`k@L/Z^qD=o٩K#K~, -?s̮ɮ ySHj}`'@!!t ~ygo1BخrS Y,A^9dRL;ktRPTE g*,:!IYTDc:rC5TK~oMIjt+xM{`0WD!5f-|k^\zOޟv( ?E`Ԛ`&}I3|50ܗC^kn|u`*ұj?GU|9Prq]0 ;>_},x8 ,:zx2UQlAQ>G6$ʶ}F⊋"TR\·]R[:Z!/*-Tx򡃕!_Ĕ߀l4#RNYmO3N2tW~gsqWV*߹pGwkvÒё5e:h]ױMeםVM/o*`Inu{~DzLj+EW(Bc S(){hy.%'*iQ {[~/AڊVeE"zݗK=ğ?ǖ)1%gR;h.v!&ϖRLs 9eee7gb\}Baq q&!^/)Q=C-0ې\ lȏ`nB2NG0T“B:()FaMZuV{]0n?)O)^?tԣ@-C]lGOh=Cte¢9t|Ť)OS~4&7y%G Hk=m'(!Fi;q;QytmܺV׌gG#RWŒW7_7UJO#2ZՅ58ڿtQ̧Vuext:XtXKuSs~똈MOrcN5dU[Խ>BZ:5je0,=2|~BEH]Q`YP,^IHeL]UHy¢gˉ]Qpy"9Z(U#܎SŒiY1#qnkKϗOC-0yb!H_$;:3-*|7VzA@y^|LJ)yL*%=e_ jDLH5^D}'v6Ѱ477HN'@ ^_lj*zTyy9V_GUՀܤ4nOgЛ2i?hP?N;`y s/7<W=g'ћd1J/W{Y~+ a#Q32VUY?B^zO rmQʇ]Xw8h! );),:('/b4?`Y6TKʥ}72t8jZH܈{u"T{ ~uxrZ]MB{*|]{D5 3(Gyzuiݕp\qKoozLL܎rytRVX3<:[tSZ3'v`ԃ)+Q2r 8Xz5 dgg3qD~Gذa}zB5G`M}ƎI':X:m~O)z<2KȶGću(r8׭ῇO:x&n[JgW9u/.ıcV&gc[[p[CӇ`ă&1Tnfڶ>\CIߞ±T ˢ,Y+ʥUuc}HRZzT}lC .[P@]Թurm*3_itGl*2] u}"))x러ɸY\X\yvIQnD1q2zf )jxs4Cﭬ\RKCuǜ=gR!n--y~?|i~_V\Lӎ)rl&V;pfFYQ +JxTԡE:I& ?׻eE~ u Oh­KV;ҍg^v-LϲRm#Aiti#=a2zѤs"#HkV>\LϑγMϲrTN"} {TYx~,jX?c$ML2_đFuHI%~0XM+ZwGJE^ 5|M [-V &yQ&Jtu w %%kkGT+;;O<Ċ+>+RgREĞ]38\D1*ۚh(2欳vsyaZYho.hj eaћhiV\.EAQNV^'|- x`0t~]OÜ?tq'w['N9ϐg@$䔐cԱ\۷ĕ/,]Jr I!i!4}Ç i,rz¬#v^|&l)3I2L _U;x`c,sbW8xj H0u 7FqzKPTljQ~z:&[pG65ElgVO)fE(-/Cg٧]ZB^/,N2x-FI! ѿA6MJ~|r,ُ٥t)-t{IQEUۥ䝂+S&3%^.qʀ$ޠ<84Ɍ>V\UكjǸ :9AtˆfiƳͶV/aTG 382'6mJΝ`̣X~Ts ]o"pNHJ1S[`#gdY9m:v/'Smܵ|կoQoDsI.ʨQw~ຒBp핓G|Ao˹Tg.XW1)".Clˁ@5 ?PttَsGs=] Fio?֗o1}ؾ};6l /U;%\j|eeeX,<0t1.$οcO$"prwpBXbpbC۽ m,X:tDJ xeՊeHt3a6dO:Smմth`BkE^4udUf!ɘ฼DZ z$M gYf2>"G$=9KtѕoE˫F۷P`EK0ܨAxGzsMH=nc_Y!ˢdd[U ~O|1<̵#rFe/Wa €_:"~%(v(R/ƽ˰(c(zΐc#6G[ODaB@ŰLqSK|'$ě*_yw{t3_]?~Y2-Y2UKq2-SX,ߟtt|1E4(Yd[^DoۗxSH!xYr%_~9K/ux\WtRyp ~šuƉqES6m?CQ4MƗ_~ɴi_uQ9zIXgb=52ʺrx 66&-X!aԿZ*&Rv-(Vc{aPf3YBIgD̃Ѷ[{Tƥ:4AGp6-3p:&ͯ n\ƻix&V6k79HyK,[PR}T KGky< $='#tm([ZD_Bc2x%aCia޿l-0!-z@Cln6_ɦ&^IF:Pa1&'GރvlmĢfds( ]RȽԴ͊!jSpܜL]RdRH4Ġ"gb˾߻=4> iA0GQ]@9Y[dLXMǠ7VBI|j LC'}9|p{96ni_%S 6%3af*3pDzpBv]y7x1Ls=̝;7][#-O)W,SzsG7D>5Ml@վL@۳F=4dj|2sݕbάWd&ev4xGM/rrmx>Z}g؍v@Q0]=jhZiCaKJFJR2pn=!H94`G[68i qZ=؁8ŤpP%O P{Ի5Ntͼѐy2#hEwߤupϊԚq.W2-~ C_qf$$G$GUME!EB^^o5>(:@ Rۺ8멟.;`?Y/]\s̈́Qhl2{:ceQ$nu8~Շ}fΜkC^_كl)trWrJL&{.&K2d2j^CN;|k<~EUUo5*&SHLe<[VcI# RPau@l+.4mF+T] 2ڵ8KOL`:vOeRQ&> ǔxHI=ϑ~3*WF/;W K24P߶+bf: .%u' 3}Sw䕲SDeq%[4ol740>)gspni$hk2KU3 l 9Zi x<ƽm{yA K*˄p -0 Ԏj|J6?䷓]sKYO> ~w3> 5%ԹԜ S{XG ٞv Կ<=4{%ت{jy+G$sp;b~w'j{C6GQXɓuzcF ߢVئ& HJrg▊֞VW;]9+?[є lWWU3GX<-O_Jӗi,Dغu+\r -jrp|~II2H쁠y;E;z  x`'lDDGASS+W:^/;ӭ}HNguVT,-mI܀p{ѓx~GL>HliSR51w H=. 6?Krά IQ瞊[8y!Wzw/})^_z6$p񽷑Wl73s%Oli&b 5.ZFoqidXz&ɢիcFB4~ݬҪRZ~KioθP?%qM6N dӿ20H)GM+lǺԣ3~v3wG&h0"ۭluP[Z=qWF*o>BxkzSa68eZDaIIIAX]%@v꧕]3A'&Wٶ9P@[lԕɾ9V[d(jWM"2(3X)1A+Kû#PĽ+֤|y$PC>111cƐ=4;MuV%%^7yJzj1iѧO !FvUCCC Ϗ*!z /€Sb_Nd}Q,X(wq|Q3 G<\+>xP3H<04mkdҏ?տ-ylj<ڹhl8$RiY%l~W~3P~'ז>W;,3#fAXw n/}F]M#%hK@0- ! &Yd RrF xPn; Z% ;rk3&zm^:^I:"w#l0FZ 5r4, ٖc LwT],9VZWV"-A]cQ}YO`!A'BMaa47Qt}hõ^ hC+s]uWM) ׄPk{<ѷl6;8Қ]Q^˵^e~q(h[tmfΜ̙3%?lEga+:g]>J37bZ%))D E4/\5S;p[ ~_T$FE6}ACҚ}ɨbû7v:KwbRph4DKxͫ Uni@d"8âp$=<:YO25u*x ~n^vjB*'ሇVG~FGO5tU%01栨`CIJ7+!)h(+h/cdF]A3<;֏{41BU X@tW!L`Ä%hbC-ud=N|Ndfy+(pu:>ƍyuÇs3iҤͣppz}d|I.]i:- \{d>.\|H1ˤ9ᰎnZ3IIw~1mD,wh06H\7⩮DknBMM:r lFzB@Bom!`6iC' 55Ҹ 'f33g\_٤w2Kzi0VOūbVitM vM$.AĿueэA %Uvٽit34Ծmuc`E)\ O$2sCSB+UdN!>&!cByQ 49"RBUCS ;ýkUJIwMKU(;p( Xhh5Gl!-[IIeCw:m(g͝]][;CHDxP@kԃ8d>+'5KFYH^Ci{vұuW2KH&I$K0蚠8 /{1ýZxY 5.2RiDEJHJJ(q 뮻شi `˖-\~{N%WWQQKMM ӧOg„ $%%vZ-[?̫A53/Cvtm֩()Y Z@bTi!"ؑyp`^M` J;Rb5a6c6!4}!;q n##qʴ.)`w_nX_~7dv©qppe0,CCR tu/"=qhM-*ɯlUJjIl{];g%VE^'uA{iҮCAl0}VOQI-3JBm!*oBAF=kP$L%/Y"!w1! XH16 8I5.w nC׻u@c XlS&#ZF_dI&A׈fYH ZՎԹҸ͘jzFh1f 2  3^`f [;B,B] Ql= 3лiSQ|ҋl뮚 "|z[YB7̓2y뤠HxifO+&_{备ꯚZ #ڵkhkkd21rHjÍϦlEVp: G]_;BNgu:w:\@iiXnS\\o,s=,>}:W_}5~&00r;?&OQsb4ya?wj#Mim1?h}1,I͒r-҂P,2J?a2\W321ǜ?jjRb3D:b=Ӝ!3eٮ3.'ukCsPbꖾ܌MԴtry8lO/>VƧS 6ɶd[ܚ?ئv*%%uC})gߧCQl_EƸ,%gBWBJt :&4Kp\k64w.Z\zuM]72"`{LBph_c1ץ7w#G_~ ^㱨ߣ_yx,"Bzc!R1Y\R$n>KDHPSm %'l&-Hv(5*#Bի~!BH1u1{i@=@~ʯkKiׯ7L+_h3;wH ’7}oī;.~wF"N<ն pxܠ <̙3YfE62YH:. _>(ؼy:u*<{壏>2c /^̦M[8?Eo,Rb3'r+( %^5j  %*α7n`SSz*jLtFI:`I?{vE=G,Dg sb!e\CӝuH#ټcO6>O¤!%,WG/\FFL;SI @ `k:jw[k@1&:I?vF7mLq/r앝>632 %O 􇁙3I Қ @ ^H/$x!X^Q):wE]iYRURhHcaId9ʠDwM`wvm[ݑ9K%5N.E$ФyIQ)+4g_X$!0oM5 ou߆f~չ9 ~v,눚]R$lpCv} ( D/Swo 9ok'*ܪ .`PobR9]Ј-R2F /О5ĞaoܸCRRW_}5DNN E~lm7T|=Xt qݸh儹 E[b*`( N<58|˞"ѵ>󅒚Eʕς^}jCuhDb8>"NȌHɞ"jP㐏1yF!5Iɺafj=,C %9SvsV˯ $%%_28>uSJE&͟}H1/f&FOR$B7u83 ztMnV5aAs1/h} V/7B8 &7 o.^Z~Z~=@aq!GHhm^`՗T5kKfyj(RoJY `v8?$L?4Mk>Tׅ"-ZTRqrUjheIY0bRxgW AvQt0V;hHJHs[ {Ԣ`&cai Ty#Y7;z[+1nSZXfTKeQ&)q27'U0Ft*-C7:v{מHWayw]wD8SʿK"aŪ`QSkUUU|wq fs~792 PMH,˸z8N<`aKk {N+ /#GrW7{qHH!aι 'rNc>|~ܹsyYf 7n$))M6qwKƿE%1 RGo H ep;WgR;*27ViZI:xfKK"V[Wpnn&adݘH-_/P^P#8VwҒJGD5WrEIg2*CL+2'!fDUHw5BڞؾF+tzT"yCWwטΣ&N9illSN9n-q AI2McǒFSS_=guMMM,YzM:Ziղ_Z] .s=#<ҟ*aÆd+/5{0 lm:t0a. .dС]O>:իWS^^NQQR٘AoX:`Jjҵo~Nm:J<; 'OE2%51|E# sD(` {n7Cv=~NMO[7Jwi-]FKtxݺN>񐚆V[i[]Rm|.O856hxU׋gwy$# Z} -^_,4{8j%N~s+BQ8Jɩ<-<'gSY{.ʶ5RIQΊʳK}yQIm}'<-VGBURY "^wwud59WRaVV.:k0Ҋ||o/-̋󋂢%>0Kln{olc}mJmg~j5ի^)qvR4VA}n]rNDAd`eg\ý]EH;D#."[׶-4}GbZgTCQ_Vv/5NI=j_Mn؄E8}75@ѫhUVP$ªw=u]t)( ?TWp:>GBVvgOm)ҥK{hm Ξ=3\?D'yp'Af+Kf/[fv\s5!-]|psZioe>JR-ZGg{?~@`]d78֗nB.C؂$ʌ~޶mΣc= &`6Yz5wf…}z˻֗oǏ$_S+i}f7vr0[&I5( B45հ6+41ܽ(GՁZEw|h"J4zK7`]@[IanHxaq4){$lB0kBPPP@CCCXEAj^[ D˓!Vd;?iM_T[Y(y W.Ao[`4g^HvvHH}_/=')c+GCPRbw5͚v:a! K*ۀ蹁H-ɧ$]Hf~!(-x(" !? O9@H1|] f^Mt5յ '.FWfZn*Ʊ 嫧kERjR+5d߅ķow nnPjj*@v[ xGڴeb5\?4vHϟ͛1j(=+++d*R"V@RކO y:Y[jo,+]V5^ d,x WL; fVKJqKWDksTs%a8)lϽ~OY]H)#PNzrn)`.MHzrg"=2I .PR2 ]"eBns@L|˄+zI)oo;>|RWN-d&DA(ihm6h^cuIzHAlvrM3~7dUӢzO~)~FJD/ɗPgn$wO~`QixrU)W=˚n+I|zb-Ƙ> n@p-]%E}#1@dA}K/ޟOJ #9tןXj7I5tٽH͝9w='`H2X2?/ZV_-Әfɣ̶nyxS3:)ȶqt:Tv?P@C(p|"޲5\8ۜh{o`8FQ P>w|=5:- {zδye #_Fm0tvlSG0MSP%yuWM<\J|}%Eb~G^_VSELd.XyGTsc?n߾RcA$7DR_[:>0N%O7TxܨmRo~%-\gCUfVKyU )*S\BT{>4%5 zu% CMUig"stNA(I mk:+,xa! v/Eȳ.{n!%HIKGRRM;M&Ǥqʴ2#k 4tUӰCYUOHFv'lmbWMa!kgiqJÌe.Rp]Ro=rx*0w7!_GuM1$ G@r3jT7`5!+@R$#y~rmβY׌& [)sN?m}/1I>qJ-W?*U%3?X&px s-ud<AFI%$aZ B2Ǜ`XGNMc1PHۯΌ>%ο6.${u# G0tU{4hVz7P_S'rfkui<)fhKM8mt#fS N@soueGk5Bc;fS*iID7Rr%o7ŵCˎe|AH{5{P3bV43m͵<})'`+<b m2; mxytܫa|$zM9_`vz^_W+`'OG%v 7BXЛ qG+eGJ7 T_>zC"1aMM:!Z0 NGl'ͱUkVmz5"#`1|q=&h%uq8@ 5l3{LǓzW.3>0bc'T;52jJv;+`)c]n]ό#GCcc9ګt DSK㫗|QaL:[Q2r*Pt=(IHgj@?_zBXcOXNz=y|"NohI2t8ϣ+#ƹaa#Qd`#܋p5HGhWI&w{qkؾ0( xӰBM{QҍԺs:źuɭ\~t`ֹy_99?ՋoYv]r,M2qXrjf;bosª۱3 qpyHRjx-&&-iiL9MwT DHg3E% 8aW,atߣwV Ǘ/ -؊ռ\g͋|]!my7QgaMDMͶ꛴aVSVl #x"0J˂H:^_<I5 i$_OqBؐ]&OY_IpiPgl~ [m2p Y|H)r +mޏV<iI<Dr;?pGΠSt4O9ᇽtTA GZ[_UY$6'OMM߮'.4BQ¬_T9߶58Y|AJB)W>yT@yQr"Ʒcz ֩qTcФVnFYaZ3,lm¼D>fZfRʵ+_$y<{Y-CM5Z #xD?y׷Ps\r>XFl;9>؊^:޺Zqa2~Y,"F7ș&U}?2xi*_U;ig3cPGA6^ٗ7ع$ =io>KMݪ$@ bڪ5'𙃒lnPRS>+`!L4j?mMT%G^ZjtWWJ»geQfW0W@wKքV%9a1*}Ao@ObIlOW_t톯IΘH4~0>SGҧkJCeW:CLL~b+W E:&&s޼;p-+znڢ,U>\JY l;NOeV DMMSӄ`]YcKEq70h^LC9C1 e& 샾w')W>wyNXàZ3z;C&X^'}# #ˢ!5{nO`?4kD)Md_;ɹ9GRR*Av++bG'fs 4p lB˳Wb+N*`0RԜ':lo8vDyۚkU͇v$ﱳͬ>6&XAm7GS)+sTtP//e=g&Ҳr+`ҏu;~h+0Մ0mιu#ϴ2ܫt]="۔@F{%v!sY lw {]SBu)YQV_磵>Q;rRu ~CɌb5Msn`1Skjok%:8###ZM$``ɷ?%+݋e-} /jiXg=D6gx"l<׷c㿂`_F<(L52&ʪ{Nhln$Ckr{sy3Q@cY qnm7SߺߦoL,}UM~Qw^$j@][MڶA#sid[Ӿ)`E1r}%qj|?i@_+k^Ľj)/S)cm clBG%#?c(ۉᇣ nmWv`.'rMԩun65Y4"?AUK]ooe}GkqP3ܕ hvlcoAw+M59ZlǨGa5NAJw9zlE۳ )%lCK)]˿bz gɵ{~wH:kZLghgLҍX{-}!uxVat쾘୮6^5{Iu(z[+_±wR!{GPI ۆ' `~MCTN'6lp ?G |PJz?+wܫk~`mTk e{#OSsoG@F*V]i!.ES׼\LDZ6^nQ zԮɕRgoC)YiSQO8ݡ̔)qk27nJ_ƻ?>B~ "$,x7 PT͟yt./0ȅɐ q7.'.SQvê 9Ƃ%52c1؆ L,ۋm!cΌ#h0 ̣ jw2m { JJoPSL53ϾeX\ |SDLH;#[CǒN.^qq9!zP\St0cfZ@Zz\G2('R7lo: ۬ScGڛi[g%pC]YNǻ} cj t{0wzIiýfy\mg`=h_DzIzƃ% M?Mӏ%mk&=irG ҹEħ, x{!j{u11#F;cN`y7R{9*-nGq<`yO0n+r{ 'URFZǦ=hlF&gW5Uu ,Hk_ۯ=V^ o>)W,D$&FBxu4,E헏;(QVDBFU`L+.rH'NQQ c=?a)/ 5 /?璫QSB@{w$هG|[dNHM7NꄏG@zr!!, Xy cѪ0O@ o:#`+p~e4 ^6>S^lj`-vDL%9bxޅ$Xb-uXCs#5qtԶXW]I䕱y6gϤ^X*c_'`(`]0+œgjRTu8 (4Ky4ԼDžgڛilj$7g_>A$U5H}ƻ:ffDB2C0 ΁EڛI '`=pW]XZTjYSudZ}B,jF^ ݻ[XJPÿjHjд~&t}jWn=d_IbRtF~޾3^;d#Ȱ|հ7&J]N;RpIxjk^BʛiyԜ!hա:BXl^c(}c5R22t j. uK50Mx*h?ƆiZKFkǽ} ھ^Ymc0|TamG?3xwW_ UAfi,V7)}LY`$}/TC Gҙwc|d`ې+Qߢrټؤ)RP囚*FN_}M3+~[oihP 5ҏhCM*^j' ްhHW|HIcFl^2 3br "ϊY=%Eʌj֗o XtCsF}6 C=L[yÆ*'Cg}1 FG'xYCF$#%Zh=r]I"7^%-"5l :Ґ@qs;TlSN'VQs בw # ^S"p~ Igߋq1 _2n+y bOaK,Ռ%է t W]5$#+:QmcǼv[>^k|UR_Yn7Vҍ_]ـ=T |N5Xga7|!S-xƺ' u+"IHRM7gm/ZwQrjvoI|:l+_sV:€I!w}~lg޲i FPUҎ?h-YJ70H9(|OB֡#H? z^xLJzx HTzcQYA[ fE#BxiDEPQj*$u)13 )hJ-Sj*eY Ch[ ڞ͝9! T0k(5M ;PɘA^m+ ߎTQ9 Fwо6ZUj\:5hymK;MHUlXLh҉YD i4W~Swդ>Lx#Uޑ/xHH:!`i )$Fۗ:K' 7 zDz$A)>$t"Mp ޺sh`BCxR!?&gc|ΝE߅[rr(vƬ]v(B|K<+W [z*Q{W )oͬn)}}Zt?!C..ʝAޔbxĥwZ%?_I_-Mh~)K^gurwQUiޙɤBBB "A@W]a]w-aU\u]]+RW]A*RB JH!mڽ$!̤N|}'ɝ<{suNJ 73Y|&}z -mG"r먬D$Y{ aAjQA֣D$8:~U_ɱ2V&_U_,,_ƞ޺7,Fj@ }9m}| qJdeK{AqfuyBk 5q+[.uZEIN˪;"ra[&ra㛴ί0'V J|k^IGޤ!ar%JHK;=y͚&u=&2 )zɷZ kA{/hVVs|3~ ][?C__CQc~M]_M)^z!:缣Q/(3|u]lɣIBw+BOkT|-gi[LܔT4={%"-ڴ5GoV%@ɷk;'K`+4@QQmZ=ht|))gӯ48bqiFAt$ȮPRv >5U*̸۽~Y7Lbb"yzîYPZ\pvv6̙~& 3Lw@@kI(+pP+YhI*,!A72óuhQT)we]|uNjRRR/M?cVVV/M𹹹HNnpuQw("j*ʲ_xa:;'L.wJ}W3od.k|3&ߚxpd>.$aqiPNKJ X(5w!MzPY'5;huZ}ӸY}tM^1Ӟ:-'V>czqvkc<ŻM1:0>Z521999oIX"RZﳳ9RYaDpg*${ۡ+}ѻs3wNYp{& ;;{ii mcF'!!a XӢE-H՚t%[ӮV^ ˛`5\[HSCͶ2^wyVC)2 SC4!\wEu0^9Gy=mI_m9Xw8?='mFLB CwxZ#NZXX/x PMZC x !ŵXL+33OkRj/rV~5M0K fњf;YVzfoii"Oc iJ~xъ[+&j-I@O0FBbKQxR=bV7nXBgQTֶ I6YwᖱM_ t;iUԟ ءB7B>P5CfK#7r9,׾B:zWz瞈%D=;5Sy|~#ZKyRjzퟺ 5?u2Q[ bs%[Wo_ O5[s%9a ( 3 )1{ܼWZZmM%~w-ze*4wӚ[If!|:]p݌;^邮l;]pNNDmE ~ po'ӂ}jX^Gk, 6fg߸3LG6!2m܍oP)":4;8#1YR'O(Io#n'>vd koUϾh/5sv9WϚ<+ Ú4-[r+y)3Ǻ?h  Ʈ*%ֻ;|Cg^MZP(TN+voKQ:[ &#ٰ8Q[6Xz5M֙YoY!">?&"AOu;! S33'', K!J%LxAy cc5cT8 c[5몰ƂՀ04}lsa?$ʄz9+MCݏWX.wV^T斱Q ]lԝ33(G(^EZ>ㆭ~6yMJ1ńy'h]Ob?zn>!g_^4֘R͟y^_w!(*?=ug +\f=ju lim6"j3G<%:ɷZpSop0o5ILX^&l3؆]?Vuް7h6m՝=[>v$Cqfp&D.@yG<{N؛|Yo9)y$]Fϣr\Yۀvj1e 811qDfJЀ[q  e_,@)({86 457M+^b4@k: HZ|k,AKj'aKKoָc1w}Vn ڼjS"7[/J_5E~j϶FhƵb{+_wu%ƅV*a5?pw] ~Tx\M [8R|1ArdPUg oYee>M? ;~-럂uH( 68U^{Y纗޵ft.HzR 5˴0v^PQ @.Q054Iz™֚NLLaf]OT)jee3JPVILT~C{~*E85y<Ӥ)ڷmRZ!SJwOE_IɷZSp*Ʒl7a^_oWGM fLjWn\Ԛׯ0Br#Ȧ9BՕ-䪬zO6K,g0Z''Pˡ: *r0ȅo])?հRx6p"`ff󧲲'%%A4ToUΞi(IT=ߺԉS3q!'\;VAʊꭷ~Z@L3YsRWv"jR(WF[OHHh[|k,,( '_; &UjKo6kʶLUOMi@-4זm`ttW ~z:K4y8 /X9\3{ 85CVݑi n7~g @?>|Ԏ!dgg7{ZBՊCn q FCrnܟmȿWAH@+4e>Qm2ERf3& |GG7+R0u]4U9sz$C-(IݻW[֦VQJmuG)ղkRzI8HɷZ$%@כ?nClwcMLY[ bzv7.e=ϪGUJfO^"ާ$>S)(yJ THpCSD=ܘvx*n[o$\jVj)ϕOh*h ]Ԟmí)<:l~]5:P%(0 5BW"PbAp؄f) N]"0t]L.vtRDYևTEE5>evORۮlew@.TGt S->ͶtG :{J@eZ Y:U~HgIOM7~O*kYS ~'޼99O(}q%j+gy˜Jϊ!%Ŏ3*-LZoƤY֬HrP'O@+S)awc_pCm}_D,J6{e t,&vk7ה)S%K(~[_Lё,*=M/oq(dLmHԝ 8XmϏ@Q[@~*~0kYƓ/ř㇯!mwܔhWDF*p|"[V7y~`U čQ(iټA.,K5 H2Jfۇe{jZSL/^]tQI&%^7q&M=yM5]:kE)' BED?zh>rHԬ韟?ȑ#Mq:wc?.&Vyg+!CRRR2Q2^D9gNy\ 8pwcțQIeJJ;#2xjGTx\SUGa ;>/LT`y5QJJMM +%"X o @O75}U;_jsf|wqKM vhOȺ&rNceZ~e%n*|CϺeMA _`qPL ;_3֭[3LOkHZZ<~˖-[F<.w /c0T4@i@Wc^Lj|>|]n&8p E)o>ۍ<{wc&\.oiyyyt7~Cc۟j$t N@ R 92MLPoVc9xsDd$):i4BD>VwJg/`,BP2nj?8+._tew{?vX[BtC6/7Xr:1ʷɁw8J*)Ģl|:}5usGw?YbC>v4LMkЦ]v7r0Y1 瞭e=rC ǔ7::g}aFoܸ??~(XTR*4MR}-QJEH?3lذ7oU' @VU[fOOOnkq-bP0dI7RxLHMXmow (||KO gϞQ"(;D^*ٳ뚦=u8,gkQ⊥.:Ș{xϺ ƺ=}ro4aPJƶ-**ԡCtnSJJZRiVuq uAJf+QM}7Zoxw<~ر ;w\oA]wo޽{|unaaį~0F_0 XVWV2w0Ԓ3 ԫ4͚"TW_*O_IGm,+ǿ^\O'+fFB%NlLu1|Y9y%wg,}ut: {vNF\yQc~9UKߠ?0l;% {e:hv᷉}'@d~D&&&f0ݩSؐB4MHTTիF},!!!:Ɣ)S,s4hU=LHH/"B [DD'!!cƌ9yFLLLM~oE* ; vW{ Ƌ˶ᕛEU]Ahѝa; zT,y!Ƨa霐Ԛ&6KܣGDYi#DA4/JHH(־qç΁pNքaWK@_T6 J->ʮ0%`=y;b"LmlA).4 .+K.ѣGl[qqvG}J)n,_*++,---KMM}|5mnѤD g)0駟>;1w?ܙLHƜP ag@?9s{-[u?p_[N 8ht_7%%oΜ93z.̙ٱcG/)57aXV{~㋈mQɥ=zo^?K[G1 'zA,:f}N7aPYD >x(sNm[cNJJjir4a 4my߾}NP, 'n1QTPAԩ1 ã:t 4HHwߍsڟyвA]v;>?܊7:G JꞚix_Q= (mysղ $`:כRs|..}ޒRyŨʴ \̹,\ER>;0lwҢӢD7`{'l:=7[u#wGP'Y \Tveeˌoq-$ޱc]UjǿxٲenaK/dټysCa{g,t? S9 #u?tf[I5 s3V4i4u0K`jO`>f0 Di fƝvLVqnu|Z_ylȋqTG 0 5T ݼ'L_@Dli[5 [pM \hΩ~D}`ĩwe*[0mui0<tA*> 7;u|gr#޽ ǎ̂j-<@'xx@ ?ܳC{Ds{?2 y6fk<rկ7B0=.hm}S[yӏuo=k_΃;k;TH(Ig>z*躳zM41/PQQŋcѢEx6|t ⇍F3[nx|rlذ(,,_~秉L||@n[sD́%ԣ#r NⳭaqcבOl8 X.\?BÍ9_< -);))ivVoUSɅM|zDD@k5&UGon3w7(:̘1'N̙3\⦛'g/\ߵ^{֭[QXX0mm{ ;m[.p ^~HǟE=zvy#GݻΝ;$&&Wn7aH^3~ (ٚp߮%Wd}ӠU r#\'U`y;]J7? 8;]֕sdq~Cttjx8i J~MUC$ؑ}\~57`0 a[d{GR{"JEu+^2L ܑ?)#_Yrw/YE{УK; M/^Gf3{5&l?e`r WCfރo6ĂIa>̼|Dz~{ԅBLo(X38GK1LX-툎AP"(.w`wn{vo>5uԞPO{]0aO?s>_%$j8!EQ[(}g|8goAV/WMoFDV=-jY(JU9%rwҴ=Ej?qā˗/;4mfddtUeeeaz]paNoDll,ॗ^‚ l޼9(E߫x jrk}[I9rJf? Þz衇ONNny{q=g'O@:FxET?^ L= hF|nnݢ8:{,W%xʶ@٤Yɷn薉 ,QzH4gyu8(! Nk+a AxH<quxV;_0Vtqs7Cɥprt:tr)pBAK}_v1,kVĸn>> q4} 5DIW6L.6*{?'V'ߘ -.YשSO^NNN˅kvBII o}+WG؛;ѣG#PwQ S ;L KP6e r(}kW}o~kg :&?LCẟqߠ<8 6sw;_Db"6|#v+b`^\!Vaϡ{"({8TH(q,> O>Hy Bw3?}ҹ"lʃ N#,iZar'(KG:u,0r@a 8Q~߯i`ڴiHII7|}N6mxݻqcذaGQTTd4micm1B^yeS5$11qcNN6CѦml cBi]IoG#'+?׎+~@Jpzc` G &Q?lYZ/OEw.{:Sģ !G~TNKSJ]&M)9 f%EjqZX Vx}S~ԘC(**Byy9~[5 /~4a&ߏjnՠW|տ yU)_s_ "/4h>u]7رc哔R8zqHݘ[MӲon-0t:2U27\Rv `= t&*. gUW]]"99_|EfB+Zy[[JibmJW`i@/5LwaW-K75Y?z t-5$TP )BʽI O1B wXS8Ta׍ꭁ5xgyn#pvg\Pe|^gB4^׀@V(<MI^ؾ+^oA:RXG<$'fAh`ncft߱j**W a6ų  ``|\ZZw=k~l)J^f][HDT{Zjj-[ԋsN,\^{- ?kj?auN_\yF>#wyx<طo¼ƃ޲e0]5R*EZ8N $"H FYۅmɞj7B>> KšU0q똅5O:`izl@!Pw0ˋ!% eޥ#&XWQ:!_( 0d8^SJ5+uG@2e9t&bnQ|S7U;$S0nݾgVO7NM[ nmZXfͼu)))DݻCظq#v>|8vbΝ;Gdd$>S۷pQOii2RjD]VV4O0"""n:ssvveJ&"j?23ub5XD`&n7 p[,;;2kM#]i&eL7R|WOFo~XP1t&Cn~oBu)#z=[A.X[\o ˓oE]0cBK#' p=*{n(i+]!ba{EXy6XFI^D6zKh`כ H4_sݱ~72b2:9WG kaz>|e˖->7mڄUVjW^-܂!Cۙaϱؚ{N;_(vލlv̞=v|-[FC,lJpk-nq}nfq5'/+gˎ]3>%"$\]>lB쐊 p"/'2Ak&\ ~O-CBB")&HFxxzKF?7BF߯_E²g r|dv5\8lw ,] ^))}5k֔YwG;vllLL4M7Mz²esļѽ{wtcƌ޽{Ǐ߉P[3MM~TJ(((zgdyX)5 gG_ _nݺ5!66Lau< %bk~ b|u{p?M(zVi 9[כ!{S>+Ƨ~ gX%9=~\ i=qqZs8ؼ%(q5ZFlɣX«V54(QnQ6;B]a[]ϲe˶꫃+ NLﶦhA:DDLu;] 𷩷WҡA xKwLWk Z&bhh~S)1% E _qϼ*#:騼yXoWUo=vk7=]xuN>N}#\hpu'$7p lKN%+,W~~V (+++{G]LsΥt$&&Ϝ9tɓ'#$nunݺ#lo+nڱcǒKi3@2AjW=oKQ>2E/D=a?Og*ޓ1<0,9)-YZKdx(_8e q*Ӹς)̜gR.Կ'\*"gT+@yƷ]u"{-y9_\5fr7|Q\/PbIM[`lڊDg(?\r Ϡ?̬?#[b#PalZDB#|oI]lYRt n(rssΝ[:p+\B9J;3"l ~_W^y477wO;R.weub!"0EdQȫw|(QѝJRYf5K -RYZEŚ!YnIGS2l7KYz$#ypZYQ,> MNYV !X&TMk^(q͖# аԠM]w.`qD"CruF}|@ /%"%K4>;wlۃѦ`;R}HMM} hFnWy1+wƕ [N1 ͅ a*-Ob;||_nR)Zz[ RWhA>K~ށ:k$ÆXpڄ3RfM5XcnN*^x齗zߩG=!5%D'-V.|,} y0 Ȅ~{jlmhy+ 83}CzwZ GxjXb^a7+nC1~=Lo޶P[Ocjp괴 MUVΟ?'x0;w]'''l6[up8롬3o޼ btTJp:y-*ִ&ڭ jGt600{7sJ#>ؾx488>Ug;Xzv17lKAh+7!leTA&5Uc:b'U>L7d񁵆4cjD f@A״;F۷aWHn%Tv`(\nw1'g4\/ivdt|65,…PBUpO˭BKvF`sةe>1o]KΞ2{< |U$ݜ旿2bώccW<1צDs?|۶mnM ddd4׎oX߶m[aUԻR6@ _}gMja|ǿ-jIC;$اOihOI/I3o/ΰOMn鰥O2Eoi/B|YnSS!mh}_ٯz\MX9nQ2QAT}&H&-Ɔ}%R,.AMT"R)pe7&5(m}2~[&/h }2@[&_h mm|ෘ|ȿDjQIENDB`emoticons_theme.py000066400000000000000000003620621326020644600333460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticonsfrom collections import OrderedDict use_image = True # Ordering: http://unicode.org/emoji/charts/emoji-ordering.txt emoticons = OrderedDict([ ('Smileys', [ # group: Smileys ('u263a.png', None), # Category image # subgroup: face-positive ('u1f600.png', [u'\U0001f600', ':>']), ('u1f601.png', [u'\U0001f601']), ('u1f602.png', [u'\U0001f602', ':\'-)', ':\')']), ('u1f923.png', [u'\U0001f923']), ('u1f603.png', [u'\U0001f603', ':-D', ':D', '=D']), ('u1f604.png', [u'\U0001f604']), ('u1f605.png', [u'\U0001f605']), ('u1f606.png', [u'\U0001f606']), ('u1f609.png', [u'\U0001f609', ';-)', ';)']), ('u1f60a.png', [u'\U0001f60a']), ('u1f60b.png', [u'\U0001f60b']), ('u1f60e.png', [u'\U0001f60e', '8-)', 'B-)']), ('u1f60d.png', [u'\U0001f60d', '<3']), ('u1f618.png', [u'\U0001f618', ':-{}', ':-*', ':*']), ('u1f617.png', [u'\U0001f617']), ('u1f619.png', [u'\U0001f619']), ('u1f61a.png', [u'\U0001f61a']), ('u263a.png', [u'\u263a', ':-)', ':)', '=)', '=]', ':]']), ('u1f642.png', [u'\U0001f642']), ('u1f917.png', [u'\U0001f917']), # subgroup: face-neutral ('u1f914.png', [u'\U0001f914']), ('u1f610.png', [u'\U0001f610', ':-|', ':|']), ('u1f611.png', [u'\U0001f611']), ('u1f636.png', [u'\U0001f636']), ('u1f644.png', [u'\U0001f644']), ('u1f60f.png', [u'\U0001f60f']), ('u1f623.png', [u'\U0001f623']), ('u1f625.png', [u'\U0001f625']), ('u1f62e.png', [u'\U0001f62e', '=-O', ':-O', ':O']), ('u1f910.png', [u'\U0001f910']), ('u1f62f.png', [u'\U0001f62f', ':o']), ('u1f62a.png', [u'\U0001f62a']), ('u1f62b.png', [u'\U0001f62b']), ('u1f634.png', [u'\U0001f634']), ('u1f60c.png', [u'\U0001f60c']), ('u1f61b.png', [u'\U0001f61b', ':-P', ':P', ':-þ', ':þ']), ('u1f61c.png', [u'\U0001f61c']), ('u1f61d.png', [u'\U0001f61d']), ('u1f924.png', [u'\U0001f924']), ('u1f612.png', [u'\U0001f612']), ('u1f613.png', [u'\U0001f613']), ('u1f614.png', [u'\U0001f614']), ('u1f615.png', [u'\U0001f615']), ('u1f643.png', [u'\U0001f643']), ('u1f911.png', [u'\U0001f911']), ('u1f632.png', [u'\U0001f632']), # subgroup: face-negative ('u2639.png', [u'\u2639', ':-/', ':/', ':-\\', ':\\', ':-S', ':S', ':-[', ':[']), ('u1f641.png', [u'\U0001f641']), ('u1f616.png', [u'\U0001f616']), ('u1f61e.png', [u'\U0001f61e', ':-(', ':(']), ('u1f61f.png', [u'\U0001f61f']), ('u1f624.png', [u'\U0001f624']), ('u1f622.png', [u'\U0001f622', ':\'-(', ':\'(', ';-(', ';(', ';\'-(']), ('u1f62d.png', [u'\U0001f62d']), ('u1f626.png', [u'\U0001f626']), ('u1f627.png', [u'\U0001f627']), ('u1f628.png', [u'\U0001f628']), ('u1f629.png', [u'\U0001f629']), ('u1f62c.png', [u'\U0001f62c']), ('u1f630.png', [u'\U0001f630']), ('u1f631.png', [u'\U0001f631']), ('u1f633.png', [u'\U0001f633', ':-$', ':$']), ('u1f635.png', [u'\U0001f635']), ('u1f621.png', [u'\U0001f621']), ('u1f620.png', [u'\U0001f620', ':-@', ':@']), # subgroup: face-sick ('u1f637.png', [u'\U0001f637']), ('u1f912.png', [u'\U0001f912']), ('u1f915.png', [u'\U0001f915']), ('u1f922.png', [u'\U0001f922']), ('u1f927.png', [u'\U0001f927']), # subgroup: face-role ('u1f607.png', [u'\U0001f607']), ('u1f920.png', [u'\U0001f920']), ('u1f921.png', [u'\U0001f921']), ('u1f925.png', [u'\U0001f925']), ('u1f913.png', [u'\U0001f913']), # subgroup: face-fantasy ('u1f608.png', [u'\U0001f608', ']:->', '>:-)', '>:)']), ('u1f47f.png', [u'\U0001f47f']), ('u1f479.png', [u'\U0001f479']), ('u1f47a.png', [u'\U0001f47a']), ('u1f480.png', [u'\U0001f480']), ('u2620.png', [u'\u2620']), ('u1f47b.png', [u'\U0001f47b']), ('u1f47d.png', [u'\U0001f47d']), ('u1f47e.png', [u'\U0001f47e']), ('u1f916.png', [u'\U0001f916']), ('u1f4a9.png', [u'\U0001f4a9']), # subgroup: cat-face ('u1f63a.png', [u'\U0001f63a']), ('u1f638.png', [u'\U0001f638']), ('u1f639.png', [u'\U0001f639']), ('u1f63b.png', [u'\U0001f63b']), ('u1f63c.png', [u'\U0001f63c']), ('u1f63d.png', [u'\U0001f63d']), ('u1f640.png', [u'\U0001f640']), ('u1f63f.png', [u'\U0001f63f']), ('u1f63e.png', [u'\U0001f63e']), # subgroup: monkey-face ('u1f648.png', [u'\U0001f648']), ('u1f649.png', [u'\U0001f649']), ('u1f64a.png', [u'\U0001f64a']), ]), ('People', [ # group: People ('u1f575.png', None), # Category image # subgroup: person (None, [ ('u1f476.png', [u'\U0001f476']), ('u1f476_1f3fb.png', [u'\U0001f476\U0001f3fb']), ('u1f476_1f3fc.png', [u'\U0001f476\U0001f3fc']), ('u1f476_1f3fd.png', [u'\U0001f476\U0001f3fd']), ('u1f476_1f3fe.png', [u'\U0001f476\U0001f3fe']), ('u1f476_1f3ff.png', [u'\U0001f476\U0001f3ff']), ]), (None, [ ('u1f466.png', [u'\U0001f466']), ('u1f466_1f3fb.png', [u'\U0001f466\U0001f3fb']), ('u1f466_1f3fc.png', [u'\U0001f466\U0001f3fc']), ('u1f466_1f3fd.png', [u'\U0001f466\U0001f3fd']), ('u1f466_1f3fe.png', [u'\U0001f466\U0001f3fe']), ('u1f466_1f3ff.png', [u'\U0001f466\U0001f3ff']), ]), (None, [ ('u1f467.png', [u'\U0001f467']), ('u1f467_1f3fb.png', [u'\U0001f467\U0001f3fb']), ('u1f467_1f3fc.png', [u'\U0001f467\U0001f3fc']), ('u1f467_1f3fd.png', [u'\U0001f467\U0001f3fd']), ('u1f467_1f3fe.png', [u'\U0001f467\U0001f3fe']), ('u1f467_1f3ff.png', [u'\U0001f467\U0001f3ff']), ]), (None, [ ('u1f468.png', [u'\U0001f468']), ('u1f468_1f3fb.png', [u'\U0001f468\U0001f3fb']), ('u1f468_1f3fc.png', [u'\U0001f468\U0001f3fc']), ('u1f468_1f3fd.png', [u'\U0001f468\U0001f3fd']), ('u1f468_1f3fe.png', [u'\U0001f468\U0001f3fe']), ('u1f468_1f3ff.png', [u'\U0001f468\U0001f3ff']), ]), (None, [ ('u1f469.png', [u'\U0001f469']), ('u1f469_1f3fb.png', [u'\U0001f469\U0001f3fb']), ('u1f469_1f3fc.png', [u'\U0001f469\U0001f3fc']), ('u1f469_1f3fd.png', [u'\U0001f469\U0001f3fd']), ('u1f469_1f3fe.png', [u'\U0001f469\U0001f3fe']), ('u1f469_1f3ff.png', [u'\U0001f469\U0001f3ff']), ]), (None, [ ('u1f474.png', [u'\U0001f474']), ('u1f474_1f3fb.png', [u'\U0001f474\U0001f3fb']), ('u1f474_1f3fc.png', [u'\U0001f474\U0001f3fc']), ('u1f474_1f3fd.png', [u'\U0001f474\U0001f3fd']), ('u1f474_1f3fe.png', [u'\U0001f474\U0001f3fe']), ('u1f474_1f3ff.png', [u'\U0001f474\U0001f3ff']), ]), (None, [ ('u1f475.png', [u'\U0001f475']), ('u1f475_1f3fb.png', [u'\U0001f475\U0001f3fb']), ('u1f475_1f3fc.png', [u'\U0001f475\U0001f3fc']), ('u1f475_1f3fd.png', [u'\U0001f475\U0001f3fd']), ('u1f475_1f3fe.png', [u'\U0001f475\U0001f3fe']), ('u1f475_1f3ff.png', [u'\U0001f475\U0001f3ff']), ]), # subgroup: person-role (None, [ ('u1f468_200d_2695.png', [u'\U0001f468\u200d\u2695']), ('u1f468_1f3fb_200d_2695.png', [u'\U0001f468\U0001f3fb\u200d\u2695']), ('u1f468_1f3fc_200d_2695.png', [u'\U0001f468\U0001f3fc\u200d\u2695']), ('u1f468_1f3fd_200d_2695.png', [u'\U0001f468\U0001f3fd\u200d\u2695']), ('u1f468_1f3fe_200d_2695.png', [u'\U0001f468\U0001f3fe\u200d\u2695']), ('u1f468_1f3ff_200d_2695.png', [u'\U0001f468\U0001f3ff\u200d\u2695']), ]), (None, [ ('u1f469_200d_2695.png', [u'\U0001f469\u200d\u2695']), ('u1f469_1f3fb_200d_2695.png', [u'\U0001f469\U0001f3fb\u200d\u2695']), ('u1f469_1f3fc_200d_2695.png', [u'\U0001f469\U0001f3fc\u200d\u2695']), ('u1f469_1f3fd_200d_2695.png', [u'\U0001f469\U0001f3fd\u200d\u2695']), ('u1f469_1f3fe_200d_2695.png', [u'\U0001f469\U0001f3fe\u200d\u2695']), ('u1f469_1f3ff_200d_2695.png', [u'\U0001f469\U0001f3ff\u200d\u2695']), ]), (None, [ ('u1f468_200d_1f393.png', [u'\U0001f468\u200d\U0001f393']), ('u1f468_1f3fb_200d_1f393.png', [u'\U0001f468\U0001f3fb\u200d\U0001f393']), ('u1f468_1f3fc_200d_1f393.png', [u'\U0001f468\U0001f3fc\u200d\U0001f393']), ('u1f468_1f3fd_200d_1f393.png', [u'\U0001f468\U0001f3fd\u200d\U0001f393']), ('u1f468_1f3fe_200d_1f393.png', [u'\U0001f468\U0001f3fe\u200d\U0001f393']), ('u1f468_1f3ff_200d_1f393.png', [u'\U0001f468\U0001f3ff\u200d\U0001f393']), ]), (None, [ ('u1f469_200d_1f393.png', [u'\U0001f469\u200d\U0001f393']), ('u1f469_1f3fb_200d_1f393.png', [u'\U0001f469\U0001f3fb\u200d\U0001f393']), ('u1f469_1f3fc_200d_1f393.png', [u'\U0001f469\U0001f3fc\u200d\U0001f393']), ('u1f469_1f3fd_200d_1f393.png', [u'\U0001f469\U0001f3fd\u200d\U0001f393']), ('u1f469_1f3fe_200d_1f393.png', [u'\U0001f469\U0001f3fe\u200d\U0001f393']), ('u1f469_1f3ff_200d_1f393.png', [u'\U0001f469\U0001f3ff\u200d\U0001f393']), ]), (None, [ ('u1f468_200d_1f3eb.png', [u'\U0001f468\u200d\U0001f3eb']), ('u1f468_1f3fb_200d_1f3eb.png', [u'\U0001f468\U0001f3fb\u200d\U0001f3eb']), ('u1f468_1f3fc_200d_1f3eb.png', [u'\U0001f468\U0001f3fc\u200d\U0001f3eb']), ('u1f468_1f3fd_200d_1f3eb.png', [u'\U0001f468\U0001f3fd\u200d\U0001f3eb']), ('u1f468_1f3fe_200d_1f3eb.png', [u'\U0001f468\U0001f3fe\u200d\U0001f3eb']), ('u1f468_1f3ff_200d_1f3eb.png', [u'\U0001f468\U0001f3ff\u200d\U0001f3eb']), ]), (None, [ ('u1f469_200d_1f3eb.png', [u'\U0001f469\u200d\U0001f3eb']), ('u1f469_1f3fb_200d_1f3eb.png', [u'\U0001f469\U0001f3fb\u200d\U0001f3eb']), ('u1f469_1f3fc_200d_1f3eb.png', [u'\U0001f469\U0001f3fc\u200d\U0001f3eb']), ('u1f469_1f3fd_200d_1f3eb.png', [u'\U0001f469\U0001f3fd\u200d\U0001f3eb']), ('u1f469_1f3fe_200d_1f3eb.png', [u'\U0001f469\U0001f3fe\u200d\U0001f3eb']), ('u1f469_1f3ff_200d_1f3eb.png', [u'\U0001f469\U0001f3ff\u200d\U0001f3eb']), ]), (None, [ ('u1f468_200d_2696.png', [u'\U0001f468\u200d\u2696']), ('u1f468_1f3fb_200d_2696.png', [u'\U0001f468\U0001f3fb\u200d\u2696']), ('u1f468_1f3fc_200d_2696.png', [u'\U0001f468\U0001f3fc\u200d\u2696']), ('u1f468_1f3fd_200d_2696.png', [u'\U0001f468\U0001f3fd\u200d\u2696']), ('u1f468_1f3fe_200d_2696.png', [u'\U0001f468\U0001f3fe\u200d\u2696']), ('u1f468_1f3ff_200d_2696.png', [u'\U0001f468\U0001f3ff\u200d\u2696']), ]), (None, [ ('u1f469_200d_2696.png', [u'\U0001f469\u200d\u2696']), ('u1f469_1f3fb_200d_2696.png', [u'\U0001f469\U0001f3fb\u200d\u2696']), ('u1f469_1f3fc_200d_2696.png', [u'\U0001f469\U0001f3fc\u200d\u2696']), ('u1f469_1f3fd_200d_2696.png', [u'\U0001f469\U0001f3fd\u200d\u2696']), ('u1f469_1f3fe_200d_2696.png', [u'\U0001f469\U0001f3fe\u200d\u2696']), ('u1f469_1f3ff_200d_2696.png', [u'\U0001f469\U0001f3ff\u200d\u2696']), ]), (None, [ ('u1f468_200d_1f33e.png', [u'\U0001f468\u200d\U0001f33e']), ('u1f468_1f3fb_200d_1f33e.png', [u'\U0001f468\U0001f3fb\u200d\U0001f33e']), ('u1f468_1f3fc_200d_1f33e.png', [u'\U0001f468\U0001f3fc\u200d\U0001f33e']), ('u1f468_1f3fd_200d_1f33e.png', [u'\U0001f468\U0001f3fd\u200d\U0001f33e']), ('u1f468_1f3fe_200d_1f33e.png', [u'\U0001f468\U0001f3fe\u200d\U0001f33e']), ('u1f468_1f3ff_200d_1f33e.png', [u'\U0001f468\U0001f3ff\u200d\U0001f33e']), ]), (None, [ ('u1f469_200d_1f33e.png', [u'\U0001f469\u200d\U0001f33e']), ('u1f469_1f3fb_200d_1f33e.png', [u'\U0001f469\U0001f3fb\u200d\U0001f33e']), ('u1f469_1f3fc_200d_1f33e.png', [u'\U0001f469\U0001f3fc\u200d\U0001f33e']), ('u1f469_1f3fd_200d_1f33e.png', [u'\U0001f469\U0001f3fd\u200d\U0001f33e']), ('u1f469_1f3fe_200d_1f33e.png', [u'\U0001f469\U0001f3fe\u200d\U0001f33e']), ('u1f469_1f3ff_200d_1f33e.png', [u'\U0001f469\U0001f3ff\u200d\U0001f33e']), ]), (None, [ ('u1f468_200d_1f373.png', [u'\U0001f468\u200d\U0001f373']), ('u1f468_1f3fb_200d_1f373.png', [u'\U0001f468\U0001f3fb\u200d\U0001f373']), ('u1f468_1f3fc_200d_1f373.png', [u'\U0001f468\U0001f3fc\u200d\U0001f373']), ('u1f468_1f3fd_200d_1f373.png', [u'\U0001f468\U0001f3fd\u200d\U0001f373']), ('u1f468_1f3fe_200d_1f373.png', [u'\U0001f468\U0001f3fe\u200d\U0001f373']), ('u1f468_1f3ff_200d_1f373.png', [u'\U0001f468\U0001f3ff\u200d\U0001f373']), ]), (None, [ ('u1f469_200d_1f373.png', [u'\U0001f469\u200d\U0001f373']), ('u1f469_1f3fb_200d_1f373.png', [u'\U0001f469\U0001f3fb\u200d\U0001f373']), ('u1f469_1f3fc_200d_1f373.png', [u'\U0001f469\U0001f3fc\u200d\U0001f373']), ('u1f469_1f3fd_200d_1f373.png', [u'\U0001f469\U0001f3fd\u200d\U0001f373']), ('u1f469_1f3fe_200d_1f373.png', [u'\U0001f469\U0001f3fe\u200d\U0001f373']), ('u1f469_1f3ff_200d_1f373.png', [u'\U0001f469\U0001f3ff\u200d\U0001f373']), ]), (None, [ ('u1f468_200d_1f527.png', [u'\U0001f468\u200d\U0001f527']), ('u1f468_1f3fb_200d_1f527.png', [u'\U0001f468\U0001f3fb\u200d\U0001f527']), ('u1f468_1f3fc_200d_1f527.png', [u'\U0001f468\U0001f3fc\u200d\U0001f527']), ('u1f468_1f3fd_200d_1f527.png', [u'\U0001f468\U0001f3fd\u200d\U0001f527']), ('u1f468_1f3fe_200d_1f527.png', [u'\U0001f468\U0001f3fe\u200d\U0001f527']), ('u1f468_1f3ff_200d_1f527.png', [u'\U0001f468\U0001f3ff\u200d\U0001f527']), ]), (None, [ ('u1f469_200d_1f527.png', [u'\U0001f469\u200d\U0001f527']), ('u1f469_1f3fb_200d_1f527.png', [u'\U0001f469\U0001f3fb\u200d\U0001f527']), ('u1f469_1f3fc_200d_1f527.png', [u'\U0001f469\U0001f3fc\u200d\U0001f527']), ('u1f469_1f3fd_200d_1f527.png', [u'\U0001f469\U0001f3fd\u200d\U0001f527']), ('u1f469_1f3fe_200d_1f527.png', [u'\U0001f469\U0001f3fe\u200d\U0001f527']), ('u1f469_1f3ff_200d_1f527.png', [u'\U0001f469\U0001f3ff\u200d\U0001f527']), ]), (None, [ ('u1f468_200d_1f3ed.png', [u'\U0001f468\u200d\U0001f3ed']), ('u1f468_1f3fb_200d_1f3ed.png', [u'\U0001f468\U0001f3fb\u200d\U0001f3ed']), ('u1f468_1f3fc_200d_1f3ed.png', [u'\U0001f468\U0001f3fc\u200d\U0001f3ed']), ('u1f468_1f3fd_200d_1f3ed.png', [u'\U0001f468\U0001f3fd\u200d\U0001f3ed']), ('u1f468_1f3fe_200d_1f3ed.png', [u'\U0001f468\U0001f3fe\u200d\U0001f3ed']), ('u1f468_1f3ff_200d_1f3ed.png', [u'\U0001f468\U0001f3ff\u200d\U0001f3ed']), ]), (None, [ ('u1f469_200d_1f3ed.png', [u'\U0001f469\u200d\U0001f3ed']), ('u1f469_1f3fb_200d_1f3ed.png', [u'\U0001f469\U0001f3fb\u200d\U0001f3ed']), ('u1f469_1f3fc_200d_1f3ed.png', [u'\U0001f469\U0001f3fc\u200d\U0001f3ed']), ('u1f469_1f3fd_200d_1f3ed.png', [u'\U0001f469\U0001f3fd\u200d\U0001f3ed']), ('u1f469_1f3fe_200d_1f3ed.png', [u'\U0001f469\U0001f3fe\u200d\U0001f3ed']), ('u1f469_1f3ff_200d_1f3ed.png', [u'\U0001f469\U0001f3ff\u200d\U0001f3ed']), ]), (None, [ ('u1f468_200d_1f4bc.png', [u'\U0001f468\u200d\U0001f4bc']), ('u1f468_1f3fb_200d_1f4bc.png', [u'\U0001f468\U0001f3fb\u200d\U0001f4bc']), ('u1f468_1f3fc_200d_1f4bc.png', [u'\U0001f468\U0001f3fc\u200d\U0001f4bc']), ('u1f468_1f3fd_200d_1f4bc.png', [u'\U0001f468\U0001f3fd\u200d\U0001f4bc']), ('u1f468_1f3fe_200d_1f4bc.png', [u'\U0001f468\U0001f3fe\u200d\U0001f4bc']), ('u1f468_1f3ff_200d_1f4bc.png', [u'\U0001f468\U0001f3ff\u200d\U0001f4bc']), ]), (None, [ ('u1f469_200d_1f4bc.png', [u'\U0001f469\u200d\U0001f4bc']), ('u1f469_1f3fb_200d_1f4bc.png', [u'\U0001f469\U0001f3fb\u200d\U0001f4bc']), ('u1f469_1f3fc_200d_1f4bc.png', [u'\U0001f469\U0001f3fc\u200d\U0001f4bc']), ('u1f469_1f3fd_200d_1f4bc.png', [u'\U0001f469\U0001f3fd\u200d\U0001f4bc']), ('u1f469_1f3fe_200d_1f4bc.png', [u'\U0001f469\U0001f3fe\u200d\U0001f4bc']), ('u1f469_1f3ff_200d_1f4bc.png', [u'\U0001f469\U0001f3ff\u200d\U0001f4bc']), ]), (None, [ ('u1f468_200d_1f52c.png', [u'\U0001f468\u200d\U0001f52c']), ('u1f468_1f3fb_200d_1f52c.png', [u'\U0001f468\U0001f3fb\u200d\U0001f52c']), ('u1f468_1f3fc_200d_1f52c.png', [u'\U0001f468\U0001f3fc\u200d\U0001f52c']), ('u1f468_1f3fd_200d_1f52c.png', [u'\U0001f468\U0001f3fd\u200d\U0001f52c']), ('u1f468_1f3fe_200d_1f52c.png', [u'\U0001f468\U0001f3fe\u200d\U0001f52c']), ('u1f468_1f3ff_200d_1f52c.png', [u'\U0001f468\U0001f3ff\u200d\U0001f52c']), ]), (None, [ ('u1f469_200d_1f52c.png', [u'\U0001f469\u200d\U0001f52c']), ('u1f469_1f3fb_200d_1f52c.png', [u'\U0001f469\U0001f3fb\u200d\U0001f52c']), ('u1f469_1f3fc_200d_1f52c.png', [u'\U0001f469\U0001f3fc\u200d\U0001f52c']), ('u1f469_1f3fd_200d_1f52c.png', [u'\U0001f469\U0001f3fd\u200d\U0001f52c']), ('u1f469_1f3fe_200d_1f52c.png', [u'\U0001f469\U0001f3fe\u200d\U0001f52c']), ('u1f469_1f3ff_200d_1f52c.png', [u'\U0001f469\U0001f3ff\u200d\U0001f52c']), ]), (None, [ ('u1f468_200d_1f4bb.png', [u'\U0001f468\u200d\U0001f4bb']), ('u1f468_1f3fb_200d_1f4bb.png', [u'\U0001f468\U0001f3fb\u200d\U0001f4bb']), ('u1f468_1f3fc_200d_1f4bb.png', [u'\U0001f468\U0001f3fc\u200d\U0001f4bb']), ('u1f468_1f3fd_200d_1f4bb.png', [u'\U0001f468\U0001f3fd\u200d\U0001f4bb']), ('u1f468_1f3fe_200d_1f4bb.png', [u'\U0001f468\U0001f3fe\u200d\U0001f4bb']), ('u1f468_1f3ff_200d_1f4bb.png', [u'\U0001f468\U0001f3ff\u200d\U0001f4bb']), ]), (None, [ ('u1f469_200d_1f4bb.png', [u'\U0001f469\u200d\U0001f4bb']), ('u1f469_1f3fb_200d_1f4bb.png', [u'\U0001f469\U0001f3fb\u200d\U0001f4bb']), ('u1f469_1f3fc_200d_1f4bb.png', [u'\U0001f469\U0001f3fc\u200d\U0001f4bb']), ('u1f469_1f3fd_200d_1f4bb.png', [u'\U0001f469\U0001f3fd\u200d\U0001f4bb']), ('u1f469_1f3fe_200d_1f4bb.png', [u'\U0001f469\U0001f3fe\u200d\U0001f4bb']), ('u1f469_1f3ff_200d_1f4bb.png', [u'\U0001f469\U0001f3ff\u200d\U0001f4bb']), ]), (None, [ ('u1f468_200d_1f3a4.png', [u'\U0001f468\u200d\U0001f3a4']), ('u1f468_1f3fb_200d_1f3a4.png', [u'\U0001f468\U0001f3fb\u200d\U0001f3a4']), ('u1f468_1f3fc_200d_1f3a4.png', [u'\U0001f468\U0001f3fc\u200d\U0001f3a4']), ('u1f468_1f3fd_200d_1f3a4.png', [u'\U0001f468\U0001f3fd\u200d\U0001f3a4']), ('u1f468_1f3fe_200d_1f3a4.png', [u'\U0001f468\U0001f3fe\u200d\U0001f3a4']), ('u1f468_1f3ff_200d_1f3a4.png', [u'\U0001f468\U0001f3ff\u200d\U0001f3a4']), ]), (None, [ ('u1f469_200d_1f3a4.png', [u'\U0001f469\u200d\U0001f3a4']), ('u1f469_1f3fb_200d_1f3a4.png', [u'\U0001f469\U0001f3fb\u200d\U0001f3a4']), ('u1f469_1f3fc_200d_1f3a4.png', [u'\U0001f469\U0001f3fc\u200d\U0001f3a4']), ('u1f469_1f3fd_200d_1f3a4.png', [u'\U0001f469\U0001f3fd\u200d\U0001f3a4']), ('u1f469_1f3fe_200d_1f3a4.png', [u'\U0001f469\U0001f3fe\u200d\U0001f3a4']), ('u1f469_1f3ff_200d_1f3a4.png', [u'\U0001f469\U0001f3ff\u200d\U0001f3a4']), ]), (None, [ ('u1f468_200d_1f3a8.png', [u'\U0001f468\u200d\U0001f3a8']), ('u1f468_1f3fb_200d_1f3a8.png', [u'\U0001f468\U0001f3fb\u200d\U0001f3a8']), ('u1f468_1f3fc_200d_1f3a8.png', [u'\U0001f468\U0001f3fc\u200d\U0001f3a8']), ('u1f468_1f3fd_200d_1f3a8.png', [u'\U0001f468\U0001f3fd\u200d\U0001f3a8']), ('u1f468_1f3fe_200d_1f3a8.png', [u'\U0001f468\U0001f3fe\u200d\U0001f3a8']), ('u1f468_1f3ff_200d_1f3a8.png', [u'\U0001f468\U0001f3ff\u200d\U0001f3a8']), ]), (None, [ ('u1f469_200d_1f3a8.png', [u'\U0001f469\u200d\U0001f3a8']), ('u1f469_1f3fb_200d_1f3a8.png', [u'\U0001f469\U0001f3fb\u200d\U0001f3a8']), ('u1f469_1f3fc_200d_1f3a8.png', [u'\U0001f469\U0001f3fc\u200d\U0001f3a8']), ('u1f469_1f3fd_200d_1f3a8.png', [u'\U0001f469\U0001f3fd\u200d\U0001f3a8']), ('u1f469_1f3fe_200d_1f3a8.png', [u'\U0001f469\U0001f3fe\u200d\U0001f3a8']), ('u1f469_1f3ff_200d_1f3a8.png', [u'\U0001f469\U0001f3ff\u200d\U0001f3a8']), ]), (None, [ ('u1f468_200d_2708.png', [u'\U0001f468\u200d\u2708']), ('u1f468_1f3fb_200d_2708.png', [u'\U0001f468\U0001f3fb\u200d\u2708']), ('u1f468_1f3fc_200d_2708.png', [u'\U0001f468\U0001f3fc\u200d\u2708']), ('u1f468_1f3fd_200d_2708.png', [u'\U0001f468\U0001f3fd\u200d\u2708']), ('u1f468_1f3fe_200d_2708.png', [u'\U0001f468\U0001f3fe\u200d\u2708']), ('u1f468_1f3ff_200d_2708.png', [u'\U0001f468\U0001f3ff\u200d\u2708']), ]), (None, [ ('u1f469_200d_2708.png', [u'\U0001f469\u200d\u2708']), ('u1f469_1f3fb_200d_2708.png', [u'\U0001f469\U0001f3fb\u200d\u2708']), ('u1f469_1f3fc_200d_2708.png', [u'\U0001f469\U0001f3fc\u200d\u2708']), ('u1f469_1f3fd_200d_2708.png', [u'\U0001f469\U0001f3fd\u200d\u2708']), ('u1f469_1f3fe_200d_2708.png', [u'\U0001f469\U0001f3fe\u200d\u2708']), ('u1f469_1f3ff_200d_2708.png', [u'\U0001f469\U0001f3ff\u200d\u2708']), ]), (None, [ ('u1f468_200d_1f680.png', [u'\U0001f468\u200d\U0001f680']), ('u1f468_1f3fb_200d_1f680.png', [u'\U0001f468\U0001f3fb\u200d\U0001f680']), ('u1f468_1f3fc_200d_1f680.png', [u'\U0001f468\U0001f3fc\u200d\U0001f680']), ('u1f468_1f3fd_200d_1f680.png', [u'\U0001f468\U0001f3fd\u200d\U0001f680']), ('u1f468_1f3fe_200d_1f680.png', [u'\U0001f468\U0001f3fe\u200d\U0001f680']), ('u1f468_1f3ff_200d_1f680.png', [u'\U0001f468\U0001f3ff\u200d\U0001f680']), ]), (None, [ ('u1f469_200d_1f680.png', [u'\U0001f469\u200d\U0001f680']), ('u1f469_1f3fb_200d_1f680.png', [u'\U0001f469\U0001f3fb\u200d\U0001f680']), ('u1f469_1f3fc_200d_1f680.png', [u'\U0001f469\U0001f3fc\u200d\U0001f680']), ('u1f469_1f3fd_200d_1f680.png', [u'\U0001f469\U0001f3fd\u200d\U0001f680']), ('u1f469_1f3fe_200d_1f680.png', [u'\U0001f469\U0001f3fe\u200d\U0001f680']), ('u1f469_1f3ff_200d_1f680.png', [u'\U0001f469\U0001f3ff\u200d\U0001f680']), ]), (None, [ ('u1f468_200d_1f692.png', [u'\U0001f468\u200d\U0001f692']), ('u1f468_1f3fb_200d_1f692.png', [u'\U0001f468\U0001f3fb\u200d\U0001f692']), ('u1f468_1f3fc_200d_1f692.png', [u'\U0001f468\U0001f3fc\u200d\U0001f692']), ('u1f468_1f3fd_200d_1f692.png', [u'\U0001f468\U0001f3fd\u200d\U0001f692']), ('u1f468_1f3fe_200d_1f692.png', [u'\U0001f468\U0001f3fe\u200d\U0001f692']), ('u1f468_1f3ff_200d_1f692.png', [u'\U0001f468\U0001f3ff\u200d\U0001f692']), ]), (None, [ ('u1f469_200d_1f692.png', [u'\U0001f469\u200d\U0001f692']), ('u1f469_1f3fb_200d_1f692.png', [u'\U0001f469\U0001f3fb\u200d\U0001f692']), ('u1f469_1f3fc_200d_1f692.png', [u'\U0001f469\U0001f3fc\u200d\U0001f692']), ('u1f469_1f3fd_200d_1f692.png', [u'\U0001f469\U0001f3fd\u200d\U0001f692']), ('u1f469_1f3fe_200d_1f692.png', [u'\U0001f469\U0001f3fe\u200d\U0001f692']), ('u1f469_1f3ff_200d_1f692.png', [u'\U0001f469\U0001f3ff\u200d\U0001f692']), ]), (None, [ ('u1f46e_200d_2640.png', [u'\U0001f46e\u200d\u2640']), ('u1f46e_1f3fb_200d_2640.png', [u'\U0001f46e\U0001f3fb\u200d\u2640']), ('u1f46e_1f3fc_200d_2640.png', [u'\U0001f46e\U0001f3fc\u200d\u2640']), ('u1f46e_1f3fd_200d_2640.png', [u'\U0001f46e\U0001f3fd\u200d\u2640']), ('u1f46e_1f3fe_200d_2640.png', [u'\U0001f46e\U0001f3fe\u200d\u2640']), ('u1f46e_1f3ff_200d_2640.png', [u'\U0001f46e\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f46e_200d_2642.png', [u'\U0001f46e\u200d\u2642', u'\U0001f46e']), ('u1f46e_1f3fb_200d_2642.png', [u'\U0001f46e\U0001f3fb\u200d\u2642', u'\U0001f46e\U0001f3fb']), ('u1f46e_1f3fc_200d_2642.png', [u'\U0001f46e\U0001f3fc\u200d\u2642', u'\U0001f46e\U0001f3fc']), ('u1f46e_1f3fd_200d_2642.png', [u'\U0001f46e\U0001f3fd\u200d\u2642', u'\U0001f46e\U0001f3fd']), ('u1f46e_1f3fe_200d_2642.png', [u'\U0001f46e\U0001f3fe\u200d\u2642', u'\U0001f46e\U0001f3fe']), ('u1f46e_1f3ff_200d_2642.png', [u'\U0001f46e\U0001f3ff\u200d\u2642', u'\U0001f46e\U0001f3ff']), ]), (None, [ ('u1f575_200d_2640.png', [u'\U0001f575\u200d\u2640']), ('u1f575_1f3fb_200d_2640.png', [u'\U0001f575\U0001f3fb\u200d\u2640']), ('u1f575_1f3fc_200d_2640.png', [u'\U0001f575\U0001f3fc\u200d\u2640']), ('u1f575_1f3fd_200d_2640.png', [u'\U0001f575\U0001f3fd\u200d\u2640']), ('u1f575_1f3fe_200d_2640.png', [u'\U0001f575\U0001f3fe\u200d\u2640']), ('u1f575_1f3ff_200d_2640.png', [u'\U0001f575\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f575_200d_2642.png', [u'\U0001f575\u200d\u2642', u'\U0001f575']), ('u1f575_1f3fb_200d_2642.png', [u'\U0001f575\U0001f3fb\u200d\u2642', u'\U0001f575\U0001f3fb']), ('u1f575_1f3fc_200d_2642.png', [u'\U0001f575\U0001f3fc\u200d\u2642', u'\U0001f575\U0001f3fc']), ('u1f575_1f3fd_200d_2642.png', [u'\U0001f575\U0001f3fd\u200d\u2642', u'\U0001f575\U0001f3fd']), ('u1f575_1f3fe_200d_2642.png', [u'\U0001f575\U0001f3fe\u200d\u2642', u'\U0001f575\U0001f3fe']), ('u1f575_1f3ff_200d_2642.png', [u'\U0001f575\U0001f3ff\u200d\u2642', u'\U0001f575\U0001f3ff']), ]), (None, [ ('u1f482_200d_2640.png', [u'\U0001f482\u200d\u2640']), ('u1f482_1f3fb_200d_2640.png', [u'\U0001f482\U0001f3fb\u200d\u2640']), ('u1f482_1f3fc_200d_2640.png', [u'\U0001f482\U0001f3fc\u200d\u2640']), ('u1f482_1f3fd_200d_2640.png', [u'\U0001f482\U0001f3fd\u200d\u2640']), ('u1f482_1f3fe_200d_2640.png', [u'\U0001f482\U0001f3fe\u200d\u2640']), ('u1f482_1f3ff_200d_2640.png', [u'\U0001f482\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f482_200d_2642.png', [u'\U0001f482\u200d\u2642', u'\U0001f482']), ('u1f482_1f3fb_200d_2642.png', [u'\U0001f482\U0001f3fb\u200d\u2642', u'\U0001f482\U0001f3fb']), ('u1f482_1f3fc_200d_2642.png', [u'\U0001f482\U0001f3fc\u200d\u2642', u'\U0001f482\U0001f3fc']), ('u1f482_1f3fd_200d_2642.png', [u'\U0001f482\U0001f3fd\u200d\u2642', u'\U0001f482\U0001f3fd']), ('u1f482_1f3fe_200d_2642.png', [u'\U0001f482\U0001f3fe\u200d\u2642', u'\U0001f482\U0001f3fe']), ('u1f482_1f3ff_200d_2642.png', [u'\U0001f482\U0001f3ff\u200d\u2642', u'\U0001f482\U0001f3ff']), ]), (None, [ ('u1f477_200d_2640.png', [u'\U0001f477\u200d\u2640']), ('u1f477_1f3fb_200d_2640.png', [u'\U0001f477\U0001f3fb\u200d\u2640']), ('u1f477_1f3fc_200d_2640.png', [u'\U0001f477\U0001f3fc\u200d\u2640']), ('u1f477_1f3fd_200d_2640.png', [u'\U0001f477\U0001f3fd\u200d\u2640']), ('u1f477_1f3fe_200d_2640.png', [u'\U0001f477\U0001f3fe\u200d\u2640']), ('u1f477_1f3ff_200d_2640.png', [u'\U0001f477\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f477_200d_2642.png', [u'\U0001f477\u200d\u2642', u'\U0001f477']), ('u1f477_1f3fb_200d_2642.png', [u'\U0001f477\U0001f3fb\u200d\u2642', u'\U0001f477\U0001f3fb']), ('u1f477_1f3fc_200d_2642.png', [u'\U0001f477\U0001f3fc\u200d\u2642', u'\U0001f477\U0001f3fc']), ('u1f477_1f3fd_200d_2642.png', [u'\U0001f477\U0001f3fd\u200d\u2642', u'\U0001f477\U0001f3fd']), ('u1f477_1f3fe_200d_2642.png', [u'\U0001f477\U0001f3fe\u200d\u2642', u'\U0001f477\U0001f3fe']), ('u1f477_1f3ff_200d_2642.png', [u'\U0001f477\U0001f3ff\u200d\u2642', u'\U0001f477\U0001f3ff']), ]), (None, [ ('u1f934.png', [u'\U0001f934']), ('u1f934_1f3fb.png', [u'\U0001f934\U0001f3fb']), ('u1f934_1f3fc.png', [u'\U0001f934\U0001f3fc']), ('u1f934_1f3fd.png', [u'\U0001f934\U0001f3fd']), ('u1f934_1f3fe.png', [u'\U0001f934\U0001f3fe']), ('u1f934_1f3ff.png', [u'\U0001f934\U0001f3ff']), ]), (None, [ ('u1f478.png', [u'\U0001f478']), ('u1f478_1f3fb.png', [u'\U0001f478\U0001f3fb']), ('u1f478_1f3fc.png', [u'\U0001f478\U0001f3fc']), ('u1f478_1f3fd.png', [u'\U0001f478\U0001f3fd']), ('u1f478_1f3fe.png', [u'\U0001f478\U0001f3fe']), ('u1f478_1f3ff.png', [u'\U0001f478\U0001f3ff']), ]), (None, [ ('u1f473_200d_2640.png', [u'\U0001f473\u200d\u2640']), ('u1f473_1f3fb_200d_2640.png', [u'\U0001f473\U0001f3fb\u200d\u2640']), ('u1f473_1f3fc_200d_2640.png', [u'\U0001f473\U0001f3fc\u200d\u2640']), ('u1f473_1f3fd_200d_2640.png', [u'\U0001f473\U0001f3fd\u200d\u2640']), ('u1f473_1f3fe_200d_2640.png', [u'\U0001f473\U0001f3fe\u200d\u2640']), ('u1f473_1f3ff_200d_2640.png', [u'\U0001f473\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f473_200d_2642.png', [u'\U0001f473\u200d\u2642', u'\U0001f473']), ('u1f473_1f3fb_200d_2642.png', [u'\U0001f473\U0001f3fb\u200d\u2642', u'\U0001f473\U0001f3fb']), ('u1f473_1f3fc_200d_2642.png', [u'\U0001f473\U0001f3fc\u200d\u2642', u'\U0001f473\U0001f3fc']), ('u1f473_1f3fd_200d_2642.png', [u'\U0001f473\U0001f3fd\u200d\u2642', u'\U0001f473\U0001f3fd']), ('u1f473_1f3fe_200d_2642.png', [u'\U0001f473\U0001f3fe\u200d\u2642', u'\U0001f473\U0001f3fe']), ('u1f473_1f3ff_200d_2642.png', [u'\U0001f473\U0001f3ff\u200d\u2642', u'\U0001f473\U0001f3ff']), ]), (None, [ ('u1f472.png', [u'\U0001f472']), ('u1f472_1f3fb.png', [u'\U0001f472\U0001f3fb']), ('u1f472_1f3fc.png', [u'\U0001f472\U0001f3fc']), ('u1f472_1f3fd.png', [u'\U0001f472\U0001f3fd']), ('u1f472_1f3fe.png', [u'\U0001f472\U0001f3fe']), ('u1f472_1f3ff.png', [u'\U0001f472\U0001f3ff']), ]), (None, [ ('u1f471_200d_2640.png', [u'\U0001f471\u200d\u2640']), ('u1f471_1f3fb_200d_2640.png', [u'\U0001f471\U0001f3fb\u200d\u2640']), ('u1f471_1f3fc_200d_2640.png', [u'\U0001f471\U0001f3fc\u200d\u2640']), ('u1f471_1f3fd_200d_2640.png', [u'\U0001f471\U0001f3fd\u200d\u2640']), ('u1f471_1f3fe_200d_2640.png', [u'\U0001f471\U0001f3fe\u200d\u2640']), ('u1f471_1f3ff_200d_2640.png', [u'\U0001f471\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f471_200d_2642.png', [u'\U0001f471\u200d\u2642', u'\U0001f471']), ('u1f471_1f3fb_200d_2642.png', [u'\U0001f471\U0001f3fb\u200d\u2642', u'\U0001f471\U0001f3fb']), ('u1f471_1f3fc_200d_2642.png', [u'\U0001f471\U0001f3fc\u200d\u2642', u'\U0001f471\U0001f3fb']), ('u1f471_1f3fd_200d_2642.png', [u'\U0001f471\U0001f3fd\u200d\u2642', u'\U0001f471\U0001f3fb']), ('u1f471_1f3fe_200d_2642.png', [u'\U0001f471\U0001f3fe\u200d\u2642', u'\U0001f471\U0001f3fb']), ('u1f471_1f3ff_200d_2642.png', [u'\U0001f471\U0001f3ff\u200d\u2642', u'\U0001f471\U0001f3fb']), ]), (None, [ ('u1f935.png', [u'\U0001f935']), ('u1f935_1f3fb.png', [u'\U0001f935\U0001f3fb']), ('u1f935_1f3fc.png', [u'\U0001f935\U0001f3fc']), ('u1f935_1f3fd.png', [u'\U0001f935\U0001f3fd']), ('u1f935_1f3fe.png', [u'\U0001f935\U0001f3fe']), ('u1f935_1f3ff.png', [u'\U0001f935\U0001f3ff']), ]), (None, [ ('u1f470.png', [u'\U0001f470']), ('u1f470_1f3fb.png', [u'\U0001f470\U0001f3fb']), ('u1f470_1f3fc.png', [u'\U0001f470\U0001f3fc']), ('u1f470_1f3fd.png', [u'\U0001f470\U0001f3fd']), ('u1f470_1f3fe.png', [u'\U0001f470\U0001f3fe']), ('u1f470_1f3ff.png', [u'\U0001f470\U0001f3ff']), ]), (None, [ ('u1f930.png', [u'\U0001f930']), ('u1f930_1f3fb.png', [u'\U0001f930\U0001f3fb']), ('u1f930_1f3fc.png', [u'\U0001f930\U0001f3fc']), ('u1f930_1f3fd.png', [u'\U0001f930\U0001f3fd']), ('u1f930_1f3fe.png', [u'\U0001f930\U0001f3fe']), ('u1f930_1f3ff.png', [u'\U0001f930\U0001f3ff']), ]), # subgroup: person-fantasy (None, [ ('u1f47c.png', [u'\U0001f47c']), ('u1f47c_1f3fb.png', [u'\U0001f47c\U0001f3fb']), ('u1f47c_1f3fc.png', [u'\U0001f47c\U0001f3fc']), ('u1f47c_1f3fd.png', [u'\U0001f47c\U0001f3fd']), ('u1f47c_1f3fe.png', [u'\U0001f47c\U0001f3fe']), ('u1f47c_1f3ff.png', [u'\U0001f47c\U0001f3ff']), ]), (None, [ ('u1f385.png', [u'\U0001f385']), ('u1f385_1f3fb.png', [u'\U0001f385\U0001f3fb']), ('u1f385_1f3fc.png', [u'\U0001f385\U0001f3fc']), ('u1f385_1f3fd.png', [u'\U0001f385\U0001f3fd']), ('u1f385_1f3fe.png', [u'\U0001f385\U0001f3fe']), ('u1f385_1f3ff.png', [u'\U0001f385\U0001f3ff']), ]), (None, [ ('u1f936.png', [u'\U0001f936']), ('u1f936_1f3fb.png', [u'\U0001f936\U0001f3fb']), ('u1f936_1f3fc.png', [u'\U0001f936\U0001f3fc']), ('u1f936_1f3fd.png', [u'\U0001f936\U0001f3fd']), ('u1f936_1f3fe.png', [u'\U0001f936\U0001f3fe']), ('u1f936_1f3ff.png', [u'\U0001f936\U0001f3ff']), ]), # subgroup: person-gesture (None, [ ('u1f64d_200d_2640.png', [u'\U0001f64d\u200d\u2640', u'\U0001f64d']), ('u1f64d_1f3fb_200d_2640.png', [u'\U0001f64d\U0001f3fb\u200d\u2640', u'\U0001f64d\U0001f3fb']), ('u1f64d_1f3fc_200d_2640.png', [u'\U0001f64d\U0001f3fc\u200d\u2640', u'\U0001f64d\U0001f3fc']), ('u1f64d_1f3fd_200d_2640.png', [u'\U0001f64d\U0001f3fd\u200d\u2640', u'\U0001f64d\U0001f3fd']), ('u1f64d_1f3fe_200d_2640.png', [u'\U0001f64d\U0001f3fe\u200d\u2640', u'\U0001f64d\U0001f3fe']), ('u1f64d_1f3ff_200d_2640.png', [u'\U0001f64d\U0001f3ff\u200d\u2640', u'\U0001f64d\U0001f3ff']), ]), (None, [ ('u1f64d_200d_2642.png', [u'\U0001f64d\u200d\u2642']), ('u1f64d_1f3fb_200d_2642.png', [u'\U0001f64d\U0001f3fb\u200d\u2642']), ('u1f64d_1f3fc_200d_2642.png', [u'\U0001f64d\U0001f3fc\u200d\u2642']), ('u1f64d_1f3fd_200d_2642.png', [u'\U0001f64d\U0001f3fd\u200d\u2642']), ('u1f64d_1f3fe_200d_2642.png', [u'\U0001f64d\U0001f3fe\u200d\u2642']), ('u1f64d_1f3ff_200d_2642.png', [u'\U0001f64d\U0001f3ff\u200d\u2642']), ]), (None, [ ('u1f64e_200d_2640.png', [u'\U0001f64e\u200d\u2640', u'\U0001f64e']), ('u1f64e_1f3fb_200d_2640.png', [u'\U0001f64e\U0001f3fb\u200d\u2640', u'\U0001f64e\U0001f3fb']), ('u1f64e_1f3fc_200d_2640.png', [u'\U0001f64e\U0001f3fc\u200d\u2640', u'\U0001f64e\U0001f3fc']), ('u1f64e_1f3fd_200d_2640.png', [u'\U0001f64e\U0001f3fd\u200d\u2640', u'\U0001f64e\U0001f3fd']), ('u1f64e_1f3fe_200d_2640.png', [u'\U0001f64e\U0001f3fe\u200d\u2640', u'\U0001f64e\U0001f3fe']), ('u1f64e_1f3ff_200d_2640.png', [u'\U0001f64e\U0001f3ff\u200d\u2640', u'\U0001f64e\U0001f3ff']), ]), (None, [ ('u1f64e_200d_2642.png', [u'\U0001f64e\u200d\u2642']), ('u1f64e_1f3fb_200d_2642.png', [u'\U0001f64e\U0001f3fb\u200d\u2642']), ('u1f64e_1f3fc_200d_2642.png', [u'\U0001f64e\U0001f3fc\u200d\u2642']), ('u1f64e_1f3fd_200d_2642.png', [u'\U0001f64e\U0001f3fd\u200d\u2642']), ('u1f64e_1f3fe_200d_2642.png', [u'\U0001f64e\U0001f3fe\u200d\u2642']), ('u1f64e_1f3ff_200d_2642.png', [u'\U0001f64e\U0001f3ff\u200d\u2642']), ]), (None, [ ('u1f645_200d_2640.png', [u'\U0001f645\u200d\u2640', u'\U0001f645']), ('u1f645_1f3fb_200d_2640.png', [u'\U0001f645\U0001f3fb\u200d\u2640', u'\U0001f645\U0001f3fb']), ('u1f645_1f3fc_200d_2640.png', [u'\U0001f645\U0001f3fc\u200d\u2640', u'\U0001f645\U0001f3fc']), ('u1f645_1f3fd_200d_2640.png', [u'\U0001f645\U0001f3fd\u200d\u2640', u'\U0001f645\U0001f3fd']), ('u1f645_1f3fe_200d_2640.png', [u'\U0001f645\U0001f3fe\u200d\u2640', u'\U0001f645\U0001f3fe']), ('u1f645_1f3ff_200d_2640.png', [u'\U0001f645\U0001f3ff\u200d\u2640', u'\U0001f645\U0001f3ff']), ]), (None, [ ('u1f645_200d_2642.png', [u'\U0001f645\u200d\u2642']), ('u1f645_1f3fb_200d_2642.png', [u'\U0001f645\U0001f3fb\u200d\u2642']), ('u1f645_1f3fc_200d_2642.png', [u'\U0001f645\U0001f3fc\u200d\u2642']), ('u1f645_1f3fd_200d_2642.png', [u'\U0001f645\U0001f3fd\u200d\u2642']), ('u1f645_1f3fe_200d_2642.png', [u'\U0001f645\U0001f3fe\u200d\u2642']), ('u1f645_1f3ff_200d_2642.png', [u'\U0001f645\U0001f3ff\u200d\u2642']), ]), (None, [ ('u1f646_200d_2640.png', [u'\U0001f646\u200d\u2640', u'\U0001f646']), ('u1f646_1f3fb_200d_2640.png', [u'\U0001f646\U0001f3fb\u200d\u2640', u'\U0001f646\U0001f3fb']), ('u1f646_1f3fc_200d_2640.png', [u'\U0001f646\U0001f3fc\u200d\u2640', u'\U0001f646\U0001f3fc']), ('u1f646_1f3fd_200d_2640.png', [u'\U0001f646\U0001f3fd\u200d\u2640', u'\U0001f646\U0001f3fd']), ('u1f646_1f3fe_200d_2640.png', [u'\U0001f646\U0001f3fe\u200d\u2640', u'\U0001f646\U0001f3fe']), ('u1f646_1f3ff_200d_2640.png', [u'\U0001f646\U0001f3ff\u200d\u2640', u'\U0001f646\U0001f3ff']), ]), (None, [ ('u1f646_200d_2642.png', [u'\U0001f646\u200d\u2642']), ('u1f646_1f3fb_200d_2642.png', [u'\U0001f646\U0001f3fb\u200d\u2642']), ('u1f646_1f3fc_200d_2642.png', [u'\U0001f646\U0001f3fc\u200d\u2642']), ('u1f646_1f3fd_200d_2642.png', [u'\U0001f646\U0001f3fd\u200d\u2642']), ('u1f646_1f3fe_200d_2642.png', [u'\U0001f646\U0001f3fe\u200d\u2642']), ('u1f646_1f3ff_200d_2642.png', [u'\U0001f646\U0001f3ff\u200d\u2642']), ]), (None, [ ('u1f481_200d_2640.png', [u'\U0001f481\u200d\u2640', u'\U0001f481']), ('u1f481_1f3fb_200d_2640.png', [u'\U0001f481\U0001f3fb\u200d\u2640', u'\U0001f481\U0001f3fb']), ('u1f481_1f3fc_200d_2640.png', [u'\U0001f481\U0001f3fc\u200d\u2640', u'\U0001f481\U0001f3fc']), ('u1f481_1f3fd_200d_2640.png', [u'\U0001f481\U0001f3fd\u200d\u2640', u'\U0001f481\U0001f3fd']), ('u1f481_1f3fe_200d_2640.png', [u'\U0001f481\U0001f3fe\u200d\u2640', u'\U0001f481\U0001f3fe']), ('u1f481_1f3ff_200d_2640.png', [u'\U0001f481\U0001f3ff\u200d\u2640', u'\U0001f481\U0001f3ff']), ]), (None, [ ('u1f481_200d_2642.png', [u'\U0001f481\u200d\u2642']), ('u1f481_1f3fb_200d_2642.png', [u'\U0001f481\U0001f3fb\u200d\u2642']), ('u1f481_1f3fc_200d_2642.png', [u'\U0001f481\U0001f3fc\u200d\u2642']), ('u1f481_1f3fd_200d_2642.png', [u'\U0001f481\U0001f3fd\u200d\u2642']), ('u1f481_1f3fe_200d_2642.png', [u'\U0001f481\U0001f3fe\u200d\u2642']), ('u1f481_1f3ff_200d_2642.png', [u'\U0001f481\U0001f3ff\u200d\u2642']), ]), (None, [ ('u1f64b_200d_2640.png', [u'\U0001f64b\u200d\u2640', u'\U0001f64b']), ('u1f64b_1f3fb_200d_2640.png', [u'\U0001f64b\U0001f3fb\u200d\u2640', u'\U0001f64b\U0001f3fb']), ('u1f64b_1f3fc_200d_2640.png', [u'\U0001f64b\U0001f3fc\u200d\u2640', u'\U0001f64b\U0001f3fc']), ('u1f64b_1f3fd_200d_2640.png', [u'\U0001f64b\U0001f3fd\u200d\u2640', u'\U0001f64b\U0001f3fd']), ('u1f64b_1f3fe_200d_2640.png', [u'\U0001f64b\U0001f3fe\u200d\u2640', u'\U0001f64b\U0001f3fe']), ('u1f64b_1f3ff_200d_2640.png', [u'\U0001f64b\U0001f3ff\u200d\u2640', u'\U0001f64b\U0001f3ff']), ]), (None, [ ('u1f64b_200d_2642.png', [u'\U0001f64b\u200d\u2642']), ('u1f64b_1f3fb_200d_2642.png', [u'\U0001f64b\U0001f3fb\u200d\u2642']), ('u1f64b_1f3fc_200d_2642.png', [u'\U0001f64b\U0001f3fc\u200d\u2642']), ('u1f64b_1f3fd_200d_2642.png', [u'\U0001f64b\U0001f3fd\u200d\u2642']), ('u1f64b_1f3fe_200d_2642.png', [u'\U0001f64b\U0001f3fe\u200d\u2642']), ('u1f64b_1f3ff_200d_2642.png', [u'\U0001f64b\U0001f3ff\u200d\u2642']), ]), (None, [ ('u1f647_200d_2640.png', [u'\U0001f647\u200d\u2640']), ('u1f647_1f3fb_200d_2640.png', [u'\U0001f647\U0001f3fb\u200d\u2640']), ('u1f647_1f3fc_200d_2640.png', [u'\U0001f647\U0001f3fc\u200d\u2640']), ('u1f647_1f3fd_200d_2640.png', [u'\U0001f647\U0001f3fd\u200d\u2640']), ('u1f647_1f3fe_200d_2640.png', [u'\U0001f647\U0001f3fe\u200d\u2640']), ('u1f647_1f3ff_200d_2640.png', [u'\U0001f647\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f647_200d_2642.png', [u'\U0001f647\u200d\u2642', u'\U0001f647']), ('u1f647_1f3fb_200d_2642.png', [u'\U0001f647\U0001f3fb\u200d\u2642', u'\U0001f647\U0001f3fb']), ('u1f647_1f3fc_200d_2642.png', [u'\U0001f647\U0001f3fc\u200d\u2642', u'\U0001f647\U0001f3fc']), ('u1f647_1f3fd_200d_2642.png', [u'\U0001f647\U0001f3fd\u200d\u2642', u'\U0001f647\U0001f3fd']), ('u1f647_1f3fe_200d_2642.png', [u'\U0001f647\U0001f3fe\u200d\u2642', u'\U0001f647\U0001f3fe']), ('u1f647_1f3ff_200d_2642.png', [u'\U0001f647\U0001f3ff\u200d\u2642', u'\U0001f647\U0001f3ff']), ]), (None, [ ('u1f926_200d_2640.png', [u'\U0001f926\u200d\u2640', u'\U0001f926']), ('u1f926_1f3fb_200d_2640.png', [u'\U0001f926\U0001f3fb\u200d\u2640', u'\U0001f926\U0001f3fb']), ('u1f926_1f3fc_200d_2640.png', [u'\U0001f926\U0001f3fc\u200d\u2640', u'\U0001f926\U0001f3fc']), ('u1f926_1f3fd_200d_2640.png', [u'\U0001f926\U0001f3fd\u200d\u2640', u'\U0001f926\U0001f3fd']), ('u1f926_1f3fe_200d_2640.png', [u'\U0001f926\U0001f3fe\u200d\u2640', u'\U0001f926\U0001f3fe']), ('u1f926_1f3ff_200d_2640.png', [u'\U0001f926\U0001f3ff\u200d\u2640', u'\U0001f926\U0001f3ff']), ]), (None, [ ('u1f926_200d_2642.png', [u'\U0001f926\u200d\u2642']), ('u1f926_1f3fb_200d_2642.png', [u'\U0001f926\U0001f3fb\u200d\u2642']), ('u1f926_1f3fc_200d_2642.png', [u'\U0001f926\U0001f3fc\u200d\u2642']), ('u1f926_1f3fd_200d_2642.png', [u'\U0001f926\U0001f3fd\u200d\u2642']), ('u1f926_1f3fe_200d_2642.png', [u'\U0001f926\U0001f3fe\u200d\u2642']), ('u1f926_1f3ff_200d_2642.png', [u'\U0001f926\U0001f3ff\u200d\u2642']), ]), (None, [ ('u1f937_200d_2640.png', [u'\U0001f937\u200d\u2640', u'\U0001f937']), ('u1f937_1f3fb_200d_2640.png', [u'\U0001f937\U0001f3fb\u200d\u2640', u'\U0001f937\U0001f3fb']), ('u1f937_1f3fc_200d_2640.png', [u'\U0001f937\U0001f3fc\u200d\u2640', u'\U0001f937\U0001f3fc']), ('u1f937_1f3fd_200d_2640.png', [u'\U0001f937\U0001f3fd\u200d\u2640', u'\U0001f937\U0001f3fd']), ('u1f937_1f3fe_200d_2640.png', [u'\U0001f937\U0001f3fe\u200d\u2640', u'\U0001f937\U0001f3fe']), ('u1f937_1f3ff_200d_2640.png', [u'\U0001f937\U0001f3ff\u200d\u2640', u'\U0001f937\U0001f3ff']), ]), (None, [ ('u1f937_200d_2642.png', [u'\U0001f937\u200d\u2642']), ('u1f937_1f3fb_200d_2642.png', [u'\U0001f937\U0001f3fb\u200d\u2642']), ('u1f937_1f3fc_200d_2642.png', [u'\U0001f937\U0001f3fc\u200d\u2642']), ('u1f937_1f3fd_200d_2642.png', [u'\U0001f937\U0001f3fd\u200d\u2642']), ('u1f937_1f3fe_200d_2642.png', [u'\U0001f937\U0001f3fe\u200d\u2642']), ('u1f937_1f3ff_200d_2642.png', [u'\U0001f937\U0001f3ff\u200d\u2642']), ]), # subgroup: person-activity (None, [ ('u1f486_200d_2640.png', [u'\U0001f486\u200d\u2640', u'\U0001f486']), ('u1f486_1f3fb_200d_2640.png', [u'\U0001f486\U0001f3fb\u200d\u2640', u'\U0001f486\U0001f3fb']), ('u1f486_1f3fc_200d_2640.png', [u'\U0001f486\U0001f3fc\u200d\u2640', u'\U0001f486\U0001f3fc']), ('u1f486_1f3fd_200d_2640.png', [u'\U0001f486\U0001f3fd\u200d\u2640', u'\U0001f486\U0001f3fd']), ('u1f486_1f3fe_200d_2640.png', [u'\U0001f486\U0001f3fe\u200d\u2640', u'\U0001f486\U0001f3fe']), ('u1f486_1f3ff_200d_2640.png', [u'\U0001f486\U0001f3ff\u200d\u2640', u'\U0001f486\U0001f3ff']), ]), (None, [ ('u1f486_200d_2642.png', [u'\U0001f486\u200d\u2642']), ('u1f486_1f3fb_200d_2642.png', [u'\U0001f486\U0001f3fb\u200d\u2642']), ('u1f486_1f3fc_200d_2642.png', [u'\U0001f486\U0001f3fc\u200d\u2642']), ('u1f486_1f3fd_200d_2642.png', [u'\U0001f486\U0001f3fd\u200d\u2642']), ('u1f486_1f3fe_200d_2642.png', [u'\U0001f486\U0001f3fe\u200d\u2642']), ('u1f486_1f3ff_200d_2642.png', [u'\U0001f486\U0001f3ff\u200d\u2642']), ]), (None, [ ('u1f487_200d_2640.png', [u'\U0001f487\u200d\u2640', u'\U0001f487']), ('u1f487_1f3fb_200d_2640.png', [u'\U0001f487\U0001f3fb\u200d\u2640', u'\U0001f487\U0001f3fb']), ('u1f487_1f3fc_200d_2640.png', [u'\U0001f487\U0001f3fc\u200d\u2640', u'\U0001f487\U0001f3fd']), ('u1f487_1f3fd_200d_2640.png', [u'\U0001f487\U0001f3fd\u200d\u2640', u'\U0001f487\U0001f3fd']), ('u1f487_1f3fe_200d_2640.png', [u'\U0001f487\U0001f3fe\u200d\u2640', u'\U0001f487\U0001f3fe']), ('u1f487_1f3ff_200d_2640.png', [u'\U0001f487\U0001f3ff\u200d\u2640', u'\U0001f487\U0001f3ff']), ]), (None, [ ('u1f487_200d_2642.png', [u'\U0001f487\u200d\u2642']), ('u1f487_1f3fb_200d_2642.png', [u'\U0001f487\U0001f3fb\u200d\u2642']), ('u1f487_1f3fc_200d_2642.png', [u'\U0001f487\U0001f3fc\u200d\u2642']), ('u1f487_1f3fd_200d_2642.png', [u'\U0001f487\U0001f3fd\u200d\u2642']), ('u1f487_1f3fe_200d_2642.png', [u'\U0001f487\U0001f3fe\u200d\u2642']), ('u1f487_1f3ff_200d_2642.png', [u'\U0001f487\U0001f3ff\u200d\u2642']), ]), (None, [ ('u1f6b6_200d_2640.png', [u'\U0001f6b6\u200d\u2640']), ('u1f6b6_1f3fb_200d_2640.png', [u'\U0001f6b6\U0001f3fb\u200d\u2640']), ('u1f6b6_1f3fc_200d_2640.png', [u'\U0001f6b6\U0001f3fc\u200d\u2640']), ('u1f6b6_1f3fd_200d_2640.png', [u'\U0001f6b6\U0001f3fd\u200d\u2640']), ('u1f6b6_1f3fe_200d_2640.png', [u'\U0001f6b6\U0001f3fe\u200d\u2640']), ('u1f6b6_1f3ff_200d_2640.png', [u'\U0001f6b6\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f6b6_200d_2642.png', [u'\U0001f6b6\u200d\u2642', u'\U0001f6b6']), ('u1f6b6_1f3fb_200d_2642.png', [u'\U0001f6b6\U0001f3fb\u200d\u2642', u'\U0001f6b6\U0001f3fb']), ('u1f6b6_1f3fc_200d_2642.png', [u'\U0001f6b6\U0001f3fc\u200d\u2642', u'\U0001f6b6\U0001f3fc']), ('u1f6b6_1f3fd_200d_2642.png', [u'\U0001f6b6\U0001f3fd\u200d\u2642', u'\U0001f6b6\U0001f3fd']), ('u1f6b6_1f3fe_200d_2642.png', [u'\U0001f6b6\U0001f3fe\u200d\u2642', u'\U0001f6b6\U0001f3fe']), ('u1f6b6_1f3ff_200d_2642.png', [u'\U0001f6b6\U0001f3ff\u200d\u2642', u'\U0001f6b6\U0001f3ff']), ]), (None, [ ('u1f3c3_200d_2640.png', [u'\U0001f3c3\u200d\u2640']), ('u1f3c3_1f3fb_200d_2640.png', [u'\U0001f3c3\U0001f3fb\u200d\u2640']), ('u1f3c3_1f3fc_200d_2640.png', [u'\U0001f3c3\U0001f3fc\u200d\u2640']), ('u1f3c3_1f3fd_200d_2640.png', [u'\U0001f3c3\U0001f3fd\u200d\u2640']), ('u1f3c3_1f3fe_200d_2640.png', [u'\U0001f3c3\U0001f3fe\u200d\u2640']), ('u1f3c3_1f3ff_200d_2640.png', [u'\U0001f3c3\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f3c3_200d_2642.png', [u'\U0001f3c3\u200d\u2642', u'\U0001f3c3']), ('u1f3c3_1f3fb_200d_2642.png', [u'\U0001f3c3\U0001f3fb\u200d\u2642', u'\U0001f3c3\U0001f3fb']), ('u1f3c3_1f3fc_200d_2642.png', [u'\U0001f3c3\U0001f3fc\u200d\u2642', u'\U0001f3c3\U0001f3fc']), ('u1f3c3_1f3fd_200d_2642.png', [u'\U0001f3c3\U0001f3fd\u200d\u2642', u'\U0001f3c3\U0001f3fd']), ('u1f3c3_1f3fe_200d_2642.png', [u'\U0001f3c3\U0001f3fe\u200d\u2642', u'\U0001f3c3\U0001f3fe']), ('u1f3c3_1f3ff_200d_2642.png', [u'\U0001f3c3\U0001f3ff\u200d\u2642', u'\U0001f3c3\U0001f3ff']), ]), (None, [ ('u1f483.png', [u'\U0001f483']), ('u1f483_1f3fb.png', [u'\U0001f483\U0001f3fb']), ('u1f483_1f3fc.png', [u'\U0001f483\U0001f3fc']), ('u1f483_1f3fd.png', [u'\U0001f483\U0001f3fd']), ('u1f483_1f3fe.png', [u'\U0001f483\U0001f3fe']), ('u1f483_1f3ff.png', [u'\U0001f483\U0001f3ff']), ]), (None, [ ('u1f57a.png', [u'\U0001f57a']), ('u1f57a_1f3fb.png', [u'\U0001f57a\U0001f3fb']), ('u1f57a_1f3fc.png', [u'\U0001f57a\U0001f3fc']), ('u1f57a_1f3fd.png', [u'\U0001f57a\U0001f3fd']), ('u1f57a_1f3fe.png', [u'\U0001f57a\U0001f3fe']), ('u1f57a_1f3ff.png', [u'\U0001f57a\U0001f3ff']), ]), ('u1f46f_200d_2640.png', [u'\U0001f46f\u200d\u2640', u'\U0001f46f']), ('u1f46f_200d_2642.png', [u'\U0001f46f\u200d\u2642']), (None, [ ('u1f6c0.png', [u'\U0001f6c0']), ('u1f6c0_1f3fb.png', [u'\U0001f6c0\U0001f3fb']), ('u1f6c0_1f3fc.png', [u'\U0001f6c0\U0001f3fc']), ('u1f6c0_1f3fd.png', [u'\U0001f6c0\U0001f3fd']), ('u1f6c0_1f3fe.png', [u'\U0001f6c0\U0001f3fe']), ('u1f6c0_1f3ff.png', [u'\U0001f6c0\U0001f3ff']), ]), ('u1f6cc.png', [u'\U0001f6cc']), ('u1f574.png', [u'\U0001f574']), ('u1f5e3.png', [u'\U0001f5e3']), ('u1f464.png', [u'\U0001f464']), ('u1f465.png', [u'\U0001f465']), # subgroup: person-sport ('u1f93a.png', [u'\U0001f93a']), ('u1f3c7.png', [u'\U0001f3c7']), ('u26f7.png', [u'\u26f7']), ('u1f3c2.png', [u'\U0001f3c2']), ('u1f3cc_200d_2640.png', [u'\U0001f3cc\u200d\u2640']), ('u1f3cc_200d_2642.png', [u'\U0001f3cc\u200d\u2642', u'\U0001f3cc']), (None, [ ('u1f3c4_200d_2640.png', [u'\U0001f3c4\u200d\u2640']), ('u1f3c4_1f3fb_200d_2640.png', [u'\U0001f3c4\U0001f3fb\u200d\u2640']), ('u1f3c4_1f3fc_200d_2640.png', [u'\U0001f3c4\U0001f3fc\u200d\u2640']), ('u1f3c4_1f3fd_200d_2640.png', [u'\U0001f3c4\U0001f3fd\u200d\u2640']), ('u1f3c4_1f3fe_200d_2640.png', [u'\U0001f3c4\U0001f3fe\u200d\u2640']), ('u1f3c4_1f3ff_200d_2640.png', [u'\U0001f3c4\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f3c4_200d_2642.png', [u'\U0001f3c4\u200d\u2642', u'\U0001f3c4']), ('u1f3c4_1f3fb_200d_2642.png', [u'\U0001f3c4\U0001f3fb\u200d\u2642', u'\U0001f3c4\U0001f3fb']), ('u1f3c4_1f3fc_200d_2642.png', [u'\U0001f3c4\U0001f3fc\u200d\u2642', u'\U0001f3c4\U0001f3fc']), ('u1f3c4_1f3fd_200d_2642.png', [u'\U0001f3c4\U0001f3fd\u200d\u2642', u'\U0001f3c4\U0001f3fd']), ('u1f3c4_1f3fe_200d_2642.png', [u'\U0001f3c4\U0001f3fe\u200d\u2642', u'\U0001f3c4\U0001f3fe']), ('u1f3c4_1f3ff_200d_2642.png', [u'\U0001f3c4\U0001f3ff\u200d\u2642', u'\U0001f3c4\U0001f3ff']), ]), (None, [ ('u1f6a3_200d_2640.png', [u'\U0001f6a3\u200d\u2640']), ('u1f6a3_1f3fb_200d_2640.png', [u'\U0001f6a3\U0001f3fb\u200d\u2640']), ('u1f6a3_1f3fc_200d_2640.png', [u'\U0001f6a3\U0001f3fc\u200d\u2640']), ('u1f6a3_1f3fd_200d_2640.png', [u'\U0001f6a3\U0001f3fd\u200d\u2640']), ('u1f6a3_1f3fe_200d_2640.png', [u'\U0001f6a3\U0001f3fe\u200d\u2640']), ('u1f6a3_1f3ff_200d_2640.png', [u'\U0001f6a3\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f6a3_200d_2642.png', [u'\U0001f6a3\u200d\u2642', u'\U0001f6a3']), ('u1f6a3_1f3fb_200d_2642.png', [u'\U0001f6a3\U0001f3fb\u200d\u2642', u'\U0001f6a3\U0001f3fb']), ('u1f6a3_1f3fc_200d_2642.png', [u'\U0001f6a3\U0001f3fc\u200d\u2642', u'\U0001f6a3\U0001f3fc']), ('u1f6a3_1f3fd_200d_2642.png', [u'\U0001f6a3\U0001f3fd\u200d\u2642', u'\U0001f6a3\U0001f3fd']), ('u1f6a3_1f3fe_200d_2642.png', [u'\U0001f6a3\U0001f3fe\u200d\u2642', u'\U0001f6a3\U0001f3fe']), ('u1f6a3_1f3ff_200d_2642.png', [u'\U0001f6a3\U0001f3ff\u200d\u2642', u'\U0001f6a3\U0001f3ff']), ]), (None, [ ('u1f3ca_200d_2640.png', [u'\U0001f3ca\u200d\u2640']), ('u1f3ca_1f3fb_200d_2640.png', [u'\U0001f3ca\U0001f3fb\u200d\u2640']), ('u1f3ca_1f3fc_200d_2640.png', [u'\U0001f3ca\U0001f3fc\u200d\u2640']), ('u1f3ca_1f3fd_200d_2640.png', [u'\U0001f3ca\U0001f3fd\u200d\u2640']), ('u1f3ca_1f3fe_200d_2640.png', [u'\U0001f3ca\U0001f3fe\u200d\u2640']), ('u1f3ca_1f3ff_200d_2640.png', [u'\U0001f3ca\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f3ca_200d_2642.png', [u'\U0001f3ca\u200d\u2642', u'\U0001f3ca']), ('u1f3ca_1f3fb_200d_2642.png', [u'\U0001f3ca\U0001f3fb\u200d\u2642', u'\U0001f3ca\U0001f3fb']), ('u1f3ca_1f3fc_200d_2642.png', [u'\U0001f3ca\U0001f3fc\u200d\u2642', u'\U0001f3ca\U0001f3fc']), ('u1f3ca_1f3fd_200d_2642.png', [u'\U0001f3ca\U0001f3fd\u200d\u2642', u'\U0001f3ca\U0001f3fd']), ('u1f3ca_1f3fe_200d_2642.png', [u'\U0001f3ca\U0001f3fe\u200d\u2642', u'\U0001f3ca\U0001f3fe']), ('u1f3ca_1f3ff_200d_2642.png', [u'\U0001f3ca\U0001f3ff\u200d\u2642', u'\U0001f3ca\U0001f3ff']), ]), (None, [ ('u26f9_200d_2640.png', [u'\u26f9\u200d\u2640']), ('u26f9_1f3fb_200d_2640.png', [u'\u26f9\U0001f3fb\u200d\u2640']), ('u26f9_1f3fc_200d_2640.png', [u'\u26f9\U0001f3fc\u200d\u2640']), ('u26f9_1f3fd_200d_2640.png', [u'\u26f9\U0001f3fd\u200d\u2640']), ('u26f9_1f3fe_200d_2640.png', [u'\u26f9\U0001f3fe\u200d\u2640']), ('u26f9_1f3ff_200d_2640.png', [u'\u26f9\U0001f3ff\u200d\u2640']), ]), (None, [ ('u26f9_200d_2642.png', [u'\u26f9\u200d\u2642', u'\u26f9']), ('u26f9_1f3fb_200d_2642.png', [u'\u26f9\U0001f3fb\u200d\u2642', u'\u26f9\U0001f3fb']), ('u26f9_1f3fc_200d_2642.png', [u'\u26f9\U0001f3fc\u200d\u2642', u'\u26f9\U0001f3fc']), ('u26f9_1f3fd_200d_2642.png', [u'\u26f9\U0001f3fd\u200d\u2642', u'\u26f9\U0001f3fd']), ('u26f9_1f3fe_200d_2642.png', [u'\u26f9\U0001f3fe\u200d\u2642', u'\u26f9\U0001f3fe']), ('u26f9_1f3ff_200d_2642.png', [u'\u26f9\U0001f3ff\u200d\u2642', u'\u26f9\U0001f3ff']), ]), (None, [ ('u1f3cb_200d_2640.png', [u'\U0001f3cb\u200d\u2640']), ('u1f3cb_1f3fb_200d_2640.png', [u'\U0001f3cb\U0001f3fb\u200d\u2640']), ('u1f3cb_1f3fc_200d_2640.png', [u'\U0001f3cb\U0001f3fc\u200d\u2640']), ('u1f3cb_1f3fd_200d_2640.png', [u'\U0001f3cb\U0001f3fd\u200d\u2640']), ('u1f3cb_1f3fe_200d_2640.png', [u'\U0001f3cb\U0001f3fe\u200d\u2640']), ('u1f3cb_1f3ff_200d_2640.png', [u'\U0001f3cb\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f3cb_200d_2642.png', [u'\U0001f3cb\u200d\u2642', u'\U0001f3cb']), ('u1f3cb_1f3fb_200d_2642.png', [u'\U0001f3cb\U0001f3fb\u200d\u2642', u'\U0001f3cb\U0001f3fb']), ('u1f3cb_1f3fc_200d_2642.png', [u'\U0001f3cb\U0001f3fc\u200d\u2642', u'\U0001f3cb\U0001f3fc']), ('u1f3cb_1f3fd_200d_2642.png', [u'\U0001f3cb\U0001f3fd\u200d\u2642', u'\U0001f3cb\U0001f3fd']), ('u1f3cb_1f3fe_200d_2642.png', [u'\U0001f3cb\U0001f3fe\u200d\u2642', u'\U0001f3cb\U0001f3fe']), ('u1f3cb_1f3ff_200d_2642.png', [u'\U0001f3cb\U0001f3ff\u200d\u2642', u'\U0001f3cb\U0001f3ff']), ]), (None, [ ('u1f6b4_200d_2640.png', [u'\U0001f6b4\u200d\u2640']), ('u1f6b4_1f3fb_200d_2640.png', [u'\U0001f6b4\U0001f3fb\u200d\u2640']), ('u1f6b4_1f3fc_200d_2640.png', [u'\U0001f6b4\U0001f3fc\u200d\u2640']), ('u1f6b4_1f3fd_200d_2640.png', [u'\U0001f6b4\U0001f3fd\u200d\u2640']), ('u1f6b4_1f3fe_200d_2640.png', [u'\U0001f6b4\U0001f3fe\u200d\u2640']), ('u1f6b4_1f3ff_200d_2640.png', [u'\U0001f6b4\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f6b4_200d_2642.png', [u'\U0001f6b4\u200d\u2642', u'\U0001f6b4']), ('u1f6b4_1f3fb_200d_2642.png', [u'\U0001f6b4\U0001f3fb\u200d\u2642', u'\U0001f6b4\U0001f3fb']), ('u1f6b4_1f3fc_200d_2642.png', [u'\U0001f6b4\U0001f3fc\u200d\u2642', u'\U0001f6b4\U0001f3fc']), ('u1f6b4_1f3fd_200d_2642.png', [u'\U0001f6b4\U0001f3fd\u200d\u2642', u'\U0001f6b4\U0001f3fd']), ('u1f6b4_1f3fe_200d_2642.png', [u'\U0001f6b4\U0001f3fe\u200d\u2642', u'\U0001f6b4\U0001f3fe']), ('u1f6b4_1f3ff_200d_2642.png', [u'\U0001f6b4\U0001f3ff\u200d\u2642', u'\U0001f6b4\U0001f3ff']), ]), (None, [ ('u1f6b5_200d_2640.png', [u'\U0001f6b5\u200d\u2640']), ('u1f6b5_1f3fb_200d_2640.png', [u'\U0001f6b5\U0001f3fb\u200d\u2640']), ('u1f6b5_1f3fc_200d_2640.png', [u'\U0001f6b5\U0001f3fc\u200d\u2640']), ('u1f6b5_1f3fd_200d_2640.png', [u'\U0001f6b5\U0001f3fd\u200d\u2640']), ('u1f6b5_1f3fe_200d_2640.png', [u'\U0001f6b5\U0001f3fe\u200d\u2640']), ('u1f6b5_1f3ff_200d_2640.png', [u'\U0001f6b5\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f6b5_200d_2642.png', [u'\U0001f6b5\u200d\u2642', u'\U0001f6b5']), ('u1f6b5_1f3fb_200d_2642.png', [u'\U0001f6b5\U0001f3fb\u200d\u2642', u'\U0001f6b5\U0001f3fb']), ('u1f6b5_1f3fc_200d_2642.png', [u'\U0001f6b5\U0001f3fc\u200d\u2642', u'\U0001f6b5\U0001f3fc']), ('u1f6b5_1f3fd_200d_2642.png', [u'\U0001f6b5\U0001f3fd\u200d\u2642', u'\U0001f6b5\U0001f3fd']), ('u1f6b5_1f3fe_200d_2642.png', [u'\U0001f6b5\U0001f3fe\u200d\u2642', u'\U0001f6b5\U0001f3fe']), ('u1f6b5_1f3ff_200d_2642.png', [u'\U0001f6b5\U0001f3ff\u200d\u2642', u'\U0001f6b5\U0001f3ff']), ]), ('u1f3ce.png', [u'\U0001f3ce']), ('u1f3cd.png', [u'\U0001f3cd']), (None, [ ('u1f938_200d_2640.png', [u'\U0001f938\u200d\u2640']), ('u1f938_1f3fb_200d_2640.png', [u'\U0001f938\U0001f3fb\u200d\u2640']), ('u1f938_1f3fc_200d_2640.png', [u'\U0001f938\U0001f3fc\u200d\u2640']), ('u1f938_1f3fd_200d_2640.png', [u'\U0001f938\U0001f3fd\u200d\u2640']), ('u1f938_1f3fe_200d_2640.png', [u'\U0001f938\U0001f3fe\u200d\u2640']), ('u1f938_1f3ff_200d_2640.png', [u'\U0001f938\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f938_200d_2642.png', [u'\U0001f938\u200d\u2642', u'\U0001f938']), ('u1f938_1f3fb_200d_2642.png', [u'\U0001f938\U0001f3fb\u200d\u2642', u'\U0001f938\U0001f3fb']), ('u1f938_1f3fc_200d_2642.png', [u'\U0001f938\U0001f3fc\u200d\u2642', u'\U0001f938\U0001f3fc']), ('u1f938_1f3fd_200d_2642.png', [u'\U0001f938\U0001f3fd\u200d\u2642', u'\U0001f938\U0001f3fd']), ('u1f938_1f3fe_200d_2642.png', [u'\U0001f938\U0001f3fe\u200d\u2642', u'\U0001f938\U0001f3fe']), ('u1f938_1f3ff_200d_2642.png', [u'\U0001f938\U0001f3ff\u200d\u2642', u'\U0001f938\U0001f3ff']), ]), (None, [ ('u1f93c_200d_2640.png', [u'\U0001f93c\u200d\u2640']), ('u1f93c_1f3fb_200d_2640.png', [u'\U0001f93c\U0001f3fb\u200d\u2640']), ('u1f93c_1f3fc_200d_2640.png', [u'\U0001f93c\U0001f3fc\u200d\u2640']), ('u1f93c_1f3fd_200d_2640.png', [u'\U0001f93c\U0001f3fd\u200d\u2640']), ('u1f93c_1f3fe_200d_2640.png', [u'\U0001f93c\U0001f3fe\u200d\u2640']), ('u1f93c_1f3ff_200d_2640.png', [u'\U0001f93c\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f93c_200d_2642.png', [u'\U0001f93c\u200d\u2642', u'\U0001f93c']), ('u1f93c_1f3fb_200d_2642.png', [u'\U0001f93c\U0001f3fb\u200d\u2642', u'\U0001f93c\U0001f3fb']), ('u1f93c_1f3fc_200d_2642.png', [u'\U0001f93c\U0001f3fc\u200d\u2642', u'\U0001f93c\U0001f3fc']), ('u1f93c_1f3fd_200d_2642.png', [u'\U0001f93c\U0001f3fd\u200d\u2642', u'\U0001f93c\U0001f3fd']), ('u1f93c_1f3fe_200d_2642.png', [u'\U0001f93c\U0001f3fe\u200d\u2642', u'\U0001f93c\U0001f3fe']), ('u1f93c_1f3ff_200d_2642.png', [u'\U0001f93c\U0001f3ff\u200d\u2642', u'\U0001f93c\U0001f3ff']), ]), (None, [ ('u1f93d_200d_2640.png', [u'\U0001f93d\u200d\u2640']), ('u1f93d_1f3fb_200d_2640.png', [u'\U0001f93d\U0001f3fb\u200d\u2640']), ('u1f93d_1f3fc_200d_2640.png', [u'\U0001f93d\U0001f3fc\u200d\u2640']), ('u1f93d_1f3fd_200d_2640.png', [u'\U0001f93d\U0001f3fd\u200d\u2640']), ('u1f93d_1f3fe_200d_2640.png', [u'\U0001f93d\U0001f3fe\u200d\u2640']), ('u1f93d_1f3ff_200d_2640.png', [u'\U0001f93d\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f93d_200d_2642.png', [u'\U0001f93d\u200d\u2642', u'\U0001f93d']), ('u1f93d_1f3fb_200d_2642.png', [u'\U0001f93d\U0001f3fb\u200d\u2642', u'\U0001f93d\U0001f3fb']), ('u1f93d_1f3fc_200d_2642.png', [u'\U0001f93d\U0001f3fc\u200d\u2642', u'\U0001f93d\U0001f3fc']), ('u1f93d_1f3fd_200d_2642.png', [u'\U0001f93d\U0001f3fd\u200d\u2642', u'\U0001f93d\U0001f3fd']), ('u1f93d_1f3fe_200d_2642.png', [u'\U0001f93d\U0001f3fe\u200d\u2642', u'\U0001f93d\U0001f3fe']), ('u1f93d_1f3ff_200d_2642.png', [u'\U0001f93d\U0001f3ff\u200d\u2642', u'\U0001f93d\U0001f3ff']), ]), (None, [ ('u1f93e_200d_2640.png', [u'\U0001f93e\u200d\u2640']), ('u1f93e_1f3fb_200d_2640.png', [u'\U0001f93e\U0001f3fb\u200d\u2640']), ('u1f93e_1f3fc_200d_2640.png', [u'\U0001f93e\U0001f3fc\u200d\u2640']), ('u1f93e_1f3fd_200d_2640.png', [u'\U0001f93e\U0001f3fd\u200d\u2640']), ('u1f93e_1f3fe_200d_2640.png', [u'\U0001f93e\U0001f3fe\u200d\u2640']), ('u1f93e_1f3ff_200d_2640.png', [u'\U0001f93e\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f93e_200d_2642.png', [u'\U0001f93e\u200d\u2642', u'\U0001f93e']), ('u1f93e_1f3fb_200d_2642.png', [u'\U0001f93e\U0001f3fb\u200d\u2642', u'\U0001f93e\U0001f3fb']), ('u1f93e_1f3fc_200d_2642.png', [u'\U0001f93e\U0001f3fc\u200d\u2642', u'\U0001f93e\U0001f3fc']), ('u1f93e_1f3fd_200d_2642.png', [u'\U0001f93e\U0001f3fd\u200d\u2642', u'\U0001f93e\U0001f3fd']), ('u1f93e_1f3fe_200d_2642.png', [u'\U0001f93e\U0001f3fe\u200d\u2642', u'\U0001f93e\U0001f3fe']), ('u1f93e_1f3ff_200d_2642.png', [u'\U0001f93e\U0001f3ff\u200d\u2642', u'\U0001f93e\U0001f3ff']), ]), (None, [ ('u1f939_200d_2640.png', [u'\U0001f939\u200d\u2640']), ('u1f939_1f3fb_200d_2640.png', [u'\U0001f939\U0001f3fb\u200d\u2640']), ('u1f939_1f3fc_200d_2640.png', [u'\U0001f939\U0001f3fc\u200d\u2640']), ('u1f939_1f3fd_200d_2640.png', [u'\U0001f939\U0001f3fd\u200d\u2640']), ('u1f939_1f3fe_200d_2640.png', [u'\U0001f939\U0001f3fe\u200d\u2640']), ('u1f939_1f3ff_200d_2640.png', [u'\U0001f939\U0001f3ff\u200d\u2640']), ]), (None, [ ('u1f939_200d_2642.png', [u'\U0001f939\u200d\u2642', u'\U0001f939']), ('u1f939_1f3fb_200d_2642.png', [u'\U0001f939\U0001f3fb\u200d\u2642', u'\U0001f939\U0001f3fb']), ('u1f939_1f3fc_200d_2642.png', [u'\U0001f939\U0001f3fc\u200d\u2642', u'\U0001f939\U0001f3fc']), ('u1f939_1f3fd_200d_2642.png', [u'\U0001f939\U0001f3fd\u200d\u2642', u'\U0001f939\U0001f3fd']), ('u1f939_1f3fe_200d_2642.png', [u'\U0001f939\U0001f3fe\u200d\u2642', u'\U0001f939\U0001f3fe']), ('u1f939_1f3ff_200d_2642.png', [u'\U0001f939\U0001f3ff\u200d\u2642', u'\U0001f939\U0001f3ff']), ]), # subgroup: family (None, [ ('u1f46b.png', [u'\U0001f46b']), ('u1f46c.png', [u'\U0001f46c']), ('u1f46d.png', [u'\U0001f46d']), ]), (None, [ ('u1f469_200d_2764_200d_1f468.png', [u'\U0001f469\u200d\u2764\u200d\U0001f468']), ('u1f468_200d_2764_200d_1f468.png', [u'\U0001f468\u200d\u2764\u200d\U0001f468']), ('u1f469_200d_2764_200d_1f469.png', [u'\U0001f469\u200d\u2764\u200d\U0001f469']), ]), (None, [ ('u1f469_200d_2764_200d_1f48b_200d_1f468.png', [u'\U0001f469\u200d\u2764\u200d\U0001f48b\u200d\U0001f468']), ('u1f468_200d_2764_200d_1f48b_200d_1f468.png', [u'\U0001f468\u200d\u2764\u200d\U0001f48b\u200d\U0001f468']), ('u1f469_200d_2764_200d_1f48b_200d_1f469.png', [u'\U0001f469\u200d\u2764\u200d\U0001f48b\u200d\U0001f469']), ]), (None, [ ('u1f46a.png', [u'\U0001f46a']), ('u1f468_200d_1f466.png', [u'\U0001f468\u200d\U0001f466']), ('u1f468_200d_1f466_200d_1f466.png', [u'\U0001f468\u200d\U0001f466\u200d\U0001f466']), ('u1f468_200d_1f467.png', [u'\U0001f468\u200d\U0001f467']), ('u1f468_200d_1f467_200d_1f466.png', [u'\U0001f468\u200d\U0001f467\u200d\U0001f466']), ('u1f468_200d_1f467_200d_1f467.png', [u'\U0001f468\u200d\U0001f467\u200d\U0001f467']), ('u1f468_200d_1f468_200d_1f466.png', [u'\U0001f468\u200d\U0001f468\u200d\U0001f466']), ('u1f468_200d_1f468_200d_1f466_200d_1f466.png', [u'\U0001f468\u200d\U0001f468\u200d\U0001f466\u200d\U0001f466']), ('u1f468_200d_1f468_200d_1f467.png', [u'\U0001f468\u200d\U0001f468\u200d\U0001f467']), ('u1f468_200d_1f468_200d_1f467_200d_1f466.png', [u'\U0001f468\u200d\U0001f468\u200d\U0001f467\u200d\U0001f466']), ('u1f468_200d_1f468_200d_1f467_200d_1f467.png', [u'\U0001f468\u200d\U0001f468\u200d\U0001f467\u200d\U0001f467']), ('u1f468_200d_1f469_200d_1f466.png', [u'\U0001f468\u200d\U0001f469\u200d\U0001f466']), ('u1f468_200d_1f469_200d_1f466_200d_1f466.png', [u'\U0001f468\u200d\U0001f469\u200d\U0001f466\u200d\U0001f466']), ('u1f468_200d_1f469_200d_1f467.png', [u'\U0001f468\u200d\U0001f469\u200d\U0001f467']), ('u1f468_200d_1f469_200d_1f467_200d_1f466.png', [u'\U0001f468\u200d\U0001f469\u200d\U0001f467\u200d\U0001f466']), ('u1f468_200d_1f469_200d_1f467_200d_1f467.png', [u'\U0001f468\u200d\U0001f469\u200d\U0001f467\u200d\U0001f467']), ('u1f469_200d_1f466.png', [u'\U0001f469\u200d\U0001f466']), ('u1f469_200d_1f466_200d_1f466.png', [u'\U0001f469\u200d\U0001f466\u200d\U0001f466']), ('u1f469_200d_1f467.png', [u'\U0001f469\u200d\U0001f467']), ('u1f469_200d_1f467_200d_1f466.png', [u'\U0001f469\u200d\U0001f467\u200d\U0001f466']), ('u1f469_200d_1f467_200d_1f467.png', [u'\U0001f469\u200d\U0001f467\u200d\U0001f467']), ('u1f469_200d_1f469_200d_1f466.png', [u'\U0001f469\u200d\U0001f469\u200d\U0001f466']), ('u1f469_200d_1f469_200d_1f466_200d_1f466.png', [u'\U0001f469\u200d\U0001f469\u200d\U0001f466\u200d\U0001f466']), ('u1f469_200d_1f469_200d_1f467.png', [u'\U0001f469\u200d\U0001f469\u200d\U0001f467']), ('u1f469_200d_1f469_200d_1f467_200d_1f466.png', [u'\U0001f469\u200d\U0001f469\u200d\U0001f467\u200d\U0001f466']), ('u1f469_200d_1f469_200d_1f467_200d_1f467.png', [u'\U0001f469\u200d\U0001f469\u200d\U0001f467\u200d\U0001f467']), ]), # subgroup: body (None, [ ('u1f933.png', [u'\U0001f933']), ('u1f933_1f3fb.png', [u'\U0001f933\U0001f3fb']), ('u1f933_1f3fc.png', [u'\U0001f933\U0001f3fc']), ('u1f933_1f3fd.png', [u'\U0001f933\U0001f3fd']), ('u1f933_1f3fe.png', [u'\U0001f933\U0001f3fe']), ('u1f933_1f3ff.png', [u'\U0001f933\U0001f3ff']), ]), (None, [ ('u1f4aa.png', [u'\U0001f4aa']), ('u1f4aa_1f3fb.png', [u'\U0001f4aa\U0001f3fb']), ('u1f4aa_1f3fc.png', [u'\U0001f4aa\U0001f3fc']), ('u1f4aa_1f3fd.png', [u'\U0001f4aa\U0001f3fd']), ('u1f4aa_1f3fe.png', [u'\U0001f4aa\U0001f3fe']), ('u1f4aa_1f3ff.png', [u'\U0001f4aa\U0001f3ff']), ]), (None, [ ('u1f448.png', [u'\U0001f448']), ('u1f448_1f3fb.png', [u'\U0001f448\U0001f3fb']), ('u1f448_1f3fc.png', [u'\U0001f448\U0001f3fc']), ('u1f448_1f3fd.png', [u'\U0001f448\U0001f3fd']), ('u1f448_1f3fe.png', [u'\U0001f448\U0001f3fe']), ('u1f448_1f3ff.png', [u'\U0001f448\U0001f3ff']), ]), (None, [ ('u1f449.png', [u'\U0001f449']), ('u1f449_1f3fb.png', [u'\U0001f449\U0001f3fb']), ('u1f449_1f3fc.png', [u'\U0001f449\U0001f3fc']), ('u1f449_1f3fd.png', [u'\U0001f449\U0001f3fd']), ('u1f449_1f3fe.png', [u'\U0001f449\U0001f3fe']), ('u1f449_1f3ff.png', [u'\U0001f449\U0001f3ff']), ]), (None, [ ('u261d.png', [u'\u261d']), ('u261d_1f3fb.png', [u'\u261d\U0001f3fb']), ('u261d_1f3fc.png', [u'\u261d\U0001f3fc']), ('u261d_1f3fd.png', [u'\u261d\U0001f3fd']), ('u261d_1f3fe.png', [u'\u261d\U0001f3fe']), ('u261d_1f3ff.png', [u'\u261d\U0001f3ff']), ]), (None, [ ('u1f446.png', [u'\U0001f446']), ('u1f446_1f3fb.png', [u'\U0001f446\U0001f3fb']), ('u1f446_1f3fc.png', [u'\U0001f446\U0001f3fc']), ('u1f446_1f3fd.png', [u'\U0001f446\U0001f3fd']), ('u1f446_1f3fe.png', [u'\U0001f446\U0001f3fe']), ('u1f446_1f3ff.png', [u'\U0001f446\U0001f3ff']), ]), (None, [ ('u1f595.png', [u'\U0001f595']), ('u1f595_1f3fb.png', [u'\U0001f595\U0001f3fb']), ('u1f595_1f3fc.png', [u'\U0001f595\U0001f3fc']), ('u1f595_1f3fd.png', [u'\U0001f595\U0001f3fd']), ('u1f595_1f3fe.png', [u'\U0001f595\U0001f3fe']), ('u1f595_1f3ff.png', [u'\U0001f595\U0001f3ff']), ]), (None, [ ('u1f447.png', [u'\U0001f447']), ('u1f447_1f3fb.png', [u'\U0001f447\U0001f3fb']), ('u1f447_1f3fc.png', [u'\U0001f447\U0001f3fc']), ('u1f447_1f3fd.png', [u'\U0001f447\U0001f3fd']), ('u1f447_1f3fe.png', [u'\U0001f447\U0001f3fe']), ('u1f447_1f3ff.png', [u'\U0001f447\U0001f3ff']), ]), (None, [ ('u270c.png', [u'\u270c']), ('u270c_1f3fb.png', [u'\u270c\U0001f3fb']), ('u270c_1f3fc.png', [u'\u270c\U0001f3fc']), ('u270c_1f3fd.png', [u'\u270c\U0001f3fd']), ('u270c_1f3fe.png', [u'\u270c\U0001f3fe']), ('u270c_1f3ff.png', [u'\u270c\U0001f3ff']), ]), (None, [ ('u1f91e.png', [u'\U0001f91e']), ('u1f91e_1f3fb.png', [u'\U0001f91e\U0001f3fb']), ('u1f91e_1f3fc.png', [u'\U0001f91e\U0001f3fc']), ('u1f91e_1f3fd.png', [u'\U0001f91e\U0001f3fd']), ('u1f91e_1f3fe.png', [u'\U0001f91e\U0001f3fe']), ('u1f91e_1f3ff.png', [u'\U0001f91e\U0001f3ff']), ]), (None, [ ('u1f596.png', [u'\U0001f596']), ('u1f596_1f3fb.png', [u'\U0001f596\U0001f3fb']), ('u1f596_1f3fc.png', [u'\U0001f596\U0001f3fc']), ('u1f596_1f3fd.png', [u'\U0001f596\U0001f3fd']), ('u1f596_1f3fe.png', [u'\U0001f596\U0001f3fe']), ('u1f596_1f3ff.png', [u'\U0001f596\U0001f3ff']), ]), (None, [ ('u1f918.png', [u'\U0001f918']), ('u1f918_1f3fb.png', [u'\U0001f918\U0001f3fb']), ('u1f918_1f3fc.png', [u'\U0001f918\U0001f3fc']), ('u1f918_1f3fd.png', [u'\U0001f918\U0001f3fd']), ('u1f918_1f3fe.png', [u'\U0001f918\U0001f3fe']), ('u1f918_1f3ff.png', [u'\U0001f918\U0001f3ff']), ]), (None, [ ('u1f919.png', [u'\U0001f919']), ('u1f919_1f3fb.png', [u'\U0001f919\U0001f3fb']), ('u1f919_1f3fc.png', [u'\U0001f919\U0001f3fc']), ('u1f919_1f3fd.png', [u'\U0001f919\U0001f3fd']), ('u1f919_1f3fe.png', [u'\U0001f919\U0001f3fe']), ('u1f919_1f3ff.png', [u'\U0001f919\U0001f3ff']), ]), (None, [ ('u1f590.png', [u'\U0001f590']), ('u1f590_1f3fb.png', [u'\U0001f590\U0001f3fb']), ('u1f590_1f3fc.png', [u'\U0001f590\U0001f3fc']), ('u1f590_1f3fd.png', [u'\U0001f590\U0001f3fd']), ('u1f590_1f3fe.png', [u'\U0001f590\U0001f3fe']), ('u1f590_1f3ff.png', [u'\U0001f590\U0001f3ff']), ]), (None, [ ('u270b.png', [u'\u270b']), ('u270b_1f3fb.png', [u'\u270b\U0001f3fb']), ('u270b_1f3fc.png', [u'\u270b\U0001f3fc']), ('u270b_1f3fd.png', [u'\u270b\U0001f3fd']), ('u270b_1f3fe.png', [u'\u270b\U0001f3fe']), ('u270b_1f3ff.png', [u'\u270b\U0001f3ff']), ]), (None, [ ('u1f44c.png', [u'\U0001f44c']), ('u1f44c_1f3fb.png', [u'\U0001f44c\U0001f3fb']), ('u1f44c_1f3fc.png', [u'\U0001f44c\U0001f3fc']), ('u1f44c_1f3fd.png', [u'\U0001f44c\U0001f3fd']), ('u1f44c_1f3fe.png', [u'\U0001f44c\U0001f3fe']), ('u1f44c_1f3ff.png', [u'\U0001f44c\U0001f3ff']), ]), (None, [ ('u1f44d.png', [u'\U0001f44d']), ('u1f44d_1f3fb.png', [u'\U0001f44d\U0001f3fb']), ('u1f44d_1f3fc.png', [u'\U0001f44d\U0001f3fc']), ('u1f44d_1f3fd.png', [u'\U0001f44d\U0001f3fd']), ('u1f44d_1f3fe.png', [u'\U0001f44d\U0001f3fe']), ('u1f44d_1f3ff.png', [u'\U0001f44d\U0001f3ff']), ]), (None, [ ('u1f44e.png', [u'\U0001f44e']), ('u1f44e_1f3fb.png', [u'\U0001f44e\U0001f3fb']), ('u1f44e_1f3fc.png', [u'\U0001f44e\U0001f3fc']), ('u1f44e_1f3fd.png', [u'\U0001f44e\U0001f3fd']), ('u1f44e_1f3fe.png', [u'\U0001f44e\U0001f3fe']), ('u1f44e_1f3ff.png', [u'\U0001f44e\U0001f3ff']), ]), (None, [ ('u270a.png', [u'\u270a']), ('u270a_1f3fb.png', [u'\u270a\U0001f3fb']), ('u270a_1f3fc.png', [u'\u270a\U0001f3fc']), ('u270a_1f3fd.png', [u'\u270a\U0001f3fd']), ('u270a_1f3fe.png', [u'\u270a\U0001f3fe']), ('u270a_1f3ff.png', [u'\u270a\U0001f3ff']), ]), (None, [ ('u1f44a.png', [u'\U0001f44a']), ('u1f44a_1f3fb.png', [u'\U0001f44a\U0001f3fb']), ('u1f44a_1f3fc.png', [u'\U0001f44a\U0001f3fc']), ('u1f44a_1f3fd.png', [u'\U0001f44a\U0001f3fd']), ('u1f44a_1f3fe.png', [u'\U0001f44a\U0001f3fe']), ('u1f44a_1f3ff.png', [u'\U0001f44a\U0001f3ff']), ]), (None, [ ('u1f91b.png', [u'\U0001f91b']), ('u1f91b_1f3fb.png', [u'\U0001f91b\U0001f3fb']), ('u1f91b_1f3fc.png', [u'\U0001f91b\U0001f3fc']), ('u1f91b_1f3fd.png', [u'\U0001f91b\U0001f3fd']), ('u1f91b_1f3fe.png', [u'\U0001f91b\U0001f3fe']), ('u1f91b_1f3ff.png', [u'\U0001f91b\U0001f3ff']), ]), (None, [ ('u1f91c.png', [u'\U0001f91c']), ('u1f91c_1f3fb.png', [u'\U0001f91c\U0001f3fb']), ('u1f91c_1f3fc.png', [u'\U0001f91c\U0001f3fc']), ('u1f91c_1f3fd.png', [u'\U0001f91c\U0001f3fd']), ('u1f91c_1f3fe.png', [u'\U0001f91c\U0001f3fe']), ('u1f91c_1f3ff.png', [u'\U0001f91c\U0001f3ff']), ]), (None, [ ('u1f91a.png', [u'\U0001f91a']), ('u1f91a_1f3fb.png', [u'\U0001f91a\U0001f3fb']), ('u1f91a_1f3fc.png', [u'\U0001f91a\U0001f3fc']), ('u1f91a_1f3fd.png', [u'\U0001f91a\U0001f3fd']), ('u1f91a_1f3fe.png', [u'\U0001f91a\U0001f3fe']), ('u1f91a_1f3ff.png', [u'\U0001f91a\U0001f3ff']), ]), (None, [ ('u1f44b.png', [u'\U0001f44b']), ('u1f44b_1f3fb.png', [u'\U0001f44b\U0001f3fb']), ('u1f44b_1f3fc.png', [u'\U0001f44b\U0001f3fc']), ('u1f44b_1f3fd.png', [u'\U0001f44b\U0001f3fd']), ('u1f44b_1f3fe.png', [u'\U0001f44b\U0001f3fe']), ('u1f44b_1f3ff.png', [u'\U0001f44b\U0001f3ff']), ]), (None, [ ('u270d.png', [u'\u270d']), ('u270d_1f3fb.png', [u'\u270d\U0001f3fb']), ('u270d_1f3fc.png', [u'\u270d\U0001f3fc']), ('u270d_1f3fd.png', [u'\u270d\U0001f3fd']), ('u270d_1f3fe.png', [u'\u270d\U0001f3fe']), ('u270d_1f3ff.png', [u'\u270d\U0001f3ff']), ]), (None, [ ('u1f44f.png', [u'\U0001f44f']), ('u1f44f_1f3fb.png', [u'\U0001f44f\U0001f3fb']), ('u1f44f_1f3fc.png', [u'\U0001f44f\U0001f3fc']), ('u1f44f_1f3fd.png', [u'\U0001f44f\U0001f3fd']), ('u1f44f_1f3fe.png', [u'\U0001f44f\U0001f3fe']), ('u1f44f_1f3ff.png', [u'\U0001f44f\U0001f3ff']), ]), (None, [ ('u1f450.png', [u'\U0001f450']), ('u1f450_1f3fb.png', [u'\U0001f450\U0001f3fb']), ('u1f450_1f3fc.png', [u'\U0001f450\U0001f3fc']), ('u1f450_1f3fd.png', [u'\U0001f450\U0001f3fd']), ('u1f450_1f3fe.png', [u'\U0001f450\U0001f3fe']), ('u1f450_1f3ff.png', [u'\U0001f450\U0001f3ff']), ]), (None, [ ('u1f64c.png', [u'\U0001f64c']), ('u1f64c_1f3fb.png', [u'\U0001f64c\U0001f3fb']), ('u1f64c_1f3fc.png', [u'\U0001f64c\U0001f3fc']), ('u1f64c_1f3fd.png', [u'\U0001f64c\U0001f3fd']), ('u1f64c_1f3fe.png', [u'\U0001f64c\U0001f3fe']), ('u1f64c_1f3ff.png', [u'\U0001f64c\U0001f3ff']), ]), (None, [ ('u1f64f.png', [u'\U0001f64f']), ('u1f64f_1f3fb.png', [u'\U0001f64f\U0001f3fb']), ('u1f64f_1f3fc.png', [u'\U0001f64f\U0001f3fc']), ('u1f64f_1f3fd.png', [u'\U0001f64f\U0001f3fd']), ('u1f64f_1f3fe.png', [u'\U0001f64f\U0001f3fe']), ('u1f64f_1f3ff.png', [u'\U0001f64f\U0001f3ff']), ]), (None, [ ('u1f91d.png', [u'\U0001f91d']), ('u1f91d_1f3fb.png', [u'\U0001f91d\U0001f3fb']), ('u1f91d_1f3fc.png', [u'\U0001f91d\U0001f3fc']), ('u1f91d_1f3fd.png', [u'\U0001f91d\U0001f3fd']), ('u1f91d_1f3fe.png', [u'\U0001f91d\U0001f3fe']), ('u1f91d_1f3ff.png', [u'\U0001f91d\U0001f3ff']), ]), (None, [ ('u1f485.png', [u'\U0001f485']), ('u1f485_1f3fb.png', [u'\U0001f485\U0001f3fb']), ('u1f485_1f3fc.png', [u'\U0001f485\U0001f3fc']), ('u1f485_1f3fd.png', [u'\U0001f485\U0001f3fd']), ('u1f485_1f3fe.png', [u'\U0001f485\U0001f3fe']), ('u1f485_1f3ff.png', [u'\U0001f485\U0001f3ff']), ]), (None, [ ('u1f442.png', [u'\U0001f442']), ('u1f442_1f3fb.png', [u'\U0001f442\U0001f3fb']), ('u1f442_1f3fc.png', [u'\U0001f442\U0001f3fc']), ('u1f442_1f3fd.png', [u'\U0001f442\U0001f3fd']), ('u1f442_1f3fe.png', [u'\U0001f442\U0001f3fe']), ('u1f442_1f3ff.png', [u'\U0001f442\U0001f3ff']), ]), (None, [ ('u1f443.png', [u'\U0001f443']), ('u1f443_1f3fb.png', [u'\U0001f443\U0001f3fb']), ('u1f443_1f3fc.png', [u'\U0001f443\U0001f3fc']), ('u1f443_1f3fd.png', [u'\U0001f443\U0001f3fd']), ('u1f443_1f3fe.png', [u'\U0001f443\U0001f3fe']), ('u1f443_1f3ff.png', [u'\U0001f443\U0001f3ff']), ]), ('u1f463.png', [u'\U0001f463']), ('u1f440.png', [u'\U0001f440']), ('u1f441.png', [u'\U0001f441']), ('u1f441_200d_1f5e8.png', [u'\U0001f441\u200d\U0001f5e8']), ('u1f445.png', [u'\U0001f445']), ('u1f444.png', [u'\U0001f444']), # subgroup: emotion ('u1f48b.png', [u'\U0001f48b']), ('u1f498.png', [u'\U0001f498']), ('u2764.png', [u'\u2764']), ('u1f493.png', [u'\U0001f493']), ('u1f494.png', [u'\U0001f494', ':3']), ('u1f42f.png', [u'\U0001f42f']), ('u1f405.png', [u'\U0001f405']), ('u1f406.png', [u'\U0001f406']), ('u1f434.png', [u'\U0001f434']), ('u1f40e.png', [u'\U0001f40e']), ('u1f984.png', [u'\U0001f984']), ('u1f98c.png', [u'\U0001f98c']), ('u1f42e.png', [u'\U0001f42e']), ('u1f402.png', [u'\U0001f402']), ('u1f403.png', [u'\U0001f403']), ('u1f404.png', [u'\U0001f404']), ('u1f437.png', [u'\U0001f437']), ('u1f416.png', [u'\U0001f416']), ('u1f417.png', [u'\U0001f417']), ('u1f43d.png', [u'\U0001f43d']), ('u1f40f.png', [u'\U0001f40f']), ('u1f411.png', [u'\U0001f411']), ('u1f410.png', [u'\U0001f410']), ('u1f42a.png', [u'\U0001f42a']), ('u1f42b.png', [u'\U0001f42b']), ('u1f418.png', [u'\U0001f418']), ('u1f98f.png', [u'\U0001f98f']), ('u1f42d.png', [u'\U0001f42d']), ('u1f401.png', [u'\U0001f401']), ('u1f400.png', [u'\U0001f400']), ('u1f439.png', [u'\U0001f439']), ('u1f430.png', [u'\U0001f430']), ('u1f407.png', [u'\U0001f407']), ('u1f43f.png', [u'\U0001f43f']), ('u1f987.png', [u'\U0001f987']), ('u1f43b.png', [u'\U0001f43b']), ('u1f428.png', [u'\U0001f428']), ('u1f43c.png', [u'\U0001f43c']), ('u1f43e.png', [u'\U0001f43e']), # subgroup: animal-bird ('u1f983.png', [u'\U0001f983']), ('u1f414.png', [u'\U0001f414']), ('u1f413.png', [u'\U0001f413']), ('u1f423.png', [u'\U0001f423']), ('u1f424.png', [u'\U0001f424']), ('u1f425.png', [u'\U0001f425']), ('u1f426.png', [u'\U0001f426']), ('u1f427.png', [u'\U0001f427']), ('u1f54a.png', [u'\U0001f54a']), ('u1f985.png', [u'\U0001f985']), ('u1f986.png', [u'\U0001f986']), ('u1f989.png', [u'\U0001f989']), # subgroup: animal-amphibian ('u1f438.png', [u'\U0001f438']), # subgroup: animal-reptile ('u1f40a.png', [u'\U0001f40a']), ('u1f422.png', [u'\U0001f422']), ('u1f98e.png', [u'\U0001f98e']), ('u1f40d.png', [u'\U0001f40d']), ('u1f432.png', [u'\U0001f432']), ('u1f409.png', [u'\U0001f409']), # subgroup: animal-marine ('u1f433.png', [u'\U0001f433']), ('u1f40b.png', [u'\U0001f40b']), ('u1f42c.png', [u'\U0001f42c']), ('u1f41f.png', [u'\U0001f41f']), ('u1f420.png', [u'\U0001f420']), ('u1f421.png', [u'\U0001f421']), ('u1f988.png', [u'\U0001f988']), ('u1f419.png', [u'\U0001f419']), ('u1f41a.png', [u'\U0001f41a']), ('u1f980.png', [u'\U0001f980']), ('u1f990.png', [u'\U0001f990']), ('u1f991.png', [u'\U0001f991']), # subgroup: animal-bug ('u1f40c.png', [u'\U0001f40c']), ('u1f98b.png', [u'\U0001f98b']), ('u1f41b.png', [u'\U0001f41b']), ('u1f41c.png', [u'\U0001f41c']), ('u1f41d.png', [u'\U0001f41d']), ('u1f41e.png', [u'\U0001f41e']), ('u1f577.png', [u'\U0001f577']), ('u1f578.png', [u'\U0001f578']), ('u1f982.png', [u'\U0001f982']), # subgroup: plant-flower ('u1f490.png', [u'\U0001f490']), ('u1f338.png', [u'\U0001f338']), ('u1f4ae.png', [u'\U0001f4ae']), ('u1f3f5.png', [u'\U0001f3f5']), ('u1f339.png', [u'\U0001f339']), ('u1f940.png', [u'\U0001f940']), ('u1f33a.png', [u'\U0001f33a']), ('u1f33b.png', [u'\U0001f33b']), ('u1f33c.png', [u'\U0001f33c']), ('u1f337.png', [u'\U0001f337']), # subgroup: plant-other ('u1f331.png', [u'\U0001f331']), ('u1f332.png', [u'\U0001f332']), ('u1f333.png', [u'\U0001f333']), ('u1f334.png', [u'\U0001f334']), ('u1f335.png', [u'\U0001f335']), ('u1f33e.png', [u'\U0001f33e']), ('u1f33f.png', [u'\U0001f33f']), ('u2618.png', [u'\u2618']), ('u1f340.png', [u'\U0001f340']), ('u1f341.png', [u'\U0001f341']), ('u1f342.png', [u'\U0001f342']), ('u1f343.png', [u'\U0001f343']), ]), ('Food & Drink', [ # group: Food & Drink ('u1f349.png', None), # Category image # subgroup: food-fruit ('u1f347.png', [u'\U0001f347']), ('u1f348.png', [u'\U0001f348']), ('u1f349.png', [u'\U0001f349']), ('u1f34a.png', [u'\U0001f34a']), ('u1f34b.png', [u'\U0001f34b']), ('u1f34c.png', [u'\U0001f34c']), ('u1f34d.png', [u'\U0001f34d']), ('u1f34e.png', [u'\U0001f34e']), ('u1f34f.png', [u'\U0001f34f']), ('u1f350.png', [u'\U0001f350']), ('u1f351.png', [u'\U0001f351']), ('u1f352.png', [u'\U0001f352']), ('u1f353.png', [u'\U0001f353']), ('u1f95d.png', [u'\U0001f95d']), ('u1f345.png', [u'\U0001f345']), # subgroup: food-vegetable ('u1f951.png', [u'\U0001f951']), ('u1f346.png', [u'\U0001f346']), ('u1f954.png', [u'\U0001f954']), ('u1f955.png', [u'\U0001f955']), ('u1f33d.png', [u'\U0001f33d']), ('u1f336.png', [u'\U0001f336']), ('u1f952.png', [u'\U0001f952']), ('u1f344.png', [u'\U0001f344']), ('u1f95c.png', [u'\U0001f95c']), ('u1f330.png', [u'\U0001f330']), # subgroup: food-prepared ('u1f35e.png', [u'\U0001f35e']), ('u1f950.png', [u'\U0001f950']), ('u1f956.png', [u'\U0001f956']), ('u1f95e.png', [u'\U0001f95e']), ('u1f9c0.png', [u'\U0001f9c0']), ('u1f356.png', [u'\U0001f356']), ('u1f357.png', [u'\U0001f357']), ('u1f953.png', [u'\U0001f953']), ('u1f354.png', [u'\U0001f354']), ('u1f35f.png', [u'\U0001f35f']), ('u1f355.png', [u'\U0001f355']), ('u1f32d.png', [u'\U0001f32d']), ('u1f32e.png', [u'\U0001f32e']), ('u1f32f.png', [u'\U0001f32f']), ('u1f959.png', [u'\U0001f959']), ('u1f95a.png', [u'\U0001f95a']), ('u1f373.png', [u'\U0001f373']), ('u1f958.png', [u'\U0001f958']), ('u1f372.png', [u'\U0001f372']), ('u1f957.png', [u'\U0001f957']), ('u1f37f.png', [u'\U0001f37f']), # subgroup: food-asian ('u1f371.png', [u'\U0001f371']), ('u1f358.png', [u'\U0001f358']), ('u1f359.png', [u'\U0001f359']), ('u1f35a.png', [u'\U0001f35a']), ('u1f35b.png', [u'\U0001f35b']), ('u1f35c.png', [u'\U0001f35c']), ('u1f35d.png', [u'\U0001f35d']), ('u1f360.png', [u'\U0001f360']), ('u1f362.png', [u'\U0001f362']), ('u1f363.png', [u'\U0001f363']), ('u1f364.png', [u'\U0001f364']), ('u1f365.png', [u'\U0001f365']), ('u1f361.png', [u'\U0001f361']), # subgroup: food-sweet ('u1f366.png', [u'\U0001f366']), ('u1f367.png', [u'\U0001f367']), ('u1f368.png', [u'\U0001f368']), ('u1f369.png', [u'\U0001f369']), ('u1f36a.png', [u'\U0001f36a']), ('u1f382.png', [u'\U0001f382']), ('u1f370.png', [u'\U0001f370']), ('u1f36b.png', [u'\U0001f36b']), ('u1f36c.png', [u'\U0001f36c']), ('u1f36d.png', [u'\U0001f36d']), ('u1f36e.png', [u'\U0001f36e']), ('u1f36f.png', [u'\U0001f36f']), # subgroup: drink ('u1f37c.png', [u'\U0001f37c']), ('u1f95b.png', [u'\U0001f95b']), ('u2615.png', [u'\u2615']), ('u1f375.png', [u'\U0001f375']), ('u1f376.png', [u'\U0001f376']), ('u1f37e.png', [u'\U0001f37e']), ('u1f377.png', [u'\U0001f377']), ('u1f378.png', [u'\U0001f378']), ('u1f379.png', [u'\U0001f379']), ('u1f37a.png', [u'\U0001f37a']), ('u1f37b.png', [u'\U0001f37b']), ('u1f942.png', [u'\U0001f942']), ('u1f943.png', [u'\U0001f943']), # subgroup: dishware ('u1f37d.png', [u'\U0001f37d']), ('u1f374.png', [u'\U0001f374']), ('u1f944.png', [u'\U0001f944']), ('u1f52a.png', [u'\U0001f52a']), ('u1f3fa.png', [u'\U0001f3fa']), ]), ('Travel & Places', [ # group: Travel & Places ('u2708.png', None), # Category image # subgroup: place-map ('u1f30d.png', [u'\U0001f30d']), ('u1f30e.png', [u'\U0001f30e']), ('u1f30f.png', [u'\U0001f30f']), ('u1f310.png', [u'\U0001f310']), ('u1f5fa.png', [u'\U0001f5fa']), ('u1f5fe.png', [u'\U0001f5fe']), # subgroup: place-geographic ('u1f3d4.png', [u'\U0001f3d4']), ('u26f0.png', [u'\u26f0']), ('u1f30b.png', [u'\U0001f30b']), ('u1f5fb.png', [u'\U0001f5fb']), ('u1f3d5.png', [u'\U0001f3d5']), ('u1f3d6.png', [u'\U0001f3d6']), ('u1f3dc.png', [u'\U0001f3dc']), ('u1f3dd.png', [u'\U0001f3dd']), ('u1f3de.png', [u'\U0001f3de']), # subgroup: place-building ('u1f3df.png', [u'\U0001f3df']), ('u1f3db.png', [u'\U0001f3db']), ('u1f3d7.png', [u'\U0001f3d7']), ('u1f3d8.png', [u'\U0001f3d8']), ('u1f3d9.png', [u'\U0001f3d9']), ('u1f3da.png', [u'\U0001f3da']), ('u1f3e0.png', [u'\U0001f3e0']), ('u1f3e1.png', [u'\U0001f3e1']), ('u1f3e2.png', [u'\U0001f3e2']), ('u1f3e3.png', [u'\U0001f3e3']), ('u1f3e4.png', [u'\U0001f3e4']), ('u1f3e5.png', [u'\U0001f3e5']), ('u1f3e6.png', [u'\U0001f3e6']), ('u1f3e8.png', [u'\U0001f3e8']), ('u1f3e9.png', [u'\U0001f3e9']), ('u1f3ea.png', [u'\U0001f3ea']), ('u1f3eb.png', [u'\U0001f3eb']), ('u1f3ec.png', [u'\U0001f3ec']), ('u1f3ed.png', [u'\U0001f3ed']), ('u1f3ef.png', [u'\U0001f3ef']), ('u1f3f0.png', [u'\U0001f3f0']), ('u1f492.png', [u'\U0001f492']), ('u1f5fc.png', [u'\U0001f5fc']), ('u1f5fd.png', [u'\U0001f5fd']), # subgroup: place-religious ('u26ea.png', [u'\u26ea']), ('u1f54c.png', [u'\U0001f54c']), ('u1f54d.png', [u'\U0001f54d']), ('u26e9.png', [u'\u26e9']), ('u1f54b.png', [u'\U0001f54b']), # subgroup: place-other ('u26f2.png', [u'\u26f2']), ('u26fa.png', [u'\u26fa']), ('u1f301.png', [u'\U0001f301']), ('u1f303.png', [u'\U0001f303']), ('u1f304.png', [u'\U0001f304']), ('u1f305.png', [u'\U0001f305']), ('u1f306.png', [u'\U0001f306']), ('u1f307.png', [u'\U0001f307']), ('u1f309.png', [u'\U0001f309']), ('u2668.png', [u'\u2668']), ('u1f30c.png', [u'\U0001f30c']), ('u1f3a0.png', [u'\U0001f3a0']), ('u1f3a1.png', [u'\U0001f3a1']), ('u1f3a2.png', [u'\U0001f3a2']), ('u1f488.png', [u'\U0001f488']), ('u1f3aa.png', [u'\U0001f3aa']), ('u1f3ad.png', [u'\U0001f3ad']), ('u1f5bc.png', [u'\U0001f5bc']), ('u1f3a8.png', [u'\U0001f3a8']), ('u1f3b0.png', [u'\U0001f3b0']), # subgroup: transport-ground ('u1f682.png', [u'\U0001f682']), ('u1f683.png', [u'\U0001f683']), ('u1f684.png', [u'\U0001f684']), ('u1f685.png', [u'\U0001f685']), ('u1f686.png', [u'\U0001f686']), ('u1f687.png', [u'\U0001f687']), ('u1f688.png', [u'\U0001f688']), ('u1f689.png', [u'\U0001f689']), ('u1f68a.png', [u'\U0001f68a']), ('u1f69d.png', [u'\U0001f69d']), ('u1f69e.png', [u'\U0001f69e']), ('u1f68b.png', [u'\U0001f68b']), ('u1f68c.png', [u'\U0001f68c']), ('u1f68d.png', [u'\U0001f68d']), ('u1f68e.png', [u'\U0001f68e']), ('u1f690.png', [u'\U0001f690']), ('u1f691.png', [u'\U0001f691']), ('u1f692.png', [u'\U0001f692']), ('u1f693.png', [u'\U0001f693']), ('u1f694.png', [u'\U0001f694']), ('u1f695.png', [u'\U0001f695']), ('u1f696.png', [u'\U0001f696']), ('u1f697.png', [u'\U0001f697']), ('u1f698.png', [u'\U0001f698']), ('u1f699.png', [u'\U0001f699']), ('u1f69a.png', [u'\U0001f69a']), ('u1f69b.png', [u'\U0001f69b']), ('u1f69c.png', [u'\U0001f69c']), ('u1f6b2.png', [u'\U0001f6b2']), ('u1f6f4.png', [u'\U0001f6f4']), ('u1f6f5.png', [u'\U0001f6f5']), ('u1f68f.png', [u'\U0001f68f']), ('u1f6e3.png', [u'\U0001f6e3']), ('u1f6e4.png', [u'\U0001f6e4']), ('u26fd.png', [u'\u26fd']), ('u1f6a8.png', [u'\U0001f6a8']), ('u1f6a5.png', [u'\U0001f6a5']), ('u1f6a6.png', [u'\U0001f6a6']), ('u1f6a7.png', [u'\U0001f6a7']), ('u1f6d1.png', [u'\U0001f6d1']), # subgroup: transport-water ('u2693.png', [u'\u2693']), ('u26f5.png', [u'\u26f5']), ('u1f6f6.png', [u'\U0001f6f6']), ('u1f6a4.png', [u'\U0001f6a4']), ('u1f6f3.png', [u'\U0001f6f3']), ('u26f4.png', [u'\u26f4']), ('u1f6e5.png', [u'\U0001f6e5']), ('u1f6a2.png', [u'\U0001f6a2']), # subgroup: transport-air ('u2708.png', [u'\u2708']), ('u1f6e9.png', [u'\U0001f6e9']), ('u1f6eb.png', [u'\U0001f6eb']), ('u1f6ec.png', [u'\U0001f6ec']), ('u1f4ba.png', [u'\U0001f4ba']), ('u1f681.png', [u'\U0001f681']), ('u1f69f.png', [u'\U0001f69f']), ('u1f6a0.png', [u'\U0001f6a0']), ('u1f6a1.png', [u'\U0001f6a1']), ('u1f6f0.png', [u'\U0001f6f0']), ('u1f680.png', [u'\U0001f680']), # subgroup: hotel ('u1f6ce.png', [u'\U0001f6ce']), ('u1f6aa.png', [u'\U0001f6aa']), ('u1f6cf.png', [u'\U0001f6cf']), ('u1f6cb.png', [u'\U0001f6cb']), ('u1f6bd.png', [u'\U0001f6bd']), ('u1f6bf.png', [u'\U0001f6bf']), ('u1f6c1.png', [u'\U0001f6c1']), # subgroup: time ('u231b.png', [u'\u231b']), ('u23f3.png', [u'\u23f3']), ('u231a.png', [u'\u231a']), ('u23f0.png', [u'\u23f0']), ('u23f1.png', [u'\u23f1']), ('u23f2.png', [u'\u23f2']), ('u1f570.png', [u'\U0001f570']), (None, [ ('u1f55b.png', [u'\U0001f55b']), ('u1f567.png', [u'\U0001f567']), ('u1f550.png', [u'\U0001f550']), ('u1f55c.png', [u'\U0001f55c']), ('u1f551.png', [u'\U0001f551']), ('u1f55d.png', [u'\U0001f55d']), ('u1f552.png', [u'\U0001f552']), ('u1f55e.png', [u'\U0001f55e']), ('u1f553.png', [u'\U0001f553']), ('u1f55f.png', [u'\U0001f55f']), ('u1f554.png', [u'\U0001f554']), ('u1f560.png', [u'\U0001f560']), ('u1f555.png', [u'\U0001f555']), ('u1f561.png', [u'\U0001f561']), ('u1f556.png', [u'\U0001f556']), ('u1f562.png', [u'\U0001f562']), ('u1f557.png', [u'\U0001f557']), ('u1f563.png', [u'\U0001f563']), ('u1f558.png', [u'\U0001f558']), ('u1f564.png', [u'\U0001f564']), ('u1f559.png', [u'\U0001f559']), ('u1f565.png', [u'\U0001f565']), ('u1f55a.png', [u'\U0001f55a']), ('u1f566.png', [u'\U0001f566']), ]), # subgroup: sky & weather ('u1f311.png', [u'\U0001f311']), ('u1f312.png', [u'\U0001f312']), ('u1f313.png', [u'\U0001f313']), ('u1f314.png', [u'\U0001f314']), ('u1f315.png', [u'\U0001f315']), ('u1f316.png', [u'\U0001f316']), ('u1f317.png', [u'\U0001f317']), ('u1f318.png', [u'\U0001f318']), ('u1f319.png', [u'\U0001f319']), ('u1f31a.png', [u'\U0001f31a']), ('u1f31b.png', [u'\U0001f31b']), ('u1f31c.png', [u'\U0001f31c']), ('u1f321.png', [u'\U0001f321']), ('u2600.png', [u'\u2600']), ('u1f31d.png', [u'\U0001f31d']), ('u1f31e.png', [u'\U0001f31e']), ('u2b50.png', [u'\u2b50']), ('u1f31f.png', [u'\U0001f31f']), ('u1f320.png', [u'\U0001f320']), ('u2601.png', [u'\u2601']), ('u26c5.png', [u'\u26c5']), ('u26c8.png', [u'\u26c8']), ('u1f324.png', [u'\U0001f324']), ('u1f325.png', [u'\U0001f325']), ('u1f326.png', [u'\U0001f326']), ('u1f327.png', [u'\U0001f327']), ('u1f328.png', [u'\U0001f328']), ('u1f329.png', [u'\U0001f329']), ('u1f32a.png', [u'\U0001f32a']), ('u1f32b.png', [u'\U0001f32b']), ('u1f32c.png', [u'\U0001f32c']), ('u1f300.png', [u'\U0001f300']), ('u1f308.png', [u'\U0001f308']), ('u1f302.png', [u'\U0001f302']), ('u2602.png', [u'\u2602']), ('u2614.png', [u'\u2614']), ('u26f1.png', [u'\u26f1']), ('u26a1.png', [u'\u26a1']), ('u2744.png', [u'\u2744']), ('u2603.png', [u'\u2603']), ('u26c4.png', [u'\u26c4']), ('u2604.png', [u'\u2604']), ('u1f525.png', [u'\U0001f525']), ('u1f4a7.png', [u'\U0001f4a7']), ('u1f30a.png', [u'\U0001f30a']), ]), ('Activity', [ # group: Activities ('u26bd.png', None), # Category image # subgroup: event ('u1f383.png', [u'\U0001f383']), ('u1f384.png', [u'\U0001f384']), ('u1f386.png', [u'\U0001f386']), ('u1f387.png', [u'\U0001f387']), ('u2728.png', [u'\u2728']), ('u1f388.png', [u'\U0001f388']), ('u1f389.png', [u'\U0001f389']), ('u1f38a.png', [u'\U0001f38a']), ('u1f38b.png', [u'\U0001f38b']), ('u1f38d.png', [u'\U0001f38d']), ('u1f38e.png', [u'\U0001f38e']), ('u1f38f.png', [u'\U0001f38f']), ('u1f390.png', [u'\U0001f390']), ('u1f391.png', [u'\U0001f391']), ('u1f380.png', [u'\U0001f380']), ('u1f381.png', [u'\U0001f381']), ('u1f397.png', [u'\U0001f397']), ('u1f39f.png', [u'\U0001f39f']), ('u1f3ab.png', [u'\U0001f3ab']), # subgroup: award-medal ('u1f396.png', [u'\U0001f396']), ('u1f3c6.png', [u'\U0001f3c6']), ('u1f3c5.png', [u'\U0001f3c5']), ('u1f947.png', [u'\U0001f947']), ('u1f948.png', [u'\U0001f948']), ('u1f949.png', [u'\U0001f949']), # subgroup: sport ('u26bd.png', [u'\u26bd']), ('u26be.png', [u'\u26be']), ('u1f3c0.png', [u'\U0001f3c0']), ('u1f3d0.png', [u'\U0001f3d0']), ('u1f3c8.png', [u'\U0001f3c8']), ('u1f3c9.png', [u'\U0001f3c9']), ('u1f3be.png', [u'\U0001f3be']), ('u1f3b1.png', [u'\U0001f3b1']), ('u1f3b3.png', [u'\U0001f3b3']), ('u1f3cf.png', [u'\U0001f3cf']), ('u1f3d1.png', [u'\U0001f3d1']), ('u1f3d2.png', [u'\U0001f3d2']), ('u1f3d3.png', [u'\U0001f3d3']), ('u1f3f8.png', [u'\U0001f3f8']), ('u1f94a.png', [u'\U0001f94a']), ('u1f94b.png', [u'\U0001f94b']), ('u1f945.png', [u'\U0001f945']), ('u1f3af.png', [u'\U0001f3af']), ('u26f3.png', [u'\u26f3']), ('u26f8.png', [u'\u26f8']), ('u1f3a3.png', [u'\U0001f3a3']), ('u1f3bd.png', [u'\U0001f3bd']), ('u1f3bf.png', [u'\U0001f3bf']), # subgroup: game ('u1f3ae.png', [u'\U0001f3ae']), ('u1f579.png', [u'\U0001f579']), ('u1f3b2.png', [u'\U0001f3b2']), ('u2660.png', [u'\u2660']), ('u2665.png', [u'\u2665']), ('u2666.png', [u'\u2666']), ('u2663.png', [u'\u2663']), ('u1f0cf.png', [u'\U0001f0cf']), ('u1f004.png', [u'\U0001f004']), ('u1f3b4.png', [u'\U0001f3b4']), ]), ('Objects', [ # group: Objects ('u1f3a7.png', None), # Category image # subgroup: sound ('u1f507.png', [u'\U0001f507']), ('u1f508.png', [u'\U0001f508']), ('u1f509.png', [u'\U0001f509']), ('u1f50a.png', [u'\U0001f50a']), ('u1f4e2.png', [u'\U0001f4e2']), ('u1f4e3.png', [u'\U0001f4e3']), ('u1f4ef.png', [u'\U0001f4ef']), ('u1f514.png', [u'\U0001f514']), ('u1f515.png', [u'\U0001f515']), # subgroup: music ('u1f3bc.png', [u'\U0001f3bc']), ('u1f3b5.png', [u'\U0001f3b5']), ('u1f3b6.png', [u'\U0001f3b6']), ('u1f399.png', [u'\U0001f399']), ('u1f39a.png', [u'\U0001f39a']), ('u1f39b.png', [u'\U0001f39b']), ('u1f3a4.png', [u'\U0001f3a4']), ('u1f3a7.png', [u'\U0001f3a7']), ('u1f4fb.png', [u'\U0001f4fb']), # subgroup: musical-instrument ('u1f3b7.png', [u'\U0001f3b7']), ('u1f3b8.png', [u'\U0001f3b8']), ('u1f3b9.png', [u'\U0001f3b9']), ('u1f3ba.png', [u'\U0001f3ba']), ('u1f3bb.png', [u'\U0001f3bb']), ('u1f941.png', [u'\U0001f941']), # subgroup: phone ('u1f4f1.png', [u'\U0001f4f1']), ('u1f4f2.png', [u'\U0001f4f2']), ('u260e.png', [u'\u260e']), ('u1f4de.png', [u'\U0001f4de']), ('u1f4df.png', [u'\U0001f4df']), ('u1f4e0.png', [u'\U0001f4e0']), # subgroup: computer ('u1f50b.png', [u'\U0001f50b']), ('u1f50c.png', [u'\U0001f50c']), ('u1f4bb.png', [u'\U0001f4bb']), ('u1f5a5.png', [u'\U0001f5a5']), ('u1f5a8.png', [u'\U0001f5a8']), ('u2328.png', [u'\u2328']), ('u1f5b1.png', [u'\U0001f5b1']), ('u1f5b2.png', [u'\U0001f5b2']), ('u1f4bd.png', [u'\U0001f4bd']), ('u1f4be.png', [u'\U0001f4be']), ('u1f4bf.png', [u'\U0001f4bf']), ('u1f4c0.png', [u'\U0001f4c0']), # subgroup: light & video ('u1f3a5.png', [u'\U0001f3a5']), ('u1f39e.png', [u'\U0001f39e']), ('u1f4fd.png', [u'\U0001f4fd']), ('u1f3ac.png', [u'\U0001f3ac']), ('u1f4fa.png', [u'\U0001f4fa']), ('u1f4f7.png', [u'\U0001f4f7']), ('u1f4f8.png', [u'\U0001f4f8']), ('u1f4f9.png', [u'\U0001f4f9']), ('u1f4fc.png', [u'\U0001f4fc']), ('u1f50d.png', [u'\U0001f50d']), ('u1f50e.png', [u'\U0001f50e']), ('u1f52c.png', [u'\U0001f52c']), ('u1f52d.png', [u'\U0001f52d']), ('u1f4e1.png', [u'\U0001f4e1']), ('u1f56f.png', [u'\U0001f56f']), ('u1f4a1.png', [u'\U0001f4a1']), ('u1f526.png', [u'\U0001f526']), ('u1f3ee.png', [u'\U0001f3ee']), # subgroup: book-paper ('u1f4d4.png', [u'\U0001f4d4']), ('u1f4d5.png', [u'\U0001f4d5']), ('u1f4d6.png', [u'\U0001f4d6']), ('u1f4d7.png', [u'\U0001f4d7']), ('u1f4d8.png', [u'\U0001f4d8']), ('u1f4d9.png', [u'\U0001f4d9']), ('u1f4da.png', [u'\U0001f4da']), ('u1f4d3.png', [u'\U0001f4d3']), ('u1f4d2.png', [u'\U0001f4d2']), ('u1f4c3.png', [u'\U0001f4c3']), ('u1f4dc.png', [u'\U0001f4dc']), ('u1f4c4.png', [u'\U0001f4c4']), ('u1f4f0.png', [u'\U0001f4f0']), ('u1f5de.png', [u'\U0001f5de']), ('u1f4d1.png', [u'\U0001f4d1']), ('u1f516.png', [u'\U0001f516']), ('u1f3f7.png', [u'\U0001f3f7']), # subgroup: money ('u1f4b0.png', [u'\U0001f4b0']), ('u1f4b4.png', [u'\U0001f4b4']), ('u1f4b5.png', [u'\U0001f4b5']), ('u1f4b6.png', [u'\U0001f4b6']), ('u1f4b7.png', [u'\U0001f4b7']), ('u1f4b8.png', [u'\U0001f4b8']), ('u1f4b3.png', [u'\U0001f4b3']), ('u1f4b9.png', [u'\U0001f4b9']), ('u1f4b1.png', [u'\U0001f4b1']), ('u1f4b2.png', [u'\U0001f4b2']), # subgroup: mail ('u2709.png', [u'\u2709']), ('u1f4e7.png', [u'\U0001f4e7']), ('u1f4e8.png', [u'\U0001f4e8']), ('u1f4e9.png', [u'\U0001f4e9']), ('u1f4e4.png', [u'\U0001f4e4']), ('u1f4e5.png', [u'\U0001f4e5']), ('u1f4e6.png', [u'\U0001f4e6']), ('u1f4eb.png', [u'\U0001f4eb']), ('u1f4ea.png', [u'\U0001f4ea']), ('u1f4ec.png', [u'\U0001f4ec']), ('u1f4ed.png', [u'\U0001f4ed']), ('u1f4ee.png', [u'\U0001f4ee']), ('u1f5f3.png', [u'\U0001f5f3']), # subgroup: writing ('u270f.png', [u'\u270f']), ('u2712.png', [u'\u2712']), ('u1f58b.png', [u'\U0001f58b']), ('u1f58a.png', [u'\U0001f58a']), ('u1f58c.png', [u'\U0001f58c']), ('u1f58d.png', [u'\U0001f58d']), ('u1f4dd.png', [u'\U0001f4dd']), # subgroup: office ('u1f4bc.png', [u'\U0001f4bc']), ('u1f4c1.png', [u'\U0001f4c1']), ('u1f4c2.png', [u'\U0001f4c2']), ('u1f5c2.png', [u'\U0001f5c2']), ('u1f4c5.png', [u'\U0001f4c5']), ('u1f4c6.png', [u'\U0001f4c6']), ('u1f5d2.png', [u'\U0001f5d2']), ('u1f5d3.png', [u'\U0001f5d3']), ('u1f4c7.png', [u'\U0001f4c7']), ('u1f4c8.png', [u'\U0001f4c8']), ('u1f4c9.png', [u'\U0001f4c9']), ('u1f4ca.png', [u'\U0001f4ca']), ('u1f4cb.png', [u'\U0001f4cb']), ('u1f4cc.png', [u'\U0001f4cc']), ('u1f4cd.png', [u'\U0001f4cd']), ('u1f4ce.png', [u'\U0001f4ce']), ('u1f587.png', [u'\U0001f587']), ('u1f4cf.png', [u'\U0001f4cf']), ('u1f4d0.png', [u'\U0001f4d0']), ('u2702.png', [u'\u2702']), ('u1f5c3.png', [u'\U0001f5c3']), ('u1f5c4.png', [u'\U0001f5c4']), ('u1f5d1.png', [u'\U0001f5d1']), # subgroup: lock ('u1f512.png', [u'\U0001f512']), ('u1f513.png', [u'\U0001f513']), ('u1f50f.png', [u'\U0001f50f']), ('u1f510.png', [u'\U0001f510']), ('u1f511.png', [u'\U0001f511']), ('u1f5dd.png', [u'\U0001f5dd']), # subgroup: tool ('u1f528.png', [u'\U0001f528']), ('u26cf.png', [u'\u26cf']), ('u2692.png', [u'\u2692']), ('u1f6e0.png', [u'\U0001f6e0']), ('u1f5e1.png', [u'\U0001f5e1']), ('u2694.png', [u'\u2694']), ('u1f52b.png', [u'\U0001f52b']), ('u1f3f9.png', [u'\U0001f3f9']), ('u1f6e1.png', [u'\U0001f6e1']), ('u1f527.png', [u'\U0001f527']), ('u1f529.png', [u'\U0001f529']), ('u2699.png', [u'\u2699']), ('u1f5dc.png', [u'\U0001f5dc']), ('u2697.png', [u'\u2697']), ('u2696.png', [u'\u2696']), ('u1f517.png', [u'\U0001f517']), ('u26d3.png', [u'\u26d3']), # subgroup: medical ('u1f489.png', [u'\U0001f489']), ('u1f48a.png', [u'\U0001f48a']), # subgroup: other-object ('u1f6ac.png', [u'\U0001f6ac']), ('u26b0.png', [u'\u26b0']), ('u26b1.png', [u'\u26b1']), ('u1f5ff.png', [u'\U0001f5ff']), ('u1f6e2.png', [u'\U0001f6e2']), ('u1f52e.png', [u'\U0001f52e']), ('u1f6d2.png', [u'\U0001f6d2']), ]), ('Symbols', [ # group: Symbols ('u262f.png', None), # Category image # subgroup: transport-sign ('u1f3e7.png', [u'\U0001f3e7']), ('u1f6ae.png', [u'\U0001f6ae']), ('u1f6b0.png', [u'\U0001f6b0']), ('u267f.png', [u'\u267f']), ('u1f6b9.png', [u'\U0001f6b9']), ('u1f6ba.png', [u'\U0001f6ba']), ('u1f6bb.png', [u'\U0001f6bb']), ('u1f6bc.png', [u'\U0001f6bc']), ('u1f6be.png', [u'\U0001f6be']), ('u1f6c2.png', [u'\U0001f6c2']), ('u1f6c3.png', [u'\U0001f6c3']), ('u1f6c4.png', [u'\U0001f6c4']), ('u1f6c5.png', [u'\U0001f6c5']), # subgroup: warning ('u26a0.png', [u'\u26a0']), ('u1f6b8.png', [u'\U0001f6b8']), ('u26d4.png', [u'\u26d4']), ('u1f6ab.png', [u'\U0001f6ab']), ('u1f6b3.png', [u'\U0001f6b3']), ('u1f6ad.png', [u'\U0001f6ad']), ('u1f6af.png', [u'\U0001f6af']), ('u1f6b1.png', [u'\U0001f6b1']), ('u1f6b7.png', [u'\U0001f6b7']), ('u1f4f5.png', [u'\U0001f4f5']), ('u1f51e.png', [u'\U0001f51e']), ('u2622.png', [u'\u2622']), ('u2623.png', [u'\u2623']), # subgroup: arrow ('u2b06.png', [u'\u2b06']), ('u2197.png', [u'\u2197']), ('u27a1.png', [u'\u27a1']), ('u2198.png', [u'\u2198']), ('u2b07.png', [u'\u2b07']), ('u2199.png', [u'\u2199']), ('u2b05.png', [u'\u2b05']), ('u2196.png', [u'\u2196']), ('u2195.png', [u'\u2195']), ('u2194.png', [u'\u2194']), ('u21a9.png', [u'\u21a9']), ('u21aa.png', [u'\u21aa']), ('u2934.png', [u'\u2934']), ('u2935.png', [u'\u2935']), ('u1f503.png', [u'\U0001f503']), ('u1f504.png', [u'\U0001f504']), ('u1f519.png', [u'\U0001f519']), ('u1f51a.png', [u'\U0001f51a']), ('u1f51b.png', [u'\U0001f51b']), ('u1f51c.png', [u'\U0001f51c']), ('u1f51d.png', [u'\U0001f51d']), # subgroup: religion ('u1f6d0.png', [u'\U0001f6d0']), ('u269b.png', [u'\u269b']), ('u1f549.png', [u'\U0001f549']), ('u2721.png', [u'\u2721']), ('u2638.png', [u'\u2638']), ('u262f.png', [u'\u262f']), ('u271d.png', [u'\u271d']), ('u2626.png', [u'\u2626']), ('u262a.png', [u'\u262a']), ('u262e.png', [u'\u262e']), ('u1f54e.png', [u'\U0001f54e']), ('u1f52f.png', [u'\U0001f52f']), # subgroup: zodiac ('u2648.png', [u'\u2648']), ('u2649.png', [u'\u2649']), ('u264a.png', [u'\u264a']), ('u264b.png', [u'\u264b']), ('u264c.png', [u'\u264c']), ('u264d.png', [u'\u264d']), ('u264e.png', [u'\u264e']), ('u264f.png', [u'\u264f']), ('u2650.png', [u'\u2650']), ('u2651.png', [u'\u2651']), ('u2652.png', [u'\u2652']), ('u2653.png', [u'\u2653']), ('u26ce.png', [u'\u26ce']), # subgroup: av-symbol ('u1f500.png', [u'\U0001f500']), ('u1f501.png', [u'\U0001f501']), ('u1f502.png', [u'\U0001f502']), ('u25b6.png', [u'\u25b6']), ('u23e9.png', [u'\u23e9']), ('u23ed.png', [u'\u23ed']), ('u23ef.png', [u'\u23ef']), ('u25c0.png', [u'\u25c0']), ('u23ea.png', [u'\u23ea']), ('u23ee.png', [u'\u23ee']), ('u1f53c.png', [u'\U0001f53c']), ('u23eb.png', [u'\u23eb']), ('u1f53d.png', [u'\U0001f53d']), ('u23ec.png', [u'\u23ec']), ('u23f8.png', [u'\u23f8']), ('u23f9.png', [u'\u23f9']), ('u23fa.png', [u'\u23fa']), ('u23cf.png', [u'\u23cf']), ('u1f3a6.png', [u'\U0001f3a6']), ('u1f505.png', [u'\U0001f505']), ('u1f506.png', [u'\U0001f506']), ('u1f4f6.png', [u'\U0001f4f6']), ('u1f4f3.png', [u'\U0001f4f3']), ('u1f4f4.png', [u'\U0001f4f4']), # subgroup: other-symbol ('u2640.png', [u'\u2640']), ('u2642.png', [u'\u2642']), ('u2695.png', [u'\u2695']), ('u267b.png', [u'\u267b']), ('u269c.png', [u'\u269c']), ('u1f531.png', [u'\U0001f531']), ('u1f4db.png', [u'\U0001f4db']), ('u1f530.png', [u'\U0001f530']), ('u2b55.png', [u'\u2b55']), ('u2705.png', [u'\u2705']), ('u2611.png', [u'\u2611']), ('u2714.png', [u'\u2714']), ('u2716.png', [u'\u2716']), ('u274c.png', [u'\u274c']), ('u274e.png', [u'\u274e']), ('u2795.png', [u'\u2795']), ('u2796.png', [u'\u2796']), ('u2797.png', [u'\u2797']), ('u27b0.png', [u'\u27b0']), ('u27bf.png', [u'\u27bf']), ('u303d.png', [u'\u303d']), ('u2733.png', [u'\u2733']), ('u2734.png', [u'\u2734']), ('u2747.png', [u'\u2747']), ('u203c.png', [u'\u203c']), ('u2049.png', [u'\u2049']), ('u2753.png', [u'\u2753']), ('u2754.png', [u'\u2754']), ('u2755.png', [u'\u2755']), ('u2757.png', [u'\u2757']), ('u3030.png', [u'\u3030']), ('u00a9.png', [u'\xa9']), ('u00ae.png', [u'\xae']), ('u2122.png', [u'\u2122']), # subgroup: keycap (None, [ ('u0023_20e3.png', [u'\x23\u20e3']), ('u002a_20e3.png', [u'\x2a\u20e3']), ('u0030_20e3.png', [u'\x30\u20e3']), ('u0031_20e3.png', [u'\x31\u20e3']), ('u0032_20e3.png', [u'\x32\u20e3']), ('u0033_20e3.png', [u'\x33\u20e3']), ('u0034_20e3.png', [u'\x34\u20e3']), ('u0035_20e3.png', [u'\x35\u20e3']), ('u0036_20e3.png', [u'\x36\u20e3']), ('u0037_20e3.png', [u'\x37\u20e3']), ('u0038_20e3.png', [u'\x38\u20e3']), ('u0039_20e3.png', [u'\x39\u20e3']), ('u1f51f.png', [u'\U0001f51f']), ]), # subgroup: alphanum ('u1f4af.png', [u'\U0001f4af']), ('u1f520.png', [u'\U0001f520']), ('u1f521.png', [u'\U0001f521']), ('u1f522.png', [u'\U0001f522']), ('u1f523.png', [u'\U0001f523']), ('u1f524.png', [u'\U0001f524']), ('u1f170.png', [u'\U0001f170']), ('u1f18e.png', [u'\U0001f18e']), ('u1f171.png', [u'\U0001f171']), ('u1f191.png', [u'\U0001f191']), ('u1f192.png', [u'\U0001f192']), ('u1f193.png', [u'\U0001f193']), ('u2139.png', [u'\u2139']), ('u1f194.png', [u'\U0001f194']), ('u24c2.png', [u'\u24c2']), ('u1f195.png', [u'\U0001f195']), ('u1f196.png', [u'\U0001f196']), ('u1f17e.png', [u'\U0001f17e']), ('u1f197.png', [u'\U0001f197']), ('u1f17f.png', [u'\U0001f17f']), ('u1f198.png', [u'\U0001f198']), ('u1f199.png', [u'\U0001f199']), ('u1f19a.png', [u'\U0001f19a']), ('u1f201.png', [u'\U0001f201']), ('u1f202.png', [u'\U0001f202']), ('u1f237.png', [u'\U0001f237']), ('u1f236.png', [u'\U0001f236']), ('u1f22f.png', [u'\U0001f22f']), ('u1f250.png', [u'\U0001f250']), ('u1f239.png', [u'\U0001f239']), ('u1f21a.png', [u'\U0001f21a']), ('u1f232.png', [u'\U0001f232']), ('u1f251.png', [u'\U0001f251']), ('u1f238.png', [u'\U0001f238']), ('u1f234.png', [u'\U0001f234']), ('u1f233.png', [u'\U0001f233']), ('u3297.png', [u'\u3297']), ('u3299.png', [u'\u3299']), ('u1f23a.png', [u'\U0001f23a']), ('u1f235.png', [u'\U0001f235']), # subgroup: geometric ('u25aa.png', [u'\u25aa']), ('u25ab.png', [u'\u25ab']), ('u25fb.png', [u'\u25fb']), ('u25fc.png', [u'\u25fc']), ('u25fd.png', [u'\u25fd']), ('u25fe.png', [u'\u25fe']), ('u2b1b.png', [u'\u2b1b']), ('u2b1c.png', [u'\u2b1c']), ('u1f536.png', [u'\U0001f536']), ('u1f537.png', [u'\U0001f537']), ('u1f538.png', [u'\U0001f538']), ('u1f539.png', [u'\U0001f539']), ('u1f53a.png', [u'\U0001f53a']), ('u1f53b.png', [u'\U0001f53b']), ('u1f4a0.png', [u'\U0001f4a0']), ('u1f518.png', [u'\U0001f518']), ('u1f532.png', [u'\U0001f532']), ('u1f533.png', [u'\U0001f533']), ('u26aa.png', [u'\u26aa']), ('u26ab.png', [u'\u26ab']), ('u1f534.png', [u'\U0001f534']), ('u1f535.png', [u'\U0001f535']), ]), ('Flags', [ # group: Flags ('u1f3f4.png', None), # Category image # subgroup: country-flag ('u1f3c1.png', [u'\U0001f3c1']), ('u1f6a9.png', [u'\U0001f6a9']), ('u1f38c.png', [u'\U0001f38c']), ('u1f3f4.png', [u'\U0001f3f4']), ('u1f3f3.png', [u'\U0001f3f3']), # subgroup: country-flag ('u1f1e8_1f1f3.png', [u'\U0001f1e8\U0001f1f3']), ('u1f1e9_1f1ea.png', [u'\U0001f1e9\U0001f1ea']), ('u1f1ea_1f1f8.png', [u'\U0001f1ea\U0001f1f8']), ('u1f1eb_1f1f7.png', [u'\U0001f1eb\U0001f1f7']), ('u1f1ec_1f1e7.png', [u'\U0001f1ec\U0001f1e7']), ('u1f1ee_1f1f9.png', [u'\U0001f1ee\U0001f1f9']), ('u1f1ef_1f1f5.png', [u'\U0001f1ef\U0001f1f5']), ('u1f1f0_1f1f7.png', [u'\U0001f1f0\U0001f1f7']), ('u1f1f7_1f1fa.png', [u'\U0001f1f7\U0001f1fa']), ('u1f1fa_1f1f8.png', [u'\U0001f1fa\U0001f1f8']), ]),]) if __name__ == '__main__': from PIL import Image import sys import os width = 24 height = 24 count = 2200 columns = 20 atlas_width = columns * width atlas_height = (count / columns) * height emoticon_atlas = Image.new("RGBA", (atlas_width, int(atlas_height))) column_position = 0 height_position = 0 for category in emoticons: if not emoticons[category]: continue for filename, codepoint in emoticons[category]: if not filename: # We have an emoticon with a modifier for mod_filename, mod_codepoint in codepoint: path = os.path.join('png', mod_filename) image = Image.open(path) emoticon_atlas.paste( image, (column_position, height_position)) if column_position == (atlas_width - width): height_position += height column_position = 0 else: column_position += width else: path = os.path.join('png', filename) image = Image.open(path) emoticon_atlas.paste( image, (column_position, height_position)) if column_position == (atlas_width - width): height_position += height column_position = 0 else: column_position += width emoticon_atlas.save('emoticons.png') print('Finished Successful!') gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/png/000077500000000000000000000000001326020644600304445ustar00rootroot00000000000000u0023.png000066400000000000000000000005621326020644600316470ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d)IDATH퓽JQITS vvO"E )wҨAS5cW׽uKivc0^ˊ$G: o} $n`[Z;.~ߖcS)v8wE+nW !]g:$f^"*w3[ h 5`߱! Sggj 5`;cyp 4=`#10 ]K3m0!OL 3K0_ Z^6^sǮ2_kˮԠG_uSIENDB`u0023_20e3.png000066400000000000000000000012021326020644600323700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d9IDATH=kQsgvg7F Ѩ$c!6و6k{@6/$$H!~D 5$& ${ﱘuvƝqY/ }9=3G3=( t*Q;3FaK1z߈v-lMqQm跳}אQ@>ߟ9yL< ~Wn ף3 8 7Vۗ|<~kQ:0p`}fH[Yk8\ R[WΟvO,S"B+m󷭿Զ;P2 H͹Hwn-u@--dAmnG\x4Շʣ8idI5x1"#MFf03ts3SjCw7q[̚"b$܉hHOQv4aP :)4 vv]lVؗGsmr57!JBKq}:UZ5?TY(pלQ$p6|k zERm'\+6t}v7 DIENDB`u002a.png000066400000000000000000000006001326020644600317160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d7IDATH픿+aƟpXŢ&bP;Ŭ,fɢDf~nbq~ I~v<9ZhzX)Icv_|bѼ_ 0Bg.7]n=ynW@.x;pFr L}pJ"J+pB XI"DC*.~\B^J*xQґ=3Ϫ~ 32C In_KZwTFK/ 6]u_ٚ@W2=nьzlTR o4/4 YRjtЌxg5]IENDB`u002a_20e3.png000066400000000000000000000012651326020644600324570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dlIDATHOSq?R!5A5N c܌n&.F18 /őVJ[[[pK=qs~#Xy 1/WkpL$Nyݟ6a ) !O@,@حk39 &.~zn  :DZ[e$@fb]{ UX! o¬q`"pX:s8C0qX6|=z"ȑǔ7@S{wwCN#'A`w@7MG@/;lV 3FХR n".B(!E/Fљhc)6?-[Oų^1RD -@!;;y ;%GcL6x }ɚ||MOyBt /6n~.-(O{ ɻAX;vi*jh.*GY6;gW X2g)b˿Y ܄W*sFP'U3 _ dibIvݽ0`ʜIENDB`u0030.png000066400000000000000000000005461326020644600316470ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH픱JAEbaTZvA jeawK~@@P0Jb'6!"h<6Gvwf hݽofkY &iY@ҽLd!OoMV7aA@ʁ.p] ?A~ Z[p*7YJE绡1^|a?13_s;ZБDJ4π`xrA}f F%>Q >*'P/bD!@MҶ뎤[3#ǩp"msEIENDB`u0030_20e3.png000066400000000000000000000012201326020644600323660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dGIDATHkQɶն-m%TD 'o Ѓ"vr-ԉ00 3x%G?dtlLϣ<Ao9fbJ /ft1g"o{m<$pJ~N9r97k@#ZbB2v'Y[6נkIA>}O۷(;ffɎH24ݚb0%&,7pmF`vˀIFd %{*N>(Czb |J Ҥi:"06᧫L+.'WT^uY[,<U@^c2'=d2fgƋpRjH!T`RWh!pmmD[oNս̾P(|+\i =B_ս܂r G»1>϶IENDB`u0031.png000066400000000000000000000003501326020644600316410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH픱 @ E`jZZb:6 [P0+$GA$(R^oa+XӈzqՍSls9K`>5F~bDC?oD-ԣZ}ӺRc>rˈҀ{"y"΀AjR~ WayQIENDB`u0031_20e3.png000066400000000000000000000006271326020644600324010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dNIDATH핿JP&Mh:S)`AE|>(ҎNE' q?hJRL7?p?'#nCP Ty6bG=fA (E~/nn!e"=X([ SA3e:fT1[":ޖR=G3{| B&~&@CjW #KVTgDtK.{?"ɭ# b.S|OӝS*(!9vA8õdEBWЉC( QL֜4:@8hȏ qLABCkJq4IENDB`u0032.png000066400000000000000000000004701326020644600316450ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH퓡JQ&``m +Vb"h1(VLc*Xroq_s{N8O6҆zV?<\#oӌ|A7^yC`ԝ3Ł:RI2]%Cp'}RuQonI ^)qCF>DguF~;;p|Fe/>8_b9Gnъ.jjҽm>?y:IENDB`u0032_20e3.png000066400000000000000000000011111326020644600323670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkQ?vR+hcE?AQI œGE,x *hK5?1wN;}ovp좇+tL̬ EBJSyx-!k&\˙@& kH2|0v -LG {39 A&Oёv>~EQ ;+7Xcw{[h\ݯHctzzo-GL~~7Pj]S(wHnfXxLC\n9.݇j} C$wUl~蹵@ps 2:el6jK)LKiV[FƦwb!j<>C6km8A ?,"yb6ލV-&:Kq<:?Ʋ L{EWКq >A=欠7)d4636Tm2HGP|Cɰ8+IENDB`u0033.png000066400000000000000000000005151326020644600316460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHԿ.Q!+ ^$*DP h.D%D%\AOacw ٷ<3;sd?gXCZ>٭%r,}\a)_^q]AhvN:?\%H9'I2zy` /nJ0UPb#\a?*Ir[rl[ fx X!]lèG #(s $+/t1ѷ Lbw9 FV ^ +hnMKIENDB`u0033_20e3.png000066400000000000000000000012021326020644600323710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d9IDATHOSQs[ʠh&ԄA!q1.H98 4ar@ F#$j_h{qxνs){r dBaZc*0S){?) Hfn5arەvVT$3äQD-}ANSvkH'1x˒!ztpσHIk1ĵ$ߍh- --nbf@uF@x?t1Q@"}8rqk! fp 6w]~@"뉃Kw:r[30dr-n:[7mH߃2r.HUgf=&{o,)=p*neoH4m  aNENp8-^i2GQu?Ayek  T{56+vU6T;w?n3]+r-%:djc(4~IY Ɯ4LS}w MwdŚ2H`CeopUyIENDB`u0034.png000066400000000000000000000004541326020644600316510ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH1NBA%ƂƘ/AhހXx55p W<7 kvg2]8sjRNz t+։z.E=(jKWj7Po:נ ]8Z-p_YTQKnI).:P 6"Jt>=(r℟|voP8IENDB`u0034_20e3.png000066400000000000000000000010261326020644600323760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHŕ?kQe2㸸$)D%AHD| K FF"H u\becJ+,law-f z4I1 Ct4`B'v}r>2}o@4ElڲR2fyFi$\̇ Фrx!YGfGABZ"(y4gT=@J $mi4zYz0Q 4ŝ<6M 3 hi`JtW N߂lE7W_ܩFOkٚscC|~oע)6vSoW!jIENDB`u0035.png000066400000000000000000000005061326020644600316500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH퓽.EAF Z4{ȍBRiW'?`T &A)T$޴^ž*/`C9qX8p^HEc`}-/9qw黀oV;.clb2<~U?D<"a$@xi4':wX}ZWb}Ɇ~F 魁kV  Կ>sF϶+ې( | JxYA}MMҁo[vvAoA3IENDB`u0037.png000066400000000000000000000004301326020644600316460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH1 1Egdml+=Vl`m%vbYEnVC&?!" 6 u6 gix\TXDmPD3! 3iL.p@\%["qꝪ'L<##}Јm<^Lē9"t} ~ zdO*IENDB`u0037_20e3.png000066400000000000000000000007721326020644600324100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkA7HI6"i-,lB,ӥLa\- wĸngEds2͛fwdй6 B;gHtg `bk/=5lM&M̍y%r. ې.~>)k6F.z18pl\}\&, tZ퉀n,܆k0E\|T#K*=N |?렺0@:22?AKkZ 0$J6@Ia0K{V쬪OE.`LaP8:pϜQ$s? zb $m3-fofO7ARDq -܂] IDATH픱JAE`c#""ڥ$6jmD?CDba XXH4$nEFxnmryq웕oY?M@YҺYI-IuIgf)D "+ q]Z-wa6\VZF)%|DLX>ى$YSґk-ٛ$-և4@Cw/)pjM`` h0A:(^j)r^Z,l7hu=Ryuᤜ)yQ̋b}}rpUzlv^0\f|$ɓ22]*iZR[ҕc3{ʽLVu; IENDB`u0038_20e3.png000066400000000000000000000012511326020644600324020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d`IDATHOSQ?j)bHT?ĸ+F7:0b@42P(E8ι{s}^)t BsLJذؑ'&n!Zvtr;7i&|r趪HEK[FПA5*B@0=kT S؉`'p+~iC:/Ty \wW!]HLcqIb.Qʷ/d_=(f{ԝ 0H ݢې[KUV7L8t]h;CznÍվj#i`@pЅ7Uegj2n&M}֝AvER /{{} mtIlYϜPފ[('ag(tŀ[W(Y?x朠Hcl0ق)bn!Zh c قK+DdgIENDB`u0039.png000066400000000000000000000005261326020644600316560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATH=JCAFc%"Y@D \C$;w"yEC 5.KɈMw8gHwO6IMI{6$%ns .2~B݀΀2g.i/CGm|IENDB`u00a9.png000066400000000000000000000020451326020644600317320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]leX  Lx"efH%ֈbL(F #HA7ޙ`&F-iR;zebZcZf ?j,/-.?n~{Ιoc]vV$T*F3wJ}nlVKC'Y9N"*'pAijlF96o^ekV8g WsC(ItxH27 ;e%Z- I7ߨځdS}"tn]!JRc**R Hn7v5eKonxEeA <[UyTۣ{Xaٖ7 u##u -b5u]5Asnqv_KuuW9|)6Q=0$*IT*`kWűrCtZ# “%ٍ3 DPbL5r4 j2H@(*o8f ؇ "?3F <]UK/SǪ <ꈉ}ܾj^B|4xX(LT .v2@ܛh Fx["B K4)Te,Eq/wdI/>݆1Qva79Y=W( l\ cKcU>۶b~jr77ɷ擈(ڕvc컩 .'ܙjKeYw.mhA W)=V^yhOWATQ_6j#{D_\+w8I*4Ԝ D}6}/GK_\7=IENDB`u1f004.png000066400000000000000000000025131326020644600320130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTU)3^^ Jk/$@ B{Q4K}0!4 PSVH\J[L;9|L[l]gֿ9 c(:5ɢsb Gw1Ѵl,M~HQjz x_|#QP]Y)!b0!ʣ9.K $´M/Yԗ!IENDB`u1f0cf.png000066400000000000000000000017501326020644600321620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[Le\-\BdVPTBT0iOj &V}MIcҚb> dC41M\4AV J ]e؝2@Մ.»Xw24Ғ94٬{ɐ֢Q䠉?GTL[#<ݯp7kO%9Sj ֿ2;xbIENDB`u1f171.png000066400000000000000000000011171326020644600320170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH;hSQ!JQ-ڡfXD:&8 Pb!FhtPT|.A;wǁܾ]HaLa7!9 Do^>1Йym#7w 1xhGf.RxFj"ŗV5SVM|()< N%[j4}b[jE K-@F[ Y,x 443dkY~`]WO4LaOXysrRR+^O3(oxOxZVd>yh -hn@:PQu"109yu6 BcGTV2jI $8iM^g-޺4+eP?D~yj߿9^@dq]kC?˼K$pÕ (4IENDB`u1f17e.png000066400000000000000000000014131326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMHaw()v$CvCB!"DTZi`Ac`jF*t]w|wY ygwi(4`@65lه kK2U)EX=zhȴmşi-b~6j0P}Sq CRsM *`MZy(ZQ XCd~NH ɮ*ʟar&妴!Y99'@y;˩sJ\ ?1PP@(f:Bϟ0:r0ln+@hcՏ,twZL;+@h <44"vvIENDB`u1f191.png000066400000000000000000000012611326020644600320210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dhIDATHMHTQ͛O3GѲ0S Kr&-h"lQA aѢTeQ>è6A%)5G҆zΛr1ys{{Ee-<7BrMRgm5 wU b)Lpd,{ vt\[4clp%Q;l> L_D^9=Wу%k`Q_OilġE5\o=ж9>iY@ ;4~ۘ{*+s U^,U½AJ"*(MHuRidm@(-@( ȋLT8q%>Dצ*\F;nOcԋ"i۲L !e`&@( IENDB`u1f192.png000066400000000000000000000015601326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d'IDATHoU۝cA,:V(,!A RJ %AT(H*iBL aK'/̻3f׋%|s;7Q+?}&J@sJZ05\ qQ{fs9j.5ѬoV _=?ǥ3u?>1U{hqߝmtPlޓӥzRP武QWp^o4˳.KAqƴP{JC^jY̫ g]^E. g ; 9 \݌ Pwfu+ 'f wڼrw$,TK,ܷk]~Ȏ1SѷYx#JٌRje̔'Oy=jKN"Ss^ε(1^*X V&B"B'TEѹZ MTF#2R+5&mԠX8jnjquFM^U7(_srDoQXݿ`14aιs&S68t \ _pyo7}nw8w3A[5qQ(1V=+\nزbj|4al9wp[FH[1?睥~ "j퇡E3%fmwR.iqz7w q6g.[1mV J\Y&DGe7Ɂ~  F4dI5xf@[3`*Qxc9\0=3Vw<6:hDeޝIz7gHeM7J)d-@\H6*s$;WIC` xVW3e R˟Y^,fx~ޠ/_8x:",dLŠTOq@ڴtj> z; Yt`W*m v}aK{ 6[PU\r5 u41QfRFGaa5Oa >9^X̚L% jQ+ωBunqPn dy;_ɻt垣-z'iDkfU*;kZײ&Nu鏔7 r;%`b]xE42&[KM@w{Yݪ+w~1J%!oiv]UWvyvg̼}j*f^ @#X5i-`R )xK$xYUxp;ϵ;)bHʆ%|3- KQyl@7i;ʦ@z\wpNӹ/Sk =q~gZ:ǡn7OgV4`:Nz 7P)LeƧl~{ao,${k}Mçt%tzs#~^Eu);=+cy5w t8'J8@ɨ^ 8>enHN0r@>Wm_u/n= >.5` t2q~X -\u`'k?y2[`aZw>"i?u{4P6-V%FwEBp%XHIENDB`u1f195.png000066400000000000000000000014101326020644600320210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMOQi~R5FML(.$ą5э+׺qcW&* Ѱ@%?颂sutZJ!*guͽ{ܘ;vS٬}n!SAUf6w9s1t\^J*P֯jA\JR5\GpTTͼ^0wOFy$l+k!ocK x)1.$zÝNMc-& `(P@7yq,uܱ%:kŶ-` `8ڀ"IhҹJg[> $gE"UQItW|d8z .n{p&2"p$\Bp6r/.Oa1Xo6ԍ*jUz/EPH{Rw魋`VmLeP]J~V*Gw]h˛GCt!@Eٹ5>啺C]:E`V}="hC^n^^8ײH'OL AWK "ˑ|+oSE~-JKo7 ,V+o6 ߺɥZIblVrxa_[0 W`O%(ZZ5md2ELZ=o=9=. P=qrpEnpސ/1] *#5|rIu _nxd"|^x>c`:%8צӦ0i،,8Ҭq}_3YqĖ0=m:_,Lq~[CUhwSKF7\K#[\ *m|$ab6 <7!c;dl'SO,ӻy?rMc ,:b!X3"6 ?ȹl>9%P͆9YW_$o tny3WpiBoO} wGpcdAw΁&o` 7 law>.X̙%p*bS#YBq<ʑ*U& *쉨4r67-Q؄We _g@mN%, Y9J܍+k =19z] .`UhTytX䃧5 q_-y _Ֆ*iƲ /FLރ-%SDByT+-G%ͅ$a"`(mqg4SE"98c "`mCYg(HyW qQf!A* vkWIENDB`u1f197.png000066400000000000000000000015001326020644600320230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKOQvN)U_% 1,$B;+ĸqcJu#&0&F]Hąqh(Phafh;-3a%=9yUFf*+CJȌ W%nbp5wUf0!2e<6sjBk<60l] ]a>f+Z9۫5z"є@w}3;K>s+Lηip}b+A ߬KE˭qք|PRn(O犌*pawL0[(z \S HYҤй%DS8n~Y'ܻFKUQiҐl.薰{9y??u!ާW6mZ4rtn=K{zkL֨{~2cVT=? OAOmܖsEY] 9iV1(ێ%_PM5I%!ZMβ65i)KU9>0}qMr_ y>O&(rS&^4DTŭ戰yDIZ6wgc^ Mp-N[Lv୰,@BLdҋ9:\Opd>'oȬaAxy{kޥ{?|mj=pscbӖ!\cg@BNmRzGf*RT"46 $h[LY/R&ǛuBiNY˾ eXw8 G` O+!IENDB`u1f198.png000066400000000000000000000021121326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTU=seN  % %ā MI&C$&*/IĄ7L i*`*$^/hѢ/MjJ2L~;lΰǡH_k{ksĕ$e@."hOUwxd6;Lq,XHꗟ RZ.ޮn{0yCU~ oW7tȧS^ڲ \sM !׋ۙU= k/PM\uV#m11]csWQDN':Uq{[ 8eZ!Ӊ=voW7+cxg[hH \5#s D!id>V߀edhzw/5؋yȍ\\v%p8ʈF"kك*8zɍ_W m2>u˒jԭ,]qOTLv"F^m<R*0)wӶ*R({zh¼>C2}QdܒKhڵ[SId}GqDPK "Ұ  m4SL}=ŕ apcN/P.%0vi"42%H]Ghl.7y TcAlZ%ϝ%I\K[+ys'ByzM&WߺIMSxV65hy |3!|z=kO[_!32)%tPrwlG7U(M2@[6h7엷HmFL]W7=-ش祙K)}/v D5\pBh/lÈFTp8TΝك0'J$z3~YAzxpχ:3VXnlպ vݺgH5ڵF40ג|6c$D˜̂6,a fzl=IYIENDB`u1f199.png000066400000000000000000000013401326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOQ?owvq F11m,ц҄@1&6Xib( ONݾ,Žj̾|g&O\Oj,)qm& 8]C񟂣 dN;&{Ǥ+aP5O6gUHsePMK@pT{g;BY01a$d[*JL g"eOt~/}Ɠ[@H$qtZ.d8i\1+=v?mCps EI*J:T۟ }.p5kSl#Fj> 7MF3heߛ|:l>o*TspBpk M=JkIG%A̮b/>NjRكW+Hxѵg#=K,V<) 7U&s;wLuI +FguwL6](iI !a>p!Il8 $?!1-IENDB`u1f19a.png000066400000000000000000000015551326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d$IDATHKhY{+&F!=1*ea$: ݈ +q! w>Pq 00fc1>B$LvҝtR]UE[U鎺0wS{?[ujE8QpEA$?3 8t[_#'MAC~IIbV1v / nƼZ%~{jszȼ \Ȅݧv 'HE25S2p$㿃NKc@y ǙuۊbUX-^[C!^)&63?roA) Obu`W jQV1Z`$[;eZϲWv2h+6*]J᤟avlHNk#HT",iOmz|idլ"9D#Gj_l|*O\'s;Ti eܮV 7l (;%ӈUd7O %m?OI v#q*%{)sl<@KݩB(E>=3x"Q4MU ?~Ǧ[{?^;*Ѭ3H~ kK k~2ɲ͒?>U5;ۊ۝ƘBǸcWण 3rʉU_!P\ttQ@P2.˾)*gQCUE7PLL{N6XaU5Fm*zS5À,[Ɖ q(yA D>0 IENDB`u1f1e6.png000066400000000000000000000010751326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHjQgf:i\(bFĊ5"jЅ;H KѐD]0SlSNڙI%{gE~pas@TQ VnwC /4,ke<߰$(Bf?WX`F|YG㏙q۵2jW w +*$rwaE l @%a~ 4JDpȒaUY5욾_mP3hg"{i|4PU[s~V?$It1ssGY99ka6IU] 杘Yy Z`YNqiQ/tq]yj>P'EqY&:E#9D/lts JTG{kߝV|i#M]+oV;#Q.Lv?8ɞIENDB`u1f1e7.png000066400000000000000000000010211326020644600320750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՔOkaMm m=y<9n.MA7PRԋ@DJD٠hP!S>Zov&F=33;/fi|5o/J=۠ȭSH^^q_?l.+ЏM=|Z0Ov=X!.3{qCm2zPZcNw꫏GkgttDϪ?+nhq|ArI g6KUKzݨ(<<7'H=iqÖNd0ZtsA$Z70[Nm VXwa|( XK)`˫l4ʳ;)wOϕw{#AilCw],s.>=)t5b7:ĆDz*Jf|-qaQ93 tzIENDB`u1f1e8.png000066400000000000000000000011761326020644600321110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d5IDATHՕOkQGMFlR{VV2M_@A.Du# Dčn܋(ju2ŢBpŠUTk iRLft]s{0ۘ7z4˜ JjH$ftOLJ5 O;+sCe0_n5F/1]U79DU(r䃥 ֎T}pQS("w}d;GVcͧRуFy1InYD˕lB hee`ʹjAqhՔm%,e)9 78ZVj4=k 9bxoGag5Wgwv:1 j}zޯ LtlZw|L6 }E.YN$shlr }{F݁ۀY|UPBvʊT6+=r@F[GZ 4ǰeĈ\&T*5mQ`} \HycF~lyʡ7˿,UzY) VN+b;}reQ ("z<|]zuքh.8wlbbMeӃ`ַ*oX(dNCIENDB`u1f1e9.png000066400000000000000000000007771326020644600321200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՔ=oAEϛ"E !H@H-"% 5Pр@?4T(DAC " Kczז6V7g>]6RIn]qf>[؀ZةvF>3֤ynKybp/~-XQ)7.`W6:gf+=WJȰ1Wfx;XoBv[oc .[h._ S\5a*:?,z^5lb͌g, r{iKp0Lc8 Hq7cc8U#z`qgPԽ dU| 0Ͷ9d$38iaؓZp!5`Gasyp}uk'8:2zAM\nzFIENDB`u1f1e9_1f1ea.png000066400000000000000000000014211326020644600330600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՔKLW}3 QH Q!Ac-MdWԅĕ.4MBѺh\Ahҽ42lZ- aF ݜ{sr΅Emmmsj15HO2B\B@e' tCCCHR* @ PgyȎ -YggNec8PUa;T 4N<JHARvPFPetr1W8UL͊;nn~.PՕZ+hA}l @ˢ3YůW?Po:Ӊ%}ݳshvlCz`O%s'ٌ(;1F#UO@dWFmI3~@GE9Ej @03AJ#/0eY5$#[ hX[;O_3,Ix68Բ0q3OʻIENDB`u1f1ea_1f1f8.png000066400000000000000000000012351326020644600330630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dTIDATHoUϛ֊-C4Fˢƅ@SVFI#@† 7.jBB` F!JMMAPljAC:ewf:)elpvsϽ|Gq@:gʸKIª*:XB _, -؂hw1"DmCˢM`!As`[ЧL"!;2'x2g6^C=]|$=؀y̡ <Ѝ4?cBte-z.-)D]7Ͳtn7G3xBjFѯuoӒx=דZbW%3^39?-"g%1V-s;|[%E<3 7p(\p.@|DŽ·b]v, Fy]Y24q$ bC°`k#uvkNvѬpw8܉9'%+\=@e>Z IENDB`u1f1eb.png000066400000000000000000000004351326020644600321600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH; @ a%+x9;[/'ة3VB0bC7yծ|%bA0j3ULkfQ f@"#|K)e T9'sQ'%ڌ?  ۋ~'rHb|_V=ӆS3 P"̉~ɗ%놴6 wIENDB`u1f1eb_1f1f7.png000066400000000000000000000013501326020644600330610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՔKHTQ߹sf&MlFC\QTF .\XjQDDQwSЅ W &C=gFvz=-a盢6ٜ;>) j0D?uMfB.).OН`c"p>jG+w,!iJJ #ej 39ChM 8sjS{\*`mٖ8HI!/qkl: zhohYȿ@+4T,FDYʱxףO4b^Umgz& -f !iH[ajr@_ n# Efh 5 |d|;|/ׁC LC| yV)p!%bpFa[ "m̌@Є՟"(PƩ6^G'lƻD&>Lq"u, vC XŒ}7ՙ-_VÀӥ:Nw`><'iq"jw5wFYvEbt~cG*T=mXRA*Hs:p4uzI=]}݋wFTYou~Ax}i]2y>@[~5 ܪ^}<~dTw33vK+E1o*R XW;r)PU&m"ޣ[ʉNi[y LrX`_e8s;ZɛXpduN(9zD+DfF$QhK'v707IENDB`u1f1ec_1f1e7.png000066400000000000000000000026621326020644600330700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|diIDATHՕ[Pe7l0K0(B 8dZ9SfM:FDT*8Q)9 y 3.j^}|koE鹆ٙ|4X936v@ง 9 QoȔ$&*|;wV(Z}3מ][r "W(@X^-]/^jk /4 `3nnB`{7/ixڄjgrkmO)cmEvuG&JV/]PЉ<<>ɣf&$UEy$mݢĞ_&Zer"GM%Hߴ GWH/xSP1fe=IMUt]p_ ,a~r0E KΣDž)$JbS7 st(lvH(J ˌy}~sW|%|we*-4:F8KCB)$J8O {~a 39Ea5 s|0D ۆm"uM0uDbx7ZM[$ڐ<<.xef".EA>q|\%g@Qн*SXPh<ҢPXkghuX8J82FDwܚbY9)8]B|.=s}Rbp+MO<',^ҔI&wZ(Kɏ OM.e#yyLJolzBG0 !z{AsaO^CXΦ!\m%ߛCFUц,.OP8]"[Fqݜ$t` 9b ڙ2\}?apG hA[]~bB2%aӟf$ ;gr&pbFBU5zzp<)l w͟@ُLE7@OT_jOUUZMhiEs z\q|_=:0k 馄Fi=euQ}OJiyCTVdd?~JeYiEIENDB`u1f1ed.png000066400000000000000000000004231326020644600321570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHc`#2 b(*o:(5f kф_pԀqX$8QDqA? 0vQ T 38xU?.00hg` ; q?\2"({I9x8C?F-x PEp LǙF5-G(3¼"IENDB`u1f1ee.png000066400000000000000000000002471326020644600321640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d^IDATHc`#1<[,Rф FIA,b1(Z0jZ@df&7bH ۑnIENDB`u1f1ee_1f1f9.png000066400000000000000000000013471326020644600330740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕOHQǿ]vmBM =.uPBб[Ay+ џ\,Ss]qwQ3ٝy&{73 A ׋Vch^?o(+\@@74j]N1ztoɚcanY$kAp蟝l\ \:Srw^;5lyݾ-09#WkuC/ң*C .K}oE͆Dy`8UjUZ]%3z9ĦF͌jw @Öb 7)Amt2h*STcsp@! X")S L~ՠuus1!ӼI~ sP 1*D:.uJ)q(1|Z aA| LxT P7m-[+ X,P"ۺG傠#ո180hl "p|Sܦ:&7ew xq3<~S'RSx$mG@J|z.N<`7,/f_VlUp߸~'S{>!y_)ĵyX7ĘCϖY9e2#nƊC:_/o["IENDB`u1f1ef.png000066400000000000000000000006551326020644600321700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|ddIDATH?/Ca^Ju'{YiD"G),@2ޖ$MҁɟAB. u|y_D:gGc2b<' bYAA@.Rp9!bYR RØH_A[ǦBF^q#{{GXTxmPd'\3YTBe)H{k 4-u>ww/2 PTd't_SCQS(ddVIENDB`u1f1ef_1f1f5.png000066400000000000000000000017001326020644600330620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dwIDATHUMhcUOC;mȐP'# cZbZ )]8ٔ%dBvPfBTim6%c4Ii:k׼iJl^l惻ι;{A 4ϞFpIh@^-Ul5r?&QXO4}zj kD:0 &!(hpX,*}}}Kh4I@Nrlnd2afzzz088vK`:99p:k9-IRzzzzX,tFrysEU!EQDb1<<̉J(zr^0k}ܷa7 NpuY5MY6߄`dTа hKwjlNi>H&QM(c,JNŋ*PʤL1(h j+ a| 6-@DIUU[mKh57s>+.IRV0u@2Q>H?>4\z `GYuuuu,wq)'bKgggbikkk2>W7666*`%MMMc 9:cP`eow{s~GQ17LJH$~y>nE]EŢiT5"p v8׽goAO~9%IENDB`u1f1f0.png000066400000000000000000000010601326020644600320720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕ=hQy ,iDAZdg"XX؈(j* AT)DA'by 6vZia]bf޵;w&l O͹޼{!"msodc~A5Z# kY~6+ꬕhґ q1LgϷ D̃ 264P2 HuTȚ2չx[N\$evV~ς4}i%= u"K=vpwxЯ̭7a(.ݚd:9T l}9ló{>E;!u~VlqM L>T)BA;~ƫ3ODy4[^ͫ\Rtde]-D`r"4'x%-BxwHVS\07s)M< %o:x{+?\Q8$웨WG9IENDB`u1f1f0_1f1f7.png000066400000000000000000000024551326020644600330070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHU_LSg}[m,nzT\ܫS#xqKe13<ȃ.eY2$f3s#,aqh RʟvPйK\施{swg.+eY>@D@Mm`7FIvGc/˲m .۽{!QvƘIUU cl@@VEQFqft+е //>aEQZqŒD DDԌ EE& r8V5$sYg:ES.\@/^$".H$IՑȲ1%'Nt󟚚BSSn߾ APSSN. 'R,˗aA @?<]17| XVBEX,6zs޽ې|H$.--ʕ+y ө!)lÖ!QRRn;v ZǏϩl3sBX, ^͆~ ǝ reMm۶ Z`X飉DdP(h4G( rbYdJ/> ??bclzzzzծAZ*S8XaƀSsPWDss3 t:uϞ=~"*UU Ly&]FZTTTn7߂bYI@]#CCCt8wܪ}inݺuh4ӪLqH$hiiAnn.Z-r :a|>f3WWW *P__O4;;[N>}C,.`ŦDD3s[ɓP%><$}oM~__АH$. [fgZYĭIENDB`u1f1f1.png000066400000000000000000000003511326020644600320750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHc`^ȳ01R-`&t?FƳCr OR-`.̈XCZ0jJHFqC!{dZ 3mg``Bq!q8##)8"^&|IENDB`u1f1f2.png000066400000000000000000000011741326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d3IDATH픿kSQ?5(&) .R&JT2(Ih Vqr!/4Eb#Iqx/}qrwϹ|b4:W`9V;Kk{`nqt6pO|3'@%Ɩr UIW3V 95ghwpݵ Q` Eubìs4aT$-erS"2@ D h=>ppuTP"$8YH,{ ?jի 3qfKP1_=ՙ%JX`S9OS)9Sd׾p.={L._d t>uJEwj=`SY ɩ_`?,a321##~4uGAwH4Ӽ0Dxˏ+A+zT5n:dJL#/}^''f}_hz&[aѥ5IENDB`u1f1f3.png000066400000000000000000000007241326020644600321030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH?K[ay !-&]:H'7ڭ/ID[k ,[N.:5}"Q.tK0;x9l{I]tewn#U%(}ߘFtswE7y{{}t&B%c}1-;~;KA:ťMY+^`NsQ@1~i!l*miO7UQغfIENDB`u1f1f4.png000066400000000000000000000013131326020644600320770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕKqw\-)o;nnh$] <[g v!T`E.F[(!IDב2w̮D^~ !6M~aDVAY _PN2x_Y7&H_#S"NҜ CZo7TA*W<o/ h0B 2tR*+8UǤ^ܽ$<"h.LɭloO' ]?í#(ёךK"/j?j*K,{iZ`ۖ)x;q5,=3mX@r)Iǖ 8 $9^Pq-_"r `lV (P5z7-ҕ90>xu-J3@q2uS{7-p—.BgOb \EOuܲ;K1d痪wj4v"MSle6]hƔJŭ&հn8_gH4¶z'a!;V UcaSބ4].x"iP[!!v;%aYcZ2PַmۣmP{ߙ7\G]'9WzENɥ DD.Kpr$3z۟0 DZg u m5;DqA "Ocu/JC*HQy zF`nojjwh4 7#GUYy|fF_B LV7x)\GYfl5\ruׇ2B: P@DL0ˬXdkgPHmd \Q32oS G( ,ĥ<3bRQ09w~[J@1dԐ3Ƶ|ߊe0TLQͲ/ߦKmл IENDB`u1f1f7.png000066400000000000000000000010411326020644600321000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՓkSQ?bA"$\R"k .b8"A\,"b "'CMU IsJ16ڗgsrykǽ?Tr|읡;DrV]EӋ6@#ۉZplΈCRݞn[2M 95mBO]netAWT?顳L5!n{" =vO#.3տJLh8|: }mJ AԼv[CiĖNL^tS=d__ }o(c5-q͘q J$0G4v3)T$XBV&˧= f2>IYL>g@I=EpF|qrC?$9?\lk7-|ӪAiyׄrCn*~Q\%IENDB`u1f1f7_1f1fa.png000066400000000000000000000014001326020644600330550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՔ[HSq?6si Q*""*D]ޒ .FAB>| H 2z" rI}(3V1/̵ڜ9PܤL8|9pAD,"ˀV่X™;E䘈'~ :X@7S-mݍ@P*"^%oZ>759;ZH}_Wk5kS~8H-D{h EJR6Tj𨡅3u<|2{BwMDSACgn=JԲ5Uzi#ɟ%y@N7BU[n[qģ 'yjqD1uAJ_7f%_MEPO@H'^ij 'o;HL*a{`}}qO(r@ӯ?  qJ'竑+Txvܾ Dh|ʓ4Vdsc\ Y%sN*dζ`צU^HFS/6`f#Tr)ꊒzڟ>Xm$Nn(@z= S|S WmO5ozN~p#Am,KC+F0^+Лs9eXysp:u2 r.c4edU4YJk`6G)6ɗ@9"ȰhA >3Vun[?kaYeH8N@\WYӻV  ,('R@IENDB`u1f1f9.png000066400000000000000000000004161326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH1 @ElV[.^$xs-Rx m Z]&keaQU翁܇h GUt8u PKEyK=˹PeRWh߲-xYs*0+{晗.l(/P~Hٶ0 IYe}5ԀC~0[l?qۺ/mIIENDB`u1f1fa.png000066400000000000000000000006461326020644600321640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d]IDATH픱JPc[EfR  n /`7ѩ:.IA0*" 9.*Mb[po  NӿP1m'ʞoy=g×9 j3+cc@siaU4^SsDJ$~AJiX2 ZJ2q[o㱛jlO5-W@+ dDY`7;-Ťj{vϛj" @b_0$.?GhrEu2M 8p Ye*`i#Be9"Pe7/Nfu͌~`wIENDB`u1f1fa_1f1f8.png000066400000000000000000000026711326020644600330710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dpIDATHՕ{lTe9gΜNg:SD"[-(EHUdC/QI(h4nEDpYq$KZX; ъZ(uzۙGzaMy<_'U֢/A\ dV˹n6ѡC=3?PVjP܋JL]6f)H#lGNTG4#@ ;+,~yv=ZSxig/f절oj(EWb~H Kע鋜*o>z{ٔ+繆#Txw?MwZ/W}K)/n8Abv y``{yq :p7)8:_f`lzNӞ$_~Gh# = bۻdrzP`'JLt?@D&Efdr WqY ήT4F^oV8:7mOXS{( |Ci#+q_C]zz3puœwͽE4j4iff]ʢ5;>H@Ӈ773 PLu Q qɚ+]t VLɐ&՘; #Q^̉ 5όP1wB9q P;=FXm>iİl%Juy&ܶ4\o8$N]Y 9[:)p۞k)'jǀV "lTCP2xw t.;{7VI H٬uuPm/mYFDپWW[sILSTCzl|j4 e)۪/mz/)C*\},6R'Zl)I9,k6%@Ș2kHn$2-9KΠ)nYyIENDB`u1f1fd.png000066400000000000000000000013021326020644600321550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dyIDATHKq? F]:x$:RQ'RtAEHAuq]3hPQnBe3ohgt/3>ywڠtdh%C'}-Ѳ'?>Db'ܤs*5k @ZTcH"?J>zO*&HL[.7z[ X:L 0*C>R}s%+7]ёt9{+l*.|ktʮܐ&qxbe.Cl"ӆך@jO:` pf1@5qMKKax^56}vɪxqU􋖯::B9n2RPrM:UjB[uƯTt vc΃6FD B.E377HD8@W q7;pR鏻c`#ۑ9NƀgT/|@U|;2j曙X Re }jQ#5,&ON A!"RJ7qUXh/=:-=n3}~:r+ɵYoMy"YIENDB`u1f1fe.png000066400000000000000000000010301326020644600321540ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=OQ3b]J@ &[X&vRh0B"&Zjt,?*,  aV+Ё.dca›L{ysowI8* NozK Pi.z&']1&T d/PЇ x^qܯW-(W,5ˀ7QlH^EQ}+0w0R`yk1`kWEcN 5Nν^{[73oAhzbY*>zm튬(VD8;WE['B  _Bi- ~:Z -#R*bە 0><'1h9?z脗,Eƺߢ LP6X;L􆼚'Pz~Ё#Ě\g@߰~)!"ّQts;IENDB`u1f21a.png000066400000000000000000000014551326020644600320770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKhQ;3ib6mUڴ(h ƍPDQ_( ,Z "((-ϪV jն#61Mf溘4iXuΝ37{G/!8 L"!e|Tdn=gr04ij#Í Y Tp0c3};#Z&8k%c_ <6h3棕ϱ# w=@F==_'06&g-@o׬xd}!e^ 0n/]/A-1jF), .ԢztV*Wл&^$SFkwZ%*tjz#N_H=>."g误!| -vB&kLG__%qМ(D@MMǼS?ceBa#"{BŞd1fcs5Ӷdɘ&{pYN-nj !C|.zqLJV>X{. &v-c>sj_!wiiQl»JnafWz>nB=qRUK0z?b@rWdS{ 멵M +?i~RcAY{^2S':lx| rxwCN!ze*P*IOU&À;$GmSIENDB`u1f22f.png000066400000000000000000000014311326020644600320770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkQw2y̘LS]j]j.DQD\)ХEQWuF((.Gqb}V&Ig&nq>=~{EС3 /!XRk85*> ʲ'Cmz=WZtC & ABkGʚǵ%|c\Y 0)ښG8=IR=!oLZeNSH+>~fYӞٵ*Ws gXۼގ\5yj^׵h_{-|Xr C\@B]tqm3kӇv,a9 *(N& z=P'CJ‘&v'i$㻧U省޴svnQCA`-b `BrՅb ,M\HL _IENDB`u1f232.png000066400000000000000000000015701326020644600320200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d/IDATHohUu?sνswv,$G"Yl 6$VH7aYRpX^$bPA'LpbM6sϿ{~8ە{0ZW}yx~B4 W yXwM l>9c )1UCi\mL(Fɚ@ zΓ*19{<"k_D_)1ـ(% W˜hDo s'?/=t뫑DJr{yhUյL.P ~~sϧ1{ 9E-uY3APE{˟"P &ƐN 03E]drs'37|ް]dA_(~~{#(K0;GG<2RkX_tmaBG:qzT Y."tSx7f%= ]xX$xwo3^"ꗆhP&FcȈa"r Iv YKGG5?K32ҹq}*؉s*`h iRׅ@kZGclGCb Ae嘝I^W[|9~N?Gp\c #KSaKG[6lޱBDT *\c3k<}5GgH[B@,_:q_V(ݿIENDB`u1f233.png000066400000000000000000000012671326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dnIDATHOQw}iiIF cI nܐ@cbeˊ( \rc+6"#5EN.J'̔j귚{9;k}| ,L$b,/&o'r@DvCBŽtnN4 =4X 2\TDTU4- 5+^3yה1]8-=p"0ARF#*? KB&df!U_wxXѹí"*^-W G2p0ARW 3bp2D\S^ejLXl{\p/(}G gNjI6Ef[ukD%XK.WU,se4P2D<L>m_R>2Xoת|60S )_+["ʋoQܝd'3hMq BFq`<?ڸBVk5wX|2wQvpFW`t5A\S2yz] y}w}oTV!e&I!ts8Pc Yq+٤+"tI2Nܲ o m[ @rw2hbUb\E- .!x(S7l¸ڏ~ 2Όםb]cd8av$BsЊQJL7W'{\D-.K&ɸ-WӼ>жEl9ObMXmoUu;"{H]Қ( ^bJt{ h"sE NEEUqBt0RXg1P]X $o3<,MblZn: 'L$̵:>Kk.;ŷ Mve_S߉__ۇ7pڂ05c.oFdvk^K_ŗZ"Ə12,h@1ڞh9bSzZLGg>~3Zv r;΅gn,~8ĖhztQeܿW)ssY9WށpKG9\P>!Ҝ?(j@uYѥ9!b*-*}IENDB`u1f236.png000066400000000000000000000011271326020644600320220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOSa~a0B`ऻ#ĸHd8?qFMTbbG`!-HKnmxso[Ӟw~uNXx1p\x*ҙž"9SXBqªT4tPoe˂8]﹄҅ndrpg2*Z _>5|ŧp=#S!nOF(Z-p,>LG5n wۍWl5\?10Mvwņ0D(tM Aˌ`~<ւx5LȠJAS 6 n}U[&"^wsA@2D Ol.0>Tf$s(- Isi[o8 DX÷1)?佂Y8"}_.cu!/R3 9x h%PLY90f`#Pдj= {ijRR= IENDB`u1f238.png000066400000000000000000000007611326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKAƿCĠH 1X(ڈvZ .@m```%T/m vn;b@q9ߤn@[#SqJ'  ]0^5IZqd1@\A8H?Z@Ax揤::~נ[۔]E"!$8 j5mtGz& :3Vl}?3j(}`q&F/,K|) o]'0'J3螀Tm3Ou]v nErP4 WJh0mQr' A!:G67Swp6 OPʔ✯a@8As~tIENDB`u1f239.png000066400000000000000000000012621326020644600320250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|diIDATHMHafhVJF%,HS":Q]:(KI,ȽdK뺫v]ݶY? ; 3boyUULl$1!076< d8WЪkA4);y{+o5fw$"J̎nT|@,@#騤0+̶N̶v"es/dd|hpw3?i[c45z j96چܡ+7p0'N}o42&Ъз(hRq_V4!48H\ Sy;3!LhWʙ꺆"ڭH DD ؈N)IENDB`u1f23a.png000066400000000000000000000012131326020644600320710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dBIDATH=hQqDDTh@B DD4؈ UPAUTQ6)LBQAL.%wI9ۙ?}eg)W v~Chg* ?0n<)+"uҜ!z}0?ƥ0v5-30΂u=fu7 8.t!mź^Sq]O16@?s40z|ǙS(-&f]uc6 zٟsY(AE͚mHjYŜU ?r j?tYW01+?)ǒtE2@4)T\)y@n䛵ytq|TcXrgDs|_tY0TXb: MB#nC sh0YSV~M,S'_FkގL??k&I;NO֪c ܆d:4"otr,b0Z4gy%i=WZVQ xU<纮& 1ɱ =_~[\ X:cIENDB`u1f250.png000066400000000000000000000020161326020644600320140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoH]e?99׿ފLjY\ z1zXbk\A Q3"{\&bDJ-6bъjlE*!kV]e +}|}xsin ]' 6")0.8s*xx`tIAr~[1b's*Ǖ(vZbU~k9C%JXI`lN1+/4t!j -41A;k;P{8FVgykIENDB`u1f251.png000066400000000000000000000014001326020644600320110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlQTTQN [ "B%6$ةbDQi[6"B ZL7%)o}#MX¯ 1T#*7=e4mAYasm>I?ya0P$-P)Cy;q 激sve41 l~XPdvpb15 Ka}?D+c?ރzWLYQ~d ,iDHkT HpI5*Oz2vC9Ef, BͱVE{ly!gP6Bſ^p,'Jsk{Ol&}d6GI!l|3ޮ4EJ(0M7ij2N^G~խ,EfR) `t YRz;.fhں0 j5k%^ǷY2k215͹ٷn_, "قm8Í.2<*~:l("+sI5F{DHJF< ȒqXxW~ϠXKH}ߧp,c=ӮJquD)!"k;\~HXW xvۯ[I&:lr-O?❛Nŷ[5]۷X!+7)N 0TxNB<7786)<Qpi[axs-3TGaw8Zc7\( U1B*G&`~~ZRj1: īB5kUZ6/q UrZc6q͵F)kmBhSk[~߿3/B[1GYd2qt_  L$ M^[k|hS>z |j[&IENDB`u1f302.png000066400000000000000000000016111326020644600320120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d@IDATHmLec:Kaف۪>dͥH -"ŵUؔmspxa][ߝ{W@|ധ㍇'$cZ}wwL%^g8W 23Z_P}ct6ʸ, XN7#kA`6kĩ5L;A05C>g y-BEg=v]J5B Л^UEW"su~sE+蒨K7W-x DIENDB`u1f303.png000066400000000000000000000016301326020644600320140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dOIDATHmh[UČ4-LSjGn-$ؤN-EWEaC??D:/*lDEcC[u665oK}4M[_p/<<;s9 W5ky35ǯY?- '%p|6ǿ/.eeW}R8=96<}i5$ځpO9`Pӟ5-7h4`͞+i˗dznu[DLV%R{54󅭗>#iy}Zib7@+z/u}&lCɼ\%(~wh4hbBupJRP_YNTx 7&?\IENDB`u1f304.png000066400000000000000000000012771326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dvIDATHAlQiVL3RAv aEceÆMNX J` * ZҤJT5Z3ע3 TFロ5rz\EꈮEkZk2rerE*JMT5]ݣ[* Bˌր( `0uVFUn$L(M}/iE""8҉X/ʪL&*6}[H<(<ӾLnCu/";3NgR zq *r&?9a  HB5"> MUGm[R2Jiqz0 MW-f"s6Jc/{i/tش(Is.em ʹ}B3oE#Ԋ:UhLRIENDB`u1f305.png000066400000000000000000000015141326020644600320170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOhU}|ә66:VZ\("*  . Ո.tcqBM܈T[nҤEJjԍ]D3e ff2ɟ&o!xvwϹ{?SbNLkKxx-šPhxCHZ\¦VBxo<-ߺKv60D ywL }%3Ȟ |v5#ȏ B)bМ(|, * qaGx +Jfʕ3ҁYnC2^ҫ@nme@7hbMmQf֌; Јdwx8Ns\9l9F=dYiué@s9 _MzhY u*]-`2[ `$lmG\ᘪ4CKohήLgƼ_k!~Z5و9.4=*.nɻS5>:_ MΫbtI59?hp{8u&k)[v^ر㢎 &k)gOџ@)]mŨ.MG幭;*u&~]X>wrtlVٽ'fm/U37gz`<:LJ5IENDB`u1f306.png000066400000000000000000000013411326020644600320160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlLQs1EU !ME$mb DXۈvA",$6/DHHDjaE;`#m4~L[͝h|tF&Huٜs~]SSFiBX&NCMb$0dc$bO'+B0E.PTMw>PX:KP<1Wk0DY[񔉬A|צAkF,so`̐wA<` ՍP0H; (wش:M̶Se D=xp9ce(bUFӞ_fƕߨp&e|͛]9|N[d o<PR)- E1UdG" BE#2+yd_r&eXu`bxʌRՃ4}˄s [n8gxAK|ހgfu{ƃ/_.ϖ+ctZ̘|Gj@Cb C:>D+ꍋBYC[R f} |.3=;Bz{ H` Nj-g7?ĪXYj^xw=c_sG 'V6V%›ǩ(˯ G;,]6~NNIENDB`u1f307.png000066400000000000000000000016141326020644600320220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dCIDATHOh\UϛLmiUC)iBp RnBA -+)•"ZmEIPS)ƙ)7L߻KLfE;}{jk0bJ/ ]T(#hvi!Xq'$Fj[\!K5ƞ z/Wq[iжصz)*?X!m`B'W=f2ķ7)wP鈴aӸ G?Kqmpy6봯rrJk"b'슅 (υ 5}邡/),7˚Ln[h;yO(#e~w)2xT/%9~1`xw|8C'fcPj~%_i% Wz+ں޳|s-At;5x"`qRQKV(>z WL_|QqZ+VYq xs< _JÎ%a:kg12 o]R,.m?YV:_K[B++3VL '~φXZo}ܷ#Ad?GMTIENDB`u1f308.png000066400000000000000000000024401326020644600320210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHilU{7әa3]()Z#(X@KP*]\X)@-K[0Q T(JI((tʴ3S ;3IU(9{. QSΎDJ&G9UΥcI[Fʳ{5,-^8! ̹3QdDbF6M._W[UF@vkdqC F=yl,r-ɪ3($p>=oсxs*M.8^2R]KU< 4hi!gt1Z7d0 P@nDh*׷O60ƮsɿDJΙ`CXm7&[췯`;怏?yEL~v>8@j&(Ҽ#p5%;޷42&1"3WSa+]gG]c PDhuU umcU v$'Alw;XKdΨqgmZ Y i2b5?W4^8V^.;o0ļ!,(R@bWz DF1# 8(oaױ2 nv IۍG̚fxZ:%WRo7~Hh&ˆv%ĩd5hڀ1*rK+: 1x]K6$. h ӧ:k^955UfK$5cd%A_4.sJ'cŧMA/\\@iNp׮^j\h}+s%?,OM2cDrg1jӭ>!+r v0d/9ӊhaT^#;O>(M ^FDWXGZË*_ bAU?{B9dܒ5M 3"v?E**  s ZitzvpMP`ѝ"߯=oXTU7TUIn c48x(挭fv#?RdlqW׷{ze/]أ1(Ѣ׈Wt30ӗ) :9KU+D BC)p>%ܤ]+.9qH 7IZ+=Æ̅s9V[,rI#7槷뿣-"PIENDB`u1f309.png000066400000000000000000000016731326020644600320310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|drIDATHmh[U6I6M mbpS7]v>ZXݦ cTQAXQduLE6-,9]ccͺdIn{&7+W# B.)o)R5y5ֻPZ>)r,M2Tܕװ2e;ܿ`T奻KG|T9xz浦vH#.BGϵg 4T¡ܽHaYY)@r? ֨=: q  wrlY m Eolj w#Pucnin]1$zFxMJ:·%o]m^y&CIGZ kp;|n: 6L*8w)x\eXd6 0^fg?zىySG=yw:\vѠaŎf_xdL$a8ML0rp+ӉJ(cʎVTI/3Ka$ Z\k _&XZWE$0Oq{}U sz\֪ 5NFIUvnT±$B)d#JD4IL)V(˱GTJ>7vⴙx3|rz3?.$Pw Ԥ`$>'u =%d5lzO}<j\RR4`Ui:{ʲIENDB`u1f30a.png000066400000000000000000000015741326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d3IDATHR]hSg~-l\)*Sue]91 NPb/e?8dv1!XA+ΩmZkrJڌӤI]t]ܾ= _"?ujC]MEllY" yJtc3|mg۹xtq;0;9}MY38S;Z>M$۴, pTq$~']i=>4GG!Ď`TF OxwRZiP7_@PG&mcmæoAL̜]wDv3D @. ADH!t F_g &bh+eaE xǍ`q~+B̐f0+/H7_HFwǯ9rEH&35A'"zt\ʉ.g+_ )LW igvG gE.$ Q% +jLIhLTBتrҟՉ"!ĔgCWx]ra|IENDB`u1f30b.png000066400000000000000000000023431326020644600320750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHklTUsmD ( hX5#UU#"66#h1 QL 4" T|B R:=RԴ#/g@-~ kMTO| U󧉡#[o%Lڍ*')͉AǶԁϧIQ ):W.GvvīDtq+iht`}m'P`. >G@N?!1mzOZj-AA^ܮWmOTM`J2 *-Z3.h P\{`o-KK5V>T*Zܸ>:;kQt'BJ% _/2OH]Ch-]`Qb"2A:a4VfDOZtl /nz&Mu1% YGԲt#T+2N1OWL@K&r(V÷0_%#ؿt6u}zy6|qgMgty-;ugΎA쌝8@.Ȼ5=3瑴ι@ha8;չO/h d8]%{k֮%m `E"ЮpJ&DAogÂIENDB`u1f30c.png000066400000000000000000000017761326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKL\e߽wwqgqR6nۦF|ĐqDwn낆htO4T-@.m@=s\0uh:s;{owh ;#Ջx߯E,`!"yW%g%Wˣ m L KrX04bV&=b{mx=2C ~T!w'Y8\RR*%hԷmJ#m,f|8 EHL)=F[~sxѵUO:hp&={yp-eD[Mo r ϻ '54rn OVl֕bv >lY)i/]#g'n6r:}%)2G-Q Sy8ApVޢ9Se5We93,7̙r~7| x>/!u w=l.Ci9B+h*0¶to 0q(VI N:wϻFi,zEɥx] 9i9j+Kؕ_l7"S||p9&C{x32M#{jKZ$DJ])77|3%=Uf(/D曾tq&x4oU8^ E=K^iC}Kzl nFI@R$Go2yf6d Mŗ % Јf!H&=Aou7b_&$j6yș_ NNVV,x7Rtܓ4oDl<0X)Rj\')Eqn_RLMI^l=>MXicͼ[uȿNp2OJlSrck^;IENDB`u1f30d.png000066400000000000000000000022461326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d]IDATHLu_y@Ap5PTӖԦd6s_զQj6'sZmͶ& ʀhGNc{ޟy>|\8|ց+繟ȳrG&SAgxXQ]ڗB$7VǶYnfRKA3$vb5Ep9=q d~}_δ̏ުk兽;zӊdYC5p%$ ,âh:cY5]ٔkt.ʖy%E+9/M:= IM/$͌,0O!@ 2|ei*.66HKvϗmo' Z27gi,xX"l_١G(H{@vTF7J3a߷3꠮ŞX foicoa I&d X$a3-YLi2K;C΂lAV4dQC:Nt2` z"+~φ?IENDB`u1f30e.png000066400000000000000000000021751326020644600321030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d4IDATHkLW}KiZ*X^ !YB |CtqLXpI,~YeffDce)ss( CnBHBK}ϧs?_syٟ<Zoߘd;6t/sp*vkUg8*Αݩ)G&ӗ/m6i1Lt{Yd& i 4P : )8i{g UM9$(XASW2BhdfQK=ז}r䣚ꢌOc`&qyc>=Yd04C}gn-xX|o?ow,/!?6lv=:Xd ^roe(=74nU^ ϥ΅/N;+XZ @R=N᐀ :y#shJ\{*NYi\C? %nnaO00KPkX !+s7s*Obiip(Xd&hNbzM]Iծ5_uh.'@#H 2w-<|l⥔^n%rJ ǰ%8cm uY#@r8w(^چ^EQszBe_BnsW&wÇ9e`,&2Lw2cEiž3(Lc[wׄ5 $Rٸ{J@{$0JO8ΉP)h+3c{p:RBxgFMKʪu:=a[)sF)30k<+aDh#fs93ɛ+&fЖ#R7p5mZNQ%#/gԾÉ$6BL|W6>%2ppem F_|^xkHb0_@sw{䛏&niv!F8?R=\s 8ڿ'yL1D3H\|1K|NM)q61CFFK?[\z3(02b"iOФBC,MO(:7`\:#K*u m;񅍸V{m>XJ5l>L:qM/oぺT}WM>!0|fC,ʑ,pZ% )11Ĩ_? ʧ3:li Stsj֞hr Qh="}[{@+4;qX{@(B;>y9dyU$Fm C\/ſgOIENDB`u1f310.png000066400000000000000000000022001326020644600320040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d7IDATH_luyޮVg$@!hL/%ھe!ѸyxHlʲ9mǼu1Ab2ސ^8FQό]}۵y~A؁,([Ȯ!4}qwZqM {Z>\>1,~G&?R' 2AKFm_הY؃Bv^ WM HiTT+0iMbIXt7|Ӗ'5*weQRzF}s]lԈ\.uMKĸy^r?qгR؁_:?CҍK2hzYq0:ۢ/wQ^Q ۿ'/`̳}ZJ1ge|AQm`hf{V6<\x{WeYu1. M>*Өtph_1 J4& zzf,:XzOei#].q74ڃfcߺ/; nB_ג]+} _,6gskD'^XO'Յ~Sҕr1JŬ(_0mmbFw32*'(eu6}*-Iěk MNQL}w4VQ~ئn74QQ%6| M>7 Vw{Evh_x VPƋ"~)alC:D'yB-(f V'c_[d][S?G̢GoR3h-xEwD!mflI[ݲ#4r5,>ob(5#ȯȼGҜT.C^LCnqqe<'n%K؉~؃kjwGoT{E>Z~z_hG)G*˴\?Dzу-VqB8yejyMjEIENDB`u1f311.png000066400000000000000000000014201326020644600320100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKSqǿř7(I.X 2߄4 ^_ЫބFI(tL͡nλ]صm w<<lc 횣o7M Q2ѱ'̤iĆݧ}e5!14wS\~YGzyu`M}%mWm+y |ϙ z1eqLbL 5Q 7@}ⰱQs(k仍3LSI&8(TEҰf%^E'Q^i!.N:Iv?ɭ>>/XS@a4JN 2Ac}ȥ 1 6EՉ~!҂cNhC "dՉbpǶN'KH{ 瀪s}e)hQQuc Wp˒Eeh-לX:j.ܾUN8 PseK_+-{Yת̱mqjBu7;g-u>N?l d3'_9x8Odhl`Fp1:ۙr:˿\41)#.jI%֮&B*wIENDB`u1f312.png000066400000000000000000000013521326020644600320150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKLQ{g- @p邧 &(QMa%3F4n4 1j TP Uj()tz\  ?wܙ2nanP<\mrUFX3H~8~A>v\R]áϦ*EvonfOpOcv:6j|kv _ن\:6U2NIu7+t\6⫲:Yp&.<ɐ>-CxGoM^K*%ӎl+'۲dcx8(*Ãvq̄6/SFtقFWy2#c!W}ؐ~QYV,࣌c׭P<ੇEĈ[( Tq~10?/̍+hhFXm,r[_O4DkbI̢"5?'N)N#p~~ W&P.KƳV9l꺏4 @98,\8a5p4툮{6| <\k]At?i ڙ(DA]󥟬Mи,r1#>VWbIENDB`u1f313.png000066400000000000000000000012121326020644600320110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dAIDATHOHAܒZ.u.]BK!"[Hb T:uȴK( ֍+w= ZN\m< 3`D"t:}Pk] M//Kmtֺ"W1 m0 8 xg}92goJ/E}SY2{~!q=SbѮ 1{M}Mcvv?Rj8S ?=}q)q#{=TI0BD7TL-Sڃ#ƖIɆ CYIENDB`u1f314.png000066400000000000000000000015221326020644600320160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHKh\e޹3I3ӒIJӔicBT"*(!څVh ۍ((. tFąBAb>n<66C:R'׽sIfj=pw{H&1q^_*D%>!Kmmm4!m%>ؕeC]u\)sƆYx{_̉>3zc'< eY< [>{QA{{'yP Z׹O$Zd#sd2yەzcq/Ѱ* HhԫRX(MN>VߕlecfV0^),vUtVM+9U) XR06N|>€,P)m; | ?uPQP(wo~Pa*Z lNk_edƠ*pRJn@OoD=<pr0Ə899yzCRdfVyup쨟_Tz,Z) 0G,.xQ yɁ Á WBdde^)&eY="#"-JtSbE^n"mҟ:Z-_? MIENDB`u1f315.png000066400000000000000000000010221326020644600320120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHֿkaysc!&Zm+4 "Eg]m,`r&ش>}{}{Nk2UdjmkۛePb I %><[7x- <9 !E}Ćl|Ǹ \Ƹ$#nhzYPGgҍbME>3{ xԓa_(ZB82V&>Z4ncIENDB`u1f316.png000066400000000000000000000014531326020644600320230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHU]HSa~l;s.+O:p9tPY]EFTA]ueZ曆YH`JG*(fFK*4r4ׅn8As=wG]zz!+%OOKFYՈ8Owww`1 wiЦ5)Qxc[MVx{Qˢ(YamQ<~i$ͮcA'EQ|57|LJ3--*f#%B93? W \EPY8i(6;<<Kt) K˥%(8 *R,IR@Aܸq gM'p nqbDɐ($( |.]q⨎4 ZgKoX,3 VƧ :ԗ:?ѱI"B)8Au!7 `* F#1 038ƘNLn((էk&YQ6z%}\A׌Ɉ܉Ϣo?qj|" vB:j-07="!,qbXOȿ|qhy3$(op63裄s===1";Ylm٘ynZSu:aߒ0;s- 70¡Ɲ9F)cEQPo(.ÚT ځ0gnid 'ĩ; [?/j:eu]s72+h5ҙX*ZZɫoO&$ɧ U?ȣg҅5+ `(G*n>~M, ;lm<"AӵA l!N18&` BTU\#o\-3sIENDB`u1f318.png000066400000000000000000000014151326020644600320230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOHTQ}8cMT" mFTIѿEDڄ.?RjQUZ?T0ֲQ7Ԣ"Myoms1}]=BEӢjR#n/ CK;HӑӐ)_:{LD<7Qsm5'Tޭ^nkYR-ZZBnO~WoL=~o~8%ܚG@Vq#ЎҎ7IvDz mvef߹hXsdgxH?/Y6{N/$iX]?\^ۧSNyn<JR_V'Ar2LʙτU*m+8@ʁDlPh$#=TkrDŽU,%sVZ($S^c ՟uw/.LӰW5Ɇ޾qkN00 awGePv7&Gf"a\=BAZ:zbEo}ơ6jqńIENDB`u1f319.png000066400000000000000000000010531326020644600320220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͔AkSA3/ H}A "tQ(D,p.\v벿@D ZEq!HZ"Tjͻ.j1I \`jg:; d r:A[a7Q[p,ǻ=jቈTG8@EzY93lF71E/k޴$de _ L6zܧ;i֤[ok!5ݸ {{.7O1@$X6cW̜1cuR^W6X93샡@ݴEMm@/A1c.)Z< 6÷^ b?\>K1*M![̆3@p3>hG4fggIRRA{ò,888`mmq]799"类DNOO JFAV봈m?8sssr9 B/LRToHDR7|8z ai044### DOeY֌RǞn`ppyFd2I&aO}ߏJH$60~X,HLLLptt j[bTUןf5}f5M8{ p_DyWkVi;πBYqe' "iڣ\.r0]ry?:F}UBn{㫢X,aSJ<٢}?"a{r9h2єIENDB`u1f31b.png000066400000000000000000000012561326020644600321000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|deIDATHKQw AB1 vjH Z?h* "h%Va "\aa&*VR6Gg|ǩ=99_\ Tw3:>CWYB&aUL0* rLڿ|[-ad,H}`G5+B'H0RQ -.QIYJHbEU`yB<0s~_"pz]LXc]eeŪ4f3H'kyֵ SOIT[ZYm{bR 0;\^W촅d.mSO]Ϲtlex4G<i/;\wʀ]Ȅw(UZ{mNAWlSv~|I0\v|^D1J#pb "wǵ"ud&@G]:ȈMG$ʃ9Lt,yQvƴx-sٗgi@_DS׼9)m>P>h*=-fI5!{aaYZ3IENDB`u1f31c.png000066400000000000000000000012471326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d^IDATHKTQ?qDgTL]dBAV*D -\AP6Q!θEA MGR2b̙wia#3{Λ9{|?{޽BgzuD]8Qhh>u4^Sk7&_+Mi| Q2s\y!hGL WTbН{:A;$j[[5kaõYE{$(]Uf8&*@]Apª \4 zT; 6ba ^VI!Х˸/hyGA-43h?젬mS/qn[X\5>GPf-cy2dRهJHc5qi(dd c@.2A8$U˯P[XdXTڴ8K07t!LT)AMA82b 4lvUݫ+ ^4͟fW(v!|檪e`~ťicI?*ߐZW D3*qdC**So(y$ƅMZIENDB`u1f31d.png000066400000000000000000000014561326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkSY?羼&̠XFV RuPF*0Bp 2ܸP(Tt2cS옊M^$_M{s;'ԁG[m( k%p4\X"593=%L\l~?mNg`4•iVi$ZM#98 2#ˬ7Y/\ "1ߟų}}We^+tH,2f< m(wL1ae ɭѭ8w;j~|i/2NN3Bpd&~XeBSCp?n<9v6%K BjmNS! -Zk*2JC" *=63>=bUv7̦9\UJ d]Ql{7vU$ F΅.M!g="AYʮFKx^ ?æ,rG}'?a){7ӜFk"Ѱ ǥ{l<G[|g9HkY_Q+^.c@b*}@ftCɅcoHCu Aoh2翢\edh*YvODPM P߭Y)SUh3-ہ(VpBZNz޵ 9MIENDB`u1f31e.png000066400000000000000000000022251326020644600321000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dLIDATH[Uwx2-&Xtpˤ |o(DVN/"(j b˝kϣeӏS]=x @EvfE ɞ",IA2qG8y>!nSO;ǧ;{7]zCXěހ7Wռ}0vTLq pи\ʀlwiw5vU3U>7h1..bֵOـ_8!h ևЕX?OrL̜aO"Lޖ5?*:x0;hDrܒ๠6m]ٛO (4 As>Gگ'˾'ҳB/13?ϰ[@ɢ{}0XW _Qd|(kE1s1@e#+i>XbqFU jwk_-7BBm0vwi>a J1o>ϤrCoM;1RzT̳~rZFCo;S JlO?i{? X9q/atzGZ's*.(0S+@~ "&2; Xa=wF\=fo;6E\P8)e+3)^ikwTSfI%KZ@Z@OZ*Ns嘹Y`N c-sʺfmBC@ؽ3#zUx.=L@!ObQKm 4Yl(H`g5sxnDc5 +X#Wѻv X0*q bڶ[7f-o23=lC -䙆+Fԉ-+%5i[ iiKɵSNh׋^:TC&F`)pa VTv:͕aUB.Q]U!|x@?őc?ƁƆ =yIlLv#DK.ЫlAe ew±D6+jqTlJRAz,QdW'S៵/GXW# m6+L kُ ¬Ӿl<] M@+(d=@[`=mNiڑ-ҏ^ְk,G󯧶կ# {kƿ'E*IENDB`u1f320.png000066400000000000000000000017501326020644600320160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՒ]hey7ivBYYKAt le(@s EUNx!@Z~mNi d6o~< 6]mOT4˩2P>}ehCCd=WaB/1se}mA#mjسut_IPGf+uVi]'a?3q#8׈H0 um1Z)dSd٪IZHt:v-8=~Qy"L[Mz] Y`^ 4@ 4Q}A ,ŚrAJ0rѱV'+3kMy=E^_YuƮ:tIn$0^rh])윣Qj u0EKz ~/fwaIENDB`u1f321.png000066400000000000000000000012031326020644600320100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d:IDATHMkQ{3DLIC$U /t'V("Ci~L *XWZ bS 5q&|\BMNڜ幼ypI ߜ[.Uu?M'Gnl$ٌ>L;lMƂK3ZXMh'<.fm]ǻHD-ܢH`/AQĄ_@S:6("׀m bFsACհE D$"j1jS+ijx|^\n!M@ G Ro|cķ';/ Q09bƃ̽Y9=;C~(~Qd" ", RP2`%sX ] Ё!Zӻ>ӻ2|X`Hfjf@;}#hA.p{kW]99}POdy~Zڞ4[[l|NHm;=\:MQ tڴPȎ$6PIENDB`u1f324.png000066400000000000000000000016761326020644600320310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|duIDATH]heyߤIv֖Y^ ʊsVSM0PP+N( ͜;UaC C~i%x ssC{hl՛ @AxhX lt#@=uECm^d{6A8q,Rm tl|̡~Z76C1{ @O;{ m`b?((u@} 93|XWX.H+/p2qdT 269,3 'N~'L鏣WܾF՝w JF+lᡋ(\[l&K"bW=r~T?tTwcd~Љ 7*cTν|>ҙLǜ1l\_AY0 Y*!\e&f<9s ƜEc\YPÍ]ӂeԔ( ].c4;(P ]HomhY!Xתj~5v2lux?l3`|GmJpNQn:IENDB`u1f325.png000066400000000000000000000014051326020644600320200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKhTg3Lt"Wx"JEসTAJ[ݴE\(0^.D-^LKSdt2s\h1Mw_=پxJ0w\6ܵ]m_}$9ٝ~B_*MFX;ӽ֚4!9$jbevdOI1}ģ̃_h?7̎QDD7)-@ȽmtTKTUf&S,_J.aUAT)Ku|PٳQ&AC, \ S8uMd ٿ~:Obh9.GJ!f\$s =! 唙@G]_/6Ԋ9r=q5n !Bx˻Qy}J1K}-Au䢥-+ #*t+4_ K4?T<{h{ H8fR6Kұ_2JGd[8E a6MPy3~<`:!;+C6Ѧ&# sd˹/ɏ]5;T<09Lrns76z~Kk?GZ4[߅q<ϲ3lspID_ϗ3om ’ IENDB`u1f326.png000066400000000000000000000017351326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmhe}:^4M %+VDSC Z}C_?(F``ыg- 1h:';'͝sslngS{us(} Юmi&U@O<a j~gT˜@ ?& tj^TE-3Gӹ/B] "Y9ѽɁV\81tΝ}!`<(LCTbOq*rM6Kmq7k;hU u'/LR4r г~AГξVjx| RKI5,kQ2@e Dœ WV#ƥdF{- hIJpg)wj־_5A5O@Bi_+=/}pC6x{LN$?׮aDHe\4E=9ʹ˱7Ҟ/ztDn83F*糥5G[㜋SLuHe3fo|ք^tL kjbؓbnݺϨ%:c gbh!<_o?k`GRk3;|5{6ϳZ5XwNr+ڿ}u;>5rJDVg-bFH9R2}9<0R CZ1<vTo-t/0IENDB`u1f327.png000066400000000000000000000016501326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d_IDATHOhe73?IȟHb[PRCB؃"MB@z{+ЃM 롦Aԋ` ZK#4Od3;z(f.}yf>Ndn-F8])g:::'52z1TDTO+?Z'w@=gQh[] ,.i^ 85-/7ۡ*S[ȕV{{{e{lzhTNoXʧ@r2;? KK=aHW`R:D]|[%G7 /Y4_,aa9"Jb;踱,>bƺ͗W׸}\so|bw陝b @)(Ҍc+hHhA\1]5撘Pc/ζR ?T71dHP[}}7s1]UUJA3u]x]߽ ǫ̙T&><~fm*}4WV踠Pj[[I[];y!%ѡ Zċ"Rɿ1"9I;SPVys >JDZ7P "g]c#5? T&NM xG'ˎpQK"b豩^N|0 *;'tTGCz&7jj][Bd|xVn3s:{^CsC]Z9I;(m *wܞzhzKM.giIENDB`u1f328.png000066400000000000000000000020331326020644600320210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlTe;s;v D1(DF7h4.\` BL\BY5@kX+41&D14E&)t^t:vj)SY~{r#3LF礑8X. jA lnpd3Kl0T*- i[~ʷř usxoA&B%ae0PU,̦p1_ZJo "F4RZ@3\m5[na74 n7 <(* ut֓ Pqty6AZDUtZ^)&5x,zMn\&_vc4ѱt]*{'~'nn4@(TPy8-8W5&<dci#r&Ll{žD%_{qĒU_O+.@S`1^P3AhtTZZ$?ܴ5X1܈F7WgsZ"Ǣ kUKtu H$| ##N0QlG#MU:U9XEUC{$j^,Uqv:m*$UIZ#:2<߰R(!^Qv /w7l[UeO_>Ó`ǩq *Ou@=9&~}"¥F`UX)pЪ|5m+*eW3Yf` RD䗠9}]Q?H?ʰ gIlZ5 uGFgl|"'J>&y`lcF}HIENDB`u1f329.png000066400000000000000000000014451326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMh\U>2IL&hL*( (7.DAD q+ AU⪸p"h( mN*М=sy{€hGSc*N#uD?7>O'Y.cHI6P7šu۞"dяw:T?5pj. ozEԜxmD~kj0Y#`t iQѥkpg5ON0F:Ϧ ҥ?S7aPrĸw[Vi0Oz~BVJ mwsZ96@Fvгaj[6Mk|uqy-߹䍎3*qF6 ^vJkkts8<%Tk6lYQ Sv#NPm4T7d #F5\\v9QQߓF.Oʿrnv뵗 |$$s~ZA_@.Y>vp4on#B߳i>`&+rAd0޷ wmp fTG/$~IZ PE-pl` ~/>ij#bޑ#K=gt0r03o4t~N\iJKr朡~a F>vsr׽nй:W|t}z{IENDB`u1f32a.png000066400000000000000000000023131326020644600320730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHS[h\U]{;L&II&}ش*4}?j--R ~"~!)Pm P|Dfֶ46Mfd23wqc:c2Nk+9ku{իVFHNFsj=8s"1iN-Ran]XPB"Ŧ8SiI^&g:#`5<@'z:UB|f*ݛXB'Ut3s+ #LOO<rݣy蚆s2f!<~]C_4H0P'Iyy`#Oi<~CGkI؎ OʦXۃG$0Ӆr<,SM5' 7 ;t18g L)Vp\! 4@I &{1ϛ}z#JU @_,1TmSDVR)@XNUˆ# %TƠ4BYv 5]43/oqp\lYG7H|h+2rB\cJV,fqDaMoēSM'&׶m+"J~wkŢY74] Cip]qbm_`;Ec?'Mq|>n`*=t6Bef;uB4/EerxE4ȎMN-I<w;W<G4yX*q'gb, _]Tj&gӰG{jC܏¤|{ˆ5K*coplEjjp\UUsK;뚋v`dxF7ۤ1Akoޔ]aӲ#G<U]u^r޴X 4~m^5XG\{5y-)^7 }9RŚ}?;h帉e,s֭mU޷9y2a MC;R{Z$WB0[읠q^AKRPerxT-+<,E|:;gƹsfKt`fϵ6Ecc]GF89McvƓwD,~u\~)奵xX 1ͨ^T.puqXOt6eq϶W=~G?zٽ =Q(s,a Nà&AO,zz{3#+ X[[ 043}f3aXPq~oSNfFIlfqS). Y @@0A0.oaQd)_jG'hCJ 3K)P|}ϲ<@vf%?FJ}5q绹V~arl!sڠ軟mzޢZW bF)uvpw2=IENDB`u1f32c.png000066400000000000000000000016521326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|daIDATH͕Mh\U;3Lf'4 [if B(BZ * ERuBAV#Evf&)ۂ!̽s1I4$d:|>}9JKC戨|^3?_zi],tTR͵\<]lGA#|phxۤr҅;͚=èʎ5#;F쥶"8 c ہHCݼ(Y%N@6M yk4@=1e뭱31-wr~.~5߱}:<h1!YRwtOZoZ"}kV*__͏"TZ(9Wΰ];JXvSMop[ݯ4;tSH -u̴K}|pќ3hZRs@ *b cy>q@.;Snj *됊"MFLF%?΢3 [GȽi3UB\FGǷ!kީ_V,V5@+FDwq_jL:j{=?]Y^COWu,` a|sޏ7Dj FM.Ԋn;\Z Il@AuxȖV'T' mlԗ̻l:Ųo8C|ؾvR _&(v—"9ˋ̇^_ X6bF'?9tr:Ɲ< <_5MQ4?qAˏ:/P=?< |c!2g-WW:Wo+>S\#ED$ܯWJV.#+00 J\8,,<5ebzȮĸmCn,\;p2d2zvD9aVj֝%WBIENDB`u1f32e.png000066400000000000000000000020051326020644600320750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͔KL\e?̙ qzKKM e҆ B7j&&i4&.L0ƦFӅڸХڋXE-0)af3g?s!R.w>=׶q5oiA˻tGFJlj}a,lt9ЦmM ~xBtPi8yvgh|kۋ`~`[KãڳdsShDM8bY_[~yĹOM۩^ ]00LYy5am.6؛ƅ4{ p^H-|uw& wKCgǂ5aC~\`HdICנKӂeSVqo}e@@ @qKcG_%$݅ÃI#8.f6~r'tͽ,WDωaya5Rqɕ2u]"̎hlvu-20\LTw8{rGr4?;`\vc(`|X$yo]"'KKe h%e𒏨{ɆhsIAgds;V5#=2ҫ5v/`3G,"׻X 'jeaj8Ocw!%h wl>ymCNuVJ"NmmZN2IENDB`u1f32f.png000066400000000000000000000021161326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlTU;ܡ3E@AK>ƀhb5R%1$Idʅ Ê)R<T4(P(BZN{c Fwr{.q>RjQ"_PУZVs雛_" cC ܈n+V3hEzч[Ѭ_S* X{`xXj| p퇪o&p](D8k^*j5#]WH\E$R ͝k莲it҆ڹUJ> )%b}z6c969UᲺ'bR &b'igZ)gve8TJ{̿ DJ hˣEu@ DJtb;~7\(OC?e;,bFxtk,&Ek,|+$LO ITJ%N\y7Ekk3ܖT:KI٬JQUԶIJ 9iu̦4䷓=R)YNB)sOm> ~`(/S)a~m͞QqU}3V&6zR5N&>waa& Cq2d[8Ց1nOej>/A(//< \DxG!"}hQ{V'lRNR;ܴ͡\. 0+}Ejzv-B /?cknr ~V!q00Mq e ز8Hs۶"C Tᗟ/b۩x,k2ͩ, pƌT=a؆߀l;PlZ0;7nʻG)}Sz\|5v\ߕB툖 KK{x/KڶRF(=?;OrZJKwejNKK 斃NZr4 @kkgvar|eM%f3>]\eRjMWu]zGS¢W;Ku_nnN2알'SgnMEx7_s[~@RCu=`gLpRI7 D]9.KSp@!KOkTexWO}DpIENDB`u1f331.png000066400000000000000000000013211326020644600320120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKHTacL2"ТE -i6BC)-Kܵ)j"B,L".T"8k1Y4x_L22]^ouQ? ";QR@LU%{61݂)/o?kb,$lUFm}n]hztb0eʥOWzD*8E*|ՖYaV.Xhp]=(F|yGZwvv]c8jÇ7:KyRNOkw++7s9<3%r /)L/c!jm3mnsz4y -* }dV20$:)BuA4)DŽV# 5`k@*PA%>EK7Ӏ#B]e7Ʈǭ$Ub*zm"hP!jڃf1_W$] Hy/z{bx`8(:&U b@'@Uٵ*gJ1g0U_`accc$M8zY[l*߭>QѓkkQ( Ƚ'Ȏ{M5!O˕>? o7IENDB`u1f332.png000066400000000000000000000015351326020644600320220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_h\UsJMb I[VP"F"-}P>UzM^ "S &EAk JB-iM,n=Ú6]o073gνsoۉ#ۜ)Adǰ?s8h %xƠڎ5l7~Άc̦p;U ^s׿N >ؐ;kRTJ^%Y+3e(_'4v0/Un9Jzsbxii!z6ąZNdVD ЇrGMкxO2E t8=4J2Zfˠ(ZKOĠV/_*"NSQ(Aܳb8n K|Sp^982W%=AՒL֣jbUghN~\`=PuIaz *ZCS]J PWH3z~׻oȼz;싨4nl,̇q*_U GC'o&xAk`=[,rcLXONߚ(60w.enuaCJBx7zvm2H^U5"98p2bV7^ٕCyh&xyL;_p7˵ KS+:e?y؊%Yj'%/Y?\=us L45ޛy(Jbx='@vrձ/WqrX,jܨ)SIENDB`u1f333.png000066400000000000000000000014231326020644600320170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]La{ ;ڸ!, 5E)n\pv%S(&Fč\lQA*\(h7jwv9qa;kgf?W<`cPۻRzIELxᇯqHB5X@Ȱ{]t+c*$^l2bɦ_+GW`b \ˆ6qû7yzRB*}"YWUE92nM| Hɉ2Im34m}I"ZS 5 o}J[_Mu Fsz CCcP>zD8ko8f-->z7g1 «.w%*s2H0uA:GbFi( JY lM4&z_֔m"VkA27t~y5yANdF hL`L pEdU<3~ ۠0"Ԍmx׿2.Ev?lcӼlb=|1c2: / D?Hiy<{v{׾=Zџtma2#vqՒ׏|#hK"3Mnw4t8縄_/Z񢎄O!Rd[&rxD|u}$kp `0:QTKS!79T(4r䔨.GVï{+zwH,@- цAwC F6m-R T׮ц؁>dsqz;:j᪠?7^M^{oWM!?u(ZH`zlLK0ECA_-+;8at)V]GLk_7o@q̷c}0ε9qrsL1@G_}m{VIENDB`u1f335.png000066400000000000000000000026771326020644600320350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dvIDATHYlUs~w~Bm5"`т %A1F6ʃ擸% 1".$& kJm/{{{o9E#y:9gf~3g2H\M-LX _Geۭ?toC,fƶwɜ?̊+X𾦥T_g9_#S}Ɗ?koijBV"JB\۴~1 )9Nfi:cte=:te~騯?fƃ2cA !I6Td ]uSIIT}})uj/ K~Ƽb1W XV op>iZAxec-D#:&2̀ 'NYWI0)j`p4,`R(\J*B+4`,W159;aTBh"b!T>0x ˏI,3Lc^44,7/f f7Dn8}<&n:ӯ)u1?ug86=lPEB,gGD=@$~fS")-d\~ 36c=}$#(.f?iW{ʦ%e!I2G?oblazTPIENDB`u1f336.png000066400000000000000000000012771326020644600320310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dvIDATHTKTQΝތ?ҍ3M1e& !֦vR"OBe%a(MHf%EQ ( jy4׸l.|߹{]6JQ{_0@sGŻ:^<+`(5)5>_IA{RˠKHȯW٣NO%Tv\3YhkDh<޺զ&ox $Pt0t>R!NpΜq}[7p%g#9=Ug]EՓ^!ײ}0槠&ں} TGР-X8#>= L%lKR\Yc}c*TgAx|@@)Νq}K5ۣƘ4e,HIxr"q}39 T@#!f(ftdki*ۛ k _F^rt@QlƬXhHӂ5jI$>dS[ (A-=k2,}5, W!E}q82A} MIV,K.0p@QtGYH)2e |'wH?_2/IENDB`u1f337.png000066400000000000000000000014451326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKhQsak*H$P>WZvRŅ0 **IEp "X Q) P4FZkr%L;sssu5#Ah7UgY0oC{^b/72 _t/"E<x%nNNaa IRpM@s gӡO\"1&0Pʘ4a22YE#J@ DUf.M  #tQ.^T &쌄lPU)h-`U4ASޫ"_=#p>BG(sٷ1?H&$47ʘo$0am-L#faM9]wO'ʈ8).["ۭ)\],zcTs'7]ѺCKgYߙ##yݕo6,u,=َ_юH`jԠ\ꭖ&=gNpc]Oģu2-eReh&:V[w4Y6 %$3c2Z:/UC^uu b&ƾsp8P DX{:_jrBYsޭ"Sᄻ*kM|^y(xqԑS֏->FIENDB`u1f338.png000066400000000000000000000015461326020644600320320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmTe;3.&#ibIB} !&$ZkvP(چe F;JO} zjYIIe7mfv{9}pqΝ ϧs;sPT-Z԰Ք6۱5:&x >U-SB=ܛ|7Hk8ֻBQ;ʑ ̎JzcM5~b6pYw_|Z*KT=B=SG|g* ht@rͽdO|rîQOxu͓bac9+e#w'$:G@ R1'5xALRg$8lLkR'nKΩ.ê0Yf-3pjN#(GB,>Q͓wY4!Q=fm3:jB=+L tn)^ $]t9~hBy5zgVp<) 3>t=XorS~It%JǠkлg<{ 𼇙2R.39<e4h 'ԸC͑pz? rd?fRmrz0v/,T{.?w< U՛0`|T, T%S *!B}ö;!o},-ʏe})S.@,7~P]SM?&_}HnНBr75[mRоX*_ݿ6/6`IENDB`u1f339.png000066400000000000000000000025271326020644600320330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlU{gc;$n&i)!Ć@lE$,AHE,A DKC}WiӐ4S;qcg.8;ss{ν`駵ᥥg# p6ns]EIb?̿1l-.k 8y«Hy^KHϰ7źS 9.M͒H q \vR=>J˻wtzɮr4 v) ;6bq\`!W;o([1kTv߶MJ6J)RJ%Mr?_)rd\J/:{idW T lWX&}2'H[ܢJƙ\6)=@[p$+v^$_*sb| 12KW2^ tMG >w'%Jti 62JlS~XA5F\!k >:{SUYt)(U&qyw$ZMtFYד /re&@ffF])cyjXvl6)FRX*cl/hkCAN7vQq]e*\)W *(yw%R"߸$kC\{Nsi$I-rh  *b}5罛5)AaZ׏|5l!+{Cl @#Μɾ)!xB~Z3Kgqml}44usi~qW ?31:7?d.-bIENDB`u1f33a.png000066400000000000000000000021241326020644600320740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATH[lTUϙK;wz5DiP%/ @J*̽3g^>NSlj*y$" 0ѱ=[IvlO:mHd^_:K}\%IM)'ɭ?f5 O%H);Og2BJvf9,p 8"Vo d݇gD>#=& 3!ԩҩߓ;7L} zRikckϧWxi8" Zp.,aJNS|= RbrB;r[:̟hLZi]t3E -Hxy;-C1qeH+y8.^T `KXu @b2lbb<{Rl5]h .v/ |3iŸ%ݷPB  CPOAE5W$2Q P^q v}1m44W@1IeMhˏYn6W =ɡgb\2 96f3Kڐk|y{U 0}ᇞLQrbD$*&P"o\KzlgUWHzXBSA3qִJzl'u׿7|Ԏ+="B{`P0&ݵR +yi{/2ذz9mb}:cV -:@/n]@3ۜE җ:f5tJӒWcR@ cN҃ |F&_uiح BvgbCLv^xϏN-nReXO8oe96ŠLpq´a\NuYIENDB`u1f33b.png000066400000000000000000000022031326020644600320730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d:IDATHYlTeۙ3t2SAcV`(*}0I0QQc >` o4!F\@ "e.,-Ss.LJ S:RdDf"~on`w(GB~?]2}1?ўJYցV9_؏+{u) !N8mfY,D}1;UH*DE?>E ptM" 6T4ס4X6FExl$ZeifO_b ui=2 78]\ELk'W9ױDžcxk,Ьhn̋ſixb-k8v" џ:5Jг 'a+Sz4_||/@+٠aұj-3u .ML%wOlM-7TZ ~^@ LVXys;*%cOZ//jr3z<n;]KS|j$VȆ| O+%yFwxCdNN!D{hYځ)`*nFE%B%&U}`Q˥hF''rG@v(.,oԭ\ yI!ڇ~bvbI|?,t<;2f4z茹U:髆aS-?pkϡŇ ݙN[nXb1F}Ꚛ~6EܤBi!"lhZUp1gVzDr[EeDحomی X-ПNqpdݝ]njL9m]_o65wQQaۛ&Ϛզ\;o4?ŧAtIENDB`u1f33c.png000066400000000000000000000015261326020644600321030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATH[hTW3dF MK RkQf"3Am>9(86P_KPJ-DA[%B4䜽Pg9G"Z9C _/k'wq&";`y 쬩R!DC4/p:R1pÙB3麾vZ(wʖh|{쬩x"/ s "xnX*C4LאQ}`*qMBDa ksCam-u[]u3eYrǫHy( 0pߜS?R8DӬ"`,r+[ּS$Ulh(ȣ1êLTXMyᡪxu,116SVy)( L+Y*s1SnԘI_nj*7~q]BsOUء]{?q3n[󳪬MVyϛ`F O.zx{93 r$БQ QUhJYY A־9.KoNNlXom%3*qw8 zdO.jؗ=@Di+z+`#i BLKǑ/*#l']Hw3[$jWnDVQ_<ㅇ>>\ڷxZ] I۹̽%?v ,sQIENDB`u1f33d.png000066400000000000000000000022061326020644600321000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d=IDATHKlUomyƐhHEq1n\4pIhĤ.X6n]BQ*!ALtSZi>(3|߽L!={Ͻ{ϫ?uU9oW俀SP|t赤WŘz3j'dlNrT6εL7^P7ZUw=w1D`l , ـ#=NmAdrkWNbzBJJBvWKC;k?j@_[p~E[vO%>6-n$ m1Xmf-ͩ4fPQP^Q(nX9NotSZ 0 9LO`uK-$V+{}g6d ^4g!Ι !h-)DH `mW` !ʟKah"ʣdh% c:C*uhhG2(&йTnsn8(z낛L`C$YLazk$d87" W!=.+9`ׅx81+VӨʆMZ}6wF.Is?¬o9/a;! Z&cK=\*zNIHB[O0XWS !Gn;o:择:q3Wʡ>2Akoh9aBr OjR*x2CMhlQku#N1LL9u+_|x4ٜy+IIez33홟z]c! ;=>9_7 ʱ !hY"2Rr\uD;c ȓyiOgN )\p ;+߈H˪lx%Fe|Y+YWf a'w17ё_a;e!/B}Ks@[F&Tp( 8xvٛ KсR[-gE{C2TTUaNdYA?6K뙑Lj&D)y|ymF\)C(cӄBl'c:r|d7X=FсlS]Q`y`VuX7o1~ T>ʋ/B}{Qg| ټ40a}L%EHOl)R}}.wGcsoT֎bx2.AG9l|Tڬi1NOm8-ʭCX "[ ONw @Rc֧v2Zd,) ,hl۠*4" eK]Ȃ_^c֫e`\hb" 6@mxhFQ1;+߯1#SQeYsٛ1Fy~~vwd&`9Uîp|AY}L_{r`X <atA%t|Gbr75nN_/֬@]Qi~SI'{W_WZI)>zmw͙[$~b*0)fcD3pN};m~}B]%+_r^e, #̗9@49Q wxr.I&SIENDB`u1f33f.png000066400000000000000000000020201326020644600320740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[hUsnƦZ/UF"֚l _HӇ4i*4ɱRw#" ^(BbU-lbŪ)Z[SfMrap?3p^pdm)=\H8;GUc:@-V9]#ہZTC~ȣ+iX<\©AD6l߻@*-_fѫ&ӤUc[l:/U-+~5NApE^1j0J-l[ZΡӅ4[=G4(7!VkBm6K׽ EI\,L AI%tN_U%f6[mcSJ_ę>g'} Tg30WykR.j`ZQ+@sm14Cʒ=00oq]V*5Y `_aKWϔL ya l M6fwZkv.YS @H\ 8]y}'A0(S삙JzǤd:>ڞnylN<D35  ^0N Ix=͈BG]=h&wf-2[nn HW;]ߺچh^Q;Ї !ʛ*Gґ ^rۗR}Ȗ-0%U5eEEn?qgj@xc Vb #?(`p{%oV@d3-- bc/*2Aa;1Zi\v.Y\Zf£s >h2:҉WLAv<ƕօ? (L7A݁ȪH}: eNm{{ـ"N{:҉gAجcNyw#Pf3F1FfտSB-%8IENDB`u1f341.png000066400000000000000000000021411326020644600320140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOlTUf 3#-ԀŅJ!h11ƍ1pCYta J⿅+agbX` 1@J%H$D[hgEwq10mB;sHB1k6iw;X&LE\8{7_LTu𑠧F{taݷ|r/K|aΑ3z\9=]E-h &ˎrt0v6Wu0|_Y˅Ch@3FsRoI@Rr!#@[IZێ_~OUJ Lp F\/g9b1Hqmxl lS ~zG9$_Eإ[Pr^[AP- <9T-4|¼@6 Y;"@E )9L〺9"D?g8pJCڊ (PHJLGJyqH09%-[¼R*+_87PbhcDsq

D0nL0MJ<+BT {fx55_FV({ٌlgJI ZNK+vd&Zսn:FE..2PA6Z]!F$X|XE=?iKigf7u\zB,_X[k֮V e;UC"ze9mԚ/[>f^<\: ubk{at$\n}ֳ rIENDB`u1f342.png000066400000000000000000000014621326020644600320220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTUy3ʹT)Ѧ `FaVc@ܔ1&]&.k ҄  8D B-R:3{üi;I,9;?>/Zy1I'Z3}=Z ;_/Y2H6>Y3?e}IF4PQ`4ev5J:0q/=ižk0 ~*7kÅ, cDfJ0,;"mhQmt$@KaL[vd1k~)¹U=tu|\l:)\MtX{{Ǫ,T#D`iI;L NĖK1֊uM[$$ɹ+,G ~?àvWfsU6ewe.~1Chyz'άD4vpM7]A,˄Mqʟ+F= DAW`B9@MOH0"~;dw:m^ͽЋ+1X,v吇u⫶Mȱ՜FS ozGww7~RF )]YV5ӕZכgP/,17:%ցvRc cQ_L[} <x({w$#ZZ.>n}˳O*jv\ޛyڪ0~ [-Ŀ!P8bIENDB`u1f343.png000066400000000000000000000015631326020644600320250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d*IDATHk\e7sfLDmh! EENfV ART)8hhIzbvM] 2'i,[DRۘiZdf"d yV{>.й^3LlDܙϓ헫*drp<6bҹMIQ^W`vDɸgsιl+Xw^$[_]kj*F!d;Ԋhp)/쩶=S/+݁̾_^ ehw0.1(8iX*3_ `lh-T0:L#=;%'mB'~;*,`8fag3XzT&ubʬnY>5ފMA`Cy@) -"|A7`&m^0zZ\NaH'4ـXC }yeMQ KF-!a 9)E. ~Tk1k+;We@ss1 ťȉCgn\ybuźъxx ӻ:kyq2eA M],tA??gLR[ߨְ|x.җKw aV {vEKH?UuC#og'Ǹ87SR5 W^Zsosf*-˦C]r 7 >vlbs>`7bJgEGQhT<3T IENDB`u1f344.png000066400000000000000000000024121326020644600320200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[le盙u{-](-m@Jx 16A"`AM @/DBH(B[@Kٝ.ٙ9>,l[8o9g~; 6^TxyMYv.iA0`2 {_ 4oTekFyr=3 TD}x@TM &,~~9$}\p-^ju8dxѰ Ae`~8v?_8qe258+q4v-Z 5 p7O8(MϑJ32;d[˾{Ph)Z[湣Zgv<_MCY}WޠQ١2fJT"AiN!APs0PaiaC7=hIOZ既`p*J%%dʀAw_J su]%8s:,f0)44=Hmkڎ?g&d9nY R aݹ97JDC߄$Ø$kX`.ĞaQX.`- ; @S0ST:3vWFW#G}4bpFjـOʄ<[}kG$N9MN~)R,lXZ6BMSx$u+1(.1pe"^l@Vgr"bw$ ̍OG_ńYLQ`zH9L Lֹ`ߚH{'L6f8G<+u {|GRY*aԞA8U!c+0:VoY钹3h8p9mbBOޏzZD8ZmWRVkB2ƱBהM$(6pL!.QǏq.!P){&+xFQ|W 3nZg@ru`ĉQ8B=iyD"gv%j&N=UL4PTmGN{;V%{cuxJ\%hP0xٖjk˪uPY@6ðVl2'E\vIdy[ ^c۝F#M^Z0o{;r9EͶpʊy*WoU!FCvIENDB`u1f345.png000066400000000000000000000015471326020644600320310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoUs;_-e&0PD HB;L[c\HĘhX&6F255VEFZ1 "-a̼{ 8~=9ݜsrϒ{pzg i PBeBU#gm?.ߖT'^TT csAR’S2IQ0k2:JC*=]G6-hpw{aq ެm:7E;e0uhW*cZUN[Iڷ8 +'$&P3`oyWctM?@s$ᗗ6J>->Rk~O~>s:@2TecE"39[Jsİx>}qGq)o^r Bi[3DfR&{x>^d*HPB\6C|2\<$ =QLIiDbց ,[JY1dPCe`d#be+bqs+k-э)bbVjs/w{r|l.WW-p9:`/R\9K;r@_ƶ_9]lKv=946 h|Q=>Rx}=.ӳz`N%ݭo3eyΙjl|(h :w8Ϧ_پ X1wБIENDB`u1f346.png000066400000000000000000000014011326020644600320170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlLQ߹W[3ZZ#BZ!ah,< ,XJ aW,JWё@)0߭ _o_J(VSl/Dd)d3qzʧw5Vc(q &+Qm@vxt9&祗PlLpM%0vA-_OS-e{} 7d2ImS7xc8YT|a[-z\7/g%\o".'OpL ( N\e^p@t^:xz&[ w.@@ݵJlܧ ڛZҁkQ(-q'ZcgټE|*dJHv]|RTOD4I{Iȿ`mHaLuq ؙ&"cGK+)$2pP1C煌Ř27GyyIf;k<FťȊk+'$h(kKO=T"=a=X[G,uRh 3E!vyOX6{jơ~^MP%oc߾tk"kxq-"A=WԭzeWE~uz;*]h'Y$*uVOϧ8k>?F8IH!#F-5 E3)Ŧޚoj}u+A-Dgt P [P^-DylVT;^^ Tz!䱊(![8̦ZU.5$ɺDZB Q;Y$vʉPnMӊxak\Qz@Dv2Xd{w[X]U3,Lt$Xy/s4UbE@ְ3GȈsbF16!#!#F-)6;|Ťow8F~~ė G:ab]wܓ:δQ+N?TG"LHЛmK:&G37ܼv0PD@ sA)"y>6nIENDB`u1f348.png000066400000000000000000000026111326020644600320250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d@IDATHiLW}~ "۸ ( V%.56mѴ4զMm6vIJS-iDMFe "*PeMg" ƶy{{ssEv*~)xgةP4]@ce]͡򆢔C ~S/$>`TE )m2Ё*.C?Oj m1S<{^sA!U]P:kRK?al /Rl!IbHB @J~V|"m228&.].npKʑs3VfSUkY5ESKk wqt/ Su 'FoJOz1_a]~& ; zo oA{SLR`UIgWeK 5u|`^\X{A" 3TܳEegKe+2 zj69I@͜ yVe3#27mW@)Tޱd͚v|qǹ9s7Gv9q=g6D;c$D3m"-yb6[cB)X/%M ;N-歭*kC':Vd^p)>fME|cB3,ΚѮe(2NҤGg/=TԞS/*P8Ѹ5E).mXJSyU ~g1 f25ˬ_6;Z:I yP΍-3cI?]I7*f 65-k/0 YJٯ*T5 •\1Y3#Җ/pŽ>-Yx! ɱA׋=.EUiI/>ղ}=ed]iev_RϾe[*oxMCD{ y4sE1E(#^@e׽-(1nF|61spՕU{9o4b% xF/]ur2k/g $d8_2bNnwuyG&-ڝ d[yAGw'FmONx:oͦzϴZ{cmMwi $t.DHt]u8GG7Vk)RBO'aSQ ,5_8qsn\BR%V([7W4_Q+MnٱyzIENDB`u1f349.png000066400000000000000000000022041326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d;IDATHՕilTUig:7c[ TK۰@, h4%ƀUB":JB(VlkRQVQlҖ23ut=s.ߥJXuy9 E {ZĭZ7\(C |+{N-tcI=5:Qm.R:doins H1jNMѾ!r2]=fnO,16/y*E,{Mhy?.WC Wft@1l1Id|T.^=_n@J0us:Y!C!4b/vtƠ郷lSuLN Z=U] ZINLG=Ѵso~Ƀ6,O)QVKڏ u&mMD{=b|c̒\ mvPULcTe|=hDQTPVbM짆GMeR8K/ô͝C_*߀$!ťO=xq]`<}u7l)3Aȓ 'J@+}nyCb3DKNge*Vct Aדi&1ZۛnlRt,`GU3CYAWP7-YU غީ)hՉSR`0y4GJ90#^wSUDYYY15B ]:c2si$>O`K@& %jl0x}ܶgMypEy^>XdF J+IKWQٷ[C$%f?f*y9Sͮpa{wT4tyy}` ^oZU Y*~y4LHd:HMI'=-ٖNt*.˻UUۃŧO%xD iSCI|^ GK JoBۥ.$2W(J(4F8[kBd{lIENDB`u1f34a.png000066400000000000000000000015261326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHAhTWsh$j6j#-Hhm%XgQmjBi1--"-f UĊdQZMLBR(bv&gEdf&[?ϹvTۇ TLR<~}bN#{|[ ">`*"HM' 6Xr/0M|ܛKL݉iAy-1Q)h|m1re7Sn6SxT&OM9*txm\LEz(MKlxcq~GH IENDB`u1f34b.png000066400000000000000000000013171326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKTQg83IBS}YP*ڕfB?h[p.V- k&JSsgy[\F={{{cbڻ&TZTu 0HA~ [)=  :o6E.tw n֜V8 dCZ_V }ƄX?Ud_P3ReԬ4]TcU{i@V!&;@ౙ}碇 s:`7 H92ƆGn%1/ӽDl@ҹ_|QV'͜A@2Yp(!R@CTuC@ة M(: Ch ['IԖ@t3:;)Bn`,^H>z4H鱙/C\<Űi5ːx3h!ZSö3s=V<eZ*-_ ;V$r Z3}*P6o-_:-vcddkҵMGh(E_0IF/'.,w'o6LoǛx0WrFm'}q &IENDB`u1f34c.png000066400000000000000000000021741326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d3IDATHŔMhƯ7T iRc,TAE,@jp!J AEP(ZH)XM&ך4yyfܙ{q$I7Y{ߙ*mӓ R[""^*E$+fN՟ O[RsHzcm\!0AJʏ &˧dZHR:EDF_~ `SedrUѢ_Oizfy jV ![*@)E_NW[>V\LI8n-T'y"uv2?,J~ qS$b7!Beyc9&Mo0cFc&- q$欄ݓLT<_ ADcpO06ְٯ&ȼĹiWT!Ɩ[De}Y -nl*[(25q+aF&@&B\@J8,R0- V4;9;Oz?M~&ͻb7owf깄oզ 1$$Ͱkp^0Lx Mꫝ];䖧jvAI+pmh@7+h-0 Ў1u"i#´X2e)f3oÜqk?@pVp 0 ÄaL;|tWܹ7#rEtۉ 02VQdϾ_g'?uS}kbCۮru_PC+ʹN@\Z3z1F=~ ;E{aݛ\ PJ+HB )b0FQP'}Z߿ EY¾ruwR2 MD4F̚`W6^jy5E Fq)|6!Exa`Fo]'6g@Q1BTG67#D>xg3nlsBMip|[-q8S SQΩ:׊|ޞ{l:t"{RH>g ug_+֍>驕by$1vkro +JRǝ/56|V4>EJ*-op.$ a[srziY%5؟s{!'s]q_+ ;{M:.GniOHsJOcraׯD rLZ UkMG kv¶ݰ}3ɃP|i~j6jR#*QDk6-xCWJٮB^I& !L敲 7 [?i0[9 t/B!U}w17n1E#˻.q?5akk=*b ՗oҜN6,iYv zv8;mĤ3ȝ— /`:Q<=oY #0Ho̓=Ҡr~%߉IENDB`u1f34e.png000066400000000000000000000014161326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKHQ盇Tfio,*SshDDЪVX E˨EQ (i"HK\&D~|6̄֜sϽ~XckYiH5H$4 S/'PfO;To#T 0orI )N \ܝxij+ga~rL k |L EsT~ ݩ}._\EE*F RlJ[6 V쮝 W)g9_}E*pXl3GG,>߲,`h`v$pG,;4mҚk7l$* }fhd8CqciE0|+/ w 1 a~ :؇sdAz(bJ^ R2P'Oa(0xp!ٙBgSJ1.6&PQw1cݗmy39Q(p)6͉@Ye!Paab5|٦@?/15H$; &|,; J},Lͼo/zm@MF cT&eZ]f^Оy=m9n5.폮\_ʒ  @`]aӆMF:#6q^rIENDB`u1f34f.png000066400000000000000000000014211326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[HQf,KEDQ$E&t*!%*nTDw+(=V kFo]֢ .`Y߃8n4s?0#G9\@L ~+4cQ)|[ X'Cƈg$pxڰ6SN8AQQ;HqzӺj8kh{Jᝣl>wg8G^o"Tdi1mhy;1TUUe a|Eu t#vTW4KOeDih'K(erona遾eQ}>c_ŬZWҵ =O֩g%y4Un` (ŶR/δvMccrgrsvˣ]:=Uw@f4i0mY܇P!FNĵ(\ZJ97hzb /Fh`!.J#{|e{b&GMmg6Y2=z0Up)xoD'26|!v AR)KO%_ 'e!GVW%r7%xZX5 ,s/S;=x$&( #!2Bxޣo %8Zt n)cYA]\> ꛌg.p ̫͢(Ͽk5HEg6W*R]_HM" ʳ:IENDB`u1f350.png000066400000000000000000000015771326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d6IDATHOhu?73;ndWA ,b!=B%쥠zzR`QI7Xl0IAD"b)MiIi<]fҝi~~~G;}]+Ye"%˿ξ nv^8 QcEFFVǣ8оۨyX+c#jsg ;a"؛*zp;LvMk|OSWa&OOlԄeH`\Mhra. 1`Vw0""z fG[|]Y`okܫ^]4>k dӻH1uR*S4>փ('?LU`z'CϢ`?ub0:GJ!:l+#>1Ģ]{U5o*XBXٽDPy8h 0uy4Zhw+m$(\##0MR/ kS^nXbk): Q9+{$% PNuϯnU<+&D |!׻;QsD/&kUr,v"G2;pSOC ˊR_{OaY[~UnL|psGm1=Lh _kj-_=i<2zvt|i .'8)IENDB`u1f351.png000066400000000000000000000017041326020644600320210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d{IDATHKlTuN"Z h4jbR +!iaӸ0F q856) @)Tih P[Xif`o?s 9k=&. @)#iWͨ9^6gπ-G{_^\iSqj H$&d E,,!$I9RiX~s桏$3g^znLuaVR]N Ib\! !/sH#7ϰ|~K7H\]'MktӠ UA^Z? 'Uծ!>?Ā| 8h Wdy[ X>c@Q2/E`2:M^q&2Crp wY)ٗvvȢ MiJBr4b;Wrh_4'dl&2bLrNd"6'X햶{]nˊSv2jFDKRkZ{ٰ >]mshk$1ϰ)%pl"^>Ʌ/OynEvqTFzJ Ӊ2=T{TewI^"N6.wWx;з}!~%IENDB`u1f353.png000066400000000000000000000023001326020644600320140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dwIDATHmLer^䀀/LI-52u˗0Js+7[kYmVAWAtM7ln|#HuT$G89pDv_yaTs ml,{\ށ JT'2Q浿5i ΀ў_\*zRyKU]2KEM4;6{sW1R>jШc n0J4_0.&!kЃhSx mќbQSqQHMc ˽Fr:^/NE 3Q ܙL%xp]]J=h3YȲ$lM=|<9Jo3#-\&*EfNh0bQM(ɽgq,j**)苀a{YB D-Vx ةii3se?p\v{ _9hRJBKV c61ˌ'd9UIYZO_9k{خq2wubFHk->P,IKc }/5=?ֈer{~vj1׍>!"4aD _QD,xqo%(ӢcQZx؝vJv_aQS!p/@m]'E +FkXi% ՟'r I 9:='ΚضN{e&#{9F?ۓX `O)Xûv{y ՝t8×3v0*eT "dg-.t ciJב*2}E T]nuM-ЉmR t b/{;[\[wj?F[t4Jۯ# zfsm/ BAUTPDTCnH*UQk+VP/qNRIA@ba>>~}8@y-sv/DNz?9uj~ oJ!}M}75zwVqJby>֗_-1T dHKs*DJ ÷I5z+Zc{qkmuo4@u{3OovRhp:kppz sӋK;=xT7vÚK|8DmX PM hNuH˟RūqmDqVA`rp\@AC'9\*$ݹ F;'cj+{x qk%uΤVAc&}ʑ?n誶}{|/ȥE, ^hbb8K;ͅШ-qoזf[啹YOPܘ (ۂTcB _N1<-|UW YuH(:G7M9{۫{Y-`b*ְt#!N1r0׸163TDS cU i"O%lx*}˶g@$qPq/. tslK t'LsQvDWnϬstT|en`i Ǵ6D)>H+I:괥QǴ*a(\aHX ;j5y6Q'M3!*PW)$&՚ۗ lMMw'`Pp⭆ӳ+&*yvDd!,j:-U[ÆkG2Y?gtU?ub6ŗ eKn0Ї4XiE\R4#9?]}GVpK-zy27|zo3fҌMME;MS Jq*çoG, %+^7% FJnZ_ }@%PJF5/isNo65IENDB`u1f355.png000066400000000000000000000021511326020644600320220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATH͕oU33;U-BD$n Bט腉^BDh7J@IEH P@km5;;;=^6-ʅ'9y?-97%G<xHuxЀ?oYqG!oqDR'V_ H)鞬U(ŽգݯS8bGս69Y*a8(J=_,|^qC ož#nމ$c!v,g_8HS{ 3/{Ds? ԤEPexCYCd.opWfxwק+:˨vp%lDDTK& (؝$!ڢ-@Bd)#b..^NNZC _$D0d`~pm4P i˙Tɲx!_7J;FAhjjfѾXY}aE꥿6;&N!ylģ)ۺ];齒Bټz6n>?a:Aك=c;!ˡc';_vm9yifM[h*u$Vm>zφo ET+@,ru;]EQ(O׽U3zивs]7_pq ?X@J|D͏xRth> @MD[G\{-7<IENDB`u1f356.png000066400000000000000000000015431326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[HaƟ}," j*!&$BI2 ;Au,:Ȣ.fq l` ` @Vj6P]G[WQ]g&&~ qIM rm~*I,h\|Ej9m;hfC A+:s2Tb%C{ʺ.AjT^ZZ*]ľlYq{,=a'[GBm,0A.%} ӾDQY^@ )Xjڸ2.a 3Q0[DX`ua?W[Lt//A5VWF`lZk|O#=Mi0K> MMTdO6+5kSMd$2!MOqP[.3NGԠUfəK^eOf<,&m> 2X1W ݝ/طks)d:Xh\,^$$<Mg^o? QA}vVZ ;vIENDB`u1f357.png000066400000000000000000000015071326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՔMhTgsf;qTLmff$c vԅtᢎ"E?Fآ [.RBi0PLbԹ3IfӅ ^qg=/|}ou-ۑAQ=l{dem=>\"[T7@̂1g*l 5~tʦk7f,#5 7f% kgڞY+w/0R=}jh/v6ՈM@x,_GYlb;p;DH~ʴI'9&Z?Q=o+W+'sN|bu J 4ƌtl^U*]뜁 ܎`'WpVb=%>O~_-?6!RUKVhnjݷ xr7/wtR-ZQc>UynCNMEN !4oHaHLw> u0UJpkWĚz:^2E_`JRw9ckYbWS%e{˃r_ {5"͠UXYG9ZV FF7 J|Lj_U.PᷗE1[Xv0B]E< Fڞ=ts*2 = 9q2U7읈Y߅XIENDB`u1f358.png000066400000000000000000000017121326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[L\Uρ)BbT@5bkƪ5VL`-5ZS_DQCb* ^ !hD_l iX"0 j 2 sa:#@Kmkp!#ew"`5#BLW v+m0~Yin_f@SR;2*2r>D3Vg(>{iE{}4P7k<QE o-< W! 6 ,ۇۉOAǃaCgy%MfFx-bW?0\W0pBT.AV:lw&׺]?{ N̢O3*O3?N|emxg]k7YSoMN}[Ǔ=Sz>`lZ-x^$3~)oh;S8*UQ95k62[kJfE=Şwmo s||3tӮ2JjQIENDB`u1f359.png000066400000000000000000000020671326020644600320340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[L\Uܸ@Q.4Ūijbjb}A#c KiB[5A@RBRqDrΜC)3̀ok_g#x4eBW !jA'&P !/D}E@Kt=J(DQ9D=SZzʖR8sXm]fM8Td_7mg$Lb`Oz/m%F.Rs P` !UlvG2 噆qmg7gqdl)..Km%͛W$ Pܗ n bwf`m-̍wN(o<= Z[]!Z½CIAWW;"{xd#v~`5DaaqRh%2|'xKPc(2_Ģa45Ŭ6 nܫqO6t\/I\Eq`yy64B$O>ڦc+v=@ZcR3ٰS,nn):_2v5KS8ӉV#!cΦSbdd)J }6ع?K_}R6#k),إd[XO'bi'RZZBiڌr܏655'g*gJH1o0vHV"WlG޶/R^S @$kt>tDXihaJUdhWVxf ҍ%[$\ڇn99ͻ@4v=xBK$4Hڣ1ScVwcYg}O]hi}&x Xt8`_XY }wOm۪  ^qڤ!S P+!a ~jx#.(;IENDB`u1f35a.png000066400000000000000000000016361326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dUIDATHMoU{bHcJ7QD I AwKPA]J,@b ء,VRaU4U%qIc&cg. S;w33ys޹ /yqz=ǽ$*Pv`U(Y k`U) H(i7JnONNO h6LZ IMlx^thJW}1N< ލx̿_o͎F[qM{n Ѻ=}"7NH$Rq|3??:8@"=s^"_B\=-\l{eFuf`5;lb9:Td`nzZqB~4tp'뚦dv9`i.X,~5dQ$ׁbmG1!lNTX3q,V5-cNoşjrmm-Je-ˢ 躎Y,q:QكJbL&C<'4 \u]duB)L&_iFI)O{W*e`P S)R8ktIENDB`u1f35b.png000066400000000000000000000020771326020644600321060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[le.;;{鰰ִ.Mk(4A 5%%Qy1Bˋ$&!ėkii(W7BKA!) PFt-X‚5/btBo>ٴ`ddd1a E/_Xv`:wm D2־ܑI~s0W_ĉ[o~T8xt:]u]ou*Sq==G?yŁEr :6Jzf dS޶mQOOTqoGG{k[[̙\ɜ$ؐ 6f۶bp03|b;v_ϿenYx<% L0 jM>'ϻŸ ޷3:U`˖-z$2~M !thk瀟 /w};oq.DIENDB`u1f35c.png000066400000000000000000000025241326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHklU}Kѭj/0Wp"d%(L-E/&Ihj /2'Cka ƶ[w۵e-?(d=! `pHH9 `*-@EVJ# nmRx>!h_}źj_R-flI\/w&ٻj+]]J2'ە%g̑Oc.nir.|zl8]U]?4>N~3jˆ!핻7>1b|Ffb`HPSUǩq_*:)RNhzZbk ǣfUWT:c3uQ~ yi,@߫8=h}c: '( ֗$N%қfO,HsuֺQ( 5&b]d E( Gb4H$G ky`Z8*Uz]<,[dRǝK7" +7˟n_H.4M3l}I8~?(_c9*JV38"SVZQEBqFjМ#3e(X|Gz4.ÿsc Q],]DBi+dY12t4⫳50Tu? f]ىYZ\PZ"j踁zΚ51֨ HМA %by;rp|g?yy;Zߏq, V]B=yc_a&Us0e06[v)ˏb# d2|*G#GO4]Tuy`mBwwԿYY@+];~۴zgO'B &s: %zs|a ^K{硧stwR7ϝ@xhuq $KY-;)3)IENDB`u1f35d.png000066400000000000000000000025251326020644600321060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATH[lg۩!mNZ$$E  *P i("QRqb'n\w . s9yF̼!>22ݚ0[E r'Ѝ׿Z*RMSEХ?CFx'1+?mQeoniZwu[PB.Lh@N0_ANYߣԜoغﶛl|JZX=usYS~=w }3g)2VӕΛU6ӚݦܚnwѴ9T xw>r+*&ݱ(Ǡ _̓wo=/\ DqUa>T1+Bo]+`ّn<rψB]U>sac^_NHFѧ7[()@3A~{@M_ˀWߚd"vC exR/;#yK66Rug4)Ǭj_ ԜφGŸ{ڿʙ72׮*--"f!UJ%fn;2ҶԮs4\zW[COX<[my~ /4?:NK7Uә 8-83 E2SLmj LD\XMi2 Yžn##;قFzS7h}٩.TZ [ {^4ع)8taу;NƋtNC<]hJj0jryәB…"Z dסR -'M \9@|Pq`σk9;.|>vz✄$Ogp^Et %u$pj쭉_qtP [%jzpS4gy۾ $ Yz>Ɵϸ8!')W bg,^juz}= !A&'^/D:ZF d2#YHjHBfąR,~ R;{bk]'R\X>%f|qmW[&ϑv\%}}E:_'03s IqָBJm$YƁ,bq[8Ԃ jm+:f{ <|kn"n5e{3:I *+JBV"iҦ[8N)G.Jz<ۤDCJcfr{}I瀰zSHԅqr.|c%^)-Im~ @~jlh|jŮG4dƖz@fWn_|݈ؒpueEx\ %m}iLGktQ(/.[u0XQFȥm3/gt1%dKq KQ1I'\t_`Q}< = 1uGg,cPGQ(6h&$Bx32BO`mpӳ(". PNK ΚlbT>BcEy8씨{; T%vX ^\_6}|uiw̲_j‹1#gCk[#OLow?*!$YCdIENDB`u1f35f.png000066400000000000000000000021331326020644600321030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoUϹwf޼i  PKkU~0aƕD]Q&ƅ C$.1b b '-@ mit[)<=~hl}`ȡj׹ٕT!Z۾fOVJh\B_9x 8a]~1]NYK2m dQriVrM^(F?( H&)jQ4U_B 2 t΅jCG"`LȂMb-ExY9V9W؅j4k+4vm.=(Hb7]p~cCGKoZDC `*rЭ*|AiAUah:J@Fޚ]HqbeF"0.k hD4ŠԫM6 Qs'K<)+yy~O\Z&qo&th G 5(ˌM:O[cnQnFrѽޱ8߲6|j{|@Ba q{_ JRx~_K}: }˫?}&? o Zծx0`B hڃ3 jt ᧭~y7u"IENDB`u1f360.png000066400000000000000000000014411326020644600320170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕKhS[#ۨ}؈H߃ŋ"Aԑ"TP,";{ (RU,V+5ڴ4&MLNr iO߉G9 dMm*+f#$IVw|A wEIԹg9b77ԔN Kvr6^QwsU{ǾL0E^)TxIsL5M `5D_m~̔ql3rKH{:B XK\q_f*Qt?҈\Eׯv r5WېM [uːjVFT/|!$) EbU% KͲ1_4 ]up z (+ob7d][YC=:'WUW}T+:(U->V +ۛtri}Ml Tf`IENDB`u1f361.png000066400000000000000000000015701326020644600320230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d/IDATH]le33n+bӤTF͢E"zmbb)x+1bshF`,E(Ʀbj Zܲ۝i%]{u|=73g_OSߟV<'9"Z Ժ+!,PKW3b`=`S6]k{: byV Kt L"_('aÑlFjuA[_Ť|">Rhe._tnp?_l{>EHi0GPJI>}ѣNYp@iM٢$;>f^"lbGs҅5hG"_D>͂\_`SCR1|N@/Cur,D䁜[{9n,Y!c %,y.$Xm#"?{ɔ-X_Od~&#I3{K]{ej|{{Evjpd`#/f[D9y4u3u:.SP( FNܜݯQ!0lRNseS˾M-oƬŧ$$:5Nf,/uk5{KM6MFMSM;C4`9ykJhl>K?I_ \/r̙՗^oW{Cߌ$ŷHvc5{|c@lƳK $ěJIENDB`u1f362.png000066400000000000000000000022361326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dUIDATHklU>}RA`0`0&E#ȣ1R?4mЀL 113 Hj>vݝ9~z;99s(=ߟzZa)fb Jhu]~ۺVݍMsL9 7lYӖZqRZ+T)tZn9&ڊL5Toj2фas2cDŽ_)sN( hU3u Ts!qSJ1+@P^܃hMJJ7\pTrF؍ݍ $,"1@m>=|gc7}^7lyM]RJPv=C.044Fʝ{Af_fҙX"dž~Ӧɮcf@GҬ@wTDn`uu^=_y3*)FDɋ"ck'nx%8;9?t_ۦRD*ʨ,FiM^:oJex^"^|W2(% ja ie`{hѾA:PJ5@Öu q~vVe(RO?X+aDx'̶ndh.gY=4Jz"6_ę,XTcr+Jϝ!bfe34%@򉭠t^ π %DݵT*̕+7eΚ!{Ǣr(w߫&?<OO%!2G;ݩɚ;hk.7/1Zo!"=xZxnω : [%C1kF[V_$0]MsöyD䗢iA{5>7Q2nU_mcAmEL/dL^0Ϛ=PQ̶1/GJB1xIPP,k,.n >G mJ 'fo>`q_|rʪvIENDB`u1f363.png000066400000000000000000000023001326020644600320150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dwIDATHMlUΝyB6 @Т$1hwbDDjwnF%j~ F )h(/XVڙ7s]eds~s9#ӧ;3hzܩ$\xf9-_TgfqNoj'fךB{D]VYc@'nN,uo1|CCj6w<ў! m=׀#Z#ֽ82snlZ22f0TT 'aŅyx8"55Eؓv(8E-% @v02V̈́[:4W곭wB/=ULcu'7#Ũk"v&Q@8sŔX*Skv|u`uЧ~+ZOFee5:p0jӈqh͜2Y p hw^,q>{sߟx({VkuTad󄥛DA4,o_tūo% =2bHzvQHRs4qp2vA/V$,M x Rg+Ӈ,"' HC"=6nG).U\>RDN )?/F' pv@gkS4LM3END[JMԑeč -nYf暲݅ z͐*z U7+ kRTQ6[qk [N)]|{077;G4Rr0ԉMsDžUc VhdIENDB`u1f364.png000066400000000000000000000011551326020644600320250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d$IDATH=hSQܛ(hAiU,hZA :8*H׊ԥ"EFl(A-iqQ$9HM;{|Åʑvv:Tws?BiÈje(z9y*3;ω0`qt BMԝ˵CSnAz>& knxv0zFc6%kdإ=z=X7"W5Y/T~Vѡu?mIx BC~|0z<땵Nj`88}Ӌ+*%p -E.dFc-ȱ &_Vޕe|gJ _ESh"+mEf_\[tTX_bq6trr 4֮+449MUA'r\v @VRdC3ϋZև_VJ7!'wΌr`> aؘ6{ċJSTe o-g ܽIENDB`u1f365.png000066400000000000000000000024011326020644600320210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTUe:mrP*(K'%(j)JDDy 1&7|h4cx@M1" (- ")eh\eY>L;Z_[1KܼyuR*! 0744fP3}c ~ :DBxvU7A.~\ki&E$J !{Vx{#BrN8Đ9cK3uF~@5D8>Ћ`>T8YOə@xA2mW#A`T]%L\ Ҵe2- 8CSYOl\ t&ˡ*mҞ$njiّ4ۭڅ+@H%Id<"fNuQXuK҈և@go:9;XTیw:Ket\nEϯ*sIaئdbUiٳ'EV}e+7kqe kpj/eD0֢"&~G/Ϭ'{溥[ ""Le5+X ?uA Sp8]*RP4 o%q$z‚5D0 D]VJǻvxȤ|Eo;zql'#3\:MJ͌#H۹?0_Y8!w>H8\K Zam'}]CȄj]HQ<=.;v0;qؗ52Lep-4́aԠ8g"9~+AKZVVf=x':KQeN!"MO)NIύ L8!M2S+QTuS^DnHww#JAUƒcm/y-@L]PITKŠQ=wZqFEɁwf#ض{E95 K^&ol8 4ͭшAdmW0A|+ͥG_7ZMd헃ZG"* rLQmE0-l6= @Hֿg%peS^Q"+do'ښ[ .Z j/ŦmTj/J5ëWrgSUIENDB`u1f366.png000066400000000000000000000012741326020644600320310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dsIDATH=kTA_2IBbl HA e ("AA&ڨ)d7f71Y޹3"͊9}s̙>RtZ)Z^.Kӯp `̕&P.=ۦgyE`H+ޘzvxOXD+֩d4XYYzs hkD^ēآ0 }#iL^GSvn8.űADZ"ڠYƑ"׷E1QJ:A?8rﲹ`fD ,oSNtY۳]\} B~Q%mWcJ!iX?bzIENDB`u1f367.png000066400000000000000000000021711326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d0IDATH[lE3߷t[,P,r-JhBx >HDŨ>(Dѐ4>X0(J`Ą&%*$ب)4t-Kd^вv43?7MQ,r.\ٶurYhxSS9}e~e]dCcMXu"aAkw:h~wFq-]7k@4ӼxRUQb#74Q2}V#k*=]8gMcM:7ו;Jּp_y'YJYD<|6 v"D32\mSJaDbՏE O6?{]|Ss-H|@ddflKem-wڎ4 p4&A(4,e<<(*u,\ =]`UP]!퀆b?vl.vۑm2zDNsStt;.zJ'-5@]>UȬd 3x|`g. e+ovTWnz{'-ȋ,y0׵o&5x oi:Cm{*Kwu3vkkےh4N4w18hnc+Oƹ!=/lm1庲ro` H"6v&=PKzjkkG'Ju jiR*nOswttt24ts4Dx< NJyy  d8Kzz.qB~d H$gΜ9̘QJII'W9%oRg w38Xt:mۤR)cn-`'0 ňD"8Ӻ{Oƣ822-Hl4hAkm1f5kN \oիWwz< 0Vk[ÄazW 0Gzuy@$`YVcڧs}}}"#lB)U.")߿PD.T8>43>zIENDB`u1f368.png000066400000000000000000000021551326020644600320320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d$IDATHKlTUs{g:}J D1:NȂDqeH|%b ťbĕʂ10!х\hС3ms{8Z,IOr;; [4,DK$?Ŷm؞_#[0Ϥm<\t g;/P믝͊]N"PZ3;C0t zIaW֕v8LhIZѭh:81!=4wM:0 ;|z;6]10&8xOI,TO]fZ akA.FwrKLc|ma, ^npg@րl0ɡG(<c /c"7YlUn[M`F{MNLvX^+T*m*ƭ_-d\(H4=r 8Rxahp h@ 0&EY0.a A__S_{A :\ T \6C5`\b_]Į];ojjlK̇'x, \8&\pkB)!dX?r21,z@ Bg絍#Dގb13,--cE3t:~( t"h?J%,,, "DQ(H Cho 1D"qlxxuA%RX,Z[9ܸvVxZ<|vRX,vcw@.kB1ƼP.3JfRjqsƘlrk_ZX,uϳK{WƘc^k-9QJd0==bTJ%e\q}ֽRhooG2p~{A֎ޓ( 1 !tQ ܃򌱟Rԙj϶硡<IENDB`u1f369.png000066400000000000000000000017421326020644600320340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHT]LU~skKk)]ُNe('+8&%D1Ѩ3Kve0-مq,X7l-HiYAZ~vwzm2syAܫ F.`LlVcHUMkk6wc7Sjp&&ͩJOLrb.z'L`vbd ξv+g׷C%U3(9cDNl}ޮ{ǿ3U+L *ߞ Y+ *٭sLVU@;##x$Q"tmFϕz==Rf 3 ز1ـ$p{0BӚwIp9 re ;R` 2 <wX ,EaUG[s  ݷ Wn[khjZXJʔ?D9§wڊ/PsVui<A?%7 6qDޖ8oז #͂/eAU-r D SlkR(9u}Mno]NI.HYwM%u L%!~ݓ3trg0)IENDB`u1f36a.png000066400000000000000000000020011326020644600320710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKL\ew0("BHH]` K%ј4,4tpv%ƨcIԍ11uT)NA1f{\03 |;bD"=ИyA%a-$fe1 oG>WPN^8f co-..zPcb]tۏ@+$ `SkͫU3~_GZT2C0e;Ϟ$]/. abr>/`D r$䳭[r|(Ue򻁮s PcYD%Z hhЉ٦=|\y{ Szdd"#'if2w{y@{^U `-C%:E3HoZ$i 䍩vSX9ӏ{ƺ9X MTEv@kE5~S&Cw4L#=Urzlg ͱ5, _ 8lehni(d 6%/E+Ė(xdPyʥHllH-6 6ic=j)!̰K\g\ ޾NwA`7͊PUE=(#Uн/cY@`{ ]Z#0 N<֊ϷRYqNpm 9( aTI'Vnų`ķ xWKՅI[,Fc% !Al;`1k嘝Yd~v '߼bl`]8}h+_~坉 v5R x٥X?~K&c`C=wzL,ޘoxd$5qih计㸘>c^ ND@ݛJl74yJI'ԢԺF'~[?{PIENDB`u1f36b.png000066400000000000000000000027251326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHklSe{NNO^v]7VttnbbbT1F1Jb$@4A4&O&&FxAhp1A.pKm[/z9= 3 /!}N$^ߊܺiR6tZ+}oٵݲ'Vׇ#@ՠ*65[Zv3GVj'FG&=en 0*,t쪢1/+!+˛PQjN岁㍗IVاc/6c# y L<UEw |5D nsmJᛣLNd$ I8UEe(l&aihfҜc;7sR^<06{_0) +h^`,ڪkV n.>6ʃcYA baC=}i ōT͂͞zLz DQ6 3$<*tXp>1RE@%eTLdh/`)a8l8,x04Bt,nx32$Q#7!DDsE2C48EF*i`5Ifp=EWÒ7w:["rC:=r2tvE N@#Y5YfJabxyⲘ巧ۍ Lfo=Zt:F`obE P&gP)W!+58 ƦOX \Q5msl2l0|RjKkR%Yjf .v9 :N `,HN^ xWlw+T@aV*! ^س3^IC zW[bh[; XM f,v]=~L 8/Ⓣ/B[kxaľoVoqqyNgN#_P(8?9C>3 ]EpD/]0{'u&0GZB߹{ߛaEݾ_f*N'/g͉FzTi 3^kr7c{ H].B*!;B92 ծju M˜Nx<'ඓ^fޘ6v >#r\h{q0".dxn|8P(̲l_&yJolOĉq+Byi%PJZ }ns&?%]oaw o>kܘmyKVn2&sw'h{t:-d`圖^-G" ٳ8INldjȶEz/4sΗr X-=5TH7D+Z6U:X:E!V7]fã+Dz[@E=0Cnv&a:=X, wp\[N@m'iT%SC}ix[{GٓJ"M0J NwC%*dU]ـ4eX4O~Nx+U_'|_Em-^hbZ3;D pb(|N_M+ENn^`n.5L @ eeb(@2wⲘL׺ɻ&.7ȫN,-o+:9%sǀ?jM?a<9Z PZA'UIENDB`u1f36d.png000066400000000000000000000024121326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmLuǿ>σ4I6XM9gk[/֋ʶsG3_\jmi:ʕ"..^rO{R@_pޝy윳(6E_CI1;$s%`L٫#k_s':&_Klh0YG("r/rcb֐&E!X'\#&~GZ3 (uvP+k[aTʙR+VC2բ5Aw=8t}-[~^pX z[۟K*`/Nxv{w &YV1}f 6[J神237LujУsSieYlש:rf& <K̀{F,p b kYܦuĽ\]~yɝ젻xM胑c h&,Bv6F[o &>KRy rqR;[`zpƕ2@vbYnњw iymFO;8!r{E.n`7w}dkVaZ@ q[^}ЎL9Vzb!g x*zD˶4f?I ,:`AyR wMہzw?u@s.vI# qEj;_,Nps'wL}!p<t8W: zP JuFrX̪珍xd$[= f. P+_Bpnٜ)&)f*ޒrsAgؗ讖DS̅\к Y5ι*V!245NUkCX`;PRFo3*aqLGnuG M`lE~7O@h؉+0*Kz^H":v B "4N`[8$vƇf əOZ[%.YTҧ1\ +F$5!A+n%ν!KfNOM27<*rn)opaݼ ~/rn;Fk5'Ns+RFl~"]|.~<""Ot 9SF3Ħ .B躒4yZQcn3OuɗE/jw1}FS VShRsps ``M.pߋKT@A|`"`G=p5-76326kɆbOq ⿂Qtdp cr`l a;>~q>a}0UZXb/㧑XHa|f.=sfIDD8):ԤF_҄ePDo)EU$IS$Hgt!e,I-c p8sؑgWN9%[zԃS)8`c"Č+.^~%vbG0mZZQIENDB`u1f36f.png000066400000000000000000000024131326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHUYh\U=w-RgH6`J0k b >*U$ /"bSk5N:3IԦdI'eҙfI5݂ <9s! X1vzll,U驷m0@n7ޱ,0>>)Iq ab#;!j\(oa;u Œ1k.R鳣ov rBHD A|^ i$=9&XP!dk{ w%@)nϼ׸P"G{t(|leO}3w޿`{_n*t=`S{"ESF¯Î`0Ԕ1:mgaً ͠s uJɭEVo.-;~=08d&q1B8A3( z3:[˵G7?J)^)8~!(#`_D"9zTuwfR-Zt։Ong -?W4M<]HFoLB5VCcb0(ʗZ>HFs*_|E)*oZdJ:t]dZnvṼnu|Vb rsrxR;|Bkt*BS!A Őt%Ufq~s~,_U36Sᆭ`0x<\CmkIENDB`u1f370.png000066400000000000000000000022121326020644600320150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dAIDATHKlUUϹio[E.((R@*%ab51ρN0bL@b a Zc@#^+Mim\Z+XkZkpT9_ D&}vrhr?]/~FiT=H5f7zJEs*# ?thuc-P5,`uǦʲ%9V_\:+)@tHnQwѦf*\X)Ž`CܒW΂ڡEx ƝY"@s⚷pl&>ʌ[123#B W#n.*k^ 5S͢=Dq 1p`AE?v="ުuqM)< łQ湭/m;SO}O*TL$׀81YS*҇mKuPg;"󖓿qN_fR'CGk q-g#0N}ԡ/pp##T /޸ feDA$VGRUcüHMCю&TU\0'G&?{F{O]ћ?B۰CLW7lv0ݛ,ՁD+&Gnq:'; C2&31HgxDF.! \[g{]#Zl-5Ȥ5H" -[=.b\QOwsLL 9eȸYKap?wݿ_ >F~qRT|&6ѓ)Hh2T]C 3D{~-N 9h&.Dՠ}'כL^mNo-[FkqKd4'R2(Ђ |6/Ʊ5~ +_qJf%C/Bҝh.>Aw$(5{m" F]͹Do;q!5HP@WK' uP (3?AŤiPHc%"?, >` F# ~UE--*4\tߤͳP3IENDB`u1f371.png000066400000000000000000000023751326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmLeOMJJڐuHJY{]l}&Jcqr[\ְ'{S h* gdz0`eYM* d'(mcmA޹MÈIC>I}930 c ={;N'D"N:EOx(ڂi}5 ^  KJE1*0^,@WW# ^n.2u !4MsAa7!~9 _wIENDB`u1f372.png000066400000000000000000000022041326020644600320200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d;IDATHU[lE=sڽt{)`.64m!ф114`LF#*-H] 5-wKJ*ih6gwΗ|3<MRW3M%ĘMPčGpFNл>&2EisaH*QZ,Mߠp͞ЅpIOtQuP;ѴJOwشnFr]dFnCگ׼Ȍ_^P)LQsHܼUm[P"T ;~Եr dO"sQ_{'[G@XCeEܗ+u§@Yœp=;\.FY!nhTo0O-}}ZKv~v~Ä>^vS;u[,9wog 1A]¾gDu&&Z/bÎ7ƒ.\mϗk`A+8J! ْ\{FYP ٘ma,p4Uy*:'@ 엣P4&sZ>/MbTܩA1ĜJsb\`l)nޡʲn߂[6q3s-`p\d4C+ 'սRe :$n:p"G^gP{>٦~z4I,  tP[؅r3 s@Wk뛪fHsDPH0<>I̷Vr5D('$83[k&_SGIENDB`u1f373.png000066400000000000000000000015611326020644600320260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d(IDATHMhTWͼ13iHLjbAiRE%Q_H EBZQ46U袴:3* 5~ŏ#:4NOǤMsÅyD{xfHEEmz?5UY#@AN_'++W0D(H W>*icޅɝA G43m #3{?Zw![u;G\rܪu0v% Mʌ 8 5f"_Q#>cBnه3}}eK*̭J|–re[d 0p7Kl,(~.7bY]]MYYtן=+ il>l:4^ZZhnn&z8SSStvvG-غ *z,`^~8;\Gww7eQns5[!'ttt-mmm444ߣ8{y4yO|:a{~HrcccT|^`mn,ߡp5RڒH$臨*pq:8nD":ya{JhooG3|Rnہ*'ޭͧK,`0HMM  k_nClCwgX2i-ZbP>."vE+0n}E0~[;-sL*==HsT͂,,( ƭU@^Wd4-,\3NwE@IENDB`u1f374.png000066400000000000000000000015261326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATH[hg5Y/!-^J}jh!FG%V/+RP/ y ]W7Xz *%>լ̜>d'j˜?|;g d;.Ker[_\2Lnl֊ʗ) gH[p:KU4@OٹBճ(=>x!+id?sFѝi"',u 8ܞ nD{1Ժb ~eU%,Ier+l,V6g:,9, plAe,PVAIj>GoQob''[+FX#" 8<-PzfUI|=^~R X^37-~k;O@D[v4|| ʧ$~:XwǎOq) ] wa{T@ӂ~߻0Q SQXQ6"ޝkâJC N pMt^=3?y"ƻ| |5/lza-0cIF%#҆yfQvb[Ms@TVq1dkwP­rGv_0:.*7 (?_of[d5}n]6 eCx}1~`5پ.=SPѽJ͝C/YU:k0S(@@Ek@*IǶ'nN4ڿ'\8tIENDB`u1f375.png000066400000000000000000000014551326020644600320320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKhTW̝;ID3:hm7 vQl]R.|!qk[*HJ -UV+ńX1$d97U܉s9ιW(SyXΩ s>}[l'!,!vQL!$Xe49p90Vb*FEFTLF˿k4E8"Y=(,u8N :E tI(g}Tׄ1xKJ" \cE>=EP$XU}]P+3 @$[q~, @RNQow6T?rg8) i+Jk/tږяCfM4ŎZI߬rD?{V:UTF vfJcda 0p@ҺGۃ2dr_IENDB`u1f376.png000066400000000000000000000020731326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[L\U\ 0RrZhD 6T&4 1$*h 3h5`Z+)Mh>\Yfh>ֿs"Dќ=``tT]]D]-Uن<sIf(}7Qz]m]=Gg> D"A5>35Qzdؐb ^q[;2l0u4ps[E+wO%cn*/1![D9y{S9[zq[ חP3(&u`D֟iTa%s[YI !FX7'Pd9ɉ*$ T6|(Ik wBLuU .*[djIGj:~Db<@h`΢$!47୪WƖLfbfS@ޣIzNoXzE1NyrY8 %d:bvofo= 8n(-Քkz&/+K|p]3I8V@םga1) ƒ?s+vGZիbv~iٶ`|v Pi\@ Y8a$~tښPBLyOb5H}%nkpbr} KIW~豴pdk,&#fg*3P"SwT:\ug\#5[w߱?PryasCy=~m{7CY<޹Ͼd=IJ-+'} $Ĩd5@ > b2 ޛK0c#t1qgDXD $`He?-N-eb PsT> ~Ep.IENDB`u1f377.png000066400000000000000000000016161326020644600320330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dEIDATHKlefNw{m{颅DRZE1&I!+IJ q郸`{a] )<@,k}2w\F[ sdUbZwPqzCXax%ӗ14҃37o0s K!bNCa r9 7J<ǩs\\sfgoEQ2aF~1&Cߌ8w pV}TYK70ƮAd]o]QrV+~ք| hJm_+z0>nX·rDCMb0hQV6k$xJqjTX`曳:;?~}o2co<+ٶa)NP2B/ rU~Bgr=4))<[>^@ňɥEΟ'v{< T%\, k,w\t#x 0Hɧ{њ0_zյc0_g2׽ޮG֭xMX[pKu|N.(tu?k ˩.ᥑm˿MX\@93|QI*_̓~V}BҊ:.6:3P.v{@\jw= ]w]멭|ZiS +K?yr%t6TO[Y Z+!k@0LTmpQ4nIENDB`u1f378.png000066400000000000000000000016301326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dOIDATHMh\U7y3"d)RPXhBiA1((]E7.ERWu#")тm-.DTҨ md͛=.bҤ|Pҳ{wsaCw6Dv Wv0*~>|hN+Wuw_yc7iULj8$Mbkm 6. ιu33$~53^SC#iØ ZJy:Nw;g߇K0t@qӃ\E0nlc$?g4eLpx^E\q#a$I=mwz?"DA0 8nHitTt$60Uib<~)*F3γ}}'F}hj0ƪUPPRqǖ݈['IՓ2% ̞_U!Q99ܑI0Q5?y۲0]6H>q߁=XIdz*pH~z.~c22e/&e%_K& ]%d٥Y|9;&!JDxv͋բqkv) ` RҜuBr0x'HcCj]}*>p2m{[DtT]~@ eol{E$A&nU|ˀ3S$Z|(,cj[PTxdc33;y@KBV΁ʍBZ󢈾.L_X+#{:.>←*4եHCd-j' R}d=wL1{jXPTQ1ne۾l5zIENDB`u1f379.png000066400000000000000000000024571326020644600320410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTU}.ә93R/RJ1PHhHb11`bOxHĄ @MDZ,EۊbԂ2i~9ˇڂP^k)P,5 %OjeonJδ5Nf44ֳ=% mH FrZ"h]{#Ǎm3W AA`kx JE-7ad _R=le}RLs[ȿlT"5TAA@lm[y0Jn_߿~pQcXjLA JO2iVY@#/aB$=^=-|sBFfX ',$̔F[X)VY*:n&0e=;D_6/;cEu0ox-l [Bg=uD 2e ^)l\[ӭ! ~$]9hK۵ n6;Er_tC/)PБ[ErSa:?l2!^*N mk1`5km?̶5˝59v^#%PSVJ8g(=ĴvP72 v#{$e6Ov*[qOfO ]Bᣗ{2xlC@iC/mL<([qŗ%VU 1ODECYW|SH O :I;6"=qO4V \D';}V_]JqFm5^7c^(w/k0x%]u&Y^gBwk+KIfG'(Ye! )GGo\99taK&h֟+PRTbB4\p _ E'a,|vw 5 rK4'j`wGb3ZMdѮ ߪ-d'Gڙ2b5\{.~-jzm5U *sXULIo?AqW=}09nkKtFV&&M ą ]pW n\h&..H$ 5-_L;w=.f:L)ͻs?ν9c+*$yE{ 1ZT#j呠1l-U_9pm [ܛ|(l ~гߋh4W@^6 zgO=2jo=@]W'd:x4R/-TN.\@܏{sǜ5V1Iv IsߨF㤩S`Ȧϟh` Y!W?;] _ ±H"BcM6384fn2_&!|V,---afmEQo>J嵳? LD$A",cf:SSS\.wR`f߉f6@#"EjW>gt! 0*JЦVUz Z-2s4=/"[B)OVJx. q>|{WD޻.(JA$hJMp_ę[ozIH@iR34n68PzLOOhw`܃v jspրUro|>iho:iC!:hCಙ |oJj`04TDΚnj7i~>::z{ 4߄2=Ag]ޟX.8Hԓш4Yuaf$0LP+NGE !I*ʝ,ˎ9r%!UFD^ptQU' IeiN=θq(^]"R6"hf!W?mA^IENDB`u1f37b.png000066400000000000000000000021421326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͔݋e?y~3u ]w3 fX]Dwa"PEvӅPPIAy!]RE/Pmۅ.:3;;3tj R9s|yǐ[uԗk0|<"YRb#yc?Uã2+-FxxK:QXDʯmgd (IڵV`]^'=w2j 6Y×u?ʛ̽$?nm "\*>6<|vpzjbRԭwqD:"n5i[C WCylUHW3331zA: *sbR>@J?t8!oj6NlZu54~A/@B\{&v%Jxk }D]7wۉV?PANcQ# ۄ:b$쐴9I֕JKR?'"Turhhh\.{99 8}c914QUb &Hzx$9PQյTuu\@[5ɬBU:;<(G ,%i"K4[>ޯT*<`\.("ö3Ira DҰ&RoC,lxNgrwT56ٮ+$3#wo};jHX `=C*&IJҁˡTu D ڲcgN% +ȓRH<>UM jBa/șFv'/X!k1TD 괫/Ԁ{DdTޅS6;zJ*:YR_CCd"V81ǘbtu2 . >;#[?\& 9'JecbZ.sN[2k]mR[3y ,X? H*Lo l;>^]SSSگeӒ10ι###sM^TzZ[X&bؾ|oRIENDB`u1f37c.png000066400000000000000000000017361326020644600321120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[h\U=93N2ik+ hfbB5TQ-PBQ"D E(R HiҪF&Ҝ=\/&-MZZ{s" +]GJ TB|x~כ'\ ;qJ_qw5@Sb` :EL#aNO/ņETw6i; I~WXjW}g'Ӗ WefrAּ2 C'Ķ_p?Aʜñpٯ6\A6:WlD;yƶ›E#JiX;1<kmi{: TU=W%,kqf "\k+UƇZ+"!l+c/@*39d87sFAN Jmy%w(͗SDz¶3*Źtn"ϗ1+ R"`pOYG+^3Yw$VhX_<5hvDK_W#;ͺqXT$Og=Wi.\E~/}E  ޙ=95}F@|x1o@7/lͯ|jRZp\]V^Ի߆b ?WnO˼Ïlr@L&DT@7n|Jn# S5qK!J B bWsa34ud{@}&rn'F7D Ip*'TBK{<bifﶺO߸3 ,9t#}!vUޝ5sQ%lDSËZMc͵_<[Y}MݪCMgQo끪^ Z\%G_?Z۪B޶v wIENDB`u1f37d.png000066400000000000000000000017311326020644600321060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]Lu?2RjikI/ͦaԂֿV8VuWE7k-k5m6EGfn7HB ΁#bՍ߻}~n*[[[ ~jioOsjj5w,lk=H1x"rW'Nݺ_izX])*`PU+3ozF•[[Z7<ΰ6v%1’^QXb"`Ke4X`KTO_J##y k8&dAl^wN 9tȎ gnɏ]ŒQNs@mg`;R!(gTt% J ##+Nľ#ngt=˗6En1f  x!+= 1֮(!;-`(P̎w=bϲVߵ? NPVBu@77j$c%9 B11ys ՚jD/z3q0`А!h+# Q44Dba#E JtKf(iǒXׁs_lb7~`OT oChR|zljR}d6BfO\$`9kI=.& 4{{z Kj%=<>dFٗ_ٻmu?|kQ>еAUHų3U<7(d>hJ2e͑e1[s`z``p- /YfsdFV`Q D=͂'#)R73a׳Ggq 'F0Z"O䤥. Y$fna. Xldvs3sYZAcq#W](.)=Rf]R<.ʇi9Ʃ?M%ZuU/~7D<%(mEu=MJѵ݀?8;j>ө0z&NE.l b3Cou7/h]fo(?;eIENDB`u1f37f.png000066400000000000000000000015601326020644600321100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d'IDATHk\Uǿ޼fISkJW(H7Ε+iA7n$Kw7 XpWf6K G!I3̼xs\L2zot?^~/Il|!>W6, U6gbܺ.~폟[G7ʆ}cɍ8_H:{2.sfRw$, /Q<'k_=8>3@)驰nDɹ~+,rB)]bO*ݽx1Sd4jy(TFeQB[;:pVkJr&TAk nS~TЂYh%)bH~C~(?{6~ojݴ*}]V^v&橦'V=ίΛZ[\>QG|.Ur0SB-zkļ?h+jo/ :Jmbklz1wCr%ok%W=;JS?L397HY7 J_}3^ǹZvgk;@r938R7ʙvzkܰ-f΄OI-a7W^Wtv,T>06wx`bhjcp,g'w<t|sV=T_I={os l]Yw v|s>ּغo' mIENDB`u1f381.png000066400000000000000000000023521326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTU}.s^$ h15L x>hPIT$\,4؆K)^f:-̴3̜}vڙ)쳳,LMc`n)?}DwP͇Fڥ<6?_V߾Xٙ#3Zn^{'~B>& (y[R/|fV>G۳婘gM{O3vg#7! o}洁&{Wӓ2nږFRUeԄ˶")Dz[HF|x;q-E(z"ٓ,|Ib&+C+bX;gmVyRm;W:3=uG(xc3\+Sxo-ƽEio+(HY$5wRle#FZ%[1T_\%sſ[=wömL~w}VLL1fCI_c}mM_,ۄ^ojG#sV6Bw]߸`\Ms[e)<j~E7=7iEILHOr_+H7tf>)v"f|]Y M5^$Uz(9tpmnY1*mWuon `gAwd-?v5W*޻_ |VfWVsg[u|lM,Dwm-ܰs ;l3O84{#Jx{麼]WËI?pUbw[xQ;yU6:evaU]hsj5j9Ysφ^k[3z'7:&rT&@a` 1 Vpa < H : B~VeIO.JջcؾF/l NB󀼻#O1i Ǥ~-"߁:Xsx7>˘g(~1 |*bhz:W0u-EYq%$;!XUٍv#'F߀v'I @-:':xjRat_U|,-\ŝ k]^)وy7Z82CB,Շ%!4W \Qsbݲw %Php[.+\!_89BzZˤ%: ]9{eAB_;Q[%N8|eVp1\x|2JZb}z G޽hs0 c3g5r ¨#)y⥊@(w\7A{a'M :5orSA'gM:tm]zXo/_Ё@H5@:0s]R=KJQ.=wNV?^Cq^3|rʹ˜5ʒ5oqff*Ldng.'IVNX"HTU'Hg]tSgƓ1!~wG?U]k#p#Ru5 #.H'@2z@IlnƲ(f>X@\֕wcgIď$/@sKtvpxl] D,`u@4͢ĀEdrt(.L6kf"ʙ^ ާYW^'RRsϯB_[`'\JZ&cˬtC0vgKѩa OXov-wvX];l`mFMA)7j\GR[š;LDkq7hv0h޶ĭTR׀@iO܊6wsV 5)uY4Y.k9%`WYE!jnz =̩[۟]ՐOY a5cB&R2R*wU]-c._eDu릂!&d5低$cɺK/_BFIENDB`u1f384.png000066400000000000000000000020721326020644600320260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTU}L;3ja )X%F DLByĐ(ڤF(TQRbAIxIJ$TәRzNz򁖛rp={g Dppe.|F0N b y0SU={=aFѫ@AVP@jٹ][-vD9w/B8>9^^fg`G! 4׽E b]m=k^]ixF>0R ;Jo^$NYaA^ ĺ&-~uIOG̡zL-}@[29uz 9lXm5gcK*o}3%=qϮN2L]˛៦8Y!Tljm'S>!cNN=YQsͻl\%BҔd)45]R7_+;V ,45EwbC)'7w>ҔW^:<\qdFS&u} zM"lR JMU(k>JQ<jᅡ8y (7F>w }c~QTZzDZ-߇J$ʪPJ5R<6$8Mr{8(.;GtI%/]qI=-pjC4B\IgsGz57Vnj$ytiA|ߙ[dVQ7mhT΁%X3UP^gXnʕwPǢkXQiCs(+:-"?y ?\:{ FL*Iٜ%TW_>Gk jo jk8fBʠTDF͑dze,~ C/N!Gow8|eͪ 2xrvp`ݛGIENDB`u1f385.png000066400000000000000000000021431326020644600320260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMh\UM&v6T;4h*"V1m*mQ"(EPp`BA((袢] ](-VTHTh]Ti:&iiL}Ei&Ic.?[9jhxz:Foղ0홃[elm R(rxV[sϷE01BBKcn\Ryu[?$ݬ0T>k%zb׶Q>Y( d<(!G:-J1\. VmŹODu(Bʺ>hX"#,a9#g^ |zիKEq 8N5UJt:1_NkrG̸ɡT+3e6oX0K/:0X\n9?s]G~IfX޾[tzZB,09?(8]׵XQAup"-^ޑd3KGGG1tcNK)O'N ![a,|Аܼ5DDIENDB`u1f385_1f3fb.png000066400000000000000000000021271326020644600330110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlU~鼠vx(D & F4JLq! 1ĕ&FW05nX@ aCT1HHQa,R:3mNHW_=?}?C-tqr5;axdDDŢ *DB|`Ǣ%jőt4/nTLlxz ۚ^_bȂDM.kYyk`tWfSpu|%sVۓ~yuŒd%$ኣ|sԼŒOK:Йg_d$ }ݛ` $ʢRCly&HY)"J_N*jp8v4uusD[QhWRw`ٕi_cdc,1(pGS*MvewKp'p.0^\+B(&c(Z#s4PdږGA12V#:(-KU NjpŠĠ$@#F9D$#EP(j.Fk:KMr2.xǎ%< 7 91"-qrwt/w?)ft@A|YQ.lϧ9[wضh' g^9v ѭhu3'r{u f[f>5I\9}uq%V3CZ 2g+z%* Kiwh[oχi]k&-ҌٛXbMD!Ll[Bp%*^>I%MVgKF9ѾޞLaCMgӀbrv-$T&HsOOOLNO&*r/NTذy+~sCLV "fvP H/cU[|<rg'E`lvH[~?EQ| +~71T7-e"xb.ZWJم8b̙3b"$ IENDB`u1f385_1f3fc.png000066400000000000000000000021241326020644600330070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHKlU_3әR-2HSے&] hݘ1ƭ&s # ]!4 >R[t<.ڎ>.V7}zjuCZUC6=(Q,Eaq Pw^o /Ⱥ-GU]ҡɛ;@_5x%l0ԑmQ;m %)Rvk n'7J+n]o.-ʶ~)F*rwtvCc3lD'RD4%\DO才 eQD>YUJ%7WKOljkG'e|5WaYed:3VpFapZԿK4zd5m%L@Y&0WLH?/p}(UJ),Cc[i`JAx@ޫW1>N0 ]<`;h m"̛D(Jzp}S2y5w$7F&8o7Z߹;S\,$\tP(b#ɽ+w~;ա2c4tޙ#R'0t*!i;aǰe=^[SE4v];PJںyUv+ȴa`&fsv'j%> *RZxCK/R-MƟʴ(wtWh MhK`.sX$tH^4w-”?\Pra'S)opbWaoq|||<.&+"Cl6{N)DZ! .Xm; IENDB`u1f385_1f3fd.png000066400000000000000000000021511326020644600330100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHKlUsR{ S*hLԅctƍ Itg\ hb4L ,4DEb k c̴E]|y9b[0:O 3-|-qCY\֬wt';_|VoR8KsDj`uI%x~e[{KaVUB>V"Cȶq@cL6%JŒ$mh%hyC|Œ*-n73%(;txa !02M,Ca(EZCglI5lCJIS&pʄn޴X eYrRD-"zpt'yԯ)eO0y|ӈ+7]r4Wg /-Lk,k׮-I~7=0"1NL]+ϱh\sy&hr߶[\r97{H!eCS*"W/Oׇ"j}޾\}?hRbH·HW͘9ہjSZz>xU%mBLC2MB@s PU aeg(N8u5\&NiR6P$ĉ[A -$ Zz#__oǹbLθlXm㍲5m />?֛j w<7||CTV!@Ep k[%P2r949mؚ^CWT\Z#[1ОJ#eK {Og'BHbMfy޶hWBxޭФD!3!Lko>5(U+ ]W u; !04I0QPFYo1A]jZ`jHu23V:@3# HHu,E @(@TKN81p} ;Ô5dB+RjkSФK/|W:+#0ݲko|vL$\d\ayJ)<`y[Vg :m@2s+ur`֭@ hAtà-gjcTUIeW Hv퉤2(~ ;6{uBID\4Mg|l4liR;s˩7ǚ ME xenF^{ML!nݼ;׬ RzXRJe.jyzV;3nH.{}l~BW)u9wiwq"Z^\.yt^ ~x>/doqxxC)0r{3JR37gbKHŋRswQIENDB`u1f386.png000066400000000000000000000027411326020644600320330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH}UklTUܻ-{[ݶbF1E b4X` G`41 6Q5!h< [ n)yݻ{9k+o37q[coGvĻ覸2xb1VإKRN[5_GYٲDKQX 7GJoo<-sD ln&lH8G B%^m! ;6f'`v7`,]0bRY j]lSyBkB*-Ź)`+'NDWkJbVh%h`bj\jRr3p$7W]fD|+5j<;] D3&cS2>h(Nv]ޘ@}஋6UiɡꝟlZI*R}mgmPZOs3P2!+ub'"?||^zg55Zgnv^7 )]h8MeHU ff !du,c)Mҏh<~-h=[ *Ͼ'b0h 5Bpbծ@,h[\wI,X4rT-4dq&);.9{ R~;oG A{=g.  8wgY,0#?|bcE6S-zn'؝en]N |:gHP71]`VQv7[d+MQ$S˽ SɞxN:50D Yp h0okӫ$tB_FJF |r7>/$!VT&QBO‘S R+:щVO 5P1U6qRMfg= 8G]v gWY0ڈ鹂Mg%mrڎahpc? sKJVq[*vq jHҚoעgcAx[P r%X@aOS]I>)r$2=ԃ:=i lt! vx*AuJ _$AW[AԻ{r49<4a!0f23;ƃ+ lO]xtM71 Gk|L, DGrq#xeF}с nәap8Ҩ'nMEdvqô~_p|$H}^SMF"J"4?POpEn2?+؆CI+o% kaM*bXU&76 r#0 Y˴Κ]Ǽvk@it@:3 hkr+gIg.4;ͳ[IENDB`u1f388.png000066400000000000000000000013061326020644600320310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d}IDATHKHTa#5#( A"Z"("Z-$!UFDDH'_K3|(Ct:}ݏ#,~D,(բRB6(Dog]]Zd` z2>A됊m?Z@kk\W&l?Vfu2ո0n_[0FLs7w+U3VRuW7 sP2]To/ƠmceuEႀ,R#Li"46k"S۽dA۶[V HRFD6% i{-zIENDB`u1f389.png000066400000000000000000000023411326020644600320320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHLUu?9:zqE.˲-Ka֤,%S$RND9mVmʸ\gnH0Ӗ *Nsp.W~hjG ~F!Sh F=rp mk\gQFۢRJ"@nM$n-=V0siuwue~AuvZ3loIR%$[?XuT7a 8QVy+e?FRΐfTaaזO][T^KмdgHn8N_Dg[$~OYcMl,]GEW\;+Xso3H{m"P$`кzhp^FhDemN~.4YC)i^Z0`DA$xٕzaƊRW_ۗy`\F@WaIH(ؿIeE_Z+tkNz3 򬴖̺͵MrL/*䲆iX@A.Dqj;<~-*š%G{@'7WJAbDN|DMCͶ?;yo E~xNeBא"*۷=UvޝXc2b2p}t8P^G!cAc7c&b,B;Sa~oP1RdAQ:M횴;-[-z$7+iIN<-@:s)gݬVu7%SLLJS6^EDQh}Ef,/@Te:hRKNE?I*k5 ^̘`M|W^rƆG\']r3AXD X$be"g#c\e@5%'y)f ̋/DhXT%>T5R_6vtlSU(;yW+Dp/:vSO~z,kÈ W+%oԑ| .|HЕܵ!ˤ\^ٰ\˙bɨ᯺C 9 Z;>q~3~Gܴ$9Cl5(^nR#{}.zT= mG4|gVw>ὖO8)3IENDB`u1f38a.png000066400000000000000000000024741326020644600321110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH{lg?9E]) 2b5j%$p:1[[lK6fM,.l f:JK׉rXzjPuK=vjuٞ~yce=DC._eCwm;·( :s,z(2v0}@ EƸ]U y3!޺XC!A^i)$AÁb(|8x"t{!Rׯ"# d+EjRK5' "CmNo!qخ{"XQMC *jhoXzYi=w.@CAu] $NkfTŽ-BZKC}_ݞL;?j (2s㧠jQנ5OM\\x<7~@MՠP-0ۀ-F0E㈎Vyje.Q=HϓsbwIJN[IȦ{]}h|_dٚu߅ hLz @5 oY8\JXcݼ`pP\o#!34~;,ZTָ,ݜGE9YW|ՓH<tfe+i'WіIENDB`u1f38b.png000066400000000000000000000022051326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d&@)ZPb4 r)K9ˇΐ2ņr^{ur2;3Tf` LL+p=nK7@xLV۴epVl6q;6T'{W#\P,Щ!$띢Uy .Nl,A1ULeD lW @馢S`0D 7a3fgn WHb@w0N%ğ K+U: m{5 @o; l7f-y1sA2{Y39A9B`KϢΉ;:رeϞpT;?3fP=N@76y㯮 Nl_dJ.3wg8 u5+m[^NY~`6Xo|\R23j[zuSs|1}BIJ˵%B)os(69 bo[ ڹ_Ie}5mnߵsIK}S4۫Dkd{^hUJp}y+M- c"/vA^'V#0)_#)Q֧]Q;p\"A rV]1}9 JrUUד.|ny-+SGVD{UrOXAkV-O5[@փ}b༊<]#soH™P}i+EKے0u@ۘhZH> vc։G1pR1 ?+E"7VIENDB`u1f38c.png000066400000000000000000000016711326020644600321110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dpIDATHT]h[e~ޓ9Mi~89iu`B\EofsQg"-v1;"Ӱv^LP&# A\O6;W&D3Or^/)i@/|>}oivC`"Hi6WM&DJ}6 "#x註UL&]x,qUc<4ljhQ9(s2󊢔C-(-9+0 iS|@[`vv!":ND`7֙,˟wwwW4M+Ե5Z#[/դŶ'#FmnIJ`> b Iki쐪5 TU1&*3s9w'G"+| jSUU9dP$"2׳CCC'r[[}>_ f=]]]C̬ض}wsGiI"|$ י\.=X즦i;\<b p˲|PV_hVMJS(V Z [X]޽w|tiv8Ogr̜a8# +l4[n )w=V)8:Wm r7sʞiW*'l_sz]jhXTM&Ll9*@tFqANuTlȔ=Yzߙ c_qE H23g,@'^lI"Vi]\Nŷ4hm0Ma/΋+avM/zh Q T8m+RJ$3 WJ~8c_#a B2aƽ2t:%Gҙvxi gQOo7dq p.wf:%i@&±^H;6Ȕ 8VG?B|bJ !>-M2Vve B\y2A@\ns5 :IENDB`u1f38e.png000066400000000000000000000030001326020644600320770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH}{lUƟ|_vcum@g7nTqsfx5LSc@jqxxACE0(uKte0ڮ967߿9w\1@X"uQbgX91zt"bFtԩe6)4=fy >.@J@4!cmvnB]O!X{- ϝ;WoŎBfT8hgbҀ3>RӴm̜DUJUB~kA|9f~3 ?vJ)ꨯ Q0kHS]]EXjbժUR$">PPP|r*,,L6 &HѾÇc ɤyi>"B?"6m!y틕,cN7nFVVr/v3|1s.W9gΜޔ8 t#miZŗ[{ %x}hBDFZZZvybCw̬,踧aR=My/î nagPаM@e7zΎugBGUq;ݻKO9Wo_v XB/u2vLݗyc0;{ șr<۔/ભ' h7E'|#\Y:{fq%A8v0!]`0-Ǚg]k 'oa!ht /"t9bi iWA̍lL}Kj;OŚ"حOT'k? Rf yBuSH.H$*}XTS)GtzzWML[Enyۨ=+=ܛ;>t59c$UP\@j E0} lun7~s4q,"2`a D#x9>^O& $7? mM(rIˁGi8 XY)dH^8KaIQ.,.JϩvT_e5JupeѦFfq?9vI1TmLwRwtHMf09%t%Xӟ<*>?gάM'<0 !Nt%:: 3"};;fx/k0 ٟ {0@$ktAX}/fTP돿F( }ݽà='zUhPtO7??EQ>qԢ7-f ;wpSU,3€SxWǢEb@u^jofp_kU8uM/;.DtKhا'=ؾNZ[mYS]'*.%%1/O} ϶ejNAsOnmy6uSD-9ӓ`2UC~eM 'l< ͔ﮥzLp*'"֒޺ X4#>&b)s*đ@n8ț27y%&?w^-^bOU(DO1Mp@<5Xri,"T8>5^ɻq[b#M\,zbX;vx D781+4S Ñ$W?P6'8[dgJlFdIъm'!0%[]-Τ**D*@-/~y{N8??vXT91޵ '7­G;эS'4ϼEfE>"rS&O *voq2~~V;-DuS?\IENDB`u1f390.png000066400000000000000000000012451326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d\IDATHMhAĖ&i#( bZ̒ xh'b= D-TAz҃ "ADx"E%?B +bѴ1dylyypl TU=zd2ʹRp"8efM??p ԱfW$jN뱅BM^ 9HKe,iZIć7hxD\Х~v; KL0:]V~h&L̯0`/(RZ&s}QN6J,DV34^Y΁.HcWϷiqVҐL̢U HJ _qlC >>/:oy^48LZ?~t{SB{B\Mܘt4`0QUuպ;19ym6I\N=3 0E:Vy @7̚&;.n8tQ7eV$[2DDn)U}w\THb ߋHӵ#UOeKℙ2)w+O("( ް wFeTUgd~YOŴW?IENDB`u1f391.png000066400000000000000000000020771326020644600320310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[Uesh/ AEYI4ρAEPK]@!!4 !/L2cs={E}kk MgEyD10rR/WwcHKOeB{i*ݗ~paSKAg-D ʧvy[_#%!p'24' okyUvҦPħ9 4 ~$a H o7&j=$CA/%C RpI+c=i%RFeHE4_hC1&+ %AvjECJ\lCUЛ0&8вimeՊ;ixJ޿@6ꚃl'EZ @Y}-:vkd9-u$j jݏg*7: Yb"$]m i߈8TV0" 7!E%$[dѩ  xF:d%DŽ"$e13ËW2%!Ux=dk6IY?RqL  vFbWDuz H\v!0òmX/IZWb{簫Ȣ-GGY6;^](޿MgW׋T5L{ lS]T8=%9o:@4ѹ ct x`trՏH-̜xB Z&7Ϝ Ff]\+^ mX\p[>v 1_w8vɫSK=OLeX*ڶ~5q6TqhWt?b;0 nNE71Ol44onj` JzhWuMr201Lݞ;d7{#*hcM z M A?;st5W/ ??`E"r )3;DftԪ@IENDB`u1f392.png000066400000000000000000000017711326020644600320320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTU\`^PVB@6h`T1>@C%5h h Q5D*Mi{fY>pLg^k>l.-_z1_мwOel/m_\V)zb;{;(yCE(+n*&6]0.mnpӢG' ڲ:U^촎rm$~>~ C AbW_7jcx#vei6ߌ{x~Xgn_S_yg SJ M=6|]P2CR^EVY]: H[{'.\PX7k]\JI kk188ƳN(V[.Rl"s*9sJ[ml É1 jB/C'ƈu1oGfp4DZ fsU^, `z;A5x;oݲ i7q~Huc0Ќ\1G+"4mHH;@Y9{ʳ<2J祋q`WY2bj]Ajy`N1vC^g-fH&l:C=Ժ}DeO=c2i-(QG:=Ȓ O=o뒷4;K ̮2=㨗 %/8ճ^Sh!WV^\er ۢm-mtcH ,靶|(<Ijہ7HbPz1)1CE"D<3]+]wx1 p ^[=ɖ}RqX䣹>+WL;2AJ'Kn_< DGZv?4'տ/K{I$&p~JVZr _%$6G?F. ?zr]2T]]$К,p)5 eGT`yQb8Qo;9f(uD :03BFS"kJ$&ns㔍ZJWZaIENDB`u1f396.png000066400000000000000000000012661326020644600320350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dmIDATHMHTQΌeAEB 5Xغ> $ZXBZ$HrQHV:{ZL&T}y>|#ԑc*Й 7FƔc^ ' Yt][o.rzCd_Ik* 7?(]3` O( 8@=N]mӽI*\+ge0`:)UjHgS/k5s[iW-jcMx8!X".igUM'H7w&g2BltTOm=eŔ8C NHa4xsbЕ+5H]qYAhC+o.4`XK5?jXX/߰J *fPBMe3b袊}̇(jCb>3 `-![*sQKHEoU"?m`w|k/_Nԝ"X&_q&:Da ,JC"p]43&./*Oh;@т ;+'IENDB`u1f397.png000066400000000000000000000013351326020644600320330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOHTQ3yc)XJFeN%ԶIM ZE$J-h'%A "R I%bP3Bﴘq|83ݝs~|޽Hl{Y #"-'MJXSW^y/h_]|G7@jEwZ̾.~N;ڕ5V#2H \?B1TRam49 蔜WwmfJ3,G*C' =g,= rjİz >iTe\S[{=Uاݹ WlJC`Y!|u$eZWZ9?n.=s6Rܘ;ۀ'HV9_v:wLshYΔvL}= h**/d&n[ix5V}=@.܎EC)ObVɞلhGUk%YE.31߭^O~\*C /B7")XEhqHʩXf%0hsr=;h~ cE+l @[TA eR<=م!(@6ż:ut.ev zIENDB`u1f399.png000066400000000000000000000017171326020644600320410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKh\U1Ib2da[LҔmFK"5-tQ+q ZDK+-Ņi]&K ) Gm̝Lygf=EI523yu};GFF4-:X؄47)>1SEQd|҇GO',Kux $*WFO'R<%S,Zuj8lZ,(%$BV?LM)Yxe]!D:05= svbDs[8.$\0H I2$j|>Sc'hzt5l[P,\TtmG  `FB.sbgo{{eK4\rɋS)6nF6eZTqL{8֠zgT#fy陽$if#t5m{snƦېkL;twuOoŔ?f%g3bܼ|wOwEU0ߜE%uu; 7W"c'͔LX,277G0Lft/x[^xGjLUU BL.G_ :>뎉"_rwtMywKﲸ%R"E98<*btRbJ$ftyvl{V XҾo|f_-uM6Su+!BJqӃ6E=Z-gMqQ*E"@n}rpa+/.O+iMe p)a5E1Z'֊cH f.0IENDB`u1f39a.png000066400000000000000000000012231326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dJIDATHKOa%Ek$ &k$$.\q'7vg?B@B)JV\ ՖΙ77D$P֦`,c6 ܗx߃7))?}F+7@JI5=U`écۑ( R,Cq,045D}TBPM<1; }{+\"ŷBb:g.]׊j.ÅU|?WWln !~o=UP:$8b!WrE#Km%wLt9:#]P]{#PPLhw"_ƦfH.e RщI2߁ ~u !ot+j='^²m<c;cZL3?3UT3 ^W zWvͭ2XBK3[ppbIZδrƦf\CbM x3e:4w݇%g)kL~4|PϦj_RSʇbu}s/z_<|֤l[Kٕm[ uY隋IENDB`u1f39b.png000066400000000000000000000023331326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOlu?3v[ @ @(b8hLH䠉'5!$$Ab Zbnwfwf 5P*3::JUEPwq8*2)jVهG14B̳ dɕq M>>>ZJMɤt >4MSӔs6p8D]ѱt+dll. 8o10V,6|[Ȋd z wn/k:@8h'4hNA%'RON|Z+ lX<\hrxXκ5ξ@xlrҪ ` #Wģ+Bo4 qUFߥ"&'8LˢX.r49wO&y*ϥ їP/3>l >~|.@M߾CU^>:vb$vBLf>8™'Qj80$na  N7oAt+ADQDE*B۶TdTU!6j '1e&s`Fl ^e◳uvٸy É4վͦi4NKm = byeq m`=ΎXs)k-:HUyIENDB`u1f39e.png000066400000000000000000000011171326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOOZAG=PD-(Ũ,4ate?Ħi.F- h㎳7dGK QJŹaQMK|@J !R B8`8 B DާTE`fk|a=n u=96[,VV7nlP*Wh?Zf0!=|2;M{&hӳ.)c00, %}P{}d2FD0?.3~)|zH>k: LL?ɸpP=P /3= 7S r|tH* Hp~)ugf9=@qE-s}tM8>:$LJgjX\3/KTkkd9uԑRZ_'PQ(X(W(/-75D^:\VSB<_Ù(,tWbIENDB`u1f39f.png000066400000000000000000000007311326020644600321110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH픱NTAsv%+!|sCL >ډAb WEhLYޙ9.\%'9)nh4LqSv@8'D}<̀hD[2dF=u82"喒{q :vS,u|ň C"pp)h zK|IR%a@@~o@h#ݿ}\}V6i0VA*&i0Ui5LיW@5mn]+5V4w@A({F`y };ysݿ>m,ϱO8$)kWv`ܩ̿f/<ڇz;CIENDB`u1f3a0.png000066400000000000000000000023121326020644600320700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTU}朹6[ ULPH@cL(FJ4@AA[ƒ^4*1b}@H)"MRZ{MӹsM -} Ő-fBCBؒa5Txʽ^.~77MmTU%Ju bn1u7FYrRE5WS\뾛LJy WXuN"Pg?<7vvS%Ư>:TH$j"w]Y=ρlУLÂLUJfGr)2l'4Q0TT1nWL{xkm%jMї(Ft5hb28\]O.g) 45jY]&U)qRL/Q?~BVQ  Ry 6x,PUnU"tf-VlφnL f>Eʷ8ǙKo\EUؗ`=F|8;]Tkp3NObXA 22BQӈEt6Tt_bYf߭kI=ct~mA{B?ȉu!bWJ3a$dRbN)z -#xf(ɹpDsw#^5-fXI tQ(P]Zhq){/U~ jP(RbwN`$tu?P c@ d AGaJ M*?TbBnt ?>"P3ٌM?I_f;lEKyusZm3ٴ]H3|4\]yssh&=8s 4Ҳf H#:v5-˸9dsw5:w>lRͻYTGbRM,$@`\-)yě~os%D-$ a.>$|{N,Y_Yrz@iJKE򫽷y/&S2jm*N|w"|IENDB`u1f3a1.png000066400000000000000000000030251326020644600320730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHUPTU}oه@`РH[~e&f1ZFfœi&&ӿ2+$,&(1JQ"?3sgw# RJ͞9 u+B|~Ct:WJ]PU4uEu*r϶z)*41 ^`84a;B9}7lR u)cWY\Ic1E¿z`vgVٞ`Fl8\~/3j`H+{qCVCs>_7N3=i؈+ǥ (X3ޣW8Ncs[NȈy_K(2448(QR}fMt+l=999SBPJ<0MR%/8m75)Cg ѷq\c$:6b !N4TiC?@DF_z<+ zvef% |J)F[?_'NdzSfui[:;F"p@ \fI8cbby"=J7eGƆEdVSO5Ms\8c#9D+9'2s"$`-|D33iwGV;y_#t1*AGHFj,Pr}}9Ll`{ @"zyykK+t)3^j"`0-+,;oMKmIfffiˈhSJ%8,|kgޑ%-bb72tuCDɆaLpO!x@3bnwf(|9g_ˉmN{Tm^71'g~"(GN)/PWWzk;nJ!Z7Z Sd5.bny-%|lb"jcb y-K d}} ׇK]L)0Vr3\fw4{K"({jh0A |td ja|>qi)!DazaSfghp`{TIbtE%ctgkorڮCM0Ǩgn;qv^Yב;`_@Mطˋ!-eV쨶J?/%M{(xQ_9sø/Tx@|ꬹ? :a0(6OoN+}wop?bkp,R0Mff:y؄ʕmC)рp#q'u7{m:;IENDB`u1f3a2.png000066400000000000000000000025071326020644600321000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH{Lu?{s *dHR22Ɂ6n͙95frSqԖjjX /=px#Ns>~ϳW?*w2Tf"XVf'h8e(>wm*y@ }<pd69iު/sw}ygZ6k$ b ̽i3G'R?ڮIO 1f`87}ğ.fL+ђX8/9SᎫfԐM~'{'6& ʹ#grSF`@%}~"+"b+I[Q)u[S\|i>9#PhBs+"%M ub<BWQa S1 J/Pq4\hzYDW8u#ڳ JN!P[CF/ SxG=Ta )=L^VuxYTEn:~~\shty+{oBxG7c re=;7-u\yɥb5䍜d{qy8z#sny"/_sn<mfW@6Oֿ:^`dN\v`b)kE$uD̝Z`J|3K3pBD qt{L?Mζm"êiE&e#;=bQAG:ܬ+X|3UP)P{l3|/Wk 5Dۙ^9DԔƐj]]1 wMT<2}Ք׶2:ÛL2*^~Jzt5[XUcbn\hި*&{v^b$|GXV ñː7!t@&?GQ# N^L;+7$C(8V ~ ;ңVqF{Zj7} DQyVph8_\Hɝ.a a$Kc? |yJFj\-{6 z/sHJGxw.zwT BCopŠaKFА\&VoX_1L@*\?)x;xX`"7PTǦ&<0dʏUd%|O rv /YXKY}EP4ȘQiBNܔtKl>uzNT? )ĶՈpÂ]l"(.ƱrF%p(\v݄[7C IENDB`u1f3a3.png000066400000000000000000000021271326020644600320770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmLU>-0&ePLDFSCaX/1QFEG+̄ 4De1ˆqٜE f`c EG21(6}{{0:9;ޛ{ #TU-d7 `Nj1v:FDWd22VfR|IIIMux~y:TWWL֤1bN7oxxu.fvkfIA;?iJ_i "g^lB0FSHEY-fۉQA?|,-ʈm n0™%M95H)_`=[Tm&- n15\_;RU2XDH[ ^5QDޭg:%b-d`o!#t?I]ZmWIENDB`u1f3a4.png000066400000000000000000000016601326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dgIDATH[lTUϴ3jE$wW)R c0<F`^V(`?21uc'tN\o37n 4#E 嬢\,/5vo[cm(5oMp.>S]v <#A_[|jX׋'@ P6۶=}Y+.4 :Ʒi~3A s2OnTrAn~ٌ+Rpwo\.☺ھ {_!?<|pd r.7ˢ-- YQw0csBA"mӁ= "jP= XB[d[IJ/>`vUoxh0Ƅ7,=|p8ij@e^չk}C%3{lYT3*ГSgі3g 64El yPzpy.맢xIENDB`u1f3a5.png000066400000000000000000000015161326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHS]HSQs6ujfU&l´‚‡O  졨衂!z++ 5KIζ0r[:szΩQP;?7}3a_:_1S!5mө3Uw>c`h6wMYx#;xJMb޿qhr 9smO=q-mo*c`U2`)]ⱖ-\V_] N[Zq!h놽\U\ͬeo]AR`yvy@<"S.jϕhd 9:ML5N/6rd%85`S&S1M@@,T(c !{'Հr-}(;g9M`$yNpΝ R39ot7>)IENDB`u1f3a6.png000066400000000000000000000020031326020644600320730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕku_'OIӦkfGCmjAq7&Je^^AA.z =x!ZJC׮RfcYlj4IIB9}y>y~~? O:%$TtsV>eY{yU[Tj @2NT*!Db`82 ð0%p*u݂:8 l{0[%N: J.V UqAP P,)Jtvv b+ۖzd2 Q#|v˴(0<IST2 v"qGUKVdxv8(*>&^w̨wq^7 pY.`e"CrN4T5#q>=L~l`aժj9۶'&1 ܢbC\i;bc#Smgg紩vYCCC@"Oצ#ؑ$U0E>d4  W:]@3##6''L #mS]9'۷Rrq5P~/ 22JUy1beDDcTf*09@{~~pvcZYpq ӌ!򖿳T ѱ{0 3] 碡}~?Ѹ{9Z"IENDB`u1f3a8.png000066400000000000000000000020471326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH}hessۜsgMҢ+!)"CBJFLYNAf2lc(%sΏR}|w}_}] 3d GEY0Y0u-$ THe^fDgVqpvB{ΒDceNTи vHLjoq/T5n1ߝwY: D٠4o.)fu3eÕ 9da@,5 p{LqH.}CILN(]FKԳ_% ?cSXdw$״$Y( v[32l74]x PS軞TuqߒdqU_PShG풕୯;ʗgbTؕbץ?I|#P$o^e`g>`ˆXꄻ㚄JW|VsgWY֢pX}#A&z?XKO3n M~4S,#{12zwm27ɜe`WM֬Z͞3W%}{e&doy|IENDB`u1f3a9.png000066400000000000000000000015501326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoEd7)*?ZF ĉI8p@HRp%Q9D/X!*  RQc+imc'>lMe5~߼hGtqwsRꌈD/׀{R*Y,of2Gu&j(GM#r"r1JY0:@7`'*Z x#L@:mԣ#"wz UJ^6i,//pG`ee ױ,Z:mtyK zC)%Zg#ulH67ǑH]k]%B9%pK "j3c/;cCהR7\ץ^`YVo6͉n^?)/^Nu Rg` L׳۴IOR7@W/M 6UJ^Xx+n|zA BLXxW섇= m Duݱ޷_dhT)954F?cWO{865EOL\\;2uIU}SSSSu? #éVqnR^T"xKDDu`9=9):J)_;Xt[_<~'uo~meIENDB`u1f3aa.png000066400000000000000000000020531326020644600321530ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]UUsqi鎍ك!f"AЋDh}CARXԣ|iCZ~ι_z8s˛:z:{ڿ>k 6/y^Dw8׾7fA=P%+Ɵ ~%mWoZKI&4Mg}m fYMl9o9;9/iYT_k絝;i~UA>@|'۶Sų(kϏǗJ-|5i/o 8@ Hv dh\1 ;h\U֒8MG;c\@Ѫ9u[tm^tRKְ?k$4,Õ v8E/oFd<еQƄt0,@t ͜P7fHZъF M˯Bp+_APa2SݝVXaW4xtw9єyw/k zGZ|O? 4 2qQ8qS /bPr)IBi Hf%Z\[ .]&k=߁ڧliI*M*a{TrV}& R#2ȫ* +֘|mDgʭtVFsh\wGTc3^7sQiN/>)>#6DH4yvΜ5[ٙۍ\\921S9_#NrcOr#s6n}u*M_jLlAW 2r |Aw'2g3i ]Zt ~ *WWybz$ ߨ~aav b0z9TZ.A w v}uD6ɽ?yA"HhY|oCvNnZC v wfDPM1b{B\xԬt:) 6{rJ/Hg+ѭ{kg k}Gy%@d r[#HJI.!ӷP`.cz]qE5P O6θ;P64R|m1Y"vWT-R0y{>xGB8 =_~'o\ _՝=-iwzd ׀00*nF\}0HЕvO[Oߡ^Pڰt0̔}R :D~Vpxy,?'Tٯ40 lK vWPDrCSoPޚ0Ζ3gf/^IENDB`u1f3ac.png000066400000000000000000000024151326020644600321570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]LSg{iEʇ-,fG2 8/&`Tt5#q3.]B3M fwd-aA6D>|V).kWy 1r8(t]j}9EbDkWW\]]9O1v(--f>WF0F877w_/[,?t]UQTUĄeǎCee%رc`x?11qtŊZJ~EEEX+<HHH@vv6?tx~pαuV=33Svy!|d2$IRUUvڅ68NX,P oܸq+vꘪ'0ƔH$4 %I^taƍz{{k222J-K =A MlBHII%Ib7oFmm-5666|>_ww `dRdYHl68q6l𶷷 {g zju=- ;>>K;(,,4 79˅Q D& ""q˕37oٲEx<BR"* 9 !L1ADc޽~Ν;3cNyyE1KD (Dcbh3f455ajj ۷oGss3***D|,%K|YVVi49l6f dXSSlqy ''~_珞 LUջq:u*Fb===عso>tvvr!)9IRU]4kmT)o~|K{6v'B^21==@`:l2ZL,-]V7c?J#Ի#1v=GSBB4}j½brjp@3l=^bO<Ӷkz`/Y(s,_>1x#c7XBA$%[Iuk14ҿ OuGP o߿(youl`do_FKWдȣ@sek`/p ͜ p[pB=81¥vDFXbEkG#&}COsg'^C<ѹhf&8KD8;5<0A#@uv!NKx+Y@.ѯNgKP:*|IENDB`u1f3ad.png000066400000000000000000000021061326020644600321550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՔoLu?w{/dץ\%[iXԖHHaҙiSK}ኖ MW6 $P}N/U:o~~9&W^(*M3JXJ/urvl]M 4ͮ^M|*λ9_.a٢r0YyKH)9;;CL'z} (@uMʄ! Dj3GΝ?-.'Gӌ2 X) ­)9)DjeH:* "r82YEW->|Q=%IfAA :m,F^Ñ0BǛ{yREqS"+D){U?lyDQ-/Z5/4Vxʙ?*E$Sh lxoWwAƱ5vmF6NXi? f{ұݷ Ks\T~gR]ƴ׽eDØH$c %p|w3jl'j&e YwŵۗLؾhHŷ﷔ùvx$"0˜8V lgt3J*.[c'F L.┴8ᖙu%?2Itd1hlAͩ?dbB5<*@l9{!@5YGp;E\k5R#5 rt*ӂ:.!@usۮ-`T}ޚ-J f:Hqq  mtl1< SW9.!5~޶JhZ̓YodϤ_lEwe'SD%%ZLXy-KAxp?Mx /M#=՗_\-\-/ye>"oɠ t‘W$L*h#Hil>s4>s'ƫ/7JS46V8tuud&JjBQGx(Q, `0z/ ʛ9~hoogttN8E]MLr,_9z:Wn߹VܲDUbT={-^gxxB!O룁J58:  o#$.Y;}Lk>(xBz/jӚ{'Lis=R`h DI\U35qSoc ji-ҿ&Dp`"k#@Z-0d"VkBt"oz;@>!2m$3_\T؅ Tv`llK}Q+:XoUVf'v w}EnjS?aG'EJIENDB`u1f3af.png000066400000000000000000000022461326020644600321640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d]IDATHLu_{wj f )یL&dja4WraVt*j\dmnr #w?{wB0SȧMnC.˙XVŤ 炅]v?9;^<ŪutɬϞhMy¢5$a2- =’e劓Cs 6U$!qN;}um=k =%'@Tkj#W'H凇zHK:4HUBI|X| 4mf n͆{yTS(.-y)0gt]ZQG-ioF_7_ ȔG:ºa>@<$6_*?an5B2p3h{z*0*0A/af_ Hy¿\<^6_ko>KS؜[KydO|("+qʑǪj?!ME7'NHH\ 5vFS5blf6#pdp]vß|w#/Ge!E!6VN)VLMt^ rF(sa+>8?O#l ǴJ-ᓵD'j Bn9pfDdwcBh3 S8nIENDB`u1f3b0.png000066400000000000000000000016641326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dkIDATH_Hdesm'<ύSH& TVVi? M$ 200pNcxxUUdhρl9 'E""244$'fVMMMjvW[[rQ ^ciiĬ]MD^*c~-Ts\kIO`Eў GyUUULMMrco}5]'ُ#.fk3dϓ]Km䱳z֋y6`.zhv=zz <3nE!`d޾k(g0ť$I2`^| eQ\\\Ếy> O8j/ JBP a.c7B!D]\l|l0 Ess_>5洈tww? 3+[~VED$Nࠈ$\ĕK"-mK}}j"eool s8pqĝ]ԧ}ަk7$C ] UU,bfq6l@uPQQÉgch㔖 .T~˰㮅a?UbeIwwiHdKD>Ey䜮LNNz}3==gccH677G,DvSUUD4 8=?I9g> IENDB`u1f3b1.png000066400000000000000000000020501326020644600320710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOH#WǿM2Il փjMTZ5ZЋHY/ =b)(ӶE(SfBY!(iŴeIĝ7a]cm`~Cpzzz%Ui6"AuiqRsݾc̲,rܻlZQ HA8L8o4~G% :;;t~*tUUUс8N<]#Ɯj$ﯮnz\뽣0i:rQD"0xߏh4óiq]NX,{~TQ&R###E0,˘6t](BX,]m*|)cwq^cz?L^&''zQYY  dYfCsssN&}e9+tn:r@kk+F#033YB!akkr܅N\M|v1o.# I`zz---p텦i 1D"RUQnTUd2y3 cccPp8C"(Zl q;Y~#o555hkkpx!|߇褫l6 !p!  2077W31h4&|1ض 4a&dYn yrp'---1 \'SsJ)u]j *I0 #\Ԛ `ՑVUlnn"Ts)(ˠ};sRpΛzAӴ*J vvx O) @GGGgg'暘x+NB7jD"UUZAK/kנ2³L&IpABB9D)'pv%I,0;;Ǐ㽣GQ.ΝmuLLe'è뜑A!X\.B|8qo>RnO 8'u݉X,V~NUU>}tgNi0L\7o ,Z<{aIT='`ԦݻeRnaeehB]DvcdN״}4q0r +Wy}< c,z!dqR)5M;(JT+J( {|ÁԽ{'$U$阪qBHgu%r7NSݞ$Y(5XT9:L@,IENDB`u1f3b3.png000066400000000000000000000020701326020644600320750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH}LUu?sν+&,-$IjR{Y-ZfsejR\hͶ іDεQChkk˕kQҼ \rx9>y~lgu.9%x˷?fH{(E ]չSҪOK_8wF?dw{UW*+w91J jǁ#?Q=@5X PV_oChL~_ee y틲R5:i=;&Z[~L w]s' "/#T\ƙFvMox !AӚxtoEh&l΀җ|&A|ZS-q.Yj5fm\QGkWȤjN-O6]FtDWD ԯqJc ?/b!@2rMS1\Z14GAFKzI^Io,f O~|1#7؂fF}bkTӭg+iGŽaP,d%C}^}iDDJl^/֭2Gpk{t%;_V'&PJkceFi !%7Qp^9l~Mg=P5%`ek&ohZS%KD6RnPL"6S-mNF|6=s <6a9`2,"O&jћ/9 ۧzhen WYD)SE+UA΋6G & Dz,]Rj竰ic͚{zM[703fR0M?"o6x*>L2a|˚üCDz5sxjRn`9'"(NBmmm#s ~{N1IENDB`u1f3b4.png000066400000000000000000000017301326020644600321000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]hUf74kZhܬ3>`|J}VA-hPPjJlIłQ w3YS(ݘҘȲ۝LJnV7/{Ϲߝsϝ!4`0jUY"NeSB4:j<+ҹ:vޥW9&wxB_b:-p.|{)?/.p%Ҹ(g#Hi@0FPy̠5m%> ^MCƖȲKJ]P/ /y {襪yzokW0,]xUޛѓ2E-p8i?MZP̺o85B:xq߳BNu*INTy@!y|J ?_̸ۙeM ) }000СB~t7tl3+HzjN#{nN`Gmm+^rOZ-sH;7Vgez8dE}jee%~GcwJ7Ư1Y9?qBH$Ɯmc*f}yf̬A8L?G2E{vSq|' _ fZl0-T-ӠAX,l !4pK:UW\zO?m< ͟Fo P0 Nd,2 MK{t,kޱb@R!,IyOjN6NIENDB`u1f3b5.png000066400000000000000000000011241326020644600320760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATH=hSQ:iDPTA _X$`Z.NBGExTP)ł8"RVCb=0-5Or}]!Jdb|x L J$@<og(=Pj"0ud@uK"wuHgHFΚҹ؇ugJh&N.Yp-?2.`- o@FϢ5}9IENDB`u1f3b6.png000066400000000000000000000014741326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]hTWsI}ȦՇh1}SV[$&kE/&B 4Z!*$Kh(J &k,g|01YsoAmwf97ްϠ'rUʋ嚹 Z_8g^VT@!:o7& e@ԈdpN/feg @ hVkLysH]nYt3 R`TCC-3v*g!> `I@xLDi{N/rg]ڤ?k=>U?_;/T%O}{$Uy*{"ͫZkO&l&miT`.6E~~L'옕82"U~kOř5a'q T)BQ ށRtWQu m@Xk;D6?ް>`"K&bjXxe4bwɣcDGD]y-z;/+ iwB#qT${M } *S(;T0Zm`/E#nS'"h *`͉0yjiB{qk}p} -d|k12B7}&:[bkd!xD?d+h1`fIENDB`u1f3b7.png000066400000000000000000000015671326020644600321130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d.IDATHMh\e}w&fAiLOhE:EKhTPt!."]n$"DA7.Dmc!i֊6 2&M)L~$138d{^Pj=)WۛC[ 8gy\:TuB/x{s tN /MvZuo:Wj=&Q63H*W&< V_r3m`Fy'b{8YTuzrY3D._QַR ?eFMk⍥~&٪w;:1a-^AUHED\'y-=-Fޞ@FjaM9" E"zMPv!rX6m4>$MfSMRVx<5+]+zyAcgo47W O=s7Sb7x vv`1Ekx-C*]\l^ ΤlkN`dߘ> Bck@!䮣cfc4s&(_Aܒ Guޢs{s=Wb&ֆΞ`,mYBL'j@nϯgT9&Q#x9iVtvp;\~Rk +dz6~ngA"rZZ y}=eUӰa*xN6d/eROκ3Ê/*m"nʟ Ŏ˃z q,?4BfdIENDB`u1f3b8.png000066400000000000000000000017051326020644600321060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d|IDATHLe_(\SC\ e]jXK!WkI\#+Zfu7(kq\}?kwz?|,񪫫s8]EEEp4W)k׊"1  Z0"b#KAuud29n{s8Lvf˲ RJc VwX3ZyyJn`ʶMp8:eerW 3Zee6Y 9~5wM8Z@a/?aX?t6XuLЯ.No322µO3 u#6y#uDA2T?7 6E M̽o䦁 ;Cd ;ܧEC@8o;V3:DIIENDB`u1f3b9.png000066400000000000000000000030331326020644600321030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH}Lwǿw-R˫/(X{ DɄIB7&&(&8 $$k qjb dj 0H $E 67*(=y9{w_>. _)..8Ȳ<޽r:1 REʺi&&F1oŊf,jŅ  "(BCCl6X ЬR 3>+/^|3"""v=wfٳW\(][[q $=7tQ^qRRjjjB!BBȣGd",˒C!8w^r=b6 ˲d2!²,aYX,) yEjjjӣL_UUө,Be4 ʲLy˥Ȯ]H?Y\\$۷o',˒B"ٺu+aYY'hN':#;;[555FASS6l؀& X+=P;v vUUU/nlܸxz7¤7ȒYMJa[96WȃYrȑ#p8J4^/x.Z@#mUuGOpI fՈMY%ch&|uGt9 ú <j_`BsbãcS&,͂H2(៞2?d6 vT:rܬ!qZcE&0[^&$˼;78QVFUj%q_:,>"6i[ sI K͇:<swo_N|A1L:<"6&y& rrj ?=5ZiV-iZCBC#uz&* r1IENDB`u1f3ba.png000066400000000000000000000016101326020644600321520ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d?IDATHMlTU;SgZk6U(ЈEL\BBB$AH ? &.XƅIB Ѥ.,3Fİ &N0F(8sT']s{s>qPN߳tIn仙t8JvSS1Ia:&D8v|KAIHS"a ^I<,/n){5A|!c LBU'ϝ A^d3Qʞe"Kc~$bٕ&}-x'tF(5m5f9vƉݧ'KU'pV '0 6 jX8̮ 6٦mlz]ƂѝW[_u'6tW]|3[y̿yuxW+tȖ1}j窫*S 1{NޝҠ^@N~vי_wc2n<woY5mhIENDB`u1f3bb.png000066400000000000000000000015671326020644600321660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d.IDATH[hTWu̘1/)m41I*RJ }j-R4h)/zRIQlEmKA_J08'@Bب91\t퟽o?DMMͻƘz`_ ՛Ry_D"YTUURWy@*8Sz]JaqҦH=R[&~FB弊OŴ \/;pR9eh_O 5D5pKY4M:y` |Z"8pB߿fF)@1RTHf#O"(m <;C)~3j+UЂ=e8 ^MEuW939P.'`g;t i '韔hOQJF@rWP }"*&1RYbve~cpr!~ ʛaA`GpoCE BnwwPes9wCWv0!]fWÕ GQ’0]f\36ZYz1t AF8a>>xu_HJ2J^i!::zhޥP+2靺!,yٮqe%Zt ]MjO0wCdqxk0'\BzH~SL"cYK<h$bVu&60o >Uۣ[&ׇ82 H57K[&fӥn">cKƟ(zu 'A&}76y[{iTX{PAőV/a~˼hjɶ:UY]ա/*+G쨴*뢇?,"V4&j^䞦,r +Ŝ<`}ş &Ԅ'[':# TVvE)*7+শzXHEKl東iGǢ'\CaifqԨ 2<~+V_9]dM'+U@YZ1ڿ!t91mpnE3zvq;"x} "?Ono]j-F'%?t<-\9U!\ D} !U?'wϩ1`$|ywjr}cO"ϔD73^6R$SpT:U|8ca?",52z;g)cht/PþYC.PP8glڄ8 //mNzEoA@nD8}ŧxVlR3QnG5S8`fW!A#Û"cskk#{I)U㼵mU҇NyvLjbEUG |VDc [T*4n?{,}R~!'jc;9FeFiPA)o,T{+XuKRς~ڧ3%N.Yiѧ©@]';kV቏EOD%H^SN97E]P. @vRVZM"! b1#v05M_r +.IENDB`u1f3bd.png000066400000000000000000000016541326020644600321650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dcIDATH]hUwfvv7f~ؔ6UqH6>H j`K#րEEEPEhQZ(*-b[m Qbj1D,9>$ny:|sW?SL9h7Y+G4\wxCƷ?^ˉw[on1.X(?LDw ԥ1Eq2B`H&A-=A5LIy)kVk8Ȳ/FZ"RU+ "C#963OٞIHILZQp @Xm&=5&@RSE0+)=iYZ\ۉ֍. pVBOD5:셱ar7&Prf68Id/(&XU}m: vbZ'Mƈ˗>OJ?Q)'3pI BC.d?rA B&РB PD6].fw;3M&=1s:3"3HeO+NB У/Z 4*&dݐi݅d<2`N5?@1#(=JPLrf1YUז?"s F)#=a("b0#I9"s~ԛbC*3 kje+̂esJ /q1(3$~'f6 [IyM\3R"MC,cb>AL$ Ib@}5u]ജ $D`EHb5L<ڦY 1@L⊷Sx7+>@Lỹ^r,# 4je惕KBL@LrLKND4IMvd)P N1/3KI֣== ̂$# =oi&^h! vػz5=C@P }i*aæɯ!$@Rg=)>܅i Hgs.{JbŌ~LkjB1b;1bDhVO.}Rs}@1cTCo.}b{NoT@KLEHV{KZcoX+w@sVG= ?ļ]:_gihq93-0P ԣGK|po;ue};Az?M1dB jei'/:"`ˁ'ک2_iZŏ% 0;,>y!}SZvG} .\[xUoB)ƘjFYKt:CZs0.I&!P| @iZl[QI M!5D3mmmAP:64dx%`ŇhY:IGM'?)Quʇ7J#F'9o0p7؇qM6!s݌:LN6hd6ql72l;h<_طGن̵Lؕe#F tV`1BufVg !D8n͛&TzvWtWI6EC~G5ƂUFd@`3+&sA8WExM&kQO6CS0Tᑑ^NYX3/BF}Mӈ}pW 2T{YJ4Snּ>󞓊5yh:nhPQv*ʼn _tO V`^s۳[]Vl7tZe'YJ^$(/H,%8dgԥ̞M g.*ؿx@}|8Oz1SNC<1k!y[FCHY;߼`>"$%MU+@ qlj2 W:ڻn]5rxU%b"^6@1SEFM&&ɮ2K@ pjk(qIENDB`u1f3c0.png000066400000000000000000000022151326020644600320740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dDIDATH[lTU93әba -xhE"^J"AѠqH ) Q[@BM$6j(xÝ 9{/RZ ǕUqiR'tay m{<\ms5r75s&Qr QH]Qoor3*y3{u:̘换$*.PEC``#Knl`F*n(' ( }@*$1?%fk# bU(LJIdrح{ux%~-s>bi`/c;\klc+ (pp8lڋ=Ss<}0 W0ci:9v:5%jgqIT)o%; y[KC7NU17 1~E9_y{3eSq:n7V^s$/ʾLWI.gV-`D7Ou-^kŞA͢B* pYЗQ>W'}Ͻb#KU_7oi2\fHOh몚MO/pӀjj`(61C#=߯P %*TC*t[%#B IENDB`u1f3c1.png000066400000000000000000000021171326020644600320760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOhg?6M3H̉a0+ ܺ Ev)CC=Kuh/m< <( it^BDIjg }Z }?_BP˃/ X3Q}}mۿ !JZkCr-I) BJ~illƍk/)q0۶ݻwWWW BPVvLF?}0ʎ|SB[B|v;ѣGyS۷o===TUΞ=˓'Oښr}D"8bX޽{B~?>BCCq 'O\?$Z믟SN7oڵ .pܹZټy3li=z8MϮHH)^D"baaI]]]u\|V$AΜ9åK 4Rđ#G,//3<!m;L&#[ZZJ%&''8?BXzU^R8[T(r]xq9NQDkkZm۶mr*2M3xm[W,4M:d/8IENDB`u1f3c2.png000066400000000000000000000022041326020644600320740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d;IDATHklTU޻n t"P G"*KA >"0ƬAHѤ Qb@ .B>-;~RKwDӽ3ssMlll,b+@N|M׳AS mwI pWpPpnqX'nZ K]m 7tMkT ^:MVIv/ՄT3G:oL߰$0>@io} !pc¤7ZjuɟO~)sҊ0@ʨ# $}3?]N\{ءI>ڳe9bcP8)S4hRmZ"zꥥъo\8. 0sgldyZ:̻㫕LC3]/UbCOe{\:C(Y,Zo+{fLI2r@e yぇ}oT85H5 fV_%NjLpw%+zc-|=z n"@-PoD*;.YZ=e;U',&b0hC6VSy^۹fT'7|Wz=ib&z[?v,J5%]nF2ыṇȨYhq&XlYoԞKw)1jmpDNmoh/$;b=nCrRɎҸ ,(p(JQ:R6W<–m ~I,r=`bAFe&yЇwTU5}˴)>et¤['wı|+9uLYOPKuyuu${HTx}tIYeqvyw< L-kxxڑ R=잃Ǻ\7NM\@xpRsyGWExVsrͿ__-aDrIENDB`u1f3c3.png000066400000000000000000000015371326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՓ_he?;M颶#` /babD cҙMh 3[ZX+,GlQR c̋@H2 Cq9s~}Řyyt ;^w7*H%G?=5mJBM{֬>v?s8KẂ'f*LṊop¸ks Txey*pU"|}#_> 8\K^|ʾs,M||QcI 3cvft֘> |M2(.*Uzb%/9ϏZ#[\ b{Wtf}#"Z BˑWF`Kj.׃ ?gzUDHDJ'zZ23O΀kb`rK_Y8IENDB`u1f3c3_1f3fb.png000066400000000000000000000015511326020644600330620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHՓmhe휹M7lK@K +!™"3G#ߎX… m放h:,{R,?XiFC9v_~0c9;ou_wʵ{Dum'J3r2ded*]9<c69ozD!\+Bw=Wl.D84yWW&;Ygӛ}ծ(: ~;.Y p`bTUAEu`ޥrC3rK5򄇔fϷ2Su~$/뛣]TqjA|7ӡqe@zIrzt뀝^/~ >*l<vգ5I1ۏjw.]GY虞{z|Lդ5sFӥu`J/nmAe"•yV3}z󾢮}Q{[ضc`l H$xAp3N@a2|֜| d(eP 廖Zj; @bJ-d[wvfp1?k;L여N2/1 w{@+ (j@%m<`>V_;C))Q"-;:G,?.+(IENDB`u1f3c3_1f3fb_200d_2640.png000066400000000000000000000016211326020644600342600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dHIDATHՔoLu_ߏP9T`;\ekSG5e:b:6)mjfTRƃւHH*æ5ɦmݠ߿O;gO/9x0qtk-+ׂI뵆eom0KJqυo@O63n0$B@Ŕs<.ͬቂ3I;QnIScoW6,"Y{ȳMM>ꮤĽ94z:4?$یuM*pMuW=7Q)X"#kt*EK79RiKh[Y2,_P [dJ&">|mkly?;ݢIa&_T9WB4vwlmT{uzQi+Lx_<6M6O3k;푾gu.IOyo݌^Rs![Hb&SkIENDB`u1f3c3_1f3fb_200d_2642.png000066400000000000000000000015511326020644600342640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHՓmhe휹M7lK@K +!™"3G#ߎX… m放h:,{R,?XiFC9v_~0c9;ou_wʵ{Dum'J3r2ded*]9<c69ozD!\+Bw=Wl.D84yWW&;Ygӛ}ծ(: ~;.Y p`bTUAEu`ޥrC3rK5򄇔fϷ2Su~$/뛣]TqjA|7ӡqe@zIrzt뀝^/~ >*l<vգ5I1ۏjw.]GY虞{z|Lդ5sFӥu`J/nmAe"•yV3}z󾢮}Q{[ضc`l H$xAp3N@a2|֜| d(eP 廖Zj; @bJ-d[wvfp1?k;L여N2/1 w{@+ (j@%m<`>V_;C))Q"-;:G,?.+(IENDB`u1f3c3_1f3fc.png000066400000000000000000000015061326020644600330630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՓYHQ~30E`Q/F HcIXd1"XFXEAAP$Edc8N̽PX~/~{.[+g),OB}y vNEӸ elAu<8;bWwCgrzA$Y1̼ۑ)eFv,)=b"b0Fmf?a1fLɵF ^MWD4YSnQ'|ϥ\rLd7prm'd)B+@) ۱\R@}(5rc_`ݝNLlx:;zA4] u)Uڌ6HikjWw$&G 400F2"^ҚI|90%lċ]єOmFGԨ/QoNoobAw ̌=Yա@MKܤ[pL.{~G/,ᐪp8BfwBN*^"G׮߿I>-[N P,MYpªsR5̻~m`8OTw[b@ Du`̆v, VWL |hZUf!j\"vsف`XVuyh*yap%D蛔wLCy]~mw8tT_,a63\|k8 щIENDB`u1f3c3_1f3fc_200d_2640.png000066400000000000000000000016211326020644600342610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dHIDATHՔkLgƟ󶅮RbE2 t/ qL, a' -˒D ~IQeq &K$`NPBi縴{͈F|<9=y]s;P}qU9[~N5UU ?8`u kd1AA$ Y0iάK80Or<IY$S&d'ph[uz-&}"җ-L4m/`?b  9:u쩩`xAQ#6ZAU{{Ff[sE|++;r/|қw9zf\DW_{HY)YH[&䮊}O}#7#k_qv묂n} a^aNd˦~z!ot/I)Bv+60d0avN3.ye_Fz j҈ Z7ԤLO,蛝c^w~@Q,p9#J`[m1,Ƅi3]HN0rj';NfAp6aF:Kx$%'miuEEg,f}Pf&"[1F*CMm+] $0!`ʚkDA]͒Oi' Xb\fU1($1,MyX=Ϝ- J_6wUҍe0z8m~5Z* %UY1&vQvx(_hܸjoցg+-֪+J=[#R7BCAP5Ӿ#ZH(pFEiIENDB`u1f3c3_1f3fc_200d_2642.png000066400000000000000000000015061326020644600342650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՓYHQ~30E`Q/F HcIXd1"XFXEAAP$Edc8N̽PX~/~{.[+g),OB}y vNEӸ elAu<8;bWwCgrzA$Y1̼ۑ)eFv,)=b"b0Fmf?a1fLɵF ^MWD4YSnQ'|ϥ\rLd7prm'd)B+@) ۱\R@}(5rc_`ݝNLlx:;zA4] u)Uڌ6HikjWw$&G 400F2"^ҚI|90%lċ]єOmFGԨ/QoNoobAw ̌=Yա@MKܤ[pL.{~G/,ᐪp8BfwBN*^"G׮߿I>-[N P,MYpªsR5̻~m`8OTw[b@ Du`̆v, VWL |hZUf!j\"vsف`XVuyh*yap%D蛔wLCy]~mw8tT_,a63\|k8 щIENDB`u1f3c3_1f3fd.png000066400000000000000000000015321326020644600330630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՒ[HA3n[h7,2B7" *HpK0\"+$ԕҤ[BCS$nD z(" b}32D]ۜ9;geeנԴ#])P@(<,|,ɛhKivp!2kV--sC ߴ)勱|B0@1jXa$lXukBc  rڮ.=+%z.``67I uO'*]_%)@`[("~E29p *wS4򾰸xѡ?'vZW:(rψ-'j@H( 3eKX2FၬݝiՌQ<#*./:j#ֻ)NhE'1`ͫDg -uۜFZSxؔ8dBf9N4P%*yrrnIENDB`u1f3c3_1f3fd_200d_2640.png000066400000000000000000000016321326020644600342640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dQIDATHՔkHYy jD,[vY"vYJL+X)" 45VwYvB# "CsTtQ)X) ڔ0my{+I99n,\`|]'jڞܷ?)y~ |( +g2[-Ce %$~i3xrRz=^0I7>bcc&L59YS/\)AiU+ma6:!ޔey{xڍPf$i;GJ\WKS"ObU:ERBO}{ٓ0j=s3MVo} T>3#jBsų/G`5vh%1ܲxguϱ/x?DWXp #Z@xWYIH6?;݋NKbv;J@ mH,*efoڈ[4>a BBF@I Љou@?H-[Dza)sߺch$S+[ۻ(X8^Zޛ[' Mg, tjژ1ON{t?}i{(8}5jqHog⚖8[@2&"eÙMK.:)7TJ; gĶ]̓Λ'#o+/M zC [ nqG[IENDB`u1f3c3_1f3fd_200d_2642.png000066400000000000000000000015321326020644600342650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՒ[HA3n[h7,2B7" *HpK0\"+$ԕҤ[BCS$nD z(" b}32D]ۜ9;geeנԴ#])P@(<,|,ɛhKivp!2kV--sC ߴ)勱|B0@1jXa$lXukBc  rڮ.=+%z.``67I uO'*]_%)@`[("~E29p *wS4򾰸xѡ?'vZW:(rψ-'j@H( 3eKX2FၬݝiՌQ<#*./:j#ֻ)NhE'1`ͫDg -uۜFZSxؔ8dBf9N4P%*yrrnIENDB`u1f3c3_1f3fe.png000066400000000000000000000015451326020644600330700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՒohu?y}wݻ]c̕+^Tz3)[%mi,Fv4He e)DS$ GRA `iۼ{>sza {~%~3Fo#tO_+๺j;) 3C's]ě"TM CpU-UU/teYYV %  Wx 3o\<+?ɧ۷v+aʿAe{nj?LY[DPʀjS၁i`#Gu 5 lfh4>YS5KDKDeWgۑ9i?3]~o%k_Qe &g>_;@W 5lb͙Bs- ٔIENDB`u1f3c3_1f3fe_200d_2640.png000066400000000000000000000016251326020644600342670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dLIDATHՔ}Hu_=MqQZĦe5aE7amdc,mEP4쟅&݄?l-{`2dT1lk^vzީwO$yOz?/_TXкu W’W> xv6K>M!o28V-]kJ=4)TB5\l ~ѿreS+uٸA[6y1tuRT;Kz9)c@EˊudY1=cpvsM_QYh.+Mλ(w.k j 6P9fTw+xHf{UڕKS{~쵤:'jA5Szx,`žKբQ[|C%V@Q'vr}$A4P2$,-,e%w. -s4ښwg/v)T'b-h5ﭏf}E3} @DX(17}M.2$Wh< 8LsPoL nmɼxD4uSR ((F[~hݯޗJ#-=}_fȏkY{+@̶ x[ >P;Omilƺ:i?;A)֓y#q`f~6ZJ"A;NQnd*GZv?&ȡt+)m{IENDB`u1f3c3_1f3fe_200d_2642.png000066400000000000000000000015451326020644600342720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՒohu?y}wݻ]c̕+^Tz3)[%mi,Fv4He e)DS$ GRA `iۼ{>sza {~%~3Fo#tO_+๺j;) 3C's]ě"TM CpU-UU/teYYV %  Wx 3o\<+?ɧ۷v+aʿAe{nj?LY[DPʀjS၁i`#Gu 5 lfh4>YS5KDKDeWgۑ9i?3]~o%k_Qe &g>_;@W 5lb͙Bs- ٔIENDB`u1f3c3_1f3ff.png000066400000000000000000000015471326020644600330730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՔ]h[e9IHKb:7:kQLbiۤ&u퐮VHzXb>@+☂ FtlfN89缏:)+9I{>^^ pOduuq.\?]&g;n4T^CTZ9Pe]d-7*Ji 9q_@ĹmUW:rTτCAڛ݀s:] Bms@+☂ FtlfN89缏:)+9I{>^^ pOduuq.\?]&g;n4T^CTZ9Pe]d-7*Ji 9q_@ĹmUW:rTτCAڛ݀s:] Bms=11, Fu2a^w@i t?ÿn2åҐ?h_@o<qp!WVPRIENDB`u1f3c3_200d_2642.png000066400000000000000000000015371326020644600333070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՓ_he?;M颶#` /babD cҙMh 3[ZX+,GlQR c̋@H2 Cq9s~}Řyyt ;^w7*H%G?=5mJBM{֬>v?s8KẂ'f*LṊop¸ks Txey*pU"|}#_> 8\K^|ʾs,M||QcI 3cvft֘> |M2(.*Uzb%/9ϏZ#[\ b{Wtf}#"Z BˑWF`Kj.׃ ?gzUDHDJ'zZ23O΀kb`rK_Y8IENDB`u1f3c4.png000066400000000000000000000022661326020644600321060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dmIDATHklUwfvv![ܖPZ(&y"Q1Q1ڄĄ_HL `0`x(_0FyDEDb Xkׂmvgwfvmx9 CDJ[̴5t O^ї%޳r=E@M|(4ia*㦖:_xNji<{oδNJB"d( A3,~(ip{FRB&Ԫq έꛭ*i vYn.fuHAHg;n6^ KE=hݒ~\ja-qţUz(lZ!MVCz)2[־:سw=YR޼uLlX5Qi[ԧK=3D'c|T5[L|tK:wApT*U'iBQ V/|YJY#`׿ 8۲#[?pM[ҷDq(Y7jւxR:bmVU,_}f7(= : prW۶ȏe\"hIK}ؑ|{4e4"RG*uhϤO/yA\`Y Gʻ;3 Viw*B *l[pZҀF AG;EA~#&nS<Pҧ)~-LRD@R`ɏL(`hwB?ivRS )3*`)A~ΙM͡.PnCS@irעvi/F@ž#+ȕ$AGEu. ܪ'i~ #i- 7'Zx >$.ǣ:$6X]L ePư[籽ʇ7[$  5L Dh&hl7ye%-L y f?թ9T$?~{ L[gRwL_Ul1j&[#0* F!`\DN)9^P⺟";pFpMRmGeM{QFs8^z(R:i5<9Lycq5$I,¤~Ơ!R'tIx)OTnCXQ覮g:a9dq)Hr} #E[*%H T/Sn*Rdi OCg;*i{yb o/p}b HԾ$/=iC\T2- Sr=elΖl?5F$ ToSזwY szNgtŷgR?O+S4\czL[²5LJp}٭L! jhO@m`~..U@c2u!/Qv7qXzs;a$z_ZOAƖ QOYDL9T7=q#5$%xH׵|;ZIENDB`u1f3c4_1f3fb_200d_2640.png000066400000000000000000000023421326020644600342620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkleofvg{ezUPjM M(̂Q x  m ""P[ m۽}[ z~>}|*TQQRb5. {@jZ`z\i=w͈{*[/+3YX4URO &LxfixD#ꎄ{|}ן]>L-1-טEBbӤPBo w{)74%<B^orϱ! \^򚍺΃G:?Xl@Q[G)~D:jVc`B͠M? #]% e"hܳFJyŀ2YOuPyyCHvUHYEQBQ^1,XJ(`w^NT3_LU+j)BQ~Z|P@bBVz,/ qҾ[q pѮnyZFZt~W% 5;07#] @>p.;vѥtd>w'񎜡|k=ʽXR)~՞Dg78\2[Du{b_3?ANz U~fCk!#Gw?ogd'iDTuEHw0$~c1slvKuGa!K-lcn"Q`DL;|UKKkR,Fɇ#UGDdTmoFNBo)bT+kQ2UD 7@zLu3P@"-$[QS]LM;(夹@aG ABLGI3~ĦF v;`DB:9l>G$Y/E$S ABLL8mI$z)tj|4p[^5;p?L!v({!sbm)l<eAEFp7 hnT 0:E'WlwC1Zg?ح*R;X^k\qC}ϼK &,F"Fn2\yXT+A}53sRvLw_ j!NxIENDB`u1f3c4_1f3fb_200d_2642.png000066400000000000000000000022721326020644600342660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dqIDATHklU3v/me mZ.F%Bb DLFnQCE$[`4RABm!2;3; K=}GerFPI)5]i=^]]=}'V8e )ˎE" w JWJkxfLT2»N7?^ݽ1\Uċo*)y+A\yӌQ*KzLyAS!Hi\n^Ѿ(o .ޜ~Bj[_7U RNדm;F$s7eP֞5%l3|1^3Ljf˅#vǛOG qKͅZpL8nt-0KbݪP!CySזM֠{&aWMy~T*ؠL}:q _uvRhӕ=Q~M UJaM/P/ +%r4F Q,;]xp9K)vrPDIIy?e? 'eM{QFs8^z(R:i5<9Lycq5$I,¤~Ơ!R'tIx)OTnCXQ覮g:a9dq)Hr} #E[*%H T/Sn*Rdi OCg;*i{yb o/p}b HԾ$/=iC\T2- Sr=elΖl?5F$ ToSזwY szNgtŷgR?O+S4\czL[²5LJp}٭L! jhO@m`~..U@c2u!/Qv7qXzs;a$z_ZOAƖ QOYDL9T7=q#5$%xH׵|;ZIENDB`u1f3c4_1f3fc.png000066400000000000000000000022471326020644600330670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d^IDATHklSe9=.u2cDLѹA$!`#K0F~1Ā)`D!=!B!.6an"T"+Cn<P3td:{*::,"L/B)a\f>~*B(ࡻBt-0VXئTc'_ESJDBO4W3%IkwQ #x5 0dZg1/NϤA l Ċ57I]K~%b)?T9 ^J P $ShYS+2G/BȮPL IENDB`u1f3c4_1f3fc_200d_2640.png000066400000000000000000000023261326020644600342650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHylTe{o.Ve&-) "Z4DŨJhM1̈( D l(R$TlkYڱ`l^ι{ /'~PTPYjvHT;Z!2[+)BQI>@u/&rc{ 8],}۝^g_O"΂cM !{D}*5f/2 +KnΪxW\AsͺBg#ugԮn 7>z-e¨,v51oR͔H˄PKeO^P1ܣ!T6gJ'qy4])]f +.Ն "2n4;3++! R52*':LcX|{D.-dxj #J =MHYMk5~&dǤ%=#壍r~T5m\Bu\tH߄tt!(!A}(T,i^БDy4M4選ƹvU0uD1#=;ZGu\vkE!DH>$6fg]57GF]l5XuRn#lvtcrIvXoZ$ PAM# D)S&N3u&{x}ßietpXow}@Z.`ocÄlsq #)nMyͭ$N wMUt ۰E1mjsm4=yDaiU)L B^CE{\^M*iVC*R !'j'p_̞XxPlg̩NIENDB`u1f3c4_1f3fc_200d_2642.png000066400000000000000000000022471326020644600342710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d^IDATHklSe9=.u2cDLѹA$!`#K0F~1Ā)`D!=!B!.6an"T"+Cn<P3td:{*::,"L/B)a\f>~*B(ࡻBt-0VXئTc'_ESJDBO4W3%IkwQ #x5 0dZg1/NϤA l Ċ57I]K~%b)?T9 ^J P $ShYS+2G/BȮPL IENDB`u1f3c4_1f3fd.png000066400000000000000000000022711326020644600330650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dpIDATHYlU]fi:SJ)4la-% c M R52( B"E" K%.*PKuZR3({w{ M6P=%]SևpҪ]Xytŧa<bgKoZ N p!0JO¯;pdg5y,"ٍn'-d 5i'Xm+>ci+86Lk b!HԻ^8ڐCݫB{B iJP'r"E7k%O]P/w.!7IPǯ)w-̱R 67bWi Ec Ǔ˟[ zJ_r4֍UBQNI>@+JrsaU N$ޯqzta8Č|;n єP8_Fbl !>ZTֲV1pG6渉1 3mx_<* ڃ̷>hDKU&'O084i8 Tex!-yBͨ28jrBČ\nViBܹm#؆ҋ˜"%zL[I5%:pSJ)_˸]YIENDB`u1f3c4_1f3fd_200d_2640.png000066400000000000000000000023521326020644600342650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHilTe;sgNN-P aV*H"4CDeAL{[#KZ҂R -P;s?tZ!z~}s rmRTwl %Qr@p{W+|x\0Ls=o_' &Y,'͍}^^QЭo/=^wn0tݳ1n3-}9hMFPZGf%$s4|`ew [!p|GyBZ;BMXTp"[!@96Hӫ h`-XV<,##U[T,JePϯ `˲m-#/<"ʕڞY ׭8B4(UUV8/cZA[2oް]vMӸcP|14BQ>(Aݦ d R~OmNycw<Wc+$[m^:)^B%NcW*Xut$.[ 價Џ@Z9SUģeUo8>cܣ/ on86@ʄ,> &"MUY,)ڲΔM~'4ԭ!Dn{g.Jupϸaك%e?|)W)wwƁM Qֈ#Hw4^Fus#ƴ_l0t7=-0(q|${,`WL,ιȍ[3R,Gʻ:Kt6cdvPq0KȰ(/)`Iry <ʵ4@ @nt3.Gc&% &z`Zv213^ϟ$5Hr/YoJ?$%{NߍCWLWc6q S}.=:aSAvA<8W-B|PIV"B)أ6Fe+L9.[cY䔑 _zBȗ- Ja^*{l8R21ytEFjMU'\lD8PaZEmsE2ᘉˮ2ci+86Lk b!HԻ^8ڐCݫB{B iJP'r"E7k%O]P/w.!7IPǯ)w-̱R 67bWi Ec Ǔ˟[ zJ_r4֍UBQNI>@+JrsaU N$ޯqzta8Č|;n єP8_Fbl !>ZTֲV1pG6渉1 3mx_<* ڃ̷>hDKU&'O084i8 Tex!-yBͨ28jrBČ\nViBܹm#؆ҋ˜"%zL[I5%:pSJ)_˸]YIENDB`u1f3c4_1f3fe.png000066400000000000000000000022731326020644600330700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|drIDATH[lU33;]ڲ -JQhQDByѤPEY `H"5&hK%@^NwfPDh?s/MeJCFJӥPK(ɒgMY3;{&/,#%#Pec Z z{2 ^EW( pRAW=U4Mf{qpUbURGWJp_CmBʤ-oBOֵn춋 ϟBqej&BjBbnŖ-F\uiYqQ}&#m+ Bn[VYX).TpiRWX"{Q/O)ܲ:͌U;5|޴j[g̱BV036ߖ| Y%lq]U.(P41`d?DS}o(wnDd$hۖK|)!=L٢غnWm/.2ߕP1\ PTg/l9b6M=I}hkfޣIvrPԄxMMpBww; g'˛ɹ4_‘rwmRڅc1qqjQI(i ̑Nޛ ` gqhऌh3+$H8i#p+oeZQЂOOHW_e[ʢxq>,gB^UPjLz0rs ^]4Q\Ui/G @'%?q^W4:X6#̐“c3hB"ŭW[(1I%U=#hiN'zs9.f b`o j@Fx[ф_p*lf3%_|> /jۙr"u9#;-< _jrqcO5ᰨ(ɠD|`vѳ# !o=a[|!Jw]zJP?Øzf5e)PFs{,ܒظU"uEҎMt(sLځ'⚒Fmoy ~ZHQE-󅢜K>u󟗒5:3o m-my]7ʻ|I"x]Ѯ P>@$خc~tUxMKU8Sd#H(l vYe^`ʪO8[`5_rroćM,~4cFF5* Gɽ2|뫾8 !n$zI<^Zo`w`!*^9tǐ_rc$(Y/;u )I{ևKo+b@O;ɢkD0(I W1'?mbIC{\h)R37~h#;jA.:Yv7}Ou[3(7rޫNvy)\6B . b>K5B8s5iRP$';7G: A%B,@B#U#7h`B݄?"ַ}>ABD4!An>TErVf%5Q϶AUCٙpZFo8Բ´HgZ6V 6ܙ&(iPQIWi\h2@ <ܥ*U`fk2Q}=Abz `1XMcFv|w ~H)J=4 \ @P1'+&7 %vIENDB`u1f3c4_1f3fe_200d_2642.png000066400000000000000000000022731326020644600342720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|drIDATH[lU33;]ڲ -JQhQDByѤPEY `H"5&hK%@^NwfPDh?s/MeJCFJӥPK(ɒgMY3;{&/,#%#Pec Z z{2 ^EW( pRAW=U4Mf{qpUbURGWJp_CmBʤ-oBOֵn춋 ϟBqej&BjBbnŖ-F\uiYqQ}&#m+ Bn[VYX).TpiRWX"{Q/O)ܲ:͌U;5|޴j[g̱BV036ߖ| Y%lq]U.(P41`d?DS}o(wnDd$hۖK|)!=L٢غnWm/.2ߕP1\ PTg/l9b6M=I}hkfޣIvrPԄxMMpBww; g'˛ɹ4_‘rwmRڅc1qqjQI(i ̑Nޛ ` gqhऌh3+$H8i#p+oeZQЂOOHW_e[ʢxq>,gB^UPjLz0rs ^]4Q\Ui/G @'%?q^W4:X6#̐“c3hB"ŭW[(1I%U=#hiN'zs9.f b`o j@Fx[ф_p*lf3%_|]ڕg *G<i7f`MV ^Utmr=J'^yfP$H@X1qV3e};@'ujt.ݾBBP. P|uI߼X~#m\="D`QLbxW]I;EbOƄ6ȓHh4gJI("`0HpN #.ںZ $۬ |B0! -Th_1-s/6d:;$χ _d~* !6-('5&pULW3D}g] q]0F; =>ZR ^?p>8CDMfCks [QaT|:p[ÙFS:n%B(q?kũjVɰ< ;t_)o!dfQ{nU)J;xT{ ]\G~t!F舌 G^v1Պ?LP<WVv;IENDB`u1f3c4_1f3ff_200d_2640.png000066400000000000000000000023321326020644600342650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTU}\;әNaZZδ2 VV\MP jlԀM$H$F/&rbDCKJ ҂ 3sv`t=]a1TQMI,- 'cە iϴ2L.; 7#RK`Rp7w EIW\O>jư7'`.h5 U{핖߬2omw!?h6Pd֔\6etMoI $=BM4c`-k>>Lص0N{5PkU|U`IP30a[R1W֭լm!mڵ5xR/cX{{s;yviЖJ-kO%@a -]#lˁ6 +GStK+$g-}q8ϑ<'"15岈?A]5/GV\#z. "P ڗ;}ppBsD6KnxD[so${le?"D(Ⱥ"%]5 wrdZ06g' g'zCAs>U&#%}}LukJ4Rr,*ynrlF<D1[pЄyT!K>x#IHpSOI{Cl>.3bdޭkqw]ڕg *G<i7f`MV ^Utmr=J'^yfP$H@X1qV3e};@'ujt.ݾBBP. P|uI߼X~#m\="D`QLbxW]I;EbOƄ6ȓHh4gJI("`0HpN #.ںZ $۬ |B0! -Th_1-s/6d:;$χ _d~* !6-('5&pULW3D}g] q]0F; =>ZR ^?p>8CDMfCks [QaT|:p[ÙFS:n%B(q?kũjVɰ< ;t_)o!dfQ{nU)J;xT{ ]\G~t!F舌 G^v1Պ?LP<WVv;IENDB`u1f3c4_200d_2640.png000066400000000000000000000023361326020644600333040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHylTU7[ni).JH*`P%J%F\#&&R`:E@wA+H[ HKbͼ7VC/|9{._iK_)hWXHAi{O8ś]m9sn4Or_ԢNP>l`nQ^U(*~!{K(jDd:fRh: oD"aqR@뫮}Y*;Y>)wYη78qb--qOפg blT (q{;xt%&Sjyh_:P6ub?E@r$U"b7kO D_ePͯFfm~)?oekdd6j"Jf$(rDEC(*l(_M=r;7|f(S/i47􇤔(~rK "X۱,:ro>&)xFd?UU#/KY mB3rSW"j;YpY 0"6}rGgEj4.1"Me܍O"1v*, ΣX?D5L"(2,|xK-nǑ >$V8KE,uX'z=dv-5AB܊|m'e_T-BG:\2<6fycOr.䃦\ e"!GCUXǴf:o)ع֦'MrSu38.OZR>Ԙv\]w`#g|{$HXJ*o3(`|Ԍ :CPգES{[9&': &fEaf'5yZc;&Ʈq FYOD{T2<莙OŦ 60+*%okʧK\[RIENDB`u1f3c4_200d_2642.png000066400000000000000000000022661326020644600333100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dmIDATHklUwfvv![ܖPZ(&y"Q1Q1ڄĄ_HL `0`x(_0FyDEDb Xkׂmvgwfvmx9 CDJ[̴5t O^ї%޳r=E@M|(4ia*㦖:_xNji<{oδNJB"d( A3,~(ip{FRB&Ԫq έꛭ*i vYn.fuHAHg;n6^ KE=hݒ~\ja-qţUz(lZ!MVCz)2[־:سw=YR޼uLlX5Qi[ԧK=3D'c|T5[L|tK:wApT*U'iBQ V/|YJY#`׿ 8۲#[?pM[ҷDq(Y7jւxR:bmVU,_}f7(= : prW۶ȏe\"hIK}ؑ|{4e4"RG*uhϤO/yA\`Y Gʻ;3 Viw*B *l[pZҀF AG;EA~#&nS<Pҧ)~-LRD@R`ɏL(`hwB?ivRS )3*`)A~ΙM͡.PnCS@irעvi/F@ž#+ȕ$AGEu. ܪ'i~ #i- 7'Zx >$.ǣ:$6X]L ePư[籽ʇ7[$  5L Dh&hl7ye%-L y f?թ9T$?~{ L[gRwL_Ul1j&[#0* F!`\DN)9^P⺟";pFpMRmGm%DCΞ+[k:}>)'v2AFtXb#@|Nڹ=K}SuU-H>GGot+nDĚ;J U V7jfaI&yIf8.& d*;RNCۂӊޭefQ7JĿ 督%WZ `!Gd@aIKn$slB1* ~`:Lo͇֒jpr{aUzF⿎N-< >qPgx@^BD^lY,+"hPZPy .UMf GNC_A" AoG~%k9}I^SDr&7nrtϷ2m#A'MbuM@(>= +Gu}3/«vǛ;>U͢BSߓU/wdg٦:zwCgʇ# ~GM\@lWޖΩLlzmy:k# NҰwiS]/H?5tS?ٔ:7rsjW#Av 归br9pn};[HYZ߸͏'* 5nqzK-X;b{ϝU Y/bqX|ybShtxfff], "'ývTU"4qOvQ^xx`~翪dՕ>5mkkgi|{ glllǁc,e C!,?P2`X,h =+/-b&w10}Ey31i$߀IENDB`u1f3c7.png000066400000000000000000000021711326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d0IDATHՔ}LUǿ߽\H0A mjjn6Ԁj-g\mw$[JD#2z׶ht R"׼{~.\>GsWV'FmTs)noZ:.c:Nu{4XPey٤piiwqkdLuY1v_X3HL6A`QDL[N) )))ۊY UZ0\BD)feeaV?tO%E#[&hDZ4[b*f;/gth ޾~["m:VLf9z~jn@f{쬩0Gg-aE]\|u3W7sRj5Í 2yhdBVp'CSPq c _XvX?d*!D ʼh&ץ?q MMMZ"'' 7PWJ 膘24q{4-NO[]P!9rmvnհ@Vb_vݵVL➐_ܥQsafF:0M jg].W^(>6+y2 GxX+3h{}KE#ʋc`0ڝ f&Z"-ƨ 1wv譊?R<`:XS^~~&Z_W.k<}!x38$`0cc}W h`=48O@ˣn~z?`LxVPf*UUe^:wFH2h5IENDB`u1f3c8.png000066400000000000000000000022251326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dLIDATH{Lu?!Gd4/̔Jjs'\YVYX3u-kfYb\ttE  !{.:h j}=ϳ}~|%nCo," 5c$KadH#hz|AOyi4u*pN>vrEЬ6~S_EU"V.(7o[^fS'ч+wO%SR1Ii"GQemg3]Pdfb}[Ԙꖊe_H0Eն\dHuoaiphvr%(GьYXVڛO L3MS_6s'FHr׫Eádmܔi,ߴ'{zh9s~jL#h9]{rPzC=*M0`uR[x^]i9jm=|2hVVlڊ$y%:ZfՖ8].$IJ9sTŢkF2<E9F,BW,#3'94{'G8x+'Uww0V\ x|:r8wk] Tכɦs JﵫټpOmT,oδI;iwpkE)d$|;ʈ'>i7He3G[Z2GZV;d! ݓ7E"ICRT5 mLX,zY8+W#+7M%I,_;ZPwx_XftYzgjMt[_4&&nvsow7nk&y;g|3;L?޴ϨY1ǃc#od10u[Q@Pኀ/A?U SC}U2M Vmw* o*<.K)"O'ۇ_Ppy qEkaBзUپFM5+PJQn"Yy?ރ{;:[׉Ns_qyw_3 =rm!awąk w#g$wd޽u:ڀ׼ [_?x~Ux9LSK>z$OP$R ]$a=uv 澖PEZ,T[\Hk= 6^ݸtxlZvR9:=UoYؙ@ŋ`,nlkhwPWL]bf ͆Ε3@.YA*D?zjVWrmJ@ f-rBtA6~M˥|`?-3$qep"qoVIA.{T/zpU`Quh2hG1| ¨BL SD25Go&;>?+y'¡S8ީX@ )n@UΥsrjey"@ aIENDB`u1f3ca.png000066400000000000000000000013221326020644600321530ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[Mak}>9̞q)r)͋bHryH.2P*1=Ry!5Dp!m?ğFhWk ǜKTBE(FŲ8 ^+F$x |B e&W5a wpJˍ o&;Kէs MgUd@30Ou})Jv&D+/ȗ ukB=cO@EmF#` 5"$%Y~[O%ZΊqBt~tXl\ g0qw8j|(1.O3+Ya{*"p>hj=q\jAн֬vG _B}+KATgo/UXy[TZG»2bh# d#oIENDB`u1f3ca_1f3fb.png000066400000000000000000000013271326020644600331410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMHTQ7謹3d~eAE26(( ]A֢Ui.jU95VS*:3"),MxVϹwϹ$Qf\0=WRT=<%Niv(OAqJ-fEV<2rhɌ-?r8j3i@‘l+zqOI>x9$OܱZ2~q}Tg.vg&=pd;LPP,{3zdzbހEfwǟ\a\rCu]E:u]u99*ꋣݫ}StoDk8P`]p370({`\/4mΎ7t 3_ o ^  ~ńz?+ km0y-,\OB"~iD{IENDB`u1f3ca_1f3fb_200d_2640.png000066400000000000000000000014021326020644600343330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKHTQߝ{u9E *"AkѢEmzGVPDAѢv+EȢ%X8:3νŔN)D|7Iuګ%Z**+^#jwZcRiöuQ{. ῱F5|GJR"KyWh}3S >zbQRm|("ozӾjm&CsFz#*x+6ҙxX+bUʔHZڢȨޖ`0Mm=ڶmq.+~:_6wg%X%;eypZڒɡ.f]Cioh/ό䌞&`0dK߸Gge05ފ{}\L*7}NJCֵ1环xwlfj/Um+!}w#ͯBanbBȦ7()C5οⲡ%^5a윺MDp)C;plb^vdtz5=NmVb ot56 C5v jl'/=Ԛܾ^FӴ(Ѭn;Pͳ1ejW~qnS?7<842ӈ8s 'H lp&ƣ?w9D&6Df߭ȌIENDB`u1f3ca_1f3fb_200d_2642.png000066400000000000000000000013271326020644600343430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMHTQ7謹3d~eAE26(( ]A֢Ui.jU95VS*:3"),MxVϹwϹ$Qf\0=WRT=<%Niv(OAqJ-fEV<2rhɌ-?r8j3i@‘l+zqOI>x9$OܱZ2~q}Tg.vg&=pd;LPP,{3zdzbހEfwǟ\a\rCu]E:u]u99*ꋣݫ}StoDk8P`]p370({`\/4mΎ7t 3_ o ^  ~ńz?+ km0y-,\OB"~iD{IENDB`u1f3ca_1f3fc.png000066400000000000000000000013501326020644600331360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMLTWΛ `E ]MY4ąk Ѹm-.4ac\4]@hbq'h2&&*ABGd& J0n ս{sO΅eml4][]WF1yѮo 5:GB$UWS'@Nv,XQ  U1|UK S`$,0VE[sLe<-?9VRc6ډtY96߈Z4QMז) ~ծ_wdr%5mw4+>q_^Xᛥꯙ5K泯m_=?N爻!r@CaR_|Â:zV~nˈKLR6;^_GPTAD_?Ej\Fںoz7c} j(di G7׻GDs JUkgv-8[IWrgk UqY& ˁ!.Mj$mxy򁋷_={ Ĵ$p(l&;}:ޕr(c<[< 3~44SyW>ЯI &z{&{̵ D|Eq_^Xᛥꯙ5K泯m_=?N爻!r@CaR_|Â:zV~nˈKLR6;^_GPTAD_?Ej\Fںoz7c} j(di G7׻GDs JUkgv-8[IWrgk UqY& ˁ!.Mj$mxy򁋷_={ Ĵ$p(l&;}:ޕr(c<[< 3~44SyW>ЯI &z{&{̵ D|E棅Laϳ|GHV}_<ଋj@,W5qlR AA,˪cS*~K >`Qtvhweډ׶kv-Tfm4rke3/Pl68e6uExg^y[?^aԊ#Xn˷24ftlq)ǩǩeBJgΪI]:u N VpXgMɫ}Q Ks{΢WC1  |x(+nx"#ՇQQPX bg4^0&OR)}p޿*{:==}kٱ>Oe4 0AS.ma?s L+d2m wXD43g<.*:Tw/=C%esyWkާ/WK~H D$#txwLA IENDB`u1f3ca_1f3fd_200d_2642.png000066400000000000000000000013541326020644600343450ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMhTW羗&yyNlS[*h7%H\P bt5I e6"R`]t!*8)%|5q183;]4!SMu\sνXlIGonO+X,fa`/ T`X`յw#@_gVE{ *k:AUP Hyx+5QTDU≯Wt_E̋R߹^4j9+s7r3싩??=UTY[` {WEF?)8 >棅Laϳ|GHV}_<ଋj@,W5qlR AA,˪cS*~K >`Qtvhweډ׶kv-Tfm4rke3/Pl68e6uExg^y[?^aԊ#Xn˷24ftlq)ǩǩeBJgΪI]:u N VpXgMɫ}Q Ks{OX*Yo/? ׂ>9e;e531\G ⅍{Kk襪HtDjdXk,Zk?zУx[$DF75tE< WXѢ7E;S]k€#%d=n/>]*J}m3\9fF``zo+7hU?=au C)5V&hP]gBW|,`cXv\( zr5m&na^+⏢]{E8xߊ'+P/ȶ ID^ED'?Z8*Fm?6G6"ߞ 6s,9^[)>oI8y^L}A CdnS_qn$ e_zzIENDB`u1f3ca_1f3fe_200d_2640.png000066400000000000000000000014151326020644600343420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKLU~|3 ByH># j]7XP]P A6 4MwmmRZJjy3 w] PT"Lӳs/p&k7ͨ졲Jz̙ko.G@pG@&@Dzr˻9]aJ.Ș/!@kAj)ݑ ~X2 n)vsc p v9ZշsI涙7?H#ټ <˩'ڻlnRផ9KGٺwV Z{MّO,="?@w>I_iQE-+ZUՕ1c5`/}9@1b[Z6)_F5 no>8`U46egi5S4/LJQם٥SDH?kӿRnэy*=Jx8ω2{ #zƚOt:uׅ[?-#BDhqwr4{ ?=r;&"oQ_Bﬢ?ZJ L#Z8$F[Do$=ȝqm!Mo[bf,Tm L|AnŸb_ϓ|zMIENDB`u1f3ca_1f3fe_200d_2642.png000066400000000000000000000013361326020644600343460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKHQ~|:=FTEeAU"*Ō-Zm"Z EDH`R [˂0衕`ij3Ә=&<{Lo2zrs*ZIs_WQ]Rȱ`$z # l EdPF;)T =J€ւh! θ ; e)t>OX*Yo/? ׂ>9e;e531\G ⅍{Kk襪HtDjdXk,Zk?zУx[$DF75tE< WXѢ7E;S]k€#%d=n/>]*J}m3\9fF``zo+7hU?=au C)5V&hP]gBW|,`cXv\( zr5m&na^+⏢]{E8xߊ'+P/ȶ ID^ED'?Z8*Fm?6G6"ߞ 6s,9^[)>oI8y^L}A CdnS_qn$ e_zzIENDB`u1f3ca_1f3ff.png000066400000000000000000000013471326020644600331470ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKHTaw^uJÊ024, zB"qQAm* zͲMD1A òw>@KKԹӝIġDgwoIDTדBsd!ZWGHDu= a0i7D=tL@% 5@`jH bFyeMj5h\1@ Ca|"z1- u4\$ 6Zg&=B/ޝ#Ll1Bgfx \W+uKY#Wҝ~r $Ox>Ƨq&`/I4^*t0#@&hE Yz(Kr g7UK L4%i t\nNX4d*]3@c6C<91kx+؁ ~%}_S-֍7;乔M)qi5Ju;&VRI5ߟsb穦ܣOs9@Tu;1t7^m>w2y9ܛb@n*^݉!]m1jZeTж-~g fgۖ9v$g[X07 gL-boWэ6IENDB`u1f3ca_1f3ff_200d_2640.png000066400000000000000000000014161326020644600343440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKhTgw̝d$>6FcD ڬࢊJ[|e!XEQ|FUčEEąb21#3s\:nij9>'FUV׎rxK[[DQ]یuZtiv;yh`|V\AlR`^0n|=~7^ @8bvCjD<--͋+P`o͜g|&ٹ^enȽu [,a=~MX9:5+qGgGRަGo':C ZWHaU"]stn2Ao45- rl+/3@TkR0sƠM.=lnn}x2ո63ex1X*[: FHq&=:]v|_Ӎ6%X sdb'sPl姨S:ؾxۀ_rNnNùّuu<ծ rPsTq{ZMnce yg<SambEta#0{ Xcf)+R[<_J!.J*/b36uka]}FpUĶy-C~"t"laLzSYm 4ޭ?@"_Oɟ @-}"+IENDB`u1f3ca_1f3ff_200d_2642.png000066400000000000000000000013471326020644600343510ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKHTaw^uJÊ024, zB"qQAm* zͲMD1A òw>@KKԹӝIġDgwoIDTדBsd!ZWGHDu= a0i7D=tL@% 5@`jH bFyeMj5h\1@ Ca|"z1- u4\$ 6Zg&=B/ޝ#Ll1Bgfx \W+uKY#Wҝ~r $Ox>Ƨq&`/I4^*t0#@&hE Yz(Kr g7UK L4%i t\nNX4d*]3@c6C<91kx+؁ ~%}_S-֍7;乔M)qi5Ju;&VRI5ߟsb穦ܣOs9@Tu;1t7^m>w2y9ܛb@n*^݉!]m1jZeTж-~g fgۖ9v$g[X07 gL-boWэ6IENDB`u1f3ca_200d_2640.png000066400000000000000000000014101326020644600333510ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlLQߝ;sJ6!QB) "$ %*44X *J3CQL[>f=C5F|>wZ7Kv#%y R6.M(g*~ N[DU~1bpRh}F4D- 4j$|QJwfR"[#vTLhmnu:Z}^DV@Mh}]֒д(7.Z- iWnpY_z;$x/ݭ,ZR w;a^U|BZ]{ m@9}f*źM0'ަt`81c :UpSUߊWc̙ +G6ZǸWڛ׾'wHJH͕\gҒoz;v0 Y=hFCQ;\9g'g &+¬w\Jjsl" q;5&\Oo챩I {QR?37ҼviMn'%tZۻH4 =PAw:DTF}nj׉IENDB`u1f3ca_200d_2642.png000066400000000000000000000013221326020644600333550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[Mak}>9̞q)r)͋bHryH.2P*1=Ry!5Dp!m?ğFhWk ǜKTBE(FŲ8 ^+F$x |B e&W5a wpJˍ o&;Kէs MgUd@30Ou})Jv&D+/ȗ ukB=cO@EmF#` 5"$%Y~[O%ZΊqBt~tXl\ g0qw8j|(1.O3+Ya{*"p>hj=q\jAн֬vG _B}+KATgo/UXy[TZG»2bh# d#oIENDB`u1f3cb.png000066400000000000000000000020021326020644600321500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[Lu?=' "DA˱6C9̲Q^T[L/Z[CV i2m TD QH|t2QXo{> W{dMP]{Qrժ׎1 fE>WQQm!u" @yW]Z ,",jf U@#bx }^rNjH@P@( [} ~ib2 6^(bEdRS;8weV+؀@[{g1Y0ƻU~^ __Po"};+ s}Q}< B"辑6V֣- [g(IY YpNwնGZHV-ስ6 e KRv=  r T &AT D+Ėx6lPP%ѴER"0u L `k*Ht3coD@tiiN᤭%ꇛW+;IwNRZ\h8<!P?Ůz8,",.-9Ǐw{~P|rj<\S.| Șfx|O=Ɍ[],sn${dZcBXıkd*~NOyh3Ǝ=#PPU/x$&vUz;|N Vt7iDr9nB:0GQ)׮>zk; Kf̔rz8uU 3ik`}v1RWت(+iF{?cNGC k#g>6y >qlcʆnބ/H9=@Zn Z_b v{ 3^G`IqM\ʖLNV:jǰtp!2 ?j&e,$yC>VNV,!1@ &6 aj)3IENDB`u1f3cb_1f3fb_200d_2640.png000066400000000000000000000020571326020644600343430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]Leۍ2:PH n-l.fٖE P&D2-.t^xfLE:g X2E tu+(o> >*}L{ynj"4' %pU|Fe(/@+?3 8 S&z6<(@5V >oˮ4UZ>k6X%IN "cr`@x3g, `BtIUA! ɀ~L%. U4z&{A(D_2 Mݖ!Mn@[EWf܂n_w끶C`^g 3L$8zxl2o`;4艙qLY0V1/jMS_00b6d#Yb v! /ӐX|> gR;ʶ8bdm]Ҡs~3 لr3p)lBY:6c\WX}Wń1ƣ8(mIENDB`u1f3cb_1f3fb_200d_2642.png000066400000000000000000000020011326020644600343320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[L\U93\CKKj6NtLHD1bc4&}31&hIFq@J \ji:̌th0\e/ Pi:_vv>NwնGZHV-ስ6 e KRv=  r T &AT D+Ėx6lPP%ѴER"0u L `k*Ht3coD@tiiN᤭%ꇛW+;IwNRZ\h8<!P?Ůz8,",.-9Ǐw{~P|rj<\S.| Șfx|O=Ɍ[],sn${dZcBXıkd*~NOyh3Ǝ=#PPU/x$&vUz;|N Vt7iDr9nB:0GQ)׮>zk; Kf̔rz8uU 3ik`}v1RWت(+iF{?cNGC k#g>6y >qlcʆnބ/H9=@Zn Z_b v{ 3^G`IqM\ʖLNV:jǰtp!2 ?j&e,$yC>VNV,!1@ &6 aj)3IENDB`u1f3cb_1f3fc.png000066400000000000000000000017531326020644600331460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmLes< Rks$䄚m5Zq͖/8j*f}ik}0ZN▚1t&h0@EMπ8/s_}(A>"80d/E355doJC&tz͐&^ !׊t..EuDy$Z,0"qo+^Ng4 @}51@+bEƼ`ܘtfO@ޜ`tehQ8&L:2jgy@A׸HtcY.B$oj$+3} #6/m}(w|oC+2=lhpxɧ=塑ؾmC:z^: ?SPkK,,TU֝"+ ־|¥]mW ֒?CDǽD4]@xG8tF<3 69j޽nFA`14SxJ"L8Cܻk$f :>՘kw: zʈ`݉6gJT#`P6~hhYGG-55'w,)7pĮްlXh!1(oX~_sXbiz{z7Vv=WM~GKGվ6'(Cejoڲzuޜz@OӌI"7Mߥ`=虩RM_-l$gT\iC=2RN)yiXz,n DReW׀3કOޠ}U ֿx}urDRߚIENDB`u1f3cb_1f3fc_200d_2640.png000066400000000000000000000020271326020644600343410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHYlTe3sgh SmĢUQ"7Bk@1/H">h\b! $,bLC:Ba:EvfT^=g}5#R>=eʓ۹[*P1C55 @8r!Zq]8J=[BDx/ƸW"_;hNа TY x8=6dy @޶QqGmZ?WC7spG~m(-"r|*mEoZ?)Z{߀q3"}9ephѽc]qzdâddZОNh;מ"80d/E355doJC&tz͐&^ !׊t..EuDy$Z,0"qo+^Ng4 @}51@+bEƼ`ܘtfO@ޜ`tehQ8&L:2jgy@A׸HtcY.B$oj$+3} #6/m}(w|oC+2=lhpxɧ=塑ؾmC:z^: ?SPkK,,TU֝"+ ־|¥]mW ֒?CDǽD4]@xG8tF<3 69j޽nFA`14SxJ"L8Cܻk$f :>՘kw: zʈ`݉6gJT#`P6~hhYGG-55'w,)7pĮްlXh!1(oX~_sXbiz{z7Vv=WM~GKGվ6'(Cejoڲzuޜz@OӌI"7Mߥ`=虩RM_-l$gT\iC=2RN)yiXz,n DReW׀3કOޠ}U ֿx}urDRߚIENDB`u1f3cb_1f3fd.png000066400000000000000000000020171326020644600331410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]Lu?r BM7|!͋n|h5.B[.͚k-,c1\QE) p⠃s8s )r/\>~{cuu>I)Ѹyag!ߖasϻ-+U 낁]#:/FT'2q]?w͚[pdd OTZ@SNT5Gw^;5kW3<2Sg?#yҼ;;:6jfEH<HƑuH@tG*|D} yIENDB`u1f3cb_1f3fd_200d_2640.png000066400000000000000000000020451326020644600343420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHTmLe=缜<N mRܔ̡ra5Z4ϊi6ܢMɂ:*pÇ{y| OW\u lyj/gʒRC^ɜajzzhlr7;9:3ѿ2+SNkmRrwrLv!HK;g6nJb[i[t-:7yl2{ "QW?djvZ;U.zlu#08ȸNCkBO7OD39ye4YN!M `pJ$ֹ얆h⋖4tΔT#1UFz]ѡ m4h tg'0M'x=;X8QQwhx1s13P+&VE#"]z}wpx%؝o'^w% έ4[:"`vRru2r1c<?{! no:uCIlUs;`EKU̶&p#q{ڶZsʌj@f0%7>-5{d왇6.϶} bSDz i)Y1$&9[zg1h=F;ܤL;z'gJe@eIۛjܓ/y3~ԟn)_Jʑ*-IENDB`u1f3cb_1f3fd_200d_2642.png000066400000000000000000000020171326020644600343430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]Lu?r BM7|!͋n|h5.B[.͚k-,c1\QE) p⠃s8s )r/\>~{cuu>I)Ѹyag!ߖasϻ-+U 낁]#:/FT'2q]?w͚[pdd OTZ@SNT5Gw^;5kW3<2Sg?#yҼ;;:6jfEH<HƑuH@tG*|D} yIENDB`u1f3cb_1f3fe.png000066400000000000000000000020511326020644600331400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]Lu?^Ma"TeDS[eh^´ 5ʺ(]ݨKrrdHs@yNCyP׹<~1޹q~5_$O?xcy.gîHxB;IEȶEފpj[@ue[=^Ј0NV\OU݂PU7 TڝK % [2vZ^1;WO;wY(7Ewߠz/%yĩ t>UuZX~@YpȡvoW5a}w}@勮ok?qlgm=)EIƘi 6i 6] DQhpgcծkOthҗlˮVXNKtyqk;%zyV4M{N9H~si)j y5< ZM`eM-Y&'? 9 <^7'o~gjzՇtiD}{p-3L;H˫*")} wwz}pf=ϫMFqeRF*z$n(}3\x4Pm{;(U|+=\WJ,c+ꊘ܁D$5LMώIfo(&w9\n2;r'nʜ`cf>Q(lg:t۲_ܻHpƀ#ζXMF5P"Y޲(,ݾ!`ylQ`35F TihBHMf-xbr<o'BXf䤌w]41's'gxfcawrFq/F~l3O^5j/VO )]0af8IENDB`u1f3cb_1f3fe_200d_2640.png000066400000000000000000000020461326020644600343440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHTLu~><k0Ć(IF5W4+lMsd&\iZkʭ4sxl,ȀJd8~;z<|~/קO'Zƺ=|y۶X=u&KaQRiP9dC 8%)gTӡ](Ajdfk BB DF-ef3Zfo`M fеsgru)4̪PIxKS9n>"Ot{=qvHix,ڲcxc-,0?V Ӄ~Qev)DzGǼәľx~Yt/{WoޟkXsP/ I˿yl2F,p|ZZ'.Z~ghUK@;ָ|mӶ/Min *N\j)T~u_@;aƘFH+*DHzMw‘`܅eǃd};FM ÷1RqH~?PzdNn#Oڏ{(s܈;ïĨ;€ ?F@dL8*0cDd(w͹GW̌ۗ8YGGlk߈An󇜉7qtlҰulөW,CH:К`wO=w1{\9{K>ږԢĤ'^'h{ ɨVdD :eMqn7lĸPؘD!Լh&j4S<x QY.W:$`fGG87Q;<5;nXù-9`v$ݾ4FӈxϖJe@eIEU[f;~Ȅ_YkJxIENDB`u1f3cb_1f3fe_200d_2642.png000066400000000000000000000020511326020644600343420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]Lu?^Ma"TeDS[eh^´ 5ʺ(]ݨKrrdHs@yNCyP׹<~1޹q~5_$O?xcy.gîHxB;IEȶEފpj[@ue[=^Ј0NV\OU݂PU7 TڝK % [2vZ^1;WO;wY(7Ewߠz/%yĩ t>UuZX~@YpȡvoW5a}w}@勮ok?qlgm=)EIƘi 6i 6] DQhpgcծkOthҗlˮVXNKtyqk;%zyV4M{N9H~si)j y5< ZM`eM-Y&'? 9 <^7'o~gjzՇtiD}{p-3L;H˫*")} wwz}pf=ϫMFqeRF*z$n(}3\x4Pm{;(U|+=\WJ,c+ꊘ܁D$5LMώIfo(&w9\n2;r'nʜ`cf>Q(lg:t۲_ܻHpƀ#ζXMF5P"Y޲(,ݾ!`ylQ`35F TihBHMf-xbr<o'BXf䤌w]41's'gxfcawrFq/F~l3O^5j/VO )]0af8IENDB`u1f3cb_1f3ff.png000066400000000000000000000020701326020644600331420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmLUyPX[#EI0q@DfFDHc2&#ŗhFfg&)[` 22@i;^$YsQU y!K$zARh@F1 c š[9O\A\ dD `7[VK 9/1`ZN#ޱE '@"sDċ-wS%鉏5lOvne9+iOr~ ׁ1uT>Q/Oَ@e-$@Ogg[PԿR^ˁe%P8L= @㻇} 8FzGƮ5Y{) ~8z4TtH10Z 9{H{om;\⋺׋.{Ʃ*͐ɉuZ-}dVW'yB$zgeEyy fSi !͔|pG;\㓶HpXwGQALyI]9im:r"oTmN׋HOt'?=8i֒) pxor(7%.!1zp1 0!>_+%85.;bdۈR!s VJ A;6"9I ƌTwg}ƅCQ;5d[ TS \UdPWYygaɄ"i`< o Pzw3YuvlwL9v1zW־o ъfCfÚ;7?8:;|+586%rA"mڀ[_%-wljۣ1LԸk'>S1:gћ^^'қ޾@'#?W ׈rF:_^?s1's>\?IEkIENDB`u1f3cb_1f3ff_200d_2640.png000066400000000000000000000020241326020644600343410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHT[L\U];)PlZ^ M?Gl/"m`a&%j0[@Ft(-HLkKu[[JPYӿ#:āoZϕA8 %TVoK`)?Z)lxy d5@Y%b ®x?7g$K.( _j:731sALJt}NM @2C ~DB{w ݠJ*Ln]x(DY2tO2[̉Bwut =ܧ3 ^vyy _q !{@0Dxݞ^g|> Ku o|vE3~7HZ^j<(y񳲐_3(+ oԻ e,.b ]wj1)f$>֣ ʆMgkn [鼰'9z,m#^ cקKӭ4#x &4Ͼ4L9]#lJL7|># yŪ}O𢍝`%.ʏōA~ ?`fpa/d*VeOD|n13)17 oփ+#b'ce@r fT/VQ{`ol^F!fGYK"ejV ?:㙀tLcPsJJש̽̓=/yx̨d4&qw '.~ ^ZHRۀzX%-L=4~=Z27,hk_Q+(-OJMODŽkd#(Ęlۜ:%7VɩSNfw4;du&V^* \3Lh`?R9οh;.IENDB`u1f3cb_1f3ff_200d_2642.png000066400000000000000000000020701326020644600343440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmLUyPX[#EI0q@DfFDHc2&#ŗhFfg&)[` 22@i;^$YsQU y!K$zARh@F1 c š[9O\A\ dD `7[VK 9/1`ZN#ޱE '@"sDċ-wS%鉏5lOvne9+iOr~ ׁ1uT>Q/Oَ@e-$@Ogg[PԿR^ˁe%P8L= @㻇} 8FzGƮ5Y{) ~8z4TtH10Z 9{H{om;\⋺׋.{Ʃ*͐ɉuZ-}dVW'yB$zgeEyy fSi !͔|pG;\㓶HpXwGQALyI]9im:r"oTmN׋HOt'?=8i֒) pxor(7%.!1zp1 0!>_+%85.;bdۈR!s VJ A;6"9I ƌTwg}ƅCQ;5d[ TS \UdPWYygaɄ"i`< o Pzw3YuvlwL9v1zW־o ъfCfÚ;7?8:;|+586%rA"mڀ[_%-wljۣ1LԸk'>S1:gћ^^'қ޾@'#?W ׈rF:_^?s1's>\?IEkIENDB`u1f3cb_200d_2640.png000066400000000000000000000020501326020644600333530ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]LUyւXUs(`LdGP.1[%Ư87 +,q [tE&2:XKG9^1?!8ܜa|ߒ55M'70K_UնqftNԧApq VQK"کA9 & P:#zԋ)l}- t$Ƥ@NV2"'@&!P80@PP^,}$:4%t"4)oKPn2+9ӪKվ٣ aH4þ!iMҹwlrl  @($oB'a:kOlT:t\gG*?ͧ- S:*JFa5WP['@S~13/4WL$ \ 8p-K;%ey5%_Kfj?-1<fI 2-;ޓ.g%|AKA'mY}ڇF t`DCF C[@]>f6pstV2oHªuN<@k=mXN4Ehըҏ8&Aٞ3J+&a\Rh͠紑̮pȝe3SFz %ѹ!+FBo@kxW1S=FQ0Oe1b^mVT,o{?07kx'gT,V9"P[E›}YBQ#?H]e 1Җpu1 AtuE auæ@-i4ŒuhHBXG"1^w[غ6GIpMy$]`9w|RA8 !̱8x9+IENDB`u1f3cb_200d_2642.png000066400000000000000000000020021326020644600333520ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[Lu?=' "DA˱6C9̲Q^T[L/Z[CV i2m TD QH|t2QXo{> W{dMP]{Qrժ׎1 fE>WQQm!u" @yW]Z ,",jf U@#bx }^rNjH@P@( [} ~ib2 6^(bEdRS;8weV+؀@[{g1Y0ƻU~^ __Po"};+ s}Q}< B"辑6V֣- [g(IY Yp۰)X`dX\қN <4x !` VfYYuM8D`S?]\ ̒jR5/#­Z@MMͬaMQ ;"߽iqXjCɔQvTC{մꪦ" Xҽ0}R)}1UGB&ЬzXڛW[~ 0hd@fy3;SHr4xgncXqbyzM!C "k5'+J@øȕ33D 7`ӆZ0Cbl5v]d TA#U^+z9]HpjfFH#=`F_T`u~[Ry3-υIENDB`u1f3cc_200d_2640.png000066400000000000000000000015511326020644600333610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATH͔KHTaw8&r+聖%C*hAEVR%" "![bTjEZRg&jYsw`%OE˧sV)êrsMs:d,zkFm(zImԻt ShC8}* P Ǐ6K+"jZjQ^6Awуn}ܗڝh{ۖwF.~41*%cZ^,h8+L%C"O%b@iy[Kj,Bbˁ{X2R6hl[ʄ 芢dW3)䑭Ṛ#@ Eaps۶hw݃>ẠY g޼8&!T\\|뾞鰝 (:y]+**5Mۭiڝ jJ/Y@_斃6'2Ǜ˥GG'hC5oiak71y9 늁&BIKcfveL~XqA}U͡ !v}n!0Cѿp@Ljd 8Nu-oh75#fb 1"{y+F*0<ɻn'8p,mZ K6+ @" 2S_V$.]5r*UYs79G*sVЌ0PHA\h1#FLwL^sz=~417GIENDB`u1f3cc_200d_2642.png000066400000000000000000000014761326020644600333710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͔]HSa{ԝIdD҅EHم71 #Re 7Q"}\D7QZҰ[67u;OjlŶ\]^=y;=Aܶ\\X 5*w'SnWnTwZ`J=;,jVR닛$nCD߄oN"] IbD ۊ]ϟZlR^y] &F<\W~/s r6=߅c{%}f0Dbٹ.erxf4@>۰)X`dX\қN <4x !` VfYYuM8D`S?]\ ̒jR5/#­Z@MMͬaMQ ;"߽iqXjCɔQvTC{մꪦ" Xҽ0}R)}1UGB&ЬzXڛW[~ 0hd@fy3;SHr4xgncXqbyzM!C "k5'+J@øȕ33D 7`ӆZ0Cbl5v]d TA#U^+z9]HpjfFH#=`F_T`u~[Ry3-υIENDB`u1f3cd.png000066400000000000000000000016721326020644600321660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dqIDATH_Lu? 9-]E]emZq֬`Rm ,ךsk5YS~`  !{ "f]t}o>}Y[SpmyҫI: ݟnL=1q[J+W;yl}BD-aH^ryp_wwԭ 0t= ^PnN7IENDB`u1f3ce.png000066400000000000000000000011311326020644600321550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_KSq?Φ4f6%ZpgF6H^tÈAMz]Hʠ 䅳c vίJ]Hw\~? 4hpph*GFbd%$Vu+\g]+:(![ z?M*e&f$M"֣[h(˜}X"}>}ZX,A m4P|EX4k&֓^Avl۶Ǚ^lU[+"[DԖuUc顡-w#5P"[P@J+|,jtA/Jr%?3ͣubg6Q}P՛ӫ|EGRa=jz0ct2pF̻k($R U)vK.]WvAJ&s6<1@ ]sNs|U").-NxR\myaO|6MӢegZ]HU# IENDB`u1f3cf.png000066400000000000000000000014501326020644600321620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKhTWsL:#I0MB2Q\))!"a"J $lnBBZ(d\RTJpQt|L{ m5gyw9>s늏ŦPk{|}d')|a]ے3?2`B]Um=˚Ogk}ovxԜ⣙*oGuӺd}6T;A+$疕5F@O^祐@n/|Zvo6nVxRF @2~*[?%*|"~>byH8]S?h'Z#C'PZA.8L9&`~h|9(}J&c{̌ƿ{wiRw-_אd9d.WDs=-;' PSu@ 2J~-

uӮ)9!lrtLV=j+f RwIENDB`u1f3d0.png000066400000000000000000000026261326020644600321030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dMIDATHɏ\WWޫ';{"XA$Kl ;b"E104ij;i\.JpVW}|^;SVˣgg'*b[k0.\n1^3hރ-Se(~-,.^/\!t+i2g7HBui,_(>ڷo}3ʾo&S KM NI^eva pסypFhdX)G.~t)QLgEÈG^K<W% W╯g|akU^YzJ)7V2],R qAIف ]t0L )a;%֮]+l~(g)ė"&!p@0T63rJ?h" CDI3[ m(<X v!)@)`ƻ;7nJ~ c "M$Y sc~ۥUH`&qq~L|WpyD)uaG#be10$ 4]0'eH9(MjV2E$3cuBtbn1ETqLJ]t(N2ui*qNF9=n0CZK?w>(R/k: oA~%oCJ4T;/Ŵs( q汝)F'+mb-) #ݨOTT[A29g +8;2JAu\_&T30 4"L>O i3G>;?g~i%CZ});zF{>/z|yf$:RܪV躭1J)yk6dTl*3u4+OD.gMzn^G&]ʤ+#jvޯQAucigOw1Lrpkc1I<o-~wF]t#F,ninۨQ?w:gRn| '_ L DaDVAbq À>R=PqMܻulGqrHm dryDr8B4uyia̳_^ td* b2qkl7Qdxt2RJ =I_Et GΙBM^wKb=mڛJafN j*zqC(E6Kp(IENDB`u1f3d1.png000066400000000000000000000012631326020644600321000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|djIDATHTKhQ$cIUQ*TZĕ(Dj46q` "nj-ZpQ)P(bJ?;?A⇪̼* Mjb2wyyp}!PVtnaI.+-EhlKinǵ6DE ZVc|jL?ehog : tk { P̪Bl79)"и0vذa]sv69L{Jqc[/yӍ@\x;x^L«zܼ. 59fv?)+\UN^w(*0۾޸Sqpmd)\ۓJ_}Y WWq.UE|{sGjU1ɔj誧լ7;}!xzְCӺ,;'mj01+zvC8=;c+ e5Cקj6#J\+/5|!kwosq2^ǮT̏^y߼\:SfNpvT#K֫ ~u ½Fu(p$\V*1TZ+(X, MO7}w7N"d1`#U̺KxPZ:Q-8^'dO%ߔPRTFMfheH4^}`j]NK-(_u2HǮ}taktp,/u IENDB`u1f3d4.png000066400000000000000000000016271326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dNIDATHmh[UۛMndIV}1v8nM7ā%c8؇˜q8/!j tTe2t1.ݚyi?vYV_:9~s8kֿZ'; hpNTK?kʧIrM x]n}ev>DwO:~ =G0b<%/\oI˕>vǾt9k6!<  +~hLn]k{:w-`CA>gdoeTK]<o1}u2[M&"BXeJ@.dž 7[{hQk.@4Xzi銐gEwRS^"knEӋ`pʨX]j~6P-RJ{W}eIV~zaZBS qr_+c)ppQ&&mRO:[º;O݃$q"ZA*J3qkrʖ7c01{*7.T)B ؄3Bʒ&0+`QT>ĊXIENDB`u1f3d5.png000066400000000000000000000017631326020644600321110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]L\E3`|C JjR-"h4>x/o}n6i4ј&1&4&6iRmD) {vϻ3>.JirfsvΜ}ﵭnJ=!}Z@ x! .~4KS&c<ʢrwz|5QqQײDє+Y=,ӅnW7r]&WeuZé|ePSM#ܽDǕ#<!:qPjMGVX+AFo0%#xl/2iڦ8P=%N rʔ~jc&R/=$3n $@s6^bclϗgTAUݤkRŹs}H;Gn<#UՄnɌ [ =y'T4Jr?%Q5+b_W`U5"? M5K7%q2[y|΍ !5xĖh"2T}2tX\}GSI|L\~|NZi1k+O.zcs0IENDB`u1f3d6.png000066400000000000000000000023521326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͔iLW}# 0 2n51.ՄFi5@L6UcRژmjn mRmU4FQP4E #,3ﯳs/_Ќ3 +l2+`@q2`ud/0Y5l/n}|tMS-7_Neuյ :=\h{5޶^4T{N Oz|W7*c{OI)eV}c]}עLs͛N)I?w ae0@KNlJK b2}Iwt46_^AΣ./9G]̈́+m ;3om6 N~5 6Ҙ$4r{Fd-MG y `髫cO^8Q;do:[sAGIC\y!x0.3DdV&.ep Ҿq'w 7L:!Cx H! ib9 # 'Ѓ~>}}?4L\T|K*wJ8/4hu}S;AYPAuX?z^1G{dLH toCꀰFi2H*ȟ!~ $V'YrrNgC'<!!x(`)<:tpzAMwWg4s;gR@3?r O)NrM(cN]17y9] u|U3񐗮{S) H,n0,(/=#+RAT3 24 k8 M[$eCt>7N-9f#obp(B;n"pώPE"H a.Yh3XMHO4EKN*aoh"jLc5Ep|6W ;GKZz:R/YB8=޵:z:g$?IM^犀ðNXšuV]7F_KZ߀ȅﶄ͑*+cXm`uD~KxS @Ds,$BS7$dL8& {AO݁_IJi'K[_ Օ=n\7 '/ObIENDB`u1f3d8.png000066400000000000000000000020321326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHŕML\U}y3 DP@65614q+ݹ05hdץ 76qe]ueL45X?m*"-m ̼ _mhlnr9{@7^N9KV~Ay9iYU!]ZWu9ucak2*Y\*M?+w_Ns֡?^笚6OM^ ]BȩqLxW;gylndU6_8cOۡ)TJPM*fZ0dPᵫ V.XCNPuI'Vms_M) X/  QzN5}RVݳUdBH.j1,F1;ڱ5’w;,CA;uc !CbCTq2= ^F1#ЋedU;^6cG;4!;-"H%Dj`=P3%kxytAI\Lmt")V2ֳ[_.̒퐐 Kxi d]"K}3ZI4Y0B12ZQ>Dmˡfi/Dks_PQ_!-_Γ[؇F"tIh>F 鐴;KB:#yܱmvEWHln!;H~ϓM8'\=юZGs-Z7/f \L. T C';+g-DI"z L~jSHbg?CJAx6^> T.^txSQ@Ͳl}OlMs;/u |~/K~~#O k `0Ss;:^l^ 5*w$K@dR*7ˏ7@nM$a o{{?Ɇ_IENDB`u1f3d9.png000066400000000000000000000025211326020644600321060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkleuۥwh@@$5R 161*C FИ Q4D PH[U.rٖBK[l{ٙfiW &9||spds4Q!bT.VDvI %) d:5,[gpLYׅ Mὲe%%٪ o&0HlPHR8Y0XAĿېXV /BT(!7-.w?]l}a){h806^ٌHcy٬q_( i4:+6sR>5Y"(F54]U=f$Ώg.Z,4H$m88v1ٙd lLCˍ4Rf1v{pttݩiJ(h`sъFd5Φ-4DO5ƜC .ϏåqSWn,",ZGqTrE MHR =_Le=.A`>@]Ȑ~h @Z1&ʱJtA@$QMfN7S2 <;V:Zt&Q]':(0϶s|< ?=Jb7~5b$K!Qd5fÙ"fF W (bEr,䙨P׭j5UFgPh }e&+O,>oo6 X3eG"Bʀ حTUbRbclU;xw0=VDCm:,!!g4dt{r oX`Aa%❹xh >;Z/f$mO=JϐcOzShNKMݎfuqgf5&Z^8E7Ȭ/`3I"jLA3X9?opxشM Hf`Lz2۫ WӪؓ8fql@ՄǖdG^li#*N/&g7pީrt|LE\= ] Pz&hvzis,ZZG}m.w{mx`rs}$1Aݸ*_Eֆ N4uJpoew}+[qYns |p )TA¡ JqvdmHlŮ~C,F]$ BwPȹq 37*_׶${g:'qIENDB`u1f3da.png000066400000000000000000000016151326020644600321610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dDIDATHo[E׾vcGI BlXaE%$$P@ DDU*$$vaA@TA*yTmb;~ǰhRqP99w9ΝĴ_\nںZҩWu҅zjGd&o_yX:y켦&]L6آgk[pvh_DMVKX owi|{n0kw~hL|6_u#_.b+Z]L\{6p R.]"tg@.[h_ .JA*pR;#9oSՒ(#dPBlj2`66`ǐ; ~MeAT$CibeHzA ̄v8yP9)fiCYTL T 8z3\͙H&c]K0&L`1 vG.)h9GQCKLa=än8D*93b>8B`M&YE~b:N1+Z]αtbZR=H˙G'C\ZW~tA˕l;^w EHO߱yzյ!?%ko[IENDB`u1f3db.png000066400000000000000000000014151326020644600321600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKQ9GGqKfthm* h٢]EԢU"t3NӔd㜷%+ӻ:9}ߏsɟFFV;5\MH$֪0!UB,%?#'p<#"6%5mYHyUZn?x]C罗T>x!|βֆ0Fģ0'wbCw=9l /sds_mZG8*QU2/KToL$r~ɳhs5V/^uXf_T c?T r Qi^>y5| ryKs{kKkljiƱw Άp}Xr5?7k;HE9],-|;6{ n#o &af&zFI0&pWPN9bX?j79+Y+52Qfl~1+Jm=m4[1xi;$I=zgL).] ])}q$u /J=|<Vz\_ٹ3Cii(J' S4 V<9B2uM>Fs0ԯ^ev\$wGXJʾxץۈmI-:t ڝ1" {l\-mOU!J!-"B&rQ <^_͎uaLm@oZww  -5<`fw:4"5R5ۖz1L{7(V57Ȳ2iESOeQCڣ<|7{bIENDB`u1f3dd.png000066400000000000000000000016761326020644600321730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|duIDATHmLu?wtAHJF1" ʶl-\֋4W@ks"jjtYSזK- 7!pC^ٽ;s~΁< ^o~30M$Ǡ{;rړW4Sp >U 뙍eobbOerJQ$HhD j#U)= ͕'pԉwfK?d0 @AB]" 8w!pM3BvU@?뀥7=>W*DhCC &^~`]~x)[pLeZߊ@k"r@´})QKHݡK(%׿4d|G?QeC"R[;̽j]ݡd'[>X&^ljmH5]|Z;+_G_p#* "aF{B[Qh7Q" K(#; .eCz$>@YL@kҕnEOt6_)#' CA&l{&ؖ7ITd¦YNsq @Ż7+m2Pqw/jܵ+HԊx:T}_ΥR;P9Uu z)5E.o୽Ͷ= '."{ȍ:glM9譛uJqAo uB}8~x!^q8U$9r$1lt= y{uD !Qa=MM` b+-E %/oϻH _mw묖ڒ1ZDciI"# X)|f+ &N|18i$yKBkwA6i\zJ3QNHhkר̌6czu\ԯ34Tnz'rUP0r< }ZJ.:[ ,[D|ɩl~n@>W:3U\HPv{|ҩ #3qţ Wb>a\rBjg'x:p|dR"a1PF;:q[WE8 oDWowo8֧@|.gSC3,Ч .I6UZ`?H?&ωeB04(^_ sP;Zxb6/ژx? ]qzPzlrBAKyGV+JQw䝅[gb;[$IENDB`u1f3df.png000066400000000000000000000030241326020644600321620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHYg﷞o=ۜYN$dI[PKE\4( BZ) [Ѥ.YPg1eLg=||׋YTދ{$T)qo$46hf=&P@mY[ʛ-muR@6n`~+5bd$Фu!D@l}`d:tAr9]3KD1W{[RSG{8|\)8j0M:uѹ~yYdxk諠>ֻ i?Cqɿuezԉϐt* G0R3BپV3>DtFLS'H*PVJ0ruz*HQ=CrO? qc[/unR( (*Dp(򭧦zwab?QhqXsKUڍuٿs>aumM`7igJh&9"i̇^8 aO΄5li$`u+cMخGSoGeڍQ@J iDGYJ0h)1d Ux+tR ڙ@%$*p Os fN91yoa[щU| ;Y^ER~4)*mzkzYK4(x;*o~)H,rT$c4"BdIc_VէB/r)3qH(B@JLǣ\c,I) [I\?x#S?ڗ-/LMo7ҧjaРOwȲ`0YJW~U闎 _w_;xUΓxmB*NZ5뷓Vf&T_>o鉶/EtIENDB`u1f3e0.png000066400000000000000000000014721326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlUg<:3-AZ[/5&BIaKBt#ntD\vbWjLdCA# Dm6{氠mey+3'K㙓Nes[څF @Q.gF׶=o g{[3ptD6t] W˛'՜{]=6_@h! j$ Б/;K6 T}d]Kf+xCڊ$/ / dPݞh‰}Ϫ([^/`vEkNUȔ=_r"ђc4o@d@h"Xfi}NBVw8oxAґ -|^/G6cvEX=cgTDz}$sG?pcuP%TDz}&@LX=*<3d7\bibb1A?? m\Dz9x U{H??`I(XABjK,EݏQ(HCsd(Ǯm(\AϞC +vtA\aȝA`}t4"-V!"Xвם ӋiY޹0K=U* ݙWp\oMy}$6\=FM Ht.=KA/-;xEJ/s) `#_qj"wov齊Y9(TrO{ճt!dS.蓺v[ϋ%dl{_ֲY() P5 m[$XeCᬹTOOnxUd&H2sYc e zD3dajto7&B56q5!Jb ))`8Z0q)fD(Sԙ+yn|gLi}> KK *F_Txx"ӴDyIՁ 2n%' H `twK -*j$ }Q)K]]YRއ(nS/%:ϿUj!~Pr+t&o7|n$u'Tuڠ~d҂I Ǔ 0M? XwʔO?gkel\B g%bѸlP.dBZ Bj&@~g_+4ec6/IENDB`u1f3e2.png000066400000000000000000000011361326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMkSA3/PiJP$PUWEDݹr-VE B ~tQAPXm{5{{ s{ΙBL7O d +O, In%\uy1#%9 !kk`dX͸l#JVãE|K-w8[w4כN8DAg@`Wh,7`ybp>B3ja @Wh岗䢗ޔZrFpт8PJ?C:[xd w_nj+kX`ne栓ȷ3hujcGSJ kӹXD0;_ wCwBNT5&o=o8Jx >G;È 2K&.Pwۥ;jdP_RݎU}edFǑ( yT<4e%U?v+ln?T e4 Jl[!0Ui2󃂷chPh oJv*N-0'7V"rjVJWer [4Z\c0 󪥧!c/L$V{4В*x|J+s2ynÀ>>=٤_r|>wdK8cV.Vpa>iNEEjx}5YkD3U-b& Eqר c*!o)\+Gd4!20MD84 j= Vi0jfpJt/GkH kڻP%U*I8=IENDB`u1f3e4.png000066400000000000000000000016641326020644600321110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dkIDATHՒOesؙYv-qib4TVJ1`[5Q&R<\TƠ `L4KU9 m H<;ϋm ]Õ|&<ejK5YW0Tѕrryz2}~Q-NwՁ.=x+3NBv9X!hj+ oyCKyŗXF<!3nFKSQ9s󑱲W>Ѵc|( {tɏqek@2~6|q[G><ZU%POf:S X/`z f-sA[Kwt4 0xqN(*O $M8ĻCq2t_$=Tp #bV%uZbϧk^;]X"HhYQlQ<[G&*Xk\ԑhS2N|1 `ڪ"@o"Wk@Ivyh{LXp͋(6EZS)ݿ4[~& mIbuhhYߧ x bk$MWk:֔CuPw;xwU_Ck/)0Q>/)("_8x` dm]Ar)#)-|s`!@B~<7)0ԉY 5_ЫIՌ7@C #+lΑ n}Jɞbt5N}6&xby3\uep)9 DqJ;G6ݙ:/"*9OpoEBJtg?s˘khOy͉iNN}އz5WτsmKXnQR6~vةB9P$,IENDB`u1f3e5.png000066400000000000000000000012701326020644600321030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|doIDATHMOaw:Tb0Ӣ11~%jCma#Q0"q,P $Y-hl;x]4L gw=snFlP8eӕc͋Fc|pɣdvmBH!W0D44j20htˌ'!ad>Ahs29Hh'o39M!ߞˆlw"٬ͼejL:Y8bh֫xG7HV!vf!Sy*}(߮^Cq.E u?p[kL2'Ν-ljtΠt3\zd ?~}+Z(Hw_׬1(*Y2:i=õ#%e:WK6wHNd/KEEI4]CUUJPEE PX*[ l"CqO5SX%ӱD;3z [$3V2n\y<a%j*bTP@#jPh1WT^C/녚Zp7-O zo%tm˹M<_*di|dIE(IENDB`u1f3e6.png000066400000000000000000000015751326020644600321140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d4IDATHŕoUwǏljıR((M)4-  Jt yHE 6}rZӠRC4s/)65vst>N/~_ a0R7-٧^` -2%D!D۔v?DJ>CNYy9}N.Onp<> SӼ17q<4}l¡n Fw¶Y^]cI`(x]sY, #=j=|! /7mkd`rͅ6DYi`1JέyTф}~+no)HS6<(otZiݱs)>/Oڴ&fHƓR-o l{~ܸ""+=$雄%[& D <ﴹ^{&Ӓs#sk^o [jG;j~x, \/k;ri%IENDB`u1f3e7.png000066400000000000000000000017121326020644600321060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[hU3;41׭D6iX4%x>^ >,C4* AhTjib-If36Nw"q.ays'lA*kA8W(ـ &e|hi?h(B,*KSL&x0y/T萁@VNu\$Y "@ }~GAڦUUyI;{Zx0 tU1i)AD*9rh o.9l?[9(Ra+Y9?ZU_U/rsrIENDB`u1f3e8.png000066400000000000000000000015711326020644600321120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d0IDATHŕKlU;6cgGy@cBPB@(*U"!lٱ`ZX!6)E\8Mv?"xHgu34왓O7_j8ׅs/Og|Qo@vh`+}۾_yN6Գ)KP+Usf.zO68v:DW_zFE?84&;ȑh7j yG= 2{{:?ͶX:BQ@|y ֊Ii.>]ղސABz86r pieOR}nE]9 îjK )[q~!Д$B!KpE<\CQFEK' {f#1ҢU=~$J|o1 ]ao>39(yV1vg+ߧ 3z2`f&23ݨ pUؾ}΁M dOӿrWwϨ-̥kÒIPtx5a:eݘY7JSs͵ )V4?UCWdR$=fd+!@<;jz$'mm(d}N؈Ez\vIENDB`u1f3ea.png000066400000000000000000000017011326020644600321560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dxIDATH[h\Uu.IL4ms)ZQ*6Di`%TbUkCT+$6^hjcq4If2D';kVwBSr3BG͢f=}ш:rl%$'F<K!S꼟~8VsX Hm;^((FM]/r-|˳퇯4"nb-b½`WYR"'5/gnr%]UYo S }=ڰvgW -TLo!*"w ǵ奘7"|u.: 4hMdnҿ TՀ;|)@+7>Nw=A3E ,m@}e3SHN.hMxūDމNdR;`UTct{ӈW .N2<ы?N2'oFve fQޥAR_f(j2ޕ8s̟B 2þW4m;}zv7C)^{x!L~a=X[~֩ͱU^`i) +ݳDc+lԝD{si|?4Tz}/ji/z|`޴Oy\Y -;Ғ?@K"35񾱺߻VX% JMqp\]+yƎBہ_ˆM k \U6N.ĮX|c J*ob_rd!ǿYY%ә'dgǪһ$q}gCyq# f;CIENDB`u1f3eb.png000066400000000000000000000014371326020644600321650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOhw?ofw&fl4Dc EQ =C U"^ (Th{IA" Z) B/ARV(MtfvzP,$}}0#ٮRhv(߳.5 JJAk?QNTw6-'vA+3^aGORcOyiXbJ9-p\,e[?&ehkÁ0PD^ >8ɗg@```Ax}#镫Q4F``Y0[_`@ hAuO3ecQ>^ejwsћ+mG.$\ޜQt:Dx5]n&|s+2{?8ifp| &1<%WE; k%Zu{Y 1b\1x-AQaAx/$Wn" Sjvo 47x`ؒJ@^̮,5&|X%ɉM&u~nh/q?ѝVg|,L2y&|;H rLebEn!*& V]&eu.?W]lIޟAgvT"_>2/~ƈJj!*Ԟ|_pN>K(IENDB`u1f3ec.png000066400000000000000000000016121326020644600321610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dAIDATH_lU?k( $AcRIBH$H_xPBb@"&㉌hŸfH$  4SY:50֕oҌI}ܛƫꞏU(3bcʮ)yS9#gdHyqO.6ٱG_uG9W,T٦@ ZtXA6<urVG7gXEI՜[]^bݠ4j<嘾@34jY@YKFi1u۹ÿ_oOب&w],!xQN$I1ׄ>nO'(|ΩK٨ r$p\ñ 8u6%{t;g~f/` E^ IMB @~R$AP $RFzj HlcAdJw:OU\%jUkh7$AWN:91}<\VNWՙA"Et>O*d6E2L$T0ŔJ?~zl J3VMm.r i P.)Hs\Rǰ'{ gB#;G lJƽaJmJ&q]krde;@>y|G?>'W(ZNcXA3/\d[pr fiukh; Ң9y} ]D}tu*]J%(IENDB`u1f3ed.png000066400000000000000000000014141326020644600321620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHUKHTQ{4w5`"-fJ,i!> jcѢlU.REJ )w«1"FEY`\;/|99;/jvTCy@~ RY}dFskE1qTU^)>O5 |?!$WZTMzfGIg[@ 3M#R@;GmJ3'e^c_6v3|t- VuA@Em0Fap d exR_!mV$Gξ;!!fnw,LY_vTc;/ښ!qbIqtA]s:j""i`$Dh*`SFlɲ)G+)uZwmqYREN\M$tڞ>qTFhw>ɾ4V7y?&S"._&թj.p͂`6`pP 3zOEQXWV;^Ijf藌xl eH(&p~淒1[n,!b28c^ t>@)C4s̻ߜ9*Y Bzd VA4Ef2>ח_"s!|HJʶ+*'޼PF dQmQ-IENDB`u1f3ee.png000066400000000000000000000016521326020644600321670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|daIDATHMh\U{s'3&$Li&@ $hF\ VRA\JA7u!bTɀm"4%ڙgf\hk&;~}Ir(áW;T")E1Ƙ&;(:۷+^O'>61'''a0pqC PdA|U}%X~u0yyEp_@o)p.}>w:fd;Gϱ'Rؾíz{m/OCDx`J">W&\֌~ˣ(Ɖۂ֗04d  JJ:l񉣤FoϽCVZZ:E$,EZ%Vpo pw(Ѳ7Hx{*`k+\ 3Jj#inҢjs<<Շ%郕Os_}> r!^lBVk61_`>C[9Ի@]0j'{~ k0XNv=w5lbs̆}o=q{9F=^" |]F?\/)SƖ3Jx_V';)d(wͷM'v"  NƠޡWVI-ϷR"AKĻH5o¯Kg`h+2aq]WΏOHЈw566F" `6DK.K"Rsb q0yO ټw -W 'WV=qNZĘ|J!{Ale,X nsܚuF__bMXd rFڹ -ڤ%[7w\~V>Ƈ.S رp8'vxZʭY6۸[t,"w%ZOĚOzQ#R3"wQܵUpMw N=" FPQJ곝-ߪЁpTHk00pԽڏ yدwEbl`0DQ1r90Zd3_C**i=]X|t&mDD$J$IviooiI&2::*TJDDvNhMEPG+F*ٳR֬]Gqٳqv74u\l7\8[ ~?  ]-M,@|!G_X@ǽ4oݮ`j=`YE8mFA}bT㟭ڬ/gb7IENDB`u1f3f0.png000066400000000000000000000015141326020644600321000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKHTa盱3)Fً-t&Q`ME- z@A 3 T6j3>JF{Zu4C}Ϲ\B>G|aq7Sшt2rLzgwԨ[J[Rј0q _HURqf ؗRm\6KR;K$3͸wK}gzBDv4^2&JOd !0')R>筿9Z%4|Ñg>DS;EuN1^93d%"dqfֻZh8Z h8Z0q`Ejn@Dxpj8RU@"L_@ b0$kU{&"_O5 eIENDB`u1f3f3.png000066400000000000000000000013451326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH?hUw?'jPT^PDbNAP qpp*] :2Y\" /MP߻~P/_9sq~KssV_&.ATՉHؚ7/o{ee3;ӛLNOO͡viix:t>QYt:+Ƙ<8 ܿ-7Ϝc `> DQxoƃD~ʭCGcO HqQ_*kKDЈ?oJ)'s৩r([5o{kC^oz7'F$U^/(5 >19w0"0AU0abyY4"4Fz)c 9sK!zzLJYֻH)C9*)%ʲ$X:.65@`bۋ[SYU݈HZ{a|||;[?81kfBs+ι~6זOLL<ک W Y6Ǽ?4k"u`('O`>L= r{lB1=(D 04kN0w]YIENDB`u1f3f4.png000066400000000000000000000013041326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d{IDATH=hQ3K"AAB%V" AXݵVb+L‰ n RADŨs^^Yyqrҕ=cSSz Wn|ttt׏[sMo8jZ"XBP Ϛj]U.ss[pՓn 8Pv4ef034EUkR`gy+[M娊@D p޼68ev-)q|#$=z/W|!E_vwfv>̎Hy>9nW׭<6p#QN~=2w't*fݮ"_N-:-RLbv]m勼wS|^!`Ȼ;W#_B]ӎ8j:=>l -7H_#PRrgD"VGrz@8lXرCc}rPj'\r%RLD_ Fa5끭Xm[3smW`Y2/lDza@G>_]T+,퍴`AEP #$E1cZ H4Nh> ';j}YV>xM;ZAowX~5,kL8%j#gW}*m&?n[ BxӎNT}(嶀$ᇷ@ӌ u7xv7 䒱BQzTevԵSr)߁ Lf \:*ڼ匣!Ym7,#^@1D"6K!Ά'>2b`sS8[2Wt)W<^@4j5|bh\t]%sHEwWE*?~IFh@~E$vF*\)gMz'4ƫT鍶w&?M_xYё3T[mqa?dvj00p9މhY`^Q zF2AT^؊aaw`sɖ^ymcW-<Ԝ*wieΈn^s Z6<ْX Tr*ZQ$xxCw2=R?${m ei cyu·%IENDB`u1f3f7.png000066400000000000000000000010101326020644600320760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOHTQ5{MHzS.&Ý.$FML8LW[jlDhBAB-ZAB(ZԪ"3f*{@l[ w]\BcPi@W(` f;Rg<׹4D{PimʼnQz.7r `ylVǞvVxnLu"rG< R P+M| P6 띿";|UeXU5s4 $llέ`횞˱Cf RJ\on?t $R"r'?v{:uH)K)j5D7S1k]n@1s8"+"'ڦ>2_q9_%'`!D q '_Yrumd]VIENDB`u1f3f8.png000066400000000000000000000021571326020644600321140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d&IDATH[LGϙ˷7+J[A.kH1җ&4iLXӗ֒Iմ6^mӫ16[%,RTؠ$fNH@Y?9sfS6=M6@FS±8.Ըɥ1 %~5kߜ^`omͼtQc_UAH`~YB k&˛^9ܣ}D|!@ueg.W%F,]%%'{Ko" W\`rPHLp.e?O{:-Kb_> ƙЄj` 9CIB BLBM\arˊb&QC`p3C &#VѴQH]f&$*#c%׻DM; ?=1A\$˽QCJcȵB]ۼiڼF}..RhНFz$͵ߑ.ǔ[4Ӭ?2͵e^3iTłwC 'O|Ns3chl,/mNՋVDɑ?zb|*fހܮ='S%ʕ+oܞ!eګc$%8N'*--ҲΡr "3~gx FML`@D0:U}\"Ng@e+mLݵRcfdH]?A P~OhX,']z@[SGΡJO~} y:%IJr\;_;AX.[rtXk0zU? :yr {f $ QٍOY3!@uݑ}X< l>wfm+0UݸY߈~fApLD74_B0Nvz#lD2O$ܗaLaroU]&^] LU`l^ͺ ?} p_ᢜ:vMiYuVMt5}9؄}hp`k  ?p4~ w|•YiaLeƕ{o <˕ȭƉ8#fGʲlI{SҪdIn/%ILϚjoJ83b%IPDA` *5̻ه5P%_>`|]s*NfDĨ#ws٧+X`n*Y#;4$f+g׬C'IENDB`u1f3fa.png000066400000000000000000000014471326020644600321660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKhYS՝՘EǨ vQЅ *8(n\.\H.|Q!+ED]Ȁ Čө(1tKLM=e{}R,EQƔMT.h[~BIQ DP,D/5i= _r)JRcuT#834*7LxǍ 䠪4` pusrzX.j.bsxEr(b+/O@? A0{:+R٢IENDB`u1f400.png000066400000000000000000000021671326020644600320200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d.IDATH[lTUu:N-8- 'Њ`ѤAC-#H E O%HDSJ%T/ EQBKNseJ[:SZ^dv-Ɋ^>m 7oxR+xncCG?Wsnwly=,xu۶dw Ct&2آ]"5{YiXPxgI϶ُP(7ҹ9ideu0΍:["f?0y9U~uUA T9q78{Ʀ A&=9a<(.'6al}s8m;Uu+hu܊t1xAZ/_"bHNnOl߯'ycZ8vVE?yn'aFhljƴkcOO\ךOo)x i|fK^4+9xxZ,ٻxȔ)3e?TD%" 2kmY  U9z'pw e hO<ҙ-TG]n\LƤg_ Ft!C1p?Av VVe5Qr;j5`ڹ7i|q@HKBEuJ\O=HrZ[6o+ٵ7rTC+џIIZ"0oWZ}1Kgpmvag 2oicu J,`SucF@n?[yo7Csz D͵esth ]nKO-0#ɕ(+޻⋯"g4UUi.ûBV^;L9m$4GAU,k@:QOu"tz4u 9TaYcTMf_X<"%"?i& h̽5[4/m:UE$|+ӅwnXʍKY UCߺF͉97"\xq5][MATy "]]I=9EiE8s xnXlH\PvRUw;{UHUS #"߸e&ܠw]|w" 9zDtgл"[UOvT%T_V;rY㇟NUD1ڦ`lBmFA'@~H_]؁mSãnPT}f }tD5AIENDB`u1f402.png000066400000000000000000000017371326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]h\U}L21ɤ6!T1 B*4-kAb?E|Z{.гoEȂ'ul|6z(ӠEыSk@@-n# j*q`7~ ~?,u7)U@u^>d5/Xl&USbRait<'""@3[E?ʵp^)*UYp ٦}UZ-Ǯ@QBA(Ϳwhkڵekז=k~ppIwE#bT& U MmCYcCk85>x&7_spAHqa]EmSʼn3Dk^ʧ0݀1**A1=A[>h 2q3UQpqkf6<A h[k[dJ*{3"(Yg&ˠj9ˆnljϳn:ӹ1 ɤ%AW躦zuG3铑 ;z2= AoXoXwؤIENDB`u1f403.png000066400000000000000000000017771326020644600320310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕmLUu?sr" ă hB6ffm\s [hf/,V9jFm4AL0gig!y{Ջ~??T*lKٷk4uP;P@))]V! Wckݻ-kЈKR'947!*MOoo0꣟zvhEρυXvvq4ƁgU/7?^,**4]"dor6Zžy{YS;;WaGhI)pMEШHJ`3?LuO|ҹDnt@ܚͬn:gf :d*@Ɇ: @2PΝJ 7:3ف wצ٦>Ū4%1=Dsg>GmrO/dS+Bs^ӱK#|XDɳ-xȬclJ28rm6G/DŽ=&P;V#T+';7(cLC U!|R >T.CI|[vU"]9ΒM3[MĔwWK52r o e Pmh޸9o.@q{Ϳеinٲh.o`g&~"Rs _omfY`IENDB`u1f404.png000066400000000000000000000022571326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dfIDATHݔ]LWB!V8Ǜ&#S2in¹-a~ t$j.p]l^h Y%:sE$qQZm)t m.l fws]"!/يRl/:z{OYƐl!yޚ)6@4c/o>.sESN(HܻwM$F~ite x?N{‘#G%d'o!8}ðÇ7PȔhS )LNNWd^D{{{'܊JJJشi{<3u5L&eeeDQ惕Y,.188 'X`4"eRR__?q8Ϥ֊%@ ᓱ8Ñ(B@CC#H$8pGebbî]*:dMe^UcZ{'1:TU$Җm)ee B1 D""RJ0al;<;VFe cgD0zo s Eydeee;޽{?\QQTTT paż?JxZ? }V[P5p8̞={{wޭ9ɭ5M{wB|̙ Hؐ*.m[p.tK a>߳VЅ-ŝƍ+6vsƥM OG6t~<tݪ .;UOi݁Zy兣t[LwLB&/?@~zǝzP}ڑ{0v$+T3HzW> 腘sYQ:͸{CκfF~vU5纝)I5c-\xOpL">ұJ=Y,nw{:]Sw>}Wl JC]3)5L,|sOEhC~GiPkANE_:G? $/>AojV>GÝIދۊ<Iaʄ F/];q:lL!\ٶ7osh8>m 0k%K={lC0`2{ج/M-:w>AebOw{x\fg8:1 ,*J,'nRwS;x5Gbx2pɤ'&X|7 4W2lTUD wjl;YhL`ZB\nlQ ~wʠCojq:}as]_{ޓꨱ^ğ|6 [kF:z^|)KlAWyH8qfNTqO&{lhӠlrDQZ%쀷ċ(A0d+y#loPetmi5`+Od;{. ]kQc $@Lk 3(Ơ ñZU EeT Jf)t1 9a]-HXE+wjJ_?hRie_'쀯xn@Ɯzs.;#`Ԏ/DoUX b^8;%\{BP =9YAp*v>혂Uɋ GR?=OVM -2IENDB`u1f407.png000066400000000000000000000020121326020644600320140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKh\U̽3Ky7bZDACEN)Ơم7.Y]"JH̝tL41$sm'IusGQX%"{s +cGZ[X˗* %9Xzsf\9*aRJt}z)RMJZs|~L&o\+HFn $4P<ԅ.fP^cK:<%C]eob@7T!1qy%>^[$"ZyTPO^+oJC;sPBk}$) ))yD+}""6# 8ί$ex (ӺXn]+߁iw;Y"y.-cujlE5t=+vT؍h5 PhVGzNn=k@[[(;#hH=rbD (SCT cnG^ų; x^ ;rOarIħHӑ;322c"`Üǣݺ1x<cuݨ_*>vga={, ҥK$Zr*AEdbzz{[?E5033C:ƶmFGG@evipbEf> mVJKtDS2Q[f&Uq{pp\W _·Ajۊa[mӒJҒJPA@¾ \_*~}DOE|[kcnni5ݭڛZtjP%/(b"crHŜ=7Ke▦q% | ?I9)Vpٯ[ΈȌR*8Nfo뺥?IENDB`u1f408.png000066400000000000000000000016151326020644600320250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dDIDATHMh\Uy2h)Z dUS7j]%čڈu%t!ADtRDB(*R 4~`dLrq1yL2̜{{sy UL?y)%Ί[pb5z,VM [anQO؄"+MGUe=O['*RN3jv*P&Mp},9n8b\OZpS(ėؙUzEE]i#6`t!^`׋אfP'W, %_{r@D&Ys"f\RFXPN/ #L~3M.ήӧ7ĸBKڢʪ1}#á^U֔| Sĵ+Z ەsiy1uZ>x!ǿ!)_1VT6QhKCBK\]*1iuSEٷy9n ;8M~9i~ '|[6k݀¡UL-}#^v1:4^flC$ޚS^׮*O6h47}| [}Aʜ5{~938*}!7mYl"]Z1wXۣϞ9XdGG@ ЏLu% Xk0ڙB, =$^zI9 mgl.ܜ|T[}TmJj= + 1%jA AБhCQ:sIENDB`u1f409.png000066400000000000000000000020201326020644600320150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݔ]hUvw6ݺ.1(m+#6b#%苂)E,iyh0Vi4B}>("JѦI5~д}Ҫ4!Mf?gC$&hy3992"oyܿ83({lk5m}evMtPsZ"b1A'' ~Cqe DRvП |d| C9Q= ) 2d6eͩeJ"95@?.\0*lƌo%{I 6'p=0=ɳfA?3g7KL (g'p;,$%o|޹zpK5Wy[,K^gjpzxmIWחUuTf|q{{p3+-DCCyzvcF'N:xBIENDB`u1f40a.png000066400000000000000000000015041326020644600320730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOh\U_Ė2JZB(;FHHAtAJXD:MЊ)"I@PW.\i]DP$UDPZBiI&y"Mi'RGp!~s9~ ?/ii(uv\R(O XhZO^rdثe`%@NШ=.U? rx" oc ߧ9rKX׫Tjroߔv ?r9ٴHHg + Jg? G[Կ( %G)p,,XZrS=u Xi f;[ sF(&(z4X9wF+=7\qg԰ A!E4UMb-D!\ C Z&x y̞\8욋/vFU(@<ƞ۽BQErJqՁ( hk;k̟Y^F3n!Z>qqod0w3TDۅ=Ϡ n,>^вpvK aMPBA}e1Ri1kj èE-(ZՀ #P(r&ei!<̤|%P7s7vVN_YFIxb&4DJRPqm^ŵ=LL- 9x=]R8-}ɛ̝<.1K1d b?4PJ'.?cz)5PksE3 N ٣oK\$}McUD&@<[ B Wh(ځ*RLxI.Ë@ (ajP(rD㨱/eyHtţA ^-XK_\IENDB`u1f40c.png000066400000000000000000000023461326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTU̜vuzC@iAE"" >!Āʃ& C}R_/ƀQ@ %)-7Z.Pi~ôS~;{_k%k@F3;w̮]Z!p񕉸Nj5pSEN}"ϒ EܿR5d-D@,u'&'Њ1[1rGqW[Z".wIYL.JS@iq65ԘP%K2)?jjYGerzZ{S|dEqCgkOU*tNr Ut >K߿t8s@|[*iTB?p nnZci/#Hn>7eZi#xξQ[}e ѭI4JnՈ6;1Wd #Tdyw8EWՏT4w&; %$E/E8*9`k\:!"̈&Lq}~MO3<6e@cTynEY8)`RQ_mCmA(;#k{Q"5Շ) 89A[PEPRLƔb& @p~>9n^*r `2*p#d'E~e(ip3[&=$ydW37rdjQq\wc[Qk8PwFEx2f>[2`[GQە!aZ4ۑbDem2^J AK*N 0=z}{]g[EI< ¶eltF@,4$m\=)>߄_r&[r|n==ya5Y- 7=-AHe>tƮ*`Kޡ]I, TT"M*P27cn G Qʡ1i^3g;6eOxk];*ep{|ͭ02sjL$ }^. <;Ƀ[N6ViZ#D9(clfL[3ILׄ1,DIg# P 1+L{G Xc;X]`5Cbb!0fO!rs1]B6ܴ#kʰ諰5!CNb8C(9h%t)ŷ9@LCD.?Q˷h",g&劒KP|JvrY7- EW7Zԉ陘wn$#HP[V0ip?EIWP"WUSN|kL@: ;GCR"*w%;Pzzm_H.`q'OTA_aYNJ\!c^yvIZ^F;(P [! Cl8Iv›gHߔM ô7nO@V .75: /VФ^~:U*W֠]'v_x+ƓLN23Vya-;LpuwbxO9_RqXtDq8ʝR']vobxMmiDFqΥԛ۾J ZXSZD@zcyC'6\K._:(x|ObiFDT9y}Doj221ՕL$^i-x.yjQ+7#K/b$F޵u@x}+3e疠6Ӏ-sߴ2wB!OqÐw{O|Qe ~xa*l'}c!_+:N~MYa8BMJaN]H:58RR9d-UhM"?ꇝsGalHU|sq*+pikXUnTQj}' iY֑|8Xw]^AFcc `/Tȏ}}}#G_d+X 5M9gU)(*qIL@,ض} TT{(+×5/ kp K1F2k`ǩIIENDB`u1f40f.png000066400000000000000000000021321326020644600320760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕ[L\U}B(БK)0\:" hԚ` Fc(mb4>4IƐdkcjDjZ"565ȥ#  ȭ a8g2BeeV`ppaXR\!.I)!&4Mk mHo]5HooP(-.5 ՚ׁ=_-|'11q'b@8~hџ[ۖk/9=c+Qߟ38Y] >w?[\@T_ 4=i,۴j.ś^XYJzLSֻfF*EÖ$2dg1"q4xΥ}u8 })LFu,=0 c>ĸGflC&cϋf3 vԠHӴ!3&-ǎ<4Jy=? 035AT_Q- @r#1%ǏDhj{GȭY S0]Vgg/58244g9}ZxH)kǺP@D$s,y`∄dl2/M@hkV>B!hlNFԌRɸ{7]Zt Q -;ێe$ 5!5hoe׎mZUHm' v#GDe0Moooj *[cLAdn-!-6lF l?}!u 8aO/[vv"D5+++Êm*0ϝ;gY>L4iiiQt]?/]SNxf۫ EHSSǎ}B;%@URJvC1EQN6߯Y5??9 ^rrr<.& B Š4OJ ն2󒒒wx5ȇkl k2v*ZN^ߌz /6'6ڕgA%~5vD;+Udu΄M),Om$j)СOK o g$mD^#022mۻm2IBSU]Bccs̷_Sg֝b$p. ïDq;/mc:Sԝzk݊ȑzs)2F3cɭ!Pz 2 l,y{8Uu|{T7or,kOz1H ?a8v0 "kWA6B0 WV ^L?5]=]]AFrP*ۜL&gyjVɝIENDB`u1f411.png000066400000000000000000000021031326020644600320100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHQLSW綷m t,De%e^`n{3/..ffqbRPW7X xK+??|<RJF2UU`EEӾɇL0B|$"ZyBI)5`DӴnݞ޲A8H66NY, ñDR߀}0!\d2\[D"wgP-˅F+++3"]YYiBHX;?ʉl3 HتA/sssV CZ_`)mmmNrX3:ʁ]| 8\2%̹su/PTT㡻چC5"'tJ ^bJ)+C1TO*M$X`0Nxd2=x*͛?sIy$9 :;;IțB.cHJI<GJ9H$n?t: TVV^mmmzvcP&xoo䀘@ 8|9LNxh -DF#!#֭a@M *RKJ).ㇾ^h`&Ι̝s.|Q` f'm-ll"ˋg(~ `2*5FrZhWAb U̗K6T~&B(}Φ-BQ♟#/򹉋T<-W%o\ytx x3"FdyyVbYqQp*5ug=YQ5*l5m{?̡#_;*"/h3+D=‚&\33kwd}UuF";ˊ㏁N6h.Hv-OHX>`Bw8ژl ~ 'YMw%0F#;gwؽ7 @9@ "\:ct;БcѓFGg730ş~3 9p{T$2} FUTiM;vе=b0@|Ɍ6_ 1VDd^;uRSOH [E@i"^#pzvwty.Ǟޕ=>p2>pdvPsHMۙ@d~W ʄ7R]nښdT*a^U qw/ {`gGbk5L^R?!"H*Nڿm]>l]v0̑wu"5 cxT fzscV^Lr;v W2aO2۵AUXțSTu%0Dh>Dr U0ѷ F hʊe{ !5oMZp}j([~v\)S=D ,+{MјH,A"]^W]ׯ(l`fOi;hnڀyO@gg2] `nվe;Hg١NwwwZ R/m1qq;Pf,وfU0GAdFv O "wL歡!2I06It,+aS@fgg[9ͺ~Po΄>(zWI$ilɜל;tlT/P]=@'Lugp/ySYkGc dq Ѹ k3o ,3]IENDB`u1f414.png000066400000000000000000000015651326020644600320260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d,IDATHՕOhu?$٭ fw !ڠ^DB (HQ<)"ZP R"ODB(RYI6&<j٢}RWZrD֕ܛ~)4 Ĺ.| ǧ#KeW`GX;LNRJz6/ _~{o?YK(/^vtf-IY$O=R\.w8}$ :Mog#ؗq/Oةs^k{\c5W#"\8a6t'.*X+xk6m0;y4W eN*}|ξ0oyr+LLOʰRGEcQeec`s64 P>/,) {-~->Sn}QN ͹=MlYdSICBem't]J!TY"spTQ&f|o):˭6֔/2ޖD1׷ Lxb(U%R.)- h6gܘ8\":LI{1n:E:EݳP )2 qK=uԑc/|ݬL&d 5ʕ3z 7.QȦh?2!yߠݲ,+:u?!?9K@x`7]tu )D8OS'z^Kv-Tgat }2Fǿ۩h*yIENDB`u1f416.png000066400000000000000000000015671326020644600320320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d.IDATHMLEw濋˗PB-,Bh=(,MkLǛ]m5Aoa[{5?w~V;oz[&W̎_ 9V*w"튃 ?B?pT,׷F t!pxxI"L"lz̪YN$ cE xX~]ipn z, ߸9͝yOV9ET|JAw{b+>p]]{_[õv*斕;9Du|V_d-$ϷIENDB`u1f417.png000066400000000000000000000020021326020644600320140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[LU Rm5ڨԇDP!h#Ĵ&&>AԈo>Ty2iZ4U0-&RĶjkݴ嶗o.ƒ9Og3gΙ*" !qUlƻӀ{VJeHzkwy2 ,5&ǕU`;͉i'QJ EJ<7ZڏI˲1챭JѸX?9⧓B(!N+OJ za9-Ag2یe`x 06:R`: GI K J< `:%3ˍnhf%߸"AcMeV 2 nB#n33lmsx}2C;O|s[b3I( &% iq[XVLS+w \.&Ly+9K9),[s:\3櫛P4yR4Wy#kgI靱ӧ{ ͡3v2%P`0 йr辽;FoxoOoUu-+wDu~!(I9B8kZiskoGDoqKvz ٭RjPF.cXҍDI2 Klmo/|{ĩՂòQ)혦9[CMu>OsO xy#2d$c,MY  _յz kkuPIENDB`u1f418.png000066400000000000000000000016421326020644600320260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dYIDATHKlU~H!Lh Ba`vy}{\Lg:Ӈ63W{=i~~%Gg(Ӈ#Qcz(nr#7N-g`?YgIAٚ'b+F#ў&4[`\ۏsAqXVFْK!Hm&GX]BxԢ%%^ux 8X 9j|bRK] i7^JLɓK=LUL!7H5IM!^:g3⳷#n$B[=|1"QJz)!A kWN\{݀ݱ؉ڙmc'EPeݽ[} >×/+7=Lu(F_r@fIENDB`u1f419.png000066400000000000000000000023711326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTUϙvZJg:0@AA( xo (bL06(*Z 1#@"%4\DPJ3s !^l!=y+g{-+E.&+3Ѳ VV0=;:?afVVQ d LV+֩hiѧ`P؏ 5Л ^`db?@cyq2zt`M4|n7@ly{ e&nNC~$wXɴd#<:do@u= ǥquEEvɞiypi|w{بF嘷w ō4,45q7'S+,'QU{TbJiFѝ+T>z .mBw5inÕ&IU5G$V>cKrN]vucSt2ck򶟸3oہ܄z|[o$νe?0hn }h{~` +-Z@.n Iޛ\UӇb3^݃XԹ}ϟ+YIqW O˥9+p@~fO:szcXfTсW\Gҁ%)JRЂ&mY7C5\Gm7݈3FСʢPթZJf$$~t],'3>usRKwY;2g% R ɥ鏀DF6TlSo 0-gJ]׌sZGrNDWM7Vn$ym1Ѵ2IENDB`u1f41a.png000066400000000000000000000016621326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|diIDATHMlEߙzmg@,?Zp( IDTz*!*U z)"J! ? IC4!fMRN37~3!F7xѾzg;CƵh7IL4r 㱸%2qgm9<}xoBRm -nshŵEUB=׃c(Jܖ{!f^ʨ`|_ c` {~M+'8sF.8\tC}#yîU>xG!ɔ Ć.}c>7^8xE/B4UXv ^@x>yBDAk"x"jgMؾʸnR"u-zql?6>U7 cٷ@߈`A09w'd -;[{j<Q<% !VJX`pj6ˁm;k"8->185w? =wirAKKELN\mBT &32#JwU<J)@O:mBLr=*bE ??Gٖzg]2RB8 T<~m)0RO_!a[0\}RFM:`R^Q4yZOčcfʅPmHwf\Γ&ǓDLMYO8zp{Ԫw9(x ,UA~mB@&3B,K{:lW:nIENDB`u1f41b.png000066400000000000000000000022121326020644600320720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dAIDATHYlTU9^fZ1PZ Q K%" q`b&0S@>hXBgJBQ Ptj[ ZKh- e:;s|)],~9[Z, ^D/-?u`-J|+P|"8 FiCI))&Ֆ!7ВVzRVg௵y=]}XJ|j~Cpª w>{AP5ۚ:IpA[N]# Lk\^c?7aг,7l<?)^ bæA-Zpm^H!HWda N"ʣT`Ht`aGpe\ L"4l^elT[1;ҔϺ-&`ցDEU}`+T^/y{45qOʸ"v@kĶ_:fQ=EDF~~Lq?rbn}frJc\<#zIDlRWLMYc Hrq"^BPyX2:k8-"z=ջy u+x` @k,_{:@.Nt́E##bY2qup,Z+w5?[_asWz4ʓ6Mn{;RIENDB`u1f41c.png000066400000000000000000000015261326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATH[hTWO2NB&ibS ƂRZB[J b ʌ6fN>ռ>$o6-^*TImjpF ɤՇc*s5?ֿ},{C 0P*N{hau 9(/He֏3˜m"}=齗wg2L1O$l_s,~#SF0=خ#z[] \rV\t0P@h~OyCMf,ffy o^ah euCQO~e+sk}SIdzu_%\TۙojӡZV=5;<XR7xHJi\LlfNv6*kŖ+h`q{!/:.x| l3@V)+qH޼Z%_Hb݃bZe-%%g:>|; !֏Rv^6\(t0*Ʌn85LL;AW ,HEQSkjYWJQyʸ1b8uueWfR%ũ|[a|yy[.mt8+X鮥S'ǹ1# ߲~2!D?WJY֟l`|NRGJ9H$ޏǿU}4}GJIENDB`u1f41e.png000066400000000000000000000024271326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lU|nviq1vAIJ0rv@%AP1DbI AD,ݴ Dl@!D]h}{-[(493g?33&a) -i݄+MlD": &?>}Z @u!Z555{@"piuC$i B N0Ȋ@J1R,1 cΝ;L2e$<']471Y )>Bh4ʅ Wm`{%k+bSrrrMM;g>|֖x?a)W*= o !kEtܹ477s!R4`? < ӹ텪i٘ٲk/Zxj96|vqEqf N+LENb8PHJx彔6xfb) 4pͳhB(?L&3v7(p8KR=.V+fuuuWrtY]C]]lL)sl+($;xR",fbP(Tpe.wGv`KlΖQ%  C8zQT8.5JsݶoNO1[ċI)L2(k^I4;\:)H$VݖQOjͰSTVk.j.m4-T/ 5~Pf}gB!Fq5k6XH0ĩ@qN/zy `(v-ek_[#x^sЫ̇Xs> u0צؕ&44jOƳ @~zrg⎛p>[%8Z=tڲζլ!~IiL} 9gpz\u#%)%)  ڥyϏXџ@)hIsb៟رh\THR]oj; !D:}_ةKw[1z+1uЍIENDB`u1f41f.png000066400000000000000000000014261326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlQ|чN;-ZmbФc!%B,&#t!h뱑XX(AЗGx$$bAH,0 zԌj1]2%[/9ǽ91 6M_ڐ|Ԗ5VWՎ IEcX PV$M=a!K,/ ZZX"Xps&:kNcc >ߠ/ixH&h$:8][λ ,Df-0 Ȅuitwv: Le)Bmt?`Op񱳋*&(nT͖8TX4^7^=@l}xr" X x"ߕ>{mQ@ܢ0 ]r4k-km(mW[L?NFd|Fp!FX IENDB`u1f420.png000066400000000000000000000015071326020644600320170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOlTU?}(C$HkL i4Ѝ$7%$FWn 6RBNCBĘm 1m*Zμ=.^;hBս}9 ߆pF{$a\=3r(o+-OzGc]yͻܜ_Τ`g¾7UDu?c+`s uTMl)78 RweŢ)WةMMV!?gB8^sI\Qk__H,И*Rk;9<`6>Y052;]Qq*wtPXX #qz μc?E|7wDJRbȧUS ZmBMj+5Nz|@Nڔ^㉬3`c 5ՊX _i[d3hDVl~Tb2SH䱅!x+-l2oݜ 3('d%"ijwDZCexY/fO6{Edu6 /v+>%1=l8Ź4tr(2w^8 YqOT[//W꺾rN:>:dICPxdA;#h8pge0-(ڞ\j(o}4JsTp C֘\x`]WkɌ)Kv*3o]dN!T&IENDB`u1f421.png000066400000000000000000000015471326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]lem߾ݺ:1"*#1A㝄.&>va$1ޘ ^i sj"#,"[h׮]bThS5N?<p=궕 PlV^ \"|? 5G㴅L`J| Y;K <]QY-(9`)EN0j9*sGEٵ֮T Bs@uFx) 1ui[ɌD:&yg;B4:4K7X%kaq}.~Šgr}D7.uɹFЛQlP𠮴J!yP 2J(f>5']Lнɩs?W~I xIENDB`u1f422.png000066400000000000000000000020051326020644600320130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_LUǿ~WZ0@ TD Ve&> _4$k4MH'3E`Ĉln Xkb߷{Ϲs A:+u5|gcӎuVYuñJ1a%>=nto}hv\S]3Ftʔߌ$X5ay_CVqygٯb}%hB!44p؆-H7(%0;c֬+qB$f, \,>@Guŗu8? -]7 E>R d_.LN8V.@-ݻkFx ծg|60pFxHUS{k_i@YPU]_JJU8]ki)?4m_*Zԡ;+3> TVY{`hJ,N5)>ESe K&5tRCJ䠻Iw$ 4"EG"/* eVp)i0`Y {nEq4:-hD1P' ـy}a;V$㙷7$e1WUY]* ]`{,/xa7LX0MdBT. pNwթCj!Xw5<7MkrZfZH&PR94H(j9]2p]p8Y0)<Or89ELȵ~IO> 91@~w#"}|vogNfGFC'O1Jf Z!o-o4B_K;zZ.3!+?3fpW'?rǩ~IENDB`u1f423.png000066400000000000000000000023241326020644600320200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHTmlSU~ι-BW6ƀސs+w D\LDp$˔D1.ѠFIp!E@܆ 8I7`ƈY nYlz} O!NYc0־'`ݻ7_I!yr麮_|@8v,?wW('9yyyGʆ igTUN3:WvQ3t P.oX,ᣪjEeeݪ6&rDl˖-" xk`. 00V]yCoav`,!sγ`0~̀ ۦk2~4cFԱp>r.+֯$iWqSէ40LbkC瓢m 3Š`Z}$ T8nF&IG14vY֧0]o$ }:gK9Q a0y6g=cw$1o&2pҙe%KdC:.9!,?cdƺ1»k?M3mN9X뎌Xh:pclcd<9EFDV96%V.o l2#{0gbȀە RvQyy}+:~ m e]ܤcwSVC'|kω&gfr G6'+ߐ΅;iCULLN1# X?{0D%؁&v4??K%%%7ZZZ3ՠo0w&2e{oȋ`WU›vAt]8Gբ%yPO_ >!UοCFO,k0M/A CFo ԺriAk ;{ qfwrE_gҎJq7RdMׯ>T߸!Q}Vp m%仛/RP1@O\iiB<ݲliKmu3FnxvgkB峦bpRiѩïEn眔 ې;!kZJ' 8^#Y [VQ&3?6l=96`z2uFmbŻ_w✵bQ֋!e]1xA C]ju{g1=췩-9~ .?,' '\{eLl,dSO rFoczZ$-O4ϣFi`Ȩ> 4b%Fj)kh:D݅Uq.r4/m':tu_T bbK닋q1Ը>kp|J?DaS#,uO{^PՌL*δ4ej`TEӿj" >IENDB`u1f425.png000066400000000000000000000013441326020644600320230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKQ^(ނ -2?j+B" [UB 6mhaWMڔdQz˨LΜI+iy{wΜbɿ`9iSa'C/R\Nx&l/Сt TQKKl!D-v(1 +O7 QM'"b2/}h+­H .YjXu/'Ȁw>#c)ʹ5=o_2t蜏XL2:TI&tY[+>ϛ@]_$<4 ,zpJPڅt謏`2DꧮvU=ÐL ], J bs H0kVpm 0C`@{T1F`fްhؙmJDمb|Z60`K*QkyUR'@ уr4ϛyMeS9kbdW=7Lޏf'}dTAQ)ߐ>C*%0SS@8>r *7t[#vUT.4cl~WnoyΜIENDB`u1f426.png000066400000000000000000000014011326020644600320160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKHTaB,0s, " - 0&D-EhfA-EzPmZ#B#L'wIIXNX3:ciѪ?9?p_QN+KYek)VI+A|snAVy`/p6tH/Ĥ VW2F Z\֗`6@eD8M,1:9 EV5oawfo%}݄Cߍ$)*ßE2b-H-cvyLNiT x c|0ڳII5B~!9[k= cR;Hu `eEZUƂ_uXUڒ&'3Fd9dvyE!1ڂǑgN# 9cyDtxb]Mtxp_{_#>hrZsXۍ!|{P94K'kd3pD'yt "G-3bW6w9;E,e?}I.;]$hkؔi0\9U=Ibټs+{◥~;8"{dB" A TZQ=tU?a9NxȇHS9X{+GtpIENDB`u1f427.png000066400000000000000000000016631326020644600320310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|djIDATH]lSe9J۰k!.BPqI2 q /Ęe#QL :ďL701܆lm֮9y_Eh ˋu`9z4g-,6P![:@5IZpl3%n+I}i\}iR;S7>({]y&{{Higm<é\s>wxs_k˖vAo(W"H>a"2@}~%E^jvW`-R߸ q*~T.P3Uz6&<=  s,SQn\N#Ɂ2fdX,r9@9l,.*o/[} Q7_ *mdu{%P<(+ˍwn8A,wZ{7KABfknf}fF {3ں7\^%,%ݺ2uPϻ fqhlt/< ?&EQcM߹ GΖm,gQ,-bMױ5ۿjפ4.t豄0+ccC] B&\W:P3v4}nՔha#VIB|1Ezd`x(٬] IENDB`u1f428.png000066400000000000000000000017241326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlTe߽st:Nk_ay RiF٠Fn `\. CM$.ܰ, 1bFI R:tҧ3{bd̤=?swg'SPm?r/-+`eZC`N9jA:ZGvn~U|;t:'Tn}̮]IQ+Q(Y1CB[=~Q|-JKxDC*|pߚ\?h2 -|XEAeYt@BlkikZlOuKh!F8H=YZc,?`d2ɗxIp Hd )ʗc9z~Yp\ϑوْ LXD3XxN/9S7zLHiWTL?u.'O!ٮk)L=nֽQоg/S#̌FVA(\d""'uf|k~jy0i1"k,L$>9OD`.nm }`ػR «?BRf/(WTk6kpbqo%TE\KvB &{Vu*/}^x!bJ\߿`7u4w.ֽE~Zb`iSwwYYixVJ]*wIk] H`||8>|^o?w֊ Yʑy՘~zcnO=WIENDB`u1f429.png000066400000000000000000000020771326020644600320330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmhex6_:NYKm `r$A;SYꃒpPT}()#H4LUȶk,d7k<Շ̳y}z˜h){w55 H{U=Mc5BF날_I8X`W- ;wh Wd`6&09k*;LT|3 UEe|{WdM pZVߊ~`$M*TU?N7m)8 X6G'Pw6rilR%F<>xvr5[5-A9X\n+Z;9|0@5OlrZG/BD1K%0_`!ʶ\uٸq#TTTX;H$ zE?~H`ÒRgIOO1sp}s|\b?322YmѢ܆]F)l%Hg:!A{w܆]CWynjNI)sFX ,na}K*RSw0-IgzYoR?45k<@9s5&Z3}|yY܊Qe{ f[zk;%7a 9>_{r'hzy<k?1m펒gR}?8&fa6>$¿'󆚫3(97 ;5d+[߽DETIENDB`u1f42b.png000066400000000000000000000017351326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[h\Uu9L'צiIiEE($jMHEZ(H`E/EKAP$RXN#m- j%jO{0KeLeƈ>bb_55Fα+o[i Dۆ)+^ou*+zH\ܔ HƟU r8`,OXn '%_Lcb:nkxH`?M=@D`5 ^(b$zAl(tOe2aOO5zk 0Ʋe+uF{w%.|TD>)XvJ ܼH왣5X;C{4/v> m`l~^EOGg#c=%,oe_0դ&^qLqw6_^?k';jL<.v]b3UmkX+IkUuKN=bo [^4&pڭ "vXh/g4GO/I == CEJf2&pZQQwJv{th(3:pUUGyt`9"u@Tw %Fs!ӀuQ\P Tr @;%EZ ȞEb 1kB%w+#,Q6<^[q^Oc *TIENDB`u1f42c.png000066400000000000000000000014421326020644600321000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKHTQޙ:Sk"HASI.\Z)kze Em"Ȉ2-i9יsZԽw|uw}G/8Z)!HÄDB5nlqN_)Y /p:PہR ] a.Pu=6-럚NXD%L j{F-.Ld≄F EF#f@@GpVE@٘\6b˻W^+Z<2PZ,.]1æFe"䵵Jht3/g}t5(*-E"_.dWM[f67R>lo18Xee# -;v-#5>!|G^ʢBl0淶}Vs81G uvL,iR2SGZ?j=扥(edcBЋKT〳{`qAN[cf7TX59mWRz?u=v 7gQ1,9(O{E2U>J%¡kkf>Õn0^mޯN.pj QE`LuP7ȉ U08_k) P]6HW ›n1o]es]IENDB`u1f42d.png000066400000000000000000000017221326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoLUu?sν5]!xᬬ3;R"$Z[9rmit0ͷ p%%NMjb@K 7sӋދW][<>{~^6= J)S]+_*E4m aո=Tdj۳{3[>^hxǪT-= \Y^vo:?pђЊwEKd]l/[H ⼅ ]`?#RCmkk;xu٪<ۆ&*{PPϧ]Ksc?ˊ =PVOˎKʧAh)EݥkACK7%J]߬'YAM!?Y\eL82phl.vD8>x.~^3jgùc&1Y qi ~_.cSW9|[bD&OtG}%i훪 ֽ=P!DڊF0ܞ+p! ͂m8RYh'Rc!zwm+G"y_;$8O$@KGϛp{py ?iƕe&Lk7RFjȲEՋ5߼B4W0 "nXSOޓK;AqDoQ.J&. s{a1JD$43oiؚ{J74plmR**\Ft=8%Kͦʎ&ܖ;l8EeC/dm~eoVR ~w,EfL=J;4iz'#znhz=(B}ƪR?6R]IENDB`u1f42e.png000066400000000000000000000020361326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKL\uޙ30>z.=X]L=^H$2 <].4fqޛw\XȌ!"N+uVN[PUƀN;nK"2f\z"p T+@ZW:Wso D"O]]] hXRSSŌ@U9 1::@! NbjjJqt۶I$5W~ @$x%[E*" 244)ڶa8/8LԾ> BDQ:;;*|H AOOO+pO>^V=zߛp=`P<δm.:|jPM -P"}YxhܑS P=6MSVϋQtE%C:%ٴRLڶ}`OӪ.T%q.?3")O.ʈ<4;A8 l)5,^^edQ1C-RR 71vBŖlZꕬ?w$#BWa/Ňϥ8N]QOvx[4|j_5$9wUc|ɐHB[RZ1C3|ڦw܄cC%ٶ&XaBI'Y]_8HK:}>ߢsr[9v455]54LIENDB`u1f430.png000066400000000000000000000017231326020644600320200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOW~5Ħ1v.*.UeTUQ*P[u_.* HJՈRnE*%Ad!Bqb[3~= -Bkmf2 Yw]d2Yh4Kl~\ DfIqZ_7@)U:]JpQ)'0) t+מc»ݸU*Vjp8ֺG.0`4hoI-f"r^Bд񴀳"?hyDJ{HQ^uSUûM{ySދyWdp/A؈sT=gyj=AܷÈȗG67 Bྈ2r/Cm< "Oz =yo!"?wYD}YDk9 Ķ~{ګnJ`yv۶a|jWy "}>J-;PJ&"{;.uOދi)\Pz}0H$r\ϫ%{5"b ިlmfb2"HYK.`gyp^ ș"r2j >duMkaK$+bL&O.wg@=@"C} tvv+)q\_SSSS/ [=Xl_k1.cccB!XYYazzGWJ2 clooH$f 8@,h4wڧ!Rꊈ\c`KDM5+?^S IENDB`u1f431.png000066400000000000000000000015301326020644600320150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݔ]Te;gfόbJ;b-3@LKoB " wXV>nVPnX- Q\/- 7mӜs/tsf,M>{?]ǜu^:l:! P>¦C-o\=t7&l*􏟛ɛؐ_-1_`F{Duk%ȌU:1{ْJ!) ]uKAUZ1ƒ059`l@1[-AP*~IꎈA* N5P{A32\(@a˝5sk^-.4TJ=Uxm&1 #rt -Shkmg-VN+tf_ (ئU6{3?a2ہ⊉{|=ɘsק缊qGg!mx;/fx]YV]- DCۖ==vH[>85-B%>'䌢R?w,j]=s240L+;-; ˯M Z0£M· y=g$?pYTUz6f U4帝+Lݣ[9".Q[SDҩ@I` r19p:w y IENDB`u1f432.png000066400000000000000000000022631326020644600320220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|djIDATH]lTemi)(B#4gECBLDĢ/7i?&nh$AZ"HBB1AA*(mv=xlh{wy睙3pHmФ;qn'A>'De,<ۜXؽuRmL)O `5 (FB̩b;|\q/SHh0\cz{c 9#1rʹqAu xҙCS8Tʆo]f7c@?,\֔D':T[DSy 0pt`U!tjk=zdQywCKF~b9.7:rFHii=E2"D/n;iAWn'-x֪8 n֬86EtO7}=6Tl}<^]%ޯyz9*u{TYR%Ez|iCh1s+- 3W.bY[/"3~>[ T(a;ɖ5_ힷ_!7y&9(+z Z=K7TwpdLb~:ZMVtuB*e麬;۫0\(g}R@p+PE?OD1msc}+]mXj&¾%x2IENDB`u1f433.png000066400000000000000000000014621326020644600320230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]hgM]MPg Ut:t+*(:ddH??@P *JX78/$S²X*Ԧκ6Fch՞ys^xKB=[sqb䳠otE%1k1.&t0dYOwU8{USTY-E8xt8K*yRln@!"e؄:BɕYM G7$h}A'ee LۏB'x;! ULxW"/$P.*wv&;w=ew[JnXB=P!gp'TBT:\PYvWJkZ]޹y5-3A%. GAkIZXs <)L $j+ƴU앺NZ@e@i emi#41ϙq9O)yA5М3n~lg[AOC">R5ʥd|eF= L}@\+I\X6~\ؼ˼EjsYIq)<(?;Gq]L (ˮ~&("7fZU!l㘿 |$)S3UgEƯ/# 0-e2ODpi} ,]EG3rƋӖsPNj#}6:eds+$eס㝿ߑ@ssS*c ?Dמ~oL̪br-cGC MxZ(䜳g :ɞKP8a%[ZZȘY|YR♌ܴvPYga3?/0&=lDʃ'*+Cr)?#{7K8c7:DHh_u02۞K8@RZëHG7x+Ur!/uؔq{T ԙd""e1qWnw}/x$7ѷZ Tb ٵX&PLhj6 "*Mm3 ²'bjmGuQSYUJkd&+J=S m2pCK+_T2:IENDB`u1f435.png000066400000000000000000000020101326020644600320130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕMlTU7̔Ng iX.l5BmB0.\lHkqU ׂBJ3Qig:޻.| +s{V7S.-ߴIU9:ix=ҿ@s%|!8q$6ٿ*=kWSRN fa8M 18.@FW9p?J,[*,so\聁n!8m.HU|% 7_6Q=}`t/Btfajk FkeL8h m|~4-=>JYV&:Yԗ[w~+4VY,'M`Q־mՎ7tm-mO`GFwKi %q3YNQWvXS.tnO0Z/89ɵp'CQDեB3mK4\iEb'j-jdBabޣZy!tPdML$,TF󻯊 !8PSbB+LeVIv] Ϻ4I, v#<'XP"rA^0|0D¶:ˋ=pϳi҇H +ӿo(>4̤'qaxVs݈ c ſ}WeY[a7߈ų&cݵ/ Yc}5s.9o9/_<@pxЁZwLIENDB`u1f437.png000066400000000000000000000017661326020644600320360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmLe}s@֖JD*of1}onl}q%s0*˜0_`A%KЂT8x/q8nr?gs,fj߅x`A!8A_A[LrE فp5^jPRhE@s{0No 󭹋p}{F7#˙LNFܮ$Qm Ng+@Ϥ Tx33WNUvv:m?v9fd5T<iA|#clޜ3 +'joޟ1&f@|̬tz{ys`HUqD'޾?srr6˅-4|}1~E!;;o8ɉd?4@UiiiN*|=UBߖMl[ QthhjgbrzŐ4 Mm%Ø2c_q$GO|"8XyxZ(ɩ=؊N ÅIDҶ!ӳkzƀO{9s}YG?\ ُ* Mk8gh\=̫d'ޗ]gw}eU>ö?=e+u) [2G$T 00*H-gk8lR0uѻ!IENDB`u1f438.png000066400000000000000000000016651326020644600320350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dlIDATHML\U{ZhhSâďDc-85&(K+1BS VcumhX4R54КHɴB 03bf0P{?{=TF_8 )~]"gOv #E:A`I`X3nߝ1eoUpd֊yןrX  {+w3.Ҝv9A OS+^P|q*E ?"YoxX“)LKA\~㘬m d8&[s{. Wթ"VxxK C<<]]ȖRk= īY.?k&ٵ>὏% ZFd%9r@tg'\{:z23PR0s"MH(om1XlS\BlttBy/5v(YJu= G%c{eʒa ~oD۽W1ߙc#?"2=G.׀Q|:P}6L,Vg3#ݏ^0UwD/tsqܹW}j tpmrLXbĎ.L6^&NoPET/j' O;CQ>6rIENDB`u1f439.png000066400000000000000000000017421326020644600320320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTU77igD!B16X615&ҍ 4T ]h&ji37ycQ_ݜs]aV 3|/Pdc^dx?Mx[y[BcngR-rnƃ*󎝞Hun: ]}aD&pf)`ገ<*.5<'ԉx>{гw$ X˜Y/b?*G~@ 4[U*k*f;Gb"vEJLuCnֻ\AS&=O~ qocg7EI}?6 ZH{9AX?f{k0֍ *V"ǝ[iYxc  á` (]w25字 [WP %)'3 Te?SxgGYI8kSU=`o9LH -^5,}}pn٠DrWKFUGY_;k6Qf1upTU1:) r/ E Jо`z۰~RU 6S#ibv|nȆm lA~Q̩mtf:_RE8<'pl 6"?WRN؂-E1z:u2%\5tW;[؋1sgp`Z%)0}KO"d~G}ш^ 5VcE4mY{u);BDjbwfˀ5`m|u7 ƾ[oHuwB'!rH&UPVo 89hn K{6Rw3FJ=V |FA9%7L!߬WJCTIENDB`u1f43a.png000066400000000000000000000022071326020644600320770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d>IDATH[PUΕ*aj8DzIˇ|) k4hMLcM1I@ 3Ƞ]oH: #xԄk^PV}-x_ hcۮYTCXyUUm3yY_T+;n*̜-ڴN]?>څ*b܉hd18Ax8&z$ [_!nc?.{,J('$3@Lbt{rDi8zP8HA@&% y%y50.`}N.eaa - @XMDOM ܾT>74̞V`4H >CwP6Hu*du{sZxJKrr/@ۮ•07}C18,X|VEE!lh=&*wx&e{CeɄF: V4@Vd$Dx΢s[K<9 Mf$xzi:~hŽ%$!$NfysED摙YxS01ƶZCKW6欔Uu,z`)X) ԮA9Q Aʪk K6驤x= Gq:FZKm CxV/^@et2Mg/ϝ5Ov: #4>Gؐ ox1aTWU0(Xg/?ڊ泳eN'm-QU0,~5}34ltИPss;~ep`'kqSt[4>˜Ԍ%oQ!B[UUlݪ>O}>XUU{k*c`Vrc$vUTP__OWW7o& 1Ø*hگFUUitROǵ`8ߘ!S~kOoo\ff0LNfe+}a$Hܮeڪu9.Ǜ>S1ٿm2YIENDB`u1f43b.png000066400000000000000000000020721326020644600321000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoLU?{/\Pq4"_Ԇs6kjX4ȶEZYnli/ɋbfola˼Bd)x9P6f}_>s>=aޫWY>.epO{hǕT\}S $9i:oCd:XJޢ,lOWmgwv)<PXeYcI^_+#ضϧ))V*` .N: 6E b#8lp33Óq|<cǎihh={>Mxvε[c"'(/̣`R6< 45583.|GpI %xެZ0 R( | eYhZcR _N.++ד 7obiD0TKى磮˲fk[r.s4'cq 477055E(d,vNOt!ˇ1 H[[466222 ̾_ks,=@/?-vSUUZBNV&'[196>ZL:XWy6rs)]EE\1]$y]S_[.i;}Ww{P*$PA݈yX/1|*}goO5HZVA0ň)6-bƌQD _ 薒7kIENDB`u1f43c.png000066400000000000000000000022121326020644600320750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dAIDATH]hSg{Jrhځ6.Y(xgLXD ?\BLZp7rJR$a;,hb(bُ伻0V7_y^I4ײ.!K'!d<iV)OѠi# gϞBK)5B_RLMM>ϔR ϥ7L&TJ/DGGGuKBqСݻwwe6x-eM4448i 1::gΜ4M۷j̺uBܗa<^nܸ-[T9~ @kkk/OwwwUiܹtY<~Tpee1Rmmm "L&YZZvX͛7D"v>ass'`ffIӴ@RիWy@3338qb(qEd2\zi֭[ܻw<~]WB\inn> ŕYJ)rBdr]^`ȮAX0oKDBR~|[9iMӮ555VR&oij2Q?7IENDB`u1f43d.png000066400000000000000000000013701326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՔMHTaɱR36eXV19 h2@( jABEJ4%Bèi;(uM;|~]2`$J B5mp`'{ :Bn!l@Qn_h[#@`iF@d▦Oew:dinL*SC**ENb>\Sئ}؄ F>:+0_FTFd_Uɂl( 2ʲy<kf&?sϽ9˅Yrd,ulY7d۹Xb\FNU T=]'2*z*Xxrb@cRI2F#D&BbÊPs@*;l,k2}'VM[>YРc4]|UoM2L/gj*^ߔ[9wYӳuhrǃm+ҝ> w;ثJ?v˿zS{ / аUB`AJ'*_F zr)z(]KctP Vgk2 EmNAڌmSTHfN}rp}]W79OE>CDY1hA4:vUhQ~JQ\D-GJLW**kVIV,9ѕpFU{K#s˛nUYX WL:D$IENDB`u1f43f.png000066400000000000000000000021571326020644600321100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d&IDATHMle;;v-ZF" (iEOzCiz! TD~>[ 긐J`cl;p5h|,1828`hZHԹbti V+axǦGp;JfpdD Rƴco.g ,gѳ X3&U v=ޡJFQ8b)\67cyM̻Mws.؟h*C\%^ ^Fh.]rXDI#Ihjj$:~&@v;ىȭ=oD""tcaR׬h7 @m{ƑroH˫FH48ꫠU&`uZNa@+{Ur|B=200pj0n-V# Pҏdʄkٓ/# ^y] 6v)E H@,B K cIŢQ1Gܸnu Zf؉7_]J`[y^UQ$@,mfLXN ᑙWwEPki**|Adg{mcnTUet <@ͭpUx%o>7^&zytyl:#Xrs$LJ&?,@BKOWlJ__|mɟ=vn'P0 E[z)"g8 ™'] ew^FDnЋc\,=@[e)?)IENDB`u1f440.png000066400000000000000000000007771326020644600320310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH?qǿA3bNMB"."` B"  .Й?xWh> q4}_ҽ~{X,NjȲLa\\V|ի|n6Fo[ֳ htP$!Nc04M3(ˏ&'qDAJn*u߶,)$?gD"H$4 fSq]-sqDeLF@I2"J|>uGۅ0 ;!r].v* DQJp_j!|>O㑈gC˲3M!]u:4Mcrr l0sssn!KCCCx^L&"111upp𨮮t||\m*zl4oΙL^xQDP(>yHJ0rX\\$qxx@4}Bx<FFFFplmmpzzpN8@{{;G"P(`\io[,ffft:~zz=\.o9P#ILUUU "I477_Ȳ,oO$I`0 D"Q.2`Ffh\jfDU6Myn4dHR Opx.J&vY4MY__gssX,AEEEq,-÷ޝTUU$ImC-s`Ej}# xQBRQJ!ĕ(&鼜7W-R9* lIENDB`u1f441_200d_1f5e8.png000066400000000000000000000016321326020644600334560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dQIDATH}hUu?9xwWךKDYY`voc9Av*7AA2 "7!d ,yklE=/pg^ؤz~}<? YHR}"fRQ(z~p.z4>z6)g]w)MCHںS=;Ac[K߉/ymY+#\r Xէ zgBGgbDd:Uq*=Npubr4BsSmU#" @!w1knWlp٬8pk~ҒHɘ򊓧 z%4w9Z 0L~'{]K8 K-TOJ]U^\#){3yoadLs1Lu0?Hs5A7TkJS-nay86_~up4E,lQkrJ9kvb ߘKCd'd\ŞvytmVquJX.}KN35WqeQ |i>kV@)(~M?֊4iR ^oEflh#Τ+[6rKpI ]cowOe M# xJ|FCx2,4Aphvmw-]Mۣo9>/A'QpidɌ^")nٶup:ݱz+'>1H]"uy(8C y"ilsYF~WuPf%&4[1|TȟPE#>bS/s!۱bJ%VCl{Co[1M>IW8ݣ֊ì-`cqdj8 c"6晰X Ř9hQp@slF Yv,8-^ P'@## ?-@W hy`^pPoEK`: d6 _ ya8J*AznzӃX:X"7vѮ?> !\{N+27 ۷ Eq#nH"!W^IENDB`u1f442_1f3fc.png000066400000000000000000000015641326020644600330100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d+IDATHo[evmM)RGt$L :!Q)RYmI*X q0Xi8y{s{{+]zTH`^\Z=̬Dk/υb#SuU4+n yA頪Ib,?94` "zcNnLqDܞ\82 *"`:x̒/fjD3d4V٩TQxC%X[Y~.T ʽbY>0sL~'!3sKD'cgSCe+hll$lzFgj k$Nx. FFT3k">qF;hh,0ѐHQmKƎnm;տ }L~:2(4ޙV6$;c[u\1pvq 8,bz-!{w鶚z.<p`4v<;1lUd#:p _W-;FIL^Xn`…@k-4L;A0; * X1o8#2B 0.T >L<5TQ%܊2@U'NT/? pEHb݈ٕڸ~y$@>gʾ*ĭڹ7Qȿ lN<#r W~Q.eIoIENDB`u1f442_1f3fd.png000066400000000000000000000015571326020644600330130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d&IDATHo\U9^{ڛXA("㈈"*6 $$BdS@EA:"$$0b-/wcPۻ]{3#`}.qDcś'A WiG/U퍹凧.Ϳq *HPO~siĀogE>$esFy)P <جo]ZukG)=}|Ueo/Z}D+O , `uiY}BRcdZbr?5g?Z?cs8>[ 5bO@,SfO3$qJX@gD3<{m6*uOcH PfLpqZ󐿢u *;ۤ  [ q 槡j}3_&IllTj3f^koG/֊~c:.FN& DaL2?]Xy(ŏ˅B' <.Awmn2"FP|ֱKo}5dB#3$(r._| 8ځqgj~=oQ} |-M,ٜQ\Z\ iG r jb@B&é('& _OjBo`].Tʹ+;D፵ 3Vam*tNj"F7..&zxK57IENDB`u1f442_1f3fe.png000066400000000000000000000015011326020644600330010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=oUsx^/$" }҅(E $&ACAtH r((HB),;M(Z|{(6Nl#>wwtFxjRNN"צ. q~op|c~:}us3/^NsQ PyG̾}eQX电͌hf LՒtqb}l ` yR+[Nj+^ :sr⽁ D+;xscF*Ɯ@şqRho夙ʑpAT JVXH"`EHm5k |O:ݭ:v3ǽ ;w3'4#CvK`8 y% uZ5pJ@Z(IpJ@^xw^]e(Tʘ2NNbDA^ Qd)GqN O\ n/}Dn݋2{)Ђ~`i҈Cw(2ܘS_! zS #WAC r>Qxί^:]*tԕf(qzoz|8| \(Tjq,;zw5]=L=Z|fThw>!f_' xIENDB`u1f442_1f3ff.png000066400000000000000000000016201326020644600330040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dGIDATHoU;3* ʢ * 6$ X`hţiA,Z$UICbjǏ3M:~:w4]o65%əe@vSo=Q*k+*R|6ܕ=}GS[5ǥV!Z~Z]ϣ_w ~DK6h<2եl.Z^xlMQaDZRDlnsQH$S?FBkeil7_?/ C>p(D40 z}'Ϝ;JˏКLԉGPJiC'zytc LfRض6< 0s=+ya8p|DG{iZ #M^JT/1=X={{XMT6{ep^Lϼ/ ;?_u=gQ}ٗO1"{U65\֯s7rIENDB`u1f443.png000066400000000000000000000010421326020644600320160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMkQs'$5~UVi]E7Œ JqJ";.D7݊-bq҂;QCB"5̝NY9s8an-zs4[O;YK.1>%gwP*EgNLa9g K8.B< R%ӓ="N*hvw@|G=Hw9߮. n]94dO`(ϦI "`oR$r^9_/djDCӻ]8@3UO z@QX{s<w :a7(S A'?Svv!Rz0@#Fe!{_i(3} /=xR9]^G R:p<^*-e`9kqSڊ?'Z/4ߟˉH@}($߯F 1\?6] h$3R?F s 00 ԷT76h?̤hjlfP|OUʾ01:1;*~|*=\q h1c y#:?ǒ{GE.-T䥁Xnۏgo> *<^UG‡XIoIENDB`u1f443_1f3fd.png000066400000000000000000000010671326020644600330100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHjSQsnӏ4I4ZЅ.]q! %v!: MAD}~lt#\|nb41g\$ޤt39WJE5V=]w'b &V +xKz$JG$Pp̽_u`l@!A+ޒ:{gn1B$ j'@~g=ih1>Vn`WxjC Uq*ܸxٛH_.O0W[5;~7o_uMVds#(|Ѕt`ԜVv B͋6h iҙ6fTjL&[@جo @t#R_TuPUY@Z{&9yxxJgnx|)#A"4`y1SdV^W8}}m1"l&ʝǍa~|sejc7Rf+~IENDB`u1f443_1f3fe.png000066400000000000000000000010451326020644600330050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH;oA;q`I  (\Q!!!X-:?tPD ?bd.̬7mV{4wF;p%.r{Ώƨ{iWw8z rsT/14]lC;W*@":Uy?W%:o pn0!vX/)~y*v́ 0ͥc&"19UǓz#^{i^߱R\\t?%̑A SIENDB`u1f444.png000066400000000000000000000014341326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKhTg;8ӼE 6Q)-p'MX*"Qpl R EDC`S$R4!dщ ;wXԧ[TЧ4ṢF5x@i뮯/u&2loKeE]IcϚTjԅ~K`8A[yvJ5l(-ߵcMcv0W$1 !~zxfYccci˲nj v$246D@1:YV}DP8\<8097r_e: Vt6+Şd2_םZ8kU@A*۶/OLLIL2?T,Mvs$1%$ug垆1T7I!pM'\`Qp )g 0ml F{Z ]*JX|)36v岽)nI>axV8 <.( xVk({(qWGde?g1O<E5E>M&J+uD?Ѽhbp{ qqYV |QMeIʣjE+rr\yuERkVKriO;`mZDŽ1R),cKWJ8\-UIENDB`u1f446.png000066400000000000000000000010661326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkQsBPPDgJa#u{--,6y b@-|ED0;;Xlv s=sUAծt\jl=ix^w&thN dVĻFN@`dcw;(^k6Bu kaM`LeN dР[Ũrjn|T{(qP&f򈤎pib7 ZЩH PZZ~ wRo^@DTf`3`.ztX4brg+oܙju8\rDdob黑QMV8&U)F ɧ4_Jj; E}z+sוIENDB`u1f446_1f3fd.png000066400000000000000000000011121326020644600330020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH?hSQs{QK R895D2(A$Y\EhF :8:N]IRU!{!Mrrs;sr o\]Rfg`H pS`qfdy`f5?W:7uC?W VW/a(D*Oњl:SD⑶'RݝƇ#G@WUm :oߎjQ10"8fl9yTW[rASdy}N'Ll y O0&vTwvx,Pxsfhzc"T,{o5ZϾl'/Εʭ j] īȫ"_ZB(X|&j2 ڛD}؛`T4H5 2HqёI=NUANTH)4"խ|7wɜzIENDB`u1f446_1f3fe.png000066400000000000000000000010761326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH?hQy/BU++ B R؈ ZjccsDB0"bRA-;;B%wGu3{fU/^O͚ͦe(w};w2 0 0ŭ c}A9@E# ipwDzyN3 ($ sHdmӷ K=o_86q:n㯧Ns*;yPQy%V[E+jO @1K7{*i֪sOQT1$]RQ4XɓS'7N ȟj;YXXYIUґvpi ѪR'"{a!9XgK;6wDQk,mQtTT7րk@vS?k_[gdCpZT(yZXknX%(КV ନTVkEl8UIENDB`u1f446_1f3ff.png000066400000000000000000000011201326020644600330030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHka?ϛKrMZQADN]:`'!E\nrqHAA-F 7up()HCzG}~? )4[>wdJYiDr ԔyZR[A&8-L  7(19@U>Lvn<2xW+O_pݱbbX1e YV7̌m5V>?=N6@(QaK:\\LlW`/0rF6v'u$=ԇ#Ljzܾ0Á=!0UXNtU82`|$a+ Oﶨvĥ'lRwA/:ķ>7&atد_v4kMگZl2M_pg0q<?_'Gsou+gyCzlo.Opˌ@MW$y\ñ4hʜV%$4t8vo'z^܃_{$GC?V- pc(y@>%vOno$3Of< P&XJTfLŕZ?` =@3>*q gpZ=8I.T cY>#лzkĀ;;Zk1*YLt_DyD0q\Le3j mll@!0UDGe`P4X;2`dڐ?(ȷ0}n> (S[w"u/wG@@rQze=XU _,1Ni#b۴R['/#B's4WFa'\hS=sg\0ӚXLZ{13`{}kiJ'oeNݩf;, ʼզH(M`b(MhW?.,y,5'Ωht #\xIENDB`u1f447_1f3fd.png000066400000000000000000000010411326020644600330040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=kTA3Y+Kl"lv lt $F][ BL,$Jl-^lllX%!ם7e!cvpyf^##v֗#*fy>oyو~Vp6?l,]L$ބ\ڦyw!N  :`,L.q歖eY[^qdzvo~,d1?oFQ3ۏoU1 7G@ X ɯJR:|v|#`ꄌ=o¤G'[^ۉ]x^T{UF} d7=)>>J+所:nG ɨ/Pӊ\OrDFX\|RYhZNL||]+xhё_NKJ0%jͻ/m]OZ!MPVךSE+^ @@Î+״x[YtkQm_0J*B F\; 7=i젣ݠ} Xe-ř ߨݴKL;*us0eUs[Pо\@;Pp]?S89߾<6u[]D^#B C~\60&_[MͿF V&9 3yyv\2 ;!9JH**U\~kp BT}m˔p}a UKx+?(0w~呻|DK[vg IENDB`u1f448.png000066400000000000000000000007661326020644600320370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH퓿kQsgfgu٤,"B> V2&EXRىln2k au-!{w{8!ZL<턳2C^gY:-?vo*RS.q5ƽ=w=O;/ԐH5L]5FLPNf ݋:mo9pvR^8AH5-K_/ 2@k%Y^[l@_:8g/Ԕ+|Kߗ!s~F^Q3Yӆ͕ `>ո\~5,sUAf[[6kශډi>wqfPhg -ɨdpfMIENDB`u1f448_1f3fb.png000066400000000000000000000007561326020644600330170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=kQsglvuB! F _N1 ;A @` "ɐ&h*aV fwƹ"+.d>A ysN_H?mT5 2&V&^Nq}T @. L#[UtKcZ ˚+5p d8,&[f`- ȩ%8|z`墯6' (mB H_(Ǐ;?TJ%X4HM$16q /vx;gXOq9GP WI 1ۈ  I4Й_8i0- jKY?m<dv/~|H 485wa |_zK_gCɋ}4}9~j}^xbfW@сNnS4O۽=w|7 qA5ojRIENDB`u1f448_1f3fd.png000066400000000000000000000007751326020644600330220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH퓱kSQ}D_k"J͡ "HRq1[кDI)<\:NnD(f~˅{ssv~&M?Ii |-ў]$ϼ.&s`4W]7.r8xרpv%ss$4I|`.Mo= \(x Ő(|Bvw_ I/03:?v8'JpR_{9%K xH|4%4x.׮nwdmO7D}5qiPat~tKdK@l{&o>G>00sL#?2 `LJ}g/ O@j"{.^D`l;tyqC`6ǁto҇vQT<8V?V{9iS[zD6IENDB`u1f448_1f3fe.png000066400000000000000000000010061326020644600330070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH퓿kSQ?l E \SB\MPp(&Qp?x8b&JQ_PAP7E:"Iq4yo~ s>{ϹBwoâ&Wu1>6 a'h8 Bc'q.DѲȠA.*fNO߶ZP{aX8X,P2?ڛ{Ɍd%~3Rm>Ш-=sa[mbs?|88e= dQ93 ا`I)e4MU Q-vf;mF"; H0mI&bs[tGlS`ibk":Wo^-,e ˶g`k |1}Sm>];y/;{w)BIIENDB`u1f448_1f3ff.png000066400000000000000000000010351326020644600330120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH?hSQ&iLCmJ(jge  #(8R\ݜ ): PhA+IDvr6Rӡ-^K~s8~ b* L2b>{KSc#Б•FG+яw.]HgFO JND"\MRO-g~Dp?v Ǝ9SxmӗoK{Dvf,ܫ9Uy׮ kJjm#pnK\E@pcDx[Ӊ| V{mZ&z\PB ~$jۊ /F]B~ |i![ (̬ &_lvSnZ @ᔻɷOOk@ώ_Uy+肈nU]U4]~+y!ЬdzN3vώǾ^IENDB`u1f449.png000066400000000000000000000007311326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH퓿kA?ontXiQ xIH#VZ)XGXA,^Xh;A$ޏݹš&n f}٫Iۯqv~E% KW낓@ kUg^}Yg,ҞThotWXɕc0GOI *,pX Ix7?a!JbGf^N9;n<tfQkGtb23}*Ck=2 լlV7DNXwEU"TgR-۩05GVGIгZn^+,t@3{sv< CSMteV~7w'qzIENDB`u1f449_1f3fb.png000066400000000000000000000007361326020644600330160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH1kQvf ),? ȊHR$H?"BFHbmeK D$̛y7Ͳl< 9;s}7/QqmNMqyy-*Ig{o@X- J'^plFDjΩl,@*#npNc,~1jpTLYqGPZIgg]@8?jfSxgN͚hɂ.qsÝ*"o[ϟx7"ջ]=xx=$X` x[ ?. R:Tպ4#ެkZ"߮ݼk5kc}{ )W+U P8Y?RIQy ZnFzInRI9#]Ck}d gAƅx5Ƒ\a+U}Jj2*f0;BZMgID~:@`Ւ+!o3/ybv>Έ_EK F w/d$=SY/uq tIENDB`u1f449_1f3fd.png000066400000000000000000000007431326020644600330160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH1kQvv%t@ 4i6beTtM!l!6 haocc6US 4"dξc-tfJ!{{}]8vK͉"Z[cp^LūWX֗ޱ3["Pq^^o7-=7S[Y?$Io_ w.bP zt h#q E0yY~ٜ(PعMrl1vE!c9΂Ita_;@wt>1f=]y[ +%L_}%rd@^ nșKwCW3qT&}.l>-7f d7W]xw~,|X}0+7א.IvIENDB`u1f449_1f3fe.png000066400000000000000000000007461326020644600330220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH퓱kAov㎈bb+,N4P%6ؤJVE&)"V6zFݽAdwsB~ݼy޼sKyyV&*<.0,ͿYͫqe&;-W6,8{;^032"SG:ߜ5)ci_ROyٽrbw.K)EىqTǻ3:jdzFQ+M61ظZ:t1^=[9K{`@Fy,ˡ̦M:M$ګ7~upD4ѓ,IENDB`u1f449_1f3ff.png000066400000000000000000000007471326020644600330240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH퓻kQߝY ںM0!HB+ƴl-BT6HN.  uvXg ffJ!_w9%z8;5U2nVV_$q\FmѪ63@`[i05PyBfǪfS՘8{X?Kgo8.?gNu{{ }>666?L (?}780`$%]fV^ʣN vN]V̅j疋϶`ע38-r\9ԁnXk^u\Q6TX_^I5[.vNV} ̽c`.SGׯɹK}7jW'7K2$x)v?]Y40%IENDB`u1f44a.png000066400000000000000000000012461326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d]IDATH픻kQn%|FFchH@ +EZ "?( AL@E&0y̝{Ev7-=|936KÞ鞼2,Pg@ըX^9$p;Ayq/'mERhJߠ]:J N[@eFzXx^4kUrR~:GA4r& ϋ?$r5 U_W2 ok.qR!\]jS`1lIK@$YR|8@ٙ}P!!HCլ&yE+Ն`ka:]S@=]ڒuׁ_o?AE T:-H٪ Bj~UQ!p+p1tepYZB3+_b\8o0mM{←4^;;ݧQnQW@6 穴:H^@yRmR4 #r: T:IevӧbNQֳ[E#~$}&9 foNspm(V R(Խ+./6r/ 圫bEà0_m HI< xB.EQcSD9_8 +bu E(:[Y,a h#Xpyf6@kbDb q4&4D.'5Q=>2(tu]VaMʄraݖW*/bM32s-,++tZ4qau2'F}h+׬-.lL!VcLg'Pʎf@c;YR2}f'g!qz1sώጪ "EQ-a}2}׼};2Y5ӆIENDB`u1f44a_1f3fc.png000066400000000000000000000012721326020644600330630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dqIDATHϋQ?9i\Bb,Y!"Y%+) ʯb#Y _ Y(J)?g }{}z<9ג_M7Yl|xzmXAւe\ǹkLmDpnE߁FB+``G \hRnvNˍh¿"IJKKyLk#hb4Gٹ3/Ry]3^eix7\xJatu-T*‰jy'ѬdfG8Iڻ`|&TqL3k"ԥqjP9dPl g::I9צ|{WNCC<3ϥXC{[ta1"޷JVwof*3N 0q+b ݑ7]ܾ4nBd(:`voW+xEE ێ =*3c Tُ\0te0d25*ՍsɊUl\]q$\sDVAAM"@v$ql#r +\LW CjTAȢETl:8#fZX6;!P0ƔJpў>('r=sKJ {K f~]p=)x_nBs.c'd"<S,g|>@L/ڶ%] 6H;bQJ=Os^2YK}}-331-I味Uv_s'69S5mJ6jj4PD+T~>< ; -+d|‹п+Q3IENDB`u1f44a_1f3fe.png000066400000000000000000000012371326020644600330660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dVIDATHoA?vmBЋ \DHEMp888E"BK{ABD*6Km^fmKyyyf%/ :Xs跿 a:'@ QBcQNȌ w.ɴtN qr0 )`Ϫ(pPq|U1V X1b?_8!j^y%vXiU"qߟ0L٠J0R4ء8JM.IbXW_JBTvJգ/'#K;13q7+ _ŵGEˡ Yn[gz#9t2~,M보Gf*ܬvwlZz51˗rz@X7y8wUw/IENDB`u1f44a_1f3ff.png000066400000000000000000000013021326020644600330600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dyIDATH;hQsuC FN,RQdeA,Vu@ Y,ZDPXAJh&f6;3GvB{瞁%ofYۯsGUDsWr>5`dd_<9m*tş 7E^2fUܝ>bGP9qΎr @3{wi'V,@$BZX6>>Xg3΋Nxh^*I bJMkӳNfE,@ZM9띅s8皣'}Qo HaM8_7L ̤UAdW[@b卒놪 0bZs l 0,Hk](*J AS|cLqod rN5·r=NT*F(k"U*tt,$WӠG,\Z*ۙb1Y;39]pƚ$lg0KX )!+>L2a=@Lvg@LS)AF;W˕D`mG{UOXc_KO*P_}آv:ӣ; &ѱ4JU;b@!Ƙl9dvhKR1)B罊>u-;S\_IENDB`u1f44b.png000066400000000000000000000020311326020644600320740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHhu_sݔ!T`Q FxlgmYP2HYYMXX&-FER)Ed"jTy˂-("33Zy=nmy+8tdLӫf2W 8~,~}AܝJTf;:!VD"=|{m&G)577%" R"nAbCyqkR&H{X7888N 𙪮`}~oBAT\X,1aFϺl9Hf t Xl6_1T#Y/OT>Da6T", zkx֭0 Q.b-/zTss*,׍|=26 u&}u |B٬G2@!C;bн"tB$9}9m5: x"ߨʪi[.Aٍ.0vԦ0vU󼇀3T hn}aW!wtňn)%E7Pf ˗m vբyy6=/J?ez_ P8r&0& \,T(JX+-˜劝**;_HkFN`t>UecWWUv 28&h  %l?Xq"qNc'2$}r8Xezpm/Fŋhll,D"ݞm}W6摜ivt:Qvڲ}}}?z5DT쌮ɔ?_X[RUQ3l$M'/U/n x-IENDB`u1f44b_1f3fb.png000066400000000000000000000020221326020644600330550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[he۝4MCXTh&k ZV1 DVM!Ro` X֚6(^R(#as( "m5ٶ U治s|lt2s;flns'\Ix<^1ݪq<_}ՀS7N'9<ϻ/:4ۋ|'z h}Pݮ1%ShKy?khhWDobGE9H.!} QH't_om7=zG яu PiҀґ{:' oc#x6=W:eHݤGyy X:N (*;B`ю$ݾ`t2*ҋ ^D?H'OΛx@=\J(ըH59q}|Cd?eyUᜯSWCdcߝV tp0H6{L`/Eu(ml(å'&?vl7q]XTf0guyS@~ι eVe< ΥIENDB`u1f44b_1f3fc.png000066400000000000000000000020411326020644600330570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoTeϽsti1s.e.޹cAAŰ$LIΊd.EA`_2 J) 0̌p՜ag֝]g<> i>&d28.3{7LNb@!p4=?(?H; 44vv-8]ϰ5 Ar_KK}ܷo_k"-)N9Mj̉t&@L(u.|"'[=fvg *W$.n}.fV[k655mB!=z+t)4]yU')cf] f+ۇr]1!hc)˴S(Efe< m\>֒ۏt@026" GhKoV~oײ!:QzloLm%qafz i64WflGaok4 $ĺRFfҔIsx;?|1]wwRyS%Ř5$`ߥ]C=uʭ!;'3޲u;_  3w!aPUUmED6YǍJTτwwa`YVm'^ﳪz?p¶ݴFdW3K}Xxj۶wi;ؖwx֊@e~GAvŒ]L),doY%{龑klKIENDB`u1f44b_1f3fe.png000066400000000000000000000020471326020644600330670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHhUe?{D]#ÅA,QvFӌXz]N,$\"(ʰ{ F)FP1j[fEBJY m瞧?:wmi><{{2ҋřcH$jD1fH$_6 t|߿'= syH=>o]7{ْ Ykhh[DR}}}Xlh=Q^=ʛ+<`fMEuTRLuDG`J51\ B/c#Hncdl2[`GՓ+@h PQI'wM*eVW^-=m@ $“ 31p,+e Q=V$J#s=*dsqYtUtsexCE~⢠*ytvMA{Pk3z02z{Qs!8@3`<:Ala+Yd 2<ͯ/?8ˏEg0%j( ;@Lqn{AHa]uZH(ֈR +Ы@c3/d#"x+N<+88@W}'Pɛ\j -|(r)%}S CGāSAc*ԕ2m!ג`4C;vYKrb h.\B\-TukR/@TY?}Sw P[[xYDֺےdL*7ܫ*\OF M]}BD,^siU8y^\qi޺+Rh4XlvdgUUUm^:;)ۀ/}wHioYV秂Tp g l*7:X5(1o0YԈʘ1pBjbO4lIENDB`u1f44b_1f3ff.png000066400000000000000000000021031326020644600330610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHohu_"FtA!{w^ C2ÖA'BB`s3fĹ6E{Aa5"g゚۹s}GD"k)ڕ+WVxX^SSFt/y^zٳn]x sgɁMZ3.  }CtttW1W]}9c$v6_ XXh4/"ڸ1 uoQ9:c59ԯSc^U12ͮo=ڴ$1f+pma.pgZpw>d2y!O ”⍞ ^Qk#Sd?,+6yuE^S} @a>"5Ϫ,z7ݛ0C n-YawW`'s#@m[+h۶esN4 = ru m obt_E \,É+Ѽ9ߡ )|-Vx\_88PPRβyA`.-A@"yseeg7:=Tt|7bשYs+)s{7V]~ C rbMxeS6y @5Tgd]} @9B}*~}ח&bX@׉vZj2yUb}]@D0TzBIc6kmO$Y ȡV2E;g."?Ts4 >sxŢ{XSr%p'D1fY*zZV:ckzy YDf>bjkU]&"gEurX^ <4/ǎ'ZlP8 AϋȱPDof\@IENDB`u1f44c.png000066400000000000000000000015051326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]eyygf7w7]w 7%o*+00˺KQ!Hț."*Q"(vff> A]0tE]Gg߯yO:_n?x_as90WoVjr-E J7V/W6lyz1N x?)jvrR߲&%ƵQEQ?Ҧ2h:z^J @~XcSw֒7> ,ddžh̵M8W_CVńF0ڭu~#4=20^ zwUv4Kv9Q֡{&@IȻ {^H#p#|w{MDɣ7_gz'0YP\l{h|JPe_X}I-m ŹayyP"]@gnNf:_Tc ™!i / {yTfE%S٦0\XB:Y{I娷wЙUI]H,*s\_/BY~MIENDB`u1f44c_1f3fb.png000066400000000000000000000015171326020644600330660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOh\Uy/Ӊ34FԊD*Vԕ;DPtBE BEn\ʒRLŅ(ؖi-L:y m:y/سw ^8$—v:+leʯ|WlUw ,0j;uZݖ&k"c%W)KE>ՅuD!10+GgAu];dx+k ynm`ûh,o3"TsU_7D+-V|qj,?l!5շ-v9U=QLP)GɶZ fpa, Yxni>GK4/,1T.sN;ĦkFcjos]-{^?f]lY3ǀ1'?S37'DprnD]wCōu8H7O+xuS :!Vgۡ{ 㕋"mqN4ow dS[So$&=ر瑅((Q{5|L*0ѺWo8['xB]9Gi;Y?$!È;ՌIENDB`u1f44c_1f3fc.png000066400000000000000000000015461326020644600330710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKhU~313y'W'mX  +*eR! +ZJ5Sݸ+KJdh.RdFM$$qu{9=6V'GgXe Ȩes3Gn0?=cmb.{دܟʗ.T#3:@7񎶁?/.XI{ әYD8(N$J wo$^HtQZ\fnwm˗Sx{JkGdYӈo9L-ɂ0*0J֪[)Rw] q@ZէW:#*LgF o~.EzA], +u#*Ng':[_`b FM;0 dDwR kN?pt\ET&w<0m=)NU=@wKjZ oG?{2fσ U/;/ީ>UyA"b8*B Ԙ5NO!ijpXA[<5,Lց,2(//Q3-d):x8 TQvtp`۞@+F5} G/а? {p3ˢfLh|̗M jWQՃ"@UAOtb-We`'Qࣩ+a"fBq@,40sU3GmPtsDhs A}?]w8=aOVsH**AEJ !-kxX]g{Z1S\EDDO} |u"j<ॽEc;k?s}FD{/m~ ;l K?{'Y_&h&;|^$)IENDB`u1f44c_1f3fe.png000066400000000000000000000015161326020644600330700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHU[HTQ];o$zAAуl>/?uVE?2*"hf(C TT޳б̽;^}/aׯJT3-=P,Ä:' l\iIogLX2TV )GLP)S0$S"(3B>ן=<S"MwR$eOѓ5eM 9*4%S]Gnhݵ~1 k~PB~YJ[4=iJkf7k;֖ =5^ ~ >cBb f$"uP ԘWһeⓉȆ-N LQÕXy ]k;,r7w 5s~(8oЙ٧c(oLY{qW J&]4vG)!Zbاat}ۃ=Bљq  Nx1tb& O#{i@T2A_i7ǫG7.Cc _:t`N v ؆)HI}xT{x~:kIENDB`u1f44c_1f3ff.png000066400000000000000000000016001326020644600330630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d7IDATHOlTU7SRf($A6DM0aTKYŸt,1B`inƅa1ZiScĪmH@mA*7Ӿ. axxv|~='WX`46lj'oZϜP^-T@a(v/Dl}H\Ϲ^QAԖc';{Aӎf-焯(cƸ_#K"T.~6_^A[|/ߴv)QkT61P?.YaS?]tHA@U[#>|*h鬵lvp&iҚE%ֶ70>K9x[ ++^pEx:Tξ(cd9ԾV <QQP,b*ʨV!"eX/|/Ɔ"l͎ѱ1߸ź+ZcX5ϝ˷Y#+}~,8^ R^NUt [*/^-'!dP\3[W:x2T-7T $I]N[0#sКj7!)`YWTov)p5#(PaRȗ{o_2Dfy) ^`"0TT=Wb%ђNϺ6M툵`$5'=,H'3cy3]Cagyvs~Л)':29Z'~o=KQwTfnW+7t9O#OA[W?n=cǛ{zlҰΉƸW]wm鮂_7DIENDB`u1f44d.png000066400000000000000000000014361326020644600321060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkTW?1'J JFL2M;BuWUkE7bֽK?@KA]4h馊?@ hyt$́{{|+CZÊ WNQ3,z"]7;`zsv!4w ®9,]D(-r Щ9UМ_(oW7)r-,Ͻޙw,#ULx{KT8F~(志p~ґY0S22UЏj5Q=7R /(?k`#ƚ$:Bb]]A#18ڰ:bf_ 3O6}{PHʐpL,'(keTllz@ۣ[bAX-p9d!t3@}%D+1Zbepq3@y|zPk?rP?oXݞpIч4z(tueHs˨Mkv;?,V/+ +˸]icC)S9dDwGiXz/{bO^j:M3QYy'E[Z7}ԯs3*ScjƍAkɩվB8R^Wqwt揭&ŽIENDB`u1f44d_1f3fb.png000066400000000000000000000014511326020644600330640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkTW?羙7&dAL%*ՙTn R-0q!] ]WnEK?)B.4҂P\5$$3Lޛw32s{Wׂ~*Éܩ?NOy8V\2Vojm;֑8*)v g΂ω0kvF-ո*zI79<^ Ƣܪ??X-P("Wl#77ש+)R ʋ_#7W\{(㶵m]ٗ޺rc"7pPy|;o'Gyy_^I@b6j+sЯbmU>{Rm叛X*0;V Lbq N->թ?6t8dz^mcsznhpS^F7Thyu*a#FX.H6 Y J*Vo,>ƈB?㠪 C&-'#ff~bYM}$΍W鐣G*́ڲ^F o|u3 }"2ITwK3$qbfx"8ث{-{ D3@qt=1=>ѠBf@D Lo=j5`/JY!1|fDZYծbVXl9J^&=n;n[_ %IENDB`u1f44d_1f3fc.png000066400000000000000000000014721326020644600330700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkU?y$oҤIHGS: y3? 8*x2$2DĻp"NDJͭaS&YZt5yy]c7m}= h6"J !t[paҨՉ(k%UdBn4黔;K \+#jmhUD.M~zD_6A:C T>O0!H 2@>w Ofc]Q,iTm==S?7j/Gu7ˬU$Ri1wp  taj| xܻsP`cVr»oX6{Afyqf ˷& ~}?C/]!ޢDRL@6[\RXaᕔouf hn3M`U|ZM_=Q>(P]qќ{!z#{P;hsʊ:/Hz_zIENDB`u1f44d_1f3fe.png000066400000000000000000000014561326020644600330740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMh\Ufu4  uU )iC**M&d#⮸J  BB4hQ\*$3oyHfL6g|νJS2 ׋φfOLW ѩ śTNw^)8֫ؖϽTtaN-\8~EeoOpvvK\|cl4t|IT8Q4О }R.ht!gwc8}ïL/3ݮ*q\`|d{NS!ppDԥkׯw @xk@U^W'ǎykJc;o97$^_8"0Io/͕]T啵o9h;p(Ξ}mTJWZ;|\.BvM˿uFΟǹs#,wLXnɩ"U f[+3>9iIӔ􁡺(Zq{nTG @D h7Qo$q֣ĭot\z@X\V9S$G4.7wk{o XA4VU$[Af#qPUc*JZdE7zP|ڛ)SLy 0 ryZ 4D`8I8i>Kkk c (@.I Qܩ7?EI7[WDDqN^&Ξ-ڮsUa[u}dE?T؟M/~cμ*du/c ]_sOΈrlZ6{{+_p%WK.m= IENDB`u1f44e.png000066400000000000000000000014531326020644600321060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHku?;&c*(h=hJmJyW/"^z/=MCmUHmf33;d&f}}}!Ѭ>*:&/'fIqGȦ: V\>3?t%O}!k?$W,)@)t!U4e][S{u)QKeuF3$a e _7na@8_*T|t!*l,0 DSNXXfo|GA}Fd#ɷ{ߴgX:&/FJf" XšZMl-r~—kmOa9OnM뀾QAG $V>tG͐In[6TK6|uH=/Vr/_sIB@b?!23L R0B䁔盻PN;/%70e|hJcCUi6ZtC=wFeE'53ٔ`Ufq_|/S@&𶛭zMLuY>[qn(~XNDޕn8 Hp^4W7JD hM˞9@O+0K96.ж u``fcIxLg[2?{~vIENDB`u1f44e_1f3fb.png000066400000000000000000000014621326020644600330670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHk\UwL':mi"Zgq *΅(즈ܺAp}J)TYtb0SSc*1Kd&y3H'μ$=|w;W{H%iSh?6v\nb#[1pnAʊNE#|p6YcR ;1 0,e2 ob]Gy=Mhnn}o<6[@CEz"f㉙S{-3$й],L{1]Ggjvcpay6q0ruvvhnEΜN'PyQWV\$ t3OΉ<[wM1ւ?XB@tcj,^=auZD Dza?aDqeT)Y?}=hrtZoTeN8&0ƂDw2L@̈́gu2, bRd:^:j?Cq6 ]G\L&jUnͫ;zi ғchn>)5PDcЪ/:ӻ+Ks/ZI pa&ʫnnQ_t־.ŏkG|́tY;#a#+/րҹ;$ :rv%>(^xDT9da!F#9cCh૑:n5z33lEIENDB`u1f44e_1f3fc.png000066400000000000000000000015041326020644600330650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMh\e}ߝfIb&vQSEZTP $E7B*k7m@\t/nДvQ܊+Pf!b b̘ts :{g&s~ }/VN0Q0mhX[sr:m41w~I"]Y/"rx=woc|TW1ŁT%"$&6Nt+t) cx"[S&0baPraxxqSO7c~--B/8c yxrcl( ^ha滑Ã"$~>WV1Gu<4Jus kc@E Lay?H0:((u]XcAygtٸE/mX 3TN 7&Q$kqXzg 'Z B6C_ ?j?:|v^m̙ÁZȇ"ۛ(g8n~7)EnaW<CR ͽYm ,6ˋcU)+tubnG[} <*]U>8K41mtlv/)_b^zF_X/]U[}u&gޫtϞ/u9ݷz=&_3ޝGtn=`cxlNO{ZimA_Vgj%FvxIENDB`u1f44e_1f3fd.png000066400000000000000000000015101326020644600330630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOhTWf&/IU -gD RUqT$)n ?ApY"(tі n\ JL&I͌f2ytN|μD[~|{߽< lUtc~?̫OwR<'fZ5a[~m0C õyD@U%P+AtX:_)_dz1ȁnkuz|i L;^%Ef77GvI7ױ]r"̭dGNmzD5$aP)W}•.ű5'9tDdvxbۄ3Иk2hbz[Zk~qpG'}gz+xZS$M5AKo/(Mїּhk9jG;iUB;tܝw2Hyz(Eo˿a@n^B?w_+ 8;OF ;cʴNIENDB`u1f44e_1f3fe.png000066400000000000000000000014531326020644600330720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMhg}̽iVp]),Jt!-6Ppսu#Gm颴B? 4`7-i4ޫM2w;nre;wnsw8g.1ql@xn'R̖J+[Y5=[_ctn[qδT3ie|oguKģl\\`ldVQ xC11`S41"j܎!*?k{UqS.֭ 0"`F꺟]O<=fSs&Q£%O_%HgRᵳA`KՐFrhGTcy[v'G~k9  P]A`VD@=7-ja O\lKVC+ { &zI)l 1WoDbj=ڀپ<߁R2<_J D0J49 &`t\Q TSɛ3m-$CoaDx$?t|:2>|phrTEټ"3x5NW$Њ\Awds=ݸYﺦ|˜훢g6c#! ݋C;V|hkW2p%ɑ"*/YO! ogU,^fӘf˿Ә ?3Q3IU~{rydbbQcBxZIENDB`u1f44e_1f3ff.png000066400000000000000000000015331326020644600330720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOhu?lwljZ49Alk/zR` G1bSԂUD*u6M& ; }}E;4ohbOөR&͵?k=_⚎p+}(D%]^\Ԯd'ga̩/{w.ˬKq:mD[Ek`x*pseJ7ɶX.1|n015E:A|~juL=5p›Z x~2[/bN4j\+Ys۫sXkJ=F2 "@ x@R+Gax+G+q1d0U99BExK9ۋk n p: 4ؑFqAO Y(L|W7.b|m[q׬_FƼXR3~kzܹekH2Oobދowup?1XYmMNcn&LΎ*ݥY`))<0/Ø@ #YBK3N.PznП"rC _6a+ނIENDB`u1f44f.png000066400000000000000000000023051326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d|IDATHUMlvJJ5VjM &œML8xу $@JEaiKCwe;3;aO/EI M{-Y%>뽆f>$⾅VXWo#8^P蜥1sJIܒST~hv7>=x D}sMN\=x3SME6NdjcMJ%*NԦ(@A?bŎf^R%}_rNUٖp;82cyu\xCdfuŃ{]UW 8^@!T5phEvoePσ(l̈́PbfNgv@ x1m3%xc*r1WK/*`l;2o 'R>FU$@Ce݄ YSZZȫT!fmxr]Q-}4 zeSs"Xya]Y})ɂ |P%%Dк8i4"e4B398eH~ v̲RwgDoHSY`^Dƴ>>MQxc*D4`#m9̐)ւ`i椕/" Ztrr`cʾ"8bm洆PK| cJ> V(hWfd5#6"  /?c#+ƾAu+ qXfEU o\e"JɁ%>T`|+۴6?_ր6˩_fcrIENDB`u1f44f_1f3fb.png000066400000000000000000000023301326020644600330630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHUMlTUtoK`At 5V67uF `%HBnMB% H::PiΛ;.KiKy|wϽ>@WWס@ `r"Ȼ` RpxK8R]ћ,WV2GA-/) B~ B-M&x_:  v:EQzd=m-vundf܅ ix`"Q$k͡U U٦A~vMen8m? 6`nlfs"V%5/C1^,+:> PǾ^fAg&Q)8&"x Y#s}(ffQ)H{~:hP l8l1ً\r J›G6\3.pvȜU)R:TEI3M */ժ>pQv秦@ TtJju- aɧky9[תAEˋeK}dccW"vmsSEx$oVx賻R8?Fys`D' ~yT-nWTWE\;n؆OHuwve8LÑzGé׷8/WG \ 17=˫ 㬼Uoq aIENDB`u1f44f_1f3fc.png000066400000000000000000000023421326020644600330670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHT_lSu޻k_3# yAbbX+0L@ b!& SDD$!_%Q0E%1!A1wwsϕ 477r+H:L]%buXl]&-X#{ɇ6Bdt4{p8?VElGQ/Oggtuu 8(I҅V7gGG^;g? u@Q"---5x|͒ R'juww̟h@+@SY=ml۶Y4)w`eF~+uR=$Uf'O0o0.EkO;b|D  6㲑Ӄ$$P4Mݥ*NGB^"~s;#}}}BҔi %6ύ߽䯯JBxVфMdg5h_q,?TJdS;P\Qbdr,BЖPzVWAv8Lu~͌N|`6 -*ׄ,~`n{`fwBk (Чy*\N8UEÀfV6@${N=k`Pq`Wpi_n_%,ML*kk`0$Yeʤxu^"~Mg 6/>_aj( Aq8(嫫A~F7=/ qoBjv2Pv8d@+WD(YTւ- B*2c*= hA \`[WGJb;$F9so 쨀 B[%:x>Ǽ2K<a8vfp*yS#3,z@=L: grl ,Dn2 :@@vti&1CH`L#ZůG^EઆOʼE'XNXtn\A'c`XԶ{l^{}<^/1J$[Ln݁V/,k6̞^v^ג>X$u{==Gx.灵/웹 u&,}qml>tT'IENDB`u1f44f_1f3fd.png000066400000000000000000000023511326020644600330700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHU[lTU]<HZR:N}m?)Xg>gpX|ND555}}}xh4:7-c%Iv"9=>ny1i$R?(oҎ_+בH 1xO:;;.±z7]/(?Ic'.T[[;{?}oDwttt&~{KxuݴQuMD_X 4)Yi1O+'%nEgΞ~mwsd'Bv *]TΙNu|$1˴u8;K_MgrΚ(i;ӥW.\ fg\ݰ"C%!ODEeUt26ެ~$w@f.I꼺dzr Ӵ, (X恬HH%o"4|0OЏ8=_&r6o}!,`\_UC͙U:X \2<^a!5,*QOدpH"Ÿ3|.h^ñMs3A`H$nܤBC6k@EYCW,lC2748b.MS" 7Аșԙ-cVv(Ԕ9Г+ ."nin 0ö Y/aPM62 ;(v5 "AR,@J! > Y!.:|XA0 IyrMe+6 [|6Mrׁƕ;LnQz$T?۲J(+1vG⻂h/L%|2vؚ %;-%:uZ`}nPO(U3~EIMTuh볳].Ǹ0c-Kw}|xREc9{@e4=&c/d *qq Y,JwZyg>.ܽn˫=n/$G=Ϛ6SUYU "Fv?B`?LIENDB`u1f44f_1f3fe.png000066400000000000000000000022761326020644600330770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|duIDATHMlTUy3ofJK0*`/Eԅ iqaX0n\6$&I) Hb$Qj(ƙ{Jm{߹ܗ'1566Q__GGG=Զlٲڑq19LH&+5hfB< HQ"XXeYeN$QΜ9'7Z[[#쁁\UowC h!S2z?Xuz7DZ `JZ3yIN6NLxO>zN=:!Z6]!* `.>pO2;Rɪ6#&P9b9XpL+9ԱH(z?u s&~*CH]v8YJ3c~M|Gb}:hG6HɐuL$\'\W/xElSҌaaKJuB?x-[.'CiQdžJhKjFU7b 5@xQt0Qco8Xqs ZW `ǖpl %IAHg'[<'j*] IGB3 5 Я$kj)ϸ`-ay3/| .&gN]e/ݪjp4T믔 f6He<%ءr&rEE_ݛrn96@BԖ<Q\V|=:f 0dBcG߹NCҫZf bKF؃f@ T C}]_XtrnD@0Yb=^82x۶f% kUb꾯轓z~~'<Ӿip+0ܭcK7wܵ- 9R4a-=? | ;Eτֻ;_Ȕo3[Jصw&c Ktxa?,[*q/IENDB`u1f44f_1f3ff.png000066400000000000000000000024751326020644600331010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHU[le~]wc"`n2/LF#WHb0&0q مa@cdf<ā2];zX?/96>@{{.K ѵt:::zK~t5egBՇ{R_yJi\$EQ,5sų50L B^8tOO444-S\< ]sUPV?׳eOKMawڈ,˔RO@9$;|x<B0Əu 9Y>Bsryj{?|F_o/҆,wSQ|79;9duUW,+pWo D[`d*ިOP^xR v<&C+< 'y9KgkblY`6IP@:`bEʤ3VfUkK,F˜v%WƔ-"~erSWG,Y0 l.%&V$M5% 1 zlkw@? M;N` aab"c ;u \SUT:\8sWt6u,Ikj(!SoM)ӝR_G5z(z }qn!hz`]/T")7.Sv[y5l^eNö֓*jd6N%|#ȯ8FE*;qr~ h`4&޲mJPt~=Z-5XL88zWVc~IENDB`u1f450.png000066400000000000000000000013751326020644600320250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHk\e睹DJVJJa&jvU, vEuW-vaA*n u#Ev!bg&(!B@@\g=.ÙEڞͽyyy]9h,MW mSY/بU+k,M̞t߶ӹ$}m6O{5]E ◖,|[k-zr\8: |<x]/4wur=4MX1TU!x+@hJׁbbMvDmL4ڬf$y= ڲ2ZLTetD\'Cꃭ^MOP`MBx<x7jm#d4IwId{=@y $0v2O6rhS<50gvE6}O:Dyeޓ`_IA3 l'fݼ@oY#b;,Ժ"OWs9&#:KR8\壭rqNc`0Q^YH0N;|r> )]9]d${yB"˟vrw 7vd6hՊDŽX1^^07u2ϧHQexw?p` ^IENDB`u1f450_1f3fb.png000066400000000000000000000014061326020644600330010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkU?~3Ni G ]Xi)&"X h.ZхmBH-$J CgJ*N23"og.V{Vν<JqsLŽߪf%YR+iV3Yd#?IvLsZq4Uzd@W2UI k_`,!.`I穀;`%e{ʤ*oQ꣩!PE4Tx#~;@ư1 Lh*DzN{4lU)}@̣r &N ʠw 8ֹYcI"Hp6`ңh\_]Dc}B_#%lta~:Wl),Xy6,6.Iac-æns>ҏ.mvn5L`^}*7Fǁ.8>I>L"6g<,;f&V3/}q?+E& γa$0> q8wg։Foq?m[z(Y +]/gvDPH96 6thefEgCcsv`z7Q@gо}jDDR+J ~麾-ݾY)d2ɧnd^~oS7IENDB`u1f450_1f3fc.png000066400000000000000000000014071326020644600330030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMhU'⌉&!MB .bh,T(,х4S-)$D*DQTi4uyEgҙ!՞}{Ϲ=jhp paW ۪,Ԋv>fH(…S!VoOij1j D_nq G30_-v\zgЋ{.}v\l//)׀>DDFD/ GJc~K*@Px&4 $IKYE`-bCN%)~l!`PJvWS6{] `,i9yU!_CC1x}ʻ8nb<Ƨ~W'=40l >vchb86]~07PR G!^x*x:#NVTWL+ݕDALvyCV d Jg.=O^ݷ.'~meBۧ6y9EGnl=٨Ç77{oLLd|;R 6|}hm3^3Oz3]g Lo\IENDB`u1f450_1f3fd.png000066400000000000000000000014301326020644600330000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMhU4N!FPR"`?,i&X  MH&4cIiڮj]2c'Z\T7t!j$I ݄,Bk? ebg]̇3iu=;s߽L'f}6>ѻ N'Te3eTc+͏Z|6yz7RȰaL 3TH7&*9<"u`||k/O-3;nf=?rTwK} V}Xuum&nEځv6ol,rG P qF V |p\.sc>ѻB#{M,0V*tdk5~=Uw0nY,(+. 833i+ABXOQjCi{LsG>Cb Xߢ>T", D0|^H۞r IvEWe Bp9!'@E"DX~.CaM;N'cV23L7Z]wîjI  J'jjBPvjv˿T<㫈dW&NyTyŊ.щsɒQW~^ȈU. Tlab0g<\ى7lׄ5 ڇ>]܉q 1 |<IENDB`u1f450_1f3fe.png000066400000000000000000000014131326020644600330020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMhUʹ&!EciB*A3V1-XA$+՝FtaAZd&kQ7c n Bck?Hq:dQڳzsϽ 7Am<,gбgwoN*x>׊`,T' g3-JCN&.P(|jCd/׀e+>,ˡ0[.|mr.|eS{Ϲʎsdd`݅˩5=[ШO,?i(@-_]6YB&I^NS^;<ȮO2>[-lJm \T-H3IV[mbY@O[(hqa: }M]Ϳ 6ZCd e r%uziY} }$s⻟~7}0>2=!`ׅKÛ2cjM2nNvr>ΒW@t[Rp6vX чiZTe pe;9Yv+n7KsvG.ѳ9ӕ!RtsXNP/~9 p˟>ose=7UF;Kz+g]=>=M|b~>Yo k擏k _S{>D~ _/1pbrFx>gQ-륹o7v3,2IENDB`u1f450_1f3ff.png000066400000000000000000000014421326020644600330050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOlU}ҡ T `C f"76!!Wna *;] ! D2U66f$HJJ,f6MĭrVw=\xz2:@ᄆuwoP{2Zݫ֯Z#q3׼ҕGiopVʅʿ8\Wz3 '63uL{_ t;j=vo^ЛJEzL?UOߵ-Jed?!;Gvh˜ m#COWǟh4~; Tg|z-Mi10e۟M\? .<ƫ%`uժj>1 C{\3{>F5-&u,Xitt)Łxrclx` &fP>.\..X)A|GyraMrK!⠍NJiyhM 9?zn{k\9s/=<<'7c,LV*>;pYpVxt\0`?V, *_c~,6CaK sd#-ޡڵnpX1q'uc)if}}s|3xh(W|ܵT*ٚekrcgO 2: 0 Wgd2푦k-B:RB4 " oN 4B/F}N+Pȍ#5G9`aehX8M! @s9.0S$6GPc;_y2HV:mh ^Ѷg]،sqⴉL!(sQah?PbC^޽o-zGG.VCRq|[S,1]ٲN4 Z10 :j~31_Kl+IENDB`u1f452.png000066400000000000000000000013131326020644600320170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKa͌.:c aEBP,)#D-TT.-4BM 24k37 ͌7!2L˾xRu݅DF1pRj#)vZ;agJ yf[6T3c.Qo{ "%įx z-_ W%6mA˝֖m`_jURIZSX hx@ sc-ۉ]xͱE[PN$&ؾ2b& o}ar8;6(XSǧڎM@Uh8/K)=F~E'\|_낝klQ)S/@-5ؔl؟qMKsmñ[mOjC#GI`bƜDF OYNJu`rxFeP%*QU &&ru>*)gIENDB`u1f453.png000066400000000000000000000017621326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[L\U̍qda(B)R5Tjo Uꋍx`B>c4 >-PKK#5UjP@Na29g/_ ﬽[,$o#u$Nx2xa= \ylB}Yi?壍K(l#3Pi^rY=[_yp`|fXH2;}hۇ6Ĕg8:sLȞrw~l{a8miP#tp0I>6azZtf~<[ZMMQkeUvN+&19D0fY)u%wkN>'*$0(ZگC⧼2w%z$>)%y:A&!u>1pcHˆsIxᵉc`jOppe6UH((tuuvlb) Ơ{UV#/][wڝ( $\A!tRƙcV~'$FCkLcEMk!?n%>! ؕBww1efatWGRmEk{3i*O_}x1@Xb6#oN|%n4^Y}\]>5BI.q\'X7]%` |S՛&X.oVdȗ` ]ֹt-n{IENDB`u1f454.png000066400000000000000000000017761326020644600320360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_L\Eƿ33.@v& `R!my0_H,1$c5ZэT}>hMZZ++}Fm+fjh VZZtٽshZa:~̙3UX 7vCrzzc^lXaiQeD yoMC!vUY)| SXUVrѶ`(-ZAWcҢ3LpxEpX;d4l#$ݚn*lxy{G9=mpcBǤ??rogT%傣BPXĎu' *OT?*{L `߄ğ<<4;}ꏁp,1c(enJ! #v`VKgC,K;?d8SX$}>|z$v⥳i iÁ?Uk֦A=kMu 6;F*;".?E03ƢWҸ}a?#Q&MQGj8_4?!ߌ'f8y'2ٝ IXxY&o>R@7gWB2 :C^ jvPKHp-s3XD|҆3e]`Ïo=,粂qg`k6&Ϩ8W+]) ? + fpac~_K:L kR y]BP`- " UKy Y6Y\Y'@&#'m$(@H1b k}%/?` g@Ʃz^@ N Y/H$fԔuY%)s@bBbxH?)bNmq|FrQ84ϳdHD EF2 H]٤IENDB`u1f455.png000066400000000000000000000012701326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|doIDATHMHQsgImı2 *iѢ̀TVFhQQ -Z@""臢Pemb +Fc,q1frxr0CzqGhhQr@әc#]-{WhD*Ou+K`>窯C aGLfN7kPD|FJ@ ض-W5z<|}n:RІb*GJu2hmܳ]#AӬ/sppm b(wEkmI0v8ތMt$V:$u`5t BX(-)H+^Uպw>}~݅ 5G jĎ0y/y9}%- [<Ϊ| c91ʱG0Cs &:닺>W@jT*{ZT1bw2{x8d\`yC{=z<À( )*o y&vbCjb:rsg]"#UKա 0ǣ*C=Y;PTj/k2<~_ѰEAtјQI((TdToufī֙3&P|x=(-/l)gڍQ%WG5OLں5v_Ӂ[$TGf6δw0.gGz|S䕗^GH:bEEal2q2Q0G дm0"~Yy&ִkQ{h8?g"[]?ou{-< q7+]u@8 UUKp ǖ \WM݆ Bcĥ#MhfM=Z6_5kD^tDm< !,tfApHU9n$Ǎ?)||= qy?N){# wONv'{f>Z\bWO^]vN8>~eI\l?&5y{ɫ(!z:=0d=p'-y1zWosE쁡KqC#M޹{qpHcT_#͜qwg(d[,(Š$P+̓Abg2("A^SwTF/,C /.iq',("q)oq}47NzɡV8l{%X}1{".;J*:MRe'WƘY'8`tCyC-Qqc+;i\ dFT IENDB`u1f458.png000066400000000000000000000015371326020644600320350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHŕ]ke3j[DRcI^Iںx#7^q)VƢ D/QTDEB/4&H<Nj]$/3)Jf߸,WdxqAgz9p{tT"AXD]qsxmo?˩f1o[snd[>𼻣R*> ]SM&/*~]В{:r:]w&җV4`Nʕڙ՘U0hLJ^k6+ا;1 |%=vZVg+%j ^̗BTpK(MMKW"'^j'\zYI"Ey($&r\p:a8Ν tw۶=wy/yc &As@g\/ (20IENDB`u1f459.png000066400000000000000000000016101326020644600320260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d?IDATHKh\U߹;s8yLۆb)4 #()XHJ#5L}TA uSLu bA,؅(m]T(AMhg9.nGtfr;?{νPzZ2ZDc=-4Tɲem 1, xFDgk/OF7} uF$`Dk ֭`fQ\D"10I'c⼞&!b&gF5kvl((4t#VcMD߬`x-+1n[AY=}~R[s* {nDJ4IcK*Єj QAd/"Ww=5lY84sybUΟ G,3F^ˡKD;D$Ќy/j]vgmtWO b1߷.޷@[z w^s$u| lѝݨp5mR8M#<&9zt 7)bV ]GUcexr2ەNTU-╩&}R7-WЙ@6k@|ѥa% x-un*0eSF|ۀUY$1jj|s'lJ%bIߦt}AT]1 群SzG85}NM{UY΀tT貗.k8Zuɑ˂FH@_wA=TO|r6Khhl N\]"~aJz[;\rWlQ/ IENDB`u1f45a.png000066400000000000000000000015321326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlUy>[ô,5ݸhxĭqS4,DÂ&.\cع#q6.LiQQ񃠀}my ͽk̝J<{fF˝Oz//v@Un \0Y9XHCR_*'nTAyQ{M k۞^&?E\bΟAWH(2:Z0֞oOl1$K VDW< _})#'czՉvro0ntHTF௿ͥϡk?m:Ax|p=5,QRs$׺c I!:3DQO v'mBcSi"= [EE=IhC0T]TrUOMM*&^.Q=&00VxIQ. r6:$өg 2{HՊ}\޺ `/_gP T7!-=FXÅ""~gi53 nBNr,h kUkCr`1\9z5'$*(NWBWE JkXu^beVSrhJ,(H/@%$W"*rX}R9HuNNbGq =vG~0tᔞXJ-uN 'fg) 'Mv0T{oZ`:JڸH-ơhLa({vl*\o & lIENDB`u1f45b.png000066400000000000000000000013721326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕAhGo6͚4Ѥƀ(HbO=T"^ŃxQzGBE*XADV7&Uw՘aQZix{3f>tI`_ Om4rBzpo3ھ2[~~o$GlSIRkv#<8S:i/(65Ma}hZ,_do5vb 8]C7tEiw:xvÖ 4U,CG#8S:oRm4[uHY_ݥhk˽3>rcW,;>Hz*w?4=X<;DËK@aѓ_׫5z+ۋg վ ֞CY!gsxjM}_5sC'.޿'bdҽ|0eQ?è+drF3?~MT *fA pb hH/{yc @y U E™+rL2>¦I zn^zK Zv?%ڀ7F&_oڟւ5BEU]ux0жC*ȩrL=o?hhl_yǕ8ɉݿl}4]Q|IENDB`u1f45c.png000066400000000000000000000013511326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKHTa^m̦qTȡL4AVDd0r۴V*im"rP.,K{?遤VJi=-F^wOG WgSnZ.?U+s6i+ߠ nz)jZM@ qsGF*nlZg8dh*4z뻮FNŻu "V̺9'G2jz{Kg(e T A+@66 b jdO<~à0, "Cr1 (x4[piFcDa) U.0bc"Y0V֠l.-~ԧw 9Q4MmNr$x!c)t A_Qŷ<.P }*gz 6a[p@qplQpHyeͯʕ¹#.NH"7 yS^鑜c2woTO;|".wj}O\6F$o c,hG2mo\Hן{@èD=Lf> V/L@ sr!`!2b IENDB`u1f45d.png000066400000000000000000000020031326020644600320760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[LE3BVa[Kcش%M`FSER'IbēJAD6ڴ`$-Z R[R) [.eavHifΙ߹LΌ!Zg)Kۜ[C5TXl#*-苽 Ez`W'P Pic0N%.f8"f,X 6XYku<EJ<@"1`sys0"z+|+)mLY Uؙ3߃"40L:F t98uuz^GUs=)fn=!*=ӎ #tө[?t,K`/QԵ7>O^H,ٍko2 @#[;nt`הլ޸F v(Bb rm#Ϧ /GX$?J7/aݔ"oǹk 񳧅U;P7s-ށ>`_[*/&Mj@oYm)/.v}3j7KgZ1g#+鑭sލJK]Nt4i)|?wT3B]mh`[%Y MW^tt2Eb"M pÔUkAyJbIENDB`u1f45e.png000066400000000000000000000014761326020644600321140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH;lE3w{G~];&,D1p@6Ed iiI@THbp.&8NEnxP_⟀>x҈9d9z껙h_Јwa3|!f4Bxy>~ h޽ :,=JYR~E){_~]1F<7[Ǿ'm l-6>'rcKCeVV/X5pHLMkXfNlL(822K[wz:1?OҺK_qyjEV-.C;͏ TKմ}7zT7g~rgGg,W|O[N_@Уs6bDSDH}%dJXL %Q}{0>>1yq6ou>ɯ7K7(7X eW'4nP-48`}cLDD* ijU@ O+t{ýw׬4Џ]5͞vXeҨh j-,:ֲ}W׼s^ rf-&l)-X/v_W ő2ňe/Hе>`D@ޛJII N%]1ox1oC$ٻa?Aη[_w@eFkD Z:%誨)DI";aw$:#EyFt[,{3YQ(ޓψҺe5Zg[}Kz}rgO]]5Yߛ"Fel+FBv} _Iow9Һŕɑ#0yiTBtl剝Ol>h8B}n8,&.U1B*D\]@VJ:q帏~Ͷ^'?ccloQdtrVz硷FL UVg{w-n'^z.G"{ `ڣ.-CǢj@ k3D-E&z@=hvU}$IENDB`u1f461.png000066400000000000000000000016571326020644600320320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dfIDATHKle(eh;CK/ ma$&Dd 461ĸ0b Ҩ1xh04TL3E uPE-vy9y[=`@`<!z8!:{UPU51DFǗ@_^-8`lێm^'/ULX;zK9)IENDB`u1f462.png000066400000000000000000000014141326020644600320220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkTW3b0&"TRZ?AZXАtM"֍ # mt!ӕRWGKjjH&dy\H;\xscSOɞkǻ^a sW˝џiu69fTheWz3dӄmoTZ5EFۆj,=<8z9͛_M{D24/MkY. bR n%72m-rؓRF eV~/,4wk |:$w7_ X5*p@w yNn&=VOAO4B5˗zGòaN% 9V<; eo,h1; 9,>99Wv|kY _ uo$蕀FOiW(mwX×fǾq}3"HYӄꏈv3}@&KYK<ADnh&V`(;h+pg\^k̿,α3?qp!^u&^y196u =U)9 $!9zJ q,wVDه?GGp*/|e{@ o˩&=n4b}"DrۓaYs 2(+Gh/QZ'ǀ5!Exe}D& Cr"@e5o|]b~p1[Hֶ6wPh)oQh3/<@6 \CY+8fNյ凯~QvIENDB`u1f464.png000066400000000000000000000010111326020644600320150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHka?匹"H(4uE:ڭ k3SpPz"H[xVϡAPcgP^kv}>ssIJK|-~ UB1;(n gʫn[p׵;P4 QvzA-d).k!겱f 2~ 8A01="H v$ hP|1A(Eo; TY\tamܰ>ަv#yqos;)kQONʕդ&珺 {Y@2T2JVxcĝ5`|0>Wݤ=MVB< XUuKŋK C)ҟK!@?ըC Ipgj\! BepF#s%iX$IENDB`u1f465.png000066400000000000000000000012241326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dKIDATHOHTQبT& "(DB4h?H۴J#peҍ AF Mii%֛{Z֛y@;P,qjk5d҆L*y,/,bicIelH;˘z ҥ =/@HCw|^O69G [ H՚`M: iЧ>jBs~k^;P ~_Ӂڳ~2e{ B89D+"nv8 d nWc( ]tx(E'KL)_G[I "ZX"Tۋ_6E+6c_u<,IENDB`u1f466.png000066400000000000000000000016511326020644600320310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d`IDATH[hegfvdM %E5ZjMJ] _uE Z(B)Zh,6tlewf{nFw7nrJwQF%V~K/rVX$9- w>'[+$1f3o| KA_8}L}ڨ_rڼ\3fX舊uH0L8I''//#/L9gh E/M[Z~o1Q7P( sYsBYS(ϫڜElUS;?bX]|ݝ o w\ǽ6> `6g򱭳͋]8PEfwqBXL)rm5> 4HϛHBš#j77G͗tPqwjy'Pپ%_7V~hzS EQ+T9m қ!ک"#˨ -]疽WT[Ե͸ OaI_3qS_/a3xIENDB`u1f466_1f3fb.png000066400000000000000000000016651326020644600330170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dlIDATH]lSe9iW}Ll\1JY A0 ވhBxQ/˜cLPb"ob1bH^)ﬣkbll|O #Ptʎ=+ѝs}9 ݪ#3^wD֏-qE_fn#@LIENDB`u1f466_1f3fc.png000066400000000000000000000016071326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d>IDATHMh\U7L^&q2i6B-n*J، .L .tՕFW.*VW .&`UhlP]?0։L:/;.&3Lf~YwϽ=w&sr5}Ĩ )l/fPAE'.8͎/ޒ*{UWQnp?P^?zSgr x{pHs߾\jpx1v74z` o4.#8s{ 6&kyyC1sKQ){58%#{`b2_(T*B^2Z~AkO'#!s]ĽBAyBZ\s+sf s9{E@(D!j\tbn/߽]N}_NAGV/9;Zh|>ppQhVGM_/=d-`æ"oTSm|u n`" -D)=2 hP:#ozuѽ):'IE1ZQL*cx;wmc[㇟fʽJ;SR$`]rlCv0;ؖ!hJH&H&cŽuq|b/HGҸ|¹)nz:+sSΗؖMHǜD+mhcu5H3 ,({}Ts}eԦx]"F9"XFAJ1ZsEyxӑg'7_QpL B5홅o>W1oTQ (9Gw8n)G׍IENDB`u1f466_1f3fe.png000066400000000000000000000015611326020644600330150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d(IDATHMh\Uܟ;3I&̴DI$u+Z R[BA\(("[(nPW- 8Hb)4HiL󹘟NgƖ{wCn8O*LÍ%~5VDsg[5c_@mTG(rAݹ/} x|ʉ-;qZ/ŵ42f-סM%ze}}Nݮ>4o%8z)poǠ 1?FmpZQxz4c.;z`_eP](֢buv=#SqOqoؓ D45L.:}a{rg=|IGHqN;x 7\^l%(61% dbLsgoqDnVuD6D.F 1~:r`ɄV{W rσ}g+˛ǎp7L2pYw "E a^59Q+w zR/Ȧk$rxSӉJM o|a :!K*)K* S tpo ?V -k841Pp}pnevsejlwcw"}+RM7րJ+=s|G+rnhfABQ|͓^==ſ/IENDB`u1f466_1f3ff.png000066400000000000000000000016271326020644600330210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dNIDATHOh#U?LɟI&MF)4{E\]TAOA8[5G+o3,ͫkk+dmOO΋˛5XXX67SS%31: <_azݨU*ǔ?0hިCRWz/r!Z/VGTUppkd:D8AJaA9Ra\ǘ/x~BCJf숁z¦J)QMuTR ) fG̕\,FXYѣV$9h6lTg0DL!RLC.5cd5{G܎ tWZf{\MsO4Ηmp}k檤6.Q CM4宥%*lL(J&к`wKFcј!G-r83 A@Rh RJN7$Jnwn6km*^zwvĺd~@c}#"i Kx~7&4ڎFjwh8NIli;#yg>.♯Gz7\^m@wgu 𬄤w?;0l妃^4:\@&O84[e -g>;h!.vԱ{?ӞqcQ(R-oO o;7Z3ԣ/g`xkR F[Z1m"F`ܧ0 s?sܸ6}ׁ8_hlԝv!A@=zwGOOە_~jA&l$=S>)4,@4A0cuvͮ*pݐcΛ"O%[Բ3g %s5;o>judN>4n<q3d8m!PiK76j^XlI""ga;YCZ?x,`oV͠ !`hL畏+hړ+ {q`[l35phLuzV0#" L8(Dr͚*}],_%:bgcI8fLJ LlHPX!O<_,)=yٚq<<UY +lm"ݶ~ܱ51]Ҹ2eep0g85v3 wdcm]sVohf\ [TS/ 9Q@0$/==G}U(e r0d"odB)ᓯKy=FņA}uMI>y=FB+RximLwqV#cV7x<{n^ HZag;v_A_`5*B՜nnCE7;0X5-KuiD ۋ6]k|Npbj91<X7VeI5Y&1Fhֻ۴$[jQew4kRMKD)֤$qB/-?v"4SM^-1%g[)"}pbߎB}xo}?z uPG'3_Xq 1é+?JB3aˍMaALERG)UMMJ 735lՐrNiB((fǑؚRNP?R gZ3Sv[-1 @jv%٬ !?xECQBa0}5|媋+r:V!ڻ9Ok422*Gd3r:hxpz钺`E.DNU6?F1 @^n6ՈyE}NcYvG@.@$Cwl:˞Xf3tMFtWo'6g#ƺ%lt%NgR/d="M^GJJ65+q۝EE;$H]0{qёn ]s(eIENDB`u1f467_1f3fc.png000066400000000000000000000020031326020644600330040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[h\ULdd.I4hꓚx(P)#jA蓊PZ<BAhV,ERhji 6J*Kc4N2$sf9ˇd&ԢZ{ 1J? N A 8gt}μ'nqpXJQϕBV51`*‹qvǓOܣxAGS{}ͯ2o`fx혟.2Ņc'KZ`"v[ǮPRP e/] [l/ [ڵWTk0oh #_U<z:0,"\8N4T7TByCLLegNj8#2N+@0 7UPjiu~ooqRۤb;zIM)hil@g}{k[mέq(+ȆX:G.'+hLWP 3<^9{yYSg8xѱ$V \@}3_( {[i*4sB>o͵f6VDYċi%GmǮ2v5Gٳyb ^SІVZmf(m[Jɔ8j_AwAqݾ8[ǶH%Dhõm6s϶QJhoo[ȂD265!gYTkԘ//,2͈K6dٙzx\1H¦ W+ Ɂ;i7%1oٳsnW6w(N>8*׽dph6G@|lW6{(*]Tg6U#r!YhM "P_0TInl!%fGf J"t2LŬi@W@4v>^p<#a,Œ9n:)=HNHj*oc[#45x*xU4kG &eۖ.T-M<ԣ|?NsV uA&'2 t*Ӳ:0L Ke( Na P3M;(ZM+iy*M% 9}OXNR,- yzSJ&M 0Ї5HN*Q/ Su{IENDB`u1f467_1f3fe.png000066400000000000000000000017211326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTUo0 CK Xll+ʄPcqeҕq0.tca"n41iHL EkI, )RXڑ y7~Y!Yw?6OL.7$0, )䪂s*w z`߈AF!9|p~6Oכ0f66Sn[`t/\|MeJV ኮO:9n%t5A0kjI@L -FC_d2[ G`^fVU EN;"'!ܵ `j%Z qv9W  "WX y#'W*:0z<Xkꭑh 퍓h?Hʷ,|{űݓP_`09jOE5im@ e2oT[Lk 6D"Q"([518w 9h͞ [* @ԉ,=pbS*oj~#25%R\^e<zzzs@&y\Z;dx6-l?zym{wߛ\8F'4oSk/6|?0ܘ̙K@@)IAD.֖V?yڔ1o~Ér{׿;O?<2/`(c!V嵏_V?\Z_,E JМIENDB`u1f468.png000066400000000000000000000015161326020644600320330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOhTWh(Fl*F&RPD -⮔Tmq\t,n\v!.L%U; ĺhDkmD:ɌfޛyBt&otbZ}߽=sChڍ *i4ŸdLz/eph׍1I8oޱ3?𮁷|e]V7{FKc7k-)Ym;gGGk;hqMΡZJs`ϠTFDGى5Oem8#8;XDp)J% ǵp b!!3 ɤҸ^8dž}t,My ʴYƳ!ZhĒTJ/HMX圫+6ݯ|Z-06ƹ++[7G<*uʼnUXWi[ӷ:v~U1;%1w9A6;Pwdsf়۫jc4P6+;v@|n"鹐Ao[{ퟩrv,p.CDL5bKtr=r~F Q=uB iFBh"h .֊ {lk؉e؉e<,DylB+Z Ɇ׽RqNĩ<] G?wLt# 2c~~v+4MXj1!?Y~tL9&/]I'|[+iP7M^c/- =?kSL6xx&qIENDB`u1f468_1f3fb.png000066400000000000000000000015371326020644600330170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOh\E?3/o7//$)I[ۦljB$jQIVQxAzPM4H`*J]4iJ)lm3^}k7{~̼yYnd2f(WhxX j! F&.^&@"XoJ!Zuwt"^ЛHlBWkFI9J &Ӝ@k u9亽秦r!g-|,Z֛F@q}Ud-t? 梵./n ,OW52Cf'?}Ð./)E cۍV#-Qcaqiuglo}]K+G ")۵r<`E+R+wWes}8%<#;B8dVxRh-ݘm rz4S)T5~Iq!3Mz2Xqzr 93NiCk)^70CwkSG;`ߵhE2PwdoOm_:׹37b*PՁZsg*$r$й ej6eHmyxP :?rVdGy+G~ޭn]k 4üKp?F7/+NF 3Rp[*}e<=]/0zU*3IENDB`u1f468_1f3fb_200d_1f33e.png000066400000000000000000000025201326020644600344360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHilTe;3t֙U q1HQ QR`Y@(D0*PJ SJ2i;ӡYvҙ{'B$Tӄ +ڧx!>(DK&W]VđH{V,$â?TXjq R#yG.Dގ}#U\&eTʶ ZL[pxJ\ihr\ iOüo JI#tlJf 4Heh4BrGfRoXtZb?qR-n̥x aO?GhhG Oi1A`t59}{F "etx3lCc{8=4o~7j+lMF'룹U sܲM3X9eYhEŜ2{:n @ L:i~fJ +Rv{̒"6m Ur-urT,?dyD:hra{o0}'x]6 - +~R*Jwt16Z@gpN8r U=N [eש[:qc*%?,ԹL/)Zc)պj{E+FjiDŽDBp;#_)%g[t93̥ XPR/\&~VŜh,#~Xq"0L"yy=\7?szXRT2 d2,iFہ<̙3B$**r v-y @]]")eaVuu5H)iii! i|Ϭ(L5%8҈98qq u!x0 CbGAook43fo~oŊQDsayMMM R)Zy4ڊaL.H/) |oÆ@gSSReuѣGȒ@WWW^"2WBx}y(fƌ‡ÙUʼnTgjbQ<tv:,<w.q\cMxnϦ\odl0hQ8qd2Ž{[@Cqb(hGY9>zM!nOO(AJtcR-D]z KIENDB`u1f468_1f3fb_200d_1f393.png000066400000000000000000000020011326020644600343540ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoHU?yUn6ln6uzekЋHb2W2EAԛ )EE{ zwy{Ώs9000`4:"G!hՂik,7GFF7+uSvP8`p ؍D"P(gf0U0(*R(eml;cۑm߉ ;bZ2W UƺgV N:-ސrt68 øn0 -KZ2MXkJQ`YxLMpbPRڒYa ^o0%Iew|8g!LWí٤Rߠ16BaBۑ(iRTWe"_͹{``~|ouRl8`NW!Ї*:Ĺ(RCkK&kg^9}\? o7OَƸ|eH4Ɖ9z ]drCV{ˊN֝3|uJښ1d;:7P1R.`sje>xU,3[>GoD>g7և Nr9Gd|kbޒx7-b1B l~#\*ɿW_3][n:9oK1 .巓:ЛK!_8E72UHCQ-!u]P[[d~~/׷(KGu33o5S*69ǤGtN[%z[Uי b{\6~8FRJ¤ڗK?߸ȝ|,81rkدTux~F߫ *se&=JuMtމYx6mC%;p#bzR/u8"-C˔ʈ ?>~pGPe6MEQL_j}vW %nO츸yji˰pDDk95k֒SMTuQeP7#lo)Jԩ50C}rXfX!ݭJ]%*..|`zzzFXXSyG@>!XچCnWclq? V5~vlhhHӴ}ݐN_vIc_YӃ"GOKMg e(B1x()))ܒkFZWWWpSJyg _'gL;g:7*~ 1Dh색 Vi$,$TP.B"PJe3e:l4mJz:k.gS'*!]6iF sT644`ߟcJ50gsu{h)Sxu@,'^7PWBLWVIQaQQQH ґWƲt`$@wDo͊) ӎ~% B>/$o6HXVӁajyrqw5u}7ww_ZQ3Zhϛeu|>~<h7D)y)z##"%f=<;Kֶ U\k ]&;VT23oSl>m`K2[AoAK[Gϸ HUkG ]gIo<=mMӎ*#M@~R7vlii8G *V|+ffo|׻t(,21Q;.Y9DJrp$JeUmɽ8hX]~ډD_红E̋NGhL[][zlX\N}[$!zULx<PXXxsMgz[O~9~?24Ccz[2޸N8`]n>OVރW>z6G+OǺEG)E[Eɯ:Ts=IENDB`u1f468_1f3fb_200d_1f3eb.png000066400000000000000000000023051326020644600345160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d|IDATHYlTeߝ;[ӖvJFJh1,XT5h b"`H4>h0$(DZ*Bb)lt~>43L}9;YJiRVU@ևJkA Yy٠(fG@zXmtg6DK>2& cã#ACX֡^~2 1~l/  N`]&$&P<COP'0X);EBc뇤$94?ϏjQ[INrΦϹx渢BJd, IMry&%:1$L+fnI!o@Q^׋e@[D`Tm仜<[OMbً ut>ٺ938/PS](1Z ]UK[m=xtVii@cKw0+_!6DGRr!ٲi=9v e8v^3μBNqSEtૠ}gs0pl6wX>Mv"Nf r3iVnxLjAB)K85y8Odfqwaވɾx.W)pEvx98+q k>Oŵ30$lA\gZ!@`E&h4ue <v- ºO  nթf3#, EQqC&*b4פ5sS20S˦wwu7G5aUE΢C\ڐ>aY_4/-e-F6R \EL"[jwVF4tRʍIR xlw;ӣW;YU$T)Ğ{.v7~V$W2P%Ѻ 86 r 1'wy*/{?9gSc'NwO/(%VM1+mbڢb{)NIENDB`u1f468_1f3fb_200d_1f3ed.png000066400000000000000000000026431326020644600345250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dZIDATHklTsvڻ $Plrs B(?D( UEU$-)jJ#r!B) M !Ʀ®~Ι(k|fw{f _6> Y^<l~]#b-|~;ڏ. 1za#^_<,R.e[>G''NUW/<0?Kg+sّW^꾛IuzedbU<+Vr[[WQ[ U,R <6)Tjdpa.&L&eZ$?/Tg'&A ]lKJ8>?m;L%r} &Lm#$ )T* pb" `& g4a東mRQi~vI!C]31τ` z3[?kßs~?<^t]bL O0 npsol]U ܆AI4.wnp)²y%3f1oN J) ZDt9IM?åKΟndl[ZKɔ< 睒DIjNtJK].ùg"y}yyy.)_m㑥ծYV|7_y/ ƅ:(Ιԛ^7ksvT;4myI͢ik`ҖZĈo6@< wO<]TI>$!a,)>hhQݿy1*8~?mlVQv8P+h?iVH+jH;P=jrrZ p[})/ہPMy%4 AeX9[ Pu_)&ao t{l;r3q)6(VJ zף>QN8w1pYår{:%i^dX2s}e~J84Nf qy"wqݞE=#qδ{z%IENDB`u1f468_1f3fb_200d_1f4bb.png000066400000000000000000000020541326020644600345150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoTU7ocJ66R4`XT .JF&4!D|cAM y.^8l^߹skgi[%i$]bhbBCZ6ۂ%}?[EL!TEQhaF!^]k¯y2JZw!]l@3,hd}K+nzq~nk$n2@ȺDS1AwU;_j^%T jB>2 4"93 S`i l1# I6$HQE=C[hMͼBJGS(½b:ܬKєϔ(:GvP,UZN>;rKA}(R T}ZI{bAĵY\a2e~<+WEG"\| /-Pq|MAx3cWٳk!ZqEb}=";Ҩ&YM緝9l``>vn~*a .Dz@( gfpqez&2zFg5M…b6$%'bgW܍PI @Z F4[\8Z~w ־6#{A>zn%Ӈ?Yڒ@ZT}xR[k?B a|NIkOÑX_1qdKr#30,%PtVgj/3ps}5*p=~7hFt.\~\(w#ǜ {%Oq/Ӵ1zuaؐFTI\4f흇`ʆn D9hGI?)ջjM[R)h>p@4Kku/凛(i(IENDB`u1f468_1f3fb_200d_1f4bc.png000066400000000000000000000017341326020644600345220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHT_lSe{ooޮڭ+3P UKd$$[2}D1E1$V41A?qO(a`Q +n[n|h6vmKz{ͯ۷,8]K}XPZ29͛:x N@{iQ`PU 9_={pWBj|s]8wqAlbjG_ ݦ|7Esr,)ڒZe=~66uX"Uʍ/ ?(@3[']g۱!5:m;N+n;7%9xf2D055Tc{[Ȫ*$ A#PAL~m)_#+kHCE0]G$:K NlYU $odJ~>@Oe߳pΤS`zn4/##Uc {x0f?PmRtض 5őkS "Y.bAaHXFM- Sms& $dL7n?ؚIENDB`u1f468_1f3fb_200d_1f527.png000066400000000000000000000022261326020644600343640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dMIDATHklUwv>ZJ ՂM_lh!4XAhb@ J0%|m$RH!A( @hAJݖG.Bwٙv7,\L<{wΙ;w6񰍊UU O qGBH0<X P^^ )5+AS0cߊ~ƧQ\ y̙} RuNSwZ*U 1/M0cWD|I G橉]i'7Oh?>;wNk_9D&S*Dey鿖mVD,1Ҧryv}^=ܛ7^/xY֬jlhw7MfLDbcYld4Oƒ>տ* {O*SmKޣ)?.\b?p ѼW"9XMLE.߱Ïsr~r~1".m=n%eq\9uuaO~e_%f;JyA)u'E8wq$Y2}- rsjx/KА{F9x8+_wD?'PV)e j7j\p ow`ߑ&23ڤK35Ăi4F[zd?Cΰz`Cl"Y(ޔ:)VnbWnKĸnξy[v nP8bkH/:ךXWSälO[[Բ8u{sttM=vzV Wj45-dR32߸%F&L+7Vf\J(nJw+bX,m+P2ZT~pQdI[ PiY'o=%\Xra46q{nmNA1qM(ѓإ-²,HUPrUۘo-^()F,IQ/hWxHM0T%U4ADmbxIB&&&%hL`AH EBBY޽{ tm&999glb%cE~\  sOMo\<&gR.* ϬɨUXvT%fUo~*)@lVZ+}WͥwC"^Қ_D)0l 3crzO3W"_ٻ4RyX 39s0=YZhiiΪ^J0dCsQQnG~1?S 45qssZ![Lަ&v,nd 1IsVl7F67I67ɭ;AVZM`ڙnXr,Z F:;6's@Lߺ\ 8@Eyie_k*fU@,8Y^O.l5޼41iҾǂscC+ Xf;5nd|uP)?݅cW|,-I/W?SJIO-Ok{K}׋0<o=^/;$NkUk&;i[0#'=Fkb(0Rd2=B٬mprC)'_SBT*5pz[b ?d.oa 3İ{]׽N9d4eԪx} q)hYSZ}6C*VKwz<{;ǩɻWkՏ[$ y9.X|9OƽRЭH4Z]u L-Hi`a&͎RRhqfR7`!|d?V$L/zŖrh eK}Q!IENDB`u1f468_1f3fb_200d_1f680.png000066400000000000000000000026311326020644600343640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dPIDATH]lSoΗm$vH|5JH@A% j i"zYU/MiV.EUuIccxR:rhqk'?9E/4s>Wvw`BQ,T*L&\vՋo ?ս{nH$J333o\zgťg9/\G^۹s8aj$y%ݻw[ܾ}_[nifXu]% 6r*wyĉ)!ĿGGGfB>}4ɓ'kQݻLOOJ=PC322\j9p_ hR, !z R2] ٳtuuQT\mQUرc)4͖Ǐ Jq%(͛7UI~ IS*\rr7Zruߔ$cؘ#Gse4bUQ7a`Vvl"K(*|(sJ%ljD"ܸqi<|f`$I=o{jg|vvl6h (_!xyw.|^BėOK%|݃=XBߧfgg"It7ܷjO> u]?Xb}~|/=:Ԃ뺥X,%ae3ؿ E1t;ik5<׮DQdjw̑3K!S $I뺵x*Grkvu}b_V煁Fl>fT,[2S?bT5b*HSzFbd \;@v#^3@#D`sp,cccJ0999Aq>U~5cg7 2MO>LL !B044CCl*P\%ɬm5 ٶ_>x fq]Xir9fffkkkhPC0< d2i<dI,`&|˲Btttຮdr̙ !bbbBz[XX3 m|>iT&5:l)?۵k(B0l"2iګ<77V{{;~Vr]]]<ؼqr r_9x Ű,\.|>t\T&>h0 OM$BRAF) H5F۽B鲥x9d#~/**Kqܱ7[ i|*|ga\Ł%SUKah#G0c!/]ni;ziS+J? XhXgYdf-ȳ}_ȧ Ζ+/} Q!0LpFFqI^~dIurnnp_gn[Q‘Go#y8JNwoa8KP ) cM9 4aAF&蹣OJ E̙DҡD| wXsZ"bTͩ! b 1 a`F %єsuL>I%˅vRJ}UHK Q1 o(H&_sY\,̋H]gx D(d D0鴓rq;h i ^nmX4T`(ut$HVUCh wX>|% 'g~I='/`#Ca\NG>T$DUmtvp1~0~0/.[H x{'D"K8g|B<MKM{iRq9vXfʜ'FZn0r}3 N]Et~֛]NRSRw];݋ދ]dCѱvZ!FXM~{+C $Ս{ ? ;÷<ɮo ?_tXIY~0|LW}Ӳaw>2\Skt qVT8C t-<^FԉA $u`A$Go݊&HP*JgJ/js\8nbf!ŏ ~kȇi찇 FDn²g5 ,K,b|tP,@i!0G-.@Ǻ'}&8:3?*/rsIENDB`u1f468_1f3fb_200d_2695.png000066400000000000000000000017361326020644600342320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_L[UπZh)EL2u%i13q͘L&&lLc"2b4ÌcFA{X4qJ4A7t,E\KKZww΁yKùE)` P,ARvD !^Rz3߲xη*A494,ȇ]]W,DJ !25dȯ_ @t)  8V2m}>[Y+,<.hOkEiۨu}ۻ-mΥ}wdSu1Cn(R{kRKݤrOGfS}A_^孓2w>:o"_dh;vn=gֆ**6[pjz?بMŅ>ܮlDbƕWws=Og&Gp R)j8_rQp9 \KqU1q1"ili!͎]_el4Ծ Snjz)VάkzYl}y]SΔ~ ?ԔT-_{?5ا;o 'z؉{v?|*,hZM#M4Fx>_Dz,Cn?1>>~\vDBRWW^lॆ\]ƽƆ.x;hNA/+&HJJĜb"=5G>+.Y0ͻ8fF~\{a'dga"My9X-Ydgl";3W(ȵ`Co8.d"Hy"m+iR{;~EHBSORW]U; ˸F'x2;G8h~ye}Q=8qH%,[Ciy q,u}7 9*^f ]pkx2HxLMG c*?#̷PE`]INJ[Y6`0D]u)EKn D,!$$s,m纨(ˣ`l)@UD` E(SSSXm|2SɳZJO_@/ظ]WL |yALaD(5 vjrytsEN/"..ߜW_DBom%rh.^馳/v65hBEpVb"=1݂Mv'fr4 -'Fxa@EQȟAֵ18ܾ3P">Ah\ (xL_Klo<2g, @r$JH(H'Ӳ$UZ;TiS/mX]eIENDB`u1f468_1f3fb_200d_2708.png000066400000000000000000000023001326020644600342110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dwIDATH]lSejOdd 6֝ #/ ̐L07!ΘHAML1$ J u0dj1sYOzA6<뼂e,ǩw]VJY"7r"qŲ@u&t^R&EFӴO:;;o/H$ Po. 2<`z$o_} 藴&<$t/s2DѭRʳ@=(&LH\hMjr\ѦeZղ~`躎묭p:.s?ôMXU74M|>>I;D9ԤD:mۤR1uRJ*[@iJ}#9)lGES%*)dUn ғs4]#3!˲jUElɕ?CJΆ!@JeËp8ESg.gBTE9{k+[CО3 vJذֿ HJx ˪!9p$ \*$_PvWp#1*W:#3'3$~Kݹ=6ܿՎy)bC]>zW>L0qkRc4l_a@;xݿr]M1$P"t#%EjPJ]m ̴!K?fw\o)c X+FSY`&KW.@f2˹ΙRbi7i3d# 5 qN57oYEvժGG:o?ǒRJ?#9xG0E;QR#Yb-e5>QF{Jw,++QUUN8.^g@$,|>:l .PqzCJ111LNNVd}ZkYX,Rl4PwttzL>jv<`>h8n\Rgtd2I<g||x !^)‹<IENDB`u1f468_1f3fc.png000066400000000000000000000014711326020644600330150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]hUolwI`d׊B^YD^xzDDhI^h.D1PE)BHvI %vٝ9Yw;k~}a`{7Ò&'GV Z4YR Vn 0˻/|OWw" \7<,n<ҰZ}wѼb} 7}x`fWGƆ>o4j7:fhGFESG2v+ZAlp[ׄ랉*qw`mkCFF*c8N ?j7swGs7Ui?~EQhTSVjdOnz]LKe>j`e5x+4];frn$8y.}@6leW+ט)/rיV c"ˈ+r3]@d3iC0c?u+rw$:Dd=jX.ZBebT c(J2T-ˋK,/.uݎk~#@ juW"?Kg^ jKc|E>@7>=?jM{)X޶ yЩ7p(n5f//op=(?&?SrU@DQT/yQkZo-/IENDB`u1f468_1f3fc_200d_1f33e.png000066400000000000000000000024541326020644600344450ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHTklSe~ڞ]Aԍ@fdu1jho`$ rYP#pc0]NN톼}{߼SQQM ,舰xA&~pVp7(YG_z|d$j+IiFC+, `>7$hq;2|pNצ%*Vm e&$"Sd`FfcO<Ib(88gc!@PT œS"(? Zy/HNRb)86nVN4) k]׮aW1Ֆz|^@e5Վyڙ/ qi"m2-\ @(e1FB5#W.H<}wD9ɰ3j2-P28i1oL@/BgQ+][jd$b7߆Fnb\ӣM'L^$$TIlG0v?. "ycDZ%aE" K?,-FH`XU+26u(U~=[ter5>r-g> S7sѤlFPZlS}>x{dӣ<]gwV4[čgbZD6H7 CEp|'ůGؽM1[@OYGFֳ͌hUUPz9< bLWsj6wb~\ug H3c#0Ȣui`UG.tRP"ɲ+<]pe(]^~H9{:Y@$(f;Udv'D(gxb[]_^P ?(_ly~NoY>7G|R w[♲ō15 \0tP"`(o\zr|~{缯 !:;U_o)})״aɛmsNYB 3Ћe5ݻD&<&dy5/ոdي5\F{g;fh38yNV$i#\v 5mwZ@0 pzfx(YzRE W'eBx"A D LfP*]q_QYGIENDB`u1f468_1f3fc_200d_1f373.png000066400000000000000000000023751326020644600343710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHYlU~,]A@,()""$UJe&J )/bҤchMLPI B ZBK;]f:lr}:Ews ƣ٧Z Eo$$0P(uoߔC{RܣhlEk/-힞---+@'R.]]鎳?F*)lu]4C{`D<X`H(yXE2z`Nc?0Min=w$S)%mJmu<h@:abZ&d(S7m_ aYa%RJ\q80D~5;iڻ3֗>}/WLiySΑJdKޙI$d]RJLS^VϘKʉbK q͈Oh8"/|nCv`\I}Bz|nskjSTVHD( >.pl"yfk˖-Y-N@B~gڧnct !|kQLzbiuuP(U^^ި B竪QCK 3O):oy!H5_xmϑgaVZP6 7AOoO|fA왻q"idprfϞb@LeʕY#JN񋻿*R^4(//g۶mH)% X%xԣחpgިg OֆB*`|>4MSccc=?s8+u~i:#&)OKM_k&jjj{M`5mnn.V `c dxxN֭+;WSSukJ'D-Hmv\}aPP?=mK\iLr׷feQc~nΎe/Ld>>MنW:o6<0>5%y Xx?sd2Ed8 JC"<ˌ^@!fǓ;0d[p/]z)R2Ͽ=ZZWIENDB`u1f468_1f3fc_200d_1f393.png000066400000000000000000000020171326020644600343640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHO\U{s@,!8Mkl(S$jhcLAcLlӼ'hCxj1lhRBkN3m\e0g{:goo-a_2< I:N3J0 Ŕ3=000]/Q O>Tda \w:Y]]>HbE.e2iw 5M#vVGi"m璛6wKc' BJ) @lR`Ev&0}pr7Nt7|ݵhnMP3BYec"_p0tIgc n#?{B K!n]`肆c B: \}7[ ]jqc^ҍ,5 A֔nk8R6rB":R'g[;*ǩOc{ {Po6E 6FXO͢tڛ~D4tn:02ˉe5揩Y,!oXCBM.VHs.6eS9~Xn q p$# o0Q7_loȫ<N(Bϗq 1ױɤ60zz;҇_{qy.]+rn'XN=$+k@g/},LTz?繵i+r;x<-*OƗ@G:r׋){lOOG.hjcCG\L?|5144Rx-HrpU`!599iS`TJ9*R,/sXʓ=!5bXis@GnWb.DFm9RJE@!DU#\uIENDB`u1f468_1f3fc_200d_1f3a4.png000066400000000000000000000023361326020644600344410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTU}Ι˙N-B*ŶD m5ME!"MC/0QTL`MMmJB@.R-HiisBqe?{p~lۖjJvۣ]L~q-  D>@n mG#s 5B`wզfMzh )e3/ILCjOm9yOI!図M ֞dP6䷎@>6k CN| >E(D &hՈWK'fzJኘr#c7j+EλM/>cac9)"e4Ioy.-9ŗS.sHC|y c4NwB(x I_rr_>#AP-} X毫]z'< ST{!2:a!^S]]ݐ}tqIIɧ@`ѥK2z. }ᛃo: jv4 !dH/39H{&OJy 7709` ĤgٱlxpxoK*-0OtNge [BԀ\-mI)577(V\+4 uup$Ba_YY:Y?Ry qUuvG#^_DzODY֯ܨ*RJ.شc$l)nY65qӫUU]CQ 1g[|Xp8: aAϝ$"su`]XwسQLFI$4)e/T!Lu#猦qjzn|2if4:4.?R[-IENDB`u1f468_1f3fc_200d_1f3a8.png000066400000000000000000000021211326020644600344350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH}hu?mnNc,E/,`|AR Ea(f.*Ô)ZyԩmmvݷG޵6B9ss6WܯFQjZAo/|{[{]Փ|ׇklyKcVO3 0+dSSߝ,F977?XU (RuL^`6?s4-%\#NQ?J RSd.p],q8F00Y=iP +2Y3uqr% F{pЉ̲s=ZNc8>p4etŭ;^Lg[܅1A mh-~kתnHU׾+۰=-^ژ?tk*[c@#}0>mre}-/{*-yql̠-zm ,t]D#qkg{w~]A3f.:ZZ/Z]A-`8'xm䮰 ysRFV0/g"K82qt-F+3UCkd&60/DYmK-qGg[6:P^^wڏγU|;WrBhJã5K|>ӊvvzG.4_xu Åv n{XNjqG>] #)$tۀ&~-,8:RƆ}󔣃T*iʽ#MPM5KES8]b=#+5^pBDI{JCD>eFJ*ۮWK{lG~2D'HcIJ~@WWODc`gv8a?*QDY;$9׮C+Phѷ 86>$\wѽb꣇ʹ{ vl=IENDB`u1f468_1f3fc_200d_1f3eb.png000066400000000000000000000022671326020644600345260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dnIDATHYlTU;02m@R@+’ȃ/LD($(I)PօZ-](]f񡴴+/|smU?L&UM?ssz2SFXb$WNJ*➀O>ӵ>96WiR Q&x1x8c.b?z Y4V(j6œ@ERfwJ|<<,gK'}` (->E`Hpr()Ml–&B(w>UM}t_E(D@g_ Z/٦v ˤt.ѧ(PD\>_^@4D0+ z-A@Iݾ9w( l{#D,gG*N+m/3\G/GB EټYEv nYRÙs%ÑhA£P!xwj:nG!Gۢ0mg9ԇoX,Nj$3M) O)kjjL)zӵeR )%vz) RG.>Z5~ HekGP}y22~B<0ki9&n\ !%vH }cn #0;̼o|piYM(- 0wN *ʮ456<ظ'޼dR߹5 E'})xsöTB]Z#zK,K `B[ט'`͚)dAz1t N3hFJe/|/ue6_t87C.7J -l+ANǍ,xVjp$t\he杣X02&8v=1 14D|puμ_]MhָgoO@/#72hectt4sH:p?5u|54zӎ -ĿvN( 2%4m:k;!ؙ:ށ0~"5YcIg)JH^xvE!Q"2ҝߋ`?vT/w~(@u]G{S9f WaR^+D=u(S(.s婿W0}ifey@A H߇19_(h0 8]ҙ҉LUwѭfLq<@KGڲ/ 1 fRIENDB`u1f468_1f3fc_200d_1f4bb.png000066400000000000000000000020471326020644600345200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHˏU~3M7 =؃a#30FQ7NMW.4qEqJY&a@1 2 ~LUW{]0I*UswǜsO?sh4nj:4(4ʣLJz>v_?Ѧ05!zPxO/'yaO Rk$Ćqc ѮxGgEpN;zSV 8;ӏT׵__/xz9 lMIx2$<Xe6Hf=|w ;2,L0gtWm10 bZV`24b6W{ԃ< TKG"yS޽(BoGcH2 "uj(HiRaIq.S(B*eMTK1,f4@p:Lg+B(6AH s\rel@d@;Bґ_m`cZcCZ]f/G7//, ,c(H'2@FDHo_mJʧ (?ye g\ާ8T_ιM@9}%{&Vbo7E֗n:?C xr9C6&H ghPtV_8 uu}1j4u6"57掱IK~SidKb]rE&E`$CcW^ioQ] _dCSsRi1,i9[pBz{A74iIENDB`u1f468_1f3fc_200d_1f4bc.png000066400000000000000000000016531326020644600345230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dbIDATHKh\eHN2jgXn5 ]RBBEt]>pb[JS"T6ژ. M&&1ɼ̽i敇s]$!z]h> Z"Z- Rw`?\ (oh-5׻>޳wDsb6!] }P |siHyXU*m  ʪg|wk9|~XvmuXrb(߬j2jk `(7hHϣuꁩhP0&CY]K1>H61? kc^T*7ZUy={61]| 3PPyWpķX3GP~DwG:qj9C/~[9$~ DK`67Ps85>ߺ[d!e!%6X9S S ni.qadD2svlQ[}m;uvXB>xJk2^+;?/c^hWvʭiwt2q$ZoLt#Oəzz+ybzWHeZPwF va;?cǟg#t H$RʫȦi@ek?s ,ٶ:Ӌ&1zu#N'u W.6׫VAd#,s7i&36AsgQzmVX,IENDB`u1f468_1f3fc_200d_1f527.png000066400000000000000000000021741326020644600343670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d3IDATH[lE]vRMp5P1FBJBQ1DӐ6&(Mp P$bm J^.LJ.P,&̜9sfg(Rs56_KYHmԋ*f(׌7,ӤV''O7ۥt ˫㩉H$♮}#~[ 6y:M'*xŲFKd᪆·fz7xg}ݻ %wq Jd774hb^wK61tԂן3*ۘ{I;]/ٕ}c ugY[&N^/P;oũ~-Yx~f׻,(AJg/^גMgo^4X!)eД5On wL;n;hfOSwm]׶sVVφ{f6I`Z*0B.U㿽+_nPiGC9GV)p>- 0>xb)<<(@T?gnxdh(~/q O4cĹ-~Уe ߾f'#dIENDB`u1f468_1f3fc_200d_1f52c.png000066400000000000000000000020471326020644600344420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTU޼qGBUhX%a! P\Hdan\vq`Ÿ#&b#:vL罙yB)LRݘ q@h@ @Ij|h5#~mJ)7A{z1:1Y,*X0%+ o#|2̈B#l;A<^Jv S=r2{Yg T RZ8C.W$;GY6+MQ*S.yRa.]84`w-=[_v' tkCްw@ Ieܹ(&0\Hc: ,K&%y6߶4"uvՀuDk71٘>j䱺szhph{^"m:8.=B"i xsW+@ӥ*aikW[(uc7 ^cd6Bm)7dxb6zGJywww `ܔqEmn*p5l1(A^NqԂ8 ;CCC2̗*nY*a R占mXd[ڗ 7W ]I0iSa s떎t%S`|ɉ{؛ mĦ p# !V6+ZcKIBYt\ƀHjh(&EM5"<ϣ+~Bk9mbeWk:bQQ*߿ɳuƊ{<,IENDB`u1f468_1f3fc_200d_1f680.png000066400000000000000000000025541326020644600343710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d#IDATH_h[??"EWrcvRgh{(MHB(`%{IFa}(4C>,10H!3̵RE+ں|ub"n[իy:~5BQ՚bqeee7ne/_p[ P(~q?Wvzr'Oo  LL歁Ľ{fQksήI^٨yu##$nܽ{WgΜ) !ԭ۶?f?9{l0 l)|~Zc= A{?@u;Lȑ#td>uWD"c*@o^ ^\mH)C?uz3133c8Z\\daITo߾+#(Ν{G4ڵk~;oY͛!ӧORQ?8q"tU*j@]#esh !DxP׹uLf}rr2B`#$܆OR}T^gGk3j//UU U tm7ŧ6+=XxJƉj:jH r @O3hٓ͠yhC3=80C}'V!='l-N ]##u]T2*XXvB`nض]4Mu!ġVȾ=]_vpFEkf6k* ) ܎ndّ ^rri$VΔڃ0j?x[>UUG&&&l/gצmyQ/q읤hWvg(### rϟQeYA"@QFGG"lnt˲z@Oo>|he=Bt#n_RRT[i4҃ K:> ,RD8&JH$PA8ضyݻ>eYxOm155D".--M$IvEض8ߣF4L4M4M֨j  ~F'X^^&Lz֚F:!}mnn0a\8~ԅwSxX,FRapp'V@QChT9z(& QbaD\ҝ 4rACܰ4 E H)'Z: 0eZ:s1<]|;Ϲ G\ܺuG׹?˿)8م̡?vlk[0w'e, F#^۱?xZښϔ}ްz00SCw*@p7XE#oꥒ!,[1`ܬ0/f3=hR"|p؍^:nPؚĚy:@75r %%V*E>xTkyCcVs$j &la#34cӓW&1r(PmWW-_l!?t,es9&'tjVN/,YKw !{u<Ƌ^~<9yqULD([nUZI<ӏ`tzH/}\ @;4A*6gF1肋V*Kl?bzpB} MECJ9s ͓JgzMTl2I.'B$3$34kxM ,BhE#vu\.gLk`Aǣ"LLG V׺].IqH@r:j@uǖeso }#X'}P5en[T [L] /OQQ܈=$ˡ!/P$P`*vkA}F ٴӝ%)A/S(?Oh (Тs\+g$VT%~лki_QK6X^yT)wV@JQW]_9Ko @_~tK#3+\MIENDB`u1f468_1f3fc_200d_2695.png000066400000000000000000000017111326020644600342240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]LUoˇoKK+kubzЋM1q7&AMv!xL¨24fΙ(MNv mfG+.mJ/Bey<{^CWAOzMBRB/|)ֈuUY0]'.@-x=)G_ >+ӲhŒEBy-u(cQcqZGiR)g'GgQ-Xa60*Jp:LNX(QOOaN}_djUC#$҆Ӫ>r>*cnK( .\q:r _cX9Ϭ;VOt>34on>G*-3岨v;uY Cg]ˤRh -mt?4@ oWg]ZՉ:.6Y970̹aXMoޗJYݑJ%gMA›gz5+kl;*2Y/?zQZF0#L]~S?[y/1vQq =S^H(,@4R~d*)FQoqVn@ȓ@)%7x=_66wbrUKB|y`HvW],J l6$ZkzGVѨ x`_NT}=ؤg`cJRx|Qњ#R6hiryjQJrShR!#Nt:$L %wPl6@L&ː T})H;^oZYN7]@m)+׉GwF1*xYX;>Xv@ZL]/;\j оXȓbۢc{INr7aX:e -DQTE!,\ 'Y"h&,R{mEe@,S|̂5;q8ܸ>ZfngU /Sb|q0)6A@J+\#߻l6wC2o~&4U8uWcoHhA _}d|^ dpd$^G+=8Od@M"aMBv`r*E<+s\߫oxm%\ZcI*r)ʰc* 3K )Pcӿ2Gn )J "]Crw9iYD7/X\HU B[}4yv "1J"K QG(K %sLݘe~_2B2N`VAɢyxuʞxXA[ϓ>`>k#n`cCUSCxf˪r Hce h,gF1|/}ѹҜ}֌|nй[C)^7!5筏jkYc'PPouс\.Ggή )%׮Oϧ'EHYbz}?(K;zߞ2xb#TCZ <AB%W:nUM*B1zq9ؽc[/)wIENDB`u1f468_1f3fc_200d_2708.png000066400000000000000000000022611326020644600342200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dhIDATH]lUh Fll@nŠQF&(& 7&Ę&ȭD@L K5!\HL!MZmlmm~=Njnl^aC&e"?tBL-hFm> uR CM$.N*%9*MuZ{BJ|("`㡫_͒.2ܼJgbp<@_bщ'c`<Ԇ+VWCk$qt~;ue l=Rn~Lմl046lהJk<dS,77lQw7~-$LS{c'7M+e0Z0pBoۉR5jq+m }KB_哃@\IL2 ,Qw= D _ύC`d4P8e+,XtOqp?c`*%>k;l3;Oo֕{s+l;G{|U*1r嫗ScCuДTִM?r%mtBw/I-M1񪪪O"H#ض}ulv뺾NM`VwE쯿r\m>?i۶ FT;aa0_7 % T"ȾUƂdf?T*E<gzzxnݺE2'/å.?{XUp8L2l6T|Uz# ՄŋIENDB`u1f468_1f3fd.png000066400000000000000000000015061326020644600330150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTUf^~X+ڱZch1ƍB\$(v]ך(hq4qT6]tQ6E*3}(3{0P=NCxdl(8c+3WQT_K;I |ѱ?v(4oKVxSge=:|*mt29m82r>eyk!Ȩh}-Qٿ_jj؍\vAw} 7Ձ^WD0"( c1x oޛ@nI@_;Kדfu3  >(tcYM|]ALc% bf.Z|Žv(3Y`TYW.t9wpWnrZ-7<g]QSL(t|.SU5CqW'=@í;S2^]0LUs Wsr%w$ s#)ٛs3QM=< j%j1?f s be۲*A@hO\+Aqxa7;;Nщ[Yhv{ @COrGiz QϩonNJV(XQ\o*'nA#Q+>vIEwzƿw3IENDB`u1f468_1f3fd_200d_1f33e.png000066400000000000000000000024441326020644600344450ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHTklTEfkwmڂU@ b|DbԨ(Q#1FmTIU4&KFI5>RHٶR~mݽ{vmo73sf& lgc))iG&K 6~AN t#8[DW6-gO;EFײC=)@=A<D_+@4qs@yp/?\%hܖ{Zهd I880 ON( a/ 3 c$ tK})鹣bWe|$g9)C+-a73ϱ@*0uip¥((CA  kt`jc1opVEC@fq sh%ƍ:O_{ڌθ!mhO,͊zCc$'Wwz) " 7+#ɹsEyŸ́oe8Zt@~Adp>?ץ9N6'#f`ل|WDWӿzau}qGL?Aʅ 56\*,3-9ɏ)˥aMy1 n @ǧ*y^'睊Kov=aF1HB4ˑf[o8y04hixJUGb.bc؈lA8|E}FCW2 |RUVg*%M"8Up:*lA/߲pwg ezg$~mW{ļkʋ82TUN&@V}Mq𻽪1i *˖ W`$ٖВ|;LGa(wNxgcԬ q9/1%/2vy=^,i6hlG]ӯI tfgN9 "V2@vC!\n|yL$Ҏ3+4Ζ sDt'"Иm ]00bLU2I%eOX?GD7cD6TU$^x135YIENDB`u1f468_1f3fd_200d_1f373.png000066400000000000000000000024241326020644600343650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlUUϳAijyJZTh`P"Kt`0i&H$@X5&6I1 *}(׿/{܉W -6~ &PHi`Whm_[[$Gc>Ѧߛ̙;;aq)4kV>5!A L&AGv ÐK.TA;Fj)+|' C xdT2BTXRV qH2 =4o\Fױ-R>LQaR @&ec;6CC1D> ж3yBd0`[6ҕ ~L&!JQNL$ׯLmmgg?N^ٲĆ)[J)gӕK&oL'RZ6ۖg5L"q&1>19t]TEi=Bii#B1U@鼊[ ___;Qf #\~k3`RyFm q˲쎎)GmKΌ_}FFzŔGYtb86L)! ͧRۏOުx3 VTB7~/c,~ͲYZ떚#?<7tQ1L0T'hlۤ bgͱ,q9^]~=-jYf,ɯ`Ϟ=Jg^žaizc 'RFԟϾBu˒%KpLFN^ʴb7> ! N#mG݊p)))ASVerSs5v455UJ)a[-[ d׮] TCA8-7b Oӝ|^?!Z&`ฮa:H|umΝ;gLL9<}Wdgw\Ya޾08QWW7kmm0 sU, c/{q)GQիN>:rOK'rkp`h01hjܞxlƭϽ٥=otp]'9IK'b-We^ - Zy3H3>hD,-I"4&BÇ:XyEȼ"o;!c|r|RIENDB`u1f468_1f3fd_200d_1f393.png000066400000000000000000000017741326020644600343760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlU{a{$&LhRT@Z5A8ΰ, (`!( &joJ+hƺ$D(u\Ոu`kiFʋ}tlvܶ퍥v㡔w~,ѫ-6jܮ5Zk8$~k9~;wku588FF`JZGuxO WR$RDm[(šn|G)f U2-QS94f+ǶmMı1ORCV_wٮ""Cɸ7E+?4o`D @fLFhэf $rD<_-CnCiĚ=,wZvW$bmk*-0`ã{;/jß9 鉃X}ҩ>^}l繋E(E-z}ד7 C; rļH[<=ݴ|7\y7Z,XgmJj;}m6f; ؔ+5rXί^8Ao}X :|Y8%\E\[mFA).F7O\(0555eHbM#/lVPrzc0j/O-xf$Ƶbr0;R= ?Dªnm˗6mKa"2A R{p[7[*3IENDB`u1f468_1f3fd_200d_1f3a4.png000066400000000000000000000023341326020644600344400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTU}ΙigS  EZ4mi[#ILCPR'Sc FbE}PLbPc}P(-әsi;gf>д\+k!g[y3˭,P[PpZ߬Gc8w` }NY})L"~~Һw3I0["#*i&07X9!ř5U:-m= )=*K`!R ͭݩ!SviY2ի_L,M6M4s sǸ LA@HcY-mZDN(QUU|s]Wegg@?K,sGIr'tݾ?;Q5ijbo}PSSWUU_())Y4o޼3/^ށuZ29@/F/F8^K&gT LҰ4cQ]]](/(((3 cRzRB!Jљ*\%u ~f/tsBT#"UU,4?744**++@(<`ի<Fa?nXN?ZY| UuN51ݴeW6o|ɣ566v UU)%aЄ1瑶\Iz>NH]y@^YV2~i&qnQL4m]`VPHu%/gzHs88@O4I$0`twYq=wE'$mN7_#dyY07#Q>?lVL%7"t7<v+Dx>Xоzec+j}m.&΍; TPn#3k[wo._GMw xL2O:d`F^~x#kvu|3,x`08>dmZ[yTFtQ|?.St \ko_4}-1\ſrDKg_x~o><90bZk,GTBxܷ->vg-]6 XuuuF1 5NACCC8?S>_1FvO呱"Z Nuo$ZL3^]Xf}V[F7xbLIENDB`u1f468_1f3fd_200d_1f3eb.png000066400000000000000000000022721326020644600345230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dqIDATHKlTeߝ;wH;mNB .Ȃ5B hҭH4 $Xq!h$VJ#bZ (2ma:vy{?C) ~sؽa5`mٞ{lsxD-ŰNbUWV"剀_ͪst{~tV?)`ƪ>2 -幟<^9'YE\ő$!%/i K|ڬl4]*+@1STˊHظU%oI^7XTUUi*]!&^!% H& H5Rn}uB1ID19af[_C1c # E|4הO6]G^'NRÔK85auCP2lVz_ ,siE@3b)gD)L*5EWr=E7 ~ 񕻹 9Ki+b&T@*F8ZW/pR]Q @LZK_6qKgL>9/mD J&gԥP]8m<6|tU͸ѩ~I ˦mn6|rit '&9'ӮЍ#xʤDt}vpktxEU0MR^XqyZ:=ǯuN?tvv*}bgwKܼh"`e;~p:k}С(β۞gE۹%}^8vZ[&,F/:6>im*k}0 ֙,qEꗁ&\^?^ȝ4"pmE~ޘw!Ď,OSN׺@Sxw{G/\0ZevDBN}OTiX\pdjJTSYdϿIs/7@")E ,d Fc])%'/tܪZz@ Rz(lMS$6ɑNLg_╾Yqќ.r MMлc&ohrVɐIENDB`u1f468_1f3fd_200d_1f3ed.png000066400000000000000000000026351326020644600345300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dTIDATH{lU?~y?f:3V.T ,,"Jd%c6K M%&DtVqW&]u Zf:tyt~swu{{L4؟o:[K5/';{zo۶=Ʉ=˦^y !m*Cn e҃C^tiTJ;7|K3w> DFT{, 7.LOɁTAIi<Av>ּͿۗY&@8hqYyJ3tUav7>Dk },gRXK5e^-qcO>zo%_Ud=P*55Mm,CPv{_Oe/R5-F2 UOE]dυTaqͻUk$<ks\~iǤ,R9>|˞-{n 29zƖ؈3t6$| rG,R E(eHao8a´[80 n9NZ%k}7Mm4 yQ]w?ޯzksSVv밽t_3dtTxYœ_hѸhxs(vVqwhVF`.UPQ Z ?ۚ(?O`CaVkMFow9j.u# w5b#Uy=pq.{s'&+0ʚQb,D<:{>Xn(LN@Qq*xH!2 [и܆5Պ̔G㢪ϯ>8“ﳎIENDB`u1f468_1f3fd_200d_1f4bb.png000066400000000000000000000020271326020644600345170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHk\Uq$ iR3餱HAM}WEĝ.Ep). RŅ!XBk6&i^3:縘d&͹{w###Ws?sjn-g$OzĩqӲ܈ÔxL y.L!Ʀyԃqr2k7t %:oVjQ՜ӎ拻]q*g'W)f\-6 >"`:.;9l~%5nCp#@$  L`J}'ߑ D,P ̞e) (&>"5^lm X-8HH(@&_i.R 5 gj9C̒ $ZK|O1sgk)E 7ZwˡdtS䂖TYsj/7< uԊ.  .D ".|O޴lY= mУk(ǚN R. 5Ot76BS>ա|J{*Hok ΁SܻaN$4*)zIS\lj{N UAT8TEjX16d~sW.1ս^%7瑛mdD:63?Y  2~XˇX@ O sԿ ԁn;lb _}g* ؝Ii'O ӯ<ι&ܓ@AQ5s@Kcᝩ'߽bEGA{ty 7[ ॡJ? r{fG.fq#Q֢pqGFkZI6є=9cێ~^ibhT`Mwun{7ylcRklԛs3J{SF<[pB}poiIENDB`u1f468_1f3fd_200d_1f4bc.png000066400000000000000000000017001326020644600345150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dwIDATH[hU%;q7ך4l<[4SXPK)"HYP%[`@AM,֔ B6.4d 5d7!f3I#x޾oew^bB+t;B<"M %RJMds<2>^T7`Ҏo=ʋCt۞0?t#k[SOJ.x,91:>1/]U5;R]nW@)= %\1ftD(ZP5..IgH* Rt6@g{7SK؎rm-:;07maU볋3i>XKXC:WU$_Yג Y!pnr_D,ïŒ7U\DTS} !H"F1LGs >]CJ=ro~9*~pK{疗ԆIgv=׍b}ZȰlY6̥3egx<zC1z'mr,Β1/M{hu3`+HW컀X=Gsůp%pG? )wwfVl)|nqa_8Ubfn*T}UMk= ~} .fd4ƷV_)J>?;-nr񸵞 C d}si8My2Vn;_XX*!%@+ӎ1L`;Pf>c\}D"A*bo8C!zw;ƇnsYC+hT (&Wn#Vߩ USl\bR%=?ܟ knyMשE;ݱsZ5Y IENDB`u1f468_1f3fd_200d_1f527.png000066400000000000000000000022371326020644600343700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dVIDATH[lUgfݶPVJH(* J0`ƒc$iL />@(<(& xCD.ETz[Zfm)&}w93?Cm5ERUVSA ̘xu|M6.ug!_|= :Es )-)I8滣$ )w/Z^SIQ1nEJ;Q!ð)GI%!L98a4L(hMSUj'#,T3R 䈱#@D?'Z:aBU>C͍_81x0EhmП!M&ۺ.O8/W~P5m74،ڨxtu*m?; oW EBPYUu "ܿ?!_[.I:~v$Z%P4DzM5q[iup@q(dF`#ɓ}~|^Ӵ &Pme~Gs x@@`O*6f'r_:% Z{0Ƶ`9\mg陶X򒏲t4[pnˤK)=E]-r_H64Xuoa8*9U%xgW#+Oߺ7PJiz[0;vͶ=nNOҾ(AB=M-}rlh:PhF#NɉηkiR,װxC4,] vgs؉;mc_ѴQZ~| XBO> `g]l 0Vr/CB.-N4žoN76ˆ}\aZߨFLiap͏({G|h&<б%k?p<-w 嚄tCq(0;_܃tkd8&t% +Fq}(&WiJm9?@yb?Lcی=eӾz4^k c0S?Fu~rC{ -KWZqC.^(k= ,B Uz}>@ڭMc@Գ8VL$JS_CѮ9Pplo]&;\uwT6d>LyUR:yO;4cUt,1z-^whPDdџI5>C8/I>_K8w{d`5 r;,q5{=J`+o2,g'o*+W,-jnlKYlvy.j`d*a`'R" #2a2Y &)9`teY+Rt5ߍwG}[=|o7JʵDI۝7R>iq\L5W1.f\@nd!}%+ 4Y(5?+`L!Z+Jfͺ8\.ӞXPj:#Q4V5P1iŖr,}f/@i8vIENDB`u1f468_1f3fd_200d_1f680.png000066400000000000000000000025711326020644600343710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d0IDATH_h[??{u%[\Kvu2Fd )`#{IJF{(t1[3f͢=ez̳Uv^Yt>,=ow~Ovʕ_ $LFBض. NOOI.]z7y@>-,,իv{|oN81=44> @`:>?<< n߾,Goݺ?11q]U]Y/QXY^>ğZ-ܹӧ BOLL䭄rL&ҙ3g6UU<>?Ǭ]O<5ķ^/|E G}knn.p 2LqGBj|8Fa&`2_!CaiOCrBx=۝r\49!77=nb;4]֦Gr=2y\ Ӫr=s|v'ɌL6oHi1Od02?,@ )eylrr-̞zvvo}3W\.ڃi|޳> 366ֽ ˲zܹ*0 Íb!B0>>8BVً"Dj0v{ioіT@ QCS*XXXXm4 d2y7 bH("ŐeYe&TD"a^pGBOHpI]I&Q.,VM@Q4MC4Eְm?ݽ{u7&  Pd2C$lll0::/;vҫxh4J$T*122§Fyx 8r"fi6J%4M|>OX 5MEAu fGee[XZvBpqjx͎8X IENDB`u1f468_1f3fd_200d_1f692.png000066400000000000000000000023401326020644600343660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoTU3g2ЛPň %&D(I}2^|27DH/<4%D*lv:-әNz>LzN o}k#:|B3/g/ ,xZ2qmYؗ9n$#92S 'g軵%y3kᆓГ 7Bt`^ꉄۿR[4ovhe5~$qؠDG@RccBdg: ݖW2PjU7WT k']=S@T*І`Lj<8`{Ui'Rn l+[4|;x@7MCGzu\c F~ABJYv>J [glfx>n"+m1 )50Pgi()i Ou7v6d3Y|5Y&oX*vei&TNhB(ƚ|agRrN=.ӈ4p(7B\EOt2rJԆjoW%KV茨 QeSy4[F<8c>ilP2>EٲUuui S ~{+2wbJ E:1F:;'T>xC{h:TCX6Lǽ,qUry\lH,I,qw&bxrՔ=r9g(~XTIǣSqiiF=Vv&e4T[Y䣙U%%#Lcr|t9PYQƍu1o?\UwN$X@g(,ZTVMMu^R@uui?h*a^sBSԇ:S,3A6﷞}|Jv#&Onެ *5e=Q_(8r"M5MEmm!!e%&a}' `ԃ4-JjdBȥUxť2Z4~xs3Wf NAaA#sMbEB%Vl+"{*R^X)EG}{)P:(ޞ{~, (U~靮D߬qL\-IENDB`u1f468_1f3fd_200d_2695.png000066400000000000000000000017131326020644600342270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_h[Uܛ44M%k풶J`a"(A\Ie>խd1l 틠ùci@73%kL6=>f=~ sKx9bC)B v8w?f@VR<. ku"?f= d>>3C麬zJJu kW \*hlX,R,((i6A3=LTyV()%m^ }tD)JUz+zvZ:KH$"F UHJPJ P(P(7z,BaYB~?L}zSuw# X^^& fhdYߋL3*IENDB`u1f468_1f3fd_200d_2696.png000066400000000000000000000020531326020644600342260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHML\U͛f@bjK&ӘƖLLhИn4.:vcn*&&jZI`E͛yﺘy0Ļ{?s[kQMSVO=J/=34+)w9}Jݓ6ugC.~]ɩlK]FΊ ^2ˡ}Z+*p8 ̊j:Nem{wb"\,ټC͉iE&)PUGu_'q?-Q,Rxb1E !辯M8TEC -;Q _BĽL,SlNYkh}5mM!Zg1!% _%ihi:2j56KaVLvFkB3:@^/цa2:u]LCn92V&$+P4MTEU(B6fUAR;>[D{BAwK (ɓM6,2,LFk].4CcfZB @^MGC Ir]Jkht/ ]ԇRXRgHDu A )!c! B4cgsd7!mX1B2cPH&|z @s/?\`hpx-zV47cY1v=o ;]<0Puk$KG45 W_ZKH`^ 2Y.^c53a\֤מ]}BJ=Xm"51ͩOHc&7gP@sEt@4 0shRJfn^\Ngu655HM(t3\zt"L]Z@H E9*i(B1^ݺ8G_~&IENDB`u1f468_1f3fd_200d_2708.png000066400000000000000000000022531326020644600342220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dbIDATHMlTUfGtZbk+k#aD"FAk ? c\MԨ,QH +5A4`Ҋәb1fi~L;sH$B(6j:N3wu qvF)%5EoMk6 )K.ݼ+@WWZ@Sn-|ksѐ|OzR(Mww@Oۄl44U>eaSqV8E!, ˲ǵ1<%;!L0 q6m`0H0hU|Ҧ;lP*Mfe\evvv ,!lh1ؾEÚkce325@BvG's̙ S-8{K>i6J#m ,505(ڛDe0\p+G[/]oYO ۿ:7%S$ԆK gsNe\%MIs$@[s5!2)ujI VG*U)4 F4ժduͶqJKEG4h[a ]q9s*y6wfM!7XVAxX2U>X,8}}} 2 \ROM 뿗)}IENDB`u1f468_1f3fe.png000066400000000000000000000014401326020644600330130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHTKHQΝ1cMGY*`H$tv-pYQh6 *i"V!pzDz:IJHgP;33.9l2(Ղ f3w0F?L2-0*"1+;3U; D45]+KMTY:ʼΧ*jtKWdЊ((Ut ef_{k|AlAΪhjf~cB R)g@@ AU11n)S4]ai@4B؎0 C l`KG=q;$S xiD7.Bۙn/..[:rtS9-7ZFMnZsܻX$&KQeZ~hI\p=?ޙ JS4ˁ[p{DAe$;6>8w-g$Rޜ [7p}edb{ڑ/#Uo}ɜbh7&^t l^EӦtCKQ/ͭs{pIτf;f,=*-09U_G̠\}fXN2耛t&7@컝sfSMBJ'==3C^,i5%9q9AK)]hb_=FɆcVLJL]D5Ugr\S6$Gy6ʓ!wKʋs7QCeT[F/x瑃p&%rƘNo" !eeGV/{yO1U{ENJ&?k2*ƲZkK 3MޕtPBУ R}48ZNů.ٶ pRηrl# q:Nڽt⛖m='l_|/n=*? Myq.Ocь c\XfCY /׶'A{ w9Rud˘`X[3g%cf2ܝM#½%k-7߶+,t{`֚y rXІc9$p*bL5gqLq(Ysi6 !,}pa.^LKV.X+,(99z`.]L2kaqj DΫ/m0))؝=To WMĈƢQrBYܜ+eqBSUU{zzD=`PwpSvOBb(4ܤ'}I}B4E(L%%nIENDB`u1f468_1f3fe_200d_1f373.png000066400000000000000000000024301326020644600343630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlUUϳ-myR PIPI#5AbĄG:pB$ D$Ěb C}J[dv^,}J! 1 4MvlRQU$Ÿm=oc*$A,vq-J C?d2 f) ]N_oBZ=W&JC:Hx9t_@Jl[^(,2ąbn]3=AT6qqʧ'-yc--/w_MG';"Yfrkõ$ʊ|pr ]"~<1 0UcfIUdQfa0yU-,kdX P]nQSiaJQD,IMIU'ǍCeߴi͛Z붆cEpMk߱I)0 5#X bK HӔΩY֭% 6F-uuqv$@Hz0V˨僞m477^ނAŋ4^S)HC pbм])!Đar9S[FL2!1ckxam}ՕRH 7RR$mds>gϞEkG< (X5=]:2Ț=k[[[_nt=LcUs"YD03+:G ysRWGR:;;Ł V  ah"4:"^tK:V===@@ 8*>G_.DLZ" e?X8{CeeMXX_[n״H-% dh{9{#dxqwQA*̀J™٬ґDF@2iwmxPfJ. EoQT*RiZ{Ul1$0z}6 ZmIU{PlI'[ss 4Ņ?gd2Þggg]  O v@ {bT@_3]QZBuHTl*XG] peƎF=" Qtȑ@ŏTxLD7 X5^s_xd`5Sꮙ³orsek!>0~ ,ˇlD}1"`ۍJmKV<ӯv{:P_ni8%J蠿goWJ4XX3׶Eqctt`Rͭ*]1&jȍ?xˣ;ayXi\; Zd m,ŗ |>u0}NoNj)$# $3Dp"3b F9X^ }s_DiElruc] ƒ:uSvWí6(y +ՐWuo }[i,qܩ 8]4v5cwB Wqy׋;@&&&^2Ƽ##rGPf5VTs60cmh|Ze49?55ծX,풺tDLQ<^QܺPG@Dj}9#΀IENDB`u1f468_1f3fe_200d_1f3a4.png000066400000000000000000000022721326020644600344420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dqIDATH]leofvggN?Z(*AZL*"$&h mxUB DHMIC)ARJm|^Y(,ss3X}}GKei (>S^=rt~bULIFP+UR @ Py3&ذRrDp:n&xngqV@mu;tg@)j+{gPQS(P@ gP|21@>8Ee9s)`F+Da bz9Tb@wm*}.愋q\dO܉nE8ܖI-*Si3N4,WʀizJ_^_t!BVE^X:VTps)6,jTӶ} Zh5^)BY\ek#Y9ܖ e)w}-'_.JR69i)zKO:'LA¨moefkvK9#?l_~'e2RxrBq.@e\= 66FHK ge)}aR2-R9=cqy[~VjYA֭`E2G]sK]y|آ]ٜp99`>8 }g]qqq<vEf+5TsyظpLq;=ž{tX: TM57i7oR=PCߟ4 `ww'htرcߨ+jɡ@֛ߝLGV^W쪐S8WJƲ170.4ًuձCK,,?3o0yL09 RĂZʯڵk+l˗y$"D7j^6v]gMI*}MMvqW0秭[L-/Z[[[}}PUUR2ǧ4ޓȁld&7lҖ& ʵP/=W4Q?>BɩweΐKlh4ʹX+C`%8T&`Yy_^/?Ct*SY6 +CtV='=Q4HRB,O ijIENDB`u1f468_1f3fe_200d_1f3a8.png000066400000000000000000000021311326020644600344400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTU:-3XfELblT1#q7,dQĈ$1&P *-2C1i;t2t$%{&byb%a#m veP `mÙ{`Le}E&E׮gRTSӑE&>X_]]4/s|"vüBOUqfl*{kʽ8bdPŜ)l'>L,J mGNe=@Lee9|7}8JHf,ѣ%fҀZ( H4夭 ]I"1(yhYU=]3E;&ٖKvnX]_*o?cM6sCx(cn( X, ]"(NI[46>D|O:ur-á=@7ܪSxn-~x#\`xT̻xsʵgu|H4ݑ}xYi6[v[Eo$|\f|ד V3؟L!ۥڌy'+-oUUU#_8e>8}xw#`|֒N5TcHBBG~}mOFbZzסpi˚Uq; Ak5ݏ55L>*Rd[6 Hs466둃l*8%---4C!ܙOeV|bjdhR-5CuRd;#+jpZDS< ^fE2 #FIG?;e#5¼\^{(#091MP]yWFJ\*| sëS#|IКw柤bjxW׻G:] fdAdtcbp @NQДKđ7wLR'4!<'uvherߌ[}}}@zWu_ NbϾ/mxoBQ5=KVZn̜/ YkTt{fFR<nReX b @")Eˬ #ߞ"ghn},k!xq]Z@Q#YPMA4|Iɒxŋ8v<. :W$%xTPrǧ׫2~3IENDB`u1f468_1f3fe_200d_1f3ed.png000066400000000000000000000026131326020644600345250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dBIDATHklUlwnP m*Uh%*>h|R|ƨDL_Ԩ1DBjj /c񑴈$ Xc˴ٝ{ݶӝ?9gxgmߒi\x-ir׊Ke]˕/d-mCR剸pѢ.sU:s/VڛWJ,&(uz ߟZ*\N}]jkϻdS`qUn !R帮NR @$W}jKK ~:6GK(_Y<,ӗ0QRH)q@BW36' e$ ZHsϩZ$׎!Ls, b"u]=Kf䐱$lJ&aЀgۤO۵fw,` P1 lYTUN&~:z ,fUKo4Zk *0xC杩diMȔ Y|}LQ%-8t:Ž]ARu VWqȟ ȍVt%ܽj~x5ܮ(`VlwsHEL. z>GL3`Ɣ3pSd^ry7 GB"ؾO?mo\H؜TM6) JʣeQwd ~ӫo5oK+$Pi(W~:j}X=@{(M 1eB[zwgZ#j} pY-HCrd_ ZR9j{/7jt M"A凈];A7tgOtpSژW#+)ψqٙYּmx O+y[Y Y3M|;~Yw+FA Nr3r%aܾs(S c\̱sR|1hi_)MϭٜvS[Vq?k &1FԲijmvl.G'> icY8aPIhCNp JPN+ǭ!"//KO_~v^˽Ln}3_Y,`˅0_Iev%|Dqղ1 uo(:iE2ήZϗnZ ȹ`PBRבS?-ij~$(7靟:89.eY~IENDB`u1f468_1f3fe_200d_1f4bb.png000066400000000000000000000020171326020644600345170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHˏE^vu,b$QH^5&z0\I%z307L  b&"y .̾fw1.]]j1;;{9<8Nvzs=ʉr&e$j҂"H CQ7$biЛ *IC6 ɸb9&wO*`Jx7-sڑ<3"<2m4=VYqmj7XL\֣Q۞qNGW4 $\R`b ڶMTjU'1;LrQ}0@+P }{REŃ\Ւ'D?E{UVQM 7Gi,FT$K9-d¿c,lVυ>l[D$Rs}V Zw(lQ jԐx"Pt ylg<XSrO;( LH$Fh%&Sa}4c*4&AiRƂY¢p=qs!@A p}w_#>v_qClN24j|{?C xvq;ĉun</q9cc9F1tnxokB^?rc6UJcɗ)UѾausbt?/ܗYiW>{Q;YE2B2z|z6>SGIENDB`u1f468_1f3fe_200d_1f4bc.png000066400000000000000000000016431326020644600345240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dZIDATH_h[U?{s$dͺf֨q ۋ@/u@O*{P6_dΧEV5k35wsImW;|Ϗs~s^b#tTA_RH 1mEW&' xl1瀤@Tg|7vh~` ](;ǯK_K+X~FJ=dK8sO{6 pP6 }t{B4VtAlPB=&aC\HRrly uDLFݫ'J IJ/T..;acl_ƽ1SNrzeCNd❺AʕF x!!nhlDZc:q]?W*sg |*&F^RkVjH]<91uǿM[FC݁K] @wv\k*fufuj6念k90Q+\"jjtJ>4ȺʆUG|kn#7 鵑ʭluu@8r_TnaVO$YOoߙ^~al6u#oc‚- i||~+ĶyE8qm!)G SZt6uu]rԍopixoE}k/4m)%v!:k~u nV:懹kr9 3W<ʿǡxXvmۺw-a&e1s'j!7k^+0Gbmh<b!dK,Q"ᶪ]yhNߎ!4=i׿$QIENDB`u1f468_1f3fe_200d_1f527.png000066400000000000000000000021721326020644600343670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d1IDATH]lUgfv--M`JD >e4"$&h 1qAyAD|(0@@Yn鶻3;s|6)&3sɣ̜R"JB\nCPsN'YYG@u`RΈlm;XyMM1pQC<0TQODm477[fUpXTg5PPc'Y "0 z)! h -)iEj*jIBBT՛nȂM|S )tz\j2 *{vJ:`~s\La%a[E ӓyYC`ʸ/52.L4h~k]EBUx'4(m-c꩞/NeI=ex;Jvoٰs/Hi&~RRY2gwS&]S& 6VEA!TC|D0AcGI G!1Q/bJ5] n33s?66[oss̽%r^~I#Ɉ4\FgN.C)Gÿv8#@NJ?Mú~><]o(_8-{6+lliq0+/2QvUELR-3 `QE aT3ol~y-,xø!)V!|>5X ]gŲ*r6 W<^kċSFT]5 K``؃ەߋrT',%^n^pvlndCG5v,ΒOQ0QߐCn H9{{z[k\Z2\ 7t;DJ \p G\V8 f5gFgXQjZ20.)`<UvO-aݧ, b؝ *܂ʂ^~H>$}q/h|ӓ&昏Ko/fBcLӫl^b| |ivzǀ|yqTRO ]Nˍ1DQB:ٰ#%nZAk\׷=JPqR NkR=N۶2/,Jh\<ϛ8еouUI9&ouzfxi͊ܛ̍#y#,v^gEmhv#0?ɒRPsb.Z{Zc@T#c7X&("BhMP#FYZv#c.Rw>v.ibVIENDB`u1f468_1f3fe_200d_1f680.png000066400000000000000000000025611326020644600343710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d(IDATH]h[чșe%:iNM`!vHdVZ˒l }$fwv8PX]lVBpgujǶ#Y*I輻?{y;o333C^n޼PU' 7Ξ=+W|Znk׮!N:j?]p* TUbADD >%R*@Q`i\kPո~:tؘNp}X, DdwXCS;*tGz?==MX\/ZV]O ZvۀW6-GSfH *U-m`zz`+B >YmKˊӑ+DtfgI_m_XmO`wDԷፇ`!&uE PUWRF) "F4ݎ.CAUXiyx!|7[07;r9ǟB[\ח!&r7cjL&3yl־qF\/wB| ;z:vrܹʁ4m`dd l~7>x V"Z‚c~B]J2ܑ,/!@ϰ3Hߧl`BҾNXؼ%u_޻w*թ]3(C!6p)%RF-}L&O˲( AX Mے,QT(4Mz{{FJY,oϟIq5 }~~~4MɍOu]2JVJt]'۶DZwᄄyp8+V nYl*n t:,IB[K_"~wMw[.85gF1NϒT2Oz#gr-3ϛP<513(00,LN @Eph,+~Xrh`͊GD%2.`[( mZ JN<+a^.^ J:~ٱϸWö1B!4@)EsЅ%t0hj214 %%n@e~+P7v9&Fޑ\˔눯g̕$!xdIGʓ}jhHk( b:&2:?E&UޘakʣP,u-Rw];9!V5]춱j(6N=EX gul 4PU _p+j2EZ%AEpBTA|MƩ\:\&L-,}~IqN@,xk .,=vv+@ ]:dU$Yĉxk-/OL&3QA8SjsѾN$"宮ߝ> `)X54=X/374~9 ק54 zK*FMW >YwH^͜5WxV&ku.ŦV C AzsѫZ˧dg2eX꫐||<)j2E͍W~USW`h W nUb^ 4Vp̲1Qb~j482Q9SgMgBn3$HL|gB#FzvvOP`+/ rN}w؉;{d,x< ɤ[J<S$=ۺ=$aZ=ޱK "v]ƔB&`~~~j"hDRʨZ|^q6Rlu1F)p8L6 Lӌ u{lx|>"X\.ߐ ]/|5FIENDB`u1f468_1f3fe_200d_2696.png000066400000000000000000000020361326020644600342300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlU;3ĮIX(uTJKDEUT l`U 6B$ De` FQGaѬMjGsfM Eίo5rL\NTx- Fa#PKqV]T*79O* @h3P8wR"zLբAϘp|٦Vq8u@Uo;'ۋ4"{TD~=^lFVe6H3=>ʠ1^ܬ!p V#+;\ݯWvPAd%<E]-2F\~bR#. 5XxYyaqq}ķyS08!ƘT_v³bvUP,صX)W6)W6X{]" 4ڹzZK6!ZKa;#\$.]ɇ pmϗ+ɌLewO;zڨ>S(Lycl0ak@-۽ny44GѣGV7o}&{ 1" GU|iS@\(⻨IENDB`u1f468_1f3ff_200d_1f33e.png000066400000000000000000000024501326020644600344440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTUϙ9t *T( (%FM$>H⃐bLADbD( b-ڀ@B;^2NϜ9gP;VYog_{ FR)6P~mƉFeJ)Hӛ2 @V\FIY-v/j}6Z@7RÃh>;{Vxn7$f/edY̽#S7v*i$:9$Mpb]<5D P `( 4 %V2ґbJ}\epCrgfR;Qt~!Q/ݙK5e]mO. 1s)cȱ(~jӖ[ymOr bXVhȔBNMH2qƘ eATD:ڮ;M)j;M_ƍdL[u!> fgL8}&J6Ҕu$: \+5tW*S6c>΅[8N }fikA_Va/;)f]XQdݾGK M%PH!6>DѸ`A v鸅Pk2j;K8j5O/.w~?rhtm |s>Xo|m潓ط=!=VΉ=vz&@y+K'=y]糲 ('i%8"lOl!X^14}~N袋n}tn&x?4&{g{WѿX?6#N0gwٖMWd=Z?VPm='O0eR=:*<_O{R6-^[b\07=D qWf: {uQ-џl{Сn u%2Wf&L\.7-E(m>wKAP4͊kiJ"P6gk_gpp$.鲥)' 4;,6(*!?} 'cIENDB`u1f468_1f3ff_200d_1f373.png000066400000000000000000000024421326020644600343670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKhTgwdmMFDZZSEPwmԂ`7m).EEM4AT#U occf|$>gu99ϜY#h],&PSY Ԃh}ȶnllL3 ӧGkM߃~Λ3v&L7Vb@vuuՂt~J)nXj {H-bQJaXKd)qfr/ y,|ҘX^tp$Ҫ)%}@) $!c؎ͣGDˢNIB_O жQ.ߔJ&J0x<8ؖt%!PPK&*W{I kO x؉#U+g E/ ~ph#r!97(ˎiRbtg @2yŋܽqMD)$b41rˆ΢vc^&2QQo8cGBO+gIU)nƍ˲$+HXV?Hq `ѐKd&YZ@`\`wGGǙj]Eu;!YPYCN 2-4dRsiqCG,,kjjsNֺ|__dzwa40D)áa46ERׯus#+ _D<O?طo_?@2FNԥm.tihh=9p 4$^.O#Ils`-4|q*%xdl97r[ìYB Nɬ]vT B+XPQʜ']A˗OE ?].R#GΝ 4gmyёQrq]w-@,F-Mե|mSտ`,nPZVۭ)Bj+d@k1lIt" Z m)VRn!̼]'K+gSVYWv,BXRIENDB`u1f468_1f3ff_200d_1f393.png000066400000000000000000000017221326020644600343710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOL\U?P(%4.Lpg&vj6nMܘ05M 7$.: "TQ*X`y3CafpVswޗh0x4r!)yQA$Ϲ\5QL*sɏ@nulߋsbJAbyޟ16qc 3 C"a uE6hZnHO&9:؏Arc @)D/"/--fG1;*0jU(BheWlwb-. 0f;i53 ^(VjQAk/?P@O3rc4ugΝ}(R[R4?ڻ3:"'h0Zca ͽyJ<q۲2mW,Nٸq7i+k\9D kI%A_dqCmG*ɤ*R/ Fjnrx(*׌zR fr+Kmʖ:zY$oWS;PF %B憆sV3| o1"+1u_>{'G^5̑K<$oZy~J9dmB,-==o_X|07]ٲ'q}^: jw+8 r(#fTkp6lfu?i诙@$q]%\88 1o/|BP:D>{2+ᅱ‡b>ӿx4y+ǣQRçO.hM6,D~OS@SSО͛YCWReC7'Vs~\q7.膆e}Fٶm:::;1vsf<;1L.,^|J#DeLkG.)(] ֮]; Rn+l]/3/fV.4c;% uu7{7?x|eVZ~u떰nnnf^b#@#Ѽ=~wN'(69ZS~$\ @=2Mߛ|/XW]߸205~)LNi-n4:{yd\֮c*Qh446peb[rJI"<]R9[5g-!k 9KZc轱XlR G_lP{4^a^Y7WΝlviGgd{ΈimF G9,kh6l߯KrʑkyMyzq0 I7e@29^*8+Yϧzr'w!Z#MήNQ}3YwR|nɽS[v( J,DYWUf20k;]0$QI ʢkĕ .Hܫ (1$ 6X+myu:;s\N[HY-|݇xMJuLCc>MO0*\<FZiw f%P*- %o|54L@vJ݋HSxw;>NɕRa.k2’B)4T%.tLeL$ R]&v6e_5g<X1\H(E%x\K9}qKS/شװ)JPIZo>f }v)>Hkc$93EHk:rf6l]R<-m׃+1䧧H$h^ŵUS P=441R(If4H ħsHf,lZ$pKڼo.Y TG6u2E$ PI4W;}U+&hxt Ǖ33L/A%^+]hA+H!n2EӦ ] * n.;S՟(q b!{qIM@)G^nWٻ?ٕG6v Eo.ĎgnV߯#{"+峏}6YiK$dGuP޼h8߾fM]:*޻ʫVʤS¶cRi?irf|(u./k=>72rlDb%K?s2+FS?XM[^p;h3;Kmml:C/ Gg$WM}}}e+ywpE硔b"Ss"1ҞŒT )% tnf`\@}@Kkֳ`D@YӼ1_6-H&4%!%B)!yA_ P{a&)^BMs9w|oGGѾРhxͭhb&9L`tU)0ﭏZ4 Kא͏gd@,niק 䞭GѠ/ZH3?ISlL`*Vax -lj̅jJiSw|s~p=]~꠵!V @iGC4RO$N!0i[pMA[ft57ܱگ֮ؐ-.7| ZC`@aQ&Ypxm ¦7z|놓Y'zbrLCYlOu^e&}-+ڡ5?ĪgoTG_:)+ J3H]&9\EO*/ @CWN!3LC21rfѤ)Z#z~ 99~q]'msK?뀽M*xe\XDŽZ\&_$_(p}y}&E>tw%Q7r{ s1Z@0 fӗjDg^W.qPY/i~` ɚP2!TwUS'&%R-'jaE4_V38f29Z ȹ+h(!)ӪpC3,'P)E^`8"IENDB`u1f468_1f3ff_200d_1f4bb.png000066400000000000000000000020061326020644600345160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKTESUѯf &ĸ0`L0,HF7P7nL? Ņ!B:bdx *yȀlS眯s{R?ݧ(FI!^QH*Z_Dc>a'-8`7?V[-L:CT UMtN?!}77 >{<)s1b {4C\Hg07UDҗ _`ސMn1Kt)B2AB 6-ipu  W5n` vܖtW!NsmiKUjwG |t2-Ȭ(,+S(1@k/rjI^2 wVlL4c1NسuAQh]:9gCloq}Sj 9 P{'[xQƐZ{hOMM 2w5#vM u P9SwGU4.N2jRYYKM[2;HhBZm)K}sq P=]haԚM@EV P9GڏRn0}a'y2!%hB-SWT &Z F :(lq8sv=l٩7aˠcOɇCm]̝I#xww΅ R1Ǒ @w<8Olv?FGFp76 ;Cik>4&PCHH$sTKใm##O8{ѓf?_^buwoVK^,@|ພ9jQ`X6`ħ*䮕ka'Hh"N@X8ulie{o$n!W-2Ն_UHl7gߟ8^^<6^@QAQYԚO[щI_ߎk Zɣ|:Πk'.ajl?؟hô>ms@Q&yķg6m +7ʙO %zx=xpg宠MזO2sWt& cbaVRQq7hA޳4Q5Ö@+CLZr![b}I38앫ݿz\q 4RO"*p` u/kCo}vܨUql.\bzzBS8Jo;\>oM;0~lN!l48{"Ju !WU4A`pؖk^)%$ū9 DjoU%v_Emc[M7O3IENDB`u1f468_1f3ff_200d_1f527.png000066400000000000000000000021631326020644600343700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d*IDATH}hu?y⽻{mεfK !S!"G*$RF%bp QP0RYj{c:>yN{Ng3s9s~%-WS`^uvv)lCd5`wF 㕎 u@qiTWwwg;^DvUUU&X `|U @aBӶ=@TgE4CX8b;cX29~d UPPB]}6j0-KDoY}[J 䎨zjuMIWpypx2/*Pi%#JLt8x2UN5򂀑ūt]H*XYfc$1@8\s+FK$HQ,37T\^ݺh,#Ǿ<eMa,>l9r1t)4Vd̫NdDU^}8PAGnv];9tv2*HL'S$=gcc6mp1 R4-zu oٮh9ׇFpڂ?.93z[ܹnE.\D"Ys>9#neQqLHAӕ^DBM9jK7bFBü+n $u{@텎*<6v&'wq7vJV<'yyiSfoZ(`xTV)LnμY?ݮS\Q?2 2aN`2_1ksๅa X$Q(`?cfvfv釋sw93lb@K qd8~…OF#cL,8/`' ^`x@"di\D2/2V/CWr]Iƞ^M&a M̈́D!o>v|Q]d*k6|rpT<5:RS+ Ğ_b%r{2ъsJ}r8pr3#h\PR14GSF} ݐx0Y|=$55V:k&y 0* /@PD䔣RU{~Ʀ/=RP|;v͒=o.slzԌ1V.[+ؤJ$;~klu׿;}o{{{1\mMilvY. LXR}*A<{`FROMt: /H:j9RJ% ѣ31==m[>(}4Mڵk@  \=ysi/^hlp]+W P;R ]3g~[.zx %\Y(BPKM-$0::J&yzrro޽۩T*=EB@?(lVPTkz嚥x$DL* nn[nUQzܲ/6,47&ZrVFٯk*B|>?O})Yj(r>t<  W@,9m|)B:[ސRvmf@U" ǡᬨ {p;4>ZV2 cT/%1=ܫ-.DRrR4D1]([dիWc/YZ}F"a!K4)˄aX U`mZ 1886MߧO~Jዩ$jضMAhaiZX^3<<۷o?zf$عs' q^4l0PC=ξH$FSVI3;+U^ N+8p#q]jaD" rj®ixR|75oJTIJX8FuZFL&eY$@fd>IENDB`u1f468_1f3ff_200d_1f692.png000066400000000000000000000023431326020644600343730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoTU3gf:vN鍂[D(T:JF|R#/&F }3 XEKHL$KpZCb Bέs=goN)o}{l{}Ⴗ_(p c]##zvw%5s#$H49 L*Ԉrnm8??tR M 0NM¡O}J{_GpB!,[i2h{$ 0 cODn8 Lt$“`"rYVi9 UՊ3ԶI*lT ЅS, ӳ#tz&Wpqh5_ٽM/覉tHV`TE!JHI4A)bסޕ|j]ǃJ)R$RT{M+Jl_ׁ46BECֲ6-5i褣qvقWjk; %\?ضLVyo1؊at,|vNEk%KVĝ᫩bc`1W`|.VF0u~|MLl١5G1M{C`(cxn ڃP"'mҙrLE/XFUS!X)۶RtFbRdTۀ?m4D V,d,f=nLc#$RlIrՕ]r J&I.fH.f]Vr)Me|>X$D(bl:t)U1 ēx=}OΞ4_{;ӳZVnW5C(2aU[Z4tk~OL!/]{'ߙܸ@סk[z ʡͪJ[xɓ\k|9w.Xm@I*45[w߳{A&ҀJr^{2[> 0m0a. Pr!qdO8Kt޼/PM/Ϭl[B+fď O*/kÖXa]_ 5+v ,Ľׂ:(4oπ=,(U޷ˑ{\,}zhIENDB`u1f468_1f3ff_200d_2695.png000066400000000000000000000017221326020644600342310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOhu?}fMIdm]tVe08'ЃbA p0D6Nc= * &T4M4I?պ6yM}~{g$jtBk}TDZgMkjnnn ȡXyĬ!A2Э ;z<;6զd-[VyTp+{1NשZ~H8h+gK-5 dBn)q!Fe ihOǣJgPr;:lSlO2"E5={mv~z8u"4)uy0`*ܬ6`rzfB0 s{K ro DnNNLbK *[U7vZWv[Oݘ&h\ڍ8m]Zq99ԩCķ{FJb{ SU[ƹRolRJrJC?.1Vp/.~f쥑iŋ26cGgϯܥh\<ӊԢT*RJ}~+y=$01_˲T$ 7c}t|.;388Xk"yqonq!;(YZ\DkmoBs{yRx`xܝ<{%DuuL%XV>A6&ImR}ZkvQըj,IWS4e!"az;4 x*I4R\K'WXKzRs "` ҄ n:^mD~:[npjToq0x <>^-Vh pa=i66tB]R95N&lT Q?)!lv(;B{zPU*{ jJܞez!CthLv2a<2JgI-fs\~R)Je;Ӏ8jvp|уYB 11W&0M!.ɷC&Ԑ/rSxaFbKV̞FS/o=ϥy-!?o._[kXc&4ON'' ]4E2+I׷[\#l(wJ__Q%ַ8yKb(IGf!%DUHTuUu߁NMʼnc|uw4IENDB`u1f468_1f3ff_200d_2708.png000066400000000000000000000022461326020644600342260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d]IDATHOh\U7o&3%%:AQ҂ jEAD R)XE.ꢢѕp&0L'ƴiO3f޼ׅ$&LYsw ncT*~rRY)RWE{uݣ !0 PӔRYMӾ4 d:zzzSJн%"ؖ❣b$Y d>J:R>׸CS$\ΆHBw]VNwim>s&_>R+vw+rp]{-mD""])\#d6iT:έb( bRGBR1[ҴLKdS:0uES8TY*(-f\ X^Ѫ uOhOi|Fzb?()Aձ%;ʴvo_j 4$ɇ"4>Zm vXJDŢGB$n[Fzr|S>'޵,tMq† bUTvu`h3KHk0 u5a}["3 L.>gɗ^0ֽ4/`vpbQ:QL?etģDmH쿚kƓMwJ* ea`Buhϰ5\!b\˷(TerEo-t*6i(X*㳋\_cYaopaa?}x&k9V[ `}GgfgP2oDHsKn4"x<^vvoݭ E^;~≯.lmmJcBY/-4S)b1* RJe~~Au3u""ƮBtm)@VB!a~~JSSSr9*l]74,$3/IENDB`u1f468_200d_1f33e.png000066400000000000000000000024701326020644600334610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHTklU~9Wʺv[]@t6rx!"fHT"ILE(bLk,* k@gQ u[wk׭ۺ޾GY]Mx9<}BRz4+LyA80%Kp\Ι.fhpA $-\|d|$9 D$wKAS7_ٖ`*H%2k'I(~hjq@,4sqP%c[Dpd'O LR@su0 P.iv*$=$ -.oZ Rb=~pAVT"a]!(#z(EE륰kkk${8 B0Il Îp vl ,HF@A(9 ->Hm '݅x,nd)?4l(Slk{غN{ٗ!=a<{{Ꮶb jQ6s^ۈN.uOi AŅyEas9SnR[GDQ[:eFpDlp:EAGr6*jNYLh'% ʰiW*GYaޑXTN-0;4skw?Vߔ63}Ǭ{Q7􅡪 7"fTLc_~L6Uكm]gMž:m7zgLwd et.M5->Vxe{}cVtݜ13Էnn:`_ىPG+MNZ3.3Krf07$J--]J̹랹I B?[U1aKό/(\C]װ3M0́jpv^C_;M(Gw;HQX1S I^bM;+^%왊ٳZ F wo7.$6_F'ĈphB`QMbҜ2N\zy9yйtVx,& KUz/%Z8] iZ=T:. i 5@$ ؤxQio#!],M!: GIENDB`u1f468_200d_1f373.png000066400000000000000000000024111326020644600333760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmLes@0|IQB94朥ل,dA7gk%-[Sͭjts걵}``06_~wT<קy܎~(>`w"$I`H Le%@{G hzEqڵf ā18hЪ18xԗƑZu<4@A"@!JRZ+m$6piL㫬qX 7ARJ\%J.PJH۴lP:se5ЖT:J4#Ƕm,B:ÐxǙ9A<Ďlٲʬ**FZZZ.9 W?'H)DN-HB%]@J,KvVZbm*/^|G_Ƨy[,2OJ,bptٍm'wˇ_?m|=N:F|H3|JQ^ =ݒSSxuu]SSuD?\^| ṿx~UKC6߶Χ4JIFJFW__^)/ v/0sC0ۚ|f@kU'T۟K_lmm-pV\׍+6L@ )7bX +`3_ Ϫؽs$/?VDss3L攼@Sф\_.u7}"}x`֭lCyy9@=ˇ0ь\C3j-~1B L"CA8K(,,Dq]4H,-: h7uuu%R~0͛7sN455 d5({<gV^XƊ8yi#ޜ=nn}}}p0 ž<~ z{{HdpfMӏܲ9<+^Q޷K$)nNܼ/o @G4=5}< ܗO"RrqqMe:Hy]llS#IENDB`u1f468_200d_1f393.png000066400000000000000000000020141326020644600333770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTU羯BeJ)dF*Ť$(&&10@Xq6Y2Ƥ !j `0 6|7s tT; M0::f^_c%f@~3 PNu}}}vլ5Z sL"]}rE˲n8Sp{-9bYhXVB|P*Ur`iI`nx}`+ژ lЀn$-cӿ} Jٶ\7r<;J_JVϡ=%ڻ;htbJt:Μk+E-F-6rUDp_nTq7p_nN8о2DVtX4eY`,#=$~Y(-l[q5OV.n0ۏҮ7TcLۗZX`z1 N#Zçzv>X5\b|1J%wC.pשkb+M-Ş-gƧ$K]foJҗSSS65ر#: :[uu_@*.'s][_ZrPhR2OJ&*r `UvEQ_-ܣ{Z6Y` p,Y>c;-)y= 1HtEf7+L>ĜrBJ9v&Q}x6.R'F^Ldwi{M`9RڎTonn~Vח( XWlY>}I$4P{QG %@թ$ҵn5zj%ٹ!jj'_XPkmm*RJzn*G=3~Oihё4l&t RʹgBd*㔚#-#qp~eFAQB,`pDZP8. RM\X?WBLu&IENDB`u1f468_200d_1f3a8.png000066400000000000000000000021461326020644600334620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHYlU~7)3KӲ Hk4-aQ1EؒT 𠐠1MLİȃ`C,HbZРCtNY{}eJ5<}|nl"Տe ( MSZtk[c}z|Ub҉@,';{!^|ҪDc\ ^Y|^xR`J|rBj TMTos ^=! g|@ƿЁ L%ӡBLrY6a !`VYQ$PL05S9mM-COp] K=2qӝ4q*>`xTP^b-{W3ps҈dl"CAJzbo/˟-"\=NN]ˠ %>gJnX\¢TeLj}]jezL=X`tWsyiˢs>~w 83M- nFيHX$LsvYFZ^EVy5m źE>^S-Ƞ+YqJ|t88pl{D}r;-f. =M5٦AT2?\}B(K-7vܹ~6povm;q0v/N^`-c;nDaO=PxGdwtu\X\Jݗ0= JIx8 e FVm*#qX fP3jkkC y*EԸ Û\M- *g"Ę>#Ji,>:4iSϤ@"Ym(>.QRJ ɨ_]I^^;X"a~PgE*q1Z 03cLpAh5AO.ѬTYz [}.DMh)v=NOm]( +)ˮޢ`/VVm<@kLIENDB`u1f468_200d_1f3eb.png000066400000000000000000000022661326020644600335430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dmIDATH[LTW@׹sTIP VC5ZwrOC!#!\PiC<!婀U|gӕXh{^׮M\@B2 V듃+Z8g<HNBJəmΌ3?3;aC#3(|0zT%)]$q "P0 1Cx$]3H}'Bd* 7HZN_1t`K"XTb($8!P$jHx0T"P?= tD ]'avS7KDjOuPD"6U+#0ˈ1VgwjM:re% vM.lntѨ,ZfOxv0:m$MmvV fS LsB^Z] e _8ʛd+m#lZu7I3HAi%Uqߔ 8RK @("h y& L.>,M~p2r'l+ WfA7]!5IPzÍ/dETೞjԑ`J/}p2tcضEFIמJ6=h\w##>)-)ӊ=)fC?dl9|,K(ZOtۖ4L^ɋsx[l{s^޹aMqa@]vJ6w ._?'$ؿ|E/ml:u`L7жIyehL=;wo^Wϝ%z=,y* ]qwՏŰ,l쫓V6А-}2p4c'toѕzzUU9~nG[VH4;kۢ䙉WҨ?!6EOPZTX6JPZ56ja{f,<j˝8c @J1grYRJHB4sRSEmEUJXItLLl _~H$x:s )%[U,jcFIENDB`u1f468_200d_1f3ed.png000066400000000000000000000026331326020644600335430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dRIDATHkl c&Q#BREWZLyjU/m)IĩSLSH }wfn?/՜O9XOGݞֹf:oтݿ͛7rOɄvj_f?&lغ5ǎ ozEY]{ʲ!{mC '²JӹO9w=SO|^x^WY5sX|}] 8{`[GȂR{xklغm1Bnh0-b1 @%"%d3prqIliiqTд% v@ )#LFFnt)%C.\`d8WϞ JM_{SHVOtYj ;p拎:~X4ʴP])m*K+'ЅP(AeQU1 ;ܙNz{z)lWzHx}  RB(5X5.CӲ.Qcbp88q?x:*v35s8{2@۵c i4'>NrH7a &xp[A븮"LK>heE-}] >z]{ _57$Y6oHp;٬42;^ˌBqع k2v:h;hctO/^xG>j:pyK \#` 9dJmP Abe!K?a#3ԢȁPYg]~ C̢c$ҳGž 4=\_cŹWJĚ $?pܺ5`e[YxXٳsLڭ71A*o;d{&ʑOe9yhMu_V\ (ʝxGbTh^W5ZYϿӖ(__O`^YCJѦP[ 'Q/)t kY/j77|ad `~ K8"li-VcĭWW8:h]T)6Ϟ3˻5|RExb(_j7ȓ|#{ѝ »n rajFq啊Lk7n^!qG>-IENDB`u1f468_200d_1f466.png000066400000000000000000000014621326020644600334060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[HTk_ftt :iJRRflхHtQT&ˠ :\DEDQtdC7{GD;PtBМ)ufuaERkVM_~o>G/_\KYKN5KImG/^evNQD% P]?+ 买:=ȥk7 @|D\3%z0RDQ_3{kz7}ȝ9rʙŽxKgI$!8@X6LUa6u ׿嚠7T#ZPBJ RvYHi0N_ *Q8a.%/PMKqPžm,;4h,(c]hZU6C"~@iVƣH+?t0dD2+6hwxS IENDB`u1f468_200d_1f466_200d_1f466.png000066400000000000000000000020401326020644600347520ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[L\E3e/RA MH1m6Di"KAئ^c胶ib(5]yhM)@u^=nmYh0~o73g2ŎzhwۭM9{?tjyJJ33K(Tߟ]3`۶&rci~Op2\ tZs(\%w䡯4(,PT`bധs 6Pdi7aRe-%xJc>bS9*KcWJv4ͥC|pK(liڷeпf@;SӃR u[JRG6KC+yzLS?A Nh[fKyjϚ;(`Fb IӒj{`EҧWR;`k_M):ض]ۥQF~쉪䏱Bp R_oܞh\ 립xtB(|ܢ7 -K|B𪾗 [:Z:N]mt) iY<{h˺HJU|=W&6!v ]pқ3D1jsY{4 J&Eb?\ŇNR@c}BX\4tɥB\97ۊ*,6ϕ괓ɳ0Œ8-F*jx`na ݂%fMPeufJ M:W6-2-I"o=8 ؼ1Nu1밧?C+GoQ-b0+G.ŗHgN'h]&WX] NrOV ]PP㊌P6DR~MDy+4Znlo0U q ^Q7j="?deHC6X~_6At$oPжnj3!(~;>LArіy7#bN{$\OiO,u. \w/VNY" "̞M#g40 ̏y_uyg: `{5'\ad;9VQU69L˞O .snb,-?g+d5=ѳ! c_60/ Sڙ_AIMjy袠R/Ǝ/ N]nwP)H&Z|ܼK&[ Q3&zU\;%C|"| k- - \"{m?|"7'gw&KIΑ釲@ξ~L+IA%U-TrRt=t;Ds)R"Bt?3('E<3yD֜YL5U'~G{7 bJ /G63(d;S 7)`TreWؙ0\vg,![F5IENDB`u1f468_200d_1f467_200d_1f466.png000066400000000000000000000020511326020644600347550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lev[M-Tc@L `R[0QĀ@4B| !/Fy)Jդbl$U,-lgٙ9>-{w&Rד{†c7 [;w>"=i"*0Id Ԗ}mʕ򲨓Vkw6m:g5tOo:cCQPV:/ | Zɬ!3ٽwɤ'Wޭ/[>"fh+OY>F-ݽx$:neoۊYoFDPnGL13u);39-FYs׀8ima4%g#srA4}c&픯hǺڈ]D0ؗXntr;O%;+nn̉7#o7uV%!oʧq5o!(^0PM0 6h xfmݝG] ,en<^ώ_/MgO!Ǿ-q5gh lQR`L锕1 4OsnIa Tlh Cmg}m?Bbӡ2f2?tl}Yե-cxy8)ES Z| bS'r LҦ r%O'z7uޕKb|!G}ɢ4] rj!}7U*sjxD?KK pit8kxp<}Š納Ͽqǎ^^ 偻NSҞX,fV_ 食㿲!ZlW])]LMN_:Jŏ/3yRj4DjJ)XM'`OVdKA ힲE BY@Ht)jo{yfIENDB`u1f468_200d_1f467_200d_1f467.png000066400000000000000000000020361326020644600347610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoU?_ivu/C!.- B  4Qo1/܀W*12aCS$df1B$Rֲu]{yЍ\>~?ysr^~|iMD7s{]TN6uWg-3`׺h_(wPWZ5gWU#)N[pBtY[@8l<6MA.9p,\.!>Jf  mם&yq[}^K$R@ Т7V\*y6nŒN:.'FDkYBLWcA&)"B/yxM+#l"!q'-m`${OD! [>I_/\lk*DstI;-ڱR7-슔SXaR9v}5[ n'C.O1 v>RN|_ͧ;;Xs,ĄN|dwE'Խ`!4l!|+엛~hY{N]x23Q?9?icwg(r w'[@ddټvYw9sqJf۬Y pqTŀ*jqIPnܪ,C)sV?`}~79䅺kT׹~M ,iK'5kт⇂s̫š٘2̏d9U~r%祱b + X7#=[V˹s<0)+?Ov{ÃK==|;ݶxg^L$<0BW[~A(H{<||s_тKyk82?Udogu9/Eh;XQDI&yUE{׀Ѡᑨ:9%99`5\ BVJuaT-E ){o4bgIENDB`u1f468_200d_1f468_200d_1f466.png000066400000000000000000000022041326020644600347560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d;IDATHoLU?y˽prW(9MMa! 6 իfi%m\V5Zkj+M1H؂YO4PH>sN/>ukw^K>lMz&e-p*pM)t;sF.6p -(˙@Ok{J{W#)Զ8X- pBv^rHBD%uV!Pc !OdoRlը yQr#3FQ8^6Qon]AVB6At+ww}d͓N(! r F&xE( p?JSyJ-Ds>́K,0+9O}pe<='~lVPMc]E<մ͞bwī\EYBQgiOr2Ñrjd5s9sSd 4 qnu~`s41_F֤ڤ~%dPޭJc&IENDB`u1f468_200d_1f468_200d_1f466_200d_1f466.png000066400000000000000000000025531326020644600363400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d"IDATH[lTUϙt:i;TR@ڦ\$H <TB4R-R  \Z\>N/ֿ͕k}غl|%4ݢVmmް$OØk1F hW[+*CyhgMSf QJoߩ/(lܤfĜ}*op4jr!~=([X(L#)$E@pcYdӱL}{aaND@S$8 \1V)v'1)?inXL\Nѧt/ VKO$M^k:)cY1ls(!8xkU{A*.#G1TvP4҉w',jDݸB}aڂ_$kW)M5JwTvt>.ғ4v[8&U i 3dEk4r u? tmR Z/h<qq2]ߧR]o}Wr *Uge׉T^pwX`X%+7d !JjRn/+5Ō6#q&s׋0N"Oz+;Jk\i4w)9q݊H?P>X7*MieD <2"`B8@?![tgFi;g@/^ZEiL LU OdHL D}1߸ mz{ܢʡ5+b1K"gQm1@Aj{WRoCgOr@gګы+浓 J4ڸW<2%` Lێ'1@wFG6.%v>^>茬NVf7P64`V\9cKHvIܮӡKʜ"f}c銵S׎$dTzz )- HLedz/rKzB.ko\lg>ȦbqձtcpOj'GUDԦMF`w+ixUr4;?L%E,:C:=żTOGLv&Ft 礱qN>5&oelΎbRlqt3麾K(udf7w /dtgSB$R%3mt.޴4Rlqc|=Pc }߉Ȧ[xZZؤt8z%IENDB`u1f468_200d_1f468_200d_1f467.png000066400000000000000000000022051326020644600347600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dy.nwP^qLx{lMbUuRߕ,ů7+iuB˦Lvs}Qh"w}$ %\@I*BДbh[u0șY؆JEM+{9YPptЗNZ.f%iT6'o'E,^,&MEѶ&oo&彬~b4JC{nh;O{ d{^r|S"ݩ`bG9}Tcoπ`鬕 FXɴ'K@+SSZ6=_{D띸NO! 3 &r_7xzQIENDB`u1f468_200d_1f468_200d_1f467_200d_1f466.png000066400000000000000000000025671326020644600363460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d.IDATHylTUf03NKk)hŊl.Xk5VP\b4KNq!bD$ 0.` Z(i Ph̛aS M~9߹Df׻" .úTA,ѾxMiW9I[Mڏϗ_o"pltYqR+6lnF~UK鴕bCk;L'OC bQKC @Kcdx' jˁOgCLs%Ό…MQ˳{-.)$@!TH T`Ia݆k) Cp.J 3ɬ6h7{MǘƜf# n@5˦ܱ}WzY0'{xb䆏8Pԟ ~=Fn|=(uBۚ۝՝5 \Sۅ@gQJۯ3WtV>%)C}~`xI+pP/*1A#a)7I{mWF,@vv|{ر5/{XZe):@FtW\YZľHrC 0Nc%nE캕2v@N Fv7g<Φ.pADLXKjh)c,}kh?z| tK'ROٵh]d' >b\Rkk-(|Tjꗞt3iUSnxhG?L W383<UIENDB`u1f468_200d_1f468_200d_1f467_200d_1f467.png000066400000000000000000000025511326020644600363400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATH[LTWaA Z+bD*T7ZmlMMkڦ}I[yjz6kFV`4Z^ZE0 (8̙sֿ֕ sȟ t1ޮD_PB~X격4B3!hh1I?ݽ;9E9`0MuR͛+.H)Ɛ%+p4!B(VϚ8(/-ZO#)$ʲL`lod죱]UZm h$.An""a/)*4$q`&.A3ԣl^QxuRjθ͆}Ln'7?megl%TL>2}Bwrk5uNߢxԥp~ƨ)nRSrk}܍;`-+ ~u[Scn(;R=$Cm ALmư3Gҗ#ħabtcڴ櫩b!! - =gӍaG]J }fm5p6|ƅ+=Z& T?:~HcWڠEYh 4>BLRSJNNjz 0AԄm(hl-BTVxЩw/$s-ݬ-='8)mMu%:j JigXӃz!TU [M7RujQT& ߾m 98]^_s WP1MB*v6/nN-)0%M{_`,.Z@%6ʿ`mA>1> nǼֶHA>@/&t˞ǚfQI3SI~! f2[LNSS_#ϳEtJM4zy I^nS6O! -]L{MemV #*'sФ xlO7 ( \ chB1iX'NeyZ>2/(/~ǣqń0 Eu&Xc-̐bGںh\&9zP]F\({03қ˗'M(dù%,3KbK4jkpt;->#y{Zt!o;-ʟ|UNۈ݃0hAPM(U\}Х[[jՆ&fP9t{z.tKgat$oΣ"@r P{CdIENDB`u1f468_200d_1f469_200d_1f466.png000066400000000000000000000022741326020644600347660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dsIDATHklTEv-BRJق*ТҢDƄAà@ Ic,zZmBtv=;e[%1MNr773gŶkmVs!Jo3އUXTJE/<r"|OuF)=FGkwEkM1ӨeNܛTC㈏w>;2P^-R-> Zd e1ر  Q6#ZuP)')J"& 4RhiAjkEEPcR̟nWH ,|LN/gҹxea9:ÀwXDg ~ x4m:EݞS"Mv.6:)\yW3شZyb~Ms`zv$}w^O+DnNgy?;O`Hr') !P2OД,FAz{.@W#`]]agL? )TN;M_$dW|h(!rxh >+{Npl"[v'!5f@T=ٷZ>!{ri1}3He֋=~ɉ99U6SZT!(7[3=[(yQС=W 3|)5GPG M.T`6fwe35[^@ڛFrT]=j5QK=˾?}/pqXJ㕠[W?8%X,E [9EهȚ䡴AMa :h`({Źl+nH2Y^^*neX-\dzl]fJ q2VĂ{>.oQ~\ p'f RHjɩZj]%|{ Kr33ϬEO|.4 $S׌p ĻK| lIFm6mGdN.Z*]p,FS&6;Ĉ65LK);IENDB`u1f468_200d_1f469_200d_1f466_200d_1f466.png000066400000000000000000000026631326020644600363430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|djIDATHmlTUܙv:-l)o. nQJ]@7Pf&n$Yc®5&"n l$Uwb P^]ii;۝{~h:L[Or{{?y΁D͛]C.gv%I˸bc~ン-x\egRK !*(=n xv}㽠>TJΙ`;ۛÿ7 G)dLh4D4'?|2n&;Z[/OfUB rOox Xy2lʽj:){lYLB @ XCϵi|@O=,_4RFG.+`ۖe.9w 'Zgnu 6ճR v&кCROKs7L>Ҹjf{~~ˇ{'6ͧ}lka q)GP<<|.gCL)r\+gp{?5=e2icZgC}<#{(g1| +,JY܎)*Dfqx=CX~ی\A?`!=6n߹8ddLpSj$$uJ88z.TI(S=@7!Bpo| NDd0fcCj/gNȔNˋBCT8Mb {nvY;w_|+xu:h׸/uWsjVXT4gށ` 9]&뚐\b:':,IB|m` 0fH79#O*;rIENDB`u1f468_200d_1f469_200d_1f467.png000066400000000000000000000022651326020644600347670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dlIDATHYlTUNo龌eib%@Ud)P*-jLLĘ`4&< FS(65 ;( EN;mgCK 3%79|翜!OF uG;C+!_Z*$QJ=`PyNLځᄡqPǔh-ؽp]b!>R i F-}RT!UT_[(qoR|<| ZL8c l}p:P d^Z~uRjWS& 1>DŒVHQd1 R>()I cCl.ł9>LS!^eHzG52i:!_rufI9SE`X\o]kw҂TH[;LZXKSW 3~u;ֵ^7͉ l)Ŭa-=]j=z%FH"p) n dsތs|+lI7RGM{ų}W l*NFt b6#:qPN !8CFN` fd /J oIENDB`u1f468_200d_1f469_200d_1f467_200d_1f466.png000066400000000000000000000026441326020644600363430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d[IDATHilTUg:VA@iAD:+(AAY\LQ4DQI41F`T5RqAVT0VH´N7aytZo%w.&r/,[f/Y3WX ]OM?6?8XLJ)ur)Gf,ond6u>0a5J!`B!Qnh}|tcou<(\LТR(c`Б%xk*jC쫖kP)uiG,b$ߓnSHq9~_ u)kty.iNf^nWH,٬WT:+wG@ rD:ÀӆXЇcR]tBxJBl._ZyOQW 4h@{{IW94{N.Jhڙr{Sw@X$ PwIXJ26=v,AQ]w,oGehJ̾ @_;q}@;lUH +Tk cHMWd 7[>j+OFU}?:BV^VĦ^B8DjNyVwLW5/2oq<@j/˫^{G<Xr)w=lY!'mJTlOn:goJm79^<}0ph/3js?|(uS*>-78Lӎh56vx`-][k lEJb3hcpƃu Z7 Xani&f7l雬Slu Ԅ0Mf02J׍}jќ_Uo,7wvb?FY6V`>I:FNMyIOQ1)Ik{!;ȘR$ Kt|!-BNMqOU''%)+vםMWŒ؋% 5%I-D`u!vmˣk*4ֱJ0%!xqjJ|L Ce ^Jmy/E:1&J:ROxs6̋ 褂!N~F#6hNyd26>t53ϱ.+ϗoHP_x/S㬹~wʡۈ8/˷KYܐAxwg T͒_ņ\Oei?ɞy7?͠7y?'|n Se$z`UJOI27 -=\b XO3HKHs!y)[<4qf[wZ>%VIENDB`u1f468_200d_1f469_200d_1f467_200d_1f467.png000066400000000000000000000026261326020644600363440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dMIDATHilUE3-}K7Ġ Z uU, BZM1"h+&DhOAԂ[P[AP"e)myt}+ߜ&wΜΜ3 M$v^YTzL(j4zߟךxeʵJ !?L+nG)Ytւ͛'U^3 RHKLh4kWb5Z_{0nxjoDx$hQ(qhϗd\|O!P~4$`YZnRd& ct(иYQ C9-DAdJ8 u͊ XSȿ"ڱ'?R ؐ#3 (u3zIrFwa!nVh;.dD;a v;i:~*o?0/y]<\}IlYSE( 01>,@bn2R;F$A+ rto8t?BS3* !'LĿz=Ïl9z4 N.pkQȠBEn D#h1̥1R5Xm8pΛ;3ض7NNw!5Gy?͉Hu9[Wսo'rW[{sPZ Uq[v ;3]Yzʖss'-p%tĤ 2!;7AObjYh(t=ڠE}]=qN:՘5Hy_dWOfnlnm>AܷFzK܈98 4> zS;vtDрqY7q*¼yKS>EJ()KCbUL7)s`L #;,$YhMw1{7LRR6B_^sFFq4ÅcOgtoYE%kmIENDB`u1f468_200d_1f4bb.png000066400000000000000000000020531326020644600335330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHsUt#2& T+6Q˅Ze , .,ԅT!\P $u1$Ȩ˳{^=a}'Vxt fH%g.Qbh1 J `%߻a2ȟɣ;̠!=78GdJ 'c!Ѯ|}]Zj< [KjŔ,+9w% N0.=0_d.kak.{H,8NARLa`a;6VDZR`|טioP29T]olmpnXHP`_@tdk]EjIv(}"AF0 plOWp 9LO iҧlcu5W2<7xo, ;|wrH?PY1[{B$JKhP mʡ c]ɱ:%uc$:yW+x+ԵY"y)x.Ok,܃=CR $rFyq`o/w&zEq'96_WUU9rE(y۶+ cB }#F ѵ/}{3 LM8;">vpHiekSݝeKqɓ;\!X蜹'̥uDf7zĥ Di`nxf~ UvqϲD!8n+.37d*K^jjR>Z%~,8q3ߒ@): V@9FVpq^>%at}Ϊ n|^>Ƴm*7']JNz s@ܿ&(-f_(`IOֻWú ٕX>틴4Y8$g+M|K3[t; -fa*_}|ճ/""xhyJ2GgWjp,3o>@SK;l"?s}E ˔eEagk;/Fj):VkǶ*w)IR۶Y˯nCњ\r֊%k[?l_F|=|:6`QL!iEQ% \F4j]- ;;Sf IENDB`u1f468_200d_1f527.png000066400000000000000000000022351326020644600334030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dTIDATH]lUwfvw](- E4"1jۍB HH0_1B|!Ƣ6@#Z-ĥݶK tw>a`1<ͽswgla/]+PAK)q[Qu0 ?ꗼ `5>$U'O?`CM0[<5bR廚O{rBwS.ܻaRϧIq'm /cY @f Hm+Ӓq%&i~2Dc CQᨂM nr&"A;ByxFKDYq__m-@ZH{UM;;y'PDu 8z&:S8r. CO5D!Ӑ丆=[T85rt9>[E쥮-7 CTē[=R צ׹ݥ껳tux `Z* DCџo7N}O $@o smP$E?=ӎH2D?e:ܗ ӾdQq1NCm.q3icJ.2[H)K?~)! aqG%+RMbQO8ae3]ζBuY nv5UU PǦU!sTC L1H' pTzoN$!0|/ߖ^1[4Ca]2kדRVo^c u{gg}X_%4\r`z;S|uE.^ԛ_R'5gwyΆ,WSuՙ+MJ槧>0t LVAqwj"qX]Qٲ pԒ~@Ye6&ƅ DLL b"nn "!b`_tJ[鼾L@ &ݹs΅YD-WZ^ֺA!)ԯMk;"ݱDa k&d'{$}6&e~GZGjFʼnS?=M.T.p%ޗ"uZ.{/:"(\xHP@a?n.T6ÊgWYYbQڠh%-,']r"4k`Wwo]UKx MUF i(Fǐ9zrN?xAUy*NOʛ 9옃)Dad]-A3s<.g9wؽI0l(TE?=l?3_v$U eMN87PxOtJ͖x.–x̰X-/(8j9s¨|*q͗vMd2;GG-n֍z~=.cB?CXm+45xWpg2`֚0 G^cK;N~lq]t:1M#Z}]aWe e1ߏfht%R(qjXݼk_ ꍏ;:+0 +r\ZT(os"9Ct4*I` łRXR5L JA-JFaޱ0 Fb(J4& *UHbD_|)IENDB`u1f468_200d_1f680.png000066400000000000000000000025771326020644600334140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d6IDATH_lc;uҖ IhITm֊JU5$M%jqZr-"DYW_pd+BU,\7ώm{pbb5޻s<Ĺpc"Ȯ@ !D\3cccol/~qܹSWӱ@:LOOŋ̯lvy7>vXFP(H$~}U0p]_M}Ɗݴ{2,jUz(3EQ&N8{MӴQjVgas%ѣG_T6C9gϞ5,rpxFoUjs'E*M,e 3^* W\!{eEpm;5 wXe.`ff\.j (^]ʖ|p4([ htb,EMD5v\cnk6[+f}BS$RJ2L=@g GyʇG0c14Xn#.\S*\3uM>%j`[6v 704WbN0g!\6̍FPȄBDŽX]Gwʖ/RT TFPkb2NSh$ݎ'D0}.&fv6`Og+ {ddN &&&> BOH)IOi , vN }{k+T*u#*0M !Bw#.vYE^iwmQm֭[f.CJٖ,yj+my8D"mifztvv Q68CTP(P׉Ftuu!,3gBb||\|\XX D"( J%5MBB!4Mk)}xӪ8;vH8FכۢiHtSV>}}}q//uvv 杏Vp:/Z~T*Łطo@d2I^' ijY^ipL&B曂VB,S,[`^χeYT*xb9EISIENDB`u1f468_200d_1f692.png000066400000000000000000000023531326020644600334070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlTe߽3Ϋ3N)X"[Z #JD&rA"!1ȂYÎI##B+mI(eB_iug ~9;\^`ޗAHГΞx*{uhׇqZ)>6wD0 2y}g;{AţKS3";wJaj%;mJ>jXG[N"0-dAD\pH=c19`h蘯K^|hwQ)ųS)73܄lrsg k뺇|׉^"Z2GǓ FV=ұ%AMEZ)$Z^ZocѶ$UӰ*W8<$PؐQL+)AoV9Vhux8|>ՁmPm!HUS@Umcs׬@nڤM=Ro]c̑iyB:` unqܸZWIpBR+Y _X<17%>CύZ\S|~TRT-!Kxzd|\׷Ҙ,2j {!r,C! #h9`}. E< A0B*js'XwpE ?rV].FG* 0Sח ]t]_C0y }^g-{_3;=115~pgu.ǘõ] E,"t嵽 oeJlR`gNPjB͆ȡp[{ u˕% &ϝ0Q ݉KsVpB8TC{0(i࠷VAFn( Q m0Pu$dii$gӇ7 $(cgKD3oD,R|R頋Z2Ѿ[J~)M[e0c`¶w^+6ٶEQC0 {`M/m> , p\@ʛe@u3DIENDB`u1f468_200d_2695.png000066400000000000000000000017011326020644600332410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dxIDATH_hU?4M&M4'vLX[>dUA:>ՍT!8]{S@;A71m>jj;1_$0mKLs=ǵۖ}@ִ =/ם2oW+@EO"xQk eyiXdD6; 8i(~KH߼4VJpx;Z#V~km`go U+ݓiKvN/ݸ5h6l"b&z|3Xϴy{ ݝэ")`h˯) ޓᱞf}2i!r"&-p'ўBȓ hܪgynsyBjFN8Ȣ6 u ɅIM'7̥,p:"t*"9-:`tIPM&JVұ{t!ukӯ&}/_WlR@\X.}Q7M7;Et&g:C!qy,**抜puǚjU'{oy~s3<2=zu?c;l;j L:ggg߿ŗԣWHM\[S vOm_*>aD"QgG/E>S*_ٕO]/g2rdADӢ͇N:ʩwʐ"jҢʱ)2}OWfTfR4p@)ժ[lف|woWGi@Ӗoe~aFvyߩ7vN5Ul[37۪,B{/cէN|Ǟ#&'O5EGhnbmMKd{WR& ,bwOn?99giDUԣ7zړ(JNKkmCJݡQ< ),,\!.{̣0MR~2)#RBQL`DEZڦPVHO7DƅC/D+WIENDB`u1f468_200d_2708.png000066400000000000000000000022621326020644600332370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|diIDATHKlTe}ΝNBZND!A& +&h  $XAX@:àh;s\4S.guwOA*u;|)B8Rq)T*5}ƹba% tM]kRʔ(_kk&KQ)q2|v `wLNTMJҟ2IYh2T8bR @*,,M}O[=*!m'@mm @t]Gult=St}\[?H$NWravbr˲VPYB EO%[Py8C6]}R@1+AG4&Ԇ2p<]%EA`2r㷫%-$1۶wD M)oiEv("|}S_"avWCCC_8)Cu2;6DC݇_uuuFM-jRs>S*~ϸ~s9P(4ţܴmȆxJJ+iD"Pmt288iazT4}v]qcryffd2,d%lB\`;PYJWWWS,}I< 5B+2 H$B:|>333C?dתIENDB`u1f468_200d_2764_200d_1f468.png000066400000000000000000000020101326020644600346050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHYlUUϹS{`)-Lj -bBX(jb8D`#>`H6& XCQb(1EAH B{9{P )N:?CZ]`F}ǦwwvtP_221fJ6/GpNnْe/+ޘSwx< mL8mYt9y> [wgDxz{M7 xḗ\`ŕq)xY4~(nDQyW@|e ?S>7Y%fW^ˤXDp0nܑy.Na9n}Z?k$LyvQ]HlaP#{g֮˧&x* |uu5Pr 8&Y#Kip?#e=NvPrɭW޼h9/ˁ,+`D  ch"A!1ȃD|F'oD!J-h"Zʶݶ3>춝;gfΙ3el~==ظ^j^ !p\m@hbdOˡk+N߁͋BќK?*_-f6Wσ:.TL5nƪՖL]bWo19A*⃛;SD(:=Q܎ls^ɭGO[׹Ԃg3VcX}\Vszb:5餖Dc{6iU,9)ETQ$dd/q/M;8%k1AP)PҀC?qfeLQrM}945hmʽ1Nr(ǬK(l%pB2/OF+i6X1]ʊaGS_*8 MJuvМ *BYCr twhN&p7Y8b1H6$!mOג{NK2)d&[t*#ѹNP W謁%0)WSpTI#nMyXqu{?nI51`2H#PxG0&iVUӢښB(2!MxBb1:FH%C0iUV& 8z6|! G̛#|QhGxpn#5ԷnݱJšTnuzeyf^;9qc2 O W0F%8IENDB`u1f469.png000066400000000000000000000017671326020644600320440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_L\E3(hPbl$&D6QQXi$6&&Mkɘ5PXJ5jR Ұi R XvX`e-g}͙ s6XhQD[ä+ 6%,]-{Zks#:Bӟu uNW Z5WVm'?;kpU 5n{! JTl<7rN&r2Ds>ežX[cHo w^? Jr,!kkM 2x/?XC  0J y(o4^hN&H=:Y KS˝Rqa :;RU@b0V#*g~N3MɷnR\Yh/QR::eXnG#zWZՙ4rB ]#AM:@Q!4-M7I^)WФC_ˇZPSrtDM~ޒ!޽d.u@μ%@vW)΋=!P_=EQ^ 径gkCa')uy #Td*;Ҕ|])@L['@0@OQbj @t7wI, Y#鿀Iﰇ1sc接u03U1ɷ8"~ݜ)}E8'^7xB h_Dx|g.usI\|tEw /QH`EC8^ڼ7"2ku6+!P.8F}Vw>`y"@F按_NGG4Z ]LqGw2Jܖ# ζα8y vFgvuS[ܞ&IENDB`u1f469_1f3fb.png000066400000000000000000000020141326020644600330070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmL[U*Ma01S,:&hIė̔,Fs1$n1ld} d\/QdFQqi`-. %QZbC酦sy>?Œ1Mۡ`R"%_RJ _,@V]OI, Ih| \nlPJ] Qi nwfxrJqBe^w2/EZ T" xEB=^o'$w?L,$@uuE"86o=f? CKIF{*tS- /)(^8ǑŽflzZ ]āil:7wT|-v@ƴ<Z?|? v;_9e0xp(M4?/!e\f8 Xrstc|a02 bhh$8f^;5)5UfyhY 4n`ۣHMլ`C$0 +/6 Dl ū ٰ~š[xvGw/1JW:0?hG?k [Ym<۔dK 4;'.i6Dt:u]ʋ [,[=s# Ƈ8WB`5P0koxf\.5fx4HAbD@H `حu9&Z6<<#цY:^\3V\2)Wٲ dd9IL/}~<& X pYV;D㣞}/F1 %mc4 Jvar:^RP#  COI1z] M,P!@Unb&4)?M&5g޽D+'a;o>nFd(++0>b_8l<\lAQG~qqjkVίK|< %%_{i%E8{ 뻗76j&.E?HA{V<4]lgƨoj`zYIH13`DkO8Ȼ8u ~K:vbGp{t Itevgz00$|9R4@J Wx;1 C'X66lMCK'ׯCsJܥɊ]m{̉;8H)ٺo斳unT8ϕͅvٜWsl@@\0ȹKT͙@U(x~vg7a-H⶘Ze_cݡV̐WӋ4&O HE!N~y _O$MʮQ $4 lifQړ@Nk"F6Pѣ<[p7VMy#AKR,X,H+ .}~< 9"t{,Aޣ*68J GZ|%[Ne&tr06V1oR700=͢Y6\MBM+2* '0>]:aJvY҉Zn27IQ=^z1['>q_IENDB`u1f469_1f3fb_200d_1f373.png000066400000000000000000000024731326020644600343700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTUϙ9gCE--X(") KRA)HO>% h"i r2Jk)}9PhO{^hnk{Y(E@1t  ` Q:qOTUUŘ3RN}nۺnʕ?---e QOղ,nwuup:TR)lFsiO- $ J帤((ܦA08FsxiR~zJ3-oO]F {cP^ 44MEѯ@DN])Yկ 7:Cۀ1-*V.#;Sd28>>< L͹PdBL`cGe>* qun_իn8Α`0>W\xO/ X4ƓŶ,rrf?V'[m~\D*u0McJpCWOWW:UKr~y? 1I$##S.DHc\zfBOieMmAҖn3k&3>wdIENDB`u1f469_1f3fb_200d_1f393.png000066400000000000000000000021731326020644600343670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d2IDATH]lU3gfvݥX%P7h\BTQO3F/p!!4M MZA0vmUֲ]J[ox d};'JˌF@jV$-RJ1C`;::8K/@`{0=Am kHt8Kd2oK) Xu=jRjMJԑR`6ŶClf"kgtzF)Ujx!NO^jPP(4Btvv=e)L]GjX)4!04 @SӶbf>Y$0ǒT^p9VXс}Ŝ1hR,Pqkb5w=l6FΜŌ.4RaiڱO?Ny@d:eb*e>aӔ=9(X a;k|^v<ʞ]%z*}o:SKukFDҚ6kY^ٶ?'o)>>ő/|onDR gv-0 c|O9Ba?B hHS6XRkDH &0w_%PGܷ7fn`+u[\g)e-?UNDH4AKCBGo N\`0|ݕ||.@4Cz/sk>pت.~qU|2S3t:O*LGgSmYύ@sEm׽`NL}28{O29i8^]^,;rv%"ڜ4ҙ֌" YhrŲNg2tF6.~^MY_ic x<;`$0fUT>ͻdI.A3oL^mT*L찗!?Y-l%ˊ /2cLuϲo2jTM@h(̦X\YODܜ\A v{.L-8{ix%r %tYxV;Wp+2MoӔLX8@:] f]NXd:^zハ?m!ˑN0<}hEEH陒Mqj*ȱg4pFd$Ѥ1S,јp'k5L N.uc4(h:9@0Ėz d- [ף$Fl6\n3|I9˗'?P{]Wٺ ?)6!d@TVFKZTU]t:v-s mmhF_r*lHM Ѐ$nef4ĭdm0ڵkדRٌlåsїŵHGZF\\崷WŠ(^4b2@b6%!Jb m":-^QNj/.pCZ Si`aApa6FtYӴZFI_|jߐt)py?,!9has 76R׭ em~[B&ר*=Kr3Qϙ< AEZ+7:dui,E3iT> =zYϒ pIENDB`u1f469_1f3fb_200d_1f3a8.png000066400000000000000000000022471326020644600344460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d^IDATHkleofvw,[ڢ"HC]E@!B#!B&JS##(1D1JC(F15$%P˥ZЋvgK ݦysf93DD ò^(E=$Su)@rE '@ ƶOa Vv܁HZEyy.,{5&oڰ.k>A2C ]gRӦC II9Y#:6oXcq@*iNf7u/ɧ[Sꛀia rp0;-q̟U';j] o|h)56fwF#}>Nj(-HI\.W6ӧLt塓|wfJ3t77'P߫J'OeGO(FF7FWO4ɫO/& P8a [^_E^n|"mƦL=x+]\VqQ0r9Vs21xǶe܂ox\J^l9]/w]䇟tթ{sr^BwWwEs:ze5Tr]E%QPyf !Zȷ?ſa)&=^*x0۪}z6]߿vݬqxfBZBww|NkO-{3([0#A:uG[7[VUYvSm)y*#PTBVÛ-Ew8Pie-x]XbN w Ąe"+}{+guy aLzќ%! Éti]N<ޑH)Vc`Q~aSb> ue놁ڀ\͜nF63}Dhhm -Z&q/׍g҇.GDy(/Y񡐖bp':Fj"Z6@Ca"܁p;RJr27"F(U-(_uAa2zxw{ι^d0 5j /n2\T赗QϏTdR" 0@{~_E1

@Ax}d|===;Y" Ke J`)Y0N7.gǖx}٢c0T/w1kz.3xO=55c|R`jĤa\z>Z0 o=VAvz `9T|\Čd/^G.5_6`?.G`9T_@062SinuSdңP02Ij+)yNȉZkDP(2V6 , T !6.ߪ.r ;|Yqdh~l.6,@?6 0ذbqTkP gVGij`hsuErR&P ŷ*߮Κ]Pp(.ʮ&2ZfiZf]]] @⭉ Fj7`BlrٓryRv8!Ήv]8x&TD雷Ws_k%̲l\TB$eKi lV yٙnbn;hiw ✝F02k+U^|$) H)=>2S'`ypR6RJWZ|hEbRnv?#ob628tg뮍t*[@̍J϶Y|IENDB`u1f469_1f3fb_200d_1f3ed.png000066400000000000000000000026751326020644600345330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dtIDATH}lVsN߯}۾R,JK- "f3eQ,"h6-&DqaJfki:i><}B;￞s܏`z'~%͍M{Lv\<>CMbm>-BkЎ07c?Ǐ]Vt4 %J;Slf|סq?T:YRs smqeeD Hixkl^,LKaA!K~^>h ;'m Dwgupc;r5 `+LOnG)8v#;T )%vrHfg&L Z_Ol-B W%Ls, *|2g߿ɛ~0 )ql)%' G"X#+kp7^Rh|\;T2_ !L8"/<2_7fr` #k xMGᅨJvlk2űd }j[ Q.(R^gLaH _O~ܱ&bV4n+8d[9QJ@l٤[%eŒEx=Yzo4N›t "  0tmKͻ{n;fX] 5TҶÖ{c˸ed|9E}p!}S[>) 1 e˃&%iִwriKpm! `++3g/`:ܰ.yg]?&@SSS: ʥ_ F勌T 9xG@&^l 93?s5 pb/}#ղ X~PF8C gǮ e5RNT9ݵ+))k[ 6yՓQ7md_}{ZE.zNO#ZfBG D/%fCOȘBǰ@%ӭ=O=PnaݳS2t^ҕ/n39b5'+QJc(Z]{RՇQv6X}.gPJ|0NMS&?+K2%Rk0j=D,*h7ez"9&K}]#"2x@ܑl#H#2?[@*Ia-`0 Iz36\8"^Y xCLX@0"jN40z%l~6mۓ$m!0pap \/~J}E!&lo~%Y C v(:wz\j>3'5FKoU=gmY'jh4 l5P6_gi HYΚ 6+aXFP"4blAv$MA0w,&0 I.k/UO 44sQw iF6>m:5IENDB`u1f469_1f3fb_200d_1f4bc.png000066400000000000000000000017731326020644600345260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_LU|_Ac@\1ƟQVDMdf^ta,b17h11cdqhv埱ěe]0L' 2a@K?sy}|D*2z]!fhT9!P@zRAxjW<'~iVq^T,aݐE61\I"t8WR zo#2lJE^P5ip<6Axl-bipN /76$kIxv$#(()'b{UEk9+8 jc`R 9v +Z>?@WP恪R悍+x3z `ge r\3_~+Dó; 0qo=T"eϝ|b[3GKH@g blk&[gR;̈XHهoο8׆iQv໛ENm[ uv!"iJiZΞg>ϗEӈȼ;hn棍:uf|s|O..j/z %6Fnz8C1߁#l6n) Q]4](kgCcayc) z21}&%F'&*.'8; -g,17Xl  &᣼ !$fG*?1V- P)%EvlbGx%tS{)Gr/bK;7 Ng)`ȲbI<0 4qiiK#X /RJmv̴4&<^Ra&n $Ўac<ہ9p=4HPe}vܹ#cz"O ۀROWUUɦREe,.Irss C15deef{ 1Md+Ft2tf߅/xmLp3$d[Δ@H]3r( a:)}BWa( D0@hg$ IMrfgk.4^V*q)aGɶw8k  acJ̃M soO/{KNrc+dMK@AnAru: Vqokbl=0|Zt<PUȻ_|_ͭ(uEy&;x0%Kg^S0:Wt @g2{qwtVd^& ZL&g6$7V Hgs ݷ59Zյ+ڨ}>sQ7J~( w}+9/?YN'4tDWվt ^Xy~*b#klaO J*[ٵls8\F~~W 5]JP{軦6n-% rBV.[gh9"+!3B7i0@Zlyfb[9ޣ3mn(&Fjg 9mf2 3d$GOvLc5j[<>fghEzBJj@ |{}Ot4XF6IC;M.a^B=ܱF>KPKo?t%"zp~tmY-h@۠AXU-C6$\Y1IҊkbY[StQK`!Jxyܱl>CMVso!ف5Ćȶ;}lE u={GLa;y; M(Ѹ?!pGc6m\1NthS+u}4h>IENDB`u1f469_1f3fb_200d_1f52c.png000066400000000000000000000022251326020644600344400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dLIDATH[lTU}Ι{-P(HIa!F#A"ƄGHh/ F c`H| Ukj(- LKjKiۇN19'g쳳.1P]]B~RqrWi@'ɜD9;% Ӽ`GU%PUUekZ|3ejB<{gŹԋM>T`.´PjO.fPWm|s `\eE >ܷʧ>T.d 1^СOXz46KG:Js R|h4 g6P} h0щ||;pC/*n(TS-d֭e)I<r2RJ%M_NwM BsFX2dժJ׮j-޸.^a Lmu%I5 ŕ#or:cH!9#jO*|{mA~ pϙ϶^$\HsL܀0K`hiKx.B8BK{'| E8dq44%"P GZ쮟9X/_C' Τb 1ev]Jf1-~=ޗ1iOlQԑ࠶zFcqCj6mvz:Dz4@ٶ{::hokd" ckCyK<[.jC˗:B>oqPPڮ]|~xRW]m{@oooУz齠fcDIN ޤғϳEe$QJ3#c?̤k3+m+ش]_[|N*eW۪ v%"JF)J[5HJR ;q'd'N\LO3}:X'O|#;,atǟݻw]]]$իWvԩ֊K6O8Çnnn   ;;;D"˗/U}<g``dz͛7Y1 ǡp%gcc .yȑ%۶'v{Doz<lŋLLLѴշ0 v9p_\F* Ν;nfRu]di~ ʫD0Ms}ssSx3d . [!@ɭXDzyt=zt&l6Pd4#UY(w* ݥi&۶t6 (JM-`TM80::,p8|_ZZ"ɠ( *n t}}B2mDPUq cǎ{QaQ?J B!bY|B@T¶2m K0DUU\!4aF?z^,uuummm *ʲLSSMMM5%sFx"tvve3_(h$^%IENDB`u1f469_1f3fb_200d_1f692.png000066400000000000000000000024011326020644600343630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTU}ΙӹB/F)r @i*S4$#MD &JD`4jBOc1QE.!I `)PZ/UҖt:pf朽}:u@`ω''1ܾԩSS=v jЮ6 K37qZ]Z}əcK^[D]ꢺ8 Bq*g;8sWS`xr0MIqiq{0D-vُɉ4Mp MzMJŶ]?ZIN4С1鱩fwem(/`1^deay t}KB/bŸ|β `;oQlZ(ȿ)rDXI ERRKlJ vvdw'ni[QxuzljӈQY/9ÌXo@%q1#6T'(кjkƻ@+΀ ; G6׍*%еfR-ؕP \QrFs)CBG(Q/tPNzh.>Hv,HmЗc+\-?&IENDB`u1f469_1f3fb_200d_2695.png000066400000000000000000000020241326020644600342220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_L[e9t6: )&n 3e1.N'#1Dx5xʍy`f1alF eTbd!-hJP4:y}w6`SMZE+r h +ʧ[Rw% sB7+4+`ޤo Cbxq8"r!J322Bc^8_4X0+T?4ua̺c :X؜d3sO>BQHî(/+ OCU56Ir,(+)Y@ͮJJ 7Du]u+'N kYUWrf|~\=Z;)/+;gc: ̰ EYX%q36)%-mذ.-3 =}gx3M!y͛">틆&vm7@g7>}[$j4fb)]iGw/a\tt'ny?TB(>>k^&Ʃ]:ۅFt]r@p6R"+r"C%fCa|i7B*0i64r_N, >4)^.z~תɷk Foj~%W$A(dggn!/?7Jwڶw?,f322.PB**~߶u+S?\ nO"Z-I,ܜ,\['[Z\__#\p{xZjpR*PXL*@7gtd!WUxxYF~)l߁Id$ƖtMέY?I*^72ML\0"EQlRJ.u PP(u}:SjMHt]Gj󑚚:OiZ&0G0$g ?J'V[9}SIENDB`u1f469_1f3fb_200d_2696.png000066400000000000000000000022121326020644600342220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dAIDATHklU33Bm! \`r/B $H 2(럢bJI*F$ؖK"*n۽toݙݙv_g{|HY-T !hii c_cD:.<8(zˤxۆ,hjjE$-1օ=2dBd JAĨ D_!&ef-Gn%#V[Z@rG+`%p δ({չq80)%mb(`L/Hc)*حdI1ϩ>Oȹq ˙M4gFd6tm,]PE׭n%ʦ|DB<3k] R(7|\ Yӧrzk7o!FۓDqj| 6y\Ep\ qu'-H,޺\ @Öbu,Lx\o|(MU>X93k?2T,mܸ͖2vt @`m)_l4[ *#5rG~:Ǫg3ݟ6WW,DTl.ʐY{|DfOEsiRJTg['NXx=H9)EHIvP#8ºKX| i`0 -*MMUv؉zxC?ⱒI܌9c!Ί9h`z9\$㱚Mk:Ͻ2X  hŅ燵r{Ҍ/lv' N7:|ʊ$zc\˗|K Dgew@H@J)Ҝ}W@SQE9&Ė?SJIENDB`u1f469_1f3fb_200d_2708.png000066400000000000000000000023511326020644600342200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lUgfvfvQR-. h_Ĩo1111!""A6RR Bl.eٙ9>]w[h$\ZCCC`۶mڽ`k,%xI2P aR#BF7A86TU}SJnMxl][%ٵq VSc t'<8"xNDJy'ER~YM-h q\8RK*XfͯNU:-ksTE2-ͨwȜ̓EC+7 !>)1 i~j|A\5ՙeXZ0PqRarjzzhUqp"ePUmGB@J\ir`p$m5J_, 'ԺL$My73FϩtT[-p(kD>_% y_ySWqkP#Pr"SUŧ4 D麋KeYЏԙMӯH35u>unZEGOP 1 E=wWw?GSyïiNBiyI[s#wMbGAQ'F|_ZHP0kYdry2<զ{uxV027Wa+4ZI]ЏcۤcnBU֯m@8D +DzIHdMg8g\XidL1E3Kngs^U&c oTw~/ŧ8xB$[tlT<*Ϟ&(z]BϾNt/ms//.\h[")0ܘ⟱1lA>l|_yxk9*Bڥɬef9;KP}-@N. ]"NdN&X.a.{˕MBDQTKjE /i tT!^sssqFGG&J@>q2ػb}>e.}}}OkU}2!]#jfh D#ϖ-sѶBP;Z'1obDP)ϭZo>LNN꓇ox]DVExהBv|xo@kZH~1|u'M78d`?[:?k%vԿ^߯@_<~\oB]D!N~B*}W]6%.K+q"8=:|7Fik y_ır)oE~ݦER/H>o0|GyaIfnc ?Ud\joe',:󑦞Hi[w,-tX8}u`.rb?N䳃`:>v>X l7dcg˗cE]:IENDB`u1f469_1f3fc_200d_1f33e.png000066400000000000000000000024231326020644600344420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHYlTU;w:sgtƂ Ab$JD!"1(O&hL\5nD0DQTMP!h-؍.3)n00vV}9^ X~}Ѝu[;Kw&^=47Az9ӑdw wn>z! h;ZOO;n9ܱsڳ:} "|9-3Lvԧ;$R;U88 jc6qN.hj'" R砵@0 l45ֲ>d"3hbM!얊2Jfy8yHvM_wƛA\Ics#ѤO F}dզt{ ^#o0ЫgI*%LRD) SK32lq/Wˡ76-%0DC$`7Ji%f0:g1m9aA#2ztE{j/sݛc ZH+H$7}5mG208JgX[;ީOoIIc0i,}U$ ].F E(nn +]TcĚfάVr"hp@3&bK={8@'7K@̎+2y]%gƱQ1kW\xSEc薇,*{pCs&S CX "@WNz^ c˜b_drJ[{pVdLB)M$$='廽8r+X`}"0Wᆅ*Ѷ怯̎!;O:[50zv2Ye~J֯]Y-0 0;%L#M{qj2k6uu ͜ 4׈LvsWo:Zs8pb+Jks02T%:LC⍍W Nk=#^qXz1KV%H^hg?ULG,4r?{n-fz>xfZVE:;d12 c Uz ձg-yh0t77ol|~y:d&STJZFPxj lxjtp#YO_ohq0(e0SU!ž}+srV.R oz?"IENDB`u1f469_1f3fc_200d_1f373.png000066400000000000000000000024151326020644600343650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoTU{3g̜v ZJk!QS 6/$ `07 )CTjP{i;sgYZߺzJX:PlfJp~O͛7XGRRWz1p5Ե_ز%XRzAp5&=>\#<# BRJl B4-ʉIyP*RfvY|b8z[[po@&Jvgy.>aTiHMÈč84(@lQe}o\4q3'BJ("Ctc 3*_yy}. lkmtb V3"KeylP!wÐ+((wUFEDB8iDaTw?`gOI rc=d?}$cq޾{={*)W C(H[ qeU I~ ]UELO`k(88EёL&3 杻ݿ[Rgbr4RfY RpW"`l3_&E,۴w^ _h[EQ K7 @JǏpE46BBn`vɾW9~8%-lqx9tK ]\V,4ۉ.Gxm66gaNL2WJbc+TUZ6ͩ~qHӴخ]@JɱcrGuV@ &oH d{-^8+70+ӃiX,~yĉOMOqI XzjFedj=BO 7;;;3m8 PuOl{$"j2kf`٩ k{V+Itd1;~AIw_:BSY0&h `V}gM_YY TwuJ Ea`:cl :因 za;W;T)Bn7HS{RVl`b=oqO1+1}Q*~WR*}]G2E=]-`npK:ԭyN L_[&xHA^311ki椤wd] R NOOOj[d8JWJ-5 !6GEO`rIENDB`u1f469_1f3fc_200d_1f3a4.png000066400000000000000000000023041326020644600344350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d{IDATH[he\vv7&IMMڠ^4UXBEAEP_$(xC*V_,FZh$TSZX&u>6IfU< 3??|"/ fl%!N$UFOe޻H?|Y=nD?@r@R>R)Ea߶G+2ܹTu0G-e-Y<|k@N=JZoV<)ű[K@F_<\ԁsKVUzvܬ\L`2*Fy!DmK~W #4 `19!EE(*dʤbԃ5FPFMU+ t$ &Y]`` M?"^MN;ee Vq̆E zq 2=ov 8 /4 bxIfO=;m (r]u3Q .|MD]ŝԢ%-rw>YT%p+U)J;eiFAvv*͵Rʃ2e,Z?0>ӱ /x˨q|NHrpZD YN'zv>R Fp ۲3B(*Br4BUB.kN ) :hkkk=Q(cz 6ܱ!% G 5QQDdSjhkh{ttt-z4Ẁ}OM|1!xm }Émۤ S8"P^Y/7Z˲>kt]7_=Ѻr?MuAj >\cSGL\E(JNUԜ-,ZP[pxswwW7 2U&xPVKӴnwзNy^#O=MmfQsRNg$szCqofНg 'BE?D@ΝO]%3 .F0qK+=Os aƐL%߼`2d(,U2'+铘آ;@cj>IRhwh&A;6ʊ}/.󳀊"ðk6ڌ5YOmF2EL71B0֭ EgZ<^ `O D h4 W7ʪ/#9z06w*BJc4կ"9`2w9k/hX+f_&fW` +c9W&:8OO>i7-uOm.]4׊#`[>sRp(0њ.͵2={7]{O~$$@S}CzkV6fe:)}xʹ5)R\7.Yqwe4ѳ{'lѶoAoz#cLFpCorCHmryOSd6i; ef&"-V>!Zb7鴏oۭg?Cyc =GICdk 4=b,2jH$HW;-4wcQ^߶ ],`1 \,lArt`zbuӿ_@GjEˑf#bL5c-jd>STlһH/T=åh)>1$Z/m1JGܱi?Fe)rӉC/IENDB`u1f469_1f3fc_200d_1f3eb.png000066400000000000000000000023451326020644600345240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHYlTUޙL2a`dK@cj4$V%Lxq!!Ƙi(҂ݘt5/~O|;+yi%5T-퇴2ūF!AAT89T!O no`"YBpBZ/M 4o;4^ʺ [0"kX;]AN )L)97LKF"c=IMÇ^~B>wtI6SAI 7q A(y5S(; ^4idl EEfgHܸIjzFYaLH,h LEp:)HSbuc=y=ăL Uɐpb)[niQ^lyB{bF7f<3~/g{XQ HY,.y?I'kFyC ~r ޲t~*ΞաԮ/q'5:ۚft&GC亱S g*wOKx}a/єQƑx+ʹfgM a!\gNǥ!@tE prvyl2{הh>#msXZGsVKKv*S)vZ&k 2{T\[qZ <0[\,oQIɕe'H)K˒R/L$Sji4."䧳K ԄWQUlESo~q3t tt]zr}(=$v;pܙ^ݦIENDB`u1f469_1f3fc_200d_1f3ed.png000066400000000000000000000026541326020644600345310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dcIDATHml[{}8qM$mBVZZ:6 TeӾ!1i}X5؀HA-/hFiW%IА%]۹qlCZ'x>9G07ǹ?ڸv=^xsx9|T$6z<'쏮' :="`Gdl G>Xֶx;mDzuJ{ ̊gRaK\n ,^t171z;o*g҅Hc,Hi< [;zׁE wPС.\H)8jbL5uww vpOp@"PEzB129W.!C"Ǵ,2RBV_*N7膶[$r]@hU`Zv9vΣ#fp 85YT{˜)C'AO#DMdsZCα䍜όkq㣔|W>فoASźxJ@K<1rt9f^b0D'{Gl:4rS'u=>m]ܻwe7)x0 VDG,X<[ L}ɯo_a!%=_~U(著yW>IO뀡9@n!_ߗ$*9ոbycK}ܣP~Ŝ)h s" zL^D%%yO4W3Nj!oa^V:JO}{.d>iIENDB`u1f469_1f3fc_200d_1f4bb.png000066400000000000000000000020711326020644600345160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[oTUu{t-m $* I ^`LFM11& zc$ D14H"&(-Rʩ2{i^^l0h%b}%ǏYkk1Qm8^***sտai)l͉+Ŕ֊;a dP<^du1Æx<@x9¡]5]I |eZJ-ZYt`Xg"o#*ыs|0ug))xtOq)nqdOLi$lJD[`*1gv|9^8F@-)0y^ ̠aA^(ܮb_mP8ˆ Iu)[j{K!YSP{FZ߼d"!N?%Em/ _yG蝠ݎhEWW4Skp@f~TOu\G^Xkxs,5g@Ii"+eE#D[PL 6qχ8~}s8 Y R+W6fE*NjPr I^~ǯ}hԹ\oZԂon0 Uxtr(_A\n3bHVm(*h[D.yPNJFq^ 0m Bd@{$"ٔ㾜`o^eWdFpO+9 d˓ Ee2m}O@^p߄#~{~y/|;YhDKI;>]557C طFs`~~2v*lD;n4+@LUIgFSSØvBcg]u5=q>˨LbQ Z&iȑ1ko˵Z6LlM,;.:#It}ibҌ|AA=#|ɝZIENDB`u1f469_1f3fc_200d_1f4bc.png000066400000000000000000000017251326020644600345240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlU;3;vqI4M7XV X "֔.@-HPŢ`N6Ď1+ qw9祚RI5KP -S#]o@AW'FDP?|8rI4yRWLxq||ܭ.{ eyaKw bk,~lWiCO]C88nw+:6dr&J nn~%T?JJ+W&`L-,C~奦QHk)8$%4 pwemi(".fw _?DdfpT ˲쏾c/v(`=T|B6 N=4p$a,X8,RA;nTW/-](IENDB`u1f469_1f3fc_200d_1f527.png000066400000000000000000000022401326020644600343620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dWIDATHmhe<ٳs4јfP )CBч(D!B A_WCIYjaseygً;;s7]_} XTՑW^44{Jވw5VxRϛRS9)8-@1WoQҬ&'n҈x(ٰ~mMԄxy:J^"U@p47>E<9 @e"tQ!bhEMrb$Ƒڑ8+O~,`Vzq,kt_f$;x^:\: "}t/'w>Cp1χ30鳝tvbci7NdLjii,7u=zkD wnpkGE˸$y4qM]N,?y{ !_Z1VMrX[ Q!.oX`{Dq5\@K|W)g E||z㵼x/WP2Ԑ_ҪT$kii&tswS29tb.w& Kx8~|@<<`û{Mӄufan൦eFKVnHQHW $=sT4a-ĸR8-w}4AP ZBg!},]9CT+7hB%Mvɩ90qu&rfgMMm>7'Ďbq׾)cLM^9C:Ξ~6D A.4GOTPZmu@`!"H!"<86#%)ذ,$4=ϼ[J!V  噺5GhwёeOpB?_3}\Ûm$*@v(޸|E^i"Q*u} 5L~qXD8"輛PZ#$^ijX©1,8>7G獡)u)d @ 4[hTO?n2ß/?"A1wCAs^곦-+Oyb'}ůbiffq~SޱBORMiлiRT+lmicOf ߴ Ny 1BTKs*ʁԘ@ǁnVN{mI$K)8<2/ NF8";sTJRJLM m)2OU(fE^GX{=c*VA̓ 3TLccḵ>Q QQyIENDB`u1f469_1f3fc_200d_1f680.png000066400000000000000000000025471326020644600343740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]lU;nlk*">H-F11`|LLįG!DUx0!Ԣ(PiKmٝeos9wF?ѣGK$oC$`f=~/pټysAL&Sr[ǎa##G>ݷonAph4H$"ϟ'\}̙3ݻP{qzgϾqƇBt:w UUq]ٙ?\7>"oy EQعs'm۶[ FGG,ʈXS%`y.MD_ u}+n,˪5 QUվ@S뺒[ѯD/š0KLf0 Cz LLL|uC(ʿ^/ܫD7ʡmRoo'`u`0OrobثD@ۣTj+, R)|実UGø8ͽ z%EWtjۉO6puںTjM"= R7.p,ªJZ]_i= 8nSJϦ"@[O8o^tIuA:(~p\)*tFSTWktuQf~m>Z\Kd*UּKeYcѪP,W;C+B$Рo깖d~o',Rr iqf+5}(D'ؖ>x}mi`mqH$7%*"j_C tt:p r\%#͸}tv$l\%֞5qwr܆I7J˲FFF۶ Ȳih(mZFTP(8DMp]t ###;=;;;FJbEJi>sǃ%iϽB,,,`d/*ٶennh4V$bX* bd2/ٳuƍttt ,//í%~Y^6IxNj7Iڵ;v 4M4 O&!}.UUiȲL4%0}np6oaguz|>*r~,B+,?oSIENDB`u1f469_1f3fc_200d_1f692.png000066400000000000000000000023301326020644600343650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOew`ʭbj,j.tјjL7&6?q.jtE{I7jB) \3a(y<#tui}](7*qƓfvg:~j=BD 5de;Ɵ>C{,xwJ[uwRG?q$\Qw~2zX}ηQ|Bb`%a(0?`XJڙ=$Ծ|JXyrV*.+U~aN >8DF;;0@Cܥ@c#:]ϧȠH*K Yn+薅4udD'\#0 4ܤ JF֫? LbD"hBh?%qcPRg2Jvkaw!k$ {M2q&݇eF(Cs QTr:)Ec},ߓL@Sc+d"!sBdQw sxdrHTߟbeR ߟ*ԥI YҤ@! $m٥P,<AJ CUxq4?y\8P">&B%}R:W1.4M;¬7/oI 45JWsx`4HEe5ϓm nbl^q.?BF EvA r߂LYf]v"n࠻@6y xu TKo$V] KGVfz:_RG c.RmPt)Ek@/TPZf!X\ϥJQ&/nQdoB:/4䑄IENDB`u1f469_1f3fc_200d_2695.png000066400000000000000000000017551326020644600342350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHIl[ufs5&1iS84EBRAzE(Gȩ"\P+%$ֆIӅ8QKb;qNl?8Z$oflR+ǯN6msP4yI  %QgKZݗLJL0>T _RN|C/ߩ]"3o)iV On*%>6<𾵯FeQ%PJml*RTk7@&".╱UJh]}m*^}ۇ9^ACϥ=P@/BGsS;ngZzpβhīj&-zk8RU2k4w)꧳iÃMs0}:FQjwŕRK`v\J<vlEl?ul[d ,T|~Ikg:2e­.s[+̬T HJiZNl rϛErz,\)Y@a HfZl&f01.bi(dWXiz4 #JH/_A\&VAwS$nbddbٟddz_ U[dA% !&3QN>, YB֠G@@1WV"OY~_ʭWŦ1{Gx,ΞYSA Ǎ#:~4F =y@䙷H077^xyT}Ariskalu6IDb"MڔRiP(P(}A̽]a "A, a%^D"r9Jp]4u.l*IwIENDB`u1f469_1f3fc_200d_2696.png000066400000000000000000000021141326020644600342240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTU}NgvZ $%B5B4hF} 4ј Ґy0>y)*(4) m0әΙgi~:g!:um6)Qi_}RRsbɾ;BS_(%߼(yoSvlK8j+{zo3w4J]FI3 J,e?uɱ9ք>_pj{3F(nr|U PTMqDëikDӥ`R :_V|cʲC_(e.zEl (M yL36DρOv͒xxp  E|U b31yFB*PA-hH@veuD$~>S]&/A,8WXt\L`>nIb\e\"p|6;KR3՘Xsp_b#M47v֮*6:q|!6rQž+ Ўk42sո@Ir骘fyv7s)Ek%rI6~剮dr6UMugCy#<ֱ+0tf2WdUJs$>aJ6s w LPDR6w 2xk7=PlXIw bº5ZbX\kZ46x5I6Wd92 /WF4⥫s_M4rs0ޟԅZvǷ'?@D9tܥ3E~8?1·'\)[<%R+8|s_}i}d35ZkQgzJ/Dvsx<^nܳNۚwuMq1{m{2m[,Kӹ 2(DD(ĽcwLskS$x4͢ڻmg WIENDB`u1f469_1f3fc_200d_2708.png000066400000000000000000000023521326020644600342220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoUwfvg n[T[Z&`RH4>&E4b|P"Im@ڦ 6=CBL&ss;%۫=xDGG0^*y3 T"K3R tUU?C/n;og ݓg.U>䂓y!HY+ᠢ(Rʯ$rE-&foa Be,[0XM)Hkk +hkk5rm&=%LI )~ɫDfVP(CM,. ߏn3f-(eY R.&U&`j- <%ZUälXRbKDK [[Rt:or[1vQ,xhhl. B*6ʼ 5xî IfH)CQ&OWm 䉝- ^Kr,jb`6=< \^sWBw#?)ѝEa~~PX:b[0WH>Lw@J˹ !. Fc3MSt\# JTU m`K [Z(B{*j_>m V-湻@rM|nlb)(Pi[BRpS@ _%J3MUr84ﶈ5CUHK r qcsx+-3饩{lX̌aYdOgŮTΰô{)B*x9ئIId(XZW[? DBd:˩cLe8~$Gw )Gs n`w#S1io1fD+ ɇ14$llNoz"u 溪 P/7,4`0#_!\.@2?:p x˲ٲ*yb333\xL&r˲B7li\WWaض0UƋ*=a㷝9u]' H$|2$ r㷽Կ [  bdIENDB`u1f469_1f3fd.png000066400000000000000000000017241326020644600330200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHO\Us|ep:C?mIZib2cobMuʄĭڅ?jӆht)"Ki ;sq13ay{/!v[|)J4"p@@^A\({Tgo0<<,5OR=^J^ֽ'@SBt*=gW?Bա^o>/1pvqF)'7iV@@kΙf[W"{%}~2և8$WJ`ߡ`p nƛ7ཡ!,kkx\ 'j yPS:hJKX Aw{}=Gpzv<&:m@ڋDZi VBdY]/H:R,lM ~Z&c?Oì`;ʧKmDη9ʺamTjVSYi_:R2wdl@^s'J -.g;=eLVL?skY;\lr9롣*@/v.cl& Gw2lWPJP\ųՍ.%(ĖUX&I}> 㖭Z1_sQ=fmYquB"7HlkF:GLO,PޕYT6bTfOUNE&RcF_9UX y\}[[;.7Zlq5 dJUEbt߼kR|}ДJmfSN }kG7joXHW$-Ms4j–gj9(JK,^PCuh^=oE̡34_ C2ж睞W6R}cฒC2W4-B(7$ut~U"HCa8$9[f0Hb#=nvȟ$OI = 'DtI"kZGţqJ4MAM]#2Fj ̫dTKb&h^}&[,Tekg5Cw$#Yac֞:M ]p`k."9cx=^~ '6 LIO4kdfЛERR׾R@⟮r] /B ^iBY $)"I3ҖR.^]עM?0V'l.IENDB`u1f469_1f3fd_200d_1f373.png000066400000000000000000000024171326020644600343700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTUʹPJB Q "KDR,/#1$$&}MM1&bhL0ՠ46\mg9sΙ}-i{+k-E_CˆgZ X<| F01'糮2@=w]nj1ںj1pj=wB={ıxr u8VF)QH5luRJ|@#:Rh~paa[~[Lcܹs\&Y* +T*qQPJ!q\%j[xQvgg$.*!RP՚8>S"~ K%ۻ5]۷9?u--ݱ.͟ZkUOn%s|7qfR8­ZsH`_B=- R 7LT`9*6W khln1O?S3ߞRܽiCj0 e v:@RivmvN:5@7fe|qn:yB~L47&I&lz{{WjÇk_d25@AklKҽSh[#`$J m%;Ql۷o</>'NJ !ުXHGJ|M;ۺ-Yzf6ꍛg/+t:Jt:2`js׷tŕmXZ?<].9[0Ɛ7|=8Z듙L|@X$8&W3o*/^zE]vAU9x 8}˔򽗲EoJW窶h,Ě SMAMҲz-!?b-$Dcڂd~מyO<%7IENDB`u1f469_1f3fd_200d_1f393.png000066400000000000000000000021221326020644600343630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHsSU?4 mS CbE@u(qv 7.]Е;v82:@JimH^{\]9]a\p!V,uQ @C<-UnC?{Il,FFFNq/ 08; 6_+7/ %w^+J91&+3})EBbUQU1: H&=K󨧧8bh4!Wr])r])*AhqDh\|j2Dv9"$\Cg˦Ey>3@*qf>͸qdh(ne(25v34Ћnϛ'r|!Uc*8?|NP  t$J&<&Nڟ(WkA\ƾ*c#cΌQRe?BB.:!F -ƙ֢FGP \3KW2Nͺen<`/þOV  f+s H4&~ZB0bIuC\`ogt RBZZw 6o+VZ]bsXfgvL miWu,̗<[]3 ~2ؚe~ͻEv- w5Bg;cxn⓿zi8@U5Laѣx1CZ?`ɖP+ {P  1[&v B+ !F1B+ jm௏; I"(}V;_A9}D<>ukź]9Kφ#(H|9~89;/IENDB`u1f469_1f3fd_200d_1f3a4.png000066400000000000000000000023061326020644600344400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d}IDATH_h[u?/iiӤIimnvmUXQaLA0|$(ِF} V088YO&kɽ?ҥ[U<{9;\EkO j)$Ha !89l<=<[)asþN7: *h;WZKQt~vZ4LF0t==\2|H3rwu}]Y?S%b,LtydHWDPhK8+Mr8A$@tȏdz~Q.-ՉuKL|)PoL=.[k!eO]S:XE2y$6 lll4t97MhMSu qS)t/ .><<`FM'+>́,$R9M&ioB,K-Csْ 3y Xy\-+r3ٽbx U)iJE%uHe1'N"Tgm][KKk+;Ut/ϑZʳְd2D@4AW.{;o 3Kvf1H*6qضd.R.9*4={H.; 7S" `P cΒq/M5?i-F8Kl)Å U+*Z4˲a<=:::{7;#Z@ReyTo0B)ғB6~FFF?z_ߛt;~Q(cccӶm\Zb6A05m/d ;M|s+]yȷmǡڠ_?Nf9y铙iFk80r@sёUC9d-nBFX'J2T*$;ы-ډ۝G-a>6*)gWgTRϦIENDB`u1f469_1f3fd_200d_1f3a8.png000066400000000000000000000021671326020644600344510ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d.IDATH[lTE3s{ۖmm{ p((b@! @4;1>o1*1L7HD+m"r+K)lvΌ &~O3!&dkB):j!}s`-[BŊac؎ =q_om5J)lNw~xD]wS4R#=rJ hK)T(3c̈{ZO xua`B5KTʘMJZ.d%qVĪl^DD @k#Z,%fA4l6Hp L!Ll \ `}s=6!1x;?J\t=Nu^Gɲ:T@9^3! 藹rJJNw?7,ߟ<9#:Tjw89wDy3\ϒl]5`5 P&bB  ʷ◞]Okq EmnڀwY[ɴH'mW+ b r4_[ϲ|~kK,iVk/v]C3".WR EnО&p/dތIgL'K[fHd|~PtϵT]6]Y*oG|u'Ǐ.xWaT}"_n/̝]êqV-Rܕ$qݢlM:d 3}l{'=|(fhe3xjKWlػWƣQw.D_SW"4Ų| ,}gC.d\jCQ.d>Aʰ~mK <0my,+Xr/87l^s9U2vAcLץ"t[+f!${ l3ntٳ"20in9=uD'`-3?)޷$FLaL;ChCW,g#AÏ:f?lIENDB`u1f469_1f3fd_200d_1f3eb.png000066400000000000000000000023461326020644600345260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTU7L_3گ`B%"+! $nU\ĝ[MHXiB uԈ҂igtf|w]L;Z,^޽=#/JjYFIU^?vԺЕH<4w:c*)GLA'lTV[itgaVBS)a;lά$J–Nr3?O ӤXWGL|iy*Zת}o$+X"]e`!ll^*8e|kxqkM<6EuSRRU$5% @J`*i'P_mu t;ڨViw8@w879MznǵǼs.\KBJv<ľN'ڝ<U)TiDQ ҁaՅmcaT+LbI-N Akw'AJ =R28`GPDRX>qF_$PU MC-Τygq虀F b/N$((XJa LLhj@B&kp2NFkCqy܏.:X">]'-M!TWQZ5xck USy*0}) KtTcEdEȔze<.]!E0MƢ&W7Tg/Lwl+B P=$ql~)htwCu:t|4g/LȄp%y%O+6*Unjd*~T ;|#Hxb3K:G^B,>nrwt4ޛGOr{,?RVU5νlsvpXtɒ,Bptnv-bv< ]}J=^4`6R,kRG/\*Mc]5v RJ鿶`6UVB.ghjZKO[rNK(HsC=g._ʭ;+]́H)B1+mȒ]<42 IENDB`u1f469_1f3fd_200d_1f3ed.png000066400000000000000000000026041326020644600345250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d;IDATH[lTU\;a:L*Vc"jxA1&&^Mʃ$c5/шEDm PKm-3s:s:z{{Zk&yu]{stj^B}K<=|P(0~ֳ9ͦ-v>]B #pƫ\{'^4덦KvZwB,֧7-B/ LӲ k??iuY);z@c- )L̀Gm,FuFG,"RtJuZĈ>]0zFíYGj"LKHO5"Ǐ2H)It_y{> |@`.Z)94w/T" 4OB1n!qCk8~hpuӔ3Q AP$i$R6z:+vb߾lc#~R<048cHJ*Dk/_9HK$ h LaTfH9]T5 `9Kb?F xfh֡ovϳu^ڟ~I'ZsHaBT! ЌNzC|w}׶ΜK>|Ģ% G~DY `HITD34>L! 蕄S'z?:=tM7^[oXÄX8w8BU_BaI w]E!?;vnoy¶NyY952%CkO娋pxXV8OչJ@mk`7ٚuOL$}y א=qXg(+?nc%OٿG&q51 Vq @pJsJLy3j\o͊K8S;9TL 4j Pth\umֵ cGF(N !| F`z(ͯ,ì_{LrI,@g O3w)U?QJ/|RmˆG<2Qm /+`y.܇]h".˸6t1nقm7Y7_//PnB@\2y!&(QzgB̯E~x3/ӿl79@D7?ɳ5byrysrȭ(`~seV#T͏G8-$HTRjy.6g$G;~@nq(:IENDB`u1f469_1f3fd_200d_1f4bb.png000066400000000000000000000020551326020644600345210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoTU?cޛi_giN`RA~#F ЄKָtIL\Rw6+4 RBΛk.DY{9z~c.iG}Ev8e2 p6Gy$-eNzj8KzBԓIBpnmEVˈnZzcZ[8jmw8]gȦĽ0 \BNYFk[."Hٔ@" \|fqHjS%B$](#?1ijc` Т#zJ7c*ZX)G0sʈK:-DDQQ#P3VbPtZ2S%le>jEtk 4= `R(A:I&H 'qCnl`;K.j] >#ڂ%s2U ۂdy!Ux*^bqi@Ʋ7慎$[l؝](<,o_/Oܐ6n1:m K)ᩐX=3}p<sLyx#ee\g{k;O-ʺ~-lh.& &ǰ!pKRȍ!QB3z&DC!+۵=G1==mrCξ b_w]w}qN2|,8 4MƘ+O]V`́@o8sNW 4h`~yjfg&kπ/](4t[+V>qHo$}2w^\f}No<*Li#qulH~y%޶W/VKڲ~Ihc򵲬6nɷi^I3=#KϼL|ORˏo]tO`B}HIENDB`u1f469_1f3fd_200d_1f4bc.png000066400000000000000000000017331326020644600345240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlU73vۤNl!*m" @BHl ~T X%b ,AMBQ! @;JcIjljg<ﱘ$r1.Hݼw9>Cwl.*,U !ʃxkKBimM J}x[ g^vC'F^-}?;c@pts)OָwǞ8(,"ys˚H|+x]/A@F 9H?É+wAAr"A}8N$z0Jb]i) >xg: yq<% J)P|9( &Q tUYmI# |+Blzzdә]_Rnuqm2 +y*ҁj8~ۙsG~lnc448PB(n]a*V莄t 4̥} )v]/[!Wp;sgwjJXm) +`$S&;Bps9=5ʟ_^m>?BŖ>uP 7B:2g_q"miVw+6&W~hZ7;qE.4MnLtK"%[uM Tn7{0691cS3}@0ϏuSMӈ `,M8b.nD{h_;1{IENDB`u1f469_1f3fd_200d_1f527.png000066400000000000000000000022511326020644600343650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d`IDATH[le盙v^Rd)PZK6B0Q|cJBcbgCM D#D/$TDKS˥7-|>lx&9sof)xg󏊗ݡEVYmj׆޿Sgۛej\BF)lةx5՞Z<_4fL.hhx(=!V5hc>QEtRV{O#]=y΄KGOĸõCyt!z9_J:jv b>ɿh@'f"`p|{CVf;.:Fjnn-/;>,]-[7t`!?zq2EYcEC,_9w'NZ  *fr%wf/֑;ҺJ,5W\O3D~=dz*;rWqg.™vH9ɮN>"* Y=ZSզ \[ʋ d|1`qs Nder`#GxZI'[k> qOy\_qgx. ?]}`w3[zk({O-oF}p`i#չI\pb?C QuWbQ+n:W0,yʳb!M;Hީ;#d;X'holl(EۉcHeJiɵ;MoRmIENDB`u1f469_1f3fd_200d_1f52c.png000066400000000000000000000021731326020644600344440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d2IDATHoTew.әi;-EKڂR AjD ZFٹ2,э(@ -ltt:3g( N<9' Ǟٱm zFTiAFP|/uw|~͞Ĩ'Μ_^]/w t"i=M)8~-tE0gwnZ`23q͚E+Sj}bQ/4JA}my1i۱Ov!Soѵi[ꩪ=@еP c!3h&ls.lC3''񗗓NPJo>X /'L`6Zжo+~|Gb&AEf&kJnJF,OACQLK"@k֊"d+vt}瘉M,S9'#M,oj/c<$KaZ6 U\d)% MDFo#<=Xr$wBB <Տma͸w0(CdK$+!-  '"VRWƠ%#/ $.hH:˭8X=>CS0DXϣO#"c$#*-Y f7He\M7FRI8^㼈:ocd:V-ֆmL&`>Zoc/|ֿl ՐVxa0u_d2Z Gn}U !5+$`PJ󤕇a=lS>t Tku0M& 3VիWE׀e:u7~ zIfJU@Eb- Z_ >7W*5s|P xPdT8?oob9 XmWTT%RX8 YѼ<۱&͝tMp)a;0R^I޴rjSd ob:jUnvJպZʚ UeIdfa T*Ūi|nGS[_\}x%O^0::i?7͋(4Φ B@oE5ܲD}[T껿zCrn )Q$h4; nD!'YC$ɲkGxK_k4(8D"rn!۶B2qTuC2(pȈjY`0hd2ܺu EQu]QjJP b6P]qJ~:|QAladdDr?F  e( j5oDE\.~];F,,,P,D"_|9ٲڢp9 he@ @ в\.D"hvh߾}/ׯ_׋!Ni&NC)YW餚&gv܉ejjZF:Fuژ!L~ W*WVCQ H0hrsZpvJ,[0˅RP*kViy % eIENDB`u1f469_1f3fd_200d_1f692.png000066400000000000000000000023271326020644600343740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlUNgNG 6k#t1!nL$.]77]F$MD #)ET PB;uL[gw={#ww 7.2f\;.\^DwgǼ۽N% 2f[>fBG@wrܱOUp/B|pU.5͒S'T!R8u"HtD}JȞΆHHCCC$wtKR_ R+Njֿ{P/[tB:2SpάD<|Hh{R2$>d5DB$ٙ LBҚzz&UلpM*B&bKs`dBs[#p~t}W5V%+xG/mc-l%d"X93E"[c U:z[F m#XC_JQp&kךXGv oz64T#J%r;ѪmG/ɺY*^yۮm]s9*,XuDd" @C4eemX陶t-tQSY&SYyI$`YJ ~1 Ɲ).ڥMz՚Ш*rP ny|㷅`M7 ?iIs_?mrL'g~.(ε'! 8 J ͱ5ɟk[+[<|^˅SgJ%w'ilv<>%}\.nC9(83b 9KJc7!XIi#/C$#˄ !L̿~󦳄@6:x (xI7\%4\;`U`Ⅾ z1V!?Bx= z}ytP~y޿g)M@9}Bpʓ.DߖfcX ]~IENDB`u1f469_1f3fd_200d_2695.png000066400000000000000000000017651326020644600342370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkU?IK6M6vֹ4DV2A텲n*Hb z3dPSJK:g疾,Mڭ/YҤI~Nj4Ke>Wssf85x!eXF54A-)˷%3W>ҨORF_=eQW#<[ayc~xh@?E$/D׿wOf/es;]*'DyXV}uvQLZNVKj@Y m e4G*%6)n7mt=*;-FVlV±v[:셁Rƾ836-scZFD~_+$қEoFnׂ̥(Q{^pحXjL\_˅+h͡•yEŪN<ӄl81T:WX{ D˫)3n $kIJIr:4PzS3bKQ9 -Z* ñ8)m=⟋-8g`{:M4ae5z-Ҋ%nkeX'dnj'8~} ,'YEA٪@33޾L/n2F_*]z#xhu~ULJO= 0©a~:w.+({d2ImDG1r9^/D&BD"Jˋ7R4sNIENDB`u1f469_1f3fd_200d_2696.png000066400000000000000000000021151326020644600342260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]lU3gfg.RRkH n.^o$%Qu@F!1QxAB4FmUh 4lwvgg;eK\|;Ι:w %w-vj݅kM}BKE ek~sq?=,q ];#;ÅMLGl\܃[xV2]?8ڠgJb(1 'a2b N6e KYz{Z#}hpDh27>% >{'bx)2 NHнPIǎʹ5GvlHUŒ[L0:'* b `Y"' *cW[OB* I4l"rdܵbG |~p4k{&W12V`;G0 MuA|n1g6Wnό{4J0+/DɼEIRˮU[j+yP;>CأKjMlռH9(D@Jhrv "`$Ḩ bscR;łz]Q݅0:! /Cg]he;Z#k;.yw]I% ϋ ũ E kK182\q(ZR")B7 oAv66UP{{ OrL5(HP rAM e^f~)TPBa4lohVH0@i"̼{(>5qSdjͶ}v;ky'^~CgSM5$ U@1uWpݹo9qR|qL5i+>:%K[kgrׁ=J {g?Lz9É$Hq#~} W97fgr1>6vt:ǼePdjԂOׄ?Htuu4MPJ}D%.OUq'6L/I^VJvttSAggo;%rXdŴt]-*QD "p#R0F4M4M<*wRjeuuul0e:Nԙ!<u>B &f T!֖uβ PK> BCk 'm^o`p\q TU4MKCcG(QWzN4Gi uM@\5xM\G%} 4xHs؞$a~CC&gBwH.oR;Q`JoCC $jiD[c-M {7K>c{FA!/f\OzC׸xY;#{Xn+ {*xusZ<hϓ,p0FR^d$u$+ f9_d U|ɕM-&UzO heKm` ֲ6^4K-]>XN]v%X.;K.Mu`%n%Eۭ؄x  RAR Ϸ R8W.HB&xh7dE<}qqyy{A- jBx:3{'Q9@@o7~hY ;S\M] 2ka uś{9Ǝ*lj:}VpLWǻ6ĉCe2G3}z?tB5q>E҉B@L-?c)FlX7y R^n!hsj9T0g>\Pw2`7|[V ͓OںmzlF܌ҶKoS G-EO郯>h% D4 E!!EZPZih/fCey=ߜ7y"ն~[P3Z_{竛"R5Fb~WUs…Ggqd(?>jr|=`P o (Px@(>qfwȫ^TMQc&xQSxM!ȚJ"#H7p9~z`ٗ/)!@)<!4 HAb%Kgt>j>DddF'8'f'(:r js_^WV7Lu+ ̾-[ |&R>CK?yT75Xwv~0Xz9F$pT?. ƣcYgme>|qIzXc=I\$?!5t}FKO+@1`qŹh͈CY 5A&f0VCgrK,}3V^np%@23zh\ҝw\:83mb TY_,oܼN4&W9ԕY9O-Υį ˎM/ F RUj;.6玡NZFAҠhx &.55MdJPlAcv2>MZ0:}w6)ݧ A"Iu ^^,GoNezSG8Z.(8g[#a1<)5,/89UOx_f!@wl$cL ӎ zB!ܴ4BVVu4R i_p\ES[OTx( "QC. 7 \.e5BH&&. =R(aHP`rjBy:/g[\!رyS'˗}nMzJA9Y.r)=(K %#?ך}ܿ[Gi,`F9UϰNfρ%8s`ejl"B|PK24E?_f,g{umvN8Gi/7\[,L5 YHT)dT0ӳTkpUk}R;ҲdVm1%Hwq\vGڪa,%dJk}ڶM]]]iΝ;)3;*M6x.֓x@kʅ,[7J*b']v;V;R*&BMJT.`yo>D7qF@MF2!w.rp Վk=FRRl9ihh@lѠ}O! 1Œ u6B.)P i&ٳgU&jc!pqOtqϖ *\Qyۯ1E?EWn?y(L>>L<sKY-kظ k![[M WǯmaպN:6l"^3}K&J/˿ddcTzWҕ/ӵeRJh͝<:8Zz{{UW\?nP`"=ϛ&BP߰՘_ }+2nז5k 3ˮ]͋<ϥ.1OVibg"^Jh#2fRɩy`DZ#VIW\(yr'ш[_ų RU/{IENDB`u1f469_1f3fe_200d_1f393.png000066400000000000000000000020141326020644600343640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoTe}3ӹ#Bl( 6$acҕcޥ+;Kc&#PQDd`SJgw{\̴ %=y{sbqq1XYYy p tUTdW^up,<ǁ*`@7ԹZh|[כ"jmZk"d9̾%?O<.TC~a=rℽ&QUGZdyq_\>Rao?4Sn5"|]f_/#{bݑ)0Yy|q0UvO63n",UFcN,ysʽf½'Pg&u/VଏE<߭6!U Y]$"h3nNz%2 %6բ"@m7_>$+7Ν ;!e/UUtڵ禨X,~2DDT|@ULgHw%9w ϚIENDB`u1f469_1f3fe_200d_1f3a4.png000066400000000000000000000022571326020644600344460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dfIDATHKh\ew_;tf1IZZc1ƤZC$iZp!VWRх W"q#R\(nlB#х*E6I'&#& <+?s 9lSf/ 8b3!8|fp|be{JMW@)|?SB_m@fs!yi3ԄBGT\X"šc-ۋ+ Uۦ@xcւGJ^,s`]}iYXk]H ;!TJq14 r؜{O~ ^{~m)3Wog|ZڈDLnJ(.@*]0g'3r EQB^m0i8R@rys=1g96%K=($~qfU#'K6LOd0ps>sD5FA{{n\]*65Tu9?rq,D Tr~yIENDB`u1f469_1f3fe_200d_1f3a8.png000066400000000000000000000021561326020644600344500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d%IDATHKlTU9w^fSZ-T4b hXhYhbbbL .0n1!jJ0Z 30}s\Ljⷺ9ƞjM*aDl΢o_:D5*9!ḱ~;v4N3,bwڽLM=tuuiKJ^*M)-;[ڗDmIɧZǢ>]plQ|[oݸ(eHHeKmezz]Oz@}yQ|kbG)av4HD`s}[j\Mo /-DXkEdJkQBk\ba5HH1zoMh$e:o!W0s~`}$!JlJ.3?U k,A)r7@2?. e͗]]Rv ooLa?̴D\΍( zX1͎AghMtTˑכ_?;.tV67g37 cO;Ľz@f ^X9-$}ֺUZu"ڽ{}Ny]-Afd)?R9ÝL@r̟޻H1(u0488x͞k? :jɧzyt#ͲLkXn $|"(s3O |}"2.~|c,d-0MU.MU h,,)Ҿ_7l޷5LMYkg94{nHR塕` =,{_}/+VU>PtLw 돟 7Y T_QYa5| ފ>17ޏygD:aŠf(FV :;rκ'`C1A^. |☐hEa5uT׸|CWJco4Q5\2} - \OVJWZ$0ZwJڅ/e7l^[~hn>U_"~@%tқYZu_3v|oIENDB`u1f469_1f3fe_200d_1f3eb.png000066400000000000000000000023311326020644600345210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlTU>;Ng"c" Z(&@LLP6w.LܹpcܸrA4_"5 E -N}әr=}T5a34jo5 esT `LdPl8;B<1[{Qm?Mdt|CDdt߲>-(ܡ؉{j>O/<@>_B I0f6x}>)UH@bCW Asaݘ$?@-;(j(n7#o{SuF1UOD eP" j (ٴ4q]旨DhRJESv͹"IҔQQD)7vf2/V CO4w0C yRmppG3= Q1kx@+Vk[C-R)dJS\籖zr6tָF[2J 85u,$@j%wH)Yr$RžۛB,}j"~5mQa"c%OYׯ$ jb?!\Bd~%Ua$[ljLDk^e ejcO @ѓܞwWB=:I䋑9o)^}- V64 ^pϹ$EPhEC 96dBn!M(5УaJ3Ԓ nPYW ^ؤiE {BZj+̮:*Ah^Əaig'r=A\Z>rHx=ZN8"?~>\ӏ1oߏ™M NKrM)+F ֫/"%y-D[{;#ZSط %,zx-kdSd=Y[wl.:{? T5s;v,+S=x+;;8/ci&fX}"}Ʌp ;YǒRr,in%6hEJ}*nBQ*ʲ(7O凳0[೓ߒ/jkS9?8tw(v ky ÓHIENDB`u1f469_1f3fe_200d_1f3ed.png000066400000000000000000000026241326020644600345300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dKIDATH[l\Wϙ9sƞ{ƞI$v[Z'R4Q(% HrP 7-%vdxc Ӕ_R¼9[Z;ٙ%0h#7Q)~C&2tJ )7o;:f t=0B/ds2%#eCTq mjjAsv !﹏ΎvFFǰ"u ^9>}1_x`s6Ʌ?PQS)re-'*)\'v F3L-wҴ$]'1S?6%OI}[j5p>S-"؆bj*z/7|6zDv6:JÝi !FM!BF͢d]$u)D7~CFM#Ti(O4"h`v1 3i |#2rY0WEP{~}0bb#& -/^ \i_OMȜK:V|u܀ium:tKKk|iqc<pux%lV*uEO΂7TN 7VbJYEi,0SXsWͥK)2W-h`I0lb:{Zb} u @bb?X3 .`1jS3D*;޻4?teu Jߣh CL5<#<(&[$͓?=ưA^TUI0׭,ڕQbsN8y?Bnǭÿ֥V/{Eߞ­.24> P:䥷$3w8@B]o/l#,R.lt'דr!))ېJ` -ȨFʮ vZ_Q`zC& kqNV%=1g5|28ߠa;G0F6Ly"kf 1szk -Z1axdsE9RqԎRVku{԰5aA)sE?/U`[)w49s]ZSa cD.|_ MV&.=Fc@sY {!pߌ)d3 d,7!7zd>nj΍8LΠ<~㌨#mjmQ ~J" /Vw!@g '*&`Ox-d{be T3iJB _g1X]BZN}^QZ-AGLzo+4:/>$Pl >}p؂1 !=xOO11-Wb6@'B&wtǀV3WiΓ?9 w6Ov͇`$DRsj5qPH;Ru*+indgdoHSxӅ{ ZfDhoXIyV6/޽3&6RO+0R?72wi0TewLÁg n{1|޸ .3vJSr%+lO&FsOcfTD^y&ep_`1 kj @1L{b IFr Rm| hmZtMGxl_St9_WXmI{c$,aXGC=21S(9\_ ̯IXUj @*u7p/c  IR- m]n]6kAXR$.E"TJ w/.ۚMLv{/[i2@U,Xx;D=P?/;kM[d֎hnj,m;1-wP;_p(2K6=6]aXuxq=@ɬ`&XqN#|ɻ>՟nskݬ,ƫW ю+tOѴ4]G/pK8ƙ_?pJŶd>)h |i'^~XtRds('O|&w>}5oԶӿR.T*Lܜ}vRW}>$~x2 ~7g0 4e:(߲w4O =w߃"a6 yr4aF@P@IENDB`u1f469_1f3fe_200d_1f527.png000066400000000000000000000022201326020644600343620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dGIDATH[lTUϙvn-miXl5F6i|0*bIQĄ˃FEM h0DDR -N3S:sˇ -8L\O眵?sjMjW"AsPG7}3Awgg4>A T5r_]tlUA󍒭G;|Gv(< rZtבgNW+Tr]D[+bm ̯o.ȺM*LlPp_pPHG5FfVH'j;l\1jm  ڴlF`Jٞ@@+ZX"ԳAͣ#]4QM{>88ϲPߎ-weS8>exwKciX)lsK/\L:,b\11lCnw<]Ws9j5R` Q>9u9Akz+5k䵃PM!;m]4/S-LК[6ňהl+/&"AVE@:Q̖Ar!u)8`nD/5ip8rBJ:Ŏ' g<;0IᴃKE3Q;xӠwn,He8´ǓykFNŲc8{!g{%;ԟQ};7STc Qd[cM{HHz0 " ߏӾs3{J  h M \nˇ(fEf D+S.cO2³HG)stEG؁Ѿ>s AoO--O\Okt( ,t$:a?gNg,OyE}>y'LRzZn>;NNw_X2jPP{ھo,eu`Q5פFV?j6L@f\XX3~3x vH JkƽfccL8 onmz͊Y& 1RNheS?яguW<IENDB`u1f469_1f3fe_200d_1f52c.png000066400000000000000000000021621326020644600344430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d)IDATH[h\Ub+$mkhѤAi)R) *B_TDOA%PD(x$(6iI:9goLZrZ8?$zr7GQ/1$ށ;lS ފFC c~`÷&@HDf2>ַ֊T=h;Ier/ZLb"P #uٱo?+SwE!0Ơ&E>@±D|@EζjYKkDѾ9j/v4YlF*EKZFnHqj+dgOiJu0<}Kӻَ',S@ WN@* Ss/ՐL&=KV٠!]pI%s g@"SE/U27&Ke #iL sɼWn\}i~uu܏8hv٢x;i5=Yr%lW$uCƦuy-z+O !eA6. M˷ iHJWyP8dt¬x" LP>\U#C =AY:и3Jrb #$}w~.إ{j# W{*1VNJ)4x[/%h 㰩3Ʀ_x/>8qHeoDׯ_*}>I9?vuZv,^BPc6?w/m?-Vs+sߊJ+PJ$Fj)-sn<#PrED 3B -Z㓒h Z䵇['S*aqf=X<<-(Bkl۞S϶G}0@@;`Iw'IENDB`u1f469_1f3fe_200d_1f680.png000066400000000000000000000025371326020644600343750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]h[eLҦ9Y6Z>:np "2@&z!u!(1A@,z# \.s̸-횦I͗99NjY\y '=j8~! ~E!ŢL&8~[^Çn۶󡡡,_tcǎ}i_xȑwwO8ip8055u?+v]ӧO{=7iׯOu{P+Vq̙߿8X @YIfvYuq03?dq!Q}_NyE4v祭[*8uF˲fdYhֵZ/>#yc s/ ,Re]7$YFr>f >ۂ4m:R$'bQ| HgϞjOɲ~ ʥRgd.avGVO?PS499vwwGΝ;BaxuEbbdХTlZmؖ͟׮S(;po/^4|`AK!NX(ZdKu$ht:ݲEP,pNΧ`$$۹H*uDGE%REZ+yC4N3urV; Y\\ktucXκnn2d6!`T1F& B)h5,6V@~O#j9,Y"7|+5k}ءȂMA5QC8U'*TmP%Aq/m_~,KO?TSH.KѭH.##鞻y{6ي ;r-2ĵ^ut^_sI137Ȗa ֎|>T*UA4}@־U5iz3\%LfW5qWSTGU:7v qͶoB>kiiTU0 @[\T( dY!cO:t!#ec"3MP%b6\B@Zq(I@ aHM#)D"o/\b>oYLlU`0H0h(Jr9"yVr˽~d2_-~ y ^~|U8{a׮]~bjL&a|>fffHR*rSVQU4I&c"mqoMa"ma'-0ǃ\. e{$4IENDB`u1f469_1f3fe_200d_1f692.png000066400000000000000000000023201326020644600343660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoUgfvvgwjX T>J  o^11/NƯ $L5DA JA%Ґ~,PJnwwbl-s5}y9gc]fw$K BTmgΜyXXe.۽mPnc- @j0QW#Y֗970 ~^d+<ZwpugBH=Y}p|.~fI{J`{ãc2ߌ|9冦syUCV j[2\.yW5Fw {ڨǭ"2Srh LC02rinGJ OyXf $Rٜt"9^]$%?\5L M))ĭZ`J4ˎnx"4C|gƛ]Tje!f42a7cWSb|c3!.!jJb@b ([b`hahAgJxAiƆSǏߨ!1;a}6 ]Td{;LҚ6bv)FbWB̚[>=yys^C4+xhoT1Fi瀚Ψttbπw i+6ٶ@Q&>jm|o #jVO&"ݩ-wnm={V*Öxp_Riگe嚲o>7vi* !5WZ7o$,%Jqd p뮒\h@g #uvk̇i٤*X'`pKc>wwSZ&RU.Y.|h@?#.~f5Ƽtii s՞6Cԛ5R !7Lv9,U' Lr &w)TY*Vծah6o:9%XnP*0hQY/+J攪6E MB@9]\X!`r\jEp@ ,WW Ă?rfFru fm ~+}0PP6vpB7_E]KI!wûg?͋?Ջ=9'N!cA/?@n&RM5yۇ,[v:+$nW "$7N.zY.W_깆<|{'x^s!p 03 B>BIq@{JSE۶L<lֱCOR -RƕR`g˲,HxmsWF ۶BD( 5 ]bԣbHV#H`&!M"t޴F*Jz)IENDB`u1f469_1f3fe_200d_2696.png000066400000000000000000000020671326020644600342350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]lU3gfg?bZ!kZ bHT4xUMz㥮W\CbB"+ȏ?nbvf݅B3ݨ7-Lj n6z IwB;5]Mv7b:2 B(f㞸囬˚q36Qbʢ - '0`'2WuFm-.Vp+y̔- nNfZT4cl{uƏ$pkU/.5Vt/WLElPL=ѓqc|w[D)š#Jvl}SaLF虱Ǖjϫela;o0?߂} Wkg0ڔ+϶eM矎c1_vKx]s ovk ;gƮN-;{h.ϯP>BJ-Ol:9K٢LR:bhSz4|+kIENDB`u1f469_1f3fe_200d_2708.png000066400000000000000000000022461326020644600342260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d]IDATHMo[E3N8PCU|Z' !`;v@%`!EjT4r)$i8N4}?fX8v$#3g;{\xL={~9y,Ek6Ƙ0hsYD~r d˲>5|+ǫθ2 ߯wi,G1ej/ fiԘ1"*6 p"3*^ djZw9XƘ28zAqL_Ǫ\X׭)[5<333p42,B,Dm[?GbpabiLcV%a`_ FJԮ`Y ׳03[%D+&@4~%1Zf%D,$ QҼ5R/}7/5NR7{f no7bHXֻh@ƢZI`p"tZ,}| QX+8G 5WaaG ic; `6Ga+pwLpORܯU XuN68UG`[8Q}'mgtEP몈2 dpYmEhXz!uZ cHi_(5^`X _+asla._І}-pw b &7%xKUQJ;u,^Lak\\aUc4^*s 1,bK~oD[Lܾɷ#yhbAE_ajn5vVPu!ŢQm<`bbį}wgvR^0syE^^6 t{m4$Ӝunܸ@,#JjCpD}`_.u^YYa~~+W8Z0 ED}%g[dZ399SSS2E)d(8!NS(z*NP(P*-vX7#N{fIENDB`u1f469_1f3ff.png000066400000000000000000000016721326020644600330240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dqIDATH[OcU{ XhP)P2HL$cL4/>}Oabb|DQ s>ۘ^>gWa)?B|i_k%FH x&3ϋȅ\ !ħ몫H_>i&J}^,@ƯeYVR4G¡#|Y0yH^3;D +J-D_ +_'ahqo< 5"u7(!70p/g2i`zjDN&H.s<) %W^n7fg\2\ڸ,l*ɻ+/3{+1hFH*޹9 cJ8=||xtW}HJPmnn^];P8qܡm廍m6kܝr'/DγFs\orjQ:R۶]^Lc&>|f/q{*N'Xkwr y-%J(q>!g eYA];ac(ѮoЮo .Ԏ˝^\W( [q65c|g}nSjӢhmx tPof)|ɉU;'H_{R6X/RML21t2A$ԛUal )Nl2Db$fn*5ЖSvJupn?uP([GG3U!6[KSx,Rj!c;ORj=y sW2zimmX]] \=--C2̨R*J8Pl nIENDB`u1f469_1f3ff_200d_1f33e.png000066400000000000000000000024501326020644600344450ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTUϭK3u0@P(x}"!Qb7M|hE/((AMHb#rbBmiK[e:3t93CˤSZu}KDʶXPIk:o!?(G#݅w˪`GkU>vQp? ؓUY  oZ_Wx@;9ӢgU;ޏsӨҲt YsBSuy!(Q%'gplҜb?{wߢEt |U %l@Bn%V20#(^IV3Ye~shaR{./L7??ۃ#j@4UûwxbGuhڿkO$ :##ڵjӵdzw>d 4'S~9p=uSۚX)ǴmE210`k9FZ5CCNFL:iqTWPzt[jL72}Xu] ˳aKB(Os iR/*/Aȉ3oDu;%3IENDB`u1f469_1f3ff_200d_1f373.png000066400000000000000000000024571326020644600343760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlUUfڙv(C,)`.jDIIMЍDC\cĵ1q;&1F4-2t^mJ :9={` s/ ha 1#Ø_۾2k@ =11ܾ5Ŧ:z'yA@7==C\c8k\6 ekH#v e&BP)WЈ5 l)/hT+&ulZ$?79{n(b)%S}hRiY:ܹ%C1 gk}V(.Pfp=vD) @h T.QTBWJxvՀÏ?Nvttܷ'4ݥZK|s,ܞU_a^;8xXkY&oNPehvg@YFp6ob^;z4w/,غ]ԧMlE)U8E[t)6ҕLPB~>lX:> p׶mԩS *)d?oqmڢ5.Oΐ5qBZuȑߵLJ5j5~wkGivZ\TVkmۻ:D>̙3}--ͶhQŵ,,) Bb]Ǧɱ0pibd%500}!xd21fccZ,;+\\JaN AH8x z-K A-ffEn/vM-V09W`X[:}3218 ((VǑ^'D!DѢRo:ulN鈷`+EPµTz]OVT1pIJGk еm (w{6݅anD{S1>| p=C)eJҗt-qŲ,S)?,nb ~K'(D;ٵp#N)R@V}7N 5d2+ݝ<X:h<7W= p_ W\pa]`81QZy1Ke\A t 4׊=ύ6(Ϲl,}vz2Vł551>,9T ۖ~0F!5J!Z*W*}}zXsVB.s>vųIENDB`u1f469_1f3ff_200d_1f393.png000066400000000000000000000020041326020644600343640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoWwތ=NLBBKC1jH.TbUcǾˮ#tUU;]WiE% JZIuLlǞynF97p@\v-STs}OmV@nr˗/߽q#r^=ARV?J*[jZz}0#ޢy?8&Hƛ6(vTu:;"r{."jAo|o1ʂ+$1"q֢ }puM\bnn(`T,^ǹ}dǃ T(';<1Thvv N81X6ÅS'97w\ l^IY 6I'_bq(t~-~[{@a<<埿$cx:5_Ī"<: 3S,;Bk,,+jGfܻZ`..Nqt.@/oWDžSEcDJb}1#-< n 㙀¡ZVLB2;WtaQ舓Z45xѭ(싐:R FZos^I;S Uj{Nv8Ix\ۣ޶TMj~mk)H9erÝ'G#WQm~lY7 Q%XE;̽^`bgBE:w7/WpM1s ?pUv0"PIpGBIENDB`u1f469_1f3ff_200d_1f3a4.png000066400000000000000000000022611326020644600344420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dhIDATH_h[u?'7I&kӭK,nήtlUV6aEQD>ⓠ(IP_QTe"6qNmmgIYӛ{>$ϖV<9=s9gT@R1>5>~pSn=~(PGFF.S]۾':$h4O]fA]?|o>HR' Z: RƄW*@WC@i3%qc*Zmh1SIٻnd2iS5$x+q3`r @5r\.>߲Q(<lEst7 ܞ4Lu3H6>K&*`yܚŕTxS-i)g Hp|}wsS`2tg"~]ˑuKT*feQKbL)p65J8诲.0swAvS/uQ=Uc4Cl D},B$`pOr!XU7hdrP@W)hFV~$kDCn-,r)#!E󤃔A)zl 6F-E۩Lb{t]̙3c!#DLmōc/N`kնZ.0M0[BҞ +#% +2̡9~&fڨ gi6:ٮ Z"rXcG? 闍.>D?q;BUC@P ۲楂hu1ƥ5? \9hDQ"2PA|Jҿ[6.O˫HȀ> 4Pu35_ #@.7Yх]}SkZg+Enz< YL׃'vv/64z0u7@z" ZO [cmښYP˺Tfy)vyg3Gmg6ש bm<ҶB-5(N:CrsvjCҏ#.*E"BEU-w&48ݯvPyu8Jg,JV}pP(L 0LD4q]9,z*.[:6U6 }DZ-GuMA)Xqp.32tk G+9*QChOf~=5zxqrjѢxyQ åk=௓J>6ZVHLp]IgMKLMs¡||JIENDB`u1f469_1f3ff_200d_1f3eb.png000066400000000000000000000023321326020644600345230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlevwmn[4"E *x҃gcdE5 j!tmv?nwmK4>1όxRZmy4j^>pL5i֊/bh;)O״ *H l EIxӵ)DYwWZ~#H6J8G] X*oz)q: {ȋ{oQU[[C)P7<.ّD7a.V:I&'3swxjh  zͨd*#DҎP*p,;cDtTE`6S"2=:YV[y?+gůʕ2[t?">TxH=.nf G{p ފ4Tֈ@]DtX'BLtC : J9*I7hKd`0;ORI0-eFJxv@yytGMv4-/R'm-q1_P[i ȖH鐩F+b Vztp_7e3S, FFEtr8uoekr,}8LD&@,ƥ*\" P\jL5W*aGUjo,9_~Ec$:"(li˩ijA 0l١EeQ<CAvuFPG:dJnl mi2Vk u:wm#>pF1_eg~:Giv|&cYtz!##hݱ _k?C$Ba~Fsoc/a;\Hun2c ՖT_Stvpô+9ƥtޡ]73zuEwvIt?PNOf.Y;"}5[O"`{"'09;t6+ĭ͚mx "4kÒR٩Ӕb-=H)nbSiQmEj|p6"d | cQhrb'A=IENDB`u1f469_1f3ff_200d_1f3ed.png000066400000000000000000000026361326020644600345340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dUIDATH]l~{I c! *-D*""U!j*U"ZVJB QӪUBp썳׻^3sold]әsνGp}?ޫ. Unyy}޽9zLX0ξkK?v=4?5l}mWW!"'smr=|ynYVa"64o?tKEB\,Ns8=aP787^ 7U4 j.^hΔȃllS`86kmHth\3Pl~%AnQZ30#[pSih WxQ ⋔[q 2d>BѵD< ZX=W(4*w~}vhhhoX[pSK 3/[y_'8~vob?}١wZhc:*׏X$lia0%*;UG{+/g:BSم0W\^WSoJr=po|bZl4ODK>-L+ 9:W6qQ#8&P<@mjMNqMETb`@&>8>ǁ@ p}~~:5 "K_i$(}tsgmcO/׽7ZY3HFris86t$Xk}_wiyM=]z#qJ۶yDjR˫s1]e#Nݴ}aNxNɃh }ݺ; Jۏ>ީ>DAwGMIENDB`u1f469_1f3ff_200d_1f4bc.png000066400000000000000000000017071326020644600345270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d~IDATHo[EqLI%X T!Jl* .UHbc@YؗMSW-4]~։m‰WY=w7$x%rUKJRY%ĵaX,Vπhc$uWo fgf~>|ڊr/f?GRp,|>}TsD)]r<R.K&7ۃZQ |t'զ4m;أ²8&K!V"̇$FbLdin.Z3I-bi0@'SAd6 qu'gq;C\9΅ RR(W ,u;91`np#Bb iQ0CNXf#A)ա%[akSS,rf~ !:;Ӹv= Gtà ;0fV5#} fKJ-[zC){JLiq3j& HGRӘy)k4],Scn^wKV3M7`"1b\«j]VWgi%&;Bh~LdsoW+˝mr?1j}em ?Yrw8}m+sl=9w,B.%%)~t@44DL,$WWwZǟ}u%׭d2rkXAI뺱zacGrcj>k1t]0 ߸մopKhv,4M#0IfsXd&n#F.wUWywkIENDB`u1f469_1f3ff_200d_1f527.png000066400000000000000000000022111326020644600343630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d@IDATHMh\e{'i&4Id2ڈQh Z.iJ)n *F -tbB4id23ɤIۄ(xV}{琵p8bsR`?׀HNUpG&'πޚ|&˲vxޫ[WH$"pET;6МL0m &`LEd.j) ,R !TX+$2*A0<<\RrŲBtnRK+ص:y[?w)ː1\g+19|I x[c.ŠLxu6#35v>t߆ȗ T CWrVr}b9vum *$c$3jus 7+#Ph]"kOp;B*%QK؍Yͮ6DmCm%!8Y B~z^rX9ڈXheOkvHU,jg<_W9Wxbjj1?>4`JKGM8}@?\_8*i%S]?sңd,UESot nZ(,Ş?*vGVm&7xˆ̓_p%QogH6- :QNj*uFh :IENDB`u1f469_1f3ff_200d_1f52c.png000066400000000000000000000021751326020644600344500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d4IDATHMlTe~wL委0VX( Ԅ)( qaа51肍1. 4хn\H/jA!33NΝ\1N䜜{sHq<5CmJl-DԀcx3,ؽDݔb_,}׷3B߭PkHWA]( [+`(Hb,&vp螚aj!_RxyI]\O6`]0B"_~,W~\.O[[%'ZOzJwtHG;l(̅UhQJ˄-?C_SΜC+xHC@$ H{6T5xJS,X>?~Y}߯*`4x $f3U⺤9ˍ|bMJ-ʜa2>6p3Rәye0$_*KN˓5d j9lv]/R 0k[l \a㪕mg++0q+=b(U#@r1QZsi2ɜ+[p.\H08z4=qAӔ! &&&U)Zъ/55e5m߶:F ]rKuBGa[V'R> |1Z\wz2%DګIʎ&am.3Bt+VJ3 Bd@)u<4?r=E\߃Q, .C(8wxҤ9X 9{x L•`IENDB`u1f469_1f3ff_200d_1f680.png000066400000000000000000000025171326020644600343740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]hSg;IqR;ӤV+2D\[t720.p-Ám0 ahNتeѶK]s&=ill H$w}z~'N l޼Y{  hp8q`ddd8 k{F3 DB>~(՘e\mWwرimի J&ü?CUUv͛7Ů m1M3!IRIUՆT*w3== D1"iVVV$MӶEI^baԃ|uSnUd2ɗO311AP`/pڵ:;;J={bX, nl 7k|roϝ[ZZ.u^o׏Y"TV0Z{e5dcla !+(WG8Nqrr2!`֌ qѬj>a* z $qEj*Rj!bVcm .K"m5" BbTT XMxGS(q￸'7FFFb1ŋ\6feZ,r%`׃$TۦCY/tvZ,w&rnIܻǝ? N!f%P3/l2ht0~*Іtz#TN[{{տ WvT*~mpll,NTU +RU˲~ B}@<(躾\*,,,`6p]q'd.9rmAlappPrݿMMMABPbY\|>O\Ʈ(\.# L&) z֭d˲>x<---LOO jeY%{|-..hmmEӴ{}G8؈277G$^KX!E8&Jsٽ{7;w199I\fnn]x<$ YyiiU.Q`0H*`*kV©JbFrp,--Q,Z41 ?V̷aIENDB`u1f469_1f3ff_200d_1f692.png000066400000000000000000000023261326020644600343750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoU?}߾]neC V Qb nwjB&ML \($ E 8lUֵt9^u:y99=㛂 / l@3gV+ }g69d;ԏS&Uߍm?74'Hkis*X#W9oeGW/SSO/"_ !): l5ɤxyʕw~}D"PP ;D$G A}Xqp-yp[D &>t2Fm7_w-bҿqÈ覉ȠNM5>'aOKI4ųmP'/t-3en"8d= Bu>MGIfۗuzzTwgQ>Υ3|QW#\(ddXI$.A hAj$7 wR1Oo\fWhDi`[+JLuɥ@(qιVg(KVepGrY ۅ`RUBGoPotP^e^ }5P U1.RwIjo8lMWDbX4s / PSRxS`}@p/Nf v[oԭ#=zz3൧X%f 2FtST٩T If (G``5_j4YDZǬɚxVOh5$^6WJLҰm߶]An3/@0~"` 9@U%]: GS緹fSrKzEmګ!036^oA?ahn/2L[ Rs3xkrr (5௅E-0' b_^ "$2tn~?>Wt2?L'S|:u~HWޠ"}f2H)yU~J7pEgv;9n hR`6jl֙t绱>DRACXeY}ض͙@ M(lFaEt}o?JMӢydv-HPTh6DQ2egrƎgOYx IENDB`u1f469_1f3ff_200d_2696.png000066400000000000000000000020771326020644600342370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHIlUofNĉkg+lRBJlUK BEH`N@ z*"(U]x_fq6A| ;b PT![^ _|Xp%~HS."Uo.wv"}\,0VWZ? N_@*+||oIi\@#fiS T7m(G^ /MUB0m>:Zu!HXT`k\hhG]/yf(Bv=}$Wr\hb+7^!ÉǺyqOʩG Ul:"ĕX,5hYu=5`/r&z49C$ oB Hi[`CtYS1L0%wדjN|6&n "oYȗ}:g MWc X+ΕJV)}U$" r:Hg)\ @2b#Ӑ3d3m鬲Y\ 2:eRb^R|ن *>Wll$2 {=v=-F"t;{vUR~O Ɲ: 8P*3d^S"QwPoQ5T4 LWgpFz2O|zͽ֢xrRF)v2coT,qaAN7LFIrrݜ4g\Kǐ仉 I(%b/~gOPF*sS ]^ZdW)\C;;0i2h_gfsMkm8NVV3 _'?Y&p0 מ;?/mVi"$ BY}m>=>հ_jI\}'jxR%IENDB`u1f469_1f3ff_200d_2708.png000066400000000000000000000022351326020644600342250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dTIDATHMlTU7vhg: H%1!&ƅ QpDƕ ƸsaLHB@BƙiyuQfP$7s9?{<9r$}9q|Q ).K@cfD bJ1S >LГ0\8UPfT\ea%b}0 s211,k9vK E4/N4D%_VocfFGG_ݓ/+F@6&'8zXEjJ喢mFD6x>Rh!~NŰ,0 1ƴܢƘ 䃝^QG<BwRABD  6`(lڟ_^MK'҉GL]C+\LozV2ΉS'pLnO5Ղ8S i`(%AJu@ӯ'VZd&G2&q/ NM|,]6%27a!,D6N +Wvh\RYei7N:vYrȯqΝq~ܶճk6s=pd1^7fqG8nzŒ)*+dzRrQItbXNhl|ՄL2%%hV_;Ƣ (]!)%8qϼ/oH(#jebmk9FL#ͮ0#//ESVl-%c9?o8ݛKQ4=T'ɮUbvK ;7oYVsJ[{"lZ1$iXuU&one ❇3&@c' RW5T$Fb9|9<0Mj:=ixR/ +!G+! z3 A,.PQ=M0h{HT*1TgI_8B"^6SŹ^מ`AHQq_ұV"R(,_$ϱٲ-Ǔws}jӍaFX^`iջ`~8UEì1 p:<2CАVv;F•()D4F! c$pP;caǣ<ެ8ĪSA ^F0?yg!2{:7/ڎ{^zhUb{盲D]8K;hO-ê1r8RS^~zQ:\'E<5XaC8[4DG;%e(W3ʘ#QV4)tfhʫ byr~_bwri^y kx]w|4! dE߄tSݧKILIENDB`u1f469_200d_1f373.png000066400000000000000000000024431326020644600334040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoE?3^liRj DAPi` E"m/51?@ZEP#nR*P]ض۽wn-t2s33 tuw?.x `0eL!Q_ p4^re =Zk^c^mLwCR֯^=p+!9r9O_EE!{&\. uB<bь=AeY= "F(4.g 555 vbR.. QJ C!,ĴL=Ɍڶ*}7, 0D) G.#=& 'o;+Jt%w·,A ]N!rȤR;:<fNJLSSlhH &9H"AD м2%Z@W*j(]_ڞ_3~oZz)r!aRS8pLbIX}/K$ba߿?SpP:<*Mue}U|s5Wn|*gNo۶mNGG޲p89E#7dZ-"l#Fw:[!Xזx`1:/(tpca%wivu2q؛f@ɕɩ8?_{ˇ3zwoŹњ( arޫJ-9|=­ZdC؂ב3wk[$u Q *|t;sN%>t 9ORC##^5_ŃB kPT#gWuV#_X-_P5(ټIENDB`u1f469_200d_1f3a4.png000066400000000000000000000022731326020644600334600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|drIDATHOg?{hK)@[@+AOe6w01n--ؒ%.4Yf n$bfũ[ jO}gPpY{~~~}6w_lCBHH1%=B{Ob1 5H2&-XK[|:jVPiw!h U) o>|Bff#zxj^Y Buse$*_e,IENDB`u1f469_200d_1f3a8.png000066400000000000000000000022161326020644600334610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dEIDATH[lTU93sڙ:m )X!(xM *1 @R'|!F-F%4#!D)V(-mf9g0PZhjz:Y־dC7Rz+Lk v!8| U֐7Kk".@C@#+jRD$sv}xDGCCBC4Rݯ=hR)ɾ L &q"R0wfbn ۞Z +ϵEK#ك^>! ٌq3JHi\MqhDxu@`z]gYݼ\_WLEw`˞lE.țM r)%NI/f&w6 2 5TDoNo}|q>/ݞjgo?v%}T2dZ7]^sF*KxHqv E>ӧQ}7\XmgZ-DI"kMMWjU-%wlXqQ4;IENDB`u1f469_200d_1f3eb.png000066400000000000000000000023601326020644600335370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlTe}̳δfR# ($7$jL$&]ib4qAJcX@\ "P-[(蔶L{?NEw9srضrf?@XSf\ص9Y2 !\[UIrg, c|M6,O"d w2Ie?W(RJXv;*T?Hu'Pl'qfҏ,how?dk=x'#mvB7n<2P$F(~0Tl[G:S 00h_,Y?흷O͠jK)ټ 0]4t6͍H z34̴q6:BBtTsh|:ʁӼ:yo lmٞn/;ܓab\T Y' T%? %?ȱrMO;U܋,t^# s//PGRmD0 r`fuvbzy LW*iNx,mlcpq\)ErM:e+4{5H3772 缀biir2vnH0Ri~I37RY[xQrk%\gVxRi\ƟwTrD:G2F ݽK.[KMue&@~4EY(V1tpe힜$hZwaJkWBv>а-uG!->تcjz/ioiaVoZKc#|BM8¥pbFPl+HAL8ZrAb@KŮW6R^VJ+~Sx]]i $s&=7IG%z@[u˸&2xsK vv1jxm|ss]E2Ti6ܙCD46 !رE]8@Sl~9[UcYDH4]0:RЄIGA2EI}m)%߶'E(WT0QJJJ%Whmq1拃GH3S;}*Nsɡ]H*bޭc:.IENDB`u1f469_200d_1f3ed.png000066400000000000000000000026411326020644600335430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dXIDATHopTs{wu1 (lT"Qà _*R;SGΨm僌Ҏ~pㇴ0F 0F"b d6{釐@s߹xٿ]ޖT:mo.#|Up$n|OgS?n޺+h[v)BWCnTO]{C`29If˔vzPjz_jnuo^AG谗,Z:}+clբ%@?hk7o 4LFMϢ,:^A:&2Vw m/%ɑ$NПczmCJIRMNW芫~ eS8߯ Z_bl-B.L4@!wo_2 ox"- )q!4A&[`$ >@_ u">ᛯ` Dlˢ'sY>>PE^EΑ8 )ίB|x T) K+-}1nO71*#w,:{I9y TsY|wˌ;wZz^Q=<tK{ͩ>ry#||jmt{7hJF ] P D6-ʞ4s6;>! (=׽rq]د[6¿^ |8my~624 p /n襪l|RNmo\Sr{2ON\Snn(#i5o z>{tԪm']zݓI hz( +;d:?y311ԙg:oys=~j6E]ʌvD6(- qN~k]m>0g PIKs&joX $EKÉ.φ]wdYJ6^Zh[`K˳ tK %.`Ӻ "y>W~*s&NJ/ 3*b,iUBO7w[SdEtxE>r~#+k"T&pi?6 p\YBOh,NOhq͵% %Po}lm|kM_a%L<3AOǝ j0J 4d%yUG}wa:.Z|*xΆՃj9" ߇ƼVky .yGw.r̲力dɲ"Q'=߼S<ء0I$j0gT'ݣHẗ7|1uhYwWV1Lsgx)tV۶}q %\Kռ=I/Y&}G]BjV SU]ۏײyoݔu^Bʋ~<#^˦+4Qo:vnXpoٴ}('M(%4=$ЊAKOSʀ]A~ ڗ*0!+IENDB`u1f469_200d_1f466_200d_1f466.png000066400000000000000000000020521326020644600347560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHYlTU>ݘ.Cر R%!A2b'T0>HC" J|kM#"$4"Ŷ6Lgm&s.RfPc/"[J.'N_gWvmiR|+@fBR³'\8lOo[K 0-AȈum?t9OZg?HτC9 f Z Zٷct4bs=V46JkK8"0zn@ @5aqMuy_4Ӟ\3j`wdOXg +ҝc6"T'Ịu$} Zv ҳDRj>E)&\)!  j{Vϖ QT.Ē沦5CbO Y;ӴfpjMՁ.,ЫO@PBLLRn.>(Xf$<Օ[ZVJ - ?2ؽ/mw1EҒ=yLdސ-JQEpe( 8(d>776obCOXYd7P: *V!D+I4fje.!ά{9`)))eS93qqjʮ'`+Քu'̄Eo_F"8#t\ٽ8a%)d p}7HZ MW4FK 4m $*_뵳i2u;|T3ol'.tddfI7McsyN7#W'+q%ht/w~Exx|iI{[Tq# y*8=tˣt^Iq> m]~~ec~\kXc<#]5ޑ ?rpa3yߍ!{- hg3wbY }0G*j_?ZHWIENDB`u1f469_200d_1f467.png000066400000000000000000000015451326020644600334120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]hgMJDmb$~0mDiV-^8P`SplW"x3+v]tnt-UQiJsjb4_"6+[V3|s?%iG<<$lJI}AkaRoa9|e׮e$YD [o`r6Df"ԙw"d'`?ZjgIgy♃[DD&~4'H2h pw D"WPCn MtFs'?{hbqа +$\g!V15QwRnM!kkCd< c%(2^0 1R8X弿 j;6oO+ $Vtd>@@ w%?w\|:yZ$ pf ڿٳ#X˕ !Mwfr[)g{k|#K[)Hpȟ4Vs?976y_Xbpt' zX4S'KXI4 ;Q&:ӧow[T'XWNK˒t]wuEEyGfp{W ?,1z6[on-0nK M(O!JM3[M-0'+Og}JAC+<赯viӁYl xD0IENDB`u1f469_200d_1f467_200d_1f466.png000066400000000000000000000020641326020644600347620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTUg:Fo$)`"!6&bb|0hBBA_|2 Q,-1PLZ)v3mg̜|-t&vYΆ9Կ):PWf[dB)ґJ+,j]7)lVPPTxx% hܾhY{Lx uL{DLH(8/h-׎Ҵ< Ip&)P6dZ/aD % &[[}-]MHJpXx]siϸ)SSg<#ɬ)(+B,4'|H`(z&fD=epApZ25]ח_N>=Q̾a7ur.Љ&!4֮)/{I^V6"?S$㓴O@ *DueTZOovx~JQ*i6'B{Q|sgutxmD=(,Hf ({Cb)9,\fINѕ+T05NA,'} L`$18!DM[26U3{{r.GMҾ%N8[5ڙuS],a .ᘂUIem,ǰ+kV:y}>Z3^y.Լ U@Dk]fQ6Gع pg{P!2IQ*J&Q[Q~-XYsgM*J&<-5q6]ől30rse^M8c&҆wz7|;RѸ>|P) =eH$ O9tO"iH =2n>9Rxhm/a,F;s76/ U&uU^&ܿ$c㴶~ӈDUzc(5ЁTdO)+J4ZEWH瘜"TM=O-L?xq&o֪xź ~}()%}P +vt"\8q?4{Ȣo߇縕G된3I^Y"LD"Ӽm4/cن4 8`qv a+j8C^) N!ES#L|+l'5ÔT#QJ ӔW'[%q33, - ʰ4Ee0`.l;Wߠ,0Ś (ϬCa}:=49K:Ĺ?rz|Ye)a/d~kyzl-y-Тhɋ}uCp[?(V'ߡEӆpy|\X8ڞcxL{^7r(pM|'~ɲQp#p,h j 7c7Y eyE)9xyNۧ Yah<9Eپ- |ʼn6IENDB`u1f469_200d_1f469_200d_1f466.png000066400000000000000000000023241326020644600347630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lE]z-)&1ł&OJ.ɃȸOPW&d{Gw*6C8ypFz W3;J28Lo+'|P5B aG1?!6TK2bɫA%.mbƵgF45Iץj %uR0=J8)&:M-bJm=ɫ~tW{YR""`C]X~u-I;h h ?+]"=w$ZooE/h95חslϸ8|Es=o1pyYJݍ4xꗞXE/_'^8$Ek‰x0Y&*ID/0ZD̂Z hxIENDB`u1f469_200d_1f469_200d_1f466_200d_1f466.png000066400000000000000000000027051326020644600363410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d|IDATH[lTϙ;6ml$$0*"PQQiKDRJ$?4yM IZx! !Dm`[v؄_g<>3g>L[Yֿ:1%'>z=Bٺp3ߍ4+[Z)u? m녲{TKp@S=s;E~o9\F=v ]9@\A薯*_T"푧/x&_K)&$wZwe-_Zq@J]@ɞFD~{._}+k==0:/]zG>*V?>"ݣF,YB6j PwiIJ$zH=80X6(K&f;eka%bo^=)#ZsTfRW_86Qt ?B)Y\0 >Dp3t) Kk9EG{l3Kp԰RhKXXg3r}>#<F6l:]4E1_ކ Z lV7QӐ.dQY67g?}a(>؇? j"|XB W۹'K}.8Өt^>=Wynń+opq[ևbC/a*sG8x[XU?P61 p:J2gl}>8$w 3znyV쟁T |v{hy"tv4U%U- JיJ/߬g1sDaoفr G@V}c j9=r IENDB`u1f469_200d_1f469_200d_1f467.png000066400000000000000000000023271326020644600347670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkLu?y888\$P8/dZ.aSHװ՚-4/jmzdmMR4_HԑB(8sx_/8{^~sMEE]y%QB)O:53-S{ղP +p$ﭪ2eP^"CYfY5{ uecZZyB'N]FI]"Db{OuVRI>r_4xJiL* @meee:mGTq@$-ޥx*uwf śm3zs2}"6i|2#̵,Gt!V>â(K@:1e3@ 'ux(ovvdgtPjv$.L)ŋ{y0/,a64c1lֶxanW8+l^JNV u)bt&ƛdi:}_߈N@ I !ݴǚ||5Fȩ{ i`^¬t?Ex{l&$Cׇߝv#/kࠅWtkB[AO$.5M90\QUlw"GSNcMdSu&|y E]+Q#iFnUׅk_UjҰD Lzdn؂Ù? )Uh1}[JA!:C;#wI5VH8Z1i1;9ZM `v!`w*"֞Eo0PMz}~ ـLޗY(jo]F.F\B7&c wrbPΨF04Bhs}< &?\`SQ򵩶(8SB:Mb rzeW>Y&7*1%ǡK15whIyaћ[Ѧg6NI`\8{"~K %>ϧG9<]s>ΩIHybXPװY1`b (`$¶`5@O5XXP4ޏn71HN{,ײTi}-ΘV]MX , P3H 'ؕ@{Z*qĸׅPh  ;ز6ƺ B๝I ЈBJK"\~i e{0ZC_Δslu?R30dWi9f5{[2ryA{U"f.`.] ֞~'ޖQ~$ rlJ \чro@?cd2WEOxB=V"p;r_^*y!tI/"܃E}^ ھ0ޏB Nk/nnrm'SuLe<~YUЄ8PiA7`e<kqr&.rfk\~M'PjӘGCDpcjVfCwxb%9kIĊ<GL : 5y}p;}.q\D e6may&510Z3͛)aJ!GFp Ѳmo"P_ƌIJ i3[ȗN0t!Su) pVGWr%?Y559aB&t>Mplv؉!T`&إe~+>N*psv-xx j&ؔɩr=R-#г`L327>8mdtwy12f`|\-7VkLJ1Lȧm1/_!C' ? 78'ѣch u~6RdP*t#W٘ONSxeAɒy[.1o KolL1edIENDB`u1f469_200d_1f469_200d_1f467_200d_1f467.png000066400000000000000000000027041326020644600363420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d{IDATHkLU}ߙw )Ck/4ZdQhMm4[FenhB/6]wMw5{X{bmֆ^ʥp 0=Cv<N{bᢽ]8fPw |BmԞK?R_)mq)f:F]omK&J9?j[(޶Y]DU(T?y ޘ'+SB)yjρsnD ^RwFgT0#6 K(%@[lҞ]q@TqGl>m_TS=͎09rkʿPfm2ڕQLS)uP0Y|ouԮ <-!iipQ-T0o뱹4ؔ2Px/I][7u5i`؉t(v>؏+Tlj&imzukCx=i_ѭC+Hĉ @5c/tqaY iI7X2lR#t3r[MC0ٙkv[JAϠ~7!b\i0ֆ's'/t\?)ZFyN{B[ރ\+/"03W}8fppsڟ4r,YzI>NTi[ '~5db]}K$ED^ ]y6B ©hTS}km''na U]eYįJ0uu#ByGPk~P ^C##0U屹J2{f޾P<ØkH(  3 ؞l0+t7>,[CC 5uIS ]Q1c&zʳjB Lz$B@^a&owƝ7ŷ لe;QT,,O ErR'ZXymD++ƛ "pևgN̆]xrhTn+oklCKj7>nnTY&+"J!Vz0#P2et׿kGl IENDB`u1f469_200d_1f4bb.png000066400000000000000000000020661326020644600335400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoTUmt锶jKg*VLh$111ML &&#b DBEbZJthgz{ot~{}/T*]4Ƽ`ƘX,`< M[m ,P,^֎5 է@էpg]NET׆ؓ#h Wp~[K$ ၰ&؆gg|U^;po8w& yT֓D CGӫDND v˿_(\u?3 Iwg,\LDֲH >ɩ#="@lH!.BSohl'~c!2%: փb/dn1'uwӃJ=K/C &,bлνOY-Q;{~pI@o ǟE&mH1 \oaBc̕Mw3_q˃û7ij@% Q:lԶ?,gZ3{?דDRk@d[ +a6*Q`eGgmM;ˎY5&6Y:b떺r*JjpD8\IR(_K@A׵NƣJ߻st[4+QK^p;'K`IENDB`u1f469_200d_1f4bc.png000066400000000000000000000017461326020644600335450ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKh\U;d&ɘɳ1M҅M.DZ"hQP\Յ., "Kvĸ4Cǒ6M3ub2]:YBx SP[Im-ʹ=Nr-O~ %"]E(tE@)0-Amř[X,73Tu?gy%|erct^o~*Zy t44# eDfC=29BJI$I{^{:Gg)]b18c+j*jhqg%_ 2[)z>?.O9 ap.)Bɵm Pvd,1nqRضM40MZ16\C+FIENDB`u1f469_200d_1f527.png000066400000000000000000000022771326020644600334120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dvIDATHkley߮X׭8nI1 \NCF @1AAXMDA- KA[2 6hwa[ە}?tPϧ79s~<I&Ŋ""tTڵ?=xlP"%s=b~c/x{ݪb˶L#"XX9Js0WZ4,zTUi&. -4*1˖I 80MEmy04=Šk+3vVUyzq&7/ζWl^EIP;U\CS^d]wS^0F$h+2LԀij XpfG]Nt J0c޿o+ .tBc p:lx[# )#1EO^r\[kO "`W+ ˺ H߉@;`‚yLB9lzdzk)9O8 SԼ[4=xvO6w3×\Hؑta?4Өd@Bp*IW E8v&%4fE,u%,:l#$YO$-)ŀKtţQ;*Rw!]\i_u7Xi[ fwZO /{EnZ͟A' \Nlh E@Êo}jc: 0%\:L]E`Zٓѳ%2Gn_pB'i*@OA-KhlNU^p脦25QFp%V4RnO4󷎔i:AO3y\˓@}[͡Q.lmuҸ6~߾\;VD7os o5\Fae~^äy茁Ǐ[ZY\[s}rw&eچNMin֓{,yk- .Yu' ph`#U${N#oب ]a^X]_*/BƳ(5hM4L? ,W޼Siw`-Hgr mcg\uo`/7Şo' sPA'}f[(CBf[J7ƅqqIENDB`u1f469_200d_1f52c.png000066400000000000000000000022141326020644600334550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dCIDATHMlTU|u)mJkSjJ!$cDq+eʸ4.eDHp!BbD*S3L;vtT99b:au hViAZ@P|s'y|Q4O :'{Y\ՊNz&18c-,蛛Y>+H^4fydgcό'IMSX1usO-Ƶszt9<^7QS)K91Hi/\"iDhJZV7ӶI<^I:@)qkOH%xMк$n,vycG~% !1:uմAƨe,6!@kV VR֗k:HFO0̼e3T-`a#|67\a>*6b*I |D.,he82puߌ&ǿJVZh+"oc \G̉(EK23FK Ck LHƱbmJ&WY-#$:{ b"-jK#\[ނGl3RX琳B$S5`AJɮrJqSϪp2K㸵SZ 8]E%Upe)g|Sl*sXsXXv%oڽTa.^Jc4.[Ay8LM8wh}-mz_~&dV1ooKk+hxlytՆ-TοB)%B5}Ŕ6 ^0sy4S5[scϞALS-~(gHYqhY18~A~t:`Ćgd|ޞX/T TP$žY(-&JDIa7{|3@/LXR 0K OJhVM2CkWwPu]RRd)2iRjZ٬v y=x 9r`U{uOBIENDB`u1f469_200d_1f680.png000066400000000000000000000026101326020644600334010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d?IDATHol?w;_9,q,QZ$EPF VUHh}Q5bl4UjվUR:MHi:k#SaAmWBӆ5؎;|&>{'?`0J(2@TB2ɓ'|w=Gͭ^~SN}خ.K;vľ}VEF_隚w*p $IϜ?cϞ=yn>G<* >o޽{ox;^qS;u\f-ASOBQvyի߁[ .]ԻzK(|6Gg> N}Ctx#lIJmے,˽ȊFčd\_OH0Ki>ûܞX,zfggeY._#$4J- VdޞZVoAO,(}ur-һug~6fGkXg~iȽm>W8M{I>V&Ci>| jWWAo x<2u] s_OOO'3L[#%wt:tL7 Ų3===_>' I@MPUuiR4MLu]0]]][f,#LLLHt]' ޷ѠP(P,T*S."i!HRJ%ƭxRf8 5i!(p$Ҵ0, )J'㱚{V\ߣGgҊP *tJp*n"@kY[1b3׿7{hRamSKe&fsct^CO¯ ~yo4 lۯ m)gi]،EI==Ͼ J?Z#s]SC]׊9mspL"Ve|=ur2}x:Qd|b6Di∜n x;KXY@$) 9 p^ -M]P !" iR R 6Ԧ)t}N!+Ikd?'7^K8߻xO\d±m-@^/Ҥ\ɗVuV)L;J N~%fa~\|Tn} Riop( ?)%T)ynXQgb5Qb6ɩ81/DQʝp%ªWė<QpjؐU!R݅:썧 [&)ex֐ayU|pАsAŲ!|a$^jhgY@Ɵ|%/ZtV_3/cͻǕò~pv[7@)V`TQ?Pc^<+a @#B;鼥aܛE,l=8bQJIENDB`u1f469_200d_2695.png000066400000000000000000000020041326020644600332370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_L[ewiʀBGC`EX32u0FB¸ebb1^,™L^t tfb$g蘰Qʡ-tv,&W_|s}΁`%q6P-uaǁػ]|ly z?ǡm 0V:u[GpvBvJ(ZvlM_~6뽻ɔXZONd7z+%\27sP#./=asa:s T@Fj["V5삍?Gٰfkpf{樫Rѷw].E)Pk! PݻnuŘƅkKi3il ̜.wO{Q#%ōRYGHڬӱ vhX\JǤ?ϣ[ D^C&#jdhԬ! ;"m89\z [&YvGth؋RqJ*=m4עqy,2-("什ҳ5EC]H^*IdhTF)/M(^}dfAP%c; k2 _ S ‹^|_E:u$$L(%j}HLԥCao+L1-y,1ye-:Z&͵5}o=Ӎ|9K~pSۓ _[8 @ (p!~.?{1@ lTVѥ4MV4t/ m;")eZeA2$L.یi4%Ѕ4Mn(Nu ,A|>XT*0 \DkSSSwq R0}IENDB`u1f469_200d_2696.png000066400000000000000000000021621326020644600332450ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d)IDATH]lUwζۯ$&~X@,ѢD|CI*Q~$ԴQӈJ(j !PbT@X-]>LwjۅbOw=?-Ѻ^(}=*قǾ> %ouog2-!0@tyݽLFwijGG<ɫMкmS9TE⪤E,C9s"Tɪ׀*dzf֋i%Jr,H1Yl0/b^x >x@P4=8 {dM\_^7w sjhWQt[ ^zw w ƞa^=izך"O0@)())u#IuZIS8 k'xl+OtFSAzϗ`so'Q5j4 2E,b*1avr5Iia>3AV8MNa]'q I6.l2PX'ob :ry|ctw{I+Cxxwpjdn2s?^lP*-85KrV=G?PDv/knz+&gu#%A(@)BxWQYaE偂ӺEk%=WB IENDB`u1f469_200d_2708.png000066400000000000000000000023511326020644600332370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOU?gfvgB\t6-ikT&>hLkL1>郷}4I/FcƤ-"V B)\69>+ d29|;sf&r!Q1MɈZc!x<>Xu#ܖC((K30p%wϧ3B/"Җ5+"}'+\LdCxR?[ZJڗUPWWpxeRTl.uy1ɔ`tJ_"i]כzzzX,Uq<,e 6 (S8l@LD4dB*[K|zm)%-cz ŖG 5˻mߞy9Aعg﹤s( iZ7t+ Ozuo]0av 5l zoYYDwuԈDߞ2ǟblGl2 `*tMHKb;o (5r! LP`,>C}{)7ㅝ.=,ϩ F&},(K$(P͈i=ak>' WeAҋݮ sR *$hBѸ9y08 ./@z$OtZzKx2F|7D&QRMKh7ȔN8߾xPHbY~D$Wە`\(N_dvdz{=8уNB<cKyRZo+m~JZz׫嫤_Ф`2cK?_a\,dc'9{ޢ?1'[2ͪsJDI'JgXسv>|,`սGg|B\wQK#S'.+ bOgy ݍ`ږ,"qc,Y@񆄊q:`ll!Z[[۶񼅎RJ !He8 8RJ:;;]מ)~,">^׷iDQW\a޽$ RbN5 c?j\YIENDB`u1f469_200d_2764_200d_1f468.png000066400000000000000000000021231326020644600346130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATH]lu}v&_F@`Ad c1 1JbQ/L !p! *z&(HF! VVv_}?^4] \xyr?9g,>w6O,5Xmٚz;%VnPVn{dtfEbbe 5B䃛w̫ UGE&NŬx?|6 ʄsgCZg3SkUsL[aV+*&Yީh[74[), ,[YQLAxV7=D^^D`{*rO&a7F{*Rs*'Y&4.Ebԙ e4kz.V+OS5!M*- '{nF{s˫󓂔?|Dr:2qEMj(plaE,d`x?VWǸ4g`"6`MŘ@o^^RmH|t+FD9y BctEJ 1`[ O PIDJ޴qU~2>I<4y~6@ug-#OXם(@~~VԀwf-!Tvn>!Mqw-UT\ILtyxVH 7S2&9a,{e*,ώ쨭^zb6S+ݬsbw!4\M_; rO 2gf)m޸}߆Fil9r|hX=6 ь!c 2ϻ_D0 '"NDp]Hi;Ђxf/`rA2\Ndɶ' }u:Z,IوEY)˳_m^Fc ?2R}v\ 40n KZI $*,yU~<Lj;Zn Ёeh!V$SJHnIENDB`u1f469_200d_2764_200d_1f469.png000066400000000000000000000021461326020644600346210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTU}Μi'e-^B%QKm#Ik "bVQcBxCAA$ `bvqf^3|8tg0wPKuHRz7 aٴcګ"'Y!ɭ",ygSO"ͫoK |Jb#< ^ #y4Rwmҥ CǪ8J\LF$(J >wvyY%Nr IccZLzqp+Stٶ1*sAn8thrBy10c:K%X4 o <#r0'ߩ!j-Y`8Z-wp*%lK10`,'| VN[7'ișG #pBAՊ4 (ikM𣬳9 握B]=@$B%:ht_&5јmUNpQA${gej:(]× j~> {CgQF"rG8A1}IbOq!yzXu _LS3={kjilXs˸~--M>{wvձ3ݯr.Ymͮ?k }F2? `)| v7wn]>bɪA`18=yY=2 )NX5p),Y䪔d"N1ۘ% RY0× VRqO]"'Bj* sdNe.q77 ^y"8TY߹5<= X3?߱ %vSGwMO#wB <a#<9Fd"`)V$ʬHٽ%[w蹐P3|0ق؄l&H4'qز!K/>A.\^F.[gFř_ &m-mFVt9rf_qȹ6ִF1ee6wik` hvmPH48TyZ# 5xicji?Q[ &QF\ۤ,ău02BG)o\N-QHn3l\VA -EB* RP f3 PQ ;0iY)h(~G}(2HNCVC 4PA-kh<z~D<@pyB`x X lT`E|Yz~k!W[ڜG~"qq=@nt`59?914@#:c~͏Ndmc䪥ےljT2/](܈rF-5ψg{Q'T^\WԌqiMIENDB`u1f469_200d_2764_200d_1f48b_200d_1f469.png000066400000000000000000000022121326020644600362440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dAIDATHoTUsݏvۏZVhbiHLPDH4$HпԄ#F" ` M-vnw޽g|c[{3s73̙O#w4X}G#Gǟ/w@IM XΧK|S~+jl]dr +ŝ\ ' xwR# ܍345QTmeYJWgfٲ궭m/s} ;Q7tfS, 8{ْ ݪE7JӳH,d0k1\_,'U:"bF`GO~|/@Wg6*\o#)%=nދq~\v>W@Mo732g T3ד_N4Ş,M{^(gCLzĐ[r;2P^-R-> Zd e1ر  Q6#ZuP)')J"& 4RhiAjkEEPcR̟nWH ,|LN/gҹxea9:ÀwXDg ~ x4m:EݞS"Mv.6:)\yW3شZyb~Ms`zv$}w^O+DnNgy?;O`Hr') !P2OД,FAz{.@W#`]]agL? )TN;M_$dW|h(!rxh >+{Npl"[v'!5f@T=ٷZ>!{ri1}3He֋=~ɉ99U6SZT!(7[3=[(yQС=W 3|)5GPG M.T`6fwe35[^@ڛFrT]=j5QK=˾?}/pqXJ㕠[W?8%X,E [9EهȚ䡴AMa :h`({Źl+nH2Y^^*neX-\dzl]fJ q2VĂ{>.oQ~\ p'f RHjɩZj]%|{ Kr33ϬEO|.4 $S׌p ĻK| lIFm6mGdN.Z*]p,FS&6;Ĉ65LK);IENDB`u1f46b.png000066400000000000000000000024711326020644600321060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHU[lTU]:vJ 3bjPZb@ MK! .V󒰘+֯ps^bh8b pu%'Oq-Ik ~ży?ir佽 T!wƪN[  ],Vo01R;U0F5 ሂ@,0ՙr~{`hD)J|nsWNN] ´6SÐAH:)1N+ժUUǹNTZDOvbLFfJg\X0Uwd0v}`VBMr_mԢciNHV(M,4ɀj2ba&07 pMQٮXZ:Q[[:u;y8zs)^8;#S$Z_YӋ#~t[ fq φB?ih<Д/Shd(&56rb%sbHSCWͿ{z8a\޺z?'ޗش U:HS$i.A 68 ݢw!k{ot[{j'X=xShy k нbfw;gIBYuu)M;wGQkrƀTuB3̀cԎLBW'@+@x V~+BP0Šh DW]p lK*srItK3\Ȅ.mV'ʧ= y:CwDhg@q?».XBU2( ܺ+`DL/= Eވ@p0mn1VyQݭP=X5e}|JN8V㏋mT١Xs]g@Jym@}k6[g;`Խ5@A~l.uFG(+O>} d;0.?\gNJs^ӋדCe7.4 8/ڷ#37V~eS936+^,1@'g nSؼlTAGnFqsˏ/ftݐOZ},|WgB % 0ۜ8Ui'DLxɆrSOyQv '6SNiѳ.,*"i[2\}ņ$w5V4JkE^b n$XW7)qm,I/k~byaϭ7ů>&3!.|<J%(U ]O,ۛaˋviZ[yG6^ iQ%)-jVoO@8ֈM~2"iTˬGxbk1'a~rR顪tdҝY. 4ƔXJt/MU+71q^p\x/?T }=z@DVꮌuMkAtx|##wk6YS-3AM.F& -8z: u@6ʋ8tEdN07@z@~MޖI*J\@g^iM[~E•s5s.SI*dtiDN(P>FJQwp=,"j,Ge4 3okJv Cd u0/ה tZJC.Y|0+`lz~jD}QMpCb% pu.9h̘ͺ5 $o嚜\H́AnSUԸ39'.}ow,x w=> 32[~}v?)GᴳtѺᴳ7'{꽎ZjnfEwp-n뱱MlOB>0o^d0bo1pPlKGn#`9 so/MIENDB`u1f46e.png000066400000000000000000000021101326020644600320770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlTewsgE[J6TM B HQ c  Ƙ`FM0ƍFPhbC@cK@)e:ν\B3muM,\ԯVh]R˓@h- ͆H8^^;H]ۏ+x ַ,">kv[a\Ɇx?8GOV!inkgPr.|_ L'D(l~D]r 'ϟxq.YB#*/NJRr6}7yu=/dJ&s9< D8>X9ݵQ;N z r+ːEaE;5NYmiSx~ LLGq%쥝}0{cݒ߆$ &Vhk<'?ۋ a`?ZSt tExthAGjhnȱ6w(?# +ZS)H$jǬ\=SY :"43$Jи9jD6/HĪ 2'~W=.R f,qyپX&R-Rp4R ;Go\~W&6q+W|0E3p[.|- `}ʿ9΂Z[֬)G75[./@lx&S>~'ңh/Vp x-ˢXUk;WV> @0@pbHʻ(*=߽vbpy#e~[j+-5k19q$u t3@dɼ~gC:xpg aO&HT\53ieV>%g`h\pL~A:ykt| -/ϫ@k^M%Le4ՌJ2KK20\9y1*XQbE$Q>_B\>ZΆK%ʜZ`6ܘBZ dCZ"-zwA? h1wZ-Z:NQhO'¨iڱx/ڷ{bqPz2ڊcmyV¸,:\`f'J@?~(}`c)Yf0H ƪqR_GFFYHxJ#Z)$i#J>q,%4ibQߛBާ"ϱ/t-%v2r.T:D:yΥ.@ tdMF0 EV{\|s K˖B4Ĕasyxb ~9MWI B.;Jnjk$Lew=clv)U?}lQ .Dw~sX2/F9{\9n:QT@֦lQ 29ȁGX:kMC˫u0'&@[}wߺL`ۋSv5⪾E=GF%+ ˞usK%J?Z l~{dmԣ TU)zxo8;LP_=nת6Z- =sipr~#yTgF(B>w/u3ƨm;}pB_f\s6LGi:ׂ>k8fC$2d?HF'sE͓VH p ㆰNf:Q߇KjEX-BߊJOZ=VJ IwN|GAgcU@4Q(j, HLe@mSϪeOB$DޟW H!^~aD ۷t9=}W?Qܮfnmm_ū\>ZΆK%ʜZ`6ܘBZ dCZ"-zwA? h1wZ-Z:NQhO'¨iڱx/ڷ{bqPz2ڊcmyV¸,:\`f'J@?~(}`c)Yf0H ƪqR_GFFYHxJ#Z)$i#J>q,%4ibQߛBާ"ϱ/t-%v2r.T:D:yΥ.@ tdMF0 EV{\|s K˖B4Ĕasyxb ~9MWI B.;Jnjk$Lew=clv)U?}lQ .Dw~sX2/F9{\9n:QT@֦lQ 29ȁGX:kMC˫u0'&@[}wߺL`ۋSv5⪾E=GF%+ ˞usK%J?Z l~{dmԣ TU)zxo8;LP_=nת6Z- =sipr~#yTgF(B>w/u3ƨm;}pB_f\s6LGi:ׂ>k8fC$2d?HF'sE͓VH p ㆰNf:Q߇KjEX-BߊJOZ=VJ IwN|GAgcU@|$?9slb`3. ]ɬ)ey ^W:$"~ɉG-MFAHoeR)˽c૶ MHf}u{YwpӅ0~n-B|dM)95HI'D8pP,]muE1dѺc}Uӯ} זDFc%d^B|_|f>x݃k/\8M/)l}=B<%37wZ{WsqGƩ^MϢ(_wGA[j7v/_/rzO&)+dI#xJjfbl|y%6"Օ q[Zg_& qe'߿;OY8u# sҥx1Tti/=!S.A^V *h;YrJAF,+Sft>eʺ^E[3߯ \"Pۂ@BRaf|ϕ*1x hg?9Xe..؁ryDdQn!IEe\{(z%,Y$G/Y5IENDB`u1f46e_1f3fc_200d_2640.png000066400000000000000000000022241326020644600342670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dKIDATH[hUgfv2dm&ͥIۦM[/ b)"ľ  (|QୈjZkb4${I6{ݝæfc}3?LXv0|S䨿hV+yՕwao~ vm+ k<ö u:xdm^Kq" _z&i hwa)}V߰G`Ӂ_=vM0.*+~ˌEi&@@ZN6P5HMxN8$2K] 4D3MJ,d+=M[t)nA:2jF" JhC57']*SoyB,օvF`}B?ߪ[!:L c`}-E&nc۠X(kAIQ^ϧ'TZԤP/ۓR.H)9.NL-aj^0WϷDZعmκ3/8tQ"V$ +t Ph ʐKEhҫKUCB0Kkh ~&z|]UNDJ-{:pU9JL^񫌍_EQ0$IJgZ!A1]3CՑg)HF;\rS7= aBnCoZ 9-O=rغz.c HWqHSdUiy3 c4Ka,Eg.VK0jNka?Z4vX3e&(`|&!WUZJP"6 ^]؏@%Z%K"U/st5&H2¥= :RnhK,B4=,%kJ6P@mm0B9Z1je C=MIENDB`u1f46e_1f3fc_200d_2642.png000066400000000000000000000021131326020644600342660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lev^pK7 J@Ѵ6# 6zmc!O1F#%!Ѩ<!(BzA4ޤ-ef>|$?9slb`3. ]ɬ)ey ^W:$"~ɉG-MFAHoeR)˽c૶ MHf}u{YwpӅ0~n-B|dM)95HI'D8pP,]muE1dѺc}Uӯ} זDFc%d^B|_|f>x݃k/\8M/)l}=B<%37wZ{WsqGƩ^MϢ(_wGA[j7v/_/rzO&)+dI#xJjfbl|y%6"Օ q[Zg_& qe'߿;OY8u# sҥx1Tti/=!S.A^V *h;YrJAF,+Sft>eʺ^E[3߯ \"Pۂ@BRaf|ϕ*1x hg?9Xe..؁ryDdQn!IEe\{(z%,Y$G/Y5IENDB`u1f46e_1f3fd.png000066400000000000000000000020761326020644600330750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHYlTUmf̴JuJqM[B$% !FcbTSCOGD&&E\@QUc[]{|Mgk<|:fXvKݎ"G)L"sv oG%n~ӴW%BlYW{N:hq-ػsq6FcǯCQ>4 N_K{7 /[vt)@YX~M+bG'P=T9^t+Rr:}+׋7<|&T"A!.k`Maqs Hϡg鬥 ژA8tR@eaH_K)t@!v#4yAoK-5jkgudieU{; -ZhA0ddf p.MtEO5=)?b !#Rbh*&lZTECDoeJK+`1bM\F>XS* 30`qMu 5L%ly{EU)uWC9ߢ^>)'Ӡ.TMOp tܹayQӹh*Z4c){8?]c[ Xx}.yܳ+_CԶ{v?o}w BՖ(U۫DLU]`*$HWU@P\Ȳ9֧հ$bIM  GRIENDB`u1f46e_1f3fd_200d_2640.png000066400000000000000000000021701326020644600342700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d/IDATHKh\U;wdL#ITR hV BW)(Ľ". P܈wWu%>XjLIk&1y}i³;?|Bԯ/ӯv82tU K͒oG+EsX཭f @(Z  Jo֌#k2qTw<ތY~&8'✧_ 52(jGR&ш`qv sM!* ^ք[2hX:E{o/L]8$vˤIK0{|zs޼t x B{]zd w薅nYm<;Qrǟ'&cTJ3B > SDz,n x.&hČ 1#ӬB}t )M T'[r඲0V_MbPWMVı˫-[rx_%艗I1h=y:KIENDB`u1f46e_1f3fd_200d_2642.png000066400000000000000000000020761326020644600342770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHYlTUmf̴JuJqM[B$% !FcbTSCOGD&&E\@QUc[]{|Mgk<|:fXvKݎ"G)L"sv oG%n~ӴW%BlYW{N:hq-ػsq6FcǯCQ>4 N_K{7 /[vt)@YX~M+bG'P=T9^t+Rr:}+׋7<|&T"A!.k`Maqs Hϡg鬥 ژA8tR@eaH_K)t@!v#4yAoK-5jkgudieU{; -ZhA0ddf p.MtEO5=)?b !#Rbh*&lZTECDoeJK+`1bM\F>XS* 30`qMu 5L%ly{EU)uWC9ߢ^>)'Ӡ.TMOp tܹayQӹh*Z4c){8?]c[ Xx}.yܳ+_CԶ{v?o}w BՖ(U۫DLU]`*$HWU@P\Ȳ9֧հ$bIM  GRIENDB`u1f46e_1f3fe.png000066400000000000000000000020471326020644600330740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHML\U(Ci H%)T!Q75iR!C 5&]jD~ .LFj5"X(PHfdޛ{] a]xv|{ޅNgd?~e; @3RI4hBZtnPv^EBV-C_}B }`#ahӟ{;z9+T_n8K0y- C/O:F^ܮgib)L% Q%'ԈV 7aqY< +r.8M ]})X;ѵv8Dry/*+,5":;क़Hf{cX\ :sߥJYRPSۮ23J-c<= >Nz8l~7%Q1bqJ/#WmNd*jZ,%zP݋DZqvq2ErCd}W<4;'HCrl,!:> \Z0IdR.G:ƌMn;ۦσwiWFu-R'qFIqցԈ'FW+pT3oeB[JeJ 2=ъd? X4VjM 5؆I(z C(`qOw(oHYL`!{XRE&0@^E5i)ܚ<٠YQN}]7+n[ 7(m7 $Nz8l~7%Q1bqJ/#WmNd*jZ,%gg>ZoZ}?/_ bxPvtgPNDT+Q03=g_G%Vo~RXP(u=MPA!G+=0EB|pjp^Q_6n;3N.Э=40cKO,yOoed0RI7P!L-("(W.9P<~ öqĜnC?!g_ZJLtl~ _;MTP'DUDpX HA$vӏC7Q?y|F"2,VZou蕙-W)14eR 6']Eo# wâj8ul7f*ddH;cS,\qz2VF\˚J_M&\lKg)ieR+qZc۹SKN .'E+ǡ4=YϜJgB!;Nŭ4.]+ ?7wi.ט.,ưJY'~M ^;[AqDHF#LShgzz~ !"=hWaY\.Ð )*%ɦ#oVL;2ڛ>&n ''N\(k? e~x5WQ ؍~M`]"4fK[j)i;ME/4H0a.ό0|SrS vu@)^U]je tTJVA컐MkkiY3%}&IENDB`u1f46e_1f3ff_200d_2640.png000066400000000000000000000021311326020644600342670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMh\Uyo>;NBڌJ*ЪBtQt!;p!ABqW.u(Z(VPJTmtRW'yϼu16ow=?s=jA'Ԧ TZ[ %Q'iHP(L)q,!e4%/#Zp4~Rj]qBdX➸˥3xסa wMsrunRes*lh4TQn76a[*PRVVLTPP(H\ ~hj;P% "|c-K*ZT>$ ~rB ^ZefZk&g G7`}P%a|WL*N&7 [ Tލgg>ZoZ}?/_ bxPvtgPNDT+Q03=g_G%Vo~RXP(u=MPA!G+=0EB|pjp^Q_6n;3N.Э=40cKO,yOoed0RI7P!L-("(W.9P<~ öqĜnC?!g_ZJLtl~ _;MTP'DUDpX HA$vӏC7Q?y|F"2,VZou蕙-W)14eR 6']Eo# wâj8ul7f*ddH;cS,\qz2VF\˚J_M&\lKg)ieR+qZc۹SKN .'E+ǡ4=YϜJgB!;Nŭ4.]+ ?7wi.ט.,ưJY'~M ^;[AqDHF#LShgzz~ !"=hWaY\.Ð )*%ɦ#oVL;2ڛ>&n ''N\(k? e~x5WQ ؍~M`]"4fK[j)i;ME/4H0a.ό0|SrS vu@)^U]je tTJVA컐MkkiY3%}&IENDB`u1f46e_200d_2640.png000066400000000000000000000022051326020644600333040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d&tIۯg-0@㐻:AYiwZ񼝈 ˇ,#B D]!\L棭܆f܊ƹ0~ԝ+Ԭ+ҧ8ų\E:?,1?SyzBH H e*d 4yemܹ\to^oQ lxx5+'q GC<ѝ3K<bgd= .}avhEaV~]q2gRd Nݙ#,j)d\!h#cA.]T|: V5󑳁KfN 5pM.oLG \3p)d4d F-mP1W|C&f`{0@ܷbyZf@ T[2Ml~2NMܻ H57ׯ<$0VfDlcq]O;Z5x|tDC4#(e {cL'=O#Hقϐz3?bcA\RtCaW:_8 6v7Z>%;l:;n 0ڨ ~EV[uK(ߓ_uNrr3Գ[V^<؋C1p{sC0E$ne-~#B[8C[d  W3pIENDB`u1f46e_200d_2642.png000066400000000000000000000021101326020644600333010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlTewsgE[J6TM B HQ c  Ƙ`FM0ƍFPhbC@cK@)e:ν\B3muM,\ԯVh]R˓@h- ͆H8^^;H]ۏ+x ַ,">kv[a\Ɇx?8GOV!inkgPr.|_ L'D(l~D]r 'ϟxq.YB#*/NJRr6}7yu=/dJ&s9< D8>X9ݵQ;N z r+ːEaE;5NYmiSx~ LLGq%쥝}0{cݒ߆$ &Vhk<'?ۋ a`?ZSt tExthAGjhnȱ6w(?# +ZS)H$jǬ\=SY :"43$Jи9jD6/HĪ 2'~W=.R f,qyپX&R-Rp4R ;Go\~W&6q+W|0E3p[.|- `}ʿ9΂Z[֬)G75[./@lx&S>~'ңh/Vp x-ˢXUk;WV> @0@pbHʻ(*=߽vbpy#e~[j+-5k19q$u t3@dɼ~gC:xpg aO&HT\53ieV>%g`h\pL~A:ykt| -/ϫ@k^M%Le4ՌJ2KK20\9y1*XQbE$Q>_Byٜw ɢAUt4wsE_[kj hoƆZ/91BGKR@D#r`aZ(BA܏aD _j#`RDP" 51CC [S`pN(9"8 1D(G)>눆cXd|1f 輜:;GdVG2 zE}\}A y$gXA%AHF^A4oΙ[++lQuP"9NE3I\פr~)G~XE.(1J2:DDYGj p2&j]΁PTdghrZ4]yٜw ɢAUt4wsE_[kj hoƆZ/91BGKR@D#r`aZ(BA܏aD _j#`RDP" 51CC [S`pN(9"8 1D(G)>눆cXd|1f 輜:;GdVG2 zE}\}A y$gXA%AHF^A4oΙ[++lQuP"9NE3I\פr~)G~XE.(1J2:DDYGj p2&j]΁PTdghrZ4]ḵ$lu7tvZINN]zFU_R|/ Y^K:Yzxx~E1]>~i٥'sqeוOl=ٓ3mr?ϩİc?o7oj s<yx~۶m&KzIENDB`u1f470.png000066400000000000000000000022131326020644600320170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dBIDATHoTU3sv7aJH@DR\bB4!$&D|D0P, v((҂Cskengp:gfhzZ{o}>EE4ÙTrܺt1o @UkD mYnݓE#17ugcߩs6;:pcX,>Gx<>$8f^ (VrrYB>kdi=/8FO-i-:;s29@3Ca\B6CqRq;ڕWe{__Xu_&RJaYWԓع!XeIܟGpiTR|-twǷoN~R.7K!K!Ll"Bw3>xm3M{j7  س#Ɇ5yv&}frI%f&!+RJ [Ҽ!lT'ϝ\+|@Jpt*[Y^_A+\5'χ :9q Dx6^'olGplnؓG: 6ߨ4) t2A.ose!C,U R !TLt*$sBObjzu[Kg]055;ES.YP(Mx?l#>FlqBQ-}Q\uls'FۜEHFb>Fb>TvG-N^텥;(^!D "dc6)iMʂ~iX)(J5UUe3+!n|kv 9rj3n8˲b\fҾ0p檪*^ݸ1 hORCeB֣>C]]>MHhAqq1%%\_7B7z,YhmmmmY`=fr4?IV=J4WU1 73R 0 ;ʱ#Hpe~VUY۹~;NRZXF`QOw72yQlwu]Tw7BUU-#7-o`<1b&wZ<~G̓KM\]%k>Be WxaW=K\Jɶ]9 t/ʙx^`Cb?P@n_U]TdB!UU tS ̟0Cϡe h4,JRfhzgŒݚN}6A 9y0[әoLoha5(^l۾D2p8a&''Y}GO# -.Mt>Ǿ2l6[axɌ:OynZGMuWbxý(z0 25vyy9s~^zԐROrԞhm#So/:;㔖f0?PU0%֬Ji0ܵɤ]Lat:;V*gϦzԋS`09cK`21v5BnzFFF4k_en3 EQpʖ9r|>RJ3f4(||װni:8=8IENDB`u1f470_1f3fc.png000066400000000000000000000021211326020644600327770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKoUsf{UۤS{Hrnss9@%fR*<woo 0ʧ}!1qNNg6O%,̾A^pŏ6ֵ8,36^5@G)z8{7b ReRe 4Lz fnɨ9@+_[+S-]Y#4fnʸؔ)%=y%~:L3y*(PJMӦtF/u~3/fO_IENDB`u1f470_1f3fd.png000066400000000000000000000021751326020644600330110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d4IDATHoWw۶_<t~g #uJkn;Gs`XMQCxV7tRJa+M^{ʃ{/Pvi!HRwB"`@G#H,X]lMTY>?̰} <͵QU CnZ+ej+s7R)d{,߮:ϊšN~!x>|ՙֻxNÔ, )%RAr x֞UUi6f[ /9zGIENDB`u1f470_1f3fe.png000066400000000000000000000021611326020644600330050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d(IDATHoe?TRjQ k]ZbH*@$  G/z0.^p bòEڲaY1y~Ӝiggvx>w`}m%&D‘^7vc_tW3L_r0>?ԇ5fFlv\nXqT,g`h?K K Bb$GzgjN, !f?-4!qn^2rK$Hvv YT8KN+W )p|y~.mXVo&B8oFX,/D)󇀃o]Ƕ6Amquy 8 091T(wm߽̗ͅO = j VlL0\}RJj6= vu((]f֘Zt[Zm oH)#Ī[lI~vKH/2^ZE&wXcv `sm-_#} )ov8)3Y{{ ,rwD~c΃ MZseU}—R(npW3㼴evs7xw͵GyX*@Ӵ@t>#'N"6NA/)Dcddy]._HgwwFӴlٶm 蛧̙`Xܰxk&N5LӼTOYx!A6'ɄΝR)**UN2baa_nޤ!FGBæi^m[TcuJx""\㺔VG>A$mh cUsU`A0T]ia\RN mu+9 f8/N?޸Aga1y''d2lٲ/+P%)ӧAop irf/vcdcǎ1v]]]~(VaCW.]x7w\* =pP@ nP^~=\w /L) mEz2Lm=`۶!a ĞIENDB`u1f471.png000066400000000000000000000014571326020644600320310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkU?gvc٤P`>I1>4AD@ 6|Z-!A"&oA% -ՄI3ίӇ& ^w΅yHŸGE FAeg$=)3 UViˆ&^6lcmVtl{:[t8s/v-r). 4=\z;HuwUA2 |o?V4Zղ *%|,VNU='_L?Uw|]S ެߗz&ҠlTIU$fǿ i&[[uL/<Ü-xFnݠ _!ͮy;A&%My(ɦy $YrAGK<݇!|b߫PyEa"Leo WZ` ^މScA']"E.+?N/]!uAСNdJn*f]3YYMug^Xv0>SECūa 5 ~Bd-|v06n,h;JL>hN p+}"N!Dm4"(x V݋ܣ@6kq` VYViӂB!r i&`fIENDB`u1f471_1f3fb.png000066400000000000000000000014441326020644600330060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKhQ3MjEEh{!R|t"(..\*EU(DڍXAօ hEM_R439.؇3(80{93ށxwu Z uROFm$#Q1}\!^zܰ8/Л͢Df!< E Xpxx V(^@ !Be;q+v |-v@hH*1bpqUlQo4||5i nh..5xC޼MVʗד&+PN 1;S>iCt;SyN~X)[39Y_Gϔ-ԋceb/Cqlghsu"x J7vۆxi0 }0tQĶU>cmB |PEzHQ R q+9pku]XgCDIH+2<oG7~gjX`&IׇwED4f=|PiDQ]YAueS$ Dkdx:H`^myٔϴ"Ρ}Y9)0fBdP穯 p{]( _el$y ۚiok. 27$@0(xyU&x#+Z/`!5zjgQ: /owǩkHҲ}_Pט;h&|BƗ O[26cl0F=iCt;SyNU* XcEXj11n2;;Yd-s\CJp[ըg#X= o.VYؑ J,T=hr9 l/67nqJc#7{Eߔ @uKoK$& |tLvG`AmqN$ ʢZ%3c,b|@Pk `ʚCjlqͦ{eX 0F}G}_KĊL*ZC .9b_,v'ƬcԬ-v_qF[\#^ͺjmYϿZvQcǀ2èڙ"'>:EO6^yLfx9-kIʩ0!oڰoD7ϓYQk=VUyrx;iP'mGD$t "4wt*VH&W5,wp*V0  ޣ%5\XNԲ`Y^/W]R p Xjq`-P~gv}f% B&l^q@u_ v`&^/4o42Yx>%V/a,;a8`jzw888̼<ϼ/&tb gUI! HW L}T\}Қȕ.Pd4P=N>|_ƌ4m-5+}b;aM@0)ӝT|k3Nn"bcٛPᅾ,]ax?/|a>}a4JUØMdxs{ST$8U^P-'hB=m]ET" Q03̏?St۔V6D) ܞ_7P>GWw̖&omZ$@3ٓ'x#lWI 8hy @p@(hqpl F:IJ<\ T±*NKoPoxBe~0VV*@<p9.xǢdsE[J"]D m?u*# Ƙʤʤ;yf&*&c7yHj2Ov΢Y nrQ!R7d0=oO1q |soqh'x2߁2:ݴt_h ӌguqƙ4Ͽzg~ߑ{'_oBC@oEw cYdLjFm[TLޑcǘZ.ͻ4=sͻd;cQfLC, fkը9%&vWF),iIENDB`u1f471_1f3fc_200d_2642.png000066400000000000000000000015001326020644600342020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]hWNfɆ4ؤAEZZjPJK &}MQ>U* XcEXj11n2;;Yd-s\CJp[ըg#X= o.VYؑ J,T=hr9 l/67nqJc#7{Eߔ @uKoK$& |tLvG`AmqN$ ʢZ%3c,b|@Pk `ʚCjlqͦ{eX 0F}G}_KĊL*ZC .9b_,v'ƬcԬ-v_qF[\#^ͺjmYϿZvQcǀ2èڙ"'>:EO6^yLfx9-kIʩ0!oڰoD7ϓYQk=VUyrx;iP'mGD$t "4wt*VH&W5,wp*V0  ޣ%5\XNԲ`Y^/W]R p Xjq`-P~gv}f% B&l^q@u_ v`&^/4o42Yx>%V/a,;a8`j>9Ӵr[0:A"W:qzSqKƓ?_Ӧ:p35d Cplc 6`pxG}zOi[7tlxHk) g "B]|@Y=ƑRR2D*c.!E~뷊L{g_]BM'0uu6 \@Ogg8ϵ*;A(4KPX'DHr6|tfr6L<_L}v|D74 |35DP,[?.G-A[]Ӡ( 7Z֢@$V7Q=uwɝߝ$Y78M{?;0KW)Jݵ}}L8c0U+R01x^S2xHIENDB`u1f471_1f3fd_200d_2640.png000066400000000000000000000016261326020644600342120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dMIDATHkce4N3C2iM*3U8AaFE?@\JAƿA]" ]8.ZIitl M&{\ܤGz,2AsWGmg@G@"3yPE깙\}OF(u {Wn~J+rk۟7yw>N/}=@ENOav4gS)) 1UN @xePܬ":D2`)!=VRU<\Gɮc>=#U}>Ovm{$OO&E"#a!N-dPL?29[[)ت]E ~T2X]i4nn՘Js 0ZmdK8f8>9Ӵr[0:A"W:qzSqKƓ?_Ӧ:p35d Cplc 6`pxG}zOi[7tlxHk) g "B]|@Y=ƑRR2D*c.!E~뷊L{g_]BM'0uu6 \@Ogg8ϵ*;A(4KPX'DHr6|tfr6L<_L}v|D74 |35DP,[?.G-A[]Ӡ( 7Z֢@$V7Q=uwɝߝ$Y78M{?;0KW)Jݵ}}L8c0U+R01x^S2xHIENDB`u1f471_1f3fe.png000066400000000000000000000015131326020644600330060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMhTgsM&3(0(H[NE7B (kDUBܸSEDWU.Jfe;."ğX]M4Ŀ&1$&q1$c '?C؂y b[^J,8y? I7+ P]#I]xTAd `Ox7^^Sm+p2[eKoΊPm>"=*W. "gt3:_""T'l\||+'M39O/R}2]2#ѷ]0Ś$:Fg$ċǣ*pPW[Uy۲H:ȕj7;/`3~=w:o!{<3V345#C.[X@vJKRc bcߞʊ?tH+%e}Ʋ5g!QXQ~w~CϰGϰ?'8{lz\W0wUhw#hݷpXڒ=a O@e6lnIs5kܜy/۶ڣVDW._G y3@H j~bͷ#SQg~M7()PbuPM oT* JEMq%:8x\^0zY,,+WNX/0y_`4n8ǹjIENDB`u1f471_1f3fe_200d_2640.png000066400000000000000000000016371326020644600342150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dVIDATHKh\e޹3LӐMbHcE,5b UZq!.lB](ʅkHGZ4L<$N&3dz_ŝ!?W?xg2"=*W. "gt3:_""T'l\||+'M39O/R}2]2#ѷ]0Ś$:Fg$ċǣ*pPW[Uy۲H:ȕj7;/`3~=w:o!{<3V345#C.[X@vJKRc bcߞʊ?tH+%e}Ʋ5g!QXQ~w~CϰGϰ?'8{lz\W0wUhw#hݷpXڒ=a O@e6lnIs5kܜy/۶ڣVDW._G y3@H j~bͷ#SQg~M7()PbuPM oT* JEMq%:8x\^0zY,,+WNX/0y_`4n8ǹjIENDB`u1f471_1f3ff.png000066400000000000000000000015171326020644600330130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoe睡P# kP\b D7h4&I4R@"cb &ݤR;.ٶbY`ۙB{w K+'=ЋjA6 \Dj8~st`:qC$:R;\+mT>no 诪}Vdq/l^'׿߶}HlO P,0T*(XkA*Vv<"NY8iWP/?ն+:6ZR({7uC^twUIW3^p߶._F'f߾w `" eu}[76!2'yŨI7-uêMz?P*;`#dW¿ ,1rIENDB`u1f471_1f3ff_200d_2640.png000066400000000000000000000016371326020644600342160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dVIDATHk\u?L'$$MñբAEB.DipUjq+U`QCYHi0Qi&3{2=.nf2$={ߙ&:?k~*$߻ ~OHn~@-r%t|(=ݺ~iv}.!p7|5J_!Vk;lmkZEvla1fŧn%(jW."7 *zo^:} >g[ c^.Ld:CxB8nNbf0X=OOTQ_bt9 C/ߤ0!yqQ˰2'(E wgz;˵oW~w+z?q(.elƎ5}w0KE5GlzS99y;N8WiX@ JsUK]j+hȕV2P*ר 2Ar$IENDB`u1f471_1f3ff_200d_2642.png000066400000000000000000000015171326020644600342150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoe睡P# kP\b D7h4&I4R@"cb &ݤR;.ٶbY`ۙB{w K+'=ЋjA6 \Dj8~st`:qC$:R;\+mT>no 诪}Vdq/l^'׿߶}HlO P,0T*(XkA*Vv<"NY8iWP/?ն+:6ZR({7uC^twUIW3^p߶._F'f߾w `" eu}[76!2'yŨI7-uêMz?P*;`#dW¿ ,1rIENDB`u1f471_200d_2640.png000066400000000000000000000016061326020644600332250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d=IDATHoTe8ZZ"(AĄDܰ05qҍ!aI1FHt%1&nЈ ,TIc*v>:3pg=.L{gnӐpvxsS6锠3ڧ@ҏ u8d''"PE*S 8ۤ\s" Tl Gn%Lu[cZvz׻K$@2?7܏:2rolC}pv~yRY*@݃9WD|kNΰ! \4ۑ@V?RJ8D#$˙}ϰ{kGX Ð n*C+z쁇htgL+XW!uDѸMwwdoTJ;!~-q`נC^C~_o Aa:8rB|\wx86_oq.n]ޯ{cӼ^`i^'< ~v[CUQ]fbj]?&>6dnz_82#9p.*[ c.%N%-'ouS ?o8l 6 lwQͬ45i, 1-woU-gQz£NAEIENDB`u1f471_200d_2642.png000066400000000000000000000014571326020644600332330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkU?gvc٤P`>I1>4AD@ 6|Z-!A"&oA% -ՄI3ίӇ& ^w΅yHŸGE FAeg$=)3 UViˆ&^6lcmVtl{:[t8s/v-r). 4=\z;HuwUA2 |o?V4Zղ *%|,VNU='_L?Uw|]S ެߗz&ҠlTIU$fǿ i&[[uL/<Ü-xFnݠ _!ͮy;A&%My(ɦy $YrAGK<݇!|b߫PyEa"Leo WZ` ^މScA']"E.+?N/]!uAСNdJn*f]3YYMug^Xv0>SECūa 5 ~Bd-|v06n,h;JL>hN p+}"N!Dm4"(x V݋ܣ@6kq` VYViӂB!r i&`fIENDB`u1f472.png000066400000000000000000000020351326020644600320230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTUϙ2-SZRڱ %0m jɠ}24j5i&D*"RRzL;C:Ù$o앵./u'AUM@ӂ6_/9e*wk5^Dk>CŒ%[KWWlۣGwDW5u&aW|5ż9@CLFM ]UCfTj1 L3sއҠj.I >e1z( U ^0  ́|5^Fc+*pBf}abv'qUWWҺ_,oH#@qy㷴h+Rd)Cv>* On;^?în0:e^ĴD"u-7 ؿSw4wZXik7'8ߟ̣o9GOz=C-yl~і?KӚ/ٜ/ja(o;E\ŹuG޺.`=BzOF7,Px#xESE-GuB%ƶg*՜K\.T8a*f;E`C1ef6$G%V :ԹBb&c. Z;7ʆZniR4bFGô>vn.a8Ӊ3U6@U5{xJL6*,_|3Q?pujEsM-ߖA 3 E :|>=m.Cu\:?Z3i-HAQQIfsa7G#>wtq٥ΚYvDGlydm{ C#J] MY*5f˳zzW~:b8] V,_(s3>FпqZ.3\`xN42\ҏ9R)D1Y Qp͹ĵ2nśg^?ѨIENDB`u1f472_1f3fc.png000066400000000000000000000021021326020644600330000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTE3gB,[]ҥ*S$b4j XIlAc'#&^^$>K5M QBBZTvK[(F/g7a9m^VLwU) G_PӈUm8ĻT1 %kLҳo?pF2zP{vDZ G | pi'D@|۰ tbQ\{*A~l#)@`+ٺ~שn 뱘m>o,Qx,rBh;u.j;׵E4]YE\{1TapiatwwYU3@, 1)IL%kvtݟ97!<pukGJ QB#x%/@)P]TDp%F/Y~֙ARS<63ALQ/unݺ0BJ7ːKH(φBvΞR@ׁcPWfBid ,fb5Iaw][_s_R[&orxJ TP`j&B}R'?N8g:<%5.|,Ztt05=@Yq(bRzr[)h*sJHx s:K\p:˙NIi*XWu1xR <+so)kRQ H`RP'뭬]\=;PA Am-&c-ѶYCbf*MiE0-Wn{t͑m1~Nڣ@jdO\'<2fr)˼eG]y9}pGۛBI4_BşK ؽ}S@{\NW9}AXl{/44 bʟoin G{Y4/s4p،:3:aY-&ϪwۺpmY YIENDB`u1f472_1f3fd.png000066400000000000000000000020521326020644600330050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlTehivmmEʣR1UTDS"ŵ(P Ĩ+# Ęc還h>jՊh(c -5:c3 Yss=.␛IY^BzL1Syxo̱_`mSg׋tޤ.Sʋ¨ u}B&_M*zUon>IT9b'5۾>ٜs퇭zw,aN"O߻)G,gS8BKqc ,K=un|Gs5DW$gCIVs1ڣYSdjؐҹ0}Ƀ;bp9$z,?ߚg@tR(7 *POD $?WثLXR$fLyKVCCCcL.YFUUJC֮omm9ccZ!O,y./f><\L͸L&\8s$Lcp. ?{*KCܻ:Tx0B?AIfRttJ7zhii9WW>jV̚OtNffI`Ue1ed|rk"7;oÜkYQ  c U%I{(2 P4\.|DJ+p(``iKBi-o@ĢޔlW?rTPJqǧ'{HߌYY7h|ZeJɱB㦽>W)\~76ePW4a -k&1іmvFP|!6gߜǵvHUk$ƽޚ5ˎl lRhXQZ [8y2Ǔ񊾼2:n.Go,>Y*¡|R# W3 Z5  vE]]#IENDB`u1f472_1f3fe.png000066400000000000000000000020421326020644600330050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lEgvvŶ@Pl@ŨHQ1mEM$|DDc1hLL| !&XPhaq--f|hwBb8O3_s朙lr=NۢW3O J-ek tFbo̚x%,«_Mơ*ja7yM Qw ]KǑTL@ˉ8]7~~)B^/pj4)OM5 M;}8/nif_Sf8qfXb2,HU]_-oglE:xqzm^wC!fm)wisxB@+e & F~(fėO_eidF [ ziuig Ig%Y > ˏ͛+\ed"ӜiݿUjl2iVE,U >ep,]2,$02#y1KVlv,vX5{tj튰˝uNŵ.ml #>}hbJ\e`zQ**Jvkk/*q]ӵqVvͽFhw92p-j$byIENDB`u1f472_1f3ff.png000066400000000000000000000020341326020644600330070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[h\UϜ3̌fLRi+ fhhjLV>X,ˣJZZMmM*TB&=[\C8Њt=:-q3IEwOj:%#}WNM]}O(~;,.L0^u+R5xsyȊ-:ѧ_˼9@ ^BhGǠ+6[m80^.짏@֡hn Q!/leWTwPݱ)$6up FpFujp'׊E.U"@㳽 _[m'@zAnA7Ȏ ^f8.W(9:Xn0B K\iia9exn Ӳp [/SoccxTߍ@ 0mj<Af<cj|mۗy4*AJg Ƨإ'\4Lh'CP=-uRmu9\߹ѹEee`HIsl `1W*7a P]!uSkˑ2Vm ~괬F Q~0;{nvi77cѼ}?rG*YkqcqTNUJ4ceOR~?Uҙ%m/RRjXЮ'kT x\VNÛ|moTz|Ň.˾.-U_໠~Xk_NkA'ZfCkͱ3g ;ީ RϋЖH"TTm[6`A@&3B?jIjE1b#qj֭[mKwc(! CJ"Z(dl^D7D粨*d;4JԪU0pyV-&S8ZH $% ~!>8J>EҢ|4yp(7)V1R =F6O`nʥf?Ӝ%T 3b_MQœ?, ps)l{|Ҧ!yH/V߮vQvnN>c&sbQ@nW6Ƭ\PqVkMe=r uW+^&Z'?8gކO4 Tfn\vt~ex~y\9 ~=ZlQc(- %\ʇ0||MS={Te?@`8s/<@(F6N=/!Tt{}}EJ{O!ש^yt/#N>&wٝ~% ɴ1 δLe+Z&VGG璲9kt:=5oN8ǴEP cWبA/| Z:J횾y4",jt <10pvbeEZ唊mOU MsE.o| }s^Gタ3'zIENDB`u1f473_1f3fb.png000066400000000000000000000020031326020644600330000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHYhU[f,f%i T)Pa4m"Tq/R+GXFPD+D6$Ղ`jChMCȘLf(xYs ZOjWD0.:`,+nT+mi.JX?mbW5 {'*cKZ0jRry<;i )׹?aM8\mg]@"1D69" #R))Jh4!Xa.M#"߷RϪd|>/u]J)^/` gGDȤSh CYkqr:(WLIJ55S. 0iKv {]K*W~5t 2ss\23]m!B>7_g:|bwxd <}_}rt~!Jo-jm =Vz4g]4 ^>r-sfsv =to*@*cjfWO2s=B: w#Mxn>[WM}5d殕~R-WF7(M~B*v-yYs]iPDx>忮8]6Y5LB*ɏR,yP?7m]N;Oshy v/yv&96oe0m2UNwSm誫ֶ[. 'H$!m9I-.4/N"~Ghl)EX(-n/@/b$I$vW&E C #Eq.9?S ZZxxoOˎU_mZ#D] Z4h?ozƋIENDB`u1f473_1f3fb_200d_2640.png000066400000000000000000000021461326020644600342100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHklUgfvv` $EyP 5D_4&j4Q%фoh4HĠl MERUvcm33 Wuhڡ%/"n\kN7<;\/"6e!"JC ho,K,D 7ue9 +/xEDNڎېd())tXR DZQJB4\j5B!}5N7,Pe%s4IRSI24 "JKgl.3 t*qo?8M&^ 0V7O )uDh7\2- 4 3l\ΚV "ə:9s4̚M̝=x` 0pt*hTVVJ&ٷcut`&ذVo>e/R3e7| l61llB28fݵh[B~6b)Rnwhcv0R Jk}3V~2V~Q>Xw'y)k OX#nFkm׽CeX_ӔtWLд`0Ԋ\æ:;;DbB<{t8p@p&.6-ml|( .lۦŸxsY\Wj4-ᱥ/ D"s#  _ڸ(,"jH+մ3P< ]<ZsgIENDB`u1f473_1f3fb_200d_2642.png000066400000000000000000000020031326020644600342020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHYhU[f,f%i T)Pa4m"Tq/R+GXFPD+D6$Ղ`jChMCȘLf(xYs ZOjWD0.:`,+nT+mi.JX?mbW5 {'*cKZ0jRry<;i )׹?aM8\mg]@"1D69" #R))Jh4!Xa.M#"߷RϪd|>/u]J)^/` gGDȤSh CYkqr:(WLIJ55S. 0iKv {]K*W~5t 2ss\23]m!B>7_g:|bwxd <}_}rt~!Jo-jm =Vz4g]4 ^>r-sfsv =to*@*cjfWO2s=B: w#Mxn>[WM}5d殕~R-WF7(M~B*v-yYs]iPDx>忮8]6Y5LB*ɏR,yP?7m]N;Oshy v/yv&96oe0m2UNwSm誫ֶ[. 'H$!m9I-.4/N"~Ghl)EX(-n/@/b$I$vW&E C #Eq.9?S ZZxxoOˎU_mZ#D] Z4h?ozƋIENDB`u1f473_1f3fc.png000066400000000000000000000017671326020644600330210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH݋Tu?3sewt_X QF6- .".º +/2 } LL65Wݝ93t1993=y~9O SU355C"Ɯ`XV++'&& ^?8"b$!Bjls (_C(Mlu]R4ƘV0 +m'&IxVRdsMq*axll+Jg|_?"͔( i4(u\ӜFDccުv*R$IBZZK:&ϷKN2@.GbU%qV\U㘰 IblbQ8 ѥFl75!Tm/DP'Ir}*2  n,#~Ѥ @9&܈-Fjkz2_r_:İGx ʀ LUGYǤxyO>3{]s ds>>tV|Mg' PY 8za0~ Mq 㯼Oo tj{);w<=Wt.? WO}ރ]wm<)z_^J>5f O泩i2 ݣ֬ ~B8ŅNes^}#@u=u=ê3Ϭ8-bu.~mZ c`hӭ*,d_ОWzy㗛V\ Y]LK6:;a[$k':JZZ0<<:!>5͌pk΍ŻJM}WYߴ!,g%? #;Ui ~qt\S?~~Tpf5V|Ks)XVlF5qc۳=ϼ]m*P(J Sssԅl/PMm}l:Ɏ!z 011[(>k p{} i ޼t:$ ߗ} aHqv@ $eCF qFDxk_.wlU@>ÜZTy,"Z r{;ED/YRP}5qn<:;>>YTuLlɠ3 ĴIENDB`u1f473_1f3fc_200d_2642.png000066400000000000000000000017671326020644600342230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH݋Tu?3sewt_X QF6- .".º +/2 } LL65Wݝ93t1993=y~9O SU355C"Ɯ`XV++'&& ^?8"b$!Bjls (_C(Mlu]R4ƘV0 +m'&IxVRdsMq*axll+Jg|_?"͔( i4(u\ӜFDccުv*R$IBZZK:&ϷKN2@.GbU%qV\U㘰 IblbQ8 ѥFl75!Tm/DP'Ir}*2  n,#~Ѥ @9&܈-Fjkz2_r_:İGx ʀ LUGYǤxyO>3{]s ds>>tV|Mg' PY 8za0~ Mq 㯼Oo tj{);w<=Wt.? WO}ރ]wm<)z_^J>5f O泩i2 ݣ֬ ~B8ŅNes^}#@u=u=ê3Ϭ8-bu.~mZ c`hӭ*DA8@-&L7}j^eO&ėl'L4/'rA \RCZ1qT#?!\wr7~F);W0~U첀vVBָ*>Zc8r̉Vw}O޳aCQh,ݤ0zyrޏ痝_h[xk-9EsjWbԬ@2g:/<>U\ҩ[֑tˇ[^b>K>g-BOͩ3E?;5Pl Tlk=k__JrzB=<'I™ Qub:XV;fg[ܢ .5P[m;8}ݘYXm; GDxqCC#ϴ5&edd3STKE{{="'ڼDic zzI03ծ@i`д"A]Lِ} MM/Y?ܻuIENDB`u1f473_1f3fd_200d_2640.png000066400000000000000000000021211326020644600342030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[h\UϜL23I;ML/im!+>M/QO 닠HV SAi NT[#d=s朽}u&^u{ wuᦦDՀ+J\DtZkxXDs]AD>%OvuuMg@29üQvqJ%Dgu7h3~Ć `É)|@ @ Vh\1P.Noڴqe9UH$wrn;l\6C>cXDk "|XNWBa,s]<`3M[˷xwN@(jÙtB(˪M<ϻ(m{ȧSri Gܲ0zŚ8q)eh܌?P7/;us{EjcU+ʢB8<Lgݣp~m H^бs]zɳ'RBmDi#>bix^~]Cp([k`yk>K16Q0i>;@c(x L\͓IXso3IFՆhSjR*wL_2Y;ٯ:)&?` Y/>l:s^nØ1c̖ܳޝA˲ ๺?67_vV"Wy$黨Io]Nꍗ#h?bzL:Ӿɓ'nWs ; < D1(Ղ<ȧ(#[糖}/ݞs]+8,̏/@J"~ڏg$%(LN&'&>B\ID̍LԲڝ_2L4L+j*3,˪f>CgIENDB`u1f473_1f3fd_200d_2642.png000066400000000000000000000020151326020644600342070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHk\U9sLȥVQ,) EN/ AX꣗@|A`T*Ԋ$-V !&5霙3眽|3IRp^߷:xX)/l6[[N:<}tq-z\)("ꈑؘޖf5 ~ %oaZQ۶.Z:c ~t{6M]DNϫ81T&0DD@zm+Rᒀ\naC%AVe4J)5pǎ[٭W~-wqQU*cp]T:=lNLl-JQ.R,˚;0DQ ,._nJwtbY& RĔ(IKe2v \*e&4L /.>DA8@-&L7}j^eO&ėl'L4/'rA \RCZ1qT#?!\wr7~F);W0~U첀vVBָ*>Zc8r̉Vw}O޳aCQh,ݤ0zyrޏ痝_h[xk-9EsjWbԬ@2g:/<>U\ҩ[֑tˇ[^b>K>g-BOͩ3E?;5Pl Tlk=k__JrzB=<'I™ Qub:XV;fg[ܢ .5P[m;8}ݘYXm; GDxqCC#ϴ5&edd3STKE{{="'ڼDic zzI03ծ@i`д"A]Lِ} MM/Y?ܻuIENDB`u1f473_1f3fe.png000066400000000000000000000020241326020644600330060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[heC6I4m/j#"Z6 ZA7 DEㅊPEA+H-6MZTDښJ+$;;;^f{1 }1F ."VDT}RKw:wȲ{DDqLbik}q읾Og\n1ļT"U6m뢔ZZÏwޫjtsGwAIJ[E0^k5",d:4JaHV`P%ؖۈa624+fbP|\'A2Zk\%,06ǖ"0Ɛt`YBCEqc8KDQBRtd,8S,g\ĸi>R]אZ;a8?+ H]1?LO't羧eSg}f>OJ;/?CҷKȯ#S8L_ẕߏ|D{b1K T7[i}WS/W8xZ0om^PiLB)ƍ8Č=|{ޛoܸP WcTjq¹.%xX֢%S E+rhq.C+=0[ixي>㱖K|ͅ}[7ր!:$[6xo>|pxZZt5̸b㖍YWSsm022bNw?0ap`MO{]mlj]o:Rؖtiݽ5+cGj}gX4FYyHٶCvC? }ض4^u\m-m&Zm!ͪVW1ž۶o?"~muO/d(jU 8 "-h_x,  ݶ!_b-`IENDB`u1f473_1f3fe_200d_2640.png000066400000000000000000000021141326020644600342060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]hUn6lbRX*UQ/ZƒߍJ"x;AE V - BSm)dwg6ٙ9^f~9&ȑ#Dkk_JoݲK jCCC9!<NJv/g@.7q~y."`F"D ^H_hx&JCCC A5AࣵcǣwUSՍLndmۛʞG嚸"vc,-.!"ZϬnMV0|qM4J$jpݭa bB>X2heSRH$,eťrٻ5lFD\ǹp ]:Ϧ tuuC]IsT v!ϱsQ<Ŋ)_yvg(C}_w>E9ETTx8a+g]on b;4 ?GJ[%SnKS<|Ŷ&QU!01_F mp.ا7 X3; 6ˤiщRŞ 9Ke@)agdYDFu#{r=̭V 7X0i^R#J}=c/M!b\m)oǾUN3ݖ2a]n4_5"ZG&~SL|N^vZ FD=쩕tV>-X ?6_+}K#J&d#|?:fWyA}Y4; @{] oz{{t}h6 O+DhjD@eNd_d^>3S83(j[Kۚv'[zz>ZdnCk9XnjXJ,l*"jBTJpίv]Y:TTo|gQ.TIENDB`u1f473_1f3fe_200d_2642.png000066400000000000000000000020241326020644600342100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[heC6I4m/j#"Z6 ZA7 DEㅊPEA+H-6MZTDښJ+$;;;^f{1 }1F ."VDT}RKw:wȲ{DDqLbik}q읾Og\n1ļT"U6m뢔ZZÏwޫjtsGwAIJ[E0^k5",d:4JaHV`P%ؖۈa624+fbP|\'A2Zk\%,06ǖ"0Ɛt`YBCEqc8KDQBRtd,8S,g\ĸi>R]אZ;a8?+ H]1?LO't羧eSg}f>OJ;/?CҷKȯ#S8L_ẕߏ|D{b1K T7[i}WS/W8xZ0om^PiLB)ƍ8Č=|{ޛoܸP WcTjq¹.%xX֢%S E+rhq.C+=0[ixي>㱖K|ͅ}[7ր!:$[6xo>|pxZZt5̸b㖍YWSsm022bNw?0ap`MO{]mlj]o:Rؖtiݽ5+cGj}gX4FYyHٶCvC? }ض4^u\m-m&Zm!ͪVW1ž۶o?"~muO/d(jU 8 "-h_x,  ݶ!_b-`IENDB`u1f473_1f3ff.png000066400000000000000000000020411326020644600330060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTU:3@iA՚HA0 (#!hą{…n4ʄI &D Jb@HN[BBGBҡ u1aL[H{}", d_]6FhI"R =u1(D eJ7"Wv{|=/?F#8NaR,ZD'U`#sZ_ k!B,˪cu j,lǩsK͉$e>Gefr'mZm֮)C/ Ё'WkdNsL^8lٰuZ=Uc7s?xإ:ń(?h,Ӳx_;ۓ:.2xarٹL!"l|`=_Ο>,cJ.ZCMajJj1pѩZg՝OnX՚:"Jua9­36{o0l=X?Ke|X/p׀wS6v4PȡtΜ۲ОhC3_? BvG&ٮZI%wċ>Ԟ-?''7:m躝"^ymڶm[*&d2>A^6;$W Ïu?ضfM_nVi ;x{\&N߬ժlv/ʺ(A`'l]GDxtض31p"ыC-9͢PnL1Tѧ[pDJ plbf'beQw*` nJzxhAKFD\3 IENDB`u1f473_1f3ff_200d_2640.png000066400000000000000000000021411326020644600342070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlTe;wޯ@Ŗw#Q(TC5FL4>1F ƠK !,| MB0QCC`)tm{LY|_'EtuuMMo= 8i7oxaeÞVT𘈈8ض(' M(gL&Eڶؖ>%vOغu] (7t\oDB   6RR uNO3}ryMնI$mˢ\*Q.LMNy"vww\g'ʥÑ(:JPH4:Սs Dђy8"Dtf4ժmٸoi>a SScժ$#"X`irV`Ǔ,_aKTD4w~˪$I G◾>,"~=T/%+yxSo$O0111>@>?9U.m9w!f:.Y@OLyŗ Bpl.by* "fMpHcyj\^oCСu toZ xkj\WPB\F\ƣPhs(` b+bQtM-Vī?gkj60[qϡuHhЕ pH(u;zl]u>w9q6\Y"4֟liklVt:Mk&'|g/HaK&Q25{}", d_]6FhI"R =u1(D eJ7"Wv{|=/?F#8NaR,ZD'U`#sZ_ k!B,˪cu j,lǩsK͉$e>Gefr'mZm֮)C/ Ё'WkdNsL^8lٰuZ=Uc7s?xإ:ń(?h,Ӳx_;ۓ:.2xarٹL!"l|`=_Ο>,cJ.ZCMajJj1pѩZg՝OnX՚:"Jua9­36{o0l=X?Ke|X/p׀wS6v4PȡtΜ۲ОhC3_? BvG&ٮZI%wċ>Ԟ-?''7:m躝"^ymڶm[*&d2>A^6;$W Ïu?ضfM_nVi ;x{\&N߬ժlv/ʺ(A`'l]GDxtض31p"ыC-9͢PnL1Tѧ[pDJ plbf'beQw*` nJzxhAKFD\3 IENDB`u1f473_200d_2640.png000066400000000000000000000021311326020644600332210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTU73vf:Qj mUJCP%&j4.4.\`t41h"ĸ0 FbDM I5t:m T@BEa,#j}b0ӏAso"XEQ p0m> "Z,888bZ6xmۈp2ι&H$FyWXD,?0C x\OFXۚ]t23#*JYty!J߷VfrauK` SwOG@iڹġE\ژ?iH3[k5~%Ei3T-O] gN;=e=DŽŁ#|}tU|A3 6Xѻ-~P}Uckc:5} 4UH#P2_v^fW]lInL o#Ht(eooov.Yg066N$J_y_ã@4mΌz!mu"ш4gKw > RϋЖH"TTm[6`A@&3B?jIjE1b#qj֭[mKwc(! CJ"Z(dl^D7D粨*d;4JԪU0pyV-&S8ZH $% ~!>8J>EҢ|4yp(7)V1R =F6O`nʥf?Ӝ%T 3b_MQœ?, ps)l{|Ҧ!yH/V߮vQvnN>c&sbQ@nW6Ƭ\PqVkMe=r uW+^&Z'?8gކO4 Tfn\vt~ex~y\9 ~=ZlQc(- %\ʇ0||MS={Te?@`8s/<@(F6N=/!Tt{}}EJ{O!ש^yt/#N>&wٝ~% ɴ1 δLe+Z&VGG璲9kt:=5oN8ǴEP cWبA/| Z:J횾y4",jt <10pvbeEZ唊mOU MsE.o| }s^Gタ3'zIENDB`u1f474.png000066400000000000000000000016231326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dJIDATHՕk\U?KbvNcڬ ZuH]A"Ѕ覛ŠQDЍC Mh-u6*f&3q1L^´ s~9ILcQWtHnp%̗_ZPHlȑ_6RipyQ+bOq1v׏Jm+ B⽋lTiWdi裆b_^^>>>>uUP(^&ww,`2Am&L W[MoXeډE ~Kk5p5MZ7"0Y4!s܆o f* &fx8aX.u0iz Z4N 4J @||B}Rw4f:qY\2.ߖ{;gvpVlFR83K;[á}w`` G]`j_p|5TD|iZ4Ju>;bV+Vx<9%Q,0u]v:KR+/gDXm`옸Iןko_I=xD3-)b|6u­9Hj pUAT iHG=E=K^rkz[cVX q9'?z +*CIwo 3XvFo~fѐ$-]{N@gySїTDOYgˣ嵭zɍ128p.!c|{(|\,ODV󼷀ֈyjv8@h.`GUE{4LMU| @DTTq2iX#(P-5OoɦĶq C=Ƙ - ALE`.&7۝""U[6Q{J >,"TAwFMW~ JNkMpvo~Ę$7?0}c[- _3u17I%l SN kquv O+^{xG,afkz3Α{=/r5TNMV|LFj#41._=1:z&n+/~QNp3in+>n64=>y&`2*%,oEqDMMqD$FUh.LQ&0ws> ?&_b8wE:;@d<504w¾$ s)JMn\쨶4pөE%{Q%{՝|9靈'O5^~qJʊ5D?M<5sXwCIENDB`u1f474_1f3fc.png000066400000000000000000000016551326020644600330160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|ddIDATHՕk\U?_3X̤6M"Ը0"vE-)UATH[-u?JKv!H ؂RWITO 7"餓³s?s}^-a.6v%Vqz𕏦ԏeyyo:o{dC9o#"6*DL%s`{e[1/~c'g2*:gOlL5)X_xxxbV(3@9^.$dքCl܌)oS)+b\? fĂu+PJƚ Nqю{x4nկb[2b E1uЮk QQ/ ԥjUu]{~V>wUJ Y:=H.[M;÷xk?n\AkGћ{~6~?Eu516<$S-U:;n߿!J:_2(NӬ'p[oz0QT %-wb[ay_J\Cɠ&Fb<Ãf[|[c0Q7),.g_+TMNu^˫=ɛU0 b ֬Bff !FDŐ͟%#}fn=|Q.x选%.]U|9L14"jȉ Ƞ;kZ5QaE#0Q{uUqC_6E;ٟ N|sZ8PK"~ڇwvc7YJ$5IENDB`u1f474_1f3fd.png000066400000000000000000000017001326020644600330060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dwIDATHՕk\U?͌1&vƤmD+AltcE\w'ZE!Z mt!B Mk"LVN1i'!d{f%$\xsd/-FS$1,d F}i%Z;ac={d`VAّNchPF15yt:@*r2̐ܵ]+u47scL&3J@"x _z]kWXvD"jH8>w5sY `cc Ƙmlcot|C *ʦUcDT=/0(W "?o#4p]QXJ,qn Ux?: A "(PBDvrDGlSKWpdfvc=зO>ws+71 6zx˺z1lS%CoJfOoi}L,aS X&+F&ډ߬$c.FCIENDB`u1f474_1f3fe.png000066400000000000000000000016421326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dYIDATHՕk\U%1 mi (b$A! !X(9 *BDC_ [̓4$t23|g24.8pZgo6CvL >(>!QVT3إe0:gзKSO/~_Ӈ/:{}U^/g:]`vv6HR۷/|e]]S}v;0eA*z޾g8@Y|0q7U_ /G"2A@q}ig媱/~U=6ofjJlD+8@|[$ΥQ#mdBOh #A-.*\m0Ωur!Y xUQŨ 333_$B|)=D5U(zZSߙz}o&.G!v|p#޼etʏ^<ߖkf0Gu8PX-Y I,FS:9ڰDƘI?ur&th[ dytғ ~iNATnK%Ƿcx=lq;ie"=7dP/< n@EEyHWTi %c *IENDB`u1f474_1f3ff.png000066400000000000000000000017551326020644600330220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕk\UeΜd1ȔTB6O>C+RD}$V0B>K˜əd&s>9dҦ|p=mbsb?ۯDhx\C?rh=*ۡeVߙC_ ]8@###7=:Rʹ?|+!KǞ}~݃==== ,.ir>;DS^4J]Ȫw wPVkj"Qw;4w^Be['@k;.a$KEzD\R c"톿 aFJTWUqHq4 Li 7^FeszpYaZk ORAJeYX`_3Pa:/}/F-d'fؖmlDܥ13ޯ#Duq>4jkis+syNaf h3>5MjIEŕUTG~S;"A: Cjjv)OPd_tyHnKh] CFF$QҪPͥiFbvAcȑmPLjΨ.nPhM}=n?%x n[4$aD@kM%HlZ5i!dfċCٟv"l DRt(J3=ZiPӐpr!5l6ɬ17O@nk5Hֹ!/u\_ 2gٻ44&\2e!`ҕ_v i˶F^84+/T2J)ʜH~̌:w-ہ!II؞Lc!o~l|ٯK@`Q 3?܏_Iw'tIENDB`u1f475.png000066400000000000000000000017701326020644600320330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH;lU;3;]?ׄ00H4DQ( J }HA@E B@ P$HPBpҀ Ƙ<isΜ{GRR)RZĄeǑHP$! }y!đ_d4ݣz9RJ\׽lqV HR{ Aq~NR4DV@r5 0PJj2H&kШWBAB=Ds``ொPb*]wz LQR Jˍ#ElaRu ENB /BPgϡ7 3+?v AX4UBk*v<>y.~WvgȮ5wsj/Z$ǯ&x-\.jdt[`6t2@9%41%Ի};P[ڇs/E2ezp8vh @b/5xm?d-?Eʵ5Lv[ w;{Ϧ̵ߍ~6@n':On) ;d~=X#;oz5Ϋ-[HÄ*IENDB`u1f475_1f3fb.png000066400000000000000000000017671326020644600330220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkE?<<NrH) ܣy#BZEsr?jVpakz3( 0]oi <}u`ضmbím[WquGm`Yr),|CU$gGJD~'b, (!R$[ ;I42; V%e2(h I撥$T n)No M<KDIS6L7n!OuZf ꏫOzy9N?EqŰPp)??Y*7SG 5jNj\k[WV0?\VU>!H7-1mX#B#ћpɌ ld<O7[[ݐᖭЦ-}}y(ݸzRI3߯|ވninB[dWOѯ muwY$vA^0m Q ӸZKGH)1T;R}#CfZ ;ýuamRDՓR"ðvT ;A:.Naȶ TrvnHǩ@!Q+sV1.|KR`QY[s8 |~fuWy,vDg>_ϝx^2S*0h!eF5Qc?'J*= *fu_D\(4M"ݼ *ImKCzi#u8uMC*UH4Mt Fmc|=uW+ F=v0 | %)WSRͽ̓%wCag x̠PRaelۙ,fv& Nfw/Pcvg\(׫zz)=5zfYXK2Y{81:B%xN9 Ƈ>F7ruΣΖ~ؖ4>qss7}x˵A7y£g^O@[cW[dꢽI'z]zo/.IENDB`u1f475_1f3fe.png000066400000000000000000000020261326020644600330120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[hUg34ls7&aIEAKd$TA}l^}Їx/SҷT!1b65Դ~Mvvg6K6>;`100pxhRJIԄ˶%{zzM<8۶U"8+x% 9Z`rr2F{^EEE;RbY֠iǃڞ&&&uˊYԳ`pSSSwI)JH !đp&r] (SJ} fuk4MSaEVBPmy1xԄHkrSCOtP"ofF.$К:}K,!/Q{XR,ՂTz1s?pR,[cJw?B $(;M 406Oj[ `f(H*Vղ#%\bc]L*moZ] v0wį(ު@y'g.sٟgԑF|:ĊLrb䇛h$Mbs]LOfeY$т#?aEV$8l!2psNcvlSM#MRJ뾲-4t*|9 ,)1sH_Ž-m1+VR~&Je<2o֛6e?m&Osp)iM'6b9`9@)\VwufwyZ& p1 Ј&\̥4+ft.ߎڅ}2;txB{4^軺&"cwWR7p]Eᡡ7O|wO_|၇=E!-]K'ټ-'_:N<ɟڛyVwk}t{B 33#+oYY𭯪-阑FАIIENDB`u1f475_1f3ff.png000066400000000000000000000020131326020644600330070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKh\ULLfIIU,BE""uBܸĵnsETHSjR&m2yGy;sf2\sC <41󮮮}?h@ p"y~u%~z׀jq.Z1ƐNmŖ H$O}@+;"r4]099j |3VR E]Ns|X*`ll^k}T ge5pd'q]m~Sє\DO@)>ASRuEEE'N[JbKyDkjyу8$M֭)ӱ#@_/C?@*&z#Ԋt&"/O?K(PJț|~"`$9˿Km#/""E^^!Jd*C} ;HMmzGљΧ5Ցw19( -E |8L{{wfL* NQ§LqJ)"d"ݘƒ _deilJS ̯&YpFd~-V Z^wDئnYDELjhVV-5yMyeKWh .e`)6J]8Uo_xӢtTUc#O2>5!¡Jt({xѿyE1`İ$ϣ:2Ge8߿>B߶M3kNJ⮓8|'i!q,Jůy/q?*68z,:F7P:+X橾|O~1zP6A,F~ k]!7U 3循3wҘzPIENDB`u1f476.png000066400000000000000000000015231326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHoegf?-lR $! jLh„L @kӚ1 -Jc%(V.l-;;'vי<9gy߁{r7W_|zsUY pZ,G fOL|~穔ͮKzm6 "ZʹwF'~䛊J[z.z驙]Ǿ%]q@ow1sXH'Q73[vi%VU>ڗ1_zg/:_\~ޥ:>'ґ#R\O}0oczY6];/G.NqZmej|Op`6:V'Mac eT˳)^չ/+z_lm3lVU}7e;lY}7sLLeczVaU h*'89b-W[Ƿ>? liQj/\J:_]9Ñ'^JZ݋0+m07NeNw8⼌g6Сt;iӸ rx#.U.IENDB`u1f476_1f3fb.png000066400000000000000000000015611326020644600330130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d(IDATH_lSu?^۱հnlզC tJDa5>裉11,{U`ƒtL X!FI9[6F9gֹ9>vzktws_~pC֒4(O>D΋ёXJF7n$ܴqέቚuE䛽{hb0haPywY\Jyћtcfޑ-~_,eW k`v5k/ggwxyQ/7Yy ؔO]01g vܳ\MKsl&`G@Pk߽|v:1h!\amd'u\Υ{{ ZBTEwUmyN O?_tVsޜ*lz۳ҘrDVoz©n?s6}m^氆K?н!0k:Uq[o9#>!IENDB`u1f476_1f3fc.png000066400000000000000000000015401326020644600330110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]HY͘;jqEP,,YDT],tWh/Q]PB*tSDSEDQIbՇ:Y9]󾽦ܝzv>z(M h#bA|E$h>hc̥ɜs^}\NH0^Z 8BH_m"CRD@*Z=h qӶ$Z&Ӧe 'fFo{ Ӿpg`|Mm[|}o0n>%r"_ j)l+o K@-8\fjQ:Ly02)WH,s5J݋-b9/|*n58EƗ۸2H>m-?\jr<-׸AHT[1Zom _p"MhVA~ 0((| |*.rI`{}!XyHE[C=FYx~5ErʟS,G)RG> /?c.Nil30̞7`f@4\dr\Wb+X3Y7Lڷh|ux9l1T%d"6+)j'\>Vs#ވ*`|ET.(&"JWpgmxQٰz0xx :aSx@&jb|gpi7~/KXbl kMFrv-dPעLm8,MزCv Pylb>`.Ͳ&IENDB`u1f476_1f3ff.png000066400000000000000000000015571326020644600330240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d&IDATHoTU?ݙvfP ZBCX# S V$l ]Hх nԘnjjHL45CS[D:P;3o޻E;kZm8=}?pC6Rۻݺ)D~kDN]iӀ&[,E&u-{*ֶH c3/ ȣ}'EZ])<߲`ώ}_ qGȤ/Ԛ4E"DZr(/=}oCGZ&{sa/J m-**㣇w6EV#PzjmV5k[;meF}Z/<:FT~;$lIW PqNzzCeUkX^#<;U,Zm;r``ȁ=ZM%&._eBaWY,$٣CX ~- ]aQ mL^81Mf@ކUl0s|bdx>#*"2F#ӟ]{*IENDB`u1f477.png000066400000000000000000000022241326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dKIDATH}hu?}6vXۊ]ha"2ĠWB `DH$d|뮺۬>nש[8<99#UIrJaLRb([Eȹ_݄"Bb!GD2D$pS>Ͷ4A`g6/3~[پe~nu 5XۉI7gq{R-&Ƅy7,8Zb"+JBd8* yOe1Z+820mBl Rg{<"#FO O |Å$HEwdM$M7 @"ls:4"`6(:wj5BcbD F-+fKk=4= ԾqN:Pӄ}mPoni@ kg»3kO?wCM;2hWJ̸qgY_bz6߆ΦWx\pIIYa %HގcIvinpx+Бwf:M4nOCruleW/нw{mܱ@;TEg&Sh;VG6//3μD,?gAJgk/ =ޱ,9*i<2: WWMPD>d{ 4zhxw?p9r!(. "35;,@}gtGXL & aDJ }2mG(6+.۟aaTg]vض(-dJ߀qyPҦ02nȰ8 |Ay~Te]*{(`m@~BĿ]zCIENDB`u1f477_1f3fb.png000066400000000000000000000022461326020644600330150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d]IDATHklTU]vn۵ԦЅP&!@Q!|PLhQc!HxFBLm٠BKKZCn ewKV&993gf3w D_CIDȼSް"Bb"FDRH XӤ#  5[/x\:06mPA#~zܬn'>ijv[5%{G[tM wdww?}`-}PmT81/wpp77I`ZG)Eh4F;0ǩv:Ew䊢SV(x.`t4nڅ3ۍӝ֑W\aM(Ec@KV05'}E^_8h^jڂUUֺn-f+9Ծ!6vJ/nT<@f|y֯ZLQAbdޮ4;4-ݰ};!_J^`maei/~9)jsƚsڐt_`Ч!˂WF(M. 2SmFڬO7=3PACz}zyzfLl\mnS(@|T@]ADBd%Byީ_8WQXuxo@.pŞNޣ2;IW/0שdz$ @$A0GhˤY҄?%zi>c5v3vfq)z0]5%~@X)q^(DK#!DĴm2dIS\?L.(Jk運=*&Xreٴ?~?sV#:IENDB`u1f477_1f3fb_200d_2640.png000066400000000000000000000023411326020644600342110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHylTUY;iͲhQ)&`$I(HFk0`R0 c!,l-2Vh;S`v:CSK=ɽ7wss"`Ks2zab"CD@ r0~+y, f'6Uڍ0mv}'*"BCG]Ȥe]sC TW<^lk{%G#[ZMO@Cj{(À=m_u.O3CLvAx|-(@:ӈk4\qO[r,[ll<3d(|&y ՞T"B4> ׹}'(# `ղٻq9i +1ss$h_68Noo i}X"LN5[m.3r\քR ד,~?.^=vedK=wa̘1~ʶa57dSeq y#X|'j2i@~n}\/(/@<:nNU_d $MpRirY ^T_ #riYh@éocإ*jNTw6W~ܐx hZ 0U`JJO"P@}IŻR_(QȅlE+[6i:@m:{مSѵ#\VC'*Ϝl[5* j{q5['J@a͆l ?|PD,{ٴQ4- tbs2m)N|iޘ|O5kK #1|k^5]Q.4n&M:Fγ7@Po†Nmsɛq/UQd6~%%%&@Ѭ.ts_|l^(Ъk]qԅT\px|h6Y ƺ}*9~TIENDB`u1f477_1f3fb_200d_2642.png000066400000000000000000000022461326020644600342170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d]IDATHklTU]vn۵ԦЅP&!@Q!|PLhQc!HxFBLm٠BKKZCn ewKV&993gf3w D_CIDȼSް"Bb"FDRH XӤ#  5[/x\:06mPA#~zܬn'>ijv[5%{G[tM wdww?}`-}PmT81/wpp77I`ZG)Eh4F;0ǩv:Ew䊢SV(x.`t4nڅ3ۍӝ֑W\aM(Ec@KV05'}E^_8h^jڂUUֺn-f+9Ծ!6vJ/nT<@f|y֯ZLQAbdޮ4;4-ݰ};!_J^`maei/~9)jsƚsڐt_`Ч!˂WF(M. 2SmFڬO7=3PACz}zyzfLl\mnS(@|T@]ADBd%Byީ_8WQXuxo@.pŞNޣ2;IW/0שdz$ @$A0GhˤY҄?%zi>c5v3vfq)z0]5%~@X)q^(DK#!DĴm2dIS\?L.(Jk運=*&Xreٴ?~?sV#:IENDB`u1f477_1f3fc.png000066400000000000000000000022271326020644600330150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dNIDATH{he?w9;]0qJ6gƴ?FJRR"P*,VGD䅡S1I9չ\w~֎}n ӈDyCԈ0*%BRl$"dNW7JlD!"IkSqE:7 pmZ#"Ͷ40IvZM&gI`0Tj[fόK= &>@fYX@/<|2Ҟ#K$EԲ>Cb]> IctHWK*X2feQж'^±.zPc`K/;45$FC s|mk<\άc;+r;tq=̯pkIK7BsFERO:_}dCZQ/+>_W_ANwBk[7E1]~Q쬬tu4ςlubAكZ׀mkiAv־RN (,Z n4l{/ӗIg-ӆ}TᨂٝEPKF@U17&u\]mkkAbǒIQp聒 O#%V,='T!?$ e,{?D:I&WV⯬,#BNVbO#|1MD]A1ex炂@:{q*74h"hdXQvNϏl p 1W dQ|> '{'+e11/༐9m{Bg.I)"Ē56UKes'[6w,{XWn LY)4"7$fɌQb< YŒ8kXhx8?V^ˢ\dIR(X6rCsoQũ S 0q:Xi.ѡ~5YK_6̓m#<'9h/r돨ȕ"ka@7oF]zSל0~9u,yڗLmϔ'0ݮKFZNX[BGoruu+ V \in0,mH^'ca^8XU8 Axr2`q,̻3x7r(G*{PVIENDB`u1f477_1f3fc_200d_2642.png000066400000000000000000000022271326020644600342170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dNIDATH{he?w9;]0qJ6gƴ?FJRR"P*,VGD䅡S1I9չ\w~֎}n ӈDyCԈ0*%BRl$"dNW7JlD!"IkSqE:7 pmZ#"Ͷ40IvZM&gI`0Tj[fόK= &>@fYX@/<|2Ҟ#K$EԲ>Cb]> IctHWK*X2feQж'^±.zPc`K/;45$FC s|mk<\άc;+r;tq=̯pkIK7BsFERO:_}dCZQ/+>_W_ANwBk[7E1]~Q쬬tu4ςlubAكZ׀mkiAv־RN (,Z n4l{/ӗIg-ӆ}TᨂٝEPKF@U17&u\]mkkAbǒIQp聒 O#%V,=֎M&6%ZC> m (M$pe'a:Z"uuSL D$9#tg G_?L59_UԥD .wFelDv҃`&4Ss) K!~œeSwJ49^=06ҜGzj[m3HFz"J)s|ߝ.xtӆȡ'ZL5|ۍ˼܂7bx<:A3Bq^ M\v=4(˫۴89ݢgd]iam;=  !u"`;(~+ OZ4uIJ>CZsVn?tj[ot= g[趭a.5G0˲E'G5*ǻGO|K9%cc b(-v8"^= ,2~R,վ(~㤦KƊL4nvkg-Εܞo?rm}tq3o\oyTQOͩ?ﭨU)6! u^viG] %Z]Af`A<^몚>{Eky+_JRt[ Q|"F昼Ay}۔iM  0 )i =;Oa.l4XYqiHfJZ a^ GKPB.C/l͉/al*I()?7 zXJ \JP9i(h2:HuF`VOafIiOA״ۿ$ &\=IENDB`u1f477_1f3fd_200d_2640.png000066400000000000000000000023151326020644600342140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoSe?Ͻ]! Q6T1H &h K"@?_HL4DC$!F:Ax`[`[u}Yko{u or|<0 $ brFY* P8ݽB"$"2),DR"{ġ;/3;/lF?~=lY*!BgF]+D`Owd^|vb7ۼKF|< m:m `0,Ioof{#eE&Sxfؠr-(@&NkBttt׊ \qZ}?И_SHBf a#3nĨ10d&3o9c5~aB.FlZ:Xp6>838Ik'.p=8ItR1\y#U}mk|}g}Pk:D6G4Cx\EyGHN 4*x>Q_W`ϣ<.z~QDRT5g; ǒxx&ZpdGqA>4trq@>>v, \wlf,{ %M#b> l.ӿ|"s&բMZq7'0҉r?niq3pbonH`8شg_t2S`j\gP>t% j|jaUCM8s3mM2P1 W6!Ms 2@K{ Kkgr8p-;z(M'?K3(86"So7[6?;J &Y9k(}^MWuM сGyfjYZ2 r)j6XT7O?vEեtyG>ljl`8Ur2ܵLodۚٝA%ʪG\K9\upOWg-eDo?]O;Jʵ:Fؠ7BP*0qArgkxFsIENDB`u1f477_1f3fd_200d_2642.png000066400000000000000000000022321326020644600342140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dQIDATH]lTU]\K L(A41 "( hRy$$J4@0!F0 @!ĘbҖnwޏm drϙ9%1^85"$ED0ŦQ#A&]"JlDb(1EX(3gh8X"΍}϶""OibrڇY>֎M&6%ZC> m (M$pe'a:Z"uuSL D$9#tg G_?L59_UԥD .wFelDv҃`&4Ss) K!~œeSwJ49^=06ҜGzj[m3HFz"J)s|ߝ.xtӆȡ'ZL5|ۍ˼܂7bx<:A3Bq^ M\v=4(˫۴89ݢgd]iam;=  !u"`;(~+ OZ4uIJ>CZsVn?tj[ot= g[趭a.5G0˲E'G5*ǻGO|K9%cc b(-v8"^= ,2~R,վ(~㤦KƊL4nvkg-Εܞo?rm}tq3o\oyTQOͩ?ﭨU)6! u^viG] %Z]Af`A<^몚>{Eky+_JRt[ Q|"F昼Ay}۔iM  0 )i =;Oa.l4XYqiHfJZ a^ GKPB.C/l͉/al*I()?7 zXJ \JP9i(h2:HuF`VOafIiOA״ۿ$ &\=IENDB`u1f477_1f3fe.png000066400000000000000000000022041326020644600330120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d;IDATH]lUwfݶ emQ* H5A`BQM<@xP4M4& }H`B@HJ(-v۝ݙ9>ttiK+7;; c,Id8%BV[8I?+o%tHmDLD",jZA][ ˩Fwm[DNEbrڻmޞqO={/0e, z+j=SXI]$Esdmv|r`4lnhBȑ3Kx|AA ٌA6c` UcBya^7'O)].>Aw6R"KM`ZKl.W#whǮ Zty#Ck* NN2JAmԗM9޴nMj;w͉mݻ@ %/^#Xw--ţCP"oS2Pi9'o.|q{M, p͝7Ijx tC6zMGՋ:ʶE[,ш #0t p\-E=Xp#e|!F8Xtk76z5ZJj6cQUhZd@8agSxO_-%wx3 oz[ӡP0d`OԹv@ ӢԖ/|8;jG`!6"t\G1O\y/m3q7m-wwwΎ%-Ezo[n^mړuˢ7˗b\t`jϩsG BGTKU-LfZB׽T. JXK f\O;>OBjذz7k{?j/)/覵 D2 Ǩ"Y5C]ޟ sMeplY'oF@i#|u!Rg[".spQ8'|I᱌D|te`Wjgج}y+4-RY*A2NAJ'r=x.L/`(e$S~hdF|"ܬFMH}U0 Tr<UP kxJM42v *N y14@!M ŊS `LC>]\dϳ}eSfW׎쮎쩢4]V-;giʻuE_+ @<wuF[A-f Uɠ7+!zN#+ Qӡ)d038NyX!өkerO`tlm&;Gdf4t,@~D@?1,GsX͹$M\JYXcã=+HGA (pfh̆ҌyNYK37-##Bۭ[5!7oYF]Eyט@gn䛃,j`QKE9y+O&Z5"No3-Y3'y"1s4 'm 4*Kk++ٹ=ʶey.0\hxuKz m[8* +.?P J㳞3_˒g#Uhӱv7W]⥮v'?& u/6&WGstz^̅~|8,~ttiK+7;; c,Id8%BV[8I?+o%tHmDLD",jZA][ ˩Fwm[DNEbrڻmޞqO={/0e, z+j=SXI]$Esdmv|r`4lnhBȑ3Kx|AA ٌA6c` UcBya^7'O)].>Aw6R"KM`ZKl.W#whǮ Zty#Ck* NN2JAmԗM9޴nMj;w͉mݻ@ %/^#Xw--ţCP"oS2Pi9'o.|q{M, p͝7Ijx tC6zMGՋ:ʶE[,ш #0t p\-E=Xp#e|!F8Xtk76z5ZJj6cQUhZd@8agSxO_-%wx3 oz[ӡP0d`OԹv@ ӢԖ/|8;jG`!6"t\G1O\y/m3q7m-wwwΎ%-Ezo[n^mړuˢ7˗b\t`jϩsG BGTKU-LfZB׽T. JXK f\O;>OBjذz7k{?j/)/覵 D2 Ǩ"Y5C]ޟ sMeplY'oF@i#|u!Rg[".spQ8'|l<7M;%wC>i~[ N);jVvl-ZkGPZκŌ"/JgFd]zHmclz#Ͼ̏XJI z:yy6>0rpE2aLnנwr 3)E!pmQfR*w ]P@8~Z{\M!Lt.mڻa]t;c疽o@$_#' Lk>kT@D菙nLOn+YZdi=vW(Uv \^ ,f2p6(VyVOFBk8hxcuGllј?M3r1|} _zh;ߧAր:8F+u2G?36SQ? (ynGs̾ճ-{|xɺ]s 9_pvTws{mL:#Zet<$JHH$mMfJ`]s];CvOcqb Dc|mmsʁsk @W+PU_\|<ԖőPMe90yzV'3+=i* 펨:@3m  fMj/c~ˀv8s,\Tz1]֧mS˕hz"@"#=(X޽X:d׉f\:޴coH['R32kJJ.e^@Xrq^'UYd(Q)w9dxB? B^ j)q(" ]ﯚJIENDB`u1f477_1f3ff_200d_2640.png000066400000000000000000000023021326020644600342120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dyIDATH[lTe9g] ݶ(-`#%hP # Q!j <%E!!FL4[ XZ貽Qns\ƇvL2ef ab&¸xtIWE7WuMe".""B Rߧ?}\v/V'gN{3",!wnˣ7Dwk]ˇuK`NF¶ӼPe@9 צ!\уX-h( ~~gͳ>a(nwҪ& Z`~-Ղld^Hrܽja:p,W؁L *aquU; ghs(P.iK.5lڨ òyczɋ/(@)84)2IENDB`u1f477_1f3ff_200d_2642.png000066400000000000000000000022431326020644600342200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dZIDATH[lTU}Ι\:^,fK؄K#$ hPC"^CĤ&QL1D1! 1E҈-33si-EV/_^&01yFaXKشK"&ʛD& 1,I "\aݐOmF S87%%Nfܳe%wZ2Y<;m>l<7M;%wC>i~[ N);jVvl-ZkGPZκŌ"/JgFd]zHmclz#Ͼ̏XJI z:yy6>0rpE2aLnנwr 3)E!pmQfR*w ]P@8~Z{\M!Lt.mڻa]t;c疽o@$_#' Lk>kT@D菙nLOn+YZdi=vW(Uv \^ ,f2p6(VyVOFBk8hxcuGllј?M3r1|} _zh;ߧAր:8F+u2G?36SQ? (ynGs̾ճ-{|xɺ]s 9_pvTws{mL:#Zet<$JHH$mMfJ`]s];CvOcqb Dc|mmsʁsk @W+PU_\|<ԖőPMe90yzV'3+=i* 펨:@3m  fMj/c~ˀv8s,\Tz1]֧mS˕hz"@"#=(X޽X:d׉f\:޴coH['R32kJJ.e^@Xrq^'UYd(Q)w9dxB? B^ j)q(" ]ﯚJIENDB`u1f477_200d_2640.png000066400000000000000000000023151326020644600332310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmLUu?s   8urVæ ףi6rmZmzիUt-+{aKKͭ&*7! /sί^.om90EH$_"D0DHIDxOT2Dᐘ i GDaŝE_V0yٲ0DxS'wPoK<?ILƫY{ߖAgn˭n#q˥KwD|,}*m ʀ' u[^\SS66-n+&Xp S8=+)A2fR䢯3C+7Lm`lᐃ_UrpO.I}]@B,p} :JH[_ ݔ't"I;w ;шNjL֯SU ,E16룅g$7.a0@):i{{%G?_6kd7v./;ۄN.tm~7*b" t*w)W~pDtO6CӢc"~+T$ x0qdMz\hiܼϺЦ눌I Қ83e}ѕNOj$NrtԉɮӒoQg #z.x}'{Z|ўe < RX֥c#_~R6ilƠ6,ii,|]? TPjA}'2!$LS4ccit‘9SƵ4=zof+pv"6>"B1{ɦX[KăQ"C!aOQWdž5Y0iH .hgbCr_3Տ pՅ9ֱ~9ç3#^ܑݻw(jcXuN4^mxkR`IENDB`u1f477_200d_2642.png000066400000000000000000000022241326020644600332320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dKIDATH}hu?}6vXۊ]ha"2ĠWB `DH$d|뮺۬>nש[8<99#UIrJaLRb([Eȹ_݄"Bb!GD2D$pS>Ͷ4A`g6/3~[پe~nu 5XۉI7gq{R-&Ƅy7,8Zb"+JBd8* yOe1Z+820mBl Rg{<"#FO O |Å$HEwdM$M7 @"ls:4"`6(:wj5BcbD F-+fKk=4= ԾqN:Pӄ}mPoni@ kg»3kO?wCM;2hWJ̸qgY_bz6߆ΦWx\pIIYa %HގcIvinpx+Бwf:M4nOCruleW/нw{mܱ@;TEg&Sh;VG6//3μD,?gAJgk/ =ޱ,9*i<2: WWMPD>d{ 4zhxw?p9r!(. "35;,@}gtGXL & aDJ }2mG(6+.۟aaTg]vض(-dJ߀qyPҦ02nȰ8 |Ay~Te]*{(`m@~BĿ]zCIENDB`u1f478.png000066400000000000000000000021511326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHMlTU7o-eJhk FvQbTbb,.LjnuaX@C6$At5[#Ph~B;|2oyw=+X9Tq3VW[ߌՖHCeW?vu$s/@g)>J0.d/rG/^hy_k}uиPP`q0͌L}=C]9l+P,k&3Rcclǩ/a(85#OQSs0m[X!92ǽLھWFSYA=LJglaj\dG"BJM6]<+bbΉ=Y1AލIRL9SP#<8b:Ⱥ8,3Nňj0d@(h70͈1\^7+{Zȷ6`w - @MoV"аV@s>2)1;/_F&ܔoى ml8Q{x\g`ē" ta)܅bM+4龮㡳Cu_aUؾ%fUih>4eR5Lv IN;J&}Y/bp┟kCyʊ6pm(ON38r_38+a!X C=5>oDuJϺK*U@"]m_:epōkIENDB`u1f478_1f3fb.png000066400000000000000000000022751326020644600330200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dtIDATHilTUt0S thtS `$P4jKR%55I?5 11F4b,`KKB  VN)Ey n`r?)-|7@GVjVSMҭϴM̆!nDppWfSVWLOI nϞdֿ* \Xg/2|.SHY`I#s83` b)ʋJ[xT+d,-b\Ll+KnH]찚~9$0zBL="!W,?3%ݙ?hd U,f%&4]S8mbwVzMKY>1@NEq5%3Yel"V~F$r3@3L愯ɱ+-; rw 2ߗjl@'`B͖{)fgfK5͵ZAil…BV<#}Z|sF(e@"0'kXvWukwn%Ӄ|d&k0j(R^D+FEbxd99n7aVU۶'?@)LiiiE׻Eph_-vw@iMyc =y(U_"]?٣L\uH . % +!bZ65P(t%? a` nީM݁0zzze^>< 2R ՙmk8minn I/Y@?-jqEh yݜX獺$ % M<oa.+4"m^j@N6;M}߄w?>@(5]94VZNr1΃uGN.sIǭ!wej6aY EՈ"RMS|H33&jh!} Bn'-NB擼tlyaxx`z)RHٍ=*mݪLӭ!з?R#D>RI+< "&q IENDB`u1f478_1f3fc.png000066400000000000000000000021011326020644600330050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlTUW;Ng"( &č6@|DPݺ5.ՕbcB1.LC,hT"tK_t0{aeZ".6w?^}BG X~>ѱ4^L_Rf/8>.c}aG3RI]1m?@/'M̳a0:ww5X8xTZ\^xR;K[8}6kͨDB hMV4yJMgc;΃Hʄ"w= ҺScC h0 D6/&}';(-QZ6; --T4 1%iג#МBϾ yAH ioxKS'ZC|cu o><0 jMwr/A "6Բ#>:PD!"nm`H ?p/nJ˼L[;GtX]]:DPqH p!'I8ԅ6ywe_ahǎMrT\)/ ާB,^dȯ3l7_"v @.ܽ@Ս@6Jg*\(1[da[^z~ǛFaq9ǁ};HKy!ѐnhT=Db JʻVX]%rЮ8*W14IENDB`u1f478_1f3fd.png000066400000000000000000000021201326020644600330070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoU{gmq4iL IKTj,*J XP/`X`@U Q 5R5iҦyR;q\iʂ3oιv&bu3]CS/^\!q /Wz[T5?PbZyFn}Dv/ b)s[sDO0 @bf7*  _3gSg>tym;KnIÚp0bg&@ (QaXN'~tFTVUJY e+  ڙm-r+b /.R:MiL4C.uʫ5pP[y !_8;7`kT$C{자"Ab߀.?'tHA'FOr vyi(Sg`;=845UNT8tiR:h7@5l ̮nۖry䄌KU٢þ:j]wq;u&BXVE`EH 7j4Wh⨒rs.%-5.&&C0keɔ NѶ^G,畁n Gs?^rxpi| C6ZiH@(.{H$3Ř+}TZHkhY'T IVEF9Pҍif%s * p $SyK?gW_YhR"+dXf`b2̱vt-_g2|{\T8l b=e<ׂK:k9acY\D|tܮԢ?h8=H!o+ &2Kj3+itx肂DbZ`̀՚]URHe.nE Эoo3{y3EmIENDB`u1f478_1f3fe.png000066400000000000000000000020631326020644600330160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKLU{7(P1C3.jLLLtD]BWƅ˶nPm 4A( fbo&P³:=N0u]\ŵ?}\"5KӇch 3s8ޔ`Pڇ0uU=Z>`|_=Mja^݅ y%ڑOj_1~t«7&biG&39/R)5z1M# e.<:8t"#g;Q@-PԫYORtytSEwk+t  ,,}E/NJY ai ׷>NJK# ĵ-N~  ۏbRU5v?p_UG-.`ǒ_,JZQS|gS~`\YZ@5=S|ҴE|yfu$@ T:3MLLFV]Vi4As鰉ЪcѤMzAM⠸ Bmt T+u\ky;I6 $\,:X otc= JP a"-8c8[H$e$HLsm˻& <ʆ/ sCCQ61r6WYm@.0yo2)_T5QP ! ;b |Zd PJu D7DM}ow|%IENDB`u1f478_1f3ff.png000066400000000000000000000020601326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoe yqI>HK]t[,KV?-RW;JA Tjc7G=vjYpW9;#<' 9S굅BFECqjdɦQ|IQJV6/8K Dш^9g~4;~^a z϶Rr\Y.ϳd2y2;٦ݩ&l&5]rN9cy<Xs"@U}y!be1[4r  ,!|`za}cϖ}JRKKDҳc~ +_5n|D/JUN`;j?mXX:nzv;"~䭣 Mz90wlZQz0NA`DH4ٟc>޲=Wp#u sSF/N7M3@u<41b>ӋG(?"4vnS@꽉=™Ef';_mv!Zk=YW0Z7~PRo\o ^pk-uE"Rv{'K5¯ cTf333\.''20v*ea2` |,"H:t!GO,Qo>3ir Z+q$ W7m'o*פ!5@Ưn)W1fC]S*N){B5wz2EdC+Fdci0^[欈He?|\HA%D#@XDd.ſ ,NXIENDB`u1f479.png000066400000000000000000000023221326020644600320310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTesvkm چ҂4 7%[ MyPM xĐ(RXj[d-ݞsƇnw -4|?Ls5U&݂ۧaX*Oovx\_^qĽϲ:`,PlB)U=~-J?1=|NǶTUW+""ûķHeuyB\Ӊ~AՄgqi_ȏ@V UgϞ5c#TWWgy^xz2U^ﻉ8mkUunX).^ 7^T*++;$=pE,nȥ9P%6&kI kreP u$ F0'ܱbJ;O('0D+_s\%-}!`$dx`Ȃ0l<<~PLx]a[X _+=ۀr`~:N$R}IENDB`u1f47a.png000066400000000000000000000021701326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d/IDATH}he˳srgk9V4SHؒdL-ID7(K$} $E Vd9ic:1yy1:ݠ⾯oy5䂂o0|TkP."᭷1G"P(4;h+BhV5H P(H&%v%+yr͊ 6*֔/&uzaZSqwh[K@ @O?4w\’%BduRc0n!aS#4lǢ/N @/- @3.+yGt..92˨TLg!fB8 %5Vmx>V,c.M׷,_M@'j-q%sQV7Y5ыo=;)+`nT Z t7n)iY z+;995I/_==(p6_5)|?7֕eXмF4uqu9Y''`;Z&u;V̈́n1@oqoPku; •[RVcKy\;7Eڂߢ/Do`$ HbH|b"!&/jH$bBӖJ;Cqzef9gP:b4q=^9,ddzlNZ0n\.А~w 4MGLwuL.~n?aM,~FR1P R^mCo ݲbX Dn@ZZsVr|v>R66 Uod+\=!aS D}}{{H#A ¬^BCM=)/zA xd1֝T4Er]֕;rrP/4 6yLČ`؂4XZwkm7'l躡^% V4sUeȚxUhV{r??'ҩt"Rwv:0< 0~٬5Йuݕ(^d# Fs{BGQ:W5QN}455T)ǘeѤ$Ғ,D:潖-D|, Zaw)Sfi-ʠr!+nll4 U@J-rp9H(ȢHq_"Zes6iX/=DzƜb:t͖F~uM 5 PEQUch,6bY=o?Pp?5/&>x SDdytG3ctEZVbo.du蚚A}ЙnC#ZƜ[ qE ~v4ZS'cێD ?S= ֻ ,g]&3vIXa;:c&XRFMj2Fӟ؎3@Uؽs+jdpa%@ZbZ+>QE re2w(1+]G$R2wGٝ:Wٶ:kYY3"g A#)B M MΪiW` T.tvu=Rl25W,;"R.#1NjH ee-B|sT:k6MU6(rm{=$g&T\u5M5M3 |m(TWWwLW~IENDB`u1f47c_1f3fc.png000066400000000000000000000023061326020644600330670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d}IDATHoTU?>N;>(G.ѠI|$ h$&.taFJ\0@ !#-)ә)}ig>tjBwu~{JlW=^ua> JaF{"8[\5Qs|: S0we?&.T+>ڱ5)@mS-u|XXR֟~&ņ6n|im旧AnCGRy6 xal,W]?7.*;II#9eŰjh7140(};S/fWܢ7#?[`!' bb=]H-@Ԁ1xnUaf:}ߣ L)Ϩ4sjNC7w2_n囙mŜm!'f_6ҕ~8j)Pٚ,U JzTJD-}}NjZiB(V*p%=d~ PՔұ2[a$yy_?d>CRv9( TȮ_mKA (4ˌ`jtݦmд隻\飍9% MjA)YF6ҊiDX x~+H%s:;i耐&-=f 7o21߸(%3hNlA&޻+6BV'N_xO\᳜"a;NkFF[˘PPxyC7}AKs=[1U(cWϝ̦c$ )jt2M3d)){@/ Re/S8mRx,8h(KM0[892~P 4ڽNZN T*7etM ԃ˵$ZpM5d=* }baqNmA|<A?65A-!dc7Y0t]qr5(Z/ XtɌ^BumOiP#a uwm|D!Ky+=l4}IK){4Mh ?DB8y)d2IJ) v'JAthߨ\u$#IENDB`u1f47c_1f3fd.png000066400000000000000000000023371326020644600330740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lew쁶뺃;t]a)!pApD JHL^1Ft#FMh"3TA0d w`tݘX}}6ɤf\(hƂi" ShxqCYFE~%Q}0|G69Sxc8?>N6x; *pIJtCi&>~a NrP>0Km%ex0ul(DaE_n3̞ s#}-Aa>=XC]s;F& _$@ x,u M[jDfUFO''~!ꇈ A} 3_,5XvukE9V-f MCp7ji䦵Ф[f &q~PZ&E&f ughUCF#޺J3P*Y_\.Zd7ȦoFЙʧ^(?pyf6O%^ݷo;0yPAXl[JJQZctj:]ݝ x=]tZ43GfS6i®8yu\Wk %xK E!+rBǑHI1?]B$`x -CU\* =v$5^z[*A҇CCew1Cԅ O?0Jv]F9sbɁΖk̦r\O*j|lU]>{UUDBҙDQHgy2g#AK& 2ԏź}䩁nu;8n][V㸥èmǮCB4)e;pM lj/Fpݥ\7\,ٴ\o-|+dU,>7[<*:s/.H36$͵}d^{8+>ϛFKUOOOڶ`۝H]%eBCSmCF Fg` T~:X sWA)mmXkjq ]G90~O B7I$ܢu\״P](9v\}1_bxqI).u]Mh4L&mEQ.WW]sa߉IENDB`u1f47c_1f3fe.png000066400000000000000000000023361326020644600330740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTU9sfΔi;2QZ.R4`Ao/&5I/}FѨت2P{BN{9ۇtM\O{_%XqHyZ  Q$WHhOQ1wRed!8?ʃm?,|gmS iZeʒ1|gS*h/=0vB "׃Qnsr|)Lp_+XVԢ:Pji:af|!ʣu4Tӓ=wVRT$KҘNЉFq$L B !#t`Ԇ4uXܱX./>zv43if@$374> gNsV'97{M/>hLPq%uGc d*?9fbdx)rɀ|2!翋G&;q)(L5"BzAhKLFo9f]FN|  e&!Y1P'`H–KNvHoLɡI]t] ISP6Z.TOSNЂ b%ːVgj P0 1%A[k- 6g@EVvSAi0SXk ۧpjAOq}z)5\<)Dig( hru!( h[/MR.n^W{ +Eә 2!PѕѧOfo<h}U.w/zS"9Txv&4)3t8H:΂RT`}νoA2<A4f=00u7 )mHi}7:=žf(L}k5ק9M^FjPJɋ[!۶Ite=|E)M[ԯ7 k0}>S]kV6 !\%wO___qr~&36>~qΡ,ra.,Xeee2Ih}{^ NgDA@W€5sbR-!Ij%~Czk:ѠΫ4FvxM-˺p(<Ó0 UQB>SWQLgsӏzh4zkD",C1F4h AM]y|y{k_$o4,t\ xue:IIYކ ڻ\1A2y~` P'0_\5m>+o[:jR:`GǞyAJ 4]} U67%.Jg[ ?T*{&ff",CňYFƑ-q}6*Jj%&6d;wEz$s;V~ss{p?iSmi^PuF1Z&|u#Z㆝k#tEû M4]gi;~z:xAWyKч囬G抋j5W.*X~;UNs w0l S*2cs~_7FqZ!Zi1*C54PQܐmkQ9mQ̲]E&9Ooc˃N ]^AR*;9WcLu-6ZZUZkbplp{ Ϝ}6>.;WŠb00y+ԙDZvx мB߿;K!7K V@CS3vSWP(~UMz4D!QLҨ/QD`mFC+sˇLg*5?Z>3[H+ٿynvL?(~n#8) 18;&_XFLqomI/ˤÃ'2FM1hh !qe'e7'v!PRݪAq"Zm~.㏦2=*Ѕ5eu6yXrTM6eoiut t91&-ӳ%zڄ5*Skt@:]͢ڏl|BwY< !q6@SעF@' q :lmW[,7_@䙦PKkfib!J)Dz˯{v|8+/QREZB$r(mQ}ş:d^ xVitPjIp]Udjg$†k9i#.R"Op5"/P4QAzk@ST`aUZFITQJ`bq8컔u f0j#|c~!Q53X3`͢U/\SD_x.tUDM#U8׃KnN K W߸"q|f}5# ]QكQT?;֕))±قp>i8{03X-tf;mU` ڒr9 TͯBOίek>00y[gWg0&ޓI&_N({DGnLvݨp2uP<425zzy .9cQ^W-긢OƶΑ9D4wd‹="5ҤE*[C;Z5mIENDB`u1f47f.png000066400000000000000000000016431326020644600321130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dZIDATHMh\U&M365 3 ҈DC`\QpV$ҍ .DJ@B@R"mӴ|X1{Hf&3D_w=;sD`SāҸ)2>,ݕ<&V'G6M |&tZ%Z)@'nn {S'nfN5GlAm1`zH9KK0^y?>;>5 ( Ob0vMფ5vgoyr9cc(*pc7]?@͏[{w/eMNmr@7eqZEZe)(hCu_\Pё(28y^oʵ.!I<)X%{La*ꓬ4WLU φq釵>;dM!˧izx~iΚճ^1 x >g߉FPMW9޵DO[jx2Ù,7X: t=-+;z3`,PIes!.-.'Xt8vg !3{D[n(&y)?A׋uV_p1T5d鬱p~SWZ`݂0 w\0{lP+G*][*Fpnf gx,};TP#7[UKZ?X,9Y# <:/4}yemSCFPZ~#V+vǓBE\[UbЬ*` w]DeFpS2Z~YS/z*IENDB`u1f480.png000066400000000000000000000015661326020644600320320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d-IDATH]h\U}mgHmARJT4ؔtZDF 5%ORIN2͈RlPh@RꋍiQf{;3wzgu{s9x2W딸ZV!qa8ܽF]5ȽنYxxCmi}76 db8g|1 ~Z)>#$0l%ȸGKΫwyeKa:(F@(q9HE*sZ6fpzp{lhr3TA3hh"^x QƹvIŽ)nq n.^=1]N.tJ `ؑ=Ux5z,Ѝ3ĥ}eˏvM >/+5?XFAs#+|~Me3՚1~+r8+0NvM@(8b؏ہU*AU+W8Zڶio2nc m>(r>][?wxK 2ଙI//y&TC|/SI _ZQ|4]v3]zBTzX#eH7F,5}nDwvjy[& 7{u&.tfO,)d3ґ N1~5o'd4!ւまܻ+ D$\:-زDb[$Y m~(sw9/%mڳ!g${"WXpZ͞ko!)IENDB`u1f481.png000066400000000000000000000020171326020644600320230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[h\U}Ιɜdc46CkH`C5\DTBE &XDO >EˋH!`JJh՚M4u&ɜ9l&t:4 ǽ_{+qatc.GE8q껞+YZ(`߯⅓z@Wkӓ s-NԷ)g+"T`Čj?>{q&J[l<]}ZRO\@צb`{w*j˥'鍯O<"ǝZ[r)咹;Waxv2^S4( $ K^{q3/3tt.@\.xBoԮ̥V2NQtRG5@李Q{c˥č شW[{&~JHgpCVSre./!LCPN!ČGGnR]Ȩ9^BT1l@^64³."1O2uDDdOI䴛Ř>F46mY-R \VT[t'L !V${o_Ǫ`M~@'E{^ xS30t $d)0=Z]Xy|Ms"wROҐC$'i4Z! s[gxqБK 78pp ],4`Gv01O1 9|);ză _N9'_E%K,|P&~ٙGpdX 2<׷jAev']pه2/&ek4M(JNضI(\APl:V?i&Ťa)=rO ֵu nW6&IENDB`u1f481_1f3fb.png000066400000000000000000000020521326020644600330030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHLu_swpPD"=tfяYlrjVj-jXYbmZc[Ud3I s|g~ޟG,UXlR/a!D@?ؔ:x,)2e}.Xֽmme ӼH_L4}-Cqd+; <G|>x|)bV%k2YYYH%@W)傤Ңx{o-nÙ 0&% $ L'F/쬡#; oV:vc8 mƤr1i8)'@OlƕH*𯿓C_ aQƒ R9^7Cot: '/_?PzG>z{ZW%)(pS(*#M<i8n¦iln;uXH,&JjۦLG⮚gԱnʤnvx|)bV%k2YYYH%@W)傤Ңx{o-nÙ 0&% $ L'F/쬡#; oV:vc8 mƤr1i8)'@OlƕH*𯿓C_ aQƒ R9^7Cot: '/_?PzG>z{ZW%)(pS(*#M<i8n¦iln;uXH,&JjۦLG⮚gԱnʤnv( ki\SkvzXebhH7Δ gJ j%TVBC5={mQ]Uqu 6yTGG'}|y7_zޮؖ%{j~U!{["@āGį-q ^?oxIgZ{298}(uh>W ޚOmw0zj" @8u0iTIl Cj@^F|llͨr]&lD83 ̛iD$_R\*Dm2EJU&l ,/D1Ƽ2=\!0.IENDB`u1f481_1f3fc.png000066400000000000000000000017711326020644600330130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHO\e3gaf( $Uk,޼4ZMZHBÂč ?h\t&Uc!F .֖( EJ)af`fb`d`ij:y}ys=zx@@\Qαw >_hWIO'o+o844v0ܢ#LJ>#Ͼ07& qt9 wϓkڍ)ݷv*n&.}6(k"* `),llևN IWZG# ͍{QG `+P6iߏ(it?RՁGk8()e  wiQڛH뭠l$Zve r*qF~ iD4[&PZLkBb|竑8|`o|}| ҿ!P$tϑcO!)<>Ԓ=B*%4x^4 |]r]o{ Y^-Z2*4}v kq"JhY^j Z$ښ(:yW=̭M @]]?t:7Bp!N&*4uU>ʝ?7PBM]n¡8Ϝ<,hM.Q!txD0(u久lj V 5AwQ_ gʔ/?~ 5]` &yv| 8XLL3X\heڣo@ u}?k_l)!Kʹ{߉=7ޛg$RMsM҉ qL`ӵVwFlRՀvV%TærR\3IENDB`u1f481_1f3fc_200d_2640.png000066400000000000000000000017711326020644600342130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHO\e3gaf( $Uk,޼4ZMZHBÂč ?h\t&Uc!F .֖( EJ)af`fb`d`ij:y}ys=zx@@\Qαw >_hWIO'o+o844v0ܢ#LJ>#Ͼ07& qt9 wϓkڍ)ݷv*n&.}6(k"* `),llևN IWZG# ͍{QG `+P6iߏ(it?RՁGk8()e  wiQڛH뭠l$Zve r*qF~ iD4[&PZLkBb|竑8|`o|}| ҿ!P$tϑcO!)<>Ԓ=B*%4x^4 |]r]o{ Y^-Z2*4}v kq"JhY^j Z$ښ(:yW=̭M @]]?t:7Bp!N&*4uU>ʝ?7PBM]n¡8Ϝ<,hM.Q!txD0(u久lj V 5AwQ_ gʔ/?~ 5]` &yv| 8XLL3X\heڣo@ u}?k_l)!Kʹ{߉=7ޛg$RMsM҉ qL`ӵVwFlRՀvV%TærR\3IENDB`u1f481_1f3fc_200d_2642.png000066400000000000000000000016401326020644600342100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dWIDATHMh\U7ofLlKZ'i`\X FP T .Dԅ F (VMq R(Di &6&cf20L? dGILsUA^ #GޯRm>) <фVνL{%y2;|k?ؿfyj*$L~/04>8Sം*NFbʹZ`bNbDa"\ُg-#4F[*%X߱ A-IyomX.Sr\nwF>'_(:Hchļ+39<bJR[rp7C-Ĥʻj؉/gِ|Cpv b5]L%넯L>.W_;_!N'ý;sǐpoB_~E|rЯMKT7Qy"_~}u}뮻kRc;`=q^gV=ORAsUGNv6޿Y'мj5h+ W!E ו[;UeYc? ;h@Ksgz"+ƞ:X Kᙝ{fL$@v8!r/p#\| m؉Aa:[2E?AfD"`26dكr /\0*L$(˲] m8zQ$L^1OFBSYeD6tV)Xś(2\n/07d!K!O\IENDB`u1f481_1f3fd.png000066400000000000000000000017701326020644600330130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlU{g;~1q*'QJ Z5JJUa;$ V*6)+E`Ö% $ T$ UE*4C̓N'3sY81ql5s9˓Nv8!_ .SBi_{IGzc\:?>P 죹0:}uvn_'v "߮G!?GS &+^pohDB~ݐJ+_\/6['S懪=H |P$5Y#~.I40:'Ы&RVrN2 MT zEKMcOrc~v({  01zS&_ԑ3E 93ҋ߯W׻gK #&yq`HF#@xa qoS C( D@mP 죹0:}uvn_'v "߮G!?GS &+^pohDB~ݐJ+_\/6['S懪=H |P$5Y#~.I40:'Ы&RVrN2 MT zEKMcOrc~v({  01zS&_ԑ3E 93ҋ߯W׻gK #&yq`HF#@xa qoS C( D@m3 -r Fdzj6b)9Fr"ޓ)^wC#g_O>l|O.Lҍݖ(%vW#(ZR!ʜL/{YP'dr<+TqD=jo@=κOTEQ]OY ǝeD((I_6 }K@_D"/tbGv GLQxh[t]M#".JbΆHj畂m5HbͬWi}[OaT-.UyOK|I086V>Uڛ\vHn2)s=~XŅ}+H:lN[AUqzO]Ok̘@~Cdyhj gΖͯ?t&QWV`Ac=\ifg:Q[AClD7 }<^k6cr-L"NqMMCG7?,[SuACv1S`D˚ijH -  2 hR6ϟIENDB`u1f481_1f3fe.png000066400000000000000000000017321326020644600330120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]k\U>ǙIkb4 hmb-@Mo ҋBw"H)bA!&A@CҦBvLcf2sΙsb&c'$Vp_mzw>Sbq_x*˓SJ%wPQ:ҿ41ѧMWP["mu轋e];o_SRQt,h7^aui :avcj0crEN馍n/v,})^+d8yu8c5pّW: A(Ҋz,dlpHmd z,<ׅPQ:wdl9sZFV7CR7F=\QG:QiDuaolgn#rbj(5JdT~CӘfZ9i)޼=~0=gn4"/J}Dݍ] c(!e4=y ADεp晌WXoX\pq$JaiX+91JPØ doX3T\ޡKvP ,k R(bf%mJ;ng2 |#Pb{o1br0ͥQX+|V%3mdEvٻ( UzKzl,K ?> j ;0$eU; fIc?\oA? s5N@Vr+k%q,AFLOֿdLknJ+0:Q0r=rv:h"uD$._h#d +OgOQuڱu@\RՅ=IENDB`u1f481_1f3fe_200d_2640.png000066400000000000000000000017321326020644600342120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]k\U>ǙIkb4 hmb-@Mo ҋBw"H)bA!&A@CҦBvLcf2sΙsb&c'$Vp_mzw>Sbq_x*˓SJ%wPQ:ҿ41ѧMWP["mu轋e];o_SRQt,h7^aui :avcj0crEN馍n/v,})^+d8yu8c5pّW: A(Ҋz,dlpHmd z,<ׅPQ:wdl9sZFV7CR7F=\QG:QiDuaolgn#rbj(5JdT~CӘfZ9i)޼=~0=gn4"/J}Dݍ] c(!e4=y ADεp晌WXoX\pq$JaiX+91JPØ doX3T\ޡKvP ,k R(bf%mJ;ng2 |#Pb{o1br0ͥQX+|V%3mdEvٻ( UzKzl,K ?> j ;0$eU; fIc?\oA? s5N@Vr+k%q,AFLOֿdLknJ+0:Q0r=rv:h"uD$._h#d +OgOQuڱu@\RՅ=IENDB`u1f481_1f3fe_200d_2642.png000066400000000000000000000016301326020644600342110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dOIDATHKh\e绯L2dIh@H⫭imՅB|En t!B]ݸ%.LDĺPh}؉6ub2ӹTl.|٤[c[p }@WU 'nP2mQ{yzzo_qKٹSLЃ@Ofۿs-ضmS ` /%R{T3Xr7q *T?Mm %p胂i9@݌==tU|NV|H*1) w;{XtS\~k I;1%~Z(~XTQ1nyϞhhH|jWVvCaɧ(HY\T-~ab/p# 8o$>TF@Eje?@G1ro= BVT?3L=?qN)bk9όb \ooqWl٢6@pv2I zfOQ3IԋKn~6 bE:n!ylu>fKnu.zl7x \I=S_|2.?zEZЉk%m̎>y5=36gD*GPg7";rgk,OM>1{PW`(G뮹>BTIe}%|وRA8 k^,;.NN._T\V5/"aUmt Oe)VB hQs3p-DZ/ loIENDB`u1f481_1f3ff.png000066400000000000000000000017121326020644600330110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHo[U{m_?~8c7(UHE ( H,` *;X`Â!RUMZƮIډ}}±c;i|cn 8gY7NKP|>6 )'Frp2Tq}X,ziFq)q..p1;C2'é15 \F,+!ril$G Z? 15m17>LvbH2yn/z>DR*@uǶx|.#b w$W IŢ#f7lR0p;-'F[O+h!R1dg._[Y|O (*>BjJX)gvt376X2N,' `@5Ap Jq6{>1b86pQlcʠW𫤀TɞKVJmmP۲(W^\n吿wB'䍍gC3L:a w6# r`ƐIpd@}ndr I~z5ap hiCK$36oqP~C q ;."(?d3ڟ!Jhoac3S>B| >L˒"|T|5bQJv#ePhHA%Qt#ʳ Z-[=v/.$qmKж_85C]~c6DZIENDB`u1f481_1f3ff_200d_2640.png000066400000000000000000000017121326020644600342110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHo[U{m_?~8c7(UHE ( H,` *;X`Â!RUMZƮIډ}}±c;i|cn 8gY7NKP|>6 )'Frp2Tq}X,ziFq)q..p1;C2'é15 \F,+!ril$G Z? 15m17>LvbH2yn/z>DR*@uǶx|.#b w$W IŢ#f7lR0p;-'F[O+h!R1dg._[Y|O (*>BjJX)gvt376X2N,' `@5Ap Jq6{>1b86pQlcʠW𫤀TɞKVJmmP۲(W^\n吿wB'䍍gC3L:a w6# r`ƐIpd@}ndr I~z5ap hiCK$36oqP~C q ;."(?d3ڟ!Jhoac3S>B| >L˒"|T|5bQJv#ePhHA%Qt#ʳ Z-[=v/.$qmKж_85C]~c6DZIENDB`u1f481_1f3ff_200d_2642.png000066400000000000000000000016401326020644600342130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dWIDATHMh\Uf2˷3Vn\n*(-"EȦ(((HP?@0.D.D26I&qi&3gs==I+g&I=9T4ܯEwӟN~xgʮs}ǘV0Y|ObC&ytU_ReGhWGB[GA_N&;p#"Wc9̏ 5$kD3=29~`qU0b|wg7UH0{ " 䗜<~[s@ch >G90RszYN\,P X 8JȁN[6ُ̞2 71IRlO7`a`mj#5EˋH!`JJh՚M4u&ɜ9l&t:4 ǽ_{+qatc.GE8q껞+YZ(`߯⅓z@Wkӓ s-NԷ)g+"T`Čj?>{q&J[l<]}ZRO\@צb`{w*j˥'鍯O<"ǝZ[r)咹;Waxv2^S4( $ K^{q3/3tt.@\.xBoԮ̥V2NQtRG5@李Q{c˥č شW[{&~JHgpCVSre./!LCPN!ČGGnR]Ȩ9^BT1l@^64³."1O2uDDdOI䴛Ř>F46mY-R \VT[t'L !V${o_Ǫ`M~@'E{^ xS30t $d)0=Z]Xy|Ms"wROҐC$'i4Z! s[gxqБK 78pp ],4`Gv01O1 9|);ză _N9'_E%K,|P&~ٙGpdX 2<׷jAev']pه2/&ek4M(JNضI(\APl:V?i&Ťa)=rO ֵu nW6&IENDB`u1f481_200d_2642.png000066400000000000000000000016561326020644600332350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|deIDATHMhe;3&ml0YM m#4jiZLVZJK^DI AD< E<H% B=4[_oygx(O|AP1eο$@j9kXHQ s@#*JuQT Xr& Ū+)Dj~,un8ctMp]6Z/﯊LLk3;d3~l9O'xY stuN/w_U":c45`x2045wL~D}HB"BDv8Ql@gշ6PDtW#e=@P(Fd?hLV#d/Wl@k6),N!oz{Z!4ez_mQYD?Cm=D#[ l(<Jޚꚾ\Z g* "ْض >F^ ͱ0I ?yDAnoJyX \"ryXVc-d9v6r~u}^@m1 <4qgW[ }P6yyraAU*ȝɠBh+~vJlND>lDW ۉ .6Vci&]{V8xI ᪛4+u*+le,҅kw,Ӣ5et6HU`E*rIENDB`u1f482.png000066400000000000000000000014751326020644600320330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoTU?y}(8(6ZĄFR돦16 ?qDLpabjZm , jZ`μ_q28u[xv{{;^M9'''$9 L"j\><̝܀ URDv=99;;;k!c5M_Fq!`,8"r4U͌ P 2*y%6< n͘J@ y6bffIqC*o%?僯k,Tgiel{yuUb=;_jDǑ4"#|O?p-ŕGF,r'^_Hܷ{^}n% N=v^ r?,9vEFux~[|`jj?㗁97fUY7:R >&PZX??'I2~W'GQtx `]D`:5R' TmAD^gkp 7d&h?}%㭄瓈0gz^TRygG>bLw@.YxUX,/1qOM}Ų~f=Z8 "".\.c| 0R2y{cE`$443s1L%l"Ezq]*&NP}P糩D8gVl ɱvs9Mwa,Bpv^aZw'IG;mOQTT[32@<aPթ,-5P?qSIENDB`u1f482_1f3fb_200d_2640.png000066400000000000000000000015061326020644600342070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlUo^NT!q LDr)Q[+U%$P9rN8U΁+q(q0KN-TM.k+Թ7̼y),Þ WJD~&JR36`aaaADPJ PR-a҃eRSr_012"VV(fvHdL?`4 GysRF#$(ˀ~0( eZBBkv>ӻw0+kUwq/ @Dno "5z%Nyu11FJv;VOKtR\VdZ{_'_]bjWm۴X$/)m3QZ}/}nr˄p`o/^ء9ݪ+?rf+M8[`ӜZJTRs| ~7+4`qq1t㼛z֚1^L?~zA=1_<+-//o<9du?xfvΙ:E€05h pH}s!2('S<ܖCiuw\E6Nz܌糧E2oh0 1' mz Pv:]Y 7Za4͐<0 DD0,cz( jNv(bLw@.YxUX,/1qOM}Ų~f=Z8 "".\.c| 0R2y{cE`$443s1L%l"Ezq]*&NP}P糩D8gVl ɱvs9Mwa,Bpv^aZw'IG;mOQTT[32@<aPթ,-5P?qSIENDB`u1f482_1f3fc.png000066400000000000000000000015011326020644600330030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkTw?w I&Ll&#>P&]!ih Et"tҵ?H+imݴ i5M4Qf4b⤓Ls~s~?/ier]p8&"1Usfz[D-3Y?0666` ho%U333϶L1BqUCpqDxU ZTQIGPwp3M_1F*@(+fVJl#*$5{ Xx4Ozoz+D'gOa>dX[u}װ1nN_.1UVhJՇ 6jHecDZMs3I_X,^ jyTo<_ w~dŨyo2>Ny.?st_7F<o?uR&dV aKu`L&n``5/T]TCuWM?Z~ PHy>S X`˒XCcD(h<}(oz.oU0XO$&;n.U:mb;|6;y]AX}}xK++.X"Zi= mwtv64Lyrn6&n2@<AP[(W!FJ,+[ 6e7_XIENDB`u1f482_1f3fc_200d_2640.png000066400000000000000000000014531326020644600342110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMoG]֬eomY"BI8)$pVI,+8$H1?!p䄄\ >FA(@ > eNLqYfv9зzk#ij 6H@U+$p### BD$СȂf`1!m$("X0q1?&hR՟b$ $@D6$jlN=@{RI@kN'$w) K r$iS$4)ס Z(+Ooݿ)?Zxz/R| nҒ#ZnmГ?G#X@P|Ao2e=5w]T}(˗¼Ƽ4 f_ЬU/MףkYS7E0qzzq NOW-8D"e۷gc+8d@)0"8RhԖ+P1 T]EU'%-Lu)OK 8z AAIENDB`u1f482_1f3fc_200d_2642.png000066400000000000000000000015011326020644600342050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkTw?w I&Ll&#>P&]!ih Et"tҵ?H+imݴ i5M4Qf4b⤓Ls~s~?/ier]p8&"1Usfz[D-3Y?0666` ho%U333϶L1BqUCpqDxU ZTQIGPwp3M_1F*@(+fVJl#*$5{ Xx4Ozoz+D'gOa>dX[u}װ1nN_.1UVhJՇ 6jHecDZMs3I_X,^ jyTo<_ w~dŨyo2>Ny.?st_7F<o?uR&dV aKu`L&n``5/T]TCuWM?Z~ PHy>S X`˒XCcD(h<}(oz.oU0XO$&;n.U:mb;|6;y]AX}}xK++.X"Zi= mwtv64Lyrn6&n2@<AP[(W!FJ,+[ 6e7_XIENDB`u1f482_1f3fd.png000066400000000000000000000014611326020644600330110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoU?v؁ 9!(T" r(Q#B#$ DN@J-6ĕv_o8uqؘw{;oٙ^2θ2 `ADJ׀KBan,///eȁ][[؀yc 2N6Ƙ7sxz>S<'T5(L^h@(Cr2P=>ap( cg|r\͕yN l)"M4fkݹtʟ!($:6@U?x^>iTLuHRKGT.a/dϲ2K{;ADI7wy]^!ch=\И*鶟~YZc[7/RLJw?Ņy#V9Lϟ{'Gig/_X~{s2>zso}yajգ(zxzEG1̬7Q qm_AJMu'Rw_8nollth0 ?tE@݈+дq#29_+`UP^HbN!bX+S0nZ˙8bRo E~p 1|胗OVɮ N3M59ss$[Ho~ػի{MӚ&@`-FН$UEz**O ƔMFڡfOf\QL;? @u$`OHIENDB`u1f482_1f3fd_200d_2640.png000066400000000000000000000014361326020644600342130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH?lW?;۱`; QZG( h:0!cNTS%V@ %j`#Jh+;v||`8[J{}?w>q)k7e`A)x }z$"Rc3TjW)uiuuj߲=ɵu贷_e(שZ#f@)u: I Y7egQ11^Q?tK֊Cy=fEWy yP!NHD "7OMz2 3X ~a s$7ӴR[ zǪy7TJIENDB`u1f482_1f3fd_200d_2642.png000066400000000000000000000014611326020644600342130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoU?v؁ 9!(T" r(Q#B#$ DN@J-6ĕv_o8uqؘw{;oٙ^2θ2 `ADJ׀KBan,///eȁ][[؀yc 2N6Ƙ7sxz>S<'T5(L^h@(Cr2P=>ap( cg|r\͕yN l)"M4fkݹtʟ!($:6@U?x^>iTLuHRKGT.a/dϲ2K{;ADI7wy]^!ch=\И*鶟~YZc[7/RLJw?Ņy#V9Lϟ{'Gig/_X~{s2>zso}yajգ(zxzEG1̬7Q qm_AJMu'Rw_8nollth0 ?tE@݈+дq#29_+`UP^HbN!bX+S0nZ˙8bRo E~p 1|胗OVɮ N3M59ss$[Ho~ػի{MӚ&@`-FН$UEz**O ƔMFڡfOf\QL;? @u$`OHIENDB`u1f482_1f3fe.png000066400000000000000000000014501326020644600330100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoU?||c`  D X-" 2m(D!!RhMY"M G(AAL9vos-xyμa4Ms"2 3p% K€EUFDHKDNj XXX8j(jkkk5Ƙ TTL>cE/j~p~ewZe zpJ@ =Sh (37\*p_Ya2lwR&F ;ekf1Vx3TW֝+N:48vqZqF $ïrKt?gPv3`|X!9a Ln7#M~n?*{_~/] Ovan&BG*8W|^~/j?V?x[ C#-yo_Zp0D[^z?oU2fzn*#;!(LW,1C;oio=I\Nl4_6hNCDewp Xr"K9&<C-h0a6c|F B:O1|蓷ƶ.{jrsG33pz{ a,^ow{oollfp:+M,@{vϝd*yJʋfS2@08vcbik4+w񓒨D&$-IENDB`u1f482_1f3fe_200d_2640.png000066400000000000000000000014151326020644600342110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkgcO|Hg+1 vq6(GI?!ҺMpVD:pFECllN_;)|>眽Ct{杙wޱysk Rj@DR%ۻʀ-:37CJ[{{{yAkRe_k $"_jZAԕ*D4f`*8[ZEy<)** ~mKUAe3 `(=L!Y "j]R~"tFXLE"rߜ[krGƚWC? jK_H;eZ%{ oVײR7XH2O յ4M" ?pxx#ލY <3iHhHisze+|;5@ d4*x< 1:Ar4<ҋ ~`LwvvV, (Lo=sb,kZ+P(F34p$ ?~=88֜jr?7FEF l*w k Ƃ{v)Fԥ(^PfAk֓.!¯Am@SsD?}rerY0Ec޿9S{ ^)?>씞Vؔ"7h0jz%WǀB'ű[/u`"'jO o8GnO/<7%SqIENDB`u1f482_1f3fe_200d_2642.png000066400000000000000000000014501326020644600342120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoU?||c`  D X-" 2m(D!!RhMY"M G(AAL9vos-xyμa4Ms"2 3p% K€EUFDHKDNj XXX8j(jkkk5Ƙ TTL>cE/j~p~ewZe zpJ@ =Sh (37\*p_Ya2lwR&F ;ekf1Vx3TW֝+N:48vqZqF $ïrKt?gPv3`|X!9a Ln7#M~n?*{_~/] Ovan&BG*8W|^~/j?V?x[ C#-yo_Zp0D[^z?oU2fzn*#;!(LW,1C;oio=I\Nl4_6hNCDewp Xr"K9&<C-h0a6c|F B:O1|蓷ƶ.{jrsG33pz{ a,^ow{oollfp:+M,@{vϝd*yJʋfS2@08vcbik4+w񓒨D&$-IENDB`u1f482_1f3ff.png000066400000000000000000000014251326020644600330130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH;lIyYHHցx8FBuI"\ "!D!!A`  x [;33Eš l~I?T9w&"yU __j2&'''U ݡ9433swՀQc?@Wͳ;Ljc eU=BxqDd{UMY >+X0#lUJ't| .NL/ f_*f ^@ Q31ypR$! JV:ׁ>OJMKU4>TöH9Úι9łǫfLE8 8w`.b*<a&tk kJZ1E+whJ*gmYz PTTHltJKxo~'L'"'\>v~=(Iqnؐclm" l(z65Cm $ FN22v8E@Selm fz IjO-Zɷ:GM(O/%Qg qIENDB`u1f482_1f3ff_200d_2640.png000066400000000000000000000014121326020644600342070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=oWsć!2¡PKRPE eR*iQ5-E))lVI6$ﮙdawfΜ9;s=Jnll<!"MUMιo,Pd "w>1`mmm;O;;;06|QCw'jM)UCYX PՉ53u(;e ~:WGYgLxujԚX!#|-9۴mZH *U}x/Rqs\- VBˁo`oyxb@E_HAMJsM<' 1O7),AU&iM,/h5+WQ\>R&oG1iQN'> Qgo@0ԩ8*Uzf16,nѽv9>PᠨVB& f~kc̯yonj18URYRUe9y`t(9)}1Xqh^Q=W/^Z^HyN3cDaɓ&Np,,@TUʹZ؛**׎7`EU5RۏJy;4){uR)qf%c B ĞIENDB`u1f482_1f3ff_200d_2642.png000066400000000000000000000014251326020644600342150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH;lIyYHHցx8FBuI"\ "!D!!A`  x [;33Eš l~I?T9w&"yU __j2&'''U ݡ9433swՀQc?@Wͳ;Ljc eU=BxqDd{UMY >+X0#lUJ't| .NL/ f_*f ^@ Q31ypR$! JV:ׁ>OJMKU4>TöH9Úι9łǫfLE8 8w`.b*<a&tk kJZ1E+whJ*gmYz PTTHltJKxo~'L'"'\>v~=(Iqnؐclm" l(z65Cm $ FN22v8E@Selm fz IjO-Zɷ:GM(O/%Qg qIENDB`u1f482_200d_2640.png000066400000000000000000000014531326020644600332270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMh\ULHFL'FAZSR RJWBW.ĭ+ P")+4ǼH:7Cw9w6\XXɲs7 ~iiaa^<S˫McnAYYY6|Z@`HU?0[@9ZZQ/QޛZ@~jCEAe  ~6<fm9\~/FWbn߭`U7 PՋoV1Op ɄVH5|{Awȭ4ۢv}Vss~u'*%G8!}t=8_vviݭZZ:‰C;\;ooIf(l+qKD@!]<@s>M`0l*ﶍ0w0z*X\\Mq_:fb>")) TҍQn*!l߲,[Z[[{T琓$8 RVI<:aYM1+r@髢d%a~/z?4cDA_f<=-tFMοnט;xZp"QN|~?SrMmh;A3CCxo**{nS6@;EuD1S^42fw;N?kjOF IENDB`u1f482_200d_2642.png000066400000000000000000000014751326020644600332350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoTU?y}(8(6ZĄFR돦16 ?qDLpabjZm , jZ`μ_q28u[xv{{;^M9'''$9 L"j\><̝܀ URDv=99;;;k!c5M_Fq!`,8"r4U͌ P 2*y%6< n͘J@ y6bffIqC*o%?僯k,Tgiel{yuUb=;_jDǑ4"#|O?p-ŕGF,r'^_Hܷ{^}n% N=v^ r?,9vEFux~[|`jj?㗁97fUY7:R >&PZX??'I2~W'GQtx `]D`:5R' TmAD^gkp 7d&h?}%㭄瓈0gz^TRygG>G%Fǭ%Xu&ZB#a&y@,kݢ/hfPI^7̃㼲o۱Tc8H⍕, ؔd3&U-򼜩(=u6@ԇeLmOƽSf.2+,ƙMN$|l,\Rܵp?'9@h8v7eU0*`0Z譻",Yi=X տ1h7 oZآݵ(93?~A+qKdz7JQoФq{r筠Jhh)G1e jG+UkDrit& ] $I|Lgw*YԒmk5Td}kU6@ aQ]=bإLy}ɀbE -BMQH߮'K^Dw6TT)aet^i8HȝԛGcnqIENDB`u1f483_1f3fb.png000066400000000000000000000017351326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMLU}31 PВ.JKqBÔ*R%&(I )46ŸDH#1F&bEZ1ZB"S A)03w R`fgyߜ{9D"Xf)a(<So7 US Wdq{z/ټXfyG=5`56ce>V 4fRjx4=o7Q!!\kPn{v{>;c`EIENDB`u1f483_1f3fc.png000066400000000000000000000017061326020644600330130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d}IDATHmhe9g;{avtΔ>' i%!>Ԉ fև`D$6\R9gurvvs}9wٔu]\HxY㳯A53`Ywp+߸차MxFl^3B6=Xƍͩ{̯8b~>'cxEH:O?t ٺ_4OXD)Q*]l8,P硵MUN@k0c,cڀGvICUmCxɡ/iX9g:HT^m](жnIk߷ybI__5:&c]Y.sD%bs%4c9ߒ:.# INe=(74n3ՀSnd.hVi m b6V.05=ߟg8xa׈avcc8<׺OOeg`1>a4)$la"E`W¥MŦ%cNF'I(|լc8.ĵxf߉CE)Og25VX:iidT> LF@6譬jsW/Btm"H_zkPm !`[D6tm{~!@;beJE[)s- YBIENDB`u1f483_1f3fd.png000066400000000000000000000017261326020644600330160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmHe<m6lJ$V`UH} Ɗ>D,ڗ *jTь`0*i59-79yy*8zCRn DEk䩸΁S3/^٩T)e&+-eFm-1,Ԏ|ܑ VG<%Tl(/! %&MgVp[lEFݞ=ڔ@ϓf !Aii|nY:B2-ܶFw$ ; 5qӀ}r޲J63Hߧ_+OroPs!*),"CǫJg< Otw/SN‡ *,wi{Q*Zt1K1_p90&1TnY~M˾q/t׆i=1Kz{9^0YFbmaڗpW~&Α08.][rQcMj蹮eP'{Iąr.a%@ߤDѕ[B Cj%rtAә_,D#Fp+\w쓈m7537?h:1SLW(X`o[)o_E$hi<1a8DH2jEPY\`0hHڢ*\D9l 3oވ9(ޗh2y-:VLeoTl/冻50bǝ$+EU%LNCyk $7w:-{*3ryꚅi`27o6Wv-5\]7w:OjIENDB`u1f483_1f3fe.png000066400000000000000000000016751326020644600330220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dtIDATHŖ[h\U\:2c䢔&)BҤ%%-UPBI( PШ -R4Jmi03i{2s!D4'z<^9V{SS=jc]l)s[-OcK˒K'}YG@<%4DXJyIil#fMoJ`k᳔bHyl+l_H8vcoZXh_S'H?Gp9([K@܀wT=SaoQ&JdZ^~R?;hr&2v[<6xQ÷Lm|q-U;[N 9ෳe)N&Sԫ%BXkh9\pme M>0\u~߇$s\`bp SiNM7.,ު7̹u(S} W7$ptKO?e'Cfu鑫dszRg&wm鳴zv 9@A`N8 9X] a+@2-[VAОu;lj^V^]9xGt-<0m 0SShc)k>fpǘiİU+F}Vnon:hH d5 g#L7158y\Fd8m t6 ˸RZ'&3J#ɖ'xY*ȸ)V@#1 E q͸/|.yBm RX#Y$fބL8G _kR =8^C>!az_Vm ܛҵm#/?ӈzIIENDB`u1f483_1f3ff.png000066400000000000000000000016711326020644600330170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dpIDATHŖML\Uy3֐+oqxV0d &:MbNCk\B*?pTӫ$Jǚ z-SN=Id|s/~{xͅ'LJĝM욈pbgՌW젽+0T}}tm܀FƯڪ VMC>X|cT۸O_4~`d=Fˢ`C[ z9xX7Ek~^0LvC\\O~MygA4[T7󯐘֋zN:&si٬،zz9@3N:X~YKde9(4[s `5`˿9\lnf>PKFF)l;8A.J.ϹT)1ՈaU sv{ں/_bhOkf]a24mW & 9}r l8a ؕ3?'|(O/IENDB`u1f484.png000066400000000000000000000015431326020644600320310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]lLQ׾NuJ"CE4A!/DxIHDBiD<"i#2STFҠNzs=CͨiFf>gC5Y\ & ºs-[2f}6a}k [;[}N2hNz(rp#sI8?͝7 3r1jTGyf":@VF_xeMզdQZ^pvk+W8[f ?x)pjXiW jm@43*imR\i"d],x%A;f>*blߒl=/cӫ}7!+g ڏ(ZBM{M3'w[,l^ʘ 37Oӫpe-|_ pbUTܮ3]s̸|::M$܀-Ov@f %bfa hV׃CR^(~J.XP= ҡb٧' ek$_J*Da`j$jJ @c37qo]ٲHɁ: (6fCI\B"gwyg+ScfxmPis' < tncJ U6PIG` WIENDB`u1f485.png000066400000000000000000000016701326020644600320330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|doIDATH_LSwǿ{(TB f@c$%䲘B4Y &f̲=,c=qV j'X=2 ֆ9?d|bO5q6b Hs(tIw>x苼frQ(AbdøP:K `6#22BDK+ux=Z|4,R".+W5GY + t8D6O?@&_Reꕲϻ;M:33᧨CH`:2)ە^KwWT/hasl{w"63"g]6V1q|' vwz'N7._S~z_ys`Wi]FKB:[A`j"+>y& :qd}rdԡhyXkMKK GՉu>W='gLvͪ]I2nvߔ-rݛs_2 =OtpVftX>'4˖S f| ! dk'Yo˒Yq qm׾T FZbĕ*6/5[RNX'8ΙVǞ7cr: ?s#|sN*hf׬旗>6>m<4@~RF`|j*"irj{LG%6}qڒBbToyCl鵛vW49=9,`ggyvTտzk؛ D#kڭo%+8f:m5OFS__ȫe_TNc z&o yeT;=U;vKmqD UfNOOOooNkk]wUaW6w`Wx5@x+<6}V]!H Sg58v5R%-3˚x} PwRڻ;9ŮMR܍{[xHM8DVbQVyW,޹#_Ǎѫއ/ҕOlOeS+<*4\!81d6[ `xק__-UZ"ޜƹc}= ؾoUHopRLV"E̞:#s ]Af"@餳 v((h3pH?:t75l5dfb~2V1@Z^EϹ'c$F#Jx.r@)pƎͽ)`0>;gy7({*S`Zy"jVkğ+GhAIENDB`u1f485_1f3fc.png000066400000000000000000000016561326020644600330210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|deIDATH_lUǿ_ TYAB%H 6Uaaj/HAbd$F % 3Ąq͘FMFRV{fmhy?0GiExB6he40H .;J~PYLdX)2v39b%gLi#":&qڊGSf{4Ux83)bH'ZXh=+1 x"V !0~bt]Yv5sw^Iah\&P'#7oVpo\~^/.8YYGD@ R._„ʐ?7EP#0Xw~*bGu7+V3uL!H}j[=LtN4K {l s~sω֛%ɊG%c  Vp\#{++zo8Rܚ6F+-&;{}PX`o[pTgsP'/v@zn/bEpD%4_b e3KIENDB`u1f485_1f3fd.png000066400000000000000000000016711326020644600330170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dpIDATHLe_s?~<@Virck*PekVQ-ʹnVPhAܤgdK#)#y>?G@|\3ip |BJ/:ɧwvm>csJ (v(E-MoDTQԹHT(8 ΆUe"=jʁ'^IvȱS}?䮕 uFU7>=E#Wls9M })*`R)=LiQ׉M{L/-\{@eB纺ڦVeb9nAVΡE֬O^|R!GwΥ%k+sW97F%;ZJ׊b%̘zWm~3Yc&r5|}ωhc(KT%;}E;q{;i#N+s_n;ҩd0jBALS5WZψ?:pU_DhӳOu4ʑ Mdp7i"I[0Kp QQK[1͌3v6/ N&~p=du//{8?+?IzgM9ƃǥr/-!baϳiC3чFIpg8/3`((6"7yy "CI[RbzHe7IF/.Ow[V)p{ 7 @[`(i WU` nQԉq2l*:]퉖HW < /5@ vsed+cuoGO.Yy6%Ɩގ)Rr^R {X^pmeV^8^J# 5E ٪2q;ߩ uԅ_'Jm@q ͵~5h+4\Nw>|7}WOB Ţד*]- aș o|{m@l[~g@g ny Qbf!0_ tch-@F|Rv;V|;@choLG90t]x7+{vJL[ѮY?if'mkPl 6S4+Z;7}|d^%ؽd[ymz8J`iSsKu3hQ7+cK.K3[=~U  }=gr3g@D@[TEX"֝KOkD$|4d՜O>l~c|&k:e7Ak2\_*Yf7ߜbfPa Z__R-/l4_?{pI'!IENDB`u1f485_1f3ff.png000066400000000000000000000016721326020644600330220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dqIDATHoLU?y\IqXbQP [SZm^EKV r?ml\W6{&9jnHtF{F:=o; dcv@-Y k2b8Q S,[׭~nWזc~;H)(r5)]wܗ_v_M PJZ )>]"/",ϪxNYshoj6nA(xM[YPugW3K.ToPzeA.=L93:;RSw\e Y߷ѧUj`` 8oQ5(ǞRJ:B@n 6T\l96]KҼ&kJu 858<7S{A{?4VOMcѡ'B2ψ҆@l^NB(G^\X_oU,2$2&ydK';w. pë"g %:74rSe#s{q̺Z4u@Jj5[y|#=h93wNDNL)"&3%~=;cS:1(/.롙kլƞ[Kttt؉ۡ!{D괤?|}]ly}'RtnM$D.3j(`.T ;W&Cy X6-4zIENDB`u1f486.png000066400000000000000000000017451326020644600320370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMh\UHg&h2)jc!$jADh BQT]tƈMJmkEP "*ֶIG3m&̼d{]kf^Ƴz{Mlvh_}(Q!o/?Җ 'Q-+Aj-5{G)Gš;YW5>i=#Hoe8C낽pнY!LR_ XV*T_nrn疉kl|jGj]Ѧ2PĚd _+`p,x R7'4,;v<ǣ+4873Vubd mx-[p]Jiû+zz"OW"\| Gi oyFCruw)v>`ӹ@:ϛܛ5|ME_p[~j=*?!0&UclSw<3Z kZk 3bP;Ra*{@EE%K^QJB)AKlRdX,}Z o VUM+0!jR[j*+Bzd-Q;ftd !~k &%fs['*,hӥFQK pNNmho-奅|>VZ&i}5&M|tO< _#uܴ!4r&?Lt?bS]{;3A>)[ή.%?i' /i>lI?t7m'fqpK;7@ L|9N֖ :o zsh 1,ɍn%'VrYBi|aR! 01~GXCpF =D^t;"aDRJe ,z-H.㗸ǯ꥽{B\j"J,Fj;1|M%N]6!Fl;D$Sy5"ҟQ1,z$tUi3  /2ylxջIENDB`u1f486_1f3fb_200d_2640.png000066400000000000000000000020201326020644600342030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTU}v:2!j/b/i&%Xi!4(بQDHkZk 3bP;Ra*{@EE%K^QJB)AKlRdX,}Z o VUM+0!jR[j*+Bzd-Q;ftd !~k &%fs['*,hӥFQK pNNmho-奅|>VZ&i}5&M|tO< _#uܴ!4r&?Lt?bS]{;3A>)[ή.%?i' /i>lI?t7m'fqpK;7@ L|9N֖ :o zsh 1,ɍn%'VrYBi|aR! 01~GXCpF =D^t;"aDRJe ,z-H.㗸ǯ꥽{B\j"J,Fj;1|M%N]6!Fl;D$Sy5"ҟQ1,z$tUi3  /2ylxջIENDB`u1f486_1f3fb_200d_2642.png000066400000000000000000000017071326020644600342200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d~IDATH[lTUur:mI 6!h1)B:.U֘T#1 14!1ry_4DlP|iCQMMԴ[ :3,za:μv9TbA {VIيRKdwD@mg;;;#}?\v#w'4#`)9'NL`/7b=wQ^X>0~VUȜѴT^yJk^W[͝_Odɮ׶,60xf}-/=öI'Pcf1`BӅv>hlw|P_ˆw;Qon>!x=&+S,0f~ښ ?Y.gXFC[0&6nuRY@?i;uVk$d=* pRo@+~`'a }8$ъǚ c%""QkTNm7,~! W bf~^ZOK6'3 F#`ǦF-vT68>Ke^T8;yN5,)w/;r\A^TJ˷W;ib{Fzp{n6 ~sP |hzcD]|r dltŃ.]|ʈ\:2nz˒lE%'V=2p8^q@ m @8C~ :y-:80'h hJY(}'I{ 'Z_;/b_6,HȗoS(&WXBY+&'1!m\Ԥ?IyP a|F \6n1n1h HW~P$*گ:.0U_;dbD juit%b _zY`s#{H8e+,-U.7ϭ4&W\w6V #ȃZLajbF&29~qFkDVTU^.SjNaJ[2 xM6OM:mjLmJLVa 9`z&d\~#zoEvoYe-COvߟv,9:a#M  㕩;XWPRԍLMP3_10@zek?~@g:}7x2KS ,6?MO?Gct]#6==O\I 7Kx-PQT+!ϖ# xt&b!/ƤljSӿ"1TucXA{ȼnxqM G﷪i_ uz4-IENDB`u1f486_1f3fc_200d_2640.png000066400000000000000000000017021326020644600342120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dyIDATH;lE#ď16@%(A < DP(Q D~p/8 g6熩vgfٝEL; >;r\A^TJ˷W;ib{Fzp{n6 ~sP |hzcD]|r dltŃ.]|ʈ\:2nz˒lE%'V=2p8^q@ m @8C~ :y-:80'h hJY(}'I{ 'Z_;/b_6,HȗoS(&WXBY+&'1!m\Ԥ?IyP a|F \6n1n1h HW~P$*گ:.0U_;dbD juit%b _zY`s#{H8e+,-U.7ϭ4&W\w6V #ȃZLajbF&29~qFkDVTU^.SjNaJ[2 xM6OM:mjLmJLVa 9`z&d\~#zoEvoYe-COvߟv,9:a#M  㕩;XWPRԍLMP3_10@zek?~@g:}7x2KS ,6?MO?Gct]#6==O\I 7Kx-PQT+!ϖ# xt&b!/ƤljSӿ"1TucXA{ȼnxqM G﷪i_ uz4-IENDB`u1f486_1f3fc_200d_2642.png000066400000000000000000000016431326020644600342200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dZIDATHMhUs/tZ$f8iS1Q ME-.BAA) Ѝ(.XERmP[նѴdۤ4L:{\Lg23Aw{w)N|%fX~n~徟>jUXH̕cN$^`s[K)=l~];5t3Sp}T|TUN[@h: ,G>M/Ȫ43] m=W/y `:\=Up}/~^OsS9EQ޹w n/J"rIMvN4츯(n}&*Lz֔+ǻ?~SV>d;CPxM6/SiN^/r OmY&n +H˅8ŢfiIENDB`u1f486_1f3fd.png000066400000000000000000000017251326020644600330200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMLe,,-K-mZ*%CFzx&=饉ƐhIăވ˲03;3vws&{~o~| - y>S(75e};yUIh}fu}o'.Ŗ5D5JÐ1{獉+fDej>fiE䶆oj>\ɏ!ot#l> Z5dVOMd lap+hki|40g\ dJiu loW! Lp*:3LϦOQrdCm;5牮VFN߾'zl͖6XV#]m>E&N'kfv!-)6.PlǏ=6@_;ftR04MAilϮ YkY~zh2|Vr;1sYO/o`6FiK5@DS87`xPL3PJ&۰ ,ŲPzn[jM`%]T/0 Ԧ8FrYx"i0=BW~cgVvcfz6Չ "Je*wZ={Xg/ U}P +.:h6 ./dѺ6Uk>/4h7I{z$$A/l/b߻a.bBe!w7$=zwό{Ѱv(e _$-+I/: ;,W6u@n/MŚ*5k*>}%7 `y^L;*C3deU v5} \@IENDB`u1f486_1f3fd_200d_2640.png000066400000000000000000000017251326020644600342200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMLe,,-K-mZ*%CFzx&=饉ƐhIăވ˲03;3vws&{~o~| - y>S(75e};yUIh}fu}o'.Ŗ5D5JÐ1{獉+fDej>fiE䶆oj>\ɏ!ot#l> Z5dVOMd lap+hki|40g\ dJiu loW! Lp*:3LϦOQrdCm;5牮VFN߾'zl͖6XV#]m>E&N'kfv!-)6.PlǏ=6@_;ftR04MAilϮ YkY~zh2|Vr;1sYO/o`6FiK5@DS87`xPL3PJ&۰ ,ŲPzn[jM`%]T/0 Ԧ8FrYx"i0=BW~cgVvcfz6Չ "Je*wZ={Xg/ U}P +.:h6 ./dѺ6Uk>/4h7I{z$$A/l/b߻a.bBe!w7$=zwό{Ѱv(e _$-+I/: ;,W6u@n/MŚ*5k*>}%7 `y^L;*C3deU v5} \@IENDB`u1f486_1f3fd_200d_2642.png000066400000000000000000000016621326020644600342220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|diIDATHKLU~3WTaaF6`M ib5c؍Fj\ij .ZF@>bU:n[k[)~Gcb`G:p]wT8nh"#ה_t`hBحzG<132:GOsq<#uH8ue|*>z=/vUxʘ4gVu#=yw}=h9jpp8o9xVuCi+X>ΦbFx5y1zh̦u鷟z /+.*z7E g_;\<8~}\W>5@Aw#T% jtWRR~4|I;\Jkρw'_vr\L).NM\yMB%H٧8ڨTS!+ɑnr= SE{@=b gPR5~`0g+nr,΍9xS5d_ c;}X#ߍxy8\)dnr^I1PL1M?i.d8}ԣ׎Z$,#*?6:=+`?ë.Åbkjt}q]8Q~]obcl(9x q *d>m܌цCY(kYhR@-R @0C!NsG F@)6RO% jtWRR~4|I;\Jkρw'_vr\L).NM\yMB%H٧8ڨTS!+ɑnr= SE{@=b gPR5~`0g+nr,΍9xS5d_ c;}X#ߍxy8\)dnr^I1PL1M?i.d8}ԣ׎Z$,#*?6:=+`?ë.Åbkjt}q]8Q~]obcl(9x q *d>m܌цCY(kYhR@-R @0C!NsG F@)6RONOb wcP#1_ ^9/PUs ݝm/jPa }g~[jQހkn>sklu>y`-#zvf*S)+s+R=[C %KO#V!^Zpgcaݣju_]``e5on&m*ԇ@Vp!hXN1Mc+do¼]Gt['aPd7.H( IseXF#As 8{XI^-`#9KP {31񳘹U8w<׹Iϳ:׏֩;޽i@6F&':xMɟ"qߒHAF~#)0mAJ26z17w{>-&ThfAKd7wD.(g[q#KOƑie:pF?Cڜ9ڎpyfߛzL XF/]YKajjGGqsKxi{TZIJ KI ?o82 tzmm)7=ncSg!GTlcLAsi딳9ZI<2IyIENDB`u1f486_1f3ff.png000066400000000000000000000016621326020644600330220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|diIDATHo[U?ljcM꺉_()F*@H])j@aB,:K%$B3ԍ0%jI˿$vC,{|ιIů~xS2wvknn.c5x !k0~X~y fs;p?R|Hszrmm`G2Rz*-A^SIL{@ 2-|ANݖ@֞j2D7 IͰOGi*s J ҷE˥@@ NiR >%&lɱ'gH ׻(<ǴlD8?>X6+m֫ ń t-ضSM7C'iƋdS O[[Mxc>FifO(D7ΐIRyF%_.qv4P$dJ$G u^X~B>bdx͝&IߑTZEMky^eڵ Xx!x!:Pg)峝 q*vFeFwJ"QPZ8%-QZ{+^E)qԞ~t J)*:G(9Jrd|gKUBW"@{UfbghF1 H3CQ-pHYl6m;I=.71x̮,R>DV reOe" čw'%r`_XW?n@g>]j __L>8Iކx9 ́`sƻ!@ЕlFfĜgZqhIENDB`u1f486_1f3ff_200d_2640.png000066400000000000000000000016621326020644600342220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|diIDATHo[U?ljcM꺉_()F*@H])j@aB,:K%$B3ԍ0%jI˿$vC,{|ιIů~xS2wvknn.c5x !k0~X~y fs;p?R|Hszrmm`G2Rz*-A^SIL{@ 2-|ANݖ@֞j2D7 IͰOGi*s J ҷE˥@@ NiR >%&lɱ'gH ׻(<ǴlD8?>X6+m֫ ń t-ضSM7C'iƋdS O[[Mxc>FifO(D7ΐIRyF%_.qv4P$dJ$G u^X~B>bdx͝&IߑTZEMky^eڵ Xx!x!:Pg)峝 q*vFeFwJ"QPZ8%-QZ{+^E)qԞ~t J)*:G(9Jrd|gKUBW"@{UfbghF1 H3CQ-pHYl6m;I=.71x̮,R>DV reOe" čw'%r`_XW?n@g>]j __L>8Iކx9 ́`sƻ!@ЕlFfĜgZqhIENDB`u1f486_1f3ff_200d_2642.png000066400000000000000000000016601326020644600342220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dgIDATHKlU~ɔ>2X02`hW&AH1aitad .|4|*Ih5aрbj̴Ǽ㢎L盗 9 I)cC9Ԛxӫ>[cv3ȏ_|E83g٥Ɩ>U;/ QxJE :N!l!5Ю]>:o'l0m5xR1y2"4 .$6oTfm[S>SCI/@OfəhU݁uw=5@T6EXlqeʞζdH,\[Og:PUry ؖmD?cLDYZ[_l/YeƈH 9/poW;q,#tHVymm٦1K`>`*ࣵї^Hjj-d$*+[ tw`1e:YU" .*_ R<Αd X9S@ŕ⨑w*Tr|o pݚ[ "o)}wS_߿7<v'y񵑱8jCօ@ cFGWk{ț @#piB|{:\>apxhip  O2pu>ǙDM8s&ppt5`RM+V O [(279u(q[oO'T8m&; \7z)b@MIENDB`u1f486_200d_2640.png000066400000000000000000000017451326020644600332370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMh\UHg&h2)jc!$jADh BQT]tƈMJmkEP "*ֶIG3m&̼d{]kf^Ƴz{Mlvh_}(Q!o/?Җ 'Q-+Aj-5{G)Gš;YW5>i=#Hoe8C낽pнY!LR_ XV*T_nrn疉kl|jGj]Ѧ2PĚd _+`p,x R7'4,;v<ǣ+4873Vubd mx-[p]Jiû+zz"OW"\| Gi oyFCruw)v>`ӹ@:ϛܛ5|ME_p[~j=*?!0&UclSw<3Z #[J;+*\ ?ҝr8;uay*0_y3~󥠯vGf6NP|q>z+˟ݐ`xS_xEM4-`fUZL,f9ݪ%OS>E[yyk;ujc(m0 4?O馇b Sw#2NK4|BH$].{=r?Tpso͂[+MJ R_WjQv]ĒU8)F*F+glҾ"64~i٭+k;ϲ2)LB}ɇ_0̝l0egg/N.~ez&Tl#iqJOZ59P1#Lӂit8 +l{wDt$)\ݽ$ E(k6s tZ\$h)׮P]go]Z[hblK~侟ȟ5(M՝K#Dnn:-Z6`ϑ`hũNƐgw_>A.-9VI,=cRsG  ̅V8*ZTu,=C|@{fӎtz* )ÆUe2uwSs\'q7˷#f *8**b?q#+d٨n܇Ys( Sk/F|O`~5}Ċyu޽͝1]Yfv?CIk^ h?MX|pS49<`<V̻ȏ_0cK6p 9u&IENDB`u1f487_1f3fb.png000066400000000000000000000022201326020644600330060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dGIDATH]PUc+:ɌҸ5ZZ;}*e2:y2Tƍ]مSdYf;j=䲋.~"˞EBW1;{yg99N%DZ*)/sOv %N6cu'Drю9#+;QdAnJ)>sH|"3Y)Y@3+sE JRrDtV d럗 EIo^aZT,@to rRzd oK}W2w4jC\naLqPUU5XkyuyRLWxXOjI`[Y0'_O׳M(eu" _5a?t" hgoZ6pl:_U.NCХq~Z.n賡|X@eA23#I\Ƃ7~F7Y} k7HMM%kX M[ {Dt^!u{R"WCl !~tgg$ :VK|' $)LGRE>1|q J)` 6n׷2çTHYV/#HRwO .~uL{"_U Gur#/1|( AI\*Д1~3Xob^bܺvKkeij n|>_(y32[(\{4vL5\HZC4.K$xSS{o 0tV&FT^nGjψ4,j$wFm!h46O:Qt~ѣڵߨIENDB`u1f487_1f3fb_200d_2640.png000066400000000000000000000022201326020644600342060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dGIDATH]PUc+:ɌҸ5ZZ;}*e2:y2Tƍ]مSdYf;j=䲋.~"˞EBW1;{yg99N%DZ*)/sOv %N6cu'Drю9#+;QdAnJ)>sH|"3Y)Y@3+sE JRrDtV d럗 EIo^aZT,@to rRzd oK}W2w4jC\naLqPUU5XkyuyRLWxXOjI`[Y0'_O׳M(eu" _5a?t" hgoZ6pl:_U.NCХq~Z.n賡|X@eA23#I\Ƃ7~F7Y} k7HMM%kX M[ {Dt^!u{R"WCl !~tgg$ :VK|' $)LGRE>1|q J)` 6n׷2çTHYV/#HRwO .~uL{"_U Gur#/1|( AI\*Д1~3Xob^bܺvKkeij n|>_(y32[(\{4vL5\HZC4.K$xSS{o 0tV&FT^nGjψ4,j$wFm!h46O:Qt~ѣڵߨIENDB`u1f487_1f3fb_200d_2642.png000066400000000000000000000020171326020644600342140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕaLerN"T)b-V9en[Z+k}j-KO~lZ JJLf6aTT{>-/#חoy<9 Q-4Rk@q~ijj Grޡ,{~E6$彄lA$_9mf?8f'Ÿ;J4709"y7 ·PPHN2cm /\v@0;+e(8NEQv;Z1f1,!Y{5_L:g[TXpwQ鋫b1N/lę@>[wUUMD"d媚0Ȱoݤ瞚{/#QT 'N6r\ݿpe .`6n{CRύU-Y 韶9ǭ:dφoEԲfݴuk<ۻ Wٕ0*C}uk?8~,2x{|Y3 /fLKg>'G-BwߡźQܣC ."2 WN`cj棁҃#PklˑaЉR3o ` 0`'ƢW ;=l7oql׊:*B9&>nIF `D`kIENDB`u1f487_1f3fc.png000066400000000000000000000022071326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d>IDATHmLes^A,DZřRhf[-r^tj,Z97_BȘ}(,@L=raI#E8F߮뺟\ 3d|P[Z`i);+' M[E-(9㋪5OS2ʍ_LErYAkP_3Ή"K<T:aU pNgaʑowW,X0M)e_u(H<;4NSUUKZZh²\o/#/X-i޽_ cap&]uTLYyē}iy]oX|t)ȹu20m%S*iP* =3jEdּsg7|񸪺 jB/9t0nsrfΧ/8nbD^/NsR[E UxOXE 2ff᰻Y*AwLsp89pƮ,)))f٪ܕh* (Fќ{HnkoN2]:Q`A,KU`yyߟք^ѽ*߻(" qW܎SKEssYp\ө3":d}G/JM!GrG>!1<3D"8vv(]}It!=7U_cf%%pq]86٫mF.pWGwmXӉ+9W::80$rP=X_ج줮2x^D;G:荶uzhF,;nbw8L&&J\kJ3{_jXbyXٿ0p]\D-x)*)yvz+ Rc QȅEi_OpewO,ujrGFs eʞ{T_'> ͣW@NI[SCǩeWpå_o쟜]0IENDB`u1f487_1f3fc_200d_2640.png000066400000000000000000000022071326020644600342140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d>IDATHmLes^A,DZřRhf[-r^tj,Z97_BȘ}(,@L=raI#E8F߮뺟\ 3d|P[Z`i);+' M[E-(9㋪5OS2ʍ_LErYAkP_3Ή"K<T:aU pNgaʑowW,X0M)e_u(H<;4NSUUKZZh²\o/#/X-i޽_ cap&]uTLYyē}iy]oX|t)ȹu20m%S*iP* =3jEdּsg7|񸪺 jB/9t0nsrfΧ/8nbD^/NsR[E UxOXE 2ff᰻Y*AwLsp89pƮ,)))f٪ܕh* (Fќ{HnkoN2]:Q`A,KU`yyߟք^ѽ*߻(" qW܎SKEssYp\ө3":d}G/JM!GrG>!1<3D"8vv(]}It!=7U_cf%%pq]86٫mF.pWGwmXӉ+9W::80$rP=X_ج줮2x^D;G:荶uzhF,;nbw8L&&J\kJ3{_jXbyXٿ0p]\D-x)*)yvz+ Rc QȅEi_OpewO,ujrGFs eʞ{T_'> ͣW@NI[SCǩeWpå_o쟜]0IENDB`u1f487_1f3fc_200d_2642.png000066400000000000000000000020011326020644600342060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕmLep knﳱr)lTp.ONW˲* jIPm̙b˵f΁`HQ099ՇɁv׽+#:E #_Uj܅qCΊ@M8Xa?,)m'bS]׼ Z:7@p"FI5x2\$()4!KrӖRnvZZLsBhS5ok?_3 -(Җ?ݹ@'S$z)Y0~]tEr9{s'E=Ԓl 9K)ޒCV˂ߍ<UaPl5,W$u[JyۖJ ѰBٙ\l=kYښ@-@9x_ bĺXKHDJ`Rrt]dzL j`3@ssse|U|z{ DGmI)mWk"RʸN2W.x\)eR:vz|B)`P!@ctmEMӴJԞmPh}W] ?/u]-'X1 179Ei=hrM,ӒGvgGعsj V>1/L =zKHrǙ55dg.}ג@_KlZ9@Ԅ쑷ԹWN8V .0LyBw8y61 h?ˤ\}زsWHDkzD&JK !(8ÙXb PrÖ9:=L3BJ q#qS1A%--n]yB7D~A'T~0ȂCȼ pcy}^@9Ҽ}AĎZ*t~0b߉ݻo'2&a$ A_(}>5~v86KӾ0>V_Mޏ7r{7w(5޷pW,#IENDB`u1f487_1f3fd_200d_2640.png000066400000000000000000000022011326020644600342070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d8IDATH[lTU9ΔrX%XZhĨAʼnT #5$h!&>$()4!KrӖRnvZZLsBhS5ok?_3 -(Җ?ݹ@'S$z)Y0~]tEr9{s'E=Ԓl 9K)ޒCV˂ߍ<UaPl5,W$u[JyۖJ ѰBٙ\l=kYښ@-@9x_ bĺXKHDJ`Rrt]dzL j`3@ssse|U|z{ DGmI)mWk"RʸN2W.x\)eR:vz|B)`P!@ctmEMӴJԞmPh}W] ?/u]-'X1 179Ei=hrM,ӒGvgGعsj V>1/L =zKHrǙ55dg.}ג@_KlZ9@Ԅ쑷ԹWN8V .0LyBw8y61 h?ˤ\}زsWHDkzD&JK !(8ÙXb PrÖ9:=L3BJ q#qS1A%--n]yB7D~A'T~0ȂCȼ pcy}^@9Ҽ}AĎZ*t~0b߉ݻo'2&a$ A_(}>5~v86KӾ0>V_Mޏ7r{7w(5޷pW,#IENDB`u1f487_1f3fd_200d_2642.png000066400000000000000000000020221326020644600342120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕmLer<8 P2=M\l˂k~*5ڲ2][-^j1l\e.șxbKq/y>Y& /=}=w @mmCqW /~N[MMt>^Gdnև>)Zi{¥kpJЌh& >d)΋]9LW?h]]ހuW"rx|{^w?ZÊ8ō-M,)ȨØp\2MRt/u{[j-wn?K {T5TdF ǍZEE9=ӧ:ᷮ>gt4қ1X*T  me/=|&'C (L/{9s*e).FI 'FܺvUd}1\GMv O]rW Dz--D& m[2 )ɟÂyŋlӡHUyebCJcQ,eY\X*k,L_ZeDEVm7 2 2{?F!c2G:y݈jBDb'nO&iv^a,\d*G8 P?&=s}ք#};.t݃❴P"L1hٻ%?چ&"&hvVfg7 ZM?எq^[^@iAxTV6 zx8VZ)D|/ׇi"'p%x?2Wj=¿Z?>BIENDB`u1f487_1f3fe.png000066400000000000000000000021601326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d'IDATH[lE3}퍦R.۵(iW(*P"B(QDH‹QF|JMRHej >H4lB}3>,~+93?3gk R̒ZKW:};lGSCSv?WX6rVF9 B˂TM~ [pPi">?NLZ>@S:vܐR5i҈DdCuĸ| ]SB}ɮƵ1Mk%/[Fz;2{EHZJhlw%sKLliZ;O? ֶؕ5[YcC $2)aa@Q1g x}ۮBUZk3H(/k~:AR#@sdD&(sP^dP_u ~ !6wwwϊ3<.FlE+96"{a),6YYS3>ŗxSZR}y%VuIENDB`u1f487_1f3fe_200d_2640.png000066400000000000000000000021601326020644600342140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d'IDATH[lE3}퍦R.۵(iW(*P"B(QDH‹QF|JMRHej >H4lB}3>,~+93?3gk R̒ZKW:};lGSCSv?WX6rVF9 B˂TM~ [pPi">?NLZ>@S:vܐR5i҈DdCuĸ| ]SB}ɮƵ1Mk%/[Fz;2{EHZJhlw%sKLliZ;O? ֶؕ5[YcC $2)aa@Q1g x}ۮBUZk3H(/k~:AR#@sdD&(sP^dP_u ~ !6wwwϊ3<.FlE+96"{a),6YYS3>ŗxSZR}y%VuIENDB`u1f487_1f3fe_200d_2642.png000066400000000000000000000017761326020644600342320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕ_lUЦ nC"bJlfi@h11(&K&bҴQ!7D[H0H4Sw[RTAJgC)vm9wwhllR?݃hJp(!E. kC]]7#ݸcw&Ov-őů'S 0!tF=U'yoB0K: 0+ړx <.O&k Q+tw}?7^`04'7Cbc"qޡ_˞P,ttt}叴'|QA7T3&paN k$y(7>kUժxun?ؤEErطt ?  B? }ßTߗX]؝Lp]w}&VjmɆs [oC5+56q>\ʮ T.2(B?}_fYyA]H{ٜ_d7URնwGc/4D8x3>v$/ QY^7RP^0VOgKED"؆=GhDB7\Ģ"k$6g["訩95Pȕ|W} cF\W~m"sppGx@@!=U!Y9y,2rKBzWr}D'J:Vӊ@Zw\imzǾس91סQGX~i׉C@=*`#GXr4H =(~L]]v: ,.ja!UY9ZAxxߓ|:*&Vm?id73~ #Ί~[P(IENDB`u1f487_1f3ff.png000066400000000000000000000021541326020644600330200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d#IDATH_lU?mo:\'뿡%ԑ/GH FTIM|i*]61"VfǺ>vsjON? uz0o׫N֯uaR[ x)u x?tv`fOPc EÕY;E*Ȳ!Uff6% "c)-ErXEG͍b/dLŞVV9O& 3B LK\/ O"đa|ʼ@5 ԛ3RS(u^(C|qXd,fC/L\4.x:IENDB`u1f487_1f3ff_200d_2640.png000066400000000000000000000021541326020644600342200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d#IDATH_lU?mo:\'뿡%ԑ/GH FTIM|i*]61"VfǺ>vsjON? uz0o׫N֯uaR[ x)u x?tv`fOPc EÕY;E*Ȳ!Uff6% "c)-ErXEG͍b/dLŞVV9O& 3B LK\/ O"đa|ʼ@5 ԛ3RS(u^(C|qXd,fC/L\4.x:IENDB`u1f487_1f3ff_200d_2642.png000066400000000000000000000017561326020644600342310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕ[h\U9d$$i35El: ؐ`ж *HQF|-EUsPSh! Q_|/!Lh iln&d߇dj.6^{!k_ QݍH¤o'&&ۉ pg>^H޼8{q~45Z-uCUFp.]Z.xy'nP$ l2k=b{mˬp]%o6H->Ͻ!cW05 аϧ UccZ_G_8 # ñ壽ҌPVVm:}UgTՊboWWvpyؿ&a;$lLS 24M';;:*x&Ԡ{ ~Uqo{jQnK3zsV<|pYX[syV fmIU-Y5V\z\͑R,cĜLey諬_Qa *9 fqUMH[4=~?TҾ"64~i٭+k;ϲ2)LB}ɇ_0̝l0egg/N.~ez&Tl#iqJOZ59P1#Lӂit8 +l{wDt$)\ݽ$ E(k6s tZ\$h)׮P]go]Z[hblK~侟ȟ5(M՝K#Dnn:-Z6`ϑ`hũNƐgw_>A.-9VI,=cRsG  ̅V8*ZTu,=C|@{fӎtz* )ÆUe2uwSs\'q7˷#f *8**b?q#+d٨n܇Ys( Sk/F|O`~5}Ċyu޽͝1]Yfv?CIk^ h?MX|pS49<`<V̻ȏ_0cK6p 9u&IENDB`u1f487_200d_2642.png000066400000000000000000000020111326020644600332250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕ]le}۵kǶi ck__- c&hL4F]h cE ꅉ^`&F17 $&QY݀9gh׵}cJ&[;BPݦW>egޯ#/l 9(W&ۺH:=ʏhPU/¸"vb4a1>19w[Kmsɮ5^9M vt\RP[I+&%p@bbY3BˇFG1ˡi{妦[lc˗w|-7Du!¸dǞt_Opg6sێ/fdFWUT,m]U@kmmmt@T=hrVľf3^(82,aͭ; ժ$")ykfBo'k*-\uPK88?2x\Y&ROP˾9_>2ף\N&OƳ fA4dw(oTJ3"N"xr.iS~)$#[`ݮw͇4ǁ*Ǧ7gŏ,xAYɫvXN`ls:s%05Iw.Y7vqdmMðdX$'бw;> {*C@ RX@#`Iv ">*0SG>Ah |\Iޣc{Dg>voMq RIENDB`u1f488.png000066400000000000000000000016241326020644600320350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dKIDATH]hUNv7zB+M4 jShXE"j@ki4Pk+` -(, jğoڍ"PJR5za-;s>/-n~̜ϼgQ[+6^A~_NJ Wz*;' M1@^L*T)LB"-;7O]je5ywCi]sӗ ue@yuh ^M?7!p feugJ  `$ P"W2?<1=HT@Khzxy=1n)kw \"_P -5Unn#rw]l*_ȣ ԟU+Iq>+>SY2@1&@/um:UM=%L=f*Ƨq:3LݙN.v7 >:FSݒ@6L(cW9A9z=QV׫1zRO7W݄[~[7+_9Ĺ/z8| kȫn"mڧݣќlKۗie:0GI9 q2d#c bom'l~4|H`s@ȟuhEGU?7:FnPPO6 mTX1ūS9duDC_MmvTMRS6;*.KDkE.y}N>5| 97mM|Qy ,?'Lnv@&QuMsSds<3 W%N~us {;YSD+8S4!ےL%0crb̛n+¡_T쇩u0HDY"pn~9h%d gD/:f5mUjM- p+s:U>B(|Au[{@x)";N]gatپ9 @ۻ`zV?gݲukw{Ob*5j%ŻYUG4Z pI-¥[/HrÆ 4߼J84~/ ^!:0朰* 8pz{ٚ i$㙕0.IKNbvBd$zljI}m%BWrNnyyanEˈ۰ fO40s0l9x2z~c{RKMUYi.uܤr Fx@HY[GgmSmgc'",ÄaWYԵ/r`ЈASU.\ÖrSUEٱq㇝5Y| &guKKEMڶ"+~LZp!\RK´lηwqF"$tҸp㾓YU;z^]S:Rp@@m!a}{%CӁt 5m0e@6~mG5\F%Rg:S0*:IENDB`u1f48d.png000066400000000000000000000020611326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHML\U{ 3TZhU2ji 0tmnt&㒍q;MLƍ&JL`Ȁ15 @10e7~.9#Pm]Wdxgle:J>xmlA^iU<_`C3͑-;(wTp./x= XXwoӲR~^bZ-zwe]W=n+ gv*PÂ#:];XXX84==>ݝJꧣ:jpGi E+S˅:ZS&yscc=)峹\crr I4/dc5sA-4畘rӶʍ#iЗv\L&ӖGǩ0\y)OkcLB!Bߤ:@K\57W ^@חϭLLLm{T~Bn"ߪ 圿~sn.px^"j&QvI9G066KZkò3$L|B9ņH?gDW x<>:%L<:7p`TpX _V !Om֥RJ^FDo%)J)r]7^4 e@"'5usCpRJ|>^֣-Re1i,@JyU'yxxIJߨcqَgD"wYkU>ץRl6[[x:~X,^UUmEp?02=33s܄\ ˲bؖE-D4B4gZv:sqFι ݺR' RJ!@DڲRlWWWٛSd2cU9 D")%xK|ڗIENDB`u1f48e.png000066400000000000000000000021151326020644600321060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTU7ufB *_RZl EQMDF]螅11ܺ41\pALL,jb b@>$))S3qA:3$w9jĭgS\s:j7 1^(}`PvTtԪvE'|{Cc6y=ϭs{=ê 9Fٰ,!z"B:?LGg"yCisPhp"BU! :Gc@LQ_<V~ɇ:`zb1#B*. _gߍG E8:81:6YQo$U "s(S]5S.@芐:vy3RTuaN4xRتz75d#aȾ|AוȉA`w/IYkGF0>2ePppRY22VQ]5V/{,YB85V_X/>^nВ(kis,&BO^U65t, qxsb=R\)A2C{#R㚢C] *>Zj@cSxzn9^,X@|) ?xϦgS v*,{~G5{ ejQ>n{Uj ;L 1 S(UotFeY7vn.nƥ" ar\|3&1)qukE0P &fHzaexro./h|1N^:$N8" ,{z3K vCnm6h%ՒTtڼ)f)ېĘa6{=,3ԜUي拼79ck\\iv؇ZDT'E#{,;, d"L3oE?[QMusW4 kӉ?̧g4K^>o@6)۫bzЎ]džm*r PH`uu mg F5ٴs;~<L$IEC]@f7Ch|qsEIEyzt+e V9Tenw_^řWKSDŽ4mZ8HZKf_ЕޥЌ+֎8 ++sSݜQ~D8,·@UM1G~F> UmK =B@10͉m/<\ >ΫnS3N[zu;$(U(8YKUU< ffIENDB`u1f492.png000066400000000000000000000024011326020644600320220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH}Lu?\ αicU-K(4ۜZVN]S|Ზ/f˚T[n2kη,`9!l~sv#İY&~ tFU3c2 Uxɴ y:S]yUi `j~2Du5?/j 0 {=8GWޥɂnBWy7gRQp  d$h'Y(GU6ꮷ].xÖm<pGpg93:T^Qq BȔovm* R#~3rmY}5suoH(} iK R S[`̞śqM@@tM卽 A4@|3dkK_3h;L )1{\e#-1T8\/{5z(r5%erՎ;/%9N x%]w>]!裾;ͯ^/͎8g|~CwP=9())Œ$Ą8@&-x{U'\-yZ~VVx @aj@g'=j0>[:7/Uw,O|p0*Bp١rX:4Jk5K4jiqK Q7<=rQ[+x;CǘoΘ#5##pٚNՖjtp)P6h|k{RR8'@1ӹNjF&Ʋ%ά/T,^Um=aۘY#ЦNo6(#GkuHU̙yVD.߽Hyl,9c~Z'M 7IJ j/g0wx2Si@+??%a _ʥ 88<Z4cf޺{MM8_E'8 Z0vg'ny_u>wӱ{.jC i`IENDB`u1f493.png000066400000000000000000000012361326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dUIDATHMHTQ{Ed"(P3]$-ҠEPAڬ2 %Q/ pXCP6cQ&FD(o i&Y8'I`һe5/UN bZfܫCY^>09,kQ#`̥[ϟ5;=V$+,k,kH|Q4K>MR1@ ` iɻUx]ٹ|N։Uހn^&k_H<:1] KfBHfl Ajr&Qq^2x4/EPK΋C!K%߆r\1Bv8@UC*p|I hl|h 9p8Ey@<W`T9ٳǁI)EN4Qㆡ3%h I-ӛ7D YГ }m Ӹhi߁[h#hQ[@QswxUppN"ކG 2RS#+"O>/)c"ҝ5H Hpo}@Z9nΠwFE;Q յ9IENDB`u1f494.png000066400000000000000000000013271326020644600320320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKHTa盫\ըAaEZ*@rF`.e4ZcjHhJ-Zq m"5I1]ws=mHaD4orpV!Lhf3UZ+2P'(*#&(Mh9y{`K7~a$ 9.4nC͗.1wk4ai0c#r6~]PY4@(jr Ce#Vg0&uQmvD±j=,< ua/97Poy0$`2}6fSwO+ZL-!a̠t)+@ܷ/&Y!{w4 o..lʇO.)~ƚ~ϕ |qѺ݃Qovц±zAo¢7"' xlYVtE:k7zA01Mڳ@mygL!c+:#r=TΓ+I7Ox犷9|MղT@.qA"6KZgSqIPŽ](ًc{Jk߭X0c9@}62&~Llm e$nڭC,r_']aBFeJW'H=8]T+{?=[vDKѐu.=ϝS.gv8X|)rt[ =S`bvx<^N+0a|2 O_skr$IW4ߘSYE= tMhS^S͏ gTϗv=̒@s;> OZg]WT&B^+~RԪ#oa?IENDB`u1f496.png000066400000000000000000000022121326020644600320260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dAIDATHݕ[lTUsΜΥ marA Hx`H!%@Q>(Dyi| " AM0(`&FM%aj -e3 <`>{^kBDGm{~sgNH]>4'[HG DU++9x@=ϋ/aᜨ > Ҵ X2^ԻD3%Jp1{EZhpD+oΏ(ʇ7ӗm,KM|C^2]FV# ǕpathgSWMɃ\@2P_n O-÷I;Od],SPm@6$~Sš`0JArȡYIJDzʍ/nt<*ŵU.thL?tg/ljsZ9(C@L\o?F9җ0RUlbRAn(tO]CuޥsUm;H:I:oލ".;X9M?X6Ab?c{g;W{؅A[,H\@*܃8Y#rZ8F @=Q3B>BL;FL ;06 ZbD YNg(ٺ%Dy Neȧsv)ׂGw~t4JgdW( ?x[.ҊhQG- Psh5V!Ѽ7Y_\F@z_L? 0[̊f^˘Krv {$=c 6V\YtK( O4-0䬸4YS/ߍ_4[ ̬]&rp1Gy}u& 1ʼ\{{}?dN~ѐ:p__-&;s%NtU,gx;Q `c%]" N/G_I'1, :x~Ȥ=ۨLvn?\0Ifew-ܢIM˄a# Hx JGGd߲3ʚsaB$< +swEf>Băar` 6yE7#A?\iMuMeM5/ь. WC4BVX.3b=S]Wu} WfLlYzmUHDysb@Dyv3 * "IE\*\d"?SLÇ o9[Px; l{hF ŷ1U2m,wQ=6k V{uR`q˚%:̘"ْħWWǖOzV"s^'7H IENDB`u1f498.png000066400000000000000000000021331326020644600320320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHLUeǿ{p/YՂ"Mij9#Y.ǜ֚[\Ef3fc( `*d L`Ap?ι?dg{wws|67{^]="7]@ʺKӽ8i^շTH\ɡԇ_]80C'zL%  AC,dW|v%͝:qHcp Z֎';4pD#A Aªީt 2 A$Dޓߴo=Rv{OB;p{a@HPup/XKY Q$@ڍO)l3HaEI<.468H0Hݓ@HMG҆M=߆ 6m ߈}D0 T Rļ6JL3'M'9^ ̦-` Hd*(}0>C䴾\ܹF mׅZ:%r|mfAN8@O |uKL0/ j/0CĉF|Nmn BL[.FelWEo-Uy|LuU@0A3ؑokv-G L>9XZ0=Ah]t"?+ RuCB $FS_IԻgY4)sk@i݁ӓk%ⵑ^9E~= RX['9P B1ڄkEdW[7-Ew@jMDFMTƒ4Y#&^{O(2<(-.tζ[ US{%ogB;t| nCV&XS k=8آ?Wv dcϖu}mٞ:ټ}}]k Bub_24Le9h_,i[cleRhh6ÝaiIENDB`u1f499.png000066400000000000000000000010501326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH핽OSQGtAclK? mBh8ɁU0DbR-qPs_(xһ,瞏g9|߷}A9 SW-g Xx:T n", zKfՃۡ<пG#UT76oemкW C7 1 jv{Tudžox-TSF`$9 "W JOP =a;/A֌/ P1-𯇥uּ>{h]U&3GW SLSLC}GLe1qkFT%+_Wdc7XQ(c7wpFEk2* х_nN&e{QC~VM^3\*3@GBň=&[Ij8R_dT.:^3.Pm;Ir.]]NIENDB`u1f49a.png000066400000000000000000000010551326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH?LSQ>,N `䵦vIP F`DNN$B4.ƅ$!JgTX~hY13;o=!$3M~lƌgV^_P&z[+J&6v~ YIENDB`u1f49b.png000066400000000000000000000010411326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH핽kSaP H3 ĤB'ARP\SAA7A&DԡX\t[8ĔZhs7. H`Z#%Qt;{fkc{-"PV"`CVe板\\} Pnڭu2=Uw܉GMvnt6N]˔$,yd'i\2,Ę FE ИiJVJ/@>UiUq V oN̚O K˲x^VP ^׽5o?f lǹE!eKpʒڻ!׈E5'U'pxQw*ݽ -AwWo@WambNEVQj r^1Q@wlI̒%@V)[vPjb-ޏ~dPgWIENDB`u1f49c.png000066400000000000000000000010531326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=LSQB{e``2$&h)uUd5:I0FZL@,N%>Z;)_J9w8UCs1x4~KA3@I"[]kF̐WS@A`S\erbtA{8AkF Gv}?qD;@lhݛ; A lͬ -N\].NLĨWm_"ƨ(p tW嗁/Q%_f~aʌ;EGF.|3v$4qp̒]Ms⥢}ĿlgJʼne #ݿ u90o'(*X&>dbF}xn”N.)ZdQa, 7(U<< $`K2׳ @v苢}cR޺ F-'DW>koIENDB`u1f49d.png000066400000000000000000000015451326020644600321140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݔOL\U; 0PKM'SՔӕXcl&ƅ+҅huK]WFmL4֤5-Lax3̛w\t(+v~9C c} e;_Ub_H\!wwtttT2$g+|T_pB"zl`'ן?&^]j0sgrS1?:O5թ)JԪ#H?~%vs,υ M5KQz]<*z օم3Lf|z[G"#Ev.3 2eYl~,ƶQm/x|$ RԳ~N:hSKiB=!R aU, 5-1fWv0qvM tUr Nyĕ=,7$n'{*g ʦ\nn=xJ&Fhsg^ ? 5(X$eܥ]nK0f4,5,:W: db60d7rN{?}5F@#GƒQ(^v'ZBBݿ۞B8} v'F6v£D\a#vd¸ULl:6=eh'fB,ȖuԲo_Jc%4zz?1nmComCoOO.GCkӸ1!/3~E(}[fIENDB`u1f49e.png000066400000000000000000000016301326020644600321100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dOIDATH_hUg&iw6fBt*(X V ڈ|+>-UT"1[KVD2kiՇ JjsݙCnv6;s}߹w;Bp=mlldP4*8+mڣ@CȾǩA F@8@íA ҁ|_aK8&ևʘ;_/||h- P]'k $7յe"@D=GDOǺn$ `HԘGL eJ e-C7`8Wԑ|8샖"|V4應GV,6N_`Vz?i=RXn*;՗#@;WK{wc#gDflzKb3?L?5q9~dk+$ ,l:>NJ;ey_f:d<+q$~@)^I9@l齫nkV9%ɤ>@"aU 8:riZC[*"M>)_Tix`U ?^eg9"f_-ȡS k Tܣ"AWZR~zިh/g;h|ﭿ?O&-rvn(x;?srX\DZwDI)V#qՠW*|(UDYi.ٱǽ{ha3_Ħk:qKԣم< 댣IENDB`u1f4a0.png000066400000000000000000000013241326020644600320730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHALQٷSIL*zP(EQiQzQR@I 4`d}s۝y?f{鐆Pb\jv:~`L8`l0`o2))@D+Ƭe^I77nXxj9 ݪ&a|ms9sUƬ&a]͇oZ0#Ҷ- X[SbdgȆ y%)v`//MvVi4`='~84°TxWei2')SN g9"\#B@n5lL8x OҭNfk2eM@D0{ 0q혺 B)i+-M ϧ41sg։xzJKn`&Q8BdeԎip& TlX^/Ga8 }3P+%2Z.W񆟿sp1p^`Velګӻ'D^pGO᪛O;۲ƭo:V` +1!0kь E->n#oZYU'ܷ,FG83O뚺~g<IENDB`u1f4a1.png000066400000000000000000000010521326020644600320720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH?hAog2`$!e»\+@& tQ0*XNDRTrfFB%A0P gÀm+7P9i+˷>* T)j"8o.o0] Ot6#'|)B./>  e׌ԼњLNPҗ7@/~ty"]^x6U+\;~a(| ( Og;T0b&t.J r|+ړ~&6,J [_f^Hg*6ҹl+H5f=Jp@Dj(NxHw} xQqvlt0 nȇ??ED$Kу>A8n4:`:saW]=sºY.,..> <T7RosU[dĭQTGi"ү)"JJGEm`. ; yҏ3_̳mԗv}LedX)GBkPgk@jykkh*4M_0x ޳i;?&'.?ͪz7ɸg\nn['-Źgu4ͯ(8=zի)`ޫg-Z$ޞKR30D ˶qQ?d]QEֳ'.?px߿EX7[U&a&JlvB3ȅV۶JJJNvttLYY344Uߝg-riglz>"DH$a vsD$h80WzHӌ0>>N$ɕz 4ζ|,--96Xa4kF.iZ:8wr ---088H,;nXmm-+++LLLZ*n#N ƶmZ;FQmq$hNo=?pmaaNNL&M2{zz:| sVWWo\T* ,z%vLx3'yM ׃@ &*++Gc'W(~?u:W~~ii ԺZ_5@IENDB`u1f4a4.png000066400000000000000000000013711326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]Hafn*//&* ,>h" 1Ңhm/,!܌(( "݇ADElt5m:9W(bQ3@uN2IU5~w&(P0"ҟHcqOȫp7YXr dIN(hG0@/Qtp9@I11op*'ژCF9? y\k\6䐇@\w.|{ܾX2Cmo@9WpuuQ'Xkn lP7CSLɱfA!+*{1x (( P,nXm_ AYfK] {?(ڤpwD}|gwR&'sp_k.or y*f1u97HxB*t ql0Ah@n`sfi5%<Ǽ7̖)*g ̋=@&Q9-oн}!jU a%B2@H$OTRU4HcWX }?=f[BvIENDB`u1f4a6.png000066400000000000000000000012101326020644600320730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d?IDATHKTas-s!3@>g&#(M6Q+ AE-5f -M # tH&ӌy^+4s/]jp%"?2|M-v\Wڷ>񓱧;$D R{MǣܰyԍHԚH}n8U|1^FU]@$<  [ Q7pXJ7ZٌuDoṅռ,mudכ^JREqUR-ɉ#+u_ HEC+85B@̿99+2ÕB ڃ @`t  < YLs݂˱M+Hc=SGgeooaWSK ob.rd=weʅ7e"=_|yUBG}mMoF?mM2`^}V6/q62:DfPnv[rhNC*NtI)픹Y{80cIENDB`u1f4a7.png000066400000000000000000000007531326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH?KA3{G1BLbxQ0IKEԖhac^B " Hay,Eݝsey~g`wភr-V\(Nm94A?(];xz\S@EoH{U`U;ҘK]jhgV\ Du*ZW]nD 6mQ 7x0~57 d`cfS~Pz!< xpTJ ǻO +O@+#gz@;T: g)MU>H(5\8."Zp$X*EA˾b{Qg—[4i ONE/7ZsI.J-r}KIENDB`u1f4a8.png000066400000000000000000000017731326020644600321130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHU[L\U]ss0 <JJm|14G01&<>4cbbi4_%j54ֶh)1*F-2Tyܹw=~45)@誒׀YŅiY:b=X٬}Coht J)d] L$ y lɋ;:%7T<@`1B}Uy1-n@nzvY[r׫ަWUi.^yNtﻜ۞?5$Dp) &\PC[&G7.xTڄz&ؼeϿյ?c.IENDB`u1f4a9.png000066400000000000000000000020261326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoLU t2QD GA$lbIâ&Fm.: d&#R%ĘlÉc14!,1ش++mC+m)T}!@*4tϐbǛ{kJ" 9y>-n!ķMW_U7*DS=`KxhIaHKN 6/oqXAG) "gX\.tigD )BZc5YYl}V<c&'VޕIIU59EWm/ti`0DߒO+1ha­i=^,3`㖧|݂Kǁ]| JFKwb4q\etttP__㡬XH.Ә6ϧgֆ:2Fe nFFFJV_w> 3=xʴOzK֮bP^^N~~>}dmfbZ1TTT0:t+=]'yEsYϟ:==>>>ode'مX,X,t$XʷHR"n_k|q=L+Eu/♘{(""n{_!C.SH!43Y4cuzȤ;!n7YDc)/4O?Z`wpїVcINXՀ %+CS90)Pkx σ7lAW |H$ígz"]W/^(0؈X(L&z2 .%Dݡ-ۿ\J^.(^>t>8ouh"T x oqV qr"/Z}phC4T1%ZM}IȲ%IENDB`u1f4aa.png000066400000000000000000000016561326020644600321640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|deIDATHMh\U+dafP b7EcB]H"Z7 nCuaDuҥڌSLL23{|WI;s3é8ĒYb/N.]'Gs .p+\3,}z5瀗tIY[2C/NXk.uˎƪH yʃw~{O_,CmKXB}ő̉} CxUݴ$=jeG&oWܖpV)5Z .uB}g6KdIdi䠤<ӭ~/*gEs1)ngnJdw4T|_#?1nuRa֩L6r 7ŏ*[Y]mՎ@v[[_֜TcSFYX- a s֚pASKm4=@$ztkT| 8eE:* oڹŸ6֚urzܰz5+_'_>GlHLE:yo>#?Gs/tv"fP9 p:DWm=j>Ehك8?-i`5_=+>W`Rc6JJu'mS.<Po()c.4{ 쌰 O]pxHɜ3HCBc)cH{9wF7n7mFxBfcxgt: w`/޽T$5 R%lվ虹y~"2A:*>x|j|1bc$_I౅O` H1)08BV`@$h$%N-?v5Z&IENDB`u1f4aa_1f3fb.png000066400000000000000000000017551326020644600331450ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKl[E33y8V[DhCQQ(,((BbCBbe 6 v X!YTb@EE4ȫı?޹3'q{vo=jX|e:~Xe<U'q)TX_[)wWwre# ifzaj k2"V1c[@p9 ƫamua nw7* ʤQ/%X<4mxvSWƠV,q] ETo,#ڕ@zt詰 'fR*Fj$XIa+Q8DzkwZAr b0?pYVS J {ܶF~j k灄' 2K]{|owm$dXʆumkiʺhhqoc^ː?=`|hmu`fs_s_^L9M^[@:Fke.9{7<x-g>|6~Hp0$D9WLx'TohKG $#`oS !|S"}[R{D_M,()8ZӲ}d,$Ra|DX6/)ЬQz&0آJºr.w'@7X=X/Ѭ`Id/To''ե<]%LhFݏtjG7'5'; +{T,@: ButN}U `$3 #RZFʑBA‘R 8<ܻ_<1!(d$D@?H8eA10ro΍^IIENDB`u1f4aa_1f3fc.png000066400000000000000000000017501326020644600331410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKh\U9;3If&A65Z JbBF]\M@7C|б b&-taQU;)]TEwFM'̣3w{"MG;/.,׎)Fعv>๫SY3`m^/'>wπkAisAaxT{:9͚5ـ`Ţ1)*/&;NO3`xREXB(Aq`ww5gzFP+ŠPZ}IT (桵z{f^f]+ZF)\( A##b"o{J9ɠ|]DNB; V$ r<@`c2VW`OO]0{-3Ț? jH,h1z)Ypr];4@ώ8~nTa:n ?# n6)<L3^e`\U/|_4ӿs\6s W\-W.9iK'&/=tb|e._9dApLS~K8HgI-r~<0<][jkLx)/힞x'S$qS"n6w Q 53.kkPBСV?V,.A+e,1 tqCnuvw7‡chjP!DvW6 XKS|U^kg%@4@b`?=8-V}<.$DP2-;a4͍c'tLF!3Qѐ %taxҐLD)H& )dh?}Nč%~|? O0beB83>}%u:IENDB`u1f4aa_1f3fd.png000066400000000000000000000017621326020644600331450ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHUMh\Uy3KfIJAEt.v4 7,jMZ.?D誘6 Z\Im&y͛!q&;;ww޻1mFkiBF G{%5zDRD/@r9On^cK}kycܒ3߾f3z$5H^ȗPt<X(h͍m;@eW;l>WB0d)ق8ǷB@]xiONߪ(cwEs^j, eKD:tdM> ?h_G3y @-HÄkZ[$F [ke1D4*BރV}l+UN`l:Uoĺ~ě8y(eLhID7awpn޿͸z)b$QJ Z7@)?ܾ3ܕbvw %\5J107ɯn>.:ŏWSI䅊_=qrpXDBV-%"Lj- Adf`?}۶$Ӱt3QtO`1$$D856>"ѦIENDB`u1f4aa_1f3fe.png000066400000000000000000000017241326020644600331440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHTMh\Uνo73M@U7Z F)"4" b7b Eu@Bq!0BADBK h]Im3o߼{q1%s{%b|V"^ y3f3SM@5L02s|[(L6B|B'cu-DeGtjIt{i" ז9gkK%3^ ,K lUb)J>[N ?kK\%ʤP F@k|cz@'f<ӝ7Q R -8plzעR V1ML(Wo#. fZXuyU4Aqe#ƍ,q B,?ud;WϘg&ws\3W ֽN&t|_[I8מڀ\Gu2^}OT|ufE`G~@ n%2͖YaG o= D:vۙDOof c+1Y}+ @n86 (S ͢z:|ӿ%#Coh o*R2ʛ&L~3PnѪ$&~0! @kF j6 [1]uj czwvak d@֑pm~%0$5زۺمU?V+5+=!#caxg=Б奇+AXW?WcFkva05^&E⹋+=1x Su-hMK ZRR"H1HJAh@R zȌiۉ8nj,l pxS#܈F'IENDB`u1f4aa_1f3ff.png000066400000000000000000000020101326020644600331320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHVO\U}/`MDTM &vD]0֍{7ƚJ,L " S`L߼E0w=0F+¡kxtXD6I!Xd\8^W2g\[emv!3 AGz6jY ّL# Ce6(7ϣ \H+ rܭР%b*Z-HWގHn/$_y wBmC@Rz6XGzQl]ڦo)[GGGEasi0- L B[ KnT2H?nL <_,<`\v&w%!?44LXղ -HfKlzffƮ \EH0h#gʕ &2[ Mrtxi+΃iUiF 'c*xuNe ^o` 3t DL|Gxյspo K:@y-D_1{C#`t9PSmCI7xWةX<.-=x": J;-E W)e;0Ul '5,gȠP.cn))=kG_A 3G#h / ǖu b4^\,=k UD5]$@s(x$x moݞQ]YZKb&_T*'B4Fj ̢_S>yŖk''D85c: ! BЄ?W!$;!"TڈE3HA,s!{}IENDB`u1f4ab.png000066400000000000000000000015321326020644600321560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_Te;ǧ[+FHM,RIΟ,. qA")D5Z& "FgV̈UVS*pcfuݝ?ޮV\[sR!xߏs࿂Y=Z)uCOxޮK>p[$jѺYscNn&x:7Vת [ի;ŴYG!4~nvqɂK/O ࢪN Q4.mn咻=﬩t)f|pr=3z$ZBw-<^֤s&aъNGQ{h!He4* 鞩[>fT{Z;6X}_xu2|!M"f^kf~^U>C.UX>zYR@ Ŗ=gʙQcJ:_EͧFzR8C VI[\owR -Ŕ>PMyb@jˮhؠR^$Q4#O[ToC g 2i7D}*#WBkN^c0pve;>4OT.1Y7סFt[7f]VyLy^E׋HCDtѿWaAT@c!J#] Ҧت"?}oIDATHT_H[g}߭(}IuQ݀>2h|d= i+&җ>([26dRC{ARK"IԢN6%K| vQQN" 3ꤔ/@,_vPWW`0)%L&inn-\(6]Q0T . qD"x4͵t]wttTۿ"LOOceei"N&O-zIH$B Q8&!DJ4G߾V:<<,KhooHp H)K"BUUQ p!;p  \匱[hhhrASS9r]90 o[[[*ND9!_eYvww^S۶ittt]?4sWnp|ppX,ED]e%8~_gY$ po[ 666rDZ__F KKK%DžBCCC8::f٧gM!@JEr9tww<&''111Fnlnnbi߿%եloo'Bz133t:}V~9 ض"h Ca,7},ٹ@텪ȯ\[[{zmBJY9Q!:^>d2qwx/ @QLMM%3w_CMiGwq -  WIENDB`u1f4ae.png000066400000000000000000000022311326020644600321560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dPIDATHT[lTU]s̝@A,06b !1~U4hЀP)f<%D$`_&BR"P!)ZPtqC&#{M'ڗ?ykOã$rč"$6)53ʊl*C oYb\} ȴUF[fo5pzʎnW( [.P ׾ЊZh i1Ԡ .+ *JҲW!qE-.]ؿzGڝeRZ672aZHu+$,Z0Agtj0[^[7t9Lc (+Y!lM*d2uuZ+l6]m>Rx;^S3MqVis }ģM-ogJxJ|\uߥM 0qkPʍj1iSeŷѣˋ Fd=MBX 3H?O ? @;f*Yg]x:*ୈh́<)4߷ՠ5u7@|e;,/)+쾤#+^{1Y벼xe?]œ2&ɅvBۋ7?`I+NMm8uA;SdWNms2Ay}L|b8rLY>_F\%poD 9:@(5@SwW?e%MW~Ҡ:kbPTa^-[|Z8d 6 \{Y~m<0*K5k͵^2uDDUr4 5ˉK*!LɹP9Ey2(#5H-1>a &"i46 1\4D‹rDδT 9{0gcrk_}p ZLWim)k뽕MFWw":GRC>Zd8H*aME eiҙxǵWƂNi8tvgݛ%3kEdtɑ( H8A|ipEt~_%~ {@=@> Zƪ#;3 @s5Ϟ}>&~_ Qח]zD@Ś~H~Щ0Օ0v/:<LR<ԲS`U&zеY7$3kǪM CŒRa uK*Qօ6| p}nh=.hk﫯ػ: ݣXGTM8g_5JP~ӄXct,qi L_^+~'Ƚ{D{3{l=]+"# zPckD]nh}6B@diS[BW7n ҈NL$}TLByD = /\nrsڱ 4@)^QQ ӻ5y,V Q"*DC+\[>y"[BdSx0Q&(: $_$ Hʙ#Z 2?)+z&&@Ta7^=+{ SL TqZU9t$0J2a)I^^TF̲Q$qCA'=T֞AaS{*z'%WO0KTf!֬#uZEv}W*fw`hWN/Hޘ/" y9u? >.o :^wʢsTQvXx:@kgcEe%tVa?ʖp}R{7cϊH%YպMџ 1꺇~tm`cIW/pFY$IENDB`u1f4b0.png000066400000000000000000000017061326020644600321000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d}IDATHKlTe;L[r*KDQ1j$Qc hb &h$>;uatj J(BӖq1>Lj?*pXƻjDt/) c:R3.Oݺ[JܴۢkkZܑ~TZ`bU)۬m[n]^ jXvFÖ/Ey`%3ߝm 8}u"? 0磇FwX2"-fmJ<;cE$`=K22%XG*-!…pVrr Ӽ8?ʘu= I>n]쬛JYXX˹(3xz0:52MCO)M9?c 8ß"h~Co6WJNw7q2VID'LհJƬeK$ʄ}N6X@…:|p$n@E~aihMZx@Ws +X*j>3h-],. f]vpzK;ƨ*s9͢7~*wf] R25|4 /ɜB垦( 3&ϘFP<ѾҲtYߵdiJNpQ->x`{:e; >E\!vKЕMY ln q˿ U>I6vZ-t]ـ/9xվl 7IIAxDX`zy PK#.IA>U6b<d,Ss TcAH6;zսnèIE񺦺i3ȖMЬE@Wk[؊n5k)@@o;R~7_wЪ*ԗkC3~$mƄȍ V(k4Xxi e+2QU6|>pkoߜ4k9CsKԇڦ~[%ujIZh,9bo@EP|!*YL|5SqI߁?tK3^ϔqWPնRsse2ęiVРJ߷$Z j nkkBd ky`.H^|WN4c$_\KG^k 8eb@Ó巉IENDB`u1f4b2.png000066400000000000000000000012521326020644600320760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|daIDATHKTQ?Eh*HJaFh"AˌZdHe9 aTT`O7@h܇kЭ~|%%aOډJ okyh_L+ S& j9IQE@qY1xj&$`YY4Μw5o3r A=SI,Ήpb%ı*@ @U-9؀WdrPZQ^9FjpKN!$$7:蓀:buA ? ;;HEAG eF -qzM{8LǚAh>\RD( ;ǃ,532KG715T_8" Z ֬r|iIENDB`u1f4b3.png000066400000000000000000000014651326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lugfvfrwY d4bJM[D+B5ؔ J'H| A@EI U# )-]H*$n\*Z[Yv>7_ M#^d=w")"{~Y~%SD!ܙhʑEdaC<p",W-'W9 $IENDB`u1f4b4.png000066400000000000000000000010161326020644600320760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHnP?[npl%!V(3:lx;J%T插HINsԡNTUvٝFwquv[B^QV|:Aױ/k x"> xU;8hOYFrFlzn18uǙ£ 4`ƅ$Y)Kϧ '˅x"/\42`^" Ls{I 2T5)u&)cǕ"ڎF4Ols@sw;1| ((PRR ~ʢ!AJ!KNbCėb⏽ݥ@>)sʼ+̻337NZF[kG\JJK [Id \D *I4vǭ욘t?k%ռ2tޕ.:!kC TM2Е.j8>8A~.5fzp券Re%þ"F 9*ۛKuxf#yfڰ. rۜTq@#w`A_^2i|ngy:xiUMf> |\w$*#(U)OOp47,5i a(KBIWox9< eI9B?DvbckpL63|/XgFE =4 Kg^~DE H޾aopyrHv3/ZgymS4q\hhCj7L MkG׽I̫1ՔOy& βI iSV4@۞ϤtPڻdjjHGl*хs:ṆԵzwL:d+X`,@{{G<>s8VjVMs dJ[u^XU a>y5@9].P٠71{ۑ܉ >U7W[KV('n6iXgLYbޒ+ѳOǭ3. f yMïuj&4O4Fp E>rqPw- $&'~R|8o$cqbUKW޾cQ$ Q%$'Np{c ( mA8xdO"7r6qDښѸlRTVUlJ&%dҜ5 1-f;wk~}@ {4\sL䤌MZal3$iQ3Rn"^ *qVm yNLkK,UyD"fV/`IENDB`u1f4b9.png000066400000000000000000000015161326020644600321100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]lem9ScF8LY8h 1%֮;d#1fdk3v,Q=@a"*,xlp5sZw}~>԰jH 0::Fȯ::,K=f @ͳ9T`-%e E6|F1"IENDB`u1f4ba.png000066400000000000000000000020551326020644600321570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[he}_Ҥ&=e],s(sHA\ WFPEu*E/DlM:nVXW]ۥ95&.=<}!W&ɒ0㡙s4k Z|0l\|dg}<}DcDo XZb+bP߮wrm t'?s-^׭49 ؛.VM(ˠ{6/{"Gz:ݓ .5ϥaնAw t" %b`v=,uCb^p=w@G^dAXPjSgG8aaRm]2Jf ,//`A!;yb>] %3oU\eq&I{WN5XnL-QAd>U dAiB(a`zƘ˦iɊ[4~;O_ؕB߽NAu a4`[0 ' ;-̾ [AbAU,Ua$r#1 nXLƴxj,6M7,yJ 1z݄BvdzxXi)UGMRd[.*Ϊ~#I2jQ멃G9)SOޚ;)6x T$,d8uIVeoXoR$!LO pi$7@$dWsхK|{áHfFz9Dk28}v}6f;^E Bd2+j(XNEɥ-W_\.;CYW7| Cߝ$ "mۥ{<{Ү["=zcD.z̸w@OcG/e[XmvwPg?G#IENDB`u1f4bb.png000066400000000000000000000012511326020644600321550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d`IDATHMHTas)++  jӦh!Z;[vMLЌڸb9ZBQML3sO Ml{|.,0Ru5TNq[X]'Ӌ*BYBnl_G0y +K}@_̒ 7ͪ)HBA+"SZQlt~~gFmt֍T/S'ctxelݞmORoct-V=SFø^,nn%~qt}#ܳ8H|[5[T)҉(@sxɈ-8x:2HXAa L^,-OD*5d g.\t3 5ymiq;":g/J*dDޙ܈_Q qUz`b'2E*_+@EjTakv޹teɓcx# 4_iaܩ+-z,&vCwV2P[VAEO3n(܃)%%|aU.mg Ʊ`(`K0aKͩ.oc[Aв+ƍ9Δ?C=ӄ_T-IENDB`u1f4bc.png000066400000000000000000000011451326020644600321600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKTQ?7oTVFTm BP#r%DԢ1\oQ1!*%c 89ΌmM3AqsνuI+Fn\9kEZ b͓O3ΪfCWvZ+2(51Ra,\4<܏1 u%,ϛ~:~dӅF뽹qYXlZkX~0{%S[ *ef 007Syp]8#l顬w q/%6-^ZB-˹\.vbc&}iOz8j;{X*gm6ԂZH?V-)'*Kp8VV"0m~#(X(2)L'6 D:mT6s)QT҃䏵%b}ubh,Z蠵>+UGeH6~{i?}έ @ 䡩^7oÙH @7BtC7ғ>{H1w iT4Aȕv5ZNE*cӺlu9Yq/xu (S N2 _< @3w<3ƍ?Ǩ_ e;'9#2 gA?E&Y++KX;ê,6 Nf:m(YLbe-A6}AU7@ LNvah鰊b2j3צttگ\#-1~}Z'?Fa!fɉH]⫏)櫱h sw֋>y89wْZR`,"(BɫpTos 0:⿂ꇋ^Sަu^Ljvbײַ77;I$[J$^KRd29iI&&D(|N@!c|Uɉ|^Suo;4>I\0-]lXa*,sdymYЉ?{ 7l8)A(y1:MjcbkW?݃1Ӵ?Σak.GbLC?qkEͧT?G޿Td306G>J=Bn}AWظ$?:J {Zl*BR>+αR~ ؒ5??į[7@GlQ!(!d=`S]-VslDx%%EXӹrQuXC Ht!c;dtW0T {xj>~Z =,IENDB`u1f4be.png000066400000000000000000000020421326020644600321570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_L[e9g` .^ȍFbDnX[%2`7$r53Me8dgV6d+B t#pDRS5UFH\>ѯ?$/qlzWggKU-k0 7>yiΣZ:‘BW$Q% ?`mJQpqϠ'Sj˿VvbB0E[8"Dm!G݄FR&UǘOghB H2*fk ɑTY!Gw =htQ*qg~d?9FcRLΑ^tx*#.t\xȕ 6`H\}} hB@fD4@QF| j'AkjH| `CJ\V]ŌMN]$%h N\n\L3ⲤgR|*Em!@-++kmA6E6XHL>0v?r.­!;֮$w5㔔'F(SkD#loF,PxmǦRunPW(_DPĢ_^UywgCk~tuyIU;M(Gb}6EDGT9d1\@g2= cuP* +z_w*t (8I-Zy_M_ϡIENDB`u1f4c0.png000066400000000000000000000021441326020644600320760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmhUs϶6\^j Y 0 T,Ƞ@XIї9(XHe1[9R#s$jg6pm}>UΤ *\ͳX)ᱳ5jڈU@4-G9@o{b&a%GMgŨt[^ ,8$4&jr6{ƕҲ|&0?t . y=4_~=%n'H?!skՀ?6dG8+i qoL<tBsn⛟#ci&Vy#!SF7Y i $dU?ut8, W1[k@]D﫢̨i::#)W>෰?~X Id)`/|Lv,)(@g:}G`9 NjW F~xပG|\h \# 1s͑]qvT`( |-8;dV1{n8l4TE{`+s~=Χ<R`'˯!@E3П,a @]5y7`Ld5c~Ԁw ؾy8_d;XIENDB`u1f4c1.png000066400000000000000000000016721326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dqIDATHS[u?\WIPbѴ:Mt3vaЎ ?E:MӅt;78VtT4ImB('%7?G@{gs%Jb%Fc>z;^21S#'>^ѧ>  "Ļ\ћAt}L)~Fߚ1( ҾP=H-&#\~m8l=QNy`iUjxA3a8F,66wݬ|q|{xvZ 2 A4>.гun φa~[kCfLz T4.ތd,Y䱭 '8\at`L!VJm}'ҡ8v^/HөB@Nu Xl]{>n_Z dqȪ]!~ S1gbZ4`~!*$k |TEH|wVESM2YCUM@SfZ jFDH/$7HQUp5H9RT<)d,1R. qocTFkԑ'Q2 J-pZK~)/li;z-HD e|vaOJ`ĖJcfWANm hg܅(Ei:~PU 5- ^K{PF_Ny}-75t;qgxzz`;pdq\/-42'ahP0di{vb6,,#Tqk?6{wP+=([5hc=ǼbFQRV@paagQ>a}ģrO,#JY ˱Z8d+}X,ss9;$Ï'T?TD՞hH5bk^8N[)M^A>fV[.Z^nW }٩g{{5w&|RsWD4Nڴ ?+j2Uͺ[PXR vudj =z}%_zl4@dR 3 f&I9|~ᡪm\޷Zi|D`R$IENDB`u1f4c4.png000066400000000000000000000010441326020644600321000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͕PD$8tjA nh]d}[@}> Wҡ R:v`RcriJk2gu8ABBߵ2MEtWp8<o 񄼵O#R |>ȧn*91@hLg>~_.o`d3h3w·/1VztBˀ|Z}0ٶM\ۼZ9fJ3|o.Fخ*~𿍠Wj̯Ya~LȆՠ)?xG4u]d2 }!R%XXX`bb0gvvP055E$霠P(099I4Z### QtG3r9?H$fdY* 󍙨j7QT*{+ zzz zHT;YST.Y\\$χZ88iLOOmy^u4}uOFIXdpp5ڶ8՘d2ٚ૨Q,I Pdu,O;9I!"Jߣ8RoZJ""Ck x 'B%4IENDB`u1f4c6.png000066400000000000000000000014121326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKTQ{5?I1tmR""pr`UҦbD.*!!r4)mH$s&so b㌓p<#],6q}~ՙ;;LKZ$)Li05rW> MuxV UaRgAo`$=1 aZR[FzT1@sjFl0N7UWwm+0M>oɅuF[: HD*3a.1׍ڄB^AHɳHw&sdVSPEj,N7J ]0v4#ܢX",-VAs] K]F{ۿ<'n&].Qݳ$?@Mη0̔K@ Hj !hn-]͔!7672մbJl#bl١\Sim.MM &{$ݧ,{HevtoDM^LMP Cn\|>.Aw?5 K# KX^Y8g ()8WӥA6V uUN:wj-MSLZ%(RA 0-1qMS xsL6,56V^$dP'iQ+IENDB`u1f4c7.png000066400000000000000000000026511326020644600321100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d`IDATHUkPe~ooeqEXH!̜ omtFK9ct!1Kj*!^24\;r- ,첷{!:s d^fpk/E#EhZ|w&StwTD.Z$Fp#8'Q3jz'70BF?+L9r(9SXb5oF֛`MώA&dCQ5_(L5SńV^,`&(2o İ$Β D܄'g=+w*IWnXLV&yN߮S-C@J ^\;6MYEB-v2wOV]l47VU_oGw_^D,a26}>] ^J_= %.8j^ g RTWOg[Ckخh0F4KHlzκePm䍽Cj u-Ã;@:z<H x#"!2m1RsDw>rX%VC܁sUژI% V5u4Cڡ&\7jnnh=wc /؍'8vGk0MM[9A74;r|-` F̎gDmDpN}Sk0FLy= Ism%JjX+t[C=`xUvjLH?gŇq'Թ"鲳a}{WsǵӅe[m*Wln&&*`o֊qqқ~ZyP t6YFLDZѩ /lm|YX\Lf$϶fZ @Ʃu \-~|xP2qc/ͼ"۵Enu , Cf^>2P* Njg)J~K--+'s֨"8yM@k?] HFܷ"}[ʶ'NA0Z8'y-Q 4ճcޕq__+(ڟ'0F8CɻMӚ\.(h2Ly;OV<  ?taDVz+cmbAToNlS RPqIY(j#כ\.Ŧ{!UZR%X^(b-3ǒ0HAU6AƤ~-OD lݰpV+m{JD;<N|s?u9 M%rb_|hK?{m֖{=_tS@nTmNG˽4+ xjm.cmmu|O^n|K ?@5fe'4׬W)ז`,̌|1{l\tWv-3J[%#GQRB՛$&MāBέZj`P3/7w{ 8)ث 3ÆImm+530"8c*RJ\vnWT04Z":]?cV6Ccڵ Pl܂WTBQ=4#wDtLQ"U 6fe8 o6Ā'9d̠~H74S*\b"5G/0.!SB~}Wޝy*(aɳ8K҂`~Λ"\ ,0ͣU Kɜ3/ 0 Z}X68#؏ocN9_hRJnj H2g'H[#Rbц^կUHpil~%N R4E"[ayvVl9`Pr\op Jy3ᗚ{hf?-7~ּJnsp !y,dHpgpl9-Fxvu2jvNk+ 9hmeTtD2|Iɜfe]B7#ؕPq+?tG n6WHC2)b>R䔖 `IENDB`u1f4cc.png000066400000000000000000000015021326020644600321560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]Ha}YNԲŠ"H~L42R". 2J9i]UtaayeaH`Bt!f_=rn˶|swyK&kmgR [c~=+V "l.6a$?>W,P{rTtX^Ap$aPUC8׆ 6xN{ƪ O!T т_]\Ր;fEo뉸H"=8CC0Q[vY:^8Bq(/3 }:cC?X @TN̟ ѭ%YukibSa5@|6OI5n.4r3TuL$zȡ2kms=gn}vf#Kk֭ |JMɳDzRlk,^UYM n7eA2l]-zMlJc/dRBː`5zΜ#4rڷކAPܶb .MYVu/s˚N=Y5}¾O _{B ̸ĹX{@D*H CcJ=aBAGdbqm\<%L2:P~N&N?a_һ .Te(vaΎ*IWK\kZR(X<*P+aܘai@u3_mh/ɟS!ߖ i"K[TPu'x+yIENDB`u1f4cd.png000066400000000000000000000013761326020644600321700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKHUQuK,M{aADBp6"*²BhЃjPAHA +Rˆ ɠ^LM4n{Lh}k8L$Og;NFA30:UմDdM[ˤڐh;zR vlgO&,кK1KBt-8᢮(G|.@tşnVCt2 6@_$Zli</c]%m *Iѕ\ڹ >m*c}Mk* he/lG ORZ:u׶7L ^VUG ̏ieQ-EX:v(ʲ8#Y9aGjm޹{W;g-XAv{nFʪ.^yXe-<nMR"qmM`7]RC>MM[cO"Ht պEkkl~nΰCwIENDB`u1f4ce.png000066400000000000000000000014041326020644600321610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOHqyfmabhLo% )BDR!IdnKDjmtmki$" uL=tPmY )m_m~~Imc@7T -Fl_qVEs) E T<.<752־ܙ,9A~|w"R^BGߊo6I4𫰀\x:*>Ɓ L#X"?g6ϴG p ɵI|6@onކc!a6`\Ђ۾B t!ya\MqkKʣ I9@!Z?`m,PPR=־,0xW&;\fTrN)f[y/9)*kL%7T"yȨ`=l"y\ٖ y!N )sH恊t["'@}JU7z/Qhщ. !?W@@b*p⹶ ,Nr~=g*Dq`![nK?EBqc~⃀ $byPFUl(E8dEm[-NvZOIENDB`u1f4cf.png000066400000000000000000000021321326020644600321610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmL[uϽQ 8 dq@- &-hv&Ffbh[,]/d CJ7!̺`@[x@* Iq9Px g΂ 4=7΍O^0K^ߞt] /xΥsq|>UVUf,#s6"!!Xl u_|-T~d0Wڦ>n9]d_> `Ej5ƫe$  {jQtW4< ?]oD#,¯K0iX:)V?/N]Ь/ O`slQ!RQXQFzI NI +j1V CS%:b?`ǁB*o> `[+чa=u;oTuXϩnw/EM]6:/Ӫ)j*8tZMLHĝ_\jpܕ$? Hz[ǝ] e 8/4藧j;ux/ҕ({\P仢+3_?( o`1 J u];@-!VO )(~gz5Z|Y Lj7a45IENDB`u1f4d0.png000066400000000000000000000021101326020644600320700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]LW}߶~PZK)m(¦ ^lKfp3lhLĻePbv1Q PH6d0k4n0H8Z(޾{.[ (/_rec_Q )6m묚.kf)%~s`(pߞE W#HHdD7 ) 6Cҵ^`d9`ՙJrEG 6VMOy1[qaQTۀI!N"vA=P-@ "IIIRo!Ys5$8wl@?千N^TQf* Ӿ٠(ByUr=4Yn N#H{F=_y.[q"t-CCC&TR)qb75ZouM?V`P`0TUzz' о Էk)sR3)_8^G8& hH$"!P䞺@ &bM\%W t~$5M[}0Fu\wxsii(//^sU_x5G8b[O+-H$7Ms$ v_D"8NQ\\g-@E<ɘ8//՞P(eYWWWi\.쑞`Кph5@uu5fI0Mszii3e<}nnvuuQ{ccCqŸvegK)0Ms#`Ǚ ٶ}ZӴ۶@GQ+vƮtQ#um>)xudd䏝_nKIENDB`u1f4d2.png000066400000000000000000000022671326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dnIDATH}LSWƟsmWKR>dtӲίJH\d(,b-!s3~a01!,Y"ӎplY#V騔Zϟ;oޜs WBQJټmɥx8 Z7w'ZDO2'RzLej Cd"yUA+M EB)OjP̯Ą>w(΁/-yBYʰ wU)2,Vb,B:L(ٰЈޠ7P̚!5 aƲ! yPT$/n3㗫a'p F6Q{O1/kRQy9,Ig;.74\6לN留(/o sH ?Ux&CbV߼z̄HW if9t:]sNh'Χ۱y;8M&Lzp(h{3 77( _/lsޠ^o`5.W?<,5tww HKKhmmեbv7US6۶{NѷǧxqV~znW U)o#*t!Uf -N(u@ rh1UWWTTTX,N555M˲L).j~ZVYeϖ ᠡP @VbEf5a,koݺտigAN|4EQ^~Ӷ?{ᢠIENDB`u1f4d3.png000066400000000000000000000023621326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmLSg-+m/7R_]q)S.2EXHabl~%vqQIQ\8VXd LE@`ro{}p(ϹqQ~=DQ<<@5^ -c _R59O큆@M'Ƽ RWjbwwt Q?^n"ΌGuK>b ͛7Hu:ؕ4)'d a| @Ok[n [,]bb}AJ',_\u9`g s P~؈l W]ik6ǎ u9!My GNQ`>]GXht)-wmݺUҲ4V뢸ݾ @E_VY,͑{7<6sпeY!ݞclS\@4=nv0ϕץǡm?+z qp8}L(JP8nv 9̸olD I(o*~}qC9fT*՚`9 h'Lb< [)((v_\v-c65c@D5#1x<,cgʎ;f,Yd:mRR('Q!_)K_6L&Nz;Үx7;*t<&XV\t)$Ik֬ q΋Vn '_FjǭBbDնمM7l0 s~nd=N$}Vt:닋zxe FPȧԸ!}|xfO;MIIQ:uvnnn,RuuUnjjp/qf; ` ) $?By'4M}%ٳ<c< :Kgύzf"*1Q(Kqw3O#u`zd*CJ=;@y/C}OM&6i - ;S%"P7e)'&wlRcR3=^,բHsYM]F.V xB+c$ G, ismс]%0reD5 ܏$3]XX533cҟx[u<~l THȯm 9aX?שp,E)Dv@9gѱ299Y9??$n~{ޘ&„f:z\Z.L3 u(!~nwc__;6EaaaJMMpOO<ݘChB]vMdڈ㡔R/z)x 6wc4]]]B0.]~.WQ]]}ϥR]γv9r IENDB`u1f4d5.png000066400000000000000000000012611326020644600321030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dhIDATHkQƿɌN*IZRqWn]Aw>ݨ…QJjH1((&qb3hlssf+OB](T.K.$[C 9.Z5xV9>}ka3DT.:q٫Qpû[vkPŵ͹CqMHvö8  goQ}i>Pd`مe(kM,I 6BB ^ X}ͱD4,g޷򪘩&d/͗dpO$OO'86u"O@Hr`R^*$`=@$](qA=@r\&_ޗK0{KuhD+'W۱Q-`@"%Ks9mrn3պ[M)Wusқ~z(j>Z~ru/bXe!d&IR<5H!7z<֖,ɲvBn;_[[[d2ub7`TQdi%t]_T*e\.g^r兮_zE>T*r*u}5j߿CFFFX__?ux__߸fΝ;d2I*byyǣqL 8D6+ $ (3>>`"`{{4q`XE$4 ^!D8;v !fiiׯ_iq)LlQaoܺu M8N ~R ˲_߿ٳ>|B@24M||>RH$Rٸvڲ7oDh4Z )?8 099idٲiVccZFm6MJWZVe>~X4r&"vs\eYGnzXpĉ/_,:vfjd\B ym/GJS_cRY! PlRvH) ׅ? !~BjRʣBV[ }lh4g=zdy?܈#IENDB`u1f4d7.png000066400000000000000000000014701326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_HSQǿg3bewC4llz쩢0$*zRDs0VAvwﶻK ԋsrXC[x~UJo&BTh(`u6rɂk#ycd^53ƅ$Q& t *`fոUڳf,% U>vg@qAb9ȲlruodhiEpI.I_1y3@d(54`Y*ZSVV&{@D6zj a9Xh0;:R = `xx q\kZnQڏd%$QX ۫aTՊڪ}$xX,vo-^wR):Ǘ=~zMbR)ёollå9j5EJ&-f۲ K$$pՋWeJ9& t-J{ڂE Ɵd؍'B94>*Gofq42dI8LC*5`lWp}ײ7jҺWKw$e4<1/:zz6%Lјri7 gwfJZ3Lن< ]M8g-3Z&1i\'P(+Mz<>SVoIb%F7^{c ??  @)Jf*ċ>e&mIfإ?$2A(+*4;;;p8d(ݧDE׭vYìîgP2?#^_FaJJJ`h8*Kzl2ETTt 4UB5OYSʣ`v$ fX, mmmD$Ǒ`MFHDUUUW7l6gl!*{<B!pL&D*F"DDmmK`(E(vZvrݓkir* .//k)˲r2tOXoffΦMf8+憊tw>~PGgη zIENDB`u1f4d9.png000066400000000000000000000014641326020644600321140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_HSqǿ6nnĉ#"VMR,K)Bѓ4I)zIL>YXm)K39/s䋟w߁P]Vf.+@EHXVFk}TMY0zȳJ$vK(o{4ҕ`!W3w7j^7W=B{@K |r( *Meۙ . %Te㬑M{]?e4pW*ۃ.Ӧ$QF:R3ivT&ѨLG[ARG9#[vV#`YvsfffP~MԾ,뙨o3t:{mmͱX,\.Px$-I b-B]* (a$kjGf vvvQ6_'=.nHvjgfknn~ؘ' d"pHnMVk~Pק{,mv{t:銊 yv%yyy 䃱փfbDQ̢( 2,!IҖVF~)6S[[ %%DP–IENDB`u1f4da.png000066400000000000000000000027351326020644600321660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHTkLW~KV[K+lU2PqiRh-j8tlYj'd.,1K ^q܂ܴQWt(;2EQ:9sKa IINHyO4R@=]Z ׅg4O,v xjվ[o,Py]OpJ":H&N8y )X:<~J)))sV+ƞ[̙(".(s|O|mtA7`A/*GPTyyyfNABy^9x hvV ?ayOJG$QX&ΐ@ xL`0 ]ɋK 饠ē/M3 ΛL%hԩ`d\"Blp.,כw9~-ef믐tvv“U,z^I KxX>@|{⋞pc 7&U, Ǐ'Ց!~b<=2 {}(,؈͛7J "$1'qyOB6sS (//՛h WΔ7a1>,TKduزe+p!(Jwfge 񠹹ǎC-h1܃U<8vȟ6az <ڍyXvV+jX _rc␻n=RA(BtfA.5 ld`4*")t0͠iOC&F(*/|.s5PTs!.6ݍZZZ#vʕ+Kjf@kkiӦ5UTT,ZlZZXEevޟ}ٌ .@UUUn{bx!EÑ!9޶mgchjjz7**w8[[[{833H${F'萐b J-;::~mnnnF?!!aL&rׯ^c|bSnIENDB`u1f4db.png000066400000000000000000000012701326020644600321600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|doIDATHKQQSsjF`,QD47\튄ЦUDZrQP JG4(. SA3csfl|v|sdQ<8[u5q^I#l,ֶ+ P?v^ x\ )AWH8`DJj DIvU|aea;Ö/:@ŹLB.!ӟu2QnjI-%[m6Mj ލ+1@\T!v"7JQ|Ovt>jR kn&ݝ*V mo,8[)ӟS3QܮFDdh2ї.ߦ,?]=D (i{r5 lՌ?u?IWvl J.E9? ]X M4zB:vƞN](@>uTI7YoӉgVIENDB`u1f4dc.png000066400000000000000000000011111326020644600321530ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=o@.8iZ"h@,0(# _ `D| vfLBI !6{| `79tq͏oN_{r;ˤȰ˨e6^8T53@<̡գ(B1(v? { 7P7к)*T;h]YUD# @YME+UYzV90Du;o|.ؽ' `Y$dEJ8 09Wni&-\@Bt閵5\v'. "p4r#2!C*qFra |᷒}eP1h >MQ@VP.MHio!tY;; WާC:V+ N޹Q)End+JĘD:זyhYfY TdIENDB`u1f4dd.png000066400000000000000000000015011326020644600321570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݕOlUo:i;fk)ڴP21UhĐŐ'/ƃM<{+MA[5IZ5blZBwS(tugvvlj [kiO|}{T"} YC(e<}^d_{URꍽk {>h>9L)/Ϳy.RjUl˲m J%-WGN \epp)BsV{ps3&.eңAg/YKZoh .L2-  h3gDh! 6{&k,֍K|:pĉgϞp;ZqD̀mܵ$JO^+gBwo aiڎ,'4SZ'4I)d2v <un\60@F>xwS/׌#Ae /e."[^} UeWS sl\r "xI C)? zRso$T**zʜ#?pF"< B[l&0 dMrFo9䦟 '(Wbho 8UۈKB(s~GU l=o Q.@ =˒b\DWZb o[RZV\0[X3FFmYYy"Ut|wiW,څ@tIu3YVW*\${R*@?Ǟw"z֫=AK50=]Ok`|Cz*\@?J{X7NߍX6Ʉr;\oySb\:qBE/UEL\~ĩ6Fr/KY>?)<#j)R녿,^4zqQ" _k~,}IENDB`u1f4df.png000066400000000000000000000015641326020644600321720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d+IDATHOlTU͛fpV6 ǎH%UH!qIBJ6]Ƹd1E $CbJ ͼ?(Low;/qM T-Ynn|oVvS"=Ws75:]EK^UP&`XQwTc'06Č:i*RIsD.0[njO|&9Q)k.ͪ[5[ӧ.?`C"igoK{[>ûcLg]yC ~dQ X6 xcbe- V\3I$#tvܼZ#=hV43.,_aa(‚f@|O-lRXX֕ R1dSO2j& Dbq h "`#|Y*ЂHoȜuzfpi dW-vd:bkQ(mƊ:r|Э{RRwkWZٱN`~u)7ֵ㮍IDz-!n[\8t&ۋsVWE#~*5kk H&Q6?=7?gZm$6ߞm}=|4dqyrSFɗWEAѢ;!"^ϗ+Tԑ:1 "M#w:aPjeZjrR|^g BI֔*.h,h0㹙/)5ʕևRr3vO#qa7BIENDB`u1f4e0.png000066400000000000000000000024011326020644600320740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlU=vGʣi&MbNhiI"TAAHlD*,B uQG$TTPi#}rL)}&qݤqb30IM*ĿιϹGs PWWW3'uT"2"9c_ DB}}}gYaf/, *ÇgN>? , CCCۇH$t:xz!I<z{{!H9sFW4k#G"dYF8HӰlG[[xRVWWyddT dl. a 8~?2`r MӐfCUUh!HR]X)V8vprpعs'dG1|EIJit]\.ghBܣECȲu +I!*FFF&zzz扈@UUUQǽ H-B"4vF^)沑#3y\ʀ޶;m_SE0eKWi4 9{'Bb %ڵ69ĕL:jwr['3 ๞ :NsUn4kΣNgks7&gi2Ms]C0N ʚO4EM$]4JP7nb&^0 , U%x6˲" J_}9[E,m߾ 7BRM<.  ;̼8xT(hC^r5ia!W?Gb. CFlr FɄM+vYT*[lZE3{UڴY~ݿu~/>F<ц7}|j6ۙ2inڪK/C˒QK?;4|tixwEf徝ϤʚZMeZ\^̵6F.,u,>Qz:aᷘ ol?Uó|C17$&NdV!6nOͩmN[(@Dwm?gLg]]]AD$و{WP,XMcIENDB`u1f4e1.png000066400000000000000000000025351326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoLSWƟ,t$0Y[j FnĩqK$Fd!d~ lDg|1e!f2u(ոk@4a+ ` R}6|997ӳs]\KR!{Jxwll6]-j®]6%kS{ O~Jl&%Eې"`j|sTeGGG[j$i{@Q>2 1hkkv<<000&tob6:'pd #<[2 JTz|tt/[_T+L(+n+wdIɠ6!Q&}-ҥKyO9/vnٲ?RG؁JlM Jt:qUypTVT 33Sc@) P$Z뽌u`׋VBVCvC.͛j;w=zl6+g@Da::܌ǏÇ8v077V(E@%9wHJT8L&ܸqǩS033ZNN\XXX(Z*CTAD c._ B`Zq "-- {Ydxl6@~~>hD'[ix", N<*\rRq j58SF (d1^N靏 娩pRH$Pdp a ('ݎZx<ݻw\8ƿUٳۅB! ۷PTGOO&&&xa[V3c v/. OyCSh!,iJ2 p<σeY~aaWPX;00^e1yyyYXbOD;Kaj| pYZcqnE}644Fѭ AUX/zM}c},jW 0`|b4>C6lӚ}$6SZ*4a3RI{kؖwQf3_cSϲ6D0*:_Ӱx)κƇcn)k`*83 n`,O_\R#Ǹq7!5JuRnhLNz=j. &xl J'҉9,(s7V )oeoGcES!0QB2z]+ zW8Dmk[\ eL! @b]W w~'Ű";˲gh~N)&Ű4*) 1KIbT?K2ѥ+hs@!88 [OяFwNgm6ے֋ yn/=p Ut}>W+yh5HeL&˗%2lU(])BںC`u(}[ppޡPi$F}=?DbIy3 >ÑK[~ bf=P(qMN!P>|.!B)ɡkmV'>gIENDB`u1f4e3.png000066400000000000000000000022101326020644600320750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d?IDATH[LG-܊JI/li h Q|J@4PmjI+Mo/ i"5`SI`岀r .|>BHu~̙!XrK;9dƕȓmXa)GIPB|BN\s.ĊKʔdoaC4ip$ zȻ/?̽/ς3) LK4˲@zBYPx+oȇMMc* xK֝~BJ(ycÝY{&kmLE}!0HLBQd(܅sWpM#>ulpl.L%I=bu@)G~VQ[w1%;3>Ѷrt?UA 6eh_rp_;`D pς)ɯ$%q ޿5@8"=o.W@GJrFrj˴)%qM+-HJK=aX9!O9hӳh+ L@GKa Wl0hŸtQilK89OBlR"B=&>50^ # p^JBkg >kzMS8Q}}}h 1vcGO85s =X:U+ݠǭy+@gyy7meEx`{'S4_MG$4@ D`Ph<}mv@%m˲؍"޳Ѡ!^okj*U Y9!u^IIAzp#nkhYcfܷxwwZ5x`r*{hwMB8B9Pk ̹W`8>FDZLJgGj"1,s3%6G󎈷yM ua91an&'l4_y>\'۹@ؙ]H0Ap/"|6+Dgn[К/2ި5WթO epIt}gggf >hb,{9=l ]gN ]g8#D|Fe]kzn#YSmCc]U&lj޶ $4و&Lp GU.#?g:ɤꪯ<҆ %>sZ j1nW\ ",LILUlQѦC1碩i_rJ¶$yEMw1CEka|yj,8i5ou,mj'Fǁ}e>ơ x&tM7D@\YƢ՜m)tّ/On-3ə<couy;g9;V൫kVVzHiqv5 ,'9"q%8:v.*-3n 9cWӜq'p:ߐ+eè"TMs%Yf)Ydb8j]n\w1$;xZhi1ȈW$[7ԓXIa{oػO1M?}~ej%{XnZńcKgBXр>+]à-'H>؟!lMNH7W19}|dӯ/G4@}3766zXs^ &l99JR@1`,>.pt~zfC[R/_ ,_|1֊36c]8dŦ%d1; .ZYPO A;udSXTmn ,N@1 :"p˩. Hh4 .JK]tH!}Pv.;%TUF&bYj5 cdemYm уCi_^z{Ulns߲kwK8;ƺ^SSvqd[ŒhzLjg9>2xتmfھq4O⍦ xRNL{Bi.JyV3{Guphm#}႙5բK\FaMz;.l4sL,\S~>;Kbr?;'9RT쑉+{֬+ &TR%K9LfC^%-mqv{mMn6Y*ӿn$r I6~F_=ݿ7{Bz/Ty9rX֘7U R4ǝ]Ta+OPnmISf7YRt;",cSeU8].YuK<7<-V蓍*Y *^owM{O桬x_ :[|÷5;*eTR8k9H!<)P>tq[Ke>=n[s7H>, B-P !(#L4< ^QIENDB`u1f4e6.png000066400000000000000000000021101326020644600320770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTUs)L(2J RPiKYQwD'J+•cB@$ JZ,B+e`J)2s\Qb]~ ! \#Loݱ{D3b2+jj S56 E+CJIk˷6|++ެ,ZZ!3mqhuf Zw9)ABUk ҕ/;8Cjt%zu,ݯmhݐRN) Șj?v=t9؎i؄f3#4!4U5>B1;7^t;۽ۊHݸi]cwgJ!07*P?++:ךpIWz}k9$mo"oJKGg8x4̒LX$J_-Ù캒ÿr~&)6Htgr9L@?]K8Xs ](i$);CsJIOhncJM͢v C$306OnY+)eBA-x-{\p蘣 A"Kَ(-g?Tp)&/ ֙ \@%}ё PiXۄye'r>Wr' ~4>ȰTsEux+m~L=,(U&IS~rz:{,q%Ф]C^兗sݕ枥(<)n)DBԬk~בkKZ7uA4|ȷJX.9RSJxӭ~aPÛ_>f|RWjd-K #86®J`S\6Ѽ-H%z]?rX.ϔž%!mfEm~WWM JUx ZضD 4Ԯ߹{ wie< &+vE?3QAi>IENDB`u1f4e7.png000066400000000000000000000012001326020644600320770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d7IDATH=kAޮٽrh `RB 6b! ,k'IoKRc|K} T!jyNrC xyPK^_[CR Aa ~5;noBZ2dZЎ(m(WG;Tszkڨ[_{Px;6N,lr8A(5Go%- !gg3e|c-qj\p;ɋK\ƩA,NmZRv>D6 (KQi0HSpsQ&aMF"'Xjf(Ki],6)Y+tЪHZZP=ԚzZGMĵ,)UWߴI1ё@eqT=QP; {7k5-|HO$j[IENDB`u1f4e9.png000066400000000000000000000011521326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d!IDATHMHUAνC)KThgDAZj٢EQyB(\hʄ Dڤ6V% ѧe{ofN}=?U"pfܙB3U ;b5uA ӂs}4*s%_;B'7F?)L&zH`թ{ *oާ؃T7ʅ̡b]ϓW^ו>qj!{|y%)׋?w =0!hcRQ2~1DE9=dmʾ;B(Fސ鞝2xDD U S|嫪2.j٩-XS5ڇE%9mkW!PmkXSYA @cmh\ȴ߱9iAEnTNDvp`YubGm\L0#7A7ԓ\+"^jG_L֦_U %y5=mS_=8Kȋ0_ êzIENDB`u1f4ea.png000066400000000000000000000017151326020644600321640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOh\U޼df8FS*Z#($֊VP#R#.T"HERW, "qc)$hkJ2Ĩa2̼?^SbI~|?9+1hU ճK {-@4KkK{*ý~&. x繝FmY9gM^SQMN@ I˘Ԩ 9e2 b|7PpF?f(T$׸e:ܹ%;ȈΩoޠ*a`\lNRﭛ_W7Ŏ.W[sҾO8{  ![skEb m`b@W򯪃e>wI!JXlĎ IENDB`u1f4eb.png000066400000000000000000000020211326020644600321540ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[Uk8'1ͱBKH桬 -)l(z"H$&"^z.C(+{H!6#53:sw۫i3:6~{f-amuTIM ۾!#u2o<|E1|X?h5L3z OmضZw".]|q8kG]=.՚y22jzj3J'd1pz~;HOF|xZ}m.LDo4Z#>RؿȆ K>Eo=0)/*,\Oo[q܀I&`b,>K=GkSJIE:]cv7(WrB$85)Y]zEQ"ff;`5`=ٞ}n̞cq<@W( 2_:UխS=a3z$_ @0?}}~ݰV 78!MK۪,*,ipxJ?8o3uXb{?/5TkR$&cۺ`N6ϣ(P" (91IfVu`0@gI߻aADUƝ`**Z won-wDJfG4Q2@#}ﭥ$:~@ #1U߱C1d> A$*HY#I{8Cj"5tEڃR77?|zZ75o.[Nś.sAyO_:"B%c]gF,`C).y^D'tA-weq&Nӥ̱sn^\ZZv{I]B4p냏ÞWq͕rj\o|9{E/7q`㝇urxSLNIENDB`u1f4ec.png000066400000000000000000000020561326020644600321650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[h\E3粷=&KLcbH.R[%nbeE/QQ|iKAjA66 BТH-jS۰5&}7{!v7ۖoo0T=. x`b@>VQ/F}&~Sڛ-ܶHnM]IeWTU9s  JŔD\kD!qNz#aLŒ\,[d N*ES CvfW1S#Y:D[иIdp*[f5H6͇ʔNs9I6(KfssB.յYkQ~$8fЗj)4rZ :}s,M=ѨTmH }mI2at{X6VT+Qx\yWŘȍŢ)Af:s#E9m%#Vd.!>]rNisN* V X.:C,io{ *Hめ}', l+vuẟ1~(IENDB`u1f4ed.png000066400000000000000000000014561326020644600321710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMhUsd$^ަERA R+ EEnk n (XBhbY TsoELw2}w39|9pObx@ܤ2ME"dh+jZrȮ_;QXX& AR9sVbSR_2~~$o$FW무šΨGuMQWWtOLD[ Yk#=Q_j]>o6MpTsdyc |9-k#v ܗ`xx(vt ,ŀ|SչYŚj\`n R6$ufzVS~P$_<2e5ehf3I=Pt׭\h6FK6x9ENשla6q;&[wmD#{3vUz?Yid+.U[$ޝZ)mz_qޤ/ã}|-?Ut[{#){ˮ|c (\nQ^=U]I߯ 6o#IENDB`u1f4ee.png000066400000000000000000000024061326020644600321660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoTUƟsLgtN7VIJkHb @ 7@(B$!@TвYnC;rs^?ֶ3s}dڹqM"`XDLRL\.CW ns͝OgK]>'5' u$#k|"J~9eQǷږ.01hOѓ|t. سaD4 TJwFjcW)+0=~P?'~H @b- >^Y+չ6څpV+} [U`ZP .Ic-$unx`Y545'Lp04 ƀtJ>M'pAaܩ*o;n4߯&H~cliFS+G@ 2!wý 2uHt^` ^U a1)-aw0%ꀙp CVK8>){*xs`0DSffj#H#o1@}"AlF1l2$k7[uάσYA[#N %0l\Y ޻˺4k5>Y*7;1gV _D˙9&  Q!!3 oJgX4rpFbR2V rݛV.#!A Zh:3ݐC) ъ0Su<Än[FlhULF@7>OvuT_"2IENDB`u1f4ef.png000066400000000000000000000014511326020644600321660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOhW?o]1ָ̮+"9xi+ hы "z(zhDă(EIEhZU0MH@LbƃqM7kIz,ͼ|7od vl@ez}hS_Y@oVܤlx 0ўƢNT|1;a{ @5hi']$Pϫ[2fߋr0*ݚՈPn ҽ+lފE)N()ُ\X r]]@Q}>n7y)@czg]]ǟ\IxlP]\!58l|fLhǀ55-T"^)849N;}rDX DD)],|Mw L5@ԅ>hC^~-|S$9 #H6bM\:z}`l}41c-C~B|fr2HNo vV@k\.s¶nf(:Z9'MD<ܸ:]"Bk: =0$|]"܍bƬvމ14EKURj=r`2:+|V/_">>t? iy %v;6<vyI@@ᮢ\@u`îjF.Ζ (!tIENDB`u1f4f0.png000066400000000000000000000016021326020644600320770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d9IDATHJkI\Bvf:h&$-"/G='83_I#8GҠ@-mm 1;} F;5۪E-7eYZyR)H$~oY'ԏZE)RjV1y(9y x/ORʄ2 FY^@`'%,bvvB$7vY)xS ;;;pssC>X,R.q#!\m6@p8L.#JL&] ϓNd2~m&꛽iZ4M鏛 ,JBRmlfdd)0afA$^R3 `zz%L$Z80@JI>jR !h5J)H+8::Rl6$JV\__) rLLL@X|( 6 T*aL4MriR* dZl6i6  h9??RP.jA6eyy]Ba` w L&YYY!"/...V q0MRJvRVmZFq}kkkRR.q]X,F,4M2LКUDk)zyxןz=zt:t]\ u?l !qRuHa|92oLBԿLQ)˜HπQKIENDB`u1f4f1.png000066400000000000000000000010001326020644600320700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHAKA3ktcdcPG5~Z7/ BPz5EhQDHBݴ՘nb༱]77?oU˕ $&@$nG;zڒ+CZ@ַ^t+ğ6˝K8[W@Jʍ"Jd7jج]ϵϢ)F.Q9ժQ9P IМ_&㈀ ]d]M-" 4Pw :Ţ}[X~.[ T"OtQֻ狖ʢ6T搷9XzǛF lTj<D+ǣOJoHh;lTjԵÿ M 6D `goq$IoR Hg7t JIENDB`u1f4f2.png000066400000000000000000000012121326020644600320760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dAIDATHka?]Z/6Z*], TpsprQ XtCKiQ"\Jb`[{rk;|x~</d  wcw. p$u ezhxv_EKToGqu @ )V˻ׁ8֋.%"]qz;ZWQ\"66W dTn+p!x.6'Fλ wSplC x T)%7M>3>@ ّLjs y>LgԿ Y DN[?Ib4T۽> RX)Rv&u?Qy@F&Z%ʂmlAg^>0`(KysS0ϒSqSHLQY4C! 3Ea=~^j;者 5 0ݷ_\H.kIZEԸb¤Q.4ASc5$`L0ACkKIEkiLgzqd$䟜; 8܉D̟'[f u[ åqlcFb=w&eY&ϋD36Jc' NėD*U񎆭mƒz "C*r;g {N,55YQ3pqh]f_@y-OD =\og_`&Ŝ[=5h^ jW;}9v(ZKfJ%`r95R} @ty6 TFTXYԻ0`>~GΫ ʨl.9LX"8"c*U9P Z -szѽ*4HW~uROXWR߬Z4o3pWNٶ(9vW4{UAĩS7wcK ŝ @̗*\;}Q6Q0:bx߹0pYq"ւJO,pLPUv#rd @GTuOގ+Wd00ӟFVQɊbc5G[T&e]svrt8KE %M ٩e8+|y/ɑ#+$iSJA2 @P4IͷKٽU.oq˹٭K :.Әg~"MlD'}㞼@v X/ow2X8.ߌhn.;2e_BE Oal6x:V՟-+4Zl am+LE/%4jFAO]SuZWo(B8Y @6!F|q+/'y} Yqt7Dra~'֧vkl|%r20~Tn5s%~~:xa4}xY=:W㏎6oJ&E5Vu!nM]4 ǣp< mDi5 lxo"c3v+0Sb4 r$7н0n+9 : DՐ/! ̸7le8H12<^[$_0Ϩ0 lDzޘuZwJJ&i mu]5POyTd^v.vsɏ3{N\ .Vc *ޏvCX~Z6 "Mj3}$͐I~C\ɅU~NJͺ Fww¹G7p!VѺi6%=IENDB`u1f4f5.png000066400000000000000000000024721326020644600321120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHklTEn)tJP@1!`j (^Dh*HT r $1H,JÖR.][{;{9㏶zAs9 z IJbpO0 uXl/ rOݦ * %{%4mLE >[>b4Ga Ŕ @#"50&- czq{4N}bYjG&7h@Y}7hI6 d9WKiH: ;yTӿZqߌyp %+oc@_;ϗ ޖ6{cLA6m dJg&Ԩq1"3ǻk^OFX-hݹi8҃>kcb&gb,O:gYhz;N6f^H ٜ #*5!v,E$h^25a ϺJlCJ6>&;276pqLH% ͮ@)(+RP9?k+9y81/ vt KGBJJaLXm1cs\bC4/_!v/T@gh{fa˿ Rx \9݊[2p}reret=[":~yA<ܟ|i^WwKH;@1bQ|o/t[m*o[t:gz܆Tނ^OV7X}]Gy)4m@}]눞K>ҞI([ƽ_ )U8Ɔ gCK4D?H aU IGhoNn=rsYqj;3j#;=UL_f?v'MXLˬ녹#:e{H37B[,IB 347cZfۻxS#h&H%fKL *(+܏n)O)g_3x0PaiU]QǯA4CY|qig G(}(o){ miLj(l±} }'Qy L,] ,%ߪV7(42@?l>Dhf7ME|g~B (Z̨o;A8X`lCM۩A3_ DV%kAc\z׍q#ˈq54QQ}mWX4ُ4W RnIENDB`u1f4f7.png000066400000000000000000000024501326020644600321100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕ[lTUs3Bu 6Ph*4AA*|#&jh"*jB4Q# (cx&^pPh33Ü}zZBuu#HȲhkkqotO"5I!.!Ȳuh4(odhl,R$E1!$I,țZ2o a{DϊnV*rs@ &bNҕ6 m0 3b` $ C]D}|'LnBtȲ: '.X-P5sFͲ_eqk.:Af-YA2ݡ{3J&y57[X6_wmCQU|3@@MQץ2'¶qh:lLsR 8XjAAY8H2ɬe:q;u\N|S♐>3t{1#UUVro^!x 8~рPP>c97zfEg%MN¥BhB@=PX [I NoNj"+{a[6TI؎wU4q9A ` F}*ۃv•34{mzpu#Jr̟D/l:hdy",͞3'n[VZ@4⹳QRRi455q rv lq Ñ84غCz,hDŽ"C8.xz.NPSS3&rwEUZ*wNg$Ï ERť~-Jt1kɳ O=*6%:+rUҪr8`䮬Eޒ~ e>rNt)S}zez#+"u tPrak@ݛ66ܷ*++}.l9"—˷d4C_ZάFIC g W6.QVfUUBUU\fts\:;TU]?\ΓTґ1Mq8X7[?x{o@EEE;$V#|e1'1IENDB`u1f4f8.png000066400000000000000000000022571326020644600321160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dfIDATHmLes99( (沲2ǚ6jl÷V~}*PkLqZi[8C^B$t#9st}]w]}m7ߒb_Yb+Ho_r@wUZ._n+ߘw?aW.*-Y5[\ҭw{Ꝛ¶a%2sc Dst'"x+n (F;X%6#pcIފiWxT|ٔJ@&6cSM3uƮk|hb{ BWᙉqdر$jaB}~W*$/4;XTm RdSX%YaWLI*F [XLCxOcc}'2cq$esk۽,99YD`#i+]=W6n=2#]fa\.:;;9v8V;O>MHt3pe&)-1q:_TTTjdKg߱sn~KMǢ"MӤ ۏ4=5Q|))p;vAJskvV>Ħ Bv*D9N֯_ώ.~D7RL>o8Soe娀RPy(pb>>B!% q$8HSicoh6е  Ǜ>6&@UK0 lQ986.0F(4acFyl6ݗZD΁K!!zڻ\8D"G$%`0Ȯ](~.eMIN5!i4JNSӝ SA<@JIss3ذ V #|fv ֭-z5-7gJ#wr,-ŕ?4LKU+Q=wݞn5eƬz$%eͣ\^ЀA$a/EKLpijݍ)}b9)H%|r󑦉%}jY7'oW5EbJ!&x24yxs' 4޵GIENDB`u1f4f9.png000066400000000000000000000022031326020644600321060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d:IDATH]leۮ.–ёM `em)80!ML4QQC7$\xa4D2!$x {KdV6m a>A⊺/nyDcX׸"xrU 5M9 zJ3V[55(Ed{vezƟNUulnڅ:G/(IʗdiD"IYϟv'~'I[vDLQ(HRz00z۶뛛{ʹ !϶Ϫ11p[jըwys7m;/;nf'EcU=d@ PhI|N5-"_\u/C֦X2r<NnI}hL&0`455ݒlE._YH+Y’>>& C5H _!|*`yxub6uU/ 8T.jO@.";@PqHP0.44ŀ!ۼW3dXm at%xTh8儥qak^s*e<YuMa$R*Ҥ[V]煟1~hZfѪ! }Vik?q^\wiV뙋?{%/,{{Ռ$I2,ڞWE:*{9w= bBNdSIENDB`u1f4fb.png000066400000000000000000000020231326020644600321570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHhU?yݽUKRVZA) Ab&( Ö@0I?Fd )cI~̩,vs'Z_'C^ĩAA`@p\(2*Iœz: șDE7gNee\(JnʖF:{(+"mz|ćg5a4RM ]L+0&R6o"EHj4Ve~3a%q.-&=ʽh@)p1vQ=:.0OniZAf)T0 &oE7x wNbRL:*ýýV9vj%575z5F4gBHOeA:ㅄ APۈ բMDA;cZpǩ0 h2ē |P>f/7P/[Iktﲲ0 $IUG0*@JG*6InēPJh$I᠉ޅzE ?4FG-=!s(N%3@Sm=mQF?](2tn䆠/dW澺 Y DbWgbyVXз][)E[bޙ 95+l7RnIENDB`u1f4fc.png000066400000000000000000000011121326020644600321560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH픽kZQ=~AA) x N:AB&NBiigDȟQ8 Qrh6Cyyy_8^EQ>:πxedQUUR^Ba}C8P|t]0>lF2H$bz!L#z 9;;{l6KUUq8T*VVEQl6 C<ш]vvv"T*}b6  N999a:R.988xh4JXsiK2d^SuՊF DbA qyy1EQ^PVVD"R;+zB9hr|:B"T*qqqAUURv;v4K)u!)S abf%4!Oi^3 t:__Qz2IENDB`u1f4fd.png000066400000000000000000000025271326020644600321720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHylE?3o=[ X,(TXbB",BhF%!VŶWKm=G1X5o2dyoAnLƴQ*C6K_~ cMJmJ{ ON^ 3uxz _W[GǾ,Ur;!Ozoߡu˥RF YKdᕳLqL IO8޿|f뭯j8Rx'7<3Z?#xb{oHJO՝64) ‰9R]FlxecJ}c+kk'gS봣wEK58])sQuη~:bX =DHϒ-,vgfvze;48㲝fw;7&^Ksw0ud.;O>5'b[ X5iAu%O)߲ӡwcO;ڂNXH¤+uٙ7}7TW>nȘAڒ@|/Qkʞc,_tcQ c3N z5X  ~I6Za.8K{WP$Vu\Ot+}i Wt4#2y:7⌗S8h>3|^~mKL6.7>0.v3fiM9| fz|W+g_ԑ^^W u dɶd[o*jd?'fKtMFBњO~I?BV]`@f$-F Lѷ`XAK|"-{8B֤Td J)qf+LP*~#= $ؔCjQ.,F&U&;y,igv_R[ BrgIJM)G_v_)`A`Oeקx*x!v^;短B [󲈶w(EߜctA S_B),J^K?tfWb#&%i#tZ4ul]0@O; .>!sؤG!2 4C'o`E("6)8.@E3>lqظЌ=J<Ϗv J!e3J5JK'SBM- eLWO at[S?h. X?kܾVO/z%>ǯ-nOM+IENDB`u1f4ff.png000066400000000000000000000016711326020644600321730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dpIDATH[lU}fjڊxDPZ >x ^U⥐:S`f$iLƘ`IU3M+FP#b`P PZ2>Ѷ0thk;6Ral~0 /vVt{iui9xf-[b!AI>cU(F *?W(0#W+}.ῘS_|q뎒hu TʀA,C9i٦B(CiF.M]IGz`(FuY+T3FlsİZ{iʺ.e6¨\L#,i**\a@WC/{_a BkIEO{HߩP33.baÒko?5D@;@CЅ}Ty u}xKG=>k e[Ǯ`ʤlmx6C;7LS_d9=t5\Ԛx& D]WW:0x8sj^y+ٿC7oIENDB`u1f500.png000066400000000000000000000014171326020644600320160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOHTQƿsߛ2slIUH"0FߛIEQEFD-$Z .Uv( d߼@EYFjrflOD93{orFG(Էy ߐE{"&)V00'!|jå6\ *_AxLLFOHq QCqdA|>+N=u?*mK`P)u9-kGH^|kg; O2UG5o`[h'ڲC6βq Hz9豃&%*[1d /i4$Lo|:詼"MqܴɼW`n$ԟRaӼVʘ jʆ@ 2`[ysI2e قwӗSډiEHq _rrG4iJ~7\}P^F7vI&4,8.'񲇞`j2 rܫǼK6PfSauh(0X<^6# VW"99w ]vAPl$-P5!FςfoӝVN%RopC3~=2BOUhoD*sZAtOߎ|P8j_20[Afr*5$xj*p15kġzdq?08bIb0u"3,8K0iʻ'+"M_LIENDB`u1f501.png000066400000000000000000000011731326020644600320160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d2IDATH?hSQ羦v?A NFPBJ]tptBqJ{)".]ĪC4 -mqH&RESs;߅{aCC^*s:9۳VͬaRN~Ŀ1 v ~ٯV3uMsgEh$h>Q] um]smygnH"5JO-0X>ݑ6ˤn`Zۢ0@۫p\@crcQ/ɑ菰{A0**z&pe.:Az,\n 5e Q][>5í}ٸ[h ʝt&+2P =SS-D}~UPjc+|K[ØS9>>+|ߖΖ b}CC(qZ^*`CP19) {^@C1y\2)\Ei͕3 2ZRxqLhG󧕽RGBQiMA+3[U\$L"^ح?STorchR!5 X:#XdCO ĝDIENDB`u1f502.png000066400000000000000000000012551326020644600320200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|ddIDATHMHTa3w" +g`J\H-"qhRP.$(ZPh#"J( {'ˍRjџ͏b(NQt սs8,_(Fo/"TO%@Ѝ7ydgvԋ'~DTG*6πRMpCw6|G٪:o Jlۉ! \5xފl_LB[7!I' ]MU%z?Qhv8an7y$?a;jjpM9z]jqۍ"m76rcWv^ ܘƯ\{Y&i~Zѩ tpxڂ>D||7T1DSr?OG =uMg5nbSjF|_*T.'HBp)Io wJflQ!j|>Ꟛ2s#J$y%|NL$}Rtrz]3s Ry /,OSɴFo ݨP1.!CNj?v.&Lz-~-R?5+W< `/sF'dqrQ)4S- *ra s;WSRRnn&ʹ Ō}W=)CWͥ> ":*sa,>{[ޣ^]SQ Teawww|-DRŜ4g%&I+()U=[B+ Dm mP<*3^9%h1ܕz&x0а@AV*i'aT*CSj\)ihV$))U./oVDw@_ A=~3>`H ߆'0NBN\Drbpj?NQ6:j7¨WS鶗z7LZqXHF$ߓGDҮ׿ͿpZ~MCC)IENDB`u1f504.png000066400000000000000000000013641326020644600320230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOTA3lB!R`!]GeD1!1Hv&GbRa]A0_BYT6Xxdjw7 J_Li%S6۞ݲC׶,;e!B*^Ҝ}h 3u\.ɫN ™ː͙p^@aRiLxm Ɯ @o^jDnر[˞nT>=q'%Ys>GT߲SNr8S= 0 O2 e[+dieO7N<.@W\ JN_@R^|aP/PhsҪZd}dM-}JPn`U 'uHbr-fnV'% ,HU,;ut DIENDB`u1f505.png000066400000000000000000000014751326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՔoTU?XIfژ 5ؙ4 &-%nTXDI5FW&Ff ʊ`ŘffV&`y}L7l9{9{΅4lǧ<'4Z&/{0+rXV+5`X ^>NcEX=-j_N 8W*j)/=O=-/(ǟ rfz.󶤙-bWdp\i~g>'uB&tH)j -; {0ދa%'|n ;iXZz6DEzY}|*KKۗ'^N'ƀ3v4ݼmz,-Z}|Xt.|`NGd\SW֊zw1=71:Sh<i?'-#0ں2yx䵵k[*Bp. OE!tr7og06ld\FE84MNc"3t|󃶽j9=OZ>+-ćqh܉KU'-Bv&n-/ѷL"&[4r{]LŕƷlC뛰~#7p;zޡ Bپ2 ;;лUv6ƽ?i@g6< I` 6+KPdQ+^яa|  2EIENDB`u1f506.png000066400000000000000000000015571326020644600320310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d&IDATHoTUKkB@SIƆa!.t.DC1]Aˎ/;Z !6-&efRZlv^7JS߽żi;<2x{ws =ZsqU ^/~WCa Pz0 0ʍz&rc.a t!z9X0FTTׯe4 8E~ ݨr=F٤M)b'JؕsI=$Wl գ˨̦C\EG~{*Q%#\C] !W E`:9%?Ձ5f{"W^.ˇct\JÝJ.DO10]xۈ^WxOJʁG}-w_j((1Zf'fa:"! 㼷W C{KFb8xf\ ץTbGqƒx2@:P4CS!cZ@f +SVs)+_f+q-尫$HQH#n^ux>FSVO64`P*9u̿|_s"h-cI5Bdedlu>m+`&GFdzyc-D߻kpF^4-U#N2SFѽD}TdnM[b_ZIIENDB`u1f507.png000066400000000000000000000026541326020644600320310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dcIDATHkLUya 3L/@zC]@ڍ-jM̦j.i Ԃezeaf0eҁ>{s#\)FZhS (QB]U^NC.1\_@gc]) c0ܳmt`eL)-C~N[y:qjQ֌DZX%lkhfzY ,//d|qg=ty9=JM" |_..K1x>Nu 3E+0˱PGw/g3OC[IDw:GR[`DrfIMpOex4#Yܼ,S #AiP{.ӦݎEN_Mۛ%Xqg/him j{Q~V,WPťtߐH:i)-K;%@RL7_/0WOƾޟOi3mEׂQ(@Q*@d$ l 故IF8Ȓ/EPʘ svOd_4̭ͻMP"}<.& NIpzl< p텻cݣlt >ü#?shkϦ/4X݇kǎvZwՊ .w Vӂ ?SΥ ^eSQzddqX2q]}D v\U>~t閯>0sI=9]'5LiY:ps|i c̛{ YU7b-qYF 8PI1*Aќ(s+S1Fz)OrR1dwg6y8u?in*?gb4eS,l4Al\Ip,߬4 {=AeFMJ|cnwÝ1%[}Tٳzϵ[FhTr8ON9ũ8&;-}znmND=CMGc'fL_im.it1%j)"=ЪT7t961\q IENDB`u1f508.png000066400000000000000000000012751326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dtIDATHOHTQΛiRddS.MFa-EfS$-v@MT\H*JnELjYi޼Eٝ{{_֍մ״wU$&|cccVқWt}xGUT. &mQiNY =y;E=SZv!J>{Pҙ+>S 8+Oi:R*r<켼_yQ( '}[/P O^fntUe9[kv[8{QO4AC#k dGG=44TEj+@R?a5~֊0DK| J0{vTi} m%β *Tqb4]<=6*= %E ly l 2flU@}ɹk`LZciWE=(> |Ѹ{3K}|6nnYK>> /3^78M1~K e=Q9qpkYjۺ2@ʆύ nRIENDB`u1f509.png000066400000000000000000000014611326020644600320260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOhTWI2Ɍ.*@7a0Z 1,NX*+$2Hi)SD`bHbADXbl$;]$oI:W9=syB9d2Fˊ16O$QثsbIuWWWW3a'':։z 8ήwb"}("͖v.@}KEGqhIqmKoiɿ2h(ɔQ*['N5!,Wg:m"ZUϰ BcdheӟU8-#ꁶ+:։ w?1 \ϛGn#抜NV〠l})6`΄b2{xb1 i& @U$/@u O,“2o彩3~*hYq,;V BdR(//of&3*G feL x8gQ,Hx^iMMM~c7Pw $6=XSsMktd?Ly O;C0h-Nyh,$7o:v@ }6r UL!wł̄8ʪtiiՉVWt(vњ*j;t Th__ߖ+Vw 2,($`ɳaX,S~IENDB`u1f50a.png000066400000000000000000000017421326020644600321000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHHu_vn57V-tRٙK11fdԢ#E16X.a? k&S6ŬӵtgczwKw=<~;{ ݀ T|E8zݤX^Zs}EEEc@ X_9SahCX2pCw'.^|X v^GAcUҠ!t'klyXYGl*淥)vz6&TXXx?ܑ( zs"RP5!H׀"۽ [_i xA[3z(Eը/OEj.kҳD9d[ #"ruj." [rB~]cuB ^`@Drl4R՟A7 Yw/u);I#0 d?>6Q_IPQ!m#\.դ%I4!wNBuOBBg_-˺;y4> `Ag+<;.U߆TgH"􊱌4%mO(v-0 -U2o>"`Z'= òC_,Hs:ظ $ 844Ա/&2fJqIɩyi07Y?JwJN; @ck"c6ENվk+g\z3D5@iwӌጣWI[<>-AH+_* 9ϟpp*NJVZCi3"X4_Uhuru7R{5P Xy?IENDB`u1f50c.png000066400000000000000000000017711326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]Le<~!")( ^R̭ܘ6jm>[N:9VNж'6\S\BIR}"c$~W /u:4j1x %I.2{R/;|H@5|Y3r98Owţчqe@1پfgƶ;UO$8F_3˪ԭ Y(Ǖ*.Y P((p{Kn6o}2s=V0{[goqs>IW ή,19#0Ч)*{;#f\?[F_E "bF5-0+˽%O)Mp0i׻S֮D[*E WO||μ=0ryץ.3O`CӟEN?O>hx.ZjDCE˨҅cuw̴~K( rBmd@5S'+έ1{d_<h5X-RuT,p䖊JZi*>y /%I*t{< ]X:EO~oNj6މ6Wjc'XSU;o[S(5IENDB`u1f50d.png000066400000000000000000000015601326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d'IDATHMlu찳BShS qQlĈ1Hb<1V bZG҃1iD jB4HAAPXRƲd;tl)m>ygagw th4-Qe8#_tuIJ/zCNOxujA޶I(E9\sDW"m 4RK3uyhϥrwKoBD- cݗ_`6|79ſIDI=[ğ"߹lxQL//VATopjV8TK{iE5U~v=,Gt9RΫ)T+ /mSՆxY+u7VD4#Pl{tAZ-hhpɜmW` tNRW |&.p.LE38 =sc|*y)tʦ(8cW ScmɬlW-_Xߟuc-lֽhHxSȫ{- s: x}Y7 "Tm67?ؙHߚt;rѥ)) N tw~|vq&{=3p8W0iV8pV+^'5ZRg UNPTv#dZ?E8+h2D,k8zDN `F*6\{d"d6SUN ~7s5]IENDB`u1f50e.png000066400000000000000000000015671326020644600321110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d.IDATH]L[eᔞRm:B$"1#03MlōYw?RDWFxa2e eC64VE~<^,]:v%}<7=*{9qTOY>)6ͻtܖRd9g5a!VE aB0ym[,we2oaT5!ʛ7hM >sx"P=ݯ5?XoNx\yt x\ֽއəEUZBņ퀹qGQpG7k֞ ##&ܖgl]  x C6|JJMQ ]\@D((ZW6X%J &HWJ.^ṅ5#7Y'Fg\_Bڭpx~T:]նWmy:g\+y}}/ ʊ]%;^N̋@wwz<O= l(TfMӂ&H.l7hs'Y4ua~g MM*JZN7F}:fWL״@ t J^XqW6,M3<*-lΘ{_f:$d OWJ@ղ՛}d!_ͅ4<Ҷ{F*%-6֝XwAӴ&&}I/o|;C@dQdzI,ٹx# ɀhe&u4tYK[q9nj)htt/E6F|ON^z";/G0OIENDB`u1f510.png000066400000000000000000000014311326020644600320130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՔIhSQkR'B@(tbӢVVD\ \҅aQA"hT qUjTh5vHk{EҘtBD7s{.jmh}iRé3׼-\ y@7*;ȥPȈ_%"KEE<ѧonuUYLAa!nb& U@)x"`䉑 ?tZ;#Q=ÕWg>EUM³ O$v=e8m`qDޝPeev| L+םb_ ۧݛt`Z@ΨɛE(/ TNeWb5nG_|ZQR<_Zy~|>s @<^0^DQT_&ee =IdIwUc-YSVч+նUGc2Xx8P n˝%őƬz7̓(e7ȭ0N Cf΄I2޺jI~*-PEFC6>4?̲2 p<()A߽x[(0>S= 6c[=(@G^QWAWЏ޵sDd@Gp`C:HɇVޮ fjaz4+t>eX"['Ut4Ț/Ias=mrc҇]W\?9k ۠IENDB`u1f511.png000066400000000000000000000011631326020644600320160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d*IDATH1kSQפiA !*`M'.upORAN Cj"8*unk$ڤ/y}g;=^!dbR2xVy\tq^w^%ӎStckLʠZJ^0KCXG$S0tԨ27N,IENDB`u1f512.png000066400000000000000000000015241326020644600320200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATH]lLi9cfNm[ZZiLܬD|F],K6썈DBD^lK•Dh\2v]]YK*]Eя1ṡ!ޛy}y _I65'&}n_54y"UT$Mu֯ـO^aC@sEf[pp5u+7;]3b1*)[5p!lV8hW}6D͵?VSs_ިQܸ7 8iJ5ѶX?E%Re5u +IW1ZKڗĴ_*548c܍Ee6K[Sz τ[:j懲Pe6[yg1xhwy߿efI4s#(:4yV9ʉy=`YX}lZ>05矦ظ%#sSlq}O3咲u5eE9t>|o+ 5jqr,0}͵spfc FRC{h`dLC;oh ьF{'/MȐcd~]tU{cw>>Pto!:G$/{1C{%tL-2"td0sx{JOo𺕨]Q .T=w!u>\7Y7WLv8sNJ* 00GF,|7m)jguE.IIENDB`u1f513.png000066400000000000000000000015631326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d*IDATH]hUov6bh&%X(Ʋ*j@jmnԢIhV!Hŋ ^d[A""Z$Bm[y$;03 ?]ڎHPj>Tj_r1 c+1"s{ިZz#l,ǪJ{N rɁ&^ o[{}_ bt4T:`>:^ :םڗgIP!Tj't,=9lu _SbDѣQ:U@j0wT1,͡&.T%? bJM[#sbp(.oNZr~j0'/L)+Я}&vm-ӹV2[OרGXAybDpɷ8&#GN"'<`8tb]wwq6[&xtGOSwu {݈wt ~}namaR;;| XDrOMd׮'H&Ž=N ؅# ؁m՛iX۷oC@6,}4k8Vй5@{͠8bMӿGd1,C?|'j[I+ WSY/^g*|R yoǷeX ߁U.25UWk7_ ECWӈZ#j;* ϗg@ rŒ pt R?7Kp1ZIENDB`u1f514.png000066400000000000000000000017641326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKLU30ZThtDUS@jM0$MMFM4>Fw&mHhBaaIb[JJ좔P`00y1@`Y9;{VH"|0<ւ}ڔŷ"+ Y> [߇ݼr0%%i,X>'qeph"`՞Nj_}wAou-ƕ lUdqܦ38"HlVM`3F~ ԃ7Vop_A_:pm<@ނхU2TUZDr:7 ҥA+xqD56({n3V8pLvxV(XO՝@S3@@x%zִ_#.Lʹ֞uD@JMј5s:S<1=l*N"|Ȣ'|(ya*AW؛W}S@b].|åᗸܤf v>3/Wz0KpBrm'Jӏ)>0R՚5[Xʏoqi$~G e8?0P|?RɅz>IC( ЙCrGȖRb Zw5_px t*,m@8qG0 /{mq9*")M]PqI>֓k,>9!VA5G-ˌ5pxoE.f}lJ'´O(ץDA"HާQULu'M7 $ SO)<K^w1>k22ڀߧBi_/U.L:ED IU.!t{r=TabBoIENDB`u1f515.png000066400000000000000000000027571326020644600320340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH{pUW=9H7 $(6DIg Rklv[-TGcubi#Q)6A%$&!׹#pCkc-]b,vL3kLĄp$?3ws-m/TlPȻmB)RBxvW/BM˰ܳ9o'9KEX2xh(RBF5=rT/ۖ/ ܻ0, Pj59R] |#?L#m!w@(X{gDRzX8L'M_>eЛM(k8NK)gNpI!#J)oCcR)]Ǡf*"W5I#E9Z5sO,YMY2~ :j/NYBgm0zۈrSd'c kSjbڇR)Y"4& k&Fl"Z~!V(H[0/~: 6t~a [W|*F(ZŶ 5+ӫzE"pk@x߼+?lRtXbtҘ'epj+Mg WDӶoF-7ee~3 kӽ -/>.ٺr~ZP)`G@y. JyL'QxK2%V&Zda/Lu8~*z ,3sǏ2ˣUyOhu  wS7WFqӝ^p~ سѓqO~|U,q@y{,"sf&8y(x+NsP7IC$@XFaNY9 xf#J io}5J[jiڡ uTGڧkU^~ucw-FvdO!*#ą̎[v}pͪ晣E,mϠe93;,;r]|9o d]{2Q/Uڮo5k^H'3x)6#NIhxclHeeGy`Gg&P BpULs6-|YPSDU"&mb5UC⼋7}uۘf!_wk]R^4&-vsa]*Q23 vn,ײc?Anхe1IENDB`u1f516.png000066400000000000000000000014341326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMhiϛQMxP (""Z[A]XPģxp ʲ zEYhW~eOŃlm֘63%ےofxm~MI?4d b+ mFa̩(PLb#S'{oI 拹/V=} ys"P|ev&ޤ ?[0h&D#[")S+5&&wtosD(Ե?P pθ`]R?n]vu?JAv&dkXmő=W`UC(&پD( IXD!0p2J\ v!rkhc/,W0ߎBgJ/*uk $C`(D(? @Rcgܯ Ǫ}e63ͪt$0'Mq ҹbt"k 1 Fc#^U(eqB0}B|MD=f[. |` xc`;0<^g~4e?{r>ױś'mU*͋2)rynwvJqԮw*@|>7G{_߅I 7'z\y& HsXc!_٭ ӓ<ϓְ>y.IENDB`u1f517.png000066400000000000000000000022641326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dkIDATHmL[Uǟ{noG-3͆l{a-Ù-&:b̉΅M>_h6&QY3(dAtk A;F_h=o~?'J@ %5c7u* p:>%/**zNfs hZP {*^;mTj=062@}ʽX ދ&A:,7=!7 8L)ޮ₍U!w$? (޳TdE#44M\IdƜsۗ0Ɵ q\B*?]%Igk8EQYKwq}9ptJ1>YXBSՅ,˖ɓw?sylaMl6"; fMiiJj+t&İ|m$|p-cïRo+OII֦dBpOk`$WUD2 =->Üq9@Q_h|ːT!wwgLc2ωK)yֲz7yƸe]JRM7?Ցak0&"f]WRzJ>SVma9g~{˒8bm-FzTOZ_K#9(9p&낵;ts`E`&u/kj"%!ȟƷlY@8w@ ƨyPp4/Qڌ>0އ?lX c!EP2t9&\E %RN\եcU#χj?bψӛdpPxߝŸ4ˋNBͼ6;B p$[GFsPNJΛjxRGA= ? Ol> !1jrR[5p(E `@[4W%@8kdsam>/1*~Z=3 SFv*H_rMIENDB`u1f519.png000066400000000000000000000013271326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKHTa Rm"+,Ȓ MhT0E kWPecVH:M%-h!tSǙm53awy8=h\w81}p(ylE2X_e( ؑ 8@>yho6Ѱ,(T+bOz0Z2A]*usͼ0Aᮁ%hEL{a?bYtm~h KE+"JLXGZ ct&T>x+ZQ)Y86 A#.L9LZ`4ъ'#`)++:cJ$(r[fU/uNB VGjj>liElXL$j ӫyo 'wm18u]iDFCʯF29ݔ 0W[DO"As$2%\PRi\3J6]mV?k۩{M@^X8G݆N;Vx ԙ*E%=ojm{0m`̩w+SmvWxʜ ; {1:暪j2JV1(G;^"rM`Q Ś| 6 IENDB`u1f51a.png000066400000000000000000000011531326020644600320750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d"IDATH=hq.T"R"((uQhH8'APQSPIlqq(V`4"QAJh6M.Wow;ƨ|r7^v*pU*<{1;S[ ]`Sp1KU$4ʥJPdd-Ѓ˝EQt}̻EM :%2*G$8@K^nU+(9k kD*!Y  _[h1`]Šhtc6$B B36GE(I}R5h<5IENDB`u1f51b.png000066400000000000000000000013211326020644600320730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݕMHTasgt2)HEQ RD6 YRF.Z83(+0kQ-ZhF?(ZDHRE3DesƟQ=9². x">oI2=h 3J&z7G5%T&,Ttջo-2{8] JhCWP?۝rt_/Vt 6udrQAT߬(X,.F gڹX"f (IENDB`u1f51c.png000066400000000000000000000013301326020644600320740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_ha?;EJ$D!B8clK m],˰RFp,f.mus!˔m=.8mg}ySgɛw;;jPkFvoiб6{O`Y$:C"I{A XdOhZ tYC}Ծl>ޝzt4˙l{z)8u嘠cMQa+Ȝ>؟{I<5/PCf`MUTvϴ],?[S4>6]hKVPTO{C +ٻ#Q7E"֌n9@k412S. TD"Ycd+꒍+G%Q;ᒂ?W}7F<4޾5 K+u 6b [X$ñ޿6Cٽzyc~S(%JB),Mk+Ȫϼw |ynqڍNsWΨV@Nrs*ʝ=L օjm8y|VsxoF o?\7AK"B:{:kWlkER=9BF?.%$f*yV=nv2p;4\X"ܵ5 nWc/G:y E-f/>5$bn!c1jVLA!l]xa7E^^{m`ET:֦0ȒF…(ʺ@6Fpno95Zi{ I8໷7޼4@Xuޅϥ˭p<^ނunqk a>r"c;f܂?ލxnlG ݞC$'k;i~UZGϢ)$]1C O~K|.4)2F=qͳM#k&{@] =wxvZ7nu"7?tN /92OeuXxgzSpkGD]9= '}#,4GYYuL6k74?v QYOM _O)5r|㪨ę$nw8LjkϜUmI`5.5iHe?'/2Oq;bJ|":)663%ten<78Oݻl- @nùwZO |mqLzK[9˩AnM oo1`NBsdžۙg]=8<3~]V]bG*rC6+':-VM$eT+$ S KOu}wK[Wsa3uOBt+%*k񉮡Ϗܽzmc!dU)3n pgWϜ?4OE]_MbIENDB`u1f51f.png000066400000000000000000000012411326020644600321000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dXIDATHkAwvk$%ֶEP")Dz@Փ^zA/Zb 2nxؐM2;73;HiL8 #0[.8cL?nzE۞]y BRp p+dFJ5H vWGr7 yPk\(&r3/Lc7_AeH 6c${߻&B2H8;&,¬iG5^L_P}Mb>4 鑰z)GWtonwtTp`5Lؖת)S* *AHޔ)\tEVkx!4}0;K-$P'"Pœ1۟g =P}w^G5QCo <8~j Τ,=E5}Uw58f{&^i:HT$7߃)GC򯨮~um6HևJt$l[ 3 fW(` |V3YMCS3m-* < gĵ IENDB`u1f520.png000066400000000000000000000020011326020644600320060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMHcW%/cb336b U+F(t2Biu pQ.fQ)7ZҍXBbZ;NJAajQXh|.<}&Bs=󄣏 ө~ϛ}}}:ftt|sm,_jhkkcccqݺb ӋAFՊu2v$% LԯKN`|rk;/  ե[וHn͖$ʃ,P`2p8TTTj7 PzS 琞 ѕI+s LdelkNĊkȞ[C+y''',//3??,S^^~ `0" tVN!Lor6}5lnnjUee@8ֺ\Ld?oNm^RRfthEkj 0nsLN,..jrxr6ՈgPPNcpph4utt044ۘ_OO(>ךDQ$I*^o2d"~[Fw o`yLMM( VIjjjX[[ :=7ߧݏ1{{0?A0S ԄVqo@I#,O;ǦjQ[n"YB&n  5q_oHχ$sxx jj~+W1T_I0'gxx2E! qxxѕJ%F'\I m=%CX,n,V>CʣMypj<:;l,V+epFmnIENDB`u1f521.png000066400000000000000000000017551326020644600320260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_L[u?-w6q:RYY) !$ !a&$Dʋ1dq$Dc" nA%MD2FT:hGw|ιs@64Z )K199I]]ݏԉiM r  G:n苟Kz n]=v4 坞\< OT(<n@ ᠹd@;_> `kCrCB=zİ>_ hvI$$ H$b*JR-8Qn޵_vw/ǵq+++zzN$'1>0d {7;Agg'W(tuuf~XgsVP$I677壣#^4}c#-V d)A ܉IENDB`u1f523.png000066400000000000000000000022621326020644600320220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|diIDATHmhSg7IkZNڦR&CleJS'JԂ:º/k}*P㖶c, HRY:MLM{!zc uo<9?JWtҋ IA4Z[[q8۷LY~qլ[ТeTUpn7! b%e9իlٲfh?| $i$Bt3!B:;; \v,dYǺ'Vm`aKUIhll.ƄA`yiU? ,!Av;BTUE;2WG;F`A$AT-ONr˥KuݰdTM g: A*8jzI7w\ɲ,UXFVfb<ϲZAHi+x^BHssXk%]o2dnn2r"o[{zŜp8̙3g~:D̮]hkkY*rqa0. ӉjerrQ&&&8D8}4)JKKllݺ^zzzUnv,vob}"ȯ?·g;ijj"ގl&Lp!8˗ By{ov(r dHu nݒoN? @:r`@@MeȎMh 6d GZBH$(//G$**2{jjx<bFΉ )|s 2* )x+\Sczz:v͛i#jexx`H$"ݾ}EQظq^TTē?mPAj.SIENDB`u1f524.png000066400000000000000000000014021326020644600320160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoLQνwjEHIJ&h#GBY0FbTH !^ Q1E̽3i1lnN}=h(0, *?/'T oIq/A4HgDe*h{H!{YLؙq H Rm944:҃hu_12ӕ@ց^ׄ O_"49s0٠we3¼ҚzzPs)/il&>8ՅI=B P(*!q VJ ֳH0'5?\(*!=D))TjO+r7•_suRMgs\ Lu*^C Fv|E";[m49[ Z H8=86=+BFclNtj`ۈdh(&'8H8aRjcPa%/%׭IL`@@|Y&N{KSgG什j^N҇Ne~C&W4ebM#"\{>l/kh{79ԢD*;ں|f }IENDB`u1f526.png000066400000000000000000000021201326020644600320160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHLe_{xODLX@t%ܜ?reU-tf66W٦!-4 Q̴AC0ي.~>ةq<?{CxYbNCʍBD :@fz%}}dQ[b1'TCZz.276Mq$ٔe +$@&Uϡs3|(c͵Y[#>t8*4V]AW @ɒvUL{P_D\@@`qvaQ/:{>ً̈tۑm(OFZ Et @'w 0(QFZ.{~Fjvbe_a)@ 1F !#Ywzm*zc,ZrQw" 2'@@sO vWoDAo#Y ;G&uW/c N_jee\95ZhѵT CvМɎiA8ZI`XDJ'|%z;f]v ήeR=/F _ YS}rh&}T&oFuY.gϧmsH1̔Ic9Uj5=ybN]tm{+W3j7l6'DG&*c;_KɫO2c ̑UEr2/'fY2/t})$xT)Ůј 8q˒9pg-Sw0Inu7hL҆M(J˯7MIRΊ yoy{Eo~_jM`ּi,F@04W(Q_nc_57ʳgp8a3IENDB`u1f527.png000066400000000000000000000015011326020644600320210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMhTg;Xb,MAIP(bDHŦ Mb$+fdQtM.bfbJ 5CfD%ƘE'Z'u=.!$;缇8x mTt%ugD4?Lv±{k׭^Q~@)Kk4Z7P}uҨ|~w>Qpa[dV""o R?F$6 :3;Ml.AZʦ_FEGrT#)ukIMn{/rP*@yxAo}4EQ{( 8x5bœzۤ&rJ\{@7L@/2SMMٜ5 !59dɡRepnS ͊/[72Cg~qPwϭ=/T?n[0g*G|[vܷKVhڎ9#k~E&N &}U;LŸTEvԜ ꌮ@K?O &}9Pޏ~x|s]ߌ=w\:֕HSy-,7AIٳUe[fX#{h>r%$7D|: > \Z?EjrMB^!\zA^b{C_o}s P &9:; 8(+__mȒ#IENDB`u1f528.png000066400000000000000000000016001326020644600320220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d7IDATH[lTUtfZq%HB Z%1ƀFJ,}` E10QH&I RcbDJDZӘ`zިt^>3Ψz;^w HsuYm[1{$ZlVJ aTk }Syg{WV}7䱇6zi9#c.G;qwz*|k2Ygeɓr_U鸒=bNx`G+թ\ r\+at ׬h-'!=8 XXb(g?9ݭmc̋+K aUyURJA9gP?.)mmAwi_,jFn{d'=0|SGZ (rN=G׵^R>R9+7?t* 5+ãNgtO&GZ@5b;F[fMS~L$\Q90Go3}S 2FPhC3?ZfbecO?ۊ[Yh9/ to(/Lw~pr/WKWոHN8*{r-^m.@޷Vm8no<D;Z &7%qG9t qazoԱ,ԃ5IENDB`u1f529.png000066400000000000000000000020731326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]L[e9~ZJ1tu[ ð8bDb/u%۲($LȰ22"0 n-Pڞ W KY}?/ALP& zftRfJ5H$ ô{!`w vݼ^?yjkkݽ`0L4b8QOT)]{7ݱxSEE. ;::үnk9t(5[WWƺF\_1;-BIt8 aAj~,s&d$-Lj=9z3[bz<nY.;e fy) $I8LQJ[zXC!Mz!s/rik~vaTX,.Qo53t:-J\n\Ex\|=̫tu%jl48$/WU%{Ni%ʧ2{Ύ6|-[2x<]5BrJmp͏Poog$#_!: '(,M2+Zn=Gۂl0*s媐$`Fw]?^S*lťef`aJ@Iӿ^̤RexrGPo__vn~GEK%L9q\K#Cٍ3(y8ŵWko}fȉ> Q;>~kP(OƢO.MxG7 (v@p8 ! .y>PŅ,z;2d2b%XXd!}>ߝGk'=~yJIENDB`u1f52a.png000066400000000000000000000015061326020644600321000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKh\e经$HbJh``.]ؕ)miPKRJMYWbaB TBL̽w 0 6<|WXAkɽn1RxM-3d=jrElGZcot*  a4FhG5 Ft?瀇-Oec*3ڲV}]D$*MTb*螞~-PyW뵽j}]!'Öx-\P﯇SwKkyGA]U?}ʒ'7Њ?o:7>0|B:&UwU;2w`L\~ `fnt'?Așoo/7`ľ*v{ySӛR0dr]GN}3 xs^2ݽ*d116R.|  NMoV?4"MBJiIb zAӪh [M({7ӗAiRԂV܄4Btn\]ef73y?|^1^]\\s3M:xHLUvQw\O䗹R {vK Hz's[H 9q~m=Ζ ffjWm$i䶍8,QqǓ!I4΀o oK8$b\\4 ؂7%*/F,bvv|>񁁁& "i۷Q]] f9eeeJPa0$eE066388سlnnע1~Fvv~ټLmmzA}}BicΝ_ROٓk%TUjkk 'iА -}_?VEQ|j +ZZZnF"S*|1 V^^>KD`,/!}ĉs0*KuVڦg`\mS {[zmӱǚuLӴS(xgNSZ^^~CswKXN@iid4f͖t:#=c_`^g?at~2 iaV{сo"rUeΌ Q-b& ޓL13?ۍiM/4zZGkk뭚$I/3A|@ @ jEff&lnn5p8)X 0%?Grh1@D'Q.+ЊޣQ c{%^='"W$眧L AbRks!h2n@,_uuuʬ([wvv?%|tIENDB`u1f52d.png000066400000000000000000000022101326020644600320740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d?IDATH]h[e{rrAfmӉdm)1 Aj͢†B^NZpC@ "2{1JQ^)Țl'ĴvY~991n8<Ϗy9/`$IjoZ%d24ͷh]S8|lCWF0t0xme/ v盍^ ribɖN4ώke[lv@@)E(TvVW].+++ʲ|k@"+B1;63t8q_vvvvy^YC[ʳkڲxIF)֊(?˄ 8r455#Q 8^wMOOP[[[P>p8\;]Y㢵#; k8~dUU00pTx* ԍD"qxu_Qh$i`( e]ovuv .T3 d9RMUS4qI:Ey1֓L&c B~tt:?z!߅BX,^p3JeGFF EQ^4DGD"cCCCfV@au@!gffuZJa1^$i"*Ѩ 'NVV *)^.+4/..&+qrc$IENDB`u1f52e.png000066400000000000000000000017211326020644600321030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHML\Ua4|XEVMF` 4MTc0ƪqƍ1F uх -jijj\& M3E, 3̼)ÔῺ~s=Wڇ)WQ@TAqUJu2B||H3^IgKC;uTziRIq7J1h xƇﮇK=f*gs r<^7:6ˬu`&(HE_oYМc`Wif&($g2iྕV&,wyu1ut^'˽hQpe>ىhgJ2@h4_X O,ڼ7O4m7(Ѕ`.0t-; h+^=5j4at,na.9+~n%EnuѾ1*(uZv`.!ˡ;@(=>f1|Ɲv~j}w 5۳ %^vz${}: ~r~:ɹ2v{^~ BV[p4+g;[UZX$ 5b:pw{!K?R loߘZ5AW+{كDZ)'(YZ4^/${Ǔ|6a}Lu-(jmݸ(++| }'Dfǀ-@ X\lpΘOﳄ<,[[!v oR$S,`"Ԩ[C[ټ6?-IENDB`u1f52f.png000066400000000000000000000015051326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_Tu?7{I$"ksևErS"n/̔ȢF>؃wFS!JI"j1uORdF3w֙aCKsC+FM`p&np0 }H\N8>jH$Ysf76fR DF)7hiWoa^o9;Vܵ7$R0$p FoO(5.VK#|u$3VMr/*~:_֌0(q/Mx1ζOE)w3B&#w{SQ8ץ 4ʉnc9\s&[A'yo`ҽ| GbS`1+IENDB`u1f530.png000066400000000000000000000011261326020644600320160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHkQgn|d*8$"وҦ.čn""⮺P (BB¤nڒhAMUVЙ.Jbf2I]33Jµ@yԙ7۞\zPp^:ޘ;*tJ#B~4S=Ɍ<8_e9F  %3gŜs,Z0Lu)u7? Hrn- <^'냖$l*znjS|J0P/ܧGϾ,?as  m}tme[D1[ sS&s둞_-OS:.DAxp{$ӊc{\A\ N I !5udž;?4֑IHzzZwl&kIENDB`u1f531.png000066400000000000000000000016011326020644600320150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d8IDATHMh\UR"83QRMg.BZ hׂ5".ܸJwօVf2UP K&43o˼dd;?y'F tߘ׳HI(pTd4Q־(<_zʛ*ú ̐C0Nmop>sw2 FkI3[ɰQVxT>\˽Geva&qsHQǁ^Ww*va&V|1ژnq L' `=^7ϻV8*{K- L=Y wwuZ@6FJUMBL%6l>xh~ ,.\+}.,7^ qWn~``8¿wVzaЁECq{E?/ NŚm->;faf2crC&:f\ݕne`WOfg7/@ \n*SnzGaiiG&)mebL@ʹבJ&֒V f83O 启eu :[\Vy z:q=~k*k=V߆px΄Ǿ~x/mUVx@aVA 3B:HDoBp Ǐ1&u7yR( !la9?:n^:!ǯܵ1vہsցu`X.@DCD:B^<,!/KSrIENDB`u1f533.png000066400000000000000000000005031326020644600320170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH1j@ƛEB. u690+4Yl`y߃#aZB8H) i#l>\>gy=]]$ MS(;wRJQ%4-)%UU?tu]/.04I朙]lM 6! ,q; ISzA۶(.=#s8Bkkv+RܮT|/ QJ⤖DIENDB`u1f534.png000066400000000000000000000010171326020644600320210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHNSQ;)q#MHZPw&>11]-jRk㦦h++;39&'ѾwZes5i@RGвPzsy;.)v hQ&̻/kl--L%"G$'7_;' O &BZ`눋g;6{;|>k2Kwl)R¨{`۹CF3Ji98 Sށd\Ò.i2>S|Q0`?.\R;.~9rќ{[B#ɒ=y5V.S13:rm@޷h<WCtA҇τx{/tAѢ2˥铇~6cH MBT{_ChLyÒ`P |}y ]|B(QIENDB`u1f535.png000066400000000000000000000007701326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMOSAF35E55d&. ucsW@;>ꞫFZf2ofI&3 >r! Gx|x7Qd7{S ""!8 !xҦ-ƏU|{~[Լu'IENDB`u1f538.png000066400000000000000000000004051326020644600320250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH1 @E$'H:v*x BR ! b6_μ7_)fD]z3|ȝX Wr`: EoA Q7KMN\.K-,MN$T /WZ/LgHׂC]jILR}2O(A{1un<&y `T&2vwA{Ǝ;q~QTz #Or@T+C# m+­v55&k+z}dBpD~? 7)(\m 7z{5y\8`[_~X-տu {xܓ'FBxwa'Ţ UR* ʋ(۶sZlt܃Pa f=\)YCP͢3r|[wyQ%IENDB`u1f53b.png000066400000000000000000000007401326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՔK[Q?Z:YtHQтR([FZ(4"HI( " EPJiwQ /sÁˁ9|>B^A/GF!AJFԬ^Y'LV<5TŚ0#og e).nJ`'z.MIwE$^ -)W`^;-^Yؘ'&{l!Xh -Aֺ{?xKh ?w`U`b-^H"*ngvçt!֣NKQEesީʼnG? ݔu&Ufm &b-`fa( ߿~b;NoC诺&-am*,3&?Z{~ħ`1sib8?B98GpWCO 98H=om<30000g`P< Wv! B8FIENDB`u1f53d.png000066400000000000000000000004631326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH퍱j`F GyBq)v,8KG'}ܺ $CG(t)E4wj?R8{$JVRӛQ%2fLT]/ (cD広0KSʣV40f?O&Cя^6b,OO];?1p=%BYp>Vh}Pzut~ |a·*oU??:ۻ$IENDB`u1f549.png000066400000000000000000000020321326020644600320250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[hegfMB5M`kM۽>I"JTڂ!bIP4ZlJE"XA(iZ6H%jmuӝl;>4 t$y< }|Ec5nOd|rw*=_?1;vnjohv՚ݠjQӧh tan|w^E?r DP. h]^p]0ڣ*omgGEYS'#7 @We(W\+PeY?LuB~4lns.q1onMIybFWR!'>z)L3T_܊Qi>_nQn2v dNa'_rbl&hBЧO_z/8^N(o5nOdi [*;Lc(Ӊg֪YEνME8S^odt̢j.P"3s]j}ҩxҝ:b \Fs-v^ Qv8CùTKzT{WW+ ׁuoW^Qm@R:h0饵XyU9e`60 HӚy <ƈŵl u|0&ʈs!Gh)Ln*8Hlr['sT5Ew vh:V`ovOF;rZa@! cbTNjs'ұ7?[ԉ Q*g\Y 0=c`s~O5h[Tt!jKF}=EP _r~/YqɈ W ?@R0پ=@*|0KPtr=ub+ A5ZM Pə oTF1`՛2T%÷!HcQ)]NkRr6-jq5 <[k!OIENDB`u1f54a.png000066400000000000000000000016161326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dEIDATHMh\eݟdLI12 1R-MC(ZuԵYE nn]\"EE"\lJ Ig2~E:mӪ۾{ssw>뺊tEx]S 璹|>sZ;,")U}1cn(1pn%sf*7%sǿ+A䵚axCUUUϼXo+;VW|s=,250L{,(*NCa{9 `Բ;y\|KaMa8$Vet(;VH;j_2F&OOu'PTs} T.' jWY-3IVhŎ:u"P= `&sa\.ӭɭC?M% Pܴs0]P̯ =ep!qr~B2Ved)ap뷎n;UuO+ 3\cF -64g-p8X o]8:IJ2VXSv%Ncn+7d4VohKl3= c1~})|c;sZꔶln0F0bbj-;/+.k&L7bb*oxb~KAb5jYө1[d۳/pLFDbb*LB'{Xͮ| i@wRb9@KGIkQ)G<`#G\\p|li?6cLpD$ <G Jl+++8]8&(l6[?~/>B/xIENDB`u1f54c.png000066400000000000000000000016211326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dHIDATHTMh\U}73IfiO%1VLL$*hq!.DY\Y,t!]EJ#]-m&ɼ7w=.}f4 ҳz{w{9+v?_69Z{g[ 6^0H}l7V83 scIyP6ip.ښ}t=X\k)D%/\dg6p/H̆F(jyRFfݝ i|6rT5j7X2:2̋D`} xog̞Q-z{_'*gπ&hLu^ Ͳ=s8wZS,0 FDT^Y3 4M`gLiu{G(PZ;^p+`4mwg#9Y(Soam֟@{_u%\YX\׋/UX3@dк=9N/p]ύaRHm6 lǁ @!! 5.~^P毫08G*HZ98hقODlP1?!Ãب15=A&wlV/ b( \Bp4-Hd|:cgʹ&^A0i_>m@:kr'Qi(E-[PXAJ/IENDB`u1f54d.png000066400000000000000000000022521326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|daIDATH͕YlTewtZfZRC eD@A!ABR^dy Fc4$JlHU5. AA4t tfXZ3w{? 3yN9?'۸2qYeH} - iT$;~7Nd64Lsfn[vRnՕUP1&p"'7k +Z'|HS 5L,XU_lOKô֦`#iUq{vfM%U֨ESukLY,AW 3apUESQ:yȦ [~Ig`w9,R/CzLfTgO+/uw=^lA^ iZkLل9t![;HvGq;':, 3eË1_V"K*ȒĨ\$ F2=69ͶWؤZS:hk@pt,Ƨ+g#Ivn08arr[C$ <#}jIwEfμIN`'qP7C3',;Zmw4@U${g=D%0'GUVMv0{ oDwY)+-)֪Rׁ<4Ue~\wy}XvFA4ߦL\r rq:}b hY"g1׹Yc}so #ank-ʸN;1D#oj~0ɂBJ)[ShA8sp4voؒJkz\,q^8UOaTA>XɞM&1jge}dBDe=g  >9L׀ޢ)ssx*<{D>Lo;;p'Ͳ/7mX>7BO߰{Lv w*x|A#GӯvmCWWW,]D%˄VŦ0CO-]禂}mۻz#L%8;}5-* T#j6%4%~_d9lh`.01 1 |ّw}5keISpNvSOCGV`yw(峆 moJT> :bCH햳↣5i"~gp2}q>&t@x3bjޒL~XfbiJ ++1Sp? #MMU/ &'u9׻H(#y9aFSCGWoK"MP3ޕi<9[pfOY׷w\4|(ʀBLz*޵9wW@;vpC͉|dMŽ>L05cV'κξdݲZ6ŋkң-_5B8nۏ8ZSwqK&eng^U՜GVi)XkBg"nvG͉  .+@uC{;.hXW{-H [ [ʠޯnY3IENDB`u1f550.png000066400000000000000000000021641326020644600320230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d+IDATH]H[gsFjEkn0褳˦Ҳ]N7Ai/( Y+ݨmhmݒBUP$99&h:&EQ>{}sHr*FE>Ԉ]g@ 3`4~U+`ǂYJ@C͗Me 4>;'auq'JŌpOmQIڠegݳN>4땋@߽.tWLn8ƏS0Ƿ t\)H#TqT| vT4gV l6Cף ka`VMzkbLS1J._qsbbId{ӒK^~( ]*@Ԛ'f=@+lQU TͬDH8YN S12mJ繛w) "ctt(i}l?+ t,.)2p.酴d`׋P((**B}}}B^H]FOOd.y>Oe4]&dD"<Dz@\W~Kxhiiihe`0fZzT;^_h61`Qpx'O?wMи9ѝ(>mkk85psaճE.~b 9}}zҕ~SE S5X]]E(kjtfJ2@-OSi:j*X5魑\Ieo""EQn'=-vE!"Ie/ۮt?58n.n:0nwLY_npw7glp)ݜ~=42&5q?[od Sǡ`usw(@R}`n<@F1͔G%%[!^z ڻ?@*P&}s /I#PN@ 0 H3RQHNm(zdxcNjoV@mir XUc.M$'&{~8A7Xπ V}%Z[[`ppp[T=xyP=F=|<./gF׹PPzH׹3?5F+[KsolS[z y0y%~H94I*kQ˵kQӉn܍I Ikkŗz=F 0EG4*O+_ۭ8Fċ'gmc:\cɲLNsnq:$2+J7z{^7 t8Qi!$I4>hp\,Vdu-Z/k_5yڐ>B<nܐT`8-0!C^m p5|[QcG$skKDl"x1-= hV5[kecZIENDB`u1f552.png000066400000000000000000000021151326020644600320210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHV_H[WMzך6Ә1i41aײU\]Dz˪ۃl=(8sX0lR6t\҇:kܛkDFИ@=]} y U;R bPO@ 0@' X ѯ@ Xyqbbhqpݙφ2{4R9bLI8_c1xZ.\jB4 h`AX5xݞajj mmm888 YI455AQ|>i"|5J`fsA.D`A?=ݽpQ0~ Y ݻ$hs=[+[J0 P}$9dD"<-:u'U|qZr033sbi+%Ej7xn"TEoov,3x0fįpXsu~Z8UI5M!9E8.AehM .bi|%iǣAR(ę >GƎy& fRA/?tpl6'Ma "ALLL ;;eeefNT_A )O=M^r9'ǀ?)L&n7&''ڊC- 7&U;Ŀߟ{.s:{8$I׻~~ow4M{jf`eez$waUOE5yQ4N*Ux蓛@Y@ݺKD*ycDDSг@1MkR i$i_jFIs)Zb_ӿuWOn"*pK=LgPq_חk({ŏ4KB]N0|γ4|^g@h+t!oݎx98 E+R·W8.c b[$S87O'T\^^PIENDB`u1f554.png000066400000000000000000000021341326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHV_H[w={ӨӤu6md8letŽ8a{IEܪFAY̗PMunIQ$&!x51ɷ<]w9绿  }z$b@9% 60K ՌX,f~xYw1[S549WaA^f50M|{Ao Tk U$k;,knxr\KK?"mۃ{^^ozoWEQq;8$J7AU:gGY~Nh<h4o_s24`QR&{ܜBܡEAwo,ũk1gM}~?L1ႚQN #sjbnn `Zy<1tv^Z4<,8W988֖|ٳH"v#ns1ˑ xpFぢ(P$e5ѪsAc@!X,+èG]]ɲ łx "kmllާ&0|cI.Dy;q{B &Q 4,J8iDiw4fel} o%uS >3;v+'{vEQt:BȲ|b1:AL~5;U pdj4Mejԩ622ӓ@$q? 9&(\r䷴\CxxEĩqZɉ$ }zbی]9vmlUnI|Ƚ =IENDB`u1f555.png000066400000000000000000000021011326020644600320170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHV_L[UiWۭ@Kt*?5 1FqYt+<=@$KeFZ0nl EmM{>ZI~w;9e4``ɀ%ҍ Z+(2:pϔDSl,%I֞3ӆ z]AGPfM_=BeKթl033shPb7_`~5pQ=|Ez7ybU}wch=  G# ޳eo:R^ bX6*:Aw9p8FKsY!M Lxw&};bP_vXfj2v!-.X,:mbaMab jӁkcB,~ ~?aPF b j3 |T7l*5)=}cgJI9^(kL6HUU*dY.jp^0A3n/1Tx^(JI\.\.LLL))b-GŠ=[>7 *Tet0>>KM"eqq\0nkyonT_wpC~ɍ5m/^!}m] ̢ bެ2vm4 0L:ɄSeXe`]Mq$1 ;w), Y,T , ⻲*`L)O.V u QpcU'&&077sssDo41t1SU-mmmlqXg2=K9.2e{rAUU YuY V14ϵlP!աIyfl> J1 BQ^g#jiiZZr>{ c6~S&Z[[122~lw5}eбj})_;Նq:;;c?I} { QECrA*s遶/_*[+Ac$~1\sǮ-."a~&m"SIENDB`u1f557.png000066400000000000000000000021601326020644600320260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d'IDATHV]L[e~t{ʀ .1Beё:"ޠ;41&܈\@7B aF cFnfb2 1(BKZiA:y/p잠qN *(hn{JL,0a dzlɐ RD{0z=jٍSB}DPF2>+2 jļcXGG`bbbی^ 6Ed=xdރs@ @ 5Oo T|Pm?#q6:4zA3yM(fl6<ڼ>jSHvObՉE:AdmsC˥{'`,_l_ u&(FMn(2X=A1X#LNNbnnsss5b1t=A^jU#@{{{$vc?~/Λd^֊Fa?HUU*$I:ԠV4fXg@5Ku\Ӊ:tfɲ ˅MB.VNN lmmraii sM=Nowwwt333C(Byy9"4MC___FałL @2XO1==|xƢ`40`$s.&ko1'h!e\ڭ6-n77b`D#w5(..>(PU^`#_Z[q0٠^0XUJJJpW,n:g)yw'" vDDnE!"wvx)<wtm_ ϗ,!c|mkiw'LuWӼLn61V`j#g~ڌ~mi }4~0-,h̶\5P~Z"q:Á5{-oU+ MzH[!M55+8)sIENDB`u1f558.png000066400000000000000000000021121326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHV]H[g~5Ii"[A1&z,[5+,ӛQn*Cչ)`7^ݔ175G]'cMMʖsD'bD |e`€)2LRCr;Tp-O`gUVs#۔^bU]|/ѩ~0Ѡ^i@Ty䬵011ojkV8n bA=|..nɥve;҃`0`05Wl]h>8^ 5&/=j+>`PYYN1f)$rNmp\r()Kw0u 6gL}"D=X{4zݨn`zznVXsM& fWO[9{7W81T}&+[B*9':(TU, .X Vbbә%ZZZp8UUQSSA044Š()c \"ADI~ۋG^n" ANY&0Z5Ytbtt4Aq_` Z|/|g^ '4SS^آ===XxQ D-KKVvXHp?ӜXtfHBqn6/j9R FQw="P(D'mx<h6wOz)ZRw| t-rm˧*~JEQ(0  ޟ LΟ̆@#qW*,lxxstvvnj}խfՃi @Ө dWJŜ@ӷhܱS1Hp ,9*IX pxB0L a2k"/['IENDB`u1f559.png000066400000000000000000000021741326020644600320350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d3IDATHVmHdU~ν5Pf?\'`q.bkCR$'J "(f( DL#*3mQJc:ns|sGׯ11_<= @piĮ2|`F $M7ʑ`G 3N@S:ΦJit]&cwwvT*aW߽HjPk=h(J)ך{|ﺲ> jO2M{}2_KH>?aks[$tv}`6dǾ55 QwiiCdj=`ZU3 Qm1(o}NH+Sf=RLISp8 A T38Ӏ7Vc0Om055!g5fC++gqd2Ƞ!,NZc5ϟM $bll 6 . Xusє*> v)))p:G$,E1AQbESy$9C]]&&&؈U }}}G KӉL,::j`@[[|>xAUդhD`A_yMDBN6<=-Umc?i8.9L~{'ď 4k4ĖJEu収Ztdd* * y}@pF=WaFfTp,P֝5E9+Xq3zٌoܹ5E+8~Bj_-xĭ/DD`\.Wr( Lpg#nUz/ue@߆[exބ$%%]؆{ܛ2)yi]d@)3`,ۈ\{BO+ -3'˖ j|gx:4{o5z|{.fJԚ/oY/3˺8_0W'% ;/}_<'%b-t< ΆkPKJYG-%9(<PYY Q\|}Y;K"I#Ɋ>>MPڴ$ w0fvŸv$yx^XH$ WEàR@X 1wppI~?~?cppWbhIP?uwʁGQ466"##185߲:Gt:hmm*VVV '3S%-~ rSSCQE{rg 9P/fuuu8{,VUxM@'t!l6LLہE$Yy?^n"ZZZ+WP[[=y$o,}-3 &*,,D___ ׍-08fW}9q7/dF6M* _v CCC|~:~[3柚(L6@ (}Lbu(H$]rܪaޞ rYW԰Je=sXqp\ӫUdqIRv2T'ʦiF>/m|iMj{l7 p`@W;Ѳ# &PU LW0ZbNIgVfd8i ފz+o<[+ǽ;H$Hdw/>P8ZYx}ݨ3hT-`^& כiwmj-GϚfBͻDr@sJ86>YYeex6_^^U?u]-^QeHhƤa@u02jVWWјTi4Edll 9%1>>B&mIb@m5=.<#P3<p^kpiS "O*fx add$NUU f2`f̜s3`J7od=bee;::>|KW(+6/b3=UVVbhh(g4n-kʟx⦞ l) uuuabbbߦ~uͼR%<N'\.׾ DQb1ZaV DnZUT>_sp\&t:l z4j%n13k~?ii33h[hT"}߃IU 5X `pWUUk`00pALߧǺi&B|UjK}^G^ w̥ wcQӪٝ jiroKT(O=WKEN o7S|D'OTkAhnkD8 ;-!֔-)MfMWW>?s4IENDB`u1f55c.png000066400000000000000000000021131326020644600321000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_L[eƟ V6qnpbR(dCM$)Mv^72 !i㮌A Y]bg ^F)^Lf\~}~_$>։]ei21`)ՠc`$#&gc|eSt>`KKXtn<[-qm΀oՔ_|`/%ȗ֎_gh]<ا(EVVVvaɲL,cv*݌&Qmc D]]1OD*2xH%MӨl6|mIW5pn"|uH/];Tvodd1 jxvC*h/!֞w5ؘYZZ!ډ($jL_&#BH̹+*bsL~(ɐj~$f2y!$ngV\ʵFb\Ij̝Q\Y/wNY,C(;YRUiΈBnl|>4|>>!2WH|goa9~` K?,h9v"2"Ȯ)!E@Fz5h4 Mׇl6X,E0 \?i׆Y/VA{{;cccF\.8N<HRp} K]]aD#BH|ݓhFpX,V]!$.p$|v:ll診E-Qcn]-T[۠qS4=XW !X+/ \! S gGL&===}Y( >=UKsa"UQkXgK|?fY"OUUا_Ӗ4HmT$+@ 2(ypfZܶ[чFPQxlɍ9o<{ ̙q_,^iҗ~dyu51W~_-h/܅ ̝QUa0\YɐrVq^+Xs%j"۱T5FfĊo2 vldze`M]kb?Ȕ'~IENDB`u1f55e.png000066400000000000000000000021341326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHQL[eﴞ(q.DL5Sb nL  &DWx#3A$maLJdBrbO9-PFi6,,! 'YK2j%@b0U;wTF 1 2C*ЩP~NuȗV4zJev*api^E*j[,Y`|\.}}}`\2Mo‘̆ y ;*Q(/uvg3>'D?|3//~1ᗒcL$vY1MNN2Icy#/&c ~Qqso(=IdڃH%p@5WX,V0bb2[W(l8'YTsX>>>;*&ǃ |`,cO ^naU+e~k5r~NIaF hnn@ (jpȗQ-G@Uѻ\.D"ofpJ5Tncv .<+pݯI8N<+mM~!|FkƼdBEEE^@[[`zz:o=Be|;\ xCv~Vk_~fx5z^kaw"M-ewsn7M-}oW95[= g8S?e`A0.F7懃;`tkV-[?vuqwM<'066_+b; pGy ڃH!>+PIdKjʴzxH?Ý .pi5JIFO FuG~[m03ڴf N[N1vIENDB`u1f55f.png000066400000000000000000000020761326020644600321130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHV_H[w=ߍ^[ĸÜLXõQq{uԀl^f'"֧11sR jܘ;kFkr=tq&Rvýw )PgB9̱^6#;40Dذ++M5dZfֲĸ%wZY!SifěojDC~8E>oY5@NHbH7ٙ_]]呑> EQXQΆymmoES9صYdeONd03>0==͉D9c/d.J΢=I|x#@MkrEUUKFhUU/)i<HXtfiߏ)|ff5)}Z]&\齦֗V.JV׿t)* | 8o3UFBt: lfL׋xݎђx<׋WL' 0ϓe8 EFxL0r BEGyh,a\6i LFx&WZoNz?R-ʳ1 l "|l~k;%AɄUe@(Do8ʳG/U 56:33CtndY>tVUUENz(mһ mEA~qoOPoo/BOO|>""Zڼ)?_t^8$m)M]k1myD+WO{8~ƪ#rP󼐤g.Rpys xɧa`xxI$/Ф4##c=83"B)app #Az1CJ;Ѐ (.. Z'IT6"U02jQ5 |:^ٌ  atOZ}QNNYVgB42Ebb"@XS1s`tC= #{,0fhGaʼ%fkjjՀ8zLMMaggގ:tk"RQgb :W1dڏQ! b{{X,xYwwn)T粬&vBOׂjڷh{HJJn?"fWGd4ꌗݯ^F1.1t:]̯:/o*N7OZ峭H@Q; c ^%^_j޴eNx;)>4-|b B1r@ٰHjf1`dd v=a@Sz c1%777cyy9MMMqy$ Ϥh!lV+yD"y>.Ol6#BC(~+H{{{JJJp$s aHOy#D= L8q"w21yX -с~l@cVU1Ӿ\}}=bhy Fcc#~zTTJ3  VQrsK`2bPG555wɌQh%dmK:4#˃fCrrf]i&Q2uƫ? 9>syqa&3zzz:.=DNx;U)󣕖^^cNv#L@3˷=׻X-ћ3ǧ8[q$k9%G!X[x"F#:::vNЏg3T9J {`IAaM *@K?Bs(e:y&+sZ 51X5 G0,3AƻСV IENDB`u1f562.png000066400000000000000000000021311326020644600320200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]L[eii Fi5 GM͖!]p5^W[HZ!A$x#E [f=-c[-aZX{ᖞC[)x%(펙}>O9/sZLh=`H@ctT|TI[䅔\juƵ3&CMQWkYٽo$k׼i1nR{C=\.A|lSI|nk pNJ%#oVVVaDQ$I6::JUbsHRYχ\8%"JRI OtB(s#5â|-_H xA]2Ljd׺XBQh8^HYT`k75" A0>j^HY/$?sw6~a2/=ʫG;n<ҿfD;SFh4 Ӊh4i0A$ǀQW Ioy ou @x$oltbKeXL !b:eAro-zC qߘ ,h02333m*񘼽W_e y[:(4K:?k6JgLj[ ;deeHmeRY4 JBB.cb=[{LPo rCpIENDB`u1f563.png000066400000000000000000000021261326020644600320250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATH]L[ei-PkW[0ƅd;ӫiHP;,z6ȈՌQİ%pЖqZBx :w>yr'йh v@`H@ctT^+sB/b~wTm4*4&N`3]1 ZFɀ3~_iVk1Ŕ}>|y(OKKדH[goJcّjftFbEGXX,>yTBB#YF^^/QQO o󾈙z-wum.@ύiU#z:vSDF]E `۱T2QWb8XeJI:UU ff(*$ hT`@6u2E 2>bD`1/{B#WL$y`ll mmmO TijZ0 M(G.E˅X,]YIQcܭʹ vPYTN~I(<ϡnøW~ɢQe1}Fwꓚ& قh4 Y~JoNǜcj\К? 5551/>TFcv?2Gy~O⋦oix; }ѝo$mw%_KNaxh'2A( 8C7B.-u?v}>|8kʗ '0995GfZ} ٛR.kXT&4Jx$[iN8 + "fb7yk:Af43&r jQTMxIENDB`u1f564.png000066400000000000000000000021201326020644600320200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoLuǿZ5e){ 6XWM=}P`B"$ $\H1l pG-+g{/ft7}3q bW0EeB/Usi,Ex|J"l%{i:V+sM dY՞Jg _x=c @L~>֒+0[2 +(BYGG`(6'n~P:YideW'0HfiDD4N, [?~@Y|ڙ3U4M˷RtW_Ronnl./Spv@Kwpxx~~###^@ )dq;eg|%G5zNm< IT5cJ#O%] Uv`,C[[ @EEjkkQTT1@oo/<3 D1ǀrWoV<|>0>>AԠ>/G1FBSI6 ^^a`yy88q rG{aan7nZX0MG;,q`\ <\.\.i`)'(1`VizvȰL1(GEK$f?2$+;EIMÁC5MC$'g 4NZr?%%%sۺρ f$-y7SKEd-~0^M>u\tu@7gB;R$A 05FwgAPs&~`eϬ_!aeJBkve1=(][Jn2zMt(9y,sY{dJNN= "J$ <mmm8ze%׻zs.+;5p;YⲺw 0V/TJ;E!i46ug477 MN%xD 7Kϯ-JSgg'n4[V]~WqRE~sHsNbT &8i+%חEVVV 9j \h@]`@h0~_Es8NxުĪbbbFë0VqkEL&S9E@ pYgZC[]]%AkgU.+E73Qr\.v;v;Ng73ڮ]H>,GE(ߤ`cccxw E#.)ߘEߚ`6aX* fff*S4L6m<׊+>,(2_/:#Oły\g%~ %L&OeW(BiAJݧapR[,e{@þ؁NDj D"c2v/u?qczWI6,0oO`jjkFGa8yEr_m4~lTfWL4W>LkG?mE:+*RS.%l 0 vط%'}`ZqYeĖgVIENDB`u1f566.png000066400000000000000000000021171326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHV_L[USX `dkAƅ38i 1)t>I_|DgeKp6Q-mYo `\tsι '@G>։]gEj 1`*R$f~>)5焒S(㤖YZtsM6ZͲ_LOoV}7c` ?_;:N8Qٍؒ$YIgVWWta(Bkzj^tqXfYd%-G3(y^2BOOB!""G[f6ڎx.Ɋzw}{Q"t:m(xg=5'ɑĵ*X"^)MXڊ@<l2 q?]l]w_U -W0a\`0h( L&1 &l vsVe?~dbZf6ڈ{f]eo Ofww7`hh ;[Y5w&?VݏTi g.+Wtne&~9]-Q+G:]:۲5>V3LP]6 ċk:LIENDB`u1f567.png000066400000000000000000000021471326020644600320340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMLW{ꈘb1&Y@ZJPѐK$,h]#$T PTlXuAI,UUQW: M- E111xn ОhΝw5pDoƸvK'v`ĀaS%%D;_egi/Mfc{m'<#ۂ *$?+^-03`c ޿6g^f%c+߈]\\:,YI%yBZ},BkDIޒgDD`n7H ƞU9rHEI_7NOO ivo92.Jzc%80h W5J(JBFCCxPr%KUv7hӁFg%')|gg#A?Egp[m)'V?;;mpQ\\|į,0XMYv{ز4/8,B󡷷oXL!.pLfEIڊ*TWW%S. =c'T DIWQpᠧOn_^E}$q0 EԘQ9eee(--5,.h3`4k/zACQ[ZZv7t``mmmxQ3'rbj  믮"P5hL ޡs)w"4ZoTްۂLG?S:Mn7VWWP|':Hk,oz0~aߏ ,o>r A11}Ϊ]N?XYd1)p02ைh߮^w~l~*t |8,Bz;)fxEjlr}O&ؗ ڈi7 xڲ%>G>M:FV&IENDB`u1f56f.png000066400000000000000000000010421326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͔?SAϝyYL0,6+ۈAlcec!V~?`'6ne+h'"عZ%Xleȿ{7wUp#L03 K|C&ۘ >ON_6x _6n>IR0Yo#/_ش}\ tw1`n feGƨK0oSФ_]!>I+"Z18Eqk-ιl.G;p}p HlcInnwGɳUU}ϲlZ{!cFcE!@D_FC3@d©*B1b2{Xk7sPU)46w$(NkUUAD`>`p^Dz"r&eYVc;Ii}qPIENDB`u1f570.png000066400000000000000000000014511326020644600320230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOhTW{3Lhp FZ0IRqi),$`;$Y"m7u#,M**tJ@g3JquftZ(s{w.^xOwr3|^ ~k({,FDʥ]M\TO27{噵g~yǠjYz1'G~^r ,?67}q"ٴL;?#WTuJC-ǧAn!B{:pgΎpqр0~vr%hg*4|r<Ȯ;TxǙ@ګUY lmS2~lR@뿉 u>}{xA@2# |Jl]mw=T<qХ7;O#&IENDB`u1f573.png000066400000000000000000000012241326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dKIDATHKTQƟ܏{3njI -.$AȀ-]7DUVmN`ff*:7{;sOFL[{{p2tgQIr' A!:}x7*4bj,X%MjDm_AL=L~^!IQ]F\ tpQ5C!xņW߃BI2dEmZA|Ꮍu{fr<0k=x/)*k.UT 6z=d9xaysxLӔۺJD3 kPX "BEtt]B/ťn>bruhyZ g],G/KґM<GD\Z<6yufזZ]f>wO* LQs 6?? `@xv"z)eYg#D0>D"@ØsT6}<۵z{{2HuL[\\ ~ܳ15u! "J !V01d~Q/IENDB`u1f574.png000066400000000000000000000011061326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͔kAǿov" kjZb==y OPЛMz/E0AHKSJYݺ4]w7<4-HS{{73$qm78ލx׶X [BRNђ/y@5|]5J11%$zeyq֨Y+t9CUPՖ-z̍y?=;Y(ϣx!f܎a4EOr>3!^4 L*^i@D3#MSl {c'2(:B('P><Ϗp(JR0כsύgAh,\!E*RJ蘋;U͵ zE@D[|4[MBN8jڵ,n}󼌈8sO;u)?4hZ$I0$ͲM^U%IRBDSw*hIENDB`u1f575.png000066400000000000000000000025421326020644600320320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]lT3޽w׻kc;8%ЄR(n* PJ/E(֧-!&B !ib!ղx1u?geCrf̜9{<(ZH)+۲5ATևoGFF[hu Hi&U X2Kk&;}ހ}-SJR <Ѻ)P</NLLny$jZ?ٳn{ 8D/;wnmضeYAkR QI&*0:t6K)V*fff.SJ֭Pa>622rz@2$ˑL&wܲ,2 }}}Xa5ZnRnY֣Ld2ADQDH)1 4q0A0$Z~6q!ɟB֑W=ûR ˆo~:O:yu2l9+5:R>ng)!cϼudBh6Z§ޑI}d;Js·7l˗/6J>=\!28pkg+$N^#LZ>?龷 }k׶J%Ο?mۍbuŀ͛7)R q(8UBPrƶRjƍko#uծp̙5@@ eY?ՠF)RrLT"d2y0w{`˖-ygnSJ%  <[~*Vk}/@4%JF*u-"H\y޺Ba ˲% #H.m>!0 L$ bFE6q|uz:-VZfID8Ek,D1ٕHaܢ5-lJRn~Me2+bVm֓)Ke4eQc~mtt PN=wbV,̙aF.貨q6cstvGhkMlVrY Lɫ m*xgtr lL`8spSn1%PhbnwQx`֧ ̍Hs,jm ZDˍBܻi۸vy` ilb+''a;C =?\-{oڕK6lZrk-Dq9C .GTiɉf~'wlp8}G&%ޞ;t?$mlߩ͹Kk@L?XrgZskw/0]W~xRO3>sC,;yN@_18siɟ?wI RZDk_ɏuϾ9SS7ׯ_p¿=zTk֚mI΍].YD"ZG3Rd;`Æ c7tz^*H+39IY<ϛ x<^D^?>Z\5G/\~*5k_t@QOWR={cҨo&Ռ8M!_*60TrF5ff׶ԻvLe3,IENDB`u1f575_1f3fb_200d_2640.png000066400000000000000000000025361326020644600342160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlTU5sg:LPB%""|+DM@IL| ろ1qhbԅ/0 i2Sa:N -Ws\misܛOcJl߾]fo)^u}-Z~I)y<}tj0n M4hҶ˲n}RJh毻lٲNJxxRj-D"c7*V z!|o͵7;ڶm۞BNׇa0eaRJ(XL6445 ;vغukkJtz6uTD",]@ !looZ HRbI[qCq˲H$,\ZKTf\~XӴBD"A"}!躎amQ<.!,ueYɆFSlQH5vXu4MJ)=~kRApe O6KWiI%94 ][O9KF %2A\?h~Lw>gF WصmV/_:!![_-yZ[{7$jI(V>A h&d|Nip)w_\614ffi:&P88xU`^NZM()Yq x( sH)ˀ8}'W5M|/W303IENDB`u1f575_1f3fb_200d_2642.png000066400000000000000000000025571326020644600342230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d&IDATHklUU{sz߷0W*t"j 3:FADDcb@L|DbL fd&K!W@LBF:-Gko)kZr`m۶MWJ)R hYVyx͘~ W n [-˚㺮!s>uŀ͛7)R q(8UBPrƶRjƍko#uծp̙5@@ eY?ՠF)RrLT"d2y0w{`˖-ygnSJ%  <[~*Vk}/@4%JF*u-"H\y޺Ba ˲% #H.m>!0 L$ bFE6q|uz:-VZfID8Ek,D1ٕHaܢ5-lJRn~Me2+bVm֓)Ke4eQc~mtt PN=wbV,̙aF.貨q6cstvGhkMlVrY Lɫ m*xgtr lL`8spSn1%PhbnwQx`֧ ̍Hs,jm ZDˍBܻi۸vy` ilb+''a;C =?\-{oڕK6lZrk-Dq9C .GTiɉf~'wlp8}G&%ޞ;t?$mlߩ͹Kk@L?XrgZskw/0]W~xRO3>sC,;yN@_18siɟ?wI RZDk_ɏuϾ9SS7ׯ_p¿=zTk֚mI΍].YD"ZG3Rd;`Æ c7tz^*H+39IY<ϛ x<^D^?>Z\5G/\~*5k_t@QOWR={cҨo&Ռ8M!_*60TrF5ff׶ԻvLe3,IENDB`u1f575_1f3fc.png000066400000000000000000000025421326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_l\{\۩/ePIԂD(R %!^R@D>TQHH Pdi(r48lb'8fxcgzCŻqRә{wwСC2Ͽ~NJٮ:n˲0hd^57Z qTWWGaps8J… ަh% J188(ztddӆX6qf8P5Esr˲p]z(h.\^^.M"a=⺮.ayqERJ 4M$ae XEnhy݃U:wi!҉FYB!KR 2Hs荵5WΨ,u٢%=bLFGg7].jj#2H$|ޞZNatZ]Y;nw9Y2ieg3R-Jۉe%-J0yd*gl"@%iX*bTA 5QJP(ă/~ӇH&,:R7s9VlYHfy!ʟlf@8)Tqo0ti6\daOnh\(8:2;{hi) )]_wǢJ-:~={oykV+cǎiooK'__'+.Xi&ݭ <ޜO6OGxj|4 EjK7XVIR"VZ 6n{2vz`hhՓ'Oj>ݐpl˖-ŇG;R)C(0qxٳS|~S6KnYV8@7$$ZZZ~}Z2M}1};w,..T*133mJsEzOeYǙeKֆeֺgK (~qK\4MrdQ@k:guyA:堓<^{g" z{fU"nB摿$j'3#<+x]SC;\u]IENDB`u1f575_1f3fc_200d_2640.png000066400000000000000000000024671326020644600342220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoTEsΞveW(@ m!ŪFM 4H/h x7^bDQ FQBHJbKYnK93^Tnj̼}8|Loc^R>Li o4[Z<o1۶pq cLY2L 8p@\k}pO\}D"Wȥu+%, !{===+ġC(Tj뺸8Xwk0ƠFkM\T*FussY˲^?r=I)yR۔crD"tuuh޾\cSh6hMհ.;C"`ӦMU-K .˒gG" HQTPJ!IJ,l&cYVն*cnї'Q b RJh0OS߼sk2t+Ⱥ G\*7z:%"nHQ_oӔrOL" etm|SPyqeks|4U4akLЊ w&¡F2CGĶ-gshWCK,2Q ZM), ],l˱ᇘHSB@bNP @<@ӚU4(fFHKеy=acHLhcxpE_k}?T],yeS7ݾMb ?zd:]kЪ*~vEl9 $3|bf&L%/]`t$ɩ/>CN R(1V~@;~\[Oo=^ݜrd z]#Hc*B> н110_( r)&066;8 x7~w03ڥ:2f$3/XHy5lByh [Zd" ;΋g.5pF֪_q>6'>A)$% U$d/-8|yȊ~OKv2::U}btu~ɔB65Q?>_MjJJH.öm^J8@Pj{3zH)97pjfZrѝsjx{m/oxXUt~ee@-5/R,k.;!<:'N+E&!TkZ/$F+aIENDB`u1f575_1f3fc_200d_2642.png000066400000000000000000000025421326020644600342160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_l\{\۩/ePIԂD(R %!^R@D>TQHH Pdi(r48lb'8fxcgzCŻqRә{wwСC2Ͽ~NJٮ:n˲0hd^57Z qTWWGaps8J… ަh% J188(ztddӆX6qf8P5Esr˲p]z(h.\^^.M"a=⺮.ayqERJ 4M$ae XEnhy݃U:wi!҉FYB!KR 2Hs荵5WΨ,u٢%=bLFGg7].jj#2H$|ޞZNatZ]Y;nw9Y2ieg3R-Jۉe%-J0yd*gl"@%iX*bTA 5QJP(ă/~ӇH&,:R7s9VlYHfy!ʟlf@8)Tqo0ti6\daOnh\(8:2;{hi) )]_wǢJ-:~={oykV+cǎiooK'__'+.Xi&ݭ <ޜO6OGxj|4 EjK7XVIR"VZ 6n{2vz`hhՓ'Oj>ݐpl˖-ŇG;R)C(0qxٳS|~S6KnYV8@7$$ZZZ~}Z2M}1};w,..T*133mJsEzOeYǙeKֆeֺgK (~qK\4MrdQ@k:guyA:堓<^{g" z{fU"nB摿$j'3#<+x]SC;\u]IENDB`u1f575_1f3fd.png000066400000000000000000000025211326020644600330120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlT{g\c;0Ì8w7{?N$^#$UP\qy 렴c5 ;.L}E/~ǎЙiXUl3`' k5:q KD|nP(8n.D^Q'aS<&ϯ/ ([}[\MYR237%vDA"g>;y!NF?h; Ν;Oh_hOz11wf3[kQ?l<'3g'ZC@.{ŵ%nVTokwSXR L}pG{$#or Lv^O=MǫNRnW<ﱐ -.A?2صk[*(ΒL&U \rLLL077G1eJzWcÛuĵ&@E?㸭R`&ض 5=} @JKxл/µ&z: c7H.WX BlogœjB4Xizn9P,)k܂@Sp-.IENDB`u1f575_1f3fd_200d_2640.png000066400000000000000000000024461326020644600342200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoTE?3soGҖnCEF(>!cx@^1}01MMA%h &hKuiw _c<;s;VoXk_R3\\ ðl,N988X]ʅׁw8N2\{]mе6 !`[.;<22b7`߾}-Ƙ# `!|'՗H$ gΜu-%@rZ޽{8x3Zb1b뢔B[5Xk1`}*TtttSJ?tReW?XkWJ@"hHRtwwJꪆo2dYlR˥~aeғJw]ݙffayDQ)%J)! k$ؿ~aӘAdpb:Y1X!7B`0JaFOc{V$R.-LKa"ccg}m*RQ.CW.ip75 N@)cۻH7_04 "JK&Cog;xNaMz$R˟ǥ"Zbca- #%;߱E=K]V0(,ِMa=|#cjX,]Z pm@ksdQdX75P 6"kR(1Y N\0ppkcڦh%ʥiO|>ZDS3|$q+) +lflus>Βnц Ay}7Ck3z߻rw~b dۦ&|Zo)UB@#ex"!yUn j%TBéL)]/3SX體*4J˒Y:׶i^>ׯ BJwI)<{k|ln>i"Bm\|*`5jݜN )id ƭU*S*bvJfggx"X(c˒eֺ9qL1aqLs#HZ։Eallx< tk2zGH)En̶|rޟipf;;6DhU<`gSTMB%0Ì8w7{?N$^#$UP\qy 렴c5 ;.L}E/~ǎЙiXUl3`' k5:q KD|nP(8n.D^Q'aS<&ϯ/ ([}[\MYR237%vDA"g>;y!NF?h; Ν;Oh_hOz11wf3[kQ?l<'3g'ZC@.{ŵ%nVTokwSXR L}pG{$#or Lv^O=MǫNRnW<ﱐ -.A?2صk[*(ΒL&U \rLLL077G1eJzWcÛuĵ&@E?㸭R`&ض 5=} @JKxл/µ&z: c7H.WX BlogœjB4Xizn9P,)k܂@Sp-.IENDB`u1f575_1f3fe.png000066400000000000000000000024771326020644600330250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlE3}-\Zm)HD GИpe.qBc$&M\hLLu. FFEEKRo_}}7r/=9g9sfF$G/cRZ@m0,c>hmm},ٰiӦׁV˲T*uMm 6ƤwA㡡!:Rk}AA1 zd~ppJy9\)F7^a!S<5z=fqSW=p=Xݻwny8m!۳Q}oOq(~&s_KĘ~dHErLQD N|A9(c/|{{^{ܾ};KâR [vر]Q0>0hGV3n!B.\@eK'$](r۟ʖ]v166f5;̼jJqփSgϞ{ ccc8S*}y3#u[./RN RPJ8UVlAEq.X0[d1xGH)ul;R6MY afU8 %"jdا qF~4Japy^}18Lʁ|>O>_R+<%IENDB`u1f575_1f3fe_200d_2640.png000066400000000000000000000024271326020644600342200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoEU=ˌY($,,r!8!"!PF$dU"d#8a<^l=U&xtz{{044$'ƘZq lv1滦O˫WZm hmێbHqvcL5v5ɓ EZyJ0.h4}T: sX @9sRıp8L8q,Bʧ9cZRP.㺳7˲N;wgN>R &&&.SJ1% }vzsxx8Uk9"e ^8dZ,ԉ b-)Y':L&I&AR )%ea6H˲jy}Q)5DI5nuVX,F!OBTr`xt \ZO$|6TH$DބM}HQr}\m#lEfm;ků4-Gxg[XhJ1ǶmƈD"(ʍOu]hmm},ٰiӦׁV˲T*uMm 6ƤwA㡡!:Rk}AA1 zd~ppJy9\)F7^a!S<5z=fqSW=p=Xݻwny8m!۳Q}oOq(~&s_KĘ~dHErLQD N|A9(c/|{{^{ܾ};KâR [vر]Q0>0hGV3n!B.\@eK'$](r۟ʖ]v166f5;̼jJqփSgϞ{ ccc8S*}y3#u[./RN RPJ8UVlAEq.X0[d1xGH)ul;R6MY afU8 %"jdا qF~4Japy^}18Lʁ|>O>_R+<%IENDB`u1f575_1f3ff.png000066400000000000000000000025001326020644600330110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[h\U9s̜̤^"imԪBDk⋶-ߪ}m_ć>"D "DQ((jPm4Icf&3纷iiZOk}fA:zxQkM)5 Lemð~/ɼ_k>߼@wwa cJ8mY0 -uZ殮Ϟ=7+R' @)EOhݐ'L~@^x,сR؁7Fȑ#;0|ntttmضeYWjZB)j5\U x\8tR{+ ###˷)%ZfH&(z+y\m$,\.Gggg=WE7`.,,<(|ٲr(Rbi8ae dEGhɸH&E:nE1r !g!$531^p@i9y%c…rl<]}=4B$6q&6>~ A9Uyz~[P 7mY}M+*%KlM*ͼᶴ֚!jcG r>&媖4p~znqJ`& DiM-rn:$[OC2\{;;u?L*d6N"ҩ9/rXNK}Cv2QJS4Q&b^A}df>'4ESSSn*a=q,@L*x fn[WQV)U }ս{\`^RjheSnĔpT!9Wš!Xlѱ Q[]u8V}1/ڧ/́;v|ޙBgLa'P4E/+ B=ض%đ^?=؜O6(mrFz>Z!Ő}6ߞN>3?3سg϶޷3KN!(KIe˖b|M_)+ٮCc{DqB?My 2}o~ضl߾B@گ6^ޓ dbfYDv377GPzW g|> cccX+dIX̒dHN쪿fEq2ir9Yl֬*LRJFƹG(QƬʉ'z2@1m`?055;5=A>=- Ǽ B4XC|z5P,)Kn|޿A;2<IENDB`u1f575_1f3ff_200d_2640.png000066400000000000000000000024401326020644600342140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoU~]6- QA/RQ+\aDn3ECL4 ER֥vgwggΜŶ[Js5>>9 oc^RnZO@8=azƘ[am  dm۶x<8N{1&%x4g8qDh zNĵ7H._|q+~y) Uzh9~xV{ N>=:999뺸8Xk0ƠFkM^VNuGGǷe=c RVKC.D -щa6 DC5Pd)ijnʠ| 4XR@w2ȥEZ\[2cA0?eLEL&wl,vA!4eaE/l+W˴g*b\Wԇe[!)aQJoQ[ .lfk)4lc"a^{`#GjX,ru\]㯹Ts<ϟgffXvQE09Nj'R/)r۶vxeC-sf} R2?tߓ;)?Ĝ+=5 cvqD:"H]EYq7}}7\dW!v5q^ Ba0,~tIENDB`u1f575_1f3ff_200d_2642.png000066400000000000000000000025001326020644600342130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[h\U9s̜̤^"imԪBDk⋶-ߪ}m_ć>"D "DQ((jPm4Icf&3纷iiZOk}fA:zxQkM)5 Lemð~/ɼ_k>߼@wwa cJ8mY0 -uZ殮Ϟ=7+R' @)EOhݐ'L~@^x,сR؁7Fȑ#;0|ntttmضeYWjZB)j5\U x\8tR{+ ###˷)%ZfH&(z+y\m$,\.Gggg=WE7`.,,<(|ٲr(Rbi8ae dEGhɸH&E:nE1r !g!$531^p@i9y%c…rl<]}=4B$6q&6>~ A9Uyz~[P 7mY}M+*%KlM*ͼᶴ֚!jcG r>&媖4p~znqJ`& DiM-rn:$[OC2\{;;u?L*d6N"ҩ9/rXNK}Cv2QJS4Q&b^A}df>'4ESSSn*a=q,@L*x fn[WQV)U }ս{\`^RjheSnĔpT!9Wš!Xlѱ Q[]u8V}1/ڧ/́;v|ޙBgLa'P4E/+ B=ض%đ^?=؜O6(mrFz>Z!Ő}6ߞN>3?3سg϶޷3KN!(KIe˖b|M_)+ٮCc{DqB?My 2}o~ضl߾B@گ6^ޓ dbfYDv377GPzW g|> cccX+dIX̒dHN쪿fEq2ir9Yl֬*LRJFƹG(QƬʉ'z2@1m`?055;5=A>=- Ǽ B4XC|z5P,)Kn|޿A;2<IENDB`u1f575_200d_2640.png000066400000000000000000000024521326020644600332320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTU{{ױe"CJԆD%Eµ 1.0QXPCԅ;1ߑ -)me1o޻^#SƳ{wy#X$2Ͽ`}FJsֺ>Z}xhuI$kbX뺙 \kmV9022b7`ΝƘC `}jcmx0<kz|:|TD*3,nBd3%*̦Ϋ(V.4 m@o%v) 8y%1xk<' nc̔LŹLofw:'d$@jPFг,:LG)"Fp~>RNY)!/AͱTk?D\Cy1N&q3^"hL8{v9X Xf|VjLh rL*eCD`-YbP=qlE>/bUqLfA^?*a|,o-sOP9 + X;r,Zbs3.31r^ɉ#|S=[͹(A_REB(Cݏf Ц-aU\H" ?"?"h --9˵̚%V@:ԋfTCݍ7Qr䔯;'>BlC~:/MWWWd{{FRҖJA*CmFYg1jضm[_=sssLLLF5@%}f 199ɩ^!g[zqU3MZxXqFGG7Iۋzy#9=M+/M5^`]Y&o9V90==ɓ'T*M@!{X҇rR(( ?F_UoIENDB`u1f575_200d_2642.png000066400000000000000000000025421326020644600332340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]lT3޽w׻kc;8%ЄR(n* PJ/E(֧-!&B !ib!ղx1u?geCrf̜9{<(ZH)+۲5ATևoGFF[hu Hi&U X2Kk&;}ހ}-SJR <Ѻ)P</NLLny$jZ?ٳn{ 8D/;wnmضeYAkR QI&*0:t6K)V*fff.SJ֭Pa>622rz@2$ˑL&wܲ,2 }}}Xa5ZnRnY֣Ld2ADQDH)1 4q0A0$Z~6q!ɟB֑W=ûR ˆo~:O:yu2l9+5:R>ng)!cϼudBh6Z§ޑI}d;Js·7l˗/6J>=\!28pkg+$N^#LZ>?龷 }k׶J%Ο?mۍb?r###_1D#̲c0 gף/P #IENDB`u1f577.png000066400000000000000000000026431326020644600320360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dZIDATHklUL;zAjlGS zM6 ٸ~1Ѭ~0Ġ pFde 0J$(jELy?(d:s59u9Ǘ|:00xF\N^ߨ[־$rz wNMOO,] pal`C;Ѩ{WeB״Z$HBwwZon;kd/k*<|U%XH+G(ԜW]7_y^7F2:ҢF(a&Ðv AC!xj^VU(5Wݑdc:F0Ե~$y*Tf͖e8ڢ3Pphzo5N!6-ѡަjÇv0K;z/bE1q}ۚ>e/I4<|fo,ګ/wK 7K@RssK@P I!5-ppD<@!7 pTUV4;l–]۷Oz6k!mˬ1H9^$! ,cc<i?!?6po'r9uL"Y4@<[-[7oCwܴa}9nW4>0~qb2?<Ȏʃ!!t=otoQ΂ R>|ٶSp*+37u˗z=c{{mm(ʂYǺ֖pu㓓'á.)P,kI^9S_ 65:E󭗦NáURNS MRkj۲'mj=O>/.?9p:S׍@׍K^2-EjY"c&[8eˬe|kYuԥPH$⵱sʃAGb&}K՗tIEM<[SԩkCn2 :Y;ic4M#3dD~Q8~W? ^ìjb?@CCcG2P A9?;555Ío9r6\W Bmi|%|?6, nھjz#FF7EWcΣeZT:G>:vU}Bc69 kV {z^y|F]yz# OɸLj; MVź3iB.kZݑÇV >b n7O?F}c)߹@r15o22Q*:W[h4\s:44sfk2ƤVq#/(@$ KnN6J˅,dNWWd_٤7|<~\V|jioEkZ,¤ KJd42"9I͞ 1fGdDdsFZZ2De5-(--նv8>`(f?;w I"S&?/KihhO^ٳ:\8%%%MZ=3 |uCbis̹_~䂅էNWܓ:Ԣ Sor=,Cu3/b#KJJRn.fIENDB`u1f579.png000066400000000000000000000016441326020644600320400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d[IDATHmh[eOr/&YIS6_EOVm,Ea H݊_6TYVvhaЗ5dmc{դ۹?,xr; ŮOؤJB t=Mj/ķ h_Uz5jRbW$F/Ƅl1V cۊ11 b퇿^ͦBHW;2St'TH0St+jiLbW1;Pw +σ&gW溟:*E1kZA <>؏LqF"C8{awNVogrL*mHCkt]8̀چ:!BX[)%˙Es~Żr%r &4hq8%N&f>9K!/!S PW*]ksSWIOΓI1t\a*땡t)m;Bq(wNnbH1z;/oP<6w*e`2?1]Ml2=-o&]C5O1/Е ̀Cď}> ! k;Q5֘IENDB`u1f57a.png000066400000000000000000000017101326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmh[U{s&Mlk k骣nn}"2? Ģ8?"")S2QeglasvNG&]piƤMbޛ?%f>p<" I|a+V''GO]-6 8EJ(8 yFE{faB+ɬ eRPk eo$Jʉ}/m+x&)t] /u]h6z}}~:vƿbDlRg=6|&\׈ 8,$0*Zsq'y;E_㗧;j9c.9Y FE^43Mì$HR`5 rv|T,chְYu]*ӇwohD"G/\ǘ,@(g}ϧQJoڙ?i #R"q<.V_tq'ꜚ*-̚/SlStHgy͘&eVI(JF 4Bkh3I[ Wdӣoj2@N uP_v[~(lA4*c`3I^ J;ڑ_ܖu _xD~ cٹ,@GGG5!٥cJmpp0 $#ezzzcR::44tnq[ww,ؘb҃Vs(xh#z=jJ lY+oY PIENDB`u1f57a_1f3fb.png000066400000000000000000000017251326020644600330710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmh[U$.M&Yڥ2iV0ݰ$9HL-)&,a"RT' XkV*]dY6mӤy9~X#M|s?CPF8N^l>Ʋ:lzZu%֮W@I+KüZ-AƂ Ll kdɀ#&X-RqO/bCI+B\t/Nӎj-V#aůSs}*89D0l] oqT2*1]^sr*{v*ȚSګ`c2`6JCwCB]/-yDξz290vLu\5dmiijпxн;>y5lBG>{4jjM\k+,Zl4(VVcy9[j]lW KO-Ф5aC,cbȉ(?1D!!#@&TTX{ޒ (8}}+临RhQ!s[^m?dY~h丵C]s&UZ;_,DxD:*fiz"me%?;tfsg~v05zQ2`<ŁG1 4 nEH*6R.-t:MxR >Mky#P((cosDOH3Fu6[$kي}}}](8v'<_E^[EeE"kmmmV)6TrsSW_Y7jIENDB`u1f57a_1f3fc.png000066400000000000000000000017021326020644600330650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dyIDATH]L[eR(/i Xf`Z5^hKbpH!844Knhq&lY6IQn(8=y5eg>I9`xe3*͊#߬nί]T4*ڼC7gt/Q.?((t—/ԗ'mDa1^T$u,9H<. j :+WwRj}M|>Bgr&7of@)z8zo}rLAĖpl3 sOB7v0X2?]Jҋ}+zQ`yy[Cߵ'0/`F$bG0[sKMV+G?e 6^O4BdRX_sJ-@. 8l5XXM>|xt@,n&O'2LbqN"!WUO_,0{19pN_.d9!FM@wwۛ4si$SJ g%I] 纺 xv7do6B.mE7LhHIENDB`u1f57a_1f3fd.png000066400000000000000000000017101326020644600330650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_hUƿ{gfwnvf'MRt%4I>-1bZCBb+P>* J[ )h -EӴh[Ԧ v7Nvgv2s}HVBȟu |w/KGC!^ğH&_)j2DɥKuI[kpK0SJ(A,ܛ쳒AGlx}lR?f> V*+S$O).r_ :CWc]]]ɜ+ u?.mLܹsllj޼}Q}C 7T!Q3wi"ϑ,cռzo{vK~%}\0 =^*>uAЫ񸶣;yb.]],y+}svjFOONg;nh)Ԍ.<҈Y 0-{odYJ)fffv Z^XI˲cEcD:Auض]G{lȓ[:;;4@"2Zhh{k#tp8loai9PB[ZZ69455BXv-\@l~YQkuO+G{{{#HsmmmM,;{3<<ւUR!ʢn(\5O]3DIENDB`u1f57a_1f3fe.png000066400000000000000000000016571326020644600331000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dfIDATH[LW9sf.`Cmt1ŦF-qبGL)VjZMl6iڗVkTM4ƒ"նXҐ[\ ΜXCړL239s#`x^kإVM7n>}6??FrY>L]? "=ZF*;Xr0ۑmao& 5BQ`ȳI 3ŖT<|)~?x6XZm)-*-|i}*踚e`]| kq9n)"q w_vBfWOu[i"=X Yl t{s /]ͿH$cIENDB`u1f57a_1f3ff.png000066400000000000000000000016631326020644600330760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|djIDATHmh[U97I֮MlttJlXj˺b,PD/t_DQB'R*,%K@)CеΤy5Rkf<h~@Zx+cQ5بX]]2u_!T͆Ч {^1ϯ]0n85~6yc^Zߩ{s$ə3|p>&&4M*">vKG "qdNc˜-@ڴu1@7v&8#S2s;6Yt FFD@=xGkBO Q}wwޒwыW7jH$4,뉒]3.OLL|Y$iDQ_JLOOwb psNMM=g;V<J u@eZC?JIENDB`u1f587.png000066400000000000000000000022371326020644600320360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dVIDATHŕkLu?n<$-'" JHӢH^RD|gjkJDkX@O7'NrSf(.b Zu^s~nqiZ9ľ-b+U!G|s=ۅ$ȑ=F~3!ިB!b6\0!}Įg<)y`H՟N^3.c2ĎH~qܑ9|@VԹ++ZA(jəߴtO<KT'7ggGP۰;|:lonyQ;X EYu<4v<@A_빼9i}aռ]M&M(B^̙Z9]0) +x%~~eѝ=[ֱgt՜NMd8w6n? Kh];6&cRGE6rVd;|`h: wՌKդs˹LłJ:yӴ 6$>("!DV*<0 *RyR\y>B'Hvi^S"`)Z~~ pΉ;(HkzXAl8T&6kȴ #'Z5~\>D[?i?/rIENDB`u1f58b.png000066400000000000000000000012461326020644600321100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d]IDATHՓkaǿ>sSx!Xf6/ p],`tEPL-FJʛQ(].3tQ~0F6j szu>] N\$==}9in5aI'r<܃o^`` RƆ ح6^lo064` ާCC`x6(!Zz\ŵUoЀHrs㤴 ހ^&Bq)scD_"߅gz*hxXߔ0t+2qwfuJwx@p ԺUH-G5Vdjvb,RD|ϖ-+pDWR:-mf6ϺxC/i{2 bn⛗]ݽW* 9 8'f6sυ#wRJR)Jj2i43bpD"qVxIQmp2  , "7FR>B~jz 9V*)6WcEhZ>l2'6IENDB`u1f58c.png000066400000000000000000000014431326020644600321100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]HSa{5s~}QtQDjZIH u)."DļEѵ ʹYJZ339"ӞCiJl5\_jI$0`ݡPҭK,ITFրD6 +|la(V G|% @40[NoSK֕59Ax#&B+ :U)^ (EGdh% iGÒ/˵^QOyX}ř6xʣ @ C=)[mnwV4g2beƧ睳.-5WWc"Ve4|!Wu?[ov%7v;w 1:Vq3XF;5a6L" n=լN~N"%b%!@j~qxDk/{bW\m,R{(% Zhq`L}``%$CنP+sL1 ||$!)yc^f +j+9\+xH[>6|->Za9![Db2"yN[sӃ i*` *~i6 Q~(!t @@sr r߆&*S!KZs>i%|IxNY 1Et"D_8vgF  f|4w'ؕa-sx? Nȕme06.Pmv+=@0LGfPOY6u ly BDb [jq]{VC,e]1[ $ƙۛ}/_U%IENDB`u1f590.png000066400000000000000000000015121326020644600320230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkTW?ΛљZ j-J :GŶHBYunҵTЕ .bP"bՠiC 5fLf˻yoތ7<=s߽RZ˭ޭr5m TE<:rt^G>N??] ؍ f{&+xZ)FqcF`4J`ӭ| z՚G/e'Ad@8Nh33"¦\y{A)OS{jT 6]H@Nf0WzHkbJ`QJA xyv3L+5"2p%9&(&PyFu A[ 8k{eyxm^f!ŽC@vӸ1}>ꬕ2*Kok@&F, "|E>1Ž8MNw#݈򻛋 Ag=AɑYoJ^6oWq{n_*oemX%˒-}?﹕|a͟ze G+vɕ Scs# *SEUx`ޛ&P@W Z3"ịJ?kנ8_$P ˈ,Ҿ#`RUBDy<.ZiӰ<_dayFm>* 3>HtIn/LJJk{&nyuQ\ 6l @Lf?OTӵ:5?Ѓ΋"Ӏy't 7^Á>t]U`!q G(8ٌ}m7z#{`ck+ɀ6y6wE3>Oia~:1ݥ灧R<6?//#l|w{KdNchG} i9L6sV{ XK4~BgH`=W­(IqWSV+z`Wqqh?^gstv"VUYJ X]և8) v3"ҹp-T3_o9d=9W?n:k"q7ot>K^OL4g7~hT*|Z|9j'@<~>2c&]N%Q3Zihj %~fc_B"U9lf76VOS"SghD xE+A8跫w BqF 4H¨kgɞWJe*H1㣕@DTE.'$FT#G-?)'ڽ ǾDDӝ7R^Io[Xo7*(" %{EՆ--hIENDB`u1f590_1f3fd.png000066400000000000000000000015471326020644600330160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTUΛδ11".,`AQ 11.4Ф ĪxM: RqBhHF  N;t:a޼iM{ȏ|5b?T]kTE|nqw 'a͊86/{pZ^9UER[#MvH;<:۴@X/ |n]DPsP` Se&,Z#X3+=NI2-K֔[jNdgb+ {g>[;*NAΰt~im0 4^-;Pnw]xgdK)\W6܋u OPuY{A' PL@VļX~L 5*}=ώq~k0yGnCi 7j.uWA2! IENDB`u1f590_1f3fe.png000066400000000000000000000015261326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHoTU?ޗ[%B! qA",LIĸhbL 9v%lY΅ Va Q"Bi=.潙7y$/~wzW򁨌KW{3 29><1~036'*{T8+8@Y 3R3nx5Qg.V'>]@3Tj3*z7@>2κ$ DWƶ4cu*z0rAcD\vTEǬcbCI@%1{.Ywg]g|cv>j:ȕ'%:á'R1)U'&(Np3\/FYG4?lec= ~ vs`'.l%ƾթ[O7jl 'rA-Rћu5l[km]n wG/^K7[uҲcUMcF=W(4qn X=񸼂bpfT>;]MW;esh؉*J"\cҗ^*/wAUH-W䲳򶀶(0^o/[:^Lu (_J3^3`/@DWyi)D:ڂ&sܭ@/{#ov_CPٰk qTmdI kN*]DDhne%[;|=f&E]ڥ_I>|Qbچ46]یf>Gv7;=Ø( bѳ.uZgReȫc-TTmу{s=9:w /b\)řcZ rqޱvqt#&( Js`1 bj J% y۬׎[[V Vgu*5BBc8@TN_BAwā]POO?x!B.G}J9vFﳹm8 \ToF>on.S=l {x@_jTŽwFFQ\YNZGD/'DVl&!l bݤNz;@WX3ےͯQ9dѶ-J]%k#W5)wI*fnjҝUow;aƓz nbUtwZΜ:/yh), <ngk.W_je b_.f֙-s]g[z AqjbobiqG#8F4IENDB`u1f595.png000066400000000000000000000007421326020644600320340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=oA}g,,QS*;#@8?5 Rti#+R)`#EHs@"Eq>|1VkM{3޾`GʗӚm @:SJƑtP2H3 燮lMUW: toUc/jj % qy,{IENDB`u1f595_1f3fc.png000066400000000000000000000007671326020644600330250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=OTQ\]Ah䣦0ʎo?BnKXH0%jDwȹ{%L2yfrvמôh҃o^+X;'ZZ'/@Q lIQyF@Ω莝T*K4Wr!&^>%|ɖĜB92qw;@{K\K憧x|8RMW<06~d+ҹzQS۲Wy]vp=;'@t/ uuN`q2qw@7`BUʻRz Lh/I4AyxQ&;Ȟ0^'R-UCҚVq-cw~KqIENDB`u1f595_1f3fd.png000066400000000000000000000010001326020644600330030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHjTAu7RZYH- E; f +Vbc!X bW43sΙ93"pt.][4g+W~.20Lw}F>BfB ~+SqqOhՃ/L6o]*Y[0+k cN=,vh$@me}ˤYTYv0Roۦ6SL|v Z5IENDB`u1f595_1f3fe.png000066400000000000000000000007441326020644600330220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=KAٻ|XH! AD I@;3hE!B8o"7{3.AӪ9EbZ̭un yi&^ 0Q'cazq}<,c {9|FvRg"BƧ)ńZ!b.dE쏽魓?5}B.dpuv*T0n?&o ,5b9=ʙ ĀJ5Ub9I_·LEQ=K@Ă0T˲L[%*'`V*ndnu&Rr&Ki]1?h =mݦp v$W? U~<"wjY vɍRF?*+Ǹb~_Z?l 0;4pZG鳚\bmz$`a-ȵ+%c61˥+ӕjQ:U FN9w 6P}5L{Dj@5L_sg3Ϯu#w0prWjهmV־# G-E~/*i[M=e=k=wK @5aFǂ cPIENDB`u1f596.png000066400000000000000000000015421326020644600320340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHˋWs=(!hHDg$h7 CеDB6d Y(@6Ny 6d+#c#t2q1]5]ny{NݺT1neG2кs(5U~ecs`Zux#)E6.TYg<)K{Uʔx2y0Gz#٨5اe:]*` h.oʡ85o([alr,<@݄I57"#Og@م8ɧWk/'ƶn,ٲ|c3]{kqt ;nD 9~8yf0;b 4_m̾჎$ex=`;M7,Zǹ١2@_YxhEىva~'@BEЇYcFEJJRO5U.wB^{@Kݘs y`. E/ BXwc<OpFd< ԗk}D1n~[wfr#=?4+d&5:Vi{IJOZ@r ofj(v֗V(9ޱ~vN}&BV*U5L|ܗ==>k@\iv{\''j~@duYQ 8wGfN5/KϠu"r?%KL)>R? IENDB`u1f596_1f3fb.png000066400000000000000000000015571326020644600330230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d&IDATHMoezxۦ*4ZD.&"*"rjPN/NT\R#Nq : "JcafC6N4;<3<~uKX$x@X}s:72>S|6pʄWȴ$zVZ r+"D0LC{Ċ]]x *Bxz_hXyu%K'Muۢvh&zT2shRǎvV*zN WI{Ìnng< S^Pen qS<<^GK{ \b'?o~ΣY!_*"DIvoDZTgNcZV'_-Պo' ѡǾigɗKoԻ&\6kjxsϚx0$"?1*e}&2w^$Q?`!c"[rn}~y=հX A??hfXѤSvCUMz]s@u?I-Q=tW&'SK(ϹIENDB`u1f596_1f3fc.png000066400000000000000000000016061326020644600330170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d=IDATHMh\U &S2f7 b-A(()""ʍBU%(7#]YqSb T#cgM{\t|ff:s{λ>aN^xZE8pG՘ӢzAs·k++qC'n!w]kf~b99ano<n47A pkbʨ8@@6 ڝ6hc$jfh, [_,'j]Px `Rv[TKx*q쯣OxBv+篯.פ=zժ5#Yjӌ&"H h9p>+c 5__]~GJNd#ū@ K;jÌW&NKA sHO9dzD6dQc[DD[߽kc L_+ee)JzzTK1R]=PlBݥ&{ JnIĉ%S1@ڇ@ |#rڸ_L'/ TY|}a7S*J;۝CUXޙ[{}QF%Jh/PoY8_ooDDEN'CI/I.5侳Wzc"B(;$.dY <+7>B'->t=;kȋ?3 .dX8[ r=$HE§33.'-ĮIENDB`u1f596_1f3fd.png000066400000000000000000000016071326020644600330210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d>IDATHMh\U羙y0㤭QQAvB7M)Q0jD`"WV )AK4yqyyof2u9yf4_T3cScG@AE~H m{R_Alvݵ[6ʉ y&ՂA'pȗm'C~`PmkuXN_h1QE8z'Z\7Zz4a ֈIPʵa'" jnvph4,ٌcWvJηOkb/zUʃI$gv,zs's+mƉ 6AxmLi'oJގmr$ML}^k:~jf18|N&vs__>:q|`FDPxR,8n6y+&!;če?n?u?|-U}ɗё7/u]GfQ9,mK-i\/͐m0;{q c' D~`Z?wr"Ӏ8Ղ'*]T%T_Ke{RԒcT5јlO SgZNF°!zӈBt?RFʳS'j#uaPq6{kCTwcdmGwaֳ;Xy%| "A"MOܯ"m{!oYgѦMI[;@P%lf=G]C xڈ`)Bc#o<׿eF*+,l%RRQ:!Naxs/VoU= p0P̝S6J!6CT{ IS;hh^mUq¾\sDM)^-- =d+[U}6n^[$ &? $o,W\#`/n (׆^( PQq2Iu4rtܼ PK]nڙܪ7߹֘N.~cK,VMs_rnΚmߎ^x?&{ifcc'&ϨpBT@? љ嶿K+(dCaIENDB`u1f596_1f3ff.png000066400000000000000000000016251326020644600330230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dLIDATHOhu?ofww5AE+R0-TE(I=Ń  TЋ.ZACsBMhzl;ٝyݿ~}ޏyceYF翽3?eY*fC/P痮oWcֺֆ 7LO0p'.`^E^VO{ǚldtkr E}ygvM;rƫ%B*M_?ܦ/tԉԈC%JZV{"^ A=j.Ҙ ; ݇_5xk";8ٗ;vs#ύ/~\J߁wfg>kPRaQTs_.U98=05IENDB`u1f5a4.png000066400000000000000000000005611326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d(IDATH.CQF.M%G3NEijFz0ԡ>ULo]V0.}_L1/8|o>֚'GG*s\.J8$Xi%sٴ\.jT B!m2v"BX  3g ェ7!ɏ fx&7dK˸@~N+F'yu\C~^#{a_ymԻGL"ƳL@9!/Z 4&sy1 >Gr5IENDB`u1f5a5.png000066400000000000000000000012631326020644600321030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|djIDATHKTasuFqLK%\dEnBlAA \ Ր4n\~T CQ&|ݹoJdΝr<缇YDT@R "r[栁R+1,˴wҘfxr:n. ?iط5M;J VĤ䶀hTv[q!aT:^bfPqشb)"[_FQh?7\;P)]X$<-kIZ]8h;2V-58 p;a aӡ8>Gi2e=/Otut Tb_Լ(p٩z/qv/1^259Ρ)\_+]ǟ9B"=E~۰ [ʒ &vDG<Eo]/L'}ҾVin-v k+1pak0]_ yVv:C^rX| t~Wė0k)%n|t1%ԀZh8cP+mŠIENDB`u1f5b1.png000066400000000000000000000014011326020644600320720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKaǿ;n9k:*ňvl7)kAȮ%AyCHR̓͢jV%jVtwۙC /;;l qN3`;=V`0ljh{HURb;2^qMp,ae-(x d6= [D$IR:8z"6R"6'ZdYaHG:ٲ,+iY[M7fnr߲$YHg/'Q3뙲A!ĜaU;RA/ v8/!̃v iH PGJ$mDt+eYܶm$k6L'"zԔP< x! !6k"@)@ *XU կyZD۲J؅O*d'fhm\R@7ZmGwn}@:.t7z ?Բ wt>qf_f6` ɼ[oyw7= LK2EhR te,R8IgM D`#}\}U1IENDB`u1f5b2.png000066400000000000000000000014421326020644600321000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHŔ[HTQ)'MlL ,!2z E _!*" OQ]RJnfWGmg朽{Di̱Z9@|>0{>x2,@ |z} yyyrT0;@]o΋`0vBą:`RjiO82R} Hג+eNC7n_Ni&+ކ:ٜmddʄfұ ۙ?fmW:*]-WB$ #̈?NXS]!%";t90l::%ntToW ]O-fۈK[pB-]ً*mplQ5%K\NRry=;# VQW ]c[@Lҏǜ\̭{maܤ44h< ź4I,g4@aד?ʇݥǪ?k7w wvVBX_v/*P׎lVTPhhSh 6{:^~"cуKhO[$i@XƥO¹ZL 7ԫMpMO:ɫ/Zz&'1@p-eBOBQ\h֢lQf9D3{IENDB`u1f5bc.png000066400000000000000000000016031326020644600321600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d:IDATHohu_}Mmh ԨU[l+BYaE I,sDQ]8jSLή~m9m=|xu n$bW@bsg rNĿIcrj"nBU)qL~t.`(A(_ A}@B [=u[WJu-럮w;+H^+zg!ξ>IENDB`u1f5c2.png000066400000000000000000000006421326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dYIDATH핿KBQǿzQy(ÊLu)Zrkjlhl1pm9["B2;MQʻC2+Ҭyh:0g5lK-"/ޥѸqvb B>X׫{l| 0<+1+1^vE.q}tzjI`4pֱeSVO Ml*aK/w;K1Z"vb(8}1"DϻӨ V?s+VB'5𬺎exD-6.dw|˿ !л>Ĺwyț $-(Nߝށ%:VL8g sݜyAJɭ% Q sfkґn_-ܤ6}4і+"ֹT=079Kp%_.'hmx^:;V|c:s%W2Fڠ?62zg9ZZcIENDB`u1f5c4.png000066400000000000000000000007371326020644600321110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH/CQiVUIG,M1%mc`0X,H!|,"a!D۴mooEsz<9yrGV\ !a#Rw[q+z37wNW_@ j eGP,dKΆ\<tKwQ|xS@D>@8G!@Ώ_MոjvV)4{O T~>mZU]̪Nhç.]nc`%eCb6Nf)bo\i 6H G"ތ6zm6˶XR ?KK }IŹ96Rķd8 _z>j5npwj @X?LEBzJěᲷɖ=8YԶ֟ t+gqpj83PoS!p ]QWfIDKv& ?w@XeCI Z?9bsUpM\07'&/O~l/p(*+y<-ޗpcM`2Lm H DUH]Ʃ]g09u (,  pM@Mg ?bEZnHq͞K hÁ )CRO>4+dёD,s[izn=lIENDB`u1f5d2.png000066400000000000000000000014011326020644600320750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH?HaƟ71$$PzpJ+bU?t$]ێ ::jɭK!#Hb*Iįg{^{-455upP쬯Z>$ON3ƮIniibʜcl6IZ}9r΃333q˲\#WՆܷ RkFX,x07>>\(/|Mnd{DZ1`%bCR骢(wt]/D"7xR.a."3Z6Z`6L€NLOO(Ѩ0libggGDen[dιe(EQJmu.'&& .9oG88*"TUm<y\(([5'p9vq?B]k!Ǭ-Ak0p":czu~6/S |]"ą)"Fk1 88JIENDB`u1f5d3.png000066400000000000000000000012731326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|drIDATHOHaƟwEL=^Yv; l2CY>T* uQ1MM۶;4Mgӓ###sB~[[g˲v766lv03DŖ;jxmW"ȭT*9lR۫';R)&ICM$"-{rN;p$UUi,B8BEp!2(y<CLƗ)a_N)pF*pribkk eahh]]],--!{u*+ :t]??@ww7BFcee/,,<ϫ85!٬/S7 =lg(+s_ 8("z6@| -Qܙ⯲&KE1p`DG9!1$[jkxuɺjur(IENDB`u1f5dc.png000066400000000000000000000016551326020644600321710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|ddIDATHT]hU_6ƢEc+B#!Pl1 iKcHJ <VB٢J5 (Rmb7f7;3s}&iI}'~ bu;]6Y>B.Si6Wm0GCfuE_A_ x @W?^[Wn:եwNl/6V\ǂ˽~Gp|%1G(Ώ2z}]d=SCC(0u&6ȒI[|h&A|@"y15B $&tk;\P ÇB8^@ 6Gav%`Hw %غzWXiT:-t 3@*{4V+pLD>2DJu\C]ūs}_=7c^n9L۵^{>]9L^/ \[U/3@6[6F~-xҵD;'&&/_)h6j s|ONq: #HR"N8Ž@2 "G 0FA[k` xDy! >lCȳ38vې167viGW_6u}aaa>],֯Bȟi>~Qo/c0n۝ȲeGQ bO #)kZ47疗ȁ(=$SOCJgKVSCsioJ`}^.G1q2;;[QU{M@ٝLv(Mw<5i(莮.=RyAUP%@IENDB`u1f5dd.png000066400000000000000000000013541326020644600321660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMHQ}3ZjXdڟ4D"6EԢEP eH?D@GU. ZHLΔ)hH{ZD yn.s>bˍe7 3εg +ϟ@ހ@UGƹ"x1ֱ_i`ᾞ̏* E0%6|U===xx|8"C.]FH&D*iF(I1"麪6N GDB|p 5Mq:^|x*M]UFpвٙ()x_ix9"mnLk3TyJ׃wB _,R,F";V|ɧ㓁';wc+cɆz4M(\XPWKEkX߳m 4)3YnE,[,бri¿lѿX_szuGl24R(cc rѺq#e[}}ZRЏm%QA"fzQyWlp'Nk o*=:4DnIENDB`u1f5e1.png000066400000000000000000000014601326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHIhSQs_&iQPAb`8 ƅ(E;XԺҶ)"q讥hpa؅`ED(Q&yyMqQ mzwr{KtKt&~b#w蕘H+%-`N++Ac iDΔ-_jn02;4e,hFqA r&TQ`ASxIUK0PC|~gdxC]LـgoII}lW8̅ɑg.>@ *8s' 9֦.+ {%h =P(b7%-`EY nFIP d=&21e EJ /*1qDyjݮCW%b{0w_W$T;U%UAB_]?Z?G~0]7BH>4?_p0pHNp$yҋwp! nZsc]/ Y 1o[l/uɹo(h `ޛcHeX g.n]p`D q3!G>9N#5 l@/^aKk}ͻ۹zVOa*J)H))wx.~6҉(\N?^Y__]$ɢ+FU)uBݝ75dK5hZJ)Eʘ%VbۥYϻ皦>@(l '|l6{{zWfFs~xu l\͇`o8>EQaiOeVTA}MaR ۶z{/T*r0SRZ31ǫZm4>f@DEkkkh 0 o]ٰ-kE4ԅ얗B|0043$q9GW{dYV0 K/J@ `}?<<\H&UDHD!PQ p8Ȳ|) =? B_f||\Eq@OWB1 zRmhhi100P(1&*rWx<b 4!fZijj@fI-\ pAr5DQUUwvv,a~~\ x*Fdz<E1,.4jkk˩ izrddL&$u tW 0S\ZZT aO|tVNWcVVVq\]KK *u0 lnnbjjJ|vTGGF^VI8EQ=Un+eVW,˙LJ =pbj JXey‚RI(I@(*KQngg0OX}P("?aIENDB`u1f5ef.png000066400000000000000000000022221326020644600321640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIIDATH_H[gDc4D;9gyOr$x1GRpCod#n؁71m0QpbR1mCӑ䜬 1zvũ]7}<p JJJLǽuړh:33ΣjMe.!FFFF`1 *h֖4yTUIDtqwH$Ҫ&&&D^999|(c0DnGO1>USSP[[fYW!}}}JVVK#;''())):::!7yoeyC׿DzcBHҿAď)4GFFTUU].Η>+IQD,zB8㸛VEg">x4͖VP%aNT8N <_;6~S1899Fɲ| nooo# ~ ^ټXPPp @E{6 5cccE GCCN(55uvy7!;%--Ԕ-KUUj}`s@et:477z{{_' PJ;4l555bkkkiSSӒ6B>RU504(TUhZ;v\^^`|>Z6 ***vYEQ˛ heYp#2L_j4X=o(eP4ͦv~1::z}eFEJiz?sW/c= ۺIENDB`u1f5f3.png000066400000000000000000000014271326020644600321100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͕Kq?Ni-aQVAԅteeȐDAWADI" !/L(,1XhiCΘds޷ )#z.<~_h6-TEskKg%\i@NBRSBQ -"_dE\4mL Z UQ=4_uM~>)&jq4·aim]5z{[gG3^m]U ZVT'2 C5i&7#2CIKo nyL0wz;噴; f/QVE-վ6l_ljH{Ka?TX[HO-'9dM ^^$8W mf)uEy2/oCa] 4r<=G~Qg01kJ9ұ@ EØn$g}Y6AKu]^ȘhlCuLы 9Hhs%`da~MxU/^?3 4s: F_ W. @WXK]W_< G}-U^dQ /\2 9P{> t145}?8kO  rP$a:e%~#)8PETۇAl3gGtϷIENDB`u1f5fa.png000066400000000000000000000015411326020644600321630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoUcϱyB@4MBuWu$ b,` HhT B[i41;vؾ,Z8PAA|{ιs 7H|4B%5> ‰AI/!jɠnT:Y74!=}Pw|3G=yI[f^G !$eceRpKEx'Hd†Xa¬(|zy//c_*\dIum+ӛyB7C_g{yqbɇ>ZSr*]\ 02kD xmfrGt!$RItgb[*BŅ$RSx<{wPdə}hVo]xL!\Q~Ɲ%y} K@{O0Ҳ7vL|N1wXFfD|2\ĴSR:$$ƹ{"~Kze~~*FIENDB`u1f5fb.png000066400000000000000000000011651326020644600321660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d,IDATHOHq?V3N L!aX I]CDQ`QۄtI$ *A2Koin|>Ϗk]ZMk%qY6چH/ԦLܥCKnc3sr| 7ܷ,'=^!ɤj bcq'1T6ꅞo8}vd҄ՉTj 1i TlnӨ<D}Q`AzlV;rZ(HP> hZ hF|H2ݵzF,y3 k@Z`9[Wv;QmO6,i5,y3~[IENDB`u1f5fd.png000066400000000000000000000021041326020644600321620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]lTE3v?ikKk.Rh!VB&bh>X'BhE|ń")iе&~R>*`.uw;LJؖ 1e?NF1iH׬*chBguM?þewZQeL@&NojsZ9Us{Qc5[Byep74ħ wYzI84(**@D;-@놺YQRʌ-D=Tk>` lQ3*ޱ`xCڸs}b<`vt;v'euw~`, 2 }Mb`0qwh jw;ou,蟔H(Kb4xO5jۻ %GxVeۃDz'{eEc?2Mi oL:?UZ2sc nZX[&J'O@hwgom\w 9x>fy<s2tsʹ<k;1re*cnWvO!nON Dݝ YV9/w88NBB[nmHU`i1[^XCEq-$bW4>ӽɳ,^yLs64O8oTZ%FG*,Uc 00 fד+\7u׾J 'u./kBs7XP^J ŸɕWpGUK*rwDTHt_O/dXj6ͯ?K]WhZ]6p2nc^^w89sҬYJ2 0OnpGT]x].?C*p;Onxn?`ތPIENDB`u1f5fe.png000066400000000000000000000011761326020644600321730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d5IDATHKHTaǀRIBJ53hXTPc"\-B|lE-A aLfE.")0as"cc‰s_K$ AڋR(@NYG.;LfvD!P ќ|#N)/yFNk*3~}X0ɿd$_pWk G՗ؓ dgDz qbUZ{KG"d+pz{-r5Z3rnz/HRONfvZ2 /9u'қ-ATvL7'`br^@U僈mr՟A$u i/PFm^ADB7y\ ^ށt{cV17P}jj`ڰF?*7C wDu؊ Q{/hi_$]T6&Ѥ[sr~ba|w8SBUvT ۿ#j ,p(@š#N.΍SG[IENDB`u1f5ff.png000066400000000000000000000022631326020644600321720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|djIDATHKlTU߽v:vfR`S VFJb Dc1ambBb\7ĸ@IDqc `,Ba,P*Z`3ǽs\3LKnr9ӂ`/0iډ64`a%"_GK `]9 T.R/o8cnO^ؑCH"Uk+S{wJsɅ{91w/\zli\+oiilJvG잚arUn39Pk۳ al[+!K%;w@sOOOSitp'"cd3X.f <W)Buuct8l6 H x4G/,^Qr&3Dy\˛&"gsϮ7lCCh4:QޢV  o̎]c| ÿI˽k/҉{b:;;LTf`ж pcDٺ?+"z{{]E]kPni4uVm<͵J-Ԫc1f`ˎ]DoWTS-i2f @)\OA*~___Ymߣayϸi^5-Q[ST`S54nI%<]KR`FR*/"Z42?xrg!'wށGEJJ)@)elp(0ZG~~.%&ʓwcy_EJ!qg6fs{/x;qfv@f X, Ddaݚ;rErȒM%{|ԫCCCbD$(D& zD*\_r_qymB霮f\)GoJ)5K/EB4P+4"v)[*kft74LK>e2-" B\4.FO)WDl@H-1._EH:e!O^ykx"0$^O`P!NYw:RW `ٲmDhX9 cĨ$;eatwQI Ph4ccct=o1Jzt1_v }`x4+֖LѴa۫ m/-3ݸ>dlfv \[vn_C;a@?YM<7kW͊IJ`aX=Ήp04^0WK)-FV=/O4˒017$[FƗX?D@IENDB`u1f601.png000066400000000000000000000017321326020644600320200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmLe<@u:\J R[ZmhZ_lزՖZ]f+me2ExDs8GH(ug|T1zY!׹+":,pG 2| ; >~e8*S{X:a/$B@>[8@~鄂DJN[soSցoo/6\:"T.uSELAc?i*n$6jϠ/.mqJ;EWÝ~6kc<:ͫu!c*L/K^`Uwu{3?yy\6 7sRq!DeN}l2'WL1aud[&mWS<}[S@@۳Pj ZSi<&|ʢ(/AIKqCa@G "&k&MwE{'0*Ku cQɣ~o@eE2@ !?[Ѵ5O~y3/K$Jk@ʔl:ep8L_w['R8%B<8`-,/gp8(XiyγiMku?yt\Nz͡(k.,VS[1ΆUqh\'X>53Y`r9m%6Q:}ժ9irWFݤ-sFEW.: Cf: oNupEDpFe@d.>RIENDB`u1f602.png000066400000000000000000000020461326020644600320200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTUuΙNKZgްrIT|0>(b(/BmH"3xIUcDcb:-.BiZmKoRә9{0R*o{kk 3NTqtl'7@Ye̿Nfyvb `fMQԾ'^Jw  =n?Ux Td kF"fw^$T;ׁX]UߞMwwSxSxe8$]M O4Pq11U6{|c HF«c$7qOVE.'ǩw%XPrOV+b]KSydtS %yl"~^0IV.s[?W@H(݋I0 |g)* ls.8FHkKWN o{2f,Cv""yԜ z5FDPc[JX|d}-?7|Bs>}(IiV`YVCVx#Hʏ׫k8 GF"0Wrrafɒ tHx#fq3Р)ݼavvvjMMb1-[ZWW꺮VUUy߯zI}U5)l,8*kv{ףCM;gG   F % x}Ov`NU"9K1ۅ9+hO//AqqmαXbG}!]xi sC1vnpf&ioogxxuikkMveYdIFBu /NVQiNgFAf}#a8֭.hK^~SvV ;Ym Dq/}h8ȨYŊ@@1j8&Be鷲o7٧)3d`D)vx7S"jIENDB`u1f603.png000066400000000000000000000014111326020644600320140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݕ;hQsgf#n E( XDDD-[+)% +’|b#6Q# I̝c٘jTl?sν!iOvQ PxFbzMdUpVVnQQ:W'Ǩ(G"hoƿ1M(;"3/7ݓ&2zenra<ͷT#z2 ~ehb3%o``/zcsWێeDMvgSW7,5v?EoOSQ=}6ܭ'ft#J.ʷflI'0-FJ:z+[#AOvb{U4R,)&o:Vpxm8lYUH4.էr6WT1u={fcR!f̴H<#C8 AܦrWF B ᘁ_j5oFtS&lH TuQBeƚ!I(N-QA#IF 83Zp\SgKƊ.!)U#c7]O#N 5k>ĺ0ہ9d|Rw􂑁FjEV MihQF^Xw۽87"IENDB`u1f604.png000066400000000000000000000016011326020644600320160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d8IDATHݕAh\Us7dAXJRqQPڥ+ٝĚ Epat- I(誋5雼wqfI&Ս?}|s9c~t6< UV\N#rtaa&*1[Tճ!̪flm0ڵXk _qq_shxol87_q01ʳ1,3uvǻNΖ}03SSNΖtN|4H_!034affļ%pbgkl/\Q f;nl|0,\35PzUaH:W{/H gVb@ ~^W2ءo#9EyF'%@htݡ-j SyLq@ %X_yl +RܓbN:QyĂ [̀N Ė74 HqAT:5P 쮙2NYQ~'0Uy0 ڕNp6D8ES QkΗ+C)C XE:w&0&PƀDU}lmc )DCgoX569FF2[InJOEmtٷSfqw*>y՗asNt[_̥?2+p"`P` p$7|;nc?mH"َ(IENDB`u1f605.png000066400000000000000000000015511326020644600320230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHݕMlTU;0NL Hk ą@$, r1aC" 5!Rq!vF֦-ż{LgЍ}wy\%[ ҙ=.ׇǫo2 u'Q9EUd>s7f8+@Qn 3 >pͤcTDxku1Ϟ ʧOx7JPd0ĎTѳO?rnB_pi>BcGor,n.c~./Yl@`8]i޾ͳ}o?|e,o^jtDF (cZGRz/"ϖ{߭cTG <|(ūMss]_ Ei] D^86gv݇I ]E o5Fs9'7@C9BtD}?9thn`ĽKN Ā^CR@n ?DƲW$`[RIENDB`u1f606.png000066400000000000000000000016211326020644600320220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dHIDATHݕKhU;3d&HR5.)hWv#⢊ܺ; Ep(х;AӨ(@ai#{o&N n{Ϲ1d#F:U5** .ˮN\NUBQ˘ͨagy];!mR7}_ q;oǁū8~2vS6[L?ƪ#K vd!T/Pt/m _Zϊh,Aea~%P5p&ߕP)yy9 ^wA᧣y&?*15aXJ9`{e愑͞c }RTho _%={meˋJTNׯu֢&+ V>!Bl`BRicSKX<+R\bpr'h eKP S S\ ^( 1 ` *(\T 2LM(  l*R2h$tޭ@\T H(2~K)b97,b)};!A"?w@؄<eE%@yZh-"\hk$\xzBI?#,eLV)ϰ #0C+^icv̳> TV9dwhߓK5w*r70p=YC9# v~;lJbҥqIENDB`u1f607.png000066400000000000000000000020221326020644600320170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTU ӫmjN/" b[!)Z[4(A1&&DKU}DMhQXgÍgjEus#Q jbCDQ1`sA VJ'D+jE& =67珷 lY}H, nI{L^x0i^z<&]&T_I`Euc!qwւ܌ڂt8Js'ڪt-4W乮w}܌v;k&)$lj\Rak^LF{``C Eq+zȷ5w8. JN5{Ņ#?9 !e4%2 @̐n1B R)PeiԌE%C ˠ^NhOqge09J9ZydXUDtUѸYIGY![\.=^ը;>a[⼴+ߗnhd2,ZF r,;_qB/Eʕ|fx"B%?$ t\w6Aڀøgz;xRWl2<Î1wXhWVkUK'*G1]g/+>4ڱ&cUkZ% aXkgt:dy=IENDB`u1f608.png000066400000000000000000000016251326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dLIDATHkUsN35ʹSċIPK+.I,EDZpc ! "7"n*U"?ApX TijbIu&E23If&:s={ϹN`=}]|[/ Sbt2~&(!Eg4|#e 5ٮH(z*.x(}wqܽLFۢ^!Gn]mrzI#G[ -A|Jv`ĞT}E|'=qƚ%_Ϯ |9ëcUxckn(A׍T _MC>`M֭~.# @ٻYwE̫ެy"Ú)n$;v kX%/sLǩ%O&R٪Ltn޸*UdV@b,g\^s {p"nr039c>gNGi]#S(l kMɑ7wgA p}p00[L 3Sh*d ™vxph3͜K`h YN,Rw[DG0KC*xMpvyNN?jbM0b`?pu!Է%:1ݘO]#OM@&TG GezQf][:rC~ #}D4@(qg2B-3-D 0d,OyLqhxٻ?-x7Ⱦ?,'ޚ+)̜0=h9ept_6`˲ѴfG , QwWK(B?E}t?D66#yr&z}fWȽ!**ȋvOqp>7 F]|P}$?1 KF9@dDW/ ry]!Բu$@TTΡ-uS@,;n4Me[N! /K30L&Usvvl_=)avpv=g/D4a,qTL;mL;-OYNcc6R3<)+:AGL<óML3&8 {=^8 0=Қ_2 :",iE%4ra! I@OT@7,$ْpaC/~sya;>|^H3Feҫ9>u|Z+}Sll>CS`w8[dKG`d1oDs ƙ^$]`sݼ73o1͓XW;> ڛ0H$HtttyM~ ,&2AZZZl> ";ϯ1,h&nL HdѯSE $1g2g^=n,WYĮ"ADrq=s.ބ;Z pUeH`Ri>]}yki7VHA}f DOou ~䗭ӈK%9sټR_#+a|,Q@6ަ)FODPpx0؛rK%ъ%4(@#ـQ=D# rׯE19D &UGXqH,HVA)X9E 5 (| Sy]1Q@|=_@ )4"uxs=AHD`-_ ;["Hl*U0"(`1A(@H֓Qn1-x2+G2 ԉ@U] 7` =[bm@r#Lv @GĤn4U{(Bs1Mk 7Z—aقH0 vFn_[X]b3ftV7ձ3yW-EqNmӝm(Ra@@ e7\F~j6|$hIENDB`u1f60e.png000066400000000000000000000017261326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݕMh\Us3i:ib2ŊL#J0 (? E6R(H JAB2E  D3`JEj2F3of=sQ3L&cFMTRG*8{_pu9PC:i[2e[)H*陋J!y dF mވfJ_!^k]_Q2JzB| "JN_e dNFRBP>eBGfH"H(+ԷǣQ@VAqq0HӔ8ޓRSQhY4{dTteQ@ jfe8011A(:;;ik{VVVhii!HlŬZʹỶ&ݽSHz8LNT2c`` \^Iμȕduuw@<G2|888:i %Jh9$099I,8i-e||rбTv:Ⳬa6###?xk;מK1??߈nSx=ˉp2 ow?Gp=HoVϽ9K񎰜T*u899"s ׆ Aa_gL*fu6U~rQK 5SK׋8}ٸ(8TʗhD_-Fn|zv=U]O,KtfV96k(/4hf '[42e\0g1jҖqvՎB/%iDN=e(>Iw; ƴLdg'd쪮IENDB`u1f60f.png000066400000000000000000000013601326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݕMHQshjN%e%ǠMPDںHh )V-"( qSQ((0CFr49-Emӻyw,N>EV  U鷮m_>8@;GQYUۭClVƱj p/ rH94^ w a4uͩO![0p_v?D}16=W zabKl8arPd}ܝ @\s`X8Kwej#P"jnl{1/>x(-r%נuQuc;l~2š#pR[ \y:ũ}iJBl։mu0檀(шNnXEW{ʢawTH]aLIȣ{ u&0@L{Χn?Fi4u(e! t9O:ڔ)Ҝ8$^|#xU@!آM<ʋADX߉^Yh6ɖgUziӿ'ڳHY Je(CGᱻ-t?p IENDB`u1f610.png000066400000000000000000000012471326020644600320210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d^IDATHMHTaݹOZ cf4 d$T !Ej& "+M+kѶQ2f EAEڈ!4ܹk;96~{ǹB!ښbgF?It .Di*$ eˆɂұH=@(_GPmn6e7X, 6.3 rǍN qUPq, H='x4:*by\+3F*TLXt@"R^Hpj%ռNvDe+nFK0GA_6 #x `ؖ-*2ͦث*|</ v=IaIҼ*;.͉o [2#I RΥ/N50Pam@`Ië!ϛ}4.w}xPu͹ 4WzD̞ N.Fp(fH?π1SALvn4)"m"-׃YY]YIX  Hl})WE-[hS `cA%Iy ";IENDB`u1f611.png000066400000000000000000000011611326020644600320150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d(IDATHOHTQ}oLLaވd!" 7A rDhY*hQhFpQEQ:#aQ6YA̻kSg{{޽ UD-8z&sk2AHE~ )gf`#@:JJOrΔOdH$ߔmbS΅p i¡P=@Gi+vM0z~UVƿr=}%Hkr0FƿRyjl6ŞK8Xymvz kKߩ->ݻ q 㪜B>5_$k 訆8EvU@#,C |dt+hBC71ԣZ9\99KSy@seUc܀[5Q~guPVAp!rpV)jA!y4j9QZBڇ5uqIG_8~eNMZI{UQ7IENDB`u1f612.png000066400000000000000000000013331326020644600320170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKHTqLH63d!$2BAB=VA!pTVm0H-HJG)B( _aJN{Zh6{9{ȒD, Mdsмݏ";@B]N8 ҐS87R9qjLa7xEgǺ\/<1jmG(8TOvt/@y#y%Hqg"[r굿 %-.zb BaT HzX!3g8*n+TaL~((+ q uyXVBBfRw3t;}nXceWKq.H?橇nQqh b7xUz}ڎ`u]QdC<8B aL).Ta]NȌjޏO6TTgem7_H(A:="ZR1mä&vBK(dH4o͍뜻ڌG5ྀRۮ̌?Ho=A+ID@v>B`*1qo[fKR3ђС/nCݏGd{{h6-8FYIENDB`u1f613.png000066400000000000000000000013651326020644600320250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKHTaNEXhfEDERA.4 kD.zAmZYvҢEEDETT)IfBjlfA??{.L2$$EIiq< Wz?K d;VlA R@/X(?r6HFB %cu8 =HLz  CZmAÙAU=p6/aUs: ~?Xc<U9.]Ϙ"Ǚq_fY7ڨ|dAWEBvNg(9 IZMhzl8a8+ ݑ.p%χ>'oe<}~士]J*PiFpm/6 4u?©XwHۮVǠ0sjQ<`qYCM?gs Iy!pf$:[<]}JK@&ڡ Κ76 ؇~ox1TXf D^~t1Jռx/äBq]/G@4GHd$(Z=qD 'πޚD 3 -_lsF9hdU;9e\A3fPC Io?{7IENDB`u1f614.png000066400000000000000000000012451326020644600320230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d\IDATHMHTasu(cb&C͝%i1D?XjH"jYMd 8Q+ԕA`+3BDg{ZT:34λ=.|PbI!E I8h]uz+}-@UN 0Ԝ>ɂiTuW5+/0r7h*"ہ^'5&p7TyPx0CGR5 ̵zs42p E.@:h`bW2ݷ욬J093wgH9EzXM4cOze-{Xue>0)PFzƲYYxl7f 6V4!Ůr1H|2%c{F5𒉝jMyAUz|U=osr DP\{ͼU9 wB45d` ܭys_? ^y~ĶA!-d_'04o~ɬWr+Lt=`pfS=6/^ηx[`6 4 S Mu3-ڰ9R!bC@bin9.?Ob7%glkr:OKҴbf*;*oDlV@CW" S',#I镤—RO0=6'Fqafcf%(/Mqye$8~n+D&zp%¹ ^]^4Sg+YH21U$*n[< T}~:Yɣ͡4ӣō.iJSg/ Ƿ RUY3, m ?8e͠WA*0켶١hɪF䐵7hkk VTE.-Q:--Ȃ1,Ϫ'_@e)ſ tIENDB`u1f616.png000066400000000000000000000014351326020644600320260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMHTQ羧35SNE}FAEѦe-AڵiѢ jN"}AѢLt̯y4>9sL2d2ޖ ZF1~,\w y_eS[Ċ|q]ElIENDB`u1f617.png000066400000000000000000000013141326020644600320230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMl aV[$ICiT(t',,V6 T$H¶Pr[?AlVihR;3ǢJ;Ssw52q1, gLFDw{ٌ}T8VlA&,,sN pZQm 3uSݠuvuU-EGPE8C^iJNFmIWcY$^ke ZTi<0ƩyfitUCTU7n2VaHWGŦqv5L[*-8.9|^t٣"_Dw.&cy,­''Q:z-oꂷhsI X7'\Gs@ \݈SDl@,)M+v8 oz,v`cR&)ԏͦ|1IQ( Ӷ㤝~ʍ)8@!Og/m"l)0@^6 @ېy^+wcԔ}gqi:OdYڰ,h:~݊vnhSbUa䄵bڜY^aB@10q}c5|5Ґ񧯊2k9i"} G$ܕ7!nIENDB`u1f618.png000066400000000000000000000015421326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTUsg:-SR bJt!$&c FWraB 3ڨ,bP(dRq:t0wu>wIϒjLZUTY zp<2@)@/PaF%zI*_5 8EBXPEE&,8 v?@։j+ enc5#kN}V;9JOÜOd#sYOqLiټp[R:P܍b.HO{Dח#5Cj]&Oց(}Iwݯ[LBWMZz\p7@o{my jp'yOxYc݇izjٗwp#"n3-DchXZYb\_‰oED8 a-ONo~pL7 @ܐg@44hBT6U>0: mEdƟ 6JwWiBHSw.HgʥY.{ۂa;!`K5T 3νۇ~s}9&W*J;L|lkmGv `7˖e.d`LSb3'x 9vŒpJz-q|pNmJRգ9(='K*PUp=Ϭt2$X8e=Lcbw/ms)OQ*p= e.떤12Q~b=*?SQTc|9߅]c#Rn5xջ0b{"5\fQittQ( j6DR> X"E(ŠndӇpYO#]e K<<_ j#NՁޝzN;qV9h?ɪaUsUiCbgF  ~*t J mWEh3| L *I;D]I/jbiIENDB`u1f61a.png000066400000000000000000000015641326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d+IDATHݕOh\Uf&cL 6-i]ƸQ\E"BT\ Ev'BT,.Ԁ*. BRRJ$Ei?L&yL&C[7~~?aݐ4Qٙmn'#:oCa:=+H { c5hӒND?2q48b0_-M9ji@ヅ/0u)Cfdk nnɇ7!|zƅD 7!D<<{ Zh|iǤ>}_c-uDUXOWa$&ltp#%FNJ\q~:KMߝ{e.D-9>+f?nJOyGw,ӯ9JŌC+mNTC֓ap.ggq'=#[c-E(Tl퓽 -Ƅb UǙl7APݡej8H:'XvܬaAݣCf~'j8tLekF!"kŗZBw9mxa Rz6AJ.ř[m*B+%RMH}VL!fuz1u!TR KQPffqY:9^"䘯zvrW&0*[3v&݊c#F`$oّvkב[nHV%y8r{ Nk?,<(l/ @cf0g⡙HyIENDB`u1f61b.png000066400000000000000000000014711326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTU3P) FA6b$qGэKn\+|IX[DVN%LHJQl"1c^b2oLAι/9iHZPiJ6x!H( b9X{ޞjzXTbRE>,& j^\02 TUPJp#B>swNHzC\gȀd D h{00sd,ƍIүS1TCIg qq8ӣ˙(:5aXD aU^Ĕ虍GT)>)lzÄ]Z75V,[[J58:^/F qOY73BW{ * ^t:H%qK)d }aM nIp ${vU T1vwRW^Yfh2l/k|/h;r4JIENDB`u1f61c.png000066400000000000000000000015161326020644600321030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOlTUf1-B;@)H2hBƕ.dX&l҄vE ؤjlPJiKa63oowws YJbU<`'nI wC"4TvH >؃%_i`bqy{!%FؗX/?~( Kp1+@1@P̀97NGhD ,t \uwSeTU(mthR hO2Q?c|G6S Q9 ?2PG .A-NxD=Sͫ-6m|ׁCлYQ>_\K']a|嫫q1سD7jv5; !e#ZۨY9;]SS G(Pu\!'6^Ƌhm/f LN9?υ]>CVB~v7\#klgAE6W07?Ÿx!D2 ZRz;vjv 0H&@f;K: IENDB`u1f61d.png000066400000000000000000000015331326020644600321030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMhTgsLLd_lSK,djI h[Bjhw] .ܔRсR Dm]Ġ%1qjf.&=s9|! Al֊J):.nlw*{ )" EwKҲ sm/gZ*c aL>.A`P`WϾpC /0г01)cP"~ c项pgY' >;& 6Y;+B2/ ?^q(GI'} ,Q^Ҝ1=]2|Mp\HF>=1mص͝g.:U\h&p< ޭ.[<#nuI&38^Vm,Ū mM-bJ}Be\T\Iŗ',A63#1ISwj_HGb 8mA.M`xiKGae?1c1:is{zg.0@i3zIaͺBb{3%f2i;T}?Y& ~. QeDם,kT-5vS-_4t$ZŚnպ9n||T`jU"u򥽲;=,r/Mq@HYqw1ho^㼪/ eS:Pb__5 x1=S",:$ aoIENDB`u1f61e.png000066400000000000000000000014201326020644600320770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlLQߙ;hUi3QL+AUFxXⵖXH$,c!aA%VGIu4 +){? %:sZoy9.ICK;0h㨰kV(Ht- Ykk%QJžzlΧ &BapY7ۑ.ۦ3JЭxu 7㩖w;H5,f ac6g l0za\Ȳtó'DX vrbGm]&3K5Ma5Dh08$Bp|!Nc1"3ԅl /hg;Q^b qz`g!Rtv DOYX {=3Ev8'c, ; sz/Dwrl6j(.#@$*N<_þyTLH%.ʓWgo0ε,{ pA'M#l4D> =NaI.i_ *6X*zJ4ϋMў*2KirmU䶨09?Kƒ",kh d$k?7kIENDB`u1f61f.png000066400000000000000000000015261326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHMlTe}wP)3S ` @LHPҨlܘBcƔ7a5 !HDiM JZ dZfq1fnDwr9cH$K&frC~[Rf zAϼo^4HS|*Hh@nFLlSoKaH+Ӷ& ? @lSx<>b,/*rL6 cZX'κnWp+'κ-<[>)em|siZ[7 @vl*3z MXY4nHfn@ՑP7h9zSicf8warF$(<Ir*:C:QaX}[;ArH.Wf*׹DٶĺEϥ @C/9m:¯c7xhGzY*LeG4nǁ"]?kWv\@ľ',^p}Vx&U/ikR<] U0eX}OZVvXPar0u*.ȥfHVu7m"hB֓M Y{d@IaLQQ~2|+MXp"F[ q9ǦD  !"IENDB`u1f620.png000066400000000000000000000014661326020644600320250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݕKhTgj `bEKMt!E]][" b4H*.T[ZJ>B">`BBL203# j7~sǒ +R/T2hSX;*J+VD9lMv%hW]4p;h~̂K9܅lr|<#U@ꢈsqӪOLD NI a8Ț Qv6r7|<^ĉKICcc ~o.+9J 2.uGټ'mO oxʍu/s5-E6L*nUZ7Y:M_eD[`n;vRiW [i-nT4N`|Տ&_sFڙn0=7#$\GWYV4.K]*6Ε3MS[pKjXUHYVm(/Jog[Sie;UCTb!"M\^[ZX -Gby:9z1AUv ,L9ͽ3]5w(gҧh1ڑ헍H"@-PD(c=^SaxaIENDB`u1f621.png000066400000000000000000000016451326020644600320250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d\IDATHkEgf(1 ᓦDjA%E7Z/ڭ;EE .WD*.\F)"[b El6(Q{gq11m 3̙9ss6IGok)Q޶縶a}='εNde7T^R=}u멲^A6k09 p ].ݒ ; 9em`O^kTcQ-I@Pt@KnBT\G/6k/ZョIޓh(SʡV=>Kٕ!Cх'WXa$+iQA2(` RtId-` h)UbWJfkQ1JYV}`T'&e0~s.Nc^Et/hhjKQ7Û#x'tq銿A_`1kOtK켯ldbdYl"4­p0λÈ08vDžW @g:{M /(,lޛ?%la[5 uNޙ +ޱ4NBmEtA+q`ay#DIENDB`u1f622.png000066400000000000000000000015221326020644600320200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATH]lUofv-ml!;hE-PBilbP\$M pa"!x! b,HG7,;;s>/jp;[^MΙ3s>KR@z hmDs`"tJbx HFJn _~\r@pi5*;wewo=w;*Ӏ4B5& }9ƞj07M\ޢQxfAER? "i <P@-GNU~(kiJ‡}oH$UIENDB`u1f623.png000066400000000000000000000016261326020644600320260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dMIDATHݕOhEwfޟ4U$6EQDA͢؍ZVpRhnHP.E"۝"$"*jqP&6yy;.^^ژsν3g [IzN6N223!l/W-k1._"줤1}bE%{=@n P325bh_1+$+^ZnjA;yv ұ\y i(W*h_@`N3ش>eۭuXȪ *fX?![L̜us_r$HU;+@_rf?]32HӇ"wbX̕ϫ ٰuإd3*qvaHO=!MsE~Od(4T9D߷|(t@2ʛpY%TƆ;b:4F 𨨼DePX& 2|Tj %^X{XF8Lۄm䵅H]7SHn & ?Z!pJMA |2d;UMơwډDEe==+hr&|C<>3);9t|ߜ X zRLR6"~^]'*żYN6;Q0 kȳ˦ mq`oi߈;mH89|rL%*ض`*vc |͂ b(K23 ɡճTNu/Bߦ;8P_TΣ_6H4$XSՃmz2-q@.N)_Ʉ֔` "2)JO;4ou5;v'$rh 3v;]ʄ.Low!HhGyU[nW;UްMlu6ݧ.DvZ |+ʜQ9)c חN㠯bC+@"-E)=rhIENDB`u1f626.png000066400000000000000000000013461326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKq?wvuյU4B~XiHTPPGMNuKt: K?"Jd/4SwggvvW|N3&h}3Y&U ± DA<R=~ tZ Q┼5SZARG=t䈛:.A0{TTG Xn) Mh0mq+@VÒ9Í{n]BÆ!c|:6Ջ9`YN˙|ϯy>OiCt1z۽h gaOv/WX- rebtZ0uq]ao~N۵tRk/uX1֌í6 _~^D7W#/]d a*Q-/(Ӧ mp7zCx\#:DžG'lc?T1z1(蛮*[Z[H$S]'9D*X6 E ě9ԺɤY-C#Uɣ!ד@zW D"/[L9Qp#W$WV Wn-Ȏ ?Pc`sOC+WܯP-%&bXnccY®W=- L Z&$N}Hݻiifbb`9 ġkk?M:arrng'$ԊZǖi lA}'XKpK| SoQ"Ƕ/>D#*E 7٠`E ޼boC(pzh%GM:=cK@cׄpC}=aS%??n.%Ez6 m<`Rg\`DXq' Q@עIENDB`u1f629.png000066400000000000000000000014451326020644600320330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOhTW7ؘDHgb T7*Qэ]H) ;p7" %е`)*1P IlAw$L4bݻw߽̐i{m)E F.СRV kZ󋴗[ (F4,ʨ:Fqx Z5S:/D&D򥄀W܊~Ec!F}x0W^`G v#:3$᷻u5DѾz 5 x\cMf.X3[Kc!m䇷+L5<'5ya%W LuO-7궧H[4 DwziWC ߌV/!)dr,O Dtw\탭S 98FD9]9+)G-d6OZSEy2kXHGyuvDW1 L ؙPnZ[= z ~ZeIENDB`u1f62a.png000066400000000000000000000015451326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHk\e$iД̴U+~,6XRE-Bkw]A](HڍJ(vLSb 3Lf}qn&Bs99pM)vwf~Ww 3(#@ G31k[.PM'_Fua}~՜2́J:6_lf0=VktMU}wj Z W#2KUBk̈Bf:*X>ӽ ]1{Ë+7|R ~ t_uuSɓUV ?LE{C΍|u*2JLg K.n 9~0`gnC \Y-::զIXCB{K B%j毵{;;z2pGD36:{`wUbp$0}n6aur؍D|}3"F(K-ty*F]%8E^)nRzjCsEG`إw/_jt hl*ğ` t7s6/\hӵŚ|akk@7C;΁~ /wñ8'j h.?6ֵ\DgNrLkp𘨾 p //=W7*6~VGT 攧tBAOZFFf&EV2rexk_#4#8ao-/>^J4 S6.E%]`ϱ}C`\R m(bK19"gXӣ݅;Fw&\xeKPW x}h$3)$GO+47'"D!Q5? #;ЫͦVt؊Pkm;/WY59@wM`$v9ēb=΀DaJI}+1=q4I"kTFm8MY/w` ᔏ"/@ =: 5P2BP mR4ئM7a!m7fR ] ]M ش4 cM 22Bt,wsϹ_7@F,KkU>l+U ,{Qu*9Hπ0 ry2ypҌPuͱH56 ._Ԕ]-Ǵuk pk@dް{w ޴G; @~_j 2S,-I^vIʅTbF K gt^/+X56ٚ}X+@Wbfܢ9d"H9?pn&CBj OC&1O] O~J#s[)5ɡ nmȔ|&A{R:X^[ϯc`z $ES)SpVn2hnnfeex_k, ڌiNM ҕIENDB`u1f62d.png000066400000000000000000000017731326020644600321120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[h]E5>'ɉ=I* 1-A} "T'_X/4(*mK ֊/zIOԤ19gI\zI3k_=9d>I~^TOhkK64A\'p@V\Uѧ6 ;+eWTSB~qOâ>r3rA^ 6}5{̞pGjd1eӸWuIws|8kP ؍}!(iZm@o7zYy?.ZbUK|MSg~=xQcyO5"x7jb8|"*9;`Y4dт;=dG[37sؖU, 6!pR7l{'S AG{+< nj.,*͋Qa"c v\7JIENDB`u1f62e.png000066400000000000000000000013421326020644600321030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݕKHTa{gR#)¦U)!""Eж]A"!(@Z(}"Tz`EQ28bawJѦpc|HoDVURF87P9P78.ʶO@8)I {aӢ6GE9hʚ y q59*B~`ʽ6GxWT@/g*M} 4\y?s2#dss+y&m\P-h嬧o\veMav% km_RD;ds06n"wˇ/́X<1/CIF[ #L4`]ūBZpaʖ53`X,G&%Cvo" -$9&QY2}YMb마 Q FѕaD%d!jBfh!|0h3輸 G ( A~2@`B|[x߀ip%MdJSPWb& zY4E=ﺖ#?03Zh fIpʐ4ҥt>ϊ^wN?&כjĶ*X 4U KeV5DNEdmfLpuOr2v҅&_%EA,ܑ.) @(ʊ{/%찺>2'A0FNXG Fjo*PJ|lM1{k7^*E2N U, ߾hшʦăxM2{ýXJ2do:sOOPͶ+~ \_Ä$2%:1@a7?yo!F/̋"k 'Z>MYLKQYDq;PS`E_[Ώ E:`3X%"VOx["ߑx\5^soP} (Ϣ: k޹OpE=mzTv {irFP(0" |qv ~+LIZ=61IENDB`u1f631.png000066400000000000000000000022171326020644600320220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dFIDATHMlTU7i鴴`G 4MHBelD-1NcQg8 Q W3t:δ}3su1"Dw9?sσr/AQ^i*VV_nG"k]OM2~AHʈqǹg7cmuL2,lz? 轓?`z8OD45ȊGѮ S3SUl_5lGd$5Rv۳E_ڿA\9XƇxs'NA=[6 S7.g.14@uz9 L|RI+tR6G(\JRI:Vn ňD"d2Y?lo7Z˼ W6dɐL jKqh4J__ÄjÔ Fg```gN`ٓ;Y0~rk6СCd2ZZZH@JgCjz{{U kv# |'LܲoSNSDp n]M>spGP ޚʌe’ȷ1m YV qq_lPTC ѓGfų%:"6u2i4c.!I Sg!]EK0~_|b:s2\GaϺܜݷDa˙*V bH "|ںUSS=@]m@UbiPUF)K9{0Ċ&Qמ]l[=]. b:ou{^?leR4bxZŃI3w1(" ďC?V($45\tf/lJ<]+FD0h^b".DҦMkFkҦN2æ`'_P9<'IENDB`u1f632.png000066400000000000000000000015241326020644600320230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHOlTUfiC+df@$P l$,kWDW,`* vO㢦]IHl6ʹu:޻Ť0C9wslK~CiP+` Qg g)eb]Q/rY1dj_eΆ9D?tw_C&#^虼fRT-NBU+걞ӴQc2PϢYcF3j3"NSy:<V6m?D+{:ڕ0q% phg֏ۃ { A'Zte8 cf \0:uׅx|$ "t%שM+{:oϹL\-З|tk5AnaKTu+V%«.Em N_/)7 Ȉzz`+x-?=Zw tdeքG [\W4ͱr;%OE 㱊lM= 2&2dn'H&mWUֶ5.f@~+elE y6 z N3RؽP~iDuS tZy7܀i(h`ѓI'8(vtmDёgJ* "ǝE:UCaD`#>N0+MQ~4\ڝ΀># 1޶)ETVfhmm%"***`qc +Tw IF":Db ݏoMBTzBr>;3" Gm~ZZ?!)L^%%ro0ħq I{ܒ`K2=cl!h(:-#A+!~>NbbL2:dm 0D] ^@A8/th P$!U1I!G+-qy&C" UW%HUb T&`=b"Xe_"a5\fiY)KOٽs $hJP/ 267gUfo476Ex=W7Au n:g7y էڛUfZXyNx L2T~h"00 "3;_?; doIENDB`u1f634.png000066400000000000000000000015761326020644600320340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d5IDATH]ke33f`ib RP%jPBQ 륈 mQA"/|{R)hmc[c65w+KvQ9<=?3wZ;)Rb:ӉgDsi?!:,**4TC<0 2b_ދ1GT9|LOvrž&r4S(^'*]*3}i))D6XŗKf?u dw_"[~"2,ySlP巯9ﶹ^: P+>X.|W8,28m-rT@;[y`{e"XCk}=Q.,艻"&Q^MƋ`t]ӌP( Mx?~2kG72yƾi?7clՆE,#qKBS}Z|pGg[xTG&D?4MDLGR|QJ-[IUD;Qj溃7W_fp{Jĺ*ddx:K]ق7eC؃ D$cmaҹ8L|)_#$'@k9w*+ \hko^WAԬʨTgҘRYpss& >b(/u&9w)DK[_hיhGul`Dz  ׄŖf#6}?;߹'v(Ozv-c|P5m3@+us}$*)Tܖ}d\>cXZ'Gmt$8=`D.||*qP/$|yh/gՎ:"$(읣:|Z8t<FW\`ǃ%K[&S%n]}Mi/.|ZJ^%@)ۈnU-<76UG#;+x>C9&(Vej~Ґ6iX|QZ }X$̊ V4:V75d2G9j+ۊ/ ^ཙ0k4|8MQM)J[g$ܜBeE4b9Hhoe̳.`gaYO,Q?m𮇐b׸ + ,@j6F{V/DW Z7VpVsA":,{}BCsB9YgZ~w{hQIENDB`u1f636.png000066400000000000000000000012151326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dDIDATHKq?\730vcY$("P@  B#(*$IF v* :dTμCvFݲ9yy,)%wěsk"af,q@G'1rE~ ܑ=Sْ QTo&,LC3Ŗ)~WQ_20f䁛_[䦓TZ.C1},Tq঒v' v*$i|2<AgrRM~ S?Fw_#Z9{U>_pOj^O&w=acx;WN)GtҸ|[sXV*;8[[4D=Dk[.h:M%.)\ JdX+Z/ۜ=khZ1.Z] Ѱ(3*l7FƲ4l;} ` yIm$+PXvn*qLD+ڶ*("mGPrgn6 @y A^2bB2({'/WEHo\hS&,D_C+*IENDB`u1f637.png000066400000000000000000000015761326020644600320370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d5IDATHOlU}tcZ2"t!A ChO\`Xh01qaܩaaąbH+J %JZRP3{4tTι,^a;Fǭf=b3/:2iTx?*k3K6NA0*CGBއȊtMӗqSAnnQ3g#ګS=$0!<3ky ¬~ kf ch6à!ѡNGӾ{׸@v"!MƝRIc5!(->sg=.kB7~?|9_9C2kNw6^k_+15K^{}?`t;iK.Eo6\'$79OO獹žz ` <:Sc]#^qi)dܚ<T+RѲ`&5ps~F͍̂l缓 HnE^yz)Gğ&Y @󒅄>ˆ/^<<UY.(8vh I!`dV9Bʛ2M>8d:f'Z&;ce䞺ntxUݞȋ>GCDAy=nU0_`` s|&e)8zkr,<ޱ/HM[,64h 2;QJgPa3f?ckƣvŇfUU/_ECJA^WwAEw}IENDB`u1f639.png000066400000000000000000000017221326020644600320320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݕ[hesŶI6v)LUAS*"ԘқzUJ(^jI,Mj1QZ+9Mfx$X7w;[#75~H~"Sb;~'Py=>7 ]'k@pU:gދ/Izb$)*ف居5YbcD7>hS؝ڰ0pE-gZ#u"be,="Y89I؄̚&Dk.]_"K=K+e!#K@ы+PĢѕ ln*cMZ56-V׋Hۊw3V8܉)'Rx#3Y$]C<{AuF$_; =%çP9+-k-};au? )+ dw|cLƷPa;bJOz Ro+YiϤ bF6~y >#ШsK8^7[)tjpx &KEē˘u5Ο#ū d4R7T&uBkƬE|ySqkYO7o.ѬM%O='wi$kbLv/p7_a*v$IDz 2&TzP'6e a,`11 :|OvMa#k 7{cbǛ>SvH 8Mm(h73mu3OWI3|mp=_E\k}ԀcD<#{VÂ%  D,^^D[O`P%;Pg + Ë 2Zq-@aɶiF0Ozy1%(' W+ba"^j(J5lt]q_Kn:\ˡ .o!JFŨE: 3Wr lT4e*vB9n΃)q|T'i&Ύ Q V ^9ΥV4Q TͮN"@zU@xPH z ϪĠn/o~>v ?:)ZG V}riFX` >lk/a2e8f [#[X\q)FPbIUrr$'Wv>k5Jߺ{Gl`fRX{2'T~rLaaDCUwcܗ}V s΍rT^TlgHtkɰeڝȃͨY{F+ݫtm[ `GXFdӝV~0|| I%"4d~1^p b ͢ UBTz_Iŕ,U7ك}뷄JguAnK aҩ/ gr x4{I|/IyVJ)ޓWF5S误#-En mkc+ zU-5v)d9D%M)ޓ1ʛW&1N%<ݚ\4>=v?Pt'( p`Ȋ/pKCEZ*%Mj,R5yn%X1Wǘ5/&2?U{Ek)M,(4FjqvlSd!"̋oODEkŏPcǣR(5GiU*(M #(̪OJU'̬ a9]>47o+'Fr -reNOQ@a.o*:cn]\?ӆ[‘HDvX?12yYa*bͫsm bޛTuHQ*"f嬊2_73^2iU IENDB`u1f63c.png000066400000000000000000000014311326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݔKQ?~iE5L`H%aԮEPz"DVn"M#Ĥ(*4/mHh=|cEj{<lt+v1Xg`TͿp58jZ'=Qb$s\sX\?  F=+H@ۃIt-?J+h\ib}64* ܴ1 |͵cQwvP)WΗlx8!Ъ*<(x`siB*Hj74SEpE߰MTx;##aWXVI ״^4zTÁU(U, CaHD0 f)lZN7ժz,*G(ce-J;k.u~\6{UYE<ٳ'u%}+Մej{2;JAU/0!&'TK۞= Pz,IENDB`u1f63d.png000066400000000000000000000014161326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݔKlQ~3N*LtQxub%H H4B줈ذ *;aKL4cu:`㿻>C'*߽hrZW.wQH.٠] 4딜|8\x0%rI _e3ڑϿKVaHh5g^p^H1mc8nr_}n-75 fu@ܧA|!LfS$|5ߝBI\1=@X#vs 2m  ?}ʖFɕz&WJTV5`0ma ۯ ҆[a>"*Á3 JG|哭"m_O9}Ptas 7 lY`5i.BPJI,w\mSQwBT.<13VȠD923!#*v:*7Q–^Jȓ\&&?|PH5ʁ8=#n{:583m7FʼnO.wT0&ƦGRHnFVh7л^BI,`{ D󂪉dLLVW&Ǒ=wEsïM bQ$pp'T{F\&&3R_%_ǫ1ߖf| R׋Y؛:6[\|xP= df\DEFGͬkOO>nhqð B|j{4Ҡw36yC2fd,GgI;y1VLIENDB`u1f63f.png000066400000000000000000000014021326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOQߌP+L,,d‚3w$FY%%\B Khbf;cLS6=o}N-'wL+&5}o4- RL64Yk3E˒;43(wz`cMd&'GR1w6oo\ǒyv*QDC#/fbpHH%s',8R{dh [J P]eKgXXGS Q P?^e8@U8A DIyIm{N]ے/ w&XU7­Zhr/+Wax8ء`+@&嗆=7O z4n Mp盰beqVu2eF8x=)i Bǐ l.lȒE|?*YDd9TM%pSu1MNwA3@*͍ܚ %"DQJ6fVSɦ"WUm 6k V.KtWp؍[`[]!VwI";d6S ?IENDB`u1f640.png000066400000000000000000000014441326020644600320230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]Uϙls%`wM oX%sk" ̾+!m#d wgkM>\wvf™}nz{<%ѳ)̆pՕ}[ m!x/?_{5&U#/L} lܰp4l^G] _{ d0LKJ7vK~_Gk&Ӿrn5o"vĸg mZ•:iI _ tǷ M&N2]Wk\_&lՉ>7'_BmGK 0k5#@u f+KBǖ^IkNa+ ~KsP]]ָ1 &~o_7!~CmXe$7`Ak)qL'!-TS =]ƋۣZ*iWzko Grֳ7a Lr2zE&4 L5C ;loي%_kbG.NLk.Eth`#:Ӗ!KcŢ+A'*qs|/-Wm#ӛ-|)==hC$ee*l].ljr8&Pء!ƦgoR:lub`hj9>LȤ-׀V+ &'곧$ؾNe=Ac%F/G4*~0ue"% cy\;|KaGYRg//I@^;P1-ʯ؜.'x'I+`fI0$Aa^`Vn Ȧ~sIc9=A=?+^ 3Q=lW\McJ|W)\Ŕ : "ʬA=LҐ6Y(۴eP--leMͤ@,!rGY`Zhb39>սsa!bx5˕Ί h(ݶAρ'ڒ.{,@,;J 7CXE"?A`P$vw='*wS0N@U= kq&IUӎEkXmwc쐿Nl W; \ ijb;,"EF{}(u@&.:{p'txM?즭+#Yz 2 ίcKrMj3˵93I-jS.8TzQJDJ a7y%~Z|W|?%˵3ɡf4>>Y<-c/%,H28-apBD(̋q|4%߾~XRCxh,T#бO &0;PU*Ѝ=WsHiQVL@Y0)'ux+cPO?-xgg%Lrbh,ńk?nIENDB`u1f643.png000066400000000000000000000013501326020644600320220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMHqgPJ7,* k u):YvPtj]:ECѡ\(\%Ԕ(-SwvYmyy H-r]76EhKqUةEY ,TM~"ɖH5p (A;@*^tKl[3U#Ns хN> C.\'z-.ͦjO 98(v~ rb.{Mq$:Iɪ$ߢ9om.}csg0*N,d(ߔn{c8lqʼnEYzre QyG,Fƍo{E4ϽY9Gu}/MC>GSi"/2 -؄)BkW+jdk4p3-[?ۂҢ%gSVkZW#R * svlLʾԉEڀGVe_sZ\pŜ]BTN.Ѿ g? N,rh3lރZN*ồd!Dk]@(E2} //eW 4/D/ `/fiZ[[D"q񡶗Ec{hiiH$@uuأߚͷ}v3hMcMF1c{\4 })!#Z*^se[J&ˁHh?E`j$ZV6B_= vEd{%&:FDm 'yRkz$ '5j`OD{PJ&a@ ^ҹĜ&. "3 ~2G_T z\U$ڌiks5t|px;Td* B )_g@lm{;q@q6x[.! *j֐'mԤelU2]{vׇ7DdgZbDm8N ժz}Z@%t 6,+~3+ 351O͕SVu 躚7'ZҬcIPLuX|;+V]U]EX& gN:=3¬.qmYly jE%u |c޻ÔcHRgWtt. ";VmJ MY_[Ft9w$2*Kz)~:ף:2S CB,_x _(_OBb''?L}&Kzڔ C]XlͦJAmc7ǓoCj) Qvh?O [%[(LWTsA$@{k<>iPV(] {TwGp9m$EFYXzO|HVv/ 4Cjo݃USsw(` 9gǪPlQrnP5H xs%yk C4KJ<o7Vn`}'fםX:-~3WZfG3Ց3t \CgѨ7e\9s+z7R/pY˸kV5*| (p="#}b-"&J8\@=0ji2;62(iAOq KӂmLljZ2`nbf<&ņKW d_ bE}m 6OY'm#za£O.GRWv !cZL!?e si2-cj|"a8F6i|[zav8F²H/t4-б)(XU1wmbrBM::$7Y0o :Q&J}2iޢ@Y*J;7xEϐʑgض"G\DbAZ @NVUEY5w@1]>%?͍WKw-ZZ;S8<422ߏ/Š~O`vZ|ۺapwo(d6,Jm(H |G@>CK'%5g6'>SE/t'̗ry4YQLG{[ˉQ]>m\S> Do:mBOZ˸Kנ]dgȩV]U+.؀z٭#"%CH{nt|<"%h??[_a㢉Ru|dG`u)ErIaucBQM;a)uEDLL!Z7uC l6s=z?tAAc  "m0hԅ޳Nwf;q+npa M=L%S6ytM4XY $Fswk*PLedm;}@sLŻF껷0&}Ӗb1$Oܒ8ףA:bg)- S)#5=p02})Vߠ8|qIENDB`u1f645_1f3fb_200d_2640.png000066400000000000000000000021541326020644600342100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d#IDATHmlU;~.RB[@!U!"!"($*jᇄ&FF l4~mB[ZEZvsL1}Ϲ;?zaرi-"RyJ*zav8F²H/t4-б)(XU1wmbrBM::$7Y0o :Q&J}2iޢ@Y*J;7xEϐʑgض"G\DbAZ @NVUEY5w@1]>%?͍WKw-ZZ;S8<422ߏ/Š~O`vZ|ۺapwo(d6,Jm(H |G@>CK'%5g6'>SE/t'̗ry4YQLG{[ˉQ]>m\S> Do:mBOZ˸Kנ]dgȩV]U+.؀z٭#"%CH{nt|<"%h??[_a㢉Ru|dG`u)ErIaucBQM;a)uEDLL!Z7uC l6s=z?tAAc  "m0hԅ޳Nwf;q+npa M=L%S6ytM4XY $Fswk*PLedm;}@sLŻF껷0&}Ӗb1$Oܒ8ףA:bg)- S)#5=p02})Vߠ8|qIENDB`u1f645_1f3fb_200d_2642.png000066400000000000000000000020471326020644600342130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[L\U}f`:@):@,6!4hĪm6j }71F7Lmmj541iShզKm"M`ܰs9ˇ)t3(&^goMrYҭm&%{+fL˔MWWW?'XXMk@iԤ#))-z/Qp9y/ 0roE~Lnh^׌ĺHr j0,x et=Iy{0D0t0>iYWfnOl92.53s^Ĭ)j"בd{Ts'42*hT? n;깎,zƇ9vɰ^S6rT:Ьa%R'JjdkM=uǛ9w">>=IcS;OUWw9i132JV۷W'P/4 xWg欳z\dWզy4w\h=9+G}>|)p$'y+]YצY38LazQJawp#&yEDL& 5~HSugLx8 ǁ G&x$ ~4|_ #^DDL>]WypX807RtWf]V['LnY87H:h?YY#X#QLdazo=W)`‘X#DQƛ55a#L?YF9ks_cOm뺥ł'1b LakXRg&T^*+ŗudp(ga8|Ln^9:>3~'%xiq*|,x];-s_F*ku=OijƠ~aۺ{G6t\<ɔmwC)IENDB`u1f645_1f3fc.png000066400000000000000000000021531326020644600330100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d"IDATHolSUY+6ƶD2A]D AFE I4ŀHBB FŔEF"-08֭1{>*%GzO? ɷXmԾ*ߌEiЖJӯ8EhAm}EP8;TZwkEUFi4 P/\=t9b9Bi`"EOo?JvG7#C35*\4dIz.x3קη`zo?ʄ[ {%'; P53IcRjd( l\If-l'q8zh:G*%GzO? ɷXmԾ*ߌEiЖJӯ8EhAm}EP8;TZwkEUFi4 P/\=t9b9Bi`"EOo?JvG7#C35*\4dIz.x3קη`zo?ʄ[ {%'; P53IcRjd( l\If-l'q8zh:Gy}ޟ|Cy[&p7PD5dd/?DϸY1jgw(,@w@304=lZ,9tl mi:2;3jM[23Y 8buP%cM >Oı,ˊ']i 6 26ޏqFu%:|/5N'E\O1\sy2}u}ƒ&RRw\n-p˯C|r3 |}he,Ře7?.uI>R>nnx/W%e>o$@{izaZUuc=S]Zyw~e62yŞn?=9ҞK\Y\)<7<=nN,+)您WC+%^~f\̅>p~3R6%f+1S@tdQ` ^dvqyA0#5KYۗ1-*}-!+{2R(ݠ섌vk1 ndى2#=AlP!wt3>$(j};ϰ@_(2cf2sp;|˂piVn^хiUKsEGS՜9W[m5BE-YoQQ1 3,+2wn&>$KفDUd&ukagjO %f;޹ $|ڦb\O}QDTJ"ǻ`p o=˟`,⑧3w&,04}~(/Kvy[Rjt"ZM( Nt0Bk[nt|؄&bx>*KM+I-^mZj v̙}hsCZ{}!#y֦eI*MՓiH0 O_nqSbG8-KvlAWfNˍy f ;^|m .`{)4'0nD ;%n0ӌ~| &/VrS'Xh(E2 siIENDB`u1f645_1f3fd_200d_2640.png000066400000000000000000000021271326020644600342120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTUufLC7Z`JDMQ$0&RHHHV%>؄&bx>*KM+I-^mZj v̙}hsCZ{}!#y֦eI*MՓiH0 O_nqSbG8-KvlAWfNˍy f ;^|m .`{)4'0nD ;%n0ӌ~| &/VrS'Xh(E2 siIENDB`u1f645_1f3fd_200d_2642.png000066400000000000000000000020271326020644600342130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmlUyvuڭڍm I\6,#?Qc0/фD4]!:bbDf ͌.co:hקx>{s?7ފ 3&Kl!Rak;47xiJF[!G⽣ͭCI3{W %e =tzΗ4 z XS[bfrTuтC>g7铬1,khEF8e6`2* 9aD#5y^TL:R)KYg{hT-u|PÍR[j7ޑ*wf4kINҕ@. LF^;kѽf<$$#h> :69zx;yoN&/v8u^P2-|3έAJvp do_OG7͍$%8Vm-&zOQccno"4ˋY g9bd%V3cSv+ T#ݹF(JKLJky+.[4`7O{ f+[jE܇Cm !,HL'94f)sƌu3%F?a<i ى'6;X}2rCg!7̑ϧ)."H)"\l!Zi5,`!Q$^ b}>yĈJNz N;3g`3g׿:R7"nhZ(yLP)xPp|mww?ܹdNsJ*lh5Pknod?ȩCG^ݺ|"X2/3燎$u7-'7aBJzš724W6ױMnn kb,oS_YwʍEtꋉW QjնE>Bh:AE_R"辮$DP]jKeЕEASEЫqr(# v%Z;{77Q a7lNI1rXTeYĚ =|B98V;5Kȧsf$Mυ$ þC*h0d^~pL}?tA Seأ'x$!K'RfbσK jirmWDBܲ5ir$5n;7{fnE r^M(o0#``gJhlx\eVUfΑ;'<& ,`:.Ğ k#֯v7h3>ug0*00 \NU,IO殎?/3c/D2Ljz}qK;H'>Sϫy/& j0cb|#z.Rmʻ@ls%>ц݌]SgGeVPfo200$''cǙA 740[Z ;\H&H]q _Äx7ZT) "@9K7TyVRi,H~gm: IQ7HA~LU_IuLQc׀uljq;FO]<&| N?$aNz;|c2O*<ٜR))Oehs:IENDB`u1f645_1f3fe_200d_2640.png000066400000000000000000000021321326020644600342070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTe\fL;meC*P(X$h@>`!Q$^ b}>yĈJNz N;3g`3g׿:R7"nhZ(yLP)xPp|mww?ܹdNsJ*lh5Pknod?ȩCG^ݺ|"X2/3燎$u7-'7aBJzš724W6ױMnn kb,oS_YwʍEtꋉW QjնE>Bh:AE_R"辮$DP]jKeЕEASEЫqr(# v%Z;{77Q a7lNI1rXTeYĚ =|B98V;5Kȧsf$Mυ$ þC*h0d^~pL}?tA Seأ'x$!K'RfbσK jirmWDBܲ5ir$5n;7{fnE r^M(o0#``gJhlx\eVUfΑ;'<& ,`:.Ğ k#֯v7h3>ug0*00 \NU,IO殎?/3c/D2Ljz}qK;H'>Sϫy/& j0cb|#z.Rmʻ@ls%>ц݌]SgGeVPfo200$''cǙA 740[Z ;\H&H]q _Äx7ZT) "@9K7TyVRi,H~gm: IQ7HA~LU_IuLQc׀uljq;FO]<&| N?$aNz;|c2O*<ٜR))Oehs:IENDB`u1f645_1f3fe_200d_2642.png000066400000000000000000000020201326020644600342050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[Le,{i.Fk7rh i7TF}3>PMƦD &jZj`$@[KzB,|>Pvby9;" =r>g-Rl< I*v  fL;= `D^` Y"' kXfP_YV-S&H!8sH^DS4ZHC;v @]>Rk: aJt39(v@U .NPR{sSkBʡ/)mBPppd(WᏨN”)cK!V!{4nvߞ{O5]BtKE=̘6A(G#mw=hnTL#!Vb+pD T,ˊp(Y' O̲;0 |w\* Ӽd=^[BlSKw|ݚjZ玕,x+'76wC`MvjM$zlUs:P\5raUSA)aMo)8v՝#>\z}ε\n(#O5qs*ĝYUѲޕCzZ@{ʥD68@<4:h/)gV:ߛISύ=L{th1MX{?̖tӉ `QuB: <ӄ(<Ve/ H;{o)tv>?wQF#1#ICnE&ˑ+}l~|~׏G} ĉPSm ᰱx9'?DnE8@ݦ$\`3 /vc)E0gF l(%->M3zDP{mMfmG*hdP1v = A ﺍ+Z ?tTͶ fCǕIENDB`u1f645_1f3ff.png000066400000000000000000000021061326020644600330110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[heg6ܚd/MbkbJ-*6UҊ(XjKA(}0APJXl-nbnDLvg!ww6 di/INΝWXc3sWsAuwKGkq'fGL߸rK5A!JQLqii}v@֒5Mﶌ=rCf=F Üzq1eE،[U\8u52]HW$ER;ƺPx!9XXC=ffJ0$G|gPUy 9G߱, u\R@Zޥvs癶bDwS2~ث>ES06eγ{7E-ww+,("R\ˏqh" if1a 3b#oR;Db+ T}!v$5LH|SGIp+ap젻A}&| =t7?dLemb<Ì5[J"E+MőE |i+/ӇYZ{(vUriC k8_@Krv`g*͈yԏDRn]tH~AiQZV*;cZw;jIENDB`u1f645_1f3ff_200d_2640.png000066400000000000000000000021061326020644600342110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[heg6ܚd/MbkbJ-*6UҊ(XjKA(}0APJXl-nbnDLvg!ww6 di/INΝWXc3sWsAuwKGkq'fGL߸rK5A!JQLqii}v@֒5Mﶌ=rCf=F Üzq1eE،[U\8u52]HW$ER;ƺPx!9XXC=ffJ0$G|gPUy 9G߱, u\R@Zޥvs癶bDwS2~ث>ES06eγ{7E-ww+,("R\ˏqh" if1a 3b#oR;Db+ T}!v$5LH|SGIp+ap젻A}&| =t7?dLemb<Ì5[J"E+MőE |i+/ӇYZ{(vUriC k8_@Krv`g*͈yԏDRn]tH~AiQZV*;cZw;jIENDB`u1f645_1f3ff_200d_2642.png000066400000000000000000000020271326020644600342150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHML\U͛fZ@E DX1ƏEӮōjƦ6n4.&P4~H4-0@(f{&{= a]HB P0z#p8|RȬk##'i$#MxH"B=nwf w5dq3d(q_1ph;0MC~ʶ#`5V+ 3){4aiz|łљyǦITmmnz!j?՚WJ) f{$|^B3hpL[A>芥]Hy܉ܬ|pڬ^ap|fif#Q>l3#i6˅+sugjˊ"%]<;f #Sf% tni#e('V@9M/k&߫˧C=YK9Mcv4g2^E0Zl-T Xw<3*>ppT:R]`rL%ǭ 1Mæ٭)Vy`rE{h( ;u$ֻ+1j/Ul,mc{^Viһ,FCbX[鮫<@]8F˱XN0i=i>}Q*?ERaP& <t_Jf]]*Gv]|7hi$r@q6x[.! *j֐'mԤelU2]{vׇ7DdgZbDm8N ժz}Z@%t 6,+~3+ 351O͕SVu 躚7'ZҬcIPLuX|;+V]U]EX& gN:=3¬.qmYly jE%u |c޻ÔcHRgWtt. ";VmJ MY_[Ft9w$2*Kz)~:ף:2S CB,_x _(_OBb''?L}&Kzڔ C]XlͦJAmc7ǓoCj) Qvh?O [%[(LWTsA$@{k<>iPV(] {TwGp9m$EFYXzO|HVv/ 4Cjo݃USsw(` 9gǪPlQrnP5H xs%yk C4KJ<o7Vn`}'fםX:-~3WZfG3Ց3t \CgѨ7e\9s+z7R/pY˸kV5*| (p="#}b-"&J8\@=0ji2;62(iAOq KӂmLljZ2`nbf<&ņKW d_ bE}m 6OY'm#za£O.GRWv !cZL!?e si2-cj|"a8F6i|[4m8}n#ѭweH%yP%3l ?֜Mg=ʂ RznG!9Szl`N[JGW{ՅWg_"t.7T6s; Q/x_AfgA6j#Eوt6ʐyjDG9"hzz{^ۋ/ .c6EPįL;Ezj[v2쫅C@=qSU0oM[P`pm!\A7)? 7jZ6jd9"JXw #$haWl灻<[[ئ>G*Sa]?5~y7}%N%nG~d(_)xn|ߞL򡔈ȄB{o-\(x* yd3@63{$+E[&ȷCB狫 S"׋kD@0ͣ}d3. l60,-O>:9Yܳ>s# "S_tn+NbkՅc&U{_q qVОO@tO9(-e?%k4 T?$t-;hj־ a!<;l[?[I űuA}}OP 7F_\$/=VYOWA%t'&;8-vVyGeY(cGnL +݈ׄQg %|/O OdNyiҼˏ+ˈ%4gV`O奼$iqaxIEl=CF<'̈́GmAHyV@0_iTJy1JSmD ճ|uzբ4xLjJ5t7Hn{wYuzUXE_zVBNuB<|`Yx!V{TY$_)B$^My9FbYńwd5@Glb+\#f*^oMCmdG^\2L]R OA@7 2<{/P^\:NWa 00MvXN+ @W-C&IiFx@@׶~(a\jV ٣D"c gj&3c901¿Fakv9 ~6*$ eѳ6N ~* #V.GS\ý~1 :湑p5)~q6!A|1(hy8@1mD+_ +XsіM@}Vc+J?au&eAa>"CuL͚@.l7=4o #=@~$znsf ShQ'`^mIENDB`u1f646_1f3fb_200d_2640.png000066400000000000000000000021631326020644600342110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d*IDATH[lTUu.T@EZPH%TڈA@ h Ox Q10" tZhR-9ˇ $}k}14 5 8cQGBK+#z@/u*o]Ǫ2 `Nɂ¾ 1noe⻏lɦeRe΋lXQD) ,$m\=EľUdO5HU.]3> ~* #V.GS\ý~1 :湑p5)~q6!A|1(hy8@1mD+_ +XsіM@}Vc+J?au&eAa>"CuL͚@.l7=4o #=@~$znsf ShQ'`^mIENDB`u1f646_1f3fb_200d_2642.png000066400000000000000000000021321326020644600342070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmLe |NJ fQbdA[Y[Kgr٧VV%6f,N. 08݇‡ou羯G M-OUHTi[*n,+ 35]<Ɏ?~RdRjV>@NnvSJ?\ʹ<դYnol*z}3C5աtԿ]~oV׵jb]^6Y-fVMGkZ&m_>8?-v]#3ڍE 6mqrUJ`F:3\ #xBANh: /) $wȑ9ބ?__|a(dg~ud@JAljCTWDa@lSANVƢտTYm=jbx9Os(H_kq{&8yJt ]$#fZxD,[;zu O-7>Ӈš|.9dS7b@;}# v=|Mݮ)bUqM.ZZ Ά+"@dtv5Q:]΍0"@*E8Uӭ-~X;6 ,c[3m;j݃u=(Ax͊ ։Bt- fp;mъA+ Nؖeڻ҈h4G$ꖡÌ6w&VЁ3}H@3#d9.}Ю_Sdli+uU:4h4[\J⛫7LV4ڻ(U);7ʟq`nQD6ɣ&]7E:JIJN`΍dh P.@'L`#{ &GR4p@YZd%VF|9lU./xo%{D*{ Cu 7b[>wMS&Bbt fEfy8nx@Bya½asXx,Z-D&7z1͓^qD\%w[%֊RK4P|P`M ܛշZ-n|_Mz*4Q( '>w8zX`yy_^c8fPJPJH!L p#Sϳ04(u3Z5n4(gN|q8?V׵$"G"y/[ l_x5IENDB`u1f646_1f3fc_200d_2640.png000066400000000000000000000021071326020644600342100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoSe?sNu+ۡF D3pA$$BB4;+MFb &* KÅ_Pp0m[K9)Wy}+uqv5;vD볏;+wRO)řJaAZ{` 7Zl%C\f _MԽ̸^ʝ=>D,[;zu O-7>Ӈš|.9dS7b@;}# v=|Mݮ)bUqM.ZZ Ά+"@dtv5Q:]΍0"@*E8Uӭ-~X;6 ,c[3m;j݃u=(Ax͊ ։Bt- fp;mъA+ Nؖeڻ҈h4G$ꖡÌ6w&VЁ3}H@3#d9.}Ю_Sdli+uU:4h4[\J⛫7LV4ڻ(U);7ʟq`nQD6ɣ&]7E:JIJN`΍dh P.@'L`#{ &GR4p@YZd%VF|9lU./xo%{D*{ Cu 7b[>wMS&Bbt fEfy8nx@Bya½asXx,Z-D&7z1͓^qD\%w[%֊RK4P|P`M ܛշZ-n|_Mz*4Q( '>w8zX`yy_^c8fPJPJH!L p#Sϳ04(u3Z5n4(gN|q8?V׵$"G"y/[ l_x5IENDB`u1f646_1f3fc_200d_2642.png000066400000000000000000000020771326020644600342200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlU;cόqiq+R#.(*" v@ZP U@EI塤iU e;?2e8;.893GC-;wϨ)vZkieNb+Q'kPf5>KNH*#|zUPktͷ|23@}ouC0 6Q pg%XqT$I̴E;w8YVY:Z- ʶ²%3#:6Ɗf^8x ҅Ҡ9TcYH(TK2%34.W]zxtp6I QutЫ!F->eU|#\>QP^ZL,-%P{#QJVJ&ą@!huSI3h6fFͷbۥ6w~g\H:-HNsOYh +ߩ(23@xӠoɗޡ~ +֑@0BQ5:y*`%uUy|9`i#vMPYJOLl #g5d)Bn G#6 (sǼ,+_5fl;]Eȁ="r`O9rr:r>>U@do*ڙO!~y[ȦxT"A*`i!>H%|k4R,caw=M5*X8H?~_.gO=,B hewh{by+o4H4:R5Hp#Xo 蛐䞲ؼ]`5R¼o[;D@ w₉܏b 0;[(p挍`!ozyzɓ$IENDB`u1f646_1f3fd.png000066400000000000000000000020551326020644600330130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHYLU7ЁLYkYۚ6ihI« F#iO} IM5cbb|4)1@pe(0 8 0 r}ts9wLKc5+s抽?=yė=XZKfbdr.@ۉ ,YZ1!u, Yq_AgJ BĖ^&pvf-2&9@>Wڶ(¹LW$ ed{l(dHJa?S|3_Ÿ՗;HZ}gݬIENDB`u1f646_1f3fd_200d_2640.png000066400000000000000000000020551326020644600342130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHYLU7ЁLYkYۚ6ihI« F#iO} IM5cbb|4)1@pe(0 8 0 r}ts9wLKc5+s抽?=yė=XZKfbdr.@ۉ ,YZ1!u, Yq_AgJ BĖ^&pvf-2&9@>Wڶ(¹LW$ ed{l(dHJa?S|3_Ÿ՗;HZ}gݬIENDB`u1f646_1f3fd_200d_2642.png000066400000000000000000000021071326020644600342130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKL\U;w)-3 &&5&DM,܀ MbV#QW&MW|)i5efa`Wݩf9ݪNj +vZnRݳmct.F'Uմ+*uۋt2ez?k+b'ϯN̄nWu`Q.%}4/z?ivwOWA^Eu=QȲEU.>0F d/X-ubl2%`ko0ɇns>(ْhd{Җ cf<ͥ8Lj'N<vYK`Z7U){u軛'^M;v;\۸Zl)~pIuAjM+pj"x+A*h&P>YTnX$$,>0T#Up Z׭/6vs nKs[ݝa0fIUVgL^FfvnMi7Jx)+Iߘna LvnI|&\ϻd/bzP Q>nrasIl?7ߚX iy;c #{OkrllI`% 0]ӊ4NƩ6,|KQ"o:qjd$Z_+T6 H"&(p'$~o6M_^;ZMDh; 0)Hk{)?jlɣXU Ue0W<S "I gV/ . .p5_!ns>(ْhd{Җ cf<ͥ8Lj'N<vYK`Z7U){u軛'^M;v;\۸Zl)~pIuAjM+pj"x+A*h&P>YTnX$$,>0T#Up Z׭/6vs nKs[ݝa0fIUVgL^FfvnMi7Jx)+Iߘna LvnI|&\ϻd/bzP Q>nrasIl?7ߚX iy;c #{OkrllI`% 0]ӊ4NƩ6,|KQ"o:qjd$Z_+T6 H"&(p'$~o6M_^;ZMDh; 0)Hk{)?jlɣXU Ue0W<S "I gV/ . .p5_!,4w9={`~dIBżZThu*GZ>Sj9ߢHZ%S;U ʼU1!`7mmػ\}!hjV'ȧ ͯlw8'yu =R^rsng@J'ޯܛm>^'œ+ ixӭ]]f̍ZԇNn X+9PtwW-TN9V01bʟPrlʜO::T8j"#SnmC7 ؛ljaȎ:}iH)y;ht ֒-Iڀh U0M{ |~M.,%D}sK>p6٦? ދm``hv8k?֗^9k:? ڛ$,DП鍙&G9~ga}2 ŒpغFhHB,]4>>C@)T8>bF=)j3g$R&$zx1pw@Jq?T B  B&Qr-gSo?PU5K>p w6[<ѻvL?:Hvp\@8l! EbWyIENDB`u1f646_1f3ff.png000066400000000000000000000020261326020644600330130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKhU|L'f򜴦ˤтm%2hBB P.\BTA ZBm$&f_3|s?spKP駂rfX?ջGGF諩|Adÿ1CoҔ "ˏO.ܳGFz}JU:H6uKOvZ)G>9/dާNJSe' ^ޔV?7b؉{34ecok].F ˋ܊f2_dxHy e^^#WrGr4ӨScxECykms8d7%ԈϸŗH*E8~VM݌k=la#n51`}Vvbec2pDnY`_d?F nm5Loâ7ʡOˏ@wp}=;;Hj8B]m+Cnm܋, 4| VvA06#qb] @ fpV71co1VZ<';bo[7 tdFIENDB`u1f646_1f3ff_200d_2640.png000066400000000000000000000020261326020644600342130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKhU|L'f򜴦ˤтm%2hBB P.\BTA ZBm$&f_3|s?spKP駂rfX?ջGGF諩|Adÿ1CoҔ "ˏO.ܳGFz}JU:H6uKOvZ)G>9/dާNJSe' ^ޔV?7b؉{34ecok].F ˋ܊f2_dxHy e^^#WrGr4ӨScxECykms8d7%ԈϸŗH*E8~VM݌k=la#n51`}Vvbec2pDnY`_d?F nm5Loâ7ʡOˏ@wp}=;;Hj8B]m+Cnm܋, 4| VvA06#qb] @ fpV71co1VZ<';bo[7 tdFIENDB`u1f646_1f3ff_200d_2642.png000066400000000000000000000020751326020644600342210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKL\e߽we^02 P ` 1Zdh&`1mIƅh4-FZeeJ1>ЦXIv 3̽v υgu}{+؇;u*jur|>EɦT5IO{劝jz8X݇qUQb_)B(7iS^C#w#3sKK7>P#jh?ހ+o.48䳆F٩H9XMp 7_l]pw0ejҧc]ɦο jfM mmۯEmq%558haeTjv99@_ ={hܟ@Im Pc"==usP xzFF>V4B{ f?,@cu9ti$RJ4U(\GFd,.*=~uu=eDWQ( T ){).BOPAYOށ07<\}d:7=N"ab~냝^KP'MyB\~"GPt %fWDXR=5Kd! +/%8 {[AL /QK^6PSZ‘p2 Bh6̯ԚTh^A0-WTUMV='S& %n]SmŚ_u'7&ZWܞ7"  =bCU(I dXXf|n y_qb۶iO@(gs+AO8{E-f;oG\0p9'0窧|CL_D` ]~?g.bI(wg0\Lh ,$П SM )7$zڳM $:)EPl{cqplV0ٵ56kZ[X/X @/z¶/gn!$)j ;so+D0?@?gxܔFnIENDB`u1f646_200d_2640.png000066400000000000000000000021211326020644600332220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]L\Es]vPW)Ѧ4hcZ1Q51*IcZ1Ic1 Oh66i lR7l)..]hy;o̹ZCɣz(SkԃrF+ˎ.kQ%Cr{<}>+E[&ȷCB狫 S"׋kD@0ͣ}d3. l60,-O>:9Yܳ>s# "S_tn+NbkՅc&U{_q qVОO@tO9(-e?%k4 T?$t-;hj־ a!<;l[?[I űuA}}OP 7F_\$/=VYOWA%t'&;8-vVyGeY(cGnL +݈ׄQg %|/O OdNyiҼˏ+ˈ%4gV`O奼$iqaxIEl=CF<'̈́GmAHyV@0_iTJy1JSmD ճ|uzբ4xLjJ5t7Hn{wYuzUXE_zVBNuB<|`Yx!V{TY$_)B$^My9FbYńwd5@Glb+\#f*^oMCmdG^\2L]R OA@7 2<{/P^\:NWa 00MvXN+ @W-C&IiFx@@׶~(a\jV ٣D"c gj&3c901¿Fakv9 ~6*$ eѳ6NNJA\z\ե g Ir݊R026/9#h 0?=hl|\|40iǎM"ꇞgʳlؓ\(%9Töqv׌$l(nX8M%wszT\JUɸ#%/7J^ܭzqAp f#m\9UKo_;4izRm;I0?°ߠm;db7,W79/҉BԤǶE~v/yH,Fh)׮x>6z Nio⧥5?uښqʊC6te99ɶTX'Л,[ireƨ* ea\(Ngy8J\S՞-㠫"9=w`ёQ}fLEq醋]#qRdLZ3%D<,3'Ylf# $AZ;Qݞ,?@ =@i[}oy%/gGqn%6I-Na~ 9[8TB)Aa}:UAܲvҒj[xsrHk?Su4lB)7 %6&7gPO_8imK~Z@_ü6΃g C?\CdFsnIENDB`u1f647.png000066400000000000000000000017271326020644600320360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͕]hUH|t6v[$&a[u̠6qIJ;Lt0;^L!LEA7s2?`ME݆l^Xݺ6i=^$o;<ܓEDi\)2 :9)8kG߈QՒ؛1jl3e{ ly +<~}%lz$3Ȁd6^'g:hF l l0lJh˿Aϓ~ w={4= bw ]!-*7-Y(R9 qXmcT, Qv(OՋ+G麴ʶ@^]-spf@̄^sF0nhUA)ajf*3^g~`$ XWqMh@ZQ&XQǣ`Ti-@t |XdD4#5"\#|8\Mqw0OOLSdp.`~bG߉Q%/9N}^`sYkFst/u0IENDB`u1f647_1f3fb.png000066400000000000000000000017431326020644600330150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͕]h\Eٳ'g6i~XVBYP)!Zш-E()XlH.XWBiiQRcQFq-'dsΙIvsɝݼ7?R5X-@@]XL/D trH&T*:Fo/t]oT*O&n\;^kkX:D4s [6 {bbT6uMP:6a"bӴi -eº1#?Bqydddҍǻt&S'ahRKG|WPxppuX!6.bÖ CVճ rt!z]Uv\׸;Pn~@f,sȮH-IسlnL0B>"kœ8ChҊ}iڐ9&^yBKs==Huص}np(`xk= 1OHf": !7 pKiKo}m/X௉HZա 3Nuy)ǎJČ8=ѓ/$Bxwy۵b2 @+9q Dtr'gmF8#@nFq1R y݆> D%:Wą%s|?S$Mh'В|?o/dn~t^T\t3^eT"b.ɜyM[,jo'/nbr(܎ p$M(Oz5aI1%`M9xo3xAH #bZPP MWb2#R-Ky񺶣M=Pt"4??j\ۻdW1Ң6H},ŹDJc <>k߭X5Ч!( !B'z?KBfIENDB`u1f647_1f3fb_200d_2642.png000066400000000000000000000017431326020644600342170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͕]h\Eٳ'g6i~XVBYP)!Zш-E()XlH.XWBiiQRcQFq-'dsΙIvsɝݼ7?R5X-@@]XL/D trH&T*:Fo/t]oT*O&n\;^kkX:D4s [6 {bbT6uMP:6a"bӴi -eº1#?Bqydddҍǻt&S'ahRKG|WPxppuX!6.bÖ CVճ rt!z]Uv\׸;Pn~@f,sȮH-IسlnL0B>"kœ8ChҊ}iڐ9&^yBKs==Huص}np(`xk= 1OT9- Ym"2Do~xCy߯G<$(Au(/͜QigEzDw@^ ᱜi!q\?R& !p&>r;` #%`AW`aްZ2%fJiV3̬U4RM|n%9g:(¼TBAXQ`(T МĪ6H&6pj MQR7f'J6}N}4 %mlfX'O9x^B5qLKUU_*<0[ڙp 1bɋ%IENDB`u1f647_1f3fc_200d_2640.png000066400000000000000000000020051326020644600342060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͕KL\uia R `)P)4FhDq5]!E3MM4&$JL b[Vȫ0̽30̀Нg9w{ןJclTllB@jWNط0M5 $@=@0p\E: ՘ٺswTi'{{{kkk {D Wm===YOE? هW xFAz7t痾w%ㆭo2N(hs3]lZGDxHbQlmzuvXW"_Y*}D0e ӲI)Qd0u>a8*e{-E PE(Ӥc_F||Tm&g/)o(`@}dxse0) g ܚeEPUO5L+]Ɏj黸uN MbiY%ZP1T-q\7 ͛ץ{)WUƓ2Sp\VO4<@INIK#: h>݅릪r aTOF:ʋcn .т;&{k>73XA=хPY7x"Yɦ}@W9WEiM<ܟ?H8#p8{e'Y>|x<[ab32%bOJB^&LOcdH*:wCNMZD5Bp^|T*f$4D5jt+I=!u/nY}%-~2]pB|B'J X@S F@џwQ^7+q9\T8‡7ʉxQI}9yc>6O[P=&sltt\@)|WIENDB`u1f647_1f3fc_200d_2642.png000066400000000000000000000016541326020644600342210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dcIDATH͕oTes?;촖"ZŢE(inl b5a, H67*)SDhB[,H;:s?Δ3;{}{2<T9- Ym"2Do~xCy߯G<$(Au(/͜QigEzDw@^ ᱜi!q\?R& !p&>r;` #%`AW`aްZ2%fJiV3̬U4RM|n%9g:(¼TBAXQ`(T МĪ6H&6pj MQR7f'J6}N}4 %mlfX'O9x^B5qLKUU_*<0[ڙp 1bɋ%IENDB`u1f647_1f3fd.png000066400000000000000000000017141326020644600330150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͕Mh\Us_bI2 111T$Б,"d`Q&.Z{A-VT\P(a  ؑXLsINop>9߅ՋMfƇ̪J `%u@:>dkXl{ubf3p:>===sd2y15}{mCɑ:N>qnN]{\.WڴT*lݶ~XEW'uAuƺn\wTi_]Xr-Ll֫~k`*_hT[ -PJ%pođ.%!0 se~+ a`"*oΞik;t#5n,kc5.yHDKS%>>w#7U>w Ccw_0d nkfloq`^׺TyЦ>Bʧ^4㥻@A0Xmy]?p&u;{q?_ݫ`JU>q<9LQOpɒDw@^ rvGiX@^fJB>73[FoiG(̴*"ah^<ܴQY')lL\DQBlZ5> ֋: IӲAd l@6TgXmN\G:?h6 zd@yB]pt^J |V)oN'QqY Xo<.q<EoYBa&n0@IENDB`u1f647_1f3fd_200d_2640.png000066400000000000000000000017731326020644600342220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͕KL\U;03K) H -&2L I[.-tah"!&W\4Xhbw IUaIH`#6 䙁;s130܁@w=KuuueXۃε:rB$1ٳwFcX[tscX[4߳ಈ Ep89߅ՋMfƇ̪J `%u@:>dkXl{ubf3p:>===sd2y15}{mCɑ:N>qnN]{\.WڴT*lݶ~XEW'uAuƺn\wTi_]Xr-Ll֫~k`*_hT[ -PJ%pođ.%!0 se~+ a`"*oΞik;t#5n,kc5.yHDKS%>>w#7U>w Ccw_0d nkfloq`^׺TyЦ>Bʧ^4㥻@A0Xmy]?p&u;{q?_ݫ`JU>q<9LQOpɒDw@^ rvGiX@^fJB>73[FoiG(̴*"ah^<ܴQY')lL\DQBlZ5> ֋: IӲAd l@6TgXmN\G:?h6 zd@yB]pt^J |V)oN'QqY Xo<.q<EoYBa&n0@IENDB`u1f647_1f3fe.png000066400000000000000000000017171326020644600330210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͕]hU7I~,mꔁ++AXJpn("Hwcb ދxÉ**Bᜫ0ʘڴIy?K4sw9WŪ&uX@cdҬ TFk[飙LfA:ML&kL&3Ny~b5hPewWkZ?mX6-6{mT*y`zAARD}9ucjj궟 PXh~VQ֜]:|ot2h@vm@Ә5,x9׼[[0Hyoatt (|-sd"~E"RSăq=Ga{  LM ?V+WMܙ .eE[se6Kc0d:򭏗o4@Z 7l<]-0`jB2akBOT1Z_t<OFx7LPs'Rn3g ˹Ju;MLUWHdXO06UBK؊A~Ck9B[SGMޅuzM .pA-?YlA-2".mUJ$ TQ5<\ou+ȗ3y\Ɛɣ`.&d- O3^P``=EC&łXƾD> Mvc6Eךbl^ iB h;`;" G8OG]A}1"S_e*f!"åK?\Y(#˝;N֯[FKg^%{N8l:s+8Lk~EU83ClWQ_*_Cnː\8Cq3ܾu!!-)Xq4@>j3X6C(Ȉ R)8Yϵ.Nf2R8N. fvיLf4Nuy_-Z B?G:::;fyP(|t:= ,u`STtXYf_BXU*شP4~ X]w9P L>7@⠚z _\>iwZ(wE|s6Ӝ<49}\D =}VX+V"ݵXeTv8b۶*v tMks:s ¡Nt;r{87LMCm)Aͭ[=&Cnڶ;u{ƻr]cuWxb%_@$%v7*WP" 1A{Bp/ՠ+Yco Fu;SlG'mq Q}? LMIN&sx*OObvfS3YH[,&z{Jg}tjFтX_yP&RJ1~nul8Fϧn0s~"8ef(yta{ 8q&zS48Po, a-!( < wv)`N|`w\ hMuEo8,D:+?{=k9 cΕsW(Ϣ7Ax@Xbt:ˑP#}llh"B{g.R1+IENDB`u1f647_1f3ff_200d_2640.png000066400000000000000000000017461326020644600342240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͕=l[UIv|XM4$  @E"u@T C$*Ƅ*5Bb`P1TB(iGU8vÐ8Wqw> |83>>T^]mO*f4L|> ]eN'l۞nԢm"^d2w#90z Kί ?mۣ"rEUf2GGHR|>eU&@Af$0 1;;y%rT(|P"qP}#?Ȯmȣ;yh:Z7XwM{!L67ec^:g%Ӥ?`\fp5}31^nLq5|$w۽`uA*79HK3 UhyODn1]xX>Ia5)z>&A6=UayȖ(?DZDn+C7"0n -- xU.nQa[`) JXq/ pU!mh$-R$9:rha@r e 째^b6Iam.5&&{W7=᫽\H F>j3X6C(Ȉ R)8Yϵ.Nf2R8N. fvיLf4Nuy_-Z B?G:::;fyP(|t:= ,u`STtXYf_BXU*شP4~ X]w9P L>7@⠚z _\>iwZ(wE|s6Ӝ<49}\D =}VX+V"ݵXeTv8b۶*v tMks:s ¡Nt;r{87LMCm)Aͭ[=&Cnڶ;u{ƻr]cuWxb%_@$%v7*WP" 1A{Bp/ՠ+Yco Fu;SlG'mq Q}? LMIN&sx*OObvfS3YH[,&z{Jg}tjFтX_yP&RJ1~nul8Fϧn0s~"8ef(yta{ 8q&zS48Po, a-!( < wv)`N|`w\ hMuEo8,D:+?{=k9 cΕsW(Ϣ7Ax@Xbt:ˑP#}llh"B{g.R1+IENDB`u1f647_200d_2640.png000066400000000000000000000020111326020644600332210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͕mL[eϽCi6|!+YGeY6,L%)K 3s`LdnKQ1[&HtƄEd2=~(-9s=Ps842?^N3zr/ܓEDi\)2 :9)8kG߈QՒ؛1jl3e{ ly +<~}%lz$3Ȁd6^'g:hF l l0lJh˿Aϓ~ w={4= bw ]!-*7-Y(R9 qXmcT, Qv(OՋ+G麴ʶ@^]-spf@̄^sF0nhUA)ajf*3^g~`$ XWqMh@ZQ&XQǣ`Ti-@t |XdD4#5"\#|8\Mqw0OOLSdp.`~bG߉Q%/9N}^`sYkFst/u0IENDB`u1f648.png000066400000000000000000000020311326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHT[L\U]S:@*i؇hj&-1MMLZM5VD5c1ilS[mB|j8iG -y3l?`BZsrw9ح^޾5#:o38/$IT%o}^|lwrxq"?>sp5 o#< VMB{m ~tj7oЂ-; -LNًekݔKm̙q6ݏ8E2i(G#sowa9\xmqԗ1΃85shoQT:FM(-3x)b47[=Q6}0!R2pNx c8|J w>:҂x4>^ww 2Q赎P*$ָrap |J1\Ӎ.(ŖqC %-]lT*|$ `v[Uak(fw1vtEܓ<o}7+yؐU,eJTChj83 "Q\"&F~<ɚ¢ȬxS[2" u0żT2v_Y֢luBژp$X_9D0A+ #89XuѹA0zPp]Ϻ?mMr@_Wᮢb LPębΎVgY IQ4L6櫙 \@ ,6D\xTB6IjʺSDjq( A[xqY]KCHlcY;Iil&9>nFM0˔פTg"/6'F1\f]; -F8a/[)r6 |%kfM/1@4TC'C#F׮ (! zG= nIENDB`u1f649.png000066400000000000000000000020761326020644600320360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHohe>s93ԎTBKSZ![_LSj 3RAQIB3šnl+G_Gyp׺(f`"VuGc{k]3 )oy~?n۵oa܊X鯦?oHq!LC҈pZjҴ3{%LXs(DXsNv3q.]4ޖ˴veO_ay{}gӗ {Xk`RҍD~ miŶ` cq\B-8-2޼ɾs$@]3T"V1KD Hg$[J8wZ]_X#[a01}n"U4P"V!yϏvaydڬ,s7K mL e2 0mBK) y^\R9?˩iY 1:h]H:Q2d_ QRH1 MѬ_,k{7:1 {VR=IENDB`u1f64a.png000066400000000000000000000020311326020644600320750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTe9gsfiRHH@khIpbH *5$>L61KQ$XC 45EbH4ؖRzKvC3>N^^kN벝Fj[,2nXT`7@/p;wU[Zd4ƃymɟ FſH{,мDt=[MU.k?83j^pk]gSgIPW]PƝvpt!ـdQ T"YRD4nlޥ)@ ogE}92݉t!3`Q?khbfzE~ϵCCWlBѣfko246(Y`qNګi5Kx[>Vr*hotIaKwhBlF;iW~9K=*@S>E4;ɝ+ A0"XncMk\ָrCe(OY$a;2yFY&?=j,DUQ:8吔8( Eis?W!$ dt BHKJZ rl$DjLve]9?\ 8Gţ8ڲU12ue0S0͡~=_*o4~\ˁ9g u=Vb'vRbnlz]azݷ>j +R ܹt'n8@31s 鸳}K{Žp(p8DD\#H4:?Gݼ~Ź˃c'BYJo+s3w#y8tO\`f\] ų çE!gK}oUO兺5n+* u JdcáVoVe3^/?w_4j|IENDB`u1f64b.png000066400000000000000000000020071326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[hev7jܨ&BlLj}FPyH^}M_| -`WR ҈Ӛ&mIvvs|d3;43ssZbfBYoR?ۍr+~SǾQ-5QLxϜ  Hu.Di">(i8V )zOhB:"p8ih\V<מW|F:$^]޴w ܃%CqR#X).LE4ZS]>ηػGEX]G@V#P P%X Q|Ӿ52qG0cN"y/g>˹?-LH(%GY|w'{]E`j1+nZZcjU04$&t5<:z,qrr8~nωά3e:!yz+P+7%蚦UNy\`e%Pl5˗PD;i=v.H>'x!MS!m*vKhl#aDH<\Yȏ_C]M5=׌h8Cc"+."|t;N\`I5|HM3L %J| `1yukVTlRwksNLAH]W]X3Ye328Ņ+HgxO&1 -Lx|deo0QnNlhf3 *4|kz֓L3ڌ0SXQۗ3 G~>^~42bN9~%LKތ_gH x2N:ĦԿ\IQA. t kaC P]F?}6r಄]zq\t6^# 5%[ϕD@DsنI9X؁=yX{{Ԣd>5 pOd&ujfpqnu`kmbM1Ӏg!uh`;Ϋ)_W@Pw^CpyiIENDB`u1f64b_1f3fb_200d_2640.png000066400000000000000000000020531326020644600342630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmLU+AMaS$dbbm,sQqiPI܌113燩Yf`͢.{5ۘAkҮ-9~(}{(Ow9y`"5_;nutQ?@o[ɡDʕ.mcݩlTJ 0:< ;::'t٠ Ot˹?-LH(%GY|w'{]E`j1+nZZcjU04$&t5<:z,qrr8~nωά3e:!yz+P+7%蚦UNy\`e%Pl5˗PD;i=v.H>'x!MS!m*vKhl#aDH<\Yȏ_C]M5=׌h8Cc"+."|t;N\`I5|HM3L %J| `1yukVTlRwksNLAH]W]X3Ye328Ņ+HgxO&1 -Lx|deo0QnNlhf3 *4|kz֓L3ڌ0SXQۗ3 G~>^~42bN9~%LKތ_gH x2N:ĦԿ\IQA. t kaC P]F?}6r಄]zq\t6^# 5%[ϕD@DsنI9X؁=yX{{Ԣd>5 pOd&ujfpqnu`kmbM1Ӏg!uh`;Ϋ)_W@Pw^CpyiIENDB`u1f64b_1f3fb_200d_2642.png000066400000000000000000000017661326020644600342770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lUgfvmZSņ Vb4ix&jk$>X1^HlD!-֒AhVڔ{.vg]v;w d/- yaT P=Ƈ^{]ÚUMm0-+C\GGGC0!"ԼQim.br)=9(r8H˶홃{L*AKSs䃊3p#*#'FnF`nnn^]\@dvٳGݳ\ "#5*APe%+rǏDÍR:b >RQ2‘8RJHB,fb!"e$I&43c ,܁ʆeH}MKUTVgv= !@[]OnIq0O_'ijXCnJ]Ep4TxG #YCa T( ;⪪xȫQơojtf\^8'YQ H yW'u7@߇׭c&S\d4|rȼ"kM.*AO%qY;hoˎ<(AG L:ց0qicXq} EmǢO5#OX$ar  0B=Dg${<N +`aG~:X[8mt1EBerEU e.9MnfsW :^Q[@@ӊ*tuwTvsuɭIs";<+w BAT !kIENDB`u1f64b_1f3fc.png000066400000000000000000000017541326020644600330730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlUλ>f:mAQ %¢$nFY԰1p(u ]$`LHI=w"'g܎{h:>J zUAYPwxOOD}ЇRx}~~Rj7E}/ ˦iML|<م?T[u4͢7]Qp}|Gq7>_{v]ǖ}\`9yކTuК_֝ 'ڌ aЙ݁|,OTX)MF;Tx2bkBcd19ܕ l vJ1G:XlgMrɢPxAO4Wvl nǕKπe@pm\]8XBM=%w*୰l*hb ^fFz*v]YLb=KwWJ/PJq!Bm3|IVJ!Xun|-A20H!km._kP: < h&^JYL261g 3O^چ S^$V+ _DkVp'6)Fi8a6@]IHE[I$Rj;Fw \1܉Wh% 3rβ0E_O(5`V$jm:͡5#_?)-O^sE%D A,٩ghƅl˷{YȟGwYV9 wAtpfNThW7KIk&0c'Rb$ny.cW(^**a3IXWԿ>IENDB`u1f64b_1f3fc_200d_2640.png000066400000000000000000000017541326020644600342730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlUλ>f:mAQ %¢$nFY԰1p(u ]$`LHI=w"'g܎{h:>J zUAYPwxOOD}ЇRx}~~Rj7E}/ ˦iML|<م?T[u4͢7]Qp}|Gq7>_{v]ǖ}\`9yކTuК_֝ 'ڌ aЙ݁|,OTX)MF;Tx2bkBcd19ܕ l vJ1G:XlgMrɢPxAO4Wvl nǕKπe@pm\]8XBM=%w*୰l*hb ^fFz*v]YLb=KwWJ/PJq!Bm3|IVJ!Xun|-A20H!km._kP: < h&^JYL261g 3O^چ S^$V+ _DkVp'6)Fi8a6@]IHE[I$Rj;Fw \1܉Wh% 3rβ0E_O(5`V$jm:͡5#_?)-O^sE%D A,٩ghƅl˷{YȟGwYV9 wAtpfNThW7KIk&0c'Rb$ny.cW(^**a3IXWԿ>IENDB`u1f64b_1f3fc_200d_2642.png000066400000000000000000000017121326020644600342670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTes;w: &M a!eL QcbD7FBeh0jBLjdႈH&`IR!-ii;r~0ӹ鴞sϽP&NM>\!ɵcq7n FZgn^٩jd`S9U3(jUƏ8udeqVaYE{济@8mk3nٛW o\Q@5|ߕ$ W / NlqPxUj5t)N>rb~)F',/pdK| +wO2>8(USҶ]{y'QqdqN5d,Kr|w.);V 4VyNuμXVñrx3"e$Nm|=ϕP|f?g>@]CU$qϚZA@/D5\~ái.]`zz.Wﭟ+ȝA8>@WxiO;4ݷDy֔뮂<7`q23Q/u#M0V OW| =7%ly4 دR,0BA(p!?m)Az>ش$WkMu ^"Yd ҇ԇ:Y|ANkp)/>"5Rx;'o 1n09TTp7*t>@ڶvDsqu_t6T6,2U:=8^ ;ȆkíF`Ы@ PYpmwO ~7 $'B6cgIENDB`u1f64b_1f3fd.png000066400000000000000000000017731326020644600330750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKL\e΋WCh )EEhkh1э5F&ݸ1Q 7&tᚍј6af`s;Sڞw9sGڰ<|դ׫GQ9"]jϿOi5jo0׮sAUPN+W t t a_g}W^yhZGx備׷nEPo.?4*݅޼Ym~`? SaQB~k-/FN߷t{:e+deu2yT^" dqL1x :GBs! =dnC9w0{8]ZpZh L*mȒ)DPcGB5h'[1@U:7(3=4vcT&ا Rv w{5]*46^fܘ\tT~\dvi@g/?IL js RgN`_L6_;^ yHŬ{ۥJn  55w {@-t/ege|`;LeFo"n?B.qD`j~5 >/Ueb&Yvh pmG:X^5N=Hw;$1I8ue.b!z_o5 %ej!n}}L/)o\&}CF-<TݴL, `c0N~uZL_m،=LSTE~*f`x<(\&\_W+4ğ@yyeuR=U|wK;7\KljIENDB`u1f64b_1f3fd_200d_2640.png000066400000000000000000000017731326020644600342750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKL\e΋WCh )EEhkh1э5F&ݸ1Q 7&tᚍј6af`s;Sڞw9sGڰ<|դ׫GQ9"]jϿOi5jo0׮sAUPN+W t t a_g}W^yhZGx備׷nEPo.?4*݅޼Ym~`? SaQB~k-/FN߷t{:e+deu2yT^" dqL1x :GBs! =dnC9w0{8]ZpZh L*mȒ)DPcGB5h'[1@U:7(3=4vcT&ا Rv w{5]*46^fܘ\tT~\dvi@g/?IL js RgN`_L6_;^ yHŬ{ۥJn  55w {@-t/ege|`;LeFo"n?B.qD`j~5 >/Ueb&Yvh pmG:X^5N=Hw;$1I8ue.b!z_o5 %ej!n}}L/)o\&}CF-<TݴL, `c0N~uZL_m،=LSTE~*f`x<(\&\_W+4ğ@yyeuR=U|wK;7\KljIENDB`u1f64b_1f3fd_200d_2642.png000066400000000000000000000017271326020644600342760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[h\UuΙ[II'MTT)R RRR胾` xA@A#mi҇F`.~k23t2sI\okk^{C͚{CrS$<=6Jqyq* 7*PJɰ,NBNnJm{ %ED4:{0"M.!}BRF!>482A4u Άhi]~{tdlsWw`}yQjJ75l.NRXjv$fѵ tv<}O8Q kHh Z\_`\#Zk[E6 PJc; V'|SKށVs_ʱ# /]h^ɖZ#YF@ /*Le5ԅW#ӮIn ?짺$De"P柉Yƅ{ XXNP_Sh|~QB\`/5c'SQMSf_L^؁ߢoHO2pΐx>vD'a&w]>83}`| dGL:,s+?gb60B4-JmAV),C2)}4v&(g&u-y"M?35 ! )h{g gDZ­O5hk<>&=bN+>qK9Qw?c B^ v"b7Uz,WPAmPW: =߸=݈+& " xP-0 !^h& /ݵExrcd 'g$;&gQ?)IENDB`u1f64b_1f3fe.png000066400000000000000000000017331326020644600330720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTƯv)((XPc46" H ?&…҄D1!1qg\3$,_Lf7޼{\G{)pV=wιޫم #Woݰo=Бq` |qjxxO.ҬvxƍV#0 %r U^cU+Ds~70!JR1Y}ybR'\S(?A}Knt0\hJۙcύ}~_B=N4xe$D˧&=o{zZѪQIrWT)TeW dgօ~5[ʌ+ߠ Cqpb_:l0iD3&WG&vZ$㍢ Xa&2_Ъ&#T0'N"fpkHt(8o'&ql#rw`1YTaI <R}bb&25o 05_e&`FCr c:tL\NȤzH/#e5ꖰ$Bѓ@: xdGƞ,7Ka@-B~?A]Xs)Ԅ|MXXsUWstXkΦ|\7Q&iy =xR!L$hjd}% wbt%g.`lٚ?`b,u69sz?]]g#wFlJ=2tZ@֏qRdr_(+nu~2V͝)>BMI}}}ձ#VhwpSYo|0,ɎUx?Hj:Gٛos:\?=,ԼB\ uCIENDB`u1f64b_1f3fe_200d_2640.png000066400000000000000000000017331326020644600342720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTƯv)((XPc46" H ?&…҄D1!1qg\3$,_Lf7޼{\G{)pV=wιޫم #Woݰo=Бq` |qjxxO.ҬvxƍV#0 %r U^cU+Ds~70!JR1Y}ybR'\S(?A}Knt0\hJۙcύ}~_B=N4xe$D˧&=o{zZѪQIrWT)TeW dgօ~5[ʌ+ߠ Cqpb_:l0iD3&WG&vZ$㍢ Xa&2_Ъ&#T0'N"fpkHt(8o'&ql#rw`1YTaI <R}bb&25o 05_e&`FCr c:tL\NȤzH/#e5ꖰ$Bѓ@: xdGƞ,7Ka@-B~?A]Xs)Ԅ|MXXsUWstXkΦ|\7Q&iy =xR!L$hjd}% wbt%g.`lٚ?`b,u69sz?]]g#wFlJ=2tZ@֏qRdr_(+nu~2V͝)>BMI}}}ձ#VhwpSYo|0,ɎUx?Hj:Gٛos:\?=,ԼB\ uCIENDB`u1f64b_1f3fe_200d_2642.png000066400000000000000000000017061326020644600342740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d}IDATHMlTesvjP8)SSƀDYhbDF]q ј- FдB#BRR*mνwbq:g5{dH׵wi7$?9CƲ^iUgd`v+dUXzB_|=<<&@.ȼ""JWmœ%Zշ~1OTLBEqim)i9s[kHbVP[Q<z;KDT^+"𣓟|T[5 Ҿn\܃d߽(mg?'d @FE7(:l>TrH-"q*((c !+LX뷼 @|v=2De4[bYBaXZ1HPGX\ &$"\L` &SR[fq-%Uƣ,;?f};X c3. !2j8 `S0]_wb-et4c6nzc z-0xp_+aGp,ev㟥N|roh8 n p|r"YKSigs#d }Whtwx@QXCn\lKl}GHhޕ0VIYWbۆmѥ(X^yvqӣ/U=/<=sSg)GT`uj=ۥ|v&T>w40>A27Zs@'"8u,v *7g+DV \ν=B5%,~n֖ɏk䝓1YJ=F`L@2 +Ch"IENDB`u1f64b_1f3ff.png000066400000000000000000000017301326020644600330700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoU?^;v8]MR;uCC+P ()/-\(@PqBPG'kr@9吠4MHR޵ݴ~ߛϛٙym29;{)}r?t:_ݼ~ƞQr4UxH.}ȽiYz#JÑQj@o^7B.R^_(nR>~,'PSZfz ;m%\%Thk/]`0zVd2}k=wY-v&Ϯc5*V+ؙ5[]_(,^ &-?GwED3v7kôai-jS0DC}'NaT-6\rNA ! >=P}Z^M#`m;*WΚ&4^nF '0~6F0F4*`S}lY|ffy~{q ݜdl@ػ牆sX=4 5"鹲} Y05@][>Re/5h9`X +5QjB 6J5S S S@u`Jv iw2>9 h Am&WF"ZoqG6J7D-AvPebT5+Z0+lp)ڭ*(sq)JI4 VbY5u_dLd8@i~s0/ &~`W. ᆪBx# A\E>8= 43qhv+;X*NZð7,ក.pySfOV. IIENDB`u1f64b_1f3ff_200d_2640.png000066400000000000000000000017301326020644600342700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoU?^;v8]MR;uCC+P ()/-\(@PqBPG'kr@9吠4MHR޵ݴ~ߛϛٙym29;{)}r?t:_ݼ~ƞQr4UxH.}ȽiYz#JÑQj@o^7B.R^_(nR>~,'PSZfz ;m%\%Thk/]`0zVd2}k=wY-v&Ϯc5*V+ؙ5[]_(,^ &-?GwED3v7kôai-jS0DC}'NaT-6\rNA ! >=P}Z^M#`m;*WΚ&4^nF '0~6F0F4*`S}lY|ffy~{q ݜdl@ػ牆sX=4 5"鹲} Y05@][>Re/5h9`X +5QjB 6J5S S S@u`Jv iw2>9 h Am&WF"ZoqG6J7D-AvPebT5+Z0+lp)ڭ*(sq)JI4 VbY5u_dLd8@i~s0/ &~`W. ᆪBx# A\E>8= 43qhv+;X*NZð7,ក.pySfOV. IIENDB`u1f64b_1f3ff_200d_2642.png000066400000000000000000000017421326020644600342750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMh\U7|5I4&(faQ"")]U((qaJU)_H.mH U#dM'MdN:{\L3oYwy*/|clC&oFm=$^FzPaEd]CBGò-^yP*u\EdoEPDJUJ 2g"=N>I$+DC,jy;]'z;:(|pg4np,kgDvۡ;YV3D)OsܭP]0> .?_ireR4ذM2BA,O>M4@u1 0skebo z#lXch0ϕo~>9X J) c:4c--.Wzճ0L%HHn`q >_\Bg~5%#ZɾԎNC(&IΟ=ǽDZRl};R% Iywղ*(i8V )zOhB:"p8ih\V<מW|F:$^]޴w ܃%CqR#X).LE4ZS]>ηػGEX]G@V#P P%X Q|Ӿ52qG0cN"y/g>-l tD}7Az$1։2'7E ;< <;;tt`0p["V*{!kX *.D.᠇zXIRV K`?'[nJu[%"Xs=**6y1{ce^\>x}ޛS"@4q4YP@iK/VڂvH|l ̹}~D=2jS'4*`xo!%>/ѝ!ѣlbXdg}yK_UBjpx+e7QT /pWK2\l`=wU_AV*%`r}$H* =/O9?oD+T[@ ١𫿶On\w!ݦ?\%?Sz[h3{IENDB`u1f64c.png000066400000000000000000000016721326020644600321110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dqIDATHOL\Uޙfm ZJbcLc%t`y{Enꦺ1&&t .N'Q:5B"튤AkM¼70guw̓}"vAӎAГfӛLsJ;dN;xbx/ s\n \;X,۱Xk vm4VA0佟֦"!ܗ R\Jιp xȐNgHɛGZ:i[#tz+Oi3vL-$ՌbgOt5st^ax~S}DL{%Q} kWj屉8׵猵+'=t 0fIToJ(r~y u6v.XPoI,ЯpOor4 ݔ0}zCz@q{FlL}0rV&*@7p}:c $R/$'pH"AYHh݌pJԙ֏եBFY<l\M\%UQI$:"N;*ϱN@]s*ͳ VݻqL.p8SLO Tc]k{Jzk_9ɩś͇ aYo^\7и*RZ vڞ:r 5jۧ(c§?Hdyks땇ia{ '+Ĺ×?";MEzV@bfNUPc/@r " tB K\T%&&ŲbpCIENDB`u1f64c_1f3fb.png000066400000000000000000000017231326020644600330670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMl[E;l'1M"Q!1jiŏo ",+HuTUW( IBRdU$):g.!qH{s}z3pz0̴afztsr;NO&''yyY;: PTnl>϶|X,ζJpPہ{?anȘ=fE9o//]as}h}\.W:ߠ\.WSιl{-ι~H bx2-+t|[WPdSFj{933ՂLc3:l/O>3u|$b~1mّžy'Ӫ2-^4pͨ2q1kru 7kK w2ەwS#5Qy#yZع (Q ҫk4w:^ zOoj4P@|:1^ϨU!jMI7“6Q5(Q[?03"GF A6 pGA  FN|A]@rI=1 :ԗ?5/Dž$ĈK1 "^M6558/?1`b-W D>3§ $z1 AVBľjH6@2p]k7yer?vmBezf˭ |UUo'e;Xq_4%++ fGE*z!nT; w";'Q }־|gO"DUOfyh`Zǿo3ئ^@=Ɲ̹7N34weOfUuPu=ys8O#o4knK1I DD-;JUyJǷIENDB`u1f64c_1f3fc.png000066400000000000000000000017301326020644600330660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOlTU߽:іB$&NZe q KSdPC`.1ф ]AB\X!!PR -өix6|= D&Y$Ik-$Ik&YޭFH{Cj±t:rmBlf|~W(:s\bl1$Iv/!90"I1a}b\]$I;R4^׮yJBGm^:bxĖμ({:3^:FT>mA .vN{ӟ7{%sbэ϶VVX* ^%#C؀෍,uܻy^7]43hq]  6d 4wP9RNsOYy37(t_"RB  M3ƔۅA=S`pV=Swz'/a\sa cO;zCD= ` j1߿9}N+0{V2#l%;ʌlMGh؀N|D>Xe`6_IЯ[q%RP`'?0}ȸנ! ۮD뭰 <twrELlLwSEwa;`dͨ0Uȟ2;q!apM凳Ќm+?uБ/crٙ+1|b4Wν?6=9BRfmG=W[M*s cm7[6v#;M<4P;R*?l 9$@?W9 Flt/pLFr[K/YEkc7IENDB`u1f64c_1f3fd.png000066400000000000000000000017521326020644600330730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMh\UޗNl̈́&USiBL!oE BPRJ`AHga¸hR6NL>yIx?zsaK$5a0 Df7ٍŎ;ΖιXNzx[*8\d2TN&Mtzq8Joƶt` ðe ɘO&(W- vf\ʫð9;ܾ׽kl9T2\kOe&/%>uM|~=Ev}^U|ԏO_d2f2Z|ȽC3gsү*3b{iD̀*n 6xہپOf8oF_kD?28g|Տe#rP+.0D%3%pEdz*+=. 0z~!r9WШ"+P3I+& XNy "ZA0 'jEQwl:(ݨv-K"bJWi[QAL4V; b#~ Sf#5ExȪsծWY1S1T*,9V8SN*F@v/?#³Yxirʟ헝Z#_o_ۨI⪰yyse+mwG/;Ց4'X]vA D6Uh}mX|,P?}r `}csuu&U{ Ɂs9r%71Jy18LR i&ڍKD*K2tuIENDB`u1f64c_1f3fe.png000066400000000000000000000017261326020644600330750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOh\U71&XI;Z ? t2üE$Aln!A Y V1(()z!)"E.V#2μ{\dLM}9saMWnh4z4sx-000pxK{{d2ّNT*5H$b߉D"Jyt+LvTb;*6;|A2] WJX|qYk+q >e2kݻ} \w A bι=%4;?sotmL_|v(->*-0*mw NL`:ow_m9u܊ Ff濁q7bZȶq8|n2\˶u*wT6d1Ua;TlUNЕ^g F-4ˆ VsƁP <QocT 0H^6JbE zQC@HH=V?(,FqF t'oUy_E"pdd GF{DxԸx=_r=ɲȅJޮwk05:Ru^ر?52p8/L-oJd-nFE>"Yŗg3 rϽ+xbMxV!RFENOȥGz[9;Tʈ{/OL[]mkb*#ӋK˹+ u?nsҠ%m/D#*cmjhOIENDB`u1f64c_1f3ff.png000066400000000000000000000017561326020644600331010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOh\Uޗ$cMh5e6 Z(84)څHܹ)$%+A(BBDP? PHRJEBk3dȤM&Iw;>X#D]MxMDn-Yv8玕ιcXl.qx]G*jN[Αd2_|N&Αr^:ޒJbXk#a-#[Jأð{?b_K)0ls}mfW~͊wf{{sJᜋ{{uYo8t 1ԛZ!mnS疉E[ =Mv_d2Ւf2sޮi?7NH<T=x_S?k\k3675G9уϽHAXIJ*(gAz#i^{#G5 @k;"5S *J<0]>#gT!N rA-[PT*N*46諪zO`z_SJ@y߭TfM/nI[ybmjF9OzD[z`beY自R<&b^U?Tů扳c |<[,jZWanGU#{" FO{Utsw;0н?T; ]?н ᳣/YǫY"_B(]Q\_'?;sߨVgfnh/9Yo޺o\(-Kd{M R`JQ8)X{fM^uXꭟhd✟p!7#Hb Fˋ%D?[)}<$"`g+hIENDB`u1f64d.png000066400000000000000000000014701326020644600321060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[HTQuΨcQͱ JQMAAEkID!XtH aQEfVxԎԜ{&䙈{[^{o!&]z%LtM>Wh|#rP؇bmQ-~Yb~ a5&0i򂈘OŇ0 Yz5-ц5ɊUF}>_(KV<ٹr'EEdy~3DV;VɟS\el"H-G"S08e%A 6u@2ɾ;{ A%clKs0B:@#T,,Bvlk F0U5^DfZkM N3xgoT쓹poHխ_(+BJc[6(k`"AtR,r2 ~LD=h0+Jq cqw3f}uv(S)77E[>P4/ܼjI74V޼|z`~<bfQ 1 [~SWWAeۉ *T<& dtkZA Gtvݢk5}1_qj`U8 ȶ'Rfg[~g@E 05IJW.׎kDzPjq 7[zRǓPʣiw9ٖ|rT;)lȚ,R/8*_J8͝;8֫x--y*XLRGK[x{w%BZc=bs 2`;5YE`}U9vpd `сVj@c]ͼ۴q7Ws/r79qp`({^mq38><v?t~VI^[C?n~oPxrIL싻Mϋȝq&G@ /g5+Wp`\L{ }:3 {d5Fp5-vh}Ws|0?pb= :ew"6MrZxc'bǷEL8й7| WvWS r=r ohIkVWlDZ4?^ȟG!հ8PFO&1?2M~Q.\[sIZjI\BE IENDB`u1f64d_1f3fb_200d_2640.png000066400000000000000000000015161326020644600342700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoLU?\\ sĸn 鲰IxamlzѨiU:pnʵ,x!ӜH5j%,5@q@<<9߳* (/"h= (++{̭> ȶ'Rfg[~g@E 05IJW.׎kDzPjq 7[zRǓPʣiw9ٖ|rT;)lȚ,R/8*_J8͝;8֫x--y*XLRGK[x{w%BZc=bs 2`;5YE`}U9vpd `сVj@c]ͼ۴q7Ws/r79qp`({^mq38><v?t~VI^[C?n~oPxrIL싻Mϋȝq&G@ /g5+Wp`\L{ }:3 {d5Fp5-vh}Ws|0?pb= :ew"6MrZxc'bǷEL8й7| WvWS r=r ohIkVWlDZ4?^ȟG!հ8PFO&1?2M~Q.\[sIZjI\BE IENDB`u1f64d_1f3fb_200d_2642.png000066400000000000000000000014031326020644600342650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕKHTQg^ΝQ3eT"HY-  4( K[EvADPBlQXΌ83=-r{iY>ι!fXgddDHJɄBJP,3π⢢*RN],DPZW h)ǀm`tH}{ҀEnb m`|({JM;H)@ʽz.R8 05UnhіҥT?0`hP84Ŏ˩>EK/f&KQsPs 7.f!3mѩM3.+ y:E;`= %To[|W+}}mNNf"qM4M&{p_UlZ!Qiye}:{fenx8Yjv{?N~`+DCr`Cj.UMX)% J7]SdЗ8E5d Q>%14*ut}Gh{Ml䛣FK5EMu;@rdSTt{y'O@ EY.'3'jEh2Wёdz׵z'"֍ĥWxN-y Mx. AK)1 f6Sij.a!q?tK2~&{$M-IENDB`u1f64d_1f3fc.png000066400000000000000000000014271326020644600330720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoLq?7hЫ=/zBW\4/"l㊀ @. *`ƕ]ܳ{>_BTW H8o)uU}kIT-[nTc.É'C,ORUn/A7}-ƻGv1^`+¥GĘu'{lCzeoTՁ6]2ˮ$'*ܩ>?1`&ZGS8I%8~)g;,ZRk&u[:Y?\IENDB`u1f64d_1f3fc_200d_2640.png000066400000000000000000000014271326020644600342720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoLq?7hЫ=/zBW\4/"l㊀ @. *`ƕ]ܳ{>_BTW H8o)uU}kIT-[nTc.É'C,ORUn/A7}-ƻGv1^`+¥GĘu'{lCzeoTՁ6]2ˮ$'*ܩ>?1`&ZGS8I%8~)g;,ZRk&u[:Y?\IENDB`u1f64d_1f3fc_200d_2642.png000066400000000000000000000013541326020644600342730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕKTQu̱P-bڄe$-1WbnUE#}AdR$-=-ҙ{qY]ss/CT&*}[Ӕd+5A +]Rxa+JIb`jHCmm=mu(iq(/J՗ AOkQ>yREŇˎT#TwpQc|01FѭƸ' ѕ[ &F*1+|%6T[Pڊw\)^5Ƴ3 Bmoo u,e(h8X*q9Tۖ#2N|_XLĸ0kuT {گv)pt疆ʩ3H2ל̾&ېPLnq) yGv_l.T<Ц ז|Zse 'aC)V,򱲩@ϱ.DfO&Ҷ+y=47؊Z>SwZ{r0bwO_hkZpdKQ-ectqZ en\.ţW$ֹޏt?ҽɸOG $R^RGӼDrdpR}r p^S(X"]KQQ:XQ40d3H4vp^ kPXC5ɨY ~DQc|01FѭƸ' ѕ[ &F*1+|%6T[Pڊw\)^5Ƴ3 Bmoo u,e(h8X*q9Tۖ#2N|_XLĸ0kuT {گv)pt疆ʩ3H2ל̾&ېPLnq) yGv_l.T<Ц ז|Zse 'aC)V,򱲩@ϱ.DfO&Ҷ+y=47؊Z>SwZ{r0bwO_hkZpdKQ-ectqZ en\.ţW$ֹޏt?ҽɸOG $R^RGӼDrdpR}r p^S(X"]KQQ:XQ40d3H4vp^ kPXC5ɨY ~Dk mˡYسwoSM@n 8&''-_Ên^_gOÄӾhH;"g|210 s|oXسAA| {w58H_[w!p'/u,t68QGkij?D\Qp-!PX(xdΦXL}Jۮʦ@!@9fYOR߲]4;d[UOoKȳГ}R2[(?XJ @$dʀtI+ _# X/8.1`Ik),$%/f cr>f~5G|-J.Gm <;y{e h c#hd\-\by 'R'p¯buW{6烡5nH\s2=TLPnsB;D:bLl9iQOr/"Up骷:@vy)fSlygfv aIENDB`u1f64d_1f3fe_200d_2640.png000066400000000000000000000014071326020644600342720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOSa޶b,*ATIcBH1'7G͸9(BbJ!`ǡInl9 9VcGČ453850X1nTyPf5±S[ԤS3^ 8>k mˡYسwoSM@n 8&''-_Ên^_gOÄӾhH;"g|210 s|oXسAA| {w58H_[w!p'/u,t68QGkij?D\Qp-!PX(xdΦXL}Jۮʦ@!@9fYOR߲]4;d[UOoKȳГ}R2[(?XJ @$dʀtI+ _# X/8.1`Ik),$%/f cr>f~5G|-J.Gm <;y{e h c#hd\-\by 'R'p¯buW{6烡5nH\s2=TLPnsB;D:bLl9iQOr/"Up骷:@vy)fSlygfv aIENDB`u1f64d_1f3fe_200d_2642.png000066400000000000000000000014011326020644600342660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕKUQ=JL Hi`e  "z?!r(r@'hE`5)EzXQ %&Yhכ}b\Y{tXḱ}SRvk)P5JF~cGu>}gmUg{HBjesWdа*p%YKW',ޚj%%+QeƢ7~pirIv +Zش|Wj `dIr cB$&Dc2Oab(Ȍ'@!OѤ%)4a4l\\̵EpjK7HL<62a6*,ƀ4Jm_PKAӡ-&GIE  ;4Xfd֔%i8y X]ٚ,C)Xc}-@qMqZ_%Op^]K*lb:Jp2 @֜R<S@p4Fk rv Q݋nu+e ·Ƨ elPN`‘gnn; &gyΏ(q }Jhݾiۀb̞g8;ɛ D>Zd0P4&tw"nG S[Ha|8A8VDIXu^p :^xLlx /Y/`㯁rLT,w3|$XO#` IENDB`u1f64d_1f3ff.png000066400000000000000000000014111326020644600330660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOSQ9R"TJ)JT$1c#ѕ;w4/ĝ&&\qg&H#R^)B{(bo/pK;3̙9I{z%RUč}#;n)+eITJ_2ܮRԐ+Dw:Bcu $1ZwWYQT~P0[eErD#"ripR 1`ݱ(ᆠ78}ہ-cJt2űD'" h3lo#뎻D:k(p 6 {R1B A>NL^QG`tǢ 0Y/ښ$GFHWd@KS#ːʢ+|Fv};)k2izzfTηV*l!]S/ijrV<|W3_v PՍ2p|p9.c>sjj2Erg\=]z:Z":@Au^zF4 p*Ӣ4s=GXYy宋ͤ&mϕ Mzf pTye=Ȇ{p-X=p+emEO՟b;Nxvj_;v_ t$ 5:Vp~-SohIENDB`u1f64d_1f3ff_200d_2640.png000066400000000000000000000014111326020644600342660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOSQ9R"TJ)JT$1c#ѕ;w4/ĝ&&\qg&H#R^)B{(bo/pK;3̙9I{z%RUč}#;n)+eITJ_2ܮRԐ+Dw:Bcu $1ZwWYQT~P0[eErD#"ripR 1`ݱ(ᆠ78}ہ-cJt2űD'" h3lo#뎻D:k(p 6 {R1B A>NL^QG`tǢ 0Y/ښ$GFHWd@KS#ːʢ+|Fv};)k2izzfTηV*l!]S/ijrV<|W3_v PՍ2p|p9.c>sjj2Erg\=]z:Z":@Au^zF4 p*Ӣ4s=GXYy宋ͤ&mϕ Mzf pTye=Ȇ{p-X=p+emEO՟b;Nxvj_;v_ t$ 5:Vp~-SohIENDB`u1f64d_1f3ff_200d_2642.png000066400000000000000000000014021326020644600342700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕoLaw挙j;^5X5!TDb#wq[ Ċii2)5mN;s^*szyywPWW @U#Ы㮮y,?rʐ^'gN 97&BU[ó6hiĘ7] OHdOÇnE@Uy"j.b 9˫tgjJXYct,˘9(J<0HgW`+*mAO6;3ZTY :T ˣ4J» f4سvm0l*t|Tu sɯYJua(X Sֳ@G__n]ҎhQ))YfIi;0b*"EXF әӭߴ͘#,c/*!;mֳW׽ 0-Ժ"7}u<{W .=cmuJ@C?Rb/O 5%?Zm-{A184e}G\M/[ʣmmzq [<\s)yHdpQX蠟2T8o"cIbT RC{$CGWx@$fǑ0eґ"^yrf!Ln_k>7⚨wss'i?ߟpp> dIENDB`u1f64d_200d_2640.png000066400000000000000000000014701326020644600333060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[HTQuΨcQͱ JQMAAEkID!XtH aQEfVxԎԜ{&䙈{[^{o!&]z%LtM>Wh|#rP؇bmQ-~Yb~ a5&0i򂈘OŇ0 Yz5-ц5ɊUF}>_(KV<ٹr'EEdy~3DV;VɟS\el"H-G"S08e%A 6u@2ɾ;{ A%clKs0B:@#T,,Bvlk F0U5^DfZkM N3xgoT쓹poHխ_(+BJc[6(k`"AtR,r2 ~LD=h0+Jq cqw3f}uv(S)77E[>P4/ܼjI74V޼|z`~<bfQ 1 [~SWWAeۉ *T<& dtkZA Gtvݢk5}1_qj`U8WOJ>s.Vu ;1]I7wu%z@c16 tZR|v*+`W YAL7 (~VKÜ csp'}R+Q%l?I7g`Yga!X! $E @wPQIENDB`u1f64e.png000066400000000000000000000016201326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dGIDATHMh\U83dFZhTCSQ$TԒXM,-TP)(\Tpʅn](t!nJm]ą# Rc?Մt4z3q1tR{{ϻ I [y9i! %~Լd!@!KXj`[H짭"n'g"S>~ g|HVT$WWr`W[peZ/Fљa$@4uG7DA!8N$9+v4ntC;0${pSkM ҵ@?L?+[eCHT̂ K;r>x:0!NKxfwq I2ʴgʳbCE$ɺWE+IP>(46!L @~b+IENDB`u1f64e_1f3fb.png000066400000000000000000000016351326020644600330730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dTIDATH]h[eIҦ6͚ίvsm2˨ E()c~Rd+A)lU+a08 Nfjn`JX4'9}HK'ޝyÁyr---JxOD^VJL)N}"g@[8 |TQb'ã"^D^{yd ΄T;>)^nNO:pc@]Lx go߽+B WbYo:.Z>/GhۼW0Θ\J=#`Tl@%G]5sh߳lpÃP7}簵F P7 ]uN~w#juS}" V38_]eg~ȟԅoXOqd+=U`kYR~UcK$ yH@P4Vp1`qvL *?] E v%@CুߙrV.9!][̤p)ZOq|'G/,7 Ւ.`kMω>2YsM@gX~?^L޲ϦPm%xCW͕RS28Ʊi3 Dc|ij6xYԸ)5V;U̵s NK)^nNO:pc@]Lx go߽+B WbYo:.Z>/GhۼW0Θ\J=#`Tl@%G]5sh߳lpÃP7}簵F P7 ]uN~w#juS}" V38_]eg~ȟԅoXOqd+=U`kYR~UcK$ yH@P4Vp1`qvL *?] E v%@CুߙrV.9!][̤p)ZOq|'G/,7 Ւ.`kMω>2YsM@gX~?^L޲ϦPm%xCW͕RS28Ʊi3 Dc|ij6xYԸ)5V;U̵s NK]/732L8%z )ś܉ZOK_~"Օ93ߺq f̔z=< ^uUw!;f~? Pnc"lC߼["E%edT :w)]Ygy@f U˳}.* Cpd37rENdMt5$:0iZ?ȺIENDB`u1f64e_1f3fc.png000066400000000000000000000015651326020644600330760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d,IDATHoU3c; U()I!!hX R-K] bA!!!BS۸@c;/׏=s ?8q]=wΙ9G^}q_*Kx:q.L̗3`anU@!ʻxWU/@[D8+",ع"\o6s_]^o>yx8dJ.8FY!y=!D|W(Z@o#g8<}&I&F*S~S8D7h "vTb^T]t PI"d cĢ)_pvMPJh =0ȑp#K6% FJl+= ess%rx)C&(O(ü/P"xS< 6K'›xӺ3 Զ"DB[E&:sK$PLm:Jw8TlQͫb\Tu F)l\fJĎ0A`øCaNMe@vu9FԎSCYn]jw#baYV3Qsqtl 3{$3vftU2=\}81,ΰ.fxrVI_'2/0ל2Бq}~D?!0uP\Jw;&|a9r~O5\&f[] K 5S1딽zG;wLG&O]af8Χj| M;oIENDB`u1f64e_1f3fc_200d_2640.png000066400000000000000000000015651326020644600342760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d,IDATHoU3c; U()I!!hX R-K] bA!!!BS۸@c;/׏=s ?8q]=wΙ9G^}q_*Kx:q.L̗3`anU@!ʻxWU/@[D8+",ع"\o6s_]^o>yx8dJ.8FY!y=!D|W(Z@o#g8<}&I&F*S~S8D7h "vTb^T]t PI"d cĢ)_pvMPJh =0ȑp#K6% FJl+= ess%rx)C&(O(ü/P"xS< 6K'›xӺ3 Զ"DB[E&:sK$PLm:Jw8TlQͫb\Tu F)l\fJĎ0A`øCaNMe@vu9FԎSCYn]jw#baYV3Qsqtl 3{$3vftU2=\}81,ΰ.fxrVI_'2/0ל2Бq}~D?!0uP\Jw;&|a9r~O5\&f[] K 5S1딽zG;wLG&O]af8Χj| M;oIENDB`u1f64e_1f3fc_200d_2642.png000066400000000000000000000015071326020644600342740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKhTg>fL&5jLmBm7ETJ1FT+ō TPQQPJ4-i"ٔ51q$wBb&3wf껇xKJ 팚A.QcTa&_Uj!@l\w_?' Beg99`ʫr0Ayq랛ݹqOl{>r|/@aPXN$\Ke#:F/ iw滏-gyt4e)1墿6P-KLszf'R=tGSLI&e,,o PHn/RCL>b^'307_FUD_ ğ͌01dm_K=O'99@,os+Ȗ_7hb|_F.b @,iS D3 #Lwک.5M8pZ< J] B4aj "ҹF^ D)/njs5MvݞH\<#qxCqTٹn(@SBڣ[Ę%NfG0APȢp+P(DCqe|NU- Uijgr^W֋/Q]-`%.J/z9יִƫ]hH" +/{Na)yBGg0bЯ/."|Ҿ2TJ/#Tw{h.c5w٠_8f [k6y;`7L>x4>>IENDB`u1f64e_1f3fd_200d_2640.png000066400000000000000000000015671326020644600343010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d.IDATH?lu?7[n!X DEZ6Zbh+KE%SN,- HV'GI8v'/w`'q:Em{}?wүgV].[;=nFozC՗733g }OߺsŭB^9x'O=_7>:F/ iw滏-gyt4e)1墿6P-KLszf'R=tGSLI&e,,o PHn/RCL>b^'307_FUD_ ğ͌01dm_K=O'99@,os+Ȗ_7hb|_F.b @,iS D3 #Lwک.5M8pZ< J] B4aj "ҹF^ D)/njs5MvݞH\<#qxCqTٹn(@SBڣ[Ę%NfG0APȢp+P(DCqe|NU- Uijgr^W֋/Q]-`%.J/z9יִƫ]hH" +/{Na)yBGg0bЯ/."|Ҿ2TJ/#Tw{h.c5w٠_8f [k6y;`7L>x4>>IENDB`u1f64e_1f3fd_200d_2642.png000066400000000000000000000015131326020644600342720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMhTW{7jbōP?3"u!"FX{۸ -*XhR(V,!kv!?`8:{P8L"xW];s%oODE (|™7ȡΎ1J"@=pToN3|g 0|{Lveijp- /W- Sq]L}Q丘 <:]RGO+?=zR~ hSœx8|BuQm6T ě# WTX NzpWýk~9q(<526dZE):-m9Wb\c65-^}omw }6{Q^-[n$}:rv #ryl]1t;oEb-l&m*^̾Pˌx_ށM06/Fy3qJ p9IENDB`u1f64e_1f3fe.png000066400000000000000000000015341326020644600330740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=oU33@+"(+'&$AA(@"J~ h))( PH"&zlg?Y׳L-=>ޣyI^…SʥuYEPd~/S|I Tu~~+y7Ck} =.էϼޣ8s3zssKpŽ(WW l N:XVƛ8~;;Px0a̖x#TF.X糱8cOzTJi=ڡrk'"\Nwӕ'\ʙT%ʮ[>FA Pwz" ֌G7n8,LxpuݬHxh-NvMcm;ފ ȭ,qfSE;ZWDe Gf?tn1Nb[U\u݈0IaBُvkN>%/tI2Q*pĵ ǧ W7z}#20ث}}7".<ޣyI^…SʥuYEPd~/S|I Tu~~+y7Ck} =.էϼޣ8s3zssKpŽ(WW l N:XVƛ8~;;Px0a̖x#TF.X糱8cOzTJi=ڡrk'"\Nwӕ'\ʙT%ʮ[>FA Pwz" ֌G7n8,LxpuݬHxh-NvMcm;ފ ȭ,qfSE;ZWDe Gf?tn1Nb[U\u݈0IaBُvkN>%/tI2Q*pĵ ǧ W7z}#20ث}}7".<ێQCmIGXxW%nl؈ 6"$DZ BJDx.Lv<ډ;st*{r9| zr]4HbEGojikiXX d/P])~05f(Dɱ: /],ȃyK~!c^Hap f  @5F!MUEXz}LM24uehv@y9Ζ(b6ir%#zoNiRf9iwȐMWF-8mHy|HfY=.DԖImN|+m;6 JtZi.X'%j3C;ڽCC/ jgiWP` @E5^ZVj.mؐ:A-eꚺ ,cĈCͨw˼XrFC=kk{D c/}XQԅ;hX MV6CD =Q )_V=EW3t|.c\7'O9ߍo$r^Z.IENDB`u1f64e_1f3ff.png000066400000000000000000000015251326020644600330750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHnew8c4n(­P6@   aA]v.@M7@V$Mq;gb{ qV3sιsJ| |d=D~MLFZKd]WL> ]^ˉ@MnoNYSW\D6F '3c湅\?!6)Ur%?_#og'V0=Aa(،>WEM01ab6JwnT<.wO-Q2k4X=0=]S1h*ulC%{IENDB`u1f64e_1f3ff_200d_2640.png000066400000000000000000000015251326020644600342750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHnew8c4n(­P6@   aA]v.@M7@V$Mq;gb{ qV3sιsJ| |d=D~MLFZKd]WL> ]^ˉ@MnoNYSW\D6F '3c湅\?!6)Ur%?_#og'V0=Aa(،>WEM01ab6JwnT<.wO-Q2k4X=0=]S1h*ulC%{IENDB`u1f64e_1f3ff_200d_2642.png000066400000000000000000000015201326020644600342720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMhTW7IfBԏfb+m4uQ(D(t>n(RAU.TTPR Q5f0!ęI8޽]Ę7c}?yhkk*cvb^ J=G\PI%>  L%dg9UD)k+R2H|*aLtҴ9,*~бrՍǮFZLpYEжdP>g "b?Kȩ^L{ ҙ>>Άu-Mx~*O2ñqrS6+ïֵ4npMɈhMěSӌ̗f.6{V5Kqev/=4iG; XR1*"n #ʘ[oJ3W:Snzr A`Xjf%\W-ޓwMqsϞ֔\Ecg ~:'Nc4֚`s0W0N;?E;FLTDDm`1=GϞ?WM]ISa>p~вX[oxlBX0ڑg KY{f!"bϖ;lcܷ'mXc{ٿ]e}}K@_I ?yٍYlpTb1?d=k*:n_NͭWS,A,ނļeO~ SIENDB`u1f64e_200d_2640.png000066400000000000000000000016201326020644600333040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dGIDATHMh\U83dFZhTCSQ$TԒXM,-TP)(\Tpʅn](t!nJm]ą# Rc?Մt4z3q1tR{{ϻ I [y9i! %~Լd!@!KXj`[H짭"n'g"S>~ g|HVT$WWr`W[peZ/Fљa$@4uG7DA!8N$9+v4ntC;0${pSkM ҵ@?L?+[eCHT̂ K;r>x:0!NKxfwq I2ʴgʳbCE$ɺWE+IP>(46!L @~b+IENDB`u1f64e_200d_2642.png000066400000000000000000000015261326020644600333130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHMlTesg&ARK*1Dmi&,2tÂX&q%&0$Մj[0B"b a2L1us5{ys/&vvPx,LsᛁŒc(.G/}1[n7b!!ௐ_` k~{sTJr"7qBl,ݿJGQ^^n\hrTڹ5IkS̤=2+@(P`:ܬC>QhH}b;'V1ƹeޱo~eMөH}; Eʀ? G+t#GZT 󌦆kڷ&n28Rgnp,_ۖēƕSQg¸"S|\ yϠfvYe-UK 5J$Es\dF~* C zz^uiP_\x[;)XXgL;s}`ɚQwq1i{ Cf Dg8Y6%6rq{Qdjx5_TWeı׻;~~Q%Dj mܴ[6[ ,5} V49sïs` `8Gg|!M?$>=Q%*oD!x}_{bes8aѾa'PĊUr==]|vD/WB.ݤX09`laJ@a&.8ɐnf$IENDB`u1f64f.png000066400000000000000000000014561326020644600321140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=LAovvC\ 5h h( "VDQBPRc,LQ0R y'pw {~fzO`6נp؏DZ @垑$ʲ3R좤n; B`]0wn@Ӛ04Cp%A⛜g!k T HIH\j2ڄ[ 0C &9>tg10R$Нp>0&7}VVM\S`xѧQW.xTB0Nd0ؿ"hDWsOnC)b% ؕ^gYqlC$hm[dȋ1ǜ OZgT=ٵ`<]w vA T+KG^Zv7΁/ǃ 68 GJKmoCSSʚ-cl3\ugEeSC1osZ畐W3e9oT,L6 S"'hm@v!En$^*P0* HgcWd r/[݇<4 R=9-8{Zbe*|/Cţ׉,KF} |jūV2׾*@h85A}wm$xJl ֞JI_H\IENDB`u1f64f_1f3fb.png000066400000000000000000000014741326020644600330750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKhQsg&54FXkжV>@ZkъTBAݸr!">f A7"ʥtQQ E#%VZj&3Iub셁{ϹJ_=}2Ĭ M[ TpWVy-RF+?R%J- L6wWf zJ$`]fTDAG"F)&c`)+㟠\nYx!_)Qus&4RJ$URIYwwvt/K!/S6B N"=bL\ǧ<έX@0d m'A(ke yswl۴,P$K[QFuHq̅`rD ד3tANnҒ 03:+ܶk}ɛΥ56M =A>7]~ߜwBIePP[Nu”xQyuеᑻ% nu{}|b_-m'Xm Zϥb`X޶;kɬG;}\ה1$~n\b.?#@i]&U߾o7'$IENDB`u1f64f_1f3fc.png000066400000000000000000000015041326020644600330700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]hTGgnoj>4ZBPPԤhĆRZ!-BOmi˅"oi ZV_J* * ucvciw1̼̜9;˝ _R8n{އz֩kiJRǢnG[ -[YR10>rO 64zL*~G;$#@8O"dV `U!Iјԣ54Lqrʍ9qf&rN!wL,D `hO:h"@ˁ[{Tpn/l`#Qg)#_X"cF#:_^.:|Ԋ;sH*`灨W k^.Z@-V*U[ҥc#KρrV9|2Waudo} ǫ#b JoNT*]G4rk)xa2窪z_ըAK'A v@Ɲx `*gC#7F7oj<;w{+'_i#?/{*tО'm d6(Ҳ=ܜ?4O.tiab~ ]/H:E30*&5@8݉W/6?;ˋ?p\h}tJ+/4msKԳ/\ѵh(/ p%r5/"Rw3Q䘱YK$Lr5QIENDB`u1f64f_1f3fd.png000066400000000000000000000015041326020644600330710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMhTW}8̈́$ͦTh)HDXjQUPvQ)mhEHօH cтݔĦљ{td2N2c]{޻B뛓GޯVO'kTǖg|p/?uYޜoO3|`lF kI^"=Ϯ 9,$ _3bz0Sq,_8NhN0*y׶-JRձ-RaQ߱.wy5: փёƿZ026wbsԙvRR46u /M69b]z;7xŽ#'U6oݎq5:X[ˉd$>lbs*W#-*s?̖tOu/K\Xڴ+6?ݨœ*/;P\0{%PNO^J4Dc+ig^_j-^8~к r{ejwnn~"kVү'$3hj_;s?p8%;+y }te<IENDB`u1f64f_1f3fe.png000066400000000000000000000014561326020644600331000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOhTWs{73 hji6B Aƈ& ԅPAP Vľ.܉ %E.\)XA)R] łE:cf2{\Lq̌1m9~9+ۿt͝ 0_^{oͻ](:D! XԎ-SΓ ֒GqilgUtw].d8(tg;6AeW 5ŲHBЕjQV3B8=(m uIBnZĞ_g^I^K- K{CJ^.R`?ݑC靏u* 1?̮Eb|\1b(&Y -N#GWlxV[l8Es>|YÃƺqQA \ueY=]ْ Ik7ן(7Q|+ih%ybřS7k3>6?Ư}WMi ,lW:UeͤTa` !~Οd/~cooih,{biF$C̑Rp/e5/2t&TZsM-QĒE3qέub _f& c]Q[qC8H)';- Fr>GIENDB`u1f64f_1f3ff.png000066400000000000000000000015201326020644600330710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTUΛt:fK4HKPbԤec*1oRcܹƝ"%1&$ tJ8i|o3%w7]x} —RFy">|d@.BmUU lT<=;_RӰZT>Ao=5kC['x.wg?گKk?YԨ§Zٙ7iTbSh%+5/uydxf3N%X{lmZE'Ax;Yt{~~]t] 'VY;kʮJG1փVQF"8LE_%-8?8Dwo'swV_Сx+ȚAO *К,條eʎۼIENDB`u1f681.png000066400000000000000000000015031326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOlTUcaNۉ *JB]bȢqa"14Ѻ1P5Q5u%S7 ii(N =.jLp_ronr}ܿ?{*cu6fGb @͹ d&d^8[DD Zώ.{P+BbKå͉Uf(1}@0TN=;/dufD*b̄U;R i.DwKk+jU"}o쌿_ՀL<3Wp=[$l;5z˭N Gѣ׊{H047/0Hu>H?~s?0w>{}qYo |m Ul E3#2R\Σ^ࡦ T\и?݊F.GP^YuWlxHe*B>ؙ\Z$Uhdž[Ԏ249Ι~|wuK6͒ ]U|q%rUֽoł]ˍ\{7|/h2ŧRwK!+Ud=8\;}ڈժOXϑb\_}|K/@ױSG~ ])W7+"17y Bܪ0JƼ#Eonjf'݃**ykGSX`qr+7[sIENDB`u1f682.png000066400000000000000000000020451326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTU{tRZIZJiEV*j4 D0&FРₐqc0~$TQA"T$n"4kFf:Ei;m3yvڴIc4n=s_KRAmmWD^Oω鮮iOoTJwwwG.@Oml^KO<<){gD ?ˇ߭ar9>tNlI;fYVlԷ:ZoyRR`YVi]@}*:>⅋F[ gP-%-ӋRE$HqJ*TEP= ޹3M::lh#>!(?>jr %.tPƊD0@*5O@%znyM\~pK-zҚl7yxeZX%4`YWo+w.PeI&& wqmOiM[?f|̕=PKK; i aBTpG\OD[bSeDOOyw]D>՚NtCDrl6 l~:O%|,=k\^(su:t %g-ސx"rѲ^T.u@ "%⪣q3#d`D==???``]ZEoX@DmD0[WyqC;-`nn.n3< {ѭM tX[0=S~+d>55eb ~SP8HƒIckAy!GdX*U9c1:2t^mcλ?9M+jP/]z-ș#og:;;{ oϯs+[`A.Fxۡ'k"rP(0==xFU_vmV׺EOI(>9d2 `$9 mv:<>ĕ*M۽=;bsdZ XT"F`0H<'o hms@%bN}f^YYyױr\h( !r4 M1?wbp2VIENDB`u1f686.png000066400000000000000000000011641326020644600320340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d+IDATHݕKq?nFd+ B1K"Ǻ-?:B/AKBDid-JEݙ}:Lv{}>ggQNrRȈ*/\o>K6^ؕr%ֹ@>i=&":ъkqf2o)`ȫ"w>0@Mޓd^ P8* U Z%泐x Q#ز[ #HBx"-bHucd6~p"~,&*?$Q٢)SI1{)>ʖh;ff H0jj|QZ Y6ؘG'C< NEn4P>eFB>AK@/822O[;L̦d6GCHmhYb#lro.[V@ 8Λm<k8<{]v"r[Um˲miuȽ<RNiIENDB`u1f687.png000066400000000000000000000015721326020644600320400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d1IDATHOLTW(QTMv`iMԅAHSD&]P8vpIL6 I bԀ.Jmmh&1 h1&ϻ.`7{o{s=PB7JQxڙz B^q_NB GQpλ +(F`Ǡ42a! ql$LOPZPsq 7RQ!&f6KvAqvZ &qC+6`Hi!B)MSyd=Z@㾠4ݜMnׂut?1@m)+%5.yXP<`<&CT_\."^ 1!MJ;r_>ZACyu *VOp/el~7} C(%tS2=ȕi J6|'x,Aː~)2kmt&ul"A L+)E?I鶴#@F KG^!MapQK\M#2|d&' 9?P>qgYBV܌i4±VNGK /Mn&Dz y@6@PΪr`( E V#LQ} VGgx7MV;DZ<'6bGTؿzt|^SD[Fˉ03bA/)/wlA C߀r'T-iT/' Qaa@Ќ鼞2,KM2Z rP2y1Y+7MLo\dn-J[;/%kQ ktn 7c<1zyB~-n u(;7B&9|_*>0p #ctFFO]Ǥca %n?3㤶md#$~}c4埙q֝,O }|uV{n wx:=M3óqVKQQ46 x/i ДLO7̿4[7{\9ک-n/}W|MF D ZNphM@SaZN .3"B/jVN;tؗ[9s2_Wh,k89fOJ%GYX]'lQR1{ fYY"+WNB)׻T*;g1p "W\9v?"'S[J98N Rݟx4(Sv=ćn"S߸5qjV*17{0 w2Z(^˅?<0dIENDB`u1f68b.png000066400000000000000000000013541326020644600321110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]ha׽lޏmb$Z-H2!f+9,H RHvrX ) i m϶s9xyʉ}2kgTVeسʍX㑧B6 t$\T_~ء?:L.\S}k?eƯK7#,j'Mv}@ؙjt Y$R3g ~7}ɭh +45pTrT1+0`> %P dZ,D10#oJOoȍ$ƍ]@6x񾽙~P]kJ6U2#o.=;KbDql)ʮ3$q{g9hyYBf8'`fx =C8m&e'‘o)%(:Xϭv#?Ԡ<ˀӋxVwG>81hmoή8NGSTpzyp7i& ;OQ80߄gTUF.*8l*\5Ƙ#6,ǻe~~*٬Ƙ&U/"MO?3/!))IENDB`u1f68c.png000066400000000000000000000015531326020644600321130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d"IDATHՕOlU?73U+`Mj,%4\$^4'CFA)gEB-1nMv%hWhwgg{,`nzL&~޼q$dO>QίuR]e;ؾ%oeǎWC}?Y $dh3<7w,_B}%L7b<ɦJ92 < V 1Af`^衂=gDR: : L ɕ&  .?:`ҰV9ԵN`@ЬmFxSt%k@5ߨb@;Tp)u-p)!(Z~40}vPgJ!(@oHGYdTmI1wGMH`N?99#x |R{?o IENDB`u1f68e.png000066400000000000000000000014521326020644600321130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkTgwd$)!̢M7( bݴAKV%]B m)EuяD IhΘd3ڎM|6=qO{7೯LTWo]ffEHh%%mM<{_P;)ak cm[|?ϝi皸wx(`׹˃]ܥt_vs6e0羿?}:߳c3Q]dwjؚpؖt 7*U؝ -!}ŔUZpDܫEݽiYvmpd[|]5V-uclO~Vqdɮ(7aXN0ef9\}+%ѯ$Ja۴S,;%7"dwx[:jnW?Dyu J@O\d5Ke ) ($)6RzWޝqU=rvPx###MMMMCKT;6lW Eda8L.*"+z! OrGL&'o%"  q6IENDB`u1f68f.png000066400000000000000000000010251326020644600321100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH픱kAoor4mX؈`gRAbu+P,D.1!ۘyY,v`oo>(9Xamv^i,XqN-xl#b :{i~`W6H`;.ީ:l%jj5uzryAWuH߮n&q ژԥa#lw=㟇"Ry $Mto<zB@Ḁc60@党 EeCǶo͙My0(9YAEu1{XZMc b\&L1Kf:xމ5ϕ-ʘ[˗R;Қsg%ibq"^E2*hQU `k㜝;gvg2zK瞷r;UJY+KdC" oR 8WV$mąHͳ6I;o3CEąx{ιg7w1(HS~5|[,~D޳vKTca p㎳w|{mnG),uT liVHR/@+]n(<%w '* 4{9dD4 >:ڞc/l|uT6n+++քj`%Nkb"/O>55` 8XN&''驄< B3"X[[c~~a:::}h4J2$cennZ yWCP17>2 \)9^D"_X]]e{{ŷ!###Edhϩ9c|$J.0rIENDB`u1f692.png000066400000000000000000000024311326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHV}Lg~޻~UZJ?u_Xh:4Y2܇Ә} Edfc,N3cR&lhB,h;fEw"w`N7q~X䠦vX,AIbG_p8o8FxYūO"d/x/TUf3BZS^OidBhkk`hZV( t8=M `bbJt7(Lɂ>ڛufҒS;+xs427H8K*BRǑ?""#A|9e&tX/ C`bQS`(+ r#uv0{ӨX 3%PQQ1e+2 G8%%%RJ,,#]n޼9t:0_]IENDB`u1f693.png000066400000000000000000000015751326020644600320400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d4IDATH_h[U?ބhXKMC{o"ˊSAJ_ aLL V-"8304Զiy{ϗtd3Z6;r~FmuON$t=S Ѡuu++ !M<-5aD=*soGD~%PՄ~h2PW`sA | ݇0_oˉu9[iQ%H& "Jt:ݱmgC"rP*6R?"]&9Ȯ 8Nwttinn`6kkk2>>N*,\.ێLӌ544|?<<_ 6ūn|TR+k=<]D"qɲG*]tpp6K .])\.\).+ùlhm} ɞ#ݹbV \ǟbb14#ȉnJ.x5:5:{^j==Up.a]Ohkk43}}}2::*r;LLLHooa橑ےV#LJ4}LRLNNbڻX, 8??G(5t/;vo,kk"2p/0< A1 $"Ɋ| hRJu[qV4J@5W4M\D>G333o*As,x<͞eZ[[4-UZܗ.n/--]D2WBiڋL&};? &IENDB`u1f694.png000066400000000000000000000017521326020644600320360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOLcU tBP!S'8$F0 ĸh\I!LP#3ĄL$$.\(n WEd`)XYYYN$W GOӤi(@"z0==ix<:(yh`x<.SSSU Fd2Nܢ-677md2Yy0 ɜzeY֒U |+H\t(gGGCCc D6Ua<ضdžaRj75M;s8s]Ԫ8Bɰ BQhe*zP(tSDn(>JӟrȬ> ǵ"8qB_ MӾ]Ӵ9YVEܿ(C|{IENDB`u1f695.png000066400000000000000000000014601326020644600320330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]HTy9gf)pʾ@(>(/.6>b OviY胺ɌH(0((+ZVˢ0-qΜ9iNBtswyÁ=U{oKW| 3P) @eTnY[g/y^^TMת/ к\G9 e!H_5' w g;{Y\v/!.Z-Osx:&N@.i=*@ob9fXڠc$5c{ ZQ y~se~.5;}8яomv n8oD*b,W6`vh1 SƂٵr AO7!~dC ;gĮ^ #Mr/ck`-Sy5DŽ0/"S⡸04&8&%<ڀ~ϴ˕?Cw=!,82ueՠIIKIi/}7hr.\oef<7 6Sڢpzzr 7wS6Ysz~rvBASh+[O!"ك5!%gwXޜrHdKGF DO)U]h4? āX,V-A03MWDDdw,'[7zvIENDB`u1f696.png000066400000000000000000000013571326020644600320410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMHTQ> (1q\dVDi%ԢE]M E("6!e!}0h)h1ﶘjy?8HCpҶ@7uFGGÖ;ֶzٞRD"ڶ];<}hYHifo~ċJo L`V&|#X&YuvQm(_Ϸ`C>Wj$"Q.E~"y.FK^KJ#/"*\)n,랈|ƔR{lSDIENDB`u1f697.png000066400000000000000000000012341326020644600320340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dSIDATHOHQ?~sM7e4B :NN:E'cQP]Ctː֡K"*\?u g{ce,ςJE6þ ^Aq)Jp=1 iUc6G5xx,J#d'# ُE&tΧw3X* ͞?d<3 KFz]P"wԹ9vݤR"eqby[8U{>ϩm;)z/Fp zZaXB% nbMW 4 p\{ c $w@!:L\*fbvWfF,Zq~9[ŘFG D IaȘ%Coq}{uc Gd f{AI%0:^Z hB娊œT D+z^wmL6mz7TI)/LMMMtm0f9.R^ZZZ^RRjIJ2<7IENDB`u1f698.png000066400000000000000000000014311326020644600320340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoLQjI"&66Ѱ4V"XHIk ; lB$"iKG4>-&=-7;5ꞛ{s˽_BnR %.W@) ipr }Z!Jfcu!ia88`iGKϴPs V=uwKt)E #duU@!( 0{%/%姟Vx^[',6alf8TLΉ3|z@od#@[E,`w YQc PSTR3* >Θ`x@k &@=/[Nje2N8t,]dO, $(tה+zFhD5O:A1D̾ 4h%kW'TOJ#a''wܹX]Oі==`űSX2-F0 kJא/CL?)ZT:@ cK\_mMA2ÁNv<n׸jq?BhU7?i-/ڭ2py܄oΚ]w~Ug,jљrbi:yh4Zes˲$N&*y~^"qO!r9O?}"r N&@ZD.'IQ+kڡǀIENDB`u1f699.png000066400000000000000000000014371326020644600320430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_lKa9Ub cZH;!"\!.\"%"!XdX" Y؟0[m3ay][i%KFe +WJt^*5Ds'Zl&gK7.tZ?) ]o)ZLm[Uis9"Rc'B&C^t)vݱN kcؒle'2p뻠N.ix 88،~sEmFMek✹x);Lg7ledHCX-*Ʒf=eϪli_V>an>U]Dh0<\6[I{>RWyI X<|&i yk~xܢb:@J5^}M0.,!06ev/Jx<0Y)^0曦#p+v"(ijjh4-a4M+:~ # `rIENDB`u1f69a.png000066400000000000000000000011761326020644600321130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d5IDATHMOQ;3PJ4|$J) bb"q„W.HX KEԸqe0V`ƶRB̤Po2s}9gra_%1ݞ=>Gbee{PR*IѮLam; !1@n#}<^20 UlY-w/lZ 2rv )xgl,).G 7l*,ˈƃAU8oe7 +BAH[,e=AE}fԄઔb4|0IMUo,KBni+u@5cڏ{X\\TS-zePc=iڄbX,> F+,kD?|.bMIENDB`u1f69b.png000066400000000000000000000012431326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dZIDATHMHQOGK  $*'ƨE *(ڵH۵iѢrQ-*mhT&i(IA3AeN483wOɰ?vpr{{{80YCtꍅ-w[ɻ~zխsJ!5yWqlS، . WNF^Իs3ZZUz9,qm2̵،AJ1̜Blr`@$iɏSN-ke~.kV;G޳ŸS{@ʕ&X[MhE"m/M&trx$4AٟRL!lق#TsAD\ZX՘B04Vࣗ1Hr `L)~.EL(J|f]?m@ :~aw 4.F2!] 2[Ӽ\Gڱ^e6N7W~Uh<@4Sl*~[ ;TοѻNݳoJ|0ȓ1_EZYD.D"[ BƘ}kmq]"r:~u#*1m:_`F !:T.dIENDB`u1f69c.png000066400000000000000000000016401326020644600321110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dWIDATHՔ]lSe9؎sKfѠiBYȼ1d~x!)fSo 5YLHNI&1%&2!l 1+B{,Jh9y!nHR:U;dU}"uXŚ@Pa9@G#1"@ۿO_T)K"ZToXLl mo7EҲl)#۶`UqB"|\8~mUVD:MUTuL|s]78p)D-GMi.Fu#'C~0ozu7 &?{ذ:"${#v, >Z/_stppB}Wlf88}YaJ`lht3xn^-œ:5SJڕ$w\gd<5KrKG46S4W Zu_|5ދU/T`&x.k wAl6S5h*~lWVOw#:§ l6}\y3VZ`^̭ <!-֖b( u%+#]A᭟40]+/.ԟsv#IoO̠xTc.c^',&: #IexZ&vZ[[qN`ۈY/x e.|b8cʕ{r@"@'@ցӗa4ҁh4lllU-9j(f}t)ᆆ$A4=PP4YUO:o||z%{_7QU03F-?NL{>->IENDB`u1f69d.png000066400000000000000000000014161326020644600321130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKHTasfQ:5cuQE-EBTHA&D2AD- 0+}AD*V]lo8!s{0)ʞIrRW}9xAD50vru\߱F== %B/b͵U ]mL`M^ogB{.@%ؘ&h(Zj*c kZUaI%!/%!a}GbMiFv~q]hyԁM19y5T!-t)Dͻo?) $(V*(aG2jQ4]W 彷 KFJ=*۝ $Nc9._@6kbq@ػ!Z矜ig_zo*6&3 J2^',c)fѢmv3&ELy 8Rj0NQhlqcx/6и Xc<*IJ%n5gR艏@ O4/ 'w Nz *h}5l Sh#St͇%Lɤ6'-'Ri`Bjd"id̩-/B0@FDy;盏IENDB`u1f69e.png000066400000000000000000000015341326020644600321150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHk[e?IMn; H7F+UA/_WN.jA70D7ںR\X,MܛEfv{s|sι ,HWF5Ucnz,Tԫ =A}ce-dpH֚UxySkfy ֑7 =m&xaTگ><ߎvd\fO`D5+$mՊKP(% /N'eV.m&ϊ' ꍹb[F=b(}FP=5rtz*s^,k,V]C^֕Z`?b(C|u\9 }WsurK5>Vc8uzqn8soBCس7M1>Fw\\e1甞gE7Zuz>zqmkvE ́H I ՌYo8þ;3oV/QIE ] hפI!0N1wآ>$Pg@l x Rټſ^5< ֏| ),m>@݁7>fYZ%022AN~~'xyZ\iC?$gTnF1#IF(Jp k(Jy)v_511z甅o]۶pwg.˶ͬLjDovޞ˜oWM:1՚kyw'Znowkyns?E -Ц Rb}IENDB`u1f69f.png000066400000000000000000000013001326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dwIDATHOHTQͿ3NZ*C+d-:A@] ](6ZԢŸqB0`BX4Fs&3yyom18Z ;;^!r:Qz ޵KߊZ_pw^R Gnް6YZ5NX-s |W]r֭_&Qjs>۫]J2iV6!%%JBJ =f_u i5xHY0P[>?V#Wk?iSwvq0TPaJny-|jY멫ʌ%4ϱ 3"_vf-й5]bM-!g[{PsA%ދC`ԃcjL@=8DO$ g7Ф VO{RЂmhZ B8ehOcUS2P(_""e?6*y?@6PgP9Ww@e\.MtD'8;-4Rϲf DT.wPԔDLIQǿ/ZzwIENDB`u1f6a0.png000066400000000000000000000011231326020644600320720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATH?hSQ%M-"Q*PAAt*JEADK) U Ut.F$!4$yMuF/}"ms; bStabz35FP(,wPr``J`x lYeF#RK o5RtDPuUK~%cc:[?ps /O Pz|{hoJ@S-oW ; X94VqH%8rH]i&9" P)7%k^@S M  Is;8?GCQX1̚ꯟ Uwsg4}{7DvpY\Ցpыl&ܵ0_Ig-TjUFf?^TMH'b]b]a@>$[ x 4O}m %/Vq&_iS{`u uWin޶{DOm. 2y ܎Q8y`F}'뎧r!ʢIENDB`u1f6a1.png000066400000000000000000000013521326020644600320770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHSKQ~}msj˩cQaX! bA@7QAB.1& 2‹ EHDTDጶ9ź8yuP'ۺPxk fȮaNb:g[@KfSh@ ,j}TIf1nf |L aq2D† 3a7@!1]gϊ7U{8ߠ'RcftCtO^S?ӛ)$!BH\]ˋ [(;ѳ.cN;hmjH!״* DtsNP:la\'ʉ΅ b[^> ;B'g|*rheABCП`!}WfGpt'z 6 pdP'Ţ\sB+MKx%"QDٶ%L a_mZ&hBkqguS4-$Դ; !b6x旌RJB_} W-@$(,-Gt}8>?:le&Hak i_X4IENDB`u1f6a2.png000066400000000000000000000016121326020644600320770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dAIDATH[h\U@׾wdrG8Lhl ŪATb`)H[~C?QHW5Xfԩ6fLҘ4dgML4p>k^a<}ӲK[5?l_È(u IM0e'-hjiцzbeŜ>?IR#|5X |owm7>=ҍ\/*_04xk#/_O!O-)fGg2Y㿓v&蟅 pYclAlk$v1Xf[Z$L[{?Onn}s޷,Wf#0N܇L[}(^/s[umuW̩ڳ ;W=*ɱq燈mmlK`Hd ;:VB[$ 0t=R=M"Zuѱ.r;VT )}4:~w ^.E/a ]Gc{pRg4݂yq N bPsn=Zyk#/}D쬉EΘVG*XKxa⑳ ]*;+_Y>\-݀{䊠mhLڝo(u{`- ;/#AjV,-_aњ%+͗O/e} C'bl;s&3]PAF͢1l^Nͅ1f5YU U%q* 3+Y?@kSGUSol_mA?4tǺFIENDB`u1f6a3.png000066400000000000000000000015231326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATH]hg}dBn&b̅i)E ^XbKE(-BWxԋ6$BEhCB(TIk-ffwfgB M&=g~sjw6Ye3:vO&y٢X79N ݕqU9PN "8=a3屺 %@ʩ# 5.a&SOC@{ԩM{fq+'9ub%a`S]3OP-ҩqxͨ G@(I-ښZ}}x"]63>cֲqil](ټgQS}񧮮ULޯUr[{ CSmo /ܔk"xu+mxUInDtłڬXjEqa'^8w%T2o搚!VR>3RлNĽQuÜ_S5'#:oDwGt2Pz[V*, xc @:7:N.7|3kÙ+[R*>?uZ?*vg{Vf"k"ϪPZFlpg{ v(/@g Y0"ܨm  = hK}|^_| Cf3?$fYv&DqweεƗ^(G BFX4jIENDB`u1f6a3_1f3fb.png000066400000000000000000000015141326020644600330620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͕[he?r0LҴk"JPJ@^I{ы( -UTŋJZ jHR<@ QJ/]4f7j.|/y}y盙OJR]t: `Ўmxm šl  ϯhط<Ǿ-ALݶ/>;ls[< Yр ȼ)\PǂeϴAc(yȑrAPx5XJ.;,h ~۫Ǔk 1J8sh9=iC{-J䂂3 W8h=Kzď %x axPhXzߢEwO]S:hUuMY7l doęҭ͛f僥ӗkJMl5jRO* dGMr ƍBlnZZmbNtl,RMG4fݪwBlGgR!!֟t+F~Rq\ө'$PZ'B6;n1Pv\Rk%*[Z/]k#3;J̔Z_,k-JծMk^|V׫/FB@RtZ\iQlxQͻŔ-b5uMW {&_;o\i1_w +:anɗ"g΋(mi,w^gZywT xAd3{NIENDB`u1f6a3_1f3fb_200d_2640.png000066400000000000000000000015611326020644600342640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d(IDATH͕Mh\U|d>0iDZҩSJb(U[ څ.[)~Pi*bAPvҀH҅ Q)CmӦiNy޼7E5X3NMys߅t@~vuouЁh@ٲ p HR'Dd`>qlV4OpQTߖ舆[ h Ju6/-):Axi=2Xb;^BrqPx'.瞙Xuɩ[LwAJL#wu:i Y@]cor)Oj`q%{7ϊOFv:5p#Stthm.qnm?gymGkw 6m6!7[Yj #5V,pe7gmfZwZy.腆F}VnrDj$Z_ 6 dO)ӐXaܹZH:nk@|%s&ҟ|3Bֽ~j;*fDL樳(7&]~"ڔob w}cY֎JT}ZѾ1"¤;쿧2^/q= e3IěL GxiUL7ؼΗw\UG+[w|y!kXﮧ5%BsKfF*Sߐ/Z̏nfg*ZLe=lMx -ɫGFtIENDB`u1f6a3_1f3fb_200d_2642.png000066400000000000000000000015141326020644600342640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͕[he?r0LҴk"JPJ@^I{ы( -UTŋJZ jHR<@ QJ/]4f7j.|/y}y盙OJR]t: `Ўmxm šl  ϯhط<Ǿ-ALݶ/>;ls[< Yр ȼ)\PǂeϴAc(yȑrAPx5XJ.;,h ~۫Ǔk 1J8sh9=iC{-J䂂3 W8h=Kzď %x axPhXzߢEwO]S:hUuMY7l doęҭ͛f僥ӗkJMl5jRO* dGMr ƍBlnZZmbNtl,RMG4fݪwBlGgR!!֟t+F~Rq\ө'$PZ'B6;n1Pv\Rk%*[Z/]k#3;J̔Z_,k-JծMk^|V׫/FB@RtZ\iQlxQͻŔ-b5uMW {&_;o\i1_w +:anɗ"g΋(mi,w^gZywT xAd3{NIENDB`u1f6a3_1f3fc.png000066400000000000000000000015121326020644600330610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͕]heͷ]+4e&A#m@DjUDb,BzQE7^E7jT@h RE UbmIc13;3Кd^x.<}y93곷;Hp׊MST'sxo3@y"(at(ʨXL6lXP v,_7Kx?5ؽ0j.ew*Sa ~ɟyZ_"'r#2œ=0}a VOpL'xO~1"|H m|_t(s,r?hA 1#f\߱|_ϼD5u7yبBZflߣ{m|6S$tdzd`23%mǎ,nc83qud`c.*#=ݒtD_UJg쮜 uRroq;Fr/\ޞN@c%jќCbLj/kTMquV$O\X  2$;4!&ʧnRns`y69ynrZ䕟ה6"Tj`S)~\3SiQ W U5/\k+}dJ\w1Lt)oneo;koYI]dd; [7*\.S5_ IENDB`u1f6a3_1f3fc_200d_2640.png000066400000000000000000000015651326020644600342710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d,IDATHU]hSg~|9'I@'nډz32u"XP'0qz oTd@9dOEԖѪMNrr]\ho\>y| 玬n>PѕS< ?In/Ԋ "vϷ@B 50Hȉvl@@XkD2P*h;4 a2t'$C; (pyŮ6ɧAȮ WUl<["+{4`-ژ;4{!෷w4-Se _*߹lXWD>%K5xsǸl4LSF)G>>"x_+{Ag{^ݗ޻(ǾZ'V~eoEL%jPu`Cw6BM6!U"nng[Aٚ[m]PckvyK(: 4M٣Z)oneo;koYI]dd; [7*\.S5_ IENDB`u1f6a3_1f3fd.png000066400000000000000000000015121326020644600330620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHU[lLQ]yuc"zWD3G/"iHA  !$D$GQ՘i;;s{Ѡ3ZY g!o^6>涞IҶyc`{.J)쑡ʝ[;QY U ('$8A "6% AצBY}in N ]&Kk2 Z`Guqz>7Hl^d6juj0|Q@l[ ֟ڱЩ n HdW'ل"H $E-n> Af(|li.aRg%WO4N*&Qr>yl ?ܲ`Uwf̑>-g=JQuW1h,j~D^%XPA}g3lkfjr[n͢S[/DfCSG@">[8D TN f\`'Ho֙_J%}#7Q8*$ pX @+F.g;R}Fc/'}/Ep]L{`z~tެVXkJU(z5Æi! .m{\AHap6|=J(d3 F>F~ܛЌJ`l$rs~ٽ]VB-j֫/\+c$ɗzNyz؏&ɏ6;2 1o0B؟ W{I=czX*;/2Uvx0٢&HϤsRc|(ߝ[XuVv,wL,,^kPft]0>W\qFwg? jB) 5eL\QQ 4K3^Ieo4.h6fM>NP~ge`l澄Pm4un2@8\@@xU^ΦN^h7BI}"^^VOjCH0X[f"g%_-%~]avPL@O AE&7aǝ#I_F̸Mpj5FGT)\| Y[FG{ƛ},*1cj 0mH/-0wnb0SYnlq+ڌwU?څR5?y> HSKBvIENDB`u1f6a3_1f3fd_200d_2642.png000066400000000000000000000015121326020644600342640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHU[lLQ]yuc"zWD3G/"iHA  !$D$GQ՘i;;s{Ѡ3ZY g!o^6>涞IҶyc`{.J)쑡ʝ[;QY U ('$8A "6% AצBY}in N ]&Kk2 Z`Guqz>7Hl^d6juj0|Q@l[ ֟ڱЩ n HdW'ل"H $E-n> Af(|li.aRg%WO4N*&Qr>yl ?ܲ`Uwf̑>-g=JQuW1h,j~D^%XPA}g3lkfjr[n͢S[/DfCSG@">[8D TN f\`'Ho֙_J%}#7Q8*$ pX @+F.g;R}Fc/'}/Ep]L{`z~tެVXkJU(z5Æi! .m{\AHap6|=J(d3 F>F~ܛЌJ`l$rsU(MrBQe%bdZ)D& GUȟ{uf4|BIY?r/`0EL`a OYe&ITwsO= ј19F ,Q'wwŃH9|~ &RYӎmSޡӲhOe+$`{DžW֜P(\pAǎbWzz $%!@yl/J(ΜSɆĬX=1 ߤ)ґҷ5ia׈+)K Уە}B}an2TwAmCVT6MN~ ޯg/G &wr%ũu-9rt] b. k2o@51뽁;̵ 3[D`~X(\>6>6CeD"1|s>JSo/-t%7S0neɟ;WfŎXIu(MRt4u}4Ӕp|҂mxg ~oF+~y]#\8`S.lnT +A@oZiXޘ]2}|Wp+{3ߴ^.:.a bm; *tnO^AGDk%FIENDB`u1f6a3_1f3ff_200d_2642.png000066400000000000000000000015031326020644600342660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKHTaKqZ](+""ZU-.]pѾ(qզ%XPA%]̴hΜqsZD9Dzoy=|?K^VPҴIp'P0tZBz\.}ʲsjr["i@|'{S"sj*BRSG zzZ|^X$\MU(MrBQe%bdZ)D& GUȟ{uf4|BIY?r/`0EL`a OYe&ITwsO= ј19F ,Q'wwŃH9|~ &RYӎmSޡӲhOe+J6pqhE=~~]C.Vm0\SѤRm$e 6KN&@Q׬7,g+փ1cja6=g!|U\A~fb1)Nq'qcwT7Қ5S;y)RS^͋ѪIENDB`u1f6a3_200d_2642.png000066400000000000000000000015231326020644600333030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATH]hg}dBn&b̅i)E ^XbKE(-BWxԋ6$BEhCB(TIk-ffwfgB M&=g~sjw6Ye3:vO&y٢X79N ݕqU9PN "8=a3屺 %@ʩ# 5.a&SOC@{ԩM{fq+'9ub%a`S]3OP-ҩqxͨ G@(I-ښZ}}x"]63>cֲqil](ټgQS}񧮮ULޯUr[{ CSmo /ܔk"xu+mxUInDtłڬXjEqa'^8w%T2o搚!VR>3RлNĽQuÜ_S5'#:oDwGt2Pz[V*, xc @:7:N.7|3kÙ+[R*>?uZ?*vg{Vf"k"ϪPZFlpg{ v(/@g Y0"ܨm  = hK}|^_| Cf3?$fYv&DqweεƗ^(G BFX4jIENDB`u1f6a4.png000066400000000000000000000014641326020644600321060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHTMh\UΝ{31/3N&&YtI6 5j0K$1dѕڅt'N!Y4P(QE D15t1M4dޛ{w g6僳s=?p#W-qdd ҙLr^:#@;WOѻQ7ep.=sk WtF:^S w. ,Η,g@Ŀ7| M=H eX${'@ZR73:e4qf+ 9f+v.& >CKBꚆH0([6ӲP4ʛki.?*c_o˚7x츮E|`,`Z6ee AУZz,BCrsSv W'O"ɚ}V  c+J%<,TlJ{[l6+VwOG@hu(C[Q Hv$3kbC|}l$5DؙoK%&c!IENDB`u1f6a5.png000066400000000000000000000015131326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMh\U羗df:$|hZTtQJ"R"E!"څ0uf.deE0HSRGl"mI34i!Lf޽.)t`s~¿RJZ%"5ڱX,v\*%jZk?NwvvnG".:ה ϢDg.,,]ןzrGwkKjd3Z_`''bmoNXIDB pעd+wDZf|bPʥMa!잛Km۷)adÌ]@=_ 8KGP^+ՆXy &c47s艷uK|ppU9^{^s3:(/yw,U!%ޙ @b&Sghjh89Zk7!`'| dPY]k_^L/ O N_jۉU՘tBJKx+R %ZQV{R^}~?+ Un)4wjI7:!Z74޲ B͕S017uWH/ UD$ƍPy2ll5x/Zu¹߶ok{u]_ c W:?B.?yXw "&>;27}ue6r޼E:IC4Vϟ<}]Z\[JL&3ӓ]J>]]]'KwT1ELkk9nVȵX,6V.O"f3IENDB`u1f6a6.png000066400000000000000000000014641326020644600321100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHIhA3_Қ6.bQ[QTT VDңKѓxC=9I+*("׃("ܗ"JMKƶ6<ii6 ̛E  <悂҇J)*~*7T4IhQ9^WWwf\5o3R.5ѴQ@5Q?SNdc+&v5.oP,Y6c13DkŶT9r*K瘂rQY %kZ^FDngR_q$ #OCMkGV7XNB7@./imآUSS1 F龾-0t'>oRO?;/%BIENDB`u1f6a7.png000066400000000000000000000024231326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHilTUڙ)D@Xl)6 H܈/j$l̈́1BhjFֲh4)H QfLg޻~:l)U Z^AO=u1TTT<TZЛƘgϞi.P VӁ!]t_Ɂn#ªCZ&hhoDG`~Ohe WxiiiЫ)*V (PTuWhE= cؿY l,XBFDNݫ@SSS;kPsU0ŸնKe([E EA:w6&k71{koMN'/wEۏӖ҉pUrn9)P- `|v pF G&q4ҍʧot]3{M0jfahXյ46{kf67: @Ò-FxC'ZRaqaB%71ͪMN͎ *r$A4lX3 qIx Ulmi[ `K tr wq9cTh8=A[sյ=qoQ--sGE5S} P^K !f|"i z}+P AI˘$xڶdXIENDB`u1f6a8.png000066400000000000000000000016401326020644600321060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dWIDATHmh[e}ҤZvEjV %M$U- X|((V(Dҭ^D2p:gՙۖM kɽҤYro_@ϧ{^pĎPݨ8lTk"N94G_nLu[1?ZoMc`pY#ܻG(mDI]D~R=(6B;m{OHEջc%raeѝuęaآ(zz%!3͝mmk2_| D"R"ȍِf D>>5F_O?txlvw;{>LCwz+ifr罍LM~ke6kq Qtxmˆb >Z/([2ئl}`'?t @TrٯF$4rSϒ׭ fkYlh˘ pDLz%l)Ш*3g|5_lUɹGl#=MR˪$ne]H/)҉_tRߜ Sv &.@1?bY =Ѹ (u_q>nX"9ߍS R6腜ާJ]n4\ڶ 8$5&ܲlEaÃ[l75!Bi&`rUT2(UԲbAvBGU9q޸~ _V?0:zj˦~+N`KTsk7ZۭdZ xcYҿ|屇kxc메,߃w-Z0MlbbMD l@L̥3k$0^~$]~ IENDB`u1f6a9.png000066400000000000000000000006411326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dXIDATH퓿/abo$*v1 &ُڡMH,$& D`jbZ i3HѪҭx.w 3 k[뮳`軼r(Rh#ўF3[61C^U؃̄1zd6-]f"뙉? J BD#sRhhi~Nv}_G0RB)r#A%#*lzqN^UE` ʶ'. iY~_:.٢WБpDkH|hmkqIT 'C.H'*@U& jO\6u3mʼIENDB`u1f6aa.png000066400000000000000000000004701326020644600321570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHcdZcf3008aU/Y.ȂC$\& 8j& 8Z𞕏է_ 8σx-`````feaе6)/s"^L,Z0,Lbcdb`ɷ?BJ%!+󏡨DDm,`bq?;_,Dp2gtW7`Ԃ`|#}R 5s/%IENDB`u1f6ab.png000066400000000000000000000021111326020644600321520ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoLu{?w;817Ŭf Akm9I[ͬe2(QO#kS Xjpc63@B 8w >ϓW`vUD@0\.5T[ T^DE ` 򎟃;j<"?k^GچM#9ӿum-A1 zﯵ, :>@׸}=Q`x Fo piG@Ϊ@زg*Ufd.ӝҊ;O.ֺv$b=RBr>t%wΜ ]1 mpڋܾc'0 f !H8i`eyaeXF,J͘գMGiM>ItӀVJ%J6ox32A;;I/bCIvO{KGC U+{kRf>N__]I"]{`DH۰qÁogUC"%%MI[>;@R.eys?%h('Ԓ?o~!:P0'.-<@>F"ݹQ0s}<C}Ă=a Dm{9 dͺH5\':&4CĜ%TJ\a`>։rl"O[aNxSm@ Ĺ_Fmu%noU{C[e%&~ ]es!T/ N#yqf+: vh5;#-w^I@i]?|Z|ڲHIG7s J{zs,ll+ul fnD͡پx!)xi~EWRZs凾sf6Tu=ɱIk4Zy%t"b컿FvIENDB`u1f6ac.png000066400000000000000000000012411326020644600321560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dXIDATHOHTQ}/2IZhnZI."P"H)HmhAQӦ!"pQ"u,"e%A`Rˤ"f2 }k8oY{9sygHRK"AfDHbqGs3dƑX,f4D]aa,Nw97 (܀o^+bgMra)|"r3p;+n\= $Ua=VBy;~h|>ôkB,_xXCr!^ 'Ku4ܶ7Ľ:f`22:{% .iКH5Mm6U4,єц;T>2nK]ܤJ Tbp1ߪ\46ȅ޾˂[ΎH&C4ץ*'"]}6^̵p+^x+^J\<`ٜw3˦,)LK,m| ǹ6>#QۛڷT2(LONd^V=QfmI1_h%$ܼI]I۽oIŘhX4 -9.rRPQ9[Rd^/'N]Hџg?V:.,,gÇqFaP[[Kuuj~T;f̭|!B̞Co a򐏑MAu$vIOO8!_0~6Ǔjpő @{v A:(++hjC 9d1z@f;=Gf\3F+)cpzO83x#Qq W/Y)MI&#&FWaeQDyowi<0b & xPR34U7[kķkнN:YO^'dF5ݘYwKuQ}G=\IJ*iV!1#p̺]/nnr( \\GS ͍_kƙꏌV͗B@HyEKrQ9x<{ 5yOjҶIzXBpHW'/w>)F43*)r*\%+d2E@D8{|T"3IENDB`u1f6ae.png000066400000000000000000000013531326020644600321640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHIhA8!("(x<Q'Q<<% "=0,3Y2I{fz)YMz߫^}҃J$5.)+,H@(uW gly.Joc Oo< EIjO@pB"R+@A|$& ^3d+[_PJƱt):)*@ MBd P/;K;IENDB`u1f6af.png000066400000000000000000000026471326020644600321740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d^IDATHkpT{{6AiVbR8AHuBSVu`:Vl녩gt:N[ RVQ315\Q !!M\6d9o?tyo\#έ]$A2}) *TGe%TrjJ`{yiC>rB^ rZ6o5hX!xSWDT gC J.~ƻX ҅o_૆!PP9xzoNO-TO tU rxl^Ѧw.@1.m<<]҂ݵ$Pr{#9B7X6/_/+gm_1/|KHK a ±JM~[J%&[yu(Uw.>o024p9 Xd?{+{Ov/shA/nP#\/skMK(X_}?2bO8DbPwٿKضf!nOc(G{1IWM cQY13rTmx1c#|/'e- $[ݳ n"s7qgdmŝSZ.)orMYYc;l~= s4F߶b2T2)Q_nbl?MtJ纭ey{-tD ^֚zL&X( Kb~<6R\AKH81GcdmO (iGd&~%X4ZU_r\{‡Kp'/[eIw&wBՉ03Cq~|ϯ)r.]^obqj%"Xf%kZNFu! mH9làWű$3b_[i^)5`m>gM mD v䚅|-{fO_>\}C-3䥭pgWaۅao<< 'yx*M@㼭- $2QtϪ[>;SWg[aGgtR9%nv~t /=vH %E!yY}yTͬ5zs8Tΰz4rV'GQƻ-AH =74{ޕK˻=}'u'uETX1TZ.|kׯg+l ]VvJ{Ƥ},)mRc}W?ܶ:/IENDB`u1f6b0.png000066400000000000000000000014411326020644600320760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHILSQ J *RƂ# c+h8 uV7F7!)1&uC *j ii-C B}shx D,&P(%ZbR1qJ:,bv~XSDшP+ؘ‹S;Ƹǽ\{Θwku=DRncvh4@BML9^ӈ(lbQ-L$3!Ҝ*9,@lhRڤ)H>ehHWr WGR΂=ql= fU6S+Wt QB ب`aA1//, `wQl"_Ԅ9UMFLN*{'/ ]_ǽlaTr w7QOD*3QGMF2Zzm tjkg182JrBd"HR)豹ϧYMޞ|Yj4RhlXHDI /t|sEkv/ eu%skF$bO(kܹ?c^^. 01pIN]| 0gЌVY 9YhVr B$b,iu _r:q<-64rjO |80dc$b[IENDB`u1f6b1.png000066400000000000000000000027351326020644600321060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmpTܻ{ݼ&d`ki%@e1m'EmdgZSg댭AoCy ә1"/SHH.!dɾ{!dK?<-wZhԌ횢*O^!P*/F=UDtۋ*P[B)L!uuɁ+нu]v˲;9(cTcYHc4 Mˎ>rS/\-Pw]V7F p[jC'X P_ kذPETi{adQKlr8NT~~>xG@Fӌ1sMʴa\h73`-/gq,Ɍ](9c]d+^hא-3m8콓}6$#z>h/(qix}ֺD7x i)]( ]gDpRQ(aQsVm+ଣ1ZZIKaNs7O؛gL |}urVݹk,%Dn>?v9_pMy1osG7_YX ru3,Ce=:%6ozݰvÓo^ |rr.CSgONQ"GO1d56>(3Fh.j9Ofy6N]"DC EJ)SqO]ϻy}Fយ*ds~Pjh-{6(٩[.YP`& "ҘLJ=h`SJWqjfxexd\BIENDB`u1f6b2.png000066400000000000000000000016551326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|ddIDATH_Lu?}PC%έhfzP.M Y^䨕gݔՅ[uQӡ@+nM:v`i"G}ȸИKy>ZԢdFяz0Ny>}>Q+ܻx|\;;䌈H0FWcժk*?ȕkJ tLB@\ݯ/\olPdf4[fS#|/k -: ] rUP(sXqVE|@6!pI=~$@D~0ƴvj}sŖ?rz{` -V˖ueR tGUu}< nV 闁@ߨF3_!6xp~I`vbZ%"'Wh"uU7d^ hOlW0AGDEy`U,Cmlu kYV===l7d)Up[(]%Jǵ&~|YA uȳ\-"ׇ-'관4^i:. 9a8T9.Jt]3x{yc&4xF%b=cDxyQAЦEdKG|~9%`Vd_~Dat@3䏊Z_dvGUj6e%D ;2]M7Q<ԏZHWOc?_KEIzts@h/EqK})ǥ,CT}@Pt0|2vHJZ\GvrIENDB`u1f6b4.png000066400000000000000000000024571326020644600321120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH{PTuǿwey2 ,#:Y4eZ>p&‚%v Q33 j(>)G]?|#MI/P|\y@]f3s% I0%P(pCOH^nW+{%y p :Td##qG3#[=u6lA@c`|ٮ(4&Lľw<΁qچyK8-74O^jħ |6e=rr|C BY-?[FTo{< $<(Lg/|(wTf{] An_Wfqd˙Qzy@aG#WI@yPZz.`$70:,n>,Vau,}}J]-mƁES+W`qIhrciPHm&K//2.Z:IazmtPO_2`6 NvD\t~criď[3FCԙ{om 8)N@8N/,[ }$ԺSʉΤ\o'f֍D燅G`٢ECD5}=amP ڴgl/K"NIh yH9o*3eVI;vxu"`P^]G61 ' ㎶ۯ]fu]j?v8鵹EYuCvRwfKLx'rN3$wMmI)sM&Sb23D.((5(B8oX\.W_^<)?1P[흕}yz[czSE;,>9,pY,,fEƇ̼rmS XǪWRk7= G0o11?HN=@[ôAĪѷBh !DޣEgfe?) ⽃sgSv~3T@3gѹC kTUpTޛ?6>nTUUu@D\UM6jUfzf~rlyQUkMJnjJXHD=iAAA3 >&0Jӹ!BU"ZfM.©.3'hBlu8ua'3b"v\cX IENDB`u1f6b4_1f3fb.png000066400000000000000000000024531326020644600330670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHLu{qԔob!!3 E2(nFDž%Jꖘ',@l#ee8H`Sk`i9iGsS n EpruIŮ\h;&'\+`쇙l417UHK @{+CMC.;v&Z4\|=(M?4Z19ȳ۴U `fbFDʹ2]˺gƊm =!V{ADL[};Sv#rΥhiݩ 7_aX,=&,l<<ܿܚA'_Lʒ 5 ļ@7KfceˬD3##c@t35/ lZD"3 Dܚ^Z '9slyaaށt}40P6!}ҡ yWU%/7k@\.MYD{U]?ebA0aף#a6fMH˞doSAf!Iѫ7=OQz"*5Mf9qƝ88MpC瘲F!niyMDTjFdee=<<}Q \k쨬𯗈s K6?/sj!T/;;>b#Vir $"r׉ 6S5ꢍt㚤-M[B؅nϞQnn(5Jׯ_I|lXz~R;ޣEpX64<@1<\bDtr㪪8w,cn h"T\\b"Z5>Ow:rtt*f~R+y56 |锢0rz}Om0@4--,,\~LU<"81:@NNTf^̣ !z<{v'1B"̍y5UʞIENDB`u1f6b4_1f3fb_200d_2640.png000066400000000000000000000024351326020644600342670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmPTUϹ]Xd]Ŭ\%Lt2Ǚ'Bm^>X33*-4,L73&1-3&ARmYpw}.Ϸss!N #t0z%u1;.N=&f8b#bxXݒqp_cۍ] &!F^ ?-^="(SUdLn\#ӹڷaqMNq l=e- ܣ0%a<>4kkki O- 1ZCᔧF>0?,CuVI]]~httD_ \1'DR׼G~H`ZY{nyFjx0JtۖntG 7Z$oaP^Yc)x1&iv.2i1Od>#Dp[I zM $KG,}df:Y`x-ڱkWn4=@:өQi\AM}՟=qm--˫(D"4ѪCR|@p>{<#QDB2CsTx1G2I8hl%*IʄdȪy٦RVT9E:7OJ"kQ3PFDU*/ErPM:#@s0l9ںۿ{9)/d~JKuGOII^e6MB ]TT4&@y.A4!CГ:O;3Oh$v\>oz]b.IENDB`u1f6b4_1f3fb_200d_2642.png000066400000000000000000000024531326020644600342710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHLu{qԔob!!3 E2(nFDž%Jꖘ',@l#ee8H`Sk`i9iGsS n EpruIŮ\h;&'\+`쇙l417UHK @{+CMC.;v&Z4\|=(M?4Z19ȳ۴U `fbFDʹ2]˺gƊm =!V{ADL[};Sv#rΥhiݩ 7_aX,=&,l<<ܿܚA'_Lʒ 5 ļ@7KfceˬD3##c@t35/ lZD"3 Dܚ^Z '9slyaaށt}40P6!}ҡ yWU%/7k@\.MYD{U]?ebA0aף#a6fMH˞doSAf!Iѫ7=OQz"*5Mf9qƝ88MpC瘲F!niyMDTjFdee=<<}Q \k쨬𯗈s K6?/sj!T/;;>b#Vir $"r׉ 6S5ꢍt㚤-M[B؅nϞQnn(5Jׯ_I|lXz~R;ޣEpX64<@1<\bDtr㪪8w,cn h"T\\b"Z5>Ow:rtt*f~R+y56 |锢0rz}Om0@4--,,\~LU<"81:@NNTf^̣ !z<{v'1B"̍y5UʞIENDB`u1f6b4_1f3fc.png000066400000000000000000000024601326020644600330660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHLu{=_y&-39ljG$]m|rJC][MI]ؚ̦%tj%d/DED8i.||gχ0HRQ|I[piڧ ">V 5B𓦧V\*@_A}`tIKƠ]G BZ!Z }_&bw¸wςqF od@@@<1#< | /?~2,V.?n322` a<1s7<3AyF[9YUeΌK@D!OmrcۃSBLOR*~)wð 4浟vw?4mtiJaqS Q:>m)cb A[4Ӻ:f \Ǥ+c{N, EO_( /n[?+`sy[T{=F?`:2X =uj9 ,E/Rbk'/e*ney6ŝyGulX&ޫS `ETF]k i{%V"IQӯ9ñd25Qn4nWv|p&&^5d40Z9x=>]h mDTz(Og(pS*3׌BZ AxĘB[UK&ŶT$\999oY4UUk|r zsN.!}U-aj zC;?=l鬶Zi3sn1LcUU@ҩڿXIZy 3NAN JyoT 0lj% "V%6 !,bH5mF9$:=n|9CM` @wZ'ufj_KQ-1<":{hiEQ2\>}Ñ@_󉨾DEw].f䈈:'d@D{Ev\>&rӜBfLAD7 @(ODkt `,̼IUS]fAtV1hfnKU3a!'IENDB`u1f6b4_1f3fc_200d_2640.png000066400000000000000000000024451326020644600342710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHLu{8<8i mM\έf(j7[kV9KdJ Ls͚ ӚL+fa_!xpw}Py|> vBt!B*&`F A֓ʉ Z"ڦkyO4Sߚtݠs`͡Lw; 6Iץca? iG3Үhdw|_,qmׄќIצ=^cNhaHo./*?4[5QɦkQj^_:(^QgIZcHIиi+oﭻr<Z4%7`Ǥ [ݎi_=0AkFR[׌IgC Hq|GwI@y >"$2a F6'F {ap:qF "JгD@1/8"oƃ G39KTv{4g(3&GDU$!S\P PAEe,0ZK"23t]ɲիp'Ϛ 1 6_ʺۙ@x?^9ybbRԩ,B~JIIxM/E+h43_<]IENDB`u1f6b4_1f3fc_200d_2642.png000066400000000000000000000024601326020644600342700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHLu{=_y&-39ljG$]m|rJC][MI]ؚ̦%tj%d/DED8i.||gχ0HRQ|I[piڧ ">V 5B𓦧V\*@_A}`tIKƠ]G BZ!Z }_&bw¸wςqF od@@@<1#< | /?~2,V.?n322` a<1s7<3AyF[9YUeΌK@D!OmrcۃSBLOR*~)wð 4浟vw?4mtiJaqS Q:>m)cb A[4Ӻ:f \Ǥ+c{N, EO_( /n[?+`sy[T{=F?`:2X =uj9 ,E/Rbk'/e*ney6ŝyGulX&ޫS `ETF]k i{%V"IQӯ9ñd25Qn4nWv|p&&^5d40Z9x=>]h mDTz(Og(pS*3׌BZ AxĘB[UK&ŶT$\999oY4UUk|r zsN.!}U-aj zC;?=l鬶Zi3sn1LcUU@ҩڿXIZy 3NAN JyoT 0lj% "V%6 !,bH5mF9$:=n|9CM` @wZ'ufj_KQ-1<":{hiEQ2\>}Ñ@_󉨾DEw].f䈈:'d@D{Ev\>&rӜBfLAD7 @(ODkt `,̼IUS]fAtV1hfnKU3a!'IENDB`u1f6b4_1f3fd.png000066400000000000000000000024521326020644600330700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH}LUuǿ{^| k &m@Iw5΁aPת>ʼpZn2i9\f* !  .ܷ´u}><10M_2a}zU>/y# 蠀`B_q"ԡ `nI1haTvbq!GeoؒFcf4g8 #9YGrD(Jy&ō;8iY0~n¯}'.vsAsš|44ؚ #u;|@ֆO,`#/.֘Y[_ČMQb]яފ%@& dKE&˛OC֘?X 6)"z|:b !;Q*un,o>vXZWd=*AHA0 w*H\,W[,)l2dee ŽhrEm_#t_{܄S-^5rNӛ4|}aap2Y }8dӴZk>r)~Nnee"ƍAٰRgO'|Q& `_P©әy,3Htpx;4m(DTF9yOOkǟ2̭P%[z^g2TFUUdgg43O\F:_55U_ ik%hȡj^ZR1 BȕҠ@ Y՚t: O^w֔<^Jz}!ָՇ2Vv85V5 @53oQt3{N H,u2;gM6ȫ4Cu D+(kT˟aV73aXU<"La&I@Bm3*#M}?PDW;Ry#qn`I.=|>PPPСiZ3/P u߾K̼.XVj&KYj@F]ŝ m\jr6M/Q8Γ!Qnwl6b|` wMsrrv0*\ nERU56p xO3N@nntf~GBq85iTf^NDq `<=pξ 0IENDB`u1f6b4_1f3fd_200d_2640.png000066400000000000000000000024421326020644600342670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkPey&$E6derDGSh)gA hG}rF2@iAǥh#5:CqiDfj,=}@]η9y_B`+!WQEhU{6dl"V0[œ GKDtTpu>f,ý/ ]KRWtj:}A"ߜjn@DC?b%j6qZ[߾d':'+1G?Yw^j^`2LJHdP=HQgykv}y}͓渑i3Ohh=Qg0EEGgDb42o ٦Ѐ޷`cU'fg~+0ca HM# Wa1~`)@E67H}_$fН6w}9ظ&h6Bb$)I. W3EM9 o. d@zoDAIpHs4LFlB*..~  f8FZ"И.& =a͓!xʕ cܢHDˌ"0sߐn6:R(7`c1Z^yxنv{^#KDQGqA,^~ԹTt3"`<ؘ̙!IR( C UK[H3N}prg{$PX1s DTiZ, 3?5kNn>@ pZK^ߧkΜjK Sr6p_N>jO6md2 !&'"OiiabsnAs <{t6uEjASpo]TM-r.ddd7n'a7#9AOQ=VUSQ_h܊x~||?={y&EdY>s8l6?7fԅ 7—HmiZuuB; |hZ C*≲e$qEQN,˳eYysJQc-ɲ(kJDۘy,|>6ǣꓒ0"}KJDeYyLf旉h3v e1 EmIENDB`u1f6b4_1f3fd_200d_2642.png000066400000000000000000000024521326020644600342720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH}LUuǿ{^| k &m@Iw5΁aPת>ʼpZn2i9\f* !  .ܷ´u}><10M_2a}zU>/y# 蠀`B_q"ԡ `nI1haTvbq!GeoؒFcf4g8 #9YGrD(Jy&ō;8iY0~n¯}'.vsAsš|44ؚ #u;|@ֆO,`#/.֘Y[_ČMQb]яފ%@& dKE&˛OC֘?X 6)"z|:b !;Q*un,o>vXZWd=*AHA0 w*H\,W[,)l2dee ŽhrEm_#t_{܄S-^5rNӛ4|}aap2Y }8dӴZk>r)~Nnee"ƍAٰRgO'|Q& `_P©әy,3Htpx;4m(DTF9yOOkǟ2̭P%[z^g2TFUUdgg43O\F:_55U_ ik%hȡj^ZR1 BȕҠ@ Y՚t: O^w֔<^Jz}!ָՇ2Vv85V5 @53oQt3{N H,u2;gM6ȫ4Cu D+(kT˟aV73aXU<"La&I@Bm3*#M}?PDW;Ry#qn`I.=|>PPPСiZ3/P u߾K̼.XVj&KYj@F]ŝ m\jr6M/Q8Γ!Qnwl6b|` wMsrrv0*\ nERU56p xO3N@nntf~GBq85iTf^NDq `<=pξ 0IENDB`u1f6b4_1f3fe.png000066400000000000000000000024601326020644600330700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH{PTe9gAvU,F@aHc%qʦE)Ԛ1S'1q$5;]F'5/.HȮ!ծysa0x"$QIB+ O 94Ay mE]_BE't@|, ]EIxgB[hq@g!G[^^4>1O0o1=ӣXjB*s8|?oǞ=# +3.fפ)r@?6 YT!u# |T&c4i=  ޒeMo?`N@ԭc߁c?Nd|SCvEQ kDTz)eޒOW%T^Ḽp'__̼v"*4,˙3944j=-3x׀g^0s!chq'rt۰D,A8IDz pbdz/K ^ZS˿Naxm[QB` wfvXFs kP^kX20: e02[nYS~Pe-YӻQlN]ѦL ~r$,DE`4%$?{HcבN[4k:EqYI;\eJ~JҒ̳ղ,gX3]QDBIII!~m4mQZZڡ"E,\#hZ%ټQZyeUp8|VU4L+, Op DxB,˅D@<̛UU]?2P =(Xf^DD nUUOh^IENDB`u1f6b4_1f3fe_200d_2640.png000066400000000000000000000024221326020644600342660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTUp CG[)tI V1 JAΙ&jHzC@ 3=QB,ˆ@1i@R vY>@L˿ޛ ؎ @$lU&ʽ`avpNQSK$'npYt>ywmnEL8HĀxmjgp~/%x92vC+AnH.ui3;O Jj& ?%%9 a"Tau0+eJ4fB#Tޟ~±/e{, wlSD;flo>6RWu[nd7 )e g՚I&263(utaEkpjY踱T+B& !K p4cL3^ h ./Z6`NXxq]ll e|䳙Dt<= a_z"3Zb=M",D:@4H%}:ftutl|bBi5Gآ =8j4INъw|.+E""ʊEˉcy.>֥;2b1Df(IRˁfs'JSHSǏp\[@jO}0 q}$‘HTN"5 SQ֮][`S·B׮>gƷYEgJ2'7.Kãy9-KbF"EBMdggk,bҏpx1'Np2dsEd\{^F{tC/g8~`m.p7p\)yWeee1zF޽:=mj_CT`/GL]3;ϤE` af1{1O0o1=ӣXjB*s8|?oǞ=# +3.fפ)r@?6 YT!u# |T&c4i=  ޒeMo?`N@ԭc߁c?Nd|SCvEQ kDTz)eޒOW%T^Ḽp'__̼v"*4,˙3944j=-3x׀g^0s!chq'rt۰D,A8IDz pbdz/K ^ZS˿Naxm[QB` wfvXFs kP^kX20: e02[nYS~Pe-YӻQlN]ѦL ~r$,DE`4%$?{HcבN[4k:EqYI;\eJ~JҒ̳ղ,gX3]QDBIII!~m4mQZZڡ"E,\#hZ%ټQZyeUp8|VU4L+, Op DxB,˅D@<̛UU]?2P =(Xf^DD nUUOh^IENDB`u1f6b4_1f3ff.png000066400000000000000000000024611326020644600330720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH}LUuǿ9Õ\ES/!BJMP9kf5Եjfr:NRkޥf,'o.\9O(^><#D(~uo`N#}TQ uQ. Si.W [>648 C(bg0=;B!w~ Ž ν)ĸmhy3zŞ^m?#XLD=Ccf:;c/&ؽ؂?EtxӲ&c &mHXp\ZgZ;ش+[T\tERV]0c]H@7ӣ:e dzRƂ8㙗0N-rV9A9ڻ-,"3`ZLdԐMLv4W6uQH%}-SRi].3[Ҵʮ%lADrssEDS/T G U?ϖ<]Y0"<ؚ҃8a_2Y z,t)ieAe5iZLCB2QEGp8M&";yUh&r࿔61/VV:;L)(Nw,$UFє잲ǝ lMfjG"֔o8drf06Ѫ7fK1evƾ{pQNfeau@#Z.f~GUmxOֱrZ~EQ(jx?)dӸށ1gI<@[ bYh b }8ax{ @:nxe8n`Q .}]Q<@9?փ,gp,{$ʊ÷QDtDKdY.v].fMVu=3?ODjU_h,˟bbLL~s4??3p@Dt”,D@ &x7@AAA*3̣4 tֆ(̜CDc.UUO,IENDB`u1f6b4_1f3ff_200d_2640.png000066400000000000000000000024311326020644600342670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoLSWƟRZ[PP3##Elq.:鼷 dn&?N_b N;ȲK6S- HZ`A(e99>9NX֑HhӐ5*l (vL/k: $id, aλdee`bM&qdB-4udeOXeAJxXW_ FAһ 'A\K2xOJm̖(2#%aV6ry)'0F h?b^]5G{PIe4@Ipx)Ђ0/ZkREkZGK` ]89d9_袕06@Ϙ _HDmڅtZ“]MFC yEui n:P @U:]|ŞeL)W2vfT8Nh\DDjte"@cp7W,h}h̽^ee屖|f`+${(d2Q$I{dm8uꃋ[+\sP1Fjp$ՀK|^"u]{ׯ_f~@[8^jo͌s bc>t3SSӌb6yr!8p8J|>_( !}?<<OpƔYЫIz`U4tԖ3œ^o(3ot:-yQoq}uuM<[H:mő. isg;>f&ǣ2 nwZF$3Do$욨7=Ǚ nw~ˋ"qc2eWEQN,˅,n9(qdYFQ;הv0,o B;~VVVfLIIEDT>)y;}'P(Gʤw "7h0@ m#dYDD',㙹}7vy%3OBxަX#(J3!) k8W0^IENDB`u1f6b4_1f3ff_200d_2642.png000066400000000000000000000024611326020644600342740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH}LUuǿ9Õ\ES/!BJMP9kf5Եjfr:NRkޥf,'o.\9O(^><#D(~uo`N#}TQ uQ. Si.W [>648 C(bg0=;B!w~ Ž ν)ĸmhy3zŞ^m?#XLD=Ccf:;c/&ؽ؂?EtxӲ&c &mHXp\ZgZ;ش+[T\tERV]0c]H@7ӣ:e dzRƂ8㙗0N-rV9A9ڻ-,"3`ZLdԐMLv4W6uQH%}-SRi].3[Ҵʮ%lADrssEDS/T G U?ϖ<]Y0"<ؚ҃8a_2Y z,t)ieAe5iZLCB2QEGp8M&";yUh&r࿔61/VV:;L)(Nw,$UFє잲ǝ lMfjG"֔o8drf06Ѫ7fK1evƾ{pQNfeau@#Z.f~GUmxOֱrZ~EQ(jx?)dӸށ1gI<@[ bYh b }8ax{ @:nxe8n`Q .}]Q<@9?փ,gp,{$ʊ÷QDtDKdY.v].fMVu=3?ODjU_h,˟bbLL~s4??3p@Dt”,D@ &x7@AAA*3̣4 tֆ(̜CDc.UUO,IENDB`u1f6b4_200d_2640.png000066400000000000000000000024461326020644600333100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHTmPTU~swp@kBC%DI,vlFʏWMK;R`YIӄYJć!⺬w}(B=s}!c8$<@Mw N@>Tf;ذqH?\"f,oCv!Gՙ'BH,p!dű!x,Ҕ3[a?_li$쏄m.>ݪDW J/U$/g`GY+e b'mO46Pp =yvr{]Tu]F]ᵴ͕ H lz@`+ޱ6Ogqkz”oN2wAkxkSAş x<D0*BX"L,2e~]$xo1U/AP˚ 郢eG||M_-#Ε`쟨p٦ꂁ–-geeׯK:a;[a 0FCMO$˖-ܟ@%ڻ\#dd:ls-9L.i\SCÆwB!sh48fnPKI1ҰFnǘ:HEQQRHp&‚%v Q33 j(>)G]?|#MI/P|\y@]f3s% I0%P(pCOH^nW+{%y p :Td##qG3#[=u6lA@c`|ٮ(4&Lľw<΁qچyK8-74O^jħ |6e=rr|C BY-?[FTo{< $<(Lg/|(wTf{] An_Wfqd˙Qzy@aG#WI@yPZz.`$70:,n>,Vau,}}J]-mƁES+W`qIhrciPHm&K//2.Z:IazmtPO_2`6 NvD\t~criď[3FCԙ{om 8)N@8N/,[ }$ԺSʉΤ\o'f֍D燅G`٢ECD5}=amP ڴgl/K"NIh yH9o*3eVI;vxu"`P^]G61 ' ㎶ۯ]fu]j?v8鵹EYuCvRwfKLx'rN3$wMmI)sM&Sb23D.((5(B8oX\.W_^<)?1P[흕}yz[czSE;,>9,pY,,fEƇ̼rmS XǪWRk7= G0o11?HN=@[ôAĪѷBh !DޣEgfe?) ⽃sgSv~3T@3gѹC kTUpTޛ?6>nTUUu@D\UM6jUfzf~rlyQUkMJnjJXHD=iAAA3 >&0Jӹ!BU"ZfM.©.3'hBlu8ua'3b"v\cX IENDB`u1f6b5.png000066400000000000000000000026231326020644600321060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dJIDATH[lE_1M ײ[U >>*@bB@@PD>Aw)R- MS҄mj'n:qb;!J9ߜ3s``%v G8[L,#H;Pzx 0ڜs Nt+`.1,r:iG+toC|6fʹҨBt$/\Œ]=AÍ[q p!;>5\n k KTk/N-\˾\b,"?B誛+ 0ʮ+fio5RӤct"͉zvN%ZH4"VUZ,` V2_$Ae.A[s/L7|5J)@]ue31{`TB}R㓬_tm3/L&;? 0],ae6ƣbŒ 5rͦU zϥ#ʊк5 K!͵!N\ 唨xM 閙23ŽlHC֏]vPڥk#<ӓT#J'3-ZIENDB`u1f6b5_1f3fb.png000066400000000000000000000026251326020644600330710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dLIDATH[l\Gs朳Mıe׍&iHQD 7.}KӴ4 .O*/T*DTH>ЖR))"7%g8^{kgiS7| 6mڴ䰧`P?_1O y'.*4f5ßVZosI[%37>-9fȵB*m]Gν&ڇ!(}KʵE˯M@]#wvON=cF|< иxEmϴC˸׵`@Uxln}G\YԊ1$\U Ïx+./.>&_<+1!Sw~ bS^!;&x/ xX18?۷;qB{7<~6˓N}{ez&d#]\`ױ[8}Xp@)L) Z!4vaN^o.61γ=[RXg&/SZ’C/jGxa~g. Rx?eIu}83bs/^W消&&K'd*<imlH˲o% i=BWU.%W} ^mK|"9.|1 p!Fs87AK>@B*mb`f>xfJuQFsCTh!kLuGZYbsX򉞝嗕[.\斦7ry^"۸֘dZ 5riF@$ͻ'x0_r.T^g/ϝ4'k?XD,=G ճ[wA( 4[D=G4ZiT/9'D\f朹&fpT-(hAA5PڤB1(Tj[[cR>Kb( !dfrrf}}e-NgrQ{Z.lbѯUn63Tw Lc "3%7:lZ8q| B#7rFVm4,J ogq`!1&yGߛOT"̛xzv,s_-Znf/sc}`q9Jd`BF[>\?{8X˦c&} + rwm?]|?ކMzL}޾"Eid`$sϲ/Zᭁ;;ztO|-y y9sFă'Hߣ:̗8qª]EK XŔc@ss嫟{|/0I^~u ccGb4QDJg03$ ჸ/pm.^~&$ 80B^\)77^Җ)>lgÅĉތ@pQw8[0IR!RJ1<͵nO{ԨcDHc+> ?``2Gp5'њjۧ\obVV)/WzANhTߡ\oRmhcn!XՖr8XiN>[ǚ m" :A@og%QӜziж, RȦoO̓@G!h͙/%=\GҐGr<ͩSK|jvv˕U.,Ė1r^Vjd\(iA30]Qٹytء9ͅf :!ZFntEhx)$!Qe75ЖR))"7%g8^{kgiS7| 6mڴ䰧`P?_1O y'.*4f5ßVZosI[%37>-9fȵB*m]Gν&ڇ!(}KʵE˯M@]#wvON=cF|< иxEmϴC˸׵`@Uxln}G\YԊ1$\U Ïx+./.>&_<+1!Sw~ bS^!;&x/ xX18?۷;qB{7<~6˓N}{ez&d#]\`ױ[8}Xp@)L) Z!4vaN^o.61γ=[RXg&/SZ’C/jGxa~g. Rx?eIu}83bs/^W消&&K'd*<imlH˲o% i=BWU.%W} ^mK|"9.|1 p!Fs87AK>@B*mb`f>xfJuQFsCTh!kLuGZYbsX򉞝嗕[.\斦7ry^"۸֘dZ 5riF@$ͻ'x0_r.T^g/ϝ4'k?XD,=G ճ[wA( 4[D=G4ZiT/9'DsV>[V-x|dQ=G4^aNP1qtb^lj:GuWEww{=)_:iw$ ,w%|la1^Mܧ.EwJB'H!+Zv)BiqzCQ`0\5> 7SU0~.P,'XD)k5i._Mq5D<'+,U}ZYW^5UGO׳uzē ֪DKq{8Λ lzl޳kv KV8>vJC,0ɧA߶He3MW=FSLp|,wK.O:ɛ6`oL,B瑟eX_ ]g]ch> RHTڶPE (7<4ه֦F{AA냠X X( h* B[K( 4Q VTDLg23gf|q&kkKc%#/b;ZjXFȮo%7:s2SkPT|Ҙc/ޑ:j^'F\w$+tZvǗ&_K9|ù$6q~_N_{7lvf1w\#пRZO=̼#B><$f1}$# +7.O%&o}O4Q/u(2ʬİ ܎ /Oz*P kU;xĽ&j͡e L2nEs?s'\2G3G<^}7e A?램Fʻzp9׍&5yS֤RtD٥`벯;L'1gWw箍:[ڜ~7 G3mR (J~Mf~1^!2MH k?hl)RȦ/4gH; ԹϹ%%]`Zc#N\۷.̮lʷFsO[mI쬌N٘ =vV`&gϡS<3Uh%r[!m׶Y!];Hi8i s-.̵x_(=K91Yc,ec$pa|ٕ:J֘ZJU ZkЊ5 *E)&:.nUSJ(1 )IY&p> @qqRS=n.ub6oZ#eAehZcW (bN sLiyhv_ZAjMm**QDѠn NajunⓄò@dPz &gJZ+*YJ_MBP F1ZE KJN}O+o' -HB^%f: ͭ:IENDB`u1f6b5_1f3fc_200d_2642.png000066400000000000000000000026051326020644600342720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dsV>[V-x|dQ=G4^aNP1qtb^lj:GuWEww{=)_:iw$ ,w%|la1^Mܧ.EwJB'H!+Zv)BiqzCQ`0\5> 7SU0~.P,'XD)k5i._Mq5D<'+,U}ZYW^5UGO׳uzē ֪DKq{8Λ lzl޳kv KV8>vJC,0ɧA߶He3MW=FSLp|,wK.O:ɛ6`oL,B瑟eX_ ]g]ch> RHTڶPE (7<4ه֦F{[~z/iֶ nAdgQib^)V>ĉI7΄_ШV- <sV}u|n{>ϥ7rpjEiӟχ+m}'Oԣo oGI^>ٴҮٺPsq_6͕}BҶٶ 8/#c%ѲqW+Mk2Kڛ o9㣗k_'߮w1?ktZycgq9Eȝ`̙iݰ6 %shM|PnfB " :W~HNs?>ʎ@ ~ X?<{VE]$fXL7uHǵ;<(稯^iΫЉeFCMLYQvֽlo9]Z8Kjju?( $G2tȊ."\8Ȃ C1RSӸ%'?b4M{:!n?s1Of"]ó+/=ז m̦ +,,/P{5U1whS `˧yTȗs{6ZUDAN$ nU`yX=h/ &D3OC" v Õ%3gNܻoGrI ]H_gRjAu8¯ު>6oq]!B)isll*:RJ|YDa{,H4Qyv2o:J)\)1o>KnN4`W^b:wkIyoU៝xpCN:e.Ve/z!Ͽ#R"0<|;܂C~^wۗ?!6GѓZGȶ*.Ԝ?jg8p̚#SQ/sRAϞ86"h"ZVaȎ)h=*IN~B~ȌupZEJ:#1ׅJ??܇?zGx{2#=V!*IUjtK'h#hd`E}y|ĭ"cd]&"cv c𺣴Xiw1n˄SGJavf?@s.4ȔƲ,92{* rw@Nc|ǣYHWQD.밷>N!2h( ӣ 'i5dT`aqaVO1sq|&7Z#Z`t\6f"c \K*Pa0)0ƀь9xq `dAVےcHVN#c=.]]bE397o~@α-9xzZ/`a5puI/W|(Uth-i&ÛS46T$NSڭazIm4UJbǔbRb!w)ْNffpݰ .x$i)điYEFJfl21F㻂IF}N9Ut,IENDB`u1f6b5_1f3fd_200d_2642.png000066400000000000000000000026171326020644600342760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dFIDATH[l\}.3sccw\HڴPU)B(x UH[~z/iֶ nAdgQib^)V>ĉI7΄_ШV- <sV}u|n{>ϥ7rpjEiӟχ+m}'Oԣo oGI^>ٴҮٺPsq_6͕}BҶٶ 8/#c%ѲqW+Mk2Kڛ o9㣗k_'߮w1?ktZycgq9Eȝ`̙iݰ6 %shM|PnfB " :W~HNs?>ʎ@ ~ X?<{VE]$fXL7uHǵ;<(稯^iΫЉeFCMLYQvֽlo9]Z8Kjju?( $G2tȊ."\8Ȃ C1RSӸ%'?b4M{:!n?s1Of"]ó+/=ז m̦ +,,/P{5U1whS `˧yTȗs{6ZUDAN$ nU`yX=h/ &D3OC" v Õ%3gNܻoGrI ]H_gRjAu8¯ު>6oq]!B)isll*:RJ|YDa{,H4Qyv2o:J)\)1={%U[Pj|}ys{eա xͰz9/^LV x`_+ʫw$ RxFC9ٕҚw 9t}L"ޕ*{7<(˰p7sskx 7<葙ޏ^lPP:1‰k__ )f2<-2WnnmIڊԷٷFvMp1zenjP!:V1$xMJcO%ESqbz1#MQSY: %qx@IAG(&p N-yerj9KqE{{&S' /U6Αicy M7>s.7xsTiJqA_r&+$@+R@_}hqq]S F鑥dQx$+Q[VA`Yg3 FIOM˳(51}, xAj-[tM"ż4ċ >N. Lm7R8qD֍%,,U}Ǹ1cT[Ǹ]$p?]r./|eTE?`pkZ lewg"Ђ$_' pM[ e ݃8KfnMMQw0Z)t)30fg ~4KS77n< D)UcM<6ً*| =PJar v\1)<\ ";L f=4Qe3(w9%J)\C7uѩ4V3IRRQyG$Sqh`,Wdi~?)NA)y8Esca35cqb`KfhCMld20ZI)4@K IJAΚTlLɱ1"*xXæuUI!h:e-9 $>@g2dpW OT4~evzhE_+4, ӜIENDB`u1f6b5_1f3fe_200d_2640.png000066400000000000000000000025451326020644600342750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmW>/3$IJ5&Z Zm-j+F(QP!P4 hSR(~1U1 v3lvwޟ?Lv{ι{@HNb^S{ۤTP=)"RD⢊d]KotP/Ĥ| Cgj*ucfot*bylCd; 5#Hx_|&IM DɻgR1?QwB:'֥mm_ ^NQy1</(RDlO=}N+Y=;~l}W(teN˝,KD ~@>}h7H;_L>mFWw#O~ѣGW|^tz?<}~d^{pE*j|t kRL+1KM~ۼ,wCD/3cL'gWw# #c 0~39{$ձq^wf6!A4@,)Ҋ/^VsV3%lFKO쳀wepǶ"A$ FhtrP;b(^|>r=8JyHH ViO3Wp5'1ZgBa},_/ v@hQkU]Z&N e1 'NdxHz] \. 'Ç:a+ gL 1/` SHћwöӜ8oӻ.(fny3K|v89/Օ:ٔBege׶9{nvQ .fh5$D+ɍoA.밳2F62\wC'ZoJgXZ3rd YsL0rq4$H#-0"G* 1*:~$h4seZ#"#֤ؖZgdpp"kĵO6b8eOzQ,)gԵ[rllKߠ2g3ZW ίh*Cyr^wZGVjZgKpEE(Qm51C;B/鑄 q r:ar(G֤i5XhņJaiJ)Yi(FLĈqFKB{>bD9m b\Fu;8^)0kIENDB`u1f6b5_1f3fe_200d_2642.png000066400000000000000000000026231326020644600342740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dJIDATHkL\s0F([ijZoF6~1__|hnkĘzxh[ұ0ûfp朳0Bm{/f{_BZfb &[~2pTjx V۴П_(V=W@_mԐI;B:u&xܞ@~ҽ EP7qJU["EF6;XqQJ= (o*a>={%U[Pj|}ys{eա xͰz9/^LV x`_+ʫw$ RxFC9ٕҚw 9t}L"ޕ*{7<(˰p7sskx 7<葙ޏ^lPP:1‰k__ )f2<-2WnnmIڊԷٷFvMp1zenjP!:V1$xMJcO%ESqbz1#MQSY: %qx@IAG(&p N-yerj9KqE{{&S' /U6Αicy M7>s.7xsTiJqA_r&+$@+R@_}hqq]S F鑥dQx$+Q[VA`Yg3 FIOM˳(51}, xAj-[tM"ż4ċ >N. Lm7R8qD֍%,,U}Ǹ1cT[Ǹ]$p?]r./|eTE?`pkZ lewg"Ђ$_' pM[ e ݃8KfnMMQw0Z)t)30fg ~4KS77n< D)UcM<6ً*| =PJar v\1)<\ ";L f=4Qe3(w9%J)\C7uѩ4V3IRRQyG$Sqh`,Wdi~?)NA)y8Esca35cqb`KfhCMld20ZI)4@K IJAΚTlLɱ1"*xXæuUI!h:e-9 $>@g2dpW OT4~evzhE_+4, ӜIENDB`u1f6b5_1f3ff.png000066400000000000000000000026351326020644600330760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dTIDATHKl\{xi@CBBB!f*PeQ$e!i)TUKDXI7j"E8+cOc؉{<{Oml*y?|B5dOC}++vɫ&R\mɌ>/ QzW@_n+ AOڏcnw{](B'صkpֲ<.YqwX=oR/(Q⏟x";E>xIQ g޷ 6x a|U{QYsd>OKi[q$`; ke*xECGHxsE?>z?~t?{{*-xRq+i`N!j׎:xXAv=Llm,i ةH3!iY_uz~kmRqu >CAgK##7 ]G)뺜bb:KgK#uT;[IOe9? %IOpkk+j['/H$FV1],9ed1KaF TT) M \d|lG-d-ukb/D  %\D_b)03Ys&am\35>gzbpm=n0eQV@IENDB`u1f6b5_1f3ff_200d_2640.png000066400000000000000000000025601326020644600342730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d'IDATH[]k}>\9sr\̴:4^&P(Bm(bӷ2QJ#hQ{`Pć iږd8Z>L&޾. v8ɔuQ_;G2 h]@G? RmM_k}#o>vIl%-xN"N+qg1& C?|܍Xb'm;CI7 R?40JBC7'>ѿ?N}dAwߑ2!e-a?{Weoq6rѱa-plj=U_l7xh<pĉxϞ?9w̾A}f#']~س5-:~Qpe~z?0oAhܯ0Qz}z8ጱiw殐hss #ڥe,\yJ@iJQl4Zh&W@(5lqc 4\FZEi}]Tm\ب 0bSOkE)b4Z>[=Y*`054@!"hkȥQaJf2.{+3:ʾ{avf+UήnpY'KmaRJCcwy4?wxX1=4,:ّQeX vI+^Rt2d^lz&L2Lyq"$!Vތ2\PZZƔ[k)ĞShA+KaP#EoDnV5DkRӐ;aR2$]I㮂c9a lF_ Ӑ9mj-frߥ?$1HLhڠv-oh/C7 ix&HBLO>q 0]2f"eȚfiEr+0$ B$!%RDKhu' 3b :&p| 6P+IENDB`u1f6b5_1f3ff_200d_2642.png000066400000000000000000000026351326020644600343000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dTIDATHKl\{xi@CBBB!f*PeQ$e!i)TUKDXI7j"E8+cOc؉{<{Oml*y?|B5dOC}++vɫ&R\mɌ>/ QzW@_n+ AOڏcnw{](B'صkpֲ<.YqwX=oR/(Q⏟x";E>xIQ g޷ 6x a|U{QYsd>OKi[q$`; ke*xECGHxsE?>z?~t?{{*-xRq+i`N!j׎:xXAv=Llm,i ةH3!iY_uz~kmRqu >CAgK##7 ]G)뺜bb:KgK#uT;[IOe9? %IOpkk+j['/H$FV1],9ed1KaF TT) M \d|lG-d-ukb/D  %\D_b)03Ys&am\35>gzbpm=n0eQV@IENDB`u1f6b5_200d_2640.png000066400000000000000000000025661326020644600333140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d-IDATH[l\W>̙gl7M#l %RDD  TjJm!EBEUhxiDi$HDsm;3cϜs朳aj;z[{]l"87A'*>4Ο:(`бWdGZtI.sb:)6_?U)}"ksS3>>*@bB@@PD>Aw)R- MS҄mj'n:qb;!J9ߜ3s``%v G8[L,#H;Pzx 0ڜs Nt+`.1,r:iG+toC|6fʹҨBt$/\Œ]=AÍ[q p!;>5\n k KTk/N-\˾\b,"?B誛+ 0ʮ+fio5RӤct"͉zvN%ZH4"VUZ,` V2_$Ae.A[s/L7|5J)@]ue31{`TB}R㓬_tm3/L&;? 0],ae6ƣbŒ 5rͦU zϥ#ʊк5 K!͵!N\ 唨xM 閙23ŽlHC֏]vPڥk#<ӓT#J'3-ZIENDB`u1f6b6.png000066400000000000000000000012521326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|daIDATHKQ?w~rltL BDz,ʭ0%A E,D DMHB6I.L@+s|̌ϙq~iA2ךp=˅lJ'蒻21Q{~|*+eۙ/:X܎i;yыƾ5e#SU d*(d>"@!l4>*p8uU5f W9JIǚ[;KPJt_"Jun_Okm oRQd4Z\?k57{H$bF˪+~԰^uCMρjv9%v[~ל_0}%Sʡ %tڱm)4r-A6wW')Q uIENDB`u1f6b6_1f3fb.png000066400000000000000000000012551326020644600330700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|ddIDATHKTQ73/I*@X ZI --K¢"$A/-FBڴpW$b IQABZLTtќq޼B [Mwuyx Z_]53J&MryU.` dMLMυ3%%ź}m}|f)etO0qf:kϕrL;t$? úVӳǚx)BZyу#2g:yz;QXRjm PGt7 ezb_za`/J!H/` rō^8h3,R EFN*qPqq6qnm(s¤.wo~YN/1S»D6`R#P0<#'3v_P3]H`0j@65JH#ne#P slWM:&RYY53V$0.okMVl^$NN zJށN;UuDKb2cݿ|#-p8JOL]'@hS)%*'@-}]g56:O@na&t_jxTROLru!ׯu9-49@h9"L 87+%b|PB#IENDB`u1f6b6_1f3fb_200d_2642.png000066400000000000000000000012551326020644600342720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|ddIDATHKTQ73/I*@X ZI --K¢"$A/-FBڴpW$b IQABZLTtќq޼B [Mwuyx Z_]53J&MryU.` dMLMυ3%%ź}m}|f)etO0qf:kϕrL;t$? úVӳǚx)BZyу#2g:yz;QXRjm PGt7 ezb_za`/J!H/` rō^8h3,R EFN*qPqq6qnm(s¤.wo~YN/1S»D6`R#P0<#'3v_P3]H`0j@65JH#nec%(V_u[)I:39NH:]`+RtT!5] Rx\T5@/9b˫~dEF!ݑKC;= .Sj]-O\9׀аJx`۶_H',/[;Wʱig̀G}-ηjHBsy?;$?\ذߦRO/ԯ'К7}.IENDB`u1f6b6_1f3fc_200d_2640.png000066400000000000000000000013021326020644600342620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dyIDATHKTQ3q ُM(3M&B- UTX8 JJ B \d F4fޏYD s[]=|>C2A/;e,, p;#͔]㑓5 oAeH"a>'pxG3K @$Lfj~>P[5][)vഫT.{j?)^g@T=7қ+O`9*5u{e$&~5s LاO\ «Gu$ $P"͍E蹪-<.[_jbpeleU >[o|ЁX+oS&tEV2r@G]y&dX|S)i+ )hѡvO5'@b`12-[0Y~i:,}kx6"4|cKg^]j | @h04Zdev<@DW koF]W0(M+6i 'a c˨ڬ8pT"rIENDB`u1f6b6_1f3fc_200d_2642.png000066400000000000000000000012351326020644600342710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dTIDATHOHTAٷv5M4L1\:"!emvY=%4) eD [޾786af~nBgȩ6 / URp 5n!s#MEmђѲZa $EmBMToC M`j9=,w'QTbvVl׉ /ߟT$Bs];X'NjJ!Y@ݘ06Uf0e Ҡ#ZP BY\@5@E8ʫ*.+E@LЪdDT{#&_iZ'8􉶋nVXdg?k_H$A|fA>ec%(V_u[)I:39NH:]`+RtT!5] Rx\T5@/9b˫~dEF!ݑKC;= .Sj]-O\9׀аJx`۶_H',/[;Wʱig̀G}-ηjHBsy?;$?\ذߦRO/ԯ'К7}.IENDB`u1f6b6_1f3fd.png000066400000000000000000000012531326020644600330700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dbIDATHKTqo3cQHQ{C-hS ]f z\"MJBZEZ C{y9BWMw9.t:[4Eu e7><:A{kiy|% ,/-Tf۶=;EqdrS<9@feػ˴VeTN ZC~vgסK7Fl2@It R_٬(\ك*#by.$,CJq=6>Y E@e/q3 [1Mq id >iRjó2 DS1|ʡ`sS@#4P%qDY?}_~ۧR"  uCZG֒> i]U[$kqһ޴D j Rro%QoЅ\ykd2 qtg_Ne<[۶D*[4pYP-S^d3w= c(WW=+ mq7UQqIENDB`u1f6b6_1f3fd_200d_2640.png000066400000000000000000000013111326020644600342630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMHAƚ_%WXt 1!ro%}];Tu)$A+3ɾ,A Dcp}C{@vmN3ox<:A{kiy|% ,/-Tf۶=;EqdrS<9@feػ˴VeTN ZC~vgסK7Fl2@It R_٬(\ك*#by.$,CJq=6>Y E@e/q3 [1Mq id >iRjó2 DS1|ʡ`sS@#4P%qDY?}_~ۧR"  uCZG֒> i]U[$kqһ޴D j Rro%QoЅ\ykd2 qtg_Ne<[۶D*[4pYP-S^d3w= c(WW=+ mq7UQqIENDB`u1f6b6_1f3fe.png000066400000000000000000000012571326020644600330750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dfIDATHKHQ{KQ'IK1MZ$A Hڔ5ئ}㓈zhBj 0$&N73w[h̭:s.g*I'շ$lǑRuq}x*@SIj܊Ni,醢qjݷN`dJ,;Q_͜H\Ud`뇃Wx<ԗ"WQ=5ɾ )D,Ϥ6wjhhQ(- ]{g^G rU2?'F*:%!{b#ຐ+ 0RtKs. M @@N8DdyUj!U"Z2)fފ]ND&4-ϣtʣ/̨2>ࠎ 첆( iȄp?:k̝&M=H== :0:.f +וvfSlƞk`ts32YTDXY31/kR|7e@X3N:!]_Y XI/iS ` o~n ИIENDB`u1f6b6_1f3fe_200d_2642.png000066400000000000000000000012571326020644600342770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dfIDATHKHQ{KQ'IK1MZ$A Hڔ5ئ}㓈zhBj 0$&N73w[h̭:s.g*I'շ$lǑRuq}x*@SIj܊Ni,醢qjݷN`dJ,;Q_͜H\Ud`뇃Wx<ԗ"WQ=5ɾ )D,Ϥ6wjhhQ(- ]{g^G rU2?'F*:%!{b#ຐ+ 0RtKs. M @@N8DdyUj!U"Z2)fފ]ND&4-ϣtʣ/̨2>ࠎ 첆( iȄp?:k̝&M=H=={͡-cm0&jW`2c-].b '=璿η]zЦ3Xv\kߋS_t\)k6m{~yp `IENDB`u1f6b6_1f3ff_200d_2640.png000066400000000000000000000013001326020644600342630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dwIDATHKA[lڪeV&J%a$F:yQJڡZ? ZD-(*0HBIZmw}Ⱦۜ30 +A~M8fC(V[ɹIY2611l%WI;PN\Z\R`o)YmaG}> qAqHnF:{ `M;bi;ك!9> %K~D6*dhU||V,REc )di­R'_,VE@Bcw'j+g,V@(OH=i ~[\BYOY{Ӷu-}5W$F݉ivdRv5n.@u*dj3wM/MGóHi Gd*q``UM dGİ3|7!vGҙO~[79G2(2oA IkO ^F֭2 -t=_yNZknnBMd$m~i uHCݗHT+먝8Vr?|u:~iDfܷSIENDB`u1f6b6_1f3ff_200d_2642.png000066400000000000000000000012421326020644600342720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dYIDATHKQuv5]$-Yܬ-. $, ˬn+Ѥ$*B"A$ӍKI|,ufwgNJ!{is̜EG.4qgb]wÉEߚ}R[`۶ֺ+#^_ix^~4dfC0u=?333`: nhpj$M*tehμB^N~۰m_P<7,YZ$9 {͡-cm0&jW`2c-].b '=璿η]zЦ3Xv\kߋS_t\)k6m{~yp `IENDB`u1f6b6_200d_2640.png000066400000000000000000000013151326020644600333040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMHTQ=g|G *!T*SaP( bPKHmZ)JhRa i$$aa_T4f=8o޻-E2r\G.]t޲lkV TDK6O8gNxo91HvdjCE4 +(*O3 K7+\IVLMǒo<VՁBBpC:2@ "ҋƯ^ȝ}WBڲK>mL󲥩'Hlq]<3*uJSRX 5\ dX$oU{";CҒ1 #Aގ1H 7;}@  ˇ-}.w>bx={x@cK+!KdnB@aׁj؄ Y a e{y TZJ[@@88@⡡jQR>aF®dDH;.!iOT^'@]HZUj/@ʮBRv_l̎\C |^:|zsmSrkh5gu & c_w+se#g|,Xj~鿧V%#g' -ᘪK=IENDB`u1f6b6_200d_2642.png000066400000000000000000000012521326020644600333060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|daIDATHKQ?w~rltL BDz,ʭ0%A E,D DMHB6I.L@+s|̌ϙq~iA2ךp=˅lJ'蒻21Q{~|*+eۙ/:X܎i;yыƾ5e#SU d*(d>"@!l4>*p8uU5f W9JIǚ[;KPJt_"Jun_Okm oRQd4Z\?k57{H$bF˪+~԰^uCMρjv9%v[~ל_0}%Sʡ %tڱm)4r-A6wW')Q uIENDB`u1f6b7.png000066400000000000000000000026041326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d;IDATHklTE3nw[pw[K@T FJh$3&hhL45*ZЄ(0Pв.munǙΙ\%ZaQ)JY25_ewa甽_CZ<`nITQRZJ e agm_Ʌs)n,`OCAjx87%B PkGCa ЄÁo8hB3Qv2s]H fs8lڈ.6m(xP"ĶfMʴS;>"Z3lmSfA:"QxhN򕲿.s,X{NyirY=L(zW; euXM PZFNf+"{4J bk"nZ /khyeln~ *eUl{R+'C(VLhpMD8 k<86#}.@4V2ɓ, !m|+8(%,%;P0atYOhRpq9LJe B38R# 43ϯe=FS D^] @T*wY_O4l8Fg90e)F(D(^Nɛbrt @kΜqC^iȨ])ٝSGG+sc ?Emc&^OyoTΌDhD@R~pglNXwą+~aO΄7ߧGw6ljgeVz<BX{jPg[OfWw?|X:˂Y!;c}'3ݼ=1 [wHDy O7若HfL7.(bC-m̍'-5z*;셏Z;3=F: O@?;q r>|KKʢ(a #ֿZ^axJtђWiށOv=&W|\752w-Yzb._e4 >gń9.gF"D@X"%X1sOgyOtZoD P!sNJ<9#]_5%gt+[Rf *I -Tbky+y v7 ȥIENDB`u1f6b8.png000066400000000000000000000014761326020644600321160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOw?3Kvw6hA*?⏄JRu)\zIIxR!'K끻hljz!RB)Uae_PÖ1}>|6R!{;5T듩=nj > |!Zz*wj}rtF8X_⸂'>9˓rj5ZVJI J#W&]A!xn]dx:̺Bo5M/?nRv*خo3pku`Y'чXB(Af} Nu`U؍gWnHvxڮ:Zu>j;ҶF;.T7<-@ۦKR;G {Rg:˧w-@[Aҕ_|lVMD_E^Zvq}q /f;FA:S?nDMn;c&h(@͝L1]'IENDB`u1f6ba.png000066400000000000000000000011561326020644600321620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d%IDATHݕKA?3몸l TK %CPD/AHAH]P: E>Lk)dSs3Am  "i*.bȦ)@5HaBCrnAf.j+Fu&^*nM+  =w&:3&AVQ@{~4VKR:w@Z;bcz]vhr8DZQ'уiZٮslu '[= ?\T>ZH#je`q=}}S)5 MWHL M-@7X M|3(#IZC c֖5']xuLp_sw.GDáN 0Ȯ\ྈC,7% 776,o@'zsgPO^kcVNj796 #D1j'{^̋Q+@d`>thY\/~y0?]Rl,Wߖ@ՅW 0mCIiwv,?ږԯ,>?x=p]_Dvj8"ֆ(Cve4U5`9?pcg+e-1%E ѫSNW21fXDV,fW<5Ch[NWr9U}^ 0ehoDO&ǁSƺ*|[.`ߞW]׽ \*LytD_ESUzs]=ktT'tp8]}3٤c5@ TuDDvj hRհU[" ;jn;{=KlIENDB`u1f6be.png000066400000000000000000000015671326020644600321740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d.IDATH]hSg$! 1IOQkET0k{QU P dcb \'e sMܬ4m~vGjsv79m""8y6?ؑh\ B qXl <:]qlN$1M$v/ay]Q9~F%S39?Rol^=Ru#w.kAEos:CoƉƋ12S>wS-{?YV eIO0Ԙ JS?obzoUP\_Lt?-MOw*t?M0:9ͽgoP Yj/w3<6a-y >9 ed@$% s"1c5]8IENDB`u1f6bf.png000066400000000000000000000020741326020644600321670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[L\U9 u ئ6Z0834jRCIhcb5ML4/Qo5H!^iJTP  gfa ThiZZ{ kʢA&YD;!$n 0Ws͙6PN_@"XzSV=+5rjA^nG m{a5;;  hYR`b?i\ wۣJ>|*]_\X@q ~m;Ӗ7}6RNI9ߍnCulFȷc˩ZrVp2N!,0 Ӊd2X 'a& tWf"_QW쯉<"=0\R^KUev"ej:*)Ύ㘋Fp:H$i`ȘszSE }M8όGMTa>Ƌi`~WHtX\d|xVf]"̴Ogrz`Ҟ`8]%iUU$sUN2D4-?ƖA3ҡayiO$SUERPul$d+oHrBh:1~k]cM{eO6*oZ5a$ Yj47IENDB`u1f6c0.png000066400000000000000000000013261326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݕ]HQy߱!mH" #۬YMuE!v&uD`)ti F9]~8&b[7=w<~hR]~}|8DCZ-$q1? DyĎn6IENDB`u1f6c0_1f3fb.png000066400000000000000000000013301326020644600330550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݕ]HQyߡ,p-2CP]]Y"SB *XuM 2R1EJj uԵ=&b7=w<~;0M~E:2H6nXiy3'BlYFV/\gCᒉ h8h b32T:"Œb4 DI%XA0lGgA"œJB۝NgR@#A|#NCW[Zt&0o7D:c4fs=vpX*7lD':ֹ3VDIquUPs@7.7>^;wƒ "5Qƒ zΙ |Dbtλ'6rΜ+SM&_nԷVewg/FWCC>KaENS[9hSiwdJ.dsП_ 3Y0$/W(=eXgX,mjD~O6,}{}b447 <$&% X5>!XTQx \2|/|5sڅU*Y9kCkEƓc/nT̟jrK*x 5WD&ۯԃ#4 XK -oݳmQ]UWh[-GiW f›yIENDB`u1f6c0_1f3fd.png000066400000000000000000000013271326020644600330650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݕ]HQyߡBB0/Yu#u1› םD7fХuc0Ji|s.j2Q)yswss>ePu&E-)q>GO  EN9*?N  R`qGp# HP;G34֥dJl`[\NhXfu L'} sFMV2\`>"3da&**,};]=SBR4 "ZhN h&2]lYHօvi["M)d!}ܪ`]h8"|@6i" -|~./la7=9b(((PJJSJAr:37EbW`(d.2o:}ǚHu97 וDZCr %3_IENDB`u1f6c0_1f3fe.png000066400000000000000000000013271326020644600330660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݕKHQoJdf&*̱".j"AZ -M& ZZ3QJCM4bftv{?8>%taS \=>CL4Հȵ`0(V4k;#k0 vg&fܜys}CcޒF34R("Rչu(}qUPm;"hii1ښO"M%: ry0i޳] FW \?g[HPSYޛ_g7H6bZ81ѱ_XX[ z7\1 ;I+5Y3#kHg,8,}n)fs! G1x"lTxRL~LJچǓk-n)LH r.w!qZilYB"^ ( y!Y =𹜦;i''kV 2X'fe4L| ~ d]sGaF>wW"Z&# 0J(Yl~|8#PR =bIENDB`u1f6c0_1f3ff.png000066400000000000000000000013241326020644600330640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݕKlQsii)L1#;RXzT[+);D4i"MX4V6Dұ HKl 2à{,!qv{/9>2DOMvLZ]BNJw]蟇>&NzpGOOKyjO@W|;7gY+0`JawUQ5` st]j8iA͍c}IDATHk\U$5U05I%m%(h>EmfRВA"P!B fcFҤb.39gC;iB}^w/ICˈh1RT`{ PH~~DJ}@g2^0ZP-?(j/.W 'D*>-D*A1LH}.t#kpg_(NYբ 0yB u a-@OG P~].doI/p^AAw+80pD_fWqTŨG77%8>#s@Q}l;'R+~BM ;Z.\S1U;yM >uMO8>T> *Oʩ"XS]CC'nmT'2͉dtq-lA)ܾGVufJUuNev#Wm3 32z}(QTSNuhXz 7/Y^ d1`tƫ VU0,hmuWU*[X$CDDH_,p=55 fARX 08- o{Cu   [nyJ1_5|sq'*hd΋eT#U$^xp^s.PmWFlnjfUJʧS #w6=ruc"d $Ў xbMJ;GZם?VzB#bٿۼ`lfIENDB`u1f6c2.png000066400000000000000000000015461326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]L[eR,l \tE#QNܖD$ƌx!"@XqfDE"C,CalB'+H1|&kZhC)g`zhx{?J%N^YsVMs~(j6EnNRm̱<9A% 7cQP[Wc xvlLˣ"d { -Ɉ';MvSf[ *a9)ډ« LztT0'/)mN$Ò"!@-\{0ŹM/} V'z JsMX}J$-jpc6x4,V}MjRhyUP K"+rp"g+xݜFYRb$!ؖdoƾ)kH 'py{C]]n:g8kTPVcR$ NaOQ9\*gX(tu;IENDB`u1f6c3.png000066400000000000000000000014621326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[HTQ3$DfPI]ntA","D,%5BQxWҐ6j6j3j8!;d45dg [@ HLfSQ{EzB5*Y~ ǰWwb6ϕWxHԓ5*=Ol&"ӫ;YR{6E=@G9W>؟/BuSmN{@as/gelb;WN1%Ȯjtu~,jQ&'o(<9(63G-՚(i5o,*^҄O"blˡF6".% 7 ChIENDB`u1f6c4.png000066400000000000000000000010731326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH픿kSa76Q*"i"I68 (NBiQ'Q]]\:CXB` ^lnpjt({q^xaҟ?-gu݃oF66&]2f y,p]k RRrN]8ZC''2 レ9~`GRh b.3(0M*_qWkEo+.dw|ҋAREsl;N:998#ٲ9v6R[-ɶ|oM0}*IrzX)vw|jcyU0L~Djc9ƸOpǝַ'Ye O3g_a^#2 $e sz`X7wapMq7㒾8 s[ ^13!Yf_҆aX$\[TI7u0 w0 aj*rKOD9,gf+ [v IENDB`u1f6c5.png000066400000000000000000000012621326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|diIDATHOHTQq&5ԧAd(&BVBgmk kS@[Ps0M,,IF$g|Pc'Gշ8s9]aҁ;<#(Mc{2=VQ-1 ;84OX[[7IE"@6Tyq T$xh9 \0\Sgm]&%VEQٮ"ω% vSiNY[oȑ9+Cރ $l؇ Ìu/T3U7. N|_a1R\\:)>6z%}Ntl)Kbbgʮ~OW FjV fhI[&](5U$><n83X$w0 4?8ڱeԼ*E4 }-p`靟^u&Rt m7y (\Q?1s Y_Dݴ=wgu2WݏaTq[ 1ƙU`̊5(hFǯ&ca7%!EogJ9rA+=&Gٷ𘪭G,(- 2mְHtLu<`婸`GLa#eRPDC.$FVsN&\*z DYG0b, 2o<"Fr -XpKs1SF.O],fv*!i@A|5TdDM'pD\Wxܟ.P1^+W^sTέ T}\OWz$C6'u,`wɘ2b16#*`H@ːB7s_' 5s)|׏& -aKZ\`"6FQak$yk?W[Y{(&Is?T1"8g&T\QSU;Qf455Eߜx UUEȠ" 1]oj (ehT(C) )QV} xDE\)3!v]%Iq5 2wNѻDrx dx;}] b/8I#wFd4WwcXjS{L[K QM2W3g~VHOX)DXq;" | x%jWu#:J$mĠ>j{<5x`d>=7> e1Kųϊ 5=ޢu난~@OW1ueq\''?G==v"V|Rݘd9 3Ut\|(`CU(Xh(6q Attݱr|hxzf?Ф<\o.%\ *(!V6_ͤhgZǚ,=GLst%. eR@KT;σbJ(٭RR a!\*Vtkߕ'h,%Lƭ|}JM#@b@DoL"ʠYDҺv6/*,:kK)k,,Z 疨q4ep#Y.nʂͭZU!4Z t@Qa}Mh AbW"K6$W. ao |7{Yz^KIENDB`u1f6ce.png000066400000000000000000000016331326020644600321670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dRIDATHMh\esL&SocȢIZ*$-(*..Di7UK H@RiJVZхHAjuRMcdLrgi44γ;~~=աG;V[=r˿7rm9⏵. Khz~%)Ovnn0۫t k{\U?h^gyws`a$orP]D ֋KI St6JVTEf~NyX҈ ŅU{ub-wV%{_YuxUJMzC;=ڇ@%Yk9c'JO;`䕊QD^k&ݫm"հ?kݥeQil|Cκo/Ak3y(s&YVX6g%Y^@QPk&{« Nk?ze"Skes C يv L~Ks*oN(OJN2؈ Lq3Cn8 %Zkg.\y)x/Vqoy'Έfvg#W&fS/$ G U-r8jT;߄H:>qr"clTCTH|? cf&yZr`ЬWbj2EMmXuXuh$8v۶p \̊H$Oξ%,WQ e{A)waWq߾5bx>`B$w3s;WCw;vGՠ`ۘ@%bNɓ"ZW.mIENDB`u1f6cf.png000066400000000000000000000007621326020644600321720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=hQs״VEJ .:*bIuP'. N!fR[%DS-"VZkO{F\<9GF/=( O-Da91Ex3 /҂7c&7՜> Gi zʇDLr,!LًL*sW&^tk'م?oOKKldAڅ'8WOa㯻LVԹ/p2+{# e zu`eMN(>,V1kחsڤJsp'[~?gz8 TJ " 3UaVa,P&:nZ˜撂*(̮a< A;dCF[IENDB`u1f6d0.png000066400000000000000000000015131326020644600321000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHYlLQN;ebZ"!A%Z'/!D!؉ 4 :1ӎAqN';~=/ϡ Rzp͋Ƨa/MGUtKT"DyE)9I34o\? BCE&u,X_|w$^FCUq6/Dm+4P널`@TjLFHsQ0]u+ tK6M|a9h@Mw<4 0V3%2rM{nSO-Yۧ' lX/ ( Ы$2@ņ~y9ZӊԭI N(3̙7O 0ʴ\Ea6u欶9$(οS.@a_rz{&DwLU#PT'tyzŕsP6# IENDB`u1f6d1.png000066400000000000000000000005641326020644600321060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d+IDATHխNP9+5ͪЁd]8nbA=[30!`XH/jgRN^y>?w0fq!3$zKwk- @8Hqn[*=o8P*<,!\e$]9b?]\l<|95۫*+n(a4RQCQY¼*>)0YxVˍ+o룮m ogju\oZOχcDbq-tZ/^Ȍj1JIENDB`u1f6d2.png000066400000000000000000000016401326020644600321030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dWIDATHՔMhU> $ cf"Hm*BŮҬ(qcEtS4WB*`㢐VPq0ljfZI3w]̤$ufM{ c ;aTEUFǕ^T xDe*ֱ#Ԛ"* ?Og(G/FH/݈iZDiUaQ NX/2- rMF<@LF>*g1g=ɱop)ڇzI4ThW*On;P5Ou&A{BU8뎀{8W?gxdZ~1vlZ@Ճ!98OsuGҪlZ_=ާ̯RȚl-qu?.˃R&{/mM_"Ss]x߰yk^b vY4=bM<3?x\1 |X-M/\'sz{`lx5g[l, Յo O>Z5ȹN1C-P EIENDB`u1f6e2.png000066400000000000000000000016101326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d?IDATHݕoU?3'̴J)Q*E1AM i4.L4ш ЍS]pņ*.H 2id'E #ig5!&~ upQ1D!pATY)URWcxlWqϖ>Rz".CwbtdSSugv IENDB`u1f6e3.png000066400000000000000000000020561326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՔML\U{o>:,h `LkSc+XIcΏJMӅ11.\v55~4UZi 2 f{@A9Dk_6ޏMܴ" G-2 }` [~2ˡZ{L" <>+*43'-jP9~ٟ{ I8hv %`PcI}.D08:nTj{Q96<;7-&󊬫+)&ȷwP3|ފVUz=vzqO+vqJdӆeI\Gߘw$Bi1P,Zkxo63|x~?w.'}Xg"F]W)^gntz`w~>SWQ,*rV}I'/r%r\K]oR"AgU2n4Q|* O&!E8!0,i|/X9$k&dZu?b-!Locl"g;( 0`"lÔ ] AaE饗1:ArʺLb8ʢsgB<ӵ%cO+u a&f;hVH|pd x TwE՞EsNߺ7[kR_};PZr=Ҷ4<\CGp\SB0Le3=HQ^W:Ď]?O(3nal摂/%q`w[O&j/!PBnHWck(H+nD^ܼ*/4\z-Dg ҋy bJK&=蓣E;X|hϾ3 \LyvbIP9# wfCvuZє7 ՒbSsw?ӡ+}%.\SDR2(%m`F.\5Gwg<6Oxd!K%>!XG > %qqQ'K~" ,ipD$Ҍs < S4]mӴ {PGk9Eb|!98؆za x.ݧ^Z!}6Z'!$?̯7̈g >pIO)|JӆH8^ES:A[)cwfgt$ѳ$`iDdw&B-ֳevMX!r*]B?mXu܁1Mqux|L|H"[\6:ؾ̽+Vש7ؚogtHV$ f_ýn(?lJ h;P`߳X+Dۑ 1YN@~Ȑ:Ib{N ޸)d}ތYˉ[ΔYAkYui(ZiQb]'Yy| sIENDB`u1f6e9.png000066400000000000000000000015271326020644600321170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkHam!4% EB$bE ;aQIN:HPL-.Sk폊"~?\<yȟ<+_*a/7<1e8#~[:l_YӁF;2! z 7}j:)dD~vZh{]O4 U,3g*D(s3;`:qMsKHᄀ9 {k6V/ĎpsqNMs6B6Jh04-4n\J)eHP $d!ObD]A&Uƃk? H7Rޘ5Fqj{ގMT Bċ1tX|姷[.C Lmsapa")_}[ņrCJ= ](/I3|`}'dpn jЮ\(Qwkr±ʔN%.kB+O;BgKuq#&ՙ0ܑEs0[qU4Xzېfq}ԭ{դJ10\Laeb60<˜ uF&")-aQFS8-90ͩP&C-HVw{UGcs#25@̍ .-ŷS ֣UgRmHLY#{r_Qއgw&xScѨy/]c<>Tړ@կE) KpIENDB`u1f6eb.png000066400000000000000000000013071326020644600321640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d~IDATH]Haٻds95 SĻ B0(Za^"KDizMAy}hfiΥ{Hm͕ڕy9ZFZn[ԌG))^*Yq]bS0~wv#-'gLEO)L!) 'Ti=\)σnfEf `Rq 1Gۓ:BV`lI1n >$m8yp+ ֽR]*FeHiyG[5>8 egBHO{~@Űy% Ѐz/y_64xj+f9H&O ֨Zbk{й,j`dp9h"9;sYH6Zcw G߄j䝶ui&Sy:r1Ob&St‘plsydy PɱwC٘ Q[=ꤎdg)r)(i;+8`ҟkr7ك ׳0CŮTa_lP)R|o؍H44jj!b.vHB|(^G IENDB`u1f6ec.png000066400000000000000000000012061326020644600321630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d=IDATHOHaǿ}wtնZ0S9)JPQd?Q<O]2df'G!`W39ާb-K==|DDMѶD =UN52k룂 F6RXFH[ãKy`k r^89&ǟ{x?8kO {ߖ-/u!' Yiqt5l)h!4l" ɘ=yۻXt &(r߄>S0JLPk4Wd D1hR7fu% }͊uROIOz6L }:)KGtJouRj Dx'dO@KK,5@twpbGՒtKkl:,f,=uwMď5N|a qnmnz{;(7J #|τ>#VB }4t؛J+W5g`,4|h媀 IɮIENDB`u1f6f0.png000066400000000000000000000015661326020644600321120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d-IDATHKL\U\0C-PeKQDcƅ cմVc7NEhS.L4qGZ-DZ"Hqxt@gʼQl99;$8sA|7)Kc1^~WPnjM1)=l?F#?̈́jj붱CXL'LMM84>PqSV'T'`h VG1_ajJs5mM%Jx@ӵs|,Vq京&6-ܲ0Ctfq@3!3X}nu'ZÃ!k85|?@hj@$n;wbD*(5hy xƒ枢iQh/""D&/L~O' \F1չ2,6Ύa F6壳5qS!}A: TKԬqߙY2YU.Tp(EǝGb>jA}:YvWPM2CioR|v30ZҶ +㟟KrV5{mDKU#>~\DyMi;]}bOvqnb]SEPժ3m`f"UO|8{NtMdQx }~WX,tTL!8:t_a3 <¥ ]U-]h˯2?F4J*i$ӹkz ]EU׋n=Kc^t4mVbD:sgw˅^HK|э'z8F ^mB*B(x^6E!Z``oĶD\8yt7Twt{F6FBtD#Xļ 9@;q]~94e:IENDB`u1f6f4.png000066400000000000000000000013661326020644600321140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKTQƟs/Ǐq_ɽM}ԪuiDAF"(pm 1Pih#Jcu=mYg{;r!)ȡgLg[ _Ly?[t$va2񉗌H:ظs(nHSwU18iZ"UU+h!90bm"𺠹Nto5H"NV 8cn]UpR8U8]@ Ęu4pUd c%x70+dĸ. 8lJg̑%Rx@O?G r]Q 1:AmmWk D8_\] 4~Z/u>xTe#^Yu!Z*4ތ 'K2"ݧ˾[T5WV|z,8SPk4?ۢtDˎYv̗2^eMS$-P0vǻMa`ݽDtLf%Y~x|c8Fk_Rnv/=/Ü3s73 %9~o6yfZb7W}w泏ϻMc86 (p{5iD|0akE?M L'PVseï,ǝcf킽D& tP)3T-*hH)5>0`iX?֤CCD`f0z!kKZT,Dp'NVkԆdٲvϒ"Zw旜17>U-4?{>5S@d  srNFYVNJu荿|yݯvp-.v q6hiwN8Dhb(GXt྾צŇylrG߸ɟ(UpM 8E&PvH=-2b dge&tD8#qnM,m󃠷l #x8?+4 Aisg6"!G9ցY ;l%9?ϤǡğL :D($!g2M===omo^$3V5tjbw&+ZC!N\\ۮVMvQM+VwRё8\@M$鋭+L~fWqѫI#O(]4̮y9`9#( 3z"wt'Y)f~#K T7}cP0Lގ:?M#s=*IENDB`u1f6f6.png000066400000000000000000000016371326020644600321170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dVIDATH]h[e{N>i$mjSXav~/ Ck"8NǼ]y(.v9DŋB7f٨d[-XXnǒuy/%e'/8}Xf44nFCP•)$x9$?ly<;\ZBS !*.fUKO{plAy~D&GںJ6`UL?05݄߮R(eZ5ϻvہz< +1hd_h)ɢ_X(իUO׏,żZP_ytg`1w|_ŦUiJY ir  VWpý7;r<e5ܓ_O򰝁) }sxG{׀㞝-@|*,Zs8<_tC0^s0 ?FZXtȂ`0} q4۲@RwKx=&,2L l[$gByܿLge߀$x527_bjiG~La$?W3hDi.|b#|o|z@g i'lLׁ؂xiR.\ѸʋFI`C?KrK`?t6A`yS3fݵ+efƢ!V|adyչ|"rQJwd1~w*]@_E;CO)c_3jUZ%g*@"Nn޽B*P ŷ,﵏Ȋ2Z|?%$]ٺv\wk|(-)P4t~mX `s`*;7V:po.;>X2VӽͶ8 8<;Lޗqظ®Me!#k2= d N62p&qbժ%mZFy4 T>p8% coxwahhȇ:.}=m6M&=Kk\([i/IENDB`u1f911.png000066400000000000000000000016571326020644600320320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dfIDATH]h\U}$5әHX|(1 F`*AE+$R|h_U  ZV(UA[Dw`;]gڜs[ َH?bOZ&t>y3y HPFZ "]f]p _ 70Jp a Pt .Exꏫ;0.[3J NtC}5ԑTT|id 44=^g-_6Gl ˣO9FU&װB݇X!%D]&_г[+Z \r16[g-m c2fԚMa25h)i+nj-,[#7AUAl߮#@ tJ?%͸%PG6t/pPagxldήa+ʃDV~W9/fm}_5ּM6A<N 뜼|sB-.IENDB`u1f912.png000066400000000000000000000017261326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՔmhelMtsf. aYHB0VAC/5K5!)(@iJnSF% i{yY{;m?^uu/.! ITa*q1aYWUNn֣͑HِeAڂ LA}@fN`DЗMM!tNm9xbijq]WLu-<ܖ|}z`r6$4ԺHm@[*b6sX5m< $f*iRg_(a83> ޴߫d=1!iϣv_ױT=G# 7gLj^N6*־b%)5XA`ۣÈu@5HT:u!?6.LcZt1kGOu8BUB$E V :E7dќqJ^(-OҹNvV^> +2DE D11Hȷ]•(#Jª2DGvRY+ls) %}N*0q~~6Pw8x@fW"?[#0Q;m~`* B,!auy0M]Fs04˜/]cݵz}ηh"r4Nj/l.Tl '7䡞'DAr*k;ہE@!Y3 h7"kEȽ+k YrP IENDB`u1f913.png000066400000000000000000000020541326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlTUNKcΐHԅ1<|$lUB#XBb!q!K܈AT0, !PiX4 -#m{.8@}9sρ2[R\Q!iz"^oKѷQ^Up;|++s6(w'6_"4]‰8A>pX)$@~28$>&v}U6q؝ju6} 5,sOsOL2B#Ig,)Ή_t½=f,aj%Xj(BscH|JDLTDoe!q!* ˊ/lZWaQ~*mS#FzJ*mco Xȧw%@K,w9K w,vveI6%͝1RiT[z5r;0ocI%%1;^ @S [V:+̳Ug.pesG-yB&'̪30;,@Z0\2Vh^xcay!/(wcKGQM+\h2DNA[ %|'_7pb?#k)m'o[?6ܵyK;Π0S {Z/+ܽgj8tf&֠/V!z'k9~c,+$!뗖XRq#pI=4T}Ƶdׂg$]"TK2 V V.PA*]Ұh! b rTPboh!Kn.R4eE\f8No6v ([T\)sU &".jP:^7? x)l2سEaJ8s///Ҽv$RMA,r0rK P % sb.9C Μi>?'>«nH\r !AqC.a询״6wvQo0$ e:0qm/OD,EͩW  G,ʗLy*˄bߪ@)E`8c`Yc²0Մ5XҨʄatc|FłeyNsJA,aʽ\J]R2MEmH31o9Wϝz#\7ݗ;w_KKӐX46f2ToV|#&{CIEn_IENDB`u1f915.png000066400000000000000000000020451326020644600320260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[L\U}aV165A۠PSmD}XFccLLĘMPLFEciDu"Zl-JbN̍>%Plmsb=ى`1ߡ2̳d /9̖ѽ=;ۙ*(Wfx\@ז`O4RΏ. Wd+V*|Vs%} n׏kSHA_lGq$:LPe_~HTs(MTy[/sT~C(!6qgeg#F̜`]ӞUHĽ?wS`xLF?m{=ǀM1$ >ť=M߸ a`+|JWz wՄR]KYBř0*_yES>ߟ75<ﰡ0L$Q̱;tNIENDB`u1f916.png000066400000000000000000000022251326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dLIDATHKlTU;;϶3SکckhZcbjH4qCSc /#R%jD4QóV0A-3Lޙ{R:5,'g};9p!v:`7# mnRYTZ]n߮C'۶~x5Hc'?muH$YZBҤ}ux˦*sw˶Bx)ҥgԸp3Kv߬t*ti.GmɫI+A;ژzmۊM@*%WR_/RlE'HP)EsA= p‹d^ &IE(B'lc:M>kl"oHYPhn@@ ?M{#Ui[ħ0SCaCW6Jr(Bԧ&u?RJ&LMU`&];vu'I^h8ZjQnhf- ]ש7Pbs 9xc#^4MWQAJUv\7/jf6nrӓ_ǣ0f6 @_.B95L5% g5 DEX7va6rO~rA? @E)~-+a/pC4R,XD܍("%0s &#a[Eb^b #CU3"zQSILRwUFUUqr.U[ v ѭ~{L#51^,ɦ'aV*Q5PE|DHMa+?4j"U!waXL+eV B4Z uvĸX@@10 eg*XY܌38 DJ9U6(oA^,'458.EPĦ(C6o TkQ!.{v|`ޞtg^>Ζ4sXDH~ԻXdRVu8hJjUL>:-:9?KH#`,;ll !accVkF!&;䱋{NVkw9]̿r i ڬ1 *:G$CM]ӎLoTS>C|߮kH/֖WFL^pVC%@]~ckzw}OQE\{,-& #FIG(,1Ć -ecmϡQ7 ziwؼ;q>iaf r plF 3ټ;T`!MMہ{ }]mZlK]c,z 0Jl9[AIaB̌'x# &iBP ť&ߞǘ 9)' OLT]ΞTM[i* 9ѷ7BO(?i:Zīזͽ;<9:`qjQHMBʎn$cqm2%=89Y3dDx kAmO<:#W:1IҺ)]}\xKH-F{ 30N>x'W3ewe $diRv5QAC$Ҥ?9] d2\V+0Ys?ڦW8hT^ TV Zb\YM >,d -|m5ڽU 8]`8T@' ⨇mvnvtΡ a]O{h34v{}l3B2S)b6jD(U+71OkRq6ŹOWSPMMA)˥0rv0Ю#*'aDqS9[5p$wreqOOR>5Nk-u\4~V, A)mFRY-{O/->;؉q nrP¥ۂ:sb =s/PjoYyr*?qxkA@nߝXqOd&%[z3gZ}IENDB`u1f918_1f3fb.png000066400000000000000000000015031326020644600330100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=oU3];lpl4  *TEJ((5R"E4*$֒9qq{f?͎wvjν=9޹3#Z]&Z]7/Zg ͟X^civ nE'~(tl6j?1+|A#NҏEsQ׍k2|OdU\?2Qk&^ Ye@1 _y]Uz _b wdTVy@9| +o_YcO !_*:# ( j^OT/ҋFO^m7v5jd]]Y\L6F,neϢg>ڷ;AAjTL䳞o0 UHm b:{z$ɋJm.,Kr4uL$#6q@tM! ̜nVDaP՞+>hמf,'x+Ngpt_±.Ҵq/öZۏYCd^D,<pv;޺ S / B6D'c!TdibF1 nk5? @&t{?C(ȳ0(82r[C :~?Pɥ/πVAdXNv+ xQqJ*•_^tlcF="PAIENDB`u1f918_1f3fc.png000066400000000000000000000014741326020644600330200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoUyo{-pAp rԊ @B N$NH U\*8P7pBBRiqnA}yo'ZD9Ȼߟ7w?,rG,Mҧ%3poKki<-1fiw+ɕ y@e>O^Ga /@Tďj}2<  dLՉU̪ eIxВ=x;$(d91 וg!p[_V79B. uϞ}os_rxB iqŠ]o &~(kF/z QZ?>iG7EE OOx3J=5ljX$7NB@wsWk l7A P.@c_6ʵ*7n` vm *{[s7G!N>/݄ZM5tw z& Cw1ӥfT07H "f9vmᣈ= `// :eT :<>Rex)"|p2*tڛ&k%>?|IT@9\̌<k<'N./nzOqFc's7gS<-9/?r]_=z*/?" }M!IENDB`u1f918_1f3fd.png000066400000000000000000000014721326020644600330170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkg?ϼ;lIvkۃxыz"$Z֋&J9I1@u"AzhORD&fw2>=4dR|o><oxf~8iы'_w$oW3 %AuɴU3s:`<na0n1 zPn޻yodD(_7GV'@UcibA[ZTbbHׅisNI:y_{UbP |sw{"}#'}^c88/##=)2S_lV?׬~aF#yīcL#/1y^wf| @JU]ZN!9yza#¯T>%l4לP6R^<_?mX-P]ZTlٮC YFJ+UáT@`b. (/f _@/o;L>QMbHzqhժ˥ AZ/@ߙ/c+>P,ׯj4ˆѽQS;r <7O6R-P-R_;<8t>\>{q `E~`axm~n糏WW@-!r5Ǩ?w歞0Tя@V`IOD碟ߛn7=cIENDB`u1f918_1f3fe.png000066400000000000000000000014631326020644600330200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMh$Uzz'cb>H" e& =hYDeâΆ+!+^$1I&Wt;,yޫnCTWTy'ʇi5h0OTsYj_8*jb;sGRlj- ` }Y51hkGEѶKy4?#fkK&@g})ӝQĒ}5貒;Ls+߇a[NDR_Ey~)OHƗ;o5%8]U~( ~`v]6J;=FZ.Xx߷ uX1{HQ|-Vj*XלѸ`C埍{>gԣkz`(y]y;?l49 kh\jsq TOౢCWbfybG~4vzcثl)/ߒy.w@y@e`~mn&>64*lPgёtb2daM@/ rmui9۶mP ʀ{h]@9 vq׬p\vc,wOHz3 p`ɏp턪f+S=x dSՀ^`Dvyo\DXm/?iD+js jEf)-ZZT|ؘVx,Nyq33XU^?jpS*Ʋ'cg-[wD)+J#oogl8S;gNR^ZZ;,3{Y0X,ʝGy%\!L6:1:<h1d3koV1[(rQLowEјiہXs+3u]) 0[(nBzw͍~s rMw72ba;b- >|P@.7Yo=wȤ\#N3xW$X.g/^v.위9622|b/g7V v:)$IENDB`u1f919.png000066400000000000000000000016011326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d8IDATH?l[UN\5e``HQVآe!`@eAEl0 $:tB0VHMJv*dOS{۵zs| ib+.|njZ=HqP 3əGsuc8@.V1Ny7 "l*[Lٺ;q` 1MX dW;3*§vQ}Kut1is{-# 寛u>-=D׫$Rɥ?}# NUcMFwz)uK!Ȧs݋;n D'FQ ;5wp@PUO;=jkCT_ژW7eTC;39 n@EP}5®m{xVn;ܞD`~oicg*|$q{jK45mw S _Zk>jrP,s@\R[ `#a ˸mb1D&x^]v ] >kW?2D{s(f9UuЋ; 8`T.K:p Cv$wwI-U͇\]_hvyQS[TP(?ۉTaG@$ } C.,u68+ϻ`,  ؈<,~U>uwїE -k:VsՠX:"oA{~E/4U(l z<%knKϏZ4X+k۵F x, OD?tLIBIENDB`u1f919_1f3fb.png000066400000000000000000000016031326020644600330120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d:IDATHMh\U{ǔ0I$R T$4hVJQB EEYH JcF4S1m?M2sν 'q&i'0gs9|9s6 S9Db"1ߖzmFGQGtnQl'7H%(?mS@o#-U7 Q3`cxȆ`0l2"Do\ D6>@VUWehPթ)Gy`_뙛f=V?%-QLPO%:΢DEVO1$;:Q⭦/}N\&vtWZ}Jo;}U-HقStٍ+k?}8[03{cm~7UD#@՜l2 $߷'yWg}~3۳j?TT>:79 K+Ƙz 8 =(a"ϻ >wJe\r$rZ1E2?xywpQV,x]kiE z|>}IUޯ"oPh#h27z*qO 9puЋNW&m+@>_ <_T csA=Zm_kDw%kIENDB`u1f919_1f3fc.png000066400000000000000000000016161326020644600330170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dEIDATH]h[e{rt]Gla4E C-*ZP\3ATtNAdl~ċ1Sx!.dCGvnd Tml6k&"͖Ķ9WئťWąN[v_>;GAɎ]- ɾ@1q:_t#Y[{ǀx~|S9 CPC_kǹ`9Q ;yQOtk=t{r0M!}K7^J$jD企ِZ"NWx!##ozkoSD^߄SWbC;҇aLUj] ܹ{G6+6Dzw"(NxOU}ލygy. lU>j*ûbXu874NgBcimP*,~JȮQU3k٦%N:&g Zq]gMD"ܮۭM+x<_ϡp; sVJq6?Pjچ85bݱ%Tk ;rbU#?:ʴrI+Pg/:fBg?v fL"zN{ P%s18pK'Qv11AcqӘ+ ?ud5?FȾ#mދG \dl;HDQE?)cv߲@J =*s W'ps]!ATԮj/HH_IENDB`u1f919_1f3fd.png000066400000000000000000000016141326020644600330160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dCIDATHOh\U͛733dZEAp!j"Bکu!*ZA)Ib&qV\(.'JɔRq!jiDA .ą.o:3I&޻Hg:-}\!8]sTo2pwB珇S;->e0-{([d.btmS{N j?Udfrh́-@"zDPzj%VBߜoj0;9' HYT7?NL& wjǧU5 $9ݭĬzx,v^ߣ~'-$P᭖*syqxEt@~h7*n0=0JBQ:: ȻH9rz`uec KEW Tߟ͎R+>ڑ@nJ0*UW9y+sP (H6=(\)@$YD[d5Ȧ'_;5 *W翾^Lj&3;;alkl\#%{ۉ)j<O/MD9މ\ FXीQ`P$o|zQ@h #֥ '{fr9z9e %Ey773H#Q:*U`uʭJD7#ɲƫᏟ[xDNYZЛ DNg^>{Fcml6?'ʳca*[DZ^ #dIVצ XOPTOT_@o@kpX?RGD=XOfR뮘!b;Oryﯬ7rYEy(ٵZyC{澝k@:W s:?xu׹v958>"aCIENDB`u1f919_1f3ff.png000066400000000000000000000017001326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dwIDATHMh\Uܟ&(V I-Hn T ԄR7.T$q1 64KXRʈMZPLc&wf{\L&L4{}{OD"*quGhH$!K'&ƿCKɉ-28uF{ !-fjf8]!}r/W@{@Fyj s ؾC@KQ*s=ݯhB.Ђ< g#]]&{ہ%- +Hք;)eY+@2\bƷFű;VR"m6nT@V'$JpUR; _z߇-61s ,^6[8÷{N\RAԱinpؖEyFZGDlۮ;!ӥJMƦ:?xV"V Mߘp?hap|2vn'OVi#{@}F.]-..)sxyZ\htf_ 9} pH'nrx usR*1 T-HGz=v^:`*Qjp&7lSisb9g3mIENDB`u1f91a.png000066400000000000000000000013331326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH;ESӭkkm#!!rH DD;!@"s DHF H0NO!}̮{g[K0ͥ\T+>kM+nzsq 8-eu7Vz]\q`s3l7 v |q,tA tk߃Gx@6жݯݑܡ\/_l,~p~ TĊ)8W nDv:;qSA3EٹG11¹+gAu}ߌWtx+|}N[ XU&R|<|5S.> o=S;\*FeeAy}U)d®B8b (G Q;:{CSjZ?Pg:okqZ@CҾ%^{=3ɵ}t,#˿#V@CqkO>Y{~lJ.c /ʓMuQ߸|.E؂o:ePPلz}yA1]rD1翴x$&IENDB`u1f91a_1f3fb.png000066400000000000000000000013551326020644600330660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHe73q\!S@4DK+;Z,l(B@7)z|mv7n}~X"u;y6nHrwg8%if+Y6._]8Nx{Qw=~ pRշd}8jO[(w2I_? dFa9Wnα~~tέa?HB-؂&p  @1RGDH몂YF;UYRȉB tF %#F$!ISE%vY#jQCߠܽs ٔ~M\KfF挔d' c+{.| *J ?:ԌpIc=0lMz03 b벤H<`.:^ 7m᩵3 6=QMM)w>uD$<&$7 |u) gNNSi%Ƃ! ۃYbo*]7zfQ@#̈jսf`fZFp>s+@[/ {d0wE[K:O]hߔ/@ī/Vf+#7˽^iK|ɪ:Jh1ao{ixٰ!wu]-οS[K IENDB`u1f91a_1f3fc.png000066400000000000000000000014021326020644600330600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=TU;gFCBbܟĆB$FJ++~cTVd*)lD "RXB r7sy-fٙ]}'Ϲ97vp3GNߌ6k.n}wbA;ta{yyvߩGqƋWN#vvV?Vn p[顝V ] <-y:Ԝôv{W?y?޵M2dᧁהk->=f"u:bN ̲I{QZD:@98rJd[_2Lj蚘w%Bh6X%oUD*{Xdfzs$)r-ן=X+ۉ}a 0M 1aC% z{JNYG9x1K\Dߺh25I~(gV,A&Ֆm0J`75hn%ζ'MrWI<1*x2Y9xkh32^407*Q'Gڜ$LwFCMN GX o [ts,| îLo\v$'(㆙o7}vxW0.T|;+}0Vv_ڹ˙Ejb)7! Z #0IENDB`u1f91a_1f3fd.png000066400000000000000000000014071326020644600330660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH?Uܙ},CោZh6ZWH. šH@$VP(T]طo~3o};ؓLr=|g q{t{L7L +.awL<vmB1"=:/'% ߙxxΊ.+0YfK{S[9yC7joh,>-,nhRQ8n'Q~ z,ڪAY[./M\u}~(EBv-b;NL,;fzv9tӨ|*OF%[&Ng__[q-R9uLb5de`y`LQv 8#!/)E !1~6ÑX*Ϣ!`o."[- `seLs.Rٲ6*8YvτLLhOS^Lu'`z10 ڒàLP&]-Lg8LS\A,Cn)JEםmmxR[B JP !BT5X/AʻM!{b} 7Yl J/mm,W67hېW) ?dh9>;8uHL{.VklC7|t懅TvJU`F؈䕹lȿV!єg{O;yIENDB`u1f91a_1f3ff.png000066400000000000000000000014361326020644600330720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH;]Us_3c2!hElT0 /$f0Xi/d:0h)qFD5 >б-Ν;'sg):ḇD8~ua?۩F{{\cK 7w 8}r%r87=Fq)ׁWv9]?VMO0ȣX;(B IjS' ‡6D&eCtq:#d"f >u::8vb)Ui=n$ _@tjjZfPbv'QmKߦ#{%V|km:@K~)R/6_Bj'/~Ni bXƵb=-2 \/?Q#1h/vzzrl=ףRX"߅X*oUGl'| ʜB[k,-of\VS5U#`6bmHf}}D3^r( uDtݬ7BC٦u{NJ NFUf ^~ rٳwRLfvh8p+MMMv,eTݠs'rl+Msxɼkո%S:9jdf-&CIENDB`u1f91b_1f3fb.png000066400000000000000000000011611326020644600330620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d(IDATH픻OSq?綶%"R|$. A# 1.A&.] $FgP^QjQhi84}Wd;s=~DrX MNsm3#UT8#Чxڗ-[nGn{]aS~KUĸ7@L 3l:),u38!D#SZK>dvVD V;f!?F8qMLj&p֭'G!w@6 GZ<6@EDzc9ts1F.NmlxŲax0&L|4impz@ UFx:"+ ux_G;r*  5DPg+\۾|Jm߂]0YN Do*+*_6 3p}#8Tங?Τ61 ,ʄ/6Ơ&]r:ll0i> DOP}P}%> nI8խss#s0)mIENDB`u1f91b_1f3fc.png000066400000000000000000000011701326020644600330630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d/IDATH픽OSajiJ(t00(&b\F#upEGh TvYq 188CR@ǁa7ݼw}?HH 4 -LJ DZgAϡ҉Ђ@ec̕k^ౠӣ%c,hE_Owesf#˷T6Џ4?g\4ύGX^Rh06jv W/Dv5}`ZMQr,-4n.G]ScL'@VkYZKCGMݝldcQe="m8vh{}嫊NͩBRhAyWeziP$P{]Go=,-g)J:P {X|Ͻh uryV擄m8Yݎ؀/lb;Zrp4P_X^拚I rm^]L "ƫ&0ˠRӉѰCaU,X}f$F 2dPyˮ/Ղp~z1=¯2IENDB`u1f91b_1f3fd.png000066400000000000000000000011701326020644600330640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d/IDATH=LSQXۊЂq20( c11qs`(љEԸ캠Hb4qp&ASbosP[Vy=~΁]m#)XOpnd[O1G@* Tf"n'GNiB8ЅQ.:+``v+r庚ŋ3n|!ɾVߑ[zȑv^R"NMJd"[3] ?J!)I& E4{6PX7-byy ,ۛ8B*%Ke&r Cpۍ~ "(<$b3%k޲I `I ?s-.eC+b Ds2(C3 rʢlyI,Fz7pyfp"|Hr\MU3~78fĭ0ȕ|ԶVIqh@R{>^f`X1 2[4{^`~8Bx)zFW Jo'󣣎_vLtsכ~IENDB`u1f91b_1f3fe.png000066400000000000000000000011541326020644600330670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d#IDATH?LSQޣH 1NF7!&&$nF5 &8hB`Uf]DM4q60׾{l>Ǝ{}sՑh>>Vt#74 19*(T8.㝟{2{t{<ؾY`h2ݷNɹ,LL:@응P&MV(Й㠭4G(j%+hv'?'v=JECaˣ;ۚ@"; V*k  6ů=@3\h$]EbYXRJ}Vშ|\j w`/Ku~y'_ V_* T`}E5dtslt=-x?{}]sԃzǺ,BU `,{Ijs_@b4,嵊>%7jܐ^홙7F_$v{IENDB`u1f91b_1f3ff.png000066400000000000000000000012101326020644600330610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d?IDATHKq?̠"a<ƒKA֡&%] J^ք:y1-\dSm|:n5ky{|~p$G{k@ͻCk3{IĸaQUF*)_ø6p,/@$R)5FzE \EEJI=glC[㢁mfPwE&p-7vbݷ*u#_$J+۾{=(pë"IN^%?R)֓Ie2Z(lT.\/qܜK{[Hnlf51gnϹ.* heA?|Pa~W؄S4Ptr6،,s-"w&_x- DD,dRU Ch ?w P~?t6b@m ͪz{/|?1JL>ht|&DW H(J/$W5UVTxԓsٽ݊PU:2J hm`d(&Fǧg;J?֑'YJ;EUIENDB`u1f91c.png000066400000000000000000000011661326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d-IDATH픿Oqk)PXD'5Rt`\LLLu1FV@Kb qP _CKGTپܛgd)%5qhJ:1hNwdk *"*__(Ճ,;Xā(p'3 Z~{Ie6[n~%pwQxóh~C`g.-KNf‘U2S5Dcw۰^(:Ny啟8U o<5AvB8G Osu4]+zA`~/ bb}TW6B}lD)6KP_y+T?ˎdv`=^k?v9.A+jI8Vli#q vw :IG)~ʳU9 }T'`R\/&#{m ;97pTNHiKN㈎1Hrџt퉦N?_u..:x18v\4wK:d @nd-2m3?]gj6Si|g<1Zlm.{cD>`l,1'ə2o'\ˬ%q68s,U+muxv2ˇH+:=e-D U;V5_;A^/P`ڀrEU_kr>|wу*t`odքL&Oj~RT-.@aT* EuНk7~'[D18iA9=3N+<~ `ۂX,.d1J%+9u QI)69X&ڛ贼ۊ%^r d?5}#z* 5HqcMtzO$1&jF%VD ڧwWx=53(:;X46]sA ri[S`[GgvT]%&kwP<:KtӞIENDB`u1f91c_1f3fe.png000066400000000000000000000012041326020644600330640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d;IDATH퓱kq?wDhKV-/t@' 8(H25 AQqp$RDզm4w=4Ich7,ݻR3(+ѩ RN|`Wዱ|9cSqS_YW·j(@O*6Gx0f&Trx䅨io<̟=I&@T20pAܭk:] CëN&ZQQ l;EšY6>Q D;~ G{:T(cmFΚ 䝊*Lv8F0"V%*Og2$iچϦo w4<Mv 6)bB@,,Ruoovvf󞅺$!{{=]`{' q gA9]%,UeNuQsB ^)oT & = D]M9[]⦆OPNu#zy5 CP~Kͤ<)#@P-!z,WVWDu-0ڏT?cPSTrHqQZ3;.mG$295vtPYKVY>]䜌8rK 8 5al 3qgiCvn!_Zt;AYFXIBM\MXOW+vɻO?NC?8Sf;.uڄ3)XSG5CeUו+,.FDx dsK Z4h~aFWz,Lִ 1j ;GG( k_mm2Oܘr}h&DBcfMM 4ǭM!"r͡5浓]ܶ>׆>J 2(fjv.;WB؎PIt `_*zDSU)VL0Dqe$031==̙ve^NBǻKfwo@F돋IENDB`u1f91d_1f3fc.png000066400000000000000000000014331326020644600330670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHRMlLQ7oڌhi$)"XInHXFĶBjaG$bADD,,3f7יy޼wassse,yLNTE2$:,$- ""7>LuA0+rw^~IQC g6 >M]Ĺ%A@VJw{ =2)rI-~f $74L?%Z5w]\(^sfRdVAb5D|_bYj Rdx"l3  1t 0RF/فPĔ ]+Qى#t@.tF<&x_0?46ErOoD9㛫VWGǚUyhm!8Gcko=|şGtVwiȪϩ"LB5@A-*{&E''~/w (Ld53̍XLxuQH_xyߡfZC'ź<9:Θ) 0d' <9̼dM7xBͦ x2{Cg:ѽ0QXf\jPEMwL@44,xUmK aUJYȪ/i=bX.G)qR-IFKvX> IENDB`u1f91d_1f3fd.png000066400000000000000000000014141326020644600330670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=hQ{33;l"1AATlX[A" ZA 0R ;tƘq3;ݙfhdXOw_K^ t[ȸ}FyB@[#C, f|L(inJgOz. !N-Ie`0MO+G r$ȻV45+ZM89D#(Qc[5slܧ&HH 9~b״q,@Jrrjγ:QZr璏pf>eallMq-=& n6A ]XQ3>C`6s;LkVl25|#k1xgm`Ɂq(lL-J. S!q?LaZƝ=ӳ?ުaįڛ"" D@P+1Ƙ cx}.g=o;+zA~qvLrs~ * SRu~e#E3܁^zU1Ab8gswG%^Id OIENDB`u1f91d_1f3fe.png000066400000000000000000000013751326020644600330760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH;]E̜s=wA  5Gր *iH!ERE%.j1Fm$ngpds}{|&,zgoMl M1m0gm>1)#1a'[qA=u/^K"rGˠ Ο;('za`7@g͆yT0[xUe*#AIU)YjĹ N!:9ŰNVTc6%M wWE1Zbnᢉ O2킕ΘAzCO4Bwi,3a|].t qK8u}EleI"+Լp7ز$sbҸkE`)W?_Jr t7 IENDB`u1f91d_1f3ff.png000066400000000000000000000014661326020644600331000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHRKhQ=efLi U[;Aԅĕ ;]qFb KnDֶIc3&L& m֮ų{{ι ?D9|ip,GpOp.N0V:mLqR&EL{c$8xw]32wJRm$J^*[?y\FT*+su[j(WJ dUQ(9h2 C$.{<㘋|u=۳3 &gaVEZ,5bpBl, 0ld& 4ѵc&q< ŷ&Lqm8ŌU$ADP@ dPB#J!Av{rf庰%STŲm k|$ eݑ~׬;,gvPJI<_Qe tMCZבd 5S'Y=ʲ,7D' B46iF޼ 9" G e('{ ~<>2BgIIENDB`u1f91e.png000066400000000000000000000014161326020644600321070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkTW?wMf&G4U.ZPSV nZ܈v鲐(m Ǵi&q^'L]s=s>\KO.] TN|liߺ$G&o*:+y1A?D"+> >l2&rktPΆ<knAn*-6) WP܁M,pT\}_g~@W)͓UNM=誻8C"&YA6DͽaXORTUBr8 < iID4[E̿jDsuvtH-5, >JHQxŷC\cz8yTUEfByoXJۇ0a*{UsA!*,dvZp%8a CF0hNǯr%JNvStm6u#<3XeUlƕN4Y 0Ma^?XTv]O~%Y5_+Hރ@tnrg9VG6/2,Uu1 v|wʪIENDB`u1f91e_1f3fb.png000066400000000000000000000014321326020644600330660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkTW?w͌3&V"E\UqB)E]_m B(u+n4?+ѶRLSMy_tߘd& |s߻Oт?n, n<<^23+x:Ȱ..@M7EOsBƆRK}iΆ S/2 |n`v}^nmڵ4=} a2_oUUitj?.B\B$YH5떣5mGtwUnI$y6@rye\YCss{B^=_*}66EVl]y[FfoWPHPR S|x.*i#و~c֦4CaZ'@ۈBč'BFŎKqBr1]h;7sW I0"Q Q` (oۊeS)2F+/L~{ˏ77q-4ϫN]G*/_L\c>i.Mַ2 6Y2vݻȕ6D5"#Vu&BkR+WXfNWwG@nC&Tަf WV LםC0sb0v8Uj?'gZ[^C!IENDB`u1f91e_1f3fc.png000066400000000000000000000014321326020644600330670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH;LSa>JE$hL4.&aqqp0Q͡<фHcbHtR - m){ }'N9:-8;vԖo@qYgE=O$PjtXH d%ZL6+I@2喴ϔ4s|RB/xx9'44 `_3V z* EI%X1" vzlW@h6[*xD Yȕ :3*:?PP4"{Jf]&0)_@~DH!!Dz{{RIL==) ̡X!l.8њ*;8lvASG;b+\]C|}aszҠ܎aqءh*>3u+!YK;0@A?Ьl#hTC}u4pk/DQtRp' UJ&j(ZĐ&8,G3>֑>BSD="Bu21mM7o1@RC"20VIUwIENDB`u1f91e_1f3fd.png000066400000000000000000000014541326020644600330740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHM[Uޗ&S;i҅QDpaƕRpJ2-VYK(ԅ+DA u]tR+M:4MdL=.j&1d9 #ڵKsKݙ|y͕?׫śQgF 7K_ܞN[zOx9 {4(g Pruq ]\aoT\9rp?_,V悺rFcz3:ޏُ~"ᩯsGLbŸ^K4zOO+Az߇ _ӱ;.6*"J޻Re/΄Uq8rjz7^?YqP IENDB`u1f91e_1f3fe.png000066400000000000000000000014031326020644600330670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkQso&}؈bՊXŅQSōV+*HE Q[RЕpWkHәEm47w+T'v>ڷZT#rN'~eO\l^H5 ":Z oEkeL5\g= ptrt=.nkzRgu~T x<ӞT/"b4_4ƴrnQ%*J. ;kbfx ZW`fer9EyKN"hz?P(Bl8o%@E*2/b4"xk#8 ACE4Sy:Ӵ)t;w+(h& ٠pԋqKM\iOvV0F&g51T6 =PthzL>AXJYY%j #&BB]*34&#[G4+Po Qkėg?\VǷd`]R8M{d||M.o{RD#SL=0ͮOGvԦa5xz4um)(*dl>WJWZc&L6&Z#bQ{mHD$S)cۦfОub'=(*ѷ)"8Kq 74 h?(jC{O}zD85S4mY45\====UzpUtz(45\7lXmY ,}ֿx[``a UA'Ƕ5U!ugiXuzPC󤵥h89# fj(킱캏 rm1By\uሳ7hN5 @‡7ODX~hMYpF񻔒}Aa@B|.޾C =IENDB`u1f920.png000066400000000000000000000021501326020644600320170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlTUqδCZ1E(D R#!.P ń a[ƅ$P*DMF".)R̽㢅Pڙn}{s_`ߎ̣0 SrV{qx6[1K /v6]^#b>/64@ CRCX);T) ÀH%Rj1Ev*x, gD,헗$2UXv`N[Gʆ?'^@Nu$vZA ӝp4S5=s~r7Q`!@u ԅ /}F+[b-0kT1' qYDf#k20]cSbR[[1()UcXoq޸hb 8#Q~ z<%.C.V.s f C:{ KHۋx|j[ѓލϽ8mnfGkrf |*ULDo|= GVXXDÖ)150WANbf)=e!IENDB`u1f922.png000066400000000000000000000014341326020644600320250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕMH\Wql@ǴJhMZDہDP.ZϮl"Clll 袔P+&)LJ_T e[?8Njyo%=9{HԳ߽{;p]a p1;؝AHݧ&b4>ؕ&`(^U47yP0'/E׋cxpf"f9oM1y۷=wf y{dePhk3"E3[e!2c iK|vaffl@Hgqr喳ܵ^-G[8zejC NP͉7*YviLD D N v*߬ +|юPmb@J# :\i@]hEoo<1!;Q)bPu,GB3FRѦ(K.Za!2/']L9#xZ2|]3h+=S.{~IENDB`u1f923.png000066400000000000000000000016501326020644600320260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d_IDATHoTU?73تS?(FBc iCânqaĄ%h а01!1i4iҥTj1DQ)ml޼vs|w ta@]EVD7n .4z+s\: ݞo" UPʛWʅ7E#-(#K=:)3 !t3|p^9ݟtJ@'0Vd+ O'y"17*#[L_Y ?`=/|MGOW6ON`lW5-}w^r+7 Q! `XG*϶S cD$pa_38{'%ң!WgM0zf'?z7*"`s."1tӝ$_&Y; IĪ/l|ӎjaQ|"#U].e~2sW{${GsH',8ܝIat+}|)X.^ RSbWp=AOGuo΅e΀ P҆[4U>yG+(S [p ݉k}8@Eؓ>9|.Ɔo]؎(z3=4 D,9EIH<3{`q K=z:ʡZKQu=5GUә\6>XpAOAw~9Fjfl(31zRn47TGP'/;LyIENDB`u1f924.png000066400000000000000000000013661326020644600320330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHIkQ^UI:E計f!Q % A? n] AZ ."`bL'uX^s9*^" XfΛ@ul!=/٠JЪX'pQ9g^_-fх^j0n0"ma0QP(W{@#a췍',3uoСe;aˆs'9gTNZ`?0!]3 ײh5OW4|\ǫ`;ݤvڷ,eSV!) z+beC?=߃56c} mu@ :F4|VۄFi}`bhGk,> '.muN+ ,QTxXè^~ӫ`mQ4F*蓆OW|9ʄtTIENDB`u1f925.png000066400000000000000000000013701326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKHUQuz ^FX:-% jڠaPà&5iԃQ^"MRQ(*Ң^yf]>_朵C $^I7С+{qdJ+a1i{5@MB4PSa #t;^. 9/lqTo٬fkFCy#z"\C}Tձ3GW Dhd3bsr&U0rYakl\/݉|e\Wu,/@׷pW51|/Xt9g06h\8ې STU( >mku> >UHd6$%xj# .Uf~ EPE"_UXנy)W8P VQ/# &[P/NW { B4T?k`sk!DR.Pƥq. 7<qX6ŊTTf2I& ]-t6Oсe -NcJ& ]W[D+WC4#EȍvM Mˁy^ HAǕl~O(z"d-$H2IQȟ3g.IENDB`u1f926.png000066400000000000000000000017031326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dzIDATH]h[e$i~VNjZjՉ:Rf&lLaCڋ] e7.d!(Qq:V1uk7SkҺ5MҞzt޿}H96Y2&8q'훟*J:( /s[ (Hrб]<}EA]IyijisGNe_CU@0=]'_b?۰,Nxfy[iu[Sx=E-'y_,jkL66dY]kpjN|]nBx8߲mw #~VE-IZ6̸#X]4b;pOoKf*em04\o #Mrw4A,ޠ/5 BaD)AE2;P`9!|{u5u ;DD@c2-MIT!WΜu= @2/ b(^ʁ'9ݻLZz?i}bcTY(q#dfd _"0˟"T$3zT~a\sjyxP?ȧ$o6ٹ]L/T L.xՑ3Ԯw[Np7WY53ψߪJtUF̦o0c%vFsqUy{E]&{7NzdoY~+Dc+WnAJ=%}QIENDB`u1f926_1f3fb.png000066400000000000000000000017271326020644600330170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkhUMeIMmckg3ui69l!P9;ZDA? RPAxcN1Dٍ:f'mډҭ^ڦf=!m$3?s{!|>͢iO)v !L !6/PRJo_^}v[yq`UX0b[UohlTӽE~o.k0H)- ^&hhhx#ZxhN4%jer:.e> )B^#XwĦεXy3i ŴmIQ\S_yxl|K:(|#cuڱ]Gu*8#ҽGwoǤee 劗H8P䞻g['N21֬f2 *tݿ w}@D%Lt݄a~0ԓX$=qLˑMf* gغ%QS@[;/0-Q#K&X]8}K"jġR)58ygKKzk 2[f1Ι;+΍J&Db +^/4I$SF䥷q];]TY3؞\y%T~{v{JcQÓzMe-ic5Գ?w[/~rIM0^WtL]r˸=ND/+oEI? ~/+Z~!xp8#$#J<%䧟\{UǼjҙ-e ֛ח*˚j\H0Дe&H")IPh4`yRΰ~Lܖ15!/?DUcIENDB`u1f926_1f3fb_200d_2640.png000066400000000000000000000017271326020644600342170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkhUMeIMmckg3ui69l!P9;ZDA? RPAxcN1Dٍ:f'mډҭ^ڦf=!m$3?s{!|>͢iO)v !L !6/PRJo_^}v[yq`UX0b[UohlTӽE~o.k0H)- ^&hhhx#ZxhN4%jer:.e> )B^#XwĦεXy3i ŴmIQ\S_yxl|K:(|#cuڱ]Gu*8#ҽGwoǤee 劗H8P䞻g['N21֬f2 *tݿ w}@D%Lt݄a~0ԓX$=qLˑMf* gغ%QS@[;/0-Q#K&X]8}K"jġR)58ygKKzk 2[f1Ι;+΍J&Db +^/4I$SF䥷q];]TY3؞\y%T~{v{JcQÓzMe-ic5Գ?w[/~rIM0^WtL]r˸=ND/+oEI? ~/+Z~!xp8#$#J<%䧟\{UǼjҙ-e ֛ח*˚j\H0Дe&H")IPh4`yRΰ~Lܖ15!/?DUcIENDB`u1f926_1f3fb_200d_2642.png000066400000000000000000000016501326020644600342140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d_IDATHMh\U}f22mXLAtD0Ķ$ZBW"jv! -BҚ`4UqJǘNf>̼¦yQϽCܮHdW i|.8j$" /'A#0JVּ\ DOan͑ȓ(&\FSET/[U"xn[ wp'lk[@ Mےܷw^݅a8)~9ٟA*=ˆlkmؽI^@m2 Ö8s}O?U |ږvt3"64 y,][Xwg4Xl)Cfb@6:ݬf7eòQЄ&7GNj;8|Xk-ٮ!W~t)yUP YW f>okt+\b1j>K^xetJ-}|'X]ٙo7c SuIX_5PpJs=+e5N^O{SB'~a듬IW Nyqn=(EB7 sWBc_?wD,$b@&qVr(h :A=`?Z͏,P(L%|O >./֠ F- hp 5/0bxkt; Du vYhA^ak ߴ \u'98cKpbZ)%!GQ܍冓!fW,TIENDB`u1f926_1f3fc.png000066400000000000000000000016711326020644600330160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dpIDATHoU3?bO^UZҖ8BZPDuUӊEUb6fbU*$$RB i?Bvl3E;"1{s{/ϟ|3q’ :n Es?gɷU=oSRtTyՉ \?y+j"=r)=g6K xxN+Ha07w>s|4U"W> nansQ>N'mf?+Ua_rẾ xP+omUdoK/ᵺuOO PZDs3Lg^ 1)߄ @LDL@4}~ȷ\"ۉax:w_nSj6r6.\oqLzS-;HC]0G~el2Gg `UJ%@DC Ǫ_YM6kgfMH|٬#)2o339(T Ym uYY^\bq}_˃,'b8jWQ$ɕYl{8:2~hL;Bx2(V`Dx~yͭH qȤ^=L"TO>){ó%|*/dz&P%pC,L?Z?WaT"k_߯p+;+E<%tkxc@f`عda:{ٴdu,eͳ?)9 SuRu: NMm8|ڋMDСI KIENDB`u1f926_1f3fc_200d_2640.png000066400000000000000000000016711326020644600342160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dpIDATHoU3?bO^UZҖ8BZPDuUӊEUb6fbU*$$RB i?Bvl3E;"1{s{/ϟ|3q’ :n Es?gɷU=oSRtTyՉ \?y+j"=r)=g6K xxN+Ha07w>s|4U"W> nansQ>N'mf?+Ua_rẾ xP+omUdoK/ᵺuOO PZDs3Lg^ 1)߄ @LDL@4}~ȷ\"ۉax:w_nSj6r6.\oqLzS-;HC]0G~el2Gg `UJ%@DC Ǫ_YM6kgfMH|٬#)2o339(T Ym uYY^\bq}_˃,'b8jWQ$ɕYl{8:2~hL;Bx2(V`Dx~yͭH qȤ^=L"TO>){ó%|*/dz&P%pC,L?Z?WaT"k_߯p+;+E<%tkxc@f`عda:{ٴdu,eͳ?)9 SuRu: NMm8|ڋMDСI KIENDB`u1f926_1f3fc_200d_2642.png000066400000000000000000000015671326020644600342240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d.IDATH]Te{3.NH*AEF. նDPKmtե^M"&.$E_"Qmں34y.tfwsv}?/%Ko_#DJ!ՃD|'OlzdpؐY}b qLl3'qCĺcwŘq>譭^cڂ} zxϦ[6PV&"X6MCV@if5`bй|kVʄAX"8-Ԫ-C{.OM :tylw-v+2CFlVD\(Kyxv,G"- ;rK ε~Wd)7fYe)lCr^= w.i0::D[n[僓_S2݀.OWSIJpbo<~G-Zw3AW#ivsD c2Fl cN^rlO~ صzx&P4F淌I*D`aoT΋LI4X=0rrs9w/^DދD.ٕW$JVr=Eʕn+ɻSyH$ k>ϗljaG9 _LDDk F-,7DދD.ٕW$JVr=Eʕn+ɻSyH$ k>ϗljaG9 _LDDk F-,7~ /^S5DNp9[JRcC'llɜ + xnco5^}Mʹ}tc9|?"-]$D?BgxAM-65 Z(,T猾qI2 ݽ{\Jog5Y^U1>?;πN!p~Û':%fk:sI~'}yLq`D.\4ԘGpoB[w?ؽ: ^I&&j9hA7kd>uo5]ʝ.1)JDxgD͚?3xKf_d>mBnJKjV}˹gjs1C#ZS*XY6;`u:IENDB`u1f926_1f3fe_200d_2640.png000066400000000000000000000016121326020644600342130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dAIDATHMh\U$L6&(*TP+" ΍]DQ¥PJ Qb I&i;i33y>qI2 ݽ{\Jog5Y^U1>?;πN!p~Û':%fk:sI~'}yLq`D.\4ԘGpoB[w?ؽ: ^I&&j9hA7kd>uo5]ʝ.1)JDxgD͚?3xKf_d>mBnJKjV}˹gjs1C#ZS*XY6;`u:IENDB`u1f926_1f3fe_200d_2642.png000066400000000000000000000016201326020644600342140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dGIDATHML\U羯ctNBi#) 4d0iwj\t՘rajFHL4Em7D-V$H3UX`ͼb `l{'utة*uQ /OrYW6‹;Ȱcejks*<9靍 s *(X")۾h9KSov5ӷxz[YK-J @űIA<44d4b@!tF4 8CRU5_30iC? pleX(11dsY9M΢Q(aRt59B)n>0MD> ftb24:k .S $"݊ Vw-X" V߶ך ZoDf`8;q"ȝD*} n6Ա'J ܮ "QUC,|W1duoin|/sdiX^.ҽӷص+pk灕HȤ)oEpc3W.'7^JsLf~XImnϞ%lhg7Vū7} Pl!nDkәRAL~Kˌd6U:n(BD'5= ~Oؙ'Ѱu'v2H$! KɆh H w}cCn &a=''ئ<+!IENDB`u1f926_1f3ff.png000066400000000000000000000016111326020644600330130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d@IDATH;l[U߽ǎĸNe @H$ԡH C0!̆bRuc!FPGjq|mqb'.6H|=;sX[[Kv ,p r1nikK»m {^,~oTp!sd` .\+^ >d7!<=NzpK]ijT* 'Q/(k/.pF&G"K$J9ثܕ5:= #Hđ>J.mƸQF=Dq̘Zz@qX2 E7{fd^iړ>v#} n{[tvZr97[yjJ& R&=?~x)/ ]ףh/sz_SDZ Y~.}L#:بzݤzdgd߄^XñPM;7v8\FY!|^=0=Q@YH̲z% ~l?n^"K^>-EiF*f'qڏſŝV"oc?!_ɫD"@WqdS˷xuIQ>qƒPND|h`?܆@<-:{^z=N!!ݠ1úcH%,+y-IENDB`u1f926_1f3ff_200d_2640.png000066400000000000000000000016111326020644600342130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d@IDATH;l[U߽ǎĸNe @H$ԡH C0!̆bRuc!FPGjq|mqb'.6H|=;sX[[Kv ,p r1nikK»m {^,~oTp!sd` .\+^ >d7!<=NzpK]ijT* 'Q/(k/.pF&G"K$J9ثܕ5:= #Hđ>J.mƸQF=Dq̘Zz@qX2 E7{fd^iړ>v#} n{[tvZr97[yjJ& R&=?~x)/ ]ףh/sz_SDZ Y~.}L#:بzݤzdgd߄^XñPM;7v8\FY!|^=0=Q@YH̲z% ~l?n^"K^>-EiF*f'qڏſŝV"oc?!_ɫD"@WqdS˷xuIQ>qƒPND|h`?܆@<-:{^z=N!!ݠ1úcH%,+y-IENDB`u1f926_1f3ff_200d_2642.png000066400000000000000000000016371326020644600342250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dVIDATH_le~m ;VlVbNŌ "׊{cBHDob$z1C" b:u+O׵[|ŲuڭxoiW00S\># |p9QBBȺ=ݪlu d^ ] ̄k+4Z0tFUq#>{8XoАII/RGW>Ǐk8}Z(p]O.sgH+qQD4`ō] d•ϯj`i(ԯp[01UHyX\Eʕ׿vIENDB`u1f926_200d_2640.png000066400000000000000000000017031326020644600332300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dzIDATH]h[e$i~VNjZjՉ:Rf&lLaCڋ] e7.d!(Qq:V1uk7SkҺ5MҞzt޿}H96Y2&8q'훟*J:( /s[ (Hrб]<}EA]IyijisGNe_CU@0=]'_b?۰,Nxfy[iu[Sx=E-'y_,jkL66dY]kpjN|]nBx8߲mw #~VE-IZ6̸#X]4b;pOoKf*em04\o #Mrw4A,ޠ/5 BaD)AE2;P`9!|{u5u ;DD@c2-MIT!WΜu= @2/ b(^ʁ'9ݻLZz?i}bcTY(q#dfd _"0˟"T$3zT~a\sjyxP?ȧ$o6ٹ]L/T L.xՑ3Ԯw[Np7WY53ψߪJtUF̦o0c%vFsqUy{E]&{7NzdoY~+Dc+WnAJ=%}QIENDB`u1f926_200d_2642.png000066400000000000000000000016161326020644600332350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dEIDATHAhUo̒nK  msИlĭ)Ƥ4'H!TDO iZEzmQAͦ6iu7۝C$$~C&wS4`AA%PW0 #|~2﷓wpU -Gn%J+ꫡxYЁeOck6@_|1EsBʗ3st%dwS-0Ц`[¶-y@mi\LLnP󌥜{p̦PJ#AGBk+76hC(b]YV O`Glik, B4ufĺ~}[O_u舽ҵZMo{\$W)FDvOpM9ڌ̗&.?kO(IGM p&!1np sf9;[ssU'LcdTM^{Gl%5z_JЧBଡ଼Փ%Q2M(8 59Y. %Vg|gڻt ׁ˲|{ awLlՔ{h)U'+gUp F.V[ߟ:]ӓ^6b"se *FrTSŻ5Do<`  %0f+ x 65m]rgʬVt>R+{jpcʪ0 `@-%2  ӷl%XjЊSJ OA6Ψ^>dq/π|bIENDB`u1f927.png000066400000000000000000000020371326020644600320320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlUUu>K6Kh5Bh@^q`LID ơq a#hC )F+@SV^nߴG;{|^_?KsHԯ6@!*m@ԯ!c94~6mx=*J"9 cA29OLuIU`7դ:GS7&:W<t|R-wl 4W@ld@22Tx"p)Q&N.N! `}e=[u7hAA Qלǐ3o[S<]WV%~D8zK"y@{ڴSx+倥2%YSRApVbRȑ'V9[f*+3xa+ 1#qrH J x%qͨj(`AGkɕeT$K3īv * ;+ZKp)$ȟĦ-}>!%o/ LzC,|j9R9sxGAVi<Èq3{ Z k˛0:(Fy7tسs1(V9-DiF _xޙ$IE%ٷyhu],-mcy68rȘ?\p!%[j!q @E/}ӬdU=w'^Vݕ{V'@D@R_|od=0#|> h-B0t"@PzS=ks2ɜ|h>VPX344n2}P* IENDB`u1f930.png000066400000000000000000000014301326020644600320200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkTW9w:1N;X\*RkY(~l ~PŒnQ҅@%[w..[AQY7~,t0!d2M{D vys\!;KV (hgWZ@ 4f˯o53V*a4kYn; V.ުXr!mI=AezKٞ z!׮)Dl^UbCĺ/.k+(-z3'2BvW6#k>/ ɎXaU1NL[~0 Dz9fDŎhI 'jm:y1pCK=압X+Du˷ jfI'y5я>Uw v\-%2&cDGO0^$^wKyUƁ/-x>HԪn8t۲6xT~?(PdթRk(}quhb,0"E|Q&AG(U<;/'/;"GQ(8L24\ J~7{6{x2st(;IENDB`u1f930_1f3fb.png000066400000000000000000000014351326020644600330060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOHTQiF2pVZeAY(K]TRP-mQ6ABiAIeV9 g <}`1o{9{ys?!566zfRVj9԰}X]NYnׯ3HWn v޾H3Uec;0;h;{aD2S1Fضã^{mhH,0f*qh!|W.0?r h=wGJUӡ(8^2^G9>4X*z(pH>`3kO AFi6@Uڢ j\ $ꪼk ;f-aay&MؿYc/~G[Xx{bd,NȈ*A|ј'͔ P(wN-*vRcsDA㸪S-8u=O.K}uܧ߇ g]o7!_ ML(cq26Ԙzq5MM:g*O8E<-\E IIENDB`u1f930_1f3fc.png000066400000000000000000000014221326020644600330030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHogz`H!A R_ $Kio A/ QqB(|I\C%S%*dYQjBHb8^`łju9<<3 nvړǟ ZWk:]lg/EoyUmf{}aGL>FGD6'MCCnqZJw=i*5^o'=q\4ԽinZRTD\zήiu0;™'/ 7xEώ'Tkpc}9L##Q!^X@M<4+47Ƨ81|;a@#XsU_z_ @>V|Ƒ_]&&Kxzq3D+5',mub=;nuLu.8%&&'%Cd} -lY"0#+[Zlǚ4 kwxKVפ!C9ap ]QPA)\bq sNO'&`Y4+9O8W,\ofvpGCUEdUH"ֺ-g~st 6[g4~ַh=GCF q6U@FB5M_mw21kPIENDB`u1f930_1f3fd.png000066400000000000000000000014011326020644600330010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoQwޙ~NU!MCGB*?`v,? aۤ$Z! 1&3iδڙy^ U"s'8{s̞=ޗ6uҊ9"/_kIZ;$hFNR掵?XRkh:M ~!"G";![lZ@v'._ʾm:D)!ӄVv5FI4+;[YDؑZ T`&w`cgց^XyV:}iV:S PJؿm5Al_\6@LKcy_f1R,W(+RlځTk<=˲9CU'gx12մ 7U/')rÃ˓I"B? \bwF[`5ۇ5X~ x䁋U\jFC^ bꁍh^[7l kJrUBj )?[\<%[PE+Ef)sЁ#*;K`U?r2Qy2EG^S貓z@]wpM@o >>FHZ璻Ϝ;hGG KΞ?eޢLdW&e2sf2mCjچn?Ac{3HC`IENDB`u1f930_1f3fe.png000066400000000000000000000014001326020644600330010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMOSA.E>`p% ΍] .D? 1!$jT\ Ui,VΌ #hg5y9snf?gWBXaX,'v֌ AEltzYFJ6Vbh4*6HN¶nxЯ2!ZxS4] ؾĞ0G">R@ u_9 hLz !"U4CJfba;0O5XbΣxV.TLhRз+LQ[]a~ `w I|jRYb.4ל&Xiw`16PhGE^ L<䙚nr02ϲ,M(Svnc{~UP@60 ty/4;si8Xe`( $BR`#;;W%ia?1& $F|=W$O@a;K9d E(BdHP O= @l>*9!¢TM9$"38Ua<PXQi8O=y@shL^Au|mvD^k<5QruquK\`>XG.L`E~ͻ83x}LVSw1~1LcyIENDB`u1f930_1f3ff.png000066400000000000000000000013651326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKkA3MMmhzF[ ⥊h n}](/ Rt;#"ԶIIj._eƅDxV39sȟ/=4tZ{QDD44ѲJBѭٷD@S(fIՐVvv1л:&Fwz._[v`ܹ%x|[vD(bɯD8g_E{(V|He^_Je3||XKX&_ "-;0ZQ49ǁ]1v֘Mgq4uN!.})sC@ (Ko u[W!`TN*p:AݣR9`%gY`洈ñ>4*&hoonW|75gdD3u[AFn"M9uGT"jcl} cuW)LEaC$sEc'npcox awZU?| KD>[iSiLHyuwYH}9?ND :OvʔMϝv ޺`ҤXF 1/G簳 :N3d-꾇'bْߠcTa!vMzV,_ 78\q8/mJh*nO*w/ׁ/q@9$ _'e`N"X"HUx!AߙZ9r~FVD`(37?rR "-BZ)R"u!)=˅/p4AIENDB`u1f933_1f3fb.png000066400000000000000000000012611326020644600330060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dhIDATHOHa?SY F RFBPQt٥utC١ FBA!bb8sۻjI;<~x~ kxxd,{<[7 EO׍`0d39x<ףR@9s,m;!"4%m5'Wee|_#&B~#{ &S(';Rq٩7~fi4g(N5SUX5 xZnu5̬jH 6d&fG,fǥHbȽmۚ64M-pK0vN#Xd@y} d|ܕITpa;zS1zۍѼWѝFL hs _ ?⎞[sԢr3msDb˶2 <bz_&@@-+YXK>Ufc7"rp\8YVX~-V-2MKxx{ \F'[#xEWk-z,0E0"#BF}fTp@W8nIENDB`u1f933_1f3fc.png000066400000000000000000000012611326020644600330070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dhIDATHKTQsMjke$5Hh*YuYA`1\REͪh(PRqqPIJg༫y{8/+oiiy4H$6}o8 bnu'R78ͩD}>5 HαIH 衻spmdCV;3I}Y"| jI ϥ"y9pD`1jn4aYɲPZWW)*5ć*\ 2ʲby'ce8zpSi/P΢mоfzkP?8`ȭ nЗRt3thkPo05" ]::|e[l{jވ <]^U=9B9|Xb_!N9 nÆv{ζMuv?l~V-:5, eݞg2ϵKDkGfxQ+ŲHu*H@._]Yn P#[o2$Dva"̪Nj 0%ػYr\]iY|M,%6G HȈQi fd9IENDB`u1f933_1f3fd.png000066400000000000000000000012571326020644600330150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dfIDATHKq_n9$Yұ<%R:::Nu@  0 Ћ!5!Is:}Imn=zcgݫy<88ޕkp8vMtDoqF۶k=oHqq1z,.g8c ouĵMMMK|HTq9O (@f| RRbDP-"T2/)u# FrZZűO|FYU .2ճ= Tx Ohu}{ wC TXIFY+kSԎƎ-3ѥgV(#s{ڨpyQ*pKݝq9 ZkJ2^/|nlOn>E =t,u][ 3#ϲ ڂzR_5Y>)?PP/( lŹ-@ڃ;omL$Ti虑\F0Wr $\AYv?,fGZ5-ֈ^1Ub"DU90~gJ  0~IENDB`u1f933_1f3fe.png000066400000000000000000000012631326020644600330130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|djIDATHKQ3|8Nd 6b5BmZE ]բ]&ZA / FZ$,+ȜgFg¬(g{={ p8W__ddd~AvRbe!fUrn'$"PCV84'To$']l(ip,")J"id(w'nQɛQLbgU wTch<],@_I Z?'=?lު[߂@׋bm= J.NnwvLcįP_-S5z{nj:T|tYa{8x;7r*gX oս6!`#]4l8-آ}Zfrs>g$ krɓP@=7$ ۄw$P(@:?ߕ5 JSZl";+sjx.ARq wKK"ȈfS1٢g BBqU9N(DLD?&F4UIENDB`u1f933_1f3ff.png000066400000000000000000000012541326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dcIDATHMHTasgFghH!]0R!h#ZѪE?kڦ@Iˍ"hJ rDF6 s}΁9p8|A0x` ջWBi0-g(.-м X/}{g.6cD_ ?$b*enܦ9d;[E)Psspfִ\/'gBu{ˎwד V]MwJhJ~^%~^_zMV.!߸yĉV/%lw{BRM KI͐ѳ\Qe{K\u\ صQ\w2-?½Sҗ-Rms96"Bkߌ$r~Qm%%BJ1XfIi33-\+ĦEIENDB`u1f934.png000066400000000000000000000017511326020644600320320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTU7fөR mZ4R"bLlBqф&h(+ucT`H⢖Ec@MMֶVmgڙ7{] 3RLss9U2$, u ƃKvƨ`X-/OK)\5hژ cf${Ep9Mj|:w8vZ8JA๼+%@mMlSh;ú '$ j_5{wT{< 49rsD/ww#"h)BiְdLF8_T/Qk^/TF DK!wʒ=̃ae֬PsR{V=H3Gq]X]o՞0+ǑB A5֍G[&~Vn+/E<]MoY`R/(`:jF:&Q?.`ryfzi챖C"c$}t&XL01x& -s,\dgpGg^x$ÞT;sQ&"e7pq.j#6ZJdHzM6e9vh9 hIOm/r59;hң-{v݃jAHPVK$dQJX]X6DL'fq&Lu% ɷ~ay?dKf::f2WީRb:} xΟoz MJL`VRX^V;)ƧV<6>)~Yb_ Yu#).v=qp۹OAkcMAkc5no맺|9}kfVY90cIٙ+,++2IJz).++IHټߘ3KALx@R dmPdnaMfnaP-]N$dӻ7IENDB`u1f934_1f3fc.png000066400000000000000000000017151326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[h\Uϙɜ̤zIc\PO"䡈xCT7|_|,֚PjZ(Rm KLLˇd$8>koA,uغ| |BDg2L);\(^N9dA,q>g>ׅ(9]K>\ܺ6@6=]c0Mu#_Q)i 01F|D|DOYh/ l+X ue o'W_j"F+ȎDmǃ%UNRSwcx+{%K#;>U .Y>;#F&@:m-T]XF(cLNVL^ct=y\~ŷ!г}n-Ru;F]#𦛧b_KYƦfNS~b;we0GSxQ/Q0`~5_;>pCG1G"0,ثw_7Q;YIENDB`u1f934_1f3fd.png000066400000000000000000000017461326020644600330210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHML\Us_FS$nZIcJ\nZ2bTKL5Hi&&5ƍI56PMH0MB0e9.@;=~|WEo0!'͡7*LVƈOl!㋎}/Gt%0cz9ֵz- W<@o>WeGnȥfFݹ @Zu gε =u_osbv)FWWJfhj~O=C]" |=[ ݻ7 sHXYeY'O,aBNp-PؖA4@kH[3a~gr6THQk5u!O5-xe+!GJr`fL[:s| ށʆWSS$RH4Tn)֦(˥ihB@Wf[3Qs_ݍ,kJIEx%^Cotf\I>mA|SЙrlj )n/K:[\ev~Xgk Bd9BHo]I6V4UlcaϒROH%s؆Os`Ys_!yPҽDZ#+c=nuaWJCi%hYK0B+]n A)le  l <|["Z_X ȭ'o-3tq ]3MuGuA>-O-WH6T׻<%m艻wqm:?Z2#׈cQhPBiBsﳲIH^ Mfп3'>M>:AIENDB`u1f934_1f3fe.png000066400000000000000000000017041326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d{IDATHTKlU=6u4!ZBYAUذJAUTPe " 6Eb)H T 4kgoex4L\Y{s}%«9OE 80cVjU-8=gsf໳5Cm;7ISbEFڔ{xn-'c D6ri˿¢e2Xx$1X\b:@l@1ADŤ3m]Su%ur&4T&5w ʯ 8*-DMM~x>/3cb[|SYP;s߼ЪVWVSNώz0c c7ץr֦{B_p WDo1U_:I|3)%p{=}pܥ4W3| IENDB`u1f934_1f3ff.png000066400000000000000000000017321326020644600330160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHo[E3gHn!I+EE bT*,XuB % HЄ(AUZ ҸqTJyN<$kIl̹ߜ3g\>c nr:hQ^ kp/S8 a{3]hD%!٥efL`T.fubF NemԽ# @g{m!" +֚w: 5.~@SMK$FpWtRGZGpZMN$DWdTSL&5Оޫ^@1 T9\6v6Bئ+Fh$ML>|<-q,`"HW734yТ2tׇѼ ">y5ڢm3pdnv?5e, C Jۗ~,u{@g[wV#sӯ>TwIENDB`u1f935.png000066400000000000000000000016171326020644600320340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dFIDATHOLe?OmߖFqUtXZw0Q/Ȉq1ză'ĘɈL! qM%jM[y<+m)K?=>?/WN=5-&l[Rܩ Ư~(;D,q`50]q8|r62TX..]onL7_;um]@6Gv4m]|+f$Jɖ@A@ Og!Xұެ 2 EIl)\RFl7?n`:C'N2oR=EqoNEnA6o=Zx ﷬Pt>]U >>ޞo,9*7]qt_@xȑ/?oz,|1_x5z;J{?]@JOWL5|*62c׊ZiZuGC"v˪iƈ˵k.3੓'M:?wuXJ.\j b^II]~ 56qlT;WgF 1Q0*U(^ D>2<=O^jBբ_9`$`03vThJsO>b}pxv/׀[c`4SHD !X\\$o}Dox0 h4*,0Xn2x$d0(]ݾUjYRJժ._7@kem]x< DQ4>r\kI-A(YXX؁nG&`0[{RIENDB`u1f935_1f3fb.png000066400000000000000000000016521326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|daIDATH[he$Y&&hti@6&l`iFF"(h'K EIECԂ-*tӇȖҬ$6lgg>uoY;9ngtvvT)BQP]׽ّ̜@8B@Q@xMUim +3qe[͋%@n@0sճlEo])c$B/ho˒Rpty[sNt)%=!!*dmڵ}ۈDXk q7\ȺDi;UQ iw&\=׶݀4pN)wݕO̮_8~GEQ@6˟ Kr9@GǢeY'Bо1=5*RJYV:ޟJض=$K mQTU4M^|/_eH$,d2Sϟ s-–hXhϟ \+ rjIENDB`u1f935_1f3fc.png000066400000000000000000000016121326020644600330110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dAIDATHKh\Usk=bbZ[lf!Mpuр uN")+`i U( Be a$cc&)㼒;OmpᇕE$ @[5uJp);Q+꬏*-=y|lra˂lvڹ T|y3xdb~:W9 8Cl@69"찱%¾ }U/5Xw!6N<]D\D@khmPukKFK&nn{,+?pKg^4?pZ^[ K,(H: 8h.rWo |h^ 7ëkk_:pcڙl?yHR(șk*;֮-/#lwz4;闝zN#kDpȗw&Ч@u Wлw;R ) ؤ] #Z_@H,T|X$NOb,@ϱ+ėsb xJ&2xwG Q#].dfgg @y7.ڶ]~{= +>/d&tz_ooP(Tf@U=}}}0 !7| Jav-ɿQakrIENDB`u1f935_1f3fd.png000066400000000000000000000016311326020644600330130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dPIDATH]hUwtwtl? >D* D[}c% Z" "ҘɃ_,ֈ胮 5P+5$Mn2;s})y{x 4%U p9yvfFdQFˆ1:vŖRR17 <, LYm>v܏+;u3[.^o]@JxN]oPR)St] 0'8YxM(ХaHL]cu 5 ]kʺh?,/x>y=KEͶlC䋛77JCװ!uv}t.Z;ar"?\Y~# @W{ 7bBrף=A2Ѣi]qC}̭i lz3~ ['e}k7  )`-b{\D#XEMKU=qh4i| v|%./\Bʾ_Mhc9qlPY(<R5vaO9SxP)5^.2 _PH3qWG/],/RlO.E?|:[(ҝ`q]7Ӈ+(@9F",+LZ9>p&Ķm?5՛E/` ,,,ຮf{R/]`+RyFI& a&VyH)}_5*R zڃLMMq$/%NبI5Agg-m-L&@<uJ*'_;T|MIENDB`u1f935_1f3fe.png000066400000000000000000000016101326020644600330110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d?IDATHKle~wc'v75A) E1/8F9KCUDpG8ā JAH r!#PEP+rHc)R@&k{;L"׎{3RLd?*< +aC\UY~ua-2xVo`ŗ׹ſ:Lf2VZ@ͨz6_lxsquwP╽^L(&''ugYZ%@u tgs(wDTJ TC9iEPDb R% Xr4S;|Xop;n뤥Jv9PFӿ ULi\K1#Ө *>Fr7 ?VMkKWJIYͱ}3X)Zz Nע' CDZ \YgZ<]w^ DWGQlz7괙1q]=T*T^Ym&/,tߺ'Zk PK"Aو_k푑czz\.Gww7r*ΦoWdiii<tu5?  $.IENDB`u1f935_1f3ff.png000066400000000000000000000016031326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d:IDATH]h[eZ<''_i\;HwuЋ1Af+Va z1xceB *ʰ:CYLҭkm|^Č}y9sMdrNHxR |)O. fG~x)/9R*J0995tnzP}LV?G_S@ '~h:EQ3mP¡T5z<<@UUtEA7~04LFSl}!~l~=W|鰾wObm_#cQR;%Ȯs6Cٸ jpVrjTdh~ҴܮphZ1&zd !0h_:jBw\x3uUo}xR7zg &Xܻ=:B,b~W0];W_b5$Ogqq\.<˘ vm+>E2dhhUP(`6euun-w IENDB`u1f936.png000066400000000000000000000023011326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dxIDATHՕ[lTU}.sf: Si{SZB E4c&Z1">P5!xyP(5"j4xcIƒh$(bP(PZJ;v\CC-֘Jvr>Zg/ wFQP/.D6cWޭJVLMH˻D@(%I?ŏ_4W9lmgT÷4:!Y=m?HQ3i[/N%vh__>2\ 6 291qF졯S5 &2G/^7 =t# 0&T ]ʐh9waDZm7tDydjg5g LqHңNwh/p5Ž&&;zcga{c{g"@.껬(xQ-.}!i ˲BPэH' RyW|vq㍊Wd=l$6jHw;3!l+~r5^ j 4 .#MQύQ8ly2Yg_Vf7y.o[2;ΘF"W0.u"11njr#Ӥ΀;Ā;DOT'-W7qQVq\iarәT8vڭcdnŽLLb[ Ub`@엧v"S\F~=Ek+3zd&<#=mOW*f߈Wn.[|=QgrԛctZպp+|eڟ>!lVIENDB`u1f936_1f3fb.png000066400000000000000000000022271326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dNIDATHՕKlUfN mi my< >+y +c$.D]ƨ*;`(,$J (HӴ{bi)ݹsϽ&гQ?XQ J(v'/u-=P?k^9|SL~y䏗Fd.V^&>;6kқ N8,6_G 7AIm(c`_~.ЍcBX eJp`[wm>&]Զ* ~ڊ+PCœ{n\0CR e! ]?g5ZxiɆU&ot7)?`.k_ AwSh~0oVa|#J)M>=UGJO PxysP~IaRBAתjQMs@ O7'0چF0TŲ(/PsUGûLޓq MLa%+cgý~PE$ lUn %t}E4)E`w^1'PHJuWUW?#P~K\=wͦ{J GNu%39|EO`ildL\`EST]EƦH iBzד 4bYŒ b|:}TwMt|zMkU߭1UӾu470 1ih`kK3[8ZHY +IW}r޼7f:Xը@tМB;G iFA7A>cF;;%_Xsyx@(Hbt hj|ӲЌ X]rx!þfJ( D ?GNpΠf-yK>(OsL+D':RmB x-3\N@jn#9T&˭64 6n7G=@_5!;ƈV\2) ! v2}̝:.>(֘ss!-7x5B p2]•2u_\xZ=FCpcOOmHLhNJNeFׇmdk x\ن6I/3]Ț@ \4,uOSG"1O^L0OIu9pu[>4;E_eی|Xx+_,|v)%F0ʣs@IVrC~9kNo=vKK\}噛]j@/ii~Ps:@i&6\8T'931 5%T5NbL=y/ptX Ǯű,\F!&]4I((k@ GBZ3#X{þY,LȲriB \wFGf <|3ocˏshv3X,=@sq7d ZBxذ[($<ϓ0$d$p us! B >#HwV$L{s{18[ǩ1SGLύ Kqz9rR$L:{Q9Di//QPDJ)$ 3yTGBpQNBi;!YDiοنjO'7Twr6lUQ^޸Iod S^emM5k1"6,dOS9E{KfwCLL }+*P+p2Ɍ!\k}EGV\sc]SK$@D}}qp,Й.-Ng yeCl tp>}.D,soql[VMrLb% J?FoIhy=e`/i׶~DI[Mn_m\ߩr=mPSUF /[B+ojKsK9};s_*$RPզ'ZcqL܅Džעѭe ?PIENDB`u1f936_1f3fd.png000066400000000000000000000023151326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕYlTUw;KN t)Ц`H R"&FBDH񁄨H\ bpI5! lBmc[i)N٧s.>NK[1sYބ~6w_;Lʤhe7ފu+ ks6 p}]~Om=E;^'s+v֥D0[Tv,'+iG)~exV`:lH0dMG9s\9;]Ʋk=]BldST 992\C!4 <e~PF`5e ŷe2jFt.[W ɱQ_6DSblgIb(Q\Z[-8@* 9dx[4ŦY{N #NohY@%#whb-f7S"ęƕ[7ViVg1τByJ!$KR'?wF)=fFKȅ-١:x H>:1/m۶P5=1DVgM;Ҹd@˞޶qѽH#x>shdѱZD4GNWT,2cM)%hC@3&@s{RQ{:휬ًf+ɩTPyi[4T)蚂 !|e훌amߙA pqoUS q !]E!(\Qzri۶'teKpE@3Ծ%"%Unau,PsĞk8/E]Mť`,1毮[V..Dw̉$[[^&%T;rVUU!c49phx -t.krҜM(Rni|I &S&I7-n/52F}ܑyH IOQq^630M~6Kܞκ~5"q`Zyͺ*\f\f:k+6ui6qfdU }ޭv6طǶ fZ ԉCWQzs7nèŻ~y8d}Mghיʰ?x5wc &pKƎY]A@;+5@ꐜvqh0ҏE(yIENDB`u1f936_1f3ff.png000066400000000000000000000023101326020644600330110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕYlUf_:SZ,P.рU (aEILH@0&> >hbD\,,a+AҽelwS(Oră6+sӺeDUJ(]&4n(SxB_t,?*\~:*'Zb: HpaְS)+5Ymt~e<2YipeT̻Q,\ DuNX *+E-&Mc5X>fY;uO*"k֋Gg֥Hbf播"玃nrˇ%m͂-;&R5Pɬ!xrL/K©'XkWu\ gj(y )\ɜ1B]&%܋NO$H TD6p++`F)1G|Ws+ޮ.Nv5Rga4 tMCIIcULӠxJ)ޙ/ L#鉳_e4hoowl;- pT1P-dB|Ԩq6%t=';;;ĀWg,/پA-;@h5v+MS~{V,Ɔ̡`goH-e%ؓ ֮v6^B vw稏7+@/!dC(ڮ]A^M4M2FaqC4߬GVuZ7C!G Urʞ L'ДVc2v#q\vܶwFՐ,h T*/lGn vxhYtAKC=]Ł$sGCEW)}c4'[(=h[ZXųJ)8c:T=@D Ӽ0 woMaDywcG/!3^3ņhf[٣~&ZTw·f.)L p;)/uy`4ņuDM/*æ[3Fdеx018<?hUNƊ =PZ!P(~2"2Kyxp̈B(P+mWvmطģ ٻ;\ l5OzKR܏߸XU c0.O'l6E%" "_.l1.Sd;f,6+Vvb}ɏ`t>tr鬮-%:P A^beB$s#?ʼn_&9[nB`_vuav!ß}O|Su`Ҍ|r Rgf**@+r ~2LPh95,Δu*-oVs\JV70T~DEo@qj(B ?L~겘\]piW x]`@i @f)?:ˋIENDB`u1f937_1f3fb.png000066400000000000000000000017041326020644600330140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d{IDATHmHeusӶZ[.QL(17a5\ƈ^D"pk-+5$F7Vl;y>9GqV}v]_}!X__o9GqV}v]_}!X__oΏ~~8;GAUEEp&>>~q16yk&3vo'Ԭ͖Ywצ[g`x<*f])#3q9T^A-644 Q}_J_o ?E93 @qX] .<@S##Xx!,u-.EkMZ+Em ނ(ZN+`[g Õ6DzVA8C$:Z ';ŷIENDB`u1f937_1f3fc.png000066400000000000000000000016531326020644600330200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dbIDATH[h\U9st& Ѥ$ڴ$ ^Rۗ&R[)B_Q bPԢ(V\o圽}dɤV_^/>?k% :zK=8K2MhD2 Y'> v3t=}:zEU+ս8!fi鱞͡2ww@)ED7d Lo"K&"2 'V[gPXM#x+&DCRQX{7,/ƽfB,Hmv@$ uwA*OxH~Ҟp|_MGS"L$(xO=[F~;Vd_b#3؏dQݮ/d14?qz`tx,=)6+\'bȗttɗsmu8Fv<|)mOgbr=jcaS3j*G&԰{8ٻSa>yOYޮ߆Eٙ`cXfrR/.!%zRHek͢]-F_OcL1L8wPWm2Rbf{wMlG0rv _pFf^_P*:>GifWGwmy Ǒ;KFD鶀 r.@+T1Ϫfsg)G|^jY&/ v:x=XN;0 0ӠUWTɵsKhw$dg%V= `%?k% :zK=8K2MhD2 Y'> v3t=}:zEU+ս8!fi鱞͡2ww@)ED7d Lo"K&"2 'V[gPXM#x+&DCRQX{7,/ƽfB,Hmv@$ uwA*OxH~Ҟp|_MGS"L$(xO=[F~;Vd_b#3؏dQݮ/d14?qz`tx,=)6+\'bȗttɗsmu8Fv<|)mOgbr=jcaS3j*G&԰{8ٻSa>yOYޮ߆Eٙ`cXfrR/.!%zRHek͢]-F_OcL1L8wPWm2Rbf{wMlG0rv _pFf^_P*:>GifWGwmy Ǒ;KFD鶀 r.@+T1Ϫfsg)G|^jY&/ v:x=XN;0 0ӠUWTɵsKhw$dg%V= `%Zģ |Ri c;F62Cuͅ6K޷_|?P.;(Cdq3799C{7X r%p}h{* .gVIJ!@S3Yv E'/UA8!iSl"V=}}Cy%9-#;|{83uby|m454E;}ۢYr7|~ 1;H|]eBz8zR"TfD[T Ժ>^ządfnpUT)VA=v6r\6-' b!ΈENuO|JIwPneTQ˔?BrGw~zF~s/ycE{W8:amF&8~fݏn.е;|D ^ U#ɞϲߠݸ+U%wKuw3̅xA?Pu( : ڭJD}l#Қv&vbY:XUhgS4Vpd`BH"Ex>}3˺??@X/*#T:O8/@pG4߬xL.75+9+ErrmN qi ^jY[R*hQKZ|n3! ֎X Pf{L*hC jJ3?DIyhM&C5aZqr b꽥ұ*Bމ;pR`G9ULs/ycE{W8:amF&8~fݏn.е;|D ^ U#ɞϲߠݸ+U%wKuw3̅xA?Pu( : ڭJD}l#Қv&vbY:XUhgS4Vpd`BH"Ex>}3˺??@X/*#T:O8/@pG4߬xL.75+9+ErrmN qi ^jY[R*hQKZ|n3! ֎X Pf{L*hC jJ3?DIyhM&C5aZqr b꽥ұ*Bމ;pR`G9ULwaIwj[& \8w֔SS7FEfѐÆxte|W-{D=W_]~ɏTLg>x޾ҨbʁF&8ϮYٿ_Jt\K"D>n5<:5wX>~Utiԗ=r݅^nI3{~S4 k[>UΌ4erAHJ,<~'5M^wy4Je||@p27<ngCǎYukj-)#㖱] H4}): z,K JGS@+b[=p~MU VVʶ#?ÿEM0fW*6*<ʱ Ⱥ֑+7()Ý*wlZC8.aOz`Nъ<ͱ<Z46~3 )3)啜vy^̴͛9[^p%Or/r}uI{bM7 s'P1 ?k^=·8hh܂5 2Lg+kjwBhA$BwYH/)DR oQ3w@0nIENDB`u1f937_1f3fe.png000066400000000000000000000016461326020644600330240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d]IDATHKl[U9׾׎NJBR$M#DvA@*M,xPl`łH !$$(EHHW7P*]C#Vxj,y׺Os@S981f ]Grncu\Jc=-ƆzU*0̝:mI۴ysKWc`}1z{jgqJGj#@&qMФPuMT(L>yRƆ{ܹdS`+D_+1f1E }I|qO/|ufG'o9wp=/ #THDR/((2LϕV i(,#iQ1k"2QI=Ľ5bMv8"dVZ%Y9T*vx.IENDB`u1f937_1f3fe_200d_2640.png000066400000000000000000000016461326020644600342240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d]IDATHKl[U9׾׎NJBR$M#DvA@*M,xPl`łH !$$(EHHW7P*]C#Vxj,y׺Os@S981f ]Grncu\Jc=-ƆzU*0̝:mI۴ysKWc`}1z{jgqJGj#@&qMФPuMT(L>yRƆ{ܹdS`+D_+1f1E }I|qO/|ufG'o9wp=/ #THDR/((2LϕV i(,#iQ1k"2QI=Ľ5bMv8"dVZ%Y9T*vx.IENDB`u1f937_1f3fe_200d_2642.png000066400000000000000000000016671326020644600342310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dnIDATHKhU~ydICvI;)ؒjmiIՂtU'VBBЅ"nF"`Z+BTHUZ&|H23M&IՅù:Z:Zoh߂ {9}_ܽi*<b`͑OttlXw PhFvlཅdUn1LZZ%ဈyv1V ΍@YrKAm&No/hc6]K6 .kc~ښBhM70D9[l+˳6Y*ygctUfkcYXXҟoR᷵FUn̻;[~UxƠD #78$an9#iԶ:=VNubV}"o˜LM|C2*|xoP_ON>9Uz7s{9-ʱWTkFt#賐 DG/G氫s?4}Jh,خ( )O+DAj8'^Zخ3DgS2Ҁ1Į+jVVd?gxL׶mAh(TU -yM;xu;Y~fuoFn l.\ ;}89TD. c2>_S%k޸5Qyc .>~/1 ЌAE1Ca)buڋ5S{$TbM9ly&?o\1}.(-+R@mpriAI#Eˣ-CF"mdz_^wѥIENDB`u1f937_1f3ff.png000066400000000000000000000016241326020644600330210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dKIDATHk\Uk3g&Iv24i&$5[DxIA (Do}A ZP!x{ЇJ,sIQӚ&f.s탙KiZEq}^Zkא&pm]tX LN!*0֦D,JV[3{HִȝBỿmN&gysTuJ'LR!#܀AQM'Ru tw21{۵rW/Ns \nV8 c%r- W\<`n~iPp&Ԣ[[JHGP>0[g_{(5?Rv"dNIENDB`u1f937_1f3ff_200d_2640.png000066400000000000000000000016241326020644600342210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dKIDATHk\Uk3g&Iv24i&$5[DxIA (Do}A ZP!x{ЇJ,sIQӚ&f.s탙KiZEq}^Zkא&pm]tX LN!*0֦D,JV[3{HִȝBỿmN&gysTuJ'LR!#܀AQM'Ru tw21{۵rW/Ns \nV8 c%r- W\<`n~iPp&Ԣ[[JHGP>0[g_{(5?Rv"dNIENDB`u1f937_1f3ff_200d_2642.png000066400000000000000000000016741326020644600342300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dsIDATHKhU~sy .,ݍW;Vdx.J>ȅRⷐ+(uawygѳӷnspK@k~MOu(H$T$OzPmʐzb"yp5qjr Hlv*>O[u=To8N_`d bksl" k,J@rk)HG{ ;kj]w9w~kYVã޺$F~n<aq+ .i]UM3T0ޓ'OoQ`ⳗ:v|UoD\%RBդi\\1XبRᷞ9(ƞLIWO6E(G=\΋ƇGG=`U[ZXųJ)8c:T=@D Ӽ0 woMaDywcG/!3^3ņhf[٣~&ZTw·f.)L p;)/uy`4ņuDM/*æ[3Fdеx018<?hUNƊ =PZ!P(~2"2Kyxp̈B(P+mWvmطģ ٻ;\ l5OzKR܏߸XU c0.O'l6E%" "_.l1.Sd;f,6+Vvb}ɏ`t>tr鬮-%:P A^beB$s#?ʼn_&9[nB`_vuav!ß}O|Su`Ҍ|r Rgf**@+r ~2LPh95,Δu*-oVs\JV70T~DEo@qj(B ?L~겘\]piW x]`@i @f)?:ˋIENDB`u1f937_200d_2642.png000066400000000000000000000016631326020644600332410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|djIDATHMhen6fiIk@>DZI+?D'`V6"b%&MR؃jk[MLTdy}fw]9=yfk غ5[4jc75d{b PE޲"*.ke#G[;@'Ԑ=jK$Qƾ!9R8O AxgQd Iey^-|sbU|Cxj,ISxǾ)p6诣oeZ|piD|ه"" Ѳ'wg)>=wIENDB`u1f938.png000066400000000000000000000014601326020644600320330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHAhTWseh5tJ+*V[1Ӕu%Y";A܈ .`.JpƶbjA X$y/.lo"8?{9O% Q5Yo;,-5sH j"!RtgZIxMu܁,3 (KXcUe+ PL% "T?^9&):~fRḧӒdis\])C* Pxϗڑb^1tEA#vxo?<`0joj "M?OU Rһ!m@ @yH`^rknDt@M<}俩S1>Y! `IПUj}]V .Wжs܊<ꮥ֜ibE?h~t{v_@|x S^ո6rYsÆ7<w \ Gȏ;QTDㄗeH4cYZ˼o3jnapha; ­VEXfMW" ?'eodƫzc^aG2Pr|Ɔ} <*,g~_\1^r 9g>s=^ *>}QDwwžr\}R҃Խ ]󅟮/=pD2Ft<;҉#Tf|O%*n)IENDB`u1f938_1f3fb.png000066400000000000000000000014741326020644600330210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKhTW߹7I< IJ+; ԴTW$. F m}শuQR ZZ NhTTTqLtcfޯ"x'yΏ;ODdFT5Hx@[|+D섓E])ؒ+k`ʸLl5:\>BV(H`A!h>A`x~/uK $P1RBx[DKB21춏o99'xM$"fpi3&48'0S#_@na(7eug ˝ 9[J4P'2T Ӿs!-4~U9p_(Lxw±¿38S9a^B֤2mոSg8-^>_D A"f?So'{]V7F*dYyuԩ 6PQT*jgg>~yVW+f*%ZUE 22w/;_=+m_kGZ~rbU~N`eJNG&';<4<84` gӴ^oIfF:_^1/0&$cO;|^˶Gf՟l)u'x7ٝ ʗp2PP3(JPer8!*POIENDB`u1f938_1f3fb_200d_2640.png000066400000000000000000000015141326020644600342140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_h[eIϺn\P]WnA-,L&F؜8DA a^M)N'8E\Vײi٦i$^/lbHs*>pn^}waKazj^k=9.*UOT:悝[T8ㄢ=We-2ܽҙ_0Fkh%b O\x"?u~ךP2+T<˒` HmaQkL^]9 \QT߶z&7~1ˎ4Kl[)<V)`cD#N(zEIUV8k/SW8L-[TQG=7v&TZj dU=dQϙL6hl0HS2nߠfXG< ΁OWB\B]N8`W^S[6JB)n_ D7y.Sn5AY/vptC#sG;~NݵkÕF5"AzUuO"s]M[蒙coE]};!Xɚyq:T`9/76: pB7~߀j k]un%hmjLWD?{vR"Ngiޜ*}O@A Wf7}sDz% #Z`Y3w47^h%y=76ǒZ8'u:o>IENDB`u1f938_1f3fb_200d_2642.png000066400000000000000000000014741326020644600342230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKhTW߹7I< IJ+; ԴTW$. F m}শuQR ZZ NhTTTqLtcfޯ"x'yΏ;ODdFT5Hx@[|+D섓E])ؒ+k`ʸLl5:\>BV(H`A!h>A`x~/uK $P1RBx[DKB21춏o99'xM$"fpi3&48'0S#_@na(7eug ˝ 9[J4P'2T Ӿs!-4~U9p_(Lxw±¿38S9a^B֤2mոSg8-^>_D A"f?So'{]V7F*dYyuԩ 6PQT*jgg>~yVW+f*%ZUE 22w/;_=+m_kGZ~rbU~N`eJNG&';<4<84` gӴ^oIfF:_^1/0&$cO;|^˶Gf՟l)u'x7ٝ ʗp2PP3(JPer8!*POIENDB`u1f938_1f3fc.png000066400000000000000000000014561326020644600330220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[hTWϙ3fXS0*EEjj*E|@E!Q" A#)-T*R>ҾT1X4^@Ӣ"1hd&c.gՇ Zefq>b﵄,ikٍ2UzBX@UC(_̐=;d}PÊ،+xx><-"pUW``T$mApm'iT=.m߮L;Bʰ*&SoÃGMN`!m,oc: fB4dIEZnK-ܹ3"?V;ыY L+0bY2~J W%eOsFEw-/V>^"=ihH *;?xM+gRW/_f%xsO_"_ \.\D풽 ^NumWւWyy'7ͫ<˩bGg @Հ~޽DXUBkpQM, dY H;x8w=O3K~p;9@ެ@3:cQE2<ϛsgمᡅq<չ`LEAu*Z'Y9QUEr} tU)`hWCnfsRH=ÈX;osb'DL<Ǘ%WMg"1v#5fO@T|;Y݈PxFkTtȤ? Xݢ3`Dc#'ZLu|c@.z)Ogq[U> j&4c0$b.^y@W8Py4+p_Jy͙U&z:=beC5DV^ QIENDB`u1f938_1f3fc_200d_2642.png000066400000000000000000000014561326020644600342240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[hTWϙ3fXS0*EEjj*E|@E!Q" A#)-T*R>ҾT1X4^@Ӣ"1hd&c.gՇ Zefq>b﵄,ikٍ2UzBX@UC(_̐=;d}PÊ،+xx><-"pUW``T$mApm'iT=.m߮L;Bʰ*&SoÃGMN`!m,oc: fB4dIEZnK-ܹ3"?V;ыY L+0bY2~J W%eOsFEw-/V>^"=ihH *;?xM+gRW/_f%xsO_"_ \.\D풽 ^NumWւWyy'7ͫ<˩bGg @Հ~޽DXUBkpQM, dY H;x8w=O3K~p;9@ެ@3:cQE2<ϛsgمᡅq<չ`LEAu*Z'Y9QUEr} tU)`hWCnfsRH=ÈX;osb'DL<Ǘ%WMg"1v#5fO@T|;Y݈PxFkTtȤ?1#u JESmo76{JK#?$ \v.pnkS}F<<-QM=j {Qr?XMe͋ O՞ *{N-[I@M<)*Tzzeg;*mׁ:ɓ7c6B*2߾D_z /"l}vW=:3$֣:cd+D5W\Ud;#K<蒄폶U?y@NQ U7C+ޭj#l>[|57M'"w:lj{IƝ꞊OEA7h;Vw@ܻpC#%K j uM'r~ǀkLxGڄaVSȖLWtYWR/`AL ӔI+kǶ-~h$dkeiΔcO['ܘl [\9㳭IENDB`u1f938_1f3fd_200d_2642.png000066400000000000000000000014571326020644600342260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkhW4IoM"҂Z)[)ci!$(CeclDY)Eu_TtDAiPl/m4M+ۤ$ᜇp+dP/*;U_ MǚLRak 5<vךӶO4^]*YGP5ũݯ%b3)ᡠ-CQiȼ poC7bK`ȵl*ݪt |_ C]wEs?Y,]k&/ޏY*0a͟T!2dtŖ:?>1#u JESmo76{JK#?$ \v.pnkS}F<<-QM=j {Qr?XMe͋ O՞ *{N-[I@M<)*Tzzeg;*mׁ:ɓ7c6B*2߾D_z /"l}vW=:3$֣:cd+D5W\Ud;#K<蒄폶U?y@NQ U7C+ޭj#l>[|57M'"w:lj{IƝ꞊OEA7h;V1F%ۼ;y^>BUyggiփnO9'g}Al >QPYJ-kTG"^z$Цѓ ͇, w{_RxR-~W2>*(ͭMP|̸PP.(+V$/0Qmi_Q`: l ZU }ܵi~׊LgC6w._ij<*=@݌Y?gL| ,%S}sP0X|A "vmͺs?m %fIENDB`u1f938_1f3fe_200d_2640.png000066400000000000000000000015021326020644600342140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMh\Um2#i~)[(@SЪv#XI uQqq) hf-*Rh1)6M#RE d:mfsQFdX́}8+ԡl_6cΌYkUa6ydWWYThvo`kCDpkՅ`t8HYl/:&R3 qϦVstY um)UNDpxoۼzMJsRʕԺT 'Du > `&UߟT,-q+wG1oFy5 kHgrDͣ[٢OppRpR鉖~4sNe,Gjy?Ϲ/wM~R?kiiÍ֘D}o8,XCj J[w{2 "=O76j|4CYk ~`̝ܜ) Oxu:5e-LKۅ`!nrR|m(a,̼zmw7nÇ9UXh5&gF^@ZTת7CW&{~p^[=s%{b/7n_nlEȷOnWݔB#̀}!܉t|yr>x%=,k?|][G6&ܢW*Dɫ;@ =XX:ye /c]؜ernwh6ӕΞy1F%ۼ;y^>BUyggiփnO9'g}Al >QPYJ-kTG"^z$Цѓ ͇, w{_RxR-~W2>*(ͭMP|̸PP.(+V$/0Qmi_Q`: l ZU }ܵi~׊LgC6w._ij<*=@݌Y?gL| ,%S}sP0X|A "vmͺs?m %fIENDB`u1f938_1f3ff.png000066400000000000000000000014651326020644600330250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[Hi3LnHiY(ڍ.KBvRTh7AҲ H $,э] hA(e5L'ut߽ 3.;),OTЛ&X@lMfZssNMYIKßEY7>1TD(/(Kd8 .С0"M#WL~ t% 0Rd/ 5`pdԘUB[]KOYcId ^?E?u%3A%i@u"prz)e5gBt%pt7C.brz\ܼgx>#꾼/I a~ $øS3v2;U1j%uA)RC]JQmKqG@38B阴h5u73A"TV3/U[]69~g1s'lP~OzΌԣ.; ' /1)k b/rDA wwP$ lWucOGLꢜv^_L64觩aw}RMB7{ԈH>B%I [?@7q4ٷnYxYN1dI*"!+w[29꛰XִbULVvr f>$L~"w0fc,%,6;CԘZn'ްfK א] -Jdi*&LtG!Y8odeb¥ ) f,jc OlD!D- lUU]VrxgU.|k@]IENDB`u1f938_1f3ff_200d_2642.png000066400000000000000000000014651326020644600342270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[Hi3LnHiY(ڍ.KBvRTh7AҲ H $,э] hA(e5L'ut߽ 3.;),OTЛ&X@lMfZssNMYIKßEY7>1TD(/(Kd8 .С0"M#WL~ 捭 @|!DMg66w&]-] @kG8P!`њXz&tA @MXny;vB ĆUgYrfK Up]>ݹuf>aw\ӴLx KFAi?S+ޥ-Pb~ tƷ1G3nl#|xvs(z ,ZU:MCɼn6ws#?גK-͍Ks>Y9?`_˫H۸yOxGSܲ]xCJ(]幖e@J-y7b[q渚_eY q=߄Ź :$:|wS za \;;8X]6}y֪`MZVѾcH$||_Q l8{roݳ}h??]huljqCR8P=vOȷCSB;B%n*p_;x|lhn{*٣*x_gޅYv>78~~=rVq(T^nh>yJO'GS|yҝb?)8;IENDB`u1f938_200d_2642.png000066400000000000000000000014601326020644600332350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHAhTWseh5tJ+*V[1Ӕu%Y";A܈ .`.JpƶbjA X$y/.lo"8?{9O% Q5Yo;,-5sH j"!RtgZIxMu܁,3 (KXcUe+ PL% "T?^9&):~fRḧӒdis\])C* Pxϗڑb^1tEA#vxo?<`0joj "M?OU Rһ!m@ @yH`^rknDt@M<}俩S1>Y! `IПUj}]V .Wжs܊<ꮥ֜ibE?h~t{v_@|x S^ո6rYsÆ7<w \ Gȏ;QTDㄗeH4cYZ˼o3jnapha; ­VEXfMW" ?'eodƫzc^aG2Pr|Ɔ} <*,g~_\1^r 9g>s=^ *>}QDwwžr\}R҃Խ ]󅟮/=pD2Ft<;҉#Tf|O%*n)IENDB`u1f939.png000066400000000000000000000022511326020644600320330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d`IDATHLUe?9{Ak&-SIP6[65EKYZYnmmn޵fSfZ[s- C2 "P^\//9or/ u>yyB)jհjO ڐXychBwj` .z}tP,[W`̶G499ׯ_l~%JbYxi MBYF2JK;tjF#U}K p P* N>Bfyosrm7%x1|dv̊4,&=\6u8vPW5b@"ݬuڨ, !b>(f;3sm53zʼnd-&™)<šDeNz⦦EJ4]GuҲ/];0"y(eW:m&݉\0ڕR;Dd+lқ*Hۜyx٫.ujSsB4c)ٛ^l>d#{mh+-QDXaJ+NMt#Wk0UE#XIENDB`u1f939_1f3fb.png000066400000000000000000000022571326020644600330220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dfIDATHLUe?Ep^^DMQ2dZEAB]ee&k5j-lͦNI_Tkk͉aC 1 D`z^=ȹ8y>΁1̕yf,|)cb2v M|o{F&:fCW-]n5|-j}Rk?#Ds֭[:۵_.k:kֆǑgg *HI6Uј4pߺ>#7t++μzwd̘*"4e&ywlq+[~m驝6c=ikof6gLɠ6#YVvnL{̭B  Vf Ex.}ˍ)X:RKsQÆMJN={]Vy}ퟓ>\#9fo_M{khh TUbyYѐ! =!>JQcU4tTmR+>qr;0JxP';DڒyY?] Ȟs熍Nbr5MkRBBdI)U!566HMzo벦+6e^F-o/%mpSM?Is0E Ė6wb/G; >eN3NYJ+7p;pw#BR&H7$qĢ~M=ZA($~!tqo .h@"DL)v#)&_k&U@@Q1(>| e@ *%ՉN TZvBc*V0z!QуwIE”^, VX֎=0׼QXj6Aξ~2%ۻqo&LMcl`cb&IENDB`u1f939_1f3fb_200d_2640.png000066400000000000000000000022511326020644600342140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d`IDATH]lTEsݏhKkk+5M $ RhL > T^J"5FXIyAI X薄! B X>®Tڲ+me?zum6EO3sfΜ3 ץ5, eL,Gq-U"ژXKx/#3Өw#\ʧ6& VU NSaY΋,N;<ɸP9?TU/OF"qâj ng { j %Kw jөDbLJ(:%87_1T|pj6U`gb2R4M+,]80gF ch(V \Cmӏκ(-O0g_67=YT<| 6QbqB`x9/QhMO[?]Eʤgf_@yVn_2RQH!t&" ٹ(A$nF<ի:?V92An7# Bv2iD@,^d>wsΟSlKmb#YOnhll.I3 Ɇ.uulh6w!6nGJIBI~ccsIS+!3P`\{,Y?bb>v^]SM@eoOo?I% J!]l))4Q~ݗ>neiYW##ej̩黵#G+m 9t[!'u+Kzl퀎x{ڒHغY iSBɹv &~,!5Y)`MIo~@HOTEphu|I-RʳbWA!ػ*_vVi@t |<_yj|bLaWB*yaP;5- `|C hRtJ|#;u^Fm@EjL y-]jDhM;I"<ﳏ՝z>8T5mR3HS1v\ IENDB`u1f939_1f3fb_200d_2642.png000066400000000000000000000022571326020644600342240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dfIDATHLUe?Ep^^DMQ2dZEAB]ee&k5j-lͦNI_Tkk͉aC 1 D`z^=ȹ8y>΁1̕yf,|)cb2v M|o{F&:fCW-]n5|-j}Rk?#Ds֭[:۵_.k:kֆǑgg *HI6Uј4pߺ>#7t++μzwd̘*"4e&ywlq+[~m驝6c=ikof6gLɠ6#YVvnL{̭B  Vf Ex.}ˍ)X:RKsQÆMJN={]Vy}ퟓ>\#9fo_M{khh TUbyYѐ! =!>JQcU4tTmR+>qr;0JxP';DڒyY?] Ȟs熍Nbr5MkRBBdI)U!566HMzo벦+6e^F-o/%mpSM?Is0E Ė6wb/G; >eN3NYJ+7p;pw#BR&H7$qĢ~M=ZA($~!tqo .h@"DL)v#)&_k&U@@Q1(>| e@ *%ՉN TZvBc*V0z!QуwIE”^, VX֎=0׼QXj6Aξ~2%ۻqo&LMcl`cb&IENDB`u1f939_1f3fc.png000066400000000000000000000022361326020644600330200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dUIDATH}lSeキwغl+au  I (D?`%A5&F KX֍2Guko v;2y cQ#׺U<>51&rb{o@+t.h},Ox XmmƂ1M!R0Ԟ u H ep{N@=ilTUpt§txeb@uO{pbqh "r"[)&` mǁkx wAӠ0kV<>&һA$:! g7ؾHmWA4C\TaJ1sj +,Fe==$m,VDLA(B8<وX8<( ׇ)]Cƹcrr^{үn7HS՞Hv4=9Do5!nyӌ"3k:'NPnjӧ%)LqUU7oE $@KS ;)+Ns[4MkKWUUjj7bZ[ތaõflҚvH*dglMgmB7Ot456J`aD"m, < RXx๒ _m,zní̟B,ŏ.f-u&DvQƚ#cP=|Mah}X$,᙭ Ud\i+~N^ݮ_!|9+ *TdLFUr,jDa&_ehe}dJf=ע{"'飮xГ#w:W[ospګ_R IENDB`u1f939_1f3fc_200d_2642.png000066400000000000000000000022361326020644600342220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dUIDATH}lSeキwغl+au  I (D?`%A5&F KX֍2Guko v;2y cQ#׺U<>51&rb{o@+t.h},Ox XmmƂ1M!R0Ԟ u H ep{N@=ilTUpt§txeb@uO{pbqh "r"[)&` mǁkx wAӠ0kV<>&һA$:! g7ؾHmWA4C\TaJ1sj +,Fe==$m,X{{]QT'gKn|l8k@'iI8ј|~r;4̹ؤXY@ͳu]լ슑P)OMSކDƑzHJK1[Q.ԄR%^hYS^R6`cYG_NiD)Zv;+sm. hUiw_+5!+ bQ޳{q?+yӻ=1yYyci&?kRnIENDB`u1f939_1f3fd_200d_2640.png000066400000000000000000000022341326020644600342170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dSIDATH[lTU}ΙN/:TK$MHKCbAB$(1h4#1OLJFAPFʥv ԙrδ39ˇ:eM{_g0L-oXrͨf֢(v?hcL@S#ilLj^}KpX ;k}^aAsQxL<Òpؑ쫒٧W?XQ nSRSS\ѕJp`dYZS}:Jx<&t2x=/*Yo=rۦ:ipd"Ծ8W01ݚMɁJܝv᎚n̪ju(Ȝ3bK]@ɞnİG3&L,a!j &`t\KXStCIw2g]ݢKW f8֜s7bG,hYnt"txz.?ƹ g~|ҥ j+GO\']EA~>z"14Lo^=qԇ zV +}N2MQ4b\HlW@8PD1 _qhyD@kM v5U N u/=!>p( x*r(- )>kU^:i*KG@251Q֍spKn_6y/JPc2 k˜t]j#b@C5u 1wzAl7HG۫HgIENDB`u1f939_1f3fd_200d_2642.png000066400000000000000000000022401326020644600342160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dWIDATHlu?߻6&edt2 LMbQ QAE #S0E&(( "1&0ʺn,Ru]K޿yo`!벪䆜r Oe\_Ph97ju:OC;feh֮@Dncɋn5K_]}#qB۶ xrj[A_"=oZ:lFCZv_xr:IզgDjvt YhNj_{MOtrS^W ;יL%k#۶103|DjxWHA p oM@Y[xo4G8fZܿ 5yîi*B 7+@Tv·FRqR2;*.1urDJ /.1prKcNt/fWb[tRWenV b[ҡFC -1=q)@A5\2%IΜWjxr:әUθJfwKV:V$+Q_DlH ;ǎ@`muOG>X{{]QT'gKn|l8k@'iI8ј|~r;4̹ؤXY@ͳu]լ슑P)OMSކDƑzHJK1[Q.ԄR%^hYS^R6`cYG_NiD)Zv;+sm. hUiw_+5!+ bQ޳{q?+yӻ=1yYyci&?kRnIENDB`u1f939_1f3fe.png000066400000000000000000000022411326020644600330160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dXIDATH}LUu?s.xyݽ轆H#2DVI9V\nmmnVLcIP?|iP$S6$@{{@u>{~o$ yi^ӓ[MJ(iۤT-@X`JT-mf|;s9saPkvwy~(t!EUL]  :_G$B_\GD8 ˢ0gMVnC}W3MXR, ;`Q`KHYz؊>?a tϟy 8(`++gpvw'o!d瓉d`_qif߷a8xo_%puo.ÝK41yI][{@Nhw1k=4wBr[)8d]+is:CH՞+RMSJp+lMd܍r{ѺjK9sЕN$/ Q]ֽ4|TaF 8a,blP6 [1oK@jZ* M U$.h7m oSRP#$ưAZFypKU;(PPn@:m++SlV2[ɕ!&`JS}ǀKhՕ!{HOWPH_U@*oi_%wwzJ`j&_+eyn*4,./{V-eRM˿CgQۏj@b'ӭ5#-ӈF6*8_IENDB`u1f939_1f3fe_200d_2642.png000066400000000000000000000022411326020644600342200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dXIDATH}LUu?s.xyݽ轆H#2DVI9V\nmmnVLcIP?|iP$S6$@{{@u>{~o$ yi^ӓ[MJ(iۤT-@X`JTյ)?"Yg}-[:^H&w`VgxߓH> bEs:fh4w-=8H`r53o -e>sB34juL:E8x(j :ي reo:RG:=՞7EOG㌬`061C5y9lV U n !PU 6ƔɢM}N$pNPYY;_<SvW CaH p11Pk|Rx<1/؟siZۺF89δ`$+n 1hj-+#(RBJiiiiZHǒƊ@ʳTW+S] o?|3ksg,}XvFTW?}`jon穟z!-FܮK݁jü\:'ˡ=4DʉRьzE oE=\E0A0r$^RЅ(_U;PԷ#r>ZKJ|Rx pLNCx (Kh;R׀aX+`$@z h0 Cp#h@zI.-9y` xD#$]!JCQ,T7b:;VtqtOHnӕn'[;Wc `G]7OW=c,UG!(IENDB`u1f939_1f3ff_200d_2640.png000066400000000000000000000022441326020644600342220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d[IDATH[lTU}ΙӫARF@. DAKDCJcD}02(`B`Sn"rM̔K;3t.=se6Es׿{7LrsB|?i|'2!>jmB,..ƛ!bCkGpLwk WE~J҄0`uγ9 X_73Hs PYQ~4~U kF"[TlWU:H`뱼=8}emRp8pX8PӱZ2{% ڮS<^jV8Y,}=U+dBjb*̌]Vj!-+6Vrsq{K),).O@m|LI(p\wɲϒ ӕ/tFsǭn^,_P鹙ܺ!?'-c}zfEYqH!.Dh'%`J^W JIDvh^o;͍v׵VHBIOJn&  !+߼<OjgLll]mED S>nh8жdɂKRQI)SC ƒ Q񆆳sEΒRnpwP֛?u~I-NVU0PRlDL E{Q"=)k!sk3AVmf?/)\r儗AB&1{Y*N gݼҗܖz!~=\> [J)yng}4Fd_=uDWDu2 x}K/杢bSe"8. -.>N6RC Qܐ'ER#4?Е2 !ؽ>OdVGu;-յ)?"Yg}-[:^H&w`VgxߓH> bEs:fh4w-=8H`r53o -e>sB34juL:E8x(j :ي reo:RG:=՞7EOG㌬`061C5y9lV U n !PU 6ƔɢM}N$pNPYY;_<SvW CaH p11Pk|Rx<1/؟siZۺF89δ`$+n 1hj-+#(RBJiiiiZHǒƊ@ʳTW+S] o?|3ksg,}XvFTW?}`jon穟z!-FܮK݁jü\:'ˡ=4DʉRьzE oE=\E0A0r$^RЅ(_U;PԷ#r>ZKJ|Rx pLNCx (Kh;R׀aX+`$@z h0 Cp#h@zI.-9y` xD#$]!JCQ,T7b:;VtqtOHnӕn'[;Wc `G]7OW=c,UG!(IENDB`u1f939_200d_2640.png000066400000000000000000000022421326020644600332330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dYIDATHmLer8䇖ֆ~F|A=6)D[-@pGst YX$&ye8Xhb'?w =sMu;KQY7\ךĆTqcY(%wX_;DzHyȌJJZbU亮93>/u'fK{tgM6~x<͊ Tm[G| WGpOQ~X"EJ7Khp(p.j`G;}圂nOp)+-}445QS8&ɩ.o[~Eh3bpop9: \t4%]'b8LDұXuvxċu-L6jEy"$6|ϱK#YP`Mew,b}ɇ!"+9B^V0J =ض/K_"88[Y3#n޺L`US6@dRv&s' 4 +_77w3 &55Z„ֆ*b3/EQx+t Lh4S1PhڂSjjWJXжgir[3.ZniJ `(hlvq8#HZشcM;QiJ@x"ܼŞg@JBm ˟-T))Օw9ѩ>=Ӡ2oؽ|Zk.6$J}{殾 pc¬qXϼ5 {[IҳAϒ7W<+2qFoX)Ǖ#ճ~˅O!6G|$is]r(}@1 V別K!66GYT*LGN?O xeޮ_!|;FctrvчNZDa4 dW1x к(o&clvmFJ6LuBM}HGMύ]B`$=I1qIENDB`u1f939_200d_2642.png000066400000000000000000000022511326020644600332350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d`IDATHLUe?9{Ak&-SIP6[65EKYZYnmmn޵fSfZ[s- C2 "P^\//9or/ u>yyB)jհjO ڐXychBwj` .z}tP,[W`̶G499ׯ_l~%JbYxi MBYF2JK;tjF#U}K p P* N>Bfyosrm7%x1|dv̊4,&=\6u8vPW5b@"ݬuڨ, !b>(f;3sm53zʼnd-&™)<šDeNz⦦EJ4]GuҲ/];0"y(eW:m&݉\0ڕR;Dd+lқ*Hۜyx٫.ujSsB4c)ٛ^l>d#{mh+-QDXaJ+NMt#Wk0UE#XIENDB`u1f93a.png000066400000000000000000000015761326020644600321140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d5IDATHMhSY罗4yZ5jZ;SE,Ư A7VՅ"(aF8vZQVj+Mcڼ&B4i_.s=Ƈ&FCasCtO@_rpdcKKpOr Xd(WRZc֖\I岐K>-e|gz r 4PUY ˬ&TVV`>ГI.9GrߢZw ^YFLlvv]ɏdM8'Xg|}Hg,Xqt,3? e+3Ѓ_T3 M' :3k4* xurL5 hO$V2=,e`Hp; U 5ͫߘwnXW93;>ndR3.3UHDDž}-y`ǓQ <&wn~/575*MyxANcj`+67m06gfҶeKأzq$]شlv,bXr) D$hLʙ`U]Sg ʇ~KC1`i@׵%uF0@3*": `N @T7#r`?*b }7eWUO443?k̿!Fyӟ2`A(҅Zm$à zWuNPlI.z6w p "&3 NLkђAM&SM$y!VX:c֦3&ifY0p@QXE>20SIENDB`u1f93c.png000066400000000000000000000020611326020644600321040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoLuǿsE@%` 3*)P4i!eŪ-۰ZE\m3 ^+pϽ;`0{e*+oo/),-N^|m{C ȗ\ՎQ6cdƞo5`xT-g2S(Y3,< X`(@/DmRt)-6odPkhi]pؗ;X=OԤ|lҥhoӢ9J =Q&3'3s,'Tˌzd?-<&p-o祋x )``Qؘ 0h9.v0+뾓mjHuũ._)l*ѼL-k!P1!#3< @:΍IG" oa!@890Sz fد۷ZgݏhYxҬW7^4#FRJ=쫽-P $kR<ډ]Ta-Z<-P k9U̯:Xc0 ] hӪ@\ ``&gNL@:!]Go ]"\BWL\͑ Vh,㓌 LsMr'l֢sL(zY |\i9H&F5N'ЈtlUfp_7 +@ w;Gw]. Wb5GϷџHfnbN*#EFc]#Nwjv]GW 8dkĔe`x1Rc36l$J>YmQ+^k[CD҈0QX\F.}:K\s.#0Z#d^v&~.0H`FVB=ۥet%I!LN82xS֍+/Q-Ne&#pYj?X?dscdz5pN"Jߝ:>b"uQ !gR5v]9"ߠIENDB`u1f93c_1f3fb_200d_2640.png000066400000000000000000000022041326020644600342640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d;IDATHS]Pe=Ϸ.?2,n$+1!ȆL4Q4i:M4x84EMZ$]d̈Z O:32$ʺB ,|}ӅV>w{s{}*)))b=e|xBBBf{h 7^Z]uxWo9砠(AQk}y̌Qصez2t}ÓJ*3&6̀/lVӃ),y٩XU`Lxێv=ήCzuvޑvFDmMɼ2>L|Jlw:t8v٣x)3]OZ&HHHUI:@h4f~ WwQD`pi4TBSX|㉈4Eӭ' ¯Q&OXDpjA() 3!* a؆czY؄V>x_IwW-kFv5>mksr&odeb^4M3`NaO,tdfkn e~K fgn 1moW$tt>Kx[^jd}isC-TШ56^DώU|[|trꢯN\;wкD6TX1ZwA2:kqcHPN}nz6W0ssUe Lh* 6T7kTR>2LBVM}#^ת3ξ dW^5_ QYpﲽZD1{7!Pڇ5D )H%Źm׌ {lIENDB`u1f93c_1f3fb_200d_2642.png000066400000000000000000000021071326020644600342700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHLu{u+;Ie7JqBȤZZ.ZkklHJ?0AR`J[M C{y?1agy~xGުYYYqv}d -e@`ʮ}WWUt'Hc;042$"dL7J ʼn3NƣBb|lgy>Sz fد۷ZgݏhYxҬW7^4#FRJ=쫽-P $kR<ډ]Ta-Z<-P k9U̯:Xc0 ] hӪ@\ ``&gNL@:!]Go ]"\BWL\͑ Vh,㓌 LsMr'l֢sL(zY |\i9H&F5N'ЈtlUfp_7 +@ w;Gw]. Wb5GϷџHfnbN*#EFc]#Nwjv]GW 8dkĔe`x1Rc36l$J>YmQ+^k[CD҈0QX\F.}:K\s.#0Z#d^v&~.0H`FVB=ۥet%I!LN82xS֍+/Q-Ne&#pYj?X?dscdz5pN"Jߝ:>b"uQ !gR5v]9"ߠIENDB`u1f93c_1f3fc.png000066400000000000000000000020511326020644600330650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmLuƯybG9t- I- 1\cV-k;j֬՚,0ɜDq9̱B㽐9y"}dXqo K/iCKrz𯗫-[+[41$ +^yk=,5N)>}Zf "YmYcjr&ү'm3z$(W cZY nf?eUp]S?~3z䐩9#=! ZO3KDd2Y 5J3zʲ.wF(,2hMdA!K^Ռ'K2eE/fLs%y1nב*]jk)u+d@;PWv)p? {0wTH e_3vIRY3a0cMLT[IHP-:RLo5f @oMDZ5oZu}+b:@k_g9͝!wYEoc6"̜eӱiqE5:rw,\֮")WFLeLfЦb @B_d Qw9xj]gcËsG9wzYItn6ɠ ,YFM_B#Ż$!.2sLB36րX統 _S‘HP~Q,TfXϡ'ܭa}2,KQMk N$y}7 )q;|u֡~[ 60$P M>%rH>0-TX?}vtAs޻>1.}Mu3!>g/OF L/m F#[&␠[$H!K@};@Z>IENDB`u1f93c_1f3fc_200d_2640.png000066400000000000000000000021641326020644600342720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d+IDATH}LeƯy7>(4k2HZ`Ye"cl+76ʭYIre2LAi$Bp p8{Ggu_~>{?r~.ɱ.N~쨻%n>a[% ʦgnڧ5Ѐ,\ sA))&-g}]e"eG"<1r3~bMLxҥX"@&eNG'/.UE劰X6- ~^}Tׅ!<$q1t*4Z Rw=Jet͆+&Ʈ-niJNWҙ[Scz^/[k#m jT޿ PTf0 ` b<@(~Eiw}Zf "YmYcjr&ү'm3z$(W cZY nf?eUp]S?~3z䐩9#=! ZO3KDd2Y 5J3zʲ.wF(,2hMdA!K^Ռ'K2eE/fLs%y1nב*]jk)u+d@;PWv)p? {0wTH e_3vIRY3a0cMLT[IHP-:RLo5f @oMDZ5oZu}+b:@k_g9͝!wYEoc6"̜eӱiqE5:rw,\֮")WFLeLfЦb @B_d Qw9xj]gcËsG9wzYItn6ɠ ,YFM_B#Ż$!.2sLB36րX統 _S‘HP~Q,TfXϡ'ܭa}2,KQMk N$y}7 )q;|u֡~[ 60$P M>%rH>0-TX?}vtAs޻>1.}Mu3!>g/OF L/m F#[&␠[$H!K@};@Z>IENDB`u1f93c_1f3fd.png000066400000000000000000000020701326020644600330670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHSLe~~pSyc7N~8h(+Z[lZmGdVf( )7!X"$pq?}O q>~y/p;jJ^_|MRU,iv[p,?{Ϭh6ՇV<@ N1XyN"ƅOU"ʪk~ \v N_Av{*ZؕK:jXuy/^Hπ.66brQxrv_-$ @lIԬ 2[WNp|Y~bBڎ/zt` @ `Nʠ--GFCp08]ʒ3dWGF"D؊i`IR q,{ Hm+pCڊ#!_l>psocFꗉ?hr (g4Z zI R+dm4r"kSwԷό81⿤B$nmNX"25)p(+FE$VDL*;~Ω`i}  w%y)1$vKGbR35ߴ7pyS829W}T8c6eJ*Ws-Knc> YzfIENDB`u1f93c_1f3fd_200d_2640.png000066400000000000000000000021701326020644600342700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d/IDATH}LeƯ}s8|E$$AYb٢آY Ěmk%΀h _siEJxP>'_Ϟ繁;?ڰ04+>V~iF AKzaZ}^W'WL< 줾WƖg՞􈎎|yo:PUuCqዷ (6(]   11HRŔD,$I (Nʟ`*"|.ua:~ ‘iL*\ ]%k:;=f(, O$> ,KJ e`FkJ"?n?~tC&$xnklQ5$ &]ו{<؆8\3r1q>PhNGcP5rROM9t_"^[,T}Wk&@+EBf **Zet73BM߽2ъr3 E,a!HƟ  'a5MDg&wG9jh@[WD\Cऴ[JʲH!-}~'wϿ#cFu3B`!2c{摶koaFS^m=i [Q '3ōH9!#G]șӽ5xtEyxE1Sء'׶ΑNYB Rz1d?U:REcW5n O*}r@Dw[PѸfR Vk|lcnS~f"+зew hSH`[Q"4,"$(`O\7CO+ϱ˵.m-.k6@d==!,vDX&}@2z94_K+;8/OjޑFp_9uZaN;ݧ7GfߪaͪѾ>t>ǹ!V2D$Yxx<|+7M<鵂Xr"IENDB`u1f93c_1f3fd_200d_2642.png000066400000000000000000000020701326020644600342710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHSLe~~pSyc7N~8h(+Z[lZmGdVf( )7!X"$pq?}O q>~y/p;jJ^_|MRU,iv[p,?{Ϭh6ՇV<@ N1XyN"ƅOU"ʪk~ \v N_Av{*ZؕK:jXuy/^Hπ.66brQxrv_-$ @lIԬ 2[WNp|Y~bBڎ/zt` @ `Nʠ--GFCp08]ʒ3dWGF"D؊i`IR q,{ Hm+pCڊ#!_l>psocFꗉ?hr (g4Z zI R+dm4r"kSwԷό81⿤B$nmNX"25)p(+FE$VDL*;~Ω`i}  w%y)1$vKGbR35ߴ7pyS829W}T8c6eJ*Ws-Knc> YzfIENDB`u1f93c_1f3fe.png000066400000000000000000000020441326020644600330710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoLeƯyC c'r-b#1JmbmfVZrҀ6-LH3kʟ1sy@>}߿ <Ѷ'SK /$??ns^^|v9ޠpHvcW3*wWT LPX-rXvvq? pUݎYIb4E_ugڑlْ-c 78`Xh,LlfͿd1pKg9D)Fpj"o >'F4C'X #IuGC1 bX.yu ?E_?J'MDV) co[1`'k_x}/Hx7&;62\2'XظX*v'1Krb*Evmzbo CSY+|\8߇rѮtϞ @ÃeJOi=+g&ܰ! ])}62kj}Q}k^}NX[y-}CG'ו]̔> =JoYr}f}#7E`ʖ-?&}4zKyО/V@}mO5UtYXH@={h̤͜#NgYz͡~ySsP}rM귕)ܾ:o :!1-޼jZyߣc= /,k;5$Xi֔;kLϟ@V R"w/͙aTҜ6)pEX3'840o|ӝcH3cHJۖL/@t:MB?@hiMf HyI!-F5vwfq8_Al{|Oq\}ۿs l_޸ҭ hE.3ebc.=4O=8Ax >OS'ԉJ{b3ׯʲ/ŷVBf5`!*Vz ۙ!0:oXnbGU E,R)y14 _ 1g◘Ɔ̼zW9y IqûPrޓ;t׭R|'d Eg\{#Ǝ}&Q)A\17~MQ,UEY0t0w@ltǻ1/uD՟OJ߁I3&pe hOJ=w"F/e ;[k7N9{*4s+[>اt LW_w=ri"UO*,2V6Wo6} 巶NS\eI2j*=-WbPVC'% PMLl`34? ɗDwם4O\45v}svwxJT X~UhE^bѣp jyA:B•Q['lQ=yGΝօp]> t=8\a\bI/&HEVz{j)IENDB`u1f93c_1f3fe_200d_2642.png000066400000000000000000000020441326020644600342730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoLeƯyC c'r-b#1JmbmfVZrҀ6-LH3kʟ1sy@>}߿ <Ѷ'SK /$??ns^^|v9ޠpHvcW3*wWT LPX-rXvvq? pUݎYIb4E_ugڑlْ-c 78`Xh,LlfͿd1pKg9D)Fpj"o >'F4C'X #IuGC1 bX.yu ?E_?J'MDV) co[1`'k_x}/Hx7&;62\2'XظX*v'1Krb*Evmzbo CSY+|\8߇rѮtϞ @ÃeJOi=+g&ܰ! ])}62kj}Q}k^}NX[y-}CG'ו]̔> =JoYr}f}#7E`ʖ-?&}4zKyО/V@}mO5UtYXH@6 MOxU Ѣ<6g %ނYuuu|>i 3% ŀѠ%,i)Mi2_֢SazFS؞`|>ΠL̆\* h1x錦n}y f8!1aԩ2:/ZQ.ըxX "]X`oD!x0%F @d'`fp/&-qiwHDxݛMht͚(),̑Č@%#F +Õd#!,8<,8JttR;Wq_Cu7`BlnM*Bҫ̲䷜{g-\4-QT(uJӏZ t@ʲΦfa oŋc0כr1Pa_%#BQ4 ƍpj`/ "?Ne{&Q:(A?pzNC8`yvwR=N]N -n*|5m~eKa?@+thyF;}f[5?8ҿGόÉwhO>tp.Ǣ]&>nj=r4InzCOeC Kk7* ,ѷƈ6QD'@Zڼ_1ET SZu䂟ǬȟӼwU_,U6mŖ#>[-I 0+xG`'TP4`,c~S2Nf⻚7PԚIh8V}B'+D<#G3ηIEߪ] 1IENDB`u1f93c_1f3ff_200d_2640.png000066400000000000000000000021431326020644600342720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHYLW # C1@NqKZ- 1%FĶilM6]E hS h) hl]RcF*.u,8(k߫j2@qq gdd~X#}>bW2 L&1g9mB!-Yj! 0Cs8ρ=xs8 _xC'rQ}ˁ sa2bR֯'b>.DΎT^xwIYHSdez/Kq@m,X'F&@FfiK>0@`(x , h!OI3kDm'qݬ - >r;@ 墆g H|2N9ɘ,)=_9GؙP#W ENd$˧wkm~:w1E\poի)56ߧ9_0%۟^ZUw~O+.t2f߽ F&pW+*"~«J}t6 qS.wYHYrh.ZWYS{,T-ի WHt Yv h$6 MOxU Ѣ<6g %ނYuuu|>i 3% ŀѠ%,i)Mi2_֢SazFS؞`|>ΠL̆\* h1x錦n}y f8!1aԩ2:/ZQ.ըxX "]X`oD!x0%F @d'`fp/&-qiwHDxݛMht͚(),̑Č@%#F +Õd#!,8<,8JttR;Wq_Cu7`BlnM*Bҫ̲䷜{g-\4-QT(uJӏZ t@ʲΦfa oŋc0כr1Pa_%#BQ4 ƍpj`/ "?Ne{&Q:(A?pzNC8`yvwR=N]N -n*|5m~eKa?@+thyF;}f[5?8ҿGόÉwhO>tp.Ǣ]&>nj=r4InzCOeC Kk7* ,ѷƈ6QD'@Zڼ_1ET SZu䂟ǬȟӼwU_,U6mŖ#>[-I 0+xG`'TP4`,c~S2Nf⻚7PԚIh8V}B'+D<#G3ηIEߪ] 1IENDB`u1f93c_200d_2640.png000066400000000000000000000022051326020644600333040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dsAߞ{pY^Hq'}5nө[btUswBGt䭤oF_KfѺIo|> *@$\ή\ic+ @ÝdOtcZl?t!śS-9퇦YWͨ99UۺAAvV/kzrFO@w)eIA93rDE3Al>Y_89J/Z7 8falG`i]뢫kt!0NWtXa{dC;kk b  0tsHx7(*JwG+k+\ #EqzECP' )4{geti&Qh<ўPc;51F ƨaAt N3! p`ę@< }BHsj`}f\Ql< I&5 Lx eWx!p)&eg 7"^l1 Ba:""T2x J"m7 265{CaY~S22->h ob̿ |ظ3?/ynV篝O]^'zE(.kLYZ؆y<5K@>&=7y3v'#؈]zeVbֶ^!X^3qSz\N f/1znh!UNNݎ©BcӚ-58>dֲ:p;3X-~߮/M'-V"U5 buXp"Ln.+F?^a 0!XO]jin9pw:czߵP9? Œ]wvq]+?#*mUWGϼɡ]昖ʿw쬎2 6(07O/Fx]0z]rmǤsbJrײCo \n@c9 Gc͎eؑxЇ~4kf}ᰉw'}w~k?R"ydh):|m>K?E^WżXUf67~9o%{ٟ ˨dGaR"$|Vǯ=*<<U.Z-||͌1]m6IENDB`u1f93d_1f3fb.png000066400000000000000000000016171326020644600330740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dFIDATHRMlTU=߽ݾtZд3Vh1m"jpE11FF#EY2htaLh$(p ]!D"!Nd,L; tޛ{/2e rVw9 ʽ0ʖ*1xg ~kgmJ5 {/őG=mdt&48|2G,S <H 1CE֠݃_V]/^jvŸ, `+\?~+Y"H‚ 3G~[)rU1y?]R5?9y^c-r-Ivmq Eҏ ]W. M #QjFHW+ZX7QX2qUTmc fIQ@MMd4~D:BO$`7V#q+Z>Ge:Q q `i} 9&c`ū'[Z[\˚{ADDgbGaI}W§JT!Nl[GK_w\搼Qwk3ү=y 3s>.ۑZnЁl;{}C6Wj) _F83e&杁,)$}n@& gر8zI5>I0wwQLJ\5}6{L%6wHl GZr%csFh5-D58SIENDB`u1f93d_1f3fb_200d_2640.png000066400000000000000000000017331326020644600342730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHS_lSU~{{oi׹?v@qS:b6:E} q(J("1ć"BD&E Fl# Wgζl֮ݽ||ʠ MmEiWˎgLBq}#M.@-6CMi.Сj s56hLA 1q9,(/WÁfX$JY4k+sҊtd{ d@i>h]_a,h#eڹ.C^lxӞؘw_ ??g`SeBDop\Ȉ:17>)LDo~I)UxS 1wPׇopKyma\>+u>tK4d qԆe٘5,~5k? Fu:8*o޾QX'n BvBP,8g-&3ՋɣЂ7W} àv d:OGx]HI#x_ڒ.swmq Eҏ ]W. M #QjFHW+ZX7QX2qUTmc fIQ@MMd4~D:BO$`7V#q+Z>Ge:Q q `i} 9&c`ū'[Z[\˚{ADDgbGaI}W§JT!Nl[GK_w\搼Qwk3ү=y 3s>.ۑZnЁl;{}C6Wj) _F83e&杁,)$}n@& gر8zI5>I0wwQLJ\5}6{L%6wHl GZr%csFh5-D58SIENDB`u1f93d_1f3fc.png000066400000000000000000000016221326020644600330710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIIDATH[lTU}NgJS v(8cc1[1dR5ĠcQ<1>JQ1(/ W}$H$Ʀ3Hmi;έ9lJX# }Ά )ߘ8zvq9=xZv5oG;^ m1UZNW["7Uߟ묱VZ5:GrhUBK^C2Гje#^ƹpn'´^Wz41xXëA.z>*bS"L_v н=ֶCopgCE&~} T+ UF3uKp p7{b[^I~`d09shNҝ@NqdsE?]H̆kL֭&n/\X@q̨)'>|# ÖT+N`tp؎m>u#M$O}"5"UVؤk<1v-䩉,C - hx}ex˱QZEۤϴw=Jr=yC ~yof*cٖ93-9(GoHY fFۯT`d|y?>,E%?||z2" gyRn5Wq&틡/oMңC.yt#2 `] f `X\.e&FΟy2|.z4i7%Ju0enP_&AѡCбm9Yw,;#?#K:IENDB`u1f93d_1f3fc_200d_2640.png000066400000000000000000000017431326020644600342750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTEsnmwb[" b--M5-D}Ҫ164hlhzQj# F ^"(@S^Z ӲunsƇ^|?3DTM`sJ܂ou׎Ⱥ ҕ+uO߶ [;ٕ05%gu݅ HWZ є0QYeh3S;%*!hC a̵4.xǖd/rG$h)=5L*A`[jNDщ2WA7WҔ`y]lKdӼrߋn| . kGs1y.Qm*.˜.#8EHG^OeI'XV)k%J4pP[)ΉYfqh{s-~S_}6AHXI gJĠ?ao@o֗1L oUsN\<_l|뒇oiBiJQ1(/ W}$H$Ʀ3Hmi;έ9lJX# }Ά )ߘ8zvq9=xZv5oG;^ m1UZNW["7Uߟ묱VZ5:GrhUBK^C2Гje#^ƹpn'´^Wz41xXëA.z>*bS"L_v н=ֶCopgCE&~} T+ UF3uKp p7{b[^I~`d09shNҝ@NqdsE?]H̆kL֭&n/\X@q̨)'>|# ÖT+N`tp؎m>u#M$O}"5"UVؤk<1v-䩉,C - hx}ex˱QZEۤϴw=Jr=yC ~yof*cٖ93-9(GoHY fFۯT`d|y?>,E%?||z2" gyRn5Wq&틡/oMңC.yt#2 `] f `X\.e&FΟy2|.z4i7%Ju0enP_&AѡCбm9Yw,;#?#K:IENDB`u1f93d_1f3fd.png000066400000000000000000000016221326020644600330720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIIDATH]lTEgܻ햮/4Zb&JʋFb4FbJb}0f5QӘ`@ }A"  4*[ڵuKK~;>,kW3sfn|cbhun׿N Ys>dV&-TjGkTiNo 4WkwZ@8S$ MhGK @A04YF"``m8'rοH8ecFO엃up[[UQ9l򤽠iޕN~8|p'٬F6G}}5u LlȫD[;ec] jpWM^G*?fdl3Y)0mȴMkhS"cRGSៀ 0+mk=[:dj⦎[sfab@,lB#5W-mϡwfsxF_] W߼u9 s:%2!_aTT:CK ֹkD9*y.N^Bk&o)=X3-׺2Q xJOLNYޜFxMo"3c0:uzF*\=S҃=_X_1+ŞHo]SY.WfSc`/VǨ&Hn=DhALR7庮t8$z  (+,?@xګ|W/[o%;ڛ0zڠfnNP;ACѪx-%rǡ9z2;:[IENDB`u1f93d_1f3fd_200d_2640.png000066400000000000000000000017311326020644600342730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHoLUe?Ϲ{/EP.LDBXZ[;f5ZҔi[/lUGl٫17} c(dhWr/rsyzq)߫|y>+\b IX,sejxٻU=-:Ҕ(q;1ൽK(\wörclMHS*QF9,PGPg^=1/&E1# a ؏;g=/LA!P]z[)N]F$f{e@QO?)nFp;#eO#_dm1D>~@c}k==շdez;>fQjQ<rF1}__F.,^$2g0b%JCYz>X뚿WVu44B7ʪ@;5Yi 6BF L8iNN´ƩM*<۲@+\pWʯBzpݽD3 #κ`e}E'8 B tHR=c3T;f)-ΉT;+Y;a:r %1Pк_x=s:Ղ:}~ۡbR=cl|81ʷ7T^|[N0( f܄W[֕/P~pa⓾!@9]KPCr4J 7oZJ~O>dgqeXQʏM5fGD<tڗ e겇z%bcKH8 @lJ.٪M gRLE4 lj9 dx](?äAnz]:n]ÈOqkJ;!6\.lZlIENDB`u1f93d_1f3fd_200d_2642.png000066400000000000000000000016221326020644600342740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIIDATH]lTEgܻ햮/4Zb&JʋFb4FbJb}0f5QӘ`@ }A"  4*[ڵuKK~;>,kW3sfn|cbhun׿N Ys>dV&-TjGkTiNo 4WkwZ@8S$ MhGK @A04YF"``m8'rοH8ecFO엃up[[UQ9l򤽠iޕN~8|p'٬F6G}}5u LlȫD[;ec] jpWM^G*?fdl3Y)0mȴMkhS"cRGSៀ 0+mk=[:dj⦎[sfab@,lB#5W-mϡwfsxF_] W߼u9 s:%2!_aTT:CK ֹkD9*y.N^Bk&o)=X3-׺2Q xJOLNYޜFxMo"3c0:uzF*\=S҃=_X_1+ŞHo]SY.WfSc`/VǨ&Hn=DhALR7庮t8$z  (+,?@xګ|W/[o%;ڛ0zڠfnNP;ACѪx-%rǡ9z2;:[IENDB`u1f93d_1f3fe.png000066400000000000000000000016211326020644600330720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dHIDATHKlU~wZ;mPpZ#T!5k Sw1"$Ȣ.M%,@[и0]|ChlE;}ɔhKe忺s,ޘ(zpE٫3K8ܼ%A;Hf0SA Y=/5y*֟;{?Xs Օ{12a)'. _%":s.g±t8b-:>qHrbE`42$?>]\8=TeUwVƟt&D\0#C!΍WDvߞQXه[r JK1+i{Tu*]ͱ:3U|\_=?rBg79ٱɵ?%# \ 4=;6=U؛3 7"Wgδ6>+A[ Zc)\015sb7 ƾm _ڌ`Z=FؗC-H?Ʈ%)եA/[jJyx5>JNyX dֆܞi|~nQ#(+ c R/Ƌ`X%̿uhWS9w- ݤ']kmܸoqL.1TT@J l-x䣶3^H &<= x#]\Gvlyn.m ~ҷUye}[7ȫ@hzU0{D;ؗ\4SVu#ǟ?]y7L=b 婒RWD()pX?Otȱɳ$Ri h5s-%rksDVܠ$'WYeNWA, =C{^[P0 id65?V<2Z%P޳kOo`P $@6q)17+>~!Tf ][Ȁ%N4mL9_N.~ƭDbmšZ/UprW$FQHPF((dW }; %OTH e } `SB J7v^Ӆ|,;#7Mpİ LSXQ&O/)|t"^dJ<mj#drzw֭`:Q[=%jad@ b׾-o߫FjI ,B^, @SOM$ ڟp'gYYlt&m~BgJIH$˲"Ļn+@qHrbE`42$?>]\8=TeUwVƟt&D\0#C!΍WDvߞQXه[r JK1+i{Tu*]ͱ:3U|\_=?rBg79ٱɵ?%# \ 4=;6=U؛3 7"Wgδ6>+A[ Zc)\015sb7 ƾm _ڌ`Z=FؗC-H?Ʈ%)եA/[jJyx5>JNyX dֆܞi|~nQ#(+ c R/Ƌ`X%̿uhWS9w- ݤ']kmܸoqL.1TT@J l-x䣶3^H &<= x#]\Gvlyn.m ~ҷUye}[7ȫ@hzU0{D;ؗ\4SVu#ǟ?]y7L=b 婒RWD()pX?Otȱɳ$Ri h5s-%rksDC_=q'f(qj hE5}ϓԎ:UVw]޿}>\JKn|kDh g@8471?S_1fEQP"8e2zF=RZݽOW x2el:s(]ߵskV+8 k>Ne @>uI*5w$j~k_Q޼{ȫ zq!U3%:y-c$@]l)~b])yB? O<5vx4BT:zAT'`_?BaŹ/V vZ?9a4>)u]i∘@p:-n' `eRTF:iN |SE^5SYCQ}]n<\QcR"䯱Y/fж[>fi}j/[7ȶٛiQt/Cj3[]IENDB`u1f93d_1f3ff_200d_2640.png000066400000000000000000000017101326020644600342720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmhU?{vte{H HBL}!ARD:[+*=D&ʆBCw{^lӋui>w2Kd~hݞr+ KFO~H?H's*[<<{ 23v#K(U8^9L#%7,` 7յ8%0U!ŹsqwH cj8сPYUpr0Gqe 4 oJfTu-ak껀l }̟9Iub@EyB!mLw=^ z'\Kb[TiXم^yY[oSN&i֮,CwSofZcWbGWZ|^g?\)dxFnmj1y}hI4Rn?w Zpi۞#7U9Mzb3ҚW>@#qGx( 2ء *'k0wkKZۡ[_ z"\ϯ={fq|pehPV^,ؼܖVQ~#/:BE&uQ}#oc^c3}ZZJ)o|hYʼ,8)A\z]Cfg>6e!&hV2H|?R}LR,v%:ē)Eb}xj9迟bcP?IENDB`u1f93d_1f3ff_200d_2642.png000066400000000000000000000016411326020644600342770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dXIDATH]hUtvݦIcD֦%M F0RPP#E`5$}"APPDUK}QCAJi_ZJU jHk&lf7;;s}HҮK{{&dots,a_ƵhvH=gV }ӳ'[Q6B*N 4onn9~PWW C_=q'f(qj hE5}ϓԎ:UVw]޿}>\JKn|kDh g@8471?S_1fEQP"8e2zF=RZݽOW x2el:s(]ߵskV+8 k>Ne @>uI*5w$j~k_Q޼{ȫ zq!U3%:y-c$@]l)~b])yB? O<5vx4BT:zAT'`_?BaŹ/V vZ?9a4>)u]i∘@p:-n' `eRTF:iN |SE^5SYCQ}]n<\QcR"䯱Y/fж[>fi}j/[7ȶٛiQt/Cj3[]IENDB`u1f93d_200d_2640.png000066400000000000000000000017371326020644600333160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmlSUϹ޵[n{ls n!Mb!Db3c41 $K&251@\Z*lkit6'sKs%.݈’ִd:;1k4Ԛ͛ .'{ =p;o r7X#Lgwm]UxEg;[`PYeڅ!2}*Hu,+`:qsAdM @ )cPJC;, [#cyB6<>"!ds5ct @sV-ל%[5dҥ<哼`b1eMOEF*ovD3ɮ^Jg#h=Ҳ{35Qapy_|ُh­y]߉y}g.mCN:7B׳-4i?iއ_5iB4@%1 iRhN}_|O ?X`d>MǕ⍁3/vzvzΗ*_}N?2` A$dPc`9Mʘ@ J:I:u.Aa5&a1aqt3qIY1P 2_.1t7 d(JIENDB`u1f93d_200d_2642.png000066400000000000000000000016111326020644600333070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d@IDATH]lU̙a-.&R bxQkcmLAMxaL5Q o '5b.Ą`b# [ϲlg/JFC]hyμ;o&KJl/z;4ޭ{:]9Ka[&hZMQb{7Ѷ '섓5WPr)4Z`p莕⢾fr\v 15G )jO-֌>O]^'zE(.kLYZ؆y<5K@>&=7y3v'#؈]zeVbֶ^!X^3qSz\N f/1znh!UNNݎ©BcӚ-58>dֲ:p;3X-~߮/M'-V"U5 buXp"Ln.+F?^a 0!XO]jin9pw:czߵP9? Œ]wvq]+?#*mUWGϼɡ]昖ʿw쬎2 6(07O/Fx]0z]rmǤsbJrײCo \n@c9 Gc͎eؑxЇ~4kf}ᰉw'}w~k?R"ydh):|m>K?E^WżXUf67~9o%{ٟ ˨dGaR"$|Vǯ=*<<U.Z-||͌1]m6IENDB`u1f93e.png000066400000000000000000000015361326020644600321140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[Hauuۚkm"V^$2( DE)ć RBQTIJ.TVRصԝNa,uf3wbÞqBR?w_{Ә:viuV3)OSO b<E*w/i<G+JvVx{X.kZtA9Bz#3pdǾ䨅'>]8-BuuJIݦ8 o7%<$*s>{\S0?A" 8^5ONwm-LSV};xrqbh`I.0V:/yg33!Yd_G>B(`Q5MNL.Hj?uN|w (FW]{tzn#gK9{D<"6uup3X Pgl'SSi 9cׄc$U] ?lQIaזڑq9G2W .+?/0D]ejϱIEՉU*0׹L8 ̭۝ک啷Z3ku['}r4FMWg1,MMUUɐk{so! #IENDB`u1f93e_1f3fb.png000066400000000000000000000015341326020644600330730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkl a33mk H݊ƭU$ YDDBTmIC4"~iK&$E\EB)KWuwvFmϯ<&3!z>K2௿ǎVWGzXH.(6auޫ'y+" jMh`-9\Zb `ߩc:^vjLEJ$_*Xd{{ 4!pt0XQVSZR"B,fH1IZHq !(/+k2YU2{Zim oQX:چɿo"mLOyx~Р=bD;3֍22 7+$ȱ- [8_BE,> >Iz-wE!TGϹ_|x&Lj @ gԧ ~2`1k1d-+Kɞ{$g^ ա~db!"?JeZY"?' N9m[z=L8 : @nmPC)%!d6=whN.ÙyOXΰwPZłP\ 5X9}k}ipVP߄Va5}k9'^c:͘ӳPi96!>IENDB`u1f93e_1f3fb_200d_2640.png000066400000000000000000000015501326020644600342710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[Haoff*Qf$(BtQDEn:!Aݔ.¢" UTd`jf*2՝ٙ+JYy{g~ԉku c<:B:'L<ubPj ؖwsٕl)pfQU;9)/ʺyӉ*J\IrT8No4cB_b&) "x0ېH!C>)=9P\~,&Jw~X I<W@0MQmiA2]w@;._=D_b[OϜ^{EAx@+C> H&ﳞ[Jf5֛W- Ɨ i&x4mO#du脟'˰BKi^8 1kWۢOV&*!6A 2YغYH&Cr;,#u<ZEALrN? QWK H]?񎪿3 Ff31j>U5#:LVwd<\eQU&F@#z01I`Q:'Hg0s(+M|8 *Q lz]e8EU/fђ}FRf.vA!nZȪQCaOhshYv4oxZxa %L&榧Wk%i|C⢢"uj:\u->IENDB`u1f93e_1f3fb_200d_2642.png000066400000000000000000000015341326020644600342750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkl a33mk H݊ƭU$ YDDBTmIC4"~iK&$E\EB)KWuwvFmϯ<&3!z>K2௿ǎVWGzXH.(6auޫ'y+" jMh`-9\Zb `ߩc:^vjLEJ$_*Xd{{ 4!pt0XQVSZR"B,fH1IZHq !(/+k2YU2{Zim oQX:چɿo"mLOyx~Р=bD;3֍22 7+$ȱ- [8_BE,> >Iz-wE!TGϹ_|x&Lj @ gԧ ~2`1k1d-+Kɞ{$g^ ա~db!"?JeZY"?' N9m[z=L8 : @nmPC)%!d6=whN.ÙyOXΰwPZłP\ 5X9}k}ipVP߄Va5}k9'^c:͘ӳPi96!>IENDB`u1f93e_1f3fc.png000066400000000000000000000015311326020644600330710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[HaqtuKY]LH0+)J)(]r*J+|P|Zv3 0[vՔLIwz(rfw~|gvWզ UQ,isOO8g",TTx:@j $ՈyDeS{6 \Ace *@V|W7|A[uk3T51 `!ˍ*`*7@6b\@#C+6] |erj"VmbpV&jQW+ImI"-k^Շ8 =V׫y& =GJ,v3Ue"JoX_X @.6(%cJ@ @h[39:n i<5 LVl7#ibͧG 9`<\e^۫ }#J?eD4͵hduSLsmAL.*{9M`5 2"%6|ۃ/S_o[Z6Z[;h"5̱:ly 緖 b0UYX㶌Yz%(M_JT;̺S*`  @[yaT)9f/` ;[Hwh_cJqqK Ɍ˟z^(Շp;n  OU=0Ɉip3#Y"!oF q ofUILuxTzW@KxlNPFߎ](w&Do2i sA'0Es,K=7 H{>DeEevyf,b"HJǧ[X]~X@K=mHvw&hAV+$ GIYnL|H{ ؉Й.Xg :8Y%7hcJrv <ջj"ϝ7-o@/;~3EtP&,o@ms=@fYx/]۴>R"Ā]@:>4eC}0go-T+/]W̾VS T?TǷh+`%'^?J7lwǶUICcVx(_'tHP÷FeYw|c\7l!5:0sCiO  Tփ5$| G'OiX3 >dߖfΕ+דg"Z:_qfGz5- ~>1˲,㞊@g άIENDB`u1f93e_1f3fd_200d_2640.png000066400000000000000000000015621326020644600342760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d)IDATH[Lwƿ3;fpvP\b%xI ABؔh*Bȃ chhnTP#F -qY;7sPY9)# i  X P||ۙ!LzsHU!Qwn^O>w ģ_ =9'0=lzǾ 0=HE h)DD z[Ws~K^ ]eb*jb6$ )=H4W_Woq)̉&iH6Ɛw0y}~SZP/"h6M-2>Usw/#c> LY? G*̲k 8﹟MϓnǗ&!UOY1A'+q޼Jʄ vqj܁ItЦ5>pޥH6HO"|n^{ rc`ގ:m,u9 ĕ(.S^4ݨ7_f/>VDflHmSk3(Y5MRfA@1<..-FOі3eլAn~_nA@<7fdf+wګUUQV} :@ `Kbzź]3tppF^`9I%f%[?tB95PPӷ)&@mEJG{ 2i5O}gvb9+ gZķ y5 ډZUEtP&,o@ms=@fYx/]۴>R"Ā]@:>4eC}0go-T+/]W̾VS T?TǷh+`%'^?J7lwǶUICcVx(_'tHP÷FeYw|c\7l!5:0sCiO  Tփ5$| G'OiX3 >dߖfΕ+דg"Z:_qfGz5- ~>1˲,㞊@g άIENDB`u1f93e_1f3fe.png000066400000000000000000000015511326020644600330750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHmLasiTNM/T+9QlclZe9!>`Æ2/wrT9yy*gw]n/i S@V^z1X7Au)CWl@ѽ_LR5OI+2%=y9@I|v)[{ d N*9;luvj2S { !;kh֐~Z_0TĒL OC4yS#4:S'a?r0#1Y cV®:}4$WrL yt+*kcƮe;-jPr *OOoncBq%*A#%\̝=[ȎֆLe 46Bp9iH`tzͩ5pr3Z`<9V {}_.caUJnB'86UHp4#3D =;~*Mb"PvE kȲ9f[.R] o%ag\ځѼQruiW=CMcm2Ӻ@11@TF ĥgm,uWaDT P 1q[v_蟆UJ74>J8Alҳ3GNxt*3_jHPYҏ~)ՓsG^l=oizchm NY{|Ș`]&FجE%+iyIENDB`u1f93e_1f3fe_200d_2640.png000066400000000000000000000015651326020644600343020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d,IDATHYLQϽZRhQjb|115DcXq}PFE#%1q!&*.ZD#тig~ IN<̹~o\0#.;[X %0DZ!32>1IRTTxveq5JA\x<ҵc;֝{HiA%$@O)p{K;ܾmDyY[u0мAL#4H02#mZ4ja`t\4cm|z[xr($ o,,x*߹~/Xt`FlˆenHa"Je_l umC[W̌9M QɁ ة}28]vgߘSb@7 #Umr~A$ѕ%kE$3 (Y?78/'Q3ws"/C*+8T\Ʒ/ $] XR#ƬJT[4->*-鳉dy8DWp J53*K7x4c9P<:enZup  ;ݒtyP!t9Q1t=u@9#:A)K9}b @_䯻o/r8cr?k)Y5#=|{7 SUÛ g”UsB|ycBYw٘TR͈?6;Wov_1!&]p40'IENDB`u1f93e_1f3fe_200d_2642.png000066400000000000000000000015511326020644600342770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHmLasiTNM/T+9QlclZe9!>`Æ2/wrT9yy*gw]n/i S@V^z1X7Au)CWl@ѽ_LR5OI+2%=y9@I|v)[{ d N*9;luvj2S { !;kh֐~Z_0TĒL OC4yS#4:S'a?r0#1Y cV®:}4$WrL yt+*kcƮe;-jPr *OOoncBq%*A#%\̝=[ȎֆLe 46Bp9iH`tzͩ5pr3Z`<9V {}_.caUJnB'86UHp4#3D =;~*Mb"PvE kȲ9f[.R] o%ag\ځѼQruiW=CMcm2Ӻ@11@TF ĥgm,uWaDT P 1q[v_蟆UJ74>J8Alҳ3GNxt*3_jHPYҏ~)ՓsG^l=oizchm NY{|Ș`]&FجE%+iyIENDB`u1f93e_1f3ff.png000066400000000000000000000015521326020644600330770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d!IDATH}LQǿIon]\-Qz1Z4oͲ0c)2\/K^2lT#̻f3ٚJn.sڒs]߿9;;svQP8pq^^@1:O+BgyOGwT+YӦ<N*+2 }@H<s(66v➵+N Y~5`JDg+KRMTDiV(:y nYp%Xu`!i^|]Fd N'% 5286h{M|r0f`(Y4A`I|ݎZԯ[Z*I/ku6)fhc=!gn0iY ,G˳bbG04fkYFj4Өoߐ evC|MjXu$'z`BN|Z @r?rf#2:Un`fVE Ȍb~=VzU o [`8~.Kߔ?oEl*(6 l/ۋkNSҍ}E+r(U߯I n RNvz`S& l@H\zŢ-VpWA>THF$ VW]YecW``l M14IXŚe9q">ZO+c 9'/?bux煼4qj[ <\SlL m}b{b~~?tU{S,P(k'gP$IENDB`u1f93e_1f3ff_200d_2640.png000066400000000000000000000016071326020644600343000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d>IDATHmLSg繥h-0`bcF܋p$efٌX6elkԙɖܲM7g~1it`WB{{`H ZڂO=F#Δ>*=mrLAEf+vTVVf8?|Ѓ' [mo0bۗV !a\Y6Y(DڭVXT>(;S1݄w@bCA`X5fZRH,"Zd,O7wwBT4eJ@@0Mo#T$(W%ZHҽC*DI;p#+yz#o=q@&YS)ٷz=x;"RI(6K[(fM b~K0b~j& XݸL2&<}# ^uH>Ōbb{ô.X=B}jQj]ƨ&t $X vWPDOX ZX42>x攵a K_$$Z4OU@d`Aؖ[URŦt>vc)I-B H@VM ̴`/ F+7,[vl%qϢx]~^W o.(mESn5T6ǥԃ:~xO#S]A׌3mֱsӼݏ< rT ϛU)³ IENDB`u1f93e_1f3ff_200d_2642.png000066400000000000000000000015521326020644600343010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d!IDATH}LQǿIon]\-Qz1Z4oͲ0c)2\/K^2lT#̻f3ٚJn.sڒs]߿9;;svQP8pq^^@1:O+BgyOGwT+YӦ<N*+2 }@H<s(66v➵+N Y~5`JDg+KRMTDiV(:y nYp%Xu`!i^|]Fd N'% 5286h{M|r0f`(Y4A`I|ݎZԯ[Z*I/ku6)fhc=!gn0iY ,G˳bbG04fkYFj4Өoߐ evC|MjXu$'z`BN|Z @r?rf#2:Un`fVE Ȍb~=VzU o [`8~.Kߔ?oEl*(6 l/ۋkNSҍ}E+r(U߯I n RNvz`S& l@H\zŢ-VpWA>THF$ VW]YecW``l M14IXŚe9q">ZO+c 9'/?bux煼4qj[ <\SlL m}b{b~~?tU{S,P(k'gP$IENDB`u1f93e_200d_2640.png000066400000000000000000000015551326020644600333150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d$IDATHkHSamZ6/ٲyfaEaEPYDXTbPfAtPTP*"A5誦f76mOZktx=9ACǭe H=h\0 =<>dNSUT@4A,]5qᐆ}iX)@S~zuW>]}u/~Ut!h\˲UU{v=`(r֒2_ KFK^qE66]{e>#~#~i͹x{X.kZtA9Bz#3pdǾ䨅'>]8-BuuJIݦ8 o7%<$*s>{\S0?A" 8^5ONwm-LSV};xrqbh`I.0V:/yg33!Yd_G>B(`Q5MNL.Hj?uN|w (FW]{tzn#gK9{D<"6uup3X Pgl'SSi 9cׄc$U] ?lQIaזڑq9G2W .+?/0D]ejϱIEՉU*0׹L8 ̭۝ک啷Z3ku['}r4FMWg1,MMUUɐk{so! #IENDB`u1f940.png000066400000000000000000000020651326020644600320260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHohu?{7e-T4,_H -bD_ + Xf k̦ 5("b {u;>FW(z97vetwRFoQ@x^^δ޽ P]JDNh/bBוR6]#B}ӇXm(Gem-=+}(@Ѽ&Twq;T?V7L/1,Wt$ḡ +CeK^ؙ)-G^EnLiیUh)pgj0"@8~]*p% br)]+U82^6L;,"sLz3<@LJ^k;PJa;TOEN^cAky1cZ?#V(05cMeo~vX FAx 8 |$h<7obB=OɎ$0kD2g iy׿IENDB`u1f941.png000066400000000000000000000024561326020644600320330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkLWmJ˭ :qh 8P͠˲}rfL2?5Y,,ӹu,9QQ3Q.Zp h=gTRpY<=s ٻݶ`Un>|.CR7b_: qv[K#'-H'ڸʖE'l6Ri&6=Ô'@npñ:RfE|ҿh͙g9աl" (G]G+‡<:uظ9oEZA?$O VNl]Wytq=Dv,hM-wP6$e皱t|]C8uҁU)(X?#T {\8gm'@ I EX8waJg =`vqv 8QҒu~.Qe"1O3ǜ6dEqflvQeAq&eO1;89Bf.]4Pp0^ 4I~mߐ:L宏M(㽡/nd*y[=BLCeToEt]iO~4Q|w U+-6'Г|oHz)[`%0ir _]a-Xm&_k5sȓWړ47v s5HKbr1F0.]wP\;hDK %zjR%?=_2=KSՠ3.o j@ªQ3f#˾}O'IENDB`u1f942.png000066400000000000000000000017611326020644600320320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]hUy?MIV׹muEe:P:,Ϙ ̉0* AJLJ. YֵUեg4x5)w<)/5KM?!dGBOA17Gs>𤪺O{? :p o8(M2+_, !4؎͟yv? C5 w'*v>^#3J l^ hV?TǏ"$*q*y%bq!iPBѺWCK*o\n./ý:@hc3?U|- 103T8V^AݍuhB$Uh-;PJi8MuCmi꺲ݽ,Wơ ́;H)Ek?{C;t !(0 g/{?@s|߶zGilc(Fm&3gԻTjdq5f'OBbINg χedj^ffv@#/@B@%Qߢl60JēQ&zP5 "̍쮆uHo ˤkz[̦N?F,'p)zx`{\#l2***ľpj~}}эgJ#ϔ s@tPtu?.$IENDB`u1f943.png000066400000000000000000000022161326020644600320270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dEIDATHoUn̮ڬmRFBodcHՄDwBx+;BǕ!&&B4A6]ΞEݦۯ(ռ{̌` i(.!D')-r.k+x'T*,3LLaycuA8joKkBLf%46lh,NMM]UJrm׆+e \-$eo iH:ۈ,g=," Ԃ_i-nj`?4j`BՀ{f%OL(`ep=І Z|* c|2] [4E5Vݿvw$B7H3Aȭ?a ݘ*Pt:ɖ`@JH,[7/liZ$st{a z}zKhE{4B7ZOܽSj30*1@>hzET7qP!DGTt:BeYASa t\]ОmIn'`wڴPW'MRl4r@rQ POd,GuW[jS @!8KW䅯?Bu ߯k(K7"rY:$F6 !*63Llo_X^  JDwSY9'L g[r9ħ Xguޮvaz#ZV'c9(8oaSIENDB`u1f945.png000066400000000000000000000020001326020644600320200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlUpZ贝 r M-:3-ḧ́ &&.`AIt.$хlLLTbDLL4RhA@[$ ;-03`lKp˓9~|95ᕓhdQ IߝȶNJb@" W7© E&@ygV]AHBHBJQ  wLl:΍H{oOlxmoʿhycF;txTh؛ Mԡ=?h&+A;b-P Gn0k8 (u}{`ç3_`z1,vS?kEss ͳ`h7(Qx{~1xr:Cd xS"[x4zcű= G<;p 87rpԼ~jO MK'g*-8-Μ0oNT$:g_!E\p̶a@W (MW-b9A[v,XGBlk)g`3y9ڝ hc/zHaZjc`I8ADELx`5 (1Qo8S C}'$[[\DfݚYFyǑs`|{{:5۞WkIENDB`u1f947.png000066400000000000000000000013771326020644600320420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKq?gf|YH2),vh*hQ`au"ZD(DTn6,z,"I+az7ۭ͜=9c7/`M=WyMRA[lfD'c/h謘i )̲MCl8.#Ă}hfh{r1nB՟n0<+e@f`hKrmA\=v"t0e Ub֐.n4rH쎝/}9̎w5Y?U3><"VkG1ʐ}'g8~=准g7lxZ}+]xIj+:?i!/DZgz^Yqթ+Ѣ=fPzQdzFyv.rsr[sQX<`JY71# ά"Ӯ\N1PcsMbHyydB臓0jaza5xZ@]X舍&RHDj|Rve~;Q"R.nO(QT YH F7H$5)eVɂ.u  _PFVq;y(4y^߿A dc&I3>p6TGC7@=ݯv$zqSIENDB`u1f948.png000066400000000000000000000014551326020644600320400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmhMq?sekdIKk$"j)bҦ"t=d/IJjJDWc70޻{{1sүCɉu-`o/Mh#v64ЉqPgM.D(vwede!i%I6's Ee؋#P'k/z\=u"vBN;%z:fF.q<ƿH ;CN) C ZVθ:&8=s{dy#aZi뜉C^+m*LAz;-~dJxi2`۪(߼:loo <)++-O&S}87]6[ ++',RbYr#kH4\ 7hi:"&HubZuћLG4~9^r`bN0V8u\a mS7akt87m>3G}}NR\rCK,Ӧǫ\^FI{\?84* M0Wa l0]9?b j#3'*{@?.Ҍ6;>zRT-k&%=:cҘLO wN\5BͲHmsL z_ιGYy 7@ Hʍ#1n׷R?s z8d˧33cn,ɥ#K ]}M?}0}NKEbCKPB(ߛ|Z=e<҅}nbR|D[2֮[P%}`=N^4_EfljF ZhYS˕7q%}ۢA*!KVA3I_ɲ=뫳˳@iCiNLu-ig[E^֊'>NW- ,_u_(Ʉ|oW8ӑ?4T }+!1G\5qXbTdB +'; T7IENDB`u1f94a.png000066400000000000000000000013021326020644600321000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dyIDATHMKaΌ^Q"ZIK-iѢ]uV~RJjD!s{ZwԹvvsyyᐘ^s ͪQpEt5k*v\)3zԭ*>f{ͽs7[wvc,[~lT%}ZІWy+?@xevi .מL$ocmqs+,mmPJSLՉ#o)}/O<`6].)0hW2b ܃MWaU1/} 2ٺ cLcPLmnqpyU/pxV;R,PJ[#Ǐ%P% ^6|V,\c‡VG5D*:|A12+Y`]w­r]*t~{)m̏fF%P[/YWX?DE<#NBM [] mJCl̇*6{o{>Z`ԯ{zC=e 'YۻP7gA!'|Т/`qg(P>o[cDbN_Dv/7gTDULv7Q Tf Пq5IENDB`u1f94b.png000066400000000000000000000021041326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOhTW( w$>L0juj5 V~OjÐ\<|p8 ni64eYtnOj˲M0 P*jXlZDHj5D0u]t0r]M8ZkbDw6}Mz3 ۶At17cׯUԨ\.3??ύ7 ^N4Z}liiɸ}6dx<*z#GPV) ojRwuu5VVVN*~Kw&l5?155Ua:m%#vM; x R?R鰈LDdiaab1={KۜRj:.|>!˹sn gggye(zt:ǏoZ3i7SSSgwg¿L YIENDB`u1f950.png000066400000000000000000000015011326020644600320210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKoSG97c88Բ ijSUTJ@@MUVtM7[ uA4JHK_999E)R7^of5oK18<9}<G6k{)@){O2H1 D |]cSȤ O[ZW3;/YbYmlZ'º9YW{6Dr8P*XAa8ԏDR)ơ)!{ÚE/Kg[,-*W}AtC0tþ?nn׺33ƑgE>% G[S EQ&V[z[ P*V]:vqfRKZ\f~!NKd jZ՚dRlq#W yD ǻCTCJɾ+ !o)>`n>ߌ+PUv]asn)ȜP$YJ`u7(JU,) ,\cEM̋gU$hи&*{H'kl [Q%јP!G&MbƧ`>Kpl%КÚ S/wgLawytԱLt4,]G#/$)<'Sp ?~ l ۭVRӦfm9hX{Zqؤgs//cWu+겐"#0_dީuqGbb9E)S1pH@V8T̘ÍfFÍ~Qyf/NEn"SDWNXcQ0 bѪ>E7\D̙Z9A*4B JP8 deE z\6# 3!JREUP ZqWƧ&g2c҉l-xt^~uꖫ+v'X(3.Εrd+@ IA$yaJh@SkH#Eig,1Ŝ~Y4vlKrd<yLgH 6]_&@i=B3u!39f5! u'Asw~tKTRVg=vOb\jőJ 1sP5y P9\l*[X}څMEN]] @>0)"7""1p~aۆEC|XYͷ2SaH@PI#|^Venl1n.5T,@D]R~d^{IENDB`u1f953.png000066400000000000000000000023021326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dyIDATHU[lTU];0Nt@Ŗ!K)J>@DccCDi Z)U"("J[ZL;ew{QTjtd^Y{2B@8U6V!V`^kbs@`_^E>;3>XCj]٦S1_u IEB3#3{0"FoW֯E?)\O6_*"RHRq \R BQLEV9(X|Ժ;F)gNgYܫp.oM@7/6PJE)џ6{֍r `zǛyHćCj졦j;E0&L "aɻsqBVE&ڝ5Ѝz0` ^Ow29S0xgxUJ4UͯHZUa*ơDfPӭz򓈍f D<(T]ƅkhdXk!MHHbꔷ= Cz.$Rr(%Dc8N^=^Ŧ,u=xk՜TT5O FډH0"eشeLb8=*Q19Lߜ"u5$З<ڵQU~Hb޾O%;߈Na֣ 𗞃}Ϳ9w NVb~(HR\83s^~ДI4І Tr26 ]p];ǏLg%XB|Mgt`pYNko]~e)XXfwb#þP#+,P jа&/s9@Pu~f`x@ĉfDb8y+EHLMk3ڀ 4lz.&BHܴV2p9A_̭\h0fJBd  ~+Frfi Ym8vo_g91ђ}wX;)މ/A>M`DŽ6SW$.ُ@IENDB`u1f954.png000066400000000000000000000013611326020644600320310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݕ;LSaܠB!u18&ct`1  ` hNE&Mԍ 3`[,=І[KI'?KVt7ZD; ޣik~〗u eށ\ivUn;3nqmnub%@` _wnr;YN0`E{C_!LӠjCYڀP(LhU֌(mk-<*F|ߧrkK 3Nc25A5,%GnX323*T00>$//w!rAmZ >ݸR7.L vR" `ϹXNDMՂB]Ss'`YV ψΙu*Ŋc-J=mC]@I99M 0ECIiQeEX ͼ j SQYd(dsRgO h"Rl:6cY)J7^9.J4457V)~QR|upsr==z(d.߾K<kvtvk(yX ׍;N1J|l:`k6 cׇV2^wѮN:쟫Q1'q`ˍlOixIENDB`u1f955.png000066400000000000000000000013361326020644600320340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHYhSQ9MlQ FQD>J ֥$h" .j]KE\PJD$M;>4Ēy;3\A{sE(04-cHkY:z|'WeٷPD^oԥ͓LC[b?JZ{kJ2sښL&d>b%LȆK2|ѡFQڌoB Kf(+!ж(ˀA\pk(E:T13OqHGK=EuFxfqcx-0 0Fko^p ab(Rk`i"Ѝ@e*[ose"HXڷqi=<sgY"EwF X (@J7НY9A<$ S{yjCRt* ҕ{y8"* ¡'$C8X+u9 C>Շ%ZS%PC_eo?h306q G1,M+>U6Wbt@t3Гi(Q tjo/#g ǁ^v No;!XyWadA\( H7#%IENDB`u1f956.png000066400000000000000000000021661326020644600320370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d-IDATH[lU̜٥bZ ZQC[5@0Cb"UxIL5ES!1@Ic!VDgŶt۾8'}s3|lBVO凟4BeSó83TY <MX3<9\-`{y݉/hiXFOj,Nǃo86gliXkЙlWcaEw֙=&Wy*hi #Ʉp0ucXLNvca 8>bB~pIX"\Fu1hH!gq8WJ lj'meS50?+e~׼x@zAnRWY+csk IealF^,t_N  ѸэOlj%|>@Pg"_/I)zb`)ЯLdgmJa5,q/e#9h0$|jE!ci- N 8fcԈC4R0K7d2O^m~h 8wj.:wN5}סpy3!cV7bRvt(B" 7`Hoz} 5A`O}.Zh--P}S:Fׯ`(ykOɕM.6>7d s.gۀU>5uE-uu\>fh+M: x:n JޫJP?T04ޡC;mRflHhY Gi"d@]X]4/Okjh F SuMȍ 4[|wGGY;rRd}P QضT&}.I( y ļvWӕXV[si.X*W\cq;1Jq^r"pTG1ذ*vZX[M6%@q(@ޣ)~%VtϞrT׿ ZIIENDB`u1f957.png000066400000000000000000000026251326020644600320400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dLIDATHUYlUU]s}}CuR-C " AT`?LT"AF?DbH0JED"@KoC`u{g-L#85/yi8V_UI?s oٱGL z`^\ #0s /h6_%E2L.Q J=4 Y!i-[≟-6K"󯎶oGkc+P` L./~Mi~7'׿|yxh-7[ +\U0Y`mX҃ XrIENDB`u1f958.png000066400000000000000000000031521326020644600320350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d!IDATHkUWscΓ 3Ƃ@m6XmԶ) uZ[jM&֘Hlj@4̄4M-PLK2 3s﹯sHӦ~Zغ{DV#Jģg?Q===عy(*B>k,"_I QrF -6*UXw{=3QjN%iQtWYwc]Sȏ/Ol{Qo?'[w)o +VYV9p,Z'@iL\$.$_y3 oxkq^C~я vVCF%ٙk_Ґt,'gFdQLP=а/17얓#Wo ,{w@ dSk<8}Cg46!\imq5qA$ e{A{iSUK>rhoX̾O{Tbw` P? P Τm5Pi #K|+ ZAu8:RGoa#q1|=&Aw -)/Q?ܼw?%q-O`P ˁoj"8*8c&xXƾqg($ffpkY^yWDylJ BQ$SδdnV R j2/Db.Q$1VM @-ji&^TG}" ɦ9R?C^ XniPfmJM9t!n J޸TNo gԹX.T]َ,8ί#Q@؞8YI!*>`mxa:ýfQbΤ\i T/*qHҒ}QtP5 eV0ɋ#36~kq (#cV >cP/YsT#[W 0d| hoIiT U$zn-œ9LHN!ovL :˗V!,إwV-ki,]hk9 r)4F>xs݈@Z2X΄u>9mh ey,ޫT)! sT(dߔ`dž@";DTTR_W gr~Q0tJC Hul ooMݫVG8,r<ǥ8-iF:V[`JW7Ab+دI^7;өu}-jaOi Q˦!,Ld@WɏzSνc1+myQXُ'@K/PJ!^^E0W)mI'(Ly Fwu+?zܝL֓ó^/a*] pdt.LEW ҌoNpem}؎/{EPMoFD_\`bdh$|GK"4|'9v*C+FnPXPz*'sy 2U[*t~/*pt;9Fi7~Q:ѓ'?^A`5Sf?g ͑(C3`7с›TH%i$n ,@Ec{\'x,>m="P~UUmw[ =M`j%v1B"%rX NzEo O .`PEm_c{C_c{ם|]?dlwB1WBP- ~m5iLTz @P٤4c= <©A,'N8я"1u[bEt?\ iDO֖iOF0զ [SA)MXJH!B|@^1GuuJo1tr{Ў6l\v.K+xcCcU hLiU ŏ0 7>{FN[+6 YHNKQȦB ,¬A=VӸ//|9<IENDB`u1f95a.png000066400000000000000000000012161326020644600321050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dEIDATHkAǿowI؂ѐSVz[QM"xb^TjTOo%M)zb1?vgwfI6|>oexg-Dbآ#K0hP)2L-b\`ڊrd~O"u"^ -p6/}Sх~Lh6sieޚrY%h 'A.׾ӣ@ p+8#%X؇j ]6X+Ҧ(`mGvR*( `&]A&wwaK+sK LEZ?CD 5,\6]LD, >~EŒ D,EߓY ͜mwh񾴎2bz1+ه>P<QEIox=ݧ|Æٛe>(vZu1c0_0>5w_X~n-ɍ|3M D1$¼w> @>"%9gXc'}=35<,-UEjIꪦ-ysI|yN~op{,iIQjf(T1w1j'jkR ~׷qpY $8 c8 ._\Y[ ne)ҹ!JIF-< 'pN03:l@{G%vdiIF=O^||3i56.0R_yxǖ A8~"tkR)gICIENDB`u1f95d.png000066400000000000000000000024261326020644600321140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݏ]eg9 -E(4cjIH+%rE&ꅉ!ލ&pCHP!)J!ht)N-:tz:w-/6s!$1}g}elr'}_s&Sn0#HQv6?x}sroڌw`jH X\<f/?mX8y/vֈכ>uWJS!j(i"ӏʙ/`aF\\H$⽛DkUAu0[αyP7IeT%iDP*K 41Ŷ# SqMRM3)p`>x}{>vGvO쳾O,a'Iw3)GՋEF(J+Tg8^qJ, Fטs$ﱫu; Dq%9wdYDj5wdrڈPuϬu|r%W140p ;krQ CӞ!q-.\9KoAzD+7VLjTE&;E2y!E쫳g&Enb(܀HҸkWjEfW;i[cȭRpcubeeD:ym"3}a4m!bsg.V^f N^}8hbҩj5k?Ѱ[Yh\[?5}]9ʣ`%iV-u*8A mr5,X=g\{K[o, 8qI;ԣ8q`z%Y?|Kxow̗_>M >!!"er'Ku-2v:D߼~aX<9#nx̫˽[Jk ]r8IENDB`u1f95e.png000066400000000000000000000022231326020644600321100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dJIDATHKh\U;I[ iZ,- tg*j]H݈R JU\ƕ; *"HA|`}Z5&MMhIu̽!-"}}.q3M/m[>>\ ~}{72Zf7S/u#58/]Go 0Ǽ~UǺPND=#Iz`f-'>WBGkbmz^t$Һpڶ6Us$:0FS/cgi]["cR4q50]gyGWQ HSζ֟ ۞sحEde(p[;IvgSI#/ ,CmjdR! P+l[e& n k 1Y\G"4$-.^XR,%Mr؎:,-Xg/"_ ՎVc^>=ݚ!e;QDT~x/$NK ]ejSb'Ԉe$:HlĵY%3HPr[®gXFD6vXD%bJuQD_!"0kKӖwUX\=7*M)w2` IbuoRاz,m):wc&6-[gzvGW⹤)|ZYTFPRVA@T scX"Jf6+KJd.juI#.-8! DArP2kR0@:l-.dl7&FIPq庨N\-Ӭ߳HrLtc0f+ldBtF9v2-1ܛlO_:A !%qBTX}kCm'^T!Sx=XvvN }qĉTj^v뉞lGV~SC5 W~iltsZ" JKcAppߝ;}3DaC7L96ZI"zH,0gZc/Be( qcl”bEY`}y_IENDB`u1f980.png000066400000000000000000000021421326020644600320260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕ[LEgfw]v.B4Be)KT<+EԐZhlj1>BRIӈZcLhITC11ClQ-B.׽|}3\* }ۜs˙ VK̵ȍjTUW9~.+Ոkm&%'6zJjLm+Pp[س;DwkMF;(&iʐ/pW6xfo,A2#2?KXAS8_Z-(-bOjhh@Gs J;?.&&&p:;P赌ǾE!'Z}gxܗJYDi^LhE,CbЍ"{MU )$=Qi"(ff?1yGěIFt2OϕeBe  휒 `oOΉ$Yzb6lu*x+'wk!$>5j#-)j 8o""w7_Wʮz=I9cRO'CnAGR6k5>;RI ljp; =7ofLc@['*x6u971`@%<왱Q@=ԩ㭘_2ud") u j&ZmSTZ9z 3=v2usk`SR(g68C]N&w`'I?p'ESl=6JT~xjg`p0HޤbM5VM3qŠg2sӱ}_ʊ>p%5𻥹~Hd)[ӌ btXN]`Ì:F,BFYt.qlP~KbRW\,?>ܗ w؄O4`ޱBfzG54۫s|0ғ?,S_fvJmZҎVe@[z3/ IeT(IENDB`u1f981.png000066400000000000000000000022631326020644600320330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|djIDATHmLe}^8p:`(&+t6Kw\flVkj5m %}pK-+· \Η4J yD!/%"vpȪ}}_#"kW"<#ZR{ۋ+LdC0$)[sc } ?b hџm ywjcTϧ- EƏQK7iYƧa0?G -Yt@\ ],Jzj7ÙdDӯR6 )\J7c@|~@;qY[Y+ XM;ngn>(o㪇"X m'th4Oܡ0`BAz0Zj@gm-@d>7Ց`\"w^>ݦ Sx, C@sɩEc\ 3`lZ0~LO;mJ0)DQ?xoƀL`nu\ k7=`h$:kJ2_rAI6BB2#/_YJ` %yamR4(ɎMb:'~+_gc$-g%|%i(Hq+Hp] J"@L2i$m9y}̘Ϝ).#xj6CPTC;,16ќJMB=m8sHr01ﭗ9Ĺ|S+$OJc6L#%A9];ޢUn>uG"1Kqm{XީZSr(yb ̑8t-:-Ҋׇ|T^."@PP426o]s( p! +?n.aX,_O^/ӒiΘ6 9WuMEOvIkA0 ?ICkƃCV=_}Q4K\BF2 /wd5&VWWʟDKZ>AQ3-ndF ml*/(E3KDߤQyJ)D*`1b Ss9g2I͸ֿ9?Cn~u׵T3s*ʈuw2غJf@I^~?z`3kBtѣɱ72P-EOu{Z*%ݾi,$]%.Zd;yC i8۶湍ঁX`(p jM>'h\b[n`e猥1AtݲU @ &F}O5~ޞ՗01Κt^Aǔ0(qұ3@45!MꊏB!5ܑ R?Tb[j m̬$It| S&Ti>#u&\pb dzзo&~ f];~vG 3,{/]E?GR$zߏ](Lb\`Va4 w"g}k ї`tM7XX"wRA5s qRwJwJow7/Qj~SpD}Y њy2> d%F'oڟhϯ,./± ўkG8k| v;[Ȩ8M.TTfə!N-`z^6yF2|5͡s8N{JgzŶ)B|/O; rruŗjz`"@ZX|c FᏴf@QWyH5]Aۯu~`gԽuN;#gT/X&oE>lE6;R khwG)"Z)繎9a$v+0mr)˛TƖ>\>\p3q#٢*)i*o DX(!˝խ1J8vGyk= ǎu$C;}x]UaB\\ `YBUQx*Mya / 6:'LK6D:_| <'.\Z8L1O6 !QISr px&^FV!nFF)/7< pXr}es17l(LdH`L0upXF bt6*MZZI.?.FU)3p(oZZߙҦ^>ؒpYY̮:qy[Gt D?vݓ--sg?Tā x_D+Rη G q:^nvUM#HXKtYQ>GX&J ^<~f^Y@!IENDB`u1f984.png000066400000000000000000000022311326020644600320310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dPIDATHT[lTU]{g XjЊ-" S"&? FDI4)*5,5RBivh:;? 0Eи>k}>'ɉjK.!@-BjKb L)A]5Y^J<##G_ Ga9ϟ_;/{NHWf3nQ{ͳwKj¥9 ,B# 5ÙI.Rqd$v~4y9c2 S>jzW09lݸ Ȋ|O/ɚGxf9yNR 8oo)f_e-FvIv|Mdhы[Ob?0>1=-*bhmP] fiu^6+ZkltokpZcl잂V;ԳkΕ/F$=-? Dd"`l--i,+{EHӧ/iq/W}ӹfK2@Ȃz+`g}}L$Ɣ3Dn[E73+"mݙ˖2ĵs2Vplc4)k?i:>&_|y^73 Ό8-(O $I,[W=O%kd ֔蔄x?zN ~鼓k}wq0.WvrddLyh/'䗿v47n2DaD̘rl&8ctN4wTIz~M,\GBKa63Y$ >Pqy_>P%X`(r{|5T^YM$&I2]o_ow 0ګwMG^P!6-R $# vG"k Ef3kj  t=q޼U?+]Fg/!@_2u}{)RޟG2!;IENDB`u1f985.png000066400000000000000000000023251326020644600320360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH}he?{>wmZƺ: و0!ԩhjAXE8VBV.SLfMz~Oleu{ssy~`+))ѲͯJtQE]\.-_PZ\txqBkHyW)]!kwW?/^4UX_<@] ˲q{Co~U˪nhm@Bm]YU5HdO/LlqRv3RB#!%"H`@(]:ՠ#6W iؖjml'i2%_21GL Ƕ1t3iydAZNg-\j(z:\԰TRXdA!8vl/e"ll>/IXeS)4ojJM, wZ0 t>=ɆSߐ>1!K)ƒ-( % IE8", oWYVqr`6{NL覧Ԭ~ r k+Ԣ9sq/׻q_ >y_ Ϯ|))44gҕhUZ4_5fmZ$3_ |=\-?9yT Gc~2ZgɩV=9s.z2ؠS=ԚT̆%b5zǷt\=E?TǺ^A?q?J0jKb9Z@j؅W"6;4fnUZ_>zR܉ ?+p~p9Ƙlnh{b1߯Ď}EnU!D.P*$$ڈHL?`eBRuhUY,01th8.ig컷KJ6Hy/@&!6l7V`jvR8i}遖[[wOM:LӜz/!H /o캟+4)>rJ?7wmo窾&%J)Lnn6zui/@U,Ә `0v xum'~h!tuAm$@^  qApvpks^ PVzIR}s'x(aȔ²mB{OUgwz̄GU~OsSeXUaw[bܼjB:k9V$uKkM+މ\r;񋷸HIzoi5Pߜdlgy+Kkv(۽4GI]J-́怱j q9+wTJ,qs9o(ξ# <&~6E}UlPM5S!NOGH'ڻoDɔ ?g~.~ p ZRЗԐ|~ס75n-Le[ '!+R3q7AHrO}OxH {i9`1Mp`kinTZ L@juz.CŎCQ^)@3zC  뎑~ bH9DIENDB`u1f989.png000066400000000000000000000023701326020644600320420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[LTW}TKQQXVmT>5ԦM0}hԘhM#I#iRU` AY^>br͍ş}oDzX\EMCr뫟b i\H5Ne!S+(:ϧ$4R ]) ܓ]'b|{6&;qB!MB bԨ^Zrl R#cE/6wEXN_ۭ=s(AM1@p9xϲy\vA aFUߝxolq rdIeE{ݩܺ-w[Bxm)mh(\YkSH(yv2gi1_|unٿu=u^GJI**Gcc#;^,Jx82h拻V_C7dxPZ u}$wJ.2;F)' IJr&+o(`x*" ה㌄#c+$L=X^R#rK"X4kl-p*+Kt`xCWK z8LppirV}yGw t8Iv$\egZa ݄'̑Ԯh`E]"ZFRnSUIqGk 'G&aY E d 5+NSX8pRtOXc3Y؜,FPcw M-氋}Ej=g yf&6Á==KGB![>\[FWkCa4ZţE)@0b*B^^ιuyFR*Fа[y%hvCX$fx&h\1,=]VNj) JdܞMD@S@\3͉vǹ콄$`c(qݞf r;`-zvl񄉅` ε{1v,<כ7;_x/C8 xp7  p7,3W{cCoWV' 0SEujTšV5h =SUZbp zN28x9BC[/ ]*T.3h7 )\{#+w]I,s1?'iOpH˄ha o%I5/ ; h:rt"ĊCΈ\Pvn'M-o..w.OBGjhlY܊Zܒbl?\8\@>%h/sitm|}}8T7$3[Z;@WF"a-[ƍ'5WuOaCju\)cwJOKK's^N222"Ι8M_~lReO>B(sCl]W'J?p(㠪XkY]=΅q nǡFE]8p`-ݷʲAQmX5't_'U/*VbIENDB`u1f98b.png000066400000000000000000000022641326020644600321150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dkIDATHKlet:N -NN+B#:S@FE] i}$c(JDqM -M BJm{]hr=;H kSvr^/5ߟ?:[ub糡E.A{FLE IR;ۿ_o?dyͫާy%#bS;K58w<7A;a'Ɩ2nol{d&ug1JP$eiϨ^ٰS DmNvO;%1A4_?m6}ptfVnDGBa'{Wl$u <)_M(5OBDBm]psDEL%&tT$*6b u0 QVMOS}S.%S\̜\6%Q57g4&lh 9M bQf1zR%t/cJOSz~J7 p40jm+? {5-I@u[2.%3G t'nX9fK$0AHwI 2gp4SgQAbOTX3J4cft'})18V Flp`{679WXOL`0C@'p\J:`c=<93_P_׬Vjk,h1ĐCZkk,jVX  3Wɻ%uR˩2f2qšFO?+gB55qP4K /G5"QFp^I 3'MxA^e"1Fu~UY kbzBkmƹ>~4XBrJ,H0%dT\sႁxb3Gn~.T+BL2#<|}řx ?x}97_ièý}zd" ;:Jw@Yblxh™.Wڏ;в>T' ޫ,\/0 v=ڝE0 bG;oǻZ6\\lZ=_j&yzIENDB`u1f98c.png000066400000000000000000000020701326020644600321110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTesβBlI1[BhUR,f1%PB\t@RcB|R#^H ^J bbjSAɶ"F E[K3>ݶE)93o!ِ.-\\Q!#o$>l-]o!!M"V ݦݨh~Kb58Kb* @WRY,M, JM ϫJqé0m̟woZb׻m@AG"U~_|œeD(`ƚ@0`y]cMvV_*n.˲oxu_N7ҧC y{7o@m{]ã1nvB0}#e4=9ъYKz&IENDB`u1f98d.png000066400000000000000000000022551326020644600321170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|ddIDATHUKkWCV42"Ļ@Qe Axl P(nۤ4 "^hSClw/b;-aTI3<](XKw;q> k@)mSJظ@KpP(|$Oa뺞][[fC\nټnCQud2څrf\'BykjZүhQ>ǩjm㠇If3>ُ u}HcDU|?ΠT*M͕ժǑJ 2l!Rگ#b$I҃ Bh4zV)!0;;-Ȳ,<}pM B`}}jPՔx< -8?vǘģG`Y޾}R)nic,Z,/3PPUUqc ݒ% lhd?UӔH$G4O;'~Ùpx###&LϞ=dE9r4Ç^P~eYx%! si$)!wz^xM)TM7umܿǓs9yDEgR uwgK`ξgK63chu?u8@1K83_w oÖXj&_P(d-,UT{ҟqӲf(,srhjYSm1TƍT'poaU\\(qO91nکOWq,9"W_lp54+ `4s̀n͚\m " )B}$\|=Qo,+\`s)(2>aVIEmxk`D@v$1a1;;ݶ(%y乞l1D/ #42l9]s¥m/xn~4{0)Hme B!PjivnKsA^4L!;#r5Z!.SR7"43W}xVTGE7JR02텠Fҩ)UE8TLƕ) >7a`y麃SI:V]9^ wϷ (Gہ{;lCg[7 *eK{۵~Sr[6͞f/x~Ẋ!}L }zcKjid9=aTJ9oWU*gPꁿRc#-Qz'5UEvX($߫_(5M~OC^q0'>>Kh\@f~sZk-<'_M36L3'ǁwg 3p3 h;gRSE*Va7H2ݝC*# v4V)7Ud9!]=H6([d+iz^kN/遧ʤIENDB`u1f98f.png000066400000000000000000000020261326020644600321150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMh\UIF5AֆJRl&IXtQl[-ji(JK*"BB,/*BZ櫙̼yͻ.f&I3Jr9{}c'۞;_8쫏#oܲ/vĒN5՟?O婐|tffG*xryعkt/56J[uyO9`G0ItFETu;d9Q"4Z4ENO"!igRk8- KiBLR) 8`y!pOOO$...{{]i]@/05J mc0-39arxwwwoo_xiB;ZEr>JIY%51 Idv F+W^];p֢gmA@bnaJ&]7 DWuhy7f* RX2LҞ0 lMCCHp.ɔkڎQRː?.|kJ91+ƴ, -/;^0OD}kp]c;7&+bINFrJf'iFzND64W+MUcWD#ͪ`^mc9}?/KkCwE*b?]e ׅ&أ)T,2:h{ }ʟDkvOH :Js(7 @82UwDX-7Ƃ#@"H5lIWgr2*Jzo Oѝرql y= SDF㏣a?Za ` D9SXmFb$IENDB`u1f9c0.png000066400000000000000000000016341326020644600321060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dSIDATHSKo[EΝ۱km:@ R@;_X! VHlرc*ʔHHQB'oď\aظ)e̙;9gfG8_|w: 1I@DO40 }Ӂ?SQ=%8ˀN|!}[<7O>O[ߠnuk#}0Kl]b߷xa>Ѭꀙg/ ~'!OQS[];,; z fY.™lFM&j[.}?&{Cw/ܛYyw/:XlDF`T[^Zil5v5*zsSHR Vk;WͮgTn}%#R`W*}l[)0wY{]Hΐ3paguc۳xq>?8XmK놪;,+{KF2Hܝr8m;Ǝt3uk&jPvw]0R~k1U0b8Wwz9õlmc̰Y?foX{f G\Nz=z`sfS.kDdqZ[ x)̺z*'MԷEEl=H̆ ǂ}kW bMý/7lSd#gԔR;`eJ'xϼhgg/GJ`)PabO9ݫ&*dV61PdƪBWp :h#2 :t"ePs.w ; VuO3Ė碨A. ?C_o?eIENDB`u203c.png000066400000000000000000000012111326020644600317220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d@IDATHUKkSAܘQJT*" 7B+#+ "ueRҥ A(ujbýs\{I;<~:8rϒ],t3sR YjP p>R#؞{XRlH_ɕz=47Ę-PzY6@0J~~azk Fpٯ`*%8gȔ$ {%;TH `%1h ٰkE(bjd : Yk䰠3QyHwfb3s@=#MqiSˉ@K\k xJVFX摣ІBO&|cc>?׼/~Pd^)r& #z*/P6n1ggoYc2$^=X?Pj)\DVK{SZvEC? 0#yCϏjlFc-G ^ J MmɽHKwHSL_8?ңw~gIENDB`u2139.png000066400000000000000000000016031326020644600316560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d:IDATHKlUscE5BUZ(~V+< D*DUMԮkXBDH ɏ( "!qH>2" Mfչ{gȕ=yC9tI RE_ f78dt @n5 !"7{^BL pf2&^ىKVsAQ|\$ʮҧ| hl'O>wk|`wI뀢|^a@wyi\ȧ]:"d;:sz'gd3lWšu82[Jիn{jF0T\yev;YUh*4m돮RXD\#b6n!TlNÉTl ;g ɭ`T;Ү?.UMtFB=*9S)ѐaKD )UQC5iU_ѭAkɃ@GJ+:zQ*FEL9Ps@)6T8?/wBPaxl3fzpSDn 6.W`# xCƿ^j\wKK}/LPa.-t6ȏ@R#G` wz?~>8{ '=/UF#MNlz҅N$* nrܧ· _oTяw*04׈X3~ ՝3pC7^/ryZ\#s"rߖ}”8XX4}[IENDB`u2194.png000066400000000000000000000006301326020644600316560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dOIDATH=N@߬A"ɮ#BB :Z 8ti"4$5.7HlPF"EAJU3o99YvH7\QNxfd&L)/>&Xyr^́ Xv(A`UgAqKL~Fp8",[dӾP ymlPU@9/LF]6Ц/&Y^W&b;;|mlϒP*3@DGv-AmC&<큓yw3fy4>Os˒V v'ot`}d^o('/|HCn1IENDB`u2195.png000066400000000000000000000007751326020644600316710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHj`'FQmTfSa\]+V ŝ.7HL[^X'.*ؙdZgܛ$0ҢEٝ&߮3nwFf)\.-ս5$/ Og˵&-)PdqN+o z軘Dfq^Iyz |]1KI?%g i'#=ۿSMP8ahA'O/}6ۃ37>iQv|8z79w]ҋÚ?LI6x &~?|kkUdPT=IoZ,n e 8zfpRlsv?56ɪpTfYcc;3N @^GIENDB`u2196.png000066400000000000000000000006001326020644600316550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d7IDATHӱK@]m5k"":tOsp(Upt׊U,T:M9TKkE7~\I}H7V:KBLg! uC>!>@ F5&YT7 @"(հnXͦC +7 R ܙPaf`pP7)F~&2LwQ#oQn0 b|)o189Nz? b.2WhR0@P SoE]G [b9tpkB6f.@c-^<'\PzwIENDB`u2197.png000066400000000000000000000006341326020644600316650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dSIDATH+q_we9mRJƮfVH+uEIࢱ58$qZ{_>y^z>>NG4jųcƬ>ᇳp,uFETQ&Trph\0sv; @Pr~9y bXj=g7M dPa˫CDjYKJ]A*67D\_W҄ }q 'F\8؊nPxNŰ B=N!C_aaWA} .bK /W&#'Ucwx їDJ.OkN>~#|73IENDB`u2198.png000066400000000000000000000006411326020644600316640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dXIDATH?OPma0Q:`]m\\@gq4$ƍq/u 5ɤg|˽= V,ɗY/z:'((tCܠœ:nh9Aִ6np` O>]n؀ŎLs K3-a?~|W]"K \p 杆 =@3-~>k`9T{ޚ6;+u]5ϙ,2S[';"jZ䴐赙S^&͋eus+IENDB`u2199.png000066400000000000000000000006231326020644600316650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dJIDATHMKQ33F %ZEiSVQTԏeWB"(M*kNf^yq`I’mht28K5)"7v[8EL߭weLGuהW̫]}Y`љVJ'zEZA+*KOA'*85ļz"+ 4}R+c ʀ$T)pCt~ ƅG |$TCyx@UVšKw>bڣS$je@h 4Qgi&SW k=c4T hzw$ͤIENDB`u21a9.png000066400000000000000000000011261326020644600317340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHݔKhQ3ZtT|Ej'.q/+.mn\ƅk!0Յ HbT"=.4!1IBs̹wuIp1/Ɩf"FŒ9捛g18^aر&?Sj|_ E^b#U @_ HxX&J4ˆ^ 9 l 4qubgOMJKnfƣE2P+K }$ 4 ]kO* ->Jk[VLv\Kd:룧;kRS )ќOn.EzH`+%b!|T > _Ah&`;m*¶8ji;zi,j2c5 aV$= Wm´A.aDQyAT*:%[5/ @\+'~~5oVS581XSR-t6E|d'IENDB`u21aa.png000066400000000000000000000011271326020644600320050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕKTQk48TFJ. ZDqG-E6m[i>ڹhЦH3T&* *q H;m1tK&guι wIժI>0*#V%r)] IY= D§߻@NU;^clu {=,>TxUP-P ) V6Q ZKG wN: DXPHOOOKCpy>] ,$dAHo\.fZj}^ BM8>>~288cZoV'u󘘘дl233T<]]]QZR'Ahff"9_ҍFv666hzzX\.fZ\\l6K(f˛Lk Ry_ڠÈFF `4 3X,q;Kt:]oww*`jj 1X,loo# b}}L\X[[ؘD8`h`bnTO:BIeajj"aK L&Snttt@ׅkZcgg76p^$"䇆ީ$y>szzJ,---Q$!nb|pJWjNNNti6?e{{{I$/xzT*&T,_ |d20]<ϧ~.Jf%մsS:<<>Bd:?=׬"|9Г>/|}tquk+{0y=p'Zp=Dc]wEW{/pQ)qMUSS[%_Xh$EY7A%-?`IENDB`u231b.png000066400000000000000000000015771326020644600317410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d6IDATHU[L\U]ܹf TƱU5$i2}ChHLSИN5j4~`T؆GI2mGxQg{_c;S]'` >=quB xp2c~;JИ28XK~0kQ^N JQB瓠r#~v#w(}M[5”wvr(=i%KMYt\n^/Q jdբC7*Ҍ)9l $ }M.ߪw-jZDVu(ۜaNJ7YM- |J0o_q/KsG|sGwjDzU3Lp0_r89|"Da*J(UJxL}13 eknd}/nMtcsSwv%I kW$I@nW+?*I:͊fe :íVBU1S~E!7 FsEϖݤ[uAvL60>\'N 'Nf 'N1i)]$B(%M <{! /8k9=繼4[-{v%Z˩)J&'p|SS WOR."b0fzT@N+pcI?%G5?dbX0kZ/arH++P4~%MEQ/._=(t咒$Ճ %IyY~`*&KxÖ@3$q]~`|pfa۴gcoVyg a R t>?&(i&IIENDB`u23cf.png000066400000000000000000000006531326020644600320210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dbIDATHT=KAw&D10l ( lRF[[K ?$,29~X主Jt̼7 cz^qma&ý`!A΁ă"Zltx(g23uyZ[ommpFTLcBooIp!y '^/"Sz>N#UTKKJUel?R˽׌jrN (|9E>{UE@2{ g$$3FB>kv% ?DF`Y3): b0JIENDB`u23e9.png000066400000000000000000000007241326020644600317450ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH+aǿϬJ.ʮ!?n wrp_ {#Bpjߙ#Dؙ%W658l"m>P"t)0pr 3rt:Jkv&3 ¥ΒOheƆȸRȇ/ ȿ9 ݊#m 4&\`B|$”'0e%4c`K&7Ağ 5l^,*c2o- 0dz!.TNB? y4[h[ߙ OϮJe4;|mIENDB`u23ea.png000066400000000000000000000007651326020644600320220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH?HUa߹G%Qι!D&M[Q IKK-K 84D֠){1ڒh A֭zW'0R5J/n}Lx/Nu^/ ԝ_.~eAa λRւYEbo.h|<$ʻX:OZuiל 9֎W^r"p1x/u⼣\ԣ̃%TL i_0{ϵ)2lDe(zuC|Zi .#LBNطQz`ǶόSQaߵ~v!2J5pHzǗkZ9Biv*\!L5p44l{5(#j+5.&|vu-*IENDB`u23eb.png000066400000000000000000000010571326020644600320160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH͔jQΤIn]I 5dRK  "#v'u:(nMi3v%JfQs.wη8'5f33 lQ!.q5@]FwĥiCg˃C~swW딠|?>a0e0Ac}{ >gJͱV#Fa.jڕ%Jkz#7vyػ<*nw7QPQ:*_]sp-KG׀%Q^ o{US45 `Ӆs* 5Bi9a4N<q p_+He 2TL /LRYN1ϣ">v.ZLWAZ-呛ҳ,vg}$#3A's}3ZA;@Հm9eN+qIL K?PIENDB`u23ec.png000066400000000000000000000010261326020644600320130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH?kTAw~D!)LB(b,J.`tCL;Q}"Az罉AO7pι\f?XŬX:S΂|T(s᝿ZD$-[F+Z׫geO}=yn[xQ}PQD6?"hu*/ gNL]P!uDSo[>]E谓\>0Eb^1\W&(ˆ˃}V@2jf7#{ly#Z: gADΜjrApO^N,%Ixyt&k 6`ve2yKhN'N~7ۓ/*]TDVW n~kf\|?/^IENDB`u23ed.png000066400000000000000000000007551326020644600320240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH픿kQ?rA69ېZ!%I h.ĀM bcoI +I .`$BA!b!aa9ɾ)|g3o`CE.]3}կ&^4eR+想ŊuΆѝϾNOGDfGcF)0E{fmPPqB%)m<}7/'P塭7ʮ1;0<|uE 9a!}hA:xlk \+Q$@yU[{=2@E]ϑUQ9 /Q) zնeg'\P|؁|lq[kr&4Q mgx_# Oڝ 0/TaΩSq:thOp0՗DIENDB`u23ee.png000066400000000000000000000007601326020644600320210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH;oAFP E l $ Bc^Bb ABTH !!$Ti(1NAbPvR KXi};o”)EL2x9%q/POTB k+9W#[\MMngATAyF7'@9^~e.p k:5zOϋAksm F`9_O9'܂j︵Cp lw@ ֆ_Hj8al/PО}!AQfmvy11\sf[jJ7@H.l+T |s^KS+res, [Zᬾ!ǂKu?AhRu4b(jf~f(~:}O7 QvEaC|=:8݀zE'oPľ͝/ 4ͨL|"^PӈQIENDB`u23f0.png000066400000000000000000000024071326020644600317350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHqLe?ɉX yNpC"RiT_jjs-lpK]%aNe cl:M?82ub5a^p{>y<ޟ"94B!*y+Q<^E*9 P%:N?8z0bÖ"&"(z?@:,hwp YT)Z:nbBэ]wi{8 Kyp ?7=c>֫#;#AVXJU[>,{" n<6P;|X73TPSIStM=72 ޗ R ()uzSwySxXg./b >>˯ExI_[y~<@! 6m WK/Oy9]O(5]vQRR3)oyqԄzPpmM:=#\LF󬈈)#Zy`t:ugwђj[I|UFBHOOh43gDE\@i{X>{%p|CV\nn.w񐛛 Y@1ʴ5m ݎdoɄngNix9@h\- #g͍2XFsD˅i!\vCxMp\X6Sڍw )a4+++ hjjbLSSSCEE0EOc} cc#fCHl6 /#glq%cZ2|)++'jw\;Mo1ۧpGLL 999!p8kC-O'G Aڲ%0#11n?-- bcc5tuuq[uI(m= CLYnk/BӍ^/(- Dѱ=[5@AA= PT?jl6-VWWS]]m6V?Nm5n{\#x(x%/f&b^z8|]z)s6 5XO߳fJ& JA7|:zobb IENDB`u23f1.png000066400000000000000000000024171326020644600317370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[LTW}\( X-2-HS-6H m҇Kx^5>(ӄD'[2`M 2 ̅af L+99{g`t:K'?gW8tL>G;r =UF^uơ5²vۆ*_ѿin&Wt{_>0=\]P^~ Tp4DJ?ΔLl{|G"N M떱9;Yb fC#Q~x|L$;'[e.,n8 pb=iG%yYd咅Dt܁EU0QYJ {r*".O)3ڪ2eVt5˅aeyVYvlZImU`k8}:3]䂏.F*+WV:he5V@Ʉ$ѨCvޟ!Wufek`%ۨ`i`oo )_RSas9]sb/t fn(C9g|?N$$ɌuǷ͟S[UD|`%} MWX92l6ZZZđF.zJ$: kX4Ol#Rfr-LHH8)3D M,`0b1n7YH!li z*@J<p8v~? x@ 0Y!H$SR555~J}}=g HoZ@YYFbfCGQfD Y?NDJwœLb۶mXlppVoMƄμ6Ri!#hҏC}oߛNܕZ!\]EftÄ`!{l~?lYS@]:]['c*Zաw7_ya +s4ֺ8}t<]u=>ufY}HIsՏȹ^Ͷe2^ʲcO3'MUU =np ^/ޯ x_QmCIZIj;{c2 )E7ErCWC>?c@oo/n RR(p͛g شiN9`b v4HHs =`hFQQW ت&$#m s)椧B$ѣGPbػw/ׯvvٳgOw[SĜDH$`6ߟ!۷o'Oj*(htf3)k MQRRhؿ?^î]JKKS.`q-޽;m:\ u1"SWW@V]]OuKIG(1"w$|kT+,-1`oiEʇoZ9Q,f{3YfΝiĉ&DHƞ_졹!'[ce9.Ϝ7E:1CLL/T$=>%zøϛ\TسV2 Ā,IGl,jj4[dE(KJ j*1Qgq;o0MT蚚Dd#f@Õ-퓉=dIENDB`u23f8.png000066400000000000000000000002311326020644600317360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dPIDATHc`RK+Uo:Hng```?ܓaL#!{akG-`Ԃj(YX~IENDB`u23f9.png000066400000000000000000000001741326020644600317450ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d3IDATHc`RKtAYLT0j  F(FIENDB`u23fa.png000066400000000000000000000004731326020644600320170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH퓻AĆFB#J h5xFR 4Jѐh$GaE5;(33@@W:^G.FM0 3YhNjׂtvt}PQpي:4r:,#9GcmenyYoW,``W@+R Nv2u0Z=uM𚯱\D]'SSVƂJ:IENDB`u24c2.png000066400000000000000000000017721326020644600317410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOW?)  IMcwモHZk}({[ }Ԣ3aki4%]Ӈ݁e!$̹{;GgHn4 !2Ѓeѩ S~4^QTaޠ?;Ȣ "]"Уp#HVh*ʨ[w`_pBZ77_ zq-2n웂  \~̠Dt3gU U: qWn4~:.e\s1ٞW 5i+#j8&9xN'0|"*aI'x0Oh mbF.:&4b1CS.@cDd:O46N z;Fۨ1UޢLjVPR^8ї_nn(B%0P#J' V~\muƠ|ET$Bc|NJNpA$@ G#c{?" 5QE4]sjDXn !{itx?jYu[a>om#U:F$fIU]]QHʸK"ۭ[Z v g?T,/%aZ P(VTT ws%J$/x#K ٤ .'.$Bdz4,ꌾ|LC9-?\[yIbLfFp.o& 'k]|"t>tbZ mTz2FVF5`^i0HD[]iS;DQ6}hM+%0hMYoId9^ڀoE( EIENDB`u25c0.png000066400000000000000000000006211326020644600317300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dHIDATH핻JQ@$!`#lD&bfQll7XH,E MZwĐݱI@%S9 D܅˂knl&pIZ _J5f@:j/~@5ka°tXpMï+Lw OIM)yPU-B_\yt@U\ F(sWOFܦw?/*`̵:y{D/8: Z\2svB gmCଣx7m:3"l(Z \T>аha79۩d0X'إ'jm+IENDB`u25fb.png000066400000000000000000000002511326020644600320140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d`IDATHc` ߿_dNa;؎,ƂXĄ)FA$Y:jZ0,(Mw[H I]4  ?TBkIENDB`u25fc.png000066400000000000000000000002431326020644600320160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dZIDATHc` *oNa'ݻ׎,Ƃj?9CHZ0jҔ$Rxbv99XIENDB`u25fd.png000066400000000000000000000002431326020644600320170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dZIDATHӱ0 @cOBFhaobF }k"6 #X&3ΖnfTd9ͬ|.m4OIENDB`u25fe.png000066400000000000000000000002361326020644600320220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dUIDATHc``F| 8$Yhv`ddl 8-`"``ԂQ (h:ǫ:N`5gk`*IENDB`u2600.png000066400000000000000000000013671326020644600316560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHo\Ewf>% E@HI؍(Z"4|I~HDBXPޙw(ֻ~|sGwfW16pB0@Y6Vv,]-u~NZ󧻭ʅI(. V'akCfcʳ2ؾiKDC%p<T&\ڮs . }E) C fV!kKb}>q>!RK/s_gG;r,v-ț\s8VX3ͽ]qcju[/4Lh#Τͱ {& :U?Pr"zC/vSf?'S,jNoV8 +0ƌ _M" U%eCLZj|u9'k!i}`4F̳&vm.C"JZ9@MB̳!I"Ob9~%HЈEGB6Í ̶$c \Q/Y1ܮW*nV 0.ԾBoO?[*Kw(_#Ue2_nb]P類%Y\hΒa`|$K'}uw@ZT* 5Gm.P.g:.2q':kƜ{1:'Z EDv*Ea1G.g4㏊Y,B ?@\Y بhεW{jl,y+N*Qzz,->1 `1FG^I//`4{'D85'&M귙ơa˵En<<*i_ Sziip8|AӴrR4MAUUsu=BDjq7 ØUB fZTb[JϫD6/9`zz-BBNp4x<. 8y^?Dt7b1i$z0^{{3+e]u]a)"精@ӴR D055l6ubddhND\NF'UUS0>W5!e}X^^0>>H];gl4 f3kjrg@ai)e=ODM^23_`˲vgp,Rm]EQ>z7ߵW,& ã-BDd#Monn><Ane27J]l1麞{~~ 7;xL qZ~p;䮀LTLO3jZHO*ԓ %^`XyI^>/q^$wFH뀜m " Ñ ZK D,^0Y8Pp6WUh">v=+!RqbCA&ஸ(uϜ %ޢ&Qw{#ŵ< q{rdbx/}0yh؊ {CXW–soAKvW&ZFZQ9/ө{yn=? ^] a6.QKÀA+DHd tL'mv/9ƊBqJ[@i,lԥ)iZA^lg}zk\'>w"qq%o+EE9$;pBCG62c+ws';0Ѝv6U^wL'Nד0Q voOїu>lP^hqۙm]]%3+9C:6Y R$جU_YI&żfGon7ڃ]F(B"Y1r͙Sdr.#/$z]ڳ3JȈGAbOZs5x|GZ **'ʤȷS7RL#o:~|{/R$cѓ)ΕLd kю#hW7{|qq w>bIENDB`u260e.png000066400000000000000000000021001326020644600317250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHT[LUΙݝ.,BI[/ЖJ#M 6j1hL>/&McIcz[H]0;s|hX`m{:37ߜs\ᡑTnZzQ;  M3 Sxs4-;~?Sǿuy.Ld TE7*FBs~k z3$ṅ ͸6Ct9QM όž(t~:ԯ[]+ `%=ʹ]92RaФ }`ԱI2K?^K6 n% P˂`jp2B)S͢PZQ#}=ڙcxiA ȳ8Q jjb@ Z7& Mq͏Zws*hwZAp}Bn:C K!H_ uT`+(WxoO'(P|re&37ϔG*)V+ù M֔$t$PA8 N@2ϐ"ĪX'7k OeRIyfy18`b!N9Ѡg$ϭfzMkѺceZ5 N4V.i6s\L`]i:-[06x3'T3+-og)="NxTh{oE84f_k ?\(r]RfD*Л4B)@QH4Zݻ\?嫞mw<\}obL(큙VI nВV!˻/:t7HřhK\^zsD8PUWdAn4zK36dP)IENDB`u2611.png000066400000000000000000000011261326020644600316510ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHMkQFĨ3I& \hP~WMZ m[+T"JS7Ņ(4 G$m*1Q'w\L4$G"T*f!2aLX.0 !D@RRRxtX5KI~'Go %ǃܻcꑨK)) Rҁ{(.,Iq d@?GQUcU9?IU6|^/X3dn|(27Eq:ٺ=vE wtnPɅL}koP|çЎM}9?] zݳ/ܯ{,uZw-͒s97ŏoFm]/o75vvᦺI4T* D\(MV%&JK1桚җD[jIM>(ZG 6tM{K{ Eg̜ leEw~*p&av/6>]. gVxY*fKb֞'Z{.w%[#<*X@8rf'Ā*%$ B}aIG!w_k*sH*5\5*lJn^UWѻdv?gw% 13g9B'PD[9Qb+S~V#W]E^?o ,}3 qă̲|gAek[">|UԔ(LW˾6$*^Rol@b}"}?/A npWNdr=qsC{?~x<'yr/aoUs@2S dʠ"3pCLo! c(YC2"40v5#0 >fDז-uM'}G*U^;M;~{/GRmnNb} eCsۛrao߃gµӵf-Ei8s&3PS-TC]u#If ?鹸Pww{tu?Cr/ży cVX2f2- lQQ j6N0cvUD>\.Ǚp]wAD>$3;jۀ"n.d8>_왅, Ky +rccC˾mMؖY<ﴈ7d2׶)bZUݲt2[9aD{wBD*0PX84rT54K`,I`R X[Z;D[w1GQtfh[0 il'A c /l0t/dbUL&S8Nr9`{0 [*2"+'Y PP__6t:Pj۷V*C]j'Җ{aESuwvvz'TQ)Tbqˤk}9eDQmN477;v =Cx/ȯBuu8Ihhv{oTt-6ETVZ.019 ψȫO%`]'l)XqI՜} A2"ߓFD7=6 óڿSH 8 ?s߮UyX,:Ty*hË;':Ѣ1/wtt\n TU KDzE䀈+Ƙ\׽]5ͷCMIENDB`u2618.png000066400000000000000000000015241326020644600316620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHKhW~7U*&bh_BfƸ 6% ZyLRQEq!( 41EK.ta$3=.׼gu9s~|~ǣ h]菌tr{7/IkZ?z;zl|8mAu%G%t̎>ONU!Z4A4_ m7ITM[ pC^dɛ<5!UPzc_8qQ5jԯ楅b\𬳳);Vwn7ÿD<|EbW7h`i4BXߜeh;]P?^QmsƘP;l FWRc{<ՠ4t)% k7"a{T"[F1-;r-z]]5 PSD؈ȷƣ>w64^#Ss-e]*m&0_%l|1nPH9jZ! +ٙ5?Jo#ҮC"M~&5*[oQ>vǧN \M7Me]Ko Y9{8lteFPm$Z\Ҧ *UW_OK '^盡+өqbL=P?J3H W֦ƽ80s?Ά]ĦOOtU7 6v"? ?^N:&-*^ ݂IENDB`u261d.png000066400000000000000000000012201326020644600317270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dGIDATH͔jqL.MbEB(ljV.ov჈; `77TBV{4Mz\Tj&!<0p9o90?G0_>XTc{\Qk],:c>7>yDe?5d̊`ܑ"ն`~Rlv,A@F8H}8 mU}͵Hmإ=沥2ت %b2DA_/Ho7w)1ZiO81}+?2D^@c} Y WX2Χ׫+r.Ƶn-n"Bšӟݫ\ZHdRD^"VoNrX0:,z%@];r1 * SM{i2+qYVm 顿+ah$8/0I:*Qk\| ̵uͯ>-KҜ|1T+7܋'[y:V Mto\X#rvyʕَIl}T.xl1]ymo8IENDB`u261d_1f3fb.png000066400000000000000000000012421326020644600327140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dYIDATH͔]Kaq֗v5s{a51H ,Ao}‹ *o ^25JmWs_fv^.lmvYC79E`2s( igā LT`7$:l2S #`c\SNu*a[?{ C}aR46VV:s<@ٞvnX@Ekc?oR0B^U/|D;˛#;}kW+AC( n:(ej'D)|ץFyWHPQi p=%,,tʦϣ^`wwi}Ȥ?${4"կh0If2^hՄӁɠD͑Bյ&sq^34IetNnnimi@Ahh 4?Z2KG ڸxqՅRZ-HDMZ @Dn''R R6~k4jrxVTP(1O ѻ/MW'!aGҟ7ʣw@kuah)Gn/z 8@IENDB`u261d_1f3fd.png000066400000000000000000000012461326020644600327220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d]IDATH͕Ka?;;:;a!:nu>1ƹ5;ys-,׏o ]zP>@HQ3=t:RdC@c"grY0=|qco_M9V9AFb`.g[Փ +%``X9ݕOkt-]-AWP(0hsC@j R @WCVWJ*((MCZ 4x){uuD2iHXfSxd] "j姧X3Qk86~fo ˒N۶@oRY~AiH" i,sb\HNܢ-K cyοS[$4(H~2`0Y40!utҼk{{'Þ#({rw|p&ڍ񩗍Ħ -y`0u+Åf7&XCR)ǟ.H&&IENDB`u261d_1f3fe.png000066400000000000000000000012121326020644600327140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dAIDATH͔MkQsgN2IEB\H7TJWB`ZZ)m ]).h=.m0|Ww>3sRiFi_WŹsSƲ<:9tcXkeܓP19p^9 !'Mb^x-`> _rlً'4D~D+G앩z{j lg IENDB`u2620.png000066400000000000000000000023301326020644600316470ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTusv향 -vk(J)4I|C"A0E. cQ^(hl|bLm`Iii^^g|lBgfm_~/Q$ם1PY}t5A0Բl^]TU8Eq! a#ZaJ h>f<|rLjUUL$ @L]/NSV d]7U_|#c/Z9{Z0#qÕ}bs, L|dlTS IP5vvj8g <ޮC~MAQC(IJ X6ދ m;tGx''<9yժ1{xҡLƖ{Z;{J|,-7EۍXlmãx}2۞z}ZUMij-xTI4u T5%fu{jEy sdjyqV y1M%8{ʊ滧k-a߉28' .qw`7h=vbk#z~Y׵4ߍf=(mGbP)i*/O/\4uj=8?a]VWfz\ǿ|O,r @S{'~?6b-nz(TvTWVFv"u_;w(-m>6:~lnׅHEyb6Rr&r{9{o'Os5t G ]>8osUǹiΤ,rg$S v UUo?; kj*!SHHMHmG X+Fd/MCRl cƪ9ٹiշzf>p]jra,oW>6*"!r~_w?Lt;#`8X✎YBw>Z  b+hb BMV`Fl"$~{ND\,7 vQf  $ptedjYiTj 2@ _W?QցIENDB`u2622.png000066400000000000000000000017631326020644600316620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[L\Ug2eziڴX|QƘVBL Ĥ7&PF}hm[Ʀ &R(BUŶDcRдf\9,\o{}'tܿ-P/T. M TnbHV ;oh7 [zn5oP|kcA@NҢp6ČUm3(UB⪿95o,<Ϸi9*h0/wՈa tri[̑!>͍Eos¯bxyT1*Vv7p-Ω"iawh ΍@mmÄ?L_+Pcw Dy my/.ݶl7IpdzZNYiGʱPġ7u认z#羏eM8L }ہE {_:7km2|!mMetEX;˦YRƣ;=YsZfFa3ܝSG#D4DJKGGf׺9Bc |jgSWnnee6@t.XyrL*&$@m!jj%. n)`\ph<PUFo&9m/oS;B||! _||m#U["tR>iq/?I3R=3m\.sX&g0kTBjM-FDzyÆIV-((>8†IQޟvN4C6$>満ߺ24*Rco}vl^)Br!]+Nڕމ ڞjCda)_$b!o|.@]dfGR7nRp[Sm4ߵPS]ڋtF{³PƭU4bmZtvǫڀ!#1J04bJ6dZRQwQ?:W y=q^ _UMYۂy l4d8[ˆwV +4ZV&^|Jg{&CPX<<0Ǭd5^ر&͍5!ZdV!Q7@o&ghpy!1%*S[_>Z=ȁ<:ZXWb[5$c!QWG#B&g@5@17.)! ,к;cHA{`[J +?]QGcFcT!#27O-ufdMӴ}sC?\-,˔a4/ Ln)!LjjHϥ !\("Ģ;='XWeA6F#JjOe`Yf30 6R0* 焾Ë'ظ"VÅE&/! ù+cRw+LxE/YЉ#Cwű??ҕ;T9 W)ݝiZ"zx Ey+<ῌPW"uC,S!= aj\(j;oX*kI-QafGe C"=Io=wM8CAIA I 6 kRXXIZ*!@ ȆeW6!E:A+:37M%T3=ww"P͵´hZY_j| EK5!.ס>/@vV sVDEbq-S8)@.7۾AlmhbUqvs3 y[)kZxt"@ŷ؊&]Xu m$QVƠ/} N />-pTkYv|xxTb@f=MjlyZv;HO6PIyV It=M:;h'l'nC(V mc$n Pձl$wv w_qak5zn'!B SlWuz2sG?MR)&crHz"IENDB`u262a.png000066400000000000000000000015611326020644600317350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d(IDATHMlTes 3q%Ɵi 1. 7HBH 3uӕ $H Ziʏq%.\ Š%1P!&.tf;s̝b};}wr't@ib:c2F/4 d/("V_"NIuϼC]l Դ}(N16zV" ]L ڱJ.=lBXwL')yj- c]#wj e}]L梈XlX% P8V]M uG.p4D^}Zش Ryret":*Ak 3d)t *{+@v/'zC]iOT*Pitvm| "џJf "iI!P^[*-Cx)wIEO*4s35P?άm` U!ʃOڑ7`5J= ]K@Ll0*FU仐o\v@yμ$8W4ԾCz;6'snf@2;s2ES9% |S&{TQ>S߼pG "8ɁB8Z8;Nx` ؖT9Y3mJ8Kp| %+^l%L{}aTf i,#~B ws/ <w g0ipKZ<~o!IENDB`u262e.png000066400000000000000000000016711326020644600317430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dpIDATHoTU?iίĥ Ctaal?@6,*Ŵ 6:qib0ѠmLt2 ưh3ymb=KU|;s4MV=r"i Q]U|^DtHedoȹ@GuHT=r@͞f@HV['(/<44iqzF}i8?Q2Р *5;Ja-=`+0jzK8H;>IZD^PtČLf\kѧu=c^h&~2ʱ%#C2*SaӐ*<-NgD#7de[;w"Ԉ]ƙF/+5Ph,>r]>^<A^!=]/+^R arCtvvbwwm_hvvPtm{{{e 188=a9|~~28DQPJKg KBَM4?Gz]'''x<Bh]]ݷlSSKo |]l*G}}=(HR"(88 #L:E!lic$; RZy^>[vXorY5onmm/^xx둓"zmn>/^,Zfy^z}DjiiyJi{PpUB(q$I?,pccsӭac#:I9|g5 K<Vcn0`6IENDB`u2638.png000066400000000000000000000020361326020644600316630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]h\Us6Hj[*R&mj(~4MOUDP)6mPM(KX$/"-T5PbS&>EDH67{ƇMo6)]<ݹg9%;9ʾט;Vj޹2[PDyJn򱯀5\kU Dۅj@P T?>vx&_O}k/)J"ģ4M3GU73|%kF/$RS1wR#󉟻z/IENDB`u2639.png000066400000000000000000000014071326020644600316650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOlLQ73-L2TlH /Bشea!6. B$""%(*APh3 Լ7j}}{?CBRŐX?hmI5-nYˠ|w\5/zlA(ۄxny۵̆|KD0&Uېؗ#W+rd>.gq{Ϡ>1ϠIȒпD5 rc6&V)Z: (O5$6L8z͖ptmGѷW %9 k2 jzSds'zSG!gݠOf esTOwt.pjnU+{jXNKeSXM'? 0/ldg]Z:@I̲oS\Ubَ< /R2ifhz\6.zwuĘTdF_T[Cۻ! ƽ!,Ns|w Czɖ3N;= sKYzYnA=ͪ/PFl}b{#v_Mb= S#d ,[U1FJy]B\7≆]vʊ7L8 $#6IENDB`u263a.png000066400000000000000000000014031326020644600317310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݕkQsgM5h[|&* >.((BХ  .ƅ HP ji[mLfr\%3`u3=r=,jɑShhGtzsKul++&];zRV]rl8/Lg esՊ!_0U^9~#vvB=ւ)QmrwaMևm b }@87'9>~5uE{BD[;l;^K> Tx O* `45o6JX  :l]UO&.ǼB"E]lkyI̯aumkӄp Y9ՙFqS;MSQ.HI7'ЅF`Nq3Ht푹⦢Y60lNiEyŽl1ñ= ^Ġ0T]*::eiʺeYvXՐ-!+T_E1R== hVE[rͳL|ph2ԳQTw5eXV[?ѺV9ȻF5z T |AEx  'i-DxIENDB`u2640.png000066400000000000000000000012541326020644600316550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dcIDATHŕMHTQgcbAZ&pն\ѦpSH- m(((eQD@ERg "E1,{Z4ͼ1r{}|S4[F׉C^[|Od 1w, ݩY9LP$Wʹ+gGdp|PEۈQ/gOVgn}Yh"klI::NWq3[s@:g|ު;^o9q'i4 dB2ѝER-,-N}06 ɐL+ Zt$=ܭțXGp;]$Ԝ|{vgK Gw8¥W6_bED¡ zƤ&oV$/7n/*Y~6q(:Gdir{R9wl(r1,v WڳqT~O{= *ŕ ZDZEg{8Ӊw?7l-sS#{D|V'sgs-D 漃`L0Z)77iIENDB`u2642.png000066400000000000000000000013061326020644600316550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d}IDATHKTQ?gf < hHDEVѢR#0$A@A`@}|3:?{s{8Vbq+tӨ4y.YVE.9–MPm< Td @_5O&V'a@OP،7pc/}02(p V@ .nٌ7 ܌&, u4Zc75Ӷ$h_5\~O !8rd%s؈`Fy#Յ3V p4"~'4覊\Fȇd5\ߥ+bDs\w&^'DhyF1i"V$ٱ: wF F*R~AY@@㡁G}ۧ{aFTqFjԯK\NT"IeL6S-%J{ndE2M{'3ްH*輳Vw[-,A] "ky5z.}_ 7"@k9 z>PWx]Jfc@ǀ`s(i:rEވ|L'1o}IENDB`u2648.png000066400000000000000000000014171326020644600316660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkTQs4lBy(( ;{ ja"QRWÊ"J"4{ݽ&dT1}3sf7ڷz35FLy4hD۬'傼W4E75n }wL*g =38?r26ی' )U\c/jN LU3ɶ|x+@-&/z1.-`| ;K@%G>}8R!o@l}Ԕ{;,b6.ƒ uɵ`RuDovr=968 |-%gNENEsF2ֱ UgmxdB."YUUl%nb1J "[9> aL$[F_CGsiTa(ݪAn6<)V{A!dFԎMSPn5FTMI,|o>~{}<` A,-ucB5G WfSg5WT,Y, J+H5 W}VՓ3:agcřbHyW*<3P!%S ʩX^̠tW&D,?4>aĮ1pӓ^hvWe{֦ 4A׃`z2;W۰"`%濢TG<_, >ّj Ea?^.ȮǔX(Ϸ*<C;|ڲ=|ݲ==j %ّyJP4s.hzGv;d~[ lzx6n*ς6S=uuFAYCuⶥ0}5Ő 4`i-35F7\ ^Va|EI4"/PgvijtPWGIP͆2&x.6m2pAF*6#{(@=q-9jrvfuD O5.:Ke=?}cTjU~VM5 p& @J'm[h4IENDB`u264a.png000066400000000000000000000007361326020644600317420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH핱NTA3B0d65O &kA4XXXQɃ72QMD,"6"ww†*~3ssf8/l?z JZFj 5~ͱDtk뉍^]>uuciBd̰"x8T܄Rȇtڣ>Gxf@m^m̺$lt&Of{Ų\(}sRYKZվ'苽,wxQ+Ntg2`dp=o׮nM(O%^O['~ͅ 05d(~]rWAs)+k>"oavl~1"If0߰'Vt05<6ue~V'I#(L[h\IENDB`u264b.png000066400000000000000000000016331326020644600317400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dRIDATHMhUo&I i+-)$C QBD҅.""]E71 nb(cԙ Rl~f~E&twu9yυ{*`Lsº=A%6#u@ZiRn[&:[Z|EP4'}% *cng78Dk>7avõxhMKf˅5#LW8NBvlE⧅qZON$njW|o8V$ndu=.CGA/4Ӈr.9Mt=eb2)_K}[3]!$@wn:{\0}*~~Q! 0/fvY\|;^tgMVS18_dx<HL:SwjcM5']b@{Kxc<6{S֟1Ӫ؛剮maT@m^_I3_v-6϶R# zJqc6xn@%Lvu87e/@cDuդxem50Е4@RX뒶3n"S0-1cc];XS(^{Kx-t~P{RHH3wWʾ@X᯹-eI > #;im+wߪlf%tJ(.d w u;x^AN˕DåQx#MݛLj̶HvK~f*a"IENDB`u264d.png000066400000000000000000000013161326020644600317400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKTQ?7?B,2qJHܖHRCWЦ\ "VA:hQR!e0̙&wO g:8Tݼs9;B4\wR r<@G5ƴԸtgn'H T[)Ys5}{UrïA<3P3[ݢ\0Cϵ4D&Ca+7m#{n TG>L@aHg-V^5/j/ǻt׌O]!%k"e7uc3As+W;b)M4Ph~p?i?&4j L=ƩZl A4c:s$I\g] c֜=`Ź)֑:RżCFջ{R)8v*î^_DyMD&kߤD#үLA qqz#,~[f$:^ $^ъ/b \/oʤ-?hFL;E4t![";ՀvqaIENDB`u264f.png000066400000000000000000000010331326020644600317360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=kTA3ss#F0En@HE2l-l(E-K A`,DŒ K Z^ )B#\ݙc]dty3#9*s.0Pz~}"Åҁťa{sA ==@&|>`@T>C.UZ_Ŗ'wNUyZ 䎌Fqy>#idP "JwW/h`|=8b:6m8È| '*.HAzJS%nHg]䪳ICJz8`+%fw  (/d^NiiօS"a3~wy'A)mcrˀf糷} l{0}p[sr3_x6kIENDB`u2650.png000066400000000000000000000007551326020644600316630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHݓ?K`Ɵۨ-:5)8]$EEApDm~q'(V%.flAShפIo{ﹻ'  ^aӼ|kQ+@_pJ(?SkO~'Z|~L~V`P^p G!pOf4 Kz^ǴCo"e[Sm&Kz A4αeD+am|>2lbޠ]0y@@  %dV!D<i)tD^.eeԑf~\z 1lэB0ae"jZT:2N&I/)s4xfe< /dzV~<͑lxLVvұ;T [7ZuwݳjhmW>Xw{G[_dۏT@%tf? P͟ry4,&UKn-r U8 dIF-WaIt(>e:ɗeђC=s@_teE?Y_3qOhn,>Kk"Nd3JC`3 US֞uұ7@qycEH}ȇ7h*۠ j 4նݖl̪͒RnTٺvUd|{0)gǓR\وg%oS%}z_nHJ٦؀L7vM0a68kɅDdeGQS&7tz(F0}TX[{ ҁuLk\!h~i]@} "\c4^6S\@ܩepo>H p f @P8Vu6̴ܥ IENDB`u2660.png000066400000000000000000000011551326020644600316570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d$IDATHAkAo6%QYzdJĻ9B: R0m?|8-RJ)c`a^kZ. 4s\&y2xֺy,u<ϊ^4%Ӣ\Li0`3m] [vRozW1Z/&<] ⫢v\82ρKD ^A4jm۲FR|ђ/[[[8~^GtcLuVRmðvhg"wMqrB3pv$ )6l gu(76;eCIENDB`u2663.png000066400000000000000000000011711326020644600316600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d0IDATHka?ϛ 5BA9R:E?Pt\EK.:Nvp+6=JS.ZD&=MK5t>sx) VDD-,ˍ$}<c0ؚQ YP(.a Rl6yՍaFM `$JѮ))ru݉S Tu2|bT/sI:ԋ[RBsbzz:e1Ɯn%rKښ/bݝ{@-mC`&Y{wsV^VL&3l;,">?]/1#FD&0QMI6"rި~ /l~>(y?TYO+O`Y,. l7:ƝyNs\iZܶ- ۪ݫl~ <q,"rcyy8 :"-U9n0|nFQ[]]u˪jiW*:IZIENDB`u2665.png000066400000000000000000000010701326020644600316600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=hSQ6-EA&tP:+tQMQĭD &8?}IjZPļGi=\:GE9}h:;&gG<0dGC:yɨEGJ%Yl{"zw{rez" \q>+^kN㎅ h~:k TN.ۺ\hJvop\ܲ- -l b[~ +k"\1bOrG˃~0M{?lN3=6_%p:K \40f$wNL,./0Y7x&n=uBV0xU@x!R K3/gv[OA zu\drץӮ+3}(k PT>O7:Хĝ%IENDB`u2666.png000066400000000000000000000011431326020644600316620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkAD(T4)b)HB=%MO^Z E"~PjoQ&Ͷb"f^ &l63fg \!sӣڇMj?}oiˀ\3ivy|䨯W w~)JzO'Hx;(,3ha{YS$©gml!-axUeS/FLJZspC LJ>Ƞ xE2#ۀ1:p=,%ۈFWCiYz; gt`1xK% HptuP MS!7s#̭VM״5b3+M -ZS_Xo dvz$މcvN~)@$JVcN^+DWdoGWnX9~vN+oz8 IENDB`u2668.png000066400000000000000000000017701326020644600316720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlUs<&Fc*RgBi5B$ذ-[@bDW Z5;.R((dT Jz؞s΅ۅ4q3skء2bgg_Vуt(@jJbK*ҙI'_7G̜>RxmPb xLPglhrCC@DO zk p Km?5,cjxF:Q`y~g0bv8,G7l@WLzP aԳCQn?7nTS 7jLٿ`|M5, sh<*+,5@Bhv3 ]eW|[E] gBH=֋/vLB XY=8ݿʚyh9Wf* H wwZY:qA9UFk=E&EXɭ *XhV::Vt@%2rθo?› gs]n_QaK[*o;VB}y>=45"Aڒ߯" kiA۔/j1+`|OF<nx>w4yp/ekPȃF`1PMY,s- *< u1:7} Z,Khd$cK κ e)=cteOJ:\[k.>?:\|.1P;XN*֍#3s\ZQXEޛH'8< =b+1cm}S8#jFZ7@+=*~GP"˨؉'s0-Kh(LcPGtrk W7] }rP. ٣h@sPeQ`%U2k%'7Qii}f-$l]u9IENDB`u267b.png000066400000000000000000000017551326020644600317500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHŕmHu?N=Ԗ%(IO˘;zcɐI ڽʚCn A-]u,--V i-U^W_Eߗw= Y-Fl>4f{{l||ft.'S=?{j% /CCCe 3@!PXZ@vwOV ̭kC?#lKK3lt?ή$Դ}(!y@sX"|%|\|„46\K(T׫k'~ϛvh f#Ԩ0.hO1j)B)MmBo.`3RzΙ 'fT㺸UmM +(BH/1FFA{ ߇i-թH "~~C;PA}}}~ l JRuق-]j?:5` 2i0R3n bz|o!hsR Ms2{W=[Cl~Oz|{΅q/kSxJIENDB`u267f.png000066400000000000000000000014631326020644600317500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[HSqg;ni3](Rs ,2fL"^z $^Y>QD4QUi!ۜ:nӃ8X] ׁ+P/{c%Ur I  PբRGX@kZ$浬N&(NgbC^i$_ھ=?ԇ5+@mF@(Y,˼ ̶QdJOknl(.Vc13s|#'se|vcH8+#EG0YApklCH̛A{V1? PLp‚ئOIԆ4֔XS^η92t[CUK8n?jI:.**6dڸRU/ e%hE6/Ĝ9f"0 0tCl:dbkDt5ДJyn&w? ]؄d&j3r,nP](b\5'X%l+M w09%%H>|l.qpr q4gG_h*vMY}7촘h^19>蛟b.c +^OuF]x(2!=C$bh[>;B^L~Om{f$-q#D $"W"\c>|Gr) _PIENDB`u2692.png000066400000000000000000000021511326020644600316610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHTkLe=wf(!؈<$nWk e$hRljP0Pbb&D4TSL } e`vY _w|W~j3u]B<Ƥ䄸_j}+}zTa=IރvP^>4 l)oHl l~1XEDҬ'mLq5mk_-'7%ڍly'56W=`3hDIW]H\,~vS6՟.̖,)(q[69/=qmFaۣ o K@z":\ywi$r6Ld'c-F(D$_jlL:Kƭ ` -g "yPڿ%pgD0$S V Pv&ĜMwC*X\oR6WzH#fVAw@|̡gd F87jv`,kPBU}VyhQН`{ y>&SZ{- #$j,X? Wg򾱴؄: ~0|@FNCmzj eqwNZv0.3"T! (^LwoV Q>,.c{0EKUUJ*pcf09_a$XrDZiB3w-euBYኗu9$*IENDB`u2693.png000066400000000000000000000015331326020644600316650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOUz q3ì b.$f{#$lwn"VO|Wgcy,/.[t97/`ۃW?RJ5\s]K遯6Sܘo9)>O8EeYF/<_~2o,/meF'ɴB,.x 9Fwd"0.T贘u9{ RwfO"`y \diGNsZ_J60gYx[Ν$8Yqd z=u;IMuZW`goYwlަݱvRIZDۧG Qޕ HBP*ƥXȯījJ6IENDB`u2695.png000066400000000000000000000013271326020644600316700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMhUsI,B!K ڐPeAYIL5L.tB` IZVۍ5Ra7K`-mS[چff |lys{B 5DI ?[Ǟ˥RR%-LUm+)JZ;d?{,CA&z۵71Da%؁t }sH!=77mDd6ew*ҵtj6hp0u5Rkfy.FGza!064]r:}C%nV 1iҰO6l1dY׷t|L-&EGNZ9Zzc[ 5[}-ʄ֘]@ՔR;o@mܞ͘ީКBrw]ܖ/Zd?sޡcwA6J花& Ff&Wbnron}ЧU9J3p?;0@mЩ I!MC@K |,iO]Kw̬~*gw兛C6Mg7[-Dm>(+?&=[*Q(W,3N*PI Go.sߠxo?(/"]jIENDB`u2696.png000066400000000000000000000020041326020644600316620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTeW:SjJN3Pm3Wѝޘ!$h\@11ID1! 5\h-M23)-K<|W|qocnQގAZZZlrlv(14hZg9=_TYY |&'+++Y_UUs#Hyuux]]]aQQыPe#R[eêZ{Z;~RUcm\8{W]B_\-) # ZkW=pLR2kmm:.y~ j;9]Ad~@@:K\.HbXJD{7 y^VUS5_0S"2**zU(*bˢcr-5?_c K͈]W?5!(/`ݝMMMU@`2LнvE6Ʊyo(ϘDL -~`^ ؂{JZwF~Z`pX0p7M%^ǁԭ|pݺpg<*>D.^7/6b#"I> 4R^_[TR=IENDB`u2697.png000066400000000000000000000017301326020644600316700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՔ_hUƿsgvvggw&mIZSji|X ZZ"6y)(TA-"J >(RIEC⟄.EhRDiJcYI6̝{|h}9wpVph|'*~jM/q A@&UOP/jCV_g>f*sͦ.0i{~A'GNF!\$pt"G \].(7~^Fw3V5L4 frGRgp ̘Xr29DkE˗yڴDɌcUS@2a[na V$RxI$v8V5ADZQkEQ O1V6ZSF!bQB 0:tM  @nߘ05C9ߑ:3|M5HM@wLhkbegtCZTھ8}ʲ-񱣑y Sc(Z! ]WDsDXhnZTҲFeV…(nL) h,"zq!t<<G D9Ah%E "X '>:9]{ydDPc>=x;=9t&{ՃڔֲfO{0s/BU۷Rc xh t75;k\Zf_>ܒ/}_!Rly_uшTYarm mug:Y^z4`YWnR>1]x@zyM` Ԭ¤JGK| =G%/Yp5 |ZaJώ̙fu29wjsfAIENDB`u2699.png000066400000000000000000000021571326020644600316760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d&IDATH{hVu?W-u[4٤lmHfYJ]QI$HBqb04J Ό4̜ӹywycl>y~Gy~jcReBSMzUVv]1yWnH >mANKǁE6WWPYu;SƢw U}$/ ,َ,S@>Qj׭g -@tqR#j}wFjç7;VB)0-itd\awJCE /z&97]5l@ s)ɦUM8#n`$CK\9x%X/C<~_%_C~>7pwM2 b0+nd'Y%=@QHY3JE9={(4KrcL.(S%hm5, *JXd'ztzϙ@pEMOS[.JB*2eӍD p]>9fWl] r &F=L`ݛwUc+y~9IBlo~4QUh~Rw_UVnβsHָښ:-TJ WΌAG+][55<TU)X4ImNc׿z9ʒn#]zڝ9q ԧ;?>(ЮRj<"ݐHV F+6UUnhÎѸs00?9ε"^"Q4(Ԡ2шe@dydZg 捍5NCБL>f.(\)HmxOgt7B$V0|su+C繥^(]PXG y Vy|mض4wNѷI~Pn%ςlJ-6teM^NtxFs&M>ieᘬ6g*c)o&0{06ӌ!,LآB0(bsMFHh]ꇉ7CؕHƺ'"Dw"IENDB`u269b.png000066400000000000000000000023301326020644600317400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHohVe=Jֆl%!pETDLI{ K苟*\YFib-0c8533w{>lν}EϷuuq>zt8kS!U`ˁqft.fp5f 8!NXPX@_x!=\(3 % - pRl1ذQ?$]^7l}(iP?kn&`J>(nI]HU(e/ b<QW =L6N*g%G 2jJs2jd|gX r͝ T;5L'ESTw!7/NCev*l_ò `&p^3g; hbcg,uİG43`~dH{ -OsnPgbE 5Vdcl_% @ ۊhzD+frKn wXc\VA%Z/6^;|жL%L<4aAycmsg*nGv=m6p nkv$*,(toS/=ЎYeJkxr _67v(}2{Kh`%:m~NKt`!h7< Pq^Qoe:Ao&yQO~1$n`^81Ʌ0Gt`rT5Z 2W` HA+蜜^33Vf~ޔt[!=5쨙r̤h69^t{_}JmX|]T\%Tw6-nšQP"; l9K0J+ @+g:檻0Xmw^ ?'8pc qW{2 %{GJZwv\^.L+M ܊M DIENDB`u269c.png000066400000000000000000000017521326020644600317500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKlTUߙ;ئ ctMXDw1!]t -v\TAq!&$.|..4h"}̔Z4Ov 3s16LNsAh qQOd2Wxaۦ#엗Kk H݉DMʹoDP(Dj;!F5܈nhZ[-Hz@U~tkQ<_O睥Kq =0> {0۴t&~U-k^z8l |I.w{);߱]sA6H"؟G~TxPr$:R3k_he >oc"C_/C흯cY @qž¨? ی-W9?4ZhPCK9wcIf`ON: ʛ'>-O\Pk@@_5yS{E3M-rRgw>zA;NO^ݝ`8ɋ4x,q|496vJ Ц)eE3<8-fP;X=}ۆدX27eFbSd㺫ble!p xDM F<O2ɲ욝g7].$-SK> C(ޞO<(p7׆(ԗf\+7W+pZ7s#q!1KڀRzǧW238K}7΅h ӀLwl+ȍ&%]A?#y6p: 0E:)t  RSMF6K"4D۽*ܧSaB{声Y$RfJs ǻR x-i^צo t(EIENDB`u26a1.png000066400000000000000000000012721326020644600317330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dqIDATHMHTQѤ/2,yA ?ڵ E(-UQQˈq(ocU3!ﴱamy+1 _Ce1  /Jh;j |̺G$4vnny5N.?Yw2Z<=f24YYnC!"Y߰~7Kl6MAϠv,uDLBjSSy x2Jcj49ms沠WҌgԯ{`)Ez8Mڅ`']{ "'\Y`HDzC #eay  g x',v:fV`: !,&Eڅ;iVH]pArSw hz@7o/Io Z?p!:2s}~)=eiw<7_UҐ <h_Fߝ3liH*@gx%Ԝ\1_Ӈ Ct@Ff13.υsh~_D{ଡ Cھ+:9DjK0*Sƥ&l1,]IENDB`u26aa.png000066400000000000000000000006341326020644600320140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dSIDATHMNB1%@TK $7J\a277 &n&H21В8sۦ^-*S2u$!Rڝ8I.+)3?/,&1 Up!3w4`4ibTJ T* VZ*}"yrIe_BpU)[ ;@Df@}s+s DqE0 70^,(rf F1- )qεD`m5͏u>k!D|>v3r+_IENDB`u26ab.png000066400000000000000000000006531326020644600320160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dbIDATH=JQϹC z&! n u Z][  E1LDdPt?GFIENDB`u26b0.png000066400000000000000000000016461326020644600317400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d]IDATHk[esNNϯ$MMԈCZLZ^(@ͺKE䈂 a`np)P e6f֭IzduswyuGl}pDQȢrD 8|([ZWU)%"WFJ3΅ + QtLd'RrZ+%B? _Aڤs~@uBq/],vIޡ N}Tӽ?yPy7:\:i,ԮRǍ $ݓX].S80>siDS%ٝJX2=IDIS1+%fqݰvqn3}qkKT+!ض4dsx䭝pczfҎ3hjB!i$Ln"!hX9 'kwb@f!a*U!vBatVBS@i"5#/ )OO~ͼ7Qπg|m_&A'?<8SOd*IENDB`u26b1.png000066400000000000000000000014351326020644600317350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHϋ\E?v쮬^\AģC?よ;=(! -񦨈BTt_130{XǪ離ka|ShDSUj݋o|?^һfKWK?])%,)94;sc㧥csm: 0#57{sxȪ@Lf9;KPab08Vh2&8|!Υ.eEJ\٨vOeyG0vv{7YY\6˪'Νv;؝LՄ`w2s6L39+d VWNo:gYEA, tf "YMUSWc&m;q'uGj*\X8Ou. _rhꊦ+dDfxqc/#/.\_RP}/ʲL_/.j.`'2|oDZjkڇG\*192 U_bA5Iu5*YՖ Uc[g?3 )U1dWXf<:9#_fsX :f˯}.pljǫe$ftD,i*0-r *)%/|.qIENDB`u26bd.png000066400000000000000000000025231326020644600320170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d IDATHVMLI{ƕYqp8=:Dv"1Ja.kY6$zrMă?$$7uف`bTbb #,8`7U5ı%u^}߫_:z333+(M5B^Y5f1666Iɲ GBv!Iu:(..c ϟ?gO<,!E4Ϧ rJ-әP(@"@cc#&''WE9O!=z9CUB^رcaLӄi4??+wUU=VSvAϟ?/9N[ꖗ&7oȾ}$JoQJoiFjjj@4Ϟ=Cgg'dYN+SSS ڵkW,˭Ϊ*ZPPݻw8s nܸ &:.eff$Ijz󳳳_(a8x vލohnnI!|%^h4 X\\DCC͕7~ # ]zlfggi\Ur8.|!%ʭ["##c͜Ԇmٲ{$}OEXF6 z%Ji1,k[,‚)i,JB+R# aӦM6'0$uCmm-VI͛7x<ઓ,ː$ NEEE)øw`~~===vܹRaawH$B TWWܹshhhǏq%~yyyujxx8}4x<#>^k}}}4++ N… R !C ```i&2`ʸD !@`@---8rȚu|p8}6X8\b&InήI ל@"@GG9o]`ُ?&#s\񠤤Ćoܸhkk㺮'!g@yMӪc؟X H$/ap\ʂ 21>>cU###(TU=*4M*+._,ɤ0 CܼySa{qIkjVFBp 8ѣ8tjI$s:::,]iV(τ82\.455R9LLLX9o:::j76OÄ:Ji @BfM0~,gg˿ʋOZDIENDB`u26be.png000066400000000000000000000020171326020644600320160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]lTE3mKEYk6ӤihIDRohx1>dQAyD"b" 4tk)VBsg|(mX=s$3gy&\G+AcLeYG***bLyUZ@_Tr#_WݑxSV:8%;ST제qqpyo=o[3PR%7n//ͻL&h\0]XJ)y-NKeeeLuZ>15=t-E~>5nh߰ܳpa,<~<,ʕR-n\(gZmvľxGnm{NOcfLjD)ZX;rTM r|{hFV"?AװW76E6Gp`YxO+9>M` D9Lav $`Cu:qs"]aBl/`b 060t|T"G| O^Μ„.&[Zc.~Ul%i]QՍKX`Ct靄N@[T3 Jktw{$^îE3||hWO\RK)ۤW~W5zꂕһ(:*,)M`5 }cQpy]UL+|zE`;TSn lމ 9TUO~-"hL09zj KۦLOt'#^W9"rcSmΑf[LM(?'Pk,<6;80<</ !^B#G cfە1st:Y^:& ߷P$ׅF!­gŞ-S{IENDB`u26c4.png000066400000000000000000000014211326020644600317340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOhQƿٴԄrj["h x=((B >К(ND.3<-@{|>VWW122ކ^D4EQ6&FPe\.4MEmߒ$M5}iz -+AL&󞙟0]frS-0H.{МapX:N߿KDc-=c"=666T*.@+L,4o(K -TU5 x(IDA+.iD@ӴO 'Ȳ\vρ 4u}P(_|>ADi}lWA-w+qܼ* UyWӹp x-1@˯:; d@>D8ǎ=/Hz۲ѯ ::Ї&6 OG:6z>7 w?LM\TAe7R`&wq}eIdPhi3CbIVՉ0uL\!b0M f筚Ӵ^9umg`/ 7K'Z7*Vo b_Z7(YT@nUW$uG .S*Y)K,QQ,UVѭF˵Z|Q6(V8f~yAԵj?1b?I 8-QT 鯣8jeuyĘM\-iRοU%T֮mO'rKQlHZuCG,Tmy8F!Ib3w¹ dU՜X֢ΖgxT ;60h]bwe@7陆qLgԞFx5#_KY04_<5XwOMs{I8i IENDB`u26c8.png000066400000000000000000000017031326020644600317430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dzIDATHoUƟs1mґȔUӈ(;HMSqn$L ⊄D7@Bbd&taD]]A @(T:-әNxEiKәA={{sy/ƘH0Q`4FVG%&..x #CM?WЏD= 糧cX&;cz㗭5&"UVij6| ݯyd}{ThDLg2ŏ$SM`)fҙ;=<Cq@uqkj@1P@c ahm03A t2 TiçlQUL^A?r͔Yq2ag(6z\ ed7׫ d1bd 4jqwA쪰V VvY9"[ _tbN&iGzSnW靬\!nUlxSo02Ԓ)j}wDːR]s}$Zoh-(,YIENDB`u26cf.png000066400000000000000000000013771326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]HQR>P)A̢-*#+!RLS62]T(F[MeR{<9YDtP3U9hDد(,Qa)MϷS!NqÄEr8 GLt6Z$_PzʦcJxll"S;vOIGRΨ^^j3*5cs|* J6}Ki `dɈTZ>i{VAԘ=>/y@uD@B$wQ@fUl!ad6 _J@0 eI6f TiVqpy q2anwdN]rh+@j_hjb| ormKj4]:}}BNYfٲ(@ Mt|#iBPԟ8j/Sm`i-Ablx\o/+^VZYf]@;J>gk``~h=htRMjL)?.w3.UgsF SH;^8+1)Ic8* 7W/"B+aQRGPQ!7,4GIENDB`u26d1.png000066400000000000000000000021701326020644600317340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d/IDATH[lTU9tP b)J&&` BE! #|0 ( 6$X.1% !K 1D*5HŊM%)JC3s?{0P;)DWrkY{ɝZ+j:>܉lk1T#Z+jk7 D"֤/l6sLgᨑ38>2F 4\+ 2OVּ9Q7> 䓊BUwUo$I, ֋".[ԸjG&9NI %Xt DY>hAD)&pbU?a|EZA2%[K5GLʦLj}Ivr! Zjj;܂Td} gtvk p{Gp(>iXaV_g,{c7F& nwnw\_DcL^E-6.KBcJ.B.7H Gul|@@@,qwM'Y~3: x!|ϋhEkrl D@'H{' s7L>%`z^(lR eѮv5n:6Tvl9ď>n[omӧκ^gYf-[D(=Ce"jܬڟrЀk6oW,j3}`0@M.84ᶩqaR꼲Ukv:bhaSSm=  @)'kvjۻ.zn-Nּ<h i"qn^hݿڽ{n⒉a0imVsvGϬPZ^X%4?Mh70<f1"Ru3Ok@.XJ֮ĺ1z 0a2Dh ` y1*\QYj澩WFU-OJeIENDB`u26d3.png000066400000000000000000000021631326020644600317400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d*IDATH[le --DPyAQImZ@@KE]JJDL P.Hm`"/  1E.;>llnxfo3|#Dӑ r VY~7ߓv+w,惉I.L\u,lYRވʀ :qepY5`{#{9 uvV&qzjn]zL/=5TYeo)T'gZH1f3Jp.ߊ)DX] qRqM`duI+o3~pYTߖ%LPwTjҶ+'gJI@˒Ho8k𳙟cu5FDm{ӆ2HV޲7L"@zbFQ@SgwC 4Y'lq|z)x!5`kgOv128i#=_L36y}%[:Oez^ =wғ3?& TmX '~ߓ5D",hp0VaDL_mo޸y׽s Hj'qIENDB`u26d4.png000066400000000000000000000011621326020644600317370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d)IDATHOQoi~D b 8B 1`Lar" 1|-PI@!}iqҴ@= hnW}] #"m g~*|Uxyt8TcHhC #߯ 7-4XA_VxiՔN~ vtv8F3N##P_;|jz]佋?u^Qss!g cC>Z}c!nKJҪIysGX ʲaGg jVaZm|z\!*ˮ*Swd—C.?"]]~omqVAo fa2Ȟw1! X])8޲bY녅МQ{t)O. 0fV嗹z˝a58v?pt @xt;&@=p{zWݖ^/8R 0 CDPˎRG/W7MKgp5^(&'=MvFY11#>E8c=HO?|3]/Q?& )¡l~̐ z߇/!S;Ԧh=[sh/--%ë'2cy| Fr1`uuu\h@*fʾ=ȻѦhcc 8PTΛ1w?9 `mm-}k.8~$uIENDB`u26ea.png000066400000000000000000000015011326020644600320120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMh\UL3L3%%5Xn Qzc Z.]DETta.ҸsNQ,vk+ ]TM4LHEL]{{ Ǽk#Q6ό;ˣzPEЄ|73ycQjG# pDL@-!z _ =xf&)}Ԍ'RDץz@Dz`vi?wu$nx:4R@o<ږ lA1{ 1s8jՕ*"`&v`d|`'08G= |n3Sl[8⿟>s]BUA+7-R?:z2O~Ȯn!\ܒC^8tĬ`|7wZUbĴuvs5bknXt&G+}.`ltDPF%j|%_̕IXalg[\yaTVEU|_S:y|dCze]{v~JmbTSLr.BahX^yvq"Rxֻ眈2h>&ѵ.,ՈP׿ooOiJ, L~5cb2,Svgx~ K⩕]_~C 5?;_sl ,-;#kz>?/s4-:x .^o26vZ*Օ ZE\\ 7dzE#kK;ۧܵlJIENDB`u26f0.png000066400000000000000000000014051326020644600317350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]HSa{T7kN(,%(*袂@2",,SCD[A ]T^D"YZmNtsbDW?s"4hwJO *Ȫ(!I+{1 4yo&Η#:{C V筦f9z6~,&3%dt&/ >Q-"\V`Wy7i*]z;}r aWpQR֦^C ƦmP> 3au9\-Fz!$o3y7dLr5]zjPkOHT@^G#^iگuRr^}+ RP&&uWE="梉MOUoUaAWxҰ p-:@H~IWӵ} 05\/"f#4F _h6B2H U(_ 15Q\܄Њ}C<Zڿ1MH`)cx1\і܂u/s FS%/1Eh {? ?;sȼ¨on ǴO#NK`A#' Euw<[l9)a @-+l ) *ЭIENDB`u26f1.png000066400000000000000000000020661326020644600317420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHTmL[e~{ AR+M 3lff@nnjB!DMҢ,2ę- ձ3ِZXWJ'#xys_ږ ;ZSv(`0@PPYtK:`Ny_+0Ȝzω CcSfD6<# Nۊ%A3olk=#r@6M@$E"sEA١+*Y%Ano) {gUm.LYN+ x _1vǃ#/=AwCҐC$N=@zb+e0nS }t{OypҰwv%[T8RSd]` Τ;Z`U5Ƌԟv{OrUM/J]Z >*c I_*'ǮE^=VE![խilFђ0y\6gGKA:ת}&ūw>ˠ7 [r ?p'7Q&՟{럶h cډ=9%kJքHZ JQHԶWK 3ck*G:>-WH9}sv~qА@q!);f6u]Ԭ"%iOv̒%)[0N}(]J*zXC/'\mK|=5R"F7ƙ9 sw: (V t'r$iֵ( KeT%H=9H{ID*.  X &DTPW>5|10x:]0f)c˯@xh8]]}iyfmaRnGstIhDwꘫv݊H/P]S{KᛑI&-Xb'G;B),*/ӟMdJD~ߔ9*ǦO?X"FdATk9Ozol[]ߗ ;>fX4l魯OK4VlQuT[@PTOCtXA|YL`igZXyo[/38Xl^.Pkkl 1nahx<1Do8=2\3zE>DH p֋En()]psEUDtRj|0u0Kꕅ Eսy%霉nfl}^w|#*1/o>] )P (rNs_ix2kD?7%j hhЩЉ0'*+XSjJ='-*C ,0'5\skd5lQO̗Zԧ uLoT3WW:7k(@ }mittӎ1GH,f\0~8)v5{AkX[> O\66?8HCr`$*>ڱ岋6.$۴r@hOu1:m*MM4(-Rj;^9n_aQBCaꕍSZ7l|%f4g:՝X, Z?T!H}7 d0LzᦢGvotĽ7FuRm*e`dۙidWI½k:4t5%S8lSo\*dDwَ٧F A4&`="cFPw*e4IENDB`u26f4.png000066400000000000000000000014531326020644600317440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՔMh\Uf|ebfG+J@R4ąmA7 ѕ]7]Iq.bDB+j4 ֨iN43yw %ji=\M>՛5FԸWloo4'[ }yts@Xu<蠨x·IJ3U/Q}}[\v#c/ ]x4yP FE ؠ`qW |o8:9EwcC'ٶfOh~(3m4^:7-$}jϿ<*, k--\٢؇ ;]-wrXt _+ܤip[U*A}x8_bC}~33‘/ػ#ϙL+sh' "ZRGE{BhGڭCk:wn'ȤD!JmK:TDx$BG2AݢwUcuY_I(@UTD]ḑxW:R a|v*:K2mI/VT'ٰ5SlߙBqc$W}zA_s\/?o]zupVV#؄{}O݆Su8kv^]F1@[@=C;C Uٸ:X_eZAumIleWG}?y6jKlo3nVIENDB`u26f5.png000066400000000000000000000015731326020644600317500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d2IDATHkU?lW& MLc ABl*ZAwAA!ŢTb̃ JJbXC5ۤn6ٟ1MI9|?;`gDŲi{+9&wMFF͟@'=/wu9w79&&T#3AylGG2Ƿ>Mj8sl=c"z1fMs7n2ܞ~ qsM@Иnbjx:%(鵡[-ձQ>ydzP%tڿ! @ Zhњ]y@ SÙg7UKCJCm M@MT5##O[Z+m $t~_;UQPYTog&2@ɠFnsM*rχ~[.m}Uݸ@a un)=ԪTϾ`=b4,s.X,` xt `½l`KἼ|+KxZs|mTCF3Zo A_sdW<~]vz˫H2o@-@s(WFT1 \_U>*K"W~ .+^1K7`[&+thԊK,^iY$,fWKWJtP$9_gPepΜ"{3ID;w@O{xSok+6  w䬇G+*tN??y'f^}\hIENDB`u26f7.png000066400000000000000000000024251326020644600317470ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHilTe>tZ;](e jU@e3ĦI#MhD0@&A!jaDQ+Ԗtv:L;3,w=s{wʉa|m6vϧ X  `o]⎒~jR%ۗrSƢdJOBt eK<;cJ@M`h{uIMKwh &w ԫԆP Qt_ף~op^Th͵Ji_!6RDrz*ZRlԥrH!Q0g<$"'0&@@ʂ "nd490%:Â1ȒS0Ȩtm}pB~G%th fue˖Eeβ'~Ñ[&,abdx3[N9:(U En96g{[D T0H覕J#?W[Yu _{ȎNsٻGD5/-\uYw>+Ѩ&~hX(#{[?Y2B^tR>' cO[&6XYChfmZCd;eRx:fPOPpU]SIj*`1(I^]\:YtFFtir ]ӝ>[ߒ=8f2ن3g?$(():B',ZsRnSgÕGRSUs_Ƣ`Cj[o_HB!ٸn{.6q`HF8轊1 0D7E 1)IO֌m!YT'D2;.V}==x -˗~M` \rl)T{Ptڞ7zks xeA9v+UDs z斳rV٘7Iipپa"zL;/.(';Jm {=eyd٭+>8!5tBr q =$B|>_"CmkQD8 @"KҺ˝{HKyOᡡg34IENDB`u26f9.png000066400000000000000000000017361326020644600317550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH}Le?/ \ V@f+V[/kGYˊ5[/+Ss7J1%dY#f^.ـ;0:=.NTt],Gv'T֚Ԧ~Ɋ~TK>CŜxD:هw-t*@LN<dvu-֠/==-Ttyw9lvvLWIS0šRGsd e \G mڦD;z+Zqt n8>ӜWzcu2 L c\-}t0.F$hh:b*K/ 4 %>U#]g؈iVEH Xrʓuc֟TY$T9`EM ѕj Pb^){,*9׈?,j:v);d 6HQf/}8w]Q7)*Ző@9K菱o p͘K}mP> 1@VHIouux^\Y]_ISh/j Y V|~Sœn1B)M?Zimy M9ZۯQ $tBj|IENDB`u26f9_1f3fb.png000066400000000000000000000017651326020644600327400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmlSe羴\c6tKPXD um6PL *AC\_>1ScHD !&H|f%,_4c[)Q@ 0,lc/n{=~ .͆|{y/\*ܑܵD*oO(zmD@ py9P򅧷SzX&03HӪ#Ru3ڮ GFC?(h{߿kj|bȆz]_sM_RX0HnY1IxU:6O@$`q7Ͷh+cQZi}VQg|W@T_@f/EphUfE gWY0h9B{xǢ;(?̯>Rl\U7srkQjĬ/">FGu3G;`zHv6""]o;P[g F`=q{&/e<㑃n{|.,a`=3xo־\ YSƄn%OXUH{? `&q-D8ȝn[r!0 Ɵ,p (&4º䚁& QbR+o*e}6򳽰7VsC8 L /] sep "Km!@6r}5{ōVˍ?f$HWQХʑ>'/B4`) EL)g Б$|Z_`uljs:4 n%oMӭWA` kMC]\g κ3`3Bo2 ˟uԘx %. | Sis7׫]ЩOx;U.Jb*cBvx<)*5jT))6`5`lN]A'v3O)'uOfvS/lّ1 _θatZۼ:}({tƐN 7]L཯`Bl|IENDB`u26f9_1f3fb_200d_2642.png000066400000000000000000000017651326020644600341420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmlSe羴\c6tKPXD um6PL *AC\_>1ScHD !&H|f%,_4c[)Q@ 0,lc/n{=~ .͆|{y/\*ܑܵD*oO(zmD@ py9P򅧷SzX&03HӪ#Ru3ڮ GFC?(h{߿kj|bȆz]_sM_RX0HnY1IxU:6O@$`q7Ͷh+cQZi}VQg|W@T_@f/EphUfE gWY0h9B{xǢ;(?̯>Rl\U7srkQjĬ/">FGu3G;`zHv6""]o;P[g F`=q{&/e<㑃n{|.,a`=3xo־\ YSƄn%OXUH{?ѨdT=N^@F,w[).<#Hi$5?HBu w%ykw tgkD.No3e"~:Si䋞`XX_B"]Uv`ngdMf wU,Rfgg$Zj֋y--X`hHMOŢ m;lumomzYɢf3vJTLXc/9{/8z9^ !x,`gtyLn]oY]W¡ae nn &eW9Uτ?64 ]i|IENDB`u26f9_1f3fc_200d_2640.png000066400000000000000000000017671326020644600341430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkLey_ZJB-+AĘxe h2Æ0Bo1BbH%J\ȒS.2`.Ce2`6F7(}tO99<)YS)m2! @'R3Lw"\ YC8ˠC/& ;O_`n%x;KuB/CO箭X՚ w]仧et:~nQ)ˍQ]?d5*PV(( JճCmxϞqH*bVp 淶]嘟6l7+@A%M=UƫFMR_˹_y{j4dwogD ڎ7G](QNb>S|ax&\/L~-/T̙yFkvmZy.i4 f579f0Ewl#.ʛ<_]zK37޳i )oxt=[lkSuoX>c[<3h]8 Q 9L޾݆G`9سhIar:, ;SDJ1S#O37 큥1cy8 8JAI-VbC>yBqh:wzƯ}^j:)VfHۣ rTg;,% 9ߌ_{ -2mtQJSi R579UuSޮ?Zap.lVr<.Lb*>}3=q{\ǔI|u@N24*K ~,4?&ޤTIENDB`u26f9_1f3fc_200d_2642.png000066400000000000000000000017441326020644600341400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH]ley+]?沭Dbe:3#A/43^,4q1܈i&.6 Ka+"~0fku[}eql8sy~Q!Oڣ FǶ׏ zs9&?[Wrjͫ [֓+ȅ:a67ٲYĦBivS/AoEUVTՙV (d  8p+IDH$wX5:ѨdT=N^@F,w[).<#Hi$5?HBu w%ykw tgkD.No3e"~:Si䋞`XX_B"]Uv`ngdMf wU,Rfgg$Zj֋y--X`hHMOŢ m;lumomzYɢf3vJTLXc/9{/8z9^ !x,`gtyLn]oY]W¡ae nn &eW9Uτ?64 ]i|IENDB`u26f9_1f3fd.png000066400000000000000000000017601326020644600327350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmLU}a@ 4elD̆!EfQL4$qC,ƨtatĩ1ܢ[_&/-ðyv?, rι9҉KKUMVS }E?]▹DrJ:q}ŴN/tDSvTY5wj*D H[AVK\mĎm]=l}kB&z+ 䡫躠&q42E>sOw7m ֆ6#M,ah\9߾g 6 __)|@$%=}`P<99iNdj^k ޭ%dY'M]WmIWĄG- =1 bInj >ȝ7׆ 6ەEx#CI̞-x͞#XIAh\T)6}NXзZH|sdjLT2_U%W0ټ.:L(vNѵz=$FiCdVFޚ5ΐd[[?L|dJAQ-[fhPS|8|C3`8O$AUMs/\ݬ "̆iSvb ((k^Ӟj |8aP-5h;tL8F> dLxI n=6>M7t`9T"[_z~$?qml"J&ֵBTۖ0k5rZ|kOFL;#xߨu+р o74|Ҳjھ;gɀ/ RK0/hOFZ/^)H80~Ʉw;N`Х; scYIENDB`u26f9_1f3fd_200d_2640.png000066400000000000000000000020241326020644600341270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHkLe}_J@I#Xu[rIa\ ꦰO1ftɢ.31JG2.`9~ eCs(Trwi^~5>Qxr] JdSJr"ECU}+ڇFB,vVB9Tr5 DzN432yBP[fmuݽpRHQo[ms_66ۏf~ n lװG6+ Q(%[P!=:4>Ky J .z} {~Jg;t P퇲M&HWvj >o x@q>~5طuKgƂq۸!X* *ưΆ{+c1H#UQJ/%XlfwU^LvgA ,Pfn̎,o`44[ d#eonњGc&G!!ȄNo̳I6}+]}̥K `RS4>6ٙNK%W64-z0A\]Ljɝۂ9Kr#|QKPQz4U@ ^fPޒq}ޯ+xJl=O>u'!ğNۖ=}ٚ} ` ߠ68U0/V{'` `CZ>L9p}C4m>8"ᑛ(JXIuþH2 1AӈH~2&%䔇3!vɈgkreCPɭF|Ss qLe|7' CyDJJx+O<_xL؀^vMZn:1~@"a~6&آAoش IENDB`u26f9_1f3fd_200d_2642.png000066400000000000000000000017601326020644600341370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmLU}a@ 4elD̆!EfQL4$qC,ƨtatĩ1ܢ[_&/-ðyv?, rι9҉KKUMVS }E?]▹DrJ:q}ŴN/tDSvTY5wj*D H[AVK\mĎm]=l}kB&z+ 䡫躠&q42E>sOw7m ֆ6#M,ah\9߾g 6 __)|@$%=}`P<99iNdj^k ޭ%dY'M]WmIWĄG- =1 bInj >ȝ7׆ 6ەEx#CI̞-x͞#XIAh\T)6}NXзZH|sdjLT2_U%W0ټ.:L(vNѵz=$FiCdVFޚ5ΐd[[?L|dJAQ-[fhPS|8|C3`8O$AUMs/\ݬ "̆iSvb ((k^Ӟj |8aP-5h;tL8F> dLxI n=6>M7t`9T"[_z~$?qml"J&ֵBTۖ0k5rZ|kOFL;#xߨu+р o74|Ҳjھ;gɀ/ RK0/hOFZ/^)H80~Ʉw;N`Х; scYIENDB`u26f9_1f3fe.png000066400000000000000000000017551326020644600327420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_LUǿ޶t*nC%f X'Y&[l.a{0$>,Fg2(Ec$1dbb\1 KB"k@"{9{9Q,⼗XE8v[E/ܽ({79)fJK4(߃-kIP@Y[PiH,q"d5l>dY+ fSY;s{ɵ'[]}G 1S`nma`ɫG"Qjr5c,}u,e8cfc*2"!dhD(vmOnGUoqqtF́o{Ad6OeA#8cZt0hR&W֮kYs|D  ͰwZ. )P7]>w;<4VEL?28j\>1& P)_S잒k+F@HwL& 1bt @{Ku~#=w^S}3!鷿Y]Ѓ%Y1@ ׉cav͎1=ELH4^_7wⅰ/+j 62Я:`-K`9w}p(^wiN >tG kЗ;IENDB`u26f9_1f3fe_200d_2640.png000066400000000000000000000020221326020644600341260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHmL[uƟso{[hL@N /C11e؇ b6~ږ|Đ8c13fd~Zc9L@2!CH;B-m{_,Bp{' "澝۞`%x&p<گ6+<ׂ_W6_7Ah-"}L `ҋX5@%}>ZYfQYODI@VvoPd/*a5 pfWQs [kvӭIcDgڠu[>Y @I%[MzB2_E;>YQ6C713AqqAd+z:^bKtm] .#]ǪO5Y{cP"`ސ\ztaò*bzuj^+Bndr~Ez|me;@N2&&m4,]uۚ{(Y7鰘ߩ5 2͝ݻ]@6Hl6߰I!emѼpϙd>f$2/PPy,)E]#}k*ةnעuSէK+RbiO&H2@`(as9{ "4~-#o̺b&D/[Qɛ[Q.WŎ@AX9)SK7v.W$ eL:^gYL/8ìКӊvv6tjN+}FsLG~_L\f5 IIENDB`u26f9_1f3fe_200d_2642.png000066400000000000000000000017551326020644600341440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH_LUǿ޶t*nC%f X'Y&[l.a{0$>,Fg2(Ec$1dbb\1 KB"k@"{9{9Q,⼗XE8v[E/ܽ({79)fJK4(߃-kIP@Y[PiH,q"d5l>dY+ fSY;s{ɵ'[]}G 1S`nma`ɫG"Qjr5c,}u,e8cfc*2"!dhD(vmOnGUoqqtF́o{Ad6OeA#8cZt0hR&W֮kYs|D  ͰwZ. )P7]>w;<4VEL?28j\>1& P)_S잒k+F@HwL& 1bt @{Ku~#=w^S}3!鷿Y]Ѓ%Y1@ ׉cav͎1=ELH4^_7wⅰ/+j 62Я:`-K`9w}p(^wiN >tG kЗ;IENDB`u26f9_1f3ff.png000066400000000000000000000017711326020644600327410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHLus?BhP)iX[9-I*aڊ f8Z?mZ m3g?ֺ-9dU.&^El8TGq'=~~y?)bY#X~2yܻd2R>?)rb*4eC-.DwET&ֿ8pQ Eeh ؁Vu Eiذʬ+ `ͺ\ɷ)Hm*/iT fXÇgڛ"ZA\Pa!rC1"&} פzvY$R-%ӟHY0^ںp[WU=K7<9t鉦!UΌ jZ3fP__MۉPt xw\ K#y#U v[flw9|K@cDEAcY1ظyYvxt{&\wS]{0 )&g.jwb3|;bp>2|w8L4u Kh@ R+p]ULɉ(#J>'i"ڼ^ث+׃ UFYn.*FH5uL[DǤ|$$9+ND.{,ޔ"PPN7VW~_pl);m{J@l B2[0һHMQ*WVC*'Nk>?Y9鏊9h$=IHO Q_HN{T\.!\Y:]UTl`¢YdjɿguLd񭉂xBXcƛ~ 1 Gׁ l.3n6쪙*vݾ8k@\|7\GdcW';@ǟv;kkM<IENDB`u26f9_1f3ff_200d_2640.png000066400000000000000000000020261326020644600341330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHLuߟ{;Dl[`ѴGV??ZVkkPjS[FH9q 17!؉D1y>QwIG2zEzl;[d@DR]=YFIKXӖ^7A/e_@6F2ΰ!o&@u:7 %_8E(_LMB-6"z:)11~?^TX)VUZ~&5w? ,zϏ5mG\]!k眼[%f&rޞMz?ܓ7KAɚ+l-`ä7 ^dFw8 C`}fnMM冤X٪@ղAR1ǥ\OuIQg}P5([%kQB8 $ lhOPrDʆq!w#Դs.S%۶cуn8BA1K:rF jh> ޢBhB#qQ=}/=s?n46"-('#CzCHuǿVMB zKI Cb>Oe&EF ',GvdbLs j,ձWm9 S"Co7ST)VzͮiϬ}P:)]gY7ܢiV=Tb0T}O9@-`;_`;R9jDMIENDB`u26f9_1f3ff_200d_2642.png000066400000000000000000000017711326020644600341430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHLus?BhP)iX[9-I*aڊ f8Z?mZ m3g?ֺ-9dU.&^El8TGq'=~~y?)bY#X~2yܻd2R>?)rb*4eC-.DwET&ֿ8pQ Eeh ؁Vu Eiذʬ+ `ͺ\ɷ)Hm*/iT fXÇgڛ"ZA\Pa!rC1"&} פzvY$R-%ӟHY0^ںp[WU=K7<9t鉦!UΌ jZ3fP__MۉPt xw\ K#y#U v[flw9|K@cDEAcY1ظyYvxt{&\wS]{0 )&g.jwb3|;bp>2|w8L4u Kh@ R+p]ULɉ(#J>'i"ڼ^ث+׃ UFYn.*FH5uL[DǤ|$$9+ND.{,ޔ"PPN7VW~_pl);m{J@l B2[0һHMQ*WVC*'Nk>?Y9鏊9h$=IHO Q_HN{T\.!\Y:]UTl`¢YdjɿguLd񭉂xBXcƛ~ 1 Gׁ l.3n6쪙*vݾ8k@\|7\GdcW';@ǟv;kkM<IENDB`u26f9_200d_2640.png000066400000000000000000000017521326020644600331530ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHLus@CwM iLi5ZkF\QV!M][[< pfBJ'q?`00z>^{E{Y X\gu_~48@h rV<>FkWL"ät4T ''@u*d#~5]@)K~k Lh~Uk$.D91SܑgMx 4+ "3[IZٻ~5ЫWy7\;պmD1P/i4^S@jw@$N8 fڣ%llv֭b;)60 .EȩM TnDêz(55zDl7EM*ސ `HȬ$s2!*5e틫;S6d4|YiX@G;&9iuw/.iLMu/@"ORT#R?ЏTgpZlo9PyhzDzD #CJ{?@OzI$h _Q#s=ɏ1!kֈ ׭ A'0<0!o-][Χ,)^GD:FҋffKOroڀg+=j 3dH|c0os\Aq7>} ]2p|IENDB`u26f9_200d_2642.png000066400000000000000000000017361326020644600331570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH}Le?/ \ V@f+V[/kGYˊ5[/+Ss7J1%dY#f^.ـ;0:=.NTt],Gv'T֚Ԧ~Ɋ~TK>CŜxD:هw-t*@LN<dvu-֠/==-Ttyw9lvvLWIS0šRGsd e \G mڦD;z+Zqt n8>ӜWzcu2 L c\-}t0.F$hh:b*K/ 4 %>U#]g؈iVEH Xrʓuc֟TY$T9`EM ѕj Pb^){,*9׈?,j:v);d 6HQf/}8w]Q7)*Ző@9K菱o p͘K}mP> 1@VHIouux^\Y]_ISh/j Y V|~Sœn1B)M?Zimy M9ZۯQ $tBj|IENDB`u26fa.png000066400000000000000000000014701326020644600320200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKhSQ9'mlHib'D"\HADQ1ܸPѺ-`w҅QA\ ]X|`0ҢQmh3.Zܼn̙Ü{hOnOϻx/;b|e\#z**6,kx]d :ud.aƑrc;! cVL] l|`LQ,7;sf[JIboJZwNaJuTpi;0d~OW#D$gf: [IA1Z#R'q] CmeqdI'؈*$?e&bj\\ !4|韖ٿP+WߔZ{h:֌XH.#3R,ݹUJZ[ޝ # -CNewl(JUIENDB`u26fd.png000066400000000000000000000016001326020644600320160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d7IDATH[h\UuΙ$~EPF-h[ їilѷK VЊ-S yJ/XkKc&vl:ԶˇdRF&?5﵏*nڐh;srj6#b3S/ g"U\*_]c3|<ض%7iUJ3Nw(3lsNt<А+֭}xڛoy%FVOn tmW{Eh=ǃm /K2wımc_6&zIU, 7WC%4xOL٭+ہxʙea9ځ~DJ( HGG}}}y PsUM J'\65mtD-7Kk`z*T9|4Ģ/l9<윭XڱO9ɦ ^\'rIQu{>{9$áj15F,XZu}ݖt^4Hѻ~o:3N69zȬl6R4s xl2q/ p1?ǬxIQUذ"1%OSa tt_}DA_)HdIΙET4?3ɮ+>粠E-sܿ-*w D$Rd۫_)Av{{oMoc:iv"27aFS#G{_ ]+>IENDB`u2702.png000066400000000000000000000017531326020644600316600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHk\Uc5L 6D5 3 ,M@?)RwNcEyj,ѹBBk$dICfGIOu^ks.\!P% !A}:'95ڵf_)R2J@Yd6*rd۶ƾwݓϕ{W Q$`c>kL58=^g/K^cKz75._NtSo"6ޱ֖*}U Pjl4 ʍ"+׃'n Z[L`2P=)5Pg GWɕWZE6e13h7Ȝ};c߂FɱI,qC]bLTOԘ{&AӜ\g{MV )l4_\ˁD*zs]ƒ-!:r70U^X{Ps㭭l6Bh>Z;|H$^llFStnffbn6%ِU Pdq#f2rb;"b]ebb4442GbyXU@5("x<~bMdOEd1fNU U=:88 ?o=y*@OuT*Uo 1vHEd`tt T'Ǚjkkd+?0==}z#;< YqoD}Ve9nۖ U5u*ɼ<k(tvC(sƘsk9Lȉ{Xkݲ?K _TճmUNuzm;$3ZBIENDB`u2705.png000066400000000000000000000010451326020644600316550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=QsqQAp2C JJZ'PO`meEXįB̽!\#=N$,d9s.俉np,"I\2ƬȒfJǏ"H䢈%{_Vot:k"rDUG!AO:?_1A;a^(kyck}cJ};tӃ{1)4wfeop]UE>Daa+.{XڽNb-f4 ͒8.KYMTeO Հ݁UL ',J2InC~QA:\C$Mt׉JARۘi'bQqM(,)J:?>x45'6tQ*EjL,}#ed7XTu~clXLŦr\݊ʽN6Ync/GSs ._"/j9m4e8`[j*^taʂ5U4gδK5UM ɝ+_rGV6wֿb`-sWPiԔ9e;'Jॣ)!Q הEiU>|q]0G쓎!]AyAGtk($@BQG1.#f"mҤ4 ;N Y Th+w7IENDB`u270a.png000066400000000000000000000014471326020644600317370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHU;OQΝyhXA"6& <Ecbb11˜Y,Ll,4F[H4(HbQ!aewfg=03,[==wι'9cn0{'# \*.1Ruj9MvLlzm\2?5h(M<&g' )շ0`ѽ΍sao ?LJQG8# Tƌr&֪eGSm7"J,56CifYtZ*=$#buk1V>z:ZJou\(?/9fB'٫9b6k6iL#[*cfiÖ#r旿,B b13.T-ahHɁ#p|iŗT8#] di:""(a2HD Mx|t[u6e1L[O!- Mm+ G#@"NAmd )Dڅ}MJl*`|[A>4>KCojWIぁ=:[0~>Y\KӗUoDȽXIENDB`u270a_1f3fb.png000066400000000000000000000015001326020644600327060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH=oU3ݙ]gYI@BQbB.ERP!,P) !ldaڻ^ݙKlxm1{ιGn~7_J֖Oz["oI w(;;&"4{fc h՗Al0(\ձ\籞 T%SZsN="x۹lq^'QCm蚀O(yC5.+-J|t\Eϥl\F .  KZk5 y\\rfY96FadD;t@z9zڤIBhp+*_K*[-ZĩyJta=t*HK/;QwtA6M<ߧOƐHU^,M(E!l>8& CR;MY0Q0?`L[)zyvE $UTg4Vݻגk6:Hz46+Ge%'@)Hjfί gyXi CD^PТd39?#7O#`fơًXq!} ֟0riYQE೧ e%soG>8Is=D H8Ԣ^7 |ц+7I- vpS uAIENDB`u270a_1f3fc.png000066400000000000000000000015041326020644600327130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH啽o[U/\*q|R ) Z*P!!Hbcbp%QX:!i@]@)IӀ4ml:j;Ls9zpwue/"ܻ\^)=χ뵕k;@W*o_"TZJo,_6&oڮ/N}w3깛5KO!h=Yx=sܮ8whNzgpbrtwA0Q7RgZiE]TQpL@ ?RJE~OVJL, wiؙ|Dz3e2 i4|A NϗOw{^u'[bSLR()T晘řf_Z]}u@w`t/egl9BH4XWGs1G4mTnkYzu]B?֙l$է781_߬sb!Lgq8QhuPiRv\Brs퍒ykI]Ǚ(s]rBJT*ݵjR {r!@hV61nAΎ -t\gfz4t{ TN_tq |WYXEuBd@3W\>FBsso}8ln$ć^tG/Jƣěg _\ ݃7AIENDB`u270a_1f3fd.png000066400000000000000000000014761326020644600327240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlLQy3M;~(+X QIŞHD,L!xv(4UEXIؐX`!g3yk{rvsϽlԁ[u7-Ƀ_qO8yܦLLlJ{6x=e&c2ml24:>d;'TCU|@a6ή`Qc8Ce8350 |kgXr}wɯpT)EYB04(Pll<o_#3eY @PK^`J2'`6NNsVU~Rrc!Jw*W6\|T17\j Ap `{MApz͟pm[_\h+>D:QhJ-ְ9`Ji?,IENDB`u270a_1f3fe.png000066400000000000000000000014561326020644600327230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHUMkSA=wf1~TW"tM;"-܈+/. t;E[ۅE*(Zi޼q iYs=s}oa|3Si=B!۝Խ{ztogT,"o47ZbGF'w,pI>1^ޥj{y%sPa2Cm#Z H;ʓ%QEEr芯c7(17Bkyaּ57L涸X`$ڦ\ᰞ&ʏ|,ԀPd;tS:EŁA֧DDS+Y7HNY,V-t`Z7Op% :x e"c lZbs&͙)lR""h[!׿Mx悶hm. Jlqے(z(g NƦn , 6%K, #&?GkCY-d ߝQ7sIENDB`u270a_1f3ff.png000066400000000000000000000015271326020644600327230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlE7vo'$EC"zည(ʁB= $=ʭLJ@$@@¥i4Bb׻?'q$iofowf& ǯy>rG0<쬰o^*BW۾𯵍'_|ݑLOY3b|;N՝W"^M~zcDޛx)?h3nm3xg4]Z+5گP*6UUz{,d iOJqP.`j}{ ' '`2ۢz MϳCB[oP*^C: CC F~;8gsUwZ324hzkey,!JI%HĆ#;.lS=FcU]oE>3"\>6YB]&^ˣP)fFht9n}`<ݺswx8d \]c8bQ:E۩ HM\2N3I?ɉ]ƒPhmԙAJqk_{յ@Bl`e%NkĢQ.٤ÝX =~i$#ݩB/YTp@< #gWo|ǁ|>#ԇ~fzZ^>{$GV׾Z(=t])1_LVϔ B|~us+҈Y/:oo(D&IENDB`u270b.png000066400000000000000000000013271326020644600317350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKa?;3뮭,`XEЩ uХCbnAE*RDEt,(XB֗Z3Vu3*)@; =@1 $е ~ v[(]nNq ߁K dN\kM *0F'N\E"x}E U@֚BM|em9V8*(|HfV qEҙ Tdžͤ]U 5+~ 8m {ʸ WG6lE ?L΋\rZ0>zc5r- o6u`Y7z]׀!>xܤR̵wM~/ ]585g+&~J ʂx^C>`l2* &od,V4/ R]咰*yND|$$x)x%E/\s+*7(g廪ÝBg+1dGuKw L~|-)_ՁwVwLddwTNN"ή='^ B?ZBݙW>uUQdb(ns5<O;Kڎs[%C? *mtY}ziIENDB`u270b_1f3fd.png000066400000000000000000000013701326020644600327160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHϋUe?{6x⏒( #Z]2h` FC ,څ ܄F ђN6w}Z90޾y<CC6g}4r"cwj?~@Uӓ[HfWBQtvtMXTσAѧnW6v@mQ?d#ڵt^5[[z,lm.8A;'|F J dm42qǬ.3!fF\Ç3fyQrܢ r|z\ y y9 (VnQl$Q۲~=Df0wNpL4o;yǂA]=kn^81\7b <(1X+Bz %lPO)1I7ɝRBNբ= FGG]<:N|+kfҼx*hظi<6I΂_oLЍwWOzvxsMnNѺ|ɪ{N] %&6ʨ4g@TV=lPW6u^exՇ 5gNZ1̭ vG``ik>.J {P!.wo}lvlAs 5 y+m'n.IENDB`u270b_1f3fe.png000066400000000000000000000013361326020644600327210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHUKTQM͠Q-2+  D9*)w--Rhdʅ HI2:={μytVǽ}Ƴ=Zᡡb-{5WC0G~BĵV1J\WA51%*ZCsA^KPqĈP)Eon0Ѿ#z/g'hF_AH@!fj"ͽ[x\*8QIxyq|џ;쩲l[MȥC02ЕN;<3%*Ǧi IENDB`u270b_1f3ff.png000066400000000000000000000013721326020644600327220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMhTg8ј(P V\ԍvVJiqqBE1H]tbQğB)Xp#.ZLDƘs5sfguys+:#TΝ~NOao?=¸,K{^?P y8겛q=ݵ o6pg E㏓yD VwUWh͞3VTA Xp/-Ʒ op\+Q5)$ńXXRadpRBRwR$yV>-o6OA ;s(M-7\@w}qv`C >Y8 lP.Wp\{?=^:A{*3V` ^F*3fz'y7^7>_wqD~hLB[lJ: з㯨t7oE]xVcvnuk>\$_T▀KǦ,ԫ׬hZ:<{~zVu_H<̊G!a41ӭ.p :=`T* EUVn\.$ &k7bPmP3DD]DИ$63Nƾm};I;Wn]aP!.No`U9?m 5$m1>HN'Ff;WGt /wh~C$—snQ1AVk?-EVuLt4%+b 1xNٽ Tqzm) (x\(T4me$b;1ŀ(f0BE֤u"h zUUM̉<9זK7#i, c>7Y9xwp<h?킎Nѥcʎ oT7^nk*>\~yM){'Syq Š|CTr< ~S2R]Yp'd^3 }>Ih̹ɶ=^)ߋUGU5"r58@8Ke=\ѽ "GyDݔee $g<45mTK D uH2T][:QRIUώ=8''YeVT4 n"9n:n:1(bl@NbB3ώa !"i2FzVtѧU.k d]^"rqUݨ3  ?$:tmVn"c4F}4 -ݻ^\sݳ;LBcJ"=m[u4d:wW!pD?|kQpĩK^nsɼ ,Dԇ^eh>Sing|^]V<~Q^|c_wMC7}9IENDB`u270c_1f3fc.png000066400000000000000000000015161326020644600327200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHASWs$yѶNnjaAMG(t#Xu3"Pd,(teA7&BwQZ 5Cb Յb&:d&wdƼijzi&cM]g ҙb>⎑ܶnĆ}T*@ب^d> *#;}n\ʭVዡezg]'~P̱μU/ķ}5Kx-mJ<5w ]Iv`t˨uz0xv K=+L>ڡAtfw(GDc P_erro|`"pHQL{8"znA$ؑ[o31 Pu#Rܡ e`WsI)=zApI"__]V@3FY3zZ>6dIENDB`u270c_1f3fd.png000066400000000000000000000015341326020644600327210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOhU?73&ZDZo'QCA<a{D衞=݂ d  RJfl۝yΆ${}?y3#|߷}o'i?|pkT>RϤO+hv,_z(ɓDxBL' D/Z<ѣ[\a~}yq~?/z0zbRmۼ?΄o.,}4c~]UO4[C:z56#=@^K8"9 kD:يx'*ϩ"=( ĥ#Sеcߥi¥w$Nv_T1PF"be߷sPgP0_i_Q`1ݦ֛"e#.ٱJ-o/qGV k"bn=Ӯg3 WE"cZF 3Eq"?Y>_zm 1r]Q7kTn֨Vjl*[ui @sg XKƱq\q&qa]pab fnY-d{bDhK#jLxܗ<7ڡR,9z|L|GZs# xMYouLҺz歏@T.~_%f>X-ߝZmㅡHQA \E'\!btS knlzXrIENDB`u270c_1f3fe.png000066400000000000000000000014711326020644600327220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOh\U?3ɄIԝ ҂2n4"H2EEG i8teB[B1jQ.+!?&34ͻig}wvXAҴLa j6&_K;AqMEхnGh Ak7jmmLK3I:+HsM2} yv\k t_L\!2}ȁ'4Ֆ3<5@D-H w@̍P冀[0q=@0:@C||p߲3v8@# onmX,wP砭+z;YZS=+WW|`"|Zg&@K/ H0vo6 N It$Ǿұ'QƯ>=YEP)ͮ(*Xmw](>UիX8辔Jֶ,soiIgKa1cǶْ͒M4<2=UђZ7X5}c:oZ̕ɤzՇ|J$- Wޙ1v{u޾ 1^~# k U3{,q& tm}}s\:}. x UNiN&ؽk'$Hp@BX tvn24mK_~KezPovnio Xo%an\5-4ku4&Ht"(s*,1g6ՙP)sR@ӈ܈̓\Xz֠W,Vt/A͎CwD_&'83Qn;k%IENDB`u270d.png000066400000000000000000000015631326020644600317410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d*IDATH]hUf#۴1Uւ,EQTGQLY[mEPҦ4Ƽ -CC H)٦&1Kw;3LJ11$;[ygw.^HvLJҢ -43 =Jbhb$Vb/tczPWVy,w{R-Mtm>}}Qɜ$Շ X7^ILɖk{c8˛a7X=7ڶ?onX0#{zУj5B_*L_WwS{kU;㧺EP_ĝ(</31i/x- (|\pI#@`ԍv&[+Ggk}! PWoS~-h G=dP>oÝ{Ey^{ ~i<@4RD80qpyfi]5u'(JPOI]X䩛bZ BFګ#^0%ш׭t,@6q*@0Y O[H]n!R "0p<llZRxgjxwi_xy)M&N0%?aaX`z] p\>DϩR+`, #F\E 岘a*N#zf@,^Hkp5o+ 95ٹFU(8^;ȓ@0pP\[vNg6BCgϷ! #,//2Mtpx_>wIENDB`u270d_1f3fb.png000066400000000000000000000015721326020644600327220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d1IDATHohU?ݻon1!s$*DA& -w}"BpDYld,(nP^ ȆBI&?c^;7{z浱{d}ߝ<}9<(h'X*R &SKb1o?Pu)Z[݉ͤk>CGN}70jddce\R4|m}m+OOA| s"`>b#af>Y)7G֊Ss~k??[㷑 v֙]mon꥟n8'b AϗUUy|GK(8;umv6D- {K6!,̞ѱį_+w|~Mxef:_3jt(`ٲ1#tu>8|WٗI;e'^"Tu6T b|\աQ&bm{/.@zư|)aUGxR^zU]1b@% U n_X~6L]qKk LVLSX]LNGceܬ@*sk`4J8V>D s{0#< R}us_d3ޓ YChZړvy]B2\;ؘ *zH3KP4J<dqg,N 43gcw2SxPnEgzU_+"@t/l}eʏ pOsB}X])ha&5_J8A /xzIENDB`u270d_1f3fc.png000066400000000000000000000015611326020644600327210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d(IDATHMlTe;LgځZ(?e/$c+Il4RM S q*.Lk XHF J5!&"XH{\g;|~'9bNbX 7%<ك~G{MIWb蝗oz!xT͝X^)o}߂~c;eZ X Fc`-፿vCNjC95ݼw|L%_󧮜iǭb nڃv="FzUu ]2.JV%GObU~,U2 ܫky;LGS{7eO+?{KЧ;3vҔLuƱ.]t~ɚ%KnILVT x)K/lu!;7S/f&',]8y.jc~Ik"v:ʨBT@ cy.|`GY|X0PmD2r;1fwמ>e|gӞ}W'qՎk(G-\uVh$&mǣ6;r^Dou끻hhl#R[bo"|7~Vl7%x| ӁR5Jdwֺiso7lV0 y+}+qd Po\Hcd3NM0fǕ!<&@%@ߴ'*B—q;Ê.Z1c!TWWf zl9r] dLyʠ^.ZH* #x/B LgjkcU!9zd3Y$K$2P7a(V${iO0C4#<Y  ' yD&2@mw#^f{k\G[=[iVck>ue}^䅦-G#9p h`@-;ܽ$0.=IENDB`u270d_1f3fe.png000066400000000000000000000015551326020644600327260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d$IDATHohUe?sݹ^sV]X  H2Y*4mq%[/JKQGW4"1b(D,r[Vw?ziW7}|}9Xb;k j*锂 hO<|CVr]߃|к z|b,)D+s].ܞXw-GO q"Rb||p;KKK1LF677[e߼mKk|;ΣJ 0[5]?P\lqSk|nNRR߯E`- G^]9D3|s9%|}h敏>9xFkL}_(:~:si5|\7zìetp=m 4Fn}-pnW70\aS ºk0p lñY ̔ K,ϟ* <2@E#NXvER=-2lLgy wh: NE$Tt'CVe|"4a$'WKCY29 ;Xx $ }!G6Ч' $0O*Ƕ@+ߘ<jA(bݵ`Lx@;=ve G*9@ |okѳt[#9;{{hJv#(bMi,Į4(sQi?r7.IENDB`u270d_1f3ff.png000066400000000000000000000015601326020644600327230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d'IDATHoHe=; *3uLX-EvOn 9ݣQD˪m(fk*X!pK`</10}EGgo1—ň6'3v{d82ZU׳Y_k=Jccb r[\a0bSfjffoqǭAWӮ'meZ_d> 1f"9"r]*r|3cy Zj2&,7G^xKֶ;Tmgamϱ\}88A,Mlb tЪp>tH˃\D <)/1BKKiKB)ԌZNg:s.{3)Bp^9ksW$  # a0Yǁ}DD4 =@ | nb$33S|`-ԫ6qGoJ}z[dn:SWs]g02}-V@t÷I cxU?RgVGGVf8bǹ%_ҿYA!o}EsJ//Vs}V˖nPHhIICLTPKa<ܶarBYscEy@]ןۢQ^Š7h=mWo}-Veu'y_&εu8%eviDI'gد's >xۆ4ԹH]%69(Mtѐxjucb7jNC,ܺOm̼Mvk5ݧ[VX)dUdA⋍sJ!-X/.ّ@a3(7t~&:# 2-z`O0U9 cK6|O'-*duSK{z!DCr/'SZ7AI^>Jg4b*9Q+*|O IWN3wxELk~;v]ӡȲ-E'hHCiǶNgz-;$Y.8͟XK)ߙ-h@ }]Qizh?º8m~ζd%CJ/r^h믞iBovZRwELCa84Ngãnze>8@+ʒ.9hsp#/h*μ+e841!{RmNe0J7RJVUmz3ASw0پ8ֲOR9*ɱln{yrs'ySĂLIENDB`u2714.png000066400000000000000000000011601326020644600316530ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d'IDATHKTQϝQǍ3cDFв >FdaJP}ZWB%(BcV+G6̝f1,ysK:7.6x&mbW,Ҝ(ai[ \^P+ *DC̾_3 gVp ֓,)m2 f'0s7ߍoJ(D8lrf}bpB{&{9\֟֜>L5pd79]]`-mؔ〢AN=]DCXL0QI'Hjw [V}jMkjd$0(hnVăbKa< }IG0K뚟Mh4;p=1.Hg ]kˤ7WFgv/G/U5m8h3xJ]+Q33V7j0(4g{6Cbxb+ɥǘ]N(d׽'74t/="覟Io/J#*u-'oֈ4Ml֎~a(IENDB`u2716.png000066400000000000000000000012111326020644600316520ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d@IDATHՕkA36sWA1\Bփ""ܒ+ J /zhB/&`饵xۋG5f<6I/}͛yo.|1o|i8)-!ᢳɰ3n0G˿UZ.BUMˠ>sbސb0CѪԘTv$ps8L}(i+0u(͑Ժm} r&P!BIkj&p:KV 6O,VƣpIc]ԕNο]7oXCJ>C<#d[&4 99Py)W-֦s-ZűYE_+IENDB`u271d.png000066400000000000000000000004661326020644600317430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH;JCA3W .#$5Gc`F+ [[cB:`͙7OQYw6@`v7J#f."@(V-G)gNcKkI3ޛHIsp{+{jؑ:9-©c|dHPU&oJ2\Wŀ齜?|M.߿-(UHtP8*ͽm@]IENDB`u2721.png000066400000000000000000000013361326020644600316560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHOHTQ9f! uSH%J3-EViED?ۦ("L1EmZDP Qj0BDf9oʹL+E=@B @yQ*톛A25(ޫjjSoAS+<&oP\rRN`/3k~.Pq8>*Hh>UA<FYP(ґ~'iR z((=ûTE%>'n_\C&bJT._DB? WSƼ>:ndXNSTَTdP6IMM<>-u29P(jږ館vQF*ʵ?Y l |3oy| ޥ_ \lN$x8@P92%1Vy@ ҙu.;9TJxf9X|h18>hpdJgjdGty C+:;[&n )<(3AUr,iC@:y7xow6~-7@bKHIENDB`u2728.png000066400000000000000000000020131326020644600316560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[lTUϙ{kHh$3E j4>HH54*CbD^8-*5"*À`58G/oz026Y81 'NlFoܛVg ٓ2mZLXEeg%;WQ|z蠛*.FR~@։r rqs_5;z]MRJ@+Z'[Iciteg\ح'ywm!"Λ2:?0J3BfћG^hPWqe(Gꯋ8⾠8]Q90JD:ar 'b'}1@PmuOWOCXQ`$QDeGN^MYգ;zS]7җ܁{Xnѝ]̚zĂU;VDWԴҗzcz&J1 ׀ǀЪEv%HY*p'U.~8JHudw=ܰT§l &D ۢه8m8OD]ûus 7SzzhCܫ>CdʠDؕV9[*J39@v*GᬢECW':zҳխ,<@-{r/^&u"b] (\sc1`[+[*fϣU#=9ʽVA,6I %$1lvfcWG՚V[cK;LY*}~`f띵'ԁx*Z\<Nf IENDB`u2733.png000066400000000000000000000017211326020644600316570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHQhU&m-UJ0_ڤP+`REDO>(؇&E&ui[L2E!>mp/26)bu AMܖ|i}LJ4i8s3tVA'df原<"ڑ<tbz. ^w %dD 'J5"t< '.50ȈH1BvvWŬ[FVkLRji o3WSJUp>{tZM("ʧwO CUPSpɁ!Se]TP"hD>S@ [Ii~d'inҋ6dx:Zu  9Ae'@Oڝߢ,hE$W.ihOɕ3*~Uk$E h}F}mv$0l?tn_йLnM7{ޒ~Tdkc+0#"/?hn9н  DB lg#ē8ta 57.:/XX;!+͞%/>KnmhR0 ,#( 9w@t^e'qP1 D2Pڒq_Az fˠӔ8Rz|hxH\𙝊SΖ:ۢZ@[9WSK*ۥL1?@]d>̞r`$EyʉظEFD5i%pFb ̾#IZS]f ?YD6߼)w#:t'b)IENDB`u2734.png000066400000000000000000000014141326020644600316570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHNSQO/@je$܁Cn}CDR.C hCjp`jm^m9H^k묳X'7gdj ( *{@4`-lv3ܼ7EFѣrfw[= 3Z [T%=&ZɎD:-mPl}UoYxԗ-+ۚ*&P_eLBTf"bٕZ=*P2Sh(?o=9*x~9lx}.ϱ1IpXGV:ȏG,4`]$i< ď2]-ɯvzPiA29tqRtҐyH]K*L I@Q dIDUРuRH]chvxl4񯹵6øĿi8  ٟ5o:QI~L&x//\tҋ'ϡyz@riV'ʙmJ4aV.UjUJ'p` )*4H}(xZo VvO@c*3p.v,L]ZŚ_v5詪l^]QA'i>ϴPW/9%-d'IENDB`u2744.png000066400000000000000000000020121326020644600316530ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHk\U?tfH2.u,օRƢnV:5%_H0IhK-J -¼vR A2ojg8IޤF<{|Dž6f 4M׿a\K|j/AW6[*k2t6fZқ2YԡJ%ivu?Z:|PYo>Y΢8Dz|ZaLtM(X(;7p PTI30)=r ыO $P&۟B"ȩ9Ua๸3O ?VS>Yܑxr@oIvj!j6M)u7jE l"4$@w柰ReYvW O{#1SqufkTP)Wl_sr#r}v>$a#VTM'V9DDdVIhFNϟVHxdO#2!Bg9;~Nm祖6P| r#Ԇ^nMz Y."R͵$@OdMAoOTXΨd W pBPUd]<{=X2 ='7rE`8woqZ jG-ƷpD"3'QO!\ huT񽷎T>`Շ\}>{x~H JoPE'*f"nsy&7i*~y+J縥qeW_k̜E$`E]ˮɍ*qKN>G$<FPJB.l'%Tp"cG\~֝l~$6C`a=)(̡3]zMڒb[3'@ݓIENDB`u2747.png000066400000000000000000000020761326020644600316700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHMlTUױPjD#N`uA\`tah2v:qQ \PSjBЅL&h&%d:cb{\8չW:On@ 8sulddq+nJR2+eӑC=7̙̾LYi\(hʢh.fQ,6TyG͞hU ,TKj<6-`Oi;8#b]ǚ/ PmKMedQU̾;//Pm%lPML|5ݻG-ȅ9V KJKTL|D% z,p^ĦUŬ٠$ȷPl& LV7oHjzrԷi=e–̇ΣDses.>z:sIEZN>hytYY& eT͢\C䂪=z:*T4*FgOߙFl % b3(/'9$_qT1(lؠKEVX8@Qn`JqSD"{{lL 6{w ҎpPDǁUȞߕX:\y52gɝjȢ ۅrF!q <:V6rxqTDs3An^r*i=(5}c7l'ny[׌tnch]]:wx^Dnqi2J3rq*:Ա`l$ņFq%Akz9Si/sV[D$ FS>44jw:n)$ Dezr-Di@8MՖHw]۠l {ܤ]@WNl WшC]^9zπh \,9u5[ק?GV.DtܪU߿0-QIENDB`u274c.png000066400000000000000000000006411326020644600317400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dXIDATH=R0ߦI!")@`,&NECC 8 !g%25M"6c13e˕{' ))Jƣ5J#%Ŝ2״)%%,ZyHAXhP z⺆*)&I'凸j%kDpar .pŰ |C2^|pL:1eҀ&*,h9^_']AH^[:tB!lΙ(2'0| ĴK۠q ‹ xE.prSvuwnصbLG0́jWTIENDB`u274e.png000066400000000000000000000011101326020644600317320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHKaǿOrw*r!Uqh/W!:vpEvhuh-uh! LV: )ޙ!}/0v}?|mC xfRCֳW{K*bM1)gQ7lxn%?-OʼnӾ]\5vYKXN[-]o?l׊gmqz]r-X48&KJF[?IZ r/w@x 1'rx[jy7 I Qiݷ4k4dEg^ :k[ &>0<"yBD'jIe]# .S[Lg0>X&Zz_un`5%zfN**tD^?R6NSIENDB`u2754.png000066400000000000000000000010441326020644600316600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHՕkQgwƱ Z(feB[+EFRQ1`a_ ("DI +Ie3K!vdE [4{sΛ9o>CӚιEQ,H:|l9I3FCM>fE6!p9woR֠Tʀw2خPnii,ˮIzeٓpm;kf0 :SC3sp`jtݵl+jx<yol`fma_i:[tTޑtggbUy5p,,qZ 9M(5IKqj 0 ſٹ^Be}3IFY ˋ<=y!0?QE[?srQ%($Ip3H=%I[uSO{y `0|l{ ய7Y;IENDB`u2755.png000066400000000000000000000005141326020644600316620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHAJ@ں nsv#=CO[sH~N0B 义M YcfL,gYRz yόWla1z"U6:x7qN}ltз:ɛ4Mg>6: 6%vEKdTS`9~# UkB+`̜s -Oe{̨n[ϓ{6+rYp@Xp@o;XpΨt +z9:Fŏ^?աˊ4epWV@~[V5iY s Xବk}{i,@x6y-shݨVY/IENDB`u2763.png000066400000000000000000000012171326020644600316620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dFIDATHAHTQQ3s.rbSD!v(…jmfY:(hi # *jI"A0{ZI3㼙qw Yih(d6pAXVV[G|ˋ33rhQq7^ XUU:HhГe5IDTJ hUw`;2f8@5Cp={f_~K^YsrձXH+@__,}K]{Cn$`r2}X?;1|`UvtE#ydtLq|*j<+=l-(5`9p8G2^G*-z8 |+#'`Sp7 @JǑz O2 Kz8`0Qho#<lgph( #ΤojfCa+)*M;-~튱5h(rжL` {V4 0hny]k%d} Ֆ)Ae- ىG㕖z]@%&ΕsKpi~tD /+2r8&\rf3 [!+,ޓY&KZZ`{b`zxyyZވo^LsQ ړ*pim7C,̭iA.5/MrYAMBh޳@&'m 0+|'= &IENDB`u2795.png000066400000000000000000000005471326020644600316740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH햽JAϙ(a7V)҉ħSRgpVB C*biRw,v^ ]  <~ wBQڡC{]N:j|b}vSc઎5ɹ^Ҁ JIVI3Xq?䛕-v3UrG ^39 K52/te 1Qp1جc`ИrYjN;=/ ~Pj_Ӥ  /T( IDY0ְoMq:WIENDB`u2796.png000066400000000000000000000003011326020644600316610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dxIDATH!@'M90`{&\)@ MXE*qnB4D,mor>\A\o}oV1BZ'oR՘%P,rO:Nc3g`E"% =2׷e۽TCntAr3!G2#A :H4d@Na7 FEUJ[ IENDB`u27b0.png000066400000000000000000000010461326020644600317330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH퓽kSaϛ b TT.trP:'MR*C'*&iǡXj>,9^Ǟ ?®2,yfX?ofro+r煒y WY-N0_N4[(9%<8pc?14 P"R1yT낌aK [ R&=F{K3beڠ Fַ"Ij1y?t,D+bøI2[DY3pR·;` 趃 Y~X ͍K&SU : m5x~ԍ8KcO^"\X $tu%"Fkl,fkf^00;:!E2 @)L?th[f]f^ bvSf 3?xgٓ_vs=?IENDB`u27bf.png000066400000000000000000000013521326020644600320210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATHk\e7nڴ)EE*(R7-QHGHtgS݈] Vd P~@4IkՊ${\̝2ҳ;}p[V6}j-ٿ ̜o'n>dxw~Zȸ4RO.]V~=5]k-a~|Q `qYY`]4^0jT oa? n8ޕ)qaHeyñ;M9s|yZċd#q\@@c@ JRZ"xba+(u#+ibZYO`-B@=ȳITf kr0=#xc%-_NOV̧:Ps|*>ur9)r dQV(i U{<cm^̇؅.o_pf#}l I8p!=^%6ۮhGN+K;;Jg2KTCcEŮC/ P O'wGfzRlaj3{OZP}/PH%@Tz n_p|&1><?|WA@p ^8>E$ b9 Wf4cI7ti5;2.֑/Դ+xWJ'8Z(_{-[S`R8t11&s[كcIENDB`u2935.png000066400000000000000000000006751326020644600316720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dtIDATH픿/q?F$]f3ܝֹbF"B$4lb5A,Gg}o kI\5uhGh^=oc;xH Z 5݈dSՎݤ-U70PLO7c?8Ƴ}!<:S ~ xKTg06+)Et[G}LU-7VG}2<^a܊Z5 7 FίH %T¢49@/D-yDJ kW?IQ](Naw`|{fػ *yT d\{~f*WxNACXfo7W^zUkwPpe>IENDB`u2b05.png000066400000000000000000000005351326020644600317330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH픿JPwo\t]pqҦA樓ܡ(ΚրiF'ӡ)HDS~~ TT+ax"3|Ƭ9&VRwf,@)✐9FX]hNՌ/5V' Y=*{/s03 [.Qid?3K[F@%GG %lSQ y8?ry#J{WF%W~)UTT։UrUPIENDB`u2b06.png000066400000000000000000000005551326020644600317360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d$IDATHc`C |kw.)zU>F ,|Kx>^-m@%w/t/2Ex]sNJ=IENDB`u2b1b.png000066400000000000000000000002441326020644600320060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d[IDATHA0CџFZ h (Lf#kTk3pv^'%"`ſ%@ $OI#*.i,`'涜/۱֝IENDB`u2b1c.png000066400000000000000000000002341326020644600320060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dSIDATHA 0DEh"E)аJA{!;N 3806;+j8ԞWH H W5`Ţmr6vY[IENDB`u2b50.png000066400000000000000000000016701326020644600317340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|doIDATHMh\U͛dJv-5Z"sQiFJqPb nD7n]BPLi&m׻︘0$3s{.vkSkSḻKd?iXp ?Zmg5b^YߐU}]^['U/PX *>yli'n['xg2^A@O%Yn-z NWX8UmA*[. @/D׽5`ʲ? @f\I8L\;|JYu^*~9a.E6naϡ=)^ Yj]]/B2}ǯ ^W%"@V3!i,WI>5_T}U%e.4"7eC^4(xo'QUeZxkV-Z&?-;"荝\A&_ټs@bO*f3s0nGx;Rkt\DZ%ANȌw5f/2:e`!oӛp6L:p6&//k? JDۧ68 nmZW2Ƴ|Zgo D)TU!Q[-o8JyO-ӄӯ˥3A9CyP.7H"7D^UB,)2%;A&,AIENDB`u3030.png000066400000000000000000000006201326020644600316430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dGIDATH?/Cqӫ'ABE"b! -:F 6$Fh5hEC+00JSm{E:;9@ w0zp[! قHa2֕B˧yJ`t N,ӗazbl;{$CU2}dzC.E'eS)w iJUQ9@CD*䁤"E :j X-ex>,$NRU53؍˻ϕdf̌dU 'qוj2smh)Pgr#]?IENDB`u303d.png000066400000000000000000000011611326020644600317300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|d(IDATHՓ1hSQ^^cuҘAEThRH :+bEt88 ѱ:X)Zu:T!{Ci^1Y?=p%,ej^ 2{1G"H~[be= ~}Ḑl Ԋ4׽ @to2PV `3~OJ^"#}N7п kV~ tR`_*ѣ49|pm`^=)TWs%4 68U\4J6Uv5 mL;,uE;B[tzgCH }%@5PdX b徦@"0*^TVU[ƞS媨\pv |)UͨN{.T.k72O+D ruX#,Rk>}]LTè{_'pXu&sO2ceFy6Fz/.`UN?C7H;b1= Aοh {]I'leIENDB`u3297.png000066400000000000000000000020341326020644600316630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dIDATH[h\U}Ιk.B&MKN&QDb)R V(JbMXDQPڨHk RPsI$M36Le.gΙ}8Ig~{[ W.OJhP+a&rXY`GGW.)88*0&^s~[G%| xތE!ֺ%`psq=GrF<qURŠDމ!@`Y@[_ȭv^2S˞WՊ6-S5y%N!(u]Hq(iA=w"lj~ :zC-ro~saS]#>U[_~2wjRZQyvee-WKs`[)DSIEL:ωMf3e/ 552gy[ӄ!lNR7nQAYIƚJfJ$A&f*KpmFH* nl:eTՑIR+1 6+ k b.-Lj-A<' SHEuVG&I^_ 3Ӏ)`?~-׿qۛZ30mW)fd+6S C"\*Z|iVb8oߍ-1=YVVW^ "C^ (}U4F=z9;vj[˓H3Elteg'/RĽVZ32(yЇZK TKciPZŠ%q zXsϋ! .BXg /x[߳ v-+C |鮁 qӓ9~ag/lvK*_vds $p)?La8Ud0~mhF$BR-B3?E8xgIENDB`u3299.png000066400000000000000000000022151326020644600316660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/emoticons/noto-emoticons/pngPNG  IHDRw=sBIT|dDIDATH[lTUϙNKiԂXZhMR  %-h 5 (FED!bK&\L[3sa:̴tk{.ѹNX`T_E!mهj ơ#LsY xERo6uS P_Uc+N{gFrټ'SA_UA0R:_Up@pg4F=Ώۯ<9cqȾ++'}Fks1G*{R-ƈ""?F.%z8a_H]Lmm4lؐ 7FO wtn^ 2?H wt[W }vٶZW|P!?+Y:c_mJ=I5q+ I9/A#_7h_C^i]> cCx|\+sMdN:gY3^Ny~]^@\'Xo D^(ƥ"y9ݷV+\AF(LC?}L`4k'15d\ĐEt݈'ɺtWdqgJj e,1j|2 1|}=mѥ\w'P-BNj| \n-þ6ppia* TJ]|K)ɮlzO_ ŀ'}^K[]wRPp1f]dp.u< ft;C*R2Z븧 Bc}~i !qHnGg|{b5~/dQ@&{aO?-?TZ cځy(b9<:ޏL Hmnn^)GڹޙwC6U;;;ʹ1wOrhDdP#kmUH)m1XƲ9poa{bQ{RSw&z 7 VVVZb7ZO?9"jVv^PSJqbAkMٌ*J= æ1::.1Ng:kkkF!7( 2K)Ǭ#ڬ؈Vj~~>\ rwww?㷓SSSGR-|ff̗_WgTIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/000077500000000000000000000000001326020644600234675ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/account_context_menu.ui000066400000000000000000000066721326020644600302650ustar00rootroot00000000000000 False True False _Status True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _Personal Events True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False Join _Group Chat True True False True False _Add Contact... True True False _Discover Services True True False _Execute Command... True True False True False _Modify Account... True account_creation_wizard_window.ui000066400000000000000000001347551326020644600322550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui True False gtk-preferences True False gtk-apply None server_liststore 0 server_liststore 0 False 12 Gajim: Account Creation Wizard False dialog True False vertical 6 True False False False True False vertical 12 True False 0 You need to have an account in order to connect to the Jabber network. False False 0 True False 0 none True False 12 6 vertical 6 I already have an account I want to _use True True False True 0 True True False False 0 I want to _register for a new account True True False True 0 True use_existing_account_radiobutton False False 1 True False <b>Please choose one of the options below:</b> True False False 1 True False False True False 6 vertical 12 True False 0 <b>Please fill in the data for your existing account</b> True False False 0 True False 6 6 True False 0 _Jabber ID: True username_entry 0 0 True True 1 0 True False 0 @ 2 0 True False True True True server_entrycompletion 3 0 Anon_ymous authentication True True False True 0 True 1 1 3 True False 0 _Password: True 0 2 True True False True 1 2 Save pass_word True True False If checked, Gajim will remember the password for this account True False 0 True True 2 2 2 False True 1 1 True False 1 False True False 6 vertical 12 True False 0 <b>Please select a server</b> True False False 0 True False 6 True False 0 _Server: True False False 0 True False True True server_entrycompletion1 True True 1 False True 1 Anon_ymous authentication True True False True 0 True False True 2 True True True False 6 6 True False 0 Prox_y: True 0 0 True False liststore1 0 1 0 Manage... True True False start True 2 0 Use custom hostname/port True True False True 0 True 0 1 3 True False False 6 True False 0 _Hostname: True custom_host_entry False False 0 True True True True 1 True False 0 _Port: True custom_port_entry False False 2 True True 6 5222 False True 3 0 2 3 True False _Advanced True True True 3 2 True False 2 False True False vertical True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-dialog-warning 5 False True 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True 1 True False 0 Add this certificate to the list of trusted certificates. SHA1 fingerprint of the certificate: True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 True True False 1 3 True False 3 False True False vertical 4 True False 4 False True False vertical True False <b>Connecting to server</b> Please wait... True center True False 0 True False 0.10000000149 False False 1 5 True False 5 False True False vertical True False 12 True False gtk-missing-image False False 0 True False 0.10000000149011612 True True 100 True True 1 True True 0 Connect when I press Finish True True False True 0 True True False False 1 Set my profile when I connect True True False True 0 True True False False 2 6 True False 6 False True True 0 True False 12 end gtk-cancel True True True False True False False 0 gtk-go-back True False True True False True False False 1 gtk-go-forward True True True True False True False False 2 _Advanced True True False True image2 True False False 3 _Finish True True False True image3 True False False 4 False True 1 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/accounts_window.ui000066400000000000000000000111701326020644600272340ustar00rootroot00000000000000 True False vertical True False True False vertical True True never in 400 True True False OptionsBox True False none False True 0 True False False False True 1 main page0 False True 0 True False Accounts True :close True True True True False go-previous-symbolic True True True True False open-menu-symbolic 1 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/add_new_contact_window.ui000066400000000000000000000455351326020644600305450ustar00rootroot00000000000000 I would like to add you to my contact list. False 6 Add New Contact False dialog True False vertical 6 True False True 0 False False 0 True False 6 True False A_ccount: True 0 False False 0 True False liststore3 0 False False 1 True True 1 True False 6 True False _Protocol: True 0 False False 0 True False False False 1 True False True liststore2 0 True True 2 True True 2 True False 6 6 True False _User ID: True 0 0 0 True False _Nickname: True 0 0 1 True False _Group: True 0 0 2 True True True True Type User ID 1 0 True True True True Type Nickname 1 1 True False True True True Choose a group of type a new group 1 2 False True 3 A_llow this contact to view my status False True True False True True 0 True True False False 4 60 True True True 6 etched-in 5 True True word textbuffer1 True True 5 _Save subscription message False True True False True 0 True True True 6 True False True 6 True False You have to register with this transport to be able to add a contact from this protocol. Click on Register button to proceed. True 0 True True 0 _Register False True True True False center center True False False 1 True True 7 True False True You must be connected to the transport to be able to add a contact from this protocol. False False 8 True False 5 12 end gtk-cancel False True True True False True False False 0 gtk-add False True True True True False True False False 1 False False 9 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/adhoc_commands_window.ui000066400000000000000000000552431326020644600303650ustar00rootroot00000000000000 True False 6 Ad-hoc Commands - Gajim dialog True False vertical 6 400 400 True False False False True False vertical True False Please wait while retrieving command list... False False 0 True False 0.050000000745099998 False False 1 True False False True False 1 False True False vertical True False 0.20000000298023224 6 <b>Choose command to execute:</b> True False False 0 True True True False True False 12 vertical True True 1 True False Check once more True True False True False False end 1 False True 2 2 True False 2 False True False 3 False True False vertical True False Please wait while the command is being sent... True False False 0 True False 0.050000000745099998 Please wait... False False end 2 4 True False 4 False True False 5 False True False vertical True False This jabber entity does not expose any commands. False False 0 True False Check once more True True False True False False end 1 False False end 2 6 True False 6 False True False 7 False True False vertical True False <b>An error has occurred:</b> True False False 0 True False Error description... True False False 1 8 True False 8 False True False 9 False True True 0 True False 12 end gtk-goto-first True True True False True False False 0 gtk-go-back True True True False True False False 1 gtk-go-forward True True True False True False False 2 gtk-execute True True True False True False False 3 F_inish True True True True False False 4 gtk-close True True True False True False False 5 False True 1 advanced_configuration_window.ui000066400000000000000000000220401326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui True False gtk-dialog-warning False 6 Advanced Configuration Editor ace center-on-parent 650 540 dialog True False vertical 6 True False 12 True False Filter: False True 0 True True True True 1 False True 0 True True never in True True True True True 1 1 True False 3 0 none True False 12 0 True True False <b>Description</b> True False True 2 False False gtk-dialog-warning False True 0 False 0 <b>NOTE:</b> You should restart Gajim for some settings to take effect True True True True 1 False True 3 True False 6 end _Reset to default True False True True image1 True False True 0 gtk-close True True True False True False False 1 False True 4 True False gtk-undo gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/application_menu.ui000066400000000000000000000100021326020644600273460ustar00rootroot00000000000000 Accounts View
Show Roster win.show-roster <Primary>R Show Offline Contacts win.show-offline <Primary>O Show Active Contacts win.show-active <Primary>Y Show Transports win.show-transports
File Transfer app.file-transfer <Primary>T History app.history
Help
Contents app.content FAQ app.faq Keyboard Shortcuts app.shortcuts Features app.features About app.about
Accounts app.accounts <Primary><Shift>A Start Chat app.start-chat <Primary>N Bookmarks app.bookmarks <Primary>B History Manager app.history-manager Plugins app.plugins Preferences app.preferences <Primary>P Quit app.quit <Primary>Q
archiving_313_preferences_item.ui000066400000000000000000000136141326020644600317130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui Always Never False 12 False True dialog False vertical 20 False end gtk-close True True True True True True True 0 gtk-ok True True True True True True True 1 False False 0 True False 5 5 True False Jabber ID: 0 0 0 True False Preference: 0 0 1 194 True True 1 0 True False start dialog_pref_liststore 0 1 1 False True 1 archiving_313_preferences_window.ui000066400000000000000000000216011326020644600322570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui True False gtk-add Always Roster Never True False gtk-remove False 12 center 450 True False 5 10 150 True True True True in True True archive_items_liststore Jabber ID True True 0 0 Preference True True 1 1 0 1 2 True False start 5 start True True True add_image False True 0 True True True True remove_image True True 1 True 0 2 True False start 5 True False Default: 0 0 0 True False start False default_pref_liststore 0 1 0 0 0 gtk-save True True True end True True 1 2 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/atom_entry_window.ui000066400000000000000000000226741326020644600276110ustar00rootroot00000000000000 True False New entry received True False 6 vertical 6 True False You have received new entry: False False 0 True False False True 1 True False 6 6 True False True False True 0 Old stories True 1 0 True False True False True 0 Soliloquy True 1 2 True False 0 Feed name: right 0 0 True False True 0 <small>Romeo and Juliet</small> True 1 1 True False 0 Entry: 0 2 True False 0 Last modified: 0 3 True False True 0 2003-12-13T18:30:02Z 1 3 False True 2 True False False True 3 True False gtk-close True True False True False False 0 Next entry True True False True False False end 2 False True 4 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/blocked_contacts_window.ui000066400000000000000000000061221326020644600307170ustar00rootroot00000000000000 True False gtk-remove True False Blocked Contacts dialog True False 5 vertical 250 300 True True 3 never in True True False True False True 0 _Unblock True True False 3 image1 True False False 1 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/change_activity_dialog.ui000066400000000000000000000375311326020644600305170ustar00rootroot00000000000000 False 6 Set Activity 270 dialog True False vertical 6 True False end gtk-cancel True True True False True False False 0 gtk-ok True True True True False True False False 1 False False end 0 Set an activity True True False 0.5 True False False 2 True False True True False vertical True False gtk-missing-image 1 False True False vertical 1 True False gtk-missing-image 1 1 False True False vertical 2 True False gtk-missing-image 1 2 False True False vertical 3 True False gtk-missing-image 1 3 False True False vertical 4 True False gtk-missing-image 1 4 False True False vertical 5 True False gtk-missing-image 1 5 False True False vertical 6 True False gtk-missing-image 1 6 False True False vertical 7 True False gtk-missing-image 1 7 False True False vertical 8 True False gtk-missing-image 1 8 False True False vertical 9 True False gtk-missing-image 1 9 False True False vertical 10 True False gtk-missing-image 1 10 False False True 3 True False True False <b>Message:</b> True False False 0 True False True False True 1 False False 4 cancel_button ok_button gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/change_mood_dialog.ui000066400000000000000000000306611326020644600276160ustar00rootroot00000000000000 False 6 270 dialog True False vertical 6 True False end gtk-cancel True True True False True False False 0 gtk-ok True True True True False True False False 1 False False end 0 True False True 6 6 True False <b>Mood:</b> True 0 1 True False <b>Message:</b> True 0 2 True False 0 None 1 1 True True True 1 2 True False True True True False none 0.5 False True False gtk-cancel 1 0 0 0 0 2 False True 0 cancel_button ok_button gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/change_password_dialog.ui000066400000000000000000000156711326020644600305260ustar00rootroot00000000000000 False 6 Change Password dialog True False vertical 6 True False end gtk-cancel True True True False True False False 0 gtk-ok True True True False True False False 1 False False end 0 True False 6 12 True False gtk-dialog-question 6 False True 0 True False vertical 6 True False 0 Enter new password: True False False 0 True True False False False 1 True False 0 Enter it again for confirmation: False False 2 True True False True False False 3 True True 1 False True 2 cancelbutton2 okbutton2 change_status_message_dialog.ui000066400000000000000000000416011326020644600316240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui False 6 270 330 dialog True False vertical 6 True False end gtk-cancel False True True True False True False True 0 gtk-ok False True True True True False True False True 1 False True end 0 True False 0 none True False 6 vertical 6 True True in True True word True True 0 True False end False True False True True False True False 2 True False gtk-save-as False False 0 True False Save as Preset... True False False 1 False False 0 False True 1 True False 6 6 True False 0 Preset messages: 0 0 True False 0 Activity: 0 1 True False 0 Mood: 0 2 True False True 1 0 False True True True True False 6 True False gtk-missing-image False True 0 True False 0 True True True 1 1 1 False True True True True False 6 True False gtk-missing-image False True 0 True False 0 True True True 1 1 2 False True 2 True False <b>Type your new status message</b> True True True 2 cancel_button ok_button gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/chat_context_menu.ui000066400000000000000000000056211326020644600275410ustar00rootroot00000000000000 False True False _Copy Link Location True True False _Open Link in Browser True True False _Copy JID/Email Address True True False _Open Email Composer True True False True False _Start Chat True True False Join _Group Chat True True False _Add to Roster... True gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/chat_control.ui000066400000000000000000001351241326020644600265130ustar00rootroot00000000000000 110 1 10 10 110 1 10 10 False False True mouse menu True True False False True False True True True none True False <b>1</b> True 0 0 0 True True True none 0 True False <b>2</b> abc True 1 0 True True True none 0 True False <b>3</b> def True 2 0 True True True none 0 True False <b>4</b> ghi True 0 1 True True True none 0 True False <b>5</b> jkl True 1 1 True True True none 0 True False <b>6</b> mno True 2 1 True True True none True False <b>7</b> pqrs True 0 2 True True True none 0 True False <b>8</b> tuv True 1 2 True True True none 0 True False <b>9</b> wxyz True 2 2 True True True none True False <b>*</b> True 0 3 True True True none True False <b>0</b> True 1 3 True True True none True False <b>#</b> True 2 3 True False bold True False Bold italic True False Italic underline True False Underline strike True False Strike True False True False Color True False Font True False True False Clear formatting True 7 7 5 7 1 True True True False vertical False True 0 True False False True 1 60 True in False True True 2 True False False True 3 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False True True end 0 False True True False vertical False True 0 True True False True True none vertical adjustment1 audio-volume-muted audio-volume-high audio-volume-low audio-volume-medium False False False False False True 1 True True False True True none vertical adjustment2 audio-mic-volume-muted audio-mic-volume-high audio-mic-volume-medium audio-mic-volume-low False False False False False True 2 # True True True none True True 3 False True end 1 True True True none True False open-menu-symbolic False True end 2 True False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True none True False gtk-dialog-authentication 1 False False end 3 True True True Choose an encryption none False True end 4 True True False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK none True False mail-attachment-symbolic 1 False False end 5 True True True Show a list of emoticons (Alt+M) none True False face-smile-symbolic False True 6 True True False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True none formattings_menu True False format-text-bold-symbolic 1 False True 7 False False 4 False True False True 6 False True 160 120 True False True False False True 0 True False vertical True False 320 240 True False True True 0 True True 1 True True True True 0 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/chat_to_muc_window.ui000066400000000000000000000222641326020644600277100ustar00rootroot00000000000000 True False gtk-jump-to True False 5 Invite Friends! dialog True False vertical 6 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK You are now entering a groupchat. Select the contacts you want to invite center False False 4 0 True True in 300 True True guests_store False column 0 column 1 True True 4 1 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical True False Please select a MUC server. center True False False 4 0 True False False True 1 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK MUC server False True 2 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 end gtk-cancel True True False True False False 3 0 In_vite True True False image1 True False False 3 1 False True 3 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/choose_gpg_key_dialog.ui000066400000000000000000000115561326020644600303420ustar00rootroot00000000000000 False 6 550 300 dialog True False vertical 6 True False end gtk-cancel True True True False True False False 0 gtk-ok True True True True False True False False 1 False False end 0 True False 6 vertical 6 True False 0 False False 0 True True in True True True True 1 True True 2 button26 button27 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/contact_context_menu.ui000066400000000000000000000255541326020644600302640ustar00rootroot00000000000000 False True False Start _Chat True True False Send Single _Message... True True False Send _File... True True False In_vite to True True False Invite _Contacts True True False True False Send Cus_tom Status True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False E_xecute Command... True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK M_anage Contact True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False _Rename... True False Edit _Groups... True False Assign Open_PGP Key... True False True Add Special _Notification... True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False _Subscription True False True False _Allow contact to see my status True True False A_sk to see contact status True True False _Forbid contact to see my status True True False _Unblock True True False _Block True False True _Unignore True False True _Ignore True False _Add to Roster... True False Remo_ve True True False False _Information True False _History True gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/data_form_window.ui000066400000000000000000000475001326020644600273570ustar00rootroot00000000000000 True False True False 3 vertical 3 True False Fill in the form. False False 0 True False False False True True True True False queue none True True False False True False 1 False True False True True in True True False True 0 True False vertical gtk-add True True True True False False 0 gtk-remove True True True True False False 1 True False False False 3 2 gtk-edit True True True True False False 3 True False False True 3 4 gtk-go-up True True True True False False 5 gtk-go-down True True True True False False 6 True False False True 3 7 gtk-clear True True True True False False 8 False True 1 2 True False 2 False True False 3 False False True 1 False 6 Room Configuration 650 450 dialog True False vertical 6 True True etched-in True False True False vertical True False 5 vertical 5 True False True 0 False False 5 0 True False False True 5 1 False True 0 True False False True 5 1 True False 5 vertical 5 False True 2 True True 0 True False 6 end gtk-cancel True True True False True False False 0 gtk-ok True True True False True False False 1 False True 1 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/dubbleinput_dialog.ui000066400000000000000000000151571326020644600276730ustar00rootroot00000000000000 False 6 dialog True False vertical 6 True False end gtk-cancel False True True True False True False False 0 gtk-ok False True True True True False True False False 1 False True end 0 True False 6 vertical 6 True False 12 True False gtk-dialog-question 6 False True 0 True False True True True 1 False True 0 True True True False False 1 True False False False 2 True True False False 3 False True 1 cancelbutton okbutton gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/edit_groups_dialog.ui000066400000000000000000000136641326020644600277030ustar00rootroot00000000000000 False 6 Edit Groups True 290 dialog True False vertical 6 True False end gtk-close False True True True False True False False 0 False True end 0 True False False True 2 True False True False True 3 True False 6 True True True True True 0 gtk-add False True True True True False True False False 1 False False 4 True True in True True False True True 5 close_button gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/esession_info_window.ui000066400000000000000000000163741326020644600302730ustar00rootroot00000000000000 False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 center-on-parent dialog True False vertical 2 True False end False True True False True False 2 True False gtk-apply False False 0 True False _Verify True False False 1 False False 0 gtk-close False True True False True False False 1 False True end 0 True False 32 32 True False False True 0 True False 0 True True 1 False True 1 True False 4 True False (<b>ESession</b> info) True True False False 10 0 False False 2 verify_now_button close_button3 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/exception_dialog.ui000066400000000000000000000143461326020644600273530ustar00rootroot00000000000000 False center dialog True False 12 12 12 12 vertical 6 True False 20 20 True False center gtk-dialog-error 6 0 0 True False start center True A programming error has been detected. It probably is not fatal, but should be reported to the developers nonetheless. True 60 3 1 0 150 True True True in True True True True False 4 4 False 0 1 2 True True 0 True False 6 end gtk-close True True True True True True True 0 Report Bug True True True True True 1 False True end 1 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/features_window.ui000066400000000000000000000141651326020644600272420ustar00rootroot00000000000000 False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 Features 300 530 dialog True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 6 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>List of possible features in Gajim:</b> True 0 False False 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK out True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True 1 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK end gtk-close True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 0 False True end 2 True False 3 0 none True False 12 True True 0 True False <b>Description</b> True False True 3 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/filetransfers.ui000066400000000000000000000316121326020644600267000ustar00rootroot00000000000000 False False _Remove True False True Con_tinue True False _Pause True False _Cancel True True False False _Open Containing Folder True True False gtk-clear True False media-playback-pause True False gtk-cancel True False gtk-close False 12 File Transfers dialog True False vertical 6 460 150 True True in True True False file transfers list A list of active, completed and stopped file transfers True True 0 True False 6 end Clean _up True False True True False Removes completed, cancelled and failed file transfers from the list image1 True Remove file transfer from the list. This action removes single file transfer from the list. If the transfer is active, it is first stopped and then removed False False 0 _Pause True False True True False image2 True False False 1 _Cancel True False True True False Cancels the selected file transfer and removes incomplete files image3 True Cancel file transfer Cancels the selected file transfer False False 2 _Close True True True True False Hides the window image4 True False False 3 False True end 1 _Notify me when a file transfer is complete True True False True 0.5 True When a file transfer is complete show a popup notification False False 2 File Transfers Shows a list of file transfers between you and others gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/gajim_themes_window.ui000066400000000000000000000670001326020644600300540ustar00rootroot00000000000000 Account row Group row Contact row Chat Banner False 12 Gajim Themes Customization False center-on-parent dialog True False vertical 12 True False 6 12 True False vertical 6 True True in True True False True True 0 True False 6 center gtk-add True True True False True False False 0 gtk-remove True True True False True False False 1 False True 1 False True 0 True False vertical 6 True False liststore1 0 False True 0 True False 6 6 Text _color: True True False True 0 True 0 0 _Background: True True False True 0 True 0 1 Text _font: True True False True 0 True 0 2 True False Font style: True 0 0 3 True False True False 2 0 True False True False 2 1 15 True False True False Sans 12 False 1 2 2 True True False Bold True False gtk-bold 1 3 True True False Italic True False gtk-italic 2 3 False True 1 12 True False False True 2 False True 1 True False False True 2 True False 6 6 True False 0 5 2 True False Inactive 0 0 1 True False Composing 0 0 2 True False Paused 0 0 3 True False Gone 0 0 4 True False MUC Messages 0 0 6 True False MUC Directed Messages 0 0 7 True True False 1 7 True True False 1 6 True True False 1 4 True True False 1 3 True True False 1 2 True True False 1 1 True False 5 <b>Chatstate Tab Colors</b> True 0 0 2 False True 3 False True 0 True False 6 end gtk-close True True True False True False False 0 False True 1 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/gc_control_popup_menu.ui000066400000000000000000000124541326020644600304340ustar00rootroot00000000000000 False False True Change _Nickname... True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _Manage Room True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False True Change _Subject... True False Configure _Room... True True False True False _Destroy Room True True False _Minimize on close True True False Notify on all messages False True True False _Request Voice True False True False True _Bookmark True False True False True _History True False _Disconnect True gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/gc_occupants_menu.ui000066400000000000000000000166541326020644600275360ustar00rootroot00000000000000 False True False _Send Private Message True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Send _File True True False Occupant Actions True False True False _Voice True True False Mo_derator True True False True False _Member True True False _Admin True True False _Owner True True False True False _Kick True True False _Ban True True False In_vite to True True False True False _Add to Roster True True False _Execute command True True False _Block True True False _Unblock True True False True False _Information True True False _History True gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/groupchat_control.ui000066400000000000000000000536711326020644600275760ustar00rootroot00000000000000 True False bold True False Bold italic True False Italic underline True False Underline strike True False Strike True False True False Color True False Font True False True False Clear formatting True True 7 7 5 7 vertical 5 True True 495 True 0 True False 4 vertical False True 0 True False False True 1 200 60 True True in False True True 2 True False False True 3 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True True none True False open-menu-symbolic False True end 0 True False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True none True False gtk-dialog-authentication 1 False False end 1 True True True Choose an encryption none False True end 2 True True False True none True False mail-attachment-symbolic False False end 3 True True True Show a list of emoticons (Alt+M) none True False face-smile-symbolic False True 4 True True False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True none formattings_menu True False format-text-bold-symbolic 1 False True 5 True False True True True 7 False False 4 True False 100 True True True 4 5 never in True True 1 False False False True True 1 True True 0 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/groups_post_window.ui000066400000000000000000000136061326020644600300070ustar00rootroot00000000000000 True False Create new post dialog True False 6 vertical 4 True False 6 6 True False 0 From: 0 0 True False 0 Subject: 0 1 True True True 1 0 True True True 1 1 False True 0 True True in True True textbuffer1 False True 1 True False gtk-cancel True True False True False False 0 gtk-go-forward True True False True False False 2 False True 2 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/history_manager.ui000066400000000000000000000354711326020644600272330ustar00rootroot00000000000000 False True False _Export True True False _Delete True False dialog save True False vertical 24 True False end gtk-cancel True True True False True False False 0 gtk-save True True True True False True False False 1 False False end 0 cancel_button save_button True False gtk-find False 6 Gajim History Logs Manager 650 500 True False vertical 6 True True 200 True True in True True True False True True False vertical 300 True False 20 20 vertical 10 True False center <big><b>Welcome to Gajim History Logs Manager</b></big> True False True 0 True False start This log manager is not intended for log viewing. If you are looking for such functionality, use the history window instead. Use this program to delete or export logs. You can select logs from the left and/or search database from below. True False True 1 True False start <b>WARNING:</b> If you plan to do massive deletions, please make sure Gajim is not running. Generally avoid deletions with contacts you currently chat with. True True False True 2 False True 0 True True in True True True False True True 1 True True in True True True True True 2 True True True True 0 True False 6 True True True True True 0 _Search Database True True True True False image1 True bottom False False 1 False True 1 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/history_window.ui000066400000000000000000000452751326020644600271330ustar00rootroot00000000000000 False Conversation History center 650 450 False True False 12 vertical 6 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 6 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 True Enter name / JID of contact or groupchat True True 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Search: False False 1 True False True True False True 2 _In date search True False False Only searching within selected day True True False False 3 False True 0 True True vertical True True 5 165 True False 5 vertical 6 True True False True 0 True False center 5 expand True True True True False go-first-symbolic True True 0 True True True True False go-previous-symbolic True True 1 True True True True False go-next-symbolic True True 2 True True True True False go-last-symbolic True True 3 False True 2 False False True True etched-in True False False True True True in True True True True True True True 1 True True 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _Log conversation history True True False True True True False False 0 _Show status changes True True False True True True False False 1 False True 1 True False 6 end gtk-close True True True False True False False 0 False False 2 httpupload_progress_dialog.ui000066400000000000000000000042241326020644600314000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui True False vertical True False 8 4 8 8 True False False True 0 True False 4 4 8 8 True False 0.10000000149 True False True 1 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/input_dialog.ui000066400000000000000000000134521326020644600265110ustar00rootroot00000000000000 False 12 dialog True False vertical 6 True False end gtk-cancel False True True True False True False False 0 gtk-ok False True True True True False True False False 1 False True end 0 True False end vertical 12 True False 12 True False gtk-dialog-question 6 False True 0 True False True True True 1 False True 0 True True True False False 1 False True 1 cancelbutton okbutton gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/input_text_dialog.ui000066400000000000000000000142341326020644600275540ustar00rootroot00000000000000 False 6 400 dialog True False vertical 6 True False end gtk-cancel False True True True False True False False 0 gtk-ok False True True True True False True False False 1 False True end 0 True False 6 vertical 6 True False 12 True False gtk-dialog-question 6 False True 0 True False True True True 1 False True 0 True True never in True True word True True 1 False True 1 cancelbutton okbutton gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/join_groupchat_window.ui000066400000000000000000000312361326020644600304350ustar00rootroot00000000000000 True False 18 18 18 18 6 12 False True center 12 0 0 3 True True Bookmark this Groupchat start center 6 True 1 7 2 True True Join this Groupchat everytime Gajim is started start center True 1 8 2 True False start center 6 Bookmark 0 7 True False start center Autojoin 0 8 False True center 1 1 2 True True center 1 3 2 False True start Account 0 1 True False start Nickname 0 3 False True start Password 0 6 True True password 1 6 2 False True 18 6 end gtk-cancel True True True True True True 0 Join True True True True True True 1 1 9 2 False True start Server 0 5 False True start Room 0 4 False True start Recently 0 2 True True 1 4 2 False True 1 2 2 False True True True False 1 5 True True True Search the rooms on this server True False system-search-symbolic 2 5 True False Join Groupchat gtk-cancel True True True True Join True True True end 1 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/manage_bookmarks_window.ui000066400000000000000000000450041326020644600307200ustar00rootroot00000000000000 False 12 Manage Bookmarks 550 300 dialog True False vertical 12 True False 12 True False vertical 6 True True in True True False True True 0 True False 6 start gtk-add True True True False True False False 0 gtk-remove True True True False True False False 1 False True 1 True True 0 True False 6 6 True False _Title: True 0 0 0 True False _Nickname: True 0 0 1 True False Roo_m: True 0 0 2 True False _Server: True 0 0 3 True False _Password: True 0 0 4 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK A_uto join True False True False If checked, Gajim will join this group chat on startup True 0 True False True 0 Minimi_ze on Auto Join True False True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True 0 True False True 1 0 5 2 True False Pr_int status: True 0 0 6 True False True 1 0 True False True 1 1 True False True 1 2 True False True 1 3 True False True False 1 4 True False False liststore1 0 1 6 False True 1 True True 0 True False 12 end gtk-cancel True True True False True False False 0 gtk-ok True True True False True False False 1 False True 1 manage_pep_services_window.ui000066400000000000000000000124611326020644600313410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui True False gtk-preferences False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK PEP Service Configuration 350 150 dialog True False vertical True True in True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True 0 True False 6 end gtk-delete True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 0 _Configure True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK image1 True False False 1 gtk-close True True True False True False False 3 False True 6 1 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/manage_proxies_window.ui000066400000000000000000000564511326020644600304310ustar00rootroot00000000000000 HTTP Connect SOCKS5 BOSH False 12 Manage Proxy Profiles False center-on-parent dialog True False vertical 12 True False 12 True False 6 vertical 6 True True in True True False True True 0 True False 6 center gtk-add True True True False True False False 0 gtk-remove True True True False True False False 1 False True 1 False True 0 True False vertical True False 0 none True False 12 6 6 6 True False start _Name: True 0 0 0 True False _Type: True 0 0 1 True True 1 0 True False liststore1 0 1 1 True False <b>Properties</b> True False True 0 True False 0 none True False 12 6 6 6 True False _BOSH URL: True 0 0 0 True True 1 0 True False Proxy _Host: True 0 0 2 Use HTTP prox_y True True False True 0 True 0 1 2 True False Proxy _Port: True 0 0 3 Use proxy auth_entication True True False True 0 True 0 4 2 True False _Username: True 0 0 5 True False Pass_word: True 0 0 6 True True 1 2 True True 1 3 True True 1 5 True True False 1 6 True False <b>Settings</b> True False True 1 False True 1 False True 0 True False 6 12 end gtk-close True True True False True False False 0 False True 1 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/manage_sounds_window.ui000066400000000000000000000135061326020644600302450ustar00rootroot00000000000000 400 370 False 12 Manage sounds center-on-parent dialog True False vertical 6 True True in True True True True 0 True False 6 True True False True 0 ... True True False True False False 1 True True False True False gtk-media-play False False 2 False True 1 True False 6 end gtk-close True True True True False False 0 False True end 2 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/message_window.ui000066400000000000000000000065211326020644600270450ustar00rootroot00000000000000 True False False True False 4 True False gtk-missing-image False False 0 70 True False True end True 0 False False 1 False True True True none True False gtk-close 1 False False 2 MessageWindow False 480 440 False True True True gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/passphrase_dialog.ui000066400000000000000000000126121326020644600275200ustar00rootroot00000000000000 False 12 Passphrase dialog True False vertical 6 True False end gtk-cancel True True True False True False False 0 gtk-ok True True True True False True False False 1 False False end 1 True False 6 vertical 6 True False True False False 5 0 True True True False True False False 1 True True False True 0.5 True False False 2 False True 0 cancel_button ok_button gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/plugins_window.ui000066400000000000000000000504061326020644600271030ustar00rootroot00000000000000 True False gtk-apply True False gtk-cancel True False gtk-preferences 650 500 False 6 Plugins 650 500 dialog True False vertical 6 True True True True 250 150 True False 6 vertical 6 True True never True True True True 0 Install from zip True True True start image1 False False 1 False False True False 6 vertical 6 True False &lt;empty&gt; True 0 False True 0 True False 6 True False Version: False True 0 True False <empty> True 0 True True 1 False True 1 True False 6 True False Authors: 0 False True 0 True False <empty> word-char True end 0 0 True True 1 False True 2 True False True False Homepage: False True 0 True True False True none 0 True True 1 False True 3 True False vertical True False True False Description: False True 0 False True 0 True True in True True 1 True True 4 True False 5 end Uninstall True True True image2 False False 1 Configure True True True image3 False False 2 False True 5 True False True False Installed False True True 0 True False 15 end gtk-close True True True True False False 0 False True 1 Plug-in decription should be displayed here. This text will be erased during PluginsWindow initialization. popup_notification_window.ui000066400000000000000000000134021326020644600312470ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui 312 95 False 1 popup False True True False south-east PopupNotificationEventBox True False True False 4 6 68 86 True False False False 0 True False vertical True False 196 True False Event Type True True False True 0 True False False none True False gtk-close 1 False False 1 False True 0 218 64 True False Event desc True False True 1 False True 1 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/preferences_window.ui000066400000000000000000005114371326020644600277310ustar00rootroot00000000000000 1 1440 20 1 10 1 720 12 1 10 True False gtk-revert-to-saved True False gtk-open Use default applications Custom All chat states Composing only Disabled All chat states Composing only Disabled Never Only when pending events Always Pop it up Notify me about it Show only in roster Detached roster with detached chats Detached roster with single chat Single window for everything Detached roster with chat grouped by account Detached roster with chat grouped by type Always Never Last state None False 6 Preferences preferences dialog True False vertical 6 True True False True False 12 vertical 12 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 6 vertical 6 Display a_vatars of contacts in roster True True False If checked, Gajim will display avatars of contacts in roster window and in group chats True 0 True False False 0 Display status _messages of contacts in roster True True False If checked, Gajim will display status messages of contacts under the contact name, in roster window and in group chats True 0 True False False 1 Display e_xtra information of contacts in roster (mood, activity, ...) True True False If checked, Gajim will display the mood of contacts in the roster window True 0 True False False 2 True False 6 True False Sort contacts by status False True 0 in _roster True True False True 0 True False True 1 in _group chats True True False True 0 True True True 2 True True 3 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Roster Appearance</b> True False True 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True False 12 6 6 6 True False If not disabled, Gajim will replace ascii smilies like ':)' with equivalent animated or static graphical emoticons True False 1 _Emoticons: True 0 0 0 True False 1 _Window behavior: True 0 0 1 True False 1 _Show roster on startup: True 0 0 2 _Ignore rich content in incoming messages True True False Some messages may include rich content (formatting, colors etc). If checked, Gajim will just display the raw message text. True 0 True 0 3 2 _Highlight misspelled words True False If checked, Gajim will highlight spelling errors in input fields of chat windows. If no language is explicitly set via right click on the input field, the default language will be used for this contact or group chat. True 0 True 0 4 2 Notify by icon when your messages are received True True False 0 True 0 5 2 50 True False liststore7 0 1 2 50 True False liststore6 0 1 1 Show avatar in chat tabs True True False 0 True 0 6 2 True False 1 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Chat Appearance</b> True False True 1 True False General False True False 12 vertical 6 True False 0 none True False 12 6 vertical 6 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK When new event is received: 0 False True 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK liststore5 0 True True 1 False True 0 Notify me about contacts that sign _in True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True 0 True False False 1 Notify me about contacts that sign _out True True False Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed out True 0 True False False 2 Allow popup/notifications when I'm _away/na/busy/invisible True True False True 0 True False False 3 Allow popup/notifications when a chat window is opened True True False True 0 True False False 4 True False 6 True False Show notification area icon: False True 0 True False liststore4 0 True True 1 False True 5 True False <b>Visual Notifications</b> True False True 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True False 12 6 vertical 6 True False 6 Play _sounds True True False True 0 True False True 0 Ma_nage... True True True True False True 1 False True 0 Allow sound when I'm _busy True True False True 0 True False True 1 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Sounds</b> True False True 1 1 True False True Notifications 1 False True False 12 vertical 12 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 0 none True False 12 6 6 6 True False Gajim can send and receive meta-information related to a conversation you may have with a contact. Here you can specify which chatstates you want to display in chat windows. True False _Display chat state notifications: True 0 0 1 True False liststore2 0 1 0 True False liststore3 0 1 1 True False Gajim can send and receive meta-information related to a conversation you may have with a contact. Here you can specify which chatstates you want to send to the other party. True False _Send chat state notifications: True 0 0 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Chat state notifications</b> True False True 0 2 False True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Personal Events 2 False True False 12 vertical 12 True False True 0 none True False 12 6 6 6 _Away after: True True False If checked, Gajim will change status to Away when the computer is unused. True 0 True 0 0 _Not available after: True True False If checked, Gajim will change status to Not Available when the computer has not been used even longer True 0 True 0 1 True False minutes 0 2 0 True False minutes 0 2 1 True True The auto away status message. If empty, Gajim will not change the current status message $S will be replaced by previous status message $T will be replaced by auto-away timeout 3 0 True True The auto not available status message. If empty, Gajim will not change the current status message $S will be replaced by previous status message $T will be replaced by auto-not-available timeout 3 1 50 True True 12 adjustment2 1 12 1 0 50 True True 20 adjustment1 1 20 1 1 True False <b>Auto Status</b> True False False 0 True False 0 none True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 6 vertical 6 True False 6 True False Ask status message when I: False False 0 True False 14 Sign _in True True False True 0 True False False 0 Sign _out True True False True 0 True False False 1 False False 1 False False 0 True True If enabled, Gajim will not ask for a status message. The specified default message will be used instead. in True True default_message_liststore Status 1 Default Message True True 2 Enabled 3 True True 1 True False <b>Status Messages</b> True True True 1 True False 0 none True False 12 6 6 6 True True True True in True True status_message_liststore False 0 0 0 True True True never never in 21 True True 3 word 0 1 True False start False 5 start gtk-new True True True False True False False 0 gtk-delete True True True False True False False 1 1 0 True False <b>Preset Status Messages</b> True True True 2 3 True False Status 3 False True False 12 vertical 12 True False 0 none True False 12 6 6 6 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Chat message: start 0 0 0 True True False True Sans 12 1 0 Use system _default True True False True 0 True 1 1 True False <b>Font</b> True False True 0 True False GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True False 12 6 6 6 True False T_heme: True 0 0 0 True False Status _iconset: True 0 0 1 Use _transports icons True True False If checked, Gajim will use protocol-specific status icons. (e.g. A contact from ICQ will have the equivalent ICQ icon for status online, away, busy, etc...) True 0 True 1 2 2 True False True 1 0 True False True 1 1 Ma_nage... True True False Configure color and font of the interface True 2 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Themes</b> True False True 1 True False 0 none True False start 12 6 6 6 True False Contact's nickname: True center 0 0 0 True False Contact's message: 0 0 1 True False _Status message: True center 0 0 2 True False Group chat highlight: True 0 0 3 True False True True False 0 True False False 0 True True True 0 rgb(0,0,0) False False end 1 1 1 True False True True True 0 rgb(0,0,0) False True end 0 1 2 True False True True True 0 rgb(0,0,0) False True end 1 1 0 True False True True True 0 rgb(0,0,0) False True end 1 1 3 True False Your nickname: True center 0 2 0 True False Your message: 0 2 1 True False _URL highlight: True 0 2 2 True False True True True 0 rgb(0,0,0) False True end 1 3 0 True False True True False 0 True False False 0 True True True 0 rgb(0,0,0) False False end 1 3 1 True False True True True 0 rgb(0,0,0) False True end 1 3 2 True False True False True False 0 _Reset to Default Colors True True False False image1 True False False 1 0 4 4 True False <b>Chat Line Colors</b> True False True 2 4 True False Style 4 False True False 12 vertical 12 True False 0 1 none True False 12 6 6 6 True False Audio input device 0 0 0 True False Audio output device 0 0 1 True False 1 0 True False 1 1 True False <b>Audio</b> True False True 0 True False 0 0 none True False 12 6 6 6 True False Video input device 0 0 0 True False Video output device 0 0 1 True False Video framerate 0 0 2 True False Video size 0 0 3 View own video source True True False 0 True 0 4 2 True False 1 0 True False 1 1 True False 1 2 True False 1 3 True False <b>Video</b> True False True 1 True False 0 0 none True False 12 6 6 6 True False STUN server: 0 0 0 True True False 0 True 1 0 True True STUN server hostname. If none given, Gajim will try to discover one from server. 2 0 True False <i>(example: stun.iptel.org)</i> True 3 0 True False <b>Connection</b> True False True 2 5 False True False Audio / Video 5 False True False 12 vertical 12 True False 0 none True False 12 6 vertical 6 True False liststore1 0 False True 0 False 0 none True False 12 6 6 6 True False _Mail client: True 0 0 1 True False _Browser: True 0 0 0 True False _File manager: True 0 0 2 True True 1 0 True True 1 1 True True 1 2 True False <b>Custom</b> True False True 1 True False <b>Applications</b> True False True 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 none True False 12 6 6 6 _Ignore events from contacts not in the roster True True False If checked, Gajim will ignore incoming events from unauthorized contacts. Use with caution, because it blocks all messages from any contact that is not in the roster True 0 True 0 0 3 Allow client / _OS information to be sent True True False If checked, Gajim will allow others to detect the operation system you are using True 0 True 0 1 3 Allow local system time information to be sent True True False If checked, Gajim will allow others to detect the time on your system True 0 True 0 2 3 Log _encrypted chat session True True False If checked, Gajim will keep logs for encrypted messages. Please note that when using End-to-End encryption the remote party has to agree on logging, else the messages will not be logged. True 0 True 0 3 3 Allow my _idle time to be sent True True False True 0 True 0 4 3 True False Global proxy: 0.01 0 0 5 True False liststore8 0 1 5 _Manage... True True True True 2 5 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Privacy</b> True False True 1 True False 0 none True False 12 6 vertical 6 _Log status changes of contacts True True False True 0 True False True 0 True False <b>Miscellaneous</b> True False True 2 True False 0 none _Open... True True False start 12 6 image2 True True False <b>Advanced Configuration Editor</b> True False True 3 6 True False Advanced 6 False True True 0 True False 15 end gtk-close True True True False True False False 0 False True 1 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/privacy_list_window.ui000066400000000000000000001047541326020644600301400ustar00rootroot00000000000000 100 1 1 10 none both from to True False 6 Privacy List dialog True False vertical True False vertical True True False <i>Privacy List</i> True False False 0 Active for this session True True False True 0.5 True False False 1 Active on each startup True True False True 0.5 True False False 2 False True 0 True False False False 5 1 True False <b>List of rules</b> True False False 5 2 True False liststore3 0 False True 5 3 True False True gtk-add True True False 5 True False False 0 gtk-remove True True False 5 True False False 1 gtk-edit True True False 6 True False False 2 False True 4 False True 5 vertical True False False True 5 0 True False <b>Add / Edit a rule</b> True False False 5 1 True False True False vertical True Allow True True False True 0.5 True False False 0 Deny True True False True 0.5 True edit_allow_radiobutton False False 1 False True 0 True False vertical True True False 5 JabberID True True False True 0.5 True False False 5 0 True True False True 5 1 False True 0 True False 5 all in the group True True False True 0.5 True edit_type_jabberid_radiobutton False False 5 0 True False liststore2 0 False True 5 1 False True 1 True False 5 all by subscription True True False True 0.5 True edit_type_jabberid_radiobutton False False 5 0 True False liststore1 0 False True 5 1 False True 2 True False 10 All True True False True 0.5 True edit_type_jabberid_radiobutton False False 0 False False 3 False True 1 True False vertical True to send me messages True True False True 0.5 True False False 0 to send me queries True True False True 0.5 True False False 1 to view my status True True False True 0.5 True False False 2 to send me status True True False True 0.5 True False False 3 All (including subscription) True True False 0.5 True False True 4 False True 2 False True 2 True False True True False True False Order: False False 5 0 True True adjustment1 1 False True 1 False True 0 gtk-save True True False 5 True False False 1 False True 3 False True 5 True False False True 6 True False 6 end gtk-close True True True False True False False 0 False True 7 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/privacy_lists_window.ui000066400000000000000000000211241326020644600303100ustar00rootroot00000000000000 True False 12 window1 dialog True False vertical 6 True False 12 True False Privacy Lists: 0 False False 0 True False liststore1 0 False True 1 False True 0 True False vertical 6 True False spread gtk-delete True True False 5 True False False 0 gtk-edit True True False 5 True False False 1 False False 0 True False True True False True 0 gtk-new True True False 5 True False False 1 False False 1 False True 1 True False end gtk-close True True False 5 True False False 0 False True 2 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/profile_window.ui000066400000000000000000001546461326020644600270750ustar00rootroot00000000000000 False Personal Information dialog True False vertical True False 6 True False 6 6 6 True False 0 0 <b>Name:</b> True 0 0 True True 1 0 True False 1 0 <b>Nickname:</b> True 2 0 True True 3 0 True True True False 6 6 6 True False 1 0 <b>Family:</b> True 0 0 True True 1 0 True False 1 0 <b>Given:</b> True 2 0 True True 3 0 True False 1 0 <b>Middle:</b> True 0 1 True False 1 0 <b>Prefix:</b> True 0 2 True True 1 1 True True 1 2 True False 1 0 <b>Suffix:</b> True 2 2 True True 3 2 True False 0 0 <b>Full Name</b> True 0 1 4 True True True False 6 6 6 True False 1 0 <b>Street:</b> True 0 0 True True 1 0 True False 1 0 <b>Extra Address:</b> True 2 0 True True 3 0 True False 1 0 <b>City:</b> True 0 1 True True 1 1 True False 1 0 <b>Postal Code:</b> True 2 1 True True 3 1 True False 1 0 <b>State:</b> True 0 2 True True 1 2 True False 1 0 <b>Country:</b> True 2 2 True True 3 2 True False 0 0 <b>Address</b> True 0 2 4 True False 1 0 <b>Homepage:</b> True 0 3 True True 1 3 3 True False 1 <b>E-Mail:</b> True 0 4 True True 1 4 3 True False 1 0 <b>Phone No.:</b> True 0 5 True True 1 5 True True 3 5 True False 1 0 <b>Avatar:</b> True 0 6 True False True False 0 0 True False False True False 0 gtk-missing-image False False 0 Click to set your avatar True True False True True 0 0 False False 1 1 6 True False Format: YYYY-MM-DD False True False 1 0 <b>Birthday:</b> True 2 5 True False 0 0 Personal Info False True False 6 6 6 True False 1 0 <b>Company:</b> True 0 0 True True 1 0 True False 1 0 <b>Department:</b> True 2 0 True True 3 0 True False 1 0 <b>Position:</b> True 0 1 True True 1 1 True False 1 0 <b>Role:</b> True 2 1 True True 3 1 True True True False 5 6 6 True False 1 0 <b>Street:</b> True 0 0 True True 1 0 True False 1 0 <b>Extra Address:</b> True 2 0 True True 3 0 True False 1 0 <b>City:</b> True 0 1 True True 1 1 True False 1 0 <b>Postal Code:</b> True 2 1 True True 3 1 True False 1 0 <b>State:</b> True 0 2 True True 1 2 True False 1 0 <b>Country:</b> True 2 2 True True 3 2 True False 1 0 <b>Address</b> True 0 2 4 True False 1 0 <b>E-Mail:</b> True 0 3 True True 1 3 3 True False 1 0 <b>Phone No.:</b> True 0 4 True True 1 4 1 True False 0 0 Work 1 False True True 6 in 70 True True word 2 True False 0 0 About 2 False False True 0 True False 6 True False 0.10000000149 False False 0 True False 12 end gtk-cancel True True True False True False False 0 gtk-ok True True True False True False False 1 False True 1 False True 1 True False False False 2 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/progress_dialog.ui000066400000000000000000000060101326020644600272060ustar00rootroot00000000000000 False dialog True False vertical 6 True False end gtk-close True False True True False True False False 0 False False end 0 True False True False False 2 True False 0.10000000149 False False 3 close_button gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/remove_account_window.ui000066400000000000000000000172431326020644600304350ustar00rootroot00000000000000 True False gtk-delete False 6 dialog True False 3 vertical 6 True False 6 True False gtk-dialog-question 6 False False 0 True False 0 none True False 12 6 vertical 6 Remove account _only from Gajim True True False True 0 True True False False 0 Remove account from Gajim and from _server True True False True 0 True remove_only_radiobutton False False 1 True False <b>What do you want to do?</b> True False False 1 False False 0 True False 6 12 end gtk-cancel True True True False True False False 0 _Remove True True True False image1 True False False 1 False False 1 roster_item_exchange_window.ui000066400000000000000000000155751326020644600315510ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui False Roster Item Exchange dialog True False 6 vertical 8 True False <b>someone@somewhere.com</b> would like you to <b>add</b> some contacts in your roster. True center True False True 4 0 True True True True False center False textbuffer1 False True 1 True True True True True False True 2 True False 12 end gtk-cancel True True True True False False 0 True True True True False 3 True False 1 gtk-ok False True 0 True False 0 _OK True False True 1 False False 1 False True 3 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/roster_window.ui000066400000000000000000000216321326020644600267370ustar00rootroot00000000000000 online online online True chat chat chat True away away away True xa xa xa True dnd dnd dnd True invisible invisible invisible True SEPARATOR None None True Change Status Message… gajim-kbd_input status False SEPARATOR None None True offline offline offline True RosterWindow 85 200 False Gajim roster 250 400 True False vertical True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical True True False edit-clear False True 0 True True never True True True False True True True 1 True False status_liststore 3 1 5 end 3 0 False True 2 False True True True 1 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/search_window.ui000066400000000000000000000162661326020644600266750ustar00rootroot00000000000000 True False gtk-add True False gtk-find True False gtk-dialog-info False 12 Search dialog True False vertical 6 True False vertical True False Please wait while retrieving search form... False False 0 True False 0.10000000149 False False 1 False True 0 True False 6 end _Add contact False True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True image1 True False False 0 _Information False True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True image3 True False False 1 _Search True True True False image2 True False False 2 gtk-close True True True False True False False 3 False True 1 service_discovery_window.ui000066400000000000000000000250071326020644600310710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui True False gtk-jump-to False 6 Service Discovery 550 420 dialog True False vertical 6 False False 0 True False 6 True False _Address: True False True 0 True False center True True True True True 1 G_o True True True True False image1 True False True 2 False True 1 True True etched-in True True False True True 2 True False 12 True False True 0.10000000149 False False 0 True False True True 1 True False 6 gtk-close True True True True False True False False end 0 False True 2 False True 2 3 service_registration_window.ui000066400000000000000000000077441326020644600316040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui True False gtk-apply True False gtk-cancel False 6 Register to dialog True False vertical 6 True False 6 6 False True 0 True False 12 end _Cancel True True True False image2 True False False 0 _OK True True True True False image1 True False False 1 False True 1 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/shortcuts_window.ui000066400000000000000000000311611326020644600274550ustar00rootroot00000000000000 1 chat Chat Shortcuts 1 Message composition 1 Return Send the message 1 <shift>Return <ctrl>Return Create a new line 1 <alt>m Select an emoticon 1 Tab Complete a command or a nick 1 <ctrl>Up Previous sent message 1 <ctrl>Down Next sent messages 1 <ctrl><alt>Up Quote previous message 1 <ctrl><alt>Down Quote next message 1 <ctrl>u Clear message entry 1 Appearance 1 <alt>c Toggle full / compact view 1 Recent history 1 <shift>Page_Up Scroll up 1 <shift>Page_Down Scroll down 1 <ctrl>l Clear 1 Tabs 1 <alt>Left <ctrl>Page_Up Switch to the previous tab 1 <alt>Right <ctrl>Page_Down Switch to the next tab 1 <Alt>1...9 Switch to the first - ninth tab 1 <ctrl><shift>Tab Switch to the previous unread tab 1 <ctrl>Tab Switch to the next unread tab 1 Escape <ctrl>w <ctrl>F4 Close chat 1 roster Roster Shortcuts 1 General 1 <ctrl><shift>a Accounts 1 <ctrl>p Preferences 1 <ctrl>t File transfers 1 <ctrl>n Start a new chat 1 <ctrl>j Join a group chat 1 <ctrl>s Set the status message 1 <ctrl>q Quit Gajim 1 Appearance 1 <ctrl>o Show offline contacts 1 <ctrl>y Show only active contacts 1 <ctrl>k Enable roster filtering 1 Contacts 1 <ctrl>i Contact information 1 F2 Rename contact 1 Delete Delete contact gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/single_message_window.ui000066400000000000000000000305451326020644600304110ustar00rootroot00000000000000 True False gtk-ok True False gtk-ok True False gtk-jump-to False 6 550 280 True False vertical 6 True False 3 3 True False True 0 From: 0 0 True False True 0 To: 0 1 True False Subject: 0 2 True True True True 1 0 2 True True True True 1 1 2 True True True 1 2 True False 0 2 2 False True 0 True True True in True True 1 True True True in True True word True True 2 True False 12 end gtk-close True True True False True True False False 0 gtk-cancel True True True False True True False False 1 Sen_d True True True False True Send message image3 True False False 2 _Reply True True True False True Reply to this message image1 True False False 3 _Send & Close True True True False True Send message and close window image2 True False False 4 False True 6 3 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/start_chat_dialog.ui000066400000000000000000000042461326020644600275070ustar00rootroot00000000000000 True False 18 vertical 6 True True True True edit-find-symbolic False False False True 0 True True never in True False StartChatListBox True False browse False True True 1 subscription_request_window.ui000066400000000000000000000151771326020644600316450ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui True False True False _Start Chat True True False _Information True True False 18 18 18 18 vertical 5 True False False False 0 100 True True 5 in True True False word False True True 1 True False 5 12 end _Close True True True False True False False 0 _Deny True True True False Deny authorization from contact so he or she cannot know when you're connected True False False 1 True True True subscription_request_popup_menu False True False applications-system-symbolic True True 2 Au_thorize True True True False Authorize contact so he or she can know when you're connected True False False 3 False False 2 synchronise_select_account_dialog.ui000066400000000000000000000111241326020644600327040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui False 12 Synchronise contacts 350 300 dialog True False vertical 6 True False end gtk-cancel True True True False True False False 0 gtk-ok True True True False True False False 1 False False end 0 True False Select the account with which you want to synchronise False False 2 150 True True in True True True True 3 cancel_button ok_button synchronise_select_contacts_dialog.ui000066400000000000000000000110251326020644600330660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui False 12 Synchronise : select contacts 400 300 dialog True False vertical 6 True False end gtk-cancel True True True False True False False 0 gtk-ok True True True False True False False 1 False False end 0 True False Select the contacts you want to synchronise False False 2 150 True True in True True True True 3 cancel_button ok_button gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/systray_context_menu.ui000066400000000000000000000076221326020644600303430ustar00rootroot00000000000000 False True False Sta_tus True True False _Start Chat... True True False Join _Group Chat True True False Send Single _Message... True True False True False Show All Pending _Events True True False Mute Sounds True True False True True False _Preferences True True False True False _Quit True gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/tooltip_gc_contact.ui000066400000000000000000000123201326020644600277020ustar00rootroot00000000000000 True False 5 True False start start 0 0 2 True False start start True word-char 40 0 1 2 True False start start Jabber ID: 0 3 True False gtk-missing-image 2 0 7 True False start start Resource: 0 4 True False start start 0 5 2 True False start start 0 2 2 True False start True 0 6 2 True False start True 1 4 True False start True 1 3 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/tooltip_roster_contact.ui000066400000000000000000000270721326020644600306410ustar00rootroot00000000000000 True False start 5 True False start start True 0 0 2 True False start start Jabber ID: 0 4 True False gtk-missing-image 2 0 13 True False start start Resource: 0 5 True False start start 0 1 2 True False start start True 1 5 True False start start True 1 4 True False start start Status: True 40 0 2 True False start start Idle since: 0 12 True False start start True 1 12 True False start start Mood: 0 6 True False start start Activity: 2 0 7 True False start start Tune: 0 8 True False start start Location: 0 9 True False start start True 1 6 True False start True 1 7 True False start start True 1 8 True False start start True 1 9 True False start start OpenPGP: 0 10 True False start start True 1 10 True False start start Subscription: 0 11 True False start start True 1 11 True False start start True True 30 1 2 vcard_information_window.ui000066400000000000000000002272611326020644600310540ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui False 12 Contact Information False dialog True False vertical 12 True True start True False False 0 True False True False 0.97999999999999998 start 12 12 8 8 6 6 True False end start <b>Jabber ID:</b> True 0 0 True False end start <b>Resource:</b> True 0 1 True False end start <b>Status:</b> True 0 2 True False end start <b>Client:</b> True 0 3 True False end start <b>System:</b> True 0 4 True False end start <b>Contact time:</b> True 0 5 True False start start 5 True True 1 0 True False True False True False start start 5 True True 1 1 True False start start 5 True True 1 3 True False start start 5 True True True 1 4 True False start start 5 True True 1 5 False True start <b>User avatar:</b> True 2 0 False True <b>Configured avatar:</b> True 2 0 False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True start start gtk-missing-image 2 1 7 True False end start <b>Ask:</b> True 0 7 True False end start <b>Subscription:</b> True 0 6 True False start start 5 True word-char True 20 30 1 2 True False start start 5 True 1 6 True False start start 5 True 1 7 True False start False False True start start gtk-missing-image 2 1 7 True False Contact False True False start 12 12 8 8 6 6 6 True False <b>Name:</b> True start 1 0 0 True False True 5 True 0 1 0 True False <b>Nickname:</b> True 1 2 0 True False True 5 True 0 3 0 True True start start True False start 25 12 3 3 6 6 True False <b>Street:</b> True 1 0 0 True False <b>City:</b> True 1 0 1 True False <b>State:</b> True 1 0 2 True False True 5 True 0 1 0 True False True 5 True 0 1 1 True False True 5 True 0 1 2 True False <b>Extra Address:</b> True 1 2 0 True False <b>Postal Code:</b> True 1 2 1 True False <b>Country:</b> True 1 2 2 True False True 5 True 0 3 0 True False True 5 True 0 3 1 True False True 5 True 0 3 2 True False <b>Address</b> True 0 0 0 2 4 True False <b>Homepage:</b> True 1 0 3 True False <b>E-Mail:</b> True 1 0 4 True False <b>Phone No.:</b> True 1 0 5 True False True 5 True 0 1 5 True False True 5 True 0 3 5 True False Format: YYYY-MM-DD False True False <b>Birthday:</b> True 1 2 5 True True start start True False start 25 12 3 3 6 6 True False <b>Family:</b> True 1 0 0 True False <b>Middle:</b> True 1 0 1 True False <b>Prefix:</b> True 1 0 2 True False True 5 True 0 1 0 True False True 5 True 0 1 1 3 True False True 5 True 0 1 2 True False <b>Given:</b> True 1 2 0 True False <b>Suffix:</b> True 1 2 2 True False True 5 True 0 3 0 True False True 5 True 0 3 2 True False <b>Full Name</b> True 0 0 0 1 4 button True True True start none 0 1 3 3 button True True True none 0 1 4 3 1 True False Personal Info 1 False True False start 12 12 8 8 6 6 6 True False <b>Company:</b> True 1 0 0 True False start True 5 True end 0 1 0 True False True <b>Department:</b> True 1 2 0 True False True 5 True end 0 3 0 True False <b>Position:</b> True 1 0 1 True False 5 True end 0 1 1 True False <b>Role:</b> True 1 2 1 True False 5 True end 0 3 1 True True start start True False start 21 12 6 6 True False <b>Street:</b> True 1 0 0 True False <b>City:</b> True 1 0 1 True False <b>State:</b> True 1 0 2 True False <b>Extra Address:</b> True True 1 2 0 True False <b>Postal Code:</b> True 1 2 1 True False <b>Country:</b> True 1 2 2 True False start True 5 True 0 1 0 True False True 5 True 0 1 1 True False True 5 True 0 1 2 True False True 5 True 0 3 2 True False True 5 True 0 3 1 True False True 5 True 0 3 0 True False <b>Address</b> True 0 0 0 2 4 True False <b>E-Mail:</b> True 1 0 3 True False <b>Phone No.:</b> True 1 0 0 4 True False 5 True 0 0 1 4 3 button True True True start none 0 1 3 3 2 True False Work 2 False True True 6 in 70 True True False word False 3 True False About 3 False True True 6 in 70 True True word 4 True False Comments 4 False False True 1 True False True False 0.10000000149 False False 0 True False end gtk-close True True True False True False False 0 False True end 1 False True 2 voip_call_received_dialog.ui000066400000000000000000000045501326020644600311100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 False center-on-parent dialog True question yes-no <b><big>Incoming call</big></b> True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 2 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK end False False end 0 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/xml_console_window.ui000066400000000000000000000135001326020644600277360ustar00rootroot00000000000000 True False vertical True True True vertical 400 True True in True True False False True False 150 True True in True True False False False True 0 actionbar True False False True end 1 True False XML Console False True True True start center True False start True False none True True True False Message True True True False Presence True True True False Iq True True True Presets popover gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui/zeroconf_context_menu.ui000066400000000000000000000024011326020644600304400ustar00rootroot00000000000000 False True False _Status True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False _Modify Account... True zeroconf_information_window.ui000066400000000000000000000463061326020644600316010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/gui False 12 Contact Information False dialog True False vertical 12 True True 0 True False False 0 True False True False 6 12 True False 6 6 True False 0 0 Local jid: 0 0 True False 0 0 Resource: 0 1 True False 0 0 Status: 0 2 _Log conversation history True True False True 0 True True 0 3 2 True False True 0 0 5 5 True 1 0 True False False True False True 0 0 5 5 True 1 1 True False True False True 0 0 5 5 True 1 2 False True 0 True False vertical True False False True False 0 False False 0 False True 1 True False 0 0 Contact False True False 6 6 6 True False 0 0 First Name: 0 0 True False 0 0 Last Name: 0 1 True False 0 0 Jabber ID: 0 2 True False 0 0 E-Mail: 0 3 True False True 0 0 5 5 True 1 0 True False True 0 0 5 5 True 1 1 True False True 0 0 5 5 True 1 2 True False True 0 0 5 5 True True 1 3 1 True False Personal 1 False False True 1 True False end gtk-close True True True False True False False 0 False True 2 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/000077500000000000000000000000001326020644600240165ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/000077500000000000000000000000001326020644600254555ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/128x128/000077500000000000000000000000001326020644600264125ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/128x128/apps/000077500000000000000000000000001326020644600273555ustar00rootroot00000000000000org.gajim.Gajim.png000066400000000000000000000255461326020644600327230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/128x128/appsPNG  IHDR>asBIT|d pHYs^tEXtSoftwarewww.inkscape.org< IDATxyW}?Ջ6۲%Yca1 2&rIr2I&ɐ$9$'d90ќĖ$l `l,[^/-jU^zz{oݪWuRxE[xIV^"\^"\Œ=&-&`߯3 rpvD:{v+x5p/v W/8٭ S}n:c&0f?ZkqY ?]ǀ?-]&!_#`=@V^6WDMn( C583cɝ?qtA=՝?[?${CTǩ}B!4FkI&J%CRn kwHy ""Jgw DsT' :߬D>@x^i0:ts=?F3<_3;^i]Lvp>f P9 (eT *q~>/  2tOQJtz#(©|t]9>Rh~AZTv24m_w"WVx}z>H?5#G(EKnEK\ZH!uoaF3בYW(d8/7ix+wVzv.u΄uX{a-g'zeSbdfg V+yu!b{{_@-EW=VB.}$ #d: AKnETABq͏{iavXo7|?òeOρDvDJQµU)H@y!\@C哀Ƈ7U7?!nT  ?òeM=U4 ؅"R 0p&zN4c-~.jh*6Ag+E[ޏR =,;YF詍La @e{@ɛ̫}:v[lVD*Lbѳj&ތ,J-P;0 SyVYTF`lZ qNh59ts$Lϴd9`+7.Nua0|̍ΜB8s·U8F*l \zWmmz$˙^ɬVR( o^CWJ<bLsU$fzE3-'Y@wVݫ"~ 0p)Wi3mz$˞Fb" A@k|\y9p4fkwc򶉋;b$KXMl@.J3||o_!(O[c>b_?LiV3 /PZDp+}w=ND"1Z?HB-Ъ!6D4T@\J7=rkJgs R!n*B *8Su4t[k@kH֬!EKęC,=T盞i9'1ϑ}м.`;D 4N@OoH"E-PwF#齈TxI,@=`!л#⃏qH !4O oLnh;hc T 4sp),_ lrxRx6Y!E`7σ8[Q1YQnP󛏵V 8BYmɽo,N5|$ cG]yLw|pZxhOal1/~9.1vlx6Y` eO<qͣ'xc=k_Ƣ٩ YMC34s=FA\z{e;dy,{!` ?qDja?lh7J6& HqD+=K:Ǝ> P _>pɟ,u/XhQQ?Wov>F\I]T8w#4C]Z\!_>."~>2VpKw6"4_i]$߃qj~/%(C_~xV9< *I"00_Kl$4s 9Uj{X?+٭ǁtgM ɮaw߮Uiޤ`H1J\L+k=VǞ*"xI2CN_Br`dWR/Rڷ]J Ըе(Njklp$ԏ߲\L@fo_ii̮wW8&{-(}:.eM]4pZo[piA(C1xAqԦiYunLP$A3c_ ePj> p?Z.Fv%Wv<26m窾kYٵUh}f_AԦ?`OGBDW!NO|s@l,qrtiʕ&:pKUf#˂#]{92J6|k;{_?p~|`,*J ,|=K!2khvHtu7b0skDb0'=u924ӹx {jbbdI 0+y=/]qf}% Š7Z靯T)&ǘL\m?{cܹl^kSg8:,c' {ѝ/Q[#އ~ x#~m_nn6JZp˭p'KOpT @/WNw^f^iq/Ya.rL8^ث*t'fa ߓ츖ՙͬSK!iS<}r/Sd7lѝʢ`dWeﭚ`$ؾnfVu^SE{'8YXykܲW)=M}(z p]}^ѱ/Q-WkֳzVw\GS{91v \@ѝ:x 7ޏNZJ^uٶNEL^DM=oS 2V8Ge)nڲ9frz~+q] J00t/vGاw z} C/CCC|u>ʁSS[/ |r5'/+Fv%_ |`mܱ^6`Ɖ1=p?a@`mSy?'GZv}!y⺂㺸"=D\ePg$I9$>'nbCO+`5N{)NOC7GwVq&J[*z`c6h<6竇h^U˿s թ-p4X'5Xq- ٮ#8N``: u=28j:8 6vsr9MCS?deZ6B_jk&{'R+ ٕ'FwVO,%%Ȯd~tWzwo{7}-(EO[Hu3S0S_? +~kM)Tm\%epE8W:mt+b=_Ń-Ws na} <{f/Ϟ|u cdW/1z-dٕ\+p{BOS7ۯy;g`5=,ވ6VHݸ6zN20ǼêNa;B75^?dA c\@"^ }#SCl]{'q|4#Y1KB]-;g/ґ#`cv KgtLˈ)v]JeOg3-׺@z0Wp5oڕ7(Vs?ٕѝ_\pȮ6ʑݯ :Y?g?Iߍ {؅~fXs cWᠣ',`@l CS>nko3&َP,Ut4>6@An%scm #[YϾYջ*}sS夼6" L&IRz/+RCk^ ~#9tl C$LLB#ٛbTc2_ 443& l|ׯ_[٘7ـRPMr9ED8{CZ;6rۦ{82'OTEF_]oZ-șZ"yj3_a ]CYnZCwgWvɗjT-b;444rv|O#l|6ozM\\ n>k^uݎti&};gpcnVh?Cc’jcv$Ӳ,׃~|[`QxMɳc∁)6 i^o0+s r4rCy8 fs=3iFCkz#!:+:xUD2 ѝ?)XY0Fv%|qÊocT*_cH G9 m")-#(>m*n3L wݙ"21:t98}u?Oa@6p*[t0:2(U|XE1YFv%ofӃ;/t/ėxDMA$P86eKb=o`p禾+vS!vZǡ'†Y3W/Pn/(}M:dٛE790x+D6\a}˩FwVAY87Smxqu;iU IUlɾ1ʜ?N@5W8Z& W1Sc+z^q gaT~iSK2u#kn$ap*OM^k(S)J4%g=Eٞ&obJەRQSK{u6I&@ٞl[QrEP9/3DwD8H~[ز6h1 T(eٙavkgev 7Յ )&hc[8?/Ĝ`[4Pd,DF^2F #/\8c\oӣ;;.` Ązn׽>=t{LЙґ!\R^o;J:Er(3c!JQa'58S*:}t=dF7Ҽ)o ؖE:MߵZID*G=H9XߵPLo.MO#Y}304q ǥTˑ/OL/OQNQ YOVC.jJ?v-p=fjl~'}8 ':VE>GAG2  ])%E_`tgi.%t 6DnF:_Ӄ-FkBo55= o!l.cv4bm`|tgc>,&gA΁ x u#ǩ|X!f%AH~RӧRNDz,,- gqq =p%%~, N GLm>ku}Rf%jq TE(EDJ49 ;1hIDT")#БȂ&Jy/ x ?>t]:1R̻<0 ˶ڥz,,9& НCD5wTM-XeVđhe[8ͤ9mv~3L@B0$P*dkc҈#H ~\woY@KUAXpi _Dݷ_.8_FBÇf'Ak*Ŕ%'c y! >b$B[%Eu=_Y-a}_ evr)_8 ]G]&0Cs-41>'8"F'PsyV,fJ=?  xg08[Ty71μO~}|C1$R ki,rf Ю Djz K&|BNR5}{h?,C9mxA@XdۉDNnZrK_??S%A P(*$ifX%9q6ydmRŁhJ}%!0xfi̬-V ;Qq-K>GzW/r[1h f b;)ȕ&< `62k<4@yq6Z فY(?"edq)[EѝY~,"Kg~4 0-$ V& z>T~Sb\ERO]qz,,L< cĪ%a#A'HOs8сhAK4HjiL-V&aX}Dk^\Cwn?W.݈( m5ҙhw +D2 59~*f,I3R`)d9 xMBm @; ౠ/:A ~#ȣ %k^𚂶P&:=("Q7@b8Ѧ 8[mzi0Ѫ)ad@R=΃|K.KNm3I\q$u`fQcU|@'[ʏtخTNl؂Ŗ%'/JRMϵ??$QgsU~ZQBVXCB̹ l@! a=j В% |Dvm7bI.oSF%ksu*h2O3x͚bOi4%kdPsb>=KoC-fqDj}BO4$FԒKE݇c߹õw1{oqcl"@ϛ:Oo #Oog([3S@GP F)!itS5pZ&Wd|$"5sRspL&b!DX_:W'fBOId53=ttIIo\޾Բ-5V˭∅Zخ+6cwqm?(+M3ѕh kJGSA '2DL:BV\-P( T5;%j|M Qޮy޳5Uz}$,,],,. _JD079| D\$AsG!6XEVX{׊Tc*6O;5|nY3_,+ .!5ˌڪܠ$Tf` o蚁M{]3të͚.Sv}mXX1DZ۵mǵZ,'2Prlv*ək8\ ., j/KejՍɍJ>@Z/DPDu/8\fc̒7_̇~n'N$ү=A-mW@%A_tgeEHAhہ9vr%4\$K$/E./E.=ǡ~,PIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/000077500000000000000000000000001326020644600262425ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/actions/000077500000000000000000000000001326020644600277025ustar00rootroot00000000000000gajim-cam_active.png000066400000000000000000000017341326020644600335160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/actionsPNG  IHDRasBIT|d pHYsͿ*tEXtSoftwarewww.inkscape.org<YIDAT8e]lSuƟ9"_cJakѩ+"p$5u@AMv J25}pD6lВTmipf {><%1PxhX[,>4rxZ*˗'gսd/ ~tEFEUPe$ `dsPxH;`4 J!B՞@DE|wJ!s=f/!kX\\σ&agF0?wtucЙV`28BpaNF(41j VVVt:pc'vn$ v\+$ bddҥ4 rYF۽Om:7b- F (CaukdBe )8vx5ElFXQ}Yg2M*B ֆvni=tVa?٬.䙺EQ##3γMMTk8{cc2q4BTIM;T>L]]2<|/`6p녧%VdZ,b6r{.1wfwwDJ)Xq }|JSsz:zC?N;u\.GNHEս': }~rC^bʶ s`x6g#s7o%I Z>IZ.clޯZM&qX__w˯G  kJ!dПLB$BȤTl1PJ'QPIENDB`gajim-cam_inactive.png000066400000000000000000000017031326020644600340410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/actionsPNG  IHDRasBIT|d pHYsͿ*tEXtSoftwarewww.inkscape.org<@IDAT8e_h[uϽKjҬi,VF]P ] RŁͪC٘8\P2IHdor|)|J)WDDZC/I iݎ s?|ͥd2CBZxR|VyΎnho;{/b/'%ciG!x8جwBv&,@)E,?yE(!m6FnGJ)T:Ǐd744ToW)0 C)u>r+q={H)!"zzccc߿3E1YLϾA*x6A{Ze{-#?zq$3g{W,r? NP(xuxk;@9:KKgXZ).:%A#I[1NJlLGG<O9L8OM4k$XkTTp 5NA=a\dJ`yʷ*M9Z#i4RjJYn$q=r>oie[c-1ZC+c'ܤvzGw֝;V]g c1x*&זes9r9vfɾՓ T/`a(|0nnةsRJq~ Jkh Pj?_nP xIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/status/000077500000000000000000000000001326020644600275655ustar00rootroot00000000000000aim-away.png000066400000000000000000000013641326020644600317250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME  (IDAT8KHTa?xF[c.8Xh"TΪ 5m,wV&DˈtD IYbN5}ac6X@nq!)9$BxlNgKYsRѸQG!£+ à C,Aeÿ h*tZq (-s݆pBdb3,_nM+ேEJ:&%;jUʭ<aJNee ZCcy ̻6Bfm0WLpơh i ۢB{N4$$13ǹd0gXhdQVc@$iG a+*m'RL/OwQ IHIAU@O;ժ_nw}[ TU l$) LX02eש:fvjpb5(iQlUU' iN1G7b)>r4GזBkk^&kEir7wyB)bS v݊@ '[2e}/&{{ lKM+پ?Ht-?~/Z:*p-'քi*: \\vx: aD+; UO:IENDB`aim-chat.png000066400000000000000000000015351326020644600317030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME  (IDAT8}KSqǿv69uY&%t;]]J(D?PFfMP aHW.2e4+p:즶o7)F>˗AX,?GeJ}A[FRD^@myPc< JL&}|y6w\A3ڝ4qJe_dYI"s_;y/؊ԔY R>WTSSH<HKK{(Ym{I{a^I>|\˦â>YRk:PJvuԜR t?l Y5m(|NG])uUOR",XL=4 ~{ u222%775~1;́Jyޔ"%L1' cP>q}KYZZ 2cЩYL|d%ܶ ̦$:5*iTNeU3`B1,KXA@}{k]>z^'.1rc8rqx 3pccSLrL6N^[nfjHFͭp-c<߰]N]x(eG]F-,HhF=v,h8?&HB0yCLԊ(?;&yIIK7%%LW-{Ww0vO7Vv_=;OFƃr'+`,bL唌K:?dF"3CEQ~u ,EIcq~vIENDB`aim-dnd.png000066400000000000000000000013651326020644600315320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME  JIDAT8MHqǿ5 3s ;z嬮v >d5sfpTVlxM-mfcvt!D 41/y5;&XPu@@UP ޷ۏQGժ++p:Ag0 VgB쪪*@j1h iu~aQ& bpx p$˔si頄ne의d_݃,FRTc=;69ق`HA$$vN7w?Μ4kuyvk$k%1llnSǾ,]˹EUj(XmhlFIk ߜx<|$:oG|/},Z}%%d2.WԸoy<yƒھvjn~@萧Ȍx>`\$*;~7 IENDB`aim-offline.png000066400000000000000000000014361326020644600324060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME  (IDAT8_HSaƟ;gs 'sQJ023 $ų]tQ즼 ˮ(*ɺ0+2 *(+rҲ9Ν}]D <<b,B466B򫕞IoqH8Ηth!y{ 5fY9k+c8`oL@(ڬ(#d) offf7o޲ o?@ 0R)(io;#9]>T"!HAR!DR !C Kuvc: ÀC*r&{}z׭`l߶CZ,XW s9pCui=洼Oea}vj7H 3w8}(QvBj ?~h<}X+t_XXZLݍ ++xlԨpn۽dl Ȳd:,[ZZ-.W9I%_ͩ 5GTWWjwﬨ7zȲleuuuzA,2<5\0[v[zs<G8F,b5$IGNqPj䛔N%wY\qW2Fck{{_n\EWBLrP6B+A6W:6T`|IENDB`aim-online.png000066400000000000000000000013651326020644600322510ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME  (IDAT8[HSqǿ}% I(PTD>[hFQ B42E^1Si̲ >~bri"rp(&JWW/HriTzJ͞Rjpz.@VYUMy>oR|0)>Ԕʪ6-lb Z"A64 sXP .'L6xk=G ϥ5߿^l̶h?U}kYGK\a4n~`oQQ)St7* 1d$ʨnhA/I-SNOqHr 1"a(wMF +:ƸT3am`dOr:JZ% qzDQ9r` xq}9OH T 7 |(@8_t^^ˣpy"2&33G޿axs<0a"y94IENDB`applications-internet.png000066400000000000000000000021041326020644600345250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< tEXtTitleGajimW )tEXtAuthorJosef VybíralxtEXtCreation Time28.10.2006H/+tEXtSourcehttp://cornelius.gimp.cz'Z:IDAT8mMLu?33 t,/m(V`$\=a5ċxjh^h4$V٤/1 R؅-m]fٝx&4w~~ 8|ɫT0.4:ITWL!?ԻOOZ؄5xY#O"d}'OA6[/}T^!?~б_vmMhKv7C%E"s7j?.RÅt.k:6p㉏13ƞWAbuEݱn sY/;! _9 Y+7߼j EH6 V0q~l]3vy LMMXpS7& 4!!<{h׋@RvT N!a&QN}$(BIMʕu⦍)Ü!)e<^laF_W$YYC9ك':S-ѨÖq,pUoZcMjҠXb᮷<-R3rkEn[OuW nƉmn/ܩӲ͗K?xGGVZ+vm|*s["W{R?^8{պE:n4*2Hsf+ڇW"qitI􈔝7XYc~ƻp]chDJqYyV)'bT?Ӆtnp_%^IENDB`audio-mic-volume-high.png000066400000000000000000000014741326020644600343130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasRGBbKGD pHYs  tIME 7ͫIDAT8ˍKHTpr1$F>*sAEJV֢( f2i+٢SRhBH#Z$-̘l3j^aRǙ))sY? ͉e+iis8/k.88kVeoa (;9vvr N^D" ((×A.fʸp.8*p6B00ƅztttP__O|͔]޸jMO,\/..vedd044ngz_}ffgBoi;՜GCpuvvRUUEZZ===z~T4l2t)*pO0"n7@)--%*/cb=PfA>`7jWWL__?D)uu)l6Orr2 ?Ud SYz%FUeUcDQ$ %b21ID:q4yPW_h`lZ#4Ŋ)ͽ G}+Ȟ6LU횛fD%df u$=蕚ـ7=ԔTGU {tIR]l0O-k?i[5J &hK3 FY.p4^L * \->IENDB`audio-mic-volume-low.png000066400000000000000000000013021326020644600341630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasRGBbKGD pHYs  tIME 0iIBIDAT8˥OHq?iЙ`&s. cRڨ*m]BJofA/:̵uЄ'8mk[Pv0ECs=?8f h7$ab߯uwt~MLNhjjKKKZsTxݚHRi$͒f@1@Q$axxP(DQQ!:)Ñ;(X/mձNUUFR$IB>{jrnvv򲚛LŸ0D"&HgxM\|t:s{-nA@gN^RV`0B c|G@\/vdll χ,b1:;;x \^뛢p( DD8F# %Μ-CW(FGCĦ]Z QQU\.G4ecs4,ۼ Zb`٨>_*ӟ~p̛.I~gʀG)_Q^Ar97мwuoAtr9yab^u{ʒHIENDB`audio-mic-volume-medium.png000066400000000000000000000013771326020644600346560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasRGBbKGD pHYs  tIME  ,IDAT8˥MHq?ތRJ`'Ț3Ii50i;"vQTxS +!H!|; aanWEDO> Ynm\f@8p84֦7PE("} *lv냣555)2*-F!H$B$ajjss46<h5k?]qt퇨¡e?j```~IIѡjHKOಣ;]ɤ{brss ΟEa˯ͭ7ӽYqľ N$^FXY]n6BIH VIB f3P(DAATTTV, ^rBTI Q[[^L__N1!"ɪxLU-L&^/@ n7*-NLtZP]I a j^!2F|1VVkȈCIw>uqM_>]:[ޮ龳~C6 d'TbDLտY/O٭zSN5/ޣ~A&v2.PIENDB`audio-mic-volume-muted.png000066400000000000000000000013701326020644600345050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasRGBbKGD pHYs  tIME )}xIDAT8˥OHq?{7}H-%pd;zM0͏_+z>(tֆdv365"BQnq])oߌ#IxM|>*WHb!J$BG xbzfffgbbiv;w?/bN02,D $H Wx%p8XYYh4244DKk R*iYtRrS^N"v;t:m hF4O8SSN|57c0AURX,TWWSv5^/kr[DBUFAnh'[Gǩ,*< ?^YҴ vƊ/s!R)H&I)F0ßuK$jա&zk K4]Go w>IENDB`channel-secure-croped-symbolic.symbolic.png000066400000000000000000000003661326020644600400260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDR v 9sBIT|dsRGBgAMA a pHYs+{IDAT(Sŏ [.πOVD(b◔qR :Pke$S=c)~#sι*)%h&QtÆRekm?u{aFƷ+wI1IENDB`dcraven-away.png000066400000000000000000000016651326020644600326050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<tEXtAuthorJosef VybíralxtEXtCreation Time28.10.2006H/+tEXtSourcehttp://cornelius.gimp.cz'ZIDAT8}oeL;3hRmH :MHh0H" ML\XcHOW0R$6&څ i#ȥ R-3Υ{ SS8$ROq`3(8n;O?VΰriKjch\=ɼ7W<ζm6-#a^Ax 1 t#&Gx+܌} ;Zars%ow\wrQ#c4% }3~18p!4q +Daq6e<- " A+duI}a–ݢAl{2;֮ۛSqlR|O+s?ϏlB?0uhBy[C+W{IENDB`dcraven-chat.png000066400000000000000000000017241326020644600325570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<tEXtAuthorJosef VybíralxtEXtCreation Time28.10.2006H/+tEXtSourcehttp://cornelius.gimp.cz'ZIDAT8MlTe޹)2FhiJ)iR&.4ԭ&D n4]")OҤ 5Hh;h 32 ~q@,߼9'<5AG n8y ɵwՙxB'Ư$+M˭+ =5FxpZ-85C{‘exEYm]/qZ+{BIJ@*xv*4ݫՂ(*QEn/9?I:+,~qom̏ ugx=6dnizq_OSj15S}8p-ض֚TjA7>V gwBѷ5ϫ/FCCɓ+O.$Gx@r{^tuEnHc yD]Ꟍd4͙Dwgdgt*~t&ܤjٰʔ.ҺƖ#GzhNSc3/2_9b/;::c Bi&PN>ebrtn^vNLD"Q\yRr0Zu,/8)n,~MSJ.mL.ѾbǕch}.DUR8v]Mz{cFC4!$633_7ƭP}ڣ(\>o<߽(k}}6s.*"a@)2l̿RS^HNIENDB`dcraven-closed.png000066400000000000000000000003411326020644600331030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<^IDAT8c`$BÃ#W\U->W._Ͱrj.`!d38.(Vp^ `x!<2$\.E :DIENDB`dcraven-connecting.png000066400000000000000000000020741326020644600337660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<tEXtAuthorJosef VybíralxtEXtCreation Time28.10.2006H/+tEXtSourcehttp://cornelius.gimp.cz'ZIIDAT8]Mh\U{/&iFm$6?H%-*.ʅ(""" "v)Rܤ5`FI[#M&qf2t̼uguŁOJiWZw`PRR9=ԉK=kDȧ>tV[ -.w _B¼89V70>.{Ez؛"VuB4ϵ7BG*6',ԭMp:&RJV7\kؖ~`ۮ<_oJ7"SDtCY+~R#7<ӮffovZ]RǏ1RX\J l]0 Z +YʒYj]RQk:@%ECHPJ&0栥uОIX\߬$R^:1)o ^{ign !MҠtcgC6SwFAa~I_ t"UfW\>Y: 4n+{gR04RxB;Oܟ?,fCIENDB`dcraven-dnd.png000066400000000000000000000017171326020644600324070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<tEXtAuthorJosef VybíralxtEXtCreation Time28.10.2006H/+tEXtSourcehttp://cornelius.gimp.cz'ZIDAT8Ou?}&ec@u# QGds2ㅙQ/]ѿ&&zŹew&[4&fc) *# 6Pm߯*l'97'O ,CSph[7a$Ϫ k*<]{Rgg_'Xiz򍭍`UGj*]}hN#1dD|WDDWt7hOlmAѫ,US3(h'6+4̔drI= ĔVbJT Y鎪lIJs^ DDx!#]Ja-3=F0=qb.]/=r4`X< s$ѓ03xD'1 vS?[32&#o[bnn <"N8c.W=HHn\*)w6XK/|-'8'howL ZcI/E囚ȯxT꫍}yA5*8U}F}\ ؈.Q_sAQ7 g㏼3qCbnZK换1G:1 ^Eao3SU!B-P[K>TUjTn8:-$"Pth#ӴQ1D.84]͎EIENDB`dcraven-error.png000066400000000000000000000017071326020644600327720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<tEXtAuthorJosef VybíralxtEXtCreation Time28.10.2006H/+tEXtSourcehttp://cornelius.gimp.cz'ZIDAT8]HQΕB, > Me}.R. &HEmEdYA*F969B\Ap^kp5"[[ʓ-\5|)˘RXT=zȟ<BG<+VTjdԍ_PU>_)K)(@DHN'Pree`YlR ,k13lJ\ޥ&gװTƝ/T|"/,\Ukv^@Y!(pMXggfmu7ƂoA߱Fwee%OSx5)[Ԍ/8{x%<, # ɾ'ieؾ{>B]ɘכ[7aP2x@Ov "7?-JK- f)f(]ӧqP  X< EZ Cv5 h6%xJ5J.```f{L{+,_^tq"O=ggw;b]8v`YuNQ`u/<qz=`zq`p Ή()ʒ~ Ƙsie4k7,UEDPU1 _i43W Dv:YbY6ժOȲUD"R.yx/_ RlJYN(Vx\k|F`*QRXYacôz$I>A[K0 w>V0:n `{(Nc;q>)kIENDB`dcraven-invisible.png000066400000000000000000000017511326020644600336240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<tEXtAuthorJosef VybíralxtEXtCreation Time28.10.2006H/+tEXtSourcehttp://cornelius.gimp.cz'ZIDAT8KhSiIrMv*X5^Gq,,2;ѥJ]хWP\("( 5E-hZMӻmiNrYmo}< <̳k2'p9@  ;<W3׷mxwn΍W|{^܄o:/M?zچѿ >rNwz*m6 _Z`¯%vϻ-k 38q驛Ml2,γIx:dSIl+8viͥڴABx:ek%i7w=;;"_3"g2_ju{vDfPe9M-Z>{m=ng0>tYה/MJ]tsݱ'htk@Gjʆs kS>\]$>FGh-7}Γ{#瞔8rbr #ZteJJN 8jw7*yaQ ]vl(lշAV_Q&x_]g B#,zjP~qxҪt{?}'U+1TV&ɞGc3̄>)N990irZ~,C!RqrL9_Z8` 0d~rL DcRu^9`)IA\d\UƘ*Ld@ f5FEOsעz ipTsmu,&~蛛9" ` )B9fžrmIENDB`dcraven-muc-active.png000066400000000000000000000011601326020644600336670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<tEXtAuthorJakub Steiner/IDAT8kSA򾠄`.D\ K,Z"ɢ"";n sHCRZ!`I2s]4$/EA\wΙs #dX,>X{2 b뉈1fjt: @ؓ"bO"JW(k"nR96ǹ3 cy@Eҥ'N1pj뭗<[ȸtD1cjc3Hn͇R&I϶YN ^Eu5sa1~(|^EQ41H/zh4nl73/=3էkׯ,V*M >`L6MrGk8/[ְ401Zkm9tg_ J]-IENDB`dcraven-muc-inactive.png000066400000000000000000000010741326020644600342220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<tEXtAuthorJakub Steiner/IDAT8S11= ڵt:Awb;KA?A,.NE(UԤ߽]^~>:8pOν!?B V]93{ kf"u蜋=33En[v YZk}BIBv:sdRJJ%T*]hHk !\.O BւR'3Hzu#,mH arj E޷⍛̚uǎ#h~ US1<2t:q y:b1hҜhâ 4>vy7 d2wtZ+ٝf!5 ˶@\lKZ$>PUGa"S0B/j &3Ӫ,@h0C eUeehԳ3|`YV`sFBNY}+*))4 `u173\}wř%SI\I'p Cr"DoeR-U)uIENDB`dcraven-offline.png000066400000000000000000000017021326020644600332560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<tEXtAuthorJosef VybíralxtEXtCreation Time28.10.2006H/+tEXtSourcehttp://cornelius.gimp.cz'ZIDAT8RKog=7!0j#!X*PȂ-[H,ق`nV @^2M)PPNI 8|Q Hwq9W:ȏBFgbgfhRG?Ԋʼn?v'IEg蕆뇇egaF|w_|R-cXe[r񐩝jeYh4`FZLq|#RJ4z ڋm;_lCOx~ DZpu 3O-[j]rāf)~Ǭ~X n(&yRk[;NLLH6͋tzǖh|h2z ŪSS&`@ӌ޽KRwim޴EZ.yGQ)0J$K  gOSbޝg RC2J۲!"y}1aT*dz&t]Ht*ݿsܫ`f!@=J)D#1U'LfG.@_x5/4MB bMױPhw\*D@0"AevMPL&/PAe:\ fd2MT ,m¶zlzu6gGo'sc7ǿ$╊XMju<8Ivk-CkIENDB`dcraven-online.png000066400000000000000000000016661326020644600331310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<tEXtAuthorJosef VybíralxtEXtCreation Time28.10.2006H/+tEXtSourcehttp://cornelius.gimp.cz'ZIDAT8oTu?7:7mB:DT҅%!&ƅqeaG $Ƥ&@ ?tZ-t:N͛y.Or67{s5p+2'OQqs[o]K`R_(Qo|+~Ͷzg >$>,rp̫i>kts3)V!IU~:@QQcM4,  ޣmnĉ/Uc1il4` R~ ^<@$5$7>nfnk[*4D%)wr~r5:zE3-̶FjWy='_mO\).v{wc,Fw8W8L:swRdNhĩK'ogЇ2,xi`o667 &B9qcÖ0"^%{[:v޺=[: xPU5wrF1V`Յ((A3[GZt56o r|\a"G/(_+T(5zw&Q`hӈ5i?'ccOued}"|J"k6=MT{sb+tj{YK2}IENDB`dcraven-opened.png000066400000000000000000000002731326020644600331100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<8IDAT8c`BÃӰzZ=,Z氈 1&|M`0_:IENDB`dcraven-requested.png000066400000000000000000000017501326020644600336400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<tEXtAuthorJosef VybíralxtEXtCreation Time28.10.2006H/+tEXtSourcehttp://cornelius.gimp.cz'ZIDAT8_he;lE(S7u\ͥY:B`HEQTÛ݄yF$$.Vt]Tٲ)cm3|ݍ&x]78`h7wbnUkлgL/L _& gh3/4xtۮO25B9k>֒O Pښn܆ utOa !W$͢2Zz%_W{Y|ltJ : f ~S_~/I2{vtsaz$l @{'$״(ޏPo}%c }{{R- dnJߙQ:ښq 39J61ԣO^lVjzfWg6FM&c;qeG$]X!5t61vuw^* zɤoK|õ ]1?22s1&~?Ծ}V=|e{5ʷl%ȢE|= :t.P傊oRU(q]H)L֢. m0Г3JVTɎ'~Jk|c#q@ y!ѾR̯``` RZߪV]RWAG#p/6uũUG hbqJG*iqTFhGAtV^q_{LKaa\+{_jP/4PHE4")DZ= AL "CH-= Ơ9CnM8I˨K(NNK8o_Ë;Ac682oF?  K|-/l[s?slFl.}ZO2?OmP߻aC<*\ƍi:-"D|Bʵ$I ^% iWWT,w]UOi&NO>V]="WC4;&ljJSSix09+r`$IN-޽MAj5867PU < x8\J@ "d% ζ.=?yUkPUPEUTlpT**}TQ߇FEgJsLNwuaAZ)륒hUmB%k[U0ƘMEuڶ?XVBIENDB`facebook-away.png000066400000000000000000000006541326020644600327310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<)IDAT8NA[Gr@B¥*q X$'  $lE4 n[JNbfv͎9. >gЬBBӎrԁ8ɒjuǛ|NB(J>wD5l#.n^AWb{@ZGފImK:A^`oL+Oz#='DR6( Gā%,X K ^y(cE"āȓNF4l{k*k>7,*^4t8b^IENDB`facebook-chat.png000066400000000000000000000010501326020644600326760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8kA; EDCO;ARŁ`B/ *b+b}f?f87{jy0xXD6DaR*JZ|xʪY>Ƥ1Y$V(@QcKO/_ x"i!HcA9N},WϟbtqL25g=w4 ޑi".tx#?\a*G7Ohkt0 u0Y\Ę`u-7R@UVs_IoI0;t޼x|(9/cxE8ZBp~iଽ`wV1b%dFq BQ9XAw_:IENDB`facebook-dnd.png000066400000000000000000000006541326020644600325350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<)IDAT8NA[Gr@B¥*q X$'  $lE4 n[JNbfv͎9. >gЬBBӎrԁ8ɒjuǛ|NB(J>wD5l#.n^AWb{@ZGފImK:A^`oL+Oz#='DR6( Gā%,X K ^y(cE"āȓNF4l{k*k>7,*^4t8b^IENDB`facebook-notinroster.png000066400000000000000000000007641326020644600343600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<qIDAT81NP߳+m-{8 J(p"*H4TH v]}C73OSp $"cYkBJ80Q1@USUEQ0ypĨje)KQ(jLӌ͍M{,..1G/6Qd[_Y h4Z@\àaG߸FD6 x 8}W/vvOg[Ga6 oj:I]ג@UUuN^@Q)[; /{NM EZz{ijDd2,Hbb"KhB D*~6(Kʲ݉#VUct{_UT5Qd Kvi51 *Q`8c;'*u' T.xx'?Z}Ȕ2'Y>0u4, 2ьpxpT8kwZ ;fl>iwZf"2'I\v;^&cxdrT5T$IZ:z?EIENDB`facebook-online.png000066400000000000000000000010501326020644600332430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8kA; EDCO;ARŁ`B/ *b+b}f?f87{jy0xXD6DaR*JZ|xʪY>Ƥ1Y$V(@QcKO/_ x"i!HcA9N},WϟbtqL25g=w4 ޑi".tx#?\a*G7Ohkt0 u0Y\Ę`u-7R@UVs_IoI0;t޼x|(9/cxE8ZBp~iଽ`wV1b%dFq BQ9XAw_:IENDB`facebook-xa.png000066400000000000000000000006541326020644600324000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<)IDAT8NA[Gr@B¥*q X$'  $lE4 n[JNbfv͎9. >gЬBBӎrԁ8ɒjuǛ|NB(J>wD5l#.n^AWb{@ZGފImK:A^`oL+Oz#='DR6( Gā%,X K ^y(cE"āȓNF4l{k*k>7,*^4t8b^IENDB`gadu-away.png000066400000000000000000000014441326020644600320760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME  8IDAT8}_hu?sڶwӑnvTab[reRZX) A5PQAtEAa B:18yv=OŤys|< \~`U6ws|Mqkc>UiQgdv7wszG~' 6zS5-DfR@YuLɄ.?O^ᕻUaG{Ⱦ6F^ B;0ֶU߱2!D1 z"Li]v#9EYa!H[ʥ1{zF%J9|rLgwUdkU ߆"GuzNr %\ʎ+h~*Ȑ_=tKlf=x|8pp Owo_ ^LrK۷&Οol @kY&O}^=9V79AȬ-wLf 61fy1pcgKE} *\rn̵|D~Q\ @m%IENDB`gadu-chat.png000066400000000000000000000015211326020644600320500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME  8IDAT8u]hu#`KӮt2dJM7l2UcTPLQ/BG]jڌiQ[uA銙&Yڡ<9Ԩ[2 Ƕ| |"3CCO͋Z#~?lg-aYh) :-WJeQ>fRZ?*,S3T}EgCE.B*}%%T*o|q6w 7_pd۶v龝c3]FkEWG7PݼLWMM~g}ؕcXX 7@0}Meu6<.`ʯ ~;޽wP*iT3  1H_@G8x0~a8+G i$DT 'Lݷ?ذX퉖Opk2 Fղe*q"yεopwﭴ/]%jUdQ y` ~VQ${(ĀPj )?5;(! /s&e"v[9~Vl7T$d "t] я`B8`\rX_ȍf_ߘk_:}@YOZD܀>@ujܣaHIENDB`gadu-dnd.png000066400000000000000000000014411326020644600316770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME aDIDAT8uMhW{7$"1`iKk5]YtQu!P b vS(MhRj .lqiI(1~=]H"5]缜s(o=ƹM; ~]^`fkӭ'`ruBkLX*XCD֭J}#3ZTJkGj o>|8;<0@M{Cxg”WB\%jnrDоOqb".r+mfC]1=+YOѨȹ%Xxg9 cN (wa?\HY\1IENDB`gadu-invisible.png000066400000000000000000000014511326020644600331170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8uQhu?_tmr S½J\dEDE"IE>/Qzn5AEJ11kvи9=Bl:3UM$io\fFZE\ > D$~ á|hԹ0"2P(DK>]76xѿ~]wܹ Rg+ssw} w*0o}?n K]L5ܑCOꟈň bKft>dQt. DF.}x띋1q$KyO25$MWA-\䱮\twc2 |`$s^!?0qV۵X!y;$m0q8`)v& p\lѹ^.l|EѡՙɳY&?ZJU'PY5U?^v&L&h wq&\B:R:uƧ3/{2:h^E6yy#K3Gۆ/寧2A0!w߿v6-o>9@ZGO?&ϻSxX'JVEߺU*VvXt.ꈢحjٍp-X0&q|z=N /6؈3+mz4!D>G:]\\j~8Co I$c4[[Z _b6Hd X[?h{CBÒsqvzi3e~A|7~a5j6IENDB`gadu-offline.png000066400000000000000000000014371326020644600325610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME  8IDAT8KHTqƿ{;GkNh$n%E#څVF BPM tQeB"ќqL] LC\3w@Yw~ps8B־)qҗ###v:a'@ZZriN Z(0J.V?aX4Z b"j<[10"L7||}?&x^j 1!PZZiYAQ_Fkjj  @ƱB#xӃXD۪$Q,$Ql$%&b ## Y@D$>7ܫvYUUhCCcBcC=,Ihn5NYƻleЉ޾^&=ddf#+dx''b]ݰeNYQb!x)GU99 vƕ,0Y);~K/IENDB`gadu-online.png000066400000000000000000000014421326020644600324170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8uKa~_7NaLQ nf (B*ȜEn$AD a**VЕA0BKܿ}[X9<c ʕBaT26fLq.,ל VE"K-pֿ⺔JJy灀T|a8L`~Hy5!Y m+i]:JJ{UGǎԇ[kչ) ƚ_}[^|6kO lm>nj=Ʃy"4 x;j׻U4h|_RzCeH  HbIm|/8q!GW|~w:5tL׮ ƥt.d)Ak0FXUiQgdv7wszG~' 6zS5-DfR@YuLɄ.?O^ᕻUaG{Ⱦ6F^ B;0ֶU߱2!D1 z"Li]v#9EYa!H[ʥ1{zF%J9|rLgwUdkU ߆"GuzNr %\ʎ+h~*Ȑ_=tKlf=x|8pp Owo_ ^LrK۷&Οol @kY&O}^=9V79AȬ-wLf 61fy1pcgKE} *\rn̵|D~Q\ @m%IENDB`gajim-plugins.png000066400000000000000000000010351326020644600327610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxb?%BҸ<E; vP6X>ͽ,/)o zmP`E_ W \@&##Հo?4d ;YGEf3mg7af`dd`x חQ 8v4rX0&521n\;pܶ,?~@8~0|g<;Lˈh1˙珟p/5on߿`myf?X PfIL(-XXyE'>f 0Bezh;\WO߁_yE.H/D@gb(>֟Y͓/H.$iV$#YHav0eذx6IENDB`gnome-away.png000066400000000000000000000010371326020644600322610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGD pHYs  tIME 7UBIDATxڵ=HawIFbA=IYE**`AXJqpk)-t @(P/E1 YD-X&i*jL.oF3:wz@m"^҄B{0>:l`tz݅(uFC*s#<Mf2nΞMϑΨ|筄Y:S<- ~%.y;0樬pQr;7& %8=O޾~;ٌ2BDRUU3$l6K4BSu‘coc1ގrGG'84/*qwx_;$n[lmoX=gg/:wԡnpY|yiLfo[xQ6JUgwIENDB`gnome-chat.png000066400000000000000000000010541326020644600322360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDIDATxՒ?KQVZq' O.M*t.n!a|As!\uf7N%9pxp=}0m~Qmp i%Ik NNWUe\EQ(seY4M$It477:]`$B MSV///5e^WQʲLPOOOr\~=<<,ET*ʲ,--9(I("c}B- B,..{`*1ưFDYv*QaZ;^O-8_[x||lbHbkkkB9F`TmB23Egmm$I>e( 8F{sqpp|0zZ-(GW|N~7&r_GIENDB`gnome-closed.png000066400000000000000000000002541326020644600325710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDR w&bKGD pHYs  tIME)'C_9IDATӭ wQz"JM ]-EP ^Q*1IENDB`gnome-connecting.png000066400000000000000000000020741326020644600334510ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<tEXtAuthorJosef VybíralxtEXtCreation Time28.10.2006H/+tEXtSourcehttp://cornelius.gimp.cz'ZIIDAT8]Mh\U{/&iFm$6?H%-*.ʅ(""" "v)Rܤ5`FI[#M&qf2t̼uguŁOJiWZw`PRR9=ԉK=kDȧ>tV[ -.w _B¼89V70>.{Ez؛"VuB4ϵ7BG*6',ԭMp:&RJV7\kؖ~`ۮ<_oJ7"SDtCY+~R#7<ӮffovZ]RǏ1RX\J l]0 Z +YʒYj]RQk:@%ECHPJ&0栥uОIX\߬$R^:1)o ^{ign !MҠtcgC6SwFAa~I_ t"UfW\>Y: 4n+{gR04RxB;Oܟ?,fCIENDB`gnome-dnd.png000066400000000000000000000007161326020644600320700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRaIDAT8˵K[Q?U ڱ]D8H.ҡsHK38RUqpDhڡ!R!$;.و~N|{@Π#.L e#`:U4wFI<~{'݊btEGWh"+H+gkQ%J;mN4{o(+ p{<AF\l`Po2.BDDAg/tD>$>e3\BS>_/滎-`Xy=۩Ԛ4&  e$'HϪOtA5*(R|_6?.g$jR)-̳#7 y UK8;h%IENDB`gnome-error.png000066400000000000000000000010241326020644600324450ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRaIDAT8Œ1kq7IXI6KE쮎VQgѥD*J8UKՒJJM6}$6.7wx8z Nb^QDG@  )V (N&t.s _XyEwA +ŶPRWȌߠWH̅P4\Y[x=G#j.nHx]&LJ|.q"$/?g@6K(&?S|&%Rr*bj4+00ߧXa-pbbt6BR%kNO.v2)' r㩯*IENDB`gnome-event.png000066400000000000000000000010201326020644600324310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<IDAT8Րjq_v[@, Im&C4^>X< EZ Cv5 h6%xJ5J.```f{L{+,_^tq"O=ggw;b]8v`YuNQ`u/<qz=`zq`p Ή()ʒ~ Ƙsie4k7,UEDPU1 _i43W Dv:YbY6ժOȲUD"R.yx/_ RlJYN(Vx\k|F`*QRXYacôz$I>A[K0 w>V0:n `{(Nc;q>)kIENDB`gnome-invisible.png000066400000000000000000000011641326020644600333050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGD pHYs  tIME$hOIDAT8˥Ohq?{Mg9e&m-hDD V0J[xE[]:thÐBFFAACCA6 {Y߷ yv{|>90Tzd K!922T(L#΍k3RhuFޠT5h"u2*N4Nɽ;ъZAd4t_8nP7+5SVWb1l ׾/R>ɩiMGA,f#O6\DQx,h7C_DwZ!^kJ_xI_XH1=s`^,vdN'ZQF"1޵-(p,gj63wxn-#}Ď!Jt)D"fPlwy'LtyY*@ Aj*v]eY>o{vA&#2>|> і"&Poiv7nO-IENDB`gnome-muc-active.png000066400000000000000000000011201326020644600333460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8kA?n6b^ ؓzڛR(7ɮir Z')ƃHK@E$ŐvgymI }0a}ߙQ"I(ˮz@*}Dddz'1fvyaL﷛F[@vX)#B'A6nR?lc!Jc*K.ݛ$.\.s;DSz@gD$׾KEeȵc Q]?ڭVy EnYfFenS.ozÐ ,.eRZyŭ2,˞ΕJ6ŢX,~\J%ۭ ð#c b";Ft:U$yZ8gY|nZfp8TE;i4;j{ދW zNjz7L6)`HD$>t:7|_kWZo=N dg=m1缚mo l)IENDB`gnome-notinroster.png000066400000000000000000000013671326020644600337140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGD pHYs  tIME 6eDtEXtCommentMenu-sized icon ========== (c) 2003 Jakub 'jimmac' Steiner, http://jimmac.musichall.cz created with the GIMP, http://www.gimp.orggGIDATxڥkSQwf$ZbېBk+ŕ]\W @t!n]Bp#"FED(U5ƒ4sq__Ru>sΙ3הgOYZ,j5yo =DVmx$K&zky*01 R>{U8xx/W.B ށ *J\¹i&bf64TQu;E:΅&Jƞ}lQ,h[D @^ Fdžqf[ { >mʡ#{!=a0;B,;sJd D= "6*pZV%]^ώa&! 6j?t''xrfwNKpu#`R"c =HIGA?r /Ȥwa?o(VmP3;?٦_?Vd9AIENDB`gnome-offline.png000066400000000000000000000007731326020644600327500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDIDATxڥOKA&jŞz P-P "BO`S'HAbKkKac5fK%6k x/<o<otq[Bk '|j{g>T&K&PA| 8:gJqԗ^89eja2T& y\^^Nu^&_a1 鳁j%R+{Eq/R$$ uLn378kMtIENDB`gnome-online.png000066400000000000000000000011221326020644600325770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRagAMA abKGD pHYs  IDAT8˵kQ̼wjXЅ nBq6Ņ?@UY[]\Y vU+VmREj6jmfB13\![ǹ?JsҶy2ۦ|?@+eؖNNSiiZ־{olK'NPihSOFN)H3ց`V=)lF\:^!IwE231,>U9.]իo9i   fC}6RLO2!`CE dPUa@U7blYYt}DЌ'/9efVp#?H[98ԗᑘ^-pyWn~yx8;nchm(aѰ%d~lU-V-*N91=>GG948DANe㵛4YvoϱS)l.er߻rzϙ^y"! @km(ZfN7ڇKܨ8i9x% RJLdvv &''IRH)Rq8s3ʖZ+jdH$!B>FR" vm(J = J)l& @)n3.G722P2.Xa﫶TĭR&|766k7@V+/ yឮ^wˬ,-wWD U:r>l=UEӺIګIo0= o~Yn{߼t=9 >uӔ6nr5ā`%w|੭J.ߔJ"P?/2#G|IENDB`gnome-xa.png000066400000000000000000000011661326020644600317330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRa=IDAT8˵OHq?{m4ܬ C"1AJEl$(`jѡ\XRhFAY@?ngWO|[Y @ 0SӧlhMLad:."@Kk:Ib!Ͻ; Y~UP '?Bf>G<Viao7(/3f^c{-X-&:ݶ&䤣@yb80d3W/Wq8Kz{x|pw1oo D*'ErU8(Ƈ %*dag Ye!-MRgЁG%S'bqTEA%;%X]]RL&E*EQD$b~~^1vËd3hYZ|}&sQ FKN fQ*`kUDP(ra; h3 z4McqqI~OWWZ)2θyIENDB`goojim-away.png000066400000000000000000000006461326020644600324450ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<8IDAT8œJA"!je RT:`Jח+@R-`(6Br%&K@"802췬QUH%T6e˅ 9cA3兜cɧ(('`mlFo\ {eN#^ ϴyd2=La^Tz> `|&Glt  df <eg Q܎L?@)M4m} CseIvc{ XQI MiCZUxFg8qLgճ5 v&~Q>(IENDB`goojim-chat.png000066400000000000000000000006271326020644600324220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<)IDAT8ՓJQ+m@Q_`)i^AQDP-=;xp03̙{052/~CU`qBġ&%1E-7D񀸣A^|< <0 -g1J""*KƬV>^懙~Rj\[LX;_Cg -cCP5|+*'iHA:h5+D;c2ߊEzy Y·J ` Cۓ-Q15XJtOi1T$O67T>0cOGɋPxV^b*٥_٣%XJG?{O1W"+IENDB`goojim-connecting.png000066400000000000000000000010171326020644600336240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8ՓAH_71H(".@P,ƌ"уd1 s!uR f_sƒ^^9/v{x Id :H@̰^r%X#I}MUVsvG50uĜMfIUy:j?^TU2_~Իkg W59cPtf*N "ΒXv Vc43y5J4]̳t@?KL.7>RC65U#oK>qswC##_5;Q0@`J 7ث R +M 729_M5j9IIENDB`goojim-dnd.png000066400000000000000000000006431326020644600322460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDC pHYs  tIMEm}0IDAT8Փ1KAߙȁ  VM> ,,iLo+-$A,-RaM;;3wULy#<P<׋ NXeGv&Eӣ^ʃJe|t䖨‘DϳИU!T!di^2WpS=p 0N~5rܙi݆qP`D KO՚:<}R+cq5^Ù9c w&y"Jka,XWMXJyda; X8̏E%_b:>l4&e "}CN]I4;iwrv#atA)B= Md^9 #> Lv…`!,&j, A"R^+"GZk \vC#m""^-Ֆbp) R/ 'M͟uoM5j'^8Vz?}-- {A =˞cPP}s,w ˩zE=Ν nKg!i3JIENDB`goojim-event.png000066400000000000000000000006541326020644600326240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDC pHYs  tIME 5T 9IDAT8ՓJA`iS,0k!>`1XJ !xو\$kH ڤ)1Hc p B }i%,AŌÛ$)"\ehGn:<;%$7Vs蠏)anmZ G_°]$>qFP:Tc^Ne[kG{ay}b~awu CsJUB,c&KWv%-L?ڜIENDB`goojim-invisible.png000066400000000000000000000006031326020644600334610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8œJ@gAlRRɛXXViaG*`*lٝ\c 9afYuk+a0ݗey&8ZoZk wEQl[kh?\Zk0|y.3f_h'f Ƙi۶>ysu].|;DDT.8b "2_ [D#" "(`+v 0SO4}@$R#?IqeqL [ԭدIENDB`goojim-muc-active.png000066400000000000000000000011201326020644600335250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8kA?n6b^ ؓzڛR(7ɮir Z')ƃHK@E$ŐvgymI }0a}ߙQ"I(ˮz@*}Dddz'1fvyaL﷛F[@vX)#B'A6nR?lc!Jc*K.ݛ$.\.s;DSz@gD$׾KEeȵc Q]?ڭVy EnYfFenS.ozÐ ,.eRZyŭ2,˞ΕJ6ŢX,~\J%ۭ ð#c b";Ft:U$yZ8gY|nZfp8TE;i4;j{ދW zNjz7L6)`HD$>t:7|_kWZo=N dg=m1缚mo l)IENDB`goojim-notinroster.png000066400000000000000000000006031326020644600340630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8œJ@疓X //`y!EH`'()ˮ Yw9e'9Z'ZL}4MeY^ !y 6˲zg ܱ@}, @J4l`Bޣ(-ۂRj3qZ_ѵ`9۶t]̡WWHd(yTUV@D>'JDJP"8Oysk/H ziIENDB`goojim-offline.png000066400000000000000000000007321326020644600331220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<lIDAT8œKBQƿ/1pBZz('XC:.M7(ݣy=@Ag:ncNYk^6l6mWNy-˺-Jݍ8vz`}5 3姕nws4u9GRjRL"u"K)fL&H$0L@D;z%ObZ-8,$ "ID "!eYDXi ( Bqy_Vu1ǙL"i!0^hxK|s0zx=h{IENDB`goojim-online.png000066400000000000000000000005431326020644600327640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8ՓJCADϕlml@$?@A{Xigco XHD(؍*6. 5IVrE@%64 [\k[nI,.9O#/1bȀ>z+h:Ԙs 쩮x#Z8j8"cWLh2+G2`><⣦"+ZJHdt8td!pω.4--v vnl"Eot㧗u|=IENDB`goojim-opened.png000066400000000000000000000006241326020644600327520ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDR 2ϽbKGD pHYs  tIME/+2!IDAT]+q?/_70YdH~MQJ[ ɤ &(] eȯ^=} *Ll7' =٣vIENDB`goojim-requested.png000066400000000000000000000007571326020644600335100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8œkZaϋyqHq08P^8IbyuQ\ui{0.8hꠓDRCBH w<)nn$y{D ٦ؼAV;3LEQ~N3j+B^7|~J`&bA<+ SIR@)۶`Y\=Z:Z$H"#`:lu]|@)u^&R˲P(0zpԕ%&"? t;hZFfk ^ݚo"n1kd>j "$H^f eӻy_t?IENDB`goojim-xa.png000066400000000000000000000006261326020644600321120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<(IDAT8œ1KA B6وb X-N6֊iYXdGgKwD4ogfaWLi%_x[< 8ta 75+"ˀ^ h- =K}5eL6pUR;4 YQ'v`(\*0v ۝z}vXncf¹I &S'ND#k b_-zrp DN,<'B0Ӵ87@K) ch8xp})\o)@IENDB`gota-away.png000066400000000000000000000012651326020644600321110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRatIME'bKGD pHYs  tEXtCommentCreated with The GIMPd%nIDAT8c`@@ -@| +/FF{@B vb6)i)]?)tnC\\jfV n%_9s/9򿪿?C膄spqHcOW?p~Y50C¼#5o>c O[?vK.Nw@x+Pya_};x\( ҉\7꿂<Ȁ:h\nԳ08WdO 97dAsCzws92OEİor*nSrLfB.g$T)_pv7BP@3$r.?WB#%<ی/ٞ3>D5銎Hq\]W̺zZŶ+re3Hl4Mž㾃9\Vr6?j`޹<>l(yVۧ*w-W-yQÄ:r`uI7ḘZUj{ɇc02KyτZ''HuQ)DΚ0MLX,PGGG=r}N ܈̗IENDB`gota-closed.png000066400000000000000000000003701326020644600324150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8c?%f+! ļP Ӂx #8W $n > ċx7q/e._H d8jOB- ,$ \ t3lLJjIENDB`gota-connecting.png000066400000000000000000000020741326020644600332760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<tEXtAuthorJosef VybíralxtEXtCreation Time28.10.2006H/+tEXtSourcehttp://cornelius.gimp.cz'ZIIDAT8]Mh\U{/&iFm$6?H%-*.ʅ(""" "v)Rܤ5`FI[#M&qf2t̼uguŁOJiWZw`PRR9=ԉK=kDȧ>tV[ -.w _B¼89V70>.{Ez؛"VuB4ϵ7BG*6',ԭMp:&RJV7\kؖ~`ۮ<_oJ7"SDtCY+~R#7<ӮffovZ]RǏ1RX\J l]0 Z +YʒYj]RQk:@%ECHPJ&0栥uОIX\߬$R^:1)o ^{ign !MҠtcgC6SwFAa~I_ t"UfW\>Y: 4n+{gR04RxB;Oܟ?,fCIENDB`gota-dnd.png000066400000000000000000000011621326020644600317110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRatIME 5bKGD pHYs  tEXtCommentCreated with The GIMPd%nIDAT8ˍ?Haq- ^*l pJ$" 4AQI"6XP-A E-Q-(:E3z5M= ps"Gq ы Ɉr  _yˊ*rq\|ʾjq&C &<Ҷ4]tbiU?Q\SC*ew!^$PvRqE1J++mj|J~_A<70)rY;NTṈcCr }!χ-χ#t(%tڊdcIUtt[&АZJJ6@Eg1mk^v2YypkZ2^~m@MxGd +[B) [Kx@xCxKxH'b-سY#$ю#6GB^IENDB`gota-error.png000066400000000000000000000007661326020644600323060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRatIMEg6[bKGD pHYs  tEXtCommentCreated with The GIMPd%nZIDAT8˽JA,!"nȺ""@SQA tSt*:v zC u0 4ßA4;D' 6lgWAjb͘sqдN9^ NK6;'̼CP/`YGT7HdtX>:$7N`8.{(몪nz<0lnFɼb@ BѢ  ($`/V@OI*j|G^4._f\]TdXZ4[S3COeYn'YvPzIENDB`gota-event.png000066400000000000000000000010201326020644600322560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<IDAT8Րjq_v[@, Im&C4^>X< EZ Cv5 h6%xJ5J.```f{L{+,_^tq"O=ggw;b]8v`YuNQ`u/<qz=`zq`p Ή()ʒ~ Ƙsie4k7,UEDPU1 _i43W Dv:YbY6ժOȲUD"R.yx/_ RlJYN(Vx\k|F`*QRXYacôz$I>A[K0 w>V0:n `{(Nc;q>)kIENDB`gota-invisible.png000066400000000000000000000010201326020644600331210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRatIME4FbKGD pHYs  tEXtCommentCreated with The GIMPd%ntIDAT8˕?Hq+Ehp< H- -Q--S.!baPAACK` ACCC-Qџ?xhO?ihBnqB/Uii۶'"HR8S]T*%*JbX,:a̒$|nq8ORQ3XR\\V1w!nL!YǤeY:+8EPm: &b0Ni=j8$BG{~%QyvU_=,{5XlJK[ؠo܅?p͚tʘF(V<~abKcTq7Z '\ˋ5yɼS/ !c`Afߨ.?rIENDB`gota-muc-active.png000066400000000000000000000011201326020644600331730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8kA?n6b^ ؓzڛR(7ɮir Z')ƃHK@E$ŐvgymI }0a}ߙQ"I(ˮz@*}Dddz'1fvyaL﷛F[@vX)#B'A6nR?lc!Jc*K.ݛ$.\.s;DSz@gD$׾KEeȵc Q]?ڭVy EnYfFenS.ozÐ ,.eRZyŭ2,˞ΕJ6ŢX,~\J%ۭ ð#c b";Ft:U$yZ8gY|nZfp8TE;i4;j{ދW zNjz7L6)`HD$>t:7|_kWZo=N dg=m1缚mo l)IENDB`gota-notinroster.png000066400000000000000000000015251326020644600335350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRatIME EbKGD pHYs  tEXtCommentCreated with The GIMPd%nIDAT8c`\@@q'{1/@|B@@?^^^ cffb6l󹸸>9;;?~WFF?khhwtt+Pms )55&&@XZZ{RR->>/@~345<:sEVV"VVVfGFFF{YXX~Ĭccc{ 䫁 (}٩ tv? ?klljiiRPP3ͳ/OeҥKYOTPPP* /-Zjkk;жWX~=(@&N(4YL|pppeYrnڴ1<<7LĽ[2TWWG@!rJsssnYYYٳ>AcXgiiybΜ9 jjj?@8,,l*g<cIIf3gr*--G6| `,2A| > Ly'@$'%%O@bbb3aʸ|@i&nL,OWKc3[ Ŝ\odW1#۲W݋)p3 :LMMcutt^-z6,Pw@[>3gK~gFP&P i,IENDB`gota-offline.png000066400000000000000000000007701326020644600325720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRatIME ;bKGD pHYs  tEXtCommentCreated with The GIMPd%n\IDAT8˥ӿJP"MtN yqp1lVt⤸5 &T$)";Vrp#?pp ;0+a:$ad6YERDQ$<{ Pa RP^4MnSբ$I}uK ra >FAqSPHe.y >= Ch H4.`0%( 9C p]jfǹML eRU5d^Qs\p8A+5Fs\`o#_etlb:9p~&\B ˠ_:27IENDB`gota-online.png000066400000000000000000000012671326020644600324360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRatIME)%7bKGD pHYs  tEXtCommentCreated with The GIMPd%nIDAT8˕MHaFw6eaJ4cE ]?vFvXP"=D\/EDA:dAQTE!T "KBGMI3(HkOwkC<#H%. LeqXEϮu$em'.Jv[Ɂ·a6P;PR6m2&#X!nڽLf$I`|yMb "w#pvQ6E8sÌ8U)4oRK 6A (\r+ ~}1kau\0a/Obob] A*.;U'Zg[;׋U"/#pչ@^'cQtZ貺}Ԋfr2.ェ6K@LqDŖ9 &ಧcfkavߛ7mzY ] `dxݴd9c\4' }ijEW9ʼ#~4SDz≼Sθ=/惻 -Q9mN'ku &>g+IENDB`gota-opened.png000066400000000000000000000002651326020644600324210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<GIDAT8c?%a*@ĩ-.,/&2 fx/.X `t0 $e徇IENDB`gota-requested.png000066400000000000000000000012331326020644600331440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRatIME׳bKGD pHYs  tEXtCommentCreated with The GIMPd%nIDAT8c`\@lč@ Wq/ ` (((\>xLMM;&&@p f9卍DիW 1[[YYu aaa;/_.Ɉ͆"L~~@nό6Yj8g++ Sķ4]l#1JHH2@&..@W8١P,0r_TT4H rpp8TPP001_BBBa@ 5 ( ` eff~^ @dxh @/GS @w& Dӧ IJJ2{@|!MVWW955O@!L<[JJJ02 f@}@ %6_mmmb}}}>ydI&&$$d( [Laeddn0'ʕ@\ćGP-j }IENDB`gota-xa.png000066400000000000000000000011261326020644600315540ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRatIMEX(9bKGD pHYs  tEXtCommentCreated with The GIMPd%nIDAT8˕=Has+%.(&A hpj\Z)hhɡ(FuUt-p(8_O4/ s9M$×onP 1O_Mt=.n&UeؘQ}KK<*uvZZ±^XdueVV@TrP69Y7D/f!|D( ,,b7iU^es30?.BANё t^D f ac$ai YљTܥRaq8RKe"Ij$#TKqk ^cy>bohjV #k_#yM K |éK4į[ q 힖aW}[NbK᭝[ͽhCJjf>:aeIENDB`icq-away.png000066400000000000000000000015671326020644600317400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME '8IDAT8}Khe/$3mnh1II5BlDV".\.܈+\EYiV X*B-VPJi&61%\^)gw\6[{{: jݻ.1 bTWo%ZOzcao?rR+tlN9 %Oؼ$Кx$Mw<Bu' GxAxV=ƥ/V%0MZ ΢q }q6n^oL#{.8r85GzUdnkݾ"=^GEp Z]w;?0fIwRMr`R@*9#Dqm׼u^J&~v9<64+|jbu4ZME7{ 5"*a>#tKN 2\]"<8ľ`Axڥ >!N/@DKLwob4NVY.MĨ. >Q׿=#^ynzШv*(^MC{LK7~ Zvݘ!1:ߕkG ӟNbj}p{|ظ&{ u>X,^:@PQ#YB;Rxun~s`cUgѵY'-5ڶSt1٧]*)PMb-$0;?`XO N̰k)rnCwT?6]Ƙ ipkRucb.Bt<4IENDB`icq-chat.png000066400000000000000000000016551326020644600317140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME (-OIDAT8}]le?kKV6ɠl :u3N'ӘFH81CD@4-F:"sA`h߯}=#D;y+O<7Av,릌~L) x`q@Peb&'s^j Vig0Ch^Ua- HN=7 >3pAo[_aa/ŻJm GcYX0yy=ZcgT\ΤJB)Ynt'Rs*ra+n&ԋ54M<3nܜ#CІFM`܆r=L;yZB|tvBxɒ3dZKH$>D\VE\o4f/)dD i3IQ X- TccIrC<w2F*ue3  ZWՀ1!n]'2b1&HaO Q@^B;vcێ70ޭ϶Cs%uUo dHũ5x>H)q _nx<\IgTE+ Ô8wq Vo T ,ba!@`9N.yu;} ]Y-t0Bǃ*jƧԣH{x6rΝR=|`oz>T ڮyQaPts{WV@F#hN*)).cL,x[οP_SBʥTO_m[B>=豭V28)R.7}3wvkAIENDB`icq-dnd.png000066400000000000000000000016501326020644600315350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME '8JIDAT8u]lU9_kYWڭuj')c,lD$ Eb­ VD1$W&HF"C,3΀huk~o7}r`} <`61WOk?b}oٟz+c_މd/0˧0~/N= ?r]4$v6ƒҐ_=;gMf RJ(%)oo[La^O8: x:4M:wxǢE`}m1*†L]<5zҌzDi Rdr)oۏ*j#‡ie`ȕ33+*ğtg3]}^[%EIc7W K8HR+c3?9'(RҴm0#^I['TݨC*YSqWpn `W F6u@.B}~K8 5Λ4O\z@O^dPpr/ )UC#>&e ыh 07 ,O׃o8eCC@3$s BWೇS)XD?f_0՛_8K9TG&$luɹBlp7*30xg[mWC+fq1u)k`5WJ#ڸ3e*o ;JAL]ֈƿfD^5uPlЁ8ۺI#H Y'xOں ٛo^a&}uz2}2cK#2 =s_܏a8<-}M~-xQmlO+l!7/mp]v )"$mX[]+xٵQ̆^ l[ҏ?#sؑ| ZMX:1~kkܝYe6 vJn|ٿ;R$JL^V8~,˒3NfZ3R){Q:ˆĞoZAmR LX LU0{o^S02!m'1o9Ҥ4i2 M@@" EH__/ ]۫DR+42,O\nZg8ctR|8;=9;7B} pIENDB`icq-offline.png000066400000000000000000000016551326020644600324170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME (-OIDAT8}MLU}OXuZU+ZS 1&"Ƥ;jfbF766q;M4p eb ]hM!03u =aE: q0FC$R7|>54VFl3kw tidz5804AV.{4UQ!{~ho|00ѨD<b܅o %Mo]Y0u3Dt$JJ&4T*aHRI<v|Ttez}~B!X^^lw6hnD<Im[ZIMO:wޥP܍<%~BۏiMTff\aiTlol; ߆h({9mms7k-/; ΃@;ً@;,oF zKpuHC)dh^> zEC@?v\iK>׆sO'67ڲz.Ȟ ?n5~~&eYMQS #T*#(W:^3NRum>NZX ""M$srr%""tsʗj:,QfM| Tqjr5 *\.wp`VhLH$&˶t+m,޺%+4̽[6e hlnpc!M5!CIۿ`yΉbq{>oİZ9'㺬Tf[3g>+PQJUttntk_񇭠ȂMeIENDB`icq-online.png000066400000000000000000000016611326020644600322560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME (-SIDAT8}_L[umiGFA+ (6; M"s!hbL=L,Ƹ8/dce 1 Cn0(+3I9O6}!;L$tNƌQHC|j'7܏_^[=Tg6_5+< `P5JO]>l1uvx $y 5G8yQ@r(w|rԊŷ`J4k(hY{v,NefyW@_c#뺸6}Źs#ff,HJ*kCrp  j4(v:AzR wż`1ahX<ڲ7A /@ߕ;zϔX_. ^|Sr8ȬA`ױq__(XoQXka͎NW&V|v{?Y#4$ k\鍞:b!IENDB`icq-xa.png000066400000000000000000000016001326020644600313730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME (-"IDAT8mSMhe}%YMLF6m)&Z0('Aڛ=y,"M)%ReY +RڤtnݤMy;+J7o!y5e蔵q7PZaf03Z"N VEOS>nV]^33(( N{x}{;z"׃4V C]I䀔"ZDy|wz y9]IENDB`irc-away.png000066400000000000000000000013511326020644600317300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME TIDAT8mˋTGT}3F%!5մA"($qֿ^ 0QHBlE1_Y {Nw:uFV{Z|֞g}k {c_X]Z|qq$yn˷sNJBq^ B؞C@7V+K繰c>::b5$Jb =@b17oӉ uRsDQbZwǭ޻CҘ:O+SM|pS^<^pȩ]B|MO#$1/(G5r65 S R̵حCgu$5ʼ/. Τ^ R<-t3O 3ZSb y^]i%VS:RU*A36/3; @040?Ar}Œ'''Ȥ mf ieU\(>.qV2}HdcPڞ]}LWIxpoFM:c!O=IENDB`irc-chat.png000066400000000000000000000015421326020644600317100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME QIDAT8UMlTU;o>N_j)(ta"cA*TXą 2ngTn]e!dI hL4a%-*g:owuA:guO9691c;nx153M ήtSc K,_RMeW';<k-k7\XXk?xIkCkrI=h)љr,.]h :x`\MO37ӣOtn5$gF^[&a+-k-t,ơ3魢s5J\KpmʍDSS+My㵗5@S`cݟ~gjr#ԃ:+++\x?KǀcO:ߛ: /.ƽ\o닗VեëߜKo:84FUͦi*]ru]7]}P(͟/J(4bEW|k3. rk-GK}ZZ!pY?LEFCɽ-}H FU$#oT:V;'Т^P>6sdhwV898n߫1ؓ|qj#tGC"88A>9! tzqW?̑"8Kp&%Gz3z/JyU*y&i6CDT+x7:>wXқ[Xk|32_~#m r\IENDB`irc-dnd.png000066400000000000000000000015311326020644600315340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME |IDAT8UMh\ek2ә4ɄDcChR"V(5dUPvS2k*2 bX4A,4VZskvFͤ?ә;;.bY9/{#GHgu&_}y0.cc ~/dR4[>LM\1| AkzM&3Q&D>a UÇbڴzJ%:!bY^iїOb!g?o5e Fk:k`/!"ٹygvn}/fK5 .]ηPJד^@O!߈EpEY|.{ŀDW)[tB:((fW:rbm!J1 h4B.lhTʄ#^;Ow+?sro''ay@[Ʊ%-QĽ/|6BPwox}Ԍ~8 tı] $ӿQڶ}إ%P|cQūgjػG<3׽ ڢؕ\ZWwaWV0). "k]^tz(A( g*=* !G[TbZCګW)+qqNn$s^>|llvm_08[ Onq'3GN9wD6t= y`mqqhIENDB`irc-notinroster.png000066400000000000000000000014141326020644600333550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME  cIDAT8e_k\En6m4Wb)l[#ՂVAP^X(H9 ji(BJwmƶ"&{v9.ySԍYn] aG<|w c/>k8ge9߯z>ٳeu rTuBP5l>$Ι7Oq3Z {4MF*!xA>[{DѨcBV9GP4FDk 1Fy uo9'~w3$\Y=>Lbҫ^*|<+eQ0hxWs;eYb%7^*53VӊIb|ɲLDu;(0Ɛe1ƇG5yȓպAyrZM()(jVVRK*>iDtQXk)0ag'I^vgY"Qޓ˿t©&[[[,,,L5Qyv wA袳U`ľ6ՈP XEaXߔ]; 2 8{{ 򗱎yrbn{c6G8qA؛p1;k8ZUO4]CVI*5IENDB`irc-offline.png000066400000000000000000000013331326020644600324110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME Q}IDAT8eSMOSA=s;{ RV7ưpabte!qW>$~!.WH˳ODEHڹ.лsϹd芑"wSD+p o[ `an^KKb{{J뗶6~~1rx|`0)Q($Xq6NHB?Fr[-N\zY8F:٨u8өYZz \ɝW@t$AJI$mnm6o=Jஸ4X9"l`mu(MnV/0H8`6 !E!o<*܊W8"" j͜5 36 Znϔw% H0lPhj+|?J9i0̈8{BNkeg-|C92; F(\'̀5 CwԓG;S< ({|dKQߔ͖8̧A*jOѽ@33/TTV:œS4v[UUI[2 ҈*Udځc;h6[Rm е8\갧@ѸZ.՟=e%IENDB`irc-online.png000066400000000000000000000014161326020644600322550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME QIDAT8eSMhTWνw޼&ˀԍ. RCJf,YvY .Eܥ;BiJZ1ƍANZ!?{L|pwww>BT3Vg[FF`Toܹ_7Kq81RjHJi4[wS̔sh,8@}^G܌( s n s9 փi M6 (ahn'gWD4GʬA$P0 3l)0 YA;MW7`yϟ bP1'@h{Y}hRb?=^ nAsddEEew89\D,K@nW@<t`S)V$nn9 v&qCcQt4I9DeQ%0M4ѪB*h4({P} \8FU<5(8=asgȫ/d:>| 30S%?5f*KO.7,!*6@Z`3>ˠN4$_I^./oYoSS,0k@"/.IpeI$EŻvOOKpc0ۻno?*/<4[!IENDB`jabberbulb-away.png000066400000000000000000000017141326020644600332500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRatIME8$WDbKGD pHYs  ~tEXtCommentCreated with The GIMPd%n0IDAT8˝S]HSas֜ΣN#51`E3 A3]d݄YAe6MBRSlYYj<ٯ55Yj{^x/^xyKR(HԬD:?VDrh@.:8_e K? X/,kvT%LuuTg$ !!\ ; Y,mXu`8) ~`Jw b?2Jެo-2]%Jsӛ4利DscߒRXW[^ҋ,E]Aӏ&=txI<#>,T׍÷/<+U0r>ߊmD_zPRRj&;0-d߿AKI؁QOJ8 f>6}3xFH4V&ZRW(x֙ˌdLލw[=2}ZLRA< 8U={1c @1e9HEDi4r Uz sAR'8`|>!IENDB`jabberbulb-chat.png000066400000000000000000000016361326020644600332310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRatIME!5WbKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDAT8˅_h[u$7˒&]W's ˄"9CcT͇=tS77Q>1/.hS۵-Iek$~'i`sCA;,_RRP(gf/m;thgb:==gds4g8 `NRv{'F'@ضdYnicAUX|s2| 8z K%j뿽YǑe=x\n +[៾8;< ǹ07iEݝ yZP 7*ϥj v,A2^c4aftqhLD]{梯nXo޻YWo##1= 1v|FvjToEdd<;.nkw*L`{ŭ5,\L\GSIu,2JFSSJaY8 rSϒy?!*[\fį/ dٞkmw=p0\_̟dB!4!Va-]ùJW!1طޣ4{BF*߷`oh/z4[z} Q5ky+Z^~e-7`@yUngI.ֺZG^o?o%6bXPw߫E3ٻ T/D ;!qX&0&V"D]F2iSG bIENDB`jabberbulb-closed.png000066400000000000000000000003521326020644600335550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDR obKGD̿ pHYs  ~tIME )5{IDAT-ͱmAW`  ؕ#B9:6p59u`/_G~΃D[BIOZS*r}fLn߯%Lc)!m[iؗD[F"I7\(dIENDB`jabberbulb-connecting.png000066400000000000000000000016241326020644600344360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRagAMA7KIDAT8moSusshvm)ܧı!.#!1~dWx%\w&^x 71xED ͸Vڍڞ~JC}ܼP]>ƫzvJDPZ+vucӯ>WWo,ۥ!lR7k?˓~Zz)x{*9/6DPB]TXO7 .}]a"[Y [Tks5J_e |^o% p{4Fh6 Ja( [f"GH(V[i*N44Ճi=][QNtщʀ-DB[rdLlrEx!tO]xkrWQeM; XNb_czmCl#}2=򻹲"MAkcşY3{ڽL#|s6B8TEUmD[ +$sI$IŴm\2S+{M7'8vNYH)­Gn.`?,$ >2[Jx(Ca:mU?Vy}V|6~ ^͍*( .ev|,Y|JP}=gN)d(.խ +.`4-8&dsΏ2@˪&Kd*3@ N?apPG0ãzwڵO#})FqEF4`p_OW x2oIϹuޫU23@x {IENDB`jabberbulb-dnd.png000066400000000000000000000015431326020644600330540ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRatIME/LNbKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDAT8˝S]HSacss;ss6م-4 4!iXAE,Bic zѾs H7? |_"D-yx~yy?"QRRCqqsZm/(vV}> [yWLrjC6;U(N99llK%H89 ڄ.ЍaF YpKE*=4LBTF3]6]9t Mva^1r8Xq* Ȏee!jmDf\xb]\x ~i  AWnh€^^0!S2;KpkVV+UN$'8pZZtO!$%@@!Ȕ EwcFtVjt\,9p!J)Y^&MwwӭB zE<-z~~MەS*H8DBw#5D^sqr+P TQNI(4TB7a}vI$NGH0HIW%Zm!\c؉m4 .renI&5n6w&lI_ dDR9m4.ȗk)9`]_q sd3 PnIENDB`jabberbulb-error.png000066400000000000000000000012471326020644600334410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRagAMA7^IDAT8}KH[QFDBBE wmPIWJU @ (]օBAFbU-]ԭPhTѨ_Q|p803"*D><y)wVS니Ott8Ft:OkDWUn`k0`vv8-2Ɂ܄e6$7u؀YMpHC23aj ;Q_[DQP | >Q v; cbP-S*+jjJKAU]$p+9 UrѩV*(,u`?MPݸ7>rի wPg4z4ɂꧩ ;[sXX$$ͯ`rki91: zKGő+IbFF`nVWyj&&`||jKGNgUf.{{aff *-izJJ1_X< EZ Cv5 h6%xJ5J.```f{L{+,_^tq"O=ggw;b]8v`YuNQ`u/<qz=`zq`p Ή()ʒ~ Ƙsie4k7,UEDPU1 _i43W Dv:YbY6ժOȲUD"R.yx/_ RlJYN(Vx\k|F`*QRXYacôz$I>A[K0 w>V0:n `{(Nc;q>)kIENDB`jabberbulb-invisible.png000066400000000000000000000015771326020644600343020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRatIME$:KzbKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDAT8˝S]HQڦs:sNtJ! e .xNڢAL[ *,Jdݨõs[m[|"D-9py>?APC3PQ x<+QXx&sgbYY1& W$ՎH; PYypdQ NÀ+c!}̱юVX&cu_$rsᔪ^Fg.ݍ5yz|o_xFfe'z{yy t5#J҄xj{{b1H$@2 Zm}\v }kh%Z~MB!jBо###U`6A0{脬7,̀+u_,fCv1l6@.%t:l[[p.wjADYV Vk477Rx<,)1@(x3EP/$nB]@iF`o23?R[[[X,;>%b<ھkeJۡ`` EJt)hg D;;G C o*IENDB`jabberbulb-muc-active.png000066400000000000000000000011201326020644600343330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8kA?n6b^ ؓzڛR(7ɮir Z')ƃHK@E$ŐvgymI }0a}ߙQ"I(ˮz@*}Dddz'1fvyaL﷛F[@vX)#B'A6nR?lc!Jc*K.ݛ$.\.s;DSz@gD$׾KEeȵc Q]?ڭVy EnYfFenS.ozÐ ,.eRZyŭ2,˞ΕJ6ŢX,~\J%ۭ ð#c b";Ft:U$yZ8gY|nZfp8TE;i4;j{ދW zNjz7L6)`HD$>t:7|_kWZo=N dg=m1缚mo l)IENDB`jabberbulb-notinroster.png000066400000000000000000000015551326020644600347000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRatIME 5-IbKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDAT8c`[X_VRr $삨BB'o(!Qz@Iy9#>pQF 3t;>Ho?}J˾>&\VV8W}AD"Eqq&kX49N`!hh4nDMvlr@A99^@WT|bEd bb)fָlK5 O̵>1ۘ<ϲ2\&- JLwF6`|Gj֞ '&sn3Ⴐ4KnUFƝi`CIJFhlxkUDW`sD'ףKZ8!k>!!aauvro/o;;]wu[.xb\͉~![LTT (XuIFI\\^/?75pscV`ܻCK(BQꯧ^^^'%ǩ@@74 ,:Ԥ2sReeÇ3.JI^n}0)7 &&џ^wzEҧ CZX|> +抦f 0yWecKS| tsMCcekз`%%ŷΪ45=b\ik~^ލ@vBl -LIENDB`jabberbulb-offline.png000066400000000000000000000012241326020644600337250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRatIME /1pQF 3t;>Ho?}J˾>&\VV8W}AD"Eqq&kX49N`!hh4nDMvlr@A99^@WT|bEd bb)fָlK5 O̵>1ۘ<ϲ2\&sd=/=\rr.kc<0q؟e}78ԜUtIEώ UddXjaoUW7冽?;rg{ Xq @.)*r0&8ওyEgXX1?)_QWW$'7VE)֋ҍ@IY=6Iw0hjwY6d  p]5]34s @'ՇYY7/JJVj |p!pUIѝQIENDB`jabberbulb-opened.png000066400000000000000000000003531326020644600335570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDR dbKGD̿ pHYs  tIME j$|IDAT-@DߊEۂ:c'>$:01Ј"hfowv:8"k/:rQ\N˷>YY7dU>H x.s=nCk$=rj4~`e0ԊIENDB`jabberbulb-requested.png000066400000000000000000000015721326020644600343120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRatIME 2!޾S/bKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDAT8c`Dݹ%HT:)&.4SJ`dx4qK!,?'Pń~%].1j. ~^yMf YsJT5iG,+;69Na)f!@ ` )hq2SL6 14RޜScbtzI*Cn:^׬F0P 4dX`1n.=ihh`wJȂe%+LbKi.zY0&`7`H)磌|;xwz34}imPncUgϥ-N|Z GYXއ|/_qwgsǗGYd3;Q\+pokk87?_k%%gbz(4UHНSTv8`_WZ? -'5 =- U 4q]@DR>7#@YDj22}Qm}0ic%630tfg71&MWJ?_2'UeJdvAqԌ4 ;88o(-纁ZvE0jƘf0gg*,hߵ@gl;0WSZ-ι+mgIENDB`jabberbulb-xa.png000066400000000000000000000015771326020644600327260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRatIME $ sabKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDAT8c`[X_VRr $삨BB'o(!Qz@Iy9#>pQF 3t;>Ho?}J˾>&\VV8W}AD"Eqq&kX49N`!hh4nDMvlr@A99^@W2 .㛁Wщٖ'kk}b1/+de# aM_ԲzVoQ5/7h^|gى b+NL~b8Hm&`7\*h Pe/}˪?rK-91ED_߉N嵀1qC ځ=U}_>k/~__Ewdş,Ws_VA0%s<<;. V]aap_soo{/<?яe|;1Al+0݁h{%EEN}k|[?_ڞ׿`XDϼhpI㼀3,,@$eǯ5xOz\(-$`R.&oNwsgoX|w+-]y-Ԍ!?{w]~W5W>xYA!暁A00-fNn󀼘Yқ56x-0}-Ϸ bdcKl[`YIENDB`mrim-away.png000066400000000000000000000020321326020644600321140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasRGBbKGD pHYs  tIME  c)&tEXtCommentCreated with GIMPWuIDAT8EMLe]XvgiQAP4h6$hS5c6Ӧ1jlmC5XAmt(,,,33\Wĸ4f2+RB@&|`!gw7b/xq* BYFc;k"BܢpmtRn- kr=;M 7bh}G`f)r:ǝNJs#HYvK{Wڧʮ=Gv躮jqqqqZr{LKbtZg=Oգ3o0aг-k@W#r4?蝵SC@!5 ~ַUҬK'W+[?w0%4 P@!# 6OH ꤮mVf<U(JhZNH#(*_-Nn )Ud7VR},pieds6k2%rbkBh(PJ :@ Tx<Щ@DbIENDB`mrim-chat.png000066400000000000000000000016431326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasRGBbKGD pHYs  tIME 5#tEXtCommentCreated with GIMPWIDAT8U=lGK --lA Ep +`0?B:Hď`@ jLL  HBKm)w?Yg{]ciHRPT~N}J*`jzQ=&jyZgBy*`6Hufui,TiL޵֪.*8]#iIy 6tQja6-5lȀe~uȄ24xgbZVod}:|c (R$PA$n)+YŒŞToDڽ<[d9N qm\2[\œji7)׼U/ž[VLCѝwO>V  D)7.XQd%EϧWfڒ;=ӃÅqL1 #B56/ֺw46ԕ?{\"#(?w`M#gef8KErRAzsE$RȎ)LN(pKf+sJP9?SkG4pxm5/|I&\5pGo)%t-V#~34^ g[UYRdPodӷF8g{xTbsMYE%4JZƊ3leg`PV+d͓3=^weēuܐIafԢYlt1ߋw<-&^jۮ;n~vh w2KQTV1H>0 z>II%K<1kuYCZM~fwJE Ɣq 4"PP& iycMq))}mWzǞ(?kˋvҘU@$PQVV(|v?r`n7D†'{86=P񇢢zjL cG̔jJ\N<=fSFaw}V)^{ =5jld2q8:b& g\2XN;謏M r|>Z0_MͲfX.&.TTN luDYtq)J\$ 佩N%[\vl̳N.6jg msR3yA>/+ ѕD]|TA~tEY)uj,Ug]l`9d"ܽ y}(L~y|0R_g;_Bui^* $:;;{~sRCӴgcccO?ObvvfffboR1ŀy &1 CjJ/VWW N`aa.gAxFӴj^E ƒH$rl⣣_雕J۟,6M(tZ&FoX]-$LLLL&ojv`0cHo6 RiwC.ld2H$$@XY^^4ccDG\sG~QU建|K?r÷c=qxx*!#mύ AӼ,˪4|CQW@,Ͽqh#i!1G)xJ)1JiZOOOwJ]/*zi(v?*B;Bb ~aYuJ)GD@D1_w4M{uԶ8祔nwX,^B\GĨ}OHFK)c%J)"Jv0w)<ni$ DRJRDL F-YJZZ(0R>vgR:RE,k#bBBR}D[[[\]4mZ) C<I4t]#0yϲ0119G8{fT*}q.Ya=n'Hi3Yu៌FfXLKSSS+gggVnef.s4AtM,cH0:y1cs˲4s, x4!333u(TP(|b{uF0"Rjn>!)LJ)U.w]b[0"VfYVO`04 @DubN9FIENDB`mrim-online.png000066400000000000000000000014561326020644600324500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasRGBbKGD pHYs  tIME 4;0%tEXtCommentCreated with GIMPWIDAT8MOLAxy0di9c.˲Hٸm١q 'N/a : uZ0au]zTx@rs>슏 PxsqTӮ "ZxLFΤ)%W!Vݴ`̂;Ljdj")1nyZ#V_*IENDB`mrim-xa.png000066400000000000000000000017511326020644600315720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasRGBbKGD pHYs  tIME 44;8;tEXtCommentCreated with GIMPWDIDAT8MKlTU@ϝ_3v %JvӰ@1*vą!A,J܈ Ĉ0 JuQͼ߽ٜ܇rP;;i//N:hBJmf&d) JpOW3.d. J ˑz'wmg%Ñ<[*,;KeuptB":DGB&<ǗP7F?1-aJlⱱ^>5>ow2/p[%{u&Ϗbjt~-ե5R>(Lr6=e 9aRҴasf{Ɏ $^;T6xmtD i^:3qM&,̬s[ؔ hcqmumXQٕD7E.UxAMk0>q&fzd}}i Dxe l7nVtT @$:>w\< u;[i(;ݙ+[5Ns3cgsit]0dz!(P SW/P.g_OwCq@ B39@$$ұ2J)66lV) m@4ŁBCP+ $mlg]+ƴtjws6arcLL? yIENDB`sms-chat.png000066400000000000000000000011411326020644600317300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME  :+ gIDAT8KkQɄ̤RbA ҪI _"x(V܉r'Rbd,S$t9.clphX*/z^? 0ȗsU}}L\?bry` zh` h4͆DžGp]@R 4Wh8>mumXQٕD7E.UxAMk0>q&fzd}}i Dxe l7nVtT @$:>w\< u;[i(;ݙ+[5Ns3cgsit]0dz!(P SW/P.g_OwCq@ B39@$$ұ2J)66lV) m@4ŁBCP+ $mlg]+ƴtjws6arcLL? yIENDB`sms-dnd.png000066400000000000000000000011751326020644600315650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME  IDAT8OkA.1BRI[yBgA R<(?/ T?@TŃ~1lnvfw<u.{w^FJʬ(πe;A;~P4ӥ8 (k䗗aNNioJݘVsG޺FAbhbݘ FT)0/[=uh IR J8,@?ql( J-Oe2h= H)D777h}4EIT%^̹{TBlj]Z+z?s@ZC7xiUrk:AuM!j䄳T %GTb}4 &@$, ZFcЬZLqwVJTB:bgzK".hBաK6Ų,,ƶl,ms[8Nbˆ=OjLۢTXfnt 187/ RsIENDB`sms-offline.png000066400000000000000000000012031326020644600324320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME  :+ g%IDAT8QKQj N RYB^B_@KtэPopzl1nw}N6>7{QT*M$)0恵8\v|FG('8urͺqtQDbq=/]շg#bi{]Z'>GS-kfDZkM:)79h`ɀ_ zFovtN͹ӷwޯؐ *㾂+;_܋XmumXQٕD7E.UxAMk0>q&fzd}}i Dxe l7nVtT @$:>w\< u;[i(;ݙ+[5Ns3cgsit]0dz!(P SW/P.g_OwCq@ B39@$$ұ2J)66lV) m@4ŁBCP+ $mlg]+ƴtjws6arcLL? yIENDB`sms-xa.png000066400000000000000000000011411326020644600314210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME  :+ gIDAT8KkQɄ̤RbA ҪI _"x(V܉r'Rbd,S$t9.clphX*/z^? 0ȗsU}}L\?bry` zh` h4͆DžGp]@R 4Wh8>mumXQٕD7E.UxAMk0>q&fzd}}i Dxe l7nVtT @$:>w\< u;[i(;ݙ+[5Ns3cgsit]0dz!(P SW/P.g_OwCq@ B39@$$ұ2J)66lV) m@4ŁBCP+ $mlg]+ƴtjws6arcLL? yIENDB`sun-away.png000066400000000000000000000015531326020644600317640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8mRMh]Ef;o6OlLlSfc)*X(? t#PE7Bp#")bq&P*Z\HuEb[H =m{3wq|$gq8i>ADsiq2{w>T*y=tDrν@uˬya4%xVN6Gwmtg;Ѱ?3GyWVk{}&澰iq-c[Gw1//?{Šolu*?)׻^ w@ '叽#psZa~P7үpta ,2w"lr ٳp?, o@t􉷞 g3;BFDN˪}w7!~xO_ x| 1"sH)ADp!TK˺$IsH)cD$`!s0bY ! !Q?BY!$1ZkeB Mӭ3㖁8c眫( Dep΁BPeB1X!.&eY "(P`R {cBXlaa!j)eB`s,an1*cM>551cι17tWsG_[kuuc0TڹVÉKKKOJ)g!RUVkxIENDB`sun-chat.png000066400000000000000000000016401326020644600317370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<2IDAT8}]hey4i5bijWN:AE Na/*ɮDKA(ml Y`/Jn:7ݺ6%M7GtFD5秼ddhbhSTDĬq) {һiAxh3mV@OnB6HX闟U#啓vhl0:l rU1#;H`ܒ S Y<!Zls Tu%e?9E/`_s͝WYEQ2cs=(]ZǢC#& fQK2o j--=I,~2- ASW?w57Fa|@ů e`}CsLdo4ʥ$+WLox+ lG˃|\㙷囷sL7ns4,+\Tm8S1 7-dL(5'UN乣';hWo[&:2z 6Z8[`Vɗm!=Z|0v¹z7@.x[YXf>kg-j>={RNr|qp/H׹ƨSwRC"J]0;51F@8BԢV+j( k?Z5 Qo؏(k߭pI*DGWɧoДܰ\%CDU33/%;FIENDB`sun-closed.png000066400000000000000000000002341326020644600322670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGD pHYs  tIME/u)IDAT8c`b2Qj.a;H4Q@z=VIENDB`sun-connecting.png000066400000000000000000000020741326020644600331510ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<tEXtAuthorJosef VybíralxtEXtCreation Time28.10.2006H/+tEXtSourcehttp://cornelius.gimp.cz'ZIIDAT8]Mh\U{/&iFm$6?H%-*.ʅ(""" "v)Rܤ5`FI[#M&qf2t̼uguŁOJiWZw`PRR9=ԉK=kDȧ>tV[ -.w _B¼89V70>.{Ez؛"VuB4ϵ7BG*6',ԭMp:&RJV7\kؖ~`ۮ<_oJ7"SDtCY+~R#7<ӮffovZ]RǏ1RX\J l]0 Z +YʒYj]RQk:@%ECHPJ&0栥uОIX\߬$R^:1)o ^{ign !MҠtcgC6SwFAa~I_ t"UfW\>Y: 4n+{gR04RxB;Oܟ?,fCIENDB`sun-dnd.png000066400000000000000000000015301326020644600315630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8R]hUɸ3vԮ!(DB_SD bA)De!ZT}) (Th4PCmu5lwνΌ+䎍y^7fffCRT6-aCxivv muu㩩g,B$ގ}o&xA)0 Q.GQi}rtt4W.i4s!1 @###mAfMqjBN]ADRB)u!c i" CX2Lu7ui }0ƐfAD<4MeYeSRJXq9G.CvRBu@XaYU1jFQB\.؀HD`:8F>GiD ۶'2)p2BI@)0 XݭCF@BsN)fY2.G,kzy)B($2n9Rbދ~T*@DD+"]{ۗHOgw'wAs}Y5%7v/)Ϋko0;h~^ƃD2wO'զv>7LLD <=zn&?ڙ h&M>Vj}0n/GվJ ]."­K#ށ Z8ʼIENDB`sun-error.png000066400000000000000000000014771326020644600321610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8SKTQ=Ψ)ei A E~:j>2BD79#jFBTtr,"555%Sqf޻k3`5>=p9 "?mae˿8~UM*sԠ0so&6 Q+[3W$=dYS="@|8.-9i0|>T>Bx<mM*[qLV倸`KdN@DX< EZ Cv5 h6%xJ5J.```f{L{+,_^tq"O=ggw;b]8v`YuNQ`u/<qz=`zq`p Ή()ʒ~ Ƙsie4k7,UEDPU1 _i43W Dv:YbY6ժOȲUD"R.yx/_ RlJYN(Vx\k|F`*QRXYacôz$I>A[K0 w>V0:n `{(Nc;q>)kIENDB`sun-invisible.png000066400000000000000000000016171326020644600330100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<!IDAT8]lu>3;n ei]vK)!i6l0bL 7C!h"XBRJxZ 3ӝ˃}&_nrߔnv<9ǘ>:9z^0R9}iOZĨ5o$ɯn&Ȭ+~ml(<ǘLIU%rɫG7[)-O1_ LX>2>STj\}(r慆C=K{v4NV'HݚZmҒU)\ǩ#DwzōLO::$l1E]@{g5'@1W! JI{?_ wν+s.-F5 -Me% ;D 51XdUenF++Dqtvu!>ϑ_&/PJ)JeY9~!&ݾE@VӸ`tU/.1Vm>+':/k,2JKB&5g#eo#cv5gm;55e{}vɮ #"cL (`\sBJAU[!a.7)#B'A6nR?lc!Jc*K.ݛ$.\.s;DSz@gD$׾KEeȵc Q]?ڭVy EnYfFenS.ozÐ ,.eRZyŭ2,˞ΕJ6ŢX,~\J%ۭ ð#c b";Ft:U$yZ8gY|nZfp8TE;i4;j{ދW zNjz7L6)`HD$>t:7|_kWZo=N dg=m1缚mo l)IENDB`sun-notinroster.png000066400000000000000000000012501326020644600334030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<%IDAT8kaƟ~ص-E-"do.A"RA\E)5L]Һ8tHl%WҴIyR8s9,gRy ec̓\6=Y foO'L}kk^uEq@enC6={K1楔 ƘK"Q;;z 7j !1 i7B%wM֢1677a.H!Ľ+##n2yN!0@k 5h6dAq*rjC }})$AkADB@E" "''o"`as~8` \ppơDo9~ a/GZbhxaJQ:PB)(((zF(U"s|'Ϳ2~%T]9i?qW]gEG+:?…; ?=r>:)\n RV ^>I\W?.b5o,%/yvw])j/0E5wwًYwwq79* useo1Ɗµ+n*Fh'z!RM 6 ZAaid[߹ϯ+ PF ׫lOɬ<(5j"xA޷ށSqVZ^NMf%pʮ[{6Pҧ.RHgiZ6g +IqTK<=hXmP8N0V;IENDB`sun-online.png000066400000000000000000000015601326020644600323050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8[hTgns$N! CZ-)B@Kku[1&Q|V/U1jTTWҘJAQĜdaa"ǶݼyCS7ޝL83|_ip//YtlgƻFO?(Qqy SL)w.\&f;3I, 'VS9\[og[F4,+[Tj٬KC 5o ]"a/x뉻fvuhp*|ϖQh IcNP[b4|{LS'q#"1>,˂(?E}7MA4 @)E, }J@ y?ApR0.<ϫBxt1q&A 28 ÀeY@u88!ATyȕWP$ xq@immeض u[C&eymCCCH$PJ `fP(JHIEض ˲:<&''c1H-MMMAX|"Z%IjEqθ{VY{s0JiۇG)@__}o[zI:jR`H1nZu2׃ǓaI/4!_]ߺH1_!0qKwMw=_RQGj8|ME-D ,<9'''NF!f'Tvc¨F=Wtel3ˏ^* $>@vKr-mmEiS?9lIENDB`tlen-away.png000066400000000000000000000007431326020644600321210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME b`IDAT8NAE[Y!i! \ABH G\!@hPRλ;fcEYiv4;=^tX<4˗_ ! QKW!M'mQ +X, `PcVH03Diz_0KHۛ`w/; F[^<7x!C!#m,s nC͏,| \8aOSY ljjrT!ˊ$84"U=IENDB`tlen-chat.png000066400000000000000000000012141326020644600320710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME b`.IDAT8KHTaͅA21QS+msk]R=BfHbJZL"H&R:~-xgkQ|s8 `o&8nHq?%SP[J:o`1jKXՖ87?2+_0c UsgpU_|ZՅDxz:$UWjBͱx(i%'3;{n!,woЁ#zqq TU[9 &w#@a5T*Esc+m{~vjb:]P`[viҥ@WbTzG榖-Mn&}^v$i=a9% &vwF"щ z^&a w yyf^ݵbq #=;Xa{M;:r>moa + [{l$ #1vV. 205+@h1!!dIh<"m=P+IENDB`tlen-dnd.png000066400000000000000000000011141326020644600317160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME 8cIDAT8=hSQ 6IjZ:4vT: XA'ڱ"( K7BwcQ(GvCMHM5y8.z:N=pg(?L/`?ԭ`_m|$5~p &;Dr(|Z|{Q`-ÝC, H.~*02 " [~pK4O^fߥx.rtu=y3aD 3X_wVN1oU,|IENDB`tlen-offline.png000066400000000000000000000010041326020644600325710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME ]k1IDAT8jQs3']Z} B\ X*҂t#֍R_%jjY3c& M#xaw8ݽaLfvB%RD"ᆹf3Z$ADH^JHJ/17jѺF E N߼FT̝$ҙ)YvQU/KʲODfMrݾuK>9n|=nWT`.߿NOJ9w̨kìi!bԖ  МQ;̝~CTkjN(0{On7̖wD&>n<|mf@xno6Z;; X\!" pp0"uv@En{ Eշv}IENDB`tlen-online.png000066400000000000000000000006621326020644600324440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME ]k1TIDAT8JAX"R*EQ Ҫ ((¼R I Dbnbхvf~fBB*m7 vT|p @G#VgZ,^۳0ɦzD 4F&Pz {XZlw͙}E tc7M @0egBZV}gЃyoDQ΢g:t ;F !mZ p}.ah'PnHH@,G3C*p:p[bc! WKRD;q?rh#CIENDB`tlen-xa.png000066400000000000000000000006571326020644600315740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME ]k1QIDAT8MNA7¸2lb;5bGPA'0;F]%Đ S.ii~V]骯߫@?ʤ^Insv@f! ]=9<4$Sp`.z(PRk<`6 |F^\M57bs`bonMAZ\UBH\E)$C~Mxivs\;(13,ݕd'~gn`%̜#yfH iZuCLz=Jtj_YL2A$wgp!IENDB`weather-away.png000066400000000000000000000016441326020644600326170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<!IDAT8m_hu?sl;3*3FR7 Lf `tQxeDuTye. Y03A+uRŜw}ۅ AUU~|p-SUDUװQ M5`F0geYQ?MN%`5>X/(Bx4~PAͬFc%Nw` ݁vmqkN4JM@\?JnǤ4]nCJ&0Xb$ŏ mWt^rӧi/H7yO*;a) wJTsQFiZi3|=Aq$cų&Lx 1jbo[Yl՟D@WDыU-lgN$IⱮr1o5]?>::Y|=[;[f^ 8HVZKr=k8/v=? vou/=R$IȲzNT*&=27_{KE{/xrpΡ^RpQ*k-7uS.H{{lذ4åq)*qS(Ȳ2"yTUT(( kmHc8i4XkDJ1c >4mX_^&{Nt33W'z#c F~rU 4}STw](y>E#-zurm(hHgɃW^+N{IENDB`weather-chat.png000066400000000000000000000015031326020644600325670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8uQMh\U=w{4i:Z4PE%.QWHݔ."H+J]t.Bnmi h@I:ޛ{q1NHa&#,6N=h[`GehBD㯗GPqk\ 1kF|*%Y>B_5OE  Pn[f~)פu#!&~&g%VzZ--+e}!;p kBM!CDi]嵾#Gz㪣9^0g`~xiK_6IENDB`weather-dnd.png000066400000000000000000000013621326020644600324200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME  9;20IDAT8KqƟw3;Ό֦պ(,*t?ATFvtKA(>dD:K)1W<ޗ!g8dUB!J.xW+ w4zx[k5i<^5Of^̔vk LN,is ĦSX]]:by5eEb+Jtndd!Scz%=ө 86BLDGGV ˠUЇQg>H2JXD>$IȲ ,!"Hb۲H$XC\]1AHkR]8$IB*mm0 zba`hhJO3?66~uR)lmmAtww!ЀJeb1PJI9G~%ȓɩ,#t:Fp\UXEYZuX5P"UMZ0(EN~ dKJϯx8 ^=ۻMfdq}R|j~oς믨Q" [Α/(~QHIENDB`weather-offline.png000066400000000000000000000007211326020644600332730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME  9;20sIDAT8J@ϙ4IxDq p .ŕ/ >kD\]iŊ w "XKC&߅k*;q9%"̚gjVT=NPy3^ Y˕:}X*Xrz8Y_)NW;wk #e[4F +sS>ahiHc3.w"Է-;N- h6)B2F v[a[v[B3֩k2>$TI|*#ŘʝIQ;ERZn@q7 Vxs)l 07*Yb) مJr"?2Aܚ\8')]@2V:ח ^5IENDB`weather-online.png000066400000000000000000000016341326020644600331410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8]Khe_f$,IdRN.ԘAE QMADPl1 )ZUΘ;.4 ssPUvʭL{;%ҵj%(`yM4ob.鿴5^Z=wc. ~ ^E^\Bi'O2F!$0[\rsE GgĻA⎁I׮#`7 @I;AT}@0hM̚~!ne*j!6Ӻ]y$x$2`*jw0KeQƙ3ڎ(ʣH$bH[OLZCe|yngY/ ,q4?B-vD*Wsu#nqCJSndqO$j|ÁKw@e{YSmUW?,Jk-3>]7{#o97>ʍs<3y*UVQi6TU$l+_/ןFO^|zb28PU|NOc##y27 oX*BD0 "c JXʈn"yJdWW7qc!"(l"Ӄy++w1މǎǟkS}{|{j;00h jqٙb\}^k|^Tק_{$ Mg3R}ѴCayso@ / g0IENDB`weather-xa.png000066400000000000000000000011351326020644600322610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME  9;20IDAT8͒ORaޮU ƩM:fP"h7#" C22ڶhmU f"fHuL]*"\Ԣ9C3ӭI50G7V&=htB!&>K'ZRy"|7 ߕR?:Z0<_AiLڳ^,T*/ͅFȝ4Pʇ+j5|G:ƛkx:/~6-u$ h!R BL:v6MCID3m<(`bRZC)h4n1Q(1Vu$Lb00 R)X*ǁa>q D NҜifga' }2mp]=8v])8!a0Ӣ&jXA(+ha v+WN]~7ko؉}p)LIENDB`wroop-away.png000066400000000000000000000016411326020644600323230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8uKluyl. J ۥADS&4aFoLxb͋񲮛h Ճ1jn"vw6N' !ؽɰ >?P(@HG#=i7`b2;rfW¯٧.Yh5[N\|wog`D!mzv O"p'^FbS&&ýWs08|ί|?5,K m8s7>֕TB >z ?LMKr +m\rs!smk?ǯe˷f4 8tgC-Z,'/_K20ݞdTUG1?-a}PU t^t-ik[:>d#$D3J Gyޠ PkԜl\\uph8 YIܦ\o-r5jZ,jozeIOj& zOҬWKb1B.;jKFC旙5}GMQrr:xj;?*S:V+t3(4UC x*#];wnxR),&uE:||Fв7pYnFzrh$Vܣp轞VybcK- [L]ߣL|g@6 |YNnYևq9k6l6?v}B IENDB`wroop-chat.png000066400000000000000000000016521326020644600323030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<'IDAT8uAL[uі R]L0K0a3cM9}__n- ^~ _Qd D.<`xc㯖>3#gPGgwDdf/gAԘ 9;]=@Lk6沷P:AM-zvpp;i'ɨJ\ZRBPpmؽKOuj VDX xŝVCPR[66/7yq2=E`cYHNGQ}XVPL\ܯu 3(@ `fqh[دM(j`DuUT_DZ d5̽54T"ј( '&{v BTL:֜=dQ2$l`*"'t4uRF^,_ޖO*&~r[[C!­Ϣwʳ껓iȕO 5IKԜ&, akCL0+)늟z$ab)V~7 0UUm{t=}RRIENDB`wroop-closed.png000066400000000000000000000003221326020644600326260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDR <$sRGB pHYs  tIME ]tEXtCommentCreated with GIMPW?IDATӕ10ډ&&C<e&u{_€D jQJR͈IENDB`wroop-connecting.png000066400000000000000000000020741326020644600335120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs+tEXtSoftwarewww.inkscape.org<tEXtAuthorJosef VybíralxtEXtCreation Time28.10.2006H/+tEXtSourcehttp://cornelius.gimp.cz'ZIIDAT8]Mh\U{/&iFm$6?H%-*.ʅ(""" "v)Rܤ5`FI[#M&qf2t̼uguŁOJiWZw`PRR9=ԉK=kDȧ>tV[ -.w _B¼89V70>.{Ez؛"VuB4ϵ7BG*6',ԭMp:&RJV7\kؖ~`ۮ<_oJ7"SDtCY+~R#7<ӮffovZ]RǏ1RX\J l]0 Z +YʒYj]RQk:@%ECHPJ&0栥uОIX\߬$R^:1)o ^{ign !MҠtcgC6SwFAa~I_ t"UfW\>Y: 4n+{gR04RxB;Oܟ?,fCIENDB`wroop-dnd.png000066400000000000000000000016551326020644600321340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<*IDAT8uMLug;vma8ΌBڇabLȶhEzy27/nQg4&ZjYLeaؒB?ҽo=?Ó' !؝ᑰ-> Ɓe`))H#'k.Kw`fX*~xkH#3]O7ӬNM~#H|~nߌFb _Pk?3qe $ UZ_wEfV/_?WnIЧϿ?16&w蚆dCGWd$j$B}޻_Uh=;tn05?'ߌOp9=JIϐ^DT*܌x0(:7x{Uu^1bY8e@mi#LM&bYޘN@x:iD]pjnfҕl߇SӰ$ZaT*rZg;ĥjTE-*>.(YCTj]-zV INO! !4V+b-Y[P@ebBC0Z'o(%%${sܹi3UѴAJe63`DJ,cD{ #+I0٪8ڏXjpGX17G ~<+薵ߜ={䔧VU^bx;.[1̺K#ڪhv118 z{K."ʂGm~f$v!xvnr04NC"ǿαӮ]Ftj5|nO!,*`O3OX< EZ Cv5 h6%xJ5J.```f{L{+,_^tq"O=ggw;b]8v`YuNQ`u/<qz=`zq`p Ή()ʒ~ Ƙsie4k7,UEDPU1 _i43W Dv:YbY6ժOȲUD"R.yx/_ RlJYN(Vx\k|F`*QRXYacôz$I>A[K0 w>V0:n `{(Nc;q>)kIENDB`wroop-invisible.png000066400000000000000000000016051326020644600333460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8}kU3gfMM5!UclFVi!⍗ UT²-APDRbm>.JƚΙ3NjA]7?a/ ` 4@׻?qx`~aT*y^=1:h Zͽzo6 w+2`aGLZf{iMlo흦i?hF~zsΗrl\~LT?!MSt-u-+^~b5o.q%I%=8z*"I9#&ZKYٳ>70J+q("lHb`!lEw]V_89`. uW*&V1 Rf$A%9#aﺮ8>r(0xPHuJSS{CF 2㢳>`hؠyDAC1hR#0m24Zwɩc -:yJ>cc !wRw`ލ{>xbqz =Oztz,hZ~-/A@OD3< u$ґXJrAL&ydk2XAva7 t7?}寮%cF}G?f٩ckG$S7oطFNy׵jos}#'Bnjw3lޝO'^>pv5h*qx.JOw7_\bO Z/|ItLdFϝ=C"U԰^USU8Ξa"8k,omc)P H&Rk:󺊛TPDPPcW f fX1@h@, CAD0ƲTջuH)_DDp:uXAXyhZ9ᅰDwPV0fa:~7vJ=^z=| q}XX"Z>ՙi`dY-:cXkD"mKtV:?]ʭ\U,g\y s;ձ>tY^^QU^럎z1!cDc6^4UvR|L /HH3U IENDB`wroop-notinroster.png000066400000000000000000000016341326020644600337520ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8uKg_|oM4Uc2GA6+vRv2d]C6փsFAHzkcTI7ɰ..6|\> |/a@r0́x0>9zS_N>OJ%P(~Z./fO퍼Dh4iiia}}o^^_1r,No))VԔIMl9i5Ơ6~[]_ 4c߲PJBJJՕʶg3tٙ_pix5Wff@kdP*,fP*23j<./^4 %Щm]dl֜xpΫ՚m.h[V0-v*²4R)JI\>(1jayR) #@tyU_nR9z(uǫV W(=+ϯ| `\ d;!hj>|~M[{pWq6ch p ǹ]WGgh3qw\Tl6=|6d"AM ʲJc 2 w[\/6c_5xRF)mofv%[//柩r4YK{&b8|ѼF4p;H~T__IgGxWB: \iJn2Hg۶/zc>?oIENDB`wroop-offline.png000066400000000000000000000016531326020644600330070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<(IDAT8uOL[^ǣ Td ǟu2 یC>5zdŃo^ܢh@فddDV6ڎsPվσ8w>morjBt@Z 2095>|t7&|MUUEۆZ0 ><;? M3LNM;}50lÇ022B[㱵K_\|+4/`rj…wqe (┝X5F366F,X|˓pFJĄ޾NzddvV ͠( * .YFu(m3::ڲx@?{D<&F"n7ͪs:ǎ0[I,"ix̹V"#dE@qjGQF:Qn`"KXVMldp.U\4rGQ4lgzj667EJPہ J*82fl8JRܲr $SڎJ$Iwr4uA@{yij_pʃC?_M?, #$A!ݭue3gw?>ZZZ>TӇ㲳`B*ewweYjor&5IENDB`wroop-online.png000066400000000000000000000016511326020644600326470ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<&IDAT8uO[uўsJi)RrcllAN!q -޸n41x&N A8n4!!sL,`Ka~p=yab }.޼$d&&%"cF@\NkәS$`br4MG?1_5[F!`;m~rLvg###SP/,gZ=Z=Gd2م?^^\/HU !o\ݽ;`a͙ٜZ},ZcqGI==~͏a_EV$z'ϗQ749R_btdlSb?i IO0}=D5c3R`kk058m8tVqHj(Z#bNIENDB`wroop-requested.png000066400000000000000000000016411326020644600333630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8uKluyl. J ۥADS&4aFoLxb͋񲮛h Ճ1jn"vw6N' !ؽɰ >?P(@HG#=i7`b2;rfW¯٧.Yh5[N\|wog`D!mzv O"p'^FbS&&ýWs08|ί|?5,K m8s7>֕TB >z ?LMKr +m\rs!smk?ǯe˷f4 8tgC-Z,'/_K20ݞdTUG1?-a}PU t^t-ik[:>d#$D3J Gyޠ PkԜl\\uph8 YIܦ\o-r5jZ,jozeIOj& zOҬWKb1B.;jKFC旙5}GMQrr:xj;?*S:V+t3(4UC x*#];wnxR),&uE:||Fв7pYnFzrh$Vܣp轞VybcK- [L]ߣL|g@6 |YNnYևq9k6l6?v}B IENDB`wroop-xa.png000066400000000000000000000016411326020644600317720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8uKluyl. J ۥADS&4aFoLxb͋񲮛h Ճ1jn"vw6N' !ؽɰ >?P(@HG#=i7`b2;rfW¯٧.Yh5[N\|wog`D!mzv O"p'^FbS&&ýWs08|ί|?5,K m8s7>֕TB >z ?LMKr +m\rs!smk?ǯe˷f4 8tgC-Z,'/_K20ݞdTUG1?-a}PU t^t-ik[:>d#$D3J Gyޠ PkԜl\\uph8 YIܦ\o-r5jZ,jozeIOj& zOҬWKb1B.;jKFC旙5}GMQrr:xj;?*S:V+t3(4UC x*#];wnxR),&uE:||Fв7pYnFzrh$Vܣp轞VybcK- [L]ߣL|g@6 |YNnYևq9k6l6?v}B IENDB`yahoo-away.png000066400000000000000000000015301326020644600322710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME IDAT8uoTe;Йk3 Q48M3⨩؈!h vфԏ%qIF t@AT[KCps}_hX$gq ki)zR@ ZP| W6yq 5uvo'aա[%MYa›QHg&Nug͟P˳j"w" {d%7NTxwh G#ɎT AxpyWѫs bGbZGwEM˚j}Z;Fε#ߢ*tR6b:^'s}.)4kQ^2l&G+"Lq`'iE#Rl) Px.̃}5K"|c}ʾHh{  FMBЎv]8b- 4t~7쭭nDQ bycoF x~эِL}Cc0x눫PϊJ#SW;psѣۚq0poXP\e:BI%67< "t&P(?+ 4"|=U`-+s<  c'cż1߯d:kWjWr)"?,p/_`jO $Xzdf]Ul;j,/RIi,*Hg 2p}uy3& $ /}Ï|UP>97g) 2{Pv&ITc-9LYȔ$K\W֓d7ں/swƯgjNDg֝r|W͘0T%W֬Yo-D?V$tY 8CT݆6 8g?l IIENDB`yahoo-dnd.png000066400000000000000000000015341326020644600321010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME ,LIDAT8eoe3oہv5I65jueh`ą !(ecݘD&jW`A&mXv:r3y^Ի='{aKyĆQDs[7U%jj蜭uY A-faqBB_oC1y S%B$T keݘ• ی b؛_BQ7hq3Dʤ)Ip% ka+A,yYqO,l7_P^}|w1 *4tv{*{}1A~ɞQP%=Z^"(܆M_>! h9V|yTuaeTU\aPYk^>'BMR^ʑۨ* @ *hw?񓕭027Kr>sDogyjOC&!ָ״T{eS.^?a?֩D3k8ɀ14wtb-Y.0 ~4s"o|R!34ls\>0_30_9>"˲jkbT[1ck %?ȅ+385=;wށ,,*B6,OM]}9SW?RI,>g7˓E_l8Uר3Qu~jwnLOIENDB`yahoo-notinroster.png000066400000000000000000000015661326020644600337270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME  pIDAT8mOu?O[ҖJḰ,.C$fFq(1xh/xK4#&FosaYXx>ﴥ.ssurr|0 M RC2JSݹ?stLFv6 a_[U_6*LLLV#3c/H$SdRrJgG]]]|FeumTp{> r̘07X76ժhjk"8b nOXbxd}{ҷ08K!}wFk"ϾE4曕1]KLJ{*]* z^v;p?Q*I% >I==T*"IL @ XY?|*&ݭ!8+EtR*h6%b3hliuR((x^Puo/~RB`en˅îsO. xsw|.KW =m ޿xǽo@XFt:;:0̄D1m v;}ekkksyY˫0>7 cd@0,JǞNMxLnFk+^gOol' FGF~Z5sr1=o;ȏ'Yx9Ifo߮ĝ#=o---ɤܗ-ɁO;|^ E.W Jɥ{jqf(Thmg1ZhG;IENDB`yahoo-offline.png000066400000000000000000000015401326020644600327530ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME IDAT8uku?3}M٬M[EljM-y[ ei(R(*Xg+Ȃ&h}Is`7"Mw+1:Bf_t/j<|? (<.{0'V<+O8o~~z^dٮ]Ǿ /MONӃܡX,ʻ++N` |%= fgw556:27 5*evLut _Z-r9p}=d26e;!p]A`41 陠z:6;;{(ܚ6 +e\S|+CH!XY? bz?S}4|?^6,6-)%Rz rvMZa|L)d&hs<Gx\'._}\兣/d|qhp$Bu\^x \EJɩczeY8ЃBy);|'b_=4Z՞D!>6}}}.6M.pFiUx 6;=?:oA7VV~hz8fvjMJ2fzqt=ݖpF"qDo6[/;{We H)PP@Q0-^Mayy.>` |^SUe͋G,FϜza-_Lu3 ]:31H&joo/zңc濬(I)Yx[v;pIENDB`yahoo-online.png000066400000000000000000000015021326020644600326130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME 9<IDAT8mOlTeu:d}'U6T+w#ǫc>g p8rTwu U_9l S-0'ξ<<"(LPO$E1R=^zoth\dj_3I`_967'-{t x?32etӜ=bRM;]S G:iUIݸQ0 =J^l]is/;qFIENDB`yahoo-xa.png000066400000000000000000000015151326020644600317430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/16x16/statusPNG  IHDRabKGDtIME 9<IDAT8m=h[gӕJ6:mrPhEȐiHp1&h]֓jv(YduSb,]IZL8;y^u8DH)O?i̗_<nALEW鑉 0d|`S({eݐAnAM[=jd 8jk^Gt:]Gӄ 33bL |iә|sPu&>A#ңS[΅oby-Z;;|'D"|?X= |uzbnRBԩ$aI ſXQl;{ aecI .H8?2"EWi"l\2A;=jyy0J8)^ &6Sn, L xNz|s6VĢ8(m|ɛ,u\ǹ62,kFv|<^^l ,߼(@~ 0W"{I}uU-޻p‡}TpDžpdZAjB;IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/000077500000000000000000000000001326020644600262365ustar00rootroot00000000000000categories/000077500000000000000000000000001326020644600303045ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32gajim-agent-aim.png000066400000000000000000000030371326020644600337440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/categoriesPNG  IHDR szzbKGDtIME 0DQ IDATX͕kLWfw h46jlbZ$4jbllmDMj@k&TaaaȲ*cfaB"%IN=/w=F̜ :IKN ߯*69K ש 2$pzdzeE0/#{ɌhEr5J} 6.2ۊn3UG@C 8sC(m48޸)-1>puL:~AJ4 fɚG6@T5KL@gyp397.*gգ `봶#K:NBmQxa6UTopnff*HqiٜNV7= )K(o#dz85=+/XRrр(< w-x1,X01Gț)c4̀O ##Cpƒ1n@hJ*EΫXU)sWLwWU\ 0,7R}䟕}A ca, " xy A/ϳ/01† D}ys4'G4C|nz fn LA.5ҹk GL`U+L?QQ~(Rx< Phr -HriX>!]pYpX>]]a<0D7 M&kE^,c;󗫹ޅK0@vv$C"li\M d]ܲeK@]60RGosA (|@5˷Fx iƩ.'5lIk 3cQ9KsN%LJl/ޕ‘wۙ8( ː!MI tڱfy:s^WBX-[0?''.>>Ƣ'?PF@)3gC ^8m!x-/̖[;aS#)hҧ;n$ 0!Y(:i07=`*f=7ʻ[(H'jMxfYS%?<4'O,G#rd-9rD-F%VwZdu$\O5#FeY۶rI$3\z/}e8>$/^qlt/w* ~k׶7"*zS|nj%؄Cl"?Ÿ_:N>+kadO&ԎfKvB*g|M XmBek6=<@or웙j_Q"Z}-WF74D-6 ĴĔXEkZ38ts{ufsc9)cV{`"unR.* ,>CI4Jkg};ڊ Jk$te޳g 뛍Ϡ_=[n:Ji4HUY--b<τ~/g8f3VTUEXv 55 3 5!Vi4}-̵… K ظq#BL˗w ZE(`Ȓr)/ڌ\rRNG!Jm^wRi"LL+JlWG8Zse*m]+ciܢ,iqshZRi^Ѫ(GNX*bQ:i7/^lFTFP*>>=͕NsYz%,BxR5 '2 '2ē.A{ xr9\-(@5o@ @]]ߵR)R( &Ig]bMl^W>;th}jI,<@Di+5ގѲ6Lg:w.MLl^fS)Ji\O!fd2 `b+I]-iS9?p  0 XXXV*CUUFc,N cy݈vwwwi^񬿿?ǟ @6T@Qˋ twwCUUgGRR)$I$I$ $ hvi8jTUk}}:33띝9ŜMP!А8研B4r9_7co)x4>>i8]X(>4My~~.9XūO< kl0Z+O-o.//#RiTUt}pp-(ZD ZV, B.`[[[|{{JꙕU*02Z+4(, SJO(7MtWvb!ԍcQJB^]T:k'{>hIENDB`gajim-agent-disc.png000066400000000000000000000015521326020644600341200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/categoriesPNG  IHDR szzbKGDtIME 03a IDATXIOSQM1,a2iwą0 LR!B 1ƨ!qc~D!. Py#mo i Ƅ{{pp 'cUU%9βf}P=*8]Q\T ۶Q_א5y"mH&pui!k@<ed3|#RM\k4A)  *;@uQY  ! ikU8a,GJY+W9kBDQق4T xöi"˒nB#mmr@AA(0M1T*<(P(u-ͭVJ|,..(nQ-RU:q z^0 [sV0;7˲u]= 7=}.'Rzkp[EƘjӸWTVV1&n8w/LLL `||eF*R.BՃyz _/5-Vg&C븺՛kT}[ HA Õw/|KL|^zBQ& %+pvO?&Wٹ:1`_rN^{_!Ρ.;S9(FңP2Nm|r@AMڮp8]0j٨)#8<]Gq7ך?AZ3(&ZQ3'DU-Q<{@#N \ajFQoLԉl=RtH;uF3^ٗ?ep+u6#qXވ"Zȕe9]1< jWk N<AF\ Z/Qo6bhyWO==s>`iHADKW:>߃#b˩E%7jZOö/0UEn\:d%} /q{w, xM -)ݷM&m9@qIENDB`gajim-agent-gadu-gadu.png000066400000000000000000000033271326020644600350360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/categoriesPNG  IHDR szzbKGDtIME 03ayIDATX͗mWyc! 벻U!mhشhK M@DcB*&Iɦ&֘ $6~h Ҧ U4ˋe),3;,^!t3'&2!qy--ŽkmƘZzw\UxO}E=6êKڝKR$"&DKݛWC Iypuz h~^LwER&kw0sk[ t-"kr4d2Jf$^P&@C(_$2!t-Z B3‵wCũF|kaUۜF+WAEaY۰uCdP#XUJkPM}\ZֶhA<ADa=B oVf'_qH|7wa8T:ubLo u~xι\-Sդl\ &Bte31SRȵg/DD'ms>Pz|m}SI)aRhxǿ ^#<= s6T&(AbDJgTc=0sx4C͡tM>.ӻr| ؍CG*lq)eF*wQmP ֘=nL)scck:,N?߼ y~JMu@p pf2ruwW/.6&t=pۡ~{H>՝x5xMK0f.R>Gi8<6ʅ}^9nA{0|8If@RvpTAYqayϞňJJj4RF穞rם{~Զ+1FFoݭ]uXJUZ)S3SLIvlҴbtIENDB`gajim-agent-http-ws.png000066400000000000000000000037551326020644600346130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/categoriesPNG  IHDR szzbKGDtIME 03aIDATXY[:kf_2!!A 4@R PBh)"@}  -dҾ>T*( Ah*MĴ LIfxvcksLRP+Ok߫;C|i}ch)Z餐"'~I ԁ{H Ҷ,e,u5XmSJV<&2 χWE WMO]]nMw+|MsF֚y Og~/>Y}V eSu) 2K S.^s6Z!xoke BlL026[X@Ê䰵-)"ВV#ɞ_5@:-"G}M;io @ GL6RļKEi@k@A"br, eMKKShph{&'o=ݛvmk9F)@qz4GWR`H!6X!rliVO__GCgk}OD-,S @+EWJFHJD6GB_!Mg\"_'kK{]3 zF5o0s]t59$bZvϱ LS<-1'\m G8=DWT|E5JS}[RxICn7lCN b!=,CbȪZA(I02S W*]e {6Кƫlfs/2ל W@iUmȱ"gfSR}uh ! h6P*Y9@4bpWO+3+R]P~Y\)g U@sr$֚.,p,&7V$6\ZqRh [gdgY)ػc$yDcѷ)FS2D[]pjd TFJ1\ݜH&ؔ t{xKW`4])B2mAi'Q _fX!2 GG惸cQ6BWײ+b!:[6#~MgfH,h_8}vx%1ϱ\T ,58\Q#^!0.s zxzWrDod٭ErEs2oȹ9 -pjdZlq39w7u^<4pb!\.U4 ʾb:E WU].Nq:P/f4r7ggN]Mqz$KP| -PտAS&l03fGf p?tR@s*\b) kuχ2+,Fg EwGAM$١_8i[;D4= M4dҘUj#PyD|B>0܍֢>#s1u I_K 'd`)GW /Ә=~#r^}gomO^e`Xjx]zn2x@i!2s9N&3 '{>6ǢHɫrvlw7Zh'byeV %2aR]p00oU{#Xi\[ٰcMN!LղV?e/\8xZkTV| &DuYVç B&_78cIENDB`gajim-agent-icq.png000066400000000000000000000043401326020644600337500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/categoriesPNG  IHDR szzbKGDtIME $lIDATXVilT[fޛy3/،=6bCXCBJJ4Qj(RO%jTiլjV )%8es1[&xxl (R^}|9>wyh[6P{c >ȮSw~(DUO-+7(]HǗ|6д+=+&EK{KR7(J*n ?rd'D,Aܽ, ʂoó[j=n$kP *w*+~:cvFLAÚE[k~򳐒'ƭ0 h|G`yJ,de ϛ#>:D,_vNX@l|E\wO-mqG <^t ztS"NC3N>Xپ K,Fkl$|Z3ihV?ܲ9փ"=me_m'fc@;bL8VR>Sի#=@;HQ [%5]w#<Xqe !–]MT\`"r#u œgmfu[yȓtMC i_cUf%Pr\M&BGET/4,t.߼0mѾm(LРwǶ} )RI ,Xg<fb k3 JFђ4GȰeهaQ-rtI&lAsc<#;E F , a@bwF7 }n.D nj%Gށxp[Yg;V,,rqaǡ1ͽXJqL;"lۂ "A('8<0Y~dd xǚgƅlTc C~KD{ ~R4-֠[FM5'Sb[vſ`70.eCِ6qL8wS Z {x<]DP(lQenѿ*&`X!0Ǵ9&@po;~}"z$̈fčsn:X ?8g2MnƂӸH'̑tg;9hb֖obO\YRQAp{s-Z(%?GJoLf 6:sH抧BN7qd3 /.yVb'`0`p.D+FJQ6r=<\R7ۿuE# >j B|ݢ.dVmۼwgm{tqXd H7mkYj816O"z9_8nOK$ʏšA`~uu{ﶿbOWv ??~bt8V ubzlsbg9ԧPY䇖u>eJ8LwbcDLdcF?d.W4pwù'!gl.iE&wGLG:z[dmNIUyj1eOxVg5A q rhhivDL^َm2^ ;[,yGx,:kþkԸ=1XkǛ"w{!ͯ"7^y:zK:yk]o fgclrw$'2r+xARu hJ`F`X aBGfIENDB`gajim-agent-irc.png000066400000000000000000000030611326020644600337500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/categoriesPNG  IHDR szzbKGDtIME 03aIDATXklUߙ3^\,(ziZ(  &Đ E1`4 RbXi)R5bXjrmKQv/sfenKNs|}=3n2}fxGm)vtEU2UWV133RcJ [>X8sSM|Q_2Oo999Լn'C!! DP8ͬvo 꼝-\rOY9r箞8 &!gq5ygwOUU?`*q@ EpHf&ܽ^}J0Ư,W]\4'Z1!qh< ihjju׸mMIZ!u `1CQfN7)R셪R= D!w8p2>\%py0T'O&A |X0~!!V z>cع67ȎBD9zԫ8nA;'{Ys#GbcbF$`6[aJbނ|EMŞ^`ƌI-]瞓rB$=m6j*( Z%m=t0xnWͯ4sgjiEaNgӜa wo؃^"33}Gׯd[>R=c]ܯͪu|!7͏$ .W6np+~52^{anJ)eŞhN,*Ż-^ocIYw"#$9yKhAZ\Y{7i຅Tr/=:IENDB`gajim-agent-jabber.png000066400000000000000000000026371326020644600344300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/categoriesPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATX]hWw3f7$1*&j\jLkM"H@K@ BR0`D/~`[Z+(XZ($$5ILvݝۇIv7QfgBJI  Pe7oS wPw=k>QT@b X}}dKS;q‡awO  vmڛX@(B@pHdaɫ77wu~U   g:qԬEY5 .xc(dIaYS@O@oݵwmm%a&+ _T /]Z k@~ŀ復VXojt I5+T-g܍-`3NI'NKs4,Zm݀Tl)ہMMU56DT:ϫrԨ`DCC@jMKlfOk~,Hu|`1kYYХ\ Oe{z L:9uB{*ӂ X3} IkIENDB`gajim-agent-jud.png000066400000000000000000000022501326020644600337540ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/categoriesPNG  IHDR szzbKGDtIME 0?JIDATXKlTU{/:QP`,XG$cec\2&f6ƅ1 .tM kEۦڦP-eiq9.Zý)t'&I=pKw>{]Jo5ƛR1?>}C>^{2yZ=g,tCǿ*n]q:OeRKP,e,G*I"#H!hZg1R)I*eDWJV8ƺ5砻2:2V ]9 ̕`ߝR&6e t@F\3ƕAۑ*#8oB@ _d߁4?X]mh70.'xZ)$# c8o_ k;9Ȟh'KW/J8ZZt Q=U=Dji\dH:xddȌf|@D=%f'qhmmu<2 s^v~34?o!B΋9`JE qz{Nkڻq%-n$7mm{󹷎5L DRc}H;i8 ߐ pUhO1dNXF7DO&R*}Ee۽h'(PJ~l%T%RJσPo&D>ߞC)Eqfv395a:|1߸Fsc3boflU; v|x ie/B CrvVxes wǏ,+]ea&btt躑esl]ǿ ˲4OQR_`6ޒVF}I7~iY;4Mt\J^Z΂3iu]} ׮be8,;. m+6fgg G”PW[GiI)/' \U̧ "L ySSTT)@)>m;\|rv2==M8QTX[zbgEpa<bY#|B%,& F /#ٶmKd8k,^/ݾ T^+(,,"2ffff!RJ)}bb?S$q>RJ 0>@ "%0Rxͷr,˾  !f<TRʳByԝ_< 0X@,ع8Wn =g `: !4^1O\\)F5Zm-vIENDB`gajim-agent-mrim.png000066400000000000000000000033341326020644600341420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/categoriesPNG  IHDR szzsRGBbKGD pHYs  tIME'h\IDATXõKl\Wƞ$11 q)JZFU`Z.@ ,X@H`R M B< ̢E<hRiLxC3hNgI@>= 0eUզ&"b|ni-4PB AňvU oXß6qޜمY/'bT6BW$!VН*Q⡕Т)L1TU&%y;*@zPkԧ)*ikq' ޤ7ESˠѕc V?2Z xj)Ȫ`6Ȝ@HHM[Mf$̈́A9`{M/9zczܸB5a`Җ8Kc @#1mc ;zla .aSy/Y5s  º Ֆ,fCܧo~ù1HuO$L0Pbeox>1*oge&OE ߔԒ_ Eي$-)d{%!=慩kzQ(aZЫI=GD#f\ܽkS5ŕF !A,沙4|Qo iJ8?;vzTW Xń(!3d$c1cnD5ܗNnEEupHU6B Hm>=  'T PRW?y8 pgWfh<k Y?+E4IENDB`gajim-agent-msn.png000066400000000000000000000033521326020644600337730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/categoriesPNG  IHDR szzbKGDtIME 0?IDATX͕klWه_Աv: NJm URw!Cy4)@H(| h&B4nCɃq]۱ٙ>x] +{{9s\܄OVPGF+e1!қ=GKMo߾ܧQtMƼw`뺐'"Zݓ8(-&IV=iCk?>ax=B̢0%Bf65R=sտS,V!|·;ӦKHtef6O[{J -@)1C$Y!,btUS;o)tGS}P0Qa qM:hU ĕ =iӂ*}Rq0=[ I\"iH3 B98BRB9dQDv REQ_{uCa)r(C(U\$q0"IDʡH)rJ< ~Ͽ|4mh1qȩIhNJ]7ޡ$myPƁr ~k|2~b0%rQ3:Ūg$bp$%gYtv9C>"<y" epA)C!.E] WR#KVJp&_i* 3M8~qpQY'/z']c]O>"5Дy{(̳~C2t~)ۑ+pt&>@mڋ~oݪ@ڥˊ UBK]9NtUy艃VM Q(|dQԷ>cg(NJ.9G¤g_TT{j-9_SO"r#eRsL)f%93y!xV\yZƲ?Ԡ*}L34@2+"ihԨ3\K=ҩJ0؞+WV!\/# GI4E*ҕ[ u {75մyx\JA)/bM *ذ&(euL[^_ho1zv(a ѱy^3aH$LМK(zgq}΁ohӽ=c-w1WWJ ƙgYD<ļg&nԫsTcS& ͚)3T5~xnY9XŧX[Ʀ U&g0M$XiBQr꿬)$4_ 3'! s4*û>'/ 2pm)Ce}gGsokt]H*?/\%pˊxzofJa$D4f!as*ԣ"P^ NKfr~%W1A)K`$[`/l {/504og=}ڰ^[^"2sTtsoM&n*~p̡kwAm϶jz,;R' Z U޽n.,i͂(9sU 4#Y{v{ Ws`xvqv?BA YdFȈbƲk ˱ܔr$IENDB`gajim-agent-pubsub.png000066400000000000000000000016771326020644600345060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/categoriesPNG  IHDR szzbKGDtIME 0?aIDATXMEU3;.ٰAD0z3 1:~\Ԑ\CB=E{ps!x22x$&!YE4=rffg{k靛>(~U{u3o%Р`QTdv`;;Hp~u(Fjkr'|I@ǛK p{RQAհ`L倩J@)XC`-*JV'jG?uqEMkAc.XҺ3_/ ^Iz^ě}Ը73l[UfMU1`UPgCT@L٭հlh8j%HTڼ;w}k <4Īh }ǴG Z O֯-ڼ6$+5K 6%9""?p@[%ʍQ<DY_RE5kkn:wl&~}2wA3V k53_s&Gz`Z-pU)x;8kGNU?!ۨ2@P > 5/\~(>9pa ҩOho+É?Iw"y*2<G]ihݛaC!ܿނQoF%Y(5?mw 1Xhy$o& votl`Tn؁eL"*@ "ɾ.١T]?IENDB`gajim-agent-rss.png000066400000000000000000000030161326020644600340020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/categoriesPNG  IHDR szzbKGDtIME 0?IDATX_lE3i-JQ@EQ#_`ը5/Ƙ($F1ш#( F14$HUBնTݙݽțܝݙsGY%09o,"F2M.1ػYҲ?}qrDJ>k%ZDZm9Z'L^KC'?W׾4>i3HAD1P'W2uo2#; ܦy#pX5,X;.[(IJFX n dۑߑ {U&^HNizm ,$RP<U<U: \e :y,) δ-]*@ F]q+cDWݏ= m+3x`$؃smSHk#rHU58GWEyswYk[ E{ئm{ pq;UP 2R JUyw~9{b'.lf+ 3_GW&x[ ϣ@8 18Wxp+(b[!WD;Ձ3W~"]'6- x\mEO%@=jlM4T z\ z8 lQ [{<ކ{7A%WLY9m_ eK*xA`Ove]",΄Ÿ#[0M[{Ƞ .ڈ3cz]a^C_EOX0KW!gO棆U@]D_=g[$jBOl:%_)Pŗiډi|P87>7t#, ]lDG}H1dg A,θq>4$,lo:ruK0_8S+焒owg!d`Zv@"AW0v٨oZK;eP.XAdG'y{tR9+:oA00U;}kĽT'Ѵ*C'"\/X5?G Rp4Ii+eS-AMřZXpF`m`ï2C>UD/5Y#Uz]|BKu6bbHvT RwNQJ1"fvGxum.̡QO1>װcO|-Hez6>dR=j9/6/H <,@/X`ĀvAPWN"{h (j;k?$yT`  ajXC GvnWW4Й0I޹n./$H?)ߚ wc߱.wa @'Wǩ{swo6uY@|ُK~yIENDB`gajim-agent-sip.png000066400000000000000000000035511326020644600337720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/categoriesPNG  IHDR szzbKGDtIME 0? IDATXiP[B`#Ibn:صCqILB~HS㤁ĭҦq1!cbcl .ehy}`IF }9h}w W;S]ۮz2ˑYJPg g]Yc5H0geZ!Gy2nz(,7TTJ)EA齥&9J̬%ҿ܌m[ja2`]ed8ZQZ@kEBUUdddB8NVQ`XQp  j.`(bwtƔ@4UUNsIlMMMC)FDJ)B<^zOD/X, r`0*B @%1JCJ%|o^z^;wlYl6`}1Mxk<{ BO"bg}:gyA\J{ I!$ EERJu1=<>}sV :;;~TJ), ~x\FF`|;<hpeqW׼(Jә/^T.,䮒!2 )HOΊ \sqN|źu߃-g-؍6$scOI"xi+**a˱̙چ6It?bƍE/ߐY, ܺ<шI7/ϟj*oFNHTmڴ)%=+s({uy5(/u$  b7N  cx]=gߞ`~Lucu'.kI/`sɶ_1[19dY( xA~rmX,(DB2d9 :A+$t@A00ߑa<N8]GȺUU5ɑ 2  07]vPJ8@0>(D* ;`oDf%조_ 5ng΅ (B>ZKIENDB`gajim-agent-sms.png000066400000000000000000000017451326020644600340040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/categoriesPNG  IHDR szzbKGDtIME 0?IDATX՗nE38qH(nL"JJ ! }^^R cO$Vi>ݝ3\6Mě*̌9ߙE-'WA|yWDF'h@ֱ>@'^-> 4 ;;;gWƊ3׮^-Cra6ֈssXkzNVVVȭbmBGxxQJBkiܚUWr ж~յc~uW>=Dr;GD#O+zp؈u`㔃zL3ת b!OHS}3NyAl}{@lȲwx;Uu1qQ#A{(:SȚg@9p}sFGGQJg{{b355R R\.s''MSk4P..B"BV9ЌJ};yߪTlni1>> 7n|J0>!333JL4n"F+$r8瘘 4eum?XY&?0O-J$ rtcca?d(7B4˜C$A`eiiB@$IsssS9jGaqqLӄar쉊{@{7Iz@>'I'vFAۉ1 Q1c L&$/HK)QSTb/bw8~SlO Rs]k>+xhkbԾ]{&Oz}h]Zm9~Y,in}@8;bJ|IENDB`gajim-agent-tv.png000066400000000000000000000013761326020644600336330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/categoriesPNG  IHDR szzbKGDtIME 0?IDATXKTQ?ͼGH2,Zl.FA@H)BZ*#iQ*pnE &<}ost9Ҍm0s|?r9 hGY@wwۼ{嘆]Zih۶nľ-蛚ͻ]8ܽ;)۶1z<4|18||`y7A 8MMM8}_>[(aqqϙyW!ih{ffxT"֔<=gPrR2Z3LY@[$[uLbp7d@TJPJjBս*y^1ޔXhC ;/4W7I;84v*Eʶl ,1h:@@(}AmcPJ+GXCyb,6b޴L֙,-05Ҵvb9C4}Z  Z4FHR@gG:;7|#x՚..2 BaK3 w'ּyvߟ*d=y*rd$ں[Lrdoܚar_`e뻚UoI-^h,}`*t]l0j((tvW];}FIENDB`gajim-agent-twitter.png000066400000000000000000000025071326020644600347010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/categoriesPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXŗ]lTEg޻n[jR#DLJ#ѯh@ILb0&B T(ф#/ix 6%J@QBýV8?==f ?ВOxΏ/#h6_}羍@ M5;6vo0V wl?}7_aޮ^p!d8YopYr~35"x]X$s14(*0BhԲ%Yҝ9%P&5c^EugM(b?1T) 5Yk33ŏ9BAcR{ `\ {i0B@HAմ>Qnsjdl33,%8kj8S9pЌw׭v9lVA5iEDB5y^׍3K kGm7 9k U_3@r%2ŰS33kK>v !L`fq !M"+p0)j 1wfe3&4"6шMB04\Bfz_ PjñFHSh݊ 6 nL mveHA@ u52xrywmC3`N"6ͰK Bo=r݇~8{jdǾ &0#RAEmv$߾5Vuw'g 4`aF GǛ҄z ~.L=uC_eعgIEf"א,Ehnϯ,4u|0^}'F/nL )qqzwݞ!Z[(+o!OάшokV7P)1nCʫ9lSV)0+H)n$^0[{Ff`+" %a'E!iVAB'cشes;]߳T,LW[ ڳ*edDaJw=^ڀ/vP9 <;,z]K{9fvOT̑AAp.w@qVB&yM\.-ԺF @`2Q @ /I URjNg@*0@3tS+2# =S\5ʗq8IENDB`gajim-agent-weather.png000066400000000000000000000032611326020644600346340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/categoriesPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<.IDATXkUk}ι9wf;fLJp1%AMLl:F$VRB !}ljmSci 6/$Nڦy8w}{~~0NXZ,Xl׏s8̸!h'P;V1B[@v&PySMM;ӛВ#\*+-0}=p܆GƂс&Gz="]J'_1Ĭ dO2ܘ\cӃJ<ޛxlpVuLdH,f/ x1v89HAn"^H} \#}ށɑK*ʢU5oW5kuF8}Yɽ 45^!dPřӛNA"K=Ey-fJQq) ½k3aB9>=Aet>+ IeQVA:Y|I1{7 VA,'S>N(F[U7 pjJ,LRp%9BAqeȘ;8LxlN[$\k| @6_dl+OŇ` kḟpĻϭ:>xɝD"Qc0 `&ޣBSBOL 3έS-t`lJ3&W0:4IBPA&fq#%h`nw^|[46n:˝$zq?W^f˚ûyK[!l;*eYvE}M[: QKf>?ra(Bh.+q\D0̶[J R""H)AD`f03RBk c ,3ŋֹۀKMAHsj >{?s{q 0Rj.MS03y`-wKL4Q魙iA!E8FERJA0((]]]H8SRsxhf?V>cO< !$ 8FXDWW8OoV~rϻ?& dIENDB`gajim-agent-yahoo.png000066400000000000000000000030561326020644600343160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/categoriesPNG  IHDR szzbKGDtIME 0ڀĩIDATXm\U;3vk6iZ"RV@ERRc0FCĀ_ҤCbL?hA -! o[k؈T]vKwܹٗ3N~0s9;9>lM] ەvwH'bZK**g蝪b[6FADBfӨɂ>H?hs1 1: Rz㈱(BG=e׉~6 *! ^g0bؒAA~3Z~s{# 3:z~A4R@q$cԷ徳 8|?.d-Ic"} PZ~Tfl < |xq.5 cK}+'%⢈9 2 eJs?hkF"='Zw,ٓH+tv'^ҋf:.A 2b-le\GY>DD'#Syi7S~CKUEگwn⥑`1L&ZC`d4^y>2,Ϥ$ r:j>_]QJ[Zf+f-ͳ(47*ϛK`HL4},* 5WB ('ͧ+~RTm[*aۖӤ樫{_+%IIv. -ڄbPBMÈ? JR5M7+cZZ'W^.Rm@leğp%R_@iX;}?H Q U^]tŖeԜ/DTbT-E$ptp{#(7xS.wefp 8N2=eu @,βo^r[UsHg9jS\aG\xu*&zn{O`;;XŦ)֭("ԬE#r*c8jӯz@Eq}<*gq۽tdFpqFkZy骏M&@48NgQyza> G89 7qU&p̢t}P gl<7|Z۟O9*÷O9yz_p͍2[-[KdRc.M~'̲'=L5 3str$=HD1W[yڕ7^G9{8qY~vʲǂ ߎ>ƻO\o0[^U{kW&oqU^ =PdOY'|$b[̮l8'+&z ՠ-upЙy1;B9v1S:r_ 7bkHm}af8λc򠺛s|_ @! \VknlTEBto|FG_` *ӢZm2yE0n}r |=,? Po(IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/status/000077500000000000000000000000001326020644600275615ustar00rootroot00000000000000aim-away.png000066400000000000000000000031471326020644600317220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME  IDATX͕lW?mϖ[(0IY[Rmt,:̄ aq鲘jLHLTٌn\PjRҔnn[n{oGo}}|s?6q۟b4Xٟ^e~|(ރX)- o_u~)7w9]V#`]G$V7R]tlbd\-^GZadσukjʏX2/gæHM'#oE9ݰ󓉾:yg<7d-ӐC OKzkn'E=/'yU82L*[UF/FηZ8j{h:"_̩^;9ܣObښ_14mT?;ύݵncۦđՁoq03}0bq}.dGG.bHïa))k QazO93_􋍔IxmN骘_e@@P[azl~')K &|T3f[͍f*1[HCƉIENDB`aim-chat.png000066400000000000000000000033701326020644600316760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME IDATX͕PTǿCpB . PubҦNf4Lbu3G?4OiɘԦmm.+K_V²n`w{@@NΜ9w}{1;߼C>"UR_׾n]?נY"w:#c,M-5 `]T(>@4U@x[1R}FU:bq䏮nqC;D1@QaMM!!t(HyBS6bK@|a>.Q^V, E|~Ap wtuu lx/ %%uow.Zn2RsJ,n,I$Ir1J*鲲Oք'T`$ Âay,CEȲaq7lM*U}ܚi"b4 R<4@V~VP>č6B*BCÃ%T ÂiPu$ADpG?i곇*Av4.N׷t,@"D_6FS!vWTE MGJ[6WTIX5@^^S+μT2fFҫ0AEy%V?<σ@A ~#l^$飯5|bߏھ2Jfz/Ǩ/AZ'ߑ17!)8p8:HSy D t!ij6uDžO>K_6fV̋-^(==W$<ĠE$K+6oD%`(*4@/_x M"(Bf(Y ,bjY(vT<ɲ{rQ#~Xw6zffDDij@!F"?Y^TmܨL&"ed36{G:qP:ɸg ܹs]`q!e*P hVNxYmN;(Q3_w􌌥 ˏUiq+ vDm>~`}A֠0c1 % E ~t`V?9GIENDB`aim-dnd.png000066400000000000000000000032151326020644600315220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME #D\Dž/IDATX͖lTUǿ7:#m)Ï`\%VlDeݬMm] Ԩ"(ۘ&+1٘M'Vf,S23{޻?fS%'9/{܃kkC[Nlʠk@bzT#W tsݾn:%oՉ)@kKSW 5o^~%>5~l9{x̖wP _tIv?U $/l.쟯tRhE‹N[ P }c7J> @fTv ' PUe9 SI욯?nc#^іUqjbso:O|-x ?{*e$gOgPBcv."y  {oW<@Ms" x#+XWw\cʥ0I=-\Ut.@MMOP{( ,@i(0;@VR(kLC҂#tW$U@.ϽCh, xp!#g&opeC*ci&d Nk: =u{{r Ƀ0>Sk̛'ڟEiMe͂a UW7++ w˺tp\c(d݂pe€8p J5oa\E( ]t:u:W]͋%%`b==68ema0 Yn@1s p̦ \X͖v/2 H4 edFp񙕸zc2σwW8Ey7brl1[$tM3 ^5 (6i$ pX9%-X ;zW:EJw$a8n7co)s놺UUPMˎ,e?`UΒ>ko2VO\ر dlDHIc4/[Uyee, de׋g%d!S`+֬)qw29<O sb} ˲SJK=+W:n7`$ix$0<3`er;_`X ǝ^/%ӶT Wi@3?{aĂIENDB`aim-notinroster.png000066400000000000000000000032451326020644600333460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME '-GIDATX͖[L3 ,{awp1f1ˢ8qkY-GJ>ҨUD5jF}*Uȉm4 ^ 6p;osN. /qHѹ3|كݞ3*T)B_um;vB \:C`jܾj }QHyzճ SH4,TN4HI T,ÀRH$H4o1Zz{P*ÂC$I%p VOW DA\!Rȕ E%=i=jryez> EJ%Ȳz#b,N~mJEyO.eL &L7Za02:! }  W֦;=Mtl Or\xNT ]:K&Sl4CTǰ#G s;Z]?ϞyFyezp, ^Kk?">BNc%>G2=>HnNxsgOץi,-/RB(l6qᝋh^SS4gs˾tAR?NUuHh0=s kp:>dTdd2Yd3Ϥ1gx1~v6!bA(ZVEJag&SV @jL7G)G PE.G: [X,B[TUS eM 5ՊylRYe,+1`% C}s?yMUPERH:S_fS^~]VeYf#,Y@b=љLƟ|VjWq s0,({wwq:7ϝ;WUjC]ݔ*|,@S Na]JzrP쉆ķul>u7g!2xCX-ƬAHRxp83zv?M‰cGd pu0|y$ԔgY 9y=jd-E|P՛?gBoO$\rB(Ԅg'^7aK"Q/]9\6s?:;0|y$'Fb­[(C%'|^7f!!4 xbѐabsmmmUԠV/%)noQ18Yofb@G1Rb(#O̎)kҏ;tv [c˟3bS?LPZAГ>*1DYzx  1T\2Z oL<UX Lffg3r/bvu ]](^]YFbA֎f.P.N߸95VNSTb\5"AEivZtk`V_XIENDB`aim-offline.png000066400000000000000000000033231326020644600323770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME uIDATX͕klT/{?v6l?vQԊܖM\\EJЦɗF~jFHT9~@(&T5\p0?ڻWǽ3^&EHG3;so_<-Q?Gr|V _*q=D _KXo@ f/ulB*@"dk9yP, W;;;@Q>c H$ر}UW'@v˅h, ^(uPBH&P!|c CuB@)]u@īpLl\Z>K #y#?H[L%(Bt]GY6^&}XY6nure2$Iɨ -ߺu癞$qoFpx| puww[O<-%% : 4ǎSaqpC ͢ u#pơgٌ&#% b@ 8zA5rs6^j&:>||h-E ܵb;e10ilvK D d2CQS,xt755I!`t$bqipAQ8뼟ߢN=V0`  F d5#"Hƍ4 fu]ߌr$1 1סfT!y!!ӣ'>\+x#)"%++W$==QEym/Z(%}JbsgʔJ-R6E:F.nǶ- w,Cܶ? mO .o2m>_\DإK@N xp H552ڞ4{/77?vdn[{&@`k^]Kl&wh2$tV?[puO9|ggg¾qx,-hz0gخ]6V'Ϟ:{WBV$o`P  @%U36[[k`,d?jZPxj&V_xsl)w=IENDB`aim-online.png000066400000000000000000000030371326020644600322430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME IDATX͕kLWfw h46jlbZ$4jbllmDMj@k&TaaaȲ*cfaB"%IN=/w=F̜ :IKN ߯*69K ש 2$pzdzeE0/#{ɌhEr5J} 6.2ۊn3UG@C 8sC(m48޸)-1>puL:~AJ4 fɚG6@T5KL@gyp397.*gգ `봶#K:NBmQxa6UTopnff*HqiٜNV7= )K(o#dz85=+/XRrр(< w-x1,X01Gț)c4̀O ##Cpƒ1n@hJ*EΫXU)sWLwWU\ 0,7R}䟕}A ca, " xy A/ϳ/01† D}ys4'G4C|nz fn LA.5ҹk GL`U+L?QQ~(Rx< Phr -HriX>!]pYpX>]]a<0D7 M&kE^,c;󗫹ޅK0@vv$C"li\M d]ܲeK@]60RGosA (|@5˷Fx iƩ.'5lIk 3cQ9KsN%LJl/ޕ‘wۙ8( ː!MI tڱfy:s^WBX-[0?''.>>Ƣ'?PF@)3gC ^8m!x-/̖[;aS#)hҧ;n$ 0!Y(:i07=`*f=7ʻ[(H'jMxfYS%?<4'O,GcalB!]7?TJh`ׯ) J?R~y9npRQ@XZEk9~JY88k,kmէھLF?!-hiMMRN&ҥp>M~ d\Uwc1ioؠO4ocp!o.={U=Z#k"d4s*J6n+3uv/L$J'5U--ϣGg`s~z-l),R=y4 ^MOL ^| ߆孭ĨC/(Ц'&n w;Kag6EuJڠ'_v@Ƿ oڦS2SO-Y+*R$lSW׶2;b/^cϧ ahtJJ+xfžxRh2?`?g_vL" !6o=P_4 d^@]%g/Brl Zx2myB|XbEs\[ݻ*kQIENDB`dcraven-away.png000066400000000000000000000034431326020644600325750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXŗ[UW{;0õP)r+X(@mژJ֢1J >>T/>MZJhJA,w8esc.9sk}>s)LGh&srNo-s2 !҈M({='+6h'RM w|Ώ+R}wt魂~o}um5?_ܸ-eLD{[:j 4|wWo `߫-4Qb|0v pQ?~f-NgrbyW҆h[ 3[>9eL11L0ƯEDKwZPʋV־% ֈ+ĘyԵcI#&H1n&L^ (V]+4H!b'S `+Oelԉs9QFZL8؉i7(WFxqQ6…gQC]!L0Z7gۗO_$pQ'6F]8{ gq.Z})759^pl I<+[vn\ f"&0g ˝x)NcOʧ76&geAMzw~Y|˦ g% `ov6sgC4b۲z~'3 bfC xy_+> Q-˳K$1ތDôܟg030 y4,@X(_bb%) v3 "qVoh<iDR]z0̤D(>!%2xLIL (岄ršl.*ežo@TS܌n"R*ޏP77C8@<83 9[LH>m7q;jFz zmBܻaO1W(fIENDB`dcraven-chat.png000066400000000000000000000040651326020644600325540ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsRGBbKGD pHYs B(xtIMErtIDATX͖ilU3λo7  a_@!,lp(K4QӄV TW!RTRДM K1%2asjlサΜ~q XCG:pu=?^om4w=7.nJ=ݾyON=@U92%ë`D^.^fUutOX|p\]]th^DMe p#U@jn M `V|LylDuj-m޼9Vd9zVb;vX[lrTxcz|劕S*U Fpro?]q Zp)k 7(Z5s`z u1c,ȑkF Ƃg':\ʼnGe4Dѕ8)241P\KH"'3H ᩥE4)H`>}T %[`LLòyuسfc R*x#+q twb^-z_<P \KR&us_ĢOb~"!sYgϞq]޺ikըKy;IWir"J@*)㛐+Mxgg^Y*,{)b""U"f,6{TJȍlɘp<2AJ!-%%OZE~=nذ{ >(g=wLZ @2hibT-{ ?vtt|˖-#+3tzg,C s0P ^™ߤۉHO]R]~`x( )1%РE s#BIϽn4~U*vZVƶ 75%..~ RȋXp=r7m:Eˎ֘=Pg#/4imڏ>;ۿ$҄Y,yf Mp(" oR Z.#++ + ?Z1qRzvDv\ S ʹܾ:{L~K O}svޒu~7pmFB ө?ᙁs55-mN!U@u E6[`ja;q5` ^K7st!u!.;q3~BHs03Th ":rB2 +cE@_X)!Dc޶ʙZEx+'=&5K_8yUmekMAo V-ⵈ;~a „YBh>DԲS댷莴_lMf`Յ6Plz~">}0'k%Z/%:߫$F캲2 oPc}{ a!{=\W=kp`u9҂!P rX@݅A1笹@@ = %3E0L`2#5=fZ`Wdd#)>D  <:.2P$%!n(`^"Gz<#2 ܀eL?2ct7#u9ɻѫMH8qIcvū ~iO–qX^ -=  4?t4.`0LT0ȤH'>mH+xAP3 af $8L'Ie$<Ӎ +n9yz{`@$ϋ\V`ag0 F9hD]t˵4 }}q;fTO26,yc ixo:YjIENDB`dcraven-closed.png000066400000000000000000000003611326020644600331010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYsetEXtSoftwarewww.inkscape.org<nIDATXc``tHW\KL:ڀ\+FGeBqNH=41C㜐 `8G`QU1`^IENDB`dcraven-connecting.png000066400000000000000000000041571326020644600337660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME ;'t߫IDATXŗilU3w}7W؎@b JJ* JT5jZԪjA|C4|ITR"%UJp@%`V`̝3𮍱,U{9̙, ^n `k<%CH;tfsnwo^]Ī#5iLŹ+#ȉo+NE:v~k}y)ސsd=Gm( _(R@_>7@#5q-z򡕦002VFAϕ LzBY@U҅ sxb_hEw~G5ΐ8{=38g 8g α}]@$ @w=6&|*@ö=Q۰tAUquD ѬtTgB*x 2Q]n#106ͱ2gF'[}B4p9qԔ 0uS04]5 \.T89ch"~Gb6hyٶx'43e}tuBYclF*+\G;/e77150BDp#.0" y{]Z֐. b=:59MPg}ֳOORadE@ Fh33LCg',0tѲ[?s/ jY:s>$):) I HDJQ-H)X c}8?s:)w5B>4']]R.Vkc&43c)NiSy q0np @HkZ*׏d~0[6Ƽ{yV 8D8q)=~gF`i`j0fbAjnG@i(,)7z;;pzQ:LаgvC>u@~R4>#Sјҩ1US3y}q_}eRIENDB`dcraven-dnd.png000066400000000000000000000037051326020644600324020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsRGBbKGD pHYs  tIME*rlEIDATX͗m>3,;/X)Uh TmU iR5iimZmMmRZB1YȊ²06s^6bYSL{=>?n~EZ>֢j12@9²mv&z%?)W:"Gݮxsa`f&Rw;T#fo/QE _XxK+"/ZΖQz:61DnGkȍarc9z/=(7 ɣ} G91Ml$-w2aƕJQʏxGNDQ: wS۸TrJsx$ԁGQF)?QZºI@e1 Ԃ!H 2ǸY"{Bg_#֌b4Ma ֌!6Wch,rEiyx%yzth "u/Yq ɏޚJ<}lsjcujV#0VAb&s[7}[6M״S|,leb)~:~Ȟܵ%ud_p?U;Z? _zwy9>Nps݉RyPp2&CPH dy|ufUtoZ>&vu Mر~R\c/l{[nt}' avZbL Kwb6wzh}uxt]<*N ܵp~gg1sh#)ڱJBh& 97H:aѲ~n?"2 Z-}_oWCw?l6z +Beފ`uh_?#.*IgQ߰ԑ!>h8E.vt;8H||'M_[Y{>PEF)1 "ƋHV. Pe PJk"輩p7@9N/^ew-Txa3 X9sqOjZd>(g}ajؑБɔ VcHE771`ȱc&74tZ'j m,h^ :5u _^U 8:i4lK& N@C*u]==O8޾F>.j[k_&/J,eD)1ciW[ҳny@yp ֤nX ЪlTiR'H-ɻnѓw_T'3޽~JFjS윎G50jo"IENDB`dcraven-error.png000066400000000000000000000035601326020644600327650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsRGBbKGD pHYs  tIMEqIDATX͖klTs޵Ǐ6 i񋖂L@!Bℨ4iUJUdi"Y:D(~(mԤ ȁ@@ih`ގŏ]{9bJ^itݝ;7s?/y?Y&WaCL''ڞlL~y` Mࡃmn8]?(x[CJ)$SzY03L@8\fƞ=X<־77 k~Q8p?dS0 c"6""B!X?N%7V+WH4L&uC4n ˗/(dp—>,Y @zEM|=7 rlˆRJd  ҇e - nRB4tMb35 ^6 M7LM::6ʆa@)$""74166ƺoQO`C*ʥcBA?^*HB:93 ]fŅy9@@:,ܹ~pXtV]EEAQ\!~|Rc\bT+K/m;q2ܰ0m5ZE0ML&N/Om2`i5;j  /NOPΝ\BMsp{D  d2ADO pp __bLe}y_XT bh'8dċC8 HAkk+ٿiGASg0L@J?YVZb4 m#9'G0:1Kͤ (NC _[ܔJ-rө?G^o_ͻ~'O@&iNdΜXg65[n@B)ij午~ܼ2@P]UKS)104v]4,\[HODHoۋ0+*M ՞NgOvyf#eiPȯEetA@`*31/2fF0ˑ@0v]p%B !iю;7n%c+ϟ=Çuy LNNnJ%qn,F14<8 O>ݻR _7ut(r^u|4ziA7zg09)32%9WY[W^ (Uuu>EEiQ/}X5yA&{/aաPk:xt:>J`Y֜y9 (bx:xakE X;>H093&"g |eAfH)Y}]cD ݸb<}&)8xvC}}nhmo 8PJE4K0" 0r{{q[Z؈==p>md"ϑ-=D{qrťիp^$wY^ @K$܁h4j[ˑf<b5/} n ɼhMMP;Cb7m|uK/U^QtDqq1 Äa ]GvhBNX755G"_ ,۾C&B,(zuqQ:@~_bZ)dsj;&.iIENDB`dcraven-event.png000066400000000000000000000020611326020644600327500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATX[OTW}\Q` ѴD}(MۤMcSA" os_?`jADkHƪ(M^fh0w`ƌu ᅕe_RmKolz->O&R*}Ee۽h'(PJ~l%T%RJσPo&D>ߞC)Eqfv395a:|1߸Fsc3boflU; v|x ie/B CrvVxes wǏ,+]ea&btt躑esl]ǿ ˲4OQR_`6ޒVF}I7~iY;4Mt\J^Z΂3iu]} ׮be8,;. m+6fgg G”PW[GiI)/' \U̧ "L ySSTT)@)>m;\|rv2==M8QTX[zbgEpa<bY#|B%,& F /#ٶmKd8k,^/ݾ T^+(,,"2ffff!RJ)}bb?S$q>RJ 0>@ "%0Rxͷr,˾  !f<TRʳByԝ_< 0X@,ع8Wn =g `: !4^1O\\)F5Zm-vIENDB`dcraven-invisible.png000066400000000000000000000037271326020644600336250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<TIDATXWkly쮽k/zY^6 c 4M4BMHT"BZEFQ#j JTT !ccmwkwn6kz33:s~sg!> GwWy9B#1tljGG*SuM}UҰʾ gŌZTk׿8-]X yN#WvN,e=?AV2fX7Nq4rĚ-#pt7)VYdSۯ@U13SDxg ?p`X['-02kLx.S|F4UyvhIV.f*Dnu^tXAKAr#}Z\7Oi37Kʙ~s[}0Μv8J! A)z7{fXV|ӆ{* eAL0+"P;}æ<`3`C*]M S=0?=NU"`F ` ,,ȕ>8vƅY5\ !,E$>̟;SJofo<1=D`^GmRϚ]S] \K}~9~2Zf}W{jъLR7M.K֖wn3` sx=jˡ"}u;7n^?.<.4ޠh~w.D0#Sl1o,f fU6vjw,oMڙ/D,eX"٣bBE?]v;j } V"l8 )fT}vc%Rl,%Bܼ9%wD;>*RFtb+5}@Rw2 ]^]nGRKg5%aidM؊Ol 1n^o@dlt+gy+V;yv"B2>J`
[Z ~+‰PF؃U6|iRƊ'0,ÚQ9?A8tDM٤Ҥ "M&K,Q ˃u \r5S~NJO %JiM"Y(DK!x)年\suSEd.b$3!b&/[.TXT"Q]Tpd`oȐms!FD!yUFܻ3sJVK*Up*nUN!D8OezZO\BOgDv$K#㿶N (`&l?>@) E9;00ۄ %&Ur/J*ˁx:(RL3|N!kKAo?5ܽmj,~GzDd6ZOZ8ao4XA\󆗍# ]vr rF@ \Oӗh:Qzgg yf>>>p"`Y"aZɦr]ZjKl+pzw >;i>z?DW|<3 [EMAbb@FJ$8rͭ;nBs^+5<3c{׊F z{ \G6:2 8IENDB`dcraven-muc-inactive.png000066400000000000000000000024121326020644600342130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYsKKE{tEXtSoftwarewww.inkscape.org<tEXtTitleGroup ChatDftEXtAuthorJakub Steiner/KIDATXVOH+GlYS*yyB"h/z(R+4 7)9=CJN OmCxP`f3Ӄl6XY.XXXJӴym  d8777H)=d2lxx q'vwwXX,fi98 %ymc*! B! !F:::5y moosޖ Ϟ=b/1llld2jjj*;xJ->fHI)rd2V⠠T4P(v8D"Fys+RJ:0Ll .l!Yɠڜm9rE?{5 -Ȩ^2 -S5H zSg[o^pm \!䱔U_:."R 9!6Wo2@\89eYVM؟L 6* D(iX__wBB[q[;V1k~?Qc2w Bguk{wwmR+xt]??99yN !pssӒ]"ckYJ \]]!J!"m#`vT*8;@)|۶AA,Bi!BbL&er9=J%4M QJka4 a$ 5R fY_]]mP)XZZ:k!bqql6;500˲ׇMwJgae-qT4 ϲE !WVVVx~"D"T*vV;8>>~U. |t a(@ qh-VUr~XHz;{ia [,E^Ɔu{{: }S,%^mAKɕ1V*B|#=R~WV_W*&(l~ovBy cz{X }չ1x:ls]+ip{ J<.SyUKQ^IENDB`dcraven-notinroster.png000066400000000000000000000034761326020644600342300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsRGBbKGD pHYs B(xtIME,fP՞IDATX͗[lg7qbq7I}ڠTU*ԪH <R QT TUTP.*֎7ub;ٵ^zoݝ~3m:it曇s~9gN82 _$% -*?_ F{:!H$Ȉ$}{btoښyx "TH/lͱ^gȧ4͈/&iӟ߂B<_4:0|? WO?f0 MӠ( }?t䌟ޏ}0Ntt)hlvUU( 8W_@sc#cg/ÇA&A|*˲9c dty:BVuW./]Cbvs!)%D, cLOG^mmEu8EŢ}2qĦf$z0uu(--l8b!CYY0&&xUz*d, %#{Q%<σ(//G{['8,e~6G]$Iéq)샟%ض )% @Sc F/\0eYֵT쥱;h9r恒zղR$f084O60)%$8;zjk! ĕXY^"{r<}6N4{#=,H`^RJ7`1B[k;'  ϣ"Tdr$ ehlh@}}=iphm76:U ~_3-;^o]F6SÌ1!pkk, H%lF:F,G0hc8;U(M}#;7!g 1g@"?lAg "TQ!@Ǒ@of@ёWzsp57 X^YqJ@.G0 c*hjj#G1vq mm)L LzTUUAUTB!-1|.\B:5pG+)1KH42>13 5a )\v "I&|9睂e+Kׯu\?{˷hJ_ Wz_k"lU- w]NHWSV:yY{CU076< o; &32sk L+; 8 r9IL4MQ+<~XtYunU8jl.>fK4MH$A,7@e w=8cSk(1K6o{~ F.@Jyi-AF@7v/4axv} ; =u bBn*X65IrQ$U1((ضOLɯSWD[k+lۆepq\HCthCӡ*TUE @Pח7f-4 V{VoW(=Q^^AS  0 f: =UP-Xqm y[ѧx[]&o=p@ۺV4Ѭ(Z(͜#0VE0$>?Sɢ^K&`gvm)=FV+/XbIENDB`dcraven-offline.png000066400000000000000000000034361326020644600332600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsRGBbKGD pHYs B(xtIME9U]IDATX͗[l\Gƿ9s޳kǷ㢺&:(ڸ⭨qnN(D$ *U#LAR^TBiS' QЇ@8vk[Mn\vvn<쮽1m#OsV:s<ȧ]pԩ&˦YQJm؈]Y/k/ïQzj׊Ҙ.7|U8򩯴4dϞQ2a1,ĝ8~79wqWW HdW8RIB@)秡 J)cqhm00ZVK~һr9xJ9Xc 20JlƎ;Ԋ[ֻcaPc c 2PJA!{!g]@J )e%>$( k8ׂL0,@$(C,Ӓ[J)(UTZ+haʲ,Bynoߊ1B Uis)%,z!&F%k9 wo})JmF&e `37n~,;L =ܾ=΄О]J1?ϗ.cskNOMLfff k wCu6޽wo8<ߏQPfq1ܹXa!ĵ_C%'}{Dj_<ԡ7vo#@)g{~q dhZvuuafvּwAo:HߗmѣG211w֌\I  H@ՎLƃ1 @2D,#۷ѵm-_2ؿ~SӓH&硍!lRcj( 1zMX_KjѸBi6lA`y2lho~uGb~>6((4\ϭ"vM͸N<աss7̲DX̂m<~}a.w9sF,׏~ĎFSm]F13; 9 ,˂& L& CBX,h cc"JskW %S뒙wtmxb.1xUyA:s?x 2*W6r\q3 cE *sbk6@бݴuY1,hc`1 Fөf% ( (?oԺ9d*B^U$1 "vd|Mc[1H)!JfҿPBzvb&U[7`U}1Y׭au'u`d|~Bdsy!> @7Uw={䑭9uk"6(ڬ!FE N _ZY֗UB/RߌE?V}IENDB`dcraven-online.png000066400000000000000000000034351326020644600331210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsRGBbKGD pHYs B(xtIME*tIDATX͗[pUWk>I iJ҂0V:0:q-bRdl}C}J[:8>0v@JGh HH${HNrn>rb4oz]exNDT"" <%zqDܵv,Lo®]%/nYx'S/-iz-u@Kw"⣬j YxwSP]F8:&#f f0͙@VDo魍+zӀ]+Qe% ¶ KNZ1ވo}jJWVkE$Jr*:qrQ'} i$F'a&ńgD(倲PJ0a7D-Fh5R9@pcD(]@۴@LߡL8J bL82"Hԓl ]`"> ~p]DGJ1}*4۳So\~/_(A0 02:r/ N|s૿u?kٲI6UWԹk?ϲ08i>l?2/숌ڱٛhDz 'xŢkx%]N;ʻ֣2ƈiASX=-A&?p:2򭽛3Tָ>Ȋo'Vu[;1fx6LqfNWH9#3k_f)ϏnNYA$8^eyryrJO!nS]br~fB8h_;R=d\Gs{kjF=6'Qe'9"*="Li>Ej'ŝw +m06aiy:ש 0n}5S0%\ppTy^}7z%RP~TuH0FE9#rU8vLVMQ< pʧIRNPAI-AVTWRd$>9ǜy [xVjB0 &on:1?m(mh1SH43-LGlc ̴%ٔ MEJi{ ˆ.cm_r,^Njxa`Vq,`iW)x#aQzױ.mMDe'-׍P#frE?/b+db}?’x8'&FgArjtMF+Q %50tEKr7 3i07g+X iL'IENDB`dcraven-opened.png000066400000000000000000000003241326020644600331010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYsetEXtSoftwarewww.inkscape.org<QIDATXc``Q0#!)`ʵx`pjbZ$"BR7!0qJ*`Q0 n0bIENDB`dcraven-requested.png000066400000000000000000000040121326020644600336260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME :$bIDATXŖT?fggfgwaaWtTZ%"**%XukϦ?F[j5MckMZD[돚6HAHe+²̲VX޼ws=?/l; qr* l 9f[s۶'w*b˝R|Fvd=+n]m&+ ;Y?{IqqGQ)KxoFJCw-_4W7ojS/oEGm(=Z/"negy;ɼ7}z"a;fοA^tx* RDMԡt ;Zϼ!PtL$ı2ݲR݇RJ `;A:Ht-JP*-nea儒"/D-b4-ThRxGnDƓVC 46tP*D| 2"LN(es1M[.xso3x7BƏ(drlYtC8{o.y /g#̚&hι3&o"~qy Wӳ{7̣/_n׮]rǽn=EQ}'mޛW,ici/vDvYbK _w o޵ V.}מ5g"2OiO> Z@(eXujj1nRf0Ǚʷۏ #qXN%7]Ym8j(U Zz{v7^qb+op幖SKҘN?W>on{`jд.ƍWՆQL 3Z6HDhL2\eמ d2^}ZFG]D Ώ;/LT¨1FzZE3>53XY(a#'J۟ TKk۴{޿zl=.0ZN-Y4/N&*W YRIR^V{ $ CByGknt- bCc uر1cYmh=4i~Z  )c,[uc,Ze?"cJ-9CRL^ LNNB3#.JQ*bweHk_DM_JJ1󮏢Ϝ:x&7SN`ۑ RCqcn-:x2OR܄< 9v P]$t9!Lvh=&~[a%܉pEȾ@1ן0 ]eis~:^*6 bG`DuOsv8Yl3ldsRG1+W=(:8ri;\߷ADIyv?oC^m|[b;{IğO@iaC~tmҁWEbsYt]:Ex$ 7uuGMU%HbRv[TW64 2oU:Y{`MvzWW_6mޜ˗:'TilFP?O4<R"ZZpV$sl.yry/W&Ro xU;v$Bx߫3i"Llma]K5•l 0ȅn*EՄ7"ĄK M$(gTL&3R*}Db<& 2.L+Lfrc;冀X"A4:Qҗz` :u HP8SkԙZk'xd<Ȉ'4g%Iꤦ:`d=)r>PbZ@F> .HaƓ*3g2855xWc Ib1A*?:u@E< "6x>7dvL9_-9gNk…a2tR%y*DR>O)P, BrBx'҉aI("7bOi14WCs"+bp7FE2|櫦НKг.L Ln-0~A0~Ni)NIIENDB`facebook-away.png000066400000000000000000000014531326020644600327230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXŗjQߙ&IkcEA^@D}/P|ҕk\(nj]؅[*Xm渘I3Mn54zru]DA'hJ9MԂX P %L#?k:/w 7 h^q4x?z"|UA wRo2ħ6[$ t,n(}P!zmaL|EW6r9{Tr<XX ](0EݬYSkIl=>XCm@:]WwW`ISeNWS0R_v׼}k' B1+FXG)phHXc1d#XuNJpp'OV@W]@\$9*b["0d  >'RI܆I85ѬgT62'ۂ@]E(p9%*MH5TBk_S@D8@F+UukR(!0_4'v:=FeNl7JT+QRe_G*^=>|y7-j GU><},-ƁK,Nv1h6(6_^ P4Coʄ<|/IENDB`facebook-chat.png000066400000000000000000000020361326020644600326770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXŗOhU?3; IZ⪱!ִ ɪ衈1'/AAeF*R.BՃyz _/5-Vg&C븺՛kT}[ HA Õw/|KL|^zBQ& %+pvO?&Wٹ:1`_rN^{_!Ρ.;S9(FңP2Nm|r@AMڮp8]0j٨)#8<]Gq7ך?AZ3(&ZQ3'DU-Q<{@#N \ajFQoLԉl=RtH;uF3^ٗ?ep+u6#qXވ"Zȕe9]1< jWk N<AF\ Z/Qo6bhyWO==s>`iHADKW:>߃#b˩E%7jZOö/0UEn\:d%} /q{w, xM -)ݷM&m9@qIENDB`facebook-dnd.png000066400000000000000000000014531326020644600325270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXŗjQߙ&IkcEA^@D}/P|ҕk\(nj]؅[*Xm渘I3Mn54zru]DA'hJ9MԂX P %L#?k:/w 7 h^q4x?z"|UA wRo2ħ6[$ t,n(}P!zmaL|EW6r9{Tr<XX ](0EݬYSkIl=>XCm@:]WwW`ISeNWS0R_v׼}k' B1+FXG)phHXc1d#XuNJpp'OV@W]@\$9*b["0d  >'RI܆I85ѬgT62'ۂ@]E(p9%*MH5TBk_S@D8@F+UukR(!0_4'v:=FeNl7JT+QRe_G*^=>|y7-j GU><},-ƁK,Nv1h6(6_^ P4Coʄ<|/IENDB`facebook-notinroster.png000066400000000000000000000017211326020644600343460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<NIDATXŗAoEov:ՑB֑DMH p*QAUik HpS!VR@B%@%H-mic{wvîƉ'd}Yֲ[/NL 6) ~ 4EVfgN0z8xr}"Orݳ ؿoX`hhΜ#o W;̵,,,"G;jɲ Jz8|u]\2;!+!o6-. J( yc ߿j\ AJ1KKKlN); 2V&_^wwhXYYqpUOL+7>byy8%0t Ue˼Yqwl@lv@2ށdt'{i㍽O9Ie>tzn$ԆK{BI*xJ`m2Z  ;㶇$KSvE}°@3( 7^{I>FZ(XV|{ LRRɜJ>X6"fn&L}u Qlun}faq_H}xkY E״B ph`uQFHRH}KH\I?/ {1IENDB`facebook-offline.png000066400000000000000000000015551326020644600334070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXŗn1LfЄ[酊e+T]+V5k^`!DU@%+kh,f2I&!i4r?k-NG<<0LZk~HYzRVg  ɔBD!"HT*% R{$` MX2Ƅ5Xc0P*oSkwcƚB! fp|!\]]jZy^ _}ZyةZ]xyt֠uNiE*v_ @$l7Nū$XHMnMIKȤ3\twfB1bq&$I5t,Mms3Z޵#jl'd66ҁN ܮk-7O8]ҔEѦʯcЁ7diH_f>Wp{F899̡;``bpxhܙ<4 Ng,jc}Uj:N-#*@jOn(Z#B9pŭ⫅ wƯ+I3 $&!ϭCł `akP)tu '?MH׫dյ7߾}8 z;,E` XP@ HG# `Њ@L >X'  n*IENDB`facebook-online.png000066400000000000000000000020361326020644600332440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXŗOhU?3; IZ⪱!ִ ɪ衈1'/AAeF*R.BՃyz _/5-Vg&C븺՛kT}[ HA Õw/|KL|^zBQ& %+pvO?&Wٹ:1`_rN^{_!Ρ.;S9(FңP2Nm|r@AMڮp8]0j٨)#8<]Gq7ך?AZ3(&ZQ3'DU-Q<{@#N \ajFQoLԉl=RtH;uF3^ٗ?ep+u6#qXވ"Zȕe9]1< jWk N<AF\ Z/Qo6bhyWO==s>`iHADKW:>߃#b˩E%7jZOö/0UEn\:d%} /q{w, xM -)ݷM&m9@qIENDB`facebook-xa.png000066400000000000000000000014531326020644600323720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXŗjQߙ&IkcEA^@D}/P|ҕk\(nj]؅[*Xm渘I3Mn54zru]DA'hJ9MԂX P %L#?k:/w 7 h^q4x?z"|UA wRo2ħ6[$ t,n(}P!zmaL|EW6r9{Tr<XX ](0EݬYSkIl=>XCm@:]WwW`ISeNWS0R_v׼}k' B1+FXG)phHXc1d#XuNJpp'OV@W]@\$9*b["0d  >'RI܆I85ѬgT62'ۂ@]E(p9%*MH5TBk_S@D8@F+UukR(!0_4'v:=FeNl7JT+QRe_G*^=>|y7-j GU><},-ƁK,Nv1h6(6_^ P4Coʄ<|/IENDB`gadu-away.png000066400000000000000000000037171326020644600320770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME  >qIDATXkl\3{ v؎cāTPbB *%jLTTA*A|UQi?@"K6>4$$1)GuO;sa81>_w9s۹ڭe}Y|'gGV궆6V_w|֏;ہƷˢ`<دϬ"5ֈᄇM;.fX{ˊ9$[-֪f7^ J@,n<߿}ghKl&V)^Dde*:|1q#p sݯ>2C["UUG/DycH> ֢N~ʩ;RS'/P𑅗_ͩȫ{ZMORwc ߽!ZP?FHVyx0%IqNFR'KTÕW.)%}vȢFN(ES[Ŧ?$[pq#+Q\ gz%ܷGYC&qY|sVH|ۥ9@jFB T9*^~G ]v._^D+x ޿Kw]HU@@ɅD)d^r_ =)#}|r51츃Õ5U.њQ"AlmBBI$6Be5lkZ:jus;rf$ے\q Rgo&yGO6XzdQ g$qÝD*Zܻ`rkLv- Ok%]LI%2V~bXN4{ݺ%!|'\6$p+As GzC4,\ozH'sAe`4XcfQG+ o} oAn J2db;`~ 6s}BWduD`i!Z ǻ>鿬M(5<%VN'ր1 0] Y%q.n )P%`GټUJ3a/BYV=;ypd L N"dSFuöB lNd9W/πx̻8ւx~b׾?9u n}/1T#P в.:[!1bI$-_͡ >GzQ gڴz﷯ZRsSx{p63"H}fxױbb|DVJW]؉btco[ Ԣ6~1 N|Pg2(+t@G+hxtn b }]VMB9vA kdz_C&9Jϑƌqf}nMsC|~ّ{`e̛ۍ_և)O#ASX/$*qҕ &h_VO$$5'fp!D*gdM҉zKq!-y ? ŊK:1`@*NmuY:8zEf|%e܌b@u)5f/rXwZ/Z;֗myK)J^j/37-[5 pd{yC_׬ ň?&Kf6cBN95TZuC(%Rkp܄m2LsUQTl"EDtVun^N,w'e$N#:k3 ~f2lD)l&L2YԱIENDB`gadu-chat.png000066400000000000000000000041561326020644600320530ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME  >IDATX{pow&BȒlP T"2tpA@0Zqb"2u*VTjӤzZAAlT4d $Jnr?v7y\s9~*JJZc. ` r%=&m͚5EnTjv</p\'u+Wl8_>硇LUTksCȑ#h,jFkm9r䰽|]ޙj^ַ֩*ݏ=r_Whgh<^?Zzݪ'{C+VIwoef0Baϱ>OBv,ѩ ݳPCɤ)(eEAkpT(y<&~{ZktkwQ/$`!`6v͜9xo|L!R ^JرUv_ HXf|g-_1|WceMDwa4A(Dx#:|Lz @axoh}w!1)qJ~}a>'yP )ƀ AIɦMU# (cfYDž[Ad>ŒՒ5l  ټ`\mmpa,)Z'6/K-x(rqpFF1zdub(Y4pİA'!0qDP-t$Y%`-z.KG"nFx'ÌfL~vj'5|bs xI0+!o iij%'%`St:5kn'w/`0*s"kxe wU/ISPdI~5aDؑľ؃)fo]]wO$r|9{ⱓ'_:tK$gZbڟ+_(/] +1Y]]B\iOBښ!\P8v3p-"g&X`da /z ul̞tg@%SJm0e/7hvF/Eܛױ݂Cmύ1ɾ}= v R6- <ظ@s ,R3\'ݹǎPR.<80j(GF"%B+Ekk+{zm[գG99kWzb=wh=W Qj uTRZFz{b^ U J8NsYY5}:n5qKvJhI^1$*"*)^!x7fH#ynOBJ:KDF|cii }ݻ+ƝoԴ8s ӡdDGCӟlr PNSI (?tyIENDB`gadu-dnd.png000066400000000000000000000041041326020644600316720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME B~IDATX}l?m/o m]"R 4J"3ز,cddK,sZʖ`*(q** (X}ϽsK_s{=;sI)1fptXS]R~־qm|cSMuks"<4U9AgA c.dR hRqg )uu 0it+5SWup_.DIT\b:H>^}5:SJ-3f/YΞ=92N JO=˩> vkc^Yre8^yuzF)Iʶ]RpW{l^q''rFp<Eh!Q}dfeƑ}l0[#P6o~]QLx4Jf2!|8M/AK2Ň{=Mpd2J%u֑s'O*6x%-HۋƎ5cCA =/XECѼg|Nŕ2D'[77'_ oq!78` `d?"xꇨo|g[j1d8Dx5^ 0HQn͸':+:}-pVVqMŕR@PV,^Qdye?^7IJ ^|{}ez;j,lY+*~? ʃ9xU'm:-tA[10X/4o4mAaG*| x4U Iʓ ed@ *t 6vKji!]%/_RJ6R{bOQ[j!C@'x6Iygx#P ;0@W*?L}D܅g+`-z;63뛐X B5?KaVmIlkAk(kxƬ 1s,(_8w7mBDXt0xwcc3K0"n4ıL#@96~nlۮx~k|̱l{1`]Ĵ*teb8^ߜWf僠w q+r)glIKK1uyt[?XeA>9o{+g=Ʊ ёo.e%| d4,_&MZf|؁jy}oXk)Q*Q'!^1:) YX17_xOGƜ#L RNcrcp|nc@BЉBK˙֕FZ+::V_4SxOzt$QE "_ՅxPI挌 dmU#PRyg8k F<Ԃi٫DZX?Cfw6fMpF hn׽9elZ|y8  ڂWW z2Ā>ƎBIߺUY =wbr:H7B̝5󝝴^DSoUTVVY@<χ{uJKf-@7YR_ɔjƬBčh `m@-TP(CLq4*JkjD6BwEW] Z&'m2w_g$Z/HDHc~fVWۋ|!92jy9;hukXOS\Y\/ "jkӣ==VIk}LHTNp|*)OTAk}O~cݐS^zК0ne̊yNe&IPOBR)wc|B >fuR_F1k1`4?L vԌ$}bw=jO_M'L0YwWXIENDB`gadu-invisible.png000066400000000000000000000040031326020644600331070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATX[lTxf|al`57* NIT%uP,TVMz!D}j6K#cQѦr5q&~{albL2YhZGwS*/U D\wg۶Ƭ8;}:y;QJeVG)0F)P(/V߿h1 .cJRsJW\?d|ڮ"J[rr efVJo{5ɆkcfmLYnQQxŽ#2ӧȄ]geU۸DyQ/%ߘ7ڕ[T^hw7'sԂJ yW]7RAڲQ =reCuΟ;W9wؓ~ LIT}k.[RAC軘J}J#Qyݜx]yއ;ӔjZ8z7tS>K I4ׁ$@WE(=/Ѳ#.C#N2ƔRnS+ڗ{ !^/D@ IO/WsʀҖGRs WVަwY,^\' 9U(5(51֯76ׅDv8>=Lo?&? ܧ0kCH^V)pFJK%mGg!9uH)0eQ?{CA!#زn"EEX V>l,TZE)#K?CcpIjԽa}TV.p 튺Cɔ:+ b)E({A)3ZQ%"=[C /GiJ?K~d2ܭӟBԼ=<Qyyr<ڻtēQtѓ;"2@2W/b7ig/fCZz.spK} d7&yKVA!ٓ>}$hn̞tvHsK='my{nFQQOmmBEA/-3ں0Z[:מ 'c;SUe[R8\>rnrt`Yl 6B|mQt P(?/Zk~c}u|t옫PeeJ qKza0$ Ky+E]Dgw\nk: Ŗ $ң~[xB p fmLY(77K}BZC4X y\ף \6rMyޙ3RFsR ޲yV";yNzгsPjkL)1o)ھZ)dYVce"(LMb=Toi6EWYc?r?e)M3J!O8wk}N J)7ID`FL\φ1*|5)D$ 6>t4Ň#KIENDB`gadu-notinroster.png000066400000000000000000000040701326020644600335150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME $<ʬIDATXO\?;c3 ~H&*rQ"Wj7U]zE+5.MU5jUvUUڸmd0c33 03ܹ.Pӝ{4}]GGggc-0Pׇ8(_AX}8)(4Ɂ鱴֦ 0B===Z̞wvhY[岳 ޾w]]o(^FkҊp8Lv5o+Z.?!G#wKhkk[OcW2}+w0ښO|5xx<յ$JtYﶜ; eU,GFF$5_kE,./On\E]sZ<{,Eʎܔ2z49@&G֖*|R)M 5}_ Vbt1C|~.o#d-cnn{_Rhj7sg#ty^y*.dm}%24bϷUpweLU{Ȳ; kOrʊ>Z)(ZqrtX4J㱣 q Wt&s"^@{ڰsoԄñhTkW$IXaܴ!Bq}9BWbڧ tT2@.WH$pt޾TVF+RiF|R !4MMMLLMc6U!Jf%J$ ܸqo19=KG{++LL8-`v~)JJ4g4d B ^V@ѩ3 Rmr LGLtRJRc1ĢuhY[]%W.z+ܙ\zS˜Bh0-9܀$eS},$ N4| Ms$^8KE| (%NoqRF6v"*Foiv BJ BNhM_}e_cZmwgsxTbS4<&/`blb ۶!ԍ Noق Kx@Gc_ǂctΤ +La&iPvҙ,c3xbZКxe%%\r\Xbf.Aram!Rw%%)$u5$RQL%0DGW N Sw_077R @kxBTB>IԯR=WdGgg' mChH.tq#~Zk') TW 8RH-.򥽎ohH'Ϸ4F"308̩MR',.-S*pl6$nP(He0z>S"RWe d2+kH׷ʋW])G!nH  bJl%%eb յ53\q^@ |7\ XBj]gK!跴kM@D+}8R*ƧmJjՋ⽑;?bGS* J)2Bi|8G}}7ׁ nݺ!Ǒ(iY65vU?ʮӛu8lz]jWȭ3 -g/B π]`۱~j`v("X7pB|[~sovMdDW)JXAIENDB`gadu-offline.png000066400000000000000000000041611326020644600325520ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME .IDATXW{PT{^vPeXV|Ԋ 4GeLOL4:hgLG&Z-PҎն؊kA`wQ^˲uN`aȺ&?zf~s=s;;%fs:KxAwDmӱ!(Ojjk, eyY``$ytpәg@c\nnuҶ5",+* NU֘f100CӍm^$If->~Z\VL Tv=oCMy$4QC{zzPUu x׾hNOO(NxՅ%E>$ 1o5=gyԩo?,smtG<^N8 gI KN<^7}|>B!(n՚NW'knn&e奰p\hjj<}vwzJKĘ_{g6R  NĚcryl6;AH׃/o~ Y՞Ue饺ƛ\h}?kοl\f ml&Y M Ec qXh1, ܸqQ1ƈcGAVq=Ax N;*ʷ!%%$)US@MӠ F|ðۓQVVt܇?-`x plٳ3{w1& `2 JØר(bMx232%1!YVT>fϋ֙^ĈF:Ob;QA~[8YuBD bժz.NSjꌌYub Ȳ([ p%L&p?Ml2xHsCՔђ>LAO+=ƨNMR\˧ؒR010Ɛy#Z.\Dަ"$d V[JY yK劺ƛ*?*++uddd!Pׯw7&'Ȁ]e HbeJz`J/^9S]66I0cf)1}: pB "g!`:Qgn!Ior/~.X-<080߼ᄏz!)AGYХɲsR@}}dMlBEQaX!)֭]=_} Lz! eK@)`UӠ;`jmmUn§2ݻwْ%K^ْ2+-F 8s2rP},&̱fAm8xwp8QVZ 3?f׍/Ϸ䋚-;488*'3f"!!P?D̙|36kxdy`@gXq^2::U{{\Q#RQYUAA\FnY Z8tbB8 Y؀ 磯]كյHgLфY䓳z=Ya6B'z=HI?9' DQȟҢ:^JiّьllvJAx=?69hz{z|)ҏ]QK2PWuّ݇:m̖f/%֭!I 5hM9p\dKaRRR~ÏW\IeeI=oݏp_Cag%!y劕t#!MG^xo͎4=%ٶ5q:.jQ ;v1?~Q^o.Z8(euzrssV["iִ֦ Z[[UBF5 Rptl}DMxMp.}? B= c m#IENDB`gadu-online.png000066400000000000000000000037221326020644600324160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME .tIDATXYpT3FI Z[`SSf11 OER)W<dH"1*Cb+fb3  I$h{0#,İDO>}N_ &I)wBk=o%!V)?bR^nZֹ걆:1 MԶ' Uʤ`PBz q1I Qz" (0 *aVXV77I9z(u[[q* vw.|MWgc#}A0\5jT^ic==4CGS_8 Zuy ??_Na<7+TDuS_[+fΝLZ9eZ{*adڵZ[b/؇*MJr,8mءzkOCx pwDm`.̀m^0httQM|oz `"1}0Z]BY9x/bT!Ͼ;c_ɸz´ŋ GJdL3BL蟠`4m·rjwikMC_-ӺD̕Taa}Bڸ_"kC'w&Lڣ?C?WH_23`Q2xyԩ>'|Y+m&6Ut1kY*wo0keMF1]Õ:YImVeVP67{b޼p8a?6;j]Pwp0]3#rraFd%)/Tpp&v1`bϷHB16k6Sޥ{_gc.0+/yd4\R+{0_TCc: ǎvNr3QYnS?eo*-5sɂ F#y=gWKg.9%1m`:φ| j|IDɳg/.׺Sck^]mQr8 dۈg#pB [[_G3"ԟ?/%#*aRjeaF;WP撒5?^`@w FCGGΜ :d)g?|o&'7WF&etD}>j7̉1's.$RsUf ڱkJ陙yEEE>ߏ !'B+Ekk+t)szeYoM0_GlJT)č?Z D,r+ކu/+S[ڂ#QxJR~!W m?!ĕn D)3HJ('9ƜQsh8J|N̷@ @;ĠagDW 3^үjи߿~2]?լvCuIENDB`gadu-xa.png000066400000000000000000000037171326020644600315460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME  >qIDATXkl\3{ v؎cāTPbB *%jLTTA*A|UQi?@"K6>4$$1)GuO;sa81>_w9s۹ڭe}Y|'gGV궆6V_w|֏;ہƷˢ`<دϬ"5ֈᄇM;.fX{ˊ9$[-֪f7^ J@,n<߿}ghKl&V)^Dde*:|1q#p sݯ>2C["UUG/DycH> ֢N~ʩ;RS'/P𑅗_ͩȫ{ZMORwc ߽!ZP?FHVyx0%IqNFR'KTÕW.)%}vȢFN(ES[Ŧ?$[pq#+Q\ gz%ܷGYC&qY|sVH|ۥ9@jFB T9*^~G ]v._^D+x ޿Kw]HU@@ɅD)d^r_ =)#}|r51츃Õ5U.њQ"AlmBBI$6Be5lkZ:jus;rf$ے\q Rgo&yGO6XzdQ g$qÝD*Zܻ`rkLv- Ok%]LI%2V~bXN4{ݺ%!|'\6$p+As GzC4,\ozH'sAe`4XcfQG+ o} oAn J2db;`~ 6s}BWduD`i!Z ǻ>鿬M(5<%VN'ր1 0] Y%q.n )P%`GټUJ3a/BYV=;ypd L N"dSFuöB lNd9W/πx̻8ւx~b׾?9u n}/1T#P в.:[!1bI$-_͡ >GzQ gڴz﷯ZRsSx{p63"H}fxױbb|DVJW]؉btco[ Ԣ6~1 N|Pg2(+t@G+hxtn b }]VMB9vA kdz_C&9Jϑƌqf}nMsC|~ّ{`e̛ۍ_և)O#ASX/$*qҕ &h_VO$$5'fp!D*gdM҉zKq!-y ? ŊK:1`@*NmuY:8zEf|%e܌b@u)5f/rXwZ/Z;֗myK)J^j/37-[5 pd{yC_׬ ň?&Kf6cBN95TZuC(%Rkp܄m2LsUQTl"EDtVun^N,w'e$N#:k3 ~f2lD)l&L2YԱIENDB`gnome-away.png000066400000000000000000000036571326020644600322670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzvIDATXåm\U9wyiⶕRq4lLBHL$ZBbKDhbP ICWY``+KKK]Z}?In29s޽l8!DJS5<}зuK̙Ӫ^ +KA-mw01ŁRT&mBǑو##ju+n$PF1 <،,XU amdžR X0 ԅJT#ì5ѱNc !QN^zCfGԗh`M!r֫z&&o/%Q[H_-){^ܜhrtܐpes2vEʜmkmHhS{;}LH2a CÃC^ IirsoGȏ>EDp.o aUTWꆮ J)wm߁- ] dh{ӣ "T4p)egϞŏ#_| 3a@2nғzv{ry `ÆntR f*U.V[zpp< 0~g0]0Sq&ytvvk5_ (>L)dPh$P(Jm!t Z (ĩu4׌gr^}s.7/ݰ{}w7ZP>@TPJȿH)zLmmm?8mA(0b`vN)0@ބ=o-3C1w .|zjP˲}}_ d-q^K\/^\+_D#ٳgnrr. ⺮h)4-˒J"'OC)>WT*r⺮A Zkq]WqĶm,KժT*Y^^r,rYJj5V⺮x'KP'N,L0E&[(PJ m} iT-[pq @DH&:uOk}̙3p:9?VED #VܰX,J>%yT{lۖ)kddC]0ZZZ<|޽{8"B,CD"aZkKOOOFp)iR;|b'R?d2}}}|~vHc\.8C^o(A Lfh-XN֭[v3ßmmmtiI}122xo9#@رt 庮(nu]\ɬFD8$I8DU@dIAb_p V:::Zc6ZM6yf re$h˲(F|f'L xQ#mۦ\.~*ttt0::J^kP5eɃj n^D<99n* R 4 T*ž}fwE<}Tݸq EAWn_~[nI$"\.68i6E婩Y#h fo߰aCjF7Dz, NH$XYYɓ' @G*z!355\zu^kGUmm۶/^7lskNL4NԯMlV]&_/KF @Z ]|zF8rٳg3dK\ZWWOMv"Ql:^S(۟]tr֖fk ߸qT__[m+cX,f<}8#RSJ٥Rr+333\2 >>ܯ+Jpȑ;wNZZZǏi599gffVs}Z/c`X -:V"o~e d>W*Sqy7W^j-FXx@=䀹tW£rx|*ckɛ\L"&‹95fԒ/5%IENDB`gnome-connecting.png000066400000000000000000000047231326020644600334500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYsetEXtSoftwarewww.inkscape.org<tEXtAuthorJosef VybíralxtEXtCreation Time28.10.2006H/+tEXtSourcehttp://cornelius.gimp.cz'ZIDATXkl\>~8N8! iPD#"Z!~ 5U)T(TU[)-** i vįڻ{sN?ݍM)I;>4 b5J|G cX)`80lCGodMq={"e@ bUsX7xhއi9ɷ6`4U9R2/_ީ^0F9Zc7 cs@L>ڛx ϯc04Ơa:y?W1rǥC.l0lIOMjFa"[,G}+; @~^$kבk)҆ьhMW,m%)k 4%Xx)-k@=QگuO?z?I@K DI}  ŀbJc"6Q ~[ZxY˓K>pxHxdhmjhB %HQ55Udp+PiRsH&Y%n[WUGqmB(5~xJaI@A|Eh#ScB Dهmn-մ4 *Gضqk[ڷ?*mݻ h[؜ %1/ f`,X֫p -CԵ* _Tģ6o&0Ip B=|&PM%akPS)0^f-nZPڑ4QGR[r?a (C4(06B]|4U{& L%@[rHUaIX@ǖ8ĶB LiSqMTaKpPhxifn]X)M5URH$b MYq%]h \);P@k|eg(KA h?E;oKM)&! 8aHsy;C |MWx@S 4 ST!Z$#̩.I\[\iY)h 5Ų$MQ,]PMs}#*y: 9DFu-X[gFˍI``2[ؒ]qTsذyuQ<_#q$%e6:T:0d~ec2Mz$3hVtk4ڬaP#5y͵9?c^S=KQ 0Zb8 a$a|M 8;2kbIs '%U ǽT~ɄKĖ!}>-x֣OH@c!%4D^XLYVG{SH>4X#xӲQ9G3LTRfŒ~624'&99Ǻ$+ aiēٷlDuKlٶ`p<7h:n5d MQT/kdz'cXRX$.ڒ6)~ _MTy=*{4zhg22Y`4S QǪLEJ@w-͉:a[?~z x'Pxtb/=m}vB 4Î{nceģ=6:yhZ N@8͚^DzjQE_39169ͩ}tyB#7,۞]z !Px{=ů. ϴgby`LB>{'ntg4'3IENDB`gnome-dnd.png000066400000000000000000000031251326020644600320610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzIDATXí[l]Gͷ:q(4HEιY}sfϚ5sR˙8@ ,.3RclWs@>:T2ɫ5Wbs1Nδb:p>B~ys?z{W⢔>(`ꅗls@Hw"=px<7=9h󩧾 Ƥ;AD7 ?|pޚjx- ]/px,}Uc-|*f !r`̞00'E0$H;?{&'lZiVcDcVlw6նA5s?佞ndlz|br((m;iZMC=GJAp堵<t5|+23W"\][[k yx<2-$›xNMĞDgˆJFDT(V"J_s}@ 'g?gZJ#>-`6Sa} _<{''4>P1"0j"Ģ yu%տP)9 `(UW\v5Em?vLm,>@?/--G;9[WfQ*xuچ fy~5k0*P՗ -fTi}ި"VԨ%^ׄHw#a`f~ώRVq*ƘOI QD{F9 r OpuǺEsEv焦=zFhvۤyk~-kzYyQb{^K7jYyx;μ_}11[ {섥3F.q,p) w+ЮӃ5֘&n/ H6kpNi\옉U_)LSE~;X׳3B`B.WRSO%\JU_KF)yu^Y9 _۟|D0MDPkhjDȢp9N?wug[|Q.^3aWΐD$Io]%4w;݊f+_| '}Zuf$)Etĉ){ʻ3ʭ 'c`d+,,+;%yTwz=ſr}aK \i]x7L7s3qA(g\J'n;>:WS?W\8Mm"Qc(jS-S(,C34+AW4g><9yЖ'I*^Ep=lމ\_6pz9bi@/fGGGO;vL9b:Yə; d@_Fo)1A&;iK._.{(.IENDB`gnome-event.png000066400000000000000000000021511326020644600324330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYsetEXtSoftwarewww.inkscape.org<IDATXoU?tJ)RB xI"0gN3??)%33|~ 0[ۘ%ɔmU,F29O8&LR|=; >9g?ennWffD#,,k9@;;;Ct(J&jDGt2,7z{8u$B[yp#v{.dpϏպiH$܎PQQAW<L/fg 4xtc G&S]zXlDJ<`]`]p)vq$ 0>gtlh$cel6T !$^ {Ŋ[I.W%iahxZ(P q<[̱N'@m9>Ϗp!'P?<tz JD|r"QD;^-%{Aլsy ;Bm655uSx JV~ 䱡-U^IENDB`gnome-muc-active.png000066400000000000000000000020331326020644600333460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME !sIDATX_hSWǿ?ƴ)@AX_XA&:Ht/*%1= BY D02(yrL, ,q611'瞳MڤY sw~oH#FCCC\.5pjsyw8yXoo`0JiSNR}1 ?sֺ `@C@)Ϋ2{Rc _-'ccc<^ ?>߿f4R/: ߾Ahd鱩`VȖ =Kq@s'J fwŭs(,$I'._ϋk:[ȓv)@)[͝uJuz 6Z)شBXR@@jN^J "l:[nT i&A!kpeaffq4MضW%NL "H$ "=u*&uEoyi"NRN||<Lm+$xOX:V}v~~Cz#lթ+E7ݟ8{Z`6L_*Iet?|>_XXC>Eo~^էg=_s\D^hW prp8YTK-Ӡ[|^g^._}m+ BSl۾ s&!ZKԍ֯OR8@RUJW%@rFStvvsss|fFtD0uwa>}9˒2 VXb:pv 8bL_\BѩҒ]zQݽDP"Jٮ @Ad4}SvUu m#X١:v1'˦옗(7,k KлdBBIENDB`gnome-muc-inactive.png000066400000000000000000000017761326020644600337120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME !sIDATXVAkF4,ohR C_=RC()!R989l{1!%罥? ǰ*b\[iz$&i9`x|Iݤ$A[[[_iְmSclR+I6|>BDspqMD`0QJcl,c^4J)l~ $Ip]w"U loo(Jc8Q Ifff0??GZ_]]5(v]WWW8==0m/)vCUPJj)B88AU4x\HF(LRQ&3q&$Ɩ S|yc < $T JR لI D7#@cTUE. vF*j˔DH8??gggg Ȳ|8X .Wbj^i0IeY!NG Rf|vv!mAv#J19nnndx.$IB6nw$acrpp8 b68瘚c rĒeNZF0 fYVb\ X,~M)m}}=jiqxxط,GuOTտ`gggEQUUzGJHDt:*!@u4A|m3M{q~*Ѧb~scRTg2to<3gBA¼a VeT.K^# # |(~"i#mjB1i&)%35IS$;s޹ˇϾd4Ǩ0{r}ް16w꿕u{Ml7𞌐(^Oaki{zcnv驫_ ϣz%1c$P%d Y>Ǘ{˓3/qw)Rm#^W.s M!ҽ `tM*%R1`x p Y/cbbòҎiX302\&YAzqwKE21egvqǮa P*Ze|"SsDh^۶B)6np] @`), GNCƮ;W_gD|Ɵq4kT<A DA".B!Ѓc-4,Di_@EQXZ㹣/3?_嗿xG϶;pp?Յ9ˍVBUSE4p/'9~_@B=";wgm,,Γ$Tv .hY"f`Ƃ85 # M @U3caR*fˈ`5 H4/uR$Jyq,')O,Ȼpx[dnVlg]" bUk%M3"qjo=oIR9<@Exwt3sm|&" "?qk3q&;ȅTܯ+ޥ=kɉ0X\!.( U?GL鐕PD= @+ch[KR%bQ Yٿ;nޯri%͆SMI׫ o{3#jU4Mʈ׾Kޕ"g!Sw'qg//xقdÔb`i%MqıУmi?O0fGX{t^˭JQ y-CzvkՠYq}/T}0k+sB0Aύ<0kWR_a妫JXڡii4Ҋ ɦTN٧Gɳn~8WTҊ+!k@^1ͻePKH1'/R[26/zI}Qb(lڨTIrB:/bzzfX5ؾeJ$CZ]zT!Q,[_L?b $ID6RDmdGdrpC[vz,Q"AQs/mIRN/BMM XkO9n7UUU|`u3Jˬ+ߏҔQc.n$iZVtaI$R )Q,¯X˰GXa5> R-3 BEVzrpC P*]ccWR*oK;)´> nܹ񴽶r @ȍ'wj{)^.^ÇMwBss B @g$B[[ nZ[[>iI tϞ=9L"YbR C`lpr#c 覤Nd8a(n e)xk2l{9߿@(zBc@0<<8/t)<y)׾~}IENDB`gnome-online.png000066400000000000000000000031701326020644600326000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szz?IDATXíkl\G9gڻ ₠iVVmCEA6*@H !J !DAMmᢴՋҴ-'8^vv;ko;ޘ4:::3EkM E!W= qmAw~&_ .U@9ȓe0]xR^<՜TJ%{h}v%c/} Gl쏜xOK_k,&(E1A^L(:ȉR^sȳޜ]kW]bd3|n ;{ajAx䝃_ɈU1:}nYyAFڞ/{X{(<lr֒/~]M AҪLO8B2~`f⹊MAfV\=sۍp.se+c;'(@"1J9,# t]ޮ/v";P dJ9(%jZW;oSN  )*bGbl]qvҠFqWlRĮSBz`}R ^a1~n\#biH"."=ʈ㮕U( 0z+b @M2([ibiÕM("F0J+6MUb@%  %# Fj@ ARRuh+]П @|_14`A]32,@ɲ'Oa87FA)0fcD0@(bLlf%33@٢B)(tzٹ/uo9U5e ,p=?;eUbY<9uq7؆XjChG)bhQ M0l;Z~Hj&\넒Ύб-#`ru]V?{@ c(նt~?;5/'|AZ@ө GPɹa%s@V5=Ugp'ʉ96`m e Ծ8y'p_OS:OZt!\*>gॣOLLuy߻F\a2D9鳧8I.V] f ݻ_8r S2H:#IK;K bNMIiRYRsn|eבHlbcfUfSfKTN~:H룷;5QNsnzljJ-{w~OCBru IRϫ='@[+Sү&ΑO:-SKr|?uïfm.*`0 :n'9ԧ2~2~h#ŹP ܝH$^߿J4~ |Ԏ 9  ,زBF43jko4$IENDB`gnome-requested.png000066400000000000000000000043671326020644600333260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDCIDATxo?wfvgwk?$*5MUӨQ*A%^*!RR_iF!)cb^zg̯;]MG:{9GshsK(Z[d>jӆ[l Cez@DhFt u7MM(B@E}=2 bQC80 #ӏٙ" Ck(-a@x> @ra!kUo֪kS q#*z-a|4kld@J<43UVQJ3MNiKH!*LenR-l W(VbnqړGsj3 xӌIf]_*iDO/m-ltd2I$J(/尦>' sԖ\ KV.4~Œm;O v$7oH lkAՏjF,[ )% aDHmmDRΞaR-%ɨA;ۍRjdemRSNO2<<({allfF14JАJ"=BB#eMBok{eddd2ɉ'tڥDJZ3 Mm Cs ]N QUk{Y}saYǏ_=zr+ v8wJC)?D1~@ \!H)%cA)X͛7)9]5v]bʀq__o(&qbF5j!R /c4af@ІI)i44O4`F(bZ!O8!XW`pp۷.ccc|'tttpauZvZvZjΕrc7*L-I%le& Cb###a˗9s BcǎSOm!> l'4u?Pg]9?\8JqC2u_^I3:s92 {g]sgERg(_bR'hZR|;ǂPv]y;eF6 [r (wF ㏔?71SWu'ׁVOw3t.28Xj o>4M05pfj? *`b@Ñ7qznoK Ke;R>:;;WqE;;;e۶m߿x<4M2z/*.3mW xƀPǕOLI;CT5ޙqy&''= C Mc{/1kULNb Pj82JRJi  ۷id2N<Ʌ 9rd<n9 Wk˕pρPlޖ̪⇷"j v"f2Oj5LdttD"AOO<7 h֙y4y-UԢӬ.TRuxoT-hry}%`:tÇc&X ],L[UlzR.Uw=?E8FY%di;unef硳3ZtwwH$HxgGӋ\[.Sؘ7_ܐiV tuyM%ut*Q[w]HRD"t(\Au,ҲZJӹ@m=K @(jpO^N'bl׎D͓M̮ڷD7p2r`1]JiTwiU| ܊Rk /t2z4鎡趮.w)5LLkv)ޯ`\jģ;m$s'۴+;hJSyWKfm,sM[tU_9oKwD4^!TRyUʭ ~SS PJA-[ᗁV~գ6h}װcIENDB`gnome-xa.png000066400000000000000000000044131326020644600317250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzIDATXÝW}lU=9~ޖ*jAt*:eɤs.KY)iMdl3pS)0X^[(sϹ>XJݛ}~=}[Tb*LV:fyr4bZ"u_Ԑ+**/Λ_{Ѣo"t fD)"rlF4}*s֬ԱC<p|(Rlii^53q>HD7ׅ[s#[,Ӵ\~vimw=: 6mj]t) a` @za(08bȗG g"do2,/*!c (nصjgɑ4i/ڷ[V ND;mg]xD+`׆8_,n<Z;ʠ^-<ʌ 4ઘLW_?Џ:("0 BrXg *!N#g PO608KsVSО5֭{;:d=reC.Nq PU9#/W:::68xZa>ZZZ}v$xk>>tΉbh(U2_h01k5`f~eBshd,'X,y{^5?1 qCД xdmy\ƾ}5YCb0M̌;w⮕|ԙ uhhsU^sRJ>ݗ`x:ԟw6^MDϮ]W/\cci>|k֬Accx<ޕH$ ضm[cW_8N,3o޼g2t;L&s&̀Ӯ0fԔaIENDB`goojim-away.png000066400000000000000000000013411326020644600324320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<sIDATXkQ?oӴ=imhՋ^ -^<ODQ(Bf_KRTФdffw ^20,}oyU09T@jo^c0([}|fcr] Zzm300nr1cT\6wӰPně[e߭^uWyBW[ fڌeLVsmCw:%|}nIENDB`goojim-chat.png000066400000000000000000000012611326020644600324110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<CIDATX?hArHEID0b!hc)F( VbJMhFbbb!,* D!=ٽg;{in`|{{of$޻r' I?>zy+{"v3uu'Jy"%F8 l]1*2qЮ:-K\qսW9!dA|{,Y.9G4%"  չQr8hUc.{{JJ8ngSՀ}78SUkv]B جV@sF*Nb+ah(F"zZ* S-a3$x=bě#UI0@#\)4&e,ѻy?#pk4xF[.:_i. yoFpYamU)dʷޫ)!ftSDYcRcЌph®rTu9 ;׋H7Dr"1s%vpc[qPOtG'ܸt$1Vp Tr2;W9 Cw`U#TߓB򤐎s&oDЋ9baiXPC-PRRg"C{q]/%߄Пѥk!珥`Dx6:P}~ݮ5%5Hɋ$оdJQ*/n$w IӕZXz++n&QIVSoM hHLOYafmVmCwIENDB`goojim-connecting.png000066400000000000000000000022461326020644600336250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<8IDATX[lTU3g ,J5(L`DZ#QHxF%*A HRTSI[m-DЂ%R(9shg߇)$6ҕ짽׿eC7<75z@0H A ZiC~F7phO7 ,rps/|ȑG+lZr%DFyhۭn%^4fE-ՙQ}e2[E n^8Oe]e9 ]mܨiStixZK'*% dG c\lQ}}XO/2Y&dR""(ї7$mtJ&_: 7#pyPᰫˤT^G-ZpL[s)S>XQ^-V)9/Iz]2X;nS'WH>9+B֎3IMA3vH>Z<|(N,F0 kl\ Xxl=FMŨ Mɥ!gc X@t1 [e':b@_TrtY}: `,L)q\d"ݖ,Z;|~6",Cz - ҥ~@Kz-&L",3ϤҾwvUVWP4g6yxOVʲ86~VU?ȶ%IuuڹPl-Vx&!.X!+eaUTg!(s֧jj$IjݺkҚ5*_ f#].xrb媬Q/dRzk )B6Lt7ͭ J&-ߛ.fMքJ>|h ֳ*[h T(rC;jڶf3*LRЉo' c; bדɸ6eŽ(˹H$ohJ8˕$!ħΥgd}6zJ1Z*7NNx}٦w^x}?|ee5{Ur6u@`qmbsS$Z˕H6аƘ AD#Ȑ{cV_Xqpac18O{Eywxk8yG"RWF;#?:aԞSj7CQ$O?V,#[w@^A^Z2Ri*@6/^#SriILo1݇ChCmGh}w1mDk3Ҍ9W8!Ҽr?W=?֣F+;OiBhyJȻ䅦?e@`F~(F+R )+p1E3pĻ{Y73C*t#a msӡHOB G&#]PlA!4uUnc*=WY@7U+}yJt\.݅R,N GhUH(Q-4˞T.z͸p_%ƒ.]{f #"JLbPT4Zܖs_o߯⏋ڨ=kl^vOFjm](8RP]iĔH]ڈir|Dp5?||NJo(lW?;td*IENDB`goojim-event.png000066400000000000000000000014571326020644600326220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<IDATXMhQLTRR "ԥ ] ]Bpۢ;WE""TtSqTݨ!Lw]$iI2MM<9sIiUX#8<-@w3.! h6`ƪg "; G/aNTDjͤ8Loi0%Yy76/E8T nM40W JM<.̤vLjzǑ3Æ1Cn=ਟ} }e R=&09J}ݢ}oxSD ٌom!k ݔÜrD:` Ԅ!K y(J]쭖Jlzy"RHVքKl~ERcabE|PY.n`n: RjVY\7C ȉtL]πY_Z2RjvVvsXC*/DZG"H_}`p^VWVrD]&/!hm 4e*NȕJO(xS96w'*8{VP/JT`b"FG?2;"PY|L^3J} :D>W}$BfL?[} /klR= ; $XZ_k=qXIENDB`goojim-invisible.png000066400000000000000000000012101326020644600334500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<IDATX1QgoSNOlBI!XIG?JMa4OI,kAh01 "owI$4;̼!"ȳP%Vu~jۧ"y" uc'"ⰱ0cvO`@8t<p 'DZ"O;d2y2);l6`KD^Ѯvf2AAg ض#"k!3xBDZF#>d@V;yލ@"m ṡlOJ)q ?߷ JTJJ)r)F,u+@D ʌ-81 PdW3}PPZhu׳\ռ|IS߂bo4aT*@Dx`5a\3-v(˽m8뺏 C-$em2._yZVAc>lv4˞MQTE#6·%pIIENDB`goojim-message.png000066400000000000000000000021511326020644600331150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYsetEXtSoftwarewww.inkscape.org<IDATXoU?tJ)RB xI"0gN3??)%33|~ 0[ۘ%ɔmU,F29O8&LR|=; >9g?ennWffD#,,k9@;;;Ct(J&jDGt2,7z{8u$B[yp#v{.dpϏպiH$܎PQQAW<L/fg 4xtc G&S]zXlDJ<`]`]p)vq$ 0>gtlh$cel6T !$^ {Ŋ[I.W%iahxZ(P q<[̱N'@m9>Ϗp!'P?<tz JD|r"QD;^-%{Aլsy ;Bm655uSx JV~ 䱡-U^IENDB`goojim-muc-active.png000066400000000000000000000020331326020644600335250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME !sIDATX_hSWǿ?ƴ)@AX_XA&:Ht/*%1= BY D02(yrL, ,q611'瞳MڤY sw~oH#FCCC\.5pjsyw8yXoo`0JiSNR}1 ?sֺ `@C@)Ϋ2{Rc _-'ccc<^ ?>߿f4R/: ߾Ahd鱩`VȖ =Kq@s'J fwŭs(,$I'._ϋk:[ȓv)@)[͝uJuz 6Z)شBXR@@jN^J "l:[nT i&A!kpeaffq4MضW%NL "H$ "=u*&uEoyi"NRN||<Lm+$xOX:V}v~~Cz#lթ+E7ݟ8{Z`6L_*Iet?|>_XXC>Eo~^էg=_s\D^hW prp8YTK-Ӡ[|^g^._}m+ BSl۾ s&!ZKԍ֯OR8@RUJW%@rFStvvsss|fFtD0uwa>}9˒2 VXb:pv 8bL_\BѩҒ]zQݽDP"Jٮ @Ad4}SvUu m#X١:v1'˦옗(7,k KлdBBIENDB`goojim-muc-inactive.png000066400000000000000000000017761326020644600340710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME !sIDATXVAkF4,ohR C_=RC()!R989l{1!%罥? ǰ*b\[iz$&i9`x|Iݤ$A[[[_iְmSclR+I6|>BDspqMD`0QJcl,c^4J)l~ $Ip]w"U loo(Jc8Q Ifff0??GZ_]]5(v]WWW8==0m/)vCUPJj)B88AU4x\HF(LRQ&3q&$Ɩ S|yc < $T JR لI D7#@cTUE. vF*j˔DH8??gggg Ȳ|8X .Wbj^i0IeY!NG Rf|vv!mAv#J19nnndx.$IB6nw$acrpp8 b68瘚c rĒeNZF0 fYVb\ X,~M)m}}=jiqxxط,GuOTտ`gggEQUUzGJHDt:*!@u4A|m3M{q~*Ѧb~scRTg2to<3gBA¼a VeT.K^# #v{3HbY` rO&gDdK)IqCMs)1jx<~CDHnH$D$_4K{"r)[FCPVox j˽*6Ƀzc+`YwP-$/t:* "l0>whzƴZW BָR).h0JW#IutNi\x܏D"&c7=-cn;*Eq!|f Z/$- h0J !GHz,chY3>ݤOy,< ,}Uȿ= \:G"3x>-8d2$yjAq}3t.I)?D{Ѩ4d$,"w]; ,4b5/f祍QIENDB`goojim-offline.png000066400000000000000000000016211326020644600331140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<#IDATXAH\Go*>1}T D`kҠzXBNKXZj $H +Bbʽo $"DQض\.l6&@5xq T*ӃRe$I tuuaddtiSDBb= 31̌P("B:.<477X,z'"{=ƩVdqqg"3}}KKKߝ}+"Z?$Y]Hx1澈c}_^aJd lݮH^)vee4 ְj~+4pimQ)IENDB`goojim-online.png000066400000000000000000000011301326020644600327510ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<IDATX1hAwwH((F,[I!F J&$b#gH- enr;w-a D}e7;&aP##@#!v1I`o|"ڬ!ڈLUXǮY x lb py0Pi 4KyႦޑfg<#P+eMk.ـ|3-tJ1߂,=#G]kng*;߃qH9d28rb.&apd@' ~K %B lVai،tyQ%rm] T7@'|LCT(5s8#|AM*cTیv}ݹ%[5<j2@hs8`l&K@2ȽUb|"aHN2^|:0FxiQR&8 3!Ո*"5#ywEٛ+]h^OT;7U1 '4Eϳ 8qΐ k֧eP_r"U(j06amcOj=*ܞ$GφSت堡Xp9=WӱPj'IxN7FM  es IENDB`goojim-requested.png000066400000000000000000000016201326020644600334720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<"IDATXVAHavUd3S4\ұPŃ%%ȃS !’"K J"y򼂂(тMF3ov:.;afg!"8tL  hmm.0o+ ԛ9MDΔ6055i躞iii4My)`˲ [(&2ף PUU"J=s27rnvh4ڲ,455k4MCVMwwwwc Ԉȵ̝f33E 9QbGߟ*j v|#ǡʕ_$ B3tFGGaF\"^ fˁeAD]8l߄w !mll.ʁ׻ٛ QWH@ 0+;̌J&r. . N3_|*Z øg :fE&ϱnY{9톈 baa!eoy7"" FGDfybvT̂dd2y p8~_RXk_SggQ0~IENDB`goojim-xa.png000066400000000000000000000012611326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<CIDATX?hA3QQ BM ``!b/J`'(Z؈ZVMl p#|1 '<W"aŷ=6 |`TVT'$<`J6Ř[BGU.rcf\>&u.g"+[GG?QI1Q Oˮa Uu=3aWz/V]9o 搲 CVZ} pJ02KgtSB0VhAlvNPԺlg|$Rڀ#Vց?Qe))քO]u ZO}>oXutIENDB`gota-away.png000066400000000000000000000030261326020644600321020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szztIME)abKGD pHYs  tEXtCommentCreated with The GIMPd%nzIDATXýyPel.,"zqW-YԱ%Œ0%q_P+\3DM/XظnSZ5a۔p9=Pˉxb!]E~"NG:<ĒFW ԃS=G`4@~'?wPI܍ Cg׆h덎AwpoŠq@wW /8QX̯$" M/mݜѹw' 2Xg fE֞Ll&߄o 3,cjB4""PKt'U ނJ~to1FaYl;μWg틸r2.ݺ3N#(8 YOp4rD4&{yl_MOPgy $IQv-g}ۓ^."4>FLN,AR;*7+y,i\btѠTH E`R34![X:QdB XJ=oɺ!i")#Mc;ʷK r)^{{ wCΣؘ];WcU2Zqvl~q訩ܠcY*7YE+3&,߯M)7`n0o{I5^?bD,U7xh?8:i>/O'^XU fDnXYQs&>ñ"];΃KT "h"JABQBmRCڬRߋߣ>%NKrQF7gC *6? eNdue!sE& HID̔hP(, @Xx4J &* rY(e)lˋldV^]#1܁gbƁ]ڴrTN|Hy㬴LtN*^@N {n@~k8q6#8DZL~n2b1rZ> 'R̸xR2~2wn7{?t's |$V'kv1QlGxTQBd̄eʨ!Gc_bѕES-] ,Fa9"ȀRd3#*m^/0UU(]Kx:QƋhj;M)җKE+? ZX'GcJQP#Yoyy^}zV*dR9Aq_Vc>)>KLwL,`/Y3;Z1%4uH}"U|ManzpM;!g |#E>IS8G DPkEoC;bI* )J!+N_J`+doI<~>Kk- ]EB" :jɰBC't)%"F$(ZmBX v~-\Eۋ`-#5qzGprP񇊈NpH~B)ڼyl6!11բ eMEa0Ypt8Z/xFјB$4sI0kiM&)Wʾ4xsaJ3>>I Zd!7t9%U"ͩ矒ҼP0777YnR _QB<1c#UyR)\vv㜓3z˓&M*}-#HX5k222Vыo1݈$mȃn7|a4)\jfmr]4ҏ, ?}tZccc %%e uixZF&!LC2|}}}ip>\"+ Vv!ou:UJmYjbp8?M7n̿~z2a  LC4G$~pѣGر÷~֖`a˖-[488}-:H=MP?GM p<IENDB`gota-closed.png000066400000000000000000000006371326020644600324170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<1IDATXֽJ`߈XlTpJRK,FQaKK?* 9cG8H"&+y7̼3 I 5`E4BwySW),^0U{0Mt4j-@ P81]"[p7_$N0тXG%G2~V83ưU>15E@fM@?Ǣv8Ѓ8,ENA(3ojԸZ.$wZD+}Qs'N5xKCk?IIENDB`gota-connecting.png000066400000000000000000000047231326020644600332750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYsetEXtSoftwarewww.inkscape.org<tEXtAuthorJosef VybíralxtEXtCreation Time28.10.2006H/+tEXtSourcehttp://cornelius.gimp.cz'ZIDATXkl\>~8N8! iPD#"Z!~ 5U)T(TU[)-** i vįڻ{sN?ݍM)I;>4 b5J|G cX)`80lCGodMq={"e@ bUsX7xhއi9ɷ6`4U9R2/_ީ^0F9Zc7 cs@L>ڛx ϯc04Ơa:y?W1rǥC.l0lIOMjFa"[,G}+; @~^$kבk)҆ьhMW,m%)k 4%Xx)-k@=QگuO?z?I@K DI}  ŀbJc"6Q ~[ZxY˓K>pxHxdhmjhB %HQ55Udp+PiRsH&Y%n[WUGqmB(5~xJaI@A|Eh#ScB Dهmn-մ4 *Gضqk[ڷ?*mݻ h[؜ %1/ f`,X֫p -CԵ* _Tģ6o&0Ip B=|&PM%akPS)0^f-nZPڑ4QGR[r?a (C4(06B]|4U{& L%@[rHUaIX@ǖ8ĶB LiSqMTaKpPhxifn]X)M5URH$b MYq%]h \);P@k|eg(KA h?E;oKM)&! 8aHsy;C |MWx@S 4 ST!Z$#̩.I\[\iY)h 5Ų$MQ,]PMs}#*y: 9DFu-X[gFˍI``2[ؒ]qTsذyuQ<_#q$%e6:T:0d~ec2Mz$3hVtk4ڬaP#5y͵9?c^S=KQ 0Zb8 a$a|M 8;2kbIs '%U ǽT~ɄKĖ!}>-x֣OH@c!%4D^XLYVG{SH>4X#xӲQ9G3LTRfŒ~624'&99Ǻ$+ aiēٷlDuKlٶ`p<7h:n5d MQT/kdz'cXRX$.ڒ6)~ _MTy=*{4zhg22Y`4S QǪLEJ@w-͉:a[?~z x'Pxtb/=m}vB 4Î{nceģ=6:yhZ N@8͚^DzjQE_39169ͩ}tyB#7,۞]z !Px{=ů. ϴgby`LB>{'ntg4'3IENDB`gota-dnd.png000066400000000000000000000026131326020644600317070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szztIME*ӕbKGD pHYs  tEXtCommentCreated with The GIMPd%nIDATXõolgK{rJ-[Cf-l%c|%hbbAb #gsllck mmmp%n}'7w9s=٣F4`1.1lf"cfD8\ dx QW.0w 0&/ DZa >Gs#X[S΢%iMDw3$>hE{v/,cbaSsxl>Ņױ?OzOu؁/s)⁆6Nk+MM,X LMQ.=+9AGG} o74x kn!<+hi!RϚXDr6#;"ܞjN=ye俋Od] LN2>kr(,?zJ d1o@3>Ϸ:FsO<\51AC܅ N6+tBv*{=47s|9Qw&cYjJnJlE[u1ѮUΑZC EHMؖ#kKch'b##9sZ| ms+] ذ]XJx:6m#fu/:dnt:2m'b/B2ǏctU (:;yqBucTO˿ޑ-Y3?/KNEŹt3Cx.%|iUJU03f7_x/!og y0\!#| Y?UAP( ׃vW;W*n1ZG8af"4GǓP鵉hFF5A3eŦ+x8t|oBֱSˤ椐M)oqD(َf7%EY [ěX@g'ǔ׌4=IPGh$4ӳTp_I\z,R/w4"NKV3/i\[IENDB`gota-error.png000066400000000000000000000015711326020644600322750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szztIME05nYbKGD pHYs  tEXtCommentCreated with The GIMPd%nIDATXKhQ$14$V&Ħ 54/!1i`EA7t!P QDtS;7BWvQ J뫴&6>pfiW̙/g{ÌFK6e5aX&c{XX,FP:;;Uǩ ѺN'% $k% Y$)0J^ﶕGY@ XXX) OO \_r`uul6KLF|^_X,jB7պAݚp$IvepA+q0 n+۶Nආ05 cuȊJ*WfVL&r^J|p8 >g^ ʲ\J&d .E$)W-{Xw4@YW@cH8(pSwx&P@ ULf)Ps-O޽ fq.Z%(H>E Ha0A)b׹@yQNU( H` ͷc۱LV1a8E&@Pм ŷ$z"Qeobb)E"FxtJ)RB xI"0gN3??)%33|~ 0[ۘ%ɔmU,F29O8&LR|=; >9g?ennWffD#,,k9@;;;Ct(J&jDGt2,7z{8u$B[yp#v{.dpϏպiH$܎PQQAW<L/fg 4xtc G&S]zXlDJ<`]`]p)vq$ 0>gtlh$cel6T !$^ {Ŋ[I.W%iahxZ(P q<[̱N'@m9>Ϗp!'P?<tz JD|r"QD;^-%{Aլsy ;Bm655uSx JV~ 䱡-U^IENDB`gota-invisible.png000066400000000000000000000021511326020644600331230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szztIME- k%bKGD pHYs  tEXtCommentCreated with The GIMPd%nIDATXýiHTQ/dZV-E$*Qjba%e0iDEP_̅ P!ч}Av+,-kfIg ?}s==Oy(` =^9L9w8aL< F_ &: ĂbhWA%卵jr?lu(냃JKK# C\z}}ȝw/[,$oj[ZZM&S*Qp"Χ677'x6{u࡙/ Bp:(ԓ:3d28d4t:]v$n!Ez(Oe۰ 2Pn#dJW\6Xb̀ pQCK=H8qFdl:4ˈ`|Ex B: M F&AdzYF߼#bf1%̶3r? }7XDv"EwomZNB@ deUtCwtA HV?0 ~Iyk1SRdpU( 꽑v|QĒ拇ȉ7F!I=cd@!ۧKV  `i?I&k̪Q6 UjrBNl@ eʎhf2*=~\0-nS(<]xr}@{sy]FPܗ_aٶ2=3-Y'50Ff?9!+p\)\9{,A*ob1,`mc} {S.ϩk (Fl48iD/$0rs?YnO(G/yovmY2Pm fBgSX"g*>߿f4R/: ߾Ahd鱩`VȖ =Kq@s'J fwŭs(,$I'._ϋk:[ȓv)@)[͝uJuz 6Z)شBXR@@jN^J "l:[nT i&A!kpeaffq4MضW%NL "H$ "=u*&uEoyi"NRN||<Lm+$xOX:V}v~~Cz#lթ+E7ݟ8{Z`6L_*Iet?|>_XXC>Eo~^էg=_s\D^hW prp8YTK-Ӡ[|^g^._}m+ BSl۾ s&!ZKԍ֯OR8@RUJW%@rFStvvsss|fFtD0uwa>}9˒2 VXb:pv 8bL_\BѩҒ]zQݽDP"Jٮ @Ad4}SvUu m#X١:v1'˦옗(7,k KлdBBIENDB`gota-muc-inactive.png000066400000000000000000000017761326020644600335370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME !sIDATXVAkF4,ohR C_=RC()!R989l{1!%罥? ǰ*b\[iz$&i9`x|Iݤ$A[[[_iְmSclR+I6|>BDspqMD`0QJcl,c^4J)l~ $Ip]w"U loo(Jc8Q Ifff0??GZ_]]5(v]WWW8==0m/)vCUPJj)B88AU4x\HF(LRQ&3q&$Ɩ S|yc < $T JR لI D7#@cTUE. vF*j˔DH8??gggg Ȳ|8X .Wbj^i0IeY!NG Rf|vv!mAv#J19nnndx.$IB6nw$acrpp8 b68瘚c rĒeNZF0 fYVb\ X,~M)m}}=jiqxxط,GuOTտ`gggEQUUzGJHDt:*!@u4A|m3M{q~*Ѧb~scRTg2to<3gBA¼a VeT.K^# #}:˫MQ̱0Cfff߿?oŊp3EDuttz?-G5ц(9?zKz;//2ݻwHEg͚5xBCi["F 6%/¦#WXUUU%0ذqFe0NGSN\D#9O<)s'@¥U.[|y=IIVэIOVVVUǣG~gdd\o"444 B-pi<Ex|g#b y133y%^N7xeJ(C'e 'DgD'2\FG䊝+TA*}OU 7JWE##[XA>5) ӻo}{g MjWJIsH>Q=VT~ڽHÆ B'M&'%}onzp IENDB`gota-offline.png000066400000000000000000000020041326020644600325560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szztIME,XbKGD pHYs  tEXtCommentCreated with The GIMPd%nhIDATX]HSaMjaݤMҴ認ˈ0 B/ ([ix!EQEAQQW}Qely2w9hȃ0Kp^31z@&Ax [ rOZ Q978!028:/GEf3 Rii)NSa8sUb!GMMMC499I455EX(Pmm-QNN2s>\ n8)nt餆166F]]] I+C<]`MOI6M5nddDaNOjsp6.~p*sEww7SۥI(98>" 555F:::R&-ڸ^6,2fjmmMIKKv{-s,\( Q]]ק$ 7P-n'*&xϫzQVYYId0YdCʨ<r\dZ)77wJylAMi |QFL&T! &ܒ Ӟ4HViēVpq+?R}^rrb[d;5s"xMJq9˃fhL<]|#fcpn[4nv:Wb+[D7ߘ=Օ%r|s k{";w/E Qh# ,+@On(?S6Q~gJQp`T_YORv D..4;#;'QS,3c0 C+l4Bfg&t-AvW6v/Fol]ؚnY@5x Ff6p*99yfvvV,JHHHY2pRR[[233?777' 9d;8j Ą.V]]vzuyyy4&ᎧI fff$xc}X"&q222" [92X,^ruud@8|M~6s,;322RB!MMMy]]]M(U t/Sk100b}з'JDrKKK~ @Z rޞO[ Oޢ甧-@EVL|#"E8:!(:!4@~zb xyuZSx B$cJOO庺Sy||\)~C8}PBCCC&ڞcJzzz‚ iԁJfdSSrȈV}&77W'3z]@uHLLhkkӊ^.9 [5 z٢E{(*UPP ?RSShrR,6%%3D@%"<4& ^NNc%($6 V~o IvlXD`+sQQQ---]G0kIII666rN=ZHz8{v|bDg#twwǢ\244ʗX p,ȷ MF.$-l|Y 8f@PhIo0"T%a SLײbjDAq9c 7 2?E [EQKBR >͕݀uUbD[@&b^#hbyH+'Ax|j_ٍyM #a5TɡIENDB`gota-xa.png000066400000000000000000000024501326020644600315510ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szztIME)7`bKGD pHYs  tEXtCommentCreated with The GIMPd%nIDATXý]e̼vۭm.KacX4j4И^p Fnx&J!jxA,b]+[.lwv;x v[֓<ɼ9sSra' `w_ğx.YJ؎/L!HUR?i R$<;Ņ&U-Doދ;p0zG6A<(~ _ƽػ]Vs=## 34Do/*44LLHǏ{|v֏Rr,Ə=w-U_Ǒ[>EO5nniINcsh~Wr;Wõ|GU=7́go>T* *Uh89ee<Ӥ`wFƻ 7ko2m{YWq Q"|o3w3=}Mikfg} 4uBFťv%eWrq~؅{F愫TOc)eM Ư3M~ 0=_!ypu+\Zާٳonţ>.md+ {j$U%;{0χS`dvrRaJpf[2R]ը|-/ ](!꽯C|CNːa2Z۸!K+e3+-0fd88x9LLhˏ@Sx t w+x26B⏝(2^Cm=8}UӤv&I*<N/pHϑZo)7; >܍Wn |Geiek|;}P+y'޲v9YOFe@i*^"L5Hf Qȴ(EmF݊bolHCחA'f=!zV3Ѵዱ\~ +'<2sĵuRW{5XNǂ[]54߈͸.2" _IENDB`icq-away.png000066400000000000000000000041271326020644600317270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME IDATXilT7o{3x7xaߗ$`AIMB5_Z)_JR*$JDi)%M,6ccccf<{O?6TʇJћw9`_GP|,爷׾hم"oj꥕NVgKKh}FKWn'a>UtnM!z=EGWòAeZynoҀp]IzE:FV-]<Ca'I;&g.~r,.6m u;rԳCS>ꆷg4mH7Ů]D`Z4+g،q@.< ƃ gu>f-,t|86BkuMM!5^xWhܶ۸{%"+A…dIsp !Ov";-^VLY6EEujɢnnV0ŗr' fB)> _"joK&D4'=3ūzIHjV-P܌-v u_96,a1H<&Q˃L^D+| $ojNarn]Bњܿ1˃ܧ'j*N񨡀*:~$bYoԛ+oY-(3r4MD ^[:P H X{W/ǒNݷ ܘ:JAW~1K/0i7CH2.k@,ڡ·D"m";lg9J;_`?Sf=ƿǸ2{tk^)*e4Iz&Dԏ'JVZ(` "gɤ#+oaO8%O7"ȡ;`KRd`~? p_9{*%W~}c%=\Y^-ː JӨϤ qɭBvpyhIkCPuk֕  o/cȄ ZH"3 f.F.ret,4 4e\ B±8 )r)T?c v3L讆2sc7 $Mxskj<Jt xcJvwR +p 0c"ذXX lH^8GQ(0B:y4Oi6+_x$$ATr Ν8sA9Ȳz<{9FUp"d.:0R|rqTU{ 4_:#iY.Px%\W6<^˜gHXRKZƦ-%,ږW6}ss={}\]7x P9M8?KѶoAL`e !ss9j;~a㵗 LGUH>xvX1-\Ut!L_Bwp{p@GVH󳣷F|=c>jJS47נOH d{n W{~Ge+\fT1M(\aZL<IENDB`icq-chat.png000066400000000000000000000045371326020644600317120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME  IDATX͕klw;޵6xmlc;!g e@ % "*MZEKM)HA!*QH 0`y8q0qb066އ{o?^Vjw=?6 9'5KM$Iw_|ZB6 ` x@6 V1Wh6K+WV3=D$i?)~׮]o[5-vQ}TgI~EFBccVNV#tw/dwCYmoXTVqQOߪپ;97%H:XPJq{\Rxz]C_}R`r(Yk/YMc4k6fVφaEWTM̝3 QZR&2ɟx~RyU8GBYJz"+\3J 8ylXi: Xo{2ӊgچr_c0:H8!;ήlɣE cR JMȲ~DRWL)tCfNq Ot~  󖺾nR"$f5S;iZZ ?]NpJbQ|՟ )g̚EZ:D^DudJ˹z6^*84'"f/fQ^@+F۰X,x(*AR 7g*.\:}S &]OR]Q߂q[sю0e WW^aW;qfu*iZsx@wD(heF[l;>Rah+,{Լ ƀt&O@0R&G* pDM8m^$I­.lm-%ؾ=ә$hx 80`v#7#,Њ 洄pZ=wÎ,ҫ jG}}X: ^4EMER\pmzo;Co?0{7_hS({TժSP s < W.;Gqq> )e@y=}hmː2 ԭ(>+Ԧ8l@88m&O;#ϲ,+'dw_gV+lכ'TaϵۅS|4/?&X8 CgDDvc!) q8uM0F`B&* s_<=6'n%1OZc>|DpMkJ%x;K#^)H $h! *o{`C*is,Vm>#DMb0 ,@Qf!هH{ etp$. U T<|  9sM k% QӺ#Ѝ䧑pV)pܧZ`<—T WcGTaťzܜC0`-)ѝ;^|ɬJ쬙r[,bf:1+ E&0$eW{Hs3#1QԅKPPsQKL\']ـуlZWk>rk*3=#Ca\h﹦) XEDA~%3/YUkm|*:#s/ 7}U8P*L%.A64S$]lo06g;-uoNcWlCr弍tFnL,r䉃SG`nT7R#`m~V#)Ή:褀sD^Ȝ)8w{ z5˭y f92-}-cIg;Y'x#zB rhU;cГT$2FC^KmQ_^N!쯮fY %`  m"ۀ3'ȳΆm u$wܬ ^M(W g7YTg{/V-x|a7!S~lolnu:»`w{.YqD<=bonNU?cVsOV2ƅ= cqc_t #{;IENDB`icq-dnd.png000066400000000000000000000044471326020644600315400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME IDATXWilT[fޛ͞cd$ ФtID%JU*ZIUI5$)J\ 4@ Swq߼cEzFG7|{7unھ>SP6i)gYHjc W^;jWY}Je2zR|LtL_x<1SǮG*@ QV\ylE:dLd gmǾyշ7zm}EY3 l/uS"ɡ^#c[\yA2/Wc31OY%yÙv%:]ڢrvπVO_>T{7 -򲲶w>G$(V:WA16QU*l  Y1Vu5Ύԩq~V=uЎOiAnH{Ͽ9v\3]nxs.Pl L8 gFEEA`E(-[әtm!j| ~ l 76nt/^Dlb`*;0\T ms~[YNADH'4ޛPlz΄9<L]*#cROWUz)6Xn6R n W,iFpJ(-OMM?<@VdJgX"(+7cv[YKEb͙[k%&Lmpԛ#t# s؎7=/~o H# 9PM A,LD-ѳ88 [o*9jW(dؓI,NuC^%Z&P:^wfa_x&2jYXt˂>W [nH#(>+0qV* G9ۙ͗L Fĉ##sYĠ$Qm ԟev-7N-(l'tGLDu0#NGs [0!3v\ g;>Gg% k7> c\̈́#+:JZoZg[F0C臝fɆEۦP%B*T$#N>Nva}prYT 2è~/gAHUйՎG81]1al7 2 ,\P~]:.BnA}GD/{[TlɊ.m ËߎAʼnMpnhR?T1eM}btwZv%y *.= P\f= bw _ A 1U+u l;O 8?;quK؝$g0RD?%AYްJjM,!V;:$V> @V>t] };ӧ6 .qn^:5yYAլ;(Ƨ#X];J&Ovp zSSkaMaG㑜@8aZ,2'h6"٨5ۆ|8_xb}=nffs3؞=ir[u-dIX DeD`~;#& L~k"S&VqojPsρcz T& ,KqXEpX3&C,Z|iNu|>^Mr_oIЬƆTZ8 Mc0,+ 8ƗΖ0Q(1GE-(0cE'VL#7x _ˢԴTtx֧ؖuᶉL6~N*+eAFnoO%CE@0Wh:\aq܅I´XyKTܞjFKz|3$qfY,&mI_{_Rzl 7kOFk3etFmIENDB`icq-notinroster.png000066400000000000000000000042641326020644600333560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME VIDATXVo\G͜=={eĎVbMR9ȪDX7qAK+UB  $x7(-ITQShKpRv8k{w^};۵SH|37,b>:kߚIg4[??!  +Jgg}CL{Gt^?ѨzFf퉿|Q{ / >F blS~0s/7&IpQW͛7dۥK_g/e6U"u^4:1Onzi_}D4 spQ,Q__/mdr|s<ˠۆыĠ{s(R}>I^P 188J]>?k|ĉjS;1`xd)Y_ qh\o[FÙl*VWrDZ[[ù\sB!,..o[[[_jjjR$s|ࡃ {Ş"o>_cZ&y9~g,j5~ yy455'&n[ x^d2aߋMMʦz[&?6 zdE}__M2D6E&Z -_ߝ-F(c ^ض)c!0L T=J$b1JEj> :ol^%pCG:NT*r4MeEo$bnn}cd* 1n/c ? iTu]$ ?@mf++h3<Y'ُD,N ]g |$˨"_K 巫 lb& %9zz ZMϝ:'ʩ^gn9ڿ#l9(j5J0~ښn\bV`bb^skHQ۱8Vj"1`^'T\U,ȇ{P"X;F#|uTŏOMƅ[;Ap ƿnį#---j8ɲ`.\xqb'!t{~78E<[m43.s/r1PbvԁAO}cY?"%wtvZŅwW=zv`Qrq9ϟ|}bQ>8rHS}$⧂۱:68 8hڠ{Nb\0@)(Jf_[[6q{g}7ZF@ߝxݶ- s uN/}ܻ1L=^ǁa(x<|r/z(J_$3`+\4 * j7u\,|=U60- xZR<#\6w}\H;r P~ oeeFsCJcaYq3GVsX*@xlRadK%Is?V]L,rY'N6 %( ׯ}-H*t]$ *kPj^Y泳3%rHv!ua&/ò,(OdX_fe/j5 Lr`;wWVVRb%|P[㛅sBa/*uMt&-ex&.&bhRF6wKSSS9czF:NlۮiZff]]CA Ir?k>bOQUdX[V*iZgw-+`)[g#Vb[Y6ݤ@L",JcUT"!J!')B[V- B0إ?^ݽ{.~A!*uY=5mUU2&bĂu ݻ7M:k\.f E_m8TU(w랏/\*%_5D#;w|tWZZvv6,W_ 675zw'G{囷c Fq|bmK\۶EǻuL|ƷP/ur!tcт_-+3K@ !&;{߿g[w};wm? `0,;&@i.CUT$@ g`o|kߔ9)}Y9ƈ|vtM Ng /^XZZ[9!3+YO+i˗Hl;nBJdge\?&\^G٬%7J B x^饗Vyv#\0xsqDIIB5<7c FmaP03kwe¥CTRZZC|p'hwYOB$٤LӐ9 lL=3@z{{By2YV#$)l,^Ol#fU@]*ŲASUaTWD~Ǝ71U@D't鲥SLuH)!IAH ׄ?{ދh؉Pq8cp(+׮w=h 櫻*v5.Cc]{ڵ3fsss]iip%D`.8n@ j|/Fh3!}Xgw%,+`Vb'=>Ox[R\휳BM\L"+15#HMNDi>kӌ0H{{x`VV8`9).9sLu/@Ԧ7 S1"D 7DD`!bDPs\O <obtCig8NXV mö-ض ˶`fjksuv-9 )! B؈YTMʕ+R%TE;!=%j"IIa)Pt0}}2!*C!%Ixtt vLJ\6LVc#lF"OYW #`EYSSR@4$| m;:#o7E͛7AVbq~6=]/go{\Ͽn>uу1MM!%,  M}־^ɹ!/Ϟ VII ݆) ]FQņ?>s Mu@p8Rp=1UN(R,IzR_,[!CJ;JN)iijqgD,\PJWt]ObiƌTYf #$E¡,SVok( DPUAu; II70+;U&Vx}~t3'f)B0pv`{k{sCW;@30 M>LQkʜ9s~ӭG=^"h$v#a0iy |9|Chb0|kR'ag]IENDB`icq-online.png000066400000000000000000000043401326020644600322470ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME $lIDATXVilT[fޛy3/،=6bCXCBJJ4Qj(RO%jTiլjV )%8es1[&xxl (R^}|9>wyh[6P{c >ȮSw~(DUO-+7(]HǗ|6д+=+&EK{KR7(J*n ?rd'D,Aܽ, ʂoó[j=n$kP *w*+~:cvFLAÚE[k~򳐒'ƭ0 h|G`yJ,de ϛ#>:D,_vNX@l|E\wO-mqG <^t ztS"NC3N>Xپ K,Fkl$|Z3ihV?ܲ9փ"=me_m'fc@;bL8VR>Sի#=@;HQ [%5]w#<Xqe !–]MT\`"r#u œgmfu[yȓtMC i_cUf%Pr\M&BGET/4,t.߼0mѾm(LРwǶ} )RI ,Xg<fb k3 JFђ4GȰeهaQ-rtI&lAsc<#;E F , a@bwF7 }n.D nj%Gށxp[Yg;V,,rqaǡ1ͽXJqL;"lۂ "A('8<0Y~dd xǚgƅlTc C~KD{ ~R4-֠[FM5'Sb[vſ`70.eCِ6qL8wS Z {x<]DP(lQenѿ*&`X!0Ǵ9&@po;~}"z$̈fčsn:X ?8g2MnƂӸH'̑tg;9hb֖obO\YRQAp{s-Z(%?GJoLf 6:sH抧BN7qd3 /.yVb'`0`p.D+FJQ6r=<\R7ۿuE# >j B|ݢ.dVmۼwgm{tqXd H7mkYj816O"z9_8nOK$ʏšA`~uu{ﶿbOWv ??~bt8V ubzlsbg9ԧPY䇖u>eJ8LwbcDLdcF?d.W4pwù'!gl.iE&wGLG:z[dmNIUyj1eOxVg5A q rhhivDL^َm2^ ;[,yGx,:kþkԸ=1XkǛ"w{!ͯ"7^y:zK:yk]o fgclrw$'2r+xARu hJ`F`X aBGfIENDB`icq-xa.png000066400000000000000000000041101326020644600313660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME $lIDATXV[l93;;ݝ5^_11 16(DDD PR*UFҗH}Z)KK(HP))NqD)1f׬/x;3zݵ VZRk| >اtI!%Wg;NRϔq!LզqPd&W)U={f1]H$1vϟw?-Q@54ǻ]Uxj Cݹo_ig-WWyCoτeyYIhm[@@d@DSl7Sz]Eq?&pv}w4=իu}Ix7(74|yϞ[ TV;O{;|čY^WOz3J@yEQTbgK]ux]]4L89<{wOX, rQ}{ؕ+(a.''!q66._Γ@QGLڵ2D`mn.] "(^-۶Y|`rl 2:8OY` ۆ_יJ 녯q@2 ӠxLӰa˖u%mQ2Uen,~Kiq'pn3[a3[`G&1u1*źM,:W4@m cŃ%_MuĦ?oz0t#2l7LN.3LQ2㜎R꺠TYjDffL$hcg's!i{=b; nR`]@WƂųg3U6y@>Ŀ;(NIyq.;lk z++**,JͶmfƉxpX:-wS"&Ec#.g[oYp`0z#p0, W.t-|\r|jag2sTh}v!*8?T^ "XL&ʉWT :1r.8(ՅKT+E) Aw>4 ŝ1"0ϻ_+%!aLG9Itac8(Fy[-ۆ(;KLUCCoS(TaG" OC6Ca)7= 8 ^_a!~p^n:&K/3m۶ ۆm=6679::x  `%PK|;Q02eW^zPH"[t紒t Ψ1-!P5X}Y,GIENDB`irc-away.png000066400000000000000000000026211326020644600317250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME *_23IDATXŖˏTEz=Lpb\q u{֍Wٹ0хqAQ" ( 3q==i11$>|lfG{[ ̮>OZja9Ȅw֎'!*>xw֎=qRN0iՈϯ@l4r pY4ujۡ@@sP; Ą˪; )" 3׾h,{vZ3]zts nH -̯zR\ÅA9L:V E0n[[D}2震T& ztzw2n}k@B$[ү[(Z7BHbISuj@#ˆـ d*rg":htXa^GZAAe5`cv;vY%h 1t+![`7a_[.H 4˳.@rL6rΫ%ZXk\~!!`-/oycQPlNPn; Wև2qR萄z7vZ8ovSڸvicaM-4멍ONk-5Jm ,^>K|v@UlluAV׀aGqcJh{էU)T;.٥a6n|]:o܃\vk_bozU6?t v~=]h^w#ay~.H/<1MzF.0)6bzݵ1(wY+`=!)Z=ZA`#2PB&^$hUW`E8VZ=Lӛ!Zc4{VƵ˵|d/z3d+m%)i/|bɍo2&IENDB`irc-chat.png000066400000000000000000000034521326020644600317060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME *_2IDATXW[lGfvvc8ķ!6JiI hZ5 * /~P Q6n4Im4EU'CHKe3{g1#voJCCb:g_y}X,49~GK6ڬfzW2v)%}R-Y exʝCÅYw^eч=*d4oD,*Q~\69"<7?ų\8x###W(@vԚh@Ŋmh~}_5{14M0i#{};:4^>TĠH0cAn޸)0_u렔ىS šww::6p~kCn6 /TU:{_Ol 9800 wiH) |'.z,ĕ[esEWS0 qvm8g`5%@)ՑX\ VtR۴݁3WvZl=0 9NJ)(%affg0* 7vy! k>Ք/s^xXA1tNRE ݥ4,S@*M^(bZ>&`CO@uzw0:}Mkq#H)͙~ءhf0: `\?cXVʼn4z3OCZmW`0Bp-b3Yd,g  F<)ش>"MJ硔U\igaN&g @)؁pM[5`(*fɓIgtoPyYpE<ފ?ku01o^pPcHJ> ^BKW>K%^@[ZZ|PK*:7H`prɅ!1S'@m`vjse,|h"ljFK@7X(f*z"l@{vm6 N"83vxƂY1|7|X,jƻMWgoMxaD`||T&̤)?I9@;_9p'[JNgc{F^%FDy" 8bBLC*@])kXoH C))g BG$?jqyRN/7yЎx۴ҭ?F-s')`Tq#zja,& 9y"vF1I彚XWͥ@ Ez^IENDB`irc-dnd.png000066400000000000000000000033361326020644600315350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME 9PeIDATXW[l\W]8дNDN\FUӄʊ@F"P >/ EBQ  _ UjQ81"mM?gVе;?Ui;=pݞ'޷ʴk񓟽PIc?v4a~yN;od]l pm U݈u"ÜP&m#;ef֜"ڱLOspf`Qps$?hc' @fna,"~0FG&O ,,i:2 <9 ,5L`SI?2m bW7=P-`n x쑇~i~\*7Xi6K|r V.- U Ƙ\փ6Aєws 3! *'~'BYs`H0&"5pL@X@["{=]#ж]K˭-ѐx~//3ԙ'<ށE~w݋B,@xczFx!HzěHGZFHDD@u"ڇg|uײsHP> }s'~&ݱB̉Dz LOA9Q"jf.:vBe\Dd^ ('rOƱNTj>m}r,:6nm Z.&,ݎc#L*5?$f>:b9۱ !0{*It mL\M rx,8BB_15XQfb4RZkW)-ЋB6FLSNjA"ZKc3:FcυW;,a_!g:DYr^^4"#(L6/RyCY {h?H/pڵc?zXD~۾R*Z"jA({WC>(Fv `qH ~B/EС\wxgyeDy}y Ju &v?&9 c|ahy։%q7I 1t=8MJ)d,r[;'^bEp6\hi@tĔ=M~9?2yFy"l/kt?Au8R_)lBYjlZΟH݄<5XP`y`'jbG|zfcï#mIT(<=]7ݲ{{9~!?TrJ=Haeby3` E,_b7oΉ1J`pue= wgo -VXHW6bg=(ocp~;` •,^PJs@njd5?puUG8[, ' /{ (Vo5gRtS:)@ SmtNO46vܶj2T>IENDB`irc-notinroster.png000066400000000000000000000031061326020644600333510ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME %CsIDATXWmo~Ν^Bx)m) `^BB?RHUARժB`xIL^;3;3s0ٗOi{9395hѣGv/mw:5]\s=p!0cy1 x/Uſ 803痹J~E82DaXpjmt՗_sJ)fv?5Le ! @UĒ㵚/0D, "B Rq2p0wV$d5`f@Lza r1̹" $){J\Ϲ'ޫ㸛Rzr/ET7jb;{BgiXɀ0\,]F' r.mnf֋wٶOZ {6{Xz`cc}'x6CxN%ЎV0==]SD#hݟp[s~XET`7׌MM`euV "Da8.^++XY]銙@d}7 %,r1yw+D}_APᣅͧ}^3p$?||-CEĘP/οf{Ǒo=i88?rUF$BM`)4$ W*{Fg fr hpqj Ў*b\hXa$ l_Cg}7;NVǵUz4% G!Ib2q @lms}hk!A!Iŀ$̣e(RG } Rf[ fHu"\zpY;{Q jZ'$ ~`W*3PjWf$q RދEG#B!I n СDBX) P$1PRKv$IUF~[o?rN}y[Պ&''i¹mnnf3aO'K_^>ߓ-cuoϣwZX][?p KXX_OMG;RWEç^]IH5h1HlrmhN4 =wyFߏHi+IDpfy= ]0 "QvJWR>b[ѫkk^g1!ŋE|..,T&w,9{ H kqZR*`_ nłݮ2@h@fev7@R!+"#A雦K^k]K8p@3F%G7oo@nq2Qιs85[yȚ?0:w*ȃIN^$^8:jgIENDB`irc-offline.png000066400000000000000000000031071326020644600324060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME *_2IDATXV;o\ι]T$*Ma `)G,ƐriT8m( %]$\HȊ,Zܽ{3礸w4`pwfsf\M[qb‹`O¯,c7oD<{b Hy=RQN۲3CP#cbg&r|"3O8QK1=6H`ل*1AZ^{:'IQ` *%@==;:}-|m@DÏ|_xUNW|ޟgl%`w{c^'ei ҟ ?MwMh^rZ -D14KgElDk& aN#@(=FĹ҂ ̄8UEGuVE,&"Z L 3&V.08 Wd$IU $x6֝ @&B$Q'D>sBa.soNHI7MHDH$z |XkkY2;>zVEʪ $~kׄn4|民AۭD[o (-q,KZ$u}\rB-z0*ɪZdZTk!úlIENDB`irc-online.png000066400000000000000000000030751326020644600322540ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME *_2IDATXWKٝ٧{!m9"\!AL…)("R^8eOL"E(CR"@K$RHhGxXB^zUC?fggT鿾U=y^'N,VNZ_{GI05H<~pq.i6FZ)?vaNTgvl@c17pX ]9ә3 m`XRn8$&<.FrܗKCG$Nam'*@ydYOb<PWO+"ԍxXZZЮ `q}A@"@3/oy }$)?Ѝ,Qw.Ɂ , RK }PB:#kf. 09 Ih"E>2RfVg^Rl#!HV'" n,vBMY|1t9ro\XhXh "| 1o_aXJzE ("-S~/e'7Xc߸"(m^TXkч)Å7މW/8O{wt["lRll}v +$JrnWdGNZDA9^1,r| +'\cEpi=\G! ._bL zQ@L~?u p*@Dp˾i|GW:/މD4 -[oTkSxkȩV}%vS8 xVzWrG`ᵕ3/Eg?adhDUEmWh!uDD0> T3pF6+`jQ 2 5.̀3C&1 m2YrwmqG6v~ XK݁;&鉍chG` pziF ' \Ll9̷Xs"bMY5 ]+H:G,k ZC`A`uԖEk|kNJ/-a??mnKK}ʅ 2X8I l=\* ^yNBQc_oWc܊4[kX?ǰFȴsXMCaݵN&Uk :L&J}P<)6 _-dBSbc P>@*mm4&Tt(yz]IENDB`jabberbulb-away.png000066400000000000000000000042221326020644600332410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR;0tIME8lѻbKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDATHǽ P.. PybQ1m|j&L'It E4(jElD $$AȧZuU^ ,fy{ĔIZJxg== sԇXU--7c oTŔbży7l0e/bԬ]k^1mo}FFjj_~hOE"}eU{iܵsk@:bWlnS,"p5E&&OSbe^9kVpmPWK%2;;//h2[[kQ'\]}KFL&G4`ggtˑ#MU*<";cz |ظ{ɰRxy=%eX \^bmݬ;lpwy91,z%HEUC]zdFHC}hcxDxI:NWQ*ŀb>g_wP'j5ctjr(r'v>_fԖ`?Fx(+Pݽ3;!<2(sMP>ll6Pfuq\`>Ub&m|ڴώcpm7_?FzĬRjΉ8>֘"<^?g wȼ; r?Vxt˜4xxa([l YYY0 B۠?|72tZjyhyEq-ӹ0t[=<ޓԱXzu=*$Yرc֭[pkk+"""PXXeP1Y ' Y݋=ӫfѣbYRHGy-*YONX&BLEؾ};v9?!!~~~Bwg'_|@ Ԋˠ4WzxRڎ}$:А鎪wglٲGWW:::Pq-i6@5\NV[hO2U.YbKK iU2/NqQ~ T*'I;thkk,z9QE > u$;!9nVo-*"$k U2RSS!jsѕ"sv_Qt^J,R/n`3I[ @#v^V Fܯy&e"#5;ȫM.]5 H 4yu3DK\*rX[:(rPy> n˛3ܱt HHoʦLQ_D紀r=tt=Wǽ5Ҩʃh ͷ6x$5tP%d/3\\&}٤IQfSӕ A f5,C}lcƴemY. ڮ|見4J3uԍHwܸמ<9W_~~ܹ3}}n1Rntw3kGBq]{NYAcIw"nZPf[j ꨑô4樨2kY8˫dӧIDM,5*B>suɚOGxIENDB`jabberbulb-chat.png000066400000000000000000000034531326020644600332240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR;0tIME" ;DlPbKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDATHǽ PTe.,i@TAsDKGFJI@D"y2 -t&م݅!./"$;F>;sf}wxլ^t9"QRBB'*vwOV{ym( ZX6q+KxUhdj\Tڠ y<,T7dJ utrϿ566L%U|ͅBaeMSn̘ث11~K [N3_݃KG𤏻 NjWWgZ?Eh# vݸqwX;dJ-U<`qisRԂm!!o}ŋ˂ߧUS )rv*à huqqG<<*r޳($y3)6fQ;N`3Vp̏,/wr@`c8>.!ZO c͎,gy=GKB`3UA7D l4l3lolϐ#Kߣ,cσ)s |T/85p.je;"YC!KraI,Id.Q\_'p ̾ XF5d3Kvj` (ۨ |d]}rE},~`t%)ziX:DzyBvh\* (SF֖>74[|%tr }u)ƁVp{,#|>cTy J7aBuT<:k},z!m056Ć3{{K%rz$,+ \HHgx#M,{,䋀@p+L]a 󟓁N7@ʡkKNv4ޛeG:s߸kC1ە7(F&ztq~ky8 ;򳑜a;,Xuj0zCKclDBSMPxu~묇g { GюZQ\u=\D|F ܉GG*Ͻ+M&AZMR7$2suT@C4oa$R?LZP^-nwcDr2tzvTɓ_%ngn[;I (ݮ2ezmqaUI6V9Zcjv~)J*WS95kָ>,q6.Ύ %.xGH`" T9>%+%0씠pU[ ]"*Vh$ک \^;t:)܂ǁ\/P3pIۧ@t+=PLkt?ȇ~ÈP43ix[ Ge8-ϥC?YBSem% ]ԃP/4$HsM9AsznIW&邂F]=zv^@ %[JGp]9sROSi?nA?q۶mn!ÐIKGErn"xG<)/vnIENDB`jabberbulb-dnd.png000066400000000000000000000033731326020644600330530ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR;0tIME.%+ZHbKGD pHYs  ~tEXtCommentCreated with The GIMPd%n_IDATHǽ LSW{*[T@y D\f4@2(,Ǩ#IBL榉*LD&$ĹatQK q(e+2pY9ߖL 7{wl;}hrWSDA/l"$oQ,"ESϒCHn6ҥ^hM J%VUYė: 6=b'4ǙϼDy'9NP1 ؈Sbn䷷;1BFKKgRFkkݱ" 0Z^hQPkMȪȩuñw)""@{oE"Z*tJF-(`tpUQafaOח8jKX9p)2rO]UI *H]Ѥ$Fss변L&P6uwxև̢ƗBcv."Yz?Ph2:cff2j0 Ԥ׳(3* ee}~}ñc UdzKZ љ3ȨeۇVj]`z0 >)P$uEP& cZ<P%8x(tcӐhFs`OEC-_nzfYǧ˫ ~l;w/afM2>LMsŗ`}*љ3{R:spH|J>vF{{??+F044t -6]7;7͚۹ Kpnn yS? t/IENDB`jabberbulb-error.png000066400000000000000000000031561326020644600334360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzgAMA7%IDATXíyLUGhp<1(5`2"D$Irv+W;G&MÒk0}nwy׮L2AqnL['FlA"τ5 HLO9s.__ !A}R<`VUB!!@|<cFv?i63̮ٺI|gg;=(-hvq:2giS7k䆈Wã ;aa@ddN0m к5޶ldG 7[!WE+Æi.]?? 0 6''cH\eFV8x>`4H "w)u72=uuI5ZoDž z'00]s7d 㬮 bB`Zq!̒L,r\\~%F8|HADFV(|aBq>ٹsnDllKW DtO]M36\,_˂2,]WWomV{Yu2(IENDB`jabberbulb-event.png000066400000000000000000000021511326020644600334200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYsetEXtSoftwarewww.inkscape.org<IDATXoU?tJ)RB xI"0gN3??)%33|~ 0[ۘ%ɔmU,F29O8&LR|=; >9g?ennWffD#,,k9@;;;Ct(J&jDGt2,7z{8u$B[yp#v{.dpϏպiH$܎PQQAW<L/fg 4xtc G&S]zXlDJ<`]`]p)vq$ 0>gtlh$cel6T !$^ {Ŋ[I.W%iahxZ(P q<[̱N'@m9>Ϗp!'P?<tz JD|r"QD;^-%{Aլsy ;Bm655uSx JV~ 䱡-U^IENDB`jabberbulb-invisible.png000066400000000000000000000036361326020644600342740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR;0tIME$dbKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDATHǽ LTWEAQتQ,2e@H%b( T@ֺJ@ ̀,ʢ ʾZO}ƭ(7?FU3hى 6WoQp0k36bCjAss'٬Ypqn2a*D{ n>zToT)SI,7U8'5FD;L干ɓǨ|a=o4mDcTbn@`/ \O/yH,-cKԆ ~BBDZfk{X;z9$n3ɍ4OY蠿Gn9)%S$aou9CHQw̜9svjݷol۶ 6l+W:u[[[옯䨑~= |V+9MñBQUc_3À(^BBBijjjٳg!..<7nTl2f9fDNحG6r5Θ)!eA'`y!4)O#>}c BSS4440'OH${]IΤ WdhDOGH,*z.W U-'mabp8|>.<88O>:ec椿í}%;oaq5 Jh'<ʬ y/TD"aBTTT@ݻ/ n  B]o>=Q>Z%rGUիV! t^#yI=@TJ>TTXX)HKːI!!M8Tɶ bb>> p}kU… ;.f"8pT9ߟS$aXDc͙c{1Sp yIENDB`jabberbulb-muc-active.png000066400000000000000000000020331326020644600343330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME !sIDATX_hSWǿ?ƴ)@AX_XA&:Ht/*%1= BY D02(yrL, ,q611'瞳MڤY sw~oH#FCCC\.5pjsyw8yXoo`0JiSNR}1 ?sֺ `@C@)Ϋ2{Rc _-'ccc<^ ?>߿f4R/: ߾Ahd鱩`VȖ =Kq@s'J fwŭs(,$I'._ϋk:[ȓv)@)[͝uJuz 6Z)شBXR@@jN^J "l:[nT i&A!kpeaffq4MضW%NL "H$ "=u*&uEoyi"NRN||<Lm+$xOX:V}v~~Cz#lթ+E7ݟ8{Z`6L_*Iet?|>_XXC>Eo~^էg=_s\D^hW prp8YTK-Ӡ[|^g^._}m+ BSl۾ s&!ZKԍ֯OR8@RUJW%@rFStvvsss|fFtD0uwa>}9˒2 VXb:pv 8bL_\BѩҒ]zQݽDP"Jٮ @Ad4}SvUu m#X١:v1'˦옗(7,k KлdBBIENDB`jabberbulb-muc-inactive.png000066400000000000000000000017761326020644600346770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME !sIDATXVAkF4,ohR C_=RC()!R989l{1!%罥? ǰ*b\[iz$&i9`x|Iݤ$A[[[_iְmSclR+I6|>BDspqMD`0QJcl,c^4J)l~ $Ip]w"U loo(Jc8Q Ifff0??GZ_]]5(v]WWW8==0m/)vCUPJj)B88AU4x\HF(LRQ&3q&$Ɩ S|yc < $T JR لI D7#@cTUE. vF*j˔DH8??gggg Ȳ|8X .Wbj^i0IeY!NG Rf|vv!mAv#J19nnndx.$IB6nw$acrpp8 b68瘚c rĒeNZF0 fYVb\ X,~M)m}}=jiqxxط,GuOTտ`gggEQUUzGJHDt:*!@u4A|m3M{q~*Ѧb~scRTg2to<3gBA¼a VeT.K^# # (8&Z PE*QqT!BKE!XTQ4MQdQ@SA*.gjj]Xl˼y}B8Zbc g*LLꜜ$C8j s A S&ǸuOajZZZf =U;)mlv7z{Onݧ-^,{xǻUA~rGp+X3'Lݎ6ʸqQ^#;@ ? ?C ƆܢZj}V\I۲p#`Y܁jH"&& pA,xx^DU!J݄Pw(-,kQd]e#o4-0F ;Xt ;bXv5w=>N2CaamI?1PdZ(0ylb4.d]*Ӧ? |~+=dC3Jm++Cl\2}(--YX% \YDBJ$dLV!?';t#e :4SfL݇tLP%uRKbG+)!Rї+e>bk8z&ǐ4hiLwRR(LEy:3yB@H@GK3]8+M hkP(ر%HO6w*cViɘXh98RBȖ.ggJ[Y*/ٳ/A;~wĜ]s[PS#ͣ:O7.kk"¢'e)䂻;@~>@a!UpYSSf)}4Syxչz6Ûc{'@ |9 S*< ̠l-ݶkN݄ ׊>?aD;w¼y̚T1/s8F7>h2VKv!,ccAQOťW̟ tZ9f̷x4c}zˠH5#s#0P}uƌiUzz.h- ,s_>ugLgEo|mIUcS@im]- Dh.N4X(+_(,ŋbc󪺪?t{yA@PMEnYiI (ixV2gPнj۶.~[,Y76njg1VǩS; `9z-@]`,#G!&=$֭?;`TO.韯ž,jmqZ^ `vǡq͚N{kg/SSWɤI dDk`GY9.bAK1_㽏m{ͣqڷGر_&%̜ 7s(]138fh[Sg2SD˭UQ Q9{7c#_KM|354B|~q6ʹx-5j}`y!*^cRIENDB`jabberbulb-offline.png000066400000000000000000000025161326020644600337260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR;0tIME 0.|7,<bKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDATHǽ}Lu;w&@)B$¡h B4|ej f/?GJܒw{3<,hƳ}>W$|V|2g#bWupT!WTT;Kx&_{tKW$nh|8"gIUڛ3m7}&}\xR!|3LyՄV+cm%aIG"bi-&/i<򺤰逳gǔlU*udq 5^bɰkr,ݞK'fcԬ]1_]liIjLʌZ@s]=X['`?RML,JmTmJyY[V]f`Gh':Jp/G((!v mdR}GL]ӃU5o1qPVy6M" ;-T{]Vo'5**ڏ;Į\6=u}Xkx^K⨈[rA:,X3˜s#qC(]tc!;p~F.#g@RI2_'Cb:Pǭc[CԪADdd_&~b ~K?_0mkG[)X3 $3ʠ7O1 R:9cb}+1G抝ӝ7{y,O ,MD9瘹//"kŀ)[?A|B^kIڽN(1W^$w6G7tQn IENDB`jabberbulb-online.png000066400000000000000000000026071326020644600335710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR;0tIME iebKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDATHǽ Lg{-m) ! eLe \1Pl\9F&NYl&[2&oK\)&+7ֶPvήJfHHrhϭTkdVw޾Sh{;^.wH8vlm]7W!?H--zJd^x1^oV ܷys{ Jn(d66!n >? mJ*+M+3{LLtq`K^8~3xt^A@8{NK{-,& r9m"7wHx>'wrjSSk!l M"#G}0s,Feil>e=ɩJL=5LZATEFU RPHh[|( O8v@&3SxqK.;ߟjkʀS9U,J8fz <|߶F CKmlzXZnL5 e2e0*7j-/7MJ̴0cb"$\Fx>;C#Cu-ںQҩ CW*qni[z5}^^x DDrD2B\J61u3P/jm?Ot:k#7~=n"k6e@]^=DCM驀.K=ܾp V쐘ECxEǤx;8CD~s0`mI*(^CG/-(X\WfURRU!!~~UCC `FGap 5w۹7WD8 oo#*>_u=Je5IENDB`jabberbulb-requested.png000066400000000000000000000034461326020644600343100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR;0tIME 2 f?bKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDATHǽyLg-H[KP.K0 CE%NELă( (l x fD3,% NE]W Ø&Oھyz9MçJf} ,_C9#Xx/a3riZD>b,%VM"3HnE=cb E+5qȳ0?6)`9&0Ldjm_ qkb ,[k5ksw5 8LÛ<#)p9~J\uY?MP蹅s7 L!m,ںZ1;*=. nAΡpEoW@biyh;}b.!I_2< ?9.9˹R\{>,oB{8xЬF1"C\ èi8oEq6~&X 0! >s%_(>9|J?tֺL}P6u!ފNPAco{dNnR"{LVr%SpY,\T '0v sXG5*SW쉶wOT>H%wz×)bǏwu p7|g>)@*P`U!}?gx҃W+E-ҽHjAdwkTX=&/Pnn]\6Yp$_ї( WqO+;;bffHvt|՚= ?ǯ9C; I5q:>.>Q\:+<U;,jѬիĦLяa4,"zb0nG$1VފYG@z뉇P MH*b.N"qF܃e1_#}h}Nlfz>-oZ8!G(dA2;cɘۄ5rqipS*J7eFIENDB`jabberbulb-xa.png000066400000000000000000000036711326020644600327170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR;0tIME &FvGbKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDATHǽ Ts$r QvT(MyN:=vC7q2tCStډB aBԲ$$($AIp=XYa;~<'s{C)|^&>d_zz#eH1ՂKMܷlْ\qlƮWJr+?|gjUR ڴt ۥ ^^D~p>E 2&ssO@`&&3w7en*$$MdI\Y^#;_jJ>{-&gSΛyԽ:N.ޟa>76Za ocZ01fXm(ړуw^^T&垳g7|~!H*iɄ7I)J*YD̓rr_ )czX}u7G`SP貲s:wd]GQ(Ь%;˦QxzaWw=ʠ4r@Gf-}W(0FȆ0d $2 5d4n)R1!x)^dvɸB"(HU}[E_P.^:O&6vlzK9z4tڡs(5;vv;$mgבө TD>r_CiSR2EYǧO'6^j:QqR tЪuBAv)Y4voH9iL kޔsBp N,o L>ck1jT mwBmt ;Bn|ao8 j&1TcúʔN&aJ?\4JŔꁙ Tת@kjj'$XP&$T< |Qo[q#2ئ@o!fO`4 Ϛ1Zw [h>s{\,fܴ{5k|bBF8&ab 9dX u-|(I$N4tXQNVGFJFmK.G x#U?F=m.p#15p 3kSnYD&Q7[)~VLqv2`_֍"m~Ǭ&ڦ{zj?@v*.(diki.*b,bw x7jHŷH0fv>*P&t)T(*[wjJ7pDABї\k cʦ2BU`x ?6Z+pD?BDGʼn k4re20Px' jOQWZЦnņ(pA: GnPvkU,cGV. smҥ }ZK;}ӹt^ͳF?.i7L]IENDB`mrim-away.png000066400000000000000000000050461326020644600321200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsRGBbKGD pHYs  tIME ѸtEXtCommentCreated with GIMPW IDATXŗ{pT?ܻlvM%!8-c Chkә:V-GkN+ZGZy@0%r7}{NĀhG?{WXs_EZޓ%G*cN^2)J ף+y AV B ;uشوәV5%\eߤД{zp2MsŖޓ7q,U *XWcm,Bu#[-;.⑚I SlӐv!>B&N9)<'vR=q'F   pyn3[s{Z`kvi< S~j@D vf_ W&ӣeםw7jQhEF F߉E8dK۬^/[XÆ(ӥ]LaWkŽWedfm%WXV;yET66w\c6+b`ɥǺjτǨ<6 i>;?%? J&M`͚5Y}us rJ)Rz$ &!*%Q߰^ <Uu6/|lj ~Y7rSo[qj/[EKWTUUM1RhBm۶{LZGTA"|_\0)Nv_CvX`E.~-uuubCky@+94)OH$o^剭[& TG |,&S)X9۞8e~sTy*f}/['+++,_|խ(/+-@))VJ1}Zwgmj^LSXyh2J!aZA)JAƅ~z^:X;-S&WT PJ5 9pR",Zr%{{~pvHgTϩ40o^ 27'|04G,;f͚U slO#2 >g{*++ ?IRRH..p=L_K+Ep]W_!,Bzj '>Ϭhe{D|*tzcq']ԺJyR)%T$iǩ+J˪.a띾G&]h{^1~aA]IƅK LJ [#Zs0 -P7˦!{p=FmlLRZo+!JJ! eiؽ t?++]rth$?n/As2C4$t َ)4Fh8CZK\ߘh Nnӳ~/ftQZR@pR`T[080|)7ߞ5R 6ΰP+ĩZ`&zhCn#f1!!`hOglޗ,x퐕X8͙_ZL)oHO:rkYVH+%FA01O)%8~/j"9nmI>1d>r͗rxXcfPJɳ D7l[&e B9~-: :;m:ݬYLH]V!J|&lٕTTNk RJ48Nwy^}l_K+ (s|['cibS$wn̮͆uW{SWQL߄b捩:7+XUgWUM<C8OTdxlJT||jKqq)3g%drmx79RjV7&IENDB`mrim-chat.png000066400000000000000000000045071326020644600320770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsRGBbKGD pHYs  tIME 52PCOtEXtCommentCreated with GIMPWIDATXÕkl߼360\LpIKMKCIMChj*m*UQWRRmwRU$EMM@@067cga6Jϗ}ΉO ⨈V"1|(EMB}[o56jPW$hʀ~q &P]@~@=6{GV5*ykN(gƨ^s/o'E }`1TzUlo`}3M #&1gBg2XRZm.#.Z OzWe}Vȁ5Ye*Kn%n"p VXSAPsrLˑ(Qυ KЌ|TY!H jVLTr Trac"+~zKo؛YKڇ3/\{Я;:q dEޮXx+Σ7݌#d+n/!H 7ߵcG7ùta M|T6y; w=ozB}UOHKa;s0.+j%dө_pnVU0`چ s>(,OX}5Փ/~}6{_F~%#njt(A7=WZx.`VK&̕jn1B֘rԲVgmZc;>VmKsCa0=}S>~/'}ܺ= b!jf][e*6Lki\] fAJnJAF R8j3k=Gu;Ѩ9}j+#UKI;-3Ufi6쪊59HU¢M-Mܨ*>y;zaaTn3o\w>(K9 GIC7FtGP JJsҬxWu),LJUJI\GJUQ[-5(6CZ4BV+СjTiu|rqL"6fx('i@"S*NAaWtW%Eʼn_?/73ƕbRJd9鬣9c؀Mkj OIIWN oό64bPxw~GTҫOZ UGTQmV q񮟧y0mڅuiùm^{uDWǸ+3ΞuqcnPflz+F 4jWllժFL{kuxR'r[Y7FmڷGO3=sp?n+f5j% 8 `ʘ hQ/6WhY"YۨZPʈs~&FG9}7>5卹iyI-ԕ󸸴juZHL韰p:.6'Hu@#}zp?~ˏ )s4K Gv;5jP%a[l6U,WJ3tO=C7<\hX`6إ&Y+e,b)4 H4S{2)dXl%FZ(˻iȈ!E7sfȗ'EIENDB`mrim-dnd.png000066400000000000000000000043001326020644600317140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsRGBbKGD pHYs  tIME 5/3EtEXtCommentCreated with GIMPWIDATXÍi]}9.s=gkec>6Mn4jLk ̽_C_Q)~Rj=umqvyE6A&e#a>8nz܄|5벴 x(NA0):KqMn)nP$ԮM9Ю`xޠݎ l,OpĐgl=6)e$QW|CLI6r9-cݨA\Bzi|Lk ~yie'ku^[>l>2q_N_.f?aQ}ZB-,pA Ƴwlަ[ٵ}d䞠VovG/ ?sVyi2#Y3UU~qW\|+?mr嚤VԪZ-jݵyq;ϸ]6cCIr& G<.jo]_0Kθ\Qըդ&4Uv]T=kTBTL_6,Ujȯ,V>'ZV?WZMR)Nd-D-DivuZgEH=cQ}Kh,XpjU:=}z>5%Tj5R\3찳,HwǼk-B4i՟*cOac)IKqE4q6OcD2rAkOhK.Qs'#DV=Y윽~af+2)β6њzsɒo~SiJd+s/ܱCR°YCyBtV{];m)aJJUA|^T,;(+DA D1IJUa^p/M"h՟y g}GS¸ƥ,$//!M6'nLA "~/LgyqQ u.O,OH_zO~e-Fn.OX9}ė"5$T AUQSJ:Es&NYz˛vyۮ+7YTĉ qL=dC}.c!Eёr%c ZfmsMzh4OUaf͝s0E?i8-OT]vEK,Erqͽwߚ{ui zŻ瞬׿7&;Īߔڴ5HY%TǞei[}1ROEsDBa3W$+D%qқ*sڮlB[%ANMd"g }??T8^\htXe[uI> RApPh8xq`NF~Bv-Yl1 ̋XF\,PIENDB`mrim-notinroster.png000066400000000000000000000051111326020644600335360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsRGBbKGD pHYs  tIME 5-KtEXtCommentCreated with GIMPW IDATXÝW]lWήwmc;vqB$V >xB! R!HHJ< x DvvYkǻٙ\JH%!)TE4BTZ}{f)8$_">GSԐii Aqs]W:WVW ?_ # 5yoNOO?3885H{}nrR\.ޏ3O8Ǐڌ1qujj8qH)B@0 N$GRC/WՍ V#ONN>;;; c Bpxb޺u\X*PID t:d2GXTUel$P=66:vWOڷo߀DZ&/_p? B`@55MrO=4Mslll1Bw)e18d@;%j:w.gihf[J {?D$jy7~<[ bι}Db$LH)#z9Bpt*Wa PUuib2ƀ644t|fff4Mpl6qܹgΜyU@1Mssw~kTHV|Z&H)q6^vگDMT* UUB ,155l6}Bܞ뺷(L3Gyqbb ˲T)]Y9SjZ4-9_y+eBq0N3LӴ#!q?y1Oq9@7*J@k~R0ƺm> Ovww "AT*3xnԾ/JjZ )H$1p!@SFnS.%"Pt]kV< R*ώaeŭײlBppΫKRJ)r)"@aTιzM98X<7 YVKKt89* dX]FDʇCJIHH);!$P`iIFJV > "\p. !D%أ4Mhg-!C⿒ݪuzjJZaЎyq\;xs8E`D/Cؖe%g/VN|Ȁ8`=z,ÃKKF#@, +j^M?n&N?6<jLJ)]׽VպRԓ""FD^ټl6/xw5X711ҡCe"}T+եZ7[V@nR5 ǢퟗJ;YIr$&#Hw܎?Ni2I!cEIgX2<|:n,eM !lookO cSSS?}&1ou[|oH)el Y>I;8\lX|>(p'@\.Ϲne ۣi435MD"4Mۥ.UUTU`I)sO_U;_.8:%.H !Έs_t]8ǹy<@c2Ms*N?l!]$Y $I ~[.{q˜uN_ct:=adzBQMy vqw{ZgPPɂIENDB`mrim-offline.png000066400000000000000000000045421326020644600326010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsRGBbKGD pHYs  tIME $\*tEXtCommentCreated with GIMPWIDATXÕW[$UϭꜪ鞞]fݰ\D@($F O>*hxD#A j J\]`wbzz:?B<\@[PPGq?vЋ4LB0 / p* k-Z,Jlv3q/8t:q|_Eyw 4" k?|1js)<vB@ 0s(ޭEa!B]iOi68ovq|y*^Jb(uB(tt !|5N`Q0`!jE7SJ67h!CnN$w԰( di!˲Ӎ]!ĵ(PAzsUU4M 8x6\K|!D\NYkRTYeyss1ƄUUJM0ZHƏ,{ c}]OjɭzΝaSEQL]z !竪*&F!Z8w5xaҀ^h+vFt}.]{PJzS(Ly&<[7)Y7_;nC;OЎ!@z7l0.5P39ȚGY A`cVU0-X좃 l۟_p4RB_BR<_ @YU)91v %Rwzy>Bheaa8yC`XXZZ|RJ!$ ,˓EQL8K8KEQeى(nqPy!k9s_0 ZKuzʲ<=~ [dVA|* Uf֟R#BHKqc:$kqίMt:}b0<EMZ+c0N l6{])u!+UUlmk-E1fO _8hzcf n)'Z3D!dNpxDk-cK1EL& #8NI89LBoZ-rc  fYc>|>>I3y?KTEQ(b-WMTUB95t7!|>5I?$I^RiǔRnn$I&jc`:]ZZ!axo$ϦiJQ礔)BiB) }_q7y"JpAGrY[Q^^A9)RjZԢZBBhvsQI$8YRt_pn1y^1)J.$T4<۹Y͡,ˎefƘPv6G1J)YfOO&'g)kCe'Ir4Mca^_y*t !LjFk=RSU,ײ,{(sH?JkF$I!a-yw8P)UU 13vbd{: @IENDB`mrim-online.png000066400000000000000000000036511326020644600324430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsRGBbKGD pHYs  tIME 5*C/4tEXtCommentCreated with GIMPWIDATXÝklyimWhPaW@"t (sٌfn/louqdo\2w˲%Menܔ@(r-PNyOSd!7[K>r>ORF:ziW\UQB&dbg~dͰ=# .eMXe"眔 둏x7VHVjTu9q봛5yAoM6D*Qzȋy )* ^J kc]2rrs[ tcqVpֱ~慨\Q@>M/r;.٩Hd!ΡBU^ˣcF=c/w+9TFk⛱IKiФ8FCF blHJXy F V4]Ā~ݺjwY'u؉CN:hVj7_-Bף7x` PwY1Ӕa1|*<AoxG )ԡK:BLb%:v~5rʔYۦiWh 1@Hɘo6,jcpşf3j[UR)IzۀnSThRe*4ZdvSUwR-n2ͦ^x6E&NզkR6J22#u0 LcLJ5rG 灂n5l3$V\#أa;eVL!"Yvx2MGhTz o~%H£S*b X i >Gm:5gL3S(0jX~|@{L ѥVɫ:S4ČOÑKdPJ f[mV3`PA6 xhEjRB  dUHtjue}u֪uKNy*eO}jX}  rUTLp{~{*I ϋ'eUCjJLSZݤ d% HOTQސ ꘝ(V"+( ]!,j6B9e?x3v8(;U톉h 6BVhXfUjLH5^u.'aS>5lǗ7dJQ\:uH #/&圓s#~{IIENDB`mrim-xa.png000066400000000000000000000046511326020644600315700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsRGBbKGD pHYs  tIME 5)&etEXtCommentCreated with GIMPW IDATXÕ{T?;3wv^;s},A+ [4 JEkLh҇iW_M#5IMhZkm5R <ecq=;$wwNX aP{JBH 0?ݡ,#RzGnM?}+ZUm*̉ VF [ǎ#,%0*OF~ɉEs"|sqes4]bLTrPB+D/QUͧY}UP*k2E95I-ZzI @ ທQ׺G3S6 : t_-a[~(31 (HқB!D/ܚdKM[xeA:IT*q<̥yv=lY@_,rb\5T)A7:I)yE0ɮQ40 E C%],9  M6S9h qn4F~d*!6t,! Ďu5<zGK .QIp۪Et Aiefb&65 QAfuM_Eܼ(iBAn qkI&ޟsv© ZdS3l4F-Xfe _,! a)g9)%ӎ.1,6 'LBlpswhD XDPjZM6{G ٠72Áj/ePflfgkʅB'[!30U .V("1h iQMRWyaJz{dJ|P1m Ai!AXk]F=>OK!#RA*|__߽y,'W-]jG#QB! 41LCJ~@B)|,, Mqrd2iA5BXR  u۞E_}yl{OX9/w89M|m@u ʌΞ1x>9'Oɺy@)04G:=x2ޘs@{ y4tɸ8󌓧'5JɗxUB⏣[Y(^!YULzqy7ϼkx4ch4G0gO~؎\urÇ+ x$;ui}s Vebb繳ΓR"䷖ |cfULrCJ М9L!2w(JYd2~ۛ>tdG>ghhhZrJdnذׯ>ae˖&:g?EK8J)E1]2HT٣RE筛ܹ{*iuuuiz7~8|NJa`fhB0 ֊ڹ4ةߧ,[!G)ťKhkk+Zcc9w h`+ К1kHk|\ώբbӜXV9y7lbժ3|>eYhƙs?qmVTpg8mh> kF#h#,ׯ/f4Mۃ **ʺh>#{w# zHOODbJ>tt:${zzv񨩩ڵ ;:OBI,Fx^>hϣK);dcY&PbѢ*BМ_9{w  cN/>c-F\_U.IENDB`sms-chat.png000066400000000000000000000026121326020644600317300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME 3+,IDATXŗOWsfԪ"1ZP6mcFmĤlOЦDO6`/h҅xaAA233j&'l3; sB>i!AXk]F=>OK!#RA*|__߽y,'W-]jG#QB! 41LCJ~@B)|,, Mqrd2iA5BXR  u۞E_}yl{OX9/w89M|m@u ʌΞ1x>9'Oɺy@)04G:=x2ޘs@{ y4tɸ8󌓧'5JɗxUB⏣[Y(^!YULzqy7ϼkx4ch4G0gO~؎\urÇ+ x$;ui}s Vebb繳ΓR"䷖ |cfULrCJ М9L!2w(JYd2~ۛ>tdG>ghhhZrJdnذׯ>ae˖&:g?EK8J)E1]2HT٣RE筛ܹ{*iuuuiz7~8|NJa`fhB0 ֊ڹ4ةߧ,[!G)ťKhkk+Zcc9w h`+ К1kHk|\ώբbӜXV9y7lbժ3|>eYhƙs?qmVTpg8mh> kF#h#,ׯ/f4Mۃ **ʺh>#{w# zHOODbJ>tt:${zzv񨩩ڵ ;:OBI,Fx^>hϣK);dcY&PbѢ*BМ_9{w  cN/>c-F\_U.IENDB`sms-dnd.png000066400000000000000000000030371326020644600315600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME %e6IDATXŗo?m#[6Ʊ ^ j(m" iDKyJ!JQDT)j+ ڄP!P٦Z zۇ7٥HW39{>眙{gl 8. a=A4k,i)bQJ՚IuGLt:}{-;rݻimicqib&H)@xO\bn~ޚǤ;w_[6` h~_XVb֚ ZFP(R ['\>L*~`_ƾ`_nx=ώ ДlrqV"(,ǧlbE#uBFQ,JG٪\ ?kbƲ+-[yJ[[a!ETr= `EK:[d\|`]+/wg@JG#/r5.6fޟl_km\',=֐ 4{w7B 03pjR!"SƦW %]]]ܼy2>>C윳s LjFcBQAT&ҳwouBuX#ӧYG6ݵҝ9oىiЅtsFF.s~"NJa`fHk2s9Le[*E뫯"kaoOx7t,333LOOb>{}immǿJ).^ȅ fh ZW4M9#&''q]P(Oɧf[x㵟2<0o_MUĻb?_`ttq>|j լRhσUo=XS׫@8do.T׷@D.]¶j3WN$ۋaC "ׯ|>W)o+x%|@ Й T @Df)^ fb(C+?#@|a(!-gΰ交DZLs'W)&&--&RJJӿ}gO*y;DD"4 B˭؎C  "wwy$IH&ic)+`%90P\)Fu,d{/%g!qm84B BJDB!p8L4f۶&p֬7)e 1ŕoMMM-@P!7J-  JIENDB`sms-offline.png000066400000000000000000000025721326020644600324400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME 3+IDATXŗk\E&1&k(MZ)h*~RADPQx#ZJb Ej**/$ ۸4ٴI~b7&mҐ Ùy}73gMܹ3jڎ QJm/G䅔+ c+ʕ(y/X YSP#?,j~HR} . RѣU+/V&gRu<E\y?l)z, Bu+o'gx~qq.sn7^+_}yv]'N|&p!Ri3VGJ.}/JT|J ǷPx$2;;å˗8:L&B`azz=ׇ5붡ve|<˱7an] !ٿ'(ʴěAhPxj?]+\}R<ٿ+cW|=lƶ%Ν3~킕Tt:R 9tT'O? QJ@ZkN:{96R@kףc[oK1|)~:9{imu릠۶ Ðr9gѱqZ1a*_=J[[333LNN`+099ִ69\0Ԡz2nݚgbbTj'0Ơb׮]ضMdY4>۷$-\T*ٹ1R 5\.kY5k-ӳtuepSJ58Cur$0??ϵkR)DcRdhA֫biF<ފ6SS$ej---xGPBkm+˲B`Y_N$ 344D̍MMg)F5x)ql,BZV&dAi)!1˅%}*PRsŚR$GsLHĘv6T Pq-J!W_ZZB@@EQNL-fj-5vP[IENDB`sms-online.png000066400000000000000000000026121326020644600322750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME 3+,IDATXŗOWsfԪ"1ZP6mcFmĤlOЦDO6`/h҅xaAA233j&'l3; sB>i!AXk]F=>OK!#RA*|__߽y,'W-]jG#QB! 41LCJ~@B)|,, Mqrd2iA5BXR  u۞E_}yl{OX9/w89M|m@u ʌΞ1x>9'Oɺy@)04G:=x2ޘs@{ y4tɸ8󌓧'5JɗxUB⏣[Y(^!YULzqy7ϼkx4ch4G0gO~؎\urÇ+ x$;ui}s Vebb繳ΓR"䷖ |cfULrCJ М9L!2w(JYd2~ۛ>tdG>ghhhZrJdnذׯ>ae˖&:g?EK8J)E1]2HT٣RE筛ܹ{*iuuuiz7~8|NJa`fhB0 ֊ڹ4ةߧ,[!G)ťKhkk+Zcc9w h`+ К1kHk|\ώբbӜXV9y7lbժ3|>eYhƙs?qmVTpg8mh> kF#h#,ׯ/f4Mۃ **ʺh>#{w# zHOODbJ>tt:${zzv񨩩ڵ ;:OBI,Fx^>hϣK);dcY&PbѢ*BМ_9{w  cN/>c-F\_U.IENDB`sms-xa.png000066400000000000000000000026121326020644600314210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME 3+,IDATXŗOWsfԪ"1ZP6mcFmĤlOЦDO6`/h҅xaAA233j&'l3; sB>i!AXk]F=>OK!#RA*|__߽y,'W-]jG#QB! 41LCJ~@B)|,, Mqrd2iA5BXR  u۞E_}yl{OX9/w89M|m@u ʌΞ1x>9'Oɺy@)04G:=x2ޘs@{ y4tɸ8󌓧'5JɗxUB⏣[Y(^!YULzqy7ϼkx4ch4G0gO~؎\urÇ+ x$;ui}s Vebb繳ΓR"䷖ |cfULrCJ М9L!2w(JYd2~ۛ>tdG>ghhhZrJdnذׯ>ae˖&:g?EK8J)E1]2HT٣RE筛ܹ{*iuuuiz7~8|NJa`fhB0 ֊ڹ4ةߧ,[!G)ťKhkk+Zcc9w h`+ К1kHk|\ώբbӜXV9y7lbժ3|>eYhƙs?qmVTpg8mh> kF#h#,ׯ/f4Mۃ **ʺh>#{w# zHOODbJ>tt:${zzv񨩩ڵ ;:OBI,Fx^>hϣK);dcY&PbѢ*BМ_9{w  cN/>c-F\_U.IENDB`sun-away.png000066400000000000000000000041071326020644600317560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<IDATXUǿ̼yov..]^aYRm6iP~1D-Fb(4 FI$[ E$)6v_k`fAg-]Hf9s}k-.Įk|(cL|?zԴ:hMyl&z}_7H# #gHX8T7ĉ닸n߬o\gO[ƳSjZ;+BJVq3LKn >q܇F:X2V{P# 5V{ÎI7'R7wq߈'Zظ#;ss?Z.w? ΈF*XH.q.C<{7,n8n؟7–%wG@4zӭ􅭪?-_^~n #*am>v=l9y:M#9-@sCn `d3yէ`j`LaMT ZѦ1Dfg}fF}S6.n'OladcFЬ?BGΝ%' ˏRtqίBݫA@mfnϾ1LN0;E0;`3eavqE.][]R B(}^szLa_pp;;Imӯ[iFTcSq$Zvxi s~Xka#Zuo=+aq.[M{`ttt7c쪎JA@k5!@./6k{9sʜPSE1 {ry'}M1:=σyclFp91(93 [JiJ)aaӡ }8Zj!"XkJ%Bt2}/`Lvscju7t]wI3I)58Ngsf4\bKK@)M3NܑR>H10 ""q(`PFB(HI2g+B)cl-oJ)ri6IfqCk 510ƤPڴTY*qTUy^*qBq]w}Bspg8NesqV* `pRBHBR_9()eBFVƘR^hZh6Ks̙IR3L9.؆ 9̀bKD^p~\xPc`!B7Sj g3~y.`;#@@N@kؽ]}8ƿ>XC_\_|Pd6l|P 0OxAP"+l!¤Gt+C4媮8* ʤrbL'g\cf dduTV~8N8! iPD#"Z!~ 5U)T(TU[)-** i vįڻ{sN?ݍM)I;>4 b5J|G cX)`80lCGodMq={"e@ bUsX7xhއi9ɷ6`4U9R2/_ީ^0F9Zc7 cs@L>ڛx ϯc04Ơa:y?W1rǥC.l0lIOMjFa"[,G}+; @~^$kבk)҆ьhMW,m%)k 4%Xx)-k@=QگuO?z?I@K DI}  ŀbJc"6Q ~[ZxY˓K>pxHxdhmjhB %HQ55Udp+PiRsH&Y%n[WUGqmB(5~xJaI@A|Eh#ScB Dهmn-մ4 *Gضqk[ڷ?*mݻ h[؜ %1/ f`,X֫p -CԵ* _Tģ6o&0Ip B=|&PM%akPS)0^f-nZPڑ4QGR[r?a (C4(06B]|4U{& L%@[rHUaIX@ǖ8ĶB LiSqMTaKpPhxifn]X)M5URH$b MYq%]h \);P@k|eg(KA h?E;oKM)&! 8aHsy;C |MWx@S 4 ST!Z$#̩.I\[\iY)h 5Ų$MQ,]PMs}#*y: 9DFu-X[gFˍI``2[ؒ]qTsذyuQ<_#q$%e6:T:0d~ec2Mz$3hVtk4ڬaP#5y͵9?c^S=KQ 0Zb8 a$a|M 8;2kbIs '%U ǽT~ɄKĖ!}>-x֣OH@c!%4D^XLYVG{SH>4X#xӲQ9G3LTRfŒ~624'&99Ǻ$+ aiēٷlDuKlٶ`p<7h:n5d MQT/kdz'cXRX$.ڒ6)~ _MTy=*{4zhg22Y`4S QǪLEJ@w-͉:a[?~z x'Pxtb/=m}vB 4Î{nceģ=6:yhZ N@8͚^DzjQE_39169ͩ}tyB#7,۞]z !Px{=ů. ϴgby`LB>{'ntg4'3IENDB`sun-dnd.png000066400000000000000000000042341326020644600315630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<.IDATXV[3^KްId@\PQ(Q"BܸBh /m*UQnJJ ڄ  \ͮ]{x3xityx}?CQer }}R 1::^9RJaxl>M)}T*3DJ۷_],_l*˲ @$8z苞}>O1<<| ch4RT*ge˖E^r%5M!RJ$IJ):>|s'IPJqo AQ̠^?^.8+m۶e2/_t`A4H)l40 Au$I::8Vrk5M Ik6ls `֭-AXD>O09mhZ`!IDQ9BC6a8-9pBQ!E7n4M80 s4M8J)6\ׅi0( E`*e|߇}}}PU5na\{Zց|>˲`t]m۩6<΂1 5VJ)z{{a6!i.'SJ`IH)AA` J)jZZR&$@. 2 TUE&A.KpΧ5 \ntRB 4 R UU*h4Jth48)Ia`ѢEhi^BǁR,YRm!4MK4 i""!p,,c,/Da@Ӵ(p]4(T*UU^0EQ1(*$eYP\.$I i8[QPJ1;;0 AADRA^Oq:RDR$$ز,q 9:jcm;5l6{[˲A0== 077 @) h]Ӊs(9 mu='Ŕ.4>)ݲ/XhN?/St:kߗzȏ`j0ANT~Oar.p/y3z`]bZE鼋~BZ0}5r0/CN̚; DJ@FңR8 [grV؊n;ހ?p~cr# YEa^(xgϥ8MXgڱ^J)%+?(+7_}țԞy Fw~s3NAs bR&;߭aS4дwH9S;]YK)O5ᡱe篼@/`S]9x 3s?wi>K⁁7@(v߭koQ$PWϻ8S%yOv{_|V$^zmF_~S~]%o2\IENDB`sun-error.png000066400000000000000000000035151326020644600321500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATXmPe-KA eL$mqJFNIJɀZ-N211:6uLD% "/L@KD>vhs9s#J)" 6 UVwȷWTGGl@y sr&k  SPd-/ 4$LKG R{Eug!VW(:YO J/BGZs]݁ * r"Q@Jj>y 4&<* 'ifBͧ>^ B A΂1b c/AȰ/1>y(#t]@9e5y*Y8N<Þ"3xLX(om$zio ǁv0xxDEE➘+©,Ҡo^ܶ308_h{5#|qu%( vglP?Mީj^uW63aǻb>J6SGq>pYH]Vήnsק뀁[oJ>.sXOo&رCn[_N f(cٵr[мX ZW*eBērϷt3qK~vہlLssg><Xl6@ dz :m>CzęKٸە=#7lbD)_V,IL$x~ԽW*b5 @D1ܮ(d<3ep/o#8h2_Ӏǀ#n;v*-> P|@lT},փr'Opqxx˜Yu;GߠW3>p]oCnc /9pXUiw/+v_d]xݾuY 1 y5.M)R/u[4w{^d9|E#j{5Řn`[ӪUE|Usi7"tRg+R M\3h\>qbc'֝OsYM hy? L]P[@bvӟn4nXևךHNN&66rȀ@ @P}ߘBXSՀΟlxw ^4y5kc8ׯYUJC|΅lbGL S'**S)SK?Q(3|::xm_gjvX> / jZ]5nqX~lIՄ$H@k&S^LRKfۑ_2 Uef/zzsr.9+ߘ lUJ!O`tJ)RB xI"0gN3??)%33|~ 0[ۘ%ɔmU,F29O8&LR|=; >9g?ennWffD#,,k9@;;;Ct(J&jDGt2,7z{8u$B[yp#v{.dpϏպiH$܎PQQAW<L/fg 4xtc G&S]zXlDJ<`]`]p)vq$ 0>gtlh$cel6T !$^ {Ŋ[I.W%iahxZ(P q<[̱N'@m9>Ϗp!'P?<tz JD|r"QD;^-%{Aլsy ;Bm655uSx JV~ 䱡-U^IENDB`sun-invisible.png000066400000000000000000000043561326020644600330070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<IDATX{pǿc_,yH@#E0H"ԡ>duL[ڱC} > q *MAL0 ynu&a bazf~3w%s\EW;qr@c]&!+0sOe08#C}خRyMX=/)aB惑5ә w~o 0gcr$@H[L]T\؄]/ `[b- @P-XmFzgcvjB+ĈL #m#=4FR/[&9L aCC;3o8c) 7~ku@ }R-z#u9 }n#`p ;g.YF曊[ 2p]&=uDoT> ,ԯ\S6m,ˋnHH&[~q\Iսa`w\nҢe&}rj"+7>iծy c+zu;gTs6̔3fT*\wBreY~R0& q~N(AYY)ƎCՏ9.Ѧ?yJh"[?k,$Zf1EIǦ+y7@iL%o/5BGa4+~V僔k@d! ] 74y>x*uǑS:aDOjD߿>I^٥ϲ]кZjsn媪e7n@l cM@8isM@>Kc* z@$9ä́ҼUV:u*پ}EAP S,!L$ErZtm"P 1c[k֬YEHP>pATX|$3u 1ɥ6zyW$woesPg%zs |4 9\ Q_<=gfdocA* ޷M./}ns;Es!dѾ!qJF9UҲI9rB%Jk$S27͹Df[E#ļ1&L#np=0ięדK(`` EW ߃N2oDQ$a#ʂÈ*0cfpX)Cݷ*"b »Ύ?0(;''#oT^48@79c{M5mԎأZk|Zf WrzcuI< "u? =CJ4@& MP|k V7{Z {=wo%J8(( BB?] ʙ[Ђqto-tM6x,)\z*>z}G7ͬD 2`EJo~ttL"+Y'/ QCEy0$7S'N%|@&24v[ N#I ' :}ZA'D]j|]p78{/JzKɳS"Ѯ"d@gТ ?%toI/ʁU6+)d9qVXhZkA߻}gd0͓_ o_ȁfc^ P&}9w:\vO\۷;ݯ@ 1TS@¬|fW]#ք*J`F3]9nkT-$]JDtLKPQz$# F]f$|]:jA ~ Y9 34pV=5g~J& W_ԴVm2+mذ϶7IgM/gs?mL={m}옮/Ca+okɆێ?K埭\q/Ue IENDB`sun-muc-active.png000066400000000000000000000020331326020644600330460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME !sIDATX_hSWǿ?ƴ)@AX_XA&:Ht/*%1= BY D02(yrL, ,q611'瞳MڤY sw~oH#FCCC\.5pjsyw8yXoo`0JiSNR}1 ?sֺ `@C@)Ϋ2{Rc _-'ccc<^ ?>߿f4R/: ߾Ahd鱩`VȖ =Kq@s'J fwŭs(,$I'._ϋk:[ȓv)@)[͝uJuz 6Z)شBXR@@jN^J "l:[nT i&A!kpeaffq4MضW%NL "H$ "=u*&uEoyi"NRN||<Lm+$xOX:V}v~~Cz#lթ+E7ݟ8{Z`6L_*Iet?|>_XXC>Eo~^էg=_s\D^hW prp8YTK-Ӡ[|^g^._}m+ BSl۾ s&!ZKԍ֯OR8@RUJW%@rFStvvsss|fFtD0uwa>}9˒2 VXb:pv 8bL_\BѩҒ]zQݽDP"Jٮ @Ad4}SvUu m#X١:v1'˦옗(7,k KлdBBIENDB`sun-muc-inactive.png000066400000000000000000000017761326020644600334120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME !sIDATXVAkF4,ohR C_=RC()!R989l{1!%罥? ǰ*b\[iz$&i9`x|Iݤ$A[[[_iְmSclR+I6|>BDspqMD`0QJcl,c^4J)l~ $Ip]w"U loo(Jc8Q Ifff0??GZ_]]5(v]WWW8==0m/)vCUPJj)B88AU4x\HF(LRQ&3q&$Ɩ S|yc < $T JR لI D7#@cTUE. vF*j˔DH8??gggg Ȳ|8X .Wbj^i0IeY!NG Rf|vv!mAv#J19nnndx.$IB6nw$acrpp8 b68瘚c rĒeNZF0 fYVb\ X,~M)m}}=jiqxxط,GuOTտ`gggEQUUzGJHDt:*!@u4A|m3M{q~*Ѧb~scRTg2to<3gBA¼a VeT.K^# #ȓ!˲"1R41 ") ]~u}Vb&{9s= 54Cq/dWoI ~1z@, V`ش);: 5Eg:|#1pbB H2p2κ 㼺};xF5L:;sOdW/4g6o3FhMŋ9s6oDs0s6}}J%?:ǀ3鬮$S@xAtxm\av5JH%Z0999_CL:xM?q6nHVXV (5riVu4M&&&818H0=Uu&־ ]SSöm44c(<<=Fk-+Z٠\ŰZ[iniX,2^czzr9p CyL:;#28@ƍQqib&ieYXisiE6HSt>T.$tˤG}yXU fP331~9(Hw#: ݺu}>a22:z=ݪFv|r9LN8{W.tvl8]Fp>wW?ɞ7`e*&pgHe!v(WXIW:::PR1ruy&{n_„*=%LN=K'. 0f+P_,d<IJ XVIENDB`sun-offline.png000066400000000000000000000023161326020644600324370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs::͘tEXtSoftwarewww.inkscape.org<KIDATXkLU߳3יeZQQ!ћPI(bE[6&i"1ioIJlhb1kj",6҅.{vew%|>眜3MpR;j M3zU(*$è$a`jv䕺tҫ5mj$d[}zMnuwX= ?dm9bJV .++_cROQPdeEJDZ1@B]{{1<DA0X<~]45CU9yz{ à X0N%2 PUnவ`1r($Q^VBث5:͵EwC L@Si,4MLq5P6mm^n6IFy a Y! , yg_ͥqlŅ[&qLgL`}.Y:ڨ\$(Bh.t]|^!\Ţ}ε>+EUBj3镘gRbakBDt&TB,Rs :`1cAQHbH7 O-+$ߺFxAu TaDf0?۝~.X @uVX06g XJ8(ڕRۭt1*#)yB؝{fF,!euK @Eu+߹N,OS'KtΩ7׿lTc Cf3qrM$G5uڞ6Db?BlWeoQ]cc#^ze)t/IB`1 ź@3SۯlbpZ<P5U^j)d5YN+ X<4^U1zd g:,7IENDB`sun-online.png000066400000000000000000000043361326020644600323050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<pIDATXW{pT}nn6<&4_v'ǽ6 F"ՠoE*4X|kF w&] Ή/iE4 I^o0%U*,=`;GRuH}xvχT֢GET^ϸnK%j~@̘.\#OmNQ"}nCn@V Y{ H&| ׵;벃ǪMmռn OI1W{N><_F紽gL:*l0 Y}/_;C[_껏kgY̸{L\*n.1>z؞uޱvWϣd5£m=e3 jyEM<\崽 u 63'<ވm(+ .{F0` S+ e%" u(VCDu=OAYs%|cYGvm7'Yl<3Wxt{@dd  吮q5ZBwi\y'lOyF8'u4a^]?gȹȑ|N0dO#vHk0MIɚ艾|?gqigc僇LY/gdn|ܨݯ ˉ9SQ"<͸<<֟ke, ~[fU=2d SnށErW> =Kfkv չ,~Ɋ֎4`qDI#)@z_͔इ:qƺ#s{DߪO7?l\qZoud2V =dLNm3OE-I 5 %p3ם!t Ac$Sox=1a)^b?( K#APY)S O#B7F] 0bVmVVG_V[!%5bvf$,4rlx Hg.9 !!A2xי hbS26 j>g"8똛3;וرNU:@RQ Y7DpajRhbm8џom>}_xS\v˚M$yP9RH^ۙFB,)Xxs>{?Y@/\û^W4TW4/?:MLN҉CZqH;AX1H;r 'r3"|YU|vO'Ǿ׸uZ^c!;ӠhEK T<"A$.ȏcqL:s0(@'I ~^\Yݐ+F<负{;U'swMj}J6S޳vs7AEq=Fv0kcgWgF.^^[cuиRD)< ),Q~yZuk}tb{{*߉) ڢkl{}*]u;̆6"?;&Z>S//u.^⛍?Ul7RTu6(gR!,̯M>& 1` W@ ЊK`'._B /EY 1zFп.E3IMIpHk 2G ٸj],Zt_|oX .AyA y!rssZƃM`@kΉ Vs5ZZZ,-l^`dprmVp4o#==p a pΝ=ˮ_@k 7s2PH|ݴ8s˲xikkm bO}O} {/5irf:Dm #ǁWVTew[ 9LduX7@P|`-e0͸>qy x⻝+en+;_[4 ">9W HjF^!Dexwn+x+5|< 5+]͌UF~{`LB%&"LK,*Q9 u151Oc˶d y󩮾7^X>qn 5$щQX ZcN̢R"]gFN8{}FhɒPQ^NNNnwn|qw ۋ}D{Ϗ>Ue$-#^8JIL^^zH$(P@*!  G/!@M s|3Y đ7m BꋬMR1paZ֋Ol3$1V Yp5‹r @¡Y'>iZr0ve|hzπM[CuD @4P $d 5˃7c (`wlKVd;1"I7>v|bpBvWcD Yȶ?4R|uƇG<9(ǜD?sϷvm{mx׃&sNu֍03jnj덊Ԯ:ΪBp:bXQZd}gmForK{xwj-]` eZk׫b)7r(;k35zRZ{TVTdbFǛ8z +k:UUUcRϺVsZ^{.|-~J)ŎQP @k*rrcyPWWe2Ӣ5XZ3q8o+ ˖=BzvRS e&c{p8H{G={bIv\d!LQNC#1~]@|%zJ'QL*;Fp0X }X4l7 9p-yE#Kg47n7v[Ti)fk80N p_m8w=(wko xNn&w@\Bur3/k/TĽ:bIENDB`sun-xa.png000066400000000000000000000040131326020644600314210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<IDATXUkpT~sٳM2I@;@- E;U+t,(8 ^i+ae:vu\j-E,J6R;5hB l69g'盍n39{/CcL&#-Ydg2\ B>?5>>MH&ROX,Teu|>r4fW)1 !!pGsۯ|ڸDKKx<EQ IaؔNRMMMVX;E0@)eYe،OLLҡꃭP,C$p_5(ʆ6Ae0.ceY8{,"!"DQPJ|~̙3O- B_4 clff-[p9EQnJ&XhTU <J)A10`F D(ʜ18]ׅiuwtt h4.<σi4;4M8b<0c m<$I,˜9BdY&Ŏf2(ʄmJ)<σm(JB(/ c P$u]^;!(" .+hT*xEQc (0Mau]~ 8@,CE^>v۶9s J}0`0ȩki22ǁeYܡ (<[_ɡS4%.۶a,˂8p]gU*٫!I0of߯,kҬ*۶Y (ːe,#`0I8xJ)DQ$I,3{GllllEQp]# \.ϡݟi}>Ϡm۰m6JM,EdGPc eq@ـlBB/_ iWHӌRzA$J%/ d2V^O?SUU yF|_eHܝP\|GّH$~FoD" A,JB֭[?s8عW6Vd$t:=U~^?{c/Y}o>y-X웢(F B춗F6œ#kӱ|x}9?VcߜʅuҞpɧ`dk5nk`㣚7ڕcly΁@5w *VŝgE^<>М-Y.m;f;{>25 yQ^)CO,s}||DO,B2[:xNﻑ?koQԑ2jlpGZ__plr h~p쮃9?7j[Y5kgqߐWd^+ݐϩ^4+Ib58|M{>T>Rw|V͡E&/-kn^\wCɄeN]9xeʽ d'kw˦%;Z8ՆSƯ'\QOpa/E=*{X~ [5ߑ!cD,-b jr;*&kkfߌx^[IX'xLvź!jFav4Ul]Ue0м8RJT6X(E6æM=܎:RJOmi uW+(AK49{ziyyk$SL$/`Ye4I涍 ef|=;]m$jBBiӷ]esdp} 7SZ2Z[ˁ_`!,7}Iv*0E0#} s}#1z{:LWx1K<]I-ȳ7|[Jֆ8 &c]˥SS[=R "~Fb]Y)d J٥s@Q@RL[AٹBbP )I_=XU\ {p_=rWp|p8z<@ Jz"Sd2XWը #KM'UA+@qz7ܿ?SE*(t:&H6m1`Jণ$T7cUUrV 1ܲ}U`V %5ФH~7j4cȝR\9U3=B% _57Lr"PꯛKjM {^0 `;(rC`}YUV3u.h7Em IENDB`tlen-dnd.png000066400000000000000000000017771326020644600317310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME IDATXVKhTW=gf&4tIlӦ& D(A .;,lA0BA.ĕ"ظ|,J5n#T1181is>aǕ?pΙ{9C/Ń)yZ(9YW`^W2^H܌+owI VX5038]w.;fv@  vx.`<޿t[¸ohGf`]S@ ̐aEYa~}Lu=GV`f0PptA k6=O+j#P؎ "3@6 ?_1@Jg.mUP%phҤ]vm{SOO*Bv?]<գDs3C̆ OoO5 <1DB^i-B_KAvW@k\~/dKMN޼+6M,sD6ьܵecֱ903ȭ@pJK㞞2 Jdu]XcCF{RtÇ!B>64 ˑoƭ)?>,Z +U-m:윌P]l%RK&aM!e"lqLL~ll4,oAdh5Z`<5ӧ -%[[18+MڭW" TSGmhrd[Vfg17o9(~%{knfƠixE =d#O)HW  X=7Yw(&0XҴ!P Na {.j+챲Ak-?1IENDB`tlen-notinroster.png000066400000000000000000000015121326020644600335350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME ӘIDATX喿kAǿ~I!A#h~4Rt)V$N h`D[M: 4!BNK2_7;{wfgfϼ3 "`rjζdىśӁd0z ϴ8*O"qB[TCLHmp׮.&@BDv,[gWx: :xH1XQGG@b!Ttrjwo`O2aPSqfL$L \=AFz}'$!?&sgf"=ctV_JR,! -=FO B->xHJV-[9E$$^cЮh(IP_nH`?92Hea&^,\%Zve!goޱV啎zhi떞!g\w@ `ܮC F(.B@O@ʥr>:fOJC%~n- ѓ cLw0)؛%%"}/y=\QăsW^I@*?6 $`Y`kǙ/ԛͦ4ė{g՝#ÃWEdd4ݾӇws<4hM{Kڞm JͶ5VR*ݥHV6hIENDB`tlen-offline.png000066400000000000000000000015471326020644600326010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME  b IDATX;AYު?B x!! 8;OϻXw`gzfvg ==Sի{&^|-N}b*H$bYハϙ=) |A [0jh6E荵"\D80 LQV/pl5|.] @rON 9X^9 &Eյ_[,]^9ckkkn<0VBn8DAf@!x>&ݼ,4BHs3x B,fsɅ@#i|+/((D=B½Q%aw|`cc1wރY Xk:{{`KL1 *dڗ&B Hʆy7'@RV*Z=_kOª~T508cѮ/CUM3=ĽQ\kt9uD4xkϏdS{|Čמqɥ+mgjxS.cπ@Ť򛰴_UBSz(d,w*,  ΡOOzYeŤ}:`^2s{pݻ,ky*< ?}  z߻&z&~:+C!\ah o0,εIENDB`tlen-online.png000066400000000000000000000012331326020644600324330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME  b=IDATXVKA}s{w "E[X`a.C"V.$wCBb!1 ;ήc3?{0yتS.1}o4֟h]} >;lVd "{f Ȍo?ʵmoF\19= L, ٥:5 Ј@v"0' dgt.⨈@)2y(@Ci|Wq,j&IENDB`tlen-xa.png000066400000000000000000000014101326020644600315540ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME  bIDATXjA=YxQH!xT/c^&D}%3H< ɻ(dQ,lxSU `w|FD'U-t :tZ@%N;]rK;R% /fWȅIENDB`weather-away.png000066400000000000000000000032611326020644600326100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<.IDATXkUk}ι9wf;fLJp1%AMLl:F$VRB !}ljmSci 6/$Nڦy8w}{~~0NXZ,Xl׏s8̸!h'P;V1B[@v&PySMM;ӛВ#\*+-0}=p܆GƂс&Gz="]J'_1Ĭ dO2ܘ\cӃJ<ޛxlpVuLdH,f/ x1v89HAn"^H} \#}ށɑK*ʢU5oW5kuF8}Yɽ 45^!dPřӛNA"K=Ey-fJQq) ½k3aB9>=Aet>+ IeQVA:Y|I1{7 VA,'S>N(F[U7 pjJ,LRp%9BAqeȘ;8LxlN[$\k| @6_dl+OŇ` kḟpĻϭ:>xɝD"Qc0 `&ޣBSBOL 3έS-t`lJ3&W0:4IBPA&fq#%h`nw^|[46n:˝$zq?W^f˚ûyK[!l;*eYvE}M[: QKf>?ra(Bh.+q\D0̶[J R""H)AD`f03RBk c ,3ŋֹۀKMAHsj >{?s{q 0Rj.MS03y`-wKL4Q魙iA!E8FERJA0((]]]H8SRsxhf?V>cO< !$ 8FXDWW8OoV~rϻ?& dIENDB`weather-chat.png000066400000000000000000000043641326020644600325730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<qIDATXW[]Usq}ЂR"IyHDC &&DcÇ?>>MA?iQik˴l{=Zk?m?\?{de1k9$wMy098/$'r"Z>c<صb(˵@lHCV_Ƃ1# X)ϔȩC#,]UYgnq)\iTXUPTpL\z^ Gf;H2s&œ@%O YWrFV\\n1#i X.; t:+-Bv!tz@.[D0',F2]MJAݍ;_8/JbB! .E*evS7R:jubD\[T;16:s`l [S_o-t(KWDn1mBh+~&jjAb GRx\ML a3F4-d^WG %MTcSeQdV 6OQc;L#U狂ǀD#6qlg[w}UkZu@[껥\C (@!`0C|Jhzҳ hPbpK=`s>u˵@}cZMb/ Z2{/P,TaAK] ^kzk]~>m*Rcիj'`5 )1Xpxo[3jes-fEp< Һ f&_M}l~&ZI },{DCSbb&7BI kb9lst/BgkK71o%ƒ`n -tN dZLWHjY淚p灴 *gKq(8k"zfN&_1Y&W J>&j/}Ƈ*`gf~z0t.Ь).ogDSAPQEtE?!D5_&U40hixOyIԊՄMoP>@W A'$ x ! f:0Cl!#OyPZ& VLC X.EWqX Àx ׯЏޢ?:6! 'Hm-ypH`9b~.t$!ӷKA/ĥ4TmH."B)&*%.߀KIkL}N d3`:ԻZ0gcq# =}Af 2<qFT^֡(oܥ-a{RLmC= MoaKRWx!P@2ј}H:ea\UjW(|rQ5<(:4oy@џz7pZg~AaJ)vD%z?ՌzQK7uj> ɃGkyHCVDY=slhA>_Cl߇P=eZT"0(HrNw'3h1zakz?0v)#J_@Ed1r.f'*ZAMWT(!('xDGAduUC .}~gc9HIpesD0eF !.3 !}^2IItk&5C75FUub@P6 #4"Ql `~hLGM! ,O+mӸ|G Js1`S8ȒY^ H~xn_!3ׁVh)Z =T à}Pc &8&1 #$?ON1q$!lFH)(8+`!`&'2UP&f! 8F#.N2??8v6aFM-DC"'w FcJ,jVڳ',ZS0WK0 \]Mڅ.7tth,zB u Aưq9|ֿ lIENDB`weather-dnd.png000066400000000000000000000024371326020644600324200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME  (IDATXOhUǿ7vgӬmbCAS z]1>>d2hkki<RJtuuH Fu݀TQn}D$߿SC+ÞBH&uF0M"NR !RPJ0 pΡu]n܊[+wѵM80Mmò,pQ.BZ /_FpmP( ӖIB_ZaA4;3[JW HT*Z4MqH$8٠B\[^r9 x8!R RbrrQ!DQ0 a6} cnn¶mtvvX\ _n 0n^riX\\Dd2RH)===:8hooG6EZBȨCuaR2.3__2s޾~?BhA v<>T̈F:?%ik_n4h`WƏ r=@H?pg}9Rk4FGG`ށ]WZ[7kd /c{;NGaTIR <,.i|nw`f>x鿓YBKAwL]~UJyu/D=~Quo#d6?h ~5 "QZٟ[J֚-}"Barܝi %~w`K-y@Dە0#LwwwWK09غ![)Ib#oEEy% {nr/T荖 hW?5HdlO)Ͼ'MkQ*ݝAk 50){# nhLDgJQK"sS@ <$Ie{l,QT)]H!4Au~3=_LIENDB`weather-online.png000066400000000000000000000032611326020644600331330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<.IDATXkUk}ι9wf;fLJp1%AMLl:F$VRB !}ljmSci 6/$Nڦy8w}{~~0NXZ,Xl׏s8̸!h'P;V1B[@v&PySMM;ӛВ#\*+-0}=p܆GƂс&Gz="]J'_1Ĭ dO2ܘ\cӃJ<ޛxlpVuLdH,f/ x1v89HAn"^H} \#}ށɑK*ʢU5oW5kuF8}Yɽ 45^!dPřӛNA"K=Ey-fJQq) ½k3aB9>=Aet>+ IeQVA:Y|I1{7 VA,'S>N(F[U7 pjJ,LRp%9BAqeȘ;8LxlN[$\k| @6_dl+OŇ` kḟpĻϭ:>xɝD"Qc0 `&ޣBSBOL 3έS-t`lJ3&W0:4IBPA&fq#%h`nw^|[46n:˝$zq?W^f˚ûyK[!l;*eYvE}M[: QKf>?ra(Bh.+q\D0̶[J R""H)AD`f03RBk c ,3ŋֹۀKMAHsj >{?s{q 0Rj.MS03y`-wKL4Q魙iA!E8FERJA0((]]]H8SRsxhf?V>cO< !$ 8FXDWW8OoV~rϻ?& dIENDB`weather-xa.png000066400000000000000000000023301326020644600322530ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME  (zIDATXoTUǿܹg>f:yuD J,nL& mBBh 7.4>5)UM Bgvޙ2yq}07| <,ΝH _\\ؓdP,yB !IgMjRU)D؎LV%~K@Dž}.)Po?FN>&!D_S#O~P\@^U@O;6z6Cg{Zժ5\ޥg+Z_}LaH:A9Ws"Fh=aJ !?cAK( o)[+kHk/5rϪ4]ùʟWCï7ž 7f}xX4ѸxlQ.M ?bVV6 lz3RcM FO(IENDB`wroop-away.png000066400000000000000000000046051326020644600323220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org< IDATX{\U?1sgtfgmi.X%"&j06M /"(&&7&&>bDO1DԚ@IJiJiy<{;-m!H#79{}~s|Z˵|wlˀN=ӻv\zlFёnMX`x x|"##~\rnqB+Zk<ϟ`*K/8y/v`m+ǥ=?7^z#W?q/ƘY];wضx6ww7'DXCe:W _PȦStwf] R()izC>boO;mR>?4nt#[w4gubu+0ҕvO/v\LoMLش}=_?>5SX!)rl^Ǎk{u \TAR(Vĩ2BH!,]$Wף &&K᫅B8qpHogMbDI", b836v}5k#^g)͖Ҟ%L"ڭ"F{p;_[arĥ,JeSK{{LѱPjJ]ϟj OivGSL) PLϺ8ϬDiq&`P9$ dmwݹ>:H79ߧ)gM hg@K3޵iN@{[W{6{,cםkVZIJ,SӴ+*}?8sԡW;\3WO !ZnYӳtah,9=r@$S8{{txt>1ej%hP+ y%P2c:@ őw^7_TEv}^/hP<#DZ i45LS`1Mi6].}1v45db438ClDAnZo}G!*^=LCbiLCö-z6nsj2z #Cǩj1hTݒ=71yZr[?/vs@~fR{! 1aȚRnNӿs˻VSāO˻Vҿs4IC#g5z.E_ws-|N8ihR04aْ=R!a>qb˖H6הqa(`4uwY ٻIPX4qbqZS-k XRcvt]q>_ۦQP],]֎5QLOTڀ@8RUb![N]!5씍DWH(5 |J$q ;ecH ]k)Ts!4q$,ΎRI%m4`5T)uJUI*QX% |Ij*fb8_4cQ8VQS.M1;Kٛ|L]`,H*qX!$a$kVa$"40uJxsYӟP&DqJ6$qP)PU*q8^C#a[:?CfTH2~yǯxv (ٱAʞGB%qOW =ϋ5'ۤK FTT\öti`H4P(FaҘ!+Kcè4 p&4'~E@^5==5rZRnCFolA|oTsq%&HIoC #wZP)+[ nCNOODl9=sܶ"sf>@2WòXn:{nJ9!m칍ư,⧐aԓOйr3m+( oݼm :W0?u˟Ԑ]qVHW.*(Q,rGxS(%tm 0&Սo÷r\~heSAڎ^w+..)+Jǘ8Gʅa⨈i14qT\f)MenEڎʴl* ry୅7{Fɟ{e cL?\.D1D%K]e7мbWnsze`7^=\]Yǒ-H]h>1MVDjEL,i>E4x`+Sl0xlp²'eKo9Ӷ۱ B..%el>tBeghンL:dKoٲ' Nd b_Rm7l[aVŤj"("C2Y%H'z͓CS oiYԴsL&*A AFBt*2|eP}LՖAZ7n|"օy%4 ;pjUJ|'? +__kkL.ؚ.mksҖ4+Z( U8_fccyEl4RJ:^EQݜ~֞x(P5bIENDB`wroop-connecting.png000066400000000000000000000047231326020644600335110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYsetEXtSoftwarewww.inkscape.org<tEXtAuthorJosef VybíralxtEXtCreation Time28.10.2006H/+tEXtSourcehttp://cornelius.gimp.cz'ZIDATXkl\>~8N8! iPD#"Z!~ 5U)T(TU[)-** i vįڻ{sN?ݍM)I;>4 b5J|G cX)`80lCGodMq={"e@ bUsX7xhއi9ɷ6`4U9R2/_ީ^0F9Zc7 cs@L>ڛx ϯc04Ơa:y?W1rǥC.l0lIOMjFa"[,G}+; @~^$kבk)҆ьhMW,m%)k 4%Xx)-k@=QگuO?z?I@K DI}  ŀbJc"6Q ~[ZxY˓K>pxHxdhmjhB %HQ55Udp+PiRsH&Y%n[WUGqmB(5~xJaI@A|Eh#ScB Dهmn-մ4 *Gضqk[ڷ?*mݻ h[؜ %1/ f`,X֫p -CԵ* _Tģ6o&0Ip B=|&PM%akPS)0^f-nZPڑ4QGR[r?a (C4(06B]|4U{& L%@[rHUaIX@ǖ8ĶB LiSqMTaKpPhxifn]X)M5URH$b MYq%]h \);P@k|eg(KA h?E;oKM)&! 8aHsy;C |MWx@S 4 ST!Z$#̩.I\[\iY)h 5Ų$MQ,]PMs}#*y: 9DFu-X[gFˍI``2[ؒ]qTsذyuQ<_#q$%e6:T:0d~ec2Mz$3hVtk4ڬaP#5y͵9?c^S=KQ 0Zb8 a$a|M 8;2kbIs '%U ǽT~ɄKĖ!}>-x֣OH@c!%4D^XLYVG{SH>4X#xӲQ9G3LTRfŒ~624'&99Ǻ$+ aiēٷlDuKlٶ`p<7h:n5d MQT/kdz'cXRX$.ڒ6)~ _MTy=*{4zhg22Y`4S QǪLEJ@w-͉:a[?~z x'Pxtb/=m}vB 4Î{nceģ=6:yhZ N@8͚^DzjQE_39169ͩ}tyB#7,۞]z !Px{=ů. ϴgby`LB>{'ntg4'3IENDB`wroop-dnd.png000066400000000000000000000046131326020644600321250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org< IDATXYl\;۽xl vlg8MPTHBD FyaD)URTRԂ!J)$,)RM:s#.\^^;rh_<-l~jW _կ1nxᣟ_3;'nl{um^L:Hkjfy{;x(*RQ(e/a1 g+;On溮2v :E>FJBvGM]= 5B P04gwuv5ǿyӖv\bICBQU"y=uqǶoƍ=rɄ(s!T% URH*PolmjV4H0y~);)yC?$@@l8>>]DRď ;1B]^K߾Xn%HhM‘+֭oMDע B$~DBZ;oEϚ5] ss© >"_\`Pe喵TbaM*FQ*XZm (7 >SPkt-zJ5=\qJ?/ilEUTrlaM*2BhVTEu~if0RR0 N4MR 0%( A0FJ8RnR\)ka X\"AC{;RJiZ,$P]<5 yQAwۯPBX68FkjYTW)Q/C:B2Y0v Wَ92Fr4hj$ S,Sg+IX5ʨN(" $R|2I>5Tv\oMMO\u=! \Ƙ<9VSCP B%;GFǫ!".b3ŘKSc&&S,8uOu\wjz̩@0 ۬բQE-S''y`L P*jDݒ F"^=(R.H#uvK/L!\pp+#^|A}9{)޳`$zdT*Nx;POucSoِǙ$6'<VOA. 8~4nF32K/ /9|Ox H[NM]CK_'E\r%ugGSOիKNM;oI_%~L"ے˺6r^"p5ȼX{Ҹa˺ےt"POؾqӦMJB7Nrg(l4pg'֮ED{Wki6Ο?_^D}}CnnѤP,"M7MC* (w:fK\*ǵ VOM7֭_A:pN0TY6%mwt Ү8^4uGiͯ/1Ymk[47khmH Bey\ּH''' 0r/U *uMFpmv'_K aHەDIENDB`wroop-error.png000066400000000000000000000013431326020644600325060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<`IDATXOKQc{[+Z"!?8DV":Ď WF@-1wuw#y`yW99@o7tXk{7n:^t,R"]{JҼa0n5ly$+:XTأ,T`L%i0uMa*I3]!RXl {Kei܁0$ jf`Tk@.(`lܮA9xvP;@ &ፘkA)xv`"ѱON{Pss= #-4?<ԃ; ƅ:|%TV4K͡@QvњG&l oZ#7VF>n׀C{JnƵij3'@6֥lH F}]f`khwx9zT`i%JzFq.;ٰfnܲ0wNo{"*JE|.\lX gvӃ)xH}L>dpp?0"]ÂC`S0\tHtny;'snmý)IENDB`wroop-event.png000066400000000000000000000021511326020644600324740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYsetEXtSoftwarewww.inkscape.org<IDATXoU?tJ)RB xI"0gN3??)%33|~ 0[ۘ%ɔmU,F29O8&LR|=; >9g?ennWffD#,,k9@;;;Ct(J&jDGt2,7z{8u$B[yp#v{.dpϏպiH$܎PQQAW<L/fg 4xtc G&S]zXlDJ<`]`]p)vq$ 0>gtlh$cel6T !$^ {Ŋ[I.W%iahxZ(P q<[̱N'@m9>Ϗp!'P?<tz JD|r"QD;^-%{Aլsy ;Bm655uSx JV~ 䱡-U^IENDB`wroop-invisible.png000066400000000000000000000042321326020644600333410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATX[o/3s >PRUHZiHRZ>_CJ}?WHI!I j.R 7c>̾a(5#-ff{˖r>rh-sM`'P;}( ~d}03;vHCRGe x {*)%z2O7n\ ~؉9 8*"#?}g|N|?9_D^?z;<7J#+Rh+}9λo}7&SJ.z>{~dYB SuA+nE㜋ƛoo}Pw8πFz(TGOV[v./)]_s.xT8ct pu7ґ]J.ܔ,KJWVF.+.]wsJz5Dj2?-"#Tubb^ qyWL115S:6Q̞ZUb[ؿg!aMsPݣ8ֶ͆FfCrN9|ZkٻCTYUO_1Si lhRt8G{R4=!x ]]݇Zk 6dJ61Tj)f")AEw5I@Pd HHe#Rb 5в׮_2>@(jJI'>R@H0EBТ&Uu P>E 0n]>^D$)Rr\:B -jC5`P m,9 \h3Ͳ,cg:]EĊJ)T,DLn,|;'k2hVRrǕe ҍ[ZUU몰$j˚F?i^h1Q0 4ڒ Z׶-iJmә So$4Fժ&$Ʋy(6'3)+umrS؂"+h y,N\m`f9d&_Wd-mN׵~e||b,tw}kns0Fgye,+hMEosh̛,Ow'Om}UE-ٖ۹Ȏ|l߮5Lk *lW6-yΞxnb>uԅӒ}aS [m[71ޞ\LX=eY?00 Ț>ccRJI!2,--BPes4J)l&+S1UN+;҇)IENDB`wroop-muc-active.png000066400000000000000000000045561326020644600334230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATXil\-3%;vx/qDj0 R8PPiJ~)Rh((1Hl!!E!@ 8ı3Kd ?@5m@::` .K]P04<4===m8 |&`@cS`╵+KJJzN>7H$၉3m?8:zahin55Ʀ*B[oT}}e3{z$X˲C<{[[{1Ʀ5oJKKv者Ҳ@FOM!p:tˣMG0ܮB1ౖ@cS!nǕ]T4m當O*Jnn. )++   bYerewږe:k|itÆK6ްqy0ԧT#ar9ٰo%T͙ofz:é҅o;NG@,).=usi UUܹB$EDpB ^x^?iq=wY˖,޹`La*ph˖m*OmJ"5fUUW*{^7T뺢8vVBP!Ӆg=ַ9POJmF,JBR!TۧBu*@-Ӵ{i**)DJfBr^r(d !&Ei"**0 T4mۣ ¤iL7NPY(3e!Ez !@rIi0cH$iGF&@%P(.TЉJN{AdE!'0) +e)CQRhgy̷,Ӵ"HSq0X<\jN^V!s;F #+4?~F:*DU>k::;^\cI0l`\ش!fp:|nc<6N ش9swt!vTilj8 x=P(ʜ XWwg@~Y _Weu1"}#ٖֈ];Gjm]t? je|gѿDJIeUqH$M7JodX,4?T]@Su#.ggI;8.M+r8Ot4|[OۙX,~`yheٮbaI% fe F(έAUK|϶3mLs 9v4 ,ۑrQR+Fi/6P@`(D0b2C1- ۶3߄/Mlvcژ>qx<6׵嫮 !khkJxt$ᘊ 8(]P4^Yt@ @Tοb͊b !¦[*'*J~uwۑ:P,Ӓؔ4.^hͶ/*"CICڶ>WήQ!*IENDB`wroop-muc-inactive.png000066400000000000000000000042751326020644600337500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<:IDATXklWޙ]bc'>4Eu>4NP8n RV >PԂH !}D-y4iҦBi&k{z\>xnIIEtݙs9ιbXOZ40 $=4 t͉ ɩE0{D`?`CCc뎮;hiiYFJb4>>6wKo\xcbfYıǝO {$M{nZ33iACC}ys/]ysc;z|zztkmm7an~W_LMO'_( Uk!є]L<g45:?ߩT* oO"/ݻlYթ3gYrZSSSu0::Hjl6yDc:|s/1?(*P{Ͼݻo|Z{y=>Qͭ V#ȷUC17?\KX\,r͛^]mw˧Ϝ2%0hYc횞>oSc#_?C A $@ic D8rnSC?c|b< YNLb E$qPVxꩧZBݻya&i1V*gRH4MP੧ZԡC[E$A({ښ͵^:cۖ>VR߈ %$Zq}ضe+c<{&ڜh޽ x0ݱX,vg׮ _kG>T^% (tɣ9t4Q>+㑇QYU+_UWGFڵ1@;Np2.J{`7bb>3 (aCłg]Q]U$'o|c=@"H<6vld $_|Æi |ֱB#v< mW@ܶm-"ljoge$<#`tA6} Zk-m+ X]\O&G,ui߰~0MeJ~ C pQs]?Vz<ɒtIjk׀(DM% |ye0c&CADDQ]U44K/) d<c.@rd% BЈ(XA Bk 4Jм\d2K@fRcc"CCr VPZY\ O9himZK57 % {`| *'0¨,Kuajj* ²p2R$X|\:A}:^x mf&P2I}l^H'3{ǎXϛCC;ؼi5q]p]u[q1lݶ)ܡ,AX:;.@ c|A)EĎժRp`]{ܿsG.{i:g%0 όOLD@9 ێR"Zjl;OLN'ݽ;9=aʕ3'[]YQAkU^i~yBa2_NSeMf-z,'~͙/wlܺ+W.e,A\*KX;, j԰~}&\eU[oNotW`u/3<2%W%E ض͹0Jg4b4ba!1hf}<%|u/ܸ+/^8_(s\,/NsDؖX﬩)ixVjaYH-Ħr)XP4۠7Lc7Ύb~͋I9B9 FPZH.RW[t^(| ;8YJoSD8K3~gv=WE IENDB`wroop-notinroster.png000066400000000000000000000044531326020644600337500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATX[lSG3qb;!$@@"Ji]5 ݮԪ{eJWBڋV E>Mժe(d$rqI>هsH='|1yځzNG{?<D8w \R 0W?8phx /Ķ'6⁹bFΞ=Szl%log{M?s۟/jۧG4~?8_fOuJk)n޼,7of֭tww DJIX(x_N0c1rpxWFΞt:m6DqsF nh4j9bI$ƶmN>ّ{{|>٭T*e1ccc&}'ؘ1D¤R)s98|zr~}-l۶y1“VJT T!%SSS޷wöm,}-}<,7]񒔲ï."J㌞8i% wwJJڤd֌8ǏJ(ïR6ឬ59~7, ͊+W2z$uBBX]ZysCRR''OrUffeY7^s0WxmcoOoKr!)Ӌ=z%)KEկ_Iɓ@1VHR5Ge1Hr!)z{z[6U{{m q)8R*f}% JA2F) %yAkvC`EIf}.x܋E`;4m{;Z DRe:e0OwLA\1Btdds55TUk}(B}X*٬,oc H&H$Jf)wJlu J!Ra((V!S*1S FKA$!m{!]\J6}u}zjCƜ6>Jp+JUK #Q}=AJWJ>lhؘ>}=|uz̽|11q1Yq*Nk{si!٢5ac((EN),."n!B,rJQP1l!$Tq*$o\MϧTjqbrNWGRm<34DD @AJG+u~)J"JmGAJ@D 6\c:z&&'REU^ Ʌt(\GWO))s?7O 7~rB: Ʌ? w1g}pge;c|{,FkOK?~[GBY i=3W}pHzX<@o/MLNvFc\{]CCB!jXU`t#P]CCǺuFcɉɉ%\jqŞ#㞟ߴ_ Nwi.[n3;?O\r"SPU~677%Xwlw2\SzJO; BO?p$\[歊c K%r_UjO9:X^Z_υD:wlL]ZͭܮO|+ +lhh\T]Եԕ+_.z9d, ZZZP(UU=Л9岹wo87?{N6i"Hsd Jl.k&v:S/IENDB`wroop-offline.png000066400000000000000000000047071326020644600330060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org< DIDATX[lsΙLfkʼnرHl(%Q^U jTԋRP5bDx@BAۻxݝa'ҊHrt~|8:߾{3@]p:R:i_ 1F3kl p35)8p|){ ^랭[zRiq޹Oϕ^}핳33g6{O !z'w mZ4>;DEEÇ|;F!w}.l4'O<R}j]n(t@ NF׍kRL> RA3M3ȁGKl==GKmee/D.mɳac %>~SUk}fEL+T^/\dyަWJ) Ҏ^)"tnL;]:RTONau;7nF[, dnn۶a \uA$4Xm4Ֆ9)B"e>^/`rDn+&/ kV&JN!`zzM^cah:ssumgZFp||+õ&/*pJ=]hDE>s (%/W4>seZ4 (" C $ Bv6nX9pڟ^|a x#Ro9q.%;Z ŇLRA9_|#Oct1ދ,𕍍)oQ1!Oߟe˧!PF1m4?;c4Z+ey4ϟ1Q7^>B1'9NpuMΞf8P0B(LA12Rad)(T:= WޤuC><pS/\{mm'!8|(@/^x,un D6z#ej$B4IӘRIZ m,un«F@0̥k\  T }{1ڐzKb4"N#zC`PDˬ$=gQcǏV%"F9L:zx ^ͱ&JiR`}Bbc4"J#c}BC[j-YXXcvt(@#R"u\-@P %6>"u)I"6&u)TR,PZ4HZ V{$.J)a@CZ8k}lC6h#@iibH]Dx$u1]Ҋr4"-X H9k}V7HND{}: F [)R! 1WH_@0!Z؈GXMTDG0YڬLA 2|Fh'+\_ (J+aj[|h([lM([g>\a@jJG>..a^|pXg{Aή_p\R6 O[;6 K2\1 j7Q_m?:yԓW/ھ uDc?S I W$MaM&4bh74yۗW/@.;;'wg=^K7_oFɹyb 1\yꂯr"uow ݉ksKvgԮ]UJQ)Ɣ*K-N00&ʖ ;#ƞ+ +/w/JozTݳ6R |s) MY*}fo4@"WtYk%[^?w;-o Ƿfs{ibĈT6V浚Y?бb\F;]kn 򘿻Y#Z-UkA\J+q. þt;II$f]s* @&~W5ook@iIENDB`wroop-requested.png000066400000000000000000000046051326020644600333620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org< IDATX{\U?1sgtfgmi.X%"&j06M /"(&&7&&>bDO1DԚ@IJiJiy<{;-m!H#79{}~s|Z˵|wlˀN=ӻv\zlFёnMX`x x|"##~\rnqB+Zk<ϟ`*K/8y/v`m+ǥ=?7^z#W?q/ƘY];wضx6ww7'DXCe:W _PȦStwf] R()izC>boO;mR>?4nt#[w4gubu+0ҕvO/v\LoMLش}=_?>5SX!)rl^Ǎk{u \TAR(Vĩ2BH!,]$Wף &&K᫅B8qpHogMbDI", b836v}5k#^g)͖Ҟ%L"ڭ"F{p;_[arĥ,JeSK{{LѱPjJ]ϟj OivGSL) PLϺ8ϬbDO1DԚ@IJiJiy<{;-m!H#79{}~s|Z˵|wlˀN=ӻv\zlFёnMX`x x|"##~\rnqB+Zk<ϟ`*K/8y/v`m+ǥ=?7^z#W?q/ƘY];wضx6ww7'DXCe:W _PȦStwf] R()izC>boO;mR>?4nt#[w4gubu+0ҕvO/v\LoMLش}=_?>5SX!)rl^Ǎk{u \TAR(Vĩ2BH!,]$Wף &&K᫅B8qpHogMbDI", b836v}5k#^g)͖Ҟ%L"ڭ"F{p;_[arĥ,JeSK{{LѱPjJ]ϟj OivGSL) PLϺ8Ϭ&2P'))1<hB@HB ۶yY_u2c7!xf2BZ7VNl&SfGσ4, J7nmC]U!³ƬJrѹTPɣs]jH@[H f %HAC,?;!:J k.KO~#EǢ6_-FGgso'.w]l|$gt@W;,ˢBqIO,-;=gό_<00CBL5@io4Ag_`0pբJPrf)诞7:w M77( CCìYV4v5Kһ fz:w?kK|; ح!\CI[iQ[&w|{yġIXZC:QaК$Qc۴P31M4&!Z_ {϶kj~rW-[uѦ<#ͲAz0qhc끃dY$;n\Lj17rn-ua쯮QslK~3gy{TC|\qPR i\z@۠~K<éܐ|O(˦/>7)G{NykK4x§ؐ*iթr=82̙~^R7y?i,ޒuiXvo |WΡ.($hF!X] ]i]U5':+S~_zc+[X O \S:uh){0Rmh3\\æ]bbRzLjBBgmXJݏmE4p[2IENDB`yahoo-chat.png000066400000000000000000000033601326020644600322460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME ,.IDATXyUW?yfLXH"LH[M4Ŋ$ M#.Pbcb "pj"Pp2 }3̾7o+9yV*HYRٓzuJyV}ܲ^{XyC =%|zH% @ߴp_Mbsydj'p0Ϩ2eqq q/"dL ;˲<>1n,KB  6JPZʸkll,RCZ秥X`_cX_]( ^'kdqy H;diA1Eliϟ5u$ ^zD&=3b6ZΨO@YghDkb9Mә3IAD"`#G8ho)0)pPD@wV.FhxhIeRFձt6^WUbϟyZIfU;/k '6qPT`ǰ@]{k ph@mmkngzh'ZN-Z@g:'d∗D54db{d}_m4}?τI=LJ᫖|F*("Թ|'˒1J(v@}ADnK "U(_ äCPT(†w/{A ,b$%`LRo_ ,?&A)PX/+zz1bR$(( #FȜ\ ,(BɕKeiry)"Ss$w˛UC}Hѽ͕??an ڋ('d@}wd_ "r勿"//*#L61X2Hԕvëۭ7*<<&ߦyhjjbRU1;)D_i7,f@X23w@iiMtf~?Xp5v3-qvlv`zfc.U@u&&0[z"[U5d|>{P)U.:ZA0e+a-Yocl7YlVpNx\߹=)Os3 e3ZeGMG|(LHƱ;r:|vxT-?y`J= !"/o_\5bKIENDB`yahoo-dnd.png000066400000000000000000000032041326020644600320710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME :ov&IDATX}lUg?9{{ZBA`24tS,:1,S؜l-!!3|Yt"L@LRaݽmro{=y~qMv_K|sm7u%e7FIYiGL`,Kc nnVK/iKc SV_EQ[.>b OYo) L!hԡP+oM]sO.sk6JK!!D6hhV%v,q<8iM4_1, ^JƑbC1k=̓{3uoW^]/*/}.@~JTYudQY`tbAT /y;i;fr0MV"z'LD6|iZUpsqkSৎB]mmf,kwR!DF&zcD3d!" o$vI<} ^!2qʷ#4 7J{(Ӏ∟C&pK놆"00<)=NFNY ZX||^lSҲ6,`&_-ջ)WZԘjF>[zP;!%@=ևn N" Qeu(3/5GRS&ϦgJӰ>j'MнH­`f5hi, e `#^hi;_(^ch956 .@y%R;/0bB= >RR("8)1SxDTpq)z]c1Et_izo Ru: JNʅNbM f}~E87kBb;Hc'{ċ׫E#2C;^u G }fʵq2>NO&I?2Y^xvq,)Pi\`Ug='*!o0%mԯZ$H>J\b12zȑs!8gԗ׻ sۍ)짣Xhe8@ƢQԯZ[blj-]jɁ93 kqk(f{GcrhY{2vwdb|p0xɫ=ośȏXT=/uؾWmqhIb H|e7Sq]]s~?q;8wojsTx9y<꯸5l<Q:WK:iup/i JyS2/}.?/6m,/O'B&HmY#ߎS۲lo(╗3sV{50Q+;r߸]0ł4c>>i^^~քRXmm$冇F_6@ !b:č(u+@RNޫbW6 Ȝ?G{zΉ1+ւwKP,paIͲe7):}:I\wI!zGpv8w;߶>mOEz.ificIENDB`yahoo-notinroster.png000066400000000000000000000030501326020644600337110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME  ;V -IDATXIlexV;$MڒH&uq$mA ! T!! q@!pDpAucz@HC%i63YD}d/_)T_G~zn:B}G3J& lH-i{ѣDH!~}v>aSXYYF.ekwj]eYPš~>Hz۹rWܝD~`$sa@4::;!ItMGrbR$4 d x2F#kj1 KE%0gO/䰷{{{q鳫dD0yD7hF(A5 0෱8,¯qTE-c  e\.NuqbC3]J(CJ%RO&piu)'OAok߂Xٹ9tKe7 s]0"a(Mՠ$0xZ E44l\QnR6) CXX: "UϽ["D]PkCeP`.(_R +"}>>}#ٹ߱T,dZ҂X}*˿OIi0x$HWvWWhoW^P%BY}b,=֭FTZ g&v)׺ HCɡfom#OIENDB`yahoo-offline.png000066400000000000000000000031321326020644600327460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME ,.IDATX]lwvfvfzw\lc!xmPUbG2ƊIK&*#M>TKCH3~`; !R QԨ 5`؝{ΦC۾%G33O=snl-=P/zSHq@@uRsvh̭+g+LzMdnQ#BZ2M,]ʏR-ӑ3#{e%={q4@!$jhZcFw|H;(A,,-`mpA@$a]|qa.<_O#pC~!N>NN>\>Lΰ|c!evJWWvmjn24Q5ضUgR!P`}-g~q1 eb{# [%֭[5(0 DNDm)vy xMibuM-$U X$@$98xbo/bbxxo7jD#a~F(V˶sX.'>U\` q@( {A"{/V(  b00NDsc϶4EQ"ƿS svή"<ƊUZQH ;g# 05??ߤ8TE_bMNS"hZLty܊)8'''&pUs[_57P!bzz:zdy܊ +W/{hOnkxdM4]D PW._vɧ?ǭhtٺm"J76m$i@ #`n&"e9MTVё|aG33dž*[.^X}ښZۍGd |rg}ŹӅD]/.i}n&'eYFc:ܺ=%AYc8c% JP 555xro64n@<ljM;oMM3d]աa}u|m9A)xhC#v}s'vhGKs dIa?ysSYHvУ$ړiؖDAhX4J]r/\k)O z?Ci*pwnۆͭZ4,ۂ똞w~xyppp~k:߿ZR>IfS-tӧOg֒+rۿ"T٪ZIENDB`yahoo-online.png000066400000000000000000000027541326020644600326210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME ,.IDATXkl\G{w7w4Q BZh < 4( !P PAKAHAc"BBBjF4!h aױGv{ޙÏuW1=ґf{7s %ovQ1tZa 6 jX_ V9EGTk> cSxS TPΡ/TÎ6]\AnΊGeÎk_B: (7#p@q}c5@0|XՖA"REL[WkccA7nAK=[Ϲ>lh| 1y :6N@NDZP+VN BB@͝.R/Gse9׌^sy}\Ojt "f_vӕ ^^Bqěu }@&GeZd嗿5D c`-zE;F@qz*!bHm'O.+8VkqעVA|'s(;oֶ\Uljuw|_@͌}N"f=.NOlJ}szH}a2.G^()z2]!~f|A 1#`ZUfr/IV-l'lyh Os׍DyGk^Y}ߌL]|9/G&l(*O`*Dg3iV1uԪ̈́n"|;%=[,$5D-4W?f\UOvUHV+?HxOx/(ƒO29>\-fW}8\&|Sc)A:ѹ?sG+bj GF-?od#T{u9W/qObb){pJ} X`4"r'),[OpIENDB`yahoo-xa.png000066400000000000000000000030271326020644600317370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/32x32/statusPNG  IHDR szzbKGDtIME ,.IDATXmTW;wvp`v)CY]Cmf)ĸ4-B# Ĥ_FcJm %~2hYy5MSH B[j[:ʾavvٙw=aa}s9}sQ7lvB~mLRYҲJRuYZUmzƎŶtww4ڊLbTϓ?u}嗍|{`pzCo>cG}&R ]( T Z#b1D2ֆX_ :| \ѝZafyFl}\ƔJxpw7u=zvuH* C2JR &'R"q~c urؑ+B#Ǐ?pv( q~HbϾ}a)ØbaY!fɔlB/YikݓWm\.y+q[aAbP'&ȹ}۳9r z<:gWa\4A7UlҤ-[q$ ,cm>FkD4ˁ1ꌺ{GG1lȘ0(~:=}< wd$,lZ~#Qjc y=כM@x}?hc zfU(ul+r1@bL_85cww_ԶycV2%x51ѸbRdB6wR$"c[|+oD1d|\VjH` ]^9cXeIZhjK \%Gk v"Auj^F-a'A)Bh=|ݿV@~ݸV/yR~MM%M8r/s! AaBR#AocWWGR)r&)9#455-ث{"E\:ywsq7՘-Koh5hYz^?Ǘg%L,N,+5u72v_|_36j}rc{{|ffי|XZw=Hr'>U*NeԖ#aΜ[sFGx[b2Ii @KI)t[[eIW.N<[>ފwRݽ;ը;FvzZ6oX]9PԢE{zQN[&'ۯn1oK6\ysmG Sf &&SS@&KtvbXK/ZPu' ,Ro]K{bךRzL5gjcOj_|{/-!d[VtjcZ`,J}ߍ-IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/000077500000000000000000000000001326020644600262545ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/status/000077500000000000000000000000001326020644600275775ustar00rootroot00000000000000aim-offline.png000066400000000000000000000053531326020644600324220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WbKGDtIME  5 IDAThkPTgea]`qm:x #LfL>wꇤ:mǙN:^fb$1舷iT4/rgΞ}aPLyfy}&޷ozN2~F=BH AA5uoee+۷.4e9_2 'srrYoq:0%D#Q|tRs/$עMמ%żG8h2!͖ЦM**ko>~1Y0۹sgzS|_(!cЉ`p =ny[xB-*\_=7]PXT( R6χ|!ە] noE$֭K Fc`'15k֤ 7sQN*N"(& ((HT').&ju1``: ude:ߜZBQ5 $YJP:yk9>4ߜ eQ"> (_S }>p;iKجRCzz:\ bsQ'ﵵ`@B88Nt~͹L%ڎSMMN 5<'|wns*v,$B/սMCN˺r-p8 IF~\y!aO7+x<{kw#  (vD"a(5JQ^{ R7qNBI>Pr^w_}U0"H\t AB{G=q@%Kt:9nfKq@Jp>[[,t[~D$ PZR{- -Ualhv;WPWY+ `(N8:mmwĴTB1!dw}Q h-**6%}S]4 :{iNQ=2BTqDif8D$  ۞4=d4bxXK$愅`  NZb:!еjCC5m1AÞ,6yI0LhoNRb1D@"|(J\4,| 1; 6 "Ɩ-[sgjo"; ?YHE1s_^!:Rfb6_P P%@)5N<GDE͌R:;;b͋_5 L7yA)(OJ(?n|aaYo@ 9= >i%(C B `f+9^NȲ,GüeY_G.0H6,dfK2 db|\ET 包[JKkmm%c^eY w{uA~@OjMEZ #(,x 6[jKO\PذaCJ;o sOJ;2.[+^!\Ro2фܾu\`f޽6jq,;fJ[{50cieGF_Dl$Ig1jj gKͨ9p#_677Ӳj-6*+-GGGCff&,+Ξ;O~f둛aUd!HOGWFZ'G s>3JsϺ28yd$ yzG\iIʵɄlg6ƽnvnO% λ00+ K2ĉ@kЇHg!?8򕫶YVzENG>tmRɁi/qz(1N㑣LܣRL& po.̰r:݅ {MB8*:ƍ*$Ĝ*+**2XqqtuћK'MDu3s$z.M_3 }#kIENDB`aim-online.png000066400000000000000000000051111326020644600322540ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WbKGDtIME  5 IDAThX{P\}. B] BL6N1>tNө8cM۪uƴ:LZ8L|$,l@& ,K`!ev:=3wcϞ~;6rfJ+l8"SK4x^Y\6[^E>(YyŲt jw{;:G"n^VVV.թOK7V04x%0j@ "pӠ"MM1$F5}ŦCGp/(st-:& 0[l7uE,TJܑJY"cb1Y̔ 0nZa3gLelih'R!XWeg~=XHbT@T"zAv>M@4JD,fJ f^ja $RZmA*ڜ,fJxdϾD ]}wy~'Y̔ hs= \⎄1TcHn;=Js0}fYz}g^n`E E0@ fQ呗:"Y?tŻ,^huE&Fy{䑄^蛑@ u=kV 4G`X| TiRVURys ^$/[V0j9ɶW*`f*+\9ASžj]ճ9>@ }sӡtaѰ󟁠(y/ϲZ0@Ѧj{aiϾ'B'ilf8+;ibx"Ԍ֜.1LA5466S$bdr?n "?L#8,(A@Q+מ8mmߺi9gFϠJc%X_q02ٲ6W=g)JPc*1MeZqTR <,LK N\zNcvp1t5ax qe@""ZLD3aBS]?S3(QB>*}؇x e`X* O{is}Xw?V(x"$J~<8 ^BG*ҥ@`,VxNGNN?b\(D*1qP9õe*،4^-X  p8^1 5  2)fR|,K e^kQjP2-J!:zMP*}kumCCCҶ~AV9ȇbI(򉄄CB9~WbU2Va߁G-.ĖR+m CHظuץLo9>(@@CC}βh-E*OX8ŐT+q?'wb&)k,|?{|wι X,5wB @_ya3͟ V*M: ]ɍ+1Hs~tYVTݬ%o#(Db߻GF:x®gZ~M :Ctr9ȣ~iĬ3d2WXYYYFϿdҫ72ݲEj*.#j|9"AbmAٜq"|M0JR|c9(3g-Wny'1U}S5>KjĔO_d])M/>ݏrʞlg\B(sƆWvYuU%<#tX7>FK _> UWּqz;uVH#\02s IGg~秳 h4"˻ʄt=DG/}k *uvDCryk3{9E{Ȯa+6-VDi^L%<1y`p\J%|}[JY\yV Uۓm6Ov )89?Ժ\.%`?0*o%qCLnhÏĉ`(50О87fܺȴhI@ttwBl^X F-F-~S_L4`L 6嵯.-]m2j|~Ӫ񣇏zB[ٟG1X~dmo۷oJO3(/%Cvw<G:s'^@W߾(C[^1ǣP\*&$x" RXR\֨W=tv:v=Y<Sk+QbKS]?%b^30LϾ @0ѳK|*lDV90Df$L|L'4}YH ūXIENDB`dcraven-offline.png000066400000000000000000000067161326020644600333020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs,K,K=tEXtSoftwarewww.inkscape.org<tEXtAuthorJosef VybíralxtEXtCreation Time28.10.2006H/+tEXtSourcehttp://cornelius.gimp.cz'Z IDAThkp]usߒ,[m%dK: 6N|kڦ_&iP&!dӤ错4mLیL iZ ŸF$C%]=s9{ùJ!٦suy{u_=Z~`Hp"1}?>{TcVP ,u/zk[,"*Bg< K/_'AYbtwкێ "$Μ!Dqo3_qojzS&|3[T 5@5MMtuMdsYfC߽gwoy38nJ/ {f~G܏Rt"D$/c8rG Lj~ahXxgm;BJ)DqrT=,bD j$nJ>X/ZX2Y&ݿ3oVp D<#_3qvnI,@}P?Q?v Dc `},RJY!A_ 3x!ۻ)[>o3,wV/[u<"}~Th BիVNdO@Ԫz7Z<^|t ǩ`D1$'jb,ڈp9ea|B!ԽO,=-x w*e}cL7>5&ThK#F0b(J Suޛ X?$a:x<^ONc# zmx(SJljFc8#8q?"\F?XSC,'Lai 2MTpP3.Ϣc![D[۲xllΰqb"48!j&bہ2>0?!Zn~j{så@ 8p Z(>Nmk-[K+j)ԧe'FB@\DDho F&[{ 7 4%Z_vo?sS@gd*E_L`@k/uG M&2E߿v~FV698 ǩ_~ +׃K`׮]v)KR)o,[O/yuНG:'91WJ_D>B```X֋{e{وֺ ժϗ^!?[xdx<}}xlnٳg9rNC$M(Wvٹ֥,iIK(\L񍰦eRlH-d"N to&_3dpZ)wt >ػ~}~O} VLp8bh,FԎH%"(cCsqt|BQb,K8ғiffu]JGT)EOwx3ݳA 9Ccluuzڵ ˪kW''ՐT" b|qz>\<3eǣXp>w$+Xho_b"OT$_ȣ&"FPŊh}opHoYMPXj%8@< u=R)ږS,pM2æu.)%#_R(W2[Vx7ƞhKeTFYDjgc(hooKE˂6ݳ/$ukF#$Ibxi@/XҲl.Uz-Xne;޳V;OTD*˓ez;=~fܲemX®y11DcqV% P܈}gNɺG/]kK,!L{زe+haEffemHM|߯9(L4HR)g&3ں t###LMNf %Uo ۂ#-m|fWp';[!L.Ah[چHCHT-D2=9A&3< $b FSOw^AuGOk)c+(P$8Byl|ʕrv B$RG Y]X, X,LPJ8o:|>pVȿDW_= p/_k|{`` 彯NLLLPq,K uHD#"Aϯ[܆ \ tsdk(,z\w~llfرcUkăpz`ߣR8$q"&oJ(z_T(W!HC]b' 꺔졃޸FXHB#(8npi[ʄWye?-pZʕJC gnLR *t2\QOtD VE:!D)Efz&P1ؖ}]דB"vnܐ B0lB驠m#!TC[UU#:@vULf-0:eZxZ_Ӑi$0k@ }*488x +"PV1Ơu]o~ؿo K|@TR)#Ơ5iiz1%ǩ:U+'r\\,6s$aHچlbrƺRrr12Fp61ys~~eYS*Vs6P°(pr9(Zڦk-.PVV#) ۶Fk;岹zƅ T9 2v.A)E, b#I1NVQdP Sa%Ij˰)uI+w޹D21@ g=D |+c9w,0?l .<6NYֶd2I"$@Mu ߭)J E2i&'I ˽7k[k()AF SY mq- T|Zz%;EûzF[(sZ~v+[E߿gG܅ g6Ԟ2UZ`B.aXY:~С,кZ?ia:4IENDB`dcraven-online.png000066400000000000000000000070071326020644600331360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs,K,K=tEXtSoftwarewww.inkscape.org<tEXtAuthorJosef VybíralxtEXtCreation Time28.10.2006H/+tEXtSourcehttp://cornelius.gimp.cz'Z IDAThk]u1"<`}FDP/}:O<|뭘pd3޶ 7)ŲKa{v]22C?Vd|tI6mDP|ȷ8bA4"]~C;C OF`$||a/xu`1 &!@ qvcȾW[|/ӳN`Vp7K*R)@!v=OxqUׅJ_IpĈЎj>5Gm!xH q[X  z J( LgDq waӆRgmϿsxA AI8J(/*R!J8;F4$JOWY'b}ٳΤ[1G@EdDTR1'NHb\Ӫ}= V4E 83RF!p3s^{A"y3ql^`P~\J=2`ӐD#$ՙQDjJ%Y Hz.r6 LKTq^@,HHH$#bQWaM1IT?p:.o6Qq REI~m qe".JF%~sWE$V,&FcrW!+lg kԏe?*HD`SR`tߏ*c ?s3b-lq%Ė[HDQA/HLT0>YV'F$&l8^jy7yu*ƫK?噼v|bgD' %x@ _y KG^wOnHq\hХT_x9;)px5r\h "pf0BZﵥ|:.>*?dN)y{>{*82]U76"  \ָ\z]z \{8NW7]؝EDQ cK9jQ6n W"OQ_.n_ k>A6EuPt-9ȓ }ӈP<*Q#Xtb(pΡk=XYrǢԃo% M['AIk.0!&pe,Huiz `]tƋ@DCkKl,6 U~ %͘ف$ۇR"!Dq[#!lj #pۚ _ey})i=[3g[xՇ82ԉdX 3ȱi ׏Sycŷ`&W٠',0J1Y:\׷SݯM[KۮL((*>(*I-?\[o&͢ 0>UX3OTcH[6lf҈cX։OPžiL D? F >)"(}aUzvLTz:ZZjL`P l{|]5<%=ݜi?N/8qBo9Z`Pɋ@c;I:镾ȎLP+6p-)PqM~ zh Lb*[OSSIH2\}ro12=^hhpOS.)}T>|/H4Feih['FyP%ar=}p1dg5Bɮw.Ye9QM#EebSw!%5J͡led{EYP %Z.$b0ڒ/Nsd|Y웗q-W^el來\'T }O%JaLq qLZT)S.*G˗yqR-Q`}B$D=0߇vYaT ,^(S Ti>=qKBQkbsIbsvlXq8(n`sF瓴MO|VI,IENDB`facebook-offline.png000066400000000000000000000023461326020644600334240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<cIDATh՚oE~ʼn#;؎% TEUŅS/%zK$"E7$H'$%Nݝᰳ&vH#̼;5 kT`r0!۱V~_n6J mn>X=Liir]K,DD@"*JT_n:Ne 5ZEyT*jwon krP,Zz3 "BTEg^d5 /y5VbdB;NZk\ׅIts{>D %<3^qZ!al67ˏqV X}}沉, udf$G_7?|I(k+`6} `|-<i}`[]Dal6c -zdYrnNt\.ן8~q.7u'W/28m'AE2MmF_/>u˲.ulv;?Pl)S>8N$sUllˉ'ohqmNoK'48I]PJ zJ0y. iW`W`qJ11V`"E s&o 8%>鼲7v +NX{wR˵JqwzJ,ÊNجEĊ8&'#` (@`@$j !j MC}p||4V* 9~q>@h8+q jJrJd`"?NJQٯZ[rV 6V-- y3ٽ3q# )qTۯ}G֦M&}*㗷y4_ Y`(K}yPX/ #Z>\ @]H@X$Q0 rF$hƫ!)) Z2yȼFM>F̭'Wkl@R㌞p5j_n SgE܎4n1:E)}bz~>ЙoN4Ek^q|/to/ ;$IENDB`facebook-online.png000066400000000000000000000027611326020644600332670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<nIDAThՙkE?3{r46Ъ RAOA|A|.V?"*H*>YXJ M^bkKs|$ges=|3DtknZ嶑Kh zϝ2 |eO״ m#GwW8R(JX+ƂZb e;>6V5}x; Vc؞9Z108)^p0bu{M no.vcp轢Zlxp%܂j P<$ojj%F);Ԯ Ϻ.z. e߰nVo#])Rp9ۮ56S+ Aؼzx8_5U3iOCRjkV0bsd{ž216QC *d{1`cỲBhb6KM$Ty_6K&ߩ1&>=ˆ^xIMcU?0;k2ȴF> =ZG,uHCUDBPO4Z2 q]JvK J)p㓤h f,6QU!np""!]^/,.4nnRXZw`c0ӿOPo-TFNhbн1VP.@ܩ³Ţ]cG?YѬaXODlB.WN3O EKXO/ȵq $$aM_89n*s[m{b٫gg&FON4N1nn"j?8yG% ` _/M!%s1``Q:a 6nƸ*qD`C"/QrDt Wbl&s@>0Ĝ{B$1^$x0C vIc1B[Uo~ti - F{^t{{Eal q~C13-YXNN}K:=E#;sVEc,\ ێ۱p|a# UAfV >cC)!iE@ XC⁸~o E,N(ӠLeC{ۭ\Rѹ/'ql̄EaɲE15? ֪*-}| ?srMi+]n]|<3MF_F=X4]՛xFr5m8hqa^  5r߾}]xi KZ7gl9'' N9ǎ;sG}7E|IidݝH.c{)W\yŴ#UN-i̙.Q 4Me[ODQ`Y/B(G5ԟ-\2܌tߚO,@+[6+r !c.m wAdZ[o3 +V,Gzz:‘TEE((0L Qϱ$ ^.з~XbeKX2:DAΫu {dAzoO?-Ŕ(%%Sbobi(,((y`4MåKh8uPy!I2x s<AĎǂWWUU[yS|IK٫W\)E@H5231끇eY, 8=ˆi0 q'z Iri!j@ǎʊg7h)qԙCnjbOϼ)+ԅߙ3Eh۾8 ذLyL49O_@y0  Inر;++wV== : Kv,] P(LϽUU]KچXL{Ц l zg}^+CupE,._ MS{ !qZC(0~;zii &ЧN{[+RePe?~\Fnn.qR+=$A׵}}Kl"E<2__]א`i(7fΚ K@AATU0LzF* >H;h+))q4{rsr\n o`31ga ֭_/,,]7n?ϱEq-۶,F;`y7Miӧ˪BUUe7n H|-8~$TU'ͯ; PU 'ko%m5M,*LDqn4fgк! c0MG4m񛦳g nmnia{8 /9Pu &ND(e!}I~(-/]q4BP5 >+P0L3@P<~ׂc YlYGbgO 8>>q4\S]yYylZ*Im^bf@vV&^ڴZ> ۋ{%˲< Dp7{Ίx7B$~3ήIJ.GalS_& n3wy?a(C I7Nahbݲ8tp'Q۲OZ^^bo۶miBiMfhX)%/G>frHzUlz7*Inޒr9@]4 gUuۓ$~ ෩Y|ɟ;;;pI.Ȳ˗0j(hrζ~ݚbbW-FX߈ [EQB`Y_sWu˲^l<7 Ϝ =r+FuxNI}CFSS J\ Mz2,)aԝjWxB4E8 4ű?~~ [ |GXn58KrB0X . ˢ)ڎ0XN7663zͤ2˲`X.\SJ <ގ ^q<,Dvxw@Qy! C›I`9j*Q---Mh$I<A[{;| dfdBd̳,3&,~ލ}NCt(-ys^kA{[;}قayyGS\ܲnuP2բ{/7]n32p[a!~!E(8G ?=9E[Fz& ħ>رc475,`=lݺմ  @e /{w2Md`Eӽ&hFnVbDس{c[7& En- ~y9%߃KRP8l8:::gO !(SQuC3(]h7-'+WǎD,QIsI\Fl qP`EfF6L§ FA*m(L_:TEŹf8qaB7t xnYBfC0؅:KrIvRac&7Gvɹy0 vU+h]4W>i$eI2? 8?jO7e}?D۳{_daa;62`v@\ӧMGAFR@v‘Л*מ9eʲqRR8YY$I믽a&ɹFzJ=bE9 9qVz!!W`4Mi;`YGo*tBS. 'THҺ]ȑ#y۴q`h=--.vkw_\BR콈>ԖأOgDoÏIVֹn@7Hn!vqCi7#){A Tнm`ۄC IENDB`gadu-online.png000066400000000000000000000066761326020644600324470ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WbKGDtIME $ IA `IDATh{tՕ?~Hr\!!d-QEqv)-:>c1k::VDL y'q_~7Wcsܳ~>}~0Lmlq[\9\vm ?~NNx3`8lPjJܕ75+*0 [BRȗBUVR`8láT!L, !%[[a3ӯB4 B*n۫9o=p0)N@)l)q~sz 7;LJ|!WʶN_n7=ӿk]qlwߍC_/Qj5೤W+je q|&c[nA6VΜѣjCRZIYp57+;'ԑ}m!*DhaqOލ1~>۹.Mp/tÏaȂWRS9p_3FV>Q7aB#H݌7}VG"JѣFĈPT ._ [D`k|#-P^"JE?Y9~ q+)>yFֈiLgE2_{و)ShK˦%J/ ~IQRv@I9]t,B BAJ^^a )嵁i\TBAȁ={ !:/^!t?SXU;ϼFo ]R$wBDL Vx~݌&uqjm*+ #S]nӖRenu)M~?㡭!DiߵJWeEET.TS=*qẼ˨!l4Y&N$6/nqp UqTsT>UI~mH"B!ze`tnoV:p٬}ק$"2ذ?=15&W%wD+&"hͫ赣n7qˢYF0XlEEru0zM%nz/6#Lޛ\T7(;f֔憸bb:¥?+Dő#uu/ܩSߊ+Ȕ5 qT$J2'+-Dc(Đ lΌ]kա0aBkD57.m+s.w0sRNVVsb† b&CgeF;E"H,g)=$ YqPUU@=n{vN 믗~)ShjqN13ζYLD."r!%|VVf9LӞ?kR$^c1>?zŖ5/^ke>y=j>0G{wPPTtKkTk+K%F T8q&m!L^C\3c0 tpsW.+CU`hUUR:tD$I/Sb0۶(JRQ.IۅO$d"o?8suc3gK'OBS5 IJ9qض ˲ކw9n|8u꤬꫆nl֭@uu`nYV~<|Bq}2q3Ei=DcBmFKKKqɸ/QU>whEEEf$ $!FFŗ_sn(ݹB%gԨkng% R88"3gL(hooϝ=iwb/h+W|gT՜[2ዡBQ`_+9JVFOpE\SS3>o9B&! 8ٶM[d&Ad2A !;SWnڛ_RWdYqnmsrgR 8YIH)8~3-Ӈ/Ekkk7[ B&|Ddi>5ZH{!^l3o7_MdZI{̯Wt=\ /Ew\,_QGt=Iae9'|gC(8YEiaL&)SDs΢`u04@ ˲qbX^P'F_V'O:@ I0 gpNy3,1l߾X![|'BS5ӟl׾:MmyN^N\>x0I@83`]digx7=Xta )SǬ*0X-rN}of$1h7Dséb%w@BUUU) `ze)¶m@g-f/P:;}Mtʜɴ_UU{U/'2aqkزG+d}Kla::&N {OȌ1GQF7ٞ{t޹~æj4 Dq0bh>shi1GGccLFC1ͪktq?GYc1 0|,Ӭ(urW{ٛw!'LrYrns %Imgîu:V}ö,K4nv}͑֓ǹ({M`oB졊WUs_зgn_9rYd(0D7 p6woDӧO5bDi?eyiolUsc0F rkH-*e!oeuJ4jВNIENDB`gajim-connection_lost.png000066400000000000000000000036121326020644600345150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATh՚]lWIJ++F@P[(224UZJėK&Т6B-QPUQ@TD%҇&RRwٙsxwv;u8H㙹w?sbf\殴˵@y97Weӭ9⁁}_xqwڶΎrrd/Le-(aƴl<< U-GVg;# afa7 S ָNU}`"w~l@ p{B!9ğրԧ19c׮0sBJD@şzPZN $d@WJcy4D̚tf0 3;n&>ksҠxRsM&)"K^*tըf#J=N >qEEOQ8|=tSEիON^$1Ρa\ klxeQ[A@4; ,6"V )jb.gheV_> !P(Y:`jV&>{Yl,O|3ADr43T@\*fFHZ}IMhOj80 _҂"rqj-"Q[,:--BjPK6jblFYlRHҠ6hQݨDTf"$)|Rd-}#Ø);O$tוZSC!ѣ0dc[N3Rj.(P3qLNa QF&oo7@57"YLdQnUD$n/bF\dLD}m`.-}Rxߍ,;c|'PTRyIj .yT'">w40H߿Ńޝ(l?gcS2Vazߜ֦o\-I?P6=]-/X*P :eX۵~3D$TUIp+KeTr[w#"lt{(/Bz9\.߿iѪOisKoC lbbIyb~zFFFr_Ȟ=xcET;DZ }ɪDpȡ\U) QyY&p5eZiPݻ!C>sΜ9ß6r;?CEn)[VMnwF>|061gGGIBFӃsu֭Ehf$IB}rs̟:EM'ywd$Ih{9fg "8疽p-hAX)sQE6lh~hh(WiZe%,Utn_N3WVN37oW_۷LNvӇw=g5Txx̰5kQcv kѿy3=v3wݕ,}ρ^++2%%@O8£J<5̛~nmۨONbf޺O:'Vs}R΋H=<đ.LY1PBIλcc֮%T7ēN"+e_!oDt3tuٳ@UJ,f%8pA%8t5=F^#hIENDB`gajim-ft_done.png000066400000000000000000000026121326020644600327320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAThY]LSg~sz+RҊ(P`ةȜ.W3C 7[Fh+/hHtd&eK̔j3& `)?񣣴P?r ӳ`“|9/<|R &bź{yԻ;)u>A4v-ܬ6Rꨩ=qētjE-dM+%;KV{/*  16qh:;;E'爄O!BEHjRXPxK4P\\,)NI%R"JEhHK:dЕ˸Rw9jBkT$2jXAA8c^l-"AG4ː/)NI%Y0"u/f"!ߓE@nnnTKY#6,olt @,/x pFQalBa+؟R*#n}}Yoj3c9Sw=.-'.k{ 8h:Mi [ܮ P)¤}Q:$غV꯮{ߎ>{6r6<Aw&}#nLt<18W  x뿝A ͚ai +(~SMy+gkl:p6t,lJӠvJy֩fSӑ/P ,-ئŠuE)@\[5&՞G6lQg{< "4C=Q (p _T}i>ouTY9_1Q#Mw/A":N !á9_hr1\$Aj.!PJ~taG{1bGv s,rLu{($ $QJ0+v˰/lØv __ TqgМa!0ʉ\z#>+π#5 X+# |*8=7'7 KLmDBH"=y.SJYY,ao>uӏ1B ~i#8G|hI ia$cҭ%RM֘UeAc9A[:1V]TBFm>룯羟wamR_S,_0bH` Xx3IENDB`gajim-ft_error.png000066400000000000000000000027201326020644600331360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<MIDATh]LSg--H1)d Oe4 ]K30݅qYv]iȲ9%1ov# 3v#A.㳜YA/yӞ[@ >8f36U{e z%hlPf]c߲ABGe[m~+NZIcҚW%;%,X֣m#Uuttm=-j|uZdLP(MzZL,UqT`*eGmu+kV/S4ǶmTib 33S,hB/pBȂ xySsaTFϟ<쓭l54YȺf4@ZZJYXZqHII jα-lT`٨@8=W<[ܽ6> fs9w#G0%&LVCCL3Z]MjCCy֥.]UM bcz1Fo`gsA>2ro8ga8JG||}}L=ykEW.㐤=xxz=>zRω_ nvo6š 0څׇ!>>@t϶N͛"($3Fd~>3l!r[Zז\Ǐ ~Qm@$NStKFFFx_!fPn^==t!\.ׂ혒Q&>u\v%$)0J:mm| iLTCeel9u !MMo+e_$"p$I& 2?oZf_I~f~9:-cXhm;88{#"!s^(#wzS_» rn`iؙ?Da2&%aZQ윙| 0xI1OL7 |Fإ? _mh)!`OsoX+*w~'w".yIENDB`gajim-ft_request.png000066400000000000000000000044711326020644600335020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATh՘yp?ϻnBBB.!$pJPA:*mAǣ8EX*uduŌN۱cmHĖAA9H! ^Odrl9a<3{93+M` 0g\ -|9||g`&۱i۶*>,쳭X͖QBmk|:"sty|l|}DzoV=,-m|Cy,au7̸C1{M[W~9^ Y9g`F$ŽdrO!Kܳl'NwlNDL(eH)HVK<υ.߁|6a!Ā WdӪR:So+5Ogy8Vú1qс 4K(;LZb0CɁѤ jJR8@I@}3J8tR+g|i ?ϴ]~w{YW3o!H dz8ZEy8N2ezbLZ7=Db\zϘ#R 0OSK=ǩn.E8B6Φw9S(ǚ0R2jiq̚Gn޺ksUloSY_ Kӽ!DVӦTnM_+<:p_֌ؚڀI+):Ƹ# &sIO6"6D0-iW\:\lwFA!",3uT'EWXVAqZb xzl0H &b xʃlE2r\k%CJ?b|L)$#NlB9~>k_>pa~CG+PVV6luX^xk_aӝ:2\8B퉎3#?,mRѐkLW_UY(2ɡQ]* u$Mm<0\ukX~:saR͟t7 ` R^g%0&:43=j1"Cm-l0-z p4]n5w5YWˌ^r^^a5uR2PJw+p牢eptf`|s$ y=[kIn{/ټo뚩3PH+_G=GM*^dҟd|̢( =49Ru s/9Ę)P:L̸lmϗrj?{ͣ5< !vpO-eܻh3v,J( X0 4š1?~>S̋f6p~jC~4d==7Di*R%u {N;lAMzJ.4'\C|҃S`R0`5Lǖr1FUiiՑxg2dN; v~C;JZ537O[Ρ*yĭDb y/گs$Obu!myUX30Y#]L<3'Difv։h@ae9pU2Ul 0xANX&z$ʒC!AJߧ!yGRJ(^QSBI}.Fr9 >!1a퀢(H)Q  !4)PBLB1nY?GN XK cąD~w,VB&0)Ӧou]&uSK,2;(W l/'Rz P5.L7 igb)=]wt KckCx{K"\Y:~ ?ɪ脿IENDB`gajim-ft_stopped.png000066400000000000000000000024061326020644600334640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAThY]HW=.lW]c[h)C hְ4H I}-IBH>)R%K/1E!ƀ]w~g&:?q7\v;|sg D O /g7x| Iء(mv@`Le.iY =]>bTF<}6.tݷhk!I;ey9| bոr v6} }CDNm.x$--a ,~g'<*]ZD$9 cc PaO__j'D Mt/ $xCҦTy-0~끊,c" P6 }oA+j.IENDB`gajim-gc_invitation.png000066400000000000000000000065601326020644600341570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATh՚ypUUǿoOBYH$nnݴи$Z3v;5.5] 258и(DFBB@X@ws揗bW*^սg~sUc \o7J4Y)6 !Ir+ϑӚnԪ +wx-=4xicR;4-B , 2M0JmfY3MY(D ڗ.]|S׽nDB)q 1`۶8.@ DQӧغXhhfNaaa.pB)_=s ReY  $:{T5 ۶AA\\</864-h(kHO O1SbڵWkHGYYoL 88 !,,vsԴU@Ew,SMK狇8@m/>eXv^ ay~IFf&gc`0T( n&g$ @nn`h Jc! _ULm[8{-=mbulۂe ؒe>81~xV{<(JUԶן P0FA)S׶-( OADm]-ua0 cBR` r -(GUע>֮]˝<}uϿX >++b/*B.{ DyBs'mG@TJ -wrVv-K&[e P.|s'xjǬ3wf?(i*D][P< `ÐQ: p >qMB<Zg.zL[{<ߟ4ι$ 8Ѕ3fOCq7w c1#\P9PmA[\ɯko$no|Sv:H wOH%h5jPe3r1j* @gy;nQ> :ULq R0)#L|:%!}l`.> 5>s W?E2T)H:赻WVt!FP,CM'%M a/Z;QTy6]8R&c15qqyNlBkWobL3(m!~iRT ̩}`Q);l6`}+#&4Q\(h2hרj=Oxi_ٹkݮq^2rd9sf. $Q-MuCIN`)Dm2l<ɲAa((x" փi:i"B\,&f N(:@4Q丶"HٓQ<'g ũ1TED #BYt$ 8::Еc&!yxBXkյBXv7uѫGWM9G{ ؏e{"ZP~W\D^ Rdq)HٔԀF|}hnq ߓF)ZS7 iOv%ӨJܖ"i`^$, Tҷ!4#@z돕Na6KJbE RJnB7,{i*5!F#`h}+cl/V>\N( Qm_Bm:VyO y1y=B(RJ' [S~Wq>'C+PQJ|)}u['a)KH0r4ݴn߸`m%\vԊi ;ob;dɃ?X6B _Gh=ߟ~;Ih~k:gk3h -(RADQ(phHU\͏X4)-FbP b{2JFmR:trz"A(RJ 7Ŷ#8fj"~ȫ>Gü?EMijx p8Ll;cA$ٌ34O}K$as湹+XT'͔dLwBL+i(eeM0j)++ceu&dq>~b!Ki`vj%eC qE'Ӽ VL' TMZo[xS|)%ok+E',+)0,--U՜l9yc ,"0{Xp17݇/o.X! mۂL\:ŋYXC_3 /Ndz"Hoȓ10,'p7jfj  V&7 CㆵT?' 9jNܽ4X^醕Bm|nK}GNrR{6!v YXONv=HVF! y<^*,rNR^RJ1=uuL:)+L %tB pٳr%y/N 4-\.7=eK0 (M$ ˗k%o|YY~dt[nƎv[z2*"|z?tvv:,d?mZkJK&trݔx=>6o~|r?!$shooL23LHt*$p.@zSTTBo00VяLG~큙. //#GPx/0Bi?,`|ǿ~Z:J _!ՠ_|^;ib' A }?3ZGa豈 9Gu0 4`p߼AMf'N_p &F IENDB`gajim-priv_msg_recv.png000066400000000000000000000035701326020644600341650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATh[ls]w}\4\L1QHMڒ4}!4A iT}R0 -)mL"`HV HIl06^ww>q]{q$#93;"^:Fq8Xk`50kzID|k1Ǎ4M[ .71@JmȱB={F<+e1WY:h.G<-m4 EQyqDBl}\B說J*L3[Ftt݂iʮIU#Ygb^b AD Hbp;vp,\xpءt9yo{YCdgOOz7is}SOnm))C1dV'ki=r a Gt]G4q_ $'%Od 0Pukt]ڈR0 ?5^tbJ #j bu,]jWTUS펜XUZmRUK7o~LX__/Rk'}hܶ ͑Hg㇤y߲n݊#3|֬J9׈By]sgfwҶ~amoǦ(o\= (|sg% ֬GpxB\`HUk52H4b+(vkl.Ӥf'y))\I<0m7XssUWGW]]hoӓLQܸ=ۈRO^o7 }Y6EVP@W]P}=Βn:n_:w.` . x<0q~l omtt#( |tcװ;OnZ2ދ8^=RMӤ)%SL /pzn7xH,.+%$oHFz&!yHBHd*+A!@$AO-[q:]L0EQ+-1PΒzEegWZ<vuttuҿ꿞#˅&1jj*=󑐐՗FqdeBpj >ɓ`FDtR+*h :t_ ӧfBEE캒WSq|>[>n3yTUjbRa!ڳϢ* p ++kЍA}ũ!<ׯ6AԩS5ab͘6B2i>ʱ)HEGP^H);nll61v;EEE I$}KmQUT4M 0/ASuW'! CK ۏ4YGE(b6ը=u-D  m^4}e/=HB`~i>Ddw_ɡSUϷe6!C7)(vQXX8cvAVwȾBœkk<ǑDHnv5uo珄65 H@QPoՙ3+[ZaWpw@R8xbh.~QD!la,''n_d%B89|RN!P;|L06CeER\T>/ RF Jcf1jr;>9!h&P}eVVY t(cqFuIENDB`gajim-single_msg_recv.png000066400000000000000000000032641326020644600344660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<1IDAThmpT޻wwK(IhJ@%#%ZM_tԶ3/~)BURy3jhKD` JU4۬=1,yL3gν9=sιsRYZRyTk ՚HRH6yJ)UB!i<5CO1PJm;ѳoQTR={F>T?F6_`%ǎx 5w ]BS'"!<<.R}XVðͩӣ2 {GtvE\ukDC@?6Dtδl&}ĞU5M;R%K3z6rrr BcΆt]0 .\::;b?ĕF1 [GvO`^~sp(ڸ7ϟgPVVmawP^Vx^zz{xۜ{&ӹ4:_4d:.ta[EgW'J)nYh-|+_'Q(V˾:6Yd:r7($R*T[=TNXOqsB">u~D{g0ϑVwoǮ柄e':jU!p߶e@kNڊOu'QdT( _qo&~;_:嗁R*\H@x~ng/=V_s2JWG,ֺK~qY`>Vу" m6=f+ȻiWՆO55S+90ue~n0<Q-P\{So-pg=umP Tcu R1~$\̖%\9 bmˎй}n0Q!8ᷓnyTk 8=!IENDB`gajim-subscription_request.png000066400000000000000000000100631326020644600356070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WbKGD pHYs  4tIME IDAThyygfgww>!@ BXx[ 1v\)c9IE#;v H։.:V:W1tt?f+8Roꫩ=o4/6<  sgS<յ:nlx24uO$dR_?8}N!6<7-ok1E.W{o u6<[ܢh$)Sxٵ:lx2ҌƻӮGN>%[XϦ[ٵ:^%QE5:uu-ڂњLP,)9b.h;|[Wu#.>8/4a~(Ai &PbK+k:ݬ9׿8&] 3fˮ5_nx2v , mr :iz@,$&jȊV<Կx ]PB/hun*IdB-rd ?rcK WTRp$R;ڦ>|j"l0bfc̛|PBzC;b0-  ያ[ۦ !2\y{ˁlɤcF}IE.ZEOjFBqx'AX$2]ZdFZ}UծdT dK$W@ȵ%kKa49 UB;mH? @<hQTz DA2ᘲ2:ʍޅwC=}`}+ :BK|ϕ-aDԓpB!!w;wr{0@EsFb흦1`Lr:HXkt Ǐ`b3;\qɑD) ;bR(1 bԺmFԵ:Dqel5H/󅏏yl0KJP$URmES>G~wT @<ߥCɆy7/258i T%7aW(")TTqr={Ngͬ5đi&;ڶbE =C2FSeUUL+E,,lJŜ<7X΂B2?jic[ww2﹟[.&${^'^ؾ>r#&w;]T˚b~H>XU(C(BE$>FTYql[4PC2ߧNk=ćo#{G$ɔM2m#G5YC@K<$!1QYpTYE*?XdY5_S8AД+Nms.M2LeE,^y.]t2@>*ؘK'$P%IȠ} &ǚG?r纺/G~~|e?^-)FX/Mh!1l23b#$A!#Uъ*01Tvy9Ri*яpףYKI"6>矱8{6ɔSVW!ҋc[2?8] dAUg@1' .+68^]\2㗎Nf=ZZᑿ\_=.y鷛X5ZTM5;!&vދ@~TM=ͨ٨2%H{vr܃U 0er⁳knʤoE"Խ.|PG/V(~bsgڒe7F} <7W2 %UR&P3ôfK\4ayGTUW͚]MV1wϓ=<~o v44;7/ c2h:_SQ;Nwf k` ky~TLHS~7_w2ܙ;v<{UǙ~'j2ttEbtdé@U(. ~E>ٺOL h4g7cZ&]vE'^<;@| [YW":9nXp]X*eYl4̬dR]8Eׂv=h @ETSYC##}Dv,o6YBfpt$R׋4MbU6p}(L/NI5^lNf±f N8%ް`}}AH29L\pb|mc5uŚh1 V) fȩ§= s\<3ၕ+ο]EĊ7Ɇ$ 휸t_auͅ׾`6hW߹7t8D>tEXtSoftwarewww.inkscape.org< IDAThyt?KVr! adUQFATTa={DMtFkA֣(ԥS,PM7 99ryyo$!#c`Qv$ca+~$K}923i%kZNyie Edr 3"U-zd .+ˤ!) 5ϪsêɊ+S4~_N=]b7ۏ$u6^?%&LQFOO'! L_`"y嗕_ڿGA* <m>eqS濞jo9M+iĉ"t'qcx>->+c{~UvB)@A؀n$/]nZp/-_l8$iٲe͛7/3.% $ ҆I0&! "˂m:Rs6o޼T3$7ߐ+%7E.s-xoe4ȱ .١FL_*?,o|iW\@2HMɤiXm XP($IpiZ[o R`nl|qv:$H[ˈ ?"E%Khܸq-Z(\__B$v?3 Fu_Ɉr $OJxE , 2 n֪=;;_hEEEt?: 5k䩪aH\2(nw*H9(H>^@/lc2BL'xsK/G$ǡ6\\\>2oM{, 3lRD'r88 [nvfS̙v1¯Ӊ-l[~ scfz׮]f͚m۶g{UTTDEIuttnٲc>J!5rrL̢wr~ScSߡJn[$2{! S~ܻⱖFӮt\4J㊢X@=ZخEP O(˛j]]O6m*%K---nĉ;wl[l{5"{/'͟:C_qѤR(۟2Snj6ʦN`2"%O!nP}+%zHMֶ'?ܲ'5OI}l6cw`VlT^<%`ϙ3g#04bcPUpߛ힒rK#;dB CwRvmlbF"ޯHmkF+z Yt2M\Fja&^mGEc$K\t7*}/$gue܅Z8ej 6W|\+G8S揦#W!Q ڷએ~n+o_K?L{oRA5i'E=YHIv23bg&#? ɒLP$yxaa6~ՇDw2E%~A4Ka^"LIRxY'c!(f9w @v$O&$M?۵rvlN+|ULfz\<.ӧ6@oU}3n DB '5R_X71&0}{T<.x@NT!xS(RC`Is}TEC1?1m%u+G ,H؂`K] Co)SOVX6:xT==^z TuE5Ǩn@Q4<^jdGQs8 y3@_gMI@v0~̸Q,M"i ?#y:CCש)Ul{-P-@H۵4%>Z㸭zA~4?O_7Uhɏnؾ{J&q 't"&}W?cG:nr+uN?N*[ۄ؎j/-ɃN 7;kCLځtaխm@ŹJuB^6+x%0=:0GhSAYglpSidDWjJIYn1kn'˧dng2P2"m=:ɏu5G;+-]"+ډ̵ ` K!ޜiDY"T}5saղ jIqzX Vژ0s)NSZHč̥s #UԱ]/c|iDQ57sN}?PY]_וw&;^IyBb Sr,̗l&s iaa署{a7>,KJ,ɴ9a-h9-J&~K8s~^IENDB`gnome-offline.png000066400000000000000000000014721326020644600327570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR szzIDATXKOQ3s)Q*X4$Fƍ&ldʕ ~MWBiHMA mR:BMM XkO9n7UUU|`u3Jˬ+ߏҔQc.n$iZVtaI$R )Q,¯X˰GXa5> R-3 BEVzrpC P*]ccWR*oK;)´> nܹ񴽶r @ȍ'wj{)^.^ÇMwBss B @g$B[[ nZ[[>iI tϞ=9L"YbR C`lpr#c 覤Nd8a(n e)xk2l{9߿@(zBc@0<<8/t)<y)׾~}IENDB`gnome-online.png000066400000000000000000000031701326020644600326160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR szz?IDATXíkl\G9gڻ ₠iVVmCEA6*@H !J !DAMmᢴՋҴ-'8^vv;ko;ޘ4:::3EkM E!W= qmAw~&_ .U@9ȓe0]xR^<՜TJ%{h}v%c/} Gl쏜xOK_k,&(E1A^L(:ȉR^sȳޜ]kW]bd3|n ;{ajAx䝃_ɈU1:}nYyAFڞ/{X{(<lr֒/~]M AҪLO8B2~`f⹊MAfV\=sۍp.se+c;'(@"1J9,# t]ޮ/v";P dJ9(%jZW;oSN  )*bGbl]qvҠFqWlRĮSBz`}R ^a1~n\#biH"."=ʈ㮕U( 0z+b @M2([ibiÕM("F0J+6MUb@%  %# Fj@ ARRuh+]П @|_14`A]32,@ɲ'Oa87FA)0fcD0@(bLlf%33@٢B)(tzٹ/uo9U5e ,p=?;eUbY<9uq7؆XjChG)bhQ M0l;Z~Hj&\넒Ύб-#`ru]V?{@ c(նt~?;5/'|AZ@ө GPɹa%s@V5=Ugp'ʉ96`m e Ծ8y'p_OS:OZt!\*>gॣOLLuy߻F\a2D9鳧8I.V] f ݻ_8r S2H:#IK;K bNMIiRYRsn|eבHlbcfUfSfKTN~:H룷;5QNsnzljJ-{w~OCBru IRϫ='@[+Sү&ΑO:-SKr|?uïfm.*`0 :n'9ԧ2~2~h#ŹP ܝH$^߿J4~ |Ԏ 9  ,زBF43jko4$IENDB`goojim-offline.png000066400000000000000000000023571326020644600331410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|dtEXtSoftwarewww.inkscape.org<IDAThAH\G)w) o8D+Wt644v`,3gGT󠹹& T !Nǘ~ommLMMt]LhI<ӶwH˲tfaayyyp\p8p80 Ӱ,KiGm .,KSm0;;{<ّ rS+++)RBTR3?SxN塶VNTR?c He,..F~WUURK*\)$H)MfJ]M;;;EEEpFlll`ww7Zʥr}}=rrr+ߏ333":/ _ !r1'|(81t:9030"a 0&\.ZOwU> 2$Nn !J}>ߞ*O*DMDэc@GʮDF#{~xY>wvv3/6Gp\Z#2 mcccOeHV[[[p[Q_D4ЕcRKa=f~ i3U+m,KTؕ^O HRmi3IENDB`goojim-online.png000066400000000000000000000014411326020644600327740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|dtEXtSoftwarewww.inkscape.org<IDAThOHA??CDFuIuH!.JTtH#$IoAt%K d4ȃݷ>.`ofUe=GMFuYGu{,[-&1S)q. "e3P#?0#x;1]l%ėKt4a,zz <]:k8R~NV\iiI@xRZ [ȜPZE|8aJ@e;EbQZ}:E(Vk;O꤭PL&%aE*km (Bi 32!CK5iizJmVc[]KH+5$RZ{c)_.Xi y4;Yv}7; V#l6%[Wc-Jk*+e57|{j(oХ99Vu Him(o+ܙأ=4:c+)nTGJ 3CS,r7f#048w?0r)H#>#v;{L{Bk|F|>A}\ n8)nt餆166F]]] I+C<]`MOI6M5nddDaNOjsp6.~p*sEww7SۥI(98>" 555F:::R&-ڸ^6,2fjmmMIKKv{-s,\( Q]]ק$ 7P-n'*&xϫzQVYYId0YdCʨ<r\dZ)77wJylAMi |QFL&T! &ܒ Ӟ4HViēVpq+?R}^rrb[d;5s"xMJq9˃fhL<]|#fcpn[4nv:Wb+[D7ߘ=Օ%r|s k{";w/E Qh# ,+@On(?S6Q~gJQp`T_YORv D..4;#;'QS,3c0 C+l4Bfg&t-AvW6v/Fol]ؚnY@5x Ff6p*&YwF!0̂ rXAA qtkfݵ@\Մt,ļ_ݤ;H*!VV%9ws}'DuᇼLt]Ƴ?d|XUB.(fEE9|,\0R C$I.;mssssh]qu?E"eYXYYI")**Ⲳ(P__ǏTUK{o޼ I 8zh_\ti@݋0 ?sƕ+WR À,&1##c=0ڸq" `۶mY-aO&_>t4550(--54UUSx< l0iZD"D"4 >}:222Xa!''' oZ!I_~f͢YpHr8Ax:333G(J0 3zzzxbgDQLKHH+,?,uƌo l>s:{:Fu]wBeDEE|>}:Vk$IBE40!ƲIII۷o7'&&R qGY߾ (`f-Mt]NWWW~y٢Gy?*~N8FEBQiUUva*.]j*C__nܸ]۷sw^P?ü 0/v~ׯڴiӣ ;//('ϝ;x^LӇnwϡCbveLLLDWWנP(e1w\oa ! M8W^Y1{֭cZZZ kݘ9s&xOp8UUU#"졂ؒ hooGZZٳgy͚5񝝝믿XV$$$ 0 77d0p8 e[,ttt@UU9>>>g۶m|ww74 $a…,!`ugL?c\kk+'(v̾}P(D+0LHJJt(B<8+&&.Kuݼe$I#rŝD"HJJbYM!e٧px$Ihlliؽ{7ǁ`00uTB ``4a0( }rrrȔ)S-`2%+2̘UUȠ^] O<ӱ~ȲT MӐ666C#/j4Mk֬=М0*( *++#  :cZ!@0DKK 6n܈HOO;w.֦ `F| Yv-5K ::/SNɲ;m/߼ys9stO0 ܏%숞dC}}>| n}ӦMCKK˨L&A3gs@uuuݨAyݻwv;n2nPUw6n 5!q d&d9_Bww*.-V1 (l60 j|G(>TUU1ڼ Mff:^x1]TTF|>aahڸ# L܈;@Uރ{FNFxreLVyffy|>ܸqgΜ ܼyWMOO?s]AH`Yvi,Ybbڠ.;B׽Ί5jp8`X0 G4g0ܢ$2$I뵕mxyyypxGuuuŨAS<ϧ2330 h6p(|&zkx<σ(~:65˲X,ذazj\r'N\\9p-30˗VXA)>477Cqk1%\9u EEE-yeY,kn7l6|AXVѣG?)((\^^?Xrw|b y&DQ<$$$쇪@HҸ7{nߧ`ҤI 躎^"##s1(Zp)2{ٲeF__߄`ҤIK±cM?8!qEx:(^rOB!|> CɠBHzTTTh4rǃ&7+00@QAHn-;( ߯E1)Sz;Yna*hkfĕ+WsN_2kE`#dُf7^}2B8|ׯ_|I6-- ^܉3<ݳg$BȘkEnرcxga0 Yqj9@\WEBBfGLL XŞ={jii)7sLtuuuX,p{;C Fl6߿'O͛ 9hgZQ]] UUٳgS,ۉx{FTUU.]ӄtuu^&&&(//_/// 6xΛfaƌe?:uT}˖-FUM677#11DGG :9Î;8;w@rr2RRRpF&MD""a>ݰap8biphkk ޸qÐBvQC}7n-˸ipY??,IiY֔5kXfΜ Y,nߌAQgԴ2332 {I Vk$  Sn_ /0nB̚5 <_Eq>y$%%aΝ`08r wFyQg''' ,PE:::jEQ_\S(PEEE5ӧsT][Ng(//0L[iiYUQO ,TTT::Ư"DQ?νox6S֖W4mWNU.a1FD3𻪪Ξ=OIIA]݈hV}4Md( nlwaj~~?kךzzz$EAtt4꫐i(e>#--M0o"IMl64nlGmm-EQ$2hH$t! 5&&@nʕ+:M( F" PIII4q`:|>Jn8{lP?PE `4zuMƿ(`2|>> 'NHHBeeBH[GGDŽ*N t:$a~]w`SN␖k׮ABfD"om6۸ 6իG_~饗5kxGYYz뭐$IN.ƠQ 668vɀ$Ik].ݡ~c9d&!..Nu]3CmʊVXAy<B!Płhx<  *ozsq-Mƹ{t6krb^O-̅dX4TFyd}cE4ݸ&l{.71 |h 2c_}RpHd+ez|'t|4a0t!-!E׈3:aZ_7ؔ45 K hsO)A`T^BTujs||LN}4f,z QwR *b3%ڥ9t!Jbzo̥8M(~!M$aq"& ws,.[bnaJӟD74K͔,ZIuX]S&Eu?aUsPHo>wVo$(R >6kJ`6K*N^wB$nt&_H+M#A,o=sNXͥ9CV} VgedܿЧD>:ھ@w;Ykf>bEHׁ\ Xdn q\X Ϝ j*o<14Q[pqO 6AX,siQ%b#f6EYR0f.+Yd$=̥!.,&ŠLDAU1(b KUOd/1f[N I0P595(E6ɲhPǍE`/uCPb#U-$J $A$T-HX2;^(((M}$dN0CC%4m^_uЌ!hŪ$cJzjL ~cRD@備~_"l/%'~'!QѵO7rNq@!)s&%.rs; ᣦȐFX]Y 򃛷_bSn"Vg!≯*̹&GNVc[Gt5FE"i(Di q8k`X-wO弿3_lhR4ߑt>U{u}Ǩ˚m3R-=ZK5>:3͛ ͎YL+H]Sd7xTC4+Q-@hV][)lm,h%̚JfW?ߏKٳ Q"/ϥ{]0dZޑU|V;\~>˾zJ1~!")R.],M3$$l2)z,c좑W=Nk>p/mMק'$#9lVX>}NN#·+7?0 ɤc2b:"b8gAQъ b$^hQ/I R13и{{EWu,犻rW$|V|2g#bWupT!WTT;Kx&_{tKW$nh|8"gIUڛ3m7}&}\xR!|3LyՄV+cm%aIG"bi-&/i<򺤰逳gǔlU*udq 5^bɰkr,ݞK'fcԬ]1_]liIjLʌZ@s]=X['`?RML,JmTmJyY[V]f`Gh':Jp/G((!v mdR}GL]ӃU5o1qPVy6M" ;-T{]Vo'5**ڏ;Į\6=u}Xkx^K⨈[rA:,X3˜s#qC(]tc!;p~F.#g@RI2_'Cb:Pǭc[CԪADdd_&~b ~K?_0mkG[)X3 $3ʠ7O1 R:9cb}+1G抝ӝ7{y,O ,MD9瘹//"kŀ)[?A|B^kIڽN(1W^$w6G7tQn IENDB`jabberbulb-online.png000066400000000000000000000026071326020644600336070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR;0tIME iebKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDATHǽ Lg{-m) ! eLe \1Pl\9F&NYl&[2&oK\)&+7ֶPvήJfHHrhϭTkdVw޾Sh{;^.wH8vlm]7W!?H--zJd^x1^oV ܷys{ Jn(d66!n >? mJ*+M+3{LLtq`K^8~3xt^A@8{NK{-,& r9m"7wHx>'wrjSSk!l M"#G}0s,Feil>e=ɩJL=5LZATEFU RPHh[|( O8v@&3SxqK.;ߟjkʀS9U,J8fz <|߶F CKmlzXZnL5 e2e0*7j-/7MJ̴0cb"$\Fx>;C#Cu-ںQҩ CW*qni[z5}^^x DDrD2B\J61u3P/jm?Ot:k#7~=n"k6e@]^=DCM驀.K=ܾp V쐘ECxEǤx;8CD~s0`mI*(^CG/-(X\WfURRU!!~~UCC `FGap 5w۹7WD8 oo#*>_u=Je5IENDB`mrim-offline.png000066400000000000000000000075611326020644600326230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsRGBbKGD pHYs  tIME 948tEXtCommentCreated with GIMPWIDATh޵ZkU^1{̞9sιnvDŽ&!<@-`_-Z@!@!A(>= Z,-g" !IEq$I>Emj"6II u΁y,ICU5{\FAxP7t:=;L?Es+'lͥ_UJ=^EQ|immm[j6ZEQ|s'h0_Y]]ՏJ)L&oN&{g}UU M:zI6ƤƘUU5|>3mSJGB_9?ͳ97bq* uB9G7c>5NO"A(10 oLH6kkվ(LǼ4M&N83OayߍZ(_JB^q[^)Sy7;t硔A?(tPuB 4MKf#<MB?G D1h= VYkRfׅa0 Q7ks?E~) F9kA"~X,NihB|l8Ν;5 -;chsI68Tߨ<7sPJwf1ᵌ- +(?<+(h4:,mG\JykEq˜\q/'D- + RΫz3k x|꺆/2n!mzCJ)+Rzy1p9a_cUUTu0Bۄ?MӓyZ[#o\[[[m+JcL)1֞j`=%c>Q3ƀR6A!1v.DIͯy~9WcoΝ;tY;F PBmBa!Ǵ֭vt9}ާYX,>Mǚl1^UU:WWWKdRڪCEJnJ}s9v-0RJhke,' cTJ(k-hfݮD6rm&F]wqqy!hOh$ue]86|]ǥy@s-KshIH _{t/PT繖$үBH={ն`BU0BCyK:^uc-zYk͂Z1cs!DK_9GGEUU/tApE1F7U_Z";["q mdx.>! qmG |?T56ykBۅ[sUUm`sy]ׯ(G& JZ,T!n^Sa`0|@zy.B2 ~sNEq3:Zrc Xk3luRj ! !'F` F]Q}t0`08e]׳z `%I[GQ'RIt,Q%d9Lqe@քˣy9R/Apx3'V!L\zc7Uq9Ac E_i>-[X/kZM9s>fu]9~<˲I\d!*:M4>ڵnk$;YX5!!vq㣫Z;pޒ'&10ƞeݽ(@ ݕ!Dp9 CWDZTUQZ[cZ<c ߵƵOQ|tz1D87Jj!.i8*McιRk!ztc /ܵu+yxyҾq||\Ɨ0fa!D܋2BhB<_J)5g ca"yfEqZ{QכhJ)bxx>l6{Tkq!m4M(FWVV̙38EQZE]i)#Zrh窪z(Ǫ:GaV!ױTYѪ~\USJ;VJmH)?wU9a?677R\]ߓRpXMfZsj:q8˲G˲|c<y޺bu8yQ|;|j ́Ĉs~̵άkf?2rkkmbx'aYy1fNZ5ueٿ7,nb_B)BZKuzSu]?~ZJ欭G3yWtzz(SJwB !{co/|GK/u1t]gֳ&\ ^N^x//{.\JRoS!޴1R\v՝;L]~%u0IENDB`mrim-online.png000066400000000000000000000064561326020644600324670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsRGBbKGD pHYs  tIME 6 ұtEXtCommentCreated with GIMPW IDATh޵Yl\u߽3MH")ѤD-dYvlYՎqܸq i) P ]^EI PHѠM4qiK"/ZIBFNN/p9̽=|s#Rgq,} ˜;y;7F6u׬EVȢ𑂌y&͙G!\+PteڢW~lgNEqY(Y.{Gdy0ʿ]7im=v&ҥKVMbu)L09cqҐzhPb )E~% ȡQvyr}uXr>!|SE')S2ií^uhN ie"'=K91v#YNY4j q]5!hT%X-j]S-'cNܦ_θl*Bz= ;uj sUtѬ͘IʿE"Y:ukZq0as_|)CMfGI7jG`شC9g:S&M"DF:tjeVj+A'Rjb4h7|ʇ}v+s{Kz!Ow>Xj>ZZ7$K;;qkӔ/;' p?3jZryȜ𼔠ᮅ܌F :9(ڨ3 Zu\2 gAGJbs{uT-8Cu5mRVOgLRŸ"F!W֧=jނN8 QV`u: ?ۭ<甯? EB)f+"$Lr4!|W4Mҫ_[ݥJMڜJ x{ܭ\/zcxVlzbY 2Oi7R,"zs&AOn|M`;m΅g)>_}*KVxŘoYo>6ؠWq v~a6ZSvQ%_Ϛ{FOk9A&[ۮD!@  UX?Þ$3bmv.uVP9 z+ &͸Svcn(H6yy,,+k[ݫOcEu}ŸXawMAV6$7/VU j`JR($^ot6]!9mls'Տzz=y?p-U:k*m+.9aIUNZ[e4X^(\i+ 9o`/~<1u(ߙ^)S6ЂL jbİ1mޯGvJ`!/)Wh;ЫkfLJ9UFKUAQFa!aVuc}JS] ։`]6[/SxƳ :\Q{SiU(=⸑̋vbVDrUAfvTR΢ Cw 'AO\@YMu:t,Ȃ|9!k 5B崟t_dE`zTOxγA'U=#x(ݻ/pdق()k]ަ+D8d_N2|9ɥa\[{XyǍ*{2 j,R$[3(VmR;ahI(MU tO)I2=iץ>(TqQd!@\Tՠ-%㚍-DL/[2+3&L×ֱ2%LNJ E+;zظFU8"]g~ 7B\тdID2 (!C޴s,"DԮV{lԻR4kܕXvfCŎ%W.8h>圳UٹANǁWNj|Eh-ߢ-1U<+)E1U ^|Ȫ*Űs3qN]T,vM[2wYLV){װ]hŤX *;~Ś%ֿ`=j9&9ox9jb3Nj7Æ=CD~ƭpb@G("U_[hGܖ)xt]\R`k:UZhmu:h*$!?qԠnUBܨۀXFLr⎊̈a?EK.o͊Py)K ֐+Ɓ& XmAvj>Lh[Vhn=tɘ yaW0ZcdPX$E=}->howk.5z4Vfk>[ `B̒ҹ`톐u[oqofA/U\nQkj5NZpO[W9Jd#zKN95r byYmQV.7YJeXBVp% _)*;-ϒ mny̙5SAҵ,:+4QLӀuIכ%Ne.:kB5m5bIF4h>5Zur"Ō]q Iu֐M%F ;F\`Vmͽൊ]z(`LqÞo~?/;'RMnvj.9 5d2Y1)1Cx1vDRUL"m6d~{կ[f )޴~œ 8;#:uM~JUӖ6ͺ֫M6Ȇw%sJD"EQ1#F]P4r>5_{˗?*QjtT:bԌ,]~a`!^_hxIIENDB`sun-offline.png000066400000000000000000000036321326020644600324570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYshtEXtSoftwarewww.inkscape.org<IDAThkUtLh BH@E B"BJ BD)H,@ /0H)? `Q6   b2$q ݙGv߾~[l=}1ǒDA  0!f2!&NN+ŁUk~JM2 "2Qz]9E!qBYT+%PIyP< f޻{Ӫ0]w?(m Y|P V28}%c/`l؊ϔfwFW~ޜw~U`1VbNJIP+hoJ<%OȒ ߌ`&<<2gM FRo9ekL&A):(F 2Ak|\Uk~ݪcG~% /Vݭ0];P-G'X -@I#;Xݝ-&s#ҹ@!vägΘ^RkɈngw˷0@pu!ځBuĭg!_l\ӗl؜UV|l|?!. ndCU;+_*r~经-/I3˵CH)K`솯*'vrm$d Sxs0Oɢ&5F u;j'`uMkbo(x7F-nmaK=O#Hĸ OlϛrE;x&sz:i/X,vj/XwOⴖ-xHqR췾Bˇq/95|~: rD5mw[N2@@P׎:Wr?TM<1Y<6z"_hJ䆑G$SDO!^OoǖW[2X~sJ/:ܻm8O3:!>xN)֪紝?j uPY/@)5 0 Na&1 ]uNәCs~Jz{}}8H/EWU;?/> L>D`OLT6 RcB0[m 2)nc`@IENDB`sun-online.png000066400000000000000000000076151326020644600323260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYsEEKWtEXtSoftwarewww.inkscape.org< IDAThZytEշ=yyI^6FnQlpCPGQ;(*Nӭ8?OΙ6ڢF((FA߾}K՝?^^LsON}߭W߭{oխ/0Z-^iԏh0(5n޶L9F@|k-rI[!_<##䮵UNm%I${11#^ɓǞe@:1t-J3lBi? RyUwn-Q[ k$FB̨32+ox]ɞA$v@z_EfdM9DQ% i>G@2IiAeSKlV}j=Ξ dm{z>Zy9-kx i d: iCG=[z>3p2.GU\?Sd<=~!Ր=c! $]3h (JO ~9\ƤWKAkO ,rNψ3Hϑ5t7dlaqvJ뺶&>EҵČsEQE &/Ă ;nOQ'`w~>n]U@ p] ;X3ڟQ$^[㙘.L)~.o_ E{->d[-B6ޫW^\<;+m( ɍWAL.cg2@f2tq2V ]Ҵ+$8g)h - wKkEJL Ld;JgPM L?m^?L]@N`yVJN7aߕ\ eHj@*H6:Vglz(\,䶚Şf^N lgs*taLZGVtS^72^UWeU8i{^UHdA .zD*04H` tw̺^0^\3"w <xD{ހ刄h1x`4Z(شNN ddţC$Q;^D=G x|3죏|{63VT~Y]< <' ;-xO5e74 ٭fKBipa&5x'u Q/z!@?É} S4h.>|`5&U~t>C ul4ɶs9[t3%r5Rw'Lgx~g G"{NdHd Vw?fx;xڄt-/ϛL3igu!@AB :ID{. S-YBצ:Zv-27jpS .Hm;ʷ(Z(&qr!Es-?XF@,lRPmh[6I@),+n̺5;hfcrrNZ7%_yU oPK\πw)WbcgP B:2k6$ߥ  H)C/fΕeU&՛jkY57ڶ1P\Wk!r=J;F\ ѵ揩F0Q(M J {cDi=$A0 f^H\l%[ ZݞZR;d$rꭨ$&g?`8HxdX"An* @,M86D̳v[NH*GOO{AsTv+P|n(>7/LQ@<}**hS{Bq- a: wⳏ7mv*;՝>kMgI]W ,OwWW.W9Wv q"I~ " ?@D[(S : N_&*jL<$KŽgD&N[`wRf,TLx Sw"EAǛ'Oyb$zB ēy+jKŋm,;(iCVdʼnfX,T xvf-'BT[q`9zoN3%KGcCaNQԷ [)9ɮͣ>p\ `{rzrjG{s&Lؕn\Wh=YޘhJlZ#:g$zz=K"A=+%O L<KBh&W+f 7,K,GccEk0PJ6'׼7"]o IH`=p^ÕwSGt h! sp9woudSY P'`W{ ) uo1jR>9FaDU(H /owi1LN̓P1(q=h{XtSY- {/Gm@zGI\WO= ڿU۞'Xp8umL4mUX TL=rH[`|?7?I2<IBtH.UUǻ46M+n,\djr#TU|ʘ Q+<a~` SN 1g!=$MqR[bKb_< 9?ArIܲճx(uWV9J(WnThH)ý`t[x2\Izq,i(9;f׷0 n:"S#d=r)}Jٚ,2'VJ*2 "@tkUo{ce HL;@@-&WE]J~p f+жԅϝ&5w&*/o7o^0@Ļβه W)`N дh\zYvvvp\p'n_',eV ʺNx+@lOY\koAZ31ₐ,9@|Ѓ:gdK?紏@ی|8|;ǽQٿ@ J{60bJ5s}J8b渽x-~j3tfޡUA*8K,ۭ'nkײ[V`HQ">Zoѡ>,}IVkx: fԶDM|$9 q'ᐳ (@h7Y-HW3'+١+ ]H٨M z4kqQvA`VB,lsl@gFLP*7מ3!SFv:@J pܝ}`GePL6^Z 'uTKRy`葲@PһN޷sZ1-0#7_w8'H+ǀ^-q^z8OV  3c=:׳`)x!KX(itNf[\ ~ĭz;{v ^/돬c:M蟮{쭻w|ưtz{LjɥW/m?9D^cs2?|3LLYDB3WHL  R~/AЮ-6D]5p.Af"ȕ߻OIENDB`tlen-online.png000066400000000000000000000017461326020644600324620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WbKGDtIME .1IIDAThX=kA=xIH0bF+I%KSAIPSTJ V4E@B+ڨLy{-vg|dٝsv3 ?FVI%^vJ|[֖6cS1nUFcd[{y4")40 " 1U@Gw?[əB"Nӏ7 Е.S-LW~Ӆ2qKi66-mx-YSΕ'Y*Fh9q`$JyN)i4Tj&άk EɠB&Ɲ=5k 0V^F RA`Z˨*lunaAۢZs+VH"&vU\X!=2("rH,MIkeX)D4ь-_FH0K:9 q *KFqvYbTr0_P%& J LóXn]O͘\h(ɠ٠71.?s* (N@{a"=6wC;ŠޙWNK8T˫Y?k_f/V!WbO%Dɾ3_Y٠'V%L&. 2Z Ɖ0VB* I"5 GQ; }Bܠv1XoX+^;@Am'Vx'B|?F ʿ>QGiBWڅc` \$B{w8x]>8m+ ׼z,PY+]1+sEdARHPq ՉOlIENDB`wroop-away.png000066400000000000000000000103531326020644600323350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs))"ߌtEXtSoftwarewww.inkscape.org<hIDATh՚{]G}?3sιw^n!S5jU,B" ?JϴTHUZ,"$N 1vkw׻c||bPkގ%"ʕ/dvv6&3o1{)شqӘRjp= H& xy[{O:yq,۳xȇ>qZ炑C^ZRi[x@yOZמ;`O۳c g~vSJ:{x.Lp ?suZIBFS"l]?ɶkX31cL@{_yWߎ~Rk_x`rbr:G+nfşɳ_RmB+r3Y?#S;6B ŀSO |ir[?]Z=JR49vx%f+QFaHh6u3xxq" bۆ@!*PB.^8ſ˗Oo!G[;0.y/=_dGZ$yu{X5[ I/peL`0ڠBkQcT H##Q^e*1 {=*SWBJRoﶱ}u>E~OO)ꍘJu|y~v2=(E3"6eP&ךeR57bRG?(4 (Lj- rspeP J-k1Z2ٳڀ2?y{ J% #cJ_}၁h۶{oV±S81LDl3*sbB\`V Y1\&0Ag翙C/ةK8+߬*=۶msoO=^[ f 56 (cr@B!dQ&z[QܕEz3:SW~|V}:wh<ڃx@{<}Gܽf%)ĭB>{KnB;Vߵz`v~QG_=B5sL:+}9:#aAFJhcG+@y5,{QJbvWO#"WRlmy>?cǽQ뜯[YHTgxJk֯$B+k$͚sF!g%tovv4J+?z:뜏q00ch~]Xk…9*54[~F{0&9uDŽr͜p q9& Bs; JQJ=fcw@K΃O%K%C,)N̬uYbW.EQu1g=J zuO^1ZJh zIB+RvnӶOA)F!Q`YMĂM3pse=s3>Fp" QHfcg2=Ҵ 8I?>>^tk节4,T+dY&" B]ZiҲMV iIHS!M%Ą$h)vA ZbV[?:[`g!s""މqg+u3Q( A1:{Yl4G!5LqÉ`mZ[cSV" FA(шwܬXXSo$DaE;k;W6=^"csBWWV*ܨ1wAT`o zֈ2gGc=sduI@2_iXkh:)xWWxmۓ\|kEPJQ,$V(MK#qm\kFhb!ڈuAxAL'ΓZhƎz3aҤTL]YVQ@i AR +B+q}ZH?XkB^4u1ZkHRb}y5Ak%I7]7/Γ 0"" !{OjVIsY$BæCԛ)yD2DwuNBxuKVsj5}Kuډ,孽J:fc ׌h XRnTRϷYHTFh q ׌`!  ~̵X'ZK1 pqNR<&GAI)ҵ*J++HROifShĞF~KhʤZZϚP_?  C8ߙKE濷tN?}mf)3sjZR*-7n:c$G^p-hꌏ6Y7я1}7c,1P_4q4kUt쾽ޱy'~#Fk[ٳg*LtC2gϜݺ+׭}(?;7b,Sض m QnֵCLTh&flD;^=9˙d )QV 9%XYjBrCS8N`r{vl]RoU 8rZb+Fg7Lo9 (L] S&q3د\_lqzCSdgڠՅGw?Ъ;6o z4\p,oWO)dleՙipFj#H^G׎mJC=]]/#ߛKm̷ׅvx6o+o:u>]um RJ%yߟZ xYY%?\VgΧi&zVaǦ Ɔ{:jdJ%QKvlz̷&z4u3筵|Bm-\xbţ߿,"iPA4y-OYb ;6e!k7y/_tFVZ|v~hƻ7 pڍ篘R&.ߤѲ@浢N?- &{aO};OvKHl7O3k\Q-+(e-2BYCes=sO?|U3W^_Bsuց{} cbWk -SV Ƒ;?'/pܦ'U]+J| ]A{Eb@hy4 4`n0,Vꍆ}饣W^nN1-!9Zuցwo,HqLMb$Pyop( hUGB4qgN?~;yȷIJc(['rt.㢦rE.o"&Aešrev I1mDr=00MLU) ;gDZmLM]/,,O;5@Ke],8mQ|1Zzjp=~OrҬLIENDB`wroop-chat.png000066400000000000000000000103151326020644600323110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs))"ߌtEXtSoftwarewww.inkscape.org<JIDATh՚iluwyI=6Zbɖ9Ė') ZGqE~( (6ݦ(P R+jSE#)l%@JP+)R3w釙H+ :[̹#Ǿ{;Jnط=N`+p"`^=xХ_M`#@e :nΝ?7???-13^8x;&o>cxtχydځy7؉ɉcǎ^9rxxC }fS˗g;_14GJ)މc3Oڭ[j$2{H]#o%`m6_oMBEwxK 2mz&wV9 ~a <t죿2o|jRS, @xEE!Ts780|Cgn?2=BXcp$$_S^x  al C!@I 'x}?-ԗvZZCVqpP*%$-;:G)AiC) O8 w%jOwYf9@Ո{.}ߘ}B)$ hpH\xwxp.9[k#[߰ 0Ffz/şB"?ۘxtK`퓟}w^P. c#wǞC* Tz-QR6{iA36%Xsg-$}7:x7?&tvwOk󡁑FSE^_cZDd' 9qk z#䍫%Z@\{yh˗/9ڕK|" C&JbiccWp@ h% P@ Z-PIK?srOPNg1'RzJ8~6RIJfd3 ߷Az r9 9q?>KVZxdx ;,k7a*1n0+̓W?.kfg&$#O%P ٳ֑AI5k,JJ==]={+%=J&6%$hu8̤l$; PYk|\ؘS.'͔2Yj'^P:( +7\L;kݕ˗f[17 pקuc꽥@+]G_ca<:MYڻD___E:~o,,L_{[/K .: xoZ7^jŬ8tiS)KQ.a2{ws'߾8P/&ۄRlvv|:I|Z)f:Wͭ l[3u⸂Szij JѼt6]cj8S&Xo0r{ܾy66-fp1撳֏^p+xp_<=<:82s^ .=ףp{5 CH&Ek a:/SLe*Bs7i8=N,=dz'_?z . 't_ou l+ol_>LtUDN ob2}AdMݽk_>)k]+.,D/8>IR~J1}/\6͆u CӵlR$TRsE)4lu-[xg{빶Mqo}ΌEB hz뼩hM @= gΜ=3뜃wsĢm0 6燆Vv=<2XX+BEΪ+(6"oʕ ˗٬Zmzju26v<;;ع7B䧾jvf5@V3J٥Qn˗=~zl2(IENDB`wroop-dnd.png000066400000000000000000000102411326020644600321350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs))"ߌtEXtSoftwarewww.inkscape.org<IDATh՚yl}?rI\!JZiQ]$jn:c-EQ@QmEEz%MIdE=v:v$;-G%GruP%QH+9;̮ԉ<̛ݙ~{{#}{ZrCx/ݷg :-- px~^?3,>lkkk֮Y۶xssssLǀ?xg ݷ,@_k=woNoS ݷgxh}RJc40@Ka:ؘ!:!c怯L`=/@ۓDOҩSwuqN5\Z1c Vִww3aƍX LL+c_?y؝~n1q$9a;VT sBE!xCt\A8^$h4Ih1JGOJyd[,׏|럿q`*V}\>u uqI@ˤ/$da1&8#-hcAZ}{L𗿌Ik@E-[W^ukؾ8\Na䣏~jBTK%JsshO3z$qW )qeLđ2Nǩ_sL<ɳO?VR !xOmc-gQF8䶯:A[G;KVb**P~҂*Rq׆%+{ih7V-kܸ4њr~Vcm1 -]lq0F3vX+RP1ҳ( 5&T0D!Q:a {#Y׏ro[SD( &k:t?7'Ҍ=)Xލ린**UL P B*nABU"\7E8),TK=UnNcHөF̵,fHa##}.!NԒjCğ  4: 1uXmijɒJJc!^zHϣm48RdYRdR=ņAQU JDbǕ3iR^i#LgF@giR^t&y2jMZ*MXkHGWWwcJY(ߧ43q$I&M# iUGq,!گOIR&*!RDZ3yUr-A VEv4yU}?JwVe*Νu.t'Y.|[/^Ϣq(X۳yE.|[l=)4Y܉U oYNwVҋ׈5B{]cw=tm}~a֛CRS'Nԅ:0_HE^I/R86F0Wzpnwmm0ʹvǎ1~ׁ?uo_;/6s/k}A›7)p(~hjz|EZN5B!|&n ܅3/뼛nA)ݽkw}V ZccϝV*w%=lEk<0JRhZ frdxݕH78r7q3;)iAZu`rhj [ G."%E=.@қy]k?qjhK{p`AP\0XնtF] p:1A*hK}XUha-MV)rHMmAEL+wπ-q ^.\s z|5|Pg)\'&|LhpʣQļY8ՑT'{e:w`Iz8no;n3#ԉEiA Ι*o1q6BYx<Y?_9s!hwzkKlDRl^9ZfK"<ߥ.6+w.Yzg|)=/ ~5E$4/~$?%j!-?u'S5L9.y3lٛMePL3Y{OFv}dFJ z( `mdyWވ]GﱚeIx?O.p'Bm>At(nj8^}j Jlq8g7B*<^ ؄Lv.8#= '#qxut\@ZJ'c5ŃLjr`ƬLkޚX Κu>\&dbYj?}ntˬTyjǔ8%'xž. Zǂv%fͮ4``` fͮѨx=g:Ru{?ČÇk?c߁Qac`&!IENDB`wroop-invisible.png000066400000000000000000000074011326020644600333600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs))"ߌtEXtSoftwarewww.inkscape.org<~IDAThZ[oWrΥ{n EɒVŖE۲ n{-C80~H O q<? !wmyWwJrH΅TUᐒm@8twUSUg8NLO-|zA`~a]vHVXpۧO_41'UUgΝUhe+7W,h~S_‰]^p#sG}l333ӨT*XR(uys+K/m 'O-^F/F/H}wz uD. CfE"F`~nZ^zE)u l( 7kG{p N- /x>x533(-mQJ)p@Q "hÿŹS~i 's>c Zs$ -H@TVV[D$_NyߞZMX<||\x{&F^O;fvԟ{}+w$sZ<ēiVBHlj:xak(1X_VM yꩧj6@p4!V"`5 `q BOi*;uE}Jxx0"ar0ESz#yG/މcGw U[6GB㵴 UD"HT]alcy,@Sكame@{x$1޿@Qo,jf(jUL K,AϙA,ժ/ěg 8`avGc|=tl8Ojq sR i%AbxbxmD2ڄ %`?!o,?dfJYqsI8tЌ0s^@B eBABR`N OIYQNz fVQ.I %$lbR{l?15U!"T81S`af$@!.?c2'T!SE I4AsȋB2BBdjz:$#ImQ,XEB x@(Ty!h%P*XKAa{M#HϢ`Ąm= ^`+A1VX$ι`c mZ)3 41ITZ iD  /sHBCR2Tq H*$V{V+]]]Sl6-11ڱ7"*Tj ` Brȴh6U F'AJOLC@p+fiWWW` !0q(,4 JiDQ>  zD1 x PJCT(15@4x챠ýPFCH,"33pobH|SA h(\Nv %ei?5cih(D+J$  %N(@2@'".Bk1+#"a,ZF=2#'ȉ0*rY 0zXw#FyrW QAVP]%w2AB(dYeғmJK"ż$yդT`dSvJ)ňYFE]B 3KVl=YVhV. " D'8Op`._ V cokoW֝KMb. ?'nvzDn x91 m%`vz  Zh0TN@`vzjcm'u9 {AGW{KokzH8m6jB XXcj4qh4jS& a$hԦphMX8OF;ZQ׮&1[8x‰kk~Q7_1`٢׍$8 W`gjZE=!MR(Q XHc1s u:lmm5pl.׮]>;o~]yh3g^ ` X֨Wj1+IV p|!GHIH<7ڠ;[VLϞ;Fmklr$& EbI  )5\@=zmUʝeҬnΞ; /f~؟( >{l}}xF{iS$lԦa$Ӛ"ڠ:6 E~:] $[Mm$2%:nZ|}1+q@qRn6|mvb$@c-F@/@/R0֢T6Elpy :[YY\Gh@\x?s+_oUdo_I*&y%׶&K3`X_]]}[,^۾rI:N/Ϭ21ρ|kLOttRA5;>{'erxқCt:Nt;ž`?{45(ɒ#&&"ɲs9ֲ mmDnjfffGl64MMvEA^v;h4*w;ԟhU&Vw WH\&O t IENDB`wroop-muc-active.png000066400000000000000000000077571326020644600334470ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs))"ߌtEXtSoftwarewww.inkscape.org<lIDATh՚{p[՝?\I,YbHB  Y[1lGn;AC;ngalw! !љ6C@ @ @! ?%Yu9gW;YZ3}u9wGçAma:cԧ$hh[\ U@8cXwvlyG Vl3͛7ZXp^FGFClVpؽcΞ?,@{G[pK,Y4/F\s?zGMx4ضcOEy@  >7.^rU>Ɓ72<2DTڍpiUXz5h:z=G~7'1@ю;O}l;V7/o.K}q4 cw?KS,FjcJho`Ӧ?faBx |_~0xmW֯曾,1𣏈RH!Bb`Ak6/ME8|j;/}pwl߹[;n[v._j]~ a ,)BZV4_@HR$IN>Mg F --͗nWBH+?mG1YbN<ޱ4>IrL&OZ!_y+W^H4RW& zTjG+RaP2ۏӷ抉Yxͽ@W;nnw_HeXwlX`RL&z@ڀn|3PJ!-d<ԓAIaۀƥKF| 95꼏ݏ>RPQ_ Yg%)ׯ*B!`0lp^Km{²,`pw.buuc\/T. $>doc$AHwc F0HIbo(Bǽ[B&E)m}Qt&m˽f2FviMz5@ ೝ)k3.[ۈ\I0(][Ȟ!H#{D4Owme|J+ X!jv=cΔ7\0o˅,_\m{f3!5y3][84kN!.xpCLq(ڲkP! F|ysLz:JCGYƸ%M7^x!'Os/.@BJ7Pno`v)BП<+=OС]^xa(ۄJCX>T{y3/hYR2?XX4((_xi qE DBP/֜N.F2}`g[}ϲb%eL V/o`M"5 VZVTLzWhh8!jֿbM6Z[=,sHlZnhPcIPjX6b{CEi#E1Rhoȗ} $(̻|V`&1,0H*Jk Kܬ[p7Y ,6*Jk ۧ@0d0y=Axkc=SJP8/f PϲRJgn,⦦bB0{[H雖UiU!+ YMMX 1΢>~_w#A<6(ːrٙ|5 MGa! J xŐu|2aC[#( !@9ڔ@{G[X>"Oim'+S$\h| 0 Ox>*2XS=#ͪf*W3y"DdYNV*t$o>U(ZOf8uzt:j/mP] 3CS䂞y9 ^d%BiRF+]'QD2ik5Z8~6ǻH!,k:" __Qb-_Kx՜2tA ջNJ,iaY> @-N$tTz\*R#pY}:6F"t^1!z]Nl=l Mfƛo+"Jkm&&&od3xDR9J756,߮R??|Z@.6#ײżty7_yp}ɪr99BvW7v9+_ƥwϋ'/H +owg;X2ͬk ÎR;Ϸ#_^T*̝<[,\ﲬ9Tor|ͳ_Vu)7|wgn&&&.FI'JFFSL8wZڳ |ٴYt.Biٝ|[gvnlViJ9&Lvs|d|]>BYԬjʖps壏16jamTŪ&29ޝvlѶ']HZRJjkndڽtѷ8?Bc"U^DS96Oy'v/9BxR)m::Gs̳Wڎm,XPE?gNU^̢ʋ?>m}ePU*LǏmo9qwl9lΞs'I/=]*n톸m7Nk 3@δ'z|*_d:jN~hieym]ZiswGrmgΝ%2rSnYS~wz?pja mr8qd7\6pI#rضM(:D2ɫ^K`Ysmr9b;uc 3fZ**i308@Oo?}70@oo?1P^^N},F}XRF}*yWח}_2b۶9v`W^[/޾~z{Y,ӺjEVdYuщd2a,XV?7ER *KY0`qx 0lVR GYRLII =or`0X4P+eEO aFSPej~eŤ;w:֣##RqY[W_zRB03Ҽc~Eg>V"H X^/)L.SD"7>>d2?>S)Ivt/ͤ?O ?Osn=Gu싇IENDB`wroop-muc-inactive.png000066400000000000000000000073601326020644600337640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs))"ߌtEXtSoftwarewww.inkscape.org<mIDATh՚{l}?3wH,G$"eSr-ɲbK 4h$HEOZȟ$[K 8ذʖ,|IHqwgT%v~3sAm5DW/byhh p7 u@tk0 g]?sjmMa`'X,fZ*lxkb ɗFYWS@GCߺ=|kqS։N2SŒ),%i\Xbd\WFҚDCw^%4cGc<'7ĒG 'B u;>ҲEMM{ʶmwPJc׾ 0ƷT.˙31==Z)Cm*į:/El_w˃< 06>y⩣eFٷw:DŽ. lOrԫ8RLӇu.ӿyߝ0;%0nME)mI./ $5|{ O`rf1`GxmKCOdyxxmכh>tk@K ysJ9.w!M vKbNaBcs\B#,GCQ*x%k2]1޼9zwVLS"Qz5'_y7GJQ9Q/ B*A,&R,xfikSҟ3ԩW^=Du"4%% e2)daj non))%0a2HV#´T%B#p{s V)dmҲeY!Vkb"lmmEHcRA -*>kQ,R-(ڊ@8zcFkvrC*;oڸs[+eΎrRe)f}|2(vp#}R&QS"-K(tv*/,KaJ"gaJY߄[N%.vc\ٰaz,1 -KD"Ft:ZWbff!ɚ$RZa5k =@/h[&t3_,Tu"YD rڤ(mh[TVZi+8Cmmz0{@k"d*.K} ,yބ "i"׮zEҩT̴,A+R(u.7C0ǚ& Ӧ2 aY%"FИ ̷ T "H]AJl*(Ui$ZW< GH!, )$B Fb>teA h4!%,!$ccT'⠅ֹ| 䟐3=wR#)Ir>>67=wFG'J*i4. B#Ep";R.J[q QX(3}l6 ͍Qқ;cspgvo L6g3 7K$@i<sNPZUhZ )X2[(G`ْ=;v_Q3S.<{8e :+6bG_bE=Ȓ[7bYKͨ|`XN9.ߏPEW1VqƛIq ]nܴuu];oj EQtqxl2dXqſ6pܱVڜɩIk±---_}}go+qҥ,K,c{-[qp]D"qruKu]٫׮?)MW|m:# 03;g{[ ۲7߼5ٴm'^)^-9r:SRع=p:::ڥ8/÷\B=KHعx6H`Uߪs[1gGjృ?J`n`v{?{RFunT*\|%KL&^?OW8&c_w`B1A@Ԉ !%RRJd^kE־K!X,dPX,2==-1 lX۲Yehqy]w(RBW#pR.]Rb5OR6څ )%ǎGT( J%⮻q apuj'XB){ )I !AXup*wBިaR OكR|>/|]&̯]@ܒN5kvcqa~ $P,uz WJuEm4 ABm#$?zI>y c k֬JpKu]߹)T*&V=݋))$ZRjtC.p-$_5QB$l{J>w^UJ)n0߱Wd.]J<…GEYFQ&M9"זܦ5=I GR0*^3 |.]jX|s q,߿?6*C͔$HIh(l!gB@o4I5䔔 v$J!ؿ?35uqZ~C0G`3[rZkS(LJ8} 3R7͸ģ^LF$}]KJ>날^\e֌3xG0)f-F5krKҀJ)g%\RY1Q"$"`I`cUĖ]^?Oq`Բx#\Do988R c]dxLk͕)ĉQψy!^s<ʯ4Xj l^s@CCC=q$)&1SmYRMbabrb.gUBM.lCI qc#ER oc1O$0Yubr_)T`6%E*r@FN.k2VG\꺡3FuvLc8Rp"yd&e IcК8,t&㧩ZJ!fh'꺔e|íV1g͒h룳sI\kmʕPJ1911[>X.Fe-rA@ddqch~8on s( 6&'&PJQtv.GiI@)F YZC59IgC 0"Ҽ`FfjPA:Jە$@>?V18VJєj =[ ]*q1)-B#`JZy|TnܨͦTJ)JRF;fB <.[|_<)m*RRqۦ*=U*a5Գld!A\_yP*X@)Em6F+xB AEJ^hn*2W{~R SzD %ZRw8իW]minmJ)?^FQuYRPOIb~ҾU)QrZ,dͭMZc^6bx+ gaG, B𞔸Q};P{;F joTܓ_ M;#lu#uЈF >mtf+Zk:2ZZ[<2:_HҢ*%)~ m휮)V{^}yhL5K: įO1Kh8tT,V-:6m8/T>mZK _J*%C$,j4$H+J&Cė_ZiJϋH6m$ҋ[e٪X*zMvzMCtb(z{Iu ~$j$x-B it)8ڲx7m('IJAP'N%=EйFs <_~butK{%M:mF7EkuIpkƵrm$N43$7 tɦtK{/x1ZG ڟT*ǏZ+dװ"č4ىs)UzjА.fM).;h#)0IO6{ DFrY]o.]vR}%V]C&ƓXD||cB&^ p"D,^OJ2֮AJMV;xWߟj<@tRJ}?X/WUڰvKRi&s¼;lf5oHǍcӶMUJڗ.e6Ug/WJiٹ =|0pq//hueeCC"7w"j =?+ eˍ!\H]Z0ppk`?us߸ui_OoFcx̱%N]L)sʥD,2shc4ZkRMБ`guvsKY6wH֛f{zLw[`(y|2`RQ$t` b{%kV7_3 P*q@~'dutwOo{m˦TL$6뺪T.h2j,,T_6$%wv>af4pb{ =uF-wf1x/:| @xc1P3K8tza`/й򻖖p`@KOoo#7JΟofx x~k wM~vzcn_~/X <3|B #@f͚ kRw3hr7?'̎3l =u !V{<. xY[{ϝ?7>}*" <5|įLwO-=;-8E#J3[J. @}JFJF9w^<~<|蛿4CП oo)c Ιx.]?~3oafz(*UK{:۸g= }`~(:k뿜 wGx2?%Xn}1&K/lfQ,e5i9z>=*B.WkׯM嗟:3~'H -Op׆5QQDGuQJ!DI4ԽO&7ZKWW?)vڅב::WIw E6>Dag[J+RZ#Bʌ% oSXp%1k-X}Q>O!-'/ۿgOnN^4{>=҂(D~+J*t^+R+"L= Z{9FGGH>g!]ry߯bJ6wa(.!(J͑~##(Z^ %JkiFir@;=2O?Mb(J!ā0ޙ@0|A033- cӧN#D\R@L#BkLTwi_Z! ck-33"1 a' w$m>R(;YgjjJc8uǎ#R J.[M+R2LJ Mww;A(=dn֗Lرc:u c SSS{Ν+ ! ;À|3ORrLiaNJW]/Jgq\˳kh+6tӳ:J27O1::i(4Jyp5m-yg?ɰ cZÉ'DJZ/6RP2rwO?Awl8RY`p&~tt3K#J(`rb'N`a|\F w{PG0r4gJd2ʤ%[m`;BcXJBRI0bZB>6N^Grqca{:35}9?;[9._|fLR!6v=[LbcC\Zl0YW{ݴ^ȚƐy._s wޕYW̴rfLZT"H-[? 5[փXa!I,Il 8!ό1XxAy!Rzrf Ygf35U\.pα0?/;R DsJ(֚]:T"IbƑ$$[b299Kzw"[tspΑ傕QP__{+qZR"Eus446<ĉA)Q8Im(z5ĉɼ`@>9Si"󺳪wxRR륥̲aoooRK$I".da0 08K,&1bbKRGd6}&1b#Pȼ6!I161D {{{Ⴭ,ٕsryITeKX\>'TC#mRR&qTC'H)ϑ pXձ pή\Bf9筵>cJܸqvIYF tb!B.@t2>Rұ@ZJJczzRi\.;5xi``bb. Ca$I`zjFZ ڐR(G #@$x όH!NLy*aOL+R*j!c,a:w >rtx|VY 4Z0q G*...qXTZWZ[[^gmi)"Nby8Kq@kPA@hĤzTtNCزy3e5T* J,AV17ֺEC嫭S 7658c,}HMwT 0$dQ\XXXbnv"ӳS*R!I [\R*xj/%KcSsh%*3o_\tֺZCtbI֫aNJݸZ93HBTD[T9B[+:Z}4Ll,)ݿk 퉳ֽ}rq%*9=akڻy:;hjnHd)k WGϣ{N41i3iިG?[ t@\5!EԎ&:;pγlFNOĬ|K.RZ,MO{ s!%靚yFihS8Sdrj2]tVhJ\I5SSO%GH{Ҿ)Mid.]8LT3+4^xarppך7ơ?;[="!dJ%hb``0۶ĕJLl~|㍟r4^JIss3lYKY/]0++%<^Q4]YP |W"1z/ccc,"h)2xwzmUr ᬥն4(J^I3WA :|𡞽{](͆?x6=SΟ?퇖Y2zε]twemWZ65>-&n]Nt9[28ƃijl_{G7NM#G3WNmܶ}gO_hؾm;Rl'pW +]׳g.=V()Hϵ==l߶k ,5E +'x4J*Yq1}$Ib{:7uU޽kHeyzZ*Zݻ`e]_WsS1Ibq 煪^x{h镓?svL4޵>X1\EBdT4IM~>B]{O{Oشc9^9kWGKgn o lr񼐒bȕ+T*WX]6PӼiN:[rlGP;Ǻ]{%sO}{}w]An)@p-m7/v\xcٓZqrbc71,Y!6A]5i>ǖ{7O\pn'Hk.D1x`ah]J)Yf],\ HefXXZ UpY͠Ӑ2јo<~ͳE~mxh߷z 0Wlvcc~'i1H\Vrq4əZ,.-W_=966vsĴD'd-[rAlѶ{&<Ziii]h)jJۋϜ}l9eoUe0 .kZ;g1."319tbXܿ;?5Zˆ5@EfqieS;]/_m:IENDB`wroop-online.png000066400000000000000000000103431326020644600326570ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs))"ߌtEXtSoftwarewww.inkscape.org<`IDATh՚ۏ]W}?9g̙$n!@*-<*U#RJHUxKi3u-!q%$&\L'N2c9>}g#Hk}]ۿUb[\::ǎ7ދ~ԻA`q}a`nKM` 8dk߿5ť3gS׊Ţ586>^X_^[t:S3׀O/;~ ,.4|{?] FFFʅB!ճn7V~uzg?g_/ }cKG9G\.??pextj[֋/p??5MG&Ȉt5KG3~d}΁B}!!B@4PJEhjuy^r"cǯ /\˿҇FFF *K7 P1 m2Zk@j_~t |5ť xh?gWWV_p)j m1=̡?̮;2K&hms~M|@>_UJ/.=v瑏}lE>1^}gN>IYGUeQ?@@$6T?ʽG+Jau'=~&:Kܒ@_X\j/]z?&U6(1JhQ(zR AA^ŧ?Xy"7o#{> q(5_<1 FgRDil}zsƋjCG@+#-N=?ϬM쿽;[X1`|峏ѝmG=4?7_vl;/G1jqqnmM[֋_A) mbDm 6/Ldw^[z yH\vӶRZť1 x$k-?C{+CsN(x2]x:iM||so{(4./IJK_=vKylpT2G||^I=ϾdyԓEo `d ccLY:?gцέhz佗#G>T*+gɇ?5DZM]W x~9ӰU( a3 [c" w,wrc%678}4I@Phe$fМx~{B)Yw8|SO~;rt> pT Vqgج`,r kX|`2'hXe=ŇNҰ!x٭a4y'l=֌ gr7 ~ۿ(=/#A3έ`l杌fյsNҰ^|c{7D㚱 3_Bir<6(%^JOq>!K}~O{fb[2K:,m4JÙ/q8Ⱦ}#{&ʃ} sa7bb@09>Ed,B;\Hq>yGRR;r9m'Յ_[{ʃ~=/4E(5n u\Y((H$ňƋ‰"h{/)")(˽hɈ(Q45OA^1*"(ͳp,"8t16mk( l +DE(A)@ټp$%(ؘb.Z,D1 >R* kkkttВ>*%Jfg e2z'7q( hIH(h1 T}*%9#@*TֆB@ EA!AaHPl6S. јT*vmm `lE&^/"J\ۺ86 3G&^"4hWBC>;Ґ"r:kZJ w77h'Mb[+ee z=AQ, BT+e*Q(;1&%cI|+DA@Ps H!'Wu)oÀ t]ZkzJ$쫺X U9 |xcqhhԵ>r">hTPą.J:Ad}LMJ86RP hestt]v`@4Jb~ 뿤Ѫ!"VV{OQOdFOBIt.&١j}rW)juˤCdl&/[$2VB6ΑyRTّIxHm@F4 {%M$I"dY@VHPw|Hxm hG*-(ˁx:tBh- 6Tר']i -<KŤ"hw˾f&!EIP:{N\rH /y٠<,*17q/" M$ 4s-D%MPi k#Qy[7PZ139G$w^\T# /n9rSS T zSNuYiڈZfG«R:tp*)EfGڈY e@k@)$dŋ[-^[__j4@ZUj&jkpx^8޽Twcw/QOQKSM`hx  Z-ֻW '(nTklZlx ջ:8^]8IUQpșh M>1-~A$IǷxgs+ɀK>uUگF RJu\xB+xWOZm۩rŶMj#y$\Rj'=Mi" uKz]'x}mwʲGxl:TSn髧_eޑZ\:W+ ZqʜA]?ɥKydʎg1Val.Yk_b{fR'vanQad}gMH^~,c_B?)6/>y-F )CA+iVi[T \[O6ALȤa4cy*.[[dH OH8y4یZwabp:W>1d2i>GԚ\4Mɟ_*!Y)lK._:sW[nCW;w\effv %.6ha#ZrX]PW4q]@\JlR;%K{ʕˍnzݻv懵*xl uafXCL}<A"e5EQ e𠫣vu*)%%=zmeuq%  URh\/.U[#f_&F% |>#Zޘ}S7Nǿz}+Xb#ȧbݥ={#e"0>'7psP]lP;$THܐcp.|\Z#cv]/ ,V$tbR;:vYY]igS2MD޶]*h\T8MIZLvo__ZQld5K$iQV˟=~ /Op2IENDB`wroop-requested.png000066400000000000000000000103531326020644600333750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs))"ߌtEXtSoftwarewww.inkscape.org<hIDATh՚{]G}?3sιw^n!S5jU,B" ?JϴTHUZ,"$N 1vkw׻c||bPkގ%"ʕ/dvv6&3o1{)شqӘRjp= H& xy[{O:yq,۳xȇ>qZ炑C^ZRi[x@yOZמ;`O۳c g~vSJ:{x.Lp ?suZIBFS"l]?ɶkX31cL@{_yWߎ~Rk_x`rbr:G+nfşɳ_RmB+r3Y?#S;6B ŀSO |ir[?]Z=JR49vx%f+QFaHh6u3xxq" bۆ@!*PB.^8ſ˗Oo!G[;0.y/=_dGZ$yu{X5[ I/peL`0ڠBkQcT H##Q^e*1 {=*SWBJRoﶱ}u>E~OO)ꍘJu|y~v2=(E3"6eP&ךeR57bRG?(4 (Lj- rspeP J-k1Z2ٳڀ2?y{ J% #cJ_}၁h۶{oV±S81LDl3*sbB\`V Y1\&0Ag翙C/ةK8+߬*=۶msoO=^[ f 56 (cr@B!dQ&z[QܕEz3:SW~|V}:wh<ڃx@{<}Gܽf%)ĭB>{KnB;Vߵz`v~QG_=B5sL:+}9:#aAFJhcG+@y5,{QJbvWO#"WRlmy>?cǽQ뜯[YHTgxJk֯$B+k$͚sF!g%tovv4J+?z:뜏q00ch~]Xk…9*54[~F{0&9uDŽr͜p q9& Bs; JQJ=fcw@K΃O%K%C,)N̬uYbW.EQu1g=J zuO^1ZJh zIB+RvnӶOA)F!Q`YMĂM3pse=s3>Fp" QHfcg2=Ҵ 8I?>>^tk节4,T+dY&" B]ZiҲMV iIHS!M%Ą$h)vA ZbV[?:[`g!s""މqg+u3Q( A1:{Yl4G!5LqÉ`mZ[cSV" FA(шwܬXXSo$DaE;k;W6=^"csBWWV*ܨ1wAT`o zֈ2gGc=sduI@2_iXkh:)xWWxmۓ\|kEPJQ,$V(MK#qm\kFhb!ڈuAxAL'ΓZhƎz3aҤTL]YVQ@i AR +B+q}ZH?XkB^4u1ZkHRb}y5Ak%I7]7/Γ 0"" !{OjVIsY$BæCԛ)yD2DwuNBxuKVsj5}Kuډ,孽J:fc ׌h XRnTRϷYHTFh q ׌`!  ~̵X'ZK1 pqNR<&GAI)ҵ*J++HROifShĞF~KhʤZZϚP_?  C8ߙKE濷tN?}mf)3sjZR*-7n:c$G^p-hꌏ6Y7я1}7c,1P_4q4kUt쾽ޱy'~#Fk[ٳg*LtC2gϜݺ+׭}(?;7b,Sض m QnֵCLTh&flD;^=9˙d )QV 9%XYjBrCS8N`r{vl]RoU 8rZb+Fg7Lo9 (L] S&q3د\_lqzCSdgڠՅGw?Ъ;6o z4\p,oWO)dleՙipFj#H^G׎mJC=]]/#ߛKm̷ׅvx6o+o:u>]um RJ%yߟZ xYY%?\VgΧi&zVaǦ Ɔ{:jdJ%QKvlz̷&z4u3筵|Bm-\xbţ߿,"iPA4y-OYb ;6e!k7y/_tFVZ|v~hƻ7 pڍ篘R&.ߤѲ@浢N?- &{aO};OvKHl7O3k\Q-+(e-2BYCes=sO?|U3W^_Bsuց{} cbWk -SV Ƒ;?'/pܦ'U]+J| ]A{Eb@hy4 4`n0,Vꍆ}饣W^nN1-!9Zuցwo,HqLMb$Pyop( hUGB4qgN?~;yȷIJc(['rt.㢦rE.o"&Aešrev I1mDr=00MLU) ;gDZmLM]/,,O;5@Ke],8mQ|1Zzjp=~OrҬLIENDB`wroop-xa.png000066400000000000000000000103531326020644600320040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WsBIT|d pHYs))"ߌtEXtSoftwarewww.inkscape.org<hIDATh՚{]G}?3sιw^n!S5jU,B" ?JϴTHUZ,"$N 1vkw׻c||bPkގ%"ʕ/dvv6&3o1{)شqӘRjp= H& xy[{O:yq,۳xȇ>qZ炑C^ZRi[x@yOZמ;`O۳c g~vSJ:{x.Lp ?suZIBFS"l]?ɶkX31cL@{_yWߎ~Rk_x`rbr:G+nfşɳ_RmB+r3Y?#S;6B ŀSO |ir[?]Z=JR49vx%f+QFaHh6u3xxq" bۆ@!*PB.^8ſ˗Oo!G[;0.y/=_dGZ$yu{X5[ I/peL`0ڠBkQcT H##Q^e*1 {=*SWBJRoﶱ}u>E~OO)ꍘJu|y~v2=(E3"6eP&ךeR57bRG?(4 (Lj- rspeP J-k1Z2ٳڀ2?y{ J% #cJ_}၁h۶{oV±S81LDl3*sbB\`V Y1\&0Ag翙C/ةK8+߬*=۶msoO=^[ f 56 (cr@B!dQ&z[QܕEz3:SW~|V}:wh<ڃx@{<}Gܽf%)ĭB>{KnB;Vߵz`v~QG_=B5sL:+}9:#aAFJhcG+@y5,{QJbvWO#"WRlmy>?cǽQ뜯[YHTgxJk֯$B+k$͚sF!g%tovv4J+?z:뜏q00ch~]Xk…9*54[~F{0&9uDŽr͜p q9& Bs; JQJ=fcw@K΃O%K%C,)N̬uYbW.EQu1g=J zuO^1ZJh zIB+RvnӶOA)F!Q`YMĂM3pse=s3>Fp" QHfcg2=Ҵ 8I?>>^tk节4,T+dY&" B]ZiҲMV iIHS!M%Ą$h)vA ZbV[?:[`g!s""މqg+u3Q( A1:{Yl4G!5LqÉ`mZ[cSV" FA(шwܬXXSo$DaE;k;W6=^"csBWWV*ܨ1wAT`o zֈ2gGc=sduI@2_iXkh:)xWWxmۓ\|kEPJQ,$V(MK#qm\kFhb!ڈuAxAL'ΓZhƎz3aҤTL]YVQ@i AR +B+q}ZH?XkB^4u1ZkHRb}y5Ak%I7]7/Γ 0"" !{OjVIsY$BæCԛ)yD2DwuNBxuKVsj5}Kuډ,孽J:fc ׌h XRnTRϷYHTFh q ׌`!  ~̵X'ZK1 pqNR<&GAI)ҵ*J++HROifShĞF~KhʤZZϚP_?  C8ߙKE濷tN?}mf)3sjZR*-7n:c$G^p-hꌏ6Y7я1}7c,1P_4q4kUt쾽ޱy'~#Fk[ٳg*LtC2gϜݺ+׭}(?;7b,Sض m QnֵCLTh&flD;^=9˙d )QV 9%XYjBrCS8N`r{vl]RoU 8rZb+Fg7Lo9 (L] S&q3د\_lqzCSdgڠՅGw?Ъ;6o z4\p,oWO)dleՙipFj#H^G׎mJC=]]/#ߛKm̷ׅvx6o+o:u>]um RJ%yߟZ xYY%?\VgΧi&zVaǦ Ɔ{:jdJ%QKvlz̷&z4u3筵|Bm-\xbţ߿,"iPA4y-OYb ;6e!k7y/_tFVZ|v~hƻ7 pڍ篘R&.ߤѲ@浢N?- &{aO};OvKHl7O3k\Q-+(e-2BYCes=sO?|U3W^_Bsuց{} cbWk -SV Ƒ;?'/pܦ'U]+J| ]A{Eb@hy4 4`n0,Vꍆ}饣W^nN1-!9Zuցwo,HqLMb$Pyop( hUGB4qgN?~;yȷIJc(['rt.㢦rE.o"&Aešrev I1mDr=00MLU) ;gDZmLM]/,,O;5@Ke],8mQ|1Zzjp=~OrҬLIENDB`yahoo-offline.png000066400000000000000000000056051326020644600327730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WbKGDtIME $%剑 'IDAThY[lTΜٵ%&\.)-I0NZNCEU=HIJQHQTQ !iUI"`;4% 6&q`k^ٳ{î;>ktv̌gga߿\x~nMXEKdG8y/Ǒ!ˤ',J?hhX[oIcO>V!oWJMMZv8!(5 qed^yLi|:::\ OlܸQnGH "@Ea P eŁ躎S ar=x ؽ{磜@^ݲA{[k^/4-^A8L 1000dq(Coo}R7C~عs'/˅={UdYձQqȲ QlSȲښyŁoh7&]OwwwӹH^eM͏ٳW Ax 2NM8p)ff&>/Al`G6͟khhȸ+uݷf##E*p&`&԰ YӔXK%hj--넨WMm o [߸#. 0U &n`q~o ?O}~g;7={#  ݅ <P`T"eRP(u-/X?A CZmdg{Q @MR1 %,ɹ>(e9 8ee%I! #Xjs[Կ288'I7_$BJJJ!p~}K /3s6z>ɪwiu2q0֮Y'BvvvY!rÆmѨrypI1\:~Zo Ϫ\Ox<Dkkb=;g/zŊo‹BW>1tT5JʹuF2L7eDۇ~kף)yBY|**3434"dنbۮ]UITiBicX~mZ8mk!rʪf͊,Y`@ @}RuV(mW+0Ax[ 0NaѢd3ᑇmbAݼLHPP]]-H)p nW!|(/Oxt]O"ו˛rySF֙Ά1{bYSC!4gz5U`Z2i+Xv<σ'|"Oc vGlFĕWbő-Ɛp;BΞs //4nNf FkkujjpȻwD?"k \E y?o:2"Q v2CCbDۂn`ikSq qW:&g?&ypGTUUqȒ.75h1 JlyB YFS$Ymc8x$vse(+~`Eؗ3Fb=;N8?ڲ`6k^\AbtMM¥{aR3`lhK,C%GE^5{O 6mW[ w`PP\]b8:3P*p2%}b_}q˴^q="Boip~ b<~ kT5P¶R2Xpz{{F>7S?3 8~x4S8cƭoh~ݳnmi-B82<476n>l6;bqe!mp\_ֵqߪsb` eXp1?Um#Gf]t:/ tTǥoFsoTXJОL' cro`)X`!,[i>su킃'nذ޲vCAU4iYH!Gey \8sn2]peWQxMhnZ&6!5A`&BȲ fC^~>.7X 虞3AÜ?WLKKmUUբ(cS -CC_jeY1/2z*JX\=5i cLH'%8YmfW{`4"IENDB`yahoo-online.png000066400000000000000000000055111326020644600326310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/48x48/statusPNG  IHDR00WbKGDtIME $%剑 IDAThk]us}Ӟ=퉱=bSPHh"4hD -mjEPZRBR A,' 0 J0xflx}s^ps)6tcsZ{}@~E.K,d,k8~Hv&"XG1ED+09ǫ>J1 wKrW{ V4T rh~201[G co=|_ 胴uuc-=Q7FèwɃ*X ,Ċu#W@O{|IaVXUoMA 1Tl)$ڍa2>>/?. }$퇈wɵA&ԛD T  [UT]|c':X|3+'3 E#Oꤳt_M67!&D  UyNuoۣ >.5/xE}]m\+np9VĠIb A`]1o֭Oy{|W3?1XH ho#bB4`)>G$(,+?J΍1Ci켗%ďa%6́w$oI>O*ިZx0 qo51~cHU{hF@W^^?ƝC)}u ^;g^򓥘#i~"}0enlSC '͈7A-^t={W0Vk:Ə^K&ɺyNЫ+f|8SX~+s>J0E00kQ+ R x]ZT 4鍜mG_EZ$~8~1֟_0mQ9Vb="qDh]Rb.nEV:/MZ+Y?b2*غdpuuC% JTޢ*|IƎKbu1<VU!Q!Q?gUգP\KDLzm^#fufe&ci& ^@1 ڳ7ҿq$S{3 >,MظdU-TM_{01}+7/Uwƛ$h?Zi:ୀ7g%Zιhqu[ASiT H!`rJ`VP֝jGiϙ3~('@1R!6Dj2 *\U5A !SO"DrH$\NZ.$Jq̰l%;_Cl6}UgFOa5~Ae˗SS~suB"͐YHW&3Nh~4 R=wxlt]IS|>3#n+ڎfG>u9VAb59_ {%ˇYP[;ы$s3ԍyͳV쌪QD:Wٻg$&S\4_/ak7&g-:3oȟ0@fx\Y,fqWu]qQ+f*V Ht]6ϬiT_:ORs} "Q׭6ўL-(.c-MƛKBH]#W##?D;"Z=fMwOwQu\_?šS= ,]Mعb(W.UKD=^뤍jYǤ4Okh"+L&'hdc.<;u;%ⓓ,_*ў}EU\;=x`ܒV o?"SLҫ4esV9n~URi+7lvagFlwI'sgNr?ȿXnp$v<{:l;ې8Q\T"=7o)v$wy+;s-=L ~ᦍ9M6Sw1 :әc@7ؽf%Z ͱJn#n?9z{.|붪H-,{bɏt<2-g=SYOҞXkHpta+7%;x8{r5&Nc?(Fξݦ7mn~ۂuw P6/g,RMqeQs5+2|de K6Ϋ| ;cGٶ^o>a=d7ޛL>L\,WZ*Nt'/#Og?­"c^ q&O;{ }@VDn%h X'"Chp~pT>Hk׻["rG ҃98b-Xeح}XA9swz=󋩆ȣt>ڸ.]vihqɎ"~dWYI#Rف!A;҂2`,f@>v_#*IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/64x64/000077500000000000000000000000001326020644600262505ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/64x64/apps/000077500000000000000000000000001326020644600272135ustar00rootroot00000000000000org.gajim.Gajim.png000066400000000000000000000105411326020644600325460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/64x64/appsPNG  IHDR@@iqsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATxiyO3=Z$%c.cC1N c|;v qU9 |TXرA8`d :W+jwgw>'gvv4+!iz}WTzx7|ٳߗjەkTHbGȵx!=|EkydR]gW`'N%~C)F^T+oTdv xrc^r܅&_Ta`FE,w X]zkC{ f}dwxQq=nU~KwEe_0jP"Gj= sGh\Skn=OZL쵾:{州ǼdHpbe$ byU M ˚Lr|dyR2jbjXx=_`Ou֧کk x&5p'~X.euaߎK0-2jJ)aL 5E]"Nanx,FͷK߶@ҷ6nrt݂X< I X\DD\*u2zN}JߕŖ$o\NJ3W!bAU*xI"V7A;",nm%Xo֢h@$Sk A#h8 n4`W 0^4dEj,.Jc;1|O~D%وcbFUN ت&˚ u5v:g-NY6om%@Ez+1т=@BD!U=T s0kxم,lm% M-&% j &;šP [@.:R,jFZGP- &@)a0j( &^x_%Eј V6mm%qd_X޳Tn4 0,Jf*(jW524nCP>m36 E^&hF}D0"q4& @{C0IawD݃_:]:7 FJ,ՎΘ"j S@M1?$పɏ0no>gHהV/4RjcLP c2@4`"?l_7V:V:+('L2h%'uCQ^G]:}._eIlna jn/!S߶}.m{+E;][e'T:^M ?)nکIZyP)K->IS~d[\5Ԫ@5T'uw!{_7sWp=b9g*7$a`^j5$7{-J'6BuC(Ef%DWx p=bswۖlk:KeN{=;o읿`պai?a|P&"_^bͲMeWg8Xzb4ƅC6\~Nw,ޫ:Bmou)/Ǜ?zڿי$-ԎZkzpM~zBoUGN:fvn"ݎrEX,[:c-#nvbWi~Tbu*~|&t%_W g`ېNg~t+G72զ8d~f% :΢eK:4phi~\]CbY_k_4ǎSdFkٺ(,˾}.Kg, q (QD0"#vabt#g],TcO3ϭٝ,Ȯf~v͖=>-Zn ˽T\%sVv\fF֓ Ǡ& `]a~s*?%IBaDaXδ0{5ow5O4w'O+)`1kx Q뿓d"~dM|1elc ֯Qp˂ΔuK|S#չGFyb.UJٖwRupK:߿3 J!9D*$Nxe ;q.ww-gM3eRL0'ؚ{>41dum,9'\ӗzЏȇ#uPQEM̧** C,Y˲; K6 cAX aI9]d%,\E<7n,WQl7Uu6qZ7*b:TǢPPXб3ddb((TJHrQϫ6nh>mMS+|7$yE=C,K\̳;䙝?|Vu۔ ' iߊ պ'7&(°_ߛ9瞫z\yqtǴ*Oi317^tI'J'We* @Ȩq7rr(^Nt0TW.Vr 8!U;2(`0 @tx M?IG^]ED2^Hێq Vr{n|MXN"EƵ[~X7PEyG0Q9HJ9 ]Ye"2e So)LR8}o(%{ f;ZOu PD,pU < *2R8@39([:\k-()zN@_Ed* -s7 aa*QϮR䌪 P1Ψ47I`joFR- +Nj<@otb8 XS4!pkkP(GqU& )S G&]U`=]4^N|9ao?9D\yLb!pDЭ|dxXbc[~Xz)X&fPxA7HS &PuDO6xi3_MǓvR%A_:Ocx1W8ܮ!aAO"KdIQe8,(I;]N-1?=#? ੎GR,q'c&@%""T,ڢ"2%Akn#uBJLg$c}XQ A".hGnHa]-$mwU?y=BEFRMCJ'ؒ v3+$Px6ONbiD?mxi~ zNw:UJdhb(y"H"8 bcm$4 'k b%o |y ʗb44P0bk%1i v:Yv_^r ,:=;aHi˶,űl,ƱlIJ1D>QF!AFABiT(r0i?ǯw?j)1`fLVϝ?txݜzrDz[N͊B*q5Ѱ#8[+dfkO76-@đ191MǵF%ἡN{l OM Ӹ10F`G,طڴž~$@N+~:if׭ϋIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/index.theme000066400000000000000000000601431326020644600276140ustar00rootroot00000000000000[Icon Theme] Name=Hicolor Comment=Fallback icon theme Hidden=true Directories=16x16/actions,16x16/animations,16x16/apps,16x16/categories,16x16/devices,16x16/emblems,16x16/emotes,16x16/filesystems,16x16/intl,16x16/mimetypes,16x16/places,16x16/status,16x16/stock/chart,16x16/stock/code,16x16/stock/data,16x16/stock/form,16x16/stock/image,16x16/stock/io,16x16/stock/media,16x16/stock/navigation,16x16/stock/net,16x16/stock/object,16x16/stock/table,16x16/stock/text,22x22/actions,22x22/animations,22x22/apps,22x22/categories,22x22/devices,22x22/emblems,22x22/emotes,22x22/filesystems,22x22/intl,22x22/mimetypes,22x22/places,22x22/status,22x22/stock/chart,22x22/stock/code,22x22/stock/data,22x22/stock/form,22x22/stock/image,22x22/stock/io,22x22/stock/media,22x22/stock/navigation,22x22/stock/net,22x22/stock/object,22x22/stock/table,22x22/stock/text,24x24/actions,24x24/animations,24x24/apps,24x24/categories,24x24/devices,24x24/emblems,24x24/emotes,24x24/filesystems,24x24/intl,24x24/mimetypes,24x24/places,24x24/status,24x24/stock/chart,24x24/stock/code,24x24/stock/data,24x24/stock/form,24x24/stock/image,24x24/stock/io,24x24/stock/media,24x24/stock/navigation,24x24/stock/net,24x24/stock/object,24x24/stock/table,24x24/stock/text,32x32/actions,32x32/animations,32x32/apps,32x32/categories,32x32/devices,32x32/emblems,32x32/emotes,32x32/filesystems,32x32/intl,32x32/mimetypes,32x32/places,32x32/status,32x32/stock/chart,32x32/stock/code,32x32/stock/data,32x32/stock/form,32x32/stock/image,32x32/stock/io,32x32/stock/media,32x32/stock/navigation,32x32/stock/net,32x32/stock/object,32x32/stock/table,32x32/stock/text,36x36/actions,36x36/animations,36x36/apps,36x36/categories,36x36/devices,36x36/emblems,36x36/emotes,36x36/filesystems,36x36/intl,36x36/mimetypes,36x36/places,36x36/status,36x36/stock/chart,36x36/stock/code,36x36/stock/data,36x36/stock/form,36x36/stock/image,36x36/stock/io,36x36/stock/media,36x36/stock/navigation,36x36/stock/net,36x36/stock/object,36x36/stock/table,36x36/stock/text,48x48/actions,48x48/animations,48x48/apps,48x48/categories,48x48/devices,48x48/emblems,48x48/emotes,48x48/filesystems,48x48/intl,48x48/mimetypes,48x48/places,48x48/status,48x48/stock/chart,48x48/stock/code,48x48/stock/data,48x48/stock/form,48x48/stock/image,48x48/stock/io,48x48/stock/media,48x48/stock/navigation,48x48/stock/net,48x48/stock/object,48x48/stock/table,48x48/stock/text,64x64/actions,64x64/animations,64x64/apps,64x64/categories,64x64/devices,64x64/emblems,64x64/emotes,64x64/filesystems,64x64/intl,64x64/mimetypes,64x64/places,64x64/status,64x64/stock/chart,64x64/stock/code,64x64/stock/data,64x64/stock/form,64x64/stock/image,64x64/stock/io,64x64/stock/media,64x64/stock/navigation,64x64/stock/net,64x64/stock/object,64x64/stock/table,64x64/stock/text,72x72/actions,72x72/animations,72x72/apps,72x72/categories,72x72/devices,72x72/emblems,72x72/emotes,72x72/filesystems,72x72/intl,72x72/mimetypes,72x72/places,72x72/status,72x72/stock/chart,72x72/stock/code,72x72/stock/data,72x72/stock/form,72x72/stock/image,72x72/stock/io,72x72/stock/media,72x72/stock/navigation,72x72/stock/net,72x72/stock/object,72x72/stock/table,72x72/stock/text,96x96/actions,96x96/animations,96x96/apps,96x96/categories,96x96/devices,96x96/emblems,96x96/emotes,96x96/filesystems,96x96/intl,96x96/mimetypes,96x96/places,96x96/status,96x96/stock/chart,96x96/stock/code,96x96/stock/data,96x96/stock/form,96x96/stock/image,96x96/stock/io,96x96/stock/media,96x96/stock/navigation,96x96/stock/net,96x96/stock/object,96x96/stock/table,96x96/stock/text,128x128/actions,128x128/animations,128x128/apps,128x128/categories,128x128/devices,128x128/emblems,128x128/emotes,128x128/filesystems,128x128/intl,128x128/mimetypes,128x128/places,128x128/status,128x128/stock/chart,128x128/stock/code,128x128/stock/data,128x128/stock/form,128x128/stock/image,128x128/stock/io,128x128/stock/media,128x128/stock/navigation,128x128/stock/net,128x128/stock/object,128x128/stock/table,128x128/stock/text,192x192/actions,192x192/animations,192x192/apps,192x192/categories,192x192/devices,192x192/emblems,192x192/emotes,192x192/filesystems,192x192/intl,192x192/mimetypes,192x192/places,192x192/status,192x192/stock/chart,192x192/stock/code,192x192/stock/data,192x192/stock/form,192x192/stock/image,192x192/stock/io,192x192/stock/media,192x192/stock/navigation,192x192/stock/net,192x192/stock/object,192x192/stock/table,192x192/stock/text,256x256/actions,256x256/animations,256x256/apps,256x256/categories,256x256/devices,256x256/emblems,256x256/emotes,256x256/filesystems,256x256/intl,256x256/mimetypes,256x256/places,256x256/status,256x256/stock/chart,256x256/stock/code,256x256/stock/data,256x256/stock/form,256x256/stock/image,256x256/stock/io,256x256/stock/media,256x256/stock/navigation,256x256/stock/net,256x256/stock/object,256x256/stock/table,256x256/stock/text,scalable/actions,scalable/animations,scalable/apps,scalable/categories,scalable/devices,scalable/emblems,scalable/emotes,scalable/filesystems,scalable/intl,scalable/mimetypes,scalable/places,scalable/status,scalable/stock/chart,scalable/stock/code,scalable/stock/data,scalable/stock/form,scalable/stock/image,scalable/stock/io,scalable/stock/media,scalable/stock/navigation,scalable/stock/net,scalable/stock/object,scalable/stock/table,scalable/stock/text [16x16/actions] Size=16 Context=Actions Type=Threshold [16x16/animations] Size=16 Context=Animations Type=Threshold [16x16/apps] Size=16 Context=Applications Type=Threshold [16x16/categories] Size=16 Context=Categories Type=Threshold [16x16/devices] Size=16 Context=Devices Type=Threshold [16x16/emblems] Size=16 Context=Emblems Type=Threshold [16x16/emotes] Size=16 Context=Emotes Type=Threshold [16x16/filesystems] Size=16 Context=FileSystems Type=Threshold [16x16/intl] Size=16 Context=International Type=Threshold [16x16/mimetypes] Size=16 Context=MimeTypes Type=Threshold [16x16/places] Size=16 Context=Places Type=Threshold [16x16/status] Size=16 Context=Status Type=Threshold [16x16/stock/chart] Size=16 Context=Stock Type=Threshold [16x16/stock/code] Size=16 Context=Stock Type=Threshold [16x16/stock/data] Size=16 Context=Stock Type=Threshold [16x16/stock/form] Size=16 Context=Stock Type=Threshold [16x16/stock/image] Size=16 Context=Stock Type=Threshold [16x16/stock/io] Size=16 Context=Stock Type=Threshold [16x16/stock/media] Size=16 Context=Stock Type=Threshold [16x16/stock/navigation] Size=16 Context=Stock Type=Threshold [16x16/stock/net] Size=16 Context=Stock Type=Threshold [16x16/stock/object] Size=16 Context=Stock Type=Threshold [16x16/stock/table] Size=16 Context=Stock Type=Threshold [16x16/stock/text] Size=16 Context=Stock Type=Threshold [22x22/actions] Size=22 Context=Actions Type=Threshold [22x22/animations] Size=22 Context=Animations Type=Threshold [22x22/apps] Size=22 Context=Applications Type=Threshold [22x22/categories] Size=22 Context=Categories Type=Threshold [22x22/devices] Size=22 Context=Devices Type=Threshold [22x22/emblems] Size=22 Context=Emblems Type=Threshold [22x22/emotes] Size=22 Context=Emotes Type=Threshold [22x22/filesystems] Size=22 Context=FileSystems Type=Threshold [22x22/intl] Size=22 Context=International Type=Threshold [22x22/mimetypes] Size=22 Context=MimeTypes Type=Threshold [22x22/places] Size=22 Context=Places Type=Threshold [22x22/status] Size=22 Context=Status Type=Threshold [22x22/stock/chart] Size=22 Context=Stock Type=Threshold [22x22/stock/code] Size=22 Context=Stock Type=Threshold [22x22/stock/data] Size=22 Context=Stock Type=Threshold [22x22/stock/form] Size=22 Context=Stock Type=Threshold [22x22/stock/image] Size=22 Context=Stock Type=Threshold [22x22/stock/io] Size=22 Context=Stock Type=Threshold [22x22/stock/media] Size=22 Context=Stock Type=Threshold [22x22/stock/navigation] Size=22 Context=Stock Type=Threshold [22x22/stock/net] Size=22 Context=Stock Type=Threshold [22x22/stock/object] Size=22 Context=Stock Type=Threshold [22x22/stock/table] Size=22 Context=Stock Type=Threshold [22x22/stock/text] Size=22 Context=Stock Type=Threshold [24x24/actions] Size=24 Context=Actions Type=Threshold [24x24/animations] Size=24 Context=Animations Type=Threshold [24x24/apps] Size=24 Context=Applications Type=Threshold [24x24/categories] Size=24 Context=Categories Type=Threshold [24x24/devices] Size=24 Context=Devices Type=Threshold [24x24/emblems] Size=24 Context=Emblems Type=Threshold [24x24/emotes] Size=24 Context=Emotes Type=Threshold [24x24/filesystems] Size=24 Context=FileSystems Type=Threshold [24x24/intl] Size=24 Context=International Type=Threshold [24x24/mimetypes] Size=24 Context=MimeTypes Type=Threshold [24x24/places] Size=24 Context=Places Type=Threshold [24x24/status] Size=24 Context=Status Type=Threshold [24x24/stock/chart] Size=24 Context=Stock Type=Threshold [24x24/stock/code] Size=24 Context=Stock Type=Threshold [24x24/stock/data] Size=24 Context=Stock Type=Threshold [24x24/stock/form] Size=24 Context=Stock Type=Threshold [24x24/stock/image] Size=24 Context=Stock Type=Threshold [24x24/stock/io] Size=24 Context=Stock Type=Threshold [24x24/stock/media] Size=24 Context=Stock Type=Threshold [24x24/stock/navigation] Size=24 Context=Stock Type=Threshold [24x24/stock/net] Size=24 Context=Stock Type=Threshold [24x24/stock/object] Size=24 Context=Stock Type=Threshold [24x24/stock/table] Size=24 Context=Stock Type=Threshold [24x24/stock/text] Size=24 Context=Stock Type=Threshold [32x32/actions] Size=32 Context=Actions Type=Threshold [32x32/animations] Size=32 Context=Animations Type=Threshold [32x32/apps] Size=32 Context=Applications Type=Threshold [32x32/categories] Size=32 Context=Categories Type=Threshold [32x32/devices] Size=32 Context=Devices Type=Threshold [32x32/emblems] Size=32 Context=Emblems Type=Threshold [32x32/emotes] Size=32 Context=Emotes Type=Threshold [32x32/filesystems] Size=32 Context=FileSystems Type=Threshold [32x32/intl] Size=32 Context=International Type=Threshold [32x32/mimetypes] Size=32 Context=MimeTypes Type=Threshold [32x32/places] Size=32 Context=Places Type=Threshold [32x32/status] Size=32 Context=Status Type=Threshold [32x32/stock/chart] Size=32 Context=Stock Type=Threshold [32x32/stock/code] Size=32 Context=Stock Type=Threshold [32x32/stock/data] Size=32 Context=Stock Type=Threshold [32x32/stock/form] Size=32 Context=Stock Type=Threshold [32x32/stock/image] Size=32 Context=Stock Type=Threshold [32x32/stock/io] Size=32 Context=Stock Type=Threshold [32x32/stock/media] Size=32 Context=Stock Type=Threshold [32x32/stock/navigation] Size=32 Context=Stock Type=Threshold [32x32/stock/net] Size=32 Context=Stock Type=Threshold [32x32/stock/object] Size=32 Context=Stock Type=Threshold [32x32/stock/table] Size=32 Context=Stock Type=Threshold [32x32/stock/text] Size=32 Context=Stock Type=Threshold [36x36/actions] Size=36 Context=Actions Type=Threshold [36x36/animations] Size=36 Context=Animations Type=Threshold [36x36/apps] Size=36 Context=Applications Type=Threshold [36x36/categories] Size=36 Context=Categories Type=Threshold [36x36/devices] Size=36 Context=Devices Type=Threshold [36x36/emblems] Size=36 Context=Emblems Type=Threshold [36x36/emotes] Size=36 Context=Emotes Type=Threshold [36x36/filesystems] Size=36 Context=FileSystems Type=Threshold [36x36/intl] Size=36 Context=International Type=Threshold [36x36/mimetypes] Size=36 Context=MimeTypes Type=Threshold [36x36/places] Size=36 Context=Places Type=Threshold [36x36/status] Size=36 Context=Status Type=Threshold [36x36/stock/chart] Size=36 Context=Stock Type=Threshold [36x36/stock/code] Size=36 Context=Stock Type=Threshold [36x36/stock/data] Size=36 Context=Stock Type=Threshold [36x36/stock/form] Size=36 Context=Stock Type=Threshold [36x36/stock/image] Size=36 Context=Stock Type=Threshold [36x36/stock/io] Size=36 Context=Stock Type=Threshold [36x36/stock/media] Size=36 Context=Stock Type=Threshold [36x36/stock/navigation] Size=36 Context=Stock Type=Threshold [36x36/stock/net] Size=36 Context=Stock Type=Threshold [36x36/stock/object] Size=36 Context=Stock Type=Threshold [36x36/stock/table] Size=36 Context=Stock Type=Threshold [36x36/stock/text] Size=36 Context=Stock Type=Threshold [48x48/actions] Size=48 Context=Actions Type=Threshold [48x48/animations] Size=48 Context=Animations Type=Threshold [48x48/apps] Size=48 Context=Applications Type=Threshold [48x48/categories] Size=48 Context=Categories Type=Threshold [48x48/devices] Size=48 Context=Devices Type=Threshold [48x48/emblems] Size=48 Context=Emblems Type=Threshold [48x48/emotes] Size=48 Context=Emotes Type=Threshold [48x48/filesystems] Size=48 Context=FileSystems Type=Threshold [48x48/intl] Size=48 Context=International Type=Threshold [48x48/mimetypes] Size=48 Context=MimeTypes Type=Threshold [48x48/places] Size=48 Context=Places Type=Threshold [48x48/status] Size=48 Context=Status Type=Threshold [48x48/stock/chart] Size=48 Context=Stock Type=Threshold [48x48/stock/code] Size=48 Context=Stock Type=Threshold [48x48/stock/data] Size=48 Context=Stock Type=Threshold [48x48/stock/form] Size=48 Context=Stock Type=Threshold [48x48/stock/image] Size=48 Context=Stock Type=Threshold [48x48/stock/io] Size=48 Context=Stock Type=Threshold [48x48/stock/media] Size=48 Context=Stock Type=Threshold [48x48/stock/navigation] Size=48 Context=Stock Type=Threshold [48x48/stock/net] Size=48 Context=Stock Type=Threshold [48x48/stock/object] Size=48 Context=Stock Type=Threshold [48x48/stock/table] Size=48 Context=Stock Type=Threshold [48x48/stock/text] Size=48 Context=Stock Type=Threshold [64x64/actions] Size=64 Context=Actions Type=Threshold [64x64/animations] Size=64 Context=Animations Type=Threshold [64x64/apps] Size=64 Context=Applications Type=Threshold [64x64/categories] Size=64 Context=Categories Type=Threshold [64x64/devices] Size=64 Context=Devices Type=Threshold [64x64/emblems] Size=64 Context=Emblems Type=Threshold [64x64/emotes] Size=64 Context=Emotes Type=Threshold [64x64/filesystems] Size=64 Context=FileSystems Type=Threshold [64x64/intl] Size=64 Context=International Type=Threshold [64x64/mimetypes] Size=64 Context=MimeTypes Type=Threshold [64x64/places] Size=64 Context=Places Type=Threshold [64x64/status] Size=64 Context=Status Type=Threshold [64x64/stock/chart] Size=64 Context=Stock Type=Threshold [64x64/stock/code] Size=64 Context=Stock Type=Threshold [64x64/stock/data] Size=64 Context=Stock Type=Threshold [64x64/stock/form] Size=64 Context=Stock Type=Threshold [64x64/stock/image] Size=64 Context=Stock Type=Threshold [64x64/stock/io] Size=64 Context=Stock Type=Threshold [64x64/stock/media] Size=64 Context=Stock Type=Threshold [64x64/stock/navigation] Size=64 Context=Stock Type=Threshold [64x64/stock/net] Size=64 Context=Stock Type=Threshold [64x64/stock/object] Size=64 Context=Stock Type=Threshold [64x64/stock/table] Size=64 Context=Stock Type=Threshold [64x64/stock/text] Size=64 Context=Stock Type=Threshold [72x72/actions] Size=72 Context=Actions Type=Threshold [72x72/animations] Size=72 Context=Animations Type=Threshold [72x72/apps] Size=72 Context=Applications Type=Threshold [72x72/categories] Size=72 Context=Categories Type=Threshold [72x72/devices] Size=72 Context=Devices Type=Threshold [72x72/emblems] Size=72 Context=Emblems Type=Threshold [72x72/emotes] Size=72 Context=Emotes Type=Threshold [72x72/filesystems] Size=72 Context=FileSystems Type=Threshold [72x72/intl] Size=72 Context=International Type=Threshold [72x72/mimetypes] Size=72 Context=MimeTypes Type=Threshold [72x72/places] Size=72 Context=Places Type=Threshold [72x72/status] Size=72 Context=Status Type=Threshold [72x72/stock/chart] Size=72 Context=Stock Type=Threshold [72x72/stock/code] Size=72 Context=Stock Type=Threshold [72x72/stock/data] Size=72 Context=Stock Type=Threshold [72x72/stock/form] Size=72 Context=Stock Type=Threshold [72x72/stock/image] Size=72 Context=Stock Type=Threshold [72x72/stock/io] Size=72 Context=Stock Type=Threshold [72x72/stock/media] Size=72 Context=Stock Type=Threshold [72x72/stock/navigation] Size=72 Context=Stock Type=Threshold [72x72/stock/net] Size=72 Context=Stock Type=Threshold [72x72/stock/object] Size=72 Context=Stock Type=Threshold [72x72/stock/table] Size=72 Context=Stock Type=Threshold [72x72/stock/text] Size=72 Context=Stock Type=Threshold [96x96/actions] Size=96 Context=Actions Type=Threshold [96x96/animations] Size=96 Context=Animations Type=Threshold [96x96/apps] Size=96 Context=Applications Type=Threshold [96x96/categories] Size=96 Context=Categories Type=Threshold [96x96/devices] Size=96 Context=Devices Type=Threshold [96x96/emblems] Size=96 Context=Emblems Type=Threshold [96x96/emotes] Size=96 Context=Emotes Type=Threshold [96x96/filesystems] Size=96 Context=FileSystems Type=Threshold [96x96/intl] Size=96 Context=International Type=Threshold [96x96/mimetypes] Size=96 Context=MimeTypes Type=Threshold [96x96/places] Size=96 Context=Places Type=Threshold [96x96/status] Size=96 Context=Status Type=Threshold [96x96/stock/chart] Size=96 Context=Stock Type=Threshold [96x96/stock/code] Size=96 Context=Stock Type=Threshold [96x96/stock/data] Size=96 Context=Stock Type=Threshold [96x96/stock/form] Size=96 Context=Stock Type=Threshold [96x96/stock/image] Size=96 Context=Stock Type=Threshold [96x96/stock/io] Size=96 Context=Stock Type=Threshold [96x96/stock/media] Size=96 Context=Stock Type=Threshold [96x96/stock/navigation] Size=96 Context=Stock Type=Threshold [96x96/stock/net] Size=96 Context=Stock Type=Threshold [96x96/stock/object] Size=96 Context=Stock Type=Threshold [96x96/stock/table] Size=96 Context=Stock Type=Threshold [96x96/stock/text] Size=96 Context=Stock Type=Threshold [128x128/actions] Size=128 Context=Actions Type=Threshold [128x128/animations] Size=128 Context=Animations Type=Threshold [128x128/apps] Size=128 Context=Applications Type=Threshold [128x128/categories] Size=128 Context=Categories Type=Threshold [128x128/devices] Size=128 Context=Devices Type=Threshold [128x128/emblems] Size=128 Context=Emblems Type=Threshold [128x128/emotes] Size=128 Context=Emotes Type=Threshold [128x128/filesystems] Size=128 Context=FileSystems Type=Threshold [128x128/intl] Size=128 Context=International Type=Threshold [128x128/mimetypes] Size=128 Context=MimeTypes Type=Threshold [128x128/places] Size=128 Context=Places Type=Threshold [128x128/status] Size=128 Context=Status Type=Threshold [128x128/stock/chart] Size=128 Context=Stock Type=Threshold [128x128/stock/code] Size=128 Context=Stock Type=Threshold [128x128/stock/data] Size=128 Context=Stock Type=Threshold [128x128/stock/form] Size=128 Context=Stock Type=Threshold [128x128/stock/image] Size=128 Context=Stock Type=Threshold [128x128/stock/io] Size=128 Context=Stock Type=Threshold [128x128/stock/media] Size=128 Context=Stock Type=Threshold [128x128/stock/navigation] Size=128 Context=Stock Type=Threshold [128x128/stock/net] Size=128 Context=Stock Type=Threshold [128x128/stock/object] Size=128 Context=Stock Type=Threshold [128x128/stock/table] Size=128 Context=Stock Type=Threshold [128x128/stock/text] Size=128 Context=Stock Type=Threshold [192x192/actions] Size=192 Context=Actions Type=Threshold [192x192/animations] Size=192 Context=Animations Type=Threshold [192x192/apps] Size=192 Context=Applications Type=Threshold [192x192/categories] Size=192 Context=Categories Type=Threshold [192x192/devices] Size=192 Context=Devices Type=Threshold [192x192/emblems] Size=192 Context=Emblems Type=Threshold [192x192/emotes] Size=192 Context=Emotes Type=Threshold [192x192/filesystems] Size=192 Context=FileSystems Type=Threshold [192x192/intl] Size=192 Context=International Type=Threshold [192x192/mimetypes] Size=192 Context=MimeTypes Type=Threshold [192x192/places] Size=192 Context=Places Type=Threshold [192x192/status] Size=192 Context=Status Type=Threshold [192x192/stock/chart] Size=192 Context=Stock Type=Threshold [192x192/stock/code] Size=192 Context=Stock Type=Threshold [192x192/stock/data] Size=192 Context=Stock Type=Threshold [192x192/stock/form] Size=192 Context=Stock Type=Threshold [192x192/stock/image] Size=192 Context=Stock Type=Threshold [192x192/stock/io] Size=192 Context=Stock Type=Threshold [192x192/stock/media] Size=192 Context=Stock Type=Threshold [192x192/stock/navigation] Size=192 Context=Stock Type=Threshold [192x192/stock/net] Size=192 Context=Stock Type=Threshold [192x192/stock/object] Size=192 Context=Stock Type=Threshold [192x192/stock/table] Size=192 Context=Stock Type=Threshold [192x192/stock/text] Size=192 Context=Stock Type=Threshold [256x256/actions] MinSize=64 Size=256 MaxSize=256 Context=Actions Type=Scalable [256x256/animations] MinSize=64 Size=256 MaxSize=256 Context=Animations Type=Scalable [256x256/apps] MinSize=64 Size=256 MaxSize=256 Context=Applications Type=Scalable [256x256/categories] MinSize=64 Size=256 MaxSize=256 Context=Categories Type=Scalable [256x256/devices] MinSize=64 Size=256 MaxSize=256 Context=Devices Type=Scalable [256x256/emblems] MinSize=64 Size=256 MaxSize=256 Context=Emblems Type=Scalable [256x256/emotes] MinSize=64 Size=256 MaxSize=256 Context=Emotes Type=Scalable [256x256/filesystems] MinSize=64 Size=256 MaxSize=256 Context=FileSystems Type=Scalable [256x256/intl] MinSize=64 Size=256 MaxSize=256 Context=International Type=Scalable [256x256/mimetypes] MinSize=64 Size=256 MaxSize=256 Context=MimeTypes Type=Scalable [256x256/places] MinSize=64 Size=256 MaxSize=256 Context=Places Type=Scalable [256x256/status] MinSize=64 Size=256 MaxSize=256 Context=Status Type=Scalable [256x256/stock/chart] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/code] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/data] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/form] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/image] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/io] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/media] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/navigation] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/net] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/object] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/table] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [256x256/stock/text] MinSize=64 Size=256 MaxSize=256 Context=Stock Type=Scalable [scalable/actions] MinSize=1 Size=128 MaxSize=256 Context=Actions Type=Scalable [scalable/animations] MinSize=1 Size=128 MaxSize=256 Context=Animations Type=Scalable [scalable/apps] MinSize=1 Size=128 MaxSize=256 Context=Applications Type=Scalable [scalable/categories] MinSize=1 Size=128 MaxSize=256 Context=Categories Type=Scalable [scalable/devices] MinSize=1 Size=128 MaxSize=256 Context=Devices Type=Scalable [scalable/emblems] MinSize=1 Size=128 MaxSize=256 Context=Emblems Type=Scalable [scalable/emotes] MinSize=1 Size=128 MaxSize=256 Context=Emotes Type=Scalable [scalable/filesystems] MinSize=1 Size=128 MaxSize=256 Context=FileSystems Type=Scalable [scalable/intl] MinSize=1 Size=128 MaxSize=256 Context=International Type=Scalable [scalable/mimetypes] MinSize=1 Size=128 MaxSize=256 Context=MimeTypes Type=Scalable [scalable/places] MinSize=1 Size=128 MaxSize=256 Context=Places Type=Scalable [scalable/status] MinSize=1 Size=128 MaxSize=256 Context=Status Type=Scalable [scalable/stock/chart] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/code] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/data] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/form] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/image] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/io] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/media] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/navigation] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/net] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/object] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/table] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/text] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/000077500000000000000000000000001326020644600272235ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/apps/000077500000000000000000000000001326020644600301665ustar00rootroot00000000000000org.gajim.Gajim.svg000066400000000000000000000464771326020644600335550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/apps image/svg+xml Gajim 28.10.2006 Josef Vybíral http://cornelius.gimp.cz gajim jabber im gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status/000077500000000000000000000000001326020644600305465ustar00rootroot00000000000000dcraven-away.svg000066400000000000000000000631331326020644600335770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml Gajim 28.10.2006 Josef Vybíral http://cornelius.gimp.cz gajim jabber im dcraven-chat.svg000066400000000000000000000712641326020644600335610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml Gajim 28.10.2006 Josef Vybíral http://cornelius.gimp.cz gajim jabber im dcraven-closed.svg000066400000000000000000000077221326020644600341110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml dcraven-connecting.svg000066400000000000000000001555461326020644600347770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml Gajim 28.10.2006 Josef Vybíral http://cornelius.gimp.cz gajim jabber im dcraven-dnd.svg000066400000000000000000000756541326020644600334160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml Gajim 28.10.2006 Josef Vybíral http://cornelius.gimp.cz gajim jabber im dcraven-error.svg000066400000000000000000000706331326020644600337720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml Gajim 28.10.2006 Josef Vybíral http://cornelius.gimp.cz gajim jabber im dcraven-invisible.svg000066400000000000000000000656241326020644600346310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml Gajim 28.10.2006 Josef Vybíral http://cornelius.gimp.cz gajim jabber im dcraven-message.svg000066400000000000000000000355731326020644600342710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml dcraven-muc-active.svg000066400000000000000000000255541326020644600347000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml Group Chat Jakub Steiner group chat IRC internet network dcraven-muc-inactive.svg000066400000000000000000000267531326020644600352310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml Group Chat Jakub Steiner group chat IRC internet network dcraven-notinroster.svg000066400000000000000000000472221326020644600352250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml Gajim 28.10.2006 Josef Vybíral http://cornelius.gimp.cz gajim jabber im dcraven-offline.svg000066400000000000000000000504431326020644600342600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml Gajim 28.10.2006 Josef Vybíral http://cornelius.gimp.cz gajim jabber im dcraven-online.svg000066400000000000000000000471111326020644600341200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml Gajim 28.10.2006 Josef Vybíral http://cornelius.gimp.cz gajim jabber im dcraven-opened.svg000066400000000000000000000071571326020644600341140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml dcraven-requested.svg000066400000000000000000000664131326020644600346430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml Gajim 28.10.2006 Josef Vybíral http://cornelius.gimp.cz gajim jabber im ? dcraven-xa.svg000066400000000000000000000631271326020644600332510ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml Gajim 28.10.2006 Josef Vybíral http://cornelius.gimp.cz gajim jabber im gajim-agent-aim.svg000066400000000000000000000200071326020644600341360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-agent-bytestreams.svg000066400000000000000000001144351326020644600357430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-agent-conference.svg000066400000000000000000000255511326020644600355100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml Group Chat Jakub Steiner group chat IRC internet network gajim-agent-disc.svg000066400000000000000000000764721326020644600343330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-agent-error.svg000066400000000000000000000135271326020644600345320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-agent-gadu-gadu.svg000066400000000000000000000314461326020644600352370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-agent-http-ws.svg000066400000000000000000000374701326020644600350120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-agent-icq.svg000066400000000000000000000307701326020644600341540ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-agent-irc.svg000066400000000000000000000212321326020644600341460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-agent-jabber.svg000066400000000000000000003544431326020644600346330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-agent-jud.svg000066400000000000000000000436021326020644600341600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml @ @ gajim-agent-mail.svg000066400000000000000000000355261326020644600343260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-agent-msn.svg000066400000000000000000000211621326020644600341700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-agent-pubsub.svg000066400000000000000000000461561326020644600347050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-agent-rss.svg000066400000000000000000000245121326020644600342040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-agent-sip.svg000066400000000000000000000311301326020644600341620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-agent-sms.svg000066400000000000000000000650621326020644600342040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-agent-tv.svg000066400000000000000000000301721326020644600340250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-agent-weather.svg000066400000000000000000000271061326020644600350360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-agent-yahoo.svg000066400000000000000000000237131326020644600345160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-chat_msg_recv.svg000066400000000000000000000610201326020644600351000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-connection_lost.svg000066400000000000000000001610601326020644600355010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-ft_done.svg000066400000000000000000001152641326020644600337240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-ft_error.svg000066400000000000000000000410711326020644600341220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-ft_request.svg000066400000000000000000000413341326020644600344630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-ft_stopped.svg000066400000000000000000000451351326020644600344540ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-ft_stopsvg.svg000066400000000000000000000451351326020644600345030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-gc_invitation.svg000066400000000000000000001337201326020644600351400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml ? gajim-mail.svg000066400000000000000000000355261326020644600332320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-new_email_recv.svg000066400000000000000000000406021326020644600352560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-priv_msg_recv.svg000066400000000000000000000523121326020644600351450ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-single_msg_recv.svg000066400000000000000000000414051326020644600354470ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-subscribe.svg000066400000000000000000001320201326020644600342540ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-unsubscribe.svg000066400000000000000000001223701326020644600346260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml sun-away.svg000066400000000000000000001713061326020644600327640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml sun-chat.svg000066400000000000000000001224521326020644600327400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml sun-dnd.svg000066400000000000000000000751321326020644600325700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml sun-error.svg000066400000000000000000001717751326020644600331660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml sun-invisible.svg000066400000000000000000001146341326020644600340100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml sun-not_in_roster.svg000066400000000000000000001117511326020644600347050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml sun-offline.svg000066400000000000000000000153531326020644600334440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml sun-online.svg000066400000000000000000001141311326020644600333000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml sun-requested.svg000066400000000000000000001215031326020644600340160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml sun-xa.svg000066400000000000000000001066111326020644600324300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/scalable/status image/svg+xml gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/symbolic/000077500000000000000000000000001326020644600272765ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/symbolic/apps/000077500000000000000000000000001326020644600302415ustar00rootroot00000000000000org.gajim.Gajim-symbolic.svg000066400000000000000000000124431326020644600354310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/icons/hicolor/symbolic/apps image/svg+xml Josef Vybíral gajim jabber im gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/000077500000000000000000000000001326020644600245325ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/000077500000000000000000000000001326020644600261545ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/16x16/000077500000000000000000000000001326020644600267415ustar00rootroot00000000000000away.png000066400000000000000000000014761326020644600303410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8ukTgϽw>1HZcblFA$Pꪔ.,B+ƕtםŅta u•J II5|u2Ӆq?QUjo_z\Ve#z2YJm`|Env7}-jJ/T /+Nm̩U)l+Y P˺ƖM 1$>كZ Kbǫ ,P6է .5huʪ? UÕș@#݄L06u×+컣q|FLl鎝;l>7sIݻ %>ǎ^Hvnw>ֲJl ~~֮,}FǦxT<=L5vѺx̣_-ςkc9ѧDkHvz+3܉6wlnJuG[{^ BXkpJ0?JdҳIk cvxOɶt~1` b&͔itN@:SpaZc 4 _A%¢g9r0i_EDFշ-kqAK/{sj$(,h$:!ԫGb՘cJ 霚IհTI I6R,?0Dbˉ76aZoufIENDB`chat.png000066400000000000000000000015331326020644600303110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8uMHTQsqN꤅ӠST:eR-* f\(h"菰M%Dm40*SS1zsZc}{{ ){\ (A+c]$zµ$ %Kd{JfId/av!xM@vVOÉDʽKb XԓW .7yp-ʧ@ A0zyqce2E BGHeQ04s5@Օ@̺ es^=!SըjpN( TUЀ^__j+ZB_fB%R.ӈ]YH iGp=t&zy9*^ze}ҺC~{nZaK j'NneANjX|hC}cA_W/H̸KͰ =Aӂ-}'Q쿊`?SZSz-pS_Ʀ,pS3HU'st{Eï /jH`_W %G=Z ohbM+,4e6Dh.X80 m&`6q >%9ȑ2`XR./ap4* K=#]c$@ ` . pcM9IENDB`closed.png000066400000000000000000000002741326020644600306440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/16x16PNG  IHDRabKGDtIME  (9m^IDAT8c`( _r-\6\a,،.+Bp^```` e```' {=\%:п-dIENDB`connecting.png000066400000000000000000000016501326020644600315210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/16x16PNG  IHDRabKGDtIME 9+O_0JIDAT8]Kh\UsνsLf2yifRlhJj- Jŕ\IU]ULt Uu!%bHEF)$L1Lgǝ{=n>9sK%+:0%,LjI/N^ӷ*ufvcWRwmڒnU[Gmth۷NfOlFsᄔhD!,ʬmVXK m-"XJR\85-iGuY:4˹2 CCh$uE)c+zw c Kag[SkEDIBc4nDq{.k+v7}1L[$ah [pKJjһYFw[/]8u]4%]Y͗{1[]aO^{[^6#E \)$_̧,]un}IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/16x16/dnd.png000066400000000000000000000015101326020644600302110ustar00rootroot00000000000000PNG  IHDRabKGDtIME  0IDAT8_h[ewNN'inKJڴVQ2[ֺ,j Bxo*^PA;zlNjR6d8Y64KzN>/Ɓ/ zP  W66PJwi E*X֍$w@*-IENDB`error.png000066400000000000000000000014601326020644600305220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/16x16PNG  IHDRabKGDtIME /JAIDAT8MhTwd21dGFeD"21*nMdH MwٸB5,%|V0:dtQQ9{慨kƨ>RF˱|\-C^dǩh0F35=inl)0PE;;bW9n&SQ "PJE>#pX\Z  L{ _h"[7T֋- kbm硻fXaC] ropz6:ˡ[ݗQ۾-}??Hu3lnjeFF.isG񫝄*xͪ[nWW>':'ϝJ4~HX`|o"Qyβ~>x2Ɣ0;$:N|.wX]Ϳ.GHF=AW9{c CueK#c?J Wp` UR|& EZlffFE)lC+EM:ֿr5酅`-Z hMP*m<] 6bmn._f%Ο'ӳQ6{48RJf,k Ej7%ܐl1&1?rNL9kGPa+BIENDB`event.png000066400000000000000000000010351326020644600305100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8œj`LdfƑ:҈tV"C;F@\.D\JEsfa4V@2;&:J/yrNƉ`޹zqMey=Zq8em}8T狽gH-q89r,ۢ1K0 ( IӔh}ʲdRLQC%zG v?`vF$BKU\ʏ66&ibY6;[%hPUZ$Ix<˰l:!@QJܼqfg\p:UUEQlzZt:D*պO|'Ft_qG[^6ݣn|uޣLu&˲>gy1(%&IENDB`invisible.png000066400000000000000000000015671326020644600313650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8KLSA{RKS-"֠  <$(KW$hb;K#+|ą.X1OD hUDȫHm{K_5s\ gy~< V#skX #6sfRwO9PU/H_ins鉂J= nT&x#!A}zQ2wTxCoϓWè|]d yH7=ML#q`ۋȦ rũA=mcnb-7B"J"=LaeULy|T}**Xn3G/j(Qy n4V3'{o!עUpئ>{oycJdrsM7[wf어`Ϩ +!g: yQ4,?=i729Kg8rnY 'klPy)5zeo-q: <竝MY}w&3))o/)|QFE(ƤXQe͇e@)׌! CZ-L1BAmBN, A0]"C@`00,ڄz/ (0QJh)-)#B'A6nR?lc!Jc*K.ݛ$.\.s;DSz@gD$׾KEeȵc Q]?ڭVy EnYfFenS.ozÐ ,.eRZyŭ2,˞ΕJ6ŢX,~\J%ۭ ð#c b";Ft:U$yZ8gY|nZfp8TE;i4;j{ދW zNjz7L6)`HD$>t:7|_kWZo=N dg=m1缚mo l)IENDB`not_in_roster.png000066400000000000000000000015031326020644600322530ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8}kSQƿs͍**mmB7q>׮|#½ "X *ؤj>BkmM6i619g\H%0 #"Ԗu(ߐD1NJy)d?jY-m:ϜtbT*u`Z߾psy@<,oZ=tFG]`M;;d78X \/!lXӥ; sՌg/$ an9p8z=,IE MMMBGr6́͛g?!_^ŐLnoձ#}j,fLj5[`Y~]{ tgxRJx r2%WRS`옘Ң\MD ;<8tMT)MtX<4liIB2\xKĤ^IK ;ik  "H DkK+2\>9z+R ir $ DUU RmcUMQ)@sښ@lCBfP,kYTt 84 JR2d_B~ تm`STT@>_@BR.W{ѕp{8h#c, JDV{~+e, IENDB`offline.png000066400000000000000000000014541326020644600310160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/16x16PNG  IHDRabKGDtIME 9-< IDAT8KhSAIMҴkbSAmJR)J}Z ۵N\FplO4TQQ5Ucj&MwθK;??|~Hv"ZZ~ i/{zzb93ݻc:uhh(={9DqkuF#QV*q(b$ PV IBBX* X>tww76mV7lhckl1{BٙOt:mq/utx(зӆU'Oe=p;x ;t(=jo岉Gyl^߄YG\oeYCHM;7+vWln4~U[:rDZO`z&7EdbՊ fggkV77p}1f=Ǐ&}L0}Ԁn0Y*becq]dC@ 4M9:zöm[1"<?kgx<B)9~ HJ!$һۓw]odrBER )AD4 z;$0FXRR D $ P*0TD"!"~8 4H$_Tճ䳦Vi@) UAaTE['MLwDT|q!ML[ Lk|IENDB`online.png000066400000000000000000000015111326020644600306520ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8}oeع`.BP!(MJĂұ $6$*6@[.rC$%1&|{"Hy~z9*3îyL8ecx{2 Zr艳}䫂QDoi`͓-tnG'7h"{{\;p,<#9+5~gs" p\)A +mJ2پ6@zO`CΪ7F}\zhʍqqċ>Iz2:W:ayƾ +֪\Pouy}x7/x}Rj1W_hfPX(3E30S4rGO_2֯*_ Nw|V9{R/OI{RNb0>7"Hze.V/;NIbU)prx4EO8QW,EJO ":Pڪ;Yo傽u GtrƘڔ$' NFp d| iIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/16x16/xa.png000066400000000000000000000014751326020644600300660ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8}Ohe?}vYMƦV^t(L!; de C2x27OE80;Ńd`lnvZFMy~e/n灇*qS `kn6ޮe+ؕ>*:gue|Fl^ovM/D='D9l}De<>?q]ok\3 00x驀l^YknO;S3"CwֵOeNUv[ _O6#2Խ)ߘ^Z=,}-..$p4mv |KcT7{w;k+op*sTmJwJ|| <2:btjFapbbvɓcc۷i_I&94Ofdy;~]uN=%/RӮN-t+WaP=H3"g2͡E8kLNV.W7_?LTB-kAVQUs* ݀{r9pۀss T{OxSuREFFxyXŐA*Xϩ<؎ZJP:KhCX|rqQTxBXV^#X_><b0IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/32x32/000077500000000000000000000000001326020644600267355ustar00rootroot00000000000000away.png000066400000000000000000000034431326020644600303310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/32x32PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXŗ[UW{;0õP)r+X(@mژJ֢1J >>T/>MZJhJA,w8esc.9sk}>s)LGh&srNo-s2 !҈M({='+6h'RM w|Ώ+R}wt魂~o}um5?_ܸ-eLD{[:j 4|wWo `߫-4Qb|0v pQ?~f-NgrbyW҆h[ 3[>9eL11L0ƯEDKwZPʋV־% ֈ+ĘyԵcI#&H1n&L^ (V]+4H!b'S `+Oelԉs9QFZL8؉i7(WFxqQ6…gQC]!L0Z7gۗO_$pQ'6F]8{ gq.Z})759^pl I<+[vn\ f"&0g ˝x)NcOʧ76&geAMzw~Y|˦ g% `ov6sgC4b۲z~'3 bfC xy_+> Q-˳K$1ތDôܟg030 y4,@X(_bb%) v3 "qVoh<iDR]z0̤D(>!%2xLIL (岄ršl.*ežo@TS܌n"R*ޏP77C8@<83 9[LH>m7q;jFz zmBܻaO1W(fIENDB`chat.png000066400000000000000000000040651326020644600303100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/32x32PNG  IHDR szzsRGBbKGD pHYs B(xtIMErtIDATX͖ilU3λo7  a_@!,lp(K4QӄV TW!RTRДM K1%2asjlサΜ~q XCG:pu=?^om4w=7.nJ=ݾyON=@U92%ë`D^.^fUutOX|p\]]th^DMe p#U@jn M `V|LylDuj-m޼9Vd9zVb;vX[lrTxcz|劕S*U Fpro?]q Zp)k 7(Z5s`z u1c,ȑkF Ƃg':\ʼnGe4Dѕ8)241P\KH"'3H ᩥE4)H`>}T %[`LLòyuسfc R*x#+q twb^-z_<P \KR&us_ĢOb~"!sYgϞq]޺ikըKy;IWir"J@*)㛐+Mxgg^Y*,{)b""U"f,6{TJȍlɘp<2AJ!-%%OZE~=nذ{ >(g=wLZ @2hibT-{ ?vtt|˖-#+3tzg,C s0P ^™ߤۉHO]R]~`x( )1%РE s#BIϽn4~U*vZVƶ 75%..~ RȋXp=r7m:Eˎ֘=Pg#/4imڏ>;ۿ$҄Y,yf Mp(" oR Z.#++ + ?Z1qRzvDv\ S ʹܾ:{L~K O}svޒu~7pmFB ө?ᙁs55-mN!U@u E6[`ja;q5` ^K7st!u!.;q3~BHs03Th ":rB2 +cE@_X)!Dc޶ʙZEx+'=&5K_8yUmekMAo V-ⵈ;~a „YBh>DԲS댷莴_lMf`Յ6Plz~">}0'k%Z/%:߫$F캲2 oPc}{ a!{=\W=kp`u9҂!P rX@݅A1笹@@ = %3E0L`2#5=fZ`Wdd#)>D  <:.2P$%!n(`^"Gz<#2 ܀eL?2ct7#u9ɻѫMH8qIcvū ~iO–qX^ -=  4?t4.`0LT0ȤH'>mH+xAP3 af $8L'Ie$<Ӎ +n9yz{`@$ϋ\V`ag0 F9hD]t˵4 }}q;fTO26,yc ixo:YjIENDB`closed.png000066400000000000000000000010021326020644600306260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/32x32PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATX͗N@/+> !Dj荘PJ}Cwhښ:!# ͸rl>m zM~?:s10YD# @V,@I :" \V0 +ܠ ¾.8 h~wBQX- |{!$wP3bXu61=Lsq yzy@Xas&90f WQT:C8Yֲ,Aq 5vthuvͧL^F( $6@HuHmI:e6hBDhPn&38vy82RWgiIENDB`connecting.png000066400000000000000000000041571326020644600315220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/32x32PNG  IHDR szzbKGDtIME ;'t߫IDATXŗilU3w}7W؎@b JJ* JT5jZԪjA|C4|ITR"%UJp@%`V`̝3𮍱,U{9̙, ^n `k<%CH;tfsnwo^]Ī#5iLŹ+#ȉo+NE:v~k}y)ސsd=Gm( _(R@_>7@#5q-z򡕦002VFAϕ LzBY@U҅ sxb_hEw~G5ΐ8{=38g 8g α}]@$ @w=6&|*@ö=Q۰tAUquD ѬtTgB*x 2Q]n#106ͱ2gF'[}B4p9qԔ 0uS04]5 \.T89ch"~Gb6hyٶx'43e}tuBYclF*+\G;/e77150BDp#.0" y{]Z֐. b=:59MPg}ֳOORadE@ Fh33LCg',0tѲ[?s/ jY:s>$):) I HDJQ-H)X c}8?s:)w5B>4']]R.Vkc&43c)NiSy q0np @HkZ*׏d~0[6Ƽ{yV 8D8q)=~gF`i`j0fbAjnG@i(,)7z;;pzQ:LаgvC>u@~R4>#Sјҩ1US3y}q_}eRIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/32x32/dnd.png000066400000000000000000000037051326020644600302150ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs  tIME*rlEIDATX͗m>3,;/X)Uh TmU iR5iimZmMmRZB1YȊ²06s^6bYSL{=>?n~EZ>֢j12@9²mv&z%?)W:"Gݮxsa`f&Rw;T#fo/QE _XxK+"/ZΖQz:61DnGkȍarc9z/=(7 ɣ} G91Ml$-w2aƕJQʏxGNDQ: wS۸TrJsx$ԁGQF)?QZºI@e1 Ԃ!H 2ǸY"{Bg_#֌b4Ma ֌!6Wch,rEiyx%yzth "u/Yq ɏޚJ<}lsjcujV#0VAb&s[7}[6M״S|,leb)~:~Ȟܵ%ud_p?U;Z? _zwy9>Nps݉RyPp2&CPH dy|ufUtoZ>&vu Mر~R\c/l{[nt}' avZbL Kwb6wzh}uxt]<*N ܵp~gg1sh#)ڱJBh& 97H:aѲ~n?"2 Z-}_oWCw?l6z +Beފ`uh_?#.*IgQ߰ԑ!>h8E.vt;8H||'M_[Y{>PEF)1 "ƋHV. Pe PJk"輩p7@9N/^ew-Txa3 X9sqOjZd>(g}ajؑБɔ VcHE771`ȱc&74tZ'j m,h^ :5u _^U 8:i4lK& N@C*u]==O8޾F>.j[k_&/J,eD)1ciW[ҳny@yp ֤nX ЪlTiR'H-ɻnѓw_T'3޽~JFjS윎G50jo"IENDB`error.png000066400000000000000000000035601326020644600305210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/32x32PNG  IHDR szzsRGBbKGD pHYs  tIMEqIDATX͖klTs޵Ǐ6 i񋖂L@!Bℨ4iUJUdi"Y:D(~(mԤ ȁ@@ih`ގŏ]{9bJ^itݝ;7s?/y?Y&WaCL''ڞlL~y` Mࡃmn8]?(x[CJ)$SzY03L@8\fƞ=X<־77 k~Q8p?dS0 c"6""B!X?N%7V+WH4L&uC4n ˗/(dp—>,Y @zEM|=7 rlˆRJd  ҇e - nRB4tMb35 ^6 M7LM::6ʆa@)$""74166ƺoQO`C*ʥcBA?^*HB:93 ]fŅy9@@:,ܹ~pXtV]EEAQ\!~|Rc\bT+K/m;q2ܰ0m5ZE0ML&N/Om2`i5;j  /NOPΝ\BMsp{D  d2ADO pp __bLe}y_XT bh'8dċC8 HAkk+ٿiGASg0L@J?YVZb4 m#9'G0:1Kͤ (NC _[ܔJ-rө?G^o_ͻ~'O@&iNdΜXg65[n@B)ij午~ܼ2@P]UKS)104v]4,\[HODHoۋ0+*M ՞NgOvyf#eiPȯEetA@`*31/2fF0ˑ@0v]p%B !iю;7n%c+ϟ=Çuy LNNnJ%qn,F14<8 O>ݻR _7ut(r^u|4ziA7zg09)32%9WY[W^ (Uuu>EEiQ/}X5yA&{/aաPk:xt:>J`Y֜y9 (bx:xakE X;>H093&"g |eAfH)Y}]cD ݸb<}&)8xvC}}nhmo 8PJE4K0" 0r{{q[Z؈==p>md"ϑ-=D{qrťիp^$wY^ @K$܁h4j[ˑf<b5/} n ɼhMMP;Cb7m|uK/U^QtDqq1 Äa ]GvhBNX755G"_ ,۾C&B,(zuqQ:@~_bZ)dsj;&.iIENDB`event.png000066400000000000000000000020611326020644600305040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/32x32PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATX[OTW}\Q` ѴD}(MۤMcSA" os_?`jADkHƪ(M^fh0w`ƌu ᅕe_RmKolz->O&R*}Ee۽h'(PJ~l%T%RJσPo&D>ߞC)Eqfv395a:|1߸Fsc3boflU; v|x ie/B CrvVxes wǏ,+]ea&btt躑esl]ǿ ˲4OQR_`6ޒVF}I7~iY;4Mt\J^Z΂3iu]} ׮be8,;. m+6fgg G”PW[GiI)/' \U̧ "L ySSTT)@)>m;\|rv2==M8QTX[zbgEpa<bY#|B%,& F /#ٶmKd8k,^/ݾ T^+(,,"2ffff!RJ)}bb?S$q>RJ 0>@ "%0Rxͷr,˾  !f<TRʳByԝ_< 0X@,ع8Wn =g `: !4^1O\\)F5Zm-vIENDB`invisible.png000066400000000000000000000037271326020644600313610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/32x32PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<TIDATXWkly쮽k/zY^6 c 4M4BMHT"BZEFQ#j JTT !ccmwkwn6kz33:s~sg!> GwWy9B#1tljGG*SuM}UҰʾ gŌZTk׿8-]X yN#WvN,e=?AV2fX7Nq4rĚ-#pt7)VYdSۯ@U13SDxg ?p`X['-02kLx.S|F4UyvhIV.f*Dnu^tXAKAr#}Z\7Oi37Kʙ~s[}0Μv8J! A)z7{fXV|ӆ{* eAL0+"P;}æ<`3`C*]M S=0?=NU"`F ` ,,ȕ>8vƅY5\ !,E$>̟;SJofo<1=D`^GmRϚ]S] \K}~9~2Zf}W{jъLR7M.K֖wn3` sx=jˡ"}u;7n^?.<.4ޠh~w.D0#Sl1o,f fU6vjw,oMڙ/D,eX"٣bBE?]v;j } V"l8 )fT}vc%Rl,%Bܼ9%wD;>*RFtb+5}@Rw2 ]^]nGRKg5%aidM؊Ol 1n^o@dlt+gy+V;yv"B2>J`
[Z ~+‰PF؃U6|iRƊ'0,ÚQ9?A8tDM٤Ҥ "M&K,Q ˃u \r5S~NJO %JiM"Y(DK!x)年\suSEd.b$3!b&/[.TXT"Q]Tpd`oȐms!FD!yUFܻ3sJVK*Up*nUN!D8OezZO\BOgDv$K#㿶N ߿f4R/: ߾Ahd鱩`VȖ =Kq@s'J fwŭs(,$I'._ϋk:[ȓv)@)[͝uJuz 6Z)شBXR@@jN^J "l:[nT i&A!kpeaffq4MضW%NL "H$ "=u*&uEoyi"NRN||<Lm+$xOX:V}v~~Cz#lթ+E7ݟ8{Z`6L_*Iet?|>_XXC>Eo~^էg=_s\D^hW prp8YTK-Ӡ[|^g^._}m+ BSl۾ s&!ZKԍ֯OR8@RUJW%@rFStvvsss|fFtD0uwa>}9˒2 VXb:pv 8bL_\BѩҒ]zQݽDP"Jٮ @Ad4}SvUu m#X١:v1'˦옗(7,k KлdBBIENDB`muc_inactive.png000066400000000000000000000017761326020644600320450ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/32x32PNG  IHDR szzbKGDtIME !sIDATXVAkF4,ohR C_=RC()!R989l{1!%罥? ǰ*b\[iz$&i9`x|Iݤ$A[[[_iְmSclR+I6|>BDspqMD`0QJcl,c^4J)l~ $Ip]w"U loo(Jc8Q Ifff0??GZ_]]5(v]WWW8==0m/)vCUPJj)B88AU4x\HF(LRQ&3q&$Ɩ S|yc < $T JR لI D7#@cTUE. vF*j˔DH8??gggg Ȳ|8X .Wbj^i0IeY!NG Rf|vv!mAv#J19nnndx.$IB6nw$acrpp8 b68瘚c rĒeNZF0 fYVb\ X,~M)m}}=jiqxxط,GuOTտ`gggEQUUzGJHDt:*!@u4A|m3M{q~*Ѧb~scRTg2to<3gBA¼a VeT.K^# #13 5a )\v "I&|9睂e+Kׯu\?{˷hJ_ Wz_k"lU- w]NHWSV:yY{CU076< o; &32sk L+; 8 r9IL4MQ+<~XtYunU8jl.>fK4MH$A,7@e w=8cSk(1K6o{~ F.@Jyi-AF@7v/4axv} ; =u bBn*X65IrQ$U1((ضOLɯSWD[k+lۆepq\HCthCӡ*TUE @Pח7f-4 V{VoW(=Q^^AS  0 f: =UP-Xqm y[ѧx[]&o=p@ۺV4Ѭ(Z(͜#0VE0$>?Sɢ^K&`gvm)=FV+/XbIENDB`offline.png000066400000000000000000000034361326020644600310140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/32x32PNG  IHDR szzsRGBbKGD pHYs B(xtIME9U]IDATX͗[l\Gƿ9s޳kǷ㢺&:(ڸ⭨qnN(D$ *U#LAR^TBiS' QЇ@8vk[Mn\vvn<쮽1m#OsV:s<ȧ]pԩ&˦YQJm؈]Y/k/ïQzj׊Ҙ.7|U8򩯴4dϞQ2a1,ĝ8~79wqWW HdW8RIB@)秡 J)cqhm00ZVK~һr9xJ9Xc 20JlƎ;Ԋ[ֻcaPc c 2PJA!{!g]@J )e%>$( k8ׂL0,@$(C,Ӓ[J)(UTZ+haʲ,Bynoߊ1B Uis)%,z!&F%k9 wo})JmF&e `37n~,;L =ܾ=΄О]J1?ϗ.cskNOMLfff k wCu6޽wo8<ߏQPfq1ܹXa!ĵ_C%'}{Dj_<ԡ7vo#@)g{~q dhZvuuafvּwAo:HߗmѣG211w֌\I  H@ՎLƃ1 @2D,#۷ѵm-_2ؿ~SӓH&硍!lRcj( 1zMX_KjѸBi6lA`y2lho~uGb~>6((4\ϭ"vM͸N<աss7̲DX̂m<~}a.w9sF,׏~ĎFSm]F13; 9 ,˂& L& CBX,h cc"JskW %S뒙wtmxb.1xUyA:s?x 2*W6r\q3 cE *sbk6@бݴuY1,hc`1 Fөf% ( (?oԺ9d*B^U$1 "vd|Mc[1H)!JfҿPBzvb&U[7`U}1Y׭au'u`d|~Bdsy!> @7Uw={䑭9uk"6(ڬ!FE N _ZY֗UB/RߌE?V}IENDB`online.png000066400000000000000000000034351326020644600306550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/32x32PNG  IHDR szzsRGBbKGD pHYs B(xtIME*tIDATX͗[pUWk>I iJ҂0V:0:q-bRdl}C}J[:8>0v@JGh HH${HNrn>rb4oz]exNDT"" <%zqDܵv,Lo®]%/nYx'S/-iz-u@Kw"⣬j YxwSP]F8:&#f f0͙@VDo魍+zӀ]+Qe% ¶ KNZ1ވo}jJWVkE$Jr*:qrQ'} i$F'a&ńgD(倲PJ0a7D-Fh5R9@pcD(]@۴@LߡL8J bL82"Hԓl ]`"> ~p]DGJ1}*4۳So\~/_(A0 02:r/ N|s૿u?kٲI6UWԹk?ϲ08i>l?2/숌ڱٛhDz 'xŢkx%]N;ʻ֣2ƈiASX=-A&?p:2򭽛3Tָ>Ȋo'Vu[;1fx6LqfNWH9#3k_f)ϏnNYA$8^eyryrJO!nS]br~fB8h_;R=d\Gs{kjF=6'Qe'9"*="Li>Ej'ŝw +m06aiy:ש 0n}5S0%\ppTy^}7z%RP~TuH0FE9#rU8vLVMQ< pʧIRNPAI-AVTWRd$>9ǜy [xVjB0 &on:1?m(mh1SH43-LGlc ̴%ٔ MEJi{ ˆ.cm_r,^Njxa`Vq,`iW)x#aQzױ.mMDe'-׍P#frE?/b+db}?’x8'&FgArjtMF+Q %50tEKr7 3i07g+X iL'IENDB`opened.png000066400000000000000000000003361326020644600306400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/32x32PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<[IDAT8A 0 'E|}BYoJ+C6& ]0/SM~Zք$ݳo޾ "GvAg7 %$IENDB`requested.png000066400000000000000000000040121326020644600313620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/32x32PNG  IHDR szzbKGDtIME :$bIDATXŖT?fggfgwaaWtTZ%"**%XukϦ?F[j5MckMZD[돚6HAHe+²̲VX޼ws=?/l; qr* l 9f[s۶'w*b˝R|Fvd=+n]m&+ ;Y?{IqqGQ)KxoFJCw-_4W7ojS/oEGm(=Z/"negy;ɼ7}z"a;fοA^tx* RDMԡt ;Zϼ!PtL$ı2ݲR݇RJ `;A:Ht-JP*-nea儒"/D-b4-ThRxGnDƓVC 46tP*D| 2"LN(es1M[.xso3x7BƏ(drlYtC8{o.y /g#̚&hι3&o"~qy Wӳ{7̣/_n׮]rǽn=EQ}'mޛW,ici/vDvYbK _w o޵ V.}מ5g"2OiO> Z@(eXujj1nRf0Ǚʷۏ #qXN%7]Ym8j(U Zz{v7^qb+op幖SKҘN?W>on{`jд.ƍWՆQL 3Z6HDhL2\eמ d2^}ZFG]D Ώ;/LT¨1FzZE3>53XY(a#'J۟ TKk۴{޿zl=.0ZN-Y4/N&*W YRIR^V{ $ CByGknt- bCc uر1cYmh=4i~Z  )c,[uc,Ze?"cJ-9CRL^ LNNB3#.JQ*bweHk_DM_JJ1󮏢Ϝ:x&7SN`ۑ RCqcn-:x2OR܄< 9v P]$t9!Lvh=&~[a%܉pEȾ@1ן0 ]eis~:^*6 bG`DuOsv8Yl3ldsRG1+W=(:8ri;\߷ADIyv?oC^m|[b;{IğO@iaC~tmҁWEbsYt]:Ex$ 7uuGMU%HbRv[TW64 2oU:Y{`MvzWW_6mޜ˗:'TilFP?O4<R"ZZpV$sl.yry/W&Ro xU;v$Bx߫3i"Llma]K5•l 0ȅn*EՄ7"ĄK M$(gTL&3R*}Db<& 2.L+Lfrc;冀X"A4:Qҗz` :u HP8SkԙZk'xd<Ȉ'4g%Iꤦ:`d=)r>PbZ@F> .HaƓ*3g2855xWc Ib1A*?:u@E< "6x>7dvL9_-9gNk…a2tR%y*DR>O)P, BrBx'҉aI("7bOi14WCs"+bp7FE2|櫦НKг.L Ln-0~A0~Ni)NIIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/48x48/000077500000000000000000000000001326020644600267535ustar00rootroot00000000000000offline.png000066400000000000000000000052021326020644600310230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/48x48PNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDAThYmh~}$ْ!i̘uiN\%MhkLivc_Y2 ,ll:k% 6]I'iNu[^ɒWǽg?^I3ýsϹ<_km_XnnnRvYW؝Jk ' ZY$! 93MCCZc_~̝Xؿcmᮮ-|!X "C3 ̙!G=Kw ۷Q٥]7EQ<$$P̬9tj=Ck=5m@*5 n(\+u4D[ծ*ܲ[LA#>j38L uuO?w}=m $@0" As09<4jXs9]"@)̟ ]DSS隺}5VOȮp$s$<0/:?p\HZqmU IB:;|':*BxP$I[ Uy@ѕc S!T`YPTej3$)%R@TH!UTe#N1:fOǬ@0* *ɕ 칳+~fvT:5zG!>+&.yDvmB9经ewֿF}}vLbr9MVmiW_}9u]1~$H>IPOfsY(e _$ׇS{duPݳ?{쑟+x:7?3F>V"BG&}Rlǃ(ŷ7{؎ɉJhI"躁h$h#.\>eO<·b%4+zw K#mp2UhbrQ(:p98v=qz]tə$֯K}χ~w}sD"l[x<ʩo=ƾ>erR$gee BK$~"I MXH!uU6\$&J{alåKޑwyI$-y@Ƿm`G'<Ǘp\mmB_gC8s.W2f} AwՎL6]-_&Q؟ǯbÆN50|Onv>dI c*Z\WDs``D4FNף Lsb/8W`:tMtvt_رB1vD^-X3onV HA GUUADp]EBv6uՆFbQWW۱`jzal쒔Rs$q?[!'b]7 q .xMjr"MfQEP /r+ӂEJ$Hn0A 𫧔ρ\|*R];iV<5B e4|7Zs q2 xB^N&-]7@5H$4UE6cZRBxj~$G=] zQU&B%BQM$k@EHfL\H˂/Y  "f5`Q PUP%)W1)XMnƘR"(8?6tzh[OOomv]A !%H ` c@S( #~@dI hԺ"N+KW.(S'DZZZC UӠ**8UDf:+d1|a )~rhQZO%,nxXQ}/buu]F@V9o$ B@I:6PNE\ap:9{@q(M(/i9cU=z`S \_+zMnBܗY5j[JjtOVsf@ _oFIENDB`online.png000066400000000000000000000053131326020644600306700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/dcraven/48x48PNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< HIDAThm\yϽwy76a1l0AAE؈R$ R)$ _T|AQHR4BJڤ*iRiZ6xbYkkܹo釙ήFJ9ңsj9sψY-`W~͹7 lGvaR'9Fɶ߱꺇^IM2~Pį~j,Y^= D兵7^_IEa^(h8WblUfֻ[v|ͯ%x GMmOO?7떺KNb3][+;EqX#VMJ&o[g:>'w;:7|%'][XD҈0ib5:3 l_6+n z7<"8uFI^Y6MtjLr!2>$O!Mc$D KѰ*)#XJDL ꦪ(&#X*emSkE<(U@,HPSCV/@ #V Q٥hXReuG5b4&BF?I*P&.UeW{[QI LbI4n@iT0oF %nܻ+|szTT'MW*La6Iʨ ?=p/kp_ɆMPS pC>?^_' ݅vzԿ Q='X#/+NhzT_V̓+O=#xw :Z:]عMۥT9Igm<4OoEy;!"ljѷLOD1;?~<^1svoxq̅Q%Q @8!,cMUG45 ~s}osC(G5,1o?4JDeR<$ZupU3TiRz+g*7YsNqNDHAjHIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/000077500000000000000000000000001326020644600256375ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/16x16/000077500000000000000000000000001326020644600264245ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/16x16/away.png000066400000000000000000000010371326020644600300740ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME 7UBIDATxڵ=HawIFbA=IYE**`AXJqpk)-t @(P/E1 YD-X&i*jL.oF3:wz@m"^҄B{0>:l`tz݅(uFC*s#<Mf2nΞMϑΨ|筄Y:S<- ~%.y;0樬pQr;7& %8=O޾~;ٌ2BDRUU3$l6K4BSu‘coc1ގrGG'84/*qwx_;$n[lmoX=gg/:wԡnpY|yiLfo[xQ6JUgwIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/16x16/chat.png000066400000000000000000000010541326020644600300510ustar00rootroot00000000000000PNG  IHDRabKGDIDATxՒ?KQVZq' O.M*t.n!a|As!\uf7N%9pxp=}0m~Qmp i%Ik NNWUe\EQ(seY4M$It477:]`$B MSV///5e^WQʲLPOOOr\~=<<,ET*ʲ,--9(I("c}B- B,..{`*1ưFDYv*QaZ;^O-8_[x||lbHbkkkB9F`TmB23Egmm$I>e( 8F{sqpp|0zZ-(GW|N~7&r_GIENDB`closed.png000066400000000000000000000002541326020644600303250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/16x16PNG  IHDR w&bKGD pHYs  tIME)'C_9IDATӭ wQz"JM ]-EP ^Q*1IENDB`connecting.gif000066400000000000000000000017411326020644600311660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/16x16GIF89a{   " ;8-hcPYgvrvyo{mu~y~V~_mİiΡúѿ|حԷtuǹٵƺټܽվ߷! NETSCAPE2.0!Created with The GIMP! ,q!0_I%fkZH:- Wkw L<3)QZ+( B>@HLKPD49?AJ".ɵ'*ѵmzb6ׂ uxO 삁! ,{,=dS1,joccT;[ngssgM5X^tqqt^FG]irpv\N#EYeh`U 8CVR/2$&lya7܃ * uxO ! , l!0_I%!fkZH:- Wkw L<3)QZ+( B>@HLKPD49?AJ".'*˃mzb6т uxO ܄! ,{,=dS1,joccT;[ngssgM5X^tqqt^FG]irpv\N#EYeh`U 8CVR/2$&lya7܃ * uxO ;gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/16x16/dnd.png000066400000000000000000000007161326020644600277030ustar00rootroot00000000000000PNG  IHDRaIDAT8˵K[Q?U ڱ]D8H.ҡsHK38RUqpDhڡ!R!$;.و~N|{@Π#.L e#`:U4wFI<~{'݊btEGWh"+H+gkQ%J;mN4{o(+ p{<AF\l`Po2.BDDAg/tD>$>e3\BS>_/滎-`Xy=۩Ԛ4&  e$'HϪOtA5*(R|_6?.g$jR)-̳#7 y UK8;h%IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/16x16/error.png000066400000000000000000000010241326020644600302600ustar00rootroot00000000000000PNG  IHDRaIDAT8Œ1kq7IXI6KE쮎VQgѥD*J8UKՒJJM6}$6.7wx8z Nb^QDG@  )V (N&t.s _XyEwA +ŶPRWȌߠWH̅P4\Y[x=G#j.nHx]&LJ|.q"$/?g@6K(&?S|&%Rr*bj4+00ߧXa-pbbt6BR%kNO.v2)' r㩯*IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/16x16/event.gif000066400000000000000000000052441326020644600302410ustar00rootroot00000000000000GIF89aD 77::nfXrlZ==@@BB~tdxdxfyfGG}h~jkIIlos²ijĴŵВɹɺә¿Ͽ֢ףžĠڪʣΨح۳޲߳! NETSCAPE2.0!Created with The GIMP! ,BB >90Tzd K!922T(L#΍k3RhuFޠT5h"u2*N4Nɽ;ъZAd4t_8nP7+5SVWb1l ׾/R>ɩiMGA,f#O6\DQx,h7C_DwZ!^kJ_xI_XH1=s`^,vdN'ZQF"1޵-(p,gj63wxn-#}Ď!Jt)D"fPlwy'LtyY*@ Aj*v]eY>o{vA&#2>|> і"&Poiv7nO-IENDB`muc_active.png000066400000000000000000000011201326020644600311640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8kA?n6b^ ؓzڛR(7ɮir Z')ƃHK@E$ŐvgymI }0a}ߙQ"I(ˮz@*}Dddz'1fvyaL﷛F[@vX)#B'A6nR?lc!Jc*K.ݛ$.\.s;DSz@gD$׾KEeȵc Q]?ڭVy EnYfFenS.ozÐ ,.eRZyŭ2,˞ΕJ6ŢX,~\J%ۭ ð#c b";Ft:U$yZ8gY|nZfp8TE;i4;j{ދW zNjz7L6)`HD$>t:7|_kWZo=N dg=m1缚mo l)IENDB`not_in_roster.png000066400000000000000000000013671326020644600317460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/16x16PNG  IHDRabKGD pHYs  tIME 6eDtEXtCommentMenu-sized icon ========== (c) 2003 Jakub 'jimmac' Steiner, http://jimmac.musichall.cz created with the GIMP, http://www.gimp.orggGIDATxڥkSQwf$ZbېBk+ŕ]\W @t!n]Bp#"FED(U5ƒ4sq__Ru>sΙ3הgOYZ,j5yo =DVmx$K&zky*01 R>{U8xx/W.B ށ *J\¹i&bf64TQu;E:΅&Jƞ}lQ,h[D @^ Fdžqf[ { >mʡ#{!=a0;B,;sJd D= "6*pZV%]^ώa&! 6j?t''xrfwNKpu#`R"c =HIGA?r /Ȥwa?o(VmP3;?٦_?Vd9AIENDB`offline.png000066400000000000000000000007731326020644600305040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/16x16PNG  IHDRabKGDIDATxڥOKA&jŞz P-P "BO`S'HAbKkKac5fK%6k x/<o<otq[Bk '|j{g>T&K&PA| 8:gJqԗ^89eja2T& y\^^Nu^&_a1 鳁j%R+{Eq/R$$ uLn378kMtIENDB`online.png000066400000000000000000000011221326020644600303330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/16x16PNG  IHDRagAMA abKGD pHYs  IDAT8˵kQ̼wjXЅ nBq6Ņ?@UY[]\Y vU+VmREj6jmfB13\![ǹ?JsҶy2ۦ|?@+eؖNNSiiZ־{olK'NPihSOFN)H3ց`V=)lF\:^!IwE231,>U9.]իo9i   fC}6RLO2!`CE dPUa@U7blYYt}DЌ'/9efVp#?H[98ԗᑘ^-pyWn~yx8;nchm(aѰ%d~lU-V-*N91=>GG948DANe㵛4YvoϱS)l.er߻rzϙ^y"! @km(ZfN7ڇKܨ8i9x% RJLdvv &''IRH)Rq8s3ʖZ+jdH$!B>FR" vm(J = J)l& @)n3.G722P2.Xa﫶TĭR&|766k7@V+/ yឮ^wˬ,-wWD U:r>l=UEӺIګIo0= o~Yn{߼t=9 >uӔ6nr5ā`%w|੭J.ߔJ"P?/2#G|IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/16x16/xa.png000066400000000000000000000011661326020644600275460ustar00rootroot00000000000000PNG  IHDRa=IDAT8˵OHq?{m4ܬ C"1AJEl$(`jѡ\XRhFAY@?ngWO|[Y @ 0SӧlhMLad:."@Kk:Ib!Ͻ; Y~UP '?Bf>G<Viao7(/3f^c{-X-&:ݶ&䤣@yb80d3W/Wq8Kz{x|pw1oo D*'ErU8(Ƈ %*dag Ye!-MRgЁG%S'bqTEA%;%X]]RL&E*EQD$b~~^1vËd3hYZ|}&sQ FKN fQ*`kUDP(ra; h3 z4McqqI~OWWZ)2θyIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/32x32/000077500000000000000000000000001326020644600264205ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/32x32/away.png000066400000000000000000000036571326020644600301020ustar00rootroot00000000000000PNG  IHDR szzvIDATXåm\U9wyiⶕRq4lLBHL$ZBbKDhbP ICWY``+KKK]Z}?In29s޽l8!DJS5<}зuK̙Ӫ^ +KA-mw01ŁRT&mBǑو##ju+n$PF1 <،,XU amdžR X0 ԅJT#ì5ѱNc !QN^zCfGԗh`M!r֫z&&o/%Q[H_-){^ܜhrtܐpes2vEʜmkmHhS{;}LH2a CÃC^ IirsoGȏ>EDp.o aUTWꆮ J)wm߁- ] dh{ӣ "T4p)egϞŏ#_| 3a@2nғzv{ry `ÆntR f*U.V[zpp< 0~g0]0Sq&ytvvk5_ (>L)dPh$P(Jm!t Z (ĩu4׌gr^}s.7/ݰ{}w7ZP>@TPJȿH)zLmmm?8mA(0b`vN)0@ބ=o-3C1w .|zjP˲}}_ d-q^K\/^\+_D#ٳgnrr. ⺮h)4-˒J"'OC)>WT*r⺮A Zkq]WqĶm,KժT*Y^^r,rYJj5V⺮x'KP'N,L0E&[(PJ m} iT-[pq @DH&:uOk}̙3p:9?VED #VܰX,J>%yT{lۖ)kddC]0ZZZ<|޽{8"B,CD"aZkKOOOFp)iR;|b'R?d2}}}|~vHc\.8C^o(A Lfh-XN֭[v3ßmmmtiI}122xo9#@رt 庮(nu]\ɬFD8$I8DU@dIAb_p V:::Zc6ZM6yf re$h˲(F|f'L xQ#mۦ\.~*ttt0::J^kP5eɃj n^D<99n* R 4 T*ž}fwE<}Tݸq EAWn_~[nI$"\.68i6E婩Y#h fo߰aCjF7Dz, NH$XYYɓ' @G*z!355\zu^kGUmm۶/^7lskNL4NԯMlV]&_/KF @Z ]|zF8rٳg3dK\ZWWOMv"Ql:^S(۟]tr֖fk ߸qT__[m+cX,f<}8#RSJ٥Rr+333\2 >>ܯ+Jpȑ;wNZZZǏi599gffVs}Z/c`X -:V"o~e d>W*Sqy7W^j-FXx@=䀹tW£rx|*ckɛ\L"&‹95fԒ/5%IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/32x32/dnd.png000066400000000000000000000031251326020644600276740ustar00rootroot00000000000000PNG  IHDR szzIDATXí[l]Gͷ:q(4HEιY}sfϚ5sR˙8@ ,.3RclWs@>:T2ɫ5Wbs1Nδb:p>B~ys?z{W⢔>(`ꅗls@Hw"=px<7=9h󩧾 Ƥ;AD7 ?|pޚjx- ]/px,}Uc-|*f !r`̞00'E0$H;?{&'lZiVcDcVlw6նA5s?佞ndlz|br((m;iZMC=GJAp堵<t5|+23W"\][[k yx<2-$›xNMĞDgˆJFDT(V"J_s}@ 'g?gZJ#>-`6Sa} _<{''4>P1"0j"Ģ yu%տP)9 `(UW\v5Em?vLm,>@?/--G;9[WfQ*xuچ fy~5k0*P՗ -fTi}ި"VԨ%^ׄHw#a`f~ώRVq*ƘOI QD{F9 r OpuǺEsEv焦=zFhvۤyk~-kzYyQb{^K7jYyx;μ_}11[ {섥3F.q,p) w+ЮӃ5֘&n/ H6kpNi\옉U_)LSE~;X׳3B`B.WRSO%\JU_KF)yu^Y9 _۟|D0MDPkhjDȢp9N?wug[|Q.^3aWΐD$Io]%4w;݊f+_| '}Zuf$)Etĉ){ʻ3ʭ 'c`d+,,+;%yTwz=ſr}aK \i]x7L7s3qA(g\J'n;>:WS?W\8Mm"Qc(jS-S(,C34+AW4g><9yЖ'I*^Ep=lމ\_6pz9bi@/fGGGO;vL9b:Yə; d@_Fo)1A&;iK._.{(.IENDB`muc_active.png000066400000000000000000000020331326020644600311640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/32x32PNG  IHDR szzbKGDtIME !sIDATX_hSWǿ?ƴ)@AX_XA&:Ht/*%1= BY D02(yrL, ,q611'瞳MڤY sw~oH#FCCC\.5pjsyw8yXoo`0JiSNR}1 ?sֺ `@C@)Ϋ2{Rc _-'ccc<^ ?>߿f4R/: ߾Ahd鱩`VȖ =Kq@s'J fwŭs(,$I'._ϋk:[ȓv)@)[͝uJuz 6Z)شBXR@@jN^J "l:[nT i&A!kpeaffq4MضW%NL "H$ "=u*&uEoyi"NRN||<Lm+$xOX:V}v~~Cz#lթ+E7ݟ8{Z`6L_*Iet?|>_XXC>Eo~^էg=_s\D^hW prp8YTK-Ӡ[|^g^._}m+ BSl۾ s&!ZKԍ֯OR8@RUJW%@rFStvvsss|fFtD0uwa>}9˒2 VXb:pv 8bL_\BѩҒ]zQݽDP"Jٮ @Ad4}SvUu m#X١:v1'˦옗(7,k KлdBBIENDB`muc_inactive.png000066400000000000000000000017761326020644600315300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/32x32PNG  IHDR szzbKGDtIME !sIDATXVAkF4,ohR C_=RC()!R989l{1!%罥? ǰ*b\[iz$&i9`x|Iݤ$A[[[_iְmSclR+I6|>BDspqMD`0QJcl,c^4J)l~ $Ip]w"U loo(Jc8Q Ifff0??GZ_]]5(v]WWW8==0m/)vCUPJj)B88AU4x\HF(LRQ&3q&$Ɩ S|yc < $T JR لI D7#@cTUE. vF*j˔DH8??gggg Ȳ|8X .Wbj^i0IeY!NG Rf|vv!mAv#J19nnndx.$IB6nw$acrpp8 b68瘚c rĒeNZF0 fYVb\ X,~M)m}}=jiqxxط,GuOTտ`gggEQUUzGJHDt:*!@u4A|m3M{q~*Ѧb~scRTg2to<3gBA¼a VeT.K^# # |(~"i#mjB1i&)%35IS$;s޹ˇϾd4Ǩ0{r}ް16w꿕u{Ml7𞌐(^Oaki{zcnv驫_ ϣz%1c$P%d Y>Ǘ{˓3/qw)Rm#^W.s M!ҽ `tM*%R1`x p Y/cbbòҎiX302\&YAzqwKE21egvqǮa P*Ze|"SsDh^۶B)6np] @`), GNCƮ;W_gD|Ɵq4kT<A DA".B!Ѓc-4,Di_@EQXZ㹣/3?_嗿xG϶;pp?Յ9ˍVBUSE4p/'9~_@B=";wgm,,Γ$Tv .hY"f`Ƃ85 # M @U3caR*fˈ`5 H4/uR$Jyq,')O,Ȼpx[dnVlg]" bUk%M3"qjo=oIR9<@Exwt3sm|&" "?qk3q&;ȅTܯ+ޥ=kɉ0X\!.( U?GL鐕PD= @+ch[KR%bQ Yٿ;nޯri%͆SMI׫ o{3#jU4Mʈ׾Kޕ"g!Sw'qg//xقdÔb`i%MqıУmi?O0fGX{t^˭JQ y-CzvkՠYq}/T}0k+sB0Aύ<0kWR_a妫JXڡii4Ҋ ɦTN٧Gɳn~8WTҊ+!k@^1ͻePKH1'/R[26/zI}Qb(lڨTIrB:/bzzfX5ؾeJ$CZ]zT!Q,[_L?b $ID6RDmdGdrpC[vz,Q"AQs/mIRN/BMM XkO9n7UUU|`u3Jˬ+ߏҔQc.n$iZVtaI$R )Q,¯X˰GXa5> R-3 BEVzrpC P*]ccWR*oK;)´> nܹ񴽶r @ȍ'wj{)^.^ÇMwBss B @g$B[[ nZ[[>iI tϞ=9L"YbR C`lpr#c 覤Nd8a(n e)xk2l{9߿@(zBc@0<<8/t)<y)׾~}IENDB`online.png000066400000000000000000000031701326020644600303340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/32x32PNG  IHDR szz?IDATXíkl\G9gڻ ₠iVVmCEA6*@H !J !DAMmᢴՋҴ-'8^vv;ko;ޘ4:::3EkM E!W= qmAw~&_ .U@9ȓe0]xR^<՜TJ%{h}v%c/} Gl쏜xOK_k,&(E1A^L(:ȉR^sȳޜ]kW]bd3|n ;{ajAx䝃_ɈU1:}nYyAFڞ/{X{(<lr֒/~]M AҪLO8B2~`f⹊MAfV\=sۍp.se+c;'(@"1J9,# t]ޮ/v";P dJ9(%jZW;oSN  )*bGbl]qvҠFqWlRĮSBz`}R ^a1~n\#biH"."=ʈ㮕U( 0z+b @M2([ibiÕM("F0J+6MUb@%  %# Fj@ ARRuh+]П @|_14`A]32,@ɲ'Oa87FA)0fcD0@(bLlf%33@٢B)(tzٹ/uo9U5e ,p=?;eUbY<9uq7؆XjChG)bhQ M0l;Z~Hj&\넒Ύб-#`ru]V?{@ c(նt~?;5/'|AZ@ө GPɹa%s@V5=Ugp'ʉ96`m e Ծ8y'p_OS:OZt!\*>gॣOLLuy߻F\a2D9鳧8I.V] f ݻ_8r S2H:#IK;K bNMIiRYRsn|eבHlbcfUfSfKTN~:H룷;5QNsnzljJ-{w~OCBru IRϫ='@[+Sү&ΑO:-SKr|?uïfm.*`0 :n'9ԧ2~2~h#ŹP ܝH$^߿J4~ |Ԏ 9  ,زBF43jko4$IENDB`requested.png000066400000000000000000000043671326020644600310620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/32x32PNG  IHDR szzbKGDCIDATxo?wfvgwk?$*5MUӨQ*A%^*!RR_iF!)cb^zg̯;]MG:{9GshsK(Z[d>jӆ[l Cez@DhFt u7MM(B@E}=2 bQC80 #ӏٙ" Ck(-a@x> @ra!kUo֪kS q#*z-a|4kld@J<43UVQJ3MNiKH!*LenR-l W(VbnqړGsj3 xӌIf]_*iDO/m-ltd2I$J(/尦>' sԖ\ KV.4~Œm;O v$7oH lkAՏjF,[ )% aDHmmDRΞaR-%ɨA;ۍRjdemRSNO2<<({allfF14JАJ"=BB#eMBok{eddd2ɉ'tڥDJZ3 Mm Cs ]N QUk{Y}saYǏ_=zr+ v8wJC)?D1~@ \!H)%cA)X͛7)9]5v]bʀq__o(&qbF5j!R /c4af@ІI)i44O4`F(bZ!O8!XW`pp۷.ccc|'tttpauZvZvZjΕrc7*L-I%le& Cb###a˗9s BcǎSOm!> l'4u?Pg]9?\8JqC2u_^I3:s92 {g]sgERg(_bR'hZR|;ǂPv]y;eF6 [r (wF ㏔?71SWu'ׁVOw3t.28Xj o>4M05pfj? *`b@Ñ7qznoK Ke;R>:;;WqE;;;e۶m߿x<4M2z/*.3mW xƀPǕOLI;CT5ޙqy&''= C Mc{/1kULNb Pj82JRJi  ۷id2N<Ʌ 9rd<n9 Wk˕pρPlޖ̪⇷"j v"f2Oj5LdttD"AOO<7 h֙y4y-UԢӬ.TRuxoT-hry}%`:tÇc&X ],L[UlzR.Uw=?E8FY%di;unef硳3ZtwwH$HxgGӋ\[.Sؘ7_ܐiV tuyM%ut*Q[w]HRD"t(\Au,ҲZJӹ@m=K @(jpO^N'bl׎D͓M̮ڷD7p2r`1]JiTwiU| ܊Rk /t2z4鎡趮.w)5LLkv)ޯ`\jģ;m$s'۴+;hJSyWKfm,sM[tU_9oKwD4^!TRyUʭ ~SS PJA-[ᗁV~գ6h}װcIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/32x32/xa.png000066400000000000000000000044131326020644600275400ustar00rootroot00000000000000PNG  IHDR szzIDATXÝW}lU=9~ޖ*jAt*:eɤs.KY)iMdl3pS)0X^[(sϹ>XJݛ}~=}[Tb*LV:fyr4bZ"u_Ԑ+**/Λ_{Ѣo"t fD)"rlF4}*s֬ԱC<p|(Rlii^53q>HD7ׅ[s#[,Ӵ\~vimw=: 6mj]t) a` @za(08bȗG g"do2,/*!c (nصjgɑ4i/ڷ[V ND;mg]xD+`׆8_,n<Z;ʠ^-<ʌ 4ઘLW_?Џ:("0 BrXg *!N#g PO608KsVSО5֭{;:d=reC.Nq PU9#/W:::68xZa>ZZZ}v$xk>>tΉbh(U2_h01k5`f~eBshd,'X,y{^5?1 qCД xdmy\ƾ}5YCb0M̌;w⮕|ԙ uhhsU^sRJ>ݗ`x:ԟw6^MDϮ]W/\cci>|k֬Accx<ޕH$ ضm[cW_8N,3o޼g2t;L&s&̀Ӯ0fԔaIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/48x48/000077500000000000000000000000001326020644600264365ustar00rootroot00000000000000offline.png000066400000000000000000000014721326020644600305130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/48x48PNG  IHDR szzIDATXKOQ3s)Q*X4$Fƍ&ldʕ ~MWBiHMA mR:BMM XkO9n7UUU|`u3Jˬ+ߏҔQc.n$iZVtaI$R )Q,¯X˰GXa5> R-3 BEVzrpC P*]ccWR*oK;)´> nܹ񴽶r @ȍ'wj{)^.^ÇMwBss B @g$B[[ nZ[[>iI tϞ=9L"YbR C`lpr#c 覤Nd8a(n e)xk2l{9߿@(zBc@0<<8/t)<y)׾~}IENDB`online.png000066400000000000000000000031701326020644600303520ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gnome/48x48PNG  IHDR szz?IDATXíkl\G9gڻ ₠iVVmCEA6*@H !J !DAMmᢴՋҴ-'8^vv;ko;ޘ4:::3EkM E!W= qmAw~&_ .U@9ȓe0]xR^<՜TJ%{h}v%c/} Gl쏜xOK_k,&(E1A^L(:ȉR^sȳޜ]kW]bd3|n ;{ajAx䝃_ɈU1:}nYyAFڞ/{X{(<lr֒/~]M AҪLO8B2~`f⹊MAfV\=sۍp.se+c;'(@"1J9,# t]ޮ/v";P dJ9(%jZW;oSN  )*bGbl]qvҠFqWlRĮSBz`}R ^a1~n\#biH"."=ʈ㮕U( 0z+b @M2([ibiÕM("F0J+6MUb@%  %# Fj@ ARRuh+]П @|_14`A]32,@ɲ'Oa87FA)0fcD0@(bLlf%33@٢B)(tzٹ/uo9U5e ,p=?;eUbY<9uq7؆XjChG)bhQ M0l;Z~Hj&\넒Ύб-#`ru]V?{@ c(նt~?;5/'|AZ@ө GPɹa%s@V5=Ugp'ʉ96`m e Ծ8y'p_OS:OZt!\*>gॣOLLuy߻F\a2D9鳧8I.V] f ݻ_8r S2H:#IK;K bNMIiRYRsn|eבHlbcfUfSfKTN~:H룷;5QNsnzljJ-{w~OCBru IRϫ='@[+Sү&ΑO:-SKr|?uïfm.*`0 :n'9ԧ2~2~h#ŹP ܝH$^߿J4~ |Ԏ 9  ,زBF43jko4$IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/000077500000000000000000000000001326020644600260165ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/16x16/000077500000000000000000000000001326020644600266035ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/16x16/away.png000066400000000000000000000006461326020644600302600ustar00rootroot00000000000000PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<8IDAT8œJA"!je RT:`Jח+@R-`(6Br%&K@"802췬QUH%T6e˅ 9cA3兜cɧ(('`mlFo\ {eN#^ ϴyd2=La^Tz> `|&Glt  df <eg Q܎L?@)M4m} CseIvc{ XQI MiCZUxFg8qLgճ5 v&~Q>(IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/16x16/chat.png000066400000000000000000000006271326020644600302350ustar00rootroot00000000000000PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<)IDAT8ՓJQ+m@Q_`)i^AQDP-=;xp03̙{052/~CU`qBġ&%1E-7D񀸣A^|< <0 -g1J""*KƬV>^懙~Rj\[LX;_Cg -cCP5|+*'iHA:h5+D;c2ߊEzy Y·J ` Cۓ-Q15XJtOi1T$O67T>0cOGɋPxV^b*٥_٣%XJG?{O1W"+IENDB`connecting.png000066400000000000000000000010171326020644600313600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/16x16PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8ՓAH_71H(".@P,ƌ"уd1 s!uR f_sƒ^^9/v{x Id :H@̰^r%X#I}MUVsvG50uĜMfIUy:j?^TU2_~Իkg W59cPtf*N "ΒXv Vc43y5J4]̳t@?KL.7>RC65U#oK>qswC##_5;Q0@`J 7ث R +M 729_M5j9IIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/16x16/dnd.png000066400000000000000000000006431326020644600300610ustar00rootroot00000000000000PNG  IHDRabKGDC pHYs  tIMEm}0IDAT8Փ1KAߙȁ  VM> ,,iLo+-$A,-RaM;;3wULy#<P<׋ NXeGv&Eӣ^ʃJe|t䖨‘DϳИU!T!di^2WpS=p 0N~5rܙi݆qP`D KO՚:<}R+cq5^Ù9c w&y"Jka,XWMXJyda; X8̏E%_b:>l4&e "}CN]I4;iwrv#atA)B= Md^9 #> Lv…`!,&j, A"R^+"GZk \vC#m""^-Ֆbp) R/ 'M͟uoM5j'^8Vz?}-- {A =˞cPP}s,w ˩zE=Ν nKg!i3JIENDB`event.png000066400000000000000000000006541326020644600303600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/16x16PNG  IHDRabKGDC pHYs  tIME 5T 9IDAT8ՓJA`iS,0k!>`1XJ !xو\$kH ڤ)1Hc p B }i%,AŌÛ$)"\ehGn:<;%$7Vs蠏)anmZ G_°]$>qFP:Tc^Ne[kG{ay}b~awu CsJUB,c&KWv%-L?ڜIENDB`invisible.png000066400000000000000000000006031326020644600312150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/16x16PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8œJ@gAlRRɛXXViaG*`*lٝ\c 9afYuk+a0ݗey&8ZoZk wEQl[kh?\Zk0|y.3f_h'f Ƙi۶>ysu].|;DDT.8b "2_ [D#" "(`+v 0SO4}@$R#?IqeqL [ԭدIENDB`muc_active.png000066400000000000000000000011201326020644600313430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8kA?n6b^ ؓzڛR(7ɮir Z')ƃHK@E$ŐvgymI }0a}ߙQ"I(ˮz@*}Dddz'1fvyaL﷛F[@vX)#B'A6nR?lc!Jc*K.ݛ$.\.s;DSz@gD$׾KEeȵc Q]?ڭVy EnYfFenS.ozÐ ,.eRZyŭ2,˞ΕJ6ŢX,~\J%ۭ ð#c b";Ft:U$yZ8gY|nZfp8TE;i4;j{ދW zNjz7L6)`HD$>t:7|_kWZo=N dg=m1缚mo l)IENDB`not_in_roster.png000066400000000000000000000006031326020644600321150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/16x16PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8œJ@疓X //`y!EH`'()ˮ Yw9e'9Z'ZL}4MeY^ !y 6˲zg ܱ@}, @J4l`Bޣ(-ۂRj3qZ_ѵ`9۶t]̡WWHd(yTUV@D>'JDJP"8Oysk/H ziIENDB`offline.png000066400000000000000000000007321326020644600306560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/16x16PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<lIDAT8œKBQƿ/1pBZz('XC:.M7(ݣy=@Ag:ncNYk^6l6mWNy-˺-Jݍ8vz`}5 3姕nws4u9GRjRL"u"K)fL&H$0L@D;z%ObZ-8,$ "ID "!eYDXi ( Bqy_Vu1ǙL"i!0^hxK|s0zx=h{IENDB`online.png000066400000000000000000000005431326020644600305200ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/16x16PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8ՓJCADϕlml@$?@A{Xigco XHD(؍*6. 5IVrE@%64 [\k[nI,.9O#/1bȀ>z+h:Ԙs 쩮x#Z8j8"cWLh2+G2`><⣦"+ZJHdt8td!pω.4--v vnl"Eot㧗u|=IENDB`opened.png000066400000000000000000000006241326020644600305060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/16x16PNG  IHDR 2ϽbKGD pHYs  tIME/+2!IDAT]+q?/_70YdH~MQJ[ ɤ &(] eȯ^=} *Ll7' =٣vIENDB`requested.png000066400000000000000000000007571326020644600312440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/16x16PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8œkZaϋyqHq08P^8IbyuQ\ui{0.8hꠓDRCBH w<)nn$y{D ٦ؼAV;3LEQ~N3j+B^7|~J`&bA<+ SIR@)۶`Y\=Z:Z$H"#`:lu]|@)u^&R˲P(0zpԕ%&"? t;hZFfk ^ݚo"n1kd>j "$H^f eӻy_t?IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/16x16/xa.png000066400000000000000000000006261326020644600277250ustar00rootroot00000000000000PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<(IDAT8œ1KA B6وb X-N6֊iYXdGgKwD4ogfaWLi%_x[< 8ta 75+"ˀ^ h- =K}5eL6pUR;4 YQ'v`(\*0v ۝z}vXncf¹I &S'ND#k b_-zrp DN,<'B0Ӵ87@K) ch8xp})\o)@IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/32x32/000077500000000000000000000000001326020644600265775ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/32x32/away.png000066400000000000000000000013411326020644600302450ustar00rootroot00000000000000PNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<sIDATXkQ?oӴ=imhՋ^ -^<ODQ(Bf_KRTФdffw ^20,}oyU09T@jo^c0([}|fcr] Zzm300nr1cT\6wӰPně[e߭^uWyBW[ fڌeLVsmCw:%|}nIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/32x32/chat.png000066400000000000000000000012611326020644600302240ustar00rootroot00000000000000PNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<CIDATX?hArHEID0b!hc)F( VbJMhFbbb!,* D!=ٽg;{in`|{{of$޻r' I?>zy+{"v3uu'Jy"%F8 l]1*2qЮ:-K\qսW9!dA|{,Y.9G4%"  չQr8hUc.{{JJ8ngSՀ}78SUkv]B جV@sF*Nb+ah(F"zZ* S-a3$x=bě#UI0@#\)4&e,ѻy?#pk4xF[.:_i. yoFpYamU)dʷޫ)!ftSDYcRcЌph®rTu9 ;׋H7Dr"1s%vpc[qPOtG'ܸt$1Vp Tr2;W9 Cw`U#TߓB򤐎s&oDЋ9baiXPC-PRRg"C{q]/%߄Пѥk!珥`Dx6:P}~ݮ5%5Hɋ$оdJQ*/n$w IӕZXz++n&QIVSoM hHLOYafmVmCwIENDB`connecting.png000066400000000000000000000022461326020644600313610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/32x32PNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<8IDATX[lTU3g ,J5(L`DZ#QHxF%*A HRTSI[m-DЂ%R(9shg߇)$6ҕ짽׿eC7<75z@0H A ZiC~F7phO7 ,rps/|ȑG+lZr%DFyhۭn%^4fE-ՙQ}e2[E n^8Oe]e9 ]mܨiStixZK'*% dG c\lQ}}XO/2Y&dR""(ї7$mtJ&_: 7#pyPᰫˤT^G-ZpL[s)S>XQ^-V)9/Iz]2X;nS'WH>9+B֎3IMA3vH>Z<|(N,F0 kl\ Xxl=FMŨ Mɥ!gc X@t1 [e':b@_TrtY}: `,L)q\d"ݖ,Z;|~6",Cz - ҥ~@Kz-&L",3ϤҾwvUVWP4g6yxOVʲ86~VU?ȶ%IuuڹPl-Vx&!.X!+eaUTg!(s֧jj$IjݺkҚ5*_ f#].xrb媬Q/dRzk )B6Lt7ͭ J&-ߛ.fMքJ>|h ֳ*[h T(rC;jڶf3*LRЉo' c; bדɸ6eŽ(˹H$ohJ8˕$!ħΥgd}6zJ1Z*7NNx}٦w^x}?|ee5{Ur6u@`qmbsS$Z˕H6аƘ AD#Ȑ{cV_Xqpac18O{Eywxk8yG"RWF;#?:aԞSj7CQ$O?V,#[w@^A^Z2Ri*@6/^#SriILo1݇ChCmGh}w1mDk3Ҍ9W8!Ҽr?W=?֣F+;OiBhyJȻ䅦?e@`F~(F+R )+p1E3pĻ{Y73C*t#a msӡHOB G&#]PlA!4uUnc*=WY@7U+}yJt\.݅R,N GhUH(Q-4˞T.z͸p_%ƒ.]{f #"JLbPT4Zܖs_o߯⏋ڨ=kl^vOFjm](8RP]iĔH]ڈir|Dp5?||NJo(lW?;td*IENDB`event.png000066400000000000000000000014571326020644600303560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/32x32PNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<IDATXMhQLTRR "ԥ ] ]Bpۢ;WE""TtSqTݨ!Lw]$iI2MM<9sIiUX#8<-@w3.! h6`ƪg "; G/aNTDjͤ8Loi0%Yy76/E8T nM40W JM<.̤vLjzǑ3Æ1Cn=ਟ} }e R=&09J}ݢ}oxSD ٌom!k ݔÜrD:` Ԅ!K y(J]쭖Jlzy"RHVքKl~ERcabE|PY.n`n: RjVY\7C ȉtL]πY_Z2RjvVvsXC*/DZG"H_}`p^VWVrD]&/!hm 4e*NȕJO(xS96w'*8{VP/JT`b"FG?2;"PY|L^3J} :D>W}$BfL?[} /klR= ; $XZ_k=qXIENDB`invisible.png000066400000000000000000000012101326020644600312040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/32x32PNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<IDATX1QgoSNOlBI!XIG?JMa4OI,kAh01 "owI$4;̼!"ȳP%Vu~jۧ"y" uc'"ⰱ0cvO`@8t<p 'DZ"O;d2y2);l6`KD^Ѯvf2AAg ض#"k!3xBDZF#>d@V;yލ@"m ṡlOJ)q ?߷ JTJJ)r)F,u+@D ʌ-81 PdW3}PPZhu׳\ռ|IS߂bo4aT*@Dx`5a\3-v(˽m8뺏 C-$em2._yZVAc>lv4˞MQTE#6·%pIIENDB`muc_active.png000066400000000000000000000020331326020644600313430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/32x32PNG  IHDR szzbKGDtIME !sIDATX_hSWǿ?ƴ)@AX_XA&:Ht/*%1= BY D02(yrL, ,q611'瞳MڤY sw~oH#FCCC\.5pjsyw8yXoo`0JiSNR}1 ?sֺ `@C@)Ϋ2{Rc _-'ccc<^ ?>߿f4R/: ߾Ahd鱩`VȖ =Kq@s'J fwŭs(,$I'._ϋk:[ȓv)@)[͝uJuz 6Z)شBXR@@jN^J "l:[nT i&A!kpeaffq4MضW%NL "H$ "=u*&uEoyi"NRN||<Lm+$xOX:V}v~~Cz#lթ+E7ݟ8{Z`6L_*Iet?|>_XXC>Eo~^էg=_s\D^hW prp8YTK-Ӡ[|^g^._}m+ BSl۾ s&!ZKԍ֯OR8@RUJW%@rFStvvsss|fFtD0uwa>}9˒2 VXb:pv 8bL_\BѩҒ]zQݽDP"Jٮ @Ad4}SvUu m#X١:v1'˦옗(7,k KлdBBIENDB`muc_inactive.png000066400000000000000000000017761326020644600317070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/32x32PNG  IHDR szzbKGDtIME !sIDATXVAkF4,ohR C_=RC()!R989l{1!%罥? ǰ*b\[iz$&i9`x|Iݤ$A[[[_iְmSclR+I6|>BDspqMD`0QJcl,c^4J)l~ $Ip]w"U loo(Jc8Q Ifff0??GZ_]]5(v]WWW8==0m/)vCUPJj)B88AU4x\HF(LRQ&3q&$Ɩ S|yc < $T JR لI D7#@cTUE. vF*j˔DH8??gggg Ȳ|8X .Wbj^i0IeY!NG Rf|vv!mAv#J19nnndx.$IB6nw$acrpp8 b68瘚c rĒeNZF0 fYVb\ X,~M)m}}=jiqxxط,GuOTտ`gggEQUUzGJHDt:*!@u4A|m3M{q~*Ѧb~scRTg2to<3gBA¼a VeT.K^# #v{3HbY` rO&gDdK)IqCMs)1jx<~CDHnH$D$_4K{"r)[FCPVox j˽*6Ƀzc+`YwP-$/t:* "l0>whzƴZW BָR).h0JW#IutNi\x܏D"&c7=-cn;*Eq!|f Z/$- h0J !GHz,chY3>ݤOy,< ,}Uȿ= \:G"3x>-8d2$yjAq}3t.I)?D{Ѩ4d$,"w]; ,4b5/f祍QIENDB`offline.png000066400000000000000000000016211326020644600306500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/32x32PNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<#IDATXAH\Go*>1}T D`kҠzXBNKXZj $H +Bbʽo $"DQض\.l6&@5xq T*ӃRe$I tuuaddtiSDBb= 31̌P("B:.<477X,z'"{=ƩVdqqg"3}}KKKߝ}+"Z?$Y]Hx1澈c}_^aJd lݮH^)vee4 ְj~+4pimQ)IENDB`online.png000066400000000000000000000011301326020644600305050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/32x32PNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<IDATX1hAwwH((F,[I!F J&$b#gH- enr;w-a D}e7;&aP##@#!v1I`o|"ڬ!ڈLUXǮY x lb py0Pi 4KyႦޑfg<#P+eMk.ـ|3-tJ1߂,=#G]kng*;߃qH9d28rb.&apd@' ~K %B lVai،tyQ%rm] T7@'|LCT(5s8#|AM*cTیv}ݹ%[5<j2@hs8`l&K@2ȽUb|"aHN2^|:0FxiQR&8 3!Ո*"5#ywEٛ+]h^OT;7U1 '4Eϳ 8qΐ k֧eP_r"U(j06amcOj=*ܞ$GφSت堡Xp9=WӱPj'IxN7FM  es IENDB`requested.png000066400000000000000000000016201326020644600312260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/32x32PNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<"IDATXVAHavUd3S4\ұPŃ%%ȃS !’"K J"y򼂂(тMF3ov:.;afg!"8tL  hmm.0o+ ԛ9MDΔ6055i躞iii4My)`˲ [(&2ף PUU"J=s27rnvh4ڲ,455k4MCVMwwwwc Ԉȵ̝f33E 9QbGߟ*j v|#ǡʕ_$ B3tFGGaF\"^ fˁeAD]8l߄w !mll.ʁ׻ٛ QWH@ 0+;̌J&r. . N3_|*Z øg :fE&ϱnY{9톈 baa!eoy7"" FGDfybvT̂dd2y p8~_RXk_SggQ0~IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/32x32/xa.png000066400000000000000000000012611326020644600277150ustar00rootroot00000000000000PNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<CIDATX?hA3QQ BM ``!b/J`'(Z؈ZVMl p#|1 '<W"aŷ=6 |`TVT'$<`J6Ř[BGU.rcf\>&u.g"+[GG?QI1Q Oˮa Uu=3aWz/V]9o 搲 CVZ} pJ02KgtSB0VhAlvNPԺlg|$Rڀ#Vց?Qe))քO]u ZO}>oXutIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/48x48/000077500000000000000000000000001326020644600266155ustar00rootroot00000000000000offline.png000066400000000000000000000023571326020644600306750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/48x48PNG  IHDR00WsBIT|dtEXtSoftwarewww.inkscape.org<IDAThAH\G)w) o8D+Wt644v`,3gGT󠹹& T !Nǘ~ommLMMt]LhI<ӶwH˲tfaayyyp\p8p80 Ӱ,KiGm .,KSm0;;{<ّ rS+++)RBTR3?SxN塶VNTR?c He,..F~WUURK*\)$H)MfJ]M;;;EEEpFlll`ww7Zʥr}}=rrr+ߏ333":/ _ !r1'|(81t:9030"a 0&\.ZOwU> 2$Nn !J}>ߞ*O*DMDэc@GʮDF#{~xY>wvv3/6Gp\Z#2 mcccOeHV[[[p[Q_D4ЕcRKa=f~ i3U+m,KTؕ^O HRmi3IENDB`online.png000066400000000000000000000014411326020644600305300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/goojim/48x48PNG  IHDR00WsBIT|dtEXtSoftwarewww.inkscape.org<IDAThOHA??CDFuIuH!.JTtH#$IoAt%K d4ȃݷ>.`ofUe=GMFuYGu{,[-&1S)q. "e3P#?0#x;1]l%ėKt4a,zz <]:k8R~NV\iiI@xRZ [ȜPZE|8aJ@e;EbQZ}:E(Vk;O꤭PL&%aE*km (Bi 32!CK5iizJmVc[]KH+5$RZ{c)_.Xi y4;Yv}7; V#l6%[Wc-Jk*+e57|{j(oХ99Vu Him(o+ܙأ=4:c+)nTGJ 3CS,r7f#048w?0r)H#>#v;{L{Bk|F|>A}c O[?vK.Nw@x+Pya_};x\( ҉\7꿂<Ȁ:h\nԳ08WdO 97dAsCzws92OEİor*nSrLfB.g$T)_pv7BP@3$r.?WB#%<ی/ٞ3>D5銎Hq\]W̺zZŶ+re3Hl4Mž㾃9\Vr6?j`޹<>l(yVۧ*w-W-yQÄ:r`uI7ḘZUj{ɇc02KyτZ''HuQ)DΚ0MLX,PGGG=r}N ܈̗IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/16x16/closed.png000066400000000000000000000003701326020644600302300ustar00rootroot00000000000000PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8c?%f+! ļP Ӂx #8W $n > ċx7q/e._H d8jOB- ,$ \ t3lLJjIENDB`connecting.gif000066400000000000000000000026101326020644600310070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/16x16GIF89a        " 4@GJLNOPRY_`!a!"g""h"$i$#l#$l$$n$%r%&s&&t&)t)'x'++,,,,,,//2211448855667799>>??@@@@UUBBEEEEEEJJFFEEFFGGFFGGHH``HHIIJJKKLLPPNNMMNNPPQQRRSSTTUUVVWWYYZZ[[\\]]__``aa``bbcccceeffggiijjqqllmmooppsstttt||{{||}}~~䉌䌌匍卑摒撔甕畘蘙虚蚜霠頟꟡ꡢꢤ뤦릧맨쨩쩪쪭쭮ﷺ! NETSCAPE2.0!, L fM'H LM. 1aEB$T㿂j\g'@aG880Y*Xd"=*R/8}TPH5v%CB=J$ $He;!, o DrƊ (E Z@B$[Q9r"CeAE"0wYlj*h30P @$M2qDSXH+!*R + J?u@!, `` H$Fn$U92`˗ 9yrsf B<C(1\DR$L8iiOfQ^ u,YϢVb¥!, A 2b&͗)H"Ȓ&NQ @(MāHò8 "IbF͛o,b,@XiE&BS$4:$7N`8.{(몪nz<0lnFɼb@ BѢ  ($`/V@OI*j|G^4._f\]TdXZ4[S3COeYn'YvPzIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/16x16/event.gif000066400000000000000000000021421326020644600300600ustar00rootroot00000000000000GIF89a  !%&'()*+,-.034578>?@BCEFGHLMNPQ STUWXZ \_bc dfhjk nopruv {}~!!!"""&&&***,,,---...///222333444777:::???@@@EEEFFFIIIOOOQQQYYYZZZiiimmmnnnpppwww~~~! NETSCAPE2.0!Created with The GIMP!<,e AaTSD *,HKYzi(8 ` A֋pu-Qf_$yF  JhТ@=$S*| tU!<,  \H=!C5 aıS$4 , c%JRF@r,Is&%ؠCG@Й`tѣ AJWjU0,O)"1HGv<9Pw`$TdH;invisible.png000066400000000000000000000010201326020644600306550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/16x16PNG  IHDRatIME4FbKGD pHYs  tEXtCommentCreated with The GIMPd%ntIDAT8˕?Hq+Ehp< H- -Q--S.!baPAACK` ACCC-Qџ?xhO?ihBnqB/Uii۶'"HR8S]T*%*JbX,:a̒$|nq8ORQ3XR\\V1w!nL!YǤeY:+8EPm: &b0Ni=j8$BG{~%QyvU_=,{5XlJK[ؠo܅?p͚tʘF(V<~abKcTq7Z '\ˋ5yɼS/ !c`Afߨ.?rIENDB`muc_active.png000066400000000000000000000011201326020644600310110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8kA?n6b^ ؓzڛR(7ɮir Z')ƃHK@E$ŐvgymI }0a}ߙQ"I(ˮz@*}Dddz'1fvyaL﷛F[@vX)#B'A6nR?lc!Jc*K.ݛ$.\.s;DSz@gD$׾KEeȵc Q]?ڭVy EnYfFenS.ozÐ ,.eRZyŭ2,˞ΕJ6ŢX,~\J%ۭ ð#c b";Ft:U$yZ8gY|nZfp8TE;i4;j{ދW zNjz7L6)`HD$>t:7|_kWZo=N dg=m1缚mo l)IENDB`not_in_roster.png000066400000000000000000000015251326020644600315670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/16x16PNG  IHDRatIME EbKGD pHYs  tEXtCommentCreated with The GIMPd%nIDAT8c`\@@q'{1/@|B@@?^^^ cffb6l󹸸>9;;?~WFF?khhwtt+Pms )55&&@XZZ{RR->>/@~345<:sEVV"VVVfGFFF{YXX~Ĭccc{ 䫁 (}٩ tv? ?klljiiRPP3ͳ/OeҥKYOTPPP* /-Zjkk;жWX~=(@&N(4YL|pppeYrnڴ1<<7LĽ[2TWWG@!rJsssnYYYٳ>AcXgiiybΜ9 jjj?@8,,l*g<cIIf3gr*--G6| `,2A| > Ly'@$'%%O@bbb3aʸ|@i&nL,OWKc3[ Ŝ\odW1#۲W݋)p3 :LMMcutt^-z6,Pw@[>3gK~gFP&P i,IENDB`offline.png000066400000000000000000000007701326020644600303260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/16x16PNG  IHDRatIME ;bKGD pHYs  tEXtCommentCreated with The GIMPd%n\IDAT8˥ӿJP"MtN yqp1lVt⤸5 &T$)";Vrp#?pp ;0+a:$ad6YERDQ$<{ Pa RP^4MnSբ$I}uK ra >FAqSPHe.y >= Ch H4.`0%( 9C p]jfǹML eRU5d^Qs\p8A+5Fs\`o#_etlb:9p~&\B ˠ_:27IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/16x16/online.png000066400000000000000000000012671326020644600302510ustar00rootroot00000000000000PNG  IHDRatIME)%7bKGD pHYs  tEXtCommentCreated with The GIMPd%nIDAT8˕MHaFw6eaJ4cE ]?vFvXP"=D\/EDA:dAQTE!T "KBGMI3(HkOwkC<#H%. LeqXEϮu$em'.Jv[Ɂ·a6P;PR6m2&#X!nڽLf$I`|yMb "w#pvQ6E8sÌ8U)4oRK 6A (\r+ ~}1kau\0a/Obob] A*.;U'Zg[;׋U"/#pչ@^'cQtZ貺}Ԋfr2.ェ6K@LqDŖ9 &ಧcfkavߛ7mzY ] `dxݴd9c\4' }ijEW9ʼ#~4SDz≼Sθ=/惻 -Q9mN'ku &>g+IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/16x16/opened.png000066400000000000000000000002651326020644600302340ustar00rootroot00000000000000PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<GIDAT8c?%a*@ĩ-.,/&2 fx/.X `t0 $e徇IENDB`requested.png000066400000000000000000000012331326020644600307000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/16x16PNG  IHDRatIME׳bKGD pHYs  tEXtCommentCreated with The GIMPd%nIDAT8c`\@lč@ Wq/ ` (((\>xLMM;&&@p f9卍DիW 1[[YYu aaa;/_.Ɉ͆"L~~@nό6Yj8g++ Sķ4]l#1JHH2@&..@W8١P,0r_TT4H rpp8TPP001_BBBa@ 5 ( ` eff~^ @dxh @/GS @w& Dӧ IJJ2{@|!MVWW955O@!L<[JJJ02 f@}@ %6_mmmb}}}>ydI&&$$d( [Laeddn0'ʕ@\ćGP-j }IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/16x16/xa.png000066400000000000000000000011261326020644600273670ustar00rootroot00000000000000PNG  IHDRatIMEX(9bKGD pHYs  tEXtCommentCreated with The GIMPd%nIDAT8˕=Has+%.(&A hpj\Z)hhɡ(FuUt-p(8_O4/ s9M$×onP 1O_Mt=.n&UeؘQ}KK<*uvZZ±^XdueVV@TrP69Y7D/f!|D( ,,b7iU^es30?.BANё t^D f ac$ai YљTܥRaq8RKe"Ij$#TKqk ^cy>bohjV #k_#yM K |éK4į[ q 힖aW}[NbK᭝[ͽhCJjf>:aeIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/32x32/000077500000000000000000000000001326020644600262455ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/32x32/away.png000066400000000000000000000030261326020644600277150ustar00rootroot00000000000000PNG  IHDR szztIME)abKGD pHYs  tEXtCommentCreated with The GIMPd%nzIDATXýyPel.,"zqW-YԱ%Œ0%q_P+\3DM/XظnSZ5a۔p9=Pˉxb!]E~"NG:<ĒFW ԃS=G`4@~'?wPI܍ Cg׆h덎AwpoŠq@wW /8QX̯$" M/mݜѹw' 2Xg fE֞Ll&߄o 3,cjB4""PKt'U ނJ~to1FaYl;μWg틸r2.ݺ3N#(8 YOp4rD4&{yl_MOPgy $IQv-g}ۓ^."4>FLN,AR;*7+y,i\btѠTH E`R34![X:QdB XJ=oɺ!i")#Mc;ʷK r)^{{ wCΣؘ];WcU2Zqvl~q訩ܠcY*7YE+3&,߯M)7`n0o{I5^?bD,U7xh?8:i>/O'^XU fDnXYQs&>ñ"];΃KT "h"JABQBmRCڬRߋߣ>%NKrQF7gC *6? eNdue!sE& HID̔hP(, @Xx4J &* rY(e)lˋldV^]#1܁gbƁ]ڴrTN|Hy㬴LtN*^@N {n@~k8q6#8DZL~n2b1rZ> 'R̸xR2~2wn7{?t's |$V'kv1QlGxTQBd̄eʨ!Gc_bѕES-] ,Fa9"ȀRd3#*m^/0UU(]Kx:QƋhj;M)җKE+? ZX'GcJQP#Yoyy^}zV*dR9Aq_Vc>)>KLwL,`/Y3;Z1%4uH}"U|ManzpM;!g |#E>IS8G DPkEoC;bI* )J!+N_J`+doI<~>Kk- ]EB" :jɰBC't)%"F$(ZmBX v~-\Eۋ`-#5qzGprP񇊈NpH~B)ڼyl6!11բ eMEa0Ypt8Z/xFјB$4sI0kiM&)Wʾ4xsaJ3>>I Zd!7t9%U"ͩ矒ҼP0777YnR _QB<1c#UyR)\vv㜓3z˓&M*}-#HX5k222Vыo1݈$mȃn7|a4)\jfmr]4ҏ, ?}tZccc %%e uixZF&!LC2|}}}ip>\"+ Vv!ou:UJmYjbp8?M7n̿~z2a  LC4G$~pѣGر÷~֖`a˖-[488}-:H=MP?GM p<IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/32x32/closed.png000066400000000000000000000006371326020644600302320ustar00rootroot00000000000000PNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<1IDATXֽJ`߈XlTpJRK,FQaKK?* 9cG8H"&+y7̼3 I 5`E4BwySW),^0U{0Mt4j-@ P81]"[p7_$N0тXG%G2~V83ưU>15E@fM@?Ǣv8Ѓ8,ENA(3ojԸZ.$wZD+}Qs'N5xKCk?IIENDB`connecting.gif000066400000000000000000000060041326020644600310040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/32x32GIF89a              " # # & ) * +, - / 2 20456:;?@C@AEFGHIMORSXUZ[ ]#gm#'j!!o%"p&#q'%r()s""w%*t#+u$%y'(|)%')*++,,$/--..&0,+.,/-2/*330+441-52.3/+35162-4.51793:4<56:7;9<:=;>699;=?CD?@9;@AAB<=CC=>DD??@@CMBA9ECB;FECKIFDDMGFB@?JIGCBAKECBLNKPLMUQMOVPW[WY_]XZ`b^\ae`fadigbejojmrpknsqlotxtyuw}zvx~}~䆃䀁凉䈊剋抉瑍狑摒璔蓚霛ꝣ靡ꤤꞢ쥩ꥪ릫쨨쯹! NETSCAPE2.0!,  HZȰa‡ J41Q#E1XpaA:DRD`gzID8|81$dm9EQ}pсAЃbB;HIɉewKXA ƝveJUx[AaDr: 'ИD*BEX0tw1"X!t}d0B *"$CA!,  H`*\8JX)(@lĄ %"D+$Qf"fbtѕ`"CQxR^"UGPN Fu8E THҡ-&⋆5dPl  et=$QgVq"Y@ {G UYKJh Fd!DhcMXA-h,Ұ;gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/32x32/dnd.png000066400000000000000000000026131326020644600275220ustar00rootroot00000000000000PNG  IHDR szztIME*ӕbKGD pHYs  tEXtCommentCreated with The GIMPd%nIDATXõolgK{rJ-[Cf-l%c|%hbbAb #gsllck mmmp%n}'7w9s=٣F4`1.1lf"cfD8\ dx QW.0w 0&/ DZa >Gs#X[S΢%iMDw3$>hE{v/,cbaSsxl>Ņױ?OzOu؁/s)⁆6Nk+MM,X LMQ.=+9AGG} o74x kn!<+hi!RϚXDr6#;"ܞjN=ye俋Od] LN2>kr(,?zJ d1o@3>Ϸ:FsO<\51AC܅ N6+tBv*{=47s|9Qw&cYjJnJlE[u1ѮUΑZC EHMؖ#kKch'b##9sZ| ms+] ذ]XJx:6m#fu/:dnt:2m'b/B2ǏctU (:;yqBucTO˿ޑ-Y3?/KNEŹt3Cx.%|iUJU03f7_x/!og y0\!#| Y?UAP( ׃vW;W*n1ZG8af"4GǓP鵉hFF5A3eŦ+x8t|oBֱSˤ椐M)oqD(َf7%EY [ěX@g'ǔ׌4=IPGh$4ӳTp_I\z,R/w4"NKV3/i\[IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/32x32/error.png000066400000000000000000000015711326020644600301100ustar00rootroot00000000000000PNG  IHDR szztIME05nYbKGD pHYs  tEXtCommentCreated with The GIMPd%nIDATXKhQ$14$V&Ħ 54/!1i`EA7t!P QDtS;7BWvQ J뫴&6>pfiW̙/g{ÌFK6e5aX&c{XX,FP:;;Uǩ ѺN'% $k% Y$)0J^ﶕGY@ XXX) OO \_r`uul6KLF|^_X,jB7պAݚp$IvepA+q0 n+۶Nආ05 cuȊJ*WfVL&r^J|p8 >g^ ʲ\J&d .E$)W-{Xw4@YW@cH8(pSwx&P@ ULf)Ps-O޽ fq.Z%(H>E Ha0A)b׹@yQNU( H` ͷc۱LV1a8E&@Pм ŷ$z"Qeobb)E"Fx?@BCEFGHLMNPQ STUWXZ \_bc dfhjk nopruv {}~!!!"""&&&***,,,---...///222333444777:::???@@@EEEFFFIIIOOOQQQYYYZZZiiimmmnnnpppwww~~~! NETSCAPE2.0!<,  HP \p`‡ J"‰F2*U+V@QcB jV,Y2br!bÄ=hRƬϟːrf l CӧOsU(BRiW`5֮hZVWdE.[xX < qrBŪU#jS11V*Ź3gPFVx‹I߿f4R/: ߾Ahd鱩`VȖ =Kq@s'J fwŭs(,$I'._ϋk:[ȓv)@)[͝uJuz 6Z)شBXR@@jN^J "l:[nT i&A!kpeaffq4MضW%NL "H$ "=u*&uEoyi"NRN||<Lm+$xOX:V}v~~Cz#lթ+E7ݟ8{Z`6L_*Iet?|>_XXC>Eo~^էg=_s\D^hW prp8YTK-Ӡ[|^g^._}m+ BSl۾ s&!ZKԍ֯OR8@RUJW%@rFStvvsss|fFtD0uwa>}9˒2 VXb:pv 8bL_\BѩҒ]zQݽDP"Jٮ @Ad4}SvUu m#X١:v1'˦옗(7,k KлdBBIENDB`muc_inactive.png000066400000000000000000000017761326020644600313550ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/32x32PNG  IHDR szzbKGDtIME !sIDATXVAkF4,ohR C_=RC()!R989l{1!%罥? ǰ*b\[iz$&i9`x|Iݤ$A[[[_iְmSclR+I6|>BDspqMD`0QJcl,c^4J)l~ $Ip]w"U loo(Jc8Q Ifff0??GZ_]]5(v]WWW8==0m/)vCUPJj)B88AU4x\HF(LRQ&3q&$Ɩ S|yc < $T JR لI D7#@cTUE. vF*j˔DH8??gggg Ȳ|8X .Wbj^i0IeY!NG Rf|vv!mAv#J19nnndx.$IB6nw$acrpp8 b68瘚c rĒeNZF0 fYVb\ X,~M)m}}=jiqxxط,GuOTտ`gggEQUUzGJHDt:*!@u4A|m3M{q~*Ѧb~scRTg2to<3gBA¼a VeT.K^# #}:˫MQ̱0Cfff߿?oŊp3EDuttz?-G5ц(9?zKz;//2ݻwHEg͚5xBCi["F 6%/¦#WXUUU%0ذqFe0NGSN\D#9O<)s'@¥U.[|y=IIVэIOVVVUǣG~gdd\o"444 B-pi<Ex|g#b y133y%^N7xeJ(C'e 'DgD'2\FG䊝+TA*}OU 7JWE##[XA>5) ӻo}{g MjWJIsH>Q=VT~ڽHÆ B'M&'%}onzp IENDB`offline.png000066400000000000000000000020041326020644600303120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/32x32PNG  IHDR szztIME,XbKGD pHYs  tEXtCommentCreated with The GIMPd%nhIDATX]HSaMjaݤMҴ認ˈ0 B/ ([ix!EQEAQQW}Qely2w9hȃ0Kp^31z@&Ax [ rOZ Q978!028:/GEf3 Rii)NSa8sUb!GMMMC499I455EX(Pmm-QNN2s>\ n8)nt餆166F]]] I+C<]`MOI6M5nddDaNOjsp6.~p*sEww7SۥI(98>" 555F:::R&-ڸ^6,2fjmmMIKKv{-s,\( Q]]ק$ 7P-n'*&xϫzQVYYId0YdCʨ<r\dZ)77wJylAMi |QFL&T! &ܒ Ӟ4HViēVpq+?R}^rrb[d;5s"xMJq9˃fhL<]|#fcpn[4nv:Wb+[D7ߘ=Օ%r|s k{";w/E Qh# ,+@On(?S6Q~gJQp`T_YORv D..4;#;'QS,3c0 C+l4Bfg&t-AvW6v/Fol]ؚnY@5x Ff6p*99yfvvV,JHHHY2pRR[[233?777' 9d;8j Ą.V]]vzuyyy4&ᎧI fff$xc}X"&q222" [92X,^ruud@8|M~6s,;322RB!MMMy]]]M(U t/Sk100b}з'JDrKKK~ @Z rޞO[ Oޢ甧-@EVL|#"E8:!(:!4@~zb xyuZSx B$cJOO庺Sy||\)~C8}PBCCC&ڞcJzzz‚ iԁJfdSSrȈV}&77W'3z]@uHLLhkkӊ^.9 [5 z٢E{(*UPP ?RSShrR,6%%3D@%"<4& ^NNc%($6 V~o IvlXD`+sQQQ---]G0kIII666rN=ZHz8{v|bDg#twwǢ\244ʗX p,ȷ MF.$-l|Y 8f@PhIo0"T%a SLײbjDAq9c 7 2?E [EQKBR >͕݀uUbD[@&b^#hbyH+'Ax|j_ٍyM #a5TɡIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/32x32/xa.png000066400000000000000000000024501326020644600273640ustar00rootroot00000000000000PNG  IHDR szztIME)7`bKGD pHYs  tEXtCommentCreated with The GIMPd%nIDATXý]e̼vۭm.KacX4j4И^p Fnx&J!jxA,b]+[.lwv;x v[֓<ɼ9sSra' `w_ğx.YJ؎/L!HUR?i R$<;Ņ&U-Doދ;p0zG6A<(~ _ƽػ]Vs=## 34Do/*44LLHǏ{|v֏Rr,Ə=w-U_Ǒ[>EO5nniINcsh~Wr;Wõ|GU=7́go>T* *Uh89ee<Ӥ`wFƻ 7ko2m{YWq Q"|o3w3=}Mikfg} 4uBFťv%eWrq~؅{F愫TOc)eM Ư3M~ 0=_!ypu+\Zާٳonţ>.md+ {j$U%;{0χS`dvrRaJpf[2R]ը|-/ ](!꽯C|CNːa2Z۸!K+e3+-0fd88x9LLhˏ@Sx t w+x26B⏝(2^Cm=8}UӤv&I*<N/pHϑZo)7; >܍Wn |Geiek|;}P+y'޲v9YOFe@i*^"L5Hf Qȴ(EmF݊bolHCחA'f=!zV3Ѵዱ\~ +'<2sĵuRW{5XNǂ[]54߈͸.2" _IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/48x48/000077500000000000000000000000001326020644600262635ustar00rootroot00000000000000offline.png000066400000000000000000000020041326020644600303300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/gota/48x48PNG  IHDR szztIME,XbKGD pHYs  tEXtCommentCreated with The GIMPd%nhIDATX]HSaMjaݤMҴ認ˈ0 B/ ([ix!EQEAQQW}Qely2w9hȃ0Kp^31z@&Ax [ rOZ Q978!028:/GEf3 Rii)NSa8sUb!GMMMC499I455EX(Pmm-QNN2s>\ n8)nt餆166F]]] I+C<]`MOI6M5nddDaNOjsp6.~p*sEww7SۥI(98>" 555F:::R&-ڸ^6,2fjmmMIKKv{-s,\( Q]]ק$ 7P-n'*&xϫzQVYYId0YdCʨ<r\dZ)77wJylAMi |QFL&T! &ܒ Ӟ4HViēVpq+?R}^rrb[d;5s"xMJq9˃fhL<]|#fcpn[4nv:Wb+[D7ߘ=Օ%r|s k{";w/E Qh# ,+@On(?S6Q~gJQp`T_YORv D..4;#;'QS,3c0 C+l4Bfg&t-AvW6v/Fol]ؚnY@5x Ff6p*,T׍÷/<+U0r>ߊmD_zPRRj&;0-d߿AKI؁QOJ8 f>6}3xFH4V&ZRW(x֙ˌdLލw[=2}ZLRA< 8U={1c @1e9HEDi4r Uz sAR'8`|>!IENDB`chat.png000066400000000000000000000016361326020644600307650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/16x16PNG  IHDRatIME!5WbKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDAT8˅_h[u$7˒&]W's ˄"9CcT͇=tS77Q>1/.hS۵-Iek$~'i`sCA;,_RRP(gf/m;thgb:==gds4g8 `NRv{'F'@ضdYnicAUX|s2| 8z K%j뿽YǑe=x\n +[៾8;< ǹ07iEݝ yZP 7*ϥj v,A2^c4aftqhLD]{梯nXo޻YWo##1= 1v|FvjToEdd<;.nkw*L`{ŭ5,\L\GSIu,2JFSSJaY8 rSϒy?!*[\fį/ dٞkmw=p0\_̟dB!4!Va-]ùJW!1طޣ4{BF*߷`oh/z4[z} Q5ky+Z^~e-7`@yUngI.ֺZG^o?o%6bXPw߫E3ٻ T/D ;!qX&0&V"D]F2iSG bIENDB`closed.png000066400000000000000000000003521326020644600313110ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/16x16PNG  IHDR obKGD̿ pHYs  ~tIME )5{IDAT-ͱmAW`  ؕ#B9:6p59u`/_G~΃D[BIOZS*r}fLn߯%Lc)!m[iؗD[F"I7\(dIENDB`connecting.png000066400000000000000000000016241326020644600321720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/16x16PNG  IHDRagAMA7KIDAT8moSusshvm)ܧı!.#!1~dWx%\w&^x 71xED ͸Vڍڞ~JC}ܼP]>ƫzvJDPZ+vucӯ>WWo,ۥ!lR7k?˓~Zz)x{*9/6DPB]TXO7 .}]a"[Y [Tks5J_e |^o% p{4Fh6 Ja( [f"GH(V[i*N44Ճi=][QNtщʀ-DB[rdLlrEx!tO]xkrWQeM; XNb_czmCl#}2=򻹲"MAkcşY3{ڽL#|s6B8TEUmD[ +$sI$IŴm\2S+{M7'8vNYH)­Gn.`?,$ >2[Jx(Ca:mU?Vy}V|6~ ^͍*( .ev|,Y|JP}=gN)d(.խ +.`4-8&dsΏ2@˪&Kd*3@ N?apPG0ãzwڵO#})FqEF4`p_OW x2oIϹuޫU23@x {IENDB`dnd.png000066400000000000000000000015431326020644600306100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/16x16PNG  IHDRatIME/LNbKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDAT8˝S]HSacss;ss6م-4 4!iXAE,Bic zѾs H7? |_"D-yx~yy?"QRRCqqsZm/(vV}> [yWLrjC6;U(N99llK%H89 ڄ.ЍaF YpKE*=4LBTF3]6]9t Mva^1r8Xq* Ȏee!jmDf\xb]\x ~i  AWnh€^^0!S2;KpkVV+UN$'8pZZtO!$%@@!Ȕ EwcFtVjt\,9p!J)Y^&MwwӭB zE<-z~~MەS*H8DBw#5D^sqr+P TQNI(4TB7a}vI$NGH0HIW%Zm!\c؉m4 .renI&5n6w&lI_ dDR9m4.ȗk)9`]_q sd3 PnIENDB`error.png000066400000000000000000000012471326020644600311750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/16x16PNG  IHDRagAMA7^IDAT8}KH[QFDBBE wmPIWJU @ (]օBAFbU-]ԭPhTѨ_Q|p803"*D><y)wVS니Ott8Ft:OkDWUn`k0`vv8-2Ɂ܄e6$7u؀YMpHC23aj ;Q_[DQP | >Q v; cbP-S*+jjJKAU]$p+9 UrѩV*(,u`?MPݸ7>rի wPg4z4ɂꧩ ;[sXX$$ͯ`rki91: zKGő+IbFF`nVWyj&&`||jKGNgUf.{{aff *-izJJ1_>BDFFFGHJaNNPQPOSScSVZXY\\Z] Y\]mna _a``deag edfek kj{ijokipqv xuw||xw~ }{z݂~~~˖   0   " $ .-%+>'5%1*/&#+.^1+),()&* C98?I)2)(1(IUKNLDE2_[T==VTCFQTLM7! NETSCAPE2.0! , HAMEEWU8C<I`142Lh;| ؀*4@``@! , HI*Ti4D\~5Ơ=Z9/cHq0M\P*QW(S(=2]p$&,x`A3< d(A ! ,| Hz J *+Q`h S̢Z޼2 ep6Q(Eس8A4eFaH&\C rՑ(]C _@0 ! ,^ H*LdG!AY!,][BJߺe֍ڈ|Ga`ǎŪВ.]o$Jr*CH Ȧć2ixa  ! ,8 H*wb!A!Ne[qK# @1NF:)K! ,8 H*wb!A!/E2:WeC1G-@1NF:)K! ,^ H*H!P5K]K Ժeq|KaXǎ.]$qJD7AXC /AK% ! ,{ HF`%P SQ h tᅑR޼ZtN6Y ep)*HԳ814av<8$\qԕQ:9sI H X98 ! , HI*`TΔDcp  6l6{ie9mX̙ϟ>3i)Gy!R$S(jBJiB Ѫ &s=qA! ,{ HF`%P SQ h tᅑR޼ZtN6Y ep)*HԳ814av<8$\qԕQ:9sI H X98 ! ,^ H*H!P5K]K Ժeq|KaXǎ.]$qJD7AXC /AK% ! ,8 H*wb!A!/E2:WeC1G-@1NF:)K! ,8 H*wb!A!Ne[qK# @1NF:)K! ,^ H*LdG!AY!,][BJߺe֍ڈ|Ga`ǎŪВ.]o$Jr*CH Ȧć2ixa  ! ,| Hz J *+Q`h S̢Z޼2 ep6Q(Eس8A4eFaH&\C rՑ(]C _@0 ! , HI*Ti4D\~5Ơ=Z9/cHq0M\P*QW(S(=2]p$&,x`A3< d(A ;invisible.png000066400000000000000000000015771326020644600320360ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/16x16PNG  IHDRatIME$:KzbKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDAT8˝S]HQڦs:sNtJ! e .xNڢAL[ *,Jdݨõs[m[|"D-9py>?APC3PQ x<+QXx&sgbYY1& W$ՎH; PYypdQ NÀ+c!}̱юVX&cu_$rsᔪ^Fg.ݍ5yz|o_xFfe'z{yy t5#J҄xj{{b1H$@2 Zm}\v }kh%Z~MB!jBо###U`6A0{脬7,̀+u_,fCv1l6@.%t:l[[p.wjADYV Vk477Rx<,)1@(x3EP/$nB]@iF`o23?R[[[X,;>%b<ھkeJۡ`` EJt)hg D;;G C o*IENDB`muc_active.png000066400000000000000000000011201326020644600321510ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8kA?n6b^ ؓzڛR(7ɮir Z')ƃHK@E$ŐvgymI }0a}ߙQ"I(ˮz@*}Dddz'1fvyaL﷛F[@vX)#B'A6nR?lc!Jc*K.ݛ$.\.s;DSz@gD$׾KEeȵc Q]?ڭVy EnYfFenS.ozÐ ,.eRZyŭ2,˞ΕJ6ŢX,~\J%ۭ ð#c b";Ft:U$yZ8gY|nZfp8TE;i4;j{ދW zNjz7L6)`HD$>t:7|_kWZo=N dg=m1缚mo l)IENDB`not_in_roster.png000066400000000000000000000015551326020644600327320ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/16x16PNG  IHDRatIME 5-IbKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDAT8c`[X_VRr $삨BB'o(!Qz@Iy9#>pQF 3t;>Ho?}J˾>&\VV8W}AD"Eqq&kX49N`!hh4nDMvlr@A99^@WT|bEd bb)fָlK5 O̵>1ۘ<ϲ2\&- JLwF6`|Gj֞ '&sn3Ⴐ4KnUFƝi`CIJFhlxkUDW`sD'ףKZ8!k>!!aauvro/o;;]wu[.xb\͉~![LTT (XuIFI\\^/?75pscV`ܻCK(BQꯧ^^^'%ǩ@@74 ,:Ԥ2sReeÇ3.JI^n}0)7 &&џ^wzEҧ CZX|> +抦f 0yWecKS| tsMCcekз`%%ŷΪ45=b\ik~^ލ@vBl -LIENDB`offline.png000066400000000000000000000012241326020644600314610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/16x16PNG  IHDRatIME /1pQF 3t;>Ho?}J˾>&\VV8W}AD"Eqq&kX49N`!hh4nDMvlr@A99^@WT|bEd bb)fָlK5 O̵>1ۘ<ϲ2\&sd=/=\rr.kc<0q؟e}78ԜUtIEώ UddXjaoUW7冽?;rg{ Xq @.)*r0&8ওyEgXX1?)_QWW$'7VE)֋ҍ@IY=6Iw0hjwY6d  p]5]34s @'ՇYY7/JJVj |p!pUIѝQIENDB`opened.png000066400000000000000000000003531326020644600313130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/16x16PNG  IHDR dbKGD̿ pHYs  tIME j$|IDAT-@DߊEۂ:c'>$:01Ј"hfowv:8"k/:rQ\N˷>YY7dU>H x.s=nCk$=rj4~`e0ԊIENDB`requested.png000066400000000000000000000015721326020644600320460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/16x16PNG  IHDRatIME 2!޾S/bKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDAT8c`Dݹ%HT:)&.4SJ`dx4qK!,?'Pń~%].1j. ~^yMf YsJT5iG,+;69Na)f!@ ` )hq2SL6 14RޜScbtzI*Cn:^׬F0P 4dX`1n.=ihh`wJȂe%+LbKi.zY0&`7`H)磌|;xwz34}imPncUgϥ-N|Z GYXއ|/_qwgsǗGYd3;Q\+pokk87?_k%%gbz(4UHНSTv8`_WZ? -'5 =- U 4q]@DR>7#@YDj22}Qm}0ic%630tfg71&MWJ?_2'UeJdvAqԌ4 ;88o(-纁ZvE0jƘf0gg*,hߵ@gl;0WSZ-ι+mgIENDB`xa.png000066400000000000000000000015771326020644600304620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/16x16PNG  IHDRatIME $ sabKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDAT8c`[X_VRr $삨BB'o(!Qz@Iy9#>pQF 3t;>Ho?}J˾>&\VV8W}AD"Eqq&kX49N`!hh4nDMvlr@A99^@W2 .㛁Wщٖ'kk}b1/+de# aM_ԲzVoQ5/7h^|gى b+NL~b8Hm&`7\*h Pe/}˪?rK-91ED_߉N嵀1qC ځ=U}_>k/~__Ewdş,Ws_VA0%s<<;. V]aap_soo{/<?яe|;1Al+0݁h{%EEN}k|[?_ڞ׿`XDϼhpI㼀3,,@$eǯ5xOz\(-$`R.&oNwsgoX|w+-]y-Ԍ!?{w]~W5W>xYA!暁A00-fNn󀼘Yқ56x-0}-Ϸ bdcKl[`YIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/32x32/000077500000000000000000000000001326020644600274055ustar00rootroot00000000000000away.png000066400000000000000000000042221326020644600307750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/32x32PNG  IHDR;0tIME8lѻbKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDATHǽ P.. PybQ1m|j&L'It E4(jElD $$AȧZuU^ ,fy{ĔIZJxg== sԇXU--7c oTŔbży7l0e/bԬ]k^1mo}FFjj_~hOE"}eU{iܵsk@:bWlnS,"p5E&&OSbe^9kVpmPWK%2;;//h2[[kQ'\]}KFL&G4`ggtˑ#MU*<";cz |ظ{ɰRxy=%eX \^bmݬ;lpwy91,z%HEUC]zdFHC}hcxDxI:NWQ*ŀb>g_wP'j5ctjr(r'v>_fԖ`?Fx(+Pݽ3;!<2(sMP>ll6Pfuq\`>Ub&m|ڴώcpm7_?FzĬRjΉ8>֘"<^?g wȼ; r?Vxt˜4xxa([l YYY0 B۠?|72tZjyhyEq-ӹ0t[=<ޓԱXzu=*$Yرc֭[pkk+"""PXXeP1Y ' Y݋=ӫfѣbYRHGy-*YONX&BLEؾ};v9?!!~~~Bwg'_|@ Ԋˠ4WzxRڎ}$:А鎪wglٲGWW:::Pq-i6@5\NV[hO2U.YbKK iU2/NqQ~ T*'I;thkk,z9QE > u$;!9nVo-*"$k U2RSS!jsѕ"sv_Qt^J,R/n`3I[ @#v^V Fܯy&e"#5;ȫM.]5 H 4yu3DK\*rX[:(rPy> n˛3ܱt HHoʦLQ_D紀r=tt=Wǽ5Ҩʃh ͷ6x$5tP%d/3\\&}٤IQfSӕ A f5,C}lcƴemY. ڮ|見4J3uԍHwܸמ<9W_~~ܹ3}}n1Rntw3kGBq]{NYAcIw"nZPf[j ꨑô4樨2kY8˫dӧIDM,5*B>suɚOGxIENDB`chat.png000066400000000000000000000034531326020644600307600ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/32x32PNG  IHDR;0tIME" ;DlPbKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDATHǽ PTe.,i@TAsDKGFJI@D"y2 -t&م݅!./"$;F>;sf}wxլ^t9"QRBB'*vwOV{ym( ZX6q+KxUhdj\Tڠ y<,T7dJ utrϿ566L%U|ͅBaeMSn̘ث11~K [N3_݃KG𤏻 NjWWgZ?Eh# vݸqwX;dJ-U<`qisRԂm!!o}ŋ˂ߧUS )rv*à huqqG<<*r޳($y3)6fQ;N`3Vp̏,/wr@`c8>.!ZO c͎,gy=GKB`3UA7D l4l3lolϐ#Kߣ,cσ)s |T/85p.je;"YC!KraI,Id.Q\_'p ̾ XF5d3Kvj` (ۨ |d]}rE},~`t%)ziX:DzyBvh\* (SF֖>74[|%tr }u)ƁVp{,#|>cTy J7aBuT<:k},z!m056Ć3{{K%rz$,+ \HHgx#M,{,䋀@p+L]a 󟓁N7@ʡkKNv4ޛeG:s߸kC1ە7(F&ztq~ky8 ;򳑜a;,Xuj0zCKclDBSMPxu~묇g { GюZQ\u=\D|F ܉GG*Ͻ+M&AZMR7$2suT@C4oa$R?LZP^-nwcDr2tzvTɓ_%ngn[;I (ݮ2ezmqaUI6V9Zcjv~)J*WS95kָ>,q6.Ύ %.xGH`" T9>%+%0씠pU[ ]"*Vh$ک \^;t:)܂ǁ\/P3pIۧ@t+=PLkt?ȇ~ÈP43ix[ Ge8-ϥC?YBSem% ]ԃP/4$HsM9AsznIW&邂F]=zv^@ %[JGp]9sROSi?nA?q۶mn!ÐIKGErn"xG<)/vnIENDB`dnd.png000066400000000000000000000033731326020644600306070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/32x32PNG  IHDR;0tIME.%+ZHbKGD pHYs  ~tEXtCommentCreated with The GIMPd%n_IDATHǽ LSW{*[T@y D\f4@2(,Ǩ#IBL榉*LD&$ĹatQK q(e+2pY9ߖL 7{wl;}hrWSDA/l"$oQ,"ESϒCHn6ҥ^hM J%VUYė: 6=b'4ǙϼDy'9NP1 ؈Sbn䷷;1BFKKgRFkkݱ" 0Z^hQPkMȪȩuñw)""@{oE"Z*tJF-(`tpUQafaOח8jKX9p)2rO]UI *H]Ѥ$Fss변L&P6uwxև̢ƗBcv."Yz?Ph2:cff2j0 Ԥ׳(3* ee}~}ñc UdzKZ љ3ȨeۇVj]`z0 >)P$uEP& cZ<P%8x(tcӐhFs`OEC-_nzfYǧ˫ ~l;w/afM2>LMsŗ`}*љ3{R:spH|J>vF{{??+F044t -6]7;7͚۹ Kpnn yS? t/IENDB`error.png000066400000000000000000000031561326020644600311720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/32x32PNG  IHDR szzgAMA7%IDATXíyLUGhp<1(5`2"D$Irv+W;G&MÒk0}nwy׮L2AqnL['FlA"τ5 HLO9s.__ !A}R<`VUB!!@|<cFv?i63̮ٺI|gg;=(-hvq:2giS7k䆈Wã ;aa@ddN0m к5޶ldG 7[!WE+Æi.]?? 0 6''cH\eFV8x>`4H "w)u72=uuI5ZoDž z'00]s7d 㬮 bB`Zq!̒L,r\\~%F8|HADFV(|aBq>ٹsnDllKW DtO]M36\,_˂2,]WWomV{Yu2(IENDB`invisible.png000066400000000000000000000036361326020644600320300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/32x32PNG  IHDR;0tIME$dbKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDATHǽ LTWEAQتQ,2e@H%b( T@ֺJ@ ̀,ʢ ʾZO}ƭ(7?FU3hى 6WoQp0k36bCjAss'٬Ypqn2a*D{ n>zToT)SI,7U8'5FD;L干ɓǨ|a=o4mDcTbn@`/ \O/yH,-cKԆ ~BBDZfk{X;z9$n3ɍ4OY蠿Gn9)%S$aou9CHQw̜9svjݷol۶ 6l+W:u[[[옯䨑~= |V+9MñBQUc_3À(^BBBijjjٳg!..<7nTl2f9fDNحG6r5Θ)!eA'`y!4)O#>}c BSS4440'OH${]IΤ WdhDOGH,*z.W U-'mabp8|>.<88O>:ec椿í}%;oaq5 Jh'<ʬ y/TD"aBTTT@ݻ/ n  B]o>=Q>Z%rGUիV! t^#yI=@TJ>TTXX)HKːI!!M8Tɶ bb>> p}kU… ;.f"8pT9ߟS$aXDc͙c{1Sp yIENDB`muc_active.png000066400000000000000000000020331326020644600321510ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/32x32PNG  IHDR szzbKGDtIME !sIDATX_hSWǿ?ƴ)@AX_XA&:Ht/*%1= BY D02(yrL, ,q611'瞳MڤY sw~oH#FCCC\.5pjsyw8yXoo`0JiSNR}1 ?sֺ `@C@)Ϋ2{Rc _-'ccc<^ ?>߿f4R/: ߾Ahd鱩`VȖ =Kq@s'J fwŭs(,$I'._ϋk:[ȓv)@)[͝uJuz 6Z)شBXR@@jN^J "l:[nT i&A!kpeaffq4MضW%NL "H$ "=u*&uEoyi"NRN||<Lm+$xOX:V}v~~Cz#lթ+E7ݟ8{Z`6L_*Iet?|>_XXC>Eo~^էg=_s\D^hW prp8YTK-Ӡ[|^g^._}m+ BSl۾ s&!ZKԍ֯OR8@RUJW%@rFStvvsss|fFtD0uwa>}9˒2 VXb:pv 8bL_\BѩҒ]zQݽDP"Jٮ @Ad4}SvUu m#X١:v1'˦옗(7,k KлdBBIENDB`muc_inactive.png000066400000000000000000000017761326020644600325150ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/32x32PNG  IHDR szzbKGDtIME !sIDATXVAkF4,ohR C_=RC()!R989l{1!%罥? ǰ*b\[iz$&i9`x|Iݤ$A[[[_iְmSclR+I6|>BDspqMD`0QJcl,c^4J)l~ $Ip]w"U loo(Jc8Q Ifff0??GZ_]]5(v]WWW8==0m/)vCUPJj)B88AU4x\HF(LRQ&3q&$Ɩ S|yc < $T JR لI D7#@cTUE. vF*j˔DH8??gggg Ȳ|8X .Wbj^i0IeY!NG Rf|vv!mAv#J19nnndx.$IB6nw$acrpp8 b68瘚c rĒeNZF0 fYVb\ X,~M)m}}=jiqxxط,GuOTտ`gggEQUUzGJHDt:*!@u4A|m3M{q~*Ѧb~scRTg2to<3gBA¼a VeT.K^# # (8&Z PE*QqT!BKE!XTQ4MQdQ@SA*.gjj]Xl˼y}B8Zbc g*LLꜜ$C8j s A S&ǸuOajZZZf =U;)mlv7z{Onݧ-^,{xǻUA~rGp+X3'Lݎ6ʸqQ^#;@ ? ?C ƆܢZj}V\I۲p#`Y܁jH"&& pA,xx^DU!J݄Pw(-,kQd]e#o4-0F ;Xt ;bXv5w=>N2CaamI?1PdZ(0ylb4.d]*Ӧ? |~+=dC3Jm++Cl\2}(--YX% \YDBJ$dLV!?';t#e :4SfL݇tLP%uRKbG+)!Rї+e>bk8z&ǐ4hiLwRR(LEy:3yB@H@GK3]8+M hkP(ر%HO6w*cViɘXh98RBȖ.ggJ[Y*/ٳ/A;~wĜ]s[PS#ͣ:O7.kk"¢'e)䂻;@~>@a!UpYSSf)}4Syxչz6Ûc{'@ |9 S*< ̠l-ݶkN݄ ׊>?aD;w¼y̚T1/s8F7>h2VKv!,ccAQOťW̟ tZ9f̷x4c}zˠH5#s#0P}uƌiUzz.h- ,s_>ugLgEo|mIUcS@im]- Dh.N4X(+_(,ŋbc󪺪?t{yA@PMEnYiI (ixV2gPнj۶.~[,Y76njg1VǩS; `9z-@]`,#G!&=$֭?;`TO.韯ž,jmqZ^ `vǡq͚N{kg/SSWɤI dDk`GY9.bAK1_㽏m{ͣqڷGر_&%̜ 7s(]138fh[Sg2SD˭UQ Q9{7c#_KM|354B|~q6ʹx-5j}`y!*^cRIENDB`offline.png000066400000000000000000000025161326020644600314620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/32x32PNG  IHDR;0tIME 0.|7,<bKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDATHǽ}Lu;w&@)B$¡h B4|ej f/?GJܒw{3<,hƳ}>W$|V|2g#bWupT!WTT;Kx&_{tKW$nh|8"gIUڛ3m7}&}\xR!|3LyՄV+cm%aIG"bi-&/i<򺤰逳gǔlU*udq 5^bɰkr,ݞK'fcԬ]1_]liIjLʌZ@s]=X['`?RML,JmTmJyY[V]f`Gh':Jp/G((!v mdR}GL]ӃU5o1qPVy6M" ;-T{]Vo'5**ڏ;Į\6=u}Xkx^K⨈[rA:,X3˜s#qC(]tc!;p~F.#g@RI2_'Cb:Pǭc[CԪADdd_&~b ~K?_0mkG[)X3 $3ʠ7O1 R:9cb}+1G抝ӝ7{y,O ,MD9瘹//"kŀ)[?A|B^kIڽN(1W^$w6G7tQn IENDB`online.png000066400000000000000000000026071326020644600313250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/32x32PNG  IHDR;0tIME iebKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDATHǽ Lg{-m) ! eLe \1Pl\9F&NYl&[2&oK\)&+7ֶPvήJfHHrhϭTkdVw޾Sh{;^.wH8vlm]7W!?H--zJd^x1^oV ܷys{ Jn(d66!n >? mJ*+M+3{LLtq`K^8~3xt^A@8{NK{-,& r9m"7wHx>'wrjSSk!l M"#G}0s,Feil>e=ɩJL=5LZATEFU RPHh[|( O8v@&3SxqK.;ߟjkʀS9U,J8fz <|߶F CKmlzXZnL5 e2e0*7j-/7MJ̴0cb"$\Fx>;C#Cu-ںQҩ CW*qni[z5}^^x DDrD2B\J61u3P/jm?Ot:k#7~=n"k6e@]^=DCM驀.K=ܾp V쐘ECxEǤx;8CD~s0`mI*(^CG/-(X\WfURRU!!~~UCC `FGap 5w۹7WD8 oo#*>_u=Je5IENDB`requested.png000066400000000000000000000034461326020644600320440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/32x32PNG  IHDR;0tIME 2 f?bKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDATHǽyLg-H[KP.K0 CE%NELă( (l x fD3,% NE]W Ø&Oھyz9MçJf} ,_C9#Xx/a3riZD>b,%VM"3HnE=cb E+5qȳ0?6)`9&0Ldjm_ qkb ,[k5ksw5 8LÛ<#)p9~J\uY?MP蹅s7 L!m,ںZ1;*=. nAΡpEoW@biyh;}b.!I_2< ?9.9˹R\{>,oB{8xЬF1"C\ èi8oEq6~&X 0! >s%_(>9|J?tֺL}P6u!ފNPAco{dNnR"{LVr%SpY,\T '0v sXG5*SW쉶wOT>H%wz×)bǏwu p7|g>)@*P`U!}?gx҃W+E-ҽHjAdwkTX=&/Pnn]\6Yp$_ї( WqO+;;bffHvt|՚= ?ǯ9C; I5q:>.>Q\:+<U;,jѬիĦLяa4,"zb0nG$1VފYG@z뉇P MH*b.N"qF܃e1_#}h}Nlfz>-oZ8!G(dA2;cɘۄ5rqipS*J7eFIENDB`xa.png000066400000000000000000000036711326020644600304530ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/32x32PNG  IHDR;0tIME &FvGbKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDATHǽ Ts$r QvT(MyN:=vC7q2tCStډB aBԲ$$($AIp=XYa;~<'s{C)|^&>d_zz#eH1ՂKMܷlْ\qlƮWJr+?|gjUR ڴt ۥ ^^D~p>E 2&ssO@`&&3w7en*$$MdI\Y^#;_jJ>{-&gSΛyԽ:N.ޟa>76Za ocZ01fXm(ړуw^^T&垳g7|~!H*iɄ7I)J*YD̓rr_ )czX}u7G`SP貲s:wd]GQ(Ь%;˦QxzaWw=ʠ4r@Gf-}W(0FȆ0d $2 5d4n)R1!x)^dvɸB"(HU}[E_P.^:O&6vlzK9z4tڡs(5;vv;$mgבө TD>r_CiSR2EYǧO'6^j:QqR tЪuBAv)Y4voH9iL kޔsBp N,o L>ck1jT mwBmt ;Bn|ao8 j&1TcúʔN&aJ?\4JŔꁙ Tת@kjj'$XP&$T< |Qo[q#2ئ@o!fO`4 Ϛ1Zw [h>s{\,fܴ{5k|bBF8&ab 9dX u-|(I$N4tXQNVGFJFmK.G x#U?F=m.p#15p 3kSnYD&Q7[)~VLqv2`_֍"m~Ǭ&ڦ{zj?@v*.(diki.*b,bw x7jHŷH0fv>*P&t)T(*[wjJ7pDABї\k cʦ2BU`x ?6Z+pD?BDGʼn k4re20Px' jOQWZЦnņ(pA: GnPvkU,cGV. smҥ }ZK;}ӹt^ͳF?.i7L]IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/48x48/000077500000000000000000000000001326020644600274235ustar00rootroot00000000000000offline.png000066400000000000000000000025161326020644600315000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/48x48PNG  IHDR;0tIME 0.|7,<bKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDATHǽ}Lu;w&@)B$¡h B4|ej f/?GJܒw{3<,hƳ}>W$|V|2g#bWupT!WTT;Kx&_{tKW$nh|8"gIUڛ3m7}&}\xR!|3LyՄV+cm%aIG"bi-&/i<򺤰逳gǔlU*udq 5^bɰkr,ݞK'fcԬ]1_]liIjLʌZ@s]=X['`?RML,JmTmJyY[V]f`Gh':Jp/G((!v mdR}GL]ӃU5o1qPVy6M" ;-T{]Vo'5**ڏ;Į\6=u}Xkx^K⨈[rA:,X3˜s#qC(]tc!;p~F.#g@RI2_'Cb:Pǭc[CԪADdd_&~b ~K?_0mkG[)X3 $3ʠ7O1 R:9cb}+1G抝ӝ7{y,O ,MD9瘹//"kŀ)[?A|B^kIڽN(1W^$w6G7tQn IENDB`online.png000066400000000000000000000026071326020644600313430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/jabberbulb/48x48PNG  IHDR;0tIME iebKGD pHYs  ~tEXtCommentCreated with The GIMPd%nIDATHǽ Lg{-m) ! eLe \1Pl\9F&NYl&[2&oK\)&+7ֶPvήJfHHrhϭTkdVw޾Sh{;^.wH8vlm]7W!?H--zJd^x1^oV ܷys{ Jn(d66!n >? mJ*+M+3{LLtq`K^8~3xt^A@8{NK{-,& r9m"7wHx>'wrjSSk!l M"#G}0s,Feil>e=ɩJL=5LZATEFU RPHh[|( O8v@&3SxqK.;ߟjkʀS9U,J8fz <|߶F CKmlzXZnL5 e2e0*7j-/7MJ̴0cb"$\Fx>;C#Cu-ںQҩ CW*qni[z5}^^x DDrD2B\J61u3P/jm?Ot:k#7~=n"k6e@]^=DCM驀.K=ܾp V쐘ECxEǤx;8CD~s0`mI*(^CG/-(X\WfURRU!!~~UCC `FGap 5w۹7WD8 oo#*>_u=Je5IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/sun/000077500000000000000000000000001326020644600253375ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/sun/16x16/000077500000000000000000000000001326020644600261245ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/sun/16x16/away.png000066400000000000000000000015531326020644600275770ustar00rootroot00000000000000PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8mRMh]Ef;o6OlLlSfc)*X(? t#PE7Bp#")bq&P*Z\HuEb[H =m{3wq|$gq8i>ADsiq2{w>T*y=tDrν@uˬya4%xVN6Gwmtg;Ѱ?3GyWVk{}&澰iq-c[Gw1//?{Šolu*?)׻^ w@ '叽#psZa~P7үpta ,2w"lr ٳp?, o@t􉷞 g3;BFDN˪}w7!~xO_ x| 1"sH)ADp!TK˺$IsH)cD$`!s0bY ! !Q?BY!$1ZkeB Mӭ3㖁8c眫( Dep΁BPeB1X!.&eY "(P`R {cBXlaa!j)eB`s,an1*cM>551cι17tWsG_[kuuc0TڹVÉKKKOJ)g!RUVkxIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/sun/16x16/chat.png000066400000000000000000000016401326020644600275520ustar00rootroot00000000000000PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<2IDAT8}]hey4i5bijWN:AE Na/*ɮDKA(ml Y`/Jn:7ݺ6%M7GtFD5秼ddhbhSTDĬq) {һiAxh3mV@OnB6HX闟U#啓vhl0:l rU1#;H`ܒ S Y<!Zls Tu%e?9E/`_s͝WYEQ2cs=(]ZǢC#& fQK2o j--=I,~2- ASW?w57Fa|@ů e`}CsLdo4ʥ$+WLox+ lG˃|\㙷囷sL7ns4,+\Tm8S1 7-dL(5'UN乣';hWo[&:2z 6Z8[`Vɗm!=Z|0v¹z7@.x[YXf>kg-j>={RNr|qp/H׹ƨSwRC"J]0;51F@8BԢV+j( k?Z5 Qo؏(k߭pI*DGWɧoДܰ\%CDU33/%;FIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/sun/16x16/closed.png000066400000000000000000000002341326020644600301020ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME/u)IDAT8c`b2Qj.a;H4Q@z=VIENDB`connecting.gif000066400000000000000000000024341326020644600306660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/sun/16x16GIF89a= ! NETSCAPE2.0!Created with The GIMP! ?,pH,Ȥrl:ШtJV!e!! ?,5pH,Ȥrl:ШYY>ay$1!tGiD ۶'2)p2BI@)0 XݭCF@BsN)fY2.G,kzy)B($2n9Rbދ~T*@DD+"]{ۗHOgw'wAs}Y5%7v/)Ϋko0;h~^ƃD2wO'զv>7LLD <=zn&?ڙ h&M>Vj}0n/GվJ ]."­K#ށ Z8ʼIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/sun/16x16/error.png000066400000000000000000000014771326020644600277740ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8SKTQ=Ψ)ei A E~:j>2BD79#jFBTtr,"555%Sqf޻k3`5>=p9 "?mae˿8~UM*sԠ0so&6 Q+[3W$=dYS="@|8.-9i0|>T>Bx<mM*[qLV倸`KdN@D;=9-.159!#%)+.2!"%',.ԃ % !  T! ,A;>9;=7*-.159!#%)+.2!"%',.܂ %   !OҽA4uS()! ,=A;>79;=4¸.159#%)+.2!"%',.܃ % 鈂!   7-ӁLf ! ,A;>9;=7.159М+.2',. !"% Ђ!  ! ,{?:<@/368;-0  ;= ¬9̴ϊ.؂ 㾏! ,?:<@/368;=A-047> &)-/1 #$ !"Ç!Է׃ބ! ,?:<@/368;=A-047> &)-/179 #$(, !"&*҃!#%ٸ! Ň(@C(;invisible.png000066400000000000000000000016171326020644600305440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/sun/16x16PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<!IDAT8]lu>3;n ei]vK)!i6l0bL 7C!h"XBRJxZ 3ӝ˃}&_nrߔnv<9ǘ>:9z^0R9}iOZĨ5o$ɯn&Ȭ+~ml(<ǘLIU%rɫG7[)-O1_ LX>2>STj\}(r慆C=K{v4NV'HݚZmҒU)\ǩ#DwzōLO::$l1E]@{g5'@1W! JI{?_ wν+s.-F5 -Me% ;D 51XdUenF++Dqtvu!>ϑ_&/PJ)JeY9~!&ݾE@VӸ`tU/.1Vm>+':/k,2JKB&5g#eo#cv5gm;55e{}vɮ #"cL (`\sBJAU[!a.7)#B'A6nR?lc!Jc*K.ݛ$.\.s;DSz@gD$׾KEeȵc Q]?ڭVy EnYfFenS.ozÐ ,.eRZyŭ2,˞ΕJ6ŢX,~\J%ۭ ð#c b";Ft:U$yZ8gY|nZfp8TE;i4;j{ދW zNjz7L6)`HD$>t:7|_kWZo=N dg=m1缚mo l)IENDB`not_in_roster.png000066400000000000000000000012501326020644600314350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/sun/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<%IDAT8kaƟ~ص-E-"do.A"RA\E)5L]Һ8tHl%WҴIyR8s9,gRy ec̓\6=Y foO'L}kk^uEq@enC6={K1楔 ƘK"Q;;z 7j !1 i7B%wM֢1677a.H!Ľ+##n2yN!0@k 5h6dAq*rjC }})$AkADB@E" "''o"`as~8` \ppơDo9~ a/GZbhxaJQ:PB)(((zF(U"s|'Ϳ2~%T]9i?qW]gEG+:?…; ?=r>:)\n RV ^>I\W?.b5o,%/yvw])j/0E5wwًYwwq79* useo1Ɗµ+n*Fh'z!RM 6 ZAaid[߹ϯ+ PF ׫lOɬ<(5j"xA޷ށSqVZ^NMf%pʮ[{6Pҧ.RHgiZ6g +IqTK<=hXmP8N0V;IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/sun/16x16/online.png000066400000000000000000000015601326020644600301200ustar00rootroot00000000000000PNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8[hTgns$N! CZ-)B@Kku[1&Q|V/U1jTTWҘJAQĜdaa"ǶݼyCS7ޝL83|_ip//YtlgƻFO?(Qqy SL)w.\&f;3I, 'VS9\[og[F4,+[Tj٬KC 5o ]"a/x뉻fvuhp*|ϖQh IcNP[b4|{LS'q#"1>,˂(?E}7MA4 @)E, }J@ y?ApR0.<ϫBxt1q&A 28 ÀeY@u88!ATyȕWP$ xq@immeض u[C&eymCCCH$PJ `fP(JHIEض ˲:<&''c1H-MMMAX|"Z%IjEqθ{VY{s0JiۇG)@__}o[zI:jR`H1nZu2׃ǓaI/4!_]ߺH1_!0qKwMw=_RQGj8|ME-D ,<9'''NF!f'Tvc¨F=Wtel3ˏ^* $>@vKr-mmEiS?9lIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/sun/32x32/000077500000000000000000000000001326020644600261205ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/sun/32x32/away.png000066400000000000000000000041071326020644600275710ustar00rootroot00000000000000PNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<IDATXUǿ̼yov..]^aYRm6iP~1D-Fb(4 FI$[ E$)6v_k`fAg-]Hf9s}k-.Įk|(cL|?zԴ:hMyl&z}_7H# #gHX8T7ĉ닸n߬o\gO[ƳSjZ;+BJVq3LKn >q܇F:X2V{P# 5V{ÎI7'R7wq߈'Zظ#;ss?Z.w? ΈF*XH.q.C<{7,n8n؟7–%wG@4zӭ􅭪?-_^~n #*am>v=l9y:M#9-@sCn `d3yէ`j`LaMT ZѦ1Dfg}fF}S6.n'OladcFЬ?BGΝ%' ˏRtqίBݫA@mfnϾ1LN0;E0;`3eavqE.][]R B(}^szLa_pp;;Imӯ[iFTcSq$Zvxi s~Xka#Zuo=+aq.[M{`ttt7c쪎JA@k5!@./6k{9sʜPSE1 {ry'}M1:=σyclFp91(93 [JiJ)aaӡ }8Zj!"XkJ%Bt2}/`Lvscju7t]wI3I)58Ngsf4\bKK@)M3NܑR>H10 ""q(`PFB(HI2g+B)cl-oJ)ri6IfqCk 510ƤPڴTY*qTUy^*qBq]w}Bspg8NesqV* `pRBHBR_9()eBFVƘR^hZh6Ks̙IR3L9.؆ 9̀bKD^p~\xPc`!B7Sj g3~y.`;#@@N@kؽ]}8ƿ>XC_\_|Pd6l|P 0OxAP"+l!¤Gt+C4媮8* ʤrbL'g\cf dduTVM)}T*3DJ۷_],_l*˲ @$8z苞}>O1<<| ch4RT*ge˖E^r%5M!RJ$IJ):>|s'IPJqo AQ̠^?^.8+m۶e2/_t`A4H)l40 Au$I::8Vrk5M Ik6ls `֭-AXD>O09mhZ`!IDQ9BC6a8-9pBQ!E7n4M80 s4M8J)6\ׅi0( E`*e|߇}}}PU5na\{Zց|>˲`t]m۩6<΂1 5VJ)z{{a6!i.'SJ`IH)AA` J)jZZR&$@. 2 TUE&A.KpΧ5 \ntRB 4 R UU*h4Jth48)Ia`ѢEhi^BǁR,YRm!4MK4 i""!p,,c,/Da@Ӵ(p]4(T*UU^0EQ1(*$eYP\.$I i8[QPJ1;;0 AADRA^Oq:RDR$$ز,q 9:jcm;5l6{[˲A0== 077 @) h]Ӊs(9 mu='Ŕ.4>)ݲ/XhN?/St:kߗzȏ`j0ANT~Oar.p/y3z`]bZE鼋~BZ0}5r0/CN̚; DJ@FңR8 [grV؊n;ހ?p~cr# YEa^(xgϥ8MXgڱ^J)%+?(+7_}țԞy Fw~s3NAs bR&;߭aS4дwH9S;]YK)O5ᡱe篼@/`S]9x 3s?wi>K⁁7@(v߭koQ$PWϻ8S%yOv{_|V$^zmF_~S~]%o2\IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/sun/32x32/error.png000066400000000000000000000035151326020644600277630ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATXmPe-KA eL$mqJFNIJɀZ-N211:6uLD% "/L@KD>vhs9s#J)" 6 UVwȷWTGGl@y sr&k  SPd-/ 4$LKG R{Eug!VW(:YO J/BGZs]݁ * r"Q@Jj>y 4&<* 'ifBͧ>^ B A΂1b c/AȰ/1>y(#t]@9e5y*Y8N<Þ"3xLX(om$zio ǁv0xxDEE➘+©,Ҡo^ܶ308_h{5#|qu%( vglP?Mީj^uW63aǻb>J6SGq>pYH]Vήnsק뀁[oJ>.sXOo&رCn[_N f(cٵr[мX ZW*eBērϷt3qK~vہlLssg><Xl6@ dz :m>CzęKٸە=#7lbD)_V,IL$x~ԽW*b5 @D1ܮ(d<3ep/o#8h2_Ӏǀ#n;v*-> P|@lT},փr'Opqxx˜Yu;GߠW3>p]oCnc /9pXUiw/+v_d]xݾuY 1 y5.M)R/u[4w{^d9|E#j{5Řn`[ӪUE|Usi7"tRg+R M\3h\>qbc'֝OsYM hy? L]P[@bvӟn4nXևךHNN&66rȀ@ @P}ߘBXSՀΟlxw ^4y5kc8ׯYUJC|΅lbGL S'**S)SK?Q(3|::xm_gjvX> / jZ]5nqX~lIՄ$H@k&S^LRKfۑ_2 Uef/zzsr.9+ߘ lUJ!O`duL[ڱC} > q *MAL0 ynu&a bazf~3w%s\EW;qr@c]&!+0sOe08#C}خRyMX=/)aB惑5ә w~o 0gcr$@H[L]T\؄]/ `[b- @P-XmFzgcvjB+ĈL #m#=4FR/[&9L aCC;3o8c) 7~ku@ }R-z#u9 }n#`p ;g.YF曊[ 2p]&=uDoT> ,ԯ\S6m,ˋnHH&[~q\Iսa`w\nҢe&}rj"+7>iծy c+zu;gTs6̔3fT*\wBreY~R0& q~N(AYY)ƎCՏ9.Ѧ?yJh"[?k,$Zf1EIǦ+y7@iL%o/5BGa4+~V僔k@d! ] 74y>x*uǑS:aDOjD߿>I^٥ϲ]кZjsn媪e7n@l cM@8isM@>Kc* z@$9ä́ҼUV:u*پ}EAP S,!L$ErZtm"P 1c[k֬YEHP>pATX|$3u 1ɥ6zyW$woesPg%zs |4 9\ Q_<=gfdocA* ޷M./}ns;Es!dѾ!qJF9UҲI9rB%Jk$S27͹Df[E#ļ1&L#np=0ięדK(`` EW ߃N2oDQ$a#ʂÈ*0cfpX)Cݷ*"b »Ύ?0(;''#oT^48@79c{M5mԎأZk|Zf WrzcuI< "u? =CJ4@& MP|k V7{Z {=wo%J8(( BB?] ʙ[Ђqto-tM6x,)\z*>z}G7ͬD 2`EJo~ttL"+Y'/ QCEy0$7S'N%|@&24v[ N#I ' :}ZA'D]j|]p78{/JzKɳS"Ѯ"d@gТ ?%toI/ʁU6+)d9qVXhZkA߻}gd0͓_ o_ȁfc^ P&}9w:\vO\۷;ݯ@ 1TS@¬|fW]#ք*J`F3]9nkT-$]JDtLKPQz$# F]f$|]:jA ~ Y9 34pV=5g~J& W_ԴVm2+mذ϶7IgM/gs?mL={m}옮/Ca+okɆێ?K埭\q/Ue IENDB`muc_active.png000066400000000000000000000020331326020644600306640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/sun/32x32PNG  IHDR szzbKGDtIME !sIDATX_hSWǿ?ƴ)@AX_XA&:Ht/*%1= BY D02(yrL, ,q611'瞳MڤY sw~oH#FCCC\.5pjsyw8yXoo`0JiSNR}1 ?sֺ `@C@)Ϋ2{Rc _-'ccc<^ ?>߿f4R/: ߾Ahd鱩`VȖ =Kq@s'J fwŭs(,$I'._ϋk:[ȓv)@)[͝uJuz 6Z)شBXR@@jN^J "l:[nT i&A!kpeaffq4MضW%NL "H$ "=u*&uEoyi"NRN||<Lm+$xOX:V}v~~Cz#lթ+E7ݟ8{Z`6L_*Iet?|>_XXC>Eo~^էg=_s\D^hW prp8YTK-Ӡ[|^g^._}m+ BSl۾ s&!ZKԍ֯OR8@RUJW%@rFStvvsss|fFtD0uwa>}9˒2 VXb:pv 8bL_\BѩҒ]zQݽDP"Jٮ @Ad4}SvUu m#X١:v1'˦옗(7,k KлdBBIENDB`muc_inactive.png000066400000000000000000000017761326020644600312300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/sun/32x32PNG  IHDR szzbKGDtIME !sIDATXVAkF4,ohR C_=RC()!R989l{1!%罥? ǰ*b\[iz$&i9`x|Iݤ$A[[[_iְmSclR+I6|>BDspqMD`0QJcl,c^4J)l~ $Ip]w"U loo(Jc8Q Ifff0??GZ_]]5(v]WWW8==0m/)vCUPJj)B88AU4x\HF(LRQ&3q&$Ɩ S|yc < $T JR لI D7#@cTUE. vF*j˔DH8??gggg Ȳ|8X .Wbj^i0IeY!NG Rf|vv!mAv#J19nnndx.$IB6nw$acrpp8 b68瘚c rĒeNZF0 fYVb\ X,~M)m}}=jiqxxط,GuOTտ`gggEQUUzGJHDt:*!@u4A|m3M{q~*Ѧb~scRTg2to<3gBA¼a VeT.K^# #ȓ!˲"1R41 ") ]~u}Vb&{9s= 54Cq/dWoI ~1z@, V`ش);: 5Eg:|#1pbB H2p2κ 㼺};xF5L:;sOdW/4g6o3FhMŋ9s6oDs0s6}}J%?:ǀ3鬮$S@xAtxm\av5JH%Z0999_CL:xM?q6nHVXV (5riVu4M&&&818H0=Uu&־ ]SSöm44c(<<=Fk-+Z٠\ŰZ[iniX,2^czzr9p CyL:;#28@ƍQqib&ieYXisiE6HSt>T.$tˤG}yXU fP331~9(Hw#: ݺu}>a22:z=ݪFv|r9LN8{W.tvl8]Fp>wW?ɞ7`e*&pgHe!v(WXIW:::PR1ruy&{n_„*=%LN=K'. 0f+P_,d<IJ XVIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/sun/32x32/offline.png000066400000000000000000000023161326020644600302520ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs::͘tEXtSoftwarewww.inkscape.org<KIDATXkLU߳3יeZQQ!ћPI(bE[6&i"1ioIJlhb1kj",6҅.{vew%|>眜3MpR;j M3zU(*$è$a`jv䕺tҫ5mj$d[}zMnuwX= ?dm9bJV .++_cROQPdeEJDZ1@B]{{1<DA0X<~]45CU9yz{ à X0N%2 PUnவ`1r($Q^VBث5:͵EwC L@Si,4MLq5P6mm^n6IFy a Y! , yg_ͥqlŅ[&qLgL`}.Y:ڨ\$(Bh.t]|^!\Ţ}ε>+EUBj3镘gRbakBDt&TB,Rs :`1cAQHbH7 O-+$ߺFxAu TaDf0?۝~.X @uVX06g XJ8(ڕRۭt1*#)yB؝{fF,!euK @Eu+߹N,OS'KtΩ7׿lTc Cf3qrM$G5uڞ6Db?BlWeoQ]cc#^ze)t/IB`1 ź@3SۯlbpZ<P5U^j)d5YN+ X<4^U1zd g:,7IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/sun/32x32/online.png000066400000000000000000000043361326020644600301200ustar00rootroot00000000000000PNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<pIDATXW{pT}nn6<&4_v'ǽ6 F"ՠoE*4X|kF w&] Ή/iE4 I^o0%U*,=`;GRuH}xvχT֢GET^ϸnK%j~@̘.\#OmNQ"}nCn@V Y{ H&| ׵;벃ǪMmռn OI1W{N><_F紽gL:*l0 Y}/_;C[_껏kgY̸{L\*n.1>z؞uޱvWϣd5£m=e3 jyEM<\崽 u 63'<ވm(+ .{F0` S+ e%" u(VCDu=OAYs%|cYGvm7'Yl<3Wxt{@dd  吮q5ZBwi\y'lOyF8'u4a^]?gȹȑ|N0dO#vHk0MIɚ艾|?gqigc僇LY/gdn|ܨݯ ˉ9SQ"<͸<<֟ke, ~[fU=2d SnށErW> =Kfkv չ,~Ɋ֎4`qDI#)@z_͔इ:qƺ#s{DߪO7?l\qZoud2V =dLNm3OE-I 5 %p3ם!t Ac$Sox=1a)^b?( K#APY)S O#B7F] 0bVmVVG_V[!%5bvf$,4rlx Hg.9 !!A2xי hbS26 j>g"8똛3;וرNU:@RQ Y7DpajRhbm8џom>}_xS\v˚M$yP9RH^ۙFB,)Xxs>{?Y@/\û^W4TW4/?:MLN҉CZqH;AX1H;r 'r3"|YU|vO'Ǿ׸uZ^c!;ӠhEK T<"A$.ȏcqL:s0(@'I ~^\Yݐ+F<负{;U'swMj}J6S޳vs7AEq=Fv0kcgWgF.^^[cuиRD)< ),Q~yZuk}tb{{*߉) ڢkl{}*]u;̆6"?;&Z>S//u.^⛍?Ul7RTu6(gR!,̯M>& 1` W@ ЊK`'._B /EY 1zFп.E3IMIpHk 2G ٸj],Zt_|oX .AyA y!rssZƃM`@kΉ Vs5ZZZ,-l^`dprmVp4o#==p a pΝ=ˮ_@k 7s2PH|ݴ8s˲xikkm bO}O} {/5irf:Dm #ǁWVTew[ 9LduX7@P|`-e0͸>qy x⻝+en+;_[4 ">9W HjF^!Dexwn+x+5|< 5+]͌UF~{`LB%&"LK,*Q9 u151Oc˶d y󩮾7^X>qn 5$щQX ZcN̢R"]gFN8{}FhɒPQ^NNNnwn|qw ۋ}D{Ϗ>Ue$-#^8JIL^^zH$(P@*!  G/!@M s|3Y đ7m BꋬMR1paZ֋Ol3$1V Yp5‹r @¡Y'>iZr0ve|hzπM[CuD @4P $d 5˃7c (`wlKVd;1"I7>v|bpBvWcD Yȶ?4R|uƇG<9(ǜD?sϷvm{mx׃&sNu֍03jnj덊Ԯ:ΪBp:bXQZd}gmForK{xwj-]` eZk׫b)7r(;k35zRZ{TVTdbFǛ8z +k:UUUcRϺVsZ^{.|-~J)ŎQP @k*rrcyPWWe2Ӣ5XZ3q8o+ ˖=BzvRS e&c{p8H{G={bIv\d!LQNC#1~]@|%zJ'QL*;Fp0X }X4l7 9p-yE#Kg47n7v[Ti)fk80N p_m8w=(wko xNn&w@\Bur3/k/TĽ:bIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/sun/32x32/xa.png000066400000000000000000000040131326020644600272340ustar00rootroot00000000000000PNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<IDATXUkpT~sٳM2I@;@- E;U+t,(8 ^i+ae:vu\j-E,J6R;5hB l69g'盍n39{/CcL&#-Ydg2\ B>?5>>MH&ROX,Teu|>r4fW)1 !!pGsۯ|ڸDKKx<EQ IaؔNRMMMVX;E0@)eYe،OLLҡꃭP,C$p_5(ʆ6Ae0.ceY8{,"!"DQPJ|~̙3O- B_4 clff-[p9EQnJ&XhTU <J)A10`F D(ʜ18]ׅiuwtt h4.<σi4;4M8b<0c m<$I,˜9BdY&Ŏf2(ʄmJ)<σm(JB(/ c P$u]^;!(" .+hT*xEQc (0Mau]~ 8@,CE^>v۶9s J}0`0ȩki22ǁeYܡ (<[_ɡS4%.۶a,˂8p]gU*٫!I0of߯,kҬ*۶Y (ːe,#`0I8xJ)DQ$I,3{GllllEQp]# \.ϡݟi}>Ϡm۰m6JM,EdGPc eq@ـlBB/_ iWHӌRzA$J%/ d2V^O?SUU yF|_eHܝP\|GّH$~FoD" A,JB֭[?s8عW6Vd$t:=U~^?{c/Y}o>y-X웢(F B춗F6œ#kӱ|x}9?VcߜʅuҞpɧ`dk5nk`㣚7ڕcly΁@5w *VŝgE^<>М-Y.m;f;{>25 yQ^)CO,s}||DO,B2[:xNﻑ?koQԑ2jlpGZ__plr h~p쮃9?7j[Y5kgqߐWd^+ݐϩ^4+Ib58|M{>T>Rw|V͡E&/-kn^\wCɄeN]9xeʽ d'kw˦%;Z8@P׎:Wr?TM<1Y<6z"_hJ䆑G$SDO!^OoǖW[2X~sJ/:ܻm8O3:!>xN)֪紝?j uPY/@)5 0 Na&1 ]uNәCs~Jz{}}8H/EWU;?/> L>D`OLT6 RcB0[m 2)nc`@IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/sun/48x48/online.png000066400000000000000000000076151326020644600301410ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYsEEKWtEXtSoftwarewww.inkscape.org< IDAThZytEշ=yyI^6FnQlpCPGQ;(*Nӭ8?OΙ6ڢF((FA߾}K՝?^^LsON}߭W߭{oխ/0Z-^iԏh0(5n޶L9F@|k-rI[!_<##䮵UNm%I${11#^ɓǞe@:1t-J3lBi? RyUwn-Q[ k$FB̨32+ox]ɞA$v@z_EfdM9DQ% i>G@2IiAeSKlV}j=Ξ dm{z>Zy9-kx i d: iCG=[z>3p2.GU\?Sd<=~!Ր=c! $]3h (JO ~9\ƤWKAkO ,rNψ3Hϑ5t7dlaqvJ뺶&>EҵČsEQE &/Ă ;nOQ'`w~>n]U@ p] ;X3ڟQ$^[㙘.L)~.o_ E{->d[-B6ޫW^\<;+m( ɍWAL.cg2@f2tq2V ]Ҵ+$8g)h - wKkEJL Ld;JgPM L?m^?L]@N`yVJN7aߕ\ eHj@*H6:Vglz(\,䶚Şf^N lgs*taLZGVtS^72^UWeU8i{^UHdA .zD*04H` tw̺^0^\3"w <xD{ހ刄h1x`4Z(شNN ddţC$Q;^D=G x|3죏|{63VT~Y]< <' ;-xO5e74 ٭fKBipa&5x'u Q/z!@?É} S4h.>|`5&U~t>C ul4ɶs9[t3%r5Rw'Lgx~g G"{NdHd Vw?fx;xڄt-/ϛL3igu!@AB :ID{. S-YBצ:Zv-27jpS .Hm;ʷ(Z(&qr!Es-?XF@,lRPmh[6I@),+n̺5;hfcrrNZ7%_yU oPK\πw)WbcgP B:2k6$ߥ  H)C/fΕeU&՛jkY57ڶ1P\Wk!r=J;F\ ѵ揩F0Q(M J {cDi=$A0 f^H\l%[ ZݞZR;d$rꭨ$&g?`8HxdX"An* @,M86D̳v[NH*GOO{AsTv+P|n(>7/LQ@<}**hS{Bq- a: wⳏ7mv*;՝>kMgI]W ,OwWW.W9Wv q"I~ " ?@D[(S : N_&*jL<$KŽgD&N[`wRf,TLx Sw"EAǛ'Oyb$zB ēy+jKŋm,;(iCVdʼnfX,T xvf-'BT[q`9zoN3%KGcCaNQԷ [)9ɮͣ>p\ `{rzrjG{s&Lؕn\Wh=YޘhJlZ#:g$zz=K"A=+%O L<KBh&W+f 7,K,GccEk0PJ6'׼7"]o IH`=p^ÕwSGt h! sp9woudSY P'`W{ ) uo1jR>9FaDU(H /owi1LN̓P1(q=h{XtSY- {/Gm@zGI\WO= ڿU۞'Xp8umL4mUX TL=rH[`|?7?I2<IBtH.UUǻ46M+n,\djr#TU|ʘ Q+<a~` SN 1g!=$MqR[bKb_< 9?ArIܲճx(uWV9J(WnThH)ý`t[x2\Izq,i(9;f׷0 n:"S#d=r)}Jٚ,2'VJr4GזBkk^&kEir7wyB)bS v݊@ '[2e}/&{{ lKM+پ?Ht-?~/Z:*p-'քi*: \\vx: aD+; UO:IENDB`chat.png000066400000000000000000000015351326020644600316560ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/aim/16x16PNG  IHDRabKGDtIME  (IDAT8}KSqǿv69uY&%t;]]J(D?PFfMP aHW.2e4+p:즶o7)F>˗AX,?GeJ}A[FRD^@myPc< JL&}|y6w\A3ڝ4qJe_dYI"s_;y/؊ԔY R>WTSSH<HKK{(Ym{I{a^I>|\˦â>YRk:PJvuԜR t?l Y5m(|NG])uUOR",XL=4 ~{ u222%775~1;́Jyޔ"%L1' cP>q}KYZZ 2cЩYL|d%ܶ ̦$:5*iTNeU3`B1,KXA@}{k]>z^'.1rc8rqx 3pccSLrL6N^[nfjHFͭp-c<߰]N]x(eG]F-,HhF=v,h8?&HB0yCLԊ(?;&yIIK7%%LW-{Ww0vO7Vv_=;OFƃr'+`,bL唌K:?dF"3CEQ~u ,EIcq~vIENDB`dnd.png000066400000000000000000000013651326020644600315050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/aim/16x16PNG  IHDRabKGDtIME  JIDAT8MHqǿ5 3s ;z嬮v >d5sfpTVlxM-mfcvt!D 41/y5;&XPu@@UP ޷ۏQGժ++p:Ag0 VgB쪪*@j1h iu~aQ& bpx p$˔si頄ne의d_݃,FRTc=;69ق`HA$$vN7w?Μ4kuyvk$k%1llnSǾ,]˹EUj(XmhlFIk ߜx<|$:oG|/},Z}%%d2.WԸoy<yƒھvjn~@萧Ȍx>`\$*;~7 IENDB`offline.png000066400000000000000000000014361326020644600323610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/aim/16x16PNG  IHDRabKGDtIME  (IDAT8_HSaƟ;gs 'sQJ023 $ų]tQ즼 ˮ(*ɺ0+2 *(+rҲ9Ν}]D <<b,B466B򫕞IoqH8Ηth!y{ 5fY9k+c8`oL@(ڬ(#d) offf7o޲ o?@ 0R)(io;#9]>T"!HAR!DR !C Kuvc: ÀC*r&{}z׭`l߶CZ,XW s9pCui=洼Oea}vj7H 3w8}(QvBj ?~h<}X+t_XXZLݍ ++xlԨpn۽dl Ȳd:,[ZZ-.W9I%_ͩ 5GTWWjwﬨ7zȲleuuuzA,2<5\0[v[zs<G8F,b5$IGNqPj䛔N%wY\qW2Fck{{_n\EWBLrP6B+A6W:6T`|IENDB`online.png000066400000000000000000000013651326020644600322240ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/aim/16x16PNG  IHDRabKGDtIME  (IDAT8[HSqǿ}% I(PTD>[hFQ B42E^1Si̲ >~bri"rp(&JWW/HriTzJ͞Rjpz.@VYUMy>oR|0)>Ԕʪ6-lb Z"A64 sXP .'L6xk=G ϥ5߿^l̶h?U}kYGK\a4n~`oQQ)St7* 1d$ʨnhA/I-SNOqHr 1"a(wMF +:ƸT3am`dOr:JZ% qzDQ9r` xq}9OH T 7 |(@8_t^^ˣpy"2&33G޿axs<0a"y94IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/aim/32x32/000077500000000000000000000000001326020644600303005ustar00rootroot00000000000000away.png000066400000000000000000000031471326020644600316750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/aim/32x32PNG  IHDR szzbKGDtIME  IDATX͕lW?mϖ[(0IY[Rmt,:̄ aq鲘jLHLTٌn\PjRҔnn[n{oGo}}|s?6q۟b4Xٟ^e~|(ރX)- o_u~)7w9]V#`]G$V7R]tlbd\-^GZadσukjʏX2/gæHM'#oE9ݰ󓉾:yg<7d-ӐC OKzkn'E=/'yU82L*[UF/FηZ8j{h:"_̩^;9ܣObښ_14mT?;ύݵncۦđՁoq03}0bq}.dGG.bHïa))k QazO93_􋍔IxmN骘_e@@P[azl~')K &|T3f[͍f*1[HCƉIENDB`chat.png000066400000000000000000000033701326020644600316510ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/aim/32x32PNG  IHDR szzbKGDtIME IDATX͕PTǿCpB . PubҦNf4Lbu3G?4OiɘԦmm.+K_V²n`w{@@NΜ9w}{1;߼C>"UR_׾n]?נY"w:#c,M-5 `]T(>@4U@x[1R}FU:bq䏮nqC;D1@QaMM!!t(HyBS6bK@|a>.Q^V, E|~Ap wtuu lx/ %%uow.Zn2RsJ,n,I$Ir1J*鲲Oք'T`$ Âay,CEȲaq7lM*U}ܚi"b4 R<4@V~VP>č6B*BCÃ%T ÂiPu$ADpG?i곇*Av4.N׷t,@"D_6FS!vWTE MGJ[6WTIX5@^^S+μT2fFҫ0AEy%V?<σ@A ~#l^$飯5|bߏھ2Jfz/Ǩ/AZ'ߑ17!)8p8:HSy D t!ij6uDžO>K_6fV̋-^(==W$<ĠE$K+6oD%`(*4@/_x M"(Bf(Y ,bjY(vT<ɲ{rQ#~Xw6zffDDij@!F"?Y^TmܨL&"ed36{G:qP:ɸg ܹs]`q!e*P hVNxYmN;(Q3_w􌌥 ˏUiq+ vDm>~`}A֠0c1 % E ~t`V?9GIENDB`dnd.png000066400000000000000000000032151326020644600314750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/aim/32x32PNG  IHDR szzbKGDtIME #D\Dž/IDATX͖lTUǿ7:#m)Ï`\%VlDeݬMm] Ԩ"(ۘ&+1٘M'Vf,S23{޻?fS%'9/{܃kkC[Nlʠk@bzT#W tsݾn:%oՉ)@kKSW 5o^~%>5~l9{x̖wP _tIv?U $/l.쟯tRhE‹N[ P }c7J> @fTv ' PUe9 SI욯?nc#^іUqjbso:O|-x ?{*e$gOgPBcv."y  {oW<@Ms" x#+XWw\cʥ0I=-\Ut.@MMOP{( ,@i(0;@VR(kLC҂#tW$U@.ϽCh, xp!#g&opeC*ci&d Nk: =u{{r Ƀ0>Sk̛'ڟEiMe͂a UW7++ w˺tp\c(d݂pe€8p J5oa\E( ]t:u:W]͋%%`b==68ema0 Yn@1s p̦ \X͖v/2 H4 edFp񙕸zc2σwW8Ey7brl1[$tM3 ^5 (6i$ pX9%-X ;zW:EJw$a8n7co)s놺UUPMˎ,e?`UΒ>ko2VO\ر dlDHIc4/[Uyee, de׋g%d!S`+֬)qw29<O sb} ˲SJK=+W:n7`$ix$0<3`er;_`X ǝ^/%ӶT Wi@3?{aĂIENDB`not_in_roster.png000066400000000000000000000032451326020644600336170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/aim/32x32PNG  IHDR szzbKGDtIME '-GIDATX͖[L3 ,{awp1f1ˢ8qkY-GJ>ҨUD5jF}*Uȉm4 ^ 6p;osN. /qHѹ3|كݞ3*T)B_um;vB \:C`jܾj }QHyzճ SH4,TN4HI T,ÀRH$H4o1Zz{P*ÂC$I%p VOW DA\!Rȕ E%=i=jryez> EJ%Ȳz#b,N~mJEyO.eL &L7Za02:! }  W֦;=Mtl Or\xNT ]:K&Sl4CTǰ#G s;Z]?ϞyFyezp, ^Kk?">BNc%>G2=>HnNxsgOץi,-/RB(l6qᝋh^SS4gs˾tAR?NUuHh0=s kp:>dTdd2Yd3Ϥ1gx1~v6!bA(ZVEJag&SV @jL7G)G PE.G: [X,B[TUS eM 5ՊylRYe,+1`% C}s?yMUPERH:S_fS^~]VeYf#,Y@b=љLƟ|VjWq s0,({wwq:7ϝ;WUjC]ݔ*|,@S Na]JzrP쉆ķul>u7g!2xCX-ƬAHRxp83zv?M‰cGd pu0|y$ԔgY 9y=jd-E|P՛?gBoO$\rB(Ԅg'^7aK"Q/]9\6s?:;0|y$'Fb­[(C%'|^7f!!4 xbѐabsmmmUԠV/%)noQ18Yofb@G1Rb(#O̎)kҏ;tv [c˟3bS?LPZAГ>*1DYzx  1T\2Z oL<UX Lffg3r/bvu ]](^]YFbA֎f.P.N߸95VNSTb\5"AEivZtk`V_XIENDB`offline.png000066400000000000000000000033231326020644600323520ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/aim/32x32PNG  IHDR szzbKGDtIME uIDATX͕klT/{?v6l?vQԊܖM\\EJЦɗF~jFHT9~@(&T5\p0?ڻWǽ3^&EHG3;so_<-Q?Gr|V _*q=D _KXo@ f/ulB*@"dk9yP, W;;;@Q>c H$ر}UW'@v˅h, ^(uPBH&P!|c CuB@)]u@īpLl\Z>K #y#?H[L%(Bt]GY6^&}XY6nure2$Iɨ -ߺu癞$qoFpx| puww[O<-%% : 4ǎSaqpC ͢ u#pơgٌ&#% b@ 8zA5rs6^j&:>||h-E ܵb;e10ilvK D d2CQS,xt755I!`t$bqipAQ8뼟ߢN=V0`  F d5#"Hƍ4 fu]ߌr$1 1סfT!y!!ӣ'>\+x#)"%++W$==QEym/Z(%}JbsgʔJ-R6E:F.nǶ- w,Cܶ? mO .o2m>_\DإK@N xp H552ڞ4{/77?vdn[{&@`k^]Kl&wh2$tV?[puO9|ggg¾qx,-hz0gخ]6V'Ϟ:{WBV$o`P  @%U36[[k`,d?jZPxj&V_xsl)w=IENDB`online.png000066400000000000000000000030371326020644600322160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/aim/32x32PNG  IHDR szzbKGDtIME IDATX͕kLWfw h46jlbZ$4jbllmDMj@k&TaaaȲ*cfaB"%IN=/w=F̜ :IKN ߯*69K ש 2$pzdzeE0/#{ɌhEr5J} 6.2ۊn3UG@C 8sC(m48޸)-1>puL:~AJ4 fɚG6@T5KL@gyp397.*gգ `봶#K:NBmQxa6UTopnff*HqiٜNV7= )K(o#dz85=+/XRrр(< w-x1,X01Gț)c4̀O ##Cpƒ1n@hJ*EΫXU)sWLwWU\ 0,7R}䟕}A ca, " xy A/ϳ/01† D}ys4'G4C|nz fn LA.5ҹk GL`U+L?QQ~(Rx< Phr -HriX>!]pYpX>]]a<0D7 M&kE^,c;󗫹ޅK0@vv$C"li\M d]ܲeK@]60RGosA (|@5˷Fx iƩ.'5lIk 3cQ9KsN%LJl/ޕ‘wۙ8( ː!MI tڱfy:s^WBX-[0?''.>>Ƣ'?PF@)3gC ^8m!x-/̖[;aS#)hҧ;n$ 0!Y(:i07=`*f=7ʻ[(H'jMxfYS%?<4'O,GcalB!]7?TJh`ׯ) J?R~y9npRQ@XZEk9~JY88k,kmէھLF?!-hiMMRN&ҥp>M~ d\Uwc1ioؠO4ocp!o.={U=Z#k"d4s*J6n+3uv/L$J'5U--ϣGg`s~z-l),R=y4 ^MOL ^| ߆孭ĨC/(Ц'&n w;Kag6EuJڠ'_v@Ƿ oڦS2SO-Y+*R$lSW׶2;b/^cϧ ahtJJ+xfžxRh2?`?g_vL" !6o=P_4 d^@]%g/Brl Zx2myB|XbEs\[ݻ*kQIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/aim/48x48/000077500000000000000000000000001326020644600303165ustar00rootroot00000000000000offline.png000066400000000000000000000053531326020644600323750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/aim/48x48PNG  IHDR00WbKGDtIME  5 IDAThkPTgea]`qm:x #LfL>wꇤ:mǙN:^fb$1舷iT4/rgΞ}aPLyfy}&޷ozN2~F=BH AA5uoee+۷.4e9_2 'srrYoq:0%D#Q|tRs/$עMמ%żG8h2!͖ЦM**ko>~1Y0۹sgzS|_(!cЉ`p =ny[xB-*\_=7]PXT( R6χ|!ە] noE$֭K Fc`'15k֤ 7sQN*N"(& ((HT').&ju1``: ude:ߜZBQ5 $YJP:yk9>4ߜ eQ"> (_S }>p;iKجRCzz:\ bsQ'ﵵ`@B88Nt~͹L%ڎSMMN 5<'|wns*v,$B/սMCN˺r-p8 IF~\y!aO7+x<{kw#  (vD"a(5JQ^{ R7qNBI>Pr^w_}U0"H\t AB{G=q@%Kt:9nfKq@Jp>[[,t[~D$ PZR{- -Ualhv;WPWY+ `(N8:mmwĴTB1!dw}Q h-**6%}S]4 :{iNQ=2BTqDif8D$  ۞4=d4bxXK$愅`  NZb:!еjCC5m1AÞ,6yI0LhoNRb1D@"|(J\4,| 1; 6 "Ɩ-[sgjo"; ?YHE1s_^!:Rfb6_P P%@)5N<GDE͌R:;;b͋_5 L7yA)(OJ(?n|aaYo@ 9= >i%(C B `f+9^NȲ,GüeY_G.0H6,dfK2 db|\ET 包[JKkmm%c^eY w{uA~@OjMEZ #(,x 6[jKO\PذaCJ;o sOJ;2.[+^!\Ro2фܾu\`f޽6jq,;fJ[{50cieGF_Dl$Ig1jj gKͨ9p#_677Ӳj-6*+-GGGCff&,+Ξ;O~f둛aUd!HOGWFZ'G s>3JsϺ28yd$ yzG\iIʵɄlg6ƽnvnO% λ00+ K2ĉ@kЇHg!?8򕫶YVzENG>tmRɁi/qz(1N㑣LܣRL& po.̰r:݅ {MB8*:ƍ*$Ĝ*+**2XqqtuћK'MDu3s$z.M_3 }#kIENDB`online.png000066400000000000000000000051111326020644600322270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/aim/48x48PNG  IHDR00WbKGDtIME  5 IDAThX{P\}. B] BL6N1>tNө8cM۪uƴ:LZ8L|$,l@& ,K`!ev:=3wcϞ~;6rfJ+l8"SK4x^Y\6[^E>(YyŲt jw{;:G"n^VVV.թOK7V04x%0j@ "pӠ"MM1$F5}ŦCGp/(st-:& 0[l7uE,TJܑJY"cb1Y̔ 0nZa3gLelih'R!XWeg~=XHbT@T"zAv>M@4JD,fJ f^ja $RZmA*ڜ,fJxdϾD ]}wy~'Y̔ hs= \⎄1TcHn;=Js0}fYz}g^n`E E0@ fQ呗:"Y?tŻ,^huE&Fy{䑄^蛑@ u=kV 4G`X| TiRVURys ^$/[V0j9ɶW*`f*+\9ASžj]ճ9>@ }sӡtaѰ󟁠(y/ϲZ0@Ѧj{aiϾ'B'ilf8+;ibx"Ԍ֜.1LA5466S$bdr?n "?L#8,(A@Q+מ8mmߺi9gFϠJc%X_q02ٲ6W=g)JPc*1MeZqTR <,LK N\zNcvp1t5ax qe@""ZLD3aBS]?S3(QB>*}؇x e`X* O{is}Xw?V(x"$J~<8 ^BG*ҥ@`,VxNGNN?b\(D*1qP9õe*،4^-X  p8^1 5  2)fR|,K e^kQjP2-J!:zMP*}kumCCCҶ~AV9ȇbI(򉄄CB9~WbU2Va߁G-.ĖR+m CHظuץLo9>(@@CC}βh-E*OX8ŐT+q?'wb&)k,|?{|wι X,5wB @_ya3͟ V*M: ]ɍ+1Hs~tYVTݬ%o#(Db߻GF:x®gZ~M :Ctr9ȣ~iĬ3d2WXYYYFϿdҫ72ݲEj*.#j|9"AbmAٜq"|M0JR|c9(3g-Wny'1U}S5>KjĔO_d])M/>ݏrʞlg\B(sƆWvYuU%<#tX7>FK _> UWּqz;uVH#\02s IGg~秳 h4"˻ʄt=DG/}k *uvDCryk3{9E{Ȯa+6-VDi^L%<1y`p\J%|}[JY\yV Uۓm6Ov )89?Ժ\.%`?0*o%qCLnhÏĉ`(50О87fܺȴhI@ttwBl^X F-F-~S_L4`L 6嵯.-]m2j|~Ӫ񣇏zB[ٟG1X~dmo۷oJO3(/%Cvw<G:s'^@W߾(C[^1ǣP\*&$x" RXR\֨W=tv:v=Y<Sk+QbKS]?%b^30LϾ @0ѳK|*lDV90Df$L|L'4}YH ūXIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/facebook/000077500000000000000000000000001326020644600305225ustar00rootroot0000000000000016x16/000077500000000000000000000000001326020644600312305ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/facebookaway.png000066400000000000000000000006541326020644600327040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/facebook/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<)IDAT8NA[Gr@B¥*q X$'  $lE4 n[JNbfv͎9. >gЬBBӎrԁ8ɒjuǛ|NB(J>wD5l#.n^AWb{@ZGފImK:A^`oL+Oz#='DR6( Gā%,X K ^y(cE"āȓNF4l{k*k>7,*^4t8b^IENDB`chat.png000066400000000000000000000010501326020644600326510ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/facebook/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8kA; EDCO;ARŁ`B/ *b+b}f?f87{jy0xXD6DaR*JZ|xʪY>Ƥ1Y$V(@QcKO/_ x"i!HcA9N},WϟbtqL25g=w4 ޑi".tx#?\a*G7Ohkt0 u0Y\Ę`u-7R@UVs_IoI0;t޼x|(9/cxE8ZBp~iଽ`wV1b%dFq BQ9XAw_:IENDB`dnd.png000066400000000000000000000006541326020644600325100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/facebook/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<)IDAT8NA[Gr@B¥*q X$'  $lE4 n[JNbfv͎9. >gЬBBӎrԁ8ɒjuǛ|NB(J>wD5l#.n^AWb{@ZGފImK:A^`oL+Oz#='DR6( Gā%,X K ^y(cE"āȓNF4l{k*k>7,*^4t8b^IENDB`not_in_roster.png000066400000000000000000000007641326020644600346310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/facebook/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<qIDAT81NP߳+m-{8 J(p"*H4TH v]}C73OSp $"cYkBJ80Q1@USUEQ0ypĨje)KQ(jLӌ͍M{,..1G/6Qd[_Y h4Z@\àaG߸FD6 x 8}W/vvOg[Ga6 oj:I]ג@UUuN^@Q)[; /{NM EZz{ijDd2,Hbb"KhB D*~6(Kʲ݉#VUct{_UT5Qd Kvi51 *Q`8c;'*u' T.xx'?Z}Ȕ2'Y>0u4, 2ьpxpT8kwZ ;fl>iwZf"2'I\v;^&cxdrT5T$IZ:z?EIENDB`online.png000066400000000000000000000010501326020644600332160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/facebook/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8kA; EDCO;ARŁ`B/ *b+b}f?f87{jy0xXD6DaR*JZ|xʪY>Ƥ1Y$V(@QcKO/_ x"i!HcA9N},WϟbtqL25g=w4 ޑi".tx#?\a*G7Ohkt0 u0Y\Ę`u-7R@UVs_IoI0;t޼x|(9/cxE8ZBp~iଽ`wV1b%dFq BQ9XAw_:IENDB`xa.png000066400000000000000000000006541326020644600323530ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/facebook/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<)IDAT8NA[Gr@B¥*q X$'  $lE4 n[JNbfv͎9. >gЬBBӎrԁ8ɒjuǛ|NB(J>wD5l#.n^AWb{@ZGފImK:A^`oL+Oz#='DR6( Gā%,X K ^y(cE"āȓNF4l{k*k>7,*^4t8b^IENDB`32x32/000077500000000000000000000000001326020644600312245ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/facebookaway.png000066400000000000000000000014531326020644600326760ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/facebook/32x32PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXŗjQߙ&IkcEA^@D}/P|ҕk\(nj]؅[*Xm渘I3Mn54zru]DA'hJ9MԂX P %L#?k:/w 7 h^q4x?z"|UA wRo2ħ6[$ t,n(}P!zmaL|EW6r9{Tr<XX ](0EݬYSkIl=>XCm@:]WwW`ISeNWS0R_v׼}k' B1+FXG)phHXc1d#XuNJpp'OV@W]@\$9*b["0d  >'RI܆I85ѬgT62'ۂ@]E(p9%*MH5TBk_S@D8@F+UukR(!0_4'v:=FeNl7JT+QRe_G*^=>|y7-j GU><},-ƁK,Nv1h6(6_^ P4Coʄ<|/IENDB`chat.png000066400000000000000000000020361326020644600326520ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/facebook/32x32PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXŗOhU?3; IZ⪱!ִ ɪ衈1'/AAeF*R.BՃyz _/5-Vg&C븺՛kT}[ HA Õw/|KL|^zBQ& %+pvO?&Wٹ:1`_rN^{_!Ρ.;S9(FңP2Nm|r@AMڮp8]0j٨)#8<]Gq7ך?AZ3(&ZQ3'DU-Q<{@#N \ajFQoLԉl=RtH;uF3^ٗ?ep+u6#qXވ"Zȕe9]1< jWk N<AF\ Z/Qo6bhyWO==s>`iHADKW:>߃#b˩E%7jZOö/0UEn\:d%} /q{w, xM -)ݷM&m9@qIENDB`dnd.png000066400000000000000000000014531326020644600325020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/facebook/32x32PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXŗjQߙ&IkcEA^@D}/P|ҕk\(nj]؅[*Xm渘I3Mn54zru]DA'hJ9MԂX P %L#?k:/w 7 h^q4x?z"|UA wRo2ħ6[$ t,n(}P!zmaL|EW6r9{Tr<XX ](0EݬYSkIl=>XCm@:]WwW`ISeNWS0R_v׼}k' B1+FXG)phHXc1d#XuNJpp'OV@W]@\$9*b["0d  >'RI܆I85ѬgT62'ۂ@]E(p9%*MH5TBk_S@D8@F+UukR(!0_4'v:=FeNl7JT+QRe_G*^=>|y7-j GU><},-ƁK,Nv1h6(6_^ P4Coʄ<|/IENDB`not_in_roster.png000066400000000000000000000017211326020644600346170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/facebook/32x32PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<NIDATXŗAoEov:ՑB֑DMH p*QAUik HpS!VR@B%@%H-mic{wvîƉ'd}Yֲ[/NL 6) ~ 4EVfgN0z8xr}"Orݳ ؿoX`hhΜ#o W;̵,,,"G;jɲ Jz8|u]\2;!+!o6-. J( yc ߿j\ AJ1KKKlN); 2V&_^wwhXYYqpUOL+7>byy8%0t Ue˼Yqwl@lv@2ށdt'{i㍽O9Ie>tzn$ԆK{BI*xJ`m2Z  ;㶇$KSvE}°@3( 7^{I>FZ(XV|{ LRRɜJ>X6"fn&L}u Qlun}faq_H}xkY E״B ph`uQFHRH}KH\I?/ {1IENDB`offline.png000066400000000000000000000015551326020644600333620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/facebook/32x32PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXŗn1LfЄ[酊e+T]+V5k^`!DU@%+kh,f2I&!i4r?k-NG<<0LZk~HYzRVg  ɔBD!"HT*% R{$` MX2Ƅ5Xc0P*oSkwcƚB! fp|!\]]jZy^ _}ZyةZ]xyt֠uNiE*v_ @$l7Nū$XHMnMIKȤ3\twfB1bq&$I5t,Mms3Z޵#jl'd66ҁN ܮk-7O8]ҔEѦʯcЁ7diH_f>Wp{F899̡;``bpxhܙ<4 Ng,jc}Uj:N-#*@jOn(Z#B9pŭ⫅ wƯ+I3 $&!ϭCł `akP)tu '?MH׫dյ7߾}8 z;,E` XP@ HG# `Њ@L >X'  n*IENDB`online.png000066400000000000000000000020361326020644600332170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/facebook/32x32PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXŗOhU?3; IZ⪱!ִ ɪ衈1'/AAeF*R.BՃyz _/5-Vg&C븺՛kT}[ HA Õw/|KL|^zBQ& %+pvO?&Wٹ:1`_rN^{_!Ρ.;S9(FңP2Nm|r@AMڮp8]0j٨)#8<]Gq7ך?AZ3(&ZQ3'DU-Q<{@#N \ajFQoLԉl=RtH;uF3^ٗ?ep+u6#qXވ"Zȕe9]1< jWk N<AF\ Z/Qo6bhyWO==s>`iHADKW:>߃#b˩E%7jZOö/0UEn\:d%} /q{w, xM -)ݷM&m9@qIENDB`xa.png000066400000000000000000000014531326020644600323450ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/facebook/32x32PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXŗjQߙ&IkcEA^@D}/P|ҕk\(nj]؅[*Xm渘I3Mn54zru]DA'hJ9MԂX P %L#?k:/w 7 h^q4x?z"|UA wRo2ħ6[$ t,n(}P!zmaL|EW6r9{Tr<XX ](0EݬYSkIl=>XCm@:]WwW`ISeNWS0R_v׼}k' B1+FXG)phHXc1d#XuNJpp'OV@W]@\$9*b["0d  >'RI܆I85ѬgT62'ۂ@]E(p9%*MH5TBk_S@D8@F+UukR(!0_4'v:=FeNl7JT+QRe_G*^=>|y7-j GU><},-ƁK,Nv1h6(6_^ P4Coʄ<|/IENDB`48x48/000077500000000000000000000000001326020644600312425ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/facebookoffline.png000066400000000000000000000023461326020644600333770ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/facebook/48x48PNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<cIDATh՚oE~ʼn#;؎% TEUŅS/%zK$"E7$H'$%Nݝᰳ&vH#̼;5 kT`r0!۱V~_n6J mn>X=Liir]K,DD@"*JT_n:Ne 5ZEyT*jwon krP,Zz3 "BTEg^d5 /y5VbdB;NZk\ׅIts{>D %<3^qZ!al67ˏqV X}}沉, udf$G_7?|I(k+`6} `|-<i}`[]Dal6c -zdYrnNt\.ן8~q.7u'W/28m'AE2MmF_/>u˲.ulv;?Pl)S>8N$sUllˉ'ohqmNoK'48I]PJ zJ0y. iW`W`qJ11V`"E s&o 8%>鼲7v +NX{wR˵JqwzJ,ÊNجEĊ8&'#` (@`@$j !j MC}p||4V* 9~q>@h8+q jJrJd`"?NJQٯZ[rV 6V-- y3ٽ3q# )qTۯ}G֦M&}*㗷y4_ Y`(K}yPX/ #Z>\ @]H@X$Q0 rF$hƫ!)) Z2yȼFM>F̭'Wkl@R㌞p5j_n SgE܎4n1:E)}bz~>ЙoN4Ek^q|/to/ ;$IENDB`online.png000066400000000000000000000027611326020644600332420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/facebook/48x48PNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<nIDAThՙkE?3{r46Ъ RAOA|A|.V?"*H*>YXJ M^bkKs|$ges=|3DtknZ嶑Kh zϝ2 |eO״ m#GwW8R(JX+ƂZb e;>6V5}x; Vc؞9Z108)^p0bu{M no.vcp轢Zlxp%܂j P<$ojj%F);Ԯ Ϻ.z. e߰nVo#])Rp9ۮ56S+ Aؼzx8_5U3iOCRjkV0bsd{ž216QC *d{1`cỲBhb6KM$Ty_6K&ߩ1&>=ˆ^xIMcU?0;k2ȴF> =ZG,uHCUDBPO4Z2 q]JvK J)p㓤h f,6QU!np""!]^/,.4nnRXZw`c0ӿOPo-TFNhbн1VP.@ܩ³Ţ]cG?YѬaXODlB.WN3O EKXO/ȵq $$aM_89n*s[m{b٫gg&FON4N1nn"j?8yG% ` _/M!%s1``Q:a 6nƸ*qD`C"/QrDt Wbl&s@UiQgdv7wszG~' 6zS5-DfR@YuLɄ.?O^ᕻUaG{Ⱦ6F^ B;0ֶU߱2!D1 z"Li]v#9EYa!H[ʥ1{zF%J9|rLgwUdkU ߆"GuzNr %\ʎ+h~*Ȑ_=tKlf=x|8pp Owo_ ^LrK۷&Οol @kY&O}^=9V79AȬ-wLf 61fy1pcgKE} *\rn̵|D~Q\ @m%IENDB`chat.png000066400000000000000000000015211326020644600327410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/gadu-gadu/16x16PNG  IHDRabKGDtIME  8IDAT8u]hu#`KӮt2dJM7l2UcTPLQ/BG]jڌiQ[uA銙&Yڡ<9Ԩ[2 Ƕ| |"3CCO͋Z#~?lg-aYh) :-WJeQ>fRZ?*,S3T}EgCE.B*}%%T*o|q6w 7_pd۶v龝c3]FkEWG7PݼLWMM~g}ؕcXX 7@0}Meu6<.`ʯ ~;޽wP*iT3  1H_@G8x0~a8+G i$DT 'Lݷ?ذX퉖Opk2 Fղe*q"yεopwﭴ/]%jUdQ y` ~VQ${(ĀPj )?5;(! /s&e"v[9~Vl7T$d "t] я`B8`\rX_ȍf_ߘk_:}@YOZD܀>@ujܣaHIENDB`dnd.png000066400000000000000000000014411326020644600325700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/gadu-gadu/16x16PNG  IHDRabKGDtIME aDIDAT8uMhW{7$"1`iKk5]YtQu!P b vS(MhRj .lqiI(1~=]H"5]缜s(o=ƹM; ~]^`fkӭ'`ruBkLX*XCD֭J}#3ZTJkGj o>|8;<0@M{Cxg”WB\%jnrDоOqb".r+mfC]1=+YOѨȹ%Xxg9 cN (wa?\HY\1IENDB`invisible.png000066400000000000000000000014511326020644600340100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/gadu-gadu/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8uQhu?_tmr S½J\dEDE"IE>/Qzn5AEJ11kvи9=Bl:3UM$io\fFZE\ > D$~ á|hԹ0"2P(DK>]76xѿ~]wܹ Rg+ssw} w*0o}?n K]L5ܑCOꟈň bKft>dQt. DF.}x띋1q$KyO25$MWA-\䱮\twc2 |`$s^!?0qV۵X!y;$m0q8`)v& p\lѹ^.l|EѡՙɳY&?ZJU'PY5U?^v&L&h wq&\B:R:uƧ3/{2:h^E6yy#K3Gۆ/寧2A0!w߿v6-o>9@ZGO?&ϻSxX'JVEߺU*VvXt.ꈢحjٍp-X0&q|z=N /6؈3+mz4!D>G:]\\j~8Co I$c4[[Z _b6Hd X[?h{CBÒsqvzi3e~A|7~a5j6IENDB`offline.png000066400000000000000000000014371326020644600334520ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/gadu-gadu/16x16PNG  IHDRabKGDtIME  8IDAT8KHTqƿ{;GkNh$n%E#څVF BPM tQeB"ќqL] LC\3w@Yw~ps8B־)qҗ###v:a'@ZZriN Z(0J.V?aX4Z b"j<[10"L7||}?&x^j 1!PZZiYAQ_Fkjj  @ƱB#xӃXD۪$Q,$Ql$%&b ## Y@D$>7ܫvYUUhCCcBcC=,Ihn5NYƻleЉ޾^&=ddf#+dx''b]ݰeNYQb!x)GU99 vƕ,0Y);~K/IENDB`online.png000066400000000000000000000014421326020644600333100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/gadu-gadu/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8uKa~_7NaLQ nf (B*ȜEn$AD a**VЕA0BKܿ}[X9<c ʕBaT26fLq.,ל VE"K-pֿ⺔JJy灀T|a8L`~Hy5!Y m+i]:JJ{UGǎԇ[kչ) ƚ_}[^|6kO lm>nj=Ʃy"4 x;j׻U4h|_RzCeH  HbIm|/8q!GW|~w:5tL׮ ƥt.d)Ak0FXUiQgdv7wszG~' 6zS5-DfR@YuLɄ.?O^ᕻUaG{Ⱦ6F^ B;0ֶU߱2!D1 z"Li]v#9EYa!H[ʥ1{zF%J9|rLgwUdkU ߆"GuzNr %\ʎ+h~*Ȑ_=tKlf=x|8pp Owo_ ^LrK۷&Οol @kY&O}^=9V79AȬ-wLf 61fy1pcgKE} *\rn̵|D~Q\ @m%IENDB`32x32/000077500000000000000000000000001326020644600313115ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/gadu-gaduaway.png000066400000000000000000000037171326020644600327700ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/gadu-gadu/32x32PNG  IHDR szzbKGDtIME  >qIDATXkl\3{ v؎cāTPbB *%jLTTA*A|UQi?@"K6>4$$1)GuO;sa81>_w9s۹ڭe}Y|'gGV궆6V_w|֏;ہƷˢ`<دϬ"5ֈᄇM;.fX{ˊ9$[-֪f7^ J@,n<߿}ghKl&V)^Dde*:|1q#p sݯ>2C["UUG/DycH> ֢N~ʩ;RS'/P𑅗_ͩȫ{ZMORwc ߽!ZP?FHVyx0%IqNFR'KTÕW.)%}vȢFN(ES[Ŧ?$[pq#+Q\ gz%ܷGYC&qY|sVH|ۥ9@jFB T9*^~G ]v._^D+x ޿Kw]HU@@ɅD)d^r_ =)#}|r51츃Õ5U.њQ"AlmBBI$6Be5lkZ:jus;rf$ے\q Rgo&yGO6XzdQ g$qÝD*Zܻ`rkLv- Ok%]LI%2V~bXN4{ݺ%!|'\6$p+As GzC4,\ozH'sAe`4XcfQG+ o} oAn J2db;`~ 6s}BWduD`i!Z ǻ>鿬M(5<%VN'ր1 0] Y%q.n )P%`GټUJ3a/BYV=;ypd L N"dSFuöB lNd9W/πx̻8ւx~b׾?9u n}/1T#P в.:[!1bI$-_͡ >GzQ gڴz﷯ZRsSx{p63"H}fxױbb|DVJW]؉btco[ Ԣ6~1 N|Pg2(+t@G+hxtn b }]VMB9vA kdz_C&9Jϑƌqf}nMsC|~ّ{`e̛ۍ_և)O#ASX/$*qҕ &h_VO$$5'fp!D*gdM҉zKq!-y ? ŊK:1`@*NmuY:8zEf|%e܌b@u)5f/rXwZ/Z;֗myK)J^j/37-[5 pd{yC_׬ ň?&Kf6cBN95TZuC(%Rkp܄m2LsUQTl"EDtVun^N,w'e$N#:k3 ~f2lD)l&L2YԱIENDB`chat.png000066400000000000000000000041561326020644600327440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/gadu-gadu/32x32PNG  IHDR szzbKGDtIME  >IDATX{pow&BȒlP T"2tpA@0Zqb"2u*VTjӤzZAAlT4d $Jnr?v7y\s9~*JJZc. ` r%=&m͚5EnTjv</p\'u+Wl8_>硇LUTksCȑ#h,jFkm9r䰽|]ޙj^ַ֩*ݏ=r_Whgh<^?Zzݪ'{C+VIwoef0Baϱ>OBv,ѩ ݳPCɤ)(eEAkpT(y<&~{ZktkwQ/$`!`6v͜9xo|L!R ^JرUv_ HXf|g-_1|WceMDwa4A(Dx#:|Lz @axoh}w!1)qJ~}a>'yP )ƀ AIɦMU# (cfYDž[Ad>ŒՒ5l  ټ`\mmpa,)Z'6/K-x(rqpFF1zdub(Y4pİA'!0qDP-t$Y%`-z.KG"nFx'ÌfL~vj'5|bs xI0+!o iij%'%`St:5kn'w/`0*s"kxe wU/ISPdI~5aDؑľ؃)fo]]wO$r|9{ⱓ'_:tK$gZbڟ+_(/] +1Y]]B\iOBښ!\P8v3p-"g&X`da /z ul̞tg@%SJm0e/7hvF/Eܛױ݂Cmύ1ɾ}= v R6- <ظ@s ,R3\'ݹǎPR.<80j(GF"%B+Ekk+{zm[գG99kWzb=wh=W Qj uTRZFz{b^ U J8NsYY5}:n5qKvJhI^1$*"*)^!x7fH#ynOBJ:KDF|cii }ݻ+ƝoԴ8s ӡdDGCӟlr PNSI (?tyIENDB`dnd.png000066400000000000000000000041041326020644600325630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/gadu-gadu/32x32PNG  IHDR szzbKGDtIME B~IDATX}l?m/o m]"R 4J"3ز,cddK,sZʖ`*(q** (X}ϽsK_s{=;sI)1fptXS]R~־qm|cSMuks"<4U9AgA c.dR hRqg )uu 0it+5SWup_.DIT\b:H>^}5:SJ-3f/YΞ=92N JO=˩> vkc^Yre8^yuzF)Iʶ]RpW{l^q''rFp<Eh!Q}dfeƑ}l0[#P6o~]QLx4Jf2!|8M/AK2Ň{=Mpd2J%u֑s'O*6x%-HۋƎ5cCA =/XECѼg|Nŕ2D'[77'_ oq!78` `d?"xꇨo|g[j1d8Dx5^ 0HQn͸':+:}-pVVqMŕR@PV,^Qdye?^7IJ ^|{}ez;j,lY+*~? ʃ9xU'm:-tA[10X/4o4mAaG*| x4U Iʓ ed@ *t 6vKji!]%/_RJ6R{bOQ[j!C@'x6Iygx#P ;0@W*?L}D܅g+`-z;63뛐X B5?KaVmIlkAk(kxƬ 1s,(_8w7mBDXt0xwcc3K0"n4ıL#@96~nlۮx~k|̱l{1`]Ĵ*teb8^ߜWf僠w q+r)glIKK1uyt[?XeA>9o{+g=Ʊ ёo.e%| d4,_&MZf|؁jy}oXk)Q*Q'!^1:) YX17_xOGƜ#L RNcrcp|nc@BЉBK˙֕FZ+::V_4SxOzt$QE "_ՅxPI挌 dmU#PRyg8k F<Ԃi٫DZX?Cfw6fMpF hn׽9elZ|y8  ڂWW z2Ā>ƎBIߺUY =wbr:H7B̝5󝝴^DSoUTVVY@<χ{uJKf-@7YR_ɔjƬBčh `m@-TP(CLq4*JkjD6BwEW] Z&'m2w_g$Z/HDHc~fVWۋ|!92jy9;hukXOS\Y\/ "jkӣ==VIk}LHTNp|*)OTAk}O~cݐS^zК0ne̊yNe&IPOBR)wc|B >fuR_F1k1`4?L vԌ$}bw=jO_M'L0YwWXIENDB`invisible.png000066400000000000000000000040031326020644600340000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/gadu-gadu/32x32PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATX[lTxf|al`57* NIT%uP,TVMz!D}j6K#cQѦr5q&~{albL2YhZGwS*/U D\wg۶Ƭ8;}:y;QJeVG)0F)P(/V߿h1 .cJRsJW\?d|ڮ"J[rr efVJo{5ɆkcfmLYnQQxŽ#2ӧȄ]geU۸DyQ/%ߘ7ڕ[T^hw7'sԂJ yW]7RAڲQ =reCuΟ;W9wؓ~ LIT}k.[RAC軘J}J#Qyݜx]yއ;ӔjZ8z7tS>K I4ׁ$@WE(=/Ѳ#.C#N2ƔRnS+ڗ{ !^/D@ IO/WsʀҖGRs WVަwY,^\' 9U(5(51֯76ׅDv8>=Lo?&? ܧ0kCH^V)pFJK%mGg!9uH)0eQ?{CA!#زn"EEX V>l,TZE)#K?CcpIjԽa}TV.p 튺Cɔ:+ b)E({A)3ZQ%"=[C /GiJ?K~d2ܭӟBԼ=<Qyyr<ڻtēQtѓ;"2@2W/b7ig/fCZz.spK} d7&yKVA!ٓ>}$hn̞tvHsK='my{nFQQOmmBEA/-3ں0Z[:מ 'c;SUe[R8\>rnrt`Yl 6B|mQt P(?/Zk~c}u|t옫PeeJ qKza0$ Ky+E]Dgw\nk: Ŗ $ң~[xB p fmLY(77K}BZC4X y\ף \6rMyޙ3RFsR ޲yV";yNzгsPjkL)1o)ھZ)dYVce"(LMb=Toi6EWYc?r?e)M3J!O8wk}N J)7ID`FL\φ1*|5)D$ 6>t4Ň#KIENDB`not_in_roster.png000066400000000000000000000040701326020644600347040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/gadu-gadu/32x32PNG  IHDR szzbKGDtIME $<ʬIDATXO\?;c3 ~H&*rQ"Wj7U]zE+5.MU5jUvUUڸmd0c33 03ܹ.Pӝ{4}]GGggc-0Pׇ8(_AX}8)(4Ɂ鱴֦ 0B===Z̞wvhY[岳 ޾w]]o(^FkҊp8Lv5o+Z.?!G#wKhkk[OcW2}+w0ښO|5xx<յ$JtYﶜ; eU,GFF$5_kE,./On\E]sZ<{,Eʎܔ2z49@&G֖*|R)M 5}_ Vbt1C|~.o#d-cnn{_Rhj7sg#ty^y*.dm}%24bϷUpweLU{Ȳ; kOrʊ>Z)(ZqrtX4J㱣 q Wt&s"^@{ڰsoԄñhTkW$IXaܴ!Bq}9BWbڧ tT2@.WH$pt޾TVF+RiF|R !4MMMLLMc6U!Jf%J$ ܸqo19=KG{++LL8-`v~)JJ4g4d B ^V@ѩ3 Rmr LGLtRJRc1ĢuhY[]%W.z+ܙ\zS˜Bh0-9܀$eS},$ N4| Ms$^8KE| (%NoqRF6v"*Foiv BJ BNhM_}e_cZmwgsxTbS4<&/`blb ۶!ԍ Noق Kx@Gc_ǂctΤ +La&iPvҙ,c3xbZКxe%%\r\Xbf.Aram!Rw%%)$u5$RQL%0DGW N Sw_077R @kxBTB>IԯR=WdGgg' mChH.tq#~Zk') TW 8RH-.򥽎ohH'Ϸ4F"308̩MR',.-S*pl6$nP(He0z>S"RWe d2+kH׷ʋW])G!nH  bJl%%eb յ53\q^@ |7\ XBj]gK!跴kM@D+}8R*ƧmJjՋ⽑;?bGS* J)2Bi|8G}}7ׁ nݺ!Ǒ(iY65vU?ʮӛu8lz]jWȭ3 -g/B π]`۱~j`v("X7pB|[~sovMdDW)JXAIENDB`offline.png000066400000000000000000000041611326020644600334430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/gadu-gadu/32x32PNG  IHDR szzbKGDtIME .IDATXW{PT{^vPeXV|Ԋ 4GeLOL4:hgLG&Z-PҎն؊kA`wQ^˲uN`aȺ&?zf~s=s;;%fs:KxAwDmӱ!(Ojjk, eyY``$ytpәg@c\nnuҶ5",+* NU֘f100CӍm^$If->~Z\VL Tv=oCMy$4QC{zzPUu x׾hNOO(NxՅ%E>$ 1o5=gyԩo?,smtG<^N8 gI KN<^7}|>B!(n՚NW'knn&e奰p\hjj<}vwzJKĘ_{g6R  NĚcryl6;AH׃/o~ Y՞Ue饺ƛ\h}?kοl\f ml&Y M Ec qXh1, ܸqQ1ƈcGAVq=Ax N;*ʷ!%%$)US@MӠ F|ðۓQVVt܇?-`x plٳ3{w1& `2 JØר(bMx232%1!YVT>fϋ֙^ĈF:Ob;QA~[8YuBD bժz.NSjꌌYub Ȳ([ p%L&p?Ml2xHsCՔђ>LAO+=ƨNMR\˧ؒR010Ɛy#Z.\Dަ"$d V[JY yK劺ƛ*?*++uddd!Pׯw7&'Ȁ]e HbeJz`J/^9S]66I0cf)1}: pB "g!`:Qgn!Ior/~.X-<080߼ᄏz!)AGYХɲsR@}}dMlBEQaX!)֭]=_} Lz! eK@)`UӠ;`jmmUn§2ݻwْ%K^ْ2+-F 8s2rP},&̱fAm8xwp8QVZ 3?f׍/Ϸ䋚-;488*'3f"!!P?D̙|36kxdy`@gXq^2::U{{\Q#RQYUAA\FnY Z8tbB8 Y؀ 磯]كյHgLфY䓳z=Ya6B'z=HI?9' DQȟҢ:^JiّьllvJAx=?69hz{z|)ҏ]QK2PWuّ݇:m̖f/%֭!I 5hM9p\dKaRRR~ÏW\IeeI=oݏp_Cag%!y劕t#!MG^xo͎4=%ٶ5q:.jQ ;v1?~Q^o.Z8(euzrssV["iִ֦ Z[[UBF5 Rptl}DMxMp.}? B= c m#IENDB`online.png000066400000000000000000000037221326020644600333070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/gadu-gadu/32x32PNG  IHDR szzbKGDtIME .tIDATXYpT3FI Z[`SSf11 OER)W<dH"1*Cb+fb3  I$h{0#,İDO>}N_ &I)wBk=o%!V)?bR^nZֹ걆:1 MԶ' Uʤ`PBz q1I Qz" (0 *aVXV77I9z(u[[q* vw.|MWgc#}A0\5jT^ic==4CGS_8 Zuy ??_Na<7+TDuS_[+fΝLZ9eZ{*adڵZ[b/؇*MJr,8mءzkOCx pwDm`.̀m^0httQM|oz `"1}0Z]BY9x/bT!Ͼ;c_ɸz´ŋ GJdL3BL蟠`4m·rjwikMC_-ӺD̕Taa}Bڸ_"kC'w&Lڣ?C?WH_23`Q2xyԩ>'|Y+m&6Ut1kY*wo0keMF1]Õ:YImVeVP67{b޼p8a?6;j]Pwp0]3#rraFd%)/Tpp&v1`bϷHB16k6Sޥ{_gc.0+/yd4\R+{0_TCc: ǎvNr3QYnS?eo*-5sɂ F#y=gWKg.9%1m`:φ| j|IDɳg/.׺Sck^]mQr8 dۈg#pB [[_G3"ԟ?/%#*aRjeaF;WP撒5?^`@w FCGGΜ :d)g?|o&'7WF&etD}>j7̉1's.$RsUf ڱkJ陙yEEE>ߏ !'B+Ekk+t)szeYoM0_GlJT)č?Z D,r+ކu/+S[ڂ#QxJR~!W m?!ĕn D)3HJ('9ƜQsh8J|N̷@ @;ĠagDW 3^үjи߿~2]?լvCuIENDB`xa.png000066400000000000000000000037171326020644600324370ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/gadu-gadu/32x32PNG  IHDR szzbKGDtIME  >qIDATXkl\3{ v؎cāTPbB *%jLTTA*A|UQi?@"K6>4$$1)GuO;sa81>_w9s۹ڭe}Y|'gGV궆6V_w|֏;ہƷˢ`<دϬ"5ֈᄇM;.fX{ˊ9$[-֪f7^ J@,n<߿}ghKl&V)^Dde*:|1q#p sݯ>2C["UUG/DycH> ֢N~ʩ;RS'/P𑅗_ͩȫ{ZMORwc ߽!ZP?FHVyx0%IqNFR'KTÕW.)%}vȢFN(ES[Ŧ?$[pq#+Q\ gz%ܷGYC&qY|sVH|ۥ9@jFB T9*^~G ]v._^D+x ޿Kw]HU@@ɅD)d^r_ =)#}|r51츃Õ5U.њQ"AlmBBI$6Be5lkZ:jus;rf$ے\q Rgo&yGO6XzdQ g$qÝD*Zܻ`rkLv- Ok%]LI%2V~bXN4{ݺ%!|'\6$p+As GzC4,\ozH'sAe`4XcfQG+ o} oAn J2db;`~ 6s}BWduD`i!Z ǻ>鿬M(5<%VN'ր1 0] Y%q.n )P%`GټUJ3a/BYV=;ypd L N"dSFuöB lNd9W/πx̻8ւx~b׾?9u n}/1T#P в.:[!1bI$-_͡ >GzQ gڴz﷯ZRsSx{p63"H}fxױbb|DVJW]؉btco[ Ԣ6~1 N|Pg2(+t@G+hxtn b }]VMB9vA kdz_C&9Jϑƌqf}nMsC|~ّ{`e̛ۍ_և)O#ASX/$*qҕ &h_VO$$5'fp!D*gdM҉zKq!-y ? ŊK:1`@*NmuY:8zEf|%e܌b@u)5f/rXwZ/Z;֗myK)J^j/37-[5 pd{yC_׬ ň?&Kf6cBN95TZuC(%Rkp܄m2LsUQTl"EDtVun^N,w'e$N#:k3 ~f2lD)l&L2YԱIENDB`48x48/000077500000000000000000000000001326020644600313275ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/gadu-gaduoffline.png000066400000000000000000000073321326020644600334640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/gadu-gadu/48x48PNG  IHDR00WbKGDtIME $ IA|IDAThYitוjV# vg>0Ĝ{B$1^$x0C vIc1B[Uo~ti - F{^t{{Eal q~C13-YXNN}K:=E#;sVEc,\ ێ۱p|a# UAfV >cC)!iE@ XC⁸~o E,N(ӠLeC{ۭ\Rѹ/'ql̄EaɲE15? ֪*-}| ?srMi+]n]|<3MF_F=X4]՛xFr5m8hqa^  5r߾}]xi KZ7gl9'' N9ǎ;sG}7E|IidݝH.c{)W\yŴ#UN-i̙.Q 4Me[ODQ`Y/B(G5ԟ-\2܌tߚO,@+[6+r !c.m wAdZ[o3 +V,Gzz:‘TEE((0L Qϱ$ ^.з~XbeKX2:DAΫu {dAzoO?-Ŕ(%%Sbobi(,((y`4MåKh8uPy!I2x s<AĎǂWWUU[yS|IK٫W\)E@H5231끇eY, 8=ˆi0 q'z Iri!j@ǎʊg7h)qԙCnjbOϼ)+ԅߙ3Eh۾8 ذLyL49O_@y0  Inر;++wV== : Kv,] P(LϽUU]KچXL{Ц l zg}^+CupE,._ MS{ !qZC(0~;zii &ЧN{[+RePe?~\Fnn.qR+=$A׵}}Kl"E<2__]א`i(7fΚ K@AATU0LzF* >H;h+))q4{rsr\n o`31ga ֭_/,,]7n?ϱEq-۶,F;`y7Miӧ˪BUUe7n H|-8~$TU'ͯ; PU 'ko%m5M,*LDqn4fgк! c0MG4m񛦳g nmnia{8 /9Pu &ND(e!}I~(-/]q4BP5 >+P0L3@P<~ׂc YlYGbgO 8>>q4\S]yYylZ*Im^bf@vV&^ڴZ> ۋ{%˲< Dp7{Ίx7B$~3ήIJ.GalS_& n3wy?a(C I7Nahbݲ8tp'Q۲OZ^^bo۶miBiMfhX)%/G>frHzUlz7*Inޒr9@]4 gUuۓ$~ ෩Y|ɟ;;;pI.Ȳ˗0j(hrζ~ݚbbW-FX߈ [EQB`Y_sWu˲^l<7 Ϝ =r+FuxNI}CFSS J\ Mz2,)aԝjWxB4E8 4ű?~~ [ |GXn58KrB0X . ˢ)ڎ0XN7663zͤ2˲`X.\SJ <ގ ^q<,Dvxw@Qy! C›I`9j*Q---Mh$I<A[{;| dfdBd̳,3&,~ލ}NCt(-ys^kA{[;}قayyGS\ܲnuP2բ{/7]n32p[a!~!E(8G ?=9E[Fz& ħ>رc475,`=lݺմ  @e /{w2Md`Eӽ&hFnVbDس{c[7& En- ~y9%߃KRP8l8:::gO !(SQuC3(]h7-'+WǎD,QIsI\Fl qP`EfF6L§ FA*m(L_:TEŹf8qaB7t xnYBfC0؅:KrIvRac&7Gvɹy0 vU+h]4W>i$eI2? 8?jO7e}?D۳{_daa;62`v@\ӧMGAFR@v‘Л*מ9eʲqRR8YY$I믽a&ɹFzJ=bE9 9qVz!!W`4Mi;`YGo*tBS. 'THҺ]ȑ#y۴q`h=--.vkw_\BR콈>ԖأOgDoÏIVֹn@7Hn!vqCi7#){A Tнm`ۄC IENDB`online.png000066400000000000000000000066761326020644600333400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/gadu-gadu/48x48PNG  IHDR00WbKGDtIME $ IA `IDATh{tՕ?~Hr\!!d-QEqv)-:>c1k::VDL y'q_~7Wcsܳ~>}~0Lmlq[\9\vm ?~NNx3`8lPjJܕ75+*0 [BRȗBUVR`8láT!L, !%[[a3ӯB4 B*n۫9o=p0)N@)l)q~sz 7;LJ|!WʶN_n7=ӿk]qlwߍC_/Qj5೤W+je q|&c[nA6VΜѣjCRZIYp57+;'ԑ}m!*DhaqOލ1~>۹.Mp/tÏaȂWRS9p_3FV>Q7aB#H݌7}VG"JѣFĈPT ._ [D`k|#-P^"JE?Y9~ q+)>yFֈiLgE2_{و)ShK˦%J/ ~IQRv@I9]t,B BAJ^^a )嵁i\TBAȁ={ !:/^!t?SXU;ϼFo ]R$wBDL Vx~݌&uqjm*+ #S]nӖRenu)M~?㡭!DiߵJWeEET.TS=*qẼ˨!l4Y&N$6/nqp UqTsT>UI~mH"B!ze`tnoV:p٬}ק$"2ذ?=15&W%wD+&"hͫ赣n7qˢYF0XlEEru0zM%nz/6#Lޛ\T7(;f֔憸bb:¥?+Dő#uu/ܩSߊ+Ȕ5 qT$J2'+-Dc(Đ lΌ]kա0aBkD57.m+s.w0sRNVVsb† b&CgeF;E"H,g)=$ YqPUU@=n{vN 믗~)ShjqN13ζYLD."r!%|VVf9LӞ?kR$^c1>?zŖ5/^ke>y=j>0G{wPPTtKkTk+K%F T8q&m!L^C\3c0 t#tKN 2\]"<8ľ`Axڥ >!N/@DKLwob4NVY.MĨ. >Q׿=#^ynzШv*(^MC{LK7~ Zvݘ!1:ߕkG ӟNbj}p{|ظ&{ u>X,^:@PQ#YB;Rxun~s`cUgѵY'-5ڶSt1٧]*)PMb-$0;?`XO N̰k)rnCwT?6]Ƙ ipkRucb.Bt<4IENDB`chat.png000066400000000000000000000016551326020644600316670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/icq/16x16PNG  IHDRabKGDtIME (-OIDAT8}]le?kKV6ɠl :u3N'ӘFH81CD@4-F:"sA`h߯}=#D;y+O<7Av,릌~L) x`q@Peb&'s^j Vig0Ch^Ua- HN=7 >3pAo[_aa/ŻJm GcYX0yy=ZcgT\ΤJB)Ynt'Rs*ra+n&ԋ54M<3nܜ#CІFM`܆r=L;yZB|tvBxɒ3dZKH$>D\VE\o4f/)dD i3IQ X- TccIrC<w2F*ue3  ZWՀ1!n]'2b1&HaO Q@^B;vcێ70ޭ϶Cs%uUo dHũ5x>H)q _nx<\IgTE+ Ô8wq Vo T ,ba!@`9N.yu;} ]Y-t0Bǃ*jƧԣH{x6rΝR=|`oz>T ڮyQaPts{WV@F#hN*)).cL,x[οP_SBʥTO_m[B>=豭V28)R.7}3wvkAIENDB`dnd.png000066400000000000000000000016501326020644600315100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/icq/16x16PNG  IHDRabKGDtIME '8JIDAT8u]lU9_kYWڭuj')c,lD$ Eb­ VD1$W&HF"C,3΀huk~o7}r`} <`61WOk?b}oٟz+c_މd/0˧0~/N= ?r]4$v6ƒҐ_=;gMf RJ(%)oo[La^O8: x:4M:wxǢE`}m1*†L]<5zҌzDi Rdr)oۏ*j#‡ie`ȕ33+*ğtg3]}^[%EIc7W K8HR+c3?9'(RҴm0#^I['TݨC*YSqWpn `W F6u@.B}~K8 5Λ4O\z@O^dPpr/ )UC#>&e ыh 07 ,O׃o8eCC@3$s BWೇS)XD?f_0՛_8K9TG&$luɹBlp7*30xg[mWC+fq1u)k`5WJ#ڸ3e*o ;JAL]ֈƿfD^5uPlЁ8ۺI#H Y'xOں ٛo^a&}uz2}2cK#2 =s_܏a8<-}M~-xQmlO+l!7/mp]v )"$mX[]+xٵQ̆^ l[ҏ?#sؑ| ZMX:1~kkܝYe6 vJn|ٿ;R$JL^V8~,˒3NfZ3R){Q:ˆĞoZAmR LX LU0{o^S02!m'1o9Ҥ4i2 M@@" EH__/ ]۫DR+42,O\nZg8ctR|8;=9;7B} pIENDB`offline.png000066400000000000000000000016551326020644600323720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/icq/16x16PNG  IHDRabKGDtIME (-OIDAT8}MLU}OXuZU+ZS 1&"Ƥ;jfbF766q;M4p eb ]hM!03u =aE: q0FC$R7|>54VFl3kw tidz5804AV.{4UQ!{~ho|00ѨD<b܅o %Mo]Y0u3Dt$JJ&4T*aHRI<v|Ttez}~B!X^^lw6hnD<Im[ZIMO:wޥP܍<%~BۏiMTff\aiTlol; ߆h({9mms7k-/; ΃@;ً@;,oF zKpuHC)dh^> zEC@?v\iK>׆sO'67ڲz.Ȟ ?n5~~&eYMQS #T*#(W:^3NRum>NZX ""M$srr%""tsʗj:,QfM| Tqjr5 *\.wp`VhLH$&˶t+m,޺%+4̽[6e hlnpc!M5!CIۿ`yΉbq{>oİZ9'㺬Tf[3g>+PQJUttntk_񇭠ȂMeIENDB`online.png000066400000000000000000000016611326020644600322310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/icq/16x16PNG  IHDRabKGDtIME (-SIDAT8}_L[umiGFA+ (6; M"s!hbL=L,Ƹ8/dce 1 Cn0(+3I9O6}!;L$tNƌQHC|j'7܏_^[=Tg6_5+< `P5JO]>l1uvx $y 5G8yQ@r(w|rԊŷ`J4k(hY{v,NefyW@_c#뺸6}Źs#ff,HJ*kCrp  j4(v:AzR wż`1ahX<ڲ7A /@ߕ;zϔX_. ^|Sr8ȬA`ױq__(XoQXka͎NW&V|v{?Y#4$ k\鍞:b!IENDB`xa.png000066400000000000000000000016001326020644600313460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/icq/16x16PNG  IHDRabKGDtIME (-"IDAT8mSMhe}%YMLF6m)&Z0('Aڛ=y,"M)%ReY +RڤtnݤMy;+J7o!y5e蔵q7PZaf03Z"N VEOS>nV]^33(( N{x}{;z"׃4V C]I䀔"ZDy|wz y9]IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/icq/32x32/000077500000000000000000000000001326020644600303065ustar00rootroot00000000000000away.png000066400000000000000000000041271326020644600317020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/icq/32x32PNG  IHDR szzbKGDtIME IDATXilT7o{3x7xaߗ$`AIMB5_Z)_JR*$JDi)%M,6ccccf<{O?6TʇJћw9`_GP|,爷׾hم"oj꥕NVgKKh}FKWn'a>UtnM!z=EGWòAeZynoҀp]IzE:FV-]<Ca'I;&g.~r,.6m u;rԳCS>ꆷg4mH7Ů]D`Z4+g،q@.< ƃ gu>f-,t|86BkuMM!5^xWhܶ۸{%"+A…dIsp !Ov";-^VLY6EEujɢnnV0ŗr' fB)> _"joK&D4'=3ūzIHjV-P܌-v u_96,a1H<&Q˃L^D+| $ojNarn]Bњܿ1˃ܧ'j*N񨡀*:~$bYoԛ+oY-(3r4MD ^[:P H X{W/ǒNݷ ܘ:JAW~1K/0i7CH2.k@,ڡ·D"m";lg9J;_`?Sf=ƿǸ2{tk^)*e4Iz&Dԏ'JVZ(` "gɤ#+oaO8%O7"ȡ;`KRd`~? p_9{*%W~}c%=\Y^-ː JӨϤ qɭBvpyhIkCPuk֕  o/cȄ ZH"3 f.F.ret,4 4e\ B±8 )r)T?c v3L讆2sc7 $Mxskj<Jt xcJvwR +p 0c"ذXX lH^8GQ(0B:y4Oi6+_x$$ATr Ν8sA9Ȳz<{9FUp"d.:0R|rqTU{ 4_:#iY.Px%\W6<^˜gHXRKZƦ-%,ږW6}ss={}\]7x P9M8?KѶoAL`e !ss9j;~a㵗 LGUH>xvX1-\Ut!L_Bwp{p@GVH󳣷F|=c>jJS47נOH d{n W{~Ge+\fT1M(\aZL<IENDB`chat.png000066400000000000000000000045371326020644600316650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/icq/32x32PNG  IHDR szzbKGDtIME  IDATX͕klw;޵6xmlc;!g e@ % "*MZEKM)HA!*QH 0`y8q0qb066އ{o?^Vjw=?6 9'5KM$Iw_|ZB6 ` x@6 V1Wh6K+WV3=D$i?)~׮]o[5-vQ}TgI~EFBccVNV#tw/dwCYmoXTVqQOߪپ;97%H:XPJq{\Rxz]C_}R`r(Yk/YMc4k6fVφaEWTM̝3 QZR&2ɟx~RyU8GBYJz"+\3J 8ylXi: Xo{2ӊgچr_c0:H8!;ήlɣE cR JMȲ~DRWL)tCfNq Ot~  󖺾nR"$f5S;iZZ ?]NpJbQ|՟ )g̚EZ:D^DudJ˹z6^*84'"f/fQ^@+F۰X,x(*AR 7g*.\:}S &]OR]Q߂q[sю0e WW^aW;qfu*iZsx@wD(heF[l;>Rah+,{Լ ƀt&O@0R&G* pDM8m^$I­.lm-%ؾ=ә$hx 80`v#7#,Њ 洄pZ=wÎ,ҫ jG}}X: ^4EMER\pmzo;Co?0{7_hS({TժSP s < W.;Gqq> )e@y=}hmː2 ԭ(>+Ԧ8l@88m&O;#ϲ,+'dw_gV+lכ'TaϵۅS|4/?&X8 CgDDvc!) q8uM0F`B&* s_<=6'n%1OZc>|DpMkJ%x;K#^)H $h! *o{`C*is,Vm>#DMb0 ,@Qf!هH{ etp$. U T<|  9sM k% QӺ#Ѝ䧑pV)pܧZ`<—T WcGTaťzܜC0`-)ѝ;^|ɬJ쬙r[,bf:1+ E&0$eW{Hs3#1QԅKPPsQKL\']ـуlZWk>rk*3=#Ca\h﹦) XEDA~%3/YUkm|*:#s/ 7}U8P*L%.A64S$]lo06g;-uoNcWlCr弍tFnL,r䉃SG`nT7R#`m~V#)Ή:褀sD^Ȝ)8w{ z5˭y f92-}-cIg;Y'x#zB rhU;cГT$2FC^KmQ_^N!쯮fY %`  m"ۀ3'ȳΆm u$wܬ ^M(W g7YTg{/V-x|a7!S~lolnu:»`w{.YqD<=bonNU?cVsOV2ƅ= cqc_t #{;IENDB`dnd.png000066400000000000000000000044471326020644600315130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/icq/32x32PNG  IHDR szzbKGDtIME IDATXWilT[fޛ͞cd$ ФtID%JU*ZIUI5$)J\ 4@ Swq߼cEzFG7|{7unھ>SP6i)gYHjc W^;jWY}Je2zR|LtL_x<1SǮG*@ QV\ylE:dLd gmǾyշ7zm}EY3 l/uS"ɡ^#c[\yA2/Wc31OY%yÙv%:]ڢrvπVO_>T{7 -򲲶w>G$(V:WA16QU*l  Y1Vu5Ύԩq~V=uЎOiAnH{Ͽ9v\3]nxs.Pl L8 gFEEA`E(-[әtm!j| ~ l 76nt/^Dlb`*;0\T ms~[YNADH'4ޛPlz΄9<L]*#cROWUz)6Xn6R n W,iFpJ(-OMM?<@VdJgX"(+7cv[YKEb͙[k%&Lmpԛ#t# s؎7=/~o H# 9PM A,LD-ѳ88 [o*9jW(dؓI,NuC^%Z&P:^wfa_x&2jYXt˂>W [nH#(>+0qV* G9ۙ͗L Fĉ##sYĠ$Qm ԟev-7N-(l'tGLDu0#NGs [0!3v\ g;>Gg% k7> c\̈́#+:JZoZg[F0C臝fɆEۦP%B*T$#N>Nva}prYT 2è~/gAHUйՎG81]1al7 2 ,\P~]:.BnA}GD/{[TlɊ.m ËߎAʼnMpnhR?T1eM}btwZv%y *.= P\f= bw _ A 1U+u l;O 8?;quK؝$g0RD?%AYްJjM,!V;:$V> @V>t] };ӧ6 .qn^:5yYAլ;(Ƨ#X];J&Ovp zSSkaMaG㑜@8aZ,2'h6"٨5ۆ|8_xb}=nffs3؞=ir[u-dIX DeD`~;#& L~k"S&VqojPsρcz T& ,KqXEpX3&C,Z|iNu|>^Mr_oIЬƆTZ8 Mc0,+ 8ƗΖ0Q(1GE-(0cE'VL#7x _ˢԴTtx֧ؖuᶉL6~N*+eAFnoO%CE@0Wh:\aq܅I´XyKTܞjFKz|3$qfY,&mI_{_Rzl 7kOFk3etFmIENDB`not_in_roster.png000066400000000000000000000042641326020644600336270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/icq/32x32PNG  IHDR szzbKGDtIME VIDATXVo\G͜=={eĎVbMR9ȪDX7qAK+UB  $x7(-ITQShKpRv8k{w^};۵SH|37,b>:kߚIg4[??!  +Jgg}CL{Gt^?ѨzFf퉿|Q{ / >F blS~0s/7&IpQW͛7dۥK_g/e6U"u^4:1Onzi_}D4 spQ,Q__/mdr|s<ˠۆыĠ{s(R}>I^P 188J]>?k|ĉjS;1`xd)Y_ qh\o[FÙl*VWrDZ[[ù\sB!,..o[[[_jjjR$s|ࡃ {Ş"o>_cZ&y9~g,j5~ yy455'&n[ x^d2aߋMMʦz[&?6 zdE}__M2D6E&Z -_ߝ-F(c ^ض)c!0L T=J$b1JEj> :ol^%pCG:NT*r4MeEo$bnn}cd* 1n/c ? iTu]$ ?@mf++h3<Y'ُD,N ]g |$˨"_K 巫 lb& %9zz ZMϝ:'ʩ^gn9ڿ#l9(j5J0~ښn\bV`bb^skHQ۱8Vj"1`^'T\U,ȇ{P"X;F#|uTŏOMƅ[;Ap ƿnį#---j8ɲ`.\xqb'!t{~78E<[m43.s/r1PbvԁAO}cY?"%wtvZŅwW=zv`Qrq9ϟ|}bQ>8rHS}$⧂۱:68 8hڠ{Nb\0@)(Jf_[[6q{g}7ZF@ߝxݶ- s uN/}ܻ1L=^ǁa(x<|r/z(J_$3`+\4 * j7u\,|=U60- xZR<#\6w}\H;r P~ oeeFsCJcaYq3GVsX*@xlRadK%Is?V]L,rY'N6 %( ׯ}-H*t]$ *kPj^Y泳3%rHv!ua&/ò,(OdX_fe/j5 Lr`;wWVVRb%|P[㛅sBa/*uMt&-ex&.&bhRF6wKSSS9czF:NlۮiZff]]CA Ir?k>bOQUdX[V*iZgw-+`)[g#Vb[Y6ݤ@L",JcUT"!J!')B[V- B0إ?^ݽ{.~A!*uY=5mUU2&bĂu ݻ7M:k\.f E_m8TU(w랏/\*%_5D#;w|tWZZvv6,W_ 675zw'G{囷c Fq|bmK\۶EǻuL|ƷP/ur!tcт_-+3K@ !&;{߿g[w};wm? `0,;&@i.CUT$@ g`o|kߔ9)}Y9ƈ|vtM Ng /^XZZ[9!3+YO+i˗Hl;nBJdge\?&\^G٬%7J B x^饗Vyv#\0xsqDIIB5<7c FmaP03kwe¥CTRZZC|p'hwYOB$٤LӐ9 lL=3@z{{By2YV#$)l,^Ol#fU@]*ŲASUaTWD~Ǝ71U@D't鲥SLuH)!IAH ׄ?{ދh؉Pq8cp(+׮w=h 櫻*v5.Cc]{ڵ3fsss]iip%D`.8n@ j|/Fh3!}Xgw%,+`Vb'=>Ox[R\휳BM\L"+15#HMNDi>kӌ0H{{x`VV8`9).9sLu/@Ԧ7 S1"D 7DD`!bDPs\O <obtCig8NXV mö-ض ˶`fjksuv-9 )! B؈YTMʕ+R%TE;!=%j"IIa)Pt0}}2!*C!%Ixtt vLJ\6LVc#lF"OYW #`EYSSR@4$| m;:#o7E͛7AVbq~6=]/go{\Ͽn>uу1MM!%,  M}־^ɹ!/Ϟ VII ݆) ]FQņ?>s Mu@p8Rp=1UN(R,IzR_,[!CJ;JN)iijqgD,\PJWt]ObiƌTYf #$E¡,SVok( DPUAu; II70+;U&Vx}~t3'f)B0pv`{k{sCW;@30 M>LQkʜ9s~ӭG=^"h$v#a0iy |9|Chb0|kR'ag]IENDB`online.png000066400000000000000000000043401326020644600322220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/icq/32x32PNG  IHDR szzbKGDtIME $lIDATXVilT[fޛy3/،=6bCXCBJJ4Qj(RO%jTiլjV )%8es1[&xxl (R^}|9>wyh[6P{c >ȮSw~(DUO-+7(]HǗ|6д+=+&EK{KR7(J*n ?rd'D,Aܽ, ʂoó[j=n$kP *w*+~:cvFLAÚE[k~򳐒'ƭ0 h|G`yJ,de ϛ#>:D,_vNX@l|E\wO-mqG <^t ztS"NC3N>Xپ K,Fkl$|Z3ihV?ܲ9փ"=me_m'fc@;bL8VR>Sի#=@;HQ [%5]w#<Xqe !–]MT\`"r#u œgmfu[yȓtMC i_cUf%Pr\M&BGET/4,t.߼0mѾm(LРwǶ} )RI ,Xg<fb k3 JFђ4GȰeهaQ-rtI&lAsc<#;E F , a@bwF7 }n.D nj%Gށxp[Yg;V,,rqaǡ1ͽXJqL;"lۂ "A('8<0Y~dd xǚgƅlTc C~KD{ ~R4-֠[FM5'Sb[vſ`70.eCِ6qL8wS Z {x<]DP(lQenѿ*&`X!0Ǵ9&@po;~}"z$̈fčsn:X ?8g2MnƂӸH'̑tg;9hb֖obO\YRQAp{s-Z(%?GJoLf 6:sH抧BN7qd3 /.yVb'`0`p.D+FJQ6r=<\R7ۿuE# >j B|ݢ.dVmۼwgm{tqXd H7mkYj816O"z9_8nOK$ʏšA`~uu{ﶿbOWv ??~bt8V ubzlsbg9ԧPY䇖u>eJ8LwbcDLdcF?d.W4pwù'!gl.iE&wGLG:z[dmNIUyj1eOxVg5A q rhhivDL^َm2^ ;[,yGx,:kþkԸ=1XkǛ"w{!ͯ"7^y:zK:yk]o fgclrw$'2r+xARu hJ`F`X aBGfIENDB`xa.png000066400000000000000000000041101326020644600313410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/icq/32x32PNG  IHDR szzbKGDtIME $lIDATXV[l93;;ݝ5^_11 16(DDD PR*UFҗH}Z)KK(HP))NqD)1f׬/x;3zݵ VZRk| >اtI!%Wg;NRϔq!LզqPd&W)U={f1]H$1vϟw?-Q@54ǻ]Uxj Cݹo_ig-WWyCoτeyYIhm[@@d@DSl7Sz]Eq?&pv}w4=իu}Ix7(74|yϞ[ TV;O{;|čY^WOz3J@yEQTbgK]ux]]4L89<{wOX, rQ}{ؕ+(a.''!q66._Γ@QGLڵ2D`mn.] "(^-۶Y|`rl 2:8OY` ۆ_יJ 녯q@2 ӠxLӰa˖u%mQ2Uen,~Kiq'pn3[a3[`G&1u1*źM,:W4@m cŃ%_MuĦ?oz0t#2l7LN.3LQ2㜎R꺠TYjDffL$hcg's!i{=b; nR`]@WƂųg3U6y@>Ŀ;(NIyq.;lk z++**,JͶmfƉxpX:-wS"&Ec#.g[oYp`0z#p0, W.t-|\r|jag2sTh}v!*8?T^ "XL&ʉWT :1r.8(ՅKT+E) Aw>4 ŝ1"0ϻ_+%!aLG9Itac8(Fy[-ۆ(;KLUCCoS(TaG" OC6Ca)7= 8 ^_a!~p^n:&K/3m۶ ۆm=6679::x  `%PK|;Q02eW^zPH"[t紒t Ψ1-!P5X}Y,GIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/icq/48x48/000077500000000000000000000000001326020644600303245ustar00rootroot00000000000000offline.png000066400000000000000000000103121326020644600323720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/icq/48x48PNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<GIDAThY{pTU{>&YwF!0̂ rXAA qtkfݵ@\Մt,ļ_ݤ;H*!VV%9ws}'DuᇼLt]Ƴ?d|XUB.(fEE9|,\0R C$I.;mssssh]qu?E"eYXYYI")**Ⲳ(P__ǏTUK{o޼ I 8zh_\ti@݋0 ?sƕ+WR À,&1##c=0ڸq" `۶mY-aO&_>t4550(--54UUSx< l0iZD"D"4 >}:222Xa!''' oZ!I_~f͢YpHr8Ax:333G(J0 3zzzxbgDQLKHH+,?,uƌo l>s:{:Fu]wBeDEE|>}:Vk$IBE40!ƲIII۷o7'&&R qGY߾ (`f-Mt]NWWW~y٢Gy?*~N8FEBQiUUva*.]j*C__nܸ]۷sw^P?ü 0/v~ׯڴiӣ ;//('ϝ;x^LӇnwϡCbveLLLDWWנP(e1w\oa ! M8W^Y1{֭cZZZ kݘ9s&xOp8UUU#"졂ؒ hooGZZٳgy͚5񝝝믿XV$$$ 0 77d0p8 e[,ttt@UU9>>>g۶m|ww74 $a…,!`ugL?c\kk+'(v̾}P(D+0LHJJt(B<8+&&.Kuݼe$I#rŝD"HJJbYM!e٧px$Ihlliؽ{7ǁ`00uTB ``4a0( }rrrȔ)S-`2%+2̘UUȠ^] O<ӱ~ȲT MӐ666C#/j4Mk֬=М0*( *++#  :cZ!@0DKK 6n܈HOO;w.֦ `F| Yv-5K ::/SNɲ;m/߼ys9stO0 ܏%숞dC}}>| n}ӦMCKK˨L&A3gs@uuuݨAyݻwv;n2nPUw6n 5!q d&d9_Bww*.-V1 (l60 j|G(>TUU1ڼ Mff:^x1]TTF|>aahڸ# L܈;@Uރ{FNFxreLVyffy|>ܸqgΜ ܼyWMOO?s]AH`Yvi,Ybbڠ.;B׽Ί5jp8`X0 G4g0ܢ$2$I뵕mxyyypxGuuuŨAS<ϧ2330 h6p(|&zkx<σ(~:65˲X,ذazj\r'N\\9p-30˗VXA)>477Cqk1%\9u EEE-yeY,kn7l6|AXVѣG?)((\^^?Xrw|b y&DQ<$$$쇪@HҸ7{nߧ`ҤI 躎^"##s1(Zp)2{ٲeF__߄`ҤIK±cM?8!qEx:(^rOB!|> CɠBHzTTTh4rǃ&7+00@QAHn-;( ߯E1)Sz;Yna*hkfĕ+WsN_2kE`#dُf7^}2B8|ׯ_|I6-- ^܉3<ݳg$BȘkEnرcxga0 Yqj9@\WEBBfGLL XŞ={jii)7sLtuuuX,p{;C Fl6߿'O͛ 9hgZQ]] UUٳgS,ۉx{FTUU.]ӄtuu^&&&(//_/// 6xΛfaƌe?:uT}˖-FUM677#11DGG :9Î;8;w@rr2RRRpF&MD""a>ݰap8biphkk ޸qÐBvQC}7n-˸ipY??,IiY֔5kXfΜ Y,nߌAQgԴ2332 {I Vk$  Sn_ /0nB̚5 <_Eq>y$%%aΝ`08r wFyQg''' ,PE:::jEQ_\S(PEEE5ӧsT][Ng(//0L[iiYUQO ,TTT::Ư"DQ?νox6S֖W4mWNU.a1FD3𻪪Ξ=OIIA]݈hV}4Md( nlwaj~~?kךzzz$EAtt4꫐i(e>#--M0o"IMl64nlGmm-EQ$2hH$t! 5&&@nʕ+:M( F" PIII4q`:|>Jn8{lP?PE `4zuMƿ(`2|>> 'NHHBeeBH[GGDŽ*N t:$a~]w`SN␖k׮ABfD"om6۸ 6իG_~饗5kxGYYz뭐$IN.ƠQ 668vɀ$Ik].ݡ~c9d&!..Nu]3CmʊVXAy<B!Płhx<  *ozsq-Mƹ{t6krb^O-̅dX4TFyd}cE4ݸ&l{.71 |h 2c_}RpHd+ez|'t|4a0t!-!E׈3:aZ_7ؔ45 K hsO)A`T^BTujs||LN}4f,z QwR *b3%ڥ9t!Jbzo̥8M(~!M$aq"& ws,.[bnaJӟD74K͔,ZIuX]S&Eu?aUsPHo>wVo$(R >6kJ`6K*N^wB$nt&_H+M#A,o=sNXͥ9CV} VgedܿЧD>:ھ@w;Ykf>bEHׁ\ Xdn q\X Ϝ j*o<14Q[pqO 6AX,siQ%b#f6EYR0f.+Yd$=̥!.,&ŠLDAU1(b KUOd/1f[N I0P595(E6ɲhPǍE`/uCPb#U-$J $A$T-HX2;^(((M}$dN0CC%4m^_uЌ!hŪ$cJzjL ~cRD@備~_"l/%'~'!QѵO7rNq@!)s&%.rs; ᣦȐFX]Y 򃛷_bSn"Vg!≯*̹&GNVc[Gt5FE"i(Di q8k`X-wO弿3_lhR4ߑt>U{u}Ǩ˚m3R-=ZK5>:3͛ ͎YL+H]Sd7xTC4+Q-@hV][)lm,h%̚JfW?ߏKٳ Q"/ϥ{]0dZޑU|V;\~>˾zJ1~!")R.],M3$$l2)z,c좑W=Nk>p/mMק'$#9lVX>}NN#·+7?0 ɤc2b:"b8gAQъ b$^hQ/I R13и{{EWu,犻r::b5$Jb =@b17oӉ uRsDQbZwǭ޻CҘ:O+SM|pS^<^pȩ]B|MO#$1/(G5r65 S R̵حCgu$5ʼ/. Τ^ R<-t3O 3ZSb y^]i%VS:RU*A36/3; @040?Ar}Œ'''Ȥ mf ieU\(>.qV2}HdcPڞ]}LWIxpoFM:c!O=IENDB`chat.png000066400000000000000000000015421326020644600316630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/irc/16x16PNG  IHDRabKGDtIME QIDAT8UMlTU;o>N_j)(ta"cA*TXą 2ngTn]e!dI hL4a%-*g:owuA:guO9691c;nx153M ήtSc K,_RMeW';<k-k7\XXk?xIkCkrI=h)љr,.]h :x`\MO37ӣOtn5$gF^[&a+-k-t,ơ3魢s5J\KpmʍDSS+My㵗5@S`cݟ~gjr#ԃ:+++\x?KǀcO:ߛ: /.ƽ\o닗VեëߜKo:84FUͦi*]ru]7]}P(͟/J(4bEW|k3. rk-GK}ZZ!pY?LEFCɽ-}H FU$#oT:V;'Т^P>6sdhwV898n߫1ؓ|qj#tGC"88A>9! tzqW?̑"8Kp&%Gz3z/JyU*y&i6CDT+x7:>wXқ[Xk|32_~#m r\IENDB`dnd.png000066400000000000000000000015311326020644600315070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/irc/16x16PNG  IHDRabKGDtIME |IDAT8UMh\ek2ә4ɄDcChR"V(5dUPvS2k*2 bX4A,4VZskvFͤ?ә;;.bY9/{#GHgu&_}y0.cc ~/dR4[>LM\1| AkzM&3Q&D>a UÇbڴzJ%:!bY^iїOb!g?o5e Fk:k`/!"ٹygvn}/fK5 .]ηPJד^@O!߈EpEY|.{ŀDW)[tB:((fW:rbm!J1 h4B.lhTʄ#^;Ow+?sro''ay@[Ʊ%-QĽ/|6BPwox}Ԍ~8 tı] $ӿQڶ}إ%P|cQūgjػG<3׽ ڢؕ\ZWwaWV0). "k]^tz(A( g*=* !G[TbZCګW)+qqNn$s^>|llvm_08[ Onq'3GN9wD6t= y`mqqhIENDB`not_in_roster.png000066400000000000000000000014141326020644600336260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/irc/16x16PNG  IHDRabKGDtIME  cIDAT8e_k\En6m4Wb)l[#ՂVAP^X(H9 ji(BJwmƶ"&{v9.ySԍYn] aG<|w c/>k8ge9߯z>ٳeu rTuBP5l>$Ι7Oq3Z {4MF*!xA>[{DѨcBV9GP4FDk 1Fy uo9'~w3$\Y=>Lbҫ^*|<+eQ0hxWs;eYb%7^*53VӊIb|ɲLDu;(0Ɛe1ƇG5yȓպAyrZM()(jVVRK*>iDtQXk)0ag'I^vgY"Qޓ˿t©&[[[,,,L5Qyv wA袳U`ľ6ՈP XEaXߔ]; 2 8{{ 򗱎yrbn{c6G8qA؛p1;k8ZUO4]CVI*5IENDB`offline.png000066400000000000000000000013331326020644600323640ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/irc/16x16PNG  IHDRabKGDtIME Q}IDAT8eSMOSA=s;{ RV7ưpabte!qW>$~!.WH˳ODEHڹ.лsϹd芑"wSD+p o[ `an^KKb{{J뗶6~~1rx|`0)Q($Xq6NHB?Fr[-N\zY8F:٨u8өYZz \ɝW@t$AJI$mnm6o=Jஸ4X9"l`mu(MnV/0H8`6 !E!o<*܊W8"" j͜5 36 Znϔw% H0lPhj+|?J9i0̈8{BNkeg-|C92; F(\'̀5 CwԓG;S< ({|dKQߔ͖8̧A*jOѽ@33/TTV:œS4v[UUI[2 ҈*Udځc;h6[Rm е8\갧@ѸZ.՟=e%IENDB`online.png000066400000000000000000000014161326020644600322300ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/irc/16x16PNG  IHDRabKGDtIME QIDAT8eSMhTWνw޼&ˀԍ. RCJf,YvY .Eܥ;BiJZ1ƍANZ!?{L|pwww>BT3Vg[FF`Toܹ_7Kq81RjHJi4[wS̔sh,8@}^G܌( s n s9 փi M6 (ahn'gWD4GʬA$P0 3l)0 YA;MW7`yϟ bP1'@h{Y}hRb?=^ nAsddEEew89\D,K@nW@<t`S)V$nn9 v&qCcQt4I9DeQ%0M4ѪB*h4({P} \8FU<5(8=asgȫ/d:>| 30S%?5f*KO.7,!*6@Z`3>ˠN4$_I^./oYoSS,0k@"/.IpeI$EŻvOOKpc0ۻno?*/<4[!IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/irc/32x32/000077500000000000000000000000001326020644600303075ustar00rootroot00000000000000away.png000066400000000000000000000026211326020644600317000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/irc/32x32PNG  IHDR szzbKGDtIME *_23IDATXŖˏTEz=Lpb\q u{֍Wٹ0хqAQ" ( 3q==i11$>|lfG{[ ̮>OZja9Ȅw֎'!*>xw֎=qRN0iՈϯ@l4r pY4ujۡ@@sP; Ą˪; )" 3׾h,{vZ3]zts nH -̯zR\ÅA9L:V E0n[[D}2震T& ztzw2n}k@B$[ү[(Z7BHbISuj@#ˆـ d*rg":htXa^GZAAe5`cv;vY%h 1t+![`7a_[.H 4˳.@rL6rΫ%ZXk\~!!`-/oycQPlNPn; Wև2qR萄z7vZ8ovSڸvicaM-4멍ONk-5Jm ,^>K|v@UlluAV׀aGqcJh{էU)T;.٥a6n|]:o܃\vk_bozU6?t v~=]h^w#ay~.H/<1MzF.0)6bzݵ1(wY+`=!)Z=ZA`#2PB&^$hUW`E8VZ=Lӛ!Zc4{VƵ˵|d/z3d+m%)i/|bɍo2&IENDB`chat.png000066400000000000000000000034521326020644600316610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/irc/32x32PNG  IHDR szzbKGDtIME *_2IDATXW[lGfvvc8ķ!6JiI hZ5 * /~P Q6n4Im4EU'CHKe3{g1#voJCCb:g_y}X,49~GK6ڬfzW2v)%}R-Y exʝCÅYw^eч=*d4oD,*Q~\69"<7?ų\8x###W(@vԚh@Ŋmh~}_5{14M0i#{};:4^>TĠH0cAn޸)0_u렔ىS šww::6p~kCn6 /TU:{_Ol 9800 wiH) |'.z,ĕ[esEWS0 qvm8g`5%@)ՑX\ VtR۴݁3WvZl=0 9NJ)(%affg0* 7vy! k>Ք/s^xXA1tNRE ݥ4,S@*M^(bZ>&`CO@uzw0:}Mkq#H)͙~ءhf0: `\?cXVʼn4z3OCZmW`0Bp-b3Yd,g  F<)ش>"MJ硔U\igaN&g @)؁pM[5`(*fɓIgtoPyYpE<ފ?ku01o^pPcHJ> ^BKW>K%^@[ZZ|PK*:7H`prɅ!1S'@m`vjse,|h"ljFK@7X(f*z"l@{vm6 N"83vxƂY1|7|X,jƻMWgoMxaD`||T&̤)?I9@;_9p'[JNgc{F^%FDy" 8bBLC*@])kXoH C))g BG$?jqyRN/7yЎx۴ҭ?F-s')`Tq#zja,& 9y"vF1I彚XWͥ@ Ez^IENDB`dnd.png000066400000000000000000000033361326020644600315100ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/irc/32x32PNG  IHDR szzbKGDtIME 9PeIDATXW[l\W]8дNDN\FUӄʊ@F"P >/ EBQ  _ UjQ81"mM?gVе;?Ui;=pݞ'޷ʴk񓟽PIc?v4a~yN;od]l pm U݈u"ÜP&m#;ef֜"ڱLOspf`Qps$?hc' @fna,"~0FG&O ,,i:2 <9 ,5L`SI?2m bW7=P-`n x쑇~i~\*7Xi6K|r V.- U Ƙ\փ6Aєws 3! *'~'BYs`H0&"5pL@X@["{=]#ж]K˭-ѐx~//3ԙ'<ށE~w݋B,@xczFx!HzěHGZFHDD@u"ڇg|uײsHP> }s'~&ݱB̉Dz LOA9Q"jf.:vBe\Dd^ ('rOƱNTj>m}r,:6nm Z.&,ݎc#L*5?$f>:b9۱ !0{*It mL\M rx,8BB_15XQfb4RZkW)-ЋB6FLSNjA"ZKc3:FcυW;,a_!g:DYr^^4"#(L6/RyCY {h?H/pڵc?zXD~۾R*Z"jA({WC>(Fv `qH ~B/EС\wxgyeDy}y Ju &v?&9 c|ahy։%q7I 1t=8MJ)d,r[;'^bEp6\hi@tĔ=M~9?2yFy"l/kt?Au8R_)lBYjlZΟH݄<5XP`y`'jbG|zfcï#mIT(<=]7ݲ{{9~!?TrJ=Haeby3` E,_b7oΉ1J`pue= wgo -VXHW6bg=(ocp~;` •,^PJs@njd5?puUG8[, ' /{ (Vo5gRtS:)@ SmtNO46vܶj2T>IENDB`not_in_roster.png000066400000000000000000000031061326020644600336220ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/irc/32x32PNG  IHDR szzbKGDtIME %CsIDATXWmo~Ν^Bx)m) `^BB?RHUARժB`xIL^;3;3s0ٗOi{9395hѣGv/mw:5]\s=p!0cy1 x/Uſ 803痹J~E82DaXpjmt՗_sJ)fv?5Le ! @UĒ㵚/0D, "B Rq2p0wV$d5`f@Lza r1̹" $){J\Ϲ'ޫ㸛Rzr/ET7jb;{BgiXɀ0\,]F' r.mnf֋wٶOZ {6{Xz`cc}'x6CxN%ЎV0==]SD#hݟp[s~XET`7׌MM`euV "Da8.^++XY]銙@d}7 %,r1yw+D}_APᣅͧ}^3p$?||-CEĘP/οf{Ǒo=i88?rUF$BM`)4$ W*{Fg fr hpqj Ў*b\hXa$ l_Cg}7;NVǵUz4% G!Ib2q @lms}hk!A!Iŀ$̣e(RG } Rf[ fHu"\zpY;{Q jZ'$ ~`W*3PjWf$q RދEG#B!I n СDBX) P$1PRKv$IUF~[o?rN}y[Պ&''i¹mnnf3aO'K_^>ߓ-cuoϣwZX][?p KXX_OMG;RWEç^]IH5h1HlrmhN4 =wyFߏHi+IDpfy= ]0 "QvJWR>b[ѫkk^g1!ŋE|..,T&w,9{ H kqZR*`_ nłݮ2@h@fev7@R!+"#A雦K^k]K8p@3F%G7oo@nq2Qιs85[yȚ?0:w*ȃIN^$^8:jgIENDB`offline.png000066400000000000000000000031071326020644600323610ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/irc/32x32PNG  IHDR szzbKGDtIME *_2IDATXV;o\ι]T$*Ma `)G,ƐriT8m( %]$\HȊ,Zܽ{3礸w4`pwfsf\M[qb‹`O¯,c7oD<{b Hy=RQN۲3CP#cbg&r|"3O8QK1=6H`ل*1AZ^{:'IQ` *%@==;:}-|m@DÏ|_xUNW|ޟgl%`w{c^'ei ҟ ?MwMh^rZ -D14KgElDk& aN#@(=FĹ҂ ̄8UEGuVE,&"Z L 3&V.08 Wd$IU $x6֝ @&B$Q'D>sBa.soNHI7MHDH$z |XkkY2;>zVEʪ $~kׄn4|民AۭD[o (-q,KZ$u}\rB-z0*ɪZdZTk!úlIENDB`online.png000066400000000000000000000030751326020644600322270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/irc/32x32PNG  IHDR szzbKGDtIME *_2IDATXWKٝ٧{!m9"\!AL…)("R^8eOL"E(CR"@K$RHhGxXB^zUC?fggT鿾U=y^'N,VNZ_{GI05H<~pq.i6FZ)?vaNTgvl@c17pX ]9ә3 m`XRn8$&<.FrܗKCG$Nam'*@ydYOb<PWO+"ԍxXZZЮ `q}A@"@3/oy }$)?Ѝ,Qw.Ɂ , RK }PB:#kf. 09 Ih"E>2RfVg^Rl#!HV'" n,vBMY|1t9ro\XhXh "| 1o_aXJzE ("-S~/e'7Xc߸"(m^TXkч)Å7މW/8O{wt["lRll}v +$JrnWdGNZDA9^1,r| +'\cEpi=\G! ._bL zQ@L~?u p*@Dp˾i|GW:/މD4 -[oTkSxkȩV}%vS8 xVzWrG`ᵕ3/Eg?adhDUEmWh!uDD0> T3pF6+`jQ 2 5.̀3C&1 m2YrwmqG6v~ XK݁;&鉍chG` pziF ' \Ll9̷Xs"bMY5 ]+H:G,k ZC`A`uԖEk|kNJ/-a??mnKK}ʅ 2X8I l=\* ^yNBQc_oWc܊4[kX?ǰFȴsXMCaݵN&Uk :L&J}P<)6 _-dBSbc P>@*mm4&Tt(yz]IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/mrim/000077500000000000000000000000001326020644600277155ustar00rootroot0000000000000016x16/000077500000000000000000000000001326020644600304235ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/mrimaway.png000066400000000000000000000020321326020644600320670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/mrim/16x16PNG  IHDRasRGBbKGD pHYs  tIME  c)&tEXtCommentCreated with GIMPWuIDAT8EMLe]XvgiQAP4h6$hS5c6Ӧ1jlmC5XAmt(,,,33\Wĸ4f2+RB@&|`!gw7b/xq* BYFc;k"BܢpmtRn- kr=;M 7bh}G`f)r:ǝNJs#HYvK{Wڧʮ=Gv躮jqqqqZr{LKbtZg=Oգ3o0aг-k@W#r4?蝵SC@!5 ~ַUҬK'W+[?w0%4 P@!# 6OH ꤮mVf<U(JhZNH#(*_-Nn )Ud7VR},pieds6k2%rbkBh(PJ :@ Tx<Щ@DbIENDB`chat.png000066400000000000000000000016431326020644600320540ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/mrim/16x16PNG  IHDRasRGBbKGD pHYs  tIME 5#tEXtCommentCreated with GIMPWIDAT8U=lGK --lA Ep +`0?B:Hď`@ jLL  HBKm)w?Yg{]ciHRPT~N}J*`jzQ=&jyZgBy*`6Hufui,TiL޵֪.*8]#iIy 6tQja6-5lȀe~uȄ24xgbZVod}:|c (R$PA$n)+YŒŞToDڽ<[d9N qm\2[\œji7)׼U/ž[VLCѝwO>V  D)7.XQd%EϧWfڒ;=ӃÅqL1 #B56/ֺw46ԕ?{\"#(?w`M#gef8KErRAzsE$RȎ)LN(pKf+sJP9?SkG4pxm5/|I&\5pGo)%t-V#~34^ g[UYRdPodӷF8g{xTbsMYE%4JZƊ3leg`PV+d͓3=^weēuܐIafԢYlt1ߋw<-&^jۮ;n~vh w2KQTV1H>0 z>II%K<1kuYCZM~fwJE Ɣq 4"PP& iycMq))}mWzǞ(?kˋvҘU@$PQVV(|v?r`n7D†'{86=P񇢢zjL cG̔jJ\N<=fSFaw}V)^{ =5jld2q8:b& g\2XN;謏M r|>Z0_MͲfX.&.TTN luDYtq)J\$ 佩N%[\vl̳N.6jg msR3yA>/+ ѕD]|TA~tEY)uj,Ug]l`9d"ܽ y}(L~y|0R_g;_Bui^* $:;;{~sRCӴgcccO?ObvvfffboR1ŀy &1 CjJ/VWW N`aa.gAxFӴj^E ƒH$rl⣣_雕J۟,6M(tZ&FoX]-$LLLL&ojv`0cHo6 RiwC.ld2H$$@XY^^4ccDG\sG~QU建|K?r÷c=qxx*!#mύ AӼ,˪4|CQW@,Ͽqh#i!1G)xJ)1JiZOOOwJ]/*zi(v?*B;Bb ~aYuJ)GD@D1_w4M{uԶ8祔nwX,^B\GĨ}OHFK)c%J)"Jv0w)<ni$ DRJRDL F-YJZZ(0R>vgR:RE,k#bBBR}D[[[\]4mZ) C<I4t]#0yϲ0119G8{fT*}q.Ya=n'Hi3Yu៌FfXLKSSS+gggVnef.s4AtM,cH0:y1cs˲4s, x4!333u(TP(|b{uF0"Rjn>!)LJ)U.w]b[0"VfYVO`04 @DubN9FIENDB`online.png000066400000000000000000000014561326020644600324230ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/mrim/16x16PNG  IHDRasRGBbKGD pHYs  tIME 4;0%tEXtCommentCreated with GIMPWIDAT8MOLAxy0di9c.˲Hٸm١q 'N/a : uZ0au]zTx@rs>슏 PxsqTӮ "ZxLFΤ)%W!Vݴ`̂;Ljdj")1nyZ#V_*IENDB`xa.png000066400000000000000000000017511326020644600315450ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/mrim/16x16PNG  IHDRasRGBbKGD pHYs  tIME 44;8;tEXtCommentCreated with GIMPWDIDAT8MKlTU@ϝ_3v %JvӰ@1*vą!A,J܈ Ĉ0 JuQͼ߽ٜ܇rP;;i//N:hBJmf&d) JpOW3.d. J ˑz'wmg%Ñ<[*,;KeuptB":DGB&<ǗP7F?1-aJlⱱ^>5>ow2/p[%{u&Ϗbjt~-ե5R>(Lr6=e 9aRҴasf{Ɏ $^;T6xmtD i^:3qM&,̬s[ؔ hcq7q,U *XWcm,Bu#[-;.⑚I SlӐv!>B&N9)<'vR=q'F   pyn3[s{Z`kvi< S~j@D vf_ W&ӣeםw7jQhEF F߉E8dK۬^/[XÆ(ӥ]LaWkŽWedfm%WXV;yET66w\c6+b`ɥǺjτǨ<6 i>;?%? J&M`͚5Y}us rJ)Rz$ &!*%Q߰^ <Uu6/|lj ~Y7rSo[qj/[EKWTUUM1RhBm۶{LZGTA"|_\0)Nv_CvX`E.~-uuubCky@+94)OH$o^剭[& TG |,&S)X9۞8e~sTy*f}/['+++,_|խ(/+-@))VJ1}Zwgmj^LSXyh2J!aZA)JAƅ~z^:X;-S&WT PJ5 9pR",Zr%{{~pvHgTϩ40o^ 27'|04G,;f͚U slO#2 >g{*++ ?IRRH..p=L_K+Ep]W_!,Bzj '>Ϭhe{D|*tzcq']ԺJyR)%T$iǩ+J˪.a띾G&]h{^1~aA]IƅK LJ [#Zs0 -P7˦!{p=FmlLRZo+!JJ! eiؽ t?++]rth$?n/As2C4$t َ)4Fh8CZK\ߘh Nnӳ~/ftQZR@pR`T[080|)7ߞ5R 6ΰP+ĩZ`&zhCn#f1!!`hOglޗ,x퐕X8͙_ZL)oHO:rkYVH+%FA01O)%8~/j"9nmI>1d>r͗rxXcfPJɳ D7l[&e B9~-: :;m:ݬYLH]V!J|&lٕTTNk RJ48Nwy^}l_K+ (s|['cibS$wn̮͆uW{SWQL߄b捩:7+XUgWUM<C8OTdxlJT||jKqq)3g%drmx79RjV7&IENDB`chat.png000066400000000000000000000045071326020644600320520ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/mrim/32x32PNG  IHDR szzsRGBbKGD pHYs  tIME 52PCOtEXtCommentCreated with GIMPWIDATXÕkl߼360\LpIKMKCIMChj*m*UQWRRmwRU$EMM@@067cga6Jϗ}ΉO ⨈V"1|(EMB}[o56jPW$hʀ~q &P]@~@=6{GV5*ykN(gƨ^s/o'E }`1TzUlo`}3M #&1gBg2XRZm.#.Z OzWe}Vȁ5Ye*Kn%n"p VXSAPsrLˑ(Qυ KЌ|TY!H jVLTr Trac"+~zKo؛YKڇ3/\{Я;:q dEޮXx+Σ7݌#d+n/!H 7ߵcG7ùta M|T6y; w=ozB}UOHKa;s0.+j%dө_pnVU0`چ s>(,OX}5Փ/~}6{_F~%#njt(A7=WZx.`VK&̕jn1B֘rԲVgmZc;>VmKsCa0=}S>~/'}ܺ= b!jf][e*6Lki\] fAJnJAF R8j3k=Gu;Ѩ9}j+#UKI;-3Ufi6쪊59HU¢M-Mܨ*>y;zaaTn3o\w>(K9 GIC7FtGP JJsҬxWu),LJUJI\GJUQ[-5(6CZ4BV+СjTiu|rqL"6fx('i@"S*NAaWtW%Eʼn_?/73ƕbRJd9鬣9c؀Mkj OIIWN oό64bPxw~GTҫOZ UGTQmV q񮟧y0mڅuiùm^{uDWǸ+3ΞuqcnPflz+F 4jWllժFL{kuxR'r[Y7FmڷGO3=sp?n+f5j% 8 `ʘ hQ/6WhY"YۨZPʈs~&FG9}7>5卹iyI-ԕ󸸴juZHL韰p:.6'Hu@#}zp?~ˏ )s4K Gv;5jP%a[l6U,WJ3tO=C7<\hX`6إ&Y+e,b)4 H4S{2)dXl%FZ(˻iȈ!E7sfȗ'EIENDB`dnd.png000066400000000000000000000043001326020644600316670ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/mrim/32x32PNG  IHDR szzsRGBbKGD pHYs  tIME 5/3EtEXtCommentCreated with GIMPWIDATXÍi]}9.s=gkec>6Mn4jLk ̽_C_Q)~Rj=umqvyE6A&e#a>8nz܄|5벴 x(NA0):KqMn)nP$ԮM9Ю`xޠݎ l,OpĐgl=6)e$QW|CLI6r9-cݨA\Bzi|Lk ~yie'ku^[>l>2q_N_.f?aQ}ZB-,pA Ƴwlަ[ٵ}d䞠VovG/ ?sVyi2#Y3UU~qW\|+?mr嚤VԪZ-jݵyq;ϸ]6cCIr& G<.jo]_0Kθ\Qըդ&4Uv]T=kTBTL_6,Ujȯ,V>'ZV?WZMR)Nd-D-DivuZgEH=cQ}Kh,XpjU:=}z>5%Tj5R\3찳,HwǼk-B4i՟*cOac)IKqE4q6OcD2rAkOhK.Qs'#DV=Y윽~af+2)β6њzsɒo~SiJd+s/ܱCR°YCyBtV{];m)aJJUA|^T,;(+DA D1IJUa^p/M"h՟y g}GS¸ƥ,$//!M6'nLA "~/LgyqQ u.O,OH_zO~e-Fn.OX9}ė"5$T AUQSJ:Es&NYz˛vyۮ+7YTĉ qL=dC}.c!Eёr%c ZfmsMzh4OUaf͝s0E?i8-OT]vEK,Erqͽwߚ{ui zŻ瞬׿7&;Īߔڴ5HY%TǞei[}1ROEsDBa3W$+D%qқ*sڮlB[%ANMd"g }??T8^\htXe[uI> RApPh8xq`NF~Bv-Yl1 ̋XF\,PIENDB`not_in_roster.png000066400000000000000000000051111326020644600340070ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/mrim/32x32PNG  IHDR szzsRGBbKGD pHYs  tIME 5-KtEXtCommentCreated with GIMPW IDATXÝW]lWήwmc;vqB$V >xB! R!HHJ< x DvvYkǻٙ\JH%!)TE4BTZ}{f)8$_">GSԐii Aqs]W:WVW ?_ # 5yoNOO?3885H{}nrR\.ޏ3O8Ǐڌ1qujj8qH)B@0 N$GRC/WՍ V#ONN>;;; c Bpxb޺u\X*PID t:d2GXTUel$P=66:vWOڷo߀DZ&/_p? B`@55MrO=4Mslll1Bw)e18d@;%j:w.gihf[J {?D$jy7~<[ bι}Db$LH)#z9Bpt*Wa PUuib2ƀ644t|fff4Mpl6qܹgΜyU@1Mssw~kTHV|Z&H)q6^vگDMT* UUB ,155l6}Bܞ뺷(L3Gyqbb ˲T)]Y9SjZ4-9_y+eBq0N3LӴ#!q?y1Oq9@7*J@k~R0ƺm> Ovww "AT*3xnԾ/JjZ )H$1p!@SFnS.%"Pt]kV< R*ώaeŭײlBppΫKRJ)r)"@aTιzM98X<7 YVKKt89* dX]FDʇCJIHH);!$P`iIFJV > "\p. !D%أ4Mhg-!C⿒ݪuzjJZaЎyq\;xs8E`D/Cؖe%g/VN|Ȁ8`=z,ÃKKF#@, +j^M?n&N?6<jLJ)]׽VպRԓ""FD^ټl6/xw5X711ҡCe"}T+եZ7[V@nR5 ǢퟗJ;YIr$&#Hw܎?Ni2I!cEIgX2<|:n,eM !lookO cSSS?}&1ou[|oH)el Y>I;8\lX|>(p'@\.Ϲne ۣi435MD"4Mۥ.UUTU`I)sO_U;_.8:%.H !Έs_t]8ǹy<@c2Ms*N?l!]$Y $I ~[.{q˜uN_ct:=adzBQMy vqw{ZgPPɂIENDB`offline.png000066400000000000000000000045421326020644600325540ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/mrim/32x32PNG  IHDR szzsRGBbKGD pHYs  tIME $\*tEXtCommentCreated with GIMPWIDATXÕW[$UϭꜪ鞞]fݰ\D@($F O>*hxD#A j J\]`wbzz:?B<\@[PPGq?vЋ4LB0 / p* k-Z,Jlv3q/8t:q|_Eyw 4" k?|1js)<vB@ 0s(ޭEa!B]iOi68ovq|y*^Jb(uB(tt !|5N`Q0`!jE7SJ67h!CnN$w԰( di!˲Ӎ]!ĵ(PAzsUU4M 8x6\K|!D\NYkRTYeyss1ƄUUJM0ZHƏ,{ c}]OjɭzΝaSEQL]z !竪*&F!Z8w5xaҀ^h+vFt}.]{PJzS(Ly&<[7)Y7_;nC;OЎ!@z7l0.5P39ȚGY A`cVU0-X좃 l۟_p4RB_BR<_ @YU)91v %Rwzy>Bheaa8yC`XXZZ|RJ!$ ,˓EQL8K8KEQeى(nqPy!k9s_0 ZKuzʲ<=~ [dVA|* Uf֟R#BHKqc:$kqίMt:}b0<EMZ+c0N l6{])u!+UUlmk-E1fO _8hzcf n)'Z3D!dNpxDk-cK1EL& #8NI89LBoZ-rc  fYc>|>>I3y?KTEQ(b-WMTUB95t7!|>5I?$I^RiǔRnn$I&jc`:]ZZ!axo$ϦiJQ礔)BiB) }_q7y"JpAGrY[Q^^A9)RjZԢZBBhvsQI$8YRt_pn1y^1)J.$T4<۹Y͡,ˎefƘPv6G1J)YfOO&'g)kCe'Ir4Mca^_y*t !LjFk=RSU,ײ,{(sH?JkF$I!a-yw8P)UU 13vbd{: @IENDB`online.png000066400000000000000000000036511326020644600324160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/mrim/32x32PNG  IHDR szzsRGBbKGD pHYs  tIME 5*C/4tEXtCommentCreated with GIMPWIDATXÝklyimWhPaW@"t (sٌfn/louqdo\2w˲%Menܔ@(r-PNyOSd!7[K>r>ORF:ziW\UQB&dbg~dͰ=# .eMXe"眔 둏x7VHVjTu9q봛5yAoM6D*Qzȋy )* ^J kc]2rrs[ tcqVpֱ~慨\Q@>M/r;.٩Hd!ΡBU^ˣcF=c/w+9TFk⛱IKiФ8FCF blHJXy F V4]Ā~ݺjwY'u؉CN:hVj7_-Bף7x` PwY1Ӕa1|*<AoxG )ԡK:BLb%:v~5rʔYۦiWh 1@Hɘo6,jcpşf3j[UR)IzۀnSThRe*4ZdvSUwR-n2ͦ^x6E&NզkR6J22#u0 LcLJ5rG 灂n5l3$V\#أa;eVL!"Yvx2MGhTz o~%H£S*b X i >Gm:5gL3S(0jX~|@{L ѥVɫ:S4ČOÑKdPJ f[mV3`PA6 xhEjRB  dUHtjue}u֪uKNy*eO}jX}  rUTLp{~{*I ϋ'eUCjJLSZݤ d% HOTQސ ꘝ(V"+( ]!,j6B9e?x3v8(;U톉h 6BVhXfUjLH5^u.'aS>5lǗ7dJQ\:uH #/&圓s#~{IIENDB`xa.png000066400000000000000000000046511326020644600315430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/mrim/32x32PNG  IHDR szzsRGBbKGD pHYs  tIME 5)&etEXtCommentCreated with GIMPW IDATXÕ{T?;3wv^;s},A+ [4 JEkLh҇iW_M#5IMhZkm5R <ecq=;$wwNX aP{JBH 0?ݡ,#RzGnM?}+ZUm*̉ VF [ǎ#,%0*OF~ɉEs"|sqes4]bLTrPB+D/QUͧY}UP*k2E95I-ZzI @ ທQ׺G3S6 : t_-a[~(31 (HқB!D/ܚdKM[xeA:IT*q<̥yv=lY@_,rb\5T)A7:I)yE0ɮQ40 E C%],9  M6S9h qn4F~d*!6t,! Ďu5<zGK .QIp۪Et Aiefb&65 QAfuM_Eܼ(iBAn qkI&ޟsv© ZdS3l4F-Xfe _,! a)g9)%ӎ.1,6 'LBlpswhD XDPjZM6{G ٠72Áj/ePflfgkʅB'[!30U .V("1h iQMRWyaJz{dJ|P1m ADŽ&!<@-`_-Z@!@!A(>= Z,-g" !IEq$I>Emj"6II u΁y,ICU5{\FAxP7t:=;L?Es+'lͥ_UJ=^EQ|immm[j6ZEQ|s'h0_Y]]ՏJ)L&oN&{g}UU M:zI6ƤƘUU5|>3mSJGB_9?ͳ97bq* uB9G7c>5NO"A(10 oLH6kkվ(LǼ4M&N83OayߍZ(_JB^q[^)Sy7;t硔A?(tPuB 4MKf#<MB?G D1h= VYkRfׅa0 Q7ks?E~) F9kA"~X,NihB|l8Ν;5 -;chsI68Tߨ<7sPJwf1ᵌ- +(?<+(h4:,mG\JykEq˜\q/'D- + RΫz3k x|꺆/2n!mzCJ)+Rzy1p9a_cUUTu0Bۄ?MӓyZ[#o\[[[m+JcL)1֞j`=%c>Q3ƀR6A!1v.DIͯy~9WcoΝ;tY;F PBmBa!Ǵ֭vt9}ާYX,>Mǚl1^UU:WWWKdRڪCEJnJ}s9v-0RJhke,' cTJ(k-hfݮD6rm&F]wqqy!hOh$ue]86|]ǥy@s-KshIH _{t/PT繖$үBH={ն`BU0BCyK:^uc-zYk͂Z1cs!DK_9GGEUU/tApE1F7U_Z";["q mdx.>! qmG |?T56ykBۅ[sUUm`sy]ׯ(G& JZ,T!n^Sa`0|@zy.B2 ~sNEq3:Zrc Xk3luRj ! !'F` F]Q}t0`08e]׳z `%I[GQ'RIt,Q%d9Lqe@քˣy9R/Apx3'V!L\zc7Uq9Ac E_i>-[X/kZM9s>fu]9~<˲I\d!*:M4>ڵnk$;YX5!!vq㣫Z;pޒ'&10ƞeݽ(@ ݕ!Dp9 CWDZTUQZ[cZ<c ߵƵOQ|tz1D87Jj!.i8*McιRk!ztc /ܵu+yxyҾq||\Ɨ0fa!D܋2BhB<_J)5g ca"yfEqZ{QכhJ)bxx>l6{Tkq!m4M(FWVV̙38EQZE]i)#Zrh窪z(Ǫ:GaV!ױTYѪ~\USJ;VJmH)?wU9a?677R\]ߓRpXMfZsj:q8˲G˲|c<y޺bu8yQ|;|j ́Ĉs~̵άkf?2rkkmbx'aYy1fNZ5ueٿ7,nb_B)BZKuzSu]?~ZJ欭G3yWtzz(SJwB !{co/|GK/u1t]gֳ&\ ^N^x//{.\JRoS!޴1R\v՝;L]~%u0IENDB`online.png000066400000000000000000000064561326020644600324420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/mrim/48x48PNG  IHDR00WsRGBbKGD pHYs  tIME 6 ұtEXtCommentCreated with GIMPW IDATh޵Yl\u߽3MH")ѤD-dYvlYՎqܸq i) P ]^EI PHѠM4qiK"/ZIBFNN/p9̽=|s#Rgq,} ˜;y;7F6u׬EVȢ𑂌y&͙G!\+PteڢW~lgNEqY(Y.{Gdy0ʿ]7im=v&ҥKVMbu)L09cqҐzhPb )E~% ȡQvyr}uXr>!|SE')S2ií^uhN ie"'=K91v#YNY4j q]5!hT%X-j]S-'cNܦ_θl*Bz= ;uj sUtѬ͘IʿE"Y:ukZq0as_|)CMfGI7jG`شC9g:S&M"DF:tjeVj+A'Rjb4h7|ʇ}v+s{Kz!Ow>Xj>ZZ7$K;;qkӔ/;' p?3jZryȜ𼔠ᮅ܌F :9(ڨ3 Zu\2 gAGJbs{uT-8Cu5mRVOgLRŸ"F!W֧=jނN8 QV`u: ?ۭ<甯? EB)f+"$Lr4!|W4Mҫ_[ݥJMڜJ x{ܭ\/zcxVlzbY 2Oi7R,"zs&AOn|M`;m΅g)>_}*KVxŘoYo>6ؠWq v~a6ZSvQ%_Ϛ{FOk9A&[ۮD!@  UX?Þ$3bmv.uVP9 z+ &͸Svcn(H6yy,,+k[ݫOcEu}ŸXawMAV6$7/VU j`JR($^ot6]!9mls'Տzz=y?p-U:k*m+.9aIUNZ[e4X^(\i+ 9o`/~<1u(ߙ^)S6ЂL jbİ1mޯGvJ`!/)Wh;ЫkfLJ9UFKUAQFa!aVuc}JS] ։`]6[/SxƳ :\Q{SiU(=⸑̋vbVDrUAfvTR΢ Cw 'AO\@YMu:t,Ȃ|9!k 5B崟t_dE`zTOxγA'U=#x(ݻ/pdق()k]ަ+D8d_N2|9ɥa\[{XyǍ*{2 j,R$[3(VmR;ahI(MU tO)I2=iץ>(TqQd!@\Tՠ-%㚍-DL/[2+3&L×ֱ2%LNJ E+;zظFU8"]g~ 7B\тdID2 (!C޴s,"DԮV{lԻR4kܕXvfCŎ%W.8h>圳UٹANǁWNj|Eh-ߢ-1U<+)E1U ^|Ȫ*Űs3qN]T,vM[2wYLV){װ]hŤX *;~Ś%ֿ`=j9&9ox9jb3Nj7Æ=CD~ƭpb@G("U_[hGܖ)xt]\R`k:UZhmu:h*$!?qԠnUBܨۀXFLr⎊̈a?EK.o͊Py)K ֐+Ɓ& XmAvj>Lh[Vhn=tɘ yaW0ZcdPX$E=}->howk.5z4Vfk>[ `B̒ҹ`톐u[oqofA/U\nQkj5NZpO[W9Jd#zKN95r byYmQV.7YJeXBVp% _)*;-ϒ mny̙5SAҵ,:+4QLӀuIכ%Ne.:kB5m5bIF4h>5Zur"Ō]q Iu֐M%F ;F\`Vmͽൊ]z(`LqÞo~?/;'RMnvj.9 5d2Y1)1Cx1vDRUL"m6d~{կ[f )޴~œ 8;#:uM~JUӖ6ͺ֫M6Ȇw%sJD"EQ1#F]P4r>5_{˗?*QjtT:bԌ,]~a`!^_hxIIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/msn/000077500000000000000000000000001326020644600275465ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/msn/16x16/000077500000000000000000000000001326020644600303335ustar00rootroot00000000000000away.png000066400000000000000000000014071326020644600317250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/msn/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8Kas蓮4k&*X-/O,-:(tfAtyi'̃ (}R6*JELl6n{;@H>/Ǧ)oHNK)z~!DT)}#⇫9ZkHZ%.x*`Dln6~8Yti+U'Ml+(fq)*vBk5n#,NpjՍ@Ǻ3`h`q·!u R'wT͂b 3BD/=4(sIN5ÞO$Hs RqqîKnN@G@kM [SQ!]!0{5KprXCba{t{J+q nm]W7J!gi;:ٱ7Zyf) re#lyV`$JPX@:/ƣB[޲ Q~xE`;8Zx\CKvr0mԟ]zQ0W!PT c٢X31a!0Hg{NM綕i| PYة8_<憿 Q5w.4 I}){ u!լu%Igt?3z!D23ܦ@IENDB`chat.png000066400000000000000000000015401326020644600317010ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/msn/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8Q[HTQ]s_cL<4Q)ڏS}OTDEM_$AHBRMaSN365<{N=aa^E;x&UUN3fU~ju\Gs =uFi8֕œPgßtUUٽgpIˁ]UrhϭǚiT#!( ]}ڄ0mD&gg D^tE+`en?QR׼Gs!E,;;7䷟m*RdۉmO1\1 y)%4/CQE[[9jِćj່P80R OR!䕊rj Oȯ Kl3 ].Hpa6[q{pBJKeÁp8 )%`rdɤ _Z  J#~zU B`;WWOd0~$P Y&R BP~j*>FRIENDB`offline.png000066400000000000000000000013501326020644600324030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/msn/16x16PNG  IHDRabKGDtIME +atIDAT8Ka̮3kc۽H:(t)H0u]Kʠ[TFf%b@G%O)C^DZ04<$I%ƺjLxN\!x֯w8T5mݩ񉱂d2~f5?Kxss+.[M-Mug3hcK`P7wEAAU|P]u]DQHOVHnK)( 4Mw8U 3?B)L' H$aLM?/`XHW48H$՘hI g4M0;;#?ywT*hnn c8TUE|BH)nwّ5eXqIh^lrpg߳#lnn H$[xl%snW,*Bz5 ۶A !B@2 <+P ]x0 BͮCu0~.g5$BCCPzri)7.Bp+](,Yˀp*_+)\gn}@EER0f#]Gj9}> \d2y\ dN4̺%u+=B8%d;Ψ^~3vIENDB`online.png000066400000000000000000000014451326020644600322520ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/msn/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8IhSQ}C*Ii: -E:BK Fp7qmVN\VPDDqš#Z Ri%{]JE||OZB]׎2,4(x4|wA iyr4n&Rx4d&u]׵}w7V e򢷧u;;@S7,$F6V,!Bm$LZ!$mU`TE'8gO]*T7`8qC 1WA 'ب͗8d-BPĜj!Rv4 b |rܸ8x?`P$k]jF3U:8yWƜehxH)EVM-n4*e3p!ny->&C.uiwB$r<$`#G`#Lcz3V5%-7,{ U ZnӅbA#v.2p(S,$&rh_!}dǿ#IUuacK*4i*cQo2,KcCζ&WpB dmӸzE!nHRV !%T= 8lR.B!iB0&<ٯKUAc IENDB`xa.png000066400000000000000000000014001326020644600313650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/msn/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<}IDAT8Kaǿ}g۫jKAWԼP1B%Bw"H݅t]2I9lnܞtcb$tp.|!fo /QhL0W)Da4Gg%6WTizP3;O>~s8KQ6Y++!a--ECoI%zz=SLm$c1f3 .;D%@>+tT(@bT s\)ǣ{{0\LMH`/@YtiIlmAȥD@t?/-UQ^Wח8}vÁ -,n/]t57#;?|()% x\~xvN7s^EFbٙt $ߏ|`r`PTEyRP烞pt̐G3+2 ꡪ^D/uwW\,/'X,fA RCnm MM<10𠪵"]_/4 ~?d*2ZZLH++  JtvjZ[,&8֣k߁3WJM*`~+#*QՒٮ, ^kGXdJIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/msn/32x32/000077500000000000000000000000001326020644600303275ustar00rootroot00000000000000away.png000066400000000000000000000033771326020644600317310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/msn/32x32PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<|IDATXŖklW̾]7N؛k'V)!.MMJ MTPL-D)|(TU VIRGv;Q7c}y_{vֻԩ,u;sGs{ι 13>K(wS ǒHI0]?q@CxV7utyO0=“g 21ųخ͇8; €ON &<bN^<W-Lp|4.?UԾK;|a!| ot/{DnMh8`il!BBi: Hh9<} ̍lY/K)@`@,`3 #%i]]S a"`&3 Ҁ R]u`xs&_XJ9 LvleeA[,k V;gfl&36Sb5Q^X+x@s|鹼5\5X@0Y;w]ȫߚs$B;D "!35s~V/iH-4]:sz"χ^w"[:Cs RIRE@ /*$^6Η9MxG{5(y ^YR vbu3~oX ~d+[#@`)0,0P lmzc|jre\}[f[gB윹J0ƆO0[E/VZp(}Z1YmU.z2y.LC.Q[ߠ-`OX.trଶ$^J/CRm PVͽqꏋv+"y ę-xuɷrX:yf p)\@/Ԩ+0$s!ǂ45v,3A\; 5O6j{ZC[ŏ.uSp{n5znPKT*k+gQn%pWu!= eF3"M Z:p5Z h1"ohk'wdsgnچ`'Ķ@(҆tke'  |\]fRRSX)NVDஃ;@kg̚L0霴%y@RT߆e֍[88{)}6 (8 mF-\~hFfSン, N\blR'ȯTGEw54`>3;5;O{D˾so0P4h`g, ؅4 rdY dfћOҎ:/=|I_yyhDI!ٽA{`Șr7~7<`cI3*""GpJV$Ps{d#ܔV 9"%*Fb^ar{.Sq]k[aeIENDB`chat.png000066400000000000000000000040061326020644600316750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/msn/32x32PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXVkPUy7NZԩ jS&i;qLLv2mک5QL;J!>R5 Eqs9g? "X蟜5k}Y߷ڛ!u^Q^mrBe=ց-ou,$Y$gc^myHJGű/ECQpN@}ONi!lsvڻQZMbk%EO79J,ٟloyȫmZ`Ww08t@S,&0ŽWRW۴|>y%;xln,%(C!@d )R=7`*)Jaٽ/BBr$ 0V"Rm4Ͳѱ3_~Ё+/޽oxA &zׯ}T@S$CujAaA&pܽN|LQtydQ2b~ulXm²,|zu$fFygּ XumϳW(CzD x%Ԃ$X9研4Mgϵ 8I{ުB%`,hB( 4͙C$^, ,l,knhw~Q*@qahfu5dY$I  9cA4h؈cеmWd;!`Qh 3iw;l6;^/ZN}yX_Pi*+(t CѠPt4ߗZYg+r%BB$!F`7ϼt YIKrn5ΧRqa hs=?5ᰪ#JH8o߾d'@^mSMU.mXYTEyo\8b;<"1|xOa{gØS-)+kSK [?"ǼSF5-%8q:{֍@퐳*P5ԿTf EyP\<H)t0W-UGtx@~mvmJp%&@esũ. e)8|52'-NI/$'61P N)!8t!)?g9`sT;dkW&ӓqkrPA)(e162FTe/,sH'+%'hYy7b@c|d=8?bc\HSWG--^eU-k^D kj6a`tWzLgxDMc,u/Dj7Tj9Mu( AŠ4 HQDAQ_ŋ 8/#@ʋs3G!P!@SEYN2::EEI.{t2Bdg(Hˀg$ # $u-!SNdةϣ+KDY&cL,-gC7{D`8֩3ʎ)F<#>N"Qn'qyx_H֋WU|Y48F@7M&(簫2v D2S.\LkpP\! 2`}q}xSS.nX΅D\ :thƊ׊ %'<_LN).$%n c^~CA[s+ !؜ɕx2#?ý" @I#9Zs%P& CXwH뾛{ct1 MK8G^> p4+>)ͺȐȤӼfEX$I"S$ Lp-w) x)YSm*-q 8TPCgɹ7:~lfHHڍQtylKY%7ø}S%&G6@pws6' O~HHsPʐ4JrаÓj`˚5wgKYPIUp8Dq)?88(ȱīȉ KWdc-/D V'=P(~(˜"6A{>sfb[;-E Fz{O5:Jz>"eeAo׫\q\WOJ7}^箍Qny6;mvW@L=&(.a&+.w ^@@YTmvY}eA9T;Ͽ~dZhnm۵w~e v|3;N}c˃MfQ`v54׻12>XC>Tt=Y'1n0Q\(EU$h)B@.۩]2~}:LdrvC!/AUa* t>SQ:Gyώ"u>=M>62"B?~+699)BEXJ9>߉~g` B^B=S.)COwh[e%^ D8qr]#﷏X*N7u,?)ݨ*AYeEN`5rO] # lA,,g^ؒFhfUy;5=~|7<&Tn:5Y:6 \"Oy?|-XpyWVTF$d,ekn',:1Pׁ}~Y~ZaWQ ,2"ef>"doR,bވIENDB`not_in_roster.png000066400000000000000000000034471326020644600336520ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/msn/32x32PNG  IHDR szzbKGDtIME 7|IDATX͕Ml3HGIŒY6#MRRXc6EK\(P==襗hEs( -z mi#Jl˲D%qib%s-iJr&p.0;C7oC̦dg/hE ,[kϟ>[Ze'_crbkK"x(ƿ{Epou|[^2f\.ell#Lڙ_[zҒω?U`w8ٷ_ft PBak̤sÑ=̮=5_y"n1 0![;˶; 8?F=* C PPJ! J (s8FA TàaY&r`CO%YrDd0 pΡ:TU0-. lk(RߺO(F[Z";648, (M, -ϴX1\z/ޞU=~9{siE?!o~,gE,-xe^gM|M{>2ҰI!8R*Gυ"=K%]3zZK4MBepsp8cVtvv⃏..,N 1299YRn*XSd_cvv|uS6ƶ@ t:kٹ{n‡Ƿ@O*u!8v?i&S7j*b89#0~kfv+hyk3.oJt FUQtr9 d2,B7{7Id\N_kc5ǎUt]FC;Ŭq НJ ^>7rY&oM?k[ vAqveȲ'HCqK σ!ϋi0ƫ&jfW~u10Ed"N|{8}:;ӱ1(˴ 1^J%;33hmT?ݟIz| 4b $v׈Z <! z<-ĭ;wpa8NGdoa3lmmH3>rR0;}jO]!8(lniGx*KKJn IT:!tGT'HÑ.$188P(,pw 4UctWgT}}TxB B8@OO/&nB8atq@o*љ/T&ps93{w"|0eX,0ϋp(h4x,(1?'?3D翙J h:t_ :uS8v}`W@U5lX[] EnqTD2y#0ú0,.T~_ xt Q LӼHr=fYlֈW5jvZ-h0l3D !%JmrYՆvf[gR5!u9 RJBUXH&qwGsC=?88Gؿ7tPuysp8u';i]~thh(w',jS{ڞIe(!RJuٱUu]g]2xX,|%cT 8/pR !VF1voy@%NsۖxU$Ao0:_jjj"LTR|5X3C.[T:N~MLR{ B_+HL{)y#Gg{vTK=d}fFCF^~Reu* _R@/#w\l߾C<6{7sE>`Ynƹ}j(n/ 98瘛108c0s L6 dr8k ;0Aajouwwohkk I1?mC[=r.xiC7 'K8Fttv4*e0泻~8H&W2=^ATEr*UJ  I8Xf?۽`&إ,]ӱj0MԆP~Qׄ+( iAB9DV.xtu LRCQD5tiL6oh<]=[zׯ khCXZZ7W B)<c|,6A-#ly y!kPW[g/ CU4;{.YH&?g |ͳX%WhE2sq'edk 9GPdG?ţB<бWVIENDB`online.png000066400000000000000000000034241326020644600322450ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/msn/32x32PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXVilT͛`aiiSj"EQ~*?,"TQ6m"d)M;0 ~xӎSKҙsywΜR>M]uE=BP_8P'wq)Rhk;FΒ/+HI$,G[G(hzcQJO-+קGHW`lN\)Ul΢G]OzD0q!\˄6~vtޤ)chj\XY}+Jqv"\@@Xo\xWK[;.~*] U9gǦɤ \|S#PZÉ^ m%h}aE_xn[isJrm<e@1/$2>P9wJMb'Mգk~sgiC}I}P@) E|rqa.ڶS[j?)JGh闿T( X) ǥa J/TfC'Hvwg!iw|kgiI,ؽ@bQpJ)@]ee70>7[`M=(NhE4a*4/h/['51HUv xt]%֭z'WE0e SSIQ[QNlbe7:%5`[_'M̘H[2r]4%*K Ξj݌?`4ޡ́C'7s! }C'ԍ'x䅦hUëec-j/ #!KE"ib&Ӊueq<65g_}  !'a5Kk¾gn~c" @)߰`lulPW MbB=;}9`z1  M^K۸ρEO7y{-'~` >o*ӁIENDB`xa.png000066400000000000000000000033401326020644600313660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/msn/32x32PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<]IDATXŖolSƟk_;$q $NIBXYLI*4k:iVm_Iڦ}D5m: mihhХU*mBtpm{yڮ8"Jޣ#}=3|/1G' $S̗&\ Ro搘?5Sߴ?d%{z~YG""؆MM:}:kξm`~wMcǼ 8JAF+WM;DU!:tC`PuCzAػ#8ZUjWN2 r@⌋"BUoJ`[WZ7Bb@&l0M)8j!TP!\\t< ɀS)$#LB!^Mުw@| Yq08r9;;vͶ )631afHÀ4 p4pm|9_IL湷NȠ فEp.~⋩Lr`)! ۋ3gR|9ƈ !lܾoKNM!SLH>>GY+SDǞÇ-mm'NdYѕsT_gbœ}=nȊ#pD訿2g@.-9+-WxW_ŶW흷_W 7T{yl0圕I٪ׂad"szq{"-#WB|?:S|`PRb] \:yr)o;|c$hDgw>H}]].m9ӄ]nTX}Ftnrj4x +-woR2oo& ӭ% )K@Ԥtun?_0Fϓ i`й 򶍙|e+yċ Mǖ^/\ 10aرXlЀP^Tzσ I鴢fF":$X@@CɇBb&h0[zpK)yR.f}QlxahHEPB+Rӑ;4_~9p\Z`M[u8~?6`c_5N|>Li^ÿqd2 _?f]:}@;;_h2@Ps>xӗ.,1}7IŞ"pk;]CC\b>t SWtsGYC\'H' # Q>e00`3A[{}D/P|06 0F`AhcMKI gB׀3ղ,sܩ\X.B},$*ĢBҥT6,PHQJYT \\-Yf}IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/msn/48x48/000077500000000000000000000000001326020644600303455ustar00rootroot00000000000000offline.png000066400000000000000000000056671326020644600324340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/msn/48x48PNG  IHDR00WbKGDtIME vƢ YIDATh՚ypUǿno{// !CH 0ZQ#SHlaq8_?a- *fE XȃY,X%o{9K9ۼ{v ?Qm4LTMx^k9οh_w\+skzsY$M&PJ ׏3gytJ{wwx777ɓ{dڵ%QUUP] "L&FGG{W?Z8~,\`}}c7>o8p^"fbJjI¢EG:zi[yi?[׶QdhT9I,RcI͛'\|rndm޴0PJ!덌n6-VTMy =ǁ888 l6vntx0d^~IFBB8s!\ZK@Ȩk2Lۿ0QM(.)C<]`, H\x@H F"(.-3=h4R=)R ((e`,XR'AH,)0L4vxu-V. J4  ŽBINq|DA1qS "V c,@ R=jѷϟ?$~Ŭ#RxB&3#M`62J7;::BGb5RPb-XNo Qqر72ǣ8zZ^͉W,_n.(# BQ䴒J`Ξ9C({o?cbI9lRc[zKydJH$=ZT v鹨;?'Z7g~ZL$ج6:uJ?xOK۽+@5D76o2WTL(TOVPJAĕ+Wضmo"T{{wvdRK[XDAD$>DHB(c ?khssb3}8s欥/r1 YQSTgyk,5>1Fel[+ݽ~zs0ȱ|کsnĭA ˜>m l#Us3ʕkN_ VYb>U-+)`(d N'AD h}&Dӄ;HEDx`FZ`imHONv%a-:[|>tҭ}a \lu.>www" ݾ!IENDB`online.png000066400000000000000000000056621326020644600322710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/msn/48x48PNG  IHDR00WbKGDtIME z7 TIDAThՙypUǿo IV aK5,Զ ep:ڪ3tƦLvlbib.Њ EU!$. /y/!!o=9w}?=瞓_|/]]ە;lNAS@E$𫎀/k8) |7+J*lS2`*`±O?>LM;~ J#N@nM!Yq'Lu1Hp.;;jWW8D.(]vբ+$H"e}~m>+-q7~E)N5 K.A!$A Ds)fzaTܙ=wWdSUV#l0(I BT|L8΀N8PY^(nQjjc?n lZ0Öb/dB $Q* @@  <MJWݪFa [/z""E!*h;fXTQb-Ɨ @MZ7 O0AAY:`,f!O (N5iX;NUf2PaFkF4a,dpXU53 BH72& H, e vBHȲX2p0qz*&d&o!UrHRXB:{5En2f>&nҁ6F? otUйםOT)25F_0LLHV{ 8yf,n,S<#2ca,d* >%oAkӹ:{i0JIMM˛~|mV>E?x[[de \L~eW7so?x*5hݷUY;}+I2u6YSS $:hڹ'|81̔7gȿv--^40["A˅X1-RJy̢{nGF,]Izlj2#fx {808ђYحE8@Cw g^8װgJVj]ZZ{D'b(PMB~<` }0nXP,םk/Uks7+ʶG]9B A9ibMIWGA1Q'QaQye%7״Ӛ0k-EݷW;DQFk20iī1t6č^'}s= }͠%NT]cD^כ۟W=po q"n|؜jP Fy0p"BTxzے>YS/*)Nke񪧾hEVEg.0YbOFAzۛaDq65e:'S]t4wzQpp";,w{a|nh,)cD^W;bb7iWTKzdeN"5@)K!1nGt`ܒPl;`M00apLHθ ˪hwa49"(_΢Gf! d )RA`ItӦ!B[NzVDCC-V M2M&gfa޴,( êJUOeJ̩RtA=)攤GfSkol=cж )ŽgLM7Uʳ *"εt .@>?lk(uçW{eK%Sh?Hl D*ʲ`:{a^~!Y2U40i/@m8{`5:-n(BT ?ˎL+?8KPuj9)\wk--ՎtF1.Aq(DCs'ɐnj1_<9"ͻk6gZxG͢%0(\}}/]q#r{z5=osfXY3R hh&4s!YjWPPaU4ׇ=->YlPTyE>ƐlCċUl\vl͸7iM/͕s2T;lV$0)uAttvW#1S8ts"qQeƖV\);2AHD":1 yNz|3Mq’$l$ ;x\ 6q0Җ2& f8CE "f8OF0ⅸC!ؐz+C?Y6B/\IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/sms/000077500000000000000000000000001326020644600275535ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/sms/16x16/000077500000000000000000000000001326020644600303405ustar00rootroot00000000000000away.png000066400000000000000000000011411326020644600317250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/sms/16x16PNG  IHDRabKGDtIME  :+ gIDAT8KkQɄ̤RbA ҪI _"x(V܉r'Rbd,S$t9.clphX*/z^? 0ȗsU}}L\?bry` zh` h4͆DžGp]@R 4Wh8>mumXQٕD7E.UxAMk0>q&fzd}}i Dxe l7nVtT @$:>w\< u;[i(;ݙ+[5Ns3cgsit]0dz!(P SW/P.g_OwCq@ B39@$$ұ2J)66lV) m@4ŁBCP+ $mlg]+ƴtjws6arcLL? yIENDB`chat.png000066400000000000000000000011411326020644600317030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/sms/16x16PNG  IHDRabKGDtIME  :+ gIDAT8KkQɄ̤RbA ҪI _"x(V܉r'Rbd,S$t9.clphX*/z^? 0ȗsU}}L\?bry` zh` h4͆DžGp]@R 4Wh8>mumXQٕD7E.UxAMk0>q&fzd}}i Dxe l7nVtT @$:>w\< u;[i(;ݙ+[5Ns3cgsit]0dz!(P SW/P.g_OwCq@ B39@$$ұ2J)66lV) m@4ŁBCP+ $mlg]+ƴtjws6arcLL? yIENDB`dnd.png000066400000000000000000000011751326020644600315400ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/sms/16x16PNG  IHDRabKGDtIME  IDAT8OkA.1BRI[yBgA R<(?/ T?@TŃ~1lnvfw<u.{w^FJʬ(πe;A;~P4ӥ8 (k䗗aNNioJݘVsG޺FAbhbݘ FT)0/[=uh IR J8,@?ql( J-Oe2h= H)D777h}4EIT%^̹{TBlj]Z+z?s@ZC7xiUrk:AuM!j䄳T %GTb}4 &@$, ZFcЬZLqwVJTB:bgzK".hBաK6Ų,,ƶl,ms[8Nbˆ=OjLۢTXfnt 187/ RsIENDB`offline.png000066400000000000000000000012031326020644600324050ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/sms/16x16PNG  IHDRabKGDtIME  :+ g%IDAT8QKQj N RYB^B_@KtэPopzl1nw}N6>7{QT*M$)0恵8\v|FG('8urͺqtQDbq=/]շg#bi{]Z'>GS-kfDZkM:)79h`ɀ_ zFovtN͹ӷwޯؐ *㾂+;_܋XmumXQٕD7E.UxAMk0>q&fzd}}i Dxe l7nVtT @$:>w\< u;[i(;ݙ+[5Ns3cgsit]0dz!(P SW/P.g_OwCq@ B39@$$ұ2J)66lV) m@4ŁBCP+ $mlg]+ƴtjws6arcLL? yIENDB`xa.png000066400000000000000000000011411326020644600313740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/sms/16x16PNG  IHDRabKGDtIME  :+ gIDAT8KkQɄ̤RbA ҪI _"x(V܉r'Rbd,S$t9.clphX*/z^? 0ȗsU}}L\?bry` zh` h4͆DžGp]@R 4Wh8>mumXQٕD7E.UxAMk0>q&fzd}}i Dxe l7nVtT @$:>w\< u;[i(;ݙ+[5Ns3cgsit]0dz!(P SW/P.g_OwCq@ B39@$$ұ2J)66lV) m@4ŁBCP+ $mlg]+ƴtjws6arcLL? yIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/sms/32x32/000077500000000000000000000000001326020644600303345ustar00rootroot00000000000000away.png000066400000000000000000000026121326020644600317250ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/sms/32x32PNG  IHDR szzbKGDtIME 3+,IDATXŗOWsfԪ"1ZP6mcFmĤlOЦDO6`/h҅xaAA233j&'l3; sB>i!AXk]F=>OK!#RA*|__߽y,'W-]jG#QB! 41LCJ~@B)|,, Mqrd2iA5BXR  u۞E_}yl{OX9/w89M|m@u ʌΞ1x>9'Oɺy@)04G:=x2ޘs@{ y4tɸ8󌓧'5JɗxUB⏣[Y(^!YULzqy7ϼkx4ch4G0gO~؎\urÇ+ x$;ui}s Vebb繳ΓR"䷖ |cfULrCJ М9L!2w(JYd2~ۛ>tdG>ghhhZrJdnذׯ>ae˖&:g?EK8J)E1]2HT٣RE筛ܹ{*iuuuiz7~8|NJa`fhB0 ֊ڹ4ةߧ,[!G)ťKhkk+Zcc9w h`+ К1kHk|\ώբbӜXV9y7lbժ3|>eYhƙs?qmVTpg8mh> kF#h#,ׯ/f4Mۃ **ʺh>#{w# zHOODbJ>tt:${zzv񨩩ڵ ;:OBI,Fx^>hϣK);dcY&PbѢ*BМ_9{w  cN/>c-F\_U.IENDB`chat.png000066400000000000000000000026121326020644600317030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/sms/32x32PNG  IHDR szzbKGDtIME 3+,IDATXŗOWsfԪ"1ZP6mcFmĤlOЦDO6`/h҅xaAA233j&'l3; sB>i!AXk]F=>OK!#RA*|__߽y,'W-]jG#QB! 41LCJ~@B)|,, Mqrd2iA5BXR  u۞E_}yl{OX9/w89M|m@u ʌΞ1x>9'Oɺy@)04G:=x2ޘs@{ y4tɸ8󌓧'5JɗxUB⏣[Y(^!YULzqy7ϼkx4ch4G0gO~؎\urÇ+ x$;ui}s Vebb繳ΓR"䷖ |cfULrCJ М9L!2w(JYd2~ۛ>tdG>ghhhZrJdnذׯ>ae˖&:g?EK8J)E1]2HT٣RE筛ܹ{*iuuuiz7~8|NJa`fhB0 ֊ڹ4ةߧ,[!G)ťKhkk+Zcc9w h`+ К1kHk|\ώբbӜXV9y7lbժ3|>eYhƙs?qmVTpg8mh> kF#h#,ׯ/f4Mۃ **ʺh>#{w# zHOODbJ>tt:${zzv񨩩ڵ ;:OBI,Fx^>hϣK);dcY&PbѢ*BМ_9{w  cN/>c-F\_U.IENDB`dnd.png000066400000000000000000000030371326020644600315330ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/sms/32x32PNG  IHDR szzbKGDtIME %e6IDATXŗo?m#[6Ʊ ^ j(m" iDKyJ!JQDT)j+ ڄP!P٦Z zۇ7٥HW39{>眙{gl 8. a=A4k,i)bQJ՚IuGLt:}{-;rݻimicqib&H)@xO\bn~ޚǤ;w_[6` h~_XVb֚ ZFP(R ['\>L*~`_ƾ`_nx=ώ ДlrqV"(,ǧlbE#uBFQ,JG٪\ ?kbƲ+-[yJ[[a!ETr= `EK:[d\|`]+/wg@JG#/r5.6fޟl_km\',=֐ 4{w7B 03pjR!"SƦW %]]]ܼy2>>C윳s LjFcBQAT&ҳwouBuX#ӧYG6ݵҝ9oىiЅtsFF.s~"NJa`fHk2s9Le[*E뫯"kaoOx7t,333LOOb>{}immǿJ).^ȅ fh ZW4M9#&''q]P(Oɧf[x㵟2<0o_MUĻb?_`ttq>|j լRhσUo=XS׫@8do.T׷@D.]¶j3WN$ۋaC "ׯ|>W)o+x%|@ Й T @Df)^ fb(C+?#@|a(!-gΰ交DZLs'W)&&--&RJJӿ}gO*y;DD"4 B˭؎C  "wwy$IH&ic)+`%90P\)Fu,d{/%g!qm84B BJDB!p8L4f۶&p֬7)e 1ŕoMMM-@P!7J-  JIENDB`offline.png000066400000000000000000000025721326020644600324130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/sms/32x32PNG  IHDR szzbKGDtIME 3+IDATXŗk\E&1&k(MZ)h*~RADPQx#ZJb Ej**/$ ۸4ٴI~b7&mҐ Ùy}73gMܹ3jڎ QJm/G䅔+ c+ʕ(y/X YSP#?,j~HR} . RѣU+/V&gRu<E\y?l)z, Bu+o'gx~qq.sn7^+_}yv]'N|&p!Ri3VGJ.}/JT|J ǷPx$2;;å˗8:L&B`azz=ׇ5붡ve|<˱7an] !ٿ'(ʴěAhPxj?]+\}R<ٿ+cW|=lƶ%Ν3~킕Tt:R 9tT'O? QJ@ZkN:{96R@kףc[oK1|)~:9{imu릠۶ Ðr9gѱqZ1a*_=J[[333LNN`+099ִ69\0Ԡz2nݚgbbTj'0Ơb׮]ضMdY4>۷$-\T*ٹ1R 5\.kY5k-ӳtuepSJ58Cur$0??ϵkR)DcRdhA֫biF<ފ6SS$ej---xGPBkm+˲B`Y_N$ 344D̍MMg)F5x)ql,BZV&dAi)!1˅%}*PRsŚR$GsLHĘv6T Pq-J!W_ZZB@@EQNL-fj-5vP[IENDB`online.png000066400000000000000000000026121326020644600322500ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/sms/32x32PNG  IHDR szzbKGDtIME 3+,IDATXŗOWsfԪ"1ZP6mcFmĤlOЦDO6`/h҅xaAA233j&'l3; sB>i!AXk]F=>OK!#RA*|__߽y,'W-]jG#QB! 41LCJ~@B)|,, Mqrd2iA5BXR  u۞E_}yl{OX9/w89M|m@u ʌΞ1x>9'Oɺy@)04G:=x2ޘs@{ y4tɸ8󌓧'5JɗxUB⏣[Y(^!YULzqy7ϼkx4ch4G0gO~؎\urÇ+ x$;ui}s Vebb繳ΓR"䷖ |cfULrCJ М9L!2w(JYd2~ۛ>tdG>ghhhZrJdnذׯ>ae˖&:g?EK8J)E1]2HT٣RE筛ܹ{*iuuuiz7~8|NJa`fhB0 ֊ڹ4ةߧ,[!G)ťKhkk+Zcc9w h`+ К1kHk|\ώբbӜXV9y7lbժ3|>eYhƙs?qmVTpg8mh> kF#h#,ׯ/f4Mۃ **ʺh>#{w# zHOODbJ>tt:${zzv񨩩ڵ ;:OBI,Fx^>hϣK);dcY&PbѢ*BМ_9{w  cN/>c-F\_U.IENDB`xa.png000066400000000000000000000026121326020644600313740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/sms/32x32PNG  IHDR szzbKGDtIME 3+,IDATXŗOWsfԪ"1ZP6mcFmĤlOЦDO6`/h҅xaAA233j&'l3; sB>i!AXk]F=>OK!#RA*|__߽y,'W-]jG#QB! 41LCJ~@B)|,, Mqrd2iA5BXR  u۞E_}yl{OX9/w89M|m@u ʌΞ1x>9'Oɺy@)04G:=x2ޘs@{ y4tɸ8󌓧'5JɗxUB⏣[Y(^!YULzqy7ϼkx4ch4G0gO~؎\urÇ+ x$;ui}s Vebb繳ΓR"䷖ |cfULrCJ М9L!2w(JYd2~ۛ>tdG>ghhhZrJdnذׯ>ae˖&:g?EK8J)E1]2HT٣RE筛ܹ{*iuuuiz7~8|NJa`fhB0 ֊ڹ4ةߧ,[!G)ťKhkk+Zcc9w h`+ К1kHk|\ώբbӜXV9y7lbժ3|>eYhƙs?qmVTpg8mh> kF#h#,ׯ/f4Mۃ **ʺh>#{w# zHOODbJ>tt:${zzv񨩩ڵ ;:OBI,Fx^>hϣK);dcY&PbѢ*BМ_9{w  cN/>c-F\_U.IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/tlen/000077500000000000000000000000001326020644600277135ustar00rootroot0000000000000016x16/000077500000000000000000000000001326020644600304215ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/tlenaway.png000066400000000000000000000007431326020644600320740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/tlen/16x16PNG  IHDRabKGDtIME b`IDAT8NAE[Y!i! \ABH G\!@hPRλ;fcEYiv4;=^tX<4˗_ ! QKW!M'mQ +X, `PcVH03Diz_0KHۛ`w/; F[^<7x!C!#m,s nC͏,| \8aOSY ljjrT!ˊ$84"U=IENDB`chat.png000066400000000000000000000012141326020644600320440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/tlen/16x16PNG  IHDRabKGDtIME b`.IDAT8KHTaͅA21QS+msk]R=BfHbJZL"H&R:~-xgkQ|s8 `o&8nHq?%SP[J:o`1jKXՖ87?2+_0c UsgpU_|ZՅDxz:$UWjBͱx(i%'3;{n!,woЁ#zqq TU[9 &w#@a5T*Esc+m{~vjb:]P`[viҥ@WbTzG榖-Mn&}^v$i=a9% &vwF"щ z^&a w yyf^ݵbq #=;Xa{M;:r>moa + [{l$ #1vV. 205+@h1!!dIh<"m=P+IENDB`dnd.png000066400000000000000000000011141326020644600316710ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/tlen/16x16PNG  IHDRabKGDtIME 8cIDAT8=hSQ 6IjZ:4vT: XA'ڱ"( K7BwcQ(GvCMHM5y8.z:N=pg(?L/`?ԭ`_m|$5~p &;Dr(|Z|{Q`-ÝC, H.~*02 " [~pK4O^fߥx.rtu=y3aD 3X_wVN1oU,|IENDB`offline.png000066400000000000000000000010041326020644600325440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/tlen/16x16PNG  IHDRabKGDtIME ]k1IDAT8jQs3']Z} B\ X*҂t#֍R_%jjY3c& M#xaw8ݽaLfvB%RD"ᆹf3Z$ADH^JHJ/17jѺF E N߼FT̝$ҙ)YvQU/KʲODfMrݾuK>9n|=nWT`.߿NOJ9w̨kìi!bԖ  МQ;̝~CTkjN(0{On7̖wD&>n<|mf@xno6Z;; X\!" pp0"uv@En{ Eշv}IENDB`online.png000066400000000000000000000006621326020644600324170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/tlen/16x16PNG  IHDRabKGDtIME ]k1TIDAT8JAX"R*EQ Ҫ ((¼R I Dbnbхvf~fBB*m7 vT|p @G#VgZ,^۳0ɦzD 4F&Pz {XZlw͙}E tc7M @0egBZV}gЃyoDQ΢g:t ;F !mZ p}.ah'PnHH@,G3C*p:p[bc! WKRD;q?rh#CIENDB`xa.png000066400000000000000000000006571326020644600315470ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/tlen/16x16PNG  IHDRabKGDtIME ]k1QIDAT8MNA7¸2lb;5bGPA'0;F]%Đ S.ii~V]骯߫@?ʤ^Insv@f! ]=9<4$Sp`.z(PRk<`6 |F^\M57bs`bonMAZ\UBH\E)$C~Mxivs\;(13,ݕd'~gn`%̜#yfH iZuCLz=Jtj_YL2A$wgp!IENDB`32x32/000077500000000000000000000000001326020644600304155ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/tlenaway.png000066400000000000000000000015211326020644600320630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/tlen/32x32PNG  IHDR szzbKGDtIME  bIDATX嗿kA?hTĿ@ba`m%Rh SWh"Z  HB m0"yݽ{w^+ ne3_&/\084}@+0-|~âJf<U@w mϊ+)xk YZ b 3xO֎^FT@1jaŜv%ݙg&"*.du Skwرx?t_MRK*M8W 0D}oWۢ hpeU_ (J>ՆSƯ'\QOpa/E=*{X~ [5ߑ!cD,-b jr;*&kkfߌx^[IX'xLvź!jFav4Ul]Ue0м8RJT6X(E6æM=܎:RJOmi uW+(AK49{ziyyk$SL$/`Ye4I涍 ef|=;]m$jBBiӷ]esdp} 7SZ2Z[ˁ_`!,7}Iv*0E0#} s}#1z{:LWx1K<]I-ȳ7|[Jֆ8 &c]˥SS[=R "~Fb]Y)d J٥s@Q@RL[AٹBbP )I_=XU\ {p_=rWp|p8z<@ Jz"Sd2XWը #KM'UA+@qz7ܿ?SE*(t:&H6m1`Jণ$T7cUUrV 1ܲ}U`V %5ФH~7j4cȝR\9U3=B% _57Lr"PꯛKjM {^0 `;(rC`}YUV3u.h7Em IENDB`dnd.png000066400000000000000000000017771326020644600317040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/tlen/32x32PNG  IHDR szzbKGDtIME IDATXVKhTW=gf&4tIlӦ& D(A .;,lA0BA.ĕ"ظ|,J5n#T1181is>aǕ?pΙ{9C/Ń)yZ(9YW`^W2^H܌+owI VX5038]w.;fv@  vx.`<޿t[¸ohGf`]S@ ̐aEYa~}Lu=GV`f0PptA k6=O+j#P؎ "3@6 ?_1@Jg.mUP%phҤ]vm{SOO*Bv?]<գDs3C̆ OoO5 <1DB^i-B_KAvW@k\~/dKMN޼+6M,sD6ьܵecֱ903ȭ@pJK㞞2 Jdu]XcCF{RtÇ!B>64 ˑoƭ)?>,Z +U-m:윌P]l%RK&aM!e"lqLL~ll4,oAdh5Z`<5ӧ -%[[18+MڭW" TSGmhrd[Vfg17o9(~%{knfƠixE =d#O)HW  X=7Yw(&0XҴ!P Na {.j+챲Ak-?1IENDB`not_in_roster.png000066400000000000000000000015121326020644600340060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/tlen/32x32PNG  IHDR szzbKGDtIME ӘIDATX喿kAǿ~I!A#h~4Rt)V$N h`D[M: 4!BNK2_7;{wfgfϼ3 "`rjζdىśӁd0z ϴ8*O"qB[TCLHmp׮.&@BDv,[gWx: :xH1XQGG@b!Ttrjwo`O2aPSqfL$L \=AFz}'$!?&sgf"=ctV_JR,! -=FO B->xHJV-[9E$$^cЮh(IP_nH`?92Hea&^,\%Zve!goޱV啎zhi떞!g\w@ `ܮC F(.B@O@ʥr>:fOJC%~n- ѓ cLw0)؛%%"}/y=\QăsW^I@*?6 $`Y`kǙ/ԛͦ4ė{g՝#ÃWEdd4ݾӇws<4hM{Kڞm JͶ5VR*ݥHV6hIENDB`offline.png000066400000000000000000000015471326020644600325540ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/tlen/32x32PNG  IHDR szzbKGDtIME  b IDATX;AYު?B x!! 8;OϻXw`gzfvg ==Sի{&^|-N}b*H$bYハϙ=) |A [0jh6E荵"\D80 LQV/pl5|.] @rON 9X^9 &Eյ_[,]^9ckkkn<0VBn8DAf@!x>&ݼ,4BHs3x B,fsɅ@#i|+/((D=B½Q%aw|`cc1wރY Xk:{{`KL1 *dڗ&B Hʆy7'@RV*Z=_kOª~T508cѮ/CUM3=ĽQ\kt9uD4xkϏdS{|Čמqɥ+mgjxS.cπ@Ť򛰴_UBSz(d,w*,  ΡOOzYeŤ}:`^2s{pݻ,ky*< ?}  z߻&z&~:+C!\ah o0,εIENDB`online.png000066400000000000000000000012331326020644600324060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/tlen/32x32PNG  IHDR szzbKGDtIME  b=IDATXVKA}s{w "E[X`a.C"V.$wCBb!1 ;ήc3?{0yتS.1}o4֟h]} >;lVd "{f Ȍo?ʵmoF\19= L, ٥:5 Ј@v"0' dgt.⨈@)2y(@Ci|Wq,j&IENDB`xa.png000066400000000000000000000014101326020644600315270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/tlen/32x32PNG  IHDR szzbKGDtIME  bIDATXjA=YxQH!xT/c^&D}%3H< ɻ(dQ,lxSU `w|FD'U-t :tZ@%N;]rK;R% /fWȅIENDB`48x48/000077500000000000000000000000001326020644600304335ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/tlenoffline.png000066400000000000000000000024511326020644600325650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/tlen/48x48PNG  IHDR00WbKGDtIME .1IIDATh홿oEǿoXDHFIAPE M$(( *D%*i Q D"HQ? n{o~=5yxvfgޏYeB+W/2Gꛚkm_q}%$HK _2c2,v.m oԱ "9_{"@!"`ֶfN538fal_.@Pyjf᜶1Ɣ0AzZDFyIɝB" p>*2 "@tkUo{ce HL;@@-&WE]J~p f+жԅϝ&5w&*/o7o^0@Ļβه W)`N дh\zYvvvp\p'n_',eV ʺNx+@lOY\koAZ31ₐ,9@|Ѓ:gdK?紏@ی|8|;ǽQٿ@ J{60bJ5s}J8b渽x-~j3tfޡUA*8K,ۭ'nkײ[V`HQ">Zoѡ>,}IVkx: fԶDM|$9 q'ᐳ (@h7Y-HW3'+١+ ]H٨M z4kqQvA`VB,lsl@gFLP*7מ3!SFv:@J pܝ}`GePL6^Z 'uTKRy`葲@PһN޷sZ1-0#7_w8'H+ǀ^-q^z8OV  3c=:׳`)x!KX(itNf[\ ~ĭz;{v ^/돬c:M蟮{쭻w|ưtz{LjɥW/m?9D^cs2?|3LLYDB3WHL  R~/AЮ-6D]5p.Af"ȕ߻OIENDB`online.png000066400000000000000000000017461326020644600324350ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/tlen/48x48PNG  IHDR00WbKGDtIME .1IIDAThX=kA=xIH0bF+I%KSAIPSTJ V4E@B+ڨLy{-vg|dٝsv3 ?FVI%^vJ|[֖6cS1nUFcd[{y4")40 " 1U@Gw?[əB"Nӏ7 Е.S-LW~Ӆ2qKi66-mx-YSΕ'Y*Fh9q`$JyN)i4Tj&άk EɠB&Ɲ=5k 0V^F RA`Z˨*lunaAۢZs+VH"&vU\X!=2("rH,MIkeX)D4ь-_FH0K:9 q *KFqvYbTr0_P%& J LóXn]O͘\h(ɠ٠71.?s* (N@{a"=6wC;ŠޙWNK8T˫Y?k_f/V!WbO%Dɾ3_Y٠'V%L&. 2Z Ɖ0VB* I"5 GQ; }Bܠv1XoX+^;@Am'Vx'B|?F ʿ>QGiBWڅc` \$B{w8x]>8m+ ׼z,PY+]1+sEdARHPq ՉOlIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/weather/000077500000000000000000000000001326020644600304105ustar00rootroot0000000000000016x16/000077500000000000000000000000001326020644600311165ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/weatheraway.png000066400000000000000000000016441326020644600325720ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/weather/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<!IDAT8m_hu?sl;3*3FR7 Lf `tQxeDuTye. Y03A+uRŜw}ۅ AUU~|p-SUDUװQ M5`F0geYQ?MN%`5>X/(Bx4~PAͬFc%Nw` ݁vmqkN4JM@\?JnǤ4]nCJ&0Xb$ŏ mWt^rӧi/H7yO*;a) wJTsQFiZi3|=Aq$cų&Lx 1jbo[Yl՟D@WDыU-lgN$IⱮr1o5]?>::Y|=[;[f^ 8HVZKr=k8/v=? vou/=R$IȲzNT*&=27_{KE{/xrpΡ^RpQ*k-7uS.H{{lذ4åq)*qS(Ȳ2"yTUT(( kmHc8i4XkDJ1c >4mX_^&{Nt33W'z#c F~rU 4}STw](y>E#-zurm(hHgɃW^+N{IENDB`chat.png000066400000000000000000000015031326020644600325420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/weather/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8uQMh\U=w{4i:Z4PE%.QWHݔ."H+J]t.Bnmi h@I:ޛ{q1NHa&#,6N=h[`GehBD㯗GPqk\ 1kF|*%Y>B_5OE  Pn[f~)פu#!&~&g%VzZ--+e}!;p kBM!CDi]嵾#Gz㪣9^0g`~xiK_6IENDB`dnd.png000066400000000000000000000013621326020644600323730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/weather/16x16PNG  IHDRabKGDtIME  9;20IDAT8KqƟw3;Ό֦պ(,*t?ATFvtKA(>dD:K)1W<ޗ!g8dUB!J.xW+ w4zx[k5i<^5Of^̔vk LN,is ĦSX]]:by5eEb+Jtndd!Scz%=ө 86BLDGGV ˠUЇQg>H2JXD>$IȲ ,!"Hb۲H$XC\]1AHkR]8$IB*mm0 zba`hhJO3?66~uR)lmmAtww!ЀJeb1PJI9G~%ȓɩ,#t:Fp\UXEYZuX5P"UMZ0(EN~ dKJϯx8 ^=ۻMfdq}R|j~oς믨Q" [Α/(~QHIENDB`offline.png000066400000000000000000000007211326020644600332460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/weather/16x16PNG  IHDRabKGDtIME  9;20sIDAT8J@ϙ4IxDq p .ŕ/ >kD\]iŊ w "XKC&߅k*;q9%"̚gjVT=NPy3^ Y˕:}X*Xrz8Y_)NW;wk #e[4F +sS>ahiHc3.w"Է-;N- h6)B2F v[a[v[B3֩k2>$TI|*#ŘʝIQ;ERZn@q7 Vxs)l 07*Yb) مJr"?2Aܚ\8')]@2V:ח ^5IENDB`online.png000066400000000000000000000016341326020644600331140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/weather/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8]Khe_f$,IdRN.ԘAE QMADPl1 )ZUΘ;.4 ssPUvʭL{;%ҵj%(`yM4ob.鿴5^Z=wc. ~ ^E^\Bi'O2F!$0[\rsE GgĻA⎁I׮#`7 @I;AT}@0hM̚~!ne*j!6Ӻ]y$x$2`*jw0KeQƙ3ڎ(ʣH$bH[OLZCe|yngY/ ,q4?B-vD*Wsu#nqCJSndqO$j|ÁKw@e{YSmUW?,Jk-3>]7{#o97>ʍs<3y*UVQi6TU$l+_/ןFO^|zb28PU|NOc##y27 oX*BD0 "c JXʈn"yJdWW7qc!"(l"Ӄy++w1މǎǟkS}{|{j;00h jqٙb\}^k|^Tק_{$ Mg3R}ѴCayso@ / g0IENDB`xa.png000066400000000000000000000011351326020644600322340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/weather/16x16PNG  IHDRabKGDtIME  9;20IDAT8͒ORaޮU ƩM:fP"h7#" C22ڶhmU f"fHuL]*"\Ԣ9C3ӭI50G7V&=htB!&>K'ZRy"|7 ߕR?:Z0<_AiLڳ^,T*/ͅFȝ4Pʇ+j5|G:ƛkx:/~6-u$ h!R BL:v6MCID3m<(`bRZC)h4n1Q(1Vu$Lb00 R)X*ǁa>q D NҜifga' }2mp]=8v])8!a0Ӣ&jXA(+ha v+WN]~7ko؉}p)LIENDB`32x32/000077500000000000000000000000001326020644600311125ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/weatheraway.png000066400000000000000000000032611326020644600325630ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/weather/32x32PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<.IDATXkUk}ι9wf;fLJp1%AMLl:F$VRB !}ljmSci 6/$Nڦy8w}{~~0NXZ,Xl׏s8̸!h'P;V1B[@v&PySMM;ӛВ#\*+-0}=p܆GƂс&Gz="]J'_1Ĭ dO2ܘ\cӃJ<ޛxlpVuLdH,f/ x1v89HAn"^H} \#}ށɑK*ʢU5oW5kuF8}Yɽ 45^!dPřӛNA"K=Ey-fJQq) ½k3aB9>=Aet>+ IeQVA:Y|I1{7 VA,'S>N(F[U7 pjJ,LRp%9BAqeȘ;8LxlN[$\k| @6_dl+OŇ` kḟpĻϭ:>xɝD"Qc0 `&ޣBSBOL 3έS-t`lJ3&W0:4IBPA&fq#%h`nw^|[46n:˝$zq?W^f˚ûyK[!l;*eYvE}M[: QKf>?ra(Bh.+q\D0̶[J R""H)AD`f03RBk c ,3ŋֹۀKMAHsj >{?s{q 0Rj.MS03y`-wKL4Q魙iA!E8FERJA0((]]]H8SRsxhf?V>cO< !$ 8FXDWW8OoV~rϻ?& dIENDB`chat.png000066400000000000000000000043641326020644600325460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/weather/32x32PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<qIDATXW[]Usq}ЂR"IyHDC &&DcÇ?>>MA?iQik˴l{=Zk?m?\?{de1k9$wMy098/$'r"Z>c<صb(˵@lHCV_Ƃ1# X)ϔȩC#,]UYgnq)\iTXUPTpL\z^ Gf;H2s&œ@%O YWrFV\\n1#i X.; t:+-Bv!tz@.[D0',F2]MJAݍ;_8/JbB! .E*evS7R:jubD\[T;16:s`l [S_o-t(KWDn1mBh+~&jjAb GRx\ML a3F4-d^WG %MTcSeQdV 6OQc;L#U狂ǀD#6qlg[w}UkZu@[껥\C (@!`0C|Jhzҳ hPbpK=`s>u˵@}cZMb/ Z2{/P,TaAK] ^kzk]~>m*Rcիj'`5 )1Xpxo[3jes-fEp< Һ f&_M}l~&ZI },{DCSbb&7BI kb9lst/BgkK71o%ƒ`n -tN dZLWHjY淚p灴 *gKq(8k"zfN&_1Y&W J>&j/}Ƈ*`gf~z0t.Ь).ogDSAPQEtE?!D5_&U40hixOyIԊՄMoP>@W A'$ x ! f:0Cl!#OyPZ& VLC X.EWqX Àx ׯЏޢ?:6! 'Hm-ypH`9b~.t$!ӷKA/ĥ4TmH."B)&*%.߀KIkL}N d3`:ԻZ0gcq# =}Af 2<qFT^֡(oܥ-a{RLmC= MoaKRWx!P@2ј}H:ea\UjW(|rQ5<(:4oy@џz7pZg~AaJ)vD%z?ՌzQK7uj> ɃGkyHCVDY=slhA>_Cl߇P=eZT"0(HrNw'3h1zakz?0v)#J_@Ed1r.f'*ZAMWT(!('xDGAduUC .}~gc9HIpesD0eF !.3 !}^2IItk&5C75FUub@P6 #4"Ql `~hLGM! ,O+mӸ|G Js1`S8ȒY^ H~xn_!3ׁVh)Z =T à}Pc &8&1 #$?ON1q$!lFH)(8+`!`&'2UP&f! 8F#.N2??8v6aFM-DC"'w FcJ,jVڳ',ZS0WK0 \]Mڅ.7tth,zB u Aưq9|ֿ lIENDB`dnd.png000066400000000000000000000024371326020644600323730ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/weather/32x32PNG  IHDR szzbKGDtIME  (IDATXOhUǿ7vgӬmbCAS z]1>>d2hkki<RJtuuH Fu݀TQn}D$߿SC+ÞBH&uF0M"NR !RPJ0 pΡu]n܊[+wѵM80Mmò,pQ.BZ /_FpmP( ӖIB_ZaA4;3[JW HT*Z4MqH$8٠B\[^r9 x8!R RbrrQ!DQ0 a6} cnn¶mtvvX\ _n 0n^riX\\Dd2RH)===:8hooG6EZBȨCuaR2.3__2s޾~?BhA v<>T̈F:?%ik_n4h`WƏ r=@H?pg}9Rk4FGG`ށ]WZ[7kd /c{;NGaTIR <,.i|nw`f>x鿓YBKAwL]~UJyu/D=~Quo#d6?h ~5 "QZٟ[J֚-}"Barܝi %~w`K-y@Dە0#LwwwWK09غ![)Ib#oEEy% {nr/T荖 hW?5HdlO)Ͼ'MkQ*ݝAk 50){# nhLDgJQK"sS@ <$Ie{l,QT)]H!4Au~3=_LIENDB`online.png000066400000000000000000000032611326020644600331060ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/weather/32x32PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<.IDATXkUk}ι9wf;fLJp1%AMLl:F$VRB !}ljmSci 6/$Nڦy8w}{~~0NXZ,Xl׏s8̸!h'P;V1B[@v&PySMM;ӛВ#\*+-0}=p܆GƂс&Gz="]J'_1Ĭ dO2ܘ\cӃJ<ޛxlpVuLdH,f/ x1v89HAn"^H} \#}ށɑK*ʢU5oW5kuF8}Yɽ 45^!dPřӛNA"K=Ey-fJQq) ½k3aB9>=Aet>+ IeQVA:Y|I1{7 VA,'S>N(F[U7 pjJ,LRp%9BAqeȘ;8LxlN[$\k| @6_dl+OŇ` kḟpĻϭ:>xɝD"Qc0 `&ޣBSBOL 3έS-t`lJ3&W0:4IBPA&fq#%h`nw^|[46n:˝$zq?W^f˚ûyK[!l;*eYvE}M[: QKf>?ra(Bh.+q\D0̶[J R""H)AD`f03RBk c ,3ŋֹۀKMAHsj >{?s{q 0Rj.MS03y`-wKL4Q魙iA!E8FERJA0((]]]H8SRsxhf?V>cO< !$ 8FXDWW8OoV~rϻ?& dIENDB`xa.png000066400000000000000000000023301326020644600322260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/weather/32x32PNG  IHDR szzbKGDtIME  (zIDATXoTUǿܹg>f:yuD J,nL& mBBh 7.4>5)UM Bgvޙ2yq}07| <,ΝH _\\ؓdP,yB !IgMjRU)D؎LV%~K@Dž}.)Po?FN>&!D_S#O~P\@^U@O;6z6Cg{Zժ5\ޥg+Z_}LaH:A9Ws"Fh=aJ !?cAK( o)[+kHk/5rϪ4]ùʟWCï7ž 7f}xX4ѸxlQ.M ?bVV6 lz3RcM FO(IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/yahoo/000077500000000000000000000000001326020644600300705ustar00rootroot0000000000000016x16/000077500000000000000000000000001326020644600305765ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/yahooaway.png000066400000000000000000000015301326020644600322440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/yahoo/16x16PNG  IHDRabKGDtIME IDAT8uoTe;Йk3 Q48M3⨩؈!h vфԏ%qIF t@AT[KCps}_hX$gq ki)zR@ ZP| W6yq 5uvo'aա[%MYa›QHg&Nug͟P˳j"w" {d%7NTxwh G#ɎT AxpyWѫs bGbZGwEM˚j}Z;Fε#ߢ*tR6b:^'s}.)4kQ^2l&G+"Lq`'iE#Rl) Px.̃}5K"|c}ʾHh{  FMBЎv]8b- 4t~7쭭nDQ bycoF x~эِL}Cc0x눫PϊJ#SW;psѣۚq0poXP\e:BI%67< "t&P(?+ 4"|=U`-+s<  c'cż1߯d:kWjWr)"?,p/_`jO $Xzdf]Ul;j,/RIi,*Hg 2p}uy3& $ /}Ï|UP>97g) 2{Pv&ITc-9LYȔ$K\W֓d7ں/swƯgjNDg֝r|W͘0T%W֬Yo-D?V$tY 8CT݆6 8g?l IIENDB`dnd.png000066400000000000000000000015341326020644600320540ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/yahoo/16x16PNG  IHDRabKGDtIME ,LIDAT8eoe3oہv5I65jueh`ą !(ecݘD&jW`A&mXv:r3y^Ի='{aKyĆQDs[7U%jj蜭uY A-faqBB_oC1y S%B$T keݘ• ی b؛_BQ7hq3Dʤ)Ip% ka+A,yYqO,l7_P^}|w1 *4tv{*{}1A~ɞQP%=Z^"(܆M_>! h9V|yTuaeTU\aPYk^>'BMR^ʑۨ* @ *hw?񓕭027Kr>sDogyjOC&!ָ״T{eS.^?a?֩D3k8ɀ14wtb-Y.0 ~4s"o|R!34ls\>0_30_9>"˲jkbT[1ck %?ȅ+385=;wށ,,*B6,OM]}9SW?RI,>g7˓E_l8Uר3Qu~jwnLOIENDB`not_in_roster.png000066400000000000000000000015661326020644600342000ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/yahoo/16x16PNG  IHDRabKGDtIME  pIDAT8mOu?O[ҖJḰ,.C$fFq(1xh/xK4#&FosaYXx>ﴥ.ssurr|0 M RC2JSݹ?stLFv6 a_[U_6*LLLV#3c/H$SdRrJgG]]]|FeumTp{> r̘07X76ժhjk"8b nOXbxd}{ҷ08K!}wFk"ϾE4曕1]KLJ{*]* z^v;p?Q*I% >I==T*"IL @ XY?|*&ݭ!8+EtR*h6%b3hliuR((x^Puo/~RB`en˅îsO. xsw|.KW =m ޿xǽo@XFt:;:0̄D1m v;}ekkksyY˫0>7 cd@0,JǞNMxLnFk+^gOol' FGF~Z5sr1=o;ȏ'Yx9Ifo߮ĝ#=o---ɤܗ-ɁO;|^ E.W Jɥ{jqf(Thmg1ZhG;IENDB`offline.png000066400000000000000000000015401326020644600327260ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/yahoo/16x16PNG  IHDRabKGDtIME IDAT8uku?3}M٬M[EljM-y[ ei(R(*Xg+Ȃ&h}Is`7"Mw+1:Bf_t/j<|? (<.{0'V<+O8o~~z^dٮ]Ǿ /MONӃܡX,ʻ++N` |%= fgw556:27 5*evLut _Z-r9p}=d26e;!p]A`41 陠z:6;;{(ܚ6 +e\S|+CH!XY? bz?S}4|?^6,6-)%Rz rvMZa|L)d&hs<Gx\'._}\兣/d|qhp$Bu\^x \EJɩczeY8ЃBy);|'b_=4Z՞D!>6}}}.6M.pFiUx 6;=?:oA7VV~hz8fvjMJ2fzqt=ݖpF"qDo6[/;{We H)PP@Q0-^Mayy.>` |^SUe͋G,FϜza-_Lu3 ]:31H&joo/zңc濬(I)Yx[v;pIENDB`online.png000066400000000000000000000015021326020644600325660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/yahoo/16x16PNG  IHDRabKGDtIME 9<IDAT8mOlTeu:d}'U6T+w#ǫc>g p8rTwu U_9l S-0'ξ<<"(LPO$E1R=^zoth\dj_3I`_967'-{t x?32etӜ=bRM;]S G:iUIݸQ0 =J^l]is/;qFIENDB`xa.png000066400000000000000000000015151326020644600317160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/yahoo/16x16PNG  IHDRabKGDtIME 9<IDAT8m=h[gӕJ6:mrPhEȐiHp1&h]֓jv(YduSb,]IZL8;y^u8DH)O?i̗_<nALEW鑉 0d|`S({eݐAnAM[=jd 8jk^Gt:]Gӄ 33bL |iә|sPu&>A#ңS[΅oby-Z;;|'D"|?X= |uzbnRBԩ$aI ſXQl;{ aecI .H8?2"EWi"l\2A;=jyy0J8)^ &6Sn, L xNz|s6VĢ8(m|ɛ,u\ǹ62,kFv|<^^l ,߼(@~ 0W"{I}uU-޻p‡}TpDžpdZAjB;IENDB`32x32/000077500000000000000000000000001326020644600305725ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/yahooaway.png000066400000000000000000000030021326020644600322340ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/yahoo/32x32PNG  IHDR szzbKGDtIME ,-#IDATXklWzOTMB8qZJVX)QT ĵQW*U@RQ[OUii  %4ɻui]zٝ{`N&o푎tuΝ>&2P'))1<hB@HB ۶yY_u2c7!xf2BZ7VNl&SfGσ4, J7nmC]U!³ƬJrѹTPɣs]jH@[H f %HAC,?;!:J k.KO~#EǢ6_-FGgso'.w]l|$gt@W;,ˢBqIO,-;=gό_<00CBL5@io4Ag_`0pբJPrf)诞7:w M77( CCìYV4v5Kһ fz:w?kK|; ح!\CI[iQ[&w|{yġIXZC:QaК$Qc۴P31M4&!Z_ {϶kj~rW-[uѦ<#ͲAz0qhc끃dY$;n\Lj17rn-ua쯮QslK~3gy{TC|\qPR i\z@۠~K<éܐ|O(˦/>7)G{NykK4x§ؐ*iթr=82̙~^R7y?i,ޒuiXvo |WΡ.($hF!X] ]i]U5':+S~_zc+[X O \S:uh){0Rmh3\\æ]bbRzLjBBgmXJݏmE4p[2IENDB`chat.png000066400000000000000000000033601326020644600322210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/yahoo/32x32PNG  IHDR szzbKGDtIME ,.IDATXyUW?yfLXH"LH[M4Ŋ$ M#.Pbcb "pj"Pp2 }3̾7o+9yV*HYRٓzuJyV}ܲ^{XyC =%|zH% @ߴp_Mbsydj'p0Ϩ2eqq q/"dL ;˲<>1n,KB  6JPZʸkll,RCZ秥X`_cX_]( ^'kdqy H;diA1Eliϟ5u$ ^zD&=3b6ZΨO@YghDkb9Mә3IAD"`#G8ho)0)pPD@wV.FhxhIeRFձt6^WUbϟyZIfU;/k '6qPT`ǰ@]{k ph@mmkngzh'ZN-Z@g:'d∗D54db{d}_m4}?τI=LJ᫖|F*("Թ|'˒1J(v@}ADnK "U(_ äCPT(†w/{A ,b$%`LRo_ ,?&A)PX/+zz1bR$(( #FȜ\ ,(BɕKeiry)"Ss$w˛UC}Hѽ͕??an ڋ('d@}wd_ "r勿"//*#L61X2Hԕvëۭ7*<<&ߦyhjjbRU1;)D_i7,f@X23w@iiMtf~?Xp5v3-qvlv`zfc.U@u&&0[z"[U5d|>{P)U.:ZA0e+a-Yocl7YlVpNx\߹=)Os3 e3ZeGMG|(LHƱ;r:|vxT-?y`J= !"/o_\5bKIENDB`dnd.png000066400000000000000000000032041326020644600320440ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/yahoo/32x32PNG  IHDR szzbKGDtIME :ov&IDATX}lUg?9{{ZBA`24tS,:1,S؜l-!!3|Yt"L@LRaݽmro{=y~qMv_K|sm7u%e7FIYiGL`,Kc nnVK/iKc SV_EQ[.>b OYo) L!hԡP+oM]sO.sk6JK!!D6hhV%v,q<8iM4_1, ^JƑbC1k=̓{3uoW^]/*/}.@~JTYudQY`tbAT /y;i;fr0MV"z'LD6|iZUpsqkSৎB]mmf,kwR!DF&zcD3d!" o$vI<} ^!2qʷ#4 7J{(Ӏ∟C&pK놆"00<)=NFNY ZX||^lSҲ6,`&_-ջ)WZԘjF>[zP;!%@=ևn N" Qeu(3/5GRS&ϦgJӰ>j'MнH­`f5hi, e `#^hi;_(^ch956 .@y%R;/0bB= >RR("8)1SxDTpq)z]c1Et_izo Ru: JNʅNbM f}~E87kBb;Hc'{ċ׫E#2C;^u G }fʵq2>NO&I?2Y^xvq,)Pi\`Ug='*!o0%mԯZ$H>J\b12zȑs!8gԗ׻ sۍ)짣Xhe8@ƢQԯZ[blj-]jɁ93 kqk(f{GcrhY{2vwdb|p0xɫ=ośȏXT=/uؾWmqhIb H|e7Sq]]s~?q;8wojsTx9y<꯸5l<Q:WK:iup/i JyS2/}.?/6m,/O'B&HmY#ߎS۲lo(╗3sV{50Q+;r߸]0ł4c>>i^^~քRXmm$冇F_6@ !b:č(u+@RNޫbW6 Ȝ?G{zΉ1+ւwKP,paIͲe7):}:I\wI!zGpv8w;߶>mOEz.ificIENDB`not_in_roster.png000066400000000000000000000030501326020644600341620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/yahoo/32x32PNG  IHDR szzbKGDtIME  ;V -IDATXIlexV;$MڒH&uq$mA ! T!! q@!pDpAucz@HC%i63YD}d/_)T_G~zn:B}G3J& lH-i{ѣDH!~}v>aSXYYF.ekwj]eYPš~>Hz۹rWܝD~`$sa@4::;!ItMGrbR$4 d x2F#kj1 KE%0gO/䰷{{{q鳫dD0yD7hF(A5 0෱8,¯qTE-c  e\.NuqbC3]J(CJ%RO&piu)'OAok߂Xٹ9tKe7 s]0"a(Mՠ$0xZ E44l\QnR6) CXX: "UϽ["D]PkCeP`.(_R +"}>>}#ٹ߱T,dZ҂X}*˿OIi0x$HWvWWhoW^P%BY}b,=֭FTZ g&v)׺ HCɡfom#OIENDB`offline.png000066400000000000000000000031321326020644600327210ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/yahoo/32x32PNG  IHDR szzbKGDtIME ,.IDATX]lwvfvfzw\lc!xmPUbG2ƊIK&*#M>TKCH3~`; !R QԨ 5`؝{ΦC۾%G33O=snl-=P/zSHq@@uRsvh̭+g+LzMdnQ#BZ2M,]ʏR-ӑ3#{e%={q4@!$jhZcFw|H;(A,,-`mpA@$a]|qa.<_O#pC~!N>NN>\>Lΰ|c!evJWWvmjn24Q5ضUgR!P`}-g~q1 eb{# [%֭[5(0 DNDm)vy xMibuM-$U X$@$98xbo/bbxxo7jD#a~F(V˶sX.'>U\` q@( {A"{/V(  b00NDsc϶4EQ"ƿS svή"<ƊUZQH ;g# 05??ߤ8TE_bMNS"hZLty܊)8'''&pUs[_57P!bzz:zdy܊ +W/{hOnkxdM4]D PW._vɧ?ǭhtٺm"J76m$i@ #`n&"e9MTVё|aG33dž*[.^X}ښZۍGd |rg}ŹӅD]/.i}n&'eYFc:ܺ=%AYc8c% JP 555xro64n@<ljM;oMM3d]աa}u|m9A)xhC#v}s'vhGKs dIa?ysSYHvУ$ړiؖDAhX4J]r/\k)O z?Ci*pwnۆͭZ4,ۂ똞w~xyppp~k:߿ZR>IfS-tӧOg֒+rۿ"T٪ZIENDB`online.png000066400000000000000000000027541326020644600325740ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/yahoo/32x32PNG  IHDR szzbKGDtIME ,.IDATXkl\G{w7w4Q BZh < 4( !P PAKAHAc"BBBjF4!h aױGv{ޙÏuW1=ґf{7s %ovQ1tZa 6 jX_ V9EGTk> cSxS TPΡ/TÎ6]\AnΊGeÎk_B: (7#p@q}c5@0|XՖA"REL[WkccA7nAK=[Ϲ>lh| 1y :6N@NDZP+VN BB@͝.R/Gse9׌^sy}\Ojt "f_vӕ ^^Bqěu }@&GeZd嗿5D c`-zE;F@qz*!bHm'O.+8VkqעVA|'s(;oֶ\Uljuw|_@͌}N"f=.NOlJ}szH}a2.G^()z2]!~f|A 1#`ZUfr/IV-l'lyh Os׍DyGk^Y}ߌL]|9/G&l(*O`*Dg3iV1uԪ̈́n"|;%=[,$5D-4W?f\UOvUHV+?HxOx/(ƒO29>\-fW}8\&|Sc)A:ѹ?sG+bj GF-?od#T{u9W/qObb){pJ} X`4"r'),[OpIENDB`xa.png000066400000000000000000000030271326020644600317120ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/yahoo/32x32PNG  IHDR szzbKGDtIME ,.IDATXmTW;wvp`v)CY]Cmf)ĸ4-B# Ĥ_FcJm %~2hYy5MSH B[j[:ʾavvٙw=aa}s9}sQ7lvB~mLRYҲJRuYZUmzƎŶtww4ڊLbTϓ?u}嗍|{`pzCo>cG}&R ]( T Z#b1D2ֆX_ :| \ѝZafyFl}\ƔJxpw7u=zvuH* C2JR &'R"q~c urؑ+B#Ǐ?pv( q~HbϾ}a)ØbaY!fɔlB/YikݓWm\.y+q[aAbP'&ȹ}۳9r z<:gWa\4A7UlҤ-[q$ ,cm>FkD4ˁ1ꌺ{GG1lȘ0(~:=}< wd$,lZ~#Qjc y=כM@x}?hc zfU(ul+r1@bL_85cww_ԶycV2%x51ѸbRdB6wR$"c[|+oD1d|\VjH` ]^9cXeIZhjK \%Gk v"Auj^F-a'A)Bh=|ݿV@~ݸV/yR~MM%M8r/s! AaBR#AocWWGR)r&)9#455-ث{"E\:ywsq7՘-Koh5hYz^?Ǘg%L,N,+5u72v_|_36j}rc{{|ffי|XZw=Hr'>U*NeԖ#aΜ[sFGx[b2Ii @KI)t[[eIW.N<[>ފwRݽ;ը;FvzZ6oX]9PԢE{zQN[&'ۯn1oK6\ysmG Sf &&SS@&KtvbXK/ZPu' ,Ro]K{bךRzL5gjcOj_|{/-!d[VtjcZ`,J}ߍ-IENDB`48x48/000077500000000000000000000000001326020644600306105ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/yahoooffline.png000066400000000000000000000056051326020644600327460ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/yahoo/48x48PNG  IHDR00WbKGDtIME $%剑 'IDAThY[lTΜٵ%&\.)-I0NZNCEU=HIJQHQTQ !iUI"`;4% 6&q`k^ٳ{î;>ktv̌gga߿\x~nMXEKdG8y/Ǒ!ˤ',J?hhX[oIcO>V!oWJMMZv8!(5 qed^yLi|:::\ OlܸQnGH "@Ea P eŁ躎S ar=x ؽ{磜@^ݲA{[k^/4-^A8L 1000dq(Coo}R7C~عs'/˅={UdYձQqȲ QlSȲښyŁoh7&]OwwwӹH^eM͏ٳW Ax 2NM8p)ff&>/Al`G6͟khhȸ+uݷf##E*p&`&԰ YӔXK%hj--넨WMm o [߸#. 0U &n`q~o ?O}~g;7={#  ݅ <P`T"eRP(u-/X?A CZmdg{Q @MR1 %,ɹ>(e9 8ee%I! #Xjs[Կ288'I7_$BJJJ!p~}K /3s6z>ɪwiu2q0֮Y'BvvvY!rÆmѨrypI1\:~Zo Ϫ\Ox<Dkkb=;g/zŊo‹BW>1tT5JʹuF2L7eDۇ~kף)yBY|**3434"dنbۮ]UITiBicX~mZ8mk!rʪf͊,Y`@ @}RuV(mW+0Ax[ 0NaѢd3ᑇmbAݼLHPP]]-H)p nW!|(/Oxt]O"ו˛rySF֙Ά1{bYSC!4gz5U`Z2i+Xv<σ'|"Oc vGlFĕWbő-Ɛp;BΞs //4nNf FkkujjpȻwD?"k \E y?o:2"Q v2CCbDۂn`ikSq qW:&g?&ypGTUUqȒ.75h1 JlyB YFS$Ymc8x$vse(+~`Eؗ3Fb=;N8?ڲ`6k^\AbtMM¥{aR3`lhK,C%GE^5{O 6mW[ w`PP\]b8:3P*p2%}b_}q˴^q="Boip~ b<~ kT5P¶R2Xpz{{F>7S?3 8~x4S8cƭoh~ݳnmi-B82<476n>l6;bqe!mp\_ֵqߪsb` eXp1?Um#Gf]t:/ tTǥoFsoTXJОL' cro`)X`!,[i>su킃'nذ޲vCAU4iYH!Gey \8sn2]peWQxMhnZ&6!5A`&BȲ fC^~>.7X 虞3AÜ?WLKKmUUբ(cS -CC_jeY1/2z*JX\=5i cLH'%8YmfW{`4"IENDB`online.png000066400000000000000000000055111326020644600326040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/transports/yahoo/48x48PNG  IHDR00WbKGDtIME $%剑 IDAThk]us}Ӟ=퉱=bSPHh"4hD -mjEPZRBR A,' 0 J0xflx}s^ps)6tcsZ{}@~E.K,d,k8~Hv&"XG1ED+09ǫ>J1 wKrW{ V4T rh~201[G co=|_ 胴uuc-=Q7FèwɃ*X ,Ċu#W@O{|IaVXUoMA 1Tl)$ڍa2>>/?. }$퇈wɵA&ԛD T  [UT]|c':X|3+'3 E#Oꤳt_M67!&D  UyNuoۣ >.5/xE}]m\+np9VĠIb A`]1o֭Oy{|W3?1XH ho#bB4`)>G$(,+?J΍1Ci켗%ďa%6́w$oI>O*ިZx0 qo51~cHU{hF@W^^?ƝC)}u ^;g^򓥘#i~"}0enlSC '͈7A-^t={W0Vk:Ə^K&ɺyNЫ+f|8SX~+s>J0E00kQ+ R x]ZT 4鍜mG_EZ$~8~1֟_0mQ9Vb="qDh]Rb.nEV:/MZ+Y?b2*غdpuuC% JTޢ*|IƎKbu1<VU!Q!Q?gUգP\KDLzm^#fufe&ci& ^@1 ڳ7ҿq$S{3 >,MظdU-TM_{01}+7/Uwƛ$h?Zi:ୀ7g%Zιhqu[ASiT H!`rJ`VP֝jGiϙ3~('@1R!6Dj2 *\U5A !SO"DrH$\NZ.$Jq̰l%;_Cl6}UgFOa5~Ae˗SS~suB"͐YHW&3Nh~4 R=wxlt]IS|>3#n+ڎfG>u9VAb59_ {%ˇYP[;ы$s3ԍyͳV쌪QD:Wٻg$&S\4_/ak7&g-:3oȟ0@fx\Y,fqWu]qQ+f*V Ht]6ϬiT_:ORs} "Q׭6ўL-(.c-MƛKBH]#W##?D;"Z=fMwOwQu\_?šS= ,]Mعb(W.UKD=^뤍jYǤ4Okh"+L&'hdc.<;u;%ⓓ,_*ў}EU\;=x`ܒV o?"SLҫ4esV9n~URi+7lvagFlwI'sgNr?ȿXnp$v<{:l;ې8Q\T"=7o)v$wy+;s-=L ~ᦍ9M6Sw1 :әc@7ؽf%Z ͱJn#n?9z{.|붪H-,{bɏt<2-g=SYOҞXkHpta+7%;x8{r5&Nc?(Fξݦ7mn~ۂuw P6/g,RMqeQs5+2|de K6Ϋ| ;cGٶ^o>a=d7ޛL>L\,WZ*Nt'/#Og?­"c^ q&O;{ }@VDn%h X'"Chp~pT>Hk׻["rG ҃98b-Xeح}XA9swz=󋩆ȣt>ڸ.]vihqɎ"~dWYI#Rف!A;҂2`,f@>v_#*IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/000077500000000000000000000000001326020644600257005ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/16x16/000077500000000000000000000000001326020644600264655ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/16x16/away.png000066400000000000000000000016411326020644600301360ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8uKluyl. J ۥADS&4aFoLxb͋񲮛h Ճ1jn"vw6N' !ؽɰ >?P(@HG#=i7`b2;rfW¯٧.Yh5[N\|wog`D!mzv O"p'^FbS&&ýWs08|ί|?5,K m8s7>֕TB >z ?LMKr +m\rs!smk?ǯe˷f4 8tgC-Z,'/_K20ݞdTUG1?-a}PU t^t-ik[:>d#$D3J Gyޠ PkԜl\\uph8 YIܦ\o-r5jZ,jozeIOj& zOҬWKb1B.;jKFC旙5}GMQrr:xj;?*S:V+t3(4UC x*#];wnxR),&uE:||Fв7pYnFzrh$Vܣp轞VybcK- [L]ߣL|g@6 |YNnYևq9k6l6?v}B IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/16x16/chat.png000066400000000000000000000016521326020644600301160ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<'IDAT8uAL[uі R]L0K0a3cM9}__n- ^~ _Qd D.<`xc㯖>3#gPGgwDdf/gAԘ 9;]=@Lk6沷P:AM-zvpp;i'ɨJ\ZRBPpmؽKOuj VDX xŝVCPR[66/7yq2=E`cYHNGQ}XVPL\ܯu 3(@ `fqh[دM(j`DuUT_DZ d5̽54T"ј( '&{v BTL:֜=dQ2$l`*"'t4uRF^,_ޖO*&~r[[C!­Ϣwʳ껓iȕO 5IKԜ&, akCL0+)늟z$ab)V~7 0UUm{t=}RRIENDB`closed.png000066400000000000000000000003221326020644600303620ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/16x16PNG  IHDR <$sRGB pHYs  tIME ]tEXtCommentCreated with GIMPW?IDATӕ10ډ&&C<e&u{_€D jQJR͈IENDB`connecting.gif000066400000000000000000000004361326020644600312270ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/16x16GIF89awwwvvvvvvvvv! NETSCAPE2.0!Created with GIMP!,x0F@ ;'d碥LJp,J! , x̺9`b]ێZ\ ! , x'̺9`b]ێZ\ ! , x7̺9`b]ێZ\ ! , xG̺9`b]ێZ\ ;gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/16x16/dnd.png000066400000000000000000000016551326020644600277470ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<*IDAT8uMLug;vma8ΌBڇabLȶhEzy27/nQg4&ZjYLeaؒB?ҽo=?Ó' !؝ᑰ-> Ɓe`))H#'k.Kw`fX*~xkH#3]O7ӬNM~#H|~nߌFb _Pk?3qe $ UZ_wEfV/_?WnIЧϿ?16&w蚆dCGWd$j$B}޻_Uh=;tn05?'ߌOp9=JIϐ^DT*܌x0(:7x{Uu^1bY8e@mi#LM&bYޘN@x:iD]pjnfҕl߇SӰ$ZaT*rZg;ĥjTE-*>.(YCTj]-zV INO! !4V+b-Y[P@ebBC0Z'o(%%${sܹi3UѴAJe63`DJ,cD{ #+I0٪8ڏXjpGX17G ~<+薵ߜ={䔧VU^bx;.[1̺K#ڪhv118 z{K."ʂGm~f$v!xvnr04NC"ǿαӮ]Ftj5|nO!,*`O3OI8o@`'da*1};D &,Qc qZr#!,AI8o@`'da*1};D &,Q; P@P,`o!,DI8o@`'da*1};D &D2 0 {Ct (j6v+z8x,!,DI8o@`'da*1};D-p@ePp`2R@ z8x,!,EI8o@`'da*1Tp al@()xF@vn_ fLG!,EI8o@`'da*ƌA#@ɥJ@vn_ fLG!,GI8o@`'da*O pN'`%|&"Z!,GI8o@`'H*Q@]-!Q`pb2)G*ή!,GI8o@`Up g",G+Byn?8`(!(EyԪ:!,DI8o@(A$u p LK6p9;M3 !8x,!,@I8o8( AhөR3p6?G©jo$x!,>I8o`'da*1};A &,Qc Zr#!,AI8o`'da*1};A &,QP@P`o!,DI8o`'da*1};A &솂C2 0 {(j6A˽z8x,!,FI8o`'da*1};Asdaxh:eZ@͆zZg)!,HI8o`'da*1wNpȃl+(D,Plڬ`s!,FI8o`'da*aQ lC(X@Pag)!,HI8o`'da*}B|Opa;qDDH%%lRUZr[`s!,GI8o`'붩?3b 8X<"eӉ)F*H!,HI8o`wgSppJ.r p @D~<qIdP|`s!,GI8o8( AhӇo R7أ sA Jj9o!,CI8o8`ՇgSpJ. 2U#ac#0&c/& aq68!,>I8o@(A!hө"S.p6?jEKqLZFr#;invisible.png000066400000000000000000000016051326020644600311020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8}kU3gfMM5!UclFVi!⍗ UT²-APDRbm>.JƚΙ3NjA]7?a/ ` 4@׻?qx`~aT*y^=1:h Zͽzo6 w+2`aGLZf{iMlo흦i?hF~zsΗrl\~LT?!MSt-u-+^~b5o.q%I%=8z*"I9#&ZKYٳ>70J+q("lHb`!lEw]V_89`. uW*&V1 Rf$A%9#aﺮ8>r(0xPHuJSS{CF 2㢳>`hؠyDAC1hR#0m24Zwɩc -:yJ>cc !wRw`ލ{>xbqz =Oztz,hZ~-/A@OD3< u$ґXJrAL&ydk2XAva7 t7?}寮%cF}G?f٩ckG$S7oطFNy׵jos}#'Bnjw3lޝO'^>pv5h*qx.JOw7_\bO Z/|ItLdFϝ=C"U԰^USU8Ξa"8k,omc)P H&Rk:󺊛TPDPPcW f fX1@h@, CAD0ƲTջuH)_DDp:uXAXyhZ9ᅰDwPV0fa:~7vJ=^z=| q}XX"Z>ՙi`dY-:cXkD"mKtV:?]ʭ\U,g\y s;ձ>tY^^QU^럎z1!cDc6^4UvR|L /HH3U IENDB`not_in_roster.png000066400000000000000000000016341326020644600320040ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8uKg_|oM4Uc2GA6+vRv2d]C6փsFAHzkcTI7ɰ..6|\> |/a@r0́x0>9zS_N>OJ%P(~Z./fO퍼Dh4iiia}}o^^_1r,No))VԔIMl9i5Ơ6~[]_ 4c߲PJBJJՕʶg3tٙ_pix5Wff@kdP*,fP*23j<./^4 %Щm]dl֜xpΫ՚m.h[V0-v*²4R)JI\>(1jayR) #@tyU_nR9z(uǫV W(=+ϯ| `\ d;!hj>|~M[{pWq6ch p ǹ]WGgh3qw\Tl6=|6d"AM ʲJc 2 w[\/6c_5xRF)mofv%[//柩r4YK{&b8|ѼF4p;H~T__IgGxWB: \iJn2Hg۶/zc>?oIENDB`offline.png000066400000000000000000000016531326020644600305430ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<(IDAT8uOL[^ǣ Td ǟu2 یC>5zdŃo^ܢh@فddDV6ڎsPվσ8w>morjBt@Z 2095>|t7&|MUUEۆZ0 ><;? M3LNM;}50lÇ022B[㱵K_\|+4/`rj…wqe (┝X5F366F,X|˓pFJĄ޾NzddvV ͠( * .YFu(m3::ڲx@?{D<&F"n7ͪs:ǎ0[I,"ix̹V"#dE@qjGQF:Qn`"KXVMldp.U\4rGQ4lgzj667EJPہ J*82fl8JRܲr $SڎJ$Iwr4uA@{yij_pʃC?_M?, #$A!ݭue3gw?>ZZZ>TӇ㲳`B*ewweYjor&5IENDB`online.png000066400000000000000000000016511326020644600304030ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<&IDAT8uO[uўsJi)RrcllAN!q -޸n41x&N A8n4!!sL,`Ka~p=yab }.޼$d&&%"cF@\NkәS$`br4MG?1_5[F!`;m~rLvg###SP/,gZ=Z=Gd2م?^^\/HU !o\ݽ;`a͙ٜZ},ZcqGI==~͏a_EV$z'ϗQ749R_btdlSb?i IO0}=D5c3R`kk058m8tVqHj(Z#bNIENDB`requested.png000066400000000000000000000016411326020644600311170ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/16x16PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8uKluyl. J ۥADS&4aFoLxb͋񲮛h Ճ1jn"vw6N' !ؽɰ >?P(@HG#=i7`b2;rfW¯٧.Yh5[N\|wog`D!mzv O"p'^FbS&&ýWs08|ί|?5,K m8s7>֕TB >z ?LMKr +m\rs!smk?ǯe˷f4 8tgC-Z,'/_K20ݞdTUG1?-a}PU t^t-ik[:>d#$D3J Gyޠ PkԜl\\uph8 YIܦ\o-r5jZ,jozeIOj& zOҬWKb1B.;jKFC旙5}GMQrr:xj;?*S:V+t3(4UC x*#];wnxR),&uE:||Fв7pYnFzrh$Vܣp轞VybcK- [L]ߣL|g@6 |YNnYևq9k6l6?v}B IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/16x16/xa.png000066400000000000000000000016411326020644600276050ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8uKluyl. J ۥADS&4aFoLxb͋񲮛h Ճ1jn"vw6N' !ؽɰ >?P(@HG#=i7`b2;rfW¯٧.Yh5[N\|wog`D!mzv O"p'^FbS&&ýWs08|ί|?5,K m8s7>֕TB >z ?LMKr +m\rs!smk?ǯe˷f4 8tgC-Z,'/_K20ݞdTUG1?-a}PU t^t-ik[:>d#$D3J Gyޠ PkԜl\\uph8 YIܦ\o-r5jZ,jozeIOj& zOҬWKb1B.;jKFC旙5}GMQrr:xj;?*S:V+t3(4UC x*#];wnxR),&uE:||Fв7pYnFzrh$Vܣp轞VybcK- [L]ߣL|g@6 |YNnYևq9k6l6?v}B IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/32x32/000077500000000000000000000000001326020644600264615ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/32x32/away.png000066400000000000000000000046051326020644600301350ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org< IDATX{\U?1sgtfgmi.X%"&j06M /"(&&7&&>bDO1DԚ@IJiJiy<{;-m!H#79{}~s|Z˵|wlˀN=ӻv\zlFёnMX`x x|"##~\rnqB+Zk<ϟ`*K/8y/v`m+ǥ=?7^z#W?q/ƘY];wضx6ww7'DXCe:W _PȦStwf] R()izC>boO;mR>?4nt#[w4gubu+0ҕvO/v\LoMLش}=_?>5SX!)rl^Ǎk{u \TAR(Vĩ2BH!,]$Wף &&K᫅B8qpHogMbDI", b836v}5k#^g)͖Ҟ%L"ڭ"F{p;_[arĥ,JeSK{{LѱPjJ]ϟj OivGSL) PLϺ8ϬDiq&`P9$ dmwݹ>:H79ߧ)gM hg@K3޵iN@{[W{6{,cםkVZIJ,SӴ+*}?8sԡW;\3WO !ZnYӳtah,9=r@$S8{{txt>1ej%hP+ y%P2c:@ őw^7_TEv}^/hP<#DZ i45LS`1Mi6].}1v45db438ClDAnZo}G!*^=LCbiLCö-z6nsj2z #Cǩj1hTݒ=71yZr[?/vs@~fR{! 1aȚRnNӿs˻VSāO˻Vҿs4IC#g5z.E_ws-|N8ihR04aْ=R!a>qb˖H6הqa(`4uwY ٻIPX4qbqZS-k XRcvt]q>_ۦQP],]֎5QLOTڀ@8RUb![N]!5씍DWH(5 |J$q ;ecH ]k)Ts!4q$,ΎRI%m4`5T)uJUI*QX% |Ij*fb8_4cQ8VQS.M1;Kٛ|L]`,H*qX!$a$kVa$"40uJxsYӟP&DqJ6$qP)PU*q8^C#a[:?CfTH2~yǯxv (ٱAʞGB%qOW =ϋ5'ۤK FTT\öti`H4P(FaҘ!+Kcè4 p&4'~E@^5==5rZRnCFolA|oTsq%&HIoC #wZP)+[ nCNOODl9=sܶ"sf>@2WòXn:{nJ9!m칍ư,⧐aԓOйr3m+( oݼm :W0?u˟Ԑ]qVHW.*(Q,rGxS(%tm 0&Սo÷r\~heSAڎ^w+..)+Jǘ8Gʅa⨈i14qT\f)MenEڎʴl* ry୅7{Fɟ{e cL?\.D1D%K]e7мbWnsze`7^=\]Yǒ-H]h>1MVDjEL,i>E4x`+Sl0xlp²'eKo9Ӷ۱ B..%el>tBeghンL:dKoٲ' Nd b_Rm7l[aVŤj"("C2Y%H'z͓CS oiYԴsL&*A AFBt*2|eP}LՖAZ7n|"օy%4 ;pjUJ|'? +__kkL.ؚ.mksҖ4+Z( U8_fccyEl4RJ:^EQݜ~֞x(P5bIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/32x32/dnd.png000066400000000000000000000046131326020644600277400ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org< IDATXYl\;۽xl vlg8MPTHBD FyaD)URTRԂ!J)$,)RM:s#.\^^;rh_<-l~jW _կ1nxᣟ_3;'nl{um^L:Hkjfy{;x(*RQ(e/a1 g+;On溮2v :E>FJBvGM]= 5B P04gwuv5ǿyӖv\bICBQU"y=uqǶoƍ=rɄ(s!T% URH*PolmjV4H0y~);)yC?$@@l8>>]DRď ;1B]^K߾Xn%HhM‘+֭oMDע B$~DBZ;oEϚ5] ss© >"_\`Pe喵TbaM*FQ*XZm (7 >SPkt-zJ5=\qJ?/ilEUTrlaM*2BhVTEu~if0RR0 N4MR 0%( A0FJ8RnR\)ka X\"AC{;RJiZ,$P]<5 yQAwۯPBX68FkjYTW)Q/C:B2Y0v Wَ92Fr4hj$ S,Sg+IX5ʨN(" $R|2I>5Tv\oMMO\u=! \Ƙ<9VSCP B%;GFǫ!".b3ŘKSc&&S,8uOu\wjz̩@0 ۬բQE-S''y`L P*jDݒ F"^=(R.H#uvK/L!\pp+#^|A}9{)޳`$zdT*Nx;POucSoِǙ$6'<VOA. 8~4nF32K/ /9|Ox H[NM]CK_'E\r%ugGSOիKNM;oI_%~L"ے˺6r^"p5ȼX{Ҹa˺ےt"POؾqӦMJB7Nrg(l4pg'֮ED{Wki6Ο?_^D}}CnnѤP,"M7MC* (w:fK\*ǵ VOM7֭_A:pN0TY6%mwt Ү8^4uGiͯ/1Ymk[47khmH Bey\ּH''' 0r/U *uMFpmv'_K aHەDIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/32x32/error.png000066400000000000000000000013431326020644600303210ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<`IDATXOKQc{[+Z"!?8DV":Ď WF@-1wuw#y`yW99@o7tXk{7n:^t,R"]{JҼa0n5ly$+:XTأ,T`L%i0uMa*I3]!RXl {Kei܁0$ jf`Tk@.(`lܮA9xvP;@ &ፘkA)xv`"ѱON{Pss= #-4?<ԃ; ƅ:|%TV4K͡@QvњG&l oZ#7VF>n׀C{JnƵij3'@6֥lH F}]f`khwx9zT`i%JzFq.;ٰfnܲ0wNo{"*JE|.\lX gvӃ)xH}L>dpp?0"]ÂC`S0\tHtny;'snmý)IENDB`invisible.png000066400000000000000000000042321326020644600310750ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/32x32PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATX[o/3s >PRUHZiHRZ>_CJ}?WHI!I j.R 7c>̾a(5#-ff{˖r>rh-sM`'P;}( ~d}03;vHCRGe x {*)%z2O7n\ ~؉9 8*"#?}g|N|?9_D^?z;<7J#+Rh+}9λo}7&SJ.z>{~dYB SuA+nE㜋ƛoo}Pw8πFz(TGOV[v./)]_s.xT8ct pu7ґ]J.ܔ,KJWVF.+.]wsJz5Dj2?-"#Tubb^ qyWL115S:6Q̞ZUb[ؿg!aMsPݣ8ֶ͆FfCrN9|ZkٻCTYUO_1Si lhRt8G{R4=!x ]]݇Zk 6dJ61Tj)f")AEw5I@Pd HHe#Rb 5в׮_2>@(jJI'>R@H0EBТ&Uu P>E 0n]>^D$)Rr\:B -jC5`P m,9 \h3Ͳ,cg:]EĊJ)T,DLn,|;'k2hVRrǕe ҍ[ZUU몰$j˚F?i^h1Q0 4ڒ Z׶-iJmә So$4Fժ&$Ʋy(6'3)+umrS؂"+h y,N\m`f9d&_Wd-mN׵~e||b,tw}kns0Fgye,+hMEosh̛,Ow'Om}UE-ٖ۹Ȏ|l߮5Lk *lW6-yΞxnb>uԅӒ}aS [m[71ޞ\LX=eY?00 Ț>ccRJI!2,--BPes4J)l&+S1UN+;҇)IENDB`muc_active.png000066400000000000000000000045561326020644600312410ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/32x32PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATXil\-3%;vx/qDj0 R8PPiJ~)Rh((1Hl!!E!@ 8ı3Kd ?@5m@::` .K]P04<4===m8 |&`@cS`╵+KJJzN>7H$၉3m?8:zahin55Ʀ*B[oT}}e3{z$X˲C<{[[{1Ʀ5oJKKv者Ҳ@FOM!p:tˣMG0ܮB1ౖ@cS!nǕ]T4m當O*Jnn. )++   bYerewږe:k|itÆK6ްqy0ԧT#ar9ٰo%T͙ofz:é҅o;NG@,).=usi UUܹB$EDpB ^x^?iq=wY˖,޹`La*ph˖m*OmJ"5fUUW*{^7T뺢8vVBP!Ӆg=ַ9POJmF,JBR!TۧBu*@-Ӵ{i**)DJfBr^r(d !&Ei"**0 T4mۣ ¤iL7NPY(3e!Ez !@rIi0cH$iGF&@%P(.TЉJN{AdE!'0) +e)CQRhgy̷,Ӵ"HSq0X<\jN^V!s;F #+4?~F:*DU>k::;^\cI0l`\ش!fp:|nc<6N ش9swt!vTilj8 x=P(ʜ XWwg@~Y _Weu1"}#ٖֈ];Gjm]t? je|gѿDJIeUqH$M7JodX,4?T]@Su#.ggI;8.M+r8Ot4|[OۙX,~`yheٮbaI% fe F(έAUK|϶3mLs 9v4 ,ۑrQR+Fi/6P@`(D0b2C1- ۶3߄/Mlvcژ>qx<6׵嫮 !khkJxt$ᘊ 8(]P4^Yt@ @Tοb͊b !¦[*'*J~uwۑ:P,Ӓؔ4.^hͶ/*"CICڶ>WήQ!*IENDB`muc_inactive.png000066400000000000000000000042751326020644600315660ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/32x32PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<:IDATXklWޙ]bc'>4Eu>4NP8n RV >PԂH !}D-y4iҦBi&k{z\>xnIIEtݙs9ιbXOZ40 $=4 t͉ ɩE0{D`?`CCc뎮;hiiYFJb4>>6wKo\xcbfYıǝO {$M{nZ33iACC}ys/]ysc;z|zztkmm7an~W_LMO'_( Uk!є]L<g45:?ߩT* oO"/ݻlYթ3gYrZSSSu0::Hjl6yDc:|s/1?(*P{Ͼݻo|Z{y=>Qͭ V#ȷUC17?\KX\,r͛^]mw˧Ϝ2%0hYc횞>oSc#_?C A $@ic D8rnSC?c|b< YNLb E$qPVxꩧZBݻya&i1V*gRH4MP੧ZԡC[E$A({ښ͵^:cۖ>VR߈ %$Zq}ضe+c<{&ڜh޽ x0ݱX,vg׮ _kG>T^% (tɣ9t4Q>+㑇QYU+_UWGFڵ1@;Np2.J{`7bb>3 (aCłg]Q]U$'o|c=@"H<6vld $_|Æi |ֱB#v< mW@ܶm-"ljoge$<#`tA6} Zk-m+ X]\O&G,ui߰~0MeJ~ C pQs]?Vz<ɒtIjk׀(DM% |ye0c&CADDQ]U44K/) d<c.@rd% BЈ(XA Bk 4Jм\d2K@fRcc"CCr VPZY\ O9himZK57 % {`| *'0¨,Kuajj* ²p2R$X|\:A}:^x mf&P2I}l^H'3{ǎXϛCC;ؼi5q]p]u[q1lݶ)ܡ,AX:;.@ c|A)EĎժRp`]{ܿsG.{i:g%0 όOLD@9 ێR"Zjl;OLN'ݽ;9=aʕ3'[]YQAkU^i~yBa2_NSeMf-z,'~͙/wlܺ+W.e,A\*KX;, j԰~}&\eU[oNotW`u/3<2%W%E ض͹0Jg4b4ba!1hf}<%|u/ܸ+/^8_(s\,/NsDؖX﬩)ixVjaYH-Ħr)XP4۠7Lc7Ύb~͋I9B9 FPZH.RW[t^(| ;8YJoSD8K3~gv=WE IENDB`not_in_roster.png000066400000000000000000000044531326020644600320020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/32x32PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org<IDATX[lSG3qb;!$@@"Ji]5 ݮԪ{eJWBڋV E>Mժe(d$rqI>هsH='|1yځzNG{?<D8w \R 0W?8phx /Ķ'6⁹bFΞ=Szl%log{M?s۟/jۧG4~?8_fOuJk)n޼,7of֭tww DJIX(x_N0c1rpxWFΞt:m6DqsF nh4j9bI$ƶmN>ّ{{|>٭T*e1ccc&}'ؘ1D¤R)s98|zr~}-l۶y1“VJT T!%SSS޷wöm,}-}<,7]񒔲ï."J㌞8i% wwJJڤd֌8ǏJ(ïR6ឬ59~7, ͊+W2z$uBBX]ZysCRR''OrUffeY7^s0WxmcoOoKr!)Ӌ=z%)KEկ_Iɓ@1VHR5Ge1Hr!)z{z[6U{{m q)8R*f}% JA2F) %yAkvC`EIf}.x܋E`;4m{;Z DRe:e0OwLA\1Btdds55TUk}(B}X*٬,oc H&H$Jf)wJlu J!Ra((V!S*1S FKA$!m{!]\J6}u}zjCƜ6>Jp+JUK #Q}=AJWJ>lhؘ>}=|uz̽|11q1Yq*Nk{si!٢5ac((EN),."n!B,rJQP1l!$Tq*$o\MϧTjqbrNWGRm<34DD @AJG+u~)J"JmGAJ@D 6\c:z&&'REU^ Ʌt(\GWO))s?7O 7~rB: Ʌ? w1g}pge;c|{,FkOK?~[GBY i=3W}pHzX<@o/MLNvFc\{]CCB!jXU`t#P]CCǺuFcɉɉ%\jqŞ#㞟ߴ_ Nwi.[n3;?O\r"SPU~677%Xwlw2\SzJO; BO?p$\[歊c K%r_UjO9:X^Z_υD:wlL]ZͭܮO|+ +lhh\T]Եԕ+_.z9d, ZZZP(UU=Л9岹wo87?{N6i"Hsd Jl.k&v:S/IENDB`offline.png000066400000000000000000000047071326020644600305420ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/32x32PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org< DIDATX[lsΙLfkʼnرHl(%Q^U jTԋRP5bDx@BAۻxݝa'ҊHrt~|8:߾{3@]p:R:i_ 1F3kl p35)8p|){ ^랭[zRiq޹Oϕ^}핳33g6{O !z'w mZ4>;DEEÇ|;F!w}.l4'O<R}j]n(t@ NF׍kRL> RA3M3ȁGKl==GKmee/D.mɳac %>~SUk}fEL+T^/\dyަWJ) Ҏ^)"tnL;]:RTONau;7nF[, dnn۶a \uA$4Xm4Ֆ9)B"e>^/`rDn+&/ kV&JN!`zzM^cah:ssumgZFp||+õ&/*pJ=]hDE>s (%/W4>seZ4 (" C $ Bv6nX9pڟ^|a x#Ro9q.%;Z ŇLRA9_|#Oct1ދ,𕍍)oQ1!Oߟe˧!PF1m4?;c4Z+ey4ϟ1Q7^>B1'9NpuMΞf8P0B(LA12Rad)(T:= WޤuC><pS/\{mm'!8|(@/^x,un D6z#ej$B4IӘRIZ m,un«F@0̥k\  T }{1ڐzKb4"N#zC`PDˬ$=gQcǏV%"F9L:zx ^ͱ&JiR`}Bbc4"J#c}BC[j-YXXcvt(@#R"u\-@P %6>"u)I"6&u)TR,PZ4HZ V{$.J)a@CZ8k}lC6h#@iibH]Dx$u1]Ҋr4"-X H9k}V7HND{}: F [)R! 1WH_@0!Z؈GXMTDG0YڬLA 2|Fh'+\_ (J+aj[|h([lM([g>\a@jJG>..a^|pXg{Aή_p\R6 O[;6 K2\1 j7Q_m?:yԓW/ھ uDc?S I W$MaM&4bh74yۗW/@.;;'wg=^K7_oFɹyb 1\yꂯr"uow ݉ksKvgԮ]UJQ)Ɣ*K-N00&ʖ ;#ƞ+ +/w/JozTݳ6R |s) MY*}fo4@"WtYk%[^?w;-o Ƿfs{ibĈT6V浚Y?бb\F;]kn 򘿻Y#Z-UkA\J+q. þt;II$f]s* @&~W5ook@iIENDB`requested.png000066400000000000000000000046051326020644600311160ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/32x32PNG  IHDR szzsBIT|d pHYs^tEXtSoftwarewww.inkscape.org< IDATX{\U?1sgtfgmi.X%"&j06M /"(&&7&&>bDO1DԚ@IJiJiy<{;-m!H#79{}~s|Z˵|wlˀN=ӻv\zlFёnMX`x x|"##~\rnqB+Zk<ϟ`*K/8y/v`m+ǥ=?7^z#W?q/ƘY];wضx6ww7'DXCe:W _PȦStwf] R()izC>boO;mR>?4nt#[w4gubu+0ҕvO/v\LoMLش}=_?>5SX!)rl^Ǎk{u \TAR(Vĩ2BH!,]$Wף &&K᫅B8qpHogMbDI", b836v}5k#^g)͖Ҟ%L"ڭ"F{p;_[arĥ,JeSK{{LѱPjJ]ϟj OivGSL) PLϺ8ϬbDO1DԚ@IJiJiy<{;-m!H#79{}~s|Z˵|wlˀN=ӻv\zlFёnMX`x x|"##~\rnqB+Zk<ϟ`*K/8y/v`m+ǥ=?7^z#W?q/ƘY];wضx6ww7'DXCe:W _PȦStwf] R()izC>boO;mR>?4nt#[w4gubu+0ҕvO/v\LoMLش}=_?>5SX!)rl^Ǎk{u \TAR(Vĩ2BH!,]$Wף &&K᫅B8qpHogMbDI", b836v}5k#^g)͖Ҟ%L"ڭ"F{p;_[arĥ,JeSK{{LѱPjJ]ϟj OivGSL) PLϺ8Ϭc||bPkގ%"ʕ/dvv6&3o1{)شqӘRjp= H& xy[{O:yq,۳xȇ>qZ炑C^ZRi[x@yOZמ;`O۳c g~vSJ:{x.Lp ?suZIBFS"l]?ɶkX31cL@{_yWߎ~Rk_x`rbr:G+nfşɳ_RmB+r3Y?#S;6B ŀSO |ir[?]Z=JR49vx%f+QFaHh6u3xxq" bۆ@!*PB.^8ſ˗Oo!G[;0.y/=_dGZ$yu{X5[ I/peL`0ڠBkQcT H##Q^e*1 {=*SWBJRoﶱ}u>E~OO)ꍘJu|y~v2=(E3"6eP&ךeR57bRG?(4 (Lj- rspeP J-k1Z2ٳڀ2?y{ J% #cJ_}၁h۶{oV±S81LDl3*sbB\`V Y1\&0Ag翙C/ةK8+߬*=۶msoO=^[ f 56 (cr@B!dQ&z[QܕEz3:SW~|V}:wh<ڃx@{<}Gܽf%)ĭB>{KnB;Vߵz`v~QG_=B5sL:+}9:#aAFJhcG+@y5,{QJbvWO#"WRlmy>?cǽQ뜯[YHTgxJk֯$B+k$͚sF!g%tovv4J+?z:뜏q00ch~]Xk…9*54[~F{0&9uDŽr͜p q9& Bs; JQJ=fcw@K΃O%K%C,)N̬uYbW.EQu1g=J zuO^1ZJh zIB+RvnӶOA)F!Q`YMĂM3pse=s3>Fp" QHfcg2=Ҵ 8I?>>^tk节4,T+dY&" B]ZiҲMV iIHS!M%Ą$h)vA ZbV[?:[`g!s""މqg+u3Q( A1:{Yl4G!5LqÉ`mZ[cSV" FA(шwܬXXSo$DaE;k;W6=^"csBWWV*ܨ1wAT`o zֈ2gGc=sduI@2_iXkh:)xWWxmۓ\|kEPJQ,$V(MK#qm\kFhb!ڈuAxAL'ΓZhƎz3aҤTL]YVQ@i AR +B+q}ZH?XkB^4u1ZkHRb}y5Ak%I7]7/Γ 0"" !{OjVIsY$BæCԛ)yD2DwuNBxuKVsj5}Kuډ,孽J:fc ׌h XRnTRϷYHTFh q ׌`!  ~̵X'ZK1 pqNR<&GAI)ҵ*J++HROifShĞF~KhʤZZϚP_?  C8ߙKE濷tN?}mf)3sjZR*-7n:c$G^p-hꌏ6Y7я1}7c,1P_4q4kUt쾽ޱy'~#Fk[ٳg*LtC2gϜݺ+׭}(?;7b,Sض m QnֵCLTh&flD;^=9˙d )QV 9%XYjBrCS8N`r{vl]RoU 8rZb+Fg7Lo9 (L] S&q3د\_lqzCSdgڠՅGw?Ъ;6o z4\p,oWO)dleՙipFj#H^G׎mJC=]]/#ߛKm̷ׅvx6o+o:u>]um RJ%yߟZ xYY%?\VgΧi&zVaǦ Ɔ{:jdJ%QKvlz̷&z4u3筵|Bm-\xbţ߿,"iPA4y-OYb ;6e!k7y/_tFVZ|v~hƻ7 pڍ篘R&.ߤѲ@浢N?- &{aO};OvKHl7O3k\Q-+(e-2BYCes=sO?|U3W^_Bsuց{} cbWk -SV Ƒ;?'/pܦ'U]+J| ]A{Eb@hy4 4`n0,Vꍆ}饣W^nN1-!9Zuցwo,HqLMb$Pyop( hUGB4qgN?~;yȷIJc(['rt.㢦rE.o"&Aešrev I1mDr=00MLU) ;gDZmLM]/,,O;5@Ke],8mQ|1Zzjp=~OrҬLIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/48x48/chat.png000066400000000000000000000103151326020644600301240ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs))"ߌtEXtSoftwarewww.inkscape.org<JIDATh՚iluwyI=6Zbɖ9Ė') ZGqE~( (6ݦ(P R+jSE#)l%@JP+)R3w釙H+ :[̹#Ǿ{;Jnط=N`+p"`^=xХ_M`#@e :nΝ?7???-13^8x;&o>cxtχydځy7؉ɉcǎ^9rxxC }fS˗g;_14GJ)މc3Oڭ[j$2{H]#o%`m6_oMBEwxK 2mz&wV9 ~a <t죿2o|jRS, @xEE!Ts780|Cgn?2=BXcp$$_S^x  al C!@I 'x}?-ԗvZZCVqpP*%$-;:G)AiC) O8 w%jOwYf9@Ո{.}ߘ}B)$ hpH\xwxp.9[k#[߰ 0Ffz/şB"?ۘxtK`퓟}w^P. c#wǞC* Tz-QR6{iA36%Xsg-$}7:x7?&tvwOk󡁑FSE^_cZDd' 9qk z#䍫%Z@\{yh˗/9ڕK|" C&JbiccWp@ h% P@ Z-PIK?srOPNg1'RzJ8~6RIJfd3 ߷Az r9 9q?>KVZxdx ;,k7a*1n0+̓W?.kfg&$#O%P ٳ֑AI5k,JJ==]={+%=J&6%$hu8̤l$; PYk|\ؘS.'͔2Yj'^P:( +7\L;kݕ˗f[17 pקuc꽥@+]G_ca<:MYڻD___E:~o,,L_{[/K .: xoZ7^jŬ8tiS)KQ.a2{ws'߾8P/&ۄRlvv|:I|Z)f:Wͭ l[3u⸂Szij JѼt6]cj8S&Xo0r{ܾy66-fp1撳֏^p+xp_<=<:82s^ .=ףp{5 CH&Ek a:/SLe*Bs7i8=N,=dz'_?z . 't_ou l+ol_>LtUDN ob2}AdMݽk_>)k]+.,D/8>IR~J1}/\6͆u CӵlR$TRsE)4lu-[xg{빶Mqo}ΌEB hz뼩hM @= gΜ=3뜃wsĢm0 6燆Vv=<2XX+BEΪ+(6"oʕ ˗٬Zmzju26v<;;ع7B䧾jvf5@V3J٥Qn˗=~zl2(IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/48x48/dnd.png000066400000000000000000000102411326020644600277500ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs))"ߌtEXtSoftwarewww.inkscape.org<IDATh՚yl}?rI\!JZiQ]$jn:c-EQ@QmEEz%MIdE=v:v$;-G%GruP%QH+9;̮ԉ<̛ݙ~{{#}{ZrCx/ݷg :-- px~^?3,>lkkk֮Y۶xssssLǀ?xg ݷ,@_k=woNoS ݷgxh}RJc40@Ka:ؘ!:!c怯L`=/@ۓDOҩSwuqN5\Z1c Vִww3aƍX LL+c_?y؝~n1q$9a;VT sBE!xCt\A8^$h4Ih1JGOJyd[,׏|럿q`*V}\>u uqI@ˤ/$da1&8#-hcAZ}{L𗿌Ik@E-[W^ukؾ8\Na䣏~jBTK%JsshO3z$qW )qeLđ2Nǩ_sL<ɳO?VR !xOmc-gQF8䶯:A[G;KVb**P~҂*Rq׆%+{ih7V-kܸ4њr~Vcm1 -]lq0F3vX+RP1ҳ( 5&T0D!Q:a {#Y׏ro[SD( &k:t?7'Ҍ=)Xލ린**UL P B*nABU"\7E8),TK=UnNcHөF̵,fHa##}.!NԒjCğ  4: 1uXmijɒJJc!^zHϣm48RdYRdR=ņAQU JDbǕ3iR^i#LgF@giR^t&y2jMZ*MXkHGWWwcJY(ߧ43q$I&M# iUGq,!گOIR&*!RDZ3yUr-A VEv4yU}?JwVe*Νu.t'Y.|[/^Ϣq(X۳yE.|[l=)4Y܉U oYNwVҋ׈5B{]cw=tm}~a֛CRS'Nԅ:0_HE^I/R86F0Wzpnwmm0ʹvǎ1~ׁ?uo_;/6s/k}A›7)p(~hjz|EZN5B!|&n ܅3/뼛nA)ݽkw}V ZccϝV*w%=lEk<0JRhZ frdxݕH78r7q3;)iAZu`rhj [ G."%E=.@қy]k?qjhK{p`AP\0XնtF] p:1A*hK}XUha-MV)rHMmAEL+wπ-q ^.\s z|5|Pg)\'&|LhpʣQļY8ՑT'{e:w`Iz8no;n3#ԉEiA Ι*o1q6BYx<Y?_9s!hwzkKlDRl^9ZfK"<ߥ.6+w.Yzg|)=/ ~5E$4/~$?%j!-?u'S5L9.y3lٛMePL3Y{OFv}dFJ z( `mdyWވ]GﱚeIx?O.p'Bm>At(nj8^}j Jlq8g7B*<^ ؄Lv.8#= '#qxut\@ZJ'c5ŃLjr`ƬLkޚX Κu>\&dbYj?}ntˬTyjǔ8%'xž. Zǂv%fͮ4``` fͮѨx=g:Ru{?ČÇk?c߁Qac`&!IENDB`invisible.png000066400000000000000000000074011326020644600311140ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/48x48PNG  IHDR00WsBIT|d pHYs))"ߌtEXtSoftwarewww.inkscape.org<~IDAThZ[oWrΥ{n EɒVŖE۲ n{-C80~H O q<? !wmyWwJrH΅TUᐒm@8twUSUg8NLO-|zA`~a]vHVXpۧO_41'UUgΝUhe+7W,h~S_‰]^p#sG}l333ӨT*XR(uys+K/m 'O-^F/F/H}wz uD. CfE"F`~nZ^zE)u l( 7kG{p N- /x>x533(-mQJ)p@Q "hÿŹS~i 's>c Zs$ -H@TVV[D$_NyߞZMX<||\x{&F^O;fvԟ{}+w$sZ<ēiVBHlj:xak(1X_VM yꩧj6@p4!V"`5 `q BOi*;uE}Jxx0"ar0ESz#yG/މcGw U[6GB㵴 UD"HT]alcy,@Sكame@{x$1޿@Qo,jf(jUL K,AϙA,ժ/ěg 8`avGc|=tl8Ojq sR i%AbxbxmD2ڄ %`?!o,?dfJYqsI8tЌ0s^@B eBABR`N OIYQNz fVQ.I %$lbR{l?15U!"T81S`af$@!.?c2'T!SE I4AsȋB2BBdjz:$#ImQ,XEB x@(Ty!h%P*XKAa{M#HϢ`Ąm= ^`+A1VX$ι`c mZ)3 41ITZ iD  /sHBCR2Tq H*$V{V+]]]Sl6-11ڱ7"*Tj ` Brȴh6U F'AJOLC@p+fiWWW` !0q(,4 JiDQ>  zD1 x PJCT(15@4x챠ýPFCH,"33pobH|SA h(\Nv %ei?5cih(D+J$  %N(@2@'".Bk1+#"a,ZF=2#'ȉ0*rY 0zXw#FyrW QAVP]%w2AB(dYeғmJK"ż$yդT`dSvJ)ňYFE]B 3KVl=YVhV. " D'8Op`._ V cokoW֝KMb. ?'nvzDn x91 m%`vz  Zh0TN@`vzjcm'u9 {AGW{KokzH8m6jB XXcj4qh4jS& a$hԦphMX8OF;ZQ׮&1[8x‰kk~Q7_1`٢׍$8 W`gjZE=!MR(Q XHc1s u:lmm5pl.׮]>;o~]yh3g^ ` X֨Wj1+IV p|!GHIH<7ڠ;[VLϞ;Fmklr$& EbI  )5\@=zmUʝeҬnΞ; /f~؟( >{l}}xF{iS$lԦa$Ӛ"ڠ:6 E~:] $[Mm$2%:nZ|}1+q@qRn6|mvb$@c-F@/@/R0֢T6Elpy :[YY\Gh@\x?s+_oUdo_I*&y%׶&K3`X_]]}[,^۾rI:N/Ϭ21ρ|kLOttRA5;>{'erxқCt:Nt;ž`?{45(ɒ#&&"ɲs9ֲ mmDnjfffGl64MMvEA^v;h4*w;ԟhU&Vw WH\&O t IENDB`muc_active.png000066400000000000000000000077571326020644600312650ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/48x48PNG  IHDR00WsBIT|d pHYs))"ߌtEXtSoftwarewww.inkscape.org<lIDATh՚{p[՝?\I,YbHB  Y[1lGn;AC;ngalw! !љ6C@ @ @! ?%Yu9gW;YZ3}u9wGçAma:cԧ$hh[\ U@8cXwvlyG Vl3͛7ZXp^FGFClVpؽcΞ?,@{G[pK,Y4/F\s?zGMx4ضcOEy@  >7.^rU>Ɓ72<2DTڍpiUXz5h:z=G~7'1@ю;O}l;V7/o.K}q4 cw?KS,FjcJho`Ӧ?faBx |_~0xmW֯曾,1𣏈RH!Bb`Ak6/ME8|j;/}pwl߹[;n[v._j]~ a ,)BZV4_@HR$IN>Mg F --͗nWBH+?mG1YbN<ޱ4>IrL&OZ!_y+W^H4RW& zTjG+RaP2ۏӷ抉Yxͽ@W;nnw_HeXwlX`RL&z@ڀn|3PJ!-d<ԓAIaۀƥKF| 95꼏ݏ>RPQ_ Yg%)ׯ*B!`0lp^Km{²,`pw.buuc\/T. $>doc$AHwc F0HIbo(Bǽ[B&E)m}Qt&m˽f2FviMz5@ ೝ)k3.[ۈ\I0(][Ȟ!H#{D4Owme|J+ X!jv=cΔ7\0o˅,_\m{f3!5y3][84kN!.xpCLq(ڲkP! F|ysLz:JCGYƸ%M7^x!'Os/.@BJ7Pno`v)BП<+=OС]^xa(ۄJCX>T{y3/hYR2?XX4((_xi qE DBP/֜N.F2}`g[}ϲb%eL V/o`M"5 VZVTLzWhh8!jֿbM6Z[=,sHlZnhPcIPjX6b{CEi#E1Rhoȗ} $(̻|V`&1,0H*Jk Kܬ[p7Y ,6*Jk ۧ@0d0y=Axkc=SJP8/f PϲRJgn,⦦bB0{[H雖UiU!+ YMMX 1΢>~_w#A<6(ːrٙ|5 MGa! J xŐu|2aC[#( !@9ڔ@{G[X>"Oim'+S$\h| 0 Ox>*2XS=#ͪf*W3y"DdYNV*t$o>U(ZOf8uzt:j/mP] 3CS䂞y9 ^d%BiRF+]'QD2ik5Z8~6ǻH!,k:" __Qb-_Kx՜2tA ջNJ,iaY> @-N$tTz\*R#pY}:6F"t^1!z]Nl=l Mfƛo+"Jkm&&&od3xDR9J756,߮R??|Z@.6#ײżty7_yp}ɪr99BvW7v9+_ƥwϋ'/H +owg;X2ͬk ÎR;Ϸ#_^T*̝<[,\ﲬ9Tor|ͳ_Vu)7|wgn&&&.FI'JFFSL8wZڳ |ٴYt.Biٝ|[gvnlViJ9&Lvs|d|]>BYԬjʖps壏16jamTŪ&29ޝvlѶ']HZRJjkndڽtѷ8?Bc"U^DS96Oy'v/9BxR)m::Gs̳Wڎm,XPE?gNU^̢ʋ?>m}ePU*LǏmo9qwl9lΞs'I/=]*n톸m7Nk 3@δ'z|*_d:jN~hieym]ZiswGrmgΝ%2rSnYS~wz?pja mr8qd7\6pI#rضM(:D2ɫ^K`Ysmr9b;uc 3fZ**i308@Oo?}70@oo?1P^^N},F}XRF}*yWח}_2b۶9v`W^[/޾~z{Y,ӺjEVdYuщd2a,XV?7ER *KY0`qx 0lVR GYRLII =or`0X4P+eEO aFSPej~eŤ;w:֣##RqY[W_zRB03Ҽc~Eg>V"H X^/)L.SD"7>>d2?>S)Ivt/ͤ?O ?Osn=Gu싇IENDB`muc_inactive.png000066400000000000000000000073601326020644600316020ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/48x48PNG  IHDR00WsBIT|d pHYs))"ߌtEXtSoftwarewww.inkscape.org<mIDATh՚{l}?3wH,G$"eSr-ɲbK 4h$HEOZȟ$[K 8ذʖ,|IHqwgT%v~3sAm5DW/byhh p7 u@tk0 g]?sjmMa`'X,fZ*lxkb ɗFYWS@GCߺ=|kqS։N2SŒ),%i\Xbd\WFҚDCw^%4cGc<'7ĒG 'B u;>ҲEMM{ʶmwPJc׾ 0ƷT.˙31==Z)Cm*į:/El_w˃< 06>y⩣eFٷw:DŽ. lOrԫ8RLӇu.ӿyߝ0;%0nME)mI./ $5|{ O`rf1`GxmKCOdyxxmכh>tk@K ysJ9.w!M vKbNaBcs\B#,GCQ*x%k2]1޼9zwVLS"Qz5'_y7GJQ9Q/ B*A,&R,xfikSҟ3ԩW^=Du"4%% e2)daj non))%0a2HV#´T%B#p{s V)dmҲeY!Vkb"lmmEHcRA -*>kQ,R-(ڊ@8zcFkvrC*;oڸs[+eΎrRe)f}|2(vp#}R&QS"-K(tv*/,KaJ"gaJY߄[N%.vc\ٰaz,1 -KD"Ft:ZWbff!ɚ$RZa5k =@/h[&t3_,Tu"YD rڤ(mh[TVZi+8Cmmz0{@k"d*.K} ,yބ "i"׮zEҩT̴,A+R(u.7C0ǚ& Ӧ2 aY%"FИ ̷ T "H]AJl*(Ui$ZW< GH!, )$B Fb>teA h4!%,!$ccT'⠅ֹ| 䟐3=wR#)Ir>>67=wFG'J*i4. B#Ep";R.J[q QX(3}l6 ͍Qқ;cspgvo L6g3 7K$@i<sNPZUhZ )X2[(G`ْ=;v_Q3S.<{8e :+6bG_bE=Ȓ[7bYKͨ|`XN9.ߏPEW1VqƛIq ]nܴuu];oj EQtqxl2dXqſ6pܱVڜɩIk±---_}}go+qҥ,K,c{-[qp]D"qruKu]٫׮?)MW|m:# 03;g{[ ۲7߼5ٴm'^)^-9r:SRع=p:::ڥ8/÷\B=KHعx6H`Uߪs[1gGjృ?J`n`v{?{RFunT*\|%KL&^?OW8&c_w`B1A@Ԉ !%RRJd^kE־K!X,dPX,2==-1 lX۲Yehqy]w(RBW#pR.]Rb5OR6څ )%ǎGT( J%⮻q apuj'XB){ )I !AXup*wBިaR OكR|>/|]&̯]@ܒN5kvcqa~ $P,uz WJuEm4 ABm#$?zI>y c k֬JpKu]߹)T*&V=݋))$ZRjtC.p-$_5QB$l{J>w^UJ)n0߱Wd.]J<…GEYFQ&M9"זܦ5=I GR0*^3 |.]jX|s q,߿?6*C͔$HIh(l!gB@o4I5䔔 v$J!ؿ?35uqZ~C0G`3[rZkS(LJ8} 3R7͸ģ^LF$}]KJ>날^\e֌3xG0)f-F5krKҀJ)g%\RY1Q"$"`I`cUĖ]^?Oq`Բx#\Do988R c]dxLk͕)ĉQψy!^s<ʯ4Xj l^s@CCC=q$)&1SmYRMbabrb.gUBM.lCI qc#ER oc1O$0Yubr_)T`6%E*r@FN.k2VG\꺡3FuvLc8Rp"yd&e IcК8,t&㧩ZJ!fh'꺔e|íV1g͒h룳sI\kmʕPJ1911[>X.Fe-rA@ddqch~8on s( 6&'&PJQtv.GiI@)F YZC59IgC 0"Ҽ`FfjPA:Jە$@>?V18VJєj =[ ]*q1)-B#`JZy|TnܨͦTJ)JRF;fB <.[|_<)m*RRqۦ*=U*a5Գld!A\_yP*X@)Em6F+xB AEJ^hn*2W{~R SzD %ZRw8իW]minmJ)?^FQuYRPOIb~ҾU)QrZ,dͭMZc^6bx+ gaG, B𞔸Q};P{;F joTܓ_ M;#lu#uЈF >mtf+Zk:2ZZ[<2:_HҢ*%)~ m휮)V{^}yhL5K: įO1Kh8tT,V-:6m8/T>mZK _J*%C$,j4$H+J&Cė_ZiJϋH6m$ҋ[e٪X*zMvzMCtb(z{Iu ~$j$x-B it)8ڲx7m('IJAP'N%=EйFs <_~butK{%M:mF7EkuIpkƵrm$N43$7 tɦtK{/x1ZG ڟT*ǏZ+dװ"č4ىs)UzjА.fM).;h#)0IO6{ DFrY]o.]vR}%V]C&ƓXD||cB&^ p"D,^OJ2֮AJMV;xWߟj<@tRJ}?X/WUڰvKRi&s¼;lf5oHǍcӶMUJڗ.e6Ug/WJiٹ =|0pq//hueeCC"7w"j =?+ eˍ!\H]Z0ppk`?us߸ui_OoFcx̱%N]L)sʥD,2shc4ZkRMБ`guvsKY6wH֛f{zLw[`(y|2`RQ$t` b{%kV7_3 P*q@~'dutwOo{m˦TL$6뺪T.h2j,,T_6$%wv>af4pb{ =uF-wf1x/:| @xc1P3K8tza`/й򻖖p`@KOoo#7JΟofx x~k wM~vzcn_~/X <3|B #@f͚ kRw3hr7?'̎3l =u !V{<. xY[{ϝ?7>}*" <5|įLwO-=;-8E#J3[J. @}JFJF9w^<~<|蛿4CП oo)c Ιx.]?~3oafz(*UK{:۸g= }`~(:k뿜 wGx2?%Xn}1&K/lfQ,e5i9z>=*B.WkׯM嗟:3~'H -Op׆5QQDGuQJ!DI4ԽO&7ZKWW?)vڅב::WIw E6>Dag[J+RZ#Bʌ% oSXp%1k-X}Q>O!-'/ۿgOnN^4{>=҂(D~+J*t^+R+"L= Z{9FGGH>g!]ry߯bJ6wa(.!(J͑~##(Z^ %JkiFir@;=2O?Mb(J!ā0ޙ@0|A033- cӧN#D\R@L#BkLTwi_Z! ck-33"1 a' w$m>R(;YgjjJc8uǎ#R J.[M+R2LJ Mww;A(=dn֗Lرc:u c SSS{Ν+ ! ;À|3ORrLiaNJW]/Jgq\˳kh+6tӳ:J27O1::i(4Jyp5m-yg?ɰ cZÉ'DJZ/6RP2rwO?Awl8RY`p&~tt3K#J(`rb'N`a|\F w{PG0r4gJd2ʤ%[m`;BcXJBRI0bZB>6N^Grqca{:35}9?;[9._|fLR!6v=[LbcC\Zl0YW{ݴ^ȚƐy._s wޕYW̴rfLZT"H-[? 5[փXa!I,Il 8!ό1XxAy!Rzrf Ygf35U\.pα0?/;R DsJ(֚]:T"IbƑ$$[b299Kzw"[tspΑ傕QP__{+qZR"Eus446<ĉA)Q8Im(z5ĉɼ`@>9Si"󺳪wxRR륥̲aoooRK$I".da0 08K,&1bbKRGd6}&1b#Pȼ6!I161D {{{Ⴭ,ٕsryITeKX\>'TC#mRR&qTC'H)ϑ pXձ pή\Bf9筵>cJܸqvIYF tb!B.@t2>Rұ@ZJJczzRi\.;5xi``bb. Ca$I`zjFZ ڐR(G #@$x όH!NLy*aOL+R*j!c,a:w >rtx|VY 4Z0q G*...qXTZWZ[[^gmi)"Nby8Kq@kPA@hĤzTtNCزy3e5T* J,AV17ֺEC嫭S 7658c,}HMwT 0$dQ\XXXbnv"ӳS*R!I [\R*xj/%KcSsh%*3o_\tֺZCtbI֫aNJݸZ93HBTD[T9B[+:Z}4Ll,)ݿk 퉳ֽ}rq%*9=akڻy:;hjnHd)k WGϣ{N41i3iިG?[ t@\5!EԎ&:;pγlFNOĬ|K.RZ,MO{ s!%靚yFihS8Sdrj2]tVhJ\I5SSO%GH{Ҿ)Mid.]8LT3+4^xarppך7ơ?;[="!dJ%hb``0۶ĕJLl~|㍟r4^JIss3lYKY/]0++%<^Q4]YP |W"1z/ccc,"h)2xwzmUr ᬥն4(J^I3WA :|𡞽{](͆?x6=SΟ?퇖Y2zε]twemWZ65>-&n]Nt9[28ƃijl_{G7NM#G3WNmܶ}gO_hؾm;Rl'pW +]׳g.=V()Hϵ==l߶k ,5E +'x4J*Yq1}$Ib{:7uU޽kHeyzZ*Zݻ`e]_WsS1Ibq 煪^x{h镓?svL4޵>X1\EBdT4IM~>B]{O{Oشc9^9kWGKgn o lr񼐒bȕ+T*WX]6PӼiN:[rlGP;Ǻ]{%sO}{}w]An)@p-m7/v\xcٓZqrbc71,Y!6A]5i>ǖ{7O\pn'Hk.D1x`ah]J)Yf],\ HefXXZ UpY͠Ӑ2јo<~ͳE~mxh߷z 0Wlvcc~'i1H\Vrq4əZ,.-W_=966vsĴD'd-[rAlѶ{&<Ziii]h)jJۋϜ}l9eoUe0 .kZ;g1."319tbXܿ;?5Zˆ5@EfqieS;]/_m:IENDB`online.png000066400000000000000000000103431326020644600304130ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/48x48PNG  IHDR00WsBIT|d pHYs))"ߌtEXtSoftwarewww.inkscape.org<`IDATh՚ۏ]W}?9g̙$n!@*-<*U#RJHUxKi3u-!q%$&\L'N2c9>}g#Hk}]ۿUb[\::ǎ7ދ~ԻA`q}a`nKM` 8dk߿5ť3gS׊Ţ586>^X_^[t:S3׀O/;~ ,.4|{?] FFFʅB!ճn7V~uzg?g_/ }cKG9G\.??pextj[֋/p??5MG&Ȉt5KG3~d}΁B}!!B@4PJEhjuy^r"cǯ /\˿҇FFF *K7 P1 m2Zk@j_~t |5ť xh?gWWV_p)j m1=̡?̮;2K&hms~M|@>_UJ/.=v瑏}lE>1^}gN>IYGUeQ?@@$6T?ʽG+Jau'=~&:Kܒ@_X\j/]z?&U6(1JhQ(zR AA^ŧ?Xy"7o#{> q(5_<1 FgRDil}zsƋjCG@+#-N=?ϬM쿽;[X1`|峏ѝmG=4?7_vl;/G1jqqnmM[֋_A) mbDm 6/Ldw^[z yH\vӶRZť1 x$k-?C{+CsN(x2]x:iM||so{(4./IJK_=vKylpT2G||^I=ϾdyԓEo `d ccLY:?gцέhz佗#G>T*+gɇ?5DZM]W x~9ӰU( a3 [c" w,wrc%678}4I@Phe$fМx~{B)Yw8|SO~;rt> pT Vqgج`,r kX|`2'hXe=ŇNҰ!x٭a4y'l=֌ gr7 ~ۿ(=/#A3έ`l杌fյsNҰ^|c{7D㚱 3_Bir<6(%^JOq>!K}~O{fb[2K:,m4JÙ/q8Ⱦ}#{&ʃ} sa7bb@09>Ed,B;\Hq>yGRR;r9m'Յ_[{ʃ~=/4E(5n u\Y((H$ňƋ‰"h{/)")(˽hɈ(Q45OA^1*"(ͳp,"8t16mk( l +DE(A)@ټp$%(ؘb.Z,D1 >R* kkkttВ>*%Jfg e2z'7q( hIH(h1 T}*%9#@*TֆB@ EA!AaHPl6S. јT*vmm `lE&^/"J\ۺ86 3G&^"4hWBC>;Ґ"r:kZJ w77h'Mb[+ee z=AQ, BT+e*Q(;1&%cI|+DA@Ps H!'Wu)oÀ t]ZkzJ$쫺X U9 |xcqhhԵ>r">hTPą.J:Ad}LMJ86RP hestt]v`@4Jb~ 뿤Ѫ!"VV{OQOdFOBIt.&١j}rW)juˤCdl&/[$2VB6ΑyRTّIxHm@F4 {%M$I"dY@VHPw|Hxm hG*-(ˁx:tBh- 6Tר']i -<KŤ"hw˾f&!EIP:{N\rH /y٠<,*17q/" M$ 4s-D%MPi k#Qy[7PZ139G$w^\T# /n9rSS T zSNuYiڈZfG«R:tp*)EfGڈY e@k@)$dŋ[-^[__j4@ZUj&jkpx^8޽Twcw/QOQKSM`hx  Z-ֻW '(nTklZlx ջ:8^]8IUQpșh M>1-~A$IǷxgs+ɀK>uUگF RJu\xB+xWOZm۩rŶMj#y$\Rj'=Mi" uKz]'x}mwʲGxl:TSn髧_eޑZ\:W+ ZqʜA]?ɥKydʎg1Val.Yk_b{fR'vanQad}gMH^~,c_B?)6/>y-F )CA+iVi[T \[O6ALȤa4cy*.[[dH OH8y4یZwabp:W>1d2i>GԚ\4Mɟ_*!Y)lK._:sW[nCW;w\effv %.6ha#ZrX]PW4q]@\JlR;%K{ʕˍnzݻv懵*xl uafXCL}<A"e5EQ e𠫣vu*)%%=zmeuq%  URh\/.U[#f_&F% |>#Zޘ}S7Nǿz}+Xb#ȧbݥ={#e"0>'7psP]lP;$THܐcp.|\Z#cv]/ ,V$tbR;:vYY]igS2MD޶]*h\T8MIZLvo__ZQld5K$iQV˟=~ /Op2IENDB`requested.png000066400000000000000000000103531326020644600311310ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/48x48PNG  IHDR00WsBIT|d pHYs))"ߌtEXtSoftwarewww.inkscape.org<hIDATh՚{]G}?3sιw^n!S5jU,B" ?JϴTHUZ,"$N 1vkw׻c||bPkގ%"ʕ/dvv6&3o1{)شqӘRjp= H& xy[{O:yq,۳xȇ>qZ炑C^ZRi[x@yOZמ;`O۳c g~vSJ:{x.Lp ?suZIBFS"l]?ɶkX31cL@{_yWߎ~Rk_x`rbr:G+nfşɳ_RmB+r3Y?#S;6B ŀSO |ir[?]Z=JR49vx%f+QFaHh6u3xxq" bۆ@!*PB.^8ſ˗Oo!G[;0.y/=_dGZ$yu{X5[ I/peL`0ڠBkQcT H##Q^e*1 {=*SWBJRoﶱ}u>E~OO)ꍘJu|y~v2=(E3"6eP&ךeR57bRG?(4 (Lj- rspeP J-k1Z2ٳڀ2?y{ J% #cJ_}၁h۶{oV±S81LDl3*sbB\`V Y1\&0Ag翙C/ةK8+߬*=۶msoO=^[ f 56 (cr@B!dQ&z[QܕEz3:SW~|V}:wh<ڃx@{<}Gܽf%)ĭB>{KnB;Vߵz`v~QG_=B5sL:+}9:#aAFJhcG+@y5,{QJbvWO#"WRlmy>?cǽQ뜯[YHTgxJk֯$B+k$͚sF!g%tovv4J+?z:뜏q00ch~]Xk…9*54[~F{0&9uDŽr͜p q9& Bs; JQJ=fcw@K΃O%K%C,)N̬uYbW.EQu1g=J zuO^1ZJh zIB+RvnӶOA)F!Q`YMĂM3pse=s3>Fp" QHfcg2=Ҵ 8I?>>^tk节4,T+dY&" B]ZiҲMV iIHS!M%Ą$h)vA ZbV[?:[`g!s""މqg+u3Q( A1:{Yl4G!5LqÉ`mZ[cSV" FA(шwܬXXSo$DaE;k;W6=^"csBWWV*ܨ1wAT`o zֈ2gGc=sduI@2_iXkh:)xWWxmۓ\|kEPJQ,$V(MK#qm\kFhb!ڈuAxAL'ΓZhƎz3aҤTL]YVQ@i AR +B+q}ZH?XkB^4u1ZkHRb}y5Ak%I7]7/Γ 0"" !{OjVIsY$BæCԛ)yD2DwuNBxuKVsj5}Kuډ,孽J:fc ׌h XRnTRϷYHTFh q ׌`!  ~̵X'ZK1 pqNR<&GAI)ҵ*J++HROifShĞF~KhʤZZϚP_?  C8ߙKE濷tN?}mf)3sjZR*-7n:c$G^p-hꌏ6Y7я1}7c,1P_4q4kUt쾽ޱy'~#Fk[ٳg*LtC2gϜݺ+׭}(?;7b,Sض m QnֵCLTh&flD;^=9˙d )QV 9%XYjBrCS8N`r{vl]RoU 8rZb+Fg7Lo9 (L] S&q3د\_lqzCSdgڠՅGw?Ъ;6o z4\p,oWO)dleՙipFj#H^G׎mJC=]]/#ߛKm̷ׅvx6o+o:u>]um RJ%yߟZ xYY%?\VgΧi&zVaǦ Ɔ{:jdJ%QKvlz̷&z4u3筵|Bm-\xbţ߿,"iPA4y-OYb ;6e!k7y/_tFVZ|v~hƻ7 pڍ篘R&.ߤѲ@浢N?- &{aO};OvKHl7O3k\Q-+(e-2BYCes=sO?|U3W^_Bsuց{} cbWk -SV Ƒ;?'/pܦ'U]+J| ]A{Eb@hy4 4`n0,Vꍆ}饣W^nN1-!9Zuցwo,HqLMb$Pyop( hUGB4qgN?~;yȷIJc(['rt.㢦rE.o"&Aešrev I1mDr=00MLU) ;gDZmLM]/,,O;5@Ke],8mQ|1Zzjp=~OrҬLIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/iconsets/wroop/48x48/xa.png000066400000000000000000000103531326020644600276170ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs))"ߌtEXtSoftwarewww.inkscape.org<hIDATh՚{]G}?3sιw^n!S5jU,B" ?JϴTHUZ,"$N 1vkw׻c||bPkގ%"ʕ/dvv6&3o1{)شqӘRjp= H& xy[{O:yq,۳xȇ>qZ炑C^ZRi[x@yOZמ;`O۳c g~vSJ:{x.Lp ?suZIBFS"l]?ɶkX31cL@{_yWߎ~Rk_x`rbr:G+nfşɳ_RmB+r3Y?#S;6B ŀSO |ir[?]Z=JR49vx%f+QFaHh6u3xxq" bۆ@!*PB.^8ſ˗Oo!G[;0.y/=_dGZ$yu{X5[ I/peL`0ڠBkQcT H##Q^e*1 {=*SWBJRoﶱ}u>E~OO)ꍘJu|y~v2=(E3"6eP&ךeR57bRG?(4 (Lj- rspeP J-k1Z2ٳڀ2?y{ J% #cJ_}၁h۶{oV±S81LDl3*sbB\`V Y1\&0Ag翙C/ةK8+߬*=۶msoO=^[ f 56 (cr@B!dQ&z[QܕEz3:SW~|V}:wh<ڃx@{<}Gܽf%)ĭB>{KnB;Vߵz`v~QG_=B5sL:+}9:#aAFJhcG+@y5,{QJbvWO#"WRlmy>?cǽQ뜯[YHTgxJk֯$B+k$͚sF!g%tovv4J+?z:뜏q00ch~]Xk…9*54[~F{0&9uDŽr͜p q9& Bs; JQJ=fcw@K΃O%K%C,)N̬uYbW.EQu1g=J zuO^1ZJh zIB+RvnӶOA)F!Q`YMĂM3pse=s3>Fp" QHfcg2=Ҵ 8I?>>^tk节4,T+dY&" B]ZiҲMV iIHS!M%Ą$h)vA ZbV[?:[`g!s""މqg+u3Q( A1:{Yl4G!5LqÉ`mZ[cSV" FA(шwܬXXSo$DaE;k;W6=^"csBWWV*ܨ1wAT`o zֈ2gGc=sduI@2_iXkh:)xWWxmۓ\|kEPJQ,$V(MK#qm\kFhb!ڈuAxAL'ΓZhƎz3aҤTL]YVQ@i AR +B+q}ZH?XkB^4u1ZkHRb}y5Ak%I7]7/Γ 0"" !{OjVIsY$BæCԛ)yD2DwuNBxuKVsj5}Kuډ,孽J:fc ׌h XRnTRϷYHTFh q ׌`!  ~̵X'ZK1 pqNR<&GAI)ҵ*J++HROifShĞF~KhʤZZϚP_?  C8ߙKE濷tN?}mf)3sjZR*-7n:c$G^p-hꌏ6Y7я1}7c,1P_4q4kUt쾽ޱy'~#Fk[ٳg*LtC2gϜݺ+׭}(?;7b,Sض m QnֵCLTh&flD;^=9˙d )QV 9%XYjBrCS8N`r{vl]RoU 8rZb+Fg7Lo9 (L] S&q3د\_lqzCSdgڠՅGw?Ъ;6o z4\p,oWO)dleՙipFj#H^G׎mJC=]]/#ߛKm̷ׅvx6o+o:u>]um RJ%yߟZ xYY%?\VgΧi&zVaǦ Ɔ{:jdJ%QKvlz̷&z4u3筵|Bm-\xbţ߿,"iPA4y-OYb ;6e!k7y/_tFVZ|v~hƻ7 pڍ篘R&.ߤѲ@浢N?- &{aO};OvKHl7O3k\Q-+(e-2BYCes=sO?|U3W^_Bsuց{} cbWk -SV Ƒ;?'/pܦ'U]+J| ]A{Eb@hy4 4`n0,Vꍆ}饣W^nN1-!9Zuցwo,HqLMb$Pyop( hUGB4qgN?~;yȷIJc(['rt.㢦rE.o"&Aešrev I1mDr=00MLU) ;gDZmLM]/,,O;5@Ke],8mQ|1Zzjp=~OrҬLIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/000077500000000000000000000000001326020644600240245ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/000077500000000000000000000000001326020644600254505ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/afraid.png000066400000000000000000000017301326020644600274050ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:15:08 +0300J͡tIME  ;2 pHYs  d_gAMA a0IDATx]]LUoik[E&ƸD fX$BMt3[Qcb2 Dfl DGe#58RJ[@?'< oP CؽaGKi`>\sHӴȒkROTWUt/LY?Iz>sa+m^xiedԗ<+?^fsߔ{aIFg矾+BB FмϤ/fu-٥U[Q^± XS v`YRʗ 3c@A ]׾]*-EW|7',lU7Z*|\v_4=E=+ q ^v ?0s#Y/j8rA&,Tos2;-w#BrpACM+te3 cð-&7!WT2tSȯ<#D"|^_SrW||;V'LfI%BhkH&b1 @pȢ3cVy0O$x BPi ӦtB-)AV'g3?=ū{d7to9rB~FWu"3>͏*R1<]&(kgX=lS8U8Z6 h\gG^kwW$H{dW{J 5 k&o,87Nn[EqxJ97u Կxɒ%˩e%#[J_~˃َ]g*%?>늷bokņV[@å)_GgNdNiWhLǀhjz(͌Pi4Zp6/^=¥<~9W=4+D呝NmMV(j9]uXU\:#1S=}ޏC3 p*um.}CB :Su_Oa * @}B1Vy[d%yH#%fg)L33Y}AU|[XBꩱrɍ &U$nX%HJ_ 1^L3 EnJ~lb,6 FɓWxXUv% Ch8>(q!idU6Ȉntmі>?Orr<( CFev+u:imctKI&aCU~}-%;rotW\ ZJ:)R/rzv,qUDe6d{HdHRxɘq^n'/spZ̜Y05sɘM:~6V+4Os'R"+5b0l/>)X"FAL&x%R227XhAw94\%fl6v;} PJW4 Yy=_T#<_']eU×\^KӸ/bM46$wj!㕃y;EY:4j+jh"/T1S֣1L1d\+v in{]M65O0K#‘io'_3̖IBC0v *׺i;1^%2:zx)Tb!AEQ&BCZQQCV`Vd?nYj3;{;#x9s=ֶDQ,Q$CDՎª3lY.ΐe{ c9?]׻t0-DRtŊ4ڎlY$IxݻTvl k"#&N2;W36( с\u<.ƚ,[sjgo/ FQ__׋9qPe)ЛXM FGG1. aHNJB ؈͚dRXvʙ*E@---E/ɮH(h\X1O"X/.K.Q<Ȼ #j!fCݎ 3դ |ua1D&q.**8D  -/r)i;>s|q0V7S\+WZiZ(lup/T$=i;IҺp TWWv#&& 柜N)~ /=f[,On~+?OLLjN+{)=HN9|{WvnSUNg;0ORE9xs:ʦq/P,$IRUuCłYJtpa^shZث(40f-FtC6)|M)IE6AI_ՠy0yCL֞NIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/annoyed.png000066400000000000000000000016341326020644600276170ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  Q pHYs  d_gAMA aIDATxuSmHQ~n-KӚVkjidQhiA}B_}-Zԏ( BEX Jf͚:tnF{9 ܘX)کaX;aԀ}r3V[ķ`TF'yU6ϰo`!D}W)_󿑗aw$^:vk77[=Tu!4[j2F)-|9FP&PP8Q& vg@I x~ZT0rX̦5DH!m^L9u0jer:>p8Ѕ'O]8~v7Z%IR2(ˆ J̕p9tam@O_ ߋ;xvy@9F$7h@i+/f㺡FC99dckp+s%Nby k1"=6+Le,ϳRijiՅO=-_N PB555QѶB[{)ւ+*f.K*v.æR9*۽e o3*EJ%kzPD&"Ww m6)fȾo:q USL)dYQ2~86r!a޿CW-t""ZԽ/ܘePIA;+q%JYqv_5`)!^xF՟:1}S]vIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/anxious.png000066400000000000000000000016651326020644600276540ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  CYV pHYs  d_gAMA a IDATxuLu_B\0: pf[ZD*-6+e_m?pf&4iL~txqsΙl}}~| φݕEuL43Rg`pqw]^^c71rHi!HmF̭ .>^.g.ט4s|"F>,@֯EfFN0MoP9/w%,5ZHG7ϕ^k\ dQ$sKΥjI|WG+qɩPE'Y+Y#n璑 rs%{Z\z#oo\#5G7En.w#2Kj(hYJSXó {g-\i{w"mA~ablh[du+pGuWڌ|~0TOѭ蘝VXW F[:L6iv,mNP͐ UsCc S\x˝p=b38d$)9$i Rca:g?oʹ$$IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/aroused.png000066400000000000000000000016741326020644600276300ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME   az pHYs  d_gAMA aIDATxeklQo*ڍ1Ef6cY# BsYF\'H Â$XHqdVי&5UVksyĬf|LkhA#8eJQ@2ujjewbCns24*ͳ҅6A r LGGXZX? PIJNN -yL. ōhC (t3P5Dꔽdo;=N*.ZCF*ܼ.;PGC"(RYWV_XZ84qX:Aݝt p̩9$ LAa$Ѿ4l"C?[Yi1}duy=EL< YWv ş ,uqa`o >у/6mҠRHJo$I s:WaGQJ@EyYRq '*`'G cKA, \mxR{Ym>!bŝ*8|SU hh`H% ##l͍%]⦹O=/V; `‘<)aJ۔Vx|~' x|Wr@HG.u>3/X5(ʷVFlj]5쪳J5T)sl+V>wR]!Ct&t l%?Nәl<~.]#E4-&DGy,J*LR 9`'hP/Tx&?CX%VgP}Jh\裄 ̔AYK(**si*-ҩxRk(ACMny6MlF#)y+lՂBJYi3Vm)TsLN*=qjfy3hicGӽ[uc[4?;f1虠:m,ZDm˖Tf9n,9dh&jB c:,5yR3R83jd PY}ڸ%8O}VC9RO l\0H֪~7Y 8|Xeb⏜)1O.baS !;0=78*{xFC1dp&1vO(MfuߋM1sRVvn;%H_"S#K?=2ӡ槗1x@vc~*[/Vd@ vEA,7GFp-cD^'zMF&pzGz h (R0/*dc o8}H$ R IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/brave.png000066400000000000000000000016431326020644600272610ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  &g pHYs  d_gAMA aIDATxu}Le?}+z W-1­lҶsM6rp7],ĭez뢷{y3ʳ}w9{~yyI[,9dZ\`#C$ŹT)clUi# +yb/ZSuAhU573k< 2eR1HYNHtfk:XR%BΖe d38rDf6j~ dcYzi]u\7[yxSdFcLNn\C$moYOv lwդ?R JxJeN+u\TÕUWJ)o㇎QVDx8]t'ƿDڻHMI/^ e<ż,.>nJ iB"M.*HrEwre-?۩JwcPS$'NT*Kɰ v&Vk+NZ?(S%/C{j+u_6}z7klHCD~%% tsowgk9?Ħ x3p,.3}I32.K1>+Ԟާ*+E S KQ3!UyNA|&qu,xKe!ISX"Τ]wTyS9\;<$+,,M\]E}={:C<CIzJE)5 Ղ%D+%;b-Foѓ,FrLBscSQ9u!g2  qF'bϮb1"Þgb3ahhǞ((!X.cB{1rq١M "ҩB)ϔɤx0ڍ5k$F Bg;w&T,(qHn˂@:A޺ mJHh5^}_\hZsQ]kVEzĺ\ ! ɦU5j܌XƤU^(+lC"7D7Z|=,Y|I"ל-*cȖ?(,HpW뫍.6 nAs"p.eKxt>Y.N m '079'`jx>}ajZhh0B~O'xXBy<Ÿ>cl]{4w邜 y@*16L;l=YЊ`!g0f##*g&M']."G7n6u|vx·rKMgZKIڿ &}\k+M`_QDQԈ k0 6<42pKy5w+,R[Zgc(>c쌅=Ԭ QrN6TܭȌF`4a2~/^>} E|wr)oo}$iR:k$p´)SW)L&$IۗAJu;+R^Ȩ0jxqE؍s"]Rx/I"v!ZcAΜkTWT-_*[\08_W'rxQƣ'q+H,عRڨg$^8|]s4t|fk2)Q.+`xJRh}vx%f=l9L-pX1Ή\h㓽ד\KTќ߉FݢFxZ7M;gxהy \|`M#yjHn_ oײa=G3~sTA9xF۱FN:ڻֵ'3{1ľIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/confused.png000066400000000000000000000016671326020644600277760ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  7 pHYs  d_gAMA aIDATxuiLW ,Aa@Y[uX\#*mԶaiDuIj%$G?.?$SMl($65iZFZ `0"xzFlNr{,{o[Fb".zpK}r>{rq6]QrDIv:2%diH[`ZHEeyyٝm=fd lL-s(Y8qn\O3_Zyz\u>8pB-<=OQL hwQz2@R*wkXJdP3;=w1yB`P,bS WJ:䑩1}O!O5cYfN㡵өo Cw }CTQ$yR)..1m>%R~Vǒa5,UJf(1p?DtK;qNƒԇl2SA=oHUQ_zL(-3}m/長~mYm5Es  mj0nz')0(/~֦[:y&\ Q˂h^@n2ACmnGEiK[pZ+V!nkF'Gݦ##Ȼ{:QAߙWsw[ɽ9[$fϡ3Ng!7WE>6 |e'[%<<*6"9OF'=ʪ|lN#|fD f#3JuXozx;Rdd/S'CQOӛNlxˤ5p4Us1Xx 46<|ۅmY*$ fj<:XJ4B1AIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/contented.png000066400000000000000000000015661326020644600301510ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  #; pHYs  d_gAMA aIDATxuS]HQ~ R?Mq[ HAYERER!؍AJ]%EPxEId]DENܖNUJS۔~<9s^ұfuUjɚJ ~aؾVAU(䝅h{,WPW F}xCF1kFjFLRA}&DB!IMX'_rYLoEY+kިǙqr\ՙŰV*kAsc$9 :,g1~;*c=$!$|?ĝ>,dC$FsYUJYF=g R TT29)F5"e mے"F#w 8 AP`3X7f"M8!F0YDӥd܈0C5$?Ka4w05ɛC_9,>*b q~6/Ҩ)>+7 >>Ӏxv}cQ3P[[!z$AIjoygD5JliT,^\Бm QiFY !͒ *2ʋr2@<uα#BjܞJgftLdq)]l2Wvӂ(ŽO8`֯u=e8{Ox WyK 2PD4Xݸw 8߹{kCAG* x\$<|VٶmCdFo>V^j3 FrWe調爙"k:[@9mJ޾;KU}&HsE:zO$a~[wڤқ/uOD-cTW٭g"'rbB~fzu{F~sLӲ.'IvȦ21ȡCMrFn%WB˩rZ\#RZʠe>CN`M#B=<[]ېՂݕ@a"MtOI/@9n'wq4xXb b*03`#Bwcn m|kf!"AM~ލҋ` 50I#糭F |u)ق.Ӕ/Q5| `(lu诶+) BZ[;.{GZY06F`s%|t\.^tt]ukcekR7^6x45e^^8ughp+hy&,$e겔e1t|7‰V4&:Jc])ʬV C'A/rMg7h]_@փ;LĹ/9>ZIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/crazy.png000066400000000000000000000017251326020644600273130ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 16 2008 23:27:07 +0300tIME  0gK pHYsiTSgAMA a-IDATxuSKa{_n8&Y8ESdEYt1( )J~0 C@ v3 )e2tWs\ngQy<9R0YǤ00kU'al35mSQNTq@ķe]G yXEJlt`]}2\;POj=[KeD:JvSS|i61Fmutj̬xc'>_xtU"( _*^\>_ >Dl;N]_GЫu_-gX2h\,96 \'N&K!,1]*\ %XSoP(#01Հdz ǝPiqv+а+5Ѣj 3ju4O_)4^ȲYPRb21RaH G?w,: { CAxciƋ7&IӭY赈UЕZbwIcsE0hW# !gl+EK&IqY$/æMY2$"AD9ߍ k7+x fT g`Y pF}ξa\j\W(hD^4!F`R;V<<{:#Α X4L5ۭ<`$#oñ$E1 . ٥NcNײjxGxm Ƀ.v~dJ_`2IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/creative.png000066400000000000000000000016241326020644600277630ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  = pHYs  d_gAMA aIDATxmR[HTQ]g̤6IP)^>  #3裠 ) !룦0PsJ"4L߃5;wibݽ^뜳0L^tẏ`h417"˲]]]v0Xa[BEQ5XNӯe8"22j]e1.ߖ^o$Ia>M%Ay {0cjAZmG< FݛPZ$^u4#1?/ѯ@cU2i"BQe9)S:,x܉ޡ`c`'Z4$)A{#+ /Ascvf:BŅnSmm-uttPUMwJ v 8v$ ]dQ'Fif֜ZM O>h@u :^e RVa+Pdgo4`N<ƦH@e["5hCwCABt$ ~7'>,S(U>`rA4^dJ!yVZ> .-A GwpF4WYg j%h.ñO&\,MR $WkA/'͝+rO9օ XVJZyv@3i.!Du1c]d&Acb"+O6Fu&a 2`37Mzо/\Ě^IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/curious.png000066400000000000000000000016601326020644600276520ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  {* pHYs  d_gAMA aIDATxu{Lg/!ƴ\F s\!8E1s8LTTtWXf"Hb65,s7&F4X!Cd"1mRh{yo{{Ț?pG4fr8Рao,sFnu (5*Fo2Kl~,yBN}V&W-k2^N%_T#qgOK~遲\RR3XB64W Vt+Dp8j+ {:]ܷJ$P5H` "eDdS43y&{.Բi־"j+کXCۨ6ilQ[u8!8߱ȭ ?/d_,ǚ}~Xٲrܼ~Av#rScGf$3Y#xʗ^$b *^SV/۪`/քQя*8\KݧNH#܏"mdȩ !OB]~O1T(̆3{0]Ab~a`b p#6Iî2Hz|2Rr .].N?T;`N^Cd{7@>n?bQyRdIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/dejected.png000066400000000000000000000015661326020644600277350ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  !O pHYs  d_gAMA aIDATxuSkHa~^ty[ٲ1NJ7*Ea?Q? GB7 !$F$2 2 FMkiV^٦mog7E^x~ .^hdmb702Ϣ dPZQ 73?(3~z[\d@sm6"\1;,]Q[(ލ+`6LWjXm^DAA “1xgKAx22"JY7t=p 5bƫ*uY+83NK SJxNͧ}eu)OCsF#GBcr*yK.&eEx:O/^[3YJ(c#ϭ R ``ɀd - 0q*.03$GlKF<8MHO{N^ ˊc`*x;B- @! "OCQ:YJ Z/޴Ȁ%r d hX_7˕,@r~1qk@MJ# DӞ A "(HCзb+-4(+xe gW}Xl# E؟ jvӘK$'Jp6bBKM5r:ItMK??-<ʅNIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/depressed.png000066400000000000000000000017511326020644600301400ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  T pHYs  d_gAMA aAIDATxuLu_KC8ty.ct:I.u.gܜ-V.Z[e5X.~ ? $~HSuRli&ٵUI:518=/ k6pX|%p8Umx g9ƋU87-dZ ʓ6kA,rMGK!kȆ Z& neyB "g/YOWatȜӑLxrc~#t;gPfL/Wa9y0>_[wDKo/< b?b }D!1A0vgh;_'tZ2?;[NeB ͸ jA.Y܍X]u~HSئ+J D_Q2T"$ڙ$ҫ栒.ā|-nNQ[cu :iʓpXgf W#o)6+>Rx5A 'Nsd#Q5= ;S#\oU21 p 3~vtsÜbg"e47y5tOqYKc<TDn2z+Lgw7V?IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/disappointed.png000066400000000000000000000016261326020644600306460ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  2_H+ pHYs  d_gAMA aIDATxu[HTQhey 3sƜ2. T)AFAPD QCPDكt+vdPsjҴ&g:s.8o+egW|yYcI}Nz4Q.߃ol*[N{K#h2㳋J-b?ET9^;/Yɋ5 Pg䞃\5ڧLA>8Xh_VѪkrDKY$L''bM9JId w ̛pxo:!lуP"Z$ዴ?L79'$=h{yov"lq9Bh@PQ/4Zq XȥFcζu櫌cf݊AYܹy/ cv #KT(#I%sV,H蓝Ӆlu.WSLkĉn)r!@(kg8jB[731F%MXAK~U w=S2)9tBatG7;{o`4:)7IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/disgusted.png000066400000000000000000000016741326020644600301610ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  $k pHYs  d_gAMA aIDATxڅ{Hg?v:ܹ)f&DF6R6C.,chmn֨@V1",b]疗<y-=<眓 _>s=2&#x !980)l%wtK~W˝J٣4ZP(L 0h^e]ͫ\ K{s*i:R)/^ b_Od νOzm)u>MԅXh:\pl_'8{<uB e^50\gdz8 w4/1L $Wlab$Q-$h<AfLY^d9"TC۠R"=pt|C,i\>?(EOM~^T쵌Q W*+p㑙; &~‘ R^T|ҠvRO\v8ҨZW,Bd$L|Ӧ!rfFtY>9 QO@!Gs!6<IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/dismayed.png000066400000000000000000000017041326020644600277570ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME :<5j pHYs  d_gAMA aIDATxmQL[em@@A6p F3dDldٴ&CeF%ɂfFͤQ,$cĭeX6FQJwf9i}A:/gS̎]1PX5VbZhC<\[b,EVꈬ3cl-Jow|YH$bRRT0r.w9eT*%6Kmr/Bh&*rρ:fڛ_2UzzzBJy]ijj@ e2yhk9Ѥ/x\^o^.UUU&[ay}VRiP.Vn lŖ[4HW({IוW|nw& 288HaA0RN'dYN?ʛC]<> e./h39,DT"ݯi;:,)S$vOPZڊp95JFEH1GyW?67 ^CÈp>Ʒv]HΡvZU\3u~N= It\Gi|wOdo83HN% L]KZGE~fS~bQa J+s5tU$~/_N0lrn<\T6¦ԯkŽ΍&q$5>R.%x:Jܳ->.Z W;/,,Ms9y'3aFrzIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/distracted.png000066400000000000000000000015471326020644600303130ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  5zKO pHYs  d_gAMA aIDATxuS]HQ~6?30&@H PYvu7&xQWBu!QURFF6oܜԹ';=9sv K^,#h'*0ǏΛF0nzZWp":G.MvD~~0s!p#y*Ux.ɄMP jq!\;X=ƬHcx4xz S;=I,W =͜%4grL{EE:= wl;I V0po"C!#("SR@X:*ǰi#~ ,F/pPUx,V+Z)'恑7~\ ۇ5r571[^NHnYcvч٨bnn0㚠m,Jg5W҄h=}_jch40$T%Vѱ)&uS^6DG^Idb_~3]蝴yE;XrJ\(p>xX)m 9}[GbFY "! J B4'^~iTEidGVS>&G-34uGY6Z{sXBLQl#6r]s(&tvq'p*/5BvZ'K i&'8#5/ @@7LYY;(fl?;TJp+zlyJo rx{IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/envious.png000066400000000000000000000017001326020644600276440ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  0Ytt pHYs  d_gAMA aIDATxmmLgdE!\t&*s1b!1d%_fsK,S#YFهۜ_ns*25Xu)i Ors}9ܕr:(+vNkv u}gD>EG*1yWQ,Ũ#9Yjd#/Tș?Igx/&r}^Q*+=2mCn<[!?4d7lKeZ+v +ަ5ry-]<_ u6p ߠ6ѳ ZsQj%<4/z]1 |߳p^Jp,qlɉpSO3AGh(gX\jb*u_kV Sr<Vz_i~BCk繚ii_Qt@$'#iw^[Q~S4|X.ݯF6Fz~՜7OտH+Tlp|7<WjQn`sԇt' cQ窈.9h :+jk:%M:80iϡ[t)L *9vqP7xgw)Tő GhyaSg IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/excited.png000066400000000000000000000016651326020644600276130ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME   NS pHYs  d_gAMA a IDATxuhu_v릵s]Ѹ+ 0 a ?!L0&i"()ETh *efyƆ~ym’x}y?+pN6ÌM {8Y6? }ވ\S󌑺D6xޚ%g?Tolyx+bxJ(8d2|q &;:tyfs#,ɹ Mޑ竼wR}Bz%[+f2X6kycK+xwi<^?} 4$Ah2Ge)G6M|s*H4(v{9)B͎m ku.:6 xH$YMDܳ2迋 + yV"?_mϮM쭯CYI!Amvm ;9}SvL+V㶥Ip= Gn06-\ˆsDPSG8xH[C|Z"G>%D A"W44o*͝z"Sa-Z&)*_$Ș،"]BV-QLf㮢jG_7ҭ Kt lӢњfF/M̶NU5> W"lN]bDSRwnyLB"' \ s_ogS$~CwҎIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/flirtatious.png000066400000000000000000000016121326020644600305230ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  ,I' pHYs  d_gAMA aIDATxu}hq_߻܎ۃMpbdJ(К(??<+KJ" =rv}};ֻy~~c)!c%NÄ-JؖV-Vh=/ILJZA~<&8汱/[y̍ircܔ2U/Mds$Ѩ,sr7%",C9.d{SS৚9ci,rΧ 8ǢɸݟyISXl$UiˀT$Օ!K!Sp;z]uvP' (~0^6p}J$HB r=bu]tSdD3v(4q#ҭ')/F!G]}1P$v3e02 u~5ZGݒmZ8T)8#J^h‘H%,!Ui?wlaMaX1͢ʲ6E' u gjط3x[(;۷^TpQIf= Z}#5B-510]$c^_gsgqĮ\;()b ~t/E+EW*IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/frustrated.png000066400000000000000000000017171326020644600303470ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  S pHYs  d_gAMA a'IDATxuoLu_]p\9<Ҍ0\ınZ-ls9*Q|b[k=F 9+8!xJ;}?Jg~?x*fsf*zn6M7Pxܩ2j)@&:}B<ܵ0=e gxY3\NTOY8WDȟ#n6Wr_Ԗ7=_>W. 彛a3fHrݺ d "9rGM[Zrk33RLH$JJ Y28c /%4{Ma",b&: guTmC{i>~=iY&\E;T4KhhƆ3D.PfzN6=׮(JSJ+/ '45}x>9B2a??rM_TE5z]iB{u-D/ݲH:;0o s22r7Є#;YR2)8qp=(_=:uۘMsI޷`ݱ? zAېĥH{`dڠ@J7D5rIms g>H-Pڭz"}DvuuvEo_8D6ûO֡Ĵ/ \h.|`9HR|~Ruy vO"QO/I΍1aC^s.=%aIǏr!NM_w2]UG8;ߛùP>vE{n 8E "yhuVcEFݾݟl~_BDH(ögtΧO.G &zzR7e-O/?TZߞ.r[ѱƊ~bR\fKǁ#FQVqUcIEtvTB5nl-=y"]F}l-~bUpz;ybG[3-56Dop}|J[b~IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/grieving.png000066400000000000000000000016401326020644600277710ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  ;Tf pHYs  d_gAMA aIDATxu[LTW=4\f Q1[H"^d1V|0HHxhjHQ[oJJ1>`0}MjRx!.GEQ23̈MZ]9YkVPe3ʒa,KaZ$>û~)M[ t*{;6㯯f[7~L篭jFߑ-F8b\^[_EӁ]~5a>8J+Ph6%6&kЪr!'1֙*jU C8tLx *I0ǹڴV!Z4?i9p%aqLAr݅TI!Nvɏk)(HȖq)(ߙaUl!l#A&fa6"l[(pn'Dh|yѧ !}*fMEw"c +U~(c]4Eblxé݇1"Jϟa>Kz@nC{J;_9M] n.(=zEuu5Nأ{ӉF9;O8KL-7lV鲭ūμYDzTU*w_a-ܻ_nz?'۞sM1-yQ f >gHRv~IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/grumpy.png000066400000000000000000000016011326020644600274770ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  34 pHYs  d_gAMA aIDATxuSkHa~m9/,[5InR1K 0sQ"/!D]~$A7CL4lN\5ξoz||ϹWYo5bq_{w7D~X-aeA7]~ aAX*4N6W-Y ’'@XcAwDD-lnHo/ҝO`%ޮ"bd?H4]N<)%Ղd#jcQ;K4 ZE~j|IzxX]D=iA Cd?Vzሡ}dPmƓ 0P FHEٳ} 7ΡPX5]GoO; Gc~ZD$e j6k gIa|fڐ9< `Z|UCv8~:+: VB3_&C#!nsobDe};gWƀN.L}9*9dp.mb$  2TaGgye^ntƨtTR$FP'|0I6*BaolV'1 QEiĺx-YvْH?$SշP}YBghؔ.Bh,8}u+.zĿs>oBs4N-!qM3kXrF+ 7;VprP:[pKFwYXC_k -"m+D:vKyI^`OM"_c1#XaM!625Ґ oIM pGnbV+`܌>/C\439e7ܨBk_P׊:6K4S@#̌iTu >SMwMv3Lq\qkUM8v%O_Rs 9g] E 9o>O(g;TW 2@\IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/happy.png000066400000000000000000000015601326020644600273010ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 14 2007 11:19:29 +0300)i7tIME  Qw pHYs  ~gAMA aIDATxڭRKHa=|4RQLʂvQavY-U$"Z "(e."*fdc>Jy?638E;7+!|Ih?*`6ԪZa7HØĸ Uߋ9,~ǘbX`L 2 *˅ΣͭHFE#?d`XRIۯT^"W!f@3rnU%x \'OʡT"TM"SŁHN"e&Ď!-4" Z]Py!a} v#TCPj#D&9, xn(y"0 _+ `/_s1D2!flxN†naL3g i`ܭ#,ro #8yL]afG`#?נ Zoi#d5f1DQY2b rCL&͝Hw-f z&R.AfWJNyZ6Nҵ9 Qv& ˷FaQJQx܇)DEۢtP{Ru`\7Q;VO9ypA(4i^b=Ci鉬`h%qo َە8SU*i`oG; ^cOqk>ր_3Jِ e_X P/@e}BeL2R{˭}(>HRԇ ( 6lv7ޒ38g9^Db\zIyb 4Bg,!JJXl#';eRd."<)Bz2l7FW7R(\kWcz`%`;k;py?0>l/VRCBo?هc2lc IN,4Q#N鉝"K.+KZ!VTºbiٝ8J(vOZEQILnƒ_ %L)EUF"8˿tWcB򩜃Q0h-!=14JH.w. >;*2IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/humbled.png000066400000000000000000000016351326020644600276030ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  $Tb pHYs  d_gAMA aIDATxulw_T#ZhSvWƏ4!Ն)[Da#J ,d H&e"#5C*wy|*㓼ycIs9ٝ 7k,)hkT=Nd֯[̣j#rOѤ#.(WO ] )Z+5?τJ m̙ºf} IQ0h3K>&;I$&wњ` n NҿdcY8G} !W/kyf#z(Q=*sd4t~3Fr3Ym'ƏG2ͅ;iYf/0{i,F36?ti% &իf̼ 8 gpyi&&ƊR0JLCK|D.ܡ*xZ%g4OWZTG$RVKr`.pɡڪ8XepL[ thw=Ժ)seEӲQIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/hungry.png000066400000000000000000000015271326020644600274770ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  ,K pHYs  d_gAMA aIDATxڅSmHQ~6udjM7[5t(dAeX%VG?D0" ",,ʲ-d_9u֬i);qy9ys0m(6 n!ФŗL b593H 5㫌hE:ZL rp'# ~c&L*AZjW>z1J%nW!K9)|0 V 34NtJmޗI E8t"8^e/ snde硽 x[p(Q_W o~ښym*Q -MQT)$ڨ@.3JZ )%Ǡ9.zJjwC|AX@Glu۷pb9FRw_9seF( sb<Ӷ1Qi 98ȑS^<Vy 2 ARQj4*){~C*Cz%xPZŹpM1ڵ Qdz(? ΂Ee1'w0zSN51ӣduR"8sQ3\eQR,>XA48t2?8#=F{aô8-'W;^ ]($`wO, &KOIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/hurt.png000066400000000000000000000016721326020644600271460ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME   pHYs  d_gAMA aIDATxڅmLV[C,Qڈ*n%jae&2M$&&q?m?Pg2d`fc:BmiXq4&M=ys=9]v.4rv=ݷ=݋nj%2/}\y-/L%uvvzx󆆆sS9 b1꒵͓OwllQ:[?MZǭK<U>ӉFh4>1P(Spj_)4UgH$…:ܽRdѲz| q/?gb YVL>e6e>Աi^b%Q xjxw<эLOf&_BK 2e`-w : v٫70I )oY i?KRuab)䎫'l*bȞ)gP嘀mOA^`H q7\ 僊0s3Q|UJv'k APx݋hKHV") C[:=oaz/S_-!KtߒFP/K|D-e۱fuT$ЁFdX5T"*N\ܞyGl(-Tw˜+}6YF(dߍN/ ݄`{ mٛl?gq s9eqd 嫧q a"$GIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/impressed.png000066400000000000000000000017141326020644600301540ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  2F pHYs  d_gAMA a$IDATxmmlU}VoLVKFFfd[5Шщ0T!IĠ yI\0isXv Rxu'9qC*X%9[#r :ޮ ֯FG*+Y?G>͋SۭNͲn{3t~&2;&ޯMq/I.ԗS2q51 bL%q*rq%mTCжuN3KkK\UNG]%_~"%%EbXViM1sԖwJvnɍ~99(yyFVf+-RZZr/lo /Txs.B|ATq8TWU25mau=Z,,gSI#[FmK08xM}tG/7GuҸf 27 ARXc6a[T*M-/:N5oj%S*ob]6zYjҴ4`v<:BC|_0=4Fd|ZC ^%̹5Ih]]d7ybI>SJﯕnmN'8R0t}>9-DGy#߸Wҫ{A㊒.%U_cďV34.n"#tLHU]ڧI#\q[ =\D.e|L A^ YޜZRt>=.zo]"_9|Jd M5CWwt<`?`4䈽IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/in_awe.png000066400000000000000000000017231326020644600274230ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME   pHYs  d_gAMA a+IDATxuLd?qwxx"$HN5AdײO3VŤ\616_D4Vis4C6š(/T;.پ=}Qל|Y-庱E0vI40g45nHJ(ٸJ%)U& k5~ûUh3,+KhA5U.Ō d17"nZ RlcNU@%QvJ*ʓQB^(yjC:e›W͵ɥHF:H3ʷEt{UL&Cl HM I{Ddze\L.^fI%S t3Jyb'Ky:唒%5+$,fIzEy1T"2Gԭw+yxP1u M`0 ֻG9tXL;,Mm6)^.S [=HyFiaJf*Gh| L8$i}z8/Ρ95ς98# ~sc|8 \h˹iseIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/in_love.png000066400000000000000000000017231326020644600276140ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  ;cP pHYs  d_gAMA a+IDATxe]lUK߶+m!(L7dj(@tpkzxa⍉ޘ,(ј$ \l :nk=>`O?{qjF8Ն\x|iFDoXն}ٲ_ T <:MC+6:HzByj!,^mc p Bi ش:?z޺^`xVXc[Y])+*} Zl![٦>OjNy"g4G>&+Y= L{C{T=wnk{G!Y'=zo3L֮vsi%dm}a3so#/-4d9.yq 9V2 IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/indignant.png000066400000000000000000000016321326020644600301330ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  txB pHYs  d_gAMA aIDATxuYLWop8 ZE[ԩ\j6DM0D# 4>41!&%.>AԸq#F42'(C kqos=?.*>Lsv&]=!Y9+rG o:tBZM}J2AO|/JGSX=etLxh$3Ҹ>ˠۉF4MҺo7K֒P~e֙-灾&U)][Hc/J(x`7SrKaf.]l}顺z-g.G0,/.HTb%^oyN̈́x%r`-˙;IrN};OR3< \2cqYO]l;/BkIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/interested.png000066400000000000000000000017101326020644600303230ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  t` pHYs  d_gAMA a IDATxuHg_ᏴȞ$u&aQAQ T~lQ 6% @!\L:zN?=_Fy}>),>${ka3!]߇8JBϢ6wGɚsJSY]Q,сTmW9gGt5+L2m['BOQȍٔcB\dheϸ|6PSYlF!*.]~'@/Ho>堫;Ⱦlݲ&S1i#Y*y`Xì*%ttzbxLБdoҏoԵAp:a1as{4j2keHHP0nHhO'{[nw3V4/?R` EU>\C#:k̅e;V//$.^MdMx"mύ~lӍNv8s3@gW)h^Xy .RNm 7ǹ #ɟcgJd_3Q?ǂc&EƸ\i? w |^P̮K9_qm9l[ŊBïiFc B%3W d 9j?;C똛{ކy{{'QϽz8[$416#dž=}}]f18gsl"e򰧄:a$Dj* ]b ;ɓPʭi2W1*#M=D7˘;bW@iIMy;xZh,5 CפWy{vmGYVp5;֎$ǧ0>禒%jNBM}[@C >}ON#PŻ0zȒX\GfH״cXl g^'T*`=,1anU$7VBa@CpY *W烪HMNCE^Hr ;X֒rQhV|V|wkdn,"ua_PecceFʬHDf@AU |':\tRV*; !, Tr<(ʹ0{5:Y4w dYƹggfuYeB>em]9{ G6g͉ˠ= LB:O',G%MzY_w mF0ikWH'S+䪕 y`yn'8-CZ*uEϖW>R%i PAIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/invincible.png000066400000000000000000000017321326020644600303030ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  ` pHYs  d_gAMA a2IDATxumlSUvmחl62`8 jtDA  ~"&"hL$qd1&c1[ %vk7,+/HI~'9w8{0躣[IK0Չ$ohza}|=IU<ӷkZM͚1'iM`ihD6W4Z5OlFS:CDK+;GFArX/$QPghR\DE*BCM-.-Ndrôcn^W^Iicr0 )TJm  87Gq~ʞr QRE&V?!O W}lcs/7/^‰&GNYuSvJ{s g._;K+ulY!KddR#Ar+hu3qS6"lC۷DP *%Qf`K$z=D83]ofXۑcxTOfyYOF t2 9" wy4.X,Ɨ3kVM%Z/"<О+T}INHްўqM  ox)c3mȲTjϨ>ʼnrȝ e ͩl Cz^rs'm̶F)cUpa S]#/>oΕ?w1+ Q? k`{S#?06%/}l4\z !/&@k;𪋆gPiC˶m9)|JPHqF3XpcѰl2j kB/N'E^NiK:I#Jx)V8WOQJ%0R 2 d2zR9#S:3FèDCNT*U"vIUXXH.ɰr$ʤ<-R5 lG}ܬyf)Q@Tb@bNO z~ ,)P 5EP[m{1%rtwDNo8Qp\ooP}14xj}Ps,;C![K4 ,P}#nfHGDxV &'3كN89k>gޡxҲk"[F^ }%[ jTO0IN F hv, hn|k̮8gdJ vsnP ?F "xMXa~hvq ,Val l߁,ok vU1"dS"޷ zPsr%_A,IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/lost.png000066400000000000000000000016541326020644600271450ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME +E pHYs  d_gAMA aIDATxmHw_Pt%_$tJT@00A+jnb+ q2CS:RO;O<~<=b9wBK09̸n)Xu}Q:2v(J^P:vϐhS,&nUoNOi9|R?)ށaon͏_+X Q(F11% aKQ[xmZj_ZZ%] $LV|aJ6)nsv>=k~3迥c'Wb2*;1[1%}Hg7dgg|?h>tʉi>2exu5K(]SnVXX߯kko\Օatꆆ]J޴o'M5*ckf%~?06ÉE|TS毯^Z [@`b LSrŃ{e=q|).lTU{0oCSrJf<(ʂ{FONd%*#7ClN6Y;)3ddB` W CTda,c0ZS,Gp,|)q-eTЁ߭,;*LVj8@ ?ƕ g߶O,5I1[Qq&#0Zqq EYwIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/mean.png000066400000000000000000000015711326020644600271020ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME 8T{ pHYs  d_gAMA aIDATxڅSmHQ~KGnNfKCJȾ")/C2@Ƞ2eQA!#(~UCXM2ff:M/}2i&=N%PDpcK=C-JVF􆣇9ڀRH^kFf ^AT; ,n1,W売BA9ûA"ш:hiGXTrf,ʍ\{H8;$_EEQ1"s\v9^4߀&3MB`sDp7"n~`g-PH9/ўĜ$J, r ^?99˅t' |GAd2dw7qIr>]+O0JVn SPxB.4є3oK6~nߺN3[ ޢǒiw/4~sr˲?Gx2*0tځj%F&=acL,/ϲ&+T} 9  b1-HNZjtFr#Zֱ1j"eJ2hSI^LH)ne/+Eq@5[F5 69kG]}hQu.P.9l%&" 1rQuyWIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/moody.png000066400000000000000000000015741326020644600273140ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME . pHYs  d_gAMA aIDATxuSkHQ~ΜlNwƶR& V2@%Q0??G/,B!!5 Vei:/3/]NmCrp{sP 19n05u#c&7ғt*3n'`C”FDU !b >.iJv00nH΅0)&0pfbo5xq;N'Z Fg$OZ<335_KϦG|z$Fz/ʃru̔oˊxrG㋁A'GUE6$DZvxeX o>/Nb(*bQ=H|$?*v軐 8S`bт ~3UCIbomn'-҂+BnPQ!hUo5M"[k2c K`wb>q,5MM"dN#| D:^` ]yt}_a(e;%X~eEs0;g&~&]Tn/ s+B75I0^+IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/nervous.png000066400000000000000000000017031326020644600276600ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  9 pHYs  d_gAMA aIDATxm[LW33-Т d: #7 mVB5Z)hh)1$/4m$TѤ(c)Q!q(PFp(\3`j's^{׿RHIwea38:6eZ$Bu=yp:kHXo2|ZhhNR)يH1Ixӗ,qhڱԐz#猬ϑ,y_rC޼S],엥o&i^wn&2Y☓D\D6]VLRPVNgWsVua OOw XÂTRl|!HM}>Fq҃sF}8bڪ;l$`K7S*I^ 9ө(^OJ82m%:u {:9uPXP^;Uf;5Ta Křw4j}"[=Tu7>ӟjK2˳ggLkc4V/3XzL%G-!n uRbL7Q"`BItV, UަDէ<#~Ⱥ=^$s^h_ gQtǷ|sgk2v9v?N6IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/neutral.png000066400000000000000000000016071326020644600276340ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME ;KkH pHYs  d_gAMA aIDATxuYHTa:[L[E{=!E/EAFQ=>EDCEEQ-؃ &2i92j,sB{.;%snj$6:{8^S d$~RJ85Y}IiQƲ:/BɝC_{.Y΀>՝9#?W3fJ(tAX0+7DI?ՉӤ<-MqU@]qd-H'<+ڹ|nFD0hl#?ԿszICkS*_512#IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/offended.png000066400000000000000000000016221326020644600277310ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME %D pHYs  d_gAMA aIDATx][Hqǿ?lʜnŗz B)̂.!LCAH)eAkf^leby:\? D% XoZu( = }>EGef$#x 8F" ixXļlYVs-)S@f }`.W g"AQxw>?ֈ u 0K 8J*ٕG˥$2T/ߊAXpm!NUJ'$(%,Jo{#WZTbµŁezq*3FiLr$/4\jN>;0L!e)GC6Ev4ܿ"N(p --`=a{*=4h-)jRٌ3'7 3DkC.QX R6c"1HJ`D$i>5[`&JُptDJ%^v(8n ($Éa˃qN_Z l`(KPyb)LsHӇn >:b3Czv2yأ&1J+A9z?]u9Eehjԓv/9ˇ( j:KNfJ}3'1]ۿf!gG}Ct ?gXIX /?x֘ݿǴh7f\r",kІ" ޱItݸ9W V*+ IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/outraged.png000066400000000000000000000017331326020644600277740ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  &Sp pHYs  d_gAMA a3IDATxemlUݺuk볖]661#U fȢD 2 3%%1|Q]_ʦ$$F"H% FDŽ! (նomxs{99fo,Kɋ!0FxvuvZMƧN5 *"]*Jz=I' ԬJ&h,Z:efSܾidRHS%@-_/8 =\WcYHO/8)]Foq#V8ܦܫ5`8݂}6iyG'dp'>x_a6*غAFn^|HZ+ z?r:#?(ymˠ'6[fRXRI\Rܔ7^~\~tiڃ zC6q}-\ЩN]!_?}(]}m.Wt@n4}gOy餟O*s^fwA5X YHd.Nr‡IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/playful.png000066400000000000000000000016631326020644600276400ustar00rootroot00000000000000PNG  IHDRa*tEXtCreation Time 4 2006 15:22:22 +0300tIME \ pHYs  d_gAMA a IDATxumLW--oRu)eт#ÌN]`b4|0"/FQ5.K~dٌM$l1nZ\B[(r=h|'yrϹGN~NP!u| ikP'I>g+f=ގߔ ZJWET1ݬ*UmmeΑ3H$Bv$+e+r5cƻ*S|ZMo+g Q5u0_P:twF-.'HzY%+c\Ceٝa\nQlޑJ԰imilAѧS 8-\ѝ_էj.V;  &'Bf#HJ,rӮ=kg': TSň5=e_B*ON1Fq w6 Yd~؋)+K!zcB9IEWat暅4@OO?q/z9PL] "/W&K7sV d̤DB>JEP btIoo䎻 Ir6y ˺c<ѭ0HbI/^wAE}AWP} 3ڊƶVMlqoߤ(k}YGrّl=quK gls߭^6[F_Д g\HLu6x9 gACJ/]62{(}b.¡~]$K7hj3c ‘f=iʔOR=ȮbN#AMgiJu(ٺ-=D[D^n+ >'i[64Qe2ٰVtYQ\ -FÝM##b0m!0l[t|'`kVeQ҉3fR2]aA7+ꂐ g(iPNk,^z¯w? Jpp<^ق4UnWnC \y$k{]%̮ܻ/ɘu($E3Zρ TRVW`pNڨذ_In>Dh!f*V,vp"v%E}Su-ξj5 )3lRGnlRX[7TH]‰Bv1y0D^%]H1E>sOݦ*Vo|DF;ɬN!ȿOnpֳgZۉkf|iMmAczT\~w(b{@|cxI^Wύh\fOvV#-دae"wHrJ<+H&\,=YZ/Q;Ok\ւK,ɤ0Fq"iO5lvYn3quϮ03[" \&w |q|$z,R<%K@d#YVgJ?bapMGq3ͩsak%yj41:ݝ (0'7-2H/(ӷ ȡ_ȴ/W8YQgbJ\=2p";Ϗv޲ebKēD/Ė)<& A'IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/relieved.png000066400000000000000000000017111326020644600277550ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME '} pHYs  d_gAMA a!IDATxumHYw^GͱfrgILOL~D}@'+6m%"ؐ(nY؏ǔFmi&SGײ߳gf29}?s(vOHz$ o9{[.?V慿VEWSE7(El(rf4F7).FjDc{m d&iձ<>~זrW %#aWefeYQ"dȱBRۄWx[s-~14mIWMDv?q^TiÒ tۢSưhK1s {vRl>TI$]DZᓗG0_);6-IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/remorseful.png000066400000000000000000000016471326020644600303510ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  _c pHYs  d_gAMA aIDATxuSkHa~mnVV4Yv%R+ 1. jEe7") ! "~T?e!X!t!-)˜0颴Jm35[i\|=yل#j z 9[z?8%؝6 JO%fr*oY;]ܾ+^V Wg",vAmwxP5Q|q10;#w>/ '}映qce4Y"go@6Ajkp(3͌Ul@aA3Ajq 9yyr&9?`- !ܢr-晔 $F<}yV AR֗M#CJ%rEX<s6$BSc}GfCWh47V,gBZ@eҿYD(-)ܨH.1Gضu`çB2 +^wLO= 1T,%5C™n|voB7vར?mH]]4Is6RV;JGp{BZcd~nXx?荄h xW@geq3(YJnb40&1&5mAVw,d%$q3PYE!wMHgMl l""8?Yp@o8QA<{gԎ DЉ} Ն?w7[XZIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/restless.png000066400000000000000000000017061326020644600300260ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME 4wa` pHYs  d_gAMA aIDATxڍSkHQ~6M̼ҲݑR0JAHIYR ??E7 hHʹKtWnsΉso/O=9{ aLa\9G|O>֥$`lό,q&)J)222SiRr4sTy#=x6u 9j19+|(&G>\-(=bԯj$h4 k2z^Zވ‰[bEg^sP)}h~Mӭx-8RĽix3 tYQZ.485UW6V.r'`X!HPSSA~.\t!X- Q#`n h+ąHIDK+$'B((8>h9AX#ٺUؘܼWUqurDΝuf@G=?\ ޶t\%rhCahCZ@;OL` A- j,,G5< }|.d2ԍvnfVPB.ױX4<968%ݗ9$A7m("gB-H~^g))s#޳Z٤%G@\!IFV)=6!xe6!\l0r "q7w;BB۵pX 6h8䥚ۏJ G N='SP]/f]dCyՉSPE O鎨POz-0B}k/!:7~6-IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/sad.png000066400000000000000000000017221326020644600267270ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME ūx pHYs  d_gAMA a*IDATxuLe__"ly-mje+,\럶ɦS.9jk bnݙ" )?λ8ٞ?>~?{Gp.>~X~\F(U}jv{i@FWlx s#WlO zqfe2Jey./u+DtH___ˑ=U4' C☼5vU\rz-}^)]̜Dy$iɝ 'mh"YfRh_$s'onGFMP-q3ODS9͍_eXE+q:ҹ16v{Ǐ!3^ZO^J Xn_,Z M230RF"Q~Z4hE䫜7v7j\>i ɔ(IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/sarcastic.png000066400000000000000000000017031326020644600301330ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME wy pHYs  d_gAMA aIDATxu[LTW="cap@(д5 6AVy1x9k{m-k,RƢݲ6NXH{Li*U_I hG. H0QǢCtJsVEx|_Uv! {ɝ593a]`Bq?nO!*茼˳I\̤XLX $O-ptv3{~/gY|=YCOqtZNp,[< YH 6 z  =sOhny:@uvOrJDW8rf(/rʝnpVzLK]$&(YaU2Ғr˼~]'2OLe}܉zG.{vHax|EYeK ')$0 W:F/1v 0lL-;M\/QF'i+9WTn3AQVゼJ*fIzu*m"Nrn:V#"6P+alYpe+bŎMk$0V5u h`sW/e|4,t(wn&FxXRI#:|QnO1iB]eiII܆A%/߽^}E؝L\'ch7`?m~z9]/\AIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/satisfied.png000066400000000000000000000016431326020644600301350ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 23 2008 18:00:18 +03009tIME 7} pHYs  ~gAMA aIDATxu}HW?{uY9E[@b"7%D YlpVۊ-6H W+8e*m E|NUQp>/#kG>gSx913Orb?{h2l/|HW#ңSbd%9|&.EȾj$<#;9sZhYH%(#OT};IRR*r !k8S/t+bQ,Ad_kdXy"'ugWGNhxbٻHu1mdD#=Ӽ-+oC*!.if]-|'? [vU[~[TÒ+O JյZ ޥь&C}a膅er+AϨjYؒ Ye]P>q }k1WE%bh63ABi>fP,d]oYÄ/@088a.^#_j0|Ռ/**Fe&F&9 [h>/ϙܬ>jD( \k7ĥGNZɾ{uϚ5шK+d=8xVn{CySy+Au!&21G94FIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/serious.png000066400000000000000000000016511326020644600276520ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME $< pHYs  d_gAMA aIDATxumLW}(-/0XA":| H02>a%@b˶Od,df*&b f,hh6@cTVNZxJlz{Ϲo9~[{[ܞQ,[ m~kF7E@1\{yU~}*y:6W% *?O`sf)eN~oDbv ϱco&+;ҁ-%+GEyQ˛HԼ K4DfC RX&rgHB:Ų'c^eRWbvOSy=FN)/ʚU-u"3-EX]LsI䰑2/ؼ\6躔Ν_IqfrhujUL"(̣Z<jbljH=:>̎P65|di\ǖ ?RB`zڼporHrP8rqnB,9">MINxzewFO?%r N0>7d3Ea)/7[7DT=мW 6p]NM72yHIR\+o!%o+W&M2W{ٵ5QtNT}4..ttO0NjO"=0 ‹=ϭx_$a 5|b4QNƘyWKsM<翍~/4 <3O{΋4]_EBu[A&IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/shocked.png000066400000000000000000000017521326020644600276030ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:15:08 +0300J͡tIME G pHYs  d_gAMA aBIDATx]klUo߮ݥͱl-PHD61&/1acRMT ^0DQDX 9al`77qnk]۱J/;<9/9*Ku;#јr Wj+;RlhpSUhv61vKU7|u .L{to$_, Zv`,B]z-@۩>{d3&WᄏuHo>hXʃw_UӪڏP4JT]~?  nrk珧څ?,5|Y"nSD]%xIؿ^Q'P_ib#+-Ŕk$T_^cznY)IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/shy.png000066400000000000000000000017061326020644600267650ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  l pHYs  d_gAMA aIDATxu{hU?7ɚ~,Y.V-];c CTL:&]ccXd!*Z667`ea65}I;y|s*vfcrJlvkJ^l{όt2r7vSXo>4s=FmBT#!d⼑{utymw,IՋL6JZ) #kkjם[0"e(( {dmS~zH$&#OJfX%&a:۟6}̰k'ojNIWg (x S?Y 3 yĘ)Wn\cj3=(dDžj2o())lU W\ ɬVBNU":Y Abdƙ+p^6"Vxt]L =p-%ZE jV׆՗kUrTߙ>^-t…-*89|TT,X,WI(XeAS?d3Th4vg~#ᅆ^ܪmK RƓr*=r Uem[ ֆc.Ɔy70KdjIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/sick.png000066400000000000000000000017771326020644600271230ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME +ґ pHYs  d_gAMA aWIDATxmS_luzw]]OJ9["A .<Q\"$oj(> 1hBIئ th72X׭z5#|}HMu X6Ԝ"y,raeO32*uN>7j < cc5ogof3_mx6_F98˂ilݷME<-~Ah[#qsN6P͆@cL-X 4Y1:J3 a>֐_\CP1X/S; wmRl >Rv3"C@1-y.ioc53<4#=fÈF <ϣ;$DvEI}f? ѱ86ZVm#@2qY3Ip'KĞzeOx# ~y9a8텪T(b+SZNMDլ;_pWҰM0 '04^[u½ UUG ݂,A-k /=A"X(*44(uӴ w57ߋI^Xnz C7`F^F-z~sQ~?~mAqO'k)֗]h ౗èHM+np K>FвRLB-eKpw~JS'=})\bK[PqkTK ܼp=cF*q|8 mَQ(*jF)S|p \Ӭ>IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/sleepy.png000066400000000000000000000016161326020644600274630ustar00rootroot00000000000000PNG  IHDRa*tEXtCreation Time 4 2006 12:19:16 +0300$tIME 7 pHYs  d_gAMA aIDATxu[Ha3HMrDME .Ȯ"! 6 . R霖 fyN6}ԡP/9}އaRPD.YC|vxý#h%gIK2ef= 1L 0nJD?fyC0r> 0YߖF+̻7N!+8U"-O6% z4TSK7(ĥk6 )Ej`Y *t섔vLI<ԝ)ƍ{d s&"(Mb{^jA)cܰSqt6ꠀ|ޛ(v 2aNJ$h qA>#ECt?&UqS@mDt4J0w͇)*ho$I+1 Є.'j+.aFG9̘ JT V묈;]1vD!q F]A=j,j;VXxL5{"o|>Vu9=)b04sykz$l 礪%oڡC#';%EEk'[DFF<9):8 uxDF* H$KЃ#b_9,9(,dpD0F$WpM|'ť% i_ʸv!p_sU϶>iha]n'?67sLfk#Y;xQD'BYV'Q3QhjEVFO`lF`{ߍ  y$`mQQ50}AaB@ D1O_&dpƧ̐a^ $$ EV39 bH1~i8] @'\5veHjs8t!765ǫQpa&'"$XB I ?onBL 07]~$|b)}sZ|1 QmA2ƉBŽ )CLT!4w2z24- JgGWJ8)3Ve4**4078O 8Yŝr;qwG?06ۋHMxMYBlCuK?kk=IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/stressed.png000066400000000000000000000017461326020644600300220ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME /s' pHYs  d_gAMA a>IDATxmLe?{oi\qeĸC Ilɱ@[ʨVFV?Ѧp_8,@j^H  W(p}:G}w9<9Uii^^i s2a3\ q3h-fQYi>;U|Z+=ҭ/-↬H^SM+\t[E0GBj (COoXO? qkLjs'#Qoc'ʶRo.WAS˘nORTnw (/_˹ޡ4Rᯔ^2KG&DP{u}]/+UoQnmjΟ[2tf:{t2r9[LNGȉ.,ȣcxdQYV}WL>Xì^UBg ?)-Yi _Bvz{q͑kdLJoFq ھib<e ؘǒIHpPp`1oU%ߩc խD&dXhYOdž8}9ρIq@Qdqws5*(K*N)%(̤l'=MBVyZHySd]!f._̠ЮﵥBxXRHjk'pAp7C?ˍ*_S7湾raLqAl&}-vP6H8f!ZSL୧\i拉+_}5ev*ʒ~:K䁇3PZJ~:$pJn-| PS lMb  akvʯ(0v\Ik~p%WyG􁫵tݯ=BFwanjsiѐgͼ-U~>$q7nd?"]uk3?3@Ή ~:_$)U"Uu`1xbl} Ryk-Y jP*_#[+hmr>ՉLWN%KrqM%=/-w-:l'uFD$CC ),DB]tXQAExZuH؍ JԚn4q¦[_9R ?RM&pm20\kpnld QSj-'x8` ܐE98l!r3o4Ip2F_7 Q}#B J%1SYh>ْ.S)b T@NHEOͽzT֣, "rSU(mm(>QgP? @؋Yo!,5aQ¡c(y6\`P).w (:y] l;qBmy`HCp+L ^C eq1HP&3*d ж8͉'Rx&UP=2EݲrR6KĒѹ/K\aƍb$S;H׎ 5%_Cϓp9bpUw`Np^AS렄+'VTDf!5c47/dع|u76A >k(DMQZjx['σ{K>Ks*윇.ҡ*Is9Vh9pQVz^蔹,Lq\ 1eGi`+OM:ahJ hKJy0k~O>p5 !SIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/thirsty.png000066400000000000000000000017071326020644600276710ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 16 2008 23:27:07 +0300tIME -5 - pHYsiTSgAMA aIDATxuSiHTQ)93hjbdVfEh- A{dQRQ"致jq!"4Mc*4Sq6e1>*{;gQe2)&!Y ^)Ʉ%3Q{Sr@: p26m㘈QLE"ܧ'P1'bA[VPZmA(p4kTz:ȳ (-D,AT_\|1C}7:啍(\nm _۝ّ`wS ^TG3\[C|`L; ))~pqk+8\ ]/L9Xs) EK! oU/0a8vu=tO*'^]ش;MIh!ydct.m؎ ]>sF z׽7TmnÌSk}5aGC}-\InU?:].diWQ* >?Am3-3Jla$AGl0z=^Bޮᛣn/&P`۟`hr,( QQvE)u \W?+7ojIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/tired.png000066400000000000000000000016771326020644600273000ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 13 2007 14:00:21 +0300tIME  pHYs  d_gAMA aIDATxu]leg`4hQԁ L¦|Th *raL1H/#3E\ 1H.uVZ4d'y7={_7װTX͌Cw$Dְ$[T3|? ;/zRF?w8)!e{? v [z8$_1Jí%h>khݲ ]^6/CDW-h9cͱ%oV׫ ff X9e4-wyV-+I/U 8O'S{[ 5U4SRsOtz{onXפHDq͆S+? I/+W=n.ѣFYhhO75iu; d>Ct=| 1ԧڻE?16Py?#EȼzS$S 7|p>7A[[`r2<Ϭ3DŽۅO &$NFCmkW~5e 0 W+|+/5G :\$<ަrCB@ K8_Bx}k*VoS1+tO&8 #1zwȌ[@X 3[8WqFPx{ٕ8 2QYP {q' \eW>`(dQM IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/undefined.png000066400000000000000000000016031326020644600301170ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME ]0 pHYs  d_gAMA aIDATxuSkHQ~Φ[i$Tt D"" ")(3)a2h.urާswR }(;2+=ܢ!b#ʮ(,%ob7X$Y &b`.";:@JLӾɊ i< !`/ +hEVݵq'׏LBD2zvy&?Y BFV1%K`2pb ӡS ^wlCsED2m ۼsi5׼VRgN/r%M X|ՉBtN4Π81,QE"."u-X}k;QCoAOXzGvDn\{G}(j9Q**)R |b38[>G4IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/unknown.png000066400000000000000000000013201326020644600276510ustar00rootroot00000000000000PNG  IHDRasRGBbKGD pHYs  cIDAT8˵OHp?9sn9-IHEúx *եb R MC:THb B2':ͽ%us{}"tʃPsl egXjhJ{x֗C;4 ^Ypp~0]~ Js=A>:vlL&>ۍ"j9S3|yO! YXx6B t*$?c=<ңlBFFFBF  LNNJRrC-&S%ە#;U͢B~_i )db`7- bcA qm꣨(L@ F@ >/I랧 `0H]]3!Z r k@02DﻇZx<i,W] cj&*HKKbϒ_cm؈9^*qʐ? ȕyp+%.NKrP;H^+z.]]:+3eKt)kU S~y{콥Jmفt*mT @[o%P]θujKviR;H|IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/weak.png000066400000000000000000000015231326020644600271060ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME  &.[ pHYs  d_gAMA aIDATxڭ_HQǿw ͜SIK+3BSH +R1 '"D01(Jɤ 5M'Y9 6l0s9OFy0cL?g1=CN=a*ż^pI\9Δ%礊8(g g>pΦV2ǐyIo2$S8XA@2=`uhcbҵvNR45 :%a&'P_C'(?0ucq NP5N}7Pd|(TH!T]YN=+G 340ÊYjh2jYshBRz)*$8c!n;ހB )AAJB.IRz>-2SrUY&hlFU%ayɄІͫ(ʴ]Pur|t㚂RBr-Ȩb ']DkłZC? uy1B/%=f12&imwy)|vz1>Ɩe,̌յٲ+xH߉y#=f*Xt+cS׫G(TP8\@E9XBK _dJ2,hD QvJLjIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/moods/default/worried.png000066400000000000000000000017401326020644600276330ustar00rootroot00000000000000PNG  IHDRa+tEXtCreation Time 17 2008 23:01:11 +0300YVtIME !'m pHYs  d_gAMA a8IDATxmLe_p*p'v,bi(n#b?Jf[S!f?rXmP tZfvJv8~?N>=Yy}><_br><.qFў&ho _맟4VO^*bU6{,TޫBgV^/Ÿ~w/>N=v{̫E>G;[)UPRWKr_N2+(?3a+cl_7zo`0$A~:4ք6VhidI,3:#_4ƺ*VH*ͳ &= .koMq]Qj݊1vt@ jòuPOxo; ާ9Ϛek#01:EysLԞkqQuYT%piV޾NN8v?1wų Á?=T*NIENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/other/000077500000000000000000000000001326020644600240245ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/other/dh4096.pem000066400000000000000000000017221326020644600254470ustar00rootroot00000000000000-----BEGIN DH PARAMETERS----- MIICCAKCAgEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq 5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O +S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0BjGZ//////////8CAQI= -----END DH PARAMETERS----- "4096-bit MODP Group" from RFC3526, Section 5. The prime is: 2^4096 - 2^4032 - 1 + 2^64 * { [2^3966 pi] + 240904 } RFC3526 specifies a generator of 2. The generation of the group is described in RFC 2412. gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/other/servers.xml000066400000000000000000000050441326020644600262420ustar00rootroot00000000000000 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/sounds/000077500000000000000000000000001326020644600242165ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/sounds/attention.wav000066400000000000000000004363621326020644600267600ustar00rootroot00000000000000RIFF<WAVEfmt DXdata<      $A)kX    ,"j' JD]B\ Wd,4gI6lRT8O;T G4~![6G1H+hj"b]n5(3 AU8S! r8 G x~F)۞P(l o y # ~ cAzx#&$HR#J A s % ; U" " H`"  - g!60AV)cP{ p  % / T !"3"k!@ #  #z])'L&hd&(.!+w4S7- { 1  [ <c+W3 T3 B` 8 d / 2]Z2G]v4si40[!{8E4 J~5 '9 N7$401 Oto 0 5 ` " 3nK4s:0'a'u+@h3*,]M/ i. j-s-l+2{0.+ (  A <'O*[C,&G-#g`- *Pژ3 ;*+sU3 O >5B6"8>z`9?c2 @ f B DKt H3OJ ( FNE%~T`QgU֨Zۄ  U]] ]4WX>_E\ykVMY} xT @ [ FQQeS:gJ N I !Lh{Gpi^3A֜ۿ$N> +2YV:  U]3Vl=2{1G. < = F-3 ,/O 0 5  ~ /y13Kן޶( 4S{7 . M66|6 /(7 W8gU6u@Aa -  H-[(DIH%&  PCe e  ?yF  5a.  k Q _u1ohg  # |% + ז1 b 2g& QjG }  d ut 9 D vxDcl K n  D Y؜8 N  QR$]i~'= K R Q?Ph0 D N _   5d%@ Ҥ+P $#Q  [ n i<- " 0K & #1#0V Y&  z)-`(s-֗կT-H^ N. - R09BB/=@-:Q2A/  , 0 . 1Uc], a  T 1O>S-:)O*ԗըV; )u7)qH ?)~)E(i}Q) T  9 n~('*.q )0_ %E':E'A޺׾) )W&\ 4, Q$@:"w#   K } O5_=  \dRN~Ԉ7Q _ S-qpB  q')y< DQD @  U1l=}3 +iI & - G+_32-q՝ m0 }qm7=\Mt 73:u(>R;;j D   >MC}A 4% ( B eB^@՛@r{1@dTB AKg3EBHCEYDa l <A(h6BQA FN Cm<-rOD0k>ՒْA$@Z  !B#d<`}^<8AD{6  0acaH./ ^ (  A%Kw% :N.ړT6R,< H Nx &P\pa^|ca]Q   \Eue 72 5 )b`x ڄԆ߱c$ $7*'d Ft . IiK-c+*?<:0Xu l13,,:i18 I] 4 @.3#NZ3մlړw@C 41FH7- 1 ( 6C4t,@3=U 4  R 4Q78pmN08 4  JL 1 d2+@11-0jtH (ud( %g}->$#j   Hy0[ #I9 WZډ!ߤ&r s3Q(g V_Z~1`    uzZQs}   [H'/ w*? 'V> |r}w`@5 '   J0\ei  >M ch1FS.F%M "f  2 N  q n YL&[tA} I%'U k QXs?*27lb4nTki w :cF&r- n K _j[U@C&aEV: H}\ui W`iH5LT] \.h   r 8 e8Q{Wp&'p| = mC\ 2} 805~Nou3 X {(G|,,w d/ LYVLoUN%D #l$Bb 3T7  c x  G 7:RC'FeKo0JA3 /!0vi" '*3U w*} _ Q  (=0m }c ,#~ `-n%0,4Hq r<2{ NFfzt}a.<)u7^$#  rdm b[`T(nQ!G!<wO|`Eqh afVIA Azg7Td p0] bN!v{b| U-3Oe&MmU n)A&^ X'6 }D  j 1p c|Oq_F]??`$GU %<) N ckk @6{ Jr+98.a8:#hyRtU>*vX=D.1D3`%%V/Cy9]qNs6C"<~%6,|66oF!+4  L 9K<}:|FM V -~''   K\tJ}(VABFQm`#T5h/<\    8z ,#/%{2  P>R:|5D K W 'w15N *.q>O9e=B3uM=c5 Qw*,kp( !` " >H x a6P8umT J "Ir"*$&K&"Q$ Hy,Z)KLt'\j ;q< -; x6 0y*,!1)t0\@V4 rz ` +>.C8n9YGC+aT MN @%.(y:-nN&GTO0=  A7*z06jH** A # C Mzo LE 0y: L R$sO ,51 F DC0{wc  S c > H[!@ &]T  VH<B2Y s W G qgxYpM 9F  pqum T5߻R- iQ 9 Jqb'3bl   je{ޅ͏;M= Sc 7 r }p}EY$h&    ? 8\Ȍ} ֳ@  Z pA j  eV V - % Ky+m"kFOão*Q +;BW_ 8OUq K5XU U  foL~(ԼË {ha GMh.KM'>)U W  L   '<C 2'ͮ<  "CL}d M 5 6 341}ܶJ#ͥ !W v! 71D{D1    d   ( o .ȍԘ[ Y  2^ 3\W w3H K  G  O  ;Ij<\ R J ;  d<w/1 #Mb=f  j V7ۭ C*5  */8bzP W$- X 1E@  < 1qoϬ"J !  *h+G79TP@<-  oC I 0^tK?ƨH:(vκܖPC K}<1hl19 .|(5S7  XP + 9Lɒʸ#W&l e ,9'U.I ]/4$(j0 $'` z    : Z2%EνaԼX DpA j@n(!\ *6n*} _,*(E\6) ? igM(15G!˵һhp  @cyx gN.EPM) #numg %  5X/?;+^y ,yV L7"w  r ;r+\TTJz D@7 !  U 0 +&_Ľߎ ,y  / 2! A/K *{.~'\3 k YQd'Mq  X69kR@W! nq0 !I!  p= GPjAK P1LW  _ HrCA&6Wսj+( c IRJ2 T  E( LkBR3? ,:BM3[ K 6hoc#F~)~gu q <!u! Ug vg!L|@X p3X5 *B;(Z_eE | !:!. ;6DT=V dA3,e U*jv N\%`޹[̂٫NPN 4H=c )![ 'GA$S RSv pc' 5? Z + v[0`ۻ7}mF*ZX 0H7E V Pbz6 S qBX6$ a$/h ix~c `,L-B'Â,Xg7 +dhu0hJC 1` faIl IT % Ap }^2#ǠֹgV'ݺeaY&v *3' 8 w,9Jc>t2b {vX8\ V3b)BNF  #.v8SAL < 7JY>gph \ 9sg e.#>\!֔ȱN"[m\ ` @Sfu V 6 m,Nb\Y RBT $|T@Xޛs!) {NCrQ]X w6@oep [ `IT H)ɱ6I^L&nME w<S}rQb  tUYn^o PSxg 5 V4 1$SިLec 7QIg,T: j)u0Z0c9fc#/ R *A 6Eͺ2Vd3-( =4C? s J[D-/Zq QnGprJ d ^_ށHXYɪ9'\-x1  f ' ]! +$) lWIQze^aJ{6y e6cr z & EXBφT0I1afEE] (i4H[^]M  6#sYW@v4*d+rO|) Ih% m c@7*Qĺ q8Fl< o QH '&EL,w]g "q y w-ʇWhWO`3] I [b[4 ]lNa8_h; r  ? lQ/ӂwʐFdW^FS i D B0Clv * !poeV%1 W 'uv^=ͷڠL; U A Xe/r  qm;Sy +s9~h-R2 p !  Dzm{~HǗ}JeWN{ ~ C y  {Yh qB.+hz!] ZKO d BY \5Jx)   ? 3 ~k& :_C D  x^OWK6S)N& < b ]UIW/϶ïSPЉޡk`4 iv>uD3| |.Yp!~L6w3 ) t s KOnTpRˑpv y_{w V~mV r X w boCnv Wf_FZ - _MGC\99D=w#&ky  @Jq : } ,(6]f 0?) 79Z | i e_ i}zڄ̛2i[ wmdR#Nzxx \ K L { M i M m/P|~ "Y X7kiK'ԐȈ|{*F f[-PJxN B C , ;%p$Jxyrb ;{E "_3e/ǧw1Qz f ]@aSdW{ y ? . W -N2I + }u* / ZO3&ۆֿ߽BYU= S3gg@Wz ~ \ > w a5Z?`/ Ak@ e5$|    myӴ,KjEz d..zW 8 % v V Ffd  VrQ F f)< < z93^lƤ0ݏ 56  V[38[W @ ) v NLz(YUYTcimU ;$ Sun6g7pa0ħ"ŭ@q1F~v< 0 N T L  H }ex. RJ]eI d`S JugL{{…3q}lm{f $ KZ>[6 T 0   dUOyTpWXk e> "-|o ӊ+=~ӤHt a 0H^Q8 9 8C T9 9S0 -wA5m!N97+`0 Lm? * x A |sckCLbwF g  Ka^0niʎ;mu܇pz!  x#Fm   k [ +_ eI,< ] zcyf*Þ#+ 6k &K0#ya V u i s{ ~5} )q_ |/i 7 gOǞheCUj & 1nEXi i s . MMzJznem;Y x pH.YZz3>W]rnj[  J 9,OBl > l"O8sVJ YW8 g rЄ܌[wR1 ~XIe~` 1 y (tX8{|:Z|mO 7  rExv`]plĆĈʛԉZY0 O irB?i u y - RXcpt5f|W/c -\ R-3݌+CʂY!Q(  V _ _m^ 0   y?Z-'Mz IUu ^+.|̓b93̓z$< p !jjc  k U 0PFy4m\u46 " , w5 bر$" $O6dQC% PA]"!Yd Sjl< l=0 >FoSopv͓kN g #|> Z w 9 ^ ? Q BkI3B2U( @$Z O WӚȺŒxaCz   'o5n3   KEK_5MKb_e]` =`|R` fhR-j+֗\mh; d { e JY; ^ @ +  X+^|K~AKt6[1 lx <&'gsCZÉm[@r 4 k j,! -9*L91H!L4 J EQ-zX[v֬T! ? Q7PDM m  I:{?1[q-l #eo (b@c %r \ %l,6 # zD5BXRUa j@ OGTp9@y˔փG|*   }foy  t78bVkqEY d,T [3IN: Fnx8<ıâPO)x  $ C @*s (80;= LFK oS7ZL{ݠYca"Vr i Y h= E e?\/U3L LE MA9*̹tĊФ74D 2  |\D|A)2  ^/ >  T KH qQ^"p˲^ÊPдۥ;o_g4  F ^ _u_C  R\~V^/AGO2 B C ' 7E-̚'τ{tT X  |O0o$*o-  =oM!`Rc0 v17 ><@kvAƳ ӵݶTHm [ B J dsK 3 Kr*Hc!@k 5A u.Ex}%^ƶ8P6 O fFRdH *ln&ro y&4 *.  ;0(:{ˈԝ;3p 2  B [qKrB: G ;9|.G5 .  )7eޗNdHej o   d $6Ir V* p l~$v2 xT7? b@44G>Ӯ޵OO\}+; S y,EVt ` W~}VCnS4 vG0N . 8 @2G!6Ǐ 4,`tc ! / AAUn: u a/?ZZl  T.Y 967LlCɋbL;WT   S F13U0 B \s[fY#~ S * E W*FaK?J Ay4>{ *  c @u E tct  d4) `g)4|d,Aɝ2jINTG O ,<DT~ R!O) )@N tZ C5 B]lK4EՔߣ*_k  +  t | oQ9 'p< O- 0 %=Qi͍CȁOJ޶DJrD/ K  )M\.  vI)A+5D8[} 0 A$Z!ɺnݦ) B-  F y%R29n C  ~  HS~I,HܲQLcD/{ E R cCBaC  ;y0%0qj#[ i F jmVѷY@c!tE  + -XI6:ig GISOX[p F N ` R oObfWB܊d\Ѻٝ]0$]  -,Sy  uO"Bc@M>8u%F`  ( F %nP ζ]б.2Qt4% %D&~3H {b1 57qd8Y D@ V C A x W GDbx=̯bؾv4?<N2 < T6x*pRR 5 !y+\ UY | ~  HFYd׍B̽,ޠig4\0 >6LF /J{OiZN] @ X  K * w yD[u=(͆m2:k( 0 z 3h'M _  ~D Z9{iw : ' | y`9{< Ψ=יGg K zSPPZ Y4hQMLBB = p Y ^ /."ωNmD(ZSC t ~ ('[ by9 (dE; & M X N # XSѿ^΁}ݥLQcMTxa lk[ ^@X,/LOuw6=q#  0  3 m y!S.G(nTHp0"n { /)@ u|9_AB2JqC ? Q k   WSܙT ۭ,ZsSKQO a/F v9hD/+;FkN [ 7   " | @ %onv. & z 19 @5j}H-dG{ Z I U PqD O?vx-3:9( ~o ek # @ ,jQ:&Շ9ҁڐEGZ K Y[&TO# a (O@K N>Kot<  < B $ 7  X@ pv3ش}((Utp  Z Q M j^" /S F;3O:έ+؞PRH=CS > @Ce! =F 59/3OC +l , J '7ԝ܆[\<ifI Hn" L@1wj9 <@>8  A Q p 1CaIC׸߶*0Dt* [> j:r- ]10mH(a =A  P T-  (aٮӧϥљiGC9u ` )e_5l1 KH7vAFHDI' B 7 FA @x4Bտ܅(<  4 Ooj, .#cP@R1]r6}  f  o @ҁ !$~ y8YL # )2)G O/li/<+<h - e r w(x* .$ԮG(؛I)Ry P tW ZN k2+ = m X !nP =a"HJ&Ж[#*1 /  > Z,O J-Q{E()2. %"S  f u  $;ӆ$S@ rD*h; !b4  g "T31VUAGl  > `  k5ۨZќӹ  s y0X qd }j$M V\  <  sc Ӈ: 9L  3KdFD h g S UWߤպP5!  X F  ^v#uXnr2 M  Y q}/pۚցӈՅTDw#xD '  W&iXW  &1"z  ; ; kC؄\$߃`Y  +gU  .4%!z<  pR *Hډ7t*K  = 1v} Ui?F,gg 5  #FWֆMrFk] q B e ^c Tc +}% ,91 r {e Է-m 7c  Y{# uL`#  (   ; C/|Nbޥ%@ e  %= S u [sM-, W i * UhvՈL NRpj hu9  nN"5$bS   : s Ptڀ%0P!FT)_  "/>J  W@x0huP  7 k  nLdؖ MDxh ?/M`Z O %;7 dP6S<-X t  X v%[>B2 B f( xI(N!i& W   B  QQcP`Y ۛ؜ٸS ZmL p ymn _ OY Q 8~  6  | ] |h _ؽ`;\6^ t %B\A  3zIG^\p"  $ #  : XhD "ۓٱT( Q V tSED   F*4O bUt  E  B)7)waCE iL   V |] | Nc@   8 z "{!p' f  T _ 8`& e 4<k|   W {  (0. SkV$Rp P  P8M ?'\ x(O0~+'2#& $ , 5 <:0PW.{ڿ&GEa& h "4 .ltM7C5 b   I a  [ ya~NAސh ۜS CJs   . k bH/($d  7 ! k xi46 2BOA%*]* J 8Ru ` Z ef"> % =  < l wޭ wE12  5 > 6`k  qICLm ]Ii R   nt<K/ޭDM*.:    < T bJP$nq   P wN_;eܣޢg   # !   !7"Pm"0(FK\d t ,O .9ޙQvWd)D2   UV  c bTK!  t&   lM T ݢiG$A{Y et xsZH% ,  f%jޤQ(8Q     7 adHa9 4$P L  c uB@ޣY D?$   8 t EyrI,p x  p >v I=vR"K   y  ( gx)q T~3KF  , _4ߴY:T   /  (J a I  R e H!CdP"(  b  j z +  ^Fy e' Q:" Q V  Yg+; L- q 4  4\#a9"\<"2   r^(H5M,df ~ > .  | .\ F  'F | (<?-r| <  h  z  xkSS 0w&ZVD5 X ob ;, ' *x  h  r p  f :.` ? Z f  3 %\zS fHb2  v C , uo<c%~ W Ru^ - > [<y E(U y H  b 2 E  {. WEqX   dYA 4A* 2 R v ] 0   bB^;5Q?:B[_Bh  4q8 @S6VG   c   <c8!f&2qg lgV|D$oKYB Z E w g  z W Y\ +}z.@zL.2= P zxoc!2u N ' ? - S y32Q09# T:6  P?' =Ry D   ! ~0&h7kKnV| /QC#"zB79{wyv( k n  s   sG /L:.V$  sjq7=- u F + 5 p<q #o$-$n }&{l`y)VgE 9 4 Q M  kbS m em EW_T2~>ACg[i W    0%I@U&Ph\6do6+Y  P X g q;2 1"q 9^ ChJk~$/Qe3iF^?K D    AW 7DlvES5..Ag!2 u  2 u,t&uGsj -51! Ymd\i rhY9<\"MFU6 O   A O7j(!t=TB ~1- 4; `gdy+   v r  gr|1VgW;/?(`?Dr{h"T  7 7  _(Dw$=~H  R]KSW KPP aO~(VPbEy  t IlF P "4GL0"n=Gf  G S 4 H  l~Z1aeO#+~yQoXI05D#$t i  ~6rDD8Q5;_%hN#@Ma>o  U ')RN`]f1_qE^(1l }z2 }9,= ] O  ,Ux! 8y#Y 1) N y)Bay QbHt  1D/ 8K E ['Lb6J@ WQXRXeo P P 1 7<>~hOzh $=<>EYHm_>XEKuVN]+ Bek  W  c": 3[}aswd 3uI; @TKK\ %AevLD.MTbC>)7/O @> Qmlq6J% &(h)+_) ltvl,( z5jr 1;j 7fbJ :O8q{9LBJ  E|+ 7p+\V#E F]IC4 4Vnz W4y  i0 :vR98GJQH  FV|D&K9y 6J3Tu ;T/ "bmVZz/<4[ =L$_)%[  9 kex5O-9El v {x qG T.\dq ;XFZaxQ9Hhe~crmt 6}'kZ{[sI 94Pd Sq?t(FC29cGQU)H=Zpb'^@64V jIdSa2IK=\DTtLn1|<@}m \|_)$I=v]VG(\ @W@8,=0D*UV 0/=HGaec "Suj}k$%~+R dAf *n .hc%h.LDR }09*  / 'T=`RA`M S Qy9 &fLAlL[7:y-l)"`e $BcPW TZ =<} 9 ,UdB9L<t >y n| F (dG Bsk D V@N!x(?3/T ] G \+\t~!b %O8-?,@Iv6OT\4B'"8(@H0ZC1{n55a}  ^{~ J D RIhB P9<g  ,)5'_ t3r5 R *"+&F7M6=qit<8M0% ?|D|4 *;%n-$~@^}k(`N#Y2iZVY0 Y> %"Y%,g"  `F~Ln5$s36!h$l< |@D3FB1/E! %&j ZCir.s2;(Cw>I`" 8 4IZC;bQ hk?h`Rk*"@K^  KC!0)+"*o@z]c4-, &B=?x:;' O t-B{/o qsi   Kd7 LS!  SBw^ N!dpW=m%G@x([dIsYUzBW^"da   e5 4)U)m[6N0{=5(0 tuZ !+4g3 H dRW 1^8XF^2*4,R<O E^2Z;^I P.   H ` l)Q3l4*, 2#* K  \ a  EpJX)?2p'(i4K=c! I ^ :{"  C  '/d+ T+B6 7 % !-"s5  ?dE[J86  ,r(!  C:w+!`(OHS_A;R "%}H"oEQ/U(|=B*a&;, !), ~/  A~0- 9 +E(^ \.#T]?>;   *"q8 3o"1$ +&~0  ?z VPwHdC'[pAcivu v[ COYTmIIgbLRCdRs[**wBxZt c<y Srًۘ[H 7Q < c Q  PXF0  <-]rk H>DM}p]zG)S4x Q"7w w\7:/ ֱ70v n  O 6-LpUiX{PcR@OFfCON C2Z$B)3/ "4w7=q?ˬߝw ><f8 D  ylB-8C4pYnGujDD+,ixEwjWy%DS cB E '  - p u E`:DPwTWAKM<  6 _W 2a7e+?3UQx(>  k e pu?C0KziC`y 4v& j 0 x | @  =7{E@+?*IS:s \ 6ZטͥƐcȦ޵ _.]< b )^}$Z>Q~*{OIFCu;Tz 4 : s @ / >'bG5,Q$M c $^   TG    H Y  glML- Yf#;1#y`?#r$cO * H D , l+Ef@.u:#:4 H.! m0fӟJ 6( 3Xm 6   JF0_9^4I16)r5Vk0Bk2 K 4 H%5G$i0J~6/4< . b 1 ʤ1hl):0[h`0x .|#n*u8*^%q$1Ozqz0!m 6# r *lOjH OC p< p .AiD x=\E K    2\--j#eVU:rz3UB }  i [3Rjf}e  $ R f!!뽩` ! 5fPA l=Sm{"mM  \B4%Dk9D(Q( a X Q -  W/KqHc6U8:- B o GطRݦhE:YdD T [8fgrx}=| Vaoxy x'rA*`i FTd [ _xY>VS U/ON[ ~ O IfL.LIeIqP{ I lRPY8.J}M`LM3}PHY gS PS3 Zi R  [t^&@aqOYfl< { g 2BGmi!juPpw,1qrH  u z &zj-~:}i'~s H{vQwzmrDo ~ 7mkgY_jNw, e  } RvbYuiebǒݝ~wbaG Taj@ _I%geo$`ia=7la 6LUOjcdwc,+WW_ vi$d^ `<`LdO) b v Hv_-mbña币ɂޡdSb`\ D^_9E#\)VZU~_Q&2[Sj\GZui[gXVT S 8 'JT%ԻNU_lL fMvKp  eF?rT |p > G n =m9 !7&YAZ.B'ma%%$I_K !j}W^P  ^ ^=ZrÄw:DN &- *#{ s2[? R R/M1W!} A=D NI   } Z}Pq^Y\!T3>V4, <zUKxQmc ">3)X"E%m  #b>)J+v}9 M 0  ! y 1 A Q2{4 [4)q7p7?mUѳ8I w4\010K% '/z (4!( I "B5z9 3g  ~ u   ) E ~?^xIafJ;U2$ h ZXg< N w FSBx!w$Kf  1("4 !*&*q G3/_38ٽ{lu6U(5 <3H8 67>;/; 7 ) { 8up54+Ky6q / 1  >6cH ] 81j -,Mem.cy- L,O݁H6+Uҷ9 +R8s([h [ w%JV t& O$C.|1:+ ?Z qB{z{gyg pA^? Lop7S#yy ;h?Q) "  9 e/r4n>'lN j@y)  Gv|ry=mX L!ٜb nDN2 "m`qW }  c va.ci vC 8 R2k} H    G}=`oI`3ܷ('lAO j  m C tSNh aB \a ~WPP"N` < uu"#  e(2 9h _^ܠؙYPm`   ko7_3~b  >  f q  ,`A + 5 4k2 ? gyUuj! 2(;ݐ&g I& uJq ( }&w.quIV4Y P :  99MB( m=h  B L=C : v # C$)`BeL@B>Z*<5~9 W21U-"m - bz~) Pf&h<$ ROb\'dK(k O ?;]q  h 8Z j% g)> ?,{% DL p Y+j(/VXW/[>L)qSY{ G 0  ~ M e C  n6-v@Fu%0vc+2    yNq -(1e{()   4 b!.I.L  H NILoudN!=y "]L!peC&_kKiOqpAe IX:!DOfHO%j|% E _qj<r V+- 8 (bA hsX|[? ck+(2t!0qCzH!"={"0&Hh. I v6 8r tC QO7_U ]O! 1w@ S+mHB :qP@n0  C tV K 6r sP?A]* v2nx>TB 4,2I ?b- 9{%hFB5{H!2, 1).~+=-uP;%4- 0,k;  NR} ]22]+-f!$O3XS] UeQX :'&+  Pn:>H#GbE#`6P;e&Q^!9 Ao   ,=([(  x2w: E3E6 %  (%; O   G  F_ ##1+hWVE&!> 0%@~9<Zb=8cSj  H{gw3BZF~ ] v [ ZuY z~p B g r D L 'z; hx222M  !  tp+Lw9 ?e|  { r  =-eq k rO ] ?   oRu2f)+ > J6 &Y^ :9F:s S\ i y  ` a  _,E5ّԆGn\V Qc'<2  " D[ 1O>oX2 ~d n  ~ 4 B >uh8 ٰH8M e&H#- m'\#j5*8g3A v z 4 + D2Df;NT֊>v!= Hk7:; *nO!rM Wjt yB06H9.P`2e79ӬĄFuϫ{S s g o2s!7v"F|T  ^  z y 8p\gĂϜܻ] NoH,gZ? 22&yY-C2  y h g BM6ս)ÆB c jO\ ylt} "w[ SKP&U ( : DWb-z^CŬ3S^ʌ!M8 5=&6 !T / 5?)/ %*y G@W/j{7~нX OW+j [L ix~J r j$ 9 D 6 }d[M Ĉ9@ / =vU>m/I Re1[ `b$|96 ^ I x A^HT>LϛS̿ɲ&+Lik <uX(% 3 %u bmo < dJ&ptt 4  F9[ƽηZ;؞2d Wj=YoF' i X =`~L ?Ti5@{` (.ta+8Ԯ" c o@}.( )?k9F" o NP Qne  Q_JϞH&ELl,^:n P+zv n3  'O5 o=>yTD= R>f *t淼SˈYdID :p;!w! m~z 2 }rqe;Ec~ NI&0 v  119 ȡw.6 "UO5q+f `kjXX MRhl NXM{ĭlXX="Dii &rvz ' U4[7W` +m {@s\@gHלs2< ;0Vrub2 n S3k3|vpC {,z  gAd#KuWqX(-g(  #rF" >V7 um,_!q ;0,# C  PZC< E};bJPݏΥ}ӿt.PY fF 8 6f32$+--}[ 1 qLz@v w7X)Ĥroݟ&RsX c @ n $G?S fDu  vp4 RIy7#8ku fLh D_( }C9D pnO2Xw  4y7R. +'Rՙʺ(ĿEs?&l fZ  5 .%a_SF- 4 mc 56:Vfݺ48z4 , lr t u;7 BVh   c0 Q?6ź#iVsPz"33q ]wI\EH w = T3w^(^^ /%d .twF+\n̵.X' TjP 9"4% ;_G{I^% >(K l:\EחǔO(ȢX i~cv? ^Bz / lm53rfva H|B_ & m".LO!A@#Fw L'lF < G=J/cb7U> Y' M {:dm.߹Br_Y < bc)7 2^\7Zgi gG (I $dsݺ&Wf   d HG %6x_74l Y ^ 4vlsnrP٫]DB5U xnk50! `(\Nld!0@D5 a :% g # J| ;ݳ=ʠ|U>{< Z  O8qd Tf5(8: {6x[k 9 I53-jP/?q pb Mz8s $MYfC,\jWB7 ] \ =ȷ! VC$B|2  1 "7i_I "j@H;B:%1  Cd  ;moA,͍c;T")  x9AzFh EOLuo'v`g&V ,:] 8 MU_ffʱvy )3" 7}l<C (WQ2m H 8M'I . n {HöZu>ZM5m5  - ; YE0qbE r5yKZ_x4-~w W ^= U b  2 C¿j̳32R.(  M R#!+N]&o  0Cg@T.GS)$ %C3o   d^U9QD/4 '  M&G42}u< ~>qB"[^y0${vTu y  Z @ sG񿹴˰pcΏ: ]F0j C,pM36 L:D L3 F`Q yp j y x M[kC8;}@  5p: '&D> dDTo   Y  pBվ^k7hA0i 8.}i0 Nx7[!F-L5 \ x K } [҃b̥8=  ]29 t< :Zr;5wQx a _ 5 NīGg%>BSY= *m;<8d N<h NjdKr6X }N d B عGQ3SȦy# Z 0 '7t  UYw3 {WytlX.c (r J 2 W\:ڸkѳ` /g$,,5 B ?k+r*0 j!=nu4Mm3O%g G )2 ) n Q RIQ۳hB+KR i  lQ3  ZV{ -uXx^z]  E w \ QOQ/٭ݻ-۵z?e 5./, [ LR]! 4.a*DW ` v # G{nWt:. R#:- Q2 U TP c.JHY"RSwb3z % a u M .,IJuIʸ=DK;j3" 2VG*2 /e; )`VKP` ? '  t [   {P/NiɞR2 S@   Gx/ Wn 2AA{z{u.\ A3 C d )(2JV״"[/ ,y:)_.$ s)1<9I\& } z e t =hܿU:żȐn*9`  B,o10Q1 lR]wnv}~Mw=b k N &  ?˽3̶`dE161gk Q-2U27;  C7F ]8ZW5tX  d { a = 2B۸@9,|LO E;n  UUxo%+h  V q 8 Y`GܒC^tFUA uH0?NTG  1Kg e| ! Zpc ; > 8 Xf!ׂI  ^L X?$5L\:p x#x#tZ!a8[L s Cg9  ? 6 5/ВͷƠ587&9 lD(7ZR7 Die*_R re< _ R { / ) /\A \`cVh*7 &M#VGvk ~X;$k+q"R*AE \ $ Zh 8 2 q 4 η&J2nIBN;*  BGwz^e w  t7~`H @ \e   a % fied?d , ]Ah~ 6x  jT^J.N=   3 :5̼˹t<+3oEs >#Zuo p ,54fa&C~n   Qt 7 3 % xAjL9Bè݋?ZkV% l ! fC^{E L$4im|zr  ] R 2׃ȴ5 ީUg%/<@ HNc r(Jh"A BjC|  !U  "ȹKk/~  da" H z8V7*L78d( , . 0  w"6hΊ~Cl\ h!wMkyH TZ *#Q< / 7  U H \xgy}FȄftU\ =IW_- _7eA!.-]~V t {'  4ž^ILd (my#Z] Gl<OF g <<  5 a?ߓzɃpkcYi3l ;"GT3< cOe 5sT6k'b> , [H` P A+aBӭŔ޹v^Wj[ o  u;p| +m$,J a kO  * f6g~MH 7F &)ur" !R(&'s)k'r@ qRL@j  m ʂ@ aw_zl< &`F+ C'o<vfQz{Yyw ) p6Y :>[55ɹz*Nd}W# _}-Kg OSp_*\Vd QS ,vBoȵɺl$9MBQ79O G@;*R)8NT #w\,|\z4a X N5 ^  qYwa1M q ~9WZfp?5<|z(  U 5^ o (ХoM~׬,q4  yfTI= H SrI8/&z++W*+ R (0 >4mZ\Ľ4E"UZi  vUM Y_6[R:pfJA( - % Q %JȒͻmfw~rmU  Uw D %?~A[I=C" K O6 ajʔѽ|F_vZ3[- %xo7Y& B 6)2 t\"qtC 5ciZSl m>w5P/^TnZRT ;!GLGJ OBP^_U[wXlj <lq aݼQ_V٬/>%y  Em=)-N+ Mwoq2~+7 ;h > NL y x7߮Ƌϼ'ʕ-FA&$Ly m**bPw4 4.C-pVrduQoO+2 7>mb ;HD MG+~d9 )o=3@|@ m`,wutOP4Sb[ dPL  8Ap(¼=V> imG<QeHY  ukJaMk=~H +% /PX0rA2 RStbFx| y '=Z_Qm( Cr I 4=k+ >;yZǿD]"NRW & wMfC,;  o~B&=gN *?#{;m Cuf 8AB辑Yrstx s. u cbY2,J 2$:6>nd/ ,.a D x2` S3?H8ɹNxQԁ`hq <DSj7v ? I]*Cb 3_I MYeʜnM&E.mt ~] Q BSK3.P1)SZ^ g\ hn~:ؠv:Ǚ@vy[W4y?} $Yo~]/  _A|+3߿5Ǎ&O ?Qk9L W.(/So'^`r IB@j j}(g Ƙ+hܽx"Br' {>#|nxD ew f6R7?Xyb4r$Z   1 @1Z˹?~O*#[ ! i0a{w{ %fl e@KKdi Sh&4 o'ˊӽow\6E` '0q|I>~ 01lhu/VT  ]8/Y xW`1q8܈z xU gVg/Qe aafnd~]SnnK Q |  x L޻cȴ* ĭA؟F9'm  {`>  z a" ^>0 jYm sqE *pw:JÒkdXb54 c4SG`f^ 9 >+r\Ek/wx% \ x/G  L0%ĩCѧ 2;^ ( "I5o S?Ty fB[1v_? X Zzz N+iv]NJtڃA:}y9~ P?_m ^ J ] FQR-,  W6 r {˦*-m^3cqJw5 ^+r  ~Z~y9kzw` | mz $ 8vl9Ȗޯb1("O :Hzr:00 Sb /=NEK  " B9E  1oOǛ^ćIٕuyQn>/ z xK]} O  Y:Ruv qD a6- O}:JZ"+6|Dj F`T=<2 L):/Sg)kr gP - t#KqֽÓ"f Mpd yz ah{(dzkX ! I<y6~v6_ajh 3 7 W H< I%jX܏$LO OZ!7'7 kA7R'#bm rbt  yfK }nqhͅzUFHn w`_ ug K;65Z -U$   P B : c; t+P̡Q=bNhQ;F o f rf zxkx=dXz F ! }Ov|۫l*7Ɯbj]O;F ~//x t?%o29v G uJ bb $8sN*ڇZgH  TxFe xs1Jl gq\ xRHn vu$ bBP M4´ſ2Cz1 c _  O }7 ( ?jCQEk $pd{Z Tu6]̡~lՀ@~i]y iiu56  j{"'R^64H)#S 3 kSc>pf ȻѬݩgMtx'=Ze}w 5q o( rIȊ)wء1-_v ajOR  RJvB>sv(U#f w e heI1Čm F]v [unm gvf,|~4^S} 3{/* wEL؀hŹ'Öɘh_Y*nFi mfO3yO  iL[_z{ G &g d =1 QPbږC;&njFR } e K[~ #  |&F pvj>+ \[ HYFc3ȡ0(̍dN  s0 3GP2 dY&y"y {jN e3c¢ Z\ b`^_~mg V lu{|5<g>n LQ 3 H;`'ɊԿrkn{ k ;R|i >nd6 YmyR3 nKl % v#b ]_TǢ]_Ƥbsju Q fzHD -iY~Rbj2446!F5u  _W E'Н(2W4nL{ hvw   FWl"&zyhW2)^ TkB_ Ff0fʓÀārׇUr u W{8 Bx O`''wF fn X 6 <וOĞU ɦߢQ eEcg zNt{w 1N6vLt0 ? Q mqܱ]oƯ|۫]CD!Kg*: -qv &T!h(n8q!W!: m# h @sݥѲǝį@dGaZU A\`|R_ KOe9pZ * w14W [ "<%%Kِ*S R  =K!^: 3= ^YVm=lc} | y &snōü8r3-t _|%yQ *qVA^WRJOVF 0    v0nƲǕelF6]- M*fyO [z-~.@srKj^i$  Kvgs Cj#vLɍº)Mrנ9hq } T^t1 )Fz(j_]  $< ,Bִ˨D^Œhs m !b DW"0VscC\ \e{cU +t qCςžȉ|_Vp4%V9 f,9 Iy'qV5hge)J  E)O iZBwϚaj~z܋9}PE  x{   2T n}t\_s37  cPx N OZ{2}w?؂~"8IE  Jn,vI CEaXK\=o>Q Q} Znu%̏ď~n!Lq y x yI~4x)$ ^ iqB4aIzG` T 1g`  UGЋX?4}1Tb JO`yt st M/gHKyb@oW } _pU %tGBFʌ°q>{qp k -,-Zu) G! -rRfb.  4 e -m̎Fqӿ߮F[}x   V n7~{ n o}>| HtQ 0 ? zy]R oܯb$¼Ƨ0%L n7 `o&!} u3+!uV92 ^J1 \ԈjY؏tL( y t umt p $&Zi>k[[/H7[ $ P}u( < LZ$ϼd'ȅށ nlgR V iM=E)L ?:OP#7X]H g bB (dQ%mgVOΟi]O`R E BF > 00;A7I K(* CzK  4QR̗QFC5`]] e o ~W# : w0 wAsGtG Z ]GyGF 9 ېuC/Mǖ%geULR qx=:{ &? n  1, ca>)TdޠɴL+Ƌ٬C7\^ _ u0WXd h  d"2^0U?V6 HvTOP 7Re"BũI6+c u  J 93 J+2.KIDX_IRB  \mJ f]fϚ}c0hb 23[:q  M}c(:;0%?;  TI, Z̧]bG,:+d^ 6!BM( l N'm>V_5V ZF Qc%۶KȚȹe=_S# 7 >%^| W/  M$^ GJ2CQ;TFDD Hb>K@ . tH?hA6:6aO 0~l "yKqǿʔ2] & e*~% c8/d06 ?I &D'B "J{ނZDškοB H[7 v-P5Y jYz!e  Eo+ ?!M.>+Ƕ8řxk/)Lb! TSXSG  t_~^ 3_zN X`pn9 M.ۧBeGѼ`2*n! "u-Cr a G28*$/f $<Z H$I}T'QĘ/Ϗ٬2VN-2P \ "1Xl) U1L4A3D- f 3~$m '}е4=J(xik RSK$ }S-:vM:=5.@8 HH Nu7!KĚZϴQLjF yf8?%W |4B !u ]\ W0IKű$L` /d/r~7) q]:*A;A\D824>e< ==E $9{/vq0ѧܷ5%? qk  j  TrQ8}C~%  z/f @= =q0D8ȋϱٽLJI [ G pI# G(Z E!'A!8:_G C *d :GdJEVj {V te&, r50:AJJPz /uRH J.X<Zܒ9X Őѭܞ$VU*6M /(4G3x=5 m:"$Wm.i/l5%b Zk:   1;ǒθثL%- b 3`MJ=GO M D_HlJ> I ZCsmjI8<&}K,k OS g {DrZ'r6 "j 43V PKB$˼Jpڸ8PN T MV! @ S.LKH B2 7V,v J +_mj!ϺR˙ @/'"L  jj<x *iW4npAgC I! dFG2iңJƆ`ԲޅeJx G A @4 " 4'uc,&c1Z  bWT  ]ͣ?):({|& ^ 5j@7>a r  IH@Ij3J^E8 ^47y]( ^O M ) #  z_ƙɮ!B ,yb+7 A b*Cek9FJ\0H IA5#  FvWBygֳ\<s+) K -6d"| zQ7<LH4DdO < .+PH8D6Q=:;>Y G~RH5 0 nK\FE~vjB3  ;9r] .!#uu~C ~#]   {2Rk-~6:P ? O Da[1N ƮԷjZKmnc G 4%BW'A q=7vI3||(p J(/.2 pW̿Ƈ ɮC %pW7+5 T<9YV;qtCO W *=^[ /;zS.`*hלZ-lZ4 & ?<$ No6Vj% ~5 D]LOg.߰8WPo `_r\# / `eo3^t`SL P^m OCMߐ7\W*UY(V q~ 9< n /s4NXL'  /G 3-L3ǭjc:k|` 3 $(37n 'g!j!7< 8  X5(9  ̆ljʜњO78$@Z -S6?f ,P?z+C~FAZj1AE ` .6?JM B:l2H5ƨǙրJ(4Gp+ s#Y# ej) -iT<Ot^  e't  p?Q.&Ej7Q%A;r CTBIF d 6.DpA>tnk7 1" &k#z~дkO "  am<8 >D%Hz8w11 \: L =Ip`Cf YA=L?4.-~ #<G  27шʛ'ׇh 8 (>\ f 'cS,5.EH3. 4jE ~ 7iSԣ3ȋ̤^, ) XK" Qi x<  #9o[I ?&6)L/Jl|;u C~P'I) nJ<Iv/H }!wF  w LJ@3A @6 ܓ1 :# A\  ZiP 3 <zzqU8 G% T,bRמ3Xє>5]KCV 2 p;.C t 7+L2B  #I%+ 8~̢ȳiZN , %24 ,"B vE02nF8K5(h7Ba. ] =U@b,?9 o?7e5QY5:-) =8)h%rE} 4 *Wqw(}eV W N  3V } k҂˧'qլqT."  5gB[O4\9 ^3!J51 ^7)TD a@#xn p8RP?sɯSWڱ`-N+ / k8^" !wuR&0%n&7 n-7 31Ҹ+7η$WGP  m g ?   .qov lw i' F1֬S@_h J!_:S Of<y1Q$ T%5TsMeS,  htJymx =C(9)ȁ-T  ~:"|\ >  m1iUyO $;; W?0ߢ֐W.ȕҋ0M0 1Y/T( }./(s ] r s3ђQ R" 6 Y[F"B *Pf/ ,5  + 2(; "[Iy mq :5 q 5 Mu%I 0J{ z< *AUnWRO B   ~Ӧ̻Yw1"#" ^<s^!5 + /d6_IL m9~NI )e, !Ϸ]U<i* bY )`c02 $ G);EYd?fkFn iF ?yH@m|ҍGnΗ~A  6 H/Y  'm!pvfY $JY :!K\9q̔ZݵG*[ 0nW|%3  T_9 67[8 0 'x"̞kɃ2=o 4 <7A'  RQrW@+  0$: {|8"fxՔA(Ӝ(@H. ?_u<mG j9q/>GZ&83 a 0 K FrWeѹ{ Жo<  #heA0W =v8AQ7T)N< q;L` TIEo+?Fymp@ FO_]Ea4 aC1S!;0i8 N>,.P $"PQ 2 qE ^ Y  y9WH  Lm%iQ@- 93I 6ڂ2ɗ'|q0h` ( *Q I %.lgm''_ 8 6  Y .+"+WN5Ԟbqh@~ HE %hL, JTP_ZLcX2 | xVT ? |J#N6A_ˮ$r89.0 7)Jn!n# O * \&j`|>& ] y! z" ծ]-K*SGa" 1a`=73 0>xO&oK  ^ 3e {  q1bˀ ڢ_N !APJ,J 4s c]= 5d2o(.)N ! LNgC^b$S- Y "6[j *nI/N=)[%4+ G7g g530Ϳܛ~v,p haa  OzJu8 iYk I- =.{|~6nF*C94I KuQJW$ oXLg m56"4`(1kը߄ e8 )7|d  Jx$a^D( \7{g _Q:A#Ϩ7?Ӑܿ -?T " @ Ek7<c 4KUne,2% ]` cm1|\ R5T6Qp  Y! i'ra([+ *-# @ (h V*ˤXI!! OK,c jS : 8a#(["  y sx|SbӲ`!C j- /Z/sw1+ -B+C' ~ \"q f fjbOEI<\  )=' -_ud!PEHE(%  o#*& uK4p)4д^D4L: / {}D'; &MmJGt P l V7a Ϙ  lkY S ./Ea@/!i  ٿ5Hڮg { F/4 "Oj.nT/7 86< >H>Ϯ@brAUHe1 :;}s5]+ ++?Q iZ k = P ,@ .TL((! K25@E4  "?.Cw@H MkJ ~VFy> GDwv;B*+wR<|1 #%  :Zr B 5+LL V <{  Q(=`?̦"Y(5h M .P~w-4 60+T81W)>.  UM%SZ H.pܠα\}Q y r zTs  j'o{h)qu7 ) |7;y M-?szB@& ܽC& < bl;nF 3g .HCG0   |F}9 Ԣ/˧У  IJ 39\ (i  2_u`W4ef9;$ b 7=. 2zy2ʴ iCR(z s:U# F  !Ohe. l\'}R L  I>w jl#/)LRٴd:0G  0*w3A 1W //{ph$m yF{g0 <t8 !>,ubk  :Qr.Y &)%e118{d  H;/ @ s?niXB;>?q<g  3 P'I06 ^?u H#;$+f9I>UT7? / K)%  2fvW L;E VkVX p Qy ϰY%mּj+B 4 d7\+_> EakG F$ b BB+ v>{$3ec,?uY! -63 c-   c6sAWR6 K D  L6 XC֐6wא \g^ !F%p% ( (,[k3Kid  ; ># }eҒ͍xT۷2"cSr &)kmnHp0 -7'x9.};  ml: E5,3˻4+#T2 # `jE-l% I  -sr ,"'q'  >t & +uD*z3j>'kHn P Gk;E Gjj?88 ~ '5 -&pr!˙6-iKT5 '. e $Kn7#%R1 8# T::cR_<E# ; 4%Z5 D ,2kiK&mZ R|, g SJL ̡ yؚ gd s  bk+$  24+:vw1G3AE/0  E*sN E)?X+ʣtTV" y ]3mQ7 E~V]#*Y 5 ( ! p 2ي,BNi' K+pY? O ? p F 3 xM 1˸`j-a] He'pFr. E5bpg]:T]A.  fuA1 >܆AB:<<$6%@T. 4 zWO* !$^JUM+ sP 'L < JQ! ϴՔ"9%(q`  [0!4% '=9%FV?I9p_5T5 M 4 ,P["~*sZ 9Fb   2h] V O6y %ler(̹ϟւ."}P #Q*{j%( % /:bNTI 7 y/ Js- CӈEhn9l1* : ]"},' 4*moKD-''/ &*' ;+$˯Y]qA  2  6 ,I)O(J A r1 N#9`-ٍҕD%ԏJ^hO B L LE L&KcpG a =  10~J[$̺JK:8n +r F  0t[ukH! (1 A R7ta ::A[*b@t3S>` ? t@m8:  4j-P44#V O k }ֺ\̸cؓ[b  WXC>  6Fg8 OVD8wػhzI  ^ } v,zOZ#Hh.H 9  w3  =Է·Cн5eE='f: D0A5 s>zwF8i, ,;6w _]]2qߘͷ>{IFO H+; [  9*C|eD"4dLqT  p/R UBT{4}UܩTD-F O KsI  <YQmd2>&  o4 % (!k1yrG62 n NZ!7P -^S(ybY)vcp0% } 2+  >*n! ̫T [l" /\5t {9 r i! )skЊ-̚,ֿA6vg 4V+[M6_: 3 $u1_+4-Q r(\ 5OH#Eт̉ˀԷA   !  bub(~. M WO3 H/N2'50-WM2%m` , ys+" !j;l8GM` ^   1ϟ'L Z  @& (2(F[57(P'~ _&K 4 U21cG۷ΚC|QB  M: K 7>a )fb #  , p`0.x';_Շ4m:>&  :~|J6l 2!i)m+$[ Y4 Q +V .u 7 (9 2an`=6)9qE= ] : 0%?R pBb{3ANˉ) K>Tme8 8 M -: #}Hk  *97/d{ --` Z/J.C6 I &]{  A:(K g }[ W {[ aoE) 't^ueG&./ H <6 j@j_zX@%2۽A-@6 ; o@d#9  Q,3j3v)f &  urL>^ ^  c 8օF| c] " N(p/ ?97RR=J>mfAH( U BW1 q=5A:͹4G3 ,68;*) &7$ <`{M &}oE  Gn-Q {qԗ\c;&?NC  *U;z)x  $-(/b%l&"t *RBt [oRբ( @ X| D3zt1 P @8(:kQ2*5 S8 sV=bֶ"\  G  0' AEv,'J # S g~,|m X fw6.v?]Uڦ[ME@ / JHE  G"Elh;) O 0Vc 7) Mͦ' [ 2X %HilM5 0#DZv'962 z `;# =vOԥC$J?(=< 8 d8n-7 ,k1p$2:h  \5.u sOєK;o 0&1;:* ,chA=.!A1 O, J'] &ΤSb>|I jn  ;Pm=,o0(d ` & af3- bX6)_(>2^p=xt  @=$=  ,8P}]1Oe/, %E S4$̩Pp<k p j$ KRhF sS  's JoX֓6! ~UV   y6 D:` @em0# H`) [~2m.:+e={N <A8-;B h@x  w<|)0Zh)/ {f 6dp4fЬ͈bD75p )xi!B^  3.3Hy\O6 :$  O5=yJ ^<=5ٖ:6>1c~ . b+m'M) S_B !,%e1 B2 S $7 a2Wڳ,+;&)O9 : e   K<}W $'[ l F OQm  #e~Ѣ,7-1[.5` 947H 2;97A[/ )4ZI4 U$g:Qz։Up ^ jI? *sTvWe" h 3%R 5'^ *<'s & M,2  fh/v3:@ C <  N 6$S]ҡΒҞH}Jx$ < %?J%+# A34r30/ l 8- r#+}S>="V9yVD _ H<^ 3  [\\y<v]g J ",Q [B)8J߂VҖ*_ѣF0=< /U6gy1 ,Iy'x ` @ o lGqo'<ջܹo D F K  R&3y%aX o*5 0 >)V C'VU&AyX  3   11Hd B2v w " hڈ8%ѯ֐l&2@8  -SW2Ns  )-.F|^J&.#S[* <O 2  өyϾo$f-w { xt = j $` >sA"1{'- .&( g+i^ۑ*ϡOmFK$ i # t"x3 p6`o]; [ eu k=TG Za(i, _ o2,5 -=$w; :F 8 Rs5W\, .5 }-bވa 8x ( ! a z2XS& ~ 56_` beU&;+ЕԾM/O \ /dP - ^ ,z"k7$*9e$x S\ u dM1 4UЫZߏgFvv  = B * T 4zny;"P#X[ 0 f# k%=ߝ64ТK/X  y   * lL2,BZn_I MJ8@  _k*۟'r10ְ\U2uh  Y5k#6 0<IQ;#!B5 Y ,- ] -,"ϬLTd, ^ o  { 5 { 2VHA ue] l U9n  5j`Ԋre"(  `CuVi tF]' Gw\ B e }-MP#֜ܝz@[= ~ zfJnn!$ 7 ms)L"JB?% h %\v r  meWg#PUD  UjZ*  6jVY  +}?+ *(n| }3 '[ݠױL!Gm?"2 G S !-b # i  j8)p s % d GG[~Їىi - )-%   \v$nzZE&5z, j *+| |'U ZU*Ѥdׁ#Gb  :R3 4e fL kYb 8 V1 d {`2ٮ');/-4L ?+ui1 40 V18p1ck6 Y 3(atB &$D ܆Ҕt҇Qc$E? & "  .|qx?O%b A _*` i2s߹5ҡۜ(4%c v 9LH8I V2K)*z'' H $  G3xl! UrѻOo.c  b\ 3QafH).  - CX&Z #lFy'ҼQ"#v  9+ ( oW0 z%T G{ I! 8$fXٰyAY$T C Y )+[ m ${-Zira*xy+  j 0&v )!qѓy \c3 2 #Xm   6w}0  -U ) ^%r ~)J!NG&HۻG@{, I + 'Td W'?Rpye P  G+&׻ ҁ 6 T M W~sOD#M { ]'7c. 3:. s 3: Q1z.6]=A*;v (   x'd+.&  d$  @0մ|A/ i\G ^ o o80xq ? J ;  ߲ձTz@Qf  qk  # :|I,7tE-!.dVU* f ^) 5".cچl/(ڕ]p4 I * 2f+~ A$P@"dls  A7.Uӹ١f3-w  [JaY$ V 50)cnhT*#+fe2 K 1! 3)F.ԯV/oo#, [ Q\g$m  E]t"O D {13jׂ?- 'K$ : }9  ;0r_8ad 3 S QXh v`] ֠GA$Nf   V[5 A cz3$D? *dcdU<  Os  VbӃյh&!Gx^A  dFrVu b14O - %% C > G V y"k٫՗^GwF?u #]Deg( 6 N ~Q|'IqP(5 &w^   ""stݭӧ8m hzQ   /3z9v`ZJt" { ,{ 3EpqYj8* : G D{7m> >/Ku'g817iy09| J w2;  ]+C"v!6 zH 1 zd+tg0<. 4'H bxߋ٭[ Y*jL  o ;e\9w ;_O^  G ??6FP3a A : P _G  p0_3k    / a>iԎ<j    F5<6Fj^z   D > yV\3,ٓރGd!8v` H # 7@!h >i,N(gQ /A "CR(ڭփ66Z@) jb o# L= craS6 l \ i 15?W3  .ir 54 IKg$;!/    .])Sgy8=. z %%N k Dc&$jk2# % Y ^8 G-o. 7W9 %a  @Z   0yF<1~D$v Y p" ^ x&Mى)o,ݢ'86 ' SD( V#D"7rE&2' u   X?a x֙xT{ F p.t   t1 "m!a=$  :  {݁ևm C  !TE 8OIJ 6  0_Aܶ#؉VkBp  mnt|d GWgrGJhW Z  sP a`;)ٍ׈!߈U+.y }x  g B_8%!=vk&)pM)8 ].  S4l 3ذم+tT2cRp` . $X, -d(S *1a g j s` V   =i/DadT+4p s WG ? b F-J`8DIjM 0 3b  ~Bs6DY.K m W XjP*: &6 n izٖ:NO Fu  bdC ] Z4q.}8^U U g X \ J)XrMْ( ެQ#s _B ] gW  # 7wX3$ic5C  v  T !aEM?P  bk E NgA^o>|  E oL $V R ߃ۅُۊzX[ 8G ` v MAmX  2  O ll8Dipd j ab  ZIY"9-x;+   d >z_n۹ڳT`,l[ *u r  H'  ,) 8M @J p x 3  +BG,Gڟlk&V]  ,A= . m 6b32Ah-*L% E n . 7 6r' xyt%OSW X v  h ARFU~WL   n ]  wv ?߂ܕڵ qAJ^:Wfw  H2  r LmG^oI8 JW    gz "/Pg z  % WR N=)! 5  [nZO%:Z' se  c g$/  9? $uf8 >|A a R  S  ,LlRm߉ܱ4A  j r 1  ; fb[u;5D   D -jF@܈ޡ8(e ; c K y  +t!f Y<G y / C  g @(#߆ܽݡL!(}J "  Xg % [M1"&: cxCG#- $    mX4 Y_'ޮ8 ]   u Vh1g R0 {- $ A H d ")cޑߌK6v G l T ~ ;H^U l '  L |$ ;N,,I(AO@n  I %7S  mF C}?5zM   # 2YX-JoQJnk  - o s xQ 2T~:%M# 4 ` ~  sg3@N f5'' R ( @ 4 po  ' @B|zitZ o   ?:T! 5f   s = P  ]4fxB8!3    c 4 edAzS^K h J %S A  C491;^fv P  SipajsOa,z 4 "  :  , J ? %|^5 5 + RZ8B7H    ~IsRR20n"f F  \ I uMNn 3W ; E . n  >  >G?^noMl  V V 3FpP`+} 1#y a     /t 2> 9a - g["(-T _ 4 5  / \ ~ V  [D .+N & B F 5 V iu 8q C l Q H A  Xi2s!Qu# ,$ fw-]ft }g  w  Re_j< 22}F U b 8 <PL~,7$V= [ i  N ` D  opitk    no >!g[U1AI38  @ ^ L a vNU(p Ff59(64\=ICs9^dp *-  $ 4 ;J3sm".*w[+BIwQkPE : U < | F Q# j6 ' S91" }o a_rui"e6WYYB`OZjEeC jZcpa :pNK))~ a%%dg4i of n]WP"Dz2 "1' /KCF. 1) q0XT F#9n*h y $Vef]ka+iio<" 42v$w9V9 I C0+aPN 'R )Of` i\D :Td( #F AzVbk$w u7J.hg+u d>E 2-e P H}6[CT7]"4j: c }OzcAbr(#B7Y SDk8)oX5 gKl^ IdI Dfc,;- Yo j] /e^` Vdw6K9S<*YH QVNPHvrEQ+e +W r^lE /s ,2%j}Jo]B^11Sfls&cVx-OQR lh@'ICK"jHujhj mlf jTzc c vR ]c /sYiN`64 {-S? t< =8YF-?9$]`"Kw{* >^{hcK \XEV3V\JC9KP#i'FF}d[/UHO~inf  5$~#Kde*bcfljl2fur rmM&S@&_  R#eQ+[y  =N M$j i q} *&/odY&H0:)bs)_MYy0  ^ krkf DP $_=y _W Pn 4l1e 2 f ,YbCX H#$jJFw|~hDA%!EH  k]XHQLVirkzMHH#yvle,8z?0A*q4l`TSl2f OG&Qb/[B'sSCV1w; P&^ }i~p6`0"-d1/YimT#w` aw.6nPg;aTjv  XQ) _3;z -(.nxsqk`2 \Y vr-  0)   cyv; Fok) 61 !Zh#  [O" ofZ Gd1: PeT L E,^ ib%R?   ^J  (6&g$ 52B} \.kV!P_$ ~8dS'U;p~1?)    L ) -+ |/ 'L >h. ,~ X8 *, $4$p2 <  gN&fP2qS   ;*7(o6  ^H ju^;u!3#,(3 0 z7  Z^$*cO/gV  <  O%6%*I8U o$ IT?LJbHR 0"w.!:1jL   $, o=  #,t5A +f'3/  #! 9",#y5*eM  0v;   "+q6 >  (c';'  ,&w2 AOY   %<   KQ1t'(  -x:  %%u7E 5d2- L" A[ :u&    9 3+gS7K-M   %6    A ~B          B  G      (l9E1k/  *p5B3p,  -m5D3m-  .l/H4l+      H  A      @  G       'n9C1m.  4n,D2o/  ;gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/sounds/bounce.wav000066400000000000000000010451361326020644600262220ustar00rootroot00000000000000RIFFVJWAVEfmt "VXdataJ            #17LSckq{/Rd)G\bv  v9@rw!$XT92 5+@4iY(yl}iwbq}B2m^%PHyq dcZ[ Y\  -=bs3Sfz.,  ft8Cs{tx"I?z!bT%zwfTD5# dR^KP>M<`Pk^J@yKJ{{cgiq$-  # I W q  - e t Z h    ` k r |  7;FEjh97,(1,  J@1'OCMB(zodZe[OF_W92KD ga,(;9VT|zQQPPz{  n t  ! o u 3;(. k p  "  % u { SXSW>B}33 ]\fdMK20TRecGD@={y75SQ QP-,a`onSS YY | | L L  ZZaa))==22:;mm   FG^^uu55>>))..00<>ssAA__ Q Q wwaaaa??  iiddOO % % BBqq  $$%%55uujjXX??BBssQQffCCdd55gg ^^ nn1188++ww ;;YYBB xx''nnccee,,kkNN  ;;   7 7 n n   Z Z g g W W ??ttAAVV}}66hhkk~~JJmmeeJJrrMM bbYY  ,, 66GGll;;ii~ ~ " " w w a a   & & I I 22''ss>>3366>>..##JJ}}66IIvvww--RRpp {{ nn++99RR22YYV V   ^^WWBBcch h   rr>>6611VV>>""TT)) ~~iiRRPP==~~  !!dd}}vv  [[RR''77 = = xxZZyy??HHhhޟޥݥeeDD--00**// ((UU;;66   55ww33>>++  jjI I r!r!""(#(#1"1"- - AA//**..11kk " " 22XXrrqqSSeekkNN~~55 ((ދߋ%%;;//""gg99 vvOO 88bb55HH !!""##5"5"c c ++  55CC,,kks s   ``gg!!ee99}}iimmZZ//ߵ >>~~nn..AAZZBBtt@@ 33&&r r c!c!!! ! !==77[[99JJ??00>>b b u u    LL}}]]HHޭ^^ 33{{ &&DDDD11@@BB##ffKK11wwii aahh !!^ ^ ZZjjddBByyaa; ; 4 4 EEZZpp++ ߕ߯߯kkPPIILLppVV/.  FEWVdc54 !! dcGEusFCTP-'d^rjE>: 0 l b yn#%g[F:.#`X߽:284omKQOW%9m)@Vq%@.n; ; y{Jb!!5!T"d"""""C!M!DF# g^~rn_( pU[;1   V 4 m.; 2Z+Va: y E޷W3ܼ5& S@ޢ>6 FIy(7,5L6 0V!OPJ~(_.U> 1 &!4B< !I""""&#[# $:$$$e%%%%$$t##%"C" p(2CJliMEyh=' a5Q ! F  s92]Qt-x13|\;ەSCLx>-٦ٳمݠyW[=*MDUQ^_A^^%L=h -7v5o A UDn%5h"";%%o&&&'&%'o''(K((((#)]((3'q'%&&$Z$!!wKq:\IZ)5QQur Y !NyE yBr_؟2փ6Ot*e'ՐվZܮ;hn +1 .z=VE e ] < @#l#&&))W))***\*]**,+^++,w,,,,H,{,+2+))~''$$"" &TO{'x  "El. L  HZ"1%1$ khRK|r+gUӸ<" ҦҷҏҢvFӿԌ<+ܬk*ߐKrGSi<@3,x--}EJ m 3 G  S!p O ##&&)),,,,"-(---V.k.*/F/////P//,.c.f,,;**''b%%a##N!! g  } M /((o`o =F b'hobڌOf SW/ Э~Rc!Cб^ԁԷS1ݾ'ޯ݂Uߌy9@^$GD|4x\hv N e'q"B"%%((++d-c-^.h...}//o00s111;21 2110T1N//)--*%+v((& '$d%#$##";#|"#!" I%" e O Y6o'R_=>I?pZ҄b8 6ͭ͋Ő+̴L~&ϯγ6>ӻFՉڍavSn_Uߨ(x%]#kI ` |(,!-!i$u$(%(++{../#0 1M11/22/34c4>5556Z55X55a553X4k11.k/,-*++)*(Q)'\(j''''&-'$$!8"LL,x O0 i q @E]Mގޯ~ُT֤`ԘKowͤ{lVyYɜrC?ͽ<ϼw~Ӷ=SbWbc٫߽۟޻Z=qjJL h ~ Kk-W1r 1$u$o''*E+./t112^3844w55'778<9;:::R;:V;:4;:,;m99:774.5V22110l0.+/--,-++K**''$$*!H!L < o]3f ޿ ٺX+1Ώ/Y ɧǩƇ"l6´#+ěƀȆ..#<ҟӮ՛״ףڞ'*7Am< OVj |%%(8),N,>//2<35*677889::;;<<=====E=T<<~;;99674522X1t1\0s0 /1/--,,++ **('%x%"|"}d 6 l=~GbOՎW͸d/̊YCźŜxmKýžt``Pvi&}{ψЊнНѥҞԬ!3\p޼c|!'D s#Ai!!%%D(](**D*+,W.m.$18134 66w77!9/9x::;;;;;;;;V;Y;: :384855P3N3x1v100//%.!.x,s,X*T*('%%""' # \Yed~}*)ad.4%BJҧЮw"*_e&,SYƷźšţ(&.)PH̄zΓЈWIkZӥӑL6Զa~^ +~]tE  | U $#&&((+*E---/ /003 3445555555555x5555G5h5b3300...9.-.f...h//.9/,"-**''$% 4! j^*y i 8wXC)ZPtݞۼۂژځׁِՂҾЯβjB̩̽̆ʎʾɖ ˫yφsѧзF2ѿЍH1ٿܬ:'k dj S TdA=.)$!!""$#$%&(0),,00g44|66675T6|55W666#75>6453?4394V33232M31d20x1/l0b..C,,P))%'&"# ;"td $r\۴fy^Ҟ0љ3β͊ }YȹfFQƩwřkƔG2b3ĉ$Ǥfg̻Zu!ch,T&tT"/ 1\}GV! "t$$'{(+@,e/02E355977O9::;<=?;@DAAFBBCD"EEbE FDWECLDBCwBBA8BAAABAVA<<445,,&&8 A '"N:^H  #Lpm@XUٛLћж͢Kƌ'"ȵ i뱇ױ˲"hƱްF=I.ų^ÄsƑʐScЗֵ֥TF:fk:!!'M(.. 449:(??BpCEFcH!IcKLNMO$RRUZVuYZ\\"ZZUdVMQQNNBLL'KyKJKuJJII@GVGCC??:x:54`.+.V''t ! pV a-SRآѤ1z`ѹa;ݫEЬDխR[Vѫ)y[^6bŘ^=֑<)|i[  zcm#0$q+,W33:;.BBF=GGNHCGGF6GHPIKLVOOQRS7TnUUUVT3UCSSQQ P3PMM}JJmFpFAAl>U>;;7h721++%W%w  _ ZZQObajjռ-_t͑ ʅ߽a{ TYfδMaֶŶc\ wԣTٽOUYh:1k 0 f Ngh!)"(t(H--T114y4+667P8k::=b=>$?B@{@ALAfAA@@&??? < yKٝ۵gۃ۾\ف-VIQd  6KS2 y ""R%%((*<+.T.2Y25 68+9J;|;">N>y@@0ASAeAAB(BCDEEFFEEDD@@:s:43,,4& &) T ( PP2}+>;#6Ҙ0̿^ڿlZc)/wz$h_rTͧoC緅sw–}ƅ>qFF`NNTTVqW~X Y[[]^[`a`Waabdqe~f6gefBcc"aa^s_\L]Y8Z-VVRSN_OdI JoCDz=lĮBɇc+ҁ[NGpH H m!f!U%%**b0H04477BD?f:#;7|8,5501-++1%%jv ' PzrS CMK YM؋سΙɮFLyd3 ؿK~0aϽilMÓX3͵Ӛ)o1u#gSc(u_4N _  h$:##"##$V$T&&0(p(''&<&##_ m mnmaP _ =Glr^%4GJT`+߈pRح@X2ϕ΄,̜okĤ+Wm{5ɱɩ{ и֣֮ۥ:> ;;?e@E=FKKDMMNNgOOdPPO2PN{NKHL.IICFFqBB%>i>96:66}5545^2f2,,%%j  {>ް-ٕ դ@?æ%Jհ3?7VdSgӦ ~u 3FׯcͯqRh#OBÖtʏz*G%6i8w] b"(""3**y33%==DEJJNBOR4SQVVXqYZ[T\\\?]G\\k[ \\\\]z]^^,_F__]x^Z[UVfOOIIC(D8==66j//2'W'&=ONYw:w/ݕAԂ%qkF̺bfݰխEyʩ1GH:]_t4;,Ræqhm|ȱͣډڙg&  p$$++1#26B7 >4994<5U//'G(ra@r$L*#&$7(ћUͮ]7÷R>еueެmlIQ{ۭBiƲMKӾ5b/ʂMϾ;%ߪ]dih z1- X&y&,-,1166:+;=l=> ?C@@BBB+CBcCBhC,BB8@@4>><=%<<:$;|67911,D-()$+% !F^jyW ] 4 ^_6aoifGܽ{8؊;|ֹա5><<5::p7K7"43/l/*y*>%$M b  eBJfaOX׸foTƺź$mph8[|'ҧĨۨ -n_νIkkșȗ͖/ z t|f|^co )!Y&&a,-2x3\99M@@G^HO.P VVKZZ\]^^_`aabsc-eeg,hWiiyiigHhree}aa]]SYqYFTVT OOII&CC<}aj, !!((S.c.2296b689KD>{jܿo#p՜9է7Ӟ"*̥IɹȑŅ»š@,oM8sG؅zݺS_Vh& T/ B(/($1%199??C-DF1GXIIKPLOPTPUZZ]H^n^6_]^Z[VWRSNO[JZKDEF=L>56W0[1I+J,%& !_=o D߹'kճ@pκ@>Ż͵S֮멮֟ 5C]~֢G(gAѥX&oh ܻöȭǜ΀͠֐aoLO Pb""s*V*0044H666#7Y::@uAH"IrP,QVW.Z[YZXY0XLYXYZ[]M^v^_]^K[\XZVX/TnUQRRL"NaGH@B9:23T-).m(,)5##h^ @$ -Iߜ+٩ yŏԻ^w"('D)K%EY Ry8z:Ȗ_.! Ǣԡ)I{L0k м[? :>c~<((283;w<6CDIJ_PQQWX^_efklpqustrs#q?r;qSrrs tu0t-usrtpp!llVij"ffalbu[[S7TJKAB9 :A2X2))q5Y kӺn°ͷɰڨ6V֐󏁍-PÉ{:=pͦVx!fe̤,559$W z4 ()).a/4*5 <<DDpKL~QRVxWoZ [g\]^/__2`^h_6]]"[[ZYYyVVSJTWOO}HH@;Ao;;66(1_1,,&&WW ?9 sK?C߼u%>тѽi̥˦`͐A%яJϻ\%ؽش݉e=ynWQQ47 ' 2   @ P 8 I Z k } . =  FRlsii^ZLF!g_}PP ! &  " :Di}LeKh>Z1Q  A7 Z  v  Rsbq3Mn|fmUXi_^BHp&p<`)%\(nERIj=o=F[<AA-;=X 4ePg ;nc&vR "".$$m&&*s*-[.6113'45^67$8r88887U8E889 :92:673 4p221100./L,b,|''!!&!):"x W yG^o-*_o6IВ(x- -šK͠Rtq1LQN?󣵪qUo;ȫ6-ٖ  P*1+4"5:;e@@HI:RR+\\Mddk~lrcs9xx{n|~~~z]{_vv-qqOjjaEbWWLMfAA_66++ TcW [ 4P45帀'={u 3Հd  O'ǔB%ġL7Ʃ,Ʋ彉R}ߊ5 +$=$-.66??H2IHQQXtXk]](bb ff~ijk4lmmnop%q oomnn&ommhi^bb[[T.UOOJJMDD=Y>77/0((![!}7-()+@wD*-e9ô%0dٲAbXIJ"tӴE% o4ɟX̐b ՐOu'jQaU!5!W)4)1h199@?DDIINNSSWW|Z^Z[[[[ZZXWAS+SOOfNTNML=L KJPHCHB~B{8r8 --##d`RR46#PUaf`f򳓬Ħ@E-2eijlXX98|yȲIJc[G?of˾Բ2&(hWw f ('--;1+1+55::\@O@FEJJMMMMKKJJJJBKHK3K>y44**- $  k=8oOچQ͉|9Nͬ5uݨIauTĪ>٪U+ذcWQÀ7X^1ܭkh> t r> `%%)W*T..23q44-44q4 5O779`::r;:;9:6w7223..Z**5&&"j# Vs<vd ,:eGtYxވ%m^[?ڵc9e/dN ?6BU4 kCp4 <H,M]l{BJULw y  h 7 f33c^~ u# VyxX5L{$S"I^nQKIH~qpeu| mNT(oMHUOg+ )% p Er>PH""%%&&'&'2&&%%$m$##":#!!Woa3@  {H3gnfd}t>Ī@û,﹌X(v*t&i`5ΧcI5B*Dz ( )061688>4?DHEJSKMPPUaVl[[_-`a&bbacbdde:ffgsffdd@``Z[SsSKvKDnD==7700((:bA P iԵԀF̪eIJbT±_1H֝]nדR 7P—q(ltTԥޫb,Mp ρϜI}^?r  _[((22;">{9934,9-U%%KQG y(ޠ4ѫh.΢]0ʗ?9ʠ7˞.˵?qipc ؃WُޗyVhgx}w^;z p n n ;H6P5\: l _ C  5 > \ x< 3 c Q   z @/i4 1 B|=kSj    G 1ZF(@z`O!jzgXz;eܩܸܤsj޳ <]2}.>""0E g  =u CC$$*)),:-.//L/J..g--<-i--.....--++;(,(z#c#xV) jjI&؈;`ˍOWƆ+qŽ=núf)ڿE8cE{eօxqu8M; % Q %X3q#1$T)){//[55V::;>>AAD EFG0HHEHHG)HaGGEECC@ A<&&0 0 dd33--\"\"&&1)1)))t)t)g)g)))**))((''$$!!  bbkkUV FFEEtt..ݹܹ''FFϬάΟΟiiWWѴӴrrssՐאظٸggޛzzcc44))?? ##((**J-J-//112222^2^211q1q100//..W,W,(($$o o YYKKll~~ooDDccUU͕ƕƆ†’,,¿¿IIMMӀـޭww$$'',-,-2255664646^5^5u3u3*0*0--,,0*0*|'|'k#k#  ]]--ssCC>>ܞLLookkМϜϫΫ^^""ii==UUmmyyAAnn<<* * ""\\>>2"2"%%q&q&&&%%7'7'J'J'&&$$-"-" y y R#R#%%f&f&$$k"k"** cc11EEaa&&ٔٔ١١**ҨШԚԚZZՎ׎HHLL) ) AA..!!h"h"h!h!  ``vvJJkkFFKK;;UUmm??}}  y y w w X X >>::00XX KK׋ы;;7711pp99麒WW22ii55YY++!!nncc6 6 ##**:3:3::%@%@ D DFFOHOH^L^L$P$PQQ$R$RRRSSwUwUCXCXWW]S]SaLaLDD??<<:6:6--$$iicc7 7 @@qq<>&&vvWWܡ ϕʕ;;ۿۿ^^]]BBʳʳ__55WWxxẤ||LL,,P P uuUUWW%%n.n.55::>>BBvFvFZLZLRRUUWWWWUU]V]VVVTTQRQRUNUN K KYJYJHHDD==A6A6//3*3*$$ }}ۜKKBB̔ŔŎ11//SSββ##))<<;;::hh\ \ m m eekkCC  ""R!R!""$$y%y%&&~'~'''))**++!-!-a,a,****7,7,1,1,9*9*$'$'!!gg]]777 7 a a  bbooPPIIQQWW**??nn__++PPӶֶ֣٣ٰܰߴ,,5 5 yy~ ~ <%<%((m.m.^5^5;; A AODODFFHH J JIIJJLLCLCLJJnHnHDD??==\:\:44,0,0++X&X&P P [[XX hh99ڏkkѿѿ((ÙõƵƓʓʡΡ..UUGGuu00 U U CCGGff !! WWYYSS  FFa a   || MM11AAXXII55ZZ @ @ r r U U )) ## ݢ٢HHט՘ջӻYYYYԂւּټܹrrBB>>II66<<##^^>">"%%((,,..z0z011V2V211////)3)35533//M+M+['[')$)$!!;;e e jjGG;;II}}HHJJ--KK!!}}ZZ~~zz __``11BB;;BB||@@22jjee oo$$__]]ff   v v ))FFAA99NNPP 88NNrrTT33))Ԥ̤̹ƹZZ2222!!oo--ttWWYY;;~~OO DD 22A%A%++22::@@WFWFJJYNYNPPaQaQQQQQPP`N`N L LIIIIJJwFwF??8822M.M.((O"O"PP  77{{ܮCCffddǷɷɕ˕&&uu||tt\\ee^^ݘFF""llT T ""&&''"'"'&&((e-e-g1g133A5A56677t7t75522//--))%%!!vv  ~~""mm(( ~~44pp))۪NN ԚԚԊԊԍԍxxԝ՝֧ק"" AALL(( $$E+E+115588U;U;==@@ECECDD?D?DBB@@>>:: 5 5 . .''""} } BB**} } SSXXvv**aannxxll$$rr''WW--88,,%%LL668833AABB%%ZZZZ, , ??ssLLAA / / ??uu//] ] PPBBHH]]}} __4411BB**y y UUcc99yy))ccl l 4455``%%֣ӣӤФ``wwΉЉЖӖOO۹SSNN tt\\))66 22!!3%3%&&''k(k(((s)s)4)4)''?&?&## 66ookk## ))''kk--BB{{^^}}SS``@@ߋ܋ttBBڹٹxx <<ߓZZII   <<\ \ B#B#$$$$ $ $^#^#!!SSnn))[[%%NNaaa a N N   Z Z   q q d d rrKK\ \ { { \\QQ// HH//ss&&ީީ33tt==΁فٷww""#+#+a4a4!=!=eDeDJJ#P#PSSUUUUeUeUUUTTSRSRUNUN*J*JFFFFAA?>77FFllʳʳRR@@y y XX!! + +55@@JJ R RWWZZ^^bbbb__YYUUPPHH??D5D5**@ @   3300DD[[LL߿WW11IIFFttz z O O ::llQQaaaaŢccLLss""ԬެvvV V  ##//::iBiBKKTTYY[[kZkZYYUUMMEE\=\=U4U4++"">>rrRRVVޑޡءؖՖՕוݰ22KK}}**==$$&&&&%%h$h$ vvyyMMuuww//>>ҫѫ''ϊ̊WW̙̙ ǺǺǍʍdd??dd;;$$))11~~@ @ ] ] bbqq** ##((++ . .002244555544333322R.R.++m'm' ZZ77nn --֘Ϙϡɡ,, iiwwJJ ZZQQ;; ffww uuyy..kkpp00 %%==YYRR##W'W'**--0000w/w/////N+N+%%`` RRUUgg;;ʸʸ##||--ߟ55XX >>))66CCNNZZbbhhjj"i"iifif``WWNN G G==11 & & HHܚΚBB ''ȥȥŢŢ55$$ȶȶYYooQQAAEE99     LLII$$nn33  ;;< < VV  ##n)n)z.z.44"9"9$;$;}:}:262611,,h(h(%%EE   NNyy ΛЛYYѲӲww%%QQrrxxnnll zzhhIIHHpp ''ss--!!%% ( (z+z+....,,%%SS ,,NN]]GGBBQQ $$''u*u*,,..001100&,&, '' @@&&<<ee zz$$ii--PPii55WWttq,q,E:E:HH=U=U]](_(_^^``aa ` `ZZTTNNtFtF==3434))dd JJnnXXuuaa>>ssIIYY   ) ) 6 6 44ٳZZԢϢϢȢȢŢŋɋii~~kkҦئuuRR  oo!!,,55;;9988G>""""!!""{#{###$$S#S#""""" " --VV  bbffzz֮ѮRR͵ɵ''ff99mmýÆɆɪ˪l l @@""')')))''%%%%^'^'%%##ss aa//##''11x x   ##%%|(|(--N0N0 . ._+_+&&D#D#{{` ` ~~TTggNNةԩћћо;;;NNҭ׭99ۺ޺]] !!= = & & ;;  ww}}kkBB::''$$S%S%--r4r4;;@@ F FKKHOHORR=S=SLTLTSSQQNN|J|JDD==55,,""//bbzz۠ۄфjjʅąč))OOұұ99įį==llUU**HH%%WWwwuuDDݥvvPP__   @@""Z&Z&)),,=0=0v3v35537378899o:o:@:@:88h9h98866o2o2C.C.**&&##F F  ||!!  ll۵۵WWששׄׄווט٘ee==ގ//KKRRDD^ ^ ::AATTll,,!!?? G G   VVrr9955bb11ddHH< > $$((++Q-Q-,,****))''##33s s  ~~%%$$[[בԑԼҼKKҹҹՑّ::ݪll>>nnMM$ $ NNaaUU22``&& &&ww??==XX ddRRqq ) ) SSDD''  DDcc% %   O O pp00  PP,,  4 4 i i   IIhh  ff{{^^\\ZZdd11llŔ”†ٽٽ55ppHH 11##ܛccMMkk ##((2.2.3377::{>{> B BDDnGnGIIIIHHHHHHHHEE(C(CTATA==88g5g52200++&&!!**JJcc( ( @@ ܣ jj תת##ããYYWWդդII,,ϴϴ55AA{{DD99  && - -.3.3z7z7::>>@@\@\@==;;g9g9f7f7.5.5=2=2--h'h'P"P"\\++ Q Q gg  BB[[ddee>>;;˦ǦÈ==hhii11Şŭʭ77##xxGG11oo $$aakk  OO&&$$QQ BBXXFFtt f f MM  !! & &6*6*p-p--0-02255G5G522//,,(( # #jj   66јΘ̶ʶʀȀȦŦCC//ǚʚ88Ըٸݲss\\0 0 W W ""BB  77c!c!""####k"k"(!(! [[BBWWޗٗ֐ՐXXӈЈ@@yyffσӃӉ؉ؖޖbb11nnEEK#K#((,,..82824444:2:2//--,,h+h+](](##44  ||::((HHgg))((&&..55bbgg ++nnӸѸ++cc++== eeqq\\ZZ**55@@sJsJzRzR=Z=Zbbvgvg'k'kllllii f faa[[TTLLBB55:&:&8 8 ܨVVfftt99dd<<,,--!!yyЍ֍$$CC XXUU11tt^^xx}}__}}== M M ==xx $$''**i-i-B0B01111#3#322\1\1K/K/,,**m(m(#%#%""!!j!j!==//v v ;;SS..NNAA--AAuuEEߧاسг mmTTxxNN}}&&ww@@gg66ww҈ڈڀ11ZZ <<!!$$%%@'@'&&&&V%V%$$<%<%9$9$K"K"##d$d$$$%%''**..33N7N7::==B@B@OCOCEEDD8D8D$D$DyByB??EK>+E+EKKPPSSUUWWVV U U=P=PjGjGZ=Z=55<,<,!!oo\\ccQQLL((vvSSCCSSSSIIWW  ;;K K RRww==~~::YY@@ VV88  ]]) ) --qq88 //XX~~""11UU&&IIFFffddUU[[D D P P 22JJx!x!($($d&d&,(,(A+A+.... + +/&/&E#E# ))..  55jj  4 4   NNzz33 QQ>>߃׭ЭЁ́ ''ʂɂʱ̱ڡUUI I kk $ $**9/9/2244:4:43333//&&22D D 88 ttڛқ˦Ʀkkɿ̿΋ԋԥܥ''77  z&z&))Q.Q.3366B8B8::Y=Y=>>????3=3=8822;3;3E3E3..''"" @@mm bbݑ~~۱ٱՁӁӰаGGʪΪΔҔJJHHӴӴҭҭСΡ55{{VV##AA ޕ00MMzzX,X,3838CCMMWW``=g=gmm}s}s'y'y||2}2}NyNy*o*oxdxd[[QQ7G7G>>66V-V-1#1#q q tt66``^^ccUUccζ˶DD00޿޿AA3388BBMMZ Z ii$$--55::==AACC??<<7700**&&!!AA   ii((22AA$$EE33pp  SS P P   DD}}$$ ZZddttxxkkȪŪ55ƊȊȴ˴%%ff$$]]<<LLuu&&BBII..FF\\UUCC  3!3!++4499]@]@3H3H1N1NRRUUWW X XUUWNWNEFEF4@4@77//''==XX //oo@@۽ֽ<<~~~~һһCC ѹѹ CCŊźǺʻϻNNssbb. . ''..3377;;??BB>cGcGNNRR&T&TVVUWUW*T*TQQPPFNFNGGh?h?8800%% ؕXXҋ̋EE˼˼GG++,,—WW&&99_ _ ))1!1!''^,^,,,++++,,G*G*##,,[[  1 1 PPiiggMM44KK))22 \\AA""55NNtt  - - m m XXZZ !!m"m"''**))**0+0+n,n,++~*~*))''\"\",,wwRR!!//PP//eeKK11PPssŐŌʌ--ԃڃ޴>>??``11DD# # mmX&X&))))++..11m5m5I8I8::<<>>g>g>q?q?>>88N7N7)8)8{7{744%0%0**##vv  ' ' ;;֪ͪiiQQbb88ff11__΍׍קPP iiF'F',,9494t:t:}>}>AAwDwDEETETE B B==88 0 0'&'&*!*!/ / -- ޭۭ00٦ڦ<<44!!gg+ + UUHH22{{$$||   f f FF}},,rr W W 5 5 8 8 ~~}}66&&==ܼؼ؏Տչѹ̗ȗ \\RRȓ̓wwҿ׿11܌UUwwqq "" ##%%''^'^'w'w'''o(o(''G(G(''''%%""!!2244##rr   } }  33ddddKK 66GGՅօhhssmmKKqqii CCdd!!]&]&'' ' '''((''f&f&D$D$!!__bb55 VV;;سӳϒʒPP>>xx%%@@טޘXX??{{##t*t*_1_1W6W6Z:Z:==???A?A??<<6600))"#"#W W 00LLqq 88QQ>>ެBB>>UUhhLLǖʖ??էڧ[[CC  !!%%**--//-1-1l3l3E6E6e9e9<<~=~=<<;;.;.;0:0:7744~1~1--e'e'NNddEEhh MM== ssȐƐ55kkjjǵʵ##YYXXHHPPff..>>uu|| g&g&+++.+.|.|.--U-U-,,((!#!#wwC C iillccHH]]7722 HHyy &&))++T,T,/*/*''l&l&##uuLL ""//>>00zz{{PP``QQZZ ??``00XXYYM M | | - - " " Y Y  b b GGnnD D \\?"?"''((**L,L,k,k,,,o*o*y%y%uuJJ TT22ە۪ӪDDTT``EEź̺SSWW JJbb""m&m&((((((''V$V$  ??S S ``RRppmm}}<>yyAAii22ff>>aa||8 8   ]]jj//``QQjj mmccSS## ((vvOO>>QQ{{ X X JJ  KKt t ooiiDDgg ((߉ߢߢ߱PP||11xx%%++00 3 33344s3s34455+5+53311//++]%]%gg%%5 5 00hhwwBB**>>AAڄڄ::WWݨaa##44II[[MMnn((11LL<<SSKKNNT T ii))44 ##r(r( - -////..--v.v.--++''"" oo||^^wwڝҝ//;;–ݿݿƙ..88<<7 7 gg  E E M"M"i#i#!!##}}? ? i i EEww JJjjXXFF aa'']]oo   ``88 $$''((((&&##  WW   $$44aavvܱڱtt33ۯܯff((ffAABBoorr!![[ZZqq>>n n SS R R ppee]]pp44//  * *   **SS:: / /  ۭ߭ ||ǔĔµIIȣͣԊ܊ooXX__ %%..558899<<3=3=<<:=:=<<995500++%%$$M M zzOO@@ް$$Ώ̏kk77ͦЦЃԃ99؈܈AAuu ^^!![$[$)%)% & &%%$$!!oo33uu iiwwkk))CC))jj0033 ppII<<   P P  kkMM99GGUUߦܦdd>>JJ``   ""'&'&?)?)**@+@+++m*m*2'2'b$b$-- BBff77xxۗٗ88hhttRRuu " " ;;nn )")" % %((l*l*))8&8&""zzBB"" llOOAAss66ߗؗؐӐUUqqƼż99qq``GG[[..00 ''R.R.3399>>@@??l?l?\>\>9933.. + +''=!=!~~WW%%L L ,,!!߷߷ߝ||^^UUkksswwQQyyPPjjllkk%%AA66oo88>>TT[[RR YY!!))?.?.1166<g>==<>SSAAUU **UU$$ww__HH 66HHJJmm HHψ̈̐͐͒В rr؍ލ``oo((jj+ + """"$$*)*)+.+.11D4D4N3N39090--))%%:#:# hhoo  ۥUUAA%%Ӫժppُ܏ܱ߱^^ii))EENN? ? jj>>o o EE88aaJJww33EE$$``ppmm,,mm88XX * * \ \ J J 3 3     XX{ { XXTT22!!.. '' MMaa!!LL EE1133tt88}}gge e xxYYff ++   kkii44  `` vv%%wwSS{{ i i ((ffccggzzBB~~Լּ..??WW??NNyy *)*);/;/11-2-2a0a000|3|33300,,q'q'!! ``ww^^\\oo..22eemmIIeewwII^^ccff\\kk&&QQ..LLZZ,,JJ >>yy\\OO@@  YY oo99ssSS||55aa5511. . <<[[XXgg**<<++zz77  QQ  E E !!pp22&&mmݕە;; ۣڣڏڏڌڌ>>ڄل''YY<<``MM  }}!!%%((++e/e/H3H3e5e5W4W422E/E/,,H*H*''##__l l ccQQMM 66mmwwxxMMPP9944rr SSKK$$JJcc((@@$$ ]]ss&&ooAA^^``||   O O zzUUZZQQIIggzz@@ aa55RRQQ==33ee rrcc a a   \ \ } } EEqqYY22ppBB^^ %%HH55p p 33((hhPPًڋڃ܃ܟߟ||jj55 gg^^""$$O#O#"""" TTYY..SSVV  QQ^^]]]]??++++zz--ߊߊ22ffggrrff11\\u u SS55##%%(())B*B***,,S-S-++))r&r&""MMzzBBRR QQ<<nn''``ߵ!!޽ݽ݇އ%%qquuRR11((UUgg{{PP55WW ..ee))++cc$ $ + + ??WW ! ! bb}}bb{{gggg__jjvv((~~EE OO@@QQ88vvDDKKdd  LL m m D D hh**NN--AARRoo  %%  HH ``<<ooyyYY;;dd\\''oo  {{rr   ''ff  3322ii==BB  BB,,CC __WW^^ݚLLffרר׃؃9955jj \\ ZZ##  ""5'5'))****N*N*J*J*h*h*D)D) ( (&&## //mm EE ((\\//''{{||ffGGGGTTllxx} }   ff!!X'X's)s)))P)P)K)K)w(w(w&w&$$!!]]gg ff88oo[[33aa@@,,77//YY}}UU$$ggjjHH!!::hhjj66rrxx44  V V - -   t t IIRRvv[[;;mmuu""eeb b 66ttmml l ''KKHH((޾// ҷѷђҒ** cccc =={{55qq  ==@@%%   oossvvs s PPwwqq{{((KKMMf f ::pp}}##||,,00))//ۋ׋սӽ QQII  T T ``..^ ^ $$%%''~)~)++'-'-t-t-,,))[%[%77EE ee]]''22RRxx]]??{{55&&^^JJvvLLdd߽ߊ܊JJ۩ީ NNGGkkIIuu mm 1%1%))--[.[.H+H+V(V('' $ $M M CC11BB..88nn^^uu}}UUHH $$HH00OOTTEEvvffRR4433xx33OOoo pp  TTzz       ,, BBLLXXcc((11G G RR  >> ''**++C*C*\+\+((""JJPP9911JJ ww֏ݏYYbb  yykk""q#q#"" XX;;* * (( ,,**YYzz__]]  Q Q $ $  <<mm}} eeddffffWWچنLLyyBB''\\//''/+/+--1/1/11L6L677x6x6&3&3]1]1 / /((!!bb> > <o>==|<|166::G==.@w@qAAH==\66..o%% F+DaLy٥ϊS4޼i !õvj`Ǫ4P5څ{!n.!!9(("--01_2223E//))"(#6# r>E?wd:PVw Пԓr#ۡfuNwgT[ =E 'o'.//t66H::=9>?g@v@@>2?;h;B77b11)*##\  9 3i1 ۫|&ܻ{R)`i>\n]g ~  # 6 c };_heT=[ߵG^ַ+_P̸`FHqxۀ0`(T o | !)@*1R2s9:AUBHzIELLRNNM1NKxLGnH@bA7H8 -:-O"b" X o(9WO:<ƍeP~LɞUώL  'pQ&&~--.347C88l973855U22-v-%%1 ?޴ݻ;ϯǢ2t3}j¿CįÉ eq1h4} [ M:"B#))/045778K9R773y4I..'(AkOT r {bv`լԇ=+l˿%@z$жIT" D!u"?,,56@5A6KKRSW:XXTY_XXLWW~SSVMMDD::0/s$3$ /Q ]'{¨·)ͳDIձJ˷ν }͓8lzߪvPP:7""$=%5%%D## 27->b R Cmh s2A;}xsKۉcQ 1"##I((.~/56i889}8J9 77<44111,-'(!8" 7xr8rc@lݎ޽ݲPX^l_e J fPq ]!%H&['((-%%t"<#R FU c ~lg||X ibʯ_ġD výbE֪Ղ4< fW%7NM .~t $K%P))**r)%**+*H+n'(!5" %<9n.oxA(j #P**55]?t?5HhHNNzTT{ZZ]G^X]]X2YRcSJXKp?@H22$P%Kk^pӕĆ!ݩxVҒ Њ#H]Z#p!Ɣ>yE-c3&&'2x3<^=ABExFHIHZIFgG?BBM<o=$ 1 QK6""%&,**_,-+,)*:''$$= _BcF\YژiyԕfדLXHk(02{/ ##P$$#$t#'$q")# (%\1 ]EGq78NG dPb ^& #"%%&&h((#++*++&&[ GA<Lto-@œtXC.ȴA$߹::Epˇd܂ }1e > _Wp%%90l0879?e@F GI6J5JJI`J"HHADD=O>D66-'.##,{ElGDZ5+iyŽ ȑ,3e"T?,{l?''W00)::CuCG!H4KK[LLJJFG@3A9900'&T&,F^d7ؘЬυ$ɛ6"k €̅̎_n_&6 Ht%%,,0&1224m4(3u31c1,,'(7#h#Io(B,8pqדͪq8STZ`q&x&++..b1l1W4a4E5M55533c0h0++$$&&  XUYV][$#xx**__# $ $$**1.3.////..\-\-.*.*$$ww [Z̡á11]]ûûBBǑΑΖ֖ߕnnnn""g*g*0066X9X9775511,,Y&Y&00zz::\\00ք҄˧˧̣ΣΝҝeeS"S"..88??EEKKNNOOQNQNKKGGCC}?}?^8^8..!! ٹ ƁٽٽaadzdzMMJJgg''MMaa))j j UU  HHzz' ' QQBB@@ooll ]]]]++''HHbbpp &&RRss66!!  22..## ^ ^ GGQQNNHHoo P P CCTTOOZZ  PPLLܛ֛PPll%%,,۠ܠj j , , `*`*33999>9>IDID0K0KOOPPLNLNHHeEeE5@5@77..##FFxxPPQQ::ˆqqoo--İʰԦަCCXXEEII VV    9%9% ( (&&""GGdd ((##;;ݯܯ܎܎ܜܜiiً܋ܪiiW W VVss""))E-E-//1133I3I322I.I.((##J J \\AA{{UU66!!1188QQXX>>ݺooگׯ44ֱܱYY||aavvgg  55RRTTFFTT88wwrr""%%%%q"q"nn PPooBB::؁ԁPPVV@@LL½½mmĺǺɵεQQՠݠ''kk&&88##H*H*[3[3::l=l=x=x=F">"2#2#d#d#b#b#@"@"//ttRRssܕ֕BBMMiiVVУ֣OOIImmMM((__3 3 !!""$$%%$$""- - = = cc**RRPP00ssWWssQQhh++  wwKK__OOU U >>OO {{UUBB''88    PPOOqqff55}}xxff//~~MMܹoottOOmmBB##1(1(++,,--//00..,,))""}} VVLLOO44yyOO!!}} FF00JJhhmmVV[[ݙݙ݄ބߜߜ߸޸||!!IIssZ Z &&y-y-336688T:T:;;;;M;M;::;;;;55..''ww֛zzbb͞˞??nnvv~~ttRR- - TTNNttllZZTT==j j HHvv}}p!p!%$%$;';'p(p(;(;(''B"B"yyii ((FFyyJJy y 33vvPPTTuu00XXNN<>--nnRRWW1155  hh@@^^ccVVss--::++LL11_ _ 33..oonnpp.. CC!!VVxxhhHH,,~~ёБ--գڣHH00##P&P&R'R'p&p&$$   ``33!!((++,,w-w---++''s#s#66kkbbmm&&PPިkkHH00mmAAAA߻''XX33   5 5 F F ] ] ]]gg33$$vvBBTTee==//-- %%ee''x x 6'6'A-A-K2K25577995500_,_,&&// yyuuعooѴѴэӍIIbbZZaa] ]   XX}}  >>٥ԣѣEEZZ˿ʿffooRRڮ>>$$ NN  ##++A2A2665959g9g988|6|633d/d/))O#O#d d kkzz !!UU]]{{]]hh""[[88WWZZNNSS~~aacc^^ppoo8866 b!b!|'|',,<0<044664400,,I(I(""۴bbRRNN==ʽʽttrr""||='='0/0/L5L588C:C:&;&;;;}7}711I)I)!! ||cceeشҴёԑxxز߲߄44((GG  BB))VV!!oo== XXjjzzFF..??}}< < ffrrDDDDFF [[OOOOߒssbb## {{ll|| llg g Q Q   ޙޔ۔11ۼ $$##%%n(n())(($$++!!**ܭּܼЌӌөةBBހmm11VV''=-=-1144)4)44444`1`1o,o,Z(Z("" >>oo))77TT33ݛۛ>>rrPPdd}}$ $  W W oo %%@@..^^ ^^~~GGyy::(())&&--T3T366O8O88888K5K5#.#.U%U%%% 44׌^^;;ffvvyyՀހ ==}}``YY__33qq SS++UU'' > >   k k LL;;  IIJJss55OOvv**YY>>CCMM33**!!@@llBB  TT66 **&&44||YY;; FFSS##''g*g*1+1+++**''j%j%!! mmnn11ۿ88ױԱWW((;;  cc?"?"I&I&)) + +**p)p)(($$  HH&&&&((ssGG00ZZ tt""%%$$"%"%@%@%## 66 VVZZaaۊي٫۫VVDDWWmm  ' ' &&8$8$''W+W+,,++))%%--||vv55zz``ffaa!!,,""HHuugg??__CCddWWRR** tt z z WW??QQ++ SSBBKKNNSSa a 33 iiFF!!EE۔הՁԁCCxxGGpp ^^!!''++++**,','## HHoo gg~~ooll55]]CCqq$$,,}2}277?9?988>5>500[,[,&&~~{{  !!פԤiiӶҶvvBB33ت۪iiLL>>vv$!$!&&**W,W,$-$---**$$IITT&&XXKK''))44%%llnn||::  }} ))ppooOOmmtt//ooddOOUU VVSS44ss ccRRSS22"" ZZ!!^^FFHH TTHHVV$$hhmm$$ tt/#/#&&**I,I,4-4-,,++g%g%11||11hh<>{{SS~~99aa44DD  bb mmJ J ttXXUU##;;~~""ww9 9 << y!y!   >># # 88 )) GG kk22II))rr<>tt$$++00//,,y%y%&&zzFF==uu J$J$--331414..~"~"ۿۢǢ˹˹((CCmmAA##)/)/66?4?4,, !!ܷٷ{{qqFF5"5"00';'; ? ?;;55**  Һպ՝ݝ??yy,,VVHH 0011RR__ss ""**2277m=m=>>55w*w*ڴڤǤ]]))ﯸ))Ы) ) ""%%3!3!W W VVQQ2#2#N9N9KKSSTTNNAA,,^^sspp]]VVff%%$$,,p0p0..((gg..AA662,2,#5#5::<< : :22L'L'mm 22bbډ44SSւق88ݹzzGG__ާQQǁ""TT44ss** < >66((??Όaaٰٰխխii``55ICIC I I8F8F<<,,77||HHhhppuu/ /   ..::>><<33##gg߱FFII__YY**  ءѡHHбӱ$$  %%++,,~)~)p#p# ppw'w'22v9v9?;?;55v)v)nnDD YY侮ά<<S'S'338866-- MM\\xx o o $$-;-;LL?U?UUULL::## ;;eePPTT44nnCCDD""GG$$88?G?G?Q?QTTSS*J*J;;++QQLL݂ookkjjssFF>>ffRR//ΒגTT99? ? ..;;XAXA>>77 + +ZZyyΙәӈ߈..33))55;; < >::xxa a   hh,,11++!!""""%%ggNN77qq>>ppcc ))    99``uukkffv&v&//'4'4O4O400Y(Y(ccWWuuee<>* *  00Q Q   V V ss..ooHHXX99FF@@**7711ZZ``ZZwwAA==::{{AA  [ [ ##''})})c)c)''##   ߬%%ضԶԹҹ++xx!!zzFF5 5 OO  #$#$A'A'h(h(((((6%6%qqmm33ll??HHddrr++88xxvviimm  e e hh  >>11 QQMMeeWWllII HHYY55ϲϲϸҸ&&ؘߘOOee00BB""T*T*,.,.\1\1}2}22200!,!,''""jjD D vv%%߃gg//AA "" **uupp6644~ ~ ii6 6 ] ] bbQQ44{{88ii55``v v RRll$$11 e e XXPPtt]]gg55]]LLDDkkZZuuqqyyoo%%++z/z/^1^1<0<0++##66**""pptt11,,ʈʈʋ̋``[[aa vv[[c(c(h0h066;;??AA@@==9696 , ,}!}!> > ccii֑֑ mmkkSSuu[[gg , , II x x ) )   W W 4 4 11__uu݄ڿۿ``ޤKKqq@@ YYBBxxii##### # p p %%$$ii!!dd##((,,,,"("(""  NN33ުGGߏXXBB, ,   33XXpp \\33UUFF֫ҫuu֌ی''::--  __..qqQ Q TTnn  44//WWO O !!""zzqqGGRRggiiݮܮmm;;##""++22<6<67777d5d5>1>1**"":: ]]PP||ȞǞNjʋʬϬggvvqqee&&rrxx''a2a2<> zzX X QQ>>SSY Y ((##((CCSS44jj@@8 8 uuss77CC ^^cc} } [[oocc B B g g ; ;   //**RR <>^^!!..HHww AA88%%o-o-11g1g1--((""\\UU{{؇ӇӾҾIIӍՍՏ؏ڛߛ **^^  ##((**q-q-S/S///P+P+!$!$b b ""--))yy**ZZQQ  KKQQOOrrTTVVߊ**$$GGNNL L PP~~UU11  ||!!mmaann; ; <<[[wwyyUUJJFF iiWW/ / e e ``(( iiTT $$/'/'&&%%""GGyyMMcc{{އׇ||cc>>~~ܨ44++~ ~ KK$$,,224433&2&2--"("(JJi i \\ߙי**2288ccҲزrr }}IIAAdd ::b%b%L+L+// 3 311..&&``RRllDDOO((rrEEssdd` ` r"r"~!~!jj""E E ..NN\\UU++kkii  ??LLH H UURRGG L L NN !!5!5!@ @ > > ==  xxYY٨ٴδ\\WW''77vvuuKK!!!! " "FFrrtt ~~ HHdd))66aa## 772 2 >>~~1199!!$$%%""22rroozzkk??ޟݟmmZZhhss--$$^%^%0066>7>766$1$1((zzoo[[;;xxvvDD{{VVnnjj~~> > ,,QQV#V#))A-A-,,&&,,@@QQhh mmSS__zztt]]}}]]qq99RRCC@@JJ? ? T T  SSEECC)) %%OO__ffbbG G zz,,vv cc DD %%D D ++\\ff_ _ ^^G G '&'&((((_&_&  KKyy ZZععoo22tt""bb)#)#))[+[+R'R'!!CC ))oo7!7!  vv::##PPWW**}} ee**;;v v & & llvv7 7 K K  88 LL~~88\\<<EE``ww))ӊӊ--$*$*77>>??99//!!LL++DDYY\\eejj+ + i"i"!$!$ && yyaaQQ;;EEffO O # #6 6 ll  @ @ ^^xx66kk**%%խح;; 44  ^^0 0 yyqqIICCvvYY||  **IIQQ  11 ""bbkkdd΢ܢgg$"$"$$  ))TT  $$@&@&..b3b333//)) kk 99WWLL66}}==ǭĭĞɞ ӭޭFF> > II$$$$%%!!pphhaa P P  ..cc__KKiipp||++..55P P --(7(7A;A;::44!+!+3 3  <<QQOO 0000ll==!!((AAȩѩѭޭbb##6%6% . .e2e200''qq))KKccJJdd RR bb||88 ee8 8   | | GG!!{{A A @@{{ pp|!|!  HHզőmm::ʹvv ]]& & ))''ii 66 XX}} zz``yy&&  RR,,ʡá||bbPP $$((%%**OO||&&%/%/[2[2!0!0''LL5 5 SS||####VV>>ͱɱ((nn'' -"-"%%%%""''W W mm  zzLL< < &&**..!!//gg\\''66>>d=d=55R(R(BBII ;;44cc((??%%II5 5     **""kkFF  ZZ %%&&y!y!77LL@@$$**AA eeޯߣccDDb(b(--**""++FF֯ooѦѦ::SS^^::<<< < ]]00OO>>M M     YYX%X%..445500S$S$ssԓFF77֣BBg g  KK""mm!!    ffLLZZ//OOjjBB(( UU~~F F 00QQvv  ?$?$**00x1x1..Y&Y&RRss``00  [[88==88UUWWppxx%%^.^.G2G2~0~0**!!  ii,,$$\\))HH>>** hhhh--yy!!,,4466`3`38*8*TTAAii  ppAA ddUU߻ \\ ee( ( 99DD [[[[22ll  >>zz99kk sscc##33BBhJhJJJxDxDb6b6!!K K mmߚКЋȋ<<ʍՍG G 3366CCzzjj LLdd  BBYY. .   ==jj@@ tt66nn((FFVV##  ''++R,R,`(`(, ,  ^^<>ݶ  ))2288;;?;?;55''77` ` CCzz77UUuuˋҋ``RRl l F%F%##''= = GG66hh  FFff1#1###r!r!n n SSjj$$RR@@--MM  $ $ [ [   % % <<uu00UU9#9#))--,,))"%"%ee11ܪܥץuuEE ֠ݠ݆ff^^))$6$6>>@@[=[=::11$$} } ..GGWWggxxJJII77ߵ$$==D D F%F%B)B)G*G*****''HHpp((--ddff zz**114444..w%w%mm))BB..\\ CC۴ݴee44bb ii../"/"` ` L L __ UU####``TTgg    kkOO''ss  ##ggWWZZcc**Y:Y:EE L LdMdMXGXG<>NN::ss66ttN N EE  ff~ ~  ""!!ww ==ss߼PPݹ۹``bbttظڸڤߤ[[]]GG&&,,..++*$*$XXww..++AA``rr ++  SS!!O O }}__!!VV|| ~~MM  ww99}}OOww!!vv$$&&Q%Q%LL ZZ""ee\\[[^^R R O O _ _ iiQQ11` ` ww**__PPp p ZZ~~ Q Q **zz//..77ܔԔEEccVVooϖٖqqXX(#(#m'm'|&|&(#(#22ZZm m ..  L L CCXX\\ss,,uuss``uu $$ llOO//nnRRnn@@4433IIPP??}}))@@&&d d $$u-u-11Z4Z400))!!44  >>YYcc ,,HH99))TTnn!!cc$$xx5 5 {{gg] ] --LL((  KKxxmmݢܯޯ   mm 88qqZZ    bb` ` FFeeXX>>լӬnnkk++  >>   @@jjAAl l ddn n OOff**qqDDzz77aaYY{{<<aa ((''ZZi i f f   Y Y   YY [[rrۑ$$eej j zz  nn''>> 77//BByy}}N N N N FFLLoo   //66zzll~~OO""'',,KK``NNaaJJ uuAA88z z   ."."##QQSSߝ__JJ  BBOO.!.![![!00YY==FF^^uueeDDޕ""vvEE  llxx88(( v v N N 7 7 {#{### ##   %%))wwYYsskkpp!!ww ::JJ^^77)#)#K)K)--,,))r"r"33hhڏЏxx^^ׅ..  yyaa iiCC ## rr nnC C ( ( QQIIYYoo Z Z GGMMAA  ""@@cc vvk k UU!!!! 77$$55RRYYHHee44 YY zz{{[[$$ Q Q AARR``DD     77""||++00װѰԒْccBB1 1 d%d%++1155Q9Q9F9F966//H"H" ++CCff00,, qqII^^g g %%ii\\ 66aaOO..&&@@00MMvvKK ~~QQ jjYY  0 0 ddGG ^^\\[[ԤԤԗחff\\j(j(W-W---Q(Q(ZZ((XX تڪ?? !!%%Y(Y())R%R%A A O O ^^44vv44 iioo__rr66GG``DDyyщXX++d:d:CCCC<<11!!DDii dd  WW 99yyTTww E E $$iittee00BB((TT LL))|4|4==5D5D.G.GBB66&&KK"",,11((WWƖϖݜrr" " }}ңғÓťmm %%>>vPvPXXpZpZ#T#T3E3E..__{{aaww{{VV̮׮//SSii  ,,UU KKss oo7#7#++--**\\22|| xx && ; ;HHQQQQ:N:N@@++ JJ,,—֐;;##!!((;;##vvjjCCrr {/{/ < >LL.Q.QOOCC00 77``͠wwll77 ""u u <<<>F/F/{{77xxOOuu00 ) )4D4DmSmS X X&Q&Q?@?@C(C(H H ^^--66؝؈QQ6767RR$g$grr>t>tJmJm-]-]CCC!C!rrߵߵgg0000MMT0T0CC+L+LIIi;i;A"A"jj))zz̈ A AgZgZgggg\\GG**ff##ȨبRRsshh%%9,9,<,<,%%\\55WW ֏ޏ  V*V*33{4{4//$$CCĽĽbbbb$$\K\Kll~~qq#o#odQdQ**ــxxˊ99GG_K_KCC11 ss֬ϟϟvvQQɮ***I*I]]SgSghh``PPI:I:""ގ66yypp""vvc-c-BBNNQQII%9%9 ==Ȏɚ 55uAuAwBwB99c)c)..TTѸѺ˺˯ίۡ n%n%AAWWbbnbnbUU@@$$11||ǷNjK.K.;;y@y@;;L0L0  شؿſkk\\BBVVGG22a4a4LLf^f^.f.fccEUEUX>ssbb ||@@p8p8HHPPNNBBR.R.ґʦʦззЦaaN1N1 J J\\=f=fhhbbtStSu;u;\\OOkkϕɕ55זSS**J/J/,,!! ߉߻λ bbٸٸzz((336622F(F(<<==ppiiУԣԐސ00uu!!++//00((++) ) vv~~GG--CCߺ&&//3333d0d0''JJ ȆƁ66//LLaaoo>ƘјXX((++**3#3#%%##̩©GGNN3)3)<A>A;;,0,0 &&DDSSOO  T T 55 UUOO$$77ddmmpp kkII!!$$+%+%""_!_! KK##tt--ۋDD....ߏSS$$~~,,==IIdPdPOOFF77$$ttgg99h h G G ~~oo::@@rrdd ((0 0   E E ~ ~ ddLLmmKKvvLL$$ 77>>::ll ##l*l*--:+:+{%{%AA;;{{YY kks s ;;hh|| ̔ŔŌŌ&&))W&W&M!M!22\\ ^^xx) )  YY66//ttDD  PPTTvv  >>mmIIeeyy O O f f YYդssHH**zzOOllOO&&117777-2-2)) EEbb,,zzKK..OO BB XX pp99sscc,,MMJ J  A A aa22>>SSBBNN''aa::TT33 v v ++  BBbb mmccDDHHaa22KK!!MMu u PP/ / **::GGff FFTTNN00gg44ii** ,,cckk  NN<<  nnHH; ; yy++xxJJ22YY||ZZjjXX$$^^PP]]99$$D D   KK((66GGii}}ppVViiKKii:: GGv v [[.. **ii77JJkkbbpp\\ $ $ '' + + **]]   OOVV++ll  cc0099LLll DD@@OOttEEyywwYYOO##,(,()),,**$$GGg g ))hhFFgg??~~VVffGG}}LLWWppss,,RR//KKyyUU^^<<vv` ` AAdd&&ccJJ// aaAA{{ YY""&$&$V"V"  [[WW UUAA%% UU   mmUU99WWTT##KK mm" " b b y y uuOOܖnn<> ~~##?+?+55==d?d?i>i>88P,P,߫..88֘ܘNNNN..LL88eeߴ[[<<x x CC//$ $ 99uu66yy[[%%gghhZZޙߙ<<''PPNN##3-3-22l2l2g,g, ԣԻƻ8833s s 22~&~&n-n---r)r)ZZeemm??   ll^"^",, DD%%jjvv 33<<11pphhQQ~~==o o %%$$ ? ? yy<Q>00uu22..EE܅ӅUU'' &%&%,,--((^^%%SSZZGGɃ̓==zzYYk k gg++ff!!$$N2N2>>CC"D"D>>44%%\\GGףʣbb~~řљPP''g1g111**ݮʮYY!!FF--22 F FPPaTaTMMh>eeׯǯJJiiCC9 9 M'M'==MMJUJUUUNNQBQB 0 033ٴ //ǁӁjj``XX22MM33bbɜМooooU(U(;;WIWINNJJ@@00aaaa--  ((|,|,m)m)  xxrrԙǙǁ³ͳ ~"~"d%d%G"G"HHCCܸ߸PPMMEEU$U$G6G6DDjKjKKKDDe5e5e!e!jj Ӏ''^^MM[[,,+?+?*J*JVKVK7B7B11ssuu""[[{{&&_/_///))לKK ϓғҴٴ__55''  K K vvjj33 ((**u3u3e6e633++ BBNN܋22ddAA''22O6O611$$ ȑȤPPRReeҊ}}'&'&i0i0i3i3 0 05'5'zz{ { &&llպ׺;;  ++88@@LELEDD==//PPoo;;kkGG JJ%%))&&QQy y CCcc??ȼȂ؂\\hh%%//4422** XX""~~AAUU }} &&ww99,,qq$$KKP P ee""##""iiYYޭYYooVV!!//889922$$zzCCߐGGyy  ''44";";88008#8#ffHH&&AAS S  $ $((o*o*((i#i#;;??iiMM!!::ۡNN # # kk||## " "DD VV? ? !!?)?)**''..44ڭڔӔtt77ۑa a L L  ]]NNYY||""//::;@;@T@T@~9~9,,GG^^߳ߑёttmm//ffee##,,00 / /%%''zz//XXPP''::77((YY^^zzss11..<<--TT  33ssVVI I &&(($$nnؓ؛ɛ33nnǞLjԈ''$$5$5$!!==  $$99}}UU##EE//::33BBT!T!""^ ^ CCܩ>>dd 6 6 KK``--AAQQ >>9 9 77QQa a <<MM  44ee, , ]]NN CC22ffި&&aaTTӎ֎ss00ddRR i"i" pp##pp  \\ CC    F F a a qq66UUOO%%""kkEE55))VV qq ))SSssm m ''TT ``CCCC!!GG  zz "" 44cc0077==hh^^ߌR R   BB))]]11AAee)) $$ CC^^PPAA, , AAjj FF  ppNN}}<<VV##ssNN!!t t vvkkPPq q ; ; MM \\33xxPPDD[[ff   QQBBJJdd==mm%%{{__   שة 88YYL L W W 7722``~~{{]]  Z Z &&==JJ;;PP&&""aaEELL ==KK66ߴ@@ޡߡkknnNNttcciiHH {{  22QQ]]++ 4 4 e e ||+ + ``;;pp))##RREEBB^^'''3'366U1U1=$=$--LL\\%%hh""t t   2 2 77//;;H H `` <<MM??hh66cc//VV==bb aa5"5"aaBB??QQooIIP P &&((##N N &&hhYY>> 2 2 ,,88 L L    3 3 SS``> > %%((""__ zzMMF F  FFnnaaooFF00[[h h >>8!8!i#i#. . GG  ( ( ; ;    jj//rr gg  R R ' ' pp dd55``..EEL!L!H)H)((tt bbJJccQQ77 ? ?  kk XX ii**NN99 ((B B ll33..QQ55ll4 4 //  ((++X&X&ttז00Ӏـٞaa --!!$$  ee   \\77** --XXyy&&  RRvv  U%U%$$nnZZAAoo0 0 FF<>- - AA_ _ ``uu^^||BBTT??]]66YY::OOE E hh22TT  ::  ~~}}EE7!7!++UU;;׭ѭ==YYDDaa$$ZZSSII 66oo !! !!O O yy>> AATT))[[ XX""mm..jj..yyi i ??    pp gg33 @$@$9.9.m1m1,,x x AAݟ^^OOQQee55``  LLܥܫޫ88::xxhh Q%Q%J#J#sss s AA11!!eevvG G W W ,,//O*O* JJVVpp  44 qqssvv,,EE66RR||  ^^__aaHHff""%%s#s#== 99WWث۫ > > 00^7^722Q#Q# yyيNJǗ TT, ,   ;;^^CCKK.. E$E$##11jj``q q ~~((ۘbbOOtt00;;%%,,dd00--%%g g ""@@NN ooɽŽ̂߂FF""U/U/22--r!r!yyII++++ooOO  o*o*3355.. ww))%%rrۗߗ~~ 009988++,,99PP!!J&J&,&,&!!mm>>''JJrr ddjj<&<&((/#/#DDxx,, XX    nnFF מў ێ  EEH#H#(())I'I'""YYh h ??nnllܤ  ''>>PPTTzMzM<<^#^#++ooXXII 00gg(("" UUhh==WWJJtt  PP^$^$##rr ##ؿ;;ؿBB++77x;x;s7s7**  ݨۨۅ݅ݢ\\] ] X"X"99TTss٢ҢҠҠ==مdd--hh  ݾhh88ԉډiiNN$$66-C-CIIGG<<,,55 77x$x$..22).).77UUς22 ''**((0#0#ss  YYLLaaOO }}xxV"V"##""99  ]]oo%%''I I ww  KKKKAA11HH!*!*668:8:2727,,wwPP66aaɵǵ&&ffXX$$ `(`( 0 011--C$C$OO&&%%FF JJ11}}  ##K(K(((8$8$V V 55л»,,ɵSS ##i5i5q?q?@@::9-9-??AA;; ++!!"" ))44SS==VV$$''&&:#:#11__y y ]]JJ44hhܗMM))##  gg~~݆݊ԊԍҍҤ֤>>!! d5d5BBFFG?G?--AA""&&||11uuޘ  ;!;!'4'4AAQHQHGGM?M?0000܀̀ppaaҵ޵00 o o ^ ^ - - f f %%qq t$t$''%% WW llrr00ddjjT T f3f3BB,H,HDDDD 7 73$3$  ߇,,!!++++vvDD 22ݪݪ݌ii..S S iiAAQQqqMMII22@@IIHIHI ? ?:+:+JJҘћܛii,,p p ++..**  uu::++YY11JJ99JJ%%,,,,6%6%]]rrssMMNN''))11ss""%%1%1% ssooXX ttNN YY>>ֺֺ# # o$o$ 9 9DD[D[D99))FF$$ߩ۩۪ܪ##  zz+ + VVkkDDNNxx ((||AAV V 66wwѪ̪yykkKK  &&j-j-y-y-((FF44TTμԼ&&//""&&%%TT@ @ YYqqjj$ $ XX""f'f'((&&!!KKqqddppww88EE {{5 5 ffww !!݁NNJJDD>>""j*j***##O O GG PPee  >>4'4'0044s2s2))''>>jjxxqq""33PP++UUwwkkGG,,QQD D   < < vvnnxx 33 ''00H5H51313((xxEE))Հ؀ooEE ttqqt t ..^^UU llll!!  SS##++,, ''P,P,&+&+&&AA  }}rr``;;??r r SSjjYY޳ffݟii@ @ 11JJ:://JJSS]]Q Q @@BB88XXvvUU    \\ZZBBSS++00,,_!_!RR44$$ggDDHH UU& &   II<>@@4499AAjj))OO++//DD LLAA,, $$rr((FFߪ44ss^^jjQQBBZ Z JJ""MM&&  YYooc%c%$$l l OOcc:: //EEWWAAooDDl l 4 4 ii@@::,,oo{{XX>>uu AAf f  44}}``  SS66mm>>rr Y Y [[QQXX==SSzz: : YY44; ; ++p p WWww++!!CC{{ii$ $  66##^^BB@@VV~~ iiqqVVSS  II ww  tt[[MM ]] &&)!)!00O O //nnQQ,,xxۂۋۋDDll&&nnMMaa%%||hh UU99 ?#?#&&a!a![[88SSMMww{{~~++hh BB' ' S S ::xx44TT77  ll8800::HHmmBB CCYY NN --ww\\""[[jj  33zzccZZh h - - KKjjZZggOO<<L L 00BB++44AAGGEESS{{XX   {{--..ff``0 0 33vv^^JJ,,ZZS S M M yy##YYBB  33^^@ @ DD==::FF 77))aa]]7799@@ppYYSSwwII2 2 ss   00 ..U U 77C C ::((x x  NNooGGzz jj^ ^ **~~TThhCCHHff YY@@  ==((55 DD!!==ggff]]ppFF>>``::""& & j j !!ff}}]]EE \\ޞJJDDttp p p p ~~ GGII\\]]1 1 L L 9 9 ee88 QQff88UU&& K K 1 1 hh$$&&[[ NNPPMM ~~ ##OOAA``&&) ) K K ))uu2 2 !!""!! {{^^!!FF  WW kk}}jjnn1 1 OO lls s XXݼZZ++) )  //ppaa\\ xxKK88 JJ &&ss\\__}}gg$$X X BBddtt;(;(*.*.++""99ߪުVV__ GG**MMGG~~77--l l ! ! 00ppnn  xxPP  ((FF'' qq  RR'',,''QQ99''))ZZ22,,::66``G G v%v%K"K"NNLL``,,KKEEBB((++ % %!!h h ..==- - &&((!!KK%%((FFBB\\xxRR))BB  SS 3 3 $$uuss@@MM-'-'))""11ggee e)e)3311$$ \\С֡֊__YY;!;!))))55 vv77;;MM9944LL&&&&XX++vvYY-- EEGGYYKK ll !! \\33,,llzzw w T T    EEqqބӄ66YY__uuE E  9$9$((/#/#TT##ܝםffFF!!>>&&--))xx pp~~99L L ,,U1U1Q)Q)ddSS;;@@ MM]$]$)$)$RR>>JJuuQQss||AAXX  x x ,, AA>>KK((M M $$}}uu))(({{ &&00110$0$ 66II{{ؓXX??DDM M z)z))) AAxxee ::eekk99 ##%%YY||dd ttR R &&==KKccYY00zzW W YY/ / SSAAuuP P NN||@@UUKK GG׾۾oo __''**##UUff..YYQQff//DD @@&&bb//٧11`` cc[[  !!55  ccܱww##HH&& " "="="::uuuuhh ii%%  IIww44CC  ::&&00 --zzSS++mm;;**CCKK)),,&&' ' ^^CCxx==))^%^%''!!  3300ߊ..\\ dd__jjYY[[qqG G {{ ((dd!!//~~>>&&PP // & &-$-$--m m ..22CC33 QQ==--)) ޫeeܐ}} m-m-00r(r(~~bbuuQQ))**WW qqddTTgg  77[[KKgg ޓՓyy** KKEE--''00 tt&&3#3#LL//ߘ11   KK+ + ""r r ~~ggddaa  ~ ~ ,, 9966BB"+"+55S3S3/#/#3 3 rr&&EE 00VVJJ 77..GGwwCCl l xx44DDXXhhbb&&[[RR**eeyyFF$$c*c*Y#Y#AA!!޷nnPPFFrr 99   }}#### UU??ww,,MMwwP P ]]77 9933((&&>> **uu%%ssqq??KKD D   OOFFFF^^22""|#|#""**rr}} TT%%{ { ssKKXX{{ 33nnkk-- NNss44H H ..11,(,(uuddXX]]KK]]----ttmmssvva a BBUUKK4 4 BBL L %%aaWW88$$KKffzz~~cc bb q q //**{{ڐאWW&&))     \\ss--ې֐֢ޢXXddYYkkU U EE""RRyy SSll   ~~d"d"L&L&--!!֚ݚvv  WWXX ??  44WWrrݙ݊==I!I!KK LLxx!!ۏۊ؊GG  K K  ;;  zz WWooڏӏddxx''##}}MM44ii((&&  ^^yy##MM<<I+I+x&x&NNII  ۻ~~YY``    ll--..))ؓطط؍EE]]BB^ ^ !!PPUU""##OOӸ(($$bb  xx!!11HH""00$3$3b!b! OOTTͱ߲߱$$00<"<"<<55  CC;;ڦڶݶee//;5;5$$mm;;Z Z 77:: ZZ yy++33##00ppkk~~ooss((0000gg// qqQQ߀33 ""SS""]]""//'',,>>G G ݢݎގުGG>>HH!! 8 8F8F8##]]jj dd))WWvvQQP/P/77x+x+RR WW))~~ ))EEN N \\Ԝʳֳyycc F F ,,,,ҡ١--  44WWJJAAoo**K K JJ!!**++^^ww>>ĚКЫ99BBg3g3TTKK  , , $$x*x*UUQQZZԓMM ii7711 K K &&**//!! OOJJ SS ܀iiBB""**""jj%%VV&&CC $$&&  xx66zzTTQQII??kkkkee77LL""//pp^^NN''22}.}.pphh))ؒ  NN["["6"6"66VVjjccٮܮGGDDmmb b uu WW!! //  dd66K K bbRR6 6 C*C*V*V*BB ,,xx**##׮֮""%%**##33{{GGBBww}}  $$##, , dd{{&&////%%AAccss00&& oo..BBccd!d! ##xxZZiibb: :       22OOxx@@HHdd%%22""k%k%..wwڣۑ$$u#u#l%l%""!!GG$$мɼHHϐݐݐXXXXLLAAMM[[uuff<<11DDSS* * jj~~ZZUUii33!!))))e"e"99@@**uu## ) ) >>$$::PPgg OOTT<>yy N N VVddCCBBq q %%[%[%!!qq""{{iiII..DDrr(!(!^^ff##MMRRRRyyAA{{HH  ii""//QQ ::kkw w ll{ { nn]]uud d YYkkOO%% ' ' ++88@@O O ++||uu00JJWW  hhl l BB** %%..Y.Y.""""ii   AA}}gg66r r !! jjJJ::RR,, __] ] 22TT} } <<ttK K & & 3 3 PP YY YYBB||II@@nnKK##SSPP]]pp !!%%DDkkR R yycct t NN  33RR@@DD MMnncc66,, l*l*b(b(&&OO JJ! ! <<NN``OOaa77mm55@@nn  11a a ""E'E'g)g)&&{ { kk ::aaOOVVSS;;UU7722**vv  DD]]JJ$$zzv"v"``,,  ``UUHH -- * *+#+# ԫ``77xxaaAArrVVee8899فܞGG pp::? ? ::__ިAALL # #])])| | jjrr  ((''ttzz`%`%!!\ \ ,,((kk99mm߶ LL>>NNIICC[[ XXAA11\"\"..U"U"33PPyyi i   AA99 WWWWSS00!!ss  33MMGG99PPGGUUJJw'w'$$YY||^^II٤tt{ { ""))??ؘwwaaYY ]]. . LL''" " f"f",,## ``{{rr''  JJoo00BBrrOO>>uu   $$yyGG11nnss!!??<<:: ! !((..@ @ **   ((''TT""j)j)22s s 66܀//==w w   ;;!!WW܌VVyycc 77 ffCC((ggbbooHH^ ^ YY55aa@@[[<< H H BBll##++''  99NN %%cc}}  &&!!@@XXffTT -$-$  u u  BB""==~~SS ss  ;;qq PPrr{{IIW W BB]]aaYY==''yy\\AA??44 3%3%RRUU99aaRR   zzRR^^)) FFXX --44  pp||  $$"!"!NNVVhh  ? ? c c ++ FFgg mmCC@@TT!!HH((XX9 9 SSnnAAkk;;?? XXkkcc  ll ~~00**QQ# # p p    oo``%%44%% ffPP.. mm\\ޝ""VV&& OO33>> ff99 \\nnllRRVV5 5  KK__ll   dd  LL||&&''11uuBB//-- X X TT++R R @@QQ%%H"H"00 77##rrBB11 pp]]O O eeߴ[[!!  ee==]]NN__jjC"C"''ZZFFKK33؞cc  :: !!" "  ]]]]xx&&ؓٓ55UUXX5 5 {{))KK..j j   11ggee11//$$ !!''bb77%%xxxxhhii` ` AA00 ))ـ AA !!   && llDD ؆44>> c c [[\\{"{"##66\\$$""ii77 TTHHU U 11ppEE``HHNN``EE  ΊʠߠVV::))))JJ HHll? ?  }} 99KK<<҈33eemm$$FFO O ..%%.&.&jjFF @@**&&**B!B!TTL L 44LL00^^~~KKpp_ _ bb22'' VV 99## ttj j !!ߥ99U>U>((ddFFGG  DDPP##GG__VV%%׷(($$C C qq@@jj77 ''##ߺߗܗ܆ //Չ؉ee))--00 ww ' ',,""nnjjcc''<< ??]]k#k#vv::NN''iiHHDDppBBzz%%]&]&NNߕgg(( ff))AA00T1T1$$߶OO(( 33$$`` CCYY'' 8 8 hhټٕӕ!!   ss` ` UU٨ ((ݫbbWW. . ))&%&%uuԩΩ&&BB(())]]WW ' '  ((UU# # {{BBVV  ``>>88##<<|| ))OO**++))XXܷܿϿϼӼ   TT   WWTT<< dd"" '']] EEppDD ! !x%x%!!11ٹIIqq""  XXrroo~ ~ <>OO$$    6 6 nnEE((FF00ߖcc++99 jj**TT##YYff  ccIIBB   LLU U  SSGG ޏbbUUbb__00@@/ / nn{${$ZZFF((ggZZhhCC`` ii//NN! ! ==}} ''ؤ66zzss""e e GG==zzVVuu} } HH''FF GGpp__  4499߂zz88{{$$BBHHJ J GGww? ? p p 0077NNWW xxCCOO}}$$11tt rr- - hh EEppV V %%yy  y y ##VV IIff22--||^^      eeaavv``<<00VV>>llj j yy,,ggKKyy YYPPUU 33== 33FF**c c CC,,RR۸ؤ==@&@&##dd[[qqf f __FFkk99` ` VV    aa  KKyy[[aa ??dd||||==NN 3 3 SS  //tthh| | ~~::oo33;;||zzVVzz   kk) ) HHYY55 ))bb33xxAA CC<>@"@"$"$"yy MM @@TTgg۾پ<>{{X'X'bb``LLhh33YY{{HH @@PP--&&  >>??DDϚ,,,,dd  ) ) 44OOVV   FF KK||YY: : aa ߥ$$..d4d4&&>>88__%"%"  َPPGGq q 33DDYY  88PP ^^ooNNMM6%6%''IIIIZZ**??TTZZee  tt RR99VVXX8$8$11E)E){{ uuWWyyLL@@--//  [[KK  ii'' __//".".vv<<``SSnn 77vvee!!mm ؟LL   RRqqqq   ..FFKKq q ``''//TT  CC^ ^ BBxx..ii {{' ' ggTT ((}},,XX% % pp?? ==  ZZ00rrS S ''??--9 9 ޛ޾ؾddXX88V V 33%%ee2211MM2 2 55""!!pptt\\ ppDD &&dd99DDvvؓ݋YYtto o EETT88  @@!!)) ~ ~ RRaa ''44rr&&@ @ w w ee/ / : : WW__SSvvaaffaatt  v v ``$$!!iir r  (( 88>>IIKKkkdd iiYY6 6  bb >>YY00PP##mmߤ J J yyhh66ttbbO O H H aa     LL zzNNmm   RRqqooUU{{55xxbbii>>WWvv``TTrr< <   b b 9933FF }} P P / / **&&..ww dd{{mm  jj77//== 11bbNN6 6 MMww33__JJ   \\nnTT SS((22@@bb ::dd~~##  ))^ ^ gg77::nn ""NNN N  ..qq``ii77 __jj   pp!!""mmPP  TT >>  <<gg__VV  II??%%EE__DD nnss  }} ``}}xxLL bb ++g-g-++WWeeVV55]] ~"~"&& jjnn ''H#H#"" ~~׾,,<<~~pp  11%%LLPP))II||s s vv22::GG UU##ZZ' ' EE[[BBf,f,5)5)mmQQ&&!!WW&&ff++$$llzz//qq}*}*%% !!--??ss**V!V!44,, !!Ԙݘz z tt**GGm!m!))bbTT  MM||־ݾffRRyy FFaa==%%  ~ ~ ff//\ \ ??UU..\\[[ ..$ $ ..S"S"$$vvvvnnJJ&&A A | | 99ަM M r r ""!.!. ! !((||44!!;;))``Y Y xx6 6 hhږRR4444**r!r!ssjjeej!j!S&S&~~9966JJ``ڋ>>qq00^^11DD RR G$G$M0M0$$bbpp**55VVllGG11GGn n KK``$$ss`` uu ==yy22ssaa&&  ??u u JJz z ''\\CCYY||   EEFF\\!!C.C. ( (22##ZZ**mm!! @@::ooAA  jj[[@@ DD@@`` rr   mm33rrj j $ $ EEccHHcc nn//55##k k !!CCjj%%ooN N vv!!!!##~~77%%t t ^^..uuyy--__y y yy 2 2 x x h h tt"" U U P P UUMM44<<  TTxx&&}}PPk k --mm::AA  zz44MMqqeeLL$$PPff``AAU U ++ddppccddkk    ddK K u u RRnn&&[[EEvvqq((yy<<rrKKRR%% S S j j 5 5 = = 33$$:: pp44##EE//ff99NN&&<<00xx\\((ss  JJHHWW9 9 iiZZ""HHzz{{--11   nnhhTTI I  ooDD**rr;; %% ==uu<<]]$$kkyy//88ssEEZ Z 2266VV"" $ $}}""SS33hh((TT55uu[[Y Y 0 0 -- ''%%$ $  ++4 4 [[<<ݐ N N >>--  o o { { QQll&&ܥ 66ee$$XXO/O/i0i0xx22JJ%%mm99jj__FFaa]]33""hh$$C C BBDD ##$+$+44  pp::߷\\BB..{{ܡgg ii++!!--n n RR55--AA<<RRZZBB``@@ ZZ  t&t& ::vv!! ffҞĞĽҽ҃`$`$#=#=#8#8 YYaa110#0#wwֆ ^^ii  n-n-**[[ %%"" bbkkWW ڋ LLnnݎNNk3k3S9S9e&e& ::ii݁   VV ii BB^ ^ vvnnϬuu!!.."" ccnnll33VVoo$$WW&&<<@@A$A$//++,,@@UU||ܫҫ&& F F ,,ff  -- --ii]]xx@@WWtt33צ  &&,, 11vvHHq q PPnn  55II]]llxxN7N7;;b&b&   xxC C zzRRNNkk ;;++ii!! UUѾ RR( ( XX,,"8"8/)/)``ϭ77rr zzww  GG}}hhփރ,,~~ 4 4--m m T!T!##  ||wwVVKK## [[DDhhޑލ̍ZZpp~+~+--EEMM++x)x)MM 99 &&>> dd``ss''55# # !!k!k!t t YYll{({(::00DDaa}}BB]]ffE E ^^" " !!T T !!ooJJ NN??u u EE+&+&,,ݦ II BB&&OO>>ee$$zz@@AA**I/I/\\ ggH H KKKKxxzz>>00 66>>vvpp ""E(E(GG\ \ ߑڑ\\//BB L L bbss  xx**;;PP nnkk_ _ jj66  jj55 RR>> ccBB   nn""jjo o ,,YYFF  HH QQdd& & a a d d QQ--c c RRJJ]]JJ/"/"R'R'pp kk SSrra a    {{jj  JJ OO00G G S S nn\\WW~~p p ee;;DD::22mmVVoo__::~~''qqccLL aa++( (   NN<> _ _ llJJ //oo FF == --{{qqssRR   == ((^^!!RR- - + + JJ   S S rr xx>> {{ooZZ 88UU((ttDD>>##//5 5 | | ]]3311uu{{[[ &&^^33 x x WW11xx  <<??hhިYY,,nn00 88. . 00}}tt   KKAA--ppaa ~ ~ 22UUt t % % < < 3399 nn܅$$66 ""KKhh((%%__mm~~zz55ވee,,    WWzz99NN qqhhFF88ll``YY== ,, ||bbrr11AAvvhhY Y QQS S v v [[ ee``,,((ggFFڕەeeQ Q nn%%XX22dd  UUjjߗ߼ϼuuyyuuccF(F(!!G G ۨۘߘ}} V V dd ddq q %%&&dd ߮VV--""00Τ]]99YY"">>@@jj  cc==++| | ww ''11,,ooz z SS11++//hh``nn66c#c#++ݦ ttuuWWxxRR''ll9 9 kkޅ΅IINN݃%%vv__,,%%u u FF  AACC ##xx::$$!!HHP%P%55ggz&z& ;;# # WWee>>''  ́ɏݏݡ::m m TT **!!۬NNOO rr __xx""JJDDEE66۩**yyZZ%%qq((jj11YY; ; WWllIIPP__ mm&&<>0099Q Q ZZ==zzhh55ddmmMM,,&&JJ1100YYMMcc 11EE^^''88RR__00::mm//  y y TTdd55  tt  ~~ ::DDOOMMNNOO //YY$$QQKK XXmm00ggRR00V V 99ii ~ ~ nn((LL} } - -  @@__ss--FF// <<``  %%OODDCCII]]H H 11%%**33~~ wwNN22$$ ""77::^^ ? ? dd==PP..>>r r zzqq ffEE~~ZZ\\))hh~~ ((  R#R#!!e e ;;11mmoo**i i ccJ J //ssjj ii99jj99}}**&&@@??77* *  jjBBrrzzڤۤۻ((// llwwJJ}} 3 3 \\00xx  33TT""  LLMM((??qqQQpp __ttyyRR %%UU::rrYY""33]*]*88OONNee ||- - --~~AA``{{DDh#h#~~LLeeEE  pplla a ||  00KK ,,**kkTT::ݙܙ>>  @@""ۼܼtt--V.V.gg{{  BB ;;GGjj SS . .0#0#پ   }}LL%% \ \ ]]%%GGv,v,22  UUCC00 __  $$ee88==HHVVqq  j j ZZ&&QQh"h"qq^^YY- - ww RR&&ll""``   YY44iim m   ##^^llwwII WW!!%%uu  @@XXjjll== ==< < tt}}ݘd d  vv @@zzbb ZZ3 3 XXhh;;aa WW 00;; hh::++bbZZmm 22OOkkCCaa__--^^11^ ^ $ $ }}}}++kk""qq<>NN``LL ,,||aaAAR R wwffpp :: [[oo##''BB> > TT$$ߺ߮ VVYY<<  AA] ] 99//EEW W 88WWVVSS))xxvv&&HH**..xx c c ZZhh77p p }}RR8 8 { { ##iiZZ,,--^ ^ 22"" ttU U 336644]]55[[[ [ ,,vvD D vv ##99eexx99~~NN^ ^ ``;;ZZ <<RRxx]]%%@@ZZKK  ~~JJ::!!QQ NN<> ""@@  jjLLٺ ''OO||CC%%88gg* * %%UUhh **ppggUU  oo  II((GG77%%ii@@w w EEnn mmbb''..ۗqq,,BBڔ{{  &&WWII!!!!++SS..%%ցiiJJuuww$$ QQss11ll^^%%&&YY44ڲ))ii>>++ ++ GGII,,ܨ??K%K%XXYY}}ggoo ss||VV00 @@-- uu  ߦߨߨO O GG$$$$..  55pp(("".. qq==$$RR@@EE,, J J SSiimm}}""JJ3 3 xx  5533++NNjj((L L GG\\//++||//!!PPxxt t KKII OOqq  6 6 {{dd^^  OO  E E !!?? ..q q 44ZZOOSSg g ))qqEE 44UUoo66zz55  ccEEllCC- - $$@@OO++77z z $$??    LLTT==yy||88VVhh AA##-- ll  ssSSHH rr  ``((==<<P P ZZww55,,d d DDE E RR 77EEcc??@@$ $ {{3 3 99&&KKDDff__hh  &&""uu  K K 77KK## 00~~vvUUvvt t ooll _ _ **ee__AA-->>BB-- 77B B ! ! //^ ^  mmEE//ooLLDD8 8     --!! {{CChh''(({{JJ D D }} UU  ZZYY;;wwrrAAss"" ++GG66PPqqtt&&-- n n {{oo \\,,2 2 pp;;99  CC}}SS((||BB00gg YY {{qqAA//B B MMGG[[ss  ;;kk  ,,||K K ))MMyy""yy--``22uuII  dd]]  >)>)ssXXaa%%߀߿00W W ??qq||||yy99qqSS==++55==_ _ XXZZDD55== kk@@"" $$++++ TT8 8 >>ssJJMMAA|| bb CC  _#_#99//wwuuii ??66LL**ssEEBBvvJJ""hhZZ 44YY((ssww{{S S 99AAOOYY  LL$$OO ||kk66??qq55 K K __VV( ( CCUUZZ rr --HHPP88::  11R R ? ? ppPPKK66BB --}}5566//  D D  66 IIt t !!II::%%--==lloo{{ 88zz--EECCff00AA,, OO||SS uu??55{{--(( ....qqOObbgga a y y E E   jjppuuVVYY<<@@  jj88UURR  H H _ _ ߜۃ~~!!$$TT   9911WW  ||- - DDMM%%FFvvwwkk44nn||LLZZcc--66ddyydd%%ooSS __\ \ 44ZZTT!! OOoo8833))))99))WWEE nn,,  L L : : HH""ff TT CC UUy y  RR >>99 {{ hhGGyyIIGG dd.. ##  66ee))aa$$  \\]],,xx@ @  HHRRee __ GGgg<>~~J&J&$$CC**/ / WWKK  L L @@##++99ll|| $$ 77&&oo ))I I 44M M ""``NN ||} } >>6633u u [[77XX++DD||zz2 2 "" ..rrVV33 __SSNNqqYY99ww__TTWW  NN ww88oo88{{``YYSS$$$$!!   ,,bb8 8   ))KK ? ? ]]7799PPZZFFHHRR66////??   $$ooPPRR==22 K K TT;; ;;((OOssHHee oouu[[ ``  uu) )   8 8 99{{\\8 8 BBJJNN;;jj--ޱ""tt dd- - \\[ [ ZZ~~ZZRR;;[[6 6 88GG&&DD TTUU6 6 [[ eeUUQQuuYY   uunn   ww>>   22 Z Z rre e ssGGCChh  00gg% % ((\\hh  ss  JJBB  DD XXEEhh//TTuu** yyrrJJ## .. rr..  vvEE4455XX``77]]55 !!]] HHggTT --SS''zz  ,,hh ||@@  vvbb}}__ \\jj  44 PP hh]]]]  GGllVVd d ]]ddVV..--ggyyppgg~~77GG--  oo \\!! ; ; qq?? >>[[II::$$  ^^\\22t t ++k k 00@@QQ  MMAA  &&<<kkTT rrKK qq **oo^^WW   --9900<< eeFF..  jj2 2 ""  O O ??jjcc` ` 9944||YYLL,,jjEEqqmmVVp p 66__ , , wwOO 22""d d ppG G hhttss<<  '' xx@@| | cc ff::~~ \\11f f ppOO``JJII++8866Y Y rr~~ZZ^^88  88UU\\))WWb b ff((""  MM   ))wwtt)) 66aaBB@@%%>> OO1177ppf f hhWWcc&&m m ;;YY FF<<ee..%%`` n n **//<<  EEXXDD e e (({{)),,  }}  $$aaD D   88mmwwJJvv!!++yyEExxs s == PPLL&&66mmiiii$$==55##[[>>aa?? GGhhIIVV~~22eeccQQ))FF++))FFM M ""__4 4 **uu    ``  bb%%ZZYY/ / ccR R 33||++''yy!!((TT: : ) ) uuSS  1 1 11FF::  ~~**JJ\\0 0 JJ  ggZZAA  ee  QQww|| & & ;;--$$ uu??GG]]ooiigg)),,%% }}xx,,A A  >><<%%R R ]]  7766pp++cc``;;KK @@CCkkyyPPOO++JJ !!-- E E ==EE DD&&ttOOQQaa< < 99%%mmnneehh%%bbqq^^MM``~~GG^^ff  ((QQxx``FF AATT{{}}qq PP::q q GG<>55mmaarr9999 kkAA,,^ ^ \\rr))xx ,,44ZZ ''ppXXxx  | | 2 2 77gg # # ff8800TT{{SS##**xx22 EE {{yyeeAAvv&& GG ssii++ ++kknnuuJJ==ii@@ EEmmEEnnFF   $$UU KKn n WWRR  o o ;; ]]CC))44OO cc&&889911''NNnnMMTTSSzz""**. . xxZZ[[ddzzrr ##}}zz PP IIee//QQqq__;;TT==77dd dd hhaaff   p p 665 5 \\  ''&&EE{ { FFUUVV~~//55 \\33o o CC@@II33RRv v 33||;;55KK$$   ,,(({{n n M M ++CC__? ? ##F F  qq"" LL22i i eegg0000w w ll!!JJffkk@@CC  ?? 33~~  < < QQ''7744t t   //88PPx x 00{{t t uuiiss  { { k k %%]]B B 66 ))==gg,,^^77%%@@,,,, [[22OOss``BB__C C 7 7 QQ&& 8 8 ^^))##&&>>77]]bb^ ^ "" ##  tt LLee77--11@@44XXNNSSZZ\\@@++gg --99eeRRMMIIjj^^  RR??22@@00HH nnuu ""ss oo&&OOyyWW<<@@   hhtt""@@gg11QQ'') ) SS''   uuOO((!! ??nnRR\\!!PPff >>q q ((uux x  $$llttTTCC``TTXXDDff ''##ddI I 00  TTCC]]}}{{z z gg]]||?? M M QQll @@MMDD[[qq. . @@__@@00J J ++! ! ++eeZZrr88{{&&aa--^^**CC==ZZOO(( WW22dd**qq  jj11  HHnn7766,,dd~~A A   ::llbbCC ??**uucc44..hh% % XXCC--||ll  KK__xxs s J J //[[YYQQ??11IImm##--HHbbe e ++dd;; MM\\77OO  ooww ii ppii**BB qq++YY@@33u u R R cc==@@bb//00nnPP ^^44ii AA88//6 6 OOkkTTBB  JJUU //??!!NNjjKKvv<<\\SSDDVV0 0 o o aaPPffBBii44OO ll((yy\\pp66(({{ yyiiww  00ZZqq33qqqq33++ 55>>^^gg ww qq{{--0 0 ##ddWW yyFFCCyy% % v v ||zzcckk::PPqq** e e uuU U 66TT PPnn CCRR-- uu R R ''``## L L || zz!!OOIIllgg&&66**\\qqEE11>>^ ^ //zz  ))rrJJrraaee  DD__TTbb 3388ffQQ  RR  WWrr))~~YYCC$$ee  **dd %% 00nnLL%%OOll  VV99__@@QQ99--EEMMQQ 44++mmPPmmTTNNFF { { lls s JJZZttIIPP X X EE'' q q MM 44))PP,,   ??nn  ss..&&00r r   ??eessmmEEqqbbJJ  l l jjPPii( (  uummGG||jj``ccggYYw w r r OO8 8   ??c c : : 8844 >> JJ88yy }}||< < ""hh ||UUjjllvvVV))qqVV  TT>>uuLL@@DD hhpp,,  WW__..  R R  DD~~\\++uu g g ``==((EEss33''     ==jjCC$$# # 44WW33oo..44__66eeMM""22**VV//''//~~mmoo,, GG& & II~~ii11&&WW __ RRkk ss ##||%%  ?? OOgg~~uulljj   }}uu? ? 5 5 BB))zzPP++aaPP..vv!!<<@@  K K \\- - V V --%%  qqSS[[{{^^  11hhoo   GG;;ddL L 00ttcc  LLSS   **dd 5 5 ""ccJJiiu u ]]ff}} %%BBss 88f f 00==~~DD r r __PPccff66## 55$$Y Y 227755s s jj ``@@GG++ llzzvv  ==77   QQ qqrryygg%%qquus s <<^^uu+ + ^^FF >>cc??  bbffKKAA; ; xxuu11**f f yyee  WW,,77,,FF33{{' ' qqII__ HHEE ]]@@dd LL66pp77   ..TT $$}},,""++ee bbDD>>rrUU  b b ~~//@@''&&cc<<))CC V V ''XX&& SS__ttOO22FF__EEGGjj BBffRRggddMMff,,nn>>88{{;;[[))qq--__aanneenn""GG[[ll==88ggVV##;;!!eeT T __--YY..hh YY//aaddvvdd9955xx``%%//jj HHmmcc  QQ aa;;((    mmgg __ ))VVllssDDFF ZZ llCC --^^ nnkkoo + + x x  ''ll==ooww FF MM&&HH  ;;w w  AA%% 99oo !! TTiiRR vv<< UU((^^ccBB  11 \\//||>>eejj33GG JJPP22 qq55$ $ I I IISS<<qqqqllK K VV))))v v llOO    ccRRoo,,""~~@@PP$ $ >>00 EE__) ) --cc**__@@Y Y 5 5 tt    @@ssGG  33**!!9 9 223377>>  LLyy AA__QQbbVVkkKK JJdd77))!!77 %%;;``uuq q rrnnJJr r 0 0 ^^mmiiWW 11/ / JJMM[[\ \ 33 ++rrff,,AAyy]]GG    __UU cc FF44VVyyc c d d DDpp,,xx^^!!   00@@!!ttjj ZZrr BBzzBB~~ss~~mm''!!? ? & &   77mm   (({{AAWW33DD& &  ?? ff22hhee X X $$//00bbNNw w 5522 xx\\>>EEzzzz xx::11    ]]zz; ; !!cc##s s ` ` dd//}}$$FF44 nn XX&&}}55dd]]wwK K [ [ OOHHcc hhuu--. . ZZRRgg((YYkk00ooGG  VV77SS44LL44mm88AA~~hh88OO]] m m ;;ooSSKK88ii44LL^^FF))CCbb>>KK <<PPRREERR__VV88mm]]uuOO[[ll"",,11vv,,ppYY11GG  BAabKKDCii WW@ A ,,bb11KK++a a   SS//CCee""GG __ 11RRyy__ VVGGxx* * JJ%%HH]]  sstt:: ""{zDDS S Y Y  }} $$45  hh67  BBA @  L L VW o o QP55AA ~o p  77 MM  ``   l l rq  \\UUGGC C (( %%^^,,^]" " U U ;;  ..XX%%  KK// ef  ;;\\--  ' ( ('II.. kjZ[`_ ijLL ; : )(MMFFNNcd"#{{WW ('00LL)( ^]   ZZpp????PQ""vwmm=>&&DC==98<<88[[,,ccKKij vv88CC&&[[SS LL]]! \\}|bbpquvFF&&ZZEFEF22yyAA**[ZnnllPOQQRR..A@ffWVRR>>HGyyVV||@@YYllppIHbb66II??ww''\]  @@YYHH[Zjj& & "#JJGG..vv\\DD%&hh[[xx[[ GG< < xx&&55nnBBAA`` **^^JJ44PP    nnP P G G mmBBttLLll!!    nn0 0 NN@@ R R 66ssRRWW##66##SS66KK HH < < LL \\//WWiiJJ22RR $$RRppp p   KK ''~~qq``~~HH~~ I I 3388 YYHHVV3 3  <<OOll  cc[[88 rrg g hhjj` ` ^^==hh]]kkRRii  MM ((  &&HHww$$KKooII 11zz55[[==;;!!QQN N 99  w w ZZ&&xx==``22UUNN_ _ VV++ 44mm ??ppRR11rr##''ff++BB ww??22 JJ00ddrr**KK::oo   335 5  66mmcc   MM <<vv{{ u u vv^^ q q oo**{{uu<<__uussss**((LL4 4 ::zzYY88{{WW||CC rr>>EE66++mm 44 nn** 66 !!rr::- - >>@@DD**44s s \ \ ;;;;FFOOmm 1 1 BB) ) CCGGiiOO yy55}}9999* * ^^''ff   ##EEWW`_oohh     77i i TTLLyy%%2 2 cce e uu LLcc  E E WW BBccrr--jjiiDE **WV{{  !!UUNNLL}} II O N IIDCooII N N 88ttss884 4 FF$$utz{9955R R JJa`$$llII^^#$  ii56--ss''STJJAAOO~~CCUU,-""++`` -, xx .-LLCCJJmlRQLMXX::23  22`a88[ [ mm!!))=>44,,87RRqr KLJJ;;JKno AA??RRPPDE--  ZZ  \\ijpp||utvwvuLM0033&'bcZZNN"" ##YYkl%%ww+, Z[|||{vvSR|}|}[ Z  ~ OO67KJkj     ##==d d 7 7 WW45no  ?>II PP,,ttZZhh..^_99CCDC hhGGrr!!  | | 11__$$~!!::& & TSab| | llll<;PQ DD~~MN   KLED  bbTT  E E ONTT.-BBLL^]~~bckk T T dd{{ ,,SSVV99,,ZZ>>00ZZzz__~~HHzz'';;`` tt{{  QQ 3 3 oo]]--bbl l XX gg||   QQ2277??CC  \ \ \\bb\\]]cc,,PP--ff22CC00II, , jj77>>KKyyzzBB__XXGG [ [ >>33eeMMmm``//WWkknn  ))CCccZZwwttRR11PP~~HHrr//cc__LLyyYY**## ww]]oo1100''00pp::ZZ00NN0099  }}..CCLL??22qqeennWW""PP{ {   jjmmAA))[[%%ii,-5 4 ( ) ZZGGJJ ll8833::65NN==0 0 \\**kkii^^22 VV{|8876cc-- N N nnpp""BADDyy::%%CBmm``hhAAIJ|}"!)*ii33cckk10oo@@jjll::WWCCK K - - $$yyKKbc}}''RRIIJJ44EEPQ MM`_ff$%vvyySSuv==uu""~,+11UU 44Q R DC  `_JJ]\||66@@}}sr66??##hgyx77 zzZYkk;;` _ dcooXX i h Z[6566=<kj++++77%% MMffkkonZZ @@77<<,+yxaa qq*)hhVXdd44  ii89]]{{}~++EF  }}56 56__?@^_67FG]^     9:mnst{|+, EF,.STvw&(;<  XZuv <> npfhcdbcBC%%e f 46lm*,>?z{"#u w -0z|y|BE46 :<*, LNmo "$"$    ) + NPUWQ T XZ`cpry{AD + - .0*,gjhk SV   \ ^ (*`b24 57kmNQBF5 8 +- [] z } }JM&) ce 36  =@z|  /1oq*,>@NPsu BEik')$&LN#& @B^_ )*YZtuOQ`a?AGGxyHJ[\:;GIgh qrkk]^12 bc++77eeZ[xxuu,,LMOO    AB<<xyMN&&zz]]  @@}}-.   __bb  GG{|TT^^  `_** XXWW&&aaSS99eeVUJJ~''[[ 4 4 -,VW 88KK;;__//IIXW\\[Z** ddab@A}}pp  0 / jj=>%%yy??llDD66--uu  --;:MM[ZxxnnWWBBrr88 xxqqIInn{{NN2244PPNO nn++Z[++66qq66eeccddYYddQQ``eenn??CCQQii55@AwwGG2266mlhh,,rrNM!!$$ggHH@@qqUUqp   nn&&iinnLL{{..jj]^``ll''@@OO))   rr%&XY{{y y Y Y &&~~pp00//NMGGpp9:pp331133_^;;TT==TT RSwwxx; ; 22gg++jj rr aad d z z 44KKTT''+,wwyyp q =>21,,YYCC  22MM  43QQxxh h //87ff\[@@  n n ~~@A}~PPMNkk,,LLyx11ONSRZZ  |{^^@Arqccon{{ 22LL65..>>rrkkii  }}LL   hh{{[[llyz ''[[  YYR R 44ii}}1 1 ggppoo\\$$ZZ55k k AA55nnCCTTST0. feEEM L **{{NN{{uu   4 4 ,,/0( (   UT21``ggQQ::##*)  &'&& j j WW!!66  @ALLCCppXX00]]--r r  ! *** ) I J  zy]]NMpozzMMon  g g ((k k $$JJffRRyy@@TTtt32SSXXvwg h ppE E vvXXRR  =="$}}qqssII77EE OOmmee  }},, ""MMYY||ggdeTTLL--99--<>^^YYBB==TT~~22GG11??NNqq7733}}88yy88JJ??MM&&==aaVVFFffOOXXMM$$HH[[&&JJ'']]NN55UU,,[[JJ[[DDEE))99CC ..[[6699,,KKll55UUll229955JJ FFPPRR MM  jj22MMAAvv>>NN22))bb&&""ii**)) ll00SSaa$$ss----ooYY:: 88yyllaapphheejj((11aa>>==  F F QQLL ``LL44ff # # ,, "" rr<<   ((TT II11ppxxFF&&>>kk@@||O O hh WWJJYYYY..~~,,]]((""RR  i i Q Q KKYY$$KKqq QQ &&**QQ++DD..SS33  ))RR##~~^ ^    %%l l **^^zz  &&k k   pp%%oonn44xxgg~~bb ] ] ??BBQQ]]##qq))----::[ [ 1 1 44))44CC##%%XXssG G //77uuVV00 hh++   !!rrGG||{{==lluuxxcc77* * vv++nn==mm hh{{ aa**PPhhcc //bbYYAAssggyy====ssLL__QQLL 33  //0011 pp99GGii00MMi i a a %% xx--TTEEyy00}}QQAA EE5577  vvDDzzxx\\WWSSCC$$llm m * *  8833__ww KKvvbbXXwwZZ{{++ 88+ + NNuu11~~55::xx**99   77EEIICC__FFNNuuiiuuHH~~11VV{{UU  gg^^IIggJJ ddyySS..WWhhffyy$$kk~~))rr__44""cc 44KK++..{{HHuu^^KKZZbbggeennll~~LLGGxx66GGNN  //OO88iinnXXHHllFF  kkjj99@@``}}FFQQqqkkUUpp88LLJJRR==yyqqRRppqqWWbb:: 33@@YYii))__hh55\\\\99``YY\\``//HH..ggkk%%PPaaIIqqMMFFOOMM::~~++ii llNNxxhh))~~WWTTII &&##~~hhaa____ jj 99OO66{{**22..ppmmyyDD++;;L L CCzz 88OOoo}}AAff **TTKK))(( MMYYF F EE44::VV{{$$FF11 lluu) ) g g HHbbwwF F zz;;$$XX<<PP  PPXX  ~~vv ppbbOOmm}}22RR"",,   ffKKtt**YYNN]]22JJpp 5588 $$DDwwSS   nn==EE^^cc22^^++\\~~ wwllE E uunn  //hh((..++11&&  22  RRpp++/ / ooYYNNii GG jjv v N N  .."" AAppDDww<<SSSS y y II11qq--rr  bb88yyHH**!!99~~33--nn- - ^^  %%<<8 8 dd55HHW W VV%%ZZdd ssbb,,%%OO55&&  OO''ff""7777//~~u u ++>>GGxx??MMVV<<vvnn@@99==DDvvxx//33@@yy QQUU ``ggiiYYhhRRLLRR,,11hhKKOO""{{::``__]]))ll99uu  cc''MMJJ))[[{{''UU<< {{wwBB  <?fgQQFF\[&'11qqii  YY  kkfe>>UVXX  HG--UUEEv u   klNN&&ssmm=>uuXWQQ  GGGG8811@@--[[ 43PPyy::FFMMtt??SSFE C C SRIJ}} ))zz}~ }}bb+++,  [ [ {{RRTT cc32   JJ|||{ ff55""OO! ! UTK K !!<<ww' ' ##XXuu??``PPLKff))KK. . ``66RR~~ggBBSSwxqq MMBA"#  ||ZYJKkk00ddTTXXXX##-,== aa) )  QQBBll$$LMuu pp55''B B _`RRIIxx   eeCCll//XXUU **SSff$$^^hh66xx%%11>>+,MM<<xxWW88;;??hh{{====66OOppjjSS==77HH  0099ggkk !!VV,,RR22--66TTOOppCC&&GG{{!!``11&&DDddqq``--GG__VV~~''bb==dd22<<JJEEll0077kk""SSXXDDRRIIGG994433 >> aa""  {{## HH]]AAFFNN]]  44~~ ii==77!!  ??MM{{ ZZ11hh\\^^RRII..22ww==EEKK||[[::XX[[MMZZYYww??44 AA>>FFYYAA""uu++\\::aaWWGGBB``==uu&&UUuuGGzzEE||''~~}}@@TT[[{{ccSSddXX66WW++""bbggbbEE>>NNaarrrrOO##mm88]]//[[!!""mm))nn??uuDD]] 33''nnyy55__==**22ffWW ~~KKLLww``))}}66mmFF((ww44''""oo ||<<QQKK99dd""DD@@33  ^^ST,,^^[[wwMMuuWWdd**VV,,EEUU11  DCJJ~~01882278&&~}YY**TTkk{{aaTS,,QQfgcchhmmHHUUvv99LLTT22{{wv  ??FFZZ>?  $$pp@A$%12  {{\\NN67OOFGttss!!qqpp0 0 <=[ZjjBB K J && ;;0055<=iiaa++ccWW33RS}}))) ) DD./ tteeddhh{{uuEEII22}}qq{|~~++ghmm44YZ##~}FGts:9[[<< j j FERS{|--HHOOrrMMKL22ww\\RSa`*)yyi i {{GFss77 !"..[[!!ccNNiiQQ}|78"#  ss''22BC==st999:nnxx\]WVee22ZZDDmmJJ++++SS\\BBPP,,SR>>ppjj33AA00^^ VVppKK%%wwnnrr==aaqq!!;;>>77$$XXDDll;;{{4400yy""\\ JJaa**--gg YYTTcc 4400xx''zz!!++ mmhh''AAUU  ##22  \\KK%%!!::::gggg66@@bb>> EE))##ddAA[[^^&&NN||;;ccEEXXeeqqqqLLoott))NN==CCww \\xxvv::__ww33]]__::FF{{**::CCpp''RRzz,,^^//qqHH  nn##77PPbbttMM::QQ&&AAwwNNTT44>>>>66&&[[rr::||++uu4444zzYYNN[[  ii FF55II##$$||OOPP==yyEE??{{==xx55vv,,''1122NNgg??//55hh44]]wwSSWWkkEEddZZhhMMppXXDDkk..~~oo--44QQ((GGCC77hhRR))mmZZ}}33PP $$..IIAA((kkUU qq!!<<YY,,00 TTJJnn;;>>??~~ZZ``##44VV::JJ&&##jj;;uu##__@@ZZIIII\\}}>>IICC66ttUU vv//aa{{]]..}}``33&& "";; **CC>>::aaTThh>>KKnn>> hhqq''55tt..77$$UUddOOOO--@@UU88 ))@@ii   %%eeyyHHUU FF//ll'' //AAqq55SS``00RR--$$ffss((++**ffllww[[HH~~))CCxx__66DDvvyyWWaa11\\GG<<uuqq..kkllIIllSSMMccrr5588##AA>>tt{{,,VV]]55""ZZ||qqKK pp>>;;ttoo<<EEmm66**//wwAAyyDDTToo``IIFF**UUcc++,,FFii ))ggkk**>>RRuu[[44--  JJ==rrvvGG((hh++[[rrVVUU``iiqqgg]]77ll~~WW88}}BBUUuu99SS//cc22DDzz)) ##77__ || ((ooggww@@&&77))MM  77]]bbDDbb%%@@oo**HHkkee\\MM))00VVSS::ff44&&bb $$''TT44__""NNVV ggIIyyooee~~ HHffRRddGGEE ^^**~~  NNnn@@..~~pp^^]]55||FF  eett$$**AA//  lloo~~MM;;yy""yy11RRff&&77 gg__((::RR,,66FFqqNNPP  NN dd  DD--ffTTYYttll))YY<< MMJJFFYY}},,>>SSZZ22  XXRR!!BBTTFFVV]]44ll{{TT  88GG443333DD--xxuu11~~== 44**//99llAAGGnnAApp99GG==55%%MMII||YYZZjjBBss00cc..WW rr''::!!55{{**ii~~ssccdd66$$OO8899;;  zz==rr\\YY<<XX__MMrrpp__QQ||yy==!!cc[[QQii;;;;((BB{{44ppbbYYDD aa@@66xx PPFF]]99>>%%**II++@@yy..]]55}}SS==hhee~~]]%%<<__11MMLLHHJJll''::PP==gg__WW'']]TT  XXff  66qqBB``AA**$$yyqq00yy11AAuu>>EE fe&&OO||xx]]JJSS77~~@@DD}} \\AA   dd@AGGww  !PPUU##ut==TUz{  **KJdd]]xx{{BC-,99""OO@?..((;:PPZZ;;zz--KKtt3345GHYY!!11IIjjAA,,hgNORRvv .- oowxkk AAYY1188BA$#UUqrmn88tt&&@@JKLLji~~@?==01!!WVAAjiXX((``BA66//00TTmm NN,+))WW00]]$$DD>?@A67KLCC||99 1055ppMMRRxxrs,, --bbXX=<uuXX//WW"#yy%%**[[VVrrkk;<AB33 ((\\TT$$''0022&&tuCC++++@@IH''rr77WWtt  zz11 ..$$yyVUee]] BBvvZZ==WWwwbb 66=>..6666  kkwwed  ::}}9:KKvv>>++qq))uuff  vu~}HHee~gg00[[00gg77ttHH;;ww45wv88*+vvjj  {zQRWW('./00UUMMRR11YY*+))QQTT  ttaarr^^[\bc98}}!!JJWWAALKVUbbYYmm,,fgHH}~%%XY??bbMMtt--zyEEPP'(('*+``**>>z{AATT??WWrr``^]oozyHHSSED))VVCC++00fe--iijj;;HHYY uuxxppdc\\GG"#  iiRQ==~}hh::]]'&JJGGghlkQQ||OOqpJJ~}UU<;^^BBmlEF\[22ZZvv**llJJZ[vu HH;;  ++  wwop==EE\\]]ee""EEUUSSbbii[[iiut KKdd,,eeGGjjjjII55xxQQ\\HHss uuZZ??%%""ee22{{YZ@@!!BB  aaPPoo  `` $$;;..rrcc!!eeJJ..yyWWNNll!!AA}}OO @@!!ZZ 66LL^^<<NNYYKK)) bbIIpphh??||KKZZnnhhaa''eeee*)PPssts__FF**98__tt87''^^]]##::__kk__II!!11rr''EDrsttuu^^|}xwggWWII}|xw./@?KK@?<<ttGGrr++vv??WWFF||<<DD$$CBvvjj"!??uugg  HG~ST56||bbmm00OO..55hh{{VV SSLMhhBB** ZZcc44**00eersTS[[FFrrkkMM\[qq MN88--__aa43OOsr((++JJ;<xxOO  zzooTS??98YYuu^^==NN==ttpo\\__JJedLLaa::11 WWllssxx@?@@ IIihccbbPQ{{ooJJSR<<mm..qq22vvRQqqon2100,,hhVVWWppMN32<>77  NNWW__11ZZooccttiiCC99llff""((AAPPCCGG66 ,,bbQQ88??::pp QQ!!aapp""^^NN@@@@SSXXDDaaPP44ppjjYY@@>>,,--**__<<aa;;>>\\II11]]ppBBmm,,ggXXyyuu!!}}[[uuqqDDEE~~SS]]IICCxxUU..UU eehh##$$]]vviiaa88ooooMM&&~~LLTT@@@@nn@@qq%%zz&&~~llNN++^^22((OOYYJJ__iiCCAA}}55**eeKKuuTT''pp""~~88\\~~EE::QQ]]FFDDNNAAlluuSSWWggPPss{{%%pp>>~~))**55  >>ccLLyy^^ss::ccVV88hh88**\\qq!!  II++||88QQ--ll}}""--ggEEMM99PPccnnWW``}}ppkk^^**WW0066[[OOzzss{{--st@@XX##%%bbII^^||DD*+mm00]]mm99&&tt__4433lmijHH44ee''SS&&``~~jj jj770/uu\\4433xxOO<<@?bbdd2243VV!!..11cc((XX77  UU55LLJJ::ggVU[\""hhIHcdss  NN::JK?>aa::ZZ99 HGz{>?ppss))LLiistkkttYYjj-,! ??;:ooXXggtt//IH[[vw::  ==vvstFF)) lm gg``>?01&&nn_^``mm45%%vu::FE&&'&ee 44^^{{MM76xx[[XXwwccVUCClkPPRR))yy@@zzRRmlFF-.GGKJ:;rqyyDD44{|::mm10((EEBBuu55ONzzNNYY>=lkhh|}  ZZvv[Z8789]^::67rqppccTTrrDC  MM88]]"#QQ~~43[[BBEE 00uvcc0000jj,,]]RRxx''21#$ttEEjj{{@@SS66effevv99bbHH55hhff;;rqtt77DD`a&&qqLLZZ''LLOO  87FF''yyAAyy55$$QQ(($$$$FF  [[~~ ))__``..23JIGGcc __]]$$77''  NN99qqghTT==21PP89KKSS&&[[99''""PPSS~ww;;``**}}zz\\>>MLfgpp))iioo``YXSRpp33>> --MM|}^]))^^QR}}{{MM  99VV~~?@?>oo&'66,,>>  ZZ//66==;;))CDggcchg::jikjwwIHUT"" ww))utiiIJ>?==xx..99++hgqq*)ba[[QR-,;;ff<=]],,[[()zzbbQQ__xxQQddMMPQ77}~rsaa  ,,ZZ!!$#nn++56DDee..PO||FGrr@@ssFF??}} 44jj22jjjiAAaaMM|{|{11oopo\\kk,,    ## DEVVGG__++CCNN[[XW//jiAAHHhhVV33__>>ss   33||SSXXii::,,OO~~77  YYmm--++||kkNN@@66hhAAnn77}}ssRR00\\>>``!!ppWWBBVV**IIJJ$$EEZZ\\>>;;GGRRmmJJww"" ttjj;;aa55::44NNSSssQQJJ77++''((>> tt99yy33[[ ##;;++SSDD aa@@00ggZZ((~~::{{AAmmww$$]]77mmnn77YYYY^^<>ZZ,,  mm7766''UU~~gg^^DDhhHHJJeeaaSS99eett$$AAjj44&&uuqqiiaaYY>>jj00..##qq!!''rrTT  88MM44==WW%%$$**MMQQHH%%22``ww FF@@@@eeEEHHXX33RR99MMxx``rraa kk44gg))FFNN[[ooYY3366iiAAMM@@ggff;;44GGTT}}aa  EEPP++''__NN]]rr--22!! xx  zz88YYqq66GG<<\\99YYzzGG    ||xx\\ff``99== ttJJ88  ll22..oo]]EEKKGGJJgg __//tt##@@zz}}ff!!993366RRVVzz||""QQ``''yyGG77YYffyyJJ__//00OOgg\\QQ --VVii PPCCZZAA88TT%%6600rr66 CCVVhh$$mm##00zzIIHH||mmhh33rrAAyy^^""MMQQ22CCyy++%%[[nnii  99$$RRvvBBJJ99WWMM--]]33qqqqii ==88bbmmQQGGllSS~~cc  ff]]  RRTT ZZyyll((__mm<<SS99__&&ggxxtt** KKyy,,!!``\\  ]]88--22QQFF**^^{{__\\qq##~~XX{{mmII@@QQ99##KKMM\\[[,,uu__tt==**ffFF66kkppCC88TTppffxxPP!!RRZZ~~ddRRzzll>>zz$$RRqq  ==RR22FF77WW@@++$$ssff22}}mm||KKHHCCBBUU8822eekk~~<< IIVVxxDD!!llDDddFFii  CCDD;;&&"" VV??(($$LLEE__DDsswwXX66;;eeCCCC__{{mm55uu**((>>II||,,::ooWW==zzWW aaDD==&&JJNNVVYY[[44NNuuRR""SS||!!NN--uu99==""55((}}QQHH  OO &&]][[mm\\ffNN~~uubbyy33~~ww~~00ZZBB6622ggoo ee>>77 aa((MM99ssQQBBAASSZZjj  SSpp  !!ttYY66WW ii""RR&&ww??ZZ&&,,EE++XX))<<XXMMQQ@@44WW22ZZ\\LLFF77''--&&**FF<<::((**HHppyy[[ 3388 HH11..ST<<KKKK|| ''{{..GHnnQPYYpqZZ  ppAB88??bb// pp56 pq<<89-.z{-.hhvu`aUV  ;;YY??GG;;xyMM  XX[[BBaaHHUV&$ll;;::ba77cc -,#"HG~~}ml32ed98BAut1/CB"!|z65EDlkrqLK:9[ZvtOM][ ^\A@  31ihGFedsrCC>=HG\[`_A@><43TS.-86edIHpp00(($#::``us66NNggUU  MM ZZvv>>\\IIFFHH<<YWC@ECFEXVqp>;NM;8{yRPQO&$_] ><@=zxkjsqB@TRkhzxcb;8ba53cbkj$">=?=zy$#ED..76:9a`! |{SR43!!-,EEjj66BBUUjiOOUU::YX.-DE;:yy}}XX!!%%!!XY||MLSR\\**IIqqxx44982121}|ed75IH@?YX@@ooMMhg:9A@'&IHutsr``qq55OOEERR%%edTTnmjk>=00nn  NNww LL``ii./WWABuuqqHHff   44ww``GG==<>NNttXX[[oo::FF__$$rrAA//mmwwCCMMdd[[ss`` %%~~UU .. LLyy XXss--66!!aaSSxx66dd||  @@]]ppVWaa##PP YYww ss  PPYYUUdeccPP++DD'(OO99VV<<OP22  ppeeYY\\66PP""]^[\}~<<RRLL|}MN22qrvvHH rrFFPQ55MMeeyykkYY$$44((EEzz  ZZ&&  ::FFZZBB^])*&&qp]\ee}}*)ff(';<==vu??IIJJ`_nnGF+*xx{z``10ihuuTT_^ihvuSSlk65nm  b`'&DCKJ.-POkj43,+>=XXWW KJvulk*)55cb?>RQNM\[-+ %$  nlQP-,CB)(#"a`MLNNFE+*32dcLK+)ihJHutNL:7<;wuONkj@?hg;:ml_^rq/-BASQ SQ\[MKvt_^CAmk#"TS ED97;9('YXSR98hgdb&%}\\jjIH?>&%=<A@##QPllnmca  yxonssjj~~=<IH:9 }{LLXW&&jj``}}LL$$~~!!??!!,,))  kkhh))YYeeXXff  VVYY44UUXXTTbb @@@@XX)) %%@@ 99XXaa00!!FF!!KK>>AAii\\AA __''GGwwnnAA77 NN,,NN**rr  MMSSJJll;;FFrrMMIIHH{{PP==vvUU``WW..;;ppoo>>{{}}VVXX&&QQ]]{{FF"" 22wwYY&&\\CC((EEvvuu__<<OOnn}} PPggttMM''SSkk##^^SSpp~~++&&89qq--  00--77 hhFF%%^^//JJAAggNN77lk__##FFBBnnxyxx./--!!YZ__--TTuuffss<?FEFF__qq#$qqRR..$%;<``JIaa55eeFFtt[[CCUU<<NN__<;44moll<=#$aaON6755$#10^]QR^]JKyzon{|DCts""ppbb>=xxuvnorsNMfeff?@VU yx89HG||""66BB1177"#BB!ab.-vvLM  UU[[66<<  ]]\\??rq]^wv^^78NN88dd%%JI [[..66bb  99**%%VV66%%&%iicdPQvv10**{zZ[22vv##UUGG&&z{22,,jjnnjk ppNNnnRSjjopDC22::GG BBLL''VV}}))&& %%99aa]]II33yynn33))??NN))EENN ::::gg::''mmYY**kk33RRvv--pp""kk))__II DDjjllyy@@IIyy;;<<yy>>NNBBwwddmm&&{{55ppZZfftt{{AA88ff//XX  qq,,55^^hhjj8877++))ggqq--KKEEffTTmm99SSUU UU  II77OO77ppww}}44gg]]EE {{HH==yy99TT  UU''II<<!![[ll++++wwhhaa99DDII}}pp@@;;~~77 SS``AA  zzEE??SS!!AANNGGtt))**<<HH::{{44;;VVZZ""""//>>44ii  NNEE    ggMMttddrrBBSSCC//99TT]]""xx PP@@//qqzz zzAAMM``IIWWmmUU  cc++--UU gg44yyqq>>PP&&xx//XXrr'',,!!BBWW ^^  ww==22aa}}99ee--rrAA rrPPQQQQ33  ggPP@@AASS77kk__~~XX~~mmxx::wwcc//SS,,``;;))vvzz``VVMMuunnttHHaa$$^^tt>>yy~~FF''pp::iiaa22,,%%__cchhaaUUaaKKWW--iiccLLeepp++..99uu''UU--ccwwyyXX99ll !!==XXHHuuII{{55ZZ DD^^ ssFFyyoo//oo__``00wwnnjitt((::::PPWW<<pp==\\}}ppgg  ccWWzzmleeuu!!poFG??eede"";<:;aasufg[\BBwwppvvLLiiPR34  33mn>?~GHPQ|} wx??77``55dd))BAih~gffgooNNihtsut/. 97QO]\MLutus}|XW  }|!trYXML]\a`((43MK##<<ML;:kjbb[\qp79"!)+$#$$acLL"!cc`b{}vwFF46]_[^"#Z[DENNKJil``ffdg]]qr?>NO  "$$VU^]II34ZZ pnpp+(((OM((MKXV?<**XVLJ mk/.-+nnoldc?=]]SQ`_76  {yHG{ymndf34OO"#jl65UUvxKL[\+,gh^^WWBB8:mn<=##LLDDmmaa@@qpYYHG)+LI+*tt0/wxQQ,, 88{{kknmpqll;<ed<;""bbefwx56GH_`|}GHQR~HItuvwffab /0KLwx^_DELM-.@@bcLMOQ=>~'(MN%'EFRTXYz|$%NPwxdeef}~lmac _`ps=>WX_`df-.NOXYuw~ ^_AB45cdpqMN""DExy~_a()..lmwxTT>?&(>?nogiCD}yzIIvwKKpowxPQ&&ST&&EE ((??HH89#$)*RSrrij./aaWWRRTU!"__wx ]^ee BBSS]^Z[;; nnxy+,pp[[,+)*xyiibbA@yy,,<<ww66$$OO-,yy67^^yz./YYgg SScd@@##__KK))@@wx89.-deAAGGSSWXuv  LIST*INFOIENG IGNRBluesICRD2005gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/sounds/connected.wav000066400000000000000000013671641326020644600267210ustar00rootroot00000000000000RIFFlWAVEfmt Ddata %",,96JE^YtoL:R  Ov  (  G ? b fx {iO1 t]D7g ? qA0 !!!vQ"" "0 "H #_ $#p 0#z 5# 5# 2#| )#w &#d #U #> "& " "]""q!&!6! 3p  t)FQr"o+[> 4I#[Mzchq9EOQLE92*Qou K:  [  Ny   ;*  `P p{xJyw(uqvltr~ 4s  s u I (  H  5 _N  4y`)Y|@&dC Cwx5Jg|$W@gz-5{IX,l~@_ {]mX;@f'x&T6/:;q9B5)o"m*u?gG>|4ZBN`c"kOzEhCaH^Tfhp||) tlIGmk b5 KYG'{#aUM'j!n^`nn/m3g:  ) 2 ?m ~ 8j  j   \q f ' # q  )z [ ~fT]6+S}? *4L/ b-?Sn;\M23*"j~ u \ [  6 K  } SX>t#; {p!Yq:J~yX8H0}6yH :Z  t Q h , kc  lD oV>eE' ukipk}2bv,wdMH/0    ?i}JDq$Ee{J Z=+Iei,Od Ag *Mw;a'Ieiv {v;b?VWmF/1r 9s{Dp _ l ,G  * H  z <X+9!3Y  U    : 1 XC '7 c < ?vvEL2mOF,odG!$Sj6jE'|2NO"W \hEb.i!{^.@O]rH 1*Uz!#{e)44-Wns6K&[|8~[g84dT +VP/6a4$LMou5F`8/:zO_A mE.Sog]z\cgiaJT)=5-$@s_@l88? U o \Us$ ~XegucI2vKJ<QCz  k 6 e1   I    .*KqBK* 1xODetq"/:Fq?*O]VX$>~JlWcA;+U k  G L   e i ~I9 1 } D    l 3   t * 5 YH !i & ^<[8zS1oH-]u$9jZB. Hu(=`t8=^#|fOR4(M lLx)+L^ c?9O^]0z-X:L1p h<<j4klP3D qRL,L 3[c fIu{1^/Rf2Q.Axsuqqu8uu?sniyd_)dlzUd/nJ\Q3NI+>'vB+$i Z02Oye] ma 6m v z rY[.N(Z>y0a`[2T%N'?E) ( Y |9   >   v  .k J jme:F`i,m#:#SEjc R\,zekARC:i.D  } J ^  > J   P |  n  dV ' b  k [ u   c # / Ug 0 %f q[PG6$:%ph9s)i7g 3yM F{q_vG+)TyEmC |R- \7z Z7d$v:Qm%W#D}j] :CoW= Nj6*cf5K2o O0qlU 5@r A!:boz*4ZwS ? OY,n5F/LX0J>\8B0 ! a1L5}|KtHF1S c " rKJ$f#oEc3_41/sQ!#@L2GER$& s  / Ck Y p/   }  k  H$"GW )0I=L_gx90<FWxaaZ.F-4-sL!v{^o@k \  ~G M ,  x D  g  R} Q F$  ?  By L H  W  gH  { } )S ) V (kt``G)T H`1FXwaR[H'A>><k9>2 (i+s`GRb=Z:rT/ b8 x?e'{5h-e _P5 ~3eEB<V/Y 4|uaF-X>|PzuxY:5<_Gk#9YX~eg1u|o hheccr`^8YVTDTV ^|m'I^6NXQ ]]u2ku`Rx Q+ 2 3 9cmdvjW@~gL>:6QN5s.bgf>?n8 d  - Cw ^ wJ  $   P   -^a/}7d'@^={K5 ]rwqtQe.YUQ|aJH-C : )  W  -  g  LX . 6  (  !h @ $  -  7h < G [ s} _ F "3  O (nyhV1 fbr R4b w/r< }NzW0E]@8}A tY];=c-[1s0ci*&}cF"PjGj' h PmO01rUmMA/$`7n B/*Hcz#3Y;[~>DI0hlST?.N"D* [xF 41VQ{k45AQc)nPHYVWg`M I a c D B# (?JzD~zX7!eaZTr` xI{&B nDk\.y s 9 R7 h y h   n ~ h H& P s   F   { 3 [/Jfu i6JRNuTG7@ :  5  3p Z -D +    k v V P 3  6   | Y 4     z W 4  $ 4 L cz l ] N < F)  $o~[k8nlo>~mIY@"[,iCW\xbIb.)yqY@8 W^Z4`k5Vb6v$y hw eTP@,5~"hf F*N.h9x2KfYMW 4qO&mTQM5zTP+/ f@t:wm!zI4hRvJ&x+UCLYZE'U # Su C q'(}<KJ~{&Rpvo5I+FRxT3 #;< O ^ kW p p fT W @  3 V q \    [    = 7 S Wk   K     ,  7  5 s 1\ D ,+  (  $     q ` I j 5  R  :   j J '  q  j  hf M k4  v  . M pp X ? 8!  wht`iN@6l1..m...r)!" DT~\6f6ifR-<&q0yiE= e|)aF-t7Fk?DxGjv~elO>/WF3{ kPc7#D~Y-C4_zvg k1E[2wXVJ +a\u&no,Cy[*yHQx5ny= r1Y7[#\1 x\MNb6*\Feq+L=(k3%aD_$o1! P k j n v4XuQi~NfyoOb?bBYI=A#N65Z zGK(,;~JW'^{^Y O] ; #  4 Z sz :    ?   m% "> T o 7   &  [  ~                w f S ~ t 9 h Y G 4   v  \  F  5z h $\ R M H F F F F C A $9 / 1#  C Z x s 9b S mF < : P7 : < D? D F HF A < K0 ! P`jLC1a2xrIY>y=wFRn8]7Y m/eLd.0`6>3,yr cUkH >2V*#9w&*X4AP8ar| kd,jJh4L\ZXJvEQd(|hWcHA@7-&%wq z/C^4x&QGdj5du$*c8K`o Z_  ( X  [z\M'aO.$!xZ/9'o!]TDj#"l9DfT K  4iEWaTfc\8M{7! K p k 2   x 8  4 hM f   *  z   I/ > hG O |O O L G @ ; 4 / ' % x" % o% ' a* * N ' ' 5 "     n  S  9  !| r k c a rc f fh m `r u ^r p bk a gU C u2   . O z  I 1 ~ * - u 5] D ) @ W Fq `N;l':To"EMPp?{ DqeS)8 h#FoVV9[]fVM7#J5x^(>7FW$frlYPS%Emb~:;{nI-*xrB` `d= &hQB2" ,g'Vp%DJFM/h&7TR83 WY  6 assC,QB_/5 Jtks^V;.GF0#Wfz[ 7dJYfFmpp"feR;Itf- v$ 3< U n c   z #  k4 P c ;w  V  h  n  t  o  k  b  V  E 0  h I  )  z u r gr u Qz  >  0  $   | p a *P A 74 ( L  h     K# * / "2 2 h- (  _ b  l u _ |K /7 &  M IlvLG)cR4 iU5#lK?YwCeVH_9%nv"wxW$9tcN3w !2^FWfKu810 H:rV]>-sDH lj= b#q[rG8`*XPC,'1QVtW5n}1#\7m6k!J9j l p !* Wk (.=gp%|y bo:Q zI[NfF67{yG+s[?Kp7r %1;tRftG~|dmW>M|a(.Gsb3~^ r0 N n _   $  C  R  X ( X/ 7 Y< C RM W Ga h 8r z % } [ 9 |  w u u hw z K  0     x  g [ S Q R | \w r lp p u z  * P ~  T u >f U A =-   E T  k } l X GD +  Ob8\ /R P!W!],v:`tE.,T n.w_6C(3'pWB,2wFWaimz]W_ J|q$3sL FEY\&"mqdL)(|qnyaoeR^Y8TT!T^hv NH=li A{u!TCtt  B ~QN P  M A r 8c X?MU;6\bC_3(|E`n']{]Ak\2MJawY)l|c&C\a4+Wwq0^1QthP }& ? U %i } 2  =  =  9  0  &  ( 2 < n C H N M P , U Z  ^ u c k Qr z /     b  H  2    | }    7 U ~  E & n  u of W H y9 **  ? ]  p JN +  c2`3U+yH}Qu$<tDL* t,Md|pasRC/y" qcM5}"j&;eH]D BP|@^'_m+ ]}[:^QI>,~vqogotY~c+|=,l@2d5f(~Y"'[Q$ nF  pe  , .LlZ~K`*8t [j\VFw(;LZ .8{!Df:x7w#G*-(U Cwd5"JVmQ ;m`f 8$ ? Y] x r        ( 7 C P v\ f au  K . | U  3     b, 6 E@ E *J O O Q Q vO O iL L ^L O YQ V W[ c `j o mw | + ~ Qw m ~` T E P6 '  8 3 @ Wz f P {4 0 ` i A k 2bs3K!m6e?K =cC"e~2DwIpf_BUKA592{/-*^-29DCP_'poYF*C8^|/0DxD&dg(hW*jf-Bi:Bc@)yjYL=t4*S"0 *~8Jc#^UL}GK}.8Ct>OYq 3P 2V  MW g)7p(^qBF.o0SH2o^+L/+V]}&f7*Pmds;~ xNiR7Awi 89`QB<gI ,< _ ^     ! ( .> R 6f w :  5  .     c / C @ O ! ` o ~ o  P  3     s  ` L ? 3 - + 0  >  P  i  J   ] r Lc T E R4 "  i  D h C v 6 zx AK  pA`,ObB"M {3oT9O cpnc|L.m K,o R4Jc<|)r'Q}ksI$=2mm*"ek0+q [\+o;qV=*fE"gA'0 *TLq)h. _:\-_jn*pa|[. f D S P <mh)x2pR(w'`_7X fX#&G2b;`oG5V\s%k; NM`8 "Rt=$HIok o0 S x M  w  % &F a ;z  J  P  S  Q  J/ @ : Q c $ t  _  @   ' 1 s8 ? YD I @L L +N Q S X ] }b j qq x k f g o  $ { Gn ` oQ B 5 <'  x  `  Y  ih L /  B vw 6M # z > n ? a-q;]:Ez2PhO9g t u|lphfVfkp8wvM#`;"1zCTj]@=,jz!Rq@:8h6AeYuy5W;,T.yxM "5aDS],bob]S?D.AT*"\C=g7 N+ S z >  w  < 8^  V  h  z  1 E V j ~   x h  P ' = 7 S g {   r  Z  B  -     v  l  c# + a2 : e< ? o< : 5 + ! $  D o  < x  v ]g S ? W)  a  r :L " t 4 u F  F  K k 7g)]8`9P|jV[E1\ U? ].f 74EnYhw@|X6=eyf( _] He|14mf!&_n25#ymB1_0kYoM pcS,G5`}vMb.sh9Gz",ek7.]Fv )0 ]  /  u * R Fz  l   ' C -^ w :  E  J I  , ? G ` 4 x #   j ( R5 ? :I P 'W _ d i p xu  j _ Y T R X c r  ; x ei Z K 4< - q  Y R e ZB  x 3 | O o 1 \ M*  zK I L oLw), CNtOeVHH9*2 vO!T / CYRrQ#,ZD]{6tFZxNWO G^3Aq}7?}ae6 g!kMK4X+mE"zp7qW|+4jKfNv}5znm#ecb 6k ~ + + < C[TNv7+ m/,*{A)U2 hJg gA$1Af.}a;"/9=V@=6&'l7zT6%tPNQ < i t "  w F r X    9 E[ | _  v   ) B ] x     7 u S i b  O  <  &     x i [*7SCMLYaJkpKuuQup^kamWM>2#8c 0 n  z Yd K 0 O Z X x, 3 mr 1@ Ok 2 } Z< -o'eD@' MNG~rj4`VxLE>S611"11U6>JVeJyx=m.G4`{i=wAkZ*F^@ E~J3is2VxMj1=uBM(\"Vu&nd_f]]9]af{nu\@10C;pNd@yy) dRm] OP M . ~T +e x A c"s~M2t7,95?APEm3,{G5fVV%AWFm*rL$lr<T2 HX$8qt6 F x e   z9 #h  q   J@ h t   (  DB ` Y  f n  s 7 U r s h ]  Q#@4E-Tamw pdYPJH KS ^r=era4O<q( [  W} Z 2 a  :V ' t 6 V W #p 2 kl A$ EeWG,ZSB%~yatrt3ttcw|)V~?i'?'XvUN?f%dArF ;=t>!]Px_56v;gh <] f dN:D( }P"`5+~?UgpZY4bhsG 8swc+iI5 6 ~( % q ) $ 2 >73`{Z2r<"yB&zS& zk -mO?}l"D{k+&u(a4>CGFFA&9n-H\X+"`X K  ^  % W /   . C qr   @  k? g    3  EA d S X [  %W C \P uE6(  .;uJVico^{XQRU]j|v j[&O@I1 t A}pgR/ c  pk #?  I { G  E h * c 2 k % } UN 0 emlQ6iZ@|PEq,Rx ,=0QeV}?!Ios;#uTS==o6 B{A5bx RQ6k7$skZ7t3]*e8pExAimn(x^~Jxf={M.<  ^u m [ l  qk 2fTW0q\)j7gJdb #\J>o=0qJ2VPiWRB+x WfF/!wGq= K  Q  < r <   IE t  =  |, V  C  i - U }  / <  >I a O  P  I "B8L9^o-vm)3g:?eDDcGDf?:q3)~ <` qW[@%5~$zyO%% : k : _  b [' o z, F  \  nx K) (3/v]|D!,dBwDn,S v" .:-GSN`on%Fn?f.^O+g;jL9+_<HNv^4@z>.{pDievt`N2=1$c4g7)6kDX=oyDquprRobBK,=} vMX > 6 / ='  Z jC:`Wx\/SJ Iq77fQ,S)V}o) :$5F>U_f=kkk0dZN<i$M{)Qq" F  J  M  K  9 gm   l 5 g R   ## S Q  v  4^ 2  B  J 8 VM q N IC9$80I]$n ~~%>Zsb~Q?)@uS~[6BE^/Z  _ :( yv =8  m f% 4  F iU I (XMj5S?s, Gy<b ".==I^Xg|s (Ge:]:`4 fP'$Y`HGx?WGea@T$qn< _ObB$Q i-Y'RQ&"Bg{ldU^Q>z?&1qm8E}!  _ w  ^e V v D 8 -a q%8DHbE#;J+xxFU~JOv9,NlXp*65-|jvS,V7 w C  W  R  Y  8  8 Bn   4 < sn   =9eh 2 E oB  Q  Z  &] ?Z[qWRK B!5;FU5an.x*&)-zu5nfB\RTF:k+ @o bAB$qV*r fvI*"y${|.eQCF4* m0U",~9HG[te"NQ<-&asRM%Qe$n?  d  y t b 6 I b((^Rsv!u:jf 4[qAFWQ1!`O{)?AVj{av+-q]'B~$"t hd 9  M  a &" e  _ $ ` { )  ~A %x  f T=l%T% D  [ ) Lo l z    0Haz{wpn%,m/1l1/o,(r#} 'AbkP2O&iZ 0]ycGz0p4 b !x 5 m 6`  y m* C  2 + dDv& Y-_vl e`H][i]`els4}Ng~30IJa^x%$MuHk%Q+]G2xsRb cCw/J_goF81|T'1~+AY|urvpm7rwY X19`n$[W;F_A1 ToI ? ( H |  h` 1? b|-@YQ$MXC(.m{IZ#mWEHjV&\'%3BLOVX[lXQ!D8$/6r: J  4   W h   _= }   ;< x  ; /k(gO1\ N x  )  > 5 UM u U [\#>\WmZYTRQOSV^ixy4fOU9~HuP!(g v]Gct;}5Ai + p & { E ? J W - H 7 xXy<! RGl <Vo"4 D#:VUpew(M.pJk 4^$OQU-f81T<QZ]Q7o>meuWk>&w,DZ|@2vPpJ+ L}\,;e}]P (p[Y3  _ ^  = J  } ~ HK`Og" _dOC"; {U\> ArlE>^|d9 o  :  _w3rQD ,  M   MJ   3 g} &  S Q  a^ \[= vBx> d : d   *  9 C cD NTU.EU[lV~WUVY]ckx{l]L*8$H k.rMc(>|P)!{'N6^WJQ i  o ;{ ' | % T -p  U d,K5^!Dg(?Qbq~-D]u*9 *IJk[r@h:`Q#U-f.vRkEx+FS_VCW8-5miC>y,Sj#-uY )Yl ^ F  {" D e  |2 L T c\1b~WbEK4'o 3nkQ<h5q4ORey2yKJr[oC'.   H  m >T   Q l 0 A  j " h98{7:$v`!U/ Z   > j '  >  )P Jj[ci n0q?KtU_xdi}lnnnlgbZP%F:5.Iel>GRh'S ?d`5Rp@1o q.<qoN@J   eU +* a` 6& t<KB&:w`-|K>c16$y+_~o]>dJ5#  /;eEJGMMJC9\,)X   w| R *9   N n 8 S   @Hh.vx#DqC[2# Ya     E@ o Z  n )I g&. 7?#(G((O(&]!gw0OgIr+5gqG@(Y#v!x{:,sJ.}T<kL p  {j L  Q * \ <_ $Jnzpi.aZCUPUNKbKNmSZvan~z -Hc )3C8[UiL{6\F}$^ YAB7~B3v`9W W}@N$.(y|]G"3y""x(7Q"3O{lE{3bK~4mE q`76h(8 7s C `  0y = n CU ^i[M9N)<!c'b |5dtlc#CX_zMC3rO'b k M4 -  c  ' i : D   [MER+isqAc>yE } " V B  j  D l  5 G4\Mdkw{ &0=N`uwaH8-[dK=`V"M|>N`<d>x1:7 S - s  c ;Q  N rYvC -*H_t"*0377%<:Tk>AIQ/L[ok} $Q{>a2d!T4k/xL!q=x67|a!Jn:$q_`=PGB|t?oooJt`J3[x?Dxh)\K"ju>X qfA ( p [ 6 . N p  JW 'T Lpe:`_i^4`r`\S\Y 3ZZ}Y[\(a>R`dr__m&  Ez y4  3 ?;se$==Ct}4G\ ] d %!e!!b"!U#$"C$l",%" &"&#'#u(0#')0#)$#X*#*"C+"+E"+!9,!f, !, , ,v,,6,r,O,:(,+++OZ++**1.*d))%)(r(:(d'_'' & x&B B&r & % % %E%~e%@%%.$o$$F$<$##A#q""g"r"!+~!/! O 4 Pl TLKKtTWfv~5rcU)7zFl.mm"r<!S b j 5p p oQj f]~T;E:+z:}D{T`H0zHnK09Pq߀ނތVݙܱ&{ 08\،9x|qcIZiӫFj+5 ҩ҆`:&zScԒ&)m֨fjٴ$څ}R'AE  V ާ uy~QOHO) j!["{U#U$V%S&I'2(%);)As*7+++;,n, ,,~-3L-v---x-f.^?.X_.Uv.O.E.5 z. g. D. .g - - V-O,,J,+|+R+*:*Q)T)(w^(1'P'&I.&%$P$# "}@"!I  ]YqR= * Z W!!"t"$"G#j7#d#####2 #S #r # # #$#$7$!H$=Y$[f$yk$k$f$U$<$$E#m#}#:#" "7`"b"!o!! =n o S G~ In h=OSMOt5~OphG=.>m oFG` "-a.BLL?f, bc.N5^ 5 {`    A#kBJK=lx>[IUk%z yY5.{*gimEe3J[eggse`nVLB3"dq!t^2BH\!9[   @ /  Wb   UAo?}~iM/}.;+WpA h )  ! d    %r F ab zI*g3a&uSO%w2N E3Z;y(C_ q66XCD;_*Q  ` e  F I ) y ~4__BG"s`ES1'=%%5'*6*'@ R l6MjAgZba`Y<|+CB6v5b]etgM2Rew6jPkM\>CYsK/ E 3nNXS1?! l+ !5 b p 7 w$  d *Y L{ R:d@v x_0GN.x(m`>={a3/G X i d 0 & ig 3  ^ c g,  D }P  %} JK o =b3nyJc8tZ++PvvI>gk8 p@;ei2S   c %g)j)|`YC%s#}p,HG_+KOb!kL2`W#FNivXBI=. Z3oYeGG;,8@Tq S2 z%Rt =6c<<.h%o22 $3@88:B8Ss;7:sy`e!li>o.o0f i  O/   BG    ' ? N S S Q L G B ? ? B D G  I $ G A ? U 3 _  _  P 5 [ " q 6 c    oS ` YWW=TM>^"fFXG;Oy _cJL4B8I.X-E5SLoEt/hc((sW: gg8y 1mc4>NuWV># 9\vgBZSKFBDFFITIIFDi?-:5.}+B) +5BjX6qY!4Aa|ufX N,FW?<< ^`F`8 <Hk|49bv&EvR&FZ&\WDI5O! M ?  3  -% D Z i s nt\:Y5+ qy Cz4}Ti3?`s `@OHA351 4>)SJqa a - B a  ^ ?  V,|F%B0DD6o, Mp4>u])WtO,= y.jhT!;`# #g9q 4}\~:n.Oloܔ5F}-)ڐeBDش!cؑ9hE׹3״A/hJ kحXظ.oo'ڝsYR۠Ji2NZޓ^a)o[2.jD- u c S ? ( |Y;PT"[!OK~R+6@3B f G !O!!v!Z 1"M ~"J "S #_ Z#h#o#n$a/$EH$R$R$H$F2$$###KK##"G"Q" "i!t!!v d    E!!!1"f{"".#u##C7$$%=c%% &*I&v{&&&E&&&&=&ws& g& b& b&Q g& q& &&1&j&&&n&YD&&%~%X'%$p$!$g#U#"F"V""6!e!!A W c}2 ky:^M^D}E8OfA)oL(Qn   e' M p r%R $;RUdvc'|H 'u2i?aLW[PkF}:+ 4ZDSs Waޤ= [۔R+Dي#%|FJֿ=$Py1rԙ.aCa-#Ԛ 8%/ԇ>2Ocԡu]ԩt B=~$֡ւ dJ(1e>۸ۚ^ySj-k޹ߖ ,u V = x& aTU\ellgc3O.cOU,ogdiw@l}k 1!!!"ZI"*~"""#)#~I#od#i }#a #Y #L #7 ####p#FN#&#"Q""@"W!!T! K F }=.>~<?$W h  !2!!l"M"P##X$r$$Y$1%[%Iy%%%2%} % % %Y % % %5 %%%%_%%%E%%w%5C%%$/$7$#1#F#"?"E"!V!/! a L"yqWY&E:H:NBWAuT.Y8m S ' R =} YBg\!v80QrJ*UmcacDmtzVU> BKqw.}P&:3@@en.epV@LrX/zpޭ=/gX2n~)-kMh|%L)@wfTnA!*o &  X( & "  ) I K  ; _ax&)Uw f\t56lb4 ud   Q)  O  w : X s. Ie  $!!8 MavvI m/,>^Rpi{[ 9D'E<>_-.hY & < lL  'd WwA0jJ.fe&6Ip> T h |  1 V t     | ^ >     f 4    X  ~]X,6h;A:z.\<~%x!Dqjm;luo:|/I U;QNYm9fzP<(ez];A)P_t)O >s0`R_(2K[d+xyO%pR7  2W| 6GVco{ 2MhIx/`As=}/^PM8v{BU4T wDV-m>ib50y9@ {d  % 2   S  n F h " 2k k |c 5@h8v?hKpwb&}kP\51{ NgD!-Wz^ A  7  /} ; E HY C 7 %*  X P%i50=BY CIWQI[qgt  !1.>JFk?.%g _ J w <* ?3T9 |89(}sAIg5 K `H@  J JkR7GA P6+;W"f(SFhIݐܽ[ Qۅڹb Dvn1٘~!JU؋\׭b!ׄKװCywIشB$ٛUڕ4ۨ54UGrdފ"N:Ef bzcXXRZ[`p ] W G@ 0 N P \uhg!su%J.a`, Z  | -n |f f"jyq|"lw7]P7Z ZR?X& ~3`9 5 !""tD#6#M$$RE%%)&2&'Sf''e (z(d( )_G){)Q));)) ***T*!*!*x * *, * * )9 ) ))Gl)8)(W(f((o'd'-'&N&L%%'%x$W$G#x##""xy! m\ h+pMX*RT$=gPcs0(bQ  8 ^ T   O+Ie_-{Q#,3 BRbqt`J4*AXofP<-#Bj#-7A,HePUW+Ztachdp|ڋ~١غO2/^0֒E:u{Թd5uҸXH)ҜOѲъxyy8bxr(wiӌ!hhQq֖\%r'ٴv/M۔:SyR߷] f~OEE I Z r x K  3 drv%*QLznwA[\qd I p  } wo d;WTJf;t&| ~wkT9a6x<T ig  oC!!]"Y"i##h$$8[%%CB&&>'s'+' (k(~((Z)E)0h)))c) )- ) ) )V ) ) )x ))=))v)kO) )8(( p(t*('P'?'.&&3&%m%y%$p($#p:#"x;"!*!  4q]6'De9UVU`Ko DoD  G' H i {J/JI`yk7 j9NP6l 2WjQ6Av#b1${%90}158I89p2&+6.6*BcY&2G8 S 4 J 9 3 Z{ U['mc#B\g]$N9hB"0;_zh1WJ<2*v(*q/9H\u?.BvHwN7u5|iWUH#A<<>CkMNW2fryeV QEQr[o$l 7bik/cKfI<"`YX8#+"\g_:xr6j~gx:r*k,1~$ lD x  & _  - F 9\ op    I     . P n m P -   K    g )   `s Z ?  <N~QVWRUn2Xqc.xV+ rQ% ?H X _(o l0D=MjVaE4'5Y7"*1b9BJTN^jwJ W8Vnq8`.m@(7FZnnH#}bG..Li0_;~#]7J cb||68NVvxYB[x}4yY V3V-pbd/mf3{fiI |  6m   =N  a ] c  b A iw    Y =  h : ~n  v  P - D hS _ f Qi i a 0Z vS F : :( u    * H ^e p: |   c " y m ^R J 4 g  lK`GC}TJAw 7Gbh|%Uv"\\7 7t}>"  oe  " u % 0 F1y;!q OW9a9f?iS_:$ 6| V7 peco(L a3LI_>s߇AߘާP޴ݽq9+ 7FPkى٩`1 /Rrؒز@gؑؾ;jSىiAڄrYOܣIBݑ_:ߐ>XLE nd+;umg]P;w"ok pz ~ f V  @L v ?  -5T jvu | :| x s ?mji%fjjt}3qP~gFx#2 * -!(L"!"#H$$%&&i2'?'/(( )qh)3)*]*Y* *!+\W+++?++o,,#,##, ,? , +Q + +[ + d+^ 2+ *b *}*]:*)W)T)M((I>('En'&@& &D%%Lz$#VZ#"i."! Z 7qd s8['|+*lD#]t37iM + X d < $Jn}X5=^}veTB14"Pkm2RP9n 9\s&\XF-#]ߏxddSDM:0)S aQ[w P&8lN,iчѪ`@#%MѶ/'o@ѵcGљ.BlқUDӵӁR[/I:Hu%Y}b-۬Eyb/߯G{uT;M.+13E_,0 4 ] ' g  %2;JgDA ;?s) z;bH   O  Q5IXdkjnLi&_P<$U  r!"Q"_##$M%%'&Z&''D'^(~( )[)6))M*U*Z**c**^+ +W ++ 5+L :+ 5+C 0+ #+4 + *& ***Z*&*))h) )(((( 's''&0B&%Oc%$xp$#n#B"`"~! C! k }qB$RJJ>(oD2nb1K}` ;: b Z"0Ef]5$B_~qT6*Ief>(MksD!&VlS58q< ~rhQ&;'T4$) > i/BVUm ڈ٨JN؂شf&Ma6آ%*rغ# 4]Rطy{)Rt9ڲx.ڭ0+۩%Hܡ ݜqݙUޝY%߰B0n M DKJ{5gwc"|~h} N : / ) ) +} , ,n ) %Mqil:Mz4#Wu R * 8 O ] jYqvv}o+eXyG1]'rNHdhHV .IPv,ME6 ~ W  B }`    c P  | c  !b 6! T!m!e!!!m!!!w!(!!!=j!R!1!Y!  | 7W ! k(]`oYV!P?LcM)A)Mkd5#M`SYM h: /  b I ,nL )~h9kV(qM8 Lb.[a/-xpaF]wsAbSG?5u00s38BN_Cs5DDpq14k\9)q n 2-EamG1UT{ gdWsTMc6qynhU6(eT?-}8F[t(3[0 z  7 k   C ue o x   $ @. 3 X3 1 `)  Q  +   R  m qO , 8   r p JF   {  0 ] +  a  ` ." `   h" 9e   - p P # (^vN)6Yyy[="5Qi|hWH9*lUu=i$\PF<0{&Q% W  `_ =  D ^` 9  k  qd D Ll. Pf {P3 YDD>r r/:g_(QUc/[MwP+Z=qgO_]_gq\4 } b+IM3u$C.D]v{.M< Wers+ 9j\B.{:!;u:h+>m~,5s3:9JpNj3 ]s 4 t4 U r  Q     7 d    % Y    h EC j    S  e$W| 0$.B8=?J=5)R_x+jQ;T' DOhOT4*}faDI!2!s[B)rJ" !-?XP0d zyV3*4,'% %#'>/_9GYo/c'BI~nDI-JO"Q} if Gv"s[i8(|/LO.{9mL8I  : -   o ^ B /  w  |Q  e  LS  #   >#2"9b<<943-]    A ax N !   x 8   c   r w P (n  Xn?1iyB+T9|<:}gO1~i D Eq -1 }R & l 3~T MypAplhvSi3qw}y}cOy>1p%_N C<?Lc} !6FSb~!742:000j0,0---r-M0/027 j Vb D 4 $  Zu H  k  k Y4@W%XR/UpF;buu_Ft* eGl& 8  ^!!="q""J#S##2##g $%$7$ C$H$9K$ H$K C$ 9$[ /$ %$c $ $c # #b ##`#S#Y#"W"["U "![[! f 9 un)6H_Z)]kO/\ge*>?|EA?k:% n @ X . ;woM$,[3euZ>2!a(vZS. !SjL,NVW- PxH*z!yiB-GozO/P;ܸ@ܜۄZmYJ3<2(B#%(|2C> Mauא_׮A& O׃׷2:Rׅ}&*r;ء gvU{A>۸6ܺB dޜW@vI7^b0jfUgk|M48+&i (% . 5 AI M S Z<\YhQD}4"ylM ~  )| ql Z A%Dit;9Z imDi {8;UYU  R;!!"3b""`#i## $R$-$$:%%c%@%%A& $&A B& [&= l& x&9 }& }&7 x& l&: ]&N&=:&$&E&%P%%d%e%~9%%$2$R$a$#i#8#"{V" !!s"!! F 6bt^wkWQ'b)ITO"=pFZiT:  % tR @} yJ?b_-!@\Ux`9aU#qk2;cLjM16^z- Y}XZ7f߻ޯXޣݛ]ݙܖrܖ ܞۨ<۶8DvnEٟOؐjؼg#ىBalT]dz ۡ8oioݚx1` 22v^v&X;`0B"xINl l 2  P ! }Y9Zk_H/,J]}5 $]5 F N S9 P I ?U .Y:{Qa"tsTkYZB$?hV1h? p  ! ds "  | H* y  2  ) Q? qSo% M ?E~`@Rcf--iI})vvBWs=BOV\ON3N  s8N R @ ] a Z s!E~,d6*iK%dg~%3fR/wz7Lx+?xmqEx8 xkY]JAO<7R9AbM\rW_OS.lD`;ClI7,1V'~$ 0_ $52sHMgb:8!KOEv.a Jz4O&"!K (  ;W U 9 uy  $ I } F}P~$N"eDh'J 1=`4RrNB tP9SBfn `E'q-rE`[PEx;B50u*aG u $ H  R h  c g  l N  z - T  9   6. Vv l ~ 2 f    {jAVf= *RE[ o ~a    1  ~ t, e Vp E 1 K C|Yp2 + z QI  y  q <8  l  Y B )c v " F |-`Nt'ICrgB8wUC4:&opdXbN D<`5 0)a! Z DRS,vpgXGX38wMmT;!"cRiUM0q)VqXDZ0}K!tg] XX0XI`djv-aDsT&3m 7^as9A qn4B[+#|'V}(~H,l> lC * b  z} @H{qR!   o*  } j(  =,z&!Kmp 3F>$zfZ7/ Lv:Qq$#a(i2H8^r^z   '  1  t7 Y ;? BJUR_d$qV :pdi 4Bsmek3GDRZ?XOV9  Uc ( 4  j_:1Z]y62;h@;0zU+ peP a Gbdf-eKfon5-`V ;&|J!%/nKD&e,ߠpߔߊޅޅDއޏݞݯvQ3Iuܩ\ܡ= ݒ$GNqݶݐgރ ߊaߢ 0Y]F0C|%[A+|{,=MD{7:{Bj $ R b A "{ - 6xvW4,6l)A w@|W1I   &~ _L   O-9d><4e( W3xI_|[{it?fc=lgd0< | ?  L!@!Tc! !_ ! !e ! !m ! !w ! ! ! !!$!!>!!_|!Y!6! ! T r 9 2s(+.JJOq:+lc%(u>& p?u PvB Cj4L ? \ (  \ PYb" =rW z;0lKIewy-"Mz:B2dL9^u}65z qX3PT"c/ aF/! 7 k*j>ZwܜR%`ۡu\6KۊA>?FۢR dwz[N @Kw^;݅5f߿pt)[VQau|- :Nx x2y+l+V^Wp  W[   _ #7E~IG:}KEg%8}U #Ptz$9I   E   +  \wyP#NLzfo#H2{50*%wuE d   IS   L 0 a H   N 7M]^kty|/\~yKp fT@L*\#uD P[{G@Oc'Dx}=6OKN\E/I xgE wi %  t *  i .J)w`f!`N6Y~%Nu! {N+G\w84(}N,Pb"L8'zq~)*=Xav_(dJ2zao>#$ P2) #8>aPw L5\G+?r; Ly].Kk>.3I+R*M1@B& _  r  C D  k[ I . ><mL]s%=Qeq.~=Dy?l[-G1X2rH w  N i $ :  U j  3 j  e V   K z C % m  n E:  ZvGMoH";fpR0@b{bG.!+5:=:80q)V!;|W4jJ$xPj&4|d:0_~;t q)r L\ c.  V n r l  [C&l WvMjP]QbEU!FZ}v]B)/_=60NOs R0i(Xk0 Qb{0vtv{ )Gd%58iO#lh ;U{W#i%EI 3X 5M 7 Y * y  1 VL b v + s  R 3 ~s b L U1   T | L  . b z C  + _ N  7mGy34`d!:XZx[ 9t_@ }P1&RmsX=" .@Sevyvtrrrtvv yyyyyyvttroomjyhecN^6VLB6%tJ qfN5+]!c3g'h2Wzx<+qB,TVg7y)b7N FJX wd/0c%]:xAV,jWEB9l/'%'9*u/6C9O^ot0,uXeb.ifh ajl"emv=-17PiLwXv_ V < D j  2)   (0 y  oc X@j!_4eBjc@ < U l E   5 G C - l   =u g rX F 3 <  n=vwV8UBc@H* S y6_7 w<d:i: tQx,[ =$ rH_o-`QB6[,&  V%Pe'z^fR>(<`}6bA!UnoD~.6oC(< 1i}7Dx1TCG7Qv;?ca !6C S  `  r    u W) 5Gjd5(UY)kH Zb ]` rQ%/Gdl%$CTWbN e^S S = Y  Pi ;}5f[$|71:K5Z *`x \cPID'p=T7<<1Ir(R]K[gO 5 { * | -K } $lo"|T){4isLL'(mf=GX412|FluL=*MLxUDaCa;]:In6Sn2C v>hLkw`!s(PpeJ1""/My%H ol:8qh" yX  S 4 k  < s C |  H |' b  G vF x  +G4]JqYfkkf^RA/*L r N . d  ? D  6 h m O  ! {,Z*vc_s fO>vi])PPPJG?8c.!MxV=+&)3BV ix3?LZnArvT:Kq%0)^b ~ . @ b + J ~ 5{()q6A64b,<oyX~@xV'J~HQ%\#\ &S  , S  H 6  69    tq   ff   )Sc5},U~9p ?A{gn(LiOY\&ZD;" <zbFk6FKl$#ke/;~ XfH (u aVX80Fo:9jwL%L:nzaF* z dSFAAFSbx!#cCcH8n4BB[ns@,u$'lE Y h6 $7> 6c "  { y 3 O c % =   m3{dK%1ql n-~8@yF"|XO Vq0 Av[S:XYRh9:WO pBk S  |  3 *`X=E{C:x| :yc5 qK L ( ie  ^ 2 +e.*i na/ dkslm;B(Z0ye5-od #dq.>M32sKO0( !:#<{a% TY  (^ Ch8;8_ECcG%s  k|T$r^aN>D"A BDD9$  L a  h!? ! "7L"v""^"""}""H"" "hb"3"!6!]E!y ~\ ~q)`{J.7laB>m\/&KdvD    B u 2H v  U - d   [ ![ , p ~ _@  V Vk F m(  S  l I7 e@eRag !dl6Ty/!zGNq f>g#eh%j9\<681HX}&JOlEh? , x x_+RJGNB=0>LI5RG_ ( `! !w "" &# #p -$$ %Ec%%L%&3&z?&:&'&c&%%"[%[%$c$$.#X.#"E"!@!  v f Y8nrP3![XeBP    \7 s KEZq?1nQ$vC k T  I ' yA \X ?e`oKn Y;G:J0`/"BPU`Z=m3)CcfMXLjjJ^6,**X/69@jL.`~G:~L1>Pj~ RK =.F2JcYPb437#m{Vh   r   [    0 x\ f U < !  A\Ur L~hm Tk 4 [ 9 p 0  d [  h o  I m   <K qvJ 7QNjF(jdM Zl&5h,O l+T* l^Ccv@&)Z_Je;rM"s \R,;nSpt#_?EEQ   ) f X z E ` z o d w K y 3 r  c J ,    vZ I  N 4bkHU \n=Yo=.YZ'%Rc?6)!~M<L9yz&u*SX^?0+3cF-_}>k QbD-y5/+M}h%E}*@RVm%@ 55_}AK YYe0[ |FeUkVWdVub|h~hny9E$  } V 5  sX#my. m ^e `S nI EB=-f'nbz  Oy!""&##zF$*$T%%73&&p&&t'0'82'&''& &4 &W ]&z & % r% % $ A$!#!I# " '" ! K -  niT&;KU`<hpLsyO|A}y&un e ^[ U K E>@9:=nCR8d{a  s A s* U I~34}X$pU0v/wFe 6 g   \ P<    \   s 1K W |o1'N~vJ |$ C3 < < q: 0 ! T woN)c%U} rq$cS6@E/+U=llkB#s3\A0+j0G?,Us 9kJ01dgBN'hjW"`t?D Ri{! h \  ) j'  I D T A 8   BL t    # 2 5 -t ` J 4  n .   BP   z $ :  b=  * "  Ai U1ePkiqg@eiow "R=tFu}(IXgr3jjr'Nq&Fk )LqHr5SkpO(n5 i j >b{kN0)b@@c7|^0C'[',8C^YrX0NRXn40o+e2wI+N%8KnY+bg_@R;v!     .} WZ .  J  M 7  =YHO%sQ_9|EbyNqw]B2)m1j+iEs_ Y  t  % : z N  r^  k g x  ~R18P/l3E m :Z i x3`Yv$w{- fk5RiX',j,M a d0zfvXSN3NNZi96 +V&C2pt@f G.ArDk N7 W j| 3 n/?pT$*X  j >  x   Cw.'~;E;:$s M7_zFirzW_5 qi>+sV 8hVu _   = * X t   >  Kl  37}hnH'D_YD >w-UR08[+C7mJ )@Z$w6T'\ QW{(*p(?L:T4UK(8n #Do# =(QVh6ߠ0R`ޚA}uގx:ޛVc߰9jLVJC@CJTs`>t['f! &DfP DzC k ` SBD-om?nF#2r!""5# >$ ;%c )&8 ' ' (wG)')q*n* W++>+1,]^,y,g,,K,t, R,^%,++_+D+j*)*) )('K'&%{'%]a$6# "!*!^U }9&3Jho ;iAo!J+^r   2 G ] /   E9  d k&@4;N9!Y[*4B(/x3H1s T8\:m84`Wx58QjhzS*ߛz$ݰ,;_aڌS.jqؿ\hׇF ףv L>'t Lٲ١ڗڒ ۙ۰O,gߪ2z<j?A?^j._|jkIn| l O I W ~ ~DisRk#E;3gZ>a#(/4>H,Z>kR|ew')/@6X@lEMT^ht < ]     , G7 ]Z oz x x q b N@ 8o    ' N q ^ 4    <        u  :   < e 1 C r y 6   \  " (g - 06S:BJWe>wPY\+XalP~ ^&CJZwb\.gQ$uSM2 KM*>W:rC),mQXS/ n/^,vt ?j lb +PCj7Rh|~c; <|8^9t  /f&?8GBJ iL0uu&dDg^~zM+XU 1Y)-I b6@tS|y| K*~L1~IPK-%kh@L}=A&D\/pu;{zi8WvA+-kJ~iS=',Oqy.rNrnw;L`DDx  Fz  0aVO3 \  ,   Q~ Uu 0 W  [  v   f]G+ZfU  E;!!! "b""<"+#S#i#Ep#td#I#$#""V")!8!?!B ; 'bcf'*PW}I~ y  O    > ( : QN hW _1^k!B};5jeCA#!{rfZXSV^hw #0UQchEdn[:RM/N9OODN=LB/4߆4.ݛ3P JۈzO!ڞBh 1٧q|`WV5Ybv3C!ACfܚ:RߞEiA96Xha"!VW)j^e=;-C} " cx F#;Ql \W cC b. ] M 4!""q#2P$$|%B%e&}& 'I'"s'''''Z'z'W'40'k&&&:&%% ,%$ C$#0#"!^!K  _D\Qn91r b:6]m~ :+oGMe?L K r  " ? m l  h  9 i  S tq$M 0.ZdILB)ckK>fs&yS#{$*-/03N;CgP]r KRx {qtyۆFڠ0v`glکRڳkd&ܨro8Xu޷ ߞߒ LG{gP+%i`zdgQ.bF_3HYjZz  V  KyX+?S^}vu9 yGvK aOIv{D  9) < K FU ] _ ?_ ] U 3K ? |0   fNe,E"p k  m H "I    O r R 5 7   P  {ob'D)Wz(q{8l[OJ3ZVG+waJf7## }"mk?B qI=#sm9{Ci0oEmM!oi2eWxWQe.3:k~Qyye[D:S430(A}%a3G{')DPp - H  G L  CX~K | C6t8BLbVXSG3lTQ1W cd/ O<2 _u   lg   pt *  s ^  x ) n 7 9 ZvQ3Ok9 x_I5& ~thYE*z>+AUiiz^#~D@ GiIC(r/saL$Cm9j&a(N1>b;#_;l-=ywoZg_OY;! cp&|O {5`%t;= _z 1   : ; pI  ~A  Z%   <[ n  k  J|Z5  %8GiO)QOEE6 ( I  TV  Y : U U 1  ej   "*  aI ]Zmbw}|7 a?&!?c.qr%U]'wY>*vX8O?@~Dby0No7vy1aC*-Ho. ">DYw ,XS }}(fnYO D^4"VBaH=80 / i4 5 K7 /4 RK.r>9;g&  5 z% p   , e    . US v  ]     &   n Q C.   3 vt ; # X p # z $ ! XeI6afLBc@P5'[ 7bV37h0AD3y;EhW 0U)+t{MeN8" :VftTn4qmaSw_JC(HNlxS0G ^߯ ߒtY="n bds޷ަޚߍk߃~%||W=o!bOA>T&8AA4f2:vxR e  @B N{4N< U F ! " # %[ & !' #()c**+j,/--qD..&/!z//*/ 000 0:/// H/<.f.D.-`-,R,++n*c)7)A(u'&I%$$B7#V"hr! |xe=;[w n.  0< V  @  ! c?  5 C}   XU  6U+5"6F'<=W}YJJ<S> d=hHIj1y6ݳp- ڪ.iR)֯q16DӈO3TѮzIh9лДoL1F|o/$l:IV9{8٪Kmdݳ# mf'c [b7*j;ogRK`JZZ M{{5 X h g bTj.  R  ^  mS  10   )^qc&Uz=x 2Piu_H-sdRA2#U)`.{]M:  k 2 { V / L   p 2o 9  N  Z '  > n >3 +G^ Uo9 < b C   l!;\x(wi}X&J>m2 )"L!''2AhXtK63~{* p~k9\;+M5a_>(#~ OS 1!>aNv0 M~f)1vmDipDrHqvx*,d~#tZ. Y^y3]y`B"~MavSG+j%e,g0x:~y[8;u2p2{B 8y`L% 8izrJmkmrB|}Mz /V#9 M=\qchf\_M7/yi`0N`QeqD5oE&1t3BP\{`- H_hpk<wiU>((Z;xl bX#KBV83.R. 5BUvqV?0%U>~   N z mI ^ L 7a   ~  P5   =I  UaK"{."`f%\l0@'$r xQOlAW)GTE + 5 o Y &  gZ 2;x^@y i"6V (\ <'zJC +s!28]M8*R0PLwOWEd2n qG1$M_jrm\Hm6(sy(; Ww!BoElY}!AF l>%~B<u(Av o2B#j< 6bM_NI^yJ6jW+ JoK - L   | J    YF:^O+F*|L+%$=cII=L) E5FWm__\iP?&:Tlc$d~ bWVuPN OT ko$MY!2J n  f ? $ w  K Z   P W2I,kZUxIBGsOS\"k8}!"eHsDq3W .wMnB m1Tz& 6 0 '|B"s b vaQEDt! n & < N< Xz Z Z U* K` : (  , Q n  ` 1   { hg 1L 1   U    xt AY 9   y L P    o5 CQ M@SW!bE!uJ% x m % N  _o !   {z G`,r6.vs.-]VO(?Tdf(xe6C2ZQt;Bo,2ml0r{DN {SQ0,?lS( 'G.gUQU>xek`@SA!- w}}m^%N?O*{3?R>hotv iwRL) P X \ 7 ^ | % Y  | k \ M < *   ^ 1 A  g P Z :  $  S9wN ! : $U s ^   ?   +4 R yr " } . ' L Or  k @  $ . 3 3 1 ) } k Z I : - #^ *   #k 0 ? Rs k B\\/HN\p1~p8Zw.:BVgot~RD{Nqeo[ OGZ@ ;;;U=&BGOQVVVVVYS[`g4q^8$D#lB/3@wbb + -  H4   Ig   : A z  c  26 Cw M O J' <X %  u  5    I   " H b ] 1 q  ~ L   c   A  errd3OY/ 7vG:yV@;g1|CnLS4&()qB3M|uELk2Eqa+Gk7H5lLs.G|P' e 1DRVlX V'?n%kO1eG:FcRYxbfL!$no$9nTqg[B =}3 a| H ,  2 ^  s D )<WH,OL< wE{#  OW!!["D"<#k##rA$$]$$0%/%>%M ;% 1% %6!$r!$!$!\$!$!#!_#!"!"!'"~!!J!>!! < < 03eR~tx-L8RA$`` *@wd6@p n 8  A  g r  N .)T~XJ$D>J Q=5[, 8Aq^0 , EyavYA,  &2I8`zTn2dޯB umڸarx0(רm1B՚uM2 3n ߹(zCftؒߨUBۍ5ݖbHk6,\(/g@X|A!th?V6p{YI<<6|6?P@hD|Cg      `. .> O ` rn 'zxw,gF$U` >T"Q{T0D0SbbgilibXL?+sS+Yw{PcGq* mC Ki?B@|G= G_  ;B  ' {  3  b V >   ! GghJ0 | xn",c7FW[rPNY7puQ+Y}q%_%uL-^xli^q*AxaP/D:5V25<CH K(P>RTRkU~UUUWZ\dkw|kYJ>*2C*Y#o 3Lg~oQ,m1WN( -  $`7u dqRD@2#}XC`>5 P{e@t*zK&v_G.&Pk.6DlePOi(LPDa}>'lP!1R 7 ,   } < \ 71   `S   BP   #cCd =hiH#N tG8TO  i Z  I ]  m Q  x >  b 3 9;i)^?UOP`s`'.Wa/+ i2| I ,TE(n$s,Gw KzRq/ fP:w(_ B$ +u?X[pG>?Q(9yMc\ }ATD~fMx3\;wL   w 3  e I 2&  TQ_2BW<=~m}5nK_>ili*_hP:&5:S8"+y>m,x-AB$LGVWU i :  } o.  + 4  3 / + } 0 " u 3  g6 \-sTGUr h!+3a;:5'zukDg hhrof.QW7N%u"q^"KKQ$m"GM @U^< t V;' >h' ~3LJl>W s U     L%   m e51DNEY2[s]N f1#xV`7+@1Je|j{5UlO6x$I"3Oqq]QI GNLXg4{@!gPD4H66=DD>_. Vj3N&sMU;(~B!Nv?#k*c)11n,G"To@t;U UiOd)y v@ ),xN+$' gB xfOv9% &N$u\oA( }2qn:L)[8T"F I{3*[Jj<d:bYWm;%rg s_kikMuE`*f7#;S"0&%/8Bib h.sYlhr0 < q K (r 5   r EE    6WKx&V|bZ zVy!N-SKFpM   !R!!!!!!u!K!!!!X!M!!o  9 `!2E_J2*c: DULOP Z  j  -~ Q t  .  =  M,_9GvQ^is9P`mq.qHam}dV$>Lw b9p/'UhtD0>E[_*" ߃P{ݸ$ܔ|7ssڀy٣1@؆4^;ؤf2׬נأ4ج^ ?VxٻiWڵHۅOx~$ޓ/T$1$R:+uT+ .  # pT   4d g8SWCv w!d;""#H$H$rr%%v&&P''(O( (((),)8);)3) ))k(M(*z(9(''I']&0&&%4%$S2$)##"!wE!E Bn5ZDFzJ Cq<  U  B hS  6  ' h P u ! 6=>e9&9gr?I^ylDyk&ee _&g `<n".w&kQOG*Wz"eCz^!/B|[E4, *;1tBVyV pNC:,$h2[YqDMCg&Do:9 &uu\J:b0%:_mgNiL#0E@W, N w , { -  K c Cz  Y  _  W  @   j   I r c P > ( * 9 A H K H Cx 9] -D .  }NoQ]6~/~2\>$hp<F p   , U J  f j )x  \s!(v08`@5DcGED5BNCeI| S$cBrj7.xRv!'iWgn@P:(R&-?\}{}O@d0dA,^'.OF qrPZELO];uv@Alp -IM.[kU  7 .  G[  P N R  L P ? #  V < O ^V h k k cP W H 4   - A Rz ^S f( h f \ Oq >= *  e / } N  H { = b + t ,   [P ,  g  r@3HW(UvXK$QvRGd~H?Ze}N+ r1"7)tAOVh:p[wk]1RHaFB8BhWF }L:~}ED vwL^'J <44U&B|*+h??g)y{MF~x+>0{0   X@   i 2 rU   . C :r  *   V  " =' z) $   * F Z f h h _t MT 41     Uf 9  { '  oP ! 5Ng;YW F o J, %  u  I kF!|FxvX:C{Tg0G"uYg-chp<x$]"Jz^N:1L~-OHNNIE~OHPmH(j"`'u2RJ7cE{D0RzM#^ BN6]Y9GBFWyBqxF8KvWA `ip A n  m x ]A5  x +R  | >  K  h. ` o  `  7   A    * Q m  v I  ~ j Qw /9   r W*   n? ?EQ@M32}f$qqhc  n5 w  } .0 jG BgvJI~E%\R G]D` ]\E?ZMN o~;6W gxY.ZLgt/Hi(2x?B t>~ Y4phfku % B@j~eI-7*fUQPYf.Y?p-#"t&)5H`h.7`m-XU j`  [ [   [ 4L<HeTE 9  !"V#$E%%&N'.'3m(6(1^)$)&*{**+?+^k+*+++u+2++|+FU+!+*@*I*) ) )P(-(}''&6%E%R$ #p 7# y" ! ! C K yc    I(r8CM2U[dadd3hhpf e c P^ ] X)WUePOM:KLqL NQ@RWu[ `f=nvj%Fe~ -G#c=Yt<i(NA}{PJ݌I7ܑpDUڷwV; r ةR\>&s8 (>Z|ի LB֏'!{}:M؟ Ezgmx^ݘ/lt `S\HEGVP\oU`Qw) N90cm-l.F&cRN8: d  w 4   $ #l "  ! U    R /H(\kfw~ ~w w mC!a!O!>="-~""" # )# ?# P# U#d X#F P#& D# 2# # " "x "V "3 Q" " ! ! E!~ V 1 F  }  m 1C  C  D } 8S ) _o=" ~/e,'t|>Q{5Z  [  > ps s 9giTLy:{4dY2/dq[KWcg d%GkY`*e!|ilWKFA[C,KWi1`, [L)gz!(c@Q]NW}oC:vG,t00.2z cYAQw5:J]}QA E=x>]u?4J`^3mw|~py>r eWEi15d0nH&h9 }P!d=b3vY=^%7 zR+~rh\`O:C9-  {`G/}Zz5kWD0tO)ipLH0 uI~^@"].{pQ\*H4%cK2 (>Yw (@Hrm)n6wWIaD"p_YGX:m54(3T0&-f, .] . h *   q  j c 7  5 RZtY_x \\'4m`!"<'S'_dbUD+ yHx8HMBv .%' 2  u5  =4  / C $ , r   0 lxqKt!V63Zm [YFeIC[;zH2 qbC#`"m4$MEo q:H8e1Jc2JzMs#S7 lL.-S/wl+3xVy :U@h \b4U;.+/-6B]GvZw +T. T { 7Q2duQqxk,W@& $  |  bO   | v ! !- @" " <#(#r$w$$%;^%Y%q%%&)&5&8&3&$&&%%%[%%$|$ $#U#h"Bq"!o! U R  {  %a s5   = z N   E rc    C ( G cg ~   N   )J@Ul9] t%$>Ws9P4dW}t"!{L&{{"IuiDb n` vk9x+wD߷t?1ݸ@݁M!Y1ܥ܂bD+ ,Wj)+B_߀ߢ=&W4MfM380/54=ICYm^,P[#<`|+5pEG>j 0 z   M  E{:UN_ln8qqnni|bZ`SD:l+ H k   T $   p MP & xW+-~Ed8W XhG1(l]G)pgF\ q [) Gm 3 ' : ~%3FEYo MT"h?iRB;?yeOW6  [A0~m,YE92W+{.kx7nkfddipx W-O%uv5'^#O]R6 Ui  \taeZRqTV)]fr5}/~`. n    P   * > aL 1Y ^ ^ [ AT G 9 L%     1| M $   Kn ) #YQ^ P 3l7\%kU=tQU C=U*`xY#C3!eW'n\-u  j X .U  ;jV_I@8-6n88;*=g@=;6R.' KT.B!Xgq< po* d&,2 Qoz;hWYF7u(9RnJ#q;y@ AfiP<,-V#!#- ??U{sP/oa)[ZsCy%0M)Kt"giZ[>Gq$ 5x  y ^  X 9 ~ '  IB } ] \  5 E S f  u x }  & z s p a N 45 f     V    e   | |% M l  \ ;  cg   E  .k  G  Y kxzgO)/E mxT:.v ~hdpS%GUFKqXBm!yYN>% )rx+N Q|M%4_E?T#c t.G`v# p0 q &TBYn2}l   ;  k 7s^] l >/dASg~Xo 90V|pA8od$:gF]E;dݺ;ݜ܃"hM!43`صMؤדׁur?d WMF<74224('_'t&G`&%J%$$^z#4" ."!  }d_D+#\FlvbQB5+6$U"s"&+ 3 = G S7 ]P ijs{3Lg7-X:{DKMP P3M\IA<5+C#z,mB7gQQ5*e9G*p z޹7ޠ݇lSt8VB63;Gݷ`ݨݜݒ݊$ޅiހރ߃r߅߈JD\8d5,PsmVA@2e%+S{'09E<NaWajnrss/mCeWXhHt4~  ~ I  | p^=M7:jnA}Wl0`h'"XLj 4<?g6EC\_Ud tSB,Z`9'4 < ? > < 7 /1Mm* 8jpWN= Ry"j^IG5+%xY6~S),BvmLKWL vC6y kVF% .d9nAh6e J.@jD F s  >( R rz  X  1 OO o W  o $ ' = GQ ` q h}   x !  j  { < n ] ^ I 3 m  j U o *C   @ r 7  X l ! !35CM,RPpF:&K ~{>IdO1kP f l N I% xR  z L ./M}&i36^Ym7:c}X3Gr ?~vyvtTtv{4uS1r0NXlJH&CaRi%JErFGv}U2.]#W,h +P$}g*?r/m5%v s yF06WU%b](8pd99[{ Zn 7 # z  ' r | C   j ^ : u  5  4YzI\T,2zwCTa*u   U z h M *=   E X  4 o p  J;mcxoW3-LkVf  G h t  _ IR.~G*@DB{?N rkG0mKhW0F9"/(#  #$%*8/7YAKUcpQ4/A%9Jq[1m~V'rZC2&'3?&I4SF]_e|insx%{^}){-fT(X?Unk@C(M{rA '}YR(.gvW9Q Iu W I6    H^&@{c.ngC5[aX7  O4CR^Qh{otwwwrj^Os;I Q_-MSj,Sk(jU] s4)x J9 u s.'`j)=r|EO}P&nQ5[ C@Mo>o':cNed{q R-Fd:G~ C> YupZKA<8ATKo\s E!:Slq=(91Ojm c"dB7b?f :EZk|1@Yl& W B b   .Pm0CWizlM%9  !3"w"aU#H#0M$$%o%%&d8&=e&&&&&L&&&g&a:& &%%U4%$u$$=##"`!j! - :"ek"&c[(P%Fb~S'  r [* J< >K 4[1j/|149>ELT^j"w ? z 5 o,`r96iZ<:gl _UNMIII}N:S]gqs0r4&}M?z G@ wJ [RDb'>w>O"Wg5xxD@`;E Nw eJWJ@>=@xHTh+~i%f=o)l$i+i\Z] NHReL d N  - /k  y ! G uy   t  8 g p  ]  I p 4  ^  v|#*o--L( i  H   k D * @ O V{ V= O > %m   r w 7 Z K'"J9f:{! Y   j   W   )j $`+DLh2;yp:j~ SH >iIf-@T;h|FU ('Eeo] N0@U8{0,+-/G6v=FR [?g vp |  ! Z;rvgR;L0lI U.s  C!h! "t"".###$.9$Bc$S$e$v$$$$$u$M$$q#X#=N#""3"!J!e 9H +aM2=Z0b` W$Ca{Z  l 3  & 8[J*\nqG4qPVn;%"Mz Cz1uLA S.=Q`qdVYk,.o=L]i>x߅ޑޛsޥPޯ2޹ +IkWY) 2 jx6w"V%='+,16=EL'V8^Kh`o{v~ El)Mm e8|~,mYxE/ v.b}=0 Z z q E  fi 9A  zXI VL&jE"r?Tr\IH4#(n8z = ~ 4 P p? F'Oy O,`e BN+#}p" wV&?6hS=UZ0%h$`04__@>ZHwu:iSD:8:DSg:zh.riZ/MAe5(c Z%hL7#}|vjnXgA ]* S G 8 ) wB @gE?"rR#i(M| GL{o".1/e1}&wq*`!VPwK[{~f9AFv< ]S :  a  jpy(?.d8HE]6|]I]Zp5,BuRgeapv5BO~"[rMAa[.V8n0Z$Q D9OeAy wgp'g").m3$6;=\="==;8U6'3.)$yQ) }R"R~j TM > % ]   CrlP-}xW_0tjS3H> Zm|K}w8fP4c?XcL@^nP()b"[j1 0 L a 2c  z  z ]A.)CWl*Ii%)AN]xy<ioI&     n $E3ETbt\$k'< )8?DSIbn4x[=sxn _ S D3$n5Y{Y64IBY(5W!Z}D/Z`% v : 4 H ] Tq|JfA,@UliS=,<bD{2vU.?QVg{sD%5Rs'L9\*~ޡ:'{JBj݊ܨre8^S^nj܇|ܠܹI';Lp^m/~ߍ (hC )08rB^LNVF`FgJqV{f|+Y,dQ ? z   !#G#s#!  $%"n4  !{V"g"Q#8 $$ %%%X&&h&E-' a'''''d'='''p'D'o 'E&&3&%y%w%M$#%$#!#"!ah!? ! vTs b@VrLB:3 .C.g.05=IXi4N g Fp!?^%|W)&cJrXKz[$Pg+Ji h\X6g`#$N`sH:?-CTUf~rfB ||Yp>d'P>-,Ecq,Uq: f/lQ37rzy4cJ4N t]Fx4f%WK<-!t^D}(iXD. a , s *cE0%kd8 Po;QWDqa#bQ 9V)k)@o6di` /QZ7Fby       7\~uEi`@TKdD=Y: e6$47K=wJBY sq6'R]!}_9TJhN#>i2Y}[?I& P    $ ?# ]F f F  \  % e, 6 0; @ C E E rC > y9 4 *   9 b - c c K 9/  n   ; l gF  'tE,  y Ck  4  Z 8   Z K   B  f<O^zh+kkc8WJ9=#  ? @z _ D C( K X S " o " j K | # Dd  1b1Wu[9"*2?rTkfxffkJr|7&s6cT rUI'NyIR.]fK8|b ;m\,]uDDpgQB(5T005?Q1d[ .5ZdC/[ TDFs_<,n4ufw1e:m? vPULa"R<.VV ~ ^   [ .  K g \   L        ]  !   1l P 3  Xj6 RAV$_r,o2rdpthgC` ob/ oB A @ uc5!`V$``0By'_QXm0,lB^T{P_"~Gnk-CWm^[!,=O<^l{'Db4~l\ O G?60 +%     l Y@'{ Z4kMCb fW5b)Yv=1eB~@y7uj:.JIo";  |zU-N  dJxpi?dvb_ b dD kt u  8h H'rY1"eX8:nv7W}eY g"gy+:ih YC001b@_KsO%6@\tKZ)j[ O L LT`q)b-6tbyhtpkhf_a a^j\$\\\k^6acfhmlrKw-|s^L</"  [ ,   |pQaR@/T lCpML(7aQ" TY%Q}{BJ JX +NE]f$UO f>j}FdSA5+J$ ! j ! &% . 7 D7 Ug}EN>Yhn"/VY0 iL&f|7P~1V&l1r 05vLv?R>|U$xY8[:/d-Ru,CYHmy,q d `QRh)dG|e2R;",9pUM(b JU&{2`)RjEx  p  MO   ` G  5 vs 1 ]Ak;fN Ga9  L z D f 2 I  pe I ! c P jQ8=)| aG,pW$8LLb{JU$Dld"M KuI"IQ ~[%3`^4Anb:#O|~]6@c$Bn"QDv7$iDj2f$] B{^+EdIH pER'']&0 b 2  =  I9 \ W|  m    /  ' ; 4 > 3 C G  J } G @ H6 '  h   s  Z U-    b 6& JW^ga\TH>6 A0\t8O{#2[ D *I b@ * ;  |j *k3l-}9op2cZ\+^ yi]G"6$M $yk$l3Dv[q%_Q:]`MAkzP0>j5[:_)Nu% EFc~`b.#EYohVXp.3DZxn!|.\1Gp^>v iF%)D`}jF #  & D _ }hB (t@?\ry'u J.qBTbt~[X ( H a r     p Z y< o e[L]=.T|rWj; >N-ilM5Hx x# `I Do +   AbyhVE4'%LqL|T xOslg-b}]X*SNLDGB ?r=:K:8353.33;00Z000&.0o035u8*:=?iB5GINSX{]gb[gSnQxS[iA}R /j=OG`r<Jq U$5qI-[n}_<(y2q:iAcD`FbIcFiFnAt:{2({p ^ J 3   lN3sJ{rQ*'{n4= 6o;M^@( N'8@@x6G'^r4; ncbH-%tFgs(AYjuU %1 Oz ~ VN5:xf4Nr?.oC.n]"/oU.'imMZQWEtf==brZ8ePdx^%rR4!&(-072Z57799O<<>">sAA#AACRCC4FF)FF5FFTFFCCAZ><<D750C+&bO y+7{bI804$ t OZ ' y  } | Mi  Cz AjsL  MJ,:EWcejmjf@\O;a%B_(r/gp2.N% f  [: . e  ~ c7 J4N `r -?%Q6Mcev)>Qyd)._Y#4mZ =^1`>&kX 4w=EJZf*Dr#DRRE7_0i-mCwEB4^f>'@]!~*@`  . : F BN S xX X X XU P I @< 0 !  Ko ` =*  ;  ? t H2   k|Hj_8!sg'<daWIiFBXG J`'M ( T %S t  p F  ! '}'`G&.!{tojh"hh7hhRjmsorw/y~^:,9U }:{"B) 3=GyQO]%gsz_D+#7K_x29K\i~/=agQL}.0LR3'nz#aprY/JT}3iB zAuY/>W||A  ^ ) ;t L X b j oqqle[dN@&,zYm E;gH Z J[p)#y:4LF^&Ov)c i E b mO ( 2 d &vCxB n1V/R r8r\Hc7(2 yYD 3,*7-HY:kV\4TNtV wD4iX-+Rzq]>Nf?8113,=TI~[sDi-_"WGm=I=bke +sKk%X<9TpBc V6L`tWf, C   } 5 $ )+@.000.+m)$3KH"2{gFTz@),9=9w,Y;w>apA!#o 4lCL.=RtT6e \ > v ] D +NNqF[B.D R1p^!Ot>- z 3^5sfZPD!7-8#Y&q8|EfF( &2DUfz2Ps2R4rrG'OSv!N{>6hvp&#VX 7aX**MruV=% $;O`o{tV7      Y,vjYfG)1F$cF;TLk.?KS"MwV"]+tHtJ RSaC#47'pakWP0IDA>ADF3K~R\iW u % h )j9T+rl2v.QDta&LLnK^;[!{Q(+G}`{tz!N-AP"apmz3{Go e(^-^4a;j@wHOT\a h;mqt|3(H" "DuTPl&YCi wfIT@*o!*ls U 5*  C  Q  XN 0 >Q%:#_d. 6c^.^*Z&[a)>oBH DwR-e p pf U < $L  % \ & VFq1\0ILdU(M3up*NY5)`/9NX T~6'oo1L/W{+gvUZB.H =0 i+DbH]2f ]  ` > Br F % J am * i P  > $ 3' $ +     n  Wc > B  +  \ z(  H z : XqA )   JM   _ " J gm   l   k   i   ly ^ ; r 5P  Q F y7[sT55Ll1TY'} .hHO(n%JiUx?.B ~c ]g>~yzv>ttqtqtDtvy~bB'.AXn$;Vt<^ =n,[U' ]h QIU Mw"Gl$N 9yy&vd5ROBl+#xO U{  < \ [  q B yz  ~ 5 {b  s  a  @( < M e^ k r Sw z z u Pp h ^ R A '/ C V c h e ^ Og ;?  XH$ 8E .Wc U J~ _ ~ 91   nW +  eb"d` "YlD0/}Ok Ob cpIt!1bqS85}ythY5OEg;61J,*'H*,/d6$>EQ~[Qh)wy t$t?y[v;:j\b4K\c6Go'8I_}l@c|4k/"?]xK^3 (:IUlaAkux C    W Qaunf8ZPUD7[+Q-R4rq`N=0.?LQLB3t9{oc`TGZ=4*"67)r?[d ^ I /{zslb[ZPGA:0$,}%|+@b{o.`QEr6'] TT\q Rf9)B[v}3X}A%pO~Y :l:N5ft2fq 'T._&>Kq:T #<PM]xFORe=0]~r Y>'   i N/ xT/ {[ ?,>%Ocysjk0Qsq,2PRu{L E@kR 1V?~Y!'IqpY=Fe9/(( *32]<H\r(Px'Y7 \N2 ,@Lj tP9),BX,l5Mr7h 0[ M~9Wbb n XU B +;     F  t VM6%epJ3%]kDX0gB^4 V]3T  n  ^ 3q  ` \ 2<  p \82`g?=^~`;2V{|a=F-j2f=x'snunnpuu!}~.Hw27RrP;m]3 GKr^M#>m4-*T(*2?9ET4h07,Y;58x)PvJP]\$\G{;' 3 X z         #  $  $   u U ~0  V&  X $H   O H  3 v M  # P =}   g  #E/47k4!* I  t /f :  d ! `  c ' G u >R  A i5R{Q'8[jGy' &D|eaH2Bm:v}s^i_XWNIA_<:5{26225t7;<AFNkU<_iusS8 7Rm;c3N?lq A7zi( fJ"eX+AqC@^])5kMW3)o 5{vx0yn~T|t'XbP  9 $ D  d ` (  7  - 7 h> C F )F _C > 4 *  - H \ k u z | xb pD d$ P :e8s :wy@. 9\ !   gL & o  ^    Hwn#aGB$`k{B0LTk*#nFLs/.e 'p7'_.En[=6/C~mu^7TMHE]E1JOWcrtcYQOOT@[eew ?p.]RFE r L%NZ(*p@4P^7O,:s5LApv5Ctf6w4.d B V e vB   YZ6`szjI{oei[O BT8, 1Yy~jtGh\TJz@99/(P 3YkiS/]xppf Z Pl D 5 &U  .tDlVU?)'nJv[0= (1dDM&~Yl?O158JiwaM.9%om!UX3-@Wm)Oy BgU-+U/[/Y:* ,8d=Z:aZO9Y_w~5 Y,;J;T^bng(jjjNe`VcOB6b '  J     <pOL/L:zP|&;v3Gz-\V%] )[ )a/_/pAFlb8oRyV4;R _ pg Y Ce / ^ S E4#tdVG*>?Uk87<"IGo`| $X5b0i;(Y5[[)nc/G$unP0I f6y? (7HrnH%y\)bQvFC $ 7 [I Z $i s } g F *  u l k_ P Y? . J  :'{[;d; q^48 K\-Cs`D D s Q    * WC %W h u | Z &  | r [f )W C *  [ % X S+ y[B" hf'/ZP}3l0J^Jnc-0NGbyD;Wk,(d&pP2s:e6cA( Uo6skdbU__"_bgDkszU^gi9W uY:*T ~M =Yq)oZB fUE3R*3g5U$ N x ~  J  # v< U 9h w  `  $   ? | p H ^ M 7 ;    [ u K   S    I7YwR9UgwYw4(   A} A  n .} 3 { G>  # LS yyB (k.7,#zP({iS)VC0~j$^VQQOLG@'6*; W{%9JTr22,Q:I[lV wW77\ (C^y A1fQqL 5b0s"TPT8`Z>*7Pf} 5WLW'X B#(i * - / / 2= 2 7K 9 >MEM=T^hrwP|~ ~cytpSkfa^PYYWROH7;H/U\_ZM<(x W5sD iBOc `,K{ N"-g ,- $ ~ H  l uDExBK te4<h3whYhM><-fN@9<>KabM;[{5;0ic &ip:7w1llN6"]  e5,{?Xv<z KRF=j/:DnnO@-?AUHdr^~<t_[ ` _r_TK2C)g v ] B6 & `  z ~T$~ba-/>xI)q&QX^"g+{E Z.a(SzAw%bp.?j`>u  } ^ Ct ( f N 1zpdPZX"Zbp\0v V/^LnW0F{5(!C &O2|ARi8Xv>r `  $ 5) + + &) z$  *  G^Et].E,|jjEZL?|W+0 bi=8 al3tRo N z F  H  ]   ' TG c | = j " R t 7^ C " b  @U # m (} A  d$=q;j"rAH Ue_<rz(5Ov0c -Cd\,am&'bS$0d{V4\Ow\SC*K/wQ5%yn  U 4K(ch"^9eP$ XH79sm7|.X V= A i / + ( K -p   * ~  ' {% 6 $C xO Y ` rj r y c   =    : ~ s o [ C  ' > h a  9 1  G [ h t K y  | y r Ee V C ^,   d  | XP   ; x t: <jdy"n8 YIy{ 7;e_}4 r%=iQ{c.zT9Z+YI {fq g_b] _iq}'\&_u DCw{6[j?)&pc [B)?XsW f+Z,oE.loGny#&ELn~ZC-K>fBUm %92>VHTu^kt.~],]   >  Q  Z  $^.;[GTNbo7{|@= K*Je~t`Jm3O*_fEI%OW/(Wn[$tk QS  1  Sm ! : Y`'!}r3EAkJAYp0Y)sji`K]]5gx)%0&KGph2p4W~l B@yUL&}1g^K3! 8b0<Ifb#*Caa~`S' ;kOe>v"*Gq  E2;Pl! ?a>tSb Q =R $  1  _  mH ##a5`i!.xyU9s*0Tw`<Wne; 9\U }=7;v8~C[,_orr Wn A +e  T A + \>f8EarD,3oPc"~ .-5X7^\.N[Yv#|u6c}DJ!_i=0nEr$@[v5X} : p) 5 ? /F tK P S VS S P NN I D \A < : 5 3 X0 + 5) $    o XA- vrgV[E.AYmO/<CwK1~{ BF    E# R | t -   D / @ IO Y ` =e e c $` Y cO @ / 9  p G a 4 " c p < I =[Mh'z7\{? 5~LY=)c  7[ ~4'=[U y3Xf%Pi -J"Gqzj67O|U-`n#p|U<3$ BJG5R&?VXu D}(UM|%`'M"re:,Gh`y ci y  0& . 5 ?: ? A JF I K TK K F XA : . P  9 GeI,+ ]    w J* K h  r 7   { 8   j "   @m R 4 U   ` p ? ` Z]QOOkUx$lv Jm ZRD_*5 q^{`IR;31N3;GVSbqe~9p0:gNAw`4Q 'u`U7ZYJ+_*Y4R r3] 9h<\}.eS7M#cmy [`)n@T(j~GsB$:Pgf}CU##9MdTwI   a   `   =    5 k   *TazAl:[RuOn* s k 2 e  n L' '9 c - ?n =cjR:UQtc1pw}>uK&,@Un Fs0 HfG/R-]B7o,cyEY bfD#u-;?9)v 5WUx/r-a3o]?nBC9\^'g6HRj1'&-;L`)x16;@B,EE?EEMEBYEB`@@b ; 6^ . $Q  5   u  9~e@O6$inPA} G/9@eC'@9,c F|M]jg!s!;y%4 |u ( ? 2 ` Du c K znb0^M<]8){md]`hu ";Vv;f)]5y>wm}V2d?&}{b'!gT Y\YBvp)2 lN 6 ] c `a > X I9&mUCj=%Lr2fubae mczls4\w')g8 ^B kG:Q^j8 "^r W?n(hS? t6*WGcd-7vPa0Q V+=NubAv X.4fyW]B)V?z2u> N F6Qo T$N@xo*!\Lv6r9^8~_=H[{;=!DfL i+>aOy@DbwC&N xl.   <A a  G   D  * C2 \} r J'T &=Qo_Wl;sxvqgXUD!.x:~Lq)kJ*  _N   lV  o;  r l  . gIm^k7svi,rkVb'VI|U=/2+'%(2@%9WK^ru.`*`;N0:5k` C~h26vzU82x,e8i!Kx (NsCk7r1;Le~&{2^$88K!]q .DaI!(-"5<iC HPXUW\H\ZZ)RKdA5(3 g   %  G  }Z _ B^T8o=  p,^#'qd!3iI`  &<dK W_Va\UCH4-xZr&pj$z+6I+g|>,Jf <\  g j f {] qgNb_>_d(qr <\pG 4>r&Iip- tA`iPM<)3t.y*hK=LA}~Q*-fE{wkc^K\}^fp|+Rz'O4~Y~[B(gsm! "D g K   t4 P em b c o % {9 J Y c m 't w ?y y Yy w qr h ^ O > $*  +  (  Z *  ~  ] I  7  { 1c   >j   (I  b 4"f>R *`G`jqsyye O3"7~RU   D T } H5 iJ & M v B ? "mR`;-(7*2n@ Rh;~m7g;b4 iK@-z~ [d3Sy LZUPiT!XN PR7wF[+qxX:=G<uOQ0PqK}K <i/o@>e&x#)|Qv4X ) !F b z R X ,   i  ?   t  ;   S  _ \:  T`;, |I ;   i M w { &  y  / hC T ` Mj r w 0w t rm c V SG 6 1 r  _f >  [ mS " ^t#8~]>2w5oN_33 M'6kD!SboB~hBDse %  N }s F  VyC@FEj'u-|JKbfpH2x&  .-C6_zG[ *Myr/Z={NI^W%LR InFW%fgQ"=^) 8i/^N})B0[ZyCFhn-$aLvVI)qs \9_RT Hbo~ B,Non7^ $ 7 }K ] <l x  R   b  x _ l ] K C 5   J   y L" Q }   E  ! 5 >F S Z Z_ _ \ bS I 7 \#   I   .] . o  NT  1 A w  S iIl/;fw0<Y~pD-IelSB3,)),H1;iGS`l{JwI5']okHwx+"LQwR)[xH#Ug@Ik06^&Nx !:X;xcM?b4w#TKsS pEp>3s[hjvDn=(dKi&W"P%1>HMIOOu M E ;/ , I  U  RwBR+&dl3%~,;{fD}z(&C+\m{|%swofP4hnd+{.eTw Wd .gQA!h u v o a K 1b7_= 9bh=,cpW`B21x(>$|'1/l>XXy E;~uS[Y-Up}*f +-Op`6)Eb{th`[^`j)wBZs?o0KfS-,1JNe#yq$v3EQ`j8t~d/e@tbQ&;jPwM. dH' I=d  p T r  Og  P 5 (q O=lQ)&dRx *R5rc/k [`mJC#__0&l&{bLJ8)W "K , = Q. j e 2  )] Ks>0i_}% j);Ea N1^S6v 2b_D)`cA3v.?.J@fX!!dd+(fg=$e!_yk^!WaRRT"\`ftX D G} t ( \ D " CL w ' y ') G e 7 Y  N  ^ 6j L ) v B O l  + \  >  3 @3.x|C\)%TY<1Ib`tIyJq0`I}3);wfO%'zFuFqsN=1Vm4K]"o'4@XtSO.F]u\-s/FMkxS. ,E^wmO45SspaU?HdA92/- /J2u7>FR1^em ?{*6eY[5i_N*m O1o%q&bb F^zg 6`nw)'85GQX>]][;SI;')o?   y O4 %k    \* #O r  n +   ^    ;   Z   } 3 j G [  La * Tn ) |LJ\WnRCJT^m~Eo+=Nb5vn+mE!:R8nFm*BC\tuf^"Z3EYT`[jq_vyayvbtldbYfL=c.]P  9  r J # L   fi 2 kNOQ BvGv+1ARa^knpkPdUC0Sr@S!qf.A R Z  D  z~ x z }F i *9tk/_8`3w)Pkxq!*JBhw6.ZI(g_B&5 Rs2Tw)!Q?ybBDlz6~Frl{Ch>yX1NAj9>Ia |  + Gge8BZw`' p +   P  ` ` -  ^ HMB5vSX:=Zu/+8u_[A!^%v?d<@W N ) y v[ t t y ~ 5 N`n0Sxs< ^*+V;O0fX}6&^Ik)e-OMkKX "{;6Qjt9f7: UsbI3/Qt 3]&=7Vdq(\5f)^T,&{U&} 99de=%$He*8Ney-\;G]na-wyDs  c  8J  $ a  S z + a:GL Bdv@<Wrk2|}D|kxWL?"!~Xh$VG;v46,% a k   "] , 9 G; [ rr 7 `0G]2sNe|?Zx0Gb%9M2^rUBu%K3BQ.`oy~"|-F3vL6g~C9[U- Lv{ng2bd_bgn4{k Bv 2ZBs(f0_.yg%Ecr~4lF(xptkW4jgcZ&[Pv5>)l$HZ*\ LlS t " 9 5  > Ot  u 21 V v p 5 [ , ^ >  l N ,  Y ' K  P '>=Tj~c7P.Gj`x9Rn"&-E7AKnU)_isc} c#n2L {L-@TmrK%8[bF.$N}G3q2s4t.I1gl&b#RH| Y 9`X-x'\8ENLVXXDVNEE8'NWyRW'Jf20{IM  JH~;Gop-i )! 3 ? rI 9P S S N dF 3: +   [6b; |tp>cYOHAC<7i2/--3-29;CO^:m|3'vjc f q $ @k(d)~I~rfYJc<;-|dP<+ &7Kd|/HcCm 1$[X A3_ R@9m3$Q<{TA{aIi(K7C/MTWYYgTOHE9** yU  *  _ <`  "   }2 S ) *wrBJ0]_0g(B<"KUZZWP~Ck2YJ>2(#i8 (L2>Opc y u  X  8" V tF _ q$Nyx|x"LqrhZN.L@i5) !5DR\ di*knUcOE<'8=Q6g{8=J\s$3B"P_Hn{xL40'=YDrl)0oS6xpF<i(\n[L?65l.++.I5}?L]qRJ-yZ(Bce)q ]  d  "   Q&rgYEG:`4*.z.<*s$.Qk{d2H"I[h  z N* |  Q`  " p[ >  < d_ ?}   { q g ` [ S} Q_ N< L N Q S [g b3 l x J 7 P VRA  .t \A)mZvQlbXOND:\0 )"s'O C'0?NP`s~L -P|uY9 R,|epf_WUUUUZLamzNP Ch>wGB{q)i3S7nhbiy8bx]*B$[#tLJ" lp&@7U;()txQ )D  - {^ [ = "  ' G ` y } x v v x } r Y ;  R #   %} 6A J ^t;^r!{& ~'w nd [Zt^^E,m:nP`0Oy[Y@ % P!twLk'c\WTRRcTJW1^fr~ ;[y&Lq/Hc9c6bBb$X&C:M_ nQz0#u zypa,P<(B`$b?Kp1V/Ka_5 jeqO,I  U ~ h T/ @^ /   1 G [ j v }  #{ 2s @g TX hD |,  T 1% O l F   37 UxQY 6ML`v8yR( b  9 xYC:y:hVEL1 p*g)}~qLdZPIDhBC? ==?BDL|PiZWdHs<2+&##&( 0=9[F{Rdw"Di6[#Fk.`-:Hxc|9|Q8 + /=SkrM-5 \s#ILdn5+o;= @{L7   c o G , h ~8 ce J 2  ! 2 A N U W W S K A 0   # 7 J a wX ) J  8 V v7 I ?E]}/i3';^Ocv7Xv)Lu2bym^4O=p,ZXhxdP?K+SV,fO9( $8Nd{ (9Mf~9Vv'O{8VvKF-DjWi z[dJkMnZ6D+$ xS. e};wmb`5 I / ` 8|  Q  } k O441{ IKs  4OkW+'GjQ6&Ls< ! S ; Y| t # 3 =&:@N`>lx:1( }vlbX L?3$1 Mn3m UX~{{oy'yy{a#zHxX83G`v7Us)7DOdh~0a> |G+ }(>~ecE2% zYi?D5(Q Lv B q~=sdWO-3 u s RC 5  `  e  N O;^~(?Rk h%G@"Yuk4 ? 1 Ej V g y| ' z i  I"Z+^~v*l`_VLB08,j" I3~(}(8"T, ;J[>oI3qXB{mBHo'$SufWFMuC<74/4\7<CMZ)iQzt  !,8OIwZis}'X5pxnb-SpD0@$sqQf.  a p`E _ x`M& `\b=O6~v[ @N* C|@m3I[lyvjXG1%1=JVy^Re'mrvyi{5~~~N~{voQh^QBE1 x2bvZ=L ?{Y~6BW^<Nx\gA?(rV>%{xx}wurrr u!z:Up4Y~1G`8{^:0`Ss&P}6L c>tpO?};{D\4~yrc TTG9*)n<E;t F u  > ^ |   , @ V o  " B d    z Z -4 P s   S  *Mpe"J,Z@TgXvB Z&Yy!gTT@) W~0^;ra W_- q$b:OZ{#Y6d:gP8{!eQB3)$,8EVg~ .S{ !.0:aGS_i@v~@ZCEHCHE@;`4* PP[ixM0<m@d?V~0V/  xRn)I$g7~`eB)'< > % um m f c3 an a f k r: yd  -4 743/L%e~ u N .! D Z n N  G a   *b 4 =BNGJJ,JGdE@9.1*[  Dl,n]XD.)cD{3gVB43"Fn)j1^1pP2 1EYl=Zx/Lh-Hf "8>Lhbs$X?}>V8&z#qy`N):&5G]oYuE1/ BSZTB b # ^ 1 ^  " 6 J ^, tB V e q {  $ ?} Xs sj [ G 3      0e A9 R a p }f *   i $ GWuWfWFK5! 6y_qS5D*qmL*`WbZD& iBo[wE73"I{N"jM1);J^o !8Ng}4O m/@O[hBto~.bA>yo eNVJ;+,x ^QGs_L@8$?:4$tyqjZc`^2[w[^c>jyoy'[ < _  0 G _ x   ( - 2 2 @/ ^* y    . Gn ]K s& vE h,!#n#+#!Z8W u+}gNG5j"Nt Y;@H vZBf)2qGyl`hVJO,GB@@@BEJQrYf`\jUvMFCAAACFKR$Y=aSkiw%;O,eEy^y3X{$.5:A?kBDDDBM?~:5.&L &] B~~0ml^L=!/_ O;tK>k ,Om ,=Qe{  $?Vn|\;f&57IWfSuQ |2K}]pdWhF5#q y%s2V5FbjG"J MqN)n< eGg,D$rayRoEh9c/`(` choy (/93CSOt\ky 5b#W%6G4Vogy$e&k>`&+0B58:%:r::8[853I.+&9)ybK*rI U  K O ~  . B= U] ix  9 V t  D i e D    A ar >    P  ; Y} w3 B;)!3=]BGJ)JJWGE=6,: `;ckM2#S'pMf+PxLV3^AjL,KTx,bP?.r^J;/##-9J\o G&o.8?I!PSZbiq0xk,rL5-}v1ndZDND5d)( Y&^~g3VB.s HZ+ym\aWOH@< < 9 7K 4 7 9E > C H, Oq Y c p5 ~p <f1Lg*8@GGE:=X3v% *~GWh* U   $ :L N ` qe   h   X 6m5_Ck{i[)I8T&Q*tncO;`' cz/_j}3xvssmsCvx}pU<& 1EVj{#7"M0fBQbn}EjDt D}-k/r{?n`QBd3"H3!s{jc[L;V/ D-yY0s7u"YBj '6E T! c5 oI ~X d n u z } z u n d X F "5 . 8 BIQVXg[@[[XVS`N,G?8.P"ZQ~eJ@1s-`bD$O Lg G) Tu>h O9#xI{V3o[G6% 2E\r,6;OLg^r+"B?X`n 0U}(*T4;ELQBYv^cehDjxmorrQrttr0rgrrooForrt#vYy{)[Dn -Mn$5G[n '/6;(;A;Z9s4* 2H^utU2 d8 "v)B16;@yEHGJLOLZJ+E=6)["r4{p=R4BiMAa+sIX)oEcE'x S+ `rEc'YPF>97444u7h<^ATHMPEY@c>p<<<>@EJOW^*fBp[ww3X}! N}'1;@BrJQY `=eojoq t=tqvvv v;totqo l=gqe`[ V<QpLE@873h.)% ,^Ix-Z%,3;;E\Qy[gt8L`q~5Ld}~tj`/SJBe1 ~$T='Vna+ G! 2APJ\iuw*AN[ nui3ZI7H(_8r1}iXDK0 X.yt]jB`)VOE=6/'" " 6Le ',4;$@IGnOT[c h7oav~ Q'`?z(cTLyohE^QG;D/"?}4p$^vl _DU}LB8!0U&!Jt   3Vv$+ 3! =5 IF SU __ ng {l l l i d _ X P F : +  ' 9GYhve;|Hk0s0[r }+t8`O;E'U`vm]D+7]jOV6k4pDwhYM>2g%I1 #-7CO\hu)B[3tOl)Kn=XqeBF" n?pW>%oL.z~utnjkek`k`n`pexj}r~3L%g9Of|+Px%;QFepy'Y"+VBUi}0iRE={ *49=yGQ[=c}hmrAvy{~E@{)b AwCo$.:G S,`Ilg{  + 5 < ? #< 2: ?3 K) U _ i sz{]@|M|Cz pdW]I!:(j,h%gWN3IEjL/L`}'_D& Rdv:`J6"{[=o^O@4* " *1'96BELTYceqt3$I3b?{LXdnx:Zz%Hm,T{Is"O{.[ ( P%x*16=E9O^Yer";Tg{):L]n +AWnv`J1 rJ #%*--s-D*%  X)h6fMn5= {O"bB~Y4e=sW?Z&3`=pY@-&:Nd}TC^FjCvCA<72+#&8L]n_={Q'&7IhZ4kzPQBv0`Hu0g$}kWjF12 U gnCHJM{OsRiT]WPWBW0WW WWWTR~R[O;JHC>7~/W(-  }M])uaKc51qBiN0`3 tmTH4#lkLR+: # jL.}xrvYvEv/vx{}}xuus(u:uKx_}p4Jc|%4CR3cOrj8Uv"1@O[6jVvvBd:\!+3=D%NHUf]gnx$B^y )8,G;SJ]Yghqvv{{xvng]PD.5B&XnqQ1( :M_pmC_0d0#*/4[7%7974N2-( {JW*sZ\5F-sXBq)V8hJ,gN5':NbqxeYLB81)-%K"i  %'<,Y3y8@JT^g=t^&Ii!3 B,PO_on}3Sv 5Us"',/1/4M6k6666641)1B/[*v'" !0?KUbis{}qdUD3 vV6rE",6=J\Q+[eoy]&Gd+Lr<pAe=oQ{9o ` QB4"xiZL=.';Tj:]5ZHrJv+)8UGSbn}6cGs -'Z4@LVc;ohy@l5Z 0Pp*;M^myyhW@*\7    U$J"$&)^) )))a))&$S"=n +^TZyhsY=J 9*rEwU2q]I3n_PD:2y+g)Y&J&;&.+"05 <FP]ix7Up *%L1m@O^o~$Iq?i+BXnEr) Y 4G[mL}Ev Bv$.8?FG}NSX]H`|bbbbBbqb`][3VbQLGB:93_+$  ,Mh").11.,)"~{{yyvvy~y`{@{ ~_5vBg.CPX`%s:{reYY"L@1"W(uK&s_Lv5V!8 vctOh=[)OE>4/'" ~"u%k*f1a9\@YJYTY^Yh\t^ckpw$:Qg},@Vl+Fa}5Pl2Ru/J cE~g$ I$q:Qg} 1V~ Bi#-7?I(PKWn\dins x-}Jh}'z6uEsQn^igfqay\ZUPMID?:2{-t&g[L= ,~cE( iI&vlbXNxBS80+`@ ~mlYPG54  o{^bOL@53' {eO8" yhWE4 % '.8BOYeo{+:GUbn}*9HWh| / @3OJ^^ot+B+U=iN}bs ,;&J7YIhZtix$.8DNXdn{nZD+ &2?KWdfDs"mG }S) Y.%(-//f2>/-*(#fF&n[G5$p\ F0bG) t,T=4N`vxZ:!<99"m@EJOW^?hbr~(Ii ,(=EOc^o.Jb~ &3? L!X8bNlbvv !#&(&#iP5vO)T%d0[$"~,E6 @LVd`+jvLu> xF&.i3B:?DGLQmSOX4[``bddbb][rVhN^GW?R8M.K&KKM PU\fpz{oc"V;JQ=j4' 3Sq7Z9a'OvGqGr *"1N;{BLT^+eWov-W~"Lt +Kl+AWnytohcz^fVPQ7JE@94/*b%= o B OKq:`*U![)}wvJn#g]ULDf:F0&$n[I8' ~qeYLB6) )8GVev 2I_u .@Qct#V/Y#^` eglqy~ -$<0J=\ImUdq3Og"1BQ+`Ird,Gc~ "+8?I0QGX``vdlqsx{}}}}-{<xIvUqalndx`XNG=3&{jVE1 {gS?+zqsckVdJ\=U3K)D :0& sdSD3%.8BLYcor{[E1}!g3PD:U$i{vcO%;9'J[m~wmc+\:TIMVEd@q>}97444479<@EJ OW!^+f5p?wKU_fpz,8GVcq~     !.8DN XblvsaM:& %{,`6D@&J T^hr~rQ1gG$ $3~?^N=]ixkM2 #x-d7RAAI0R!Z_fknsuuuxuupnid_WPF<2&  #2APaqs]I32{Ec\Lu4 %=YlqXB0 $?Zv{ t=l[gvc^[YYYY8[S^n`ejov~-Id}(> Rf!y.:GUbn{".8ELT[`eggj jgeb^"Y'T*J,B/81.1"11//,,*'%~"f M4 nM0iD"oL*}]= cE' %*16;@wGaLJQ7V#^chmrv{xpkfa\ZWWUUUWZ\_d{ivnrsjzc[TJB9/% %4CTcuxndZSLB,:@3V.j&! $ =Un *E`{$).5=D=LXSsZbls}7Pi/CTfw"*19@GOV^cjrv~p\H4sW<!nN0  oO/"$&){+_.B0&0 333330o0V.@+))&$uh\OC9/%thYJ;* }lZ G5$ (-7>EOYcpqyeVJ@6," %6EVgy !'51L;_GvT`o{ ";Qh):L_ q"8Ndx '6E-Q?`Pmays    sdRA0 l[G3 yeQ;' {l]N?0! ~vogc[VOJE@;~8o3c1Q1B.4,",))'%%%""}"l"X"D"3%' ),.36;@EJtOeTVYJ`;e.l"t{ &5BP_n}  )6BO^"j4yEVev .BS gx$0=GQ[blqx 1@Q`r}vn"g+]5S?IG?Q5[)bis{r`Q@1 }qbXL?5+!xnbVI=0" $+5=G~PjZVdEn1x {gS?+  *4=GQq[`eQm@v1~%  &08BLS]gnx%1;GQ ^gt $0:DNXbnxxiXG5${%e1L;6GT`jvnU:!$5oDVV=d%suaM<#*5DUapzupkiifffiknsu}xfU A-*<M^pv[B&  "6J`veJ/5NniU=! 6Qjq`L;,  $B]{:Rk-E^t .= JVb'o1y=GQ^gq{~tj^Q B3$!)05=BIN|UaZE_*glqx}z\<vS0[9 %/l9LB+L V`jtoQ3w^E/ $.5=GNVu[fbWgKn?s2x(} }xsnib]VNG?8.&  &0<FR_nz{rh^T#J7@J6^,u"6Ql5Sq *Jj &Gd5P}n}}}}}}}}/}C}T}h}y}}}}}  yhWC/ 'p/W9A@(JT[emv~{bI0t[E/q_L:)tg[QEt;e.V'J;,  vdSD3!ylcYQJB;61,)' '%'''3'=)J,V1c3o8{@ELT^gq{ .?N_q)8GUds%6EVet ,6BOYcmv$+38=BDILNNQQQNNLGD?=83 +& "$&+.35:=BGINSXv]mbcgVlLqEv;}1* }{xvsqnnllllllslil[lNn?n0n"nnnnnqqsv~vjxV{B},}gP:&lYG6% ",4=|GuQm[hhcr^{YWTROOOORTWY^chp&u0|:DLV]dnv} '6BQ`o~&8}GvXlibxXLB5&"4EVhyo^L;*"3DSdsvbPB0+5AK~Uq_gi[pQzG@6.'  }skaUK? 2&"',3;BJQq[]cLl8v$mYB/$3?LXgvsdUD5&  1@O^o~~ytlje`^[Y$V3VDTSTbQsQQQQQTTTVVYY[^&^0`:cDeMgWg_jflnouqztvy{~}zupidZRI?2( $n0[:IG5P"_lxycO9" '9J^rxdN:& 0DVi{o`QB3' -:FPZdksz~|yywwzwswkwayW|K~A2&xbN8" )6BjQQ^;l%{ s]I&5:!Nbv~q1eGY^LvB81' . D[q-?Rdu   %,18@EL#V*^/e4l9v>~@CEEEC@>;7/(   +5?LUblxnZF2}dL"3/;JVcr~eL1gN&83= IV`lvo[G6"|pcYOE<4*# vl`VI=0"  #(/9@JR\ftrh|YL@1% ,@Qcvxng] S!L8BN:g0})! *E^y0Id} #:Pf}~{yvvt#q/q>oJoWoaokoto|oqtvy{~~tkaWJ>2%+8GUdszfR<(,=O`txbL3.=yLc[Lg6v  q]G3 ygVG6'}qbVG8|)rh ^WME>72*%r `O=, xi]#S(G-=43<)CJT^hu~ 1BVg{ 3G ]q$).5:?*G@LTPhU{]bglqx}$3BN]iv ',4;@GOV^hov{slb[QIB):038+B$IQX]diqv{~vohc[{TsLnEg=`6X/N'D"=0& tcTB1"{vsxnglUgDd3b$__]]ZZZZZ]]]v_jb^bQgGi;l1q'sx}   '/9@GOV[cjot{~ )3=GQ^jv{ vo.jBcS[dTxJB91' 1G^tx+lB_XSnG:0$ -AUizytl gc[(Y/T4O;L@JCGHEHEJEJBJBHEEE@E;G7J2L*O QT Y^cgltyzfR?+x` I0!.8DP]ixoV@'x bN*:6)ETcrtg[OB$83,D"Sbq!0<IWdnz}pa RA 2,!8ETcqs`I3!5I_vv`G/,E[tnX?)3LbxvcO8%#7IZizwhYM>2%    }n\M<+n[D 0-< HWhwvcO;'  6Lc{n]N+=D._{;Vt~tg^$T?L]Bx;3)"- F_x#4ETcr~ %,3=GQ[eq{whYJ$;3*DS dvkWA+"4ETevqX?) $0j:QG;Q%[ dls}s]I5 veTE3%{sng]VND:3y)pf\ TJC<4-(  y ocYOE ; 1 '  (/7>EOYcp|}vqib%]8UJN^IqB:5.&! !:Pg %=Tm 3G[l!-7AKRZainsx}+8GU}gxvskd\UMF<2(*=Q ey+x=iQ[bLs=. !+t5c<TFEK6R'W\_adddda_ZU{PlK_DS<D58++!  vdSB.yq jc[TOGB=m8Y3E11,) '%" x g"U%D'5)$,16;@GLT[elvvoe^TLE@83.)$%3 DSds  *;L^o"').38=EJ+O8VB^NcXjbql{v+8GSbq}/v@nQg``rXNG=3)"$3BQ`l{vmcYLE;1 ' !#(+--000--+(&!}vn g_XPG?80)! vi]NB5& {m^O@1"sgXI=.&3?yLlZcgVvL@6,"%6ETct)3=DNV]dlqv{)8GVgy}{vql+gB`XXnQIB:0&/ Jc{)BX{nocVJ=1% &7IWfuvlbZPIB:3+$ sfZK<- xdQ=&o[G4  !){0i8X?IG8P)Zb nxyoc YO'E6;B1Q'` r )5DSbn}!&+-02555520- +&!)6B O^l{v)g=VPGd5x$'={ThjT@, 5Lb{vgS?+!2AP_{nl}^L=1"|umfaYTOJE@><97442x2k2_4R4D757&9<@CHMRW^f{miuV~B.yeO";3%EYj~iUB).?Xq ~'lB[^Jy8'=Xsypf2\MRfJ@94-(# 2CWhy %*/7>HOY c p| .BVj~~m\J39I%b{u_6FL-cyx] B&0 BVdvjO4}d L3#&+-00q0[0E0.0-+(#!y fTC2 z}nsdiZ`RSIIA?:52+-"&# !#+y0m7c?YIOPE\;f1s'-@WmxnbXN B;8Y+t! &Db =^{yqjc[V0ONJiEB=;86 3#3<3R3k3668=@EJQV%^4e@oMvWakt|!3DUgxyrkaY"O6CG9[/o# "0BpQ_]Ml<x+n[G3 {hT@,xdS?+xl`SD8) {l[L=. ~o^L=, ~xyguXrIr8p)pp pruw|ylcYLB8.%% 3ETev.BUi{ 1 BTc%t.;EQ^jy " &..3?8S=g?{DGIIILL I I6GJD`Bt?:53.&".? Sgx!-7DMvUo_hf`nVuO}G@9/'  zunf_WPF?5+ {vqnid_]XS}PnL`ISDDB5=&:530.)&$$!{j[J;* !!$&).0s5d8S=BD3I!PU_gnx{j[J;, %4BQ`o~wk^TJ@92 (#&8DSb q }   *7CTfy "8!L!c!v! $:Pg}*=sTdjV~D5$.DXnt`O;'(:IWfsq_N=+ tg[OB6,  zn_PA2!{dQ=)yhYG6'}n ]L"=..=JYgv vl0cGYZQqLE@83,%,E^ t 8 Qi 2%F)Z1k6=GOV^goy#-4;@EJMOO OO&O5MGJUEg@x;4/% "1BQ`o~}kZF5!  {&d.N88B"I Q[biqx}jT;%vbL8$ygVE3%{qugk]aQWDM:E+<4-%  tcQ@/  #v*d2S4-#&0:nD\NKX7b&lvs]I3 o[E/s_L8$veTBv1i [N?0$uh^{RhHT>@4,*# {gUB.  ~o^ O(@21<%HTam|)@Tj $=Un ".;4GLVce{t.D Xl.}?Pbs +5/<@FQMcRtZ_dfiknnnnki+f:dGaS\`WlRxKD?7-& sgXL?3$ ~ocVJ=1%vlbVL?3& vlbXND:~0m)[J9'sbN=+~o`QE6) ~$y0w=uLuXugws| ,=L^m~,;J[jy $.:DNX `i+q?xS}dx%9J[mxqib[QG&=83I)[l} tc(T5BA4M"ZfpzsdUG8)voe^TLG}@p8d3W.K)<%-      q[D.  mT;" %,16=EJlQS[:c!j t{{eQ;'.=N_n|pf\TME>92'-=%Q h{ (/)7?>SEiOW^fmw~&:M_s"3EVev  *4;CJOT&Y:^La_aqccaa^YTOH@9%/6%ETcr~s_K5 ! "+5?IS]gdNn5veL1}dL3v`J3  ucTC4% xlbVI=0"xsnkfda_o_^\J\9_'_adfkpuzvdSB0(9J\yplc[TLE= 6".;%Vo 3Pn 'G h%),3;B$LBVb`lv-Id+(8;GOUcdtv,9 GVet  "+8BN|XkbYlHv7#u_F-gN3hL4v_G0sgXI=+vcO=, mYE1uh\RE~J~W~f|r||||~ 6J`t 0,I;bJ{Yj{,E^v +=N_q5I`v 1B Tc(r7DP\fpz&5BN[dq}zsi_UI? 2&! &-27<AFIMRsUbWQ\?_.aa ddddda_\ZoW^RLM;K*F? :2+#xiZL=0!{iXD3 yto^eE^/TLE=6.'"nU=& lYB. ~ r%f,\3R=JECO2(iS:$o^L=. *7CO\ky)@Tj%~1@L[gv !:Sl& 89GQXmgx8Qg,9GVco-~?Rdu$.8B#I(S-[/d2l4v4}442/-(% zk\K<+n]I5"o}[qGb4V G8&n]No=Y.E1nXB{+qg[QG@6.%q`O= , |wrmkhfca^^^^achmu'|18BOYco{,;J[&j8{IXi{$5GX%i6{GVhy /@Qc t".8BLV]gnv&{5DSds #-x7sAlKdU]_VfNpDx:0&reYL@1%zp f\RF:-!xqg]xSdLND::$3+$ jT;" {dL5 yeTE3% $)08?DLU]dlv  ',48@EOQ[`hlv{+)85GBSN`]li{x' 1=JT`!m#v&&((&&#!  +5?IS]gq{qbSB0vcO;'nZG3~o^sOg@X1I":)  vcO;%|ywurpnpZpGp5p!ruwy|tg[OB8.%  '3@O[jv  '18)B=JNTb[seoy"6J`t$3?N]lx.BVi{"1!@0LAYPh_tn}$.8B L V ` g q x sdUD2!q]G0{eO9s"g [NB3$q]G3 vcO;%veVE6' lXD.~l|[wJp8k)fa ^YWTTRRRRRRTWY\a~c|h|m|r|y~~~ '6EV ev ,8ET`o~+?Sg}.=N]'l=}Tj .1B@XQl`r!0 ?M&Z5fDsSbq&2<IR_is}}pfWK<-lXD0siZMt?`2J!6  v`nIZ3I8&mT9 ~qeYLiBN85,% t^J6"ymcYOHC>94/*(#  #%- 2'91@;HEOOYYaekor{|!0"B1PBbQs`o'9J!^3rDSdv&:I [l*}9JYhy!+5?F.M=UI\Xadfqk}psuxxzzxxusnkf_!Z(R0K7A<:D0I&MRWZ\_aaaa__\vWdUSPBK0F?70(! {hVB1 vdSB0 n]N=.o[G4 tj`nVZOIE8=&3,'  ylcYQJB;61,'"  ") 1"8'@)J.Q1[6e;o@yELT[cjt{+:LZi{&3?LX d1q@}Qct"$/0=?JNY[egts+8DQ]isxl`SG:+xric[VLG=9.* yeQ=*xlbXND:3)v!bN: )yl`TG=3)  %.6=EOV^!g&q.{5=DNU]gnx !+8DP]iv ",9EQ[ht*6BO[er~$.5?GNV]d)i3q?vI{S}`is}}xslg`X Q I?5+"  teVG6'xi[vLg=X+I: +yeQ=*~tlc[TL{Eg@U;B601, )'%"  t g"[%O'B)8..3%6;@GLTY`gov ! .:GU%b,q3};BJT^gq~/=L[m{+8GS bn)}8GVds /;JYet(2<FPW_fnuz $0:GS`lv}xpiaWMD:0#  {iVD0 t`J{4n`QB3$qZD0vcQ@,o^L;) vdSB0!|rkc\TOJyEo@g>^UQnjWJ2b@ !YQ/ I _*x74m[d|OT dPb2e B]h_Bq~9jWc`8E#(084*3Gk$\ w v  68  L n UIP57- q0+; M l \  iC sx_C :&F/{2d*kQrZCb)8 z~([[Ao3p/j=^[D!\  `TQzDJPydQ#IFB`BpVrcm Ifn W{rCW*0xudPr59 uvZOL$Qsxejn ߎ*sOt8&06ߩK{oWB/ #n X^W F (jnJdlkp@9t@} "   >'cVD&]d SH ( \  -) } 9  *L   v0C7KAc u x mT5X0z W3q.AK U M 8X    AO  p { u2  c T D   Q  D3wqM&Bm?  t- :X   J~iM,&^F4hY o1$dP7nlaL!3Q6.J&#9&/c:?`>}:RCFUX{޲(ZݻQv!< ܸܩݟ)ݔH݊h}ob\^Xkފ2 zpG'm  zp3<zW. +w#DZ!6BPg@y_5 =  {g /J 7 'F   K :   \: x   dP #  ~XF     u S .  x T l 3 H     dh 1  N  _E  O  (J   ` O / dT-;kL/)sK M % q  b .W A|(itR7Pp!-fR/ r>;{6LSWCtQ# H8Ldf]>k`-~ i-SS\$nn'ߎQsdd߹lߪߝߕߏ߆|'qQgccqclX7|5b@%JKZEx,W.I Hp3BP!oW@$ o  - k5>5 n   ae   Y ? u K  / Dp  }  {C _ ,o gs k V =     x ah LB 3!     ]m ?  u  g 3,  6 v &:  Zd#L|0D r8fF)J L   gM 6  U i=couyYp2]KA>$pGT6@TU;'mnF0Y7GVl+?` 5pD^6k"g7tL+ ,Px)h"] _x=^O|IbXJaS!go HY )lG)7a*edpQ9e8`OhvJ>ZMCut S*>FC<0)&u+7]G[Nm}D  By h CN .@ (NMu F p .    ? Ym   }  )0 pC I G 8 #      ] }9 S )    `j #D  JT/Xkr3j >g; z a @a " C    brO7)wLiK2 Nlax3%yU$y"pv:mV^HQ]J ^Z ] \b?m4=~5YW<XC_t1g gt7k#n1?JV!=QM >Em63CTh*!uW='   j A dx9<=kF : A_   n  $ mN t  O    ! : D Dz 8Z #7     X (h F % FtV#&o J; Yho6~`8!a 5     ~ p [d G2E"kqKD&Ut{]B4"@s<BA]'K  N  H |:iV$C.yY6tP /xGm$fI%,'v|D sq?e Zk3SB]{6Wg= 3O< ZI 9aY+dw8g`gw%f|zFwwzT:[!byFB"mb< #ho ^nWXMdvHJA!U~d H-X +  r cE .;ON= I:d9^ ! /@ da      9 N ] e e ]h JF /# r6sQ.s 2ce5}'ds+FPq$iBB^ x   b 8 2  ?  oD N2?1pgOH$*d/hQ:J% RMd6Bm5:'xm;qbx'6o0pVp-NYh)wu[= Dn@uW>+%b =C6\K PfB ,ox+Gh@kWN=}@liF!2  f l -= K2[nJ s#IHkP <6 bQ j }     n W :  f8fE#I=i=dyqB _d.2^g;< _  Y} 6  %  9 i AF KF6p]H1rN"nOU0t'~$hwF!ikX8Ir?< 9yDOg.ozg;rK.v&o= d2_9!W-~{w.wwy[T<'a.kuK)4lj9&p`L0B2MLAj+ )H[.  m  4 ] . R tb"WbeAR|' .FMi9{  )! @8 OF [O `Q bJ ]> W+ M <% dA^$e mFKg`)lMU.zHa# wL S -p     q; G Q \_iPW;)E+ wNlI'CU{fOT8G4d6lt F]VY )k5`*~LCl6=q}EK#iN7'@y Y e) -Rr7 7yr:Juz[K'; f-FF^r#{zmUU1h"k8 ?   `Q   r] q>dF&3kB@0Kb{X      qmMI$&NvR-@`Mrwq?^i5>u} U= - j   ! w RA * [ o_z>yoY<y`E%Qw}1_F-6-|{fX0Nz7L'|j/>V/\*_4+^`W/f>^92^~t$nxie,a_]M]_/gvA[.=w8uzKPwP 7V)-8jOg=y   1<(y ]\"YU1x*AZ,q\oT6yX4_-a=<crBz)o28,ax-^ j >5  f   |% X 2L  l nDs`rO>P+$S}[k:qhuW\?;kR&Xy[O'|SX=,9KpBseY/nG'wZ= $7'e0_O>[WoZGE0+w W~V-:.[6? vy`T,]l]019b@`@'0sMbwTIC@=;7M442{22a4;uGZwV3-hyJH|KkYTZnj~$I}YW(SEL   T\   [ KP90SyDFe-:[uL~0E Zi&y"}onVF=yMr!N*z9l]@n{Gz*k57: h 6.  p   VE . t   / nHM et\w8r^?wnW<<LM{^C@,)u StR0/z ijDu;sR. !TvN([w^WD8628IdNXp!V -8 h DqxD =ooYP)RtYgwv0yb:@+ym4i ~ A k  s j%tR)*m1Gn!^;a-[ . ? KV\^ZOi=@(sGkH$~?llB0T?zLDQ p >H   -  Rd &  (  O _7m uM%yZr_-M:'U ebbC#S9at]D=& !tySy/ ;otP0}6k1J(uI% uYB-BuDV'$f6SwmQ39nz2Q`-8{ g m hrO=3 Z  ( | \ !pl  P45`oUW?Ja~| .I`kmd&T.=460&iDmJb()g rM!9Gg4P]U&I Q 1  j  Z ,2  Z  ~{ W //l4E,hiM39_mkkK, Y;r__N;&;o`s<3ugkPn4$inPS7#wh+^bUOM@MOS`UWBY[B^dfj yv? ;kqQ/. ZK~~]TDrP'#l_ H&   4t 3  #pSH+9 I 26l N;Y,rZ~ g I(i;m L* W{9U+P{\I\xBQ 6j 6s   @ m =h     Y6 /ITfU>I5}Y~6Nr*wb-K0lNeN(9p&L0'fH)= ygglP8! ] {>| cL5!YBo`pK &]J7r*VoS9"1bV :#l>vG  W o 3 ;  o!"js9x).iDD3wz6k/H_t sR.ivJ;* y2`P8abf2\a-BU N  z  T $0  N  ed 9 u|fy>mR{0S/ i0yGbM:M&@&nmP5I%oSyJdK1[#v{udR=(Td#xeuRm@o-z D7~ } ."/y=/PimO5& R {!MyuidfRks}#oHpZ<S X a#   =v 4`L&eIW _M{;w '7BJS][m]~YQD4! V|$eJ/t1YnHu#&+~PycT:l}G .  S u Cq    ~ N% .-nE! |}WU/*U{^oC* tiPtV;.w S7tf(U}D4. U0 {g'P=E*z @zvmgiYoJ~;1( Ya$+A17<@FNNT{_n~~? ?i~jWA)8`T`6{@e:  D o 5  ` w-<!D@;,b96d"b96RKgWz`bb[Q@/VmRa5Dn\H !e oUA5rl;0 `X ) }   P(  =  O PVV^K26[1Z )kQG# ei~ e[N5D(tpU^>'SWvFs\,E0$6^J~}rIeYLB5+ G}n ?2(39@HXTev7vN .4`8btX>(P V-t>^- B   Q X  4<{!F;72i9<n^;Yv/>FMMKB4# m6~;mN/j 9}S)>'o;c1c+\   I 5  Q g 0g  y Y$yU%dJl'>c0h?T feHg- \KnQ9100q@`P?m.H6;Szg&YJ|;7/"jK4%!!)F ~   Na   'p<@160m} @7rM(~Np%2: >:#4,%48:82(K YeGF"el]/Wm.6_Y A  na 4 }   I  + i01-!W! ~^Y)9 ssE>_pHo$pilO1`\ y_\A(o1iMCr]NJ5n"Ki/{njly LT2" &-B8Wpk]6Gw  ?vk2> i H  !  Q?  V  Xh qcr'jsZ8B!Ogw8Cd~$N4f::99dE&>N ckD$6 |jmyj[MO>/!Z|W9" &@e%4gDW'l|w 5T?vZ%R|1`j@ ?v^@!&b8jfF9 PN   p ^  l1v?C^c-P`lJ=vt2.OIi`}uoV6Nu\bA#R mnDl`R-'PU   _ ":  X d %q   e & g )un0_@{>\V'NPdWn'tw!Pw,+=eD\"&klRWBM2!Z~] ~A xg][_nII'@[w +8Nt;*bsQ1Q9Wr-\-n{aR@d(J^! ^  M % h T  7~: iM  Byg% w9e9n.Oo&AXisyyqbM2W p2qT2e1pF)m U@ow; .  S B q   @  ! |9&$v5s|2br?3{?S~](>RW#`\l."8iH&Y!}a^V$yoyg/\RIsAA;400.29?IVb s?y b&/On#DdkQ2 m)jhB$asOO-fQvV@1`Y   )y l'  v 7|UMKm!Jnv)Y?b.CP Z \ X! M' ;) "+ + ) %  Y & {<sb*?Bv<H YM gE * l  k +  , d !< CVA:H*<kv3Hq2Xz ?Ab+[pT!)Fc9k3bq@O:5e@K9`& ;SsM,? k2I#`p|$iD]jg+/[~4.mW/ 4ym?B~8y|\@J%4'vd7V 9 ' j D  3 x2nG'K-s*[!l",TQw* ;' E8 KF KQ CY 6_ "a a a _ [ kS ;J > /  Y KwTc,bRG"OE m  ` !#  ? _ T  a O k~k9dgX"HQ0 >^q3,ii*1wW<uZ5!V~LJpK%eO|CZ;H[k|vOrnligseZgIlCpCzK^w>2$TwR:<;hV.FxJ $gvL6#} PT*X'ppS9 "^UR? L ^  U ( k C;8F73ze%nA)f] / 2J Ca Mt R P E 6      g 7 } p a OO 8   ;JuK!B"g5U[ !=  ] g &w   ]  ! B#"m$Lps)X7Qy2T"aRYy=d*bz(@ Ul$>hLsP:, 2;UlP9$'v(`)ug`bm /D['tdFEooY_'WXPn,Ke':rPpE#h@lR+9'zcm, K_   l a  ^0u5>QL7&m4,X};r - M .l A P V X T G 6      g 7    I } d wH *)  3m%Ac/NZ ~ l / +  qC . T  __ d>c]`TD50Sph%DCeU!KSEKNQd-(wi?_STaaB"Vcysnjn8nnsw}@r/P7vAP#MM2(eP.wwK`"J|R('qQlP@4@=T' pP   F_   UZ*'jB;(cw%0p^7n < [ } ( ; G M M G = *      ] +   { :   c n Q n-  b`?2pg01 R  n D    =  % g*(>#Z  r$m:U6Ob[z/-kM>y 4vIn-p^4=#RrL'/]hMM6#k(]: +8#I@^bu1x9eyO.DeT vD}O5v^RwIB7tGmU{W7KPfR3@{ 3   gF   ;C O.'Ri0bl; v+ O p   0 C P V V/ P? CN 2V ] _ _ ] V iP 5J A 5 ( B   e   j _ : Z 0^a, T;  S  df # t  V} |1{Ks^gWnC{-)3`=;HWY -s*nBR DdGG1 !l; !2pRO.'w&Rskc`cbgFm2u%!'4D]'GBh$NQF2Qop'hA1GzgT%f{eP$Z{MW2KYi >b  []   B 5   b6v6 }%D k2i#y PD h    0 I \( iC o] qq k ` R = $     W   z ^k Z H z3 (  z   dr J ! 5a`, 1  JD  S  K]  a w.baJ[[R Fi6n" p}apCo"mmHn!w(iE@ fqXRF:U9@QV'zSuX=T$ ~D u`SQS]l0G`~V4.dW BHOAj 2O},/~e(01|Q=&?zQ>+I_]6 qqr6   _f   ?x ]b1r ,^fw+ U W}     6( PF bc o~ u u q i Z G .     _ &   d   | (i P x3   ^  } ,Q # UwV !  - r 38  ? l 'B AK=a8.l"qpv`hF]* O`DB:!8tU@9W w0zcu"zl66|gT. O^racU3L HHJS[j| 1_;`dUo Pm} e8@z&3U?W\/k{uN#'<iD[ wm+6 &z v2   \E  :+RVb[X;[- [  B |   ; &Z Az T b i k i ` T C! ** . 0 . * ]# $   `   u "  p c C O    { DM  d z  G    V    Fgx$}'wyg"Up@b+Mn4Vz=d# T~hLRQ@4e,+>2pC2]T!$_WjL1w6kH-  35PTlxT2eS$Oe CC}2$9H Tl;y 7~MO hw'P*Rw]-2 5?   (a u  XY 5|41E- G_   / n 3 V v  ; R ` k o! o8 kK ^Z Mf 6o u w w u ko 3f ^ S jI : * ~ *  v   S| V 1   @  ZO  m  z u :    =  j~w6m=cU8E,5t#\r<[{GV34 ul]^OPIPE_HS}6im0O_358iy.bO@6~.e'N'?.581E1W7oD[t 5&af_2q* >n,banh"/p^;+xVG{@f< pBzRu'8S H   C:   42jc8{ z1 j @   -( nP v   $ A X i4 uO {f ~} y o ^ E *    | D   { 0 } m 7Z E ,   Z   g = >  U  e J  n  s f *q  n e icBYTMBT6K&7x}kU[-Hd8+5l A{|s`nlPqN}`=;j|CD5fOE % ^2 0S{Aw3Mjc(m=)M(@>jE db/Y oBNxCV)xM$Y1e0|E J  < P  C H "5Lb\a! I]   j 1 ] F     &4 ?Q Tm b k o k b R = "    x @   w +   2  zy ` E S(     1i ; E R r Y <  Z  V M Q K?A`8,k gY|n=a|TQF:!.Q$Hy F ^(N@O^`UD:b?2j-mXoCM50*$"$*7EZv8^4b@ 3J`gD;YGan Z Q~+>wWS (LhBc;pNf!5J ?  \ S  ] CRx :'- M    >5 g   _  0 S s , C T ` d d Z# K1 9> F L O L vJ =F > 5 w) +   2  x   Oy X |6   '  :g 7 C  F d E + ?  q8 00_${+ .y|k"]hQGF:1O)!?g%Mx @+u:PRl@%?VU1 y#E 7xNt*< sXA0$!!(4Id"Lv!_QHheBV3:^[~

W n { o \ C $    g )   U v f XW D / >  s   (} X @.  M R t A O I a ? % 6 b(A QrbMR;B}6)T Mt , LnB*h9Q*m_% ^ I0  L F k 5 < 3 H % ={]i WjGb7'L'\ "In 7Sm.AY6wZ0]O2,qv ay)o&Rc(rDnH' wooqy +O{Hz e.oXOaJX`f0. z,slP e^FSHVCBgB=D?S-U  V u !%  z F!_VO   1 t k  ', }b   N  > a  . E V ` d b" Z3 KA 4L T Z Z Z eT +N E 9 [, "  c   H  { r S ,/  @  I ^ H 0 B 6 ] $ (  n - |\hTx(@-)w ]2werp$qGvf ""66KN_nw%T@h%b2pJ^Jgk(Ut? dCj%M 6# +D_0S D[o.'|!cyS1[e|I_9 9l"<@M ABKHQ{M_ lxn;~uMc  E~ 2   A V 1ya-  u & pq  P A } n  # LQ }    = V1 kN yg   { m Z =     W    <  z 9g R x; "  8  T  cY / h c s Y A K 7 _ $ !  _ ~ f?M5NK 6sth^BXoW'ZEa]jqy .!L/n<0Pae7y7gi@t'5ZJtDMne[PO=F1D(H&Q(b.v;Ni-c A}0N3AgOONiqBhnBy\ I +?f8ZxQ  2}:?7} (7   Y  _ Z20U  I _ J  0G   W J  B   5 \ A ^ w    !2qAXK9QSSO~IB>6*h  e   9  `e C z    z L  r  ^ G  F + X    H fGf+pfp `KS IOAw@E'L>YSkbk t)yNx C|'[:VI|NEn)&zm'2Mi?oA$Lz(R,q>l,r"slK~+ B#4/C=W_pe.;de2!DZ^l`r  m G `  HR  (7] ^  nt  e m C  @ `   ;" xR ~   & ?P.\I``^uVE.[ {Ol^KN8! '  O  go J r  s m h 5 [  G \ /   e " e  FO  *f mgPb@E3|,(B)i0;+M>eIP6W`Z]/bj gNp}>C>_h=U/sCCJkXJ?9n9[;OAFNB_FvJYn6q ?zDQNY $ d7O/&4 WX*4E^&Y  / # J jbCjWwOsy  *!<!"j" ":#dU####$ $,$2$.$ $ $#f#F#-]##""4"!x! !{ y' w{0sf"VA*d (o2Agr46w`+]g#H 6  7 ( 'a rM@]>~ \ < A  P O.| E|kbL{ _ "eHmw7 Efk7 }'Mev[i"S=8w|I'n* (wsxq7sߌߛ߲ <3sa]i,n~9+(mRN m%Frg2nDG% / ~ e: ^k cs 3I O~ ;M   y=  0"Ep{&0L ]    ( _   e 5  (Td.Oe 3YN[qVHX&!yOj@^; Li&5hy   # L v w\+J\GJ2nB!' h 8 4 { J j>t6Ot'WnL8Qxh2r.j= O#wH)hR+-}ob1XM\C6(71^( .^'y"v(=\Rf}3"8yX]zO!8n"[j$5y^M"'xj;o w~M` a o , : D H aE03|b>1R,|m >u0DRzoS%B-SWI+Mq7n> H   ]  C  !    j5 L P NJ ; e*   * ( E P q  0 sr @   "f '  $  ) f%(  -z L H(  s   @  fh 3 y  t? Y_ /f fcv4 @vS*.gnAp{EV!>6(?`Y^ i_jfkqE!a1 6bf )~Jp\M*R`j[?7Y.^181]&fl1)pf2(u{HD V=      + 2 2K0)#/r!'*2c>KW`d2bEUK@I#8b(R pR)q c  y \D : q   S  sC#AgxaF9 FS[)tm.vX5' #OEm(aF;BYz;`!{;E?&qR*H{hhy=&g[w^K;0,.62EwXm!{1\3lG-Hd=eF0J^V3 p q 2 u\ > F  a  \ A}-uLJ|!i.V~:H2f e/ AJ d {   l 7    >  a     p   s  Q ]   # m2AY[w(8Mr sGmTz{p$WH:y*4[TEGF^d[|<xAStAJWmR.SShQv\(Y%kOjK*e(ek+XNP_zf_QE XBr) lNU ^>$K sy9JdKb)ck'MO/x | 8   . t ? \  z a 2+ Pow{Te".-?<h9O fd :P A3[|Pg aGQAA  F V  3  (] ;t#uh"\}H:.phK*. B  T " Bfy!t$=zqLfs <\KmA(n/n5 tt*_H->;$pyuqkuw5{}+}{Iyso/dZO4E:4=026L> K^u{ߎd߭^^q%Q}߫W GgOsaSEZ@;L\W n~<-Mt#yR2 %>TdiLd S7l  ^  U 0q 4 $:gS =g q n xX 2G1`|aRq8= <av=He]I8~b8 A'8&@:%E!^^ J1 a   S  Gt^] I{qwYI-zxT^El% `N  y< G '6p&[J._=#bv<R\?=~$N> 6NV{zS1dAD=dxCAT> xS`WRoiGmy9, L9M'MH~8  ?] h o  ]  5 vz ZCB.'Sv`p YK tT0@   ]   7 OR t x  X ` A 1  "   E ,[ Z y j   F w q o8 wm8/ap5W8[c%QP' 1 w c 7 Y n  9I Fc Pr W!^Tm-`+|I{jeBJ%*hRx1/yxFg U{m\b`fqc7%a;An "R>_Qp VWsd-;^b:HU =s-4^dC S= d h > lH   f"K qW$^eI0^&]]l1 V B  {2 > = < {V00 vNx"y]<-MpmI(;tP!~$a*@&h@p!P 913B2_U?;`]wxoT0 *X&V!8FOQQ MHDBD8H]Q]jyL,u6nY;^$1@AT+iW =`? l ! MH x .  E } k /6n7.qR8{>Nu! i1Ut6w(_!xO[{9' Q Kv    E   U   < q  ' y [ A @ ! R  ] ^}QR!8g~tQ*\ ;p}bgN +L[Dwb@|#G,r =@D~6c}QzR_VHI IxPb.[$^2vja_cn L^8Y9V`2w0e@I4{3^^ v[X4!K&S/K=0Qw[ a   (   -  x XX>'( VhJP d( 02.$mQ% n > "!e!!:!!!9!!p!!i!C! !  ]  ) ~  d XA?]T^&H%mNc:/1W07iF^^> ^ W m (" f zJ/p3urK#-j|g[VLEENIRZePq|P Dzs:o}mmo_u| g+]%Yu4i`$VNXc1;^~f+\ g?cS]5OXZi, ts & mv  TM 4 s_  aAx\-e6z3-'S $V:_j*F'_ /gLb1W|R *^23zrnintW~]y "=IuwN , p v Q0 ) F M yEKDV8,U {R*#>fv]B7$pTlI'[ uO4-!Mpykego;!vW,^"Ln *KsO)W"Nt  $&(0-T3}9DN%[dgt~)jWK4NQt#8.Of}D t M 8 _- z  @MslPcC>ID~ P NuK8r$_zV80k]  1 B 2O W |] a d Fd a fa ] s Y S t J > d +  L  % }IV{F5hA8<N,zOo0ya4YBm|:7tURj1bwmb a=]:zA=|vL<'eL7$%UXP pEJ>K&q pjO-f S.3TnpWa)CnK4|&&w->Yw {  N  V / p  q _* Pc @ /  %Mly:G} }d!E' ! !g !. @" " "n #% H# n# #4 # #~ # # #O z#a#yD#  #"&""<S" "P!i!c ! w5 G;3WRIq &tn[s&$a_& Bw p M +E x ?po`T'KTEEGNX6icy"S#2L>KU^ hWr} MW &p"(-[-($o @ ,*:Qz޼ݸWݱݭܧhܠ,ܚےیۇۃۇۇێ۔۞۫ܺ,Z7FWzݢXI4or4}@ic0bjwQ)7&l$6`U|hvJ|kC {  P - C2 b    x 5 V Gqzx<hzHT0EXfiz{/6fqPe&.j 5 le  ; a ! .!} A! N! R! N! E! 0!}! _  4D  Yu'u53'UXmWj0R(~^~+XAs%"t6 T x A a #efN>,1p'##4)v3BU3ns+k9o2w%f U/tHLP 6j59 {XilJmJ#}<(~Z,~3Y9 @ PK 5-Nup5r4w&`h(D{`:Dmyt=Vo:sP  !  F# ' `) ) {' % ! 2  h   AvmO0[1|i VA -j  $ q S ! * ^  T & J   7  k RC9"Yp8Cc 3$?Zxb4a%xV\2 J rL%FqM8 m H"   y+ 4 } ( b x [j  El2rc22HfgF) PY4z Bte%M Vi;^U{yfWWI@D:8?:@BKYJlXfw&Pz:4]g6/l=8 H ~ S O a  /L U { M)>M Y+`-d'b\SG6#O e  d B1  }  fN . p p/ l/V$T'f)8VR*]^vtc+N7 ^ #qVC7 0).P0x29=A C$G4KCNNTV\`ioy-4nhH BtEq.Kd-Ow#KtX^9Xr-U}%WF NOaR[ p(#.:3 I Z hA { Z !  #T B d#L+Wa Z"Y;7 oNS2`;v, k$&"W&Rl|> N6Kabw@etu a  @   iq G !+ &pt=  Rh-"es0/qP4sW)Kg5^{0j)ZANkH3CiH?)`.PK2g3=]^<Q.I2f\ [W"&sb(8HD*Vy{!}FU,#pLuy]'?% /? [7Rjm Z    H v   q ] G" 0; R g x   k 6   k o X _;    !p !: " }""<#I## $z=$-g$$$>$$$?$$$-k$I$r"$##Z~#9#"D"@"!<s!! D TmBt-cf)fI^6 IJ|xpg a [% YO Wx Y [aiv>b&>GdiB+jHd=j7%RXk.i, rTM _!ld޲xި ޗ݉HxgV`D5&r Cھڼڼ۾Ju5*Fa߄ߨN*\n4:vn.Tn?-@0,Da>_ =jqfA+;Mc\{:  0  U T s    ? V ^f 4s w w s 8m d Z RM ? 0 [   <  Nk 7 6  l B   q (!P!Rs!!!!!E!!i!!! u!N! !  l #' #>&-*:WMqitd'E\ FXQ |A?MxS@/ " j ? [.v/SxI?dz96yeNV0~Wr j z,2[O6"m*!39_){4i3Vb#@k]I.P@j&=Z|&Fe-f-|*#U*./00.*&lVIFTj~g$N3Mt%j@M-ZroI#$%W/ xluQ6p]2wN: $   Z ~ Y 78  5 =  h!K`+ h+>>Ncx`C&&7AEeC==. W%tQd-6MW+ c " u D Q  q Z# , , { a >`5l{ fSCB6+ #f #+T6EWLnKY;g}:?V &Y[lO~6O * }fQB9)@4Yt32/1$RxU 2 Xv } # w  'W D _ { N '6>A<0!  ~ N  d B a  b. . z  LQ { b'&:k(IRP[jepA |#@ Ckn>@2iC LKp_|SPH&@>@HUgEs 46EWZyoH8he@dv W 6`T ))bHj(r`AeQ0u@#* 0P4:?#ElKQXN^dk6quy+}}(.: C I S  3c J a{}7J4WM;+[VGyIG {7]| W8o:ftP+(JmYI,[AQ^UimoNmf\>O=o(     \ z V 1v cO.kbBsHb$Oyq z;)p) ]'y_#x5"y*'<8iY@D V[vEp Et#)00P0.)#cKIar.W<!߮ސ$oQ]4^ܿۤۇkm=T=(*Xs5&?_*|ߠYOOz@Sk<V{HFIHSe{2){.W~c, i,F^xM1i6]   6 ^   ~Go=X?#[Hck-fj3 #  !,C!q!x!!!d!!!E!!! !!Y!e!5!' X} 1 &,`cC;K{^u47mU'3GybEO@45.' )$ +t 2 < Kg ^ s XBL|&uZc aWg$nqP"}B4AW&GjDP6<0g,8?KoY@ _6 APq [)>`s\KA;(99?FGPXYm_aca]'YYND9 -J &w1lvQ1klmdmAjm~}W -9wb:`F{\77O~aY1p +s\JG4d#rkI j r Y @i )  ^  [  V 4u {/dNOh8| r&a.N599"7 ."lH#c>kG$h8 vX R / U  { Y? 6  _  f  s`XN=0=&'u(t4CVrmq p4b{.;|WTb,K_kA#Y.{dOv>/V%<&#-:pK[Rn.]  m  1 L^ i / n  = ^= ye    - < Ha Q9 W Y U Ol B- 1  V  V q M1 *^~ _/*O3:EAFz9MY@kI>q@W}B ^`KC*~U1 veWL}FwDyJ{[p5$gFl)U"Gk-]I }R(BeLGyI#dBdV -fRvSE.C'Vnds}4q)f a(m @'1:DeMWdAp ] 3 |   4` O l W  V  9 _O:4bg!OQ1v"W2i2k#MuDw 7$a1993&!Efl>  # 1 T@ H O pQ M H U@ 3 x%  q P  s O * =  t=?ZKu9(l;(V@9 <k+p([S45sv>]$Pv&PM[,y"44n`3Bf:Cq7weVGA?AGP^o*R|<f\H1pG<;uFVK=O>X}wL$B}HbkT [^{*R}-DY"lM~u(Y'^:tr[.Dt+VSjEe+n@nZ\T#v ߙEk?HݜwHU4ܬܗ܆wmd\'Z[Z^g om~ގߟߴe k1Y<\F|([b4WuftxF*u;ZBr&Y=g   + H#btw}<p]Hb/]4{VX,`Fk1Xj!<`=Pdxw)X2?VX vy!/dg(&<|JEB6{Y"<# uKNl ( ! *]b|W>lc=8}Vf3M/pxbG\] Kdx=v#MR"h/SftAU#(17=?f?M=67&/$  &8O}i]>O^6 A&Ww&%^5+V\+*a/|wn@ne`lDb!n~{^A# xii[RPJ:D?&=;975b1*-&6  h   C   $% /q 7 ? F@ H} J H D =7 3X *v   .:GOUXXlOUE>6%!  e o? V = $ t F  tK _ L 9 (]  O  u,Nt&-=TpXBK{u4[u9*v[)htuM0)UlQYH$:-#g@Q%- :v D S, _ l x! m : v  H +q > Q b p {  i = sa ` I 0 < 5 Yp + .dJ.[|d=itj-iMgf] jfq~o3ApO Kz5Gn/c Ml: |^Gi5V$E9.($ "(0 =L$`7zPq2!^WDFt;z(VE%+`~2NS.v^08/Sy30 3X>~W *tGb,{2&t#6\JaxF=?4M@ d } 9 % q  > ]W ~  C   ;6b)v 8fZ8L|WCwVH%O{Jz;[t.X 8 Y y z a B    & j3 2? F J iL J F r= 1 $ K  g  n  ` _ A :   y  9 V ?c^DIV~YK|M 2;jp B'XvC"[t DS~1]6MYI,Y ><V)&NcHz1U5"/7QPvnT&T2@+lFE?W/rB*k):uPBu>vli^-RG<2/WN}k*ZZH 5 #   ' D[nuJa}tpfUD^/3VfgAV'n @c   !.!YP!0k!!!!!\!4! !!m!J!|"![ 9 x 1 6vw:spTpp]uyU8 l(--F al|J  9U X u  J -)d>Qd wCz%\;rWw`SG+  f?X.#ttBy 9f.qR@@9OB\c*07Y)wEߡwR, |ޮzޕ|ހpaTLH W n tEGyfBS@y)$*qP,D,hP)M:FJHxBD3}MqA c7D SpO0/[w{y y{sX: +W M p,  n FIt( ?yu[<YUud eZV4yY`>}iw5p5V^+,]lW5VxVl  Q!&*g*3*&[:a=l< g.z%;Fnw4$Vi"0Pj ):nnR+Ik,Nx=\wj:7^o'M.W&]zg*TF9X1(!&&(M-5=~HTG_i vh~n\@**zAZq`1 p  = g    4 !S 's - 6 < @ B D D! B/ >: :> 1> +: !3 )   y b I .  X , h 6   !i86Qlg3Dpf4=wo?:cd=[`uY>n'(Eh/T l   t   b   5 v   & Z   + 8D%OAYU`fdsf{f}dy`qYbSOM6D: 0 # v A    B w R (S   A e /y  {4:LfY`{*a~^$Vl NEGzBADAyKN\t#^-b5wJkQ}|5;uGq`H#t`&1T[0Z9Xs < _       = Z ~t b C     i 1   n #   ,  p   0  A x BZ ; 4  n S <   p XiLAj=xu#iZ K*] P }Q<dR=B}kP1AdQ?-h.^jL%Hm@Z6uS:߽'߲߮߬߬,ߴ>Xw@5bx ^NnEu'{9+6?V^Zv%0rKP6 m2Yla4u{)j`[K< / / ]   .jC9Xdow;{~{Kywq2k`dVG8*l96z}aF- D e     y b K 6 ! n N % Ie U#AMK7':OLfo) 0;Wr*z   b   B $6GXdgu9W/y S~mX/Cy,_PrL"OYl8o1\"eiB+*h%].HVp NVWf-W%\,~mc]^9agu{Gnf^YUWY[i`hIr=Kl A@_~=f&*PuV,K{g M93g 0QnsL,8yWTx0 Q ! 6 ESD^fj8nplpppsp"pnjhbf\U$Kz@2#O '>O[rb]bJ_8U%F6d.}omb"XMG'?8o420F00u48?(GQ@\hOyTUQ !J @ d> 2 &  E n 'Y  0 kW) <FY{,d? tD{MP5- 8`9W  1 EF W f r P}  v D } r d S h> @'  Xm*V?,] dEY` \U$I7Le<~2/<`8PBnv3,u`: EmABtK[B-S gKF$N7LaKv6\,IBg98@f1~T-Hc |F}"Y.Id0d# J n  - > M [ j y  * 3 = F N T Z *_ ?a V_ mZ T J = /   ( G f r %[ QF }/   By)dgI.0uQp5[H5$$shed a   T   8    H    3 g    EfwffSE>'   \   ^ 0W   f ] " V  b ) Q7r5}W; Ugt}}|} (23PCzXOt=4iJ Qy8X ^3D [:paWQLHJNWar6_ JxA:`lQD_*5w Q|9((uEcY5~5\\ BX*x2pZD/rr8%w?3Vpj  (z b    K   &[nL$TB<RhQ=9g M2ZIn 8 ]    3 D T _3 gR go e a V J 9 $ * A X m } ` 4    \    F   O   9  l    s *Z ? +!   x g ; Q  } n 6 6y66 ]j j@b IFA|I.tg)YJhU"-lKRkV%VrC+$jc/t'`bT'|@c=lU߹G߭>ߠCߜKߜ\ߢu߫߹ ]5X,~~06ots-v1^~-\X cki8p$eI1; Yr#yf<y@i~ZJ 9 2# i   0Yc4<3HM[n~-VheEl P8Uj{s^C!Z< 4(o2=G+Vb=qB8$p-CBUhs{2K  Y   _  * 5b?H NdRVYgYVRmLF;w1$-?Z{[{<CyVP(/a+tfG afN uH"M{8$hi#jQID gB=RwvlBhfjs^4 BriP7$k S kC/1?[ J.CZ8sL/AQuCx92[|b 4Y^U-S}y- % _ 9 V t-7!4=Z"ug%{%W6DSa&nK}o #0m:EGQ^j|wB{2GF/F]+va%I= \k ~    4 2 YP  j  7g7[0bD+]uG(]+y*#\}- J Ct i " 3 T ]q  q ;   r! B( , , * # l D  m K_ .9  J  gL1Tz-4nYB&.g>q|g7R?b, !It 8|kpcYBNF@)95u31/|-/--/S39BLZY&gxlF $A^~qdZU:ShUZblB{~;|@)D_ N* w7en'tW&}+N~#u ;keZ4hU @Lt8AsS8 hF/(c\8/ o_  M , N k . f  R  ( : KM ` q  W   ( p   I   ! j   F   ! k   J * t  I  S  = s } w q <h jb Z Q K A )8 H0 c% z         z c H , x _ B "  h >  O } Gc    TB   E >  , P f D(!HR]xo x!{1y8v5n+h^ ViQNM2NU`otVD:E7x>UQoR/j%kdg.MzT3eE*(C(iN~ S<]JIN{/t\\t 'Gh!%$ &>WgrA    O & @ V wb n q =oc2R:[AkO7>!}Bg_, T!!"3##P$$S%%H&&0''(d(z(k )]V)N);))*,*K*\*i*m*k*b*T*C*,* *)))t)B) ) (/(9F(B'F'JE'H&D~&;&3%&6%$ L$#N#"K"!;!w W 4 Z|!E 5L.|u'X7X1u9 nJ  x - Z 0 P  n 1Pk  {1CmTfcu\J,`$(W8K,]n {V% .TV|'ޒ DqdObkBvb֌=զ7-d7қc?ќSTС\s5M- Es-EOsҞB-~ԽC6uװ%{`cۜSJNiZ߿n}:2Nl"*S'F\ #fT)S> uP[F A q 7kCD;], @gXd  x!"y#s$[)%%e&c&g''*I(d()) )W T* * +/ +z + 3, |,X , , -' -c - - , ,P , ], ,+j+_++**aZ* *I)k)  )(8(;';'&'&ps%$ $$[x#""ue! D UvBb[ 1<BmWlLy (>1q 3 / " F { fM: 'u`=[F/f{be =\h bx'>.,z%X? /j ,K 3* B }^] 8Y tA:F[hr%*uAB]pP|5>i5 z[/HCc3+ .2^=U<{ TzCDMpeT1I rIc2/ &8naW@-< Ox !$F;lZ(Z4OG\uYNP>G7!=(MR_i(W Q " [z C E { v U E * 8t^GS(5k?)f k+ :\cC  " D _B r | M~vj5YJ{;$/)|'')/z;HWScnetvVre%U;=EnSJ:#;~.CKKEa89' n7~^a*=   Z ]&   Ov 8 x  `   o  " j / 9\7L%4_q k=^f  S   /R I ^fh1iOgml'8\T-Iys_tM}PJh .X=mp9/s8Y6oJ( wqomqu{{vv{ )Fh$3CCiVkEyE)jlE7%Uop9v &E`k\@l;?+PSx e.ek]bJ'e69%etlWx/;P}+a Cz?5-n`M3   g,  ( b  F  v,  ^j)aTEuGy6l! ]  " _ _   4 \. zV w       u i \ P A 7 (      z B { ^ fA #  R   ' x bX 5  A }  W  <  N k 0D (V-h8 {tS\-D0^!xtJ$YC54?]p#[Gc2 ]w2P+":KYfpwvjcaclx ("T;Rez%b)rcl-\+g8 p?| gsP7@ n1f@?4g7 P_'Ps2)Wl'O &k/ 11/8-& R iy',f@5Go0i$p/Y{DU~Ri"7 Y }cLh7%#Os*s^[MA88{>OQ)m>d EP! _!&4EWrl:"pq*iggpiiLkg`wR?#&n 7veL27u) W )1e;F&NW[D[YUOPLHBHJR"ait4u;1bn.s-KKj(m;t.fC!   1 $ *7 L %c z "      . M j y  l  a  SF7{ash&`UI4:,"k   = {i E  ! O y  [ 3     m C     Z t( M   W y# 4PM@sY* )l: qi 2?   ` r F j cf4I\(e+cp7 9w> WH9!Io ^TYUqH;4[5 Hjkm&lSl$gw&s+'wgIm0 n M (.7P?ELTB\gu`~=!\Bl_Ym[dFny"XylhU@t)6 !>h4t*f6 GFu.o4IR}>iJr)!)|&9nK RAIp /Ar $ G q ) a (+BAhB 1:Bn;[+G/ m  ! o  ! 4 j,  2/DiGP#,2R0* n ;ii?ht1:gy2&TD4%Kmp/Sq,9ADA=3($+* &  !  v ] @    m4v1U  m+rB`_}.P5f`o(l]^ H 8 ' | " e n + d=` 6aZj~W0N4gs*&RLj,X:_/XY7hwCBr9 UOHߙ_`,-ܮۑzi_[EY]eNn tz׀j׃@ׅ׃փրրօ֋֕֨P דO8ؖrioCڲ&ۅOLfݮ qk}/ 7 Y/, |,Z(8EBFEW<*] q)rV@i30./;MXd!f#   G   _ z K  v ( u@9 0vGg~@x\^<*6z)E ~_`E@  !!#!MK"j""<#z####$2$?$G$L$P$P$R$T$R$hP$CL$E$9$*$$N####LL##"o"6"!t!7! b  8^c*O.b9i@[AA9+T u KT  - q  *i  6 6  _3  ! ( y ;iK \QUOUH[=[0Xi`Ox7@ "tp@ixiO1r. Qj\!]Aoi(ޣD]܎7Eۋ9T ۡWb8ړX$ٚrN/+Klߒ߻L߉b-Jnޔ.NmWKNIeB%JY( ?A &n@*TdpDvwr,fYUK<z-!J h 1 ' . 23w,U) u#c&]yL Q#<Y  n Z   s #z  n?!!!6"}""U"-#_#i###w# $9$"$ "$w$ $K## #e#Y# #;"o"d""!!#;!> [ {< },9PoHE3T~a'AY~d>7AT>#  : m & 3  /.w+Y+:|.P8}K& j32: ; h : ? 8  3  u- e(^ an5qfcW=O-KP:[dm&~ zH9RuUp8,_8~$p4hOjir$!V=;{k(Uh+F{KC dm&=V'lI'gG- m\MA;4226? GTbds>!^M}F8-p3*VQHTA`Q]eZ}VqS = 0 v  < -X q 7 C b Q % D f g 9    o +$ . 3 #3 . D &  H   A B V    g   D  \t c KQ @ + ]   , m   6  s ` cI 2  8 u    c C $       h M 3  yiVA#wO(p/Y@/(c`6 >"V&[[&25U*!    Km  T  nB 32&Qt> lVf2D6_6-=Rn@t6unP *K=zY;Jy<ip=bSG:-#pW@+)7 HWet#'-4:@DI,MGOcQzSUUUUUSSUU0U@WQWbWuWWWSOIB:/%  '-3;BJR[cit|7R-qMr4(OJjg!BEnq``HP1Kt3x=`}6p)!nSX!up/7EZ M]u9z4q /' Yd    0N k    ? -f < @ > 8 - !  + 8 @ F F #D 4@ F5 Y) j y    { ld Y? B )   e 5    a ' f!H]osg^5XTROTV\od$oyJw2r6^0cA+"@Wl}tpnpt&{=Tp67OVkv 6b ) D ] v F v : l & 7 F 3T ca m x  " P ~    % M rz o a P ; & ( @ T g x d 8  s8x1ziDT@&8 x>[2`vyG  zD nUX;@`c@; rw4g~[AVTD]po)$XbpdBY yY:S!zkPG$,$?xgnjl pKx(Tz2rfe]WDSW_n%9XwRj-#4I`yC)uU .8As/B{pd(ei$g/1EyH V7IU W 3  { H    `9c0p:[)It>  Z5  . K '  7  C{|k)SKj9W  ~+90BHJ'HtD;/F",^tW6 !1>FqHEF>4#Lb`#0c ;RQ {?0rJ_*$o q  [ a % ? B z  H U :,[`{-o0p -j$#(j-en89e-][P!^L mX)7?ZRH16^}t @߭Cj߀I(,߇Bߐ`'4E hޖߢ߄+iaPޚ=, Rޕ ,%Cue'މIidBvP2SaS) [kI3P0'c,?glBpVZ%0}F+ \g$2cl2;  Tx E  > Zf >f*C} +A  ^ z .  #3)|#jq^>VH1#bR]% XH h C  !   T   f } c W D ,!m!!\!"@"h"R"""]"""G""|"""-""=w"^"?>""4!!"!g!,!w  Th  '.a~+" hV   ?}  m?   !f6/?`>39/u!R4n N'{ {a - V 2 wR3w C;tDS7Ah@@I O_ K8h4&kg(C{t:Q\(4op'Fi:n Oq- }ܲCܗ~kXI?966=IIVe;wՊ՟gմ-4rShwdԞlw7vԻNTէYkֵop.?ؐ.[K.ڟMܐݖ"{߲SE*vKd=IxD*7.X{CWS   ,  U  t   ( / 9 , A D AC AQ5&ZZL}N*Wt6 _t*=38ln !!&"Nq"t"@##$`$$%f%%!&#H&!&&&"'C'^'o'w'~'y'gk'FZ'"C'(''&}&K&r&D&&{%A%S% %$Hg$ $#B#:"b"!cs! v 9jVK8L tD64D |  = h  # oK   M$  [ 'o & H R   j ;H_,z0mLblvy5\'-09o@LE.JMTY bk.xF]y 8-T]t?6/m 'Py$Dz)RDv3z;Q#c5iXhIE=%40.4;EVk0h85\,>Gh )ds15l\"!1T6eGd  u^ 6  c w6e Z I H r u   w  T%/94@->z,Tl $>xl^2t5rCktQ+m4|7QR5{nZ4 4Yv=u>o!&   L   b   \q3a^Q~= (+G c r } \ J :* -3 %6!9"<)E7THh`+>IqlT&[Q:f,X/x@H\oLX C4(\%Z(*6EXopD 3s]M'&a|Z9`7r"Nq- othI&* 8R|aFs*4NZn[HY:+!RKD4)8PFYn;o 50c`E$WY;9^~ol*l+<]OdZy`ebWH4 .1( wB  w d_ O 8 #q  %   3   0} ~LqdVE2Ju 8^zaH/   }fQ:%s^I2kT?(xLt5talP%@ / N   r ) E V  Y { wsQpnnDlll6lll.nnp-sw}6Ii"S +]9'HYgx`6pV$A9-Nb u#2 @M-Y=fPpc{x*CZs{nbQ>+-:FOYahmnIp&rrnh]RQ"@-KYdAVp=A fd'{,m,7g$DW\A@tw16ju+7uz=>cl3Cw\C.>j>Uh.|"Nz`>5X|g^)`xGe#AmEWr5)g/$V(|6rti5t Z,f:}65fk+bGkN # N@ Y p  > w    J    * g   ) n   D    b   ' f C z } r # f ` Y O D ! < f 1 ) ! ,  k   I{3_Amyq8i^`ZQIA8.1#Ja zp_$J,52 9 ;;;4.&tW:qMg&H']3U #zS9'hb.y# k Y " @ }h E d )zy?[0LYYg_g,Fx=aS*ng5,xx?>V\%6`+5=Um)J8o@4BdoL,Gc%߳ߤߘqߍQ߁6tf WH5%yf,>p|}L1%MlP9z7?u aW pF(T`wO?ek/`SPzAE>   < Y  61  lm*O@- J  N|  MX  J3  C ~ 8 U"-di!v2]R iTj H[r=  "M1;; ;D5*2mtDOl'k6 D l}{,Q(kr!\(h;u*@AGp?+-P xpH s ; 5 Y u T   s  5#R( +f,p+!v#|f+D17d6<jB,NBdP"\O"hfxF.-Dg/.eSB!$kr%(߷HM {ߓ޻\a*ݽpݯ)ݒ{ݧlufGf#jvۉۢ ;gܙ8 XKyܐߡ'z/h9ݦ=ޚ"޳`LLDX}l-Nt;"Ze65 -|Zl!aZSNtIRD2?81'vEg+ } Fw _ A #b;U&\%  V d   T| 'V() ~|%Xn   @5!!]!,"is""b"#HH#g####L## z#ec#H#-#` #""D " `" ," !&!!N!q!o!$!! !x ! !!E!!c!!n!!q!!m!!fg!E!R ! 1  W g wK pa eYZ?  vS   4H  M6_dmb [WQPC1[tr8O e( 4 h z9 ^ qL?B CsL=_k}/=UttZ/PH[Z=l"|V$2BrK#R duX}A.; `.pR(2@?I8Ve=wN߾q'CS݃ݷ<(edܢ(`ۣiH',lۯ ?ڍ2ۊ*JJk۱ۍCua3Ng<޴U-ߤY m 4NS@v p1; X}n6V>c% -_nJ(1:8 t `1 O >* 1 $'  (  'wF  i  #L w  hPx%A|,-yhP5n]~mT#5(s|k[JH5" 5eb4 ^ "j/w~:a?|=[n#%ZC   ia   Y 5  . ^ [   ?  , d = G=E9]%} 4|\R 9  t (  a I > g|f-E8& @nEbNafYr^Y.PKy;I1384GG_cs#K 9V[VN|LX,j@]7u^lKJ=+2 *!!{#`(I,026 ?IVf{#Q"V0dN4T$usu 6-d?3oM8]#vM(&<uUS*o0f:eC}4c3R;ID@F4=%_d&3D  o k O : ;  .z  !N  v{C+|J  R & i  < u0 s   H@ |   T 7 ^  Cs+F_vwZ;"0=GPrV@Z \\ZSTNC75(B:  & h Qc 7  2  ]   \ 2&  9s A K  ^ n r8    \ *!  > k Q, a j o'  \'MJ~>Wu=2+i&y#d~%0q[9qa@/lo>L* lD!yZ=!(CpaXA*0d]w]F&-i0soBR2*~-_7BR`2K*kt7I_'%nGKe[,7Ney E-Qu^7  3DPv[_aHg5i%ki iec_]Y TL/FF=a1$ LzjM:0o]uC`K7\$'`-gNN5\l(wfXWK1>6 0{)%R! ~ 0[^vhY]OD>8]3/- )A%q! ' @ W n { m ^ Q G = 4 . & " & ( * ( & "     n ] J 8 %  *:Mby{fQ!=J&v4fmY;Dv1 .qBcpb?UH<1j'V M@    a    O    '- /c 8 B O W? dq p }  .CS\bb`ZS KC8".(!/3 5 5 3 1 /a (. "  } 8   V   c p O +a  KP8x;KPw-SP?L7I{B6U"! {P_{B..J"b| ) 4>?cL"`S~*Fn6bN t*Ff-qCsM* pcYVtVc[RcHm?~=AHTg 6fAWq9-Y01 5e?hID%7v:"|L,e}%r P"'p( 4[J`hy7B^Rr fzytr,gFXH l 3 5   i ] 6 1  p ZEpgoE S#   $i e ?  $ `z  L  OW 1&PnK ci [,6;=AC==2w$ Kwg@;YtsKTHQpGV;:% [g +  8  R^  z  P  u!%/,>vP_UluB|\} m  v u i #S =6[ w{ C0dWv%P{1m} 'T02wDMb hFBJ"p{cK dz{R*EpuQ1p;xy}s6mifdPd(f fmu݀݌ݝݮ7!Z4dj"CD/Oq = 7 w O  W 7 X U UpW\feoVO2 RGCW!Lh*9m|6Mm{'/<FQ]_rjr{}rdSv>X%;iv;H ps78~F9yb0s=p6z^UA|%TQz %J 5 w > 5 A Y =  3   (5  W {u Y18Qq~S %>Z[v%T6KH_ru> m!<&|)U+4./2y3i1d,e(r),C3|@Xdpm"#RU&nX2u*ޚYޭށU. *X߻߶߶߻> u!I.unW`j46O_6A4?=}\H/uv\iE+c b{]iC+;p.i& I qNL$9we0H{S  A  Dd  } C  t lJn  ;!!!FC"""X#S##W###9$$$0$7$?5$y.$"$$#D#r##_#+#"B"a`""!c!! 7 ^ qx  o[4e!|~aD-$*z[+kOP  - u N  O 6&pRNW4B!rUk qE $j ? 1 j B =Q]of]mVrXuawwz{-{b{Gz{Lyhz#`&e@(5G\tCp$F8lo (O`=b=DYIMl9tD{Y?p.YG'8-*''8+2H>OZb{lz ; n$.kB `]u|O4$ !u-[F?j!9m{"Ez '{ = A M c  D { - $ i 3 '7b>7hED$Nz'  X  y % > Q b nuwy{[yu0qjd\^UOnG<2^%#[\35R n|JM  s 9   ~ c@ F $ o %   fL <  l # ~GCY_wB)a=tP%j2  = ?  < e  0 Qv  Y H6Ix []$CY-)uy`P(RMgD"UhlAYG6w%6{C pBrM+ iVC4&  +8GWhy&/7BN[izxpg]RH>1$ uf\OB80'! %.:GWj} *>;_K\m~&TU1S tJ"ZT-rODBVt'nUGi"iR;<|2aj*k3_-n 47\zG/ MB h{    ; a       2 G \ o } $ $ & ( ( & $    m X ? #     z T ,    y H  k.m-f#^ [&1;WHR]gVrzc+\+d@!,8AKT\ddIm0sy}uk^T,E=6Q&hx]#?/ <FQ[hhv>Pp3!p#+%%%T#!!indI"W{f!Q?;U ]?{Kߕ%c5 ޥސ{j]SMKMS,[Qh{wߌߥ'n;mm8` @3*4QJ0 tJK1e8 xT2yjVpE6i)gfghh b{ c WJ 0E0i<k M`/}8W  *,  a \  !  % = ! ! !QC"" "e-#l##s# $5$qZ$z$$a$$$;$$$$I$s$N$"$=#v#|#<#"I"yU""!J! D f .7- [.S gghF%U:uA  c  W F  @*vXZYDE3-Fl3  G '  h2 27 6 l.E' {]:}| M!?eL1uo9[\[{ ;u*\c &IQ%}Q-mP4tlm~ +\F,LmU X4&d@t~aWNTLQ[Qj p8T{Xh=r-;*4 Jo-7_o UJo)4~d&%y"l/w#wL"w#Vz'(1r@ 6   `,  l  H 2\Q  gV  y @  x  +|7\0'|3CSX=O I7[x:]}mT9OnQ6i&LZ*bgg3[W>wm0>hn-\>\| 0|   F%  < U V \ n  a   "^  : V P  eD } ,$m;OUr.k 7IU&ua$<GxkV"K5u{ uQK#~Lw^Kf;<*dG,0CZu#O}Rf[!?k^*W+],Hd Q7NKcZ~ z3Ib% ?s)jn_KTB1K}My & p ` g  [*  HO*eqhs/nC`KJ  / A  s * <s   J@ z  6 { N z 4 j  4S?q_z '1:<@gBHB"@<71d'+ dz"j6}jWU>j*o  g  U ~ ;c H ,  N  u } ] 3 >   C   Ky X 2 P   T m A \  m ] &- Go=u Gm 7|Qru^{w6"rJ3vu8:qG% h_?$0}E3m;9Il<[ |QB% t~=V. dz}].> AC>G~OXf7usW3]"P|R;ZEyWC/F]MrxN+  i$Q(-7/357 7;=p?DgHL`PTYVYP[[=YVRLF[=5-{$1   5   ( s   D    " P }x j W B -  !2>IQUwX^XES,MC4# z Y 5  \ 7   Y 4 [ )   y TZ .#   z ? p H  S  `b<&r5}aHK/m8t{DobVMIjGBEGKTZdeqC$gR6>S+r%Mw L}zunh b?^sYUQODMwKIGE3B]@><<:*:R:y:8886:6[4{22.+'#{]}<lYF1g4T}`C#Q s$zV|1' ubd6 KT*&hi;9 p {>MsJg9 .sc;lu%pSC:#z<\,_="%Bd ";Vv>c2`*VBOa3Zn eT|<)[g9 ReERuB5/[&w@b_I4  >] |hH (C^yQ   t  .  4 Q> l  A   4+LnS (ER|{E)nY$PB]v#X1 h    N    8 s    rU ] D + " R    {U0.Zm7-JcN|Z  _    J   j   x~ a, F ' : ?d6?  \ <   2]  ~ & 6 r  A e  8 U{ET1yGek U0GDBUa>k?tyB~GP ay#.0T@ S>ms2Eqv3MD 4k58O~T(I~rTU18wofbbbf k-uV6y<[b]Ast8 Z|b-{W&XjC}6Z]<';`"9=[a![4:M}[`c[KL44 } " P o   w a  + O & s ' UIu@x 9c d'@7Uj{K1y1i*Qu{hUB.wXm6R5[$nHp"-X U*g  ]x H  ?  t U ! 2  V I r   e *   't 8 * $ { :   v 3 v fb!JM-t~+[K4 iyO3!G[,Y`h.|/f9Q }R\B,R }IkYb&I=r5:?w6L`m(|N9jq%PCWh Eߖ QzޓVZ1"ݹ݉[1 ݮݔ }&hEXkKC=826q8=ENQfy\.#S6;e| SSbDET^'W3eG1xk_sOBb4'P :% } _  ;x\{<Fbe.jz6_]? [ W  ,  D ] A! ! %"Q " " W# # $D R$l $ $ % E% s% %1 %L %c %z % % % % % % % % l% @% % $$V$ $ # c##"E"!m!   |] .   D   ?   $i  9 x 2 l   J  s k  e O_ X R J (= _.    D  h 8 : | o G? % s| J  l h z% :C tAQ;+/o0P?[%X!a.[ DsV,eit1 sM)+ =Pf~ )Mx F)Kp'v &]{+VQ)wV kbs:/[*}wtsqXsyG:56 ->YEO$_Y`!ffp@{1E,DUe_UbJ^?R2C'/"w4Y O5 p o )5 O L t  M)B<T`\g!f`_  P B t4   r & K3 m  4Y)6BRMU[`b6`W[uSK@0 iE"xJ\s68|9oL(e0l @ 5   f) % s  V  T B -   b C  *  UH   y / =fI"[ Lpw# Gy8jNH3j8sG~[9{'f9SNBc4z'9Xz<\{ . <+KFYcjy,Ie~'7H[n'8IWhw*7CP \i(w7FTcr!8K`r 0EZm1Lk%FhCk&Nv6`GuFz:pZ\M[>{"b7x+nE9` T&e+tELy`M# a - e  P  * O s, `     D n  # / < F S 7 Y L _ \ d m f z a [ Q B /   x k Z E {1 \ ? !    W - _ ;  o 8  { Q 'J    @ b=i;eD"KVn]U >)fw(>Yy:uqoso4oqswV|$nDsX?* #)28<BGMQUW[[([4[CYTSgM{B8+ :WwmR9 $?[vvL"4\O#hx>MT!'-1K366w6.3/)R# y2^RoV=!Se,rP1e<`:oS8! \6c@4fSDs%)S|u`K7P$j c b|t n[gccYcei\nt|{DwB`&i=VqbS -@Sy!iD-pj ,7`c:t4O(ig,o<U7"q}dmZGW4 G:z-a~H/#w j   V  l [8 H : ) Q    Z   ZH;e2Oj   w^B#ykZK;a*5l3|a>B  m $   h> @  K   uF I  / irD3[Q!-YB)T_qCdd^X(THb=4/!`=s\rFL$2 {Q' ~e N7$+EgtR21qelwY0I>2e%(_7|zusuw~7]$`2+5B\ykQJ$LVvp(.Xh \Q q,3po60sf@5XV+.wQlH&.y[r J  9   d[/+kP2uP6jtX/k(I{-  6 _ h  ) $ !J Z!o ! ! ! #" E" `"? w"Z "u " " " " s" ^" E" %" " ! ! o!% 3!- 5 > Y F  L S OW [ ] _ a >_ ] MY Q PJ @ B8 - (!   h  4   S   au ` K g4   b  [ q  R T 3   Q   Wf @  cwm?9 fr=8 l:bJb<*4i5$@GTn`%9Rf ^:F:>&Ih cRFHDGAY3"yW^)JbEARn#zgO[ PJFFDDHL]T)_n~yV6*R|8n"gI2VQ}xMG Tt&   ff '  r f ( b  e 9&  e d # ,b&9@xA? <t0B    u = i  M c-0lBgJ-X.jvUDA3s@)&$W)%*s3CBXp7v 2Oak34sY_"[{B fb,=yR<\W*)v~NV(. }cfFU)F:2+'''+4l[EMoS)Yq:3 ltPZ6"U[(m%1@=M_]4s{M7X`u-p/7y?I6rQ  V $ ]Z  W  8R k G54b`9/aP `,I f[= D }% 6 B Q =[ if p y     * 8 C G I{ Gt An 6h (_ W Q M D > 8 c/ 7#   `!IqXRA,:m$8v?_A<$,    d\ D '1  b({bKG*  f ~c:@Z nMR+ $o`Y;IEzNP)d"\]4 SlkB$l6wM#hM~6V!/ lF#.AXqoM, #OrT"9_`7nYD/i ^YVUsk^PTI?K7,&D9 $ q  H T I +a$*)4W=GR\i"uDe.Ie/Id"D+g8BKU`.jZu!WAA  Q &/'5s;FNRYcp4|hWK:(4A_P\k!y^ D {    T    ! +2 4S <o F O W ] f l r y }        } ym rS l4 f ` U K @k 4; '   d + y=qZ~A;(n'KaB"k"DdDo%*c$iGl(2Sv]B+`4 aF-pdYME<60+)))).06:BKU`jw /AR'e9vL]p ,:(I4X?dGqP}X\`bbb`\XRIA4(yqxhY^7QE6&uGQzeRs?8-A{8nYiB$-R @u4uk`rV1KE=w6:0*&!X$g@!(0;GTwd^uE.-BUl7'_>Zw(Ms Hr32SirY!I"niC"B)_y|nm.wAV/i|Ih'Fb#Dd#9CB   7   ! o   F    N   8l'Nt.EZ%m4|DWj}1LiueR=$ 4RmjD){DO`!{   X $   x > - 7 ? FG J N N PJ N L J DH = 5* ?r-YfD!AtT/&`c/KOx3VbLQ  :?lp'*V[DE{v8/sb2rN3|7Ij%~P$XxJN$CY4EQwfk0`TG9V,"_1fC! *;vLa\PmA~3& 2Q$u3DXmFt 42^g:Qr(Ji*4}{/YP?,g{Np>9jAlUto6ritBo"di NW.KuC@  9 ; v ) o  I y F  x # D /c  E  S  T  K  4   t  4   8    J  l O - 8 X u  h <     T "   q QH , ^i/ad"yf#%ti*Sp19{Q>^eRhet@[ O n? > /  W +} fNd?6! cAs cUHt]=F/5-,-w/^E7,>IVey~p_N=5+Vz 8}fjWG56'p RBD|gPV; &|;I\|4pe[ND91~+p"gaaclx'/9DGRu_rY/|$=~\~@Gsut Bx<(kdH!b:/vCOg$6g,#uMgXp9BX&!rwM>   % jW   3tW&{Z-) B nh   :  _ ( uA X }k | t  V  #   * z   E t e R  ; 5 & W  r f D # p Q +  b8f*iR?Sl.BTjusP*kW6|]=w?^nSn:! o   j   d ~o]^N=X*Yat2vi[[N@,/ uZHn>Q2?FZ{v[:5m TV(Y i9q*pc>& sM? kw5T2`)^.zvtxvLx$~fE#,Kkq^PC/9]0,(&1(k*29#CdNZi6z_O'GjNZ>ny@ A yo>%`xGTXT*)ptLT6,w S`5)pmB:i\2-r`$=~E;uY   #] Y  S  * ]>    k G q A / HQ p   2 i    ./ \? P ] i t '~ J l        0| ?t Ik Ta \T `F c5 c" c ` Z R E 9 *t U 6  zWs1M (KR$g([']}`0.  5  g 3'  j  Q C  t e *8z_B h,2F`Y#w{C 6Sk9q$tDKwgB;{`pJ&YfdI=/t7^.|mbVNeGEA(= ;9;=?EKT^iu6Qj(AZv(Lr6\ 2Z)S|Dl*T 3[0`#KqN~!A@q_{%O{)@"WNlx*T /Y'-39>?BeDHJNPRGUoWY[]_:adcceeg.iUlnprv xH|rIu0` P(9GXiEyw >p ;2pI`w8k+ Y  " / ; H3 TZ _ k x   : \ {       % 3 B O W ] c tf eh Wh Ff 5_ $Y O B 1     l M -} X 2    ^ ;R    v < iF"}:gnK':KjM[1 dozw)fZM:C80U* #!y4!m&/,2:}EFO\hw~R*iP+;B(Wp 0I^u +;Pe|$1>J=W\a~irv| ~1~W~}|vpg]9R_F7)  ,Khu\>#%% *Pw@qh`RE90F(v"I$,-4f?KX i>ys ;n4Q7ri0+^T~+;Nkr<t!;R[iOQY$g4yGTw^gTC0]T?xucP; &J }    ; g   w d Q< @d 0     ) D _ x      ~ s k `. V= NJ CV ;_ 2g *m $q s v v s q m g c Z V N E ; . "    x i ] N @} 1a "D '  \ 6 { d K 4 a 3  j x3 ]@%MPsV6@g~aD3$>AdM;4.x^s?dVI?4Z,$5r P+l R(2@=GT6^ku7>St,d+'1j%_ u`Kf8)%IzJybP?,rK %y\A& .!G=bZy)MS}* m=t=\%x&[>-v t ZVCM9K=IN[Xu `+Xg*mklUgEX9:  +  xH   f . b Q 3  > jc   .  O  e  o& * n, , a&  I  !   L   R_ <  + l  f 4 A g  X    [  Mv/[S1q&f)FX fkCYt.1Yn{2}@).`*,%g 9  m tZ Q -F 2gG~( kYK~BkY:H78$6;DTgudUG:.+!U }GbRwoNg`ZZT PKtG*CAAY????X?ACGvKARXbiu[4oV ?#(<Sn&Jn 4(`=Tm>n>j7k= xAy:!U]0NdS9nrA Au|B|r(NR|$d6ZH{'d/KAd{}X(T v  " & - /! 3 3& 3 3'1-'*$" vR}3td*Ow<'K=ru\E,?\sx_F-s`G,w `D)k9Iu\Eu.(3#zcaJ11Wup!^ I& 6 #'  !  v_rH1]G1ytdO`8#M :-#iR;$&3I{fgQ<)O(pumgXK?72(h) }ImL* $.;IXgu (Hk/F`yAs!a*F._xz`S:TRm h-`':0Oat_w+-4)4>OGOUt\b4hlpDuy}2{F P#nJV/` D$t1@P _?pq 1 [    * A \ u; V q     < Y% wE d     ( H e ' 8 D S ] j 6t R k           + 8 B M U [ ] b b ` Y Qt Hc <S -@ )       j kG P# 0   ~ P |" T +  Y % n> }AsA Fn}96\`)~3QK^Mp e90DwSZ/ t*OoZG~6=(|=W!Z,.p=PK1^o{j\8OSEl>8668>E3OP\mhw2Kd} 3H_x#8M_ r.Ru!@`1#P%n''''%%#0G^u '>Ul{tld[UMF@ <6"/3)A%R!ap|!#'-3:@HQ[fr&}6GXds.<+MJ^jp8Y{"1@L7YYe|p| N| 8f;c    & M u<d1Ni(x6pGgT_bWmPuJ}D>71-)$ }umdZOC4("'+17@HRt][g?t& tW8.?RueTw2kJ+' 8M^n}lM0~bG,|eP9" r^G0jWB0eC t_[M1:'S%j}@GIrORU3^fp}wj`WQ KG+B;>L8]2n)~!  !;R k#4EUh}1Kf ;U1rRv*X(MsDu:d3cBs2m7'ij=;q^K1x+cO +Ex{b#[S1Hg60^!n R: a  4     _ , J c 7 | |  G  @ }    &  Z  # Q }   x ] >A _$     n B  "0=}GKLRTTcT$PJAf7#* V9z[Y:w*o>F  bm 5 : @ ` y 4 L V Fl  wX!x ~LpbjBL+iy^CB,}[=$lT9}g [ b0EzZ0o]K2DCWlF b.-BYvnN(}fO:.#?P`qyqmk mq)}:K]n'>U n$;Vp*TA`ZS:aa 88f)+7_^7-moKI&-e{hI[X-]dhz;m(,X8FR > \_  h t }    (  7 C N V Z ta a \_ ] <V N C z7 * ?   S   P r S 2/ u +`kC(DT]"pQu=~iT;_(}MIu\? 7vD<&^4_ #nGJ'cu } ^ ? !   yr]pH3d XNB9wd1O<)+'(-8I~i]T?w($Ju vaEL7 + {'5lUS> '{4m.o`JPA0$o K* xcP=* *=Pe| 7Pk@d:Z({T 6Cdu?KM(c)rQ T H>5IADf1;wo'GbJgF&-\#Q(yPxnaP&E<b(   o - < Z H U < _ j  r ~ y  I   h   s } v sn f [ _Q D 6 4) u  %Yu+\LAk& tT3b:~aB sGwGrFe(l]>}.R 5+U$q L ^ +  I h 6v  1 d0Xz [&+KYi'b70Y{p @3^Y-"Se!A[8~~c$H/rp~.Lu0k.J/bJ8gk?Lk.%Y/{gtpprMxDA$E9PgD8#sM{RS$ RJ E4[> &GD]t){"x*6 ;; >FXn%te5RB1= >@Ayh@YK<7-f:    F    G    > x    L |   'Ms1LczwjkQ^7N?. qI   i l7 W B ) [ ! h ( p S 8]  > vX[@%i psu^Gp0fZNx@me]6TNH,D?~=&;9{9%9;~?,DHN;V_iUt |4i'l2#4EXZk*}zU1/BUyf`xI4! ) 08%>6BGGWKhM}MMMIE@<-4N.r% POp]NH~6! EwSkQ: !H Gi4Tj?*1_M{nfO[UMHD@Bl@@BF K-QNYpdny7Vu* D)_Bz[r?d/F]t@f)S(8IX-iWy"Gm+>O<`^n}1Lcz "*3; DJ!P*V0[6];aAaCaEcGaGaE_C[?Y;R4L.F(?7/ $ jzUk>]%L =- dE&|uYf5YK<0#}U0 mEsg]Z5NA4(}Y8nO1vcR@-u^G2 sYB)xmclXOP1HA;731y-Z*:((&&((|*]*;-/13579b=D?'D HLPV[aqgZpCv.z|~tznviterarapapararepipnktg|aXNA3$ .AT}gp{f[QF:-4Kd{qXA,*?Ti#x6nEcVWdLs@5-$"&/'73@>HHRS]]ihvp{2Mk.%<FMj^l(T~ 85kLe~1d"+=^\y+_8Y2{g8+lNr3eAb!P~%+DUd}9](D[p8Tm  !' &6 &D &S #_ l v           z a H -      ny Kp #f [ O @ ~1 R! $ c3mdV-?& RznY59Qb:n6mXC!N]-Wd)2y^P*(NnL+h +v:w[D-EVp6|oeKXNC9W0*"j2e4W+ y K  sN, $(.49?CpI_PNX>^/gow!4I`w'5=F_YlKy;\8lJEpA)Y S()^u  [DE9x68-y~$FwneaGM-}- t f  F R   =C   + {% W  i   X. R q D   / z  X1 v   C  I g : E r  C v s H  !o I4 q  z 7   /f H _t?Rbkrw'p].F-9KjEa 8c 1 c Y ! W  h ( \  _  t = @ u\Dpm{E'*~e(F'y!qey fSY@0OIFDCFOgDw4'8kK*^uj+{ E)FeV.4\rN++WfID2t ?sQ7r&^O!6<Qym/i>hZ B;}i T0f!TW&m<hO @3Vz=G0]Iby~B rA    Y # 5# # !   f  H (tP(kVj A *;   o  3  m RR 3 ` [pO-C \{X6H~ ]29XzhG#%-24|4Z09' xY;zV0zuFW:\LnS8hu o { b G[ ,  : t  | _B ?"u 9dtYOLr[l|5Rp !"8*O2d;yEKT\ekqw |  ' 1 < D M S Y ] a f h j j ~j |h wf ua s_ oY kS gJ bB ^8 Z- V! R N GC?;42.*k&T": !rP/ wO' "&*,V0*49=CvGHNV\bkUq%w\*_-b0l< }O!mA~rqKb%TE4$sR2v]Be$L 3lK)}p{fUY/O D<4+q%K#_9#{+U2/: DMU^h^p=ykP73H]r{l[OB8-#4G\ s+Fb} %/<GS-b?nT}i~ 2"M;hTn!;6ZHw[n:]'>UDli:d'9L:_frGu3,c?Rew"TDu'63DcUduKy/] 1&[/7@HNW:]^cgkrvz |6 ~Q l     ~ | z v r n$ g, c5 ]; WA PF HH @J 9H 1F &C = 7 / $         t Y y: j ^QD8)b8 N{ByToe\TPK C=7@.("k$J n#Fm#L}:s4|@b-oCaB$ zpcWH9)sf^UMIEE{EfGQK:Q#Y blydB#$u;QR0ii H,$IglD:Wu{T0 (JinP5$C`lM/-KhygVE;.9$Xx :\})Mp+ S}*;N`'uR~2`4OlKy /;Tn|4!gMy+[4dA*m_2AhiJ# D d 2 l  W  , = CN ] i v 0~ j    T    ; s~ t g Z OJ 9 $   N ~   n :M f+   < ka ?     V5 &P m   U    y ?( 8 I Z Wf s }  j -   w ;    N   u bj )^ O ? . H  o :  t V r7 ?  W] +6 ZV2& [$aB"{BMuY@%J:i"o`PJA4&l# @Zv*Kq(R ~~:~k&c$u>uG.l=BPbubC)/Kh /RxCo%S :VWw4o/U!|]&OP| L8n KJQCPIKY>y$i$[:,]^= D !l l  Q $ C 5c ~   e   D  ! $. n8 A G IK O O !M hK G ? 56 x, !  : y   / j g  J L ,  K w Y 1  ! F j X ,    g 57 N c s b +    M    k 1    D    Vx e R = i& 1 G v U 1 d ) {f C:  c~ -L  Y{ 'D b`0&rr5By:b:y8t|3X7l+b~ aH-WM F{phAb^Y~W?UUW\B`fnyG Rd+/JgN |.HT|}K#O}\ 0@rjEFy%!Yu\9@r'T6nsia\GZ{Z\agJm|v 9g:`0Id1NnDp7k.AT dEs{)e"e8i ZOF?{:qgZ:PC6@*GORPvgHYL=;- (s U   , o   {4 ls ` Q B' 6_ )   . _    6\ ' D)aK|rBg*= M\kwlL)U%m V ? $J    Q  g F $?   c  n G / CwN"R`vL"o|+d@4;}_BB)KUbm}-A[y2ZF@Ig3yquEokd^VsONG*=4* lQ<%ziVD1 -@UjnQ:Es~bIK0>|vA[@$ U7y*d~Q>++5EU g{6GRZ+`D`}gk+R`|A$M wI: Ft r  V D ! IM y  _   : QQ f z  7 c    ( b   ' l   9 x    ? b t _ H 1     8 U r` :     5c N5 c t  r @  q:~Yzxtphk+e_VmL.?3&r5 w8|=BMa)}wKrnllzjHfbYQBY1-X0 u^G2~a B$ nRr3[D/nM+ bA ~yisDqmmkk{mQo)qw~[1^2_3 -:K[dl8b8 -DYap7 jB(C`{Z7)FdgH) =_jQ:% .Mm6Sr|uqo!mEmhmosw~ 9Pg|#8 M;dV{q7_%4B O7[bhu8bL $A-5;BjHLRPW[ag^ntz B{6v,<3|?y-l7`|vp1 ir a Y P HR @ 7 / $ 8 d     B j     { j& Y9 IJ 6V #c m v ~      y e P ; &   v a H ,  i R ; $ j H %  }o hC S > ' z ?  > ps].O>-g$]AY wkf^TKoC:2~*/#I d2Lj#M F~vmMe[RJbA*;5/*P&"d: ^;nWB- {yy{} 1F]t -?Pe x&C`~.W!0AO`3qa"T--DhYn$i; Y+<*Mp^n?lj"'A3>HWP[cRnv~4{ S94:   1 |   C }    @ l     = e     8Odw $(*.2479;q=`=M?6ACC G I Nv RN V$ \ b g mp s@ y   o 6   ~ ;   d  8[ '@08@iIS^f3r}:CcSU  O(/7=RDJNPjR6RNJFw@K7!/$~W/ {Y<!jS<!wgTqCR22"]5 ^0vH^.m;n:qAa7  uO*+4?KXbqb~C$ta'PL]n6[1_.Ig(\+6]Y}M{DpF|!P~4u8@h=3ti(IPu1jMQ V>z!M2ws0n  / +> gM [ j y \    M    7 p    I }    D t  , r Z [ B )   C ` {  o T 6    ) : pJ HY f r }  n @    x gl ?] O > +  x N "    jw 8X :   q C v J   e > M  }sU:.L ]3 Hum,G#Pn#aA"AWhfH+r!{,w`=K6!Sk7|kQ[L=s1*$ [\!q;g5W2 qXA, &1;DLWak v,?Ti<$f2CTb%sY=w) h1D'Yin;j -[AXmPB7.Mk,%v #n:QheXG:b/| 9Xa)l"39tPey2q% ] ) O y * X  & P x ! G j    0 = K1 VO bj q ~        ) @ U j {            x a F +  } } { w tq pM j* b U H : )i ?     O  mZ{GG4!k3M~eJ-\a"pS8f'm0xo;XA( ESnU>f',Lt>s bSBk26!n; W+tldZ[0SJB8-i#DnO0qZC{,qfZOA4& xrlgc_x]g]T_?c*gnxpU:2NiuX;+Qwi$JU- (`uW:U[|!ebN9$+nA!o]|xvIvz~+tEY-.vAVmIQ 8h7kL6fE% %S W & _C c  d Q  * O? O b Js   0 u   2 j    P    K    d} q b /S mC 0   C o    g ! H B ( a  }  Y ( 1 J i    b 6    x F    y B    i 0    H    Y    `m "R 5  e ' f 'p W < h! ) h*oKm&/t8Y-IY/e-`Q4TP$ n[D)e4\8r@ iuR@; &n:b.X$QyC g15Ng^)'\K(s_/Bpn@;s'ef;(itP,/m/r}dAM6# q[E$l= O a!8Q(li#]Bn5g9qK'sf) i' D a 2{ w  Q F  V" ( / 1 3 H3 / * o$  '  ) }  t  r |Y @ :%  nAfCp&z~TX( O y M  F   ` .S   ! g_ 5   1 jX 6|    k 9  0pE>Z oyI]/T,ydO:#e?  lg MH -&   O  u ^ I 4I !  t = l 6 M~|||H|~w1bTGu*.=PbWw:h!1KfTJ 7DPkEJ. Id^#K%:O~fN{`4 .<`K9Yfp}lN1ybK8#           0CZq Bg 5`#Y@~I}wp!jjd^WJSOI*EsB> :W640N+'#^# U AD5*8]&J N % b  D x " \ Q'Sx!)4>IU`jw  (.59;95*  1@PaptL%U,   *x 9E I X g w[    ?   V   j  %-28@IHOW^UdlrVyJ<0-0{u8lf^CUOGP<2'b 6e"oZdC',yA|ia7D$W0 `>eI.vU1}Zr4cUJ>5~-]';"b D%%'+15xyT2~cJ3uf\QKEB@@BGKSYdny $,4A K X9dUqp~Ag- D6``{Fv5XzG~':bZ{J$ 2J}fbO:#{ .Lnt%_M8R#H Oq^Ki82&c3|\g6R?(kTA. t`H4u^G0(?Vo~e J0/W1c}fM 6G S/zmXEb2UPV h ~:Ul'? Q"9R]iZK )G1hz Q-_ ] 6 qH | ! Y 2 \ / a ' 0B h[ t  a 6   W    \    : p } h S H< #   0 m  j G W!    " NZ x1    { 8J ^ }I : Y { p 9    Y ! ( 7 uF =R ] i v R    h -   ~ C    ] $ ~ q {c BV F 5 $ h 1 \ ( l S ]: - l>{X4^4 ~Y3 g@tK#fD#wK!srXF?&lB|iiY=J9- _ 3Y.W+{O# +p9DHYl~b6yI2KeY(@fd4k&9Pzl9(Vp> BtzL ;mg<:oqFM}'%\mT5=i&2b%UDr  9ETkq44dSp5n(\=Pc%tn aq2[Bc&Y.~p a|RA^1> K wh]D+x*6  m R? 4  :    a e H ( Z   2ldM+ "LtmN. &9GTn^Ng/m sx||~p|Qz2uoeXJ7v"Y :hBhK.uI g\ L( 1   D  {E d M 6z 5  a  Cs^Ie6$4I[ n|ti4aYPJJF@b;97x5+779G;=@eDHLR>W]egnvN @|;.|?>RdyKg0!Sj0Ol'Nx55iNgO] A.=K{9zK'r V:!n YRV ^ *a5?JXVamBzg= Y  2 G* Zm o , d  1 #[ : S l  9 X v  0 M l .:1CRIrMMKE> 8C.g#   B f  x Z 9  ; _  n @   0 Ry sE    o 7  8 Q hM  Gt*$3AMNYaog$kprFttrhpkgaA[RHc;/ <h#lVO1Tdd?+Ti!9 cw7D sp=O-a'yo>XE2Sf*zA]'MR"l@yV*44=GR\golyWB/ )4>KUblw"5J_t"54HTYun 2[ $? Z7we!R4U{K?iTO,}b <6jj':Wn $>[r=;ukU'SJv+T|Em;^>h%Db(He-?Rev(2=EKTX\^^\XQ#I&?(4(((( &#! p]H1nOv-cR?-sV8{bH-gH&dyGU&4_w9Z?$[4 eJ/mCtJjU@+nB_1pa{UMF:-#g ; W)uIpD}wqwmOf)`\VOIoCN=*4 .& pR7lz\kK[>L09%(pY @)%0`2rByDs?ym`TcE-6( Mj1t[OD*t=hdK--RyZv;@ l8pN+q?{Y6W)`^=8au;ZA(}W2 pJ#|zxxzT|*V*{O9!Vsd4)UvF >pW%I`0<}rLD(sb 6U 7iE fQz]<@'-|gIys"ogjjj4owsy>}7r"BKe} 1 .Y Z  M/ J e ~ - i 4 ~  f  ]   V  K 9 , }v ] )C ( 4 J h B ^ hq C]?R`O7sX;% f T   N n 4   : Nd    i 3+ O t U   * O? T e v V ( t H   Y 4  s c kR M= 0&  } [ p: [ H 5 $  d <  c 3  j 6 \#z?U`$e&+9fJ%Yizg&g'f*%?Vkf%b#-cF$b{f'k ,;Vrr3y<,GbI}[ )Du_:}\&'@UW"n`2$;ZP3e zfH/ ,=KZiw}}!'/-N4p:@DK M=QmUY^ `Gdfh hNjjh.h~fd!bu^[ WvSO&KG@6:4-W'!b?nEym^KPA0y"BuDvzg=WD1O   F # f }- jn Y I 8( 'e   Ew BaxlaWMD:1) #$( *,*(" r U3#)1}8U@,HQ Y dv lC v l 1 y 8 q ,  ' 4Y @ MWd:p{[t';JY iz+@Y u * Lw/g$ew(hYKu::+ Z$]-xfQ>})S+oL*y fQ?,zaH1vk_yRlHb;W1O(G@:4 0.,)),.26/q!d.:G\S^j]uiw$zmM e2 w F    L  " $ $* 'Z ) ) + - / 18 3U 5r 7 ; > @ D F J L3 PC UR Ya ]k cq gx nz tx zs m e Z N A 1         l L (/ 4 C R ` o} S *    o ?    #n 28 B Q`n\}#v9B +?5@HzP7Y_erk0ptxm|*~g'|fx'rken[1RF;}-E  e/]{-dK2qEezEW$3rNu)Y>% d<noB`TE;.m$C rHwM%dAvW7 nS&:,#29AGPX`iqy~qg^TNGA=;9779/=@ASGfNyV^is3Nk6M,fPs65`WxF x2ZG{'SQ 9#iY.5^n")`[S'\7k-c*X4g12]b $5R_ ; g(?Viy>h Aa6Qm w b# M1 8> !H S ] f n v } k N 1      j Fy #p h _ U J g> ?/   zP({bG`,8urPN*(nbH8$ Ts$Q0[&}aKF+b(r5mXE}2> @{:v5xppi1c]VqR2NJHvF9DA??G? =??`?*?AADWF$HHJLhNL+HD?95/&   '9Nc|yj[O@91^#2b/e{qdTXMC8[.&+r M/{eVJ(2:?KZ+kz{gQ'7@Wp\)j3T&xcI4\ H v  > a  9 Z z  # G h  0 "? HM pX ` f m o "q Ao \m yf ` V K A 2 #  4 K b y   t X ;   $ 5 F Wp cJ r% ~V*xH]+$*0i68;AEIrPBTX\^}`MdggiiZk*kkkknk@kmmmkYk.iigdbS`)\XTPIXE.?82,$a9 yS- yV2~pcTFe5D&$jM2{hS>+ybK4w^E,~pcYnNPF3>71-)$u"S"2""$)+1]78@JUaps~K!vJ ";Voj>+VO(rk=;eU'GwuK:"l;[p5G}nQ!6Y6nJukc\"XVVTVX#^UemzHv*#T@~b<`>gR7Rk2p1r=#.8CHIOVZT\\\#\kZVQDME=!4l*Jb%dr[D-WAynO#1Y&VoK**OuxR/  < Y ut O )     m G$ "5 C R _ i et B~  j G # t S 1| q e Z N ? q3 Q$ 4  e Ht -[ @ % t[oBM+, |V1~ iVC0lB k?xYn+cYNFn=@5/&"~N  W$ ^ + d 1&-5=fF4P]gtg5j8m!86K`up= wD! )  h G (  v N (   (Y 4- C Q`qsCv? #f6/H[nPi/{!>2@O^Il yR^j+u8  H  ]#yA e/^)}n`bQ2@0zL yQ)vdQ<)oN, zu_dFQ/A0{shbv\gU[SNQAQ7U-W"^dl w7Wv0ZK "-*i3=H*Rm_ivB"p ^S&4PEVhTy_n$)7:J]>p=2!p!2 BVSdu4{ D 3 i  + ; L( ]Q ny ~    ) F c }    0 A R b s          # 4 G W h {} h O 5      u -O =* N a r  Z 1    y H  &{2G=IT^gi-qyF ^$t9K{sXi^RCi6-&Gh~1eJ-\(n[K*%n@b;mEa3ygIF&U#y`G^/,g7wsFgZNC9b.6&  iD pQ2q\G 4"&.7=ENX`ku +>Qd$w7I^s(B ]%vDb * K/mTzFElo;Kgw3Mc}&@Xr:Ql >Iry G>|nM.\@n@lGq=e8]$Gi ; T)kFb} "7J [k||gT?(tW:{v\g;YH9&zY7nWn>M'+ imIP*2 |taRF1- [6ybI2uN&Wx+fUD3#S%tF`u2k^TIz?L4* f8 X,~T+z`t8kc]TLF\=;5-"eL3uftWhK[>Q4D+6%)#)08ByMmY`hRwE8.! /LnEoKyH~*dW!4VEZm^)l<:Yy P" Fek0p,V5}t.+kWU4`/c/W#~Oy E m8 W y   ) K n  * = P _ m 5z L c x           (| 2o =c CV KH P7 T& V X Z Z X X V Rn PQ K3 G C=82*s$O,mFwM!~rg]oPCF;/"] /p@P}rh`[U)MD<2d)4!n< wENyq[i+^VKCo9?.$ Y-U+|nea?RD5' nN/nu\`IK46!# {dM6mQ8#6Kx`]y?" /RpvQ4Am~`C'&Y+cz]B(M F}fFQ<)IQ^)l~yw2wswwy4~r&cG2SIb{Ak -Np,Mo0\ ) > >Q la p  * [  K {  D x v j G[ {J : '  Br({T\?)Q{tP*@ed:.Kbi6 W+4H`utGg9 *_53A JT]gfp>x}W3`?iN1ztkchYQP:F#9- wgXIt;`,K6qT8|Y7~zxvvt[t6ttvx|o~El@W)j: (6sECTdsxDwD%8wKE]rzH "S9#Rig; &]=5Q ksM+ -F_xqV=& #:Qhz z"z9Pg~,A9VTks~+W':LKYj{,g!d/v  V&/@7=F1LRW#[u_acfeegUgecDa_]7YTN%HuB93[+ 4 w>}/iudCSuB0 / Y      * mH Xa Cz 0         t _ L 7! "# # !    y h W G 8 '  v a L 5   a xD n# f ]WOHy@V:23 /)%!vP* b8b4T&n@X(i9 yIW)k: P"j{U0 q^vIQ4+ sM*rW;zV5fG%pO/xS/ w\?u$Q,tnNT*=$ tQ- {hWGb6C%$v]D+ysmiwbf`W\IZ"'_-ydf0VC2!d1`._*zpe[bP/H=5-m$=  T&{Q)kI&nR7}ytpnwjhh\dObE]:[2W+U%Q!OKFB@<8#6'1./6-@)K'W%d#s! ;WvCk!%>)l-48>-DaMS[d6lowU HA 3H]BrG  L!8QkPM3QBp~.i )G dBt 7e-Jg8`2K g) D _ y      ) : K [ j {" * / 3 5 5 3 1 , ( "           y d M 3  kK*xR-wnff<[SKB8g0='_3}O#k=Y+wKl@f=~|iw?usomktgMe%`\XTNdI?C=4.&eB  {[>tcRuB\/A( w|biIY2J;-  fJ/fI, vX 9)9J]pfF) 4T{s`E*%Muzc"LN7| ?qF}wj`(UaKB:4M-)%#>!{!#%2'n-4:'BeMYfrX D(_5Ng4g&+IYo/6T`z 5!a?ZsEu 8 j! - 8 @ 2F dM Q S U 'U US Q M H @ 98 e/ %   <f(wN`rG..Idg~H&{W)4:KYfryR,g=uK#X0gy@ndYOD{8S+.nH#skbGP#?,vR1kWlBM--{^wC`&I 2t[Dk/R7z_nB`'Q B6)y\<hJ+ mM, mL#-2 >M[lpQ45RopXA*$KsrH_tJ7$$P|2`pdUFGt8+!# O{"Lv Ku@f!92[BzUj.Id~3Pp!)I8qHWdp{M{ 9i0b1f:p{pFdzWK<-Ew 4`oX9Aa*CdtY= +DYnnO2sR2 "*39p=PA1DFHHFDpAQ=293-&} _B%}dIr0bQ@/ t_J5"q\E0yj]QzDg8T-@#+nU<% oV=$pP1 %-8yBYO<[httQ-oI #&/9eD?P[ivY4 sK& pN+& .6AKVfbGm)w kT=()6x@rMlWgacjata}acglrx.<K7WPfisBh /)Y9HYg x8i-b=v*9#E^R\i uD}%^ B|*eI & [    $ T 4]?a,?O`|os{i^VKA7," {odXK=.~t lcYPH@7i/N)1  jM/iEa;}w`p:jb\SM~GV>.82+'!iD `:_:{pddWAJ>1#xX7{dmH^+O?0w`G2r]J7$rcTF9-  p`O>/~~~ ~ +5BN[gv+:*K?[Tli~ 9)R@kYp# ?(ZFua~ 'F,fIf:#WBud"2@U]yx"Fg7Pi7X| 4I#[Bnd5R p&3@LYcp2zEXiy  {kXE0|tt[i@_&R H;/"hK-pe^GK,8#lR7|bK2u`Kr6U!9lO0paSD8)xY8qO. gH}&wqhb\VpOSI8C=62,&!uZ?$ r]J5$|tkc}[pPfH[=Q3K(B>:86668:<@DIMSW`wflnbyYOF<4+# -BYn2Pm4W{ 3'X4~>KWdrCk>h1Jc@|lFp8TqGq -QrBl @1bW| '0HRgs0-PHod4 K"b7yJ[k| -=L[gt~ziYH5|"t i_RH;/"fK-uV4{jYI6%]7pIo`wRNA$2$zN$yM!zncpWDLB7-"kA tN&hD{sj`WiMEE!:0%|]@"nY{Dn-aUF:+o^PA4(udVE6(rcT F7**4CR`q ##DXKOSY'][djpw+b5i ?u-G9{HVevDt.\.C/XWm3Tt-B[r,AViy6Oh+D[t2I`uq^K8# )<Mt`Vp9tQ- o$G/7=FL|RRY(]cgk}nQr'rtttwrKpnkgepaD]YTNJlD@=71("nDyQ,tP{/n `SG8+`>gI.ueTC2"r]H3  xeUB/{l ^QD:/'s`M 8%jU@+#-m:TI=U&dpp[F1/F]t}fO84!T q-Omr\I8&(Px?fvi_T/JWB91+$%Oy $ N x  Ci"+3=H'RKapn| Ba,E`{0Kd~4Uy# 41DXSbn{#O{1_Ky5cKyynbUH+:W+ $LroZ!CA,`g4LH3[nnQ4bE(pR3yhW}F`4B!%vYs>Z!C*{`Ep*R7|epPS96$ kP}2hUB/ v]B) ylqQg6^TKC;0(!t]F /kQ:! !k&V*?.(28?GPXdor{]H1%o4\BKS;b(r 5H]zrpg_YRNHD@4=K;b9y999;=B F#J:PQWh_gpz #<Ul!4I^s1H_v!:Wr&;Pe y(Hg0)T:uK[l}'JnBf&19B7JYRzYagkr vAz`|~0Kf~zvrng(c=[RTeNzF;3(  *4=EMTrZd^SdBi2kmoooommigub`\NX9R$KE;2(zeP9$payNd=O+:%p[xIf4SB / qZA(sdXMA|6e*N7" hQ8!|xhtQpH Q[&f4rA}O^m} $-3@DSRfcxt.B&Y8nK^q-BW6lMd}  #0<CUVngw )D_z-8DQ9[Tfmp{ !:Sj "7L_r $*046888640*w$nh` WOG<4)! |iTB+ymj`OT6E9,uX; zln[NJ19)jO4}jWE2nW@)t_J8#ykZK=.{dM4v_H3 |xtpkge{af_Q]<['XVTTRPNNLwLiJXJKH=H0H$HH HHHHHHHHHHFFFDDDDDDDDDDDFFHHHJJJLLLNNPR.T?VP[`]saegkrvz6Qj3Rp0Q(s4AM\huBf:^!3F Y1lUv"Cb.@Qdw!@^{/"D;WTln~ 2E"X0i?yN\ky#)-16 8<<>>>!<#:%6%1%-%)###!{mZI6$|siv^]TFG+=2(lO2yZ9|tlapYLP+H>5-'{W4dBoK(|[9}yslf`fYHS-ME>6.%iM 2p_N=/rf[M@3% }yupnnqnbnTnGp8r*uw y}xkaTJ?5"*5 FY k~2Kd )Ff&JkCh#Hp  (01U;}DNXcp@|g&Kq!0)AMOp`q;[|'<Q,fG{b{ #:1OFfY{j{5Le| 2I^u  4GYl{jYF4!  &1;FPYkcPi6rx~nN/jI%ztne]uRRJ.@5(vR-uO{+fS>)rO)wu^TG0.iJ~*e L3nQ1hO6u\E.xaJ3 p[H5$yfTC0{unxhkb_^RWFU9Q/O"OOQSUY`djry 1}B{Wyiw~wtrpnl l&j?jZhuhjjll n)rHtjy{7[=d/Y' Q{(3="JLTvamzEo6^*=Obu;]$A1`H{_v- D%Y>lYu+F_ z"&(*2-K-e*($"%:QdytbO:&%3@LYckt|gK0cD$`>xpg]RFo;K/( xU1 lY\G82 hF%u`K4 `A!pg[JF-1nU<%lYG4#s`K8&rfWH<-|ri_WNF@93-{(o$d"Z M C 6 ,"$&+/37=DHNW]en~xti_TH=3&*=Pdw #:{Srlld]WQK F&BD>a:|841///./M/k/1468<#@BD_HOU[dlt:}Ww/Ll /?Pc0vKg00GG^[ur #:S l1@N]kz8Ql 9Rl $9Pey):K[jyxnaTH9- "(/5;}@lD[FIJ6L#NNPPNNLJHuD`@K;97$1-$ |gR;'rd}ShDS4<#'~niYRF=1& t]sFb/O=,lS<# xi]NA{3d&M3 {fO:&}wpjd]YvSeMTHDD3>$:841/--++--//1w4p6h8`:Y>S@OBHDDH@M>Q@DHOSY`fnw  *7DP]ix"1?N_m~ ,=K\m}#4EVhy -@Sh{'8HYhx)>Qfy '4/BBOW\ih~u(;N^q "+5@HR[en-v:GS`lw &.7?ENV\ekqy{ndWK@4% ueTCu2k"`VI?2& p]J9'raP>+lYG4#ubQ>+p_O<+n_O@3%y k\M?0!{uohdx^kZaVXTNODM9K/I&GGE EEEEGGIIKMQTVZ\`bfkmquy{{wtpnlllllnprtw{}(3?LXer~(8I\m/DWl'<Qh}"#7-L8_BtMWanx .?P`q!0>M\jy%0:DOYb'j7rF{Uet $0;ENX`iou~}wnhbYQI@80~%wqibZTKC;0( ~qbVG9* |peYNBx5g+UD1 {fQ<{'ndYOB8.#xa J3s\E.}rj_UJ@|6e-P#9" yfSB/wmdZQIA8{0o(bVKA6,$  !*2=GT^kw)JW a)nIxh"Ba~ 4!R)o4>IQYdl2uM}f$;Pez '/7$@0F=NIWV_`gkpux~$,29~?uEmKbRXXK\?b2g&kquy~kWB-pW<#~yuokey^^XAP"GA7.&lL- lK)|n_Pf@D1% dE&}l\Kp:P)3nU<#r dSD6' s^K6${odZOEz:p2i(a[TPLFB@;997777;=BHLT[cnv$4EXk~/Hb{1Li4Qq +Jj %&E,d28?EMT"\Bdam~u}2Pm -G'`6yDSar1FYn~!4GYn $.8A)K@TUZl`gkqswy{{0~G{\{qywuqmgb\TM2EB;S2d(ut cR@-"$&&(&&$w bK6 ybI0udS@0gL3s\dEK,0}iaPH7/}ldSK:4!}xfaOJ:3%ro`\MK::)*{o`tTiG];R.H$?5-$ &0=IVdq)>Sj  (3;(FDN]Xxep|6To#0B?_O`q6Uu)< O-dJvi7R.oBWl'@Yp 1DWi|  3H[n~(7ET`o|(2=GPX^dkoswy{{{{y#u's+o-i0d2\4V6M8C8;808&86 442-+'#r_ L9&lU@)ymbXK?m4T(;" pW;"~paRF7h)M2 x_D+{l^O@2#u\C*kxTl=](OB3' p]K8'sh^QG=0&~si`XPG?82,($|!v&r*m0i6e?aE_M]V[^XiVqV{TTTTVVX[]_ae%g8kKp]vpz/D[t4(K2d?}IVbo{1Mh 0%I1`@wMYht/F]r !+$44>EIVQgYudlu}%08@IQY`fnu{ $)-159>DHLPU[_ei{pwtpzjf^WOI@80% ym ^&R,E097,;AEKPTXZ^`begzili]iPiBi3g'ge b`^ZXTNIC=4u,f$YM@4% ~n_N>x-na WM@6)ubM:%vwaoOf<\)TKA80& o`TE8*|xvrpmkiigeeccaaaccegikmptvz|~ #.6?GQZbmu} #,4=GOZf q{!)/8>DMSY_flrx%1>JWdp'4BO^jy %)04 :>)E5KBONU[\gbthns{  *2=ENV^gm u| '-5;BHNU[agntz|uoibZTKC;2*"|vpic]WNHB93+v$i_R H;1$ }p{duUlIf<`.Y!SMG@<60+%!}p aUF8+wk^QE8,}|xttkncj[fT_NYHUAO=H9B5>18-1*+&%$  "&*15;AH{LuRoXh_be^mXtT|MIEA=842.,*(&##!(!4!AM!Z!f!s##&(*,.048: ?C)I8MFTUXd^rdkqw}+:GUdp#+3>FO Ya$j1t>}HUalx '2:E OYd&n,y4;AGNTZ^eiosw | -7DN[gr~ $.;EPZeoy|wqk e^XRKE?92,$  |pcwWiJ\>N/=".zpe^PM;:')u^Gj0WB-v_H1{hVA.oZG2 p_L;* xi]NA7* { pf[QH@8/'!  #)/6 >DO&W/b9lAwLVakx (9HXk |!.:GT`my*?Th}+B[)r3@JWdp{.G^u3Lc)z6BO\hu2I^s"1+>>LQ[bgrv &"30==HKRX[gcskrx~ '06>DKQU[|`vbnfeh]jTlLlBn7n-l ljfd`[UOIB:w2d)Q!>+ mV?u&eTC0  x_D+p[F1pU:u}`aKF8+#sX?t#a O>+ v_H1ufZMtAb6Q*>+ yog^VPIC?~;z6v4t2p0k0i0e0c0a2]4[6X;V?TCRGPMNTLZLbLkJuJJJJJJJJLLL NN+PO^l{$5HYl|   ,;"I&V+e-s/133331/-($  %+06:>BGIMOQQQwSjS[QOQ@O4O%MIGB@<62+'!wgV C2  |iW~Dq1eX K=0"p^K8'xgWF3"n[H6#p^K8%wfVE4#}jWF3!xi]NA{3k&XG 6&zk{]rPjDd5[(UOHD>:64/--+++++-/148:>BHMSY`hpy *; L]$m1~?N]m~#8Mb y0CVk})>Sj#8Odx.E\s+@Sfw-@Rex-;J Wc,p;|KZiw %-6<DKQ W"[$b$f&j&n&r&w&y&{$$$"  }ywu p lhd`YUOI@:2+#~qeVG9, ~|xlr[lJg9a'[RLF@71+"sb O<)ta{Qn>d-WK @4'sbQC4#th[OB8+xkaVLA9/& }wohb\XQMGCA=8640..,,,,,..0246:=AE GKO(V3Z=^HdRh_oiut{&6GXk{ !'/6'<8BHH[OlSY_dhnrv{ .>O`p -9FR]it~  """"""   %+28@GMU^fnw|vng_Y PJ B)913;+D"LU] ent|ysld^WQIB<60)# ztlc[ULD;3)  ynf}^{S{Kx@v8v.t%trp pnljhfda][YWUSQOJ{HrFlDdB[>SFLR Y_el p$v)|/37>BFJPUY_cglpvz~~vpg_WNF;3) xpe[yRjH^>Q1B'6' xujf[WMI>:/+!{ulh[\MO>C/6!,sf\OE8.~#ztpkgca][XVTTTTTVX[_aeimrv| !,8COZfq}+8#D*Q0]8j?vGMV^dms{+6BMWdny )3>HS_jv )19DLU_g#p2x@O^n}$5FYi z$*07=AG(N;RKX\\m`~egkmqsuwy|~+6BMWblu~|wuqokgb^ZVRKE?92*$ yndYOB6) |pcWHs;`/K 9$t]Fu-dUE4#pW@'p_Q@n/W@+yoh\XII6:#, teXvLiA_5R(F;1 & $ /;H&R1_;mHzR_iv ,?O`s,=M\m}-BUh}+>Oat 4G\p 0@Sfy "5H]p -@Par&7EVeu*7ER^kw'2<GQYbjry !#%''')'''%#! yrh`WMB8-! wk`TIw=g0V$E2 "varLc7U"F 7) u`I2ufWI:)lU@){ftQh=Y(M>1% |kXH7&uh^TI?4,}!rh`UMD<4-'! ~z v rmkig%e+c1a8_@_H_Q_[_f_p_}accgikptvz$7J[m*AXo#0:GQ/^Fk_wv !:Qj '6DQ_n}3H]r ).6=BNO\\khwu  #$)--30;4B6J8P:W<]<c<i<p<v<z:8640+'# uk`TI?2(vg[L@3$ uhYM>2% xrpfe[]ORBH6>+3)sdyWoIf:^+VK C:2,#tdUF8) wk`TI=2*  !*2:CMV`hs}*2:EM+X8bDmQu]jv #'-48@BMMYWfapl}v )19B'H.P4W:_@eGlMrSxY~`djpu{  ~zv r"l$g'c)]+Y-U/N/J1D3@59737-9);">>@@ BBDDDDDDDBB@@>>;9975}3u1n-f+^)W$O"G>6.'  xpja[S}MwFp>j8d1`+Y%SMIB >82.)# {xvtpnlhfa_[YUQOJF D@<8%3-13-<)B%J!S[dlr{ '08@GOW^flu{%+18>DMS[djr{ }ys)n2j<fGbO^YYdUlQwMIE@>:842.+)'%# !)1;DNWait|!#%')+ .046$8(<,>0B4E9I=K?OCQESGWKYK^N`PdRfRjRlRpRsRwPyP{N}KIEC?;72.*$ znaUH{9y-usnjf`\WQKG@y:j4Y.I'8!' p_O>- xpjaYQsJfBX:I3=+0## |xrmiec_][XXVVVVXX[]_aegkpvz~#.8CKV`ku %+1:@HOW ]f#l-t8}BOYdnx %0'82B>KIUS^^hjpu{'1'>1H9RD_NiYta~lv~",4= ENV \&e,k0s7y;?CGKNRTXZ\\^^^^^\ZXVTRNIEA=92,& yqi`XPE;0&tgYL>/ rcRD5$sbQ@0 sbQ@0p_O<+ p_QB3w%hZK=.!wm`VKA6~,v!me]VPJD=951-(&$  "$(-15~9~=|D|JzPzVz]zezkztz|||~ &2?MZhw!/@Q!_*p0:CKT^fq{.<M\l{'3@M Yh$t1>JWcpz!0>M^l}$*07=$C5GDNRRaXr\`eimoqsuwy y|&|2|?|I|V|`|m|wyywwusomigb^ZVRNIC?92, &     xncYNB7- w mbVI=0"yl^QE8)p_P@/ }napS^FM8:+)}l[Js:f'ZOC6,{m`QC6(zrke]VPLFA=x9p5g1_/X-R*J(D&?&9$3$/$*$&$"& &(*/159=DJPV]ek"t$|(-15;AHNT]ckt |(6ETbq(6E'Q:`Jo]}n %)8:KJ\Ynj{ )9'J8YGiUxfu  *"4/?9IFTP\[eempux~ ~wqib ZRKC90(  ~reYL@3~'xp ia[ULF>7/) sdU G8) {l]O@1#ufZK{?s0j#bY QG<2'|tkc[TLF?v;n5d/Y*O&D"< 1) "(-17=DLR[cmv!0AQ`q /@Sfx !%!)2-E/U3h8y<>BFHMOSWY"]1_BdPf_hnl|nprtvx{ (07?EKRX^bgkosuwyy||||yywusqmkgb^ZTNIA;4,& xlaUJ>3'!'+28>EKwQlWb`UhKp@y4) { rjd ['U/O7H>BDBFJ OSW[_dhlptx}}xtrnjfa][WSOMHD@ >:83/-#)%')#+!046:<>B E IKOQUW\^`dfhjnpsuwy{}}{yw usppn%l)j/h3f:d@dFbM`U^[\d\jYrW{WUUSSQQOOOMMMMKKKK KK!K.K8MBMOMYObOlQuQ}QSSUUWWYY\^^`bddf$h/h9jBlJlPnYn_peplsrsxsuuuwwwwwwwwwwuusspnljhfdb`\YWSQMIE@<840)%zriaYPH{@r7l-f$_W QJD>81+% uh^QG:0# rh[QD:-# }umd\VME ?60*!!'-18 >DJQW]djpv #'.26<@EI MQUY^&b*d0h8l?pEsMwTyZ}bkqy'1>HU_lx)8EQ`l{  $3DRap ~"')+-/1357;>> @,B9DEFRH^HiJuJ~JJJJJJJHHFFDDB@>9751-)$  yoeZNC}7u*j `UK@6+! tcRB1 xlaUJ>y3j)YG6%}n_SwDo6d)\T KE=4.& wmbZQIA80(!  !(08?GQZbmu#!*-.:4H:UAdGpMTZbhou} %4BQ`l{ '/8B+J7SD]Pf]pixv#.&8.B4M=WCdInPyV\`ekosuy|~"-5@HR]gr|~|wuqmib^XTNGA;2 ,$" (.29=?CEEGGGEEzCpAc?W=J;;9/4"2.,(&" sdSE4%znrcaYQN@D19!-" sdTE6s(dW M@4)zpe[RH?v7l1a(W"MD:1 ' {ws$o-k5f=bF`P\XZcVmTxQOMKIIGGEEE EE.E=EMG^GqGIIKMOQTVX'Z:\O`advfkosuy}':Obw 3DUev !)/ 6<(D2J?QIYV_^hinsv|}#)28@GMS\bhnu{yqibXPG=4*"  |$r+e/[5N;BB7F+JNRUWY[]__acegi{nppdtYvOzB|8.! ~|zvtpnlixgnefc[aQ_F]>[3W)U!PLFB;5/)" yqhbZQKE=60*}#ujbY QG>6.%xrlfa[WQJF@<61+'# (.6 ?GOXbku}'3@MYf r !#%)+/+386E:S>`@lDyHJOSWY]_dhjn ptv){3}>HR[cnv~ztne]WNF>7/'  {s%j+`2W6O:G@>E6I.M%SW^ dls{xrjd]UOHB< 6/)# $)- 1355777777777777799777531/-)'" }wsnhb^WSMGB<82 .)##+18> FMU[djrx #+{4v:rBlKhQdY_`[hUnQwM}HB>:6/+'!   "')+-/13557799999}7{7y7w5u3s3q1o/m-m)k'k$h hhhhh h kkmoqsuw{}{unhb\SMG@#:+46.@'J#S]hr  )6EQ^jw $3BN[gr~ $&(*,,.. . . .......,,*(&$    zpg]RH>5+  {n{dvYpMlBh8d.]#YU QMJFB><831-+'%x#nf[QF>3)!{sm!f%`'Z+T-O1I3C8?<8@4D.H*M&Q!UY]ah l rv}%) 06:@EK#O*S.Y2^8d?hElIsOwX{^dms{)3@MYfr   "'$4)B+Q/`1n579>@BFHJLNP R-U9WDYPY][g]t]____aaaa___]]&[0Y9W?UERNPTLZJ^FeDk@q;w7~3/)$ ujbUK~@w6o+i`XNE;2( }pdYMB6+teWH9+ yq{hl`^XOQ>I0C:4.(! }naSF8+wmdZQIA8 0(!( .4=CIQZ`hq{ !+8BO[ht !.:GS` ly!(.4:AGMV\d ms {+3>FPYaitz )3>HU_jv+:GUbn{"1>L[gv~xr$i,c7]AUINTF\>e7k/q'w| yndYOE~:w0q%ke\TKC=4,$xnaWMB6+!xl ]NB3' {sh{`jX\MKE<=.4,# {naUH LYgv%+16<BFMSW]djn$t,{4=EKRX^ekouy~!'.4~:yBuIqOmWi^bf^lXuR{KE?90*"   z'p-e1[5P9F>9B/D$HJ NRW[_cgnrvz|wj^SG:0# ~||zzxxxvttrprlfi[eOaD]8W-R!LH B>71-'" }uk`XME:2*!wphbYSKB:4+#{vrplhd_]YWS!Q,M6JAHKFVD`Bm@y><:88633111 //)/8-F-U-d-t-----////1 11+3<3K3\6j6y88::<<>>>@ @B$B1D@FLFYHeHpJ|JJMMOOOOQQSSSUUU UUU W$W(W,W0W4W9W;W=W?WAWAWCYCYCYCYCYAYAY?Y=Y;[9[4[2[.[*[&]"]]__ aaddfhjjlnprtvx{}|ti_WLB7-"}sh`UK@8%.+%28>EKOU\`flsy}tnh_YSMF@:3-'#   $)+/1355799;>>@@BBDDDDDBB@>>;97531/-+)'$"  {unhd#^'Y-S3O8I>BB>H8M4S.Y)]#dhnrx !'.48>{EvKrQpUl\hbffal]sYwW}SOMHD@>:61-)%#    }ywusqom m k kkkhkkkmmoqsuwy}{wp lfb'^/W<<::8866633w3l3`3U1K1@161)333 3668::<>@BDFHJxOnQfS[WQYF]>a3d)h!lptx}{skd\VMGA82, &# )04:@EKOUY`djnsw} &.6AIT^hu!1@O]l} 0@Qdu '5DUcr ",7?IRZbks|{wsnjfb\WQMGB<60)#woi`XPG?7,$xph_WOH@8|/p)c!UH9 -p`QB4%}ywsqmk{hlf]dQbBb6`)``^^```bbdfhkmo{qqufy^{VKC:2,# #-6>HQ[dnv#.8BMWblu !(.6=C KQZ$b-h3q;yDJRY_gntz#/:FS]jv %2@O\jw-;HWcp||vpga[RJ&D.;93A+G"PV^ eiosw|~}sh^SG<0%~yuqkg`ZTNGAx9l2a*U"J>3'|reYL@y1o$f^ VME=4.&{ l^QB4' xl_SF:-# {uoh b^X#T,O4I=GECM?V:`8k6s2}0..,***((((* **',3,B.Q0]2l4{68:=ACGIMO TX)\8^GbWffkuosw{-9HUanx%$+*1064<;B?HEOIUK[PdTjVpXvZ}\^^````^^\ZXVTPNIEA=72),2(:"EMU`hs{~vla WL B)71-9"@H NW]cgnrx|wlbUK@6+! }rj_UMB:/'z vpic]UNHB93-$ysmd^XQKE?:4.*#}unf^ UME<4+# xtnjf_ [WUQM&H,F2B8@?>G:O8V6^3f1o/y-+))''%%%%####%%'%3%@%M'Y'f)t))+--/11368 8:%<4>B@OB^BlD{FHJMMOQSSUW YY$[1];]H_Ua_aidtd~ffhhhjjjllllllnnnn nnnnn n"n$n&n(n*n,n,n,n.n.n,n,n,n*p(p&p$p"p rrttt vvx{{}xpg_WND;1)   %{+s2h8^<UBKGBM8Q0U%\`d hlsw{{tld[SJB:3+#{wsomhdb`\ZXVTQOOMKKKIIIIIKKMMOQTVXZ\^bdhmosw}{yuplhfb^YUS OKG)E3@><H:Q6[2f0p+{'#! !+6>IS^fp{ '-5;BH}NxUtYp_lchidn_r[vWzS~OHD@<61-'# |xtpnic_[WPLF@;5/)" }ulf^UOG> 60'!)1<DOYdnxx%r0l:fGaQ[^WhQuMFB>:3/+'#!   '-5>FNW_entz !#%)+-/138:<>@BFHMQSWYz]vapdifcj_lYnRpLrFt@t9v1x+{$ {sjbWOG>6+#  xph_#W'O+F.>266-:%<@E IMQUY^bfjnpuy}}wqhb\VOIC=82,(!  &,2:CKT\doy{yup#n/j>hJdYbf^t\WUQOMIGE@><.8>6O4^0l.}+'%#! '5 B P_lx&,29?EKPTX\`beggiiiiiiiiggeb`^ZXTPKG}Ax=v7r0p*l$jfa_[WSOJFB><831/+)'v%l#aUJ>3'  }pdWK>2%  } rf[OD:/#%'+/16<@DHOUY_flrx{uof`ZTOIC?840,&! % +2:@GOU\bjpw} #(,2 6 =AGMTZ`f o u"}$''))++----////---)-6-@+M+Y+d)p)}'$$" )6 B Q^ly+5BNYcnx}yslfb \UOI"B&:*4..0'479; =?ACEEEEEECCA?;940,($xrjd [UOF@:1+% ~tlaWL@5+  sh\OE8}.{!{y wwwwwwwwyy{}}rh]UJB8/'#+3<}D{MyUw]ufspqxoommkkkkkkkkmmmo oq!s)s4u>wGyQ{\}dny $+3;BJPY_elrx~ %)/6<BHOU[ahnv} )2:EMW`hs~{xrle_WPJB93+"  ")/7>DJNU[_ciunjtbxW|MB:0%tlaYQF>6-~%ztp le_[UNHB;5-'  {uqmhd`\XTOMI{EsCj?b=Y8Q6I4@2800.).!,,, ,,,,,,...0022468:?AEIM{QvVrZl^hbdh_m[qWwS}QMHFB@>:86311/--++)))%'-'8'B'M'W)a)l)v)++--//113688:<%>2@>BIDUFbHlJyMOQSUWY[]_addfh$j/l9nDnNpYratlttv|xx{{}         xpg]ULD91'  !'{+p2h6^<S@IE>K4O)SWY ^bfhlpuw{}rjaYQJB:1)# }{wsqmkhdbb`^^\\ZZZZZZZZZZZZZ\\^^}`{bydyhwkuosqpupwn{ljhhfdb``^\YWUUSQOMMKIGGEB @@>#<+:38<8D6M4U2]0h.p.x+)'%%#! # +6@IS^fp{  '/5;BHLRY]aglpt}xx|rnjf_[WSMHD>:6/+'! ~zvtplgc_YUPJF@95/)$  w!p'h-b3Y@DFHJLNPRUWWYY[[[[[[[[[[YYYWWURRPNLJHDB@;9731-+'$   #'+/3:>BHMSW]ahlrv}yslf`YSMG@:4.'! #)06<BIMSY`djpu{xrlf_YSJD>81+%    }y u q m h f b ` \ZXVTQOMKKKII I I IKKMMOQTVZ\`dhmqu{ysnhb'^1W><<<<:::::<<<<<>>>>>>>>>>>>@@@~@zBtBnBeD_DYFRFLHDH>J7J/M)M MOO QQSSUUWYY[]__adfhwhnjfl\nSpKr@t8x.{%} {rjaYQH@8/)! !%+06:>EIOSW^}byfsjopkufyb}^ZVQMKGCA?:864200.,,*********,..0246:=?CGKOTX\`fmqw'1>HUalx+8GSbn{{yupnjfd`\YU)Q3M@KJGUB_>i:t6|20+'#       {vrlhd]YUQJFB>:83/z+r'i%a!YPH@7- $ ujbWME:0' }tld]UOF@81 +%# )-38>DJQW]djrx%.6>EMU^dls{ "'+/37;>BFH LNPRU#W)Y-[1]8_<_BaHaMcScYc_edejepevc}cccaa_]][YWURPLJHDB>97!3'/0+8'@"IQYbj py {sl"d)^-U3M7G;>@6F0H'LPRWY[]_aaccceeecccaa_]v]n[hW_UYRQNJLDH)9#3/+'  {unf`YSMG@:4.'! } {xvt#r)p/n6n>lDjJhShYfadhdpaxa___]]][[[[YYYYYYY YYY%Y.Y8Y@YIYQYYYbYjYsY{YYYY[[[[[[[[[[[[[[[ ]]]"])]/]5]9]@]F]J]P]U]Y]_]c]g]l]p]t]v_z_~____aaadddffhhjjllnprrtvx{}~zxtpnie_[WRLHB>71+$  #'.4:@EKQ{Ws\jbbhYlQsIw@}80'}vnh_YSJD>6/)# {yusnlhfb`\YUSOMKGEB@<:86420.+)'%#!  !'/6>DMU[dlt} '0:BKU^hp{ ")17>DJPW[aglpt}z{~vtpnlhfa_]YWUQOMHFDB@>:86311/-+))''%~%z#v#r#n#i#c#_#Y#U#N%H%D'>'7)1)++$-/13 68<>BDHMQUY]afjntx}}uld\SKB:2)#  #)06<BxIpOjUd\[bUfOlHsBw:{3/)#  !%+18<BHQW]djpx}yuplhb^YUOKG@#<+8228.@'G#OU\d jpw}xrlf_YS M F@:3-'! "$' )++-///111111111///--+)''$"   }wslhb^!W)S3MW8a4l.v)# #.8BOYdny{vt plh d'_/]5Y;UDSJONMUH[FaDe@i>p!9#3#/%)'$)+-/ 1368<>@BFHJOQUWY]_dfjlp{tsxl{f`WQKB<60'!  xrlf#_'Y+S2M6F:@>:B3I/M)Q#U\`dhlpuy#+1:BJS[dlt}yuplhb^YU QM!I)B4>>:I6S2^.h'p#{ $+17>DJNUY]aeilptvx|~}{vtpnjhfa_][YU~S|QzQxOvMrJpHnFiDgDcB_@[>W`@YBSBMDGF@H:J4M.M'O!QUWY[]adfjlprvx}{vplhd]YUQMFB>:61-)'# #' +06:>BGMQUY^bfjnsw{ !%)-38<BFMSW]djpv}'.6>GOW`hpy{yusnlhfb^\WSQMIE@>:6 2.)% !'+/35 9>@BFHJLLNPPRRRRRRRPPNLJHFD@>97}3x/t-p)j$f a]YU QMHD@<83/+)%! yslf^WQKE>82+% #'+/38<{@xDvHtOrSpWn]lajhjlhrfxd}da__]][[[YYWWWWUUUUUUUUUUU#U)U0U6U>UEUKUQUWU^WfWlWsWyWYYYY[[[]]]__aaadddffhhjjlln nprrttv"x$x'{)}+}//1357799;;;;;;;;;;99775531/-+)'$    #'+048<@EIMQUyYs\j`dd^hWjQnIsBu<y6}.'! {tnha[SOHB<6/+% }{wuspljhfd`^\YWUSOMKIGEBB@><:8864220..++))''%%###!!! #)/3:@DJQW]dhnt{ %+2:@GOU\bhpw} }xvtp"n$j'h)f+a-_/]1[3W3U5S7Q7O7M9J9H9F9D9B9@9>7<7<7:5858361616/3-3+3)3'1$1"1133336 6 88:<<>@BDHJMQSWY]_dhlnrv}yunhb^WQKG@:4.)# !'.4:@GKQW^bhlsw}{vplha]YSOJF@<83/+'#  }y!w%u)p-n1j8h<842.+'#!  %+28@GMS\bhnu{{vtplhda]YWSQM JHDB@> <":'8)6+3-1//1-3+5+7)7'9%9%;#;!;!;;;;;;9975531/-)'$   !#%'+-/36:>@DHMQUY]dhl}rwvp}lf`YSOIB<60)#  !'.6<BKQW^flsy{tpjf_[UQMHB>:61-)%!  !%)-18<@FJOUY_djnt}{ywsplhfb^YUQMKGB@<862.+'# #).48>BIMSY^bhlpw{}vrnhd_YUQJFB<83/+'! }yu snjhd%`+^/Y6U{@xBvBvDtDrFrFpFpFnFnFlFlDjDjBhBh@h>f;f9f7d5d3d1a-a+a)a$a"aaaaaa adddddfffhhjjllnpprrttvxx{}}wslf`\UOKE>82.'! }xtnjfa ] YUSOJFB!@%<':)6.30/4-6):'<%@!BEIKMQSUY\^ ` d fhjnpsuwy{} !#%)+-/36:<@BFJMQUY[_dhlptx}}{ywuspnlhfdb`\YWUQOM#K)G.E4B8@><B:I8M4S2W0^+b)f%l#p!u{ }{xvtrppnljjhfddaa___]]]}]y]u]p[j[f[b[^[W[S[O[I[E]@]<]6]2_._)a%a!dffhj llnprtvx{{} !#').0268:>@BEIKMOQ}U}W}Y}\{^{`{bxdxfxhvjvlvnvptptstutwrwryr{r}r}rrrppppppppprrrrrrtttvvxx{{}}}}{{ywuusp nlljh#f'd.d2b6`:^@\EYIWMUQSUQYM^KbIfGjBn@s>w:{8620.)'#! }xtpnjfd_[YWSQ}M{JwHuFpDn@j>h)<):'6'4'2'.'+')'%'#'!)))++--// 1 3668:<>@BDHJMQSWY]_dhjnrtx} #'.28<@GKOUY`dhnsw{}}}}}}}}}}}}}}yunjd ^ YSMIB<8!2%+'')!.046 :<>BEGKMOSUWY^`bdfhlnpsuw{yv{p{l}fa]WSOJFB<861-)%! }}{ywuuspn l jhfdb`!^#\'Y+W/U3S8Qf<j:p6t4{20.+)'#!  !'+28<BIMSW^bhlpw{}{xvtpnljhfda_][YYWUSSQOMMJHHFFDDBBBBB@@@@BBBBBDDDFFHHJMOQQUWY[]_dfj{lwpsrnvjxf}b^YUQMIE@<840+'!  #)06<BGMSY`djpu{}xvrplhfd_]YWUSOMJHFD@><::86311/--+))'''%%%%%%%%%%'''))++--/13368:<>BDFJM}OySuWpYl]hadd`h\lWpStOxK}GB>:62.)%!  #).26<@EIMQUY^bfjnsw{{xtrpljfda][YWUQOMJHFDB@>><:8663311//-------------///113668:<>@BDFHMOQUW[]afhlptv{}ywsnlhd`\YUQMIE@<:62.)%!  %)048>BGMQUY^dhlpuy}{xtrpljhfd_][YWUSQQOMJJHHFFDDDBBBBBBBBBBBDDDFFHHJJMOQQSUW[]_adhjlprt{xw{upljfb`\YUQOKGB><840+'#!  !#'+026:<@BGIMOSUW\^`bdfhllnpsuwy}y{{x{v}trpnljjhfdaa_]][[YYWWWUUUUSSSSS}S}S{S{SySwSwUuUuUsUpWpWnYlYjYj[h]f]d_d_ba`d^d\fYhWjWlUlSnQpOrMtKvIxG{E}B@><:86420.+)''%#!  !#'+026:>BEIMQUW\`dhjnsuy}}yuplhd`\WSOKE@<840)%! }}}}} } }}}}}}}}}}}}}!#%%'))+..0224668::<>>@@BEEGIIKKMMOOQQSSUUWWYYY\\^^^````bbbbddddddddffffffffddddddbbbb`` `^^\\\Y!Y#W'W)U+S0S2Q4O8O:M<K@IBGEGIEKBM@Q>S<U:W8\8^6`4b0d.f+h)j'l%n!npsuuwy{ { }}}{{yywusspnlljhfdb`^^\Y}W{U{SxQvOvMtKtIrGrErBp@p<p:n8n6n4n4l2l0l.l+l)n'n%n#n!pprrttvvx{{}   !#%')+.02468:<>@BEGIKMOQQSUWYY\^`bbdfhhjllnppssuuwwyy{{}}}}{{ywwuuspnljjhfdb`^\YW S QOMKGEB>#<%:'6)4.00.2+4'8%:!<@BEIKM OSUWY^`bdfhlnpsuwy{}}{vtrpljhfda_][YWWUSSQQOMMMJJH{HyHwHuHsHnHlHjHfHdH`H^JYJWMSMQOMOIQGQBS@S<U8W6Y2Y.[)]'_#adhjln r tv{} %).26:>BGKOSW\}`}d}f}j{n{s{w{yx}xxxxxxxxxxxx{{{{{}}}}}}yuplhd`\WSO K GB>840!+#%'!+.268<>BEIMOSUY\`bfhlnpuwy}}xtpnjfa][WSQMJFDB><:831/--+)'%%##!!!}!{#y#w%s'p'l)j+h-d/b1^3\6W8U:Q>O@KBIFEJBM>Q:U8Y4[2_.d+h'l%p!t{  !%)04:>BIMQU\`dhlpuy}}}}{{{xxxvvvvvvvvvvvvvvvvxxx{{}}}{yuspljfdb^\WUQOKIEB><8620+)%#  !#'+0268<@BGIMOSUY\^bdfjlnsuwy{}}}{{{xxxvvvvvvtttvvvvvvvxxxx{{{}}}{yuspnlhfdb^\WUSOMIEB><842.+'#!  #%')+02468:<@BEGIKKMOQSS}U{WxYxYv\t^r^r`p`nbnbldldjfjfjfhhhhhhhhhjhjhjhjhjhjhlhlhlhljljljlllljnjnjpjrjrjthvhvhxh{f}ffdddbbb``^^\\YYWWUUSSQQOMMKIIGEEB@@><::864420.++)'%#!  !# % ')+.02244688:<>>@BBEGGIKKMOOQQSSUUWWY\\\^^``bbddfffhhhjjjjllllnnnnnnnnpppnnnnnnllljjjhhhffddb``^\YWUUSQOMKIEB@><:8420+)'#!  !#%%')++..0224466888:::<<<<<>>>>>>>><<<<<<::::::888666442200..++))''%%#!!       !##%%')+.02468:<>@@BEEGIIKMMOQQSSUWWYYY \ \ ^ ^ ^^`````````^^^^^^^^\\\\YYWWUUSSQQOMMKIGGEB@><<:886420.+))'%#!  !#%'))+.02468::<>>@BEGIKMOQQQSUWYY\^``bdddffhhjjllnnnppppsssssssssp p ppnnllljhhffdb`^!^#\#\#Y#W%U%Q'O'M)K)I+G+E.B.@0<0:262422404+4)4%4#6!6888::: <<>>>@@@BBBBBBEEEEGGGIIIIKKKKKKMMMMMMMMMMMMMMMMMMKKKK}I{I{IxGxGvGvEtEtBtBr@r@r>t>t>t<t:t:t8t6t4t4v2v0v.v.x+x){'{%}#!  #%').0266:<>BBEGKMOOQSUWY\\^`bdffhhjjllnnpsssuuuuuuwwwwwwwwwwwwwwwuuuussspppnnnlljjhffdbbb`^\\YWUSSQOMKIGGEB@>::8642..+)% # !   !#%'+..04688<>@BEGIKOOQSUWYY^`bdddfhjlnnnppssuuuwwwwwwwwwwuuuuuusspnnljj}h}h}f{d{b{`{^{\{Y{W{U{S{Q{O{K{I}G}E}@><8622.)'%!  !%').0468<@BEGKKOQSUW\^^`bffhjlnnpssuwwwyy{{}}}}}}}}}{{yywwuussspnlljhhfdb``^\YWUUSQMMKIGEB@<: :6420.))%!##!%')+.024 6 8::<>BBEGIIIKMOQQQSSUWWYYYY\\^^^`````````````````^^^^\\YYYWWUUUSSQQOMMM}K}I}I}G}E}E}B}B}@}>}<<:864420..++'%%#!  ##').2268:>@BEGIMMOQSUWY\\^`bbddfhhhhjjlllnnnnnnnnnlllljjjhhfffddb`^^^\YWWUSQOOMKIGEBB@<::84420.+)'%#!  !!###%%%%%''')))++)++++...00000002224446666666888:::<<<<<<<>>>>@@@@@@@@@@@@@@@@@@@@@@@>>><<::::88644420..+)''%#!!                         !!!!## % % % % % ' ' ) ) ) ) ))+++......00000022222222222222200000.-----**(((((&&$$"""   !!!!!!!!####%%%%%%%%%&&&&&&&&&&&(((((((((((((&&&&&&& & & & $ $ $ " """   " " "$$&&&(((**,,,,.00002222335555577799999999999;;9999999977777553333111/--+**''%#!!   ""$&))*,..01135778::===?@@@BBDDFFFGGGGGIIIKIIIIKKKKKJJJIIIIIIIIGGEEEECCCCA@@?><<998664420 0 / - - + )((%#!   !!##%%'')))+,,...00223333555778888;;;;;;;;;<<<<<<;;::::::886664443311//-,,**(''$"!!   "#&')+,,01134699:<==??AABBBDFEEEGGGGIIIIIIIHHHHHGGGEEEECCCBB@@@>>==;99885542200/-++**(&%%"!!           "$$&&'''))***,,..-////11111222222222222222222220000/////---+++**(((''%%###!!   ""$$$%%''''(((******++++++++++++++++++))))((((&&&&%%%%###"""                                        LIST@INFOISFTSony Sound Forge 7.0IENG ICRD 2004-08-23gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/sounds/gc_message1.wav000066400000000000000000001742461326020644600271310ustar00rootroot00000000000000RIFFWAVEfmt DXdata0 ",6BN[g[PD8WvlSx 7iAR/LC&DbaB r$KrT72iN 1V|8#Io fkV`idgG#r_3Fwj!|A4o.Dr6M |*--'"BvlQ.>Sh$G}F n:HUbp[F1=^H?^Ni wFRqGWG~$h)|>_v.g vJIHHGd!Z0z?A|5/~O473-V}dJ;P 1}`bdegR<'gfTB1pKfiY * zY8zCByx>^ONk|  [  t >/\JT !XLR"F  d j42L0Wt[Ce6ymHK|PbtlV@g D& })A@4SQ{F>Qc BVk }X4t&+RJz ~`X[ $1=i<;EvCzn?nh4\';ADHLOv8^ :t,p ,=750,Ry_D*TM{U0 $cpk ;WRNJEdN9$4Yblu~>"?e#bM06WI<. Z$ke JEA@!0>L:(.ZmhQ: "  ?v S{=Dv0gzdv>F#Ny`=>a$!{V2]J\n.cR>b B&2>{3"FHHz6%01223:BIPjPC=HS^i: L%"0B"\ ;o`k ,7BN p BzK X'#;a6rdL&UQNJFa8\D~zuK!4FXkBIh\3:4M|(-^/rY )Lo*\%6>ELTcr-COZfrcTD5\C}D/_[W$ESPUB\3tF.{{T.LkpU:4"X zF:.#HxH@hTmv4 ,#VdrT5(X|0yJ]"A_ `  x;d+;p"N/y wJ[S.h65f+w *8Gy T 2Jby2~fEsFn'(B:]@<71+mrT5Y~HTFz (2<EOJD>9+tE}B`)NQKE' Ex~cPF@3zU0 V7X0:lwZRJA90(f a4Sr]wsplh8p@k41EYm_<}@Re Yht>H4 n1Mhcvn$]N>.n8(C;3+#V>PW:Uph_WO~ s((r{5l@"DT[I >Sh>'JJ` f8QjzbJ2nR6#|\<taN\iv!URf%ch'j,2x~~n.n:+C:L |1*Ln$< >p0r-^4|uZWIk-fzN}~32|6[td1Dh_0&7Ieh-R 7cM8" E~*>\yL &VoYC-;HVdr-Ck.u6*hPu,CZqJ nKMHC>9 x<T"vR.$ &Kp/h!`+Y\`cf(p$7:\v"qNm(Lx&0uw4sU7?GOWr%Eh9[/NntI`rbC,R/BNA 1XY*;zR^ hBMoZF W>9Bj{HY RD$MIEA=B90(h Ti~<<Quvj7;>BF4H$+k}n \:Y  )]x8wW7  @:xI&jEx@ ^%b<^Zzj 5_a9,n$` ^<1^ T?_~"/<JJJJJ@6+!n9HJv[mW@&XxW6@JT}Na7\Wqvc*g`YRKDtV>%x"cBd|6dB  zh/W!*4n {nbUHrtfm{uoic'"D,D]xhG7'KnT;Zu4(A[gt(^L&tr`\XSO0RL{R*XT_".9DP>+,x\zh WTQfz4d^XRL~cV6Ncx~cH-cB vU4yncuEx`JEuP }M]XRMHRF}f *V}PCxS6zk^R2k@! 2G\[ZZY axb| 7Jxvtqo_P@0x RB3$>iqyW_qtwz|>HYnXB-6Vgx!0(_@xk^QD6)Wd ]HZ4TGDDFpjS<%:fb`p2stN)i<qP..\1m#` 20.-+M1e~-?LUkn)B`o&TjE 08,5 2x:74~ U1 6[n4pj@. `.}B c@:Uq9d 6_wZ1 n }(~[x$m'p%>VtJ>z"w!w#Fhfdb`@ RY~,gErGB! p@X+BX^elrz,XSD$c2d/yw 0LU;JZVQLH%XXT* #v 3nH!`~sC~tfWBj: ` ]PYF4"%n:~J<962/L$\/^7xzz z:5pKS6K|8FPwq C;Jzzzyy8Ln>7RDvX[^beF&G~jVBYp&6V-=M]2Of5:]*i<Y tJxZ;dTaq36Md|m)KGrw"v!R +IbzmX2 p9LXPHA9Uph(!PUV8=- 3j_q\"Y_B&b :To <TDc,7x -=.oP2!&-4 'p|O'K#BXs^Ma e4Xajt}kYG5DIJ>h<HU?j4$vPFpYB*Z2[\8,azk\,qg]UME="iceJ07YF2 |\:qK(aRKrlf}dL j7Q +b:&?$[o[ ;v)~ dir,`7AT7(y?Pu\D,7"7e~ysF,>Pc+5qclo.LrT7La<:]ft:8`'|H%w=p+v U,sP. 4Me>r.r?M\jxM"Qtrh;y4l_vH6#@*laIdX49p& a6V`BRukEchlpu(A:3OkBJd$x#fbCR ]z;X *",>QcL5Q/$n#/Lyu/ 27d%D`RSTVW2 F~u ?z_D( LZ(PifIHwC-Lj4R5]8M^(X,U~\L )2:>|obUH;.L0y|~Z0BsBbFxFQ Py;d;}(|)j W2M=[$Y/} sA+0n*2;DLOXo*1~6nH!<.tc `&)-04nc]W\afkl1 3GQjK+}CGVetOK~0lu#fvH{<Q}x7?d|Vf`^[XVTrXPB~n^RE8,$n/@h\OB6VwlaVK"R7zjo 4G8_dBp\vl4+~&P@h-F` Ab&QJzlGIKprQV\af7` djv{_$">[4LQJnB(feis.(e(Mr6k6=Rm8J!-8DP VL(j ]zRd?4)j+'X tDL<^cG*2UxOg%}[ZZYXi?d>\!X,_d9H)Z?sZB*Vrb4d>g'<e~3QJf7J]p o"L:1(x*bm(\8B}=Hi;Lz@G>,`vX:}V.gRD6(0G^tbZSE8*=^qZB9*Ip:d>||Rneh6HAq2Le~:|bcb`^]PCl`Np8{C[s6NgQc!"n!>|V1K&2wbo4{'~*,}_~ d5| 4\~gPv-pu7$u{`= =n8{+anm=R\$,3579;"<WtGB!B^$5GXK>0#A$GjhB!/\<3h,{Rdg15GYk~/jyL *Fb*hDjLB8-#nM;(]hov~&Jo>{T.;)sNL&3TU|^WZ]XR4{vrm&O"o rbRAl8W0BTgD Dj&fK0Svp%L%`rdMgTQ]c8y;^.2<Fa|N#[3b:(4zaN<*(8$9,%,D[rJyVrR1>%$S.Am{~8e{yV4?JVa'c(8j;[z*pV&]+_,iJ*1a]0xPqM k-SrH xh `iM15SqCZ%c6gP9" ":QhG|2H_v\B(9@Q@VNA-WnJ%irX> l5xkj2xCp],X eqR3pf>?Sh|^-*(%"8C@=:7<#6CP\i RA~c_ZVR8@b`<*n9OAdK%\z9$ 8bHsP [PeD"5+BHM}8.(y|GN#kCejU}xtoj4B|5,&Ja2*#" ,:GUPqF,zgTGwl8l60*#|;*E8*3+ydV8hhijjBZ#\\\[[w:_pvg: X+R v#h8FS`n43JZGt,b/\IL6qo2uL95,Szh |>&wRZNXNS"+3<DW<w6WxyiY@ jG$q2 8d$-$wW6m[b=(z5BN[hr{T"@^djpv\A;&i(Z)hV_k/3HFtNCDPeE%&(*+Fb}->PaVLB7yX82,%BdZ D~|[ k\Pk[L<,i! 1DN|7D6w+3~D @w? -eQ['S~6r_M&t8GGNT[bF$kV'I^CT>v2pl+DPteVG826d5| d2_R&rT6ns |)?gT d2nLN2xqL#_4.(#p6HC$Jq 0?N\k^RE8" ,V &A6,"McO $L^-:4J{6(]b.#^pd f6 ,CQ C{6>^~mG!N>wb$0Hngv<\{"r `<aK*S|c@|\tY\:F25dCv8> JDy"N @% l0*[QyaL7dhknr:9.Ns|G~"DflS4!?`Y!r1lK)6CP]#ex(|%JnxY9o &)Ct tCDE&@5ChFV6>3V.~q^t62auV@%>2kgc/Q6/b8VtnJ%dpg.vj^RvNN~z^B& 4OcxtU6]3X&vfMKJHFv1Jc'L6XDZfi(exVQLZ"l0zP v2CuE|b2;lc.a.o~2\.l $L3_Cqi4(Y`'|Q7A Nha `,)]6p@p|X6nzk$N.:gG'8HYjIEkbA! #6>FOWL@4) nM, /dD2bzKtlToqsuw WgN4| RH>5+hdL3G&>U>(1wC)vT2jb&nW^v)Vt 4DD5|d-?u 4h/qg]dka^" \:l5(XA H)JB:1){T.  tcRW\bg>oDTcrgL1Sv)e*M|BsJJ`NMKGporvy|=,Y ]s(1@BLK3C;Py_E?9z=DDA`~DTZ0fP!eL`j>e#>Pa c#8ln;JZ-)x6oqKVrzS-,tM{5" *Ln9}C/6<CJ.f>y{~ @b ,  vHB\F0%EekliF]tuF"[jz$v D5%(=0gzh`Axu 4& PL)obB"(/6<v dj_$#d ` a ~B;4.'Ffy7]D~XjWv*tsFU:*%b"VtroGLyr z(Z;F( !=|9 S1FZn]L:)~P"z`_^]\m~*Jj i0Q{`FUds,e aK*NrX># bMo@[6>fiDNX.%FfR21]zwW7[';O7Q@->V(D f F~({%+}&2Yth)V`'[0EMJ<.XbtcLGk$1bF_.XoV8Tpvk`:f6\K:(!*4>Xr #  ,<KZjypGpB$LT*r v43uctCWj~lXC.d ~d\TEa~ ^'AFFdDhe?6.~DhB?MF(ZiF$,WJ=Xs@4bGI,QtqNV5gl R(|&z:z|Hn1[-)Jl.D[qxzpf\RG<0%  n]KIGECR`n}>i)LT\dlO2x8k$yF(TRVp,kt|S:l&Gg V0 ~H33333Bk^VR2R2H^HwXjM2>\jx\$Cbbb0teVF7(D1-8|;V`YR2ITcN+}T8BgS dl48_1OmscQ?-~zu>]})Z-t7yk]OA`A]7x /ARHq&tfXK!pjT9Y^c _D?0+. i".:FR z2>KJI40v<=CL&|&*.26\(<@C[: |_D-+p~>X*aYH02'Xf;j$]Hv(T}aE) 2F[piH(uN(Bs#bKI,/` 't Z$?4TsiD iBb=lP4@g{@-z>i&?HmP4@opB:1DN=R*w_F.Fu6Z7gav\0F"Zn+&M)rrBx8x1]1 6`LrtX="} *6BN[htlXC/tS2 "Eh$X5RoysFw.YjF! ,effa 7bSD4%H>}(*o~BA|?5ht$4SsLQ4J_us;"^(U,*Jjh>BFKO0g0~@hd`\X~4wJ-`e24>i5:pbz4:rkd]V\>}Z"y}Q^)V&[}tj&[5v]${ bl5G1aVJ?4{=,{%yN";v>,v Tz^)h"b&jrz+dAr3,$}W1 vdR?=;97FVet0=JVcdfghfc`^YTOJD=60(~xz|~:ZyiBtJ+ N+f3^\9N ?pB<5.(NtL*yN\ o z'b(0_66:u&,27= {#snL&Y545j dx)2~L>jLdN|pK%d$p46h7m"#$%& xT1 mT<60+%4BP_x':L^qv|}xtld[SH>3(0DXk}[8gO6':dBs5>HR[B*a/L"zl=t2u%\y[S x/J=0"4RpW2}@|?p 2H4 7VuA%t<wq3x0Z!ubP>+D^wE R1dsr[D~A\. 8c+_ !iDrQD8,)2 hs~EQ9VtP ~<z=lOXbkt8zA9Vt~Mz9LuF1f:Vqh^TK#t? xJ&Fe 3X~lK*lZHFDCAQ`p(?N]l{|}~xpibWLA6* "/<IRZclpsvzrjc[J8'ng`ZS\dlu+F`zlG"mI34OjCn210/.RW%6h4h2SUXZ\=u@ a)#Z5j;]]\\\<r=j6"U#X @BCDF* uFP19d=hdAydO:9865EVfv+FXj{vjYH6% "(.02579;=?@@AB<61+!*>Rdvu\B)t^G>6-$0bA @b#Mt 0&p? U*8`"V(>SH<1&OT%"JrFu,AVLB9/^+l@>`"Lv$ jBaJ4!:Sl>^~sZ@' xd_ZUPZclv/@Rdmv~wlbWH8) ):FS`lrx}}{m_QC0vgb]XS_kw:VloU;|^@0! &Ff Hk  yJjA2St%Q~ "<962/xF~M4VAp"><:97T"h: *Gt*Y $"! Z0ZC,,AVy-SydB!vbMIEA=IT`l1DXk~~o`QB.!,8DJPV\[ZZYTPLG?80( /BQ`ps`L8j`VMCIPV\o:Xv{W4]I5! +D\u)Lp|R'~S:! $;R{Hr  ^5 hO6 "7Ms 5^fF&fK0)"#2BQq7YolU>!nd[RHOV^ez-@Sfq|th[G3 ~ ,<MWblvvvwwmdZPA2#(<OZfr}~~~vne\L=. yoe[agms2G\p~l[?#ziXH7:Hd;Sk~jW;teVHKNRUhz 6Mdp|tjVB.~ytpkt| -<L\enxti^R>*(;N`ju~paRD2 |xsnv~$;L\l}zhVE*ymaUIOTZ`t0Ib{uX:p^L97531BRct0PpwZ<mU=70*$1>JWu.Mf~x`H(x]QF:.6>FNf~ '@YrxeH+sdTDDEFFWhz,GbulT;"yd^YTNW`ir&;Pf{tbQ9 ymlllku+DVi||r`N;)wnprtv0F]iv|siXF5$zqh`W^fmt5Kaw{jZB*xhXWVVUbp}"=XmlR9 r]UNF>HR]g<Ri}hS6o`RC47:>AVl.Jf|_B%|hUA@?>=M\l|:Ugzs\D,rjb[SY`fl~4KbxtdT>(}omjhfp{5H\or`N;&vjjihhv&=Sbr|r_L8%xof^U\cjq &<Rg}n]B& xiZJJJIIZj{3NiztY>$zeOJE@;GR^j9QjybJ-ui\PDHKNRex)D^xpV; ubPMJGDQ^ly3ObvvdR?% ~rg\PUZ^cu "7Lanz{pZD.ojfa\fpz+?Th|~l[I0tgZ\]^`n|*C\niP8 xd^WPJRZbj~*BZs~jV;zl_RSTUVfv.Hctw`H1|ic^XRZbks/E[qq^J2rdVWXYZix.Harv`I2mga[U^fnw*=PdwrbQ:" }pddeffs/EVhzlWB-tld]U[bhn1H`x~lZ@& tfWVVVUds-Hbrs^H2~jc\VOYblv2G\qoZF,|rh]_bdfv3Jao|thR<%tqnlit~ 5DTdsyzueUE5 ~ .AS]gq{zzzyoe[QB2"{ />M\cjpwusqof\RI8&~} .=LZipw~{vq`P@/~wz~ .ATanz~reYD/usqomw #9J[l}kXD0|sjbfkpt-BWlxn]L6xkkjjjx(>Ucrzm`L8%~zvs|+:JZipw~|wrdVI;(%5BO\imptxrle_QD6(&8JU`lwvtrqh_VM>/ #4DTemv~|xj\OA,srrrq~ "7M]l|{pZD/qkf`Zclt}.DZo{hTA(}rh]RX^ci{0F\s~vgX@'~pbbbaao~'>VdrujVC0|yvrox,=N`jt~~paRD0 #4@LYehlpsmga[N@3&,;FPZehknqjd]VG8) .?PZepzyxvuj_TI9) zu}3EVhz{tdTD4 zodfhjl|*@Vmyzm_H0{jYYYYYgv #:Rbr|fO8"|id_ZU`ju 8J]pp]J7 vmdinty&:M`jtreXJ6# ,8ER^bfkokhd`VK@6&#3=GQ[^`cfb^YUJ>2'$4DMV^gjmpsmga[L<, }w}#5HZlu~tdSC-uhijjkx,D\l|qcL4xgda^[ht6O_n~|s_L8$ vqlgbkt~*<M^px}l\L;&{~"4FR^iuvwxyndZO>- !-8DPTX]a^ZWTJ@7-  #.9DOSVZ^ZWTPG>4++5?ISW\`da^[XL@3'$4DP]jvxyz|sj`WE2 ~zvrnx&<M^n}ubN;(~xrmgov~':L^qyp_N=&zqglpty':NbmxxiZL6twz|"4FR^kwxyz{pdXM;* '2>ITVY\^YTNI>4)#-27<ABBBC>:61*"  #+3;>BFIFDA>6-$ $1:DNWZ\^aZTNG9+ +9GUcipv|vqlfVF7'zrw|(;N`s{|l[J:" ypfjotx,@Tit~zj[L5zpruxz%8KXerzncXD/(8CNZegjlnf_XPA2#(3>CHLQOLJH@81)   (-26;<<=>;852,% ,4<DLPTW[WTPLA6*"4EVhpx~{kZJ:$ zpfjotx,AVkwscS: xk^_`abr2Kdtp`H0ufdb`^kx #<Uev|n`J4}{xvt(<HUbnpsvxph_WH:, (2=BFKPNLJHA:3,$  ")-159:<>?=;970( ,8ER^adhkd\TM@2%&8J[mu|~zk\N?*}pcfilo,AVlwteV>% tgY\^`ct #:Qhv|m^F.p`````n}*BYgv|obL6 zzzyy!4BP_mpsvypg^UF7( &0:?DHMLJHG@:4-" &.6=@BDGD@=:3,$ *6BNZ_dhmhb]XJ=0"| !3EWirz~pbSE0zl^adhk|*AXo{{k[B)sdUWXZ\m~ 8PhvrcJ0rdeffgu%<R_lzti]I5! 0<HUacfhjc\TM@2$  !+048=;:862-($ %+17=>@AB>;84*  &4BOW^fnljhfZNA5"|~ 6Kan{tdU=&|n```__o~6OhxrbH.xiZ[\\]l{0JdtvfL2}n`````o~'?Wgw}oaJ4%7CO[gjlnqh`XO@2$ &/7:<?B?<:70(!  !#&(*+,-.+(%" $0=ELT\\\[[RJA8* $7JWdq~~rg\H3 oljher~ 8Pbs~r[D,ta^ZVS`n{ ;Vhyu_H2xeb`]Zgt/FVfw{q\H3~{xvs|2BRcsx|}tlcQ?- &2=ILPTWRNJE<2(    %,4;BBCDD>70*  .;HUbfjnrkd^WG8(~x 7HYj{xp^L:(yrjbjr{3G[op\H3xphaYajrz4H\plXE2}vnfmt{-?QcuzzrjYH6% '4@LPUZ^YTNI>4)  !$'&&%$!   &,.035420/(! "/<JQX`geca_TJ@5$ 4I^ju{m_Q9" yl`behj{ $<Tkz~n]B' reWY\^`q ";Tlzo^D*}pcdfghw-DZhvsfXC.~~~}} 3FQ\fqpppodZPE6' "(/6<<<;;72.*$  !$$%&&$"  %19BJRSTVWPIB;.! -?KXdpsvy|sjbYH6${wtplw0FVfvzpZC,~mjhfcnz0HYj{~s\F/uspnlv(>N^ozoeP<(!4AN[hjlmof\RI;,$,4;<=>?:61,$    (16:?DB@?=6.'  "1@NV]dljhecWJ>2 ~0CVhqz~zjYH8! |sjpv{%9Nbvn[H4|unfnv},?RexwcP<(~yt| 1@N]lptw{rjbYG6$,4=FNNOPPG>6-!"$&'"   "+049><:86.& #0<IVZ^cgb\VQB3$ 4IVcp}~~th\P<(uttts0F\jx}n_P8! |qsvxz$9Nbmx}l\L;%y~#3CScintzslf_P@1" (1:DMNOPQJC<5*  !$(+(&$!    "*135794.(#$1?HR[dcb`_RF:-+:IXgnu|}vpjXF5# |xsnx+AQbr|qfP:%pnmljw)@XfttfW@*stuvw0DYdp{|xj[L>*!0>LQV\a\XTOB5( #)06<:986.'  $'*.1.,*'  %3<FOXXYZZQH?6&$6HZclv|xurbSD4 wnty~(;Nbu}|iVC0xrlenw 7HZk|vnZG4 }xtoy,AN\jwz|xncYG5#(9CNXbba``VMD:,  (+.2520-*$   "',,,,,&!,8CNRVY]VPJC4& 0CP^kxyz{|peZN9$vwxyz 3H\huzj[K4|rhlptx)>ShtubP>& yqw| !3FXjqxxpiXF5$*6CP\^`bdZQH>0!!+/26:8631)!   "()*+,($!  *4?EJPVSPMJ?4) -;IWeinrvnf_WF4#~{ 5KYgu|pdWA+~qrrrs2I_lxwhXH0{rvz}-BVjrz~xq_N<*,:GTbehlog`XP@0! -5<DLKJJIA80( "(((''"  "$%'# %,3:<>@B=82-" !.<IPX_fc`\YL>1$ 3CScsw|{ri`M:'}yuq{6O^n}th[F0sqomkx,BYfsxj\N8" svxz}&9L^fnw{vrn`QB4! +8ERVZ^b\VPJ=0$  "(-287665.("    "&*-+*(&  &3;CKSRRRQH@7. %6HYbjr{wsok\N@1x}+=N`ryxq^L9&}wqkt}$;L\l}|riUA-|zwtr}0ER^kxyz|}rg\Q>,"1@HQZb`_^\RH=3#"+47:<?;73/&     "# $,5>BEHLGB=8, -=HS^iklnpf[PF3 !6J_jup_N>(|svz~.BVjs|ziXF5xpw~'9J\ntzxpiWF4" .:GT`bdgiaYQI:,(.5<BA@?>6.'     %07>ELJHFD:/$ '4BO\`ejnhaZTE6'*=JXfsvy|uj`VB.~}||{,AVbnzvhZL6! twz}#4FW`ir{xurobTG:& &2>JNSX\XTOK?3' %*0666772-(#     $'%#!  #.5<DKJJIH@7.& )8GV]djqlgb]N@2# 3DTev|zpgS?+~zvs}3JXgv}pdXD0{{zzz(<P]jv~paRD/"1@OU\bhd_ZVI<.! (08@ABBC<4-&  !"""#   #! $-58<@C@<85*  +:DNWabbbcYND:)"3DT]fpyvtqn`QB4 |*;L\msy~vngTB0|(<IVcprstvlbYO>, !0>FNV^\ZYWMB8.$-58;>A=840'  !#%'$   "&%$"!   *06<BA@>=5.&%0;FQTWZ]WRLF8* .@LXcoopppeZPE3  0CU_hr|yvro`RD5! $3BQ`flqwqjd^N>. 0;FQ\^_`bYPG>/ &16:?DB@=;2*! #&*.,*'%!')*,.*&!   )2:=@CFA<83($1?GNV^\ZYWLB7, &5DTchmrwph`YI:*%8FTaortwzpf\R@. %7IR\fonlkj^RF:($1>LQV\a\VQL@3& $+29@@@??82+$ !&&&&&"   "$'%"  $.38=B@=:8.$ .7@JSTUVWOF>6( ,;KS\dljgdbUH</ .>M\bipvpkf`P@0 "3>JVacfhjbZRJ:* *8@HOWVUTSI@6, $,469<>:61-$  $&()+&" !%%$$$ %*/4988870)"*5@KNRUXRLE?3' *:DMV```aaXOF=- ,<LT]fnlifdXL?3! -:GTY^bgb\WRE8* "1:BJSSSSSKC;3&  *48<@D@<84,$ LISTBINFOISFT5GoldWave (C) Chris S. Craig, http://www.goldwave.comgajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/sounds/gc_message2.wav000066400000000000000000001222661326020644600271250ustar00rootroot00000000000000RIFFWAVEfmt DXdata@ wP*Cu,z  /DZpxI@fP' z-oY%>YZZ[\fE$a`IH 9RjrzBh82L < o b#2h1H_ cx)c!X e Sj")0BydP^lllll* e   2 ;|X%MwU2F Y l  1 N ks{aBtn_ &?U! 0 t r ^ 3lH#u`9ao*0m 0 U z ?   \ "'$ fO h0i   R s3zS@. W@z@[ aN<60*$ TIjP6P$apb / D Yn"a( P y $(a<R4,8E C 3nY9 ~"k8G(KG;h k?j b /n J$t9^"y&XEE P \]I4 H2]6>a0d0Je F 6 crT7Z' ' ~8\ C jn v \ G 2|MO [.>T Bw3 N h<lF W`16g?{T  $x Z.b.]+B*  F x l - NQ2,s>2Rexy = !@ < & ]8(LqBo W Dh L  6 K Z#j ?]H{hVC+xM" 9 1j]-br%j8 # 2Vyi4 ^(>N{rD |T, O 0F$`@r y.h6>  "TX ( z-6k(j,oBP^l z h UB0Jc < 'nx6pp20X$ 1 D lY:$Inu4{Z8 + #  <m 8 ^ s.\b7eV  * 4r 3w2Kd}2BfK0p {T ; ".vDP|=w%d  < Y3|na T F R ^jvR'^2i(f4!b R N  r> ^<~JNRUY? <m5 b S`gn v } p cVIc5{gX>VeJ / #  P % * wA d(wG\p(p< E '=AD H L [ jx;V@:w+b*q . 8 C NXX{ j zXMB7,vwS/^*?~< " s"8M b x {J'd@r2RZ'{$    (:\ .Zy${bH.Fv7~ S  $s F >]{? m6Z   $ (-|A 6 ,G4"TrT7OgUN ^4e 0Cp*S|rCpJ%Il/t\ C 2!Lx *WK  (S 2 p3Tv,hr/Kfb^[W /  | @  x 2{0r\G"Dt\ D  E Z  g>@iv>N, D w W # 0<HU?*Ft]F0n( < u S ;jL..Li|vp Z` * f  kT<$DnDf6Dy8 p ,M  y , hAIPX`ir{ Nh?O`p \  V gxr^J2Xj?_1Qrn* T  n P 3 Zt\yC":Natyrj F  uTH=nuJ k& 6`E w / W O G 2  "Dg4e * #  z^o2V%1Om. o 0 q f \ H 4$.V~96 ( y 'K.M818E = i 3 z = N _ ;  .BVK@6+LnS0 . [ .I;-cM@l 9Nte$ [ . _  !rW=WqnR6LbwVzp h > q 2_sg[,ypRdfvp; d . + ^ f noppqm$Xzqhd`\X V ( g >k zZ6ne7Og~Nu H  ` 7 k  Fq_M;)7DR` H  Z bixD6^? o4  d  g  9#@]z^$. Q N  G *vfVF6Zd 3[> G o  x&8J[mv~b6 $~tQ . =  : p 9|}~,4GIKjW w m 5 G  yc0q> '0  V &  > y 4s3l\M8$ e b ` ^ [ 4 t ,  (2Hr> P\ X C D  k w*0i5rVY' 1 ; E O )  { @  !A`?}Nb&M9 '  $ p  z:AGNU64o> }\jH& % $ " !  O  &Gi}*O}fP}xtr q p n  r ( CLV`il,bZGd/ { W 2  NU L9a^\YVB - 2 8 I  v2~Hz6:dlNYj z x l K *  X2Vmb#c4PE W  V ? >b"H h\B( x:  , < > ? @ B 7 , dOrCN;HlRj  ) 4 1 < T 8c<Dr6i!^&~=y    + 7. <>.r,XftY="| : {   N Gk5OnHs>N6V v " - 8 C Nx-V-8vagZN > > v  Z ZK j+Hd^L F t  7 W w F+az$y"L! ~kjh  { , s  v 20sZ,;IVdrdx@ 2 d  B f iG1e&Ad$ d,27 n + 0 F,l`,8DQ[eoy4d#` & d  N U5*V3K=B[R*pL' S  n  V(pPAHPX__```hpy,+c Y  < v  S 7+R J[UUZJ%W/@ ] ( j ' ]0r8D~zvmdZQbH6h M  N Tb Vb;% VPMo\ ' T j?6expi%gq9 | ( } % w  X-ZT#v2|c)6D X % nS?],(#xV4DTP Q g  d  /Z7b^/8x*o$ l J '  u0IbL5}X35\WF u 2 Q  3T6MMLLV B>x V 4  TrqeXL@jC R M n 1 H 6mhR~v8@!\vfls\D ,  nO"Q"Ttl<z  T * TC|UZZ0\hdB 1~*yGMd\.e  P 8 w"(7TpnN D-zB WX^0s;  ~  n"?xT=\2Rr&N^V { w t p l e^H#w\B(`|+9UN8x{ }  ! h*=4jTB=JVcp%pS 6 ; @ D I h Vx ~8c:4Kn,y@ 4 A f `-B{=~ =>@BCXnO0   . d C~\:o~M3~:^ CV i Q |~@X &@1"zgVD  & E z U b=H(< Tej3x( M ^  B=[,CyjZ4| h f . +($!'-l (QPONM$f! A y B NSUW6`vk@ . \N8 | L  N|[>_wne\2^ vP I - s76rG|@tn.rT X ,  !1Am>-PsC(y=%) r *  xGDb_.4;8N%.}z' f I ,  %:NcL6}DbTj/6>FM<  zU0 v&{h6G8C $  Fq#:r D_&h&)-  x[>!ZWuJVS c$    /albM&7h WSZK | %}bGfV': [8;2l*    (WhZ2Ol>Q-be*F a wZ=+zO$W(^|t"y^{B  "Xr"++AXnS"Z&TI#; l  ,{TBr`N;)SAV1pTc _oh0X"Hn{:JZjzX5 {OJr8'Pxs\E$nFRSj2\ x=-RxI.A2# pe T)h(LpX'E0r6s\U] ".:Rx "8Od{Fs.xKMcy].=|8xn@RdwNh#SX\af~1,D\%hu&l.#Cm>?XDx-n~N2TvB Bcyp%h?<852m2H]spl9j0#p\ ;i FX1 $EfF' y;>T 0t#0;F 6T0 d t&+G+B& zFd l+ $Z*:'oO0; ` "FplA|,6@1"h4>HR\W0r$q2 mK(YRD6)^ D~V3.)&# Y\`dg1eEvChi)iCd"bSD5&aHplAP#,4<Emw,X8I1Ur/nN- {U.vcP=*a 2[dD$E.UTRPO @p J 1=JVb+zb?eA_sZAbDvQ,"bv 4H\oP^yJn$4exn]oZ:F}tT4SrxB(o|}V.  -:l]%Mu>~{'}tU;"2t|SUWTRPMy{!tpmuNG@819ApR8Vt$`bdfhzrX>teVHFDB@]zxY;GQcjotzvm @:Zy[X^chn.jJ-^J5& Iq~cH,H^wd$)@P`p,29@GN$GrN)!(HgkP4v0Dg0$9+?DJPUL.MHvP6,D/LcQZL 4$+3< 0 :jWT/&^"n$`J4 d ^  x#, '6E6' 7dz4 n2p> s*g[NB66788dHJ$.9DOZeUE6&UK fpkQ>,]~ulcZ0 M}xtpg 5@K`v~m\XPwPbtr`MGA+n@JRY`htS>RftiLT%@[vn\K<-(rR ?tmf_X^dkq2u+S{eJa7ESaoXB+@&>1$ &A@@?>DINTH{Du;9(nQ&,2% zq-C rcTD5BN:& VL \ MzG)eJ 1)nS8^ .@]u]YU: dNjU$).3X~hFz9 wlb'$7FTcr&eJ0i,/nZb3<FPYHhmb2_WC/H^ b({p;c, $WlN0-N 4>Ir!28\(ob$f.KFr Y4gZs"4F^vX:l!EtI?k.y3\ 0XDLSUVXZNAe<Qv$e _{#x"g)j,,uU<MhH(wNM{jXk@T=aQH'q`O G'{%wKF`%q\F0( O~F|0/lMd0$F0]<TK*0E&]*NR-VF6& >x#XJV!d? j3En#B8*`jw,Mv:y0m>1$ #\D%P_t@j+]=WDt(G/YpN`  qA8.$"c&cp/\q:p 2aJVV>JC^xFl'l:,](a (RhMsLv.S-iJV/Vz ]T y@g~ YERF9$CW n!]6PZ]<w g0*Ot\C@ qam [VX[D,U]G_i+dd*fX:FW#>ZvAenVKzbP; |_B%vi TaXt9pwBi bJr!~-Hb| :KTh62dV dS.CvY6@6'FF~X)oYnuCZ k3 AB0:mnnop\\q"zZivD>3,S\0\`2!^w&@/wg zBHNTZPb6Rw:{5pf~  D}T,ZZ2= t:V*6yL~L*:JZ g|IY>}SXk~9wR,fqP^*R:z\HZ(2;DFa> k)08N'XJVbM)Op]pGt\}S'^&!:dR(DXkE D|3/I.>z. 4VP$lKR r2"Di#[z6l`@voDM|(!5bvr0p-`d94?BDFI<2QErh-pnT!4rI!NzB*57<}*llXFijfa\X8|u]{a(qxnTVtzMp? pdtc~la_:|pd4zxu$zB^zx>Yu}r{$[z?y GvgXJKx~ \xBV-HdQ"Z!"A gA o m,k^QD7M iPmyD!>\zKS~ &?yMw}nX cXL@5I}hTS ":Qi64awt$T$j/ pV J@7.$7nxl6y2 1.H,\x C}P$/>~T+h!p*p0K] Bzc^Xj;8|!%X[,-.lT4R ~;DXll:p q=0#K=T7GXs:TC:1=T0Ne|(++YPf(/b _r8PG2zh(q "h*Qx 8$ JxJ `" 6y m}|feO" Q9" F&6NJ`uh\Ob .>b 54Q)Gd_H"M6> 3KJ`seXMm .;Hj1:[38aEG3 uN7  L+8Lhh"bcL;0R 1D f*FRtJ$<`>5 l B5( jLWfym" LG6(H "8M=Vb#_6 :P*&|U@/[ DYp5RD&F  4IyB`n#R*0W2$n@{- T>Xp6_T9 |'|4t@]c&g@(GZ/$pC{"P@XpM 8vZ- {`j*t 8Xk4tP,9U_-b6p @,Ce'` Gd7vj vD"QpR}V0 ":Slg.X+_t)*YHr*" JtN(s Th>(_e `9,F`{$x>H4fe#3[L>82,&` q8 ~_Db7(`bb>6Rm+|8 x:0c^*b6m(YOD:0f n9 uK0}W/~%b%vwP(@Xq'v2 z3 T^8n 8g&e[RH>r j&^9*{a8.k.(`;Nbu"n$^ R\,hB};uj`UJyf#V)xga<?FBf9K^p^~TyLe%B}M>vh[N@q`wFfZwfDC SFj>N^m}\ tAjB|g*H{MCzl_RDt`uL#nQjvU5M+WEY)h]RF;nbt? ZKikMR*VAe:NatcR g8rj/S#XHtfYL>mT d>fUtvX`7`?\0CVi|^zKq ?ue*R/dQwi[M?lNd7 ^XwrQR*WEc6HYj| PnEd4l_$S<nXq`N=kR g@gSmzZ9N-[Di?O_o`t=V+fm4`9fLuj^SHvY f1L?_dFU2_YZhvPZ$L*hh,W<lVzm`R bh2L?[vqR4L>~%s]iuZ^{6L[$X?{7vcYV 6<]~hM1Q>w$,} ^Zw5:qrtvwDRL-HvSC kp1PpybL6bX;0lvLLj"~3osw{Nd ZRf{h@J@{9*p[q x.\uj_W8*{D O\r.uIXgv`:HF2MxZL{*1^}pcV_P:~E OZr1r6H[n\8RWNMQ`^/DYn_<UT/H}bPspLyndZOVL@T RV f!d+<N`qL(DM9T/v^n^-WND;2PJJl6 :h` bQ 1BR0>XOv- ;|U\N@:4/)R] _ |D @n]T7t(;!Lli>9vGI+v.,*)'a a cMDnN@%d%<!IjdI) C}A2hW l|,k3?c@*z J,N x'@lH$9o-~"o Vi?DM  @`%g ]2t2 f&?NlH$;p%q V>r  u*K_]! (CSJ)p7"j,H\c<5feO1cw0Z hg,,GQG'n *f+Rh\4 "TVA(] =et#b" :WO$fj4Zl"d:2d`D+^ |6ek`"8VU9 Mp8g8xN# 8f T/x @v>j}.F1 $ta> Rx~Q%VBk:0&1RrS*v0h]&n#NlL+ ".:n T-p9^zS+d"Mr@6,":\}[&kUX"m%X|^@!,8CN|HWDnY2j(]_TH=2NjP\ BwNv5w:~]|Ld|xKDNxX]bfk E2o6\z\=J N zk\sL~3o @Xoxl?}B_(hjloqI6r6^vV6vA_2tauEw5t9Qh~re:~@\&uxz|O:u6[wX8r;Ixj\t$X FH^stf8 t8Tnrw|R@z6ZoP0i1D|pc{*] I@Ti~vgY.q5Ofkpv{M0i*Qx{_C'~FP"~oauH{4r <Sjtg<~AY"mprux@{-g.VdH,WW(vcQdv2d$dG`z~R'Tb'ghhhi4n"_-VfJ.We3zhVh{7i%d=XtY.\d(\^_`b-hZ.Yv\A j*i7xdP`p$UL0Kf_6m1|@jfb_[}TE#R{bJh(g5vaM^n~MW<Xt`6 h+r5~VTRPNrVP*VfN=w>{dL5J^s&Z`>Yt`4c&p4ccccc*dP$QgMk*f4r]HYj|MV:Xu`5 i.~C uojd^UHJurX? m0yElXgv(YS-JfW0h+~E ojfa\{PF N{}dKx6q?lXfuHAx:Xw]8u:Fojfa\~VDIwrZB i+r? n[kz#QDz?`h@s4F yvrolH4s;iwpX@v:T#~hu!M9q6Ro|wR-u>`)zriK1l+Wftn]LXr=irz2n$Z:Zy|~eF&`(v;yq :lSDVgx{l^O$j0Nrx~%`I<^gF$g3Gzm_v$YD :M`txj\M"l5_+wz}T>v(Jknrux\?"q?T(zl,]E 8L`u{l^P%j1Ty%\7l Ejpv{fJ/t>X.}.]2i)@Wnxk^Q'n3Z)+b<q!Dfkpty\> h4Q*.[3l.DYnwj^Q&n8f4&Z+_8]bfjoU: n;^6.\4m!6J_tgZNAm4b0S,b9\bhmsX< uEi=%R&^2I`wndZQ)yB p? N'\3W\bhmS9rA kB%S+d,@Uj`VMCJyDOT*MSZ`fO8  S{N"/[$Y !6LbYPG>wFPP T(LSZbiP8 ~PxO&$P| W0E[SLD<Q V#NEx6?HPYE2 SzP',U~Jv+BZTNGAJS$J{Dx<DMV^G0W#_6&MtDr(=SLD<5xHW' (XIz3:AHO;'zNc<(NuFq 4JD>82V'm?" O~ >o%-5=E2 ].yP&,Pt2_(>:63/d8 }M.?j"Q".;G8* sBZ08YGt98887nBU4 2\I|%4CRD5&|JZ-5YEr <>@BD( zM [8/ZAr/@PB4'Qb8 6WCp"?@@@A& xJZ:-U}6g .?PD8, ]-tH%Ds1`:;<=>&^3wR-&Ox2b"3E:.#`1~T):h"R38>CH.\/oM+ Dl$U},>4*!^2^4$@n#Nz!&*\3~\:,Rx%Rv,%f9 ^36PxBl"b<sS3 5Vv7^ ^4 sN9$ #9Ow<d iGdE%  2Pn1Tx sM'dL4 !6Kn$JofEnO0# 8Ur'Jnf=}XC.(hK/$ 'B^z*Lo|X4_L9&(nTJ?4*06=CZp7TqxX9p^K98643@N[h-Kbz{cK, k^RE8ACXl+Fa|kP6lXQJB;FQ\g"?TjzhU9rdUGJLORct:Vr}dK2xbMHB=8ER`m:RizfR7p]J889::Nbu6Rm~fL2mXPH@8BLV`z"@Vk|hT6oaRD69<@CVj~#@\xlR7}fOHB<5?JT^w7PhmZ>"{l\L=@BEHYj{7SolT=%~hRKD>7CO[g;Rhs`F+q`O>>>==N`q *HfzhO6nULB8/8AJSl,D\u}jM0r^J76432DUfx (FdwlT<pWL@5*29@H^t3NjwZ>!taN;9864CRbq7UknV?"gZNA4:?DJ_t-HdhI* |hS>:62.708BLV`w*BZqt`D' zk\MMLLLZgt:VjqX?& md[RINRV[p 'A[un\B( LISTBINFOISFT5GoldWave (C) Chris S. Craig, http://www.goldwave.comgajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/sounds/message1.wav000066400000000000000000001742461326020644600264600ustar00rootroot00000000000000RIFFWAVEfmt DXdata0 ",6BN[g[PD8WvlSx 7iAR/LC&DbaB r$KrT72iN 1V|8#Io fkV`idgG#r_3Fwj!|A4o.Dr6M |*--'"BvlQ.>Sh$G}F n:HUbp[F1=^H?^Ni wFRqGWG~$h)|>_v.g vJIHHGd!Z0z?A|5/~O473-V}dJ;P 1}`bdegR<'gfTB1pKfiY * zY8zCByx>^ONk|  [  t >/\JT !XLR"F  d j42L0Wt[Ce6ymHK|PbtlV@g D& })A@4SQ{F>Qc BVk }X4t&+RJz ~`X[ $1=i<;EvCzn?nh4\';ADHLOv8^ :t,p ,=750,Ry_D*TM{U0 $cpk ;WRNJEdN9$4Yblu~>"?e#bM06WI<. Z$ke JEA@!0>L:(.ZmhQ: "  ?v S{=Dv0gzdv>F#Ny`=>a$!{V2]J\n.cR>b B&2>{3"FHHz6%01223:BIPjPC=HS^i: L%"0B"\ ;o`k ,7BN p BzK X'#;a6rdL&UQNJFa8\D~zuK!4FXkBIh\3:4M|(-^/rY )Lo*\%6>ELTcr-COZfrcTD5\C}D/_[W$ESPUB\3tF.{{T.LkpU:4"X zF:.#HxH@hTmv4 ,#VdrT5(X|0yJ]"A_ `  x;d+;p"N/y wJ[S.h65f+w *8Gy T 2Jby2~fEsFn'(B:]@<71+mrT5Y~HTFz (2<EOJD>9+tE}B`)NQKE' Ex~cPF@3zU0 V7X0:lwZRJA90(f a4Sr]wsplh8p@k41EYm_<}@Re Yht>H4 n1Mhcvn$]N>.n8(C;3+#V>PW:Uph_WO~ s((r{5l@"DT[I >Sh>'JJ` f8QjzbJ2nR6#|\<taN\iv!URf%ch'j,2x~~n.n:+C:L |1*Ln$< >p0r-^4|uZWIk-fzN}~32|6[td1Dh_0&7Ieh-R 7cM8" E~*>\yL &VoYC-;HVdr-Ck.u6*hPu,CZqJ nKMHC>9 x<T"vR.$ &Kp/h!`+Y\`cf(p$7:\v"qNm(Lx&0uw4sU7?GOWr%Eh9[/NntI`rbC,R/BNA 1XY*;zR^ hBMoZF W>9Bj{HY RD$MIEA=B90(h Ti~<<Quvj7;>BF4H$+k}n \:Y  )]x8wW7  @:xI&jEx@ ^%b<^Zzj 5_a9,n$` ^<1^ T?_~"/<JJJJJ@6+!n9HJv[mW@&XxW6@JT}Na7\Wqvc*g`YRKDtV>%x"cBd|6dB  zh/W!*4n {nbUHrtfm{uoic'"D,D]xhG7'KnT;Zu4(A[gt(^L&tr`\XSO0RL{R*XT_".9DP>+,x\zh WTQfz4d^XRL~cV6Ncx~cH-cB vU4yncuEx`JEuP }M]XRMHRF}f *V}PCxS6zk^R2k@! 2G\[ZZY axb| 7Jxvtqo_P@0x RB3$>iqyW_qtwz|>HYnXB-6Vgx!0(_@xk^QD6)Wd ]HZ4TGDDFpjS<%:fb`p2stN)i<qP..\1m#` 20.-+M1e~-?LUkn)B`o&TjE 08,5 2x:74~ U1 6[n4pj@. `.}B c@:Uq9d 6_wZ1 n }(~[x$m'p%>VtJ>z"w!w#Fhfdb`@ RY~,gErGB! p@X+BX^elrz,XSD$c2d/yw 0LU;JZVQLH%XXT* #v 3nH!`~sC~tfWBj: ` ]PYF4"%n:~J<962/L$\/^7xzz z:5pKS6K|8FPwq C;Jzzzyy8Ln>7RDvX[^beF&G~jVBYp&6V-=M]2Of5:]*i<Y tJxZ;dTaq36Md|m)KGrw"v!R +IbzmX2 p9LXPHA9Uph(!PUV8=- 3j_q\"Y_B&b :To <TDc,7x -=.oP2!&-4 'p|O'K#BXs^Ma e4Xajt}kYG5DIJ>h<HU?j4$vPFpYB*Z2[\8,azk\,qg]UME="iceJ07YF2 |\:qK(aRKrlf}dL j7Q +b:&?$[o[ ;v)~ dir,`7AT7(y?Pu\D,7"7e~ysF,>Pc+5qclo.LrT7La<:]ft:8`'|H%w=p+v U,sP. 4Me>r.r?M\jxM"Qtrh;y4l_vH6#@*laIdX49p& a6V`BRukEchlpu(A:3OkBJd$x#fbCR ]z;X *",>QcL5Q/$n#/Lyu/ 27d%D`RSTVW2 F~u ?z_D( LZ(PifIHwC-Lj4R5]8M^(X,U~\L )2:>|obUH;.L0y|~Z0BsBbFxFQ Py;d;}(|)j W2M=[$Y/} sA+0n*2;DLOXo*1~6nH!<.tc `&)-04nc]W\afkl1 3GQjK+}CGVetOK~0lu#fvH{<Q}x7?d|Vf`^[XVTrXPB~n^RE8,$n/@h\OB6VwlaVK"R7zjo 4G8_dBp\vl4+~&P@h-F` Ab&QJzlGIKprQV\af7` djv{_$">[4LQJnB(feis.(e(Mr6k6=Rm8J!-8DP VL(j ]zRd?4)j+'X tDL<^cG*2UxOg%}[ZZYXi?d>\!X,_d9H)Z?sZB*Vrb4d>g'<e~3QJf7J]p o"L:1(x*bm(\8B}=Hi;Lz@G>,`vX:}V.gRD6(0G^tbZSE8*=^qZB9*Ip:d>||Rneh6HAq2Le~:|bcb`^]PCl`Np8{C[s6NgQc!"n!>|V1K&2wbo4{'~*,}_~ d5| 4\~gPv-pu7$u{`= =n8{+anm=R\$,3579;"<WtGB!B^$5GXK>0#A$GjhB!/\<3h,{Rdg15GYk~/jyL *Fb*hDjLB8-#nM;(]hov~&Jo>{T.;)sNL&3TU|^WZ]XR4{vrm&O"o rbRAl8W0BTgD Dj&fK0Svp%L%`rdMgTQ]c8y;^.2<Fa|N#[3b:(4zaN<*(8$9,%,D[rJyVrR1>%$S.Am{~8e{yV4?JVa'c(8j;[z*pV&]+_,iJ*1a]0xPqM k-SrH xh `iM15SqCZ%c6gP9" ":QhG|2H_v\B(9@Q@VNA-WnJ%irX> l5xkj2xCp],X eqR3pf>?Sh|^-*(%"8C@=:7<#6CP\i RA~c_ZVR8@b`<*n9OAdK%\z9$ 8bHsP [PeD"5+BHM}8.(y|GN#kCejU}xtoj4B|5,&Ja2*#" ,:GUPqF,zgTGwl8l60*#|;*E8*3+ydV8hhijjBZ#\\\[[w:_pvg: X+R v#h8FS`n43JZGt,b/\IL6qo2uL95,Szh |>&wRZNXNS"+3<DW<w6WxyiY@ jG$q2 8d$-$wW6m[b=(z5BN[hr{T"@^djpv\A;&i(Z)hV_k/3HFtNCDPeE%&(*+Fb}->PaVLB7yX82,%BdZ D~|[ k\Pk[L<,i! 1DN|7D6w+3~D @w? -eQ['S~6r_M&t8GGNT[bF$kV'I^CT>v2pl+DPteVG826d5| d2_R&rT6ns |)?gT d2nLN2xqL#_4.(#p6HC$Jq 0?N\k^RE8" ,V &A6,"McO $L^-:4J{6(]b.#^pd f6 ,CQ C{6>^~mG!N>wb$0Hngv<\{"r `<aK*S|c@|\tY\:F25dCv8> JDy"N @% l0*[QyaL7dhknr:9.Ns|G~"DflS4!?`Y!r1lK)6CP]#ex(|%JnxY9o &)Ct tCDE&@5ChFV6>3V.~q^t62auV@%>2kgc/Q6/b8VtnJ%dpg.vj^RvNN~z^B& 4OcxtU6]3X&vfMKJHFv1Jc'L6XDZfi(exVQLZ"l0zP v2CuE|b2;lc.a.o~2\.l $L3_Cqi4(Y`'|Q7A Nha `,)]6p@p|X6nzk$N.:gG'8HYjIEkbA! #6>FOWL@4) nM, /dD2bzKtlToqsuw WgN4| RH>5+hdL3G&>U>(1wC)vT2jb&nW^v)Vt 4DD5|d-?u 4h/qg]dka^" \:l5(XA H)JB:1){T.  tcRW\bg>oDTcrgL1Sv)e*M|BsJJ`NMKGporvy|=,Y ]s(1@BLK3C;Py_E?9z=DDA`~DTZ0fP!eL`j>e#>Pa c#8ln;JZ-)x6oqKVrzS-,tM{5" *Ln9}C/6<CJ.f>y{~ @b ,  vHB\F0%EekliF]tuF"[jz$v D5%(=0gzh`Axu 4& PL)obB"(/6<v dj_$#d ` a ~B;4.'Ffy7]D~XjWv*tsFU:*%b"VtroGLyr z(Z;F( !=|9 S1FZn]L:)~P"z`_^]\m~*Jj i0Q{`FUds,e aK*NrX># bMo@[6>fiDNX.%FfR21]zwW7[';O7Q@->V(D f F~({%+}&2Yth)V`'[0EMJ<.XbtcLGk$1bF_.XoV8Tpvk`:f6\K:(!*4>Xr #  ,<KZjypGpB$LT*r v43uctCWj~lXC.d ~d\TEa~ ^'AFFdDhe?6.~DhB?MF(ZiF$,WJ=Xs@4bGI,QtqNV5gl R(|&z:z|Hn1[-)Jl.D[qxzpf\RG<0%  n]KIGECR`n}>i)LT\dlO2x8k$yF(TRVp,kt|S:l&Gg V0 ~H33333Bk^VR2R2H^HwXjM2>\jx\$Cbbb0teVF7(D1-8|;V`YR2ITcN+}T8BgS dl48_1OmscQ?-~zu>]})Z-t7yk]OA`A]7x /ARHq&tfXK!pjT9Y^c _D?0+. i".:FR z2>KJI40v<=CL&|&*.26\(<@C[: |_D-+p~>X*aYH02'Xf;j$]Hv(T}aE) 2F[piH(uN(Bs#bKI,/` 't Z$?4TsiD iBb=lP4@g{@-z>i&?HmP4@opB:1DN=R*w_F.Fu6Z7gav\0F"Zn+&M)rrBx8x1]1 6`LrtX="} *6BN[htlXC/tS2 "Eh$X5RoysFw.YjF! ,effa 7bSD4%H>}(*o~BA|?5ht$4SsLQ4J_us;"^(U,*Jjh>BFKO0g0~@hd`\X~4wJ-`e24>i5:pbz4:rkd]V\>}Z"y}Q^)V&[}tj&[5v]${ bl5G1aVJ?4{=,{%yN";v>,v Tz^)h"b&jrz+dAr3,$}W1 vdR?=;97FVet0=JVcdfghfc`^YTOJD=60(~xz|~:ZyiBtJ+ N+f3^\9N ?pB<5.(NtL*yN\ o z'b(0_66:u&,27= {#snL&Y545j dx)2~L>jLdN|pK%d$p46h7m"#$%& xT1 mT<60+%4BP_x':L^qv|}xtld[SH>3(0DXk}[8gO6':dBs5>HR[B*a/L"zl=t2u%\y[S x/J=0"4RpW2}@|?p 2H4 7VuA%t<wq3x0Z!ubP>+D^wE R1dsr[D~A\. 8c+_ !iDrQD8,)2 hs~EQ9VtP ~<z=lOXbkt8zA9Vt~Mz9LuF1f:Vqh^TK#t? xJ&Fe 3X~lK*lZHFDCAQ`p(?N]l{|}~xpibWLA6* "/<IRZclpsvzrjc[J8'ng`ZS\dlu+F`zlG"mI34OjCn210/.RW%6h4h2SUXZ\=u@ a)#Z5j;]]\\\<r=j6"U#X @BCDF* uFP19d=hdAydO:9865EVfv+FXj{vjYH6% "(.02579;=?@@AB<61+!*>Rdvu\B)t^G>6-$0bA @b#Mt 0&p? U*8`"V(>SH<1&OT%"JrFu,AVLB9/^+l@>`"Lv$ jBaJ4!:Sl>^~sZ@' xd_ZUPZclv/@Rdmv~wlbWH8) ):FS`lrx}}{m_QC0vgb]XS_kw:VloU;|^@0! &Ff Hk  yJjA2St%Q~ "<962/xF~M4VAp"><:97T"h: *Gt*Y $"! Z0ZC,,AVy-SydB!vbMIEA=IT`l1DXk~~o`QB.!,8DJPV\[ZZYTPLG?80( /BQ`ps`L8j`VMCIPV\o:Xv{W4]I5! +D\u)Lp|R'~S:! $;R{Hr  ^5 hO6 "7Ms 5^fF&fK0)"#2BQq7YolU>!nd[RHOV^ez-@Sfq|th[G3 ~ ,<MWblvvvwwmdZPA2#(<OZfr}~~~vne\L=. yoe[agms2G\p~l[?#ziXH7:Hd;Sk~jW;teVHKNRUhz 6Mdp|tjVB.~ytpkt| -<L\enxti^R>*(;N`ju~paRD2 |xsnv~$;L\l}zhVE*ymaUIOTZ`t0Ib{uX:p^L97531BRct0PpwZ<mU=70*$1>JWu.Mf~x`H(x]QF:.6>FNf~ '@YrxeH+sdTDDEFFWhz,GbulT;"yd^YTNW`ir&;Pf{tbQ9 ymlllku+DVi||r`N;)wnprtv0F]iv|siXF5$zqh`W^fmt5Kaw{jZB*xhXWVVUbp}"=XmlR9 r]UNF>HR]g<Ri}hS6o`RC47:>AVl.Jf|_B%|hUA@?>=M\l|:Ugzs\D,rjb[SY`fl~4KbxtdT>(}omjhfp{5H\or`N;&vjjihhv&=Sbr|r_L8%xof^U\cjq &<Rg}n]B& xiZJJJIIZj{3NiztY>$zeOJE@;GR^j9QjybJ-ui\PDHKNRex)D^xpV; ubPMJGDQ^ly3ObvvdR?% ~rg\PUZ^cu "7Lanz{pZD.ojfa\fpz+?Th|~l[I0tgZ\]^`n|*C\niP8 xd^WPJRZbj~*BZs~jV;zl_RSTUVfv.Hctw`H1|ic^XRZbks/E[qq^J2rdVWXYZix.Harv`I2mga[U^fnw*=PdwrbQ:" }pddeffs/EVhzlWB-tld]U[bhn1H`x~lZ@& tfWVVVUds-Hbrs^H2~jc\VOYblv2G\qoZF,|rh]_bdfv3Jao|thR<%tqnlit~ 5DTdsyzueUE5 ~ .AS]gq{zzzyoe[QB2"{ />M\cjpwusqof\RI8&~} .=LZipw~{vq`P@/~wz~ .ATanz~reYD/usqomw #9J[l}kXD0|sjbfkpt-BWlxn]L6xkkjjjx(>Ucrzm`L8%~zvs|+:JZipw~|wrdVI;(%5BO\imptxrle_QD6(&8JU`lwvtrqh_VM>/ #4DTemv~|xj\OA,srrrq~ "7M]l|{pZD/qkf`Zclt}.DZo{hTA(}rh]RX^ci{0F\s~vgX@'~pbbbaao~'>VdrujVC0|yvrox,=N`jt~~paRD0 #4@LYehlpsmga[N@3&,;FPZehknqjd]VG8) .?PZepzyxvuj_TI9) zu}3EVhz{tdTD4 zodfhjl|*@Vmyzm_H0{jYYYYYgv #:Rbr|fO8"|id_ZU`ju 8J]pp]J7 vmdinty&:M`jtreXJ6# ,8ER^bfkokhd`VK@6&#3=GQ[^`cfb^YUJ>2'$4DMV^gjmpsmga[L<, }w}#5HZlu~tdSC-uhijjkx,D\l|qcL4xgda^[ht6O_n~|s_L8$ vqlgbkt~*<M^px}l\L;&{~"4FR^iuvwxyndZO>- !-8DPTX]a^ZWTJ@7-  #.9DOSVZ^ZWTPG>4++5?ISW\`da^[XL@3'$4DP]jvxyz|sj`WE2 ~zvrnx&<M^n}ubN;(~xrmgov~':L^qyp_N=&zqglpty':NbmxxiZL6twz|"4FR^kwxyz{pdXM;* '2>ITVY\^YTNI>4)#-27<ABBBC>:61*"  #+3;>BFIFDA>6-$ $1:DNWZ\^aZTNG9+ +9GUcipv|vqlfVF7'zrw|(;N`s{|l[J:" ypfjotx,@Tit~zj[L5zpruxz%8KXerzncXD/(8CNZegjlnf_XPA2#(3>CHLQOLJH@81)   (-26;<<=>;852,% ,4<DLPTW[WTPLA6*"4EVhpx~{kZJ:$ zpfjotx,AVkwscS: xk^_`abr2Kdtp`H0ufdb`^kx #<Uev|n`J4}{xvt(<HUbnpsvxph_WH:, (2=BFKPNLJHA:3,$  ")-159:<>?=;970( ,8ER^adhkd\TM@2%&8J[mu|~zk\N?*}pcfilo,AVlwteV>% tgY\^`ct #:Qhv|m^F.p`````n}*BYgv|obL6 zzzyy!4BP_mpsvypg^UF7( &0:?DHMLJHG@:4-" &.6=@BDGD@=:3,$ *6BNZ_dhmhb]XJ=0"| !3EWirz~pbSE0zl^adhk|*AXo{{k[B)sdUWXZ\m~ 8PhvrcJ0rdeffgu%<R_lzti]I5! 0<HUacfhjc\TM@2$  !+048=;:862-($ %+17=>@AB>;84*  &4BOW^fnljhfZNA5"|~ 6Kan{tdU=&|n```__o~6OhxrbH.xiZ[\\]l{0JdtvfL2}n`````o~'?Wgw}oaJ4%7CO[gjlnqh`XO@2$ &/7:<?B?<:70(!  !#&(*+,-.+(%" $0=ELT\\\[[RJA8* $7JWdq~~rg\H3 oljher~ 8Pbs~r[D,ta^ZVS`n{ ;Vhyu_H2xeb`]Zgt/FVfw{q\H3~{xvs|2BRcsx|}tlcQ?- &2=ILPTWRNJE<2(    %,4;BBCDD>70*  .;HUbfjnrkd^WG8(~x 7HYj{xp^L:(yrjbjr{3G[op\H3xphaYajrz4H\plXE2}vnfmt{-?QcuzzrjYH6% '4@LPUZ^YTNI>4)  !$'&&%$!   &,.035420/(! "/<JQX`geca_TJ@5$ 4I^ju{m_Q9" yl`behj{ $<Tkz~n]B' reWY\^`q ";Tlzo^D*}pcdfghw-DZhvsfXC.~~~}} 3FQ\fqpppodZPE6' "(/6<<<;;72.*$  !$$%&&$"  %19BJRSTVWPIB;.! -?KXdpsvy|sjbYH6${wtplw0FVfvzpZC,~mjhfcnz0HYj{~s\F/uspnlv(>N^ozoeP<(!4AN[hjlmof\RI;,$,4;<=>?:61,$    (16:?DB@?=6.'  "1@NV]dljhecWJ>2 ~0CVhqz~zjYH8! |sjpv{%9Nbvn[H4|unfnv},?RexwcP<(~yt| 1@N]lptw{rjbYG6$,4=FNNOPPG>6-!"$&'"   "+049><:86.& #0<IVZ^cgb\VQB3$ 4IVcp}~~th\P<(uttts0F\jx}n_P8! |qsvxz$9Nbmx}l\L;%y~#3CScintzslf_P@1" (1:DMNOPQJC<5*  !$(+(&$!    "*135794.(#$1?HR[dcb`_RF:-+:IXgnu|}vpjXF5# |xsnx+AQbr|qfP:%pnmljw)@XfttfW@*stuvw0DYdp{|xj[L>*!0>LQV\a\XTOB5( #)06<:986.'  $'*.1.,*'  %3<FOXXYZZQH?6&$6HZclv|xurbSD4 wnty~(;Nbu}|iVC0xrlenw 7HZk|vnZG4 }xtoy,AN\jwz|xncYG5#(9CNXbba``VMD:,  (+.2520-*$   "',,,,,&!,8CNRVY]VPJC4& 0CP^kxyz{|peZN9$vwxyz 3H\huzj[K4|rhlptx)>ShtubP>& yqw| !3FXjqxxpiXF5$*6CP\^`bdZQH>0!!+/26:8631)!   "()*+,($!  *4?EJPVSPMJ?4) -;IWeinrvnf_WF4#~{ 5KYgu|pdWA+~qrrrs2I_lxwhXH0{rvz}-BVjrz~xq_N<*,:GTbehlog`XP@0! -5<DLKJJIA80( "(((''"  "$%'# %,3:<>@B=82-" !.<IPX_fc`\YL>1$ 3CScsw|{ri`M:'}yuq{6O^n}th[F0sqomkx,BYfsxj\N8" svxz}&9L^fnw{vrn`QB4! +8ERVZ^b\VPJ=0$  "(-287665.("    "&*-+*(&  &3;CKSRRRQH@7. %6HYbjr{wsok\N@1x}+=N`ryxq^L9&}wqkt}$;L\l}|riUA-|zwtr}0ER^kxyz|}rg\Q>,"1@HQZb`_^\RH=3#"+47:<?;73/&     "# $,5>BEHLGB=8, -=HS^iklnpf[PF3 !6J_jup_N>(|svz~.BVjs|ziXF5xpw~'9J\ntzxpiWF4" .:GT`bdgiaYQI:,(.5<BA@?>6.'     %07>ELJHFD:/$ '4BO\`ejnhaZTE6'*=JXfsvy|uj`VB.~}||{,AVbnzvhZL6! twz}#4FW`ir{xurobTG:& &2>JNSX\XTOK?3' %*0666772-(#     $'%#!  #.5<DKJJIH@7.& )8GV]djqlgb]N@2# 3DTev|zpgS?+~zvs}3JXgv}pdXD0{{zzz(<P]jv~paRD/"1@OU\bhd_ZVI<.! (08@ABBC<4-&  !"""#   #! $-58<@C@<85*  +:DNWabbbcYND:)"3DT]fpyvtqn`QB4 |*;L\msy~vngTB0|(<IVcprstvlbYO>, !0>FNV^\ZYWMB8.$-58;>A=840'  !#%'$   "&%$"!   *06<BA@>=5.&%0;FQTWZ]WRLF8* .@LXcoopppeZPE3  0CU_hr|yvro`RD5! $3BQ`flqwqjd^N>. 0;FQ\^_`bYPG>/ &16:?DB@=;2*! #&*.,*'%!')*,.*&!   )2:=@CFA<83($1?GNV^\ZYWLB7, &5DTchmrwph`YI:*%8FTaortwzpf\R@. %7IR\fonlkj^RF:($1>LQV\a\VQL@3& $+29@@@??82+$ !&&&&&"   "$'%"  $.38=B@=:8.$ .7@JSTUVWOF>6( ,;KS\dljgdbUH</ .>M\bipvpkf`P@0 "3>JVacfhjbZRJ:* *8@HOWVUTSI@6, $,469<>:61-$  $&()+&" !%%$$$ %*/4988870)"*5@KNRUXRLE?3' *:DMV```aaXOF=- ,<LT]fnlifdXL?3! -:GTY^bgb\WRE8* "1:BJSSSSSKC;3&  *48<@D@<84,$ LISTBINFOISFT5GoldWave (C) Chris S. Craig, http://www.goldwave.comgajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/sounds/message2.wav000066400000000000000000001222661326020644600264540ustar00rootroot00000000000000RIFFWAVEfmt DXdata@ wP*Cu,z  /DZpxI@fP' z-oY%>YZZ[\fE$a`IH 9RjrzBh82L < o b#2h1H_ cx)c!X e Sj")0BydP^lllll* e   2 ;|X%MwU2F Y l  1 N ks{aBtn_ &?U! 0 t r ^ 3lH#u`9ao*0m 0 U z ?   \ "'$ fO h0i   R s3zS@. W@z@[ aN<60*$ TIjP6P$apb / D Yn"a( P y $(a<R4,8E C 3nY9 ~"k8G(KG;h k?j b /n J$t9^"y&XEE P \]I4 H2]6>a0d0Je F 6 crT7Z' ' ~8\ C jn v \ G 2|MO [.>T Bw3 N h<lF W`16g?{T  $x Z.b.]+B*  F x l - NQ2,s>2Rexy = !@ < & ]8(LqBo W Dh L  6 K Z#j ?]H{hVC+xM" 9 1j]-br%j8 # 2Vyi4 ^(>N{rD |T, O 0F$`@r y.h6>  "TX ( z-6k(j,oBP^l z h UB0Jc < 'nx6pp20X$ 1 D lY:$Inu4{Z8 + #  <m 8 ^ s.\b7eV  * 4r 3w2Kd}2BfK0p {T ; ".vDP|=w%d  < Y3|na T F R ^jvR'^2i(f4!b R N  r> ^<~JNRUY? <m5 b S`gn v } p cVIc5{gX>VeJ / #  P % * wA d(wG\p(p< E '=AD H L [ jx;V@:w+b*q . 8 C NXX{ j zXMB7,vwS/^*?~< " s"8M b x {J'd@r2RZ'{$    (:\ .Zy${bH.Fv7~ S  $s F >]{? m6Z   $ (-|A 6 ,G4"TrT7OgUN ^4e 0Cp*S|rCpJ%Il/t\ C 2!Lx *WK  (S 2 p3Tv,hr/Kfb^[W /  | @  x 2{0r\G"Dt\ D  E Z  g>@iv>N, D w W # 0<HU?*Ft]F0n( < u S ;jL..Li|vp Z` * f  kT<$DnDf6Dy8 p ,M  y , hAIPX`ir{ Nh?O`p \  V gxr^J2Xj?_1Qrn* T  n P 3 Zt\yC":Natyrj F  uTH=nuJ k& 6`E w / W O G 2  "Dg4e * #  z^o2V%1Om. o 0 q f \ H 4$.V~96 ( y 'K.M818E = i 3 z = N _ ;  .BVK@6+LnS0 . [ .I;-cM@l 9Nte$ [ . _  !rW=WqnR6LbwVzp h > q 2_sg[,ypRdfvp; d . + ^ f noppqm$Xzqhd`\X V ( g >k zZ6ne7Og~Nu H  ` 7 k  Fq_M;)7DR` H  Z bixD6^? o4  d  g  9#@]z^$. Q N  G *vfVF6Zd 3[> G o  x&8J[mv~b6 $~tQ . =  : p 9|}~,4GIKjW w m 5 G  yc0q> '0  V &  > y 4s3l\M8$ e b ` ^ [ 4 t ,  (2Hr> P\ X C D  k w*0i5rVY' 1 ; E O )  { @  !A`?}Nb&M9 '  $ p  z:AGNU64o> }\jH& % $ " !  O  &Gi}*O}fP}xtr q p n  r ( CLV`il,bZGd/ { W 2  NU L9a^\YVB - 2 8 I  v2~Hz6:dlNYj z x l K *  X2Vmb#c4PE W  V ? >b"H h\B( x:  , < > ? @ B 7 , dOrCN;HlRj  ) 4 1 < T 8c<Dr6i!^&~=y    + 7. <>.r,XftY="| : {   N Gk5OnHs>N6V v " - 8 C Nx-V-8vagZN > > v  Z ZK j+Hd^L F t  7 W w F+az$y"L! ~kjh  { , s  v 20sZ,;IVdrdx@ 2 d  B f iG1e&Ad$ d,27 n + 0 F,l`,8DQ[eoy4d#` & d  N U5*V3K=B[R*pL' S  n  V(pPAHPX__```hpy,+c Y  < v  S 7+R J[UUZJ%W/@ ] ( j ' ]0r8D~zvmdZQbH6h M  N Tb Vb;% VPMo\ ' T j?6expi%gq9 | ( } % w  X-ZT#v2|c)6D X % nS?],(#xV4DTP Q g  d  /Z7b^/8x*o$ l J '  u0IbL5}X35\WF u 2 Q  3T6MMLLV B>x V 4  TrqeXL@jC R M n 1 H 6mhR~v8@!\vfls\D ,  nO"Q"Ttl<z  T * TC|UZZ0\hdB 1~*yGMd\.e  P 8 w"(7TpnN D-zB WX^0s;  ~  n"?xT=\2Rr&N^V { w t p l e^H#w\B(`|+9UN8x{ }  ! h*=4jTB=JVcp%pS 6 ; @ D I h Vx ~8c:4Kn,y@ 4 A f `-B{=~ =>@BCXnO0   . d C~\:o~M3~:^ CV i Q |~@X &@1"zgVD  & E z U b=H(< Tej3x( M ^  B=[,CyjZ4| h f . +($!'-l (QPONM$f! A y B NSUW6`vk@ . \N8 | L  N|[>_wne\2^ vP I - s76rG|@tn.rT X ,  !1Am>-PsC(y=%) r *  xGDb_.4;8N%.}z' f I ,  %:NcL6}DbTj/6>FM<  zU0 v&{h6G8C $  Fq#:r D_&h&)-  x[>!ZWuJVS c$    /albM&7h WSZK | %}bGfV': [8;2l*    (WhZ2Ol>Q-be*F a wZ=+zO$W(^|t"y^{B  "Xr"++AXnS"Z&TI#; l  ,{TBr`N;)SAV1pTc _oh0X"Hn{:JZjzX5 {OJr8'Pxs\E$nFRSj2\ x=-RxI.A2# pe T)h(LpX'E0r6s\U] ".:Rx "8Od{Fs.xKMcy].=|8xn@RdwNh#SX\af~1,D\%hu&l.#Cm>?XDx-n~N2TvB Bcyp%h?<852m2H]spl9j0#p\ ;i FX1 $EfF' y;>T 0t#0;F 6T0 d t&+G+B& zFd l+ $Z*:'oO0; ` "FplA|,6@1"h4>HR\W0r$q2 mK(YRD6)^ D~V3.)&# Y\`dg1eEvChi)iCd"bSD5&aHplAP#,4<Emw,X8I1Ur/nN- {U.vcP=*a 2[dD$E.UTRPO @p J 1=JVb+zb?eA_sZAbDvQ,"bv 4H\oP^yJn$4exn]oZ:F}tT4SrxB(o|}V.  -:l]%Mu>~{'}tU;"2t|SUWTRPMy{!tpmuNG@819ApR8Vt$`bdfhzrX>teVHFDB@]zxY;GQcjotzvm @:Zy[X^chn.jJ-^J5& Iq~cH,H^wd$)@P`p,29@GN$GrN)!(HgkP4v0Dg0$9+?DJPUL.MHvP6,D/LcQZL 4$+3< 0 :jWT/&^"n$`J4 d ^  x#, '6E6' 7dz4 n2p> s*g[NB66788dHJ$.9DOZeUE6&UK fpkQ>,]~ulcZ0 M}xtpg 5@K`v~m\XPwPbtr`MGA+n@JRY`htS>RftiLT%@[vn\K<-(rR ?tmf_X^dkq2u+S{eJa7ESaoXB+@&>1$ &A@@?>DINTH{Du;9(nQ&,2% zq-C rcTD5BN:& VL \ MzG)eJ 1)nS8^ .@]u]YU: dNjU$).3X~hFz9 wlb'$7FTcr&eJ0i,/nZb3<FPYHhmb2_WC/H^ b({p;c, $WlN0-N 4>Ir!28\(ob$f.KFr Y4gZs"4F^vX:l!EtI?k.y3\ 0XDLSUVXZNAe<Qv$e _{#x"g)j,,uU<MhH(wNM{jXk@T=aQH'q`O G'{%wKF`%q\F0( O~F|0/lMd0$F0]<TK*0E&]*NR-VF6& >x#XJV!d? j3En#B8*`jw,Mv:y0m>1$ #\D%P_t@j+]=WDt(G/YpN`  qA8.$"c&cp/\q:p 2aJVV>JC^xFl'l:,](a (RhMsLv.S-iJV/Vz ]T y@g~ YERF9$CW n!]6PZ]<w g0*Ot\C@ qam [VX[D,U]G_i+dd*fX:FW#>ZvAenVKzbP; |_B%vi TaXt9pwBi bJr!~-Hb| :KTh62dV dS.CvY6@6'FF~X)oYnuCZ k3 AB0:mnnop\\q"zZivD>3,S\0\`2!^w&@/wg zBHNTZPb6Rw:{5pf~  D}T,ZZ2= t:V*6yL~L*:JZ g|IY>}SXk~9wR,fqP^*R:z\HZ(2;DFa> k)08N'XJVbM)Op]pGt\}S'^&!:dR(DXkE D|3/I.>z. 4VP$lKR r2"Di#[z6l`@voDM|(!5bvr0p-`d94?BDFI<2QErh-pnT!4rI!NzB*57<}*llXFijfa\X8|u]{a(qxnTVtzMp? pdtc~la_:|pd4zxu$zB^zx>Yu}r{$[z?y GvgXJKx~ \xBV-HdQ"Z!"A gA o m,k^QD7M iPmyD!>\zKS~ &?yMw}nX cXL@5I}hTS ":Qi64awt$T$j/ pV J@7.$7nxl6y2 1.H,\x C}P$/>~T+h!p*p0K] Bzc^Xj;8|!%X[,-.lT4R ~;DXll:p q=0#K=T7GXs:TC:1=T0Ne|(++YPf(/b _r8PG2zh(q "h*Qx 8$ JxJ `" 6y m}|feO" Q9" F&6NJ`uh\Ob .>b 54Q)Gd_H"M6> 3KJ`seXMm .;Hj1:[38aEG3 uN7  L+8Lhh"bcL;0R 1D f*FRtJ$<`>5 l B5( jLWfym" LG6(H "8M=Vb#_6 :P*&|U@/[ DYp5RD&F  4IyB`n#R*0W2$n@{- T>Xp6_T9 |'|4t@]c&g@(GZ/$pC{"P@XpM 8vZ- {`j*t 8Xk4tP,9U_-b6p @,Ce'` Gd7vj vD"QpR}V0 ":Slg.X+_t)*YHr*" JtN(s Th>(_e `9,F`{$x>H4fe#3[L>82,&` q8 ~_Db7(`bb>6Rm+|8 x:0c^*b6m(YOD:0f n9 uK0}W/~%b%vwP(@Xq'v2 z3 T^8n 8g&e[RH>r j&^9*{a8.k.(`;Nbu"n$^ R\,hB};uj`UJyf#V)xga<?FBf9K^p^~TyLe%B}M>vh[N@q`wFfZwfDC SFj>N^m}\ tAjB|g*H{MCzl_RDt`uL#nQjvU5M+WEY)h]RF;nbt? ZKikMR*VAe:NatcR g8rj/S#XHtfYL>mT d>fUtvX`7`?\0CVi|^zKq ?ue*R/dQwi[M?lNd7 ^XwrQR*WEc6HYj| PnEd4l_$S<nXq`N=kR g@gSmzZ9N-[Di?O_o`t=V+fm4`9fLuj^SHvY f1L?_dFU2_YZhvPZ$L*hh,W<lVzm`R bh2L?[vqR4L>~%s]iuZ^{6L[$X?{7vcYV 6<]~hM1Q>w$,} ^Zw5:qrtvwDRL-HvSC kp1PpybL6bX;0lvLLj"~3osw{Nd ZRf{h@J@{9*p[q x.\uj_W8*{D O\r.uIXgv`:HF2MxZL{*1^}pcV_P:~E OZr1r6H[n\8RWNMQ`^/DYn_<UT/H}bPspLyndZOVL@T RV f!d+<N`qL(DM9T/v^n^-WND;2PJJl6 :h` bQ 1BR0>XOv- ;|U\N@:4/)R] _ |D @n]T7t(;!Lli>9vGI+v.,*)'a a cMDnN@%d%<!IjdI) C}A2hW l|,k3?c@*z J,N x'@lH$9o-~"o Vi?DM  @`%g ]2t2 f&?NlH$;p%q V>r  u*K_]! (CSJ)p7"j,H\c<5feO1cw0Z hg,,GQG'n *f+Rh\4 "TVA(] =et#b" :WO$fj4Zl"d:2d`D+^ |6ek`"8VU9 Mp8g8xN# 8f T/x @v>j}.F1 $ta> Rx~Q%VBk:0&1RrS*v0h]&n#NlL+ ".:n T-p9^zS+d"Mr@6,":\}[&kUX"m%X|^@!,8CN|HWDnY2j(]_TH=2NjP\ BwNv5w:~]|Ld|xKDNxX]bfk E2o6\z\=J N zk\sL~3o @Xoxl?}B_(hjloqI6r6^vV6vA_2tauEw5t9Qh~re:~@\&uxz|O:u6[wX8r;Ixj\t$X FH^stf8 t8Tnrw|R@z6ZoP0i1D|pc{*] I@Ti~vgY.q5Ofkpv{M0i*Qx{_C'~FP"~oauH{4r <Sjtg<~AY"mprux@{-g.VdH,WW(vcQdv2d$dG`z~R'Tb'ghhhi4n"_-VfJ.We3zhVh{7i%d=XtY.\d(\^_`b-hZ.Yv\A j*i7xdP`p$UL0Kf_6m1|@jfb_[}TE#R{bJh(g5vaM^n~MW<Xt`6 h+r5~VTRPNrVP*VfN=w>{dL5J^s&Z`>Yt`4c&p4ccccc*dP$QgMk*f4r]HYj|MV:Xu`5 i.~C uojd^UHJurX? m0yElXgv(YS-JfW0h+~E ojfa\{PF N{}dKx6q?lXfuHAx:Xw]8u:Fojfa\~VDIwrZB i+r? n[kz#QDz?`h@s4F yvrolH4s;iwpX@v:T#~hu!M9q6Ro|wR-u>`)zriK1l+Wftn]LXr=irz2n$Z:Zy|~eF&`(v;yq :lSDVgx{l^O$j0Nrx~%`I<^gF$g3Gzm_v$YD :M`txj\M"l5_+wz}T>v(Jknrux\?"q?T(zl,]E 8L`u{l^P%j1Ty%\7l Ejpv{fJ/t>X.}.]2i)@Wnxk^Q'n3Z)+b<q!Dfkpty\> h4Q*.[3l.DYnwj^Q&n8f4&Z+_8]bfjoU: n;^6.\4m!6J_tgZNAm4b0S,b9\bhmsX< uEi=%R&^2I`wndZQ)yB p? N'\3W\bhmS9rA kB%S+d,@Uj`VMCJyDOT*MSZ`fO8  S{N"/[$Y !6LbYPG>wFPP T(LSZbiP8 ~PxO&$P| W0E[SLD<Q V#NEx6?HPYE2 SzP',U~Jv+BZTNGAJS$J{Dx<DMV^G0W#_6&MtDr(=SLD<5xHW' (XIz3:AHO;'zNc<(NuFq 4JD>82V'm?" O~ >o%-5=E2 ].yP&,Pt2_(>:63/d8 }M.?j"Q".;G8* sBZ08YGt98887nBU4 2\I|%4CRD5&|JZ-5YEr <>@BD( zM [8/ZAr/@PB4'Qb8 6WCp"?@@@A& xJZ:-U}6g .?PD8, ]-tH%Ds1`:;<=>&^3wR-&Ox2b"3E:.#`1~T):h"R38>CH.\/oM+ Dl$U},>4*!^2^4$@n#Nz!&*\3~\:,Rx%Rv,%f9 ^36PxBl"b<sS3 5Vv7^ ^4 sN9$ #9Ow<d iGdE%  2Pn1Tx sM'dL4 !6Kn$JofEnO0# 8Ur'Jnf=}XC.(hK/$ 'B^z*Lo|X4_L9&(nTJ?4*06=CZp7TqxX9p^K98643@N[h-Kbz{cK, k^RE8ACXl+Fa|kP6lXQJB;FQ\g"?TjzhU9rdUGJLORct:Vr}dK2xbMHB=8ER`m:RizfR7p]J889::Nbu6Rm~fL2mXPH@8BLV`z"@Vk|hT6oaRD69<@CVj~#@\xlR7}fOHB<5?JT^w7PhmZ>"{l\L=@BEHYj{7SolT=%~hRKD>7CO[g;Rhs`F+q`O>>>==N`q *HfzhO6nULB8/8AJSl,D\u}jM0r^J76432DUfx (FdwlT<pWL@5*29@H^t3NjwZ>!taN;9864CRbq7UknV?"gZNA4:?DJ_t-HdhI* |hS>:62.708BLV`w*BZqt`D' zk\MMLLLZgt:VjqX?& md[RINRV[p 'A[un\B( LISTBINFOISFT5GoldWave (C) Chris S. Craig, http://www.goldwave.comgajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/sounds/sent.wav000066400000000000000000001665361326020644600257270ustar00rootroot00000000000000RIFFVWAVEfmt DXdata  $530.,uj^SH\p2Kd>VP7]4 \VsoB"0=JXp`5 J uI*;Gx|Y10V>4#Ito8j!Df qao: !*4i>H|zd_[]^`bM:&6RmN\8 `qudD2  #0*~zvF8Z|Z>vI;XXXXX"e@ 6s2v<ZxU2r~PM]XK*a=S@-ff-6?HQ2Nr[q  86{,d:tll`4\JR}IJLMNU\.%J9vmd/ c  ?HPXa$kwhsr.]N6ilptw :8 rv{L(t-swz~5Qx]@f ; f F^<dO2.Bd\N>|_BW(O347klllm @ w L ! v rSc0iI6"sFP[fp7?8b(]3;BJRdv_$ G j R : N b w  h < Ok"$%&(oRt08@-HG<~\:2Nj(la'~E  f u L # HT$W~'Zn8P3p3Lf:6DG[i {4Ec3QZ}[ 2 X  & s  \X:rI@&oE%l?.IdBJOU$-fhwL!~6 M z  p  Tri82:!h=l_RTV >T@`KS~4H$6  5 V $ 3 &Z>?gTXlp Gw@ V2\`c,5F4vE*@ W  O M L J H t .H0<x-sGt_'41FZNj.g9HH\"7G  T o P 0  9 b|/Dp(D*Xz sIJ,"7|>7o e.p V 3 A N \ j  j  f:Z(XB*w)F b 4 E ]-xiQ`dM(7, `}Y5d*V\pZ  # ? 6 . &  1 ceY?(b<c(Q e^, (6Dcf PPhd,.j KX3 Z ' e4d8 8d.fid^u'/ |EMU&xX8<_|  {  Y ( to[7U#A_}0ZK$EZ $0\*6ALT LJM @j_T. 6 f f F  -\B-Gg*`uZ`j|h4y/>&`/R vR-T, f h M 1 l+}&+>YeP z\h7zu]KO=+j)xqp!30,-; x \ ? "  a*BW~$x(@&r#|g 8~"b!$&lVFX BUL a W N D : y9>eYjb%cWB,,%xo.)e"Y%m{C3:z; > @ B E  ~<&IJ]JXje,R :8/F XX qJF5W9+h! 1 B R b  u&rDLV9Trl3_$t=i+J:k"H,q\7*~(g# : R j : cMqt@!uq$~5KHDQ"VMsw]>*r]JIV" 2 C T d ' qJbV$xiH l,DNX"V*\X7t$Zr-nO{ 1 B h6U_Ei-o'M*p.jL. `F"u(CHXjAr  $ 4 D  )DWcT* D~H\:DhN4J$j{7Fw1RD5` :SaT**t_zl`Tw sfYL?=;97y?/%+*=;h$ 3Y~j-.,(<&z! y;vbN;72.*e">q m6d;2* Cp|]>!:)ruj SlVAHPW^>6/BVl%6rnN1kmQ54Z@(HM'''6F(u 6_B&Hi FND`I$W$ie`\X7B10 pL(2lOR'8_`;BHOV\VRgKMNPR4VNI>,bL e(U8]6z )Km-q ~H WBFKPT3PVd^B%u0PBx`,5c>t8\*h RTWw"n&1 b+T~L+\&WJeBZ#2c2Vd"X|@|:Yl L2S. @Y'pGX-[HXN}>K PbdU>_.G.r(M)L%o6i@! ,^hZGJ RZH_>Rg.b8J+n4`@!Xk F&pB[$pso,r6TdfDL|2Q|9\RVE$v,HW0j. }R&$!9V$ #V Zb9q4=),/lD pSLE\|K2U`f5-P|Kh( f$d<WWco.[:"rXPh8" @pFOv 1fKXd|~6sNrZ_d4l; vl\~S@.,QvHZ$@y:^m|cJ^Zm EiV|9 yIyUI<0$@\wB[. 1)FcXLT\8\#IXhL0Z7(&.L|dYNC8Mbx4Dvm @r4CRJA,{i.@bp]lB9>Qs = ncXNCVj}(u2lT ]I:,cv_06jlmhd*bHG`@ c\TMFR^kwN hZL{I&6F#VWviF#YO vNJf L=:62/DYn3ncXSNn4*4=S j`8TMVLc(b"b^ZVRfzXz_PAe+ns=Fhh@@ c1keFs0e]UME^vL_;RhtR5n/9_~R'|'~|zyxcN"|^i'p_{ G+lll{Cb|j0.}8np_/Y   {L>]PPwf3b}<_2TN g>mbWLAT }[J8Fn*|Q"CFIJJbz 4-`6}"Y\`dg6`$EN>66\[Z] {4j/p2*"nQ| *8 ;iD\P@/1FMEXQ1LVH2*81)*,P3^#x/SGnldVVdln-l6lG"TdXvc n[OpAlHoZ wpv+UDv[@$$%&&a`Eycipyyq]<V)R|H]Ex( "8n i.jPLHEApVZvPGSvvR,l2$NyGXC2 2`h raQRRRSy@AlG78ING+bn!Nzx3cK SD61,WM^wwvvvZ a}H";B0 r=^"Up_Na9l-4:4.X&kt&/o3d='! S$~1&Y]aeibZRKq :tXdqdVK5L[>k:yzzLk"~0kqv|mXB-b X&Lf~}6objL&Z1wmdZ.Z a8DOZfVE4$eE}Em6j]z. b8xN" CR:v(4@LXA*rCL,`x#6P(u,S)4u8c6rdTE;%^ .AT>)UK"R{(1AX2>tG8Z G_0nSH<;O !6L5Y'F*Zn1Nj<>zM "Hm"^ b*fK.am @x,D/b3V 0Sy 4`ut=H c6DoXOtO*fP V"Z2T;" \*f$Kr ,\ %^\ zLAh7CtL$ ~bBU&T0tEV6Wx3j-p}H|KPqV8 n1>:ptIJ[Fm$H~O>k[K;+;JZj"_GN~lN%Tt12h~uL$O^ Q'@Z ^Q^ pbSD6DRaoN4:gN0~@Z]Nf~lJ(Zt"h+Fa8w^ ik]N@2?LZg;4@kP7GV eUh{~`C%W`L$Cb&`Ljuj`VKYhv$YFTT. y>VL9TohJ,Wf[:HV^[ l{ws}1cZWh5 {[nr]$>XsoT8\shA_}4w&:X*} :iTJVhN lqX8VtcF( @K@0On.u&DvG:^XZp'hM lb9x6Tsg[OC$\%@4| cDjx8T#'Jm2t2SL~IQ*`Ah^TJ@ d4RD7&`!rFa-'JlPN h#@i93|.c<60*$X.db>5xG+Nh5 CfRDOb+X!$s%V$).38f: p"v]O L;b#|G-T|G}4EUr8k XO)-048b3jvcB\NbzO$*OtW>?Mu5KFK % NRf_8tM[ }6tJ6! Fr:q8+R jpns,i ~J\|$sE786QbN:&?bR$pw1ShmdWx N`0%ePCh(HSQ>AXPs\WRMHe'\[JR efbAz:bZ0d'T bISh|tfX8j3`u&.vx(Vh1w|;aH0+~&xm ]&b$Qcv~qcC#r:fv"z(4/Jh>@iZ=. tqbS&<RipbSD$^*^u$0ktJ N=cLw8|P$hG>4*!0@P_z0bb6~Z6} E~AjnU,q3t1h$XPyLsj`VMV_hqDu)j7|Y8Cv'Lrv\Ad/?v2g"[n?dZQH>JVamQ;| T3zG>u(IkxpXA)Oi.v3j&a&Q"xl_S\fpy5fA~BU#f$Z *K\nx`G.T"D6d$j.\.znbr -YP R$g"X*^*:JZjfc`\F1Ow6u5{@NtD2^V OMD,b,>PbdfikWB.p@t:<v8NZ.0]J|0q9|5p >o&<SjjjiiT?*\*H FJ^$d8(Py>w.m)h \9n 0CDDDE5$wDv>TZn6W;9bG}(b a#c,Z|$:::;;)xL Wh(n0~E T41Z Cy.n&aG$[~ .1469+T"Rx@@OeF(  8bJ$[K9t'Nu $'*tJ\$t8F i4`B# "8Mv#T!V>zEu.X  W(\'F Pm6 iL06NtBq By3qS 1Vz%1$ W.s> DN}KsX< $8Kn2`:s$_4g(Py  a8Jd)y>_2nQ4& )>a Kv"[PBu 1Tx  gBtD[j.k=tS3&  ,=No-[/fK*[BktL$j5c/SmAcE6( )8Hm 8f,^<u!R.Sxz_7mDK^-oF^M<+ "3DUf 4`$W6j4` 4]vu_=uDt@{FxJq^L:'%$" 1BSd 3]#W+b5b&H`xp[6pDZ#}J[0s`N<840,TjvbN0{MNU"`3paQMJFBP]jx 3Y?tEv6d,BXmvcO0|P$_+\)pE|l[XVTQ^ly<`H{Dt2a"8NcyxdP=lBR#f6xK}olifcoz+RxHw7j(T ":SlxvbO;pH!k8n= _6rmhd_mz"Gl"R8hKw6Ngr}|jXE3b9`/n@tO0 2W|"Mz2`?j.DQ^lytojeSA/X.Y,uF{W; 6XzBp&T*Su "9DP[fc`^[N@2% lFp@P!]?" *Ih :h%X8b1LV`kunhb[J9(c<Z/W*bE( 8[~It&V1Zz ":@GNTPKFB5( tN(oB`4|^?  #Cc?kL{"Kl,8CNZWTRO>, |X4]/|R(`@ Ad&O|.X Fl)06<CBBA@0 kH%`6 b8 t[B)(Gf?l Mz!Ji&0;EB>:7&lL, g9 f@lN0&8Ur$Lx$Lu7Wx &/-*(& lH$g@rGfL2 %:Xv"Go?j 3Qp#-,,+* iK-yN$zO%fI, 2Nj(*Gd 0Ty:b#Df`<Z0`7nS7%(:Wt )Nt=g8Vs  bB"g?rH'pU?("/F]td={T0 rWH8( %4B\u%Hk*Rx (Gf| pW>%qL&nM, zeP:%$4DVi|,U~Ce8]x lQ6~Y4_8jWD14J`w Fk&Ox6Zr  x]BmH$^7yeP<(  .BVkAf-Sy +Mhx^C!qL(kF"jQ8 4Kbx$Hk)S~2Rl  hL+ zS,^7nXB- -F_xBf 4\3Sm ~eL*tM&fBiS='+?Rfz:_Ad8Rl|cJ* xP(kH%lYF3(",@Tg{<_El B\w v]D"rL'mJ&xbK4(*6H[n8_@d7Rnt[C$|W1gG'v_H>3($,5GZl~0Rs 1V|">ZwqX?#hEkI'kUG:, %.BVk%Fg 0Sv$A^zv]D&dBkI'u]E:/$ (/BTfy2Rs Fk3Le~|fP3uS/ zT/ycRB1 "*2DWj|"@_Bh"=Xst\E) nK&xY9v]RG<1/.,*18?FWhx7Y{:Z{8Rlt\C' qQ- zW4k^PC641.,28?EXl,Hd8\ &@Ynr^I+ qQ/ a?(qbRBCDDEINRVbny&Ed"Df5ObvlU>"uW6mJ.|n`QJD=6;@EJ\n %>Wy.V}0FZovgXH,zZ9uU:znaTPMJFLRX^kx&Ed8Vw #<N_p|kZ@% tR1^>vj]PJD>8>DJP_n} 'C_|Di,CVhzzhVD,`=uU: tdSRPNMWaku )Hf6Qo9JZk|p^L; |`C& eF( pa\VQLQV\ao~0Mi:Xx4EVgxveTB1{\=iM1p`\WRNTZagt *Fc *He8J\nudTD3pQ5mP4zriadhlo~6Rn9Xw0>LYgq|tgVD3"{^? pVL[aflrstuvng`XF5$jL/nT:! ztuvxy-D[z8Ys 3FXkrx~wph`N<+uZ= {bH.|wy|~)@Wn=]x):JZ`gntsrrqjd^WD2  ycG*lV?( $?Zt6Rl-@RY`gnnnnng`ZSD5&z`E*hP9! (B[t+Fb~ 0@JS\fhjlng`ZSD4%t[@% t]F/ 4Jax+E]v$3<ENWVTRQLHC>0#r[C*x`G/ )>Rf~8Rk$5?JT^\[ZXRMHB5(|gO6hR;* *@Uk/Id~*4>GQPONMID@<1&jT=&|fP>,$:Pey4Oj#0<HIJJKHFC@6,!gR=(~hQ?. +@Ul+F`z$0<HMRW\XTOK?3' zbI0hP>, .>Xq-Hb| +6BMRVZ_YSMG<0% iN4{bL5-A\x(AZs&,3:@FLRXVSPNB7, pYB,wZC,$8Kc{.Hb{#/;GMRX^WPHA6*kR8pV@* 5Jc|,BYp  (08@EJPUSQOMB6+ lT;# pWA+&8Kcz)B[t(4?FMT[WSOK=0"lO2wcK4(8Haz0CVj&09>DINMLJI=1% qW=# }gR>)"2AXp $;Ri!*38>DIIJJJ>1$ |`D)u]F. .?Th}.G`t&1468;=@BD<4+#kT=!nZF1 0AVl2Lg|*6;@DIHGFE<2) ~fO8r\F1 -AXn0Jcy (5CEGIKLLLME>6.ydN9 lXD1"5HYj{ 'B]p$38>DIGDB@92+$nYD( wfUD3 &8Pg~(B\q %36:=@?>=<60)#r^J5q\F1 0CVh{ $@[p)2:BKHEB?80)"jT>% ~lZG5$)@Xo&?Yr +2:BIFDA>82,& mXB-s^J5& "4I^r2Ng",5>HD@;7.%t^I3xeR>/  %?Xr.C[r&-4<:875/("xbL7" fK1$ 1EYm7Ph ",78:;<3*  |fQ9" p\H7& "/DXl"7K`t"(../00*$ t]F0t`K:* *9L`s2I`v#(.381*"}hR;$ r^I:,*6H[n 4H[n $%&'("|fP9" |hSB0*6HZk} 2H_u "& t_I4xdOB5( (3>LZiw*=Pcv   s_K6 p^N>/  $0=M^n~&9L`s   p_H2{fTB1-*r`UJ?4( $2?L\l{-?Qcu|jWD0p`TH=1'  #/;GSfx&:OdxxhWF4#tbVK@4*  '6DRbr,BWl  xdO;)rbUH;.# $.9DN`s *=Pdwo\J8'taTHHQZix .@Qcq}m\L<. wk_SKC;3.*% "$&(,037AJT^n}%6HYhvugYK;+ uj^RJB91+& &-482-''&&&.5BFKRY`gs (5CRap~qdXK=. wjbZSKFB=876549>DIS^hr~"1@P[fq|zof\SJ:* |pf\SIEB>:::;;>BFIQZbjt~)6BN[htui^RF7( ymdZQHFC@>>>??BEHKU^hr| .;HT`lxwkaWMC4& sjbYPNLKIHHHGJMPS]gq{&3@NXblv}rg\RG<0# zrjaYVTROOOOOSVZ^gpy,9FQ\hs{zpf[PD9." vnf]ZXURRRSSVZ]`hov~ '6ENXbkrx~ulcWJ>2(xqjfb_[\]^_behkrx~*7BLWbipx~ulcXND9/&|umiea]`behjmprv{ $2<GR\cjpwzrj_TI>4* }vpib\^`acfjmpv{,8DP\cjqxxph\PE9/$|vpkf`abcdhlquz~ ,8DP\dkrz~xqjdYNB7,  zuqmiedcbafjnsz !+6@JU]dltx||vpjdZPE;0$ }ytplllmmrv{'2>IT\dltx|~zrjbZQH>5*  |yvxyz| +6@KT^gptx{}wqke^VNG<1&~zvqmnprsx| )4>IS]gquz~|wrlg`YRK?3' |zxtqnjjjkkqw}'1;ENXbkotx|~~ysnhb]XRMD;2)|xtroljjjiiotz &.6ALXcipv|~xrlfa[QH>4' ~zvqmkhfdddddjpv|%.8BLVakrx~xoh`YRI@6- ~xspmjghijkry #*06=FNV_hpx{umd\TJ?4*zvqpponnmllpty}%0;FPZelt||tj`WMB8.#|xsstttttuuy|&.7>FNU]emuy~ytnh`YRJB:1) ~&1:DMV]dlswz~zuph_VNG@92*!}zxvsvxz}  ,8?FNU\dkrx~zuqi`XPH@80' ~{xuwxz|~"+3;CKRZbinsx}~~~}|yvtqjb[TKB:1)"}zwvvvuvwxy~)2;DMTZ`gmrx~zvrlf_YPG>5,"|xyz{|!+4>GPW^elrw|~{xvutrjaXPF<2( )4>ITY^bglpty{~~}{wsokd]VOF>6-& *2;DLSZ`gmrx~~}zxurnjg`ZTME<4,# #,6@IOU[adhknpruwvtsrmhc^XSNH?6.% !*2:AINRV[_cgknqtwusqojfb]YUQMF>70& &0:DLSZbehlorvy|{zxwrmhc^YTOF<3*  '07>FMRX]behjmortvtsrpkfb]XRMHA:4-$ '.6>FNV^chmrtuvxwvutplie_YSME<4,# &.6>FNU\dgjmpqrrsttuvrmhd]VNG@92+# "+29@GNU\chmrwwvvvtsrpkfa\VPJD>70*! !*2;DLSZbfilpppqqrrstpmjf`ZSMF>70'  (.4:@GNU\`dgklnoponnmjfb_ZTNIC<60'   '.4<DKSWZ^bcddefhjkjjjic]WQKE?92+$   '.4;AHNTZ_djlorttsrroljgc^ZVOHB;2*" !(08>DKQW]cikmoqqrrrpnlje`ZUNF>70*#   (1:?DINSX^chlqvvvvvspliea]YRJC<4,%  "+4:@FLRX^dgjmpnligfdba^\YVNF=5.& "+4:?DJMPRUZ`ejjjiifda^ZWTPJD?92,% $+28?FLRY_cfjnmljihfdca`^\UNG@6-$   *4:AHNRUX\`dgklnopmjgd^XSMG@:4.("$*06<BHNSY\_bedba`]ZXUTRPOJFB=4,$  &.7@HQTWZ]^`abdfhjhfdb\WRLF@;50*$ #*16<BGLQV[^adgffedb`][WSOKFB=80(!  '.5<DKNPSVWXZ[]^`ba``_ZTOJFB=93,&  &-39?EINRVX[^`bdegd`\YUQMIFB?<4,#   &,3:@EJNSUVXZ[\]^]\\[XTQNHB<6.'   ")06=BFJOTX\acegifdb_\XTQLHC>70(! ")06=DINRWZ\^abbbccccc_[WSMGA;5.(" !)/4:@FMTZ]`cfffeedba`\YVRLGB<60*$ %+17?FNVX[^```__`abc`]ZWOG?71*$   (-28=CHNTWZ]`bcdfdba_[VRNID>92,& "',27<BHMQTX\]^_``_^^\YVTPLHD=6/("&.5<AFKPTX\`bdgihhgfc`]ZTNGA;4.( &-4;@DINRUX\^_`ba`^]ZWTQKE?92+$  !(.5:@EJNRW[\\]^]\\[XVTQLF@;4.(!   '.5<@EJNQTX[]^`b_\ZWTQNKFB>92*# %,3:=@DGKNRVXZ]_\ZXURNKHEB>;5.("&,37:>BFILPSVZ][ZXVSPNKHD@=82-(   $,37;?CFHJMORTVVVUURPNKHDA>82+%  "(/4:?DFHJLMNPQQRRRPNLJGD@=84/*#$*06<CIMPTXZ\_a``_^ZWTPLHD@:4/)!  "(/5:@FKNQTWXYZ[[ZZZXURPKF@;60+&  $*05:@EGIKMOPRTTUVVSPNKFB=82-(" %*.37;?CGKOSTTUVVUTTQNKHC>:5/)# #(,16:>CFJNQQPPPPPPPNLKID@;60+&   $(-159=BFKPQRTUUTTTRPOMHD?:4.'! #(,048=BHMOQSUTTSRQPONID?:2+$  #(,16:>BFJLORTTSRROLJGB>:5/)#  %+049>DINTUVXYWTRPNMLJGD@=60*#  "(/6:=@DFGHJLNOQPPONLJHFB>:61,&!  "&+.269<@DGHJLMLJHGEB@><;:83.*%  &+06;=>@BDGJLMNOPNKHFB>:61,'"  #(-27:=@CFILONNMLIFDA?=;94.(#  "',27:=@CEGIKLLMNLJHFB?<83.*%   &,/258;>BEHJMPPQRRPNKIFC@=940,%  #(.49<@CFGHHIJJKLJHGEA>:62-($  "',05:>ADHJLMOOPPPMJHEB>;840-)" #)/38<@CFJMNNOPPQRRPNMKFB>952.*#$(-26;@DHKOPPQRRQPPNMLJFB?;62.)" "(-16:>ADHKLNPQQQQQOMKID>83-("   $).26:>BFIMNNOPONNMJHEB>:73.)$   $(-159=ADHLOPPPQONLJHFCA=951,&!  &,26:>BEHJMNOPQONLJHFCA>;850+&!  #(.48<AEGHJLMNOPONLKHEB?<841+%  $+147:=?BDFILORPNMKGD@<:864.(#  &,37<@DFGHJLNPRRQPPNKHFB>;70*$ "(.37:>BEHJMOPRTRPOMID@<:853.("  ")049>BDEFHJKLNNNNNJGD@<840,'" !&,158<@BEHJJJJJJJJJFB>:62-)%"  #(-28=@BDGFDCBBBBB@?><84/+($   %*.38<?BDGIJLNNMLLIFC@<72.+($!  "&*-159=@DHKJJJIHGFEDB@?;840*$  $*.27;=?ACEFHJJIHHEB>;840-($   !%),/259=AEEEEEC@><;:9840-)$  LISTBINFOISFT5GoldWave (C) Chris S. Craig, http://www.goldwave.comgajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/style/000077500000000000000000000000001326020644600240435ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/data/style/gajim.css000066400000000000000000000103761326020644600256530ustar00rootroot00000000000000/* Gajim Application CSS File */ .chatcontrol-actionbar-button { padding: 0px 5px 0px 5px; background-color: @theme_base_color; border: none; } .scrolled-no-border {border: none} .no-scroll-indicator undershoot.top, undershoot.bottom { background-image: none; } .scrollbar-style scrollbar trough {background-color:@theme_base_color; } .scrollbar-style scrollbar {border:none; } .scrollbar-style slider {min-width: 3px; background-color: #a0a3a4} .actionbar-no-border box {border: none} .actionbar-no-border button { padding: 0px; background-color: @theme_base_color; border: none; background-image: none; } #MessageWindow, #RosterWindow paned { background-color: @theme_base_color; } .chatcontrol-separator-top {margin-top: 5px;} .chatcontrol-separator {margin-bottom: 5px;} #SubjectPopover box { padding: 10px; } /* VCardWindow */ .VCard-GtkLinkButton { padding-left: 5px; border-left: none; } /* Emoticon Popover */ popover#EmoticonPopover button { background: none; border: none; box-shadow:none; padding: 0px;} popover#EmoticonPopover button > label { font-size: 24px; } popover#EmoticonPopover flowboxchild > label { font-size: 24px; } popover#EmoticonPopover notebook label { font-size: 24px; } popover#EmoticonPopover flowbox { padding-left: 5px; padding-right: 6px; } popover#EmoticonPopover flowboxchild { padding-top: 5px; padding-bottom: 5px; } /* HistorySyncAssistant */ #HistorySyncAssistant list { border: 1px solid; border-color: @borders; } #HistorySyncAssistant progressbar text { color: #000; font-size: 18px; padding: 10px;} #HistorySyncAssistant list > row { padding: 10px 30px 10px 30px; } #HistorySyncAssistant list > row > label { color: @insensitive_fg_color } #HistorySyncAssistant list > row.activatable > label { color: @theme_text_color; } #HistorySyncAssistant list > row.activatable:selected > label { color: @theme_selected_fg_color; } #FinishedLabel { font-size: 14px; font-weight: bold } /* Server Info */ #ServerInfoGrid > list { border: 1px solid; border-color: @borders; } #ServerInfoGrid > list > row:first-child { border-top: 1px solid; border-color: @borders; } #ServerInfoGrid > list > row { padding: 10px 20px 10px 10px; } #ServerInfoGrid > list > label { padding:10px; color: @insensitive_fg_color; font-weight: bold; } #ServerInfoGrid > list > row.activatable:active { box-shadow: none; } /* OptionsBox */ #OptionsBox > row { border-bottom: 1px solid; border-color: @theme_unfocused_bg_color; } #OptionsBox > row:last-child { border-bottom: 0px} #OptionsBox > row.activatable:active { box-shadow: none; } #OptionsBox > row { padding: 10px 20px 10px 10px; } #OptionsBox > row:not(.activatable) label { color: @insensitive_fg_color } /* GenericOption */ #SubDescription { color: @insensitive_fg_color;} #GenericOptionBox { margin-left: 30px; } #GenericOptionBox > label { padding-right: 3px; } /* Generic Popover Menu with Buttons */ .PopoverButtonListbox { padding-left: 0px; padding-right: 0px; } .PopoverButtonListbox > list { margin-top: 10px; margin-bottom: 10px; } .PopoverButtonListbox > list > row { padding: 10px 20px 10px 20px; } .PopoverButtonListbox > list > row.activatable:active { box-shadow: none; background-color: @theme_selected_bg_color } /* Accounts Window */ #AccountsWindow > box { padding:30px 30px 30px 30px;} #AccountsWindow scrolledwindow {border: none;} #AccountsWindow list {border: 1px solid; border-color: @borders;} #AccountsWindow > box actionbar box {border: none;} #AccountNameEntry:disabled { font-size: 16px; font-weight: bold; border: none; background-color: @theme_unfocused_bg_color; color: @theme_text_color; } /* StartChatListBox */ #StartChatListBox > row { border-bottom: 1px solid; border-color: @theme_unfocused_bg_color; } #StartChatListBox > row:last-child { border-bottom: 0px} #StartChatListBox > row.activatable:active { box-shadow: none; } #StartChatListBox > row { padding: 10px 20px 10px 10px; } #StartChatListBox > row:not(.activatable) label { color: @insensitive_fg_color } /* Text style */ .bold16 { font-size: 16px; font-weight: bold; } .status-away { color: #ff8533;} .status-dnd { color: #e62e00;} .status-online { color: #66bf10;} /*MessageWindow Notebook*/ .notebook-tab-label {min-width: 80px} gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/dataforms_widget.py000066400000000000000000000653211326020644600256760ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/dataforms_widget.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2006 Tomasz Melcer ## Copyright (C) 2006-2007 Jean-Marie Traissard ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## ''' This module contains widget that can display data form (JEP-0004). Words single and multiple refers here to types of data forms: single means these with one record of data (without element), multiple - these which may contain more data (with element).''' from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GdkPixbuf from gi.repository import GObject from gi.repository import GLib import base64 from gajim import gtkgui_helpers from gajim.common import dataforms from gajim.common import helpers from gajim.common import app import itertools class DataFormWidget(Gtk.Alignment, object): # "public" interface """ Data Form widget. Use like any other widget """ __gsignals__ = dict( validated = (GObject.SignalFlags.RUN_LAST | GObject.SignalFlags.ACTION, None, ()) ) def __init__(self, dataformnode=None): ''' Create a widget. ''' GObject.GObject.__init__(self, xscale=1.0, yscale=1.0) self._data_form = None self.selectable = False self.clean_cb = None self.xml = gtkgui_helpers.get_gtk_builder('data_form_window.ui', 'data_form_vbox') self.xml.connect_signals(self) for name in ('instructions_label', 'instructions_hseparator', 'single_form_viewport', 'data_form_types_notebook', 'single_form_scrolledwindow', 'multiple_form_hbox', 'records_treeview', 'buttons_vbox', 'add_button', 'remove_button', 'edit_button', 'up_button', 'down_button', 'clear_button'): self.__dict__[name] = self.xml.get_object(name) self.add(self.xml.get_object('data_form_vbox')) if dataformnode is not None: self.set_data_form(dataformnode) selection = self.records_treeview.get_selection() selection.connect('changed', self.on_records_selection_changed) selection.set_mode(Gtk.SelectionMode.MULTIPLE) def on_data_form_vbox_key_press_event(self, widget, event): print('key pressed') def set_data_form(self, dataform): """ Set the data form (nbxmpp.DataForm) displayed in widget """ assert isinstance(dataform, dataforms.DataForm) self.del_data_form() self._data_form = dataform if isinstance(dataform, dataforms.SimpleDataForm): self.build_single_data_form() else: self.build_multiple_data_form() # create appropriate description for instructions field if there isn't any if dataform.instructions == '': self.instructions_label.set_no_show_all(True) self.instructions_label.hide() else: self.instructions_label.set_text(dataform.instructions) gtkgui_helpers.label_set_autowrap(self.instructions_label) def get_data_form(self): """ Data form displayed in the widget or None if no form """ return self._data_form def del_data_form(self): self.clean_data_form() self._data_form = None data_form = property(get_data_form, set_data_form, del_data_form, 'Data form presented in a widget') def get_title(self): """ Get the title of data form. If no title or no form, returns ''. Useful for setting window title """ if self._data_form is not None: if self._data_form.title is not None: return self._data_form.title return '' title = property(get_title, None, None, 'Data form title') def show(self): ''' Treat 'us' as one widget. ''' self.show_all() # "private" methods # we have actually two different kinds of data forms: one is a simple form to fill, # second is a table with several records; def empty_method(self): pass def clean_data_form(self): """ Remove data about existing form. This metod is empty, because it is rewritten by build_*_data_form, according to type of form which is actually displayed """ if self.clean_cb: self.clean_cb() def build_single_data_form(self): '''Invoked when new single form is to be created.''' assert isinstance(self._data_form, dataforms.SimpleDataForm) self.clean_data_form() self.singleform = SingleForm(self._data_form, selectable=self.selectable) def _on_validated(widget): self.emit('validated') self.singleform.connect('validated', _on_validated) self.singleform.show() self.single_form_viewport.add(self.singleform) self.data_form_types_notebook.set_current_page( self.data_form_types_notebook.page_num( self.single_form_scrolledwindow)) self.clean_cb = self.clean_single_data_form def clean_single_data_form(self): """ Called as clean_data_form, read the docs of clean_data_form(). Remove form from widget """ self.singleform.destroy() self.clean_cb = None # we won't call it twice del self.singleform def build_multiple_data_form(self): """ Invoked when new multiple form is to be created """ assert isinstance(self._data_form, dataforms.MultipleDataForm) self.clean_data_form() # creating model for form... fieldtypes = [] fieldvars = [] for field in self._data_form.reported.iter_fields(): # note: we store also text-private and hidden fields, # we just do not display them. # TODO: boolean fields #elif field.type_=='boolean': fieldtypes.append(bool) fieldtypes.append(str) fieldvars.append(field.var) self.multiplemodel = Gtk.ListStore(*fieldtypes) # moving all data to model for item in self._data_form.iter_records(): iter_ = self.multiplemodel.append() for field in item.iter_fields(): if field.var in fieldvars: self.multiplemodel.set_value(iter_, fieldvars.index(field.var), field.value) # constructing columns... for field, counter in zip(self._data_form.reported.iter_fields(), itertools.count()): self.records_treeview.append_column( Gtk.TreeViewColumn(field.label, Gtk.CellRendererText(), text=counter)) self.records_treeview.set_model(self.multiplemodel) self.records_treeview.show_all() self.data_form_types_notebook.set_current_page( self.data_form_types_notebook.page_num( self.multiple_form_hbox)) self.clean_cb = self.clean_multiple_data_form readwrite = self._data_form.type_ != 'result' if not readwrite: self.buttons_vbox.set_no_show_all(True) self.buttons_vbox.hide() else: self.buttons_vbox.set_no_show_all(False) # refresh list look self.refresh_multiple_buttons() def clean_multiple_data_form(self): """ Called as clean_data_form, read the docs of clean_data_form(). Remove form from widget """ self.clean_cb = None # we won't call it twice del self.multiplemodel def refresh_multiple_buttons(self): """ Checks for treeview state and makes control buttons sensitive """ selection = self.records_treeview.get_selection() model = self.records_treeview.get_model() count = selection.count_selected_rows() if count == 0: self.remove_button.set_sensitive(False) self.edit_button.set_sensitive(False) self.up_button.set_sensitive(False) self.down_button.set_sensitive(False) elif count == 1: self.remove_button.set_sensitive(True) self.edit_button.set_sensitive(True) _, (path,) = selection.get_selected_rows() iter_ = model.get_iter(path) if model.iter_next(iter_) is None: self.up_button.set_sensitive(True) self.down_button.set_sensitive(False) elif path == (0, ): self.up_button.set_sensitive(False) self.down_button.set_sensitive(True) else: self.up_button.set_sensitive(True) self.down_button.set_sensitive(True) else: self.remove_button.set_sensitive(True) self.edit_button.set_sensitive(True) self.up_button.set_sensitive(False) self.down_button.set_sensitive(False) if len(model) == 0: self.clear_button.set_sensitive(False) else: self.clear_button.set_sensitive(True) def on_clear_button_clicked(self, widget): self.records_treeview.get_model().clear() def on_remove_button_clicked(self, widget): selection = self.records_treeview.get_selection() model, rowrefs = selection.get_selected_rows() # rowref is a list of paths for i in range(len(rowrefs)): rowrefs[i] = Gtk.TreeRowReference.new(model, rowrefs[i]) # rowref is a list of row references; need to convert because we will # modify the model, paths would change for rowref in rowrefs: del model[rowref.get_path()] def on_up_button_clicked(self, widget): selection = self.records_treeview.get_selection() model, (path,) = selection.get_selected_rows() iter_ = model.get_iter(path) # constructing path for previous iter previter = model.get_iter((path[0]-1,)) model.swap(iter_, previter) self.refresh_multiple_buttons() def on_down_button_clicked(self, widget): selection = self.records_treeview.get_selection() model, (path,) = selection.get_selected_rows() iter_ = model.get_iter(path) nextiter = model.iter_next(iter_) model.swap(iter_, nextiter) self.refresh_multiple_buttons() def on_records_selection_changed(self, widget): self.refresh_multiple_buttons() class SingleForm(Gtk.Table, object): """ Widget that represent DATAFORM_SINGLE mode form. Because this is used not only to display single forms, but to form input windows of multiple-type forms, it is in another class """ __gsignals__ = dict( validated = (GObject.SignalFlags.RUN_LAST | GObject.SignalFlags.ACTION, None, ()) ) def __init__(self, dataform, selectable=False): assert isinstance(dataform, dataforms.SimpleDataForm) GObject.GObject.__init__(self) self.set_col_spacings(12) self.set_row_spacings(6) def decorate_with_tooltip(widget, field): """ Adds a tooltip containing field's description to a widget. Creates EventBox if widget doesn't have its own gdk window. Returns decorated widget """ if field.description != '': if not widget.get_window(): #if widget.flags() & Gtk.NO_WINDOW: evbox = Gtk.EventBox() evbox.add(widget) widget = evbox widget.set_tooltip_text(field.description) return widget self._data_form = dataform # building widget linecounter = 0 # is the form changeable? readwrite = dataform.type_ != 'result' # for each field... for field in self._data_form.iter_fields(): if field.type_ == 'hidden': continue commonlabel = True commonlabelcenter = False commonwidget = True widget = None if field.type_ == 'boolean': commonlabelcenter = True widget = Gtk.CheckButton() widget.connect('toggled', self.on_boolean_checkbutton_toggled, field) widget.set_active(field.value) elif field.type_ == 'fixed': leftattach = 1 rightattach = 2 if field.label is None: commonlabel = False leftattach = 0 commonwidget = False widget = Gtk.Label(label=field.value) widget.set_property('selectable', selectable) widget.set_line_wrap(True) self.attach(widget, leftattach, rightattach, linecounter, linecounter+1, xoptions=Gtk.AttachOptions.FILL, yoptions=Gtk.AttachOptions.FILL) elif field.type_ == 'list-single': # TODO: What if we have radio buttons and non-required field? # TODO: We cannot deactivate them all... if len(field.options) < 6: # 5 option max: show radiobutton widget = Gtk.VBox() first_radio = None for value, label in field.iter_options(): if not label: label = value radio = Gtk.RadioButton.new_with_label_from_widget( first_radio, label) radio.connect('toggled', self.on_list_single_radiobutton_toggled, field, value) if first_radio is None: first_radio = radio if field.value == '': # TODO: is None when done field.value = value if value == field.value: radio.set_active(True) widget.pack_start(radio, False, True, 0) else: # more than 5 options: show combobox def on_list_single_combobox_changed(combobox, f): iter_ = combobox.get_active_iter() if iter_: model = combobox.get_model() f.value = model[iter_][1] else: f.value = '' widget = gtkgui_helpers.create_combobox(field.options, field.value) widget.connect('changed', on_list_single_combobox_changed, field) widget.set_sensitive(readwrite) elif field.type_ == 'list-multi': # TODO: When more than few choices, make a list if len(field.options) < 6: # 5 option max: show checkbutton widget = Gtk.VBox() for value, label in field.iter_options(): check = Gtk.CheckButton(label=label, use_underline=False) check.set_active(value in field.values) check.connect('toggled', self.on_list_multi_checkbutton_toggled, field, value) widget.pack_start(check, False, True, 0) widget.set_sensitive(readwrite) else: # more than 5 options: show combobox def on_list_multi_treeview_changed(selection, f): def for_selected(treemodel, path, iter): vals.append(treemodel[iter][1]) vals = [] selection.selected_foreach(for_selected) field.values = vals[:] widget = Gtk.ScrolledWindow() widget.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) tv = gtkgui_helpers.create_list_multi(field.options, field.values) widget.add(tv) widget.set_size_request(-1, 120) tv.get_selection().connect('changed', on_list_multi_treeview_changed, field) tv.set_sensitive(readwrite) elif field.type_ == 'jid-single': widget = Gtk.Entry() widget.connect('changed', self.on_text_single_entry_changed, field) widget.set_text(field.value) elif field.type_ == 'jid-multi': commonwidget = False xml = gtkgui_helpers.get_gtk_builder('data_form_window.ui', 'multiple_form_hbox') widget = xml.get_object('multiple_form_hbox') treeview = xml.get_object('records_treeview') listmodel = Gtk.ListStore(str) for value in field.iter_values(): # nobody will create several megabytes long stanza listmodel.insert(999999, (value,)) treeview.set_model(listmodel) renderer = Gtk.CellRendererText() renderer.set_property('editable', True) renderer.connect('edited', self.on_jid_multi_cellrenderertext_edited, treeview, listmodel, field) treeview.append_column(Gtk.TreeViewColumn(None, renderer, text=0)) decorate_with_tooltip(treeview, field) add_button=xml.get_object('add_button') add_button.connect('clicked', self.on_jid_multi_add_button_clicked, treeview, listmodel, field) edit_button=xml.get_object('edit_button') edit_button.connect('clicked', self.on_jid_multi_edit_button_clicked, treeview) remove_button=xml.get_object('remove_button') remove_button.connect('clicked', self.on_jid_multi_remove_button_clicked, treeview, field) clear_button=xml.get_object('clear_button') clear_button.connect('clicked', self.on_jid_multi_clean_button_clicked, listmodel, field) if not readwrite: add_button.set_no_show_all(True) edit_button.set_no_show_all(True) remove_button.set_no_show_all(True) clear_button.set_no_show_all(True) widget.set_sensitive(readwrite) self.attach(widget, 1, 2, linecounter, linecounter+1) del xml elif field.type_ == 'text-private': commonlabelcenter = True widget = Gtk.Entry() widget.connect('changed', self.on_text_single_entry_changed, field) widget.set_visibility(False) widget.set_text(field.value) elif field.type_ == 'text-multi': # TODO: bigger text view commonwidget = False textwidget = Gtk.TextView() textwidget.set_wrap_mode(Gtk.WrapMode.WORD) textwidget.get_buffer().connect('changed', self.on_text_multi_textbuffer_changed, field) textwidget.get_buffer().set_text(field.value) if readwrite: textwidget.set_sensitive(True) else: if selectable: textwidget.set_editable(True) else: textwidget.set_sensitive(False) widget = Gtk.ScrolledWindow() widget.add(textwidget) widget=decorate_with_tooltip(widget, field) self.attach(widget, 1, 2, linecounter, linecounter+1) else: # field.type_ == 'text-single' or field.type_ is nonstandard: # JEP says that if we don't understand some type, we # should handle it as text-single commonlabelcenter = True if readwrite: widget = Gtk.Entry() def kpe(widget, event): if event.keyval == Gdk.KEY_Return or \ event.keyval == Gdk.KEY_KP_Enter: self.emit('validated') widget.connect('key-press-event', kpe) widget.connect('changed', self.on_text_single_entry_changed, field) widget.set_sensitive(readwrite) if field.value is None: field.value = '' widget.set_text(field.value) else: commonwidget=False widget = Gtk.Label(label=field.value) widget.set_property('selectable', selectable) widget.set_sensitive(True) widget.set_halign(Gtk.Align.START) widget.set_valign(Gtk.Align.CENTER) widget=decorate_with_tooltip(widget, field) self.attach(widget, 1, 2, linecounter, linecounter+1, yoptions=Gtk.AttachOptions.FILL) if commonlabel and field.label is not None: label = Gtk.Label(label=field.label) if commonlabelcenter: label.set_halign(Gtk.Align.START) label.set_valign(Gtk.Align.CENTER) else: label.set_halign(Gtk.Align.START) label.set_valign(Gtk.Align.START) label = decorate_with_tooltip(label, field) self.attach(label, 0, 1, linecounter, linecounter+1, xoptions=Gtk.AttachOptions.FILL, yoptions=Gtk.AttachOptions.FILL) if field.media is not None: for uri in field.media.uris: if uri.type_.startswith('image/'): try: img_data = base64.b64decode(uri.uri_data) pixbuf_l = GdkPixbuf.PixbufLoader() pixbuf_l.write(img_data) pixbuf_l.close() media = Gtk.Image.new_from_pixbuf(pixbuf_l.\ get_pixbuf()) except Exception: media = Gtk.Label(label=_('Unable to load image')) else: media = Gtk.Label(label=_('Media type not supported: %s') % \ uri.type_) linecounter += 1 self.attach(media, 0, 1, linecounter, linecounter+1, xoptions=Gtk.AttachOptions.FILL, yoptions=Gtk.AttachOptions.FILL) if commonwidget: assert widget is not None widget.set_sensitive(readwrite) widget = decorate_with_tooltip(widget, field) self.attach(widget, 1, 2, linecounter, linecounter+1, yoptions=Gtk.AttachOptions.FILL) if field.required: label = Gtk.Label(label='*') label.set_tooltip_text(_('This field is required')) self.attach(label, 2, 3, linecounter, linecounter+1, xoptions=0, yoptions=0) linecounter+=1 if self.get_property('visible'): self.show_all() def show(self): # simulate that we are one widget self.show_all() def on_boolean_checkbutton_toggled(self, widget, field): field.value = widget.get_active() def on_list_single_radiobutton_toggled(self, widget, field, value): field.value = value def on_list_multi_checkbutton_toggled(self, widget, field, value): # TODO: make some methods like add_value and remove_value if widget.get_active() and value not in field.values: field.values += [value] elif not widget.get_active() and value in field.values: field.values = [v for v in field.values if v!=value] def on_text_single_entry_changed(self, widget, field): field.value = widget.get_text() def on_text_multi_textbuffer_changed(self, widget, field): field.value = widget.get_text(widget.get_start_iter(), widget.get_end_iter(), True) def on_jid_multi_cellrenderertext_edited(self, cell, path, newtext, treeview, model, field): old = model[path][0] if old == newtext: return try: newtext = helpers.parse_jid(newtext) except helpers.InvalidFormat as s: app.interface.raise_dialog('invalid-jid-with-error', str(s)) return if newtext in field.values: app.interface.raise_dialog('jid-in-list') GLib.idle_add(treeview.set_cursor, path) return model[path][0]=newtext values = field.values values[values.index(old)]=newtext field.values = values def on_jid_multi_add_button_clicked(self, widget, treeview, model, field): #Default jid jid = _('new@jabber.id') if jid in field.values: i = 1 while _('new%d@jabber.id') % i in field.values: i += 1 jid = _('new%d@jabber.id') % i iter_ = model.insert(999999, (jid,)) treeview.set_cursor(model.get_path(iter_), treeview.get_column(0), True) field.values = field.values + [jid] def on_jid_multi_edit_button_clicked(self, widget, treeview): model, iter_ = treeview.get_selection().get_selected() assert iter_ is not None treeview.set_cursor(model.get_path(iter_), treeview.get_column(0), True) def on_jid_multi_remove_button_clicked(self, widget, treeview, field): selection = treeview.get_selection() deleted = [] def remove(model, path, iter_, deleted): deleted+=model[iter_] model.remove(iter_) selection.selected_foreach(remove, deleted) field.values = (v for v in field.values if v not in deleted) def on_jid_multi_clean_button_clicked(self, widget, model, field): model.clear() del field.values gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/dev/000077500000000000000000000000001326020644600225505ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/dev/ipython_view.py000066400000000000000000000613711326020644600256560ustar00rootroot00000000000000#!/usr/bin/python # -*- coding:utf-8 -*- ## src/ipython_view.py ## ## Copyright (C) 2008-2014 Yann Leboulanger ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## ## Copyright (c) 2007, IBM Corporation ## All rights reserved. ## Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ## * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ## * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. ## * Neither the name of the IBM Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. ## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ Provides IPython console widget @author: Eitan Isaacson @organization: IBM Corporation @copyright: Copyright (c) 2007 IBM Corporation @license: BSD All rights reserved. This program and the accompanying materials are made available under the terms of the BSD which accompanies this distribution, and is available at U{http://www.opensource.org/licenses/bsd-license.php} """ from functools import reduce from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GObject from gi.repository import GLib import re import sys import os from gi.repository import Pango from io import StringIO try: import IPython except ImportError: IPython = None HAS_IPYTHON5 = True try: from pygments.token import Token from IPython.core.displayhook import DisplayHook from IPython.core.display_trap import DisplayTrap class MyPromptDisplayHook(DisplayHook): def __init__(self, shell, view): DisplayHook.__init__(self, shell=shell) self.view = view def write_output_prompt(self): tokens = self.shell.prompts.out_prompt_tokens() self.view.write('\n') self.view.write(tokens) except Exception: HAS_IPYTHON5 = False class IterableIPShell: """ Create an IPython instance. Does not start a blocking event loop, instead allow single iterations. This allows embedding in GTK+ without blockage @ivar IP: IPython instance. @type IP: IPython.iplib.InteractiveShell @ivar iter_more: Indicates if the line executed was a complete command, or we should wait for more. @type iter_more: integer @ivar history_level: The place in history where we currently are when pressing up/down. @type history_level: integer @ivar complete_sep: Seperation delimeters for completion function. @type complete_sep: _sre.SRE_Pattern """ def __init__(self,argv=[],user_ns=None,user_global_ns=None, cin=None, cout=None,cerr=None, input_func=None): """ @param argv: Command line options for IPython @type argv: list @param user_ns: User namespace. @type user_ns: dictionary @param user_global_ns: User global namespace. @type user_global_ns: dictionary. @param cin: Console standard input. @type cin: IO stream @param cout: Console standard output. @type cout: IO stream @param cerr: Console standard error. @type cerr: IO stream @param input_func: Replacement for builtin raw_input() @type input_func: function """ io = IPython.utils.io if input_func: if IPython.version_info[0] >= 1: IPython.terminal.interactiveshell.raw_input_original = input_func else: IPython.frontend.terminal.interactiveshell.raw_input_original = input_func if cin: io.stdin = io.IOStream(cin) if cout: io.stdout = io.IOStream(cout) if cerr: io.stderr = io.IOStream(cerr) # This is to get rid of the blockage that accurs during # IPython.Shell.InteractiveShell.user_setup() io.raw_input = lambda x: None os.environ['TERM'] = 'dumb' excepthook = sys.excepthook if IPython.version_info[0] >= 5: from traitlets.config.loader import Config else: from IPython.config.loader import Config cfg = Config() cfg.InteractiveShell.colors = "Linux" # InteractiveShell's __init__ overwrites io.stdout,io.stderr with # sys.stdout, sys.stderr, this makes sure they are right old_stdout, old_stderr = sys.stdout, sys.stderr sys.stdout, sys.stderr = io.stdout.stream, io.stderr.stream # InteractiveShell inherits from SingletonConfigurable so use instance() if IPython.version_info[0] >= 1: self.IP = IPython.terminal.embed.InteractiveShellEmbed.instance(config=cfg, user_ns=user_ns, user_module=user_global_ns) else: self.IP = IPython.frontend.terminal.embed.InteractiveShellEmbed.instance(config=cfg, user_ns=user_ns) sys.stdout, sys.stderr = old_stdout, old_stderr self.IP.system = lambda cmd: self.shell(self.IP.var_expand(cmd), header='IPython system call: ', local_ns=user_ns) #global_ns=user_global_ns) #verbose=self.IP.rc.system_verbose) self.IP.raw_input = input_func sys.excepthook = excepthook self.iter_more = 0 self.history_level = 0 self.complete_sep = re.compile('[\s\{\}\[\]\(\)]') self.updateNamespace({'exit':lambda:None}) self.updateNamespace({'quit':lambda:None}) #self.IP.readline_startup_hook(self.IP.pre_readline) # Workaround for updating namespace with sys.modules # self.__update_namespace() def __update_namespace(self): ''' Update self.IP namespace for autocompletion with sys.modules ''' for k,v in sys.modules.items(): if not '.' in k: self.IP.user_ns.update({k:v}) def execute(self): """ Execute the current line provided by the shell object """ self.history_level = 0 orig_stdout = sys.stdout sys.stdout = IPython.utils.io.stdout orig_stdin = sys.stdin sys.stdin = IPython.utils.io.stdin self.prompt = self.generatePrompt(self.iter_more) self.IP.hooks.pre_prompt_hook() if self.iter_more: try: self.prompt = self.generatePrompt(True) except: self.IP.showtraceback() if self.IP.autoindent: self.IP.rl_do_indent = True try: line = self.IP.raw_input(self.prompt) except KeyboardInterrupt: self.IP.write('\nKeyboardInterrupt\n') self.IP.input_splitter.reset() except: self.IP.showtraceback() else: self.IP.input_splitter.push(line) self.iter_more = self.IP.input_splitter.push_accepts_more() self.prompt = self.generatePrompt(self.iter_more) if not self.iter_more: if IPython.version_info[0] >= 2: source_raw = self.IP.input_splitter.raw_reset() else: source_raw = self.IP.input_splitter.source_raw_reset()[1] self.IP.run_cell(source_raw, store_history=True) self.IP.rl_do_indent = False else: # TODO: Auto-indent # self.IP.rl_do_indent = True sys.stdout = orig_stdout sys.stdin = orig_stdin def generatePrompt(self, is_continuation): ''' Generate prompt depending on is_continuation value @param is_continuation @type is_continuation: boolean @return: The prompt string representation @rtype: string ''' # Backwards compatibility with ipyton-0.11 # ver = IPython.__version__ if '0.11' in ver: prompt = self.IP.hooks.generate_prompt(is_continuation) else: # Prompt for IPython >=5.0: if hasattr(self.IP, 'prompts'): if is_continuation: prompt = self.IP.prompts.continuation_prompt_tokens(self.IP.prompts) else: prompt = self.IP.prompts.in_prompt_tokens(self.IP.prompts) # Prompt for IPython < 5.0 elif hasattr(self.IP, 'prompt_manager'): if is_continuation: prompt = self.IP.prompt_manager.render('in2') else: prompt = self.IP.prompt_manager.render('in') return prompt def historyBack(self): """ Provide one history command back @return: The command string. @rtype: string """ self.history_level -= 1 return self._getHistory() def historyForward(self): """ Provide one history command forward @return: The command string. @rtype: string """ self.history_level += 1 return self._getHistory() def _getHistory(self): """ Get the command string of the current history level @return: Historic command string. @rtype: string """ try: rv = self.IP.user_ns['In'][self.history_level].strip('\n') except IndexError: self.history_level = 0 rv = '' return rv def updateNamespace(self, ns_dict): """ Add the current dictionary to the shell namespace @param ns_dict: A dictionary of symbol-values. @type ns_dict: dictionary """ self.IP.user_ns.update(ns_dict) def complete(self, line): """ Returns an auto completed line and/or posibilities for completion @param line: Given line so far. @type line: string @return: Line completed as for as possible, and possible further completions. @rtype: tuple """ split_line = self.complete_sep.split(line) if split_line[-1]: possibilities = self.IP.complete(split_line[-1]) else: completed = line possibilities = ['',[]] if possibilities: def _commonPrefix(str1, str2): ''' Reduction function. returns common prefix of two given strings. @param str1: First string. @type str1: string @param str2: Second string @type str2: string @return: Common prefix to both strings. @rtype: string ''' for i in range(len(str1)): if not str2.startswith(str1[:i+1]): return str1[:i] return str1 if possibilities[1]: common_prefix = reduce(_commonPrefix, possibilities[1]) or line[-1] completed = line[:-len(split_line[-1])]+common_prefix else: completed = line else: completed = line return completed, possibilities[1] class ConsoleView(Gtk.TextView): """ Specialized text view for console-like workflow @cvar ANSI_COLORS: Mapping of terminal colors to X11 names. @type ANSI_COLORS: dictionary @ivar text_buffer: Widget's text buffer. @type text_buffer: Gtk.TextBuffer @ivar color_pat: Regex of terminal color pattern @type color_pat: _sre.SRE_Pattern @ivar mark: Scroll mark for automatic scrolling on input. @type mark: Gtk.TextMark @ivar line_start: Start of command line mark. @type line_start: Gtk.TextMark """ ANSI_COLORS = {'0;30': 'Black', '0;31': 'Red', '0;32': 'Green', '0;33': 'Brown', '0;34': 'Blue', '0;35': 'Purple', '0;36': 'Cyan', '0;37': 'LightGray', '1;30': 'DarkGray', '1;31': 'DarkRed', '1;32': 'SeaGreen', '1;33': 'Yellow', '1;34': 'LightBlue', '1;35': 'MediumPurple', '1;36': 'LightCyan', '1;37': 'White'} def __init__(self): """ Initialize console view """ GObject.GObject.__init__(self) self.override_font(Pango.FontDescription('Mono')) self.set_cursor_visible(True) self.text_buffer = self.get_buffer() self.mark = self.text_buffer.create_mark('scroll_mark', self.text_buffer.get_end_iter(), False) for code in self.ANSI_COLORS: self.text_buffer.create_tag(code, foreground=self.ANSI_COLORS[code], weight=700) self.text_buffer.create_tag('0') self.text_buffer.create_tag('notouch', editable=False) self.color_pat = re.compile('\x01?\x1b\[(.*?)m\x02?') if HAS_IPYTHON5: self.style_dict = { Token.Prompt: '0;32', Token.PromptNum: '1;32', Token.OutPrompt: '0;31', Token.OutPromptNum: '1;31', } self.line_start = \ self.text_buffer.create_mark('line_start', self.text_buffer.get_end_iter(), True) self.connect('key-press-event', self.onKeyPress) def write(self, text, editable=False): if type(text) == str: GLib.idle_add(self._write, text, editable) elif IPython.version_info[0] >= 5: GLib.idle_add(self._write5, text, editable) def _write5(self, text, editable=False): """ Write given text to buffer @param text: Text to append. @type text: list of (token: string) @param editable: If true, added text is editable. @type editable: boolean """ start_mark = self.text_buffer.create_mark(None, self.text_buffer.get_end_iter(), True) for token, segment in text: tag = self.style_dict[token] self.text_buffer.insert_with_tags_by_name(self.text_buffer.get_end_iter(), segment, tag) if not editable: self.text_buffer.apply_tag_by_name('notouch', self.text_buffer.get_iter_at_mark(start_mark), self.text_buffer.get_end_iter()) self.text_buffer.delete_mark(start_mark) self.scroll_mark_onscreen(self.mark) def _write(self, text, editable=False): """ Write given text to buffer @param text: Text to append. @type text: string @param editable: If true, added text is editable. @type editable: boolean """ if type(text) == list and IPython.version_info[0] >= 5: self._write5(text, editable) return segments = self.color_pat.split(text) segment = segments.pop(0) start_mark = self.text_buffer.create_mark(None, self.text_buffer.get_end_iter(), True) self.text_buffer.insert(self.text_buffer.get_end_iter(), segment) if segments: ansi_tags = self.color_pat.findall(text) for tag in ansi_tags: i = segments.index(tag) self.text_buffer.insert_with_tags_by_name(self.text_buffer.get_end_iter(), segments[i+1], str(tag)) segments.pop(i) if not editable: self.text_buffer.apply_tag_by_name('notouch', self.text_buffer.get_iter_at_mark(start_mark), self.text_buffer.get_end_iter()) self.text_buffer.delete_mark(start_mark) self.scroll_mark_onscreen(self.mark) def showPrompt(self, prompt): GLib.idle_add(self._showPrompt, prompt) def _showPrompt(self, prompt): """ Print prompt at start of line @param prompt: Prompt to print. @type prompt: string """ self._write(prompt) self.text_buffer.move_mark(self.line_start, self.text_buffer.get_end_iter()) def changeLine(self, text): GLib.idle_add(self._changeLine, text) def _changeLine(self, text): """ Replace currently entered command line with given text @param text: Text to use as replacement. @type text: string """ iter_ = self.text_buffer.get_iter_at_mark(self.line_start) iter_.forward_to_line_end() self.text_buffer.delete(self.text_buffer.get_iter_at_mark(self.line_start), iter_) self._write(text, True) def getCurrentLine(self): """ Get text in current command line @return: Text of current command line. @rtype: string """ rv = self.text_buffer.get_slice( self.text_buffer.get_iter_at_mark(self.line_start), self.text_buffer.get_end_iter(), False) return rv def showReturned(self, text): GLib.idle_add(self._showReturned, text) def _showReturned(self, text): """ Show returned text from last command and print new prompt @param text: Text to show. @type text: string """ iter_ = self.text_buffer.get_iter_at_mark(self.line_start) iter_.forward_to_line_end() self.text_buffer.apply_tag_by_name( 'notouch', self.text_buffer.get_iter_at_mark(self.line_start), iter_) self._write('\n'+text) if text: self._write('\n') self._showPrompt(self.prompt) self.text_buffer.move_mark(self.line_start, self.text_buffer.get_end_iter()) self.text_buffer.place_cursor(self.text_buffer.get_end_iter()) if self.IP.rl_do_indent: indentation = self.IP.input_splitter.indent_spaces * ' ' self.text_buffer.insert_at_cursor(indentation) def onKeyPress(self, widget, event): """ Key press callback used for correcting behavior for console-like interfaces. For example 'home' should go to prompt, not to begining of line @param widget: Widget that key press accored in. @type widget: Gtk.Widget @param event: Event object @type event: Gdk.Event @return: Return True if event should not trickle. @rtype: boolean """ insert_mark = self.text_buffer.get_insert() insert_iter = self.text_buffer.get_iter_at_mark(insert_mark) selection_mark = self.text_buffer.get_selection_bound() selection_iter = self.text_buffer.get_iter_at_mark(selection_mark) start_iter = self.text_buffer.get_iter_at_mark(self.line_start) if event.keyval == Gdk.KEY_Home: if event.get_state() == 0: self.text_buffer.place_cursor(start_iter) return True elif event.get_state() == Gdk.ModifierType.SHIFT_MASK: self.text_buffer.move_mark(insert_mark, start_iter) return True elif event.keyval == Gdk.KEY_Left: insert_iter.backward_cursor_position() if not insert_iter.editable(True): return True elif not event.string: pass elif start_iter.compare(insert_iter) <= 0 and \ start_iter.compare(selection_iter) <= 0: pass elif start_iter.compare(insert_iter) > 0 and \ start_iter.compare(selection_iter) > 0: self.text_buffer.place_cursor(start_iter) elif insert_iter.compare(selection_iter) < 0: self.text_buffer.move_mark(insert_mark, start_iter) elif insert_iter.compare(selection_iter) > 0: self.text_buffer.move_mark(selection_mark, start_iter) return self.onKeyPressExtend(event) def onKeyPressExtend(self, event): """ For some reason we can't extend onKeyPress directly (bug #500900) """ pass class IPythonView(ConsoleView, IterableIPShell): ''' Sub-class of both modified IPython shell and L{ConsoleView} this makes a GTK+ IPython console. ''' def __init__(self): """ Initialize. Redirect I/O to console """ ConsoleView.__init__(self) self.cout = StringIO() IterableIPShell.__init__(self, cout=self.cout, cerr=self.cout, input_func=self.raw_input) if HAS_IPYTHON5: displayhook = MyPromptDisplayHook(shell=self.IP, view=self) self.IP.displayhook = displayhook self.IP.display_trap = DisplayTrap(hook=displayhook) # self.connect('key_press_event', self.keyPress) self.interrupt = False self.execute() self.prompt = self.generatePrompt(False) self.cout.truncate(0) self.showPrompt(self.prompt) def prompt_for_code(self): # IPython 5.0 calls prompt_for_code instead of raw_input return self.raw_input(self) def raw_input(self, prompt=''): """ Custom raw_input() replacement. Get's current line from console buffer @param prompt: Prompt to print. Here for compatability as replacement. @type prompt: string @return: The current command line text. @rtype: string """ if self.interrupt: self.interrupt = False raise KeyboardInterrupt return self.getCurrentLine() def onKeyPressExtend(self, event): """ Key press callback with plenty of shell goodness, like history, autocompletions, etc @param widget: Widget that key press occured in. @type widget: Gtk.Widget @param event: Event object. @type event: Gdk.Event @return: True if event should not trickle. @rtype: boolean """ if event.get_state() & Gdk.ModifierType.CONTROL_MASK and event.keyval == 99: self.interrupt = True self._processLine() return True elif event.keyval == Gdk.KEY_Return: self._processLine() return True elif event.keyval == Gdk.KEY_Up: self.changeLine(self.historyBack()) return True elif event.keyval == Gdk.KEY_Down: self.changeLine(self.historyForward()) return True elif event.keyval == Gdk.KEY_Tab: if not self.getCurrentLine().strip(): return False completed, possibilities = self.complete(self.getCurrentLine()) if len(possibilities) > 1: slice_ = self.getCurrentLine() self.write('\n') for symbol in possibilities: self.write(symbol+'\n') self.showPrompt(self.prompt) self.changeLine(completed or slice_) return True def _processLine(self): """ Process current command line """ self.history_pos = 0 self.execute() rv = self.cout.getvalue() if rv: rv = rv.strip('\n') self.showReturned(rv) self.cout.truncate(0) self.cout.seek(0) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/dialog_messages.py000066400000000000000000000136351326020644600255020ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2017 Philipp Hörist # # This file is part of Gajim. # # Gajim 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. # # Gajim 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 Gajim. If not, see . from collections import namedtuple from gi.repository import GLib from gajim.common.app import app from gajim.dialogs import ErrorDialog from gajim.dialogs import InformationDialog Message = namedtuple('Message', ['title', 'text', 'dialog']) messages = { 'start-chat-not-connected': Message( _('You are not connected to the server'), _('You can not start a new conversation unless you are connected.'), ErrorDialog), 'invalid-jid-with-error': Message( _('Invalid JID'), '%s', ErrorDialog), 'invalid-jid': Message( _('Invalid JID'), _('It is not possible to send a message ' 'to %s, this JID is not valid.'), ErrorDialog), 'unread-events-on-remove-account': Message( _('Unread events'), _('Read all pending events before removing this account.'), ErrorDialog), 'connected-on-disable-account': Message( _('You are currently connected to the server'), _('To disable the account, you must be disconnected.'), ErrorDialog), 'invalid-form': Message( _('Invalid Form'), _('The form is not filled correctly.'), ErrorDialog), 'join-while-invisible': Message( _('Invisible'), _('You cannot join a group chat while you are invisible'), ErrorDialog), 'not-connected-while-sending': Message( _('A connection is not available'), _('Your message can not be sent until you are connected.'), ErrorDialog), 'jid-in-list': Message( _('JID already in list'), _('The JID you entered is already in the list. Choose another one.'), ErrorDialog), 'invalid-answer': Message( _('Invalid answer'), _('Transport %(name)s answered wrongly to ' 'register request: %(error)s'), ErrorDialog), 'invalid-custom-hostname': Message( _('Wrong Custom Hostname'), _('Wrong custom hostname "%s". Ignoring it.'), ErrorDialog), 'privacy-list-error': Message( _('Error while removing privacy list'), _('Privacy list %s has not been removed. ' 'It is maybe active in one of your connected resources. ' 'Deactivate it and try again.'), ErrorDialog), 'invisibility-not-supported': Message( _('Invisibility not supported'), _('Account %s doesn\'t support invisibility.'), ErrorDialog), 'unregister-error': Message( _('Unregister failed'), _('Unregistration with server %(server)s failed: %(error)s'), ErrorDialog), 'agent-register-success': Message( _('Registration succeeded'), _('Registration with agent %s succeeded'), InformationDialog), 'agent-register-error': Message( _('Registration failed'), _('Registration with agent %(agent)s failed with error %(error)s: ' '%(error_msg)s'), ErrorDialog), 'unable-join-groupchat': Message( _('Unable to join Groupchat'), '%s', ErrorDialog), 'gstreamer-error': Message( _('GStreamer error'), _('Error: %(error)s\nDebug: %(debug)s'), ErrorDialog), 'wrong-host': Message( _('Wrong host'), _('Invalid local address? :-O'), ErrorDialog), 'avahi-error': Message( _('Avahi error'), _('%s\nLink-local messaging might not work properly.'), ErrorDialog), 'request-upload-slot-error': Message( _('Could not request upload slot'), '%s', ErrorDialog), 'request-upload-slot-error2': Message( _('Could not request upload slot'), _('Got unexpected response from server (see log)'), ErrorDialog), 'open-file-error': Message( _('Could not open file'), _('Exception raised while opening file (see log)'), ErrorDialog), 'open-file-error2': Message( _('Could not open file'), '%s', ErrorDialog), 'unsecure-error': Message( _('Unsecure'), _('Server returned unsecure transport (http)'), ErrorDialog), 'httpupload-response-error': Message( _('Could not upload file'), _('HTTP response code from server: %s'), ErrorDialog), 'httpupload-error': Message( _('Upload Error'), '%s', ErrorDialog), 'httpupload-encryption-not-available': Message( _('Encryption Error'), _('For the choosen encryption is no encryption method available'), ErrorDialog), } def get_dialog(name, *args, **kwargs): message = messages.get(name, None) if message is None: raise ValueError('Dialog %s does not exist' % name) # Set transient window transient_for = kwargs.get('transient_for', None) if transient_for is None: transient_for = app.get_active_window() else: del kwargs['transient_for'] if args: message_text = message.text % args elif kwargs: message_text = message.text % kwargs else: message_text = message.text dialog = message.dialog(message.title, GLib.markup_escape_text(message_text), transient_for=transient_for) return dialog gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/dialogs.py000066400000000000000000006550231326020644600240010ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## src/dialogs.py ## ## Copyright (C) 2003-2005 Vincent Hanquez ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2005 Alex Mauer ## Copyright (C) 2005-2006 Dimitur Kirov ## Travis Shirk ## Copyright (C) 2005-2008 Nikos Kouremenos ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2007 Lukas Petrovicky ## Copyright (C) 2007-2008 Brendan Taylor ## Julien Pivotto ## Stephan Erb ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GdkPixbuf from gi.repository import GObject from gi.repository import GLib from gi.repository import Pango import os import nbxmpp import time import locale from gajim import gtkgui_helpers from gajim import vcard from gajim import conversation_textview from gajim import dataforms_widget from random import randrange from gajim.common import pep from gajim.common import ged from gajim.common import const from gajim.options_dialog import OptionsDialog from gajim.common.const import Option, OptionKind, OptionType from gajim.common import app from gajim.common import helpers from gajim.common import i18n from gajim.common import dataforms from gajim.common.const import AvatarSize from gajim.common.caps_cache import muc_caps_cache from gajim.common.exceptions import GajimGeneralException from gajim.common.connection_handlers_events import MessageOutgoingEvent if app.HAVE_SPELL: from gi.repository import Gspell import logging log = logging.getLogger('gajim.dialogs') class EditGroupsDialog: """ Class for the edit group dialog window """ def __init__(self, list_): """ list_ is a list of (contact, account) tuples """ self.xml = gtkgui_helpers.get_gtk_builder('edit_groups_dialog.ui') self.dialog = self.xml.get_object('edit_groups_dialog') self.dialog.set_transient_for(app.interface.roster.window) self.list_ = list_ self.changes_made = False self.treeview = self.xml.get_object('groups_treeview') if len(list_) == 1: contact = list_[0][0] self.xml.get_object('nickname_label').set_markup( _('Contact name: %s') % contact.get_shown_name()) self.xml.get_object('jid_label').set_markup( _('JID: %s') % contact.jid) else: self.xml.get_object('nickname_label').set_no_show_all(True) self.xml.get_object('nickname_label').hide() self.xml.get_object('jid_label').set_no_show_all(True) self.xml.get_object('jid_label').hide() self.xml.connect_signals(self) self.init_list() self.dialog.show_all() if self.changes_made: for (contact, account) in self.list_: app.connections[account].update_contact(contact.jid, contact.name, contact.groups) def on_edit_groups_dialog_response(self, widget, response_id): if response_id == Gtk.ResponseType.CLOSE: self.dialog.destroy() def remove_group(self, group): """ Remove group group from all contacts and all their brothers """ for (contact, account) in self.list_: app.interface.roster.remove_contact_from_groups(contact.jid, account, [group]) # FIXME: Ugly workaround. app.interface.roster.draw_group(_('General'), account) def add_group(self, group): """ Add group group to all contacts and all their brothers """ for (contact, account) in self.list_: app.interface.roster.add_contact_to_groups(contact.jid, account, [group]) # FIXME: Ugly workaround. # Maybe we haven't been in any group (defaults to General) app.interface.roster.draw_group(_('General'), account) def on_add_button_clicked(self, widget): group = self.xml.get_object('group_entry').get_text() if not group: return # Do not allow special groups if group in helpers.special_groups: return # check if it already exists model = self.treeview.get_model() iter_ = model.get_iter_first() while iter_: if model.get_value(iter_, 0) == group: return iter_ = model.iter_next(iter_) self.changes_made = True model.append((group, True, False)) self.add_group(group) self.init_list() # Re-draw list to sort new item def group_toggled_cb(self, cell, path): self.changes_made = True model = self.treeview.get_model() if model[path][2]: model[path][2] = False model[path][1] = True else: model[path][1] = not model[path][1] group = model[path][0] if model[path][1]: self.add_group(group) else: self.remove_group(group) def init_list(self): store = Gtk.ListStore(str, bool, bool) self.treeview.set_model(store) for column in self.treeview.get_columns(): # Clear treeview when re-drawing self.treeview.remove_column(column) accounts = [] # Store groups in a list so we can sort them and the number of contacts in # it groups = {} for (contact, account) in self.list_: if account not in accounts: accounts.append(account) for g in app.groups[account].keys(): if g in groups: continue groups[g] = 0 c_groups = contact.groups for g in c_groups: groups[g] += 1 group_list = [] # Remove special groups if they are empty for group in groups: if group not in helpers.special_groups or groups[group] > 0: group_list.append(group) group_list.sort() for group in group_list: iter_ = store.append() store.set(iter_, 0, group) # Group name if groups[group] == 0: store.set(iter_, 1, False) else: store.set(iter_, 1, True) if groups[group] == len(self.list_): # all contacts are in this group store.set(iter_, 2, False) else: store.set(iter_, 2, True) column = Gtk.TreeViewColumn(_('Group')) column.set_expand(True) self.treeview.append_column(column) renderer = Gtk.CellRendererText() column.pack_start(renderer, True) column.add_attribute(renderer, 'text', 0) column = Gtk.TreeViewColumn(_('In the group')) column.set_expand(False) self.treeview.append_column(column) renderer = Gtk.CellRendererToggle() column.pack_start(renderer, True) renderer.set_property('activatable', True) renderer.connect('toggled', self.group_toggled_cb) column.add_attribute(renderer, 'active', 1) column.add_attribute(renderer, 'inconsistent', 2) class PassphraseDialog: """ Class for Passphrase dialog """ def __init__(self, titletext, labeltext, checkbuttontext=None, ok_handler=None, cancel_handler=None, transient_for=None): self.xml = gtkgui_helpers.get_gtk_builder('passphrase_dialog.ui') self.window = self.xml.get_object('passphrase_dialog') self.passphrase_entry = self.xml.get_object('passphrase_entry') self.passphrase = -1 self.window.set_title(titletext) self.xml.get_object('message_label').set_text(labeltext) self.ok = False self.cancel_handler = cancel_handler self.ok_handler = ok_handler okbutton = self.xml.get_object('ok_button') okbutton.connect('clicked', self.on_okbutton_clicked) cancelbutton = self.xml.get_object('cancel_button') cancelbutton.connect('clicked', self.on_cancelbutton_clicked) self.xml.connect_signals(self) if transient_for is None: transient_for = app.app.get_active_window() self.window.set_transient_for(transient_for) self.window.show_all() self.check = bool(checkbuttontext) checkbutton = self.xml.get_object('save_passphrase_checkbutton') if self.check: checkbutton.set_label(checkbuttontext) else: checkbutton.hide() def on_okbutton_clicked(self, widget): if not self.ok_handler: return passph = self.passphrase_entry.get_text() if self.check: checked = self.xml.get_object('save_passphrase_checkbutton').\ get_active() else: checked = False self.ok = True self.window.destroy() if isinstance(self.ok_handler, tuple): self.ok_handler[0](passph, checked, *self.ok_handler[1:]) else: self.ok_handler(passph, checked) def on_cancelbutton_clicked(self, widget): self.window.destroy() def on_passphrase_dialog_destroy(self, widget): if self.cancel_handler and not self.ok: self.cancel_handler() class ChooseGPGKeyDialog: """ Class for GPG key dialog """ def __init__(self, title_text, prompt_text, secret_keys, on_response, selected=None, transient_for=None): '''secret_keys : {keyID: userName, ...}''' self.on_response = on_response xml = gtkgui_helpers.get_gtk_builder('choose_gpg_key_dialog.ui') self.window = xml.get_object('choose_gpg_key_dialog') self.window.set_title(title_text) self.window.set_transient_for(transient_for) self.keys_treeview = xml.get_object('keys_treeview') prompt_label = xml.get_object('prompt_label') prompt_label.set_text(prompt_text) model = Gtk.ListStore(str, str) model.set_sort_func(1, self.sort_keys) model.set_sort_column_id(1, Gtk.SortType.ASCENDING) self.keys_treeview.set_model(model) #columns renderer = Gtk.CellRendererText() self.keys_treeview.insert_column_with_attributes(-1, _('KeyID'), renderer, text=0) col = self.keys_treeview.get_column(0) col.set_sort_column_id(0) renderer = Gtk.CellRendererText() self.keys_treeview.insert_column_with_attributes(-1, _('Contact name'), renderer, text=1) col = self.keys_treeview.get_column(1) col.set_sort_column_id(1) self.keys_treeview.set_search_column(1) self.fill_tree(secret_keys, selected) self.window.connect('response', self.on_dialog_response) self.window.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) self.window.show_all() def sort_keys(self, model, iter1, iter2, data=None): value1 = model[iter1][1] value2 = model[iter2][1] if value1 == _('None'): return -1 elif value2 == _('None'): return 1 elif value1 < value2: return -1 return 1 def on_dialog_response(self, dialog, response): selection = self.keys_treeview.get_selection() (model, iter_) = selection.get_selected() if iter_ and response == Gtk.ResponseType.OK: keyID = [ model[iter_][0], model[iter_][1] ] else: keyID = None self.on_response(keyID) self.window.destroy() def fill_tree(self, list_, selected): model = self.keys_treeview.get_model() for keyID in list_.keys(): iter_ = model.append((keyID, list_[keyID])) if keyID == selected: path = model.get_path(iter_) self.keys_treeview.set_cursor(path) class ChangeActivityDialog: PAGELIST = ['doing_chores', 'drinking', 'eating', 'exercising', 'grooming', 'having_appointment', 'inactive', 'relaxing', 'talking', 'traveling', 'working'] def __init__(self, on_response, activity=None, subactivity=None, text=''): self.on_response = on_response self.activity = activity self.subactivity = subactivity self.text = text self.xml = gtkgui_helpers.get_gtk_builder('change_activity_dialog.ui') self.window = self.xml.get_object('change_activity_dialog') self.window.set_transient_for(app.interface.roster.window) self.checkbutton = self.xml.get_object('enable_checkbutton') self.notebook = self.xml.get_object('notebook') self.entry = self.xml.get_object('description_entry') rbtns = {} group = None for category in pep.ACTIVITIES: item = self.xml.get_object(category + '_image') item.set_from_pixbuf( gtkgui_helpers.load_activity_icon(category).get_pixbuf()) item.set_tooltip_text(pep.ACTIVITIES[category]['category']) vbox = self.xml.get_object(category + '_vbox') vbox.set_border_width(5) # Other act = category + '_other' if group: rbtns[act] = Gtk.RadioButton() rbtns[act].join_group(group) else: rbtns[act] = group = Gtk.RadioButton() hbox = Gtk.HBox(homogeneous=False, spacing=5) hbox.pack_start(gtkgui_helpers.load_activity_icon(category, activity), False, False, 0) lbl = Gtk.Label(label='' + pep.ACTIVITIES[category]['category'] \ + '') lbl.set_use_markup(True) hbox.pack_start(lbl, False, False, 0) rbtns[act].add(hbox) rbtns[act].connect('toggled', self.on_rbtn_toggled, [category, 'other']) vbox.pack_start(rbtns[act], False, False, 0) activities = [] for activity in pep.ACTIVITIES[category]: activities.append(activity) activities.sort() for activity in activities: if activity == 'category': continue act = category + '_' + activity if group: rbtns[act] = Gtk.RadioButton() rbtns[act].join_group(group) else: rbtns[act] = group = Gtk.RadioButton() hbox = Gtk.HBox(homogeneous=False, spacing=5) hbox.pack_start(gtkgui_helpers.load_activity_icon(category, activity), False, False, 0) hbox.pack_start(Gtk.Label(label=pep.ACTIVITIES[category][activity]), False, False, 0) rbtns[act].connect('toggled', self.on_rbtn_toggled, [category, activity]) rbtns[act].add(hbox) vbox.pack_start(rbtns[act], False, False, 0) self.default_radio = rbtns['doing_chores_other'] if self.activity in pep.ACTIVITIES: if not self.subactivity in pep.ACTIVITIES[self.activity]: self.subactivity = 'other' rbtns[self.activity + '_' + self.subactivity].set_active(True) self.checkbutton.set_active(True) self.notebook.set_sensitive(True) self.entry.set_sensitive(True) self.notebook.set_current_page( self.PAGELIST.index(self.activity)) self.entry.set_text(text) else: self.checkbutton.set_active(False) self.xml.connect_signals(self) self.window.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) self.window.show_all() def on_enable_checkbutton_toggled(self, widget): self.notebook.set_sensitive(widget.get_active()) self.entry.set_sensitive(widget.get_active()) if not self.activity: self.default_radio.set_active(True) def on_rbtn_toggled(self, widget, data): if widget.get_active(): self.activity = data[0] self.subactivity = data[1] def on_ok_button_clicked(self, widget): """ Return activity and messsage (None if no activity selected) """ if self.checkbutton.get_active(): self.on_response(self.activity, self.subactivity, self.entry.get_text()) else: self.on_response(None, None, '') self.window.destroy() def on_cancel_button_clicked(self, widget): self.window.destroy() class ChangeMoodDialog: COLS = 11 def __init__(self, on_response, mood=None, text=''): self.on_response = on_response self.mood = mood self.text = text self.xml = gtkgui_helpers.get_gtk_builder('change_mood_dialog.ui') self.window = self.xml.get_object('change_mood_dialog') self.window.set_transient_for(app.interface.roster.window) self.window.set_title(_('Set Mood')) table = self.xml.get_object('mood_icons_table') self.label = self.xml.get_object('mood_label') self.entry = self.xml.get_object('description_entry') no_mood_button = self.xml.get_object('no_mood_button') no_mood_button.set_mode(False) no_mood_button.connect('clicked', self.on_mood_button_clicked, None) x = 1 y = 0 self.mood_buttons = {} # Order them first self.MOODS = [] for mood in pep.MOODS: self.MOODS.append(mood) self.MOODS.sort() for mood in self.MOODS: self.mood_buttons[mood] = Gtk.RadioButton() self.mood_buttons[mood].join_group(no_mood_button) self.mood_buttons[mood].set_mode(False) self.mood_buttons[mood].add(gtkgui_helpers.load_mood_icon(mood)) self.mood_buttons[mood].set_relief(Gtk.ReliefStyle.NONE) self.mood_buttons[mood].set_tooltip_text(pep.MOODS[mood]) self.mood_buttons[mood].connect('clicked', self.on_mood_button_clicked, mood) table.attach(self.mood_buttons[mood], x, y, 1, 1) # Calculate the next position x += 1 if x >= self.COLS: x = 0 y += 1 if self.mood in pep.MOODS: self.mood_buttons[self.mood].set_active(True) self.label.set_text(pep.MOODS[self.mood]) self.entry.set_sensitive(True) if self.text: self.entry.set_text(self.text) else: self.label.set_text(_('None')) self.entry.set_text('') self.entry.set_sensitive(False) self.xml.connect_signals(self) self.window.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) self.window.show_all() def on_mood_button_clicked(self, widget, data): if data: self.label.set_text(pep.MOODS[data]) self.entry.set_sensitive(True) else: self.label.set_text(_('None')) self.entry.set_text('') self.entry.set_sensitive(False) self.mood = data def on_ok_button_clicked(self, widget): '''Return mood and messsage (None if no mood selected)''' message = self.entry.get_text() self.on_response(self.mood, message) self.window.destroy() def on_cancel_button_clicked(self, widget): self.window.destroy() class TimeoutDialog: """ Class designed to be derivated to create timeout'd dialogs (dialogs that closes automatically after a timeout) """ def __init__(self, timeout): self.countdown_left = timeout self.countdown_enabled = True self.title_text = '' def run_timeout(self): if self.countdown_left > 0: self.countdown() GLib.timeout_add_seconds(1, self.countdown) def on_timeout(self): """ To be implemented in derivated classes """ pass def countdown(self): if self.countdown_enabled: if self.countdown_left <= 0: self.on_timeout() return False self.dialog.set_title('%s [%s]' % (self.title_text, str(self.countdown_left))) self.countdown_left -= 1 return True else: self.dialog.set_title(self.title_text) return False class ChangeStatusMessageDialog(TimeoutDialog): def __init__(self, on_response, show=None, show_pep=True): countdown_time = app.config.get('change_status_window_timeout') TimeoutDialog.__init__(self, countdown_time) self.show = show self.pep_dict = {} self.show_pep = show_pep self.on_response = on_response self.xml = gtkgui_helpers.get_gtk_builder('change_status_message_dialog.ui') self.dialog = self.xml.get_object('change_status_message_dialog') self.dialog.set_transient_for(app.interface.roster.window) msg = None if show: uf_show = helpers.get_uf_show(show) self.title_text = _('%s Status Message') % uf_show msg = app.config.get_per('statusmsg', '_last_' + self.show, 'message') self.pep_dict['activity'] = app.config.get_per('statusmsg', '_last_' + self.show, 'activity') self.pep_dict['subactivity'] = app.config.get_per('statusmsg', '_last_' + self.show, 'subactivity') self.pep_dict['activity_text'] = app.config.get_per('statusmsg', '_last_' + self.show, 'activity_text') self.pep_dict['mood'] = app.config.get_per('statusmsg', '_last_' + self.show, 'mood') self.pep_dict['mood_text'] = app.config.get_per('statusmsg', '_last_' + self.show, 'mood_text') else: self.title_text = _('Status Message') self.dialog.set_title(self.title_text) message_textview = self.xml.get_object('message_textview') self.message_buffer = message_textview.get_buffer() self.message_buffer.connect('changed', self.on_message_buffer_changed) if not msg: msg = '' msg = helpers.from_one_line(msg) self.message_buffer.set_text(msg) # have an empty string selectable, so user can clear msg self.preset_messages_dict = {'': ['', '', '', '', '', '']} for msg_name in app.config.get_per('statusmsg'): if msg_name.startswith('_last_'): continue opts = [] for opt in ['message', 'activity', 'subactivity', 'activity_text', 'mood', 'mood_text']: opts.append(app.config.get_per('statusmsg', msg_name, opt)) opts[0] = helpers.from_one_line(opts[0]) self.preset_messages_dict[msg_name] = opts sorted_keys_list = helpers.get_sorted_keys(self.preset_messages_dict) self.message_liststore = Gtk.ListStore(str) # msg_name self.message_combobox = self.xml.get_object('message_combobox') self.message_combobox.set_model(self.message_liststore) cellrenderertext = Gtk.CellRendererText() self.message_combobox.pack_start(cellrenderertext, True) self.message_combobox.add_attribute(cellrenderertext, 'text', 0) for msg_name in sorted_keys_list: self.message_liststore.append((msg_name,)) if show_pep: self.draw_activity() self.draw_mood() else: # remove acvtivity / mood lines self.xml.get_object('activity_label').set_no_show_all(True) self.xml.get_object('activity_button').set_no_show_all(True) self.xml.get_object('mood_label').set_no_show_all(True) self.xml.get_object('mood_button').set_no_show_all(True) self.xml.get_object('activity_label').hide() self.xml.get_object('activity_button').hide() self.xml.get_object('mood_label').hide() self.xml.get_object('mood_button').hide() self.xml.connect_signals(self) self.run_timeout() self.dialog.connect('response', self.on_dialog_response) self.dialog.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) self.dialog.show_all() def draw_activity(self): """ Set activity button """ img = self.xml.get_object('activity_image') label = self.xml.get_object('activity_button_label') if 'activity' in self.pep_dict and self.pep_dict['activity'] in \ pep.ACTIVITIES: if 'subactivity' in self.pep_dict and self.pep_dict['subactivity'] \ in pep.ACTIVITIES[self.pep_dict['activity']]: img.set_from_pixbuf(gtkgui_helpers.load_activity_icon( self.pep_dict['activity'], self.pep_dict['subactivity']).\ get_pixbuf()) else: img.set_from_pixbuf(gtkgui_helpers.load_activity_icon( self.pep_dict['activity']).get_pixbuf()) if self.pep_dict['activity_text']: label.set_text(self.pep_dict['activity_text']) else: label.set_text('') else: img.set_from_pixbuf(None) label.set_text('') def draw_mood(self): """ Set mood button """ img = self.xml.get_object('mood_image') label = self.xml.get_object('mood_button_label') if 'mood' in self.pep_dict and self.pep_dict['mood'] in pep.MOODS: img.set_from_pixbuf(gtkgui_helpers.load_mood_icon( self.pep_dict['mood']).get_pixbuf()) if self.pep_dict['mood_text']: label.set_text(self.pep_dict['mood_text']) else: label.set_text('') else: img.set_from_pixbuf(None) label.set_text('') def on_timeout(self): # Prevent GUI freeze when the combobox menu is opened on close self.message_combobox.popdown() self.dialog.response(Gtk.ResponseType.OK) def on_dialog_response(self, dialog, response): if response == Gtk.ResponseType.OK: beg, end = self.message_buffer.get_bounds() message = self.message_buffer.get_text(beg, end, True).strip() message = helpers.remove_invalid_xml_chars(message) msg = helpers.to_one_line(message) if self.show: app.config.set_per('statusmsg', '_last_' + self.show, 'message', msg) if self.show_pep: app.config.set_per('statusmsg', '_last_' + self.show, 'activity', self.pep_dict['activity']) app.config.set_per('statusmsg', '_last_' + self.show, 'subactivity', self.pep_dict['subactivity']) app.config.set_per('statusmsg', '_last_' + self.show, 'activity_text', self.pep_dict['activity_text']) app.config.set_per('statusmsg', '_last_' + self.show, 'mood', self.pep_dict['mood']) app.config.set_per('statusmsg', '_last_' + self.show, 'mood_text', self.pep_dict['mood_text']) else: message = None # user pressed Cancel button or X wm button self.dialog.destroy() self.on_response(message, self.pep_dict) def on_message_combobox_changed(self, widget): self.countdown_enabled = False model = widget.get_model() active = widget.get_active() if active < 0: return None name = model[active][0] self.message_buffer.set_text(self.preset_messages_dict[name][0]) self.pep_dict['activity'] = self.preset_messages_dict[name][1] self.pep_dict['subactivity'] = self.preset_messages_dict[name][2] self.pep_dict['activity_text'] = self.preset_messages_dict[name][3] self.pep_dict['mood'] = self.preset_messages_dict[name][4] self.pep_dict['mood_text'] = self.preset_messages_dict[name][5] self.draw_activity() self.draw_mood() def on_change_status_message_dialog_key_press_event(self, widget, event): self.countdown_enabled = False if event.keyval == Gdk.KEY_Return or \ event.keyval == Gdk.KEY_KP_Enter: # catch CTRL+ENTER if (event.get_state() & Gdk.ModifierType.CONTROL_MASK): self.dialog.response(Gtk.ResponseType.OK) # Stop the event return True def on_message_buffer_changed(self, widget): self.countdown_enabled = False self.toggle_sensitiviy_of_save_as_preset() def toggle_sensitiviy_of_save_as_preset(self): btn = self.xml.get_object('save_as_preset_button') if self.message_buffer.get_char_count() == 0: btn.set_sensitive(False) else: btn.set_sensitive(True) def on_save_as_preset_button_clicked(self, widget): self.countdown_enabled = False start_iter, finish_iter = self.message_buffer.get_bounds() status_message_to_save_as_preset = self.message_buffer.get_text( start_iter, finish_iter, True) def on_ok(msg_name): msg_text = status_message_to_save_as_preset msg_text_1l = helpers.to_one_line(msg_text) if not msg_name: # msg_name was '' msg_name = msg_text_1l def on_ok2(): self.preset_messages_dict[msg_name] = [ msg_text, self.pep_dict.get('activity'), self.pep_dict.get('subactivity'), self.pep_dict.get('activity_text'), self.pep_dict.get('mood'), self.pep_dict.get('mood_text')] app.config.set_per('statusmsg', msg_name, 'message', msg_text_1l) app.config.set_per('statusmsg', msg_name, 'activity', self.pep_dict.get('activity')) app.config.set_per('statusmsg', msg_name, 'subactivity', self.pep_dict.get('subactivity')) app.config.set_per('statusmsg', msg_name, 'activity_text', self.pep_dict.get('activity_text')) app.config.set_per('statusmsg', msg_name, 'mood', self.pep_dict.get('mood')) app.config.set_per('statusmsg', msg_name, 'mood_text', self.pep_dict.get('mood_text')) if msg_name in self.preset_messages_dict: ConfirmationDialog(_('Overwrite Status Message?'), _('This name is already used. Do you want to overwrite this ' 'status message?'), on_response_ok=on_ok2, transient_for=self.dialog) return app.config.add_per('statusmsg', msg_name) on_ok2() iter_ = self.message_liststore.append((msg_name,)) # select in combobox the one we just saved self.message_combobox.set_active_iter(iter_) InputDialog(_('Save as Preset Status Message'), _('Please type a name for this status message'), is_modal=False, ok_handler=on_ok) def on_activity_button_clicked(self, widget): self.countdown_enabled = False def on_response(activity, subactivity, text): self.pep_dict['activity'] = activity or '' self.pep_dict['subactivity'] = subactivity or '' self.pep_dict['activity_text'] = text self.draw_activity() ChangeActivityDialog(on_response, self.pep_dict['activity'], self.pep_dict['subactivity'], self.pep_dict['activity_text']) def on_mood_button_clicked(self, widget): self.countdown_enabled = False def on_response(mood, text): self.pep_dict['mood'] = mood or '' self.pep_dict['mood_text'] = text self.draw_mood() ChangeMoodDialog(on_response, self.pep_dict['mood'], self.pep_dict['mood_text']) class AddNewContactWindow: """ Class for AddNewContactWindow """ uid_labels = {'jabber': _('JID:'), 'aim': _('AIM Address:'), 'gadu-gadu': _('GG Number:'), 'icq': _('ICQ Number:'), 'msn': _('MSN Address:'), 'yahoo': _('Yahoo! Address:')} def __init__(self, account=None, jid=None, user_nick=None, group=None): self.account = account self.adding_jid = False if account is None: # fill accounts with active accounts accounts = [] for account in app.connections.keys(): if app.connections[account].connected > 1: accounts.append(account) if not accounts: return if len(accounts) == 1: self.account = account else: accounts = [self.account] if self.account: location = app.interface.instances[self.account] else: location = app.interface.instances if 'add_contact' in location: location['add_contact'].window.present() # An instance is already opened return location['add_contact'] = self self.xml = gtkgui_helpers.get_gtk_builder('add_new_contact_window.ui') self.xml.connect_signals(self) self.window = self.xml.get_object('add_new_contact_window') for w in ('account_combobox', 'account_hbox', 'account_label', 'uid_label', 'uid_entry', 'protocol_combobox', 'protocol_jid_combobox', 'protocol_hbox', 'nickname_entry', 'message_scrolledwindow', 'save_message_checkbutton', 'register_hbox', 'subscription_table', 'add_button', 'message_textview', 'connected_label', 'group_comboboxentry', 'auto_authorize_checkbutton'): self.__dict__[w] = self.xml.get_object(w) if account and len(app.connections) >= 2: self.default_desc = _('Please fill in the data of the contact you want ' 'to add to your account %s') % account else: self.default_desc = _('Please fill in the data of the contact you ' 'want to add') self.xml.get_object('prompt_label').set_markup(self.default_desc) self.agents = {'jabber': []} self.gateway_prompt = {} # types to which we are not subscribed but account has an agent for it self.available_types = [] for acct in accounts: for j in app.contacts.get_jid_list(acct): if app.jid_is_transport(j): type_ = app.get_transport_name_from_jid(j, False) if not type_: continue if type_ in self.agents: self.agents[type_].append(j) else: self.agents[type_] = [j] self.gateway_prompt[j] = {'desc': None, 'prompt': None} # Now add the one to which we can register for acct in accounts: for type_ in app.connections[acct].available_transports: if type_ in self.agents: continue self.agents[type_] = [] for jid_ in app.connections[acct].available_transports[type_]: if not jid_ in self.agents[type_]: self.agents[type_].append(jid_) self.gateway_prompt[jid_] = {'desc': None, 'prompt': None} self.available_types.append(type_) # Combobox with transport/jabber icons liststore = Gtk.ListStore(str, str, str) cell = Gtk.CellRendererPixbuf() self.protocol_combobox.pack_start(cell, False) self.protocol_combobox.add_attribute(cell, 'icon_name', 1) cell = Gtk.CellRendererText() cell.set_property('xpad', 5) self.protocol_combobox.pack_start(cell, True) self.protocol_combobox.add_attribute(cell, 'text', 0) self.protocol_combobox.set_model(liststore) uf_type = {'jabber': 'XMPP', 'aim': 'AIM', 'gadu-gadu': 'Gadu Gadu', 'icq': 'ICQ', 'msn': 'MSN', 'yahoo': 'Yahoo'} # Jabber as first online_icon = gtkgui_helpers.get_iconset_name_for('online') liststore.append(['XMPP', online_icon, 'jabber']) for type_ in self.agents: if type_ == 'jabber': continue if type_ in uf_type: liststore.append([uf_type[type_], type_ + '-online', type_]) else: liststore.append([type_, type_ + '-online', type_]) if account: for service in self.agents[type_]: app.connections[account].request_gateway_prompt(service) self.protocol_combobox.set_active(0) self.auto_authorize_checkbutton.show() liststore = Gtk.ListStore(str) self.protocol_jid_combobox.set_model(liststore) if jid: self.jid_escaped = True type_ = app.get_transport_name_from_jid(jid) if not type_: type_ = 'jabber' if type_ == 'jabber': self.uid_entry.set_text(jid) else: uid, transport = app.get_name_and_server_from_jid(jid) self.uid_entry.set_text(uid.replace('%', '@', 1)) # set protocol_combobox model = self.protocol_combobox.get_model() iter_ = model.get_iter_first() i = 0 while iter_: if model[iter_][2] == type_: self.protocol_combobox.set_active(i) break iter_ = model.iter_next(iter_) i += 1 # set protocol_jid_combobox self.protocol_jid_combobox.set_active(0) model = self.protocol_jid_combobox.get_model() iter_ = model.get_iter_first() i = 0 while iter_: if model[iter_][0] == transport: self.protocol_jid_combobox.set_active(i) break iter_ = model.iter_next(iter_) i += 1 if user_nick: self.nickname_entry.set_text(user_nick) self.nickname_entry.grab_focus() else: self.jid_escaped = False self.uid_entry.grab_focus() group_names = [] for acct in accounts: for g in app.groups[acct].keys(): if g not in helpers.special_groups and g not in group_names: group_names.append(g) group_names.sort() i = 0 for g in group_names: self.group_comboboxentry.append_text(g) if group == g: self.group_comboboxentry.set_active(i) i += 1 self.window.set_transient_for(app.interface.roster.window) self.window.show_all() if self.account: self.account_label.hide() self.account_hbox.hide() else: liststore = Gtk.ListStore(str, str) for acct in accounts: liststore.append([acct, acct]) self.account_combobox.set_model(liststore) self.account_combobox.set_active(0) if self.account: message_buffer = self.message_textview.get_buffer() msg = helpers.from_one_line(helpers.get_subscription_request_msg( self.account)) message_buffer.set_text(msg) app.ged.register_event_handler('gateway-prompt-received', ged.GUI1, self._nec_gateway_prompt_received) app.ged.register_event_handler('presence-received', ged.GUI1, self._nec_presence_received) def on_add_new_contact_window_destroy(self, widget): if self.account: location = app.interface.instances[self.account] else: location = app.interface.instances del location['add_contact'] app.ged.remove_event_handler('presence-received', ged.GUI1, self._nec_presence_received) app.ged.remove_event_handler('gateway-prompt-received', ged.GUI1, self._nec_gateway_prompt_received) def on_register_button_clicked(self, widget): model = self.protocol_jid_combobox.get_model() row = self.protocol_jid_combobox.get_active() jid = model[row][0] app.connections[self.account].request_register_agent_info(jid) def on_add_new_contact_window_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: # ESCAPE self.window.destroy() def on_cancel_button_clicked(self, widget): """ When Cancel button is clicked """ self.window.destroy() def on_add_button_clicked(self, widget): """ When Subscribe button is clicked """ jid = self.uid_entry.get_text().strip() if not jid: return model = self.protocol_combobox.get_model() row = self.protocol_combobox.get_active_iter() type_ = model[row][2] if type_ != 'jabber': model = self.protocol_jid_combobox.get_model() row = self.protocol_jid_combobox.get_active() transport = model[row][0] if self.account and not self.jid_escaped: self.adding_jid = (jid, transport, type_) app.connections[self.account].request_gateway_prompt( transport, jid) else: jid = jid.replace('@', '%') + '@' + transport self._add_jid(jid, type_) else: self._add_jid(jid, type_) def _add_jid(self, jid, type_): # check if jid is conform to RFC and stringprep it try: jid = helpers.parse_jid(jid) except helpers.InvalidFormat as s: pritext = _('Invalid User ID') ErrorDialog(pritext, str(s)) return # No resource in jid if jid.find('/') >= 0: pritext = _('Invalid User ID') ErrorDialog(pritext, _('The user ID must not contain a resource.')) return if jid == app.get_jid_from_account(self.account): pritext = _('Invalid User ID') ErrorDialog(pritext, _('You cannot add yourself to your roster.')) return nickname = self.nickname_entry.get_text() or '' # get value of account combobox, if account was not specified if not self.account: model = self.account_combobox.get_model() index = self.account_combobox.get_active() self.account = model[index][1] # Check if jid is already in roster if jid in app.contacts.get_jid_list(self.account): c = app.contacts.get_first_contact_from_jid(self.account, jid) if _('Not in Roster') not in c.groups and c.sub in ('both', 'to'): ErrorDialog(_('Contact already in roster'), _('This contact is already listed in your roster.')) return if type_ == 'jabber': message_buffer = self.message_textview.get_buffer() start_iter = message_buffer.get_start_iter() end_iter = message_buffer.get_end_iter() message = message_buffer.get_text(start_iter, end_iter, True) if self.save_message_checkbutton.get_active(): msg = helpers.to_one_line(message) app.config.set_per('accounts', self.account, 'subscription_request_msg', msg) else: message= '' group = self.group_comboboxentry.get_child().get_text() groups = [] if group: groups = [group] auto_auth = self.auto_authorize_checkbutton.get_active() app.interface.roster.req_sub(self, jid, message, self.account, groups=groups, nickname=nickname, auto_auth=auto_auth) self.window.destroy() def on_account_combobox_changed(self, widget): model = widget.get_model() iter_ = widget.get_active_iter() account = model[iter_][0] message_buffer = self.message_textview.get_buffer() message_buffer.set_text(helpers.get_subscription_request_msg(account)) def on_protocol_jid_combobox_changed(self, widget): model = widget.get_model() iter_ = widget.get_active_iter() if not iter_: return jid_ = model[iter_][0] model = self.protocol_combobox.get_model() iter_ = self.protocol_combobox.get_active_iter() type_ = model[iter_][2] desc = None if self.agents[type_] and jid_ in self.gateway_prompt: desc = self.gateway_prompt[jid_]['desc'] if not desc: desc = self.default_desc self.xml.get_object('prompt_label').set_markup(desc) prompt = None if self.agents[type_] and jid_ in self.gateway_prompt: prompt = self.gateway_prompt[jid_]['prompt'] if not prompt: if type_ in self.uid_labels: prompt = self.uid_labels[type_] else: prompt = _('User ID:') self.uid_label.set_text(prompt) def on_protocol_combobox_changed(self, widget): model = widget.get_model() iter_ = widget.get_active_iter() type_ = model[iter_][2] model = self.protocol_jid_combobox.get_model() model.clear() if len(self.agents[type_]): for jid_ in self.agents[type_]: model.append([jid_]) self.protocol_jid_combobox.set_active(0) desc = None if self.agents[type_]: jid_ = self.agents[type_][0] if jid_ in self.gateway_prompt: desc = self.gateway_prompt[jid_]['desc'] if not desc: desc = self.default_desc self.xml.get_object('prompt_label').set_markup(desc) if len(self.agents[type_]) > 1: self.protocol_jid_combobox.show() else: self.protocol_jid_combobox.hide() prompt = None if self.agents[type_]: jid_ = self.agents[type_][0] if jid_ in self.gateway_prompt: prompt = self.gateway_prompt[jid_]['prompt'] if not prompt: if type_ in self.uid_labels: prompt = self.uid_labels[type_] else: prompt = _('User ID:') self.uid_label.set_text(prompt) if type_ == 'jabber': self.message_scrolledwindow.show() self.save_message_checkbutton.show() else: self.message_scrolledwindow.hide() self.save_message_checkbutton.hide() if type_ in self.available_types: self.register_hbox.show() self.auto_authorize_checkbutton.hide() self.connected_label.hide() self.subscription_table.hide() self.add_button.set_sensitive(False) else: self.register_hbox.hide() if type_ != 'jabber': model = self.protocol_jid_combobox.get_model() row = self.protocol_jid_combobox.get_active() jid = model[row][0] contact = app.contacts.get_first_contact_from_jid( self.account, jid) if contact.show in ('offline', 'error'): self.subscription_table.hide() self.connected_label.show() self.add_button.set_sensitive(False) self.auto_authorize_checkbutton.hide() return self.subscription_table.show() self.auto_authorize_checkbutton.show() self.connected_label.hide() self.add_button.set_sensitive(True) def transport_signed_in(self, jid): model = self.protocol_jid_combobox.get_model() row = self.protocol_jid_combobox.get_active() _jid = model[row][0] if _jid == jid: self.register_hbox.hide() self.connected_label.hide() self.subscription_table.show() self.auto_authorize_checkbutton.show() self.add_button.set_sensitive(True) def transport_signed_out(self, jid): model = self.protocol_jid_combobox.get_model() row = self.protocol_jid_combobox.get_active() _jid = model[row][0] if _jid == jid: self.subscription_table.hide() self.auto_authorize_checkbutton.hide() self.connected_label.show() self.add_button.set_sensitive(False) def _nec_presence_received(self, obj): if app.jid_is_transport(obj.jid): if obj.old_show == 0 and obj.new_show > 1: self.transport_signed_in(obj.jid) elif obj.old_show > 1 and obj.new_show == 0: self.transport_signed_out(obj.jid) def _nec_gateway_prompt_received(self, obj): if self.adding_jid: jid, transport, type_ = self.adding_jid if obj.stanza.getError(): ErrorDialog(_('Error while adding transport contact'), _('This error occured while adding a contact for transport ' '%(transport)s:\n\n%(error)s') % {'transport': transport, 'error': obj.stanza.getErrorMsg()}) return if obj.prompt_jid: self._add_jid(obj.prompt_jid, type_) else: jid = jid.replace('@', '%') + '@' + transport self._add_jid(jid, type_) elif obj.jid in self.gateway_prompt: if obj.desc: self.gateway_prompt[obj.jid]['desc'] = obj.desc if obj.prompt: self.gateway_prompt[obj.jid]['prompt'] = obj.prompt class AboutDialog(Gtk.AboutDialog): def __init__(self): Gtk.AboutDialog.__init__(self) self.set_transient_for(app.interface.roster.window) self.set_name('Gajim') self.set_version(app.version) self.set_copyright('Copyright © 2003-2018 Gajim Team') self.set_license_type(Gtk.License.GPL_3_0_ONLY) self.set_website('https://gajim.org/') gtk_ver = '%i.%i.%i' % ( Gtk.get_major_version(), Gtk.get_minor_version(), Gtk.get_micro_version()) gobject_ver = '.'.join(map(str, GObject.pygobject_version)) comments = [] comments.append(_('A GTK+ XMPP client')) comments.append(_('GTK+ Version: %s' % gtk_ver)) comments.append(_('PyGObject Version: %s') % gobject_ver) comments.append(_('python-nbxmpp Version: %s') % nbxmpp.__version__) self.set_comments("\n".join(comments)) self.add_credit_section(_('Current Developers'), const.DEVS_CURRENT) self.add_credit_section(_('Past Developers'), const.DEVS_PAST) self.add_credit_section(_('Artists'), const.ARTISTS) thanks = const.THANKS[:] thanks.append('') thanks.append(_('Last but not least')) thanks.append(_('we would like to thank all the package maintainers.')) self.add_credit_section(_('Thanks'), thanks) self.set_translator_credits(_('translator-credits')) self.set_logo_icon_name('org.gajim.Gajim') self.connect( 'response', lambda dialog, *args: Gtk.AboutDialog.do_close(dialog)) self.show_all() # GTK Bug, We have to manually hide the License Button # Bug exists only on Windows if os.name == 'nt': self.get_action_area().get_children()[1].hide() class Dialog(Gtk.Dialog): def __init__(self, parent, title, buttons, default=None, on_response_ok=None, on_response_cancel=None): Gtk.Dialog.__init__(self, title, parent, Gtk.DialogFlags.DESTROY_WITH_PARENT) self.user_response_ok = on_response_ok self.user_response_cancel = on_response_cancel self.set_border_width(6) self.get_content_area().set_spacing(12) self.set_resizable(False) for stock, response in buttons: b = self.add_button(stock, response) if default is not None: self.set_default_response(default) else: self.set_default_response(buttons[-1][1]) self.connect('response', self.on_response) def on_response(self, widget, response_id): if response_id == Gtk.ResponseType.OK: if self.user_response_ok: if isinstance(self.user_response_ok, tuple): self.user_response_ok[0](*self.user_response_ok[1:]) else: self.user_response_ok() self.destroy() elif response_id == Gtk.ResponseType.CANCEL: if self.user_response_cancel: if isinstance(self.user_response_cancel, tuple): self.user_response_cancel[0](*self.user_response_ok[1:]) else: self.user_response_cancel() self.destroy() def just_destroy(self, widget): self.destroy() def get_button(self, index): buttons = self.get_action_area().get_children() return index < len(buttons) and buttons[index] or None class HigDialog(Gtk.MessageDialog): def __init__(self, parent, type_, buttons, pritext, sectext, on_response_ok=None, on_response_cancel=None, on_response_yes=None, on_response_no=None): self.call_cancel_on_destroy = True Gtk.MessageDialog.__init__(self, transient_for=parent, modal=True, destroy_with_parent=True, message_type=type_, buttons=buttons, text=pritext) self.format_secondary_markup(sectext) self.possible_responses = {Gtk.ResponseType.OK: on_response_ok, Gtk.ResponseType.CANCEL: on_response_cancel, Gtk.ResponseType.YES: on_response_yes, Gtk.ResponseType.NO: on_response_no} self.connect('response', self.on_response) self.connect('destroy', self.on_dialog_destroy) def on_response(self, dialog, response_id): if not response_id in self.possible_responses: return if not self.possible_responses[response_id]: self.destroy() elif isinstance(self.possible_responses[response_id], tuple): if len(self.possible_responses[response_id]) == 1: self.possible_responses[response_id][0](dialog) else: self.possible_responses[response_id][0](dialog, *self.possible_responses[response_id][1:]) else: self.possible_responses[response_id](dialog) def on_dialog_destroy(self, widget): if not self.call_cancel_on_destroy: return cancel_handler = self.possible_responses[Gtk.ResponseType.CANCEL] if not cancel_handler: return False if isinstance(cancel_handler, tuple): cancel_handler[0](None, *cancel_handler[1:]) else: cancel_handler(None) def popup(self): """ Show dialog """ vb = self.get_children()[0].get_children()[0] # Give focus to top vbox # vb.set_flags(Gtk.CAN_FOCUS) vb.grab_focus() self.show_all() class FileChooserDialog(Gtk.FileChooserDialog): """ Non-blocking FileChooser Dialog around Gtk.FileChooserDialog """ def __init__(self, title_text, action, buttons, default_response, select_multiple=False, current_folder=None, on_response_ok=None, on_response_cancel=None, preview=False, transient_for=None): Gtk.FileChooserDialog.__init__(self, title=title_text, parent=transient_for, action=action) self.add_button(buttons[0],buttons[1]) if len(buttons) ==4: self.add_button(buttons[2],buttons[3]) self.set_default_response(default_response) self.set_select_multiple(select_multiple) if current_folder and os.path.isdir(current_folder): self.set_current_folder(current_folder) else: self.set_current_folder(os.path.expanduser('~')) self.response_ok, self.response_cancel = \ on_response_ok, on_response_cancel # in gtk+-2.10 clicked signal on some of the buttons in a dialog # is emitted twice, so we cannot rely on 'clicked' signal self.connect('response', self.on_dialog_response) if preview: self.set_use_preview_label(False) self.set_preview_widget(Gtk.Image()) self.connect('selection-changed', self.update_preview) self.show_all() def on_dialog_response(self, dialog, response): if response in (Gtk.ResponseType.CANCEL, Gtk.ResponseType.CLOSE): if self.response_cancel: if isinstance(self.response_cancel, tuple): self.response_cancel[0](dialog, *self.response_cancel[1:]) else: self.response_cancel(dialog) else: self.just_destroy(dialog) elif response == Gtk.ResponseType.OK: if self.response_ok: if isinstance(self.response_ok, tuple): self.response_ok[0](dialog, *self.response_ok[1:]) else: self.response_ok(dialog) else: self.just_destroy(dialog) def update_preview(self, widget): path_to_file = widget.get_preview_filename() preview = widget.get_preview_widget() if path_to_file is None or os.path.isdir(path_to_file): # nothing to preview or directory # make sure you clean image do show nothing preview.clear() return try: pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(path_to_file, 200, 200) except GObject.GError: preview.clear() return widget.get_preview_widget().set_from_pixbuf(pixbuf) def just_destroy(self, widget): self.destroy() class AspellDictError: def __init__(self, lang): ErrorDialog( _('Dictionary for language "%s" not available') % lang, _('You have to install the dictionary "%s" to use spellchecking, ' 'or choose another language by setting the speller_language ' 'option.\n\n' 'Highlighting misspelled words feature will not be used') % lang) class ConfirmationDialog(HigDialog): """ HIG compliant confirmation dialog """ def __init__(self, pritext, sectext='', on_response_ok=None, on_response_cancel=None, transient_for=None): self.user_response_ok = on_response_ok self.user_response_cancel = on_response_cancel HigDialog.__init__(self, transient_for, Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK_CANCEL, pritext, sectext, self.on_response_ok, self.on_response_cancel) self.popup() def on_response_ok(self, widget): if self.user_response_ok: if isinstance(self.user_response_ok, tuple): self.user_response_ok[0](*self.user_response_ok[1:]) else: self.user_response_ok() self.call_cancel_on_destroy = False self.destroy() def on_response_cancel(self, widget): if self.user_response_cancel: if isinstance(self.user_response_cancel, tuple): self.user_response_cancel[0](*self.user_response_ok[1:]) else: self.user_response_cancel() self.call_cancel_on_destroy = False self.destroy() class NonModalConfirmationDialog(HigDialog): """ HIG compliant non modal confirmation dialog """ def __init__(self, pritext, sectext='', on_response_ok=None, on_response_cancel=None): self.user_response_ok = on_response_ok self.user_response_cancel = on_response_cancel if hasattr(app.interface, 'roster') and app.interface.roster: parent = app.interface.roster.window else: parent = None HigDialog.__init__(self, parent, Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK_CANCEL, pritext, sectext, self.on_response_ok, self.on_response_cancel) self.set_modal(False) def on_response_ok(self, widget): if self.user_response_ok: if isinstance(self.user_response_ok, tuple): self.user_response_ok[0](*self.user_response_ok[1:]) else: self.user_response_ok() self.call_cancel_on_destroy = False self.destroy() def on_response_cancel(self, widget): if self.user_response_cancel: if isinstance(self.user_response_cancel, tuple): self.user_response_cancel[0](*self.user_response_cancel[1:]) else: self.user_response_cancel() self.call_cancel_on_destroy = False self.destroy() class WarningDialog(HigDialog): """ HIG compliant warning dialog """ def __init__(self, pritext, sectext='', transient_for=None): if not transient_for and hasattr(app.interface, 'roster') and \ app.interface.roster: transient_for = app.interface.roster.window HigDialog.__init__(self, transient_for, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK, pritext, sectext) self.set_modal(False) self.popup() class InformationDialog(HigDialog): """ HIG compliant info dialog """ def __init__(self, pritext, sectext='', transient_for=None): if transient_for: parent = transient_for elif hasattr(app.interface, 'roster') and app.interface.roster: parent = app.interface.roster.window else: parent = None HigDialog.__init__(self, parent, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, pritext, sectext) self.set_modal(False) self.popup() class ErrorDialog(HigDialog): """ HIG compliant error dialog """ def __init__(self, pritext, sectext='', on_response_ok=None, on_response_cancel=None, transient_for=None): if transient_for: parent = transient_for elif hasattr(app.interface, 'roster') and app.interface.roster: parent = app.interface.roster.window else: parent = None HigDialog.__init__(self, parent, Gtk.MessageType.ERROR, Gtk.ButtonsType.OK, pritext, sectext, on_response_ok=on_response_ok, on_response_cancel=on_response_cancel) self.popup() class YesNoDialog(HigDialog): """ HIG compliant YesNo dialog """ def __init__(self, pritext, sectext='', checktext='', text_label=None, on_response_yes=None, on_response_no=None, type_=Gtk.MessageType.QUESTION, transient_for=None): self.user_response_yes = on_response_yes self.user_response_no = on_response_no if transient_for: parent = transient_for elif hasattr(app.interface, 'roster') and app.interface.roster: parent = app.interface.roster.window else: parent = None HigDialog.__init__(self, parent, type_, Gtk.ButtonsType.YES_NO, pritext, sectext, on_response_yes=self.on_response_yes, on_response_no=self.on_response_no) vbox = self.get_content_area() if checktext: self.checkbutton = Gtk.CheckButton.new_with_mnemonic(checktext) vbox.pack_start(self.checkbutton, False, True, 0) else: self.checkbutton = None if text_label: label = Gtk.Label(label=text_label) vbox.pack_start(label, False, True, 0) buff = Gtk.TextBuffer() self.textview = Gtk.TextView.new_with_buffer(buff) frame = Gtk.Frame() frame.set_shadow_type(Gtk.ShadowType.IN) frame.add(self.textview) vbox.pack_start(frame, False, True, 0) else: self.textview = None self.set_modal(False) self.popup() def on_response_yes(self, widget): if self.user_response_yes: if self.textview: buff = self.textview.get_buffer() start, end = buff.get_bounds() txt = self.textview.get_buffer().get_text(start, end, True) if isinstance(self.user_response_yes, tuple): if self.textview: self.user_response_yes[0](self.is_checked(), txt, *self.user_response_yes[1:]) else: self.user_response_yes[0](self.is_checked(), *self.user_response_yes[1:]) else: if self.textview: self.user_response_yes(self.is_checked(), txt) else: self.user_response_yes(self.is_checked()) self.call_cancel_on_destroy = False self.destroy() def on_response_no(self, widget): if self.user_response_no: if self.textview: buff = self.textview.get_buffer() start, end = buff.get_bounds() txt = self.textview.get_buffer().get_text(start, end, True) if isinstance(self.user_response_no, tuple): if self.textview: self.user_response_no[0](txt, *self.user_response_no[1:]) else: self.user_response_no[0](*self.user_response_no[1:]) else: if self.textview: self.user_response_no(txt) else: self.user_response_no() self.call_cancel_on_destroy = False self.destroy() def is_checked(self): """ Get active state of the checkbutton """ if not self.checkbutton: return False return self.checkbutton.get_active() class ConfirmationDialogCheck(ConfirmationDialog): """ HIG compliant confirmation dialog with checkbutton """ def __init__(self, pritext, sectext='', checktext='', on_response_ok=None, on_response_cancel=None, is_modal=True, transient_for=None): self.user_response_ok = on_response_ok self.user_response_cancel = on_response_cancel if transient_for: parent = transient_for elif hasattr(app.interface, 'roster') and app.interface.roster: parent = app.interface.roster.window else: parent = None HigDialog.__init__(self, parent, Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK_CANCEL, pritext, sectext, self.on_response_ok, self.on_response_cancel) self.set_default_response(Gtk.ResponseType.OK) ok_button = self.get_widget_for_response(Gtk.ResponseType.OK) ok_button.grab_focus() self.checkbutton = Gtk.CheckButton.new_with_mnemonic(checktext) self.get_content_area().pack_start(self.checkbutton, False, True, 0) self.set_modal(is_modal) self.popup() def on_response_ok(self, widget): if self.user_response_ok: if isinstance(self.user_response_ok, tuple): self.user_response_ok[0](self.is_checked(), *self.user_response_ok[1:]) else: self.user_response_ok(self.is_checked()) self.call_cancel_on_destroy = False self.destroy() def on_response_cancel(self, widget): if self.user_response_cancel: if isinstance(self.user_response_cancel, tuple): self.user_response_cancel[0](self.is_checked(), *self.user_response_cancel[1:]) else: self.user_response_cancel(self.is_checked()) self.call_cancel_on_destroy = False self.destroy() def is_checked(self): """ Get active state of the checkbutton """ return self.checkbutton.get_active() class ConfirmationDialogDoubleCheck(ConfirmationDialog): """ HIG compliant confirmation dialog with 2 checkbuttons """ def __init__(self, pritext, sectext='', checktext1='', checktext2='', tooltip1='', tooltip2='', on_response_ok=None, on_response_cancel=None, is_modal=True): self.user_response_ok = on_response_ok self.user_response_cancel = on_response_cancel if hasattr(app.interface, 'roster') and app.interface.roster: parent = app.interface.roster.window else: parent = None HigDialog.__init__(self, parent, Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK_CANCEL, pritext, sectext, self.on_response_ok, self.on_response_cancel) self.set_default_response(Gtk.ResponseType.OK) ok_button = self.get_widget_for_response(Gtk.ResponseType.OK) ok_button.grab_focus() vbox = self.get_content_area() if checktext1: self.checkbutton1 = Gtk.CheckButton.new_with_mnemonic(checktext1) if tooltip1: self.checkbutton1.set_tooltip_text(tooltip1) vbox.pack_start(self.checkbutton1, False, True, 0) else: self.checkbutton1 = None if checktext2: self.checkbutton2 = Gtk.CheckButton.new_with_mnemonic(checktext2) if tooltip2: self.checkbutton2.set_tooltip_text(tooltip2) vbox.pack_start(self.checkbutton2, False, True, 0) else: self.checkbutton2 = None self.set_modal(is_modal) self.popup() def on_response_ok(self, widget): if self.user_response_ok: if isinstance(self.user_response_ok, tuple): self.user_response_ok[0](self.is_checked(), *self.user_response_ok[1:]) else: self.user_response_ok(self.is_checked()) self.call_cancel_on_destroy = False self.destroy() def on_response_cancel(self, widget): if self.user_response_cancel: if isinstance(self.user_response_cancel, tuple): self.user_response_cancel[0](*self.user_response_cancel[1:]) else: self.user_response_cancel() self.call_cancel_on_destroy = False self.destroy() def is_checked(self): ''' Get active state of the checkbutton ''' if self.checkbutton1: is_checked_1 = self.checkbutton1.get_active() else: is_checked_1 = False if self.checkbutton2: is_checked_2 = self.checkbutton2.get_active() else: is_checked_2 = False return [is_checked_1, is_checked_2] class PlainConnectionDialog(ConfirmationDialogDoubleCheck): """ Dialog that is shown when using an insecure connection """ def __init__(self, account, on_ok, on_cancel): pritext = _('Insecure connection') sectext = _('You are about to connect to the account %(account)s ' '(%(server)s) insecurely. This means conversations will not be ' 'encrypted, and is strongly discouraged.\nAre you sure you want ' 'to do that?') % {'account': account, 'server': app.get_hostname_from_account(account)} checktext1 = _('Yes, I really want to connect insecurely') tooltip1 = _('Gajim will NOT connect unless you check this box') checktext2 = _('_Do not ask me again') ConfirmationDialogDoubleCheck.__init__(self, pritext, sectext, checktext1, checktext2, tooltip1=tooltip1, on_response_ok=on_ok, on_response_cancel=on_cancel, is_modal=False) self.ok_button = self.get_widget_for_response(Gtk.ResponseType.OK) self.ok_button.set_sensitive(False) self.checkbutton1.connect('clicked', self.on_checkbutton_clicked) self.set_title(_('Insecure connection')) def on_checkbutton_clicked(self, widget): self.ok_button.set_sensitive(widget.get_active()) class ConfirmationDialogDoubleRadio(ConfirmationDialog): """ HIG compliant confirmation dialog with 2 radios """ def __init__(self, pritext, sectext='', radiotext1='', radiotext2='', on_response_ok=None, on_response_cancel=None, is_modal=True, transient_for=None): self.user_response_ok = on_response_ok self.user_response_cancel = on_response_cancel if transient_for is None: transient_for = app.app.get_active_window() HigDialog.__init__(self, transient_for, Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK_CANCEL, pritext, sectext, self.on_response_ok, self.on_response_cancel) self.set_default_response(Gtk.ResponseType.OK) ok_button = self.get_widget_for_response(Gtk.ResponseType.OK) ok_button.grab_focus() vbox = self.get_content_area() self.radiobutton1 = Gtk.RadioButton(label=radiotext1) vbox.pack_start(self.radiobutton1, False, True, 0) self.radiobutton2 = Gtk.RadioButton(group=self.radiobutton1, label=radiotext2) vbox.pack_start(self.radiobutton2, False, True, 0) self.set_modal(is_modal) self.popup() def on_response_ok(self, widget): if self.user_response_ok: if isinstance(self.user_response_ok, tuple): self.user_response_ok[0](self.is_checked(), *self.user_response_ok[1:]) else: self.user_response_ok(self.is_checked()) self.call_cancel_on_destroy = False self.destroy() def on_response_cancel(self, widget): if self.user_response_cancel: if isinstance(self.user_response_cancel, tuple): self.user_response_cancel[0](*self.user_response_cancel[1:]) else: self.user_response_cancel() self.call_cancel_on_destroy = False self.destroy() def is_checked(self): ''' Get active state of the checkbutton ''' if self.radiobutton1: is_checked_1 = self.radiobutton1.get_active() else: is_checked_1 = False if self.radiobutton2: is_checked_2 = self.radiobutton2.get_active() else: is_checked_2 = False return [is_checked_1, is_checked_2] class FTOverwriteConfirmationDialog(ConfirmationDialog): """ HIG compliant confirmation dialog to overwrite or resume a file transfert """ def __init__(self, pritext, sectext='', propose_resume=True, on_response=None, transient_for=None): if transient_for: parent = transient_for elif hasattr(app.interface, 'roster') and app.interface.roster: parent = app.interface.roster.window else: parent = None HigDialog.__init__(self, parent, Gtk.MessageType.QUESTION, Gtk.ButtonsType.CANCEL, pritext, sectext) self.on_response = on_response if propose_resume: b = Gtk.Button(label='', stock=Gtk.STOCK_REFRESH) align = b.get_children()[0] hbox = align.get_children()[0] label = hbox.get_children()[1] label.set_text(_('_Resume')) label.set_use_underline(True) self.add_action_widget(b, 100) b = Gtk.Button(label='', stock=Gtk.STOCK_SAVE_AS) align = b.get_children()[0] hbox = align.get_children()[0] label = hbox.get_children()[1] label.set_text(_('Re_place')) label.set_use_underline(True) self.add_action_widget(b, 200) self.connect('response', self.on_dialog_response) self.show_all() def on_dialog_response(self, dialog, response): if self.on_response: if isinstance(self.on_response, tuple): self.on_response[0](response, *self.on_response[1:]) else: self.on_response(response) self.call_cancel_on_destroy = False self.destroy() class CommonInputDialog: """ Common Class for Input dialogs """ def __init__(self, title, label_str, is_modal, ok_handler, cancel_handler, transient_for=None): self.dialog = self.xml.get_object('input_dialog') label = self.xml.get_object('label') self.dialog.set_title(title) label.set_markup(label_str) self.cancel_handler = cancel_handler self.vbox = self.xml.get_object('vbox') if transient_for: self.dialog.set_transient_for(transient_for) else: self.dialog.set_transient_for(app.interface.roster.window) self.ok_handler = ok_handler okbutton = self.xml.get_object('okbutton') okbutton.connect('clicked', self.on_okbutton_clicked) cancelbutton = self.xml.get_object('cancelbutton') cancelbutton.connect('clicked', self.on_cancelbutton_clicked) self.xml.connect_signals(self) self.dialog.show_all() def on_input_dialog_destroy(self, widget): if self.cancel_handler: self.cancel_handler() def on_okbutton_clicked(self, widget): user_input = self.get_text() if user_input: user_input = user_input self.cancel_handler = None self.dialog.destroy() if isinstance(self.ok_handler, tuple): self.ok_handler[0](user_input, *self.ok_handler[1:]) else: self.ok_handler(user_input) def on_cancelbutton_clicked(self, widget): self.dialog.destroy() def destroy(self): self.dialog.destroy() class InputDialog(CommonInputDialog): """ Class for Input dialog """ def __init__(self, title, label_str, input_str=None, is_modal=True, ok_handler=None, cancel_handler=None, transient_for=None): self.xml = gtkgui_helpers.get_gtk_builder('input_dialog.ui') CommonInputDialog.__init__(self, title, label_str, is_modal, ok_handler, cancel_handler, transient_for=transient_for) self.input_entry = self.xml.get_object('input_entry') if input_str: self.set_entry(input_str) def on_input_dialog_delete_event(self, widget, event): ''' may be implemented by subclasses ''' pass def set_entry(self, value): self.input_entry.set_text(value) self.input_entry.select_region(0, -1) # select all def get_text(self): return self.input_entry.get_text() class InputDialogCheck(InputDialog): """ Class for Input dialog """ def __init__(self, title, label_str, checktext='', input_str=None, is_modal=True, ok_handler=None, cancel_handler=None, transient_for=None): self.xml = gtkgui_helpers.get_gtk_builder('input_dialog.ui') InputDialog.__init__(self, title, label_str, input_str=input_str, is_modal=is_modal, ok_handler=ok_handler, cancel_handler=cancel_handler, transient_for=transient_for) self.input_entry = self.xml.get_object('input_entry') if input_str: self.input_entry.set_text(input_str) self.input_entry.select_region(0, -1) # select all if checktext: self.checkbutton = Gtk.CheckButton.new_with_mnemonic(checktext) self.vbox.pack_start(self.checkbutton, False, True, 0) self.checkbutton.show() def on_okbutton_clicked(self, widget): user_input = self.get_text() if user_input: user_input = user_input self.cancel_handler = None self.dialog.destroy() if isinstance(self.ok_handler, tuple): self.ok_handler[0](user_input, self.is_checked(), *self.ok_handler[1:]) else: self.ok_handler(user_input, self.is_checked()) def get_text(self): return self.input_entry.get_text() def is_checked(self): """ Get active state of the checkbutton """ try: return self.checkbutton.get_active() except Exception: # There is no checkbutton return False class ChangeNickDialog(InputDialogCheck): """ Class for changing room nickname in case of conflict """ def __init__(self, account, room_jid, title, prompt, check_text=None, change_nick=False, transient_for=None): """ change_nick must be set to True when we are already occupant of the room and we are changing our nick """ InputDialogCheck.__init__(self, title, '', checktext=check_text, input_str='', is_modal=True, ok_handler=None, cancel_handler=None, transient_for=transient_for) self.room_queue = [(account, room_jid, prompt, change_nick)] self.check_next() def on_input_dialog_delete_event(self, widget, event): self.on_cancelbutton_clicked(widget) return True def setup_dialog(self): self.gc_control = app.interface.msg_win_mgr.get_gc_control( self.room_jid, self.account) if not self.gc_control and \ self.room_jid in app.interface.minimized_controls[self.account]: self.gc_control = \ app.interface.minimized_controls[self.account][self.room_jid] if not self.gc_control: self.check_next() return label = self.xml.get_object('label') label.set_markup(self.prompt) self.set_entry(self.gc_control.nick + \ app.config.get('gc_proposed_nick_char')) def check_next(self): if len(self.room_queue) == 0: self.cancel_handler = None self.dialog.destroy() if 'change_nick_dialog' in app.interface.instances: del app.interface.instances['change_nick_dialog'] return self.account, self.room_jid, self.prompt, self.change_nick = \ self.room_queue.pop(0) self.setup_dialog() if app.new_room_nick is not None and not app.gc_connected[ self.account][self.room_jid] and self.gc_control.nick != \ app.new_room_nick: self.dialog.hide() self.on_ok(app.new_room_nick, True) else: self.dialog.show() def on_okbutton_clicked(self, widget): nick = self.get_text() if nick: nick = nick # send presence to room try: nick = helpers.parse_resource(nick) except Exception: # invalid char ErrorDialog(_('Invalid nickname'), _('The nickname contains invalid characters.')) return self.on_ok(nick, self.is_checked()) def on_ok(self, nick, is_checked): if is_checked: app.new_room_nick = nick app.connections[self.account].join_gc(nick, self.room_jid, None, change_nick=self.change_nick) if app.gc_connected[self.account][self.room_jid]: # We are changing nick, we will change self.nick when we receive # presence that inform that it works self.gc_control.new_nick = nick else: # We are connecting, we will not get a changed nick presence so # change it NOW. We don't already have a nick so it's harmless self.gc_control.nick = nick self.check_next() def on_cancelbutton_clicked(self, widget): self.gc_control.new_nick = '' self.check_next() def add_room(self, account, room_jid, prompt, change_nick=False): if (account, room_jid, prompt, change_nick) not in self.room_queue: self.room_queue.append((account, room_jid, prompt, change_nick)) class InputTextDialog(CommonInputDialog): """ Class for multilines Input dialog (more place than InputDialog) """ def __init__(self, title, label_str, input_str=None, is_modal=True, ok_handler=None, cancel_handler=None, transient_for=None): self.xml = gtkgui_helpers.get_gtk_builder('input_text_dialog.ui') CommonInputDialog.__init__(self, title, label_str, is_modal, ok_handler, cancel_handler, transient_for=transient_for) self.input_buffer = self.xml.get_object('input_textview').get_buffer() if input_str: self.input_buffer.set_text(input_str) start_iter, end_iter = self.input_buffer.get_bounds() self.input_buffer.select_range(start_iter, end_iter) # select all def get_text(self): start_iter, end_iter = self.input_buffer.get_bounds() return self.input_buffer.get_text(start_iter, end_iter, True) class DoubleInputDialog: """ Class for Double Input dialog """ def __init__(self, title, label_str1, label_str2, input_str1=None, input_str2=None, is_modal=True, ok_handler=None, cancel_handler=None, transient_for=None): self.xml = gtkgui_helpers.get_gtk_builder('dubbleinput_dialog.ui') self.dialog = self.xml.get_object('dubbleinput_dialog') label1 = self.xml.get_object('label1') self.input_entry1 = self.xml.get_object('input_entry1') label2 = self.xml.get_object('label2') self.input_entry2 = self.xml.get_object('input_entry2') self.dialog.set_title(title) label1.set_markup(label_str1) label2.set_markup(label_str2) self.cancel_handler = cancel_handler if input_str1: self.input_entry1.set_text(input_str1) self.input_entry1.select_region(0, -1) # select all if input_str2: self.input_entry2.set_text(input_str2) self.input_entry2.select_region(0, -1) # select all if transient_for: self.dialog.set_transient_for(transient_for) self.dialog.set_modal(is_modal) self.ok_handler = ok_handler okbutton = self.xml.get_object('okbutton') okbutton.connect('clicked', self.on_okbutton_clicked) cancelbutton = self.xml.get_object('cancelbutton') cancelbutton.connect('clicked', self.on_cancelbutton_clicked) self.xml.connect_signals(self) self.dialog.show_all() def on_dubbleinput_dialog_destroy(self, widget): if not self.cancel_handler: return False if isinstance(self.cancel_handler, tuple): self.cancel_handler[0](*self.cancel_handler[1:]) else: self.cancel_handler() def on_okbutton_clicked(self, widget): user_input1 = self.input_entry1.get_text() user_input2 = self.input_entry2.get_text() self.cancel_handler = None self.dialog.destroy() if not self.ok_handler: return if isinstance(self.ok_handler, tuple): self.ok_handler[0](user_input1, user_input2, *self.ok_handler[1:]) else: self.ok_handler(user_input1, user_input2) def on_cancelbutton_clicked(self, widget): self.dialog.destroy() if not self.cancel_handler: return if isinstance(self.cancel_handler, tuple): self.cancel_handler[0](*self.cancel_handler[1:]) else: self.cancel_handler() class SubscriptionRequestWindow(Gtk.ApplicationWindow): def __init__(self, jid, text, account, user_nick=None): Gtk.ApplicationWindow.__init__(self) self.set_name('SubscriptionRequest') self.set_application(app.app) self.set_show_menubar(False) self.set_resizable(False) self.set_position(Gtk.WindowPosition.CENTER) self.set_title(_('Subscription Request')) xml = gtkgui_helpers.get_gtk_builder('subscription_request_window.ui') self.add(xml.get_object('subscription_box')) self.jid = jid self.account = account self.user_nick = user_nick if len(app.connections) >= 2: prompt_text = \ _('Subscription request for account %(account)s from %(jid)s')\ % {'account': account, 'jid': self.jid} else: prompt_text = _('Subscription request from %s') % self.jid from_label = xml.get_object('from_label') from_label.set_text(prompt_text) textview = xml.get_object('message_textview') textview.get_buffer().set_text(text) self.set_default(xml.get_object('authorize_button')) xml.connect_signals(self) self.show_all() def on_subscription_request_window_destroy(self, widget): """ Close window """ if self.jid in app.interface.instances[self.account]['sub_request']: # remove us from open windows del app.interface.instances[self.account]['sub_request'][self.jid] def on_close_button_clicked(self, widget): self.destroy() def on_authorize_button_clicked(self, widget): """ Accept the request """ app.connections[self.account].send_authorization(self.jid) self.destroy() contact = app.contacts.get_contact(self.account, self.jid) if not contact or _('Not in Roster') in contact.groups: AddNewContactWindow(self.account, self.jid, self.user_nick) def on_contact_info_activate(self, widget): """ Ask vcard """ if self.jid in app.interface.instances[self.account]['infos']: app.interface.instances[self.account]['infos'][self.jid].window.present() else: contact = app.contacts.create_contact(jid=self.jid, account=self.account) app.interface.instances[self.account]['infos'][self.jid] = \ vcard.VcardWindow(contact, self.account) # Remove jabber page app.interface.instances[self.account]['infos'][self.jid].xml.\ get_object('information_notebook').remove_page(0) def on_start_chat_activate(self, widget): """ Open chat """ app.interface.new_chat_from_jid(self.account, self.jid) def on_deny_button_clicked(self, widget): """ Refuse the request """ app.connections[self.account].refuse_authorization(self.jid) contact = app.contacts.get_contact(self.account, self.jid) if contact and _('Not in Roster') in contact.get_shown_groups(): app.interface.roster.remove_contact(self.jid, self.account) self.destroy() class JoinGroupchatWindow(Gtk.ApplicationWindow): def __init__(self, account, room_jid, password=None, automatic=None, transient_for=None): Gtk.ApplicationWindow.__init__(self) self.set_name('JoinGroupchat') self.set_application(app.app) self.set_show_menubar(False) self.set_resizable(False) self.set_position(Gtk.WindowPosition.CENTER) self.set_title(_('Join Groupchat')) if transient_for: self.set_transient_for(transient_for) self.automatic = automatic self.password = password self.requested_jid = None self.room_jid = room_jid self.account = account self.minimal_mode = 0 # 2: very mini, 1: with room, 0: show all if room_jid is not None: if '@' in room_jid: self.minimal_mode = 2 else: self.minimal_mode = 1 glade_objects = ['grid', 'nick_entry', 'account_combo', 'jid_label', 'bookmark_switch', 'autojoin_switch', 'headerbar', 'account_label', 'password_entry', 'password_label', 'join_button', 'button_box', 'server_label', 'server_combo', 'recent_label', 'recent_combo', 'room_label', 'room_entry', 'search_button'] minimal_widgets = ['jid_label'] room_widgets = ['room_label', 'room_entry'] extended_widgets = ['server_label', 'server_combo', 'recent_label', 'recent_combo', 'room_label', 'room_entry', 'search_button'] self.builder = gtkgui_helpers.get_gtk_builder( 'join_groupchat_window.ui') for obj in glade_objects: setattr(self, obj, self.builder.get_object(obj)) self.add(self.grid) if os.environ.get('GTK_CSD', '1') == '1': self.set_titlebar(self.headerbar) else: self.button_box.show() # Show widgets depending on the mode the window is in if self.minimal_mode > 0: for widget in minimal_widgets: getattr(self, widget).show() if self.minimal_mode == 1: for widget in room_widgets: getattr(self, widget).show() self.jid_label.set_text(room_jid) else: for widget in extended_widgets: getattr(self, widget).show() self._fill_recent_and_servers(account) if account is None: connected_accounts = app.get_connected_accounts() for acc in connected_accounts: self.account_combo.append_text(acc) else: connected_accounts = [account] self.account_combo.append_text(account) self.builder.connect_signals(self) self.connect('key-press-event', self._on_key_press_event) self.connect('destroy', self._on_destroy) if self.minimal_mode == 0: app.ged.register_event_handler('agent-info-received', ged.GUI1, self._nec_agent_info_received) app.ged.register_event_handler('agent-info-error-received', ged.GUI1, self._nec_agent_info_error_received) # Show account combobox if there is more than one account if len(connected_accounts) > 1: self.account_combo.show() self.account_label.show() # Select first account self.account_combo.set_active(0) if self.minimal_mode == 0: self.recent_combo.set_active(0) if self.password is not None: self.password_entry.set_text(self.password) # Set bookmark switch sensitive if server supports bookmarks acc = self.account_combo.get_active_text() if not app.connections[acc].private_storage_supported: self.bookmark_switch.set_sensitive(False) self.autojoin_switch.set_sensitive(False) # Show password field if we are in extended mode or # The MUC is passwordprotected if self.minimal_mode == 0 or muc_caps_cache.supports( room_jid, 'muc_passwordprotected'): self.password_entry.show() self.password_label.show() self.show_all() def set_room(self, room_jid): room, server = app.get_name_and_server_from_jid(room_jid) self.room_entry.set_text(room) self.server_combo.get_child().set_text(server) def _fill_recent_and_servers(self, account): recent = app.get_recent_groupchats(account) servers = [] for groupchat in recent: text = '%s on %s@%s' % (groupchat.nickname, groupchat.room, groupchat.server) self.recent_combo.append_text(text) servers.append(groupchat.server) for server in set(servers): self.server_combo.append_text(server) # Add own Server to ComboBox muc_domain = app.get_muc_domain(account) if muc_domain is not None: self.server_combo.insert_text(0, muc_domain) def _on_recent_changed(self, combo): text = combo.get_active_text() if text is None: self.server_combo.set_active(0) return nickname, _, room_jid = text.split() room, server = app.get_name_and_server_from_jid(room_jid) self.room_entry.set_text(room) self.nick_entry.set_text(nickname) self.server_combo.get_child().set_text(server) def _on_account_combo_changed(self, combo): account = combo.get_active_text() self.nick_entry.set_text(app.nicks[account]) def _on_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.destroy() if event.keyval == Gdk.KEY_Return: self._on_join_clicked() return True def _on_join_clicked(self, *args): account = self.account_combo.get_active_text() nickname = self.nick_entry.get_text() if self.minimal_mode < 2: if self.minimal_mode == 0: server = self.server_combo.get_active_text() else: # mode 1 server = self.room_jid room = self.room_entry.get_text() if room == '': ErrorDialog(_('Invalid Room'), _('Please choose a room'), transient_for=self) return self.room_jid = '%s@%s' % (room, server) if app.in_groupchat(account, self.room_jid): # If we already in the groupchat, join_gc_room will bring # it to front app.interface.join_gc_room(account, self.room_jid, nickname, '') self.destroy() return if nickname == '': ErrorDialog(_('Invalid Nickname'), _('Please choose a nickname'), transient_for=self) return try: helpers.parse_resource(nickname) except helpers.InvalidFormat as error: ErrorDialog(_('Invalid Nickname'), str(error), transient_for=self) return try: helpers.parse_jid(self.room_jid) except helpers.InvalidFormat as error: ErrorDialog(_('Invalid JID'), str(error), transient_for=self) return if not app.account_is_connected(account): ErrorDialog( _('You are not connected to the server'), _('You can not join a group chat unless you are connected.'), transient_for=self) return password = self.password_entry.get_text() self._add_bookmark(account, nickname, password) app.add_recent_groupchat(account, self.room_jid, nickname) if self.automatic: app.automatic_rooms[self.account][self.room_jid] = self.automatic app.interface.join_gc_room(account, self.room_jid, nickname, password) self.destroy() def _on_cancel_clicked(self, *args): self.destroy() def _on_bookmark_activate(self, switch, param): self.autojoin_switch.set_sensitive(switch.get_active()) def _add_bookmark(self, account, nickname, password): if not app.connections[account].private_storage_supported: return add_bookmark = self.bookmark_switch.get_active() if not add_bookmark: return autojoin = int(self.autojoin_switch.get_active()) # Add as bookmark, with autojoin and not minimized name = app.get_nick_from_jid(self.room_jid) app.interface.add_gc_bookmark( account, name, self.room_jid, autojoin, 1, password, nickname) def _on_destroy(self, *args): if self.minimal_mode == 0: del app.interface.instances[self.account]['join_gc'] app.ged.remove_event_handler('agent-info-received', ged.GUI1, self._nec_agent_info_received) app.ged.remove_event_handler('agent-info-error-received', ged.GUI1, self._nec_agent_info_error_received) def _on_search_clicked(self, widget): server = self.server_combo.get_active_text().strip() self.requested_jid = server app.connections[self.account].discoverInfo(server) def _nec_agent_info_error_received(self, obj): if obj.conn.name != self.account: return if obj.jid != self.requested_jid: return self.requested_jid = None ErrorDialog(_('Wrong server'), _('%s is not a groupchat server') % obj.jid, transient_for=self) def _nec_agent_info_received(self, obj): if obj.conn.name != self.account: return if obj.jid != self.requested_jid: return self.requested_jid = None if nbxmpp.NS_MUC not in obj.features: ErrorDialog(_('Wrong server'), _('%s is not a groupchat server') % obj.jid, transient_for=self) return if obj.jid in app.interface.instances[self.account]['disco']: app.interface.instances[self.account]['disco'][obj.jid].window.\ present() else: try: # Object will add itself to the window dict from gajim.disco import ServiceDiscoveryWindow ServiceDiscoveryWindow( self.account, obj.jid, initial_identities=[{'category': 'conference', 'type': 'text'}]) except GajimGeneralException: pass class SynchroniseSelectAccountDialog: def __init__(self, account): # 'account' can be None if we are about to create our first one if not account or app.connections[account].connected < 2: ErrorDialog(_('You are not connected to the server'), _('Without a connection, you can not synchronise your contacts.')) raise GajimGeneralException('You are not connected to the server') self.account = account self.xml = gtkgui_helpers.get_gtk_builder('synchronise_select_account_dialog.ui') self.dialog = self.xml.get_object('synchronise_select_account_dialog') self.dialog.set_transient_for(app.interface.instances['accounts']) self.accounts_treeview = self.xml.get_object('accounts_treeview') model = Gtk.ListStore(str, str, bool) self.accounts_treeview.set_model(model) # columns renderer = Gtk.CellRendererText() self.accounts_treeview.insert_column_with_attributes(-1, _('Name'), renderer, text=0) renderer = Gtk.CellRendererText() self.accounts_treeview.insert_column_with_attributes(-1, _('Server'), renderer, text=1) self.xml.connect_signals(self) self.init_accounts() self.dialog.show_all() def on_accounts_window_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.window.destroy() def init_accounts(self): """ Initialize listStore with existing accounts """ model = self.accounts_treeview.get_model() model.clear() for remote_account in app.connections: if remote_account == self.account: # Do not show the account we're sync'ing continue iter_ = model.append() model.set(iter_, 0, remote_account, 1, app.get_hostname_from_account(remote_account)) def on_cancel_button_clicked(self, widget): self.dialog.destroy() def on_ok_button_clicked(self, widget): sel = self.accounts_treeview.get_selection() (model, iter_) = sel.get_selected() if not iter_: return remote_account = model.get_value(iter_, 0) if app.connections[remote_account].connected < 2: ErrorDialog(_('This account is not connected to the server'), _('You cannot synchronize with an account unless it is connected.')) return else: try: SynchroniseSelectContactsDialog(self.account, remote_account) except GajimGeneralException: # if we showed ErrorDialog, there will not be dialog instance return self.dialog.destroy() @staticmethod def on_destroy(widget): del app.interface.instances['import_contacts'] class SynchroniseSelectContactsDialog: def __init__(self, account, remote_account): self.local_account = account self.remote_account = remote_account self.xml = gtkgui_helpers.get_gtk_builder( 'synchronise_select_contacts_dialog.ui') self.dialog = self.xml.get_object('synchronise_select_contacts_dialog') self.contacts_treeview = self.xml.get_object('contacts_treeview') model = Gtk.ListStore(bool, str) self.contacts_treeview.set_model(model) # columns renderer1 = Gtk.CellRendererToggle() renderer1.set_property('activatable', True) renderer1.connect('toggled', self.toggled_callback) self.contacts_treeview.insert_column_with_attributes(-1, _('Synchronise'), renderer1, active=0) renderer2 = Gtk.CellRendererText() self.contacts_treeview.insert_column_with_attributes(-1, _('Name'), renderer2, text=1) self.xml.connect_signals(self) self.init_contacts() self.dialog.show_all() def toggled_callback(self, cell, path): model = self.contacts_treeview.get_model() iter_ = model.get_iter(path) model[iter_][0] = not cell.get_active() def on_contacts_window_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.window.destroy() def init_contacts(self): """ Initialize listStore with existing accounts """ model = self.contacts_treeview.get_model() model.clear() # recover local contacts local_jid_list = app.contacts.get_contacts_jid_list(self.local_account) remote_jid_list = app.contacts.get_contacts_jid_list( self.remote_account) for remote_jid in remote_jid_list: if remote_jid not in local_jid_list: iter_ = model.append() model.set(iter_, 0, True, 1, remote_jid) def on_cancel_button_clicked(self, widget): self.dialog.destroy() def on_ok_button_clicked(self, widget): model = self.contacts_treeview.get_model() iter_ = model.get_iter_first() while iter_: if model[iter_][0]: # it is selected remote_jid = model[iter_][1] message = 'I\'m synchronizing my contacts from my %s account, could you please add this address to your contact list?' % \ app.get_hostname_from_account(self.remote_account) remote_contact = app.contacts.get_first_contact_from_jid( self.remote_account, remote_jid) # keep same groups and same nickname app.interface.roster.req_sub(self, remote_jid, message, self.local_account, groups = remote_contact.groups, nickname = remote_contact.name, auto_auth = True) iter_ = model.iter_next(iter_) self.dialog.destroy() class StartChatDialog(Gtk.ApplicationWindow): def __init__(self): Gtk.ApplicationWindow.__init__(self) self.set_name('StartChatDialog') self.set_application(app.app) self.set_position(Gtk.WindowPosition.CENTER) self.set_show_menubar(False) self.set_title(_('Start new Conversation')) self.set_default_size(-1, 400) self.ready_to_destroy = False self.builder = gtkgui_helpers.get_gtk_builder( 'start_chat_dialog.ui') self.listbox = self.builder.get_object('listbox') self.search_entry = self.builder.get_object('search_entry') self.box = self.builder.get_object('box') self.add(self.box) self.new_contact_row_visible = False self.new_contact_rows = {} self.new_groupchat_rows = {} self.accounts = app.connections.keys() self.add_contacts() self.add_groupchats() self.search_entry.connect('search-changed', self._on_search_changed) self.search_entry.connect('next-match', self._select_new_match, 'next') self.search_entry.connect('previous-match', self._select_new_match, 'prev') self.search_entry.connect('stop-search', lambda *args: self.search_entry.set_text('')) self.listbox.set_filter_func(self._filter_func, None) self.listbox.set_sort_func(self._sort_func, None) self.listbox.connect('row-activated', self._on_row_activated) self.connect('key-press-event', self._on_key_press) self.connect('destroy', self._destroy) self.select_first_row() self.show_all() def add_contacts(self): show_account = len(self.accounts) > 1 for account in self.accounts: self.new_contact_rows[account] = None for jid in app.contacts.get_jid_list(account): contact = app.contacts.get_contact_with_highest_priority( account, jid) if contact.is_groupchat(): continue row = ContactRow(account, contact, jid, contact.get_shown_name(), show_account) self.listbox.add(row) def add_groupchats(self): show_account = len(self.accounts) > 1 for account in self.accounts: self.new_groupchat_rows[account] = None bookmarks = app.connections[account].bookmarks groupchats = {} for bookmark in bookmarks: groupchats[bookmark['jid']] = bookmark['name'] for jid in app.contacts.get_gc_list(account): if jid in groupchats: continue groupchats[jid] = None for jid in groupchats: name = groupchats[jid] if not name: name = app.get_nick_from_jid(jid) row = ContactRow(account, None, jid, name, show_account, True) self.listbox.add(row) def _on_row_activated(self, listbox, row): row = row.get_child() self._start_new_chat(row) def _on_key_press(self, widget, event): if event.keyval in (Gdk.KEY_Down, Gdk.KEY_Tab): self.search_entry.emit('next-match') return True elif (event.state == Gdk.ModifierType.SHIFT_MASK and event.keyval == Gdk.KEY_ISO_Left_Tab): self.search_entry.emit('previous-match') return True elif event.keyval == Gdk.KEY_Up: self.search_entry.emit('previous-match') return True elif event.keyval == Gdk.KEY_Escape: if self.search_entry.get_text() != '': self.search_entry.emit('stop-search') else: self.destroy() return True elif event.keyval == Gdk.KEY_Return: row = self.listbox.get_selected_row() if row is not None: row.emit('activate') return True else: self.search_entry.grab_focus_without_selecting() def _start_new_chat(self, row): if row.new: if not app.account_is_connected(row.account): app.interface.raise_dialog('start-chat-not-connected') return try: helpers.parse_jid(row.jid) except helpers.InvalidFormat as e: app.interface.raise_dialog('invalid-jid-with-error', str(e)) return if row.groupchat: app.interface.join_gc_minimal(row.account, row.jid) else: app.interface.new_chat_from_jid(row.account, row.jid) self.ready_to_destroy = True def _on_search_changed(self, entry): search_text = entry.get_text() if '@' in search_text: self._add_new_jid_row() self._update_new_jid_rows(search_text) else: self._remove_new_jid_row() self.listbox.invalidate_filter() def _add_new_jid_row(self): if self.new_contact_row_visible: return for account in self.new_contact_rows: show_account = len(self.accounts) > 1 row = ContactRow(account, None, '', None, show_account) self.new_contact_rows[account] = row group_row = ContactRow(account, None, '', None, show_account, True) self.new_groupchat_rows[account] = group_row self.listbox.add(row) self.listbox.add(group_row) row.get_parent().show_all() self.new_contact_row_visible = True def _remove_new_jid_row(self): if not self.new_contact_row_visible: return for account in self.new_contact_rows: self.listbox.remove(self.new_contact_rows[account].get_parent()) self.listbox.remove(self.new_groupchat_rows[account].get_parent()) self.new_contact_row_visible = False def _update_new_jid_rows(self, search_text): for account in self.new_contact_rows: self.new_contact_rows[account].update_jid(search_text) self.new_groupchat_rows[account].update_jid(search_text) def _select_new_match(self, entry, direction): selected_row = self.listbox.get_selected_row() index = selected_row.get_index() if direction == 'next': index += 1 else: index -= 1 while True: new_selected_row = self.listbox.get_row_at_index(index) if new_selected_row is None: return if new_selected_row.get_child_visible(): self.listbox.select_row(new_selected_row) new_selected_row.grab_focus() return if direction == 'next': index += 1 else: index -= 1 def select_first_row(self): first_row = self.listbox.get_row_at_y(0) self.listbox.select_row(first_row) def _filter_func(self, row, user_data): search_text = self.search_entry.get_text().lower() search_text_list = search_text.split() row_text = row.get_child().get_search_text().lower() for text in search_text_list: if text not in row_text: GLib.timeout_add(50, self.select_first_row) return GLib.timeout_add(50, self.select_first_row) return True @staticmethod def _sort_func(row1, row2, user_data): name1 = row1.get_child().get_search_text() name2 = row2.get_child().get_search_text() account1 = row1.get_child().account account2 = row2.get_child().account is_groupchat1 = row1.get_child().groupchat is_groupchat2 = row2.get_child().groupchat new1 = row1.get_child().new new2 = row2.get_child().new result = locale.strcoll(account1.lower(), account2.lower()) if result != 0: return result if new1 != new2: return 1 if new1 else -1 if is_groupchat1 != is_groupchat2: return 1 if is_groupchat1 else -1 return locale.strcoll(name1.lower(), name2.lower()) @staticmethod def _destroy(*args): del app.interface.instances['start_chat'] class ContactRow(Gtk.Grid): def __init__(self, account, contact, jid, name, show_account, groupchat=False): Gtk.Grid.__init__(self) self.set_column_spacing(12) self.set_size_request(260, -1) self.account = account self.account_label = app.config.get_per( 'accounts', account, 'account_label') or account self.show_account = show_account self.jid = jid self.contact = contact self.name = name self.groupchat = groupchat self.new = jid == '' if self.groupchat: muc_icon = gtkgui_helpers.get_iconset_name_for( 'muc-inactive' if self.new else 'muc-active') image = Gtk.Image.new_from_icon_name(muc_icon, Gtk.IconSize.DND) else: scale = self.get_scale_factor() avatar = app.contacts.get_avatar( account, jid, AvatarSize.ROSTER, scale) if avatar is None: image = Gtk.Image.new_from_icon_name( 'avatar-default', Gtk.IconSize.DND) else: image = Gtk.Image.new_from_surface(avatar) image.set_size_request(AvatarSize.ROSTER, AvatarSize.ROSTER) self.add(image) middle_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) middle_box.set_hexpand(True) if self.name is None: if self.groupchat: self.name = _('New Groupchat') else: self.name = _('New Contact') self.name_label = Gtk.Label(self.name) self.name_label.set_ellipsize(Pango.EllipsizeMode.END) self.name_label.set_xalign(0) self.name_label.set_width_chars(25) self.name_label.set_halign(Gtk.Align.START) self.name_label.get_style_context().add_class('bold16') status = contact.show if contact else 'offline' css_class = helpers.get_css_show_color(status) if css_class is not None: self.name_label.get_style_context().add_class(css_class) middle_box.add(self.name_label) self.jid_label = Gtk.Label(jid) self.jid_label.set_ellipsize(Pango.EllipsizeMode.END) self.jid_label.set_xalign(0) self.jid_label.set_width_chars(25) self.jid_label.set_halign(Gtk.Align.START) middle_box.add(self.jid_label) self.add(middle_box) if show_account: account_label = Gtk.Label(self.account_label) account_label.set_halign(Gtk.Align.START) account_label.set_valign(Gtk.Align.START) right_box = Gtk.Box() right_box.set_vexpand(True) right_box.add(account_label) self.add(right_box) self.show_all() def update_jid(self, jid): self.jid = jid self.jid_label.set_text(jid) def get_search_text(self): if self.contact is None and not self.groupchat: return self.jid if self.show_account: return '%s %s %s' % (self.name, self.jid, self.account_label) return '%s %s' % (self.name, self.jid) class ChangePasswordDialog: def __init__(self, account, on_response, transient_for=None): # 'account' can be None if we are about to create our first one if not account or app.connections[account].connected < 2: ErrorDialog(_('You are not connected to the server'), _('Without a connection, you can not change your password.')) raise GajimGeneralException('You are not connected to the server') self.account = account self.on_response = on_response self.xml = gtkgui_helpers.get_gtk_builder('change_password_dialog.ui') self.dialog = self.xml.get_object('change_password_dialog') self.dialog.set_transient_for(transient_for) self.password1_entry = self.xml.get_object('password1_entry') self.password2_entry = self.xml.get_object('password2_entry') self.dialog.connect('response', self.on_dialog_response) self.dialog.show_all() def on_dialog_response(self, dialog, response): if response != Gtk.ResponseType.OK: dialog.destroy() self.on_response(None) return password1 = self.password1_entry.get_text() if not password1: ErrorDialog(_('Invalid password'), _('You must enter a password.')) return password2 = self.password2_entry.get_text() if password1 != password2: ErrorDialog(_('Passwords do not match'), _('The passwords typed in both fields must be identical.')) return dialog.destroy() self.on_response(password1) class PopupNotificationWindow: def __init__(self, event_type, jid, account, msg_type='', path_to_image=None, title=None, text=None, timeout=-1): self.account = account self.jid = jid self.msg_type = msg_type self.index = len(app.interface.roster.popup_notification_windows) xml = gtkgui_helpers.get_gtk_builder('popup_notification_window.ui') self.window = xml.get_object('popup_notification_window') self.window.set_type_hint(Gdk.WindowTypeHint.TOOLTIP) self.window.set_name('NotificationPopup') close_button = xml.get_object('close_button') event_type_label = xml.get_object('event_type_label') event_description_label = xml.get_object('event_description_label') eventbox = xml.get_object('eventbox') image = xml.get_object('notification_image') if not text: text = app.get_name_from_jid(account, jid) # default value of text if not title: title = '' event_type_label.set_markup( '%s' % GLib.markup_escape_text(title)) css = '#NotificationPopup {background-color: black }' gtkgui_helpers.add_css_to_widget(self.window, css) # default image if not path_to_image: path_to_image = gtkgui_helpers.get_icon_path('gajim-chat_msg_recv', 48) if event_type == _('Contact Signed In'): bg_color = app.config.get('notif_signin_color') elif event_type == _('Contact Signed Out'): bg_color = app.config.get('notif_signout_color') elif event_type in (_('New Message'), _('New Single Message'), _('New Private Message'), _('New E-mail')): bg_color = app.config.get('notif_message_color') elif event_type == _('File Transfer Request'): bg_color = app.config.get('notif_ftrequest_color') elif event_type == _('File Transfer Error'): bg_color = app.config.get('notif_fterror_color') elif event_type in (_('File Transfer Completed'), _('File Transfer Stopped')): bg_color = app.config.get('notif_ftcomplete_color') elif event_type == _('Groupchat Invitation'): bg_color = app.config.get('notif_invite_color') elif event_type == _('Contact Changed Status'): bg_color = app.config.get('notif_status_color') else: # Unknown event! Shouldn't happen but deal with it bg_color = app.config.get('notif_other_color') background_class = ''' .popup-style { border-image: none; background-image: none; background-color: %s }''' % bg_color gtkgui_helpers.add_css_to_widget(eventbox, background_class) eventbox.get_style_context().add_class('popup-style') gtkgui_helpers.add_css_to_widget(close_button, background_class) eventbox.get_style_context().add_class('popup-style') event_description_label.set_markup('%s' % GLib.markup_escape_text(text)) # set the image image.set_from_file(path_to_image) # position the window to bottom-right of screen window_width, self.window_height = self.window.get_size() app.interface.roster.popups_notification_height += self.window_height pos_x = app.config.get('notification_position_x') screen_w, screen_h = gtkgui_helpers.get_total_screen_geometry() if pos_x < 0: pos_x = screen_w - window_width + pos_x + 1 pos_y = app.config.get('notification_position_y') if pos_y < 0: pos_y = screen_h - \ app.interface.roster.popups_notification_height + pos_y + 1 self.window.move(pos_x, pos_y) xml.connect_signals(self) self.window.show_all() if timeout > 0: GLib.timeout_add_seconds(timeout, self.on_timeout) def on_close_button_clicked(self, widget): self.adjust_height_and_move_popup_notification_windows() def on_timeout(self): self.adjust_height_and_move_popup_notification_windows() def adjust_height_and_move_popup_notification_windows(self): #remove app.interface.roster.popups_notification_height -= self.window_height self.window.destroy() if len(app.interface.roster.popup_notification_windows) > self.index: # we want to remove the destroyed window from the list app.interface.roster.popup_notification_windows.pop(self.index) # move the rest of popup windows app.interface.roster.popups_notification_height = 0 current_index = 0 for window_instance in app.interface.roster.popup_notification_windows: window_instance.index = current_index current_index += 1 window_width, window_height = window_instance.window.get_size() app.interface.roster.popups_notification_height += window_height screen_w, screen_h = gtkgui_helpers.get_total_screen_geometry() window_instance.window.move(screen_w - window_width, screen_h - \ app.interface.roster.popups_notification_height) def on_popup_notification_window_button_press_event(self, widget, event): if event.button != 1: self.window.destroy() return app.interface.handle_event(self.account, self.jid, self.msg_type) self.adjust_height_and_move_popup_notification_windows() class SingleMessageWindow: """ SingleMessageWindow can send or show a received singled message depending on action argument which can be 'send' or 'receive' """ # Keep a reference on windows so garbage collector don't restroy them instances = [] def __init__(self, account, to='', action='', from_whom='', subject='', message='', resource='', session=None, form_node=None): self.instances.append(self) self.account = account self.action = action self.subject = subject self.message = message self.to = to self.from_whom = from_whom self.resource = resource self.session = session self.xml = gtkgui_helpers.get_gtk_builder('single_message_window.ui') self.window = self.xml.get_object('single_message_window') self.count_chars_label = self.xml.get_object('count_chars_label') self.from_label = self.xml.get_object('from_label') self.from_entry = self.xml.get_object('from_entry') self.to_label = self.xml.get_object('to_label') self.to_entry = self.xml.get_object('to_entry') self.subject_entry = self.xml.get_object('subject_entry') self.message_scrolledwindow = self.xml.get_object( 'message_scrolledwindow') self.message_textview = self.xml.get_object('message_textview') self.message_tv_buffer = self.message_textview.get_buffer() self.conversation_scrolledwindow = self.xml.get_object( 'conversation_scrolledwindow') self.conversation_textview = conversation_textview.ConversationTextview( account, used_in_history_window=True) self.conversation_textview.tv.show() self.conversation_tv_buffer = self.conversation_textview.tv.get_buffer() self.xml.get_object('conversation_scrolledwindow').add( self.conversation_textview.tv) self.form_widget = None parent_box = self.xml.get_object('conversation_scrolledwindow').\ get_parent() if form_node: dataform = dataforms.ExtendForm(node=form_node) self.form_widget = dataforms_widget.DataFormWidget(dataform) self.form_widget.show_all() parent_box.add(self.form_widget) parent_box.child_set_property(self.form_widget, 'position', parent_box.child_get_property(self.xml.get_object( 'conversation_scrolledwindow'), 'position')) self.action = 'form' self.send_button = self.xml.get_object('send_button') self.reply_button = self.xml.get_object('reply_button') self.send_and_close_button = self.xml.get_object('send_and_close_button') self.cancel_button = self.xml.get_object('cancel_button') self.close_button = self.xml.get_object('close_button') self.message_tv_buffer.connect('changed', self.update_char_counter) if isinstance(to, list): jid = ', '.join( [i[0].get_full_jid() for i in to]) self.to_entry.set_text(jid) self.to_entry.set_sensitive(False) else: self.to_entry.set_text(to) if app.config.get('use_speller') and app.HAVE_SPELL and action == 'send': lang = app.config.get('speller_language') gspell_lang = Gspell.language_lookup(lang) if gspell_lang is None: AspellDictError(lang) else: spell_buffer = Gspell.TextBuffer.get_from_gtk_text_buffer( self.message_textview.get_buffer()) spell_buffer.set_spell_checker(Gspell.Checker.new(gspell_lang)) spell_view = Gspell.TextView.get_from_gtk_text_view( self.message_textview) spell_view.set_inline_spell_checking(True) spell_view.set_enable_language_menu(True) self.prepare_widgets_for(self.action) # set_text(None) raises TypeError exception if self.subject is None: self.subject = '' self.subject_entry.set_text(self.subject) if to == '': liststore = gtkgui_helpers.get_completion_liststore(self.to_entry) self.completion_dict = helpers.get_contact_dict_for_account(account) keys = sorted(self.completion_dict.keys()) for jid in keys: contact = self.completion_dict[jid] status_icon = gtkgui_helpers.get_iconset_name_for(contact.show) liststore.append((status_icon, jid)) else: self.completion_dict = {} self.xml.connect_signals(self) # get window position and size from config gtkgui_helpers.resize_window(self.window, app.config.get('single-msg-width'), app.config.get('single-msg-height')) gtkgui_helpers.move_window(self.window, app.config.get('single-msg-x-position'), app.config.get('single-msg-y-position')) self.window.show_all() def on_single_message_window_destroy(self, widget): self.instances.remove(self) c = app.contacts.get_contact_with_highest_priority(self.account, self.from_whom) if not c: # Groupchat is maybe already destroyed return if c.is_groupchat() and not self.from_whom in \ app.interface.minimized_controls[self.account] and self.action == \ 'receive' and app.events.get_nb_roster_events(self.account, self.from_whom, types=['chat', 'normal']) == 0: app.interface.roster.remove_groupchat(self.from_whom, self.account) def set_cursor_to_end(self): end_iter = self.message_tv_buffer.get_end_iter() self.message_tv_buffer.place_cursor(end_iter) def save_pos(self): # save the window size and position x, y = self.window.get_position() app.config.set('single-msg-x-position', x) app.config.set('single-msg-y-position', y) width, height = self.window.get_size() app.config.set('single-msg-width', width) app.config.set('single-msg-height', height) def on_single_message_window_delete_event(self, window, ev): self.save_pos() def prepare_widgets_for(self, action): if len(app.connections) > 1: if action == 'send': title = _('Single Message using account %s') % self.account else: title = _('Single Message in account %s') % self.account else: title = _('Single Message') if action == 'send': # prepare UI for Sending title = _('Send %s') % title self.send_button.show() self.send_and_close_button.show() self.to_label.show() self.to_entry.show() self.reply_button.hide() self.from_label.hide() self.from_entry.hide() self.conversation_scrolledwindow.hide() self.message_scrolledwindow.show() if self.message: # we come from a reply? self.message_textview.grab_focus() self.cancel_button.hide() self.close_button.show() self.message_tv_buffer.set_text(self.message) GLib.idle_add(self.set_cursor_to_end) else: # we write a new message (not from reply) self.close_button.hide() if self.to: # do we already have jid? self.subject_entry.grab_focus() elif action == 'receive': # prepare UI for Receiving title = _('Received %s') % title self.reply_button.show() self.from_label.show() self.from_entry.show() self.send_button.hide() self.send_and_close_button.hide() self.to_label.hide() self.to_entry.hide() self.conversation_scrolledwindow.show() self.message_scrolledwindow.hide() if self.message: self.conversation_textview.print_real_text(self.message) fjid = self.from_whom if self.resource: fjid += '/' + self.resource # Full jid of sender (with resource) self.from_entry.set_text(fjid) self.from_entry.set_property('editable', False) self.subject_entry.set_property('editable', False) self.reply_button.grab_focus() self.cancel_button.hide() self.close_button.show() elif action == 'form': # prepare UI for Receiving title = _('Form %s') % title self.send_button.show() self.send_and_close_button.show() self.to_label.show() self.to_entry.show() self.reply_button.hide() self.from_label.hide() self.from_entry.hide() self.conversation_scrolledwindow.hide() self.message_scrolledwindow.hide() self.window.set_title(title) def on_cancel_button_clicked(self, widget): self.save_pos() self.window.destroy() def on_close_button_clicked(self, widget): self.save_pos() self.window.destroy() def update_char_counter(self, widget): characters_no = self.message_tv_buffer.get_char_count() self.count_chars_label.set_text(str(characters_no)) def send_single_message(self): if app.connections[self.account].connected <= 1: # if offline or connecting ErrorDialog(_('Connection not available'), _('Please make sure you are connected with "%s".') % self.account) return True if isinstance(self.to, list): sender_list = [] for i in self.to: if i[0].resource: sender_list.append(i[0].jid + '/' + i[0].resource) else: sender_list.append(i[0].jid) else: sender_list = [j.strip() for j in self.to_entry.get_text().split( ',')] subject = self.subject_entry.get_text() begin, end = self.message_tv_buffer.get_bounds() message = self.message_tv_buffer.get_text(begin, end, True) if self.form_widget: form_node = self.form_widget.data_form else: form_node = None recipient_list = [] for to_whom_jid in sender_list: if to_whom_jid in self.completion_dict: to_whom_jid = self.completion_dict[to_whom_jid].jid try: to_whom_jid = helpers.parse_jid(to_whom_jid) except helpers.InvalidFormat: ErrorDialog(_('Invalid JID'), _('It is not possible to send a message to %s, this JID is not ' 'valid.') % to_whom_jid) return True if '/announce/' in to_whom_jid: app.connections[self.account].send_motd(to_whom_jid, subject, message) continue recipient_list.append(to_whom_jid) app.nec.push_outgoing_event(MessageOutgoingEvent(None, account=self.account, jid=recipient_list, message=message, type_='normal', subject=subject, form_node=form_node)) self.subject_entry.set_text('') # we sent ok, clear the subject self.message_tv_buffer.set_text('') # we sent ok, clear the textview def on_send_button_clicked(self, widget): self.send_single_message() def on_reply_button_clicked(self, widget): # we create a new blank window to send and we preset RE: and to jid self.subject = _('RE: %s') % self.subject self.message = _('%s wrote:\n') % self.from_whom + self.message # add > at the begining of each line self.message = self.message.replace('\n', '\n> ') + '\n\n' self.window.destroy() SingleMessageWindow(self.account, to=self.from_whom, action='send', from_whom=self.from_whom, subject=self.subject, message=self.message, session=self.session) def on_send_and_close_button_clicked(self, widget): if self.send_single_message(): return self.save_pos() self.window.destroy() def on_single_message_window_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: # ESCAPE self.save_pos() self.window.destroy() class XMLConsoleWindow(Gtk.Window): def __init__(self, account): Gtk.Window.__init__(self) self.account = account self.enabled = True self.presence = True self.message = True self.iq = True self.stream = True self.incoming = True self.outgoing = True self.filter_dialog = None glade_objects = ['textview', 'input', 'scrolled_input', 'headerbar', 'scrolled', 'actionbar', 'paned', 'box', 'menubutton'] self.builder = gtkgui_helpers.get_gtk_builder('xml_console_window.ui') for obj in glade_objects: setattr(self, obj, self.builder.get_object(obj)) self.set_titlebar(self.headerbar) jid = app.get_jid_from_account(account) self.headerbar.set_subtitle(jid) self.set_default_size(600, 600) self.add(self.box) self.paned.set_position(self.paned.get_property('max-position')) button = gtkgui_helpers.get_image_button( 'edit-clear-all-symbolic', _('Clear')) button.connect('clicked', self.on_clear) self.actionbar.pack_start(button) button = gtkgui_helpers.get_image_button( 'applications-system-symbolic', _('Filter')) button.connect('clicked', self.on_filter_options) self.actionbar.pack_start(button) button = gtkgui_helpers.get_image_button( 'document-edit-symbolic', _('XML Input'), toggle=True) button.connect('toggled', self.on_input) self.actionbar.pack_start(button) button = gtkgui_helpers.get_image_button('emblem-ok-symbolic', _('Send')) button.connect('clicked', self.on_send) self.actionbar.pack_end(button) self.actionbar.pack_start(self.menubutton) self.create_tags() self.show_all() self.scrolled_input.hide() self.menubutton.hide() self.connect("destroy", self.on_destroy) self.connect('key_press_event', self.on_key_press_event) self.builder.connect_signals(self) app.ged.register_event_handler('stanza-received', ged.GUI1, self._nec_stanza_received) app.ged.register_event_handler('stanza-sent', ged.GUI1, self._nec_stanza_sent) def create_tags(self): buffer_ = self.textview.get_buffer() in_color = app.config.get('inmsgcolor') out_color = app.config.get('outmsgcolor') tags = ['presence', 'message', 'stream', 'iq'] tag = buffer_.create_tag('incoming') tag.set_property('foreground', in_color) tag = buffer_.create_tag('outgoing') tag.set_property('foreground', out_color) for tag_name in tags: buffer_.create_tag(tag_name) def on_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.destroy() def on_row_activated(self, listbox, row): text = row.get_child().get_text() input_text = None if text == 'Presence': input_text = ( '\n' '\n' '\n' '\n' '') elif text == 'Message': input_text = ( '\n' '\n' '') elif text == 'Iq': input_text = ( '\n' '\n' '') if input_text is not None: buffer_ = self.input.get_buffer() buffer_.set_text(input_text) self.input.grab_focus() def on_send(self, *args): if app.connections[self.account].connected <= 1: # if offline or connecting ErrorDialog(_('Connection not available'), _('Please make sure you are connected with "%s".') % \ self.account) return buffer_ = self.input.get_buffer() begin_iter, end_iter = buffer_.get_bounds() stanza = buffer_.get_text(begin_iter, end_iter, True) if stanza: app.connections[self.account].send_stanza(stanza) buffer_.set_text('') def on_input(self, button, *args): if button.get_active(): self.paned.get_child2().show() self.menubutton.show() self.input.grab_focus() else: self.paned.get_child2().hide() self.menubutton.hide() def on_filter_options(self, *args): if self.filter_dialog: self.filter_dialog.present() return options = [ Option(OptionKind.SWITCH, 'Presence', OptionType.VALUE, self.presence, callback=self.on_option, data='presence'), Option(OptionKind.SWITCH, 'Message', OptionType.VALUE, self.message, callback=self.on_option, data='message'), Option(OptionKind.SWITCH, 'Iq', OptionType.VALUE, self.iq, callback=self.on_option, data='iq'), Option(OptionKind.SWITCH, 'Stream\nManagement', OptionType.VALUE, self.stream, callback=self.on_option, data='stream'), Option(OptionKind.SWITCH, 'In', OptionType.VALUE, self.incoming, callback=self.on_option, data='incoming'), Option(OptionKind.SWITCH, 'Out', OptionType.VALUE, self.outgoing, callback=self.on_option, data='outgoing'), ] self.filter_dialog = OptionsDialog(self, 'Filter', Gtk.DialogFlags.DESTROY_WITH_PARENT, options, self.account) self.filter_dialog.connect('destroy', self.on_filter_destroyed) def on_filter_destroyed(self, win): self.filter_dialog = None def on_clear(self, *args): buffer_ = self.textview.get_buffer().set_text('') def on_destroy(self, *args): del app.interface.instances[self.account]['xml_console'] app.ged.remove_event_handler('stanza-received', ged.GUI1, self._nec_stanza_received) app.ged.remove_event_handler('stanza-sent', ged.GUI1, self._nec_stanza_sent) def on_enable(self, switch, param): self.enabled = switch.get_active() def on_option(self, value, data): setattr(self, data, value) value = not value table = self.textview.get_buffer().get_tag_table() tag = table.lookup(data) if data in ('incoming', 'outgoing'): if value: tag.set_priority(table.get_size() - 1) else: tag.set_priority(0) tag.set_property('invisible', value) def _nec_stanza_received(self, obj): if obj.conn.name != self.account: return self.print_stanza(obj.stanza_str, 'incoming') def _nec_stanza_sent(self, obj): if obj.conn.name != self.account: return self.print_stanza(obj.stanza_str, 'outgoing') def print_stanza(self, stanza, kind): # kind must be 'incoming' or 'outgoing' if not self.enabled: return if not stanza: return at_the_end = gtkgui_helpers.at_the_end(self.scrolled) buffer_ = self.textview.get_buffer() end_iter = buffer_.get_end_iter() type_ = kind if stanza.startswith('<', '>\n<')) buffer_.insert_with_tags_by_name(end_iter, stanza, type_, kind) if at_the_end: GLib.idle_add(gtkgui_helpers.scroll_to_end, self.scrolled) #Action that can be done with an incoming list of contacts TRANSLATED_ACTION = {'add': _('add'), 'modify': _('modify'), 'remove': _('remove')} class RosterItemExchangeWindow: """ Windows used when someone send you a exchange contact suggestion """ def __init__(self, account, action, exchange_list, jid_from, message_body=None): self.account = account self.action = action self.exchange_list = exchange_list self.message_body = message_body self.jid_from = jid_from show_dialog = False # Connect to gtk builder self.xml = gtkgui_helpers.get_gtk_builder( 'roster_item_exchange_window.ui') self.window = self.xml.get_object('roster_item_exchange_window') # Add Widgets. for widget_to_add in ['accept_button_label', 'type_label', 'body_scrolledwindow', 'body_textview', 'items_list_treeview']: self.__dict__[widget_to_add] = self.xml.get_object(widget_to_add) # Set labels # self.action can be 'add', 'modify' or 'remove' self.type_label.set_label( _('%(jid)s would like you to %(action)s some contacts ' 'in your roster.') % {'jid': jid_from, 'action': TRANSLATED_ACTION[self.action]}) if message_body: buffer_ = self.body_textview.get_buffer() buffer_.set_text(self.message_body) else: self.body_scrolledwindow.hide() # Treeview model = Gtk.ListStore(bool, str, str, str, str) self.items_list_treeview.set_model(model) # columns renderer1 = Gtk.CellRendererToggle() renderer1.set_property('activatable', True) renderer1.connect('toggled', self.toggled_callback) if self.action == 'add': title = _('Add') elif self.action == 'modify': title = _('Modify') elif self.action == 'delete': title = _('Delete') self.items_list_treeview.insert_column_with_attributes(-1, title, renderer1, active=0) renderer2 = Gtk.CellRendererText() self.items_list_treeview.insert_column_with_attributes(-1, _('JID'), renderer2, text=1) renderer3 = Gtk.CellRendererText() self.items_list_treeview.insert_column_with_attributes(-1, _('Name'), renderer3, text=2) renderer4 = Gtk.CellRendererText() self.items_list_treeview.insert_column_with_attributes(-1, _('Groups'), renderer4, text=3) # Init contacts model = self.items_list_treeview.get_model() model.clear() if action == 'add': for jid in self.exchange_list: groups = '' is_in_roster = True contact = app.contacts.get_contact_with_highest_priority( self.account, jid) if not contact or _('Not in Roster') in contact.groups: is_in_roster = False name = self.exchange_list[jid][0] num_list = len(self.exchange_list[jid][1]) current = 0 for group in self.exchange_list[jid][1]: current += 1 if contact and not group in contact.groups: is_in_roster = False if current == num_list: groups = groups + group else: groups = groups + group + ', ' if not is_in_roster: show_dialog = True iter_ = model.append() model.set(iter_, 0, True, 1, jid, 2, name, 3, groups) # Change label for accept_button to action name instead of 'OK'. self.accept_button_label.set_label(_('Add')) elif action == 'modify': for jid in self.exchange_list: groups = '' is_in_roster = True is_right = True contact = app.contacts.get_contact_with_highest_priority( self.account, jid) name = self.exchange_list[jid][0] if not contact: is_in_roster = False is_right = False else: if name != contact.name: is_right = False num_list = len(self.exchange_list[jid][1]) current = 0 for group in self.exchange_list[jid][1]: current += 1 if contact and not group in contact.groups: is_right = False if current == num_list: groups = groups + group else: groups = groups + group + ', ' if not is_right and is_in_roster: show_dialog = True iter_ = model.append() model.set(iter_, 0, True, 1, jid, 2, name, 3, groups) # Change label for accept_button to action name instead of 'OK'. self.accept_button_label.set_label(_('Modify')) elif action == 'delete': for jid in self.exchange_list: groups = '' is_in_roster = True contact = app.contacts.get_contact_with_highest_priority( self.account, jid) name = self.exchange_list[jid][0] if not contact: is_in_roster = False num_list = len(self.exchange_list[jid][1]) current = 0 for group in self.exchange_list[jid][1]: current += 1 if current == num_list: groups = groups + group else: groups = groups + group + ', ' if is_in_roster: show_dialog = True iter_ = model.append() model.set(iter_, 0, True, 1, jid, 2, name, 3, groups) # Change label for accept_button to action name instead of 'OK'. self.accept_button_label.set_label(_('Delete')) if show_dialog: self.window.show_all() self.xml.connect_signals(self) def toggled_callback(self, cell, path): model = self.items_list_treeview.get_model() iter_ = model.get_iter(path) model[iter_][0] = not cell.get_active() def on_accept_button_clicked(self, widget): model = self.items_list_treeview.get_model() iter_ = model.get_iter_first() if self.action == 'add': a = 0 while iter_: if model[iter_][0]: a+=1 # it is selected #remote_jid = model[iter_][1] message = _('%s suggested me to add you in my roster.' % self.jid_from) # keep same groups and same nickname groups = model[iter_][3].split(', ') if groups == ['']: groups = [] jid = model[iter_][1] if app.jid_is_transport(self.jid_from): app.connections[self.account].automatically_added.append( jid) app.interface.roster.req_sub(self, jid, message, self.account, groups=groups, nickname=model[iter_][2], auto_auth=True) iter_ = model.iter_next(iter_) InformationDialog(i18n.ngettext('Added %d contact', 'Added %d contacts', a, a, a)) elif self.action == 'modify': a = 0 while iter_: if model[iter_][0]: a+=1 # it is selected jid = model[iter_][1] # keep same groups and same nickname groups = model[iter_][3].split(', ') if groups == ['']: groups = [] for u in app.contacts.get_contact(self.account, jid): u.name = model[iter_][2] app.connections[self.account].update_contact(jid, model[iter_][2], groups) self.draw_contact(jid, self.account) # Update opened chat ctrl = app.interface.msg_win_mgr.get_control(jid, self.account) if ctrl: ctrl.update_ui() win = app.interface.msg_win_mgr.get_window(jid, self.account) win.redraw_tab(ctrl) win.show_title() iter_ = model.iter_next(iter_) elif self.action == 'delete': a = 0 while iter_: if model[iter_][0]: a+=1 # it is selected jid = model[iter_][1] app.connections[self.account].unsubscribe(jid) app.interface.roster.remove_contact(jid, self.account) app.contacts.remove_jid(self.account, jid) iter_ = model.iter_next(iter_) InformationDialog(i18n.ngettext('Removed %d contact', 'Removed %d contacts', a, a, a)) self.window.destroy() def on_cancel_button_clicked(self, widget): self.window.destroy() class Archiving313PreferencesWindow: default_dict = {'always': 0, 'roster': 1, 'never': 2} default_dict_cb = {0: 'always', 1: 'roster', 2: 'never'} def __init__(self, account): self.account = account self.idle_id = None # Connect to glade self.xml = gtkgui_helpers.get_gtk_builder( 'archiving_313_preferences_window.ui') self.window = self.xml.get_object('archiving_313_pref') # Add Widgets for widget in ('archive_items_liststore', 'default_cb'): setattr(self, widget, self.xml.get_object(widget)) self.window.set_title(_('Archiving Preferences for %s') % self.account) app.ged.register_event_handler( 'archiving-313-preferences-changed-received', ged.GUI1, self._nec_archiving_313_changed_received) app.ged.register_event_handler( 'archiving-error-received', ged.GUI1, self._nec_archiving_error) self.default_cb.set_active(0) self.set_widget_state(False) self.window.show_all() self.xml.connect_signals(self) self.idle_id = GLib.timeout_add_seconds(3, self._nec_archiving_error) app.connections[self.account].request_archive_preferences() def on_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.window.destroy() def set_widget_state(self, state): for widget in ('default_cb', 'save_button', 'add_button', 'remove_button'): self.xml.get_object(widget).set_sensitive(state) def _nec_archiving_313_changed_received(self, obj): if obj.conn.name != self.account: return try: GLib.source_remove(self.idle_id) except Exception as e: log.debug(e) self.set_widget_state(True) if obj.answer: def on_ok(dialog): self.window.destroy() dialog = HigDialog( self.window, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, _('Success!'), _('Your Archiving Preferences have been saved!'), on_response_ok=on_ok, on_response_cancel=on_ok) dialog.popup() self.default_cb.set_active(self.default_dict[obj.default]) self.archive_items_liststore.clear() for items in obj.items: self.archive_items_liststore.append(items) def _nec_archiving_error(self, obj=None): if obj and obj.conn.name != self.account: return try: GLib.source_remove(self.idle_id) except Exception as e: log.debug(e) if not obj: msg = _('We got no response from the Server') else: msg = _('We received an error: {}').format(self.error_msg) dialog = HigDialog( self.window, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, _('Error!'), msg) dialog.popup() self.set_widget_state(True) return def on_add_item_button_clicked(self, widget): key_name = 'item_archiving_preferences' if key_name in app.interface.instances[self.account]: app.interface.instances[self.account][key_name].window.present() else: app.interface.instances[self.account][key_name] = \ ItemArchiving313PreferencesWindow( self.account, self, self.window) def on_remove_item_button_clicked(self, widget): archive_view = self.xml.get_object('archive_view') mod, path = archive_view.get_selection().get_selected_rows() if path: iter_ = mod.get_iter(path) self.archive_items_liststore.remove(iter_) def on_save_button_clicked(self, widget): self.set_widget_state(False) items = [] default = self.default_dict_cb[self.default_cb.get_active()] for item in self.archive_items_liststore: items.append((item[0].lower(), item[1].lower())) self.idle_id = GLib.timeout_add_seconds(3, self._nec_archiving_error) app.connections[self.account]. \ set_archive_preferences(items, default) def on_close_button_clicked(self, widget): self.window.destroy() def on_archiving_preferences_window_destroy(self, widget): app.ged.remove_event_handler( 'archiving-313-preferences-changed-received', ged.GUI1, self._nec_archiving_313_changed_received) app.ged.remove_event_handler( 'archiving-error-received', ged.GUI1, self._nec_archiving_error) if 'archiving_preferences' in app.interface.instances[self.account]: del app.interface.instances[self.account]['archiving_preferences'] class ItemArchiving313PreferencesWindow: def __init__(self, account, archive, transient): self.account = account self.archive = archive self.xml = gtkgui_helpers.get_gtk_builder( 'archiving_313_preferences_item.ui') self.window = self.xml.get_object('item_dialog') self.window.set_transient_for(transient) # Add Widgets for widget in ('jid_entry', 'pref_cb'): setattr(self, widget, self.xml.get_object(widget)) self.window.set_title(_('Add JID')) self.pref_cb.set_active(0) self.window.show_all() self.xml.connect_signals(self) def on_ok_button_clicked(self, widget): if self.pref_cb.get_active() == 0: pref = 'Always' else: pref = 'Never' text = self.jid_entry.get_text() if not text: self.window.destroy() return else: self.archive.archive_items_liststore.append((text, pref)) self.window.destroy() def on_cancel_button_clicked(self, widget): self.window.destroy() def on_item_archiving_preferences_window_destroy(self, widget): key_name = 'item_archiving_preferences' if key_name in app.interface.instances[self.account]: del app.interface.instances[self.account][key_name] class PrivacyListWindow: """ Window that is used for creating NEW or EDITING already there privacy lists """ def __init__(self, account, privacy_list_name, action): '''action is 'EDIT' or 'NEW' depending on if we create a new priv list or edit an already existing one''' self.account = account self.privacy_list_name = privacy_list_name # Dicts and Default Values self.active_rule = '' self.global_rules = {} self.list_of_groups = {} self.max_order = 0 # Default Edit Values self.edit_rule_type = 'jid' self.allow_deny = 'allow' # Connect to gtk builder self.xml = gtkgui_helpers.get_gtk_builder('privacy_list_window.ui') self.window = self.xml.get_object('privacy_list_edit_window') # Add Widgets for widget_to_add in ('title_hbox', 'privacy_lists_title_label', 'list_of_rules_label', 'add_edit_rule_label', 'delete_open_buttons_hbox', 'privacy_list_active_checkbutton', 'privacy_list_default_checkbutton', 'list_of_rules_combobox', 'delete_open_buttons_hbox', 'delete_rule_button', 'open_rule_button', 'edit_allow_radiobutton', 'edit_deny_radiobutton', 'edit_type_jabberid_radiobutton', 'edit_type_jabberid_entry', 'edit_type_group_radiobutton', 'edit_type_group_combobox', 'edit_type_subscription_radiobutton', 'edit_type_subscription_combobox', 'edit_type_select_all_radiobutton', 'edit_queries_send_checkbutton', 'edit_send_messages_checkbutton', 'edit_view_status_checkbutton', 'edit_all_checkbutton', 'edit_order_spinbutton', 'new_rule_button', 'save_rule_button', 'privacy_list_refresh_button', 'privacy_list_close_button', 'edit_send_status_checkbutton', 'add_edit_vbox', 'privacy_list_active_checkbutton', 'privacy_list_default_checkbutton'): self.__dict__[widget_to_add] = self.xml.get_object(widget_to_add) self.privacy_lists_title_label.set_label( _('Privacy List %s') % \ GLib.markup_escape_text(self.privacy_list_name)) if len(app.connections) > 1: title = _('Privacy List for %s') % self.account else: title = _('Privacy List') self.delete_rule_button.set_sensitive(False) self.open_rule_button.set_sensitive(False) self.privacy_list_active_checkbutton.set_sensitive(False) self.privacy_list_default_checkbutton.set_sensitive(False) self.list_of_rules_combobox.set_sensitive(False) # set jabber id completion jids_list_store = Gtk.ListStore(GObject.TYPE_STRING) for jid in app.contacts.get_jid_list(self.account): jids_list_store.append([jid]) jid_entry_completion = Gtk.EntryCompletion() jid_entry_completion.set_text_column(0) jid_entry_completion.set_model(jids_list_store) jid_entry_completion.set_popup_completion(True) self.edit_type_jabberid_entry.set_completion(jid_entry_completion) if action == 'EDIT': self.refresh_rules() model = self.edit_type_group_combobox.get_model() count = 0 for group in app.groups[self.account]: self.list_of_groups[group] = count count += 1 model.append([group]) self.edit_type_group_combobox.set_active(0) self.window.set_title(title) app.ged.register_event_handler('privacy-list-received', ged.GUI1, self._nec_privacy_list_received) app.ged.register_event_handler('privacy-list-active-default', ged.GUI1, self._nec_privacy_list_active_default) self.window.show_all() self.add_edit_vbox.hide() self.xml.connect_signals(self) def on_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.window.destroy() def on_privacy_list_edit_window_destroy(self, widget): key_name = 'privacy_list_%s' % self.privacy_list_name if key_name in app.interface.instances[self.account]: del app.interface.instances[self.account][key_name] app.ged.remove_event_handler('privacy-list-received', ged.GUI1, self._nec_privacy_list_received) app.ged.remove_event_handler('privacy-list-active-default', ged.GUI1, self._nec_privacy_list_active_default) def _nec_privacy_list_active_default(self, obj): if obj.conn.name != self.account: return if obj.active_list == self.privacy_list_name: self.privacy_list_active_checkbutton.set_active(True) else: self.privacy_list_active_checkbutton.set_active(False) if obj.default_list == self.privacy_list_name: self.privacy_list_default_checkbutton.set_active(True) else: self.privacy_list_default_checkbutton.set_active(False) def privacy_list_received(self, rules): model = self.list_of_rules_combobox.get_model() model.clear() self.global_rules = {} for rule in rules: if 'type' in rule: text_item = _('Order: %(order)s, action: %(action)s, type: %(type)s' ', value: %(value)s') % {'order': rule['order'], 'action': rule['action'], 'type': rule['type'], 'value': rule['value']} else: text_item = _('Order: %(order)s, action: %(action)s') % \ {'order': rule['order'], 'action': rule['action']} if int(rule['order']) > self.max_order: self.max_order = int(rule['order']) self.global_rules[text_item] = rule model.append([text_item]) if len(rules) == 0: self.title_hbox.set_sensitive(False) self.list_of_rules_combobox.set_sensitive(False) self.delete_rule_button.set_sensitive(False) self.open_rule_button.set_sensitive(False) self.privacy_list_active_checkbutton.set_sensitive(False) self.privacy_list_default_checkbutton.set_sensitive(False) else: self.list_of_rules_combobox.set_active(0) self.title_hbox.set_sensitive(True) self.list_of_rules_combobox.set_sensitive(True) self.delete_rule_button.set_sensitive(True) self.open_rule_button.set_sensitive(True) self.privacy_list_active_checkbutton.set_sensitive(True) self.privacy_list_default_checkbutton.set_sensitive(True) self.reset_fields() app.connections[self.account].get_active_default_lists() def _nec_privacy_list_received(self, obj): if obj.conn.name != self.account: return if obj.list_name != self.privacy_list_name: return self.privacy_list_received(obj.rules) def refresh_rules(self): app.connections[self.account].get_privacy_list(self.privacy_list_name) def on_delete_rule_button_clicked(self, widget): model = self.list_of_rules_combobox.get_model() iter_ = self.list_of_rules_combobox.get_active_iter() _rule = model[iter_][0] tags = [] for rule in self.global_rules: if rule != _rule: tags.append(self.global_rules[rule]) app.connections[self.account].set_privacy_list( self.privacy_list_name, tags) self.privacy_list_received(tags) self.add_edit_vbox.hide() if not tags: # we removed latest rule if 'privacy_lists' in app.interface.instances[self.account]: win = app.interface.instances[self.account]['privacy_lists'] win.remove_privacy_list_from_combobox(self.privacy_list_name) win.draw_widgets() def on_open_rule_button_clicked(self, widget): self.add_edit_rule_label.set_label( _('Edit a rule')) active_num = self.list_of_rules_combobox.get_active() if active_num == -1: self.active_rule = '' else: model = self.list_of_rules_combobox.get_model() iter_ = self.list_of_rules_combobox.get_active_iter() self.active_rule = model[iter_][0] if self.active_rule != '': rule_info = self.global_rules[self.active_rule] self.edit_order_spinbutton.set_value(int(rule_info['order'])) if 'type' in rule_info: if rule_info['type'] == 'jid': self.edit_type_jabberid_radiobutton.set_active(True) self.edit_type_jabberid_entry.set_text(rule_info['value']) elif rule_info['type'] == 'group': self.edit_type_group_radiobutton.set_active(True) if rule_info['value'] in self.list_of_groups: self.edit_type_group_combobox.set_active( self.list_of_groups[rule_info['value']]) else: self.edit_type_group_combobox.set_active(0) elif rule_info['type'] == 'subscription': self.edit_type_subscription_radiobutton.set_active(True) sub_value = rule_info['value'] if sub_value == 'none': self.edit_type_subscription_combobox.set_active(0) elif sub_value == 'both': self.edit_type_subscription_combobox.set_active(1) elif sub_value == 'from': self.edit_type_subscription_combobox.set_active(2) elif sub_value == 'to': self.edit_type_subscription_combobox.set_active(3) else: self.edit_type_select_all_radiobutton.set_active(True) else: self.edit_type_select_all_radiobutton.set_active(True) self.edit_send_messages_checkbutton.set_active(False) self.edit_queries_send_checkbutton.set_active(False) self.edit_view_status_checkbutton.set_active(False) self.edit_send_status_checkbutton.set_active(False) self.edit_all_checkbutton.set_active(False) if not rule_info['child']: self.edit_all_checkbutton.set_active(True) else: if 'presence-out' in rule_info['child']: self.edit_send_status_checkbutton.set_active(True) if 'presence-in' in rule_info['child']: self.edit_view_status_checkbutton.set_active(True) if 'iq' in rule_info['child']: self.edit_queries_send_checkbutton.set_active(True) if 'message' in rule_info['child']: self.edit_send_messages_checkbutton.set_active(True) if rule_info['action'] == 'allow': self.edit_allow_radiobutton.set_active(True) else: self.edit_deny_radiobutton.set_active(True) self.add_edit_vbox.show() def on_edit_all_checkbutton_toggled(self, widget): if widget.get_active(): self.edit_send_messages_checkbutton.set_active(True) self.edit_queries_send_checkbutton.set_active(True) self.edit_view_status_checkbutton.set_active(True) self.edit_send_status_checkbutton.set_active(True) self.edit_send_messages_checkbutton.set_sensitive(False) self.edit_queries_send_checkbutton.set_sensitive(False) self.edit_view_status_checkbutton.set_sensitive(False) self.edit_send_status_checkbutton.set_sensitive(False) else: self.edit_send_messages_checkbutton.set_active(False) self.edit_queries_send_checkbutton.set_active(False) self.edit_view_status_checkbutton.set_active(False) self.edit_send_status_checkbutton.set_active(False) self.edit_send_messages_checkbutton.set_sensitive(True) self.edit_queries_send_checkbutton.set_sensitive(True) self.edit_view_status_checkbutton.set_sensitive(True) self.edit_send_status_checkbutton.set_sensitive(True) def on_privacy_list_active_checkbutton_toggled(self, widget): if widget.get_active(): app.connections[self.account].set_active_list( self.privacy_list_name) else: app.connections[self.account].set_active_list(None) def on_privacy_list_default_checkbutton_toggled(self, widget): if widget.get_active(): app.connections[self.account].set_default_list( self.privacy_list_name) else: app.connections[self.account].set_default_list(None) def on_new_rule_button_clicked(self, widget): self.reset_fields() self.add_edit_vbox.show() def reset_fields(self): self.edit_type_jabberid_entry.set_text('') self.edit_allow_radiobutton.set_active(True) self.edit_type_jabberid_radiobutton.set_active(True) self.active_rule = '' self.edit_send_messages_checkbutton.set_active(False) self.edit_queries_send_checkbutton.set_active(False) self.edit_view_status_checkbutton.set_active(False) self.edit_send_status_checkbutton.set_active(False) self.edit_all_checkbutton.set_active(False) self.edit_order_spinbutton.set_value(self.max_order + 1) self.edit_type_group_combobox.set_active(0) self.edit_type_subscription_combobox.set_active(0) self.add_edit_rule_label.set_label( _('Add a rule')) def get_current_tags(self): if self.edit_type_jabberid_radiobutton.get_active(): edit_type = 'jid' edit_value = self.edit_type_jabberid_entry.get_text() elif self.edit_type_group_radiobutton.get_active(): edit_type = 'group' model = self.edit_type_group_combobox.get_model() iter_ = self.edit_type_group_combobox.get_active_iter() edit_value = model[iter_][0] elif self.edit_type_subscription_radiobutton.get_active(): edit_type = 'subscription' subs = ['none', 'both', 'from', 'to'] edit_value = subs[self.edit_type_subscription_combobox.get_active()] elif self.edit_type_select_all_radiobutton.get_active(): edit_type = '' edit_value = '' edit_order = str(self.edit_order_spinbutton.get_value_as_int()) if self.edit_allow_radiobutton.get_active(): edit_deny = 'allow' else: edit_deny = 'deny' child = [] if not self.edit_all_checkbutton.get_active(): if self.edit_send_messages_checkbutton.get_active(): child.append('message') if self.edit_queries_send_checkbutton.get_active(): child.append('iq') if self.edit_send_status_checkbutton.get_active(): child.append('presence-out') if self.edit_view_status_checkbutton.get_active(): child.append('presence-in') if edit_type != '': return {'order': edit_order, 'action': edit_deny, 'type': edit_type, 'value': edit_value, 'child': child} return {'order': edit_order, 'action': edit_deny, 'child': child} def on_save_rule_button_clicked(self, widget): tags=[] current_tags = self.get_current_tags() if int(current_tags['order']) > self.max_order: self.max_order = int(current_tags['order']) if self.active_rule == '': tags.append(current_tags) for rule in self.global_rules: if rule != self.active_rule: tags.append(self.global_rules[rule]) else: tags.append(current_tags) app.connections[self.account].set_privacy_list( self.privacy_list_name, tags) self.refresh_rules() self.add_edit_vbox.hide() if 'privacy_lists' in app.interface.instances[self.account]: win = app.interface.instances[self.account]['privacy_lists'] win.add_privacy_list_to_combobox(self.privacy_list_name) win.draw_widgets() def on_list_of_rules_combobox_changed(self, widget): self.add_edit_vbox.hide() def on_edit_type_radiobutton_changed(self, widget, radiobutton): active_bool = widget.get_active() if active_bool: self.edit_rule_type = radiobutton def on_edit_allow_radiobutton_changed(self, widget, radiobutton): active_bool = widget.get_active() if active_bool: self.allow_deny = radiobutton def on_close_button_clicked(self, widget): self.window.destroy() class PrivacyListsWindow: """ Window that is the main window for Privacy Lists; we can list there the privacy lists and ask to create a new one or edit an already there one """ def __init__(self, account): self.account = account self.privacy_lists_save = [] self.xml = gtkgui_helpers.get_gtk_builder('privacy_lists_window.ui') self.window = self.xml.get_object('privacy_lists_first_window') for widget_to_add in ('list_of_privacy_lists_combobox', 'delete_privacy_list_button', 'open_privacy_list_button', 'new_privacy_list_button', 'new_privacy_list_entry', 'privacy_lists_refresh_button', 'close_privacy_lists_window_button'): self.__dict__[widget_to_add] = self.xml.get_object(widget_to_add) self.draw_privacy_lists_in_combobox([]) self.privacy_lists_refresh() self.enabled = True if len(app.connections) > 1: title = _('Privacy Lists for %s') % self.account else: title = _('Privacy Lists') self.window.set_title(title) app.ged.register_event_handler('privacy-lists-received', ged.GUI1, self._nec_privacy_lists_received) app.ged.register_event_handler('privacy-lists-removed', ged.GUI1, self._nec_privacy_lists_removed) self.window.show_all() self.xml.connect_signals(self) def on_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.window.destroy() def on_privacy_lists_first_window_destroy(self, widget): if 'privacy_lists' in app.interface.instances[self.account]: del app.interface.instances[self.account]['privacy_lists'] app.ged.remove_event_handler('privacy-lists-received', ged.GUI1, self._nec_privacy_lists_received) app.ged.remove_event_handler('privacy-lists-removed', ged.GUI1, self._nec_privacy_lists_removed) def remove_privacy_list_from_combobox(self, privacy_list): if privacy_list not in self.privacy_lists_save: return privacy_list_index = self.privacy_lists_save.index(privacy_list) self.list_of_privacy_lists_combobox.remove_text(privacy_list_index) self.privacy_lists_save.remove(privacy_list) def add_privacy_list_to_combobox(self, privacy_list): if privacy_list in self.privacy_lists_save: return model = self.list_of_privacy_lists_combobox.get_model() model.append([privacy_list]) self.privacy_lists_save.append(privacy_list) def draw_privacy_lists_in_combobox(self, privacy_lists): self.list_of_privacy_lists_combobox.set_active(-1) self.list_of_privacy_lists_combobox.get_model().clear() self.privacy_lists_save = [] for add_item in privacy_lists: self.add_privacy_list_to_combobox(add_item) self.draw_widgets() def draw_widgets(self): if len(self.privacy_lists_save) == 0: self.list_of_privacy_lists_combobox.set_sensitive(False) self.open_privacy_list_button.set_sensitive(False) self.delete_privacy_list_button.set_sensitive(False) else: self.list_of_privacy_lists_combobox.set_sensitive(True) self.list_of_privacy_lists_combobox.set_active(0) self.open_privacy_list_button.set_sensitive(True) self.delete_privacy_list_button.set_sensitive(True) def on_close_button_clicked(self, widget): self.window.destroy() def on_delete_privacy_list_button_clicked(self, widget): active_list = self.privacy_lists_save[ self.list_of_privacy_lists_combobox.get_active()] app.connections[self.account].del_privacy_list(active_list) def privacy_list_removed(self, active_list): self.privacy_lists_save.remove(active_list) self.privacy_lists_received({'lists': self.privacy_lists_save}) def _nec_privacy_lists_removed(self, obj): if obj.conn.name != self.account: return self.privacy_list_removed(obj.lists_list) def privacy_lists_received(self, lists): if not lists: return privacy_lists = [] for privacy_list in lists['lists']: privacy_lists.append(privacy_list) self.draw_privacy_lists_in_combobox(privacy_lists) def _nec_privacy_lists_received(self, obj): if obj.conn.name != self.account: return self.privacy_lists_received(obj.lists_list) def privacy_lists_refresh(self): app.connections[self.account].get_privacy_lists() def on_new_privacy_list_button_clicked(self, widget): name = self.new_privacy_list_entry.get_text() if not name: ErrorDialog(_('Invalid List Name'), _('You must enter a name to create a privacy list.'), transient_for=self.window) return key_name = 'privacy_list_%s' % name if key_name in app.interface.instances[self.account]: app.interface.instances[self.account][key_name].window.present() else: app.interface.instances[self.account][key_name] = \ PrivacyListWindow(self.account, name, 'NEW') self.new_privacy_list_entry.set_text('') def on_privacy_lists_refresh_button_clicked(self, widget): self.privacy_lists_refresh() def on_open_privacy_list_button_clicked(self, widget): name = self.privacy_lists_save[ self.list_of_privacy_lists_combobox.get_active()] key_name = 'privacy_list_%s' % name if key_name in app.interface.instances[self.account]: app.interface.instances[self.account][key_name].window.present() else: app.interface.instances[self.account][key_name] = \ PrivacyListWindow(self.account, name, 'EDIT') class InvitationReceivedDialog: def __init__(self, account, room_jid, contact_fjid, password=None, comment=None, is_continued=False): self.room_jid = room_jid self.account = account self.password = password self.is_continued = is_continued self.contact_fjid = contact_fjid jid = app.get_jid_without_resource(contact_fjid) pritext = _('''You are invited to a groupchat''') #Don't translate $Contact if is_continued: sectext = _('$Contact has invited you to join a discussion') else: sectext = _('$Contact has invited you to group chat %(room_jid)s')\ % {'room_jid': room_jid} contact = app.contacts.get_first_contact_from_jid(account, jid) contact_text = contact and contact.name or jid sectext = i18n.direction_mark + sectext.replace('$Contact', contact_text) if comment: # only if not None and not '' comment = GLib.markup_escape_text(comment) comment = _('Comment: %s') % comment sectext += '\n\n%s' % comment sectext += '\n\n' + _('Do you want to accept the invitation?') def on_yes(checked, text): if self.is_continued: app.interface.join_gc_room(self.account, self.room_jid, app.nicks[self.account], self.password, is_continued=True) else: app.interface.join_gc_minimal( self.account, self.room_jid, password=self.password) def on_no(text): app.connections[account].decline_invitation(self.room_jid, self.contact_fjid, text) dlg = YesNoDialog(pritext, sectext, text_label=_('Reason (if you decline):'), on_response_yes=on_yes, on_response_no=on_no) dlg.set_title(_('Groupchat Invitation')) class ProgressDialog: def __init__(self, title_text, during_text, messages_queue): """ During text is what to show during the procedure, messages_queue has the message to show in the textview """ self.xml = gtkgui_helpers.get_gtk_builder('progress_dialog.ui') self.dialog = self.xml.get_object('progress_dialog') self.label = self.xml.get_object('label') self.label.set_markup('' + during_text + '') self.progressbar = self.xml.get_object('progressbar') self.dialog.set_title(title_text) self.dialog.set_default_size(450, 250) self.window.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) self.dialog.show_all() self.xml.connect_signals(self) self.update_progressbar_timeout_id = GLib.timeout_add(100, self.update_progressbar) def update_progressbar(self): if self.dialog: self.progressbar.pulse() return True # loop forever return False def on_progress_dialog_delete_event(self, widget, event): return True # WM's X button or Escape key should not destroy the window class ClientCertChooserDialog(FileChooserDialog): def __init__(self, path_to_clientcert_file='', on_response_ok=None, on_response_cancel=None): ''' optionally accepts path_to_clientcert_file so it has that as selected ''' def on_ok(widget, callback): ''' check if file exists and call callback ''' path_to_clientcert_file = self.get_filename() if os.path.exists(path_to_clientcert_file): callback(widget, path_to_clientcert_file) FileChooserDialog.__init__(self, title_text=_('Choose Client Cert #PCKS12'), transient_for=app.interface.instances['accounts'], action=Gtk.FileChooserAction.OPEN, buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.OK), current_folder='', default_response=Gtk.ResponseType.OK, on_response_ok=(on_ok, on_response_ok), on_response_cancel=on_response_cancel) filter_ = Gtk.FileFilter() filter_.set_name(_('All files')) filter_.add_pattern('*') self.add_filter(filter_) filter_ = Gtk.FileFilter() filter_.set_name(_('PKCS12 Files')) filter_.add_pattern('*.p12') self.add_filter(filter_) self.set_filter(filter_) if path_to_clientcert_file: # set_filename accept only absolute path path_to_clientcert_file = os.path.abspath(path_to_clientcert_file) self.set_filename(path_to_clientcert_file) class SoundChooserDialog(FileChooserDialog): def __init__(self, path_to_snd_file='', on_response_ok=None, on_response_cancel=None, transient_for=None): """ Optionally accepts path_to_snd_file so it has that as selected """ def on_ok(widget, callback): """ Check if file exists and call callback """ path_to_snd_file = self.get_filename() if os.path.exists(path_to_snd_file): callback(widget, path_to_snd_file) FileChooserDialog.__init__( self, title_text=_('Choose Sound'), action=Gtk.FileChooserAction.OPEN, buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.OK), default_response=Gtk.ResponseType.OK, current_folder=app.config.get('last_sounds_dir'), on_response_ok=(on_ok, on_response_ok), on_response_cancel=on_response_cancel, transient_for=transient_for) filter_ = Gtk.FileFilter() filter_.set_name(_('All files')) filter_.add_pattern('*') self.add_filter(filter_) filter_ = Gtk.FileFilter() filter_.set_name(_('Wav Sounds')) filter_.add_pattern('*.wav') self.add_filter(filter_) self.set_filter(filter_) path_to_snd_file = helpers.check_soundfile_path(path_to_snd_file) if path_to_snd_file: # set_filename accept only absolute path path_to_snd_file = os.path.abspath(path_to_snd_file) self.set_filename(path_to_snd_file) class ImageChooserDialog(FileChooserDialog): def __init__(self, path_to_file='', on_response_ok=None, on_response_cancel=None): """ Optionally accepts path_to_snd_file so it has that as selected """ def on_ok(widget, callback): '''check if file exists and call callback''' path_to_file = self.get_filename() if not path_to_file: return if os.path.exists(path_to_file): if isinstance(callback, tuple): callback[0](widget, path_to_file, *callback[1:]) else: callback(widget, path_to_file) path = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_PICTURES) FileChooserDialog.__init__(self, title_text = _('Choose Image'), action = Gtk.FileChooserAction.OPEN, buttons = (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.OK), default_response = Gtk.ResponseType.OK, current_folder = path, on_response_ok = (on_ok, on_response_ok), on_response_cancel = on_response_cancel) if on_response_cancel: self.connect('destroy', on_response_cancel) filter_ = Gtk.FileFilter() filter_.set_name(_('All files')) filter_.add_pattern('*') self.add_filter(filter_) filter_ = Gtk.FileFilter() filter_.set_name(_('Images')) filter_.add_mime_type('image/png') filter_.add_mime_type('image/jpeg') filter_.add_mime_type('image/gif') filter_.add_mime_type('image/tiff') filter_.add_mime_type('image/svg+xml') filter_.add_mime_type('image/x-xpixmap') # xpm self.add_filter(filter_) self.set_filter(filter_) if path_to_file: self.set_filename(path_to_file) self.set_use_preview_label(False) self.set_preview_widget(Gtk.Image()) self.connect('selection-changed', self.update_preview) def update_preview(self, widget): path_to_file = widget.get_preview_filename() if path_to_file is None or os.path.isdir(path_to_file): # nothing to preview or directory # make sure you clean image do show nothing preview = widget.get_preview_widget() preview.clear() return try: pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(path_to_file, 100, 100) except GObject.GError: return widget.get_preview_widget().set_from_pixbuf(pixbuf) class AvatarChooserDialog(ImageChooserDialog): def __init__(self, path_to_file='', on_response_ok=None, on_response_cancel=None, on_response_clear=None): ImageChooserDialog.__init__(self, path_to_file, on_response_ok, on_response_cancel) button = Gtk.Button(None, Gtk.STOCK_CLEAR) self.response_clear = on_response_clear if on_response_clear: button.connect('clicked', self.on_clear) button.show_all() action_area = self.get_action_area() action_area.pack_start(button, True, True, 0) action_area.reorder_child(button, 0) def on_clear(self, widget): if isinstance(self.response_clear, tuple): self.response_clear[0](widget, *self.response_clear[1:]) else: self.response_clear(widget) class ArchiveChooserDialog(FileChooserDialog): def __init__(self, on_response_ok=None, on_response_cancel=None, transient_for=None): def on_ok(widget, callback): '''check if file exists and call callback''' path_to_file = self.get_filename() if not path_to_file: return if os.path.exists(path_to_file): if isinstance(callback, tuple): callback[0](path_to_file, *callback[1:]) else: callback(path_to_file) self.destroy() path = os.path.expanduser('~') FileChooserDialog.__init__(self, title_text=_('Choose Archive'), action=Gtk.FileChooserAction.OPEN, buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.OK), default_response=Gtk.ResponseType.OK, current_folder=path, on_response_ok=(on_ok, on_response_ok), on_response_cancel=on_response_cancel, transient_for=transient_for) if on_response_cancel: self.connect('destroy', on_response_cancel) filter_ = Gtk.FileFilter() filter_.set_name(_('All files')) filter_.add_pattern('*') self.add_filter(filter_) filter_ = Gtk.FileFilter() filter_.set_name(_('Zip files')) filter_.add_pattern('*.zip') self.add_filter(filter_) self.set_filter(filter_) class AddSpecialNotificationDialog: def __init__(self, jid): """ jid is the jid for which we want to add special notification (sound and notification popups) """ self.xml = gtkgui_helpers.get_gtk_builder( 'add_special_notification_window.ui') self.window = self.xml.get_object('add_special_notification_window') self.condition_combobox = self.xml.get_object('condition_combobox') self.condition_combobox.set_active(0) self.notification_popup_yes_no_combobox = self.xml.get_object( 'notification_popup_yes_no_combobox') self.notification_popup_yes_no_combobox.set_active(0) self.listen_sound_combobox = self.xml.get_object('listen_sound_combobox') self.listen_sound_combobox.set_active(0) self.jid = jid self.xml.get_object('when_foo_becomes_label').set_text( _('When %s becomes:') % self.jid) self.window.set_title(_('Adding Special Notification for %s') % jid) self.window.show_all() self.xml.connect_signals(self) def on_cancel_button_clicked(self, widget): self.window.destroy() def on_add_special_notification_window_delete_event(self, widget, event): self.window.destroy() def on_listen_sound_combobox_changed(self, widget): active = widget.get_active() if active == 1: # user selected 'choose sound' def on_ok(widget, path_to_snd_file): pass def on_cancel(widget): widget.set_active(0) # go back to No Sound self.dialog = SoundChooserDialog(on_response_ok=on_ok, on_response_cancel=on_cancel) def on_ok_button_clicked(self, widget): conditions = ('online', 'chat', 'online_and_chat', 'away', 'xa', 'away_and_xa', 'dnd', 'xa_and_dnd', 'offline') active = self.condition_combobox.get_active() active_iter = self.listen_sound_combobox.get_active_iter() listen_sound_model = self.listen_sound_combobox.get_model() class TransformChatToMUC: # Keep a reference on windows so garbage collector don't restroy them instances = [] def __init__(self, account, jids, preselected=None): """ This window is used to trasform a one-to-one chat to a MUC. We do 2 things: first select the server and then make a guests list """ self.instances.append(self) self.account = account self.auto_jids = jids self.preselected_jids = preselected self.xml = gtkgui_helpers.get_gtk_builder('chat_to_muc_window.ui') self.window = self.xml.get_object('chat_to_muc_window') for widget_to_add in ('invite_button', 'cancel_button', 'server_list_comboboxentry', 'guests_treeview', 'guests_store', 'server_and_guests_hseparator', 'server_select_label'): self.__dict__[widget_to_add] = self.xml.get_object(widget_to_add) server_list = [] self.servers = Gtk.ListStore(str) self.server_list_comboboxentry.set_model(self.servers) cell = Gtk.CellRendererText() self.server_list_comboboxentry.pack_start(cell, True) self.server_list_comboboxentry.add_attribute(cell, 'text', 0) # get the muc server of our server if 'jabber' in app.connections[account].muc_jid: server_list.append(app.connections[account].muc_jid['jabber']) # add servers or recently joined groupchats recently_groupchat = app.config.get_per('accounts', account, 'recent_groupchats').split() for g in recently_groupchat: server = app.get_server_from_jid(g) if server not in server_list and not server.startswith('irc'): server_list.append(server) # add a default server if not server_list: server_list.append('conference.jabber.org') for s in server_list: self.servers.append([s]) self.server_list_comboboxentry.set_active(0) # set treeview # name, jid self.guests_store.set_sort_column_id(1, Gtk.SortType.ASCENDING) self.guests_treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) # All contacts beside the following can be invited: # transports, zeroconf contacts, minimized groupchats def invitable(contact, contact_transport=None): return (contact.jid not in self.auto_jids and contact.jid != app.get_jid_from_account(self.account) and contact.jid not in app.interface.minimized_controls[account] and not contact.is_transport() and contact_transport in ('jabber', None)) # set jabber id and pseudos for account in app.contacts.get_accounts(): if app.connections[account].is_zeroconf: continue for jid in app.contacts.get_jid_list(account): contact = app.contacts.get_contact_with_highest_priority( account, jid) contact_transport = app.get_transport_name_from_jid(jid) # Add contact if it can be invited if invitable(contact, contact_transport) and \ contact.show not in ('offline', 'error'): icon_name = gtkgui_helpers.get_iconset_name_for(contact.show) name = contact.name if name == '': name = jid.split('@')[0] iter_ = self.guests_store.append([icon_name, name, jid]) # preselect treeview rows if self.preselected_jids and jid in self.preselected_jids: path = self.guests_store.get_path(iter_) self.guests_treeview.get_selection().select_path(path) app.ged.register_event_handler('unique-room-id-supported', ged.GUI1, self._nec_unique_room_id_supported) app.ged.register_event_handler('unique-room-id-not-supported', ged.GUI1, self._nec_unique_room_id_not_supported) # show all self.window.show_all() self.xml.connect_signals(self) def on_chat_to_muc_window_destroy(self, widget): app.ged.remove_event_handler('unique-room-id-supported', ged.GUI1, self._nec_unique_room_id_supported) app.ged.remove_event_handler('unique-room-id-not-supported', ged.GUI1, self._nec_unique_room_id_not_supported) self.instances.remove(self) def on_chat_to_muc_window_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: # ESCAPE self.window.destroy() def on_invite_button_clicked(self, widget): row = self.server_list_comboboxentry.get_child().get_displayed_row() model = self.server_list_comboboxentry.get_model() server = model[row][0].strip() if server == '': return app.connections[self.account].check_unique_room_id_support(server, self) def _nec_unique_room_id_supported(self, obj): if obj.instance != self: return guest_list = [] guests = self.guests_treeview.get_selection().get_selected_rows() for guest in guests[1]: iter_ = self.guests_store.get_iter(guest) guest_list.append(self.guests_store[iter_][2]) for guest in self.auto_jids: guest_list.append(guest) room_jid = obj.room_id + '@' + obj.server app.automatic_rooms[self.account][room_jid] = {} app.automatic_rooms[self.account][room_jid]['invities'] = guest_list app.automatic_rooms[self.account][room_jid]['continue_tag'] = True app.interface.join_gc_room(self.account, room_jid, app.nicks[self.account], None, is_continued=True) self.window.destroy() def on_cancel_button_clicked(self, widget): self.window.destroy() def _nec_unique_room_id_not_supported(self, obj): if obj.instance != self: return obj.room_id = app.nicks[self.account].lower().replace(' ', '') + \ str(randrange(9999999)) self._nec_unique_room_id_supported(obj) class DataFormWindow(Dialog): def __init__(self, form, on_response_ok): self.df_response_ok = on_response_ok Dialog.__init__(self, None, 'test', [(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL), (Gtk.STOCK_OK, Gtk.ResponseType.OK)], on_response_ok=self.on_ok) self.set_resizable(True) gtkgui_helpers.resize_window(self, 600, 400) self.dataform_widget = dataforms_widget.DataFormWidget() self.dataform = dataforms.ExtendForm(node=form) self.dataform_widget.set_sensitive(True) self.dataform_widget.data_form = self.dataform self.dataform_widget.show_all() self.get_content_area().pack_start(self.dataform_widget, True, True, 0) def on_ok(self): form = self.dataform_widget.data_form if isinstance(self.df_response_ok, tuple): self.df_response_ok[0](form, *self.df_response_ok[1:]) else: self.df_response_ok(form) self.destroy() class ResourceConflictDialog(TimeoutDialog, InputDialog): def __init__(self, title, text, resource, ok_handler): TimeoutDialog.__init__(self, 15) InputDialog.__init__(self, title, text, input_str=resource, is_modal=False, ok_handler=ok_handler) self.title_text = title self.run_timeout() def on_timeout(self): self.on_okbutton_clicked(None) class VoIPCallReceivedDialog(object): instances = {} def __init__(self, account, contact_jid, sid, content_types): self.instances[(contact_jid, sid)] = self self.account = account self.fjid = contact_jid self.sid = sid self.content_types = content_types xml = gtkgui_helpers.get_gtk_builder('voip_call_received_dialog.ui') xml.connect_signals(self) jid = app.get_jid_without_resource(self.fjid) contact = app.contacts.get_first_contact_from_jid(account, jid) if contact and contact.name: self.contact_text = '%s (%s)' % (contact.name, jid) else: self.contact_text = contact_jid self.dialog = xml.get_object('voip_call_received_messagedialog') self.set_secondary_text() self.dialog.show_all() @classmethod def get_dialog(cls, jid, sid): if (jid, sid) in cls.instances: return cls.instances[(jid, sid)] else: return None def set_secondary_text(self): if 'audio' in self.content_types and 'video' in self.content_types: types_text = _('an audio and video') elif 'audio' in self.content_types: types_text = _('an audio') elif 'video' in self.content_types: types_text = _('a video') # do the substitution self.dialog.set_property('secondary-text', _('%(contact)s wants to start %(type)s session with you. Do you want ' 'to answer the call?') % {'contact': self.contact_text, 'type': types_text}) def add_contents(self, content_types): for type_ in content_types: if type_ not in self.content_types: self.content_types.add(type_) self.set_secondary_text() def remove_contents(self, content_types): for type_ in content_types: if type_ in self.content_types: self.content_types.remove(type_) if not self.content_types: self.dialog.destroy() else: self.set_secondary_text() def on_voip_call_received_messagedialog_destroy(self, dialog): if (self.fjid, self.sid) in self.instances: del self.instances[(self.fjid, self.sid)] def on_voip_call_received_messagedialog_close(self, dialog): return self.on_voip_call_received_messagedialog_response(dialog, Gtk.ResponseType.NO) def on_voip_call_received_messagedialog_response(self, dialog, response): # we've got response from user, either stop connecting or accept the call session = app.connections[self.account].get_jingle_session(self.fjid, self.sid) if not session: dialog.destroy() return if response == Gtk.ResponseType.YES: #TODO: Ensure that ctrl.contact.resource == resource jid = app.get_jid_without_resource(self.fjid) resource = app.get_resource_from_jid(self.fjid) ctrl = (app.interface.msg_win_mgr.get_control(self.fjid, self.account) or app.interface.msg_win_mgr.get_control(jid, self.account) or app.interface.new_chat_from_jid(self.account, jid)) # Chat control opened, update content's status audio = session.get_content('audio') video = session.get_content('video') if audio and not audio.negotiated: ctrl.set_audio_state('connecting', self.sid) if video and not video.negotiated: video_hbox = ctrl.xml.get_object('video_hbox') video_hbox.set_no_show_all(False) if app.config.get('video_see_self'): fixed = ctrl.xml.get_object('outgoing_fixed') fixed.set_no_show_all(False) video_hbox.show_all() ctrl.xml.get_object('incoming_drawingarea').realize() if os.name == 'nt': in_xid = ctrl.xml.get_object('incoming_drawingarea').\ get_window().handle else: in_xid = ctrl.xml.get_object('incoming_drawingarea').\ get_property('window').get_xid() content = session.get_content('video') # move outgoing stream to chat window if app.config.get('video_see_self'): ctrl.xml.get_object('outgoing_drawingarea').realize() if os.name == 'nt': out_xid = ctrl.xml.get_object('outgoing_drawingarea').\ get_window().handle else: out_xid = ctrl.xml.get_object('outgoing_drawingarea').\ get_property('window').get_xid() b = content.src_bin found = False for e in b.children: if e.get_name().startswith('autovideosink'): found = True break if found: for f in e.children: if f.get_name().startswith('autovideosink'): f.set_window_handle(out_xid) content.out_xid = out_xid break content.in_xid = in_xid ctrl.set_video_state('connecting', self.sid) # Now, accept the content/sessions. # This should be done after the chat control is running if not session.accepted: session.approve_session() for content in self.content_types: session.approve_content(content) else: # response==Gtk.ResponseType.NO if not session.accepted: session.decline_session() else: for content in self.content_types: session.reject_content(content) dialog.destroy() class CertificatDialog(InformationDialog): def __init__(self, parent, account, cert): issuer = cert.get_issuer() subject = cert.get_subject() InformationDialog.__init__(self, _('Certificate for account %s') % account, _('''Issued to: Common Name (CN): %(scn)s Organization (O): %(sorg)s Organizationl Unit (OU): %(sou)s Serial Number: %(sn)s Issued by: Common Name (CN): %(icn)s Organization (O): %(iorg)s Organizationl Unit (OU): %(iou)s Validity: Issued on: %(io)s Expires on: %(eo)s Fingerprint SHA-1 Fingerprint: %(sha1)s SHA256 Fingerprint: %(sha256)s ''') % { 'scn': subject.commonName, 'sorg': subject.organizationName, 'sou': subject.organizationalUnitName, 'sn': cert.get_serial_number(), 'icn': issuer.commonName, 'iorg': issuer.organizationName, 'iou': issuer.organizationalUnitName, 'io': cert.get_notBefore().decode('utf-8'), 'eo': cert.get_notAfter().decode('utf-8'), 'sha1': cert.digest('sha1').decode('utf-8'), 'sha256': cert.digest('sha256').decode('utf-8')}) pix = gtkgui_helpers.get_icon_pixmap('application-certificate', size=32, quiet=True) if pix: img = Gtk.Image.new_from_pixbuf(pix) img.show_all() self.set_image(img) self.set_transient_for(parent) self.set_title(_('Certificate for account %s') % account) class CheckFingerprintDialog(YesNoDialog): def __init__(self, pritext='', sectext='', checktext='', on_response_yes=None, on_response_no=None, account=None, certificate=None): self.account = account self.cert = certificate YesNoDialog.__init__(self, pritext, sectext=sectext, checktext=checktext, on_response_yes=on_response_yes, on_response_no=on_response_no) self.set_title(_('SSL Certificate Verification for %s') % account) b = Gtk.Button(label=_('View cert…')) b.connect('clicked', self.on_cert_clicked) b.show_all() area = self.get_action_area() area.pack_start(b, True, True, 0) def on_cert_clicked(self, button): CertificatDialog(self, self.account, self.cert) class SSLErrorDialog(ConfirmationDialogDoubleCheck): def __init__(self, account, certificate, pritext, sectext, checktext1, checktext2, on_response_ok=None, on_response_cancel=None): self.account = account self.cert = certificate ConfirmationDialogDoubleCheck.__init__(self, pritext, sectext, checktext1, checktext2, on_response_ok=on_response_ok, on_response_cancel=on_response_cancel, is_modal=False) b = Gtk.Button(_('View cert…')) b.connect('clicked', self.on_cert_clicked) b.show_all() area = self.get_action_area() area.pack_start(b, True, True, 0) def on_cert_clicked(self, button): d = CertificatDialog(self, self.account, self.cert) class ProgressWindow(Gtk.ApplicationWindow): def __init__(self, file): Gtk.ApplicationWindow.__init__(self) self.set_name('HTTPUploadProgressWindow') self.set_application(app.app) self.set_position(Gtk.WindowPosition.CENTER) self.set_show_menubar(False) self.set_title(_('File Transfer')) self.set_default_size(250, -1) self.event = file.event self.file = file self.xml = gtkgui_helpers.get_gtk_builder( 'httpupload_progress_dialog.ui') self.label = self.xml.get_object('label') self.progressbar = self.xml.get_object('progressbar') self.add(self.xml.get_object('box')) self.pulse = GLib.timeout_add(100, self._pulse_progressbar) self.show_all() self.connect('destroy', self._on_destroy) app.ged.register_event_handler('httpupload-progress', ged.CORE, self._on_httpupload_progress) def _on_httpupload_progress(self, obj): if self.file != obj.file: return if obj.status == 'request': self.label.set_text(_('Requesting HTTP Upload Slot...')) elif obj.status == 'close': self.destroy() elif obj.status == 'upload': self.label.set_text(_('Uploading file via HTTP File Upload...')) elif obj.status == 'update': self.update_progress(obj.seen, obj.total) elif obj.status == 'encrypt': self.label.set_text(_('Encrypting file...')) def _pulse_progressbar(self): self.progressbar.pulse() return True def _on_destroy(self, *args): self.event.set() if self.pulse: GLib.source_remove(self.pulse) app.ged.remove_event_handler('httpupload-progress', ged.CORE, self._on_httpupload_progress) def update_progress(self, seen, total): if self.event.isSet(): return if self.pulse: GLib.source_remove(self.pulse) self.pulse = None pct = (float(seen) / total) * 100.0 self.progressbar.set_fraction(float(seen) / total) self.progressbar.set_text(str(int(pct)) + "%") gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/disco.py000066400000000000000000002411251326020644600234520ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## src/disco.py ## ## Copyright (C) 2005-2006 Stéphan Kochen ## Copyright (C) 2005-2007 Nikos Kouremenos ## Copyright (C) 2005-2014 Yann Leboulanger ## Copyright (C) 2006 Dimitur Kirov ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2007 Stephan Erb ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## # The appearance of the treeview, and parts of the dialog, are controlled by # AgentBrowser (sub-)classes. Methods that probably should be overridden when # subclassing are: (look at the docstrings and source for additional info) # - def cleanup(self) * # - def _create_treemodel(self) * # - def _add_actions(self) # - def _clean_actions(self) # - def update_theme(self) * # - def update_actions(self) # - def default_action(self) # - def _find_item(self, jid, node) # - def _add_item(self, jid, node, parent_node, item, force) # - def _update_item(self, iter_, jid, node, item) # - def _update_info(self, iter_, jid, node, identities, features, data) # - def _update_error(self, iter_, jid, node) # # * Should call the super class for this method. # All others do not have to call back to the super class. (but can if they want # the functionality) # There are more methods, of course, but this is a basic set. import types import weakref from gi.repository import GLib from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GdkPixbuf from gi.repository import Pango from gajim import dialogs from gajim import gtkgui_helpers from gajim import groups from gajim import adhoc_commands from gajim import search_window from gajim import gui_menu_builder from gajim.common import app import nbxmpp from gajim.common.exceptions import GajimGeneralException from gajim.common import helpers from gajim.common import ged LABELS = { 1: _('This service has not yet responded with detailed information'), 2: _('This service could not respond with detailed information.\n' 'It is most likely legacy or broken'), } # Dictionary mapping category, type pairs to browser class, image pairs. # This is a function, so we can call it after the classes are declared. # For the browser class, None means that the service will only be browsable # when it advertises disco as it's feature, False means it's never browsable. def _gen_agent_type_info(): return { # Defaults (0, 0): (None, None), # Jabber server ('server', 'im'): (ToplevelAgentBrowser, 'jabber'), ('services', 'jabber'): (ToplevelAgentBrowser, 'jabber'), ('hierarchy', 'branch'): (AgentBrowser, 'jabber'), # Services ('conference', 'text'): (MucBrowser, 'conference'), ('headline', 'rss'): (AgentBrowser, 'rss'), ('headline', 'weather'): (False, 'weather'), ('gateway', 'weather'): (False, 'weather'), ('_jid', 'weather'): (False, 'weather'), ('gateway', 'sip'): (False, 'sip'), ('directory', 'user'): (None, 'jud'), ('pubsub', 'generic'): (PubSubBrowser, 'pubsub'), ('pubsub', 'service'): (PubSubBrowser, 'pubsub'), ('proxy', 'bytestreams'): (None, 'bytestreams'), # Socks5 FT proxy ('headline', 'newmail'): (ToplevelAgentBrowser, 'mail'), # Transports ('conference', 'irc'): (ToplevelAgentBrowser, 'irc'), ('_jid', 'irc'): (False, 'irc'), ('gateway', 'irc'): (False, 'irc'), ('gateway', 'aim'): (False, 'aim'), ('_jid', 'aim'): (False, 'aim'), ('gateway', 'gadu-gadu'): (False, 'gadu-gadu'), ('_jid', 'gadugadu'): (False, 'gadu-gadu'), ('gateway', 'http-ws'): (False, 'http-ws'), ('gateway', 'icq'): (False, 'icq'), ('_jid', 'icq'): (False, 'icq'), ('gateway', 'msn'): (False, 'msn'), ('_jid', 'msn'): (False, 'msn'), ('gateway', 'sms'): (False, 'sms'), ('_jid', 'sms'): (False, 'sms'), ('gateway', 'smtp'): (False, 'mail'), ('gateway', 'yahoo'): (False, 'yahoo'), ('_jid', 'yahoo'): (False, 'yahoo'), ('gateway', 'mrim'): (False, 'mrim'), ('_jid', 'mrim'): (False, 'mrim'), ('gateway', 'facebook'): (False, 'facebook'), ('_jid', 'facebook'): (False, 'facebook'), ('gateway', 'tv'): (False, 'tv'), ('gateway', 'twitter'): (False, 'twitter'), } # Category type to "human-readable" description string _cat_to_descr = { 'other': _('Others'), 'gateway': _('Transports'), '_jid': _('Transports'), #conference is a category for listing mostly groupchats in service discovery 'conference': _('Conference'), } class CacheDictionary: """ A dictionary that keeps items around for only a specific time. Lifetime is in minutes. Getrefresh specifies whether to refresh when an item is merely accessed instead of set aswell """ def __init__(self, lifetime, getrefresh = True): self.lifetime = lifetime * 1000 * 60 self.getrefresh = getrefresh self.cache = {} class CacheItem: """ An object to store cache items and their timeouts """ def __init__(self, value): self.value = value self.source = None def __call__(self): return self.value def cleanup(self): for key in list(self.cache.keys()): item = self.cache[key] if item.source: GLib.source_remove(item.source) del self.cache[key] def _expire_timeout(self, key): """ The timeout has expired, remove the object """ if key in self.cache: del self.cache[key] return False def _refresh_timeout(self, key): """ The object was accessed, refresh the timeout """ item = self.cache[key] if item.source: GLib.source_remove(item.source) if self.lifetime: source = GLib.timeout_add_seconds(int(self.lifetime/1000), self._expire_timeout, key) item.source = source def __getitem__(self, key): item = self.cache[key] if self.getrefresh: self._refresh_timeout(key) return item() def __setitem__(self, key, value): item = self.CacheItem(value) self.cache[key] = item self._refresh_timeout(key) def __delitem__(self, key): item = self.cache[key] if item.source: GLib.source_remove(item.source) del self.cache[key] def __contains__(self, key): return key in self.cache _icon_cache = CacheDictionary(15) def get_agent_address(jid, node = None): """ Get an agent's address for displaying in the GUI """ if node: return '%s@%s' % (node, str(jid)) else: return str(jid) class Closure(object): """ A weak reference to a callback with arguments as an object Weak references to methods immediatly die, even if the object is still alive. Besides a handy way to store a callback, this provides a workaround that keeps a reference to the object instead. Userargs and removeargs must be tuples. """ def __init__(self, cb, userargs = (), remove = None, removeargs = ()): self.userargs = userargs self.remove = remove self.removeargs = removeargs if isinstance(cb, types.MethodType): self.meth_self = weakref.ref(cb.__self__, self._remove) self.meth_name = cb.__name__ elif callable(cb): self.meth_self = None self.cb = weakref.ref(cb, self._remove) else: raise TypeError('Object is not callable') def _remove(self, ref): if self.remove: self.remove(self, *self.removeargs) def __call__(self, *args, **kwargs): if self.meth_self: obj = self.meth_self() cb = getattr(obj, self.meth_name) else: cb = self.cb() args = args + self.userargs return cb(*args, **kwargs) class ServicesCache: """ Class that caches our query results. Each connection will have it's own ServiceCache instance """ def __init__(self, account): self.account = account self._items = CacheDictionary(0, getrefresh = False) self._info = CacheDictionary(0, getrefresh = False) self._subscriptions = CacheDictionary(5, getrefresh=False) self._cbs = {} app.ged.register_event_handler('agent-items-received', ged.GUI1, self._nec_agent_items_received) app.ged.register_event_handler('agent-items-error-received', ged.GUI1, self._nec_agent_items_error_received) app.ged.register_event_handler('agent-info-received', ged.GUI1, self._nec_agent_info_received) app.ged.register_event_handler('agent-info-error-received', ged.GUI1, self._nec_agent_info_error_received) def __del__(self): app.ged.remove_event_handler('agent-items-received', ged.GUI1, self._nec_agent_items_received) app.ged.remove_event_handler('agent-items-error-received', ged.GUI1, self._nec_agent_items_error_received) app.ged.remove_event_handler('agent-info-received', ged.GUI1, self._nec_agent_info_received) app.ged.remove_event_handler('agent-info-error-received', ged.GUI1, self._nec_agent_info_error_received) def cleanup(self): self._items.cleanup() self._info.cleanup() def _clean_closure(self, cb, type_, addr): # A closure died, clean up cbkey = (type_, addr) try: self._cbs[cbkey].remove(cb) except KeyError: return except ValueError: return # Clean an empty list if not self._cbs[cbkey]: del self._cbs[cbkey] def get_icon(self, identities=None, addr=''): """ Return the icon for an agent """ if identities is None: identities = [] # Grab the first identity with an icon quiet = False for identity in identities: try: cat, type_ = identity['category'], identity['type'] info = _agent_type_info[(cat, type_)] except KeyError: continue filename = info[1] if filename: break else: # Loop fell through, default to unknown filename = addr.split('.')[0] quiet = True # Use the cache if possible if filename in _icon_cache: return _icon_cache[filename] # Or load it pix = gtkgui_helpers.get_icon_pixmap('gajim-agent-' + filename, size=32, quiet=quiet) if pix: # Store in cache _icon_cache[filename] = pix return pix if 'jabber' in _icon_cache: return _icon_cache['jabber'] pix = gtkgui_helpers.get_icon_pixmap('gajim-agent-jabber', size=32) _icon_cache['jabber'] = pix return pix def get_browser(self, identities=None, features=None): """ Return the browser class for an agent """ if identities is None: identities = [] if features is None: features = [] # First pass, we try to find a ToplevelAgentBrowser for identity in identities: try: cat, type_ = identity['category'], identity['type'] info = _agent_type_info[(cat, type_)] except KeyError: continue browser = info[0] if browser and browser == ToplevelAgentBrowser: return browser # second pass, we haven't found a ToplevelAgentBrowser for identity in identities: try: cat, type_ = identity['category'], identity['type'] info = _agent_type_info[(cat, type_)] except KeyError: continue browser = info[0] if browser: return browser # NS_BROWSE is deprecated, but we check for it anyways. # Some services list it in features and respond to # NS_DISCO_ITEMS anyways. # Allow browsing for unknown types aswell. if (not features and not identities) or \ nbxmpp.NS_DISCO_ITEMS in features or nbxmpp.NS_BROWSE in features: return ToplevelAgentBrowser return None def get_info(self, jid, node, cb, force=False, nofetch=False, args=()): """ Get info for an agent """ addr = get_agent_address(jid, node) # Check the cache if addr in self._info and not force: args = self._info[addr] + args cb(jid, node, *args) return if nofetch: return # Create a closure object cbkey = ('info', addr) cb = Closure(cb, userargs=args, remove=self._clean_closure, removeargs=cbkey) # Are we already fetching this? if cbkey in self._cbs: self._cbs[cbkey].append(cb) else: self._cbs[cbkey] = [cb] app.connections[self.account].discoverInfo(jid, node) def get_items(self, jid, node, cb, force=False, nofetch=False, args=()): """ Get a list of items in an agent """ addr = get_agent_address(jid, node) # Check the cache if addr in self._items and not force: args = (self._items[addr],) + args cb(jid, node, *args) return if nofetch: return # Create a closure object cbkey = ('items', addr) cb = Closure(cb, userargs=args, remove=self._clean_closure, removeargs=cbkey) # Are we already fetching this? if cbkey in self._cbs: self._cbs[cbkey].append(cb) else: self._cbs[cbkey] = [cb] app.connections[self.account].discoverItems(jid, node) def _nec_agent_info_received(self, obj): """ Callback for when we receive an agent's info array is (agent, node, identities, features, data) """ # We receive events from all accounts from GED if obj.conn.name != self.account: return self._on_agent_info(obj.fjid, obj.node, obj.identities, obj.features, obj.data) def _on_agent_info(self, fjid, node, identities, features, data): addr = get_agent_address(fjid, node) # Store in cache self._info[addr] = (identities, features, data) # Call callbacks cbkey = ('info', addr) if cbkey in self._cbs: for cb in self._cbs[cbkey]: cb(fjid, node, identities, features, data) # clean_closure may have beaten us to it if cbkey in self._cbs: del self._cbs[cbkey] def _nec_agent_items_received(self, obj): """ Callback for when we receive an agent's items array is (agent, node, items) """ # We receive events from all accounts from GED if obj.conn.name != self.account: return addr = get_agent_address(obj.fjid, obj.node) # Store in cache self._items[addr] = obj.items # Call callbacks cbkey = ('items', addr) if cbkey in self._cbs: for cb in self._cbs[cbkey]: cb(obj.fjid, obj.node, obj.items) # clean_closure may have beaten us to it if cbkey in self._cbs: del self._cbs[cbkey] def _nec_agent_info_error_received(self, obj): """ Callback for when a query fails. Even after the browse and agents namespaces """ # We receive events from all accounts from GED if obj.conn.name != self.account: return addr = get_agent_address(obj.fjid) # Call callbacks cbkey = ('info', addr) if cbkey in self._cbs: for cb in self._cbs[cbkey]: cb(obj.fjid, '', 0, 0, 0) # clean_closure may have beaten us to it if cbkey in self._cbs: del self._cbs[cbkey] def _nec_agent_items_error_received(self, obj): """ Callback for when a query fails. Even after the browse and agents namespaces """ # We receive events from all accounts from GED if obj.conn.name != self.account: return addr = get_agent_address(obj.fjid) # Call callbacks cbkey = ('items', addr) if cbkey in self._cbs: for cb in self._cbs[cbkey]: cb(obj.fjid, '', 0) # clean_closure may have beaten us to it if cbkey in self._cbs: del self._cbs[cbkey] # object is needed so that @property works class ServiceDiscoveryWindow(object): """ Class that represents the Services Discovery window """ def __init__(self, account, jid='', node='', address_entry=False, parent=None, initial_identities=None): self._account = account self.parent = parent if not jid: jid = app.config.get_per('accounts', account, 'hostname') node = '' self.jid = None self.browser = None self.children = [] self.dying = False self.node = None self.reloading = False # Check connection if app.connections[account].connected < 2: dialogs.ErrorDialog(_('You are not connected to the server'), _('Without a connection, you can not browse available services')) raise RuntimeError('You must be connected to browse services') # Get a ServicesCache object. try: self.cache = app.connections[account].services_cache except AttributeError: self.cache = ServicesCache(account) app.connections[account].services_cache = self.cache if initial_identities: self.cache._on_agent_info(jid, node, initial_identities, [], None) self.xml = gtkgui_helpers.get_gtk_builder('service_discovery_window.ui') self.window = self.xml.get_object('service_discovery_window') self.services_treeview = self.xml.get_object('services_treeview') self.model = None # This is more reliable than the cursor-changed signal. selection = self.services_treeview.get_selection() selection.connect_after('changed', self.on_services_treeview_selection_changed) self.services_scrollwin = self.xml.get_object('services_scrollwin') self.progressbar = self.xml.get_object('services_progressbar') self.banner = self.xml.get_object('banner_agent_label') self.banner_icon = self.xml.get_object('banner_agent_icon') self.banner_eventbox = self.xml.get_object('banner_agent_eventbox') self.style_event_id = 0 self.banner.realize() self.action_buttonbox = self.xml.get_object('action_buttonbox') # Address combobox self.address_comboboxtext = None address_table = self.xml.get_object('address_table') if address_entry: self.address_comboboxtext = self.xml.get_object( 'address_comboboxtext') self.address_comboboxtext_entry = self.xml.get_object( 'address_entry') self.latest_addresses = app.config.get( 'latest_disco_addresses').split() if jid in self.latest_addresses: self.latest_addresses.remove(jid) self.latest_addresses.insert(0, jid) if len(self.latest_addresses) > 10: self.latest_addresses = self.latest_addresses[0:10] for j in self.latest_addresses: self.address_comboboxtext.append_text(j) self.address_comboboxtext.get_child().set_text(jid) else: # Don't show it at all if we didn't ask for it address_table.set_no_show_all(True) address_table.hide() accel_group = Gtk.AccelGroup() keyval, mod = Gtk.accelerator_parse('r') accel_group.connect(keyval, mod, Gtk.AccelFlags.VISIBLE, self.accel_group_func) self.window.add_accel_group(accel_group) self._initial_state() self.xml.connect_signals(self) self.travel(jid, node) self.window.show_all() @property def account(self): return self._account @account.setter def account(self, value): self._account = value self.cache.account = value if self.browser: self.browser.account = value def on_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.window.destroy() def accel_group_func(self, accel_group, acceleratable, keyval, modifier): if (modifier & Gdk.ModifierType.CONTROL_MASK) and (keyval == Gdk.KEY_r): self.reload() def _initial_state(self): """ Set some initial state on the window. Separated in a method because it's handy to use within browser's cleanup method """ self.progressbar.hide() title_text = _('Service Discovery using account %s') % self.account self.window.set_title(title_text) self._set_window_banner_text(_('Service Discovery')) self.banner_icon.clear() self.banner_icon.hide() # Just clearing it doesn't work def _set_window_banner_text(self, text, text_after = None): theme = app.config.get('roster_theme') bannerfont = app.config.get_per('themes', theme, 'bannerfont') bannerfontattrs = app.config.get_per('themes', theme, 'bannerfontattrs') if bannerfont: font = Pango.FontDescription(bannerfont) else: font = Pango.FontDescription('Normal') if bannerfontattrs: # B is attribute set by default if 'B' in bannerfontattrs: font.set_weight(Pango.Weight.HEAVY) if 'I' in bannerfontattrs: font.set_style(Pango.Style.ITALIC) font_attrs = 'font_desc="%s"' % font.to_string() font_size = font.get_size() # in case there is no font specified we use x-large font size if font_size == 0: font_attrs = '%s size="large"' % font_attrs markup = '%s' % (font_attrs, text) if text_after: font.set_weight(Pango.Weight.NORMAL) markup = '%s\n%s' % \ (markup, font.to_string(), text_after) self.banner.set_markup(markup) def destroy(self, chain = False): """ Close the browser. This can optionally close its children and propagate to the parent. This should happen on actions like register, or join to kill off the entire browser chain """ if self.dying: return self.dying = True # self.browser._get_agent_address() would break when no browser. addr = get_agent_address(self.jid, self.node) if addr in app.interface.instances[self.account]['disco']: del app.interface.instances[self.account]['disco'][addr] if self.browser: self.window.hide() self.browser.cleanup() self.browser = None self.window.destroy() for child in self.children[:]: child.parent = None if chain: child.destroy(chain = chain) self.children.remove(child) if self.parent: if self in self.parent.children: self.parent.children.remove(self) if chain and not self.parent.children: self.parent.destroy(chain = chain) self.parent = None else: self.cache.cleanup() def reload(self): if not self.jid: return self.reloading = True self.travel(self.jid, self.node) def travel(self, jid, node): """ Travel to an agent within the current services window """ if self.browser: self.browser.cleanup() self.browser = None # Update the window list if self.jid: old_addr = get_agent_address(self.jid, self.node) if old_addr in app.interface.instances[self.account]['disco']: del app.interface.instances[self.account]['disco'][old_addr] addr = get_agent_address(jid, node) app.interface.instances[self.account]['disco'][addr] = self # We need to store these, self.browser is not always available. self.jid = jid self.node = node self.cache.get_info(jid, node, self._travel, force=self.reloading) def _travel(self, jid, node, identities, features, data): """ Continuation of travel """ if self.dying or jid != self.jid or node != self.node: return if not identities: if not self.address_comboboxtext: # We can't travel anywhere else. self.destroy() dialogs.ErrorDialog(_('The service could not be found'), _('There is no service at the address you entered, or it is ' 'not responding. Check the address and try again.'), transient_for=self.window) return klass = self.cache.get_browser(identities, features) if not klass: dialogs.ErrorDialog(_('The service is not browsable'), _('This type of service does not contain any items to browse.'), transient_for=self.window) return elif klass is None: klass = AgentBrowser self.browser = klass(self.account, jid, node) self.browser.prepare_window(self) self.browser.browse(force=self.reloading) self.reloading = False def open(self, jid, node): """ Open an agent. By default, this happens in a new window """ try: win = app.interface.instances[self.account]['disco']\ [get_agent_address(jid, node)] win.window.present() return except KeyError: pass try: win = ServiceDiscoveryWindow(self.account, jid, node, parent=self) except RuntimeError: # Disconnected, perhaps return self.children.append(win) def on_service_discovery_window_destroy(self, widget): self.destroy() def on_close_button_clicked(self, widget): self.destroy() def on_address_comboboxtext_changed(self, widget): if self.address_comboboxtext.get_active() != -1: # user selected one of the entries so do auto-visit jid = self.address_comboboxtext_entry.get_text() try: jid = helpers.parse_jid(jid) except helpers.InvalidFormat as s: pritext = _('Invalid Server Name') dialogs.ErrorDialog(pritext, str(s)) return self.travel(jid, '') def on_go_button_clicked(self, widget): jid = self.address_comboboxtext_entry.get_text() try: jid = helpers.parse_jid(jid) except helpers.InvalidFormat as s: pritext = _('Invalid Server Name') dialogs.ErrorDialog(pritext, str(s), transient_for=self.window) return if jid == self.jid: # jid has not changed return if jid in self.latest_addresses: self.latest_addresses.remove(jid) self.latest_addresses.insert(0, jid) if len(self.latest_addresses) > 10: self.latest_addresses = self.latest_addresses[0:10] self.address_comboboxtext.get_model().clear() for j in self.latest_addresses: self.address_comboboxtext.append_text(j) app.config.set('latest_disco_addresses', ' '.join(self.latest_addresses)) self.travel(jid, '') def on_services_treeview_row_activated(self, widget, path, col = 0): if self.browser: self.browser.default_action() def on_services_treeview_selection_changed(self, widget): if self.browser: self.browser.update_actions() def _on_entry_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Return or event.keyval == Gdk.KEY_KP_Enter: self.on_go_button_clicked(widget) class AgentBrowser: """ Class that deals with browsing agents and appearance of the browser window. This class and subclasses should basically be treated as "part" of the ServiceDiscoveryWindow class, but had to be separated because this part is dynamic """ def __init__(self, account, jid, node): self.account = account self.jid = jid self.node = node self._total_items = 0 self.browse_button = None # This is for some timeout callbacks self.active = False def _get_agent_address(self): """ Get the agent's address for displaying in the GUI """ return get_agent_address(self.jid, self.node) def _set_initial_title(self): """ Set the initial window title based on agent address """ self.window.window.set_title(_('Browsing %(address)s using account ' '%(account)s') % {'address': self._get_agent_address(), 'account': self.account}) self.window._set_window_banner_text(self._get_agent_address()) def _create_treemodel(self): """ Create the treemodel for the services treeview. When subclassing, note that the first two columns should ALWAYS be of type string and contain the JID and node of the item respectively """ # JID, node, name, address self.model = Gtk.ListStore(str, str, str, str) self.model.set_sort_column_id(3, Gtk.SortType.ASCENDING) self.window.services_treeview.set_model(self.model) # Name column col = Gtk.TreeViewColumn(_('Name')) renderer = Gtk.CellRendererText() col.pack_start(renderer, True) col.add_attribute(renderer, 'text', 2) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) # Address column col = Gtk.TreeViewColumn(_('JID')) renderer = Gtk.CellRendererText() col.pack_start(renderer, True) col.add_attribute(renderer, 'text', 3) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) self.window.services_treeview.set_headers_visible(True) def _clean_treemodel(self): self.model.clear() for col in self.window.services_treeview.get_columns(): self.window.services_treeview.remove_column(col) self.window.services_treeview.set_headers_visible(False) def _add_actions(self): """ Add the action buttons to the buttonbox for actions the browser can perform """ self.browse_button = Gtk.Button() self.browse_button.connect('clicked', self.on_browse_button_clicked) self.window.action_buttonbox.add(self.browse_button) image = Gtk.Image.new_from_icon_name("document-open", Gtk.IconSize.BUTTON) self.browse_button.set_image(image) label = _('Browse') self.browse_button.set_label(label) self.browse_button.show_all() def _clean_actions(self): """ Remove the action buttons specific to this browser """ if self.browse_button: self.browse_button.destroy() self.browse_button = None def _set_title(self, jid, node, identities, features, data): """ Set the window title based on agent info """ # Set the banner and window title name = '' if len(identities) > 1: # Check if an identity with server category is present for i, _identity in enumerate(identities): if _identity['category'] == 'server' and 'name' in _identity: name = _identity['name'] break elif 'name' in identities[0]: name = identities[0]['name'] if name: self.window._set_window_banner_text(self._get_agent_address(), name) # Add an icon to the banner. pix = self.cache.get_icon(identities, addr=self._get_agent_address()) self.window.banner_icon.set_from_pixbuf(pix) self.window.banner_icon.show() def _clean_title(self): # Everything done here is done in window._initial_state # This is for subclasses. pass def prepare_window(self, window): """ Prepare the service discovery window. Called when a browser is hooked up with a ServiceDiscoveryWindow instance """ self.window = window self.cache = window.cache self._set_initial_title() self._create_treemodel() self._add_actions() # This is a hack. The buttonbox apparently doesn't care about pack_start # or pack_end, so we repack the close button here to make sure it's last close_button = self.window.xml.get_object('close_button') self.window.action_buttonbox.remove(close_button) self.window.action_buttonbox.pack_end(close_button, True, True, 0) close_button.show_all() self.update_actions() self.active = True self.cache.get_info(self.jid, self.node, self._set_title) def cleanup(self): """ Cleanup when the window intends to switch browsers """ self.active = False self._clean_actions() self._clean_treemodel() self._clean_title() self.window._initial_state() def update_theme(self): """ Called when the default theme is changed """ pass def on_browse_button_clicked(self, widget = None): """ When we want to browse an agent: open a new services window with a browser for the agent type """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return jid = model[iter_][0] if jid: node = model[iter_][1] self.window.open(jid, node) def update_actions(self): """ When we select a row: activate action buttons based on the agent's info """ if self.browse_button: self.browse_button.set_sensitive(False) model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return jid = model[iter_][0] node = model[iter_][1] if jid: self.cache.get_info(jid, node, self._update_actions, nofetch = True) def _update_actions(self, jid, node, identities, features, data): """ Continuation of update_actions """ if not identities or not self.browse_button: return klass = self.cache.get_browser(identities, features) if klass: self.browse_button.set_sensitive(True) def default_action(self): """ When we double-click a row: perform the default action on the selected item """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return jid = model[iter_][0] node = model[iter_][1] if jid: self.cache.get_info(jid, node, self._default_action, nofetch = True) def _default_action(self, jid, node, identities, features, data): """ Continuation of default_action """ if self.cache.get_browser(identities, features): # Browse if we can self.on_browse_button_clicked() return True return False def browse(self, force=False): """ Fill the treeview with agents, fetching the info if necessary """ self.model.clear() self._total_items = self._progress = 0 self.window.progressbar.show() self._pulse_timeout = GLib.timeout_add(250, self._pulse_timeout_cb) self.cache.get_items(self.jid, self.node, self._agent_items, force=force, args=(force,)) def _pulse_timeout_cb(self, *args): """ Simple callback to keep the progressbar pulsing """ if not self.active: return False self.window.progressbar.pulse() return True def _find_item(self, jid, node): """ Check if an item is already in the treeview. Return an iter to it if so, None otherwise """ iter_ = self.model.get_iter_first() while iter_: cjid = self.model.get_value(iter_, 0) cnode = self.model.get_value(iter_, 1) if jid == cjid and node == cnode: break iter_ = self.model.iter_next(iter_) if iter_: return iter_ return None def add_self_line(self): pass def _agent_items(self, jid, node, items, force): """ Callback for when we receive a list of agent items """ self.model.clear() self.add_self_line() self._total_items = 0 GLib.source_remove(self._pulse_timeout) self.window.progressbar.hide() # The server returned an error if items == 0: if not self.window.address_comboboxtext: # We can't travel anywhere else. self.window.destroy() dialogs.ErrorDialog(_('The service is not browsable'), _('This service does not contain any items to browse.'), transient_for=self.window.window) return # We got a list of items def fill_partial_rows(items): '''Generator to fill the listmodel of a treeview progressively.''' self.window.services_treeview.freeze_child_notify() for item in items: if self.window.dying: yield False jid_ = item['jid'] node_ = item.get('node', '') # If such an item is already here: don't add it if self._find_item(jid_, node_): continue self._total_items += 1 self._add_item(jid_, node_, node, item, force) if (self._total_items % 10) == 0: self.window.services_treeview.thaw_child_notify() yield True self.window.services_treeview.freeze_child_notify() self.window.services_treeview.thaw_child_notify() #stop idle_add() yield False loader = fill_partial_rows(items) GLib.idle_add(next, loader) def _agent_info(self, jid, node, identities, features, data): """ Callback for when we receive info about an agent's item """ iter_ = self._find_item(jid, node) if not iter_: # Not in the treeview, stop return if identities == 0: # The server returned an error self._update_error(iter_, jid, node) else: # We got our info self._update_info(iter_, jid, node, identities, features, data) self.update_actions() def _add_item(self, jid, node, parent_node, item, force): """ Called when an item should be added to the model. The result of a disco#items query """ self.model.append((jid, node, item.get('name', ''), get_agent_address(jid, node))) self.cache.get_info(jid, node, self._agent_info, force = force) def _update_item(self, iter_, jid, node, item): """ Called when an item should be updated in the model. The result of a disco#items query """ if 'name' in item: self.model[iter_][2] = item['name'] def _update_info(self, iter_, jid, node, identities, features, data): """ Called when an item should be updated in the model with further info. The result of a disco#info query """ name = identities[0].get('name', '') if name: self.model[iter_][2] = name def _update_error(self, iter_, jid, node): '''Called when a disco#info query failed for an item.''' pass class ToplevelAgentBrowser(AgentBrowser): """ This browser is used at the top level of a jabber server to browse services such as transports, conference servers, etc """ def __init__(self, *args): AgentBrowser.__init__(self, *args) self._progressbar_sourceid = None self._renderer = None self._progress = 0 self.register_button = None self.join_button = None self.execute_button = None self.search_button = None # Keep track of our treeview signals self._view_signals = [] self._scroll_signal = None def add_self_line(self): addr = get_agent_address(self.jid, self.node) descr = "%s" % addr # Guess which kind of service this is identities = [] type_ = app.get_transport_name_from_jid(self.jid, use_config_setting=False) if type_: identity = {'category': '_jid', 'type': type_} identities.append(identity) # Set the pixmap for the row pix = self.cache.get_icon(identities, addr=addr) self.model.append(None, (self.jid, self.node, pix, descr, LABELS[1])) # Grab info on the service self.cache.get_info(self.jid, self.node, self._agent_info, force=False) def _pixbuf_renderer_data_func(self, col, cell, model, iter_, data=None): """ Callback for setting the pixbuf renderer's properties """ jid = model.get_value(iter_, 0) if jid: pix = model.get_value(iter_, 2) cell.set_property('visible', True) cell.set_property('pixbuf', pix) else: cell.set_property('visible', False) def _text_renderer_data_func(self, col, cell, model, iter_, data=None): """ Callback for setting the text renderer's properties """ jid = model.get_value(iter_, 0) markup = model.get_value(iter_, 3) state = model.get_value(iter_, 4) cell.set_property('markup', markup) if jid: cell.set_property('cell_background_set', False) if state is not None: # fetching or error cell.set_property('foreground_set', True) else: # Normal/succes cell.set_property('foreground_set', False) else: theme = app.config.get('roster_theme') bgcolor = app.config.get_per('themes', theme, 'groupbgcolor') if bgcolor: cell.set_property('cell_background_set', True) cell.set_property('foreground_set', False) def _treemodel_sort_func(self, model, iter1, iter2, data=None): """ Sort function for our treemode """ # Compare state state1 = model.get_value(iter1, 4) state2 = model.get_value(iter2, 4) if state1 is not None: return 1 if state2 is not None: return -1 descr1 = model.get_value(iter1, 3) descr2 = model.get_value(iter2, 3) # Compare strings if descr1 > descr2: return 1 if descr1 < descr2: return -1 return 0 def _create_treemodel(self): # JID, node, icon, description, state # state is None on sucess or has a string # from LABELS on error or while fetching view = self.window.services_treeview self.model = Gtk.TreeStore(str, str, GdkPixbuf.Pixbuf, str, str) self.model.set_sort_func(4, self._treemodel_sort_func) self.model.set_sort_column_id(4, Gtk.SortType.ASCENDING) view.set_model(self.model) col = Gtk.TreeViewColumn() # Icon Renderer renderer = Gtk.CellRendererPixbuf() renderer.set_property('xpad', 6) col.pack_start(renderer, False) col.set_cell_data_func(renderer, self._pixbuf_renderer_data_func) # Text Renderer renderer = Gtk.CellRendererText() col.pack_start(renderer, True) col.set_cell_data_func(renderer, self._text_renderer_data_func) renderer.set_property('foreground', 'dark gray') # Save this so we can go along with theme changes self._renderer = renderer self.update_theme() view.set_tooltip_column(4) view.insert_column(col, -1) col.set_resizable(True) def _clean_treemodel(self): # Disconnect signals view = self.window.services_treeview for sig in self._view_signals: view.disconnect(sig) self._view_signals = [] if self._scroll_signal: scrollwin = self.window.services_scrollwin scrollwin.disconnect(self._scroll_signal) self._scroll_signal = None AgentBrowser._clean_treemodel(self) def _add_actions(self): AgentBrowser._add_actions(self) self.execute_button = Gtk.Button() self.execute_button.connect('clicked', self.on_execute_button_clicked) self.window.action_buttonbox.add(self.execute_button) image = Gtk.Image.new_from_icon_name("system-run", Gtk.IconSize.BUTTON) self.execute_button.set_image(image) label = _('Execute Command') self.execute_button.set_label(label) self.execute_button.show_all() self.register_button = Gtk.Button(label=_("Re_gister"), use_underline=True) self.register_button.connect('clicked', self.on_register_button_clicked) self.window.action_buttonbox.add(self.register_button) self.register_button.show_all() self.join_button = Gtk.Button() self.join_button.connect('clicked', self.on_join_button_clicked) self.window.action_buttonbox.add(self.join_button) label = _('Join') self.join_button.set_label(label) self.join_button.show_all() self.search_button = Gtk.Button() self.search_button.connect('clicked', self.on_search_button_clicked) self.window.action_buttonbox.add(self.search_button) image = Gtk.Image.new_from_icon_name("edit-find", Gtk.IconSize.BUTTON) self.search_button.set_image(image) label = _('Search') self.search_button.set_label(label) self.search_button.show_all() def _clean_actions(self): if self.execute_button: self.execute_button.destroy() self.execute_button = None if self.register_button: self.register_button.destroy() self.register_button = None if self.join_button: self.join_button.destroy() self.join_button = None if self.search_button: self.search_button.destroy() self.search_button = None AgentBrowser._clean_actions(self) def on_search_button_clicked(self, widget = None): """ When we want to search something: open search window """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return service = model[iter_][0] if service in app.interface.instances[self.account]['search']: app.interface.instances[self.account]['search'][service].window.\ present() else: app.interface.instances[self.account]['search'][service] = \ search_window.SearchWindow(self.account, service) def cleanup(self): AgentBrowser.cleanup(self) def update_theme(self): theme = app.config.get('roster_theme') bgcolor = app.config.get_per('themes', theme, 'groupbgcolor') if bgcolor: self._renderer.set_property('cell-background', bgcolor) self.window.services_treeview.queue_draw() def on_execute_button_clicked(self, widget=None): """ When we want to execute a command: open adhoc command window """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return service = model[iter_][0] node = model[iter_][1] adhoc_commands.CommandWindow(self.account, service, commandnode=node) def on_register_button_clicked(self, widget = None): """ When we want to register an agent: request information about registering with the agent and close the window """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return jid = model[iter_][0] if jid: app.connections[self.account].request_register_agent_info(jid) self.window.destroy(chain = True) def on_join_button_clicked(self, widget): """ When we want to join an IRC room or create a new MUC room: Opens the join_groupchat_window """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return service = model[iter_][0] app.interface.join_gc_minimal(self.account, service, transient_for=self.window.window) def update_actions(self): if self.execute_button: self.execute_button.set_sensitive(False) if self.register_button: self.register_button.set_sensitive(False) if self.browse_button: self.browse_button.set_sensitive(False) if self.join_button: self.join_button.set_sensitive(False) if self.search_button: self.search_button.set_sensitive(False) model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return if not model[iter_][0]: # We're on a category row return if model[iter_][4] is not None: # We don't have the info (yet) # It's either unknown or a transport, register button should be active if self.register_button: self.register_button.set_sensitive(True) # Guess what kind of service we're dealing with if self.browse_button: jid = model[iter_][0] type_ = app.get_transport_name_from_jid(jid, use_config_setting = False) if type_: identity = {'category': '_jid', 'type': type_} klass = self.cache.get_browser([identity]) if klass: self.browse_button.set_sensitive(True) else: # We couldn't guess self.browse_button.set_sensitive(True) else: # Normal case, we have info AgentBrowser.update_actions(self) def _update_actions(self, jid, node, identities, features, data): AgentBrowser._update_actions(self, jid, node, identities, features, data) if self.execute_button and nbxmpp.NS_COMMANDS in features: self.execute_button.set_sensitive(True) if self.search_button and nbxmpp.NS_SEARCH in features: self.search_button.set_sensitive(True) # Don't autorize to register with a server via disco if self.register_button and nbxmpp.NS_REGISTER in features and \ jid != self.jid: # We can register this agent registered_transports = [] jid_list = app.contacts.get_jid_list(self.account) for jid_ in jid_list: contact = app.contacts.get_first_contact_from_jid( self.account, jid_) if _('Transports') in contact.groups: registered_transports.append(jid_) registered_transports.append(self.jid) if jid in registered_transports: self.register_button.set_label(_('_Edit')) else: self.register_button.set_label(_('Re_gister')) self.register_button.set_sensitive(True) if self.join_button and nbxmpp.NS_MUC in features: self.join_button.set_sensitive(True) def _default_action(self, jid, node, identities, features, data): if AgentBrowser._default_action(self, jid, node, identities, features, data): return True if nbxmpp.NS_REGISTER in features: # Register if we can't browse self.on_register_button_clicked() return True return False def browse(self, force=False): self._progress = 0 AgentBrowser.browse(self, force = force) def _expand_all(self): """ Expand all items in the treeview """ # GTK apparently screws up here occasionally. :/ #def expand_all(*args): # self.window.services_treeview.expand_all() # self.expanding = False # return False #self.expanding = True #GLib.idle_add(expand_all) self.window.services_treeview.expand_all() def _update_progressbar(self): """ Update the progressbar """ # Refresh this every update if self._progressbar_sourceid: GLib.source_remove(self._progressbar_sourceid) fraction = 0 if self._total_items: self.window.progressbar.set_text(_("Scanning %(current)d / %(total)d.." ) % {'current': self._progress, 'total': self._total_items}) fraction = float(self._progress) / float(self._total_items) if self._progress >= self._total_items: # We show the progressbar for just a bit before hiding it. id_ = GLib.timeout_add_seconds(2, self._hide_progressbar_cb) self._progressbar_sourceid = id_ else: self.window.progressbar.show() # Hide the progressbar if we're timing out anyways. (20 secs) id_ = GLib.timeout_add_seconds(20, self._hide_progressbar_cb) self._progressbar_sourceid = id_ self.window.progressbar.set_fraction(fraction) def _hide_progressbar_cb(self, *args): """ Simple callback to hide the progressbar a second after we finish """ if self.active: self.window.progressbar.hide() return False def _friendly_category(self, category, type_=None): """ Get the friendly category name """ cat = None if type_: # Try type-specific override try: cat = _cat_to_descr[(category, type_)] except KeyError: pass if not cat: try: cat = _cat_to_descr[category] except KeyError: cat = _cat_to_descr['other'] return cat def _create_category(self, cat, type_=None): """ Creates a category row """ cat = self._friendly_category(cat, type_) return self.model.append(None, ('', '', None, cat, None)) def _find_category(self, cat, type_=None): """ Looks up a category row and returns the iterator to it, or None """ cat = self._friendly_category(cat, type_) iter_ = self.model.get_iter_first() while iter_: if self.model.get_value(iter_, 3) == cat: break iter_ = self.model.iter_next(iter_) if iter_: return iter_ return None def _find_item(self, jid, node): iter_ = None cat_iter = self.model.get_iter_first() while cat_iter and not iter_: cjid = self.model.get_value(cat_iter, 0) cnode = self.model.get_value(cat_iter, 1) if jid == cjid and node == cnode: iter_ = cat_iter break iter_ = self.model.iter_children(cat_iter) while iter_: cjid = self.model.get_value(iter_, 0) cnode = self.model.get_value(iter_, 1) if jid == cjid and node == cnode: break iter_ = self.model.iter_next(iter_) cat_iter = self.model.iter_next(cat_iter) if iter_: return iter_ return None def _add_item(self, jid, node, parent_node, item, force): # Row text addr = get_agent_address(jid, node) if 'name' in item: descr = "%s\n%s" % (item['name'], addr) else: descr = "%s" % addr # Guess which kind of service this is identities = [] type_ = app.get_transport_name_from_jid(jid, use_config_setting = False) if type_: identity = {'category': '_jid', 'type': type_} identities.append(identity) cat_args = ('_jid', type_) else: # Put it in the 'other' category for now cat_args = ('other',) # Set the pixmap for the row pix = self.cache.get_icon(identities, addr=addr) # Put it in the right category cat = self._find_category(*cat_args) if not cat: cat = self._create_category(*cat_args) self.model.append(cat, (jid, node, pix, descr, LABELS[1])) GLib.idle_add(self._expand_all) # Grab info on the service self.cache.get_info(jid, node, self._agent_info, force=force) self._update_progressbar() def _update_item(self, iter_, jid, node, item): addr = get_agent_address(jid, node) if 'name' in item: descr = "%s\n%s" % (item['name'], addr) else: descr = "%s" % addr self.model[iter_][3] = descr def _update_info(self, iter_, jid, node, identities, features, data): addr = get_agent_address(jid, node) name = identities[0].get('name', '') if name: descr = "%s\n%s" % (name, addr) else: descr = "%s" % addr # Update progress self._progress += 1 self._update_progressbar() # Search for an icon and category we can display pix = self.cache.get_icon(identities, addr=addr) cat, type_ = None, None for identity in identities: try: cat, type_ = identity['category'], identity['type'] except KeyError: continue break # Check if we have to move categories old_cat_iter = self.model.iter_parent(iter_) if not old_cat_iter or self.model.get_value(old_cat_iter, 3) == cat: # Already in the right category, just update self.model[iter_][2] = pix self.model[iter_][3] = descr self.model[iter_][4] = None return # Not in the right category, move it. self.model.remove(iter_) old_cat = self.model.get_value(old_cat_iter, 3) # Check if the old category is empty if not self.model.iter_is_valid(old_cat_iter): old_cat_iter = self._find_category(old_cat) if not self.model.iter_children(old_cat_iter): self.model.remove(old_cat_iter) cat_iter = self._find_category(cat, type_) if not cat_iter: cat_iter = self._create_category(cat, type_) self.model.append(cat_iter, (jid, node, pix, descr, None)) self._expand_all() def _update_error(self, iter_, jid, node): self.model[iter_][4] = LABELS[2] self._progress += 1 self._update_progressbar() class MucBrowser(AgentBrowser): def __init__(self, *args, **kwargs): AgentBrowser.__init__(self, *args, **kwargs) self.join_button = None self.bookmark_button = None def _create_treemodel(self): # JID, node, name, users_int, users_str, description, fetched # This is rather long, I'd rather not use a data_func here though. # Users is a string, because want to be able to leave it empty. self.model = Gtk.ListStore(str, str, str, int, str, str, bool) self.model.set_sort_column_id(2, Gtk.SortType.ASCENDING) self.window.services_treeview.set_model(self.model) # Name column col = Gtk.TreeViewColumn(_('Name')) col.set_sizing(Gtk.TreeViewColumnSizing.FIXED) col.set_fixed_width(100) renderer = Gtk.CellRendererText() col.pack_start(renderer, True) col.add_attribute(renderer, 'text', 2) col.set_sort_column_id(2) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) # Users column col = Gtk.TreeViewColumn(_('Users')) renderer = Gtk.CellRendererText() col.pack_start(renderer, True) col.add_attribute(renderer, 'text', 4) col.set_sort_column_id(3) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) # Description column col = Gtk.TreeViewColumn(_('Description')) renderer = Gtk.CellRendererText() col.pack_start(renderer, True) col.add_attribute(renderer, 'text', 5) col.set_sort_column_id(4) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) # Id column col = Gtk.TreeViewColumn(_('Id')) renderer = Gtk.CellRendererText() col.pack_start(renderer, True) col.add_attribute(renderer, 'text', 0) col.set_sort_column_id(0) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) self.window.services_treeview.set_headers_visible(True) self.window.services_treeview.set_headers_clickable(True) # Source id for idle callback used to start disco#info queries. self._fetch_source = None # Query failure counter self._broken = 0 # Connect to scrollwindow scrolling self.vadj = self.window.services_scrollwin.get_property('vadjustment') self.vadj_cbid = self.vadj.connect('value-changed', self.on_scroll) # And to size changes self.size_cbid = self.window.services_scrollwin.connect( 'size-allocate', self.on_scroll) def _clean_treemodel(self): if self.size_cbid: self.window.services_scrollwin.disconnect(self.size_cbid) self.size_cbid = None if self.vadj_cbid: self.vadj.disconnect(self.vadj_cbid) self.vadj_cbid = None AgentBrowser._clean_treemodel(self) def _add_actions(self): self.bookmark_button = Gtk.Button(label=_('_Bookmark'), use_underline=True) self.bookmark_button.connect('clicked', self.on_bookmark_button_clicked) self.window.action_buttonbox.add(self.bookmark_button) self.bookmark_button.show_all() self.join_button = Gtk.Button(label=_('_Join'), use_underline=True) self.join_button.connect('clicked', self.on_join_button_clicked) self.window.action_buttonbox.add(self.join_button) self.join_button.show_all() def _clean_actions(self): if self.bookmark_button: self.bookmark_button.destroy() self.bookmark_button = None if self.join_button: self.join_button.destroy() self.join_button = None def on_bookmark_button_clicked(self, *args): model, iter = self.window.services_treeview.get_selection().get_selected() if not iter: return name = app.config.get_per('accounts', self.account, 'name') room_jid = model[iter][0] bm = { 'name': room_jid.split('@')[0], 'jid': room_jid, 'autojoin': '0', 'minimize': '0', 'password': '', 'nick': name } for bookmark in app.connections[self.account].bookmarks: if bookmark['jid'] == bm['jid']: dialogs.ErrorDialog( _('Bookmark already set'), _('Group Chat "%s" is already in your bookmarks.') % bm['jid'], transient_for=self.window.window) return app.connections[self.account].bookmarks.append(bm) app.connections[self.account].store_bookmarks() gui_menu_builder.build_bookmark_menu(self.account) dialogs.InformationDialog( _('Bookmark has been added successfully'), _('You can manage your bookmarks via Actions menu in your roster.'), transient_for=self.window.window) def on_join_button_clicked(self, *args): """ When we want to join a conference: ask specific informations about the selected agent and close the window """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return service = model[iter_][0] if 'join_gc' not in app.interface.instances[self.account]: app.interface.join_gc_minimal(self.account, service) else: app.interface.instances[self.account]['join_gc'].set_room(service) app.interface.instances[self.account]['join_gc'].present() self.window.destroy() def update_actions(self): sens = self.window.services_treeview.get_selection().count_selected_rows() if self.bookmark_button: self.bookmark_button.set_sensitive(sens > 0) if self.join_button: self.join_button.set_sensitive(sens > 0) def default_action(self): self.on_join_button_clicked() def _start_info_query(self): """ Idle callback to start checking for visible rows """ self._fetch_source = None self._query_visible() return False def on_scroll(self, *args): """ Scrollwindow callback to trigger new queries on scolling """ # This apparently happens when inactive sometimes self._query_visible() def _query_visible(self): """ Query the next visible row for info """ if self._fetch_source: # We're already fetching return view = self.window.services_treeview if not view.get_realized(): # Prevent a silly warning, try again in a bit. self._fetch_source = GLib.timeout_add(100, self._start_info_query) return range_ = view.get_visible_range() if not range_: return start, end = range_ iter_ = self.model.get_iter(start) while iter_: if not self.model.get_value(iter_, 6): jid = self.model.get_value(iter_, 0) node = self.model.get_value(iter_, 1) self.cache.get_info(jid, node, self._agent_info) self._fetch_source = True return if self.model.get_path(iter_) == end: break iter_ = self.model.iter_next(iter_) self._fetch_source = None def _channel_altinfo(self, jid, node, items, name = None): """ Callback for the alternate disco#items query. We try to atleast get the amount of users in the room if the service does not support MUC dataforms """ if items == 0: # The server returned an error self._broken += 1 if self._broken >= 3: # Disable queries completely after 3 failures if self.size_cbid: self.window.services_scrollwin.disconnect(self.size_cbid) self.size_cbid = None if self.vadj_cbid: self.vadj.disconnect(self.vadj_cbid) self.vadj_cbid = None self._fetch_source = None return else: iter_ = self._find_item(jid, node) if iter_: if name: self.model[iter_][2] = name self.model[iter_][3] = len(items) # The number of users self.model[iter_][4] = str(len(items)) # The number of users self.model[iter_][6] = True self._fetch_source = None self._query_visible() def _add_item(self, jid, node, parent_node, item, force): self.model.append((jid, node, item.get('name', ''), -1, '', '', False)) if not self._fetch_source: self._fetch_source = GLib.idle_add(self._start_info_query) def _update_info(self, iter_, jid, node, identities, features, data): name = identities[0].get('name', '') for form in data: typefield = form.getField('FORM_TYPE') if typefield and typefield.getValue() == \ 'http://jabber.org/protocol/muc#roominfo': # Fill model row from the form's fields users = form.getField('muc#roominfo_occupants') descr = form.getField('muc#roominfo_description') if users: self.model[iter_][3] = int(users.getValue()) self.model[iter_][4] = users.getValue() if descr and descr.getValue(): self.model[iter_][5] = descr.getValue() # Only set these when we find a form with additional info # Some servers don't support forms and put extra info in # the name attribute, so we preserve it in that case. self.model[iter_][2] = name self.model[iter_][6] = True break else: # We didn't find a form, switch to alternate query mode self.cache.get_items(jid, node, self._channel_altinfo, args = (name,)) return # Continue with the next self._fetch_source = None self._query_visible() def _update_error(self, iter_, jid, node): # switch to alternate query mode self.cache.get_items(jid, node, self._channel_altinfo) def PubSubBrowser(account, jid, node): """ Return an AgentBrowser subclass that will display service discovery for particular pubsub service. Different pubsub services may need to present different data during browsing """ # for now, only discussion groups are supported... # TODO: check if it has appropriate features to be such kind of service return DiscussionGroupsBrowser(account, jid, node) class DiscussionGroupsBrowser(AgentBrowser): """ For browsing pubsub-based discussion groups service """ def __init__(self, account, jid, node): AgentBrowser.__init__(self, account, jid, node) # this will become set object when we get subscriptions; None means # we don't know yet which groups are subscribed self.subscriptions = None # this will become our action widgets when we create them; None means # we don't have them yet (needed for check in callback) self.subscribe_button = None self.unsubscribe_button = None app.connections[account].send_pb_subscription_query(jid, self._on_pep_subscriptions) def _create_treemodel(self): """ Create treemodel for the window """ # JID, node, name (with description) - pango markup, dont have info?, subscribed? self.model = Gtk.TreeStore(str, str, str, bool, bool) # sort by name self.model.set_sort_column_id(2, Gtk.SortType.ASCENDING) self.window.services_treeview.set_model(self.model) # Name column # Pango markup for name and description, description printed with # font renderer = Gtk.CellRendererText() col = Gtk.TreeViewColumn(_('Name')) col.pack_start(renderer, True) col.add_attribute(renderer, 'markup', 2) col.set_resizable(True) self.window.services_treeview.insert_column(col, -1) self.window.services_treeview.set_headers_visible(True) # Subscription state renderer = Gtk.CellRendererToggle() col = Gtk.TreeViewColumn(_('Subscribed')) col.pack_start(renderer, True) col.add_attribute(renderer, 'inconsistent', 3) col.add_attribute(renderer, 'active', 4) col.set_resizable(False) self.window.services_treeview.insert_column(col, -1) # Node Column renderer = Gtk.CellRendererText() col = Gtk.TreeViewColumn(_('Node')) col.pack_start(renderer, True) col.add_attribute(renderer, 'markup', 1) col.set_resizable(True) self.window.services_treeview.insert_column(col, -1) def _add_items(self, jid, node, items, force): for item in items: jid_ = item['jid'] node_ = item.get('node', '') self._total_items += 1 self._add_item(jid_, node_, node, item, force) def _in_list_foreach(self, model, path, iter_, node): if model[path][1] == node: self.in_list = True def _in_list(self, node): self.in_list = False self.model.foreach(self._in_list_foreach, node) return self.in_list def _add_item(self, jid, node, parent_node, item, force): """ Called when we got basic information about new node from query. Show the item """ name = item.get('name', '') if self.subscriptions is not None: dunno = False subscribed = node in self.subscriptions else: dunno = True subscribed = False name = GLib.markup_escape_text(name) name = '%s' % name if parent_node: parent_iter = self._get_iter(parent_node) else: parent_iter = None if not node or not self._in_list(node): self.model.append(parent_iter, (jid, node, name, dunno, subscribed)) self.cache.get_items(jid, node, self._add_items, force = force, args = (force,)) def _get_child_iter(self, parent_iter, node): child_iter = self.model.iter_children(parent_iter) while child_iter: if self.model[child_iter][1] == node: return child_iter child_iter = self.model.iter_next(child_iter) return None def _get_iter(self, node): ''' Look for an iter with the given node ''' self.found_iter = None def is_node(model, path, iter, node): if model[iter][1] == node: self.found_iter = iter return True self.model.foreach(is_node, node) return self.found_iter def _add_actions(self): self.post_button = Gtk.Button(label=_('New post'), use_underline=True) self.post_button.set_sensitive(False) self.post_button.connect('clicked', self.on_post_button_clicked) self.window.action_buttonbox.add(self.post_button) self.post_button.show_all() self.subscribe_button = Gtk.Button(label=_('_Subscribe'), use_underline=True) self.subscribe_button.set_sensitive(False) self.subscribe_button.connect('clicked', self.on_subscribe_button_clicked) self.window.action_buttonbox.add(self.subscribe_button) self.subscribe_button.show_all() self.unsubscribe_button = Gtk.Button(label=_('_Unsubscribe'), use_underline=True) self.unsubscribe_button.set_sensitive(False) self.unsubscribe_button.connect('clicked', self.on_unsubscribe_button_clicked) self.window.action_buttonbox.add(self.unsubscribe_button) self.unsubscribe_button.show_all() def _clean_actions(self): if self.post_button is not None: self.post_button.destroy() self.post_button = None if self.subscribe_button is not None: self.subscribe_button.destroy() self.subscribe_button = None if self.unsubscribe_button is not None: self.unsubscribe_button.destroy() self.unsubscribe_button = None def update_actions(self): """ Called when user selected a row. Make subscribe/unsubscribe buttons sensitive appropriatelly """ # we have nothing to do if we don't have buttons... if self.subscribe_button is None: return model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_ or self.subscriptions is None: # no item selected or no subscriptions info, all buttons are insensitive self.post_button.set_sensitive(False) self.subscribe_button.set_sensitive(False) self.unsubscribe_button.set_sensitive(False) else: subscribed = model.get_value(iter_, 4) # 4 = subscribed? self.post_button.set_sensitive(subscribed) self.subscribe_button.set_sensitive(not subscribed) self.unsubscribe_button.set_sensitive(subscribed) def on_post_button_clicked(self, widget): """ Called when 'post' button is pressed. Open window to create post """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if iter_ is None: return groupnode = model.get_value(iter_, 1) # 1 = groupnode groups.GroupsPostWindow(self.account, self.jid, groupnode) def on_subscribe_button_clicked(self, widget): """ Called when 'subscribe' button is pressed. Send subscribtion request """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if iter_ is None: return groupnode = model.get_value(iter_, 1) # 1 = groupnode app.connections[self.account].send_pb_subscribe(self.jid, groupnode, self._on_pep_subscribe, groupnode) def on_unsubscribe_button_clicked(self, widget): """ Called when 'unsubscribe' button is pressed. Send unsubscription request """ model, iter_ = self.window.services_treeview.get_selection().get_selected() if iter_ is None: return groupnode = model.get_value(iter_, 1) # 1 = groupnode app.connections[self.account].send_pb_unsubscribe(self.jid, groupnode, self._on_pep_unsubscribe, groupnode) def _on_pep_subscriptions(self, conn, request): """ We got the subscribed groups list stanza. Now, if we already have items on the list, we should actualize them """ try: subscriptions = request.getTag('pubsub').getTag('subscriptions') except Exception: return groups = set() for child in subscriptions.getTags('subscription'): groups.add(child['node']) self.subscriptions = groups # try to setup existing items in model model = self.window.services_treeview.get_model() for row in model: # 1 = group node # 3 = insensitive checkbox for subscribed # 4 = subscribed? groupnode = row[1] row[3] = False row[4] = groupnode in groups # we now know subscriptions, update button states self.update_actions() raise nbxmpp.NodeProcessed def _on_pep_subscribe(self, conn, request, groupnode): """ We have just subscribed to a node. Update UI """ self.subscriptions.add(groupnode) model = self.window.services_treeview.get_model() for row in model: if row[1] == groupnode: # 1 = groupnode row[4] = True break self.update_actions() raise nbxmpp.NodeProcessed def _on_pep_unsubscribe(self, conn, request, groupnode): """ We have just unsubscribed from a node. Update UI """ self.subscriptions.remove(groupnode) model = self.window.services_treeview.get_model() for row in model: if row[1] == groupnode: # 1 = groupnode row[4]=False break self.update_actions() raise nbxmpp.NodeProcessed # Fill the global agent type info dictionary _agent_type_info = _gen_agent_type_info() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/emoticons.py000066400000000000000000000242751326020644600243560ustar00rootroot00000000000000# -*- coding:utf-8 -*- # # Copyright (C) 2017 Philipp Hörist # # 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 . import os import sys import logging import importlib.util as imp from collections import OrderedDict from importlib.machinery import SourceFileLoader from gi.repository import GdkPixbuf, Gtk, GLib MODIFIER_MAX_CHILDREN_PER_LINE = 6 MAX_CHILDREN_PER_LINE = 10 MIN_HEIGHT = 200 pixbufs = dict() codepoints = dict() popover_instance = None log = logging.getLogger('gajim.emoticons') class SubPixbuf: height = 24 width = 24 columns = 20 def __init__(self, path): self.cur_column = 0 self.src_x = 0 self.src_y = 0 self.atlas = GdkPixbuf.Pixbuf.new_from_file(path) def get_pixbuf(self): self.src_x = self.cur_column * self.width subpixbuf = self.atlas.new_subpixbuf(self.src_x, self.src_y, self.width, self.height) if self.cur_column == self.columns - 1: self.src_y += self.width self.cur_column = 0 else: self.cur_column += 1 return subpixbuf def load(path, ascii_emoticons): module_name = 'emoticons_theme.py' theme_path = os.path.join(path, module_name) if sys.platform == 'win32' and not os.path.exists(theme_path): module_name = 'emoticons_theme.pyc' theme_path = os.path.join(path, module_name) loader = SourceFileLoader(module_name, theme_path) try: theme = loader.load_module() except FileNotFoundError: log.exception('Emoticons theme not found') return if not theme.use_image: # Use Font to display emoticons set_popover(theme.emoticons, False) return True try: sub = SubPixbuf(os.path.join(path, 'emoticons.png')) except GLib.GError: log.exception('Error while creating subpixbuf') return False def add_emoticon(codepoint_, sub, mod_list=None): pix = sub.get_pixbuf() for alternate in codepoint_: if not ascii_emoticons: try: alternate.encode('ascii') continue except UnicodeEncodeError: pass codepoints[alternate] = pix if pix not in pixbufs: pixbufs[pix] = alternate if mod_list is not None: mod_list.append(pix) else: pixbuf_list.append(pix) popover_dict = OrderedDict() try: for category in theme.emoticons: if not theme.emoticons[category]: # Empty category continue pixbuf_list = [] for filename, codepoint_ in theme.emoticons[category]: if codepoint_ is None: # Category image pixbuf_list.append(sub.get_pixbuf()) continue if not filename: # We have an emoticon with a modifier mod_list = [] for _, mod_codepoint in codepoint_: add_emoticon(mod_codepoint, sub, mod_list) pixbuf_list.append(mod_list) else: add_emoticon(codepoint_, sub) popover_dict[category] = pixbuf_list except Exception: log.exception('Error while loading emoticon theme') return set_popover(popover_dict, True) return True def set_popover(popover_dict, use_image): global popover_instance popover_instance = EmoticonPopover(popover_dict, use_image) def get_popover(): return popover_instance def get_pixbuf(codepoint_): try: return codepoints[codepoint_] except KeyError: return None def get_codepoint(pixbuf_): try: return pixbufs[pixbuf_] except KeyError: return None def replace_with_codepoint(buffer_): if not pixbufs: # We use font emoticons return iter_ = buffer_.get_start_iter() pix = iter_.get_pixbuf() def replace(pix): if pix: emote = get_codepoint(pix) if not emote: return iter_2 = iter_.copy() iter_2.forward_char() buffer_.delete(iter_, iter_2) buffer_.insert(iter_, emote) replace(pix) while iter_.forward_char(): pix = iter_.get_pixbuf() replace(pix) class EmoticonPopover(Gtk.Popover): def __init__(self, emoji_dict, use_image): super().__init__() self.set_name('EmoticonPopover') self.text_widget = None self.use_image = use_image notebook = Gtk.Notebook() self.add(notebook) self.handler_id = self.connect('key_press_event', self.on_key_press) for category in emoji_dict: scrolled_window = Gtk.ScrolledWindow() scrolled_window.set_min_content_height(MIN_HEIGHT) flowbox = Gtk.FlowBox() flowbox.set_max_children_per_line(MAX_CHILDREN_PER_LINE) flowbox.connect('child_activated', self.on_emoticon_press) scrolled_window.add(flowbox) # Use first entry as a label for the notebook page if self.use_image: cat_image = Gtk.Image() cat_image.set_from_pixbuf(emoji_dict[category][0]) notebook.append_page(scrolled_window, cat_image) else: notebook.append_page(scrolled_window, Gtk.Label(label=emoji_dict[category][0])) # Populate the category with emojis for pix in emoji_dict[category][1:]: if isinstance(pix, list): widget = self.add_emoticon_modifier(pix) else: if self.use_image: widget = Gtk.Image() widget.set_from_pixbuf(pix) else: widget = Gtk.Label(label=pix) flowbox.add(widget) notebook.show_all() def add_emoticon_modifier(self, pixbuf_list): button = Gtk.MenuButton() button.set_relief(Gtk.ReliefStyle.NONE) if self.use_image: # We use the first item of the list as image for the button button.get_child().set_from_pixbuf(pixbuf_list[0]) else: button.remove(button.get_child()) label = Gtk.Label(label=pixbuf_list[0]) button.add(label) button.connect('button-press-event', self.on_modifier_press) popover = Gtk.Popover() popover.set_name('EmoticonPopover') popover.connect('key_press_event', self.on_key_press) flowbox = Gtk.FlowBox() flowbox.set_size_request(200, -1) flowbox.set_max_children_per_line(MODIFIER_MAX_CHILDREN_PER_LINE) flowbox.connect('child_activated', self.on_emoticon_press) popover.add(flowbox) for pix in pixbuf_list[1:]: if self.use_image: widget = Gtk.Image() widget.set_from_pixbuf(pix) else: widget = Gtk.Label(label=pix) flowbox.add(widget) flowbox.show_all() button.set_popover(popover) return button def set_callbacks(self, widget): self.text_widget = widget # Because the handlers getting disconnected when on_destroy() is called # we connect them again if self.handler_id: self.disconnect(self.handler_id) self.handler_id = self.connect('key_press_event', self.on_key_press) def on_key_press(self, widget, event): self.text_widget.grab_focus() def on_modifier_press(self, button, event): if event.button == 3: button.get_popover().show() button.get_popover().get_child().unselect_all() if event.button == 1: button.get_parent().emit('activate') if self.use_image: self.append_emoticon(button.get_child().get_pixbuf()) else: self.append_emoticon(button.get_child().get_text()) return True def on_emoticon_press(self, flowbox, child): GLib.timeout_add(100, flowbox.unselect_all) if isinstance(child.get_child(), Gtk.MenuButton): return if self.use_image: self.append_emoticon(child.get_child().get_pixbuf()) else: self.append_emoticon(child.get_child().get_text()) def append_emoticon(self, pix): self.text_widget.remove_placeholder() buffer_ = self.text_widget.get_buffer() if buffer_.get_char_count(): buffer_.insert_at_cursor(' ') insert_mark = buffer_.get_insert() insert_iter = buffer_.get_iter_at_mark(insert_mark) if self.use_image: buffer_.insert_pixbuf(insert_iter, pix) else: buffer_.insert(insert_iter, pix) buffer_.insert_at_cursor(' ') else: # we are the beginning of buffer insert_mark = buffer_.get_insert() insert_iter = buffer_.get_iter_at_mark(insert_mark) if self.use_image: buffer_.insert_pixbuf(insert_iter, pix) else: buffer_.insert(insert_iter, pix) buffer_.insert_at_cursor(' ') def do_destroy(self): # Remove the references we hold to other objects self.text_widget = None # Even though we dont destroy the Popover, handlers are getting # still disconnected, which makes the handler_id invalid # FIXME: find out how we can prevent handlers getting disconnected self.handler_id = None # Never destroy, creating a new EmoticonPopover is expensive return True gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/features_window.py000066400000000000000000000156061326020644600255610ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/features_window.py ## ## Copyright (C) 2007 Jean-Marie Traissard ## Julien Pivotto ## Stefan Bethge ## Stephan Erb ## Copyright (C) 2007-2014 Yann Leboulanger ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import os import gi from gi.repository import Gtk, Gdk from gajim import gtkgui_helpers from gajim.common import app from gajim.common.i18n import Q_ class FeaturesWindow: """ Class for features window """ def __init__(self): self.xml = gtkgui_helpers.get_gtk_builder('features_window.ui') self.window = self.xml.get_object('features_window') self.window.set_transient_for(app.interface.roster.window) treeview = self.xml.get_object('features_treeview') self.desc_label = self.xml.get_object('feature_desc_label') # {name: (available_function, unix_text, windows_text)} self.features = { _('Bonjour / Zeroconf'): (self.zeroconf_available, _('Serverless chatting with autodetected clients in a local network.'), _('Requires python-avahi.'), _('Requires pybonjour and bonjour SDK running (http://developer.apple.com/opensource/).')), _('Command line'): (self.dbus_available, _('A script to control Gajim via commandline.'), _('Requires python-dbus.'), _('Feature not available under Windows.')), _('OpenPGP message encryption'): (self.gpg_available, _('Ability to encrypting chat messages with OpenPGP.'), _('Requires gpg and python-gnupg (http://code.google.com/p/python-gnupg/).'), _('Requires gpg.exe in PATH.')), _('Password encryption'): (self.some_keyring_available, _('Passwords can be stored securely and not just in plaintext.'), _('Requires libsecret and a provider (such as GNOME Keyring and KSecretService).'), _('On Windows the Windows Credential Vault is used.')), _('Spell Checker'): (self.speller_available, _('Spellchecking of composed messages.'), _('Requires Gspell'), _('Requires Gspell')), _('Automatic status'): (self.idle_available, _('Ability to measure idle time, in order to set auto status.'), _('Requires libxss library.'), _('Requires python2.5.')), _('End to End message encryption'): (self.pycrypto_available, _('Encrypting chat messages.'), _('Requires python-crypto.'), _('Requires python-crypto.')), _('RST Generator'): (self.docutils_available, _('Generate XHTML output from RST code (see http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html).'), _('Requires python-docutils.'), _('Requires python-docutils.')), _('Audio / Video'): (self.farstream_available, _('Ability to start audio and video chat.'), _('Requires gir1.2-farstream-0.2, gir1.2-gstreamer-1.0, gstreamer1.0-libav and gstreamer1.0-plugins-ugly.'), _('Feature not available under Windows.')), _('UPnP-IGD'): (self.gupnp_igd_available, _('Ability to request your router to forward port for file transfer.'), _('Requires gir1.2-gupnpigd-1.0.'), _('Feature not available under Windows.')), } # name, supported self.model = Gtk.ListStore(str, bool) treeview.set_model(self.model) col = Gtk.TreeViewColumn(Q_('?features:Available')) treeview.append_column(col) cell = Gtk.CellRendererToggle() cell.set_property('radio', True) col.pack_start(cell, True) col.add_attribute(cell, 'active', 1) col = Gtk.TreeViewColumn(_('Feature')) treeview.append_column(col) cell = Gtk.CellRendererText() col.pack_start(cell, True) col.add_attribute(cell, 'text', 0) # Fill model for feature in self.features: func = self.features[feature][0] rep = func() self.model.append([feature, rep]) self.model.set_sort_column_id(0, Gtk.SortType.ASCENDING) self.xml.connect_signals(self) self.window.show_all() self.xml.get_object('close_button').grab_focus() def on_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.window.destroy() def on_close_button_clicked(self, widget): self.window.destroy() def on_features_treeview_cursor_changed(self, widget): selection = widget.get_selection() if not selection: return rows = selection.get_selected_rows()[1] if not rows: return path = rows[0] feature = self.model[path][0] text = self.features[feature][1] + '\n' if os.name == 'nt': text = text + self.features[feature][3] else: text = text + self.features[feature][2] self.desc_label.set_text(text) def zeroconf_available(self): return app.HAVE_ZEROCONF def dbus_available(self): from gajim.common import dbus_support return dbus_support.supported def gpg_available(self): return app.HAVE_GPG def some_keyring_available(self): if os.name == 'nt': return True try: gi.require_version('Secret', '1') from gi.repository import Secret except (ValueError, ImportError): return False return True def speller_available(self): return app.HAVE_SPELL def idle_available(self): from gajim.common import sleepy return sleepy.SUPPORTED def pycrypto_available(self): return app.HAVE_PYCRYPTO def docutils_available(self): try: __import__('docutils') except Exception: return False return True def farstream_available(self): return app.HAVE_FARSTREAM def gupnp_igd_available(self): return app.HAVE_UPNP_IGD gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/filetransfers_window.py000066400000000000000000001241251326020644600266070ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/filetransfers_window.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2005-2006 Dimitur Kirov ## Copyright (C) 2005-2007 Nikos Kouremenos ## Copyright (C) 2006 Travis Shirk ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GdkPixbuf from gi.repository import GLib from gi.repository import Pango import os import time from enum import IntEnum, unique from datetime import datetime from gajim import gtkgui_helpers from gajim import tooltips from gajim import dialogs from gajim.common import app from gajim.common import helpers from gajim.common.file_props import FilesProp from gajim.common.protocol.bytestream import (is_transfer_active, is_transfer_paused, is_transfer_stopped) from nbxmpp.protocol import NS_JINGLE_FILE_TRANSFER_5 import logging log = logging.getLogger('gajim.filetransfer_window') @unique class Column(IntEnum): IMAGE = 0 LABELS = 1 FILE = 2 TIME = 3 PROGRESS = 4 PERCENT = 5 PULSE = 6 SID = 7 class FileTransfersWindow: def __init__(self): self.files_props = {'r' : {}, 's': {}} self.height_diff = 0 self.xml = gtkgui_helpers.get_gtk_builder('filetransfers.ui') self.window = self.xml.get_object('file_transfers_window') self.tree = self.xml.get_object('transfers_list') self.cancel_button = self.xml.get_object('cancel_button') self.pause_button = self.xml.get_object('pause_restore_button') self.cleanup_button = self.xml.get_object('cleanup_button') self.notify_ft_checkbox = self.xml.get_object( 'notify_ft_complete_checkbox') shall_notify = app.config.get('notify_on_file_complete') self.notify_ft_checkbox.set_active(shall_notify) self.model = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str, str, str, int, int, str) self.tree.set_model(self.model) col = Gtk.TreeViewColumn() render_pixbuf = Gtk.CellRendererPixbuf() col.pack_start(render_pixbuf, True) render_pixbuf.set_property('xpad', 3) render_pixbuf.set_property('ypad', 3) render_pixbuf.set_property('yalign', .0) col.add_attribute(render_pixbuf, 'pixbuf', 0) self.tree.append_column(col) col = Gtk.TreeViewColumn(_('File')) renderer = Gtk.CellRendererText() col.pack_start(renderer, False) col.add_attribute(renderer, 'markup', Column.LABELS) renderer.set_property('yalign', 0.) renderer = Gtk.CellRendererText() col.pack_start(renderer, True) col.add_attribute(renderer, 'markup', Column.FILE) renderer.set_property('xalign', 0.) renderer.set_property('yalign', 0.) renderer.set_property('ellipsize', Pango.EllipsizeMode.END) col.set_resizable(True) col.set_expand(True) self.tree.append_column(col) col = Gtk.TreeViewColumn(_('Time')) renderer = Gtk.CellRendererText() col.pack_start(renderer, False) col.add_attribute(renderer, 'markup', Column.TIME) renderer.set_property('yalign', 0.5) renderer.set_property('xalign', 0.5) renderer = Gtk.CellRendererText() renderer.set_property('ellipsize', Pango.EllipsizeMode.END) col.set_resizable(True) col.set_expand(False) self.tree.append_column(col) col = Gtk.TreeViewColumn(_('Progress')) renderer = Gtk.CellRendererProgress() renderer.set_property('yalign', 0.5) renderer.set_property('xalign', 0.5) col.pack_start(renderer, False) col.add_attribute(renderer, 'text', Column.PROGRESS) col.add_attribute(renderer, 'value', Column.PERCENT) col.add_attribute(renderer, 'pulse', Column.PULSE) col.set_resizable(True) col.set_expand(False) self.tree.append_column(col) self.images = {} self.icons = { 'upload': 'go-up', 'download': 'go-down', 'stop': 'window-close', 'waiting': 'view-refresh', 'pause': 'media-playback-pause', 'continue': 'media-playback-start', 'ok': 'emblem-ok-symbolic', 'computing': 'system-run', 'hash_error': 'network-error-symbolic', } self.tree.get_selection().set_mode(Gtk.SelectionMode.SINGLE) self.tree.get_selection().connect('changed', self.selection_changed) # Tooltip self.tree.connect('query-tooltip', self._query_tooltip) self.tree.set_has_tooltip(True) self.tooltip = tooltips.FileTransfersTooltip() self.file_transfers_menu = self.xml.get_object('file_transfers_menu') self.open_folder_menuitem = self.xml.get_object('open_folder_menuitem') self.cancel_menuitem = self.xml.get_object('cancel_menuitem') self.pause_menuitem = self.xml.get_object('pause_menuitem') self.continue_menuitem = self.xml.get_object('continue_menuitem') self.remove_menuitem = self.xml.get_object('remove_menuitem') self.xml.connect_signals(self) def _query_tooltip(self, widget, x_pos, y_pos, keyboard_mode, tooltip): try: x_pos, y_pos = widget.convert_widget_to_bin_window_coords( x_pos, y_pos) row = widget.get_path_at_pos(x_pos, y_pos)[0] except TypeError: self.tooltip.clear_tooltip() return False if not row: self.tooltip.clear_tooltip() return False iter_ = None try: model = widget.get_model() iter_ = model.get_iter(row) except Exception: self.tooltip.clear_tooltip() return False sid = self.model[iter_][Column.SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) value, widget = self.tooltip.get_tooltip(file_props, sid) tooltip.set_custom(widget) return value def find_transfer_by_jid(self, account, jid): """ Find all transfers with peer 'jid' that belong to 'account' """ active_transfers = [[], []] # ['senders', 'receivers'] allfp = FilesProp.getAllFileProp() for file_props in allfp: if file_props.type_ == 's' and file_props.tt_account == account: # 'account' is the sender receiver_jid = file_props.receiver.split('/')[0] if jid == receiver_jid and not is_transfer_stopped(file_props): active_transfers[0].append(file_props) elif file_props.type_ == 'r' and file_props.tt_account == account: # 'account' is the recipient sender_jid = file_props.sender.split('/')[0] if jid == sender_jid and not is_transfer_stopped(file_props): active_transfers[1].append(file_props) else: raise Exception('file_props has no type') return active_transfers def show_completed(self, jid, file_props): """ Show a dialog saying that file (file_props) has been transferred """ def on_open(widget, file_props): dialog.destroy() if not file_props.file_name: return path = os.path.split(file_props.file_name)[0] if os.path.exists(path) and os.path.isdir(path): helpers.launch_file_manager(path) self.tree.get_selection().unselect_all() if file_props.type_ == 'r': # file path is used below in 'Save in' (file_path, file_name) = os.path.split(file_props.file_name) else: file_name = file_props.name sectext = '\t' + _('Filename: %s') % GLib.markup_escape_text(file_name) sectext += '\n\t' + _('Size: %s') % \ helpers.convert_bytes(file_props.size) if file_props.type_ == 'r': jid = file_props.sender.split('/')[0] sender_name = app.contacts.get_first_contact_from_jid( file_props.tt_account, jid).get_shown_name() sender = sender_name else: #You is a reply of who sent a file sender = _('You') sectext += '\n\t' + _('Sender: %s') % sender sectext += '\n\t' + _('Recipient: ') if file_props.type_ == 's': jid = file_props.receiver.split('/')[0] receiver_name = app.contacts.get_first_contact_from_jid( file_props.tt_account, jid).get_shown_name() recipient = receiver_name else: #You is a reply of who received a file recipient = _('You') sectext += recipient if file_props.type_ == 'r': sectext += '\n\t' + _('Saved in: %s') % file_path dialog = dialogs.HigDialog(app.interface.roster.window, Gtk.MessageType.INFO, Gtk.ButtonsType.NONE, _('File transfer completed'), sectext) if file_props.type_ == 'r': button = Gtk.Button.new_with_mnemonic(_('Open _Containing Folder')) button.connect('clicked', on_open, file_props) dialog.action_area.pack_start(button, True, True, 0) ok_button = dialog.add_button(Gtk.STOCK_OK, Gtk.ResponseType.OK) def on_ok(widget): dialog.destroy() ok_button.connect('clicked', on_ok) dialog.show_all() def show_request_error(self, file_props): """ Show error dialog to the recipient saying that transfer has been canceled """ dialogs.InformationDialog(_('File transfer cancelled'), _('Connection with peer cannot be established.')) self.tree.get_selection().unselect_all() def show_send_error(self, file_props): """ Show error dialog to the sender saying that transfer has been canceled """ dialogs.InformationDialog(_('File transfer cancelled'), _('Connection with peer cannot be established.')) self.tree.get_selection().unselect_all() def show_stopped(self, jid, file_props, error_msg=''): if file_props.type_ == 'r': file_name = os.path.basename(file_props.file_name) else: file_name = file_props.name sectext = '\t' + _('Filename: %s') % GLib.markup_escape_text(file_name) sectext += '\n\t' + _('Recipient: %s') % jid if error_msg: sectext += '\n\t' + _('Error message: %s') % error_msg dialogs.ErrorDialog(_('File transfer stopped'), sectext) self.tree.get_selection().unselect_all() def show_hash_error(self, jid, file_props, account): def on_yes(dummy, fjid, file_props, account): # Delete old file os.remove(file_props.file_name) jid, resource = app.get_room_and_nick_from_fjid(fjid) if resource: contact = app.contacts.get_contact(account, jid, resource) else: contact = app.contacts.get_contact_with_highest_priority( account, jid) fjid = contact.get_full_jid() # Request the file to the sender sid = helpers.get_random_string_16() new_file_props = FilesProp.getNewFileProp(account, sid) new_file_props.file_name = file_props.file_name new_file_props.name = file_props.name new_file_props.desc = file_props.desc new_file_props.size = file_props.size new_file_props.date = file_props.date new_file_props.hash_ = file_props.hash_ new_file_props.type_ = 'r' tsid = app.connections[account].start_file_transfer(fjid, new_file_props, True) new_file_props.transport_sid = tsid self.add_transfer(account, contact, new_file_props) if file_props.type_ == 'r': file_name = os.path.basename(file_props.file_name) else: file_name = file_props.name dialogs.YesNoDialog(('File transfer error'), _('The file %(file)s has been received, but it seems to have ' 'been damaged along the way.\nDo you want to download it again?') % \ {'file': file_name}, on_response_yes=(on_yes, jid, file_props, account), type_=Gtk.MessageType.ERROR) def show_file_send_request(self, account, contact): win = Gtk.ScrolledWindow() win.set_shadow_type(Gtk.ShadowType.IN) win.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER) from gajim.message_textview import MessageTextView desc_entry = MessageTextView() win.add(desc_entry) def on_ok(widget): file_dir = None files_path_list = dialog.get_filenames() desc = desc_entry.get_text() for file_path in files_path_list: if self.send_file(account, contact, file_path, desc) \ and file_dir is None: file_dir = os.path.dirname(file_path) if file_dir: app.config.set('last_send_dir', file_dir) dialog.destroy() dialog = dialogs.FileChooserDialog(_('Choose File to Send…'), Gtk.FileChooserAction.OPEN, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL), Gtk.ResponseType.OK, True, # select multiple true as we can select many files to send app.config.get('last_send_dir'), on_response_ok=on_ok, on_response_cancel=lambda e:dialog.destroy(), preview=True, transient_for=app.interface.roster.window ) btn = Gtk.Button.new_with_mnemonic(_('_Send')) btn.set_property('can-default', True) # FIXME: add send icon to this button (JUMP_TO) dialog.add_action_widget(btn, Gtk.ResponseType.OK) dialog.set_default_response(Gtk.ResponseType.OK) desc_hbox = Gtk.HBox(homogeneous=False, spacing=5) desc_hbox.pack_start(Gtk.Label.new(_('Description: ')), False, False, 0) desc_hbox.pack_start(win, True, True, 0) dialog.vbox.pack_start(desc_hbox, False, False, 0) btn.show() desc_hbox.show_all() def send_file(self, account, contact, file_path, file_desc=''): """ Start the real transfer(upload) of the file """ if gtkgui_helpers.file_is_locked(file_path): pritext = _('Gajim can not read this file') sextext = _('Another process is using this file.') dialogs.ErrorDialog(pritext, sextext) return if isinstance(contact, str): if contact.find('/') == -1: return (jid, resource) = contact.split('/', 1) contact = app.contacts.create_contact(jid=jid, account=account, resource=resource) file_name = os.path.split(file_path)[1] file_props = self.get_send_file_props(account, contact, file_path, file_name, file_desc) if file_props is None: return False if contact.supports(NS_JINGLE_FILE_TRANSFER_5): log.info("contact %s supports jingle file transfer"%(contact.get_full_jid())) app.connections[account].start_file_transfer(contact.get_full_jid(), file_props) self.add_transfer(account, contact, file_props) else: log.info("contact does not support jingle file transfer") file_props.transport_sid = file_props.sid app.connections[account].send_file_request(file_props) self.add_transfer(account, contact, file_props) return True def _start_receive(self, file_path, account, contact, file_props): file_dir = os.path.dirname(file_path) if file_dir: app.config.set('last_save_dir', file_dir) file_props.file_name = file_path file_props.type_ = 'r' self.add_transfer(account, contact, file_props) app.connections[account].send_file_approval(file_props) def on_file_request_accepted(self, account, contact, file_props): def on_ok(widget, account, contact, file_props): file_path = dialog2.get_filename() if os.path.exists(file_path): # check if we have write permissions if not os.access(file_path, os.W_OK): file_name = GLib.markup_escape_text(os.path.basename( file_path)) dialogs.ErrorDialog( _('Cannot overwrite existing file "%s"' % file_name), _('A file with this name already exists and you do not ' 'have permission to overwrite it.')) return stat = os.stat(file_path) dl_size = stat.st_size file_size = file_props.size dl_finished = dl_size >= file_size def on_response(response): if response < 0: return elif response == 100: file_props.offset = dl_size dialog2.destroy() self._start_receive(file_path, account, contact, file_props) dialog = dialogs.FTOverwriteConfirmationDialog( _('This file already exists'), _('What do you want to do?'), propose_resume=not dl_finished, on_response=on_response, transient_for=dialog2) dialog.set_destroy_with_parent(True) return else: dirname = os.path.dirname(file_path) if not os.access(dirname, os.W_OK) and os.name != 'nt': # read-only bit is used to mark special folder under # windows, not to mark that a folder is read-only. # See ticket #3587 dialogs.ErrorDialog(_('Directory "%s" is not writable') % \ dirname, _('You do not have permission to create files ' 'in this directory.')) return dialog2.destroy() self._start_receive(file_path, account, contact, file_props) def on_cancel(widget, account, contact, file_props): dialog2.destroy() app.connections[account].send_file_rejection(file_props) dialog2 = dialogs.FileChooserDialog( title_text=_('Save File as…'), action=Gtk.FileChooserAction.SAVE, buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_SAVE, Gtk.ResponseType.OK), default_response=Gtk.ResponseType.OK, current_folder=app.config.get('last_save_dir'), on_response_ok=(on_ok, account, contact, file_props), on_response_cancel=(on_cancel, account, contact, file_props)) dialog2.set_current_name(file_props.name) dialog2.connect('delete-event', lambda widget, event: on_cancel(widget, account, contact, file_props)) def show_file_request(self, account, contact, file_props): """ Show dialog asking for comfirmation and store location of new file requested by a contact """ if not file_props or not file_props.name: return sec_text = '\t' + _('File: %s') % GLib.markup_escape_text( file_props.name) if file_props.size: sec_text += '\n\t' + _('Size: %s') % \ helpers.convert_bytes(file_props.size) if file_props.mime_type: sec_text += '\n\t' + _('Type: %s') % file_props.mime_type if file_props.desc: sec_text += '\n\t' + _('Description: %s') % file_props.desc prim_text = _('%s wants to send you a file:') % contact.jid dialog = None def on_response_ok(account, contact, file_props): self.on_file_request_accepted(account, contact, file_props) def on_response_cancel(account, file_props): app.connections[account].send_file_rejection(file_props) dialog = dialogs.NonModalConfirmationDialog(prim_text, sec_text, on_response_ok=(on_response_ok, account, contact, file_props), on_response_cancel=(on_response_cancel, account, file_props)) dialog.connect('delete-event', lambda widget, event: on_response_cancel(account, file_props)) dialog.popup() def get_icon(self, ident): return self.images.setdefault(ident, gtkgui_helpers.get_icon_pixmap(self.icons[ident], 24)) def set_status(self,file_props, status): """ Change the status of a transfer to state 'status' """ iter_ = self.get_iter_by_sid(file_props.type_, file_props.sid) if iter_ is None: return self.model[iter_][Column.SID] if status == 'stop': file_props.stopped = True elif status == 'ok': file_props.completed = True text = self._format_percent(100) received_size = int(file_props.received_len) full_size = file_props.size text += helpers.convert_bytes(received_size) + '/' + \ helpers.convert_bytes(full_size) self.model.set(iter_, Column.PROGRESS, text) self.model.set(iter_, Column.PULSE, GLib.MAXINT32) elif status == 'computing': self.model.set(iter_, Column.PULSE, 1) text = _('Checking file…') + '\n' received_size = int(file_props.received_len) full_size = file_props.size text += helpers.convert_bytes(received_size) + '/' + \ helpers.convert_bytes(full_size) self.model.set(iter_, Column.PROGRESS, text) def pulse(): p = self.model.get(iter_, Column.PULSE)[0] if p == GLib.MAXINT32: return False self.model.set(iter_, Column.PULSE, p + 1) return True GLib.timeout_add(100, pulse) elif status == 'hash_error': text = _('File error') + '\n' received_size = int(file_props.received_len) full_size = file_props.size text += helpers.convert_bytes(received_size) + '/' + \ helpers.convert_bytes(full_size) self.model.set(iter_, Column.PROGRESS, text) self.model.set(iter_, Column.PULSE, GLib.MAXINT32) self.model.set(iter_, Column.IMAGE, self.get_icon(status)) path = self.model.get_path(iter_) self.select_func(path) def _format_percent(self, percent): """ Add extra spaces from both sides of the percent, so that progress string has always a fixed size """ _str = ' ' if percent != 100.: _str += ' ' if percent < 10: _str += ' ' _str += str(percent) + '% \n' return _str def _format_time(self, _time): times = { 'hours': 0, 'minutes': 0, 'seconds': 0 } _time = int(_time) times['seconds'] = _time % 60 if _time >= 60: _time /= 60 times['minutes'] = _time % 60 if _time >= 60: times['hours'] = _time / 60 #Print remaining time in format 00:00:00 #You can change the places of (hours), (minutes), (seconds) - #they are not translatable. return _('%(hours)02.d:%(minutes)02.d:%(seconds)02.d') % times def _get_eta_and_speed(self, full_size, transfered_size, file_props): if len(file_props.transfered_size) == 0: return 0., 0. elif len(file_props.transfered_size) == 1: speed = round(float(transfered_size) / file_props.elapsed_time) else: # first and last are (time, transfered_size) first = file_props.transfered_size[0] last = file_props.transfered_size[-1] transfered = last[1] - first[1] tim = last[0] - first[0] if tim == 0: return 0., 0. speed = round(float(transfered) / tim) if speed == 0.: return 0., 0. remaining_size = full_size - transfered_size eta = remaining_size / speed return eta, speed def _remove_transfer(self, iter_, sid, file_props): self.model.remove(iter_) if not file_props: return if file_props.tt_account: # file transfer is set account = file_props.tt_account if account in app.connections: # there is a connection to the account app.connections[account].remove_transfer(file_props) if file_props.type_ == 'r': # we receive a file other = file_props.sender else: # we send a file other = file_props.receiver if isinstance(other, str): jid = app.get_jid_without_resource(other) else: # It's a Contact instance jid = other.jid for ev_type in ('file-error', 'file-completed', 'file-request-error', 'file-send-error', 'file-stopped'): for event in app.events.get_events(account, jid, [ev_type]): if event.file_props.sid == file_props.sid: app.events.remove_events(account, jid, event) app.interface.roster.draw_contact(jid, account) app.interface.roster.show_title() FilesProp.deleteFileProp(file_props) del(file_props) def set_progress(self, typ, sid, transfered_size, iter_=None): """ Change the progress of a transfer with new transfered size """ file_props = FilesProp.getFilePropByType(typ, sid) full_size = file_props.size if full_size == 0: percent = 0 else: percent = round(float(transfered_size) / full_size * 100, 1) if iter_ is None: iter_ = self.get_iter_by_sid(typ, sid) if iter_ is not None: just_began = False if self.model[iter_][Column.PERCENT] == 0 and int(percent > 0): just_began = True text = self._format_percent(percent) if transfered_size == 0: text += '0' else: text += helpers.convert_bytes(transfered_size) text += '/' + helpers.convert_bytes(full_size) # Kb/s # remaining time if file_props.offset: transfered_size -= file_props.offset full_size -= file_props.offset if file_props.elapsed_time > 0: file_props.transfered_size.append((file_props.last_time, transfered_size)) if len(file_props.transfered_size) > 6: file_props.transfered_size.pop(0) eta, speed = self._get_eta_and_speed(full_size, transfered_size, file_props) self.model.set(iter_, Column.PROGRESS, text) self.model.set(iter_, Column.PERCENT, int(percent)) text = self._format_time(eta) text += '\n' #This should make the string Kb/s, #where 'Kb' part is taken from %s. #Only the 's' after / (which means second) should be translated. text += _('(%(filesize_unit)s/s)') % {'filesize_unit': helpers.convert_bytes(speed)} self.model.set(iter_, Column.TIME, text) # try to guess what should be the status image if file_props.type_ == 'r': status = 'download' else: status = 'upload' if file_props.paused == True: status = 'pause' elif file_props.stalled == True: status = 'waiting' if file_props.connected == False: status = 'stop' self.model.set(iter_, 0, self.get_icon(status)) if transfered_size == full_size: # If we are receiver and this is a jingle session if file_props.type_ == 'r' and \ file_props.session_type == 'jingle' and file_props.hash_: # Show that we are computing the hash self.set_status(file_props, 'computing') else: self.set_status(file_props, 'ok') elif just_began: path = self.model.get_path(iter_) self.select_func(path) def get_iter_by_sid(self, typ, sid): """ Return iter to the row, which holds file transfer, identified by the session id """ iter_ = self.model.get_iter_first() while iter_: if typ + sid == self.model[iter_][Column.SID]: return iter_ iter_ = self.model.iter_next(iter_) def __convert_date(self, epoch): # Converts date-time from seconds from epoch to iso 8601 dt = datetime.utcfromtimestamp(epoch) return dt.isoformat() + 'Z' def get_send_file_props(self, account, contact, file_path, file_name, file_desc=''): """ Create new file_props object and set initial file transfer properties in it """ if os.path.isfile(file_path): stat = os.stat(file_path) else: dialogs.ErrorDialog(_('Invalid File'), _('File: ') + file_path) return None if stat[6] == 0: dialogs.ErrorDialog(_('Invalid File'), _('It is not possible to send empty files')) return None file_props = FilesProp.getNewFileProp(account, sid=helpers.get_random_string_16()) mod_date = os.path.getmtime(file_path) file_props.file_name = file_path file_props.name = file_name file_props.date = self.__convert_date(mod_date) file_props.type_ = 's' file_props.desc = file_desc file_props.elapsed_time = 0 file_props.size = stat[6] file_props.sender = account file_props.receiver = contact file_props.tt_account = account return file_props def add_transfer(self, account, contact, file_props): """ Add new transfer to FT window and show the FT window """ if file_props is None: return file_props.elapsed_time = 0 iter_ = self.model.prepend() text_labels = '' + _('Name: ') + '\n' if file_props.type_ == 'r': text_labels += '' + _('Sender: ') + '' else: text_labels += '' + _('Recipient: ') + '' if file_props.type_ == 'r': file_name = os.path.split(file_props.file_name)[1] else: file_name = file_props.name text_props = GLib.markup_escape_text(file_name) + '\n' text_props += contact.get_shown_name() self.model.set(iter_, 1, text_labels, 2, text_props, Column.PULSE, -1, Column.SID, file_props.type_ + file_props.sid) self.set_progress(file_props.type_, file_props.sid, 0, iter_) if file_props.started is False: status = 'waiting' elif file_props.type_ == 'r': status = 'download' else: status = 'upload' file_props.tt_account = account self.set_status(file_props, status) self.set_cleanup_sensitivity() self.window.show_all() def on_transfers_list_row_activated(self, widget, path, col): # try to open the containing folder self.on_open_folder_menuitem_activate(widget) def set_cleanup_sensitivity(self): """ Check if there are transfer rows and set cleanup_button sensitive, or insensitive if model is empty """ if len(self.model) == 0: self.cleanup_button.set_sensitive(False) else: self.cleanup_button.set_sensitive(True) def set_all_insensitive(self): """ Make all buttons/menuitems insensitive """ self.pause_button.set_sensitive(False) self.pause_menuitem.set_sensitive(False) self.continue_menuitem.set_sensitive(False) self.remove_menuitem.set_sensitive(False) self.cancel_button.set_sensitive(False) self.cancel_menuitem.set_sensitive(False) self.open_folder_menuitem.set_sensitive(False) self.set_cleanup_sensitivity() def set_buttons_sensitive(self, path, is_row_selected): """ Make buttons/menuitems sensitive as appropriate to the state of file transfer located at path 'path' """ if path is None: self.set_all_insensitive() return current_iter = self.model.get_iter(path) sid = self.model[current_iter][Column.SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) self.remove_menuitem.set_sensitive(is_row_selected) self.open_folder_menuitem.set_sensitive(is_row_selected) is_stopped = False if is_transfer_stopped(file_props): is_stopped = True self.cancel_button.set_sensitive(not is_stopped) self.cancel_menuitem.set_sensitive(not is_stopped) if not is_row_selected: # no selection, disable the buttons self.set_all_insensitive() elif not is_stopped and file_props.continue_cb: if is_transfer_active(file_props): # file transfer is active self.toggle_pause_continue(True) self.pause_button.set_sensitive(True) elif is_transfer_paused(file_props): # file transfer is paused self.toggle_pause_continue(False) self.pause_button.set_sensitive(True) else: self.pause_button.set_sensitive(False) self.pause_menuitem.set_sensitive(False) self.continue_menuitem.set_sensitive(False) else: self.pause_button.set_sensitive(False) self.pause_menuitem.set_sensitive(False) self.continue_menuitem.set_sensitive(False) return True def selection_changed(self, args): """ Selection has changed - change the sensitivity of the buttons/menuitems """ selection = args selected = selection.get_selected_rows() if selected[1] != []: selected_path = selected[1][0] self.select_func(selected_path) else: self.set_all_insensitive() def select_func(self, path): is_selected = False selected = self.tree.get_selection().get_selected_rows() if selected[1] != []: selected_path = selected[1][0] if selected_path == path: is_selected = True self.set_buttons_sensitive(path, is_selected) self.set_cleanup_sensitivity() return True def on_cleanup_button_clicked(self, widget): i = len(self.model) - 1 while i >= 0: iter_ = self.model.get_iter((i)) sid = self.model[iter_][Column.SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) if is_transfer_stopped(file_props): self._remove_transfer(iter_, sid, file_props) i -= 1 self.tree.get_selection().unselect_all() self.set_all_insensitive() def toggle_pause_continue(self, status): if status: label = _('Pause') self.pause_button.set_label(label) self.pause_button.set_image(Gtk.Image.new_from_icon_name( "media-playback-pause", Gtk.IconSize.MENU)) self.pause_menuitem.set_sensitive(True) self.pause_menuitem.set_no_show_all(False) self.continue_menuitem.hide() self.continue_menuitem.set_no_show_all(True) else: label = _('_Continue') self.pause_button.set_label(label) self.pause_button.set_image(Gtk.Image.new_from_icon_name( "media-playback-start", Gtk.IconSize.MENU)) self.pause_menuitem.hide() self.pause_menuitem.set_no_show_all(True) self.continue_menuitem.set_sensitive(True) self.continue_menuitem.set_no_show_all(False) def on_pause_restore_button_clicked(self, widget): selected = self.tree.get_selection().get_selected() if selected is None or selected[1] is None: return s_iter = selected[1] sid = self.model[s_iter][Column.SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) if is_transfer_paused(file_props): file_props.last_time = time.time() file_props.paused = False types = {'r' : 'download', 's' : 'upload'} self.set_status(file_props, types[sid[0]]) self.toggle_pause_continue(True) if file_props.continue_cb: file_props.continue_cb() elif is_transfer_active(file_props): file_props.paused = True self.set_status(file_props, 'pause') # reset that to compute speed only when we resume file_props.transfered_size = [] self.toggle_pause_continue(False) def on_cancel_button_clicked(self, widget): selected = self.tree.get_selection().get_selected() if selected is None or selected[1] is None: return s_iter = selected[1] sid = self.model[s_iter][Column.SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) account = file_props.tt_account if account not in app.connections: return con = app.connections[account] # Check if we are in a IBB transfer if file_props.direction: con.CloseIBBStream(file_props) con.disconnect_transfer(file_props) self.set_status(file_props, 'stop') def on_notify_ft_complete_checkbox_toggled(self, widget): app.config.set('notify_on_file_complete', widget.get_active()) def on_file_transfers_dialog_delete_event(self, widget, event): self.window.hide() return True # do NOT destory window def on_close_button_clicked(self, widget): self.window.hide() def show_context_menu(self, event, iter_): # change the sensitive propery of the buttons and menuitems if iter_: path = self.model.get_path(iter_) self.set_buttons_sensitive(path, True) event_button = gtkgui_helpers.get_possible_button_event(event) self.file_transfers_menu.show_all() self.file_transfers_menu.popup(None, self.tree, None, None, event_button, event.time) def on_transfers_list_key_press_event(self, widget, event): """ When a key is pressed in the treeviews """ iter_ = None try: iter_ = self.tree.get_selection().get_selected()[1] except TypeError: self.tree.get_selection().unselect_all() if iter_ is not None: path = self.model.get_path(iter_) self.tree.get_selection().select_path(path) if event.keyval == Gdk.KEY_Menu: self.show_context_menu(event, iter_) return True def on_transfers_list_button_release_event(self, widget, event): # hide tooltip, no matter the button is pressed path = None try: path = self.tree.get_path_at_pos(int(event.x), int(event.y))[0] except TypeError: self.tree.get_selection().unselect_all() if path is None: self.set_all_insensitive() else: self.select_func(path) def on_transfers_list_button_press_event(self, widget, event): # hide tooltip, no matter the button is pressed path, iter_ = None, None try: path = self.tree.get_path_at_pos(int(event.x), int(event.y))[0] except TypeError: self.tree.get_selection().unselect_all() if event.button == 3: # Right click if path: self.tree.get_selection().select_path(path) iter_ = self.model.get_iter(path) self.show_context_menu(event, iter_) if path: return True def on_open_folder_menuitem_activate(self, widget): selected = self.tree.get_selection().get_selected() if not selected or not selected[1]: return s_iter = selected[1] sid = self.model[s_iter][Column.SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) if not file_props.file_name: return path = os.path.split(file_props.file_name)[0] if os.path.exists(path) and os.path.isdir(path): helpers.launch_file_manager(path) def on_cancel_menuitem_activate(self, widget): self.on_cancel_button_clicked(widget) def on_continue_menuitem_activate(self, widget): self.on_pause_restore_button_clicked(widget) def on_pause_menuitem_activate(self, widget): self.on_pause_restore_button_clicked(widget) def on_remove_menuitem_activate(self, widget): selected = self.tree.get_selection().get_selected() if not selected or not selected[1]: return s_iter = selected[1] sid = self.model[s_iter][Column.SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) self._remove_transfer(s_iter, sid, file_props) self.set_all_insensitive() def on_file_transfers_window_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: # ESCAPE self.window.hide() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/gajim.py000066400000000000000000000507331326020644600234430ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/gajim.py ## ## Copyright (C) 2003-2017 Yann Leboulanger ## Copyright (C) 2004-2005 Vincent Hanquez ## Copyright (C) 2005 Alex Podaras ## Norman Rasmussen ## Stéphan Kochen ## Copyright (C) 2005-2006 Dimitur Kirov ## Alex Mauer ## Copyright (C) 2005-2007 Travis Shirk ## Nikos Kouremenos ## Copyright (C) 2006 Junglecow J ## Stefan Bethge ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2007 Lukas Petrovicky ## James Newton ## Copyright (C) 2007-2008 Brendan Taylor ## Julien Pivotto ## Stephan Erb ## Copyright (C) 2008 Jonathan Schleifer ## Copyright (C) 2016-2017 Emmanuel Gil Peyrot ## Philipp Hörist ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import sys import os import signal import locale from urllib.parse import unquote import gi gi.require_version('GLib', '2.0') gi.require_version('Gio', '2.0') gi.require_version('Gtk', '3.0') gi.require_version('Gdk', '3.0') gi.require_version('GObject', '2.0') gi.require_version('Pango', '1.0') from gi.repository import GLib, Gio, Gtk from gajim.common import i18n from gajim.common import logging_helpers from gajim.common import crypto MIN_NBXMPP_VER = "0.6.4" MIN_GTK_VER = "3.22.0" class GajimApplication(Gtk.Application): '''Main class handling activation and command line.''' def __init__(self): Gtk.Application.__init__(self, application_id='org.gajim.Gajim', flags=( Gio.ApplicationFlags.HANDLES_COMMAND_LINE | Gio.ApplicationFlags.HANDLES_OPEN)) self.add_main_option('version', ord('V'), GLib.OptionFlags.NONE, GLib.OptionArg.NONE, _('Show the application\'s version')) self.add_main_option('quiet', ord('q'), GLib.OptionFlags.NONE, GLib.OptionArg.NONE, _('Show only critical errors')) self.add_main_option('separate', ord('s'), GLib.OptionFlags.NONE, GLib.OptionArg.NONE, _('Separate profile files completely (even ' 'history db and plugins)')) self.add_main_option('verbose', ord('v'), GLib.OptionFlags.NONE, GLib.OptionArg.NONE, _('Print XML stanzas and other debug ' 'information')) self.add_main_option('profile', ord('p'), GLib.OptionFlags.NONE, GLib.OptionArg.STRING, _('Use defined profile in configuration ' 'directory'), 'NAME') self.add_main_option('config-path', ord('c'), GLib.OptionFlags.NONE, GLib.OptionArg.STRING, _('Set configuration directory'), 'PATH') self.add_main_option('loglevel', ord('l'), GLib.OptionFlags.NONE, GLib.OptionArg.STRING, _('Configure logging system'), 'LEVEL') self.add_main_option('warnings', ord('w'), GLib.OptionFlags.NONE, GLib.OptionArg.NONE, _('Show all warnings')) self.add_main_option('ipython', ord('i'), GLib.OptionFlags.NONE, GLib.OptionArg.NONE, _('Open IPython shell')) self.add_main_option('show-next-pending-event', 0, GLib.OptionFlags.NONE, GLib.OptionArg.NONE, _('Pops up a window with the next pending event')) self.add_main_option('start-chat', 0, GLib.OptionFlags.NONE, GLib.OptionArg.NONE, _('Start a new chat')) self.add_main_option_entries(self._get_remaining_entry()) self.connect('handle-local-options', self._handle_local_options) self.connect('command-line', self._handle_remote_options) self.connect('startup', self._startup) self.connect('activate', self._activate) self.profile = '' self.config_path = None self.profile_separation = False self.interface = None GLib.set_prgname('gajim') if GLib.get_application_name() != 'Gajim': GLib.set_application_name('Gajim') @staticmethod def _get_remaining_entry(): option = GLib.OptionEntry() option.arg = GLib.OptionArg.STRING_ARRAY option.arg_data = None option.arg_description = ('[URI …]') option.flags = GLib.OptionFlags.NONE option.long_name = GLib.OPTION_REMAINING option.short_name = 0 return [option] def _startup(self, application): from gajim import gtkexcepthook gtkexcepthook.init() try: import nbxmpp except ImportError: print('Gajim needs python-nbxmpp to run. Quitting…') sys.exit(1) from distutils.version import LooseVersion as V if V(nbxmpp.__version__) < V(MIN_NBXMPP_VER): print('Gajim needs python-nbxmpp >= %s to run. ' 'Quitting...' % MIN_NBXMPP_VER) sys.exit(1) gtk_ver = '%s.%s.%s' % (Gtk.get_major_version(), Gtk.get_minor_version(), Gtk.get_micro_version()) if V(gtk_ver) < V(MIN_GTK_VER): print('Gajim needs GTK+ >= %s to run. ' 'Quitting...' % MIN_GTK_VER) sys.exit(1) # Create and initialize Application Paths & Databases from gajim.common import configpaths configpaths.gajimpaths.init( self.config_path, self.profile, self.profile_separation) from gajim.common import app from gajim.common import check_paths from gajim.common import exceptions from gajim.common import logger from gajim.common import caps_cache try: app.logger = logger.Logger() caps_cache.initialize(app.logger) check_paths.check_and_possibly_create_paths() except exceptions.DatabaseMalformed as error: dlg = Gtk.MessageDialog( None, Gtk.DialogFlags.DESTROY_WITH_PARENT | Gtk.DialogFlags.MODAL, Gtk.MessageType.ERROR, Gtk.ButtonsType.OK, _('Database Error')) dlg.format_secondary_text(str(error)) dlg.run() dlg.destroy() sys.exit() if os.name == 'nt': import gettext # needed for docutils sys.path.append('.') APP = 'gajim' DIR = '../po' lang = locale.getdefaultlocale()[0] os.environ['LANG'] = lang gettext.bindtextdomain(APP, DIR) gettext.textdomain(APP) gettext.install(APP, DIR) # This is for Windows translation which is currently not # working on GTK 3.18.9 # locale.setlocale(locale.LC_ALL, '') # import ctypes # import ctypes.util # libintl_path = ctypes.util.find_library('intl') # if libintl_path == None: # local_intl = os.path.join('gtk', 'bin', 'intl.dll') # if os.path.exists(local_intl): # libintl_path = local_intl # if libintl_path == None: # raise ImportError('intl.dll library not found') # libintl = ctypes.cdll.LoadLibrary(libintl_path) # libintl.bindtextdomain(APP, DIR) # libintl.bind_textdomain_codeset(APP, 'UTF-8') # plugins_locale_dir = os.path.join(common.configpaths.gajimpaths[ # 'PLUGINS_USER'], 'locale').encode(locale.getpreferredencoding()) # libintl.bindtextdomain('gajim_plugins', plugins_locale_dir) # libintl.bind_textdomain_codeset('gajim_plugins', 'UTF-8') if Gtk.Widget.get_default_direction() == Gtk.TextDirection.RTL: i18n.direction_mark = '\u200F' from ctypes import CDLL, byref, create_string_buffer from ctypes.util import find_library import platform sysname = platform.system() if sysname in ('Linux', 'FreeBSD', 'OpenBSD', 'NetBSD'): libc = CDLL(find_library('c')) # The constant defined in which is used to set the name # of the process. PR_SET_NAME = 15 if sysname == 'Linux': proc_name = b'gajim' buff = create_string_buffer(len(proc_name)+1) buff.value = proc_name libc.prctl(PR_SET_NAME, byref(buff), 0, 0, 0) elif sysname in ('FreeBSD', 'OpenBSD', 'NetBSD'): libc.setproctitle('gajim') def sigint_cb(num, stack): print('SIGINT/SIGTERM received') self.quit() # ^C exits the application normally signal.signal(signal.SIGINT, sigint_cb) signal.signal(signal.SIGTERM, sigint_cb) # Set Application Menu app.app = self path = os.path.join(configpaths.get('GUI'), 'application_menu.ui') builder = Gtk.Builder() builder.set_translation_domain(i18n.APP) builder.add_from_file(path) menubar = builder.get_object("menubar") appmenu = builder.get_object("appmenu") if app.prefers_app_menu(): self.set_app_menu(appmenu) else: # Add it to the menubar instead menubar.prepend_submenu('Gajim', appmenu) self.set_menubar(menubar) def _activate(self, application): if self.interface is not None: self.interface.roster.window.present() return from gajim.gui_interface import Interface from gajim import gtkgui_helpers self.interface = Interface() gtkgui_helpers.load_css() self.interface.run(self) self.add_actions() from gajim import gui_menu_builder gui_menu_builder.build_accounts_menu() def _open_uris(self, uris): from gajim.common import app for uri in uris: app.log('uri_handler').info('open %s', uri) if not uri.startswith('xmpp:'): continue # remove xmpp: uri = uri[5:] try: jid, cmd = uri.split('?') except ValueError: # No query argument jid, cmd = uri, 'message' if cmd == 'join': self.interface.join_gc_minimal(None, jid) elif cmd == 'roster': self.activate_action('add-contact', GLib.Variant('s', jid)) elif cmd.startswith('message'): attributes = cmd.split(';') message = None for key in attributes: if key.startswith('body'): try: message = unquote(key.split('=')[1]) except Exception: app.log('uri_handler').error('Invalid URI: %s', cmd) accounts = list(app.connections.keys()) if not accounts: continue if len(accounts) == 1: app.interface.new_chat_from_jid(accounts[0], jid, message) else: self.activate_action('start-chat') start_chat_window = app.interface.instances['start_chat'] start_chat_window.search_entry.set_text(jid) def do_shutdown(self, *args): Gtk.Application.do_shutdown(self) # Shutdown GUI and save config if hasattr(self.interface, 'roster') and self.interface.roster: self.interface.roster.prepare_quit() # Commit any outstanding SQL transactions from gajim.common import app app.logger.commit() def _handle_remote_options(self, application, command_line): # Parse all options that should be executed on a remote instance options = command_line.get_options_dict() remote_commands = ['ipython', 'show-next-pending-event', 'start-chat', ] remaining = options.lookup_value(GLib.OPTION_REMAINING, GLib.VariantType.new('as')) for cmd in remote_commands: if options.contains(cmd): self.activate_action(cmd) return 0 if remaining is not None: self._open_uris(remaining.unpack()) return 0 self.activate() return 0 def _handle_local_options(self, application, options: GLib.VariantDict) -> int: # Parse all options that have to be executed before ::startup logging_helpers.init() if options.contains('profile'): # Incorporate profile name into application id # to have a single app instance for each profile. profile = options.lookup_value('profile').get_string() app_id = '%s.%s' % (self.get_application_id(), profile) self.set_application_id(app_id) self.profile = profile if options.contains('separate'): self.profile_separation = True if options.contains('config-path'): self.config_path = options.lookup_value('config-path').get_string() if options.contains('version'): from gajim import __version__ print(__version__) return 0 if options.contains('quiet'): logging_helpers.set_quiet() if options.contains('verbose'): logging_helpers.set_verbose() if options.contains('loglevel'): loglevel = options.lookup_value('loglevel').get_string() logging_helpers.set_loglevels(loglevel) if options.contains('warnings'): self.show_warnings() return -1 def show_warnings(self): import traceback import warnings def warn_with_traceback(message, category, filename, lineno, file=None, line=None): traceback.print_stack(file=sys.stderr) sys.stderr.write(warnings.formatwarning(message, category, filename, lineno, line)) warnings.showwarning = warn_with_traceback warnings.filterwarnings(action="always") def add_actions(self): ''' Build Application Actions ''' from gajim.app_actions import AppActions from gajim.common import app action = AppActions(self) self.account_actions = [ ('-start-single-chat', action.on_single_message, 'online', 's'), ('-join-groupchat', action.on_join_gc, 'online', 's'), ('-add-contact', action.on_add_contact, 'online', 's'), ('-services', action.on_service_disco, 'online', 's'), ('-profile', action.on_profile, 'feature', 's'), ('-xml-console', action.on_xml_console, 'always', 's'), ('-server-info', action.on_server_info, 'online', 's'), ('-archive', action.on_archiving_preferences, 'feature', 's'), ('-sync-history', action.on_history_sync, 'online', 's'), ('-privacylists', action.on_privacy_lists, 'feature', 's'), ('-send-server-message', action.on_send_server_message, 'online', 's'), ('-set-motd', action.on_set_motd, 'online', 's'), ('-update-motd', action.on_update_motd, 'online', 's'), ('-delete-motd', action.on_delete_motd, 'online', 's'), ('-activate-bookmark', action.on_activate_bookmark, 'online', 'a{sv}'), ('-open-event', action.on_open_event, 'always', 'a{sv}'), ('-import-contacts', action.on_import_contacts, 'online', 's'), ] # General Stateful Actions act = Gio.SimpleAction.new_stateful( 'merge', None, GLib.Variant.new_boolean(app.config.get('mergeaccounts'))) act.connect('change-state', action.on_merge_accounts) self.add_action(act) act = Gio.SimpleAction.new_stateful( 'agent', None, GLib.Variant.new_boolean(app.config.get('use_gpg_agent'))) self.add_action(act) # General Actions self.general_actions = [ ('quit', action.on_quit), ('accounts', action.on_accounts), ('add-account', action.on_add_account), ('manage-proxies', action.on_manage_proxies), ('start-chat', action.on_new_chat), ('bookmarks', action.on_manage_bookmarks), ('history-manager', action.on_history_manager), ('preferences', action.on_preferences), ('plugins', action.on_plugins), ('file-transfer', action.on_file_transfers), ('history', action.on_history), ('shortcuts', action.on_keyboard_shortcuts), ('features', action.on_features), ('content', action.on_contents), ('about', action.on_about), ('faq', action.on_faq), ('ipython', action.toggle_ipython), ('show-next-pending-event', action.show_next_pending_event), ] act = Gio.SimpleAction.new('add-contact', GLib.VariantType.new('s')) act.connect("activate", action.on_add_contact_jid) self.add_action(act) for action in self.general_actions: action_name, func = action act = Gio.SimpleAction.new(action_name, None) act.connect("activate", func) self.add_action(act) accounts_list = sorted(app.config.get_per('accounts')) if not accounts_list: return if len(accounts_list) > 1: for acc in accounts_list: self.add_account_actions(acc) else: self.add_account_actions(accounts_list[0]) def add_account_actions(self, account): for action in self.account_actions: action_name, func, state, type_ = action action_name = account + action_name if self.lookup_action(action_name): # We already added this action continue act = Gio.SimpleAction.new( action_name, GLib.VariantType.new(type_)) act.connect("activate", func) if state != 'always': act.set_enabled(False) self.add_action(act) def remove_account_actions(self, account): for action in self.account_actions: action_name = account + action[0] self.remove_action(action_name) def set_account_actions_state(self, account, new_state=False): for action in self.account_actions: action_name, _, state, _ = action if not new_state and state in ('online', 'feature'): # We go offline self.lookup_action(account + action_name).set_enabled(False) elif new_state and state == 'online': # We go online self.lookup_action(account + action_name).set_enabled(True) def main(): if sys.platform != 'win32': if os.geteuid() == 0: sys.exit("You must not launch gajim as root, it is insecure.") appli = GajimApplication() appli.run(sys.argv) if __name__ == '__main__': main() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/gajim_remote.py000066400000000000000000000514001326020644600250060ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding:utf-8 -*- ## src/gajim-remote.py ## ## Copyright (C) 2005-2006 Dimitur Kirov ## Nikos Kouremenos ## Copyright (C) 2005-2014 Yann Leboulanger ## Copyright (C) 2006 Junglecow ## Travis Shirk ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2007 Julien Pivotto ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## # gajim-remote help will show you the D-BUS API of Gajim import os import sys import locale import urllib import signal signal.signal(signal.SIGINT, signal.SIG_DFL) # ^C exits the application from gajim.common import exceptions from gajim.common import i18n # This installs _() function from gajim.common.i18n import Q_ try: PREFERRED_ENCODING = locale.getpreferredencoding() except Exception: PREFERRED_ENCODING = 'UTF-8' def send_error(error_message): '''Writes error message to stderr and exits''' print(error_message, file=sys.stderr) sys.exit(1) try: import dbus import dbus.service # import dbus.glib # test if dbus-x11 is installed bus = dbus.SessionBus() except Exception: print(_('D-Bus is not present on this machine or python module is missing')) sys.exit(1) OBJ_PATH = '/org/gajim/dbus/RemoteObject' INTERFACE = 'org.gajim.dbus.RemoteInterface' SERVICE = 'org.gajim.dbus' BASENAME = 'gajim-remote' class GajimRemote: def __init__(self): self.argv_len = len(sys.argv) # define commands dict. Prototype : # { # 'command': [comment, [list of arguments] ] # } # # each argument is defined as a tuple: # (argument name, help on argument, is mandatory) # self.commands = { 'help': [ _('Shows a help on specific command'), [ #User gets help for the command, specified by this parameter (_('command'), _('show help on command'), False) ] ], 'list_contacts': [ _('Lists all contacts in roster, one for each line'), [ (Q_('?CLI:account'), _('show only contacts of the given account'), False) ] ], 'list_accounts': [ _('Prints a list of registered accounts'), [] ], 'change_status': [ _('Changes the status of account(s)'), [ #offline, online, chat, away, xa, dnd, invisible should not be translated (Q_('?CLI:status'), _('one of: offline, online, chat, away, xa, dnd, invisible. If not set, use account\'s previous status'), False), (Q_('?CLI:message'), _('status message'), False), (Q_('?CLI:account'), _('change status of account "account". ' 'If not specified, try to change status of all accounts that have ' '"sync with global status" option set'), False) ] ], 'set_priority': [ _('Changes the priority of account(s)'), [ (Q_('?CLI:priority'), _('priority you want to give to the account'), True), (Q_('?CLI:account'), _('change the priority of the given account. ' 'If not specified, change status of all accounts that have' ' "sync with global status" option set'), False) ] ], 'send_chat_message': [ _('Sends new chat message to a contact in the roster. Both OpenPGP key ' 'and account are optional. If you want to set only \'account\', ' 'without \'OpenPGP key\', just set \'OpenPGP key\' to \'\'.'), [ ('jid', _('JID of the contact that will receive the message'), True), (Q_('?CLI:message'), _('message contents'), True), (_('PGP key'), _('if specified, the message will be encrypted ' 'using this public key'), False), (Q_('?CLI:account'), _('if specified, the message will be sent ' 'using this account'), False), ] ], 'send_single_message': [ _('Sends a chat message to someone on your roster. ' 'Optionally with OpenPGP key and account. If you want ' 'to only set the latter, set OpenPGP key to "".'), [ ('jid', _('JID of the contact that will receive the message'), True), (_('subject'), _('message subject'), True), (Q_('?CLI:message'), _('message contents'), True), (_('PGP key'), _('if specified, the message will be encrypted ' 'using this public key'), False), (Q_('?CLI:account'), _('if specified, the message will be sent ' 'using this account'), False), ] ], 'send_groupchat_message': [ _('Sends new message to a groupchat you\'ve joined.'), [ ('room_jid', _('JID of the room that will receive the message'), True), (Q_('?CLI:message'), _('message contents'), True), (Q_('?CLI:account'), _('if specified, the message will be sent ' 'using this account'), False), ] ], 'contact_info': [ _('Gets detailed info on a contact'), [ ('jid', _('JID of the contact'), True) ] ], 'account_info': [ _('Gets detailed info on a account'), [ ('account', _('Name of the account'), True) ] ], 'send_file': [ _('Sends file to a contact'), [ (_('file'), _('File path'), True), ('jid', _('JID of the contact'), True), (Q_('?CLI:account'), _('if specified, file will be sent using this ' 'account'), False) ] ], 'prefs_list': [ _('Lists all preferences and their values'), [ ] ], 'prefs_put': [ _('Sets value of \'key\' to \'value\'.'), [ (_('key=value'), _('\'key\' is the name of the preference, ' '\'value\' is what to set it to'), True) ] ], 'prefs_del': [ _('Deletes a preference item'), [ (_('key'), _('name of the preference to be deleted'), True) ] ], 'prefs_store': [ _('Writes the current state of Gajim preferences to the .config ' 'file'), [ ] ], 'remove_contact': [ _('Removes contact from roster'), [ ('jid', _('JID of the contact'), True), (Q_('?CLI:account'), _('if specified, contact is taken from the ' 'contact list of this account'), False) ] ], 'get_status': [ _('Returns current status (the global one unless account is specified)'), [ (Q_('?CLI:account'), '', False) ] ], 'get_status_message': [ _('Returns current status message (the global one unless account is specified)'), [ (Q_('?CLI:account'), '', False) ] ], 'get_unread_msgs_number': [ _('Returns number of unread messages'), [ ] ], 'send_xml': [ _('Sends custom XML'), [ ('xml', _('XML to send'), True), ('account', _('Account to which the XML will be sent; ' 'if not specified, XML will be sent to all accounts'), False) ] ], 'change_avatar': [ _('Change the avatar'), [ ('picture', _('Picture to use'), True), ('account', _('Account in which the avatar will be set; ' 'if not specified, the avatar will be set for all accounts'), False) ] ], 'check_gajim_running': [ _('Check if Gajim is running'), [] ], } self.sbus = None if self.argv_len < 2 or sys.argv[1] not in self.commands.keys(): # no args or bad args send_error(self.compose_help()) self.command = sys.argv[1] if self.command == 'help': if self.argv_len == 3: print(self.help_on_command(sys.argv[2]).encode( PREFERRED_ENCODING)) else: print(self.compose_help().encode(PREFERRED_ENCODING)) sys.exit(0) if self.command == 'check_gajim_running': print(self.check_gajim_running()) sys.exit(0) self.init_connection() self.check_arguments() if self.command == 'contact_info': if self.argv_len < 3: send_error(_('Missing argument "contact_jid"')) try: res = self.call_remote_method() except exceptions.ServiceNotAvailable: # At this point an error message has already been displayed sys.exit(1) else: self.print_result(res) def print_result(self, res): """ Print retrieved result to the output """ if res is not None: if self.command in ('send_chat_message', 'send_single_message'): self.argv_len -= 2 if res is False: if self.argv_len < 4: send_error(_('\'%s\' is not in your roster.\n' 'Please specify account for sending the message.') % sys.argv[2]) else: send_error(_('You have no active account')) elif self.command == 'list_accounts': if isinstance(res, list): for account in res: print(account) elif self.command == 'account_info': if res: print(self.print_info(0, res, True)) elif self.command == 'list_contacts': for account_dict in res: print(self.print_info(0, account_dict, True)) elif self.command == 'prefs_list': pref_keys = sorted(res.keys()) for pref_key in pref_keys: result = '%s = %s' % (pref_key, res[pref_key]) print(result) elif self.command == 'contact_info': print(self.print_info(0, res, True)) elif res: print(res) def check_gajim_running(self): if not self.sbus: try: self.sbus = dbus.SessionBus() except Exception: raise exceptions.SessionBusNotPresent test = False if hasattr(self.sbus, 'name_has_owner'): if self.sbus.name_has_owner(SERVICE): test = True elif dbus.dbus_bindings.bus_name_has_owner(self.sbus.get_connection(), SERVICE): test = True return test def init_connection(self): """ Create the onnection to the session dbus, or exit if it is not possible """ try: self.sbus = dbus.SessionBus() except Exception: raise exceptions.SessionBusNotPresent if not self.check_gajim_running(): #Do not translate "gajim-remote" send_error(_('It seems Gajim is not running. So you can\'t use gajim-remote.')) obj = self.sbus.get_object(SERVICE, OBJ_PATH) interface = dbus.Interface(obj, INTERFACE) # get the function asked self.method = interface.__getattr__(self.command) def make_arguments_row(self, args): """ Return arguments list. Mandatory arguments are enclosed with: '<', '>', optional arguments - with '[', ']' """ s = '' for arg in args: if arg[2]: s += ' <' + arg[0] + '>' else: s += ' [' + arg[0] + ']' return s def help_on_command(self, command): """ Return help message for a given command """ if command in self.commands: command_props = self.commands[command] arguments_str = self.make_arguments_row(command_props[1]) str_ = _('Usage: %(basename)s %(command)s %(arguments)s \n\t %(help)s')\ % {'basename': BASENAME, 'command': command, 'arguments': arguments_str, 'help': command_props[0]} if len(command_props[1]) > 0: str_ += '\n\n' + _('Arguments:') + '\n' for argument in command_props[1]: str_ += ' ' + argument[0] + ' - ' + argument[1] + '\n' return str_ send_error(_('%s not found') % command) def compose_help(self): """ Print usage, and list available commands """ s = _('Usage:\n %s command [arguments]\n\nCommand is one of:\n' ) % ( BASENAME) for command in sorted(self.commands): s += ' ' + command for arg in self.commands[command][1]: if arg[2]: s += ' <' + arg[0] + '>' else: s += ' [' + arg[0] + ']' s += '\n' return s def print_info(self, level, prop_dict, encode_return = False): """ Return formated string from data structure """ if prop_dict is None or not isinstance(prop_dict, (dict, list, tuple)): return '' ret_str = '' if isinstance(prop_dict, (list, tuple)): ret_str = '' spacing = ' ' * level * 4 for val in prop_dict: if val is None: ret_str +='\t' elif isinstance(val, int): ret_str +='\t' + str(val) elif isinstance(val, str): ret_str +='\t' + val elif isinstance(val, (list, tuple)): res = '' for items in val: res += self.print_info(level+1, items) if res != '': ret_str += '\t' + res elif isinstance(val, dict): ret_str += self.print_info(level+1, val) ret_str = '%s(%s)\n' % (spacing, ret_str[1:]) elif isinstance(prop_dict, dict): for key in prop_dict.keys(): val = prop_dict[key] spacing = ' ' * level * 4 if isinstance(val, (int, str)): if val is not None: val = val.strip() ret_str += '%s%-10s: %s\n' % (spacing, key, val) elif isinstance(val, (list, tuple)): res = '' for items in val: res += self.print_info(level+1, items) if res != '': ret_str += '%s%s: \n%s' % (spacing, key, res) elif isinstance(val, dict): res = self.print_info(level+1, val) if res != '': ret_str += '%s%s: \n%s' % (spacing, key, res) if (encode_return): try: ret_str = ret_str.encode(PREFERRED_ENCODING) except Exception: pass return ret_str def check_arguments(self): """ Make check if all necessary arguments are given """ argv_len = self.argv_len - 2 args = self.commands[self.command][1] if len(args) < argv_len: send_error(_('Too many arguments. \n' 'Type "%(basename)s help %(command)s" for more info') % { 'basename': BASENAME, 'command': self.command}) if len(args) > argv_len: if args[argv_len][2]: send_error(_('Argument "%(arg)s" is not specified. \n' 'Type "%(basename)s help %(command)s" for more info') % {'arg': args[argv_len][0], 'basename': BASENAME, 'command': self.command}) self.arguments = [] i = 0 for arg in sys.argv[2:]: i += 1 if i < len(args): self.arguments.append(arg) else: # it's latest argument with spaces self.arguments.append(' '.join(sys.argv[i+1:])) break # add empty string for missing args self.arguments += ['']*(len(args)-i) def call_remote_method(self): """ Calls self.method with arguments from sys.argv[2:] """ args = [dbus.String(i) for i in self.arguments] try: res = self.method(*args) return res except Exception: raise exceptions.ServiceNotAvailable return None def main(): if os.geteuid() == 0: sys.exit("You must not launch gajim as root, it is insecure.") GajimRemote() if __name__ == '__main__': main() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/gajim_themes_window.py000066400000000000000000000402531326020644600263730ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/gajim_themes_window.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2005-2006 Dimitur Kirov ## Nikos Kouremenos ## Copyright (C) 2006 Jean-Marie Traissard ## Copyright (C) 2007 Stephan Erb ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gi.repository import Gtk from gi.repository import Gdk from gi.repository import Pango from gajim import dialogs from gajim import gtkgui_helpers from gajim.common import app class GajimThemesWindow: def __init__(self): self.xml = gtkgui_helpers.get_gtk_builder('gajim_themes_window.ui') self.window = self.xml.get_object('gajim_themes_window') self.window.set_transient_for(app.interface.instances[ 'preferences'].window) self.options = ['account', 'group', 'contact', 'banner'] self.options_combobox = self.xml.get_object('options_combobox') self.textcolor_checkbutton = self.xml.get_object('textcolor_checkbutton') self.background_checkbutton = self.xml.get_object('background_checkbutton') self.textfont_checkbutton = self.xml.get_object('textfont_checkbutton') self.text_colorbutton = self.xml.get_object('text_colorbutton') self.background_colorbutton = self.xml.get_object('background_colorbutton') self.text_fontbutton = self.xml.get_object('text_fontbutton') self.bold_togglebutton = self.xml.get_object('bold_togglebutton') self.italic_togglebutton = self.xml.get_object('italic_togglebutton') self.themes_tree = self.xml.get_object('themes_treeview') self.theme_options_vbox = self.xml.get_object('theme_options_vbox') self.theme_options_table = self.xml.get_object('theme_options_table') self.colorbuttons = {} for chatstate in ('inactive', 'composing', 'paused', 'gone', 'muc_msg', 'muc_directed_msg'): self.colorbuttons[chatstate] = self.xml.get_object(chatstate + \ '_colorbutton') model = Gtk.ListStore(str) self.themes_tree.set_model(model) col = Gtk.TreeViewColumn(_('Theme')) self.themes_tree.append_column(col) renderer = Gtk.CellRendererText() col.pack_start(renderer, True) col.add_attribute(renderer, 'text', 0) renderer.connect('edited', self.on_theme_cell_edited) renderer.set_property('editable', True) self.current_theme = app.config.get('roster_theme') self.no_update = False self.fill_themes_treeview() self.select_active_theme() self.current_option = self.options[0] self.set_theme_options(self.current_theme, self.current_option) self.xml.connect_signals(self) self.window.connect('delete-event', self.on_themese_window_delete_event) self.themes_tree.get_selection().connect('changed', self.selection_changed) self.window.show_all() def on_themese_window_delete_event(self, widget, event): self.window.hide() return True # do NOT destroy the window def on_close_button_clicked(self, widget): if 'preferences' in app.interface.instances: app.interface.instances['preferences'].update_theme_list() self.window.hide() def on_theme_cell_edited(self, cell, row, new_name): model = self.themes_tree.get_model() iter_ = model.get_iter_from_string(row) old_name = model.get_value(iter_, 0) if old_name == new_name: return if old_name == 'default': dialogs.ErrorDialog( _('You cannot make changes to the default theme'), _('Please create a new clean theme.')) return new_config_name = new_name.replace(' ', '_') if new_config_name in app.config.get_per('themes'): return app.config.add_per('themes', new_config_name) # Copy old theme values old_config_name = old_name.replace(' ', '_') properties = ['textcolor', 'bgcolor', 'font', 'fontattrs'] app.config.add_per('themes', new_config_name) for option in self.options: for property_ in properties: option_name = option + property_ app.config.set_per('themes', new_config_name, option_name, app.config.get_per('themes', old_config_name, option_name)) app.config.del_per('themes', old_config_name) if old_config_name == app.config.get('roster_theme'): app.config.set('roster_theme', new_config_name) model.set_value(iter_, 0, new_name) self.current_theme = new_name def fill_themes_treeview(self): model = self.themes_tree.get_model() model.clear() for config_theme in app.config.get_per('themes'): theme = config_theme.replace('_', ' ') model.append([theme]) def select_active_theme(self): model = self.themes_tree.get_model() iter_ = model.get_iter_first() active_theme = app.config.get('roster_theme').replace('_', ' ') while iter_: theme = model[iter_][0] if theme == active_theme: self.themes_tree.get_selection().select_iter(iter_) if active_theme == 'default': self.xml.get_object('remove_button').set_sensitive(False) self.theme_options_vbox.set_sensitive(False) self.theme_options_table.set_sensitive(False) else: self.xml.get_object('remove_button').set_sensitive(True) self.theme_options_vbox.set_sensitive(True) self.theme_options_table.set_sensitive(True) break iter_ = model.iter_next(iter_) def selection_changed(self, widget = None): (model, iter_) = self.themes_tree.get_selection().get_selected() selected = self.themes_tree.get_selection().get_selected_rows() if not iter_ or selected[1] == []: self.theme_options_vbox.set_sensitive(False) self.theme_options_table.set_sensitive(False) return self.current_theme = model.get_value(iter_, 0) self.current_theme = self.current_theme.replace(' ', '_') self.set_theme_options(self.current_theme) if self.current_theme == 'default': self.xml.get_object('remove_button').set_sensitive(False) self.theme_options_vbox.set_sensitive(False) self.theme_options_table.set_sensitive(False) else: self.xml.get_object('remove_button').set_sensitive(True) self.theme_options_vbox.set_sensitive(True) self.theme_options_table.set_sensitive(True) def on_add_button_clicked(self, widget): model = self.themes_tree.get_model() iter_ = model.append() i = 0 # don't confuse translators theme_name = _('theme name') theme_name_ns = theme_name.replace(' ', '_') while theme_name_ns + str(i) in app.config.get_per('themes'): i += 1 model.set_value(iter_, 0, theme_name + str(i)) app.config.add_per('themes', theme_name_ns + str(i)) self.themes_tree.get_selection().select_iter(iter_) col = self.themes_tree.get_column(0) path = model.get_path(iter_) self.themes_tree.set_cursor(path, col, True) def on_remove_button_clicked(self, widget): (model, iter_) = self.themes_tree.get_selection().get_selected() if not iter_: return if self.current_theme == app.config.get('roster_theme'): dialogs.ErrorDialog( _('You cannot delete your current theme'), _('Pick another theme to use first.')) return self.theme_options_vbox.set_sensitive(False) self.theme_options_table.set_sensitive(False) self.xml.get_object('remove_button').set_sensitive(False) app.config.del_per('themes', self.current_theme) model.remove(iter_) def set_theme_options(self, theme, option = 'account'): self.no_update = True self.options_combobox.set_active(self.options.index(option)) textcolor = app.config.get_per('themes', theme, option + 'textcolor') if textcolor: state = True rgba = Gdk.RGBA() rgba.parse(textcolor) self.text_colorbutton.set_rgba(rgba) else: state = False self.textcolor_checkbutton.set_active(state) self.text_colorbutton.set_sensitive(state) bgcolor = app.config.get_per('themes', theme, option + 'bgcolor') if bgcolor: state = True rgba = Gdk.RGBA() rgba.parse(bgcolor) self.background_colorbutton.set_rgba(rgba) else: state = False self.background_checkbutton.set_active(state) self.background_colorbutton.set_sensitive(state) # get the font name before we set widgets and it will not be overriden font_name = app.config.get_per('themes', theme, option + 'font') font_attrs = app.config.get_per('themes', theme, option + 'fontattrs') self._set_font_widgets(font_attrs) if font_name: state = True self.text_fontbutton.set_font_name(font_name) else: state = False self.textfont_checkbutton.set_active(state) self.text_fontbutton.set_sensitive(state) self.no_update = False app.interface.roster.change_roster_style(None) for chatstate in ('inactive', 'composing', 'paused', 'gone', 'muc_msg', 'muc_directed_msg'): color = app.config.get_per('themes', theme, 'state_' + chatstate + \ '_color') rgba = Gdk.RGBA() rgba.parse(color) self.colorbuttons[chatstate].set_rgba(rgba) def on_textcolor_checkbutton_toggled(self, widget): state = widget.get_active() self.text_colorbutton.set_sensitive(state) self._set_color(state, self.text_colorbutton, 'textcolor') def on_background_checkbutton_toggled(self, widget): state = widget.get_active() self.background_colorbutton.set_sensitive(state) self._set_color(state, self.background_colorbutton, 'bgcolor') def on_textfont_checkbutton_toggled(self, widget): self.text_fontbutton.set_sensitive(widget.get_active()) self._set_font() def on_text_colorbutton_color_set(self, widget): self._set_color(True, widget, 'textcolor') def on_background_colorbutton_color_set(self, widget): self._set_color(True, widget, 'bgcolor') def on_text_fontbutton_font_set(self, widget): self._set_font() def on_options_combobox_changed(self, widget): index = self.options_combobox.get_active() if index == -1: return self.current_option = self.options[index] self.set_theme_options(self.current_theme, self.current_option) def on_bold_togglebutton_toggled(self, widget): if not self.no_update: self._set_font() def on_italic_togglebutton_toggled(self, widget): if not self.no_update: self._set_font() def _set_color(self, state, widget, option): """ Set color value in prefs and update the UI """ if state: color = widget.get_rgba() color_string = color.to_string() else: color_string = '' begin_option = '' if not option.startswith('state'): begin_option = self.current_option app.config.set_per('themes', self.current_theme, begin_option + option, color_string) # use faster functions for this if self.current_option == 'banner': app.interface.roster.repaint_themed_widgets() return if self.no_update: return app.interface.roster.change_roster_style(self.current_option) def _set_font(self): """ Set font value in prefs and update the UI """ state = self.textfont_checkbutton.get_active() if state: font_string = self.text_fontbutton.get_font_name() else: font_string = '' app.config.set_per('themes', self.current_theme, self.current_option + 'font', font_string) font_attrs = self._get_font_attrs() app.config.set_per('themes', self.current_theme, self.current_option + 'fontattrs', font_attrs) # use faster functions for this if self.current_option == 'banner': app.interface.roster.repaint_themed_widgets() if self.no_update: return app.interface.roster.change_roster_style(self.current_option) def _toggle_font_widgets(self, font_props): """ Toggle font buttons with the bool values of font_props tuple """ self.bold_togglebutton.set_active(font_props[0]) self.italic_togglebutton.set_active(font_props[1]) def _get_font_description(self): """ Return a FontDescription from togglebuttons states """ fd = Pango.FontDescription() if self.bold_togglebutton.get_active(): fd.set_weight(Pango.Weight.BOLD) if self.italic_togglebutton.get_active(): fd.set_style(Pango.Style.ITALIC) return fd def _set_font_widgets(self, font_attrs): """ Set the correct toggle state of font style buttons by a font string of type 'BI' """ font_props = [False, False, False] if font_attrs: if font_attrs.find('B') != -1: font_props[0] = True if font_attrs.find('I') != -1: font_props[1] = True self._toggle_font_widgets(font_props) def _get_font_attrs(self): """ Get a string with letters of font attribures: 'BI' """ attrs = '' if self.bold_togglebutton.get_active(): attrs += 'B' if self.italic_togglebutton.get_active(): attrs += 'I' return attrs def _get_font_props(self, font_name): """ Get tuple of font properties: weight, style """ font_props = [False, False, False] font_description = Pango.FontDescription(font_name) if font_description.get_weight() != Pango.Weight.NORMAL: font_props[0] = True if font_description.get_style() != Pango.Style.ITALIC: font_props[1] = True return font_props def on_inactive_colorbutton_color_set(self, widget): self.no_update = True self._set_color(True, widget, 'state_inactive_color') self.no_update = False def on_composing_colorbutton_color_set(self, widget): self.no_update = True self._set_color(True, widget, 'state_composing_color') self.no_update = False def on_paused_colorbutton_color_set(self, widget): self.no_update = True self._set_color(True, widget, 'state_paused_color') self.no_update = False def on_gone_colorbutton_color_set(self, widget): self.no_update = True self._set_color(True, widget, 'state_gone_color') self.no_update = False def on_muc_msg_colorbutton_color_set(self, widget): self.no_update = True self._set_color(True, widget, 'state_muc_msg_color') self.no_update = False def on_muc_directed_msg_colorbutton_color_set(self, widget): self.no_update = True self._set_color(True, widget, 'state_muc_directed_msg_color') self.no_update = False gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/groupchat_control.py000066400000000000000000003636171326020644600261200ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/groupchat_control.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2005-2007 Nikos Kouremenos ## Copyright (C) 2006 Dimitur Kirov ## Alex Mauer ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Travis Shirk ## Copyright (C) 2007-2008 Julien Pivotto ## Stephan Erb ## Copyright (C) 2008 Brendan Taylor ## Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import time import locale from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GdkPixbuf from gi.repository import Pango from gi.repository import GLib from gi.repository import Gio from gajim import gtkgui_helpers from gajim import gui_menu_builder from gajim import message_control from gajim import tooltips from gajim import dialogs from gajim import config from gajim import vcard from gajim import dataforms_widget from gajim import adhoc_commands from gajim.common.const import AvatarSize from gajim.common.caps_cache import muc_caps_cache import nbxmpp from enum import IntEnum, unique from gajim.common import events from gajim.common import app from gajim.common import helpers from gajim.common import dataforms from gajim.common import ged from gajim.common import i18n from gajim.common import contacts from gajim.chat_control import ChatControl from gajim.chat_control_base import ChatControlBase from gajim.command_system.implementation.hosts import PrivateChatCommands from gajim.command_system.implementation.hosts import GroupChatCommands from gajim.common.connection_handlers_events import GcMessageOutgoingEvent import logging log = logging.getLogger('gajim.groupchat_control') @unique class Column(IntEnum): IMG = 0 # image to show state (online, new message etc) NICK = 1 # contact nickame or ROLE name TYPE = 2 # type of the row ('contact' or 'role') TEXT = 3 # text shown in the cellrenderer AVATAR_IMG = 4 # avatar of the contact empty_pixbuf = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, 1, 1) empty_pixbuf.fill(0xffffff00) def cell_data_func(column, renderer, model, iter_, user_data): # Background color has to be rendered for all cells theme = app.config.get('roster_theme') has_parent = bool(model.iter_parent(iter_)) if has_parent: bgcolor = app.config.get_per('themes', theme, 'contactbgcolor') renderer.set_property('cell-background', bgcolor or None) else: bgcolor = app.config.get_per('themes', theme, 'groupbgcolor') renderer.set_property('cell-background', bgcolor or None) if user_data == 'status': status_cell_data_func(column, renderer, model, iter_, has_parent) elif user_data == 'name': text_cell_data_func(column, renderer, model, iter_, has_parent, theme) elif user_data == 'avatar': avatar_cell_data_func(column, renderer, model, iter_, has_parent) def status_cell_data_func(column, renderer, model, iter_, has_parent): renderer.set_property('width', 26) image = model[iter_][Column.IMG] surface = image.get_property('surface') renderer.set_property('surface', surface) def avatar_cell_data_func(column, renderer, model, iter_, has_parent): image = model[iter_][Column.AVATAR_IMG] if image is None: renderer.set_property('surface', None) else: surface = image.get_property('surface') renderer.set_property('surface', surface) renderer.set_property('xalign', 0.5) if has_parent: renderer.set_property('visible', True) renderer.set_property('width', AvatarSize.ROSTER) else: renderer.set_property('visible', False) def text_cell_data_func(column, renderer, model, iter_, has_parent, theme): # cell data func is global, because we don't want it to keep # reference to GroupchatControl instance (self) if has_parent: color = app.config.get_per('themes', theme, 'contacttextcolor') if color: renderer.set_property('foreground', color) else: renderer.set_property('foreground', None) renderer.set_property('font', gtkgui_helpers.get_theme_font_for_option(theme, 'contactfont')) else: color = app.config.get_per('themes', theme, 'grouptextcolor') renderer.set_property('foreground', color or None) renderer.set_property('font', gtkgui_helpers.get_theme_font_for_option(theme, 'groupfont')) class PrivateChatControl(ChatControl): TYPE_ID = message_control.TYPE_PM # Set a command host to bound to. Every command given through a private chat # will be processed with this command host. COMMAND_HOST = PrivateChatCommands def __init__(self, parent_win, gc_contact, contact, account, session): room_jid = gc_contact.room_jid self.room_ctrl = app.interface.msg_win_mgr.get_gc_control(room_jid, account) if room_jid in app.interface.minimized_controls[account]: self.room_ctrl = app.interface.minimized_controls[account][room_jid] if self.room_ctrl: self.room_name = self.room_ctrl.name else: self.room_name = room_jid self.gc_contact = gc_contact ChatControl.__init__(self, parent_win, contact, account, session) self.TYPE_ID = 'pm' app.ged.register_event_handler('update-gc-avatar', ged.GUI1, self._nec_update_avatar) app.ged.register_event_handler('caps-received', ged.GUI1, self._nec_caps_received_pm) app.ged.register_event_handler('gc-presence-received', ged.GUI1, self._nec_gc_presence_received) def get_our_nick(self): return self.room_ctrl.nick def shutdown(self): super(PrivateChatControl, self).shutdown() app.ged.remove_event_handler('update-gc-avatar', ged.GUI1, self._nec_update_avatar) app.ged.remove_event_handler('caps-received', ged.GUI1, self._nec_caps_received_pm) app.ged.remove_event_handler('gc-presence-received', ged.GUI1, self._nec_gc_presence_received) def _nec_caps_received_pm(self, obj): if obj.conn.name != self.account or \ obj.fjid != self.gc_contact.get_full_jid(): return self.update_contact() def _nec_gc_presence_received(self, obj): if obj.conn.name != self.account: return if obj.fjid != self.full_jid: return if '303' in obj.status_code: self.print_conversation(_('%(nick)s is now known as ' '%(new_nick)s') % {'nick': obj.nick, 'new_nick': obj.new_nick}, 'status') gc_c = app.contacts.get_gc_contact(obj.conn.name, obj.room_jid, obj.new_nick) c = gc_c.as_contact() self.gc_contact = gc_c self.contact = c if self.session: # stop e2e if self.session.enable_encryption: thread_id = self.session.thread_id self.session.terminate_e2e() obj.conn.delete_session(obj.fjid, thread_id) self.no_autonegotiation = False self.draw_banner() old_jid = obj.room_jid + '/' + obj.nick new_jid = obj.room_jid + '/' + obj.new_nick app.interface.msg_win_mgr.change_key(old_jid, new_jid, obj.conn.name) else: self.contact.show = obj.show self.contact.status = obj.status self.gc_contact.show = obj.show self.gc_contact.status = obj.status uf_show = helpers.get_uf_show(obj.show) self.print_conversation(_('%(nick)s is now %(status)s') % { 'nick': obj.nick, 'status': uf_show}, 'status') if obj.status: self.print_conversation(' (', 'status', simple=True) self.print_conversation('%s' % (obj.status), 'status', simple=True) self.print_conversation(')', 'status', simple=True) self.parent_win.redraw_tab(self) self.update_ui() def send_message(self, message, xhtml=None, process_commands=True, attention=False): """ Call this method to send the message """ message = helpers.remove_invalid_xml_chars(message) if not message: return # We need to make sure that we can still send through the room and that # the recipient did not go away contact = app.contacts.get_first_contact_from_jid(self.account, self.contact.jid) if not contact: # contact was from pm in MUC room, nick = app.get_room_and_nick_from_fjid(self.contact.jid) gc_contact = app.contacts.get_gc_contact(self.account, room, nick) if not gc_contact: dialogs.ErrorDialog( _('Sending private message failed'), #in second %s code replaces with nickname _('You are no longer in group chat "%(room)s" or ' '"%(nick)s" has left.') % {'room': '\u200E' + room, 'nick': nick}, transient_for=self.parent_win.window) return ChatControl.send_message(self, message, xhtml=xhtml, process_commands=process_commands, attention=attention) def update_ui(self): if self.contact.show == 'offline': self.got_disconnected() else: self.got_connected() ChatControl.update_ui(self) def _nec_update_avatar(self, obj): if obj.contact != self.gc_contact: return self.show_avatar() def show_avatar(self): if not app.config.get('show_avatar_in_chat'): return scale = self.parent_win.window.get_scale_factor() surface = app.interface.get_avatar( self.gc_contact.avatar_sha, AvatarSize.CHAT, scale) image = self.xml.get_object('avatar_image') image.set_from_surface(surface) def update_contact(self): self.contact = self.gc_contact.as_contact() def begin_e2e_negotiation(self): self.no_autonegotiation = True if not self.session: fjid = self.gc_contact.get_full_jid() new_sess = app.connections[self.account].make_new_session(fjid, type_=self.type_id) self.set_session(new_sess) self.session.negotiate_e2e(False) def got_disconnected(self): ChatControl.got_disconnected(self) class GroupchatControl(ChatControlBase): TYPE_ID = message_control.TYPE_GC # Set a command host to bound to. Every command given through a group chat # will be processed with this command host. COMMAND_HOST = GroupChatCommands def __init__(self, parent_win, contact, acct, is_continued=False): ChatControlBase.__init__(self, self.TYPE_ID, parent_win, 'groupchat_control', contact, acct) self.force_non_minimizable = False self.is_continued = is_continued self.is_anonymous = True # Controls the state of autorejoin. # None - autorejoin is neutral. # False - autorejoin is to be prevented (gets reset to initial state in # got_connected()). # int - autorejoin is being active and working (gets reset to initial # state in got_connected()). self.autorejoin = None # Keep error dialog instance to be sure to have only once at a time self.error_dialog = None # Source id for saving the handle position self._handle_timeout_id = None self.emoticons_button = self.xml.get_object('emoticons_button') self.toggle_emoticons() formattings_button = self.xml.get_object('formattings_button') formattings_button.set_sensitive(False) self._state_change_handler_id = None if parent_win is not None: # On AutoJoin with minimize Groupchats are created without parent # Tooltip Window and Actions have to be created with parent self.set_tooltip() self.add_actions() self.scale_factor = parent_win.window.get_scale_factor() self._connect_window_state_change(parent_win) else: self.scale_factor = app.interface.roster.scale_factor widget = self.xml.get_object('list_treeview') id_ = widget.connect('row_expanded', self.on_list_treeview_row_expanded) self.handlers[id_] = widget id_ = widget.connect('row_collapsed', self.on_list_treeview_row_collapsed) self.handlers[id_] = widget id_ = widget.connect('row_activated', self.on_list_treeview_row_activated) self.handlers[id_] = widget id_ = widget.connect('button_press_event', self.on_list_treeview_button_press_event) self.handlers[id_] = widget id_ = widget.connect('key_press_event', self.on_list_treeview_key_press_event) self.handlers[id_] = widget self.room_jid = self.contact.jid self.nick = contact.name self.new_nick = '' self.name = '' for bm in app.connections[self.account].bookmarks: if bm['jid'] == self.room_jid: self.name = bm['name'] break if not self.name: self.name = self.room_jid.split('@')[0] self.widget_set_visible(self.xml.get_object('banner_eventbox'), app.config.get('hide_groupchat_banner')) self._last_selected_contact = None # None or holds jid, account tuple # muc attention flag (when we are mentioned in a muc) # if True, the room has mentioned us self.attention_flag = False # sorted list of nicks who mentioned us (last at the end) self.attention_list = [] self.room_creation = int(time.time()) # Use int to reduce mem usage self.nick_hits = [] self.last_key_tabs = False self.subject = '' # nickname coloring self.gc_count_nicknames_colors = -1 self.gc_custom_colors = {} self.number_of_colors = len(app.config.get('gc_nicknames_colors').\ split(':')) self.name_label = self.xml.get_object('banner_name_label') self.event_box = self.xml.get_object('banner_eventbox') self.list_treeview = self.xml.get_object('list_treeview') selection = self.list_treeview.get_selection() id_ = selection.connect('changed', self.on_list_treeview_selection_changed) self.handlers[id_] = selection id_ = self.list_treeview.connect('style-set', self.on_list_treeview_style_set) self.handlers[id_] = self.list_treeview # flag that stops hpaned position event # when the handle gets resized in another control self._resize_from_another_muc = False self.hpaned = self.xml.get_object('hpaned') # set the position of the current hpaned hpaned_position = app.config.get('gc-hpaned-position') self.hpaned.set_position(hpaned_position) #status_image, shown_nick, type, nickname, avatar self.columns = [Gtk.Image, str, str, str, Gtk.Image] self.model = Gtk.TreeStore(*self.columns) self.model.set_sort_func(Column.NICK, self.tree_compare_iters) self.model.set_sort_column_id(Column.NICK, Gtk.SortType.ASCENDING) # columns column = Gtk.TreeViewColumn() # list of renderers with attributes / properties in the form: # (name, renderer_object, expand?, attribute_name, attribute_value, # cell_data_func, func_arg) self.renderers_list = [] # Number of renderers plugins added self.nb_ext_renderers = 0 self.renderers_propertys = {} renderer_text = Gtk.CellRendererText() self.renderers_propertys[renderer_text] = ('ellipsize', Pango.EllipsizeMode.END) self.renderers_list += ( # status img ('icon', Gtk.CellRendererPixbuf(), False, None, Column.IMG, cell_data_func, 'status'), # contact name ('name', renderer_text, True, 'markup', Column.TEXT, cell_data_func, 'name')) # avatar img avatar_renderer = ('avatar', Gtk.CellRendererPixbuf(), False, None, Column.AVATAR_IMG, cell_data_func, 'avatar') if app.config.get('avatar_position_in_roster') == 'right': self.renderers_list.append(avatar_renderer) else: self.renderers_list.insert(0, avatar_renderer) self.fill_column(column) self.list_treeview.append_column(column) # workaround to avoid gtk arrows to be shown column = Gtk.TreeViewColumn() # 2nd COLUMN renderer = Gtk.CellRendererPixbuf() column.pack_start(renderer, False) self.list_treeview.append_column(column) column.set_visible(False) self.list_treeview.set_expander_column(column) self.setup_seclabel(self.xml.get_object('label_selector')) self.form_widget = None # Send file self.sendfile_button = self.xml.get_object('sendfile_button') self.sendfile_button.set_action_name('win.send-file-' + \ self.control_id) # Encryption self.lock_image = self.xml.get_object('lock_image') self.authentication_button = self.xml.get_object( 'authentication_button') id_ = self.authentication_button.connect('clicked', self._on_authentication_button_clicked) self.handlers[id_] = self.authentication_button self.set_lock_image() self.encryption_menu = self.xml.get_object('encryption_menu') self.encryption_menu.set_menu_model( gui_menu_builder.get_encryption_menu(self.control_id, self.type_id)) self.set_encryption_menu_icon() # Banner self.banner_actionbar = self.xml.get_object('banner_actionbar') self.hide_roster_button = Gtk.Button.new_from_icon_name( 'go-next-symbolic', Gtk.IconSize.MENU) self.hide_roster_button.connect('clicked', lambda *args: self.show_roster()) self.subject_button = Gtk.MenuButton() self.subject_button.set_image(Gtk.Image.new_from_icon_name( 'go-down-symbolic', Gtk.IconSize.MENU)) self.subject_button.set_popover(SubjectPopover()) self.subject_button.set_no_show_all(True) self.banner_actionbar.pack_end(self.hide_roster_button) self.banner_actionbar.pack_start(self.subject_button) # GC Roster tooltip self.gc_tooltip = tooltips.GCTooltip() self.control_menu = gui_menu_builder.get_groupchat_menu(self.control_id) settings_menu = self.xml.get_object('settings_menu') settings_menu.set_menu_model(self.control_menu) app.ged.register_event_handler('gc-presence-received', ged.GUI1, self._nec_gc_presence_received) app.ged.register_event_handler('gc-message-received', ged.GUI1, self._nec_gc_message_received) app.ged.register_event_handler('mam-decrypted-message-received', ged.GUI1, self._nec_mam_decrypted_message_received) app.ged.register_event_handler('vcard-published', ged.GUI1, self._nec_vcard_published) app.ged.register_event_handler('update-gc-avatar', ged.GUI1, self._nec_update_avatar) app.ged.register_event_handler('gc-subject-received', ged.GUI1, self._nec_gc_subject_received) app.ged.register_event_handler('gc-config-changed-received', ged.GUI1, self._nec_gc_config_changed_received) app.ged.register_event_handler('signed-in', ged.GUI1, self._nec_signed_in) app.ged.register_event_handler('decrypted-message-received', ged.GUI2, self._nec_decrypted_message_received) app.ged.register_event_handler('gc-stanza-message-outgoing', ged.OUT_POSTCORE, self._message_sent) app.gc_connected[self.account][self.room_jid] = False # disable win, we are not connected yet ChatControlBase.got_disconnected(self) self.update_ui() self.widget.show_all() if app.config.get('hide_groupchat_occupants_list'): # Roster is shown by default, so toggle the roster button to hide it self.show_roster() # PluginSystem: adding GUI extension point for this GroupchatControl # instance object app.plugin_manager.gui_extension_point('groupchat_control', self) def add_actions(self): super().add_actions() actions = [ ('change-subject-', self._on_change_subject), ('change-nick-', self._on_change_nick), ('disconnect-', self._on_disconnect), ('destroy-', self._on_destroy_room), ('configure-', self._on_configure_room), ('bookmark-', self._on_bookmark_room), ('request-voice-', self._on_request_voice), ('execute-command-', self._on_execute_command), ] for action in actions: action_name, func = action act = Gio.SimpleAction.new(action_name + self.control_id, None) act.connect("activate", func) self.parent_win.window.add_action(act) non_minimized_gc = app.config.get_per( 'accounts', self.account, 'non_minimized_gc').split() value = self.contact.jid not in non_minimized_gc act = Gio.SimpleAction.new_stateful( 'minimize-' + self.control_id, None, GLib.Variant.new_boolean(value)) act.connect('change-state', self._on_minimize) self.parent_win.window.add_action(act) value = app.config.get_per( 'rooms', self.contact.jid, 'notify_on_all_messages') act = Gio.SimpleAction.new_stateful( 'notify-on-message-' + self.control_id, None, GLib.Variant.new_boolean(value)) act.connect('change-state', self._on_notify_on_all_messages) self.parent_win.window.add_action(act) def update_actions(self): if self.parent_win is None: return win = self.parent_win.window contact = app.contacts.get_gc_contact( self.account, self.room_jid, self.nick) online = app.gc_connected[self.account][self.room_jid] # Destroy Room win.lookup_action('destroy-' + self.control_id).set_enabled( online and contact.affiliation == 'owner') # Configure Room win.lookup_action('configure-' + self.control_id).set_enabled( online and contact.affiliation in ('admin', 'owner')) # Bookmarks con = app.connections[self.account] bookmark_support = con.bookmarks_available() not_bookmarked = True for bm in con.bookmarks: if bm['jid'] == self.room_jid: not_bookmarked = False break win.lookup_action('bookmark-' + self.control_id).set_enabled( online and bookmark_support and not_bookmarked) # Request Voice role = self.get_role(self.nick) win.lookup_action('request-voice-' + self.control_id).set_enabled( online and role == 'visitor') # Change Subject # Get this from Room Disco win.lookup_action('change-subject-' + self.control_id).set_enabled( online) # Change Nick win.lookup_action('change-nick-' + self.control_id).set_enabled( online) # Execute command win.lookup_action('execute-command-' + self.control_id).set_enabled( online) # Send file (HTTP File Upload) httpupload = win.lookup_action( 'send-file-httpupload-' + self.control_id) httpupload.set_enabled( online and app.connections[self.account].httpupload) win.lookup_action('send-file-' + self.control_id).set_enabled( httpupload.get_enabled()) tooltip_text = None if online: if httpupload.get_enabled(): tooltip_text = _('HTTP File Upload') else: tooltip_text = _('HTTP File Upload not supported ' 'by your server') self.sendfile_button.set_tooltip_text(tooltip_text) def _connect_window_state_change(self, parent_win): if self._state_change_handler_id is None: id_ = parent_win.window.connect('notify::is-maximized', self._on_window_state_change) self._state_change_handler_id = id_ # Actions def _on_change_subject(self, action, param): def on_ok(subject): # Note, we don't update self.subject since we don't know whether it # will work yet app.connections[self.account].send_gc_subject( self.room_jid, subject) dialogs.InputTextDialog(_('Changing Subject'), _('Please specify the new subject:'), input_str=self.subject, ok_handler=on_ok, transient_for=self.parent_win.window) def _on_change_nick(self, action, param): if 'change_nick_dialog' in app.interface.instances: app.interface.instances['change_nick_dialog'].dialog.present() else: title = _('Changing Nickname') prompt = _('Please specify the new nickname you want to use:') app.interface.instances['change_nick_dialog'] = \ dialogs.ChangeNickDialog(self.account, self.room_jid, title, prompt, change_nick=True, transient_for=self.parent_win.window) def _on_disconnect(self, action, param): self.force_non_minimizable = True self.parent_win.remove_tab(self, self.parent_win.CLOSE_COMMAND) self.force_non_minimizable = False def _on_destroy_room(self, action, param): def on_ok(reason, jid): if jid: # Test jid try: jid = helpers.parse_jid(jid) except Exception: dialogs.ErrorDialog(_('Invalid group chat JID'), _('The group chat JID has not allowed characters.')) return app.connections[self.account].destroy_gc_room( self.room_jid, reason, jid) gui_menu_builder.build_bookmark_menu(self.account) self.force_non_minimizable = True self.parent_win.remove_tab(self, self.parent_win.CLOSE_COMMAND) self.force_non_minimizable = False # Ask for a reason dialogs.DoubleInputDialog(_('Destroying %s') % '\u200E' + \ self.room_jid, _('You are going to remove this room permanently.' '\nYou may specify a reason below:'), _('You may also enter an alternate venue:'), ok_handler=on_ok, transient_for=self.parent_win.window) def _on_configure_room(self, action, param): c = app.contacts.get_gc_contact( self.account, self.room_jid, self.nick) if c.affiliation == 'owner': app.connections[self.account].request_gc_config(self.room_jid) elif c.affiliation == 'admin': if self.room_jid not in app.interface.instances[self.account][ 'gc_config']: app.interface.instances[self.account]['gc_config'][ self.room_jid] = config.GroupchatConfigWindow(self.account, self.room_jid) def _on_bookmark_room(self, action, param): """ Bookmark the room, without autojoin and not minimized """ password = app.gc_passwords.get(self.room_jid, '') app.interface.add_gc_bookmark( self.account, self.name, self.room_jid, '0', '0', password, self.nick) self.update_actions() def _on_request_voice(self, action, param): """ Request voice in the current room """ app.connections[self.account].request_voice(self.room_jid) def _on_minimize(self, action, param): """ When a grouchat is minimized, unparent the tab, put it in roster etc """ action.set_state(param) non_minimized_gc = app.config.get_per( 'accounts', self.account, 'non_minimized_gc').split() minimize = param.get_boolean() if minimize: non_minimized_gc.remove(self.contact.jid) else: non_minimized_gc.append(self.contact.jid) app.config.set_per('accounts', self.account, 'non_minimized_gc', ' '.join(non_minimized_gc)) def _on_notify_on_all_messages(self, action, param): action.set_state(param) app.config.set_per('rooms', self.contact.jid, 'notify_on_all_messages', param.get_boolean()) def _on_execute_command(self, action, param): """ Execute AdHoc commands on the current room """ adhoc_commands.CommandWindow(self.account, self.room_jid) def show_roster(self): new_state = not self.hpaned.get_child2().is_visible() image = self.hide_roster_button.get_image() if new_state: self.hpaned.get_child2().show() image.set_from_icon_name('go-next-symbolic', Gtk.IconSize.MENU) else: self.hpaned.get_child2().hide() image.set_from_icon_name('go-previous-symbolic', Gtk.IconSize.MENU) def on_groupchat_maximize(self): self.set_tooltip() self.add_actions() self.update_actions() self.set_lock_image() self._schedule_activity_timers() self._connect_window_state_change(self.parent_win) def set_tooltip(self): widget = self.xml.get_object('list_treeview') if widget.get_tooltip_window(): return widget.set_has_tooltip(True) id_ = widget.connect('query-tooltip', self.query_tooltip) self.handlers[id_] = widget def query_tooltip(self, widget, x_pos, y_pos, keyboard_mode, tooltip): try: row = self.list_treeview.get_path_at_pos(x_pos, y_pos)[0] except TypeError: self.gc_tooltip.clear_tooltip() return False if not row: self.gc_tooltip.clear_tooltip() return False iter_ = None try: iter_ = self.model.get_iter(row) except Exception: self.gc_tooltip.clear_tooltip() return False typ = self.model[iter_][Column.TYPE] nick = self.model[iter_][Column.NICK] if typ != 'contact': self.gc_tooltip.clear_tooltip() return False contact = app.contacts.get_gc_contact( self.account, self.room_jid, nick) if not contact: self.gc_tooltip.clear_tooltip() return False value, widget = self.gc_tooltip.get_tooltip(contact) tooltip.set_custom(widget) return value def fill_column(self, col): for rend in self.renderers_list: col.pack_start(rend[1], rend[2]) if rend[0] not in ('avatar', 'icon'): col.add_attribute(rend[1], rend[3], rend[4]) col.set_cell_data_func(rend[1], rend[5], rend[6]) # set renderers propertys for renderer in self.renderers_propertys.keys(): renderer.set_property(self.renderers_propertys[renderer][0], self.renderers_propertys[renderer][1]) def tree_compare_iters(self, model, iter1, iter2, data=None): """ Compare two iters to sort them """ type1 = model[iter1][Column.TYPE] type2 = model[iter2][Column.TYPE] if not type1 or not type2: return 0 nick1 = model[iter1][Column.NICK] nick2 = model[iter2][Column.NICK] if not nick1 or not nick2: return 0 if type1 == 'role': return locale.strcoll(nick1, nick2) if type1 == 'contact': gc_contact1 = app.contacts.get_gc_contact(self.account, self.room_jid, nick1) if not gc_contact1: return 0 if type2 == 'contact': gc_contact2 = app.contacts.get_gc_contact(self.account, self.room_jid, nick2) if not gc_contact2: return 0 if type1 == 'contact' and type2 == 'contact' and \ app.config.get('sort_by_show_in_muc'): cshow = {'chat':0, 'online': 1, 'away': 2, 'xa': 3, 'dnd': 4, 'invisible': 5, 'offline': 6, 'error': 7} show1 = cshow[gc_contact1.show] show2 = cshow[gc_contact2.show] if show1 < show2: return -1 elif show1 > show2: return 1 # We compare names name1 = gc_contact1.get_shown_name() name2 = gc_contact2.get_shown_name() return locale.strcoll(name1.lower(), name2.lower()) def on_msg_textview_populate_popup(self, textview, menu): """ Override the default context menu and we prepend Clear and the ability to insert a nick """ ChatControlBase.on_msg_textview_populate_popup(self, textview, menu) item = Gtk.SeparatorMenuItem.new() menu.prepend(item) item = Gtk.MenuItem.new_with_label(_('Insert Nickname')) menu.prepend(item) submenu = Gtk.Menu() item.set_submenu(submenu) for nick in sorted(app.contacts.get_nick_list(self.account, self.room_jid)): item = Gtk.MenuItem.new_with_label(nick) item.set_use_underline(False) submenu.append(item) id_ = item.connect('activate', self.append_nick_in_msg_textview, nick) self.handlers[id_] = item menu.show_all() def resize_occupant_treeview(self, position): if self.hpaned.get_position() == position: return self._resize_from_another_muc = True self.hpaned.set_position(position) def _reset_flag(): self._resize_from_another_muc = False # Reset the flag when everything will be redrawn, and in particular when # on_treeview_size_allocate will have been called. GLib.timeout_add(500, _reset_flag) def _on_window_state_change(self, win, param): # Add with timeout, because state change happens before # the hpaned notifys us about a new handle position GLib.timeout_add(100, self._check_for_resize) def _on_hpaned_release_button(self, hpaned, event): if event.get_button()[1] != 1: # We want only to catch the left mouse button return self._check_for_resize() def _check_for_resize(self): # Check if we have a new position pos = self.hpaned.get_position() if pos == app.config.get('gc-hpaned-position'): return # Save new position self._remove_handle_timeout() app.config.set('gc-hpaned-position', pos) # Resize other MUC rosters for account in app.gc_connected: for room_jid in [i for i in app.gc_connected[account] if \ app.gc_connected[account][i] and i != self.room_jid]: ctrl = app.interface.msg_win_mgr.get_gc_control(room_jid, account) if not ctrl and room_jid in \ app.interface.minimized_controls[account]: ctrl = app.interface.minimized_controls[account][room_jid] if ctrl and app.config.get('one_message_window') != 'never': ctrl.resize_occupant_treeview(pos) def _on_hpaned_handle_change(self, hpaned, param): if self._resize_from_another_muc: return # Window was resized, save new handle pos pos = hpaned.get_position() if pos != app.config.get('gc-hpaned-position'): self._remove_handle_timeout(renew=True) def _remove_handle_timeout(self, renew=False): if self._handle_timeout_id is not None: GLib.source_remove(self._handle_timeout_id) self._handle_timeout_id = None if renew: pos = self.hpaned.get_position() self._handle_timeout_id = GLib.timeout_add_seconds( 2, self._save_handle_position, pos) def _save_handle_position(self, pos): self._handle_timeout_id = None app.config.set('gc-hpaned-position', pos) def iter_contact_rows(self): """ Iterate over all contact rows in the tree model """ role_iter = self.model.get_iter_first() while role_iter: contact_iter = self.model.iter_children(role_iter) while contact_iter: yield self.model[contact_iter] contact_iter = self.model.iter_next(contact_iter) role_iter = self.model.iter_next(role_iter) def on_list_treeview_style_set(self, treeview, style): """ When style (theme) changes, redraw all contacts """ # Get the room_jid from treeview for contact in self.iter_contact_rows(): nick = contact[Column.NICK] self.draw_contact(nick) def on_list_treeview_selection_changed(self, selection): model, selected_iter = selection.get_selected() self.draw_contact(self.nick) if self._last_selected_contact is not None: self.draw_contact(self._last_selected_contact) if selected_iter is None: self._last_selected_contact = None return contact = model[selected_iter] nick = contact[Column.NICK] self._last_selected_contact = nick if contact[Column.TYPE] != 'contact': return self.draw_contact(nick, selected=True, focus=True) def get_tab_label(self, chatstate): """ Markup the label if necessary. Returns a tuple such as: (new_label_str, color) either of which can be None if chatstate is given that means we have HE SENT US a chatstate """ has_focus = self.parent_win.window.get_property('has-toplevel-focus') current_tab = self.parent_win.get_active_control() == self color = None if chatstate == 'attention' and (not has_focus or not current_tab): self.attention_flag = True color = 'state_muc_directed_msg_color' elif chatstate == 'active' or (current_tab and has_focus): self.attention_flag = False # get active color from gtk color = 'active' elif chatstate == 'newmsg' and (not has_focus or not current_tab) \ and not self.attention_flag: color = 'state_muc_msg_color' if self.is_continued: # if this is a continued conversation label_str = self.get_continued_conversation_name() else: label_str = self.name # count waiting highlighted messages unread = '' num_unread = self.get_nb_unread() if num_unread == 1: unread = '*' elif num_unread > 1: unread = '[' + str(num_unread) + ']' label_str = unread + label_str return (label_str, color) def get_tab_image(self, count_unread=True): tab_image = None if app.gc_connected[self.account][self.room_jid]: tab_image = gtkgui_helpers.get_iconset_name_for('muc-active') else: tab_image = gtkgui_helpers.get_iconset_name_for('muc-inactive') return tab_image def update_ui(self): ChatControlBase.update_ui(self) for nick in app.contacts.get_nick_list(self.account, self.room_jid): self.draw_contact(nick) def set_lock_image(self): encryption_state = {'visible': self.encryption is not None, 'enc_type': self.encryption, 'authenticated': False} if self.encryption: app.plugin_manager.extension_point( 'encryption_state' + self.encryption, self, encryption_state) self._show_lock_image(**encryption_state) def _show_lock_image(self, visible, enc_type='', authenticated=False): """ Set lock icon visibility and create tooltip """ if authenticated: authenticated_string = _('and authenticated') self.lock_image.set_from_icon_name( 'security-high', Gtk.IconSize.MENU) else: authenticated_string = _('and NOT authenticated') self.lock_image.set_from_icon_name( 'security-low', Gtk.IconSize.MENU) tooltip = _('%(type)s encryption is active %(authenticated)s.') % { 'type': enc_type, 'authenticated': authenticated_string} self.authentication_button.set_tooltip_text(tooltip) self.widget_set_visible(self.authentication_button, not visible) context = self.msg_scrolledwindow.get_style_context() self.lock_image.set_sensitive(visible) def _on_authentication_button_clicked(self, widget): app.plugin_manager.extension_point( 'encryption_dialog' + self.encryption, self) def _change_style(self, model, path, iter_, option): model[iter_][Column.NICK] = model[iter_][Column.NICK] def change_roster_style(self): self.model.foreach(self._change_style, None) def repaint_themed_widgets(self): ChatControlBase.repaint_themed_widgets(self) self.change_roster_style() def _update_banner_state_image(self): banner_status_img = self.xml.get_object('gc_banner_status_image') if self.room_jid in app.gc_connected[self.account] and \ app.gc_connected[self.account][self.room_jid]: icon = gtkgui_helpers.get_iconset_name_for('muc-active') else: icon = gtkgui_helpers.get_iconset_name_for('muc-inactive') banner_status_img.set_from_icon_name(icon, Gtk.IconSize.DND) def get_continued_conversation_name(self): """ Get the name of a continued conversation. Will return Continued Conversation if there isn't any other contact in the room """ nicks = [] for nick in app.contacts.get_nick_list(self.account, self.room_jid): if nick != self.nick: nicks.append(nick) if nicks != []: title = ', ' title = _('Conversation with ') + title.join(nicks) else: title = _('Continued conversation') return title def draw_banner_text(self): """ Draw the text in the fat line at the top of the window that houses the room jid, subject """ self.name_label.set_ellipsize(Pango.EllipsizeMode.END) font_attrs, font_attrs_small = self.get_font_attrs() if self.is_continued: name = self.get_continued_conversation_name() else: name = self.room_jid text = '%s' % (font_attrs, '\u200E' + name) self.name_label.set_markup(text) if self.subject: subject = GLib.markup_escape_text(self.subject) subject_text = self.urlfinder.sub(self.make_href, subject) subject_text = '%s' % subject_text self.subject_button.get_popover().set_text(subject_text) def _nec_vcard_published(self, obj): if obj.conn.name != self.account: return show = app.SHOW_LIST[obj.conn.connected] status = obj.conn.status obj.conn.send_gc_status(self.nick, self.room_jid, show, status) def _nec_update_avatar(self, obj): if obj.contact.room_jid != self.room_jid: return app.log('avatar').debug('Draw Groupchat Avatar: %s %s', obj.contact.name, obj.contact.avatar_sha) self.draw_avatar(obj.contact) def _nec_mam_decrypted_message_received(self, obj): if not obj.groupchat: return if obj.room_jid != self.room_jid: return self.print_conversation( obj.msgtxt, contact=obj.nick, tim=obj.timestamp, correct_id=obj.correct_id, encrypted=obj.encrypted, msg_stanza_id=obj.message_id, additional_data=obj.additional_data) def _nec_gc_message_received(self, obj): if obj.room_jid != self.room_jid or obj.conn.name != self.account: return if obj.captcha_form: if self.form_widget: self.form_widget.hide() self.form_widget.destroy() self.btn_box.destroy() dataform = dataforms.ExtendForm(node=obj.captcha_form) self.form_widget = dataforms_widget.DataFormWidget(dataform) def on_send_dataform_clicked(widget): if not self.form_widget: return form_node = self.form_widget.data_form.get_purged() form_node.type_ = 'submit' obj.conn.send_captcha(self.room_jid, form_node) self.form_widget.hide() self.form_widget.destroy() self.btn_box.destroy() self.form_widget = None del self.btn_box self.form_widget.connect('validated', on_send_dataform_clicked) self.form_widget.show_all() vbox = self.xml.get_object('gc_textviews_vbox') vbox.pack_start(self.form_widget, False, True, 0) valid_button = Gtk.Button(stock=Gtk.STOCK_OK) valid_button.connect('clicked', on_send_dataform_clicked) self.btn_box = Gtk.HButtonBox() self.btn_box.set_layout(Gtk.ButtonBoxStyle.END) self.btn_box.pack_start(valid_button, True, True, 0) self.btn_box.show_all() vbox.pack_start(self.btn_box, False, False, 0) if self.parent_win: self.parent_win.redraw_tab(self, 'attention') else: self.attention_flag = True if '100' in obj.status_code: # Room is not anonymous self.is_anonymous = False if not obj.nick: # message from server self.print_conversation( obj.msgtxt, tim=obj.timestamp, xhtml=obj.xhtml_msgtxt, displaymarking=obj.displaymarking, additional_data=obj.additional_data) else: # message from someone if obj.has_timestamp: # don't print xhtml if it's an old message. # Like that xhtml messages are grayed too. self.print_old_conversation( obj.msgtxt, contact=obj.nick, tim=obj.timestamp, xhtml=None, encrypted=obj.encrypted, displaymarking=obj.displaymarking, msg_stanza_id=obj.id_, additional_data=obj.additional_data) else: if obj.nick == self.nick: self.last_sent_txt = obj.msgtxt self.print_conversation( obj.msgtxt, contact=obj.nick, tim=obj.timestamp, xhtml=obj.xhtml_msgtxt, displaymarking=obj.displaymarking, encrypted=obj.encrypted, correct_id=obj.correct_id, msg_stanza_id=obj.id_, additional_data=obj.additional_data) obj.needs_highlight = self.needs_visual_notification(obj.msgtxt) def on_private_message(self, nick, sent, msg, tim, xhtml, session, msg_log_id=None, encrypted=False, displaymarking=None): # Do we have a queue? fjid = self.room_jid + '/' + nick no_queue = len(app.events.get_events(self.account, fjid)) == 0 event = events.PmEvent(msg, '', 'incoming', tim, encrypted, '', msg_log_id, xhtml=xhtml, session=session, form_node=None, displaymarking=displaymarking, sent_forwarded=sent) app.events.add_event(self.account, fjid, event) autopopup = app.config.get('autopopup') autopopupaway = app.config.get('autopopupaway') iter_ = self.get_contact_iter(nick) path = self.model.get_path(iter_) if not autopopup or (not autopopupaway and \ app.connections[self.account].connected > 2): if no_queue: # We didn't have a queue: we change icons state_images = \ app.interface.roster.get_appropriate_state_images( self.room_jid, icon_name='event') image = state_images['event'] self.model[iter_][Column.IMG] = image if self.parent_win: self.parent_win.show_title() self.parent_win.redraw_tab(self) else: self._start_private_message(nick) # Scroll to line path_ = path.copy() path_.up() self.list_treeview.expand_row(path_, False) self.list_treeview.scroll_to_cell(path) self.list_treeview.set_cursor(path) contact = app.contacts.get_contact_with_highest_priority( self.account, self.room_jid) if contact: app.interface.roster.draw_contact(self.room_jid, self.account) def get_contact_iter(self, nick): role_iter = self.model.get_iter_first() while role_iter: user_iter = self.model.iter_children(role_iter) while user_iter: if nick == self.model[user_iter][Column.NICK]: return user_iter else: user_iter = self.model.iter_next(user_iter) role_iter = self.model.iter_next(role_iter) return None def print_old_conversation(self, text, contact='', tim=None, xhtml = None, displaymarking=None, msg_stanza_id=None, encrypted=None, additional_data=None): if additional_data is None: additional_data = {} if contact: if contact == self.nick: # it's us kind = 'outgoing' else: kind = 'incoming' else: kind = 'status' if app.config.get('restored_messages_small'): small_attr = ['small'] else: small_attr = [] ChatControlBase.print_conversation_line(self, text, kind, contact, tim, small_attr, small_attr + ['restored_message'], small_attr + ['restored_message'], count_as_new=False, xhtml=xhtml, displaymarking=displaymarking, msg_stanza_id=msg_stanza_id, encrypted=encrypted, additional_data=additional_data) def print_conversation(self, text, contact='', tim=None, xhtml=None, graphics=True, displaymarking=None, correct_id=None, msg_stanza_id=None, encrypted=None, additional_data=None): """ Print a line in the conversation If contact is set: it's a message from someone or an info message (contact = 'info' in such a case). If contact is not set: it's a message from the server or help. """ if additional_data is None: additional_data = {} other_tags_for_name = [] other_tags_for_text = [] if contact: if contact == self.nick: # it's us kind = 'outgoing' elif contact == 'info': kind = 'info' contact = None else: kind = 'incoming' # muc-specific chatstate if self.parent_win: self.parent_win.redraw_tab(self, 'newmsg') else: kind = 'status' if kind == 'incoming': # it's a message NOT from us # highlighting and sounds (highlight, sound) = self.highlighting_for_message(text, tim) if contact in self.gc_custom_colors: other_tags_for_name.append('gc_nickname_color_' + \ str(self.gc_custom_colors[contact])) else: self.gc_count_nicknames_colors += 1 if self.gc_count_nicknames_colors == self.number_of_colors: self.gc_count_nicknames_colors = 0 self.gc_custom_colors[contact] = \ self.gc_count_nicknames_colors other_tags_for_name.append('gc_nickname_color_' + \ str(self.gc_count_nicknames_colors)) if highlight: # muc-specific chatstate if self.parent_win: self.parent_win.redraw_tab(self, 'attention') else: self.attention_flag = True other_tags_for_name.append('bold') other_tags_for_text.append('marked') if contact in self.attention_list: self.attention_list.remove(contact) elif len(self.attention_list) > 6: self.attention_list.pop(0) # remove older self.attention_list.append(contact) if text.startswith('/me ') or text.startswith('/me\n'): other_tags_for_text.append('gc_nickname_color_' + \ str(self.gc_custom_colors[contact])) self.check_and_possibly_add_focus_out_line() ChatControlBase.print_conversation_line(self, text, kind, contact, tim, other_tags_for_name, [], other_tags_for_text, xhtml=xhtml, graphics=graphics, displaymarking=displaymarking, correct_id=correct_id, msg_stanza_id=msg_stanza_id, encrypted=encrypted, additional_data=additional_data) def get_nb_unread(self): type_events = ['printed_marked_gc_msg'] if app.config.get('notify_on_all_muc_messages') or \ app.config.get_per('rooms', self.room_jid, 'notify_on_all_messages'): type_events.append('printed_gc_msg') nb = len(app.events.get_events(self.account, self.room_jid, type_events)) nb += self.get_nb_unread_pm() return nb def get_nb_unread_pm(self): nb = 0 for nick in app.contacts.get_nick_list(self.account, self.room_jid): nb += len(app.events.get_events(self.account, self.room_jid + \ '/' + nick, ['pm'])) return nb def highlighting_for_message(self, text, tim): """ Returns a 2-Tuple. The first says whether or not to highlight the text, the second, what sound to play """ highlight, sound = (None, None) # Are any of the defined highlighting words in the text? if self.needs_visual_notification(text): highlight = True if app.config.get_per('soundevents', 'muc_message_highlight', 'enabled'): sound = 'highlight' # Do we play a sound on every muc message? elif app.config.get_per('soundevents', 'muc_message_received', \ 'enabled'): sound = 'received' # Is it a history message? Don't want sound-floods when we join. if time.mktime(time.localtime()) - tim > 1: sound = None return (highlight, sound) def check_and_possibly_add_focus_out_line(self): """ Check and possibly add focus out line for room_jid if it needs it and does not already have it as last event. If it goes to add this line - remove previous line first """ win = app.interface.msg_win_mgr.get_window(self.room_jid, self.account) if win and self.room_jid == win.get_active_jid() and\ win.window.get_property('has-toplevel-focus') and\ self.parent_win.get_active_control() == self: # it's the current room and it's the focused window. # we have full focus (we are reading it!) return self.conv_textview.show_focus_out_line() def needs_visual_notification(self, text): """ Check text to see whether any of the words in (muc_highlight_words and nick) appear """ special_words = app.config.get('muc_highlight_words').split(';') special_words.append(self.nick) con = app.connections[self.account] special_words.append(con.get_own_jid().getStripped()) # Strip empties: ''.split(';') == [''] and would highlight everything. # Also lowercase everything for case insensitive compare. special_words = [word.lower() for word in special_words if word] text = text.lower() for special_word in special_words: found_here = text.find(special_word) while(found_here > -1): end_here = found_here + len(special_word) if (found_here == 0 or not text[found_here - 1].isalpha()) and \ (end_here == len(text) or not text[end_here].isalpha()): # It is beginning of text or char before is not alpha AND # it is end of text or char after is not alpha return True # continue searching start = found_here + 1 found_here = text.find(special_word, start) return False def set_subject(self, subject): self.subject = subject self.draw_banner_text() def _nec_gc_subject_received(self, obj): if obj.conn.name != self.account: return if obj.room_jid != self.room_jid: return self.set_subject(obj.subject) text = _('%(nick)s has set the subject to %(subject)s') % { 'nick': obj.nickname, 'subject': obj.subject} if obj.has_timestamp: self.print_old_conversation(text) else: self.print_conversation(text) if obj.subject == '': self.subject_button.hide() else: self.subject_button.show() def _nec_gc_config_changed_received(self, obj): # statuscode is a list # http://www.xmpp.org/extensions/xep-0045.html#roomconfig-notify # http://www.xmpp.org/extensions/xep-0045.html#registrar-statuscodes... # -init if obj.room_jid != self.room_jid or obj.conn.name != self.account: return changes = [] if '100' in obj.status_code: # Can be a presence (see chg_contact_status in groupchat_control.py) changes.append(_('Any occupant is allowed to see your full JID')) self.is_anonymous = False if '102' in obj.status_code: changes.append(_('Room now shows unavailable members')) if '103' in obj.status_code: changes.append(_('Room now does not show unavailable members')) if '104' in obj.status_code: changes.append(_('A setting not related to privacy has been ' 'changed')) if '170' in obj.status_code: # Can be a presence (see chg_contact_status in groupchat_control.py) changes.append(_('Room logging is now enabled')) if '171' in obj.status_code: changes.append(_('Room logging is now disabled')) if '172' in obj.status_code: changes.append(_('Room is now non-anonymous')) self.is_anonymous = False if '173' in obj.status_code: changes.append(_('Room is now semi-anonymous')) self.is_anonymous = True if '174' in obj.status_code: changes.append(_('Room is now fully anonymous')) self.is_anonymous = True for change in changes: self.print_conversation(change) def _nec_signed_in(self, obj): if obj.conn.name != self.account: return password = app.gc_passwords.get(self.room_jid, '') obj.conn.join_gc(self.nick, self.room_jid, password, rejoin=True) def _nec_decrypted_message_received(self, obj): if obj.conn.name != self.account: return if obj.gc_control == self and obj.resource: # We got a pm from this room nick = obj.resource if obj.session.control: # print if a control is open frm = '' if obj.sent: frm = 'out' obj.session.control.print_conversation(obj.msgtxt, frm, tim=obj.timestamp, xhtml=obj.xhtml, encrypted=obj.encrypted, displaymarking=obj.displaymarking, msg_stanza_id=obj.id_, correct_id=obj.correct_id) else: # otherwise pass it off to the control to be queued self.on_private_message(nick, obj.sent, obj.msgtxt, obj.timestamp, obj.xhtml, self.session, msg_log_id=obj.msg_log_id, encrypted=obj.encrypted, displaymarking=obj.displaymarking) def _nec_ping_reply(self, obj): if obj.control: if obj.control != self: return else: if self.contact != obj.contact: return self.print_conversation(_('Pong! (%s s.)') % obj.seconds) def got_connected(self): # Make autorejoin stop. if self.autorejoin: GLib.source_remove(self.autorejoin) self.autorejoin = None if muc_caps_cache.has_mam(self.room_jid): # Request MAM app.connections[self.account].request_archive_on_muc_join( self.room_jid) app.gc_connected[self.account][self.room_jid] = True ChatControlBase.got_connected(self) self.list_treeview.set_model(self.model) self.list_treeview.expand_all() # We don't redraw the whole banner here, because only icon change self._update_banner_state_image() if self.parent_win: self.parent_win.redraw_tab(self) formattings_button = self.xml.get_object('formattings_button') formattings_button.set_sensitive(True) self.update_actions() def got_disconnected(self): formattings_button = self.xml.get_object('formattings_button') formattings_button.set_sensitive(False) self.list_treeview.set_model(None) self.model.clear() nick_list = app.contacts.get_nick_list(self.account, self.room_jid) for nick in nick_list: # Update pm chat window fjid = self.room_jid + '/' + nick gc_contact = app.contacts.get_gc_contact(self.account, self.room_jid, nick) ctrl = app.interface.msg_win_mgr.get_control(fjid, self.account) if ctrl: gc_contact.show = 'offline' gc_contact.status = '' ctrl.update_ui() if ctrl.parent_win: ctrl.parent_win.redraw_tab(ctrl) app.contacts.remove_gc_contact(self.account, gc_contact) app.gc_connected[self.account][self.room_jid] = False ChatControlBase.got_disconnected(self) # We don't redraw the whole banner here, because only icon change self._update_banner_state_image() if self.parent_win: self.parent_win.redraw_tab(self) # Autorejoin stuff goes here. # Notice that we don't need to activate autorejoin if connection is lost # or in progress. if self.autorejoin is None and app.account_is_connected(self.account): ar_to = app.config.get('muc_autorejoin_timeout') if ar_to: self.autorejoin = GLib.timeout_add_seconds(ar_to, self.rejoin) self.update_actions() def rejoin(self): if not self.autorejoin: return False password = app.gc_passwords.get(self.room_jid, '') app.connections[self.account].join_gc(self.nick, self.room_jid, password, rejoin=True) return True def draw_roster(self): self.model.clear() for nick in app.contacts.get_nick_list(self.account, self.room_jid): gc_contact = app.contacts.get_gc_contact(self.account, self.room_jid, nick) self.add_contact_to_roster(nick, gc_contact.show, gc_contact.role, gc_contact.affiliation, gc_contact.status, gc_contact.jid) self.draw_all_roles() # Recalculate column width for ellipsizin self.list_treeview.columns_autosize() def on_send_pm(self, widget=None, model=None, iter_=None, nick=None, msg=None): """ Open a chat window and if msg is not None - send private message to a contact in a room """ if nick is None: nick = model[iter_][Column.NICK] ctrl = self._start_private_message(nick) if ctrl and msg: ctrl.send_message(msg) def draw_contact(self, nick, selected=False, focus=False): iter_ = self.get_contact_iter(nick) if not iter_: return gc_contact = app.contacts.get_gc_contact(self.account, self.room_jid, nick) theme = Gtk.IconTheme.get_default() if len(app.events.get_events(self.account, self.room_jid + '/' + \ nick)): icon_name = gtkgui_helpers.get_iconset_name_for('event') surface = theme.load_surface(icon_name, 16, self.scale_factor, None, 0) else: icon_name = gtkgui_helpers.get_iconset_name_for(gc_contact.show) surface = theme.load_surface(icon_name, 16, self.scale_factor, None, 0) name = GLib.markup_escape_text(gc_contact.name) # Strike name if blocked fjid = self.room_jid + '/' + nick if helpers.jid_is_blocked(self.account, fjid): name = '%s' % name status = gc_contact.status # add status msg, if not empty, under contact name in the treeview if status and app.config.get('show_status_msgs_in_roster'): status = status.strip() if status != '': status = helpers.reduce_chars_newlines(status, max_lines=1) # escape markup entities and make them small italic and fg color color = gtkgui_helpers.get_fade_color(self.list_treeview, selected, focus) colorstring = "#%04x%04x%04x" % (int(color.red * 65535), int(color.green * 65535), int(color.blue * 65535)) name += ('\n' '%s') % (colorstring, GLib.markup_escape_text( status)) if (gc_contact.affiliation != 'none' and app.config.get('show_affiliation_in_groupchat')): gtkgui_helpers.draw_affiliation(surface, gc_contact.affiliation) image = Gtk.Image.new_from_surface(surface) self.model[iter_][Column.IMG] = image self.model[iter_][Column.TEXT] = name def draw_avatar(self, gc_contact): if not app.config.get('show_avatars_in_roster'): return iter_ = self.get_contact_iter(gc_contact.name) if not iter_: return surface = app.interface.get_avatar( gc_contact.avatar_sha, AvatarSize.ROSTER, self.scale_factor) image = Gtk.Image.new_from_surface(surface) self.model[iter_][Column.AVATAR_IMG] = image def draw_role(self, role): role_iter = self.get_role_iter(role) if not role_iter: return role_name = helpers.get_uf_role(role, plural=True) if app.config.get('show_contacts_number'): nbr_role, nbr_total = app.contacts.get_nb_role_total_gc_contacts( self.account, self.room_jid, role) role_name += ' (%s/%s)' % (repr(nbr_role), repr(nbr_total)) self.model[role_iter][Column.TEXT] = role_name def draw_all_roles(self): for role in ('visitor', 'participant', 'moderator'): self.draw_role(role) def _nec_gc_presence_received(self, obj): if obj.room_jid != self.room_jid or obj.conn.name != self.account: return if obj.ptype == 'error': return role = obj.role if not role: role = 'visitor' affiliation = obj.affiliation if not affiliation: affiliation = 'none' newly_created = False nick = i18n.direction_mark + obj.nick nick_jid = nick + i18n.direction_mark # Set to true if role or affiliation have changed right_changed = False if obj.real_jid: # delete ressource simple_jid = app.get_jid_without_resource(obj.real_jid) nick_jid += ' (%s)' % simple_jid # status_code # http://www.xmpp.org/extensions/xep-0045.html#registrar-statuscodes-\ # init if obj.status_code: if '110' in obj.status_code: # We just join the room if self.room_jid in app.automatic_rooms[self.account] and \ app.automatic_rooms[self.account][self.room_jid]['invities']: if self.room_jid not in app.interface.instances[ self.account]['gc_config']: if obj.affiliation == 'owner': # We need to configure the room if it's a new one. # We cannot know it's a new one. Status 201 is not # sent by all servers. app.connections[self.account].request_gc_config( self.room_jid) elif 'continue_tag' in app.automatic_rooms[ self.account][self.room_jid]: # We just need to invite contacts for jid in app.automatic_rooms[self.account][ self.room_jid]['invities']: obj.conn.send_invite(self.room_jid, jid) self.print_conversation(_('%(jid)s has been ' 'invited in this room') % {'jid': jid}, graphics=False) if '100' in obj.status_code: # Can be a message (see handle_event_gc_config_change in # app.py) self.print_conversation( _('Any occupant is allowed to see your full JID')) self.is_anonymous = False if '170' in obj.status_code: # Can be a message (see handle_event_gc_config_change in # app.py) self.print_conversation(_('Room logging is enabled')) if '201' in obj.status_code: self.print_conversation(_('A new room has been created')) if '210' in obj.status_code: self.print_conversation(\ _('The server has assigned or modified your roomnick')) if obj.show in ('offline', 'error'): if obj.status_code: if '307' in obj.status_code: if obj.actor is None: # do not print 'kicked by None' s = _('%(nick)s has been kicked: %(reason)s') % { 'nick': nick, 'reason': obj.reason} else: s = _('%(nick)s has been kicked by %(who)s: ' '%(reason)s') % {'nick': nick, 'who': obj.actor, 'reason': obj.reason} self.print_conversation(s, 'info', graphics=False) if obj.nick == self.nick and not app.config.get( 'muc_autorejoin_on_kick'): self.autorejoin = False elif '301' in obj.status_code: if obj.actor is None: # do not print 'banned by None' s = _('%(nick)s has been banned: %(reason)s') % { 'nick': nick, 'reason': obj.reason} else: s = _('%(nick)s has been banned by %(who)s: ' '%(reason)s') % {'nick': nick, 'who': obj.actor, 'reason': obj.reason} self.print_conversation(s, 'info', graphics=False) if obj.nick == self.nick: self.autorejoin = False elif '303' in obj.status_code: # Someone changed his or her nick if obj.new_nick == self.new_nick or obj.nick == self.nick: # We changed our nick self.nick = obj.new_nick self.new_nick = '' s = _('You are now known as %s') % self.nick # Stop all E2E sessions nick_list = app.contacts.get_nick_list(self.account, self.room_jid) for nick_ in nick_list: fjid_ = self.room_jid + '/' + nick_ ctrl = app.interface.msg_win_mgr.get_control( fjid_, self.account) if ctrl and ctrl.session and \ ctrl.session.enable_encryption: thread_id = ctrl.session.thread_id ctrl.session.terminate_e2e() app.connections[self.account].delete_session( fjid_, thread_id) ctrl.no_autonegotiation = False else: s = _('%(nick)s is now known as %(new_nick)s') % { 'nick': nick, 'new_nick': obj.new_nick} tv = self.conv_textview if obj.nick in tv.last_received_message_id: tv.last_received_message_id[obj.new_nick] = \ tv.last_received_message_id[obj.nick] del tv.last_received_message_id[obj.nick] # We add new nick to muc roster here, so we don't see # that "new_nick has joined the room" when he just changed # nick. # add_contact_to_roster will be called a second time # after that, but that doesn't hurt self.add_contact_to_roster(obj.new_nick, obj.show, role, affiliation, obj.status, obj.real_jid) if obj.nick in self.attention_list: self.attention_list.remove(obj.nick) # keep nickname color if obj.nick in self.gc_custom_colors: self.gc_custom_colors[obj.new_nick] = \ self.gc_custom_colors[obj.nick] self.print_conversation(s, 'info', graphics=False) elif '321' in obj.status_code: s = _('%(nick)s has been removed from the room ' '(%(reason)s)') % { 'nick': nick, 'reason': _('affiliation changed') } self.print_conversation(s, 'info', graphics=False) elif '322' in obj.status_code: s = _('%(nick)s has been removed from the room ' '(%(reason)s)') % { 'nick': nick, 'reason': _('room configuration changed to ' 'members-only') } self.print_conversation(s, 'info', graphics=False) elif '332' in obj.status_code: s = _('%(nick)s has been removed from the room ' '(%(reason)s)') % {'nick': nick, 'reason': _('system shutdown') } self.print_conversation(s, 'info', graphics=False) # Room has been destroyed. elif 'destroyed' in obj.status_code: self.autorejoin = False self.print_conversation(obj.reason, 'info', graphics=False) if len(app.events.get_events(self.account, jid=obj.fjid, types=['pm'])) == 0: self.remove_contact(obj.nick) self.draw_all_roles() else: c = app.contacts.get_gc_contact(self.account, self.room_jid, obj.nick) c.show = obj.show c.status = obj.status if obj.nick == self.nick and (not obj.status_code or \ '303' not in obj.status_code): # We became offline self.got_disconnected() contact = app.contacts.\ get_contact_with_highest_priority(self.account, self.room_jid) if contact: app.interface.roster.draw_contact(self.room_jid, self.account) if self.parent_win: self.parent_win.redraw_tab(self) else: iter_ = self.get_contact_iter(obj.nick) if not iter_: if '210' in obj.status_code: # Server changed our nick self.nick = obj.nick s = _('You are now known as %s') % nick self.print_conversation(s, 'info', graphics=False) iter_ = self.add_contact_to_roster(obj.nick, obj.show, role, affiliation, obj.status, obj.real_jid, obj.avatar_sha) newly_created = True self.draw_all_roles() if obj.status_code and '201' in obj.status_code: # We just created the room app.connections[self.account].request_gc_config( self.room_jid) else: gc_c = app.contacts.get_gc_contact(self.account, self.room_jid, obj.nick) if not gc_c: log.error('%s has an iter, but no gc_contact instance' % \ obj.nick) return actual_affiliation = gc_c.affiliation if affiliation != actual_affiliation: if obj.actor: st = _('** Affiliation of %(nick)s has been set to ' '%(affiliation)s by %(actor)s') % {'nick': nick_jid, 'affiliation': affiliation, 'actor': obj.actor} else: st = _('** Affiliation of %(nick)s has been set to ' '%(affiliation)s') % {'nick': nick_jid, 'affiliation': affiliation} if obj.reason: st += ' (%s)' % obj.reason self.print_conversation(st, graphics=False) right_changed = True actual_role = self.get_role(obj.nick) if role != actual_role: self.remove_contact(obj.nick) self.add_contact_to_roster(obj.nick, obj.show, role, affiliation, obj.status, obj.real_jid) self.draw_role(actual_role) self.draw_role(role) if obj.actor: st = _('** Role of %(nick)s has been set to %(role)s ' 'by %(actor)s') % {'nick': nick_jid, 'role': role, 'actor': obj.actor} else: st = _('** Role of %(nick)s has been set to ' '%(role)s') % {'nick': nick_jid, 'role': role} if obj.reason: st += ' (%s)' % obj.reason self.print_conversation(st, graphics=False) right_changed = True else: if gc_c.show == obj.show and gc_c.status == obj.status and \ gc_c.affiliation == affiliation: # no change return gc_c.show = obj.show gc_c.affiliation = affiliation gc_c.status = obj.status self.draw_contact(obj.nick) if (time.time() - self.room_creation) > 30 and obj.nick != self.nick \ and (not obj.status_code or '303' not in obj.status_code) and not \ right_changed: st = '' print_status = None for bookmark in app.connections[self.account].bookmarks: if bookmark['jid'] == self.room_jid: print_status = bookmark.get('print_status', None) break if not print_status: print_status = app.config.get('print_status_in_muc') if obj.show == 'offline': if obj.nick in self.attention_list: self.attention_list.remove(obj.nick) if obj.show == 'offline' and print_status in ('all', 'in_and_out') \ and (not obj.status_code or '307' not in obj.status_code): st = _('%s has left') % nick_jid if obj.reason: st += ' [%s]' % obj.reason else: if newly_created and print_status in ('all', 'in_and_out'): st = _('%s has joined the group chat') % nick_jid elif print_status == 'all': st = _('%(nick)s is now %(status)s') % {'nick': nick_jid, 'status': helpers.get_uf_show(obj.show)} if st: if obj.status: st += ' (' + obj.status + ')' self.print_conversation(st, graphics=False) # Update Actions if obj.status_code: if '110' in obj.status_code: self.update_actions() def add_contact_to_roster(self, nick, show, role, affiliation, status, jid='', avatar_sha=None): role_name = helpers.get_uf_role(role, plural=True) resource = '' if jid: jids = jid.split('/', 1) j = jids[0] if len(jids) > 1: resource = jids[1] else: j = '' name = nick role_iter = self.get_role_iter(role) if not role_iter: image = gtkgui_helpers.get_image_from_icon_name('closed', self.scale_factor) role_iter = self.model.append(None, [image, role, 'role', role_name, None] + [None] * self.nb_ext_renderers) self.draw_all_roles() iter_ = self.model.append(role_iter, [None, nick, 'contact', name, None] + \ [None] * self.nb_ext_renderers) if not nick in app.contacts.get_nick_list(self.account, self.room_jid): gc_contact = app.contacts.create_gc_contact( room_jid=self.room_jid, account=self.account, name=nick, show=show, status=status, role=role, affiliation=affiliation, jid=j, resource=resource, avatar_sha=avatar_sha) app.contacts.add_gc_contact(self.account, gc_contact) else: gc_contact = app.contacts.get_gc_contact(self.account, self.room_jid, nick) self.draw_contact(nick) self.draw_avatar(gc_contact) if nick == self.nick: # we became online self.got_connected() if self.list_treeview.get_model(): self.list_treeview.expand_row((self.model.get_path(role_iter)), False) if self.is_continued: self.draw_banner_text() return iter_ def get_role_iter(self, role): role_iter = self.model.get_iter_first() while role_iter: role_name = self.model[role_iter][Column.NICK] if role == role_name: return role_iter role_iter = self.model.iter_next(role_iter) return None def remove_contact(self, nick): """ Remove a user from the contacts_list """ iter_ = self.get_contact_iter(nick) if not iter_: return gc_contact = app.contacts.get_gc_contact(self.account, self.room_jid, nick) if gc_contact: app.contacts.remove_gc_contact(self.account, gc_contact) parent_iter = self.model.iter_parent(iter_) self.model.remove(iter_) if self.model.iter_n_children(parent_iter) == 0: self.model.remove(parent_iter) def _message_sent(self, obj): if not obj.message: return if obj.account != self.account: return if obj.jid != self.room_jid: return # we'll save sent message text when we'll receive it in # _nec_gc_message_received self.last_sent_msg = obj.stanza_id if self.correcting: self.correcting = False gtkgui_helpers.remove_css_class( self.msg_textview, 'msgcorrectingcolor') def send_message(self, message, xhtml=None, process_commands=True): """ Call this function to send our message """ if not message: return if self.encryption: self.sendmessage = True app.plugin_manager.extension_point( 'send_message' + self.encryption, self) if not self.sendmessage: return if process_commands and self.process_as_command(message): return message = helpers.remove_invalid_xml_chars(message) if not message: return label = self.get_seclabel() if message != '' or message != '\n': self.save_message(message, 'sent') if self.correcting and self.last_sent_msg: correct_id = self.last_sent_msg else: correct_id = None # Set chatstate chatstate = None if app.config.get('outgoing_chat_state_notifications') != 'disabled': chatstate = 'active' self.reset_kbd_mouse_timeout_vars() self.contact.our_chatstate = chatstate # Send the message app.nec.push_outgoing_event(GcMessageOutgoingEvent( None, account=self.account, jid=self.room_jid, message=message, xhtml=xhtml, label=label, chatstate=chatstate, correct_id=correct_id, automatic_message=False)) self.msg_textview.get_buffer().set_text('') self.msg_textview.grab_focus() def get_role(self, nick): gc_contact = app.contacts.get_gc_contact(self.account, self.room_jid, nick) if gc_contact: return gc_contact.role else: return 'visitor' def minimizable(self): if self.force_non_minimizable: return False if self.contact.jid not in app.config.get_per('accounts', self.account, 'non_minimized_gc').split(' '): return True return False def minimize(self, status='offline'): # Minimize it win = app.interface.msg_win_mgr.get_window(self.contact.jid, self.account) ctrl = win.get_control(self.contact.jid, self.account) ctrl_page = win.notebook.page_num(ctrl.widget) control = win.notebook.get_nth_page(ctrl_page) win.notebook.remove_page(ctrl_page) if self.possible_paused_timeout_id: GLib.source_remove(self.possible_paused_timeout_id) self.possible_paused_timeout_id = None if self.possible_inactive_timeout_id: GLib.source_remove(self.possible_inactive_timeout_id) self.possible_inactive_timeout_id = None control.unparent() ctrl.parent_win = None self.send_chatstate('inactive', self.contact) app.interface.roster.add_groupchat(self.contact.jid, self.account, status = self.subject) del win._controls[self.account][self.contact.jid] def send_chatstate(self, state, contact): """ Send OUR chatstate as STANDLONE chat state message (eg. no body) to contact only if new chatstate is different from the previous one if jid is not specified, send to active tab """ # JEP 85 does not allow resending the same chatstate # this function checks for that and just returns so it's safe to call it # with same state. # This functions also checks for violation in state transitions # and raises RuntimeException with appropriate message # more on that http://xmpp.org/extensions/xep-0085.html#statechart # do not send if we have chat state notifications disabled # that means we won't reply to the from other peer # so we do not broadcast jep85 capabalities chatstate_setting = app.config.get('outgoing_chat_state_notifications') if chatstate_setting == 'disabled': return elif chatstate_setting == 'composing_only' and state != 'active' and\ state != 'composing': return # if the new state we wanna send (state) equals # the current state (contact.our_chatstate) then return if contact.our_chatstate == state: return # if wel're inactive prevent composing (XEP violation) if contact.our_chatstate == 'inactive' and state == 'composing': # go active before app.nec.push_outgoing_event(GcMessageOutgoingEvent(None, account=self.account, jid=self.contact.jid, chatstate='active', control=self)) contact.our_chatstate = 'active' self.reset_kbd_mouse_timeout_vars() app.nec.push_outgoing_event(GcMessageOutgoingEvent(None, account=self.account, jid=self.contact.jid, chatstate=state, control=self)) contact.our_chatstate = state if state == 'active': self.reset_kbd_mouse_timeout_vars() def shutdown(self, status='offline'): # PluginSystem: calling shutdown of super class (ChatControlBase) # to let it remove it's GUI extension points super(GroupchatControl, self).shutdown() # PluginSystem: removing GUI extension points connected with # GrouphatControl instance object app.plugin_manager.remove_gui_extension_point('groupchat_control', self) # Preventing autorejoin from being activated self.autorejoin = False app.ged.remove_event_handler('gc-presence-received', ged.GUI1, self._nec_gc_presence_received) app.ged.remove_event_handler('gc-message-received', ged.GUI1, self._nec_gc_message_received) app.ged.remove_event_handler('vcard-published', ged.GUI1, self._nec_vcard_published) app.ged.remove_event_handler('update-gc-avatar', ged.GUI1, self._nec_update_avatar) app.ged.remove_event_handler('gc-subject-received', ged.GUI1, self._nec_gc_subject_received) app.ged.remove_event_handler('gc-config-changed-received', ged.GUI1, self._nec_gc_config_changed_received) app.ged.remove_event_handler('signed-in', ged.GUI1, self._nec_signed_in) app.ged.remove_event_handler('decrypted-message-received', ged.GUI2, self._nec_decrypted_message_received) app.ged.remove_event_handler('gc-stanza-message-outgoing', ged.OUT_POSTCORE, self._message_sent) if self.room_jid in app.gc_connected[self.account] and \ app.gc_connected[self.account][self.room_jid]: app.connections[self.account].send_gc_status(self.nick, self.room_jid, show='offline', status=status) nick_list = app.contacts.get_nick_list(self.account, self.room_jid) for nick in nick_list: # Update pm chat window fjid = self.room_jid + '/' + nick ctrl = app.interface.msg_win_mgr.get_gc_control(fjid, self.account) if ctrl: contact = app.contacts.get_gc_contact(self.account, self.room_jid, nick) contact.show = 'offline' contact.status = '' ctrl.update_ui() ctrl.parent_win.redraw_tab(ctrl) for sess in app.connections[self.account].get_sessions(fjid): if sess.control: sess.control.no_autonegotiation = False if sess.enable_encryption: sess.terminate_e2e() app.connections[self.account].delete_session(fjid, sess.thread_id) # They can already be removed by the destroy function if self.room_jid in app.contacts.get_gc_list(self.account): app.contacts.remove_room(self.account, self.room_jid) del app.gc_connected[self.account][self.room_jid] # Save hpaned position app.config.set('gc-hpaned-position', self.hpaned.get_position()) # remove all register handlers on wigets, created by self.xml # to prevent circular references among objects for i in list(self.handlers.keys()): if self.handlers[i].handler_is_connected(i): self.handlers[i].disconnect(i) del self.handlers[i] # Remove unread events from systray app.events.remove_events(self.account, self.room_jid) def safe_shutdown(self): if self.minimizable(): return True includes = app.config.get('confirm_close_muc_rooms').split(' ') excludes = app.config.get('noconfirm_close_muc_rooms').split(' ') # whether to ask for comfirmation before closing muc if (app.config.get('confirm_close_muc') or self.room_jid in includes)\ and app.gc_connected[self.account][self.room_jid] and self.room_jid \ not in excludes: return False return True def allow_shutdown(self, method, on_yes, on_no, on_minimize): if self.minimizable(): on_minimize(self) return if method == self.parent_win.CLOSE_ESC: iter_ = self.list_treeview.get_selection().get_selected()[1] if iter_: self.list_treeview.get_selection().unselect_all() on_no(self) return includes = app.config.get('confirm_close_muc_rooms').split(' ') excludes = app.config.get('noconfirm_close_muc_rooms').split(' ') # whether to ask for comfirmation before closing muc if (app.config.get('confirm_close_muc') or self.room_jid in includes)\ and app.gc_connected[self.account][self.room_jid] and self.room_jid \ not in excludes: def on_ok(clicked): if clicked: # user does not want to be asked again app.config.set('confirm_close_muc', False) on_yes(self) def on_cancel(clicked): if clicked: # user does not want to be asked again app.config.set('confirm_close_muc', False) on_no(self) pritext = _('Are you sure you want to leave group chat "%s"?')\ % self.name sectext = _('If you close this window, you will be disconnected ' 'from this group chat.') dialogs.ConfirmationDialogCheck(pritext, sectext, _('_Do not ask me again'), on_response_ok=on_ok, on_response_cancel=on_cancel, transient_for=self.parent_win.window) return on_yes(self) def set_control_active(self, state): self.conv_textview.allow_focus_out_line = True self.attention_flag = False ChatControlBase.set_control_active(self, state) if not state: # add the focus-out line to the tab we are leaving self.check_and_possibly_add_focus_out_line() # Sending active to undo unread state self.parent_win.redraw_tab(self, 'active') def get_specific_unread(self): # returns the number of the number of unread msgs # for room_jid & number of unread private msgs with each contact # that we have nb = 0 for nick in app.contacts.get_nick_list(self.account, self.room_jid): fjid = self.room_jid + '/' + nick nb += len(app.events.get_events(self.account, fjid)) # gc can only have messages as event return nb def _on_change_subject_menuitem_activate(self, widget): def on_ok(subject): # Note, we don't update self.subject since we don't know whether it # will work yet app.connections[self.account].send_gc_subject(self.room_jid, subject) dialogs.InputTextDialog(_('Changing Subject'), _('Please specify the new subject:'), input_str=self.subject, ok_handler=on_ok, transient_for=self.parent_win.window) def _on_drag_data_received(self, widget, context, x, y, selection, target_type, timestamp): if not selection.get_data(): return # get contact info contact = contacts.Contact(jid=self.room_jid, account=self.account) if target_type == self.TARGET_TYPE_URI_LIST: # file drag and drop (handled in chat_control_base) self.drag_data_file_transfer(contact, selection, self) else: # Invite contact to groupchat treeview = app.interface.roster.tree model = treeview.get_model() data = selection.get_data() path = treeview.get_selection().get_selected_rows()[1][0] iter_ = model.get_iter(path) type_ = model[iter_][2] if type_ != 'contact': # source is not a contact return contact_jid = data app.connections[self.account].send_invite(self.room_jid, contact_jid) self.print_conversation(_('%(jid)s has been invited in this room') % {'jid': contact_jid}, graphics=False) def _on_message_textview_key_press_event(self, widget, event): res = ChatControlBase._on_message_textview_key_press_event(self, widget, event) if res: return True if event.keyval == Gdk.KEY_Tab: # TAB message_buffer = widget.get_buffer() start_iter, end_iter = message_buffer.get_bounds() cursor_position = message_buffer.get_insert() end_iter = message_buffer.get_iter_at_mark(cursor_position) text = message_buffer.get_text(start_iter, end_iter, False) splitted_text = text.split() # nick completion # check if tab is pressed with empty message if len(splitted_text): # if there are any words begin = splitted_text[-1] # last word we typed else: begin = '' gc_refer_to_nick_char = app.config.get('gc_refer_to_nick_char') with_refer_to_nick_char = False after_nick_len = 1 # the space that is printed after we type [Tab] # first part of this if : works fine even if refer_to_nick_char if gc_refer_to_nick_char and text.endswith( gc_refer_to_nick_char + ' '): with_refer_to_nick_char = True after_nick_len = len(gc_refer_to_nick_char + ' ') if len(self.nick_hits) and self.last_key_tabs and \ text[:-after_nick_len].endswith(self.nick_hits[0]): # we should cycle # Previous nick in list may had a space inside, so we check text # and not splitted_text and store it into 'begin' var self.nick_hits.append(self.nick_hits[0]) begin = self.nick_hits.pop(0) else: self.nick_hits = [] # clear the hit list list_nick = app.contacts.get_nick_list(self.account, self.room_jid) list_nick.sort(key=str.lower) # case-insensitive sort if begin == '': # empty message, show lasts nicks that highlighted us first for nick in self.attention_list: if nick in list_nick: list_nick.remove(nick) list_nick.insert(0, nick) if self.nick in list_nick: list_nick.remove(self.nick) # Skip self for nick in list_nick: fjid = self.room_jid + '/' + nick if nick.lower().startswith(begin.lower()) and not \ helpers.jid_is_blocked(self.account, fjid): # the word is the begining of a nick self.nick_hits.append(nick) if len(self.nick_hits): if len(splitted_text) < 2 or with_refer_to_nick_char: # This is the 1st word of the line or no word or we are cycling # at the beginning, possibly with a space in one nick add = gc_refer_to_nick_char + ' ' else: add = ' ' start_iter = end_iter.copy() if self.last_key_tabs and with_refer_to_nick_char or (text and \ text[-1] == ' '): # have to accomodate for the added space from last # completion # gc_refer_to_nick_char may be more than one char! start_iter.backward_chars(len(begin) + len(add)) elif self.last_key_tabs and not app.config.get( 'shell_like_completion'): # have to accomodate for the added space from last # completion start_iter.backward_chars(len(begin) + \ len(gc_refer_to_nick_char)) else: start_iter.backward_chars(len(begin)) message_buffer.delete(start_iter, end_iter) # get a shell-like completion # if there's more than one nick for this completion, complete # only the part that all these nicks have in common if app.config.get('shell_like_completion') and \ len(self.nick_hits) > 1: end = False completion = '' add = "" # if nick is not complete, don't add anything while not end and len(completion) < len(self.nick_hits[0]): completion = self.nick_hits[0][:len(completion)+1] for nick in self.nick_hits: if completion.lower() not in nick.lower(): end = True completion = completion[:-1] break # if the current nick matches a COMPLETE existing nick, # and if the user tab TWICE, complete that nick (with the # "add") if self.last_key_tabs: for nick in self.nick_hits: if nick == completion: # The user seems to want this nick, so # complete it as if it were the only nick # available add = gc_refer_to_nick_char + ' ' else: completion = self.nick_hits[0] message_buffer.insert_at_cursor(completion + add) self.last_key_tabs = True return True self.last_key_tabs = False def on_list_treeview_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: selection = widget.get_selection() iter_ = selection.get_selected()[1] if iter_: widget.get_selection().unselect_all() return True def on_list_treeview_row_expanded(self, widget, iter_, path): """ When a row is expanded: change the icon of the arrow """ model = widget.get_model() image = gtkgui_helpers.get_image_from_icon_name( 'opened', self.scale_factor) model[iter_][Column.IMG] = image def on_list_treeview_row_collapsed(self, widget, iter_, path): """ When a row is collapsed: change the icon of the arrow """ model = widget.get_model() image = gtkgui_helpers.get_image_from_icon_name( 'closed', self.scale_factor) model[iter_][Column.IMG] = image def kick(self, widget, nick): """ Kick a user """ def on_ok(reason): app.connections[self.account].gc_set_role(self.room_jid, nick, 'none', reason) # ask for reason dialogs.InputDialog(_('Kicking %s') % nick, _('You may specify a reason below:'), ok_handler=on_ok, transient_for=self.parent_win.window) def mk_menu(self, event, iter_): """ Make contact's popup menu """ nick = self.model[iter_][Column.NICK] c = app.contacts.get_gc_contact(self.account, self.room_jid, nick) fjid = self.room_jid + '/' + nick jid = c.jid target_affiliation = c.affiliation target_role = c.role # looking for user's affiliation and role user_nick = self.nick user_affiliation = app.contacts.get_gc_contact(self.account, self.room_jid, user_nick).affiliation user_role = self.get_role(user_nick) # making menu from gtk builder xml = gtkgui_helpers.get_gtk_builder('gc_occupants_menu.ui') # these conditions were taken from JEP 0045 item = xml.get_object('kick_menuitem') if user_role != 'moderator' or \ (user_affiliation == 'admin' and target_affiliation == 'owner') or \ (user_affiliation == 'member' and target_affiliation in ('admin', 'owner')) or (user_affiliation == 'none' and target_affiliation != \ 'none'): item.set_sensitive(False) id_ = item.connect('activate', self.kick, nick) self.handlers[id_] = item item = xml.get_object('voice_checkmenuitem') item.set_active(target_role != 'visitor') if user_role != 'moderator' or \ user_affiliation == 'none' or \ (user_affiliation=='member' and target_affiliation!='none') or \ target_affiliation in ('admin', 'owner'): item.set_sensitive(False) id_ = item.connect('activate', self.on_voice_checkmenuitem_activate, nick) self.handlers[id_] = item item = xml.get_object('moderator_checkmenuitem') item.set_active(target_role == 'moderator') if not user_affiliation in ('admin', 'owner') or \ target_affiliation in ('admin', 'owner'): item.set_sensitive(False) id_ = item.connect('activate', self.on_moderator_checkmenuitem_activate, nick) self.handlers[id_] = item item = xml.get_object('ban_menuitem') if not user_affiliation in ('admin', 'owner') or \ (target_affiliation in ('admin', 'owner') and\ user_affiliation != 'owner'): item.set_sensitive(False) id_ = item.connect('activate', self.ban, jid) self.handlers[id_] = item item = xml.get_object('member_checkmenuitem') item.set_active(target_affiliation != 'none') if not user_affiliation in ('admin', 'owner') or \ (user_affiliation != 'owner' and target_affiliation in ('admin', 'owner')): item.set_sensitive(False) id_ = item.connect('activate', self.on_member_checkmenuitem_activate, jid) self.handlers[id_] = item item = xml.get_object('admin_checkmenuitem') item.set_active(target_affiliation in ('admin', 'owner')) if not user_affiliation == 'owner': item.set_sensitive(False) id_ = item.connect('activate', self.on_admin_checkmenuitem_activate, jid) self.handlers[id_] = item item = xml.get_object('owner_checkmenuitem') item.set_active(target_affiliation == 'owner') if not user_affiliation == 'owner': item.set_sensitive(False) id_ = item.connect('activate', self.on_owner_checkmenuitem_activate, jid) self.handlers[id_] = item item = xml.get_object('invite_menuitem') if jid and c.name != self.nick: bookmarked = False contact = app.contacts.get_contact(self.account, jid, c.resource) if contact and contact.supports(nbxmpp.NS_CONFERENCE): bookmarked=True gui_menu_builder.build_invite_submenu(item, ((c, self.account),), ignore_rooms=[self.room_jid], show_bookmarked=bookmarked) else: item.set_sensitive(False) item = xml.get_object('information_menuitem') id_ = item.connect('activate', self.on_info, nick) self.handlers[id_] = item item = xml.get_object('history_menuitem') id_ = item.connect('activate', self.on_history, nick) self.handlers[id_] = item item = xml.get_object('add_to_roster_menuitem') our_jid = app.get_jid_from_account(self.account) if not jid or jid == our_jid or not app.connections[self.account].\ roster_supported: item.set_sensitive(False) else: id_ = item.connect('activate', self.on_add_to_roster, jid) self.handlers[id_] = item item = xml.get_object('execute_command_menuitem') id_ = item.connect('activate', self._on_execute_command_occupant, nick) self.handlers[id_] = item item = xml.get_object('block_menuitem') item2 = xml.get_object('unblock_menuitem') if not app.connections[self.account].privacy_rules_supported: item2.set_no_show_all(True) item.set_no_show_all(True) item.hide() item2.hide() elif helpers.jid_is_blocked(self.account, fjid): item.set_no_show_all(True) item.hide() id_ = item2.connect('activate', self.on_unblock, nick) self.handlers[id_] = item2 else: id_ = item.connect('activate', self.on_block, nick) self.handlers[id_] = item item2.set_no_show_all(True) item2.hide() item = xml.get_object('send_private_message_menuitem') id_ = item.connect('activate', self.on_send_pm, self.model, iter_) self.handlers[id_] = item item = xml.get_object('send_file_menuitem') if not c.resource: item.set_sensitive(False) else: item.set_sensitive(False) # ToDo: integrate HTTP File Upload id_ = item.connect('activate', self._on_send_file_jingle, c) self.handlers[id_] = item # show the popup now! menu = xml.get_object('gc_occupants_menu') menu.show_all() menu.attach_to_widget(app.interface.roster.window, None) menu.popup(None, None, None, None, event.button, event.time) def _start_private_message(self, nick): gc_c = app.contacts.get_gc_contact(self.account, self.room_jid, nick) nick_jid = gc_c.get_full_jid() ctrl = app.interface.msg_win_mgr.get_control(nick_jid, self.account) if not ctrl: ctrl = app.interface.new_private_chat(gc_c, self.account) if ctrl: ctrl.parent_win.set_active_tab(ctrl) return ctrl def _on_execute_command_occupant(self, widget, nick): jid = self.room_jid + '/' + nick adhoc_commands.CommandWindow(self.account, jid) def on_row_activated(self, widget, path): """ When an iter is activated (dubblick or single click if gnome is set this way """ if path.get_depth() == 1: # It's a group if (widget.row_expanded(path)): widget.collapse_row(path) else: widget.expand_row(path, False) else: # We want to send a private message nick = self.model[path][Column.NICK] self._start_private_message(nick) def on_list_treeview_row_activated(self, widget, path, col=0): """ When an iter is double clicked: open the chat window """ if not app.single_click: self.on_row_activated(widget, path) def on_list_treeview_button_press_event(self, widget, event): """ Popup user's group's or agent menu """ try: pos = widget.get_path_at_pos(int(event.x), int(event.y)) path, x = pos[0], pos[2] except TypeError: widget.get_selection().unselect_all() return if event.button == 3: # right click widget.get_selection().select_path(path) iter_ = self.model.get_iter(path) if path.get_depth() == 2: self.mk_menu(event, iter_) return True elif event.button == 2: # middle click widget.get_selection().select_path(path) iter_ = self.model.get_iter(path) if path.get_depth() == 2: nick = self.model[iter_][Column.NICK] self._start_private_message(nick) return True elif event.button == 1: # left click if app.single_click and not event.get_state() & Gdk.ModifierType.SHIFT_MASK: self.on_row_activated(widget, path) return True else: iter_ = self.model.get_iter(path) nick = self.model[iter_][Column.NICK] if not nick in app.contacts.get_nick_list(self.account, self.room_jid): # it's a group if x < 27: if (widget.row_expanded(path)): widget.collapse_row(path) else: widget.expand_row(path, False) elif event.get_state() & Gdk.ModifierType.SHIFT_MASK: self.append_nick_in_msg_textview(self.msg_textview, nick) self.msg_textview.grab_focus() return True def append_nick_in_msg_textview(self, widget, nick): message_buffer = self.msg_textview.get_buffer() start_iter, end_iter = message_buffer.get_bounds() cursor_position = message_buffer.get_insert() end_iter = message_buffer.get_iter_at_mark(cursor_position) text = message_buffer.get_text(start_iter, end_iter, False) start = '' if text: # Cursor is not at first position if not text[-1] in (' ', '\n', '\t'): start = ' ' add = ' ' else: gc_refer_to_nick_char = app.config.get('gc_refer_to_nick_char') add = gc_refer_to_nick_char + ' ' message_buffer.insert_at_cursor(start + nick + add) def grant_voice(self, widget, nick): """ Grant voice privilege to a user """ app.connections[self.account].gc_set_role(self.room_jid, nick, 'participant') def revoke_voice(self, widget, nick): """ Revoke voice privilege to a user """ app.connections[self.account].gc_set_role(self.room_jid, nick, 'visitor') def grant_moderator(self, widget, nick): """ Grant moderator privilege to a user """ app.connections[self.account].gc_set_role(self.room_jid, nick, 'moderator') def revoke_moderator(self, widget, nick): """ Revoke moderator privilege to a user """ app.connections[self.account].gc_set_role(self.room_jid, nick, 'participant') def ban(self, widget, jid): """ Ban a user """ def on_ok(reason): app.connections[self.account].gc_set_affiliation(self.room_jid, jid, 'outcast', reason) # to ban we know the real jid. so jid is not fakejid nick = app.get_nick_from_jid(jid) # ask for reason dialogs.InputDialog(_('Banning %s') % nick, _('You may specify a reason below:'), ok_handler=on_ok, transient_for=self.parent_win.window) def grant_membership(self, widget, jid): """ Grant membership privilege to a user """ app.connections[self.account].gc_set_affiliation(self.room_jid, jid, 'member') def revoke_membership(self, widget, jid): """ Revoke membership privilege to a user """ app.connections[self.account].gc_set_affiliation(self.room_jid, jid, 'none') def grant_admin(self, widget, jid): """ Grant administrative privilege to a user """ app.connections[self.account].gc_set_affiliation(self.room_jid, jid, 'admin') def revoke_admin(self, widget, jid): """ Revoke administrative privilege to a user """ app.connections[self.account].gc_set_affiliation(self.room_jid, jid, 'member') def grant_owner(self, widget, jid): """ Grant owner privilege to a user """ app.connections[self.account].gc_set_affiliation(self.room_jid, jid, 'owner') def revoke_owner(self, widget, jid): """ Revoke owner privilege to a user """ app.connections[self.account].gc_set_affiliation(self.room_jid, jid, 'admin') def on_info(self, widget, nick): """ Call vcard_information_window class to display user's information """ gc_contact = app.contacts.get_gc_contact(self.account, self.room_jid, nick) contact = gc_contact.as_contact() if contact.jid in app.interface.instances[self.account]['infos']: app.interface.instances[self.account]['infos'][contact.jid].\ window.present() else: app.interface.instances[self.account]['infos'][contact.jid] = \ vcard.VcardWindow(contact, self.account, gc_contact) def on_history(self, widget, nick): jid = app.construct_fjid(self.room_jid, nick) self._on_history_menuitem_activate(widget=widget, jid=jid) def on_add_to_roster(self, widget, jid): dialogs.AddNewContactWindow(self.account, jid) def on_block(self, widget, nick): fjid = self.room_jid + '/' + nick connection = app.connections[self.account] default = connection.privacy_default_list if fjid in connection.blocked_contacts: return max_order = connection.get_max_blocked_list_order() new_rule = {'order': str(max_order + 1), 'type': 'jid', 'action': 'deny', 'value' : fjid, 'child': ['message', 'iq', 'presence-out']} connection.blocked_list.append(new_rule) connection.blocked_contacts.append(fjid) self.draw_contact(nick) connection.set_privacy_list(default, connection.blocked_list) if len(connection.blocked_list) == 1: connection.set_default_list(default) def on_unblock(self, widget, nick): fjid = self.room_jid + '/' + nick connection = app.connections[self.account] default = connection.privacy_default_list connection.new_blocked_list = [] # needed for draw_contact: if fjid in connection.blocked_contacts: connection.blocked_contacts.remove(fjid) self.draw_contact(nick) for rule in connection.blocked_list: if rule['action'] != 'deny' or rule['type'] != 'jid' \ or rule['value'] != fjid: connection.new_blocked_list.append(rule) if len(connection.new_blocked_list) == 0: connection.blocked_list = [] connection.blocked_contacts = [] connection.blocked_groups = [] connection.set_default_list('') connection.del_privacy_list(default) if 'privay_list_block' in app.interface.instances[self.account]: del app.interface.instances[self.account]\ ['privay_list_block'] else: connection.set_privacy_list(default, connection.new_blocked_list) def on_voice_checkmenuitem_activate(self, widget, nick): if widget.get_active(): self.grant_voice(widget, nick) else: self.revoke_voice(widget, nick) def on_moderator_checkmenuitem_activate(self, widget, nick): if widget.get_active(): self.grant_moderator(widget, nick) else: self.revoke_moderator(widget, nick) def on_member_checkmenuitem_activate(self, widget, jid): if widget.get_active(): self.grant_membership(widget, jid) else: self.revoke_membership(widget, jid) def on_admin_checkmenuitem_activate(self, widget, jid): if widget.get_active(): self.grant_admin(widget, jid) else: self.revoke_admin(widget, jid) def on_owner_checkmenuitem_activate(self, widget, jid): if widget.get_active(): self.grant_owner(widget, jid) else: self.revoke_owner(widget, jid) class SubjectPopover(Gtk.Popover): def __init__(self): Gtk.Popover.__init__(self) self.set_name('SubjectPopover') scrolledwindow = Gtk.ScrolledWindow() scrolledwindow.set_max_content_height(250) scrolledwindow.set_propagate_natural_height(True) scrolledwindow.set_propagate_natural_width(True) scrolledwindow.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) self.label = Gtk.Label() self.label.set_line_wrap(True) self.label.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) self.label.set_max_width_chars(80) scrolledwindow.add(self.label) box = Gtk.Box() box.add(scrolledwindow) box.show_all() self.add(box) self.connect_after('show', self._after_show) def set_text(self, text): self.label.set_markup(text) def _after_show(self, *args): # Gtk Bug: If we set selectable True, on show # everything inside the Label is selected. # So we switch after show to False and again to True self.label.set_selectable(False) self.label.set_selectable(True) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/groups.py000066400000000000000000000050441326020644600236660ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/groups.py ## ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2006 Tomasz Melcer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## '''Window to create new post for discussion groups service.''' from gajim.common import app from nbxmpp import Node from gajim import gtkgui_helpers class GroupsPostWindow: def __init__(self, account, servicejid, groupid): """ Open new 'create post' window to create message for groupid on servicejid service """ assert isinstance(servicejid, str) assert isinstance(groupid, str) self.account = account self.servicejid = servicejid self.groupid = groupid self.xml = gtkgui_helpers.get_gtk_builder('groups_post_window.ui') self.window = self.xml.get_object('groups_post_window') for name in ('from_entry', 'subject_entry', 'contents_textview'): self.__dict__[name] = self.xml.get_object(name) self.xml.connect_signals(self) self.window.show_all() def on_cancel_button_clicked(self, w): """ Close window """ self.window.destroy() def on_send_button_clicked(self, w): """ Gather info from widgets and send it as a message """ # constructing item to publish... that's atom:entry element item = Node('entry', {'xmlns':'http://www.w3.org/2005/Atom'}) author = item.addChild('author') author.addChild('name', {}, [self.from_entry.get_text()]) item.addChild('generator', {}, ['Gajim']) item.addChild('title', {}, [self.subject_entry.get_text()]) buf = self.contents_textview.get_buffer() item.addChild('content', {}, [buf.get_text(buf.get_start_iter(), buf.get_end_iter(), True)]) # publish it to node app.connections[self.account].send_pb_publish(self.servicejid, self.groupid, item, '0') # close the window self.window.destroy() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/gtkexcepthook.py000066400000000000000000000100001326020644600252120ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## gajim/gtkexcepthook.py ## ## Copyright (C) 2016-2018 Philipp Hörist ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2005-2014 Yann Leboulanger ## Copyright (C) 2008 Stephan Erb ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import sys import os import traceback import threading import webbrowser import platform from io import StringIO from urllib.parse import urlencode import nbxmpp import gajim import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, GObject if __name__ == '__main__': glade_file = os.path.join('data', 'gui', 'exception_dialog.ui') else: from gajim.common import configpaths glade_file = os.path.join(configpaths.get('GUI'), 'exception_dialog.ui') _exception_in_progress = threading.Lock() ISSUE_TEXT = '''## Versions - OS: {} - GTK+ Version: {} - PyGObject Version: {} - python-nbxmpp Version: {} - Gajim Version: {} ## Traceback ``` {} ``` ## Steps to reproduce the problem ...''' def _hook(type_, value, tb): if not _exception_in_progress.acquire(False): # Exceptions have piled up, so we use the default exception # handler for such exceptions sys.__excepthook__(type_, value, tb) return ExceptionDialog(type_, value, tb) _exception_in_progress.release() class ExceptionDialog(): def __init__(self, type_, value, tb): builder = Gtk.Builder() builder.add_from_file(glade_file) self.dialog = builder.get_object("ExceptionDialog") builder.connect_signals(self) builder.get_object("report_btn").grab_focus() self.exception_view = builder.get_object("exception_view") buffer_ = self.exception_view.get_buffer() trace = StringIO() traceback.print_exception(type_, value, tb, None, trace) self.text = self.get_issue_text(trace.getvalue()) buffer_.set_text(self.text) self.exception_view.set_editable(False) self.dialog.show() def on_report_clicked(self, *args): issue_url = 'https://dev.gajim.org/gajim/gajim/issues/new' params = {'issue[description]': self.text} url = '{}?{}'.format(issue_url, urlencode(params)) webbrowser.open(url, new=2) def on_close_clicked(self, *args): self.dialog.destroy() def get_issue_text(self, traceback_text): gtk_ver = '%i.%i.%i' % ( Gtk.get_major_version(), Gtk.get_minor_version(), Gtk.get_micro_version()) gobject_ver = '.'.join(map(str, GObject.pygobject_version)) return ISSUE_TEXT.format(get_os_info(), gtk_ver, gobject_ver, nbxmpp.__version__, gajim.__version__, traceback_text) def init(): if os.name == 'nt' or not sys.stderr.isatty(): sys.excepthook = _hook def get_os_info(): if os.name == 'nt' or sys.platform == 'darwin': return platform.system() + " " + platform.release() elif os.name == 'posix': try: import distro return distro.name(pretty=True) except ImportError: return platform.system() return '' # this is just to assist testing (python3 gtkexcepthook.py) if __name__ == '__main__': init() print(sys.version) ExceptionDialog(None, None, None) Gtk.main() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/gtkgui_helpers.py000066400000000000000000000762021326020644600253670ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/gtkgui_helpers.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2005-2006 Dimitur Kirov ## Copyright (C) 2005-2007 Nikos Kouremenos ## Copyright (C) 2006 Travis Shirk ## Copyright (C) 2006-2007 Junglecow J ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2007 James Newton ## Julien Pivotto ## Copyright (C) 2007-2008 Stephan Erb ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import xml.sax.saxutils import gi from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GdkPixbuf from gi.repository import GLib from gi.repository import Pango import cairo import os import sys try: from PIL import Image except: pass from io import BytesIO import logging log = logging.getLogger('gajim.gtkgui_helpers') from gajim.common import i18n from gajim.common import app from gajim.common import pep from gajim.common import configpaths gtk_icon_theme = Gtk.IconTheme.get_default() gtk_icon_theme.append_search_path(app.ICONS_DIR) class Color: BLACK = Gdk.RGBA(red=0, green=0, blue=0, alpha=1) GREEN = Gdk.RGBA(red=115/255, green=210/255, blue=22/255, alpha=1) RED = Gdk.RGBA(red=204/255, green=0, blue=0, alpha=1) GREY = Gdk.RGBA(red=195/255, green=195/255, blue=192/255, alpha=1) ORANGE = Gdk.RGBA(red=245/255, green=121/255, blue=0/255, alpha=1) def get_icon_pixmap(icon_name, size=16, color=None, quiet=False): try: iconinfo = gtk_icon_theme.lookup_icon(icon_name, size, 0) if not iconinfo: raise GLib.GError if color: pixbuf, was_symbolic = iconinfo.load_symbolic(*color) return pixbuf return iconinfo.load_icon() except GLib.GError as e: if not quiet: log.error('Unable to load icon %s: %s' % (icon_name, str(e))) def get_icon_path(icon_name, size=16): try: icon_info = gtk_icon_theme.lookup_icon(icon_name, size, 0) if icon_info == None: log.error('Icon not found: %s' % icon_name) return "" else: return icon_info.get_filename() except GLib.GError as e: log.error("Unable to find icon %s: %s" % (icon_name, str(e))) HAS_PYWIN32 = True if os.name == 'nt': try: import win32file import win32con import pywintypes except ImportError: HAS_PYWIN32 = False from gajim.common import helpers def get_total_screen_geometry(): screen = Gdk.Screen.get_default() window = Gdk.Screen.get_root_window(screen) return window.get_width(), window.get_height() def add_image_to_button(button, icon_name): img = Gtk.Image() path_img = get_icon_path(icon_name) img.set_from_file(path_img) button.set_image(img) def get_image_button(icon_name, tooltip, toggle=False): if toggle: button = Gtk.ToggleButton() icon = get_icon_pixmap(icon_name) image = Gtk.Image() image.set_from_pixbuf(icon) button.set_image(image) else: button = Gtk.Button.new_from_icon_name( icon_name, Gtk.IconSize.MENU) button.set_tooltip_text(tooltip) return button def get_gtk_builder(file_name, widget=None): file_path = os.path.join(configpaths.get('GUI'), file_name) builder = Gtk.Builder() builder.set_translation_domain(i18n.APP) if widget: builder.add_objects_from_file(file_path, [widget]) else: builder.add_from_file(file_path) return builder def get_completion_liststore(entry): """ Create a completion model for entry widget completion list consists of (Pixbuf, Text) rows """ completion = Gtk.EntryCompletion() liststore = Gtk.ListStore(str, str) render_pixbuf = Gtk.CellRendererPixbuf() completion.pack_start(render_pixbuf, False) completion.add_attribute(render_pixbuf, 'icon_name', 0) render_text = Gtk.CellRendererText() completion.pack_start(render_text, True) completion.add_attribute(render_text, 'text', 1) completion.set_property('text_column', 1) completion.set_model(liststore) entry.set_completion(completion) return liststore def get_theme_font_for_option(theme, option): """ Return string description of the font, stored in theme preferences """ font_name = app.config.get_per('themes', theme, option) font_desc = Pango.FontDescription() font_prop_str = app.config.get_per('themes', theme, option + 'attrs') if font_prop_str: if font_prop_str.find('B') != -1: font_desc.set_weight(Pango.Weight.BOLD) if font_prop_str.find('I') != -1: font_desc.set_style(Pango.Style.ITALIC) fd = Pango.FontDescription(font_name) fd.merge(font_desc, True) return fd.to_string() def move_window(window, x, y): """ Move the window, but also check if out of screen """ screen_w, screen_h = get_total_screen_geometry() if x < 0: x = 0 if y < 0: y = 0 w, h = window.get_size() if x + w > screen_w: x = screen_w - w if y + h > screen_h: y = screen_h - h window.move(x, y) def resize_window(window, w, h): """ Resize window, but also checks if huge window or negative values """ screen_w, screen_h = get_total_screen_geometry() if not w or not h: return if w > screen_w: w = screen_w if h > screen_h: h = screen_h window.resize(abs(w), abs(h)) def at_the_end(widget): """Determines if a Scrollbar in a GtkScrolledWindow is at the end. Args: widget (GtkScrolledWindow) Returns: bool: The return value is True if at the end, False if not. """ adj_v = widget.get_vadjustment() max_scroll_pos = adj_v.get_upper() - adj_v.get_page_size() at_the_end = (adj_v.get_value() == max_scroll_pos) return at_the_end def scroll_to_end(widget): """Scrolls to the end of a GtkScrolledWindow. Args: widget (GtkScrolledWindow) Returns: bool: The return value is False so it can be used with GLib.idle_add. """ adj_v = widget.get_vadjustment() if adj_v is None: # This can happen when the Widget is already destroyed when called # from GLib.idle_add return False max_scroll_pos = adj_v.get_upper() - adj_v.get_page_size() adj_v.set_value(max_scroll_pos) adj_h = widget.get_hadjustment() adj_h.set_value(0) return False class ServersXMLHandler(xml.sax.ContentHandler): def __init__(self): xml.sax.ContentHandler.__init__(self) self.servers = [] def startElement(self, name, attributes): if name == 'item': if 'jid' in attributes.getNames(): self.servers.append(attributes.getValue('jid')) def endElement(self, name): pass def parse_server_xml(path_to_file): try: handler = ServersXMLHandler() xml.sax.parse(path_to_file, handler) return handler.servers # handle exception if unable to open file except IOError as message: print(_('Error reading file:') + str(message), file=sys.stderr) # handle exception parsing file except xml.sax.SAXParseException as message: print(_('Error parsing file:') + str(message), file=sys.stderr) def set_unset_urgency_hint(window, unread_messages_no): """ Sets/unset urgency hint in window argument depending if we have unread messages or not """ if app.config.get('use_urgency_hint'): if unread_messages_no > 0: window.props.urgency_hint = True else: window.props.urgency_hint = False def get_pixbuf_from_data(file_data): """ Get image data and returns GdkPixbuf.Pixbuf """ pixbufloader = GdkPixbuf.PixbufLoader() try: pixbufloader.write(file_data) pixbufloader.close() pixbuf = pixbufloader.get_pixbuf() except GLib.GError: pixbufloader.close() log.warning('loading avatar using pixbufloader failed, trying to ' 'convert avatar image using pillow') try: avatar = Image.open(BytesIO(file_data)).convert("RGBA") array = GLib.Bytes.new(avatar.tobytes()) width, height = avatar.size pixbuf = GdkPixbuf.Pixbuf.new_from_bytes( array, GdkPixbuf.Colorspace.RGB, True, 8, width, height, width * 4) except Exception: log.warning('Could not use pillow to convert avatar image, ' 'image cannot be displayed', exc_info=True) return return pixbuf def get_cursor(attr): display = Gdk.Display.get_default() cursor = getattr(Gdk.CursorType, attr) return Gdk.Cursor.new_for_display(display, cursor) def get_current_desktop(window): """ Return the current virtual desktop for given window NOTE: Window is a GDK window. """ prop = window.property_get('_NET_CURRENT_DESKTOP') if prop is None: # it means it's normal window (not root window) # so we look for it's current virtual desktop in another property prop = window.property_get('_NET_WM_DESKTOP') if prop is not None: # f.e. prop is ('CARDINAL', 32, [0]) we want 0 or 1.. from [0] current_virtual_desktop_no = prop[2][0] return current_virtual_desktop_no def possibly_move_window_in_current_desktop(window): """ Moves GTK window to current virtual desktop if it is not in the current virtual desktop NOTE: Window is a GDK window. """ #TODO: property_get doesn't work: #prop_atom = Gdk.Atom.intern('_NET_CURRENT_DESKTOP', False) #type_atom = Gdk.Atom.intern("CARDINAL", False) #w = Gdk.Screen.get_default().get_root_window() #Gdk.property_get(w, prop_atom, type_atom, 0, 9999, False) return False if os.name == 'nt': return False root_window = Gdk.Screen.get_default().get_root_window() # current user's vd current_virtual_desktop_no = get_current_desktop(root_window) # vd roster window is in window_virtual_desktop = get_current_desktop(window.window) # if one of those is None, something went wrong and we cannot know # VD info, just hide it (default action) and not show it afterwards if None not in (window_virtual_desktop, current_virtual_desktop_no): if current_virtual_desktop_no != window_virtual_desktop: # we are in another VD that the window was # so show it in current VD window.present() return True return False def file_is_locked(path_to_file): """ Return True if file is locked NOTE: Windows only. """ if os.name != 'nt': # just in case return if not HAS_PYWIN32: return secur_att = pywintypes.SECURITY_ATTRIBUTES() secur_att.Initialize() try: # try make a handle for READING the file hfile = win32file.CreateFile( path_to_file, # path to file win32con.GENERIC_READ, # open for reading 0, # do not share with other proc secur_att, win32con.OPEN_EXISTING, # existing file only win32con.FILE_ATTRIBUTE_NORMAL, # normal file 0 # no attr. template ) except pywintypes.error: return True else: # in case all went ok, close file handle (go to hell WinAPI) hfile.Close() return False def get_fade_color(treeview, selected, focused): """ Get a gdk RGBA color that is between foreground and background in 0.3 0.7 respectively colors of the cell for the given treeview """ context = treeview.get_style_context() if selected: if focused: # is the window focused? state = Gtk.StateFlags.SELECTED else: # is it not? NOTE: many gtk themes change bg on this state = Gtk.StateFlags.ACTIVE else: state = Gtk.StateFlags.NORMAL bg = context.get_property('background-color', state) fg = context.get_color(state) p = 0.3 # background q = 0.7 # foreground # p + q should do 1.0 return Gdk.RGBA(bg.red*p + fg.red*q, bg.green*p + fg.green*q, bg.blue*p + fg.blue*q) def make_gtk_month_python_month(month): """ GTK starts counting months from 0, so January is 0 but Python's time start from 1, so align to Python NOTE: Month MUST be an integer. """ return month + 1 def make_python_month_gtk_month(month): return month - 1 def make_pixbuf_grayscale(pixbuf): pixbuf2 = pixbuf.copy() pixbuf.saturate_and_pixelate(pixbuf2, 0.0, False) return pixbuf2 def get_possible_button_event(event): """ Mouse or keyboard caused the event? """ if event.type == Gdk.EventType.KEY_PRESS: return 0 # no event.button so pass 0 # BUTTON_PRESS event, so pass event.button return event.button def destroy_widget(widget): widget.destroy() def scale_with_ratio(size, width, height): if height == width: return size, size if height > width: ratio = height / float(width) return int(size / ratio), size else: ratio = width / float(height) return size, int(size / ratio) def on_avatar_save_as_menuitem_activate(widget, avatar, default_name=''): from gajim import dialogs def on_continue(response, file_path): if response < 0: return if isinstance(avatar, str): # We got a SHA pixbuf = app.interface.get_avatar(avatar) else: # We got a pixbuf pixbuf = avatar extension = os.path.splitext(file_path)[1] if not extension: # Silently save as Jpeg image image_format = 'jpeg' file_path += '.jpeg' elif extension == 'jpg': image_format = 'jpeg' else: image_format = extension[1:] # remove leading dot # Save image try: pixbuf.savev(file_path, image_format, [], []) except Exception as e: log.error('Error saving avatar: %s' % str(e)) if os.path.exists(file_path): os.remove(file_path) new_file_path = '.'.join(file_path.split('.')[:-1]) + '.jpeg' def on_ok(file_path, pixbuf): pixbuf.savev(file_path, 'jpeg', [], []) dialogs.ConfirmationDialog(_('Extension not supported'), _('Image cannot be saved in %(type)s format. Save as ' '%(new_filename)s?') % {'type': image_format, 'new_filename': new_file_path}, on_response_ok = (on_ok, new_file_path, pixbuf)) else: dialog.destroy() def on_ok(widget): file_path = dialog.get_filename() if os.path.exists(file_path): # check if we have write permissions if not os.access(file_path, os.W_OK): file_name = os.path.basename(file_path) dialogs.ErrorDialog(_('Cannot overwrite existing file "%s"') % \ file_name, _('A file with this name already exists and you ' 'do not have permission to overwrite it.')) return dialog2 = dialogs.FTOverwriteConfirmationDialog( _('This file already exists'), _('What do you want to do?'), propose_resume=False, on_response=(on_continue, file_path), transient_for=dialog) dialog2.set_destroy_with_parent(True) else: dirname = os.path.dirname(file_path) if not os.access(dirname, os.W_OK): dialogs.ErrorDialog(_('Directory "%s" is not writable') % \ dirname, _('You do not have permission to create files in ' 'this directory.')) return on_continue(0, file_path) def on_cancel(widget): dialog.destroy() dialog = dialogs.FileChooserDialog(title_text=_('Save Image as…'), action=Gtk.FileChooserAction.SAVE, buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_SAVE, Gtk.ResponseType.OK), default_response=Gtk.ResponseType.OK, current_folder=app.config.get('last_save_dir'), on_response_ok=on_ok, on_response_cancel=on_cancel) dialog.set_current_name(default_name + '.jpeg') dialog.connect('delete-event', lambda widget, event: on_cancel(widget)) def create_combobox(value_list, selected_value = None): """ Value_list is [(label1, value1)] """ liststore = Gtk.ListStore(str, str) combobox = Gtk.ComboBox.new_with_model(liststore) cell = Gtk.CellRendererText() combobox.pack_start(cell, True) combobox.add_attribute(cell, 'text', 0) i = -1 for value in value_list: liststore.append(value) if selected_value == value[1]: i = value_list.index(value) if i > -1: combobox.set_active(i) combobox.show_all() return combobox def create_list_multi(value_list, selected_values=None): """ Value_list is [(label1, value1)] """ liststore = Gtk.ListStore(str, str) treeview = Gtk.TreeView.new_with_model(liststore) treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) treeview.set_headers_visible(False) col = Gtk.TreeViewColumn() treeview.append_column(col) cell = Gtk.CellRendererText() col.pack_start(cell, True) col.set_attributes(cell, text=0) for value in value_list: iter = liststore.append(value) if value[1] in selected_values: treeview.get_selection().select_iter(iter) treeview.show_all() return treeview def load_iconset(path, pixbuf2=None, transport=False): """ Load full iconset from the given path, and add pixbuf2 on top left of each static images """ path += '/' if transport: list_ = ('online', 'chat', 'away', 'xa', 'dnd', 'offline', 'not in roster') else: list_ = ('connecting', 'online', 'chat', 'away', 'xa', 'dnd', 'invisible', 'offline', 'error', 'requested', 'event', 'opened', 'closed', 'not in roster', 'muc_active', 'muc_inactive') if pixbuf2: list_ = ('connecting', 'online', 'chat', 'away', 'xa', 'dnd', 'offline', 'error', 'requested', 'event', 'not in roster') return _load_icon_list(list_, path, pixbuf2) def load_mood_icon(icon_name): """ Load an icon from the mood iconset in 16x16 """ iconset = app.config.get('mood_iconset') path = os.path.join(helpers.get_mood_iconset_path(iconset), '') icon_list = _load_icon_list([icon_name], path) return icon_list[icon_name] def load_activity_icon(category, activity = None): """ Load an icon from the activity iconset in 16x16 """ iconset = app.config.get('activity_iconset') path = os.path.join(helpers.get_activity_iconset_path(iconset), category, '') if activity is None: activity = 'category' icon_list = _load_icon_list([activity], path) return icon_list[activity] def get_pep_as_pixbuf(pep_class): if isinstance(pep_class, pep.UserMoodPEP): assert not pep_class._retracted received_mood = pep_class._pep_specific_data['mood'] mood = received_mood if received_mood in pep.MOODS else 'unknown' pixbuf = load_mood_icon(mood).get_pixbuf() return pixbuf elif isinstance(pep_class, pep.UserTunePEP): icon = get_icon_pixmap('audio-x-generic', quiet=True) if not icon: path = os.path.join(app.DATA_DIR, 'emoticons', 'static', 'music.png') return GdkPixbuf.Pixbuf.new_from_file(path) return icon elif isinstance(pep_class, pep.UserActivityPEP): assert not pep_class._retracted pep_ = pep_class._pep_specific_data activity = pep_['activity'] has_known_activity = activity in pep.ACTIVITIES has_known_subactivity = (has_known_activity and ('subactivity' in pep_) and (pep_['subactivity'] in pep.ACTIVITIES[activity])) if has_known_activity: if has_known_subactivity: subactivity = pep_['subactivity'] return load_activity_icon(activity, subactivity).get_pixbuf() else: return load_activity_icon(activity).get_pixbuf() else: return load_activity_icon('unknown').get_pixbuf() elif isinstance(pep_class, pep.UserLocationPEP): icon = get_icon_pixmap('applications-internet', quiet=True) if not icon: icon = get_icon_pixmap('gajim-earth') return icon return None def get_iconset_name_for(name): if name == 'not in roster': name = 'notinroster' iconset = app.config.get('iconset') if not iconset: iconset = app.config.DEFAULT_ICONSET return '%s-%s' % (iconset, name) def load_icons_meta(): """ Load and return - AND + small icons to put on top left of an icon for meta contacts """ iconset = app.config.get('iconset') path = os.path.join(helpers.get_iconset_path(iconset), '16x16') # try to find opened_meta.png file, else opened.png else nopixbuf merge path_opened = os.path.join(path, 'opened_meta.png') if not os.path.isfile(path_opened): path_opened = os.path.join(path, 'opened.png') if os.path.isfile(path_opened): pixo = GdkPixbuf.Pixbuf.new_from_file(path_opened) else: pixo = None # Same thing for closed path_closed = os.path.join(path, 'opened_meta.png') if not os.path.isfile(path_closed): path_closed = os.path.join(path, 'closed.png') if os.path.isfile(path_closed): pixc = GdkPixbuf.Pixbuf.new_from_file(path_closed) else: pixc = None return pixo, pixc def _load_icon_list(icons_list, path, pixbuf2 = None): """ Load icons in icons_list from the given path, and add pixbuf2 on top left of each static images """ imgs = {} for icon in icons_list: # try to open a pixfile with the correct method icon_file = icon.replace(' ', '_') files = [] files.append(path + icon_file + '.gif') files.append(path + icon_file + '.png') image = Gtk.Image() image.show() imgs[icon] = image for file_ in files: # loop seeking for either gif or png if os.path.exists(file_): image.set_from_file(file_) if pixbuf2 and image.get_storage_type() == Gtk.ImageType.PIXBUF: # add pixbuf2 on top-left corner of image pixbuf1 = image.get_pixbuf() pixbuf2.composite(pixbuf1, 0, 0, pixbuf2.get_property('width'), pixbuf2.get_property('height'), 0, 0, 1.0, 1.0, GdkPixbuf.InterpType.NEAREST, 255) image.set_from_pixbuf(pixbuf1) break return imgs def make_jabber_state_images(): """ Initialize jabber_state_images dictionary """ iconset = app.config.get('iconset') if iconset: if helpers.get_iconset_path(iconset): path = os.path.join(helpers.get_iconset_path(iconset), '16x16') if not os.path.exists(path): iconset = app.config.DEFAULT_ICONSET app.config.set('iconset', iconset) else: iconset = app.config.DEFAULT_ICONSET app.config.set('iconset', iconset) else: iconset = app.config.DEFAULT_ICONSET app.config.set('iconset', iconset) path = os.path.join(helpers.get_iconset_path(iconset), '16x16') app.interface.jabber_state_images['16'] = load_iconset(path) pixo, pixc = load_icons_meta() app.interface.jabber_state_images['opened'] = load_iconset(path, pixo) app.interface.jabber_state_images['closed'] = load_iconset(path, pixc) path = os.path.join(helpers.get_iconset_path(iconset), '32x32') app.interface.jabber_state_images['32'] = load_iconset(path) path = os.path.join(helpers.get_iconset_path(iconset), '24x24') if (os.path.exists(path)): app.interface.jabber_state_images['24'] = load_iconset(path) else: # Resize 32x32 icons to 24x24 for each in app.interface.jabber_state_images['32']: img = Gtk.Image() pix = app.interface.jabber_state_images['32'][each] pix_type = pix.get_storage_type() if pix_type == Gtk.ImageType.ANIMATION: animation = pix.get_animation() pixbuf = animation.get_static_image() elif pix_type == Gtk.ImageType.EMPTY: pix = app.interface.jabber_state_images['16'][each] pix_16_type = pix.get_storage_type() if pix_16_type == Gtk.ImageType.ANIMATION: animation = pix.get_animation() pixbuf = animation.get_static_image() else: pixbuf = pix.get_pixbuf() else: pixbuf = pix.get_pixbuf() scaled_pix = pixbuf.scale_simple(24, 24, GdkPixbuf.InterpType.BILINEAR) img.set_from_pixbuf(scaled_pix) app.interface.jabber_state_images['24'][each] = img def reload_jabber_state_images(): make_jabber_state_images() app.interface.roster.update_jabber_state_images() def label_set_autowrap(widget): """ Make labels automatically re-wrap if their containers are resized. Accepts label or container widgets """ if isinstance (widget, Gtk.Container): children = widget.get_children() for i in list(range (len (children))): label_set_autowrap(children[i]) elif isinstance(widget, Gtk.Label): widget.set_line_wrap(True) widget.connect_after('size-allocate', __label_size_allocate) def __label_size_allocate(widget, allocation): """ Callback which re-allocates the size of a label """ layout = widget.get_layout() lw_old, lh_old = layout.get_size() # fixed width labels if lw_old/Pango.SCALE == allocation.width: return # set wrap width to the Pango.Layout of the labels ### widget.set_alignment(0.0, 0.0) layout.set_width (allocation.width * Pango.SCALE) lh = layout.get_size()[1] if lh_old != lh: widget.set_size_request (-1, lh / Pango.SCALE) def get_action(action): return app.app.lookup_action(action) def load_css(): path = os.path.join(configpaths.get('DATA'), 'style', 'gajim.css') try: with open(path, "r") as f: css = f.read() except Exception as exc: print('Error loading css: %s', exc) return provider = Gtk.CssProvider() css = "\n".join((css, convert_config_to_css())) provider.load_from_data(bytes(css.encode())) Gtk.StyleContext.add_provider_for_screen( Gdk.Screen.get_default(), provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) def convert_config_to_css(): css = '' themed_widgets = { 'ChatControl-BannerEventBox': ('bannerbgcolor', 'background'), 'ChatControl-BannerNameLabel': ('bannertextcolor', 'color'), 'ChatControl-BannerLabel': ('bannertextcolor', 'color'), 'GroupChatControl-BannerEventBox': ('bannerbgcolor', 'background'), 'GroupChatControl-BannerNameLabel': ('bannertextcolor', 'color'), 'GroupChatControl-BannerLabel': ('bannertextcolor', 'color'), 'Discovery-BannerEventBox': ('bannerbgcolor', 'background'), 'Discovery-BannerLabel': ('bannertextcolor', 'color')} classes = {'state_composing_color': ('', 'color'), 'state_inactive_color': ('', 'color'), 'state_gone_color': ('', 'color'), 'state_paused_color': ('', 'color'), 'msgcorrectingcolor': ('text', 'background'), 'state_muc_directed_msg_color': ('', 'color'), 'state_muc_msg_color': ('', 'color')} theme = app.config.get('roster_theme') for key, values in themed_widgets.items(): config, attr = values css += '#{} {{'.format(key) value = app.config.get_per('themes', theme, config) if value: css += '{attr}: {color};\n'.format(attr=attr, color=value) css += '}\n' for key, values in classes.items(): node, attr = values value = app.config.get_per('themes', theme, key) if value: css += '.theme_{cls} {node} {{ {attr}: {color}; }}\n'.format( cls=key, node=node, attr=attr, color=value) css += add_css_font() return css def add_css_class(widget, class_name): style = widget.get_style_context() for css_cls in style.list_classes(): if css_cls.startswith('theme_'): style.remove_class(css_cls) if class_name: style.add_class('theme_' + class_name) def add_css_to_widget(widget, css): provider = Gtk.CssProvider() provider.load_from_data(bytes(css.encode())) context = widget.get_style_context() context.add_provider(provider, Gtk.STYLE_PROVIDER_PRIORITY_USER) def remove_css_class(widget, class_name): style = widget.get_style_context() style.remove_class('theme_' + class_name) def add_css_font(): conversation_font = app.config.get('conversation_font') if not conversation_font: return '' font = Pango.FontDescription(conversation_font) unit = "pt" if Gtk.check_version(3, 22, 0) is None else "px" css = """ .font_custom {{ font-family: "{family}"; font-size: {size}{unit}; font-weight: {weight}; }}""".format( family=font.get_family(), size=int(round(font.get_size() / Pango.SCALE)), unit=unit, weight=int(font.get_weight())) css = css.replace("font-size: 0{unit};".format(unit=unit), "") css = css.replace("font-weight: 0;", "") css = "\n".join(filter(lambda x: x.strip(), css.splitlines())) return css def draw_affiliation(surface, affiliation): icon_size = 16 size = 4 * 1 if affiliation not in ('owner', 'admin', 'member'): return ctx = cairo.Context(surface) ctx.rectangle(icon_size-size, icon_size-size, size, size) if affiliation == 'owner': ctx.set_source_rgb(204/255, 0, 0) elif affiliation == 'admin': ctx.set_source_rgb(255/255, 140/255, 0) elif affiliation == 'member': ctx.set_source_rgb(0, 255/255, 0) ctx.fill() def get_image_from_icon_name(icon_name, scale): icon = get_iconset_name_for(icon_name) surface = gtk_icon_theme.load_surface(icon, 16, scale, None, 0) return Gtk.Image.new_from_surface(surface) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/gui_interface.py000066400000000000000000004043771326020644600251670ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/gajim.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2004-2005 Vincent Hanquez ## Copyright (C) 2005 Alex Podaras ## Norman Rasmussen ## Stéphan Kochen ## Copyright (C) 2005-2006 Dimitur Kirov ## Alex Mauer ## Copyright (C) 2005-2007 Travis Shirk ## Nikos Kouremenos ## Copyright (C) 2006 Junglecow J ## Stefan Bethge ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2007 Lukas Petrovicky ## James Newton ## Copyright (C) 2007-2008 Brendan Taylor ## Julien Pivotto ## Stephan Erb ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import os import sys import re import time import hashlib from gi.repository import Gtk from gi.repository import GdkPixbuf from gi.repository import GLib from gi.repository import Gio from gi.repository import Gdk try: from PIL import Image except: pass from gajim.common import app from gajim.common import events from gajim.music_track_listener import MusicTrackListener if app.HAVE_GEOCLUE: from gajim.common import location_listener from gajim import gtkgui_helpers from gajim import gui_menu_builder from gajim import dialogs from gajim import notify from gajim import message_control from gajim.dialog_messages import get_dialog from gajim.dialogs import ProgressWindow from gajim.dialogs import FileChooserDialog from gajim.chat_control_base import ChatControlBase from gajim.chat_control import ChatControl from gajim.groupchat_control import GroupchatControl from gajim.groupchat_control import PrivateChatControl from gajim.message_window import MessageWindowMgr from gajim.filetransfers_window import FileTransfersWindow from gajim.atom_window import AtomWindow from gajim.session import ChatControlSession from gajim.common import sleepy from nbxmpp import idlequeue from nbxmpp import Hashes2 from gajim.common.zeroconf import connection_zeroconf from gajim.common import resolver from gajim.common import caps_cache from gajim.common import proxy65_manager from gajim.common import socks5 from gajim.common import helpers from gajim.common import passwords from gajim.common import logging_helpers from gajim.common.connection_handlers_events import ( OurShowEvent, FileRequestErrorEvent, FileTransferCompletedEvent, UpdateRosterAvatarEvent, UpdateGCAvatarEvent, HTTPUploadProgressEvent) from gajim.common.connection import Connection from gajim.common.file_props import FilesProp from gajim.common import pep from gajim import emoticons from gajim.common.const import AvatarSize from gajim import roster_window from gajim import profile_window from gajim import config from threading import Thread from gajim.common import ged from gajim.common.caps_cache import muc_caps_cache from gajim.common.configpaths import gajimpaths config_filename = gajimpaths['CONFIG_FILE'] from gajim.common import optparser parser = optparser.OptionsParser(config_filename) import logging log = logging.getLogger('gajim.interface') class Interface: ################################################################################ ### Methods handling events from connection ################################################################################ def handle_event_db_error(self, unused, error): #('DB_ERROR', account, error) if self.db_error_dialog: return self.db_error_dialog = dialogs.ErrorDialog(_('Database Error'), error) def destroyed(win): self.db_error_dialog = None self.db_error_dialog.connect('destroy', destroyed) @staticmethod def handle_event_information(obj): if not obj.popup: return if obj.dialog_name is not None: get_dialog(obj.dialog_name, *obj.args, **obj.kwargs) return if obj.level == 'error': cls = dialogs.ErrorDialog elif obj.level == 'warn': cls = dialogs.WarningDialog elif obj.level == 'info': cls = dialogs.InformationDialog else: return cls(obj.pri_txt, GLib.markup_escape_text(obj.sec_txt)) @staticmethod def raise_dialog(name, *args, **kwargs): get_dialog(name, *args, **kwargs) def handle_ask_new_nick(self, account, room_jid, parent_win): title = _('Unable to join group chat') prompt = _('Your desired nickname in group chat\n' '%s\n' 'is in use or registered by another occupant.\n' 'Please specify another nickname below:') % room_jid check_text = _('Always use this nickname when there is a conflict') if 'change_nick_dialog' in self.instances: self.instances['change_nick_dialog'].add_room(account, room_jid, prompt) else: self.instances['change_nick_dialog'] = dialogs.ChangeNickDialog( account, room_jid, title, prompt, transient_for=parent_win) @staticmethod def handle_event_http_auth(obj): #('HTTP_AUTH', account, (method, url, transaction_id, iq_obj, msg)) def response(account, answer): obj.conn.build_http_auth_answer(obj.stanza, answer) def on_yes(is_checked, obj): response(obj, 'yes') account = obj.conn.name sec_msg = _('Do you accept this request?') if app.get_number_of_connected_accounts() > 1: sec_msg = _('Do you accept this request on account %s?') % account if obj.msg: sec_msg = obj.msg + '\n' + sec_msg dialog = dialogs.YesNoDialog(_('HTTP (%(method)s) Authorization for ' '%(url)s (ID: %(id)s)') % {'method': obj.method, 'url': obj.url, 'id': obj.iq_id}, sec_msg, on_response_yes=(on_yes, obj), on_response_no=(response, obj, 'no')) def handle_event_iq_error(self, obj): #('ERROR_ANSWER', account, (id_, fjid, errmsg, errcode)) if str(obj.errcode) in ('400', '403', '406') and obj.id_: # show the error dialog ft = self.instances['file_transfers'] sid = obj.id_ if len(obj.id_) > 3 and obj.id_[2] == '_': sid = obj.id_[3:] file_props = FilesProp.getFileProp(obj.conn.name, sid) if file_props : if str(obj.errcode) == '400': file_props.error = -3 else: file_props.error = -4 app.nec.push_incoming_event(FileRequestErrorEvent(None, conn=obj.conn, jid=obj.jid, file_props=file_props, error_msg=obj.errmsg)) obj.conn.disconnect_transfer(file_props) return elif str(obj.errcode) == '404': sid = obj.id_ if len(obj.id_) > 3 and obj.id_[2] == '_': sid = obj.id_[3:] file_props = FilesProp.getFileProp(obj.conn.name, sid) if file_props: self.handle_event_file_send_error(obj.conn.name, (obj.fjid, file_props)) obj.conn.disconnect_transfer(file_props) return ctrl = self.msg_win_mgr.get_control(obj.fjid, obj.conn.name) if ctrl and ctrl.type_id == message_control.TYPE_GC: ctrl.print_conversation('Error %s: %s' % (obj.errcode, obj.errmsg)) @staticmethod def handle_event_connection_lost(obj): # ('CONNECTION_LOST', account, [title, text]) path = gtkgui_helpers.get_icon_path('gajim-connection_lost', 48) account = obj.conn.name notify.popup(_('Connection Failed'), account, account, 'connection-lost', path, obj.title, obj.msg) @staticmethod def unblock_signed_in_notifications(account): app.block_signed_in_notifications[account] = False def handle_event_status(self, obj): # OUR status #('STATUS', account, show) account = obj.conn.name if obj.show in ('offline', 'error'): for name in list(self.instances[account]['online_dialog'].keys()): # .keys() is needed to not have a dictionary length changed # during iteration error self.instances[account]['online_dialog'][name].destroy() if name in self.instances[account]['online_dialog']: # destroy handler may have already removed it del self.instances[account]['online_dialog'][name] for request in self.gpg_passphrase.values(): if request: request.interrupt(account=account) if account in self.pass_dialog: self.pass_dialog[account].window.destroy() if obj.show == 'offline': app.block_signed_in_notifications[account] = True else: # 30 seconds after we change our status to sth else than offline # we stop blocking notifications of any kind # this prevents from getting the roster items as 'just signed in' # contacts. 30 seconds should be enough time GLib.timeout_add_seconds(30, self.unblock_signed_in_notifications, account) if account in self.show_vcard_when_connect and obj.show not in ( 'offline', 'error'): self.edit_own_details(account) self.show_vcard_when_connect.remove(account) def edit_own_details(self, account): if 'profile' not in self.instances[account]: self.instances[account]['profile'] = \ profile_window.ProfileWindow(account, app.interface.roster.window) @staticmethod def handle_gc_error(gc_control, pritext, sectext): if gc_control and gc_control.autorejoin is not None: if gc_control.error_dialog: gc_control.error_dialog.destroy() def on_close(dummy): gc_control.error_dialog.destroy() gc_control.error_dialog = None gc_control.error_dialog = dialogs.ErrorDialog(pritext, sectext, on_response_ok=on_close, on_response_cancel=on_close) gc_control.error_dialog.set_modal(False) if gc_control.parent_win: gc_control.error_dialog.set_transient_for( gc_control.parent_win.window) else: d = dialogs.ErrorDialog(pritext, sectext) if gc_control and gc_control.parent_win: d.set_transient_for(gc_control.parent_win.window) d.set_modal(False) def handle_gc_password_required(self, account, room_jid, nick): def on_ok(text): app.connections[account].join_gc(nick, room_jid, text) app.gc_passwords[room_jid] = text gc_control.error_dialog = None def on_cancel(): # get and destroy window if room_jid in app.interface.minimized_controls[account]: self.roster.on_disconnect(None, room_jid, account) else: win = self.msg_win_mgr.get_window(room_jid, account) ctrl = self.msg_win_mgr.get_gc_control(room_jid, account) win.remove_tab(ctrl, 3) gc_control.error_dialog = None gc_control = self.msg_win_mgr.get_gc_control(room_jid, account) if gc_control: if gc_control.error_dialog: gc_control.error_dialog.destroy() gc_control.error_dialog = dialogs.InputDialog(_('Password Required'), _('A Password is required to join the room %s. Please type it.') % \ room_jid, is_modal=False, ok_handler=on_ok, cancel_handler=on_cancel) gc_control.error_dialog.input_entry.set_visibility(False) def handle_event_gc_presence(self, obj): gc_control = obj.gc_control parent_win = None if gc_control and gc_control.parent_win: parent_win = gc_control.parent_win.window if obj.ptype == 'error': if obj.errcode == '503': # maximum user number reached self.handle_gc_error(gc_control, _('Unable to join group chat'), _('%s is full')\ % obj.room_jid) elif (obj.errcode == '401') or (obj.errcon == 'not-authorized'): # password required to join self.handle_gc_password_required(obj.conn.name, obj.room_jid, obj.nick) elif (obj.errcode == '403') or (obj.errcon == 'forbidden'): # we are banned self.handle_gc_error(gc_control, _('Unable to join group chat'), _('You are banned from group chat %s.') % \ obj.room_jid) elif (obj.errcode == '404') or (obj.errcon in ('item-not-found', 'remote-server-not-found')): # remote server does not exist if (obj.errcon == 'remote-server-not-found'): self.handle_gc_error(gc_control, _('Unable to join group chat'), _('Remote server %s does not exist.') % obj.room_jid) # group chat does not exist else: self.handle_gc_error(gc_control, _('Unable to join group chat'), _('Group chat %s does not exist.') % obj.room_jid) elif (obj.errcode == '405') or (obj.errcon == 'not-allowed'): self.handle_gc_error(gc_control, _('Unable to join group chat'), _('Group chat creation is not permitted.')) elif (obj.errcode == '406') or (obj.errcon == 'not-acceptable'): self.handle_gc_error(gc_control, _('Unable to join groupchat'), _('You must use your registered nickname in %s.')\ % obj.room_jid) elif (obj.errcode == '407') or (obj.errcon == \ 'registration-required'): self.handle_gc_error(gc_control, _('Unable to join group chat'), _('You are not in the members list in groupchat %s.') % \ obj.room_jid) elif (obj.errcode == '409') or (obj.errcon == 'conflict'): self.handle_ask_new_nick(obj.conn.name, obj.room_jid, parent_win) elif gc_control: gc_control.print_conversation('Error %s: %s' % (obj.errcode, obj.errmsg)) if gc_control and gc_control.autorejoin: gc_control.autorejoin = False @staticmethod def handle_event_gc_message(obj): if not obj.stanza.getTag('body'): # no # It could be a voice request. See # http://www.xmpp.org/extensions/xep-0045.html#voiceapprove if obj.msg_obj.form_node: dialogs.SingleMessageWindow(obj.conn.name, obj.fjid, action='receive', from_whom=obj.fjid, subject='', message='', resource='', session=None, form_node=obj.msg_obj.form_node) def handle_event_presence(self, obj): # 'NOTIFY' (account, (jid, status, status message, resource, # priority, # keyID, timestamp, contact_nickname)) # # Contact changed show account = obj.conn.name jid = obj.jid show = obj.show status = obj.status resource = obj.resource or '' jid_list = app.contacts.get_jid_list(account) # unset custom status if (obj.old_show == 0 and obj.new_show > 1) or \ (obj.old_show > 1 and obj.new_show == 0 and obj.conn.connected > 1): if account in self.status_sent_to_users and \ jid in self.status_sent_to_users[account]: del self.status_sent_to_users[account][jid] if app.jid_is_transport(jid): # It must be an agent # transport just signed in/out, don't show # popup notifications for 30s account_jid = account + '/' + jid app.block_signed_in_notifications[account_jid] = True GLib.timeout_add_seconds(30, self.unblock_signed_in_notifications, account_jid) highest = app.contacts.get_contact_with_highest_priority(account, jid) is_highest = (highest and highest.resource == resource) ctrl = self.msg_win_mgr.get_control(jid, account) if ctrl and ctrl.session and len(obj.contact_list) > 1: ctrl.remove_session(ctrl.session) def handle_event_msgerror(self, obj): #'MSGERROR' (account, (jid, error_code, error_msg, msg, time[session])) account = obj.conn.name jids = obj.fjid.split('/', 1) jid = jids[0] session = obj.session gc_control = self.msg_win_mgr.get_gc_control(jid, account) if not gc_control and \ jid in self.minimized_controls[account]: gc_control = self.minimized_controls[account][jid] if gc_control and gc_control.type_id != message_control.TYPE_GC: gc_control = None if gc_control: if len(jids) > 1: # it's a pm nick = jids[1] if session: ctrl = session.control else: ctrl = self.msg_win_mgr.get_control(obj.fjid, account) if not ctrl: tv = gc_control.list_treeview model = tv.get_model() iter_ = gc_control.get_contact_iter(nick) if iter_: show = model[iter_][3] else: show = 'offline' gc_c = app.contacts.create_gc_contact(room_jid=jid, account=account, name=nick, show=show) ctrl = self.new_private_chat(gc_c, account, session) ctrl.contact.our_chatstate = False ctrl.print_conversation(_('Error %(code)s: %(msg)s') % { 'code': obj.error_code, 'msg': obj.error_msg}, 'status') return gc_control.print_conversation(_('Error %(code)s: %(msg)s') % { 'code': obj.error_code, 'msg': obj.error_msg}, 'status') if gc_control.parent_win and \ gc_control.parent_win.get_active_jid() == jid: gc_control.set_subject(gc_control.subject) return if app.jid_is_transport(jid): jid = jid.replace('@', '') msg = obj.error_msg if obj.msg: msg = _('error while sending %(message)s ( %(error)s )') % { 'message': obj.msg, 'error': msg} if session: session.roster_message(jid, msg, obj.time_, msg_type='error') @staticmethod def handle_event_msgsent(obj): #('MSGSENT', account, (jid, msg, keyID)) # do not play sound when standalone chatstate message (eg no msg) if obj.message and app.config.get_per('soundevents', 'message_sent', 'enabled'): helpers.play_sound('message_sent') @staticmethod def handle_event_msgnotsent(obj): #('MSGNOTSENT', account, (jid, ierror_msg, msg, time, session)) msg = _('error while sending %(message)s ( %(error)s )') % { 'message': obj.message, 'error': obj.error} if not obj.session: # No session. This can happen when sending a message from # gajim-remote log.warning(msg) return obj.session.roster_message(obj.jid, msg, obj.time_, obj.conn.name, msg_type='error') def handle_event_subscribe_presence(self, obj): #('SUBSCRIBE', account, (jid, text, user_nick)) user_nick is JEP-0172 account = obj.conn.name if helpers.allow_popup_window(account) or not self.systray_enabled: if obj.jid in self.instances[account]['sub_request']: self.instances[account]['sub_request'][obj.jid].destroy() self.instances[account]['sub_request'][obj.jid] = \ dialogs.SubscriptionRequestWindow(obj.jid, obj.status, account, obj.user_nick) return event = events.SubscriptionRequestEvent(obj.status, obj.user_nick) self.add_event(account, obj.jid, event) if helpers.allow_showing_notification(account): path = gtkgui_helpers.get_icon_path('gajim-subscription_request', 48) event_type = _('Subscription request') notify.popup(event_type, obj.jid, account, 'subscription_request', path, event_type, obj.jid) def handle_event_subscribed_presence(self, obj): #('SUBSCRIBED', account, (jid, resource)) account = obj.conn.name if obj.jid in app.contacts.get_jid_list(account): c = app.contacts.get_first_contact_from_jid(account, obj.jid) c.resource = obj.resource self.roster.remove_contact_from_groups(c.jid, account, [_('Not in Roster'), _('Observers')], update=False) else: keyID = '' attached_keys = app.config.get_per('accounts', account, 'attached_gpg_keys').split() if obj.jid in attached_keys: keyID = attached_keys[attached_keys.index(obj.jid) + 1] name = obj.jid.split('@', 1)[0] name = name.split('%', 1)[0] contact1 = app.contacts.create_contact(jid=obj.jid, account=account, name=name, groups=[], show='online', status='online', ask='to', resource=obj.resource, keyID=keyID) app.contacts.add_contact(account, contact1) self.roster.add_contact(obj.jid, account) dialogs.InformationDialog(_('Authorization accepted'), _('The contact "%s" has authorized you to see his or her status.') % obj.jid) def show_unsubscribed_dialog(self, account, contact): def on_yes(is_checked, list_): self.roster.on_req_usub(None, list_) list_ = [(contact, account)] dialogs.YesNoDialog( _('Contact "%s" removed subscription from you') % contact.jid, _('You will always see them as offline.\nDo you want to ' 'remove them from your contact list?'), on_response_yes=(on_yes, list_)) # FIXME: Per RFC 3921, we can "deny" ack as well, but the GUI does # not show deny def handle_event_unsubscribed_presence(self, obj): #('UNSUBSCRIBED', account, jid) account = obj.conn.name contact = app.contacts.get_first_contact_from_jid(account, obj.jid) if not contact: return if helpers.allow_popup_window(account) or not self.systray_enabled: self.show_unsubscribed_dialog(account, contact) return event = events.UnsubscribedEvent(contact) self.add_event(account, obj.jid, event) if helpers.allow_showing_notification(account): path = gtkgui_helpers.get_icon_path('gajim-unsubscribed', 48) event_type = _('Unsubscribed') notify.popup(event_type, obj.jid, account, 'unsubscribed', path, event_type, obj.jid) @staticmethod def handle_event_register_agent_info(obj): # ('REGISTER_AGENT_INFO', account, (agent, infos, is_form)) # info in a dataform if is_form is True if obj.is_form or 'instructions' in obj.config: config.ServiceRegistrationWindow(obj.agent, obj.config, obj.conn.name, obj.is_form) else: dialogs.ErrorDialog(_('Contact with "%s" cannot be established') % \ obj.agent, _('Check your connection or try again later.')) def handle_event_gc_config(self, obj): #('GC_CONFIG', account, (jid, form_node)) config is a dict account = obj.conn.name if obj.jid in app.automatic_rooms[account]: if 'continue_tag' in app.automatic_rooms[account][obj.jid]: # We're converting chat to muc. allow participants to invite for f in obj.dataform.iter_fields(): if f.var == 'muc#roomconfig_allowinvites': f.value = True elif f.var == 'muc#roomconfig_publicroom': f.value = False elif f.var == 'muc#roomconfig_membersonly': f.value = True elif f.var == 'public_list': f.value = False obj.conn.send_gc_config(obj.jid, obj.dataform.get_purged()) user_list = {} for jid in app.automatic_rooms[account][obj.jid]['invities']: user_list[jid] = {'affiliation': 'member'} obj.conn.send_gc_affiliation_list(obj.jid, user_list) else: # use default configuration obj.conn.send_gc_config(obj.jid, obj.form_node) # invite contacts # check if it is necessary to add continue_tag = False if 'continue_tag' in app.automatic_rooms[account][obj.jid]: continue_tag = True if 'invities' in app.automatic_rooms[account][obj.jid]: for jid in app.automatic_rooms[account][obj.jid]['invities']: obj.conn.send_invite(obj.jid, jid, continue_tag=continue_tag) gc_control = self.msg_win_mgr.get_gc_control(obj.jid, account) if gc_control: gc_control.print_conversation( _('%(jid)s has been invited in this room') % { 'jid': jid}, graphics=False) del app.automatic_rooms[account][obj.jid] elif obj.jid not in self.instances[account]['gc_config']: self.instances[account]['gc_config'][obj.jid] = \ config.GroupchatConfigWindow(account, obj.jid, obj.dataform) def handle_event_gc_affiliation(self, obj): #('GC_AFFILIATION', account, (room_jid, users_dict)) account = obj.conn.name if obj.jid in self.instances[account]['gc_config']: self.instances[account]['gc_config'][obj.jid].\ affiliation_list_received(obj.users_dict) def handle_event_gc_decline(self, obj): account = obj.conn.name gc_control = self.msg_win_mgr.get_gc_control(obj.room_jid, account) if gc_control: if obj.reason: gc_control.print_conversation( _('%(jid)s declined the invitation: %(reason)s') % { 'jid': obj.jid_from, 'reason': obj.reason}, graphics=False) else: gc_control.print_conversation( _('%(jid)s declined the invitation') % { 'jid': obj.jid_from}, graphics=False) def handle_event_gc_invitation(self, obj): #('GC_INVITATION', (room_jid, jid_from, reason, password, is_continued)) account = obj.conn.name if helpers.allow_popup_window(account) or not self.systray_enabled: dialogs.InvitationReceivedDialog(account, obj.room_jid, obj.jid_from, obj.password, obj.reason, is_continued=obj.is_continued) return event = events.GcInvitationtEvent(obj.room_jid, obj.reason, obj.password, obj.is_continued, obj.jid_from) self.add_event(account, obj.jid_from, event) if helpers.allow_showing_notification(account): path = gtkgui_helpers.get_icon_path('gajim-gc_invitation', 48) event_type = _('Groupchat Invitation') notify.popup(event_type, obj.jid_from, account, 'gc-invitation', path, event_type, obj.room_jid) def forget_gpg_passphrase(self, keyid): if keyid in self.gpg_passphrase: del self.gpg_passphrase[keyid] return False def handle_event_bad_gpg_passphrase(self, obj): #('BAD_PASSPHRASE', account, ()) if obj.use_gpg_agent: sectext = _('You configured Gajim to use OpenPGP agent, but there ' 'is no OpenPGP agent running or it returned a wrong passphrase.' '\n') sectext += _('You are currently connected without your OpenPGP ' 'key.') dialogs.WarningDialog(_('Wrong passphrase'), sectext) else: path = gtkgui_helpers.get_icon_path('gtk-dialog-warning', 48) account = obj.conn.name notify.popup('warning', account, account, '', path, _('Wrong OpenPGP passphrase'), _('You are currently connected without your OpenPGP key.')) self.forget_gpg_passphrase(obj.keyID) @staticmethod def handle_event_client_cert_passphrase(obj): def on_ok(passphrase, checked): obj.conn.on_client_cert_passphrase(passphrase, obj.con, obj.port, obj.secure_tuple) def on_cancel(): obj.conn.on_client_cert_passphrase('', obj.con, obj.port, obj.secure_tuple) dialogs.PassphraseDialog(_('Certificate Passphrase Required'), _('Enter the certificate passphrase for account %s') % \ obj.conn.name, ok_handler=on_ok, cancel_handler=on_cancel) def handle_event_gpg_password_required(self, obj): #('GPG_PASSWORD_REQUIRED', account, (callback,)) if obj.keyid in self.gpg_passphrase: request = self.gpg_passphrase[obj.keyid] else: request = PassphraseRequest(obj.keyid) self.gpg_passphrase[obj.keyid] = request request.add_callback(obj.conn.name, obj.callback) @staticmethod def handle_event_gpg_trust_key(obj): #('GPG_ALWAYS_TRUST', account, callback) def on_yes(checked): if checked: obj.conn.gpg.always_trust.append(obj.keyID) obj.callback(True) def on_no(): obj.callback(False) dialogs.YesNoDialog(_('Untrusted OpenPGP key'), _('The OpenPGP key ' 'used to encrypt this chat is not trusted. Do you really want to ' 'encrypt this message?'), checktext=_('_Do not ask me again'), on_response_yes=on_yes, on_response_no=on_no) def handle_event_password_required(self, obj): #('PASSWORD_REQUIRED', account, None) account = obj.conn.name if account in self.pass_dialog: return text = _('Enter your password for account %s') % account def on_ok(passphrase, save): if save: app.config.set_per('accounts', account, 'savepass', True) passwords.save_password(account, passphrase) obj.conn.set_password(passphrase) del self.pass_dialog[account] def on_cancel(): self.roster.set_state(account, 'offline') self.roster.update_status_combobox() del self.pass_dialog[account] self.pass_dialog[account] = dialogs.PassphraseDialog( _('Password Required'), text, _('Save password'), ok_handler=on_ok, cancel_handler=on_cancel) def handle_oauth2_credentials(self, obj): account = obj.conn.name def on_ok(refresh): app.config.set_per('accounts', account, 'oauth2_refresh_token', refresh) st = app.config.get_per('accounts', account, 'last_status') msg = helpers.from_one_line(app.config.get_per('accounts', account, 'last_status_msg')) app.interface.roster.send_status(account, st, msg) del self.pass_dialog[account] def on_cancel(): app.config.set_per('accounts', account, 'oauth2_refresh_token', '') self.roster.set_state(account, 'offline') self.roster.update_status_combobox() del self.pass_dialog[account] instruction = _('Please copy / paste the refresh token from the website' ' that has just been opened.') self.pass_dialog[account] = dialogs.InputTextDialog( _('Oauth2 Credentials'), instruction, is_modal=False, ok_handler=on_ok, cancel_handler=on_cancel) def handle_event_roster_info(self, obj): #('ROSTER_INFO', account, (jid, name, sub, ask, groups)) account = obj.conn.name contacts = app.contacts.get_contacts(account, obj.jid) if (not obj.sub or obj.sub == 'none') and \ (not obj.ask or obj.ask == 'none') and not obj.nickname and \ not obj.groups: # contact removed us. if contacts: self.roster.remove_contact(obj.jid, account, backend=True) return elif not contacts: if obj.sub == 'remove': return # Add new contact to roster keyID = '' attached_keys = app.config.get_per('accounts', account, 'attached_gpg_keys').split() if obj.jid in attached_keys: keyID = attached_keys[attached_keys.index(obj.jid) + 1] contact = app.contacts.create_contact(jid=obj.jid, account=account, name=obj.nickname, groups=obj.groups, show='offline', sub=obj.sub, ask=obj.ask, keyID=keyID, avatar_sha=obj.avatar_sha) app.contacts.add_contact(account, contact) self.roster.add_contact(obj.jid, account) else: # If contact has changed (sub, ask or group) update roster # Mind about observer status changes: # According to xep 0162, a contact is not an observer anymore when # we asked for auth, so also remove him if ask changed old_groups = contacts[0].groups if obj.sub == 'remove': # another of our instance removed a contact. Remove it here too self.roster.remove_contact(obj.jid, account, backend=True) return update = False if contacts[0].sub != obj.sub or contacts[0].ask != obj.ask\ or old_groups != obj.groups: # c.get_shown_groups() has changed. Reflect that in # roster_window self.roster.remove_contact(obj.jid, account, force=True) update = True for contact in contacts: contact.name = obj.nickname or '' contact.sub = obj.sub contact.ask = obj.ask contact.groups = obj.groups or [] if update: self.roster.add_contact(obj.jid, account) # Refilter and update old groups for group in old_groups: self.roster.draw_group(group, account) self.roster.draw_contact(obj.jid, account) if obj.jid in self.instances[account]['sub_request'] and obj.sub in ( 'from', 'both'): self.instances[account]['sub_request'][obj.jid].destroy() def handle_event_bookmarks(self, obj): # ('BOOKMARKS', account, [{name,jid,autojoin,password,nick}, {}]) # We received a bookmark item from the server (JEP48) # Auto join GC windows if neccessary gui_menu_builder.build_bookmark_menu(obj.conn.name) invisible_show = app.SHOW_LIST.index('invisible') # do not autojoin if we are invisible if obj.conn.connected == invisible_show: return GLib.idle_add(self.auto_join_bookmarks, obj.conn.name) def handle_event_file_send_error(self, account, array): jid = array[0] file_props = array[1] ft = self.instances['file_transfers'] ft.set_status(file_props, 'stop') if helpers.allow_popup_window(account): ft.show_send_error(file_props) return event = events.FileSendErrorEvent(file_props) self.add_event(account, jid, event) if helpers.allow_showing_notification(account): path = gtkgui_helpers.get_icon_path('gajim-ft_error', 48) event_type = _('File Transfer Error') notify.popup(event_type, jid, account, 'file-send-error', path, event_type, file_props.name) def handle_event_file_request_error(self, obj): # ('FILE_REQUEST_ERROR', account, (jid, file_props, error_msg)) ft = self.instances['file_transfers'] ft.set_status(obj.file_props, 'stop') errno = obj.file_props.error if helpers.allow_popup_window(obj.conn.name): if errno in (-4, -5): ft.show_stopped(obj.jid, obj.file_props, obj.error_msg) else: ft.show_request_error(obj.file_props) return if errno in (-4, -5): event_class = events.FileErrorEvent msg_type = 'file-error' else: event_class = events.FileRequestErrorEvent msg_type = 'file-request-error' event = event_class(obj.file_props) self.add_event(obj.conn.name, obj.jid, event) if helpers.allow_showing_notification(obj.conn.name): # check if we should be notified path = gtkgui_helpers.get_icon_path('gajim-ft_error', 48) event_type = _('File Transfer Error') notify.popup(event_type, obj.jid, obj.conn.name, msg_type, path, title=event_type, text=obj.file_props.name) def handle_event_file_request(self, obj): account = obj.conn.name if obj.jid not in app.contacts.get_jid_list(account): keyID = '' attached_keys = app.config.get_per('accounts', account, 'attached_gpg_keys').split() if obj.jid in attached_keys: keyID = attached_keys[attached_keys.index(obj.jid) + 1] contact = app.contacts.create_not_in_roster_contact(jid=obj.jid, account=account, keyID=keyID) app.contacts.add_contact(account, contact) self.roster.add_contact(obj.jid, account) contact = app.contacts.get_first_contact_from_jid(account, obj.jid) if obj.file_props.session_type == 'jingle': request = obj.stanza.getTag('jingle').getTag('content')\ .getTag('description').getTag('request') if request: # If we get a request instead ft_win = self.instances['file_transfers'] ft_win.add_transfer(account, contact, obj.file_props) return if helpers.allow_popup_window(account): self.instances['file_transfers'].show_file_request(account, contact, obj.file_props) return event = events.FileRequestEvent(obj.file_props) self.add_event(account, obj.jid, event) if helpers.allow_showing_notification(account): path = gtkgui_helpers.get_icon_path('gajim-ft_request', 48) txt = _('%s wants to send you a file.') % app.get_name_from_jid( account, obj.jid) event_type = _('File Transfer Request') notify.popup(event_type, obj.jid, account, 'file-request', path_to_image=path, title=event_type, text=txt) @staticmethod def handle_event_file_error(title, message): dialogs.ErrorDialog(title, message) def handle_event_file_progress(self, account, file_props): if time.time() - self.last_ftwindow_update > 0.5: # update ft window every 500ms self.last_ftwindow_update = time.time() self.instances['file_transfers'].set_progress(file_props.type_, file_props.sid, file_props.received_len) def __compare_hashes(self, account, file_props): session = app.connections[account].get_jingle_session(jid=None, sid=file_props.sid) ft_win = self.instances['file_transfers'] h = Hashes2() try: file_ = open(file_props.file_name, 'rb') except: return hash_ = h.calculateHash(file_props.algo, file_) file_.close() # If the hash we received and the hash of the file are the same, # then the file is not corrupt jid = file_props.sender if file_props.hash_ == hash_: GLib.idle_add(self.popup_ft_result, account, jid, file_props) GLib.idle_add(ft_win.set_status, file_props, 'ok') else: # wrong hash, we need to get the file again! file_props.error = -10 GLib.idle_add(self.popup_ft_result, account, jid, file_props) GLib.idle_add(ft_win.set_status, file_props, 'hash_error') # End jingle session if session: session.end_session() def handle_event_file_rcv_completed(self, account, file_props): ft = self.instances['file_transfers'] if file_props.error == 0: ft.set_progress(file_props.type_, file_props.sid, file_props.received_len) app.nec.push_incoming_event(FileTransferCompletedEvent(None, file_props=file_props)) else: ft.set_status(file_props, 'stop') if not file_props.completed and (file_props.stalled or \ file_props.paused): return if file_props.type_ == 'r': # we receive a file app.socks5queue.remove_receiver(file_props.sid, True, True) if file_props.session_type == 'jingle': if file_props.hash_ and file_props.error == 0: # We compare hashes in a new thread self.hashThread = Thread(target=self.__compare_hashes, args=(account, file_props)) self.hashThread.start() else: # We disn't get the hash, sender probably don't support that jid = file_props.sender self.popup_ft_result(account, jid, file_props) if file_props.error == 0: ft.set_status(file_props, 'ok') session = app.connections[account].get_jingle_session(jid=None, sid=file_props.sid) # End jingle session # TODO: only if there are no other parallel downloads in this session if session: session.end_session() else: # we send a file jid = file_props.receiver app.socks5queue.remove_sender(file_props.sid, True, True) self.popup_ft_result(account, jid, file_props) def popup_ft_result(self, account, jid, file_props): ft = self.instances['file_transfers'] if helpers.allow_popup_window(account): if file_props.error == 0: if app.config.get('notify_on_file_complete'): ft.show_completed(jid, file_props) elif file_props.error == -1: ft.show_stopped(jid, file_props, error_msg=_('Remote contact stopped transfer')) elif file_props.error == -6: ft.show_stopped(jid, file_props, error_msg=_('Error opening file')) elif file_props.error == -10: ft.show_hash_error(jid, file_props, account) elif file_props.error == -12: ft.show_stopped(jid, file_props, error_msg=_('SSL certificate error')) return msg_type = '' event_type = '' if file_props.error == 0 and app.config.get( 'notify_on_file_complete'): event_class = events.FileCompletedEvent msg_type = 'file-completed' event_type = _('File Transfer Completed') elif file_props.error in (-1, -6): event_class = events.FileStoppedEvent msg_type = 'file-stopped' event_type = _('File Transfer Stopped') elif file_props.error == -10: event_class = events.FileHashErrorEvent msg_type = 'file-hash-error' event_type = _('File Transfer Failed') if event_type == '': # FIXME: ugly workaround (this can happen Gajim sent, Gaim recvs) # this should never happen but it does. see process_result() in # socks5.py # who calls this func (sth is really wrong unless this func is also # registered as progress_cb return if msg_type: event = event_class(file_props) self.add_event(account, jid, event) if file_props is not None: if file_props.type_ == 'r': # get the name of the sender, as it is in the roster sender = file_props.sender.split('/')[0] name = app.contacts.get_first_contact_from_jid(account, sender).get_shown_name() filename = os.path.basename(file_props.file_name) if event_type == _('File Transfer Completed'): txt = _('%(filename)s received from %(name)s.')\ % {'filename': filename, 'name': name} img_name = 'gajim-ft_done' elif event_type == _('File Transfer Stopped'): txt = _('File transfer of %(filename)s from %(name)s ' 'stopped.') % {'filename': filename, 'name': name} img_name = 'gajim-ft_stopped' else: # ft hash error txt = _('File transfer of %(filename)s from %(name)s ' 'failed.') % {'filename': filename, 'name': name} img_name = 'gajim-ft_stopped' else: receiver = file_props.receiver if hasattr(receiver, 'jid'): receiver = receiver.jid receiver = receiver.split('/')[0] # get the name of the contact, as it is in the roster name = app.contacts.get_first_contact_from_jid(account, receiver).get_shown_name() filename = os.path.basename(file_props.file_name) if event_type == _('File Transfer Completed'): txt = _('You successfully sent %(filename)s to %(name)s.')\ % {'filename': filename, 'name': name} img_name = 'gajim-ft_done' elif event_type == _('File Transfer Stopped'): txt = _('File transfer of %(filename)s to %(name)s ' 'stopped.') % {'filename': filename, 'name': name} img_name = 'gajim-ft_stopped' else: # ft hash error txt = _('File transfer of %(filename)s to %(name)s ' 'failed.') % {'filename': filename, 'name': name} img_name = 'gajim-ft_stopped' path = gtkgui_helpers.get_icon_path(img_name, 48) else: txt = '' path = '' if app.config.get('notify_on_file_complete') and \ (app.config.get('autopopupaway') or \ app.connections[account].connected in (2, 3)): # we want to be notified and we are online/chat or we don't mind # bugged when away/na/busy notify.popup(event_type, jid, account, msg_type, path_to_image=path, title=event_type, text=txt) def handle_event_signed_in(self, obj): """ SIGNED_IN event is emitted when we sign in, so handle it """ # ('SIGNED_IN', account, ()) # block signed in notifications for 30 seconds # Add our own JID into the DB app.logger.insert_jid(obj.conn.get_own_jid().getStripped()) account = obj.conn.name app.block_signed_in_notifications[account] = True state = self.sleeper.getState() connected = obj.conn.connected if state != sleepy.STATE_UNKNOWN and connected in (2, 3): # we go online or free for chat, so we activate auto status app.sleeper_state[account] = 'online' elif not ((state == sleepy.STATE_AWAY and connected == 4) or \ (state == sleepy.STATE_XA and connected == 5)): # If we are autoaway/xa and come back after a disconnection, do # nothing # Else disable autoaway app.sleeper_state[account] = 'off' if obj.conn.archiving_313_supported and app.config.get_per('accounts', account, 'sync_logs_with_server'): obj.conn.request_archive_on_signin() invisible_show = app.SHOW_LIST.index('invisible') # We cannot join rooms if we are invisible if connected == invisible_show: return # send currently played music if (obj.conn.pep_supported and sys.platform == 'linux' and app.config.get_per('accounts', account, 'publish_tune')): self.enable_music_listener() # enable location listener if (obj.conn.pep_supported and app.HAVE_GEOCLUE and app.config.get_per('accounts', account, 'publish_location')): location_listener.enable() @staticmethod def show_httpupload_progress(file): ProgressWindow(file) def send_httpupload(self, chat_control): FileChooserDialog( on_response_ok=lambda widget: self.on_file_dialog_ok(widget, chat_control), title_text=_('Choose file to send'), action=Gtk.FileChooserAction.OPEN, buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.OK), select_multiple=True, default_response=Gtk.ResponseType.OK, preview=True, transient_for=chat_control.parent_win.window) @staticmethod def on_file_dialog_ok(widget, chat_control): paths = widget.get_filenames() widget.destroy() con = app.connections[chat_control.account] groupchat = chat_control.type_id == message_control.TYPE_GC for path in paths: con.check_file_before_transfer(path, chat_control.encryption, chat_control.contact, chat_control.session, groupchat) def encrypt_file(self, file, callback): app.nec.push_incoming_event(HTTPUploadProgressEvent( None, status='encrypt', file=file)) encryption = file.encryption plugin = app.plugin_manager.encryption_plugins[encryption] if hasattr(plugin, 'encrypt_file'): plugin.encrypt_file(file, None, callback) else: app.nec.push_incoming_event(HTTPUploadProgressEvent( None, status='close', file=file)) self.raise_dialog('httpupload-encryption-not-available') @staticmethod def handle_event_metacontacts(obj): app.contacts.define_metacontacts(obj.conn.name, obj.meta_list) @staticmethod def handle_atom_entry(obj): AtomWindow.newAtomEntry(obj.atom_entry) @staticmethod def handle_event_failed_decrypt(obj): details = _('Unable to decrypt message from %s\nIt may have been ' 'tampered with.') % obj.fjid dialogs.WarningDialog(_('Unable to decrypt message'), details) def handle_event_zc_name_conflict(self, obj): def on_ok(new_name): app.config.set_per('accounts', obj.conn.name, 'name', new_name) show = obj.conn.old_show status = obj.conn.status obj.conn.username = new_name obj.conn.change_status(show, status) def on_cancel(): obj.conn.change_status('offline', '') dlg = dialogs.InputDialog(_('Username Conflict'), _('Please type a new username for your local account'), input_str=obj.alt_name, is_modal=True, ok_handler=on_ok, cancel_handler=on_cancel, transient_for=self.roster.window) def handle_event_resource_conflict(self, obj): # ('RESOURCE_CONFLICT', account, ()) # First we go offline, but we don't overwrite status message account = obj.conn.name conn = obj.conn self.roster.send_status(account, 'offline', conn.status) def on_ok(new_resource): app.config.set_per('accounts', account, 'resource', new_resource) self.roster.send_status(account, conn.old_show, conn.status) proposed_resource = conn.server_resource if proposed_resource.startswith('gajim.'): # Dont notify the user about resource change if he didnt set # a custom resource on_ok('gajim.$rand') return proposed_resource += app.config.get('gc_proposed_nick_char') dlg = dialogs.ResourceConflictDialog(_('Resource Conflict'), _('You are already connected to this account with the same ' 'resource. Please type a new one'), resource=proposed_resource, ok_handler=on_ok) def handle_event_jingleft_cancel(self, obj): ft = self.instances['file_transfers'] file_props = None # get the file_props of our session file_props = FilesProp.getFileProp(obj.conn.name, obj.sid) if not file_props: return ft.set_status(file_props, 'stop') file_props.error = -4 # is it the right error code? ft.show_stopped(obj.jid, file_props, 'Peer cancelled ' + 'the transfer') def handle_event_jingle_incoming(self, obj): # ('JINGLE_INCOMING', account, peer jid, sid, tuple-of-contents==(type, # data...)) # TODO: conditional blocking if peer is not in roster account = obj.conn.name content_types = obj.contents.media # check type of jingle session if 'audio' in content_types or 'video' in content_types: # a voip session... # we now handle only voip, so the only thing we will do here is # not to return from function pass else: # unknown session type... it should be declined in common/jingle.py return ctrl = (self.msg_win_mgr.get_control(obj.fjid, account) or self.msg_win_mgr.get_control(obj.jid, account)) if ctrl: if 'audio' in content_types: ctrl.set_audio_state('connection_received', obj.sid) if 'video' in content_types: ctrl.set_video_state('connection_received', obj.sid) dlg = dialogs.VoIPCallReceivedDialog.get_dialog(obj.fjid, obj.sid) if dlg: dlg.add_contents(content_types) return if helpers.allow_popup_window(account): dialogs.VoIPCallReceivedDialog(account, obj.fjid, obj.sid, content_types) return event = events.JingleIncomingEvent(obj.fjid, obj.sid, content_types) self.add_event(account, obj.jid, event) if helpers.allow_showing_notification(account): # TODO: we should use another pixmap ;-) txt = _('%s wants to start a voice chat.') % \ app.get_name_from_jid(account, obj.fjid) path = gtkgui_helpers.get_icon_path('gajim-mic_active', 48) event_type = _('Voice Chat Request') notify.popup(event_type, obj.fjid, account, 'jingle-incoming', path_to_image=path, title=event_type, text=txt) def handle_event_jingle_connected(self, obj): # ('JINGLE_CONNECTED', account, (peerjid, sid, media)) if obj.media in ('audio', 'video'): account = obj.conn.name ctrl = (self.msg_win_mgr.get_control(obj.fjid, account) or self.msg_win_mgr.get_control(obj.jid, account)) if ctrl: if obj.media == 'audio': ctrl.set_audio_state('connected', obj.sid) else: ctrl.set_video_state('connected', obj.sid) def handle_event_jingle_disconnected(self, obj): # ('JINGLE_DISCONNECTED', account, (peerjid, sid, reason)) account = obj.conn.name ctrl = (self.msg_win_mgr.get_control(obj.fjid, account) or self.msg_win_mgr.get_control(obj.jid, account)) if ctrl: if obj.media is None: ctrl.stop_jingle(sid=obj.sid, reason=obj.reason) elif obj.media == 'audio': ctrl.set_audio_state('stop', sid=obj.sid, reason=obj.reason) elif obj.media == 'video': ctrl.set_video_state('stop', sid=obj.sid, reason=obj.reason) dialog = dialogs.VoIPCallReceivedDialog.get_dialog(obj.fjid, obj.sid) if dialog: if obj.media is None: dialog.dialog.destroy() else: dialog.remove_contents((obj.media, )) def handle_event_jingle_error(self, obj): # ('JINGLE_ERROR', account, (peerjid, sid, reason)) account = obj.conn.name ctrl = (self.msg_win_mgr.get_control(obj.fjid, account) or self.msg_win_mgr.get_control(obj.jid, account)) if ctrl and obj.sid == ctrl.audio_sid: ctrl.set_audio_state('error', reason=obj.reason) @staticmethod def handle_event_roster_item_exchange(obj): # data = (action in [add, delete, modify], exchange_list, jid_from) dialogs.RosterItemExchangeWindow(obj.conn.name, obj.action, obj.exchange_items_list, obj.fjid) def handle_event_ssl_error(self, obj): # ('SSL_ERROR', account, (text, errnum, cert, sha1_fingerprint, sha256_fingerprint)) account = obj.conn.name server = app.config.get_per('accounts', account, 'hostname') def on_ok(is_checked): del self.instances[account]['online_dialog']['ssl_error'] if is_checked[0]: # Check if cert is already in file certs = '' if os.path.isfile(app.MY_CACERTS): f = open(app.MY_CACERTS) certs = f.read() f.close() if obj.cert in certs: dialogs.ErrorDialog(_('Certificate Already in File'), _('This certificate is already in file %s, so it\'s ' 'not added again.') % app.MY_CACERTS) else: f = open(app.MY_CACERTS, 'a') f.write(server + '\n') f.write(obj.cert + '\n\n') f.close() app.config.set_per('accounts', account, 'ssl_fingerprint_sha1', obj.fingerprint_sha1) app.config.set_per('accounts', account, 'ssl_fingerprint_sha256', obj.fingerprint_sha256) if is_checked[1]: ignore_ssl_errors = app.config.get_per('accounts', account, 'ignore_ssl_errors').split() ignore_ssl_errors.append(str(obj.error_num)) app.config.set_per('accounts', account, 'ignore_ssl_errors', ' '.join(ignore_ssl_errors)) obj.conn.ssl_certificate_accepted() def on_cancel(): del self.instances[account]['online_dialog']['ssl_error'] obj.conn.disconnect(on_purpose=True) app.nec.push_incoming_event(OurShowEvent(None, conn=obj.conn, show='offline')) pritext = _('Error verifying SSL certificate') sectext = _('There was an error verifying the SSL certificate of your ' 'XMPP server: %(error)s\nDo you still want to connect to this ' 'server?') % {'error': obj.error_text} if obj.error_num in (18, 27): checktext1 = _('Add this certificate to the list of trusted ' 'certificates.\nSHA-1 fingerprint of the certificate:\n%(sha1)s' '\nSHA256 fingerprint of the certificate:\n%(sha256)s') % \ {'sha1': obj.fingerprint_sha1, 'sha256': obj.fingerprint_sha256} else: checktext1 = '' checktext2 = _('Ignore this error for this certificate.') if 'ssl_error' in self.instances[account]['online_dialog']: self.instances[account]['online_dialog']['ssl_error'].destroy() self.instances[account]['online_dialog']['ssl_error'] = \ dialogs.SSLErrorDialog(obj.conn.name, obj.certificate, pritext, sectext, checktext1, checktext2, on_response_ok=on_ok, on_response_cancel=on_cancel) self.instances[account]['online_dialog']['ssl_error'].set_title( _('SSL Certificate Verification for %s') % account) def handle_event_non_anonymous_server(self, obj): account = obj.conn.name server = app.config.get_per('accounts', account, 'hostname') dialogs.ErrorDialog(_('Non Anonymous Server'), sectext='Server "%s"' 'does not support anonymous connection' % server, transient_for=self.roster.window) def handle_event_fingerprint_error(self, obj): # ('FINGERPRINT_ERROR', account, (new_fingerprint_sha1,new_fingerprint_sha256,)) account = obj.conn.name def on_yes(is_checked): del self.instances[account]['online_dialog']['fingerprint_error'] app.config.set_per('accounts', account, 'ssl_fingerprint_sha1', obj.new_fingerprint_sha1) app.config.set_per('accounts', account, 'ssl_fingerprint_sha256', obj.new_fingerprint_sha256) # Reset the ignored ssl errors app.config.set_per('accounts', account, 'ignore_ssl_errors', '') obj.conn.ssl_certificate_accepted() def on_no(): del self.instances[account]['online_dialog']['fingerprint_error'] obj.conn.disconnect(on_purpose=True) app.nec.push_incoming_event(OurShowEvent(None, conn=obj.conn, show='offline')) pritext = _('SSL certificate error') sectext = _('It seems the SSL certificate of account %(account)s has ' 'changed and is not valid or your connection is being compromised.\n\n' 'Old SHA-1 fingerprint: ' '%(old_sha1)s\nOld SHA-256 fingerprint: %(old_sha256)s\n\n' 'New SHA-1 fingerprint: %(new_sha1)s\nNew SHA-256 fingerprint: ' '%(new_sha256)s\n\nDo you still want to connect ' 'and update the fingerprint of the certificate?') % \ {'account': account, 'old_sha1': app.config.get_per('accounts', account, 'ssl_fingerprint_sha1'), 'old_sha256': app.config.get_per('accounts', account, 'ssl_fingerprint_sha256'), 'new_sha1': obj.new_fingerprint_sha1, 'new_sha256': obj.new_fingerprint_sha256} if 'fingerprint_error' in self.instances[account]['online_dialog']: self.instances[account]['online_dialog']['fingerprint_error'].\ destroy() self.instances[account]['online_dialog']['fingerprint_error'] = \ dialogs.CheckFingerprintDialog(pritext, sectext, on_response_yes=on_yes, on_response_no=on_no, account=obj.conn.name, certificate=obj.certificate) def handle_event_plain_connection(self, obj): # ('PLAIN_CONNECTION', account, (connection)) def on_ok(is_checked): if not is_checked[0]: if is_checked[1]: app.config.set_per('accounts', obj.conn.name, 'action_when_plaintext_connection', 'disconnect') on_cancel() return # On cancel call del self.instances, so don't call it another time # before del self.instances[obj.conn.name]['online_dialog']\ ['plain_connection'] if is_checked[1]: app.config.set_per('accounts', obj.conn.name, 'action_when_plaintext_connection', 'connect') obj.conn.connection_accepted(obj.xmpp_client, 'plain') def on_cancel(): del self.instances[obj.conn.name]['online_dialog']\ ['plain_connection'] obj.conn.disconnect(on_purpose=True) app.nec.push_incoming_event(OurShowEvent(None, conn=obj.conn, show='offline')) if 'plain_connection' in self.instances[obj.conn.name]['online_dialog']: self.instances[obj.conn.name]['online_dialog']['plain_connection'].\ destroy() self.instances[obj.conn.name]['online_dialog']['plain_connection'] = \ dialogs.PlainConnectionDialog(obj.conn.name, on_ok, on_cancel) def handle_event_insecure_ssl_connection(self, obj): # ('INSECURE_SSL_CONNECTION', account, (connection, connection_type)) def on_ok(is_checked): if not is_checked[0]: on_cancel() return del self.instances[obj.conn.name]['online_dialog']['insecure_ssl'] if is_checked[1]: app.config.set_per('accounts', obj.conn.name, 'warn_when_insecure_ssl_connection', False) if obj.conn.connected == 0: # We have been disconnecting (too long time since window is # opened) # re-connect with auto-accept obj.conn.connection_auto_accepted = True show, msg = obj.conn.continue_connect_info[:2] self.roster.send_status(obj.conn.name, show, msg) return obj.conn.connection_accepted(obj.xmpp_client, obj.conn_type) def on_cancel(): del self.instances[obj.conn.name]['online_dialog']['insecure_ssl'] obj.conn.disconnect(on_purpose=True) app.nec.push_incoming_event(OurShowEvent(None, conn=obj.conn, show='offline')) pritext = _('Insecure connection') sectext = _('You are about to send your password on an insecure ' 'connection. You should install PyOpenSSL to prevent that. Are you ' 'sure you want to do that?') checktext1 = _('Yes, I really want to connect insecurely') checktext2 = _('_Do not ask me again') if 'insecure_ssl' in self.instances[obj.conn.name]['online_dialog']: self.instances[obj.conn.name]['online_dialog']['insecure_ssl'].\ destroy() self.instances[obj.conn.name]['online_dialog']['insecure_ssl'] = \ dialogs.ConfirmationDialogDoubleCheck(pritext, sectext, checktext1, checktext2, on_response_ok=on_ok, on_response_cancel=on_cancel, is_modal=False) def handle_event_insecure_password(self, obj): # ('INSECURE_PASSWORD', account, ()) def on_ok(is_checked): if not is_checked[0]: on_cancel() return del self.instances[obj.conn.name]['online_dialog']\ ['insecure_password'] if is_checked[1]: app.config.set_per('accounts', obj.conn.name, 'warn_when_insecure_password', False) if obj.conn.connected == 0: # We have been disconnecting (too long time since window is # opened) # re-connect with auto-accept obj.conn.connection_auto_accepted = True show, msg = obj.conn.continue_connect_info[:2] self.roster.send_status(obj.conn.name, show, msg) return obj.conn.accept_insecure_password() def on_cancel(): del self.instances[obj.conn.name]['online_dialog']\ ['insecure_password'] obj.conn.disconnect(on_purpose=True) app.nec.push_incoming_event(OurShowEvent(None, conn=obj.conn, show='offline')) pritext = _('Insecure connection') sectext = _('You are about to send your password unencrypted on an ' 'insecure connection. Are you sure you want to do that?') checktext1 = _('Yes, I really want to connect insecurely') checktext2 = _('_Do not ask me again') if 'insecure_password' in self.instances[obj.conn.name]\ ['online_dialog']: self.instances[obj.conn.name]['online_dialog']\ ['insecure_password'].destroy() self.instances[obj.conn.name]['online_dialog']['insecure_password'] = \ dialogs.ConfirmationDialogDoubleCheck(pritext, sectext, checktext1, checktext2, on_response_ok=on_ok, on_response_cancel=on_cancel, is_modal=False) def create_core_handlers_list(self): self.handlers = { 'DB_ERROR': [self.handle_event_db_error], 'FILE_SEND_ERROR': [self.handle_event_file_send_error], 'atom-entry-received': [self.handle_atom_entry], 'bad-gpg-passphrase': [self.handle_event_bad_gpg_passphrase], 'bookmarks-received': [self.handle_event_bookmarks], 'client-cert-passphrase': [ self.handle_event_client_cert_passphrase], 'connection-lost': [self.handle_event_connection_lost], 'failed-decrypt': [(self.handle_event_failed_decrypt, ged.GUI2)], 'file-request-error': [self.handle_event_file_request_error], 'file-request-received': [self.handle_event_file_request], 'fingerprint-error': [self.handle_event_fingerprint_error], 'gc-invitation-received': [self.handle_event_gc_invitation], 'gc-decline-received': [self.handle_event_gc_decline], 'gc-presence-received': [self.handle_event_gc_presence], 'gc-message-received': [self.handle_event_gc_message], 'gpg-password-required': [self.handle_event_gpg_password_required], 'gpg-trust-key': [self.handle_event_gpg_trust_key], 'http-auth-received': [self.handle_event_http_auth], 'information': [self.handle_event_information], 'insecure-password': [self.handle_event_insecure_password], 'insecure-ssl-connection': \ [self.handle_event_insecure_ssl_connection], 'iq-error-received': [self.handle_event_iq_error], 'jingle-connected-received': [self.handle_event_jingle_connected], 'jingle-disconnected-received': [ self.handle_event_jingle_disconnected], 'jingle-error-received': [self.handle_event_jingle_error], 'jingle-request-received': [self.handle_event_jingle_incoming], 'jingleFT-cancelled-received': [self.handle_event_jingleft_cancel], 'message-error': [self.handle_event_msgerror], 'message-not-sent': [self.handle_event_msgnotsent], 'message-sent': [self.handle_event_msgsent], 'metacontacts-received': [self.handle_event_metacontacts], 'muc-admin-received': [self.handle_event_gc_affiliation], 'muc-owner-received': [self.handle_event_gc_config], 'oauth2-credentials-required': [self.handle_oauth2_credentials], 'our-show': [self.handle_event_status], 'password-required': [self.handle_event_password_required], 'plain-connection': [self.handle_event_plain_connection], 'presence-received': [self.handle_event_presence], 'register-agent-info-received': [self.handle_event_register_agent_info], 'roster-info': [self.handle_event_roster_info], 'roster-item-exchange-received': \ [self.handle_event_roster_item_exchange], 'signed-in': [self.handle_event_signed_in], 'ssl-error': [self.handle_event_ssl_error], 'non-anonymous-server-error': [self.handle_event_non_anonymous_server], 'stream-conflict-received': [self.handle_event_resource_conflict], 'subscribe-presence-received': [ self.handle_event_subscribe_presence], 'subscribed-presence-received': [ self.handle_event_subscribed_presence], 'unsubscribed-presence-received': [ self.handle_event_unsubscribed_presence], 'zeroconf-name-conflict': [self.handle_event_zc_name_conflict], } def register_core_handlers(self): """ Register core handlers in Global Events Dispatcher (GED). This is part of rewriting whole events handling system to use GED. """ for event_name, event_handlers in self.handlers.items(): for event_handler in event_handlers: prio = ged.GUI1 if type(event_handler) == tuple: prio = event_handler[1] event_handler = event_handler[0] app.ged.register_event_handler(event_name, prio, event_handler) ################################################################################ ### Methods dealing with app.events ################################################################################ def add_event(self, account, jid, event): """ Add an event to the app.events var """ # We add it to the app.events queue # Do we have a queue? jid = app.get_jid_without_resource(jid) no_queue = len(app.events.get_events(account, jid)) == 0 # event can be in common.events.* # event_type can be in advancedNotificationWindow.events_list event_types = {'file-request': 'ft_request', 'file-completed': 'ft_finished'} event_type = event_types.get(event.type_) show_in_roster = notify.get_show_in_roster(event_type, account, jid) show_in_systray = notify.get_show_in_systray(event_type, account, jid) event.show_in_roster = show_in_roster event.show_in_systray = show_in_systray app.events.add_event(account, jid, event) self.roster.show_title() if no_queue: # We didn't have a queue: we change icons if app.contacts.get_contact_with_highest_priority(account, jid): self.roster.draw_contact(jid, account) else: self.roster.add_to_not_in_the_roster(account, jid) # Select the big brother contact in roster, it's visible because it has # events. family = app.contacts.get_metacontacts_family(account, jid) if family: nearby_family, bb_jid, bb_account = \ app.contacts.get_nearby_family_and_big_brother(family, account) else: bb_jid, bb_account = jid, account self.roster.select_contact(bb_jid, bb_account) def handle_event(self, account, fjid, type_): w = None ctrl = None session = None resource = app.get_resource_from_jid(fjid) jid = app.get_jid_without_resource(fjid) if type_ == 'connection-lost': app.interface.roster.window.present() return if type_ in ('printed_gc_msg', 'printed_marked_gc_msg', 'gc_msg'): w = self.msg_win_mgr.get_window(jid, account) if jid in self.minimized_controls[account]: self.roster.on_groupchat_maximized(None, jid, account) return else: ctrl = self.msg_win_mgr.get_gc_control(jid, account) elif type_ in ('printed_chat', 'chat', ''): # '' is for log in/out notifications if type_ != '': event = app.events.get_first_event(account, fjid, type_) if not event: event = app.events.get_first_event(account, jid, type_) if not event: return if type_ == 'printed_chat': ctrl = event.control elif type_ == 'chat': session = event.session ctrl = session.control elif type_ == '': ctrl = self.msg_win_mgr.get_control(fjid, account) if not ctrl: highest_contact = app.contacts.\ get_contact_with_highest_priority(account, jid) # jid can have a window if this resource was lower when he sent # message and is now higher because the other one is offline if resource and highest_contact.resource == resource and \ not self.msg_win_mgr.has_window(jid, account): # remove resource of events too app.events.change_jid(account, fjid, jid) resource = None fjid = jid contact = None if resource: contact = app.contacts.get_contact(account, jid, resource) if not contact: contact = highest_contact ctrl = self.new_chat(contact, account, resource=resource, session=session) app.last_message_time[account][jid] = 0 # long time ago w = ctrl.parent_win elif type_ in ('printed_pm', 'pm'): # assume that the most recently updated control we have for this # party is the one that this event was in event = app.events.get_first_event(account, fjid, type_) if not event: event = app.events.get_first_event(account, jid, type_) if not event: return if type_ == 'printed_pm': ctrl = event.control elif type_ == 'pm': session = event.session if session and session.control: ctrl = session.control elif not ctrl: room_jid = jid nick = resource gc_contact = app.contacts.get_gc_contact(account, room_jid, nick) if gc_contact: show = gc_contact.show else: show = 'offline' gc_contact = app.contacts.create_gc_contact( room_jid=room_jid, account=account, name=nick, show=show) if not session: session = app.connections[account].make_new_session( fjid, None, type_='pm') self.new_private_chat(gc_contact, account, session=session) ctrl = session.control w = ctrl.parent_win elif type_ in ('normal', 'file-request', 'file-request-error', 'file-send-error', 'file-error', 'file-stopped', 'file-completed', 'file-hash-error', 'jingle-incoming'): # Get the first single message event event = app.events.get_first_event(account, fjid, type_) if not event: # default to jid without resource event = app.events.get_first_event(account, jid, type_) if not event: return # Open the window self.roster.open_event(account, jid, event) else: # Open the window self.roster.open_event(account, fjid, event) elif type_ == 'gc-invitation': event = app.events.get_first_event(account, jid, type_) dialogs.InvitationReceivedDialog(account, event.room_jid, jid, event.password, event.reason, event.is_continued) app.events.remove_events(account, jid, event) self.roster.draw_contact(jid, account) elif type_ == 'subscription_request': event = app.events.get_first_event(account, jid, type_) dialogs.SubscriptionRequestWindow(jid, event.text, account, event.nick) app.events.remove_events(account, jid, event) self.roster.draw_contact(jid, account) elif type_ == 'unsubscribed': event = app.events.get_first_event(account, jid, type_) self.show_unsubscribed_dialog(account, event.contact) app.events.remove_events(account, jid, event) self.roster.draw_contact(jid, account) if w: w.set_active_tab(ctrl) w.window.present() # Using isinstance here because we want to catch all derived types if isinstance(ctrl, ChatControlBase): ctrl.scroll_to_end() def join_gc_minimal(self, account, room_jid, password=None, transient_for=None): if account is not None: if app.in_groupchat(account, room_jid): # If we already in the groupchat, join_gc_room will bring # it to front app.interface.join_gc_room(account, room_jid, '', '') return for bookmark in app.connections[account].bookmarks: if bookmark['jid'] != room_jid: continue app.interface.join_gc_room( account, room_jid, bookmark['nick'], bookmark['password']) return try: room_jid = helpers.parse_jid(room_jid) except helpers.InvalidFormat: dialogs.ErrorDialog('Invalid JID', transient_for=app.app.get_active_window()) return connected_accounts = app.get_connected_accounts() if account is not None and account not in connected_accounts: connected_accounts = None if not connected_accounts: dialogs.ErrorDialog( _('You are not connected to the server'), _('You can not join a group chat unless you are connected.'), transient_for=app.app.get_active_window()) return def _on_discover_result(): if not muc_caps_cache.is_cached(room_jid): dialogs.ErrorDialog(_('JID is not a Groupchat'), transient_for=app.app.get_active_window()) return dialogs.JoinGroupchatWindow(account, room_jid, password=password, transient_for=transient_for) disco_account = connected_accounts[0] if account is None else account app.connections[disco_account].discoverMUC( room_jid, _on_discover_result) ################################################################################ ### Methods dealing with emoticons ################################################################################ @property def basic_pattern_re(self): if not self._basic_pattern_re: self._basic_pattern_re = re.compile(self.basic_pattern, re.IGNORECASE) return self._basic_pattern_re @property def emot_and_basic_re(self): if not self._emot_and_basic_re: self._emot_and_basic_re = re.compile(self.emot_and_basic, re.IGNORECASE + re.UNICODE) return self._emot_and_basic_re @property def sth_at_sth_dot_sth_re(self): if not self._sth_at_sth_dot_sth_re: self._sth_at_sth_dot_sth_re = re.compile(self.sth_at_sth_dot_sth) return self._sth_at_sth_dot_sth_re @property def invalid_XML_chars_re(self): if not self._invalid_XML_chars_re: self._invalid_XML_chars_re = re.compile(self.invalid_XML_chars) return self._invalid_XML_chars_re def make_regexps(self): # regexp meta characters are: . ^ $ * + ? { } [ ] \ | ( ) # one escapes the metachars with \ # \S matches anything but ' ' '\t' '\n' '\r' '\f' and '\v' # \s matches any whitespace character # \w any alphanumeric character # \W any non-alphanumeric character # \b means word boundary. This is a zero-width assertion that # matches only at the beginning or end of a word. # ^ matches at the beginning of lines # # * means 0 or more times # + means 1 or more times # ? means 0 or 1 time # | means or # [^*] anything but '*' (inside [] you don't have to escape metachars) # [^\s*] anything but whitespaces and '*' # (? in the matching string don't match ? or ) etc.. if at # the end # so http://be) will match http://be and http://be)be) will match # http://be)be legacy_prefixes = r"((?<=\()(www|ftp)\.([A-Za-z0-9\.\-_~:/\?#\[\]@!\$"\ r"&'\(\)\*\+,;=]|%[A-Fa-f0-9]{2})+(?=\)))"\ r"|((www|ftp)\.([A-Za-z0-9\.\-_~:/\?#\[\]@!\$&'\(\)\*\+,;=]"\ r"|%[A-Fa-f0-9]{2})+"\ r"\.([A-Za-z0-9\.\-_~:/\?#\[\]@!\$&'\(\)\*\+,;=]|%[A-Fa-f0-9]{2})+)" # NOTE: it's ok to catch www.gr such stuff exist! # FIXME: recognize xmpp: and treat it specially links = r"((?<=\()[A-Za-z][A-Za-z0-9\+\.\-]*:"\ r"([\w\.\-_~:/\?#\[\]@!\$&'\(\)\*\+,;=]|%[A-Fa-f0-9]{2})+"\ r"(?=\)))|(\w[\w\+\.\-]*:([^<>\s]|%[A-Fa-f0-9]{2})+)" # 2nd one: at_least_one_char@at_least_one_char.at_least_one_char mail = r'\bmailto:\S*[^\s\W]|' r'\b\S+@\S+\.\S*[^\s\W]' # detects eg. *b* *bold* *bold bold* test *bold* *bold*! (*bold*) # doesn't detect (it's a feature :P) * bold* *bold * * bold * test*bold* formatting = r'|(? bm['name']: place_found = True break index += 1 if place_found: app.connections[account].bookmarks.insert(index, bm) else: app.connections[account].bookmarks.append(bm) app.connections[account].store_bookmarks() gui_menu_builder.build_bookmark_menu(account) # does JID exist only within a groupchat? def is_pm_contact(self, fjid, account): bare_jid = app.get_jid_without_resource(fjid) gc_ctrl = self.msg_win_mgr.get_gc_control(bare_jid, account) if not gc_ctrl and \ bare_jid in self.minimized_controls[account]: gc_ctrl = self.minimized_controls[account][bare_jid] return gc_ctrl and gc_ctrl.type_id == message_control.TYPE_GC @staticmethod def get_pep_icon(pep_obj): if isinstance(pep_obj, pep.UserMoodPEP): received_mood = pep_obj._pep_specific_data['mood'] mood = received_mood if received_mood in pep.MOODS else 'unknown' return gtkgui_helpers.load_mood_icon(mood).get_pixbuf() elif isinstance(pep_obj, pep.UserTunePEP): path = os.path.join(app.DATA_DIR, 'emoticons', 'static', 'music.png') return GdkPixbuf.Pixbuf.new_from_file(path) elif isinstance(pep_obj, pep.UserActivityPEP): pep_ = pep_obj._pep_specific_data activity = pep_['activity'] has_known_activity = activity in pep.ACTIVITIES has_known_subactivity = (has_known_activity and ('subactivity' in pep_) and (pep_['subactivity'] in pep.ACTIVITIES[activity])) if has_known_activity: if has_known_subactivity: subactivity = pep_['subactivity'] return gtkgui_helpers.load_activity_icon(activity, subactivity).get_pixbuf() else: return gtkgui_helpers.load_activity_icon(activity).\ get_pixbuf() else: return gtkgui_helpers.load_activity_icon('unknown').get_pixbuf() elif isinstance(pep_obj, pep.UserLocationPEP): icon = gtkgui_helpers.get_icon_pixmap('applications-internet', quiet=True) return icon @staticmethod def create_ipython_window(): try: from gajim.dev.ipython_view import IPythonView except ImportError: print('ipython_view not found') return from gi.repository import Pango if os.name == 'nt': font = 'Lucida Console 9' else: font = 'Luxi Mono 10' window = Gtk.Window() window.set_size_request(750, 550) window.set_resizable(True) sw = Gtk.ScrolledWindow() sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) view = IPythonView() view.override_font(Pango.FontDescription(font)) view.set_wrap_mode(Gtk.WrapMode.CHAR) sw.add(view) window.add(sw) window.show_all() def on_delete(win, event): win.hide() return True window.connect('delete_event', on_delete) view.updateNamespace({'gajim': app}) app.ipython_window = window def network_status_changed(self, monitor, connected): if connected == self.network_state: # This callback gets called a lot from GTK with the # same state, not only on change. return self.network_state = connected if connected: for connection in app.connections.values(): if connection.connected <= 0 and connection.time_to_reconnect: log.info('Connect %s', connection.name) connection.reconnect() else: for connection in app.connections.values(): if connection.connected > 1: log.info('Disconnect %s', connection.name) connection.disconnectedReconnCB() def create_zeroconf_default_config(self): if app.config.get_per('accounts', app.ZEROCONF_ACC_NAME, 'name'): return log.info('Creating zeroconf account') app.config.add_per('accounts', app.ZEROCONF_ACC_NAME) app.config.set_per('accounts', app.ZEROCONF_ACC_NAME, 'autoconnect', True) app.config.set_per('accounts', app.ZEROCONF_ACC_NAME, 'no_log_for', '') app.config.set_per('accounts', app.ZEROCONF_ACC_NAME, 'password', 'zeroconf') app.config.set_per('accounts', app.ZEROCONF_ACC_NAME, 'sync_with_global_status', True) app.config.set_per('accounts', app.ZEROCONF_ACC_NAME, 'custom_port', 5298) app.config.set_per('accounts', app.ZEROCONF_ACC_NAME, 'is_zeroconf', True) app.config.set_per('accounts', app.ZEROCONF_ACC_NAME, 'use_ft_proxies', False) app.config.set_per('accounts', app.ZEROCONF_ACC_NAME, 'active', False) def run(self, application): if app.config.get('trayicon') != 'never': self.show_systray() self.roster = roster_window.RosterWindow(application) if self.msg_win_mgr.mode == \ MessageWindowMgr.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: self.msg_win_mgr.create_window(None, None, None) # Creating plugin manager from gajim import plugins app.plugin_manager = plugins.PluginManager() app.plugin_manager.init_plugins() helpers.update_optional_features() # prepopulate data which we are sure of; note: we do not log these info for account in app.connections: gajimcaps = caps_cache.capscache[ ('sha-1', app.caps_hash[account])] gajimcaps.identities = [app.gajim_identity] gajimcaps.features = app.gajim_common_features + \ app.gajim_optional_features[account] self.roster._before_fill() for account in app.connections: app.connections[account].load_roster_from_db() self.roster._after_fill() # get instances for windows/dialogs that will show_all()/hide() self.instances['file_transfers'] = FileTransfersWindow() GLib.timeout_add(100, self.autoconnect) if sys.platform == 'win32': timeout, in_seconds = 20, None else: timeout, in_seconds = app.idlequeue.PROCESS_TIMEOUT if in_seconds: GLib.timeout_add_seconds(timeout, self.process_connections) else: GLib.timeout_add(timeout, self.process_connections) GLib.timeout_add_seconds(app.config.get( 'check_idle_every_foo_seconds'), self.read_sleepy) def remote_init(): if app.config.get('remote_control'): try: from gajim import remote_control self.remote_ctrl = remote_control.Remote() except Exception: pass GLib.timeout_add_seconds(5, remote_init) def __init__(self): app.interface = self app.thread_interface = ThreadInterface # This is the manager and factory of message windows set by the module self.msg_win_mgr = None self.jabber_state_images = {'16': {}, '24': {}, '32': {}, 'opened': {}, 'closed': {}} self.minimized_controls = {} self.status_sent_to_users = {} self.status_sent_to_groups = {} self.gpg_passphrase = {} self.pass_dialog = {} self.db_error_dialog = None self.default_colors = { 'inmsgcolor': app.config.get('inmsgcolor'), 'outmsgcolor': app.config.get('outmsgcolor'), 'inmsgtxtcolor': app.config.get('inmsgtxtcolor'), 'outmsgtxtcolor': app.config.get('outmsgtxtcolor'), 'statusmsgcolor': app.config.get('statusmsgcolor'), 'urlmsgcolor': app.config.get('urlmsgcolor'), 'markedmsgcolor': app.config.get('markedmsgcolor'), } self.handlers = {} self.roster = None self._invalid_XML_chars_re = None self._basic_pattern_re = None self._emot_and_basic_re = None self._sth_at_sth_dot_sth_re = None self.link_pattern_re = None self.invalid_XML_chars = None self.basic_pattern = None self.emot_and_basic = None self.sth_at_sth_dot_sth = None self.emot_only = None cfg_was_read = parser.read() if not cfg_was_read: # enable plugin_installer by default when creating config file app.config.set_per('plugins', 'plugin_installer', 'active', True) app.logger.reset_shown_unread_messages() # override logging settings from config (don't take care of '-q' option) if app.config.get('verbose'): logging_helpers.set_verbose() for account in app.config.get_per('accounts'): if app.config.get_per('accounts', account, 'is_zeroconf'): app.ZEROCONF_ACC_NAME = account break # Is gnome configured to activate row on single click ? # try: # gi.require_version('GConf', '2.0') # from gi.repository import GConf # client = GConf.Client.get_default() # click_policy = client.get_string( # '/apps/nautilus/preferences/click_policy') # if click_policy == 'single': # app.single_click = True # except Exception: # pass # add default status messages if there is not in the config file if len(app.config.get_per('statusmsg')) == 0: default = app.config.statusmsg_default for msg in default: app.config.add_per('statusmsg', msg) app.config.set_per('statusmsg', msg, 'message', default[msg][0]) app.config.set_per('statusmsg', msg, 'activity', default[msg][1]) app.config.set_per('statusmsg', msg, 'subactivity', default[msg][2]) app.config.set_per('statusmsg', msg, 'activity_text', default[msg][3]) app.config.set_per('statusmsg', msg, 'mood', default[msg][4]) app.config.set_per('statusmsg', msg, 'mood_text', default[msg][5]) #add default themes if there is not in the config file theme = app.config.get('roster_theme') if not theme in app.config.get_per('themes'): app.config.set('roster_theme', _('default')) if len(app.config.get_per('themes')) == 0: d = ['accounttextcolor', 'accountbgcolor', 'accountfont', 'accountfontattrs', 'grouptextcolor', 'groupbgcolor', 'groupfont', 'groupfontattrs', 'contacttextcolor', 'contactbgcolor', 'contactfont', 'contactfontattrs', 'bannertextcolor', 'bannerbgcolor'] default = app.config.themes_default for theme_name in default: app.config.add_per('themes', theme_name) theme = default[theme_name] for o in d: app.config.set_per('themes', theme_name, o, theme[d.index(o)]) # Add Tor proxy if there is not in the config if len(app.config.get_per('proxies')) == 0: default = app.config.proxies_default for proxy in default: app.config.add_per('proxies', proxy) app.config.set_per('proxies', proxy, 'type', default[proxy][0]) app.config.set_per('proxies', proxy, 'host', default[proxy][1]) app.config.set_per('proxies', proxy, 'port', default[proxy][2]) app.idlequeue = idlequeue.get_idlequeue() # resolve and keep current record of resolved hosts app.resolver = resolver.get_resolver() app.socks5queue = socks5.SocksQueue(app.idlequeue, self.handle_event_file_rcv_completed, self.handle_event_file_progress, self.handle_event_file_error) app.proxy65_manager = proxy65_manager.Proxy65Manager(app.idlequeue) app.default_session_type = ChatControlSession # Creating Network Events Controller from gajim.common import nec app.nec = nec.NetworkEventsController() app.notification = notify.Notification() self.create_core_handlers_list() self.register_core_handlers() self.create_zeroconf_default_config() if app.config.get_per('accounts', app.ZEROCONF_ACC_NAME, 'active') \ and app.HAVE_ZEROCONF: app.connections[app.ZEROCONF_ACC_NAME] = \ connection_zeroconf.ConnectionZeroconf(app.ZEROCONF_ACC_NAME) for account in app.config.get_per('accounts'): if not app.config.get_per('accounts', account, 'is_zeroconf') and\ app.config.get_per('accounts', account, 'active'): app.connections[account] = Connection(account) # gtk hooks # Gtk.about_dialog_set_email_hook(self.on_launch_browser_mailer, 'mail') # Gtk.about_dialog_set_url_hook(self.on_launch_browser_mailer, 'url') # Gtk.link_button_set_uri_hook(self.on_launch_browser_mailer, 'url') self.instances = {} for a in app.connections: self.instances[a] = {'infos': {}, 'disco': {}, 'gc_config': {}, 'search': {}, 'online_dialog': {}, 'sub_request': {}} # online_dialog contains all dialogs that have a meaning only when # we are not disconnected self.minimized_controls[a] = {} app.contacts.add_account(a) app.groups[a] = {} app.gc_connected[a] = {} app.automatic_rooms[a] = {} app.newly_added[a] = [] app.to_be_removed[a] = [] app.nicks[a] = app.config.get_per('accounts', a, 'name') app.block_signed_in_notifications[a] = True app.sleeper_state[a] = 0 app.encrypted_chats[a] = [] app.last_message_time[a] = {} app.status_before_autoaway[a] = '' app.transport_avatar[a] = {} app.gajim_optional_features[a] = [] app.caps_hash[a] = '' self.remote_ctrl = None # Handle screensaver if sys.platform == 'linux': from gajim import logind_listener from gajim import screensaver_listener self.show_vcard_when_connect = [] self.sleeper = sleepy.Sleepy( app.config.get('autoawaytime') * 60, # make minutes to seconds app.config.get('autoxatime') * 60) gtkgui_helpers.make_jabber_state_images() self.systray_enabled = False from gajim import statusicon self.systray = statusicon.StatusIcon() pixs = [] for size in (16, 32, 48, 64, 128): pix = gtkgui_helpers.get_icon_pixmap('org.gajim.Gajim', size) if pix: pixs.append(pix) if pixs: # set the icon to all windows Gtk.Window.set_default_icon_list(pixs) self.init_emoticons() self.make_regexps() # get transports type from DB app.transport_type = app.logger.get_transports_type() if app.config.get('soundplayer') == '': # only on first time Gajim starts commands = ('paplay', 'aplay', 'play', 'ossplay') for command in commands: if helpers.is_in_path(command): if command == 'paplay': command += ' -n gajim --property=media.role=event' if command in ('aplay', 'play'): command += ' -q' elif command == 'ossplay': command += ' -qq' app.config.set('soundplayer', command) break self.last_ftwindow_update = 0 self.music_track_changed_signal = None self.network_monitor = Gio.NetworkMonitor.get_default() self.network_monitor.connect('network-changed', self.network_status_changed) self.network_state = self.network_monitor.get_network_available() class PassphraseRequest: def __init__(self, keyid): self.keyid = keyid self.callbacks = [] self.dialog_created = False self.dialog = None self.passphrase = None self.completed = False def interrupt(self, account=None): if account: for (acct, cb) in self.callbacks: if acct == account: self.callbacks.remove((acct, cb)) else: self.callbacks = [] if not len(self.callbacks): self.dialog.window.destroy() def run_callback(self, account, callback): app.connections[account].gpg_passphrase(self.passphrase) callback() def add_callback(self, account, cb): if self.completed: self.run_callback(account, cb) else: self.callbacks.append((account, cb)) if not self.dialog_created: self.create_dialog(account) def complete(self, passphrase): self.passphrase = passphrase self.completed = True if passphrase is not None: GLib.timeout_add_seconds(30, app.interface.forget_gpg_passphrase, self.keyid) for (account, cb) in self.callbacks: self.run_callback(account, cb) self.callbacks = [] def create_dialog(self, account): title = _('Passphrase Required') second = _('Enter OpenPGP key passphrase for key %(keyid)s (account ' '%(account)s).') % {'keyid': self.keyid, 'account': account} def _cancel(): # user cancelled, continue without GPG self.complete(None) def _ok(passphrase, checked, count): result = app.connections[account].test_gpg_passphrase(passphrase) if result == 'ok': # passphrase is good self.complete(passphrase) return elif result == 'expired': dialogs.ErrorDialog(_('OpenPGP key expired'), _('Your OpenPGP key has expired, you will be connected to ' '%s without OpenPGP.') % account) # Don't try to connect with GPG app.connections[account].continue_connect_info[2] = False self.complete(None) return if count < 3: # ask again dialogs.PassphraseDialog(_('Wrong Passphrase'), _('Please retype your OpenPGP passphrase or press Cancel.'), ok_handler=(_ok, count + 1), cancel_handler=_cancel) else: # user failed 3 times, continue without GPG self.complete(None) self.dialog = dialogs.PassphraseDialog(title, second, ok_handler=(_ok, 1), cancel_handler=_cancel) self.dialog_created = True class ThreadInterface: def __init__(self, func, func_args=(), callback=None, callback_args=()): """ Call a function in a thread """ def thread_function(func, func_args, callback, callback_args): output = func(*func_args) if callback: GLib.idle_add(callback, output, *callback_args) Thread(target=thread_function, args=(func, func_args, callback, callback_args)).start() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/gui_menu_builder.py000066400000000000000000001014641326020644600256700ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/gui_menu_builder.py ## ## Copyright (C) 2009-2014 Yann Leboulanger ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gi.repository import Gtk, Gio, GLib import os from gajim import gtkgui_helpers from gajim import message_control from gajim.common import app from gajim.common import helpers from gajim.common import i18n from nbxmpp.protocol import NS_COMMANDS, NS_FILE, NS_MUC, NS_ESESSION from nbxmpp.protocol import NS_JINGLE_FILE_TRANSFER_5, NS_CONFERENCE from gajim.gtkgui_helpers import get_action def build_resources_submenu(contacts, account, action, room_jid=None, room_account=None, cap=None): """ Build a submenu with contact's resources. room_jid and room_account are for action self.on_invite_to_room """ roster = app.interface.roster sub_menu = Gtk.Menu() iconset = app.config.get('iconset') if not iconset: iconset = app.config.DEFAULT_ICONSET path = os.path.join(helpers.get_iconset_path(iconset), '16x16') for c in contacts: item = Gtk.MenuItem.new_with_label( '%s (%s)' % (c.resource, str(c.priority))) sub_menu.append(item) if action == roster.on_invite_to_room: item.connect('activate', action, [(c, account)], room_jid, room_account, c.resource) elif action == roster.on_invite_to_new_room: item.connect('activate', action, [(c, account)], c.resource) else: # start_chat, execute_command, send_file item.connect('activate', action, c, account, c.resource) if cap and not c.supports(cap): item.set_sensitive(False) return sub_menu def build_invite_submenu(invite_menuitem, list_, ignore_rooms=None, show_bookmarked=False, force_resource=False): """ list_ in a list of (contact, account) force_resource means we want to send invitation even if there is only one resource """ if ignore_rooms is None: ignore_rooms = [] roster = app.interface.roster # used if we invite only one contact with several resources contact_list = [] if len(list_) == 1: contact, account = list_[0] contact_list = app.contacts.get_contacts(account, contact.jid) contacts_transport = -1 connected_accounts = [] # -1 is at start, False when not from the same, None when jabber for (contact, account) in list_: if not account in connected_accounts: connected_accounts.append(account) transport = app.get_transport_name_from_jid(contact.jid) if transport == 'jabber': transport = None if contacts_transport == -1: contacts_transport = transport elif contacts_transport != transport: contacts_transport = False if contacts_transport == False: # they are not all from the same transport invite_menuitem.set_sensitive(False) return invite_to_submenu = Gtk.Menu() invite_menuitem.set_submenu(invite_to_submenu) invite_to_new_room_menuitem = Gtk.MenuItem.new_with_mnemonic(_( '_New Group Chat')) if len(contact_list) > 1: # several resources invite_to_new_room_menuitem.set_submenu(build_resources_submenu( contact_list, account, roster.on_invite_to_new_room, cap=NS_MUC)) elif len(list_) == 1 and contact.supports(NS_MUC): invite_menuitem.set_sensitive(True) # use resource if it's self contact if contact.jid == app.get_jid_from_account(account) or force_resource: resource = contact.resource else: resource = None invite_to_new_room_menuitem.connect('activate', roster.on_invite_to_new_room, list_, resource) elif len(list_) > 1: list2 = [] for (c, a) in list_: if c.supports(NS_MUC): list2.append((c, a)) if len(list2) > 0: invite_to_new_room_menuitem.connect('activate', roster.on_invite_to_new_room, list2, None) else: invite_menuitem.set_sensitive(False) else: invite_menuitem.set_sensitive(False) # transform None in 'jabber' c_t = contacts_transport or 'jabber' muc_jid = {} for account in connected_accounts: for t in app.connections[account].muc_jid: muc_jid[t] = app.connections[account].muc_jid[t] if c_t not in muc_jid: invite_to_new_room_menuitem.set_sensitive(False) rooms = [] # a list of (room_jid, account) tuple invite_to_submenu.append(invite_to_new_room_menuitem) minimized_controls = [] for account in connected_accounts: minimized_controls += \ list(app.interface.minimized_controls[account].values()) for gc_control in app.interface.msg_win_mgr.get_controls( message_control.TYPE_GC) + minimized_controls: acct = gc_control.account if acct not in connected_accounts: continue room_jid = gc_control.room_jid if room_jid in ignore_rooms: continue if room_jid in app.gc_connected[acct] and \ app.gc_connected[acct][room_jid] and \ contacts_transport in ['jabber', None]: rooms.append((room_jid, acct)) if len(rooms): item = Gtk.SeparatorMenuItem.new() # separator invite_to_submenu.append(item) for (room_jid, account) in rooms: menuitem = Gtk.MenuItem.new_with_label(room_jid.split('@')[0]) if len(contact_list) > 1: # several resources menuitem.set_submenu(build_resources_submenu( contact_list, account, roster.on_invite_to_room, room_jid, account)) else: # use resource if it's self contact if contact.jid == app.get_jid_from_account(account): resource = contact.resource else: resource = None menuitem.connect('activate', roster.on_invite_to_room, list_, room_jid, account, resource) invite_to_submenu.append(menuitem) if not show_bookmarked: return rooms2 = [] # a list of (room_jid, account) tuple r_jids = [] # list of room jids for account in connected_accounts: for room in app.connections[account].bookmarks: r_jid = room['jid'] if r_jid in r_jids: continue if r_jid not in app.gc_connected[account] or not \ app.gc_connected[account][r_jid]: rooms2.append((r_jid, account)) r_jids.append(r_jid) if not rooms2: return item = Gtk.SeparatorMenuItem.new() # separator invite_to_submenu.append(item) for (room_jid, account) in rooms2: menuitem = Gtk.MenuItem.new_with_label(room_jid.split('@')[0]) if len(contact_list) > 1: # several resources menuitem.set_submenu(build_resources_submenu( contact_list, account, roster.on_invite_to_room, room_jid, account)) else: # use resource if it's self contact if contact.jid == app.get_jid_from_account(account): resource = contact.resource else: resource = None menuitem.connect('activate', roster.on_invite_to_room, list_, room_jid, account, resource) invite_to_submenu.append(menuitem) def get_contact_menu(contact, account, use_multiple_contacts=True, show_start_chat=True, show_encryption=False, show_buttonbar_items=True, control=None, gc_contact=None, is_anonymous=True): """ Build contact popup menu for roster and chat window. If control is not set, we hide invite_contacts_menuitem """ if not contact: return jid = contact.jid our_jid = jid == app.get_jid_from_account(account) roster = app.interface.roster xml = gtkgui_helpers.get_gtk_builder('contact_context_menu.ui') contact_context_menu = xml.get_object('contact_context_menu') start_chat_menuitem = xml.get_object('start_chat_menuitem') execute_command_menuitem = xml.get_object('execute_command_menuitem') rename_menuitem = xml.get_object('rename_menuitem') edit_groups_menuitem = xml.get_object('edit_groups_menuitem') send_file_menuitem = xml.get_object('send_file_menuitem') assign_openpgp_key_menuitem = xml.get_object('assign_openpgp_key_menuitem') add_special_notification_menuitem = xml.get_object( 'add_special_notification_menuitem') information_menuitem = xml.get_object('information_menuitem') history_menuitem = xml.get_object('history_menuitem') send_custom_status_menuitem = xml.get_object('send_custom_status_menuitem') send_single_message_menuitem = xml.get_object('send_single_message_menuitem') invite_menuitem = xml.get_object('invite_menuitem') block_menuitem = xml.get_object('block_menuitem') unblock_menuitem = xml.get_object('unblock_menuitem') ignore_menuitem = xml.get_object('ignore_menuitem') unignore_menuitem = xml.get_object('unignore_menuitem') # Subscription submenu subscription_menuitem = xml.get_object('subscription_menuitem') send_auth_menuitem, ask_auth_menuitem, revoke_auth_menuitem = \ subscription_menuitem.get_submenu().get_children() add_to_roster_menuitem = xml.get_object('add_to_roster_menuitem') remove_from_roster_menuitem = xml.get_object( 'remove_from_roster_menuitem') manage_contact_menuitem = xml.get_object('manage_contact') convert_to_gc_menuitem = xml.get_object('convert_to_groupchat_menuitem') last_separator = xml.get_object('last_separator') items_to_hide = [] contacts = app.contacts.get_contacts(account, jid) if len(contacts) > 1 and use_multiple_contacts: # several resources start_chat_menuitem.set_submenu(build_resources_submenu(contacts, account, app.interface.on_open_chat_window)) send_file_menuitem.set_submenu(build_resources_submenu(contacts, account, roster.on_send_file_menuitem_activate, cap=NS_FILE)) execute_command_menuitem.set_submenu(build_resources_submenu( contacts, account, roster.on_execute_command, cap=NS_COMMANDS)) else: start_chat_menuitem.connect('activate', app.interface.on_open_chat_window, contact, account) if contact.supports(NS_FILE) or contact.supports(NS_JINGLE_FILE_TRANSFER_5): send_file_menuitem.set_sensitive(True) send_file_menuitem.connect('activate', roster.on_send_file_menuitem_activate, contact, account) else: send_file_menuitem.set_sensitive(False) if contact.supports(NS_COMMANDS): execute_command_menuitem.set_sensitive(True) if gc_contact and gc_contact.jid and not is_anonymous: execute_command_menuitem.connect('activate', roster.on_execute_command, gc_contact, account, gc_contact.resource) else: execute_command_menuitem.connect('activate', roster.on_execute_command, contact, account, contact.resource) else: execute_command_menuitem.set_sensitive(False) rename_menuitem.connect('activate', roster.on_rename, 'contact', jid, account) history_menuitem.connect('activate', roster.on_history, contact, account) if control: convert_to_gc_menuitem.connect('activate', control._on_convert_to_gc_menuitem_activate) else: items_to_hide.append(convert_to_gc_menuitem) if _('Not in Roster') not in contact.get_shown_groups(): # contact is in normal group edit_groups_menuitem.connect('activate', roster.on_edit_groups, [(contact, account)]) if app.connections[account].gpg: assign_openpgp_key_menuitem.connect('activate', roster.on_assign_pgp_key, contact, account) else: assign_openpgp_key_menuitem.set_sensitive(False) else: # contact is in group 'Not in Roster' edit_groups_menuitem.set_sensitive(False) assign_openpgp_key_menuitem.set_sensitive(False) # Hide items when it's self contact row if our_jid: items_to_hide += [rename_menuitem, edit_groups_menuitem] # Unsensitive many items when account is offline if app.account_is_disconnected(account): for widget in (start_chat_menuitem, rename_menuitem, edit_groups_menuitem, send_file_menuitem, convert_to_gc_menuitem, information_menuitem): widget.set_sensitive(False) if not show_start_chat: items_to_hide.append(start_chat_menuitem) if not show_buttonbar_items: items_to_hide += [history_menuitem, send_file_menuitem, information_menuitem, convert_to_gc_menuitem, last_separator] if not control: items_to_hide.append(convert_to_gc_menuitem) # Hide items when it's a pm if gc_contact: items_to_hide += [rename_menuitem, edit_groups_menuitem, subscription_menuitem, remove_from_roster_menuitem] for item in items_to_hide: item.set_no_show_all(True) item.hide() # Zeroconf Account if app.config.get_per('accounts', account, 'is_zeroconf'): for item in (send_custom_status_menuitem, send_single_message_menuitem, invite_menuitem, block_menuitem, unblock_menuitem, ignore_menuitem, unignore_menuitem, subscription_menuitem, manage_contact_menuitem, convert_to_gc_menuitem): item.set_no_show_all(True) item.hide() if contact.show in ('offline', 'error'): information_menuitem.set_sensitive(False) send_file_menuitem.set_sensitive(False) else: information_menuitem.connect('activate', roster.on_info_zeroconf, contact, account) contact_context_menu.connect('selection-done', gtkgui_helpers.destroy_widget) contact_context_menu.show_all() return contact_context_menu # normal account # send custom status icon blocked = False if helpers.jid_is_blocked(account, jid): blocked = True else: for group in contact.get_shown_groups(): if helpers.group_is_blocked(account, group): blocked = True break transport = app.get_transport_name_from_jid(jid, use_config_setting=False) if transport and transport != 'jabber': # Transport contact, send custom status unavailable send_custom_status_menuitem.set_sensitive(False) elif blocked: send_custom_status_menuitem.set_sensitive(False) if gc_contact: if not gc_contact.jid: # it's a pm and we don't know real JID invite_menuitem.set_sensitive(False) else: bookmarked = False c_ = app.contacts.get_contact(account, gc_contact.jid, gc_contact.resource) if c_ and c_.supports(NS_CONFERENCE): bookmarked=True build_invite_submenu(invite_menuitem, [(gc_contact, account)], show_bookmarked=bookmarked) else: force_resource = False if control and control.resource: force_resource = True build_invite_submenu(invite_menuitem, [(contact, account)], show_bookmarked=contact.supports(NS_CONFERENCE), force_resource=force_resource) if app.account_is_disconnected(account): invite_menuitem.set_sensitive(False) # One or several resource, we do the same for send_custom_status status_menuitems = Gtk.Menu() send_custom_status_menuitem.set_submenu(status_menuitems) for s in ('online', 'chat', 'away', 'xa', 'dnd', 'offline'): # icon MUST be different instance for every item status_menuitem = Gtk.MenuItem.new_with_label(helpers.get_uf_show(s)) status_menuitem.connect('activate', roster.on_send_custom_status, [(contact, account)], s) status_menuitems.append(status_menuitem) send_single_message_menuitem.connect('activate', roster.on_send_single_message_menuitem_activate, account, contact) remove_from_roster_menuitem.connect('activate', roster.on_req_usub, [(contact, account)]) information_menuitem.connect('activate', roster.on_info, contact, account) if _('Not in Roster') not in contact.get_shown_groups(): # contact is in normal group add_to_roster_menuitem.hide() add_to_roster_menuitem.set_no_show_all(True) if contact.sub in ('from', 'both'): send_auth_menuitem.set_sensitive(False) else: send_auth_menuitem.connect('activate', roster.authorize, jid, account) if contact.sub in ('to', 'both'): ask_auth_menuitem.set_sensitive(False) add_special_notification_menuitem.connect('activate', roster.on_add_special_notification_menuitem_activate, jid) else: ask_auth_menuitem.connect('activate', roster.req_sub, jid, _('I would like to add you to my roster'), account, contact.groups, contact.name) transport = app.get_transport_name_from_jid(jid, use_config_setting=False) if contact.sub in ('to', 'none') or transport not in ['jabber', None]: revoke_auth_menuitem.set_sensitive(False) else: revoke_auth_menuitem.connect('activate', roster.revoke_auth, jid, account) elif app.connections[account].roster_supported: # contact is in group 'Not in Roster' add_to_roster_menuitem.set_no_show_all(False) subscription_menuitem.set_sensitive(False) add_to_roster_menuitem.connect('activate', roster.on_add_to_roster, contact, account) else: add_to_roster_menuitem.hide() add_to_roster_menuitem.set_no_show_all(True) subscription_menuitem.set_sensitive(False) # Hide items when it's self contact row if our_jid: manage_contact_menuitem.set_sensitive(False) # Unsensitive items when account is offline if app.account_is_disconnected(account): for widget in (send_single_message_menuitem, subscription_menuitem, add_to_roster_menuitem, remove_from_roster_menuitem, execute_command_menuitem, send_custom_status_menuitem): widget.set_sensitive(False) if app.connections[account] and (app.connections[account].\ privacy_rules_supported or app.connections[account].blocking_supported): if helpers.jid_is_blocked(account, jid): block_menuitem.set_no_show_all(True) block_menuitem.hide() if app.get_transport_name_from_jid(jid, use_config_setting=False)\ and transport != 'jabber': unblock_menuitem.set_no_show_all(True) unblock_menuitem.hide() unignore_menuitem.set_no_show_all(False) unignore_menuitem.connect('activate', roster.on_unblock, [(contact, account)]) else: unblock_menuitem.connect('activate', roster.on_unblock, [(contact, account)]) else: unblock_menuitem.set_no_show_all(True) unblock_menuitem.hide() if app.get_transport_name_from_jid(jid, use_config_setting=False)\ and transport != 'jabber': block_menuitem.set_no_show_all(True) block_menuitem.hide() ignore_menuitem.set_no_show_all(False) ignore_menuitem.connect('activate', roster.on_block, [(contact, account)]) else: block_menuitem.connect('activate', roster.on_block, [(contact, account)]) else: unblock_menuitem.set_no_show_all(True) block_menuitem.set_sensitive(False) unblock_menuitem.hide() contact_context_menu.connect('selection-done', gtkgui_helpers.destroy_widget) contact_context_menu.show_all() return contact_context_menu def get_transport_menu(contact, account): roster = app.interface.roster jid = contact.jid menu = Gtk.Menu() # Send single message item = Gtk.MenuItem.new_with_mnemonic(_('Send Single _Message…')) item.connect('activate', roster.on_send_single_message_menuitem_activate, account, contact) menu.append(item) if app.account_is_disconnected(account): item.set_sensitive(False) blocked = False if helpers.jid_is_blocked(account, jid): blocked = True # Send Custom Status send_custom_status_menuitem = Gtk.MenuItem.new_with_mnemonic( _('Send Cus_tom Status')) if blocked: send_custom_status_menuitem.set_sensitive(False) else: status_menuitems = Gtk.Menu() send_custom_status_menuitem.set_submenu(status_menuitems) for s in ('online', 'chat', 'away', 'xa', 'dnd', 'offline'): status_menuitem = Gtk.MenuItem.new_with_label(helpers.get_uf_show( s)) status_menuitem.connect('activate', roster.on_send_custom_status, [(contact, account)], s) status_menuitems.append(status_menuitem) menu.append(send_custom_status_menuitem) if app.account_is_disconnected(account): send_custom_status_menuitem.set_sensitive(False) item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) # Execute Command item = Gtk.MenuItem.new_with_mnemonic(_('E_xecute Command…')) menu.append(item) item.connect('activate', roster.on_execute_command, contact, account, contact.resource) if app.account_is_disconnected(account): item.set_sensitive(False) # Manage Transport submenu item = Gtk.MenuItem.new_with_mnemonic(_('_Manage Transport')) manage_transport_submenu = Gtk.Menu() item.set_submenu(manage_transport_submenu) menu.append(item) # Modify Transport item = Gtk.MenuItem.new_with_mnemonic(_('_Modify Transport')) manage_transport_submenu.append(item) item.connect('activate', roster.on_edit_agent, contact, account) if app.account_is_disconnected(account): item.set_sensitive(False) # Rename item = Gtk.MenuItem.new_with_mnemonic(_('_Rename…')) manage_transport_submenu.append(item) item.connect('activate', roster.on_rename, 'agent', jid, account) if app.account_is_disconnected(account): item.set_sensitive(False) item = Gtk.SeparatorMenuItem.new() # separator manage_transport_submenu.append(item) # Block if blocked: item = Gtk.MenuItem.new_with_mnemonic(_('_Unblock')) item.connect('activate', roster.on_unblock, [(contact, account)]) else: item = Gtk.MenuItem.new_with_mnemonic(_('_Block')) item.connect('activate', roster.on_block, [(contact, account)]) manage_transport_submenu.append(item) if app.account_is_disconnected(account): item.set_sensitive(False) # Remove item = Gtk.MenuItem.new_with_mnemonic(_('Remo_ve')) manage_transport_submenu.append(item) item.connect('activate', roster.on_remove_agent, [(contact, account)]) if app.account_is_disconnected(account): item.set_sensitive(False) item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) # Information information_menuitem = Gtk.MenuItem.new_with_mnemonic(_('_Information')) menu.append(information_menuitem) information_menuitem.connect('activate', roster.on_info, contact, account) if app.account_is_disconnected(account): information_menuitem.set_sensitive(False) menu.connect('selection-done', gtkgui_helpers.destroy_widget) menu.show_all() return menu ''' Build dynamic Application Menus ''' def get_singlechat_menu(control_id): singlechat_menu = [ (_('Send File...'), [ ('win.send-file-httpupload-', 'HTTP Upload'), ('win.send-file-jingle-', 'Jingle'), ]), ('win.invite-contacts-', _('Invite Contacts')), ('win.add-to-roster-', _('Add to Roster')), ('win.toggle-audio-', _('Audio Session')), ('win.toggle-video-', _('Video Session')), ('win.information-', _('Information')), ('win.browse-history-', _('History')), ] def build_menu(preset): menu = Gio.Menu() for item in preset: if isinstance(item[1], str): action_name, label = item if action_name == 'win.browse-history-': menu.append(label, action_name + control_id + '::none') else: menu.append(label, action_name + control_id) else: label, sub_menu = item # This is a submenu submenu = build_menu(sub_menu) menu.append_submenu(label, submenu) return menu return build_menu(singlechat_menu) def get_groupchat_menu(control_id): groupchat_menu = [ (_('Manage Room'), [ ('win.change-subject-', _('Change Subject')), ('win.configure-', _('Configure Room')), ('win.destroy-', _('Destroy Room')), ]), ('win.change-nick-', _('Change Nick')), ('win.bookmark-', _('Bookmark Room')), ('win.request-voice-', _('Request Voice')), ('win.notify-on-message-', _('Notify on all messages')), ('win.minimize-', _('Minimize on close')), ('win.execute-command-', _('Execute command')), ('win.browse-history-', _('History')), ('win.disconnect-', _('Disconnect')), ] def build_menu(preset): menu = Gio.Menu() for item in preset: if isinstance(item[1], str): action_name, label = item if action_name == 'win.browse-history-': menu.append(label, action_name + control_id + '::none') else: menu.append(label, action_name + control_id) else: label, sub_menu = item # This is a submenu submenu = build_menu(sub_menu) menu.append_submenu(label, submenu) return menu return build_menu(groupchat_menu) def get_bookmarks_menu(account, rebuild=False): if not app.connections[account].bookmarks: return None menu = Gio.Menu() # Build Join Groupchat action = 'app.{}-join-groupchat'.format(account) menuitem = Gio.MenuItem.new(_('Join Group Chat'), action) variant = GLib.Variant('s', account) menuitem.set_action_and_target_value(action, variant) menu.append_item(menuitem) # Build Bookmarks section = Gio.Menu() for bookmark in app.connections[account].bookmarks: name = bookmark['name'] if not name: # No name was given for this bookmark. # Use the first part of JID instead... name = bookmark['jid'].split("@")[0] # Shorten long names name = (name[:42] + '..') if len(name) > 42 else name action = 'app.{}-activate-bookmark'.format(account) menuitem = Gio.MenuItem.new(name, action) # Create Variant Dict dict_ = {'account': GLib.Variant('s', account), 'jid': GLib.Variant('s', bookmark['jid'])} if bookmark['nick']: dict_['nick'] = GLib.Variant('s', bookmark['nick']) if bookmark['password']: dict_['password'] = GLib.Variant('s', bookmark['password']) variant_dict = GLib.Variant('a{sv}', dict_) menuitem.set_action_and_target_value(action, variant_dict) section.append_item(menuitem) menu.append_section(None, section) if not rebuild: get_action(account + '-activate-bookmark').set_enabled(True) return menu def get_account_menu(account): ''' [(action, label/sub_menu)] action: string label: string sub menu: list ''' account_menu = [ ('-add-contact', _('Add Contact...')), ('-join-groupchat', _('Join Group Chat')), ('-profile', _('Profile')), ('-services', _('Discover Services')), ('-start-single-chat', _('Send Single Message...')), (_('Advanced'), [ ('-archive', _('Archiving Preferences')), ('-sync-history', _('Synchronise History')), ('-privacylists', _('Privacy Lists')), ('-server-info', _('Server Info')), ('-xml-console', _('XML Console')) ]), (_('Admin'), [ ('-send-server-message', _('Send Server Message...')), ('-set-motd', _('Set MOTD...')), ('-update-motd', _('Update MOTD...')), ('-delete-motd', _('Delete MOTD...')) ]), ] def build_menu(preset): menu = Gio.Menu() for item in preset: if isinstance(item[1], str): action, label = item if action == '-join-groupchat': bookmark_menu = get_bookmarks_menu(account, True) if bookmark_menu: menu.append_submenu(label, bookmark_menu) continue action = 'app.{}{}'.format(account, action) menuitem = Gio.MenuItem.new(label, action) variant = GLib.Variant('s', account) menuitem.set_action_and_target_value(action, variant) menu.append_item(menuitem) else: label, sub_menu = item # This is a submenu submenu = build_menu(sub_menu) menu.append_submenu(label, submenu) return menu return build_menu(account_menu) def build_accounts_menu(): menubar = app.app.get_menubar() # Accounts Submenu menu_position = 1 if app.prefers_app_menu(): menu_position = 0 acc_menu = menubar.get_item_link(menu_position, 'submenu') acc_menu.remove_all() accounts_list = sorted(app.contacts.get_accounts()) if not accounts_list: no_accounts = _('No Accounts available') acc_menu.append_item(Gio.MenuItem.new(no_accounts, None)) return if len(accounts_list) > 1: for acc in accounts_list: label = escape_mnemonic( app.config.get_per('accounts', acc, 'account_label')) acc_menu.append_submenu( label or acc, get_account_menu(acc)) else: acc_menu = get_account_menu(accounts_list[0]) menubar.remove(menu_position) menubar.insert_submenu(menu_position, _('Accounts'), acc_menu) def build_bookmark_menu(account): menubar = app.app.get_menubar() bookmark_menu = get_bookmarks_menu(account) if not bookmark_menu: return menu_position = 1 if app.prefers_app_menu(): menu_position = 0 # Accounts Submenu acc_menu = menubar.get_item_link(menu_position, 'submenu') # We have more than one Account active if acc_menu.get_item_link(0, 'submenu'): for i in range(acc_menu.get_n_items()): label = acc_menu.get_item_attribute_value(i, 'label') account_label = escape_mnemonic( app.config.get_per('accounts', account, 'account_label')) if label.get_string() in (account_label, account): menu = acc_menu.get_item_link(i, 'submenu') else: # We have only one Account active menu = acc_menu label = menu.get_item_attribute_value(1, 'label').get_string() menu.remove(1) menu.insert_submenu(1, label, bookmark_menu) def get_encryption_menu(control_id, type_id): menu = Gio.Menu() menu.append( 'Disabled', 'win.set-encryption-{}::{}'.format(control_id, 'disabled')) for name, plugin in app.plugin_manager.encryption_plugins.items(): if type_id == 'gc': if not hasattr(plugin, 'allow_groupchat'): continue if type_id == 'pm': if not hasattr(plugin, 'allow_privatchat'): continue menu_action = 'win.set-encryption-{}::{}'.format( control_id, name) menu.append(name, menu_action) if menu.get_n_items() == 1: return None return menu def escape_mnemonic(label): if label is None: return # Underscore inside a label means the next letter is a keyboard # shortcut. To show an underscore we have to use double underscore return label.replace('_', '__') gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/history_manager.py000066400000000000000000000646551326020644600255570ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/history_manager.py ## ## Copyright (C) 2006 Dimitur Kirov ## Copyright (C) 2006-2007 Jean-Marie Traissard ## Nikos Kouremenos ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2007 Stephan Erb ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## ## NOTE: some method names may match those of logger.py but that's it ## someday (TM) should have common class ## that abstracts db connections and helpers on it ## the same can be said for history_window.py import os import sys import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GLib import time import getopt from gajim.common import i18n def parseOpts(): config_path = None try: shortargs = 'hvsc:l:p:' longargs = 'help verbose separate config-path= loglevel= profile=' opts = getopt.getopt(sys.argv[1:], shortargs, longargs.split())[0] except getopt.error as msg: print(str(msg)) print('for help use --help') sys.exit(2) for o, a in opts: if o in ('-h', '--help'): print(_('Usage:') + \ '\n gajim-history-manager [options] filename\n\n' + \ _('Options:') + \ '\n -h, --help ' + \ _('Show this help message and exit') + \ '\n -c, --config-path ' + _('Choose folder for logfile') + '\n') sys.exit() elif o in ('-c', '--config-path'): config_path = a return config_path config_path = parseOpts() del parseOpts import gajim.common.configpaths gajim.common.configpaths.gajimpaths.init(config_path) del config_path from gajim.common import app from gajim import gtkgui_helpers from gajim.common.logger import LOG_DB_PATH, JIDConstant, KindConstant from gajim.common import helpers from gajim import dialogs from enum import IntEnum, unique @unique class Column(IntEnum): UNIXTIME = 2 MESSAGE = 3 SUBJECT = 4 NICKNAME = 5 import sqlite3 as sqlite class HistoryManager: def __init__(self): pixs = [] for size in (16, 32, 48, 64, 128): pix = gtkgui_helpers.get_icon_pixmap('org.gajim.Gajim', size) if pix: pixs.append(pix) if pixs: # set the icon to all windows Gtk.Window.set_default_icon_list(pixs) if not os.path.exists(LOG_DB_PATH): dialogs.ErrorDialog(_('Cannot find history logs database'), '%s does not exist.' % LOG_DB_PATH) sys.exit() xml = gtkgui_helpers.get_gtk_builder('history_manager.ui') self.window = xml.get_object('history_manager_window') self.jids_listview = xml.get_object('jids_listview') self.logs_listview = xml.get_object('logs_listview') self.search_results_listview = xml.get_object('search_results_listview') self.search_entry = xml.get_object('search_entry') self.logs_scrolledwindow = xml.get_object('logs_scrolledwindow') self.search_results_scrolledwindow = xml.get_object( 'search_results_scrolledwindow') self.welcome_vbox = xml.get_object('welcome_vbox') self.jids_already_in = [] # holds jids that we already have in DB self.AT_LEAST_ONE_DELETION_DONE = False self.con = sqlite.connect(LOG_DB_PATH, timeout=20.0, isolation_level='IMMEDIATE') self.cur = self.con.cursor() self._init_jids_listview() self._init_logs_listview() self._init_search_results_listview() self._fill_jids_listview() self.search_entry.grab_focus() self.window.show_all() xml.connect_signals(self) def _init_jids_listview(self): self.jids_liststore = Gtk.ListStore(str, str) # jid, jid_id self.jids_listview.set_model(self.jids_liststore) self.jids_listview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) renderer_text = Gtk.CellRendererText() # holds jid col = Gtk.TreeViewColumn(_('JID'), renderer_text, text=0) self.jids_listview.append_column(col) self.jids_listview.get_selection().connect('changed', self.on_jids_listview_selection_changed) def _init_logs_listview(self): # log_line_id(HIDDEN), jid_id(HIDDEN), time, message, subject, nickname self.logs_liststore = Gtk.ListStore(str, str, str, str, str, str) self.logs_listview.set_model(self.logs_liststore) self.logs_listview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) renderer_text = Gtk.CellRendererText() # holds time col = Gtk.TreeViewColumn(_('Date'), renderer_text, text=Column.UNIXTIME) # user can click this header and sort col.set_sort_column_id(Column.UNIXTIME) col.set_resizable(True) self.logs_listview.append_column(col) renderer_text = Gtk.CellRendererText() # holds nickname col = Gtk.TreeViewColumn(_('Nickname'), renderer_text, text=Column.NICKNAME) # user can click this header and sort col.set_sort_column_id(Column.NICKNAME) col.set_resizable(True) col.set_visible(False) self.nickname_col_for_logs = col self.logs_listview.append_column(col) renderer_text = Gtk.CellRendererText() # holds message col = Gtk.TreeViewColumn(_('Message'), renderer_text, markup=Column.MESSAGE) # user can click this header and sort col.set_sort_column_id(Column.MESSAGE) col.set_resizable(True) self.message_col_for_logs = col self.logs_listview.append_column(col) renderer_text = Gtk.CellRendererText() # holds subject col = Gtk.TreeViewColumn(_('Subject'), renderer_text, text=Column.SUBJECT) col.set_sort_column_id(Column.SUBJECT) # user can click this header and sort col.set_resizable(True) col.set_visible(False) self.subject_col_for_logs = col self.logs_listview.append_column(col) def _init_search_results_listview(self): # log_line_id (HIDDEN), jid, time, message, subject, nickname self.search_results_liststore = Gtk.ListStore(int, str, str, str, str, str) self.search_results_listview.set_model(self.search_results_liststore) renderer_text = Gtk.CellRendererText() # holds JID (who said this) col = Gtk.TreeViewColumn(_('JID'), renderer_text, text=1) col.set_sort_column_id(1) # user can click this header and sort col.set_resizable(True) self.search_results_listview.append_column(col) renderer_text = Gtk.CellRendererText() # holds time col = Gtk.TreeViewColumn(_('Date'), renderer_text, text=Column.UNIXTIME) # user can click this header and sort col.set_sort_column_id(Column.UNIXTIME) col.set_resizable(True) self.search_results_listview.append_column(col) renderer_text = Gtk.CellRendererText() # holds message col = Gtk.TreeViewColumn(_('Message'), renderer_text, text=Column.MESSAGE) col.set_sort_column_id(Column.MESSAGE) # user can click this header and sort col.set_resizable(True) self.search_results_listview.append_column(col) renderer_text = Gtk.CellRendererText() # holds subject col = Gtk.TreeViewColumn(_('Subject'), renderer_text, text=Column.SUBJECT) col.set_sort_column_id(Column.SUBJECT) # user can click this header and sort col.set_resizable(True) self.search_results_listview.append_column(col) renderer_text = Gtk.CellRendererText() # holds nickname col = Gtk.TreeViewColumn(_('Nickname'), renderer_text, text=Column.NICKNAME) # user can click this header and sort col.set_sort_column_id(Column.NICKNAME) col.set_resizable(True) self.search_results_listview.append_column(col) def on_history_manager_window_delete_event(self, widget, event): if not self.AT_LEAST_ONE_DELETION_DONE: if __name__ == '__main__': Gtk.main_quit() return def on_yes(clicked): self.cur.execute('VACUUM') self.con.commit() if __name__ == '__main__': Gtk.main_quit() def on_no(): if __name__ == '__main__': Gtk.main_quit() dialog = dialogs.YesNoDialog( _('Do you want to clean up the database? ' '(STRONGLY NOT RECOMMENDED IF GAJIM IS RUNNING)'), _('Normally allocated database size will not be freed, ' 'it will just become reusable. If you really want to reduce ' 'database filesize, click YES, else click NO.' '\n\nIn case you click YES, please wait…'), on_response_yes=on_yes, on_response_no=on_no) dialog.set_title(_('Database Cleanup')) button_box = dialog.get_children()[0].get_children()[1] button_box.get_children()[0].grab_focus() def _fill_jids_listview(self): # get those jids that have at least one entry in logs self.cur.execute('SELECT jid, jid_id FROM jids WHERE jid_id IN (' 'SELECT distinct logs.jid_id FROM logs) ORDER BY jid') # list of tuples: [('aaa@bbb',), ('cc@dd',)] rows = self.cur.fetchall() for row in rows: self.jids_already_in.append(row[0]) # jid self.jids_liststore.append([row[0], str(row[1])]) # jid, jid_id def on_jids_listview_selection_changed(self, widget, data=None): liststore, list_of_paths = self.jids_listview.get_selection()\ .get_selected_rows() self.logs_liststore.clear() if not list_of_paths: return self.welcome_vbox.hide() self.search_results_scrolledwindow.hide() self.logs_scrolledwindow.show() list_of_rowrefs = [] for path in list_of_paths: # make them treerowrefs (it's needed) list_of_rowrefs.append(Gtk.TreeRowReference.new(liststore, path)) for rowref in list_of_rowrefs: # FILL THE STORE, for all rows selected path = rowref.get_path() if path is None: continue jid = liststore[path][0] # jid self._fill_logs_listview(jid) def _get_jid_id(self, jid): """ jids table has jid and jid_id logs table has log_id, jid_id, contact_name, time, kind, show, message So to ask logs we need jid_id that matches our jid in jids table this method wants jid and returns the jid_id for later sql-ing on logs """ if jid.find('/') != -1: # if it has a / jid_is_from_pm = self._jid_is_from_pm(jid) if not jid_is_from_pm: # it's normal jid with resource jid = jid.split('/', 1)[0] # remove the resource self.cur.execute('SELECT jid_id FROM jids WHERE jid = ?', (jid,)) jid_id = self.cur.fetchone()[0] return str(jid_id) def _get_jid_from_jid_id(self, jid_id): """ jids table has jid and jid_id This method accepts jid_id and returns the jid for later sql-ing on logs """ self.cur.execute('SELECT jid FROM jids WHERE jid_id = ?', (jid_id,)) jid = self.cur.fetchone()[0] return jid def _jid_is_from_pm(self, jid): """ If jid is gajim@conf/nkour it's likely a pm one, how we know gajim@conf is not a normal guy and nkour is not his resource? We ask if gajim@conf is already in jids (with type room jid). This fails if user disables logging for room and only enables for pm (so higly unlikely) and if we fail we do not go chaos (user will see the first pm as if it was message in room's public chat) and after that everything is ok """ possible_room_jid = jid.split('/', 1)[0] self.cur.execute('SELECT jid_id FROM jids WHERE jid = ? AND type = ?', (possible_room_jid, JIDConstant.ROOM_TYPE)) row = self.cur.fetchone() if row is None: return False else: return True def _jid_is_room_type(self, jid): """ Return True/False if given id is room type or not eg. if it is room """ self.cur.execute('SELECT type FROM jids WHERE jid = ?', (jid,)) row = self.cur.fetchone() if row is None: raise elif row[0] == JIDConstant.ROOM_TYPE: return True else: # normal type return False def _fill_logs_listview(self, jid): """ Fill the listview with all messages that user sent to or received from JID """ # no need to lower jid in this context as jid is already lowered # as we use those jids from db jid_id = self._get_jid_id(jid) self.cur.execute(''' SELECT log_line_id, jid_id, time, kind, message, subject, contact_name, show FROM logs WHERE jid_id = ? ORDER BY time ''', (jid_id,)) results = self.cur.fetchall() if self._jid_is_room_type(jid): # is it room? self.nickname_col_for_logs.set_visible(True) self.subject_col_for_logs.set_visible(False) else: self.nickname_col_for_logs.set_visible(False) self.subject_col_for_logs.set_visible(True) for row in results: # exposed in UI (TreeViewColumns) are only # time, message, subject, nickname # but store in liststore # log_line_id, jid_id, time, message, subject, nickname log_line_id, jid_id, time_, kind, message, subject, nickname, \ show = row try: time_ = time.strftime('%x', time.localtime(float(time_))) except ValueError: pass else: color = None if kind in (KindConstant.SINGLE_MSG_RECV, KindConstant.CHAT_MSG_RECV, KindConstant.GC_MSG): # it is the other side color = app.config.get('inmsgcolor') # so incoming color elif kind in (KindConstant.SINGLE_MSG_SENT, KindConstant.CHAT_MSG_SENT): # it is us color = app.config.get('outmsgcolor') # so outgoing color elif kind in (KindConstant.STATUS, KindConstant.GCSTATUS): # is is statuses # so status color color = app.config.get('statusmsgcolor') # include status into (status) message if message is None: message = '' else: message = ' : ' + message message = helpers.get_uf_show(app.SHOW_LIST[show]) + \ message message_ = ' # # This file is part of Gajim. # # Gajim 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. # # Gajim 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 Gajim. If not, see . import logging from enum import IntEnum from datetime import datetime, timedelta import nbxmpp from gi.repository import Gtk, GLib from gajim.common import app from gajim.common import ged from gajim.gtkgui_helpers import get_icon_pixmap from gajim.common.const import ArchiveState log = logging.getLogger('gajim.c.message_archiving') class Pages(IntEnum): TIME = 0 SYNC = 1 SUMMARY = 2 class HistorySyncAssistant(Gtk.Assistant): def __init__(self, account, parent): Gtk.Assistant.__init__(self) self.set_title(_('Synchronise History')) self.set_resizable(False) self.set_default_size(300, -1) self.set_name('HistorySyncAssistant') self.set_transient_for(parent) self.account = account self.con = app.connections[self.account] self.timedelta = None self.now = datetime.utcnow() self.query_id = None self.start = None self.end = None self.next = None self.hide_buttons() self.event_id = id(self) own_jid = self.con.get_own_jid().getStripped() mam_start = ArchiveState.NEVER archive = app.logger.get_archive_timestamp(own_jid) if archive is not None and archive.oldest_mam_timestamp is not None: mam_start = int(float(archive.oldest_mam_timestamp)) if mam_start == ArchiveState.NEVER: self.current_start = self.now elif mam_start == ArchiveState.ALL: self.current_start = datetime.utcfromtimestamp(0) else: self.current_start = datetime.fromtimestamp(mam_start) self.select_time = SelectTimePage(self) self.append_page(self.select_time) self.set_page_type(self.select_time, Gtk.AssistantPageType.INTRO) self.download_history = DownloadHistoryPage(self) self.append_page(self.download_history) self.set_page_type(self.download_history, Gtk.AssistantPageType.PROGRESS) self.set_page_complete(self.download_history, True) self.summary = SummaryPage(self) self.append_page(self.summary) self.set_page_type(self.summary, Gtk.AssistantPageType.SUMMARY) self.set_page_complete(self.summary, True) app.ged.register_event_handler('archiving-count-received', ged.GUI1, self._received_count) app.ged.register_event_handler('archiving-query-id', ged.GUI1, self._new_query_id) app.ged.register_event_handler('archiving-interval-finished', ged.GUI1, self._received_finished) app.ged.register_event_handler('raw-mam-message-received', ged.PRECORE, self._nec_mam_message_received) self.connect('prepare', self.on_page_change) self.connect('destroy', self.on_destroy) self.connect("cancel", self.on_close_clicked) self.connect("close", self.on_close_clicked) if mam_start == ArchiveState.ALL: self.set_current_page(Pages.SUMMARY) self.summary.nothing_to_do() # if self.con.mam_query_ids: # self.set_current_page(Pages.SUMMARY) # self.summary.query_already_running() self.show_all() def hide_buttons(self): ''' Hide some of the standard buttons that are included in Gtk.Assistant ''' if self.get_property('use-header-bar'): action_area = self.get_children()[1] else: box = self.get_children()[0] content_box = box.get_children()[1] action_area = content_box.get_children()[1] for button in action_area.get_children(): button_name = Gtk.Buildable.get_name(button) if button_name == 'back': button.connect('show', self._on_show_button) elif button_name == 'forward': self.next = button button.connect('show', self._on_show_button) @staticmethod def _on_show_button(button): button.hide() def prepare_query(self): if self.timedelta: self.start = self.now - self.timedelta self.end = self.current_start log.info('get mam_start_date: %s', self.current_start) log.info('now: %s', self.now) log.info('start: %s', self.start) log.info('end: %s', self.end) self.con.request_archive_count(self.event_id, self.start, self.end) def _received_count(self, event): if event.event_id != self.event_id: return if event.count is not None: self.download_history.count = int(event.count) self.con.request_archive_interval(self.event_id, self.start, self.end) def _received_finished(self, event): if event.event_id != self.event_id: return log.info('query finished') GLib.idle_add(self.download_history.finished) self.set_current_page(Pages.SUMMARY) self.summary.finished() def _new_query_id(self, event): if event.event_id != self.event_id: return self.query_id = event.query_id def _nec_mam_message_received(self, obj): if obj.conn.name != self.account: return if obj.result.getAttr('queryid') != self.query_id: return log.debug('received message') GLib.idle_add(self.download_history.set_fraction) def on_row_selected(self, listbox, row): self.timedelta = row.get_child().get_delta() if row: self.set_page_complete(self.select_time, True) else: self.set_page_complete(self.select_time, False) def on_page_change(self, assistant, page): if page == self.download_history: self.next.hide() self.prepare_query() def on_destroy(self, *args): app.ged.remove_event_handler('archiving-count-received', ged.GUI1, self._received_count) app.ged.remove_event_handler('archiving-query-id', ged.GUI1, self._new_query_id) app.ged.remove_event_handler('archiving-interval-finished', ged.GUI1, self._received_finished) app.ged.remove_event_handler('raw-mam-message-received', ged.PRECORE, self._nec_mam_message_received) del app.interface.instances[self.account]['history_sync'] def on_close_clicked(self, *args): self.destroy() class SelectTimePage(Gtk.Box): def __init__(self, assistant): super().__init__(orientation=Gtk.Orientation.VERTICAL) self.set_spacing(18) self.assistant = assistant label = Gtk.Label(label=_('How far back do you want to go?')) listbox = Gtk.ListBox() listbox.set_hexpand(False) listbox.set_halign(Gtk.Align.CENTER) listbox.add(TimeOption(_('One Month'), 1)) listbox.add(TimeOption(_('Three Months'), 3)) listbox.add(TimeOption(_('One Year'), 12)) listbox.add(TimeOption(_('Everything'))) listbox.connect('row-selected', assistant.on_row_selected) for row in listbox.get_children(): option = row.get_child() if not option.get_delta(): continue if assistant.now - option.get_delta() > assistant.current_start: row.set_activatable(False) row.set_selectable(False) self.pack_start(label, True, True, 0) self.pack_start(listbox, False, False, 0) class DownloadHistoryPage(Gtk.Box): def __init__(self, assistant): super().__init__(orientation=Gtk.Orientation.VERTICAL) self.set_spacing(18) self.assistant = assistant self.count = 0 self.received = 0 pix = get_icon_pixmap('folder-download-symbolic', size=64) image = Gtk.Image() image.set_from_pixbuf(pix) self.progress = Gtk.ProgressBar() self.progress.set_show_text(True) self.progress.set_text(_('Connecting...')) self.progress.set_pulse_step(0.1) self.progress.set_vexpand(True) self.progress.set_valign(Gtk.Align.CENTER) self.pack_start(image, False, False, 0) self.pack_start(self.progress, False, False, 0) def set_fraction(self): self.received += 1 if self.count: self.progress.set_fraction(self.received / self.count) self.progress.set_text(_('%(received)s of %(max)s' % { 'received': self.received, 'max': self.count})) else: self.progress.pulse() self.progress.set_text(_('Downloaded %s Messages' % self.received)) def finished(self): self.progress.set_fraction(1) class SummaryPage(Gtk.Box): def __init__(self, assistant): super().__init__(orientation=Gtk.Orientation.VERTICAL) self.set_spacing(18) self.assistant = assistant self.label = Gtk.Label() self.label.set_name('FinishedLabel') self.label.set_valign(Gtk.Align.CENTER) self.pack_start(self.label, True, True, 0) def finished(self): received = self.assistant.download_history.received finished = _(''' Finshed synchronising your History. {received} Messages downloaded. '''.format(received=received)) self.label.set_text(finished) def nothing_to_do(self): nothing_to_do = _(''' Gajim is fully synchronised with the Archive. ''') self.label.set_text(nothing_to_do) def query_already_running(self): already_running = _(''' There is already a synchronisation in progress. Please try later. ''') self.label.set_text(already_running) class TimeOption(Gtk.Label): def __init__(self, label, months=None): super().__init__(label=label) self.date = months if months: self.date = timedelta(days=30*months) def get_delta(self): return self.date gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/history_window.py000066400000000000000000000732301326020644600254410ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/history_window.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2005 Vincent Hanquez ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2006 Dimitur Kirov ## Travis Shirk ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2007-2008 Stephan Erb ## Copyright (C) 2008 Brendan Taylor ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GLib import time import calendar import datetime from enum import IntEnum, unique from gajim import gtkgui_helpers from gajim import conversation_textview from gajim import dialogs from gajim.common import app from gajim.common import helpers from gajim.common import exceptions from gajim.common.logger import ShowConstant, KindConstant @unique class InfoColumn(IntEnum): '''Completion dict''' JID = 0 ACCOUNT = 1 NAME = 2 COMPLETION = 3 @unique class Column(IntEnum): LOG_JID = 0 CONTACT_NAME = 1 UNIXTIME = 2 MESSAGE = 3 TIME = 4 LOG_LINE_ID = 5 class HistoryWindow: """ Class for browsing logs of conversations with contacts """ def __init__(self, jid=None, account=None): xml = gtkgui_helpers.get_gtk_builder('history_window.ui') self.window = xml.get_object('history_window') self.window.set_application(app.app) self.calendar = xml.get_object('calendar') self.button_first_day = xml.get_object('button_first_day') self.button_previous_day = xml.get_object('button_previous_day') self.button_next_day = xml.get_object('button_next_day') self.button_last_day = xml.get_object('button_last_day') scrolledwindow = xml.get_object('scrolledwindow') self.history_textview = conversation_textview.ConversationTextview( account, used_in_history_window = True) scrolledwindow.add(self.history_textview.tv) self.history_buffer = self.history_textview.tv.get_buffer() self.history_buffer.create_tag('highlight', background='yellow') self.history_buffer.create_tag('invisible', invisible=True) self.checkbutton = xml.get_object('log_history_checkbutton') self.checkbutton.connect('toggled', self.on_log_history_checkbutton_toggled) self.show_status_checkbutton = xml.get_object('show_status_checkbutton') self.search_entry = xml.get_object('search_entry') self.query_liststore = xml.get_object('query_liststore') self.jid_entry = xml.get_object('query_entry') self.jid_entry.connect('activate', self.on_jid_entry_activate) self.results_treeview = xml.get_object('results_treeview') self.results_window = xml.get_object('results_scrolledwindow') self.search_in_date = xml.get_object('search_in_date') # jid, contact_name, date, message, time, log_line_id model = Gtk.ListStore(str, str, str, str, str, int) self.results_treeview.set_model(model) col = Gtk.TreeViewColumn(_('Name')) self.results_treeview.append_column(col) renderer = Gtk.CellRendererText() col.pack_start(renderer, True) col.add_attribute(renderer, 'text', Column.CONTACT_NAME) col.set_sort_column_id(Column.CONTACT_NAME) # user can click this header and sort col.set_resizable(True) col = Gtk.TreeViewColumn(_('Date')) self.results_treeview.append_column(col) renderer = Gtk.CellRendererText() col.pack_start(renderer, True) col.add_attribute(renderer, 'text', Column.UNIXTIME) col.set_sort_column_id(Column.UNIXTIME) # user can click this header and sort col.set_resizable(True) col = Gtk.TreeViewColumn(_('Message')) self.results_treeview.append_column(col) renderer = Gtk.CellRendererText() col.pack_start(renderer, True) col.add_attribute(renderer, 'text', Column.MESSAGE) col.set_resizable(True) self.jid = None # The history we are currently viewing self.account = account self.completion_dict = {} self.accounts_seen_online = [] # Update dict when new accounts connect self.jids_to_search = [] # This will load history too task = self._fill_completion_dict() GLib.idle_add(next, task) if jid: self.jid_entry.set_text(jid) else: self._load_history(None) gtkgui_helpers.resize_window(self.window, app.config.get('history_window_width'), app.config.get('history_window_height')) gtkgui_helpers.move_window(self.window, app.config.get('history_window_x-position'), app.config.get('history_window_y-position')) xml.connect_signals(self) self.window.show_all() # PluginSystem: adding GUI extension point for # HistoryWindow instance object app.plugin_manager.gui_extension_point( 'history_window', self) def _fill_completion_dict(self): """ Fill completion_dict for key auto completion. Then load history for current jid (by calling another function) Key will be either jid or full_completion_name (contact name or long description like "pm-contact from groupchat...."). {key : (jid, account, nick_name, full_completion_name} This is a generator and does pseudo-threading via idle_add(). """ liststore = gtkgui_helpers.get_completion_liststore(self.jid_entry) # Add all jids in logs.db: db_jids = app.logger.get_jids_in_db() completion_dict = dict.fromkeys(db_jids) self.accounts_seen_online = list(app.contacts.get_accounts()) # Enhance contacts of online accounts with contact. Needed for mapping below for account in self.accounts_seen_online: completion_dict.update(helpers.get_contact_dict_for_account(account)) muc_active_icon = gtkgui_helpers.get_iconset_name_for('muc-active') online_icon = gtkgui_helpers.get_iconset_name_for('online') keys = list(completion_dict.keys()) # Move the actual jid at first so we load history faster actual_jid = self.jid_entry.get_text() if actual_jid in keys: keys.remove(actual_jid) keys.insert(0, actual_jid) if '' in keys: keys.remove('') if None in keys: keys.remove(None) # Map jid to info tuple # Warning : This for is time critical with big DB for key in keys: completed = key completed2 = None contact = completion_dict[completed] if contact: info_name = contact.get_shown_name() info_completion = info_name info_jid = contact.jid else: # Corrensponding account is offline, we know nothing info_name = completed.split('@')[0] info_completion = completed info_jid = completed info_acc = self._get_account_for_jid(info_jid) if app.logger.jid_is_room_jid(completed) or\ app.logger.jid_is_from_pm(completed): icon = muc_active_icon if app.logger.jid_is_from_pm(completed): # It's PM. Make it easier to find room, nick = app.get_room_and_nick_from_fjid(completed) info_completion = '%s from %s' % (nick, room) completed = info_completion info_completion2 = '%s/%s' % (room, nick) completed2 = info_completion2 info_name = nick else: icon = online_icon if len(completed) > 70: completed = completed[:70] + '[\u2026]' liststore.append((icon, completed)) self.completion_dict[key] = (info_jid, info_acc, info_name, info_completion) self.completion_dict[completed] = (info_jid, info_acc, info_name, info_completion) if completed2: if len(completed2) > 70: completed2 = completed2[:70] + '[\u2026]' liststore.append((icon, completed2)) self.completion_dict[completed2] = (info_jid, info_acc, info_name, info_completion2) if key == actual_jid: self._load_history(info_jid, self.account or info_acc) yield True keys.sort() yield False def _get_account_for_jid(self, jid): """ Return the corresponding account of the jid. May be None if an account could not be found """ accounts = app.contacts.get_accounts() account = None for acc in accounts: jid_list = app.contacts.get_jid_list(acc) gc_list = app.contacts.get_gc_list(acc) if jid in jid_list or jid in gc_list: account = acc break return account def on_history_window_destroy(self, widget): # PluginSystem: removing GUI extension points connected with # HistoryWindow instance object app.plugin_manager.remove_gui_extension_point( 'history_window', self) self.history_textview.del_handlers() del app.interface.instances['logs'] def on_history_window_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.save_state() self.window.destroy() def on_close_button_clicked(self, widget): self.save_state() self.window.destroy() def on_jid_entry_activate(self, widget): jid = self.jid_entry.get_text() self._load_history(jid, self.account) self.results_window.set_property('visible', False) def on_jid_entry_focus(self, widget, event): widget.select_region(0, -1) # select text def _load_history(self, jid_or_name, account=None): """ Load history for the given jid/name and show it """ if jid_or_name and jid_or_name in self.completion_dict: # a full qualified jid or a contact name was entered info_jid, info_account, info_name, info_completion = self.completion_dict[jid_or_name] self.jids_to_search = [info_jid] self.jid = info_jid if account: self.account = account else: self.account = info_account if self.account is None: # We don't know account. Probably a gc not opened or an # account not connected. # Disable possibility to say if we want to log or not self.checkbutton.set_sensitive(False) else: # Are log disabled for account ? if self.account in app.config.get_per('accounts', self.account, 'no_log_for').split(' '): self.checkbutton.set_active(False) self.checkbutton.set_sensitive(False) else: # Are log disabled for jid ? log = True if self.jid in app.config.get_per('accounts', self.account, 'no_log_for').split(' '): log = False self.checkbutton.set_active(log) self.checkbutton.set_sensitive(True) self.jids_to_search = [info_jid] # Get first/last date we have logs with contact (for log navigation) self.first_log = app.logger.get_first_date_that_has_logs( self.account, self.jid) self.first_day = self._get_date_from_timestamp(self.first_log) self.last_log = app.logger.get_last_date_that_has_logs( self.account, self.jid) self.last_day = self._get_date_from_timestamp(self.last_log) # Select logs for last date we have logs with contact self.calendar.set_sensitive(True) gtk_month = gtkgui_helpers.make_python_month_gtk_month( self.last_day.month) self.calendar.select_month(gtk_month, self.last_day.year) self.calendar.select_day(self.last_day.day) self.button_previous_day.set_sensitive(True) self.button_next_day.set_sensitive(True) self.button_first_day.set_sensitive(True) self.button_last_day.set_sensitive(True) self.search_entry.set_sensitive(True) self.search_entry.grab_focus() title = _('Conversation History with %s') % info_name self.window.set_title(title) self.jid_entry.set_text(info_completion) else: # neither a valid jid, nor an existing contact name was entered # we have got nothing to show or to search in self.jid = None self.account = None self.history_buffer.set_text('') # clear the buffer self.search_entry.set_sensitive(False) self.checkbutton.set_sensitive(False) self.calendar.set_sensitive(False) self.calendar.clear_marks() self.button_previous_day.set_sensitive(False) self.button_next_day.set_sensitive(False) self.button_first_day.set_sensitive(False) self.button_last_day.set_sensitive(False) self.results_window.set_property('visible', False) title = _('Conversation History') self.window.set_title(title) def on_calendar_day_selected(self, widget): if not self.jid: return year, month, day = self.calendar.get_date() # integers month = gtkgui_helpers.make_gtk_month_python_month(month) self._load_conversation(year, month, day) def on_calendar_month_changed(self, widget): """ Ask for days in this month, if they have logs it bolds them (marks them) """ if not self.jid: return year, month, day = widget.get_date() # integers if year < 1900: widget.select_month(0, 1900) widget.select_day(1) return widget.clear_marks() month = gtkgui_helpers.make_gtk_month_python_month(month) try: log_days = app.logger.get_days_with_logs( self.account, self.jid, year, month) except exceptions.PysqliteOperationalError as e: dialogs.ErrorDialog(_('Disk Error'), str(e)) return for date in log_days: widget.mark_day(date.day) def _get_date_from_timestamp(self, timestamp): # Conversion from timestamp to date log = time.localtime(timestamp) y, m, d = log[0], log[1], log[2] date = datetime.datetime(y, m, d) return(date) def _change_date(self, widget): # Get day selected in calendar y, m, d = self.calendar.get_date() py_m = gtkgui_helpers.make_gtk_month_python_month(m) _date = datetime.datetime(y, py_m, d) if widget is self.button_first_day: gtk_m = gtkgui_helpers.make_python_month_gtk_month( self.first_day.month) self.calendar.select_month(gtk_m, self.first_day.year) self.calendar.select_day(self.first_day.day) return elif widget is self.button_last_day: gtk_m = gtkgui_helpers.make_python_month_gtk_month( self.last_day.month) self.calendar.select_month(gtk_m, self.last_day.year) self.calendar.select_day(self.last_day.day) return elif widget is self.button_previous_day: end_date = self.first_day timedelta = datetime.timedelta(days=-1) if end_date >= _date: return elif widget is self.button_next_day: end_date = self.last_day timedelta = datetime.timedelta(days=1) if end_date <= _date: return # Iterate through days until log entry found or # supplied end_date (first_log / last_log) reached logs = None while logs is None: _date = _date + timedelta if _date == end_date: break try: logs = app.logger.get_date_has_logs( self.account, self.jid, _date) except exceptions.PysqliteOperationalError as e: dialogs.ErrorDialog(_('Disk Error'), str(e)) return gtk_month = gtkgui_helpers.make_python_month_gtk_month(_date.month) self.calendar.select_month(gtk_month, _date.year) self.calendar.select_day(_date.day) def _get_string_show_from_constant_int(self, show): if show == ShowConstant.ONLINE: show = 'online' elif show == ShowConstant.CHAT: show = 'chat' elif show == ShowConstant.AWAY: show = 'away' elif show == ShowConstant.XA: show = 'xa' elif show == ShowConstant.DND: show = 'dnd' elif show == ShowConstant.OFFLINE: show = 'offline' return show def _load_conversation(self, year, month, day): """ Load the conversation between `self.jid` and `self.account` held on the given date into the history textbuffer. Values for `month` and `day` are 1-based. """ self.history_buffer.set_text('') self.last_time_printout = 0 show_status = self.show_status_checkbutton.get_active() date = datetime.datetime(year, month, day) conversation = app.logger.get_conversation_for_date( self.account, self.jid, date) for message in conversation: if not show_status and message.kind in (KindConstant.GCSTATUS, KindConstant.STATUS): continue self._add_message(message) def _add_message(self, msg): if not msg.message and msg.kind not in (KindConstant.STATUS, KindConstant.GCSTATUS): return tim = msg.time kind = msg.kind show = msg.show message = msg.message subject = msg.subject log_line_id = msg.log_line_id contact_name = msg.contact_name additional_data = msg.additional_data buf = self.history_buffer end_iter = buf.get_end_iter() # Make the beginning of every message searchable by its log_line_id buf.create_mark(str(log_line_id), end_iter, left_gravity=True) if app.config.get('print_time') == 'always': timestamp_str = app.config.get('time_stamp') timestamp_str = helpers.from_one_line(timestamp_str) tim = time.strftime(timestamp_str, time.localtime(float(tim))) buf.insert(end_iter, tim) elif app.config.get('print_time') == 'sometimes': every_foo_seconds = 60 * app.config.get( 'print_ichat_every_foo_minutes') seconds_passed = tim - self.last_time_printout if seconds_passed > every_foo_seconds: self.last_time_printout = tim tim = time.strftime('%X ', time.localtime(float(tim))) buf.insert_with_tags_by_name(end_iter, tim + '\n', 'time_sometimes') tag_name = '' tag_msg = '' show = self._get_string_show_from_constant_int(show) if kind == KindConstant.GC_MSG: tag_name = 'incoming' elif kind in (KindConstant.SINGLE_MSG_RECV, KindConstant.CHAT_MSG_RECV): contact_name = self.completion_dict[self.jid][InfoColumn.NAME] tag_name = 'incoming' tag_msg = 'incomingtxt' elif kind in (KindConstant.SINGLE_MSG_SENT, KindConstant.CHAT_MSG_SENT): if self.account: contact_name = app.nicks[self.account] else: # we don't have roster, we don't know our own nick, use first # account one (urk!) account = list(app.contacts.get_accounts())[0] contact_name = app.nicks[account] tag_name = 'outgoing' tag_msg = 'outgoingtxt' elif kind == KindConstant.GCSTATUS: # message here (if not None) is status message if message: message = _('%(nick)s is now %(status)s: %(status_msg)s') %\ {'nick': contact_name, 'status': helpers.get_uf_show(show), 'status_msg': message } else: message = _('%(nick)s is now %(status)s') % {'nick': contact_name, 'status': helpers.get_uf_show(show) } tag_msg = 'status' else: # 'status' # message here (if not None) is status message if show is None: # it means error if message: message = _('Error: %s') % message else: message = _('Error') elif message: message = _('Status is now: %(status)s: %(status_msg)s') % \ {'status': helpers.get_uf_show(show), 'status_msg': message} else: message = _('Status is now: %(status)s') % { 'status': helpers.get_uf_show(show) } tag_msg = 'status' if message.startswith('/me ') or message.startswith('/me\n'): tag_msg = tag_name else: # do not do this if gcstats, avoid dupping contact_name # eg. nkour: nkour is now Offline if contact_name and kind != KindConstant.GCSTATUS: # add stuff before and after contact name before_str = app.config.get('before_nickname') before_str = helpers.from_one_line(before_str) after_str = app.config.get('after_nickname') after_str = helpers.from_one_line(after_str) format = before_str + contact_name + after_str + ' ' if tag_name: buf.insert_with_tags_by_name(end_iter, format, tag_name) else: buf.insert(end_iter, format) if subject: message = _('Subject: %s\n') % subject + message xhtml = None if message.startswith(' ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2007 Nikos Kouremenos ## Copyright (C) 2008 Jonathan Schleifer ## Julien Pivotto ## Stephan Erb ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## """ A Gtk.TextView-based renderer for XHTML-IM, as described in: http://xmpp.org/extensions/xep-0071.html Starting with the version posted by Gustavo Carneiro, I (Santiago Gala) am trying to make it more compatible with the markup that docutils generate, and also more modular. """ from gi.repository import GObject from gi.repository import GLib from gi.repository import Pango from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GdkPixbuf import xml.sax import xml.sax.handler import re from io import StringIO import urllib if __name__ == '__main__': from gajim.common import i18n import gajim.common.configpaths app.common.configpaths.gajimpaths.init(None) from gajim.common import app from gajim import gtkgui_helpers from gajim.gtkgui_helpers import get_icon_pixmap from gajim.common import helpers from gajim.common.exceptions import GajimGeneralException from gajim import dialogs from gajim import tooltips import logging log = logging.getLogger('gajim.htmlview') __all__ = ['HtmlTextView'] whitespace_rx = re.compile('\\s+') allwhitespace_rx = re.compile('^\\s*$') # embryo of CSS classes classes = { #'system-message':';display: none', 'problematic': ';color: red', } # styles for elements element_styles = { 'u' : ';text-decoration: underline', 'em' : ';font-style: oblique', 'cite' : '; background-color:rgb(170,190,250);' 'font-style: oblique', 'li' : '; margin-left: 1em; margin-right: 10%', 'strong' : ';font-weight: bold', 'pre' : '; background-color:rgb(190,190,190);' 'font-family: monospace; white-space: pre;' 'margin-left: 1em; margin-right: 10%', 'kbd' : ';background-color:rgb(210,210,210);' 'font-family: monospace', 'blockquote' : '; background-color:rgb(170,190,250);' 'margin-left: 2em; margin-right: 10%', 'dt' : ';font-weight: bold; font-style: oblique', 'dd' : ';margin-left: 2em; font-style: oblique' } # no difference for the moment element_styles['dfn'] = element_styles['em'] element_styles['var'] = element_styles['em'] # deprecated, legacy, presentational element_styles['tt'] = element_styles['kbd'] element_styles['i'] = element_styles['em'] element_styles['b'] = element_styles['strong'] # ========== # XEP-0071 # ========== # # This Integration Set includes a subset of the modules defined for # XHTML 1.0 but does not redefine any existing modules, nor # does it define any new modules. Specifically, it includes the # following modules only: # # - Structure # - Text # # * Block # # phrasal # addr, blockquote, pre # Struc # div,p # Heading # h1, h2, h3, h4, h5, h6 # # * Inline # # phrasal # abbr, acronym, cite, code, dfn, em, kbd, q, samp, strong, var # structural # br, span # # - Hypertext (a) # - List (ul, ol, dl) # - Image (img) # - Style Attribute # # Therefore XHTML-IM uses the following content models: # # Block.mix # Block-like elements, e.g., paragraphs # Flow.mix # Any block or inline elements # Inline.mix # Character-level elements # InlineNoAnchor.class # Anchor element # InlinePre.mix # Pre element # # XHTML-IM also uses the following Attribute Groups: # # Core.extra.attrib # TBD # I18n.extra.attrib # TBD # Common.extra # style # # # ... # block level: # Heading h # ( pres = h1 | h2 | h3 | h4 | h5 | h6 ) # Block ( phrasal = address | blockquote | pre ) # NOT ( presentational = hr ) # ( structural = div | p ) # other: section # Inline ( phrasal = abbr | acronym | cite | code | dfn | em | # kbd | q | samp | strong | var ) # NOT ( presentational = b | big | i | small | sub | sup | tt ) # ( structural = br | span ) # Param/Legacy param, font, basefont, center, s, strike, u, dir, menu, # isindex BLOCK_HEAD = set(( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', )) BLOCK_PHRASAL = set(( 'address', 'blockquote', 'pre', )) BLOCK_PRES = set(( 'hr', )) #not in xhtml-im BLOCK_STRUCT = set(( 'div', 'p', )) BLOCK_HACKS = set(( 'table', 'tr' )) # at the very least, they will start line ;) BLOCK = BLOCK_HEAD.union(BLOCK_PHRASAL).union(BLOCK_STRUCT).union(BLOCK_PRES).union(BLOCK_HACKS) INLINE_PHRASAL = set('abbr, acronym, cite, code, dfn, em, kbd, q, samp, strong, var'.split(', ')) INLINE_PRES = set('b, i, u, tt'.split(', ')) #not in xhtml-im INLINE_STRUCT = set('br, span'.split(', ')) INLINE = INLINE_PHRASAL.union(INLINE_PRES).union(INLINE_STRUCT) LIST_ELEMS = set( 'dl, ol, ul'.split(', ')) for name in BLOCK_HEAD: num = eval(name[1]) header_size = (num-1) // 2 weigth = (num - 1) % 2 element_styles[name] = '; font-size: %s; %s' % ( ('large', 'medium', 'small')[header_size], ('font-weight: bold', 'font-style: oblique')[weigth],) def _parse_css_color(color): if color.startswith('rgb(') and color.endswith(')'): r, g, b = [int(c)*257 for c in color[4:-1].split(',')] return Gdk.Color(r, g, b) else: return Gdk.color_parse(color) def style_iter(style): return ([x.strip() for x in item.split(':', 1)] for item in style.split(';')\ if len(item.strip())) class HtmlHandler(xml.sax.handler.ContentHandler): """ A handler to display html to a gtk textview It keeps a stack of "style spans" (start/end element pairs) and a stack of list counters, for nested lists. """ def __init__(self, textview, conv_textview, startiter): xml.sax.handler.ContentHandler.__init__(self) self.textbuf = textview.get_buffer() self.textview = textview self.iter = startiter self.conv_textview = conv_textview self.text = '' self.starting=True self.preserve = False self.styles = [] # a Gtk.TextTag or None, for each span level self.list_counters = [] # stack (top at head) of list # counters, or None for unordered list def _get_points_from_pixels(self, pixels): resolution = self.textview.get_screen().get_resolution() # points = pixels * 72 / resolution return pixels * 72 / resolution def _parse_style_color(self, tag, value): color = _parse_css_color(value) tag.set_property('foreground-gdk', color) def _parse_style_background_color(self, tag, value): color = _parse_css_color(value) tag.set_property('background-gdk', color) tag.set_property('paragraph-background-gdk', color) def _get_current_attributes(self): attrs = self.textview.get_default_attributes() self.iter.backward_char() attrs = (self.iter.get_attributes())[1] self.iter.forward_char() return attrs def __parse_length_frac_size_allocate(self, textview, allocation, frac, callback, args): callback(allocation.width*frac, *args) def _parse_length(self, value, font_relative, block_relative, minl, maxl, callback, *args): """ Parse/calc length, converting to pixels, calls callback(length, *args) when the length is first computed or changes """ if value.endswith('%'): val = float(value[:-1]) if val > 0: sign = 1 elif val < 0: sign = -1 else: sign = 0 # limits: 1% to 500% val = sign*max(1, min(abs(val), 500)) frac = val/100 if font_relative: callback(frac, '%', *args) elif block_relative: # CSS says 'Percentage values: refer to width of the closest # block-level ancestor' # This is difficult/impossible to implement, so we use # textview width instead; a reasonable approximation.. alloc = self.textview.get_allocation() self.__parse_length_frac_size_allocate(self.textview, alloc, frac, callback, args) self.textview.connect('size-allocate', self.__parse_length_frac_size_allocate, frac, callback, args) else: callback(frac, *args) return def get_val(min_val=minl, max_val=maxl): try: val = float(value[:-2]) except: log.warning('Unable to parse length value "%s"', value) return None if val > 0: sign = 1 elif val < 0: sign = -1 else: sign = 0 # validate length return sign*max(min_val, min(abs(val), max_val)) if value.endswith('pt'): # points size = get_val(5, 50) if size is None: return callback(size, 'pt', *args) elif value.endswith('em'): size = get_val(0.3, 4) if size is None: return callback(size, 'em', *args) elif value.endswith('px'): # pixels size = get_val(5, 50) if size is None: return callback(size, 'px', *args) else: try: # TODO: isn't "no units" interpreted as pixels? val = int(value) if val > 0: sign = 1 elif val < 0: sign = -1 else: sign = 0 # validate length val = sign*max(5, min(abs(val), 70)) callback(val, 'px', *args) except Exception: log.warning('Unable to parse length value "%s"', value) def __parse_font_size_cb(self, size, type_, tag): if type_ in ('em', '%'): tag.set_property('scale', size) elif type_ == 'pt': tag.set_property('size-points', size) elif type_ == 'px': tag.set_property('size-points', self._get_points_from_pixels(size)) def _parse_style_display(self, tag, value): if value == 'none': tag.set_property('invisible', 'true') # FIXME: display: block, inline def _parse_style_font_size(self, tag, value): try: # see http://developer.gnome.org/pango/stable/pango-Text-Attributes.html#PANGO-SCALE-XX-SMALL:CAPS # http://consciouslyusing.blogspot.ru/2012/01/heads-up-missing-pango-text-scale.html scale = { #'xx-small': Pango.SCALE_XX_SMALL, #'x-small': Pango.SCALE_X_SMALL, #'small': Pango.SCALE_SMALL, #'medium': Pango.SCALE_MEDIUM, #'large': Pango.SCALE_LARGE, #'x-large': Pango.SCALE_X_LARGE, #'xx-large': Pango.SCALE_XX_LARGE, 'xx-small': 0.5787037037037, 'x-small': 0.6444444444444, 'small': 0.8333333333333, 'medium': 1.0, 'large': 1.2, 'x-large': 1.4399999999999, 'xx-large': 1.728, } [value] except KeyError: pass else: attrs = self._get_current_attributes() if attrs.font_scale ==0: tag.set_property('scale', scale) return if value == 'smaller': tag.set_property('scale', 0.8333333333333) return if value == 'larger': tag.set_property('scale', 1.2) return # font relative (5 ~ 4pt, 110 ~ 72pt) self._parse_length( value, True, False, 5, 110, self.__parse_font_size_cb, tag) def _parse_style_font_style(self, tag, value): try: style = { 'normal': Pango.Style.NORMAL, 'italic': Pango.Style.ITALIC, 'oblique': Pango.Style.OBLIQUE, } [value] except KeyError: log.warning('unknown font-style %s', value) else: tag.set_property('style', style) def __frac_length_tag_cb(self, length, tag, propname): styles = self._get_style_tags() if styles: length += styles[-1].get_property(propname) tag.set_property(propname, length) def _parse_style_margin_left(self, tag, value): # block relative self._parse_length(value, False, True, 1, 1000, self.__frac_length_tag_cb, tag, 'left-margin') def _parse_style_margin_right(self, tag, value): # block relative self._parse_length(value, False, True, 1, 1000, self.__frac_length_tag_cb, tag, 'right-margin') def _parse_style_font_weight(self, tag, value): # TODO: missing 'bolder' and 'lighter' try: weight = { '100': Pango.Weight.ULTRALIGHT, '200': Pango.Weight.ULTRALIGHT, '300': Pango.Weight.LIGHT, '400': Pango.Weight.NORMAL, '500': Pango.Weight.NORMAL, '600': Pango.Weight.BOLD, '700': Pango.Weight.BOLD, '800': Pango.Weight.ULTRABOLD, '900': Pango.Weight.HEAVY, 'normal': Pango.Weight.NORMAL, 'bold': Pango.Weight.BOLD, } [value] except KeyError: log.warning('unknown font-style %s', value) else: tag.set_property('weight', weight) def _parse_style_font_family(self, tag, value): tag.set_property('family', value) def _parse_style_text_align(self, tag, value): try: align = { 'left': Gtk.Justification.LEFT, 'right': Gtk.Justification.RIGHT, 'center': Gtk.Justification.CENTER, 'justify': Gtk.Justification.FILL, } [value] except KeyError: log.warning('Invalid text-align: %s requested', value) else: tag.set_property('justification', align) def _parse_style_text_decoration(self, tag, value): values = value.split(' ') if 'none' in values: tag.set_property('underline', Pango.Underline.NONE) tag.set_property('strikethrough', False) if 'underline' in values: tag.set_property('underline', Pango.Underline.SINGLE) else: tag.set_property('underline', Pango.Underline.NONE) if 'line-through' in values: tag.set_property('strikethrough', True) else: tag.set_property('strikethrough', False) if 'blink' in values: log.warning('text-decoration:blink not implemented') if 'overline' in values: log.warning('text-decoration:overline not implemented') def _parse_style_white_space(self, tag, value): if value == 'pre': tag.set_property('wrap_mode', Gtk.WrapMode.NONE) elif value == 'normal': tag.set_property('wrap_mode', Gtk.WrapMode.WORD) elif value == 'nowrap': tag.set_property('wrap_mode', Gtk.WrapMode.NONE) def __length_tag_cb(self, value, tag, propname): try: tag.set_property(propname, value) except Exception: log.warning('Error with prop: %s for tag: %s', propname, str(tag)) def _parse_style_width(self, tag, value): if value == 'auto': return self._parse_length(value, False, False, 1, 1000, self.__length_tag_cb, tag, "width") def _parse_style_height(self, tag, value): if value == 'auto': return self._parse_length(value, False, False, 1, 1000, self.__length_tag_cb, tag, "height") # build a dictionary mapping styles to methods, for greater speed __style_methods = dict() for style in ('background-color', 'color', 'font-family', 'font-size', 'font-style', 'font-weight', 'margin-left', 'margin-right', 'text-align', 'text-decoration', 'white-space', 'display', 'width', 'height'): try: method = locals()['_parse_style_%s' % style.replace('-', '_')] except KeyError: log.warning('Style attribute "%s" not yet implemented', style) else: __style_methods[style] = method del style # -- def _get_style_tags(self): return [tag for tag in self.styles if tag is not None] def _create_url(self, href, title, type_, id_): '''Process a url tag. ''' tag = self.textbuf.create_tag(id_) if href and href[0] != '#': tag.href = href tag.type_ = type_ # to be used by the URL handler tag.connect('event', self.textview.hyperlink_handler, 'url') tag.set_property('foreground', app.config.get('urlmsgcolor')) tag.set_property('underline', Pango.Underline.SINGLE) tag.is_anchor = True if title: tag.title = title return tag def _update_img(self, output, attrs, img_mark, tags): '''Callback function called after the function helpers.download_image. ''' mem, alt = output self._process_img(attrs, (mem, alt, img_mark, tags)) def _process_img(self, attrs, loaded=None): '''Process a img tag. ''' mem = '' update = False pixbuf = None replace_mark = None replace_tags = None try: if attrs['src'].startswith('data:image/'): # The "data" URL scheme http://tools.ietf.org/html/rfc2397 import base64 img = attrs['src'].split(',')[1] mem = base64.standard_b64decode(urllib.parse.unquote( img).encode('utf-8')) elif loaded is not None: (mem, alt, replace_mark, replace_tags) = loaded update = True else: if self.conv_textview: img_mark = self.textbuf.create_mark(None, self.iter, True) app.thread_interface(helpers.download_image, [ self.conv_textview.account, attrs], self._update_img, [attrs, img_mark, self._get_style_tags()]) alt = attrs.get('alt', '') if alt: alt += '\n' alt += _('Loading') pixbuf = get_icon_pixmap('gtk-no') if mem: # Caveat: GdkPixbuf is known not to be safe to load # images from network... this program is now potentially # hackable ;) loader = GdkPixbuf.PixbufLoader() dims = [0, 0] def height_cb(length): dims[1] = length def width_cb(length): dims[0] = length # process width and height attributes w = attrs.get('width') h = attrs.get('height') # override with width and height styles for attr, val in style_iter(attrs.get('style', '')): if attr == 'width': w = val elif attr == 'height': h = val if w: self._parse_length(w, False, False, 1, 1000, width_cb) if h: self._parse_length(h, False, False, 1, 1000, height_cb) def set_size(pixbuf, w, h, dims): """ FIXME: Floats should be relative to the whole textview, and resize with it. This needs new pifbufs for every resize, GdkPixbuf.Pixbuf.scale_simple or similar. """ if isinstance(dims[0], float): dims[0] = int(dims[0]*w) elif not dims[0]: dims[0] = w if isinstance(dims[1], float): dims[1] = int(dims[1]*h) if not dims[1]: dims[1] = h loader.set_size(*dims) if w or h: loader.connect('size-prepared', set_size, dims) loader.write(mem) loader.close() pixbuf = loader.get_pixbuf() alt = attrs.get('alt', '') working_iter = self.iter if replace_mark is not None: working_iter = self.textbuf.get_iter_at_mark(replace_mark) next_iter = working_iter.copy() next_iter.forward_char() self.textbuf.delete(working_iter, next_iter) self.textbuf.delete_mark(replace_mark) if pixbuf is not None: if replace_mark: tags = replace_tags else: tags = self._get_style_tags() if tags: tmpmark = self.textbuf.create_mark(None, working_iter, True) self.textbuf.insert_pixbuf(working_iter, pixbuf) self.starting = False if tags: start = self.textbuf.get_iter_at_mark(tmpmark) for tag in tags: self.textbuf.apply_tag(tag, start, working_iter) self.textbuf.delete_mark(tmpmark) else: self._insert_text('[IMG: %s]' % alt, working_iter) except Exception as ex: log.error('Error loading image %s', str(ex)) pixbuf = None alt = attrs.get('alt', 'Broken image') try: loader.close() except Exception: pass return pixbuf def _begin_span(self, style, tag=None, id_=None): if style is None: self.styles.append(tag) return None if tag is None: if id_: tag = self.textbuf.create_tag(id_) else: tag = self.textbuf.create_tag() # we create anonymous tag for attr, val in style_iter(style): attr = attr.lower() val = val try: method = self.__style_methods[attr] except KeyError: log.warning('Style attribute "%s" requested ' 'but not yet implemented', attr) else: method(self, tag, val) self.styles.append(tag) def _end_span(self): self.styles.pop() def _jump_line(self): self.textbuf.insert_with_tags_by_name(self.iter, '\n', 'eol') self.starting = True def _insert_text(self, text, working_iter=None): if working_iter == None: working_iter = self.iter if self.starting and text != '\n': self.starting = (text[-1] == '\n') tags = self._get_style_tags() if tags: self.textbuf.insert_with_tags(working_iter, text, *tags) else: self.textbuf.insert(working_iter, text) def _starts_line(self): return self.starting or self.iter.starts_line() def _flush_text(self): if not self.text: return text, self.text = self.text, '' if not self.preserve: text = text.replace('\n', ' ') self.handle_specials(whitespace_rx.sub(' ', text)) else: self._insert_text(text.strip('\n')) def _anchor_event(self, tag, textview, event, iter_, href, type_): if event.type == Gdk.EventType.BUTTON_PRESS: self.textview.emit('url-clicked', href, type_) return True return False def handle_specials(self, text): if self.conv_textview: self.iter = self.conv_textview.detect_and_print_special_text(text, self._get_style_tags(), iter_=self.iter) else: self._insert_text(text) def characters(self, content): if self.preserve: self.text += content return if allwhitespace_rx.match(content) is not None and self._starts_line(): return self.text += content self.starting = False def startElement(self, name, attrs): self._flush_text() klass = [i for i in attrs.get('class', ' ').split(' ') if i] style = '' #Add styles defined for classes for k in klass: if k in classes: style += classes[k] tag = None #FIXME: if we want to use id, it needs to be unique across # the whole textview, so we need to add something like the # message-id to it. #id_ = attrs.get('id',None) id_ = None if name == 'a': #TODO: accesskey, charset, hreflang, rel, rev, tabindex, type href = attrs.get('href', None) if not href: href = attrs.get('HREF', None) # Gaim sends HREF instead of href title = attrs.get('title', attrs.get('rel', href)) type_ = attrs.get('type', None) tag = self._create_url(href, title, type_, id_) elif name == 'blockquote': cite = attrs.get('cite', None) if cite: tag = self.textbuf.create_tag(id_) tag.title = attrs.get('title', None) tag.is_anchor = True elif name in LIST_ELEMS: style += ';margin-left: 2em' elif name == 'img': tag = self._process_img(attrs) if name in element_styles: style += element_styles[name] # so that explicit styles override implicit ones, # we add the attribute last style += ";"+attrs.get('style', '') if style == '': style = None self._begin_span(style, tag, id_) if name == 'br': pass # handled in endElement elif name == 'hr': pass # handled in endElement elif name in BLOCK: if not self._starts_line(): self._jump_line() if name == 'pre': self.preserve = True elif name == 'span': pass elif name in ('dl', 'ul'): if not self._starts_line(): self._jump_line() self.list_counters.append(None) elif name == 'ol': if not self._starts_line(): self._jump_line() self.list_counters.append(0) elif name == 'li': if self.list_counters[-1] is None: li_head = chr(0x2022) else: self.list_counters[-1] += 1 li_head = '%i.' % self.list_counters[-1] self.text = ' '*len(self.list_counters)*4 + li_head + ' ' self._flush_text() self.starting = True elif name == 'dd': self._jump_line() elif name == 'dt': if not self.starting: self._jump_line() elif name in ('a', 'img', 'body', 'html'): pass elif name in INLINE: pass else: log.warning('Unhandled element "%s"', name) def endElement(self, name): endPreserving = False newLine = False if name == 'br': newLine = True elif name == 'hr': #FIXME: plenty of unused attributes (width, height,...) :) self._jump_line() self._insert_text('\u2015'*40) self._jump_line() elif name in LIST_ELEMS: self.list_counters.pop() elif name == 'li': newLine = True elif name == 'img': pass elif name == 'body' or name == 'html': pass elif name == 'a': pass elif name in INLINE: pass elif name in ('dd', 'dt', ): pass elif name in BLOCK: if name == 'pre': endPreserving = True elif name in BLOCK_STRUCT: newLine = True else: log.warning("Unhandled element '%s'", name) self._flush_text() if endPreserving: self.preserve = False if newLine: self._jump_line() self._end_span() class HtmlTextView(Gtk.TextView): def __init__(self): Gtk.TextView.__init__(self) self.set_wrap_mode(Gtk.WrapMode.CHAR) self.set_editable(False) self._changed_cursor = False self.set_has_tooltip(True) self.connect('realize', self.on_html_text_view_realized) self.connect('unrealize', self.on_html_text_view_unrealized) self.connect('copy-clipboard', self.on_html_text_view_copy_clipboard) self.id_ = self.connect('button-release-event', self.on_left_mouse_button_release) self.get_buffer().eol_tag = self.get_buffer().create_tag('eol') self.config = app.config self.interface = app.interface # end big hack def connect_tooltip(self, func=None): self.connect('query-tooltip', func or self.__query_tooltip) def create_tags(self): buffer_ = self.get_buffer() self.tagURL = buffer_.create_tag('url') color = app.config.get('urlmsgcolor') self.tagURL.set_property('foreground', color) self.tagURL.set_property('underline', Pango.Underline.SINGLE) self.tagURL.connect('event', self.hyperlink_handler, 'url') self.tagMail = buffer_.create_tag('mail') self.tagMail.set_property('foreground', color) self.tagMail.set_property('underline', Pango.Underline.SINGLE) self.tagMail.connect('event', self.hyperlink_handler, 'mail') self.tagXMPP = buffer_.create_tag('xmpp') self.tagXMPP.set_property('foreground', color) self.tagXMPP.set_property('underline', Pango.Underline.SINGLE) self.tagXMPP.connect('event', self.hyperlink_handler, 'xmpp') self.tagSthAtSth = buffer_.create_tag('sth_at_sth') self.tagSthAtSth.set_property('foreground', color) self.tagSthAtSth.set_property('underline', Pango.Underline.SINGLE) self.tagSthAtSth.connect('event', self.hyperlink_handler, 'sth_at_sth') def __query_tooltip(self, widget, x_pos, y_pos, keyboard_mode, tooltip): window = widget.get_window(Gtk.TextWindowType.TEXT) x_pos, y_pos = self.window_to_buffer_coords( Gtk.TextWindowType.TEXT, x_pos, y_pos) if Gtk.MINOR_VERSION > 18: iter_ = self.get_iter_at_position(x_pos, y_pos)[1] else: iter_ = self.get_iter_at_position(x_pos, y_pos)[0] for tag in iter_.get_tags(): if getattr(tag, 'is_anchor', False): text = getattr(tag, 'title', False) if text: if len(text) > 50: text = text[:47] + '…' tooltip.set_text(text) if not self._changed_cursor: window.set_cursor(gtkgui_helpers.get_cursor('HAND2')) self._changed_cursor = True return True if self._changed_cursor: window.set_cursor(gtkgui_helpers.get_cursor('XTERM')) self._changed_cursor = False return False def on_open_link_activate(self, widget, kind, text): helpers.launch_browser_mailer(kind, text) def on_copy_link_activate(self, widget, text): clip = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) clip.set_text(text, -1) # def on_start_chat_activate(self, widget, jid): # app.interface.new_chat_from_jid(self.account, jid) def on_join_group_chat_menuitem_activate(self, widget, room_jid): dialogs.JoinGroupchatWindow(None, room_jid) def on_add_to_roster_activate(self, widget, jid): dialogs.AddNewContactWindow(self.account, jid) def make_link_menu(self, event, kind, text): from gajim.gtkgui_helpers import get_gtk_builder xml = get_gtk_builder('chat_context_menu.ui') menu = xml.get_object('chat_context_menu') childs = menu.get_children() if kind == 'url': childs[0].connect('activate', self.on_copy_link_activate, text) childs[1].connect('activate', self.on_open_link_activate, kind, text) childs[2].hide() # copy mail address childs[3].hide() # open mail composer childs[4].hide() # jid section separator childs[5].hide() # start chat childs[6].hide() # join group chat childs[7].hide() # add to roster else: # It's a mail or a JID # load muc icon join_group_chat_menuitem = xml.get_object('join_group_chat_menuitem') text = text.lower() if text.startswith('xmpp:'): text = text[5:] childs[2].connect('activate', self.on_copy_link_activate, text) childs[3].connect('activate', self.on_open_link_activate, kind, text) # childs[5].connect('activate', self.on_start_chat_activate, text) childs[6].connect('activate', self.on_join_group_chat_menuitem_activate, text) # if self.account and app.connections[self.account].\ # roster_supported: # childs[7].connect('activate', # self.on_add_to_roster_activate, text) # childs[7].show() # show add to roster menuitem # else: # childs[7].hide() # hide add to roster menuitem if kind == 'xmpp': childs[0].connect('activate', self.on_copy_link_activate, 'xmpp:' + text) childs[2].hide() # copy mail address childs[3].hide() # open mail composer elif kind == 'mail': childs[6].hide() # join group chat if kind != 'xmpp': childs[0].hide() # copy link location childs[1].hide() # open link in browser childs[4].hide() # jid section separator childs[5].hide() # start chat childs[7].hide() # add to roster menu.popup(None, None, None, event.button, event.time) def hyperlink_handler(self, texttag, widget, event, iter_, kind): if event.type == Gdk.EventType.BUTTON_PRESS: begin_iter = iter_.copy() # we get the begining of the tag while not begin_iter.begins_tag(texttag): begin_iter.backward_char() end_iter = iter_.copy() # we get the end of the tag while not end_iter.ends_tag(texttag): end_iter.forward_char() # Detect XHTML-IM link word = getattr(texttag, 'href', None) if word: if word.startswith('xmpp'): kind = 'xmpp' elif word.startswith('mailto:'): kind = 'mail' elif app.interface.sth_at_sth_dot_sth_re.match(word): # it's a JID or mail kind = 'sth_at_sth' else: word = self.textview.get_buffer().get_text(begin_iter, end_iter) if event.button == 3: # right click self.make_link_menu(event, kind, word) return True else: # we launch the correct application if kind == 'xmpp': word = word[5:] if '?' in word: (jid, action) = word.split('?') if action == 'join': self.on_join_group_chat_menuitem_activate(None, jid) else: self.on_start_chat_activate(None, jid) else: self.on_start_chat_activate(None, word) else: helpers.launch_browser_mailer(kind, word) def _hyperlink_handler(self, texttag, widget, event, iter_, kind): # self.hyperlink_handler can be overwritten, so call it when needed self.hyperlink_handler(texttag, widget, event, iter_, kind) def display_html(self, html, textview, conv_textview, iter_=None): buffer_ = self.get_buffer() if iter_: eob = iter_ else: eob = buffer_.get_end_iter() ## this works too if libxml2 is not available # parser = xml.sax.make_parser(['drv_libxml2']) # parser.setFeature(xml.sax.handler.feature_validation, True) parser = xml.sax.make_parser() parser.setContentHandler(HtmlHandler(textview, conv_textview, eob)) parser.parse(StringIO(html)) # too much space after :) #if not eob.starts_line(): # buffer_.insert(eob, '\n') def on_html_text_view_copy_clipboard(self, unused_data): clipboard = self.get_clipboard(Gdk.SELECTION_CLIPBOARD) selected = self.get_selected_text() clipboard.set_text(selected, -1) GObject.signal_stop_emission_by_name(self, 'copy-clipboard') def on_html_text_view_realized(self, unused_data): self.get_buffer().remove_selection_clipboard(self.get_clipboard( Gdk.SELECTION_PRIMARY)) def on_html_text_view_unrealized(self, unused_data): self.get_buffer().add_selection_clipboard(self.get_clipboard( Gdk.SELECTION_PRIMARY)) def on_left_mouse_button_release(self, widget, event): if event.button != 1: return bounds = self.get_buffer().get_selection_bounds() if bounds: # textview can be hidden while we add a new line in it. if self.has_screen(): clipboard = self.get_clipboard(Gdk.SELECTION_PRIMARY) selected = self.get_selected_text() clipboard.set_text(selected, -1) def get_selected_text(self): bounds = self.get_buffer().get_selection_bounds() selection = '' if bounds: (search_iter, end) = bounds while (search_iter.compare(end)): character = search_iter.get_char() if character == '\ufffc': anchor = search_iter.get_child_anchor() if anchor: text = anchor.plaintext if text: selection+=text else: selection+=character else: selection+=character search_iter.forward_char() return selection change_cursor = None if __name__ == '__main__': from conversation_textview import ConversationTextview import gajim as gaj log = logging.getLogger() gaj.Interface() # create fake app.plugin_manager.gui_extension_point method for tests def gui_extension_point(*args): pass app.plugin_manager = gaj.Interface() app.plugin_manager.gui_extension_point = gui_extension_point htmlview = ConversationTextview(None) def on_textview_motion_notify_event(widget, event): """ Change the cursor to a hand when we are over a mail or an url """ global change_cursor w = htmlview.tv.get_window(Gtk.TextWindowType.TEXT) device = w.get_display().get_device_manager().get_client_pointer() pointer = w.get_device_position(device) x = pointer[1] y = pointer[2] tags = htmlview.tv.get_iter_at_location(x, y).get_tags() if change_cursor: w.set_cursor(gtkgui_helpers.get_cursor('XTERM')) change_cursor = None tag_table = htmlview.tv.get_buffer().get_tag_table() for tag in tags: try: if tag.is_anchor: w.set_cursor(gtkgui_helpers.get_cursor('HAND2')) change_cursor = tag elif tag == tag_table.lookup('focus-out-line'): over_line = True except Exception: pass htmlview.tv.connect('motion_notify_event', on_textview_motion_notify_event) def handler(texttag, widget, event, iter_, kind): if event.type == Gdk.EventType.BUTTON_PRESS: pass htmlview.tv.hyperlink_handler = htmlview.hyperlink_handler htmlview.print_real_text(None, xhtml='

' 'Hello
\n' '
\n' 'World\n' '
\n') htmlview.print_real_text(None, xhtml='
') htmlview.print_real_text(None, xhtml='''

a:b Google


''') htmlview.print_real_text(None, xhtml='''

O MG, I'm green with envy!

''') htmlview.print_real_text(None, xhtml='
') htmlview.print_real_text(None, xhtml=''' http://test.com/ testing links autolinkifying ''') htmlview.print_real_text(None, xhtml='
') htmlview.print_real_text(None, xhtml='''

As Emerson said in his essay Self-Reliance:

"A foolish consistency is the hobgoblin of little minds."

''') htmlview.print_real_text(None, xhtml='
') htmlview.print_real_text(None, xhtml='''

Hey, are you licensed to Jabber?

A License to Jabber

''') htmlview.print_real_text(None, xhtml='
') htmlview.print_real_text(None, xhtml='''
  • One
  • Two
  • Three

def fac(n):
def faciter(n,acc):
    if n==0: return acc
    return faciter(n-1, acc*n)
if n<0: raise ValueError('Must be non-negative')
return faciter(n,1)
''') htmlview.print_real_text(None, xhtml='
') htmlview.print_real_text(None, xhtml='''
  1. One
  2. Two is nested:
    • One
    • Two
    • Three
    • Four
  3. Three
''') htmlview.print_real_text(None, xhtml='
') htmlview.print_real_text(None, xhtml='''

xmpp link :

examples@example.org wrote:

this cite - bla bla bla, smile- :-) …

some text

#232/1

''') htmlview.print_real_text(None, xhtml='
') htmlview.print_real_text(None, xhtml='''
Larry ''') htmlview.tv.show() sw = Gtk.ScrolledWindow() sw.set_property('hscrollbar-policy', Gtk.PolicyType.AUTOMATIC) sw.set_property('vscrollbar-policy', Gtk.PolicyType.AUTOMATIC) sw.set_property('border-width', 0) sw.add(htmlview.tv) sw.show() frame = Gtk.Frame() frame.set_shadow_type(Gtk.ShadowType.IN) frame.show() frame.add(sw) w = Gtk.Window() w.add(frame) w.set_default_size(400, 300) w.show_all() w.connect('destroy', lambda w: Gtk.main_quit()) Gtk.main() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/logind_listener.py000066400000000000000000000072551326020644600255360ustar00rootroot00000000000000## src/logind_listener.py ## ## Copyright (C) 2014 Kamil Paral ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## ''' Watch for system suspend using systemd-logind. Documentation: http://www.freedesktop.org/wiki/Software/systemd/inhibit ''' import os import logging from gi.repository import Gio, GLib from gajim.common import app log = logging.getLogger('gajim.logind_listener') # file descriptor of the inhibitor; negative number means we don't # hold any (yet) fd = None def signal_received(connection, sender_name, object_path, interface_name, signal_name, parameters, *user_data): '''Signal handler for suspend event''' global fd log.info('Signal received: %s - %s', interface_name, parameters) # signal is sent right before (with the parameter True) and after # (with the parameter False) the system goes down for suspend/hibernate if not parameters[0]: return # we're going for suspend, let's disconnect log.debug('System suspend detected, disconnecting from network…') for name, conn in app.connections.items(): if app.account_is_connected(name): conn.old_show = app.SHOW_LIST[conn.connected] st = conn.status conn.change_status('offline', _('Machine going to sleep')) conn.status = st conn.time_to_reconnect = 5 # close the file descriptor and let the computer suspend if fd is not None: os.close(fd) fd = None else: # something is wrong, the system is suspending but we don't have # a lock file log.warning("System suspend detected, but we don't seem to be holding " "a file descriptor for sleep inihibitor") def get_inhibitor(connection): '''Ask for a suspend delay inhibitor''' global fd if fd is not None: # someting is wrong, we haven't closed the previous file descriptor # and we ask for yet another one log.warning('We are about to ask for a sleep inhibitor, but we seem ' 'to be holding one already') ret = connection.call_with_unix_fd_list_sync( 'org.freedesktop.login1', '/org/freedesktop/login1', 'org.freedesktop.login1.Manager', 'Inhibit', GLib.Variant('(ssss)', ('sleep', 'org.gajim.Gajim', _('Disconnect from the network'), 'delay')), GLib.VariantType.new('(h)'), Gio.DBusCallFlags.NONE, -1, None, None) fd = ret.out_fd_list.get(0) def appeared(connection, name, name_owner, *user_data): '''Set up a listener for suspend signals''' log.info('%s appeared', name) if name == 'org.freedesktop.login1': connection.signal_subscribe( 'org.freedesktop.login1', 'org.freedesktop.login1.Manager', 'PrepareForSleep', '/org/freedesktop/login1', None, Gio.DBusSignalFlags.NONE, signal_received, None) get_inhibitor(connection) Gio.bus_watch_name( Gio.BusType.SYSTEM, 'org.freedesktop.login1', Gio.BusNameWatcherFlags.NONE, appeared, None) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/message_control.py000066400000000000000000000173321326020644600255360ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/message_control.py ## ## Copyright (C) 2006 Dimitur Kirov ## Nikos Kouremenos ## Copyright (C) 2006-2007 Jean-Marie Traissard ## Travis Shirk ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2007 Julien Pivotto ## Stephan Erb ## Copyright (C) 2007-2008 Brendan Taylor ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gajim import gtkgui_helpers import uuid from gajim.common import app from gajim.common import helpers from gajim.common import ged from gajim.common.stanza_session import EncryptedStanzaSession, ArchivingStanzaSession # Derived types MUST register their type IDs here if custom behavor is required TYPE_CHAT = 'chat' TYPE_GC = 'gc' TYPE_PM = 'pm' #################### class MessageControl(object): """ An abstract base widget that can embed in the Gtk.Notebook of a MessageWindow """ def __init__(self, type_id, parent_win, widget_name, contact, account, resource=None): # dict { cb id : widget} # keep all registered callbacks of widgets, created by self.xml self.handlers = {} self.type_id = type_id self.parent_win = parent_win self.widget_name = widget_name self.contact = contact self.account = account self.resource = resource # control_id is a unique id for the control, # its used as action name for actions that belong to a control self.control_id = str(uuid.uuid4()) self.session = None app.last_message_time[self.account][self.get_full_jid()] = 0 self.xml = gtkgui_helpers.get_gtk_builder('%s.ui' % widget_name) self.xml.connect_signals(self) self.widget = self.xml.get_object('%s_hbox' % widget_name) app.ged.register_event_handler('message-outgoing', ged.OUT_GUI1, self._nec_message_outgoing) def get_full_jid(self): fjid = self.contact.jid if self.resource: fjid += '/' + self.resource return fjid def set_control_active(self, state): """ Called when the control becomes active (state is True) or inactive (state is False) """ pass # Derived classes MUST implement this method def minimizable(self): """ Called to check if control can be minimized Derived classes MAY implement this. """ return False def safe_shutdown(self): """ Called to check if control can be closed without loosing data. returns True if control can be closed safely else False Derived classes MAY implement this. """ return True def allow_shutdown(self, method, on_response_yes, on_response_no, on_response_minimize): """ Called to check is a control is allowed to shutdown. If a control is not in a suitable shutdown state this method should call on_response_no, else on_response_yes or on_response_minimize Derived classes MAY implement this. """ on_response_yes(self) def shutdown(self): """ Derived classes MUST implement this """ app.ged.remove_event_handler('message-outgoing', ged.OUT_GUI1, self._nec_message_outgoing) def repaint_themed_widgets(self): """ Derived classes SHOULD implement this """ pass def update_ui(self): """ Derived classes SHOULD implement this """ pass def toggle_emoticons(self): """ Derived classes MAY implement this """ pass def update_font(self): """ Derived classes SHOULD implement this """ pass def update_tags(self): """ Derived classes SHOULD implement this """ pass def get_tab_label(self, chatstate): """ Return a suitable tab label string. Returns a tuple such as: (label_str, color) either of which can be None if chatstate is given that means we have HE SENT US a chatstate and we want it displayed Derivded classes MUST implement this. """ # Return a markup'd label and optional Gtk.Color in a tuple like: # return (label_str, None) pass def get_tab_image(self, count_unread=True): # Return a suitable tab image for display. # None clears any current label. return None def prepare_context_menu(self, hide_buttonbar_items=False): """ Derived classes SHOULD implement this """ return None def got_connected(self): pass def got_disconnected(self): pass def get_specific_unread(self): return len(app.events.get_events(self.account, self.contact.jid)) def set_session(self, session): oldsession = None if hasattr(self, 'session'): oldsession = self.session if oldsession and session == oldsession: return self.session = session if session: session.control = self if session and oldsession: oldsession.control = None crypto_changed = bool(session and isinstance(session, EncryptedStanzaSession) and session.enable_encryption) != \ bool(oldsession and isinstance(oldsession, EncryptedStanzaSession) \ and oldsession.enable_encryption) archiving_changed = bool(session and isinstance(session, ArchivingStanzaSession) and session.archiving) != \ bool(oldsession and isinstance(oldsession, ArchivingStanzaSession) and oldsession.archiving) if crypto_changed or archiving_changed: self.print_session_details(oldsession) def remove_session(self, session): if session != self.session: return self.session.control = None self.session = None def _nec_message_outgoing(self, obj): # Send the given message to the active tab. # Doesn't return None if error if obj.control != self: return obj.message = helpers.remove_invalid_xml_chars(obj.message) conn = app.connections[self.account] if not self.session: if (not obj.resource and obj.jid != app.get_jid_from_account(self.account)): if self.resource: obj.resource = self.resource else: obj.resource = self.contact.resource sess = conn.find_controlless_session(obj.jid, resource=obj.resource) if self.resource: obj.jid += '/' + self.resource if not sess: if self.type_id == TYPE_PM: sess = conn.make_new_session(obj.jid, type_='pm') else: sess = conn.make_new_session(obj.jid) self.set_session(sess) obj.session = self.session gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/message_textview.py000066400000000000000000000323031326020644600257300ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/message_textview.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2005-2007 Nikos Kouremenos ## Copyright (C) 2006 Dimitur Kirov ## Copyright (C) 2008-2009 Julien Pivotto ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import gc from gi.repository import Gtk from gi.repository import GLib from gi.repository import Pango from gajim.common import app from gajim import gtkgui_helpers if app.HAVE_SPELL: from gi.repository import Gspell class MessageTextView(Gtk.TextView): """ Class for the message textview (where user writes new messages) for chat/groupchat windows """ UNDO_LIMIT = 20 PLACEHOLDER = _('Write a message..') def __init__(self): Gtk.TextView.__init__(self) # set properties self.set_border_width(3) self.set_accepts_tab(True) self.set_editable(True) self.set_cursor_visible(True) self.set_wrap_mode(Gtk.WrapMode.WORD_CHAR) self.set_left_margin(2) self.set_right_margin(2) self.set_pixels_above_lines(2) self.set_pixels_below_lines(2) self.get_style_context().add_class('font_custom') # set undo list self.undo_list = [] # needed to know if we undid something self.undo_pressed = False _buffer = self.get_buffer() self.begin_tags = {} self.end_tags = {} self.color_tags = [] self.fonts_tags = [] self.other_tags = {} self.placeholder_tag = _buffer.create_tag('placeholder') self.placeholder_tag.set_property('foreground_rgba', gtkgui_helpers.Color.GREY) self.other_tags['bold'] = _buffer.create_tag('bold') self.other_tags['bold'].set_property('weight', Pango.Weight.BOLD) self.begin_tags['bold'] = '' self.end_tags['bold'] = '' self.other_tags['italic'] = _buffer.create_tag('italic') self.other_tags['italic'].set_property('style', Pango.Style.ITALIC) self.begin_tags['italic'] = '' self.end_tags['italic'] = '' self.other_tags['underline'] = _buffer.create_tag('underline') self.other_tags['underline'].set_property('underline', Pango.Underline.SINGLE) self.begin_tags['underline'] = '' self.end_tags['underline'] = '' self.other_tags['strike'] = _buffer.create_tag('strike') self.other_tags['strike'].set_property('strikethrough', True) self.begin_tags['strike'] = '' self.end_tags['strike'] = '' self.connect('paste-clipboard', self._paste_clipboard) self.connect_after('paste-clipboard', self._after_paste_clipboard) self.connect('focus-in-event', self._on_focus_in) self.connect('focus-out-event', self._on_focus_out) start, end = _buffer.get_bounds() _buffer.insert_with_tags( start, self.PLACEHOLDER, self.placeholder_tag) def has_text(self): buf = self.get_buffer() start, end = buf.get_bounds() text = buf.get_text(start, end, True) return text != self.PLACEHOLDER and text != '' def get_text(self): # gets the text if its not PLACEHOLDER buf = self.get_buffer() start, end = buf.get_bounds() text = self.get_buffer().get_text(start, end, True) if text == self.PLACEHOLDER: return '' return text def is_placeholder(self): buf = self.get_buffer() start, end = buf.get_bounds() text = buf.get_text(start, end, True) return text == self.PLACEHOLDER def _on_focus_in(self, *args): if self.is_placeholder(): self.get_buffer().set_text('') self.toggle_speller(True) def _on_focus_out(self, *args): buf = self.get_buffer() start, end = buf.get_bounds() text = buf.get_text(start, end, True) if text == '': buf.insert_with_tags( start, self.PLACEHOLDER, self.placeholder_tag) self.toggle_speller(False) def toggle_speller(self, activate): if app.HAVE_SPELL and app.config.get('use_speller'): spell_view = Gspell.TextView.get_from_gtk_text_view(self) spell_view.set_inline_spell_checking(activate) def remove_placeholder(self): self._on_focus_in() @staticmethod def _paste_clipboard(textview): if textview.is_placeholder(): textview.get_buffer().set_text('') @staticmethod def _after_paste_clipboard(textview): buffer_ = textview.get_buffer() mark = buffer_.get_insert() iter_ = buffer_.get_iter_at_mark(mark) if iter_.get_offset() == buffer_.get_end_iter().get_offset(): GLib.idle_add(gtkgui_helpers.scroll_to_end, textview.get_parent()) def make_clickable_urls(self, text): _buffer = self.get_buffer() start = 0 end = 0 index = 0 new_text = '' iterator = app.interface.link_pattern_re.finditer(text) for match in iterator: start, end = match.span() url = text[start:end] if start != 0: text_before_special_text = text[index:start] else: text_before_special_text = '' # we insert normal text new_text += text_before_special_text + \ '' + url + '' index = end # update index if end < len(text): new_text += text[end:] return new_text # the position after *last* special text def get_active_tags(self): start, finish = self.get_active_iters() active_tags = [] for tag in start.get_tags(): active_tags.append(tag.get_property('name')) return active_tags def get_active_iters(self): _buffer = self.get_buffer() return_val = _buffer.get_selection_bounds() if return_val: # if sth was selected start, finish = return_val[0], return_val[1] else: start, finish = _buffer.get_bounds() return (start, finish) def set_tag(self, tag): _buffer = self.get_buffer() start, finish = self.get_active_iters() if start.has_tag(self.other_tags[tag]): _buffer.remove_tag_by_name(tag, start, finish) else: if tag == 'underline': _buffer.remove_tag_by_name('strike', start, finish) elif tag == 'strike': _buffer.remove_tag_by_name('underline', start, finish) _buffer.apply_tag_by_name(tag, start, finish) def clear_tags(self): _buffer = self.get_buffer() start, finish = self.get_active_iters() _buffer.remove_all_tags(start, finish) def color_set(self, widget, response): if response == -6 or response == -4: widget.destroy() return color = widget.get_property('rgba') widget.destroy() _buffer = self.get_buffer() # Create #aabbcc color string from rgba color color_string = '#%02X%02X%02X' % (round(color.red*255), round(color.green*255), round(color.blue*255)) tag_name = 'color' + color_string if not tag_name in self.color_tags: tagColor = _buffer.create_tag(tag_name) tagColor.set_property('foreground', color_string) self.begin_tags[tag_name] = '' % color_string self.end_tags[tag_name] = '' self.color_tags.append(tag_name) start, finish = self.get_active_iters() for tag in self.color_tags: _buffer.remove_tag_by_name(tag, start, finish) _buffer.apply_tag_by_name(tag_name, start, finish) def font_set(self, widget, response, start, finish): if response == -6 or response == -4: widget.destroy() return font = widget.get_font() font_desc = widget.get_font_desc() family = font_desc.get_family() size = font_desc.get_size() size = size / Pango.SCALE weight = font_desc.get_weight() style = font_desc.get_style() widget.destroy() _buffer = self.get_buffer() tag_name = 'font' + font if not tag_name in self.fonts_tags: tagFont = _buffer.create_tag(tag_name) tagFont.set_property('font', family + ' ' + str(size)) self.begin_tags[tag_name] = \ '' self.end_tags[tag_name] = '' self.fonts_tags.append(tag_name) for tag in self.fonts_tags: _buffer.remove_tag_by_name(tag, start, finish) _buffer.apply_tag_by_name(tag_name, start, finish) if weight == Pango.Weight.BOLD: _buffer.apply_tag_by_name('bold', start, finish) else: _buffer.remove_tag_by_name('bold', start, finish) if style == Pango.Style.ITALIC: _buffer.apply_tag_by_name('italic', start, finish) else: _buffer.remove_tag_by_name('italic', start, finish) def get_xhtml(self): _buffer = self.get_buffer() old = _buffer.get_start_iter() tags = {} tags['bold'] = False iter_ = _buffer.get_start_iter() old = _buffer.get_start_iter() text = '' modified = False def xhtml_special(text): text = text.replace('<', '<') text = text.replace('>', '>') text = text.replace('&', '&') text = text.replace('\n', '
') return text for tag in iter_.get_toggled_tags(True): tag_name = tag.get_property('name') if tag_name not in self.begin_tags: continue text += self.begin_tags[tag_name] modified = True while (iter_.forward_to_tag_toggle(None) and not iter_.is_end()): text += xhtml_special(_buffer.get_text(old, iter_, True)) old.forward_to_tag_toggle(None) new_tags, old_tags, end_tags = [], [], [] for tag in iter_.get_toggled_tags(True): tag_name = tag.get_property('name') if tag_name not in self.begin_tags: continue new_tags.append(tag_name) modified = True for tag in iter_.get_tags(): tag_name = tag.get_property('name') if tag_name not in self.begin_tags or tag_name not in self.end_tags: continue if tag_name not in new_tags: old_tags.append(tag_name) for tag in iter_.get_toggled_tags(False): tag_name = tag.get_property('name') if tag_name not in self.end_tags: continue end_tags.append(tag_name) for tag in old_tags: text += self.end_tags[tag] for tag in end_tags: text += self.end_tags[tag] for tag in new_tags: text += self.begin_tags[tag] for tag in old_tags: text += self.begin_tags[tag] text += xhtml_special(_buffer.get_text(old, _buffer.get_end_iter(), True)) for tag in iter_.get_toggled_tags(False): tag_name = tag.get_property('name') if tag_name not in self.end_tags: continue text += self.end_tags[tag_name] if modified: return '

' + self.make_clickable_urls(text) + '

' else: return None def destroy(self): GLib.idle_add(gc.collect) def clear(self, widget = None): """ Clear text in the textview """ _buffer = self.get_buffer() start, end = _buffer.get_bounds() _buffer.delete(start, end) def save_undo(self, text): self.undo_list.append(text) if len(self.undo_list) > self.UNDO_LIMIT: del self.undo_list[0] self.undo_pressed = False def undo(self, widget=None): """ Undo text in the textview """ _buffer = self.get_buffer() if self.undo_list: _buffer.set_text(self.undo_list.pop()) self.undo_pressed = True def get_sensitive(self): # get sensitive is not in GTK < 2.18 try: return super(MessageTextView, self).get_sensitive() except AttributeError: return self.get_property('sensitive') gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/message_window.py000066400000000000000000001437531326020644600253740ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/message_window.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2005-2008 Travis Shirk ## Nikos Kouremenos ## Copyright (C) 2006 Geobert Quach ## Dimitur Kirov ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2007 Julien Pivotto ## Stephan Erb ## Copyright (C) 2008 Brendan Taylor ## Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import time from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GdkPixbuf from gi.repository import GObject from gi.repository import GLib from gajim import common from gajim import gtkgui_helpers from gajim import message_control from gajim import dialogs from gajim.chat_control_base import ChatControlBase from gajim.chat_control import ChatControl from gajim.common import app from gajim.common.i18n import Q_ #################### class MessageWindow(object): """ Class for windows which contain message like things; chats, groupchats, etc """ # DND_TARGETS is the targets needed by drag_source_set and drag_dest_set DND_TARGETS = [('GAJIM_TAB', 0, 81)] hid = 0 # drag_data_received handler id ( CLOSE_TAB_MIDDLE_CLICK, CLOSE_ESC, CLOSE_CLOSE_BUTTON, CLOSE_COMMAND, CLOSE_CTRL_KEY ) = range(5) def __init__(self, acct, type_, parent_window=None, parent_paned=None): # A dictionary of dictionaries # where _contacts[account][jid] == A MessageControl self._controls = {} # If None, the window is not tied to any specific account self.account = acct # If None, the window is not tied to any specific type self.type_ = type_ # dict { handler id: widget}. Keeps callbacks, which # lead to cylcular references self.handlers = {} # Don't show warning dialogs when we want to delete the window self.dont_warn_on_delete = False self.widget_name = 'message_window' self.xml = gtkgui_helpers.get_gtk_builder('%s.ui' % self.widget_name) self.window = self.xml.get_object(self.widget_name) self.window.set_application(app.app) self.notebook = self.xml.get_object('notebook') self.parent_paned = None if parent_window: orig_window = self.window self.window = parent_window self.parent_paned = parent_paned old_parent = self.notebook.get_parent() old_parent.remove(self.notebook) if app.config.get('roster_on_the_right'): child1 = self.parent_paned.get_child1() self.parent_paned.remove(child1) self.parent_paned.pack1(self.notebook, resize=False) self.parent_paned.pack2(child1) else: self.parent_paned.pack2(self.notebook) self.window.lookup_action('show-roster').set_enabled(True) orig_window.destroy() del orig_window # NOTE: we use 'connect_after' here because in # MessageWindowMgr._new_window we register handler that saves window # state when closing it, and it should be called before # MessageWindow._on_window_delete, which manually destroys window # through win.destroy() - this means no additional handlers for # 'delete-event' are called. id_ = self.window.connect_after('delete-event', self._on_window_delete) self.handlers[id_] = self.window id_ = self.window.connect('destroy', self._on_window_destroy) self.handlers[id_] = self.window id_ = self.window.connect('focus-in-event', self._on_window_focus) self.handlers[id_] = self.window keys=['f', 'g', 'h', 'i', 'l', 'L', 'n', 'u', 'b', 'F4', 'w', 'Page_Up', 'Page_Down', 'Right', 'Left', 'd', 'c', 'm', 't', 'Escape'] + \ [''+str(i) for i in range(10)] accel_group = Gtk.AccelGroup() for key in keys: keyval, mod = Gtk.accelerator_parse(key) accel_group.connect(keyval, mod, Gtk.AccelFlags.VISIBLE, self.accel_group_func) self.window.add_accel_group(accel_group) # gtk+ doesn't make use of the motion notify on gtkwindow by default # so this line adds that self.window.add_events(Gdk.EventMask.POINTER_MOTION_MASK) id_ = self.notebook.connect('switch-page', self._on_notebook_switch_page) self.handlers[id_] = self.notebook id_ = self.notebook.connect('key-press-event', self._on_notebook_key_press) self.handlers[id_] = self.notebook # Tab customizations pref_pos = app.config.get('tabs_position') if pref_pos == 'bottom': nb_pos = Gtk.PositionType.BOTTOM elif pref_pos == 'left': nb_pos = Gtk.PositionType.LEFT elif pref_pos == 'right': nb_pos = Gtk.PositionType.RIGHT else: nb_pos = Gtk.PositionType.TOP self.notebook.set_tab_pos(nb_pos) window_mode = app.interface.msg_win_mgr.mode if app.config.get('tabs_always_visible') or \ window_mode == MessageWindowMgr.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: self.notebook.set_show_tabs(True) else: self.notebook.set_show_tabs(False) self.notebook.set_show_border(app.config.get('tabs_border')) self.show_icon() def change_account_name(self, old_name, new_name): if old_name in self._controls: self._controls[new_name] = self._controls[old_name] del self._controls[old_name] for ctrl in self.controls(): if ctrl.account == old_name: ctrl.account = new_name if self.account == old_name: self.account = new_name def change_jid(self, account, old_jid, new_jid): """ Called when the full jid of the control is changed """ if account not in self._controls: return if old_jid not in self._controls[account]: return if old_jid == new_jid: return self._controls[account][new_jid] = self._controls[account][old_jid] del self._controls[account][old_jid] def get_num_controls(self): return sum(len(d) for d in self._controls.values()) def resize(self, width, height): gtkgui_helpers.resize_window(self.window, width, height) def _on_window_focus(self, widget, event): # on destroy() the window that was last focused gets the focus # again. if destroy() is called from the StartChat Dialog, this # Window is not yet focused, because present() seems to be asynchron # at least on KDE, and takes time. if 'start_chat' in app.interface.instances: if app.interface.instances['start_chat'].ready_to_destroy: app.interface.instances['start_chat'].destroy() # window received focus, so if we had urgency REMOVE IT # NOTE: we do not have to read the message (it maybe in a bg tab) # to remove urgency hint so this functions does that gtkgui_helpers.set_unset_urgency_hint(self.window, False) ctrl = self.get_active_control() if ctrl: ctrl.set_control_active(True) # Undo "unread" state display, etc. if ctrl.type_id == message_control.TYPE_GC: self.redraw_tab(ctrl, 'active') else: # NOTE: we do not send any chatstate to preserve # inactive, gone, etc. self.redraw_tab(ctrl) def _on_window_delete(self, win, event): if self.dont_warn_on_delete: # Destroy the window return False # Number of controls that will be closed and for which we'll loose data: # chat, pm, gc that won't go in roster number_of_closed_control = 0 for ctrl in self.controls(): if not ctrl.safe_shutdown(): number_of_closed_control += 1 if number_of_closed_control > 1: def on_yes1(checked): if checked: app.config.set('confirm_close_multiple_tabs', False) self.dont_warn_on_delete = True for ctrl in self.controls(): if ctrl.minimizable(): ctrl.minimize() win.destroy() if not app.config.get('confirm_close_multiple_tabs'): for ctrl in self.controls(): if ctrl.minimizable(): ctrl.minimize() # destroy window return False dialogs.YesNoDialog( _('You are going to close several tabs'), _('Do you really want to close them all?'), checktext=_('_Do not ask me again'), on_response_yes=on_yes1, transient_for=self.window) return True def on_yes(ctrl): if self.on_delete_ok == 1: self.dont_warn_on_delete = True win.destroy() self.on_delete_ok -= 1 def on_no(ctrl): return def on_minimize(ctrl): ctrl.minimize() if self.on_delete_ok == 1: self.dont_warn_on_delete = True win.destroy() self.on_delete_ok -= 1 # Make sure all controls are okay with being deleted self.on_delete_ok = self.get_nb_controls() for ctrl in self.controls(): ctrl.allow_shutdown(self.CLOSE_CLOSE_BUTTON, on_yes, on_no, on_minimize) return True # halt the delete for the moment def _on_window_destroy(self, win): for ctrl in self.controls(): ctrl.shutdown() self._controls.clear() # Clean up handlers connected to the parent window, this is important since # self.window may be the RosterWindow for i in list(self.handlers.keys()): if self.handlers[i].handler_is_connected(i): self.handlers[i].disconnect(i) del self.handlers[i] del self.handlers def new_tab(self, control): fjid = control.get_full_jid() if control.account not in self._controls: self._controls[control.account] = {} self._controls[control.account][fjid] = control if self.get_num_controls() == 2: first_widget = self.notebook.get_nth_page(0) ctrl = self._widget_to_control(first_widget) self.notebook.set_show_tabs(True) ctrl.scroll_to_end() # Add notebook page and connect up to the tab's close button xml = gtkgui_helpers.get_gtk_builder('message_window.ui', 'chat_tab_ebox') tab_label_box = xml.get_object('chat_tab_ebox') widget = xml.get_object('tab_close_button') # this reduces the size of the button # style = Gtk.RcStyle() # style.xthickness = 0 # style.ythickness = 0 # widget.modify_style(style) id_ = widget.connect('clicked', self._on_close_button_clicked, control) control.handlers[id_] = widget id_ = tab_label_box.connect('button-press-event', self.on_tab_eventbox_button_press_event, control.widget) control.handlers[id_] = tab_label_box self.notebook.append_page(control.widget, tab_label_box) self.notebook.set_tab_reorderable(control.widget, True) self.redraw_tab(control) if self.parent_paned: self.notebook.show_all() else: self.window.show_all() # NOTE: we do not call set_control_active(True) since we don't know # whether the tab is the active one. self.show_title() if self.get_num_controls() == 1: GLib.timeout_add(500, control.msg_textview.grab_focus) def on_tab_eventbox_button_press_event(self, widget, event, child): if event.button == 3: # right click n = self.notebook.page_num(child) self.notebook.set_current_page(n) self.popup_menu(event) elif event.button == 2: # middle click ctrl = self._widget_to_control(child) self.remove_tab(ctrl, self.CLOSE_TAB_MIDDLE_CLICK) else: ctrl = self._widget_to_control(child) GLib.idle_add(ctrl.msg_textview.grab_focus) def accel_group_func(self, accel_group, acceleratable, keyval, modifier): st = '1234567890' # alt+1 means the first tab (tab 0) control = self.get_active_control() if not control: # No more control in this window return # CTRL mask if modifier & Gdk.ModifierType.CONTROL_MASK: if keyval == Gdk.KEY_h: # CTRL + h if Gtk.Settings.get_default().get_property( 'gtk-key-theme-name') != 'Emacs': arg = GLib.Variant('s', 'none') self.window.lookup_action( 'browse-history-%s' % control.control_id).activate(arg) return True elif control.type_id == message_control.TYPE_CHAT and \ keyval == Gdk.KEY_f: # CTRL + f # CTRL + f moves cursor one char forward when user uses Emacs # theme if not Gtk.Settings.get_default().get_property( 'gtk-key-theme-name') == 'Emacs': if app.interface.msg_win_mgr.mode == \ app.interface.msg_win_mgr.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: app.interface.roster.tree.grab_focus() return False self.window.lookup_action( 'send-file-%s' % control.control_id).activate() return True elif control.type_id == message_control.TYPE_CHAT and \ keyval == Gdk.KEY_g: # CTRL + g control._on_convert_to_gc_menuitem_activate(None) return True elif control.type_id in (message_control.TYPE_CHAT, message_control.TYPE_PM) and keyval == Gdk.KEY_i: # CTRL + i self.window.lookup_action( 'information-%s' % control.control_id).activate() return True elif keyval == Gdk.KEY_l or keyval == Gdk.KEY_L: # CTRL + l|L control.conv_textview.clear() return True elif keyval == Gdk.KEY_u: # CTRL + u: emacs style clear line control.clear(control.msg_textview) return True elif control.type_id == message_control.TYPE_GC and \ keyval == Gdk.KEY_b: # CTRL + b # CTRL + b moves cursor one char backward when user uses Emacs # theme if not Gtk.Settings.get_default().get_property( 'gtk-key-theme-name') == 'Emacs': self.window.lookup_action( 'bookmark-%s' % control.control_id).activate() return True # Tab switch bindings elif keyval == Gdk.KEY_F4: # CTRL + F4 self.remove_tab(control, self.CLOSE_CTRL_KEY) return True elif keyval == Gdk.KEY_w: # CTRL + w # CTRL + w removes latest word before sursor when User uses emacs # theme if not Gtk.Settings.get_default().get_property( 'gtk-key-theme-name') == 'Emacs': self.remove_tab(control, self.CLOSE_CTRL_KEY) return True elif keyval in (Gdk.KEY_Page_Up, Gdk.KEY_Page_Down): # CTRL + PageUp | PageDown # Create event and send it to notebook event = Gdk.Event.new(Gdk.EventType.KEY_PRESS) event.window = self.window.get_window() event.time = int(time.time()) event.state = Gdk.ModifierType.CONTROL_MASK event.keyval = int(keyval) self.notebook.event(event) return True if modifier & Gdk.ModifierType.SHIFT_MASK: # CTRL + SHIFT if control.type_id == message_control.TYPE_GC and \ keyval == Gdk.KEY_n: # CTRL + SHIFT + n self.window.lookup_action( 'change-nick-%s' % control.control_id).activate() return True # MOD1 (ALT) mask elif modifier & Gdk.ModifierType.MOD1_MASK: # Tab switch bindings if keyval == Gdk.KEY_Right: # ALT + RIGHT new = self.notebook.get_current_page() + 1 if new >= self.notebook.get_n_pages(): new = 0 self.notebook.set_current_page(new) return True elif keyval == Gdk.KEY_Left: # ALT + LEFT new = self.notebook.get_current_page() - 1 if new < 0: new = self.notebook.get_n_pages() - 1 self.notebook.set_current_page(new) return True elif chr(keyval) in st: # ALT + 1,2,3.. self.notebook.set_current_page(st.index(chr(keyval))) return True elif keyval == Gdk.KEY_m: # ALT + M show emoticons menu control.emoticons_button.get_popover().show() return True elif control.type_id == message_control.TYPE_GC and \ keyval == Gdk.KEY_t: # ALT + t self.window.lookup_action( 'change-subject-%s' % control.control_id).activate() return True # Close tab bindings elif keyval == Gdk.KEY_Escape and \ app.config.get('escape_key_closes'): # Escape self.remove_tab(control, self.CLOSE_ESC) return True def _on_close_button_clicked(self, button, control): """ When close button is pressed: close a tab """ self.remove_tab(control, self.CLOSE_CLOSE_BUTTON) def show_icon(self): window_mode = app.interface.msg_win_mgr.mode icon = 'org.gajim.Gajim' if window_mode in (MessageWindowMgr.ONE_MSG_WINDOW_PERTYPE, MessageWindowMgr.ONE_MSG_WINDOW_NEVER): if self.type_ == 'gc': icon = gtkgui_helpers.get_iconset_name_for('muc-active') self.window.set_icon_name(icon) def show_title(self, urgent=True, control=None): """ Redraw the window's title """ if not control: control = self.get_active_control() if not control: # No more control in this window return unread = 0 for ctrl in self.controls(): if ctrl.type_id == message_control.TYPE_GC and not \ app.config.get('notify_on_all_muc_messages') and not \ app.config.get_per('rooms', ctrl.room_jid, 'notify_on_all_messages') and not ctrl.attention_flag: # count only pm messages unread += ctrl.get_nb_unread_pm() continue unread += ctrl.get_nb_unread() unread_str = '' if unread > 1: unread_str = '[' + str(unread) + '] ' elif unread == 1: unread_str = '* ' else: urgent = False if control.type_id == message_control.TYPE_GC: name = control.room_jid.split('@')[0] urgent = control.attention_flag or \ app.config.get('notify_on_all_muc_messages') or \ app.config.get_per('rooms', control.room_jid, 'notify_on_all_messages') else: name = control.contact.get_shown_name() if control.resource: name += '/' + control.resource window_mode = app.interface.msg_win_mgr.mode if window_mode == MessageWindowMgr.ONE_MSG_WINDOW_PERTYPE: # Show the plural form since number of tabs > 1 if self.type_ == 'chat': label = Q_('?Noun:Chats') elif self.type_ == 'gc': label = _('Groupchats') else: label = _('Private Chats') elif window_mode == MessageWindowMgr.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: label = None elif self.get_num_controls() == 1: label = name else: label = _('Messages') title = 'Gajim' if label: title = '%s - %s' % (label, title) if window_mode == MessageWindowMgr.ONE_MSG_WINDOW_PERACCT: title = title + ": " + control.account self.window.set_title(unread_str + title) if urgent: gtkgui_helpers.set_unset_urgency_hint(self.window, unread) else: gtkgui_helpers.set_unset_urgency_hint(self.window, False) def set_active_tab(self, ctrl): ctrl_page = self.notebook.page_num(ctrl.widget) self.notebook.set_current_page(ctrl_page) self.window.present() GLib.idle_add(ctrl.msg_textview.grab_focus) def remove_tab(self, ctrl, method, reason = None, force = False): """ Reason is only for gc (offline status message) if force is True, do not ask any confirmation """ def close(ctrl): if reason is not None: # We are leaving gc with a status message ctrl.shutdown(reason) else: # We are leaving gc without status message or it's a chat ctrl.shutdown() # Update external state app.events.remove_events(ctrl.account, ctrl.get_full_jid, types = ['printed_msg', 'chat', 'gc_msg']) fjid = ctrl.get_full_jid() jid = app.get_jid_without_resource(fjid) fctrl = self.get_control(fjid, ctrl.account) bctrl = self.get_control(jid, ctrl.account) # keep last_message_time around unless this was our last control with # that jid if not fctrl and not bctrl and \ fjid in app.last_message_time[ctrl.account]: del app.last_message_time[ctrl.account][fjid] self.notebook.remove_page(self.notebook.page_num(ctrl.widget)) del self._controls[ctrl.account][fjid] if len(self._controls[ctrl.account]) == 0: del self._controls[ctrl.account] self.check_tabs() self.show_title() def on_yes(ctrl): close(ctrl) def on_no(ctrl): return def on_minimize(ctrl): if method != self.CLOSE_COMMAND: ctrl.minimize() self.check_tabs() return close(ctrl) # Shutdown the MessageControl if force: close(ctrl) else: ctrl.allow_shutdown(method, on_yes, on_no, on_minimize) def check_tabs(self): if self.parent_paned: # Do nothing in single window mode pass elif self.get_num_controls() == 0: # These are not called when the window is destroyed like this, fake it app.interface.msg_win_mgr._on_window_delete(self.window, None) app.interface.msg_win_mgr._on_window_destroy(self.window) # dnd clean up self.notebook.drag_dest_unset() if self.parent_paned: # Don't close parent window, just remove the child child = self.parent_paned.get_child2() self.parent_paned.remove(child) self.window.lookup_action('show-roster').set_enabled(False) else: self.window.destroy() return # don't show_title, we are dead elif self.get_num_controls() == 1: # we are going from two tabs to one window_mode = app.interface.msg_win_mgr.mode show_tabs_if_one_tab = app.config.get('tabs_always_visible') or \ window_mode == MessageWindowMgr.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER self.notebook.set_show_tabs(show_tabs_if_one_tab) def redraw_tab(self, ctrl, chatstate=None): tab = self.notebook.get_tab_label(ctrl.widget) if not tab: return hbox = tab.get_children()[0] status_img = hbox.get_children()[0] nick_label = hbox.get_children()[1] # Optionally hide close button close_button = hbox.get_children()[2] if app.config.get('tabs_close_button'): close_button.show() else: close_button.hide() # Update nick nick_label.set_max_width_chars(10) if isinstance(ctrl, ChatControl): tab_label_str = ctrl.get_tab_label() # Set Label Color class_name = 'state_{}_color'.format(chatstate) gtkgui_helpers.add_css_class(nick_label, class_name) else: tab_label_str, color = ctrl.get_tab_label(chatstate) # Set Label Color if color == 'active': gtkgui_helpers.add_css_class(nick_label, None) elif color is not None: gtkgui_helpers.add_css_class(nick_label, color) nick_label.set_markup(tab_label_str) tab_img = ctrl.get_tab_image() if tab_img: if isinstance(tab_img, Gtk.Image): if tab_img.get_storage_type() == Gtk.ImageType.ANIMATION: status_img.set_from_animation(tab_img.get_animation()) else: status_img.set_from_pixbuf(tab_img.get_pixbuf()) elif isinstance(tab_img, str): status_img.set_from_icon_name(tab_img, Gtk.IconSize.MENU) else: status_img.set_from_surface(tab_img) self.show_icon() def repaint_themed_widgets(self): """ Repaint controls in the window with theme color """ # iterate through controls and repaint for ctrl in self.controls(): ctrl.repaint_themed_widgets() def _widget_to_control(self, widget): for ctrl in self.controls(): if ctrl.widget == widget: return ctrl return None def get_active_control(self): notebook = self.notebook active_widget = notebook.get_nth_page(notebook.get_current_page()) return self._widget_to_control(active_widget) def get_active_contact(self): ctrl = self.get_active_control() if ctrl: return ctrl.contact return None def get_active_jid(self): contact = self.get_active_contact() if contact: return contact.jid return None def is_active(self): return self.window.is_active() def get_origin(self): return self.window.get_window().get_origin() def get_control(self, key, acct): """ Return the MessageControl for jid or n, where n is a notebook page index. When key is an int index acct may be None """ if isinstance(key, str): jid = key try: return self._controls[acct][jid] except Exception: return None else: page_num = key notebook = self.notebook if page_num is None: page_num = notebook.get_current_page() nth_child = notebook.get_nth_page(page_num) return self._widget_to_control(nth_child) def has_control(self, jid, acct): return (acct in self._controls and jid in self._controls[acct]) def change_key(self, old_jid, new_jid, acct): """ Change the JID key of a control """ try: # Check if controls exists ctrl = self._controls[acct][old_jid] except KeyError: return if new_jid in self._controls[acct]: self.remove_tab(self._controls[acct][new_jid], self.CLOSE_CLOSE_BUTTON, force=True) self._controls[acct][new_jid] = ctrl del self._controls[acct][old_jid] if old_jid in app.last_message_time[acct]: app.last_message_time[acct][new_jid] = \ app.last_message_time[acct][old_jid] del app.last_message_time[acct][old_jid] def controls(self): for jid_dict in list(self._controls.values()): for ctrl in list(jid_dict.values()): yield ctrl def get_nb_controls(self): return sum(len(jid_dict) for jid_dict in self._controls.values()) def move_to_next_unread_tab(self, forward): ind = self.notebook.get_current_page() current = ind found = False first_composing_ind = -1 # id of first composing ctrl to switch to # if no others controls have awaiting events # loop until finding an unread tab or having done a complete cycle while True: if forward == True: # look for the first unread tab on the right ind = ind + 1 if ind >= self.notebook.get_n_pages(): ind = 0 else: # look for the first unread tab on the right ind = ind - 1 if ind < 0: ind = self.notebook.get_n_pages() - 1 ctrl = self.get_control(ind, None) if ctrl.get_nb_unread() > 0: found = True break # found elif app.config.get('ctrl_tab_go_to_next_composing') : # Search for a composing contact contact = ctrl.contact if first_composing_ind == -1 and contact.chatstate == 'composing': # If no composing contact found yet, check if this one is composing first_composing_ind = ind if ind == current: break # a complete cycle without finding an unread tab if found: self.notebook.set_current_page(ind) elif first_composing_ind != -1: self.notebook.set_current_page(first_composing_ind) else: # not found and nobody composing if forward: # CTRL + TAB if current < (self.notebook.get_n_pages() - 1): self.notebook.next_page() else: # traverse for ever (eg. don't stop at last tab) self.notebook.set_current_page(0) else: # CTRL + SHIFT + TAB if current > 0: self.notebook.prev_page() else: # traverse for ever (eg. don't stop at first tab) self.notebook.set_current_page( self.notebook.get_n_pages() - 1) def popup_menu(self, event): menu = self.get_active_control().prepare_context_menu() if menu is None: return # show the menu menu.attach_to_widget(app.interface.roster.window, None) menu.show_all() menu.popup(None, None, None, None, event.button, event.time) def _on_notebook_switch_page(self, notebook, page, page_num): old_no = notebook.get_current_page() if old_no >= 0: old_ctrl = self._widget_to_control(notebook.get_nth_page(old_no)) old_ctrl.set_control_active(False) new_ctrl = self._widget_to_control(notebook.get_nth_page(page_num)) new_ctrl.set_control_active(True) self.show_title(control = new_ctrl) control = self.get_active_control() if isinstance(control, ChatControlBase): control.msg_textview.grab_focus() def _on_notebook_key_press(self, widget, event): # when tab itself is selected, # make sure <- and -> are allowed for navigating between tabs if event.keyval in (Gdk.KEY_Left, Gdk.KEY_Right): return False control = self.get_active_control() if event.get_state() & Gdk.ModifierType.SHIFT_MASK: # CTRL + SHIFT + TAB if event.get_state() & Gdk.ModifierType.CONTROL_MASK and \ event.keyval == Gdk.KEY_ISO_Left_Tab: self.move_to_next_unread_tab(False) return True # SHIFT + PAGE_[UP|DOWN]: send to conv_textview elif event.keyval in (Gdk.KEY_Page_Down, Gdk.KEY_Page_Up): control.conv_textview.tv.event(event) return True elif event.get_state() & Gdk.ModifierType.CONTROL_MASK: if event.keyval == Gdk.KEY_Tab: # CTRL + TAB self.move_to_next_unread_tab(True) return True # Ctrl+PageUP / DOWN has to be handled by notebook elif event.keyval == Gdk.KEY_Page_Down: self.move_to_next_unread_tab(True) return True elif event.keyval == Gdk.KEY_Page_Up: self.move_to_next_unread_tab(False) return True if event.keyval in (Gdk.KEY_Shift_L, Gdk.KEY_Shift_R, Gdk.KEY_Control_L, Gdk.KEY_Control_R, Gdk.KEY_Caps_Lock, Gdk.KEY_Shift_Lock, Gdk.KEY_Meta_L, Gdk.KEY_Meta_R, Gdk.KEY_Alt_L, Gdk.KEY_Alt_R, Gdk.KEY_Super_L, Gdk.KEY_Super_R, Gdk.KEY_Hyper_L, Gdk.KEY_Hyper_R): return True if isinstance(control, ChatControlBase): # we forwarded it to message textview control.msg_textview.remove_placeholder() control.msg_textview.event(event) control.msg_textview.grab_focus() def get_tab_at_xy(self, x, y): """ Return the tab under xy and if its nearer from left or right side of the tab """ page_num = -1 to_right = False horiz = self.notebook.get_tab_pos() == Gtk.PositionType.TOP or \ self.notebook.get_tab_pos() == Gtk.PositionType.BOTTOM for i in range(self.notebook.get_n_pages()): page = self.notebook.get_nth_page(i) tab = self.notebook.get_tab_label(page) tab_alloc = tab.get_allocation() if horiz: if (x >= tab_alloc.x) and \ (x <= (tab_alloc.x + tab_alloc.width)): page_num = i if x >= tab_alloc.x + (tab_alloc.width / 2.0): to_right = True break else: if (y >= tab_alloc.y) and \ (y <= (tab_alloc.y + tab_alloc.height)): page_num = i if y > tab_alloc.y + (tab_alloc.height / 2.0): to_right = True break return (page_num, to_right) def find_page_num_according_to_tab_label(self, tab_label): """ Find the page num of the tab label """ page_num = -1 for i in range(self.notebook.get_n_pages()): page = self.notebook.get_nth_page(i) tab = self.notebook.get_tab_label(page) if tab == tab_label: page_num = i break return page_num ################################################################################ class MessageWindowMgr(GObject.GObject): """ A manager and factory for MessageWindow objects """ __gsignals__ = { 'window-delete': (GObject.SignalFlags.RUN_LAST, None, (object,)), } # These constants map to common.config.opt_one_window_types indices ( ONE_MSG_WINDOW_NEVER, ONE_MSG_WINDOW_ALWAYS, ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER, ONE_MSG_WINDOW_PERACCT, ONE_MSG_WINDOW_PERTYPE, ) = range(5) # A key constant for the main window in ONE_MSG_WINDOW_ALWAYS mode MAIN_WIN = 'main' # A key constant for the main window in ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER mode ROSTER_MAIN_WIN = 'roster' def __init__(self, parent_window, parent_paned): """ A dictionary of windows; the key depends on the config: ONE_MSG_WINDOW_NEVER: The key is the contact JID ONE_MSG_WINDOW_ALWAYS: The key is MessageWindowMgr.MAIN_WIN ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: The key is MessageWindowMgr.MAIN_WIN ONE_MSG_WINDOW_PERACCT: The key is the account name ONE_MSG_WINDOW_PERTYPE: The key is a message type constant """ GObject.GObject.__init__(self) self._windows = {} # Map the mode to a int constant for frequent compares mode = app.config.get('one_message_window') self.mode = common.config.opt_one_window_types.index(mode) self.parent_win = parent_window self.parent_paned = parent_paned def change_account_name(self, old_name, new_name): for win in self.windows(): win.change_account_name(old_name, new_name) def _new_window(self, acct, type_): parent_win = None parent_paned = None if self.mode == self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: parent_win = self.parent_win parent_paned = self.parent_paned win = MessageWindow(acct, type_, parent_win, parent_paned) # we track the lifetime of this window win.window.connect('delete-event', self._on_window_delete) win.window.connect('destroy', self._on_window_destroy) return win def _gtk_win_to_msg_win(self, gtk_win): for w in self.windows(): if w.window == gtk_win: return w return None def get_window(self, jid, acct): for win in self.windows(): if win.has_control(jid, acct): return win return None def has_window(self, jid, acct): return self.get_window(jid, acct) is not None def one_window_opened(self, contact=None, acct=None, type_=None): try: return \ self._windows[self._mode_to_key(contact, acct, type_)] is not None except KeyError: return False def _resize_window(self, win, acct, type_): """ Resizes window according to config settings """ hpaned = app.config.get('roster_hpaned_position') if self.mode in (self.ONE_MSG_WINDOW_ALWAYS, self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER): size = (app.config.get('msgwin-width'), app.config.get('msgwin-height')) if self.mode == self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: # Need to add the size of the now visible paned handle, otherwise # the saved width of the message window decreases by this amount handle_size = win.parent_paned.style_get_property('handle-size') size = (hpaned + size[0] + handle_size, size[1]) elif self.mode == self.ONE_MSG_WINDOW_PERACCT: size = (app.config.get_per('accounts', acct, 'msgwin-width'), app.config.get_per('accounts', acct, 'msgwin-height')) elif self.mode in (self.ONE_MSG_WINDOW_NEVER, self.ONE_MSG_WINDOW_PERTYPE): opt_width = type_ + '-msgwin-width' opt_height = type_ + '-msgwin-height' size = (app.config.get(opt_width), app.config.get(opt_height)) else: return win.resize(size[0], size[1]) if win.parent_paned: win.parent_paned.set_position(hpaned) def _position_window(self, win, acct, type_): """ Moves window according to config settings """ if (self.mode in [self.ONE_MSG_WINDOW_NEVER, self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER]): return if self.mode == self.ONE_MSG_WINDOW_ALWAYS: pos = (app.config.get('msgwin-x-position'), app.config.get('msgwin-y-position')) elif self.mode == self.ONE_MSG_WINDOW_PERACCT: pos = (app.config.get_per('accounts', acct, 'msgwin-x-position'), app.config.get_per('accounts', acct, 'msgwin-y-position')) elif self.mode == self.ONE_MSG_WINDOW_PERTYPE: pos = (app.config.get(type_ + '-msgwin-x-position'), app.config.get(type_ + '-msgwin-y-position')) else: return gtkgui_helpers.move_window(win.window, pos[0], pos[1]) def _mode_to_key(self, contact, acct, type_, resource = None): if self.mode == self.ONE_MSG_WINDOW_NEVER: key = acct + contact.jid if resource: key += '/' + resource return key elif self.mode == self.ONE_MSG_WINDOW_ALWAYS: return self.MAIN_WIN elif self.mode == self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: return self.ROSTER_MAIN_WIN elif self.mode == self.ONE_MSG_WINDOW_PERACCT: return acct elif self.mode == self.ONE_MSG_WINDOW_PERTYPE: return type_ def create_window(self, contact, acct, type_, resource = None): win_acct = None win_type = None win_role = None # X11 window role win_key = self._mode_to_key(contact, acct, type_, resource) if self.mode == self.ONE_MSG_WINDOW_PERACCT: win_acct = acct win_role = acct elif self.mode == self.ONE_MSG_WINDOW_PERTYPE: win_type = type_ win_role = type_ elif self.mode == self.ONE_MSG_WINDOW_NEVER: win_type = type_ win_role = contact.jid elif self.mode == self.ONE_MSG_WINDOW_ALWAYS: win_role = 'messages' win = None try: win = self._windows[win_key] except KeyError: win = self._new_window(win_acct, win_type) if win_role: win.window.set_role(win_role) # Position and size window based on saved state and window mode if not self.one_window_opened(contact, acct, type_): if app.config.get('msgwin-max-state'): win.window.maximize() else: self._resize_window(win, acct, type_) self._position_window(win, acct, type_) self._windows[win_key] = win return win def change_key(self, old_jid, new_jid, acct): win = self.get_window(old_jid, acct) if self.mode == self.ONE_MSG_WINDOW_NEVER: old_key = acct + old_jid if old_jid not in self._windows: return new_key = acct + new_jid self._windows[new_key] = self._windows[old_key] del self._windows[old_key] win.change_key(old_jid, new_jid, acct) def _on_window_delete(self, win, event): self.save_state(self._gtk_win_to_msg_win(win)) app.interface.save_config() return False def _on_window_destroy(self, win): for k in self._windows.keys(): if self._windows[k].window == win: self.emit('window-delete', self._windows[k]) del self._windows[k] return def get_control(self, jid, acct): """ Amongst all windows, return the MessageControl for jid """ win = self.get_window(jid, acct) if win: return win.get_control(jid, acct) return None def search_control(self, jid, account, resource=None): """ Search windows with this policy: 1. try to find already opened tab for resource 2. find the tab for this jid with ctrl.resource not set 3. there is none """ fjid = jid if resource: fjid += '/' + resource ctrl = self.get_control(fjid, account) if ctrl: return ctrl win = self.get_window(jid, account) if win: ctrl = win.get_control(jid, account) if not ctrl.resource and ctrl.type_id != message_control.TYPE_GC: return ctrl return None def get_gc_control(self, jid, acct): """ Same as get_control. Was briefly required, is not any more. May be useful some day in the future? """ ctrl = self.get_control(jid, acct) if ctrl and ctrl.type_id == message_control.TYPE_GC: return ctrl return None def get_controls(self, type_=None, acct=None): ctrls = [] for c in self.controls(): if acct and c.account != acct: continue if not type_ or c.type_id == type_: ctrls.append(c) return ctrls def windows(self): for w in list(self._windows.values()): yield w def controls(self): for w in self._windows.values(): for c in w.controls(): yield c def shutdown(self, width_adjust=0): for w in self.windows(): self.save_state(w, width_adjust) if not w.parent_paned: w.window.hide() w.window.destroy() app.interface.save_config() def save_state(self, msg_win, width_adjust=0): # Save window size and position max_win_key = 'msgwin-max-state' pos_x_key = 'msgwin-x-position' pos_y_key = 'msgwin-y-position' size_width_key = 'msgwin-width' size_height_key = 'msgwin-height' acct = None x, y = msg_win.window.get_position() width, height = msg_win.window.get_size() # If any of these values seem bogus don't update. if x < 0 or y < 0 or width < 0 or height < 0: return elif self.mode == self.ONE_MSG_WINDOW_PERACCT: acct = msg_win.account elif self.mode == self.ONE_MSG_WINDOW_PERTYPE: type_ = msg_win.type_ pos_x_key = type_ + '-msgwin-x-position' pos_y_key = type_ + '-msgwin-y-position' size_width_key = type_ + '-msgwin-width' size_height_key = type_ + '-msgwin-height' elif self.mode == self.ONE_MSG_WINDOW_NEVER: type_ = msg_win.type_ size_width_key = type_ + '-msgwin-width' size_height_key = type_ + '-msgwin-height' elif self.mode == self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: # Ignore any hpaned width width = msg_win.notebook.get_allocation().width if acct: app.config.set_per('accounts', acct, size_width_key, width) app.config.set_per('accounts', acct, size_height_key, height) if self.mode != self.ONE_MSG_WINDOW_NEVER: app.config.set_per('accounts', acct, pos_x_key, x) app.config.set_per('accounts', acct, pos_y_key, y) else: win_maximized = msg_win.window.get_window().get_state() == \ Gdk.WindowState.MAXIMIZED app.config.set(max_win_key, win_maximized) width += width_adjust app.config.set(size_width_key, width) app.config.set(size_height_key, height) if self.mode != self.ONE_MSG_WINDOW_NEVER: app.config.set(pos_x_key, x) app.config.set(pos_y_key, y) def reconfig(self): for w in self.windows(): self.save_state(w) mode = app.config.get('one_message_window') if self.mode == common.config.opt_one_window_types.index(mode): # No change return self.mode = common.config.opt_one_window_types.index(mode) controls = [] for w in self.windows(): # Note, we are taking care not to hide/delete the roster window when the # MessageWindow is embedded. if not w.parent_paned: w.window.hide() else: # Stash current size so it can be restored if the MessageWindow # is not longer embedded roster_width = w.parent_paned.get_position() app.config.set('roster_width', roster_width) while w.notebook.get_n_pages(): page = w.notebook.get_nth_page(0) ctrl = w._widget_to_control(page) w.notebook.remove_page(0) page.unparent() controls.append(ctrl) # Must clear _controls to prevent MessageControl.shutdown calls w._controls = {} if not w.parent_paned: w.window.destroy() else: # Don't close parent window, just remove the child child = w.parent_paned.get_child2() w.parent_paned.remove(child) self.parent_win.lookup_action('show-roster').set_enabled(False) gtkgui_helpers.resize_window(w.window, app.config.get('roster_width'), app.config.get('roster_height')) self._windows = {} for ctrl in controls: mw = self.get_window(ctrl.contact.jid, ctrl.account) if not mw: mw = self.create_window(ctrl.contact, ctrl.account, ctrl.type_id) ctrl.parent_win = mw ctrl.add_actions() ctrl.update_actions() mw.new_tab(ctrl) def save_opened_controls(self): if not app.config.get('remember_opened_chat_controls'): return chat_controls = {} for acct in app.connections: chat_controls[acct] = [] for ctrl in self.get_controls(type_=message_control.TYPE_CHAT): acct = ctrl.account if ctrl.contact.jid not in chat_controls[acct]: chat_controls[acct].append(ctrl.contact.jid) for acct in app.connections: app.config.set_per('accounts', acct, 'opened_chat_controls', ','.join(chat_controls[acct])) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/music_track_listener.py000066400000000000000000000132041326020644600265550ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## gajim/music_track_listener.py ## ## Copyright (C) 2006 Gustavo Carneiro ## Nikos Kouremenos ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2008 Jean-Marie Traissard ## Jonathan Schleifer ## Stephan Erb ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import logging from gi.repository import GObject from gi.repository import Gio, GLib log = logging.getLogger('gajim.music_track_listener') def _get_music_players(): players = [ 'org.mpris.MediaPlayer2.audacious', 'org.mpris.MediaPlayer2.bmp', 'org.mpris.MediaPlayer2.clementine', 'org.mpris.MediaPlayer2.GnomeMusic', 'org.mpris.MediaPlayer2.quodlibet', 'org.mpris.MediaPlayer2.rhythmbox', 'org.mpris.MediaPlayer2.vlc', 'org.mpris.MediaPlayer2.xmms2' ] return players class MusicTrackInfo(object): __slots__ = ['title', 'album', 'artist', 'duration', 'track_number', 'paused'] class MusicTrackListener(GObject.GObject): __gsignals__ = { 'music-track-changed': (GObject.SignalFlags.RUN_LAST, None, (object,)), } _instance = None @classmethod def get(cls): if cls._instance is None: cls._instance = cls() return cls._instance def __init__(self): super(MusicTrackListener, self).__init__() self.con = {} players = _get_music_players() for name in players: Gio.bus_watch_name( Gio.BusType.SESSION, name, Gio.BusNameWatcherFlags.NONE, self._appeared, self._vanished) def _appeared(self, connection, name, name_owner, *user_data): '''Set up a listener for music player signals''' log.info('%s appeared', name) self.con[name] = connection.signal_subscribe( name, 'org.freedesktop.DBus.Properties', 'PropertiesChanged', '/org/mpris/MediaPlayer2', None, Gio.DBusSignalFlags.NONE, self._signal_received, name) info = self.get_playing_track(name) if info is not None: self.emit('music-track-changed', info) def _vanished(self, connection, name, *user_data): log.info('%s vanished', name) if name in self.con: connection.signal_unsubscribe( self.con[name]) self.con.pop(name) self.emit('music-track-changed', None) def _signal_received(self, connection, sender_name, object_path, interface_name, signal_name, parameters, *user_data): '''Signal handler for PropertiesChanged event''' if 'PlaybackStatus' not in parameters[1]: return log.info('Signal received: %s - %s', interface_name, parameters) info = self.get_playing_track(user_data[0]) self.emit('music-track-changed', info) def _properties_extract(self, properties): meta = properties.get('Metadata') if meta is None or not meta: return None info = MusicTrackInfo() info.title = meta.get('xesam:title') info.album = meta.get('xesam:album') artist = meta.get('xesam:artist') if artist is not None and len(artist): info.artist = artist[0] else: info.artist = None info.duration = float(meta.get('mpris:length', 0)) info.track_number = meta.get('xesam:trackNumber', 0) status = properties.get('PlaybackStatus') info.paused = status is not None and status == 'Paused' return info def get_playing_track(self, name): '''Return a MusicTrackInfo for the currently playing song, or None if no song is playing''' proxy = Gio.DBusProxy.new_for_bus_sync( Gio.BusType.SESSION, Gio.DBusProxyFlags.NONE, None, name, '/org/mpris/MediaPlayer2', 'org.freedesktop.DBus.Properties', None) try: result = proxy.call_sync( "GetAll", GLib.Variant('(s)', ('org.mpris.MediaPlayer2.Player',)), Gio.DBusCallFlags.NONE, -1, None) except GLib.Error as e: if e.domain == 'g-dbus-error-quark': log.debug("Could not enable music listener: %s", e.message) return None else: raise else: info = self._properties_extract(result[0]) return info # here we test :) if __name__ == '__main__': def music_track_change_cb(listener, music_track_info): if music_track_info is None or music_track_info.paused: print('Stop!') else: print(music_track_info.title) listener = MusicTrackListener.get() listener.connect('music-track-changed', music_track_change_cb) GObject.MainLoop().run() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/negotiation.py000066400000000000000000000056271326020644600246760ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/negotiation.py ## ## Copyright (C) 2007-2014 Yann Leboulanger ## Copyright (C) 2007-2008 Brendan Taylor ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gajim import gtkgui_helpers from gajim import dataforms_widget from gajim.common import dataforms from gajim.common import app import nbxmpp def describe_features(features): """ A human-readable description of the features that have been negotiated """ if features['logging'] == 'may': return _('- messages will be logged') elif features['logging'] == 'mustnot': return _('- messages will not be logged') class FeatureNegotiationWindow: def __init__(self, account, jid, session, form): self.account = account self.jid = jid self.form = form self.session = session self.xml = gtkgui_helpers.get_gtk_builder('data_form_window.ui', 'data_form_window') self.window = self.xml.get_object('data_form_window') config_vbox = self.xml.get_object('config_vbox') dataform = dataforms.ExtendForm(node = self.form) self.data_form_widget = dataforms_widget.DataFormWidget(dataform) self.data_form_widget.show() config_vbox.pack_start(self.data_form_widget, True, True, 0) self.xml.connect_signals(self) self.window.show_all() def on_ok_button_clicked(self, widget): acceptance = nbxmpp.Message(self.jid) acceptance.setThread(self.session.thread_id) feature = acceptance.NT.feature feature.setNamespace(nbxmpp.NS_FEATURE) form = self.data_form_widget.data_form form.setAttr('type', 'submit') feature.addChild(node=form) app.connections[self.account].send_stanza(acceptance) self.window.destroy() def on_cancel_button_clicked(self, widget): rejection = nbxmpp.Message(self.jid) rejection.setThread(self.session.thread_id) feature = rejection.NT.feature feature.setNamespace(nbxmpp.NS_FEATURE) x = nbxmpp.DataForm(typ='submit') x.addChild(node=nbxmpp.DataField('FORM_TYPE', value='urn:xmpp:ssn')) x.addChild(node=nbxmpp.DataField('accept', value='false', typ='boolean')) feature.addChild(node=x) app.connections[self.account].send_stanza(rejection) self.window.destroy() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/notify.py000066400000000000000000000130771326020644600236640ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/notify.py ## ## Copyright (C) 2005 Sebastian Estienne ## Copyright (C) 2005-2006 Andrew Sayman ## Copyright (C) 2005-2007 Nikos Kouremenos ## Copyright (C) 2005-2014 Yann Leboulanger ## Copyright (C) 2006 Travis Shirk ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2007 Julien Pivotto ## Stephan Erb ## Copyright (C) 2008 Brendan Taylor ## Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import sys from gajim.dialogs import PopupNotificationWindow from gi.repository import GLib from gi.repository import Gio from gajim import gtkgui_helpers from gajim.common import app from gajim.common import helpers from gajim.common import ged def get_show_in_roster(event, account, contact, session=None): """ Return True if this event must be shown in roster, else False """ if event == 'gc_message_received': return True if event == 'message_received': if session and session.control: return False return True def get_show_in_systray(event, account, contact, type_=None): """ Return True if this event must be shown in systray, else False """ if type_ == 'printed_gc_msg' and not app.config.get( 'notify_on_all_muc_messages') and not app.config.get_per('rooms', contact.jid, 'notify_on_all_messages'): # it's not an highlighted message, don't show in systray return False return app.config.get('trayicon_notification_on_events') def popup(event_type, jid, account, type_='', path_to_image=None, title=None, text=None, timeout=-1): """ Notify a user of an event using GNotification and GApplication under linux, the older style PopupNotificationWindow method under windows """ # default image if not path_to_image: path_to_image = gtkgui_helpers.get_icon_path('gajim-chat_msg_recv', 48) if timeout < 0: timeout = app.config.get('notification_timeout') if sys.platform == 'win32': instance = PopupNotificationWindow(event_type, jid, account, type_, path_to_image, title, text, timeout) app.interface.roster.popup_notification_windows.append(instance) return # use GNotification # TODO: Move to standard GTK+ icons here. icon = Gio.FileIcon.new(Gio.File.new_for_path(path_to_image)) notification = Gio.Notification() if title is not None: notification.set_title(title) if text is not None: notification.set_body(text) notification.set_icon(icon) notif_id = None if event_type in (_('Contact Signed In'), _('Contact Signed Out'), _('New Message'), _('New Single Message'), _('New Private Message'), _('Contact Changed Status'), _('File Transfer Request'), _('File Transfer Error'), _('File Transfer Completed'), _('File Transfer Stopped'), _('Groupchat Invitation'), _('Connection Failed'), _('Subscription request'), _('Unsubscribed')): # Create Variant Dict dict_ = {'account': GLib.Variant('s', account), 'jid': GLib.Variant('s', jid), 'type_': GLib.Variant('s', type_)} variant_dict = GLib.Variant('a{sv}', dict_) action = 'app.{}-open-event'.format(account) notification.add_button_with_target(_('Open'), action, variant_dict) notification.set_default_action_and_target(action, variant_dict) if event_type in (_('New Message'), _('New Single Message'), _('New Private Message')): # Only one notification per JID notif_id = jid notification.set_priority(Gio.NotificationPriority.NORMAL) notification.set_urgent(False) app.app.send_notification(notif_id, notification) class Notification: """ Handle notifications """ def __init__(self): app.ged.register_event_handler('notification', ged.GUI2, self._nec_notification) def _nec_notification(self, obj): if obj.do_popup: if obj.popup_image: icon_path = gtkgui_helpers.get_icon_path(obj.popup_image, 48) if icon_path: image_path = icon_path elif obj.popup_image_path: image_path = obj.popup_image_path else: image_path = '' popup(obj.popup_event_type, obj.jid, obj.conn.name, obj.popup_msg_type, path_to_image=image_path, title=obj.popup_title, text=obj.popup_text, timeout=obj.popup_timeout) if obj.do_sound: if obj.sound_file: helpers.play_sound_file(obj.sound_file) elif obj.sound_event: helpers.play_sound(obj.sound_event) if obj.do_command: try: helpers.exec_command(obj.command, use_shell=True) except Exception: pass gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/options_dialog.py000066400000000000000000000463551326020644600253730ustar00rootroot00000000000000from gi.repository import Gtk, GLib, Gdk, GObject from gajim.common import app from gajim.common import passwords from gajim import gtkgui_helpers from gajim.common.const import OptionKind, OptionType from gajim.common.exceptions import GajimGeneralException from gajim import dialogs class OptionsDialog(Gtk.ApplicationWindow): def __init__(self, parent, title, flags, options, account, extend=None): Gtk.ApplicationWindow.__init__(self) self.set_application(app.app) self.set_show_menubar(False) self.set_title(title) self.set_transient_for(parent) self.set_resizable(False) self.set_default_size(250, -1) self.set_type_hint(Gdk.WindowTypeHint.DIALOG) self.account = account if flags == Gtk.DialogFlags.MODAL: self.set_modal(True) elif flags == Gtk.DialogFlags.DESTROY_WITH_PARENT: self.set_destroy_with_parent(True) self.listbox = OptionsBox(account, extend) self.listbox.set_hexpand(True) self.listbox.set_selection_mode(Gtk.SelectionMode.NONE) for option in options: self.listbox.add_option(option) self.listbox.update_states() self.add(self.listbox) self.show_all() self.listbox.connect('row-activated', self.on_row_activated) self.connect('key-press-event', self.on_key_press) def on_key_press(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.destroy() @staticmethod def on_row_activated(listbox, row): row.get_child().on_row_activated() def get_option(self, name): return self.listbox.get_option(name) class OptionsBox(Gtk.ListBox): def __init__(self, account, extend=None): Gtk.ListBox.__init__(self) self.set_name('OptionsBox') self.account = account self.named_options = {} self.map = { OptionKind.SWITCH: SwitchOption, OptionKind.SPIN: SpinOption, OptionKind.DIALOG: DialogOption, OptionKind.ENTRY: EntryOption, OptionKind.ACTION: ActionOption, OptionKind.LOGIN: LoginOption, OptionKind.FILECHOOSER: FileChooserOption, OptionKind.CALLBACK: CallbackOption, OptionKind.PROXY: ProxyComboOption, OptionKind.PRIORITY: PriorityOption, OptionKind.HOSTNAME: CutstomHostnameOption, OptionKind.CHANGEPASSWORD: ChangePasswordOption, OptionKind.GPG: GPGOption, } if extend is not None: for option, callback in extend: self.map[option] = callback def add_option(self, option): if option.props is not None: listitem = self.map[option.kind]( self.account, *option[1:-1], **option.props) else: listitem = self.map[option.kind](self.account, *option[1:-1]) listitem.connect('notify::option-value', self.on_option_changed) if option.name is not None: self.named_options[option.name] = listitem self.add(listitem) def get_option(self, name): return self.named_options[name] def update_states(self): values = [] values.append((None, None)) for row in self.get_children(): name = row.get_child().name if name is None: continue value = row.get_child().get_property('option-value') values.append((name, value)) for name, value in values: for row in self.get_children(): row.get_child().set_activatable(name, value) def on_option_changed(self, widget, *args): value = widget.get_property('option-value') for row in self.get_children(): row.get_child().set_activatable(widget.name, value) class GenericOption(Gtk.Grid): def __init__(self, account, label, type_, value, name, callback, data, desc, enabledif): Gtk.Grid.__init__(self) self.set_column_spacing(12) self.set_size_request(-1, 25) self.callback = callback self.type_ = type_ self.value = value self.data = data self.label = label self.account = account self.name = name self.enabledif = enabledif self.option_value = self.get_value() description_box = Gtk.Box( orientation=Gtk.Orientation.VERTICAL, spacing=0) description_box.set_valign(Gtk.Align.CENTER) optiontext = Gtk.Label(label=label) optiontext.set_hexpand(True) optiontext.set_halign(Gtk.Align.START) optiontext.set_valign(Gtk.Align.CENTER) optiontext.set_vexpand(True) description_box.add(optiontext) if desc is not None: description = Gtk.Label(label=desc) description.set_name('SubDescription') description.set_hexpand(True) description.set_halign(Gtk.Align.START) description.set_valign(Gtk.Align.CENTER) description_box.add(description) self.add(description_box) self.option_box = Gtk.Box(spacing=6) self.option_box.set_size_request(200, -1) self.option_box.set_valign(Gtk.Align.CENTER) self.option_box.set_name('GenericOptionBox') self.add(self.option_box) def do_get_property(self, prop): if prop.name == 'option-value': return self.option_value else: raise AttributeError('unknown property %s' % prop.name) def do_set_property(self, prop, value): if prop.name == 'option-value': self.option_value = value else: raise AttributeError('unknown property %s' % prop.name) def get_value(self): return self.__get_value(self.type_, self.value, self.account) @staticmethod def __get_value(type_, value, account): if value is None: return if type_ == OptionType.VALUE: return value elif type_ == OptionType.CONFIG: return app.config.get(value) elif type_ == OptionType.ACCOUNT_CONFIG: if value == 'password': return passwords.get_password(account) elif value == 'no_log_for': no_log = app.config.get_per( 'accounts', account, 'no_log_for').split() return account not in no_log else: return app.config.get_per('accounts', account, value) elif type_ == OptionType.ACTION: if value.startswith('-'): return account + value return value else: raise ValueError('Wrong OptionType?') def set_value(self, state): if self.type_ == OptionType.CONFIG: app.config.set(self.value, state) if self.type_ == OptionType.ACCOUNT_CONFIG: if self.value == 'password': passwords.save_password(self.account, state) if self.value == 'no_log_for': self.set_no_log_for(self.account, state) else: app.config.set_per('accounts', self.account, self.value, state) if self.callback is not None: self.callback(state, self.data) self.set_property('option-value', state) @staticmethod def set_no_log_for(account, jid): no_log = app.config.get_per('accounts', account, 'no_log_for').split() if jid and account in no_log: no_log.remove(account) elif not jid and account not in no_log: no_log.append(account) app.config.set_per('accounts', account, 'no_log_for', ' '.join(no_log)) def on_row_activated(self): raise NotImplementedError def set_activatable(self, name, value): if self.enabledif is None or self.enabledif[0] != name: return activatable = (name, value) == self.enabledif self.get_parent().set_activatable(activatable) self.set_sensitive(activatable) class SwitchOption(GenericOption): __gproperties__ = { "option-value": (bool, 'Switch Value', '', False, GObject.ParamFlags.READWRITE),} def __init__(self, *args): GenericOption.__init__(self, *args) self.switch = Gtk.Switch() self.switch.set_active(self.option_value) self.switch.connect('notify::active', self.on_switch) self.switch.set_hexpand(True) self.switch.set_halign(Gtk.Align.END) self.switch.set_valign(Gtk.Align.CENTER) self.option_box.add(self.switch) self.show_all() def on_row_activated(self): state = self.switch.get_active() self.switch.set_active(not state) def on_switch(self, switch, *args): value = switch.get_active() self.set_value(value) class EntryOption(GenericOption): __gproperties__ = { "option-value": (str, 'Entry Value', '', '', GObject.ParamFlags.READWRITE),} def __init__(self, *args): GenericOption.__init__(self, *args) self.entry = Gtk.Entry() self.entry.set_text(str(self.option_value)) self.entry.connect('notify::text', self.on_text_change) self.entry.set_valign(Gtk.Align.CENTER) if self.value == 'password': self.entry.set_invisible_char('*') self.entry.set_visibility(False) self.option_box.pack_end(self.entry, True, True, 0) self.show_all() def on_text_change(self, *args): text = self.entry.get_text() self.set_value(text) def on_row_activated(self): self.entry.grab_focus() class DialogOption(GenericOption): __gproperties__ = { "option-value": (str, 'Dummy', '', '', GObject.ParamFlags.READWRITE),} def __init__(self, *args, dialog): GenericOption.__init__(self, *args) self.dialog = dialog self.option_value = Gtk.Label() self.option_value.set_text(self.get_option_value()) self.option_value.set_halign(Gtk.Align.END) self.option_box.pack_start(self.option_value, True, True, 0) self.show_all() def show_dialog(self, parent): if self.dialog: dialog = self.dialog(self.account, parent) dialog.connect('destroy', self.on_destroy) def on_destroy(self, *args): self.option_value.set_text(self.get_option_value()) def get_option_value(self): self.option_value.hide() return '' def on_row_activated(self): self.show_dialog(self.get_toplevel()) class SpinOption(GenericOption): __gproperties__ = { "option-value": (int, 'Priority', '', -128, 127, 0, GObject.ParamFlags.READWRITE),} def __init__(self, *args, range_): GenericOption.__init__(self, *args) lower, upper = range_ adjustment = Gtk.Adjustment(0, lower, upper, 1, 10, 0) self.spin = Gtk.SpinButton() self.spin.set_adjustment(adjustment) self.spin.set_numeric(True) self.spin.set_update_policy(Gtk.SpinButtonUpdatePolicy.IF_VALID) self.spin.set_value(self.option_value) self.spin.set_halign(Gtk.Align.END) self.spin.set_valign(Gtk.Align.CENTER) self.spin.connect('notify::value', self.on_value_change) self.option_box.pack_start(self.spin, True, True, 0) self.show_all() def on_row_activated(self): self.spin.grab_focus() def on_value_change(self, spin, *args): value = spin.get_value_as_int() self.set_value(value) class FileChooserOption(GenericOption): __gproperties__ = { "option-value": (str, 'Certificate Path', '', '', GObject.ParamFlags.READWRITE),} def __init__(self, *args, filefilter): GenericOption.__init__(self, *args) button = Gtk.FileChooserButton(self.label, Gtk.FileChooserAction.OPEN) button.set_halign(Gtk.Align.END) # GTK Bug: The FileChooserButton expands without limit # get the label and use set_max_wide_chars() label = button.get_children()[0].get_children()[0].get_children()[1] label.set_max_width_chars(20) if filefilter: name, pattern = filefilter filter_ = Gtk.FileFilter() filter_.set_name(name) filter_.add_pattern(pattern) button.add_filter(filter_) button.set_filter(filter_) filter_ = Gtk.FileFilter() filter_.set_name(_('All files')) filter_.add_pattern('*') button.add_filter(filter_) if self.option_value: button.set_filename(self.option_value) button.connect('selection-changed', self.on_select) clear_button = gtkgui_helpers.get_image_button( 'edit-clear-all-symbolic', _('Clear File')) clear_button.connect('clicked', lambda *args: button.unselect_all()) self.option_box.pack_start(button, True, True, 0) self.option_box.pack_start(clear_button, False, False, 0) self.show_all() def on_select(self, filechooser): self.set_value(filechooser.get_filename() or '') def on_row_activated(self): pass class CallbackOption(GenericOption): __gproperties__ = { "option-value": (str, 'Dummy', '', '', GObject.ParamFlags.READWRITE),} def __init__(self, *args, callback): GenericOption.__init__(self, *args) self.callback = callback self.show_all() def on_row_activated(self): self.callback() class ActionOption(GenericOption): __gproperties__ = { "option-value": (str, 'Dummy', '', '', GObject.ParamFlags.READWRITE),} def __init__(self, *args, action_args): GenericOption.__init__(self, *args) self.action = gtkgui_helpers.get_action(self.option_value) self.variant = GLib.Variant.new_string(action_args) self.on_enable() self.show_all() self.action.connect('notify::enabled', self.on_enable) def on_enable(self, *args): self.set_sensitive(self.action.get_enabled()) def on_row_activated(self): self.action.activate(self.variant) class LoginOption(DialogOption): def __init__(self, *args, **kwargs): DialogOption.__init__(self, *args, **kwargs) self.option_value.set_selectable(True) def get_option_value(self): jid = app.get_jid_from_account(self.account) return jid def set_activatable(self, name, value): DialogOption.set_activatable(self, name, value) anonym = app.config.get_per('accounts', self.account, 'anonymous_auth') self.get_parent().set_activatable(not anonym) class ProxyComboOption(GenericOption): __gproperties__ = { "option-value": (str, 'Proxy', '', '', GObject.ParamFlags.READWRITE),} def __init__(self, *args): GenericOption.__init__(self, *args) self.combo = Gtk.ComboBoxText() self.update_values() self.combo.connect('changed', self.on_value_change) self.combo.set_valign(Gtk.Align.CENTER) button = gtkgui_helpers.get_image_button( 'preferences-system-symbolic', _('Manage Proxies')) button.set_action_name('app.manage-proxies') button.set_valign(Gtk.Align.CENTER) self.option_box.pack_start(self.combo, True, True, 0) self.option_box.pack_start(button, False, True, 0) self.show_all() def update_values(self): proxies = app.config.get_per('proxies') proxies.insert(0, _('None')) self.combo.remove_all() for index, value in enumerate(proxies): self.combo.insert_text(-1, value) if value == self.option_value or index == 0: self.combo.set_active(index) def on_value_change(self, combo): self.set_value(combo.get_active_text()) def on_row_activated(self): pass class PriorityOption(DialogOption): def __init__(self, *args, **kwargs): DialogOption.__init__(self, *args, **kwargs) def get_option_value(self): adjust = app.config.get_per( 'accounts', self.account, 'adjust_priority_with_status') if adjust: return _('Adjust to Status') priority = app.config.get_per('accounts', self.account, 'priority') return str(priority) class CutstomHostnameOption(DialogOption): def __init__(self, *args, **kwargs): DialogOption.__init__(self, *args, **kwargs) def get_option_value(self): custom = app.config.get_per('accounts', self.account, 'use_custom_host') return _('On') if custom else _('Off') class ChangePasswordOption(DialogOption): def __init__(self, *args, **kwargs): DialogOption.__init__(self, *args, **kwargs) def show_dialog(self, parent): try: self.change_dialog = dialogs.ChangePasswordDialog( self.account, self.on_changed, parent) except GajimGeneralException: return self.change_dialog.dialog.set_modal(True) def on_changed(self, new_password): if new_password is not None: app.connections[self.account].change_password(new_password) self.set_value(new_password) def set_activatable(self, name, value): activatable = False if self.account in app.connections: con = app.connections[self.account] activatable = con.connected >= 2 and con.register_supported self.get_parent().set_activatable(activatable) class GPGOption(DialogOption): def __init__(self, *args, **kwargs): DialogOption.__init__(self, *args, **kwargs) def show_dialog(self, parent): secret_keys = app.connections[self.account].ask_gpg_secrete_keys() secret_keys[_('None')] = _('None') if not secret_keys: dialogs.ErrorDialog( _('Failed to get secret keys'), _('There is no OpenPGP secret key available.'), transient_for=parent) return dialog = dialogs.ChooseGPGKeyDialog( _('OpenPGP Key Selection'), _('Choose your OpenPGP key'), secret_keys, self.on_key_selected, transient_for=parent) dialog.window.connect('destroy', self.on_destroy) def on_key_selected(self, keyID): if keyID is None: return keyid_new, keyname_new = keyID keyid = app.config.get_per('accounts', self.account, 'keyid') if keyid_new == _('None'): if keyid == '': return app.config.set_per('accounts', self.account, 'keyname', '') app.config.set_per('accounts', self.account, 'keyid', '') else: if keyid == keyid_new: return app.config.set_per( 'accounts', self.account, 'keyname', keyname_new) app.config.set_per( 'accounts', self.account, 'keyid', keyid_new) def get_option_value(self): keyid = app.config.get_per('accounts', self.account, 'keyid') keyname = app.config.get_per('accounts', self.account, 'keyname') if keyid is not None: return '\n'.join((keyid, keyname)) return '' def set_activatable(self, name, value): active = self.account in app.connections self.get_parent().set_activatable(app.HAVE_GPG and active) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/plugins/000077500000000000000000000000001326020644600234535ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/plugins/__init__.py000066400000000000000000000017101326020644600255630ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## ''' Main file of plugins package. :author: Mateusz Biliński :since: 05/30/2008 :copyright: Copyright (2008) Mateusz Biliński :license: GPL ''' from gajim.plugins.pluginmanager import PluginManager from gajim.plugins.gajimplugin import GajimPlugin __all__ = ['PluginManager', 'GajimPlugin'] gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/plugins/gajimplugin.py000066400000000000000000000201711326020644600263340ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## ''' Base class for implementing plugin. :author: Mateusz Biliński :since: 1st June 2008 :copyright: Copyright (2008) Mateusz Biliński :license: GPL ''' import os import locale from gajim.common import app from gajim.plugins.helpers import log_calls, log from gajim.plugins.gui import GajimPluginConfigDialog import logging log = logging.getLogger('gajim.p.plugin') class GajimPlugin(object): ''' Base class for implementing Gajim plugins. ''' name = '' ''' Name of plugin. Will be shown in plugins management GUI. :type: str ''' short_name = '' ''' Short name of plugin. Used for quick indentification of plugin. :type: str :todo: decide whether we really need this one, because class name (with module name) can act as such short name ''' encryption_name = '' ''' Name of the encryption scheme. The name that Gajim displays in the encryption menu. Leave empty if the plugin is not an encryption plugin. :type: str ''' version = '' ''' Version of plugin. :type: str :todo: decide how to compare version between each other (which one is higher). Also rethink: do we really need to compare versions of plugins between each other? This would be only useful if we detect same plugin class but with different version and we want only the newest one to be active - is such policy good? ''' description = '' ''' Plugin description. :type: str :todo: should be allow rich text here (like HTML or reStructuredText)? ''' authors = [] ''' Plugin authors. :type: [] of str :todo: should we decide on any particular format of author strings? Especially: should we force format of giving author's e-mail? ''' homepage = '' ''' URL to plug-in's homepage. :type: str :todo: should we check whether provided string is valid URI? (Maybe using 'property') ''' gui_extension_points = {} ''' Extension points that plugin wants to connect with and handlers to be used. Keys of this string should be strings with name of GUI extension point to handles. Values should be 2-element tuples with references to handling functions. First function will be used to connect plugin with extpoint, the second one to successfuly disconnect from it. Connecting takes places when plugin is activated and extpoint already exists, or when plugin is already activated but extpoint is being created (eg. chat window opens). Disconnecting takes place when plugin is deactivated and extpoint exists or when extpoint is destroyed and plugin is activate (eg. chat window closed). ''' config_default_values = {} ''' Default values for keys that should be stored in plug-in config. This dict is used when when someone calls for config option but it has not been set yet. Values are tuples: (default_value, option_description). The first one can be anything (this is the advantage of using shelve/pickle instead of custom-made config I/O handling); the second one should be str (gettext can be used if need and/or translation is planned). :type: {} of 2-element tuples ''' events_handlers = {} ''' Dictionary with events handlers. Keys are event names. Values should be 2-element tuples with handler priority as first element and reference to handler function as second element. Priority is integer. See `ged` module for predefined priorities like `ged.PRECORE`, `ged.CORE` or `ged.POSTCORE`. :type: {} with 2-element tuples ''' events = [] ''' New network event classes to be registered in Network Events Controller. :type: [] of `nec.NetworkIncomingEvent` or `nec.NetworkOutgoingEvent` subclasses. ''' @log_calls('GajimPlugin') def __init__(self): self.config = GajimPluginConfig(self) ''' Plug-in configuration dictionary. Automatically saved and loaded and plug-in (un)load. :type: `plugins.plugin.GajimPluginConfig` ''' self.activatable = True self.available_text = '' self.load_config() self.config_dialog = GajimPluginConfigDialog(self) self.init() @log_calls('GajimPlugin') def save_config(self): self.config.save() @log_calls('GajimPlugin') def load_config(self): self.config.load() def __eq__(self, plugin): if self.short_name == plugin.short_name: return True return False def __ne__(self, plugin): if self.short_name != plugin.short_name: return True return False @log_calls('GajimPlugin') def local_file_path(self, file_name): return os.path.join(self.__path__, file_name) @log_calls('GajimPlugin') def init(self): pass @log_calls('GajimPlugin') def activate(self): pass @log_calls('GajimPlugin') def deactivate(self): pass import pickle class GajimPluginConfig(): @log_calls('GajimPluginConfig') def __init__(self, plugin): self.plugin = plugin self.FILE_PATH = os.path.join( app.PLUGINS_CONFIG_DIR, self.plugin.short_name) self.data = {} @log_calls('GajimPluginConfig') def __getitem__(self, key): if not key in self.data: self.data[key] = self.plugin.config_default_values[key][0] self.save() return self.data[key] @log_calls('GajimPluginConfig') def __setitem__(self, key, value): self.data[key] = value self.save() @log_calls('GajimPluginConfig') def __delitem__(self, key): del self.data[key] self.save() @log_calls('GajimPluginConfig') def __contains__(self, key): return key in self.data def __iter__(self): for k in self.data.keys(): yield k def keys(self): return self.data.keys() def items(self): return self.data.items() @log_calls('GajimPluginConfig') def save(self): fd = open(self.FILE_PATH, 'wb') pickle.dump(self.data, fd) fd.close() @log_calls('GajimPluginConfig') def load(self): if os.path.isfile(self.FILE_PATH): fd = open(self.FILE_PATH, 'rb') try: self.data = pickle.load(fd) fd.close() except: fd.close() try: import shelve s = shelve.open(self.FILE_PATH) for (k, v) in s.items(): self.data[k] = v if not isinstance(self.data, dict): raise GajimPluginException s.close() self.save() except: log.warning('%s plugin config file not readable. Saving it as ' '%s and creating a new one' % (self.plugin.short_name, self.FILE_PATH.decode(locale.getpreferredencoding()) + '.bak')) if os.path.exists(self.FILE_PATH + '.bak'): os.remove(self.FILE_PATH + '.bak') os.rename(self.FILE_PATH, self.FILE_PATH + '.bak') self.data = {} self.save() else: self.data = {} self.save() class GajimPluginException(Exception): pass class GajimPluginInitError(GajimPluginException): pass gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/plugins/gui.py000066400000000000000000000320731326020644600246160ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## ''' GUI classes related to plug-in management. :author: Mateusz Biliński :since: 6th June 2008 :copyright: Copyright (2008) Mateusz Biliński :license: GPL ''' __all__ = ['PluginsWindow'] from gi.repository import Pango from gi.repository import Gtk from gi.repository import GdkPixbuf from gi.repository import GLib, Gdk import os from enum import IntEnum, unique from gajim import gtkgui_helpers from gajim.dialogs import WarningDialog, YesNoDialog, ArchiveChooserDialog from gajim.htmltextview import HtmlTextView from gajim.common import app from gajim.plugins.helpers import log_calls from gajim.plugins.helpers import GajimPluginActivateException from gajim.plugins.plugins_i18n import _ from gajim.common.exceptions import PluginsystemError @unique class Column(IntEnum): PLUGIN = 0 NAME = 1 ACTIVE = 2 ACTIVATABLE = 3 ICON = 4 class PluginsWindow(object): '''Class for Plugins window''' @log_calls('PluginsWindow') def __init__(self): '''Initialize Plugins window''' builder = gtkgui_helpers.get_gtk_builder('plugins_window.ui') self.window = builder.get_object('plugins_window') self.window.set_transient_for(app.interface.roster.window) widgets_to_extract = ('plugins_notebook', 'plugin_name_label', 'plugin_version_label', 'plugin_authors_label', 'plugin_homepage_linkbutton', 'uninstall_plugin_button', 'configure_plugin_button', 'installed_plugins_treeview', 'close_button') for widget_name in widgets_to_extract: setattr(self, widget_name, builder.get_object(widget_name)) self.plugin_description_textview = HtmlTextView() self.plugin_description_textview.connect_tooltip() self.plugin_description_textview.set_wrap_mode(Gtk.WrapMode.WORD) sw = builder.get_object('scrolledwindow2') sw.add(self.plugin_description_textview) self.installed_plugins_model = Gtk.ListStore(object, str, bool, bool, GdkPixbuf.Pixbuf) self.installed_plugins_treeview.set_model(self.installed_plugins_model) renderer = Gtk.CellRendererText() col = Gtk.TreeViewColumn(_('Plugin'))#, renderer, text=Column.NAME) cell = Gtk.CellRendererPixbuf() col.pack_start(cell, False) col.add_attribute(cell, 'pixbuf', Column.ICON) col.pack_start(renderer, True) col.add_attribute(renderer, 'text', Column.NAME) col.set_property('expand', True) self.installed_plugins_treeview.append_column(col) renderer = Gtk.CellRendererToggle() renderer.connect('toggled', self.installed_plugins_toggled_cb) col = Gtk.TreeViewColumn(_('Active'), renderer, active=Column.ACTIVE, activatable=Column.ACTIVATABLE) self.installed_plugins_treeview.append_column(col) self.def_icon = gtkgui_helpers.get_icon_pixmap('preferences-desktop') # connect signal for selection change selection = self.installed_plugins_treeview.get_selection() selection.connect('changed', self.installed_plugins_treeview_selection_changed) selection.set_mode(Gtk.SelectionMode.SINGLE) self._clear_installed_plugin_info() self.fill_installed_plugins_model() root_iter = self.installed_plugins_model.get_iter_first() if root_iter: selection.select_iter(root_iter) builder.connect_signals(self) self.plugins_notebook.set_current_page(0) self.close_button.grab_focus() # Adding GUI extension point for Plugins that want to hook the Plugin Window app.plugin_manager.gui_extension_point('plugin_window', self) self.window.show_all() gtkgui_helpers.possibly_move_window_in_current_desktop(self.window) def on_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.window.destroy() def on_plugins_notebook_switch_page(self, widget, page, page_num): GLib.idle_add(self.close_button.grab_focus) @log_calls('PluginsWindow') def installed_plugins_treeview_selection_changed(self, treeview_selection): model, iter = treeview_selection.get_selected() if iter: plugin = model.get_value(iter, Column.PLUGIN) self._display_installed_plugin_info(plugin) else: self._clear_installed_plugin_info() def _display_installed_plugin_info(self, plugin): self.plugin_name_label.set_text(plugin.name) self.plugin_version_label.set_text(plugin.version) self.plugin_authors_label.set_text(plugin.authors) self.plugin_homepage_linkbutton.set_uri(plugin.homepage) self.plugin_homepage_linkbutton.set_label(plugin.homepage) label = self.plugin_homepage_linkbutton.get_children()[0] label.set_ellipsize(Pango.EllipsizeMode.END) self.plugin_homepage_linkbutton.set_property('sensitive', True) desc_textbuffer = self.plugin_description_textview.get_buffer() desc_textbuffer.set_text('') txt = plugin.description txt.replace('', '') if plugin.available_text: txt += '

' + _('Warning: %s') % plugin.available_text if not txt.startswith('' + txt txt += ' ' self.plugin_description_textview.display_html(txt, self.plugin_description_textview, None) self.plugin_description_textview.set_property('sensitive', True) self.uninstall_plugin_button.set_property('sensitive', app.PLUGINS_DIRS[1] in plugin.__path__) self.configure_plugin_button.set_property( 'sensitive', plugin.config_dialog is not None) def _clear_installed_plugin_info(self): self.plugin_name_label.set_text('') self.plugin_version_label.set_text('') self.plugin_authors_label.set_text('') self.plugin_homepage_linkbutton.set_uri('') self.plugin_homepage_linkbutton.set_label('') self.plugin_homepage_linkbutton.set_property('sensitive', False) desc_textbuffer = self.plugin_description_textview.get_buffer() desc_textbuffer.set_text('') self.plugin_description_textview.set_property('sensitive', False) self.uninstall_plugin_button.set_property('sensitive', False) self.configure_plugin_button.set_property('sensitive', False) @log_calls('PluginsWindow') def fill_installed_plugins_model(self): pm = app.plugin_manager self.installed_plugins_model.clear() self.installed_plugins_model.set_sort_column_id(1, Gtk.SortType.ASCENDING) for plugin in pm.plugins: icon = self.get_plugin_icon(plugin) self.installed_plugins_model.append([plugin, plugin.name, plugin.active and plugin.activatable, plugin.activatable, icon]) def get_plugin_icon(self, plugin): icon_file = os.path.join(plugin.__path__, os.path.split( plugin.__path__)[1]) + '.png' icon = self.def_icon if os.path.isfile(icon_file): icon = GdkPixbuf.Pixbuf.new_from_file_at_size(icon_file, 16, 16) return icon @log_calls('PluginsWindow') def installed_plugins_toggled_cb(self, cell, path): is_active = self.installed_plugins_model[path][Column.ACTIVE] plugin = self.installed_plugins_model[path][Column.PLUGIN] if is_active: app.plugin_manager.deactivate_plugin(plugin) else: try: app.plugin_manager.activate_plugin(plugin) except GajimPluginActivateException as e: WarningDialog(_('Plugin failed'), str(e), transient_for=self.window) return self.installed_plugins_model[path][Column.ACTIVE] = not is_active @log_calls('PluginsWindow') def on_plugins_window_destroy(self, widget): '''Close window''' app.plugin_manager.remove_gui_extension_point('plugin_window', self) del app.interface.instances['plugins'] @log_calls('PluginsWindow') def on_close_button_clicked(self, widget): self.window.destroy() @log_calls('PluginsWindow') def on_configure_plugin_button_clicked(self, widget): selection = self.installed_plugins_treeview.get_selection() model, iter = selection.get_selected() if iter: plugin = model.get_value(iter, Column.PLUGIN) if isinstance(plugin.config_dialog, GajimPluginConfigDialog): plugin.config_dialog.run(self.window) else: plugin.config_dialog(self.window) else: # No plugin selected. this should never be reached. As configure # plugin button should only be clickable when plugin is selected. # XXX: maybe throw exception here? pass @log_calls('PluginsWindow') def on_uninstall_plugin_button_clicked(self, widget): selection = self.installed_plugins_treeview.get_selection() model, iter = selection.get_selected() if iter: plugin = model.get_value(iter, Column.PLUGIN) try: app.plugin_manager.remove_plugin(plugin) except PluginsystemError as e: WarningDialog(_('Unable to properly remove the plugin'), str(e), self.window) return model.remove(iter) @log_calls('PluginsWindow') def on_install_plugin_button_clicked(self, widget): def show_warn_dialog(): text = _('Archive is malformed') dialog = WarningDialog(text, '', transient_for=self.window) dialog.set_modal(False) dialog.popup() def _on_plugin_exists(zip_filename): def on_yes(is_checked): plugin = app.plugin_manager.install_from_zip(zip_filename, True) if not plugin: show_warn_dialog() return model = self.installed_plugins_model for i, row in enumerate(model): if plugin == row[Column.PLUGIN]: model.remove(row.iter) break iter_ = model.append([plugin, plugin.name, False, plugin.activatable, self.get_plugin_icon(plugin)]) sel = self.installed_plugins_treeview.get_selection() sel.select_iter(iter_) YesNoDialog(_('Plugin already exists'), sectext=_('Overwrite?'), on_response_yes=on_yes, transient_for=self.window) def _try_install(zip_filename): try: plugin = app.plugin_manager.install_from_zip(zip_filename) except PluginsystemError as er_type: error_text = str(er_type) if error_text == _('Plugin already exists'): _on_plugin_exists(zip_filename) return WarningDialog(error_text, '"%s"' % zip_filename, self.window) return if not plugin: show_warn_dialog() return model = self.installed_plugins_model iter_ = model.append([plugin, plugin.name, False, plugin.activatable, self.get_plugin_icon(plugin)]) sel = self.installed_plugins_treeview.get_selection() sel.select_iter(iter_) self.dialog = ArchiveChooserDialog( on_response_ok=_try_install, transient_for=self.window) class GajimPluginConfigDialog(Gtk.Dialog): @log_calls('GajimPluginConfigDialog') def __init__(self, plugin, **kwargs): Gtk.Dialog.__init__(self, title='%s %s'%(plugin.name, _('Configuration')), **kwargs) self.plugin = plugin button = self.add_button('gtk-close', Gtk.ResponseType.CLOSE) button.connect('clicked', self.on_close_button_clicked) self.get_child().set_spacing(3) self.init() def on_close_dialog(self, widget, data): self.hide() return True def on_close_button_clicked(self, widget): self.hide() @log_calls('GajimPluginConfigDialog') def run(self, parent=None): self.set_transient_for(parent) self.on_run() self.show_all() self.connect('delete-event', self.on_close_dialog) result = super(GajimPluginConfigDialog, self) return result def init(self): pass def on_run(self): pass gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/plugins/helpers.py000066400000000000000000000076771326020644600255100ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## ''' Helper code related to plug-ins management system. :author: Mateusz Biliński :since: 30th May 2008 :copyright: Copyright (2008) Mateusz Biliński :license: GPL ''' __all__ = ['log', 'log_calls', 'Singleton'] import logging import functools log = logging.getLogger('gajim.plugin_system') ''' Logger for code related to plug-in system. :type: logging.Logger ''' class GajimPluginActivateException(Exception): ''' Raised when activation failed ''' pass class log_calls(object): ''' Decorator class for functions to easily log when they are entered and left. ''' filter_out_classes = ['GajimPluginConfig', 'PluginManager', 'GajimPluginConfigDialog', 'PluginsWindow'] ''' List of classes from which no logs should be emited when methods are called, eventhough `log_calls` decorator is used. ''' def __init__(self, classname='', log=log): ''' :Keywords: classname : str Name of class to prefix function name (if function is a method). log : logging.Logger Logger to use when outputing debug information on when function has been entered and when left. By default: `plugins.helpers.log` is used. ''' self.full_func_name = '' ''' Full name of function, with class name (as prefix) if given to decorator. Otherwise, it's only function name retrieved from function object for which decorator was called. :type: str ''' self.log_this_class = True ''' Determines whether wrapper of given function should log calls of this function or not. :type: bool ''' if classname: self.full_func_name = classname+'.' if classname in self.filter_out_classes: self.log_this_class = False def __call__(self, f): ''' :param f: function to be wrapped with logging statements :return: given function wrapped by *log.debug* statements :rtype: function ''' self.full_func_name += f.__name__ if self.log_this_class: @functools.wraps(f) def wrapper(*args, **kwargs): log.debug('%(funcname)s() '%{ 'funcname': self.full_func_name}) result = f(*args, **kwargs) log.debug('%(funcname)s() '%{ 'funcname': self.full_func_name}) return result else: @functools.wraps(f) def wrapper(*args, **kwargs): result = f(*args, **kwargs) return result return wrapper class Singleton(type): ''' Singleton metaclass. ''' def __init__(cls, name, bases, dic): super(Singleton, cls).__init__(name, bases, dic) cls.instance=None def __call__(cls,*args,**kw): if cls.instance is None: cls.instance=super(Singleton, cls).__call__(*args,**kw) #log.debug('%(classname)s - new instance created'%{ #'classname' : cls.__name__}) else: pass #log.debug('%(classname)s - returning already existing instance'%{ #'classname' : cls.__name__}) return cls.instance gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/plugins/pluginmanager.py000066400000000000000000000653541326020644600266730ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## ''' Plug-in management related classes. :author: Mateusz Biliński :since: 30th May 2008 :copyright: Copyright (2008) Mateusz Biliński :license: GPL ''' __all__ = ['PluginManager'] import os import sys import fnmatch import zipfile from shutil import rmtree import configparser from pkg_resources import parse_version from gajim.common import app from gajim.common import nec from gajim.common.exceptions import PluginsystemError from gajim.plugins.helpers import log, log_calls, Singleton from gajim.plugins.helpers import GajimPluginActivateException from gajim.plugins.gajimplugin import GajimPlugin, GajimPluginException class PluginManager(metaclass=Singleton): ''' Main plug-in management class. Currently: - scans for plugins - activates them - handles GUI extension points, when called by GUI objects after plugin is activated (by dispatching info about call to handlers in plugins) :todo: add more info about how GUI extension points work :todo: add list of available GUI extension points :todo: implement mechanism to dynamically load plugins where GUI extension points have been already called (i.e. when plugin is activated after GUI object creation). [DONE?] :todo: implement mechanism to dynamically deactive plugins (call plugin's deactivation handler) [DONE?] :todo: when plug-in is deactivated all GUI extension points are removed from `PluginManager.gui_extension_points_handlers`. But when object that invoked GUI extension point is abandoned by Gajim, eg. closed ChatControl object, the reference to called GUI extension points is still in `PluginManager.gui_extension_points` These should be removed, so that object can be destroyed by Python. Possible solution: add call to clean up method in classes 'destructors' (classes that register GUI extension points) ''' __metaclass__ = Singleton #@log_calls('PluginManager') def __init__(self): self.plugins = [] ''' Detected plugin classes. Each class object in list is `GajimPlugin` subclass. :type: [] of class objects ''' self.active_plugins = [] ''' Instance objects of active plugins. These are object instances of classes held `plugins`, but only those that were activated. :type: [] of `GajimPlugin` based objects ''' self.gui_extension_points = {} ''' Registered GUI extension points. ''' self.gui_extension_points_handlers = {} ''' Registered handlers of GUI extension points. ''' self.encryption_plugins = {} ''' Registered names with instances of encryption Plugins. ''' for path in [app.PLUGINS_DIRS[1], app.PLUGINS_DIRS[0]]: pc = PluginManager.scan_dir_for_plugins(path) self.add_plugins(pc) @log_calls('PluginManager') def _plugin_has_entry_in_global_config(self, plugin): if app.config.get_per('plugins', plugin.short_name) is None: return False else: return True @log_calls('PluginManager') def _create_plugin_entry_in_global_config(self, plugin): app.config.add_per('plugins', plugin.short_name) def _remove_plugin_entry_in_global_config(self, plugin): app.config.del_per('plugins', plugin.short_name) @log_calls('PluginManager') def init_plugins(self): self._activate_all_plugins_from_global_config() @log_calls('PluginManager') def add_plugin(self, plugin_class): ''' :todo: what about adding plug-ins that are already added? Module reload and adding class from reloaded module or ignoring adding plug-in? ''' plugin = plugin_class() if plugin not in self.plugins: if not self._plugin_has_entry_in_global_config(plugin): self._create_plugin_entry_in_global_config(plugin) self.plugins.append(plugin) plugin.active = False else: log.info('Not loading plugin %s v%s from module %s (identified by' ' short name: %s). Plugin already loaded.' % (plugin.name, plugin.version, plugin.__module__, plugin.short_name)) @log_calls('PluginManager') def add_plugins(self, plugin_classes): for plugin_class in plugin_classes: self.add_plugin(plugin_class) @log_calls('PluginManager') def get_active_plugin(self, plugin_name): for plugin in self.active_plugins: if plugin.short_name == plugin_name: return plugin return None @log_calls('PluginManager') def extension_point(self, gui_extpoint_name, *args): ''' Invokes all handlers (from plugins) for a particular extension point, but doesnt add it to collection for further processing. For example if you pass a message for encryption via extension point to a plugin, its undesired that the call is stored and replayed on activating the plugin. For example after an update. :param gui_extpoint_name: name of GUI extension point. :type gui_extpoint_name: str :param args: parameters to be passed to extension point handlers (typically and object that invokes `gui_extension_point`; however, this can be practically anything) :type args: tuple ''' self._execute_all_handlers_of_gui_extension_point(gui_extpoint_name, *args) @log_calls('PluginManager') def gui_extension_point(self, gui_extpoint_name, *args): ''' Invokes all handlers (from plugins) for particular GUI extension point and adds it to collection for further processing (eg. by plugins not active yet). :param gui_extpoint_name: name of GUI extension point. :type gui_extpoint_name: str :param args: parameters to be passed to extension point handlers (typically and object that invokes `gui_extension_point`; however, this can be practically anything) :type args: tuple :todo: GUI extension points must be documented well - names with parameters that will be passed to handlers (in plugins). Such documentation must be obeyed both in core and in plugins. This is a loosely coupled approach and is pretty natural in Python. :bug: what if only some handlers are successfully connected? we should revert all those connections that where successfully made. Maybe call 'self._deactivate_plugin()' or sth similar. Looking closer - we only rewrite tuples here. Real check should be made in method that invokes gui_extpoints handlers. ''' self._add_gui_extension_point_call_to_list(gui_extpoint_name, *args) self._execute_all_handlers_of_gui_extension_point(gui_extpoint_name, *args) @log_calls('PluginManager') def remove_gui_extension_point(self, gui_extpoint_name, *args): ''' Removes GUI extension point from collection held by `PluginManager`. From this point this particular extension point won't be visible to plugins (eg. it won't invoke any handlers when plugin is activated). GUI extension point is removed completely (there is no way to recover it from inside `PluginManager`). Removal is needed when instance object that given extension point was connect with is destroyed (eg. ChatControl is closed or context menu is hidden). Each `PluginManager.gui_extension_point` call should have a call of `PluginManager.remove_gui_extension_point` related to it. :note: in current implementation different arguments mean different extension points. The same arguments and the same name mean the same extension point. :todo: instead of using argument to identify which extpoint should be removed, maybe add additional 'id' argument - this would work similar hash in Python objects. 'id' would be calculated based on arguments passed or on anything else (even could be constant) This would give core developers (that add new extpoints) more freedom, but is this necessary? :param gui_extpoint_name: name of GUI extension point. :type gui_extpoint_name: str :param args: arguments that `PluginManager.gui_extension_point` was called with for this extension point. This is used (along with extension point name) to identify element to be removed. :type args: tuple ''' if gui_extpoint_name in self.gui_extension_points: extension_points = list(self.gui_extension_points[gui_extpoint_name]) for ext_point in extension_points: if args[0] in ext_point: self.gui_extension_points[gui_extpoint_name].remove( ext_point) @log_calls('PluginManager') def _add_gui_extension_point_call_to_list(self, gui_extpoint_name, *args): ''' Adds GUI extension point call to list of calls. This is done only if such call hasn't been added already (same extension point name and same arguments). :note: This is assumption that GUI extension points are different only if they have different name or different arguments. :param gui_extpoint_name: GUI extension point name used to identify it by plugins. :type gui_extpoint_name: str :param args: parameters to be passed to extension point handlers (typically and object that invokes `gui_extension_point`; however, this can be practically anything) :type args: tuple ''' if ((gui_extpoint_name not in self.gui_extension_points) or (args not in self.gui_extension_points[gui_extpoint_name])): self.gui_extension_points.setdefault(gui_extpoint_name,[]).append( args) @log_calls('PluginManager') def _execute_all_handlers_of_gui_extension_point(self, gui_extpoint_name, *args): if gui_extpoint_name in self.gui_extension_points_handlers: for handlers in self.gui_extension_points_handlers[ gui_extpoint_name]: try: handlers[0](*args) except Exception as e: log.warning('Error executing %s', handlers[0], exc_info=True) def _register_events_handlers_in_ged(self, plugin): for event_name, handler in plugin.events_handlers.items(): priority = handler[0] handler_function = handler[1] app.ged.register_event_handler(event_name, priority, handler_function) def _remove_events_handler_from_ged(self, plugin): for event_name, handler in plugin.events_handlers.items(): priority = handler[0] handler_function = handler[1] app.ged.remove_event_handler(event_name, priority, handler_function) def _register_network_events_in_nec(self, plugin): for event_class in plugin.events: setattr(event_class, 'plugin', plugin) if issubclass(event_class, nec.NetworkIncomingEvent): app.nec.register_incoming_event(event_class) elif issubclass(event_class, nec.NetworkOutgoingEvent): app.nec.register_outgoing_event(event_class) def _remove_network_events_from_nec(self, plugin): for event_class in plugin.events: if issubclass(event_class, nec.NetworkIncomingEvent): app.nec.unregister_incoming_event(event_class) elif issubclass(event_class, nec.NetworkOutgoingEvent): app.nec.unregister_outgoing_event(event_class) def _remove_name_from_encryption_plugins(self, plugin): if plugin.encryption_name: del self.encryption_plugins[plugin.encryption_name] @log_calls('PluginManager') def activate_plugin(self, plugin): ''' :param plugin: plugin to be activated :type plugin: class object of `GajimPlugin` subclass ''' if not plugin.active and plugin.activatable: self._add_gui_extension_points_handlers_from_plugin(plugin) self._add_encryption_name_from_plugin(plugin) self._handle_all_gui_extension_points_with_plugin(plugin) self._register_events_handlers_in_ged(plugin) self._register_network_events_in_nec(plugin) self.active_plugins.append(plugin) try: plugin.activate() except GajimPluginException as e: self.deactivate_plugin(plugin) raise GajimPluginActivateException(str(e)) self._set_plugin_active_in_global_config(plugin) plugin.active = True def deactivate_plugin(self, plugin): # remove GUI extension points handlers (provided by plug-in) from # handlers list for gui_extpoint_name, gui_extpoint_handlers in \ plugin.gui_extension_points.items(): self.gui_extension_points_handlers[gui_extpoint_name].remove( gui_extpoint_handlers) # detaching plug-in from handler GUI extension points (calling # cleaning up method that must be provided by plug-in developer # for each handled GUI extension point) for gui_extpoint_name, gui_extpoint_handlers in \ plugin.gui_extension_points.items(): if gui_extpoint_name in self.gui_extension_points: for gui_extension_point_args in self.gui_extension_points[ gui_extpoint_name]: handler = gui_extpoint_handlers[1] if handler: try: handler(*gui_extension_point_args) except Exception as e: log.warning('Error executing %s', handler, exc_info=True) self._remove_events_handler_from_ged(plugin) self._remove_network_events_from_nec(plugin) self._remove_name_from_encryption_plugins(plugin) # removing plug-in from active plug-ins list plugin.deactivate() self.active_plugins.remove(plugin) self._set_plugin_active_in_global_config(plugin, False) plugin.active = False def _deactivate_all_plugins(self): for plugin_object in self.active_plugins: self.deactivate_plugin(plugin_object) @log_calls('PluginManager') def _add_gui_extension_points_handlers_from_plugin(self, plugin): for gui_extpoint_name, gui_extpoint_handlers in \ plugin.gui_extension_points.items(): self.gui_extension_points_handlers.setdefault(gui_extpoint_name, []).append(gui_extpoint_handlers) def _add_encryption_name_from_plugin(self, plugin): if plugin.encryption_name: self.encryption_plugins[plugin.encryption_name] = plugin @log_calls('PluginManager') def _handle_all_gui_extension_points_with_plugin(self, plugin): for gui_extpoint_name, gui_extpoint_handlers in \ plugin.gui_extension_points.items(): if gui_extpoint_name in self.gui_extension_points: for gui_extension_point_args in self.gui_extension_points[ gui_extpoint_name]: handler = gui_extpoint_handlers[0] if handler: try: handler(*gui_extension_point_args) except Exception as e: log.warning('Error executing %s', handler, exc_info=True) @log_calls('PluginManager') def _activate_all_plugins(self): ''' Activates all plugins in `plugins`. Activated plugins are appended to `active_plugins` list. ''' for plugin in self.plugins: try: self.activate_plugin(plugin) except GajimPluginActivateException: pass def _activate_all_plugins_from_global_config(self): for plugin in self.plugins: if self._plugin_is_active_in_global_config(plugin) and \ plugin.activatable: try: self.activate_plugin(plugin) except GajimPluginActivateException: pass def _plugin_is_active_in_global_config(self, plugin): return app.config.get_per('plugins', plugin.short_name, 'active') def _set_plugin_active_in_global_config(self, plugin, active=True): app.config.set_per('plugins', plugin.short_name, 'active', active) @staticmethod @log_calls('PluginManager') def scan_dir_for_plugins(path, scan_dirs=True, package=False): r''' Scans given directory for plugin classes. :param path: directory to scan for plugins :type path: str :param scan_dirs: folders inside path are processed as modules :type scan_dirs: boolean :param package: if path points to a single package folder :type package: boolean :return: list of found plugin classes (subclasses of `GajimPlugin` :rtype: [] of class objects :note: currently it only searches for plugin classes in '\*.py' files present in given direcotory `path` (no recursion here) :todo: add scanning zipped modules ''' from gajim.plugins.plugins_i18n import _ plugins_found = [] conf = configparser.ConfigParser() fields = ('name', 'short_name', 'version', 'description', 'authors', 'homepage') if not os.path.isdir(path): return plugins_found if package: path, package_name = os.path.split(path) dir_list = [package_name] else: dir_list = os.listdir(path) sys.path.insert(0, path) for elem_name in dir_list: file_path = os.path.join(path, elem_name) if os.path.isfile(file_path) and fnmatch.fnmatch(file_path, '*.py'): module_name = os.path.splitext(elem_name)[0] elif os.path.isdir(file_path) and scan_dirs: module_name = elem_name file_path += os.path.sep else: continue manifest_path = os.path.join(os.path.dirname(file_path), 'manifest.ini') if scan_dirs and (not os.path.isfile(manifest_path)): continue # read metadata from manifest.ini conf.remove_section('info') with open(manifest_path, encoding='utf-8') as conf_file: try: conf.read_file(conf_file) except configparser.Error: log.warning(("Plugin {plugin} not loaded, error loading" " manifest").format(plugin=elem_name) , exc_info=True) continue min_v = conf.get('info', 'min_gajim_version', fallback=None) max_v = conf.get('info', 'max_gajim_version', fallback=None) gajim_v = app.config.get('version').split('+', 1)[0] gajim_v_cmp = parse_version(gajim_v) if min_v and gajim_v_cmp < parse_version(min_v): log.warning(('Plugin {plugin} not loaded, newer version of' 'gajim required: {gajim_v} < {min_v}').format( plugin=elem_name, gajim_v=gajim_v, min_v=min_v )) continue if max_v and gajim_v_cmp > parse_version(max_v): log.warning(('Plugin {plugin} not loaded, plugin incompatible ' 'with current version of gajim: ' '{gajim_v} > {max_v}').format( plugin=elem_name, gajim_v=gajim_v, max_v=max_v )) continue module = None try: if module_name in sys.modules: if path == app.PLUGINS_DIRS[0]: # Only reload plugins from Gajim base dir when they # dont exist. This means plugins in the user path are # always preferred. continue from imp import reload log.info('Reloading %s', module_name) module = reload(sys.modules[module_name]) else: log.info('Loading %s', module_name) module = __import__(module_name) except Exception as error: log.warning( "While trying to load {plugin}, exception occurred".format(plugin=elem_name), exc_info=sys.exc_info() ) continue if module is None: continue log.debug('Attributes processing started') for module_attr_name in [attr_name for attr_name in dir(module) if not (attr_name.startswith('__') or attr_name.endswith('__'))]: module_attr = getattr(module, module_attr_name) log.debug('%s : %s' % (module_attr_name, module_attr)) try: if not issubclass(module_attr, GajimPlugin) or \ module_attr is GajimPlugin: continue log.debug('is subclass of GajimPlugin') module_attr.__path__ = os.path.abspath( os.path.dirname(file_path)) for option in fields: if conf.get('info', option) is '': raise configparser.NoOptionError(option, 'info') if option == 'description': setattr(module_attr, option, _(conf.get('info', option))) continue setattr(module_attr, option, conf.get('info', option)) plugins_found.append(module_attr) except TypeError: # set plugin localization try: module_attr._ = _ except AttributeError: pass except configparser.NoOptionError: # all fields are required log.debug('%s : %s' % (module_attr_name, 'wrong manifest file. all fields are required!')) except configparser.NoSectionError: # info section are required log.debug('%s : %s' % (module_attr_name, 'wrong manifest file. info section are required!')) except configparser.MissingSectionHeaderError: # info section are required log.debug('%s : %s' % (module_attr_name, 'wrong manifest file. section are required!')) sys.path.remove(path) return plugins_found def install_from_zip(self, zip_filename, owerwrite=None): ''' Install plugin from zip and return plugin ''' try: zip_file = zipfile.ZipFile(zip_filename) except zipfile.BadZipfile: # it is not zip file raise PluginsystemError(_('Archive corrupted')) except IOError: raise PluginsystemError(_('Archive empty')) if zip_file.testzip(): # CRC error raise PluginsystemError(_('Archive corrupted')) dirs = [] manifest = None for filename in zip_file.namelist(): if filename.startswith('.') or filename.startswith('/') or \ ('/' not in filename): # members not safe raise PluginsystemError(_('Archive is malformed')) if filename.endswith('/') and filename.find('/', 0, -1) < 0: dirs.append(filename.strip('/')) if 'manifest.ini' in filename.split('/')[1]: manifest = True if not manifest: return if len(dirs) > 1: raise PluginsystemError(_('Archive is malformed')) base_dir, user_dir = app.PLUGINS_DIRS plugin_dir = os.path.join(user_dir, dirs[0]) if os.path.isdir(plugin_dir): # Plugin dir already exists if not owerwrite: raise PluginsystemError(_('Plugin already exists')) self.remove_plugin(self.get_plugin_by_path(plugin_dir)) zip_file.extractall(user_dir) zip_file.close() plugins = self.scan_dir_for_plugins(plugin_dir, package=True) if not plugins: return self.add_plugin(plugins[0]) plugin = self.plugins[-1] return plugin def remove_plugin(self, plugin): ''' Deactivate and remove plugin from `plugins` list ''' def on_error(func, path, error): if func == os.path.islink: # if symlink os.unlink(path) return # access is denied or other raise PluginsystemError(error[1][1]) if plugin: if plugin.active: self.deactivate_plugin(plugin) rmtree(plugin.__path__, False, on_error) self.plugins.remove(plugin) if self._plugin_has_entry_in_global_config(plugin): self._remove_plugin_entry_in_global_config(plugin) del sys.modules[plugin.__module__.split('.')[0]] del plugin.__module__.split('.')[-1] del plugin def get_plugin_by_path(self, plugin_dir): for plugin in self.plugins: if plugin.__path__ in plugin_dir: return plugin gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/plugins/plugins_i18n.py000066400000000000000000000023561326020644600263530ustar00rootroot00000000000000# -*- coding: utf-8 -*- # ## src/plugins/plugin_installer/plugins_i18n.py ## ## Copyright (C) 2010-2011 Denis Fomin ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import locale import gettext from os import path as os_path import os from gajim.common import app APP = 'gajim_plugins' plugins_locale_dir = os_path.join(app.PLUGINS_DIRS[1], 'locale') if os.name != 'nt': locale.setlocale(locale.LC_ALL, '') gettext.bindtextdomain(APP, plugins_locale_dir) gettext.textdomain(APP) try: t = gettext.translation(APP, plugins_locale_dir) _ = t.gettext except IOError: from gajim.common import i18n _ = gettext.gettext gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/profile_window.py000066400000000000000000000354331326020644600254030ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/profile_window.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2006-2008 Jean-Marie Traissard ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## # THIS FILE IS FOR **OUR** PROFILE (when we edit our INFO) from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GLib from gi.repository import GdkPixbuf import base64 import time import logging from gajim import gtkgui_helpers from gajim import dialogs from gajim.common.const import AvatarSize from gajim.common import app from gajim.common import ged log = logging.getLogger('gajim.profile') class ProfileWindow: """ Class for our information window """ def __init__(self, account, transient_for=None): self.xml = gtkgui_helpers.get_gtk_builder('profile_window.ui') self.window = self.xml.get_object('profile_window') self.window.set_transient_for(transient_for) self.progressbar = self.xml.get_object('progressbar') self.statusbar = self.xml.get_object('statusbar') self.context_id = self.statusbar.get_context_id('profile') self.account = account self.jid = app.get_jid_from_account(account) self.dialog = None self.avatar_mime_type = None self.avatar_encoded = None self.avatar_sha = None self.message_id = self.statusbar.push(self.context_id, _('Retrieving profile…')) self.update_progressbar_timeout_id = GLib.timeout_add(100, self.update_progressbar) self.remove_statusbar_timeout_id = None # Create Image for avatar button image = Gtk.Image() self.xml.get_object('PHOTO_button').set_image(image) self.xml.connect_signals(self) app.ged.register_event_handler('vcard-published', ged.GUI1, self._nec_vcard_published) app.ged.register_event_handler('vcard-not-published', ged.GUI1, self._nec_vcard_not_published) self.window.show_all() self.xml.get_object('ok_button').grab_focus() app.connections[account].request_vcard( self._nec_vcard_received, self.jid) def on_information_notebook_switch_page(self, widget, page, page_num): GLib.idle_add(self.xml.get_object('ok_button').grab_focus) def update_progressbar(self): self.progressbar.pulse() return True # loop forever def remove_statusbar(self, message_id): self.statusbar.remove(self.context_id, message_id) self.remove_statusbar_timeout_id = None def on_profile_window_destroy(self, widget): if self.update_progressbar_timeout_id is not None: GLib.source_remove(self.update_progressbar_timeout_id) if self.remove_statusbar_timeout_id is not None: GLib.source_remove(self.remove_statusbar_timeout_id) app.ged.remove_event_handler('vcard-published', ged.GUI1, self._nec_vcard_published) app.ged.remove_event_handler('vcard-not-published', ged.GUI1, self._nec_vcard_not_published) del app.interface.instances[self.account]['profile'] if self.dialog: # Image chooser dialog self.dialog.destroy() def on_profile_window_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.window.destroy() def on_clear_button_clicked(self, widget): # empty the image button = self.xml.get_object('PHOTO_button') image = button.get_image() image.set_from_pixbuf(None) button.hide() text_button = self.xml.get_object('NOPHOTO_button') text_button.show() self.avatar_encoded = None self.avatar_sha = None self.avatar_mime_type = None def on_set_avatar_button_clicked(self, widget): def on_ok(widget, path_to_file): with open(path_to_file, 'rb') as file: data = file.read() sha = app.interface.save_avatar(data, publish=True) if sha is None: dialogs.ErrorDialog( _('Could not load image'), transient_for=self.window) return self.dialog.destroy() self.dialog = None scale = self.window.get_scale_factor() surface = app.interface.get_avatar(sha, AvatarSize.VCARD, scale) button = self.xml.get_object('PHOTO_button') image = button.get_image() image.set_from_surface(surface) button.show() text_button = self.xml.get_object('NOPHOTO_button') text_button.hide() self.avatar_sha = sha publish = app.interface.get_avatar(sha, publish=True) self.avatar_encoded = base64.b64encode(publish).decode('utf-8') self.avatar_mime_type = 'image/jpeg' def on_clear(widget): self.dialog.destroy() self.dialog = None self.on_clear_button_clicked(widget) def on_cancel(widget): self.dialog.destroy() self.dialog = None if self.dialog: self.dialog.present() else: self.dialog = dialogs.AvatarChooserDialog( on_response_ok=on_ok, on_response_cancel=on_cancel, on_response_clear=on_clear) def on_PHOTO_button_press_event(self, widget, event): """ If right-clicked, show popup """ pixbuf = self.xml.get_object('PHOTO_button').get_image().get_pixbuf() if event.button == 3 and pixbuf: # right click menu = Gtk.Menu() nick = app.config.get_per('accounts', self.account, 'name') sha = app.contacts.get_avatar_sha(self.account, self.jid) menuitem = Gtk.MenuItem.new_with_mnemonic(_('Save _As')) menuitem.connect('activate', gtkgui_helpers.on_avatar_save_as_menuitem_activate, sha, nick) menu.append(menuitem) # show clear menuitem = Gtk.MenuItem.new_with_mnemonic(_('_Clear')) menuitem.connect('activate', self.on_clear_button_clicked) menu.append(menuitem) menu.connect('selection-done', lambda w:w.destroy()) # show the menu menu.show_all() menu.attach_to_widget(widget, None) menu.popup(None, None, None, None, event.button, event.time) elif event.button == 1: # left click self.on_set_avatar_button_clicked(widget) def on_BDAY_entry_focus_out_event(self, widget, event): txt = widget.get_text() if not txt: return try: time.strptime(txt, '%Y-%m-%d') except ValueError: if not widget.is_focus(): pritext = _('Wrong date format') dialogs.ErrorDialog(pritext, _('Format of the date must be ' 'YYYY-MM-DD'), transient_for=self.window) GLib.idle_add(lambda: widget.grab_focus()) return True def set_value(self, entry_name, value): try: widget = self.xml.get_object(entry_name) val = widget.get_text() if val: value = val + ' / ' + value widget.set_text(value) except AttributeError: pass def set_values(self, vcard_): button = self.xml.get_object('PHOTO_button') image = button.get_image() text_button = self.xml.get_object('NOPHOTO_button') if not 'PHOTO' in vcard_: # set default image image.set_from_pixbuf(None) button.hide() text_button.show() for i in vcard_.keys(): if i == 'PHOTO': photo_encoded = vcard_[i]['BINVAL'] if photo_encoded == '': continue photo_decoded = base64.b64decode(photo_encoded.encode('utf-8')) pixbuf = gtkgui_helpers.get_pixbuf_from_data(photo_decoded) if pixbuf is None: continue pixbuf = pixbuf.scale_simple( AvatarSize.PROFILE, AvatarSize.PROFILE, GdkPixbuf.InterpType.BILINEAR) image.set_from_pixbuf(pixbuf) button.show() text_button.hide() continue if i == 'ADR' or i == 'TEL' or i == 'EMAIL': for entry in vcard_[i]: add_on = '_HOME' if 'WORK' in entry: add_on = '_WORK' for j in entry.keys(): self.set_value(i + add_on + '_' + j + '_entry', entry[j]) if isinstance(vcard_[i], dict): for j in vcard_[i].keys(): self.set_value(i + '_' + j + '_entry', vcard_[i][j]) else: if i == 'DESC': self.xml.get_object('DESC_textview').get_buffer().set_text( vcard_[i], len(vcard_[i].encode('utf-8'))) else: self.set_value(i + '_entry', vcard_[i]) if self.update_progressbar_timeout_id is not None: if self.message_id: self.statusbar.remove(self.context_id, self.message_id) self.message_id = self.statusbar.push(self.context_id, _('Information received')) self.remove_statusbar_timeout_id = GLib.timeout_add_seconds(3, self.remove_statusbar, self.message_id) GLib.source_remove(self.update_progressbar_timeout_id) self.progressbar.hide() self.progressbar.set_fraction(0) self.update_progressbar_timeout_id = None def _nec_vcard_received(self, jid, resource, room, vcard_): self.set_values(vcard_) def add_to_vcard(self, vcard_, entry, txt): """ Add an information to the vCard dictionary """ entries = entry.split('_') loc = vcard_ if len(entries) == 3: # We need to use lists if entries[0] not in loc: loc[entries[0]] = [] found = False for e in loc[entries[0]]: if entries[1] in e: e[entries[2]] = txt break else: loc[entries[0]].append({entries[1]: '', entries[2]: txt}) return vcard_ while len(entries) > 1: if entries[0] not in loc: loc[entries[0]] = {} loc = loc[entries[0]] del entries[0] loc[entries[0]] = txt return vcard_ def make_vcard(self): """ Make the vCard dictionary """ entries = ['FN', 'NICKNAME', 'BDAY', 'EMAIL_HOME_USERID', 'URL', 'TEL_HOME_NUMBER', 'N_FAMILY', 'N_GIVEN', 'N_MIDDLE', 'N_PREFIX', 'N_SUFFIX', 'ADR_HOME_STREET', 'ADR_HOME_EXTADR', 'ADR_HOME_LOCALITY', 'ADR_HOME_REGION', 'ADR_HOME_PCODE', 'ADR_HOME_CTRY', 'ORG_ORGNAME', 'ORG_ORGUNIT', 'TITLE', 'ROLE', 'TEL_WORK_NUMBER', 'EMAIL_WORK_USERID', 'ADR_WORK_STREET', 'ADR_WORK_EXTADR', 'ADR_WORK_LOCALITY', 'ADR_WORK_REGION', 'ADR_WORK_PCODE', 'ADR_WORK_CTRY'] vcard_ = {} for e in entries: txt = self.xml.get_object(e + '_entry').get_text() if txt != '': vcard_ = self.add_to_vcard(vcard_, e, txt) # DESC textview buff = self.xml.get_object('DESC_textview').get_buffer() start_iter = buff.get_start_iter() end_iter = buff.get_end_iter() txt = buff.get_text(start_iter, end_iter, False) if txt != '': vcard_['DESC'] = txt # Avatar if self.avatar_encoded: vcard_['PHOTO'] = {'BINVAL': self.avatar_encoded} if self.avatar_mime_type: vcard_['PHOTO']['TYPE'] = self.avatar_mime_type return vcard_, self.avatar_sha def on_ok_button_clicked(self, widget): if self.update_progressbar_timeout_id: # Operation in progress return if app.connections[self.account].connected < 2: dialogs.ErrorDialog(_('You are not connected to the server'), _('Without a connection, you can not publish your contact ' 'information.'), transient_for=self.window) return vcard_, sha = self.make_vcard() nick = '' if 'NICKNAME' in vcard_: nick = vcard_['NICKNAME'] app.connections[self.account].send_nickname(nick) if nick == '': app.connections[self.account].retract_nickname() nick = app.config.get_per('accounts', self.account, 'name') app.nicks[self.account] = nick app.connections[self.account].send_vcard(vcard_, sha) self.message_id = self.statusbar.push(self.context_id, _('Sending profile…')) self.progressbar.show() self.update_progressbar_timeout_id = GLib.timeout_add(100, self.update_progressbar) def _nec_vcard_published(self, obj): if obj.conn.name != self.account: return if self.update_progressbar_timeout_id is not None: GLib.source_remove(self.update_progressbar_timeout_id) self.update_progressbar_timeout_id = None self.window.destroy() def _nec_vcard_not_published(self, obj): if obj.conn.name != self.account: return if self.message_id: self.statusbar.remove(self.context_id, self.message_id) self.message_id = self.statusbar.push(self.context_id, _('Information NOT published')) self.remove_statusbar_timeout_id = GLib.timeout_add_seconds(3, self.remove_statusbar, self.message_id) if self.update_progressbar_timeout_id is not None: GLib.source_remove(self.update_progressbar_timeout_id) self.progressbar.set_fraction(0) self.update_progressbar_timeout_id = None dialogs.InformationDialog(_('vCard publication failed'), _('There was an error while publishing your personal information, ' 'try again later.'), transient_for=self.window) def on_cancel_button_clicked(self, widget): self.window.destroy() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/remote_control.py000066400000000000000000001022161326020644600254010ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/remote_control.py ## ## Copyright (C) 2005-2006 Andrew Sayman ## Dimitur Kirov ## Nikos Kouremenos ## Copyright (C) 2005-2014 Yann Leboulanger ## Copyright (C) 2006-2007 Travis Shirk ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2007 Lukas Petrovicky ## Julien Pivotto ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gi.repository import GLib from gi.repository import Gtk import os import base64 import mimetypes from gajim.common import app from gajim.common import helpers from time import time from gajim.dialogs import AddNewContactWindow, JoinGroupchatWindow from gajim.common import ged from gajim.common.connection_handlers_events import MessageOutgoingEvent from gajim.common.connection_handlers_events import GcMessageOutgoingEvent from gajim.common import dbus_support if dbus_support.supported: import dbus if dbus_support: import dbus.service INTERFACE = 'org.gajim.dbus.RemoteInterface' OBJ_PATH = '/org/gajim/dbus/RemoteObject' SERVICE = 'org.gajim.dbus' # type mapping # in most cases it is a utf-8 string DBUS_STRING = dbus.String # general type (for use in dicts, where all values should have the same type) DBUS_BOOLEAN = dbus.Boolean DBUS_DOUBLE = dbus.Double DBUS_INT32 = dbus.Int32 # dictionary with string key and binary value DBUS_DICT_SV = lambda : dbus.Dictionary({}, signature="sv") # dictionary with string key and value DBUS_DICT_SS = lambda : dbus.Dictionary({}, signature="ss") # empty type (there is no equivalent of None on D-Bus, but historically gajim # used 0 instead) DBUS_NONE = lambda : dbus.Int32(0) def get_dbus_struct(obj): """ Recursively go through all the items and replace them with their casted dbus equivalents """ if obj is None: return DBUS_NONE() if isinstance(obj, str): return DBUS_STRING(obj) if isinstance(obj, int): return DBUS_INT32(obj) if isinstance(obj, float): return DBUS_DOUBLE(obj) if isinstance(obj, bool): return DBUS_BOOLEAN(obj) if isinstance(obj, (list, tuple)): result = dbus.Array([get_dbus_struct(i) for i in obj], signature='v') if result == []: return DBUS_NONE() return result if isinstance(obj, dict): result = DBUS_DICT_SV() for key, value in obj.items(): result[DBUS_STRING(key)] = get_dbus_struct(value) if result == {}: return DBUS_NONE() return result # unknown type return DBUS_NONE() class Remote: def __init__(self): self.signal_object = None session_bus = dbus_support.session_bus.SessionBus() bus_name = dbus.service.BusName(SERVICE, bus=session_bus) self.signal_object = SignalObject(bus_name) app.ged.register_event_handler('version-result-received', ged.POSTGUI, self.on_os_info) app.ged.register_event_handler('time-result-received', ged.POSTGUI, self.on_time) app.ged.register_event_handler('roster-info', ged.POSTGUI, self.on_roster_info) app.ged.register_event_handler('presence-received', ged.POSTGUI, self.on_presence_received) app.ged.register_event_handler('subscribe-presence-received', ged.POSTGUI, self.on_subscribe_presence_received) app.ged.register_event_handler('subscribed-presence-received', ged.POSTGUI, self.on_subscribed_presence_received) app.ged.register_event_handler('unsubscribed-presence-received', ged.POSTGUI, self.on_unsubscribed_presence_received) app.ged.register_event_handler('gc-message-received', ged.POSTGUI, self.on_gc_message_received) app.ged.register_event_handler('our-show', ged.POSTGUI, self.on_our_status) app.ged.register_event_handler('account-created', ged.POSTGUI, self.on_account_created) app.ged.register_event_handler('vcard-received', ged.POSTGUI, self.on_vcard_received) app.ged.register_event_handler('chatstate-received', ged.POSTGUI, self.on_chatstate_received) app.ged.register_event_handler('message-sent', ged.POSTGUI, self.on_message_sent) def on_chatstate_received(self, obj): self.raise_signal('ChatState', (obj.conn.name, [ obj.jid, obj.fjid, obj.stanza, obj.resource, obj.chatstate])) def on_message_sent(self, obj): try: chatstate = obj.chatstate except AttributeError: chatstate = "" self.raise_signal('MessageSent', (obj.conn.name, [ obj.jid, obj.message, obj.keyID, chatstate])) def on_os_info(self, obj): self.raise_signal('OsInfo', (obj.conn.name, [obj.jid, obj.resource, obj.client_info, obj.os_info])) def on_time(self, obj): self.raise_signal('EntityTime', (obj.conn.name, [obj.jid, obj.resource, obj.time_info])) def on_roster_info(self, obj): self.raise_signal('RosterInfo', (obj.conn.name, [obj.jid, obj.nickname, obj.sub, obj.ask, obj.groups])) def on_presence_received(self, obj): event = None if obj.old_show < 2 and obj.new_show > 1: event = 'ContactPresence' elif obj.old_show > 1 and obj.new_show < 2: event = 'ContactAbsence' elif obj.new_show > 1: event = 'ContactStatus' if event: self.raise_signal(event, (obj.conn.name, [obj.jid, obj.show, obj.status, obj.resource, obj.prio, obj.keyID, obj.timestamp, obj.contact_nickname])) def on_subscribe_presence_received(self, obj): self.raise_signal('Subscribe', (obj.conn.name, [obj.jid, obj.status, obj.user_nick])) def on_subscribed_presence_received(self, obj): self.raise_signal('Subscribed', (obj.conn.name, [obj.jid, obj.resource])) def on_unsubscribed_presence_received(self, obj): self.raise_signal('Unsubscribed', (obj.conn.name, obj.jid)) def on_gc_message_received(self, obj): if not hasattr(obj, 'needs_highlight'): # event has not been handled at GUI level return self.raise_signal('GCMessage', (obj.conn.name, [obj.fjid, obj.msgtxt, obj.timestamp, obj.has_timestamp, obj.xhtml_msgtxt, obj.status_code, obj.displaymarking, obj.captcha_form, obj.needs_highlight])) def on_our_status(self, obj): self.raise_signal('AccountPresence', (obj.show, obj.conn.name)) def on_account_created(self, obj): self.raise_signal('NewAccount', (obj.conn.name, obj.account_info)) def on_vcard_received(self, obj): self.raise_signal('VcardInfo', (obj.conn.name, obj.vcard_dict)) def raise_signal(self, signal, arg): if self.signal_object: try: getattr(self.signal_object, signal)(get_dbus_struct(arg)) except UnicodeDecodeError: pass # ignore error when we fail to announce on dbus class SignalObject(dbus.service.Object): """ Local object definition for /org/gajim/dbus/RemoteObject This docstring is not be visible, because the clients can access only the remote object. """ def __init__(self, bus_name): self.first_show = True self.vcard_account = None # register our dbus API dbus.service.Object.__init__(self, bus_name, OBJ_PATH) @dbus.service.signal(INTERFACE, signature='av') def Roster(self, account_and_data): pass @dbus.service.signal(INTERFACE, signature='av') def AccountPresence(self, status_and_account): pass @dbus.service.signal(INTERFACE, signature='av') def ContactPresence(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def ContactAbsence(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def ContactStatus(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def NewMessage(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def Subscribe(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def Subscribed(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def Unsubscribed(self, account_and_jid): pass @dbus.service.signal(INTERFACE, signature='av') def NewAccount(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def VcardInfo(self, account_and_vcard): pass @dbus.service.signal(INTERFACE, signature='av') def OsInfo(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def EntityTime(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def GCPresence(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def GCMessage(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def RosterInfo(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def ChatState(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def MessageSent(self, account_and_array): pass def raise_signal(self, signal, arg): """ Raise a signal, with a single argument of unspecified type Instead of obj.raise_signal("Foo", bar), use obj.Foo(bar) """ getattr(self, signal)(arg) @dbus.service.method(INTERFACE, in_signature='s', out_signature='s') def get_status(self, account): """ Return status (show to be exact) which is the global one unless account is given """ if not account: # If user did not ask for account, returns the global status return DBUS_STRING(helpers.get_global_show()) # return show for the given account index = app.connections[account].connected return DBUS_STRING(app.SHOW_LIST[index]) @dbus.service.method(INTERFACE, in_signature='s', out_signature='s') def get_status_message(self, account): """ Return status which is the global one unless account is given """ if not account: # If user did not ask for account, returns the global status return DBUS_STRING(str(helpers.get_global_status())) # return show for the given account status = app.connections[account].status return DBUS_STRING(status) def _get_account_and_contact(self, account, jid): """ Get the account (if not given) and contact instance from jid """ connected_account = None contact = None accounts = app.contacts.get_accounts() # if there is only one account in roster, take it as default # if user did not ask for account if not account and len(accounts) == 1: account = accounts[0] if account: if app.connections[account].connected > 1: # account is connected connected_account = account contact = app.contacts.get_contact_with_highest_priority(account, jid) else: for account in accounts: contact = app.contacts.get_contact_with_highest_priority(account, jid) if contact and app.connections[account].connected > 1: # account is connected connected_account = account break if not contact: contact = jid return connected_account, contact def _get_account_for_groupchat(self, account, room_jid): """ Get the account which is connected to groupchat (if not given) or check if the given account is connected to the groupchat """ connected_account = None accounts = app.contacts.get_accounts() # if there is only one account in roster, take it as default # if user did not ask for account if not account and len(accounts) == 1: account = accounts[0] if account: if app.connections[account].connected > 1 and \ room_jid in app.gc_connected[account] and \ app.gc_connected[account][room_jid]: # account and groupchat are connected connected_account = account else: for account in accounts: if app.connections[account].connected > 1 and \ room_jid in app.gc_connected[account] and \ app.gc_connected[account][room_jid]: # account and groupchat are connected connected_account = account break return connected_account @dbus.service.method(INTERFACE, in_signature='sss', out_signature='b') def send_file(self, file_path, jid, account): """ Send file, located at 'file_path' to 'jid', using account (optional) 'account' """ jid = self._get_real_jid(jid, account) connected_account, contact = self._get_account_and_contact(account, jid) if connected_account: if file_path.startswith('file://'): file_path=file_path[7:] if os.path.isfile(file_path): # is it file? app.interface.instances['file_transfers'].send_file( connected_account, contact, file_path) return DBUS_BOOLEAN(True) return DBUS_BOOLEAN(False) def _send_message(self, jid, message, keyID, account, type_ = 'chat', subject = None): """ Can be called from send_chat_message (default when send_message) or send_single_message """ if not jid or not message: return DBUS_BOOLEAN(False) if not keyID: keyID = '' connected_account, contact = self._get_account_and_contact(account, jid) if connected_account: connection = app.connections[connected_account] sessions = connection.get_sessions(jid) if sessions: session = sessions[0] else: session = connection.make_new_session(jid) ctrl = app.interface.msg_win_mgr.search_control(jid, connected_account) if ctrl: ctrl.send_message(message) else: app.nec.push_outgoing_event(MessageOutgoingEvent(None, account=connected_account, jid=jid, message=message, keyID=keyID, type_=type_, control=ctrl)) return DBUS_BOOLEAN(True) return DBUS_BOOLEAN(False) @dbus.service.method(INTERFACE, in_signature='ssss', out_signature='b') def send_chat_message(self, jid, message, keyID, account): """ Send chat 'message' to 'jid', using account (optional) 'account'. If keyID is specified, encrypt the message with the pgp key """ jid = self._get_real_jid(jid, account) return self._send_message(jid, message, keyID, account) @dbus.service.method(INTERFACE, in_signature='sssss', out_signature='b') def send_single_message(self, jid, subject, message, keyID, account): """ Send single 'message' to 'jid', using account (optional) 'account'. If keyID is specified, encrypt the message with the pgp key """ jid = self._get_real_jid(jid, account) return self._send_message(jid, message, keyID, account, 'normal', subject) @dbus.service.method(INTERFACE, in_signature='sss', out_signature='b') def send_groupchat_message(self, room_jid, message, account): """ Send 'message' to groupchat 'room_jid', using account (optional) 'account' """ if not room_jid or not message: return DBUS_BOOLEAN(False) connected_account = self._get_account_for_groupchat(account, room_jid) if connected_account: connection = app.connections[connected_account] app.nec.push_outgoing_event(GcMessageOutgoingEvent(None, account=connected_account, jid=room_jid, message=message)) return DBUS_BOOLEAN(True) return DBUS_BOOLEAN(False) @dbus.service.method(INTERFACE, in_signature='sss', out_signature='b') def open_chat(self, jid, account, message): """ Shows the tabbed window for new message to 'jid', using account (optional) 'account' """ if not jid: raise dbus_support.MissingArgument() jid = self._get_real_jid(jid, account) try: jid = helpers.parse_jid(jid) except Exception: # Jid is not conform, ignore it return DBUS_BOOLEAN(False) minimized_control = None if account: accounts = [account] else: accounts = app.connections.keys() if len(accounts) == 1: account = accounts[0] connected_account = None first_connected_acct = None for acct in accounts: if app.connections[acct].connected > 1: # account is online contact = app.contacts.get_first_contact_from_jid(acct, jid) if app.interface.msg_win_mgr.has_window(jid, acct): connected_account = acct break # jid is in roster elif contact: minimized_control = \ jid in app.interface.minimized_controls[acct] connected_account = acct break # we send the message to jid not in roster, because account is # specified, or there is only one account elif account: connected_account = acct elif first_connected_acct is None: first_connected_acct = acct # if jid is not a conntact, open-chat with first connected account if connected_account is None and first_connected_acct: connected_account = first_connected_acct if minimized_control: app.interface.roster.on_groupchat_maximized(None, jid, connected_account) if connected_account: app.interface.new_chat_from_jid(connected_account, jid, message) # preserve the 'steal focus preservation' win = app.interface.msg_win_mgr.get_window(jid, connected_account).window if win.get_property('visible'): win.window.present() return DBUS_BOOLEAN(True) return DBUS_BOOLEAN(False) @dbus.service.method(INTERFACE, in_signature='sss', out_signature='b') def change_status(self, status, message, account): """ change_status(status, message, account). Account is optional - if not specified status is changed for all accounts """ if status not in ('offline', 'online', 'chat', 'away', 'xa', 'dnd', 'invisible'): status = '' if account: if not status: if account not in app.connections: return DBUS_BOOLEAN(False) status = app.SHOW_LIST[app.connections[account].connected] GLib.idle_add(app.interface.roster.send_status, account, status, message) else: # account not specified, so change the status of all accounts for acc in app.contacts.get_accounts(): if not app.config.get_per('accounts', acc, 'sync_with_global_status'): continue if status: status_ = status else: if acc not in app.connections: continue status_ = app.SHOW_LIST[app.connections[acc].connected] GLib.idle_add(app.interface.roster.send_status, acc, status_, message) return DBUS_BOOLEAN(False) @dbus.service.method(INTERFACE, in_signature='ss', out_signature='') def set_priority(self, prio, account): """ set_priority(prio, account). Account is optional - if not specified priority is changed for all accounts. That are synced with global status """ if account: app.config.set_per('accounts', account, 'priority', prio) show = app.SHOW_LIST[app.connections[account].connected] status = app.connections[account].status GLib.idle_add(app.connections[account].change_status, show, status) else: # account not specified, so change prio of all accounts for acc in app.contacts.get_accounts(): if not app.account_is_connected(acc): continue if not app.config.get_per('accounts', acc, 'sync_with_global_status'): continue app.config.set_per('accounts', acc, 'priority', prio) show = app.SHOW_LIST[app.connections[acc].connected] status = app.connections[acc].status GLib.idle_add(app.connections[acc].change_status, show, status) @dbus.service.method(INTERFACE, in_signature='', out_signature='') def show_next_pending_event(self): """ Show the window(s) with next pending event in tabbed/group chats """ if app.events.get_nb_events(): account, jid, event = app.events.get_first_systray_event() if not event: return app.interface.handle_event(account, jid, event.type_) @dbus.service.method(INTERFACE, in_signature='', out_signature='as') def list_accounts(self): """ List register accounts """ result = app.contacts.get_accounts() result_array = dbus.Array([], signature='s') if result and len(result) > 0: for account in result: result_array.append(DBUS_STRING(account)) return result_array @dbus.service.method(INTERFACE, in_signature='s', out_signature='a{ss}') def account_info(self, account): """ Show info on account: resource, jid, nick, prio, message """ result = DBUS_DICT_SS() if account in app.connections: # account is valid con = app.connections[account] index = con.connected result['status'] = DBUS_STRING(app.SHOW_LIST[index]) result['name'] = DBUS_STRING(con.name) result['jid'] = DBUS_STRING(app.get_jid_from_account(con.name)) result['message'] = DBUS_STRING(con.status) result['priority'] = DBUS_STRING(str(con.priority)) result['resource'] = DBUS_STRING(app.config.get_per('accounts', con.name, 'resource')) return result @dbus.service.method(INTERFACE, in_signature='s', out_signature='aa{sv}') def list_contacts(self, account): """ List all contacts in the roster. If the first argument is specified, then return the contacts for the specified account """ result = dbus.Array([], signature='aa{sv}') accounts = app.contacts.get_accounts() if len(accounts) == 0: return result if account: accounts_to_search = [account] else: accounts_to_search = accounts for acct in accounts_to_search: if acct in accounts: for jid in app.contacts.get_jid_list(acct): item = self._contacts_as_dbus_structure( app.contacts.get_contacts(acct, jid)) if item: result.append(item) return result @dbus.service.method(INTERFACE, in_signature='', out_signature='a{ss}') def prefs_list(self): prefs_dict = DBUS_DICT_SS() def get_prefs(data, name, path, value): if value is None: return key = '' if path is not None: for node in path: key += node + '#' key += name prefs_dict[DBUS_STRING(key)] = DBUS_STRING(value) app.config.foreach(get_prefs) return prefs_dict @dbus.service.method(INTERFACE, in_signature='', out_signature='b') def prefs_store(self): try: app.interface.save_config() except Exception: return DBUS_BOOLEAN(False) return DBUS_BOOLEAN(True) @dbus.service.method(INTERFACE, in_signature='s', out_signature='b') def prefs_del(self, key): if not key: return DBUS_BOOLEAN(False) key_path = key.split('#', 2) if len(key_path) != 3: return DBUS_BOOLEAN(False) if key_path[2] == '*': app.config.del_per(key_path[0], key_path[1]) else: app.config.del_per(key_path[0], key_path[1], key_path[2]) return DBUS_BOOLEAN(True) @dbus.service.method(INTERFACE, in_signature='s', out_signature='b') def prefs_put(self, key): if not key: return DBUS_BOOLEAN(False) key_path = key.split('#', 2) if len(key_path) < 3: subname, value = key.split('=', 1) app.config.set(subname, value) return DBUS_BOOLEAN(True) subname, value = key_path[2].split('=', 1) app.config.set_per(key_path[0], key_path[1], subname, value) return DBUS_BOOLEAN(True) @dbus.service.method(INTERFACE, in_signature='ss', out_signature='b') def add_contact(self, jid, account): if account: if account in app.connections and \ app.connections[account].connected > 1: # if given account is active, use it AddNewContactWindow(account = account, jid = jid) else: # wrong account return DBUS_BOOLEAN(False) else: # if account is not given, show account combobox AddNewContactWindow(account = None, jid = jid) return DBUS_BOOLEAN(True) @dbus.service.method(INTERFACE, in_signature='ss', out_signature='b') def remove_contact(self, jid, account): jid = self._get_real_jid(jid, account) accounts = app.contacts.get_accounts() # if there is only one account in roster, take it as default if account: accounts = [account] contact_exists = False for account in accounts: contacts = app.contacts.get_contacts(account, jid) if contacts: app.connections[account].unsubscribe(jid) for contact in contacts: app.interface.roster.remove_contact(contact, account) app.contacts.remove_jid(account, jid) contact_exists = True return DBUS_BOOLEAN(contact_exists) def _is_first(self): if self.first_show: self.first_show = False return True return False def _get_real_jid(self, jid, account = None): """ Get the real jid from the given one: removes xmpp: or get jid from nick if account is specified, search only in this account """ if account: accounts = [account] else: accounts = app.connections.keys() if jid.startswith('xmpp:'): return jid[5:] # len('xmpp:') = 5 nick_in_roster = None # Is jid a nick ? for account in accounts: # Does jid exists in roster of one account ? if app.contacts.get_contacts(account, jid): return jid if not nick_in_roster: # look in all contact if one has jid as nick for jid_ in app.contacts.get_jid_list(account): c = app.contacts.get_contacts(account, jid_) if c[0].name == jid: nick_in_roster = jid_ break if nick_in_roster: # We have not found jid in roster, but we found is as a nick return nick_in_roster # We have not found it as jid nor as nick, probably a not in roster jid return jid def _contacts_as_dbus_structure(self, contacts): """ Get info from list of Contact objects and create dbus dict """ if not contacts: return None prim_contact = None # primary contact for contact in contacts: if prim_contact is None or contact.priority > prim_contact.priority: prim_contact = contact contact_dict = DBUS_DICT_SV() contact_dict['name'] = DBUS_STRING(prim_contact.name) contact_dict['show'] = DBUS_STRING(prim_contact.show) contact_dict['jid'] = DBUS_STRING(prim_contact.jid) if prim_contact.keyID: keyID = None if len(prim_contact.keyID) == 8: keyID = prim_contact.keyID elif len(prim_contact.keyID) == 16: keyID = prim_contact.keyID[8:] if keyID: contact_dict['openpgp'] = keyID contact_dict['resources'] = dbus.Array([], signature='(sis)') for contact in contacts: resource_props = dbus.Struct((DBUS_STRING(contact.resource), dbus.Int32(contact.priority), DBUS_STRING(contact.status))) contact_dict['resources'].append(resource_props) contact_dict['groups'] = dbus.Array([], signature='(s)') for group in prim_contact.groups: contact_dict['groups'].append((DBUS_STRING(group),)) return contact_dict @dbus.service.method(INTERFACE, in_signature='', out_signature='s') def get_unread_msgs_number(self): return DBUS_STRING(str(app.events.get_nb_events())) @dbus.service.method(INTERFACE, in_signature='s', out_signature='b') def start_chat(self, account): if not account: # error is shown in gajim-remote check_arguments(..) return DBUS_BOOLEAN(False) app.app.activate_action('start-chat') return DBUS_BOOLEAN(True) @dbus.service.method(INTERFACE, in_signature='ss', out_signature='') def send_xml(self, xml, account): if account: app.connections[account].send_stanza(str(xml)) else: for acc in app.contacts.get_accounts(): app.connections[acc].send_stanza(str(xml)) @dbus.service.method(INTERFACE, in_signature='ss', out_signature='') def change_avatar(self, picture, account): filesize = os.path.getsize(picture) invalid_file = False if os.path.isfile(picture): stat = os.stat(picture) if stat[6] == 0: invalid_file = True else: invalid_file = True if not invalid_file and filesize < 16384: with open(picture, 'rb') as fd: data = fd.read() sha = app.interface.save_avatar(data, publish=True) if sha is None: return app.config.set_per('accounts', self.name, 'avatar_sha', sha) data = app.interface.get_avatar(sha, publish=True) avatar = base64.b64encode(data).decode('utf-8') avatar_mime_type = mimetypes.guess_type(picture)[0] vcard = {} vcard['PHOTO'] = {'BINVAL': avatar} if avatar_mime_type: vcard['PHOTO']['TYPE'] = avatar_mime_type if account: app.connections[account].send_vcard(vcard, sha) else: for acc in app.connections: app.connections[acc].send_vcard(vcard, sha) @dbus.service.method(INTERFACE, in_signature='ssss', out_signature='') def join_room(self, room_jid, nick, password, account): if not account: # get the first connected account accounts = app.connections.keys() for acct in accounts: if app.account_is_connected(acct): if not app.connections[acct].is_zeroconf: account = acct break if not account: return if app.connections[account].is_zeroconf: # zeroconf not support groupchats return if not nick: app.interface.join_gc_minimal(account, room_jid) else: app.interface.join_gc_room(account, room_jid, nick, password) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/roster_window.py000066400000000000000000007512331326020644600252640ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## src/roster_window.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2005 Alex Mauer ## Stéphan Kochen ## Copyright (C) 2005-2006 Dimitur Kirov ## Copyright (C) 2005-2007 Travis Shirk ## Nikos Kouremenos ## Copyright (C) 2006 Stefan Bethge ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2007 Lukas Petrovicky ## James Newton ## Tomasz Melcer ## Julien Pivotto ## Copyright (C) 2007-2008 Stephan Erb ## Copyright (C) 2008 Brendan Taylor ## Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GdkPixbuf from gi.repository import Pango from gi.repository import GObject from gi.repository import GLib from gi.repository import Gio import os import sys import time import locale from enum import IntEnum, unique from gajim.common import sleepy from gajim import history_window from gajim import dialogs from gajim import vcard from gajim import config from gajim import disco from gajim import gtkgui_helpers from gajim import gui_menu_builder from gajim import cell_renderer_image from gajim import tooltips from gajim import message_control from gajim import adhoc_commands from gajim.common.const import AvatarSize from gajim.common import app from gajim.common import helpers from gajim.common.exceptions import GajimGeneralException from gajim.common import i18n if app.HAVE_GEOCLUE: from gajim.common import location_listener from gajim.common import ged from gajim.message_window import MessageWindowMgr from nbxmpp.protocol import NS_FILE, NS_ROSTERX, NS_CONFERENCE @unique class Column(IntEnum): IMG = 0 # image to show state (online, new message etc) NAME = 1 # cellrenderer text that holds contact nickame TYPE = 2 # account, group or contact? JID = 3 # the jid of the row ACCOUNT = 4 # cellrenderer text that holds account name MOOD_PIXBUF = 5 ACTIVITY_PIXBUF = 6 TUNE_PIXBUF = 7 LOCATION_PIXBUF = 8 AVATAR_IMG = 9 # avatar_sha PADLOCK_PIXBUF = 10 # use for account row only VISIBLE = 11 empty_pixbuf = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, 1, 1) empty_pixbuf.fill(0xffffff00) class RosterWindow: """ Class for main window of the GTK+ interface """ def _get_account_iter(self, name, model=None): """ Return the Gtk.TreeIter of the given account or None if not found Keyword arguments: name -- the account name model -- the data model (default TreeFilterModel) """ if model is None: model = self.modelfilter if model is None: return if self.regroup: name = 'MERGED' if name not in self._iters: return None it = self._iters[name]['account'] if model == self.model or it is None: return it try: (ok, it) = self.modelfilter.convert_child_iter_to_iter(it) if ok: return it return None except RuntimeError: return None def _get_group_iter(self, name, account, model=None): """ Return the Gtk.TreeIter of the given group or None if not found Keyword arguments: name -- the group name account -- the account name model -- the data model (default TreeFilterModel) """ if model is None: model = self.modelfilter if model is None: return if self.regroup: account = 'MERGED' if account not in self._iters: return None if name not in self._iters[account]['groups']: return None it = self._iters[account]['groups'][name] if model == self.model or it is None: return it try: (ok, it) = self.modelfilter.convert_child_iter_to_iter(it) if ok: return it return None except RuntimeError: return None def _get_self_contact_iter(self, account, model=None): """ Return the Gtk.TreeIter of SelfContact or None if not found Keyword arguments: account -- the account of SelfContact model -- the data model (default TreeFilterModel) """ jid = app.get_jid_from_account(account) its = self._get_contact_iter(jid, account, model=model) if its: return its[0] return None def _get_contact_iter(self, jid, account, contact=None, model=None): """ Return a list of Gtk.TreeIter of the given contact Keyword arguments: jid -- the jid without resource account -- the account contact -- the contact (default None) model -- the data model (default TreeFilterModel) """ if model is None: model = self.modelfilter # when closing Gajim model can be none (async pbs?) if model is None: return [] if not contact: contact = app.contacts.get_first_contact_from_jid(account, jid) if not contact: # We don't know this contact return [] if account not in self._iters: return [] if jid not in self._iters[account]['contacts']: return [] its = self._iters[account]['contacts'][jid] if not its: return [] if model == self.model: return its its2 = [] for it in its: try: (ok, it) = self.modelfilter.convert_child_iter_to_iter(it) if ok: its2.append(it) except RuntimeError: pass return its2 @staticmethod def _iter_is_separator(model, titer): """ Return True if the given iter is a separator Keyword arguments: model -- the data model iter -- the Gtk.TreeIter to test """ if model[titer][0] == 'SEPARATOR': return True return False @staticmethod def _status_cell_data_func(cell_layout, cell, tree_model, iter_): if isinstance(cell, Gtk.CellRendererPixbuf): icon_name = tree_model[iter_][1] if icon_name is None: return if tree_model[iter_][2] == 'status': cell.set_property('icon_name', icon_name) else: iconset_name = gtkgui_helpers.get_iconset_name_for(icon_name) cell.set_property('icon_name', iconset_name) else: show = tree_model[iter_][0] id_ = tree_model[iter_][2] if id_ not in ('status', 'desync'): show = helpers.get_uf_show(show) cell.set_property('text', show) ############################################################################# ### Methods for adding and removing roster window items ############################################################################# def add_account(self, account): """ Add account to roster and draw it. Do nothing if it is already in """ if self._get_account_iter(account): # Will happen on reconnect or for merged accounts return if self.regroup: # Merged accounts view show = helpers.get_global_show() it = self.model.append(None, [ app.interface.jabber_state_images['16'][show], _('Merged accounts'), 'account', '', 'all', None, None, None, None, None, None, True] + [None] * self.nb_ext_renderers) self._iters['MERGED']['account'] = it else: show = app.SHOW_LIST[app.connections[account].connected] our_jid = app.get_jid_from_account(account) tls_pixbuf = None if app.account_is_securely_connected(account): tls_pixbuf = 'changes-prevent' it = self.model.append(None, [ app.interface.jabber_state_images['16'][show], GLib.markup_escape_text(account), 'account', our_jid, account, None, None, None, None, None, tls_pixbuf, True] + [None] * self.nb_ext_renderers) self._iters[account]['account'] = it self.draw_account(account) def add_account_contacts(self, account, improve_speed=True, draw_contacts=True): """ Add all contacts and groups of the given account to roster, draw them and account """ if improve_speed: self._before_fill() jids = app.contacts.get_jid_list(account) for jid in jids: self.add_contact(jid, account) if draw_contacts: # Do not freeze the GUI when drawing the contacts if jids: # Overhead is big, only invoke when needed self._idle_draw_jids_of_account(jids, account) # Draw all known groups for group in app.groups[account]: self.draw_group(group, account) self.draw_account(account) if improve_speed: self._after_fill() def _add_group_iter(self, account, group): """ Add a group iter in roster and return the newly created iter """ if self.regroup: account_group = 'MERGED' else: account_group = account delimiter = app.connections[account].nested_group_delimiter group_splited = group.split(delimiter) parent_group = delimiter.join(group_splited[:-1]) if len(group_splited) > 1 and parent_group in self._iters[account_group]['groups']: iter_parent = self._iters[account_group]['groups'][parent_group] elif parent_group: iter_parent = self._add_group_iter(account, parent_group) if parent_group not in app.groups[account]: if account + parent_group in self.collapsed_rows: is_expanded = False else: is_expanded = True app.groups[account][parent_group] = {'expand': is_expanded} else: iter_parent = self._get_account_iter(account, self.model) iter_group = self.model.append(iter_parent, [app.interface.jabber_state_images['16']['closed'], GLib.markup_escape_text(group), 'group', group, account, None, None, None, None, None, None, False] + [None] * self.nb_ext_renderers) self.draw_group(group, account) self._iters[account_group]['groups'][group] = iter_group return iter_group def _add_entity(self, contact, account, groups=None, big_brother_contact=None, big_brother_account=None): """ Add the given contact to roster data model Contact is added regardless if he is already in roster or not. Return list of newly added iters. Keyword arguments: contact -- the contact to add account -- the contacts account groups -- list of groups to add the contact to. (default groups in contact.get_shown_groups()). Parameter ignored when big_brother_contact is specified. big_brother_contact -- if specified contact is added as child big_brother_contact. (default None) """ added_iters = [] visible = self.contact_is_visible(contact, account) if big_brother_contact: # Add contact under big brother parent_iters = self._get_contact_iter( big_brother_contact.jid, big_brother_account, big_brother_contact, self.model) assert len(parent_iters) > 0, 'Big brother is not yet in roster!' # Do not confuse get_contact_iter: Sync groups of family members contact.groups = big_brother_contact.groups[:] for child_iter in parent_iters: it = self.model.append(child_iter, [None, contact.get_shown_name(), 'contact', contact.jid, account, None, None, None, None, None, None, visible] + \ [None] * self.nb_ext_renderers) added_iters.append(it) if contact.jid in self._iters[account]['contacts']: self._iters[account]['contacts'][contact.jid].append(it) else: self._iters[account]['contacts'][contact.jid] = [it] else: # We are a normal contact. Add us to our groups. if not groups: groups = contact.get_shown_groups() for group in groups: child_iterG = self._get_group_iter(group, account, model=self.model) if not child_iterG: # Group is not yet in roster, add it! child_iterG = self._add_group_iter(account, group) if contact.is_transport(): typestr = 'agent' elif contact.is_groupchat(): typestr = 'groupchat' else: typestr = 'contact' # we add some values here. see draw_contact # for more i_ = self.model.append(child_iterG, [None, contact.get_shown_name(), typestr, contact.jid, account, None, None, None, None, None, None, visible] + \ [None] * self.nb_ext_renderers) added_iters.append(i_) if contact.jid in self._iters[account]['contacts']: self._iters[account]['contacts'][contact.jid].append(i_) else: self._iters[account]['contacts'][contact.jid] = [i_] # Restore the group expand state if account + group in self.collapsed_rows: is_expanded = False else: is_expanded = True if group not in app.groups[account]: app.groups[account][group] = {'expand': is_expanded} assert len(added_iters), '%s has not been added to roster!' % \ contact.jid return added_iters def _remove_entity(self, contact, account, groups=None): """ Remove the given contact from roster data model Empty groups after contact removal are removed too. Return False if contact still has children and deletion was not performed. Return True on success. Keyword arguments: contact -- the contact to add account -- the contacts account groups -- list of groups to remove the contact from. """ iters = self._get_contact_iter(contact.jid, account, contact, self.model) assert iters, '%s shall be removed but is not in roster' % contact.jid parent_iter = self.model.iter_parent(iters[0]) parent_type = self.model[parent_iter][Column.TYPE] if groups: # Only remove from specified groups all_iters = iters[:] group_iters = [self._get_group_iter(group, account) for group in groups] iters = [titer for titer in all_iters if self.model.iter_parent(titer) in group_iters] iter_children = self.model.iter_children(iters[0]) if iter_children: # We have children. We cannot be removed! return False # Remove us and empty groups from the model for i in iters: assert self.model[i][Column.JID] == contact.jid and \ self.model[i][Column.ACCOUNT] == account, \ "Invalidated iters of %s" % contact.jid parent_i = self.model.iter_parent(i) parent_type = self.model[parent_i][Column.TYPE] to_be_removed = i while parent_type == 'group' and \ self.model.iter_n_children(parent_i) == 1: if self.regroup: account_group = 'MERGED' else: account_group = account group = self.model[parent_i][Column.JID] if group in app.groups[account]: del app.groups[account][group] to_be_removed = parent_i del self._iters[account_group]['groups'][group] parent_i = self.model.iter_parent(parent_i) parent_type = self.model[parent_i][Column.TYPE] self.model.remove(to_be_removed) del self._iters[account]['contacts'][contact.jid] return True def _add_metacontact_family(self, family, account): """ Add the give Metacontact family to roster data model Add Big Brother to his groups and all others under him. Return list of all added (contact, account) tuples with Big Brother as first element. Keyword arguments: family -- the family, see Contacts.get_metacontacts_family() """ nearby_family, big_brother_jid, big_brother_account = \ self._get_nearby_family_and_big_brother(family, account) if not big_brother_jid: return [] big_brother_contact = app.contacts.get_first_contact_from_jid( big_brother_account, big_brother_jid) assert len(self._get_contact_iter(big_brother_jid, big_brother_account, big_brother_contact, self.model)) == 0, \ 'Big brother %s already in roster\n Family: %s' \ % (big_brother_jid, family) self._add_entity(big_brother_contact, big_brother_account) brothers = [] # Filter family members for data in nearby_family: _account = data['account'] _jid = data['jid'] _contact = app.contacts.get_first_contact_from_jid( _account, _jid) if not _contact or _contact == big_brother_contact: # Corresponding account is not connected # or brother already added continue assert len(self._get_contact_iter(_jid, _account, _contact, self.model)) == 0, \ "%s already in roster.\n Family: %s" % (_jid, nearby_family) self._add_entity(_contact, _account, big_brother_contact = big_brother_contact, big_brother_account = big_brother_account) brothers.append((_contact, _account)) brothers.insert(0, (big_brother_contact, big_brother_account)) return brothers def _remove_metacontact_family(self, family, account): """ Remove the given Metacontact family from roster data model See Contacts.get_metacontacts_family() and RosterWindow._remove_entity() """ nearby_family = self._get_nearby_family_and_big_brother( family, account)[0] # Family might has changed (actual big brother not on top). # Remove childs first then big brother family_in_roster = False for data in nearby_family: _account = data['account'] _jid = data['jid'] _contact = app.contacts.get_first_contact_from_jid(_account, _jid) iters = self._get_contact_iter(_jid, _account, _contact, self.model) if not iters or not _contact: # Family might not be up to date. # Only try to remove what is actually in the roster continue assert iters, '%s shall be removed but is not in roster \ \n Family: %s' % (_jid, family) family_in_roster = True parent_iter = self.model.iter_parent(iters[0]) parent_type = self.model[parent_iter][Column.TYPE] if parent_type != 'contact': # The contact on top old_big_account = _account old_big_contact = _contact old_big_jid = _jid continue ok = self._remove_entity(_contact, _account) assert ok, '%s was not removed' % _jid assert len(self._get_contact_iter(_jid, _account, _contact, self.model)) == 0, '%s is removed but still in roster' % _jid if not family_in_roster: return False assert old_big_jid, 'No Big Brother in nearby family %s (Family: %s)' %\ (nearby_family, family) iters = self._get_contact_iter(old_big_jid, old_big_account, old_big_contact, self.model) assert len(iters) > 0, 'Old Big Brother %s is not in roster anymore' % \ old_big_jid assert not self.model.iter_children(iters[0]), \ 'Old Big Brother %s still has children' % old_big_jid ok = self._remove_entity(old_big_contact, old_big_account) assert ok, "Old Big Brother %s not removed" % old_big_jid assert len(self._get_contact_iter(old_big_jid, old_big_account, old_big_contact, self.model)) == 0, \ 'Old Big Brother %s is removed but still in roster' % old_big_jid return True def _recalibrate_metacontact_family(self, family, account): """ Regroup metacontact family if necessary """ brothers = [] nearby_family, big_brother_jid, big_brother_account = \ self._get_nearby_family_and_big_brother(family, account) big_brother_contact = app.contacts.get_contact(big_brother_account, big_brother_jid) child_iters = self._get_contact_iter(big_brother_jid, big_brother_account, model=self.model) if child_iters: parent_iter = self.model.iter_parent(child_iters[0]) parent_type = self.model[parent_iter][Column.TYPE] # Check if the current BigBrother has even been before. if parent_type == 'contact': for data in nearby_family: # recalibrate after remove to keep highlight if data['jid'] in app.to_be_removed[data['account']]: return self._remove_metacontact_family(family, account) brothers = self._add_metacontact_family(family, account) for c, acc in brothers: self.draw_completely(c.jid, acc) # Check is small brothers are under the big brother for child in nearby_family: _jid = child['jid'] _account = child['account'] if _account == big_brother_account and _jid == big_brother_jid: continue child_iters = self._get_contact_iter(_jid, _account, model=self.model) if not child_iters: continue parent_iter = self.model.iter_parent(child_iters[0]) parent_type = self.model[parent_iter][Column.TYPE] if parent_type != 'contact': _contact = app.contacts.get_contact(_account, _jid) self._remove_entity(_contact, _account) self._add_entity(_contact, _account, groups=None, big_brother_contact=big_brother_contact, big_brother_account=big_brother_account) def _get_nearby_family_and_big_brother(self, family, account): return app.contacts.get_nearby_family_and_big_brother(family, account) def _add_self_contact(self, account): """ Add account's SelfContact to roster and draw it and the account Return the SelfContact contact instance """ jid = app.get_jid_from_account(account) contact = app.contacts.get_first_contact_from_jid(account, jid) assert len(self._get_contact_iter(jid, account, contact, self.model)) == 0, 'Self contact %s already in roster' % jid child_iterA = self._get_account_iter(account, self.model) self._iters[account]['contacts'][jid] = [self.model.append(child_iterA, [None, app.nicks[account], 'self_contact', jid, account, None, None, None, None, None, None, True] + [None] * self.nb_ext_renderers)] self.draw_completely(jid, account) self.draw_account(account) return contact def redraw_metacontacts(self, account): for family in app.contacts.iter_metacontacts_families(account): self._recalibrate_metacontact_family(family, account) def add_contact(self, jid, account): """ Add contact to roster and draw him Add contact to all its group and redraw the groups, the contact and the account. If it's a Metacontact, add and draw the whole family. Do nothing if the contact is already in roster. Return the added contact instance. If it is a Metacontact return Big Brother. Keyword arguments: jid -- the contact's jid or SelfJid to add SelfContact account -- the corresponding account. """ contact = app.contacts.get_contact_with_highest_priority(account, jid) if len(self._get_contact_iter(jid, account, contact, self.model)): # If contact already in roster, do nothing return if jid == app.get_jid_from_account(account): show_self_contact = app.config.get('show_self_contact') if show_self_contact == 'never': return if (contact.resource != app.connections[account].server_resource \ and show_self_contact == 'when_other_resource') or \ show_self_contact == 'always': return self._add_self_contact(account) return is_observer = contact.is_observer() if is_observer: # if he has a tag, remove it app.contacts.remove_metacontact(account, jid) # Add contact to roster family = app.contacts.get_metacontacts_family(account, jid) contacts = [] if family: # We have a family. So we are a metacontact. # Add all family members that we shall be grouped with if self.regroup: # remove existing family members to regroup them self._remove_metacontact_family(family, account) contacts = self._add_metacontact_family(family, account) else: # We are a normal contact contacts = [(contact, account), ] self._add_entity(contact, account) # Draw the contact and its groups contact if not self.starting: for c, acc in contacts: self.draw_completely(c.jid, acc) for group in contact.get_shown_groups(): self.draw_group(group, account) self._adjust_group_expand_collapse_state(group, account) self.draw_account(account) return contacts[0][0] # it's contact/big brother with highest priority def remove_contact(self, jid, account, force=False, backend=False): """ Remove contact from roster Remove contact from all its group. Remove empty groups or redraw otherwise. Draw the account. If it's a Metacontact, remove the whole family. Do nothing if the contact is not in roster. Keyword arguments: jid -- the contact's jid or SelfJid to remove SelfContact account -- the corresponding account. force -- remove contact even it has pending evens (Default False) backend -- also remove contact instance (Default False) """ contact = app.contacts.get_contact_with_highest_priority(account, jid) if not contact: return if not force and self.contact_has_pending_roster_events(contact, account): return False iters = self._get_contact_iter(jid, account, contact, self.model) if iters: # no more pending events # Remove contact from roster directly family = app.contacts.get_metacontacts_family(account, jid) if family: # We have a family. So we are a metacontact. self._remove_metacontact_family(family, account) else: self._remove_entity(contact, account) old_grps = [] if backend: if not app.interface.msg_win_mgr.get_control(jid, account) or \ force: # If a window is still opened: don't remove contact instance # Remove contact before redrawing, otherwise the old # numbers will still be show app.contacts.remove_jid(account, jid, remove_meta=True) if iters: rest_of_family = [data for data in family if account != data['account'] or jid != data['jid']] if rest_of_family: # reshow the rest of the family brothers = self._add_metacontact_family(rest_of_family, account) for c, acc in brothers: self.draw_completely(c.jid, acc) else: for c in app.contacts.get_contacts(account, jid): c.sub = 'none' c.show = 'not in roster' c.status = '' old_grps = c.get_shown_groups() c.groups = [_('Not in Roster')] self._add_entity(c, account) self.draw_contact(jid, account) if iters: # Draw all groups of the contact for group in contact.get_shown_groups() + old_grps: self.draw_group(group, account) self.draw_account(account) return True def rename_self_contact(self, old_jid, new_jid, account): """ Rename the self_contact jid Keyword arguments: old_jid -- our old jid new_jid -- our new jid account -- the corresponding account. """ app.contacts.change_contact_jid(old_jid, new_jid, account) self_iter = self._get_self_contact_iter(account, model=self.model) if not self_iter: return self.model[self_iter][Column.JID] = new_jid self.draw_contact(new_jid, account) def add_groupchat(self, jid, account, status=''): """ Add groupchat to roster and draw it. Return the added contact instance """ contact = app.contacts.get_contact_with_highest_priority(account, jid) # Do not show gc if we are disconnected and minimize it if app.account_is_connected(account): show = 'online' else: show = 'offline' status = '' if contact is None: gc_control = app.interface.msg_win_mgr.get_gc_control(jid, account) if gc_control: # there is a window that we can minimize app.interface.minimized_controls[account][jid] = gc_control name = gc_control.name elif jid in app.interface.minimized_controls[account]: name = app.interface.minimized_controls[account][jid].name else: name = jid.split('@')[0] # New groupchat contact = app.contacts.create_contact(jid=jid, account=account, name=name, groups=[_('Groupchats')], show=show, status=status, sub='none') app.contacts.add_contact(account, contact) self.add_contact(jid, account) else: if jid not in app.interface.minimized_controls[account]: # there is a window that we can minimize gc_control = app.interface.msg_win_mgr.get_gc_control(jid, account) app.interface.minimized_controls[account][jid] = gc_control contact.show = show contact.status = status self.adjust_and_draw_contact_context(jid, account) return contact def remove_groupchat(self, jid, account): """ Remove groupchat from roster and redraw account and group """ contact = app.contacts.get_contact_with_highest_priority(account, jid) if contact.is_groupchat(): if jid in app.interface.minimized_controls[account]: del app.interface.minimized_controls[account][jid] self.remove_contact(jid, account, force=True, backend=True) return True else: return False # FIXME: This function is yet unused! Port to new API def add_transport(self, jid, account): """ Add transport to roster and draw it. Return the added contact instance """ contact = app.contacts.get_contact_with_highest_priority(account, jid) if contact is None: contact = app.contacts.create_contact(jid=jid, account=account, name=jid, groups=[_('Transports')], show='offline', status='offline', sub='from') app.contacts.add_contact(account, contact) self.add_contact(jid, account) return contact def remove_transport(self, jid, account): """ Remove transport from roster and redraw account and group """ self.remove_contact(jid, account, force=True, backend=True) return True def rename_group(self, old_name, new_name, account): """ Rename a roster group """ if old_name == new_name: return # Groups may not change name from or to a special groups for g in helpers.special_groups: if g in (new_name, old_name): return # update all contacts in the given group if self.regroup: accounts = app.connections.keys() else: accounts = [account, ] for acc in accounts: changed_contacts = [] for jid in app.contacts.get_jid_list(acc): contact = app.contacts.get_first_contact_from_jid(acc, jid) if old_name not in contact.groups: continue self.remove_contact(jid, acc, force=True) contact.groups.remove(old_name) if new_name not in contact.groups: contact.groups.append(new_name) changed_contacts.append({'jid': jid, 'name': contact.name, 'groups':contact.groups}) app.connections[acc].update_contacts(changed_contacts) for c in changed_contacts: self.add_contact(c['jid'], acc) self._adjust_group_expand_collapse_state(new_name, acc) self.draw_group(old_name, acc) self.draw_group(new_name, acc) def add_contact_to_groups(self, jid, account, groups, update=True): """ Add contact to given groups and redraw them Contact on server is updated too. When the contact has a family, the action will be performed for all members. Keyword Arguments: jid -- the jid account -- the corresponding account groups -- list of Groups to add the contact to. update -- update contact on the server """ self.remove_contact(jid, account, force=True) for contact in app.contacts.get_contacts(account, jid): for group in groups: if group not in contact.groups: # we might be dropped from meta to group contact.groups.append(group) if update: app.connections[account].update_contact(jid, contact.name, contact.groups) self.add_contact(jid, account) for group in groups: self._adjust_group_expand_collapse_state(group, account) def remove_contact_from_groups(self, jid, account, groups, update=True): """ Remove contact from given groups and redraw them Contact on server is updated too. When the contact has a family, the action will be performed for all members. Keyword Arguments: jid -- the jid account -- the corresponding account groups -- list of Groups to remove the contact from update -- update contact on the server """ self.remove_contact(jid, account, force=True) for contact in app.contacts.get_contacts(account, jid): for group in groups: if group in contact.groups: # Needed when we remove from "General" or "Observers" contact.groups.remove(group) if update: app.connections[account].update_contact(jid, contact.name, contact.groups) self.add_contact(jid, account) # Also redraw old groups for group in groups: self.draw_group(group, account) # FIXME: maybe move to app.py def remove_newly_added(self, jid, account): if account not in app.newly_added: # Account has been deleted during the timeout that called us return if jid in app.newly_added[account]: app.newly_added[account].remove(jid) self.draw_contact(jid, account) # FIXME: maybe move to app.py def remove_to_be_removed(self, jid, account): if account not in app.interface.instances: # Account has been deleted during the timeout that called us return if jid in app.newly_added[account]: return if jid in app.to_be_removed[account]: app.to_be_removed[account].remove(jid) family = app.contacts.get_metacontacts_family(account, jid) if family: # Peform delayed recalibration self._recalibrate_metacontact_family(family, account) self.draw_contact(jid, account) # Hide Group if all childs are hidden contact = app.contacts.get_contact(account, jid) if not contact: return for group in contact.get_shown_groups(): self.draw_group(group, account) # FIXME: integrate into add_contact() def add_to_not_in_the_roster(self, account, jid, nick='', resource=''): keyID = '' attached_keys = app.config.get_per('accounts', account, 'attached_gpg_keys').split() if jid in attached_keys: keyID = attached_keys[attached_keys.index(jid) + 1] contact = app.contacts.create_not_in_roster_contact(jid=jid, account=account, resource=resource, name=nick, keyID=keyID) app.contacts.add_contact(account, contact) self.add_contact(contact.jid, account) return contact ################################################################################ ### Methods for adding and removing roster window items ################################################################################ def _really_draw_account(self, account): child_iter = self._get_account_iter(account, self.model) if not child_iter: assert False, 'Account iter of %s could not be found.' % account return num_of_accounts = app.get_number_of_connected_accounts() num_of_secured = app.get_number_of_securely_connected_accounts() tls_pixbuf = None if app.account_is_securely_connected(account) and not self.regroup or\ self.regroup and num_of_secured and num_of_secured == num_of_accounts: tls_pixbuf = 'changes-prevent' self.model[child_iter][Column.PADLOCK_PIXBUF] = tls_pixbuf if self.regroup: account_name = _('Merged accounts') accounts = [] else: acclabel = app.config.get_per('accounts', account, 'account_label') account_name = acclabel or account accounts = [account] if account in self.collapsed_rows and \ self.model.iter_has_child(child_iter): account_name = '[%s]' % account_name if (app.account_is_connected(account) or (self.regroup and \ app.get_number_of_connected_accounts())) and app.config.get( 'show_contacts_number'): nbr_on, nbr_total = app.contacts.get_nb_online_total_contacts( accounts = accounts) account_name += ' (%s/%s)' % (repr(nbr_on), repr(nbr_total)) self.model[child_iter][Column.NAME] = GLib.markup_escape_text(account_name) pep_dict = app.connections[account].pep if app.config.get('show_mood_in_roster') and 'mood' in pep_dict: self.model[child_iter][Column.MOOD_PIXBUF] = \ gtkgui_helpers.get_pep_as_pixbuf(pep_dict['mood']) else: self.model[child_iter][Column.MOOD_PIXBUF] = empty_pixbuf if app.config.get('show_activity_in_roster') and 'activity' in \ pep_dict: self.model[child_iter][Column.ACTIVITY_PIXBUF] = \ gtkgui_helpers.get_pep_as_pixbuf(pep_dict['activity']) else: self.model[child_iter][Column.ACTIVITY_PIXBUF] = empty_pixbuf if app.config.get('show_tunes_in_roster') and 'tune' in pep_dict: self.model[child_iter][Column.TUNE_PIXBUF] = \ gtkgui_helpers.get_pep_as_pixbuf(pep_dict['tune']) else: self.model[child_iter][Column.TUNE_PIXBUF] = empty_pixbuf if app.config.get('show_location_in_roster') and 'location' in \ pep_dict: self.model[child_iter][Column.LOCATION_PIXBUF] = \ gtkgui_helpers.get_pep_as_pixbuf(pep_dict['location']) else: self.model[child_iter][Column.LOCATION_PIXBUF] = empty_pixbuf def _really_draw_accounts(self): for acct in self.accounts_to_draw: self._really_draw_account(acct) self.accounts_to_draw = [] return False def draw_account(self, account): if account in self.accounts_to_draw: return self.accounts_to_draw.append(account) if len(self.accounts_to_draw) == 1: GLib.timeout_add(200, self._really_draw_accounts) def _really_draw_group(self, group, account): child_iter = self._get_group_iter(group, account, model=self.model) if not child_iter: # Eg. We redraw groups after we removed a entitiy # and its empty groups return if self.regroup: accounts = [] else: accounts = [account] text = GLib.markup_escape_text(group) if helpers.group_is_blocked(account, group): text = '%s' % text if app.config.get('show_contacts_number'): nbr_on, nbr_total = app.contacts.get_nb_online_total_contacts( accounts = accounts, groups = [group]) text += ' (%s/%s)' % (repr(nbr_on), repr(nbr_total)) self.model[child_iter][Column.NAME] = text # Hide group if no more contacts iterG = self._get_group_iter(group, account, model=self.modelfilter) to_hide = [] while(iterG): parent = self.modelfilter.iter_parent(iterG) if (not self.modelfilter.iter_has_child(iterG)) or (len(to_hide) > \ 0 and self.modelfilter.iter_n_children(iterG) == 1): to_hide.append(iterG) if not parent or self.modelfilter[parent][Column.TYPE] != \ 'group': iterG = None else: iterG = parent else: iterG = None for iter_ in to_hide: self.modelfilter[iter_][Column.VISIBLE] = False def _really_draw_groups(self): for ag in self.groups_to_draw.values(): acct = ag['account'] grp = ag['group'] self._really_draw_group(grp, acct) self.groups_to_draw = {} return False def draw_group(self, group, account): ag = account + group if ag in self.groups_to_draw: return self.groups_to_draw[ag] = {'group': group, 'account': account} if len(self.groups_to_draw) == 1: GLib.timeout_add(200, self._really_draw_groups) def draw_parent_contact(self, jid, account): child_iters = self._get_contact_iter(jid, account, model=self.model) if not child_iters: return False parent_iter = self.model.iter_parent(child_iters[0]) if self.model[parent_iter][Column.TYPE] != 'contact': # parent is not a contact return parent_jid = self.model[parent_iter][Column.JID] parent_account = self.model[parent_iter][Column.ACCOUNT] self.draw_contact(parent_jid, parent_account) return False def draw_contact(self, jid, account, selected=False, focus=False, contact_instances=None, contact=None): """ Draw the correct state image, name BUT not avatar """ # focus is about if the roster window has toplevel-focus or not # FIXME: We really need a custom cell_renderer if not contact_instances: contact_instances = app.contacts.get_contacts(account, jid) if not contact: contact = app.contacts.get_highest_prio_contact_from_contacts( contact_instances) if not contact: return False child_iters = self._get_contact_iter(jid, account, contact, self.model) if not child_iters: return False name = GLib.markup_escape_text(contact.get_shown_name()) # gets number of unread gc marked messages if jid in app.interface.minimized_controls[account] and \ app.interface.minimized_controls[account][jid]: nb_unread = len(app.events.get_events(account, jid, ['printed_marked_gc_msg'])) nb_unread += app.interface.minimized_controls \ [account][jid].get_nb_unread_pm() if nb_unread == 1: name = '%s *' % name elif nb_unread > 1: name = '%s [%s]' % (name, str(nb_unread)) # Strike name if blocked strike = False if helpers.jid_is_blocked(account, jid): strike = True else: for group in contact.get_shown_groups(): if helpers.group_is_blocked(account, group): strike = True break if strike: name = '%s' % name # Show resource counter nb_connected_contact = 0 for c in contact_instances: if c.show not in ('error', 'offline'): nb_connected_contact += 1 if nb_connected_contact > 1: # switch back to default writing direction name += i18n.paragraph_direction_mark(name) name += ' (%d)' % nb_connected_contact # add status msg, if not empty, under contact name in # the treeview if contact.status and app.config.get('show_status_msgs_in_roster'): status = contact.status.strip() if status != '': status = helpers.reduce_chars_newlines(status, max_lines = 1) # escape markup entities and make them small # italic and fg color color is calcuted to be # always readable color = gtkgui_helpers.get_fade_color(self.tree, selected, focus) colorstring = '#%04x%04x%04x' % (int(color.red * 65535), int(color.green * 65535), int(color.blue * 65535)) name += '\n%s' % (colorstring, GLib.markup_escape_text(status)) icon_name = helpers.get_icon_name_to_show(contact, account) # look if another resource has awaiting events for c in contact_instances: c_icon_name = helpers.get_icon_name_to_show(c, account) if c_icon_name in ('event', 'muc_active', 'muc_inactive'): icon_name = c_icon_name break # Check for events of collapsed (hidden) brothers family = app.contacts.get_metacontacts_family(account, jid) is_big_brother = False have_visible_children = False if family: bb_jid, bb_account = \ self._get_nearby_family_and_big_brother(family, account)[1:] is_big_brother = (jid, account) == (bb_jid, bb_account) iters = self._get_contact_iter(jid, account) have_visible_children = iters and \ self.modelfilter.iter_has_child(iters[0]) if have_visible_children: # We are the big brother and have a visible family for child_iter in child_iters: child_path = self.model.get_path(child_iter) path = self.modelfilter.convert_child_path_to_path(child_path) if not path: continue if not self.tree.row_expanded(path) and icon_name != 'event': iterC = self.model.iter_children(child_iter) while iterC: # a child has awaiting messages? jidC = self.model[iterC][Column.JID] accountC = self.model[iterC][Column.ACCOUNT] if len(app.events.get_events(accountC, jidC)): icon_name = 'event' break iterC = self.model.iter_next(iterC) if self.tree.row_expanded(path): state_images = self.get_appropriate_state_images( jid, size = 'opened', icon_name = icon_name) else: state_images = self.get_appropriate_state_images( jid, size = 'closed', icon_name = icon_name) # Expand/collapse icon might differ per iter # (group) img = state_images[icon_name] self.model[child_iter][Column.IMG] = img self.model[child_iter][Column.NAME] = name #TODO: compute visible visible = True self.model[child_iter][Column.VISIBLE] = visible else: # A normal contact or little brother state_images = self.get_appropriate_state_images(jid, icon_name = icon_name) visible = self.contact_is_visible(contact, account) # All iters have the same icon (no expand/collapse) img = state_images[icon_name] for child_iter in child_iters: self.model[child_iter][Column.IMG] = img self.model[child_iter][Column.NAME] = name self.model[child_iter][Column.VISIBLE] = visible if visible: parent_iter = self.model.iter_parent(child_iter) self.model[parent_iter][Column.VISIBLE] = True # We are a little brother if family and not is_big_brother and not self.starting: self.draw_parent_contact(jid, account) if visible: delimiter = app.connections[account].nested_group_delimiter for group in contact.get_shown_groups(): group_splited = group.split(delimiter) i = 1 while i < len(group_splited) + 1: g = delimiter.join(group_splited[:i]) iterG = self._get_group_iter(g, account, model=self.model) if iterG: # it's not self contact self.model[iterG][Column.VISIBLE] = True i += 1 app.plugin_manager.gui_extension_point('roster_draw_contact', self, jid, account, contact) return False def _is_pep_shown_in_roster(self, pep_type): if pep_type == 'mood': return app.config.get('show_mood_in_roster') elif pep_type == 'activity': return app.config.get('show_activity_in_roster') elif pep_type == 'tune': return app.config.get('show_tunes_in_roster') elif pep_type == 'location': return app.config.get('show_location_in_roster') else: return False def draw_all_pep_types(self, jid, account, contact=None): for pep_type in self._pep_type_to_model_column: self.draw_pep(jid, account, pep_type, contact=contact) def draw_pep(self, jid, account, pep_type, contact=None): if pep_type not in self._pep_type_to_model_column: return if not self._is_pep_shown_in_roster(pep_type): return model_column = self._pep_type_to_model_column[pep_type] iters = self._get_contact_iter(jid, account, model=self.model) if not iters: return if not contact: contact = app.contacts.get_contact(account, jid) if pep_type in contact.pep: pixbuf = gtkgui_helpers.get_pep_as_pixbuf(contact.pep[pep_type]) else: pixbuf = empty_pixbuf for child_iter in iters: self.model[child_iter][model_column] = pixbuf def draw_avatar(self, jid, account): iters = self._get_contact_iter(jid, account, model=self.model) if not iters or not app.config.get('show_avatars_in_roster'): return jid = self.model[iters[0]][Column.JID] scale = self.window.get_scale_factor() surface = app.contacts.get_avatar( account, jid, AvatarSize.ROSTER, scale) image = Gtk.Image.new_from_surface(surface) for child_iter in iters: self.model[child_iter][Column.AVATAR_IMG] = image return False def draw_completely(self, jid, account): contact_instances = app.contacts.get_contacts(account, jid) contact = app.contacts.get_highest_prio_contact_from_contacts( contact_instances) self.draw_contact(jid, account, contact_instances=contact_instances, contact=contact) self.draw_all_pep_types(jid, account, contact=contact) self.draw_avatar(jid, account) def adjust_and_draw_contact_context(self, jid, account): """ Draw contact, account and groups of given jid Show contact if it has pending events """ contact = app.contacts.get_first_contact_from_jid(account, jid) if not contact: # idle draw or just removed SelfContact return family = app.contacts.get_metacontacts_family(account, jid) if family: # There might be a new big brother self._recalibrate_metacontact_family(family, account) self.draw_contact(jid, account) self.draw_account(account) for group in contact.get_shown_groups(): self.draw_group(group, account) self._adjust_group_expand_collapse_state(group, account) def _idle_draw_jids_of_account(self, jids, account): """ Draw given contacts and their avatars in a lazy fashion Keyword arguments: jids -- a list of jids to draw account -- the corresponding account """ def _draw_all_contacts(jids, account): for jid in jids: family = app.contacts.get_metacontacts_family(account, jid) if family: # For metacontacts over several accounts: # When we connect a new account existing brothers # must be redrawn (got removed and readded) for data in family: self.draw_completely(data['jid'], data['account']) else: self.draw_completely(jid, account) yield True self.refilter_shown_roster_items() yield False task = _draw_all_contacts(jids, account) GLib.idle_add(next, task) def _before_fill(self): self.tree.freeze_child_notify() self.tree.set_model(None) # disable sorting self.model.set_sort_column_id(-2, Gtk.SortType.ASCENDING) self.starting = True self.starting_filtering = True def _after_fill(self): self.starting = False accounts_list = app.contacts.get_accounts() for account in app.connections: if account not in accounts_list: continue jids = app.contacts.get_jid_list(account) for jid in jids: self.draw_completely(jid, account) # Draw all known groups for group in app.groups[account]: self.draw_group(group, account) self.draw_account(account) self.model.set_sort_column_id(1, Gtk.SortType.ASCENDING) self.tree.set_model(self.modelfilter) self.tree.thaw_child_notify() self.starting_filtering = False self.refilter_shown_roster_items() def setup_and_draw_roster(self): """ Create new empty model and draw roster """ self.modelfilter = None self.model = Gtk.TreeStore(*self.columns) self.model.set_sort_func(1, self._compareIters) self.model.set_sort_column_id(1, Gtk.SortType.ASCENDING) self.modelfilter = self.model.filter_new() self.modelfilter.set_visible_func(self._visible_func) self.modelfilter.connect('row-has-child-toggled', self.on_modelfilter_row_has_child_toggled) self.tree.set_model(self.modelfilter) self._iters = {} # for merged mode self._iters['MERGED'] = {'account': None, 'groups': {}} for acct in app.contacts.get_accounts(): self._iters[acct] = {'account': None, 'groups': {}, 'contacts': {}} for acct in app.contacts.get_accounts(): self.add_account(acct) self.add_account_contacts(acct, improve_speed=True, draw_contacts=False) # Recalculate column width for ellipsizing self.tree.columns_autosize() def select_contact(self, jid, account): """ Select contact in roster. If contact is hidden but has events, show him """ # Refiltering SHOULD NOT be needed: # When a contact gets a new event he will be redrawn and his # icon changes, so _visible_func WILL be called on him anyway iters = self._get_contact_iter(jid, account) if not iters: # Not visible in roster return path = self.modelfilter.get_path(iters[0]) if self.dragging or not app.config.get( 'scroll_roster_to_last_message'): # do not change selection while DND'ing return # Expand his parent, so this path is visible, don't expand it. path.up() self.tree.expand_to_path(path) self.tree.scroll_to_cell(path) self.tree.set_cursor(path) def _readjust_expand_collapse_state(self): def func(model, path, iter_, param): type_ = model[iter_][Column.TYPE] acct = model[iter_][Column.ACCOUNT] jid = model[iter_][Column.JID] key = None if type_ == 'account': key = acct elif type_ == 'group': key = acct + jid elif type_ == 'contact': parent_iter = model.iter_parent(iter_) ptype = model[parent_iter][Column.TYPE] if ptype == 'group': grp = model[parent_iter][Column.JID] key = acct + grp + jid if key: if key in self.collapsed_rows: self.tree.collapse_row(path) else: self.tree.expand_row(path, False) self.modelfilter.foreach(func, None) def _adjust_account_expand_collapse_state(self, account): """ Expand/collapse account row based on self.collapsed_rows """ if not self.tree.get_model(): return iterA = self._get_account_iter(account) if not iterA: # thank you modelfilter return path = self.modelfilter.get_path(iterA) if account in self.collapsed_rows: self.tree.collapse_row(path) else: self.tree.expand_row(path, False) return False def _adjust_group_expand_collapse_state(self, group, account): """ Expand/collapse group row based on self.collapsed_rows """ if not self.tree.get_model(): return if account not in app.connections: return delimiter = app.connections[account].nested_group_delimiter group_splited = group.split(delimiter) i = 1 while i < len(group_splited) + 1: g = delimiter.join(group_splited[:i]) iterG = self._get_group_iter(g, account) if not iterG: # Group not visible return path = self.modelfilter.get_path(iterG) if account + g in self.collapsed_rows: self.tree.collapse_row(path) else: self.tree.expand_row(path, False) i += 1 ############################################################################## ### Roster and Modelfilter handling ############################################################################## def refilter_shown_roster_items(self): if self.filtering: return self.filtering = True for account in app.connections: for jid in app.contacts.get_jid_list(account): self.adjust_and_draw_contact_context(jid, account) self.filtering = False def contact_has_pending_roster_events(self, contact, account): """ Return True if the contact or one if it resources has pending events """ # jid has pending events if app.events.get_nb_roster_events(account, contact.jid) > 0: return True # check events of all resources for contact_ in app.contacts.get_contacts(account, contact.jid): if contact_.resource and app.events.get_nb_roster_events(account, contact_.get_full_jid()) > 0: return True return False def contact_is_visible(self, contact, account): if self.rfilter_enabled: return self.rfilter_string in contact.get_shown_name().lower() if self.contact_has_pending_roster_events(contact, account): return True if app.config.get('showoffline'): return True if contact.show in ('offline', 'error'): if contact.jid in app.to_be_removed[account]: return True return False if app.config.get('show_only_chat_and_online') and contact.show in ( 'away', 'xa', 'busy'): return False if _('Transports') in contact.get_shown_groups(): return app.config.get('show_transports_group') return True def _visible_func(self, model, titer, dummy): """ Determine whether iter should be visible in the treeview """ if self.starting_filtering: return False visible = model[titer][Column.VISIBLE] type_ = model[titer][Column.TYPE] if not type_: return False if type_ == 'account': # Always show account return True account = model[titer][Column.ACCOUNT] if not account: return False jid = model[titer][Column.JID] if not jid: return False if not self.rfilter_enabled: return visible if type_ == 'group': group = jid if group == _('Transports'): if self.regroup: accounts = app.contacts.get_accounts() else: accounts = [account] for _acc in accounts: for contact in app.contacts.iter_contacts(_acc): if group in contact.get_shown_groups(): if self.rfilter_string in \ contact.get_shown_name().lower(): return True elif self.contact_has_pending_roster_events(contact, _acc): return True # No transport has been found return False if type_ == 'contact': if model.iter_has_child(titer): iter_c = model.iter_children(titer) while iter_c: if self.rfilter_string in model[iter_c][Column.NAME].lower(): return True iter_c = model.iter_next(iter_c) return self.rfilter_string in model[titer][Column.NAME].lower() if type_ == 'agent': return self.rfilter_string in model[titer][Column.NAME].lower() if type_ == 'groupchat': return self.rfilter_string in model[titer][Column.NAME].lower() return visible def _compareIters(self, model, iter1, iter2, data=None): """ Compare two iters to sort them """ name1 = model[iter1][Column.NAME] name2 = model[iter2][Column.NAME] if not name1 or not name2: return 0 type1 = model[iter1][Column.TYPE] type2 = model[iter2][Column.TYPE] if type1 == 'self_contact': return -1 if type2 == 'self_contact': return 1 if type1 == 'group': name1 = model[iter1][Column.JID] name2 = model[iter2][Column.JID] if name1 == _('Transports'): return 1 if name2 == _('Transports'): return -1 if name1 == _('Not in Roster'): return 1 if name2 == _('Not in Roster'): return -1 if name1 == _('Groupchats'): return 1 if name2 == _('Groupchats'): return -1 account1 = model[iter1][Column.ACCOUNT] account2 = model[iter2][Column.ACCOUNT] if not account1 or not account2: return 0 if type1 == 'account': return locale.strcoll(account1, account2) jid1 = model[iter1][Column.JID] jid2 = model[iter2][Column.JID] if type1 == 'contact': lcontact1 = app.contacts.get_contacts(account1, jid1) contact1 = app.contacts.get_first_contact_from_jid(account1, jid1) if not contact1: return 0 name1 = contact1.get_shown_name() if type2 == 'contact': lcontact2 = app.contacts.get_contacts(account2, jid2) contact2 = app.contacts.get_first_contact_from_jid(account2, jid2) if not contact2: return 0 name2 = contact2.get_shown_name() # We first compare by show if sort_by_show_in_roster is True or if it's # a child contact if type1 == 'contact' and type2 == 'contact' and \ app.config.get('sort_by_show_in_roster'): cshow = {'chat':0, 'online': 1, 'away': 2, 'xa': 3, 'dnd': 4, 'invisible': 5, 'offline': 6, 'not in roster': 7, 'error': 8} s = self.get_show(lcontact1) show1 = cshow.get(s, 9) s = self.get_show(lcontact2) show2 = cshow.get(s, 9) removing1 = False removing2 = False if show1 == 6 and jid1 in app.to_be_removed[account1]: removing1 = True if show2 == 6 and jid2 in app.to_be_removed[account2]: removing2 = True if removing1 and not removing2: return 1 if removing2 and not removing1: return -1 sub1 = contact1.sub sub2 = contact2.sub # none and from goes after if sub1 not in ['none', 'from'] and sub2 in ['none', 'from']: return -1 if sub1 in ['none', 'from'] and sub2 not in ['none', 'from']: return 1 if show1 < show2: return -1 elif show1 > show2: return 1 # We compare names cmp_result = locale.strcoll(name1.lower(), name2.lower()) if cmp_result < 0: return -1 if cmp_result > 0: return 1 if type1 == 'contact' and type2 == 'contact': # We compare account names cmp_result = locale.strcoll(account1.lower(), account2.lower()) if cmp_result < 0: return -1 if cmp_result > 0: return 1 # We compare jids cmp_result = locale.strcoll(jid1.lower(), jid2.lower()) if cmp_result < 0: return -1 if cmp_result > 0: return 1 return 0 ################################################################################ ### FIXME: Methods that don't belong to roster window... ### ... atleast not in there current form ################################################################################ def fire_up_unread_messages_events(self, account): """ Read from db the unread messages, and fire them up, and if we find very old unread messages, delete them from unread table """ results = app.logger.get_unread_msgs() for result, shown in results: jid = result.jid additional_data = result.additional_data if app.contacts.get_first_contact_from_jid(account, jid) and not \ shown: # We have this jid in our contacts list # XXX unread messages should probably have their session saved # with them session = app.connections[account].make_new_session(jid) tim = float(result.time) session.roster_message(jid, result.message, tim, msg_type='chat', msg_log_id=result.log_line_id, additional_data=additional_data) app.logger.set_shown_unread_msgs(result.log_line_id) elif (time.time() - result.time) > 2592000: # ok, here we see that we have a message in unread messages # table that is older than a month. It is probably from someone # not in our roster for accounts we usually launch, so we will # delete this id from unread message tables. app.logger.set_read_messages([result.log_line_id]) def fill_contacts_and_groups_dicts(self, array, account): """ Fill app.contacts and app.groups """ # FIXME: This function needs to be splitted # Most of the logic SHOULD NOT be done at GUI level if account not in app.contacts.get_accounts(): app.contacts.add_account(account) if not account in self._iters: self._iters[account] = {'account': None, 'groups': {}, 'contacts': {}} if account not in app.groups: app.groups[account] = {} if app.config.get('show_self_contact') == 'always': self_jid = app.get_jid_from_account(account) if app.connections[account].server_resource: self_jid += '/' + app.connections[account].server_resource array[self_jid] = {'name': app.nicks[account], 'groups': ['self_contact'], 'subscription': 'both', 'ask': 'none'} # .keys() is needed for jid in list(array.keys()): # Remove the contact in roster. It might has changed self.remove_contact(jid, account, force=True) # Remove old Contact instances app.contacts.remove_jid(account, jid, remove_meta=False) jids = jid.split('/') # get jid ji = jids[0] # get resource resource = '' if len(jids) > 1: resource = '/'.join(jids[1:]) # get name name = array[jid]['name'] or '' show = 'offline' # show is offline by default status = '' # no status message by default keyID = '' attached_keys = app.config.get_per('accounts', account, 'attached_gpg_keys').split() if jid in attached_keys: keyID = attached_keys[attached_keys.index(jid) + 1] if app.jid_is_transport(jid): array[jid]['groups'] = [_('Transports')] #TRANSP - potential contact1 = app.contacts.create_contact(jid=ji, account=account, name=name, groups=array[jid]['groups'], show=show, status=status, sub=array[jid]['subscription'], ask=array[jid]['ask'], resource=resource, keyID=keyID) app.contacts.add_contact(account, contact1) # If we already have chat windows opened, update them with new # contact instance chat_control = app.interface.msg_win_mgr.get_control(ji, account) if chat_control: chat_control.contact = contact1 def connected_rooms(self, account): if account in list(app.gc_connected[account].values()): return True return False def on_event_removed(self, event_list): """ Remove contacts on last events removed Only performed if removal was requested before but the contact still had pending events """ msg_log_ids = [] for ev in event_list: if ev.type_ != 'printed_chat': continue if ev.msg_log_id: # There is a msg_log_id msg_log_ids.append(ev.msg_log_id) if msg_log_ids: app.logger.set_read_messages(msg_log_ids) contact_list = ((event.jid.split('/')[0], event.account) for event in \ event_list) for jid, account in contact_list: self.draw_contact(jid, account) # Remove contacts in roster if removal was requested key = (jid, account) if key in list(self.contacts_to_be_removed.keys()): backend = self.contacts_to_be_removed[key]['backend'] del self.contacts_to_be_removed[key] # Remove contact will delay removal if there are more events # pending self.remove_contact(jid, account, backend=backend) self.show_title() def open_event(self, account, jid, event): """ If an event was handled, return True, else return False """ ft = app.interface.instances['file_transfers'] event = app.events.get_first_event(account, jid, event.type_) if event.type_ == 'normal': dialogs.SingleMessageWindow(account, jid, action='receive', from_whom=jid, subject=event.subject, message=event.message, resource=event.resource, session=event.session, form_node=event.form_node) app.events.remove_events(account, jid, event) return True elif event.type_ == 'file-request': contact = app.contacts.get_contact_with_highest_priority(account, jid) ft.show_file_request(account, contact, event.file_props) app.events.remove_events(account, jid, event) return True elif event.type_ in ('file-request-error', 'file-send-error'): ft.show_send_error(event.file_props) app.events.remove_events(account, jid, event) return True elif event.type_ in ('file-error', 'file-stopped'): msg_err = '' if event.file_props.error == -1: msg_err = _('Remote contact stopped transfer') elif event.file_props.error == -6: msg_err = _('Error opening file') ft.show_stopped(jid, event.file_props, error_msg=msg_err) app.events.remove_events(account, jid, event) return True elif event.type_ == 'file-hash-error': ft.show_hash_error(jid, event.file_props, account) app.events.remove_events(account, jid, event) return True elif event.type_ == 'file-completed': ft.show_completed(jid, event.file_props) app.events.remove_events(account, jid, event) return True elif event.type_ == 'gc-invitation': dialogs.InvitationReceivedDialog(account, event.room_jid, event.jid_from, event.password, event.reason, is_continued=event.is_continued) app.events.remove_events(account, jid, event) return True elif event.type_ == 'subscription_request': dialogs.SubscriptionRequestWindow(jid, event.text, account, event.nick) app.events.remove_events(account, jid, event) return True elif event.type_ == 'unsubscribed': app.interface.show_unsubscribed_dialog(account, event.contact) app.events.remove_events(account, jid, event) return True elif event.type_ == 'jingle-incoming': dialogs.VoIPCallReceivedDialog(account, event.peerjid, event.sid, event.content_types) app.events.remove_events(account, jid, event) return True return False ################################################################################ ### This and that... random. ################################################################################ def show_roster_vbox(self, active): vb = self.xml.get_object('roster_vbox2') if active: vb.set_no_show_all(False) vb.show() else: vb.hide() vb.set_no_show_all(True) def authorize(self, widget, jid, account): """ Authorize a contact (by re-sending auth menuitem) """ app.connections[account].send_authorization(jid) dialogs.InformationDialog(_('Authorization sent'), _('"%s" will now see your status.') %jid) def req_sub(self, widget, jid, txt, account, groups=None, nickname=None, auto_auth=False): """ Request subscription to a contact """ groups_list = groups or [] app.connections[account].request_subscription(jid, txt, nickname, groups_list, auto_auth, app.nicks[account]) contact = app.contacts.get_contact_with_highest_priority(account, jid) if not contact: keyID = '' attached_keys = app.config.get_per('accounts', account, 'attached_gpg_keys').split() if jid in attached_keys: keyID = attached_keys[attached_keys.index(jid) + 1] contact = app.contacts.create_contact(jid=jid, account=account, name=nickname, groups=groups_list, show='requested', status='', ask='none', sub='subscribe', keyID=keyID) app.contacts.add_contact(account, contact) else: if not _('Not in Roster') in contact.get_shown_groups(): dialogs.InformationDialog(_('Subscription request has been ' 'sent'), _('If "%s" accepts this request you will know his ' 'or her status.') % jid) return self.remove_contact(contact.jid, account, force=True) contact.groups = groups_list if nickname: contact.name = nickname self.add_contact(jid, account) def revoke_auth(self, widget, jid, account): """ Revoke a contact's authorization """ app.connections[account].refuse_authorization(jid) dialogs.InformationDialog(_('Authorization removed'), _('Now "%s" will always see you as offline.') %jid) def set_state(self, account, state): child_iterA = self._get_account_iter(account, self.model) if child_iterA: self.model[child_iterA][0] = \ app.interface.jabber_state_images['16'][state] if app.interface.systray_enabled: app.interface.systray.change_status(state) def set_connecting_state(self, account): self.set_state(account, 'connecting') def send_status(self, account, status, txt, auto=False, to=None): if status != 'offline': if to is None: app.config.set_per('accounts', account, 'last_status', status) app.config.set_per('accounts', account, 'last_status_msg', helpers.to_one_line(txt)) if app.connections[account].connected < 2: self.set_connecting_state(account) keyid = app.config.get_per('accounts', account, 'keyid') if keyid and not app.connections[account].gpg: dialogs.WarningDialog(_('OpenPGP is not usable'), _('Gajim needs python-gnupg >= 0.3.8\n' 'Beware there is an incompatible python package called gnupg.\n' 'You will be connected to %s without OpenPGP.') % account) self.send_status_continue(account, status, txt, auto, to) def send_pep(self, account, pep_dict): connection = app.connections[account] if 'activity' in pep_dict: activity = pep_dict['activity'] subactivity = pep_dict.get('subactivity', None) activity_text = pep_dict.get('activity_text', None) connection.send_activity(activity, subactivity, activity_text) else: connection.retract_activity() if 'mood' in pep_dict: mood = pep_dict['mood'] mood_text = pep_dict.get('mood_text', None) connection.send_mood(mood, mood_text) else: connection.retract_mood() def delete_pep(self, jid, account): if jid == app.get_jid_from_account(account): app.connections[account].pep = {} self.draw_account(account) for contact in app.contacts.get_contacts(account, jid): contact.pep = {} self.draw_all_pep_types(jid, account) ctrl = app.interface.msg_win_mgr.get_control(jid, account) if ctrl: ctrl.update_all_pep_types() def send_status_continue(self, account, status, txt, auto, to): if app.account_is_connected(account) and not to: if status == 'online' and app.interface.sleeper.getState() != \ sleepy.STATE_UNKNOWN: app.sleeper_state[account] = 'online' elif app.sleeper_state[account] not in ('autoaway', 'autoxa') or \ status == 'offline': app.sleeper_state[account] = 'off' if to: app.connections[account].send_custom_status(status, txt, to) else: if status in ('invisible', 'offline'): self.delete_pep(app.get_jid_from_account(account), account) was_invisible = app.connections[account].connected == \ app.SHOW_LIST.index('invisible') app.connections[account].change_status(status, txt, auto) if account in app.interface.status_sent_to_users: app.interface.status_sent_to_users[account] = {} if account in app.interface.status_sent_to_groups: app.interface.status_sent_to_groups[account] = {} for gc_control in app.interface.msg_win_mgr.get_controls( message_control.TYPE_GC) + \ list(app.interface.minimized_controls[account].values()): if gc_control.account == account: if app.gc_connected[account][gc_control.room_jid]: app.connections[account].send_gc_status( gc_control.nick, gc_control.room_jid, status, txt, auto=auto) if was_invisible and status != 'offline': # We come back from invisible, join bookmarks app.interface.auto_join_bookmarks(account) def chg_contact_status(self, contact, show, status, account): """ When a contact changes his or her status """ contact_instances = app.contacts.get_contacts(account, contact.jid) contact.show = show contact.status = status # name is to show in conversation window name = contact.get_shown_name() fjid = contact.get_full_jid() # The contact has several resources if len(contact_instances) > 1: if contact.resource != '': name += '/' + contact.resource # Remove resource when going offline if show in ('offline', 'error') and \ not self.contact_has_pending_roster_events(contact, account): ctrl = app.interface.msg_win_mgr.get_control(fjid, account) if ctrl: ctrl.update_ui() ctrl.parent_win.redraw_tab(ctrl) # keep the contact around, since it's # already attached to the control else: app.contacts.remove_contact(account, contact) elif contact.jid == app.get_jid_from_account(account) and \ show in ('offline', 'error'): if app.config.get('show_self_contact') != 'never': # SelfContact went offline. Remove him when last pending # message was read self.remove_contact(contact.jid, account, backend=True) uf_show = helpers.get_uf_show(show) # print status in chat window and update status/GPG image ctrl = app.interface.msg_win_mgr.get_control(contact.jid, account) if ctrl and ctrl.type_id != message_control.TYPE_GC: ctrl.contact = app.contacts.get_contact_with_highest_priority( account, contact.jid) ctrl.update_status_display(name, uf_show, status) if contact.resource: ctrl = app.interface.msg_win_mgr.get_control(fjid, account) if ctrl: ctrl.update_status_display(name, uf_show, status) # Delete pep if needed keep_pep = any(c.show not in ('error', 'offline') for c in contact_instances) if not keep_pep and contact.jid != app.get_jid_from_account(account) \ and not contact.is_groupchat(): self.delete_pep(contact.jid, account) # Redraw everything and select the sender self.adjust_and_draw_contact_context(contact.jid, account) def on_status_changed(self, account, show): """ The core tells us that our status has changed """ if account not in app.contacts.get_accounts(): return child_iterA = self._get_account_iter(account, self.model) if app.config.get('show_self_contact') == 'always': self_resource = app.connections[account].server_resource self_contact = app.contacts.get_contact(account, app.get_jid_from_account(account), resource=self_resource) if self_contact: status = app.connections[account].status self.chg_contact_status(self_contact, show, status, account) self.set_account_status_icon(account) if show == 'offline': if self.quit_on_next_offline > -1: # we want to quit, we are waiting for all accounts to be offline self.quit_on_next_offline -= 1 if self.quit_on_next_offline < 1: # all accounts offline, quit self.quit_gtkgui_interface() else: # No need to redraw contacts if we're quitting if child_iterA: self.model[child_iterA][Column.AVATAR_IMG] = None if account in app.con_types: app.con_types[account] = None for jid in list(app.contacts.get_jid_list(account)): lcontact = app.contacts.get_contacts(account, jid) ctrl = app.interface.msg_win_mgr.get_gc_control(jid, account) for contact in [c for c in lcontact if ( (c.show != 'offline' or c.is_transport()) and not ctrl)]: self.chg_contact_status(contact, 'offline', '', account) self.update_status_combobox() def get_status_message(self, show, on_response, show_pep=True, always_ask=False): """ Get the status message by: 1/ looking in default status message 2/ asking to user if needed depending on ask_on(ff)line_status and always_ask show_pep can be False to hide pep things from status message or True """ empty_pep = {'activity': '', 'subactivity': '', 'activity_text': '', 'mood': '', 'mood_text': ''} if show in app.config.get_per('defaultstatusmsg'): if app.config.get_per('defaultstatusmsg', show, 'enabled'): msg = app.config.get_per('defaultstatusmsg', show, 'message') msg = helpers.from_one_line(msg) on_response(msg, empty_pep) return if not always_ask and ((show == 'online' and not app.config.get( 'ask_online_status')) or (show in ('offline', 'invisible') and not \ app.config.get('ask_offline_status'))): on_response('', empty_pep) return dlg = dialogs.ChangeStatusMessageDialog(on_response, show, show_pep) dlg.dialog.present() # show it on current workspace def change_status(self, widget, account, status): def change(account, status): def on_response(message, pep_dict): if message is None: # user pressed Cancel to change status message dialog return self.send_status(account, status, message) self.send_pep(account, pep_dict) self.get_status_message(status, on_response) if status == 'invisible' and self.connected_rooms(account): dialogs.ConfirmationDialog( _('You are participating in one or more group chats'), _('Changing your status to invisible will result in ' 'disconnection from those group chats. Are you sure you want ' 'to go invisible?'), on_response_ok = (change, account, status)) else: change(account, status) def update_status_combobox(self): # table to change index in connection.connected to index in combobox table = {'offline':9, 'connecting':9, 'online':0, 'chat':1, 'away':2, 'xa':3, 'dnd':4, 'invisible':5} liststore = self.status_combobox.get_model() # we check if there are more options in the combobox that it should # if yes, we remove the first ones while len(liststore) > len(table)+2: titer = liststore.get_iter_first() liststore.remove(titer) show = helpers.get_global_show() # temporarily block signal in order not to send status that we show # in the combobox self.combobox_callback_active = False if helpers.statuses_unified(): self.status_combobox.set_active(table[show]) else: uf_show = helpers.get_uf_show(show) liststore.prepend(['SEPARATOR', None, '', True]) status_combobox_text = uf_show + ' (' + _("desync'ed") + ')' liststore.prepend( [status_combobox_text, show, 'desync', False]) self.status_combobox.set_active(0) self.combobox_callback_active = True if app.interface.systray_enabled: app.interface.systray.change_status(show) def get_show(self, lcontact): prio = lcontact[0].priority show = lcontact[0].show for u in lcontact: if u.priority > prio: prio = u.priority show = u.show return show def on_message_window_delete(self, win_mgr, msg_win): if app.config.get('one_message_window') == 'always_with_roster': self.show_roster_vbox(True) gtkgui_helpers.resize_window(self.window, app.config.get('roster_width'), app.config.get('roster_height')) def close_all_from_dict(self, dic): """ Close all the windows in the given dictionary """ for w in list(dic.values()): if isinstance(w, dict): self.close_all_from_dict(w) else: try: w.window.destroy() except (AttributeError, RuntimeError): w.destroy() def close_all(self, account, force=False): """ Close all the windows from an account. If force is True, do not ask confirmation before closing chat/gc windows """ if account in app.interface.instances: self.close_all_from_dict(app.interface.instances[account]) for ctrl in app.interface.msg_win_mgr.get_controls(acct=account): ctrl.parent_win.remove_tab(ctrl, ctrl.parent_win.CLOSE_CLOSE_BUTTON, force=force) def on_roster_window_delete_event(self, widget, event): """ Main window X button was clicked """ if not app.config.get('quit_on_roster_x_button') and ( (app.interface.systray_enabled and app.config.get('trayicon') != \ 'on_event') or app.config.get('allow_hide_roster')): if app.config.get('save-roster-position'): x, y = self.window.get_position() app.config.set('roster_x-position', x) app.config.set('roster_y-position', y) if app.config.get('hide_on_roster_x_button'): self.window.hide() else: self.window.iconify() elif app.config.get('quit_on_roster_x_button'): self.on_quit_request() else: def on_ok(checked): if checked: app.config.set('quit_on_roster_x_button', True) self.on_quit_request() dialogs.ConfirmationDialogCheck(_('Really quit Gajim?'), _('Are you sure you want to quit Gajim?'), _('Always close Gajim'), on_response_ok=on_ok) return True # do NOT destroy the window def prepare_quit(self): if self.save_done: return msgwin_width_adjust = 0 # in case show_roster_on_start is False and roster is never shown # window.window is None if self.window.get_window() is not None: if app.config.get('save-roster-position'): x, y = self.window.get_window().get_root_origin() app.config.set('roster_x-position', x) app.config.set('roster_y-position', y) width, height = self.window.get_size() app.config.set('roster_width', width) app.config.set('roster_height', height) if not self.xml.get_object('roster_vbox2').get_property('visible'): # The roster vbox is hidden, so the message window is larger # then we want to save (i.e. the window will grow every startup) # so adjust. msgwin_width_adjust = -1 * width app.config.set('last_roster_visible', self.window.get_property('visible')) app.interface.msg_win_mgr.save_opened_controls() app.interface.msg_win_mgr.shutdown(msgwin_width_adjust) app.config.set('collapsed_rows', '\t'.join(self.collapsed_rows)) app.interface.save_config() for account in app.connections: app.connections[account].quit(True) self.close_all(account) if app.interface.systray_enabled: app.interface.hide_systray() self.save_done = True def quit_gtkgui_interface(self): """ When we quit the gtk interface - exit gtk """ self.prepare_quit() self.application.quit() def on_quit_request(self, widget=None): """ User wants to quit. Check if he should be warned about messages pending. Terminate all sessions and send offline to all connected account. We do NOT really quit gajim here """ accounts = list(app.connections.keys()) get_msg = False for acct in accounts: if app.connections[acct].connected: get_msg = True break def on_continue3(message, pep_dict): self.quit_on_next_offline = 0 accounts_to_disconnect = [] for acct in accounts: if app.connections[acct].connected > 1: self.quit_on_next_offline += 1 accounts_to_disconnect.append(acct) if not self.quit_on_next_offline: # all accounts offline, quit self.quit_gtkgui_interface() return for acct in accounts_to_disconnect: self.send_status(acct, 'offline', message) self.send_pep(acct, pep_dict) def on_continue2(message, pep_dict): # check if there is an active file transfer from gajim.common.protocol.bytestream import (is_transfer_active) files_props = app.interface.instances['file_transfers'].\ files_props transfer_active = False for x in files_props: for y in files_props[x]: if is_transfer_active(files_props[x][y]): transfer_active = True break if transfer_active: dialogs.ConfirmationDialog(_('You have running file transfers'), _('If you quit now, the file(s) being transferred will ' 'be stopped. Do you still want to quit?'), on_response_ok=(on_continue3, message, pep_dict)) return on_continue3(message, pep_dict) def on_continue(message, pep_dict): if message is None: # user pressed Cancel to change status message dialog return # check if we have unread messages unread = app.events.get_nb_events() if not app.config.get('notify_on_all_muc_messages'): unread_not_to_notify = app.events.get_nb_events( ['printed_gc_msg']) unread -= unread_not_to_notify # check if we have recent messages recent = False for win in app.interface.msg_win_mgr.windows(): for ctrl in win.controls(): fjid = ctrl.get_full_jid() if fjid in app.last_message_time[ctrl.account]: if time.time() - app.last_message_time[ctrl.account][ fjid] < 2: recent = True break if recent: break if unread or recent: dialogs.ConfirmationDialog(_('You have unread messages'), _('Messages will only be available for reading them later ' 'if you have history enabled and contact is in your ' 'roster.'), on_response_ok=(on_continue2, message, pep_dict)) return on_continue2(message, pep_dict) if get_msg: self.get_status_message('offline', on_continue, show_pep=False) else: on_continue('', None) def _nec_presence_received(self, obj): account = obj.conn.name jid = obj.jid if obj.need_add_in_roster: self.add_contact(jid, account) jid_list = app.contacts.get_jid_list(account) if jid in jid_list or jid == app.get_jid_from_account(account): if not app.jid_is_transport(jid) and len(obj.contact_list) == 1: if obj.old_show == 0 and obj.new_show > 1: GLib.timeout_add_seconds(5, self.remove_newly_added, jid, account) elif obj.old_show > 1 and obj.new_show == 0 and \ obj.conn.connected > 1: GLib.timeout_add_seconds(5, self.remove_to_be_removed, jid, account) if obj.need_redraw: self.draw_contact(jid, account) if app.jid_is_transport(jid) and jid in jid_list: # It must be an agent # Update existing iter and group counting self.draw_contact(jid, account) self.draw_group(_('Transports'), account) if obj.contact and obj.need_redraw: self.chg_contact_status(obj.contact, obj.show, obj.status, account) if obj.popup: ctrl = app.interface.msg_win_mgr.search_control(jid, account) if ctrl: GLib.idle_add(ctrl.parent_win.set_active_tab, ctrl) else: ctrl = app.interface.new_chat(obj.contact, account) if len(app.events.get_events(account, obj.jid)): ctrl.read_queue() def _nec_gc_presence_received(self, obj): account = obj.conn.name if obj.room_jid in app.interface.minimized_controls[account]: gc_ctrl = app.interface.minimized_controls[account][obj.room_jid] else: return if obj.nick == gc_ctrl.nick: contact = app.contacts.get_contact_with_highest_priority(account, obj.room_jid) if contact: contact.show = obj.show self.draw_contact(obj.room_jid, account) self.draw_group(_('Groupchats'), account) def _nec_roster_received(self, obj): if obj.received_from_server: self.fill_contacts_and_groups_dicts(obj.roster, obj.conn.name) self.add_account_contacts(obj.conn.name, improve_speed=False) self.fire_up_unread_messages_events(obj.conn.name) else: # add self contact if app.config.get('show_self_contact') == 'always': account = obj.conn.name self_jid = app.get_jid_from_account(account) if self_jid not in app.contacts.get_jid_list(account): resource = '' if app.connections[account].server_resource: resource = app.connections[account].server_resource sha = app.config.get_per('accounts', account, 'avatar_sha') contact = app.contacts.create_contact(jid=self_jid, account=account, name=app.nicks[account], groups=['self_contact'], show='offline', sub='both', ask='none', resource=resource, avatar_sha=sha) app.contacts.add_contact(account, contact) self.add_contact(self_jid, account) if app.config.get('remember_opened_chat_controls'): account = obj.conn.name controls = app.config.get_per('accounts', account, 'opened_chat_controls') if controls: for jid in controls.split(','): contact = \ app.contacts.get_contact_with_highest_priority( account, jid) if not contact: contact = self.add_to_not_in_the_roster(account, jid) app.interface.on_open_chat_window(None, contact, account) app.config.set_per('accounts', account, 'opened_chat_controls', '') GLib.idle_add(self.refilter_shown_roster_items) def _nec_anonymous_auth(self, obj): """ This event is raised when our JID changed (most probably because we use anonymous account. We update contact and roster entry in this case """ self.rename_self_contact(obj.old_jid, obj.new_jid, obj.conn.name) def _nec_our_show(self, obj): model = self.status_combobox.get_model() iter_ = model.get_iter_from_string('7') if obj.show == 'offline': # sensitivity for this menuitem if app.get_number_of_connected_accounts() == 0: model[iter_][3] = False self.application.set_account_actions_state(obj.conn.name) else: # sensitivity for this menuitem model[iter_][3] = True self.on_status_changed(obj.conn.name, obj.show) def _nec_connection_type(self, obj): self.draw_account(obj.conn.name) def _nec_agent_removed(self, obj): for jid in obj.jid_list: self.remove_contact(jid, obj.conn.name, backend=True) def _nec_pep_received(self, obj): if obj.jid == app.get_jid_from_account(obj.conn.name): self.draw_account(obj.conn.name) if obj.pep_type == 'nickname': self.draw_contact(obj.jid, obj.conn.name) else: self.draw_pep(obj.jid, obj.conn.name, obj.pep_type) def _nec_update_avatar(self, obj): app.log('avatar').debug('Draw roster avatar: %s', obj.jid) self.draw_avatar(obj.jid, obj.account) def _nec_gc_subject_received(self, obj): contact = app.contacts.get_contact_with_highest_priority( obj.conn.name, obj.room_jid) if contact: contact.status = obj.subject self.draw_contact(obj.room_jid, obj.conn.name) def _nec_metacontacts_received(self, obj): self.redraw_metacontacts(obj.conn.name) def _nec_signed_in(self, obj): self.application.set_account_actions_state(obj.conn.name, True) self.draw_account(obj.conn.name) def _nec_decrypted_message_received(self, obj): if not obj.msgtxt: # empty message text return True if obj.mtype not in ('normal', 'chat'): return if obj.mtype == 'normal' and obj.popup: # it's single message to be autopopuped dialogs.SingleMessageWindow(obj.conn.name, obj.jid, action='receive', from_whom=obj.jid, subject=obj.subject, message=obj.msgtxt, resource=obj.resource, session=obj.session, form_node=obj.form_node) return if obj.session.control and obj.mtype == 'chat': typ = '' xep0184_id = None if obj.mtype == 'error': typ = 'error' if obj.forwarded and obj.sent: typ = 'out' if obj.jid != app.get_jid_from_account(obj.conn.name): xep0184_id = obj.id_ obj.session.control.print_conversation(obj.msgtxt, typ, tim=obj.timestamp, encrypted=obj.encrypted, subject=obj.subject, xhtml=obj.xhtml, displaymarking=obj.displaymarking, msg_log_id=obj.msg_log_id, msg_stanza_id=obj.id_, correct_id=obj.correct_id, xep0184_id=xep0184_id, additional_data=obj.additional_data) if obj.msg_log_id: pw = obj.session.control.parent_win end = obj.session.control.conv_textview.autoscroll if not pw or (pw.get_active_control() and obj.session.control \ == pw.get_active_control() and pw.is_active() and end): app.logger.set_read_messages([obj.msg_log_id]) elif obj.popup and obj.mtype == 'chat': contact = app.contacts.get_contact(obj.conn.name, obj.jid) obj.session.control = app.interface.new_chat(contact, obj.conn.name, session=obj.session) if len(app.events.get_events(obj.conn.name, obj.fjid)): obj.session.control.read_queue() if obj.show_in_roster: self.draw_contact(obj.jid, obj.conn.name) self.show_title() # we show the * or [n] # Select the big brother contact in roster, it's visible because it # has events. family = app.contacts.get_metacontacts_family(obj.conn.name, obj.jid) if family: nearby_family, bb_jid, bb_account = \ app.contacts.get_nearby_family_and_big_brother(family, obj.conn.name) else: bb_jid, bb_account = obj.jid, obj.conn.name self.select_contact(bb_jid, bb_account) ################################################################################ ### Menu and GUI callbacks ### FIXME: order callbacks in itself... ################################################################################ def on_bookmark_menuitem_activate(self, widget, account, bookmark): app.interface.join_gc_room(account, bookmark['jid'], bookmark['nick'], bookmark['password']) def on_info(self, widget, contact, account): """ Call vcard_information_window class to display contact's information """ if app.connections[account].is_zeroconf: self.on_info_zeroconf(widget, contact, account) return info = app.interface.instances[account]['infos'] if contact.jid in info: info[contact.jid].window.present() else: info[contact.jid] = vcard.VcardWindow(contact, account) def on_info_zeroconf(self, widget, contact, account): info = app.interface.instances[account]['infos'] if contact.jid in info: info[contact.jid].window.present() else: contact = app.contacts.get_first_contact_from_jid(account, contact.jid) if contact.show in ('offline', 'error'): # don't show info on offline contacts return info[contact.jid] = vcard.ZeroconfVcardWindow(contact, account) def on_agent_logging(self, widget, jid, state, account): """ When an agent is requested to log in or off """ app.connections[account].send_agent_status(jid, state) def on_edit_agent(self, widget, contact, account): """ When we want to modify the agent registration """ app.connections[account].request_register_agent_info(contact.jid) def on_remove_agent(self, widget, list_): """ When an agent is requested to be removed. list_ is a list of (contact, account) tuple """ for (contact, account) in list_: if app.config.get_per('accounts', account, 'hostname') == \ contact.jid: # We remove the server contact # remove it from treeview app.connections[account].unsubscribe(contact.jid) self.remove_contact(contact.jid, account, backend=True) return def remove(list_): for (contact, account) in list_: full_jid = contact.get_full_jid() app.connections[account].unsubscribe_agent(full_jid) # remove transport from treeview self.remove_contact(contact.jid, account, backend=True) # Check if there are unread events from some contacts has_unread_events = False for (contact, account) in list_: for jid in app.events.get_events(account): if jid.endswith(contact.jid): has_unread_events = True break if has_unread_events: dialogs.ErrorDialog(_('You have unread messages'), _('You must read them before removing this transport.')) return if len(list_) == 1: pritext = _('Transport "%s" will be removed') % list_[0][0].jid sectext = _('You will no longer be able to send and receive ' 'messages from contacts using this transport.') else: pritext = _('Transports will be removed') jids = '' for (contact, account) in list_: jids += '\n ' + contact.get_shown_name() + ',' jids = jids[:-1] + '.' sectext = _('You will no longer be able to send and receive ' 'messages to contacts from these transports: %s') % jids dialogs.ConfirmationDialog(pritext, sectext, on_response_ok = (remove, list_), transient_for=self.window) def _nec_blocking(self, obj): if obj.unblock_all or obj.blocklist: jids = app.contacts.get_jid_list(obj.conn.name) self._idle_draw_jids_of_account(jids, obj.conn.name) else: for jid in obj.blocked_jids + obj.unblocked_jids: self.draw_contact(jid, obj.conn.name) def on_block(self, widget, list_, group=None): """ When clicked on the 'block' button in context menu. list_ is a list of (contact, account) """ def on_continue(msg, pep_dict): if msg is None: # user pressed Cancel to change status message dialog return accounts = set(i[1] for i in list_ if (app.connections[i[1]].\ privacy_rules_supported or (group is None and app.\ connections[i[1]].blocking_supported))) if group is None: for acct in accounts: l_ = [i[0] for i in list_ if i[1] == acct] app.connections[acct].block_contacts(l_, msg) for contact in l_: self.draw_contact(contact.jid, acct) else: for acct in accounts: l_ = [i[0] for i in list_ if i[1] == acct] app.connections[acct].block_group(group, l_, msg) self.draw_group(group, acct) for contact in l_: self.draw_contact(contact.jid, acct) def _block_it(is_checked=None): if is_checked is not None: # dialog has been shown if is_checked: # user does not want to be asked again app.config.set('confirm_block', 'no') else: app.config.set('confirm_block', 'yes') self.get_status_message('offline', on_continue, show_pep=False) confirm_block = app.config.get('confirm_block') if confirm_block == 'no': _block_it() return pritext = _('You are about to block a contact. Are you sure you want' ' to continue?') sectext = _('This contact will see you offline and you will not ' 'receive messages it sends you.') dialogs.ConfirmationDialogCheck(pritext, sectext, _('_Do not ask me again'), on_response_ok=_block_it) def on_unblock(self, widget, list_, group=None): """ When clicked on the 'unblock' button in context menu. """ accounts = set(i[1] for i in list_ if (app.connections[i[1]].\ privacy_rules_supported or (group is None and app.\ connections[i[1]].blocking_supported))) if group is None: for acct in accounts: l_ = [i[0] for i in list_ if i[1] == acct] app.connections[acct].unblock_contacts(l_) for contact in l_: self.draw_contact(contact.jid, acct) else: for acct in accounts: l_ = [i[0] for i in list_ if i[1] == acct] app.connections[acct].unblock_group(group, l_) self.draw_group(group, acct) for contact in l_: self.draw_contact(contact.jid, acct) for acct in accounts: if 'privacy_list_block' in app.interface.instances[acct]: del app.interface.instances[acct]['privacy_list_block'] def on_rename(self, widget, row_type, jid, account): # this function is called either by F2 or by Rename menuitem if 'rename' in app.interface.instances: app.interface.instances['rename'].dialog.present() return # account is offline, don't allow to rename if app.connections[account].connected < 2: return if row_type in ('contact', 'agent'): # it's jid title = _('Rename Contact') message = _('Enter a new nickname for contact %s') % jid old_text = app.contacts.get_contact_with_highest_priority(account, jid).name elif row_type == 'group': if jid in helpers.special_groups + (_('General'),): return old_text = jid title = _('Rename Group') message = _('Enter a new name for group %s') % \ GLib.markup_escape_text(jid) def on_renamed(new_text, account, row_type, jid, old_text): if 'rename' in app.interface.instances: del app.interface.instances['rename'] if row_type in ('contact', 'agent'): if old_text == new_text: return contacts = app.contacts.get_contacts(account, jid) for contact in contacts: contact.name = new_text app.connections[account].update_contact(jid, new_text, \ contacts[0].groups) self.draw_contact(jid, account) # Update opened chats for ctrl in app.interface.msg_win_mgr.get_controls(jid, account): ctrl.update_ui() win = app.interface.msg_win_mgr.get_window(jid, account) win.redraw_tab(ctrl) win.show_title() elif row_type == 'group': # in Column.JID column, we hold the group name (which is not escaped) self.rename_group(old_text, new_text, account) def on_canceled(): if 'rename' in app.interface.instances: del app.interface.instances['rename'] app.interface.instances['rename'] = dialogs.InputDialog(title, message, old_text, False, (on_renamed, account, row_type, jid, old_text), on_canceled, transient_for=self.window) def on_remove_group_item_activated(self, widget, group, account): def on_ok(checked): for contact in app.contacts.get_contacts_from_group(account, group): if not checked: self.remove_contact_from_groups(contact.jid, account, [group]) else: app.connections[account].unsubscribe(contact.jid) self.remove_contact(contact.jid, account, backend=True) dialogs.ConfirmationDialogCheck(_('Remove Group'), _('Do you want to remove group %s from the roster?') % group, _('Also remove all contacts in this group from your roster'), on_response_ok=on_ok) def on_assign_pgp_key(self, widget, contact, account): attached_keys = app.config.get_per('accounts', account, 'attached_gpg_keys').split() keys = {} keyID = _('None') for i in range(len(attached_keys) // 2): keys[attached_keys[2*i]] = attached_keys[2*i+1] if attached_keys[2*i] == contact.jid: keyID = attached_keys[2*i+1] public_keys = app.connections[account].ask_gpg_keys() public_keys[_('None')] = _('None') def on_key_selected(keyID): if keyID is None: return if keyID[0] == _('None'): if contact.jid in keys: del keys[contact.jid] keyID = '' else: keyID = keyID[0] keys[contact.jid] = keyID ctrl = app.interface.msg_win_mgr.get_control(contact.jid, account) if ctrl: ctrl.update_ui() keys_str = '' for jid in keys: keys_str += jid + ' ' + keys[jid] + ' ' app.config.set_per('accounts', account, 'attached_gpg_keys', keys_str) for u in app.contacts.get_contacts(account, contact.jid): u.keyID = helpers.prepare_and_validate_gpg_keyID(account, contact.jid, keyID) dialogs.ChooseGPGKeyDialog(_('Assign OpenPGP Key'), _('Select a key to apply to the contact'), public_keys, on_key_selected, selected=keyID, transient_for=self.window) def on_edit_groups(self, widget, list_): dialogs.EditGroupsDialog(list_) def on_history(self, widget, contact, account): """ When history menuitem is activated: call log window """ if 'logs' in app.interface.instances: app.interface.instances['logs'].window.present() app.interface.instances['logs'].open_history(contact.jid, account) else: app.interface.instances['logs'] = history_window.\ HistoryWindow(contact.jid, account) def on_disconnect(self, widget, jid, account): """ When disconnect menuitem is activated: disconect from room """ if jid in app.interface.minimized_controls[account]: ctrl = app.interface.minimized_controls[account][jid] ctrl.shutdown() ctrl.got_disconnected() self.remove_groupchat(jid, account) def on_reconnect(self, widget, jid, account): """ When reconnect menuitem is activated: join the room """ if jid in app.interface.minimized_controls[account]: ctrl = app.interface.minimized_controls[account][jid] app.interface.join_gc_room(account, jid, ctrl.nick, app.gc_passwords.get(jid, '')) def on_send_single_message_menuitem_activate(self, widget, account, contact=None): if contact is None: dialogs.SingleMessageWindow(account, action='send') elif isinstance(contact, list): dialogs.SingleMessageWindow(account, contact, 'send') else: jid = contact.jid if contact.jid == app.get_jid_from_account(account): jid += '/' + contact.resource dialogs.SingleMessageWindow(account, jid, 'send') def on_send_file_menuitem_activate(self, widget, contact, account, resource=None): app.interface.instances['file_transfers'].show_file_send_request( account, contact) def on_add_special_notification_menuitem_activate(self, widget, jid): dialogs.AddSpecialNotificationDialog(jid) def on_invite_to_new_room(self, widget, list_, resource=None): """ Resource parameter MUST NOT be used if more than one contact in list """ account_list = [] jid_list = [] for (contact, account) in list_: if contact.jid not in jid_list: if resource: # we MUST have one contact only in list_ fjid = contact.jid + '/' + resource jid_list.append(fjid) else: jid_list.append(contact.jid) if account not in account_list: account_list.append(account) # transform None in 'jabber' type_ = app.get_transport_name_from_jid(jid_list[0]) or 'jabber' for account in account_list: if app.connections[account].muc_jid[type_]: # create the room on this muc server if 'join_gc' in app.interface.instances[account]: app.interface.instances[account]['join_gc'].destroy() else: app.interface.instances[account]['join_gc'] = \ dialogs.JoinGroupchatWindow( account, None, automatic={'invities': jid_list}) break def on_invite_to_room(self, widget, list_, room_jid, room_account, resource=None): """ Resource parameter MUST NOT be used if more than one contact in list """ for e in list_: contact = e[0] contact_jid = contact.jid if resource: # we MUST have one contact only in list_ contact_jid += '/' + resource app.connections[room_account].send_invite(room_jid, contact_jid) gc_control = app.interface.msg_win_mgr.get_gc_control(room_jid, room_account) if gc_control: gc_control.print_conversation( _('%(jid)s has been invited in this room') % { 'jid': contact_jid}, graphics=False) def on_all_groupchat_maximized(self, widget, group_list): for (contact, account) in group_list: self.on_groupchat_maximized(widget, contact.jid, account) def on_groupchat_maximized(self, widget, jid, account): """ When a groupchat is maximized """ if not jid in app.interface.minimized_controls[account]: # Already opened? gc_control = app.interface.msg_win_mgr.get_gc_control(jid, account) if gc_control: mw = app.interface.msg_win_mgr.get_window(jid, account) mw.set_active_tab(gc_control) return ctrl = app.interface.minimized_controls[account][jid] mw = app.interface.msg_win_mgr.get_window(jid, account) if not mw: mw = app.interface.msg_win_mgr.create_window(ctrl.contact, ctrl.account, ctrl.type_id) id_ = mw.window.connect('motion-notify-event', ctrl._on_window_motion_notify) ctrl.handlers[id_] = mw.window ctrl.parent_win = mw ctrl.on_groupchat_maximize() mw.new_tab(ctrl) mw.set_active_tab(ctrl) self.remove_groupchat(jid, account) def on_edit_account(self, widget, account): if 'accounts' in app.interface.instances: app.interface.instances['accounts'].present() else: app.interface.instances['accounts'] = config.AccountsWindow() app.interface.instances['accounts'].select_account(account) def on_change_status_message_activate(self, widget, account): show = app.SHOW_LIST[app.connections[account].connected] def on_response(message, pep_dict): if message is None: # None is if user pressed Cancel return self.send_status(account, show, message) self.send_pep(account, pep_dict) dialogs.ChangeStatusMessageDialog(on_response, show) def on_add_to_roster(self, widget, contact, account): dialogs.AddNewContactWindow(account, contact.jid, contact.name) def on_roster_treeview_key_press_event(self, widget, event): """ When a key is pressed in the treeviews """ if event.keyval == Gdk.KEY_Escape: if self.rfilter_enabled: self.disable_rfilter() else: self.tree.get_selection().unselect_all() elif event.keyval == Gdk.KEY_F2: treeselection = self.tree.get_selection() model, list_of_paths = treeselection.get_selected_rows() if len(list_of_paths) != 1: return path = list_of_paths[0] type_ = model[path][Column.TYPE] if type_ in ('contact', 'group', 'agent'): jid = model[path][Column.JID] account = model[path][Column.ACCOUNT] self.on_rename(widget, type_, jid, account) elif event.keyval == Gdk.KEY_Delete: treeselection = self.tree.get_selection() model, list_of_paths = treeselection.get_selected_rows() if not len(list_of_paths): return type_ = model[list_of_paths[0]][Column.TYPE] account = model[list_of_paths[0]][Column.ACCOUNT] if type_ in ('account', 'group', 'self_contact') or \ account == app.ZEROCONF_ACC_NAME: return list_ = [] for path in list_of_paths: if model[path][Column.TYPE] != type_: return jid = model[path][Column.JID] account = model[path][Column.ACCOUNT] if not app.account_is_connected(account): continue contact = app.contacts.get_contact_with_highest_priority( account, jid) list_.append((contact, account)) if not list_: return if type_ == 'contact': self.on_req_usub(widget, list_) elif type_ == 'agent': self.on_remove_agent(widget, list_) elif not (event.get_state() & (Gdk.ModifierType.CONTROL_MASK | \ Gdk.ModifierType.MOD1_MASK)): num = Gdk.keyval_to_unicode(event.keyval) if num and num > 31: # if we got unicode symbol without ctrl / alt self.enable_rfilter(chr(num)) elif event.get_state() & Gdk.ModifierType.CONTROL_MASK and \ event.get_state() & Gdk.ModifierType.SHIFT_MASK and \ event.keyval == Gdk.KEY_U: self.enable_rfilter('') self.rfilter_entry.event(event) elif event.keyval == Gdk.KEY_Left: treeselection = self.tree.get_selection() model, list_of_paths = treeselection.get_selected_rows() if len(list_of_paths) != 1: return path = list_of_paths[0] iter_ = model.get_iter(path) if model.iter_has_child(iter_) and self.tree.row_expanded(path): self.tree.collapse_row(path) return True elif path.get_depth() > 1: self.tree.set_cursor(path[:-1]) return True elif event.keyval == Gdk.KEY_Right: treeselection = self.tree.get_selection() model, list_of_paths = treeselection.get_selected_rows() if len(list_of_paths) != 1: return path = list_of_paths[0] iter_ = model.get_iter(path) if model.iter_has_child(iter_): self.tree.expand_row(path, False) return True def on_roster_treeview_button_release_event(self, widget, event): try: path = self.tree.get_path_at_pos(int(event.x), int(event.y))[0] except TypeError: return False if event.button == 1: # Left click if app.single_click and not event.get_state() & Gdk.ModifierType.SHIFT_MASK and \ not event.get_state() & Gdk.ModifierType.CONTROL_MASK: # Check if button has been pressed on the same row if self.clicked_path == path: self.on_row_activated(widget, path) self.clicked_path = None def accel_group_func(self, accel_group, acceleratable, keyval, modifier): # CTRL mask if modifier & Gdk.ModifierType.CONTROL_MASK: if keyval == Gdk.KEY_s: # CTRL + s model = self.status_combobox.get_model() accounts = list(app.connections.keys()) status = model[self.previous_status_combobox_active][2] def on_response(message, pep_dict): if message is not None: # None if user pressed Cancel for account in accounts: if not app.config.get_per('accounts', account, 'sync_with_global_status'): continue current_show = app.SHOW_LIST[ app.connections[account].connected] self.send_status(account, current_show, message) self.send_pep(account, pep_dict) dialogs.ChangeStatusMessageDialog(on_response, status) return True elif keyval == Gdk.KEY_k: # CTRL + k self.enable_rfilter('') def on_roster_treeview_button_press_event(self, widget, event): try: pos = self.tree.get_path_at_pos(int(event.x), int(event.y)) path, x = pos[0], pos[2] except TypeError: self.tree.get_selection().unselect_all() return False if event.button == 3: # Right click try: model, list_of_paths = self.tree.get_selection().\ get_selected_rows() except TypeError: list_of_paths = [] if path not in list_of_paths: self.tree.get_selection().unselect_all() self.tree.get_selection().select_path(path) return self.show_treeview_menu(event) elif event.button == 2: # Middle click try: model, list_of_paths = self.tree.get_selection().\ get_selected_rows() except TypeError: list_of_paths = [] if list_of_paths != [path]: self.tree.get_selection().unselect_all() self.tree.get_selection().select_path(path) type_ = model[path][Column.TYPE] if type_ in ('agent', 'contact', 'self_contact', 'groupchat'): self.on_row_activated(widget, path) elif type_ == 'account': account = model[path][Column.ACCOUNT] if account != 'all': show = app.connections[account].connected if show > 1: # We are connected self.on_change_status_message_activate(widget, account) return True show = helpers.get_global_show() if show == 'offline': return True def on_response(message, pep_dict): if message is None: return True for acct in app.connections: if not app.config.get_per('accounts', acct, 'sync_with_global_status'): continue current_show = app.SHOW_LIST[app.connections[acct].\ connected] self.send_status(acct, current_show, message) self.send_pep(acct, pep_dict) dialogs.ChangeStatusMessageDialog(on_response, show) return True elif event.button == 1: # Left click model = self.modelfilter type_ = model[path][Column.TYPE] # x_min is the x start position of status icon column if app.config.get('avatar_position_in_roster') == 'left': x_min = AvatarSize.ROSTER else: x_min = 0 if app.single_click and not event.get_state() & Gdk.ModifierType.SHIFT_MASK and \ not event.get_state() & Gdk.ModifierType.CONTROL_MASK: # Don't handle double click if we press icon of a metacontact titer = model.get_iter(path) if x > x_min and x < x_min + 27 and type_ == 'contact' and \ model.iter_has_child(titer): if (self.tree.row_expanded(path)): self.tree.collapse_row(path) else: self.tree.expand_row(path, False) return # We just save on which row we press button, and open chat # window on button release to be able to do DND without opening # chat window self.clicked_path = path return else: if type_ == 'group' and x < 27: # first cell in 1st column (the arrow SINGLE clicked) if (self.tree.row_expanded(path)): self.tree.collapse_row(path) else: self.expand_group_row(path) elif type_ == 'contact' and x > x_min and x < x_min + 27: if (self.tree.row_expanded(path)): self.tree.collapse_row(path) else: self.tree.expand_row(path, False) def expand_group_row(self, path): self.tree.expand_row(path, False) iter = self.modelfilter.get_iter(path) child_iter = self.modelfilter.iter_children(iter) while child_iter: type_ = self.modelfilter[child_iter][Column.TYPE] account = self.modelfilter[child_iter][Column.ACCOUNT] group = self.modelfilter[child_iter][Column.JID] if type_ == 'group' and account + group not in self.collapsed_rows: self.expand_group_row(self.modelfilter.get_path(child_iter)) child_iter = self.modelfilter.iter_next(child_iter) def on_req_usub(self, widget, list_): """ Remove a contact. list_ is a list of (contact, account) tuples """ def on_ok(is_checked, list_): remove_auth = True if len(list_) == 1: contact = list_[0][0] if contact.sub != 'to' and is_checked: remove_auth = False for (contact, account) in list_: if _('Not in Roster') not in contact.get_shown_groups(): app.connections[account].unsubscribe(contact.jid, remove_auth) self.remove_contact(contact.jid, account, backend=True) if not remove_auth and contact.sub == 'both': contact.name = '' contact.groups = [] contact.sub = 'from' # we can't see him, but have to set it manually in contact contact.show = 'offline' app.contacts.add_contact(account, contact) self.add_contact(contact.jid, account) def on_ok2(list_): on_ok(False, list_) if len(list_) == 1: contact = list_[0][0] pritext = _('Contact "%s" will be removed from your roster') % \ contact.get_shown_name() sectext = _('You are about to remove "%(name)s" (%(jid)s) from ' 'your roster.\n') % {'name': contact.get_shown_name(), 'jid': contact.jid} if contact.sub == 'to': dialogs.ConfirmationDialog(pritext, sectext + \ _('By removing this contact you also remove authorization ' 'resulting in them always seeing you as offline.'), on_response_ok=(on_ok2, list_)) elif _('Not in Roster') in contact.get_shown_groups(): # Contact is not in roster dialogs.ConfirmationDialog(pritext, sectext + \ _('Do you want to continue?'), on_response_ok=(on_ok2, list_)) else: dialogs.ConfirmationDialogCheck(pritext, sectext + \ _('By removing this contact you also by default remove ' 'authorization resulting in them always seeing you as' ' offline.'), _('I want this contact to know my status after removal'), on_response_ok=(on_ok, list_)) else: # several contact to remove at the same time pritext = _('Contacts will be removed from your roster') jids = '' for (contact, account) in list_: jids += '\n ' + contact.get_shown_name() + ' (%s)' % \ contact.jid + ',' sectext = _('By removing these contacts:%s\nyou also remove ' 'authorization resulting in them always seeing you as ' 'offline.') % jids dialogs.ConfirmationDialog(pritext, sectext, on_response_ok=(on_ok2, list_)) def on_send_custom_status(self, widget, contact_list, show, group=None): """ Send custom status """ # contact_list has only one element except if group != None def on_response(message, pep_dict): if message is None: # None if user pressed Cancel return account_list = [] for (contact, account) in contact_list: if account not in account_list: account_list.append(account) # 1. update status_sent_to_[groups|users] list if group: for account in account_list: if account not in app.interface.status_sent_to_groups: app.interface.status_sent_to_groups[account] = {} app.interface.status_sent_to_groups[account][group] = show else: for (contact, account) in contact_list: if account not in app.interface.status_sent_to_users: app.interface.status_sent_to_users[account] = {} app.interface.status_sent_to_users[account][contact.jid] \ = show # 2. update privacy lists if main status is invisible for account in account_list: if app.SHOW_LIST[app.connections[account].connected] == \ 'invisible': app.connections[account].set_invisible_rule() # 3. send directed presence for (contact, account) in contact_list: our_jid = app.get_jid_from_account(account) jid = contact.jid if jid == our_jid: jid += '/' + contact.resource self.send_status(account, show, message, to=jid) def send_it(is_checked=None): if is_checked is not None: # dialog has been shown if is_checked: # user does not want to be asked again app.config.set('confirm_custom_status', 'no') else: app.config.set('confirm_custom_status', 'yes') self.get_status_message(show, on_response, show_pep=False, always_ask=True) confirm_custom_status = app.config.get('confirm_custom_status') if confirm_custom_status == 'no': send_it() return pritext = _('You are about to send a custom status. Are you sure you ' 'want to continue?') sectext = _('This contact will temporarily see you as %(status)s, ' 'but only until you change your status. Then they will see ' 'your global status.') % {'status': show} dialogs.ConfirmationDialogCheck(pritext, sectext, _('_Do not ask me again'), on_response_ok=send_it) def on_status_combobox_changed(self, widget): """ When we change our status via the combobox """ model = self.status_combobox.get_model() active = self.status_combobox.get_active() if active == -1: # no active item return if not self.combobox_callback_active: self.previous_status_combobox_active = active return accounts = list(app.connections.keys()) if len(accounts) == 0: dialogs.ErrorDialog(_('No account available'), _('You must create an account before you can chat with other ' 'contacts.')) self.update_status_combobox() return status = model[active][2] # status "desync'ed" or not statuses_unified = helpers.statuses_unified() if (active == 7 and statuses_unified) or (active == 9 and \ not statuses_unified): # 'Change status message' selected: # do not change show, just show change status dialog status = model[self.previous_status_combobox_active][2] def on_response(message, pep_dict): if message is not None: # None if user pressed Cancel for account in accounts: if not app.config.get_per('accounts', account, 'sync_with_global_status'): continue current_show = app.SHOW_LIST[ app.connections[account].connected] self.send_status(account, current_show, message) self.send_pep(account, pep_dict) self.combobox_callback_active = False self.status_combobox.set_active( self.previous_status_combobox_active) self.combobox_callback_active = True dialogs.ChangeStatusMessageDialog(on_response, status) return # we are about to change show, so save this new show so in case # after user chooses "Change status message" menuitem # we can return to this show self.previous_status_combobox_active = active connected_accounts = app.get_number_of_connected_accounts() def on_continue(message, pep_dict): if message is None: # user pressed Cancel to change status message dialog self.update_status_combobox() return global_sync_accounts = [] for acct in accounts: if app.config.get_per('accounts', acct, 'sync_with_global_status'): global_sync_accounts.append(acct) global_sync_connected_accounts = \ app.get_number_of_connected_accounts(global_sync_accounts) for account in accounts: if not app.config.get_per('accounts', account, 'sync_with_global_status'): continue # we are connected (so we wanna change show and status) # or no account is connected and we want to connect with new # show and status if not global_sync_connected_accounts > 0 or \ app.connections[account].connected > 0: self.send_status(account, status, message) self.send_pep(account, pep_dict) self.update_status_combobox() if status == 'invisible': bug_user = False for account in accounts: if connected_accounts < 1 or app.account_is_connected( account): if not app.config.get_per('accounts', account, 'sync_with_global_status'): continue # We're going to change our status to invisible if self.connected_rooms(account): bug_user = True break if bug_user: def on_ok(): self.get_status_message(status, on_continue, show_pep=False) def on_cancel(): self.update_status_combobox() dialogs.ConfirmationDialog( _('You are participating in one or more group chats'), _('Changing your status to invisible will result in ' 'disconnection from those group chats. Are you sure you ' 'want to go invisible?'), on_response_ok=on_ok, on_response_cancel=on_cancel) return self.get_status_message(status, on_continue) def on_publish_tune_toggled(self, widget, account): active = widget.get_active() app.config.set_per('accounts', account, 'publish_tune', active) if active: app.interface.enable_music_listener() else: app.connections[account].retract_tune() # disable music listener only if no other account uses it for acc in app.connections: if app.config.get_per('accounts', acc, 'publish_tune'): break else: app.interface.disable_music_listener() helpers.update_optional_features(account) def on_publish_location_toggled(self, widget, account): active = widget.get_active() app.config.set_per('accounts', account, 'publish_location', active) if active: location_listener.enable() else: app.connections[account].retract_location() helpers.update_optional_features(account) def on_pep_services_menuitem_activate(self, widget, account): if 'pep_services' in app.interface.instances[account]: app.interface.instances[account]['pep_services'].window.present() else: app.interface.instances[account]['pep_services'] = \ config.ManagePEPServicesWindow(account) def on_add_new_contact(self, widget, account): dialogs.AddNewContactWindow(account) def on_join_gc_activate(self, widget, account): """ When the join gc menuitem is clicked, show the join gc window """ invisible_show = app.SHOW_LIST.index('invisible') if app.connections[account].connected == invisible_show: dialogs.ErrorDialog(_('You cannot join a group chat while you are ' 'invisible')) return if 'join_gc' in app.interface.instances[account]: app.interface.instances[account]['join_gc'].present() else: app.interface.instances[account]['join_gc'] = \ dialogs.JoinGroupchatWindow(account, None) def on_show_transports_action(self, action, param): app.config.set('show_transports_group', param.get_boolean()) action.set_state(param) self.refilter_shown_roster_items() def on_manage_bookmarks_menuitem_activate(self, widget): config.ManageBookmarksWindow() def on_execute_command(self, widget, contact, account, resource=None): """ Execute command. Full JID needed; if it is other contact, resource is necessary. Widget is unnecessary, only to be able to make this a callback """ jid = contact.jid if resource is not None: jid = jid + '/' + resource adhoc_commands.CommandWindow(account, jid) def on_roster_window_focus_in_event(self, widget, event): # roster received focus, so if we had urgency REMOVE IT # NOTE: we do not have to read the message to remove urgency # so this functions does that gtkgui_helpers.set_unset_urgency_hint(widget, False) # if a contact row is selected, update colors (eg. for status msg) # because gtk engines may differ in bg when window is selected # or not if len(self._last_selected_contact): for (jid, account) in self._last_selected_contact: self.draw_contact(jid, account, selected=True, focus=True) def on_roster_window_focus_out_event(self, widget, event): # if a contact row is selected, update colors (eg. for status msg) # because gtk engines may differ in bg when window is selected # or not if len(self._last_selected_contact): for (jid, account) in self._last_selected_contact: self.draw_contact(jid, account, selected=True, focus=False) def on_roster_window_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: if self.rfilter_enabled: self.disable_rfilter() return True if app.interface.msg_win_mgr.mode == \ MessageWindowMgr.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER and \ app.interface.msg_win_mgr.one_window_opened(): # let message window close the tab return list_of_paths = self.tree.get_selection().get_selected_rows()[1] if not len(list_of_paths) and not app.config.get( 'quit_on_roster_x_button') and ((app.interface.systray_enabled and\ app.config.get('trayicon') == 'always') or app.config.get( 'allow_hide_roster')): if app.config.get('hide_on_roster_x_button'): self.window.hide() else: self.window.iconify() elif event.get_state() & Gdk.ModifierType.CONTROL_MASK and event.keyval == \ Gdk.KEY_i: treeselection = self.tree.get_selection() model, list_of_paths = treeselection.get_selected_rows() for path in list_of_paths: type_ = model[path][Column.TYPE] if type_ in ('contact', 'agent'): jid = model[path][Column.JID] account = model[path][Column.ACCOUNT] contact = app.contacts.get_first_contact_from_jid(account, jid) self.on_info(widget, contact, account) elif event.get_state() & Gdk.ModifierType.CONTROL_MASK and event.keyval == \ Gdk.KEY_h: treeselection = self.tree.get_selection() model, list_of_paths = treeselection.get_selected_rows() if len(list_of_paths) != 1: return path = list_of_paths[0] type_ = model[path][Column.TYPE] if type_ in ('contact', 'agent'): jid = model[path][Column.JID] account = model[path][Column.ACCOUNT] contact = app.contacts.get_first_contact_from_jid(account, jid) self.on_history(widget, contact, account) def on_roster_window_popup_menu(self, widget): event = Gdk.Event.new(Gdk.EventType.KEY_PRESS) self.show_treeview_menu(event) def on_row_activated(self, widget, path): """ When an iter is activated (double-click or single click if gnome is set this way) """ model = self.modelfilter account = model[path][Column.ACCOUNT] type_ = model[path][Column.TYPE] if type_ in ('group', 'account'): if self.tree.row_expanded(path): self.tree.collapse_row(path) else: self.tree.expand_row(path, False) return if self.rfilter_enabled: GObject.idle_add(self.disable_rfilter) jid = model[path][Column.JID] resource = None contact = app.contacts.get_contact_with_highest_priority(account, jid) titer = model.get_iter(path) if contact.is_groupchat(): first_ev = app.events.get_first_event(account, jid) if first_ev and self.open_event(account, jid, first_ev): # We are invited to a GC # open event cares about connecting to it self.remove_groupchat(jid, account) else: self.on_groupchat_maximized(None, jid, account) return # else first_ev = app.events.get_first_event(account, jid) if not first_ev: # look in other resources for c in app.contacts.get_contacts(account, jid): fjid = c.get_full_jid() first_ev = app.events.get_first_event(account, fjid) if first_ev: resource = c.resource break if not first_ev and model.iter_has_child(titer): child_iter = model.iter_children(titer) while not first_ev and child_iter: child_jid = model[child_iter][Column.JID] first_ev = app.events.get_first_event(account, child_jid) if first_ev: jid = child_jid else: child_iter = model.iter_next(child_iter) session = None if first_ev: if first_ev.type_ in ('chat', 'normal'): session = first_ev.session fjid = jid if resource: fjid += '/' + resource if self.open_event(account, fjid, first_ev): return # else contact = app.contacts.get_contact(account, jid, resource) if not contact or isinstance(contact, list): contact = app.contacts.get_contact_with_highest_priority(account, jid) if jid == app.get_jid_from_account(account): resource = None app.interface.on_open_chat_window(None, contact, account, \ resource=resource, session=session) def on_roster_treeview_row_activated(self, widget, path, col=0): """ When an iter is double clicked: open the first event window """ if not app.single_click: self.on_row_activated(widget, path) def on_roster_treeview_row_expanded(self, widget, titer, path): """ When a row is expanded change the icon of the arrow """ self._toggeling_row = True model = widget.get_model() child_model = model.get_model() child_iter = model.convert_iter_to_child_iter(titer) if self.regroup: # merged accounts accounts = list(app.connections.keys()) else: accounts = [model[titer][Column.ACCOUNT]] type_ = model[titer][Column.TYPE] if type_ == 'group': group = model[titer][Column.JID] child_model[child_iter][Column.IMG] = \ app.interface.jabber_state_images['16']['opened'] if self.rfilter_enabled: return for account in accounts: if group in app.groups[account]: # This account has this group app.groups[account][group]['expand'] = True if account + group in self.collapsed_rows: self.collapsed_rows.remove(account + group) for contact in app.contacts.iter_contacts(account): jid = contact.jid if group in contact.groups and \ app.contacts.is_big_brother(account, jid, accounts) and \ account + group + jid not in self.collapsed_rows: titers = self._get_contact_iter(jid, account) for titer in titers: path = model.get_path(titer) self.tree.expand_row(path, False) elif type_ == 'account': account = list(accounts)[0] # There is only one cause we don't use merge if account in self.collapsed_rows: self.collapsed_rows.remove(account) self.draw_account(account) # When we expand, groups are collapsed. Restore expand state for group in app.groups[account]: if app.groups[account][group]['expand']: titer = self._get_group_iter(group, account) if titer: path = model.get_path(titer) self.tree.expand_row(path, False) elif type_ == 'contact': # Metacontact got toggled, update icon jid = model[titer][Column.JID] account = model[titer][Column.ACCOUNT] contact = app.contacts.get_contact(account, jid) for group in contact.groups: if account + group + jid in self.collapsed_rows: self.collapsed_rows.remove(account + group + jid) family = app.contacts.get_metacontacts_family(account, jid) nearby_family = \ self._get_nearby_family_and_big_brother(family, account)[0] # Redraw all brothers to show pending events for data in nearby_family: self.draw_contact(data['jid'], data['account']) self._toggeling_row = False def on_roster_treeview_row_collapsed(self, widget, titer, path): """ When a row is collapsed change the icon of the arrow """ self._toggeling_row = True model = widget.get_model() child_model = model.get_model() child_iter = model.convert_iter_to_child_iter(titer) if self.regroup: # merged accounts accounts = list(app.connections.keys()) else: accounts = [model[titer][Column.ACCOUNT]] type_ = model[titer][Column.TYPE] if type_ == 'group': child_model[child_iter][Column.IMG] = app.interface.\ jabber_state_images['16']['closed'] if self.rfilter_enabled: return group = model[titer][Column.JID] for account in accounts: if group in app.groups[account]: # This account has this group app.groups[account][group]['expand'] = False if account + group not in self.collapsed_rows: self.collapsed_rows.append(account + group) elif type_ == 'account': account = accounts[0] # There is only one cause we don't use merge if account not in self.collapsed_rows: self.collapsed_rows.append(account) self.draw_account(account) elif type_ == 'contact': # Metacontact got toggled, update icon jid = model[titer][Column.JID] account = model[titer][Column.ACCOUNT] contact = app.contacts.get_contact(account, jid) groups = contact.groups if not groups: groups = [_('General')] for group in groups: if account + group + jid not in self.collapsed_rows: self.collapsed_rows.append(account + group + jid) family = app.contacts.get_metacontacts_family(account, jid) nearby_family = \ self._get_nearby_family_and_big_brother(family, account)[0] # Redraw all brothers to show pending events for data in nearby_family: self.draw_contact(data['jid'], data['account']) self._toggeling_row = False def on_modelfilter_row_has_child_toggled(self, model, path, titer): """ Called when a row has gotten the first or lost its last child row Expand Parent if necessary. """ if self._toggeling_row: # Signal is emitted when we write to our model return type_ = model[titer][Column.TYPE] account = model[titer][Column.ACCOUNT] if not account: return if type_ == 'contact': child_iter = model.convert_iter_to_child_iter(titer) if self.model.iter_has_child(child_iter): # we are a bigbrother metacontact # redraw us to show/hide expand icon if self.filtering: # Prevent endless loops jid = model[titer][Column.JID] GLib.idle_add(self.draw_contact, jid, account) elif type_ == 'group': group = model[titer][Column.JID] GLib.idle_add(self._adjust_group_expand_collapse_state, group, account) elif type_ == 'account': GLib.idle_add(self._adjust_account_expand_collapse_state, account) # Selection can change when the model is filtered # Only write to the model when filtering is finished! # # FIXME: When we are filtering our custom colors are somehow lost # # def on_treeview_selection_changed(self, selection): # '''Called when selection in TreeView has changed. # # Redraw unselected rows to make status message readable # on all possible backgrounds. # ''' # model, list_of_paths = selection.get_selected_rows() # if len(self._last_selected_contact): # # update unselected rows # for (jid, account) in self._last_selected_contact: # GLib.idle_add(self.draw_contact, jid, # account) # self._last_selected_contact = [] # if len(list_of_paths) == 0: # return # for path in list_of_paths: # row = model[path] # if row[Column.TYPE] != 'contact': # self._last_selected_contact = [] # return # jid = row[Column.JID] # account = row[Column.ACCOUNT] # self._last_selected_contact.append((jid, account)) # GLib.idle_add(self.draw_contact, jid, account, True) def on_service_disco_menuitem_activate(self, widget, account): server_jid = app.config.get_per('accounts', account, 'hostname') if server_jid in app.interface.instances[account]['disco']: app.interface.instances[account]['disco'][server_jid].\ window.present() else: try: # Object will add itself to the window dict disco.ServiceDiscoveryWindow(account, address_entry=True) except GajimGeneralException: pass def on_show_offline_contacts_action(self, action, param): """ When show offline option is changed: redraw the treeview """ action.set_state(param) app.config.set('showoffline', param.get_boolean()) self.refilter_shown_roster_items() self.window.lookup_action('show-active').set_enabled( not param.get_boolean()) def on_show_active_contacts_action(self, action, param): """ When show only active contact option is changed: redraw the treeview """ action.set_state(param) app.config.set('show_only_chat_and_online', param.get_boolean()) self.refilter_shown_roster_items() self.window.lookup_action('show-offline').set_enabled( not param.get_boolean()) def on_show_roster_action(self, action, param): # when num controls is 0 this menuitem is hidden, but still need to # disable keybinding action.set_state(param) if self.hpaned.get_child2() is not None: self.show_roster_vbox(param.get_boolean()) def on_rfilter_entry_changed(self, widget): """ When we update the content of the filter """ self.rfilter_string = widget.get_text().lower() if self.rfilter_string == '': self.disable_rfilter() self.refilter_shown_roster_items() # select first row self.tree.get_selection().unselect_all() def _func(model, path, iter_, param): if model[iter_][Column.TYPE] == 'contact' and self.rfilter_string in \ model[iter_][Column.NAME].lower(): col = self.tree.get_column(0) self.tree.set_cursor_on_cell(path, col, None, False) return True self.modelfilter.foreach(_func, None) def on_rfilter_entry_icon_press(self, widget, icon, event): """ Disable the roster filtering by clicking the icon in the textEntry """ self.disable_rfilter() def on_rfilter_entry_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.disable_rfilter() elif event.keyval == Gdk.KEY_Return: self.tree.grab_focus() self.tree.event(event) self.disable_rfilter() elif event.keyval in (Gdk.KEY_Up, Gdk.KEY_Down): self.tree.grab_focus() self.tree.event(event) elif event.keyval == Gdk.KEY_BackSpace: if widget.get_text() == '': self.disable_rfilter() def enable_rfilter(self, search_string): self.rfilter_entry.set_visible(True) self.rfilter_entry.set_editable(True) self.rfilter_entry.grab_focus() if self.rfilter_enabled: self.rfilter_entry.set_text(self.rfilter_entry.get_text() + \ search_string) else: self.rfilter_enabled = True self.rfilter_entry.set_text(search_string) self.tree.expand_all() self.rfilter_entry.set_position(-1) # If roster is hidden, let's temporarily show it. This can happen if user # enables rfilter via keyboard shortcut. self.show_roster_vbox(True) def disable_rfilter(self): self.rfilter_enabled = False self.rfilter_entry.set_text('') self.rfilter_entry.set_visible(False) self.rfilter_entry.set_editable(False) self.refilter_shown_roster_items() self.tree.grab_focus() self._readjust_expand_collapse_state() # If roster was hidden before enable_rfilter was called, hide it back. state = self.window.lookup_action('show-roster').get_state().get_boolean() if state is False and self.hpaned.get_child2() is not None: self.show_roster_vbox(False) def on_roster_hpaned_notify(self, pane, gparamspec): """ Keep changing the width of the roster (when a Gtk.Paned widget handle is dragged) """ if gparamspec and gparamspec.name == 'position': roster_width = pane.get_child1().get_allocation().width app.config.set('roster_width', roster_width) app.config.set('roster_hpaned_position', pane.get_position()) ################################################################################ ### Drag and Drop handling ################################################################################ def drag_data_get_data(self, treeview, context, selection, target_id, etime): model, list_of_paths = self.tree.get_selection().get_selected_rows() if len(list_of_paths) != 1: return path = list_of_paths[0] data = '' if path.get_depth() >= 2: data = model[path][Column.JID] selection.set_text(data, -1) def drag_begin(self, treeview, context): self.dragging = True def drag_end(self, treeview, context): self.dragging = False def on_drop_rosterx(self, widget, account_source, c_source, account_dest, c_dest, was_big_brother, context, etime): type_ = 'message' if c_dest.show not in ('offline', 'error') and c_dest.supports( NS_ROSTERX): type_ = 'iq' app.connections[account_dest].send_contacts([c_source], c_dest.get_full_jid(), type_=type_) def on_drop_in_contact(self, widget, account_source, c_source, account_dest, c_dest, was_big_brother, context, etime): if not app.connections[account_source].private_storage_supported or \ not app.connections[account_dest].private_storage_supported: dialogs.WarningDialog(_('Metacontacts storage not supported by ' 'your server'), _('Your server does not support storing metacontacts ' 'information. So this information will not be saved on next ' 'reconnection.')) def merge_contacts(is_checked=None): contacts = 0 if is_checked is not None: # dialog has been shown if is_checked: # user does not want to be asked again app.config.set('confirm_metacontacts', 'no') else: app.config.set('confirm_metacontacts', 'yes') # We might have dropped on a metacontact. # Remove it and readd later with updated family info dest_family = app.contacts.get_metacontacts_family(account_dest, c_dest.jid) if dest_family: self._remove_metacontact_family(dest_family, account_dest) source_family = app.contacts.get_metacontacts_family( account_source, c_source.jid) if dest_family == source_family: n = contacts = len(dest_family) for tag in source_family: if tag['jid'] == c_source.jid: tag['order'] = contacts continue if 'order' in tag: n -= 1 tag['order'] = n else: self._remove_entity(c_dest, account_dest) old_family = app.contacts.get_metacontacts_family(account_source, c_source.jid) old_groups = c_source.groups # Remove old source contact(s) if was_big_brother: # We have got little brothers. Readd them all self._remove_metacontact_family(old_family, account_source) else: # We are only a litle brother. Simply remove us from our big # brother if self._get_contact_iter(c_source.jid, account_source): # When we have been in the group before. # Do not try to remove us again self._remove_entity(c_source, account_source) own_data = {} own_data['jid'] = c_source.jid own_data['account'] = account_source # Don't touch the rest of the family old_family = [own_data] # Apply new tag and update contact for data in old_family: if account_source != data['account'] and not self.regroup: continue _account = data['account'] _jid = data['jid'] _contact = app.contacts.get_first_contact_from_jid(_account, _jid) if not _contact: # One of the metacontacts may be not connected. continue _contact.groups = c_dest.groups[:] app.contacts.add_metacontact(account_dest, c_dest.jid, _account, _contact.jid, contacts) app.connections[account_source].update_contact(_contact.jid, _contact.name, _contact.groups) # Re-add all and update GUI new_family = app.contacts.get_metacontacts_family(account_source, c_source.jid) brothers = self._add_metacontact_family(new_family, account_source) for c, acc in brothers: self.draw_completely(c.jid, acc) old_groups.extend(c_dest.groups) for g in old_groups: self.draw_group(g, account_source) self.draw_account(account_source) context.finish(True, True, etime) dest_family = app.contacts.get_metacontacts_family(account_dest, c_dest.jid) source_family = app.contacts.get_metacontacts_family(account_source, c_source.jid) confirm_metacontacts = app.config.get('confirm_metacontacts') if confirm_metacontacts == 'no' or dest_family == source_family: merge_contacts() return pritext = _('You are about to create a metacontact. Are you sure you ' 'want to continue?') sectext = _('Metacontacts are a way to regroup several contacts in one ' 'line. Generally it is used when the same person has several ' 'XMPP accounts or transport accounts.') dlg = dialogs.ConfirmationDialogCheck(pritext, sectext, _('_Do not ask me again'), on_response_ok=merge_contacts) if not confirm_metacontacts: # First time we see this window dlg.checkbutton.set_active(True) def on_drop_in_group(self, widget, account, c_source, grp_dest, is_big_brother, context, etime, grp_source = None): if is_big_brother: # add whole metacontact to new group self.add_contact_to_groups(c_source.jid, account, [grp_dest, ]) # remove afterwards so the contact is not moved to General in the # meantime if grp_dest != grp_source: self.remove_contact_from_groups(c_source.jid, account, [grp_source]) else: # Normal contact or little brother family = app.contacts.get_metacontacts_family(account, c_source.jid) if family: # Little brother # Remove whole family. Remove us from the family. # Then re-add other family members. self._remove_metacontact_family(family, account) app.contacts.remove_metacontact(account, c_source.jid) for data in family: if account != data['account'] and not self.regroup: continue if data['jid'] == c_source.jid and\ data['account'] == account: continue self.add_contact(data['jid'], data['account']) break self.add_contact_to_groups(c_source.jid, account, [grp_dest, ]) else: # Normal contact self.add_contact_to_groups(c_source.jid, account, [grp_dest, ]) # remove afterwards so the contact is not moved to General in # the meantime if grp_dest != grp_source: self.remove_contact_from_groups(c_source.jid, account, [grp_source]) if context.get_actions() in (Gdk.DragAction.MOVE, Gdk.DragAction.COPY): context.finish(True, True, etime) def drag_drop(self, treeview, context, x, y, timestamp): target_list = treeview.drag_dest_get_target_list() target = treeview.drag_dest_find_target(context, target_list) treeview.drag_get_data(context, target, 0) context.finish(False, True, 0) return True def move_group(self, old_name, new_name, account): for group in list(app.groups[account].keys()): if group.startswith(old_name): self.rename_group(group, group.replace(old_name, new_name), account) def drag_data_received_data(self, treeview, context, x, y, selection, info, etime): treeview.stop_emission_by_name('drag_data_received') drop_info = treeview.get_dest_row_at_pos(x, y) if not drop_info: return data = selection.get_data().decode() if not data: return # prevents tb when several entrys are dragged model = treeview.get_model() path_dest, position = drop_info if position == Gtk.TreeViewDropPosition.BEFORE and len(path_dest) == 2 \ and path_dest[1] == 0: # dropped before the first group return if position == Gtk.TreeViewDropPosition.BEFORE and len(path_dest) == 2: # dropped before a group: we drop it in the previous group every # time path_dest = (path_dest[0], path_dest[1]-1) # destination: the row something got dropped on iter_dest = model.get_iter(path_dest) type_dest = model[iter_dest][Column.TYPE] jid_dest = model[iter_dest][Column.JID] account_dest = model[iter_dest][Column.ACCOUNT] # drop on account row in merged mode, we cannot know the desired account if account_dest == 'all': return # nothing can be done, if destination account is offline if app.connections[account_dest].connected < 2: return # A file got dropped on the roster if info == self.TARGET_TYPE_URI_LIST: if len(path_dest) < 3: return if type_dest != 'contact': return c_dest = app.contacts.get_contact_with_highest_priority( account_dest, jid_dest) if not c_dest.supports(NS_FILE): return uri = data.strip() uri_splitted = uri.split() # we may have more than one file dropped try: # This is always the last element in windows uri_splitted.remove('\0') except ValueError: pass nb_uri = len(uri_splitted) # Check the URIs bad_uris = [] for a_uri in uri_splitted: path = helpers.get_file_path_from_dnd_dropped_uri(a_uri) if not os.path.isfile(path): bad_uris.append(a_uri) if len(bad_uris): dialogs.ErrorDialog(_('Invalid file URI:'), '\n'.join(bad_uris)) return def _on_send_files(account, jid, uris): c = app.contacts.get_contact_with_highest_priority(account, jid) for uri in uris: path = helpers.get_file_path_from_dnd_dropped_uri(uri) if os.path.isfile(path): # is it file? app.interface.instances['file_transfers'].send_file( account, c, path) # Popup dialog to confirm sending prim_text = 'Send file?' sec_text = i18n.ngettext('Do you want to send this file to %s:', 'Do you want to send these files to %s:', nb_uri) %\ c_dest.get_shown_name() for uri in uri_splitted: path = helpers.get_file_path_from_dnd_dropped_uri(uri) sec_text += '\n' + os.path.basename(path) dialog = dialogs.NonModalConfirmationDialog(prim_text, sec_text, on_response_ok=(_on_send_files, account_dest, jid_dest, uri_splitted)) dialog.popup() return # a roster entry was dragged and dropped somewhere in the roster # source: the row that was dragged path_source = treeview.get_selection().get_selected_rows()[1][0] iter_source = model.get_iter(path_source) type_source = model[iter_source][Column.TYPE] account_source = model[iter_source][Column.ACCOUNT] if app.config.get_per('accounts', account_source, 'is_zeroconf'): return if type_dest == 'self_contact': # drop on self contact row return if type_dest == 'groupchat': # drop on a minimized groupchat # TODO: Invite to groupchat if type_dest = contact return if type_source == 'group': if account_source != account_dest: # drop on another account return grp_source = model[iter_source][Column.JID] delimiter = app.connections[account_source].nested_group_delimiter grp_source_list = grp_source.split(delimiter) new_grp = None if type_dest == 'account': new_grp = grp_source_list[-1] elif type_dest == 'group': grp_dest = model[iter_dest][Column.JID] grp_dest_list = grp_dest.split(delimiter) # Do not allow to drop on a subgroup of source group if grp_source_list[0] != grp_dest_list[0]: new_grp = model[iter_dest][Column.JID] + delimiter + \ grp_source_list[-1] if new_grp: self.move_group(grp_source, new_grp, account_source) # Only normal contacts and group can be dragged if type_source != 'contact': return # A contact was dropped if app.config.get_per('accounts', account_dest, 'is_zeroconf'): # drop on zeroconf account, adding not possible return if type_dest == 'account' and account_source == account_dest: # drop on the account it was dragged from return # Get valid source group, jid and contact it = iter_source while model[it][Column.TYPE] == 'contact': it = model.iter_parent(it) grp_source = model[it][Column.JID] if grp_source in helpers.special_groups and \ grp_source not in ('Not in Roster', 'Observers'): # a transport or a minimized groupchat was dragged # we can add it to other accounts but not move it to another group, # see below return jid_source = data c_source = app.contacts.get_contact_with_highest_priority( account_source, jid_source) # Get destination group grp_dest = None if type_dest == 'group': grp_dest = model[iter_dest][Column.JID] elif type_dest in ('contact', 'agent'): it = iter_dest while model[it][Column.TYPE] != 'group': it = model.iter_parent(it) grp_dest = model[it][Column.JID] if grp_dest in helpers.special_groups: return if jid_source == jid_dest: if grp_source == grp_dest and account_source == account_dest: # Drop on self return # contact drop somewhere in or on a foreign account if (type_dest == 'account' or not self.regroup) and \ account_source != account_dest: # add to account in specified group dialogs.AddNewContactWindow(account=account_dest, jid=jid_source, user_nick=c_source.name, group=grp_dest) return # we may not add contacts from special_groups if grp_source in helpers.special_groups : return # Is the contact we drag a meta contact? accounts = (self.regroup and app.contacts.get_accounts()) or \ account_source is_big_brother = app.contacts.is_big_brother(account_source, jid_source, accounts) drop_in_middle_of_meta = False if type_dest == 'contact': if position == Gtk.TreeViewDropPosition.BEFORE and len(path_dest) == 4: drop_in_middle_of_meta = True if position == Gtk.TreeViewDropPosition.AFTER and (len(path_dest) == 4 or\ self.modelfilter.iter_has_child(iter_dest)): drop_in_middle_of_meta = True # Contact drop on group row or between two contacts that are # not metacontacts if (type_dest == 'group' or position in (Gtk.TreeViewDropPosition.BEFORE, Gtk.TreeViewDropPosition.AFTER)) and not drop_in_middle_of_meta: self.on_drop_in_group(None, account_source, c_source, grp_dest, is_big_brother, context, etime, grp_source) return # Contact drop on another contact, make meta contacts if position == Gtk.TreeViewDropPosition.INTO_OR_AFTER or \ position == Gtk.TreeViewDropPosition.INTO_OR_BEFORE or drop_in_middle_of_meta: c_dest = app.contacts.get_contact_with_highest_priority( account_dest, jid_dest) if not c_dest: # c_dest is None if jid_dest doesn't belong to account return menu = Gtk.Menu() #from and to are the names of contacts item = Gtk.MenuItem.new_with_label(_('Send %(from)s to %(to)s') % { 'from': c_source.get_shown_name(), 'to': c_dest.get_shown_name()}) item.set_use_underline(False) item.connect('activate', self.on_drop_rosterx, account_source, c_source, account_dest, c_dest, is_big_brother, context, etime) menu.append(item) dest_family = app.contacts.get_metacontacts_family(account_dest, c_dest.jid) source_family = app.contacts.get_metacontacts_family( account_source, c_source.jid) if dest_family == source_family and dest_family: item = Gtk.MenuItem.new_with_label( _('Make %s first contact') % ( c_source.get_shown_name())) item.set_use_underline(False) else: item = Gtk.MenuItem.new_with_label( _('Make %(contact1)s and %(contact2)s metacontacts') % { 'contact1': c_source.get_shown_name(), 'contact2': c_dest.get_shown_name()}) item.set_use_underline(False) item.connect('activate', self.on_drop_in_contact, account_source, c_source, account_dest, c_dest, is_big_brother, context, etime) menu.append(item) menu.attach_to_widget(self.tree, None) menu.connect('selection-done', gtkgui_helpers.destroy_widget) menu.show_all() menu.popup(None, None, None, None, 1, etime) ################################################################################ ### Everything about images and icons.... ### Cleanup assigned to Jim++ :-) ################################################################################ def get_appropriate_state_images(self, jid, size='16', icon_name='online'): """ Check jid and return the appropriate state images dict for the demanded size. icon_name is taken into account when jid is from transport: transport iconset doesn't contain all icons, so we fall back to jabber one """ transport = app.get_transport_name_from_jid(jid) if transport and size in self.transports_state_images: if transport not in self.transports_state_images[size]: # we don't have iconset for this transport loaded yet. Let's do # it self.make_transport_state_images(transport) if transport in self.transports_state_images[size] and \ icon_name in self.transports_state_images[size][transport]: return self.transports_state_images[size][transport] return app.interface.jabber_state_images[size] def make_transport_state_images(self, transport): """ Initialize opened and closed 'transport' iconset dict """ if not app.config.get('use_transports_iconsets'): return folder = os.path.join(helpers.get_transport_path(transport), '32x32') self.transports_state_images['32'][transport] = \ gtkgui_helpers.load_iconset(folder, transport=True) folder = os.path.join(helpers.get_transport_path(transport), '16x16') self.transports_state_images['16'][transport] = \ gtkgui_helpers.load_iconset(folder, transport=True) pixo, pixc = gtkgui_helpers.load_icons_meta() self.transports_state_images['opened'][transport] = \ gtkgui_helpers.load_iconset(folder, pixo, transport=True) self.transports_state_images['closed'][transport] = \ gtkgui_helpers.load_iconset(folder, pixc, transport=True) def update_jabber_state_images(self): # Update the roster self.setup_and_draw_roster() # Update the status combobox self.status_combobox.queue_draw() # Update the systray if app.interface.systray_enabled: app.interface.systray.set_img() for win in app.interface.msg_win_mgr.windows(): for ctrl in win.controls(): ctrl.update_ui() win.redraw_tab(ctrl) self.update_status_combobox() def set_account_status_icon(self, account): status = app.connections[account].connected child_iterA = self._get_account_iter(account, self.model) if not child_iterA: return if not self.regroup: show = app.SHOW_LIST[status] else: # accounts merged show = helpers.get_global_show() self.model[child_iterA][Column.IMG] = app.interface.jabber_state_images[ '16'][show] ################################################################################ ### Style and theme related methods ################################################################################ def show_title(self): change_title_allowed = app.config.get('change_roster_title') if not change_title_allowed: return nb_unread = 0 for account in app.connections: # Count events in roster title only if we don't auto open them if not helpers.allow_popup_window(account): nb_unread += app.events.get_nb_events(['chat', 'normal', 'file-request', 'file-error', 'file-completed', 'file-request-error', 'file-send-error', 'file-stopped', 'printed_chat'], account) if app.config.get('one_message_window') == 'always_with_roster': # always_with_roster mode defers to the MessageWindow if not app.interface.msg_win_mgr.one_window_opened(): # No MessageWindow to defer to self.window.set_title('Gajim') gtkgui_helpers.set_unset_urgency_hint(self.window, nb_unread) return start = '' if nb_unread > 1: start = '[' + str(nb_unread) + '] ' elif nb_unread == 1: start = '* ' self.window.set_title(start + 'Gajim') gtkgui_helpers.set_unset_urgency_hint(self.window, nb_unread) def _change_style(self, model, path, titer, option): if option is None or model[titer][Column.TYPE] == option: # We changed style for this type of row model[titer][Column.NAME] = model[titer][Column.NAME] def change_roster_style(self, option): self.model.foreach(self._change_style, option) for win in app.interface.msg_win_mgr.windows(): win.repaint_themed_widgets() def repaint_themed_widgets(self): """ Notify windows that contain themed widgets to repaint them """ for win in app.interface.msg_win_mgr.windows(): win.repaint_themed_widgets() for account in app.connections: for ctrl in list(app.interface.minimized_controls[account].values()): ctrl.repaint_themed_widgets() def _iconCellDataFunc(self, column, renderer, model, titer, data=None): """ When a row is added, set properties for icon renderer """ try: type_ = model[titer][Column.TYPE] except TypeError: return if type_ == 'account': self._set_account_row_background_color(renderer) renderer.set_property('xalign', 0) elif type_ == 'group': self._set_group_row_background_color(renderer) parent_iter = model.iter_parent(titer) if model[parent_iter][Column.TYPE] == 'group': renderer.set_property('xalign', 0.4) else: renderer.set_property('xalign', 0.2) elif type_: # prevent type_ = None, see http://trac.gajim.org/ticket/2534 if not model[titer][Column.JID] or not model[titer][Column.ACCOUNT]: # This can append when at the moment we add the row return jid = model[titer][Column.JID] account = model[titer][Column.ACCOUNT] self._set_contact_row_background_color(renderer, jid, account) parent_iter = model.iter_parent(titer) if model[parent_iter][Column.TYPE] == 'contact': renderer.set_property('xalign', 1) else: renderer.set_property('xalign', 0.6) renderer.set_property('width', 26) def _nameCellDataFunc(self, column, renderer, model, titer, data=None): """ When a row is added, set properties for name renderer """ try: type_ = model[titer][Column.TYPE] except TypeError: return theme = app.config.get('roster_theme') if type_ == 'account': color = app.config.get_per('themes', theme, 'accounttextcolor') renderer.set_property('foreground', color or None) renderer.set_property('font', gtkgui_helpers.get_theme_font_for_option(theme, 'accountfont')) renderer.set_property('xpad', 0) renderer.set_property('width', 3) self._set_account_row_background_color(renderer) elif type_ == 'group': color = app.config.get_per('themes', theme, 'grouptextcolor') renderer.set_property('foreground', color or None) renderer.set_property('font', gtkgui_helpers.get_theme_font_for_option(theme, 'groupfont')) parent_iter = model.iter_parent(titer) if model[parent_iter][Column.TYPE] == 'group': renderer.set_property('xpad', 8) else: renderer.set_property('xpad', 4) self._set_group_row_background_color(renderer) elif type_: # prevent type_ = None, see http://trac.gajim.org/ticket/2534 if not model[titer][Column.JID] or not model[titer][Column.ACCOUNT]: # This can append when at the moment we add the row return jid = model[titer][Column.JID] account = model[titer][Column.ACCOUNT] color = None if type_ == 'groupchat': ctrl = app.interface.minimized_controls[account].get(jid, None) if ctrl and ctrl.attention_flag: color = app.config.get_per('themes', theme, 'state_muc_directed_msg_color') renderer.set_property('foreground', 'red') if not color: color = app.config.get_per('themes', theme, 'contacttextcolor') if color: renderer.set_property('foreground', color) else: renderer.set_property('foreground', None) self._set_contact_row_background_color(renderer, jid, account) renderer.set_property('font', gtkgui_helpers.get_theme_font_for_option(theme, 'contactfont')) parent_iter = model.iter_parent(titer) if model[parent_iter][Column.TYPE] == 'contact': renderer.set_property('xpad', 16) else: renderer.set_property('xpad', 12) def _fill_pep_pixbuf_renderer(self, column, renderer, model, titer, data=None): """ When a row is added, draw the respective pep icon """ try: type_ = model[titer][Column.TYPE] except TypeError: return # allocate space for the icon only if needed if not model[titer][data] or model[titer][data] == empty_pixbuf: renderer.set_property('visible', False) else: renderer.set_property('visible', True) if type_ == 'account': self._set_account_row_background_color(renderer) renderer.set_property('xalign', 1) elif type_: if not model[titer][Column.JID] or not model[titer][Column.ACCOUNT]: # This can append at the moment we add the row return jid = model[titer][Column.JID] account = model[titer][Column.ACCOUNT] self._set_contact_row_background_color(renderer, jid, account) def _fill_avatar_pixbuf_renderer(self, column, renderer, model, titer, data=None): """ When a row is added, set properties for avatar renderer """ try: type_ = model[titer][Column.TYPE] except TypeError: return if type_ in ('group', 'account'): renderer.set_property('visible', False) return image = model[titer][Column.AVATAR_IMG] if image is not None: surface = image.get_property('surface') renderer.set_property('surface', surface) # allocate space for the icon only if needed if model[titer][Column.AVATAR_IMG] or \ app.config.get('avatar_position_in_roster') == 'left': renderer.set_property('visible', True) if type_: # prevent type_ = None, see http://trac.gajim.org/ticket/2534 if not model[titer][Column.JID] or not model[titer][Column.ACCOUNT]: # This can append at the moment we add the row return jid = model[titer][Column.JID] account = model[titer][Column.ACCOUNT] self._set_contact_row_background_color(renderer, jid, account) else: renderer.set_property('visible', False) if model[titer][Column.AVATAR_IMG] is None and \ app.config.get('avatar_position_in_roster') != 'left': renderer.set_property('visible', False) renderer.set_property('width', AvatarSize.ROSTER) renderer.set_property('xalign', 0.5) def _fill_padlock_pixbuf_renderer(self, column, renderer, model, titer, data=None): """ When a row is added, set properties for padlock renderer """ try: type_ = model[titer][Column.TYPE] except TypeError: return # allocate space for the icon only if needed if type_ == 'account' and model[titer][Column.PADLOCK_PIXBUF]: renderer.set_property('visible', True) self._set_account_row_background_color(renderer) renderer.set_property('xalign', 1) # align pixbuf to the right else: renderer.set_property('visible', False) def _set_account_row_background_color(self, renderer): theme = app.config.get('roster_theme') color = app.config.get_per('themes', theme, 'accountbgcolor') renderer.set_property('cell-background', color or None) def _set_contact_row_background_color(self, renderer, jid, account): theme = app.config.get('roster_theme') if jid in app.newly_added[account]: renderer.set_property('cell-background', app.config.get( 'just_connected_bg_color')) elif jid in app.to_be_removed[account]: renderer.set_property('cell-background', app.config.get( 'just_disconnected_bg_color')) else: color = app.config.get_per('themes', theme, 'contactbgcolor') renderer.set_property('cell-background', color or None) def _set_group_row_background_color(self, renderer): theme = app.config.get('roster_theme') color = app.config.get_per('themes', theme, 'groupbgcolor') renderer.set_property('cell-background', color or None) ################################################################################ ### Everything about building menus ### FIXME: We really need to make it simpler! 1465 lines are a few to much.... ################################################################################ def build_account_menu(self, account): # we have to create our own set of icons for the menu # using self.jabber_status_images is poopoo iconset = app.config.get('iconset') path = os.path.join(helpers.get_iconset_path(iconset), '16x16') if not app.config.get_per('accounts', account, 'is_zeroconf'): xml = gtkgui_helpers.get_gtk_builder('account_context_menu.ui') account_context_menu = xml.get_object('account_context_menu') status_menuitem = xml.get_object('status_menuitem') join_group_chat_menuitem = xml.get_object( 'join_group_chat_menuitem') add_contact_menuitem = xml.get_object('add_contact_menuitem') service_discovery_menuitem = xml.get_object( 'service_discovery_menuitem') execute_command_menuitem = xml.get_object( 'execute_command_menuitem') edit_account_menuitem = xml.get_object('edit_account_menuitem') sub_menu = Gtk.Menu() status_menuitem.set_submenu(sub_menu) for show in ('online', 'chat', 'away', 'xa', 'dnd', 'invisible'): uf_show = helpers.get_uf_show(show, use_mnemonic=True) item = Gtk.MenuItem.new_with_mnemonic(uf_show) sub_menu.append(item) con = app.connections[account] if show == 'invisible' and con.connected > 1 and \ not con.privacy_rules_supported: item.set_sensitive(False) else: item.connect('activate', self.change_status, account, show) item = Gtk.SeparatorMenuItem.new() sub_menu.append(item) item = Gtk.MenuItem.new_with_mnemonic(_('_Change Status Message')) sub_menu.append(item) item.connect('activate', self.on_change_status_message_activate, account) if app.connections[account].connected < 2: item.set_sensitive(False) item = Gtk.SeparatorMenuItem.new() sub_menu.append(item) uf_show = helpers.get_uf_show('offline', use_mnemonic=True) item = Gtk.MenuItem.new_with_mnemonic(uf_show) sub_menu.append(item) item.connect('activate', self.change_status, account, 'offline') pep_menuitem = xml.get_object('pep_menuitem') if app.connections[account].pep_supported: pep_submenu = Gtk.Menu() pep_menuitem.set_submenu(pep_submenu) item = Gtk.CheckMenuItem(_('Publish Tune')) pep_submenu.append(item) if sys.platform != 'linux': item.set_sensitive(False) else: activ = app.config.get_per('accounts', account, 'publish_tune') item.set_active(activ) item.connect('toggled', self.on_publish_tune_toggled, account) item = Gtk.CheckMenuItem(_('Publish Location')) pep_submenu.append(item) if not app.HAVE_GEOCLUE: item.set_sensitive(False) else: activ = app.config.get_per('accounts', account, 'publish_location') item.set_active(activ) item.connect('toggled', self.on_publish_location_toggled, account) pep_config = Gtk.MenuItem.new_with_label( _('Configure Services…')) item = Gtk.SeparatorMenuItem.new() pep_submenu.append(item) pep_config.set_sensitive(True) pep_submenu.append(pep_config) pep_config.connect('activate', self.on_pep_services_menuitem_activate, account) else: pep_menuitem.set_sensitive(False) edit_account_menuitem.connect('activate', self.on_edit_account, account) if app.connections[account].roster_supported: add_contact_menuitem.connect('activate', self.on_add_new_contact, account) else: add_contact_menuitem.set_sensitive(False) service_discovery_menuitem.connect('activate', self.on_service_disco_menuitem_activate, account) hostname = app.config.get_per('accounts', account, 'hostname') contact = app.contacts.create_contact(jid=hostname, account=account) # Fake contact execute_command_menuitem.connect('activate', self.on_execute_command, contact, account) gc_sub_menu = Gtk.Menu() # gc is always a submenu join_group_chat_menuitem.set_submenu(gc_sub_menu) self.add_bookmarks_list(gc_sub_menu, account) # make some items insensitive if account is offline if app.connections[account].connected < 2: for widget in (add_contact_menuitem, service_discovery_menuitem, join_group_chat_menuitem, execute_command_menuitem, pep_menuitem): widget.set_sensitive(False) else: xml = gtkgui_helpers.get_gtk_builder('zeroconf_context_menu.ui') account_context_menu = xml.get_object('zeroconf_context_menu') status_menuitem = xml.get_object('status_menuitem') zeroconf_properties_menuitem = xml.get_object( 'zeroconf_properties_menuitem') sub_menu = Gtk.Menu() status_menuitem.set_submenu(sub_menu) for show in ('online', 'away', 'dnd', 'invisible'): uf_show = helpers.get_uf_show(show, use_mnemonic=True) item = Gtk.MenuItem.new_with_mnemonic(uf_show) sub_menu.append(item) item.connect('activate', self.change_status, account, show) item = Gtk.SeparatorMenuItem.new() sub_menu.append(item) item = Gtk.MenuItem.new_with_mnemonic(_('_Change Status Message')) sub_menu.append(item) item.connect('activate', self.on_change_status_message_activate, account) if app.connections[account].connected < 2: item.set_sensitive(False) uf_show = helpers.get_uf_show('offline', use_mnemonic=True) item = Gtk.MenuItem.new_with_mnemonic(uf_show) sub_menu.append(item) item.connect('activate', self.change_status, account, 'offline') zeroconf_properties_menuitem.connect('activate', self.on_edit_account, account) return account_context_menu def make_account_menu(self, event, titer): """ Make account's popup menu """ model = self.modelfilter account = model[titer][Column.ACCOUNT] if account != 'all': # not in merged mode menu = self.build_account_menu(account) else: menu = Gtk.Menu() iconset = app.config.get('iconset') path = os.path.join(helpers.get_iconset_path(iconset), '16x16') accounts = [] # Put accounts in a list to sort them for account in app.connections: accounts.append(account) accounts.sort() for account in accounts: label = app.config.get_per('accounts', account, 'account_label') item = Gtk.MenuItem.new_with_label(label or account) account_menu = self.build_account_menu(account) item.set_submenu(account_menu) menu.append(item) event_button = gtkgui_helpers.get_possible_button_event(event) menu.attach_to_widget(self.tree, None) menu.connect('selection-done', gtkgui_helpers.destroy_widget) menu.show_all() menu.popup(None, None, None, None, event_button, event.time) def make_group_menu(self, event, titer): """ Make group's popup menu """ model = self.modelfilter path = model.get_path(titer) group = model[titer][Column.JID] account = model[titer][Column.ACCOUNT] list_ = [] # list of (contact, account) tuples list_online = [] # list of (contact, account) tuples show_bookmarked = True group = model[titer][Column.JID] for jid in app.contacts.get_jid_list(account): contact = app.contacts.get_contact_with_highest_priority(account, jid) if group in contact.get_shown_groups(): if contact.show not in ('offline', 'error'): list_online.append((contact, account)) # Check that all contacts support direct NUC invite if not contact.supports(NS_CONFERENCE): show_bookmarked = False list_.append((contact, account)) menu = Gtk.Menu() # Make special context menu if group is Groupchats if group == _('Groupchats'): maximize_menuitem = Gtk.MenuItem.new_with_mnemonic(_( '_Maximize All')) maximize_menuitem.connect('activate', self.on_all_groupchat_maximized, list_) menu.append(maximize_menuitem) else: # Send Group Message send_group_message_item = Gtk.MenuItem.new_with_mnemonic( _('Send Group M_essage')) send_group_message_submenu = Gtk.Menu() send_group_message_item.set_submenu(send_group_message_submenu) menu.append(send_group_message_item) group_message_to_all_item = Gtk.MenuItem.new_with_label(_( 'To all users')) send_group_message_submenu.append(group_message_to_all_item) group_message_to_all_online_item = Gtk.MenuItem.new_with_label( _('To all online users')) send_group_message_submenu.append(group_message_to_all_online_item) group_message_to_all_online_item.connect('activate', self.on_send_single_message_menuitem_activate, account, list_online) group_message_to_all_item.connect('activate', self.on_send_single_message_menuitem_activate, account, list_) # Invite to if group != _('Transports'): invite_menuitem = Gtk.MenuItem.new_with_mnemonic( _('In_vite to')) gui_menu_builder.build_invite_submenu(invite_menuitem, list_online, show_bookmarked=show_bookmarked) menu.append(invite_menuitem) # Send Custom Status send_custom_status_menuitem = Gtk.MenuItem.new_with_mnemonic( _('Send Cus_tom Status')) if helpers.group_is_blocked(account, group): send_custom_status_menuitem.set_sensitive(False) status_menuitems = Gtk.Menu() send_custom_status_menuitem.set_submenu(status_menuitems) iconset = app.config.get('iconset') path = os.path.join(helpers.get_iconset_path(iconset), '16x16') for s in ('online', 'chat', 'away', 'xa', 'dnd', 'offline'): status_menuitem = Gtk.MenuItem.new_with_label( helpers.get_uf_show(s)) status_menuitem.connect('activate', self.on_send_custom_status, list_, s, group) status_menuitems.append(status_menuitem) menu.append(send_custom_status_menuitem) # there is no singlemessage and custom status for zeroconf if app.config.get_per('accounts', account, 'is_zeroconf'): send_custom_status_menuitem.set_sensitive(False) send_group_message_item.set_sensitive(False) if app.connections[account].connected < 2: send_group_message_item.set_sensitive(False) invite_menuitem.set_sensitive(False) send_custom_status_menuitem.set_sensitive(False) if not group in helpers.special_groups: item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) # Rename rename_item = Gtk.MenuItem.new_with_mnemonic(_('_Rename…')) menu.append(rename_item) rename_item.connect('activate', self.on_rename, 'group', group, account) # Block group is_blocked = False if self.regroup: for g_account in app.connections: if helpers.group_is_blocked(g_account, group): is_blocked = True else: if helpers.group_is_blocked(account, group): is_blocked = True if is_blocked and app.connections[account].\ privacy_rules_supported: unblock_menuitem = Gtk.MenuItem.new_with_mnemonic(_('_Unblock')) unblock_menuitem.connect('activate', self.on_unblock, list_, group) menu.append(unblock_menuitem) else: block_menuitem = Gtk.MenuItem.new_with_mnemonic(_('_Block')) block_menuitem.connect('activate', self.on_block, list_, group) menu.append(block_menuitem) if not app.connections[account].privacy_rules_supported: block_menuitem.set_sensitive(False) # Remove group remove_item = Gtk.MenuItem.new_with_mnemonic(_('Remo_ve')) menu.append(remove_item) remove_item.connect('activate', self.on_remove_group_item_activated, group, account) # unsensitive if account is not connected if app.connections[account].connected < 2: rename_item.set_sensitive(False) # General group cannot be changed if group == _('General'): rename_item.set_sensitive(False) remove_item.set_sensitive(False) event_button = gtkgui_helpers.get_possible_button_event(event) menu.attach_to_widget(self.tree, None) menu.connect('selection-done', gtkgui_helpers.destroy_widget) menu.show_all() menu.popup(None, None, None, None, event_button, event.time) def make_contact_menu(self, event, titer): """ Make contact's popup menu """ model = self.modelfilter jid = model[titer][Column.JID] account = model[titer][Column.ACCOUNT] contact = app.contacts.get_contact_with_highest_priority(account, jid) menu = gui_menu_builder.get_contact_menu(contact, account) event_button = gtkgui_helpers.get_possible_button_event(event) menu.attach_to_widget(self.tree, None) menu.popup(None, None, None, None, event_button, event.time) def make_multiple_contact_menu(self, event, iters): """ Make group's popup menu """ model = self.modelfilter list_ = [] # list of (jid, account) tuples one_account_offline = False is_blocked = True privacy_rules_supported = True for titer in iters: jid = model[titer][Column.JID] account = model[titer][Column.ACCOUNT] if app.connections[account].connected < 2: one_account_offline = True if not app.connections[account].privacy_rules_supported: privacy_rules_supported = False contact = app.contacts.get_contact_with_highest_priority(account, jid) if not helpers.jid_is_blocked(account, jid): is_blocked = False list_.append((contact, account)) menu = Gtk.Menu() account = None for (contact, current_account) in list_: # check that we use the same account for every sender if account is not None and account != current_account: account = None break account = current_account show_bookmarked = True for (contact, current_account) in list_: # Check that all contacts support direct NUC invite if not contact.supports(NS_CONFERENCE): show_bookmarked = False break if account is not None: send_group_message_item = Gtk.MenuItem.new_with_mnemonic( _('Send Group M_essage')) menu.append(send_group_message_item) send_group_message_item.connect('activate', self.on_send_single_message_menuitem_activate, account, list_) # Invite to Groupchat invite_item = Gtk.MenuItem.new_with_mnemonic(_('In_vite to')) gui_menu_builder.build_invite_submenu(invite_item, list_, show_bookmarked=show_bookmarked) menu.append(invite_item) item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) # Manage Transport submenu item = Gtk.MenuItem.new_with_mnemonic(_('_Manage Contacts')) manage_contacts_submenu = Gtk.Menu() item.set_submenu(manage_contacts_submenu) menu.append(item) # Edit Groups edit_groups_item = Gtk.MenuItem.new_with_mnemonic(_('Edit _Groups…')) manage_contacts_submenu.append(edit_groups_item) edit_groups_item.connect('activate', self.on_edit_groups, list_) item = Gtk.SeparatorMenuItem.new() # separator manage_contacts_submenu.append(item) # Block if is_blocked and privacy_rules_supported: unblock_menuitem = Gtk.MenuItem.new_with_mnemonic(_('_Unblock')) unblock_menuitem.connect('activate', self.on_unblock, list_) manage_contacts_submenu.append(unblock_menuitem) else: block_menuitem = Gtk.MenuItem.new_with_mnemonic(_('_Block')) block_menuitem.connect('activate', self.on_block, list_) manage_contacts_submenu.append(block_menuitem) if not privacy_rules_supported: block_menuitem.set_sensitive(False) # Remove remove_item = Gtk.MenuItem.new_with_mnemonic(_('_Remove')) manage_contacts_submenu.append(remove_item) remove_item.connect('activate', self.on_req_usub, list_) # unsensitive remove if one account is not connected if one_account_offline: remove_item.set_sensitive(False) event_button = gtkgui_helpers.get_possible_button_event(event) menu.attach_to_widget(self.tree, None) menu.connect('selection-done', gtkgui_helpers.destroy_widget) menu.show_all() menu.popup(None, None, None, None, event_button, event.time) def make_transport_menu(self, event, titer): """ Make transport's popup menu """ model = self.modelfilter jid = model[titer][Column.JID] path = model.get_path(titer) account = model[titer][Column.ACCOUNT] contact = app.contacts.get_contact_with_highest_priority(account, jid) menu = gui_menu_builder.get_transport_menu(contact, account) event_button = gtkgui_helpers.get_possible_button_event(event) menu.attach_to_widget(self.tree, None) menu.popup(None, None, None, None, event_button, event.time) def make_groupchat_menu(self, event, titer): model = self.modelfilter jid = model[titer][Column.JID] account = model[titer][Column.ACCOUNT] contact = app.contacts.get_contact_with_highest_priority(account, jid) menu = Gtk.Menu() if jid in app.interface.minimized_controls[account]: maximize_menuitem = Gtk.MenuItem.new_with_mnemonic(_( '_Maximize')) maximize_menuitem.connect('activate', self.on_groupchat_maximized, \ jid, account) menu.append(maximize_menuitem) if not app.gc_connected[account].get(jid, False): connect_menuitem = Gtk.MenuItem.new_with_mnemonic(_( '_Reconnect')) connect_menuitem.connect('activate', self.on_reconnect, jid, account) menu.append(connect_menuitem) disconnect_menuitem = Gtk.MenuItem.new_with_mnemonic(_( '_Disconnect')) disconnect_menuitem.connect('activate', self.on_disconnect, jid, account) menu.append(disconnect_menuitem) item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) adhoc_menuitem = Gtk.MenuItem.new_with_mnemonic(_('Execute command')) adhoc_menuitem.connect('activate', self.on_execute_command, contact, account) menu.append(adhoc_menuitem) item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) history_menuitem = Gtk.MenuItem.new_with_mnemonic(_('_History')) history_menuitem.connect('activate', self.on_history, contact, account) menu.append(history_menuitem) event_button = gtkgui_helpers.get_possible_button_event(event) menu.attach_to_widget(self.tree, None) menu.connect('selection-done', gtkgui_helpers.destroy_widget) menu.show_all() menu.popup(None, None, None, None, event_button, event.time) def get_and_connect_advanced_menuitem_menu(self, account): """ Add FOR ACCOUNT options """ xml = gtkgui_helpers.get_gtk_builder('advanced_menuitem_menu.ui') advanced_menuitem_menu = xml.get_object('advanced_menuitem_menu') xml_console_menuitem = xml.get_object('xml_console_menuitem') archiving_preferences_menuitem = xml.get_object( 'archiving_preferences_menuitem') privacy_lists_menuitem = xml.get_object('privacy_lists_menuitem') administrator_menuitem = xml.get_object('administrator_menuitem') send_server_message_menuitem = xml.get_object( 'send_server_message_menuitem') set_motd_menuitem = xml.get_object('set_motd_menuitem') update_motd_menuitem = xml.get_object('update_motd_menuitem') delete_motd_menuitem = xml.get_object('delete_motd_menuitem') xml_console_menuitem.connect('activate', self.on_xml_console_menuitem_activate, account) if app.connections[account]: if app.connections[account].privacy_rules_supported: privacy_lists_menuitem.connect('activate', self.on_privacy_lists_menuitem_activate, account) else: privacy_lists_menuitem.set_sensitive(False) if app.connections[account].archiving_313_supported: archiving_preferences_menuitem.connect( 'activate', self.on_archiving_preferences_menuitem_activate, account) else: archiving_preferences_menuitem.set_sensitive(False) if app.connections[account].is_zeroconf: administrator_menuitem.set_sensitive(False) send_server_message_menuitem.set_sensitive(False) set_motd_menuitem.set_sensitive(False) update_motd_menuitem.set_sensitive(False) delete_motd_menuitem.set_sensitive(False) else: send_server_message_menuitem.connect('activate', self.on_send_server_message_menuitem_activate, account) set_motd_menuitem.connect('activate', self.on_set_motd_menuitem_activate, account) update_motd_menuitem.connect('activate', self.on_update_motd_menuitem_activate, account) delete_motd_menuitem.connect('activate', self.on_delete_motd_menuitem_activate, account) advanced_menuitem_menu.show_all() return advanced_menuitem_menu def add_history_manager_menuitem(self, menu): """ Add a seperator and History Manager menuitem BELOW for account menuitems """ item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) # History manager item = Gtk.MenuItem.new_with_mnemonic(_('History Manager')) menu.append(item) item.connect('activate', self.on_history_manager_menuitem_activate) def add_bookmarks_list(self, gc_sub_menu, account): """ Show join new group chat item and bookmarks list for an account """ item = Gtk.MenuItem.new_with_mnemonic(_('_Join New Group Chat')) item.connect('activate', self.on_join_gc_activate, account) gc_sub_menu.append(item) # User has at least one bookmark. if app.connections[account].bookmarks: item = Gtk.SeparatorMenuItem.new() gc_sub_menu.append(item) for bookmark in app.connections[account].bookmarks: name = bookmark['name'] if not name: # No name was given for this bookmark. # Use the first part of JID instead... name = bookmark['jid'].split("@")[0] # Shorten long names name = (name[:42] + '..') if len(name) > 42 else name # Do not use underline. item = Gtk.MenuItem.new_with_label(name) item.set_use_underline(False) item.connect('activate', self.on_bookmark_menuitem_activate, account, bookmark) gc_sub_menu.append(item) def show_appropriate_context_menu(self, event, iters): # iters must be all of the same type model = self.modelfilter type_ = model[iters[0]][Column.TYPE] for titer in iters[1:]: if model[titer][Column.TYPE] != type_: return if type_ == 'group' and len(iters) == 1: self.make_group_menu(event, iters[0]) if type_ == 'groupchat' and len(iters) == 1: self.make_groupchat_menu(event, iters[0]) elif type_ == 'agent' and len(iters) == 1: self.make_transport_menu(event, iters[0]) elif type_ in ('contact', 'self_contact') and len(iters) == 1: self.make_contact_menu(event, iters[0]) elif type_ == 'contact': self.make_multiple_contact_menu(event, iters) elif type_ == 'account' and len(iters) == 1: self.make_account_menu(event, iters[0]) def show_treeview_menu(self, event): try: model, list_of_paths = self.tree.get_selection().get_selected_rows() except TypeError: self.tree.get_selection().unselect_all() return if not len(list_of_paths): # no row is selected return if len(list_of_paths) > 1: iters = [] for path in list_of_paths: iters.append(model.get_iter(path)) else: path = list_of_paths[0] iters = [model.get_iter(path)] self.show_appropriate_context_menu(event, iters) return True def on_ctrl_j(self, accel_group, acceleratable, keyval, modifier): """ Bring up the conference join dialog, when CTRL+J accelerator is being activated """ # find a connected account: for account in app.connections: if app.account_is_connected(account): break self.on_join_gc_activate(None, account) return True def fill_column(self, col): for rend in self.renderers_list: col.pack_start(rend[1], rend[2]) if rend[0] != 'avatar': col.add_attribute(rend[1], rend[3], rend[4]) col.set_cell_data_func(rend[1], rend[5], rend[6]) # set renderers propertys for renderer in self.renderers_propertys.keys(): renderer.set_property(self.renderers_propertys[renderer][0], self.renderers_propertys[renderer][1]) def query_tooltip(self, widget, x_pos, y_pos, keyboard_mode, tooltip): try: row = widget.get_path_at_pos(x_pos, y_pos)[0] except TypeError: return False if not row: return False iter_ = None try: model = widget.get_model() iter_ = model.get_iter(row) except Exception: return False typ = model[iter_][Column.TYPE] account = model[iter_][Column.ACCOUNT] jid = model[iter_][Column.JID] connected_contacts = [] if typ in ('contact', 'self_contact'): contacts = app.contacts.get_contacts(account, jid) for c in contacts: if c.show not in ('offline', 'error'): connected_contacts.append(c) if not connected_contacts: # no connected contacts, show the offline one connected_contacts = contacts elif typ == 'groupchat': connected_contacts = app.contacts.get_contacts(account, jid) elif typ != 'account': return False if self.current_tooltip != row: # If the row changes we hide the current tooltip self.current_tooltip = row return False tooltip = widget.get_tooltip_window() if tooltip.row == row: # We already populated the window with the row data return True tooltip.row = row tooltip.populate(connected_contacts, account, typ) return True def add_actions(self): action = Gio.SimpleAction.new_stateful( "show-roster", None, GLib.Variant.new_boolean( not self.xml.get_object('roster_vbox2').get_no_show_all())) action.connect("change-state", self.on_show_roster_action) self.window.add_action(action) action = Gio.SimpleAction.new_stateful( "show-offline", None, GLib.Variant.new_boolean(app.config.get('showoffline'))) action.connect("change-state", self.on_show_offline_contacts_action) self.window.add_action(action) action = Gio.SimpleAction.new_stateful( "show-active", None, GLib.Variant.new_boolean( app.config.get('show_only_chat_and_online'))) action.connect("change-state", self.on_show_active_contacts_action) self.window.add_action(action) action = Gio.SimpleAction.new_stateful( "show-transports", None, GLib.Variant.new_boolean(app.config.get('show_transports_group'))) action.connect("change-state", self.on_show_transports_action) self.window.add_action(action) ################################################################################ ### ################################################################################ def __init__(self, application: Gtk.Application): self.application = application self.filtering = False self.starting = False self.starting_filtering = False # Number of renderers plugins added self.nb_ext_renderers = 0 # When we quit, rememver if we already saved config once self.save_done = False # [icon, name, type, jid, account, editable, mood_pixbuf, # activity_pixbuf, tune_pixbuf, location_pixbuf, avatar_img, # padlock_pixbuf, visible] self.columns = [Gtk.Image, str, str, str, str, GdkPixbuf.Pixbuf, GdkPixbuf.Pixbuf, GdkPixbuf.Pixbuf, GdkPixbuf.Pixbuf, Gtk.Image, str, bool] self.xml = gtkgui_helpers.get_gtk_builder('roster_window.ui') self.window = self.xml.get_object('roster_window') application.add_window(self.window) self.add_actions() self.hpaned = self.xml.get_object('roster_hpaned') app.interface.msg_win_mgr = MessageWindowMgr(self.window, self.hpaned) app.interface.msg_win_mgr.connect('window-delete', self.on_message_window_delete) self.advanced_menus = [] # We keep them to destroy them if app.config.get('roster_window_skip_taskbar'): self.window.set_property('skip-taskbar-hint', True) self.tree = self.xml.get_object('roster_treeview') sel = self.tree.get_selection() sel.set_mode(Gtk.SelectionMode.MULTIPLE) # sel.connect('changed', # self.on_treeview_selection_changed) self._iters = {} # for merged mode self._iters['MERGED'] = {'account': None, 'groups': {}} # holds a list of (jid, account) tuples self._last_selected_contact = [] self.transports_state_images = {'16': {}, '32': {}, 'opened': {}, 'closed': {}} self.last_save_dir = None self.editing_path = None # path of row with cell in edit mode self.add_new_contact_handler_id = False self.service_disco_handler_id = False self.new_chat_menuitem_handler_id = False self.single_message_menuitem_handler_id = False self.profile_avatar_menuitem_handler_id = False #FIXME: When list_accel_closures will be wrapped in pygtk # no need of this variable self.have_new_chat_accel = False # Is the "Ctrl+N" shown ? self.regroup = app.config.get('mergeaccounts') self.clicked_path = None # Used remember on wich row we clicked if len(app.connections) < 2: # Do not merge accounts if only one exists self.regroup = False gtkgui_helpers.resize_window(self.window, app.config.get('roster_width'), app.config.get('roster_height')) if app.config.get('save-roster-position'): gtkgui_helpers.move_window(self.window, app.config.get('roster_x-position'), app.config.get('roster_y-position')) self.popups_notification_height = 0 self.popup_notification_windows = [] # Remove contact from roster when last event opened # { (contact, account): { backend: boolean } self.contacts_to_be_removed = {} app.events.event_removed_subscribe(self.on_event_removed) # when this value become 0 we quit main application. If it's more than 0 # it means we are waiting for this number of accounts to disconnect # before quitting self.quit_on_next_offline = -1 # groups to draw next time we draw groups. self.groups_to_draw = {} # accounts to draw next time we draw accounts. self.accounts_to_draw = [] # StatusComboBox self.status_combobox = self.xml.get_object('status_combobox') pixbuf_renderer, text_renderer = self.status_combobox.get_cells() self.status_combobox.set_cell_data_func( pixbuf_renderer, self._status_cell_data_func) self.status_combobox.set_cell_data_func( text_renderer, self._status_cell_data_func) self.status_combobox.set_row_separator_func(self._iter_is_separator) self.status_combobox.set_active(9) # holds index to previously selected item so if # "change status message..." is selected we can fallback to previously # selected item and not stay with that item selected self.previous_status_combobox_active = 9 # Enable/Disable checkboxes at start if app.config.get('showoffline'): self.window.lookup_action('show-active').set_enabled(False) if app.config.get('show_only_chat_and_online'): self.window.lookup_action('show-offline').set_enabled(False) if self.hpaned.get_child2() is None: self.window.lookup_action('show-roster').set_enabled(False) # columns col = Gtk.TreeViewColumn() # list of renderers with attributes / properties in the form: # (name, renderer_object, expand?, attribute_name, attribute_value, # cell_data_func, func_arg) self.renderers_list = [] self.renderers_propertys ={} self._pep_type_to_model_column = {'mood': Column.MOOD_PIXBUF, 'activity': Column.ACTIVITY_PIXBUF, 'tune': Column.TUNE_PIXBUF, 'location': Column.LOCATION_PIXBUF} renderer_text = Gtk.CellRendererText() self.renderers_propertys[renderer_text] = ('ellipsize', Pango.EllipsizeMode.END) def add_avatar_renderer(): self.renderers_list.append(('avatar', Gtk.CellRendererPixbuf(), False, None, Column.AVATAR_IMG, self._fill_avatar_pixbuf_renderer, None)) if app.config.get('avatar_position_in_roster') == 'left': add_avatar_renderer() self.renderers_list += ( ('icon', cell_renderer_image.CellRendererImage(0, 0), False, 'image', Column.IMG, self._iconCellDataFunc, None), ('name', renderer_text, True, 'markup', Column.NAME, self._nameCellDataFunc, None), ('mood', Gtk.CellRendererPixbuf(), False, 'pixbuf', Column.MOOD_PIXBUF, self._fill_pep_pixbuf_renderer, Column.MOOD_PIXBUF), ('activity', Gtk.CellRendererPixbuf(), False, 'pixbuf', Column.ACTIVITY_PIXBUF, self._fill_pep_pixbuf_renderer, Column.ACTIVITY_PIXBUF), ('tune', Gtk.CellRendererPixbuf(), False, 'pixbuf', Column.TUNE_PIXBUF, self._fill_pep_pixbuf_renderer, Column.TUNE_PIXBUF), ('location', Gtk.CellRendererPixbuf(), False, 'pixbuf', Column.LOCATION_PIXBUF, self._fill_pep_pixbuf_renderer, Column.LOCATION_PIXBUF)) if app.config.get('avatar_position_in_roster') == 'right': add_avatar_renderer() self.renderers_list.append(('padlock', Gtk.CellRendererPixbuf(), False, 'icon_name', Column.PADLOCK_PIXBUF, self._fill_padlock_pixbuf_renderer, None)) # fill and append column self.fill_column(col) self.tree.append_column(col) # do not show gtk arrows workaround col = Gtk.TreeViewColumn() render_pixbuf = Gtk.CellRendererPixbuf() col.pack_start(render_pixbuf, False) self.tree.append_column(col) col.set_visible(False) self.tree.set_expander_column(col) # signals self.TARGET_TYPE_URI_LIST = 80 self.tree.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, [], Gdk.DragAction.DEFAULT | Gdk.DragAction.MOVE | \ Gdk.DragAction.COPY) self.tree.drag_source_add_text_targets() self.tree.enable_model_drag_dest([], Gdk.DragAction.DEFAULT) dst_targets = Gtk.TargetList.new([]) dst_targets.add_text_targets(0) dst_targets.add_uri_targets(self.TARGET_TYPE_URI_LIST) self.tree.drag_dest_set_target_list(dst_targets) self.tree.connect('drag_begin', self.drag_begin) self.tree.connect('drag_end', self.drag_end) self.tree.connect('drag_drop', self.drag_drop) self.tree.connect('drag_data_get', self.drag_data_get_data) self.tree.connect('drag_data_received', self.drag_data_received_data) self.dragging = False self.xml.connect_signals(self) self.combobox_callback_active = True self.collapsed_rows = app.config.get('collapsed_rows').split('\t') self.tree.set_has_tooltip(True) self.tree.set_tooltip_window(tooltips.RosterTooltip(self.window)) self.current_tooltip = None self.tree.connect('query-tooltip', self.query_tooltip) # Workaroung: For strange reasons signal is behaving like row-changed self._toggeling_row = False self.setup_and_draw_roster() if app.config.get('show_roster_on_startup') == 'always': self.window.show_all() elif app.config.get('show_roster_on_startup') == 'never': if app.config.get('trayicon') != 'always': # Without trayicon, user should see the roster! self.window.show_all() app.config.set('last_roster_visible', True) else: if app.config.get('last_roster_visible') or \ app.config.get('trayicon') != 'always': self.window.show_all() self.scale_factor = self.window.get_scale_factor() if not app.config.get_per('accounts') or \ app.config.get_per('accounts') == ['Local'] and not \ app.config.get_per('accounts', 'Local', 'active'): # if we have no account configured or only Local account but not enabled def _open_wizard(): app.interface.instances['account_creation_wizard'] = \ config.AccountCreationWizardWindow() # Open wizard only after roster is created, so we can make it # transient for the roster window GLib.idle_add(_open_wizard) # Setting CTRL+J to be the shortcut for bringing up the dialog to join a # conference. accel_group = Gtk.accel_groups_from_object(self.window)[0] accel_group.connect(Gdk.KEY_j, Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.MASK, self.on_ctrl_j) # Setting CTRL+S to be the shortcut to change status message accel_group = Gtk.AccelGroup() keyval, mod = Gtk.accelerator_parse('s') accel_group.connect(keyval, mod, Gtk.AccelFlags.VISIBLE, self.accel_group_func) # Setting CTRL+k to focus rfilter_entry keyval, mod = Gtk.accelerator_parse('k') accel_group.connect(keyval, mod, Gtk.AccelFlags.VISIBLE, self.accel_group_func) self.window.add_accel_group(accel_group) # Setting the search stuff self.rfilter_entry = self.xml.get_object('rfilter_entry') self.rfilter_string = '' self.rfilter_enabled = False self.rfilter_entry.connect('key-press-event', self.on_rfilter_entry_key_press_event) app.ged.register_event_handler('presence-received', ged.GUI1, self._nec_presence_received) # presence has to be fully handled so that contact is added to occupant # list before roster can be correctly updated app.ged.register_event_handler('gc-presence-received', ged.GUI2, self._nec_gc_presence_received) app.ged.register_event_handler('roster-received', ged.GUI1, self._nec_roster_received) app.ged.register_event_handler('anonymous-auth', ged.GUI1, self._nec_anonymous_auth) app.ged.register_event_handler('our-show', ged.GUI1, self._nec_our_show) app.ged.register_event_handler('connection-type', ged.GUI1, self._nec_connection_type) app.ged.register_event_handler('agent-removed', ged.GUI1, self._nec_agent_removed) app.ged.register_event_handler('pep-received', ged.GUI1, self._nec_pep_received) app.ged.register_event_handler('update-roster-avatar', ged.GUI1, self._nec_update_avatar) app.ged.register_event_handler('gc-subject-received', ged.GUI1, self._nec_gc_subject_received) app.ged.register_event_handler('metacontacts-received', ged.GUI2, self._nec_metacontacts_received) app.ged.register_event_handler('signed-in', ged.GUI1, self._nec_signed_in) app.ged.register_event_handler('decrypted-message-received', ged.GUI2, self._nec_decrypted_message_received) app.ged.register_event_handler('blocking', ged.GUI1, self._nec_blocking) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/screensaver_listener.py000066400000000000000000000065271326020644600266030ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## gajim/screensaver_listener.py ## ## Copyright (C) 2018 André Apitzsch ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import logging from gi.repository import Gio, GLib from gajim.common import app log = logging.getLogger('gajim.screensaver_listener') def signal_received(connection, sender_name, object_path, interface_name, signal_name, parameters, *user_data): '''Signal handler for screensaver active change''' log.info('Signal received: %s - %s', interface_name, parameters) roster = app.interface.roster if not parameters[0]: for account in app.connections: if app.account_is_connected(account) and \ app.sleeper_state[account] == 'autoaway-forced': # We came back online after screensaver # autoaway roster.send_status(account, 'online', app.status_before_autoaway[account]) app.status_before_autoaway[account] = '' app.sleeper_state[account] = 'online' return if not app.config.get('autoaway'): # Don't go auto away if user disabled the option return for account in app.connections: if account not in app.sleeper_state or not app.sleeper_state[account]: continue if app.sleeper_state[account] == 'online': if not app.account_is_connected(account): continue # we save our online status app.status_before_autoaway[account] = \ app.connections[account].status # we go away (no auto status) [we pass True to auto param] auto_message = app.config.get('autoaway_message') if not auto_message: auto_message = app.connections[account].status else: auto_message = auto_message.replace('$S', '%(status)s') auto_message = auto_message.replace('$T', '%(time)s') auto_message = auto_message % { 'status': app.status_before_autoaway[account], 'time': app.config.get('autoxatime')} roster.send_status(account, 'away', auto_message, auto=True) app.sleeper_state[account] = 'autoaway-forced' def appeared(connection, name, name_owner, *user_data): '''Set up a listener for screensaver signals''' log.info('%s appeared', name) connection.signal_subscribe( 'org.gnome.ScreenSaver', 'org.gnome.ScreenSaver', 'ActiveChanged', '/org/gnome/ScreenSaver', None, Gio.DBusSignalFlags.NONE, signal_received, None) Gio.bus_watch_name( Gio.BusType.SESSION, 'org.gnome.ScreenSaver', Gio.BusNameWatcherFlags.NONE, appeared, None) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/search_window.py000066400000000000000000000221451326020644600252040ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## src/search_window.py ## ## Copyright (C) 2007 Stephan Erb ## Copyright (C) 2007-2014 Yann Leboulanger ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gi.repository import GLib from gi.repository import Gtk from gi.repository import Gdk from gajim.common import app from gajim.common import dataforms from gajim.common import ged from gajim import gtkgui_helpers from gajim import dialogs from gajim import vcard from gajim import config from gajim import dataforms_widget class SearchWindow: def __init__(self, account, jid): """ Create new window """ # an account object self.account = account self.jid = jid # retrieving widgets from xml self.xml = gtkgui_helpers.get_gtk_builder('search_window.ui') self.window = self.xml.get_object('search_window') for name in ('label', 'progressbar', 'search_vbox', 'search_button', 'add_contact_button', 'information_button'): self.__dict__[name] = self.xml.get_object(name) self.search_button.set_sensitive(False) # displaying the window self.xml.connect_signals(self) self.window.show_all() self.request_form() self.pulse_id = GLib.timeout_add(80, self.pulse_callback) self.is_form = None # Is there a jid column in results ? if -1: no, else column number self.jid_column = -1 app.ged.register_event_handler('search-form-received', ged.GUI1, self._nec_search_form_received) app.ged.register_event_handler('search-result-received', ged.GUI1, self._nec_search_result_received) def request_form(self): app.connections[self.account].request_search_fields(self.jid) def pulse_callback(self): self.progressbar.pulse() return True def on_search_window_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.window.destroy() def on_search_window_destroy(self, widget): if self.pulse_id: GLib.source_remove(self.pulse_id) del app.interface.instances[self.account]['search'][self.jid] app.ged.remove_event_handler('search-form-received', ged.GUI1, self._nec_search_form_received) app.ged.remove_event_handler('search-result-received', ged.GUI1, self._nec_search_result_received) def on_close_button_clicked(self, button): self.window.destroy() def on_search_button_clicked(self, button): if self.is_form: self.data_form_widget.data_form.type_ = 'submit' app.connections[self.account].send_search_form(self.jid, self.data_form_widget.data_form.get_purged(), True) else: infos = self.data_form_widget.get_infos() if 'instructions' in infos: del infos['instructions'] app.connections[self.account].send_search_form(self.jid, infos, False) self.search_vbox.remove(self.data_form_widget) self.progressbar.show() self.label.set_text(_('Waiting for results')) self.label.show() self.pulse_id = GLib.timeout_add(80, self.pulse_callback) self.search_button.hide() def on_add_contact_button_clicked(self, widget): (model, iter_) = self.result_treeview.get_selection().get_selected() if not iter_: return jid = model[iter_][self.jid_column] dialogs.AddNewContactWindow(self.account, jid) def on_information_button_clicked(self, widget): (model, iter_) = self.result_treeview.get_selection().get_selected() if not iter_: return jid = model[iter_][self.jid_column] if jid in app.interface.instances[self.account]['infos']: app.interface.instances[self.account]['infos'][jid].window.present() else: contact = app.contacts.create_contact(jid=jid, account=self.account) app.interface.instances[self.account]['infos'][jid] = \ vcard.VcardWindow(contact, self.account) def _nec_search_form_received(self, obj): if self.pulse_id: GLib.source_remove(self.pulse_id) self.progressbar.hide() self.label.hide() if obj.is_dataform: self.is_form = True self.data_form_widget = dataforms_widget.DataFormWidget() self.dataform = dataforms.ExtendForm(node=obj.data) self.data_form_widget.set_sensitive(True) try: self.data_form_widget.data_form = self.dataform except dataforms.Error: self.label.set_text(_('Error in received dataform')) self.label.show() return if self.data_form_widget.title: self.window.set_title('%s - Search - Gajim' % \ self.data_form_widget.title) else: self.is_form = False self.data_form_widget = config.FakeDataForm(obj.data) self.data_form_widget.show_all() self.search_vbox.pack_start(self.data_form_widget, True, True, 0) self.search_button.set_sensitive(True) def on_result_treeview_cursor_changed(self, treeview): if self.jid_column == -1: return (model, iter_) = treeview.get_selection().get_selected() if not iter_: return if model[iter_][self.jid_column]: self.add_contact_button.set_sensitive(True) self.information_button.set_sensitive(True) else: self.add_contact_button.set_sensitive(False) self.information_button.set_sensitive(False) def _nec_search_result_received(self, obj): if self.pulse_id: GLib.source_remove(self.pulse_id) self.progressbar.hide() self.label.hide() if not obj.is_dataform: if not obj.data: self.label.set_text(_('No result')) self.label.show() return # We suppose all items have the same fields sw = Gtk.ScrolledWindow() sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) self.result_treeview = Gtk.TreeView() self.result_treeview.connect('cursor-changed', self.on_result_treeview_cursor_changed) sw.add(self.result_treeview) # Create model fieldtypes = [str]*len(obj.data[0]) model = Gtk.ListStore(*fieldtypes) # Copy data to model for item in obj.data: model.append(item.values()) # Create columns counter = 0 for field in obj.data[0].keys(): self.result_treeview.append_column(Gtk.TreeViewColumn(field, Gtk.CellRendererText(), text=counter)) if field == 'jid': self.jid_column = counter counter += 1 self.result_treeview.set_model(model) sw.show_all() self.search_vbox.pack_start(sw, True, True, 0) if self.jid_column > -1: self.add_contact_button.show() self.information_button.show() return self.dataform = dataforms.ExtendForm(node=obj.data) if len(self.dataform.items) == 0: # No result self.label.set_text(_('No result')) self.label.show() return self.data_form_widget.set_sensitive(True) try: self.data_form_widget.data_form = self.dataform except dataforms.Error: self.label.set_text(_('Error in received dataform')) self.label.show() return self.result_treeview = self.data_form_widget.records_treeview selection = self.result_treeview.get_selection() selection.set_mode(Gtk.SelectionMode.SINGLE) self.result_treeview.connect('cursor-changed', self.on_result_treeview_cursor_changed) counter = 0 for field in self.dataform.reported.iter_fields(): if field.var == 'jid': self.jid_column = counter break counter += 1 self.search_vbox.pack_start(self.data_form_widget, True, True, 0) self.data_form_widget.show() if self.jid_column > -1: self.add_contact_button.show() self.information_button.show() if self.data_form_widget.title: self.window.set_title('%s - Search - Gajim' % \ self.data_form_widget.title) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/secrets.py000066400000000000000000000072251326020644600240220ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/secrets.py ## ## Copyright (C) 2007-2008 Brendan Taylor ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gajim.common.configpaths import gajimpaths import Crypto from gajim.common import crypto from gajim.common import exceptions import os import pickle secrets_filename = gajimpaths['SECRETS_FILE'] secrets_cache = None class Secrets(): def __init__(self, filename): self.filename = filename self.srs = {} self.pubkeys = {} self.privkeys = {} def cancel(self): raise exceptions.Cancelled def save(self): f = open(secrets_filename, 'wb') pickle.dump(self, f, protocol=2) f.close() def retained_secrets(self, account, bare_jid): try: return self.srs[account][bare_jid] except KeyError: return [] # retained secrets are stored as a tuple of the secret and whether the user # has verified it def save_new_srs(self, account, jid, secret, verified): if not account in self.srs: self.srs[account] = {} if not jid in self.srs[account]: self.srs[account][jid] = [] self.srs[account][jid].append((secret, verified)) self.save() def find_srs(self, account, jid, srs): our_secrets = self.srs[account][jid] return [(x, y) for x, y in our_secrets if x == srs][0] # has the user verified this retained secret? def srs_verified(self, account, jid, srs): return self.find_srs(account, jid, srs)[1] def replace_srs(self, account, jid, old_secret, new_secret, verified): our_secrets = self.srs[account][jid] idx = our_secrets.index(self.find_srs(account, jid, old_secret)) our_secrets[idx] = (new_secret, verified) self.save() # the public key associated with 'account' def my_pubkey(self, account): try: pk = self.privkeys[account] except KeyError: pk = Crypto.PublicKey.RSA.generate(2048, crypto.random_bytes) self.privkeys[account] = pk self.save() return pk def load_secrets(filename): f = open(filename, 'rb') try: secrets = pickle.load(f, encoding='latin1') # We do that to be able to read files written in py2 for acct in secrets.srs: for jid in secrets.srs[acct]: for (secret, verified) in list(secrets.srs[acct][jid]): if type(secret) is str: secrets.srs[acct][jid].remove((secret, verified)) secrets.srs[acct][jid].append((secret.encode('latin1'), verified)) except (KeyError, EOFError, ImportError): f.close() secrets = Secrets(filename) f.close() return secrets def secrets(): global secrets_cache if secrets_cache: return secrets_cache if os.path.exists(secrets_filename): secrets_cache = load_secrets(secrets_filename) else: secrets_cache = Secrets(secrets_filename) return secrets_cache gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/server_info.py000066400000000000000000000225401326020644600246700ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Copyright (C) 2017 Philipp Hörist # # This file is part of Gajim. # # Gajim 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. # # Gajim 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 Gajim. If not, see . from collections import namedtuple from datetime import timedelta import logging from gi.repository import Gtk import nbxmpp from gajim.common import app from gajim.common import ged from gajim.gtkgui_helpers import get_icon_pixmap, Color log = logging.getLogger('gajim.serverinfo') class ServerInfoDialog(Gtk.Dialog): def __init__(self, account): flags = Gtk.DialogFlags.DESTROY_WITH_PARENT super().__init__(_('Server Info'), None, flags) self.account = account self.set_transient_for(app.interface.roster.window) self.set_resizable(False) grid = Gtk.Grid() grid.set_name('ServerInfoGrid') grid.set_row_spacing(10) grid.set_hexpand(True) self.info_listbox = Gtk.ListBox() self.info_listbox.set_selection_mode(Gtk.SelectionMode.NONE) self.info_listbox.set_header_func(self.header_func, 'Information') grid.attach(self.info_listbox, 0, 0, 1, 1) self.feature_listbox = Gtk.ListBox() self.feature_listbox.set_selection_mode(Gtk.SelectionMode.NONE) self.feature_listbox.set_header_func(self.header_func, 'Features') grid.attach(self.feature_listbox, 0, 1, 1, 1) box = self.get_content_area() box.pack_start(grid, True, True, 0) box.set_property('margin', 12) box.set_spacing(18) self.connect('response', self.on_response) self.connect('destroy', self.on_destroy) app.ged.register_event_handler('version-result-received', ged.CORE, self._nec_version_result_received) app.ged.register_event_handler('agent-info-received', ged.GUI1, self._nec_agent_info_received) self.version = '' self.uptime = '' self.hostname = app.get_hostname_from_account(account) app.connections[account].request_os_info(self.hostname, None) self.request_last_activity() for feature in self.get_features(): self.add_feature(feature) for info in self.get_infos(): self.add_info(info) self.show_all() @staticmethod def header_func(row, before, user_data): if before: row.set_header(None) else: label = Gtk.Label(label=user_data) label.set_halign(Gtk.Align.START) row.set_header(label) @staticmethod def update(func, listbox): for index, item in enumerate(func()): row = listbox.get_row_at_index(index) row.get_child().update(item) row.set_tooltip_text(row.get_child().tooltip) def request_last_activity(self): if not app.account_is_connected(self.account): return con = app.connections[self.account] iq = nbxmpp.Iq(to=self.hostname, typ='get', queryNS=nbxmpp.NS_LAST) con.connection.SendAndCallForResponse(iq, self._on_last_activity) def _on_last_activity(self, stanza): if 'server_info' not in app.interface.instances[self.account]: # Window got closed in the meantime return if not nbxmpp.isResultNode(stanza): log.warning('Received malformed result: %s', stanza) return if stanza.getQueryNS() != nbxmpp.NS_LAST: log.warning('Wrong namespace on result: %s', stanza) return try: seconds = int(stanza.getQuery().getAttr('seconds')) except (ValueError, TypeError, AttributeError): log.exception('Received malformed last activity result') else: delta = timedelta(seconds=seconds) hours = 0 if seconds >= 3600: hours = delta.seconds // 3600 self.uptime = _('%(days)s days, %(hours)s hours') % { 'days': delta.days, 'hours': hours} self.update(self.get_infos, self.info_listbox) def _nec_version_result_received(self, obj): if obj.jid != self.hostname: return self.version = obj.client_info self.update(self.get_infos, self.info_listbox) def _nec_agent_info_received(self, obj): if 'Gajim_' not in obj.id_: return self.update(self.get_features, self.feature_listbox) def add_feature(self, feature): item = FeatureItem(feature) self.feature_listbox.add(item) item.get_parent().set_tooltip_text(item.tooltip) def get_features(self): con = app.connections[self.account] Feature = namedtuple('Feature', ['name', 'available', 'tooltip', 'enabled']) carbons_enabled = app.config.get_per('accounts', self.account, 'enable_message_carbons') mam_enabled = app.config.get_per('accounts', self.account, 'sync_logs_with_server') return [ Feature('XEP-0016: Privacy Lists', con.privacy_rules_supported, '', None), Feature('XEP-0045: Multi-User Chat', con.muc_jid, '', None), Feature('XEP-0054: vcard-temp', con.vcard_supported, '', None), Feature('XEP-0163: Personal Eventing Protocol', con.pep_supported, '', None), Feature('XEP-0163: #publish-options', con.pubsub_publish_options_supported, '', None), Feature('XEP-0191: Blocking Command', con.blocking_supported, nbxmpp.NS_BLOCKING, None), Feature('XEP-0198: Stream Management', con.sm.enabled, nbxmpp.NS_STREAM_MGMT, None), Feature('XEP-0280: Message Carbons', con.carbons_available, nbxmpp.NS_CARBONS, carbons_enabled), Feature('XEP-0313: Message Archive Management', con.archiving_namespace, con.archiving_namespace, mam_enabled), Feature('XEP-0363: HTTP File Upload', con.httpupload, nbxmpp.NS_HTTPUPLOAD, None)] def add_info(self, info): self.info_listbox.add(ServerInfoItem(info)) def get_infos(self): Info = namedtuple('Info', ['name', 'value', 'tooltip']) return [ Info(_('Hostname'), self.hostname, None), Info(_('Server Software'), self.version, None), Info(_('Server Uptime'), self.uptime, None)] def on_response(self, dialog, response): if response == Gtk.ResponseType.OK: self.destroy() def on_destroy(self, *args): del app.interface.instances[self.account]['server_info'] app.ged.remove_event_handler('version-result-received', ged.CORE, self._nec_version_result_received) app.ged.remove_event_handler('agent-info-received', ged.GUI1, self._nec_agent_info_received) class FeatureItem(Gtk.Grid): def __init__(self, feature): super().__init__() self.tooltip = feature.tooltip self.set_column_spacing(6) self.icon = Gtk.Image() self.feature_label = Gtk.Label(label=feature.name) self.set_feature(feature.available, feature.enabled) self.add(self.icon) self.add(self.feature_label) def set_feature(self, available, enabled): if not available: self.icon.set_from_pixbuf( get_icon_pixmap('window-close-symbolic', color=[Color.RED])) elif enabled is False: self.icon.set_from_pixbuf( get_icon_pixmap('dialog-warning-symbolic', color=[Color.ORANGE])) self.tooltip += _('\nDisabled in config') else: self.icon.set_from_pixbuf( get_icon_pixmap('emblem-ok-symbolic', color=[Color.GREEN])) def update(self, feature): self.tooltip = feature.tooltip self.set_feature(feature.available, feature.enabled) class ServerInfoItem(Gtk.Grid): def __init__(self, info): super().__init__() self.tooltip = info.tooltip self.set_hexpand(True) self.insert_column(0) self.set_column_homogeneous(True) self.info = Gtk.Label(label=info.name) self.info.set_halign(Gtk.Align.START) self.info.set_hexpand(True) self.value = Gtk.Label(label=info.value) self.value.set_halign(Gtk.Align.START) self.value.set_hexpand(True) self.value.set_selectable(True) self.add(self.info) self.add(self.value) def update(self, info): self.value.set_text(info.value) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/session.py000066400000000000000000000555141326020644600240410ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/session.py ## ## Copyright (C) 2008-2014 Yann Leboulanger ## Copyright (C) 2008 Brendan Taylor ## Jonathan Schleifer ## Stephan Erb ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import nbxmpp from gajim.common import helpers from gajim.common import events from gajim.common import exceptions from gajim.common import app from gajim.common import stanza_session from gajim.common import contacts from gajim.common import ged from gajim.common.connection_handlers_events import ChatstateReceivedEvent, \ InformationEvent from gajim.common.logger import KindConstant from gajim import message_control from gajim import notify from gajim import dialogs from gajim import negotiation class ChatControlSession(stanza_session.EncryptedStanzaSession): def __init__(self, conn, jid, thread_id, type_='chat'): stanza_session.EncryptedStanzaSession.__init__(self, conn, jid, thread_id, type_='chat') app.ged.register_event_handler('decrypted-message-received', ged.GUI1, self._nec_decrypted_message_received) self.control = None def detach_from_control(self): if self.control: self.control.set_session(None) def acknowledge_termination(self): self.detach_from_control() stanza_session.EncryptedStanzaSession.acknowledge_termination(self) def terminate(self, send_termination = True): stanza_session.EncryptedStanzaSession.terminate(self, send_termination) self.detach_from_control() def _nec_decrypted_message_received(self, obj): """ Dispatch a received stanza """ if obj.session != self: return contact = app.contacts.get_contact(self.conn.name, obj.jid, obj.resource) if not contact: contact = app.contacts.get_gc_contact(self.conn.name, obj.jid, obj.resource) if self.resource != obj.resource: self.resource = obj.resource if self.control: if isinstance(contact, contacts.GC_Contact): self.control.gc_contact = contact self.control.contact = contact.as_contact() else: self.control.contact = contact if self.control.resource: self.control.change_resource(self.resource) if obj.mtype == 'chat': if not obj.msgtxt and obj.chatstate is None: return log_type = KindConstant.CHAT_MSG_RECV if obj.forwarded and obj.sent: log_type = KindConstant.CHAT_MSG_SENT else: log_type = KindConstant.SINGLE_MSG_RECV if obj.forwarded and obj.sent: log_type = KindConstant.SINGLE_MSG_SENT treat_as = app.config.get('treat_incoming_messages') if treat_as: obj.mtype = treat_as pm = False if obj.muc_pm or (obj.gc_control and obj.resource): # It's a Private message pm = True obj.mtype = 'pm' if self.is_loggable() and obj.msgtxt: if obj.xhtml and app.config.get('log_xhtml_messages'): msg_to_log = obj.xhtml else: msg_to_log = obj.msgtxt jid = obj.fjid if not pm: jid = obj.jid obj.msg_log_id = app.logger.insert_into_logs( self.conn.name, jid, obj.timestamp, log_type, message=msg_to_log, subject=obj.subject, additional_data=obj.additional_data, stanza_id=obj.unique_id) if obj.muc_pm and not obj.gc_control: # This is a carbon of a PM from a MUC we are not currently # joined. We log it silently without notification. return True # Handle chat states if contact and (not obj.forwarded or not obj.sent): if self.control and self.control.type_id == \ message_control.TYPE_CHAT: if obj.chatstate is not None: # other peer sent us reply, so he supports jep85 or jep22 contact.chatstate = obj.chatstate if contact.our_chatstate == 'ask': # we were jep85 disco? contact.our_chatstate = 'active' # no more app.nec.push_incoming_event(ChatstateReceivedEvent(None, conn=obj.conn, msg_obj=obj)) elif contact.chatstate != 'active': # got no valid jep85 answer, peer does not support it contact.chatstate = False elif obj.chatstate == 'active': # Brand new message, incoming. contact.our_chatstate = obj.chatstate contact.chatstate = obj.chatstate # THIS MUST BE AFTER chatstates handling # AND BEFORE playsound (else we hear sounding on chatstates!) if not obj.msgtxt: # empty message text return True if app.config.get_per('accounts', self.conn.name, 'ignore_unknown_contacts') and not app.contacts.get_contacts( self.conn.name, obj.jid) and not pm: return True highest_contact = app.contacts.get_contact_with_highest_priority( self.conn.name, obj.jid) # does this resource have the highest priority of any available? is_highest = not highest_contact or not highest_contact.resource or \ obj.resource == highest_contact.resource or highest_contact.show ==\ 'offline' if not self.control: ctrl = app.interface.msg_win_mgr.search_control(obj.jid, obj.conn.name, obj.resource) if ctrl: self.control = ctrl self.control.set_session(self) if isinstance(contact, contacts.GC_Contact): self.control.gc_contact = contact self.control.contact = contact.as_contact() else: self.control.contact = contact if not pm: self.roster_message2(obj) if app.interface.remote_ctrl: app.interface.remote_ctrl.raise_signal('NewMessage', ( self.conn.name, [obj.fjid, obj.msgtxt, obj.timestamp, obj.encrypted, obj.mtype, obj.subject, obj.chatstate, obj.msg_log_id, obj.user_nick, obj.xhtml, obj.form_node])) def roster_message2(self, obj): """ Display the message or show notification in the roster """ contact = None jid = obj.jid resource = obj.resource fjid = jid # Try to catch the contact with correct resource if resource: fjid = jid + '/' + resource contact = app.contacts.get_contact(obj.conn.name, jid, resource) highest_contact = app.contacts.get_contact_with_highest_priority( obj.conn.name, jid) if not contact: # If there is another resource, it may be a message from an # invisible resource lcontact = app.contacts.get_contacts(obj.conn.name, jid) if (len(lcontact) > 1 or (lcontact and lcontact[0].resource and \ lcontact[0].show != 'offline')) and jid.find('@') > 0: contact = app.contacts.copy_contact(highest_contact) contact.resource = resource contact.priority = 0 contact.show = 'offline' contact.status = '' app.contacts.add_contact(obj.conn.name, contact) else: # Default to highest prio fjid = jid contact = highest_contact if not contact: # contact is not in roster contact = app.interface.roster.add_to_not_in_the_roster( obj.conn.name, jid, obj.user_nick) if not self.control: ctrl = app.interface.msg_win_mgr.search_control(obj.jid, obj.conn.name, obj.resource) if ctrl: self.control = ctrl self.control.set_session(self) else: fjid = jid obj.popup = helpers.allow_popup_window(self.conn.name) event_t = events.ChatEvent event_type = 'message_received' if obj.mtype == 'normal': event_t = events.NormalEvent event_type = 'single_message_received' if self.control and obj.mtype != 'normal': # We have a ChatControl open obj.show_in_roster = False obj.show_in_systray = False do_event = False elif obj.forwarded and obj.sent: # Its a Carbon Copied Message we sent obj.show_in_roster = False obj.show_in_systray = False unread_events = app.events.get_events( self.conn.name, fjid, types=['chat']) read_ids = [] for msg in unread_events: read_ids.append(msg.msg_log_id) app.logger.set_read_messages(read_ids) app.events.remove_events(self.conn.name, fjid, types=['chat']) do_event = False else: # Everything else obj.show_in_roster = notify.get_show_in_roster(event_type, self.conn.name, contact, self) obj.show_in_systray = notify.get_show_in_systray(event_type, self.conn.name, contact) if obj.mtype == 'normal' and obj.popup: do_event = False else: do_event = True if do_event: event = event_t(obj.msgtxt, obj.subject, obj.mtype, obj.timestamp, obj.encrypted, obj.resource, obj.msg_log_id, correct_id=(obj.id_, obj.correct_id), xhtml=obj.xhtml, session=self, form_node=obj.form_node, displaymarking=obj.displaymarking, sent_forwarded=obj.forwarded and obj.sent, show_in_roster=obj.show_in_roster, show_in_systray=obj.show_in_systray, additional_data=obj.additional_data) app.events.add_event(self.conn.name, fjid, event) def roster_message(self, jid, msg, tim, encrypted=False, msg_type='', subject=None, resource='', msg_log_id=None, user_nick='', xhtml=None, form_node=None, displaymarking=None, additional_data=None): """ Display the message or show notification in the roster """ contact = None fjid = jid if additional_data is None: additional_data = {} # Try to catch the contact with correct resource if resource: fjid = jid + '/' + resource contact = app.contacts.get_contact(self.conn.name, jid, resource) highest_contact = app.contacts.get_contact_with_highest_priority( self.conn.name, jid) if not contact: # If there is another resource, it may be a message from an invisible # resource lcontact = app.contacts.get_contacts(self.conn.name, jid) if (len(lcontact) > 1 or (lcontact and lcontact[0].resource and \ lcontact[0].show != 'offline')) and jid.find('@') > 0: contact = app.contacts.copy_contact(highest_contact) contact.resource = resource if resource: fjid = jid + '/' + resource contact.priority = 0 contact.show = 'offline' contact.status = '' app.contacts.add_contact(self.conn.name, contact) else: # Default to highest prio fjid = jid contact = highest_contact if not contact: # contact is not in roster contact = app.interface.roster.add_to_not_in_the_roster( self.conn.name, jid, user_nick) if not self.control: ctrl = app.interface.msg_win_mgr.get_control(fjid, self.conn.name) if ctrl: self.control = ctrl self.control.set_session(self) else: fjid = jid # Do we have a queue? no_queue = len(app.events.get_events(self.conn.name, fjid)) == 0 popup = helpers.allow_popup_window(self.conn.name) if msg_type == 'normal' and popup: # it's single message to be autopopuped dialogs.SingleMessageWindow(self.conn.name, contact.jid, action='receive', from_whom=jid, subject=subject, message=msg, resource=resource, session=self, form_node=form_node) return # We print if window is opened and it's not a single message if self.control and msg_type != 'normal': typ = '' if msg_type == 'error': typ = 'error' self.control.print_conversation(msg, typ, tim=tim, encrypted=encrypted, subject=subject, xhtml=xhtml, displaymarking=displaymarking, additional_data=additional_data) if msg_log_id: app.logger.set_read_messages([msg_log_id]) return # We save it in a queue event_t = events.ChatEvent event_type = 'message_received' if msg_type == 'normal': event_t = events.NormalEvent event_type = 'single_message_received' show_in_roster = notify.get_show_in_roster(event_type, self.conn.name, contact, self) show_in_systray = notify.get_show_in_systray(event_type, self.conn.name, contact) event = event_t(msg, subject, msg_type, tim, encrypted, resource, msg_log_id, xhtml=xhtml, session=self, form_node=form_node, displaymarking=displaymarking, sent_forwarded=False, show_in_roster=show_in_roster, show_in_systray=show_in_systray, additional_data=additional_data) app.events.add_event(self.conn.name, fjid, event) if popup: if not self.control: self.control = app.interface.new_chat(contact, self.conn.name, session=self) if len(app.events.get_events(self.conn.name, fjid)): self.control.read_queue() else: if no_queue: # We didn't have a queue: we change icons app.interface.roster.draw_contact(jid, self.conn.name) app.interface.roster.show_title() # we show the * or [n] # Select the big brother contact in roster, it's visible because it has # events. family = app.contacts.get_metacontacts_family(self.conn.name, jid) if family: nearby_family, bb_jid, bb_account = \ app.contacts.get_nearby_family_and_big_brother(family, self.conn.name) else: bb_jid, bb_account = jid, self.conn.name app.interface.roster.select_contact(bb_jid, bb_account) # ---- ESessions stuff --- def handle_negotiation(self, form): if form.getField('accept') and not form['accept'] in ('1', 'true'): self.cancelled_negotiation() return # encrypted session states. these are described in stanza_session.py try: if form.getType() == 'form' and 'security' in form.asDict(): security_options = [x[1] for x in form.getField('security').\ getOptions()] if security_options == ['none']: self.respond_archiving(form) else: # bob responds # we don't support 3-message negotiation as the responder if 'dhkeys' in form.asDict(): self.fail_bad_negotiation('3 message negotiation not ' 'supported when responding', ('dhkeys',)) return negotiated, not_acceptable, ask_user = \ self.verify_options_bob(form) if ask_user: def accept_nondefault_options(is_checked): self.dialog.destroy() negotiated.update(ask_user) self.respond_e2e_bob(form, negotiated, not_acceptable) def reject_nondefault_options(): self.dialog.destroy() for key in ask_user.keys(): not_acceptable.append(key) self.respond_e2e_bob(form, negotiated, not_acceptable) self.dialog = dialogs.YesNoDialog(_('Confirm these ' 'session options'), _('The remote client wants to negotiate a session ' 'with these features:\n\n%s\n\nAre these options ' 'acceptable?''') % ( negotiation.describe_features(ask_user)), on_response_yes=accept_nondefault_options, on_response_no=reject_nondefault_options, transient_for=self.control.parent_win.window) else: self.respond_e2e_bob(form, negotiated, not_acceptable) return elif self.status == 'requested-archiving' and form.getType() == \ 'submit': try: self.archiving_accepted(form) except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return # alice accepts elif self.status == 'requested-e2e' and form.getType() == 'submit': negotiated, not_acceptable, ask_user = self.verify_options_alice( form) if ask_user: def accept_nondefault_options(is_checked): if dialog: dialog.destroy() if is_checked: allow_no_log_for = app.config.get_per( 'accounts', self.conn.name, 'allow_no_log_for').split() jid = str(self.jid) if jid not in allow_no_log_for: allow_no_log_for.append(jid) app.config.set_per('accounts', self.conn.name, 'allow_no_log_for', ' '.join(allow_no_log_for)) negotiated.update(ask_user) try: self.accept_e2e_alice(form, negotiated) except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) def reject_nondefault_options(): self.reject_negotiation() dialog.destroy() allow_no_log_for = app.config.get_per('accounts', self.conn.name, 'allow_no_log_for').split() if str(self.jid) in allow_no_log_for: dialog = None accept_nondefault_options(False) else: dialog = dialogs.YesNoDialog(_('Confirm these session ' 'options'), _('The remote client selected these options:\n\n%s' '\n\nContinue with the session?') % ( negotiation.describe_features(ask_user)), _('Always accept for this contact'), on_response_yes = accept_nondefault_options, on_response_no = reject_nondefault_options, transient_for=self.control.parent_win.window) else: try: self.accept_e2e_alice(form, negotiated) except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return elif self.status == 'responded-archiving' and form.getType() == \ 'result': try: self.we_accept_archiving(form) except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return elif self.status == 'responded-e2e' and form.getType() == 'result': try: self.accept_e2e_bob(form) except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return elif self.status == 'identified-alice' and form.getType() == 'result': try: self.final_steps_alice(form) except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return except exceptions.Cancelled: # user cancelled the negotiation self.reject_negotiation() return if form.getField('terminate') and\ form.getField('terminate').getValue() in ('1', 'true'): self.acknowledge_termination() self.conn.delete_session(str(self.jid), self.thread_id) return # non-esession negotiation. this isn't very useful, but i'm keeping it # around to test my test suite. if form.getType() == 'form': if not self.control: jid, resource = app.get_room_and_nick_from_fjid(str(self.jid)) account = self.conn.name contact = app.contacts.get_contact(account, str(self.jid), resource) if not contact: contact = app.contacts.create_contact(jid=jid, account=account, resource=resource, show=self.conn.get_status()) app.interface.new_chat(contact, account, resource=resource, session=self) negotiation.FeatureNegotiationWindow(account, str(self.jid), self, form) gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/shortcuts_window.py000066400000000000000000000031041326020644600257670ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/shortcuts_window.py ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gi.repository import Gtk from gajim import gtkgui_helpers from gajim.common import helpers __all__ = ['show'] class ShortcutsWindow: def __init__(self): self.window = None def show(self, parent=None): if self.window is None: builder = gtkgui_helpers.get_gtk_builder('shortcuts_window.ui') self.window = builder.get_object('shortcuts_window') self.window.connect('destroy', self._on_window_destroy) self.window.set_transient_for(parent) self.window.show_all() self.window.present() def _on_window_destroy(self, widget): self.window = None def show_shortcuts_webpage(self, parent=None): helpers.launch_browser_mailer('url', 'https://dev.gajim.org/gajim/gajim/wikis/help/keyboardshortcuts') if (3, 19) <= (Gtk.get_major_version(), Gtk.get_minor_version()): show = ShortcutsWindow().show else: show = show_shortcuts_webpage gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/statusicon.py000066400000000000000000000464251326020644600245530ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/statusicon.py ## ## Copyright (C) 2006 Nikos Kouremenos ## Copyright (C) 2006-2007 Jean-Marie Traissard ## Copyright (C) 2006-2014 Yann Leboulanger ## Copyright (C) 2007 Lukas Petrovicky ## Julien Pivotto ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## from gi.repository import Gtk from gi.repository import Gdk import os import sys from gajim import dialogs from gajim import config from gajim import tooltips from gajim import gtkgui_helpers from gajim.common import app from gajim.common import helpers class StatusIcon: """ Class for the notification area icon """ def __init__(self): self.single_message_handler_id = None self.show_roster_handler_id = None self.new_chat_handler_id = None # click somewhere else does not popdown menu. workaround this. self.added_hide_menuitem = False self.status = 'offline' self.xml = gtkgui_helpers.get_gtk_builder('systray_context_menu.ui') self.systray_context_menu = self.xml.get_object('systray_context_menu') self.xml.connect_signals(self) self.popup_menus = [] self.status_icon = None self.tooltip = tooltips.NotificationAreaTooltip() def subscribe_events(self): """ Register listeners to the events class """ app.events.event_added_subscribe(self.on_event_added) app.events.event_removed_subscribe(self.on_event_removed) def unsubscribe_events(self): """ Unregister listeners to the events class """ app.events.event_added_unsubscribe(self.on_event_added) app.events.event_removed_unsubscribe(self.on_event_removed) def on_event_added(self, event): """ Called when an event is added to the event list """ if event.show_in_systray: self.set_img() def on_event_removed(self, event_list): """ Called when one or more events are removed from the event list """ self.set_img() def show_icon(self): if not self.status_icon: self.status_icon = Gtk.StatusIcon() self.status_icon.set_property('has-tooltip', True) self.status_icon.connect('activate', self.on_status_icon_left_clicked) self.status_icon.connect('popup-menu', self.on_status_icon_right_clicked) self.status_icon.connect('query-tooltip', self.on_status_icon_query_tooltip) self.status_icon.connect('size-changed', self.set_img) self.set_img() self.subscribe_events() def on_status_icon_right_clicked(self, widget, event_button, event_time): self.make_menu(event_button, event_time) def on_status_icon_query_tooltip(self, widget, x, y, keyboard_mode, tooltip): tooltip.set_custom(self.tooltip.get_tooltip()) return True def hide_icon(self): self.status_icon.set_visible(False) self.unsubscribe_events() def on_status_icon_left_clicked(self, widget): self.on_left_click() def on_status_icon_size_changed(self, statusicon, size): if size > 31: self.statusicon_size = '32' elif size > 23: self.statusicon_size = '24' else: self.statusicon_size = '16' if os.environ.get('KDE_FULL_SESSION') == 'true': # detect KDE session. see #5476 self.statusicon_size = '32' self.set_img() def set_img(self, *args): """ Apart from image, we also update tooltip text here """ if not app.interface.systray_enabled: return if app.config.get('trayicon') == 'always': self.status_icon.set_visible(True) if app.events.get_nb_systray_events(): self.status_icon.set_visible(True) icon_name = gtkgui_helpers.get_iconset_name_for('event') self.status_icon.set_from_icon_name(icon_name) return else: if app.config.get('trayicon') == 'on_event': self.status_icon.set_visible(False) icon_name = gtkgui_helpers.get_iconset_name_for(self.status) self.status_icon.set_from_icon_name(icon_name) def change_status(self, global_status): """ Set tray image to 'global_status' """ # change image and status, only if it is different if global_status is not None and self.status != global_status: self.status = global_status self.set_img() def start_chat(self, widget, account, jid): contact = app.contacts.get_first_contact_from_jid(account, jid) if app.interface.msg_win_mgr.has_window(jid, account): app.interface.msg_win_mgr.get_window(jid, account).set_active_tab( jid, account) elif contact: app.interface.new_chat(contact, account) app.interface.msg_win_mgr.get_window(jid, account).set_active_tab( jid, account) def on_single_message_menuitem_activate(self, widget, account): dialogs.SingleMessageWindow(account, action='send') def on_new_chat(self, widget, account): app.app.activate_action('start-chat') def make_menu(self, event_button, event_time): """ Create chat with and new message (sub) menus/menuitems """ for m in self.popup_menus: m.destroy() chat_with_menuitem = self.xml.get_object('chat_with_menuitem') single_message_menuitem = self.xml.get_object( 'single_message_menuitem') status_menuitem = self.xml.get_object('status_menu') join_gc_menuitem = self.xml.get_object('join_gc_menuitem') sounds_mute_menuitem = self.xml.get_object('sounds_mute_menuitem') show_roster_menuitem = self.xml.get_object('show_roster_menuitem') if self.single_message_handler_id: single_message_menuitem.handler_disconnect( self.single_message_handler_id) self.single_message_handler_id = None if self.new_chat_handler_id: chat_with_menuitem.disconnect(self.new_chat_handler_id) self.new_chat_handler_id = None sub_menu = Gtk.Menu() self.popup_menus.append(sub_menu) status_menuitem.set_submenu(sub_menu) gc_sub_menu = Gtk.Menu() # gc is always a submenu join_gc_menuitem.set_submenu(gc_sub_menu) # We need our own set of status icons, let's make 'em! iconset = app.config.get('iconset') path = os.path.join(helpers.get_iconset_path(iconset), '16x16') for show in ('online', 'chat', 'away', 'xa', 'dnd', 'invisible'): uf_show = helpers.get_uf_show(show, use_mnemonic=True) item = Gtk.MenuItem.new_with_mnemonic(uf_show) sub_menu.append(item) item.connect('activate', self.on_show_menuitem_activate, show) item = Gtk.SeparatorMenuItem.new() sub_menu.append(item) item = Gtk.MenuItem.new_with_mnemonic(_('_Change Status Message…')) sub_menu.append(item) item.connect('activate', self.on_change_status_message_activate) connected_accounts = app.get_number_of_connected_accounts() if connected_accounts < 1: item.set_sensitive(False) connected_accounts_with_private_storage = 0 item = Gtk.SeparatorMenuItem.new() sub_menu.append(item) uf_show = helpers.get_uf_show('offline', use_mnemonic=True) item = Gtk.MenuItem.new_with_mnemonic(uf_show) sub_menu.append(item) item.connect('activate', self.on_show_menuitem_activate, 'offline') iskey = connected_accounts > 0 and not (connected_accounts == 1 and app.zeroconf_is_connected()) chat_with_menuitem.set_sensitive(iskey) single_message_menuitem.set_sensitive(iskey) join_gc_menuitem.set_sensitive(iskey) accounts_list = sorted(app.contacts.get_accounts()) # items that get shown whether an account is zeroconf or not if connected_accounts > 1: # 2 or more connections? make submenus account_menu_for_chat_with = Gtk.Menu() chat_with_menuitem.set_submenu(account_menu_for_chat_with) self.popup_menus.append(account_menu_for_chat_with) for account in accounts_list: account_label = app.config.get_per( 'accounts', account, 'account_label') or account if app.account_is_connected(account): # for chat_with item = Gtk.MenuItem.new_with_label( _('using account %s') % account_label) account_menu_for_chat_with.append(item) item.connect('activate', self.on_new_chat, account) elif connected_accounts == 1: # one account # one account connected, no need to show 'as jid' for account in app.connections: if app.connections[account].connected > 1: # for start chat self.new_chat_handler_id = chat_with_menuitem.connect( 'activate', self.on_new_chat, account) break # No other connected account # menu items that don't apply to zeroconf connections if connected_accounts == 1 or (connected_accounts == 2 and \ app.zeroconf_is_connected()): # only one 'real' (non-zeroconf) account is connected, don't need # submenus for account in app.connections: if app.account_is_connected(account) and \ not app.config.get_per('accounts', account, 'is_zeroconf'): if app.connections[account].private_storage_supported: connected_accounts_with_private_storage += 1 # for single message single_message_menuitem.set_submenu(None) self.single_message_handler_id = single_message_menuitem.\ connect('activate', self.on_single_message_menuitem_activate, account) # join gc app.interface.roster.add_bookmarks_list(gc_sub_menu, account) break # No other account connected else: # 2 or more 'real' accounts are connected, make submenus account_menu_for_single_message = Gtk.Menu() single_message_menuitem.set_submenu( account_menu_for_single_message) self.popup_menus.append(account_menu_for_single_message) for account in accounts_list: account_label = app.config.get_per( 'accounts', account, 'account_label') or account if app.connections[account].is_zeroconf or \ not app.account_is_connected(account): continue if app.connections[account].private_storage_supported: connected_accounts_with_private_storage += 1 # for single message item = Gtk.MenuItem.new_with_label( _('using account %s') % account_label) item.connect('activate', self.on_single_message_menuitem_activate, account) account_menu_for_single_message.append(item) # join gc gc_item = Gtk.MenuItem.new_with_label( _('using account %s') % account_label) gc_sub_menu.append(gc_item) gc_menuitem_menu = Gtk.Menu() app.interface.roster.add_bookmarks_list(gc_menuitem_menu, account) gc_item.set_submenu(gc_menuitem_menu) gc_sub_menu.show_all() newitem = Gtk.SeparatorMenuItem.new() # separator gc_sub_menu.append(newitem) newitem = Gtk.MenuItem.new_with_mnemonic(_('_Manage Bookmarks…')) newitem.connect('activate', app.interface.roster.on_manage_bookmarks_menuitem_activate) gc_sub_menu.append(newitem) if connected_accounts_with_private_storage == 0: newitem.set_sensitive(False) sounds_mute_menuitem.set_active(not app.config.get('sounds_on')) win = app.interface.roster.window if self.show_roster_handler_id: show_roster_menuitem.handler_disconnect(self.show_roster_handler_id) if win.get_property('has-toplevel-focus'): show_roster_menuitem.get_children()[0].set_label(_('Hide _Roster')) self.show_roster_handler_id = show_roster_menuitem.connect( 'activate', self.on_hide_roster_menuitem_activate) else: show_roster_menuitem.get_children()[0].set_label(_('Show _Roster')) self.show_roster_handler_id = show_roster_menuitem.connect( 'activate', self.on_show_roster_menuitem_activate) if os.name == 'nt': if self.added_hide_menuitem is False: self.systray_context_menu.prepend(Gtk.SeparatorMenuItem.new()) item = Gtk.MenuItem.new_with_label( _('Hide this menu')) self.systray_context_menu.prepend(item) self.added_hide_menuitem = True self.systray_context_menu.show_all() self.systray_context_menu.popup(None, None, None, None, 0, event_time) def on_show_all_events_menuitem_activate(self, widget): events = app.events.get_systray_events() for account in events: for jid in events[account]: for event in events[account][jid]: app.interface.handle_event(account, jid, event.type_) def on_sounds_mute_menuitem_activate(self, widget): app.config.set('sounds_on', not widget.get_active()) def on_show_roster_menuitem_activate(self, widget): win = app.interface.roster.window win.present() def on_hide_roster_menuitem_activate(self, widget): win = app.interface.roster.window win.hide() def on_preferences_menuitem_activate(self, widget): if 'preferences' in app.interface.instances: app.interface.instances['preferences'].window.present() else: app.interface.instances['preferences'] = config.PreferencesWindow() def on_quit_menuitem_activate(self, widget): app.interface.roster.on_quit_request() def on_left_click(self): win = app.interface.roster.window if len(app.events.get_systray_events()) == 0: # No pending events, so toggle visible/hidden for roster window if win.get_property('visible') and (win.get_property( 'has-toplevel-focus') or os.name == 'nt'): # visible in ANY virtual desktop? # we could be in another VD right now. eg vd2 # and we want to show it in vd2 if not gtkgui_helpers.possibly_move_window_in_current_desktop( win) and app.config.get('save-roster-position'): x, y = win.get_position() app.config.set('roster_x-position', x) app.config.set('roster_y-position', y) win.hide() # else we hide it from VD that was visible in else: if not win.get_property('visible'): win.show_all() if app.config.get('save-roster-position'): gtkgui_helpers.move_window(win, app.config.get('roster_x-position'), app.config.get('roster_y-position')) if not app.config.get('roster_window_skip_taskbar'): win.set_property('skip-taskbar-hint', False) win.present_with_time(Gtk.get_current_event_time()) else: self.handle_first_event() def handle_first_event(self): account, jid, event = app.events.get_first_systray_event() if not event: return win = app.interface.roster.window if not win.get_property('visible') and app.config.get( 'save-roster-position'): gtkgui_helpers.move_window(win, app.config.get('roster_x-position'), app.config.get('roster_y-position')) app.interface.handle_event(account, jid, event.type_) def on_middle_click(self): """ Middle click raises window to have complete focus (fe. get kbd events) but if already raised, it hides it """ win = app.interface.roster.window if win.is_active(): # is it fully raised? (eg does it receive kbd events?) win.hide() else: win.present() def on_clicked(self, widget, event): self.on_tray_leave_notify_event(widget, None) if event.type_ != Gdk.EventType.BUTTON_PRESS: return if event.button == 1: # Left click self.on_left_click() elif event.button == 2: # middle click self.on_middle_click() elif event.button == 3: # right click self.make_menu(event.button, event.time) def on_show_menuitem_activate(self, widget, show): # we all add some fake (we cannot select those nor have them as show) # but this helps to align with roster's status_combobox index positions l = ['online', 'chat', 'away', 'xa', 'dnd', 'invisible', 'SEPARATOR', 'CHANGE_STATUS_MSG_MENUITEM', 'SEPARATOR', 'offline'] index = l.index(show) if not helpers.statuses_unified(): app.interface.roster.status_combobox.set_active(index + 2) return current = app.interface.roster.status_combobox.get_active() if index != current: app.interface.roster.status_combobox.set_active(index) def on_change_status_message_activate(self, widget): model = app.interface.roster.status_combobox.get_model() active = app.interface.roster.status_combobox.get_active() status = model[active][2] def on_response(message, pep_dict): if message is None: # None if user press Cancel return accounts = app.connections.keys() for acct in accounts: if not app.config.get_per('accounts', acct, 'sync_with_global_status'): continue show = app.SHOW_LIST[app.connections[acct].connected] app.interface.roster.send_status(acct, show, message) app.interface.roster.send_pep(acct, pep_dict) dlg = dialogs.ChangeStatusMessageDialog(on_response, status) dlg.dialog.present() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/tooltips.py000066400000000000000000000701361326020644600242300ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## src/tooltips.py ## ## Copyright (C) 2005 Alex Mauer ## Stéphan Kochen ## Copyright (C) 2005-2006 Dimitur Kirov ## Copyright (C) 2005-2007 Nikos Kouremenos ## Copyright (C) 2005-2014 Yann Leboulanger ## Copyright (C) 2006 Travis Shirk ## Stefan Bethge ## Copyright (C) 2006-2007 Jean-Marie Traissard ## Copyright (C) 2007 Julien Pivotto ## Copyright (C) 2007-2008 Stephan Erb ## Copyright (C) 2008 Jonathan Schleifer ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## import os import time import logging from datetime import datetime from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GLib from gi.repository import Pango from gajim import gtkgui_helpers from gajim.common.const import AvatarSize from gajim.common import app from gajim.common import helpers from gajim.common.i18n import Q_ log = logging.getLogger('gajim.tooltips') class StatusTable: """ Contains methods for creating status table. This is used in Roster and NotificationArea tooltips """ def __init__(self): self.current_row = 0 self.table = None self.text_label = None self.spacer_label = ' ' def create_table(self): self.table = Gtk.Grid() self.table.insert_column(0) self.table.set_property('column-spacing', 2) def add_text_row(self, text, col_inc=0): self.table.insert_row(self.current_row) self.text_label = Gtk.Label() self.text_label.set_line_wrap(True) self.text_label.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) self.text_label.set_max_width_chars(35) self.text_label.set_halign(Gtk.Align.START) self.text_label.set_valign(Gtk.Align.START) self.text_label.set_selectable(False) self.text_label.set_markup(text) self.table.attach(self.text_label, 1 + col_inc, self.current_row, 3 - col_inc, 1) self.current_row += 1 def get_status_info(self, resource, priority, show, status): str_status = resource + ' (' + str(priority) + ')' if status: status = status.strip() if status != '': # reduce to 100 chars, 1 line status = helpers.reduce_chars_newlines(status, 100, 1) str_status = GLib.markup_escape_text(str_status) status = GLib.markup_escape_text(status) str_status += ' - ' + status + '' return str_status def add_status_row(self, file_path, show, str_status, show_lock=False, indent=True): """ Append a new row with status icon to the table """ self.table.insert_row(self.current_row) state_file = show.replace(' ', '_') files = [] files.append(os.path.join(file_path, state_file + '.png')) files.append(os.path.join(file_path, state_file + '.gif')) image = Gtk.Image() image.set_from_pixbuf(None) for f in files: if os.path.exists(f): image.set_from_file(f) break spacer = Gtk.Label(label=self.spacer_label) image.set_halign(Gtk.Align.START) image.set_valign(Gtk.Align.CENTER) if indent: self.table.attach(spacer, 1, self.current_row, 1, 1) self.table.attach(image, 2, self.current_row, 1, 1) status_label = Gtk.Label() status_label.set_markup(str_status) status_label.set_halign(Gtk.Align.START) status_label.set_valign(Gtk.Align.START) status_label.set_line_wrap(True) self.table.attach(status_label, 3, self.current_row, 1, 1) if show_lock: lock_image = Gtk.Image() lock_image.set_from_icon_name("dialog-password", Gtk.IconSize.MENU) self.table.attach(lock_image, 4, self.current_row, 1, 1) self.current_row += 1 class NotificationAreaTooltip(StatusTable): """ Tooltip that is shown in the notification area """ def __init__(self): StatusTable.__init__(self) def fill_table_with_accounts(self, accounts): iconset = app.config.get('iconset') if not iconset: iconset = 'dcraven' file_path = os.path.join(helpers.get_iconset_path(iconset), '16x16') for acct in accounts: message = acct['message'] message = helpers.reduce_chars_newlines(message, 100, 1) message = GLib.markup_escape_text(message) if acct['name'] in app.con_types and \ app.con_types[acct['name']] in ('tls', 'ssl'): show_lock = True else: show_lock = False if message: self.add_status_row(file_path, acct['show'], GLib.markup_escape_text(acct['name']) + ' - ' + message, show_lock=show_lock, indent=False) else: self.add_status_row(file_path, acct['show'], GLib.markup_escape_text(acct['name']), show_lock=show_lock, indent=False) for line in acct['event_lines']: self.add_text_row(' ' + line, 1) def get_tooltip(self): self.create_table() accounts = helpers.get_notification_icon_tooltip_dict() self.fill_table_with_accounts(accounts) self.hbox = Gtk.HBox() self.table.set_property('column-spacing', 1) self.hbox.add(self.table) self.hbox.show_all() return self.hbox class GCTooltip(): # pylint: disable=E1101 def __init__(self): self.contact = None self.xml = gtkgui_helpers.get_gtk_builder('tooltip_gc_contact.ui') for name in ('nick', 'status', 'jid', 'user_show', 'fillelement', 'resource', 'affiliation', 'avatar', 'resource_label', 'jid_label', 'tooltip_grid'): setattr(self, name, self.xml.get_object(name)) def clear_tooltip(self): self.contact = None def get_tooltip(self, contact): if self.contact == contact: return True, self.tooltip_grid self._populate_grid(contact) self.contact = contact return False, self.tooltip_grid def _hide_grid_childs(self): """ Hide all Elements of the Tooltip Grid """ for child in self.tooltip_grid.get_children(): child.hide() def _populate_grid(self, contact): """ Populate the Tooltip Grid with data of from the contact """ self._hide_grid_childs() self.nick.set_text(contact.get_shown_name()) self.nick.show() # Status Message if contact.status: status = contact.status.strip() if status != '': self.status.set_text(status) self.status.show() # Status show = helpers.get_uf_show(contact.show) self.user_show.set_markup(colorize_status(show)) self.user_show.show() # JID if contact.jid.strip(): self.jid.set_text(contact.jid) self.jid.show() self.jid_label.show() # Resource if hasattr(contact, 'resource') and contact.resource.strip(): self.resource.set_text(contact.resource) self.resource.show() self.resource_label.show() # Affiliation if contact.affiliation != 'none': uf_affiliation = helpers.get_uf_affiliation(contact.affiliation) uf_affiliation = \ _('%(owner_or_admin_or_member)s of this group chat') \ % {'owner_or_admin_or_member': uf_affiliation} uf_affiliation = self.colorize_affiliation(uf_affiliation) self.affiliation.set_markup(uf_affiliation) self.affiliation.show() # Avatar if contact.avatar_sha is not None: app.log('avatar').debug( 'Load GCTooltip: %s %s', contact.name, contact.avatar_sha) scale = self.tooltip_grid.get_scale_factor() surface = app.interface.get_avatar( contact.avatar_sha, AvatarSize.TOOLTIP, scale) if surface is not None: self.avatar.set_from_surface(surface) self.avatar.show() self.fillelement.show() app.plugin_manager.gui_extension_point( 'gc_tooltip_populate', self, contact, self.tooltip_grid) @staticmethod def colorize_affiliation(affiliation): """ Color the affiliation of a MUC participant inside the tooltip by it's semantics. Color palette is the Tango. """ formatted = "%s" color = None if affiliation.startswith(Q_("?Group Chat Contact Affiliation:None")): color = app.config.get('tooltip_affiliation_none_color') elif affiliation.startswith(_("Member")): color = app.config.get('tooltip_affiliation_member_color') elif affiliation.startswith(_("Administrator")): color = app.config.get('tooltip_affiliation_administrator_color') elif affiliation.startswith(_("Owner")): color = app.config.get('tooltip_affiliation_owner_color') if color: affiliation = formatted % (color, affiliation) return affiliation class RosterTooltip(Gtk.Window, StatusTable): # pylint: disable=E1101 def __init__(self, parent): Gtk.Window.__init__(self, type=Gtk.WindowType.POPUP, transient_for=parent) StatusTable.__init__(self) self.create_table() self.row = None self.contact_jid = None self.last_widget = None self.num_resources = 0 self.set_title('tooltip') self.set_border_width(3) self.set_resizable(False) self.set_name('gtk-tooltips') self.set_type_hint(Gdk.WindowTypeHint.TOOLTIP) self.xml = gtkgui_helpers.get_gtk_builder('tooltip_roster_contact.ui') for name in ('name', 'status', 'jid', 'user_show', 'fillelement', 'resource', 'avatar', 'resource_label', 'pgp', 'pgp_label', 'jid_label', 'tooltip_grid', 'idle_since', 'idle_since_label', 'mood', 'tune', 'activity', 'location', 'tune_label', 'location_label', 'activity_label', 'mood_label', 'sub_label', 'sub', 'status_label'): setattr(self, name, self.xml.get_object(name)) self.add(self.tooltip_grid) self.tooltip_grid.show() def clear_tooltip(self): """ Hide all Elements of the Tooltip Grid """ for child in self.tooltip_grid.get_children(): child.hide() status_table = self.tooltip_grid.get_child_at(0, 3) if status_table: status_table.destroy() self.create_table() def fill_table_with_accounts(self, accounts): iconset = app.config.get('iconset') if not iconset: iconset = 'dcraven' file_path = os.path.join(helpers.get_iconset_path(iconset), '16x16') for acct in accounts: message = acct['message'] message = helpers.reduce_chars_newlines(message, 100, 1) message = GLib.markup_escape_text(message) if acct['name'] in app.con_types and \ app.con_types[acct['name']] in ('tls', 'ssl'): show_lock = True else: show_lock = False if message: self.add_status_row(file_path, acct['show'], GLib.markup_escape_text(acct['name']) + ' - ' + message, show_lock=show_lock, indent=False) else: self.add_status_row(file_path, acct['show'], GLib.markup_escape_text(acct['name']), show_lock=show_lock, indent=False) for line in acct['event_lines']: self.add_text_row(' ' + line, 1) def populate(self, contacts, account, typ): """ Populate the Tooltip Grid with data of from the contact """ self.current_row = 0 self.account = account if self.last_widget: self.last_widget.set_vexpand(False) self.clear_tooltip() if account == 'all': # Tooltip for merged accounts row accounts = helpers.get_notification_icon_tooltip_dict() self.spacer_label = '' self.fill_table_with_accounts(accounts) self.tooltip_grid.attach(self.table, 0, 3, 2, 1) self.table.show_all() return if typ == 'account': jid = app.get_jid_from_account(account) contacts = [] connection = app.connections[account] # get our current contact info nbr_on, nbr_total = app.\ contacts.get_nb_online_total_contacts( accounts=[account]) account_name = account if app.account_is_connected(account): account_name += ' (%s/%s)' % (repr(nbr_on), repr(nbr_total)) contact = app.contacts.create_self_contact(jid=jid, account=account, name=account_name, show=connection.get_status(), status=connection.status, resource=connection.server_resource, priority=connection.priority) if app.connections[account].gpg: contact.keyID = app.config.get_per('accounts', connection.name, 'keyid') contacts.append(contact) # if we're online ... if connection.connection: roster = connection.connection.getRoster() # in threadless connection when no roster stanza is sent # 'roster' is None if roster and roster.getItem(jid): resources = roster.getResources(jid) # ...get the contact info for our other online # resources for resource in resources: # Check if we already have this resource found = False for contact_ in contacts: if contact_.resource == resource: found = True break if found: continue show = roster.getShow(jid + '/' + resource) if not show: show = 'online' contact = app.contacts.create_self_contact( jid=jid, account=account, show=show, status=roster.getStatus( jid + '/' + resource), priority=roster.getPriority( jid + '/' + resource), resource=resource) contacts.append(contact) # Username/Account/Groupchat self.prim_contact = app.contacts.get_highest_prio_contact_from_contacts( contacts) if self.prim_contact is None: log.error('No contact for Roster tooltip found') log.error('contacts: %s, typ: %s, account: %s', contacts, typ, account) return self.contact_jid = self.prim_contact.jid name = GLib.markup_escape_text(self.prim_contact.get_shown_name()) name_markup = '{}'.format(name) if app.config.get('mergeaccounts'): color = app.config.get('tooltip_account_name_color') account_name = GLib.markup_escape_text(self.prim_contact.account.name) name_markup += " ({})".format( color, account_name) if account and helpers.jid_is_blocked(account, self.prim_contact.jid): name_markup += _(' [blocked]') try: if self.prim_contact.jid in app.interface.minimized_controls[account]: name_markup += _(' [minimized]') except KeyError: pass self.name.set_markup(name_markup) self.name.show() self.num_resources = 0 # put contacts in dict, where key is priority contacts_dict = {} for contact in contacts: if contact.resource: self.num_resources += 1 priority = int(contact.priority) if priority in contacts_dict: contacts_dict[priority].append(contact) else: contacts_dict[priority] = [contact] if self.num_resources > 1: self.status_label.show() transport = app.get_transport_name_from_jid(self.prim_contact.jid) if transport: file_path = os.path.join(helpers.get_transport_path(transport), '16x16') else: iconset = app.config.get('iconset') if not iconset: iconset = 'dcraven' file_path = os.path.join(helpers.get_iconset_path(iconset), '16x16') contact_keys = sorted(contacts_dict.keys()) contact_keys.reverse() for priority in contact_keys: for acontact in contacts_dict[priority]: icon_name = self._get_icon_name_for_tooltip(acontact) if acontact.status and len(acontact.status) > 25: status = '' add_text = True else: status = acontact.status add_text = False status_line = self.get_status_info(acontact.resource, acontact.priority, acontact.show, status) self.add_status_row(file_path, icon_name, status_line) if add_text: self.add_text_row(acontact.status, 2) self.tooltip_grid.attach(self.table, 0, 3, 2, 1) self.table.show_all() else: # only one resource if contact.show and contact.status: status = contact.status.strip() if status: self.status.set_text(status) self.status.show() self.status_label.show() # PEP Info self._append_pep_info(contact) # JID self.jid.set_text(self.prim_contact.jid) self.jid.show() self.jid_label.show() # contact has only one ressource if self.num_resources == 1 and contact.resource: res = GLib.markup_escape_text(contact.resource) prio = str(contact.priority) self.resource.set_text("{} ({})".format(res, prio)) self.resource.show() self.resource_label.show() if self.prim_contact.jid not in app.gc_connected[account]: if (account and self.prim_contact.sub and self.prim_contact.sub != 'both'): # ('both' is the normal sub so we don't show it) self.sub.set_text(helpers.get_uf_sub(self.prim_contact.sub)) self.sub.show() self.sub_label.show() if self.prim_contact.keyID: keyID = None if len(self.prim_contact.keyID) == 8: keyID = self.prim_contact.keyID elif len(self.prim_contact.keyID) == 16: keyID = self.prim_contact.keyID[8:] if keyID: self.pgp.set_text(keyID) self.pgp.show() self.pgp_label.show() self._set_idle_time(contact) # Avatar scale = self.get_scale_factor() surface = app.contacts.get_avatar( account, self.prim_contact.jid, AvatarSize.TOOLTIP, scale) if surface is None: return self.avatar.set_from_surface(surface) self.avatar.show() app.plugin_manager.gui_extension_point( 'roster_tooltip_populate', self, contacts, self.tooltip_grid) # Sets the Widget that is at the bottom to expand. # This is needed in case the Picture takes more Space then the Labels i = 1 while i < 15: if self.tooltip_grid.get_child_at(0, i): if self.tooltip_grid.get_child_at(0, i).get_visible(): self.last_widget = self.tooltip_grid.get_child_at(0, i) i += 1 self.last_widget.set_vexpand(True) def _append_pep_info(self, contact): """ Append Tune, Mood, Activity, Location information of the specified contact to the given property list. """ if 'mood' in contact.pep: mood = contact.pep['mood'].asMarkupText() self.mood.set_markup(mood) self.mood.show() self.mood_label.show() if 'activity' in contact.pep: activity = contact.pep['activity'].asMarkupText() self.activity.set_markup(activity) self.activity.show() self.activity_label.show() if 'tune' in contact.pep: tune = contact.pep['tune'].asMarkupText() self.tune.set_markup(tune) self.tune.show() self.tune_label.show() if 'location' in contact.pep: location = contact.pep['location'].asMarkupText() self.location.set_markup(location) self.location.show() self.location_label.show() def _set_idle_time(self, contact): if contact.idle_time: idle_color = app.config.get('tooltip_idle_color') idle_time = contact.idle_time idle_time = time.localtime(contact.idle_time) idle_time = datetime(*(idle_time[:6])) current = datetime.now() if idle_time.date() == current.date(): formatted = idle_time.strftime("%X") else: formatted = idle_time.strftime("%c") idle_markup = "{}".format(idle_color, formatted) self.idle_since.set_markup(idle_markup) self.idle_since.show() self.idle_since_label.show() if contact.show and self.num_resources < 2: show = helpers.get_uf_show(contact.show) # Contact is Groupchat if (self.account and self.prim_contact.jid in app.gc_connected[self.account]): if app.gc_connected[self.account][self.prim_contact.jid]: show = _('Connected') else: show = _('Disconnected') self.user_show.set_markup(colorize_status(show)) self.user_show.show() def _get_icon_name_for_tooltip(self, contact): """ Helper function used for tooltip contacts/acounts Tooltip on account has fake contact with sub == '', in this case we show real status of the account """ if contact.ask == 'subscribe': return 'requested' elif contact.sub in ('both', 'to', ''): return contact.show return 'not in roster' class FileTransfersTooltip(): def __init__(self): self.sid = None self.widget = None def clear_tooltip(self): self.sid = None self.widget = None def get_tooltip(self, file_props, sid): if self.sid == sid: return True, self.widget self.widget = self._create_tooltip(file_props, sid) self.sid = sid return False, self.widget @staticmethod def _create_tooltip(file_props, sid): ft_table = Gtk.Table(2, 1) ft_table.set_property('column-spacing', 2) current_row = 1 properties = [] name = file_props.name if file_props.type_ == 'r': file_name = os.path.split(file_props.file_name)[1] else: file_name = file_props.name properties.append((_('Name: '), GLib.markup_escape_text(file_name))) if file_props.type_ == 'r': type_ = Q_('?Noun:Download') actor = _('Sender: ') sender = file_props.sender.split('/')[0] name = app.contacts.get_first_contact_from_jid( file_props.tt_account, sender).get_shown_name() else: type_ = Q_('?Noun:Upload') actor = _('Recipient: ') receiver = file_props.receiver if hasattr(receiver, 'name'): name = receiver.get_shown_name() else: name = receiver.split('/')[0] properties.append((_('Type: '), type_)) properties.append((actor, GLib.markup_escape_text(name))) transfered_len = file_props.received_len if not transfered_len: transfered_len = 0 properties.append((_('Transferred: '), helpers.convert_bytes(transfered_len))) status = '' if file_props.started: status = _('Not started') if file_props.stopped: status = _('Stopped') elif file_props.completed: status = _('Completed') elif not file_props.connected: if file_props.completed: status = _('Completed') else: if file_props.paused: status = Q_('?transfer status:Paused') elif file_props.stalled: # stalled is not paused. it is like 'frozen' it stopped alone status = _('Stalled') else: status = _('Transferring') else: status = _('Not started') properties.append((_('Status: '), status)) file_desc = file_props.desc or '' properties.append((_('Description: '), GLib.markup_escape_text( file_desc))) while properties: property_ = properties.pop(0) current_row += 1 label = Gtk.Label() label.set_halign(Gtk.Align.START) label.set_valign(Gtk.Align.START) label.set_markup(property_[0]) ft_table.attach(label, 1, 2, current_row, current_row + 1, Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL, 0, 0) label = Gtk.Label() label.set_halign(Gtk.Align.START) label.set_valign(Gtk.Align.START) label.set_line_wrap(True) label.set_markup(property_[1]) ft_table.attach(label, 2, 3, current_row, current_row + 1, Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL, 0, 0) ft_table.show_all() return ft_table def colorize_status(status): """ Colorize the status message inside the tooltip by it's semantics. Color palette is the Tango. """ formatted = "%s" color = None if status.startswith(Q_("?user status:Available")): color = app.config.get('tooltip_status_online_color') elif status.startswith(_("Free for Chat")): color = app.config.get('tooltip_status_free_for_chat_color') elif status.startswith(_("Away")): color = app.config.get('tooltip_status_away_color') elif status.startswith(_("Busy")): color = app.config.get('tooltip_status_busy_color') elif status.startswith(_("Not Available")): color = app.config.get('tooltip_status_na_color') elif status.startswith(_("Offline")): color = app.config.get('tooltip_status_offline_color') if color: status = formatted % (color, status) return status gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/gajim/vcard.py000066400000000000000000000614561326020644600234570ustar00rootroot00000000000000# -*- coding:utf-8 -*- ## src/vcard.py ## ## Copyright (C) 2003-2014 Yann Leboulanger ## Copyright (C) 2005 Vincent Hanquez ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2006 Junglecow J ## Dimitur Kirov ## Travis Shirk ## Stefan Bethge ## Copyright (C) 2006-2008 Jean-Marie Traissard ## Copyright (C) 2007 Lukas Petrovicky ## Copyright (C) 2008 Brendan Taylor ## Jonathan Schleifer ## Stephan Erb ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## # THIS FILE IS FOR **OTHERS'** PROFILE (when we VIEW their INFO) from gi.repository import Gtk from gi.repository import GLib from gi.repository import Gdk from gi.repository import GdkPixbuf import base64 import binascii import os from gajim import gtkgui_helpers from gajim.common import helpers from gajim.common import app from gajim.common import ged from gajim.common.i18n import Q_ from gajim.common.const import AvatarSize # log = logging.getLogger('gajim.vcard') class VcardWindow: """ Class for contact's information window """ def __init__(self, contact, account, gc_contact = None): # the contact variable is the jid if vcard is true self.xml = gtkgui_helpers.get_gtk_builder('vcard_information_window.ui') self.window = self.xml.get_object('vcard_information_window') self.progressbar = self.xml.get_object('progressbar') self.contact = contact self.account = account self.gc_contact = gc_contact self.avatar = None # Get real jid if gc_contact: # Don't use real jid if room is (semi-)anonymous gc_control = app.interface.msg_win_mgr.get_gc_control( gc_contact.room_jid, account) if gc_contact.jid and not gc_control.is_anonymous: self.real_jid = gc_contact.jid self.real_jid_for_vcard = gc_contact.jid if gc_contact.resource: self.real_jid += '/' + gc_contact.resource else: self.real_jid = gc_contact.get_full_jid() self.real_jid_for_vcard = self.real_jid self.real_resource = gc_contact.name else: self.real_jid = contact.get_full_jid() self.real_resource = contact.resource puny_jid = helpers.sanitize_filename(contact.jid) local_avatar_basepath = os.path.join(app.AVATAR_PATH, puny_jid) + \ '_local' for extension in ('.png', '.jpeg'): local_avatar_path = local_avatar_basepath + extension if os.path.isfile(local_avatar_path): image = self.xml.get_object('custom_avatar_image') image.set_from_file(local_avatar_path) image.show() self.xml.get_object('custom_avatar_label').show() break self.vcard_arrived = False self.os_info_arrived = False self.entity_time_arrived = False self.time = 0 self.update_intervall = 100 # Milliseconds self.update_progressbar_timeout_id = GLib.timeout_add(self.update_intervall, self.update_progressbar) app.ged.register_event_handler('version-result-received', ged.GUI1, self.set_os_info) app.ged.register_event_handler('time-result-received', ged.GUI1, self.set_entity_time) self.fill_jabber_page() annotations = app.connections[self.account].annotations if self.contact.jid in annotations: buffer_ = self.xml.get_object('textview_annotation').get_buffer() buffer_.set_text(annotations[self.contact.jid]) for widget_name in ('URL_label', 'EMAIL_WORK_USERID_label', 'EMAIL_HOME_USERID_label'): widget = self.xml.get_object(widget_name) widget.hide() self.xml.connect_signals(self) self.xml.get_object('close_button').grab_focus() self.window.show_all() def update_progressbar(self): self.progressbar.pulse() self.time += self.update_intervall # Timeout in Milliseconds if (self.vcard_arrived and self.os_info_arrived and self.entity_time_arrived) or self.time == 10000: self.progressbar.hide() self.update_progressbar_timeout_id = None return False return True def on_vcard_information_window_destroy(self, widget): if self.update_progressbar_timeout_id is not None: GLib.source_remove(self.update_progressbar_timeout_id) del app.interface.instances[self.account]['infos'][self.contact.jid] buffer_ = self.xml.get_object('textview_annotation').get_buffer() annotation = buffer_.get_text(buffer_.get_start_iter(), buffer_.get_end_iter(), True) connection = app.connections[self.account] if annotation != connection.annotations.get(self.contact.jid, ''): connection.annotations[self.contact.jid] = annotation connection.store_annotations() app.ged.remove_event_handler('version-result-received', ged.GUI1, self.set_os_info) app.ged.remove_event_handler('time-result-received', ged.GUI1, self.set_entity_time) def on_vcard_information_window_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.window.destroy() def on_information_notebook_switch_page(self, widget, page, page_num): GLib.idle_add(self.xml.get_object('close_button').grab_focus) def on_PHOTO_eventbox_button_press_event(self, widget, event): """ If right-clicked, show popup """ if event.button == 3: # right click menu = Gtk.Menu() menuitem = Gtk.MenuItem.new_with_mnemonic(_('Save _As')) if self.gc_contact: sha = self.gc_contact.avatar_sha name = self.gc_contact.get_shown_name() else: sha = app.contacts.get_avatar_sha( self.account, self.contact.jid) name = self.contact.get_shown_name() if sha is None: sha = self.avatar menuitem.connect('activate', gtkgui_helpers.on_avatar_save_as_menuitem_activate, sha, name) menu.append(menuitem) menu.connect('selection-done', lambda w:w.destroy()) # show the menu menu.show_all() menu.attach_to_widget(widget, None) menu.popup(None, None, None, None, event.button, event.time) def set_value(self, entry_name, value): try: widget = self.xml.get_object(entry_name) if entry_name in ('URL_label', 'EMAIL_WORK_USERID_label', 'EMAIL_HOME_USERID_label'): if entry_name == 'URL_label': widget.set_uri(value) else: widget.set_uri('mailto:' + value) widget.set_label(value) self.xml.get_object(entry_name).show() else: val = widget.get_text() if val: value = val + ' / ' + value widget.set_text(value) except AttributeError: pass def _set_values(self, vcard, jid): for i in vcard.keys(): if i == 'PHOTO' and self.xml.get_object('information_notebook').\ get_n_pages() > 4: if 'BINVAL' not in vcard[i]: continue photo_encoded = vcard[i]['BINVAL'] if photo_encoded == '': continue try: photo_decoded = base64.b64decode( photo_encoded.encode('utf-8')) except binascii.Error as error: app.log('avatar').warning('Invalid avatar for %s: %s', jid, error) continue pixbuf = gtkgui_helpers.get_pixbuf_from_data(photo_decoded) if pixbuf is None: continue pixbuf = pixbuf.scale_simple( AvatarSize.PROFILE, AvatarSize.PROFILE, GdkPixbuf.InterpType.BILINEAR) image = self.xml.get_object('PHOTO_image') image.set_from_pixbuf(pixbuf) image.show() self.avatar = pixbuf self.xml.get_object('user_avatar_label').show() continue if i in ('ADR', 'TEL', 'EMAIL'): for entry in vcard[i]: add_on = '_HOME' if 'WORK' in entry: add_on = '_WORK' for j in entry.keys(): self.set_value(i + add_on + '_' + j + '_label', entry[j]) if isinstance(vcard[i], dict): for j in vcard[i].keys(): self.set_value(i + '_' + j + '_label', vcard[i][j]) else: if i == 'DESC': self.xml.get_object('DESC_textview').get_buffer().set_text( vcard[i], len(vcard[i].encode('utf-8'))) elif i != 'jid': # Do not override jid_label self.set_value(i + '_label', vcard[i]) self.vcard_arrived = True def clear_values(self): for l in ('FN', 'NICKNAME', 'N_FAMILY', 'N_GIVEN', 'N_MIDDLE', 'N_PREFIX', 'N_SUFFIX', 'EMAIL_HOME_USERID', 'TEL_HOME_NUMBER', 'BDAY', 'ORG_ORGNAME', 'ORG_ORGUNIT', 'TITLE', 'ROLE', 'EMAIL_WORK_USERID', 'TEL_WORK_NUMBER', 'URL'): widget = self.xml.get_object(l + '_label') if l in ('EMAIL_HOME_USERID', 'EMAIL_WORK_USERID', 'URL'): widget.hide() else: widget.set_text('') for pref in ('ADR_HOME', 'ADR_WORK'): for l in ('STREET', 'EXTADR', 'LOCALITY', 'PCODE', 'REGION', 'CTRY'): widget = self.xml.get_object(pref + '_' + l + '_label') widget.set_text('') self.xml.get_object('DESC_textview').get_buffer().set_text('') def _nec_vcard_received(self, jid, resource, room, vcard): self.clear_values() self._set_values(vcard, jid) def set_os_info(self, obj): if obj.conn.name != self.account: return if self.xml.get_object('information_notebook').get_n_pages() < 5: return if self.gc_contact: if obj.fjid != self.contact.jid: return elif app.get_jid_without_resource(obj.fjid) != self.contact.jid: return i = 0 client = '' os = '' while i in self.os_info: if self.os_info[i]['resource'] == obj.resource: if obj.client_info: self.os_info[i]['client'] = obj.client_info else: self.os_info[i]['client'] = Q_('?Client:Unknown') if obj.os_info: self.os_info[i]['os'] = obj.os_info else: self.os_info[i]['os'] = Q_('?OS:Unknown') else: if not self.os_info[i]['client']: self.os_info[i]['client'] = Q_('?Client:Unknown') if not self.os_info[i]['os']: self.os_info[i]['os'] = Q_('?OS:Unknown') if i > 0: client += '\n' os += '\n' client += self.os_info[i]['client'] os += self.os_info[i]['os'] i += 1 self.xml.get_object('client_name_version_label').set_text(client) self.xml.get_object('os_label').set_text(os) self.os_info_arrived = True def set_entity_time(self, obj): if obj.conn.name != self.account: return if self.xml.get_object('information_notebook').get_n_pages() < 5: return if self.gc_contact: if obj.fjid != self.contact.jid: return elif app.get_jid_without_resource(obj.fjid) != self.contact.jid: return i = 0 time_s = '' while i in self.time_info: if self.time_info[i]['resource'] == obj.resource: if obj.time_info: self.time_info[i]['time'] = obj.time_info else: self.time_info[i]['time'] = Q_('?Time:Unknown') else: if not self.time_info[i]['time']: self.time_info[i]['time'] = Q_('?Time:Unknown') if i > 0: time_s += '\n' time_s += self.time_info[i]['time'] i += 1 self.xml.get_object('time_label').set_text(time_s) self.entity_time_arrived = True def fill_status_label(self): if self.xml.get_object('information_notebook').get_n_pages() < 5: return contact_list = app.contacts.get_contacts(self.account, self.contact.jid) connected_contact_list = [] for c in contact_list: if c.show not in ('offline', 'error'): connected_contact_list.append(c) if not connected_contact_list: # no connected contact, get the offline one connected_contact_list = contact_list # stats holds show and status message stats = '' if connected_contact_list: # Start with self.contact, as with resources stats = helpers.get_uf_show(self.contact.show) if self.contact.status: stats += ': ' + self.contact.status for c in connected_contact_list: if c.resource != self.contact.resource: stats += '\n' stats += helpers.get_uf_show(c.show) if c.status: stats += ': ' + c.status else: # Maybe gc_vcard ? stats = helpers.get_uf_show(self.contact.show) if self.contact.status: stats += ': ' + self.contact.status status_label = self.xml.get_object('status_label') status_label.set_text(stats) status_label.set_tooltip_text(stats) def fill_jabber_page(self): self.xml.get_object('nickname_label').set_markup( '' + self.contact.get_shown_name() + '') self.xml.get_object('jid_label').set_text(self.contact.jid) subscription_label = self.xml.get_object('subscription_label') ask_label = self.xml.get_object('ask_label') if self.gc_contact: self.xml.get_object('subscription_title_label').set_markup(Q_("?Role in Group Chat:Role:")) uf_role = helpers.get_uf_role(self.gc_contact.role) subscription_label.set_text(uf_role) self.xml.get_object('ask_title_label').set_markup(_("Affiliation:")) uf_affiliation = helpers.get_uf_affiliation(self.gc_contact.affiliation) ask_label.set_text(uf_affiliation) else: uf_sub = helpers.get_uf_sub(self.contact.sub) subscription_label.set_text(uf_sub) if self.contact.sub == 'from': tt_text = _("This contact is interested in your presence information, but you are not interested in their presence") elif self.contact.sub == 'to': tt_text = _("You are interested in the contact's presence information, but it is not mutual") elif self.contact.sub == 'both': tt_text = _("The contact and you want to exchange presence information") else: # None tt_text = _("You and the contact have a mutual disinterest in each-others presence information") subscription_label.set_tooltip_text(tt_text) uf_ask = helpers.get_uf_ask(self.contact.ask) ask_label.set_text(uf_ask) if self.contact.ask == 'subscribe': tt_text = _("You are waiting contact's answer about your subscription request") else: tt_text = _("There is no pending subscription request.") ask_label.set_tooltip_text(tt_text) resources = '%s (%s)' % (self.contact.resource, str( self.contact.priority)) uf_resources = self.contact.resource + _(' resource with priority ')\ + str(self.contact.priority) if not self.contact.status: self.contact.status = '' # do not wait for os_info if contact is not connected or has error # additional check for observer is needed, as show is offline for him if self.contact.show in ('offline', 'error')\ and not self.contact.is_observer(): self.os_info_arrived = True else: # Request os info if contact is connected if self.gc_contact: j, r = app.get_room_and_nick_from_fjid(self.real_jid) GLib.idle_add(app.connections[self.account].request_os_info, j, r, self.contact.jid) else: GLib.idle_add(app.connections[self.account].request_os_info, self.contact.jid, self.contact.resource) # do not wait for entity_time if contact is not connected or has error # additional check for observer is needed, as show is offline for him if self.contact.show in ('offline', 'error')\ and not self.contact.is_observer(): self.entity_time_arrived = True else: # Request entity time if contact is connected if self.gc_contact: j, r = app.get_room_and_nick_from_fjid(self.real_jid) GLib.idle_add(app.connections[self.account].\ request_entity_time, j, r, self.contact.jid) else: GLib.idle_add(app.connections[self.account].\ request_entity_time, self.contact.jid, self.contact.resource) self.os_info = {0: {'resource': self.real_resource, 'client': '', 'os': ''}} self.time_info = {0: {'resource': self.real_resource, 'time': ''}} i = 1 contact_list = app.contacts.get_contacts(self.account, self.contact.jid) if contact_list: for c in contact_list: if c.resource != self.contact.resource: resources += '\n%s (%s)' % (c.resource, str(c.priority)) uf_resources += '\n' + c.resource + \ _(' resource with priority ') + str(c.priority) if c.show not in ('offline', 'error'): GLib.idle_add(app.connections[self.account].\ request_os_info, c.jid, c.resource) GLib.idle_add(app.connections[self.account].\ request_entity_time, c.jid, c.resource) self.os_info[i] = {'resource': c.resource, 'client': '', 'os': ''} self.time_info[i] = {'resource': c.resource, 'time': ''} i += 1 self.xml.get_object('resource_prio_label').set_text(resources) resource_prio_label_eventbox = self.xml.get_object( 'resource_prio_label_eventbox') resource_prio_label_eventbox.set_tooltip_text(uf_resources) self.fill_status_label() con = app.connections[self.account] if self.gc_contact: con.request_vcard(self._nec_vcard_received, self.gc_contact.get_full_jid(), room=True) else: con.request_vcard(self._nec_vcard_received, self.contact.jid) def on_close_button_clicked(self, widget): self.window.destroy() class ZeroconfVcardWindow: def __init__(self, contact, account, is_fake = False): # the contact variable is the jid if vcard is true self.xml = gtkgui_helpers.get_gtk_builder('zeroconf_information_window.ui') self.window = self.xml.get_object('zeroconf_information_window') self.contact = contact self.account = account self.is_fake = is_fake self.fill_contact_page() self.fill_personal_page() self.xml.connect_signals(self) self.window.show_all() def on_zeroconf_information_window_destroy(self, widget): del app.interface.instances[self.account]['infos'][self.contact.jid] def on_zeroconf_information_window_key_press_event(self, widget, event): if event.keyval == Gdk.KEY_Escape: self.window.destroy() def on_PHOTO_eventbox_button_press_event(self, widget, event): """ If right-clicked, show popup """ if event.button == 3: # right click menu = Gtk.Menu() menuitem = Gtk.MenuItem.new_with_mnemonic(_('Save _As')) menuitem.connect('activate', gtkgui_helpers.on_avatar_save_as_menuitem_activate, self.contact.avatar_sha, self.contact.get_shown_name()) menu.append(menuitem) menu.connect('selection-done', lambda w:w.destroy()) # show the menu menu.show_all() menu.attach_to_widget(widget, None) menu.popup(None, None, None, None, event.button, event.time) def set_value(self, entry_name, value): try: if value and entry_name == 'URL_label': widget = Gtk.LinkButton(uri=value, label=value) widget.set_alignment(0, 0) table = self.xml.get_object('personal_info_table') table.attach(widget, 1, 3, 2, 1) else: self.xml.get_object(entry_name).set_text(value) except AttributeError: pass def fill_status_label(self): if self.xml.get_object('information_notebook').get_n_pages() < 2: return contact_list = app.contacts.get_contacts(self.account, self.contact.jid) # stats holds show and status message stats = '' one = True # Are we adding the first line ? if contact_list: for c in contact_list: if not one: stats += '\n' stats += helpers.get_uf_show(c.show) if c.status: stats += ': ' + c.status one = False else: # Maybe gc_vcard ? stats = helpers.get_uf_show(self.contact.show) if self.contact.status: stats += ': ' + self.contact.status status_label = self.xml.get_object('status_label') status_label.set_text(stats) status_label.set_tooltip_text(stats) def fill_contact_page(self): self.xml.get_object('nickname_label').set_markup( '' + self.contact.get_shown_name() + '') self.xml.get_object('local_jid_label').set_text(self.contact.jid) resources = '%s (%s)' % (self.contact.resource, str( self.contact.priority)) uf_resources = self.contact.resource + _(' resource with priority ')\ + str(self.contact.priority) if not self.contact.status: self.contact.status = '' self.xml.get_object('resource_prio_label').set_text(resources) resource_prio_label_eventbox = self.xml.get_object( 'resource_prio_label_eventbox') resource_prio_label_eventbox.set_tooltip_text(uf_resources) self.fill_status_label() def fill_personal_page(self): contact = app.connections[app.ZEROCONF_ACC_NAME].roster.getItem(self.contact.jid) for key in ('1st', 'last', 'jid', 'email'): if key not in contact['txt_dict']: contact['txt_dict'][key] = '' self.xml.get_object('first_name_label').set_text(contact['txt_dict']['1st']) self.xml.get_object('last_name_label').set_text(contact['txt_dict']['last']) self.xml.get_object('jabber_id_label').set_text(contact['txt_dict']['jid']) self.xml.get_object('email_label').set_text(contact['txt_dict']['email']) def on_close_button_clicked(self, widget): self.window.destroy() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/launch.py000077500000000000000000000000751326020644600225340ustar00rootroot00000000000000#!/usr/bin/env python3 from gajim import gajim gajim.main() gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/org.gajim.Gajim.json000066400000000000000000000330001326020644600244750ustar00rootroot00000000000000{ "app-id": "org.gajim.Gajim", "runtime": "org.gnome.Platform", "runtime-version": "3.26", "sdk": "org.gnome.Sdk", "command": "gajim", "finish-args": [ /* X11 + XShm access */ "--share=ipc", "--socket=x11", /* Wayland access */ "--socket=wayland", /* Needs to talk to the network: */ "--share=network", "--filesystem=home", "--socket=system-bus" ], "build-options": { "cflags": "-O2 -g", "cxxflags": "-O2 -g" }, "cleanup": [ "/include", "/lib/debug", "/lib/pkgconfig", "/share/aclocal", "/share/doc", "/share/man", "*.a", "*.la" ], "modules": [ { "name": "python3-pycparser", "buildsystem": "simple", "build-commands": [ "python3 setup.py install --prefix=/app" ], "sources": [ { "type": "archive", "url": "https://pypi.python.org/packages/8c/2d/aad7f16146f4197a11f8e91fb81df177adcc2073d36a17b1491fd09df6ed/pycparser-2.18.tar.gz", "sha256": "99a8ca03e29851d96616ad0404b4aad7d9ee16f25c9f9708a11faf2810f7b226" } ] }, { "name": "python3-cffi", "buildsystem": "simple", "build-commands": [ "python3 setup.py install --prefix=/app" ], "sources": [ { "type": "archive", "url": "https://files.pythonhosted.org/packages/10/f7/3b302ff34045f25065091d40e074479d6893882faef135c96f181a57ed06/cffi-1.11.4.tar.gz", "sha256": "df9083a992b17a28cd4251a3f5c879e0198bb26c9e808c4647e0a18739f1d11d" } ] }, { "name": "python3-six", "buildsystem": "simple", "build-commands": [ "pip3 install --prefix=/app six-1.11.0-py2.py3-none-any.whl" ], "sources": [ { "type": "file", "url": "https://pypi.python.org/packages/67/4b/141a581104b1f6397bfa78ac9d43d8ad29a7ca43ea90a2d863fe3056e86a/six-1.11.0-py2.py3-none-any.whl", "sha256": "832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb" } ] }, { "name": "python3-pyparsing", "buildsystem": "simple", "build-commands": [ "pip3 install --prefix=/app pyparsing-2.2.0-py2.py3-none-any.whl" ], "sources": [ { "type": "file", "url": "https://pypi.python.org/packages/6a/8a/718fd7d3458f9fab8e67186b00abdd345b639976bc7fb3ae722e1b026a50/pyparsing-2.2.0-py2.py3-none-any.whl", "sha256": "fee43f17a9c4087e7ed1605bd6df994c6173c1e977d7ade7b651292fab2bd010" } ] }, { "name": "python3-packaging", "buildsystem": "simple", "build-commands": [ "pip3 install --prefix=/app packaging-16.8-py2.py3-none-any.whl" ], "sources": [ { "type": "file", "url": "https://pypi.python.org/packages/87/1b/c39b7c65b5612812b83d6cab7ef2885eac9f6beb0b7b8a7071a186aea3b1/packaging-16.8-py2.py3-none-any.whl", "sha256": "99276dc6e3a7851f32027a68f1095cd3f77c148091b092ea867a351811cfe388" } ] }, { "name": "python3-appdirs", "buildsystem": "simple", "build-commands": [ "pip3 install --prefix=/app appdirs-1.4.3-py2.py3-none-any.whl" ], "sources": [ { "type": "file", "url": "https://pypi.python.org/packages/56/eb/810e700ed1349edde4cbdc1b2a21e28cdf115f9faf263f6bbf8447c1abf3/appdirs-1.4.3-py2.py3-none-any.whl", "sha256": "d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e" } ] }, { "name": "python3-setuptools", "ensure-writable": [ "easy-install.pth", "setuptools.pth" ], "buildsystem": "simple", "build-commands": [ "python3 setup.py install --prefix=/app" ], "sources": [ { "type": "archive", "url": "https://files.pythonhosted.org/packages/6c/54/f7e9cea6897636a04e74c3954f0d8335cc38f7d01e27eec98026b049a300/setuptools-38.5.1.zip", "sha256": "6425484c08e99a98a42209c25c3d325f749230b55284d66192784f941a7e6628" } ] }, { "name": "python3-asn1crypto", "buildsystem": "simple", "build-commands": [ "pip3 install --prefix=/app asn1crypto-0.24.0-py2.py3-none-any.whl" ], "sources": [ { "type": "file", "url": "https://pypi.python.org/packages/ea/cd/35485615f45f30a510576f1a56d1e0a7ad7bd8ab5ed7cdc600ef7cd06222/asn1crypto-0.24.0-py2.py3-none-any.whl", "sha256": "2f1adbb7546ed199e3c90ef23ec95c5cf3585bac7d11fb7eb562a3fe89c64e87" } ] }, { "name": "python3-idna", "buildsystem": "simple", "build-commands": [ "pip3 install --prefix=/app idna-2.6-py2.py3-none-any.whl" ], "sources": [ { "type": "file", "url": "https://pypi.python.org/packages/27/cc/6dd9a3869f15c2edfab863b992838277279ce92663d334df9ecf5106f5c6/idna-2.6-py2.py3-none-any.whl", "sha256": "8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4" } ] }, { "name": "python3-cryptography", "ensure-writable": [ "easy-install.pth" ], "buildsystem": "simple", "build-commands": [ "python3 setup.py install --prefix=/app" ], "sources": [ { "type": "archive", "url": "https://pypi.python.org/packages/78/c5/7188f15a92413096c93053d5304718e1f6ba88b818357d05d19250ebff85/cryptography-2.1.4.tar.gz", "sha256": "e4d967371c5b6b2e67855066471d844c5d52d210c36c28d49a8507b96e2c5291" } ] }, { "name": "python3-pyopenssl", "buildsystem": "simple", "build-commands": [ "pip3 install --prefix=/app pyOpenSSL-17.5.0-py2.py3-none-any.whl" ], "sources": [ { "type": "file", "url": "https://pypi.python.org/packages/79/db/7c0cfe4aa8341a5fab4638952520d8db6ab85ff84505e12c00ea311c3516/pyOpenSSL-17.5.0-py2.py3-none-any.whl", "sha256": "07a2de1a54de07448732a81e38a55df7da109b2f47f599f8bb35b0cbec69d4bd" } ] }, { "name": "python3-pyasn1", "buildsystem": "simple", "build-commands": [ "pip3 install --prefix=/app pyasn1-0.4.2-py2.py3-none-any.whl" ], "sources": [ { "type": "file", "url": "https://pypi.python.org/packages/ba/fe/02e3e2ee243966b143657fb8bd6bc97595841163b6d8c26820944acaec4d/pyasn1-0.4.2-py2.py3-none-any.whl", "sha256": "d5cd6ed995dba16fad0c521cfe31cd2d68400b53fcc2bce93326829be73ab6d1" } ] }, { "name": "python3-dbus-python", "sources": [ { "type": "archive", "url": "https://pypi.python.org/packages/ad/1b/76adc363212c642cabbf9329457a918308c0b9b5d38ce04d541a67255174/dbus-python-1.2.4.tar.gz", "sha256": "e2f1d6871f74fba23652e51d10873e54f71adab0525833c19bad9e99b1b2f9cc" } ] }, /* ESession support */ { "name": "python3-pycrypto", "buildsystem": "simple", "build-commands": [ "python3 setup.py install --prefix=/app" ], "sources": [ { "type": "archive", "url": "https://pypi.python.org/packages/60/db/645aa9af249f059cc3a368b118de33889219e0362141e75d4eaf6f80f163/pycrypto-2.6.1.tar.gz", "sha256": "f2ce1e989b272cfcb677616763e0a2e7ec659effa67a88aa92b3a65528f60a3c" }, { "type": "patch", "path": "flatpak/CVE-2013-7459.patch" } ] }, /* gnupg support */ { "name": "python3-python-gnupg", "buildsystem": "simple", "build-commands": [ "pip3 install --prefix=/app python_gnupg-0.4.1-py2.py3-none-any.whl" ], "sources": [ { "type": "file", "url": "https://pypi.python.org/packages/7a/f2/f655f52ff21457138d4a002aa0f67f1923cf682560b354cacecde1b2c767/python_gnupg-0.4.1-py2.py3-none-any.whl", "sha256": "1e4aa381bad3edbbdfcfb0ed0de73b26d6115f5090cdae9b5b6f6ff177a66aa7" } ] }, /* Zeroconf support */ { "name": "avahi", "cleanup": [ "/bin", "/lib/avahi", "/share" ], "config-opts": [ "--with-distro=none", "--disable-qt3", "--disable-qt4", "--disable-libdaemon", "--disable-pygtk", "--disable-gdbm", "--disable-mono", "--disable-monodoc", "--disable-manpages" ], "sources": [ { "type": "git", "url": "https://github.com/lathiat/avahi.git", "branch": "v0.7" } ] }, /* OMEMO support */ { "name": "protobuf", "ensure-writable": [ "easy-install.pth", "setuptools.pth" ], "buildsystem": "simple", "build-commands": [ "python3 setup.py install --prefix=/app" ], "sources": [ { "type": "archive", "url": "https://files.pythonhosted.org/packages/14/03/ff5279abda7b46e9538bfb1411d42831b7e65c460d73831ed2445649bc02/protobuf-3.5.1.tar.gz", "sha256": "95b78959572de7d7fafa3acb718ed71f482932ddddddbd29ba8319c10639d863" } ] }, { "name": "python3-axolotl-curve25519", "ensure-writable": [ "easy-install.pth" ], "buildsystem": "simple", "build-commands": [ "python3 setup.py install --prefix=/app" ], "sources": [ { "type": "archive", "url": "https://files.pythonhosted.org/packages/69/e0/9605cac4c83c12d0bef5c2e9992f0bcbce4fae9a252899d545ccb7dc8717/python-axolotl-curve25519-0.1.tar.gz", "sha256": "c559f6a5bf51e869325b36bd83c14cccd7dec1c6e7599e797f9ba27a72d339c0" } ] }, { "name": "python3-axolotl", "ensure-writable": [ "easy-install.pth", "setuptools.pth" ], "buildsystem": "simple", "build-commands": [ "python3 setup.py install --prefix=/app" ], "sources": [ { "type": "archive", "url": "https://files.pythonhosted.org/packages/7f/9d/410ce5c2322180cae7025e52e2f91f585d2be71f30ebbcfd605d2c9a1cd5/python-axolotl-0.1.39.tar.gz", "sha256": "9af9c937d0d05ebea414f1be79ecc7517cc3541a77101941e6a2a71bdd2b6e25" } ] }, { "name": "python3-nbxmpp", "buildsystem": "simple", "build-commands": [ "python3 setup.py install --prefix=/app" ], "sources": [ { "type": "git", "url": "https://dev.gajim.org/gajim/python-nbxmpp.git", "branch": "nbxmpp-0.6.4" } ] }, { "name": "gajim", "buildsystem": "simple", "build-commands": [ "pip3 install --prefix=/app ." ], "sources": [ { "type": "git", "url": "https://dev.gajim.org/gajim/gajim.git", "branch": "gajim_1.0" }, { "type": "archive", "url": "https://ftp.gajim.org/plugins_1/plugin_installer.zip", "sha256": "3b0c40b22596da54c0eea7f7571c83b61619996ebe6c00b304d7fa5278aaefbb", "dest": "gajim/data/plugins/plugin_installer" } ] } ] } gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/plugins/000077500000000000000000000000001326020644600223645ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/plugins/dbus_plugin/000077500000000000000000000000001326020644600246775ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/plugins/dbus_plugin/__init__.py000066400000000000000000000000371326020644600270100ustar00rootroot00000000000000from .plugin import DBusPlugin gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/plugins/dbus_plugin/dbus_plugin.png000066400000000000000000000041421326020644600277210ustar00rootroot00000000000000PNG  IHDR##$)IDATHǽWݏV?ڱıtgw2a?["$x$ <O}+< PVB!!Bv3Lݙٙl+qlljc;=<8Y*@(>>{{A"Xx|GB8&?*dqO󓫏ɟ(< TSCy۽K3Eu44jhc1x0k1Ȳ< DQ1 .B5Da)?ԏf [g7FEno]9H4M3ɤW3V3Wzlwm$$$L8ro~aAI=Jg>|lj Y,7;J/{7/))%qQiX %%]Yْ֔m[ˋg0 @Qq<RNo9zQĩu} $ bZq%qb))QѶJr$i8*"ʲ*+HK[淟'L!;C? 88)7BaamVe 0n{z$/ږFF hT32v@hT-Fgy!8w̯]zpc cN'"N4w—/J1FDKKH) #M0d1M4-ˉN1 ,"ڶCMiZ>WUUc89Qqc(&ڏs'{G;l_pCO,\IENDB`gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/plugins/dbus_plugin/manifest.ini000066400000000000000000000004031326020644600272030ustar00rootroot00000000000000[info] name: D-Bus Support short_name: dbus version: 0.1.1 description: D-Bus support. Based on remote_control module from Gajim core but uses new events handling system. authors = Mateusz Biliński homepage = http://blog.bilinski.it gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/plugins/dbus_plugin/plugin.py000066400000000000000000000773701326020644600265650ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## Copyright (C) 2005-2006 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2005-2006 Dimitur Kirov ## Copyright (C) 2005-2006 Andrew Sayman ## Copyright (C) 2007 Lukas Petrovicky ## Copyright (C) 2007 Julien Pivotto ## Copyright (C) 2007 Travis Shirk ## Copyright (C) 2008 Mateusz Biliński ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## ''' D-BUS Support plugin. Based on gajim/remote_control.py :author: Mateusz Biliński :since: 8th August 2008 :copyright: Copyright (2008) Mateusz Biliński :license: GPL ''' import os # import new # depricated in python3; use types instead import types import gobject from gajim.common import dbus_support if dbus_support.supported: import dbus if dbus_support: INTERFACE = 'org.gajim.dbusplugin.RemoteInterface' OBJ_PATH = '/org/gajim/dbusplugin/RemoteObject' SERVICE = 'org.gajim.dbusplugin' import dbus.service # type mapping # in most cases it is a utf-8 string DBUS_STRING = dbus.String # general type (for use in dicts, where all values should have the same type) DBUS_BOOLEAN = dbus.Boolean DBUS_DOUBLE = dbus.Double DBUS_INT32 = dbus.Int32 # dictionary with string key and binary value DBUS_DICT_SV = lambda : dbus.Dictionary({}, signature="sv") # dictionary with string key and value DBUS_DICT_SS = lambda : dbus.Dictionary({}, signature="ss") # empty type (there is no equivalent of None on D-Bus, but historically gajim # used 0 instead) DBUS_NONE = lambda : dbus.Int32(0) def get_dbus_struct(obj): ''' recursively go through all the items and replace them with their casted dbus equivalents ''' if obj is None: return DBUS_NONE() if isinstance(obj, (unicode, str)): return DBUS_STRING(obj) if isinstance(obj, int): return DBUS_INT32(obj) if isinstance(obj, float): return DBUS_DOUBLE(obj) if isinstance(obj, bool): return DBUS_BOOLEAN(obj) if isinstance(obj, (list, tuple)): result = dbus.Array([get_dbus_struct(i) for i in obj], signature='v') if result == []: return DBUS_NONE() return result if isinstance(obj, dict): result = DBUS_DICT_SV() for key, value in obj.items(): result[DBUS_STRING(key)] = get_dbus_struct(value) if result == {}: return DBUS_NONE() return result # unknown type return DBUS_NONE() class SignalObject(dbus.service.Object): ''' Local object definition for /org/gajim/dbus/RemoteObject. (This docstring is not be visible, because the clients can access only the remote object.)''' def __init__(self, bus_name): self.first_show = True self.vcard_account = None # register our dbus API dbus.service.Object.__init__(self, bus_name, OBJ_PATH) @dbus.service.signal(INTERFACE, signature='av') def Roster(self, account_and_data): pass @dbus.service.signal(INTERFACE, signature='av') def AccountPresence(self, status_and_account): pass @dbus.service.signal(INTERFACE, signature='av') def ContactPresence(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def ContactAbsence(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def ContactStatus(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def NewMessage(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def Subscribe(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def Subscribed(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def Unsubscribed(self, account_and_jid): pass @dbus.service.signal(INTERFACE, signature='av') def NewAccount(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def VcardInfo(self, account_and_vcard): pass @dbus.service.signal(INTERFACE, signature='av') def LastStatusTime(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def OsInfo(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def GCPresence(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def GCMessage(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def RosterInfo(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def NewGmail(self, account_and_array): pass @dbus.service.signal(INTERFACE, signature='av') def EntityTime(self, account_and_array): pass def raise_signal(self, signal, arg): '''raise a signal, with a single argument of unspecified type Instead of obj.raise_signal("Foo", bar), use obj.Foo(bar).''' getattr(self, signal)(arg) @dbus.service.method(INTERFACE, in_signature='s', out_signature='s') def get_status(self, account): '''Returns status (show to be exact) which is the global one unless account is given''' if not account: # If user did not ask for account, returns the global status return DBUS_STRING(helpers.get_global_show()) # return show for the given account index = gajim.connections[account].connected return DBUS_STRING(gajim.SHOW_LIST[index]) @dbus.service.method(INTERFACE, in_signature='s', out_signature='s') def get_status_message(self, account): '''Returns status which is the global one unless account is given''' if not account: # If user did not ask for account, returns the global status return DBUS_STRING(str(helpers.get_global_status())) # return show for the given account status = gajim.connections[account].status return DBUS_STRING(status) def _get_account_and_contact(self, account, jid): '''get the account (if not given) and contact instance from jid''' connected_account = None contact = None accounts = gajim.contacts.get_accounts() # if there is only one account in roster, take it as default # if user did not ask for account if not account and len(accounts) == 1: account = accounts[0] if account: if gajim.connections[account].connected > 1: # account is connected connected_account = account contact = gajim.contacts.get_contact_with_highest_priority(account, jid) else: for account in accounts: contact = gajim.contacts.get_contact_with_highest_priority(account, jid) if contact and gajim.connections[account].connected > 1: # account is connected connected_account = account break if not contact: contact = jid return connected_account, contact def _get_account_for_groupchat(self, account, room_jid): '''get the account which is connected to groupchat (if not given) or check if the given account is connected to the groupchat''' connected_account = None accounts = gajim.contacts.get_accounts() # if there is only one account in roster, take it as default # if user did not ask for account if not account and len(accounts) == 1: account = accounts[0] if account: if gajim.connections[account].connected > 1 and \ room_jid in gajim.gc_connected[account] and \ gajim.gc_connected[account][room_jid]: # account and groupchat are connected connected_account = account else: for account in accounts: if gajim.connections[account].connected > 1 and \ room_jid in gajim.gc_connected[account] and \ gajim.gc_connected[account][room_jid]: # account and groupchat are connected connected_account = account break return connected_account @dbus.service.method(INTERFACE, in_signature='sss', out_signature='b') def send_file(self, file_path, jid, account): '''send file, located at 'file_path' to 'jid', using account (optional) 'account' ''' jid = self._get_real_jid(jid, account) connected_account, contact = self._get_account_and_contact(account, jid) if connected_account: if file_path[:7] == 'file://': file_path=file_path[7:] if os.path.isfile(file_path): # is it file? gajim.interface.instances['file_transfers'].send_file( connected_account, contact, file_path) return DBUS_BOOLEAN(True) return DBUS_BOOLEAN(False) def _send_message(self, jid, message, keyID, account, type = 'chat', subject = None): '''can be called from send_chat_message (default when send_message) or send_single_message''' if not jid or not message: return DBUS_BOOLEAN(False) if not keyID: keyID = '' connected_account, contact = self._get_account_and_contact(account, jid) if connected_account: connection = gajim.connections[connected_account] connection.send_message(jid, message, keyID, type, subject) return DBUS_BOOLEAN(True) return DBUS_BOOLEAN(False) @dbus.service.method(INTERFACE, in_signature='ssss', out_signature='b') def send_chat_message(self, jid, message, keyID, account): '''Send chat 'message' to 'jid', using account (optional) 'account'. if keyID is specified, encrypt the message with the PGP key ''' jid = self._get_real_jid(jid, account) return self._send_message(jid, message, keyID, account) @dbus.service.method(INTERFACE, in_signature='sssss', out_signature='b') def send_single_message(self, jid, subject, message, keyID, account): '''Send single 'message' to 'jid', using account (optional) 'account'. if keyID is specified, encrypt the message with the PGP key ''' jid = self._get_real_jid(jid, account) return self._send_message(jid, message, keyID, account, type, subject) @dbus.service.method(INTERFACE, in_signature='sss', out_signature='b') def send_groupchat_message(self, room_jid, message, account): '''Send 'message' to groupchat 'room_jid', using account (optional) 'account'.''' if not room_jid or not message: return DBUS_BOOLEAN(False) connected_account = self._get_account_for_groupchat(account, room_jid) if connected_account: connection = gajim.connections[connected_account] connection.send_gc_message(room_jid, message) return DBUS_BOOLEAN(True) return DBUS_BOOLEAN(False) @dbus.service.method(INTERFACE, in_signature='ss', out_signature='b') def open_chat(self, jid, account): '''Shows the tabbed window for new message to 'jid', using account (optional) 'account' ''' if not jid: raise MissingArgument return DBUS_BOOLEAN(False) jid = self._get_real_jid(jid, account) try: jid = helpers.parse_jid(jid) except: # Jid is not conform, ignore it return DBUS_BOOLEAN(False) if account: accounts = [account] else: accounts = gajim.connections.keys() if len(accounts) == 1: account = accounts[0] connected_account = None first_connected_acct = None for acct in accounts: if gajim.connections[acct].connected > 1: # account is online contact = gajim.contacts.get_first_contact_from_jid(acct, jid) if gajim.interface.msg_win_mgr.has_window(jid, acct): connected_account = acct break # jid is in roster elif contact: connected_account = acct break # we send the message to jid not in roster, because account is # specified, or there is only one account elif account: connected_account = acct elif first_connected_acct is None: first_connected_acct = acct # if jid is not a conntact, open-chat with first connected account if connected_account is None and first_connected_acct: connected_account = first_connected_acct if connected_account: gajim.interface.new_chat_from_jid(connected_account, jid) # preserve the 'steal focus preservation' win = gajim.interface.msg_win_mgr.get_window(jid, connected_account).window if win.get_property('visible'): win.window.present() return DBUS_BOOLEAN(True) return DBUS_BOOLEAN(False) @dbus.service.method(INTERFACE, in_signature='sss', out_signature='b') def change_status(self, status, message, account): ''' change_status(status, message, account). account is optional - if not specified status is changed for all accounts. ''' if status not in ('offline', 'online', 'chat', 'away', 'xa', 'dnd', 'invisible'): return DBUS_BOOLEAN(False) if account: gobject.idle_add(gajim.interface.roster.send_status, account, status, message) else: # account not specified, so change the status of all accounts for acc in gajim.contacts.get_accounts(): if not gajim.config.get_per('accounts', acc, 'sync_with_global_status'): continue gobject.idle_add(gajim.interface.roster.send_status, acc, status, message) return DBUS_BOOLEAN(False) @dbus.service.method(INTERFACE, in_signature='', out_signature='') def show_next_pending_event(self): '''Show the window(s) with next pending event in tabbed/group chats.''' if gajim.events.get_nb_events(): gajim.interface.systray.handle_first_event() @dbus.service.method(INTERFACE, in_signature='', out_signature='as') def list_accounts(self): '''list register accounts''' result = gajim.contacts.get_accounts() result_array = dbus.Array([], signature='s') if result and len(result) > 0: for account in result: result_array.append(DBUS_STRING(account)) return result_array @dbus.service.method(INTERFACE, in_signature='s', out_signature='a{ss}') def account_info(self, account): '''show info on account: resource, jid, nick, prio, message''' result = DBUS_DICT_SS() if account in gajim.connections: # account is valid con = gajim.connections[account] index = con.connected result['status'] = DBUS_STRING(gajim.SHOW_LIST[index]) result['name'] = DBUS_STRING(con.name) result['jid'] = DBUS_STRING(gajim.get_jid_from_account(con.name)) result['message'] = DBUS_STRING(con.status) result['priority'] = DBUS_STRING(unicode(con.priority)) result['resource'] = DBUS_STRING(unicode(gajim.config.get_per( 'accounts', con.name, 'resource'))) return result @dbus.service.method(INTERFACE, in_signature='s', out_signature='aa{sv}') def list_contacts(self, account): '''list all contacts in the roster. If the first argument is specified, then return the contacts for the specified account''' result = dbus.Array([], signature='aa{sv}') accounts = gajim.contacts.get_accounts() if len(accounts) == 0: return result if account: accounts_to_search = [account] else: accounts_to_search = accounts for acct in accounts_to_search: if acct in accounts: for jid in gajim.contacts.get_jid_list(acct): item = self._contacts_as_dbus_structure( gajim.contacts.get_contacts(acct, jid)) if item: result.append(item) return result @dbus.service.method(INTERFACE, in_signature='', out_signature='') def toggle_roster_appearance(self): ''' shows/hides the roster window ''' win = gajim.interface.roster.window if win.get_property('visible'): gobject.idle_add(win.hide) else: win.present() # preserve the 'steal focus preservation' if self._is_first(): win.window.present() else: win.window.present_with_time(long(time())) @dbus.service.method(INTERFACE, in_signature='', out_signature='') def toggle_ipython(self): ''' shows/hides the ipython window ''' win = gajim.ipython_window if win: if win.window.is_visible(): gobject.idle_add(win.hide) else: win.show_all() win.present() else: gajim.interface.create_ipython_window() @dbus.service.method(INTERFACE, in_signature='', out_signature='a{ss}') def prefs_list(self): prefs_dict = DBUS_DICT_SS() def get_prefs(data, name, path, value): if value is None: return key = '' if path is not None: for node in path: key += node + '#' key += name prefs_dict[DBUS_STRING(key)] = DBUS_STRING(value) gajim.config.foreach(get_prefs) return prefs_dict @dbus.service.method(INTERFACE, in_signature='', out_signature='b') def prefs_store(self): try: gajim.interface.save_config() except Exception: return DBUS_BOOLEAN(False) return DBUS_BOOLEAN(True) @dbus.service.method(INTERFACE, in_signature='s', out_signature='b') def prefs_del(self, key): if not key: return DBUS_BOOLEAN(False) key_path = key.split('#', 2) if len(key_path) != 3: return DBUS_BOOLEAN(False) if key_path[2] == '*': gajim.config.del_per(key_path[0], key_path[1]) else: gajim.config.del_per(key_path[0], key_path[1], key_path[2]) return DBUS_BOOLEAN(True) @dbus.service.method(INTERFACE, in_signature='s', out_signature='b') def prefs_put(self, key): if not key: return DBUS_BOOLEAN(False) key_path = key.split('#', 2) if len(key_path) < 3: subname, value = key.split('=', 1) gajim.config.set(subname, value) return DBUS_BOOLEAN(True) subname, value = key_path[2].split('=', 1) gajim.config.set_per(key_path[0], key_path[1], subname, value) return DBUS_BOOLEAN(True) @dbus.service.method(INTERFACE, in_signature='ss', out_signature='b') def add_contact(self, jid, account): if account: if account in gajim.connections and \ gajim.connections[account].connected > 1: # if given account is active, use it AddNewContactWindow(account = account, jid = jid) else: # wrong account return DBUS_BOOLEAN(False) else: # if account is not given, show account combobox AddNewContactWindow(account = None, jid = jid) return DBUS_BOOLEAN(True) @dbus.service.method(INTERFACE, in_signature='ss', out_signature='b') def remove_contact(self, jid, account): jid = self._get_real_jid(jid, account) accounts = gajim.contacts.get_accounts() # if there is only one account in roster, take it as default if account: accounts = [account] contact_exists = False for account in accounts: contacts = gajim.contacts.get_contacts(account, jid) if contacts: gajim.connections[account].unsubscribe(jid) for contact in contacts: gajim.interface.roster.remove_contact(contact, account) gajim.contacts.remove_jid(account, jid) contact_exists = True return DBUS_BOOLEAN(contact_exists) def _is_first(self): if self.first_show: self.first_show = False return True return False def _get_real_jid(self, jid, account = None): '''get the real jid from the given one: removes xmpp: or get jid from nick if account is specified, search only in this account ''' if account: accounts = [account] else: accounts = gajim.connections.keys() if jid.startswith('xmpp:'): return jid[5:] # len('xmpp:') = 5 nick_in_roster = None # Is jid a nick ? for account in accounts: # Does jid exists in roster of one account ? if gajim.contacts.get_contacts(account, jid): return jid if not nick_in_roster: # look in all contact if one has jid as nick for jid_ in gajim.contacts.get_jid_list(account): c = gajim.contacts.get_contacts(account, jid_) if c[0].name == jid: nick_in_roster = jid_ break if nick_in_roster: # We have not found jid in roster, but we found is as a nick return nick_in_roster # We have not found it as jid nor as nick, probably a not in roster jid return jid def _contacts_as_dbus_structure(self, contacts): ''' get info from list of Contact objects and create dbus dict ''' if not contacts: return None prim_contact = None # primary contact for contact in contacts: if prim_contact is None or contact.priority > prim_contact.priority: prim_contact = contact contact_dict = DBUS_DICT_SV() contact_dict['name'] = DBUS_STRING(prim_contact.name) contact_dict['show'] = DBUS_STRING(prim_contact.show) contact_dict['jid'] = DBUS_STRING(prim_contact.jid) if prim_contact.keyID: keyID = None if len(prim_contact.keyID) == 8: keyID = prim_contact.keyID elif len(prim_contact.keyID) == 16: keyID = prim_contact.keyID[8:] if keyID: contact_dict['openPGP'] = keyID contact_dict['resources'] = dbus.Array([], signature='(sis)') for contact in contacts: resource_props = dbus.Struct((DBUS_STRING(contact.resource), dbus.Int32(contact.priority), DBUS_STRING(contact.status))) contact_dict['resources'].append(resource_props) contact_dict['groups'] = dbus.Array([], signature='(s)') for group in prim_contact.groups: contact_dict['groups'].append((DBUS_STRING(group),)) return contact_dict @dbus.service.method(INTERFACE, in_signature='', out_signature='s') def get_unread_msgs_number(self): return DBUS_STRING(str(gajim.events.get_nb_events())) @dbus.service.method(INTERFACE, in_signature='s', out_signature='b') def start_chat(self, account): if not account: # error is shown in gajim-remote check_arguments(..) return DBUS_BOOLEAN(False) app.app.activate_action('start-chat') return DBUS_BOOLEAN(True) @dbus.service.method(INTERFACE, in_signature='ss', out_signature='') def send_xml(self, xml, account): if account: gajim.connections[account].send_stanza(xml) else: for acc in gajim.contacts.get_accounts(): gajim.connections[acc].send_stanza(xml) @dbus.service.method(INTERFACE, in_signature='ssss', out_signature='') def join_room(self, room_jid, nick, password, account): if not account: # get the first connected account accounts = gajim.connections.keys() for acct in accounts: if gajim.account_is_connected(acct): account = acct break if not account: return if not nick: gajim.interface.join_gc_minimal(account, room_jid) else: gajim.interface.join_gc_room(account, room_jid, nick, password) from gajim.common import app from gajim.common import helpers from time import time from gajim.dialogs import AddNewContactWindow, JoinGroupchatWindow from gajim.plugins import GajimPlugin from gajim.plugins.helpers import log_calls, log from gajim.common import ged class DBusPlugin(GajimPlugin): @log_calls('DBusPlugin') def init(self): self.description = _('D-Bus support.' ' Based on remote_control module from' '\nGajim core but uses new events handling system.') self.config_dialog = None #self.gui_extension_points = {} #self.config_default_values = {} self.events_names = ['Roster', 'AccountPresence', 'ContactPresence', 'ContactAbsence', 'ContactStatus', 'NewMessage', 'Subscribe', 'Subscribed', 'Unsubscribed', 'NewAccount', 'VcardInfo', 'LastStatusTime', 'OsInfo', 'GCPresence', 'GCMessage', 'RosterInfo', 'NewGmail', 'EntityTime'] self.signal_object = None self.events_handlers = {} self._set_handling_methods() @log_calls('DBusPlugin') def activate(self): session_bus = dbus_support.session_bus.SessionBus() bus_name = dbus.service.BusName(SERVICE, bus=session_bus) self.signal_object = SignalObject(bus_name) @log_calls('DBusPlugin') def deactivate(self): self.signal_object.remove_from_connection() self.signal_object = None @log_calls('DBusPlugin') def _set_handling_methods(self): for event_name in self.events_names: setattr(self, event_name, types.MethodType( self._generate_handling_method(event_name), self)) self.events_handlers[event_name] = (ged.POSTCORE, getattr(self, event_name)) def _generate_handling_method(self, event_name): def handler(self, arg): #print "Handler of event %s called"%(event_name) if self.signal_object: getattr(self.signal_object, event_name)(get_dbus_struct(arg)) return handler gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/plugins/events_dump/000077500000000000000000000000001326020644600247155ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/plugins/events_dump/__init__.py000066400000000000000000000000451326020644600270250ustar00rootroot00000000000000from .plugin import EventsDumpPlugin gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/plugins/events_dump/manifest.ini000066400000000000000000000003161326020644600272240ustar00rootroot00000000000000[info] name: Events Dump short_name: events_dump version: 0.1 description: Dumps info about selected events to console. authors = Mateusz Biliński homepage = http://blog.bilinski.it gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/plugins/events_dump/plugin.py000066400000000000000000000116731326020644600265750ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## ''' Events Dump plugin. Dumps info about selected events to console. :author: Mateusz Biliński :since: 10th August 2008 :copyright: Copyright (2008) Mateusz Biliński :license: GPL ''' import types from pprint import pformat from gajim.plugins import GajimPlugin from gajim.plugins.helpers import log_calls, log from gajim.common import ged class EventsDumpPlugin(GajimPlugin): @log_calls('EventsDumpPlugin') def init(self): self.description = _('Dumps info about selected events to console.') self.config_dialog = None #self.gui_extension_points = {} #self.config_default_values = {} events_from_old_dbus_support = [ 'Roster', 'AccountPresence', 'ContactPresence', 'ContactAbsence', 'ContactStatus', 'NewMessage', 'Subscribe', 'Subscribed', 'Unsubscribed', 'NewAccount', 'VcardInfo', 'LastStatusTime', 'OsInfo', 'GCPresence', 'GCMessage', 'RosterInfo', 'NewGmail'] events_from_src_gajim = [ 'ROSTER', 'WARNING', 'ERROR', 'INFORMATION', 'ERROR_ANSWER', 'STATUS', 'NOTIFY', 'MSGERROR', 'MSGSENT', 'MSGNOTSENT', 'SUBSCRIBED', 'UNSUBSCRIBED', 'SUBSCRIBE', 'AGENT_ERROR_INFO', 'AGENT_ERROR_ITEMS', 'AGENT_REMOVED', 'REGISTER_AGENT_INFO', 'AGENT_INFO_ITEMS', 'AGENT_INFO_INFO', 'QUIT', 'NEW_ACC_CONNECTED', 'NEW_ACC_NOT_CONNECTED', 'ACC_OK', 'ACC_NOT_OK', 'MYVCARD', 'VCARD', 'LAST_STATUS_TIME', 'OS_INFO', 'GC_NOTIFY', 'GC_MSG', 'GC_SUBJECT', 'GC_CONFIG', 'GC_CONFIG_CHANGE', 'GC_INVITATION', 'GC_AFFILIATION', 'GC_PASSWORD_REQUIRED', 'BAD_PASSPHRASE', 'ROSTER_INFO', 'BOOKMARKS', 'CON_TYPE', 'CONNECTION_LOST', 'FILE_REQUEST', 'FILE_REQUEST_ERROR', 'FILE_SEND_ERROR', 'STANZA_ARRIVED', 'STANZA_SENT', 'HTTP_AUTH', 'VCARD_PUBLISHED', 'VCARD_NOT_PUBLISHED', 'ASK_NEW_NICK', 'SIGNED_IN', 'METACONTACTS', 'ATOM_ENTRY', 'FAILED_DECRYPT', 'PRIVACY_LISTS_RECEIVED', 'PRIVACY_LIST_RECEIVED', 'PRIVACY_LISTS_ACTIVE_DEFAULT', 'PRIVACY_LIST_REMOVED', 'ZC_NAME_CONFLICT', 'PING_SENT', 'PING_REPLY', 'PING_ERROR', 'SEARCH_FORM', 'SEARCH_RESULT', 'RESOURCE_CONFLICT', 'PEP_CONFIG', 'UNIQUE_ROOM_ID_UNSUPPORTED', 'UNIQUE_ROOM_ID_SUPPORTED', 'SESSION_NEG', 'GPG_PASSWORD_REQUIRED', 'SSL_ERROR', 'FINGERPRINT_ERROR', 'PLAIN_CONNECTION', 'PUBSUB_NODE_REMOVED', 'PUBSUB_NODE_NOT_REMOVED'] network_events_from_core = ['raw-message-received', 'raw-iq-received', 'raw-pres-received'] network_events_generated_in_nec = [ 'customized-message-received', 'more-customized-message-received', 'modify-only-message-received', 'enriched-chat-message-received'] self.events_names = [] self.events_names += network_events_from_core self.events_names += network_events_generated_in_nec self.events_handlers = {} self._set_handling_methods() @log_calls('EventsDumpPlugin') def activate(self): pass @log_calls('EventsDumpPlugin') def deactivate(self): pass @log_calls('EventsDumpPlugin') def _set_handling_methods(self): for event_name in self.events_names: setattr(self, event_name, types.MethodType( self._generate_handling_method(event_name), self)) self.events_handlers[event_name] = (ged.POSTCORE, getattr(self, event_name)) def _generate_handling_method(self, event_name): def handler(self, *args): print ("Event '%s' occured. Arguments: %s\n\n===\n" % (event_name, pformat(args))) return handler gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/plugins/new_events_example/000077500000000000000000000000001326020644600262545ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/plugins/new_events_example/__init__.py000066400000000000000000000000531326020644600303630ustar00rootroot00000000000000from .plugin import NewEventsExamplePlugin gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/plugins/new_events_example/manifest.ini000066400000000000000000000004221326020644600305610ustar00rootroot00000000000000[info] name: New Events Example short_name: new_events_example version: 0.1 description: Shows how to generate new network events based on existing one using Network Events Controller. authors = Mateusz Biliński homepage = http://blog.bilinski.it gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/plugins/new_events_example/plugin.py000066400000000000000000000112711326020644600301260ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## ''' New Events Example plugin. Demonstrates how to use Network Events Controller to generate new events based on existing one. :author: Mateusz Biliński :since: 15th August 2008 :copyright: Copyright (2008) Mateusz Biliński :license: GPL ''' #import new # Depricated in python3 for types module from pprint import pformat from gajim.common import helpers from gajim.common import app from gajim.plugins import GajimPlugin from gajim.plugins.helpers import log_calls, log from gajim.common import ged from gajim.common import nec class NewEventsExamplePlugin(GajimPlugin): @log_calls('NewEventsExamplePlugin') def init(self): self.description = _('Shows how to generate new network events based ' 'on existing one using Network Events Controller.') self.config_dialog = None #self.gui_extension_points = {} #self.config_default_values = {} self.events_handlers = {'raw-message-received' : (ged.POSTCORE, self.raw_message_received), 'customized-message-received' : (ged.POSTCORE, self.customized_message_received), 'enriched-chat-message-received' : (ged.POSTCORE, self.enriched_chat_message_received)} self.events = [CustomizedMessageReceivedEvent, MoreCustomizedMessageReceivedEvent, ModifyOnlyMessageReceivedEvent, EnrichedChatMessageReceivedEvent] def enriched_chat_message_received(self, event_object): pass # print "Event '%s' occured. Event object: %s\n\n===\n" % \ # (event_object.name, event_object) def raw_message_received(self, event_object): pass # print "Event '%s' occured. Event object: %s\n\n===\n" % \ # (event_object.name,event_object) def customized_message_received(self, event_object): pass # print "Event '%s' occured. Event object: %s\n\n===\n" % \ # (event_object.name, event_object @log_calls('NewEventsExamplePlugin') def activate(self): pass @log_calls('NewEventsExamplePlugin') def deactivate(self): pass class CustomizedMessageReceivedEvent(nec.NetworkIncomingEvent): name = 'customized-message-received' base_network_events = ['raw-message-received'] def generate(self): return True class MoreCustomizedMessageReceivedEvent(nec.NetworkIncomingEvent): ''' Shows chain of custom created events. This one is based on custom 'customized-messsage-received'. ''' name = 'more-customized-message-received' base_network_events = ['customized-message-received'] def generate(self): return True class ModifyOnlyMessageReceivedEvent(nec.NetworkIncomingEvent): name = 'modify-only-message-received' base_network_events = ['raw-message-received'] def generate(self): msg_type = self.base_event.stanza.attrs.get('type', None) if msg_type == u'chat': msg_text = ''.join(self.base_event.stanza.kids[0].data) self.base_event.stanza.kids[0].setData( u'%s [MODIFIED BY CUSTOM NETWORK EVENT]' % (msg_text)) return False class EnrichedChatMessageReceivedEvent(nec.NetworkIncomingEvent): ''' Generates more friendly (in use by handlers) network event for received chat message. ''' name = 'enriched-chat-message-received' base_network_events = ['raw-message-received'] def generate(self): msg_type = self.base_event.stanza.attrs.get('type', None) if msg_type == u'chat': self.stanza = self.base_event.stanza self.conn = self.base_event.conn self.from_jid = helpers.get_full_jid_from_iq(self.stanza) self.from_jid_without_resource = app.get_jid_without_resource( self.from_jid) self.account = self.conn.name self.from_nickname = app.get_contact_name_from_jid( self.account, self.from_jid_without_resource) self.msg_text = ''.join(self.stanza.kids[0].data) return True return False gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/plugins/roster_buttons/000077500000000000000000000000001326020644600254605ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/plugins/roster_buttons/__init__.py000066400000000000000000000001141326020644600275650ustar00rootroot00000000000000 __all__ = ['RosterButtonsPlugin'] from .plugin import RosterButtonsPlugin gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/plugins/roster_buttons/manifest.ini000066400000000000000000000003251326020644600277670ustar00rootroot00000000000000[info] name: Roster Buttons short_name: roster_buttons version: 0.1 description: Adds quick action buttons to roster window. authors = Mateusz Biliński homepage = http://blog.bilinski.it gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/plugins/roster_buttons/plugin.py000066400000000000000000000052131326020644600273310ustar00rootroot00000000000000# -*- coding: utf-8 -*- ## This file is part of Gajim. ## ## Gajim 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; version 3 only. ## ## Gajim 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 Gajim. If not, see . ## ''' Roster buttons plug-in. :author: Mateusz Biliński :since: 14th June 2008 :copyright: Copyright (2008) Mateusz Biliński :license: GPL ''' import sys import gtk from gajim.common import app from gajim.plugins import GajimPlugin from gajim.plugins.helpers import log, log_calls class RosterButtonsPlugin(GajimPlugin): @log_calls('RosterButtonsPlugin') def init(self): self.description = _('Adds quick action buttons to roster window.') self.GTK_BUILDER_FILE_PATH = self.local_file_path('roster_buttons.ui') self.config_dialog = None @log_calls('RosterButtonsPlugin') def activate(self): self.roster_vbox = app.interface.roster.xml.get_object('roster_vbox2') self.show_offline_contacts_menuitem = app.interface.roster.xml.get_object('show_offline_contacts_menuitem') self.xml = gtk.Builder() self.xml.set_translation_domain('gajim_plugins') self.xml.add_objects_from_file(self.GTK_BUILDER_FILE_PATH, ['roster_buttons_buttonbox']) self.buttonbox = self.xml.get_object('roster_buttons_buttonbox') self.roster_vbox.pack_start(self.buttonbox, expand=False) self.roster_vbox.reorder_child(self.buttonbox, 0) self.xml.connect_signals(self) @log_calls('RosterButtonsPlugin') def deactivate(self): self.roster_vbox.remove(self.buttonbox) self.buttonbox = None self.xml = None @log_calls('RosterButtonsPlugin') def on_roster_button_1_clicked(self, button): #gajim.interface.roster.on_show_offline_contacts_menuitem_activate(None) self.show_offline_contacts_menuitem.set_active(not self.show_offline_contacts_menuitem.get_active()) @log_calls('RosterButtonsPlugin') def on_roster_button_2_clicked(self, button): pass @log_calls('RosterButtonsPlugin') def on_roster_button_3_clicked(self, button): pass @log_calls('RosterButtonsPlugin') def on_roster_button_4_clicked(self, button): pass gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/plugins/roster_buttons/roster_buttons.ui000066400000000000000000000054521326020644600311210ustar00rootroot00000000000000 True True spread 1 True True True False False 0 2 True True True False False 1 3 True True True False False 2 4 True True True False False 3 gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/po/000077500000000000000000000000001326020644600213215ustar00rootroot00000000000000gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/po/LINGUAS000066400000000000000000000002311326020644600223420ustar00rootroot00000000000000# available languages fr pt el pl es ru bg de nb_NO cs nl pt_BR sv it eu sk zh_CN br eo hr en_GB be be@latin sr sr@Latn gl lt da uk ja kk he zh_TW hu tr gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/po/be.po000066400000000000000000013303571326020644600222630ustar00rootroot00000000000000# Беларускі пераклад Gajim # Copyright (C) 2006 Free Software Foundation, Inc. # This file is distributed under the same license as Gajim. # # Ihar Hrachyshka , 2006, 2009. msgid "" msgstr "" "Project-Id-Version: 0.10.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-03-31 02:05+0000\n" "PO-Revision-Date: 2009-08-19 23:42+0200\n" "Last-Translator: Ihar Hrachyshka \n" "Language-Team: Belarusian \n" "Language: be\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: gajim/chat_control_base.py:199 msgid "Ping?" msgstr "" #: gajim/chat_control_base.py:204 #, fuzzy msgid "Error." msgstr "Памылка Avahi" #: gajim/chat_control_base.py:571 msgid "_Undo" msgstr "" #: gajim/chat_control_base.py:579 gajim/profile_window.py:181 #: gajim/conversation_textview.py:539 msgid "_Clear" msgstr "" #: gajim/chat_control_base.py:1172 msgid "Really send file?" msgstr "" #: gajim/chat_control_base.py:1173 #, python-format msgid "If you send a file to %s, he/she will know your real JID." msgstr "" #: gajim/session.py:451 gajim/session.py:511 msgid "Confirm these session options" msgstr "" #: gajim/session.py:453 #, python-format msgid "" "The remote client wants to negotiate a session with these features:\n" "\n" "%s\n" "\n" "Are these options acceptable?" msgstr "" #: gajim/session.py:513 #, python-format msgid "" "The remote client selected these options:\n" "\n" "%s\n" "\n" "Continue with the session?" msgstr "" #: gajim/session.py:516 #, fuzzy msgid "Always accept for this contact" msgstr "Ці ўжыты OpenPGP ў размове з гэтым чалавекам?" #: gajim/filetransfers_window.py:89 msgid "File" msgstr "Файл" #: gajim/filetransfers_window.py:104 msgid "Time" msgstr "Час" #: gajim/filetransfers_window.py:116 msgid "Progress" msgstr "Ступень выкананасці" #: gajim/filetransfers_window.py:223 gajim/filetransfers_window.py:279 #, python-format msgid "Filename: %s" msgstr "Файл: %s" #: gajim/filetransfers_window.py:224 gajim/filetransfers_window.py:486 #, python-format msgid "Size: %s" msgstr "Памер: %s" #: gajim/filetransfers_window.py:233 gajim/filetransfers_window.py:243 #: gajim/history_manager.py:528 msgid "You" msgstr "Вы" #: gajim/filetransfers_window.py:234 #, python-format msgid "Sender: %s" msgstr "Адпраўнік: %s" #: gajim/filetransfers_window.py:235 gajim/filetransfers_window.py:763 #: gajim/tooltips.py:667 msgid "Recipient: " msgstr "Атрымальнік: " #: gajim/filetransfers_window.py:246 #, python-format msgid "Saved in: %s" msgstr "Захаваць у: %s" #: gajim/filetransfers_window.py:248 gajim/chat_control.py:1617 msgid "File transfer completed" msgstr "Перадача файла скончаная" #: gajim/filetransfers_window.py:250 gajim/chat_control.py:1621 #, fuzzy msgid "Open _Containing Folder" msgstr "_Адкрыць дырэкторыю з файлам" #: gajim/filetransfers_window.py:263 gajim/filetransfers_window.py:270 #: gajim/chat_control.py:1676 msgid "File transfer cancelled" msgstr "Перадача файла скасаваная" #: gajim/filetransfers_window.py:263 gajim/filetransfers_window.py:271 #: gajim/chat_control.py:1677 msgid "Connection with peer cannot be established." msgstr "Немагчыма ўсталяваць злучэнне з атрымальнікам." #: gajim/filetransfers_window.py:280 #, python-format msgid "Recipient: %s" msgstr "Атрымальнік: %s" #: gajim/filetransfers_window.py:282 #, python-format msgid "Error message: %s" msgstr "Памылка: %s" #: gajim/filetransfers_window.py:283 gajim/chat_control.py:1673 #, fuzzy msgid "File transfer stopped" msgstr "Перадача файла спыненая" #: gajim/filetransfers_window.py:319 #, python-format msgid "" "The file %(file)s has been received, but it seems to have been damaged along " "the way.\n" "Do you want to download it again?" msgstr "" #: gajim/filetransfers_window.py:345 #, fuzzy msgid "Choose File to Send…" msgstr "Выберыце файл..." #: gajim/filetransfers_window.py:356 msgid "_Send" msgstr "Ад_правіць" #: gajim/filetransfers_window.py:363 gajim/tooltips.py:702 #, fuzzy msgid "Description: " msgstr "Апісанне: %s" #: gajim/filetransfers_window.py:376 #, fuzzy msgid "Gajim can not read this file" msgstr "Gajim не можа даступіцца да гэтага файла" #: gajim/filetransfers_window.py:377 msgid "Another process is using this file." msgstr "" #: gajim/filetransfers_window.py:422 gajim/gtkgui_helpers.py:492 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Немагчыма перапісаць наяўны файл \"%s\"" #: gajim/filetransfers_window.py:423 gajim/gtkgui_helpers.py:493 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." msgstr "Файл з такой назвай ужо існуе, а Вы не маеце правоў на яго перазапіс." #: gajim/filetransfers_window.py:440 gajim/gtkgui_helpers.py:497 msgid "This file already exists" msgstr "Такі файл ужо ёсць" #: gajim/filetransfers_window.py:440 gajim/gtkgui_helpers.py:497 msgid "What do you want to do?" msgstr "Што Вы хочаце зрабіць?" #: gajim/filetransfers_window.py:451 gajim/gtkgui_helpers.py:504 #, python-format msgid "Directory \"%s\" is not writable" msgstr "Немагчыма запісваць файлы ў дырэкторыю \"%s\"" #: gajim/filetransfers_window.py:452 gajim/gtkgui_helpers.py:505 msgid "You do not have permission to create files in this directory." msgstr "Вы не маеце права ствараць файлы ў гэтай дырэкторыі." #: gajim/filetransfers_window.py:463 #, fuzzy msgid "Save File as…" msgstr "Захаваць файл як..." #: gajim/filetransfers_window.py:483 #, python-format msgid "File: %s" msgstr "Файл: %s" #: gajim/filetransfers_window.py:489 #, python-format msgid "Type: %s" msgstr "Тып: %s" #: gajim/filetransfers_window.py:491 #, python-format msgid "Description: %s" msgstr "Апісанне: %s" #: gajim/filetransfers_window.py:492 #, python-format msgid "%s wants to send you a file:" msgstr "%s хоча адправіць Вам файл:" #: gajim/filetransfers_window.py:533 #, fuzzy msgid "Checking file…" msgstr "Адпраўленне профіля..." #: gajim/filetransfers_window.py:547 #, fuzzy msgid "File error" msgstr "Памылка перадачы файла" #: gajim/filetransfers_window.py:584 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" #: gajim/filetransfers_window.py:677 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/с)" #: gajim/filetransfers_window.py:730 gajim/filetransfers_window.py:733 msgid "Invalid File" msgstr "Няправільны файл" #: gajim/filetransfers_window.py:730 msgid "File: " msgstr "Файл: " #: gajim/filetransfers_window.py:734 msgid "It is not possible to send empty files" msgstr "Немагчыма адправіць пусты файл" #: gajim/filetransfers_window.py:759 gajim/tooltips.py:658 msgid "Name: " msgstr "Назва:" #: gajim/filetransfers_window.py:761 gajim/tooltips.py:661 msgid "Sender: " msgstr "Адпраўнік:" #: gajim/filetransfers_window.py:889 msgid "Pause" msgstr "Прыпыніць" #: gajim/filetransfers_window.py:900 msgid "_Continue" msgstr "_Працягнуць" #: gajim/features_window.py:48 msgid "Bonjour / Zeroconf" msgstr "" #: gajim/features_window.py:49 msgid "Serverless chatting with autodetected clients in a local network." msgstr "" #: gajim/features_window.py:50 msgid "Requires python-avahi." msgstr "" #: gajim/features_window.py:51 msgid "" "Requires pybonjour and bonjour SDK running (http://developer.apple.com/" "opensource/)." msgstr "" #: gajim/features_window.py:52 #, fuzzy msgid "Command line" msgstr "Загады: %s" #: gajim/features_window.py:53 msgid "A script to control Gajim via commandline." msgstr "" #: gajim/features_window.py:54 msgid "Requires python-dbus." msgstr "" #: gajim/features_window.py:55 gajim/features_window.py:83 #: gajim/features_window.py:87 msgid "Feature not available under Windows." msgstr "" #: gajim/features_window.py:56 #, fuzzy msgid "OpenPGP message encryption" msgstr "Шыфраванне OpenPGP" #: gajim/features_window.py:57 #, fuzzy msgid "Ability to encrypting chat messages with OpenPGP." msgstr "_Уваходнае паведамленне:" #: gajim/features_window.py:58 msgid "Requires gpg and python-gnupg (http://code.google.com/p/python-gnupg/)." msgstr "" #: gajim/features_window.py:59 msgid "Requires gpg.exe in PATH." msgstr "" #: gajim/features_window.py:60 #, fuzzy msgid "Password encryption" msgstr "Паролі розняцца" #: gajim/features_window.py:61 msgid "Passwords can be stored securely and not just in plaintext." msgstr "" #: gajim/features_window.py:62 msgid "" "Requires libsecret and a provider (such as GNOME Keyring and KSecretService)." msgstr "" #: gajim/features_window.py:63 msgid "On Windows the Windows Credential Vault is used." msgstr "" #: gajim/features_window.py:64 msgid "Spell Checker" msgstr "" #: gajim/features_window.py:65 msgid "Spellchecking of composed messages." msgstr "" #: gajim/features_window.py:66 gajim/features_window.py:67 msgid "Requires Gspell" msgstr "" #: gajim/features_window.py:68 #, fuzzy msgid "Automatic status" msgstr "_Адпаведна стану" #: gajim/features_window.py:69 msgid "Ability to measure idle time, in order to set auto status." msgstr "" #: gajim/features_window.py:70 msgid "Requires libxss library." msgstr "" #: gajim/features_window.py:71 msgid "Requires python2.5." msgstr "" #: gajim/features_window.py:72 #, fuzzy msgid "End to End message encryption" msgstr "Шыфраванне OpenPGP" #: gajim/features_window.py:73 #, fuzzy msgid "Encrypting chat messages." msgstr "_Уваходнае паведамленне:" #: gajim/features_window.py:74 gajim/features_window.py:75 msgid "Requires python-crypto." msgstr "" #: gajim/features_window.py:76 #, fuzzy msgid "RST Generator" msgstr "Агульная" #: gajim/features_window.py:77 msgid "" "Generate XHTML output from RST code (see http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." msgstr "" #: gajim/features_window.py:78 gajim/features_window.py:79 msgid "Requires python-docutils." msgstr "" #: gajim/features_window.py:80 gajim/data/gui/preferences_window.ui:2421 msgid "Audio / Video" msgstr "" #: gajim/features_window.py:81 msgid "Ability to start audio and video chat." msgstr "" #: gajim/features_window.py:82 msgid "" "Requires gir1.2-farstream-0.2, gir1.2-gstreamer-1.0, gstreamer1.0-libav and " "gstreamer1.0-plugins-ugly." msgstr "" #: gajim/features_window.py:84 msgid "UPnP-IGD" msgstr "" #: gajim/features_window.py:85 msgid "Ability to request your router to forward port for file transfer." msgstr "" #: gajim/features_window.py:86 msgid "Requires gir1.2-gupnpigd-1.0." msgstr "" #: gajim/features_window.py:94 #, fuzzy msgid "?features:Available" msgstr "Тут" #: gajim/features_window.py:101 #, fuzzy msgid "Feature" msgstr "Здольнасці сервера" #: gajim/gtkgui_helpers.py:255 msgid "Error reading file:" msgstr "Памылка чытання файла:" #: gajim/gtkgui_helpers.py:258 msgid "Error parsing file:" msgstr "Памылка разбору файла:" #: gajim/gtkgui_helpers.py:478 msgid "Extension not supported" msgstr "Пашырэнне не падтрымліваецца" #: gajim/gtkgui_helpers.py:479 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "" "Немагчыма захаваць малюнак у фармаце %(type)s. Захаваць як %(new_filename)s?" #: gajim/gtkgui_helpers.py:514 #, fuzzy msgid "Save Image as…" msgstr "Захаваць малюнак як..." #: gajim/vcard.py:166 gajim/vcard.py:513 gajim/profile_window.py:175 #: gajim/chat_control.py:581 #, fuzzy msgid "Save _As" msgstr "Мае " #: gajim/vcard.py:289 gajim/vcard.py:296 msgid "?Client:Unknown" msgstr "?Праграма:Невядомая" #: gajim/vcard.py:293 gajim/vcard.py:298 msgid "?OS:Unknown" msgstr "?Сістэма:Невядомая" #: gajim/vcard.py:327 gajim/vcard.py:330 #, fuzzy msgid "?Time:Unknown" msgstr "?Праграма:Невядомая" #: gajim/vcard.py:381 msgid "?Role in Group Chat:Role:" msgstr "" #: gajim/vcard.py:385 #, fuzzy msgid "Affiliation:" msgstr "Праграмы" #: gajim/vcard.py:392 #, fuzzy msgid "" "This contact is interested in your presence information, but you are not " "interested in their presence" msgstr "Вы не цікавіцеся гэтым чалавекам, але ён цікавіцца Вамі" #: gajim/vcard.py:394 #, fuzzy msgid "" "You are interested in the contact's presence information, but it is not " "mutual" msgstr "Вы цікавіцеся чалавекам, але ён не цікавіцца Вамі" #: gajim/vcard.py:396 #, fuzzy msgid "The contact and you want to exchange presence information" msgstr "Вы і гэты чалавек абодва цікавіцеся адзін адным" #: gajim/vcard.py:398 #, fuzzy msgid "" "You and the contact have a mutual disinterest in each-others presence " "information" msgstr "Вы і гэты чалавек абодва цікавіцеся адзін адным" #: gajim/vcard.py:404 msgid "You are waiting contact's answer about your subscription request" msgstr "Вы чакаеце адказу на Ваш запыт" #: gajim/vcard.py:406 msgid "There is no pending subscription request." msgstr "" #: gajim/vcard.py:411 gajim/vcard.py:455 gajim/vcard.py:568 msgid " resource with priority " msgstr " рэсурс з прыярытэтам " #: gajim/options_dialog.py:383 gajim/dialogs.py:4806 gajim/dialogs.py:4848 #: gajim/dialogs.py:4896 gajim/dialogs.py:4986 msgid "All files" msgstr "Усе файлы" #: gajim/options_dialog.py:392 #, fuzzy msgid "Clear File" msgstr "Вечар" #: gajim/options_dialog.py:474 #, fuzzy msgid "Manage Proxies" msgstr "Кіраванне профілямі проксі" #: gajim/options_dialog.py:484 gajim/options_dialog.py:552 #: gajim/options_dialog.py:573 gajim/dialogs.py:326 gajim/dialogs.py:328 #: gajim/dialogs.py:536 gajim/dialogs.py:549 gajim/roster_window.py:2997 #: gajim/roster_window.py:3003 gajim/roster_window.py:3008 gajim/config.py:1162 #: gajim/config.py:1177 gajim/config.py:1182 gajim/config.py:1230 #: gajim/config.py:1340 gajim/config.py:2489 gajim/config.py:2566 #: gajim/data/gui/account_creation_wizard_window.ui:22 #: gajim/data/gui/change_mood_dialog.ui:98 msgid "None" msgstr "Ніякі" #: gajim/options_dialog.py:506 #, fuzzy msgid "Adjust to Status" msgstr "_Адпаведна стану" #: gajim/options_dialog.py:518 msgid "On" msgstr "" #: gajim/options_dialog.py:518 #, fuzzy msgid "Off" msgstr "Адключаны" #: gajim/options_dialog.py:556 msgid "Failed to get secret keys" msgstr "Немагчыма атрымаць сакрэтныя ключы" #: gajim/options_dialog.py:557 #, fuzzy msgid "There is no OpenPGP secret key available." msgstr "Памылка пошуку Вашых сакрэтных ключоў OpenPGP." #: gajim/options_dialog.py:562 msgid "OpenPGP Key Selection" msgstr "Выбар ключоў OpenPGP" #: gajim/options_dialog.py:562 msgid "Choose your OpenPGP key" msgstr "Выберыце Ваш ключ OpenPGP" #: gajim/gui_menu_builder.py:100 #, fuzzy msgid "_New Group Chat" msgstr "Новая групавая размова" #: gajim/gui_menu_builder.py:292 gajim/gui_menu_builder.py:416 #: gajim/dialogs.py:1114 gajim/dialogs.py:2333 gajim/dialogs.py:2362 #: gajim/dialogs.py:3867 gajim/chat_control.py:284 gajim/roster_window.py:804 #: gajim/roster_window.py:1753 gajim/roster_window.py:1755 #: gajim/roster_window.py:2068 gajim/roster_window.py:3419 #: gajim/roster_window.py:3446 gajim/gui_interface.py:524 #: gajim/common/contacts.py:154 gajim/common/contacts.py:280 #: gajim/common/helpers.py:95 gajim/common/helpers.py:408 msgid "Not in Roster" msgstr "Няма ў спісе" #: gajim/gui_menu_builder.py:431 msgid "I would like to add you to my roster" msgstr "Я хачу дадаць Вас у мой кантактны ліст" #: gajim/gui_menu_builder.py:508 #, fuzzy msgid "Send Single _Message…" msgstr "Адправіць _асобнае паведамленне" #: gajim/gui_menu_builder.py:521 gajim/roster_window.py:5165 #: gajim/data/gui/contact_context_menu.ui:58 #, fuzzy msgid "Send Cus_tom Status" msgstr "Адправіць асаблівы XML" #: gajim/gui_menu_builder.py:541 #, fuzzy msgid "E_xecute Command…" msgstr "_Выканаць загад..." #: gajim/gui_menu_builder.py:549 #, fuzzy msgid "_Manage Transport" msgstr "Транспарты" #: gajim/gui_menu_builder.py:555 #, fuzzy msgid "_Modify Transport" msgstr "Паказаць _транспарты" #: gajim/gui_menu_builder.py:562 gajim/roster_window.py:5195 #, fuzzy msgid "_Rename…" msgstr "Змяніць _імя" #: gajim/gui_menu_builder.py:573 gajim/roster_window.py:5212 #: gajim/roster_window.py:5327 gajim/data/gui/blocked_contacts_window.ui:52 #: gajim/data/gui/gc_occupants_menu.ui:148 #: gajim/data/gui/contact_context_menu.ui:166 msgid "_Unblock" msgstr "" #: gajim/gui_menu_builder.py:576 gajim/roster_window.py:5217 #: gajim/roster_window.py:5331 gajim/data/gui/gc_occupants_menu.ui:140 #: gajim/data/gui/contact_context_menu.ui:174 msgid "_Block" msgstr "" #: gajim/gui_menu_builder.py:584 gajim/roster_window.py:5224 #: gajim/data/gui/contact_context_menu.ui:204 #, fuzzy msgid "Remo_ve" msgstr "Вы_даліць" #: gajim/gui_menu_builder.py:594 gajim/data/gui/search_window.ui:98 #, fuzzy msgid "_Information" msgstr "Асабістыя звесткі" #: gajim/gui_menu_builder.py:611 #, fuzzy msgid "Send File..." msgstr "Адправіць _файл" #: gajim/gui_menu_builder.py:615 #, fuzzy msgid "Invite Contacts" msgstr "Людзі" #: gajim/gui_menu_builder.py:616 #, fuzzy msgid "Add to Roster" msgstr "_Дадаць у кантактны ліст" #: gajim/gui_menu_builder.py:617 msgid "Audio Session" msgstr "" #: gajim/gui_menu_builder.py:618 msgid "Video Session" msgstr "" #: gajim/gui_menu_builder.py:619 #, fuzzy msgid "Information" msgstr "Асабістыя звесткі" #: gajim/gui_menu_builder.py:620 gajim/gui_menu_builder.py:655 #: gajim/data/gui/application_menu.ui:37 #, fuzzy msgid "History" msgstr "_Журнал" #: gajim/gui_menu_builder.py:644 #, fuzzy msgid "Manage Room" msgstr "Кіраванне закладкамі" #: gajim/gui_menu_builder.py:645 #, fuzzy msgid "Change Subject" msgstr "Змяніць _тэму" #: gajim/gui_menu_builder.py:646 #, fuzzy msgid "Configure Room" msgstr "Настаўленні _пакоя" #: gajim/gui_menu_builder.py:647 #, fuzzy msgid "Destroy Room" msgstr "Апісанне: %s" #: gajim/gui_menu_builder.py:649 #, fuzzy msgid "Change Nick" msgstr "Змяніць м_янушку" #: gajim/gui_menu_builder.py:650 #, fuzzy msgid "Bookmark Room" msgstr "_Змясціць у закладках" #: gajim/gui_menu_builder.py:651 #, fuzzy msgid "Request Voice" msgstr "_Голас" #: gajim/gui_menu_builder.py:652 gajim/data/gui/gc_control_popup_menu.ui:72 #, fuzzy msgid "Notify on all messages" msgstr "Стандартныя паведамленні:" #: gajim/gui_menu_builder.py:653 msgid "Minimize on close" msgstr "" #: gajim/gui_menu_builder.py:654 gajim/roster_window.py:5397 #, fuzzy msgid "Execute command" msgstr "_Выканаць загад..." #: gajim/gui_menu_builder.py:656 #, fuzzy msgid "Disconnect" msgstr "Чалавек адлучыўся" #: gajim/gui_menu_builder.py:685 gajim/gui_menu_builder.py:732 msgid "Join Group Chat" msgstr "Удзельнічаць у групавой размове" #: gajim/gui_menu_builder.py:731 #, fuzzy msgid "Add Contact..." msgstr "_Дадаць чалавека..." #: gajim/gui_menu_builder.py:733 gajim/accounts_window.py:460 #: gajim/accounts_window.py:555 gajim/accounts_window.py:594 #, fuzzy msgid "Profile" msgstr "файл" #: gajim/gui_menu_builder.py:734 #, fuzzy msgid "Discover Services" msgstr "_Пошук сервісаў" #: gajim/gui_menu_builder.py:735 #, fuzzy msgid "Send Single Message..." msgstr "Адправіць _асобнае паведамленне..." #: gajim/gui_menu_builder.py:736 gajim/data/gui/preferences_window.ui:2846 msgid "Advanced" msgstr "Адмысловы" #: gajim/gui_menu_builder.py:737 #, fuzzy msgid "Archiving Preferences" msgstr "_Настаўленні" #: gajim/gui_menu_builder.py:738 gajim/history_sync.py:44 #, fuzzy msgid "Synchronise History" msgstr "Паказаць _адлучаных людзей" #: gajim/gui_menu_builder.py:739 gajim/dialogs.py:4583 msgid "Privacy Lists" msgstr "Спісы прыватнасці" #: gajim/gui_menu_builder.py:740 gajim/server_info.py:37 #, fuzzy msgid "Server Info" msgstr "Сервер" #: gajim/gui_menu_builder.py:741 gajim/data/gui/xml_console_window.ui:77 msgid "XML Console" msgstr "Кансоль XML" #: gajim/gui_menu_builder.py:743 #, fuzzy msgid "Admin" msgstr "_Адміністратар" #: gajim/gui_menu_builder.py:744 #, fuzzy msgid "Send Server Message..." msgstr "Ад_правіць паведамленне серверу" #: gajim/gui_menu_builder.py:745 #, fuzzy msgid "Set MOTD..." msgstr "Вызначыць MOTD" #: gajim/gui_menu_builder.py:746 #, fuzzy msgid "Update MOTD..." msgstr "Абнавіць MOTD" #: gajim/gui_menu_builder.py:747 #, fuzzy msgid "Delete MOTD..." msgstr "Выдаліць MOTD" #: gajim/gui_menu_builder.py:787 #, fuzzy msgid "No Accounts available" msgstr "Рахункаў няма" #: gajim/gui_menu_builder.py:799 gajim/data/gui/accounts_window.ui:78 #: gajim/data/gui/application_menu.ui:5 gajim/data/gui/application_menu.ui:71 #: gajim/data/gui/shortcuts_window.ui:181 msgid "Accounts" msgstr "Рахункі" #: gajim/history_manager.py:56 #, fuzzy msgid "Usage:" msgstr "паведамленне" #: gajim/history_manager.py:58 #, fuzzy msgid "Options:" msgstr "Сымболікі:" #: gajim/history_manager.py:60 msgid "Show this help message and exit" msgstr "" #: gajim/history_manager.py:61 msgid "Choose folder for logfile" msgstr "" #: gajim/history_manager.py:104 msgid "Cannot find history logs database" msgstr "Немагчыма адшукаць базу дадзеных" #: gajim/history_manager.py:144 gajim/history_manager.py:195 #: gajim/dialogs.py:3848 gajim/config.py:1621 gajim/disco.py:872 msgid "JID" msgstr "JID" #: gajim/history_manager.py:157 gajim/history_manager.py:201 #: gajim/history_window.py:108 msgid "Date" msgstr "Дата" #: gajim/history_manager.py:164 gajim/history_manager.py:220 #: gajim/data/gui/join_groupchat_window.ui:131 msgid "Nickname" msgstr "Мянушка" #: gajim/history_manager.py:173 gajim/history_manager.py:208 #: gajim/history_window.py:116 gajim/data/gui/xml_console_window.ui:108 msgid "Message" msgstr "Паведамленне" #: gajim/history_manager.py:181 gajim/history_manager.py:214 msgid "Subject" msgstr "Тэма" #: gajim/history_manager.py:243 msgid "" "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " "RUNNING)" msgstr "" "Вы сапраўды хочаце ачысціць базу дадзеных? (Увага: закрыйце Gajim перад " "працягам)" #: gajim/history_manager.py:245 #, fuzzy msgid "" "Normally allocated database size will not be freed, it will just become " "reusable. If you really want to reduce database filesize, click YES, else " "click NO.\n" "\n" "In case you click YES, please wait…" msgstr "" "Звычайна памер базы дадзеных не змяншаецца, але вызваленае месца можа быць " "скарыстаным для пазнейшых размоў. Калі Вы хочаце зменшыць памер базы " "дадзеных, пстрыкніце Так, інакш Не.\n" "\n" "Калі Вы выбралі Так, пачакайце..." #: gajim/history_manager.py:250 msgid "Database Cleanup" msgstr "" #: gajim/history_manager.py:464 #, fuzzy msgid "Exporting History Logs…" msgstr "Экспартаванне журналаў..." #: gajim/history_manager.py:540 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "%(who)s а %(time)s сказаў: %(message)s\n" #: gajim/history_manager.py:578 #, fuzzy, python-format msgid "Do you wish to delete all correspondence with %(jid)s?" msgstr "Вы сапраўды хочаце выдаліць выбранае паведамленне?" #: gajim/history_manager.py:582 #, fuzzy msgid "Do you wish to delete all correspondence with the selected contacts?" msgstr "Вы сапраўды хочаце выдаліць журнал размоў з выбранай асобай?" #: gajim/history_manager.py:584 #, fuzzy msgid "This can not be undone." msgstr "Немагчыма знайсці сервіс" #: gajim/history_manager.py:586 gajim/history_manager.py:625 #, fuzzy msgid "Deletion Confirmation" msgstr "Асабістыя звесткі" #: gajim/history_manager.py:620 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Вы сапраўды хочаце выдаліць выбранае паведамленне?" msgstr[1] "Вы сапраўды хочаце выдаліць выбраныя паведамленні?" msgstr[2] "Вы сапраўды хочаце выдаліць выбраныя паведамленні?" #: gajim/history_manager.py:623 msgid "This is an irreversible operation." msgstr "Гэтае дзеянне не аднаўляецца." #: gajim/profile_window.py:63 #, fuzzy msgid "Retrieving profile…" msgstr "Чытанне профіля..." #: gajim/profile_window.py:128 msgid "Could not load image" msgstr "Немагчыма загрузіць малюнак" #: gajim/profile_window.py:200 #, fuzzy msgid "Wrong date format" msgstr "Асабістыя звесткі" #: gajim/profile_window.py:201 #, fuzzy msgid "Format of the date must be YYYY-MM-DD" msgstr "Фармат: ГГГГ-ММ-ДД" #: gajim/profile_window.py:261 msgid "Information received" msgstr "Атрыманыя звесткі" #: gajim/profile_window.py:334 gajim/dialogs.py:2562 gajim/dialogs.py:2650 #: gajim/dialogs.py:3105 gajim/disco.py:536 gajim/gui_interface.py:1849 #: gajim/dialog_messages.py:32 msgid "You are not connected to the server" msgstr "Вы не злучаны з серверам" #: gajim/profile_window.py:335 #, fuzzy msgid "Without a connection, you can not publish your contact information." msgstr "" "Вы не можаце абнавіць Вашыя асабістыя звесткі, не злучыўшыся з серверам." #: gajim/profile_window.py:349 #, fuzzy msgid "Sending profile…" msgstr "Адпраўленне профіля..." #: gajim/profile_window.py:368 msgid "Information NOT published" msgstr "Звесткі НЕ абноўленыя" #: gajim/profile_window.py:375 msgid "vCard publication failed" msgstr "Памылка абнаўлення vCard" #: gajim/profile_window.py:376 msgid "" "There was an error while publishing your personal information, try again " "later." msgstr "" "У часе абнаўлення Вашых асабістых звестак адбылася памылка, паспрабуйце " "абнавіць пазней." #: gajim/dialogs.py:90 #, python-format msgid "Contact name: %s" msgstr "Імя чалавека: %s" #: gajim/dialogs.py:92 #, fuzzy, python-format msgid "JID: %s" msgstr "Jabber ID: %s" #: gajim/dialogs.py:121 gajim/dialogs.py:133 gajim/roster_window.py:2939 #: gajim/roster_window.py:3953 gajim/roster_window.py:5234 #: gajim/accounts_window.py:463 gajim/common/contacts.py:105 #: gajim/common/contacts.py:137 gajim/data/gui/preferences_window.ui:569 #: gajim/data/gui/shortcuts_window.ui:176 msgid "General" msgstr "Агульная" #: gajim/dialogs.py:206 msgid "Group" msgstr "Група" #: gajim/dialogs.py:213 msgid "In the group" msgstr "У групе" #: gajim/dialogs.py:308 msgid "KeyID" msgstr "KeyID" #: gajim/dialogs.py:313 msgid "Contact name" msgstr "Імя чалавека" #: gajim/dialogs.py:491 #, fuzzy msgid "Set Mood" msgstr "Вызначыць MOTD" #: gajim/dialogs.py:611 #, python-format msgid "%s Status Message" msgstr "Паведамленне аб змене стану %s" #: gajim/dialogs.py:625 msgid "Status Message" msgstr "Паведамленне аб змене стану" #: gajim/dialogs.py:815 #, fuzzy msgid "Overwrite Status Message?" msgstr "Паведамленне аб змене стану" #: gajim/dialogs.py:816 #, fuzzy msgid "" "This name is already used. Do you want to overwrite this status message?" msgstr "Гэтая назва ўжо скарыстаная для іншага рахунка. Выберыце іншую назву." #: gajim/dialogs.py:824 msgid "Save as Preset Status Message" msgstr "Захаваць гэтае паведамленне аб змене стану" #: gajim/dialogs.py:825 msgid "Please type a name for this status message" msgstr "Вызначце назву гэтага паведамлення аб змене стану" #: gajim/dialogs.py:852 #, fuzzy msgid "JID:" msgstr "Ваш JID:" #: gajim/dialogs.py:853 msgid "AIM Address:" msgstr "Адрас AIM:" #: gajim/dialogs.py:854 msgid "GG Number:" msgstr "Нумар GG:" #: gajim/dialogs.py:855 msgid "ICQ Number:" msgstr "Нумар ICQ:" #: gajim/dialogs.py:856 msgid "MSN Address:" msgstr "Адрас MSN:" #: gajim/dialogs.py:857 msgid "Yahoo! Address:" msgstr "Адрас Yahoo!:" #: gajim/dialogs.py:894 #, fuzzy, python-format msgid "" "Please fill in the data of the contact you want to add to your account " "%s" msgstr "" "Запоўніце палі звесткамі пра чалавека, якога Вы хочаце дадаць у спіс рахунка " "%s" #: gajim/dialogs.py:897 msgid "Please fill in the data of the contact you want to add" msgstr "Запоўніце палі звесткамі, каб дадаць чалавека ў спіс" #: gajim/dialogs.py:1089 gajim/dialogs.py:1095 gajim/dialogs.py:1100 msgid "Invalid User ID" msgstr "Няправільны ID карыстальніка" #: gajim/dialogs.py:1096 msgid "The user ID must not contain a resource." msgstr "ID карыстальніка не павінны вызначаць рэсурс." #: gajim/dialogs.py:1101 #, fuzzy msgid "You cannot add yourself to your roster." msgstr "Я хачу дадаць Вас у мой кантактны ліст." #: gajim/dialogs.py:1115 msgid "Contact already in roster" msgstr "Чалавек ужо ёсць у кантактным лісце" #: gajim/dialogs.py:1116 msgid "This contact is already listed in your roster." msgstr "Гэты чалавек ужо ёсць у у кантактным лісце." #: gajim/dialogs.py:1169 gajim/dialogs.py:1203 msgid "User ID:" msgstr "ID карыстальніка:" #: gajim/dialogs.py:1269 #, fuzzy msgid "Error while adding transport contact" msgstr "Памылка дадання сервіса. %s" #: gajim/dialogs.py:1270 #, python-format msgid "" "This error occured while adding a contact for transport %(transport)s:\n" "\n" "%(error)s" msgstr "" #: gajim/dialogs.py:1302 #, fuzzy msgid "A GTK+ XMPP client" msgstr "Jabber-праграма для GTK+" #: gajim/dialogs.py:1303 #, fuzzy, python-format msgid "GTK+ Version: %s" msgstr "Версія GTK+:" #: gajim/dialogs.py:1304 #, fuzzy, python-format msgid "PyGObject Version: %s" msgstr "Версія PyGTK:" #: gajim/dialogs.py:1305 #, python-format msgid "python-nbxmpp Version: %s" msgstr "" #: gajim/dialogs.py:1308 #, fuzzy msgid "Current Developers" msgstr "Актыўныя распрацоўнікі:" #: gajim/dialogs.py:1309 #, fuzzy msgid "Past Developers" msgstr "Былыя распрацоўнікі:" #: gajim/dialogs.py:1310 msgid "Artists" msgstr "" #: gajim/dialogs.py:1314 msgid "Last but not least" msgstr "" #: gajim/dialogs.py:1315 #, fuzzy msgid "we would like to thank all the package maintainers." msgstr "" "Таксама хочам выказаць падзяку ўсім людзям, што збіраюць пакункі з праграмай " "для розных сістэмаў." #: gajim/dialogs.py:1316 msgid "Thanks" msgstr "" #: gajim/dialogs.py:1318 msgid "translator-credits" msgstr "Ihar Hrachyshka " #: gajim/dialogs.py:1503 #, fuzzy, python-format msgid "Dictionary for language \"%s\" not available" msgstr "Слоўніка для мовы %s няма" #: gajim/dialogs.py:1504 #, fuzzy, python-format msgid "" "You have to install the dictionary \"%s\" to use spellchecking, or choose " "another language by setting the speller_language option.\n" "\n" "Highlighting misspelled words feature will not be used" msgstr "" "Вы павінны ўсталяваць слоўнік %s, каб спраўджваць правапіс, альбо выбраць " "іншую мову праз опцыю speller_language." #: gajim/dialogs.py:1851 gajim/dialogs.py:1866 gajim/gui_interface.py:1511 #: gajim/gui_interface.py:1553 #, fuzzy msgid "Insecure connection" msgstr "Злучэнне" #: gajim/dialogs.py:1852 #, fuzzy, python-format msgid "" "You are about to connect to the account %(account)s (%(server)s) insecurely. " "This means conversations will not be encrypted, and is strongly " "discouraged.\n" "Are you sure you want to do that?" msgstr "Вы ствараеце мета-кантакт. Вы сапраўды хочаце працягнуць?" #: gajim/dialogs.py:1857 gajim/gui_interface.py:1515 #: gajim/gui_interface.py:1556 msgid "Yes, I really want to connect insecurely" msgstr "" #: gajim/dialogs.py:1858 msgid "Gajim will NOT connect unless you check this box" msgstr "" #: gajim/dialogs.py:1859 gajim/groupchat_control.py:2335 #: gajim/roster_window.py:2897 gajim/roster_window.py:3529 #: gajim/roster_window.py:4282 gajim/message_window.py:247 #: gajim/gui_interface.py:725 gajim/gui_interface.py:1516 #: gajim/gui_interface.py:1557 #, fuzzy msgid "_Do not ask me again" msgstr "_Больш не пытацца" #: gajim/dialogs.py:1957 msgid "_Resume" msgstr "" #: gajim/dialogs.py:1965 msgid "Re_place" msgstr "" #: gajim/dialogs.py:2168 gajim/config.py:2169 #: gajim/command_system/implementation/standard.py:261 #, fuzzy msgid "Invalid nickname" msgstr "Няправільнае імя карыстальніка" #: gajim/dialogs.py:2169 #, fuzzy msgid "The nickname contains invalid characters." msgstr "Jabber ID групавой размовы ўтрымлівае няправільныя знакі." #: gajim/dialogs.py:2291 msgid "Subscription Request" msgstr "Запыт падпіскі" #: gajim/dialogs.py:2300 #, fuzzy, python-format msgid "Subscription request for account %(account)s from %(jid)s" msgstr "Запыт увагі на рахунак %s ад %s" #: gajim/dialogs.py:2303 #, python-format msgid "Subscription request from %s" msgstr "Запыт увагі ад %s" #: gajim/dialogs.py:2375 gajim/data/gui/join_groupchat_window.ui:312 #, fuzzy msgid "Join Groupchat" msgstr "Удзельнічаць у групавой размове" #: gajim/dialogs.py:2531 #, fuzzy msgid "Invalid Room" msgstr "Няправільны элемент" #: gajim/dialogs.py:2532 msgid "Please choose a room" msgstr "" #: gajim/dialogs.py:2544 gajim/dialogs.py:2551 #, fuzzy msgid "Invalid Nickname" msgstr "Няправільнае імя карыстальніка" #: gajim/dialogs.py:2545 #, fuzzy msgid "Please choose a nickname" msgstr "Стварыць новы допіс" #: gajim/dialogs.py:2557 gajim/dialogs.py:3516 gajim/config.py:2453 #: gajim/dialog_messages.py:37 gajim/dialog_messages.py:42 msgid "Invalid JID" msgstr "Няправільны JID" #: gajim/dialogs.py:2563 gajim/gui_interface.py:1850 msgid "You can not join a group chat unless you are connected." msgstr "" "Вы не можаце ўдзельнічаць у групавой размове, не злучыўшыся з серверам." #: gajim/dialogs.py:2617 gajim/dialogs.py:2628 #, fuzzy msgid "Wrong server" msgstr "Няправільная спасылка" #: gajim/dialogs.py:2618 gajim/dialogs.py:2629 #, fuzzy, python-format msgid "%s is not a groupchat server" msgstr "Гэта не групавая размова" #: gajim/dialogs.py:2651 #, fuzzy msgid "Without a connection, you can not synchronise your contacts." msgstr "Вы не можаце змяніць пароль, не злучыўшыся з серверам." #: gajim/dialogs.py:2662 gajim/dialogs.py:2733 gajim/dialogs.py:3851 #: gajim/history_window.py:100 gajim/disco.py:865 gajim/disco.py:1693 #: gajim/disco.py:1978 msgid "Name" msgstr "Назва" #: gajim/dialogs.py:2665 gajim/data/gui/join_groupchat_window.ui:214 msgid "Server" msgstr "Сервер" #: gajim/dialogs.py:2701 #, fuzzy msgid "This account is not connected to the server" msgstr "Рахунак \"%s\" злучаны з серверам" #: gajim/dialogs.py:2702 #, fuzzy msgid "You cannot synchronize with an account unless it is connected." msgstr "" "Вы не можаце ўдзельнічаць у групавой размове, не злучыўшыся з серверам." #: gajim/dialogs.py:2731 msgid "Synchronise" msgstr "" #: gajim/dialogs.py:2794 #, fuzzy msgid "Start new Conversation" msgstr "Злучэнне" #: gajim/dialogs.py:3052 #, fuzzy msgid "New Groupchat" msgstr "Новая групавая размова" #: gajim/dialogs.py:3054 #, fuzzy msgid "New Contact" msgstr "Дадаць новага чалавека" #: gajim/dialogs.py:3106 msgid "Without a connection, you can not change your password." msgstr "Вы не можаце змяніць пароль, не злучыўшыся з серверам." #: gajim/dialogs.py:3126 msgid "Invalid password" msgstr "Няправільны пароль" #: gajim/dialogs.py:3126 msgid "You must enter a password." msgstr "Вы павінны ўвесці пароль." #: gajim/dialogs.py:3130 msgid "Passwords do not match" msgstr "Паролі розняцца" #: gajim/dialogs.py:3131 msgid "The passwords typed in both fields must be identical." msgstr "Паролі ў абодвух палях павінны быць аднолькавымі." #: gajim/dialogs.py:3169 gajim/notify.py:91 #: gajim/common/connection_handlers_events.py:2821 msgid "Contact Signed In" msgstr "Чалавек прыйшоў" #: gajim/dialogs.py:3171 gajim/notify.py:91 #: gajim/common/connection_handlers_events.py:2827 msgid "Contact Signed Out" msgstr "Чалавек сышоў" #: gajim/dialogs.py:3173 gajim/notify.py:92 gajim/notify.py:105 #: gajim/common/connection_handlers_events.py:2641 msgid "New Message" msgstr "Новае паведамленне" #: gajim/dialogs.py:3173 gajim/notify.py:92 gajim/notify.py:105 #: gajim/common/connection_handlers_events.py:2623 msgid "New Single Message" msgstr "Новае асобнае паведамленне" #: gajim/dialogs.py:3174 gajim/notify.py:92 gajim/notify.py:106 #: gajim/common/connection_handlers_events.py:2629 msgid "New Private Message" msgstr "Новае прыватнае паведамленне" #: gajim/dialogs.py:3174 msgid "New E-mail" msgstr "Новы ліст" #: gajim/dialogs.py:3176 gajim/gui_interface.py:926 gajim/notify.py:93 msgid "File Transfer Request" msgstr "Запыт на перадачу файла" #: gajim/dialogs.py:3178 gajim/gui_interface.py:861 gajim/gui_interface.py:891 #: gajim/notify.py:94 msgid "File Transfer Error" msgstr "Памылка перадачы файла" #: gajim/dialogs.py:3180 gajim/gui_interface.py:1030 #: gajim/gui_interface.py:1059 gajim/gui_interface.py:1080 gajim/notify.py:94 msgid "File Transfer Completed" msgstr "Перадача файла скончаная" #: gajim/dialogs.py:3181 gajim/gui_interface.py:1034 #: gajim/gui_interface.py:1063 gajim/gui_interface.py:1084 gajim/notify.py:95 msgid "File Transfer Stopped" msgstr "Перадача файла спыненая" #: gajim/dialogs.py:3183 gajim/dialogs.py:4748 gajim/chat_control.py:1647 #: gajim/gui_interface.py:663 gajim/notify.py:95 msgid "Groupchat Invitation" msgstr "Запрашэнне ў групавую размову" #: gajim/dialogs.py:3185 gajim/notify.py:93 #: gajim/common/connection_handlers_events.py:2815 msgid "Contact Changed Status" msgstr "Чалавек змяніў стан" #: gajim/dialogs.py:3404 #, python-format msgid "Single Message using account %s" msgstr "Асобнае паведамленне для рахунка %s" #: gajim/dialogs.py:3406 #, python-format msgid "Single Message in account %s" msgstr "Асобнае паведамленне для рахунка %s" #: gajim/dialogs.py:3408 msgid "Single Message" msgstr "Асобнае паведамленне" #: gajim/dialogs.py:3411 #, python-format msgid "Send %s" msgstr "Адправіць %s" #: gajim/dialogs.py:3434 #, python-format msgid "Received %s" msgstr "Атрымана %s" #: gajim/dialogs.py:3457 #, fuzzy, python-format msgid "Form %s" msgstr "Я %s" #: gajim/dialogs.py:3485 gajim/dialogs.py:3672 msgid "Connection not available" msgstr "Няма злучэння" #: gajim/dialogs.py:3486 gajim/dialogs.py:3673 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Праверце злучэнне з \"%s\"." #: gajim/dialogs.py:3517 gajim/dialog_messages.py:43 #, fuzzy, python-format msgid "It is not possible to send a message to %s, this JID is not valid." msgstr "Немагчыма адправіць пусты файл" #: gajim/dialogs.py:3540 #, python-format msgid "RE: %s" msgstr "RE: %s" #: gajim/dialogs.py:3541 #, python-format msgid "%s wrote:\n" msgstr "%s сказаў:\n" #: gajim/dialogs.py:3589 gajim/data/gui/shortcuts_window.ui:113 #, fuzzy msgid "Clear" msgstr "Вечар" #: gajim/dialogs.py:3594 #, fuzzy msgid "Filter" msgstr "Фільтар:" #: gajim/dialogs.py:3599 #, fuzzy msgid "XML Input" msgstr "Увод XML" #: gajim/dialogs.py:3603 #, fuzzy msgid "Send" msgstr "Ад_правіць" #: gajim/dialogs.py:3794 #, fuzzy msgid "add" msgstr "Марнаванне часу" #: gajim/dialogs.py:3794 #, fuzzy msgid "modify" msgstr "_Змяніць" #: gajim/dialogs.py:3795 #, fuzzy msgid "remove" msgstr "Вы_даліць" #: gajim/dialogs.py:3824 #, fuzzy, python-format msgid "" "%(jid)s would like you to %(action)s some contacts in your " "roster." msgstr "Я хачу дадаць Вас у свой кантактны ліст." #: gajim/dialogs.py:3840 gajim/dialogs.py:3886 gajim/accounts_window.py:44 #, fuzzy msgid "Add" msgstr "Адрас" #: gajim/dialogs.py:3842 gajim/dialogs.py:3917 #, fuzzy msgid "Modify" msgstr "_Змяніць" #: gajim/dialogs.py:3844 gajim/dialogs.py:3941 msgid "Delete" msgstr "Выдаліць" #: gajim/dialogs.py:3854 #, fuzzy msgid "Groups" msgstr "Група" #: gajim/dialogs.py:3962 #, fuzzy, python-format msgid "%s suggested me to add you in my roster." msgstr "Я хачу дадаць Вас у мой кантактны ліст." #: gajim/dialogs.py:3976 #, fuzzy, python-format msgid "Added %d contact" msgid_plural "Added %d contacts" msgstr[0] "Дадаць _чалавека" msgstr[1] "Дадаць _чалавека" msgstr[2] "Дадаць _чалавека" #: gajim/dialogs.py:4014 #, fuzzy, python-format msgid "Removed %d contact" msgid_plural "Removed %d contacts" msgstr[0] "Выдаліць чалавека з спіса" msgstr[1] "Выдаліць чалавека з спіса" msgstr[2] "Выдаліць чалавека з спіса" #: gajim/dialogs.py:4040 #, python-format msgid "Archiving Preferences for %s" msgstr "" #: gajim/dialogs.py:4078 msgid "Success!" msgstr "" #: gajim/dialogs.py:4078 #, fuzzy msgid "Your Archiving Preferences have been saved!" msgstr "_Настаўленні" #: gajim/dialogs.py:4094 msgid "We got no response from the Server" msgstr "" #: gajim/dialogs.py:4096 #, fuzzy msgid "We received an error: {}" msgstr "Вы атрымалі новае паведамленне:" #: gajim/dialogs.py:4100 #, fuzzy msgid "Error!" msgstr "Памылка Avahi" #: gajim/dialogs.py:4159 #, fuzzy msgid "Add JID" msgstr "Jabber ID:" #: gajim/dialogs.py:4232 #, python-format msgid "Privacy List %s" msgstr "Спіс прыватнасці %s" #: gajim/dialogs.py:4236 #, python-format msgid "Privacy List for %s" msgstr "Спіс прыватнасці для %s" #: gajim/dialogs.py:4238 gajim/data/gui/privacy_list_window.ui:47 msgid "Privacy List" msgstr "Спіс прыватнасці" #: gajim/dialogs.py:4309 #, fuzzy, python-format msgid "Order: %(order)s, action: %(action)s, type: %(type)s, value: %(value)s" msgstr "Парадак: %s, дзеянне: %s, тып: %s, значэнне: %s" #: gajim/dialogs.py:4314 #, fuzzy, python-format msgid "Order: %(order)s, action: %(action)s" msgstr "Парадак: %s, дзеянне: %s" #: gajim/dialogs.py:4368 msgid "Edit a rule" msgstr "Змяніць правіла" #: gajim/dialogs.py:4480 msgid "Add a rule" msgstr "Дадаць правіла" #: gajim/dialogs.py:4581 #, python-format msgid "Privacy Lists for %s" msgstr "Спісы прыватнасці для %s" #: gajim/dialogs.py:4677 msgid "Invalid List Name" msgstr "Няправільная назва спіса" #: gajim/dialogs.py:4678 msgid "You must enter a name to create a privacy list." msgstr "Вы павінны вызначыць назву для новага спіса прыватнасці." #: gajim/dialogs.py:4714 #, fuzzy msgid "You are invited to a groupchat" msgstr "Вы не ўвайшлі ў пакой групавой размовы." #: gajim/dialogs.py:4717 #, fuzzy msgid "$Contact has invited you to join a discussion" msgstr "$Contact запрасіў Вас у групавую размову %(room_jid)s" #: gajim/dialogs.py:4719 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "$Contact запрасіў Вас у групавую размову %(room_jid)s" #: gajim/dialogs.py:4728 #, python-format msgid "Comment: %s" msgstr "Каментарый: %s" #: gajim/dialogs.py:4730 msgid "Do you want to accept the invitation?" msgstr "" #: gajim/dialogs.py:4746 msgid "Reason (if you decline):" msgstr "" #: gajim/dialogs.py:4795 msgid "Choose Client Cert #PCKS12" msgstr "" #: gajim/dialogs.py:4811 gajim/accounts_window.py:657 msgid "PKCS12 Files" msgstr "" #: gajim/dialogs.py:4837 msgid "Choose Sound" msgstr "Выберыце гукавы файл" #: gajim/dialogs.py:4853 msgid "Wav Sounds" msgstr "Файлы Wav" #: gajim/dialogs.py:4883 msgid "Choose Image" msgstr "Выберыце малюнак" #: gajim/dialogs.py:4901 msgid "Images" msgstr "Малюнкі" #: gajim/dialogs.py:4972 #, fuzzy msgid "Choose Archive" msgstr "Выберыце малюнак" #: gajim/dialogs.py:4991 #, fuzzy msgid "Zip files" msgstr "Усе файлы" #: gajim/dialogs.py:5017 #, python-format msgid "When %s becomes:" msgstr "Калі %s становіцца:" #: gajim/dialogs.py:5019 #, python-format msgid "Adding Special Notification for %s" msgstr "Дадаць асабістае нагадванне для %s" #: gajim/dialogs.py:5259 msgid "an audio and video" msgstr "" #: gajim/dialogs.py:5261 msgid "an audio" msgstr "" #: gajim/dialogs.py:5263 msgid "a video" msgstr "" #: gajim/dialogs.py:5267 #, python-format msgid "" "%(contact)s wants to start %(type)s session with you. Do you want to answer " "the call?" msgstr "" #: gajim/dialogs.py:5372 gajim/dialogs.py:5408 #, fuzzy, python-format msgid "Certificate for account %s" msgstr "для рахунка %s" #: gajim/dialogs.py:5372 #, python-format msgid "" "Issued to:\n" "Common Name (CN): %(scn)s\n" "Organization (O): %(sorg)s\n" "Organizationl Unit (OU): %(sou)s\n" "Serial Number: %(sn)s\n" "\n" "Issued by:\n" "Common Name (CN): %(icn)s\n" "Organization (O): %(iorg)s\n" "Organizationl Unit (OU): %(iou)s\n" "\n" "Validity:\n" "Issued on: %(io)s\n" "Expires on: %(eo)s\n" "\n" "Fingerprint\n" "SHA-1 Fingerprint: %(sha1)s\n" "\n" "SHA256 Fingerprint: %(sha256)s\n" msgstr "" #: gajim/dialogs.py:5419 gajim/gui_interface.py:1405 #, fuzzy, python-format msgid "SSL Certificate Verification for %s" msgstr "Дадаць асабістае нагадванне для %s" #: gajim/dialogs.py:5420 gajim/dialogs.py:5437 msgid "View cert…" msgstr "" #: gajim/dialogs.py:5453 gajim/data/gui/application_menu.ui:32 #, fuzzy msgid "File Transfer" msgstr "Перадача файлаў" #: gajim/dialogs.py:5477 msgid "Requesting HTTP Upload Slot..." msgstr "" #: gajim/dialogs.py:5481 msgid "Uploading file via HTTP File Upload..." msgstr "" #: gajim/dialogs.py:5485 #, fuzzy msgid "Encrypting file..." msgstr "Шыфраванне адключанае" #: gajim/groupchat_control.py:193 gajim/groupchat_control.py:1839 #, fuzzy, python-format msgid "%(nick)s is now known as %(new_nick)s" msgstr "%s змяніў мянушку на %s" #: gajim/groupchat_control.py:219 gajim/groupchat_control.py:1988 #: gajim/history_window.py:550 gajim/common/connection_handlers_events.py:2811 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s цяпер %(status)s" #: gajim/groupchat_control.py:248 msgid "Sending private message failed" msgstr "Памылка адпраўкі прыватнага паведамлення" #: gajim/groupchat_control.py:250 #, fuzzy, python-format msgid "You are no longer in group chat \"%(room)s\" or \"%(nick)s\" has left." msgstr "Вы выйшлі з пакоя \"%s\", альбо \"%s\" сышоў." #: gajim/groupchat_control.py:640 gajim/chat_control.py:326 #: gajim/chat_control.py:330 msgid "HTTP File Upload" msgstr "" #: gajim/groupchat_control.py:642 #, fuzzy msgid "HTTP File Upload not supported by your server" msgstr "Сервер не падтрымлівае сховішча мета-кантактаў" #: gajim/groupchat_control.py:662 gajim/groupchat_control.py:2370 msgid "Changing Subject" msgstr "Змяненне тэмы" #: gajim/groupchat_control.py:663 gajim/groupchat_control.py:2371 msgid "Please specify the new subject:" msgstr "Вызначце новую тэму:" #: gajim/groupchat_control.py:670 msgid "Changing Nickname" msgstr "Змена мянушкі" #: gajim/groupchat_control.py:671 msgid "Please specify the new nickname you want to use:" msgstr "Вызначце сваю новую мянушку:" #: gajim/groupchat_control.py:688 #, fuzzy msgid "Invalid group chat JID" msgstr "Няправільны Jabber ID групавой размовы" #: gajim/groupchat_control.py:689 #, fuzzy msgid "The group chat JID has not allowed characters." msgstr "Jabber ID групавой размовы ўтрымлівае няправільныя знакі." #: gajim/groupchat_control.py:699 #, fuzzy, python-format msgid "Destroying %s" msgstr "Апісанне: %s" #: gajim/groupchat_control.py:700 msgid "" "You are going to remove this room permanently.\n" "You may specify a reason below:" msgstr "" #: gajim/groupchat_control.py:702 msgid "You may also enter an alternate venue:" msgstr "" #: gajim/groupchat_control.py:880 msgid "Insert Nickname" msgstr "Уставіць мянушку" #: gajim/groupchat_control.py:1062 gajim/chat_control.py:803 #, fuzzy msgid "and authenticated" msgstr "Аўтарызацыя" #: gajim/groupchat_control.py:1066 gajim/chat_control.py:807 #, fuzzy msgid "and NOT authenticated" msgstr "Аўтарызацыя" #: gajim/groupchat_control.py:1070 gajim/chat_control.py:811 #, python-format msgid "%(type)s encryption is active %(authenticated)s." msgstr "" #: gajim/groupchat_control.py:1113 #, fuzzy msgid "Conversation with " msgstr "Журнал размоў" #: gajim/groupchat_control.py:1115 #, fuzzy msgid "Continued conversation" msgstr "Злучэнне" #: gajim/groupchat_control.py:1473 #, fuzzy, python-format msgid "%(nick)s has set the subject to %(subject)s" msgstr "%(nick)s пакараны: %(reason)s" #: gajim/groupchat_control.py:1496 gajim/groupchat_control.py:1781 msgid "Any occupant is allowed to see your full JID" msgstr "" #: gajim/groupchat_control.py:1499 msgid "Room now shows unavailable members" msgstr "" #: gajim/groupchat_control.py:1501 msgid "Room now does not show unavailable members" msgstr "" #: gajim/groupchat_control.py:1503 msgid "A setting not related to privacy has been changed" msgstr "" #: gajim/groupchat_control.py:1507 msgid "Room logging is now enabled" msgstr "" #: gajim/groupchat_control.py:1509 msgid "Room logging is now disabled" msgstr "" #: gajim/groupchat_control.py:1511 msgid "Room is now non-anonymous" msgstr "" #: gajim/groupchat_control.py:1514 msgid "Room is now semi-anonymous" msgstr "" #: gajim/groupchat_control.py:1517 msgid "Room is now fully anonymous" msgstr "" #: gajim/groupchat_control.py:1557 gajim/chat_control.py:1268 #, python-format msgid "Pong! (%s s.)" msgstr "" #: gajim/groupchat_control.py:1774 gajim/groupchat_control.py:2398 #: gajim/roster_window.py:3129 gajim/gui_interface.py:621 #, fuzzy, python-format msgid "%(jid)s has been invited in this room" msgstr "%(who)s пакараў %(nick)s: %(reason)s" #: gajim/groupchat_control.py:1786 msgid "Room logging is enabled" msgstr "" #: gajim/groupchat_control.py:1788 #, fuzzy msgid "A new room has been created" msgstr "Новы рахунак паспяхова створаны" #: gajim/groupchat_control.py:1791 msgid "The server has assigned or modified your roomnick" msgstr "" #: gajim/groupchat_control.py:1797 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s пакараны: %(reason)s" #: gajim/groupchat_control.py:1800 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(who)s пакараў %(nick)s: %(reason)s" #: gajim/groupchat_control.py:1809 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "Для %(nick)s забаронена казанне: %(reason)s" #: gajim/groupchat_control.py:1812 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(who)s забараніў казанне для %(nick)s: %(reason)s" #: gajim/groupchat_control.py:1823 gajim/groupchat_control.py:1907 #, python-format msgid "You are now known as %s" msgstr "Вашая мянушка змененая на %s" #: gajim/groupchat_control.py:1861 gajim/groupchat_control.py:1866 #: gajim/groupchat_control.py:1872 #, fuzzy, python-format msgid "%(nick)s has been removed from the room (%(reason)s)" msgstr "%(who)s пакараў %(nick)s: %(reason)s" #: gajim/groupchat_control.py:1863 #, fuzzy msgid "affiliation changed" msgstr "Адносіны: " #: gajim/groupchat_control.py:1868 msgid "room configuration changed to members-only" msgstr "" #: gajim/groupchat_control.py:1874 msgid "system shutdown" msgstr "" #: gajim/groupchat_control.py:1928 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s by %(actor)s" msgstr "" #: gajim/groupchat_control.py:1932 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s" msgstr "" #: gajim/groupchat_control.py:1947 #, fuzzy, python-format msgid "** Role of %(nick)s has been set to %(role)s by %(actor)s" msgstr "%(who)s пакараў %(nick)s: %(reason)s" #: gajim/groupchat_control.py:1951 #, fuzzy, python-format msgid "** Role of %(nick)s has been set to %(role)s" msgstr "%(nick)s пакараны: %(reason)s" #: gajim/groupchat_control.py:1981 #, python-format msgid "%s has left" msgstr "%s сышоў" #: gajim/groupchat_control.py:1986 #, python-format msgid "%s has joined the group chat" msgstr "%s далучыўся да групавой размовы" #: gajim/groupchat_control.py:2329 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Вы сапраўды хочаце сысці з групавой размовы \"%s\"?" #: gajim/groupchat_control.py:2331 msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "Калі Вы закрыеце гэтае вакно, Вы выйдзеце з гэтай групавой размовы." #: gajim/groupchat_control.py:2550 #, python-format msgid "Kicking %s" msgstr "Пакаранне %s" #: gajim/groupchat_control.py:2551 gajim/groupchat_control.py:2847 msgid "You may specify a reason below:" msgstr "Вы можаце вызначыць прычыну:" #: gajim/groupchat_control.py:2846 #, python-format msgid "Banning %s" msgstr "Забарона казання для %s" #: gajim/chat_control.py:328 gajim/chat_control.py:332 #, fuzzy msgid "Jingle File Transfer" msgstr "Перадача файлаў" #: gajim/chat_control.py:334 #, fuzzy msgid "No File Transfer available" msgstr "Перадача файлаў" #: gajim/chat_control.py:395 #, fuzzy msgid "Show a list of formattings" msgstr "Пстрыкніце, каб уставіць сымболік (Alt+M)" #: gajim/chat_control.py:399 msgid "Formatting is not available so long as GPG is active" msgstr "" #: gajim/chat_control.py:402 #, fuzzy msgid "This contact does not support HTML" msgstr "Спіс актыўных, скончаных і спыненых перадачаў файлаў" #: gajim/chat_control.py:514 #, python-format msgid "%(type)s state : %(state)s, reason: %(reason)s" msgstr "" #: gajim/chat_control.py:655 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s з групавой размовы %(room_name)s" #: gajim/chat_control.py:903 msgid "Session negotiation cancelled" msgstr "" #: gajim/chat_control.py:913 msgid "This session WILL be archived on server" msgstr "" #: gajim/chat_control.py:915 msgid "This session WILL NOT be archived on server" msgstr "" #: gajim/chat_control.py:924 #, fuzzy msgid "This session is encrypted" msgstr "[Гэтае паведамленне зашыфраванае]" #: gajim/chat_control.py:927 msgid " and WILL be logged" msgstr "" #: gajim/chat_control.py:929 msgid " and WILL NOT be logged" msgstr "" #: gajim/chat_control.py:934 msgid "" "Remote contact's identity not verified. Click the shield button for more " "details." msgstr "" #: gajim/chat_control.py:936 #, fuzzy msgid "E2E encryption disabled" msgstr "Шыфраванне адключанае" #: gajim/chat_control.py:1235 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Вам адправіў паведамленне \"%s\"" #: gajim/chat_control.py:1237 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." msgstr "" "Калі Вы закрыеце гэтую картку з адключаным вядзеннем журналаў, гэтае " "паведамленне згубіцца." #: gajim/chat_control.py:1380 #, fuzzy, python-format msgid "" "Subject: %(subject)s\n" "%(message)s" msgstr "" "Тэма: %s\n" "%s" #: gajim/chat_control.py:1494 gajim/gui_interface.py:1197 #, python-format msgid "" "Unable to decrypt message from %s\n" "It may have been tampered with." msgstr "" #: gajim/chat_control.py:1532 #, fuzzy, python-format msgid "%(name)s is now %(status)s" msgstr "%(nick)s цяпер %(status)s" #: gajim/chat_control.py:1591 #, fuzzy msgid "File transfer" msgstr "Перадача файлаў" #: gajim/chat_control.py:1594 #, fuzzy msgid "Size" msgstr "Памер: %s" #: gajim/chat_control.py:1596 #, fuzzy msgid "Accept" msgstr "Прыняць" #: gajim/chat_control.py:1650 gajim/disco.py:1753 msgid "_Join" msgstr "_Далучыцца" #: gajim/chat_control.py:1669 gajim/roster_window.py:1991 #: gajim/gui_interface.py:1013 #, fuzzy msgid "Remote contact stopped transfer" msgstr "Выдаліць чалавека з спіса" #: gajim/chat_control.py:1671 gajim/roster_window.py:1993 #: gajim/gui_interface.py:1016 #, fuzzy msgid "Error opening file" msgstr "Памылка чытання файла:" #: gajim/roster_window.py:273 gajim/roster_window.py:1074 msgid "Merged accounts" msgstr "Аб'яднаныя рахункі" #: gajim/roster_window.py:857 gajim/roster_window.py:1757 #: gajim/roster_window.py:1759 gajim/roster_window.py:2602 #: gajim/roster_window.py:5125 gajim/message_window.py:519 #: gajim/common/contacts.py:133 gajim/common/commands.py:230 #: gajim/common/helpers.py:95 msgid "Groupchats" msgstr "Групавыя размовы" #: gajim/roster_window.py:896 gajim/roster_window.py:1665 #: gajim/roster_window.py:1698 gajim/roster_window.py:1749 #: gajim/roster_window.py:1751 gajim/roster_window.py:1912 #: gajim/roster_window.py:2575 gajim/roster_window.py:5155 gajim/disco.py:130 #: gajim/disco.py:131 gajim/disco.py:1460 gajim/common/contacts.py:135 #: gajim/common/contacts.py:378 gajim/common/helpers.py:95 msgid "Transports" msgstr "Транспарты" #: gajim/roster_window.py:2045 #, fuzzy msgid "Authorization sent" msgstr "Адпраўленая аўтарызацыя" #: gajim/roster_window.py:2046 #, fuzzy, python-format msgid "\"%s\" will now see your status." msgstr "Цяпер \"%s\" можа бачыць Ваш стан." #: gajim/roster_window.py:2069 msgid "Subscription request has been sent" msgstr "Адпраўлены запыт на падпіску" #: gajim/roster_window.py:2070 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Калі \"%s\" задаволіць гэты запыт, Вы зможаце бачыць яго стан." #: gajim/roster_window.py:2084 #, fuzzy msgid "Authorization removed" msgstr "Аўтарызацыя забраная" #: gajim/roster_window.py:2085 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Цяпер \"%s\" будзе заўсёды бачыць Вас адлучаным." #: gajim/roster_window.py:2109 #, fuzzy msgid "OpenPGP is not usable" msgstr "Немагчыма ўжыць OpenPGP на гэтым кампутары" #: gajim/roster_window.py:2110 #, python-format msgid "" "Gajim needs python-gnupg >= 0.3.8\n" "Beware there is an incompatible python package called gnupg.\n" "You will be connected to %s without OpenPGP." msgstr "" #: gajim/roster_window.py:2318 gajim/roster_window.py:3625 msgid "You are participating in one or more group chats" msgstr "Вы ўдзельнічаеце ў некалькіх групавых размовах" #: gajim/roster_window.py:2319 gajim/roster_window.py:3626 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" msgstr "" "Змяніўшы свой стан на нябачны, Вы такім чынам выйдзеце з гэтых групавых " "размоў. Вы сапраўды хочаце стаць нябачным?" #: gajim/roster_window.py:2346 msgid "desync'ed" msgstr "" #: gajim/roster_window.py:2416 msgid "Really quit Gajim?" msgstr "" #: gajim/roster_window.py:2417 #, fuzzy msgid "Are you sure you want to quit Gajim?" msgstr "Вы сапраўды хочаце сысці з групавой размовы \"%s\"?" #: gajim/roster_window.py:2418 msgid "Always close Gajim" msgstr "" #: gajim/roster_window.py:2505 #, fuzzy msgid "You have running file transfers" msgstr "Скасаваць перадачу файла" #: gajim/roster_window.py:2506 msgid "" "If you quit now, the file(s) being transferred will be stopped. Do you still " "want to quit?" msgstr "" #: gajim/roster_window.py:2537 gajim/roster_window.py:2828 msgid "You have unread messages" msgstr "Ёсць нечытаныя паведамленні" #: gajim/roster_window.py:2538 #, fuzzy msgid "" "Messages will only be available for reading them later if you have history " "enabled and contact is in your roster." msgstr "" "Вы зможаце прачытаць нечытаныя паведамленні толькі з уключаным вядзеннем " "журналаў размоў." #: gajim/roster_window.py:2829 msgid "You must read them before removing this transport." msgstr "Вы павінны прачытаць іх перад выдаленнем гэтага транспарта." #: gajim/roster_window.py:2832 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Транспарт \"%s\" будзе выдалены" #: gajim/roster_window.py:2833 msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." msgstr "Вы больш не зможаце мець зносіны з людзьмі праз гэты транспарт." #: gajim/roster_window.py:2836 msgid "Transports will be removed" msgstr "Транспарты будуць выдаленыя" #: gajim/roster_window.py:2841 #, fuzzy, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " "these transports: %s" msgstr "Вы больш не зможаце мець зносіны з людзьмі праз гэтыя транспарты: %s" #: gajim/roster_window.py:2892 #, fuzzy msgid "You are about to block a contact. Are you sure you want to continue?" msgstr "Вы ствараеце мета-кантакт. Вы сапраўды хочаце працягнуць?" #: gajim/roster_window.py:2894 msgid "" "This contact will see you offline and you will not receive messages it sends " "you." msgstr "" #: gajim/roster_window.py:2934 msgid "Rename Contact" msgstr "Змяніць імя чалавека" #: gajim/roster_window.py:2935 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Вызначце новую мянушку для чалавека %s." #: gajim/roster_window.py:2942 msgid "Rename Group" msgstr "Змяніць назву групы" #: gajim/roster_window.py:2943 #, python-format msgid "Enter a new name for group %s" msgstr "Вызначце новую назву групы %s" #: gajim/roster_window.py:2988 msgid "Remove Group" msgstr "Выдаліць групу" #: gajim/roster_window.py:2989 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Хочаце выдаліць групу %s з кантактнага ліста?" #: gajim/roster_window.py:2990 #, fuzzy msgid "Also remove all contacts in this group from your roster" msgstr "Таксама выдаліць усіх людзей з гэтай групы" #: gajim/roster_window.py:3029 msgid "Assign OpenPGP Key" msgstr "Прызначыць ключ OpenPGP" #: gajim/roster_window.py:3030 msgid "Select a key to apply to the contact" msgstr "Выберыце ключ для гэтага чалавека" #: gajim/roster_window.py:3436 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "\"%s\" будзе выдалены з Вашага кантактнага ліста" #: gajim/roster_window.py:3438 #, python-format msgid "You are about to remove \"%(name)s\" (%(jid)s) from your roster.\n" msgstr "" #: gajim/roster_window.py:3443 #, fuzzy msgid "" "By removing this contact you also remove authorization resulting in them " "always seeing you as offline." msgstr "" "Выдаліўшы гэтых людзей:%s\n" "з Вашага кантактнага ліста, Вы такім чынам таксама прыбярэце ў іх " "аўтарызацыю, і яны заўсёды будуць бачыць Вас адлучаным." #: gajim/roster_window.py:3449 #, fuzzy msgid "Do you want to continue?" msgstr "Што Вы хочаце зрабіць?" #: gajim/roster_window.py:3453 #, fuzzy msgid "" "By removing this contact you also by default remove authorization resulting " "in them always seeing you as offline." msgstr "" "Выдаліўшы гэтага чалавека з Вашага кантактнага ліста, Вы звычайна такім " "чынам таксама прыбярэце ў яго аўтарызацыю, і ён заўсёды будзе бачыць Вас " "адлучаным." #: gajim/roster_window.py:3456 msgid "I want this contact to know my status after removal" msgstr "Я хачу, каб гэты чалавек мог бачыць мой стан пасля выдалення" #: gajim/roster_window.py:3460 msgid "Contacts will be removed from your roster" msgstr "Людзі будуць выдаленыя з Вашага кантактнага ліста" #: gajim/roster_window.py:3465 #, python-format msgid "" "By removing these contacts:%s\n" "you also remove authorization resulting in them always seeing you as offline." msgstr "" "Выдаліўшы гэтых людзей:%s\n" "з Вашага кантактнага ліста, Вы такім чынам таксама прыбярэце ў іх " "аўтарызацыю, і яны заўсёды будуць бачыць Вас адлучаным." #: gajim/roster_window.py:3523 #, fuzzy msgid "" "You are about to send a custom status. Are you sure you want to continue?" msgstr "Вы ствараеце мета-кантакт. Вы сапраўды хочаце працягнуць?" #: gajim/roster_window.py:3525 #, python-format msgid "" "This contact will temporarily see you as %(status)s, but only until you " "change your status. Then they will see your global status." msgstr "" #: gajim/roster_window.py:3544 msgid "No account available" msgstr "Рахункаў няма" #: gajim/roster_window.py:3545 msgid "You must create an account before you can chat with other contacts." msgstr "Вы павінны стварыць рахунак, каб размаўляць з іншымі людзьмі." #: gajim/roster_window.py:3676 gajim/gui_interface.py:2065 #: gajim/dialog_messages.py:64 msgid "You cannot join a group chat while you are invisible" msgstr "Вы не можаце ўдзельнічаць у групавой размове нябачным" #: gajim/roster_window.py:4178 msgid "Metacontacts storage not supported by your server" msgstr "Сервер не падтрымлівае сховішча мета-кантактаў" #: gajim/roster_window.py:4180 #, fuzzy msgid "" "Your server does not support storing metacontacts information. So this " "information will not be saved on next reconnection." msgstr "" "Сервер не падтрымлівае мета-кантакты. Гэтае настаўленне не захаваецца для " "наступных сеансаў." #: gajim/roster_window.py:4276 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "Вы ствараеце мета-кантакт. Вы сапраўды хочаце працягнуць?" #: gajim/roster_window.py:4278 #, fuzzy msgid "" "Metacontacts are a way to regroup several contacts in one line. Generally it " "is used when the same person has several XMPP accounts or transport accounts." msgstr "" "Мета-кантакты дазваляюць згрупаваць некалькі кантактаў у адным элеменце " "кантактнага ліста. Звычайна ўжываецца, калі ў чалавека некалькі рахункаў " "Jabber альбо некалькі транспартных рахункаў." #: gajim/roster_window.py:4400 #, fuzzy msgid "Invalid file URI:" msgstr "Няправільны файл" #: gajim/roster_window.py:4412 #, fuzzy, python-format msgid "Do you want to send this file to %s:" msgid_plural "Do you want to send these files to %s:" msgstr[0] "%s хоча адправіць Вам файл:" msgstr[1] "%s хоча адправіць Вам файл:" msgstr[2] "%s хоча адправіць Вам файл:" #: gajim/roster_window.py:4552 #, fuzzy, python-format msgid "Send %(from)s to %(to)s" msgstr "Адправіць %s" #: gajim/roster_window.py:4565 #, fuzzy, python-format msgid "Make %s first contact" msgstr "Зрабіць %s і %s мета-кантактамі" #: gajim/roster_window.py:4570 #, fuzzy, python-format msgid "Make %(contact1)s and %(contact2)s metacontacts" msgstr "Зрабіць %s і %s мета-кантактамі" #: gajim/roster_window.py:4951 gajim/roster_window.py:5049 msgid "_Change Status Message" msgstr "З_мяніць паведамленне аб стане" #: gajim/roster_window.py:4971 #, fuzzy msgid "Publish Tune" msgstr "_Абнавіць" #: gajim/roster_window.py:4982 #, fuzzy msgid "Publish Location" msgstr "_Абнавіць" #: gajim/roster_window.py:4994 #, fuzzy msgid "Configure Services…" msgstr "_Праглядзець сервісы..." #: gajim/roster_window.py:5127 msgid "_Maximize All" msgstr "" #: gajim/roster_window.py:5134 gajim/roster_window.py:5296 msgid "Send Group M_essage" msgstr "Ад_правіць групавое паведамленне" #: gajim/roster_window.py:5141 msgid "To all users" msgstr "Усім карыстальнікам" #: gajim/roster_window.py:5145 msgid "To all online users" msgstr "Усім актыўным карыстальнікам" #: gajim/roster_window.py:5157 gajim/roster_window.py:5302 #: gajim/data/gui/gc_occupants_menu.ui:110 #: gajim/data/gui/contact_context_menu.ui:36 msgid "In_vite to" msgstr "За_прасіць" #: gajim/roster_window.py:5312 #, fuzzy msgid "_Manage Contacts" msgstr "Змяніць імя чалавека" #: gajim/roster_window.py:5318 #, fuzzy msgid "Edit _Groups…" msgstr "Змяніць _групы" #: gajim/roster_window.py:5339 gajim/data/gui/filetransfers.ui:11 #: gajim/data/gui/remove_account_window.ui:137 msgid "_Remove" msgstr "Вы_даліць" #: gajim/roster_window.py:5377 msgid "_Maximize" msgstr "" #: gajim/roster_window.py:5384 #, fuzzy msgid "_Reconnect" msgstr "Чалавек адлучыўся" #: gajim/roster_window.py:5389 gajim/data/gui/gc_control_popup_menu.ui:120 #, fuzzy msgid "_Disconnect" msgstr "Чалавек адлучыўся" #: gajim/roster_window.py:5405 gajim/data/gui/gc_occupants_menu.ui:170 #: gajim/data/gui/gc_control_popup_menu.ui:113 #: gajim/data/gui/contact_context_menu.ui:228 msgid "_History" msgstr "_Журнал" #: gajim/roster_window.py:5481 gajim/data/gui/application_menu.ui:86 msgid "History Manager" msgstr "Кіраўнік журналаў" #: gajim/roster_window.py:5489 msgid "_Join New Group Chat" msgstr "_Удзельнічаць у групавой размове" #: gajim/gajim.py:74 #, fuzzy msgid "Show the application's version" msgstr "_Значка панэлі паведамленняў" #: gajim/gajim.py:77 #, fuzzy msgid "Show only critical errors" msgstr "Паказваць толькі ў _галоўным вакне" #: gajim/gajim.py:80 msgid "Separate profile files completely (even history db and plugins)" msgstr "" #: gajim/gajim.py:84 msgid "Print XML stanzas and other debug information" msgstr "" #: gajim/gajim.py:88 #, fuzzy msgid "Use defined profile in configuration directory" msgstr "Адмысловы рэдактар настаўленняў" #: gajim/gajim.py:92 #, fuzzy msgid "Set configuration directory" msgstr "Настаўленні пакоя" #: gajim/gajim.py:95 msgid "Configure logging system" msgstr "" #: gajim/gajim.py:98 #, fuzzy msgid "Show all warnings" msgstr "Паказаць нягледжаныя _падзеі" #: gajim/gajim.py:101 msgid "Open IPython shell" msgstr "" #: gajim/gajim.py:104 msgid "Pops up a window with the next pending event" msgstr "Паказаць выплыўнае вакно з наступнай нягледжанай падзеяй" #: gajim/gajim.py:107 gajim/data/gui/shortcuts_window.ui:202 #, fuzzy msgid "Start a new chat" msgstr "Пачаць размову" #: gajim/gajim.py:180 gajim/gui_interface.py:128 msgid "Database Error" msgstr "" #: gajim/history_sync.py:217 #, fuzzy msgid "How far back do you want to go?" msgstr "Што Вы хочаце зрабіць?" #: gajim/history_sync.py:222 msgid "One Month" msgstr "" #: gajim/history_sync.py:223 msgid "Three Months" msgstr "" #: gajim/history_sync.py:224 msgid "One Year" msgstr "" #: gajim/history_sync.py:225 msgid "Everything" msgstr "" #: gajim/history_sync.py:254 #, fuzzy msgid "Connecting..." msgstr "Злучэнне" #: gajim/history_sync.py:266 #, fuzzy, python-format msgid "%(received)s of %(max)s" msgstr "Перадача файла %(filename)s ад %(name)s спыненая." #: gajim/history_sync.py:270 #, fuzzy, python-format msgid "Downloaded %s Messages" msgstr "%d нечытанае паведамленне" #: gajim/history_sync.py:290 #, python-brace-format msgid "" "\n" " Finshed synchronising your History.\n" " {received} Messages downloaded.\n" " " msgstr "" #: gajim/history_sync.py:297 msgid "" "\n" " Gajim is fully synchronised\n" " with the Archive.\n" " " msgstr "" #: gajim/history_sync.py:304 msgid "" "\n" " There is already a synchronisation in\n" " progress. Please try later.\n" " " msgstr "" #: gajim/config.py:150 gajim/config.py:156 gajim/config.py:616 #: gajim/data/gui/preferences_window.ui:68 #: gajim/data/gui/preferences_window.ui:85 msgid "Disabled" msgstr "Адключана" #: gajim/config.py:411 gajim/config.py:415 gajim/config.py:1942 msgid "Default" msgstr "Прадвызначана" #: gajim/config.py:1128 msgid "status message title" msgstr "загаловак паведамлення аб змене стану" #: gajim/config.py:1129 msgid "status message text" msgstr "тэкст паведамлення аб змене стану" #: gajim/config.py:1517 #, python-format msgid "Edit %s" msgstr "Змяніць %s" #: gajim/config.py:1519 #, python-format msgid "Register to %s" msgstr "Зарэгістравацца на %s" #: gajim/config.py:1555 msgid "Ban List" msgstr "Чорны спіс" #: gajim/config.py:1556 msgid "Member List" msgstr "Спіс удзельнікаў" #: gajim/config.py:1556 msgid "Owner List" msgstr "Спіс уладальнікаў" #: gajim/config.py:1557 msgid "Administrator List" msgstr "Спіс адміністратараў" #: gajim/config.py:1631 msgid "Reason" msgstr "Прычына" #: gajim/config.py:1638 msgid "Nick" msgstr "Мянушка" #: gajim/config.py:1644 msgid "Role" msgstr "Роля" #: gajim/config.py:1670 #, fuzzy msgid "Banning…" msgstr "Забараніць казанне..." #: gajim/config.py:1672 msgid "" "Whom do you want to ban?\n" "\n" msgstr "" "Каму Вы хочаце забараніць казанне?\n" "\n" #: gajim/config.py:1674 #, fuzzy msgid "Adding Member…" msgstr "Дадаць ўдзельніка..." #: gajim/config.py:1675 msgid "" "Whom do you want to make a member?\n" "\n" msgstr "" "Каго Вы хочаце зрабіць удзельнікам?\n" "\n" #: gajim/config.py:1677 #, fuzzy msgid "Adding Owner…" msgstr "Дадаць уладальніка..." #: gajim/config.py:1678 msgid "" "Whom do you want to make an owner?\n" "\n" msgstr "" "Каго Вы хочаце зрабіць уладальнікам?\n" "\n" #: gajim/config.py:1680 #, fuzzy msgid "Adding Administrator…" msgstr "Дадаць адміністратара..." #: gajim/config.py:1681 msgid "" "Whom do you want to make an administrator?\n" "\n" msgstr "" "Каго Вы хочаце зрабіць адміністратарам?\n" "\n" #: gajim/config.py:1682 #, fuzzy msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" "2. user@domain (any resource matches).\n" "3. domain/resource (only that resource matches).\n" "4. domain (the domain itself matches, as does any user@domain,\n" "domain/resource, or address containing a subdomain)." msgstr "" "Мажлівыя варыянты:\n" "1. user@domain/resource (толькі гэты рэсурс).\n" "2. user@domain (любы рэсурс).\n" "3. domain/resource (толькі гэты рэсурс).\n" "4. domain (гэты домэн user@domain,\n" "domain/resource ці адрас паддамена)." #: gajim/config.py:1783 #, python-format msgid "Removing %s account" msgstr "Выдаленне рахунка %s" #: gajim/config.py:1798 #, fuzzy msgid "Account is disabled" msgstr "Шыфраванне адключанае" #: gajim/config.py:1799 msgid "To unregister from a server, account must be enabled." msgstr "" #: gajim/config.py:1813 gajim/gui_interface.py:314 gajim/gui_interface.py:748 msgid "Password Required" msgstr "Патрабуецца пароль" #: gajim/config.py:1814 gajim/gui_interface.py:733 #, python-format msgid "Enter your password for account %s" msgstr "Увядзіце пароль для рахунка %s" #: gajim/config.py:1815 gajim/gui_interface.py:748 msgid "Save password" msgstr "Захаваць пароль" #: gajim/config.py:1826 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Рахунак \"%s\" злучаны з серверам" #: gajim/config.py:1827 msgid "If you remove it, the connection will be lost." msgstr "Калі Вы выдаліце яго, згубіцца злучэнне." #: gajim/config.py:1842 #, fuzzy, python-format msgid "Connection to server %s failed" msgstr "Памылка злучэння" #: gajim/config.py:1843 #, fuzzy msgid "What would you like to do?" msgstr "Што Вы хочаце зрабіць?" #: gajim/config.py:1844 #, fuzzy msgid "Remove only from Gajim" msgstr "Выдаліць рахунак _толькі для Gajim" #: gajim/config.py:1845 msgid "Don't remove anything. I'll try again later" msgstr "" #: gajim/config.py:1942 msgid "?print_status:All" msgstr "?print_status:Усе" #: gajim/config.py:1943 msgid "Enter and leave only" msgstr "Увайсці і выйсці" #: gajim/config.py:1944 msgid "?print_status:None" msgstr "?print_status:Няма" #: gajim/config.py:2010 msgid "New Group Chat" msgstr "Новая групавая размова" #: gajim/config.py:2046 msgid "This bookmark has invalid data" msgstr "Гэтая закладка мае няправільныя звесткі" #: gajim/config.py:2047 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "Запоўніце палі сервера і пакоя альбо выдаліце гэтую закладку." #: gajim/config.py:2170 gajim/config.py:2186 gajim/config.py:2197 #: gajim/config.py:2225 #, fuzzy msgid "Character not allowed" msgstr "Такая мянушка не дазволеная: %s" #: gajim/config.py:2185 gajim/config.py:2196 gajim/config.py:2475 #, fuzzy msgid "Invalid server" msgstr "Няправільнае імя карыстальніка" #: gajim/config.py:2224 #, fuzzy msgid "Invalid room" msgstr "Няправільны элемент" #: gajim/config.py:2389 msgid "Account has been added successfully" msgstr "Рахунак паспяхова дададзены" #: gajim/config.py:2390 gajim/config.py:2396 #, fuzzy msgid "" "You can set advanced account options by pressing the Advanced button, or " "later by choosing the Accounts menu item under the Edit menu from the main " "window." msgstr "" "Вы можаце зараз змяніць адмысловыя настаўленні, націснуўшы кнопку " "\"Адмысловыя\", альбо пазней, выбраўшы элемент \"Рахункі\" ў меню \"Змяніць" "\" галоўнага вакна." #: gajim/config.py:2395 msgid "Your new account has been created successfully" msgstr "Новы рахунак паспяхова створаны" #: gajim/config.py:2433 msgid "Invalid username" msgstr "Няправільнае імя карыстальніка" #: gajim/config.py:2435 msgid "You must provide a username to configure this account." msgstr "" "Вы павінны пазначыць імя карыстальніка, каб змяніць настаўленні гэтага " "рахунка." #: gajim/config.py:2476 #, fuzzy msgid "Please provide a server on which you want to register." msgstr "Вызначце сваю новую мянушку:" #: gajim/config.py:2499 msgid "Invalid entry" msgstr "Няправільны элемент" #: gajim/config.py:2500 msgid "Custom port must be a port number." msgstr "Адмысловы порт павінны быць нумарам порта." #: gajim/config.py:2532 gajim/gui_interface.py:1360 #, fuzzy msgid "Certificate Already in File" msgstr "Чалавек ужо ёсць у кантактным лісце" #: gajim/config.py:2533 gajim/gui_interface.py:1361 #, python-format msgid "This certificate is already in file %s, so it's not added again." msgstr "" #: gajim/config.py:2626 #, python-format msgid "" "Security Warning\n" "\n" "The authenticity of the %(hostname)s SSL certificate could be invalid.\n" "SSL Error: %(error)s\n" "Do you still want to connect to this server?" msgstr "" #: gajim/config.py:2632 #, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA-1 fingerprint of the certificate:\n" "%(sha1)s\n" "SHA-256 fingerprint of the certificate:\n" "%(sha256)s" msgstr "" #: gajim/config.py:2666 gajim/config.py:2700 msgid "An error occurred during account creation" msgstr "Адбылася памылка ў часе стварэння рахунка" #: gajim/config.py:2763 msgid "Account name is in use" msgstr "Назва рахунка ўжо скарыстаная" #: gajim/config.py:2764 msgid "You already have an account using this name." msgstr "Вы ўжо маеце рахунак з такой назваю." #: gajim/config.py:2896 msgid "PEP node was not removed" msgstr "" #: gajim/config.py:2897 #, python-format msgid "PEP node %(node)s was not removed: %(message)s" msgstr "" #: gajim/config.py:2925 #, fuzzy, python-format msgid "Configure %s" msgstr "_Працягнуць" #: gajim/config.py:2942 gajim/plugins/gui.py:95 msgid "Active" msgstr "Актыўны" #: gajim/config.py:2950 msgid "Event" msgstr "Падзея" #: gajim/config.py:2984 #, fuzzy msgid "Attention Message Received" msgstr "Атрыманае першае паведамленне" #: gajim/config.py:2985 msgid "First Message Received" msgstr "Атрыманае першае паведамленне" #: gajim/config.py:2986 #, fuzzy msgid "Next Message Received Focused" msgstr "Атрыманае наступнае паведамленне" #: gajim/config.py:2988 #, fuzzy msgid "Next Message Received Unfocused" msgstr "Атрыманае наступнае паведамленне" #: gajim/config.py:2989 msgid "Contact Connected" msgstr "Чалавек далучыўся" #: gajim/config.py:2990 msgid "Contact Disconnected" msgstr "Чалавек адлучыўся" #: gajim/config.py:2991 msgid "Message Sent" msgstr "Паведамленне адпраўленае" #: gajim/config.py:2992 msgid "Group Chat Message Highlight" msgstr "Фарбаванае паведамленне ў групавой размове" #: gajim/config.py:2993 msgid "Group Chat Message Received" msgstr "Новае паведамленне ў групавой размове" #: gajim/tooltips.py:240 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s гэтай групавой размовы" #: gajim/tooltips.py:269 gajim/common/helpers.py:473 msgid "?Group Chat Contact Affiliation:None" msgstr "?Адносіны ўдзельніка групавой размовы:Няма" #: gajim/tooltips.py:271 gajim/common/helpers.py:479 msgid "Member" msgstr "Удзельнік" #: gajim/tooltips.py:273 gajim/common/helpers.py:477 msgid "Administrator" msgstr "Адміністратар" #: gajim/tooltips.py:275 gajim/common/helpers.py:475 msgid "Owner" msgstr "Уладальнік" #: gajim/tooltips.py:433 msgid " [blocked]" msgstr "" #: gajim/tooltips.py:437 msgid " [minimized]" msgstr "" #: gajim/tooltips.py:609 #, fuzzy msgid "Connected" msgstr "Злучэнне" #: gajim/tooltips.py:611 #, fuzzy msgid "Disconnected" msgstr "Чалавек адлучыўся" #: gajim/tooltips.py:660 #, fuzzy msgid "?Noun:Download" msgstr "Сцягнуць" #: gajim/tooltips.py:666 #, fuzzy msgid "?Noun:Upload" msgstr "Загрузіць" #: gajim/tooltips.py:673 msgid "Type: " msgstr "Тып: " #: gajim/tooltips.py:679 msgid "Transferred: " msgstr "Перададзена: " #: gajim/tooltips.py:682 gajim/tooltips.py:699 msgid "Not started" msgstr "Не пачатая" #: gajim/tooltips.py:684 msgid "Stopped" msgstr "Спыненая" #: gajim/tooltips.py:686 gajim/tooltips.py:689 msgid "Completed" msgstr "Скончаная" #: gajim/tooltips.py:692 msgid "?transfer status:Paused" msgstr "?transfer status:Прыпыненая" #: gajim/tooltips.py:695 msgid "Stalled" msgstr "Марнаванне часу" #: gajim/tooltips.py:697 msgid "Transferring" msgstr "Перадача" #: gajim/tooltips.py:700 msgid "Status: " msgstr "Стан: " #: gajim/tooltips.py:732 gajim/common/helpers.py:389 #, fuzzy msgid "?user status:Available" msgstr "?transfer status:Прыпыненая" #: gajim/tooltips.py:734 gajim/common/helpers.py:384 msgid "Free for Chat" msgstr "Магу размаўляць" #: gajim/tooltips.py:736 gajim/common/commands.py:117 #: gajim/common/helpers.py:396 #: gajim/command_system/implementation/standard.py:138 msgid "Away" msgstr "Сышоў" #: gajim/tooltips.py:738 gajim/common/helpers.py:374 msgid "Busy" msgstr "Заняты" #: gajim/tooltips.py:740 gajim/common/helpers.py:379 msgid "Not Available" msgstr "Мяне няма" #: gajim/tooltips.py:742 gajim/common/helpers.py:401 msgid "Offline" msgstr "Адключаны" #: gajim/advanced_configuration_window.py:88 msgid "Activated" msgstr "Актывізаваны" #: gajim/advanced_configuration_window.py:88 msgid "Deactivated" msgstr "Неактывізаваны" #: gajim/advanced_configuration_window.py:90 msgid "Boolean" msgstr "Лагічнае" #: gajim/advanced_configuration_window.py:91 msgid "Integer" msgstr "Цэлы лік" #: gajim/advanced_configuration_window.py:92 msgid "Text" msgstr "Тэкставае" #: gajim/advanced_configuration_window.py:93 #: gajim/data/gui/groupchat_control.ui:54 gajim/data/gui/chat_control.ui:334 msgid "Color" msgstr "Колер" #: gajim/advanced_configuration_window.py:104 msgid "Preference Name" msgstr "Назва ўласцівасці" #: gajim/advanced_configuration_window.py:111 msgid "Value" msgstr "Значэнне" #: gajim/advanced_configuration_window.py:120 msgid "Type" msgstr "Тып" #: gajim/advanced_configuration_window.py:176 msgid "(None)" msgstr "(Няма)" #: gajim/advanced_configuration_window.py:307 msgid "Hidden" msgstr "Схаваны" #: gajim/logind_listener.py:58 msgid "Machine going to sleep" msgstr "" #: gajim/logind_listener.py:90 msgid "Disconnect from the network" msgstr "" #: gajim/history_window.py:339 #, python-format msgid "Conversation History with %s" msgstr "Журнал размоў %s" #: gajim/history_window.py:361 gajim/data/gui/history_window.ui:7 msgid "Conversation History" msgstr "Журнал размоў" #: gajim/history_window.py:390 gajim/history_window.py:443 msgid "Disk Error" msgstr "" #: gajim/history_window.py:546 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s цяпер %(status)s: %(status_msg)s" #: gajim/history_window.py:557 #, fuzzy, python-format msgid "Error: %s" msgstr "Памылка: %s" #: gajim/history_window.py:559 msgid "Error" msgstr "" #: gajim/history_window.py:561 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Цяперашні стан: %(status)s: %(status_msg)s" #: gajim/history_window.py:564 #, python-format msgid "Status is now: %(status)s" msgstr "Цяперашні стан: %(status)s" #: gajim/history_window.py:585 gajim/conversation_textview.py:1338 #, python-format msgid "Subject: %s\n" msgstr "Тэма: %s\n" #: gajim/statusicon.py:215 #, fuzzy msgid "_Change Status Message…" msgstr "З_мяніць паведамленне аб стане" #: gajim/statusicon.py:252 gajim/statusicon.py:302 gajim/statusicon.py:309 #, python-format msgid "using account %s" msgstr "выкарыстоўвае рахунак %s" #: gajim/statusicon.py:319 #, fuzzy msgid "_Manage Bookmarks…" msgstr "Кіраванне закладкамі" #: gajim/statusicon.py:332 #, fuzzy msgid "Hide _Roster" msgstr "Няма ў спісе" #: gajim/statusicon.py:336 msgid "Show _Roster" msgstr "Паказаць _галоўнае вакно" #: gajim/statusicon.py:344 msgid "Hide this menu" msgstr "Схаваць гэтае меню" #: gajim/dataforms_widget.py:587 #, fuzzy msgid "Unable to load image" msgstr "Немагчыма загрузіць модуль idle" #: gajim/dataforms_widget.py:589 #, fuzzy, python-format msgid "Media type not supported: %s" msgstr "Пашырэнне не падтрымліваецца" #: gajim/dataforms_widget.py:604 msgid "This field is required" msgstr "" #: gajim/dataforms_widget.py:658 msgid "new@jabber.id" msgstr "" #: gajim/dataforms_widget.py:661 gajim/dataforms_widget.py:663 #, python-format msgid "new%d@jabber.id" msgstr "" #: gajim/server_info.py:130 #, python-format msgid "%(days)s days, %(hours)s hours" msgstr "" #: gajim/server_info.py:187 gajim/accounts_window.py:537 #: gajim/accounts_window.py:638 #, fuzzy msgid "Hostname" msgstr "Назва вузла: " #: gajim/server_info.py:188 #, fuzzy msgid "Server Software" msgstr "Здольнасці сервера" #: gajim/server_info.py:189 #, fuzzy msgid "Server Uptime" msgstr "Захаваць у: %s" #: gajim/server_info.py:227 msgid "" "\n" "Disabled in config" msgstr "" #: gajim/disco.py:69 msgid "This service has not yet responded with detailed information" msgstr "Гэты сервіс яшчэ не адказаў на запыт падрабязных звестак" #: gajim/disco.py:70 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" msgstr "" "Гэты сервіс не дае падрабязных звестак.\n" "Хутчэй за ўсё, гэты сервіс састарэлы ці зламаны" #: gajim/disco.py:129 msgid "Others" msgstr "Іншыя" #: gajim/disco.py:133 msgid "Conference" msgstr "Канферэнцыі" #: gajim/disco.py:537 msgid "Without a connection, you can not browse available services" msgstr "" "Вы не можаце праглядзець спіс даступных сервісаў, не злучыўшыся з серверам." #: gajim/disco.py:626 #, python-format msgid "Service Discovery using account %s" msgstr "Пошук сервісаў для рахунка %s" #: gajim/disco.py:628 msgid "Service Discovery" msgstr "Пошук сервісаў" #: gajim/disco.py:732 msgid "The service could not be found" msgstr "Немагчыма знайсці сервіс" #: gajim/disco.py:733 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." msgstr "" "Па вызначаным адрасе няма сервісаў, альбо яны не адказваюць на запыты. " "Праверце адрас і паспрабуйце зноў." #: gajim/disco.py:739 gajim/disco.py:1091 msgid "The service is not browsable" msgstr "Немагчыма праглядзець сервіс" #: gajim/disco.py:740 msgid "This type of service does not contain any items to browse." msgstr "Гэты сервіс не ўтрымлівае ў сабе элементаў." #: gajim/disco.py:781 gajim/disco.py:791 #, fuzzy msgid "Invalid Server Name" msgstr "Няправільнае імя карыстальніка" #: gajim/disco.py:849 #, fuzzy, python-format msgid "Browsing %(address)s using account %(account)s" msgstr "Прагляд %s для рахунка %s" #: gajim/disco.py:896 #, fuzzy msgid "Browse" msgstr "_Праглядзець" #: gajim/disco.py:1092 msgid "This service does not contain any items to browse." msgstr "Гэты сервіс не ўтрымлівае ў сабе элементаў, якія можна праглядзець." #: gajim/disco.py:1304 #, fuzzy msgid "Execute Command" msgstr "_Выканаць загад..." #: gajim/disco.py:1308 gajim/disco.py:1466 msgid "Re_gister" msgstr "Зарэ_гістравацца" #: gajim/disco.py:1317 gajim/data/gui/join_groupchat_window.ui:186 #: gajim/data/gui/join_groupchat_window.ui:325 #, fuzzy msgid "Join" msgstr "_Далучыцца" #: gajim/disco.py:1326 gajim/data/gui/search_window.ui:23 msgid "Search" msgstr "Пошук" #: gajim/disco.py:1464 msgid "_Edit" msgstr "_Змяніць" #: gajim/disco.py:1507 #, fuzzy, python-format msgid "Scanning %(current)d / %(total)d.." msgstr "Пошук у %d / %d.." #: gajim/disco.py:1703 msgid "Users" msgstr "Карыстальнікі" #: gajim/disco.py:1711 msgid "Description" msgstr "Апісанне" #: gajim/disco.py:1719 msgid "Id" msgstr "Id" #: gajim/disco.py:1749 gajim/data/gui/gc_control_popup_menu.ui:99 #, fuzzy msgid "_Bookmark" msgstr "_Змясціць у закладках" #: gajim/disco.py:1783 msgid "Bookmark already set" msgstr "Закладка ўжо ўсталяваная" #: gajim/disco.py:1784 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Групавая размова \"%s\" ужо знаходзіцца ў Вашых закладках." #: gajim/disco.py:1794 msgid "Bookmark has been added successfully" msgstr "Закладка паспяхова дададзеная" #: gajim/disco.py:1795 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "" "Вы можаце рэдагаваць спіс Вашых закладак праз меню \"Дзеянні\" галоўнага " "вакна." #: gajim/disco.py:1987 msgid "Subscribed" msgstr "Падпісаны" #: gajim/disco.py:1996 #, fuzzy msgid "Node" msgstr "Ніякі" #: gajim/disco.py:2063 msgid "New post" msgstr "Новы допіс" #: gajim/disco.py:2069 msgid "_Subscribe" msgstr "Падп_ісацца" #: gajim/disco.py:2075 msgid "_Unsubscribe" msgstr "_Адпісацца" #: gajim/conversation_textview.py:329 #, fuzzy msgid "" "Text below this line is what has been said since the\n" "last time you paid attention to this group chat" msgstr "Тэкст пад гэтай рысаю ёсць тэкстам, які Вы яшчэ не бачылі" #: gajim/conversation_textview.py:550 #, fuzzy msgid "_Quote" msgstr "_Выйсці" #: gajim/conversation_textview.py:558 #, python-format msgid "_Actions for \"%s\"" msgstr "_Дзеянні для \"%s\"" #: gajim/conversation_textview.py:572 msgid "Read _Wikipedia Article" msgstr "Прачытаць артыкул у _Вікіпедыі" #: gajim/conversation_textview.py:577 msgid "Look it up in _Dictionary" msgstr "Шукаць у _слоўніку" #: gajim/conversation_textview.py:594 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "У адрасе слоўніка не хапае \"%s\", і гэта не Вікі-слоўнік" #: gajim/conversation_textview.py:608 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "У адрасе пошуку ў Сеціве не хапае \"%s\"" #: gajim/conversation_textview.py:611 msgid "Web _Search for it" msgstr "_Шукаць у Сеціве" #: gajim/conversation_textview.py:617 msgid "Open as _Link" msgstr "Адкрыць _спасылку" #: gajim/conversation_textview.py:847 msgid "URL:" msgstr "" #: gajim/conversation_textview.py:1021 #, fuzzy msgid "Invalid URL" msgstr "Няправільны JID" #: gajim/conversation_textview.py:1106 msgid "" "Message corrected. Original message:\n" "{}" msgstr "" #: gajim/conversation_textview.py:1250 #, fuzzy, python-format msgid "Yesterday" msgid_plural "%(nb_days)i days ago" msgstr[0] "Учора" msgstr[1] "Учора" msgstr[2] "Учора" #: gajim/message_textview.py:43 #, fuzzy msgid "Write a message.." msgstr "Новае прыватнае паведамленне" #: gajim/message_window.py:245 #, fuzzy msgid "You are going to close several tabs" msgstr "Вы не злучаны з серверам" #: gajim/message_window.py:246 #, fuzzy msgid "Do you really want to close them all?" msgstr "Вы сапраўды хочаце выдаліць выбранае паведамленне?" #: gajim/message_window.py:517 #, fuzzy msgid "?Noun:Chats" msgstr "Групавыя размовы" #: gajim/message_window.py:521 msgid "Private Chats" msgstr "Прыватныя размовы" #: gajim/message_window.py:527 msgid "Messages" msgstr "Паведамленні" #: gajim/gui_interface.py:158 gajim/gui_interface.py:329 #: gajim/gui_interface.py:338 gajim/gui_interface.py:345 #: gajim/gui_interface.py:349 gajim/gui_interface.py:352 #: gajim/gui_interface.py:360 msgid "Unable to join group chat" msgstr "Немагчыма ўвайсці ў групавую размову" #: gajim/gui_interface.py:159 #, fuzzy, python-format msgid "" "Your desired nickname in group chat\n" "%s\n" "is in use or registered by another occupant.\n" "Please specify another nickname below:" msgstr "" "Гэтая мянушка ўжо ўжытая альбо зарэгістраваная іншым чалавекам.\n" "Выберыце іншую мянушку:" #: gajim/gui_interface.py:163 msgid "Always use this nickname when there is a conflict" msgstr "" #: gajim/gui_interface.py:181 msgid "Do you accept this request?" msgstr "Хочаце задаволіць гэты запыт?" #: gajim/gui_interface.py:183 #, fuzzy, python-format msgid "Do you accept this request on account %s?" msgstr "Хочаце задаволіць гэты запыт?" #: gajim/gui_interface.py:186 #, fuzzy, python-format msgid "HTTP (%(method)s) Authorization for %(url)s (ID: %(id)s)" msgstr "HTTP (%s) аўтарызацыя для %s (id: %s)" #: gajim/gui_interface.py:230 gajim/notify.py:96 msgid "Connection Failed" msgstr "Памылка злучэння" #: gajim/gui_interface.py:315 #, fuzzy, python-format msgid "A Password is required to join the room %s. Please type it." msgstr "Каб удзельнічаць у гэтай групавой размове, трэба ведаць пароль." #: gajim/gui_interface.py:330 #, fuzzy, python-format msgid "%s is full" msgstr "Гукі" #: gajim/gui_interface.py:339 #, fuzzy, python-format msgid "You are banned from group chat %s." msgstr "Вам забаронена казанне ў гэтай групавой размове." #: gajim/gui_interface.py:346 #, fuzzy, python-format msgid "Remote server %s does not exist." msgstr "Такой групавой размовы няма." #: gajim/gui_interface.py:350 #, fuzzy, python-format msgid "Group chat %s does not exist." msgstr "Такой групавой размовы няма." #: gajim/gui_interface.py:353 #, fuzzy msgid "Group chat creation is not permitted." msgstr "Стварэнне групавых размоў абмежаванае." #: gajim/gui_interface.py:355 #, fuzzy msgid "Unable to join groupchat" msgstr "Немагчыма ўвайсці ў групавую размову" #: gajim/gui_interface.py:356 #, fuzzy, python-format msgid "You must use your registered nickname in %s." msgstr "Вы павінны карыстацца зарэгістраванай для Вас мянушкай." #: gajim/gui_interface.py:361 #, fuzzy, python-format msgid "You are not in the members list in groupchat %s." msgstr "Вас няма ў спісе ўдзельнікаў." #: gajim/gui_interface.py:455 gajim/gui_interface.py:459 #, fuzzy, python-format msgid "Error %(code)s: %(msg)s" msgstr "%(nickname)s: %(message)s" #: gajim/gui_interface.py:470 gajim/gui_interface.py:486 #: gajim/common/connection_handlers_events.py:1430 #, fuzzy, python-format msgid "error while sending %(message)s ( %(error)s )" msgstr "памылка адпраўкі %s ( %s )" #: gajim/gui_interface.py:513 gajim/notify.py:96 #, fuzzy msgid "Subscription request" msgstr "Запыт падпіскі" #: gajim/gui_interface.py:524 gajim/common/contacts.py:131 #: gajim/common/helpers.py:95 msgid "Observers" msgstr "Назіральнікі" #: gajim/gui_interface.py:538 msgid "Authorization accepted" msgstr "Паспяховая аўтарызацыя" #: gajim/gui_interface.py:539 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "Чалавек \"%s\" дазволіў Вам бачыць змены яго стану." #: gajim/gui_interface.py:547 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Чалавек \"%s\" забраў у Вас аўтарызацыю" #: gajim/gui_interface.py:548 msgid "" "You will always see them as offline.\n" "Do you want to remove them from your contact list?" msgstr "" #: gajim/gui_interface.py:570 gajim/notify.py:96 #, fuzzy msgid "Unsubscribed" msgstr "_Адпісацца" #: gajim/gui_interface.py:582 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Немагчыма злучыцца з \"%s\"" #: gajim/gui_interface.py:583 gajim/common/connection.py:1288 #: gajim/common/connection.py:1474 msgid "Check your connection or try again later." msgstr "Праверце злучэнне, альбо паспрабуйце пазней." #: gajim/gui_interface.py:641 #, python-format msgid "%(jid)s declined the invitation: %(reason)s" msgstr "" #: gajim/gui_interface.py:645 #, python-format msgid "%(jid)s declined the invitation" msgstr "" #: gajim/gui_interface.py:675 msgid "" "You configured Gajim to use OpenPGP agent, but there is no OpenPGP agent " "running or it returned a wrong passphrase.\n" msgstr "" #: gajim/gui_interface.py:678 gajim/gui_interface.py:686 msgid "You are currently connected without your OpenPGP key." msgstr "Вы злучаны без выкарыстання ключа OpenPGP." #: gajim/gui_interface.py:680 #, fuzzy msgid "Wrong passphrase" msgstr "Няправільны пароль" #: gajim/gui_interface.py:685 #, fuzzy msgid "Wrong OpenPGP passphrase" msgstr "Няправільны пароль" #: gajim/gui_interface.py:699 #, fuzzy msgid "Certificate Passphrase Required" msgstr "Патрэбны пароль" #: gajim/gui_interface.py:700 #, fuzzy, python-format msgid "Enter the certificate passphrase for account %s" msgstr "Вызначце пароль GPG для рахунка %s." #: gajim/gui_interface.py:723 #, fuzzy msgid "Untrusted OpenPGP key" msgstr "Выберыце Ваш ключ OpenPGP" #: gajim/gui_interface.py:723 msgid "" "The OpenPGP key used to encrypt this chat is not trusted. Do you really want " "to encrypt this message?" msgstr "" #: gajim/gui_interface.py:769 msgid "" "Please copy / paste the refresh token from the website that has just been " "opened." msgstr "" #: gajim/gui_interface.py:772 msgid "Oauth2 Credentials" msgstr "" #: gajim/gui_interface.py:924 #, python-format msgid "%s wants to send you a file." msgstr "%s хоча адправіць Вам файл." #: gajim/gui_interface.py:1021 gajim/gui_interface.py:1433 msgid "SSL certificate error" msgstr "" #: gajim/gui_interface.py:1038 #, fuzzy msgid "File Transfer Failed" msgstr "Перадача файлаў" #: gajim/gui_interface.py:1060 #, fuzzy, python-format msgid "%(filename)s received from %(name)s." msgstr "Перадача файла %(filename)s ад %(name)s спыненая." #: gajim/gui_interface.py:1064 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Перадача файла %(filename)s ад %(name)s спыненая." #: gajim/gui_interface.py:1068 #, fuzzy, python-format msgid "File transfer of %(filename)s from %(name)s failed." msgstr "Перадача файла %(filename)s ад %(name)s спыненая." #: gajim/gui_interface.py:1081 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "Вы паспяхова адправілі файл %(filename)s для %(name)s." #: gajim/gui_interface.py:1085 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "Перадача файла %(filename)s для %(name)s спыненая." #: gajim/gui_interface.py:1089 #, fuzzy, python-format msgid "File transfer of %(filename)s to %(name)s failed." msgstr "Перадача файла %(filename)s для %(name)s спыненая." #: gajim/gui_interface.py:1153 #, fuzzy msgid "Choose file to send" msgstr "Выберыце файл..." #: gajim/gui_interface.py:1199 #, fuzzy msgid "Unable to decrypt message" msgstr "Для кожнага _паведамлення" #: gajim/gui_interface.py:1211 msgid "Username Conflict" msgstr "Канфлікт імёнаў карыстальнікаў" #: gajim/gui_interface.py:1212 msgid "Please type a new username for your local account" msgstr "Вызначце імя карыстальніка для мясцовага рахунка" #: gajim/gui_interface.py:1235 #, fuzzy msgid "Resource Conflict" msgstr "Канфлікт імёнаў карыстальнікаў" #: gajim/gui_interface.py:1236 msgid "" "You are already connected to this account with the same resource. Please " "type a new one" msgstr "" #: gajim/gui_interface.py:1293 #, fuzzy, python-format msgid "%s wants to start a voice chat." msgstr "%s хоча адправіць Вам файл." #: gajim/gui_interface.py:1296 #, fuzzy msgid "Voice Chat Request" msgstr "Запыт на перадачу файла" #: gajim/gui_interface.py:1386 msgid "Error verifying SSL certificate" msgstr "" #: gajim/gui_interface.py:1387 #, python-format msgid "" "There was an error verifying the SSL certificate of your XMPP server: " "%(error)s\n" "Do you still want to connect to this server?" msgstr "" #: gajim/gui_interface.py:1391 #, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA-1 fingerprint of the certificate:\n" "%(sha1)s\n" "SHA256 fingerprint of the certificate:\n" "%(sha256)s" msgstr "" #: gajim/gui_interface.py:1397 msgid "Ignore this error for this certificate." msgstr "" #: gajim/gui_interface.py:1410 msgid "Non Anonymous Server" msgstr "" #: gajim/gui_interface.py:1434 #, python-format msgid "" "It seems the SSL certificate of account %(account)s has changed and is not " "valid or your connection is being compromised.\n" "\n" "Old SHA-1 fingerprint: %(old_sha1)s\n" "Old SHA-256 fingerprint: %(old_sha256)s\n" "\n" "New SHA-1 fingerprint: %(new_sha1)s\n" "New SHA-256 fingerprint: %(new_sha256)s\n" "\n" "Do you still want to connect and update the fingerprint of the certificate?" msgstr "" #: gajim/gui_interface.py:1512 msgid "" "You are about to send your password on an insecure connection. You should " "install PyOpenSSL to prevent that. Are you sure you want to do that?" msgstr "" #: gajim/gui_interface.py:1554 #, fuzzy msgid "" "You are about to send your password unencrypted on an insecure connection. " "Are you sure you want to do that?" msgstr "Вы ствараеце мета-кантакт. Вы сапраўды хочаце працягнуць?" #: gajim/gui_interface.py:1856 #, fuzzy msgid "JID is not a Groupchat" msgstr "Гэта не групавая размова" #: gajim/gui_interface.py:2020 #, fuzzy msgid "Emoticons disabled" msgstr "Шыфраванне адключанае" #: gajim/gui_interface.py:2021 msgid "" "Your configured emoticons theme could not be loaded. See the log for more " "details." msgstr "" #: gajim/gui_interface.py:2039 msgid "This is not a group chat" msgstr "Гэта не групавая размова" #: gajim/gui_interface.py:2040 #, python-format msgid "" "%(room_jid)s is already in your roster. Please check if %(room_jid)s is a " "correct group chat name. If it is, delete it from your roster and try " "joining the group chat again." msgstr "" #: gajim/gui_interface.py:2418 msgid "Could not save your settings and preferences" msgstr "Немагчыма захаваць настаўленні" #: gajim/gui_interface.py:2828 gajim/common/config.py:117 #: gajim/common/config.py:532 gajim/common/optparser.py:343 #: gajim/common/optparser.py:511 gajim/common/optparser.py:534 #, fuzzy msgid "default" msgstr "Прадвызначана" #: gajim/gui_interface.py:3014 msgid "Passphrase Required" msgstr "Патрэбны пароль" #: gajim/gui_interface.py:3015 #, fuzzy, python-format msgid "Enter OpenPGP key passphrase for key %(keyid)s (account %(account)s)." msgstr "Вызначце пароль GPG для рахунка %s." #: gajim/gui_interface.py:3029 #, fuzzy msgid "OpenPGP key expired" msgstr "Выбар ключоў OpenPGP" #: gajim/gui_interface.py:3030 #, fuzzy, python-format msgid "" "Your OpenPGP key has expired, you will be connected to %s without OpenPGP." msgstr "Вы злучыцеся з %s без падтрымкі OpenPGP." #: gajim/gui_interface.py:3039 msgid "Wrong Passphrase" msgstr "Няправільны пароль" #: gajim/gui_interface.py:3040 #, fuzzy msgid "Please retype your OpenPGP passphrase or press Cancel." msgstr "Паўтарыце ўвод пароля GPG альбо пстрыкніце Скасаваць." #: gajim/search_window.py:108 msgid "Waiting for results" msgstr "" #: gajim/search_window.py:146 gajim/search_window.py:224 msgid "Error in received dataform" msgstr "" #: gajim/search_window.py:181 gajim/search_window.py:216 msgid "No result" msgstr "" #: gajim/htmltextview.py:559 #, fuzzy msgid "Loading" msgstr "Піша" #: gajim/atom_window.py:123 #, fuzzy, python-format msgid "You have received new entries (and %d not displayed):" msgid_plural "You have received new entries (and %d not displayed):" msgstr[0] "Вы атрымалі новае паведамленне:" msgstr[1] "Вы атрымалі новае паведамленне:" msgstr[2] "Вы атрымалі новае паведамленне:" #: gajim/atom_window.py:128 gajim/data/gui/atom_entry_window.ui:20 msgid "You have received new entry:" msgstr "Вы атрымалі новае паведамленне:" #: gajim/adhoc_commands.py:111 gajim/data/gui/adhoc_commands_window.ui:9 msgid "Ad-hoc Commands - Gajim" msgstr "Свае загады - Gajim" #: gajim/adhoc_commands.py:320 #, fuzzy msgid "Cancel confirmation" msgstr "Асабістыя звесткі" #: gajim/adhoc_commands.py:321 msgid "" "You are in process of executing command. Do you really want to cancel it?" msgstr "" #: gajim/adhoc_commands.py:387 gajim/adhoc_commands.py:411 msgid "Service sent malformed data" msgstr "" #: gajim/adhoc_commands.py:396 msgid "Service changed the session identifier." msgstr "" #: gajim/adhoc_commands.py:416 #, fuzzy, python-format msgid "%s - Ad-hoc Commands - Gajim" msgstr "Свае загады - Gajim" #: gajim/adhoc_commands.py:510 msgid "Service returned an error." msgstr "" #: gajim/negotiation.py:34 msgid "- messages will be logged" msgstr "" #: gajim/negotiation.py:36 msgid "- messages will not be logged" msgstr "" #: gajim/notify.py:103 #, fuzzy msgid "Open" msgstr "OpenPGP: " #: gajim/dialog_messages.py:33 #, fuzzy msgid "You can not start a new conversation unless you are connected." msgstr "" "Вы не можаце ўдзельнічаць у групавой размове, не злучыўшыся з серверам." #: gajim/dialog_messages.py:48 msgid "Unread events" msgstr "Нягледжаныя падзеі" #: gajim/dialog_messages.py:49 msgid "Read all pending events before removing this account." msgstr "Прагледзьце нягледжаныя падзеі перад выдаленнем гэтага рахунка." #: gajim/dialog_messages.py:53 msgid "You are currently connected to the server" msgstr "Вы злучаны з серверам" #: gajim/dialog_messages.py:54 #, fuzzy msgid "To disable the account, you must be disconnected." msgstr "Каб змяніць назву рахунка, трэба папярэдне адлучыцца." #: gajim/dialog_messages.py:58 #, fuzzy msgid "Invalid Form" msgstr "Няправільны элемент" #: gajim/dialog_messages.py:59 #, fuzzy msgid "The form is not filled correctly." msgstr "Jabber ID групавой размовы ўтрымлівае няправільныя знакі." #: gajim/dialog_messages.py:63 gajim/common/helpers.py:406 msgid "Invisible" msgstr "Нябачны" #: gajim/dialog_messages.py:68 msgid "A connection is not available" msgstr "Няма злучэння" #: gajim/dialog_messages.py:69 msgid "Your message can not be sent until you are connected." msgstr "Вы не можаце адпраўляць паведамленні без злучэння." #: gajim/dialog_messages.py:73 #, fuzzy msgid "JID already in list" msgstr "Jabber-праграма" #: gajim/dialog_messages.py:74 msgid "The JID you entered is already in the list. Choose another one." msgstr "" #: gajim/dialog_messages.py:78 msgid "Invalid answer" msgstr "Няправільны адказ" #: gajim/dialog_messages.py:79 #, fuzzy, python-format msgid "Transport %(name)s answered wrongly to register request: %(error)s" msgstr "Транспарт %s некарэктна адказаў, каб зарэгістраваць запыт: %s" #: gajim/dialog_messages.py:84 #, fuzzy msgid "Wrong Custom Hostname" msgstr "Адмысловы вузел / порт" #: gajim/dialog_messages.py:85 #, fuzzy, python-format msgid "Wrong custom hostname \"%s\". Ignoring it." msgstr "Адмысловы вузел / порт" #: gajim/dialog_messages.py:89 msgid "Error while removing privacy list" msgstr "Памылка ў часе выдалення спіса прыватнасці" #: gajim/dialog_messages.py:90 #, fuzzy, python-format msgid "" "Privacy list %s has not been removed. It is maybe active in one of your " "connected resources. Deactivate it and try again." msgstr "" "Спіс прыватнасці %s не выдалены. Магчыма, ён ужываецца ў адным з Вашых " "злучаных рэсурсаў. Дэактывізуйце іх і паўтарыце свае дзеянні." #: gajim/dialog_messages.py:96 #, fuzzy msgid "Invisibility not supported" msgstr "Пашырэнне не падтрымліваецца" #: gajim/dialog_messages.py:97 #, python-format msgid "Account %s doesn't support invisibility." msgstr "" #: gajim/dialog_messages.py:101 #, fuzzy msgid "Unregister failed" msgstr "Памылка злучэння" #: gajim/dialog_messages.py:102 #, python-format msgid "Unregistration with server %(server)s failed: %(error)s" msgstr "" #: gajim/dialog_messages.py:106 #, fuzzy msgid "Registration succeeded" msgstr "Зарэгістравацца на %s" #: gajim/dialog_messages.py:107 #, python-format msgid "Registration with agent %s succeeded" msgstr "" #: gajim/dialog_messages.py:111 #, fuzzy msgid "Registration failed" msgstr "Памылка злучэння" #: gajim/dialog_messages.py:112 #, python-format msgid "" "Registration with agent %(agent)s failed with error %(error)s: %(error_msg)s" msgstr "" #: gajim/dialog_messages.py:117 #, fuzzy msgid "Unable to join Groupchat" msgstr "Немагчыма ўвайсці ў групавую размову" #: gajim/dialog_messages.py:122 msgid "GStreamer error" msgstr "" #: gajim/dialog_messages.py:123 #, fuzzy, python-format msgid "" "Error: %(error)s\n" "Debug: %(debug)s" msgstr "Памылка: %s" #: gajim/dialog_messages.py:127 msgid "Wrong host" msgstr "Няправільны вузел" #: gajim/dialog_messages.py:128 msgid "Invalid local address? :-O" msgstr "" #: gajim/dialog_messages.py:132 msgid "Avahi error" msgstr "Памылка Avahi" #: gajim/dialog_messages.py:133 #, python-format msgid "" "%s\n" "Link-local messaging might not work properly." msgstr "" "%s\n" "Мясцовыя паведамленні могуць не працаваць." #: gajim/dialog_messages.py:137 gajim/dialog_messages.py:142 #, fuzzy msgid "Could not request upload slot" msgstr "Немагчыма стартаваць мясцовы сервіс" #: gajim/dialog_messages.py:143 msgid "Got unexpected response from server (see log)" msgstr "" #: gajim/dialog_messages.py:147 gajim/dialog_messages.py:152 #, fuzzy msgid "Could not open file" msgstr "Немагчыма загрузіць малюнак" #: gajim/dialog_messages.py:148 msgid "Exception raised while opening file (see log)" msgstr "" #: gajim/dialog_messages.py:157 msgid "Unsecure" msgstr "" #: gajim/dialog_messages.py:158 msgid "Server returned unsecure transport (http)" msgstr "" #: gajim/dialog_messages.py:162 #, fuzzy msgid "Could not upload file" msgstr "Немагчыма загрузіць малюнак" #: gajim/dialog_messages.py:163 #, python-format msgid "HTTP response code from server: %s" msgstr "" #: gajim/dialog_messages.py:167 msgid "Upload Error" msgstr "" #: gajim/dialog_messages.py:172 #, fuzzy msgid "Encryption Error" msgstr "Шыфраванне дзейнічае" #: gajim/dialog_messages.py:173 #, fuzzy msgid "For the choosen encryption is no encryption method available" msgstr "Няма злучэння" #: gajim/gajim_themes_window.py:61 msgid "Theme" msgstr "Тэма" #: gajim/gajim_themes_window.py:98 #, fuzzy msgid "You cannot make changes to the default theme" msgstr "Вы не можаце выдаліць актыўную тэму" #: gajim/gajim_themes_window.py:99 #, fuzzy msgid "Please create a new clean theme." msgstr "Стварыць новы допіс" #: gajim/gajim_themes_window.py:170 msgid "theme name" msgstr "назва тэмы" #: gajim/gajim_themes_window.py:187 msgid "You cannot delete your current theme" msgstr "Вы не можаце выдаліць актыўную тэму" #: gajim/gajim_themes_window.py:188 msgid "Pick another theme to use first." msgstr "" #: gajim/accounts_window.py:40 #, fuzzy msgid "Merge Accounts" msgstr "Аб'яднаныя рахункі" #: gajim/accounts_window.py:41 msgid "Use PGP Agent" msgstr "" #: gajim/accounts_window.py:153 gajim/common/config.py:511 msgid "Be right back." msgstr "Хутка прыйду." #: gajim/accounts_window.py:157 msgid "Relogin now?" msgstr "Перадалучыцца?" #: gajim/accounts_window.py:158 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "Калі Вы хочаце ўжыць усе зробленыя змены, перадалучыцеся." #: gajim/accounts_window.py:211 #, python-format msgid "You have opened chat in account %s" msgstr "Вы пачалі размову ў рахунку %s" #: gajim/accounts_window.py:212 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "Усе размоўныя вокны закрыюцца. Хочаце працягнуць?" #: gajim/accounts_window.py:345 #, fuzzy msgid "Remove" msgstr "Вы_даліць" #: gajim/accounts_window.py:388 #, fuzzy msgid "Rename account label" msgstr "Кіраванне рахункамі" #: gajim/accounts_window.py:457 msgid "Login" msgstr "" #: gajim/accounts_window.py:466 msgid "Connection" msgstr "Злучэнне" #: gajim/accounts_window.py:469 #, fuzzy msgid "Import Contacts" msgstr "Людзі" #: gajim/accounts_window.py:472 gajim/accounts_window.py:655 #, fuzzy msgid "Client Certificate" msgstr "Няправільнае імя карыстальніка" #: gajim/accounts_window.py:475 gajim/accounts_window.py:570 #, fuzzy msgid "OpenPGP Key" msgstr "Прызначыць ключ OpenPGP" #: gajim/accounts_window.py:486 gajim/accounts_window.py:558 #, fuzzy msgid "Connect on startup" msgstr "_Злучацца па старце Gajim" #: gajim/accounts_window.py:489 #, fuzzy msgid "Reconnect when connection is lost" msgstr "Аўтаматычна перадалучацца, калі знікае злучэнне" #: gajim/accounts_window.py:492 gajim/accounts_window.py:562 #, fuzzy msgid "Save conversations for all contacts" msgstr "Захоўваць _журналы размоў з усімі людзьмі" #: gajim/accounts_window.py:494 gajim/accounts_window.py:564 msgid "Store conversations on the harddrive" msgstr "" #: gajim/accounts_window.py:496 #, fuzzy msgid "Server Message Archive" msgstr "Ад_правіць паведамленне серверу" #: gajim/accounts_window.py:498 msgid "" "Messages get stored on the server.\n" "The archive is used to sync messages\n" "between multiple devices.\n" "XEP-0313" msgstr "" #: gajim/accounts_window.py:503 gajim/accounts_window.py:566 #, fuzzy msgid "Global Status" msgstr "Усе станы" #: gajim/accounts_window.py:505 #, fuzzy msgid "Synchronise the status of all accounts" msgstr "Змяніць стан рахунка(ў)" #: gajim/accounts_window.py:507 #, fuzzy msgid "Message Carbons" msgstr "Паведамленні" #: gajim/accounts_window.py:509 msgid "" "All your other online devices get copies\n" "of sent and received messages.\n" "XEP-0280" msgstr "" #: gajim/accounts_window.py:513 msgid "Use file transfer proxies" msgstr "Ужыць проксі для перадачы файлаў" #: gajim/accounts_window.py:525 gajim/accounts_window.py:560 #, fuzzy msgid "Use environment variable" msgstr "Няма злучэння" #: gajim/accounts_window.py:527 #, fuzzy msgid "Proxy" msgstr "Проксі:" #: gajim/accounts_window.py:530 #, fuzzy msgid "Warn on insecure connection" msgstr "Злучэнне" #: gajim/accounts_window.py:534 msgid "Send keep-alive packets" msgstr "Адпраўляць праверачныя пакункі серверу" #: gajim/accounts_window.py:538 msgid "Manually set the hostname for the server" msgstr "" #: gajim/accounts_window.py:541 #, fuzzy msgid "Resource" msgstr "Рэсурс:" #: gajim/accounts_window.py:544 gajim/accounts_window.py:612 #: gajim/accounts_window.py:617 #, fuzzy msgid "Priority" msgstr "Прыяры_тэт:" #: gajim/accounts_window.py:568 #, fuzzy msgid "Synchronize the status of all accounts" msgstr "Змяніць стан рахунка(ў)" #: gajim/accounts_window.py:581 #, fuzzy msgid "First Name" msgstr "Імя:" #: gajim/accounts_window.py:584 #, fuzzy msgid "Last Name" msgstr "Прозвішча:" #: gajim/accounts_window.py:587 #: gajim/data/gui/archiving_313_preferences_window.ui:71 #, fuzzy msgid "Jabber ID" msgstr "Jabber ID:" #: gajim/accounts_window.py:590 #, fuzzy msgid "Email" msgstr "Новы ліст" #: gajim/accounts_window.py:608 #, fuzzy msgid "Adjust to status" msgstr "_Адпаведна стану" #: gajim/accounts_window.py:635 msgid "Enable" msgstr "Уключыць" #: gajim/accounts_window.py:642 #, fuzzy msgid "Port" msgstr "_Порт:" #: gajim/accounts_window.py:647 #, fuzzy msgid "Connection Options" msgstr "Злучэнне" #: gajim/accounts_window.py:659 #, fuzzy msgid "Encrypted Certificate" msgstr "Няправільнае імя карыстальніка" #: gajim/accounts_window.py:663 #, fuzzy msgid "Certificate Options" msgstr "Няправільнае імя карыстальніка" #: gajim/accounts_window.py:671 gajim/data/gui/join_groupchat_window.ui:143 #, fuzzy msgid "Password" msgstr "Пароль:" #: gajim/accounts_window.py:675 #, fuzzy msgid "Save Password" msgstr "Захаваць пароль" #: gajim/accounts_window.py:678 gajim/data/gui/change_password_dialog.ui:8 msgid "Change Password" msgstr "Змяніць пароль" #: gajim/accounts_window.py:683 #, fuzzy msgid "Login Options" msgstr "Сымболікі:" #: gajim/gajim_remote.py:59 gajim/common/exceptions.py:71 msgid "D-Bus is not present on this machine or python module is missing" msgstr "D-Bus няма на гэтым кампутары, альбо няма адпаведнага модуля python" #: gajim/gajim_remote.py:81 msgid "Shows a help on specific command" msgstr "Паказвае даведку па вызначаным загадзе" #: gajim/gajim_remote.py:84 msgid "command" msgstr "загад" #: gajim/gajim_remote.py:85 msgid "show help on command" msgstr "паказаць даведку па загадзе" #: gajim/gajim_remote.py:89 #, fuzzy msgid "Lists all contacts in roster, one for each line" msgstr "" "Паказаць спіс усіх людзей у кантактным лісце. Звесткі пра кожнага чалавека " "друкуюцца на асобным радку" #: gajim/gajim_remote.py:91 gajim/gajim_remote.py:106 gajim/gajim_remote.py:116 #: gajim/gajim_remote.py:130 gajim/gajim_remote.py:144 #: gajim/gajim_remote.py:153 gajim/gajim_remote.py:174 #: gajim/gajim_remote.py:204 gajim/gajim_remote.py:213 #: gajim/gajim_remote.py:220 #, fuzzy msgid "?CLI:account" msgstr "рахунак" #: gajim/gajim_remote.py:91 msgid "show only contacts of the given account" msgstr "паказаць людзей з пэўнага рахунка" #: gajim/gajim_remote.py:97 msgid "Prints a list of registered accounts" msgstr "Паказаць спіс зарэгістраваных рахункаў" #: gajim/gajim_remote.py:101 #, fuzzy msgid "Changes the status of account(s)" msgstr "Змяніць стан рахунка(ў)" #: gajim/gajim_remote.py:104 #, fuzzy msgid "?CLI:status" msgstr "стан" #: gajim/gajim_remote.py:104 #, fuzzy msgid "" "one of: offline, online, chat, away, xa, dnd, invisible. If not set, use " "account's previous status" msgstr "адзін з: offline, online, chat, away, xa, dnd, invisible " #: gajim/gajim_remote.py:105 gajim/gajim_remote.py:127 #: gajim/gajim_remote.py:141 gajim/gajim_remote.py:152 #, fuzzy msgid "?CLI:message" msgstr "паведамленне" #: gajim/gajim_remote.py:105 msgid "status message" msgstr "паведамленне стану" #: gajim/gajim_remote.py:106 msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" msgstr "" "змяніць стан рахунка \"account\". Калі не вызначана, змяняецца стан усіх " "рахункаў, якія \"сінхранізуюцца з глабальным станам\"" #: gajim/gajim_remote.py:112 #, fuzzy msgid "Changes the priority of account(s)" msgstr "Змяніць стан рахунка(ў)" #: gajim/gajim_remote.py:114 #, fuzzy msgid "?CLI:priority" msgstr "Прыяры_тэт:" #: gajim/gajim_remote.py:114 #, fuzzy msgid "priority you want to give to the account" msgstr "_Зарэгістраваць новы рахунак" #: gajim/gajim_remote.py:116 #, fuzzy msgid "" "change the priority of the given account. If not specified, change status of " "all accounts that have \"sync with global status\" option set" msgstr "" "змяніць стан рахунка \"account\". Калі не вызначана, змяняецца стан усіх " "рахункаў, якія \"сінхранізуюцца з глабальным станам\"" #: gajim/gajim_remote.py:122 msgid "" "Sends new chat message to a contact in the roster. Both OpenPGP key and " "account are optional. If you want to set only 'account', without 'OpenPGP " "key', just set 'OpenPGP key' to ''." msgstr "" "Адпраўляе новае паведамленне чалавеку з спіса. Выстаўленне ключа OpenPGP і " "рахунка не абавязковае. Калі Вы хочаце вызначыць толькі 'account', без " "'ключа OpenPGP', проста выставіце 'ключ OpenPGP' у ''." #: gajim/gajim_remote.py:126 gajim/gajim_remote.py:139 msgid "JID of the contact that will receive the message" msgstr "JID чалавека, які атрымае паведамленне" #: gajim/gajim_remote.py:127 gajim/gajim_remote.py:141 #: gajim/gajim_remote.py:152 msgid "message contents" msgstr "змест паведамлення" #: gajim/gajim_remote.py:128 gajim/gajim_remote.py:142 msgid "PGP key" msgstr "" #: gajim/gajim_remote.py:128 gajim/gajim_remote.py:142 msgid "if specified, the message will be encrypted using this public key" msgstr "Калі вызначана, паведамленне будзе зашыфраванае адкрытым ключом" #: gajim/gajim_remote.py:130 gajim/gajim_remote.py:144 #: gajim/gajim_remote.py:153 msgid "if specified, the message will be sent using this account" msgstr "Калі вызначана, паведамленне будзе адпраўленае праз гэты рахунак" #: gajim/gajim_remote.py:135 #, fuzzy msgid "" "Sends a chat message to someone on your roster. Optionally with OpenPGP key " "and account. If you want to only set the latter, set OpenPGP key to \"\"." msgstr "" "Адпраўляе новае паведамленне чалавеку з спіса. Выстаўленне ключа OpenPGP і " "рахунка не абавязковае. Калі Вы хочаце вызначыць толькі 'account', без " "'ключа OpenPGP', проста выставіце 'ключ OpenPGP' у ''." #: gajim/gajim_remote.py:140 msgid "subject" msgstr "тэма" #: gajim/gajim_remote.py:140 msgid "message subject" msgstr "тэма паведамлення" #: gajim/gajim_remote.py:149 msgid "Sends new message to a groupchat you've joined." msgstr "" #: gajim/gajim_remote.py:151 #, fuzzy msgid "JID of the room that will receive the message" msgstr "JID чалавека, які атрымае паведамленне" #: gajim/gajim_remote.py:158 msgid "Gets detailed info on a contact" msgstr "Атрымаць падрабязныя звесткі пра чалавека" #: gajim/gajim_remote.py:160 gajim/gajim_remote.py:173 #: gajim/gajim_remote.py:203 msgid "JID of the contact" msgstr "JID чалавека" #: gajim/gajim_remote.py:164 msgid "Gets detailed info on a account" msgstr "Атрымаць падрабязныя звесткі аб рахунку" #: gajim/gajim_remote.py:166 msgid "Name of the account" msgstr "Назва рахунка" #: gajim/gajim_remote.py:170 msgid "Sends file to a contact" msgstr "Адправіць файл чалавеку" #: gajim/gajim_remote.py:172 msgid "file" msgstr "файл" #: gajim/gajim_remote.py:172 msgid "File path" msgstr "Месца файла" #: gajim/gajim_remote.py:174 msgid "if specified, file will be sent using this account" msgstr "Калі вызначана, файл будзе адпраўлены праз гэты рахунак" #: gajim/gajim_remote.py:179 msgid "Lists all preferences and their values" msgstr "Паказаць спіс усіх настаўленняў і іх значэнні" #: gajim/gajim_remote.py:183 msgid "Sets value of 'key' to 'value'." msgstr "Выстаўляе значэнне 'ключа' ў 'значэнне'" #: gajim/gajim_remote.py:185 msgid "key=value" msgstr "ключ=значэнне" #: gajim/gajim_remote.py:185 #, fuzzy msgid "'key' is the name of the preference, 'value' is what to set it to" msgstr "'ключ' ёсць назваю настаўлення, 'значэнне' ёсць выстаўляемым значэннем" #: gajim/gajim_remote.py:190 msgid "Deletes a preference item" msgstr "Выдаляе ўласцівасць" #: gajim/gajim_remote.py:192 msgid "key" msgstr "ключ" #: gajim/gajim_remote.py:192 msgid "name of the preference to be deleted" msgstr "назва выдаляемай уласцівасці" #: gajim/gajim_remote.py:196 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "Запісвае бягучыя настаўленні Gajim у файл .config" #: gajim/gajim_remote.py:201 msgid "Removes contact from roster" msgstr "Выдаліць чалавека з спіса" #: gajim/gajim_remote.py:204 msgid "if specified, contact is taken from the contact list of this account" msgstr "Калі вызначана, то імя чалавека выбіраецца з спіса гэтага рахунка" #: gajim/gajim_remote.py:211 msgid "Returns current status (the global one unless account is specified)" msgstr "Вяртае бягучы стан (глабальны, калі не вызначаны рахунак)" #: gajim/gajim_remote.py:218 msgid "" "Returns current status message (the global one unless account is specified)" msgstr "" "Вяртае бягучае паведамленне аб стане (глабальнае, калі не вызначаны рахунак)" #: gajim/gajim_remote.py:225 msgid "Returns number of unread messages" msgstr "Вяртае колькасць нечытаных паведамленняў" #: gajim/gajim_remote.py:230 msgid "Sends custom XML" msgstr "Адправіць асаблівы XML" #: gajim/gajim_remote.py:232 msgid "XML to send" msgstr "Адправіць XML" #: gajim/gajim_remote.py:233 #, fuzzy msgid "" "Account to which the XML will be sent; if not specified, XML will be sent to " "all accounts" msgstr "" "Рахунак, на які будзе адпраўлены xml; калі не вызначаны, xml будзе " "адпраўлены на ўсе рахункі" #: gajim/gajim_remote.py:239 #, fuzzy msgid "Change the avatar" msgstr "Змяніць стан" #: gajim/gajim_remote.py:241 #, fuzzy msgid "Picture to use" msgstr "Мянушка не знойдзеная: %s" #: gajim/gajim_remote.py:242 #, fuzzy msgid "" "Account in which the avatar will be set; if not specified, the avatar will " "be set for all accounts" msgstr "" "Рахунак, на які будзе адпраўлены xml; калі не вызначаны, xml будзе " "адпраўлены на ўсе рахункі" #: gajim/gajim_remote.py:249 #, fuzzy msgid "Check if Gajim is running" msgstr "Праверце, ці працуе avahi-daemon." #: gajim/gajim_remote.py:275 msgid "Missing argument \"contact_jid\"" msgstr "Не хапае аргумента \"contact_jid\"" #: gajim/gajim_remote.py:295 #, python-format msgid "" "'%s' is not in your roster.\n" "Please specify account for sending the message." msgstr "" "'%s' няма ў Вашым спісе.\n" "Калі ласка, вызначце рахунак для адпраўкі паведамлення." #: gajim/gajim_remote.py:298 msgid "You have no active account" msgstr "У Вас няма актыўнага рахунка" #: gajim/gajim_remote.py:346 msgid "It seems Gajim is not running. So you can't use gajim-remote." msgstr "" #: gajim/gajim_remote.py:373 #, python-format msgid "" "Usage: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" msgstr "" #: gajim/gajim_remote.py:377 msgid "Arguments:" msgstr "Аргументы:" #: gajim/gajim_remote.py:381 #, python-format msgid "%s not found" msgstr "%s не знойдзены" #: gajim/gajim_remote.py:387 #, fuzzy, python-format msgid "" "Usage:\n" " %s command [arguments]\n" "\n" "Command is one of:\n" msgstr "" "Карыстанне: %s загад [аргументы]\n" "Загад ёсць адным з:\n" #: gajim/gajim_remote.py:457 #, fuzzy, python-format msgid "" "Too many arguments. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" "Надта шмат аргументаў. \n" "Увядзіце \"%s help %s\" для падрабязнейшых звестак" #: gajim/gajim_remote.py:462 #, fuzzy, python-format msgid "" "Argument \"%(arg)s\" is not specified. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" "Аргумент \"%s\" не вызначаны. \n" "Увядзіце \"%s help %s\" для падрабязных звестак" #: gajim/common/app.py:264 msgid "Unable to load idle module" msgstr "Немагчыма загрузіць модуль idle" #: gajim/common/fuzzyclock.py:37 msgid "twelve" msgstr "дванаццаць" #: gajim/common/fuzzyclock.py:37 msgid "one" msgstr "адзін" #: gajim/common/fuzzyclock.py:37 msgid "two" msgstr "два" #: gajim/common/fuzzyclock.py:37 msgid "three" msgstr "тры" #: gajim/common/fuzzyclock.py:37 msgid "four" msgstr "чатыры" #: gajim/common/fuzzyclock.py:38 msgid "five" msgstr "пяць" #: gajim/common/fuzzyclock.py:38 msgid "six" msgstr "шэсць" #: gajim/common/fuzzyclock.py:38 msgid "seven" msgstr "сем" #: gajim/common/fuzzyclock.py:38 msgid "eight" msgstr "восем" #: gajim/common/fuzzyclock.py:38 msgid "nine" msgstr "дзевяць" #: gajim/common/fuzzyclock.py:38 msgid "ten" msgstr "дзесяць" #: gajim/common/fuzzyclock.py:39 msgid "eleven" msgstr "адзінаццаць" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "%(0)s o'clock" msgstr "%(0)s гадзінаў" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "five past %(0)s" msgstr "пяць хвілінаў на %(0)s" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "ten past %(0)s" msgstr "дзесяць хвілінаў на %(0)s" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "quarter past %(0)s" msgstr "чвэрць на %(0)s" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "twenty past %(0)s" msgstr "дваццаць хвілінаў на %(0)s" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "twenty five past %(0)s" msgstr "дваццаць пяць хвілінаў на %(0)s" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "half past %(0)s" msgstr "палова на %(0)s" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "twenty five to %(1)s" msgstr "без дваццаці пяці хвілінаў %(1)s" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "twenty to %(1)s" msgstr "без дваццаці хвілінаў %(1)s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "quarter to %(1)s" msgstr "без чвэрці %(1)s" #: gajim/common/fuzzyclock.py:46 #, fuzzy, python-format msgid "ten to %(1)s" msgstr "дзесяць хвілінаў на $s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "five to %(1)s" msgstr "без пяці хвілінаў %(1)s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "%(1)s o'clock" msgstr "%(1)s гадзінаў" #: gajim/common/fuzzyclock.py:48 gajim/common/fuzzyclock.py:50 msgid "Night" msgstr "Ноч" #: gajim/common/fuzzyclock.py:48 msgid "Early morning" msgstr "Світанак" #: gajim/common/fuzzyclock.py:48 msgid "Morning" msgstr "Раніца" #: gajim/common/fuzzyclock.py:49 msgid "Almost noon" msgstr "Амаль дзень" #: gajim/common/fuzzyclock.py:49 msgid "Noon" msgstr "Полудзень" #: gajim/common/fuzzyclock.py:49 msgid "Afternoon" msgstr "Абед" #: gajim/common/fuzzyclock.py:49 msgid "Evening" msgstr "Вечар" #: gajim/common/fuzzyclock.py:50 msgid "Late evening" msgstr "Позні вечар" #: gajim/common/fuzzyclock.py:52 msgid "Start of week" msgstr "Пачатак тыдня" #: gajim/common/fuzzyclock.py:52 gajim/common/fuzzyclock.py:53 msgid "Middle of week" msgstr "Сярэдзіна тыдня" #: gajim/common/fuzzyclock.py:53 msgid "End of week" msgstr "Канец тыдня" #: gajim/common/fuzzyclock.py:53 msgid "Weekend!" msgstr "Выходныя!" #: gajim/common/connection_handlers_events.py:369 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " "management tools such as http://jru.jabberstudio.org/ to remove it" msgstr "" "JID %s не адпавядае стандарту RFC. Ён не будзе дададзены ў кантактны ліст. " "Выдаліце яго з дапамогай адмысловай праграмы, напр., http://jru.jabberstudio." "org/" #: gajim/common/connection_handlers_events.py:852 #, python-format msgid "unsubscribe request from %s" msgstr "запыт адпіскі ад %s" #: gajim/common/connection_handlers_events.py:952 #, fuzzy msgid "Room has been destroyed" msgstr "Аўтарызацыя забраная" #: gajim/common/connection_handlers_events.py:960 #, python-format msgid "You can join this room instead: %s" msgstr "" #: gajim/common/connection_handlers_events.py:1979 #, python-format msgid "Unknown SSL error: %d" msgstr "" #: gajim/common/connection_handlers_events.py:2625 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Новае асобнае паведамленне ад %(nickname)s" #: gajim/common/connection_handlers_events.py:2631 #, python-format msgid "New Private Message from group chat %s" msgstr "Новае прыватнае паведамленне ў групавой размове %s" #: gajim/common/connection_handlers_events.py:2634 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" #: gajim/common/connection_handlers_events.py:2637 #, fuzzy, python-format msgid "Messaged by %(nickname)s" msgstr "Новае паведамленне ад %(nickname)s" #: gajim/common/connection_handlers_events.py:2643 #, python-format msgid "New Message from %(nickname)s" msgstr "Новае паведамленне ад %(nickname)s" #: gajim/common/connection_handlers_events.py:2809 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s змяніў стан" #: gajim/common/connection_handlers_events.py:2817 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s прыйшоў" #: gajim/common/connection_handlers_events.py:2823 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s сышоў" #: gajim/common/contacts.py:386 msgid "Not in roster" msgstr "Няма ў спісе" #: gajim/common/config.py:76 msgid "" "Show desktop notification even when a chat window is opened for this contact " "and does not have focus" msgstr "" #: gajim/common/config.py:77 msgid "Play sound when user is busy" msgstr "" #: gajim/common/config.py:79 msgid "Show only online and free for chat contacts in roster." msgstr "" #: gajim/common/config.py:82 msgid "Time in minutes, after which your status changes to away." msgstr "Праз колькі хвілінаў змяняць стан на сышоўшы." #: gajim/common/config.py:83 #, fuzzy msgid "$S (Away as a result of being idle more than $T min)" msgstr "Сышоў як вынік марнавання часу" #: gajim/common/config.py:83 msgid "$S will be replaced by current status message, $T by autoawaytime." msgstr "" #: gajim/common/config.py:85 msgid "Time in minutes, after which your status changes to not available." msgstr "Праз колькі хвілінаў змяняць стан на недаступны." #: gajim/common/config.py:86 #, fuzzy msgid "$S (Not available as a result of being idle more than $T min)" msgstr "Недаступны ў выніку марнавання часу" #: gajim/common/config.py:86 msgid "$S will be replaced by current status message, $T by autoxatime." msgstr "" #: gajim/common/config.py:89 msgid "" "When to show notification area icon. Can be 'never', 'on_event', 'always'." msgstr "" #: gajim/common/config.py:90 msgid "Allow to hide the roster window even if the tray icon is not shown." msgstr "" #: gajim/common/config.py:95 #, fuzzy msgid "Incoming nickname color." msgstr "Няправільнае імя карыстальніка" #: gajim/common/config.py:96 msgid "Outgoing nickname color." msgstr "" #: gajim/common/config.py:97 msgid "Incoming text color." msgstr "" #: gajim/common/config.py:98 msgid "Outgoing text color." msgstr "" #: gajim/common/config.py:99 #, fuzzy msgid "Status message text color." msgstr "тэкст паведамлення аб змене стану" #: gajim/common/config.py:102 #, fuzzy msgid "Contact signed in notification color." msgstr "_Паказваць падзею ў галоўным вакне" #: gajim/common/config.py:103 #, fuzzy msgid "Contact signout notification color" msgstr "_Паказваць падзею ў галоўным вакне" #: gajim/common/config.py:104 #, fuzzy msgid "New message notification color." msgstr "_Паказваць падзею ў галоўным вакне" #: gajim/common/config.py:105 #, fuzzy msgid "File transfer request notification color." msgstr "Запыт на перадачу файла" #: gajim/common/config.py:106 #, fuzzy msgid "File transfer error notification color." msgstr "Перадача файла скасаваная" #: gajim/common/config.py:107 #, fuzzy msgid "File transfer complete or stopped notification color." msgstr "Паказаць нагадванне па сканчэнні перадачы файла" #: gajim/common/config.py:108 #, fuzzy msgid "Groupchat invitation notification color" msgstr "Запрашэнне ў групавую размову" #: gajim/common/config.py:109 #, fuzzy msgid "Background color of status changed notification" msgstr "Фонавы колер для толькі ўвайшоўшых людзей." #: gajim/common/config.py:110 msgid "Other dialogs color." msgstr "" #: gajim/common/config.py:111 #, fuzzy msgid "Incoming nickname font." msgstr "Няправільнае імя карыстальніка" #: gajim/common/config.py:112 #, fuzzy msgid "Outgoing nickname font." msgstr "Змена мянушкі" #: gajim/common/config.py:113 msgid "Incoming text font." msgstr "" #: gajim/common/config.py:114 msgid "Outgoing text font." msgstr "" #: gajim/common/config.py:115 #, fuzzy msgid "Status message text font." msgstr "тэкст паведамлення аб змене стану" #: gajim/common/config.py:116 msgid "" "List (space separated) of rows (accounts and groups) that are collapsed." msgstr "Спіс падзеленых прагаламі згорнутых рахункаў і групаў." #: gajim/common/config.py:123 msgid "Language used by speller" msgstr "Мова правапісу" #: gajim/common/config.py:124 msgid "" "'always' - print time for every message.\n" "'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" "'never' - never print time." msgstr "" "'always' - паказваць час кожнага паведамлення.\n" "'sometimes' - паказваць час кожныя print_ichat_every_foo_minutes хвілінаў.\n" "'never' - не паказваць час." #: gajim/common/config.py:125 msgid "" "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " "to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " "This is used only if print_time is 'sometimes'." msgstr "" "Паказваць час у вокнах размовы прыблізна. Значэнне прыблізнасці ад 1 да 4, " "альбо 0, каб адключыць прыблізнасць. 1 паказвае самы дакладны час, 4 " "паказвае самы прыблізны. Працуе, калі опцыя print_time мае значэнне " "'sometimes'." #: gajim/common/config.py:127 msgid "Enable ASCII emoticons" msgstr "" #: gajim/common/config.py:129 msgid "Treat * / _ pairs as possible formatting characters." msgstr "Лічыць спалучэнні * / _ мажлівымі знакамі фарматавання." #: gajim/common/config.py:130 msgid "" "If True, do not remove */_ . So *abc* will be bold but with * * not removed." msgstr "" "Калі true, не выдаляць */_ . Такім чынам, *abc* будзе тлустым, але * * не " "выдаляецца." #: gajim/common/config.py:133 msgid "" "Uses ReStructured text markup to send HTML, plus ascii formatting if " "selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" "restructuredtext.html (If you want to use this, install docutils)" msgstr "" "Ужыць рэструктураваную мову тэкставай разметкі для адпраўлення HTML, а " "таксама фарматаванне ASCII, калі ўключаная адпаведная опцыя. Глядзіце " "сінтаксіс на http://docutils.sourceforge.net/docs/ref/rst/restructuredtext." "html (калі Вы хочаце ўжыць гэтую магчымасць, усталюйце docutils)" #: gajim/common/config.py:142 msgid "" "Character to add after nickname when using nick completion (tab) in group " "chat." msgstr "Знак пасля дапоўненай мянушкі ў групавой размове." #: gajim/common/config.py:143 msgid "" "Character to propose to add after desired nickname when desired nickname is " "used by someone else in group chat." msgstr "Знак пасля вызначанай мянушкі, калі яе згадваюць у групавой размове." #: gajim/common/config.py:165 msgid "" "If True, Gajim will save roster position when hiding roster, and restore it " "when showing roster." msgstr "" #: gajim/common/config.py:171 msgid "Place the roster on the right in single window mode" msgstr "" #: gajim/common/config.py:177 msgid "" "This option let you customize timestamp that is printed in conversation. For " "exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " "strftime for full documentation: http://docs.python.org/lib/module-time.html" msgstr "" "З дапамогай гэтай опцыі Вы можаце змяніць фармат часавых мецінаў, якія " "паказваюцца ў вокнах размовы. Напр., \"[%H:%M] \" азначае, што трэба " "паказваць \"[гадзінаў:хвілінаў] \". Глядзіце падрабязную інфармацыю ў " "дакументацыі для python на функцыю strftime: http://docs.python.org/lib/" "module-time.html" #: gajim/common/config.py:178 msgid "Characters that are printed before the nickname in conversations" msgstr "Знакі, якія друкуюцца ў вокнах размовы перад мянушкай" #: gajim/common/config.py:179 msgid "Characters that are printed after the nickname in conversations" msgstr "Знакі, якія друкуюцца ў вокнах размовы пасля мянушкі" #: gajim/common/config.py:181 msgid "Add * and [n] in roster title?" msgstr "Дадаць * і [n] у назву галоўнага вакна?" #: gajim/common/config.py:182 #, fuzzy msgid "" "How many history messages should be restored when a chat tab/window is " "reopened?" msgstr "" "Колькі радкоў помніць з апошняй размовы, калі размова наноў адкрываецца." #: gajim/common/config.py:183 msgid "How far back in time (minutes) history is restored. -1 means no limit." msgstr "" #: gajim/common/config.py:184 msgid "" "How many lines to request from server when entering a groupchat. -1 means no " "limit" msgstr "" #: gajim/common/config.py:185 msgid "" "Minutes of backlog to request when entering a groupchat. -1 means no limit" msgstr "" #: gajim/common/config.py:186 msgid "" "How many seconds to wait before trying to autorejoin to a conference you are " "being disconnected from. Set to 0 to disable autorejoining." msgstr "" #: gajim/common/config.py:187 msgid "" "Should autorejoin be activated when we are being kicked from a conference?" msgstr "" #: gajim/common/config.py:188 msgid "" "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " "Client default behaviour)." msgstr "" "Адпраўляць паведамленне праз Ctrl+Enter, а Enter стварае новы радок " "(стандартныя паводзіны Mirabilis ICQ)." #: gajim/common/config.py:190 msgid "How many lines to store for Ctrl+KeyUP." msgstr "Колькі радкоў захоўваць для Ctrl+KeyUP." #: gajim/common/config.py:193 #, fuzzy, python-format msgid "" "Either custom url with %%s in it where %%s is the word/phrase or " "'WIKTIONARY' which means use wiktionary." msgstr "" "Альбо адмысловы адрас з %s, дзе %s ёсць словам/выразам, альбо 'WIKTIONARY', " "што значыць выкарыстанне Вікі-Слоўніка." #: gajim/common/config.py:196 msgid "If checked, Gajim can be controlled remotely using gajim-remote." msgstr "" "Калі гэтая опцыя ўключаная, Gajim можа кантралявацца з дапамогай gajim-" "remote." #: gajim/common/config.py:197 msgid "" "Sent chat state notifications. Can be one of all, composing_only, disabled." msgstr "" "Адпраўляць паведамленні аб стане размовы. Адно з наступных значэнняў: all, " "composing_only, disabled." #: gajim/common/config.py:198 msgid "" "Displayed chat state notifications in chat windows. Can be one of all, " "composing_only, disabled." msgstr "" "Паказваць паведамленні аб стане размовы. Адно з наступных значэнняў: all, " "composing_only, disabled." #: gajim/common/config.py:200 msgid "" "When not printing time for every message (print_time==sometimes), print it " "every x minutes." msgstr "" "Калі трэба паказваць час не для кожнага паведамлення " "(print_time==sometimes), паказваць яго кожныя x хвілінаў." #: gajim/common/config.py:201 msgid "Ask before closing a group chat tab/window." msgstr "Пытацца пацверджання закрыцця групавой размовы." #: gajim/common/config.py:202 #, fuzzy msgid "" "Always ask for confirmation before closing groupchats with any of the JIDs " "on this space separated list." msgstr "" "Заўсёды пытацца пацверджання закрыцця групавых размоў з гэтага спіса " "падзеленых прагаламі назваў групавых размоў." #: gajim/common/config.py:203 #, fuzzy msgid "" "Never ask for confirmation before closing groupchats with any of the JIDs on " "this space separated list." msgstr "" "Ніколі не пытацца пацверджання закрыцця групавых размоў з гэтага спіса " "падзеленых прагаламі назваў групавых размоў." #: gajim/common/config.py:204 msgid "" "Ask before closing tabbed chat window if there are controls that can lose " "data (chat, private chat, groupchat that will not be minimized)" msgstr "" #: gajim/common/config.py:207 #, fuzzy msgid "" "Comma separated list of hosts that we send, in addition of local interfaces, " "for File Transfer in case of address translation/port forwarding." msgstr "" "Вызначае вузел, якому мы адпраўляем файлы, у выпадку трансляцыі адрасоў / " "перанакіравання портаў." #: gajim/common/config.py:209 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." msgstr "У стандарце IEC вызначана, што КіБ = 1024 байтаў, КБ = 1000 байтаў." #: gajim/common/config.py:211 #, fuzzy msgid "Notify of events in the notification area." msgstr "Нагадваць аб падзеях праз значку прасторы паведамленняў." #: gajim/common/config.py:212 msgid "" "If False, Gajim will display a static event icon instead of the blinking " "status icon in the notification area when notifying on event." msgstr "" #: gajim/common/config.py:218 msgid "Show tab when only one conversation?" msgstr "Паказваць картку, калі актыўная толькі адна размова?" #: gajim/common/config.py:219 msgid "Show tabbed notebook border in chat windows?" msgstr "Паказваць межы картак у вокнах размовы?" #: gajim/common/config.py:220 msgid "Show close button in tab?" msgstr "Паказваць кнопку закрыцця на картцы?" #: gajim/common/config.py:221 msgid "" "A list of modp groups to use in a Diffie-Hellman, highest preference first, " "separated by commas. Valid groups are 1, 2, 5, 14, 15, 16, 17 and 18. Higher " "numbers are more secure, but take longer to calculate when you start a " "session." msgstr "" #: gajim/common/config.py:234 msgid "Preview new messages in notification popup?" msgstr "" #: gajim/common/config.py:237 msgid "" "A semicolon-separated list of words that will be highlighted in group chats." msgstr "" "Спіс падзеленых кропкай з коскай слоў, якія трэба фарбаваць у групавых " "размовах." #: gajim/common/config.py:238 #, fuzzy msgid "" "If True, quits Gajim when X button of Window Manager is clicked. This " "setting is taken into account only if notification icon is used." msgstr "" "Калі true, Gajim сканчвае работу па націску кнопкі X вакна. Гэтае " "настаўленне ўлічваецца толькі разам з значкай прасторы паведамленняў." #: gajim/common/config.py:239 msgid "" "If True, Gajim hides the Roster window on pressing the X button instead of " "minimizing into the Dock." msgstr "" #: gajim/common/config.py:240 msgid "" "If True, Gajim will display an icon on each tab containing unread messages. " "Depending on the theme, this icon may be animated." msgstr "" "Калі true, Gajim паказвае значку на кожнай картцы з нечытанымі " "паведамленнямі. У залежнасці ад тэмы, гэтая значка можа быць і анімаванай." #: gajim/common/config.py:241 msgid "" "If True, Gajim will display the status message, if not empty, for every " "contact under the contact name in roster window." msgstr "Калі true, Gajim паказвае стан у галоўным вакне для кожнага чалавека" #: gajim/common/config.py:247 msgid "Define the position of the avatar in roster. Can be left or right" msgstr "" #: gajim/common/config.py:248 msgid "" "If False, Gajim will no longer print status line in chats when a contact " "changes his or her status and/or his or her status message." msgstr "Калі false, не паказваць паведамленні аб змене стану суразмоўцы." #: gajim/common/config.py:249 #, fuzzy msgid "" "Can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " "longer print status line in groupchats when a member changes his or her " "status and/or his or her status message. If \"all\" Gajim will print all " "status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " "group chat." msgstr "" "магчымыя значэнні: \"none\", \"all\" альбо \"in_and_out\". Калі опцыя " "выстаўленая ў \"none\", Gajim не будзе паказваць паведамленні аб змене стану " "суразмоўцаў у вакне размовы. Калі опцыя выстаўленая ў \"all\", Gajim будзе " "паказваць усе такія паведамленні. Калі опцыя выстаўленая ў \"in_and_out\", " "Gajim будзе паказваць толькі паведамленні аб сыходзе / ўваходзе суразмоўцы." #: gajim/common/config.py:251 msgid "Log XHTML messages instead of plain text messages." msgstr "" #: gajim/common/config.py:252 msgid "Background color of contacts when they just signed in." msgstr "Фонавы колер для толькі ўвайшоўшых людзей." #: gajim/common/config.py:253 msgid "Background color of contacts when they just signed out." msgstr "Фонавы колер для толькі сышоўшых людзей." #: gajim/common/config.py:255 msgid "" "If True, restored messages will use a smaller font than the default one." msgstr "" "Калі true, адноўленыя з папярэдняга сеанса паведамленні будуць мець меншы " "памер шрыфта." #: gajim/common/config.py:256 msgid "Don't show avatar for the transport itself." msgstr "Не паказваць аватар для транспарта." #: gajim/common/config.py:257 msgid "Don't show roster in the system taskbar." msgstr "Не паказваць галоўнае вакно на панэлі заданняў." #: gajim/common/config.py:258 msgid "" "If True and installed GTK+ and PyGTK versions are at least 2.8, make the " "window flash (the default behaviour in most Window Managers) when holding " "pending events." msgstr "" "Калі true і калі ўсталяваныя GTK+ і PyGTK версіі, вышэйшай за 2.8, міргаць " "вакном (звычайныя паводзіны ў бальшыні кіраўнікоў вокнаў) пры наяўнасці " "нягледжаных падзей." #: gajim/common/config.py:260 msgid "" "Jabberd1.4 does not like sha info when one join a password protected group " "chat. Turn this option to False to stop sending sha info in group chat " "presences." msgstr "" "Jabberd1.4 не любіць звесткі sha, калі чалавек заходзіць у абароненую " "паролем групавую размову. Змяніце значэнне гэтай опцыі на False, каб " "перастаць адпраўляць звесткі sha у групавыя размовы" #: gajim/common/config.py:263 #, fuzzy msgid "" "Controls the window where new messages are placed.\n" "'always' - All messages are sent to a single window.\n" "'always_with_roster' - Like 'always' but the messages are in a single window " "along with the roster.\n" "'never' - All messages get their own window.\n" "'peracct' - Messages for each account are sent to a specific window.\n" "'pertype' - Each message type (e.g. chats vs. groupchats) is sent to a " "specific window." msgstr "" "Вызначае вакно для новых паведамленняў.\n" "'always' - Усе паведамленні адпраўляюцца ў адзінае вакно.\n" "'never' - Усе паведамленні адпраўляюцца ў асобныя вокны.\n" "'peracct' - Паведамленні ад кожнага рахунка адпраўляюцца ў асобнае вакно.\n" "'pertype' - Паведамленні аднаго тыпу (напр., прыватныя і групавыя) " "адпраўляюцца ў асобныя вокны. Зважайце, што гэтыя змены будуць ужытыя толькі " "пасля перазапуску праграмы." #: gajim/common/config.py:264 msgid "" "Show roster on startup.\n" "'always' - Always show roster.\n" "'never' - Never show roster.\n" "'last_state' - Restore the last state roster." msgstr "" #: gajim/common/config.py:265 msgid "If False, you will no longer see the avatar in the chat window." msgstr "Калі false, не паказваць аватары ў вакне размовы." #: gajim/common/config.py:266 msgid "If True, pressing the escape key closes a tab/window." msgstr "Калі true, клавіша Escape закрывае картку / вакно." #: gajim/common/config.py:267 msgid "Hides the banner in a group chat window" msgstr "Хавае банер у групавой размове" #: gajim/common/config.py:268 msgid "Hides the banner in two persons chat window" msgstr "Хавае банер у прыватнай размове" #: gajim/common/config.py:269 msgid "Hides the group chat occupants list in group chat window." msgstr "Схаваць спіс удзельнікаў групавой размовы." #: gajim/common/config.py:270 msgid "" "In a chat, show the nickname at the beginning of a line only when it's not " "the same person talking than in previous message." msgstr "" "У групавой размове не паказваць мянушку, калі папярэдняе паведамленне " "напісаў той самы чалавек." #: gajim/common/config.py:271 msgid "Indentation when using merge consecutive nickname." msgstr "Водступ пры шматмэтавым прызначэнні паведамлення." #: gajim/common/config.py:272 #, fuzzy msgid "" "List of colors, separated by \":\", that will be used to color nicknames in " "group chats." msgstr "Спіс колераў для фарбавання мянушак у групавой размове." #: gajim/common/config.py:273 msgid "Ctrl-Tab go to next composing tab when none is unread." msgstr "" "Ctrl-Tab пераходзіць у наступную картку, калі няма нечытаных паведамленняў." #: gajim/common/config.py:274 msgid "" "Should we show the confirm metacontacts creation dialog or not? Empty string " "means we never show the dialog." msgstr "" "Ці трэба паказваць вакно пацверджання пры стварэнні мета-кантакта? Пусты " "радок адключае гэтае вакно." #: gajim/common/config.py:275 #, fuzzy msgid "" "Should we show the confirm block contact dialog or not? Empty string means " "we never show the dialog." msgstr "" "Ці трэба паказваць вакно пацверджання пры стварэнні мета-кантакта? Пусты " "радок адключае гэтае вакно." #: gajim/common/config.py:276 #, fuzzy msgid "" "Should we show the confirm custom status dialog or not? Empty string means " "we never show the dialog." msgstr "" "Ці трэба паказваць вакно пацверджання пры стварэнні мета-кантакта? Пусты " "радок адключае гэтае вакно." #: gajim/common/config.py:277 msgid "" "If True, you will be able to set a negative priority to your account in " "account modification window. BE CAREFUL, when you are logged in with a " "negative priority, you will NOT receive any message from your server." msgstr "" "Калі true, Вы зможаце выставіць для рахунка адмоўны прыярытэт. Увага: калі " "Вы ўвайшлі з адмоўным прыярытэтам, Вы не будзеце атрымліваць паведамленняў " "ад Вашага сервера." #: gajim/common/config.py:278 msgid "" "If True, Gajim will show number of online and total contacts in account and " "group rows." msgstr "" "Калі true, Gajim будзе паказваць у кантактным лісце колькасць падлучаных " "людзей і агульную колькасць у радках групаў і рахункаў." #: gajim/common/config.py:279 msgid "" "Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " "as if they were of this type" msgstr "" "Можа мець значэнні 'chat', 'normal' альбо быць пустым. Калі не пустое, то " "лічыць усе ўваходныя паведамленні гэтага тыпу" #: gajim/common/config.py:280 msgid "" "If True, Gajim will scroll and select the contact who sent you the last " "message, if chat window is not already opened." msgstr "" #: gajim/common/config.py:281 msgid "Time of inactivity needed before the change status window closes down." msgstr "" #: gajim/common/config.py:282 msgid "" "Maximum number of lines that are printed in conversations. Oldest lines are " "cleared." msgstr "" #: gajim/common/config.py:283 msgid "" "If True, notification windows from notification-daemon will be attached to " "notification icon." msgstr "" #: gajim/common/config.py:284 msgid "Choose interval between 2 checks of idleness." msgstr "" #: gajim/common/config.py:285 msgid "" "Valid uri schemes. Only schemes in this list will be accepted as \"real\" " "uri. (mailto and xmpp are handled separately)" msgstr "" #: gajim/common/config.py:286 msgid "If True, completion in groupchats will be like a shell auto-completion" msgstr "" #: gajim/common/config.py:287 msgid "" "When is self contact row displayed. Can be \"always\", \"when_other_resource" "\" or \"never\"" msgstr "" #: gajim/common/config.py:292 msgid "Optionally fix jingle output video framerate. Example: 10/1 or 25/2" msgstr "" #: gajim/common/config.py:293 msgid "Optionally resize jingle output video. Example: 320x240" msgstr "" #: gajim/common/config.py:294 msgid "If True, You will also see your webcam" msgstr "" #: gajim/common/config.py:297 msgid "" "If True, Gajim will try to use a STUN server when using Jingle. The one in " "\"stun_server\" option, or the one given by the XMPP server." msgstr "" #: gajim/common/config.py:298 msgid "STUN server to use when using Jingle" msgstr "" #: gajim/common/config.py:299 msgid "" "If True, Gajim will show affiliation of groupchat occupants by adding a " "colored square to the status icon" msgstr "" #: gajim/common/config.py:300 msgid "" "Proxy used for all outgoing connections if the account does not have a " "specific proxy configured" msgstr "" #: gajim/common/config.py:301 msgid "If True, Gajim will ignore incoming attention requestd (\"wizz\")." msgstr "" #: gajim/common/config.py:302 msgid "" "If enabled, Gajim will reopen chat windows that were opened last time Gajim " "was closed." msgstr "" #: gajim/common/config.py:303 msgid "" "If enabled, Gajim will show an icon to show that sent message has been " "received by your contact" msgstr "" #: gajim/common/config.py:304 msgid "Show a mini avatar in chat window tabs and in window icon" msgstr "" #: gajim/common/config.py:305 #, fuzzy msgid "If True, Gajim will use the Systems Keyring to store account passwords." msgstr "" "Калі true, Gajim будзе захоўваць паролі ад рахункаў з дапамогай кіраўніка " "пароляў Gnome Keyring (калі ўсталяваны)." #: gajim/common/config.py:306 msgid "Sets the encoding used by python-gnupg" msgstr "" #: gajim/common/config.py:307 msgid "If True, Gajim will execute XEP-0146 Commands." msgstr "" #: gajim/common/config.py:308 msgid "All non-compliant MAM Groupchats" msgstr "" #: gajim/common/config.py:324 msgid "" "Priority will change automatically according to your status. Priorities are " "defined in autopriority_* options." msgstr "" "Аўтаматычна змяняць прыярытэт згодна з станам. Прыярытэты выстаўленыя ў " "опцыях autopriority_*." #: gajim/common/config.py:332 msgid "" "Status used to autoconnect as. Can be online, chat, away, xa, dnd, " "invisible. NOTE: this option is used only if restore_last_status is disabled" msgstr "" #: gajim/common/config.py:333 msgid "If enabled, restore the last status that was used." msgstr "" #: gajim/common/config.py:335 msgid "" "If True, Contacts requesting authorization will be automatically accepted." msgstr "" #: gajim/common/config.py:336 #, fuzzy msgid "" "If False, this account will be disabled and will not appear in roster window." msgstr "Калі false, не паказваць аватары ў вакне размовы." #: gajim/common/config.py:339 msgid "" "If disabled, don't sign presences with GPG key, even if GPG is configured." msgstr "" #: gajim/common/config.py:341 msgid "Enable ESessions encryption for this account." msgstr "" #: gajim/common/config.py:342 msgid "Should Gajim automatically start an encrypted session when possible?" msgstr "" #: gajim/common/config.py:343 msgid "Allow plaintext connections" msgstr "" #: gajim/common/config.py:346 msgid "" "List (space separated) of authentication mechanisms to try. Can contain " "ANONYMOUS, EXTERNAL, GSSAPI, SCRAM-SHA-1-PLUS, SCRAM-SHA-1, DIGEST-MD5, " "PLAIN, X-MESSENGER-OAUTH2 or XEP-0078" msgstr "" #: gajim/common/config.py:347 msgid "" "Show a warning dialog before sending password on an plaintext connection. " "Can be 'warn', 'connect', 'disconnect'" msgstr "" #: gajim/common/config.py:348 msgid "Show a warning dialog before using standard SSL library." msgstr "" #: gajim/common/config.py:349 msgid "" "Show a warning dialog before sending PLAIN password over a plain connection." msgstr "" #: gajim/common/config.py:352 msgid "Space separated list of ssl errors to ignore." msgstr "" #: gajim/common/config.py:358 msgid "" "Space separated list of JIDs for which you do not want to store logs. You " "can also add account name to log nothing for this account." msgstr "" #: gajim/common/config.py:359 msgid "" "On startup, Gajim will download logs stored on server, provided the server " "supports XEP-0313" msgstr "" #: gajim/common/config.py:360 msgid "" "Space separated list of JIDs for which you accept to not log conversations " "if he does not want to." msgstr "" #: gajim/common/config.py:363 msgid "Whitespace sent after inactivity" msgstr "" #: gajim/common/config.py:364 msgid "XMPP ping sent after inactivity" msgstr "" #: gajim/common/config.py:368 msgid "" "How many seconds to wait for the answer of ping alive packet before we try " "to reconnect?" msgstr "" #: gajim/common/config.py:372 msgid "Jabberd2 workaround" msgstr "Выпраўленне хібы Jabberd2" #: gajim/common/config.py:375 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." msgstr "" "Калі выстаўленая гэтая опцыя, Gajim будзе ўжываць для перадачы файлаў " "выстаўленыя IP-адрас і проксі-серверы з параметра file_transfer_proxies." #: gajim/common/config.py:376 msgid "" "If True, Gajim will test file transfer proxies on startup to be sure it " "works. Openfire's proxies are known to fail this test even if they work." msgstr "" #: gajim/common/config.py:389 msgid "Answer to receipt requests" msgstr "" #: gajim/common/config.py:390 msgid "Sent receipt requests" msgstr "" #: gajim/common/config.py:399 #, fuzzy msgid "" "Allow Gajim to send information about the operating system you are running." msgstr "" "Калі гэтая опцыя ўключаная, Gajim далучыцца да гэтай групавой размовы пры " "запуску" #: gajim/common/config.py:400 #, fuzzy msgid "Allow Gajim to send your local time." msgstr "%s хоча адправіць Вам файл." #: gajim/common/config.py:401 msgid "" "When negotiating an encrypted session, should Gajim assume you want your " "messages to be logged?" msgstr "" #: gajim/common/config.py:404 #, fuzzy msgid "Message that is sent to contacts you want to add" msgstr "Запоўніце палі звесткамі, каб дадаць чалавека ў спіс" #: gajim/common/config.py:405 msgid "" "If enabled and if server supports this feature, Gajim will receive messages " "sent and received by other resources." msgstr "" #: gajim/common/config.py:406 msgid "" "If enabled, Gajim will send your local IPs so your contact can connect to " "your machine to transfer files." msgstr "" #: gajim/common/config.py:407 #, fuzzy msgid "Latest token for OAuth 2.0 authentication." msgstr "Аўтарызацыя" #: gajim/common/config.py:408 #, fuzzy msgid "client_id for OAuth 2.0 authentication." msgstr "Аўтарызацыя" #: gajim/common/config.py:409 #, fuzzy msgid "redirect_url for OAuth 2.0 authentication." msgstr "Аўтарызацыя" #: gajim/common/config.py:410 msgid "" "Space separated list of JIDs for which we want to re-open a chat window on " "next startup." msgstr "" #: gajim/common/config.py:412 msgid "HTTP Upload: Enable HTTPS Verification" msgstr "" #: gajim/common/config.py:413 msgid "" "Preferred file transfer mechanism for file drag&drop on chat window. Can be " "'httpupload' (default) or 'jingle'" msgstr "" #: gajim/common/config.py:476 gajim/common/config.py:481 msgid "Language for which we want to check misspelled words" msgstr "Мова праверкі правапісу" #: gajim/common/config.py:478 msgid "The currently active encryption for that contact" msgstr "" #: gajim/common/config.py:482 msgid "" "How many lines to request from server when entering a groupchat. -1 means no " "limit, -2 means global value" msgstr "" #: gajim/common/config.py:483 msgid "" "Minutes of backlog to request when entering a groupchat. -1 means no limit, " "-2 means global value" msgstr "" #: gajim/common/config.py:484 msgid "State whether we want a notification for every message in this room" msgstr "" #: gajim/common/config.py:487 msgid "" "State whether plugins should be activated on startup (this is saved on Gajim " "exit). This option SHOULD NOT be used to (de)activate plug-ins. Use GUI " "instead." msgstr "" #: gajim/common/config.py:492 gajim/common/pep.py:157 msgid "Sleeping" msgstr "Сон" #: gajim/common/config.py:493 msgid "Back soon" msgstr "Хутка буду" #: gajim/common/config.py:493 msgid "Back in some minutes." msgstr "Хутка буду." #: gajim/common/config.py:494 gajim/common/pep.py:127 msgid "Eating" msgstr "Ежа" #: gajim/common/config.py:494 msgid "I'm eating, so leave me a message." msgstr "Ямо, пакіньце мне паведамленне." #: gajim/common/config.py:495 msgid "Movie" msgstr "Фільм" #: gajim/common/config.py:495 msgid "I'm watching a movie." msgstr "Гляджу фільм." #: gajim/common/config.py:496 gajim/common/pep.py:186 msgid "Working" msgstr "Працую" #: gajim/common/config.py:496 msgid "I'm working." msgstr "Працую." #: gajim/common/config.py:497 msgid "Phone" msgstr "Тэлефон" #: gajim/common/config.py:497 msgid "I'm on the phone." msgstr "Я на тэлефоне." #: gajim/common/config.py:498 msgid "Out" msgstr "Сышоў" #: gajim/common/config.py:498 msgid "I'm out enjoying life." msgstr "Я цешуся з жыцця." #: gajim/common/config.py:509 msgid "I'm available." msgstr "Я даступны." #: gajim/common/config.py:510 msgid "I'm free for chat." msgstr "Я магу размаўляць." #: gajim/common/config.py:512 msgid "I'm not available." msgstr "Мяне няма." #: gajim/common/config.py:513 msgid "Do not disturb." msgstr "Не турбаваць." #: gajim/common/config.py:514 gajim/common/config.py:515 msgid "Bye!" msgstr "Бывай!" #: gajim/common/config.py:526 msgid "" "Sound to play when a group chat message contains one of the words in " "muc_highlight_words, or when a group chat message contains your nickname." msgstr "" "Прайграць гэты гук, калі прыходзіць групавое паведамленне з адным з слоў, " "вызначаных у параметры muc_highlight_words, ці калі гэтае паведамленне " "ўтрымлівае Вашую мянушку." #: gajim/common/config.py:527 msgid "Sound to play when any MUC message arrives." msgstr "Прайграць гук пры атрыманні паведамлення MUC." #: gajim/common/config.py:535 gajim/common/optparser.py:357 msgid "green" msgstr "зялёны" #: gajim/common/config.py:539 gajim/common/optparser.py:343 msgid "grocery" msgstr "садавіна" #: gajim/common/config.py:543 msgid "human" msgstr "чалавек" #: gajim/common/config.py:547 msgid "marine" msgstr "мора" #: gajim/common/config.py:554 #, fuzzy msgid "Tor" msgstr "Да" #: gajim/common/commands.py:86 msgid "Change status information" msgstr "Змяніць звесткі аб стане" #: gajim/common/commands.py:108 msgid "Change status" msgstr "Змяніць стан" #: gajim/common/commands.py:109 msgid "Set the presence type and description" msgstr "Выставіць тып прысутнасці і апісанне" #: gajim/common/commands.py:115 msgid "Free for chat" msgstr "Вольны для размовы" #: gajim/common/commands.py:116 msgid "Online" msgstr "У сетцы" #: gajim/common/commands.py:118 msgid "Extended away" msgstr "Пашыраны рэжым адсутнасці" #: gajim/common/commands.py:119 msgid "Do not disturb" msgstr "Не турбаваць" #: gajim/common/commands.py:120 msgid "Offline - disconnect" msgstr "Адлучаны - па-за сеткай" #: gajim/common/commands.py:125 msgid "Presence description:" msgstr "Апісанне прысутнасці:" #: gajim/common/commands.py:160 gajim/common/commands.py:343 msgid "The status has been changed." msgstr "Стан змяніўся." #: gajim/common/commands.py:192 gajim/common/commands.py:225 msgid "Leave Groupchats" msgstr "Сысці з групавых размоў" #: gajim/common/commands.py:215 #, python-format msgid "%(nickname)s on %(room_jid)s" msgstr "%(nickname)s на %(room_jid)s" #: gajim/common/commands.py:219 msgid "You have not joined a groupchat." msgstr "Вы не ўвайшлі ў пакой групавой размовы." #: gajim/common/commands.py:226 msgid "Choose the groupchats you want to leave" msgstr "Выберыце групавыя размовы, з якіх Вы хочаце сысці" #: gajim/common/commands.py:271 #, fuzzy msgid "You left the following groupchats:" msgstr "Вы сышлі з наступных групавых размоў:" #: gajim/common/commands.py:283 #, fuzzy msgid "Forward unread messages" msgstr "%d нечытанае паведамленне" #: gajim/common/commands.py:310 msgid "All unread messages have been forwarded." msgstr "" #: gajim/common/commands.py:318 #, fuzzy msgid "Forward unread message then disconnect" msgstr "%d нечытанае паведамленне" #: gajim/common/httpupload.py:137 #, fuzzy msgid "File is empty" msgstr "Месца файла" #: gajim/common/httpupload.py:140 #, fuzzy msgid "File does not exist" msgstr "Такой групавой размовы няма." #: gajim/common/httpupload.py:147 gajim/common/httpupload.py:204 #, python-format msgid "File is too large, maximum allowed file size is: %s" msgstr "" #: gajim/common/check_paths.py:37 msgid "creating logs database" msgstr "стварэнне базы журналаў" #: gajim/common/check_paths.py:98 #, fuzzy msgid "creating cache database" msgstr "стварэнне базы журналаў" #: gajim/common/check_paths.py:261 #, fuzzy, python-format msgid "moving %(src)s to %(dst)s" msgstr "Адправіць %s" #: gajim/common/check_paths.py:287 gajim/common/check_paths.py:294 #: gajim/common/check_paths.py:301 gajim/common/check_paths.py:308 #: gajim/common/check_paths.py:315 gajim/common/check_paths.py:322 #: gajim/common/check_paths.py:329 gajim/common/check_paths.py:336 #, python-format msgid "%s is a file but it should be a directory" msgstr "%s з'яўляецца файлам, але павінна быць дырэкторыя" #: gajim/common/check_paths.py:288 gajim/common/check_paths.py:295 #: gajim/common/check_paths.py:302 gajim/common/check_paths.py:309 #: gajim/common/check_paths.py:316 gajim/common/check_paths.py:323 #: gajim/common/check_paths.py:330 gajim/common/check_paths.py:337 #: gajim/common/check_paths.py:349 gajim/common/check_paths.py:357 msgid "Gajim will now exit" msgstr "Gajim сканчвае работу" #: gajim/common/check_paths.py:348 gajim/common/check_paths.py:356 #, python-format msgid "%s is a directory but should be a file" msgstr "%s з'яўляецца дырэкторыяй, але павінны быць файл" #: gajim/common/optparser.py:55 #, python-format msgid "Error: cannot open %s for reading" msgstr "Памылка: немагчыма прачытаць %s" #: gajim/common/optparser.py:352 gajim/common/optparser.py:353 msgid "cyan" msgstr "cyan" #: gajim/common/optparser.py:421 msgid "migrating logs database to indices" msgstr "перанос базы журналаў у індэкс" #: gajim/common/logging_helpers.py:34 #, python-format msgid "%s is not a valid loglevel" msgstr "" #: gajim/common/connection.py:83 msgid "Unable to get issuer certificate" msgstr "" #: gajim/common/connection.py:84 msgid "Unable to get certificate CRL" msgstr "" #: gajim/common/connection.py:85 msgid "Unable to decrypt certificate's signature" msgstr "" #: gajim/common/connection.py:86 msgid "Unable to decrypt CRL's signature" msgstr "" #: gajim/common/connection.py:87 #, fuzzy msgid "Unable to decode issuer public key" msgstr "Немагчыма загрузіць модуль idle" #: gajim/common/connection.py:88 msgid "Certificate signature failure" msgstr "" #: gajim/common/connection.py:89 msgid "CRL signature failure" msgstr "" #: gajim/common/connection.py:90 msgid "Certificate is not yet valid" msgstr "" #: gajim/common/connection.py:91 msgid "Certificate has expired" msgstr "" #: gajim/common/connection.py:92 msgid "CRL is not yet valid" msgstr "" #: gajim/common/connection.py:93 msgid "CRL has expired" msgstr "" #: gajim/common/connection.py:94 msgid "Format error in certificate's notBefore field" msgstr "" #: gajim/common/connection.py:95 msgid "Format error in certificate's notAfter field" msgstr "" #: gajim/common/connection.py:96 msgid "Format error in CRL's lastUpdate field" msgstr "" #: gajim/common/connection.py:97 msgid "Format error in CRL's nextUpdate field" msgstr "" #: gajim/common/connection.py:98 msgid "Out of memory" msgstr "" #: gajim/common/connection.py:99 msgid "Self signed certificate" msgstr "" #: gajim/common/connection.py:100 msgid "Self signed certificate in certificate chain" msgstr "" #: gajim/common/connection.py:101 msgid "Unable to get local issuer certificate" msgstr "" #: gajim/common/connection.py:102 msgid "Unable to verify the first certificate" msgstr "" #: gajim/common/connection.py:103 msgid "Certificate chain too long" msgstr "" #: gajim/common/connection.py:104 msgid "Certificate revoked" msgstr "" #: gajim/common/connection.py:105 #, fuzzy msgid "Invalid CA certificate" msgstr "Няправільнае імя карыстальніка" #: gajim/common/connection.py:106 msgid "Path length constraint exceeded" msgstr "" #: gajim/common/connection.py:107 msgid "Unsupported certificate purpose" msgstr "" #: gajim/common/connection.py:108 msgid "Certificate not trusted" msgstr "" #: gajim/common/connection.py:109 msgid "Certificate rejected" msgstr "" #: gajim/common/connection.py:110 msgid "Subject issuer mismatch" msgstr "" #: gajim/common/connection.py:111 msgid "Authority and subject key identifier mismatch" msgstr "" #: gajim/common/connection.py:112 msgid "Authority and issuer serial number mismatch" msgstr "" #: gajim/common/connection.py:113 msgid "Key usage does not include certificate signing" msgstr "" #: gajim/common/connection.py:114 msgid "Application verification failure" msgstr "" #: gajim/common/connection.py:876 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Злучэнне для рахунка \"%s\" згубленае" #: gajim/common/connection.py:877 msgid "Reconnect manually." msgstr "Перадалучыцеся самастойна." #: gajim/common/connection.py:888 #, fuzzy, python-format msgid "Server %(name)s answered wrongly to register request: %(error)s" msgstr "Транспарт %s некарэктна адказаў, каб зарэгістраваць запыт: %s" #: gajim/common/connection.py:930 #, python-format msgid "Server %s provided a different registration form" msgstr "" #: gajim/common/connection.py:1283 #, fuzzy, python-format msgid "Could not connect to \"%(host)s\" via proxy \"%(proxy)s\"" msgstr "Немагчыма злучыцца з \"%s\"" #: gajim/common/connection.py:1286 #, fuzzy, python-format msgid "Could not connect to \"%(host)s\"" msgstr "Немагчыма злучыцца з \"%s\"" #: gajim/common/connection.py:1293 #, fuzzy, python-format msgid "Server replied: %s" msgstr "Захаваць у: %s" #: gajim/common/connection.py:1308 #, fuzzy msgid "Connection to proxy failed" msgstr "Памылка злучэння" #: gajim/common/connection.py:1346 gajim/common/connection.py:1449 #, fuzzy, python-format msgid "Could not connect to account %s" msgstr "Немагчыма злучыцца з \"%s\"" #: gajim/common/connection.py:1347 gajim/common/connection.py:1450 #, fuzzy, python-format msgid "Connection with account %s has been lost. Retry connecting." msgstr "Злучэнне для рахунка \"%s\" згубленае" #: gajim/common/connection.py:1372 #, python-format msgid "The authenticity of the %s certificate could be invalid" msgstr "" #: gajim/common/connection.py:1375 #, python-format msgid "" "\n" "SSL Error: %s" msgstr "" #: gajim/common/connection.py:1377 #, python-format msgid "" "\n" "Unknown SSL error: %d" msgstr "" #: gajim/common/connection.py:1423 #, python-format msgid "" "The authenticity of the %s certificate could be invalid.\n" "The certificate does not cover this domain." msgstr "" #: gajim/common/connection.py:1473 gajim/common/connection.py:2238 #: gajim/common/zeroconf/connection_zeroconf.py:192 #, python-format msgid "Could not connect to \"%s\"" msgstr "Немагчыма злучыцца з \"%s\"" #: gajim/common/connection.py:1512 #, python-format msgid "Authentication failed with \"%s\"" msgstr "Памылка аўтарызацыі з \"%s\"" #: gajim/common/connection.py:1513 msgid "Please check your login and password for correctness." msgstr "Праверце звесткі аўтарызацыі." #: gajim/common/connection.py:2097 #, python-format msgid "Sent contact: \"%(jid)s\" (%(name)s)" msgstr "" #: gajim/common/connection.py:2101 #, fuzzy msgid "Sent contacts:" msgstr "Людзі" #: gajim/common/connection.py:2255 gajim/common/connection.py:2277 msgid "Not fetched because of invisible status" msgstr "Не атрымана з-за нябачнага стану" #: gajim/common/dbus_support.py:44 msgid "D-Bus python bindings are missing in this computer" msgstr "Файлы падтрымкі python для D-Bus адсутнічаюць на гэтым кампутары" #: gajim/common/dbus_support.py:45 gajim/common/dbus_support.py:56 msgid "D-Bus capabilities of Gajim cannot be used" msgstr "Немагчыма скарыстаць D-Bus для Gajim" #: gajim/common/dbus_support.py:55 msgid "D-Bus does not run correctly on this machine" msgstr "" #: gajim/common/dbus_support.py:58 #, fuzzy msgid "D-Bus does not run correctly on this machine: system bus not present" msgstr "D-Bus няма на гэтым кампутары, альбо няма адпаведнага модуля python" #: gajim/common/dbus_support.py:61 #, fuzzy msgid "D-Bus does not run correctly on this machine: session bus not present" msgstr "D-Bus няма на гэтым кампутары, альбо няма адпаведнага модуля python" #: gajim/common/multimedia_helpers.py:45 #, fuzzy msgid "Default device" msgstr "Стандартныя паведамленні стану" #: gajim/common/multimedia_helpers.py:66 msgid "Audio test" msgstr "" #: gajim/common/multimedia_helpers.py:69 gajim/common/multimedia_helpers.py:85 #: gajim/common/multimedia_helpers.py:99 gajim/common/multimedia_helpers.py:117 msgid "Autodetect" msgstr "" #: gajim/common/multimedia_helpers.py:72 gajim/common/multimedia_helpers.py:87 #, fuzzy, python-format msgid "ALSA: %s" msgstr "Памер: %s" #: gajim/common/multimedia_helpers.py:75 gajim/common/multimedia_helpers.py:89 #, fuzzy, python-format msgid "Pulse: %s" msgstr "Файл: %s" #: gajim/common/multimedia_helpers.py:83 msgid "Fake audio output" msgstr "" #: gajim/common/multimedia_helpers.py:96 msgid "Video test" msgstr "" #: gajim/common/multimedia_helpers.py:101 #, python-format msgid "V4L2: %s" msgstr "" #: gajim/common/multimedia_helpers.py:104 #, fuzzy msgid "Screen" msgstr "зялёны" #: gajim/common/multimedia_helpers.py:111 msgid "Fake video output" msgstr "" #: gajim/common/multimedia_helpers.py:114 #, python-format msgid "X Window System (X11/XShm/Xv): %s" msgstr "" #: gajim/common/multimedia_helpers.py:116 msgid "X Window System (without Xv)" msgstr "" #: gajim/common/pep.py:27 msgid "Afraid" msgstr "" #: gajim/common/pep.py:28 msgid "Amazed" msgstr "" #: gajim/common/pep.py:29 msgid "Amorous" msgstr "" #: gajim/common/pep.py:30 msgid "Angry" msgstr "" #: gajim/common/pep.py:31 msgid "Annoyed" msgstr "" #: gajim/common/pep.py:32 msgid "Anxious" msgstr "" #: gajim/common/pep.py:33 #, fuzzy msgid "Aroused" msgstr "Прыпынена" #: gajim/common/pep.py:34 msgid "Ashamed" msgstr "" #: gajim/common/pep.py:35 #, fuzzy msgid "Bored" msgstr "Тлусты" #: gajim/common/pep.py:36 #, fuzzy msgid "Brave" msgstr "Мае " #: gajim/common/pep.py:37 msgid "Calm" msgstr "" #: gajim/common/pep.py:38 #, fuzzy msgid "Cautious" msgstr "Размовы" #: gajim/common/pep.py:39 #, fuzzy msgid "Cold" msgstr "Тлусты" #: gajim/common/pep.py:40 #, fuzzy msgid "Confident" msgstr "_Змест" #: gajim/common/pep.py:41 msgid "Confused" msgstr "" #: gajim/common/pep.py:42 #, fuzzy msgid "Contemplative" msgstr "Скончаная" #: gajim/common/pep.py:43 #, fuzzy msgid "Contented" msgstr "_Змест" #: gajim/common/pep.py:44 msgid "Cranky" msgstr "" #: gajim/common/pep.py:45 msgid "Crazy" msgstr "" #: gajim/common/pep.py:46 #, fuzzy msgid "Creative" msgstr "Неактывізаваны" #: gajim/common/pep.py:47 #, fuzzy msgid "Curious" msgstr "спасылка" #: gajim/common/pep.py:48 #, fuzzy msgid "Dejected" msgstr "Выдаліць" #: gajim/common/pep.py:49 msgid "Depressed" msgstr "" #: gajim/common/pep.py:50 #, fuzzy msgid "Disappointed" msgstr "Адключана" #: gajim/common/pep.py:51 msgid "Disgusted" msgstr "" #: gajim/common/pep.py:52 #, fuzzy msgid "Dismayed" msgstr "Адключана" #: gajim/common/pep.py:53 #, fuzzy msgid "Distracted" msgstr "Адключана" #: gajim/common/pep.py:54 msgid "Embarrassed" msgstr "" #: gajim/common/pep.py:55 msgid "Envious" msgstr "" #: gajim/common/pep.py:56 #, fuzzy msgid "Excited" msgstr "Актывізаваны" #: gajim/common/pep.py:57 msgid "Flirtatious" msgstr "" #: gajim/common/pep.py:58 msgid "Frustrated" msgstr "" #: gajim/common/pep.py:59 msgid "Grateful" msgstr "" #: gajim/common/pep.py:60 msgid "Grieving" msgstr "" #: gajim/common/pep.py:61 #, fuzzy msgid "Grumpy" msgstr "Група" #: gajim/common/pep.py:62 msgid "Guilty" msgstr "" #: gajim/common/pep.py:63 msgid "Happy" msgstr "" #: gajim/common/pep.py:64 msgid "Hopeful" msgstr "" #: gajim/common/pep.py:65 #, fuzzy msgid "Hot" msgstr "_Вузел:" #: gajim/common/pep.py:66 msgid "Humbled" msgstr "" #: gajim/common/pep.py:67 msgid "Humiliated" msgstr "" #: gajim/common/pep.py:68 msgid "Hungry" msgstr "" #: gajim/common/pep.py:69 msgid "Hurt" msgstr "" #: gajim/common/pep.py:70 #, fuzzy msgid "Impressed" msgstr "паведамленне" #: gajim/common/pep.py:71 msgid "In Awe" msgstr "" #: gajim/common/pep.py:72 msgid "In Love" msgstr "" #: gajim/common/pep.py:73 msgid "Indignant" msgstr "" #: gajim/common/pep.py:74 msgid "Interested" msgstr "" #: gajim/common/pep.py:75 #, fuzzy msgid "Intoxicated" msgstr "Актывізаваны" #: gajim/common/pep.py:76 #, fuzzy msgid "Invincible" msgstr "Нябачны" #: gajim/common/pep.py:77 msgid "Jealous" msgstr "" #: gajim/common/pep.py:78 #, fuzzy msgid "Lonely" msgstr "адзін" #: gajim/common/pep.py:79 #, fuzzy msgid "Lost" msgstr "_Вузел:" #: gajim/common/pep.py:80 msgid "Lucky" msgstr "" #: gajim/common/pep.py:81 #, fuzzy msgid "Mean" msgstr "Нямецкая" #: gajim/common/pep.py:82 #, fuzzy msgid "Moody" msgstr "_Змяніць" #: gajim/common/pep.py:83 msgid "Nervous" msgstr "" #: gajim/common/pep.py:84 msgid "Neutral" msgstr "" #: gajim/common/pep.py:85 #, fuzzy msgid "Offended" msgstr "Адключаны" #: gajim/common/pep.py:86 msgid "Outraged" msgstr "" #: gajim/common/pep.py:87 msgid "Playful" msgstr "" #: gajim/common/pep.py:88 #, fuzzy msgid "Proud" msgstr "Група" #: gajim/common/pep.py:89 msgid "Relaxed" msgstr "" #: gajim/common/pep.py:90 #, fuzzy msgid "Relieved" msgstr "адзінаццаць" #: gajim/common/pep.py:91 msgid "Remorseful" msgstr "" #: gajim/common/pep.py:92 msgid "Restless" msgstr "" #: gajim/common/pep.py:93 #, fuzzy msgid "Sad" msgstr "Марнаванне часу" #: gajim/common/pep.py:94 msgid "Sarcastic" msgstr "" #: gajim/common/pep.py:95 #, fuzzy msgid "Satisfied" msgstr "Апошняя змена:" #: gajim/common/pep.py:96 msgid "Serious" msgstr "" #: gajim/common/pep.py:97 msgid "Shocked" msgstr "" #: gajim/common/pep.py:98 msgid "Shy" msgstr "" #: gajim/common/pep.py:99 #, fuzzy msgid "Sick" msgstr "Мянушка" #: gajim/common/pep.py:100 #, fuzzy msgid "Sleepy" msgstr "Сон" #: gajim/common/pep.py:101 msgid "Spontaneous" msgstr "" #: gajim/common/pep.py:102 #, fuzzy msgid "Stressed" msgstr "Вуліца:" #: gajim/common/pep.py:103 msgid "Strong" msgstr "" #: gajim/common/pep.py:104 #, fuzzy msgid "Surprised" msgstr "Падпісаны" #: gajim/common/pep.py:105 msgid "Thankful" msgstr "" #: gajim/common/pep.py:106 msgid "Thirsty" msgstr "" #: gajim/common/pep.py:107 #, fuzzy msgid "Tired" msgstr "Час" #: gajim/common/pep.py:108 #, fuzzy msgid "Undefined" msgstr "дзевяць" #: gajim/common/pep.py:109 msgid "Weak" msgstr "" #: gajim/common/pep.py:110 msgid "Worried" msgstr "" #: gajim/common/pep.py:113 #, fuzzy msgid "Doing Chores" msgstr "Няправільны вузел" #: gajim/common/pep.py:114 msgid "Buying Groceries" msgstr "" #: gajim/common/pep.py:115 #, fuzzy msgid "Cleaning" msgstr "Вечар" #: gajim/common/pep.py:116 #, fuzzy msgid "Cooking" msgstr "Піша" #: gajim/common/pep.py:117 msgid "Doing Maintenance" msgstr "" #: gajim/common/pep.py:118 msgid "Doing the Dishes" msgstr "" #: gajim/common/pep.py:119 msgid "Doing the Laundry" msgstr "" #: gajim/common/pep.py:120 #, fuzzy msgid "Gardening" msgstr "Раніца" #: gajim/common/pep.py:121 msgid "Running an Errand" msgstr "" #: gajim/common/pep.py:122 #, fuzzy msgid "Walking the Dog" msgstr "усе з групы" #: gajim/common/pep.py:123 #, fuzzy msgid "Drinking" msgstr "Працую" #: gajim/common/pep.py:124 msgid "Having a Beer" msgstr "" #: gajim/common/pep.py:125 msgid "Having Coffee" msgstr "" #: gajim/common/pep.py:126 msgid "Having Tea" msgstr "" #: gajim/common/pep.py:128 msgid "Having a Snack" msgstr "" #: gajim/common/pep.py:129 msgid "Having Breakfast" msgstr "" #: gajim/common/pep.py:130 msgid "Having Dinner" msgstr "" #: gajim/common/pep.py:131 msgid "Having Lunch" msgstr "" #: gajim/common/pep.py:132 msgid "Exercising" msgstr "" #: gajim/common/pep.py:133 gajim/common/pep.py:178 msgid "Cycling" msgstr "" #: gajim/common/pep.py:134 #, fuzzy msgid "Dancing" msgstr "Вечар" #: gajim/common/pep.py:135 #, fuzzy msgid "Hiking" msgstr "Пакаранне %s" #: gajim/common/pep.py:136 #, fuzzy msgid "Jogging" msgstr "_Далучыцца" #: gajim/common/pep.py:137 msgid "Playing Sports" msgstr "" #: gajim/common/pep.py:138 msgid "Running" msgstr "" #: gajim/common/pep.py:139 #, fuzzy msgid "Skiing" msgstr "Працую" #: gajim/common/pep.py:140 msgid "Swimming" msgstr "" #: gajim/common/pep.py:141 #, fuzzy msgid "Working out" msgstr "Працую" #: gajim/common/pep.py:142 #, fuzzy msgid "Grooming" msgstr "пакой" #: gajim/common/pep.py:143 msgid "At the Spa" msgstr "" #: gajim/common/pep.py:144 msgid "Brushing Teeth" msgstr "" #: gajim/common/pep.py:145 msgid "Getting a Haircut" msgstr "" #: gajim/common/pep.py:146 #, fuzzy msgid "Shaving" msgstr "Ежа" #: gajim/common/pep.py:147 msgid "Taking a Bath" msgstr "" #: gajim/common/pep.py:148 msgid "Taking a Shower" msgstr "" #: gajim/common/pep.py:149 msgid "Having an Appointment" msgstr "" #: gajim/common/pep.py:150 gajim/data/gui/gajim_themes_window.ui:363 msgid "Inactive" msgstr "Неактыўны" #: gajim/common/pep.py:151 msgid "Day Off" msgstr "" #: gajim/common/pep.py:152 #, fuzzy msgid "Hanging out" msgstr "Змяненне тэмы" #: gajim/common/pep.py:153 #, fuzzy msgid "Hiding" msgstr "Пакаранне %s" #: gajim/common/pep.py:154 msgid "On Vacation" msgstr "" #: gajim/common/pep.py:155 #, fuzzy msgid "Praying" msgstr "Ежа" #: gajim/common/pep.py:156 msgid "Scheduled Holiday" msgstr "" #: gajim/common/pep.py:158 #, fuzzy msgid "Thinking" msgstr "Працую" #: gajim/common/pep.py:159 msgid "Relaxing" msgstr "" #: gajim/common/pep.py:160 #, fuzzy msgid "Fishing" msgstr "Пакаранне %s" #: gajim/common/pep.py:161 #, fuzzy msgid "Gaming" msgstr "Ежа" #: gajim/common/pep.py:162 #, fuzzy msgid "Going out" msgstr "З_ысці" #: gajim/common/pep.py:163 #, fuzzy msgid "Partying" msgstr "Ежа" #: gajim/common/pep.py:164 #, fuzzy msgid "Reading" msgstr "Прычына" #: gajim/common/pep.py:165 #, fuzzy msgid "Rehearsing" msgstr "Прычына" #: gajim/common/pep.py:166 #, fuzzy msgid "Shopping" msgstr "Сон" #: gajim/common/pep.py:167 #, fuzzy msgid "Smoking" msgstr "Працую" #: gajim/common/pep.py:168 msgid "Socializing" msgstr "" #: gajim/common/pep.py:169 #, fuzzy msgid "Sunbathing" msgstr "Ежа" #: gajim/common/pep.py:170 msgid "Watching TV" msgstr "" #: gajim/common/pep.py:171 #, fuzzy msgid "Watching a Movie" msgstr "Гляджу фільм." #: gajim/common/pep.py:172 #, fuzzy msgid "Talking" msgstr "Ежа" #: gajim/common/pep.py:173 msgid "In Real Life" msgstr "" #: gajim/common/pep.py:174 #, fuzzy msgid "On the Phone" msgstr "Я на тэлефоне." #: gajim/common/pep.py:175 msgid "On Video Phone" msgstr "" #: gajim/common/pep.py:176 #, fuzzy msgid "Traveling" msgstr "Перадача" #: gajim/common/pep.py:177 #, fuzzy msgid "Commuting" msgstr "Піша" #: gajim/common/pep.py:179 msgid "Driving" msgstr "" #: gajim/common/pep.py:180 msgid "In a Car" msgstr "" #: gajim/common/pep.py:181 msgid "On a Bus" msgstr "" #: gajim/common/pep.py:182 #, fuzzy msgid "On a Plane" msgstr "У сетцы" #: gajim/common/pep.py:183 #, fuzzy msgid "On a Train" msgstr "Адкрыць _спасылку" #: gajim/common/pep.py:184 msgid "On a Trip" msgstr "" #: gajim/common/pep.py:185 #, fuzzy msgid "Walking" msgstr "Працую" #: gajim/common/pep.py:187 #, fuzzy msgid "Coding" msgstr "Піша" #: gajim/common/pep.py:188 msgid "In a Meeting" msgstr "" #: gajim/common/pep.py:189 msgid "Studying" msgstr "" #: gajim/common/pep.py:190 #, fuzzy msgid "Writing" msgstr "Працую" #: gajim/common/pep.py:195 msgid "accuracy" msgstr "" #: gajim/common/pep.py:196 #, fuzzy msgid "alt" msgstr "Прадвызначана" #: gajim/common/pep.py:197 msgid "area" msgstr "" #: gajim/common/pep.py:198 #, fuzzy msgid "bearing" msgstr "мора" #: gajim/common/pep.py:199 #, fuzzy msgid "building" msgstr "Пакаранне %s" #: gajim/common/pep.py:200 #, fuzzy msgid "country" msgstr "Краіна:" #: gajim/common/pep.py:201 #, fuzzy msgid "countrycode" msgstr "Рахунак" #: gajim/common/pep.py:202 msgid "datum" msgstr "" #: gajim/common/pep.py:203 #, fuzzy msgid "description" msgstr "Апісанне" #: gajim/common/pep.py:204 #, fuzzy msgid "error" msgstr "Памылка Avahi" #: gajim/common/pep.py:205 msgid "floor" msgstr "" #: gajim/common/pep.py:206 msgid "lat" msgstr "" #: gajim/common/pep.py:207 msgid "locality" msgstr "" #: gajim/common/pep.py:208 #, fuzzy msgid "lon" msgstr "адзін" #: gajim/common/pep.py:209 msgid "postalcode" msgstr "" #: gajim/common/pep.py:210 msgid "region" msgstr "" #: gajim/common/pep.py:211 msgid "room" msgstr "пакой" #: gajim/common/pep.py:212 msgid "speed" msgstr "" #: gajim/common/pep.py:213 msgid "street" msgstr "" #: gajim/common/pep.py:214 msgid "text" msgstr "" #: gajim/common/pep.py:215 msgid "timestamp" msgstr "" #: gajim/common/pep.py:216 msgid "uri" msgstr "спасылка" #: gajim/common/pep.py:343 msgid "Unknown Artist" msgstr "" #: gajim/common/pep.py:346 msgid "Unknown Title" msgstr "" #: gajim/common/pep.py:349 msgid "Unknown Source" msgstr "" #: gajim/common/pep.py:352 #, python-format msgid "" "\"%(title)s\" by %(artist)s\n" "from %(source)s" msgstr "" #: gajim/common/stanza_session.py:422 msgid "" "[This is part of an encrypted session. If you see this message, something " "went wrong.]" msgstr "" #: gajim/common/jingle_rtp.py:123 #, fuzzy, python-format msgid "%s configuration error" msgstr "Настаўленні пакоя" #: gajim/common/jingle_rtp.py:124 #, python-format msgid "" "Couldn’t setup %(text)s. Check your configuration.\n" "\n" "Pipeline was:\n" "%(pipeline)s\n" "\n" "Error was:\n" "%(error)s" msgstr "" #: gajim/common/jingle_rtp.py:371 msgid "audio input" msgstr "" #: gajim/common/jingle_rtp.py:375 msgid "audio output" msgstr "" #: gajim/common/jingle_rtp.py:433 msgid "video input" msgstr "" #: gajim/common/jingle_rtp.py:440 msgid "video output" msgstr "" #: gajim/common/helpers.py:296 msgid "Server must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:304 msgid "Invalid character in hostname." msgstr "Няправільны знак у назве вузла." #: gajim/common/helpers.py:306 msgid "Server address required." msgstr "Патрэбны адрас сервера." #: gajim/common/helpers.py:310 msgid "Username must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:318 msgid "Invalid character in username." msgstr "Няправільны знак у імені карыстальніка." #: gajim/common/helpers.py:324 msgid "Resource must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:332 msgid "Invalid character in resource." msgstr "Няправільны знак у назве рэсурса." #: gajim/common/helpers.py:372 msgid "_Busy" msgstr "_Заняты" #: gajim/common/helpers.py:377 msgid "_Not Available" msgstr "М_яне няма" #: gajim/common/helpers.py:382 msgid "_Free for Chat" msgstr "_Магу размаўляць" #: gajim/common/helpers.py:387 #, fuzzy msgid "?user status:_Available" msgstr "?transfer status:Прыпыненая" #: gajim/common/helpers.py:391 msgid "Connecting" msgstr "Злучэнне" #: gajim/common/helpers.py:394 msgid "A_way" msgstr "Н_е тут" #: gajim/common/helpers.py:399 msgid "_Offline" msgstr "_Адключаны" #: gajim/common/helpers.py:404 msgid "_Invisible" msgstr "_Нябачны" #: gajim/common/helpers.py:410 msgid "?contact has status:Unknown" msgstr "?чалавек у стане:Невядомы" #: gajim/common/helpers.py:412 msgid "?contact has status:Has errors" msgstr "?чалавек у стане:Ёсць памылкі" #: gajim/common/helpers.py:427 msgid "?Subscription we already have:None" msgstr "?Ужо ёсць падпіскі:Няма" #: gajim/common/helpers.py:429 msgid "To" msgstr "Да" #: gajim/common/helpers.py:431 msgid "From" msgstr "Ад" #: gajim/common/helpers.py:433 msgid "Both" msgstr "Абодва" #: gajim/common/helpers.py:435 #, fuzzy msgid "Unknown" msgstr "?Сістэма:Невядомая" #: gajim/common/helpers.py:441 msgid "?Ask (for Subscription):None" msgstr "?Запыт (на падпіску):Няма" #: gajim/common/helpers.py:443 msgid "Subscribe" msgstr "Падпісацца" #: gajim/common/helpers.py:452 msgid "?Group Chat Contact Role:None" msgstr "?Роля чалавека:Няма" #: gajim/common/helpers.py:455 msgid "Moderators" msgstr "Мадэратары" #: gajim/common/helpers.py:457 msgid "Moderator" msgstr "Мадэратар" #: gajim/common/helpers.py:460 msgid "Participants" msgstr "Удзельнікі" #: gajim/common/helpers.py:462 msgid "Participant" msgstr "Удзельнік" #: gajim/common/helpers.py:465 msgid "Visitors" msgstr "Наведвальнікі" #: gajim/common/helpers.py:467 msgid "Visitor" msgstr "Наведвальнік" #: gajim/common/helpers.py:518 msgid "is paying attention to the conversation" msgstr "сочыць за размовай" #: gajim/common/helpers.py:520 msgid "is doing something else" msgstr "заняты чымсьці іншым" #: gajim/common/helpers.py:522 #, fuzzy msgid "is composing a message…" msgstr "піша паведамленне..." #: gajim/common/helpers.py:525 msgid "paused composing a message" msgstr "перастаў пісаць" #: gajim/common/helpers.py:527 msgid "has closed the chat window or tab" msgstr "закрыў вакно / картку размовы" #: gajim/common/helpers.py:754 #, python-format msgid "%s GiB" msgstr "%s ГіБ" #: gajim/common/helpers.py:757 #, python-format msgid "%s GB" msgstr "%s ГБ" #: gajim/common/helpers.py:761 #, python-format msgid "%s MiB" msgstr "%s МіБ" #: gajim/common/helpers.py:764 #, python-format msgid "%s MB" msgstr "%s МБ" #: gajim/common/helpers.py:768 #, python-format msgid "%s KiB" msgstr "%s кiБ" #: gajim/common/helpers.py:771 #, python-format msgid "%s KB" msgstr "%s кБ" #: gajim/common/helpers.py:774 #, python-format msgid "%s B" msgstr "%s Б" #: gajim/common/helpers.py:1141 gajim/common/helpers.py:1148 #, fuzzy, python-format msgid "%d message pending" msgid_plural "%d messages pending" msgstr[0] "Адправіць паведамленне" msgstr[1] "Адправіць паведамленне" msgstr[2] "Адправіць паведамленне" #: gajim/common/helpers.py:1155 #, fuzzy, python-format msgid "from room %s" msgstr "Я %s" #: gajim/common/helpers.py:1158 gajim/common/helpers.py:1175 #, python-format msgid "from user %s" msgstr "" #: gajim/common/helpers.py:1160 #, fuzzy, python-format msgid "from %s" msgstr "Ад" #: gajim/common/helpers.py:1167 gajim/common/helpers.py:1173 #, python-format msgid "%d event pending" msgid_plural "%d events pending" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: gajim/common/helpers.py:1191 gajim/common/helpers.py:1203 #: gajim/data/gui/roster_window.ui:85 data/org.gajim.Gajim.desktop.in:4 #: data/org.gajim.Gajim.appdata.xml.in:9 msgid "Gajim" msgstr "Gajim" #: gajim/common/helpers.py:1205 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" #: gajim/common/helpers.py:1392 gajim/data/gui/add_new_contact_window.ui:24 msgid "I would like to add you to my contact list." msgstr "Я хачу дадаць Вас у свой кантактны ліст." #: gajim/common/helpers.py:1394 msgid "Hello, I am $name." msgstr "" #: gajim/common/helpers.py:1508 gajim/common/helpers.py:1517 #: gajim/common/helpers.py:1576 #, fuzzy msgid "Timeout loading image" msgstr "Немагчыма загрузіць малюнак" #: gajim/common/helpers.py:1527 gajim/common/helpers.py:1574 msgid "Image is too big" msgstr "" #: gajim/common/helpers.py:1538 msgid "PyCURL is not installed" msgstr "" #: gajim/common/helpers.py:1578 #, fuzzy msgid "Error loading image" msgstr "Немагчыма загрузіць малюнак" #: gajim/common/connection_handlers.py:133 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "Звесткі рэгістрацыі для транспарта %s не прыйшлі ў час" #: gajim/common/connection_handlers.py:979 msgid "This message was encrypted with OTR and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:982 msgid "" "This message was encrypted with Legacy OpenPGP and could not be decrypted. " "You can install the PGP plugin to handle those messages." msgstr "" #: gajim/common/connection_handlers.py:986 msgid "" "This message was encrypted with OpenPGP for XMPP and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:992 #, python-format msgid "This message was encrypted with %s and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:1060 msgid "message" msgstr "паведамленне" #: gajim/common/connection_handlers.py:1863 msgid "I would like to add you to my roster." msgstr "Я хачу дадаць Вас у мой кантактны ліст." #: gajim/common/exceptions.py:46 #, python-format msgid "" "The database file (%s) cannot be read. Try to repair it (see https://dev." "gajim.org/gajim/gajim/wikis/help/DatabaseBackup) or remove it (all history " "will be lost)." msgstr "" #: gajim/common/exceptions.py:60 msgid "Service not available: Gajim is not running, or remote_control is False" msgstr "" "Сервіс недаступны: Gajim не працуе, альбо remote_control мае значэнне False" #: gajim/common/exceptions.py:82 #, fuzzy, python-format msgid "" "Session bus is not available.\n" "Try reading %(url)s" msgstr "" "Шына сеанса недаступная.\n" "Чытайце http://trac.gajim.org/wiki/GajimDBus" #: gajim/common/exceptions.py:94 #, fuzzy, python-format msgid "" "System bus is not available.\n" "Try reading %(url)s" msgstr "" "Шына сеанса недаступная.\n" "Чытайце http://trac.gajim.org/wiki/GajimDBus" #: gajim/common/zeroconf/connection_zeroconf.py:193 #, fuzzy msgid "Please check if Avahi or Bonjour is installed." msgstr "Праверце, ці ўсталяваны Avahi." #: gajim/common/zeroconf/connection_zeroconf.py:203 #: gajim/common/zeroconf/connection_zeroconf.py:207 msgid "Could not start local service" msgstr "Немагчыма стартаваць мясцовы сервіс" #: gajim/common/zeroconf/connection_zeroconf.py:204 #, python-format msgid "Unable to bind to port %d." msgstr "Немагчыма злучыцца праз порт %d." #: gajim/common/zeroconf/connection_zeroconf.py:208 #: gajim/common/zeroconf/connection_zeroconf.py:293 #: gajim/common/zeroconf/connection_zeroconf.py:306 #: gajim/common/zeroconf/connection_zeroconf.py:322 msgid "Please check if avahi-daemon is running." msgstr "Праверце, ці працуе avahi-daemon." #: gajim/common/zeroconf/connection_zeroconf.py:292 #: gajim/common/zeroconf/connection_zeroconf.py:305 #: gajim/common/zeroconf/connection_zeroconf.py:321 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Немагчыма змяніць стан рахунка \"%s\"" #: gajim/common/zeroconf/connection_zeroconf.py:337 #, fuzzy msgid "Your message could not be sent." msgstr "Чалавека пакуль няма. Вы не можаце адправіць паведамленне." #: gajim/common/zeroconf/connection_zeroconf.py:352 msgid "Contact is offline. Your message could not be sent." msgstr "Чалавека пакуль няма. Вы не можаце адправіць паведамленне." #: gajim/common/zeroconf/connection_zeroconf.py:374 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "Немагчыма злучыцца з вузлом: скончыўся тэрмін чакання." #: gajim/common/zeroconf/zeroconf_bonjour.py:197 #: gajim/common/zeroconf/zeroconf_avahi.py:220 #, python-format msgid "Error while adding service. %s" msgstr "Памылка дадання сервіса. %s" #: gajim/data/gui/blocked_contacts_window.ui:13 #, fuzzy msgid "Blocked Contacts" msgstr "Людзі" #: gajim/data/gui/advanced_configuration_window.ui:13 msgid "Advanced Configuration Editor" msgstr "Адмысловы рэдактар настаўленняў" #: gajim/data/gui/advanced_configuration_window.ui:35 msgid "Filter:" msgstr "Фільтар:" #: gajim/data/gui/advanced_configuration_window.ui:107 #: gajim/data/gui/features_window.ui:111 msgid "Description" msgstr "Апісанне" #: gajim/data/gui/advanced_configuration_window.ui:136 msgid "NOTE: You should restart Gajim for some settings to take effect" msgstr "Увага: Каб ужыць некаторыя змены, трэба перазапусціць Gajim" #: gajim/data/gui/advanced_configuration_window.ui:161 #, fuzzy msgid "_Reset to default" msgstr "_Вярнуць звычайныя колеры" #: gajim/data/gui/join_groupchat_window.ui:34 #, fuzzy msgid "Bookmark this Groupchat" msgstr "_Змясціць у закладках" #: gajim/data/gui/join_groupchat_window.ui:51 msgid "Join this Groupchat everytime Gajim is started" msgstr "" #: gajim/data/gui/join_groupchat_window.ui:69 #, fuzzy msgid "Bookmark" msgstr "_Змясціць у закладках" #: gajim/data/gui/join_groupchat_window.ui:82 #, fuzzy msgid "Autojoin" msgstr "Аўтаматычна далучацца" #: gajim/data/gui/join_groupchat_window.ui:119 msgid "Account" msgstr "Рахунак" #: gajim/data/gui/join_groupchat_window.ui:226 #, fuzzy msgid "Room" msgstr "Пакой:" #: gajim/data/gui/join_groupchat_window.ui:238 #, fuzzy msgid "Recently" msgstr "Нядаўна:" #: gajim/data/gui/join_groupchat_window.ui:290 msgid "Search the rooms on this server" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:12 #, fuzzy msgid "HTTP Connect" msgstr "Злучэнне HTTP" #: gajim/data/gui/manage_proxies_window.ui:15 msgid "SOCKS5" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:18 msgid "BOSH" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:25 msgid "Manage Proxy Profiles" msgstr "Кіраванне профілямі проксі" #: gajim/data/gui/manage_proxies_window.ui:148 msgid "_Name:" msgstr "_Імя:" #: gajim/data/gui/manage_proxies_window.ui:161 #, fuzzy msgid "_Type:" msgstr "Тып:" #: gajim/data/gui/manage_proxies_window.ui:205 msgid "Properties" msgstr "Уласцівасці" #: gajim/data/gui/manage_proxies_window.ui:234 #, fuzzy msgid "_BOSH URL:" msgstr "_Спасылка:" #: gajim/data/gui/manage_proxies_window.ui:258 #, fuzzy msgid "Proxy _Host:" msgstr "Проксі:" #: gajim/data/gui/manage_proxies_window.ui:269 #, fuzzy msgid "Use HTTP prox_y" msgstr "С_карыстаць проксі" #: gajim/data/gui/manage_proxies_window.ui:288 #, fuzzy msgid "Proxy _Port:" msgstr "_Порт:" #: gajim/data/gui/manage_proxies_window.ui:299 #, fuzzy msgid "Use proxy auth_entication" msgstr "Аўтарызацыя" #: gajim/data/gui/manage_proxies_window.ui:318 msgid "_Username:" msgstr "_Імя карыстальніка:" #: gajim/data/gui/manage_proxies_window.ui:331 msgid "Pass_word:" msgstr "Па_роль:" #: gajim/data/gui/manage_proxies_window.ui:391 msgid "Settings" msgstr "Настаўленні" #: gajim/data/gui/change_password_dialog.ui:89 msgid "Enter new password:" msgstr "Увядзіце новы пароль:" #: gajim/data/gui/change_password_dialog.ui:115 msgid "Enter it again for confirmation:" msgstr "Увядзіце для пацверджання:" #: gajim/data/gui/zeroconf_information_window.ui:8 #: gajim/data/gui/vcard_information_window.ui:8 msgid "Contact Information" msgstr "Асабістыя звесткі" #: gajim/data/gui/zeroconf_information_window.ui:54 msgid "Local jid:" msgstr "Мясцовы jid:" #: gajim/data/gui/zeroconf_information_window.ui:67 #: gajim/data/gui/tooltip_roster_contact.ui:55 #: gajim/data/gui/tooltip_gc_contact.ui:75 msgid "Resource:" msgstr "Рэсурс:" #: gajim/data/gui/zeroconf_information_window.ui:80 #: gajim/data/gui/tooltip_roster_contact.ui:110 msgid "Status:" msgstr "Стан:" #: gajim/data/gui/zeroconf_information_window.ui:89 #: gajim/data/gui/history_window.ui:290 msgid "_Log conversation history" msgstr "_Весці журнал размоў" #: gajim/data/gui/zeroconf_information_window.ui:215 #: gajim/data/gui/vcard_information_window.ui:360 msgid "Contact" msgstr "Чалавек" #: gajim/data/gui/zeroconf_information_window.ui:234 msgid "First Name:" msgstr "Імя:" #: gajim/data/gui/zeroconf_information_window.ui:247 msgid "Last Name:" msgstr "Прозвішча:" #: gajim/data/gui/zeroconf_information_window.ui:260 #: gajim/data/gui/archiving_313_preferences_item.ui:84 #: gajim/data/gui/tooltip_roster_contact.ui:30 #: gajim/data/gui/tooltip_gc_contact.ui:50 msgid "Jabber ID:" msgstr "Jabber ID:" #: gajim/data/gui/zeroconf_information_window.ui:273 msgid "E-Mail:" msgstr "E-mail:" #: gajim/data/gui/zeroconf_information_window.ui:354 msgid "Personal" msgstr "Асабістае" #: gajim/data/gui/gc_occupants_menu.ui:12 msgid "_Send Private Message" msgstr "Ад_правіць прыватнае паведамленне" #: gajim/data/gui/gc_occupants_menu.ui:21 msgid "Send _File" msgstr "Адправіць _файл" #: gajim/data/gui/gc_occupants_menu.ui:29 #, fuzzy msgid "Occupant Actions" msgstr "_Дзеянні ўдзельнікаў" #: gajim/data/gui/gc_occupants_menu.ui:38 msgid "_Voice" msgstr "_Голас" #: gajim/data/gui/gc_occupants_menu.ui:46 msgid "Mo_derator" msgstr "Ма_дэратар" #: gajim/data/gui/gc_occupants_menu.ui:60 msgid "_Member" msgstr "_Удзельнік" #: gajim/data/gui/gc_occupants_menu.ui:68 msgid "_Admin" msgstr "_Адміністратар" #: gajim/data/gui/gc_occupants_menu.ui:76 msgid "_Owner" msgstr "_Уладальнік" #: gajim/data/gui/gc_occupants_menu.ui:90 msgid "_Kick" msgstr "_Выкінуць" #: gajim/data/gui/gc_occupants_menu.ui:98 msgid "_Ban" msgstr "_Забараніць казанне" #: gajim/data/gui/gc_occupants_menu.ui:124 msgid "_Add to Roster" msgstr "_Дадаць у кантактны ліст" #: gajim/data/gui/gc_occupants_menu.ui:132 #, fuzzy msgid "_Execute command" msgstr "_Выканаць загад..." #: gajim/data/gui/archiving_313_preferences_item.ui:12 #: gajim/data/gui/preferences_window.ui:102 #: gajim/data/gui/preferences_window.ui:153 #: gajim/data/gui/archiving_313_preferences_window.ui:25 #, fuzzy msgid "Always" msgstr "Сышоў" #: gajim/data/gui/archiving_313_preferences_item.ui:15 #: gajim/data/gui/preferences_window.ui:96 #: gajim/data/gui/preferences_window.ui:156 #: gajim/data/gui/archiving_313_preferences_window.ui:31 #, fuzzy msgid "Never" msgstr "_Ніколі" #: gajim/data/gui/archiving_313_preferences_item.ui:96 #, fuzzy msgid "Preference:" msgstr "Уласцівасці" #: gajim/data/gui/tooltip_roster_contact.ui:125 #, fuzzy msgid "Idle since:" msgstr " ад %s" #: gajim/data/gui/tooltip_roster_contact.ui:151 #: gajim/data/gui/change_status_message_dialog.ui:191 #, fuzzy msgid "Mood:" msgstr "Пакой:" #: gajim/data/gui/tooltip_roster_contact.ui:164 #: gajim/data/gui/change_status_message_dialog.ui:179 #, fuzzy msgid "Activity:" msgstr "Актывізаваны" #: gajim/data/gui/tooltip_roster_contact.ui:178 #, fuzzy msgid "Tune:" msgstr "Тып:" #: gajim/data/gui/tooltip_roster_contact.ui:191 #, fuzzy msgid "Location:" msgstr "Змяненне рахунка" #: gajim/data/gui/tooltip_roster_contact.ui:255 #, fuzzy msgid "OpenPGP:" msgstr "OpenPGP: " #: gajim/data/gui/tooltip_roster_contact.ui:281 msgid "Subscription:" msgstr "Падпіска:" #: gajim/data/gui/zeroconf_context_menu.ui:11 #: gajim/data/gui/account_context_menu.ui:11 msgid "_Status" msgstr "_Стан" #: gajim/data/gui/zeroconf_context_menu.ui:26 #: gajim/data/gui/account_context_menu.ui:79 msgid "_Modify Account..." msgstr "_Змяніць рахунак..." #: gajim/data/gui/atom_entry_window.ui:8 msgid "New entry received" msgstr "Атрыманае новае паведамленне" #: gajim/data/gui/atom_entry_window.ui:92 msgid "Feed name:" msgstr "Назва крыніцы:" #: gajim/data/gui/atom_entry_window.ui:119 msgid "Entry:" msgstr "Уваход:" #: gajim/data/gui/atom_entry_window.ui:131 msgid "Last modified:" msgstr "Апошняя змена:" #: gajim/data/gui/atom_entry_window.ui:196 msgid "Next entry" msgstr "" #: gajim/data/gui/gc_control_popup_menu.ui:11 #, fuzzy msgid "Change _Nickname..." msgstr "Змяніць м_янушку" #: gajim/data/gui/gc_control_popup_menu.ui:20 #, fuzzy msgid "_Manage Room" msgstr "Кіраванне закладкамі" #: gajim/data/gui/gc_control_popup_menu.ui:31 #, fuzzy msgid "Change _Subject..." msgstr "Змяніць _тэму" #: gajim/data/gui/gc_control_popup_menu.ui:38 #, fuzzy msgid "Configure _Room..." msgstr "Настаўленні _пакоя" #: gajim/data/gui/gc_control_popup_menu.ui:52 #, fuzzy msgid "_Destroy Room" msgstr "Апісанне: %s" #: gajim/data/gui/gc_control_popup_menu.ui:64 msgid "_Minimize on close" msgstr "" #: gajim/data/gui/gc_control_popup_menu.ui:85 #, fuzzy msgid "_Request Voice" msgstr "_Голас" #: gajim/data/gui/profile_window.ui:7 msgid "Personal Information" msgstr "Асабістыя звесткі" #: gajim/data/gui/profile_window.ui:35 #: gajim/data/gui/vcard_information_window.ui:382 #, fuzzy msgid "Name:" msgstr "Адмысловы" #: gajim/data/gui/profile_window.ui:59 #: gajim/data/gui/vcard_information_window.ui:410 #, fuzzy msgid "Nickname:" msgstr "Мянушка:" #. Family Name #: gajim/data/gui/profile_window.ui:94 #: gajim/data/gui/vcard_information_window.ui:740 #, fuzzy msgid "Family:" msgstr "Прозвішча:" #. Given Name #: gajim/data/gui/profile_window.ui:118 #: gajim/data/gui/vcard_information_window.ui:822 #, fuzzy msgid "Given:" msgstr "OpenPGP" #. Middle Name #: gajim/data/gui/profile_window.ui:142 #: gajim/data/gui/vcard_information_window.ui:753 #, fuzzy msgid "Middle:" msgstr "Дадаць правіла" #. Prefix in Name #: gajim/data/gui/profile_window.ui:156 #: gajim/data/gui/vcard_information_window.ui:766 #, fuzzy msgid "Prefix:" msgstr "Уласцівасці" #. Suffix in Name #: gajim/data/gui/profile_window.ui:190 #: gajim/data/gui/vcard_information_window.ui:835 #, fuzzy msgid "Suffix:" msgstr "Гукі" #: gajim/data/gui/profile_window.ui:222 #: gajim/data/gui/vcard_information_window.ui:878 #, fuzzy msgid "Full Name" msgstr "Адмысловы" #: gajim/data/gui/profile_window.ui:250 gajim/data/gui/profile_window.ui:724 #: gajim/data/gui/vcard_information_window.ui:454 #: gajim/data/gui/vcard_information_window.ui:1087 #, fuzzy msgid "Street:" msgstr "Настаўленні" #: gajim/data/gui/profile_window.ui:274 gajim/data/gui/profile_window.ui:748 #: gajim/data/gui/vcard_information_window.ui:535 #: gajim/data/gui/vcard_information_window.ui:1126 #, fuzzy msgid "Extra Address:" msgstr "Дадатковы адрас:" #: gajim/data/gui/profile_window.ui:298 gajim/data/gui/profile_window.ui:772 #: gajim/data/gui/vcard_information_window.ui:467 #: gajim/data/gui/vcard_information_window.ui:1100 #, fuzzy msgid "City:" msgstr "Адмысловы" #: gajim/data/gui/profile_window.ui:322 gajim/data/gui/profile_window.ui:796 #: gajim/data/gui/vcard_information_window.ui:548 #: gajim/data/gui/vcard_information_window.ui:1140 #, fuzzy msgid "Postal Code:" msgstr "Паштовы індэкс:" #: gajim/data/gui/profile_window.ui:346 gajim/data/gui/profile_window.ui:820 #: gajim/data/gui/vcard_information_window.ui:480 #: gajim/data/gui/vcard_information_window.ui:1113 #, fuzzy msgid "State:" msgstr "Настаўленні" #: gajim/data/gui/profile_window.ui:370 gajim/data/gui/profile_window.ui:844 #: gajim/data/gui/vcard_information_window.ui:561 #: gajim/data/gui/vcard_information_window.ui:1153 #, fuzzy msgid "Country:" msgstr "Гукі" #: gajim/data/gui/profile_window.ui:396 gajim/data/gui/profile_window.ui:870 #: gajim/data/gui/vcard_information_window.ui:618 #: gajim/data/gui/vcard_information_window.ui:1253 #, fuzzy msgid "Address" msgstr "Дадаць правіла" #: gajim/data/gui/profile_window.ui:413 #: gajim/data/gui/vcard_information_window.ui:635 #, fuzzy msgid "Homepage:" msgstr "У Сеціве:" #: gajim/data/gui/profile_window.ui:437 gajim/data/gui/profile_window.ui:887 #: gajim/data/gui/vcard_information_window.ui:648 #: gajim/data/gui/vcard_information_window.ui:1270 #, fuzzy msgid "E-Mail:" msgstr "E-mail:" #: gajim/data/gui/profile_window.ui:462 gajim/data/gui/profile_window.ui:912 #: gajim/data/gui/vcard_information_window.ui:661 #: gajim/data/gui/vcard_information_window.ui:1283 #, fuzzy msgid "Phone No.:" msgstr "Тэлефонны нумар:" #: gajim/data/gui/profile_window.ui:497 #, fuzzy msgid "Avatar:" msgstr "Аватар:" #: gajim/data/gui/profile_window.ui:540 msgid "Click to set your avatar" msgstr "Пстрыкніце, каб вызначыць свой аватар" #: gajim/data/gui/profile_window.ui:566 #: gajim/data/gui/vcard_information_window.ui:702 msgid "Format: YYYY-MM-DD" msgstr "Фармат: ГГГГ-ММ-ДД" #: gajim/data/gui/profile_window.ui:574 #: gajim/data/gui/vcard_information_window.ui:708 #, fuzzy msgid "Birthday:" msgstr "Народзіны:" #: gajim/data/gui/profile_window.ui:598 #: gajim/data/gui/vcard_information_window.ui:937 msgid "Personal Info" msgstr "Асабістыя звесткі" #: gajim/data/gui/profile_window.ui:617 #: gajim/data/gui/vcard_information_window.ui:960 #, fuzzy msgid "Company:" msgstr "Адмысловы" #: gajim/data/gui/profile_window.ui:641 #: gajim/data/gui/vcard_information_window.ui:990 #, fuzzy msgid "Department:" msgstr "Аддзел:" #: gajim/data/gui/profile_window.ui:665 #: gajim/data/gui/vcard_information_window.ui:1018 #, fuzzy msgid "Position:" msgstr "Умовы" #: gajim/data/gui/profile_window.ui:689 #: gajim/data/gui/vcard_information_window.ui:1045 #, fuzzy msgid "Role:" msgstr "Гукі" #: gajim/data/gui/profile_window.ui:947 #: gajim/data/gui/vcard_information_window.ui:1336 msgid "Work" msgstr "Праца" #. "About" is the text of a tab of vcard window #: gajim/data/gui/profile_window.ui:979 #: gajim/data/gui/vcard_information_window.ui:1368 #: gajim/data/gui/application_menu.ui:62 msgid "About" msgstr "Пра мяне" #: gajim/data/gui/filetransfers.ui:20 #, fuzzy msgid "Con_tinue" msgstr "_Працягнуць" #: gajim/data/gui/filetransfers.ui:28 gajim/data/gui/filetransfers.ui:156 msgid "_Pause" msgstr "_Прыпыніць" #: gajim/data/gui/filetransfers.ui:36 gajim/data/gui/filetransfers.ui:174 #: gajim/data/gui/service_registration_window.ui:53 msgid "_Cancel" msgstr "_Скасаваць" #: gajim/data/gui/filetransfers.ui:50 msgid "_Open Containing Folder" msgstr "_Адкрыць дырэкторыю з файлам" #: gajim/data/gui/filetransfers.ui:79 gajim/data/gui/filetransfers.ui:253 msgid "File Transfers" msgstr "Перадача файлаў" #: gajim/data/gui/filetransfers.ui:110 msgid "file transfers list" msgstr "спіс файлаў у чарзе на перадачу" #: gajim/data/gui/filetransfers.ui:111 msgid "A list of active, completed and stopped file transfers" msgstr "Спіс актыўных, скончаных і спыненых перадачаў файлаў" #: gajim/data/gui/filetransfers.ui:131 msgid "Clean _up" msgstr "Па_чысціць" #: gajim/data/gui/filetransfers.ui:137 msgid "Removes completed, cancelled and failed file transfers from the list" msgstr "Выдаліць скончаныя, скасаваныя і хібныя запісы перадачы файлаў з спіса" #: gajim/data/gui/filetransfers.ui:143 msgid "Remove file transfer from the list." msgstr "Выдаліць перадачу файла з спіса." #: gajim/data/gui/filetransfers.ui:144 msgid "" "This action removes single file transfer from the list. If the transfer is " "active, it is first stopped and then removed" msgstr "" "Выдаліць адзін файл з чаргі перадачы. Калі яшчэ адбываецца перадача, яна " "спыняецца, а потым выдаляецца" #: gajim/data/gui/filetransfers.ui:180 #, fuzzy msgid "Cancels the selected file transfer and removes incomplete files" msgstr "Скасаваць выбраную перадачу файла і выдаліць няскончаны файл" #: gajim/data/gui/filetransfers.ui:186 msgid "Cancel file transfer" msgstr "Скасаваць перадачу файла" #: gajim/data/gui/filetransfers.ui:187 msgid "Cancels the selected file transfer" msgstr "Скасаваць выбраную перадачу файла" #: gajim/data/gui/filetransfers.ui:199 #, fuzzy msgid "_Close" msgstr "Ад_правіць і закрыць" #: gajim/data/gui/filetransfers.ui:205 msgid "Hides the window" msgstr "Схаваць вакно" #: gajim/data/gui/filetransfers.ui:226 msgid "_Notify me when a file transfer is complete" msgstr "_Паведамляць мне аб сканчэнні перадачы файлаў" #: gajim/data/gui/filetransfers.ui:236 msgid "When a file transfer is complete show a popup notification" msgstr "Паказаць нагадванне па сканчэнні перадачы файла" #: gajim/data/gui/filetransfers.ui:254 msgid "Shows a list of file transfers between you and others" msgstr "Паказаць спіс перадаваных і атрыманых файлаў" #: gajim/data/gui/service_registration_window.ui:18 msgid "Register to" msgstr "Зарэгістравацца" #: gajim/data/gui/service_registration_window.ui:70 #: gajim/data/gui/roster_item_exchange_window.ui:126 msgid "_OK" msgstr "_Добра" #: gajim/data/gui/groupchat_control.ui:13 gajim/data/gui/chat_control.ui:293 #: gajim/data/gui/gajim_themes_window.ui:264 msgid "Bold" msgstr "Тлусты" #: gajim/data/gui/groupchat_control.ui:22 gajim/data/gui/chat_control.ui:302 #: gajim/data/gui/gajim_themes_window.ui:284 msgid "Italic" msgstr "Нахілены" #: gajim/data/gui/groupchat_control.ui:31 gajim/data/gui/chat_control.ui:311 #, fuzzy msgid "Underline" msgstr "дзевяць" #: gajim/data/gui/groupchat_control.ui:40 gajim/data/gui/chat_control.ui:320 #, fuzzy msgid "Strike" msgstr "Мянушка" #: gajim/data/gui/groupchat_control.ui:62 gajim/data/gui/chat_control.ui:342 #, fuzzy msgid "Font" msgstr "_Шрыфт:" #: gajim/data/gui/groupchat_control.ui:76 gajim/data/gui/chat_control.ui:356 #, fuzzy msgid "Clear formatting" msgstr "Асабістыя звесткі" #: gajim/data/gui/groupchat_control.ui:283 gajim/data/gui/chat_control.ui:805 #, fuzzy msgid "Choose an encryption" msgstr "Выберыце файл..." #: gajim/data/gui/groupchat_control.ui:329 gajim/data/gui/chat_control.ui:853 #, fuzzy msgid "Show a list of emoticons (Alt+M)" msgstr "Пстрыкніце, каб уставіць сымболік (Alt+M)" #: gajim/data/gui/popup_notification_window.ui:55 #, fuzzy msgid "Event Type" msgstr "Падзея" #: gajim/data/gui/popup_notification_window.ui:100 #, fuzzy msgid "Event desc" msgstr "Падзеі" #: gajim/data/gui/chat_control.ui:41 #, fuzzy msgid "1" msgstr "Гукі" #: gajim/data/gui/chat_control.ui:63 #, fuzzy msgid "2 abc" msgstr "Гукі" #: gajim/data/gui/chat_control.ui:84 #, fuzzy msgid "3 def" msgstr "Гукі" #: gajim/data/gui/chat_control.ui:105 #, fuzzy msgid "4 ghi" msgstr "Гукі" #: gajim/data/gui/chat_control.ui:126 #, fuzzy msgid "5 jkl" msgstr "Гукі" #: gajim/data/gui/chat_control.ui:147 #, fuzzy msgid "6 mno" msgstr "Гукі" #: gajim/data/gui/chat_control.ui:167 msgid "7 pqrs" msgstr "" #: gajim/data/gui/chat_control.ui:188 #, fuzzy msgid "8 tuv" msgstr "Гукі" #: gajim/data/gui/chat_control.ui:209 msgid "9 wxyz" msgstr "" #: gajim/data/gui/chat_control.ui:229 #, fuzzy msgid "*" msgstr "Гукі" #: gajim/data/gui/chat_control.ui:249 #, fuzzy msgid "0" msgstr "Гукі" #: gajim/data/gui/chat_control.ui:269 #, fuzzy msgid "#" msgstr "Гукі" #: gajim/data/gui/chat_control.ui:729 msgid "#" msgstr "№" #: gajim/data/gui/vcard_information_window.ui:55 #, fuzzy msgid "Jabber ID:" msgstr "Jabber ID:" #: gajim/data/gui/vcard_information_window.ui:69 #, fuzzy msgid "Resource:" msgstr "Рэсурс:" #: gajim/data/gui/vcard_information_window.ui:83 #, fuzzy msgid "Status:" msgstr "Настаўленні" #: gajim/data/gui/vcard_information_window.ui:97 #, fuzzy msgid "Client:" msgstr "Адмысловы" #: gajim/data/gui/vcard_information_window.ui:111 #, fuzzy msgid "System:" msgstr "Адмысловы" #: gajim/data/gui/vcard_information_window.ui:125 #, fuzzy msgid "Contact time:" msgstr "Настаўленні" #: gajim/data/gui/vcard_information_window.ui:222 #, fuzzy msgid "User avatar:" msgstr "Аватар:" #: gajim/data/gui/vcard_information_window.ui:234 #, fuzzy msgid "Configured avatar:" msgstr "Настаўленні _пакоя" #. Given Name #: gajim/data/gui/vcard_information_window.ui:263 #, fuzzy msgid "Ask:" msgstr "Дзеянні" #. Family Name #: gajim/data/gui/vcard_information_window.ui:277 #, fuzzy msgid "Subscription:" msgstr "Апісанне" #: gajim/data/gui/vcard_information_window.ui:893 #: gajim/data/gui/vcard_information_window.ui:912 #: gajim/data/gui/vcard_information_window.ui:1310 msgid "button" msgstr "" #: gajim/data/gui/vcard_information_window.ui:1398 msgid "Comments" msgstr "Каментарыі" #: gajim/data/gui/gajim_themes_window.ui:12 #, fuzzy msgid "Account row" msgstr "Рахунак" #: gajim/data/gui/gajim_themes_window.ui:15 #, fuzzy msgid "Group row" msgstr "Група" #: gajim/data/gui/gajim_themes_window.ui:18 #, fuzzy msgid "Contact row" msgstr "Чалавек" #: gajim/data/gui/gajim_themes_window.ui:21 msgid "Chat Banner" msgstr "" #: gajim/data/gui/gajim_themes_window.ui:28 msgid "Gajim Themes Customization" msgstr "Настаўленне тэмы Gajim" #: gajim/data/gui/gajim_themes_window.ui:157 msgid "Text _color:" msgstr "Колер _тэксту:" #: gajim/data/gui/gajim_themes_window.ui:173 msgid "_Background:" msgstr "_Фон:" #: gajim/data/gui/gajim_themes_window.ui:189 msgid "Text _font:" msgstr "_Шрыфт:" #: gajim/data/gui/gajim_themes_window.ui:207 msgid "Font style:" msgstr "Шрыфт:" #: gajim/data/gui/gajim_themes_window.ui:375 msgid "Composing" msgstr "Піша" #: gajim/data/gui/gajim_themes_window.ui:387 msgid "Paused" msgstr "Прыпынена" #: gajim/data/gui/gajim_themes_window.ui:399 msgid "Gone" msgstr "Знік" #: gajim/data/gui/gajim_themes_window.ui:411 msgid "" "MUC\n" "Messages" msgstr "" "MUC\n" "Паведамленні" #: gajim/data/gui/gajim_themes_window.ui:424 msgid "" "MUC Directed\n" "Messages" msgstr "" "Накіраваны MUC\n" "Паведамленні" #: gajim/data/gui/gajim_themes_window.ui:510 msgid "Chatstate Tab Colors" msgstr "Колер картак" #: gajim/data/gui/preferences_window.ui:48 msgid "Use default applications" msgstr "" #: gajim/data/gui/preferences_window.ui:51 #, fuzzy msgid "Custom" msgstr "Адмысловы" #: gajim/data/gui/preferences_window.ui:62 #: gajim/data/gui/preferences_window.ui:79 #, fuzzy msgid "All chat states" msgstr "Усе станы" #: gajim/data/gui/preferences_window.ui:65 #: gajim/data/gui/preferences_window.ui:82 #, fuzzy msgid "Composing only" msgstr "Піша" #: gajim/data/gui/preferences_window.ui:99 msgid "Only when pending events" msgstr "" #: gajim/data/gui/preferences_window.ui:113 #, fuzzy msgid "Pop it up" msgstr "_Вынырваць" #: gajim/data/gui/preferences_window.ui:116 #, fuzzy msgid "Notify me about it" msgstr "_Паведамляць мне пра гэта" #: gajim/data/gui/preferences_window.ui:119 #, fuzzy msgid "Show only in roster" msgstr "Паказваць толькі ў _галоўным вакне" #: gajim/data/gui/preferences_window.ui:130 msgid "Detached roster with detached chats" msgstr "" #: gajim/data/gui/preferences_window.ui:133 msgid "Detached roster with single chat" msgstr "" #: gajim/data/gui/preferences_window.ui:136 msgid "Single window for everything" msgstr "" #: gajim/data/gui/preferences_window.ui:139 msgid "Detached roster with chat grouped by account" msgstr "" #: gajim/data/gui/preferences_window.ui:142 msgid "Detached roster with chat grouped by type" msgstr "" #: gajim/data/gui/preferences_window.ui:159 #, fuzzy msgid "Last state" msgstr "Апошняе паведамленне: %s" #: gajim/data/gui/preferences_window.ui:195 #: gajim/data/gui/application_menu.ui:94 gajim/data/gui/shortcuts_window.ui:188 msgid "Preferences" msgstr "Уласцівасці" #: gajim/data/gui/preferences_window.ui:237 msgid "Display a_vatars of contacts in roster" msgstr "Паказваць _малюнкі ў галоўным вакне" #: gajim/data/gui/preferences_window.ui:241 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" msgstr "" "Калі гэтая опцыя ўключаная, Gajim паказвае аватары ў галоўным вакне і ў " "групавых размовах" #: gajim/data/gui/preferences_window.ui:255 msgid "Display status _messages of contacts in roster" msgstr "Паказваць _стан у галоўным вакне" #: gajim/data/gui/preferences_window.ui:259 #, fuzzy msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name, in roster window and in group chats" msgstr "" "Калі гэтая опцыя ўключаная, Gajim паказвае паведамленні аб зменах стану для " "кожнага чалавека ў галоўным вакне і ў групавых размовах" #: gajim/data/gui/preferences_window.ui:273 #, fuzzy msgid "Display e_xtra information of contacts in roster (mood, activity, ...)" msgstr "Паказваць _малюнкі ў галоўным вакне" #: gajim/data/gui/preferences_window.ui:277 #, fuzzy msgid "" "If checked, Gajim will display the mood of contacts in the roster window" msgstr "" "Калі гэтая опцыя ўключаная, Gajim паказвае аватары ў галоўным вакне і ў " "групавых размовах" #: gajim/data/gui/preferences_window.ui:298 #, fuzzy msgid "Sort contacts by status" msgstr "_Упарадкаваць людзей па стане" #: gajim/data/gui/preferences_window.ui:308 #, fuzzy msgid "in _roster" msgstr "Няма ў спісе" #: gajim/data/gui/preferences_window.ui:325 #, fuzzy msgid "in _group chats" msgstr "Удзельнічаць у _групавой размове" #: gajim/data/gui/preferences_window.ui:354 msgid "Roster Appearance" msgstr "" #: gajim/data/gui/preferences_window.ui:384 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" msgstr "" "Калі гэтая опцыя ўключаная, Gajim заменіць ascii-сымболікі (напр., ':)' ) " "адпаведнай значкай" #: gajim/data/gui/preferences_window.ui:390 #, fuzzy msgid "_Emoticons:" msgstr "Сымболікі:" #: gajim/data/gui/preferences_window.ui:406 msgid "_Window behavior:" msgstr "" #: gajim/data/gui/preferences_window.ui:420 #, fuzzy msgid "_Show roster on startup:" msgstr "Паказаць _галоўнае вакно" #: gajim/data/gui/preferences_window.ui:431 #, fuzzy msgid "_Ignore rich content in incoming messages" msgstr "Ігнараваць афармленне ўваходных паведамленняў" #: gajim/data/gui/preferences_window.ui:435 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." msgstr "" "Некаторыя паведамленні ўключаюць афармленне (фармат, колеры і г.д.). Калі " "гэтая опцыя ўключаная, Gajim будзе паказваць нефарматаваны тэкст." #: gajim/data/gui/preferences_window.ui:449 msgid "_Highlight misspelled words" msgstr "_Фарбаваць няправільна напісаныя словы" #: gajim/data/gui/preferences_window.ui:452 msgid "" "If checked, Gajim will highlight spelling errors in input fields of chat " "windows. If no language is explicitly set via right click on the input " "field, the default language will be used for this contact or group chat." msgstr "" #: gajim/data/gui/preferences_window.ui:466 #, fuzzy msgid "Notify by icon when your messages are received" msgstr "Прайграць гук пры атрыманні паведамлення MUC." #: gajim/data/gui/preferences_window.ui:520 msgid "Show avatar in chat tabs" msgstr "" #: gajim/data/gui/preferences_window.ui:552 #, fuzzy msgid "Chat Appearance" msgstr "Змяніць правіла" #: gajim/data/gui/preferences_window.ui:607 #, fuzzy msgid "When new event is received:" msgstr "Па атрыманні новай падзеі" #: gajim/data/gui/preferences_window.ui:645 #, fuzzy msgid "Notify me about contacts that sign _in" msgstr "Паведамляць мне аб людзях, якія: " #: gajim/data/gui/preferences_window.ui:663 #, fuzzy msgid "Notify me about contacts that sign _out" msgstr "Паведамляць мне аб людзях, якія: " #: gajim/data/gui/preferences_window.ui:667 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" msgstr "" "Gajim будзе паведамляць Вам аб сышоўшых людзях у выплыўным вакне ў правым " "верхнім куце экрана" #: gajim/data/gui/preferences_window.ui:681 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" msgstr "" "Дазволіць паказ паведамленняў і нагадванні, калі я _сышоў/заняты/нябачны" #: gajim/data/gui/preferences_window.ui:698 #, fuzzy msgid "Allow popup/notifications when a chat window is opened" msgstr "" "Дазволіць паказ паведамленняў і нагадванні, калі я _сышоў/заняты/нябачны" #: gajim/data/gui/preferences_window.ui:722 #, fuzzy msgid "Show notification area icon:" msgstr "_Значка панэлі паведамленняў" #: gajim/data/gui/preferences_window.ui:762 msgid "Visual Notifications" msgstr "Візуальныя нагадванні" #: gajim/data/gui/preferences_window.ui:795 msgid "Play _sounds" msgstr "Граць _гук" #: gajim/data/gui/preferences_window.ui:812 #: gajim/data/gui/preferences_window.ui:1656 msgid "Ma_nage..." msgstr "Кі_раванне..." #: gajim/data/gui/preferences_window.ui:834 msgid "Allow sound when I'm _busy" msgstr "" #: gajim/data/gui/preferences_window.ui:856 msgid "Sounds" msgstr "Гукі" #: gajim/data/gui/preferences_window.ui:877 #, fuzzy msgid "Notifications" msgstr "Змяненне рахунка" #: gajim/data/gui/preferences_window.ui:911 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " "display in chat windows." msgstr "" "Gajim можа адпраўляць і атрымліваць метазвесткі размоў з пэўным чалавекам. " "Вызначце, аб якіх зменах стану Вы хочаце ведаць." #: gajim/data/gui/preferences_window.ui:916 #, fuzzy msgid "_Display chat state notifications:" msgstr "_Паказваць нагадванні стану размовы:" #: gajim/data/gui/preferences_window.ui:967 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " "send to the other party." msgstr "" "Gajim можа адпраўляць і атрымліваць метазвесткі размоў з пэўным чалавекам. " "Вызначце, аб якіх зменах стану Вы хочаце паведамляць суразмоўцу." #: gajim/data/gui/preferences_window.ui:972 #, fuzzy msgid "_Send chat state notifications:" msgstr "_Паказваць нагадванні стану размовы:" #: gajim/data/gui/preferences_window.ui:990 #, fuzzy msgid "Chat state notifications" msgstr "Візуальныя нагадванні" #: gajim/data/gui/preferences_window.ui:1012 #, fuzzy msgid "Personal Events" msgstr "Асабістыя звесткі" #: gajim/data/gui/preferences_window.ui:1043 #, fuzzy msgid "_Away after:" msgstr "Аўтаматычна змяняць стан на \"_сышоў\" праз:" #: gajim/data/gui/preferences_window.ui:1047 msgid "" "If checked, Gajim will change status to Away when the computer is unused." msgstr "" #: gajim/data/gui/preferences_window.ui:1060 #, fuzzy msgid "_Not available after:" msgstr "Аўтаматычна змяняць стан на \"_недаступны\" праз:" #: gajim/data/gui/preferences_window.ui:1064 msgid "" "If checked, Gajim will change status to Not Available when the computer has " "not been used even longer" msgstr "" #: gajim/data/gui/preferences_window.ui:1079 #: gajim/data/gui/preferences_window.ui:1091 msgid "minutes" msgstr "хвіліны" #: gajim/data/gui/preferences_window.ui:1103 msgid "" "The auto away status message. If empty, Gajim will not change the current " "status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-away timeout" msgstr "" #: gajim/data/gui/preferences_window.ui:1117 msgid "" "The auto not available status message. If empty, Gajim will not change the " "current status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-not-available timeout" msgstr "" #: gajim/data/gui/preferences_window.ui:1165 #, fuzzy msgid "Auto Status" msgstr "Дзеянні" #: gajim/data/gui/preferences_window.ui:1200 msgid "Ask status message when I:" msgstr "Запытацца аб паведамленні змены стану, калі я:" #: gajim/data/gui/preferences_window.ui:1215 msgid "Sign _in" msgstr "_Злучыцца" #: gajim/data/gui/preferences_window.ui:1232 msgid "Sign _out" msgstr "З_ысці" #: gajim/data/gui/preferences_window.ui:1265 msgid "" "If enabled, Gajim will not ask for a status message. The specified default " "message will be used instead." msgstr "" #: gajim/data/gui/preferences_window.ui:1277 #: gajim/data/gui/preferences_window.ui:1479 msgid "Status" msgstr "Стан" #: gajim/data/gui/preferences_window.ui:1288 #, fuzzy msgid "Default Message" msgstr "Стандартныя паведамленні стану" #: gajim/data/gui/preferences_window.ui:1303 #, fuzzy msgid "Enabled" msgstr "Уключыць" #: gajim/data/gui/preferences_window.ui:1329 #, fuzzy msgid "Status Messages" msgstr "Паведамленні аб змене стану" #: gajim/data/gui/preferences_window.ui:1459 msgid "Preset Status Messages" msgstr "Паведамленні аб змене стану" #: gajim/data/gui/preferences_window.ui:1512 #, fuzzy msgid "Chat message:" msgstr "П_аведамленне стану:" #: gajim/data/gui/preferences_window.ui:1537 msgid "Use system _default" msgstr "Ужыць _сістэмны" #: gajim/data/gui/preferences_window.ui:1560 #, fuzzy msgid "Font" msgstr "Гукі" #: gajim/data/gui/preferences_window.ui:1590 msgid "T_heme:" msgstr "Т_эма:" #: gajim/data/gui/preferences_window.ui:1603 #, fuzzy msgid "Status _iconset:" msgstr "Прадвызначаны набор _значак стану:" #: gajim/data/gui/preferences_window.ui:1614 #, fuzzy msgid "Use _transports icons" msgstr "Ужыць _значкі транспартаў" #: gajim/data/gui/preferences_window.ui:1618 #, fuzzy msgid "" "If checked, Gajim will use protocol-specific status icons. (e.g. A contact " "from ICQ will have the equivalent ICQ icon for status online, away, busy, " "etc...)" msgstr "" "Калі гэтая опцыя ўключаная, Gajim будзе паказваць значкі для асобных " "пратаколаў. (напр., чалавек з MSN будзе мець адпаведныя значкі злучанасці, " "адсутнасці, занятасці і г.д. для MSN-карыстальнікаў)" #: gajim/data/gui/preferences_window.ui:1660 msgid "Configure color and font of the interface" msgstr "Настаўленні колераў і шрыфтаў" #: gajim/data/gui/preferences_window.ui:1682 #, fuzzy msgid "Themes" msgstr "Уласцівасці" #: gajim/data/gui/preferences_window.ui:1712 #, fuzzy msgid "Contact's nickname:" msgstr "Імя чалавека" #: gajim/data/gui/preferences_window.ui:1726 #, fuzzy msgid "Contact's message:" msgstr "П_аведамленне стану:" #: gajim/data/gui/preferences_window.ui:1738 msgid "_Status message:" msgstr "П_аведамленне стану:" #: gajim/data/gui/preferences_window.ui:1752 #, fuzzy msgid "Group chat highlight:" msgstr "Фарбаванае паведамленне ў групавой размове" #: gajim/data/gui/preferences_window.ui:1890 #, fuzzy msgid "Your nickname:" msgstr "П_ерад мянушкай:" #: gajim/data/gui/preferences_window.ui:1904 #, fuzzy msgid "Your message:" msgstr "Памылка: %s" #: gajim/data/gui/preferences_window.ui:1916 msgid "_URL highlight:" msgstr "" #: gajim/data/gui/preferences_window.ui:2041 msgid "_Reset to Default Colors" msgstr "_Вярнуць звычайныя колеры" #: gajim/data/gui/preferences_window.ui:2075 #, fuzzy msgid "Chat Line Colors" msgstr "Колер картак" #: gajim/data/gui/preferences_window.ui:2095 #, fuzzy msgid "Style" msgstr "Марнаванне часу" #: gajim/data/gui/preferences_window.ui:2128 msgid "Audio input device" msgstr "" #: gajim/data/gui/preferences_window.ui:2140 msgid "Audio output device" msgstr "" #: gajim/data/gui/preferences_window.ui:2176 #, fuzzy msgid "Audio" msgstr "Дзеянні" #: gajim/data/gui/preferences_window.ui:2206 msgid "Video input device" msgstr "" #: gajim/data/gui/preferences_window.ui:2218 msgid "Video output device" msgstr "" #: gajim/data/gui/preferences_window.ui:2230 msgid "Video framerate" msgstr "" #: gajim/data/gui/preferences_window.ui:2242 msgid "Video size" msgstr "" #: gajim/data/gui/preferences_window.ui:2252 msgid "View own video source" msgstr "" #: gajim/data/gui/preferences_window.ui:2316 #, fuzzy msgid "Video" msgstr "Дадаць правіла" #: gajim/data/gui/preferences_window.ui:2346 #, fuzzy msgid "STUN server:" msgstr "Сервер:" #: gajim/data/gui/preferences_window.ui:2372 msgid "" "STUN server hostname. If none given, Gajim will try\n" "to discover one from server." msgstr "" #: gajim/data/gui/preferences_window.ui:2386 msgid "(example: stun.iptel.org)" msgstr "" #: gajim/data/gui/preferences_window.ui:2400 #, fuzzy msgid "Connection" msgstr "Умовы" #: gajim/data/gui/preferences_window.ui:2485 msgid "_Mail client:" msgstr "_Паштовая праграма:" #: gajim/data/gui/preferences_window.ui:2498 msgid "_Browser:" msgstr "_Гартач:" #: gajim/data/gui/preferences_window.ui:2511 msgid "_File manager:" msgstr "_Кіраўнік файлаў:" #. a header for custom browser/client/file manager. so translate sth like: Custom Settings #: gajim/data/gui/preferences_window.ui:2559 msgid "Custom" msgstr "Адмысловы" #: gajim/data/gui/preferences_window.ui:2576 msgid "Applications" msgstr "Праграмы" #: gajim/data/gui/preferences_window.ui:2604 msgid "_Ignore events from contacts not in the roster" msgstr "_Ігнараваць падзеі ад людзей, якіх няма ў кантактным лісце" #: gajim/data/gui/preferences_window.ui:2608 #, fuzzy msgid "" "If checked, Gajim will ignore incoming events from unauthorized contacts. " "Use with caution, because it blocks all messages from any contact that is " "not in the roster" msgstr "" "Скарыстайце гэтую опцыю, калі Вам надакучвае ці закідвае непатрэбнымі " "паведамленнямі нейкі чалавек, якога няма ў Вашым кантактным лісце. Але " "зважайце, што ў такім разе ніхто з людзей, якіх няма ў Вашым спісе, не зможа " "адправіць Вам паведамленне" #: gajim/data/gui/preferences_window.ui:2622 #, fuzzy msgid "Allow client / _OS information to be sent" msgstr "Дазволіць адпраўку звестак аб _сістэме" #: gajim/data/gui/preferences_window.ui:2626 #, fuzzy msgid "" "If checked, Gajim will allow others to detect the operation system you are " "using" msgstr "" "Калі гэтая опцыя ўключаная, Gajim далучыцца да гэтай групавой размовы пры " "запуску" #: gajim/data/gui/preferences_window.ui:2640 #, fuzzy msgid "Allow local system time information to be sent" msgstr "Дазволіць адпраўку звестак аб _сістэме" #: gajim/data/gui/preferences_window.ui:2644 #, fuzzy msgid "If checked, Gajim will allow others to detect the time on your system" msgstr "" "Калі гэтая опцыя ўключаная, Gajim далучыцца да гэтай групавой размовы пры " "запуску" #: gajim/data/gui/preferences_window.ui:2658 msgid "Log _encrypted chat session" msgstr "" #: gajim/data/gui/preferences_window.ui:2662 msgid "" "If checked, Gajim will keep logs for encrypted messages. Please note that " "when using End-to-End encryption the remote party has to agree on logging, " "else the messages will not be logged." msgstr "" #: gajim/data/gui/preferences_window.ui:2676 #, fuzzy msgid "Allow my _idle time to be sent" msgstr "Дазволіць адпраўку звестак аб _сістэме" #: gajim/data/gui/preferences_window.ui:2695 msgid "Global proxy:" msgstr "" #: gajim/data/gui/preferences_window.ui:2724 #, fuzzy msgid "_Manage..." msgstr "Кіраванне..." #: gajim/data/gui/preferences_window.ui:2743 #, fuzzy msgid "Privacy" msgstr "Спіс прыватнасці" #: gajim/data/gui/preferences_window.ui:2770 msgid "_Log status changes of contacts" msgstr "_Пісаць у журнал паведамленні аб змене стану чалавека" #: gajim/data/gui/preferences_window.ui:2791 msgid "Miscellaneous" msgstr "Рознае" #: gajim/data/gui/preferences_window.ui:2810 msgid "_Open..." msgstr "_Адкрыць..." #: gajim/data/gui/preferences_window.ui:2826 msgid "Advanced Configuration Editor" msgstr "Адмысловы рэдактар настаўленняў" #: gajim/data/gui/contact_context_menu.ui:12 msgid "Start _Chat" msgstr "Пачаць _размову" #: gajim/data/gui/contact_context_menu.ui:20 #: gajim/data/gui/systray_context_menu.ui:36 msgid "Send Single _Message..." msgstr "Адправіць _асобнае паведамленне..." #: gajim/data/gui/contact_context_menu.ui:28 #, fuzzy msgid "Send _File..." msgstr "Адправіць _файл" #: gajim/data/gui/contact_context_menu.ui:44 #, fuzzy msgid "Invite _Contacts" msgstr "Людзі" #: gajim/data/gui/contact_context_menu.ui:73 #, fuzzy msgid "E_xecute Command..." msgstr "Выканаць загад..." #: gajim/data/gui/contact_context_menu.ui:82 #, fuzzy msgid "M_anage Contact" msgstr "Змяніць імя чалавека" #: gajim/data/gui/contact_context_menu.ui:92 #, fuzzy msgid "_Rename..." msgstr "Змяніць _імя" #: gajim/data/gui/contact_context_menu.ui:99 #, fuzzy msgid "Edit _Groups..." msgstr "Змяніць _групы" #: gajim/data/gui/contact_context_menu.ui:106 #, fuzzy msgid "Assign Open_PGP Key..." msgstr "Прызначыць ключ Open_PGP" #: gajim/data/gui/contact_context_menu.ui:115 #, fuzzy msgid "Add Special _Notification..." msgstr "Дадаць спецыяльнае _нагадванне" #: gajim/data/gui/contact_context_menu.ui:129 msgid "_Subscription" msgstr "П_адпіска" #: gajim/data/gui/contact_context_menu.ui:138 #, fuzzy msgid "_Allow contact to see my status" msgstr "_Дазволіць чалавеку бачыць змены майго стану" #: gajim/data/gui/contact_context_menu.ui:146 #, fuzzy msgid "A_sk to see contact status" msgstr "Спытацца _дазволу праглядаць змены стану" #: gajim/data/gui/contact_context_menu.ui:154 #, fuzzy msgid "_Forbid contact to see my status" msgstr "_Забараніць праглядаць змены майго стану" #: gajim/data/gui/contact_context_menu.ui:182 #, fuzzy msgid "_Unignore" msgstr "дзевяць" #: gajim/data/gui/contact_context_menu.ui:190 msgid "_Ignore" msgstr "" #: gajim/data/gui/contact_context_menu.ui:197 #: gajim/data/gui/chat_context_menu.ui:66 #, fuzzy msgid "_Add to Roster..." msgstr "_Дадаць у кантактны ліст" #: gajim/data/gui/account_creation_wizard_window.ui:43 msgid "Gajim: Account Creation Wizard" msgstr "Gajim: Стварэнне рахунка" #: gajim/data/gui/account_creation_wizard_window.ui:70 msgid "" "You need to have an account in order to connect\n" "to the Jabber network." msgstr "" "Трэба зарэгістраваць рахунак, каб далучыцца да\n" "сеткі Jabber." #: gajim/data/gui/account_creation_wizard_window.ui:95 #, fuzzy msgid "I already have an account I want to _use" msgstr "Я ўжо маю патрэбны рахунак" #: gajim/data/gui/account_creation_wizard_window.ui:112 msgid "I want to _register for a new account" msgstr "_Зарэгістраваць новы рахунак" #: gajim/data/gui/account_creation_wizard_window.ui:133 msgid "Please choose one of the options below:" msgstr "Выберыце адну з наступных опцый:" #: gajim/data/gui/account_creation_wizard_window.ui:167 #, fuzzy msgid "Please fill in the data for your existing account" msgstr "Запоўніце звесткі Вашага рахунка" #: gajim/data/gui/account_creation_wizard_window.ui:187 msgid "_Jabber ID:" msgstr "_Jabber ID:" #: gajim/data/gui/account_creation_wizard_window.ui:239 #: gajim/data/gui/account_creation_wizard_window.ui:394 #, fuzzy msgid "Anon_ymous authentication" msgstr "Аўтарызацыя" #: gajim/data/gui/account_creation_wizard_window.ui:259 #: gajim/data/gui/manage_bookmarks_window.ui:172 msgid "_Password:" msgstr "_Пароль:" #: gajim/data/gui/account_creation_wizard_window.ui:281 msgid "Save pass_word" msgstr "Захоўваць па_роль" #: gajim/data/gui/account_creation_wizard_window.ui:285 msgid "If checked, Gajim will remember the password for this account" msgstr "Калі гэтая опцыя ўключаная, Gajim запомніць пароль для гэтага рахунка" #: gajim/data/gui/account_creation_wizard_window.ui:339 msgid "Please select a server" msgstr "" #: gajim/data/gui/account_creation_wizard_window.ui:358 #: gajim/data/gui/manage_bookmarks_window.ui:159 msgid "_Server:" msgstr "_Сервер:" #: gajim/data/gui/account_creation_wizard_window.ui:423 #, fuzzy msgid "Prox_y:" msgstr "Проксі:" #: gajim/data/gui/account_creation_wizard_window.ui:450 msgid "Manage..." msgstr "Кіраванне..." #: gajim/data/gui/account_creation_wizard_window.ui:465 msgid "Use custom hostname/port" msgstr "Адмысловы вузел / порт" #: gajim/data/gui/account_creation_wizard_window.ui:491 #, fuzzy msgid "_Hostname:" msgstr "Назва вузла: " #: gajim/data/gui/account_creation_wizard_window.ui:517 msgid "_Port:" msgstr "_Порт:" #: gajim/data/gui/account_creation_wizard_window.ui:553 #: gajim/data/gui/account_creation_wizard_window.ui:884 msgid "_Advanced" msgstr "_Адмысловыя" #: gajim/data/gui/account_creation_wizard_window.ui:624 msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA1 fingerprint of the certificate:\n" msgstr "" #: gajim/data/gui/account_creation_wizard_window.ui:687 #, fuzzy msgid "" "Connecting to server\n" "\n" "Please wait..." msgstr "" "Стварэнне рахунка\n" "\n" "Калі ласка, пачакайце..." #: gajim/data/gui/account_creation_wizard_window.ui:772 msgid "Connect when I press Finish" msgstr "Злучыцца па націску кнопкі \"Скончыць\"" #: gajim/data/gui/account_creation_wizard_window.ui:789 msgid "Set my profile when I connect" msgstr "Абнавіць профіль па злучэнні" #: gajim/data/gui/account_creation_wizard_window.ui:901 msgid "_Finish" msgstr "_Скончыць" #: gajim/data/gui/privacy_lists_window.ui:34 msgid "Privacy Lists:" msgstr "Спісы прыватнасці:" #: gajim/data/gui/service_discovery_window.ui:84 msgid "_Address:" msgstr "_Адрас:" #: gajim/data/gui/service_discovery_window.ui:115 msgid "G_o" msgstr "_Ісці" #: gajim/data/gui/synchronise_select_contacts_dialog.ui:8 msgid "Synchronise : select contacts" msgstr "" #: gajim/data/gui/synchronise_select_contacts_dialog.ui:67 #, fuzzy msgid "Select the contacts you want to synchronise" msgstr "JID чалавека, з якім Вы хочаце паразмаўляць" #: gajim/data/gui/edit_groups_dialog.ui:8 msgid "Edit Groups" msgstr "Змяніць групы" #: gajim/data/gui/search_window.ui:42 #, fuzzy msgid "Please wait while retrieving search form..." msgstr "Калі ласка, пачакайце канца атрымання спіса загадаў..." #: gajim/data/gui/search_window.ui:80 #, fuzzy msgid "_Add contact" msgstr "Дадаць _чалавека" #: gajim/data/gui/search_window.ui:116 msgid "_Search" msgstr "П_ошук" #: gajim/data/gui/chat_context_menu.ui:11 msgid "_Copy Link Location" msgstr "_Скапіяваць адрас спасылкі" #: gajim/data/gui/chat_context_menu.ui:19 msgid "_Open Link in Browser" msgstr "_Адкрыць у праглядальніку" #: gajim/data/gui/chat_context_menu.ui:27 msgid "_Copy JID/Email Address" msgstr "_Скапіяваць JID / паштовы адрас" #: gajim/data/gui/chat_context_menu.ui:35 msgid "_Open Email Composer" msgstr "_Напісаць ліст" #: gajim/data/gui/chat_context_menu.ui:49 #: gajim/data/gui/subscription_request_window.ui:12 msgid "_Start Chat" msgstr "_Пачаць размову" #: gajim/data/gui/chat_context_menu.ui:57 #: gajim/data/gui/account_context_menu.ui:35 #: gajim/data/gui/systray_context_menu.ui:28 msgid "Join _Group Chat" msgstr "Удзельнічаць у _групавой размове" #: gajim/data/gui/change_status_message_dialog.ui:131 msgid "Save as Preset..." msgstr "Захаваць тлумачэнне..." #: gajim/data/gui/change_status_message_dialog.ui:167 msgid "Preset messages:" msgstr "Стандартныя паведамленні:" #: gajim/data/gui/change_status_message_dialog.ui:313 msgid "Type your new status message" msgstr "Увядзіце тэкст новага паведамлення аб змене стану" #: gajim/data/gui/synchronise_select_account_dialog.ui:8 #, fuzzy msgid "Synchronise contacts" msgstr "Паказаць _адлучаных людзей" #: gajim/data/gui/synchronise_select_account_dialog.ui:68 msgid "Select the account with which you want to synchronise" msgstr "" #: gajim/data/gui/archiving_313_preferences_window.ui:28 #, fuzzy msgid "Roster" msgstr "Паказаць _галоўнае вакно" #: gajim/data/gui/archiving_313_preferences_window.ui:85 #, fuzzy msgid "Preference" msgstr "Уласцівасці" #: gajim/data/gui/archiving_313_preferences_window.ui:159 #, fuzzy msgid "Default:" msgstr "Прадвызначана" #: gajim/data/gui/voip_call_received_dialog.ui:15 msgid "Incoming call" msgstr "" #: gajim/data/gui/add_new_contact_window.ui:29 msgid "Add New Contact" msgstr "Дадаць новага чалавека" #: gajim/data/gui/add_new_contact_window.ui:62 msgid "A_ccount:" msgstr "Р_ахунак:" #: gajim/data/gui/add_new_contact_window.ui:110 msgid "_Protocol:" msgstr "_Пратакол:" #: gajim/data/gui/add_new_contact_window.ui:169 msgid "_User ID:" msgstr "_ID карыстальніка:" #: gajim/data/gui/add_new_contact_window.ui:182 #: gajim/data/gui/manage_bookmarks_window.ui:133 msgid "_Nickname:" msgstr "_Мянушка:" #: gajim/data/gui/add_new_contact_window.ui:195 msgid "_Group:" msgstr "_Група:" #: gajim/data/gui/add_new_contact_window.ui:210 #, fuzzy msgid "Type User ID" msgstr "ID карыстальніка:" #: gajim/data/gui/add_new_contact_window.ui:223 #, fuzzy msgid "Type Nickname" msgstr "Мянушка" #: gajim/data/gui/add_new_contact_window.ui:239 msgid "Choose a group of type a new group" msgstr "" #: gajim/data/gui/add_new_contact_window.ui:257 msgid "A_llow this contact to view my status" msgstr "_Дазволіць чалавеку бачыць змены майго стану" #: gajim/data/gui/add_new_contact_window.ui:300 #, fuzzy msgid "_Save subscription message" msgstr "П_адпіска" #: gajim/data/gui/add_new_contact_window.ui:325 #, fuzzy msgid "" "You have to register with this transport\n" "to be able to add a contact from this\n" "protocol. Click on Register button to\n" "proceed." msgstr "" "Вы павінны зарэгістравацца для гэтага\n" "транспарта, каб дадаць чалавека з\n" "гэтага пратакола. Пстрыкніце па кнопцы\n" "рэгістрацыі." #: gajim/data/gui/add_new_contact_window.ui:340 msgid "_Register" msgstr "_Рэгістрацыя" #: gajim/data/gui/add_new_contact_window.ui:369 msgid "" "You must be connected to the transport to be able\n" "to add a contact from this protocol." msgstr "" "Вы павінны злучыцца з транспартам, каб\n" "дадаць людзей з гэтага пратакола." #: gajim/data/gui/roster_window.ui:61 #, fuzzy msgid "Change Status Message…" msgstr "З_мяніць паведамленне аб стане" #: gajim/data/gui/change_mood_dialog.ui:73 #, fuzzy msgid "Mood:" msgstr "Гукі" #: gajim/data/gui/change_mood_dialog.ui:85 #, fuzzy msgid "Message:" msgstr "Паведамленні аб змене стану" #: gajim/data/gui/plugins_window.ui:25 gajim/data/gui/application_menu.ui:90 msgid "Plugins" msgstr "" #: gajim/data/gui/plugins_window.ui:78 msgid "Install from zip" msgstr "" #: gajim/data/gui/plugins_window.ui:109 msgid "<empty>" msgstr "" #: gajim/data/gui/plugins_window.ui:131 #, fuzzy msgid "Version:" msgstr "Версія GTK+:" #: gajim/data/gui/plugins_window.ui:169 #, fuzzy msgid "Authors:" msgstr "А_ўтарызаваць" #: gajim/data/gui/plugins_window.ui:210 #, fuzzy msgid "Homepage:" msgstr "У Сеціве:" #: gajim/data/gui/plugins_window.ui:253 #, fuzzy msgid "Description:" msgstr "Апісанне: %s" #: gajim/data/gui/plugins_window.ui:301 msgid "Uninstall" msgstr "" #: gajim/data/gui/plugins_window.ui:316 #, fuzzy msgid "Configure" msgstr "_Працягнуць" #: gajim/data/gui/plugins_window.ui:348 #, fuzzy msgid "Installed" msgstr "Марнаванне часу" #: gajim/data/gui/plugins_window.ui:399 msgid "" "Plug-in decription should be displayed here. This text will be erased during " "PluginsWindow initialization." msgstr "" #: gajim/data/gui/privacy_list_window.ui:18 #, fuzzy msgid "none" msgstr "адзін" #: gajim/data/gui/privacy_list_window.ui:21 #, fuzzy msgid "both" msgstr "Абодва" #: gajim/data/gui/privacy_list_window.ui:24 #, fuzzy msgid "from" msgstr "Ад" #: gajim/data/gui/privacy_list_window.ui:27 #, fuzzy msgid "to" msgstr "два" #: gajim/data/gui/privacy_list_window.ui:66 msgid "Privacy List" msgstr "Спіс прыватнасці" #: gajim/data/gui/privacy_list_window.ui:77 msgid "Active for this session" msgstr "Актыўны для гэтага сеанса" #: gajim/data/gui/privacy_list_window.ui:94 msgid "Active on each startup" msgstr "Актываваць пры запуску" #: gajim/data/gui/privacy_list_window.ui:132 msgid "List of rules" msgstr "Спіс правілаў" #: gajim/data/gui/privacy_list_window.ui:244 msgid "Add / Edit a rule" msgstr "Дадаць / Змяніць правіла" #: gajim/data/gui/privacy_list_window.ui:266 msgid "Allow" msgstr "Дазволіць" #: gajim/data/gui/privacy_list_window.ui:282 msgid "Deny" msgstr "Адмовіць" #: gajim/data/gui/privacy_list_window.ui:317 msgid "JabberID" msgstr "JabberID" #: gajim/data/gui/privacy_list_window.ui:358 msgid "all in the group" msgstr "усе з групы" #: gajim/data/gui/privacy_list_window.ui:407 msgid "all by subscription" msgstr "усе па падпісцы" #: gajim/data/gui/privacy_list_window.ui:456 msgid "All" msgstr "Усе" #: gajim/data/gui/privacy_list_window.ui:493 msgid "to send me messages" msgstr "адпраўляць мне паведамленні" #: gajim/data/gui/privacy_list_window.ui:509 msgid "to send me queries" msgstr "адпраўляць мне запыты" #: gajim/data/gui/privacy_list_window.ui:525 msgid "to view my status" msgstr "бачыць мой стан" #: gajim/data/gui/privacy_list_window.ui:541 msgid "to send me status" msgstr "адпраўляць мне паведамленні аб змене стану" #: gajim/data/gui/privacy_list_window.ui:557 #, fuzzy msgid "All (including subscription)" msgstr "усе па падпісцы" #: gajim/data/gui/privacy_list_window.ui:598 msgid "Order:" msgstr "Парадак:" #: gajim/data/gui/manage_sounds_window.ui:10 #, fuzzy msgid "Manage sounds" msgstr "Кіраванне рахункамі" #: gajim/data/gui/remove_account_window.ui:56 msgid "Remove account _only from Gajim" msgstr "Выдаліць рахунак _толькі для Gajim" #: gajim/data/gui/remove_account_window.ui:73 msgid "Remove account from Gajim and from _server" msgstr "Выдаліць рахунак для Gajim і на _серверы" #: gajim/data/gui/remove_account_window.ui:94 msgid "What do you want to do?" msgstr "Што Вы хочаце зрабіць?" #: gajim/data/gui/adhoc_commands_window.ui:35 msgid "Please wait while retrieving command list..." msgstr "Калі ласка, пачакайце канца атрымання спіса загадаў..." #: gajim/data/gui/adhoc_commands_window.ui:93 msgid "Choose command to execute:" msgstr "Выберыце загад для выканання:" #: gajim/data/gui/adhoc_commands_window.ui:136 #: gajim/data/gui/adhoc_commands_window.ui:277 msgid "Check once more" msgstr "Праверыць яшчэ" #: gajim/data/gui/adhoc_commands_window.ui:194 #, fuzzy msgid "Please wait while the command is being sent..." msgstr "Калі ласка, пачакайце канца адпраўлення загаду..." #: gajim/data/gui/adhoc_commands_window.ui:211 msgid "Please wait..." msgstr "Калі ласка, пачакайце..." #: gajim/data/gui/adhoc_commands_window.ui:257 msgid "This jabber entity does not expose any commands." msgstr "Гэты рахунак не мае адпаведных загадаў." #: gajim/data/gui/adhoc_commands_window.ui:336 msgid "An error has occurred:" msgstr "Адбылася памылка:" #: gajim/data/gui/adhoc_commands_window.ui:465 #, fuzzy msgid "F_inish" msgstr "_Скончыць" #: gajim/data/gui/account_context_menu.ui:20 #, fuzzy msgid "_Personal Events" msgstr "Асабістыя звесткі" #: gajim/data/gui/account_context_menu.ui:49 msgid "_Add Contact..." msgstr "_Дадаць чалавека..." #: gajim/data/gui/account_context_menu.ui:57 msgid "_Discover Services" msgstr "_Пошук сервісаў" #: gajim/data/gui/account_context_menu.ui:65 msgid "_Execute Command..." msgstr "_Выканаць загад..." #: gajim/data/gui/esession_info_window.ui:50 msgid "_Verify" msgstr "" #: gajim/data/gui/esession_info_window.ui:137 #, fuzzy msgid "(ESession info)" msgstr "Апісанне" #: gajim/data/gui/application_menu.ui:8 #, fuzzy msgid "View" msgstr "_Выгляд" #: gajim/data/gui/application_menu.ui:11 #, fuzzy msgid "Show Roster" msgstr "Паказаць _галоўнае вакно" #: gajim/data/gui/application_menu.ui:16 #, fuzzy msgid "Show Offline Contacts" msgstr "Паказаць _адлучаных людзей" #: gajim/data/gui/application_menu.ui:21 #, fuzzy msgid "Show Active Contacts" msgstr "Паказаць _адлучаных людзей" #: gajim/data/gui/application_menu.ui:26 #, fuzzy msgid "Show Transports" msgstr "Паказаць _транспарты" #: gajim/data/gui/application_menu.ui:43 #, fuzzy msgid "Help" msgstr "_Даведка" #: gajim/data/gui/application_menu.ui:46 #, fuzzy msgid "Contents" msgstr "_Змест" #: gajim/data/gui/application_menu.ui:50 #, fuzzy msgid "FAQ" msgstr "_Частыя пытанні" #: gajim/data/gui/application_menu.ui:54 msgid "Keyboard Shortcuts" msgstr "" #: gajim/data/gui/application_menu.ui:58 gajim/data/gui/features_window.ui:9 #, fuzzy msgid "Features" msgstr "Здольнасці сервера" #: gajim/data/gui/application_menu.ui:76 msgid "Start Chat" msgstr "Пачаць размову" #: gajim/data/gui/application_menu.ui:81 #, fuzzy msgid "Bookmarks" msgstr "_Змясціць у закладках" #: gajim/data/gui/application_menu.ui:99 #, fuzzy msgid "Quit" msgstr "_Выйсці" #: gajim/data/gui/features_window.ui:26 msgid "List of possible features in Gajim:" msgstr "" #: gajim/data/gui/manage_bookmarks_window.ui:14 msgid "Manage Bookmarks" msgstr "Кіраванне закладкамі" #: gajim/data/gui/manage_bookmarks_window.ui:120 #, fuzzy msgid "_Title:" msgstr "Загаловак:" #: gajim/data/gui/manage_bookmarks_window.ui:146 msgid "Roo_m:" msgstr "" #: gajim/data/gui/manage_bookmarks_window.ui:188 #, fuzzy msgid "A_uto join" msgstr "Аўтаматычна далучацца" #: gajim/data/gui/manage_bookmarks_window.ui:193 msgid "If checked, Gajim will join this group chat on startup" msgstr "" "Калі гэтая опцыя ўключаная, Gajim далучыцца да гэтай групавой размовы пры " "запуску" #: gajim/data/gui/manage_bookmarks_window.ui:207 msgid "Minimi_ze on Auto Join" msgstr "" #: gajim/data/gui/manage_bookmarks_window.ui:235 #, fuzzy msgid "Pr_int status:" msgstr "Стан друку:" #: gajim/data/gui/exception_dialog.ui:45 #, fuzzy msgid "" "A programming error has been detected. It probably is not fatal, but should " "be reported to the developers nonetheless." msgstr "" "Магчыма, гэтая памылка не крытычная, але пра яе варта паведаміць " "распрацоўнікам." #: gajim/data/gui/exception_dialog.ui:115 #, fuzzy msgid "Report Bug" msgstr "_Паведаміць пра памылку" #: gajim/data/gui/subscription_request_window.ui:95 msgid "_Deny" msgstr "_Адмовіць" #: gajim/data/gui/subscription_request_window.ui:100 msgid "" "Deny authorization from contact so he or she cannot know when you're " "connected" msgstr "Забраць аўтарызацыю ў чалавека, каб ён не мог бачыць, калі Вы далучаны" #: gajim/data/gui/subscription_request_window.ui:133 msgid "Au_thorize" msgstr "А_ўтарызаваць" #: gajim/data/gui/subscription_request_window.ui:138 msgid "Authorize contact so he or she can know when you're connected" msgstr "Аўтарызаваць чалавека, каб ён мог бачыць, калі Вы далучаны" #: gajim/data/gui/xml_console_window.ui:121 #, fuzzy msgid "Presence" msgstr "_Прысутнасць" #: gajim/data/gui/xml_console_window.ui:134 msgid "Iq" msgstr "" #: gajim/data/gui/xml_console_window.ui:149 #, fuzzy msgid "Presets" msgstr "_Прысутнасць" #: gajim/data/gui/chat_to_muc_window.ui:24 msgid "Invite Friends!" msgstr "" #: gajim/data/gui/chat_to_muc_window.ui:39 #, fuzzy msgid "" "You are now entering a groupchat.\n" "Select the contacts you want to invite" msgstr "JID чалавека, з якім Вы хочаце паразмаўляць" #: gajim/data/gui/chat_to_muc_window.ui:67 #: gajim/data/gui/chat_to_muc_window.ui:78 msgid "column" msgstr "" #: gajim/data/gui/chat_to_muc_window.ui:112 msgid "Please select a MUC server." msgstr "" #: gajim/data/gui/chat_to_muc_window.ui:141 #, fuzzy msgid "MUC server" msgstr "Назіральнікі" #: gajim/data/gui/chat_to_muc_window.ui:176 #, fuzzy msgid "In_vite" msgstr "За_прасіць" #: gajim/data/gui/history_manager.ui:11 #, fuzzy msgid "_Export" msgstr "Экспартаваць" #: gajim/data/gui/history_manager.ui:97 msgid "Gajim History Logs Manager" msgstr "Gajim - Кіраўнік журналаў размоў" #: gajim/data/gui/history_manager.ui:154 #, fuzzy msgid "Welcome to Gajim History Logs Manager" msgstr "Gajim - Кіраўнік журналаў размоў" #: gajim/data/gui/history_manager.ui:168 msgid "" "This log manager is not intended for log viewing. If you are looking for " "such functionality, use the history window instead.\n" "\n" "Use this program to delete or export logs. You can select logs from the left " "and/or search database from below." msgstr "" #: gajim/data/gui/history_manager.ui:184 #, fuzzy msgid "" "WARNING:\n" "If you plan to do massive deletions, please make sure Gajim is not running. " "Generally avoid deletions with contacts you currently chat with." msgstr "" "Gajim - Кіраўнік журналаў размоў\n" "\n" "Вы можаце выбраць адзін з журналаў на левай панэлі альбо адшукаць у базе " "дадзеных.\n" "\n" "Увага:\n" "Калі Вы хочаце здзейсніць масавую чыстку журналаў, закрыйце Gajim. Не " "выдаляйце журналы размоў з людзьмі, з якімі Вы зараз размаўляеце." #: gajim/data/gui/history_manager.ui:283 msgid "_Search Database" msgstr "_Пошук у базе дадзеных" #: gajim/data/gui/shortcuts_window.ui:8 msgid "Chat Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:12 #, fuzzy msgid "Message composition" msgstr "змест паведамлення" #: gajim/data/gui/shortcuts_window.ui:17 #, fuzzy msgid "Send the message" msgstr "Адправіць паведамленне" #: gajim/data/gui/shortcuts_window.ui:24 #, fuzzy msgid "Create a new line" msgstr "Стварыць новы допіс" #: gajim/data/gui/shortcuts_window.ui:31 msgid "Select an emoticon" msgstr "" #: gajim/data/gui/shortcuts_window.ui:38 msgid "Complete a command or a nick" msgstr "" #: gajim/data/gui/shortcuts_window.ui:45 #, fuzzy msgid "Previous sent message" msgstr "Стандартныя паведамленні:" #: gajim/data/gui/shortcuts_window.ui:52 #, fuzzy msgid "Next sent messages" msgstr "Стандартныя паведамленні:" #: gajim/data/gui/shortcuts_window.ui:59 #, fuzzy msgid "Quote previous message" msgstr "паведамленне стану" #: gajim/data/gui/shortcuts_window.ui:66 #, fuzzy msgid "Quote next message" msgstr "Адправіць паведамленне" #: gajim/data/gui/shortcuts_window.ui:73 #, fuzzy msgid "Clear message entry" msgstr "Паведамленне адпраўленае" #: gajim/data/gui/shortcuts_window.ui:81 gajim/data/gui/shortcuts_window.ui:231 #, fuzzy msgid "Appearance" msgstr "Змяніць правіла" #: gajim/data/gui/shortcuts_window.ui:86 msgid "Toggle full / compact view" msgstr "" #: gajim/data/gui/shortcuts_window.ui:94 #, fuzzy msgid "Recent history" msgstr "Нядаўна:" #: gajim/data/gui/shortcuts_window.ui:99 msgid "Scroll up" msgstr "" #: gajim/data/gui/shortcuts_window.ui:106 msgid "Scroll down" msgstr "" #: gajim/data/gui/shortcuts_window.ui:121 msgid "Tabs" msgstr "" #: gajim/data/gui/shortcuts_window.ui:126 msgid "Switch to the previous tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:133 msgid "Switch to the next tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:140 msgid "Switch to the first - ninth tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:147 msgid "Switch to the previous unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:154 msgid "Switch to the next unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:161 msgid "Close chat" msgstr "" #: gajim/data/gui/shortcuts_window.ui:172 msgid "Roster Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:195 #, fuzzy msgid "File transfers" msgstr "Перадача файлаў" #: gajim/data/gui/shortcuts_window.ui:209 #, fuzzy msgid "Join a group chat" msgstr "Удзельнічаць у _групавой размове" #: gajim/data/gui/shortcuts_window.ui:216 #, fuzzy msgid "Set the status message" msgstr "паведамленне стану" #: gajim/data/gui/shortcuts_window.ui:223 #, fuzzy msgid "Quit Gajim" msgstr "Gajim" #: gajim/data/gui/shortcuts_window.ui:236 #, fuzzy msgid "Show offline contacts" msgstr "Паказаць _адлучаных людзей" #: gajim/data/gui/shortcuts_window.ui:243 #, fuzzy msgid "Show only active contacts" msgstr "Паказаць _адлучаных людзей" #: gajim/data/gui/shortcuts_window.ui:250 msgid "Enable roster filtering" msgstr "" #: gajim/data/gui/shortcuts_window.ui:258 msgid "Contacts" msgstr "Людзі" #: gajim/data/gui/shortcuts_window.ui:263 #, fuzzy msgid "Contact information" msgstr "Асабістыя звесткі" #: gajim/data/gui/shortcuts_window.ui:270 #, fuzzy msgid "Rename contact" msgstr "Змяніць імя чалавека" #: gajim/data/gui/shortcuts_window.ui:277 #, fuzzy msgid "Delete contact" msgstr "Людзі" #: gajim/data/gui/passphrase_dialog.ui:8 msgid "Passphrase" msgstr "Пароль" #: gajim/data/gui/history_window.ui:38 #, fuzzy msgid "Enter name / JID of contact or groupchat" msgstr "Імя чалавека" #: gajim/data/gui/history_window.ui:51 #, fuzzy msgid "Search:" msgstr "Пошук" #: gajim/data/gui/history_window.ui:75 msgid "_In date search" msgstr "" #: gajim/data/gui/history_window.ui:79 msgid "Only searching within selected day" msgstr "" #: gajim/data/gui/history_window.ui:306 #, fuzzy msgid "_Show status changes" msgstr "_Пісаць у журнал паведамленні аб змене стану чалавека" #: gajim/data/gui/manage_pep_services_window.ui:13 #, fuzzy msgid "PEP Service Configuration" msgstr "Настаўленні пакоя" #: gajim/data/gui/manage_pep_services_window.ui:69 #, fuzzy msgid "_Configure" msgstr "_Працягнуць" #: gajim/data/gui/groups_post_window.ui:9 msgid "Create new post" msgstr "Стварыць новы допіс" #: gajim/data/gui/groups_post_window.ui:29 #: gajim/data/gui/single_message_window.ui:46 msgid "From:" msgstr "Ад:" #: gajim/data/gui/groups_post_window.ui:41 #: gajim/data/gui/single_message_window.ui:70 msgid "Subject:" msgstr "Тэма:" #: gajim/data/gui/data_form_window.ui:19 msgid "Fill in the form." msgstr "Запоўніце форму." #: gajim/data/gui/data_form_window.ui:274 msgid "Room Configuration" msgstr "Настаўленні пакоя" #: gajim/data/gui/roster_item_exchange_window.ui:8 msgid "Roster Item Exchange" msgstr "" #: gajim/data/gui/systray_context_menu.ui:12 msgid "Sta_tus" msgstr "Ст_ан" #: gajim/data/gui/systray_context_menu.ui:20 #, fuzzy msgid "_Start Chat..." msgstr "_Пачаць размову" #: gajim/data/gui/systray_context_menu.ui:50 msgid "Show All Pending _Events" msgstr "Паказаць нягледжаныя _падзеі" #: gajim/data/gui/systray_context_menu.ui:59 msgid "Mute Sounds" msgstr "Адключыць гукі" #: gajim/data/gui/systray_context_menu.ui:75 #, fuzzy msgid "_Preferences" msgstr "Уласцівасці" #: gajim/data/gui/systray_context_menu.ui:90 #, fuzzy msgid "_Quit" msgstr "_Выйсці" #: gajim/data/gui/single_message_window.ui:59 msgid "To:" msgstr "Каму:" #: gajim/data/gui/single_message_window.ui:118 msgid "0" msgstr "0" #: gajim/data/gui/single_message_window.ui:210 msgid "Sen_d" msgstr "Ад_правіць" #: gajim/data/gui/single_message_window.ui:216 msgid "Send message" msgstr "Адправіць паведамленне" #: gajim/data/gui/single_message_window.ui:229 msgid "_Reply" msgstr "_Адказаць" #: gajim/data/gui/single_message_window.ui:235 msgid "Reply to this message" msgstr "Адказаць на гэтае паведамленне" #: gajim/data/gui/single_message_window.ui:248 msgid "_Send & Close" msgstr "Ад_правіць і закрыць" #: gajim/data/gui/single_message_window.ui:254 msgid "Send message and close window" msgstr "Адправіць паведамленне і закрыць вакно" #: gajim/data/gui/change_activity_dialog.ui:8 msgid "Set Activity" msgstr "" #: gajim/data/gui/change_activity_dialog.ui:65 msgid "Set an activity" msgstr "" #: gajim/data/gui/change_activity_dialog.ui:337 #, fuzzy msgid "Message: " msgstr "Паведамленні аб змене стану" #: gajim/command_system/mapping.py:164 gajim/command_system/mapping.py:174 #: gajim/command_system/mapping.py:194 #, fuzzy msgid "Missing arguments" msgstr "Не хапае аргумента \"contact_jid\"" #: gajim/command_system/mapping.py:261 #, fuzzy msgid "Too many arguments" msgstr "Не хапае аргумента \"contact_jid\"" #: gajim/command_system/implementation/execute.py:53 msgid "Execute expression inside a shell, show output" msgstr "" #: gajim/command_system/implementation/execute.py:109 msgid "Execute expression inside a shell, send output" msgstr "" #: gajim/command_system/implementation/standard.py:45 msgid "" "Show help on a given command or a list of available commands if -a is given" msgstr "" #: gajim/command_system/implementation/standard.py:72 #, fuzzy msgid "Send a message to the contact" msgstr "Карыстанне: /%s, хавае кнопкі размовы." #: gajim/command_system/implementation/standard.py:77 msgid "Send action (in the third person) to the current chat" msgstr "" #: gajim/command_system/implementation/standard.py:82 msgid "Show logged messages which mention given text" msgstr "" #: gajim/command_system/implementation/standard.py:87 #, fuzzy, python-format msgid "%s: Nothing found" msgstr "%s не знойдзены" #: gajim/command_system/implementation/standard.py:93 msgid "Limit must be an integer" msgstr "" #: gajim/command_system/implementation/standard.py:117 msgid "" "\n" " Set the current status\n" "\n" " Status can be given as one of the following values:\n" " online, away, chat, xa, dnd.\n" " " msgstr "" #: gajim/command_system/implementation/standard.py:135 msgid "Set the current status to away" msgstr "" #: gajim/command_system/implementation/standard.py:149 msgid "Set the current status to online" msgstr "" #: gajim/command_system/implementation/standard.py:152 #, fuzzy msgid "Available" msgstr "_Тут" #: gajim/command_system/implementation/standard.py:172 #: gajim/command_system/implementation/standard.py:249 #, fuzzy msgid "Clear the text window" msgstr "Карыстанне: /%s, прыбірае тэкст у вакне." #: gajim/command_system/implementation/standard.py:177 #: gajim/command_system/implementation/standard.py:389 #, fuzzy msgid "Send a ping to the contact" msgstr "Адправіць файл чалавеку" #: gajim/command_system/implementation/standard.py:180 #: gajim/command_system/implementation/standard.py:392 msgid "Command is not supported for zeroconf accounts" msgstr "" #: gajim/command_system/implementation/standard.py:184 msgid "Send DTMF sequence through an open audio session" msgstr "" #: gajim/command_system/implementation/standard.py:187 #, fuzzy msgid "No open audio sessions with the contact" msgstr "Пстрыкніце, каб праглядзець былыя размовы з гэтым чалавекам" #: gajim/command_system/implementation/standard.py:190 #, python-format msgid "%s is not a valid tone" msgstr "" #: gajim/command_system/implementation/standard.py:197 msgid "Toggle audio session" msgstr "" #: gajim/command_system/implementation/standard.py:200 #, fuzzy msgid "Audio sessions are not available" msgstr "Няма злучэння" #: gajim/command_system/implementation/standard.py:207 msgid "Toggle video session" msgstr "" #: gajim/command_system/implementation/standard.py:210 #, fuzzy msgid "Video sessions are not available" msgstr "Няма злучэння" #: gajim/command_system/implementation/standard.py:217 msgid "Send a message to the contact that will attract his (her) attention" msgstr "" #: gajim/command_system/implementation/standard.py:256 #, fuzzy msgid "Change your nickname in a group chat" msgstr "Змяніць м_янушку" #: gajim/command_system/implementation/standard.py:266 #, fuzzy msgid "Open a private chat window with a specified occupant" msgstr "" "Карыстанне: /%s <мянушка>, адкрывае вакно прыватнай размовы з чалавекам." #: gajim/command_system/implementation/standard.py:272 #: gajim/command_system/implementation/standard.py:281 #: gajim/command_system/implementation/standard.py:327 #: gajim/command_system/implementation/standard.py:339 #: gajim/command_system/implementation/standard.py:351 #, fuzzy msgid "Nickname not found" msgstr "Мянушка не знойдзеная: %s" #: gajim/command_system/implementation/standard.py:275 #, fuzzy msgid "" "Open a private chat window with a specified occupant and send him a message" msgstr "" "Карыстанне: /%s <мянушка>, адкрывае вакно прыватнай размовы з чалавекам." #: gajim/command_system/implementation/standard.py:284 #, fuzzy msgid "Display or change a group chat topic" msgstr "Пытацца пацверджання закрыцця групавой размовы." #: gajim/command_system/implementation/standard.py:292 msgid "Invite a user to a room for a reason" msgstr "" #: gajim/command_system/implementation/standard.py:295 #, fuzzy, python-format msgid "Invited %(jid)s to %(room_jid)s" msgstr "%(contact_jid)s запрошаныя ў %(room_jid)s." #: gajim/command_system/implementation/standard.py:299 #, fuzzy msgid "Join a group chat given by a jid" msgstr "Удзельнічаць у _групавой размове" #: gajim/command_system/implementation/standard.py:307 msgid "" "Leave the groupchat, optionally giving a reason, and close tab or window" msgstr "" #: gajim/command_system/implementation/standard.py:312 msgid "" "\n" " Ban user by a nick or a jid from a groupchat\n" "\n" " If given nickname is not found it will be treated as a jid.\n" " " msgstr "" #: gajim/command_system/implementation/standard.py:324 #, fuzzy msgid "Kick user by a nick from a groupchat" msgstr "Вы не ўвайшлі ў пакой групавой размовы." #: gajim/command_system/implementation/standard.py:332 msgid "" "Set occupant role in group chat.\n" " Role can be given as one of the following values:\n" " moderator, participant, visitor, none" msgstr "" #: gajim/command_system/implementation/standard.py:337 #, fuzzy msgid "Invalid role given" msgstr "Няправільнае імя карыстальніка" #: gajim/command_system/implementation/standard.py:344 msgid "" "Set occupant affiliation in group chat.\n" " Affiliation can be given as one of the following values:\n" " owner, admin, member, outcast, none" msgstr "" #: gajim/command_system/implementation/standard.py:349 #, fuzzy msgid "Invalid affiliation given" msgstr "Адносіны: " #: gajim/command_system/implementation/standard.py:357 #, fuzzy msgid "Display names of all group chat occupants" msgstr "Карыстанне: /%s, хавае кнопкі групавой размовы." #: gajim/command_system/implementation/standard.py:379 msgid "Forbid an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/standard.py:384 msgid "Allow an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/middleware.py:72 msgid "Error during command execution!" msgstr "" #: gajim/command_system/implementation/custom.py:106 msgid "The same as using a doc-string, except it supports translation" msgstr "" #: gajim/plugins/pluginmanager.py:611 gajim/plugins/pluginmanager.py:617 msgid "Archive corrupted" msgstr "" #: gajim/plugins/pluginmanager.py:613 #, fuzzy msgid "Archive empty" msgstr "Месца файла" #: gajim/plugins/pluginmanager.py:625 gajim/plugins/pluginmanager.py:633 #: gajim/plugins/gui.py:264 msgid "Archive is malformed" msgstr "" #: gajim/plugins/pluginmanager.py:641 gajim/plugins/gui.py:288 #: gajim/plugins/gui.py:296 #, fuzzy msgid "Plugin already exists" msgstr "Такі файл ужо ёсць" #: gajim/plugins/gui.py:84 msgid "Plugin" msgstr "" #: gajim/plugins/gui.py:156 #, fuzzy, python-format msgid "Warning: %s" msgstr "Забарона казання для %s" #: gajim/plugins/gui.py:213 #, fuzzy msgid "Plugin failed" msgstr "Памылка злучэння" #: gajim/plugins/gui.py:256 msgid "Unable to properly remove the plugin" msgstr "" #: gajim/plugins/gui.py:288 msgid "Overwrite?" msgstr "" #: gajim/plugins/gui.py:320 #, fuzzy msgid "Configuration" msgstr "Настаўленні пакоя" #: data/org.gajim.Gajim.desktop.in:5 msgid "Jabber IM Client" msgstr "Jabber-праграма" #: data/org.gajim.Gajim.desktop.in:6 data/org.gajim.Gajim.appdata.xml.in:10 msgid "A GTK+ Jabber client" msgstr "Jabber-праграма для GTK+" #: data/org.gajim.Gajim.desktop.in:8 msgid "chat;messaging;im;xmpp;bonjour;voip;" msgstr "" #: data/org.gajim.Gajim.desktop.in:12 msgid "org.gajim.Gajim" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:12 msgid "" "Gajim is a chat client to be used with Jabber.org, Live Journal Talk, " "Nimbuzz, Ovi, Talkonaut, and thousands of other services run by companies " "and ISPs, and volunteers around the world." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:16 msgid "" "If you have a few accounts on different servers, if you want to be in " "contact with your friends and family all the time, then Gajim is for you." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:19 #, fuzzy msgid "Features:" msgstr "Здольнасці сервера" #: data/org.gajim.Gajim.appdata.xml.in:21 msgid "Tabbed chat window and single window modes" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:22 msgid "" "Group chat support (with Multi-User Chat protocol), invitation, chat to " "group chat transformation" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:23 msgid "Emoticons, avatars, PEP (user activity, mood and tune)" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:24 msgid "Audio / video conferences" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:25 #, fuzzy msgid "File transfer, room bookmarks" msgstr "Памылка перадачы файла" #: data/org.gajim.Gajim.appdata.xml.in:26 msgid "Metacontacts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:27 msgid "Trayicon, speller, extended chat history functionalities" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:28 msgid "TLS, GPG and End-To-End encryption support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:29 msgid "Transport registration support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:30 #, fuzzy msgid "Service discovery including nodes, user search" msgstr "Пошук сервісаў для рахунка %s" #: data/org.gajim.Gajim.appdata.xml.in:31 msgid "Wikipedia, dictionary and search engine lookup" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:32 msgid "Multiple accounts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:33 #, fuzzy msgid "XML console interface" msgstr "Кансоль XML" #: data/org.gajim.Gajim.appdata.xml.in:34 msgid "Link local (bonjour / zeroconf), BOSH" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:35 msgid "Other features via plugins" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:47 #, fuzzy msgid "Roster, list of contacts" msgstr "_Пісаць у журнал паведамленні аб змене стану чалавека" #: data/org.gajim.Gajim.appdata.xml.in:51 msgid "Tabbed chat window" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:55 #, fuzzy msgid "Group chat support" msgstr "Групавыя размовы" #: data/org.gajim.Gajim.appdata.xml.in:59 #, fuzzy msgid "Chat history" msgstr "Нядаўна:" #: data/org.gajim.Gajim.appdata.xml.in:63 #, fuzzy msgid "Plugin manager" msgstr "Памылка злучэння" #, fuzzy #~ msgid "" #~ "Install /\n" #~ "Upgrade" #~ msgstr "Марнаванне часу" #, fuzzy #~ msgid "Install/Upgrade" #~ msgstr "Марнаванне часу" #, fuzzy #~ msgid "Install and Upgrade Plugins" #~ msgstr "Марнаванне часу" #, fuzzy #~ msgid "Plugins updates" #~ msgstr "Памылка злучэння" #~ msgid "Shows or hides the roster window" #~ msgstr "Паказаць / схаваць галоўнае вакно" #, fuzzy #~ msgid "Shows or hides the ipython window" #~ msgstr "Паказаць / схаваць галоўнае вакно" #, fuzzy #~ msgid "XMPP account %s" #~ msgstr "рахунка %s" #, fuzzy #~ msgid "Exception" #~ msgstr "Апісанне" #, fuzzy #~ msgid "" #~ "someone@somewhere.com would like you to add some contacts " #~ "in your roster." #~ msgstr "Я хачу дадаць Вас у свой кантактны ліст." #~ msgid "_Actions" #~ msgstr "_Дзеянні" #, fuzzy #~ msgid "Start Chat..." #~ msgstr "_Пачаць размову" #~ msgid "You are already in group chat %s" #~ msgstr "Вы ўжо ўдзельнічаеце ў групавой размове %s" #~ msgid "Join Group Chat with account %s" #~ msgstr "Удзельнічаць у групавой размове праз рахунак %s" #, fuzzy #~ msgid "Invalid Account" #~ msgstr "Няправільная назва рахунка" #, fuzzy #~ msgid "" #~ "You have to choose an account from which you want to join the groupchat." #~ msgstr "Вы павінны стварыць рахунак, каб размаўляць з іншымі людзьмі." #, fuzzy #~ msgid "Please enter the group chat JID as room@server." #~ msgstr "Jabber ID групавой размовы ўтрымлівае няправільныя знакі." #, fuzzy #~ msgid "The group chat JID contains invalid characters." #~ msgstr "Jabber ID групавой размовы ўтрымлівае няправільныя знакі." #~ msgid "Start Chat with account %s" #~ msgstr "Пачаць размову з рахунка %s" #, fuzzy #~ msgid "" #~ "Fill in the nickname or the JID of the contact you would like\n" #~ "to send a chat message to:" #~ msgstr "" #~ "Вызначце мянушку для Jabber ID чалавека, якому Вы\n" #~ "хочаце адправіць паведамленне:" #, fuzzy #~ msgid "Nickname / JID" #~ msgstr "Паўторны Jabber ID" #~ msgid "Unable to parse \"%s\"." #~ msgstr "Немагчыма разабраць \"%s\"." #~ msgid "Shows the chat dialog so that you can send messages to a contact" #~ msgstr "" #~ "Паказвае вакно, з якога Вы можаце адправіць паведамленне пэўнаму чалавеку" #~ msgid "JID of the contact that you want to chat with" #~ msgstr "JID чалавека, з якім Вы хочаце паразмаўляць" #~ msgid "Adds contact to roster" #~ msgstr "Дадаць чалавека ў спіс" #~ msgid "jid" #~ msgstr "jid" #~ msgid "Adds new contact to this account" #~ msgstr "Дадаць новага чалавека для гэтага рахунка" #~ msgid "Opens 'Start Chat' dialog" #~ msgstr "Адкрыць вакно 'Пачаць размову'" #~ msgid "Starts chat, using this account" #~ msgstr "Пачаць размову для рахунка" #, fuzzy #~ msgid "Handle a xmpp:/ URI" #~ msgstr "Апрацоўваць спасылкі xmpp:/" #, fuzzy #~ msgid "Message content" #~ msgstr "змест паведамлення" #~ msgid "Join a MUC room" #~ msgstr "Увайсці ў размоўны пакой" #, fuzzy #~ msgid "Room JID" #~ msgstr "Пакой:" #, fuzzy #~ msgid "Nickname to use" #~ msgstr "Мянушка не знойдзеная: %s" #, fuzzy #~ msgid "Password to enter the room" #~ msgstr "Паролі розняцца" #, fuzzy #~ msgid "Wrong URI" #~ msgstr "Няправільная спасылка" #~ msgid "Nickname:" #~ msgstr "Мянушка:" #~ msgid "Server:" #~ msgstr "Сервер:" #~ msgid "Password:" #~ msgstr "Пароль:" #, fuzzy #~ msgid "Join this room _automatically when I connect" #~ msgstr "Увайсці ў гэты пакой па злучэнні" #, fuzzy #~ msgid "Bro_wse Rooms" #~ msgstr "_Праглядзець" #, fuzzy #~ msgid "Network-Watcher" #~ msgstr "Кіраўнік журналаў" #, fuzzy #~ msgid "Requires gnome-network-manager" #~ msgstr "Кіраўнік журналаў" #, fuzzy #~ msgid "Feature not available, see Help->Features" #~ msgstr "Паведамленне аб аўтаматычнай недаступнасці" #, fuzzy #~ msgid "Send files" #~ msgstr "Адправіць _файл" #, fuzzy #~ msgid "This contact does not support file transfer." #~ msgstr "Спіс актыўных, скончаных і спыненых перадачаў файлаў" #~ msgid "" #~ "You have to install %s dictionary to use spellchecking, or choose another " #~ "language by setting the speller_language option." #~ msgstr "" #~ "Вы павінны ўсталяваць слоўнік %s, каб спраўджваць правапіс, альбо выбраць " #~ "іншую мову праз опцыю speller_language." #, fuzzy #~ msgid "Hides the buttons in chat windows." #~ msgstr "Схаваць кнопкі групавой размовы." #, fuzzy #~ msgid "Change your nickname (Ctrl+N)" #~ msgstr "Змяніць м_янушку" #, fuzzy #~ msgid "Bookmark this room (Ctrl+B)" #~ msgstr "_Змясціць у закладках" #, fuzzy #~ msgid "Show advanced functions (Alt+D)" #~ msgstr "Пстрыкніце, каб уставіць сымболік (Alt+M)" #, fuzzy #~ msgid "Add this contact to roster (Ctrl+D)" #~ msgstr "Дадаць чалавека ў спіс" #, fuzzy #~ msgid "Invite contacts to the conversation (Ctrl+G)" #~ msgstr "сочыць за размовай" #, fuzzy #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Дадаць чалавека ў спіс" #, fuzzy #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Дадаць чалавека ў спіс" #, fuzzy #~ msgid "Ma_ke message windows compact" #~ msgstr "_Вакно для аднаго паведамлення:" #, fuzzy #~ msgid "Hide all buttons in chat windows" #~ msgstr "Схаваць кнопкі групавой размовы." #, fuzzy #~ msgid "Hide the chat buttons" #~ msgstr "Карыстанне: /%s, хавае кнопкі размовы." #~ msgid "" #~ "If True, Gajim will ask for avatar each contact that did not have an " #~ "avatar last time or has one cached that is too old." #~ msgstr "" #~ "Калі true, Gajim будзе адпраўляць запыт на атрыманне аватара кожнаму " #~ "чалавеку, хто не меў усталяванага аватара ў апошні сеанс, ці чый аватар " #~ "надта стары." #, fuzzy #~ msgid "?CLI:room" #~ msgstr "пакой" #, fuzzy #~ msgid "?CLI:nick" #~ msgstr "мянушка" #, fuzzy #~ msgid "?CLI:password" #~ msgstr "пароль" #~ msgid "Use D-Bus and Notification-Daemon to show notifications" #~ msgstr "Паказваць нагадванні праз DBus і Notification-Daemon" #, fuzzy #~ msgid "Notification" #~ msgstr "Змяненне рахунка" #, fuzzy #~ msgid "Ignore" #~ msgstr "дзевяць" #~ msgid "_Open Gmail Inbox" #~ msgstr "_Адкрыць уваходную пошту Gmail" #~ msgid "Notify on new _GMail email" #~ msgstr "Паведамляць аб новай пошце на _Gmail" #, fuzzy #~ msgid "" #~ "If checked, Gajim will show a notification when a new e-mail is received " #~ "via GMail" #~ msgstr "" #~ "Калі гэтая опцыя ўключаная, Gajim таксама дадасць звесткі аб адпраўніку " #~ "новых лістоў" #~ msgid "Display _extra email details" #~ msgstr "Паказаць _падрабязнасці пошты" #, fuzzy #~ msgid "" #~ "If checked, Gajim will also include information about the sender of new " #~ "emails" #~ msgstr "" #~ "Калі гэтая опцыя ўключаная, Gajim таксама дадасць звесткі аб адпраўніку " #~ "новых лістоў" #~ msgid "GMail Options" #~ msgstr "Настаўленні GMail" #, fuzzy #~ msgid "20" #~ msgstr "0" #, fuzzy #~ msgid "Invited %s to %s" #~ msgstr "Адправіць %s" #~ msgid "GMail Email Received" #~ msgstr "Новы ліст GMail" #, fuzzy #~ msgid "New e-mail on %(gmail_mail_address)s" #~ msgstr "Новая пошта на %(gmail_mail_address)s" #, fuzzy #~ msgid "You have %d new e-mail conversation" #~ msgid_plural "You have %d new e-mail conversations" #~ msgstr[0] "%d новы ліст" #~ msgstr[1] "%d новыя лісты" #~ msgstr[2] "%d новых лістоў" #~ msgid "Re_name" #~ msgstr "_Змяніць імя" #~ msgid "Resour_ce:" #~ msgstr "Рэ_сурс:" #~ msgid "" #~ "Resource is sent to the Jabber server in order to separate the same JID " #~ "in two or more parts depending on the number of the clients connected in " #~ "the same server with the same account. So you might be connected in the " #~ "same account with resource 'Home' and 'Work' at the same time. The " #~ "resource which has the highest priority will get the events. (see below)" #~ msgstr "" #~ "Назва рэсурса перадаецца серверу, каб той мог адрозніваць некалькі " #~ "праграмаў, злучаных праз адзін рахунак. Такім чынам, Вы можаце злучыцца " #~ "праз адзін рахунак і з рэсурса 'Дома', і з рэсурса 'Праца'. Падзеі будуць " #~ "накіроўвацца на рэсурс з найвышэйшым прыярытэтам. (гл. ніжэй)" #, fuzzy #~ msgid "A_djust to status" #~ msgstr "_Адпаведна стану" #~ msgid "Priority will change automatically according to your status." #~ msgstr "Прыярытэт будзе змяняцца згодна з станам." #, fuzzy #~ msgid "Anonymous authentication" #~ msgstr "Аўтарызацыя" #~ msgid "" #~ "Priority is used in Jabber to determine who gets the events from the " #~ "jabber server when two or more clients are connected using the same " #~ "account; The client with the highest priority gets the events" #~ msgstr "" #~ "Прыярытэт вызначае, куды накіроўваць падзеі, калі некалькі праграмаў " #~ "злучаныя з серверам праз адзін рахунак. Праграма з найвышэйшым " #~ "прыярытэтам атрымлівае гэтыя падзеі" #, fuzzy #~ msgid "Synchronize contacts" #~ msgstr "Паказаць _адлучаных людзей" #~ msgid "Chan_ge Password" #~ msgstr "З_мяніць пароль" #~ msgid "Click to change account's password" #~ msgstr "Пстрыкніце, каб змяніць пароль рахунка" #, fuzzy #~ msgid "Administration operations" #~ msgstr "Спіс адміністратараў" #, fuzzy #~ msgid "Browse..." #~ msgstr "_Праглядзець" #, fuzzy #~ msgid "Certificate is e_ncrypted" #~ msgstr "[Гэтае паведамленне зашыфраванае]" #~ msgid "" #~ "If checked, Gajim, when launched, will automatically connect to jabber " #~ "using this account" #~ msgstr "" #~ "Калі гэтая опцыя ўключаная, Gajim будзе аўтаматычна злучацца з дапамогай " #~ "гэтага рахунка" #, fuzzy #~ msgid "Synchronize logs with server" #~ msgstr "Паказаць _адлучаных людзей" #~ msgid "Synch_ronize account status with global status" #~ msgstr "С_інхранізаваць стан рахунка з глабальным станам" #~ msgid "" #~ "If checked, any change to the global status (handled by the combobox at " #~ "the bottom of the roster window) will change the status of this account " #~ "accordingly" #~ msgstr "" #~ "Калі гэтая опцыя ўключаная, любыя глабальныя змены стану (праз адмысловы " #~ "спіс унізе галоўнага вакна) будуць змяняць стан рахунка адпаведным чынам" #~ msgid "" #~ "If checked, Gajim will also broadcast some more IPs except from just your " #~ "IP, so file transfer has higher chances of working." #~ msgstr "" #~ "Калі гэтая опцыя ўключаная, Gajim зойме некаторыя іншыя адрасы IP, і " #~ "шанец правільнай перадачы файлаў падвысіцца." #, fuzzy #~ msgid "Proxy" #~ msgstr "Уласцівасці" #, fuzzy #~ msgid "Send _keep-alive packets" #~ msgstr "Адпраўляць праверачныя пакункі серверу" #~ msgid "" #~ "If checked, Gajim will send keep-alive packets to prevent connection " #~ "timeout which results in disconnection" #~ msgstr "" #~ "Калі гэтая опцыя ўключаная, Gajim адпраўляе адмысловыя інфармацыйныя " #~ "пакункі для запэўнівання сервера ў Вашым існаванні" #, fuzzy #~ msgid "Use cust_om hostname/port" #~ msgstr "Адмысловы вузел / порт" #, fuzzy #~ msgid "_Hostname: " #~ msgstr "Назва вузла: " #, fuzzy #~ msgid "_Port: " #~ msgstr "_Порт:" #~ msgid "No key selected" #~ msgstr "Ключ не выбраны" #~ msgid "Choose _Key..." #~ msgstr "Выберыце _ключ..." #, fuzzy #~ msgid "" #~ "If checked, Gajim will get the password from a GPG agent like seahorse" #~ msgstr "" #~ "Калі гэтая опцыя ўключаная, Gajim запомніць пароль для гэтага рахунка" #~ msgid "OpenPGP" #~ msgstr "OpenPGP" #, fuzzy #~ msgid "_Edit Personal Information..." #~ msgstr "Змяніць асабістыя звесткі..." #~ msgid "Information about you, as stored in the server" #~ msgstr "Звесткі аб Вас, якія захоўваюцца на серверы" #~ msgid "Personal Information" #~ msgstr "Асабістыя звесткі" #, fuzzy #~ msgid "Co_nnect on Gajim startup" #~ msgstr "_Злучацца па старце Gajim" #, fuzzy #~ msgid "Synchroni_ze account status with global status" #~ msgstr "С_інхранізаваць стан рахунка з глабальным станам" #, fuzzy #~ msgid "Use cust_om port:" #~ msgstr "Адмысловы порт:" #~ msgid "" #~ "If the default port that is used for incoming messages is unfitting for " #~ "your setup you can select another one here.\n" #~ "You might consider to change possible firewall settings." #~ msgstr "" #~ "Калі порт адпраўкі паведамленняў не прыдатны для Вас, выберыце іншы.\n" #~ "Вам можа спатрэбіцца таксама змяніць настаўленні фаервола." #~ msgid "Mer_ge accounts" #~ msgstr "_Аб'яднаць рахункі" #, fuzzy #~ msgid "OpenPGP is not usable on this computer" #~ msgstr "Немагчыма ўжыць OpenPGP на гэтым кампутары" #~ msgid "To change the account name, you must be disconnected." #~ msgstr "Каб змяніць назву рахунка, трэба папярэдне адлучыцца." #~ msgid "To change the account name, you must read all pending events." #~ msgstr "" #~ "Каб змяніць назву рахунка, Вы павінны праглядзець усе нягледжаныя падзеі." #~ msgid "Account Name Already Used" #~ msgstr "Назва рахунка ўжо скарыстаная" #~ msgid "" #~ "This name is already used by another of your accounts. Please choose " #~ "another name." #~ msgstr "" #~ "Гэтая назва ўжо скарыстаная для іншага рахунка. Выберыце іншую назву." #~ msgid "Invalid account name" #~ msgstr "Няправільная назва рахунка" #~ msgid "Account name cannot be empty." #~ msgstr "Назва рахунка не павінна быць пустой." #~ msgid "Account name cannot contain spaces." #~ msgstr "Назва рахунка не павінна ўтрымліваць прагалаў." #, fuzzy #~ msgid "Enter a new name for account %s" #~ msgstr "Вызначце новую назву групы %s" #, fuzzy #~ msgid "A JID must be in the form \"user@servername\"." #~ msgstr "Jabber ID павінны мець форму \"user@servername\"." #~ msgid "No such account available" #~ msgstr "Такога рахунка няма" #~ msgid "" #~ "You must create your account before editing your personal information." #~ msgstr "Вы павінны стварыць рахунак да рэдагавання асабістых звестак." #~ msgid "Without a connection, you can not edit your personal information." #~ msgstr "Немагчыма рэдагаваць асабістыя звесткі ў адлучаным рэжыме." #, fuzzy #~ msgid "Your server does not have vCard support" #~ msgstr "Ваш сервер не падтрымлівае Vcard" #~ msgid "Your server can't save your personal information." #~ msgstr "Сервер не можа захаваць Вашыя асабістыя звесткі." #~ msgid "Account Local already exists." #~ msgstr "Мясцовы рахунак Local ужо існуе." #~ msgid "Please rename or remove it before enabling link-local messaging." #~ msgstr "" #~ "Змяніце назву альбо выдаліце яго, каб скарыстаць мясцовыя паведамленні." #~ msgid "THANKS:" #~ msgstr "Падзякі:" #~ msgid "Could not write to %s. Session Management support will not work" #~ msgstr "Немагчыма запісаць у %s. Сеансы не працуюць" #~ msgid "Jabber Traffic" #~ msgstr "Трафік Jabber" #, fuzzy #~ msgid "_Enable" #~ msgstr "Уключыць" #, fuzzy #~ msgid "Filter" #~ msgstr "Гукі" #~ msgid "_IQ" #~ msgstr "_IQ" #~ msgid "Info/Query" #~ msgstr "Звесткі/Запыт" #~ msgid "_Message" #~ msgstr "_Паведамленне" #~ msgid "XML Input" #~ msgstr "Увод XML" #~ msgid "XML Console for %s" #~ msgstr "Кансоль XML для %s" #, fuzzy #~ msgid "Idle for:" #~ msgstr "Кансоль XML для %s" #~ msgid "Last status: %s" #~ msgstr "Апошняе паведамленне: %s" #~ msgid " since %s" #~ msgstr " ад %s" #~ msgid "since %s" #~ msgstr "ад %s" #, fuzzy #~ msgid "No" #~ msgstr "Ніякі" #, fuzzy #~ msgid "Prefer" #~ msgstr "Уласцівасці" #, fuzzy #~ msgid "Auto" #~ msgstr "Аўтаматычна далучацца" #, fuzzy #~ msgid "otr" #~ msgstr "_Вузел:" #, fuzzy #~ msgid "Invalid expire value" #~ msgstr "Няправільнае імя карыстальніка" #~ msgid "How many minutes should last lines from previous conversation last." #~ msgstr "Колькі хвілінаў апошняй размовы паказваць у новых размовах." #~ msgid "You will be connected to %s without OpenPGP." #~ msgstr "Вы злучыцеся з %s без падтрымкі OpenPGP." #, fuzzy #~ msgid "The following message was NOT encrypted" #~ msgstr "[Гэтае паведамленне зашыфраванае]" #, fuzzy #~ msgid "Encryption used for this contact." #~ msgstr "Ці ўжыты OpenPGP ў размове з гэтым чалавекам?" #~ msgid "Toggle Open_PGP Encryption" #~ msgstr "Пераключыць шыфраванне Open_PGP" #, fuzzy #~ msgid "Toggle End to End Encryption" #~ msgstr "Пераключыць шыфраванне Open_PGP" #, fuzzy #~ msgid "OpenPGP encryption enabled" #~ msgstr "Шыфраванне дзейнічае" #, fuzzy #~ msgid "OpenPGP encryption disabled" #~ msgstr "Шыфраванне адключанае" #, fuzzy #~ msgid "The following message was encrypted" #~ msgstr "[Гэтае паведамленне зашыфраванае]" #, fuzzy #~ msgid "Toggle the OpenPGP encryption" #~ msgstr "Пераключыць шыфраванне Open_PGP" #, fuzzy #~ msgid "[This message is *encrypted* (See :XEP:`27`]" #~ msgstr "[Гэтае паведамленне *зашыфраванае* (Гл.:JEP:`27`]" #~ msgid "" #~ "If True, listen to D-Bus signals from NetworkManager and change the " #~ "status of accounts (provided they do not have listen_to_network_manager " #~ "set to False and they sync with global status) based upon the status of " #~ "the network connection." #~ msgstr "" #~ "Калі true, чакаць сігналаў D-Bus ад NetworkManager і змяняць стан " #~ "рахункаў (для якіх опцыя listen_to_network_manager не выстаўленая ў False " #~ "і якія сінхранізуюцца з глабальным станам) згодна з станам сеткавага " #~ "злучэння." #, fuzzy #~ msgid "Database cannot be read." #~ msgstr "Назва рахунка не павінна быць пустой." #, fuzzy #~ msgid "Smooth scroll message in conversation window" #~ msgstr "Адправіць паведамленне і закрыць вакно" #~ msgid "Show _XML Console" #~ msgstr "Паказаць _кансоль XML" #, fuzzy #~ msgid "Edit _Privacy Lists..." #~ msgstr "_Спісы прыватнасці" #~ msgid "_Administrator" #~ msgstr "_Адміністратар" #~ msgid "Sends a message to users currently connected to this server" #~ msgstr "Адправіць паведамленне ўсім далучаным людзям з гэтага сервера" #~ msgid "Sets Message of the Day" #~ msgstr "Вызначыць паведамленне дня" #~ msgid "Updates Message of the Day" #~ msgstr "Абнавіць паведамленне дня" #~ msgid "Deletes Message of the Day" #~ msgstr "Выдаліць паведамленне дня" #, fuzzy #~ msgid "Add _Contact..." #~ msgstr "_Дадаць чалавека..." #, fuzzy #~ msgid "_Accounts" #~ msgstr "Рахункі" #~ msgid "Profile, A_vatar" #~ msgstr "Профіль, а_ватар" #~ msgid "File _Transfers" #~ msgstr "Перадача _файлаў" #~ msgid "Help online" #~ msgstr "Дапамога ў Сеціве" #~ msgid "Frequently Asked Questions (online)" #~ msgstr "Частыя пытанні (у Сеціве)" #, fuzzy #~ msgid "Fea_tures" #~ msgstr "Здольнасці сервера" #~ msgid "to %s account" #~ msgstr "рахунку %s" #~ msgid "using %s account" #~ msgstr "выкарыстоўвае рахунак %s" #~ msgid "of account %s" #~ msgstr "рахунка %s" #~ msgid "for account %s" #~ msgstr "для рахунка %s" #~ msgid "" #~ "By removing this contact you also remove authorization resulting in him " #~ "or her always seeing you as offline." #~ msgstr "" #~ "Выдаліўшы гэтага чалавека з Вашага кантактнага ліста, Вы такім чынам " #~ "таксама прыбярэце ў яго аўтарызацыю, і ён заўсёды будзе бачыць Вас " #~ "адлучаным." #~ msgid "Invalid Jabber ID" #~ msgstr "Няправільны Jabber ID" #~ msgid "This file is being used by another process." #~ msgstr "Гэтым файлам карыстаецца іншы працэс." #~ msgid "pgp key" #~ msgstr "ключ pgp" #~ msgid "" #~ "Sends new single message to a contact in the roster. Both OpenPGP key and " #~ "account are optional. If you want to set only 'account', without 'OpenPGP " #~ "key', just set 'OpenPGP key' to ''." #~ msgstr "" #~ "Адпраўляе новае асобнае паведамленне чалавеку з спіса. Выстаўленне ключа " #~ "OpenPGP і рахунка не абавязковае. Калі Вы хочаце вызначыць толькі " #~ "'account', без 'ключа OpenPGP', проста выставіце 'ключ OpenPGP' у ''." #, fuzzy #~ msgid "Please first choose another theme as your current theme." #~ msgstr "Спачатку актывізуйце іншую тэму." #~ msgid "Your passphrase is incorrect" #~ msgstr "Пароль няправільны" #, fuzzy #~ msgid "OpenPGP Passphrase Incorrect" #~ msgstr "Пароль няправільны" #~ msgid "You successfully received %(filename)s from %(name)s." #~ msgstr "Файл %(filename)s паспяхова атрыманы ад %(name)s." #, fuzzy #~ msgid "Set logs directory" #~ msgstr "стварэнне дырэкторыі %s" #~ msgid "Chats" #~ msgstr "Размовы" #~ msgid "_Manage Bookmarks..." #~ msgstr "_Кіраванне закладкамі..." #~ msgid "Change Status Message..." #~ msgstr "Змяніць паведамленне стану..." #~ msgid "_Change Status Message..." #~ msgstr "_Змяніць паведамленне стану..." #~ msgid "" #~ "You are not interested in the contact's presence, and neither he/she is " #~ "interested in yours" #~ msgstr "Вы не цікавіцеся чалавекам, і ён не цікавіцца Вамі" #~ msgid "Error description..." #~ msgstr "Апісанне памылкі..." #, fuzzy #~ msgid "View contact information (Ctrl+I)" #~ msgstr "сочыць за размовай" #, fuzzy #~ msgid "Groupchat Histories" #~ msgstr "Групавыя размовы" #, fuzzy #~ msgid "All Chat Histories" #~ msgstr "Старыя казкі" #~ msgid "More" #~ msgstr "Яшчэ" #~ msgid "creating %s directory" #~ msgstr "стварэнне дырэкторыі %s" #, fuzzy #~ msgid "" #~ "If True, Gajim will use KDE Wallet (if kwalletcli is available) to store " #~ "account passwords." #~ msgstr "" #~ "Калі true, Gajim будзе захоўваць паролі ад рахункаў з дапамогай кіраўніка " #~ "пароляў Gnome Keyring (калі ўсталяваны)." #, fuzzy #~ msgid "Please check if avahi/bonjour-daemon is running." #~ msgstr "Праверце, ці працуе avahi-daemon." #~ msgid "%s is not the name of a group chat." #~ msgstr "%s не з'яўляецца сапраўднай назвай групавой размовы." #, fuzzy #~ msgid "Session Management" #~ msgstr "Паведамленне адпраўленае" #~ msgid "Gajim needs X server to run. Quiting..." #~ msgstr "Gajim патрабуе запуску сервера X. Выхад..." #, fuzzy #~ msgid "Gajim needs PyGTK 2.22 or above" #~ msgstr "Gajim патрабуе PyGTK 2.6 альбо вышэйшай версіі" #, fuzzy #~ msgid "Gajim needs PyGTK 2.22 or above to run. Quiting..." #~ msgstr "" #~ "Gajim патрабуе PyGTK 2.6 альбо вышэйшай версіі для запуску. Выхад..." #, fuzzy #~ msgid "Gajim needs GTK 2.22 or above" #~ msgstr "Gajim патрабуе GTK 2.6 альбо вышэйшай версіі" #, fuzzy #~ msgid "Gajim needs GTK 2.22 or above to run. Quiting..." #~ msgstr "Gajim патрабуе GTK 2.6 альбо вышэйшай версіі для запуску. Выхад..." #~ msgid "Gajim needs pywin32 to run" #~ msgstr "Gajim патрабуе pywin32 для запуску" #~ msgid "" #~ "Please make sure that Pywin32 is installed on your system. You can get it " #~ "at %s" #~ msgstr "Праверце, ці ўсталяваны Pywin32. Вы можаце сцягнуць яго з %s" #~ msgid "Gajim is already running" #~ msgstr "Gajim ужо працуе" #~ msgid "" #~ "Another instance of Gajim seems to be running\n" #~ "Run anyway?" #~ msgstr "" #~ "Gajim ужо працуе\n" #~ "Усё роўна запусціць наноў?" #~ msgid "A programming error has been detected" #~ msgstr "Знойдзеная памылка праграмнага коду" #~ msgid "Details" #~ msgstr "Падрабязнасці" #, fuzzy #~ msgid "" #~ "Gnome Keyring is installed but not correctly started (environment " #~ "variable probably not correctly set)" #~ msgstr "" #~ "Кіраўнік пароляў Gnomekeyring усталяваны, але няправільна выконваецца " #~ "(магчыма, зменная асяроддзя выстаўленая няправільна)" #~ msgid "Jabber ID: " #~ msgstr "Jabber ID:" #~ msgid "Resource: " #~ msgstr "Рэсурс: " #~ msgid "Subscription: " #~ msgstr "Падпіска: " #, fuzzy #~ msgid "Mood: " #~ msgstr "Пакой:" #, fuzzy #~ msgid "Activity: " #~ msgstr "Актывізаваны" #, fuzzy #~ msgid "Join _Group Chat..." #~ msgstr "Удзельнічаць у _групавой размове" #, fuzzy #~ msgid "_Modify Account" #~ msgstr "Змяніць рахунак" #, fuzzy #~ msgid "Check on startup if Gajim is the _default Jabber client" #~ msgstr "" #~ "Заўсёды пры запуску спраўджваць, ці з'яўляецца Gajim _прадвызначанай " #~ "Jabber-праграмай" #~ msgid "_Group Chat" #~ msgstr "_Групавая размова" #~ msgid "" #~ "If True, Gajim will check if it's the default jabber client on each " #~ "startup." #~ msgstr "" #~ "Калі true, Gajim будзе пры запуску спраўджваць, ці з'яўляецца ён " #~ "прадвызначанай Jabber-праграмай." #~ msgid "Gajim is not the default Jabber client" #~ msgstr "Gajim не з'яўляецца прадвызначанай Jabber-праграмай" #~ msgid "Would you like to make Gajim the default Jabber client?" #~ msgstr "Ці Вы хочаце зрабіць Gajim прадвызначанай Jabber-праграмай?" #~ msgid "Always check to see if Gajim is the default Jabber client on startup" #~ msgstr "" #~ "Заўсёды пры запуску спраўджваць, ці з'яўляецца Gajim прадвызначанай " #~ "Jabber-праграмай" #, fuzzy #~ msgid "Send Single Message" #~ msgstr "Ад_правіць асобнае паведамленне" #~ msgid "Execute Command..." #~ msgstr "Выканаць загад..." #~ msgid " a window/tab opened with that contact " #~ msgstr " вакно / картка размовы з гэтым чалавекам адкрыта " #~ msgid "Actions" #~ msgstr "Дзеянні" #~ msgid "Conditions" #~ msgstr "Умовы" #~ msgid "Advanced Actions" #~ msgstr "Адмысловыя дзеянні" #~ msgid "Advanced Notifications Control" #~ msgstr "Адмысловыя настаўленні нагадванняў" #~ msgid "Busy " #~ msgstr "Заняты" #, fuzzy #~ msgid "Contact Change Status " #~ msgstr "Чалавек змяніў стан" #, fuzzy #~ msgid "Contact Disconnected " #~ msgstr "Чалавек адлучыўся" #~ msgid "Don't have " #~ msgstr "Няма " #, fuzzy #~ msgid "File Transfer Started " #~ msgstr "Перадача файла спыненая" #, fuzzy #~ msgid "Group Chat Message Highlight " #~ msgstr "Фарбаванае паведамленне ў групавой размове" #, fuzzy #~ msgid "Group Chat Message Received " #~ msgstr "Новае паведамленне ў групавой размове" #~ msgid "Launch a command" #~ msgstr "Выканаць загад" #~ msgid "One or more special statuses..." #~ msgstr "Некалькі спецыяльных станаў..." #~ msgid "Online / Free For Chat" #~ msgstr "У сетцы / Вольны для размовы" #~ msgid "Play a sound" #~ msgstr "Граць гук" #~ msgid "When " #~ msgstr "Калі " #~ msgid "" #~ "_Activate window manager's UrgencyHint to make chat window in taskbar " #~ "flash" #~ msgstr "" #~ "_Скарыстаць здольнасць UrgencyHint, каб вакно размовы міргала на панэлі " #~ "заданняў" #~ msgid "_Disable auto opening chat window" #~ msgstr "_Не адкрываць аўтаматычна вокны размовы" #~ msgid "_Disable existing popup window" #~ msgstr "_Адключыць выплыўнае вакно" #~ msgid "_Disable existing sound for this event" #~ msgstr "_Адключыць гук для гэтай падзеі" #, fuzzy #~ msgid "_Disable showing event in notification area" #~ msgstr "_Не паказваць падзею ў галоўным вакне" #~ msgid "_Disable showing event in roster" #~ msgstr "_Не паказваць падзею ў галоўным вакне" #~ msgid "_Inform me with a popup window" #~ msgstr "_Паведаміць у выплыўным вакне" #~ msgid "_Open chat window with user" #~ msgstr "_Адкрыць вакно размовы з карыстальнікам" #~ msgid "_Show event in roster" #~ msgstr "_Паказваць падзею ў галоўным вакне" #~ msgid "and I " #~ msgstr "і я " #, fuzzy #~ msgid "contact(s)" #~ msgstr "Людзі" #~ msgid "for " #~ msgstr "для " #, fuzzy #~ msgid "group(s)" #~ msgstr "Група" #~ msgid "when I'm in" #~ msgstr "калі я ў" #~ msgid "_Allow him/her to see my status" #~ msgstr "Дазволіць чалавеку _бачыць змены майго стану" #, fuzzy #~ msgid "Descrition:" #~ msgstr "Апісанне: %s" #, fuzzy #~ msgid "Advanced..." #~ msgstr "Адмысловы" #, fuzzy #~ msgid "Display _activity of contacts in roster" #~ msgstr "Паказваць _малюнкі ў галоўным вакне" #, fuzzy #~ msgid "Display _tunes of contacts in roster" #~ msgstr "Паказваць _малюнкі ў галоўным вакне" #, fuzzy #~ msgid "Display m_ood of contacts in roster" #~ msgstr "Паказваць _малюнкі ў галоўным вакне" #, fuzzy #~ msgid "" #~ "If checked, Gajim will display the activity of contacts in the roster " #~ "window" #~ msgstr "" #~ "Калі гэтая опцыя ўключаная, Gajim паказвае аватары ў галоўным вакне і ў " #~ "групавых размовах" #, fuzzy #~ msgid "" #~ "If checked, Gajim will display the location of contacts in the roster " #~ "window" #~ msgstr "" #~ "Калі гэтая опцыя ўключаная, Gajim паказвае аватары ў галоўным вакне і ў " #~ "групавых размовах" #, fuzzy #~ msgid "" #~ "If checked, Gajim will display the tunes of contacts in the roster window" #~ msgstr "" #~ "Калі гэтая опцыя ўключаная, Gajim паказвае аватары ў галоўным вакне і ў " #~ "групавых размовах" #, fuzzy #~ msgid "User avatar:" #~ msgstr "Аватар:" #~ msgid "Gajim Instant Messenger" #~ msgstr "Імгненны паведамляльнік Gajim" #~ msgid "English" #~ msgstr "Ангельская" #~ msgid "Belarusian" #~ msgstr "Беларуская" #~ msgid "Bulgarian" #~ msgstr "Балгарская" #, fuzzy #~ msgid "Breton" #~ msgstr "Брытонская" #~ msgid "Czech" #~ msgstr "Чэшская" #~ msgid "German" #~ msgstr "Нямецкая" #~ msgid "Greek" #~ msgstr "Грэцкая" #~ msgid "British" #~ msgstr "Брытанская" #~ msgid "Esperanto" #~ msgstr "Эсперанта" #~ msgid "Spanish" #~ msgstr "Іспанская" #, fuzzy #~ msgid "Basque" #~ msgstr "Басцкая" #~ msgid "French" #~ msgstr "Французская" #~ msgid "Croatian" #~ msgstr "Харвацкая" #~ msgid "Italian" #~ msgstr "Італійская" #~ msgid "Norwegian (b)" #~ msgstr "Нарвежская (бокмал)" #~ msgid "Dutch" #~ msgstr "Галандская" #~ msgid "Norwegian" #~ msgstr "Нарвежская" #~ msgid "Polish" #~ msgstr "Польская" #~ msgid "Portuguese" #~ msgstr "Партугальская" #~ msgid "Brazilian Portuguese" #~ msgstr "Бразільская партугальская" #~ msgid "Russian" #~ msgstr "Расейская" #, fuzzy #~ msgid "Serbian" #~ msgstr "Нямецкая" #~ msgid "Slovak" #~ msgstr "Славацкая" #~ msgid "Swedish" #~ msgstr "Шведская" #~ msgid "Chinese (Ch)" #~ msgstr "Кітайская (Ch)" #~ msgid "Spelling language" #~ msgstr "Мова правапісу" #~ msgid "all or space separated status" #~ msgstr "усе ці падзеленыя прагаламі станы" #~ msgid "'yes', 'no', or 'both'" #~ msgstr "'yes', 'no' ці 'both'" #~ msgid "'yes', 'no' or ''" #~ msgstr "'yes', 'no' ці ''" #~ msgid "Check your connection or try again later" #~ msgstr "Праверце злучэнне альбо паспрабуйце пазней" #~ msgid "error: cannot open %s for reading" #~ msgstr "памылка: немагчыма прачытаць %s" #~ msgid "Unable to bind to port %s." #~ msgstr "Немагчыма адкрыць порт %s." #~ msgid "" #~ "Maybe you have another running instance of Gajim. File Transfer will be " #~ "cancelled." #~ msgstr "Магчыма, Gajim ужо працуе. Перадача файлаў скасаваная." #~ msgid "A GTK+ jabber client" #~ msgstr "Jabber-праграма для GTK+" #~ msgid "Condition" #~ msgstr "Умова" #~ msgid "when I am " #~ msgstr "калі я " #, fuzzy #~ msgid "one of: offline, online, chat, away, xa, dnd, invisible " #~ msgstr "адзін з: offline, online, chat, away, xa, dnd, invisible " #, fuzzy #~ msgid "" #~ "Returns current status message(the global one unless account is specified)" #~ msgstr "" #~ "Вяртае бягучае паведамленне аб стане (глабальнае, калі не вызначаны " #~ "рахунак)" #~ msgid "" #~ "Usage: %s %s %s \n" #~ "\t %s" #~ msgstr "" #~ "Карыстанне: %s %s %s \n" #~ "\t %s" #, fuzzy #~ msgid "" #~ "Too many arguments. \n" #~ "Type \"%s help %s\" for more info" #~ msgstr "" #~ "Надта шмат аргументаў. \n" #~ "Увядзіце \"%s help %s\" для падрабязнейшых звестак" #, fuzzy #~ msgid "" #~ "Argument \"%s\" is not specified. \n" #~ "Type \"%s help %s\" for more info" #~ msgstr "" #~ "Аргумент \"%s\" не вызначаны. \n" #~ "Увядзіце \"%s help %s\" для падрабязных звестак" #~ msgid "Subject: %s" #~ msgstr "Тэма: %s" #, fuzzy #~ msgid "Mood: %s" #~ msgstr "Пакой:" #, fuzzy #~ msgid "Activity: %s" #~ msgstr "Актывізаваны" #~ msgid "_Disable showing event in systray" #~ msgstr "_Не паказваць падзею ў прасторы паведамленняў" #~ msgid "_Show event in systray" #~ msgstr "_Паказваць падзею ў прасторы паведамленняў" #, fuzzy #~ msgid "Autodetect on every Gajim startup" #~ msgstr "_Злучацца па старце Gajim" #, fuzzy #~ msgid "Show systray:" #~ msgstr "_Паказваць падзею ў прасторы паведамленняў" #~ msgid "Nickname not allowed: %s" #~ msgstr "Такая мянушка не дазволеная: %s" #~ msgid "we are now subscribed to %s" #~ msgstr "цяпер падпісаны на %s" #~ msgid "we are now unsubscribed from %s" #~ msgstr "цяпер адпісаны ад %s" #~ msgid "Account Modification" #~ msgstr "Змяненне рахунка" #~ msgid "" #~ "Check this so Gajim will connect in port 5223 where legacy servers are " #~ "expected to have SSL capabilities. Note that Gajim uses TLS encryption by " #~ "default if broadcasted by the server, and with this option enabled TLS " #~ "will be disabled" #~ msgstr "" #~ "Скарыстайце гэтую опцыю, калі хочаце, каб Gajim злучаўся з серверам праз " #~ "порт 5223, праз які старыя серверы даюць мажлівасць выкарыстання SSL. " #~ "Зважайце, што Gajim звычайна выкарыстоўвае шыфраванне TLS, калі " #~ "звяртаецца да сервера, а гэтая опцыя адключыць выкарыстанне TLS" #~ msgid "Edit Personal Information..." #~ msgstr "Змяніць асабістыя звесткі..." #~ msgid "Hostname: " #~ msgstr "Назва вузла: " #~ msgid "" #~ "If checked, Gajim will store the password in ~/.gajim/config with 'read' " #~ "permission only for you" #~ msgstr "" #~ "Калі гэтая опцыя ўключаная, Gajim будзе захоўваць пароль у файле ~/.gajim/" #~ "config з правамі чытання толькі для Вас" #~ msgid "Port: " #~ msgstr "Порт: " #~ msgid "Save _passphrase (insecure)" #~ msgstr "Захоўваць _пароль (небяспечна)" #~ msgid "Use _SSL (legacy)" #~ msgstr "Ужыць _SSL (састарэлая опцыя)" #~ msgid "" #~ "Receive a Message\n" #~ "Contact Disconnected \n" #~ "Contact Change Status \n" #~ "Group Chat Message Highlight \n" #~ "Group Chat Message Received \n" #~ "File Transfer Request \n" #~ "File Transfer Started \n" #~ "File Transfer Finished" #~ msgstr "" #~ "Атрыманае паведамленне\n" #~ "Чалавек адлучыўся \n" #~ "Чалавек змяніў стан \n" #~ "Фарбаванае паведамленне групавой размовы \n" #~ "Атрыманае групавое паведамленне \n" #~ "Запыт на перадачу файла \n" #~ "Перадача файла пачалася \n" #~ "Перадача файла скончаная" #~ msgid "" #~ "contact(s)\n" #~ "group(s)\n" #~ "everybody" #~ msgstr "" #~ "людзі\n" #~ "групы\n" #~ "усе" #~ msgid "" #~ "Account row\n" #~ "Group row\n" #~ "Contact row\n" #~ "Chat Banner" #~ msgstr "" #~ "Шэраг рахункаў\n" #~ "Шэраг групаў\n" #~ "Шэраг людзей\n" #~ "Банер размовы" #, fuzzy #~ msgid "gtk-delete" #~ msgstr "Выдаліць" #~ msgid "" #~ "All chat states\n" #~ "Composing only\n" #~ "Disabled" #~ msgstr "" #~ "Усе станы\n" #~ "Толькі пісанне\n" #~ "Адключана" #, fuzzy #~ msgid "" #~ "Autodetect on every Gajim startup\n" #~ "Always use GNOME default applications\n" #~ "Always use KDE default applications\n" #~ "Always use Xfce default applications\n" #~ "Custom" #~ msgstr "" #~ "Аўтаматычна вызначаць пры кожным запуску Gajim\n" #~ "Заўсёды карыстацца праграмамі, прызначанымі ў GNOME\n" #~ "Заўсёды карыстацца праграмамі, прызначанымі ў KDE\n" #~ "Адмысловы" #~ msgid "" #~ "none\n" #~ "both\n" #~ "from\n" #~ "to" #~ msgstr "" #~ "ніводны\n" #~ "абодва\n" #~ "ад\n" #~ "каму" #, fuzzy #~ msgid "gtk-cancel" #~ msgstr "Выдаліць" #~ msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." #~ msgstr "" #~ "Залежнасць ад pysqlite2 (aka python-pysqlite2) не выкананая. Выхад..." #~ msgid "GTK+ runtime is missing libglade support" #~ msgstr "GTK+ не падтрымлівае libglade" #~ msgid "" #~ "Please remove your current GTK+ runtime and install the latest stable " #~ "version from %s" #~ msgstr "" #~ "Выдаліце бібліятэку GTK+ і ўсталюйце найноўшую стабільную версію з %s" #~ msgid "" #~ "Please make sure that GTK+ and PyGTK have libglade support in your system." #~ msgstr "" #~ "Праверце, ці падтрымліваюць бібліятэкі GTK+ і PyGTK сродкі libglade." #~ msgid "Gajim needs PySQLite2 to run" #~ msgstr "Gajim патрабуе PySQLite2 для запуску" #~ msgid "_Incoming message:" #~ msgstr "_Уваходнае паведамленне:" #~ msgid "_Outgoing message:" #~ msgstr "_Выходнае паведамленне:" #, fuzzy #~ msgid "gtk-ok" #~ msgstr "gtk+" #, fuzzy #~ msgid "" #~ "The host %s you configured as the ft_add_hosts_to_send advanced option is " #~ "not valid, so ignored." #~ msgstr "" #~ "Вузел, вызначаны опцыяй ft_override_host_to_send, некарэктны, таму " #~ "ігнаруецца." #~ msgid "OpenPGP passphrase was not given" #~ msgstr "Пароль OpenPGP не вызначаны" #~ msgid "" #~ "To continue sending and receiving messages, you will need to reconnect." #~ msgstr "" #~ "Каб працягваць адпраўку і атрыманне паведамленняў, трэба перадалучыцца." #~ msgid "" #~ "You are not connected or not visible to others. Your message could not be " #~ "sent." #~ msgstr "" #~ "Вы не злучаны альбо не бачны для іншых. Вы не можаце адправіць " #~ "паведамленне." #~ msgid "%i days ago" #~ msgstr "%i дзён таму" #~ msgid "Add Special _Notification" #~ msgstr "Дадаць спецыяльнае _нагадванне" #~ msgid "Assign Open_PGP Key" #~ msgstr "Прызначыць ключ Open_PGP" #~ msgid "Commands: %s" #~ msgstr "Загады: %s" #, fuzzy #~ msgid "" #~ "Usage: /%(command)s , sends action to the current group chat. Use " #~ "third person. (e.g. /%(command)s explodes.)" #~ msgstr "" #~ "Карыстанне: /%s <дзеянне>, выконвае дзеянне ў групавой размове (ад трэцяй " #~ "асобы). (напр., /%s рагоча як конь.)" #~ msgid "No help info for /%s" #~ msgstr "Даведка па /%s адсутнічае" #~ msgid "Enable link-local/zeroconf messaging" #~ msgstr "Дазволіць мясцовыя паведамленні" #~ msgid "Nickname not found: %s" #~ msgstr "Мянушка не знойдзеная: %s" #~ msgid "This group chat has no subject" #~ msgstr "Для гэтай групавой размовы не вызначаная тэма размовы" #, fuzzy #~ msgid "" #~ "Usage: /%s [reason], bans the JID from the group chat. The " #~ "nickname of an occupant may be substituted, but not if it contains \"@\". " #~ "If the JID is currently in the group chat, he/she/it will also be kicked." #~ msgstr "" #~ "Карыстанне: /%s <мянушка|JID> [прычына], забараняе JID-у казанне для " #~ "гэтай групавой размовы. Мянушку парушальніка можна змясціць тут, калі яна " #~ "не ўтрымлівае знака \"@\". Калі JID яшчэ ўдзельнічае ў групавой размове, " #~ "ён таксама будзе выкінуты адтуль. Прагалы ў мянушках не падтрымліваюцца." #~ msgid "" #~ "Usage: /%s [reason], closes the current window or tab, displaying reason " #~ "if specified." #~ msgstr "" #~ "Карыстанне: /%s [прычына], закрывае вакно / картку, паказаўшы вызначаную " #~ "прычыну." #~ msgid "" #~ "Usage: /%s [reason], invites JID to the current group chat, " #~ "optionally providing a reason." #~ msgstr "" #~ "Карыстанне: /%s [прычына], запрашае JID паўдзельнічаць у гэтай " #~ "групавой размове, з пазначанай прычынай запрашэння." #~ msgid "" #~ "Usage: /%s @[/nickname], offers to join room@server " #~ "optionally using specified nickname." #~ msgstr "" #~ "Карыстанне: /%s <пакой>@<сервер>[/мянушка], увайсці ў пакой room@server з " #~ "вызначанай мянушкай." #, fuzzy #~ msgid "" #~ "Usage: /%s [reason], removes the occupant specified by " #~ "nickname from the group chat and optionally displays a reason." #~ msgstr "" #~ "Карыстанне: /%s <мянушка> [прычына], выкідае парушальніка з вызначанай " #~ "мянушкай з групавой размовы з паказанай прычынай. Прагалы ў мянушках не " #~ "падтрымліваюцца." #~ msgid "" #~ "Usage: /%s [message], opens a private message window and sends " #~ "message to the occupant specified by nickname." #~ msgstr "" #~ "Карыстанне: /%s <мянушка> [паведамленне], адкрывае вакно прыватнай " #~ "размовы і адпраўляе паведамленне чалавеку." #~ msgid "Usage: /%s , changes your nickname in current group chat." #~ msgstr "" #~ "Карыстанне: /%s <мянушка>, змяняе Вашую мянушку ў гэтай групавой размове." #~ msgid "" #~ "Usage: /%s [topic], displays or updates the current group chat topic." #~ msgstr "Карыстанне: /%s [тэма], паказвае ці змяняе тэму групавой размовы." #~ msgid "" #~ "Usage: /%s , sends a message without looking for other commands." #~ msgstr "" #~ "Карыстанне: /%s <паведамленне>, адпраўляе паведамленне, не шукаючы іншых " #~ "загадаў." #, fuzzy #~ msgid "" #~ "Usage: /%s , allow to send you messages and private " #~ "messages." #~ msgstr "" #~ "Карыстанне: /%s <мянушка>, змяняе Вашую мянушку ў гэтай групавой размове." #~ msgid "Click to see features (like MSN, ICQ transports) of jabber servers" #~ msgstr "" #~ "Пстрыкніце, каб праглядзець спіс здольнасцяў jabber-сервераў (напр., " #~ "транспарты MSN, ICQ)" #~ msgid "Name:" #~ msgstr "Імя:" #~ msgid "_Host:" #~ msgstr "_Вузел:" #~ msgid "Modify Account" #~ msgstr "Змяніць рахунак" #, fuzzy #~ msgid "" #~ "%(title)s by %(artist)s\n" #~ "from %(source)s" #~ msgstr "\"%(title)s\" выконвае %(artist)s" #~ msgid "Gajim account %s" #~ msgstr "Рахунак Gajim %s" #~ msgid "This account is already configured in Gajim." #~ msgstr "Гэты рахунак ужо выкарыстоўваецца ў Gajim." #, fuzzy #~ msgid "Idle" #~ msgstr "Id" #~ msgid "File transfer stopped by the contact at the other end" #~ msgstr "Перадача файла спыненая чалавекам" #, fuzzy #~ msgid "Generic" #~ msgstr "Агульная" #, fuzzy #~ msgid "Activity" #~ msgstr "Актыўны" #~ msgid "%s has not broadcast an OpenPGP key, nor has one been assigned" #~ msgstr "%s не распаўсюджвае ключ OpenPGP і не мае прызначанага ключа" #~ msgid "No such command: /%s (if you want to send this, prefix it with /say)" #~ msgstr "" #~ "Такога загаду няма: /%s (калі Вы хочаце адправіць яго, устаўце перад " #~ "тэкстам \"/say\")" #~ msgid "" #~ "Usage: /%s , sends action to the current group chat. Use third " #~ "person. (e.g. /%s explodes.)" #~ msgstr "" #~ "Карыстанне: /%s <дзеянне>, выконвае дзеянне ў групавой размове (ад трэцяй " #~ "асобы). (напр., /%s рагоча як конь.)" #~ msgid "_Retype Password:" #~ msgstr "Паўта_рыце пароль:" #~ msgid "" #~ "If checked, all local contacts that use a Bonjour compatible chat client " #~ "(like iChat, Trillian or Gaim) will be shown in roster. You don't need to " #~ "be connected to a jabber server for it to work.\n" #~ "This is only available if python-avahi is installed and avahi-daemon is " #~ "running." #~ msgstr "" #~ "Калі гэтая опцыя ўключаная, усе мясцовыя кантакты з Bonjour-кліентам " #~ "(напр., iChat, Trillian, Gaim) будуць паказвацца ў галоўным вакне. Для " #~ "гэтага Вам не патрэбнае злучэнне.\n" #~ "Гэтая мажлівасць будзе працаваць, калі ўсталяваны python-avahi і працуе " #~ "сервіс avahi-daemon." #~ msgid "" #~ "If you have 2 or more accounts and this is checked, Gajim will list all " #~ "contacts as if you had one account" #~ msgstr "" #~ "Калі ў Вас некалькі рахункаў, гэтая опцыя прымушае Gajim паказваць усіх " #~ "людзей з розных рахункаў у адзіным спісе" #~ msgid "_Enable link-local messaging" #~ msgstr "_Уключыць мясцовыя паведамленні" #~ msgid "2003-12-13T18:30:02Z" #~ msgstr "2003-12-13T18:30:02Z" #~ msgid "Romeo and Juliet" #~ msgstr "Рамэа і Джульета" #~ msgid "Soliloquy" #~ msgstr "Маналог" #~ msgid "_Compact View Alt+C" #~ msgstr "_Кампактны выгляд Alt+К" #~ msgid "Click to see past conversation in this room" #~ msgstr "Пстрыкніце, каб праглядзець былую размову ў гэтым пакоі" #~ msgid "Build custom query" #~ msgstr "Стварыць адмысловы запыт" #~ msgid "Query Builder..." #~ msgstr "Стварэнне запыту..." #~ msgid "Invitation Received" #~ msgstr "Атрыманае запрашэнне" #~ msgid "Format of a line" #~ msgstr "Фармат радка" #~ msgid "Interface Customization" #~ msgstr "Інтэрфэйс" #~ msgid "Also known as iChat style" #~ msgstr "Таксама вядома як \"стыль iChat\"" #~ msgid "" #~ "An example: If you have enabled status message for away, Gajim won't ask " #~ "you anymore for a status message when you change your status to away; it " #~ "will use the default one set here" #~ msgstr "" #~ "Напрыклад, калі Вы ўключылі паведамленне стану для сышоўшага стану, Gajim " #~ "больш не будзе ў Вас пытацца пацверджання гэтага паведамлення" #~ msgid "Chat" #~ msgstr "Размова" #~ msgid "" #~ "Determined by sender\n" #~ "Chat message\n" #~ "Single message" #~ msgstr "" #~ "Вызначае адпраўнік\n" #~ "Размоўнае паведамленне\n" #~ "Асобнае паведамленне" #~ msgid "E_very 5 minutes" #~ msgstr "_Кожныя 5 хвілінаў" #~ msgid "" #~ "Gajim will automatically show new events by popping up the relative window" #~ msgstr "Gajim аўтаматычна пакажа новыя падзеі ў адпаведным выплыўным вакне" #~ msgid "" #~ "Gajim will notify you for new events via a popup in the bottom right of " #~ "the screen" #~ msgstr "" #~ "Gajim будзе паведамляць Вам аб новых падзеях у выплыўным вакне ў правым " #~ "верхнім куце экрана" #~ msgid "" #~ "Gajim will notify you via a popup window in the bottom right of the " #~ "screen about contacts that just signed in" #~ msgstr "" #~ "Gajim будзе паведамляць Вам аб увайшоўшых людзях у выплыўным вакне ў " #~ "правым верхнім куце экрана" #~ msgid "" #~ "Gajim will only change the icon of the contact that triggered the new " #~ "event" #~ msgstr "" #~ "Gajim толькі зменіць значку чалавека, які стаў прычынай новай падзеі" #~ msgid "" #~ "If checked, Gajim will remember the roster and chat window positions in " #~ "the screen and the sizes of them next time you run it" #~ msgstr "" #~ "Калі гэтая опцыя ўключаная, Gajim запомніць пазіцыю галоўнага і іншых " #~ "вокнаў і іх памеры" #~ msgid "" #~ "Never\n" #~ "Always\n" #~ "Per account\n" #~ "Per type" #~ msgstr "" #~ "Ніколі\n" #~ "Заўсёды\n" #~ "Па рахунках\n" #~ "Па тыпе" #~ msgid "Outgoing Chat state noti_fications:" #~ msgstr "Адпраўляць _нагадванні стану размовы:" #~ msgid "Print time:" #~ msgstr "Паказваць час:" #~ msgid "Save _position and size for roster and chat windows" #~ msgstr "Захоўваць _пазіцыю і памеры галоўнага і размоўных вокнаў" #~ msgid "Set status message to reflect currently playing _music track" #~ msgstr "Выстаўляць паведамленне стану з улікам _гранай музыкі" #~ msgid "The auto away status message" #~ msgstr "Паведамленне аб аўтаматычным сыходзе" #~ msgid "Treat all incoming messages as:" #~ msgstr "Лічыць усе ўваходныя паведамленні:" #~ msgid "" #~ "When a new event (message, file transfer request etc..) is received, the " #~ "following methods may be used to inform you about it. Please note that " #~ "events about new messages only occur if it is a new message from a " #~ "contact you are not already chatting with" #~ msgstr "" #~ "Магчымыя наступныя варыянты нагадвання аб здзяйсненні новых падзей " #~ "(паведамленне, запыт на перадачу файла і г.д.). Зважайце, што атрыманне " #~ "новага паведамлення фіксуецца толькі тады, калі Вы атрымліваеце " #~ "паведамленне ад чалавека, з якім на той момант яшчэ не вялася размова" #~ msgid "" #~ "Works for Rhythmbox and Muine players. For more players, please visit " #~ "http://trac.gajim.org/wiki/GajimAndMusicPlayer" #~ msgstr "" #~ "Працуе з Rhythmbox і Muine. Для іншых праграмаў глядзіце старонку http://" #~ "trac.gajim.org/wiki/GajimAndMusicPlayer" #~ msgid "_Advanced Notifications Control..." #~ msgstr "_Адмысловыя настаўленні нагадванняў..." #~ msgid "_Player:" #~ msgstr "_Прайгравальнік:" #~ msgid "City:" #~ msgstr "Горад:" #~ msgid "Company:" #~ msgstr "Кампанія:" #~ msgid "Given:" #~ msgstr "Дадзенае імя:" #~ msgid "Middle:" #~ msgstr "Сярэдняе:" #~ msgid "Position:" #~ msgstr "Пазіцыя:" #~ msgid "Prefix:" #~ msgstr "Прэфікс:" #~ msgid "Role:" #~ msgstr "Роля:" #~ msgid "State:" #~ msgstr "Штат:" #~ msgid "Suffix:" #~ msgstr "Суфікс:" #~ msgid "_Remove from Roster" #~ msgstr "Вы_даліць з кантактнага ліста" #~ msgid "A_ccounts" #~ msgstr "Р_ахункі" #~ msgid "_Filter:" #~ msgstr "_Фільтар:" #~ msgid "Ask:" #~ msgstr "Запыт:" #~ msgid "Client:" #~ msgstr "Праграма:" #~ msgid "OS:" #~ msgstr "Аперацыйная сістэма:" #~ msgid "" #~ "If that is not your language for which you want to highlight misspelled " #~ "words, then please set your $LANG as appropriate. Eg. for French do " #~ "export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to " #~ "make it global in /etc/profile.\n" #~ "\n" #~ "Highlighting misspelled words feature will not be used" #~ msgstr "" #~ "Калі гэта не мова, для якой трэба паказваць няправільна напісаныя словы, " #~ "тады вызначце зменную $LANG адпаведным чынам. Напр., для беларускай мовы " #~ "змясціце загад export LANG=be_BY.UTF-8 у файле ~/.bash_profile, альбо " #~ "глабальна ў /etc/profile.\n" #~ "\n" #~ "Фарбаванне няправільна напісаных слоў не працуе" #~ msgid "Every %s _minutes" #~ msgstr "Кожныя %s _хвілінаў" #~ msgid "You must enter a password for the new account." #~ msgstr "Вы павінны ўвесці пароль для новага рахунка." #~ msgid "You will always see him or her as offline." #~ msgstr "Вы заўсёды будзеце бачыць гэтага чалавека адключаным." #~ msgid "%s is now %s (%s)" #~ msgstr "%s цяпер %s (%s)" #~ msgid "%s is now %s" #~ msgstr "%s цяпер %s" #~ msgid "" #~ "\n" #~ "From: %(from_address)s" #~ msgstr "" #~ "\n" #~ "Ад: %(from_address)s" #~ msgid "Network Manager support not available" #~ msgstr "Падтрымка Network Manager адсутнічае" #~ msgid "Session Management support not available (missing gnome.ui module)" #~ msgstr "Падтрымка працоўных сеансаў адсутнічае (няма модуля gnome.ui)" #~ msgid "Private Chat" #~ msgstr "Прыватная размова" #~ msgid "Group Chat" #~ msgstr "Групавая размова" #~ msgid "%s does not appear to be a valid JID" #~ msgstr "%s не з'яўляецца карэктным JID" #~ msgid "%s - Gajim" #~ msgstr "%s - Gajim" #~ msgid "_New group chat" #~ msgstr "_Новая групавая размова" #~ msgid "_Log on" #~ msgstr "_Увайсці" #~ msgid "Log _off" #~ msgstr "_Сысці" #~ msgid "Save passphrase" #~ msgstr "Захоўваць пароль" #~ msgid "Drop %s in group %s" #~ msgstr "Перанесці %s у групу %s" #~ msgid "Hides the buttons in two persons chat window." #~ msgstr "Схаваць кнопкі прыватнай размовы." #~ msgid "Connected to server %s:%s with %s" #~ msgstr "Злучаны з серверам %s:%s з %s" #~ msgid "invisible" #~ msgstr "нябачны" #~ msgid "offline" #~ msgstr "адключаны" #~ msgid " %d unread single message" #~ msgid_plural " %d unread single messages" #~ msgstr[0] "%d нечытанае асобнае паведамленне" #~ msgstr[1] "%d нечытаныя асобныя паведамленні" #~ msgstr[2] "%d нечытаных асобных паведамленняў" #~ msgid " %d unread group chat message" #~ msgid_plural " %d unread group chat messages" #~ msgstr[0] "%d нечытанае групавое паведамленне" #~ msgstr[1] "%d нечытаныя групавыя паведамленні" #~ msgstr[2] "%d нечытаных групавых паведамленняў" #~ msgid " %d unread private message" #~ msgid_plural " %d unread private messages" #~ msgstr[0] "%d нечытанае прыватнае паведамленне" #~ msgstr[1] "%d нечытаныя прыватныя паведамленні" #~ msgstr[2] "%d нечытаных прыватных паведамленняў" #~ msgid "" #~ "Connection to host could not be established: Incorrect answer from server." #~ msgstr "Немагчыма злучыцца з вузлом: некарэктны адказ сервера." #~ msgid "Connection to host could not be established" #~ msgstr "Немагчыма ўсталяваць злучэнне з вузлом" #~ msgid "A_fter nickname:" #~ msgstr "_Пасля мянушкі:" #~ msgid "_After time:" #~ msgstr "_Праз пэўны час:" #~ msgid "_Before time:" #~ msgstr "_За пэўны час да:" #~ msgid "_Retrieve" #~ msgstr "_Атрымаць" #~ msgid "Information published" #~ msgstr "Звесткі абноўлены" #~ msgid "Without a connection, you can not get your contact information." #~ msgstr "Вы не можаце атрымаць звесткі аб сабе, не злучыўшыся з сэрвэрам." gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/po/be@latin.po000066400000000000000000012056711326020644600234130ustar00rootroot00000000000000# Biełarusji pierakład Gajim # Copyright (C) 2006-2007 Free Software Foundation, Inc. # This file is distributed under the same license as Gajim. # Based on cyrillic version. # # Ihar Hrachyshka , 2006-2007, 2009. msgid "" msgstr "" "Project-Id-Version: 0.11.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-03-31 02:05+0000\n" "PO-Revision-Date: 2009-08-19 23:41+0200\n" "Last-Translator: Ihar Hrachyshka \n" "Language-Team: Belarusian Latin \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: gajim/chat_control_base.py:199 msgid "Ping?" msgstr "" #: gajim/chat_control_base.py:204 #, fuzzy msgid "Error." msgstr "Pamyłka Avahi" #: gajim/chat_control_base.py:571 msgid "_Undo" msgstr "" #: gajim/chat_control_base.py:579 gajim/profile_window.py:181 #: gajim/conversation_textview.py:539 msgid "_Clear" msgstr "" #: gajim/chat_control_base.py:1172 msgid "Really send file?" msgstr "" #: gajim/chat_control_base.py:1173 #, python-format msgid "If you send a file to %s, he/she will know your real JID." msgstr "" #: gajim/session.py:451 gajim/session.py:511 msgid "Confirm these session options" msgstr "" #: gajim/session.py:453 #, python-format msgid "" "The remote client wants to negotiate a session with these features:\n" "\n" "%s\n" "\n" "Are these options acceptable?" msgstr "" #: gajim/session.py:513 #, python-format msgid "" "The remote client selected these options:\n" "\n" "%s\n" "\n" "Continue with the session?" msgstr "" #: gajim/session.py:516 #, fuzzy msgid "Always accept for this contact" msgstr "Ci vykarystoŭvajecca šyfravańnie OpenPGP dla hetaha kantaktu?" #: gajim/filetransfers_window.py:89 msgid "File" msgstr "Fajł" #: gajim/filetransfers_window.py:104 msgid "Time" msgstr "Čas" #: gajim/filetransfers_window.py:116 msgid "Progress" msgstr "Prahres" #: gajim/filetransfers_window.py:223 gajim/filetransfers_window.py:279 #, python-format msgid "Filename: %s" msgstr "Nazva fajłu: %s" #: gajim/filetransfers_window.py:224 gajim/filetransfers_window.py:486 #, python-format msgid "Size: %s" msgstr "Pamier: %s" #: gajim/filetransfers_window.py:233 gajim/filetransfers_window.py:243 #: gajim/history_manager.py:528 msgid "You" msgstr "Ty" #: gajim/filetransfers_window.py:234 #, python-format msgid "Sender: %s" msgstr "Dasłaŭ: %s" #: gajim/filetransfers_window.py:235 gajim/filetransfers_window.py:763 #: gajim/tooltips.py:667 msgid "Recipient: " msgstr "Atrymaŭ: " #: gajim/filetransfers_window.py:246 #, python-format msgid "Saved in: %s" msgstr "Zapisany ŭ: %s" #: gajim/filetransfers_window.py:248 gajim/chat_control.py:1617 msgid "File transfer completed" msgstr "Pieradača fajłu skončana" #: gajim/filetransfers_window.py:250 gajim/chat_control.py:1621 #, fuzzy msgid "Open _Containing Folder" msgstr "_Adčyni kataloh z fajłam" #: gajim/filetransfers_window.py:263 gajim/filetransfers_window.py:270 #: gajim/chat_control.py:1676 msgid "File transfer cancelled" msgstr "Pieradača fajłu anulavana" #: gajim/filetransfers_window.py:263 gajim/filetransfers_window.py:271 #: gajim/chat_control.py:1677 msgid "Connection with peer cannot be established." msgstr "NIemahčyma złučycca ź inšym bokam." #: gajim/filetransfers_window.py:280 #, python-format msgid "Recipient: %s" msgstr "Atrymoŭca: %s" #: gajim/filetransfers_window.py:282 #, python-format msgid "Error message: %s" msgstr "Tekst pamyłki: %s" #: gajim/filetransfers_window.py:283 gajim/chat_control.py:1673 #, fuzzy msgid "File transfer stopped" msgstr "Pieradača fajłu spyniena" #: gajim/filetransfers_window.py:319 #, python-format msgid "" "The file %(file)s has been received, but it seems to have been damaged along " "the way.\n" "Do you want to download it again?" msgstr "" #: gajim/filetransfers_window.py:345 #, fuzzy msgid "Choose File to Send…" msgstr "Abiary fajł dla adsyłańnia..." #: gajim/filetransfers_window.py:356 msgid "_Send" msgstr "_Vyšli" #: gajim/filetransfers_window.py:363 gajim/tooltips.py:702 #, fuzzy msgid "Description: " msgstr "Apisańnie: %s" #: gajim/filetransfers_window.py:376 #, fuzzy msgid "Gajim can not read this file" msgstr "Gajim nia moža dastupicca da hetaha fajłu" #: gajim/filetransfers_window.py:377 msgid "Another process is using this file." msgstr "" #: gajim/filetransfers_window.py:422 gajim/gtkgui_helpers.py:492 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Niemahčyma nadpisać fajł \"%s\"" #: gajim/filetransfers_window.py:423 gajim/gtkgui_helpers.py:493 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." msgstr "" "Fajł z takoj nazvaj užo isnuje, i nie staje pravoŭ dla nadpisańnia hetaha " "fajłu." #: gajim/filetransfers_window.py:440 gajim/gtkgui_helpers.py:497 msgid "This file already exists" msgstr "Hety fajł užo isnuje" #: gajim/filetransfers_window.py:440 gajim/gtkgui_helpers.py:497 msgid "What do you want to do?" msgstr "Što chočaš zrabić?" #: gajim/filetransfers_window.py:451 gajim/gtkgui_helpers.py:504 #, python-format msgid "Directory \"%s\" is not writable" msgstr "Niemahčyma zapisać u kataloh \"%s\"" #: gajim/filetransfers_window.py:452 gajim/gtkgui_helpers.py:505 msgid "You do not have permission to create files in this directory." msgstr "Nie staje pravoŭ dla stvareńnia fajłaŭ u hetym katalohu." #: gajim/filetransfers_window.py:463 #, fuzzy msgid "Save File as…" msgstr "Zapišy fajł jak..." #: gajim/filetransfers_window.py:483 #, python-format msgid "File: %s" msgstr "Fajł: %s" #: gajim/filetransfers_window.py:489 #, python-format msgid "Type: %s" msgstr "Typ: %s" #: gajim/filetransfers_window.py:491 #, python-format msgid "Description: %s" msgstr "Apisańnie: %s" #: gajim/filetransfers_window.py:492 #, python-format msgid "%s wants to send you a file:" msgstr "%s choča dasłać tabie fajł:" #: gajim/filetransfers_window.py:533 #, fuzzy msgid "Checking file…" msgstr "Dasyłańnie profilu..." #: gajim/filetransfers_window.py:547 #, fuzzy msgid "File error" msgstr "Pamyłka pieradačy fajłu" #: gajim/filetransfers_window.py:584 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" #: gajim/filetransfers_window.py:677 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" #: gajim/filetransfers_window.py:730 gajim/filetransfers_window.py:733 msgid "Invalid File" msgstr "Niapravilny fajł" #: gajim/filetransfers_window.py:730 msgid "File: " msgstr "Fajł: " #: gajim/filetransfers_window.py:734 msgid "It is not possible to send empty files" msgstr "Niemahčyma dasyłać pustyja fajły" #: gajim/filetransfers_window.py:759 gajim/tooltips.py:658 msgid "Name: " msgstr "Nazva:" #: gajim/filetransfers_window.py:761 gajim/tooltips.py:661 msgid "Sender: " msgstr "Adpraŭnik:" #: gajim/filetransfers_window.py:889 msgid "Pause" msgstr "Prypyni" #: gajim/filetransfers_window.py:900 msgid "_Continue" msgstr "_Praciahni" #: gajim/features_window.py:48 msgid "Bonjour / Zeroconf" msgstr "" #: gajim/features_window.py:49 msgid "Serverless chatting with autodetected clients in a local network." msgstr "" #: gajim/features_window.py:50 msgid "Requires python-avahi." msgstr "" #: gajim/features_window.py:51 msgid "" "Requires pybonjour and bonjour SDK running (http://developer.apple.com/" "opensource/)." msgstr "" #: gajim/features_window.py:52 #, fuzzy msgid "Command line" msgstr "Zahady: %s" #: gajim/features_window.py:53 msgid "A script to control Gajim via commandline." msgstr "" #: gajim/features_window.py:54 msgid "Requires python-dbus." msgstr "" #: gajim/features_window.py:55 gajim/features_window.py:83 #: gajim/features_window.py:87 msgid "Feature not available under Windows." msgstr "" #: gajim/features_window.py:56 #, fuzzy msgid "OpenPGP message encryption" msgstr "Šyfravańnie OpenPGP" #: gajim/features_window.py:57 #, fuzzy msgid "Ability to encrypting chat messages with OpenPGP." msgstr "_Uvachodnaje paviedamleńnie:" #: gajim/features_window.py:58 msgid "Requires gpg and python-gnupg (http://code.google.com/p/python-gnupg/)." msgstr "" #: gajim/features_window.py:59 msgid "Requires gpg.exe in PATH." msgstr "" #: gajim/features_window.py:60 #, fuzzy msgid "Password encryption" msgstr "Paroli roźniacca" #: gajim/features_window.py:61 msgid "Passwords can be stored securely and not just in plaintext." msgstr "" #: gajim/features_window.py:62 msgid "" "Requires libsecret and a provider (such as GNOME Keyring and KSecretService)." msgstr "" #: gajim/features_window.py:63 msgid "On Windows the Windows Credential Vault is used." msgstr "" #: gajim/features_window.py:64 msgid "Spell Checker" msgstr "" #: gajim/features_window.py:65 msgid "Spellchecking of composed messages." msgstr "" #: gajim/features_window.py:66 gajim/features_window.py:67 msgid "Requires Gspell" msgstr "" #: gajim/features_window.py:68 #, fuzzy msgid "Automatic status" msgstr "_Dastasuj da statusu" #: gajim/features_window.py:69 msgid "Ability to measure idle time, in order to set auto status." msgstr "" #: gajim/features_window.py:70 msgid "Requires libxss library." msgstr "" #: gajim/features_window.py:71 msgid "Requires python2.5." msgstr "" #: gajim/features_window.py:72 #, fuzzy msgid "End to End message encryption" msgstr "Šyfravańnie OpenPGP" #: gajim/features_window.py:73 #, fuzzy msgid "Encrypting chat messages." msgstr "_Uvachodnaje paviedamleńnie:" #: gajim/features_window.py:74 gajim/features_window.py:75 msgid "Requires python-crypto." msgstr "" #: gajim/features_window.py:76 #, fuzzy msgid "RST Generator" msgstr "Ahulnaja" #: gajim/features_window.py:77 msgid "" "Generate XHTML output from RST code (see http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." msgstr "" #: gajim/features_window.py:78 gajim/features_window.py:79 msgid "Requires python-docutils." msgstr "" #: gajim/features_window.py:80 gajim/data/gui/preferences_window.ui:2421 msgid "Audio / Video" msgstr "" #: gajim/features_window.py:81 msgid "Ability to start audio and video chat." msgstr "" #: gajim/features_window.py:82 msgid "" "Requires gir1.2-farstream-0.2, gir1.2-gstreamer-1.0, gstreamer1.0-libav and " "gstreamer1.0-plugins-ugly." msgstr "" #: gajim/features_window.py:84 msgid "UPnP-IGD" msgstr "" #: gajim/features_window.py:85 msgid "Ability to request your router to forward port for file transfer." msgstr "" #: gajim/features_window.py:86 msgid "Requires gir1.2-gupnpigd-1.0." msgstr "" #: gajim/features_window.py:94 #, fuzzy msgid "?features:Available" msgstr "Dastupny" #: gajim/features_window.py:101 #, fuzzy msgid "Feature" msgstr "Zdolnaści serveraŭ" #: gajim/gtkgui_helpers.py:255 msgid "Error reading file:" msgstr "Pamyłka adčytańnia fajłu:" #: gajim/gtkgui_helpers.py:258 msgid "Error parsing file:" msgstr "Pamyłka razboru fajłu:" #: gajim/gtkgui_helpers.py:478 msgid "Extension not supported" msgstr "Pašyreńnie nie padtrymvajecca" #: gajim/gtkgui_helpers.py:479 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "" "Niemahčyma zapisać vyjavu ŭ farmacie %(type)s. Zapisać jak %(new_filename)s?" #: gajim/gtkgui_helpers.py:514 #, fuzzy msgid "Save Image as…" msgstr "Zapišy vyjavu jak..." #: gajim/vcard.py:166 gajim/vcard.py:513 gajim/profile_window.py:175 #: gajim/chat_control.py:581 #, fuzzy msgid "Save _As" msgstr "Nie razmaŭlaju " #: gajim/vcard.py:289 gajim/vcard.py:296 msgid "?Client:Unknown" msgstr "?Klijent:Nieviadomy" #: gajim/vcard.py:293 gajim/vcard.py:298 msgid "?OS:Unknown" msgstr "?AS:Nieviadomaja" #: gajim/vcard.py:327 gajim/vcard.py:330 #, fuzzy msgid "?Time:Unknown" msgstr "?Klijent:Nieviadomy" #: gajim/vcard.py:381 msgid "?Role in Group Chat:Role:" msgstr "" #: gajim/vcard.py:385 #, fuzzy msgid "Affiliation:" msgstr "Aplikacyi" #: gajim/vcard.py:392 #, fuzzy msgid "" "This contact is interested in your presence information, but you are not " "interested in their presence" msgstr "" "Hety kantakt cikavicca tvajim statusam, ale ciabie jahony status nie cikavić" #: gajim/vcard.py:394 #, fuzzy msgid "" "You are interested in the contact's presence information, but it is not " "mutual" msgstr "" "Ty cikaviśsia statusam hetaha kantaktu, ale jaho nie cikavić tvoj status" #: gajim/vcard.py:396 #, fuzzy msgid "The contact and you want to exchange presence information" msgstr "Ty i hety kantakt uzajemna cikaviciesia statusam adno adnaho" #: gajim/vcard.py:398 #, fuzzy msgid "" "You and the contact have a mutual disinterest in each-others presence " "information" msgstr "Ty i hety kantakt uzajemna cikaviciesia statusam adno adnaho" #: gajim/vcard.py:404 msgid "You are waiting contact's answer about your subscription request" msgstr "Ty čakaješ adkazu kantaktu na zapyt aŭtaryzacyi" #: gajim/vcard.py:406 msgid "There is no pending subscription request." msgstr "" #: gajim/vcard.py:411 gajim/vcard.py:455 gajim/vcard.py:568 msgid " resource with priority " msgstr " krynica z pryjarytetam " #: gajim/options_dialog.py:383 gajim/dialogs.py:4806 gajim/dialogs.py:4848 #: gajim/dialogs.py:4896 gajim/dialogs.py:4986 msgid "All files" msgstr "Usie fajły" #: gajim/options_dialog.py:392 #, fuzzy msgid "Clear File" msgstr "Viečar" #: gajim/options_dialog.py:474 #, fuzzy msgid "Manage Proxies" msgstr "Kiruj profilami proxy" #: gajim/options_dialog.py:484 gajim/options_dialog.py:552 #: gajim/options_dialog.py:573 gajim/dialogs.py:326 gajim/dialogs.py:328 #: gajim/dialogs.py:536 gajim/dialogs.py:549 gajim/roster_window.py:2997 #: gajim/roster_window.py:3003 gajim/roster_window.py:3008 gajim/config.py:1162 #: gajim/config.py:1177 gajim/config.py:1182 gajim/config.py:1230 #: gajim/config.py:1340 gajim/config.py:2489 gajim/config.py:2566 #: gajim/data/gui/account_creation_wizard_window.ui:22 #: gajim/data/gui/change_mood_dialog.ui:98 msgid "None" msgstr "Nijaki" #: gajim/options_dialog.py:506 #, fuzzy msgid "Adjust to Status" msgstr "_Dastasuj da statusu" #: gajim/options_dialog.py:518 msgid "On" msgstr "" #: gajim/options_dialog.py:518 #, fuzzy msgid "Off" msgstr "Adłučany" #: gajim/options_dialog.py:556 msgid "Failed to get secret keys" msgstr "Niemahčyma atrymać sakretnyja klučy" #: gajim/options_dialog.py:557 #, fuzzy msgid "There is no OpenPGP secret key available." msgstr "Adbyłasia pamyłka ŭ časie atrymańnia sakretnych klučoŭ OpenPGP." #: gajim/options_dialog.py:562 msgid "OpenPGP Key Selection" msgstr "Vybar kluča OpenPGP" #: gajim/options_dialog.py:562 msgid "Choose your OpenPGP key" msgstr "Abiary svoj kluč OpenPGP" #: gajim/gui_menu_builder.py:100 #, fuzzy msgid "_New Group Chat" msgstr "Novaja hrupavaja razmova" #: gajim/gui_menu_builder.py:292 gajim/gui_menu_builder.py:416 #: gajim/dialogs.py:1114 gajim/dialogs.py:2333 gajim/dialogs.py:2362 #: gajim/dialogs.py:3867 gajim/chat_control.py:284 gajim/roster_window.py:804 #: gajim/roster_window.py:1753 gajim/roster_window.py:1755 #: gajim/roster_window.py:2068 gajim/roster_window.py:3419 #: gajim/roster_window.py:3446 gajim/gui_interface.py:524 #: gajim/common/contacts.py:154 gajim/common/contacts.py:280 #: gajim/common/helpers.py:95 gajim/common/helpers.py:408 msgid "Not in Roster" msgstr "Niama ŭ śpisie" #: gajim/gui_menu_builder.py:431 msgid "I would like to add you to my roster" msgstr "Ja chaču dadać ciabie da svajho śpisu kantaktaŭ" #: gajim/gui_menu_builder.py:508 #, fuzzy msgid "Send Single _Message…" msgstr "Vyšli _asobnaje paviedamleńnie" #: gajim/gui_menu_builder.py:521 gajim/roster_window.py:5165 #: gajim/data/gui/contact_context_menu.ui:58 #, fuzzy msgid "Send Cus_tom Status" msgstr "Dasyłaje svoj XML" #: gajim/gui_menu_builder.py:541 #, fuzzy msgid "E_xecute Command…" msgstr "_Vykanaj zahad..." #: gajim/gui_menu_builder.py:549 #, fuzzy msgid "_Manage Transport" msgstr "Transparty" #: gajim/gui_menu_builder.py:555 #, fuzzy msgid "_Modify Transport" msgstr "Pakažy _transparty" #: gajim/gui_menu_builder.py:562 gajim/roster_window.py:5195 #, fuzzy msgid "_Rename…" msgstr "Źmiani _nazvu" #: gajim/gui_menu_builder.py:573 gajim/roster_window.py:5212 #: gajim/roster_window.py:5327 gajim/data/gui/blocked_contacts_window.ui:52 #: gajim/data/gui/gc_occupants_menu.ui:148 #: gajim/data/gui/contact_context_menu.ui:166 msgid "_Unblock" msgstr "" #: gajim/gui_menu_builder.py:576 gajim/roster_window.py:5217 #: gajim/roster_window.py:5331 gajim/data/gui/gc_occupants_menu.ui:140 #: gajim/data/gui/contact_context_menu.ui:174 msgid "_Block" msgstr "" #: gajim/gui_menu_builder.py:584 gajim/roster_window.py:5224 #: gajim/data/gui/contact_context_menu.ui:204 #, fuzzy msgid "Remo_ve" msgstr "_Vydal" #: gajim/gui_menu_builder.py:594 gajim/data/gui/search_window.ui:98 #, fuzzy msgid "_Information" msgstr "Źviestki ab kantakcie" #: gajim/gui_menu_builder.py:611 #, fuzzy msgid "Send File..." msgstr "Vyšli _fajł" #: gajim/gui_menu_builder.py:615 #, fuzzy msgid "Invite Contacts" msgstr "Kantakty" #: gajim/gui_menu_builder.py:616 #, fuzzy msgid "Add to Roster" msgstr "_Dadaj u śpis kantaktaŭ" #: gajim/gui_menu_builder.py:617 msgid "Audio Session" msgstr "" #: gajim/gui_menu_builder.py:618 msgid "Video Session" msgstr "" #: gajim/gui_menu_builder.py:619 #, fuzzy msgid "Information" msgstr "Źviestki ab kantakcie" #: gajim/gui_menu_builder.py:620 gajim/gui_menu_builder.py:655 #: gajim/data/gui/application_menu.ui:37 #, fuzzy msgid "History" msgstr "_Žurnał razmoŭ" #: gajim/gui_menu_builder.py:644 #, fuzzy msgid "Manage Room" msgstr "Kiruj zakładkami" #: gajim/gui_menu_builder.py:645 #, fuzzy msgid "Change Subject" msgstr "Źmiani _temu" #: gajim/gui_menu_builder.py:646 #, fuzzy msgid "Configure Room" msgstr "Kanfihuruj _pakoj" #: gajim/gui_menu_builder.py:647 #, fuzzy msgid "Destroy Room" msgstr "Apisańnie: %s" #: gajim/gui_menu_builder.py:649 #, fuzzy msgid "Change Nick" msgstr "Źmiani _mianušku" #: gajim/gui_menu_builder.py:650 #, fuzzy msgid "Bookmark Room" msgstr "_Stvary zakładku dla hetaja pakoju" #: gajim/gui_menu_builder.py:651 #, fuzzy msgid "Request Voice" msgstr "_Daj hołas" #: gajim/gui_menu_builder.py:652 gajim/data/gui/gc_control_popup_menu.ui:72 #, fuzzy msgid "Notify on all messages" msgstr "Šablony paviedamleńniaŭ statusu:" #: gajim/gui_menu_builder.py:653 msgid "Minimize on close" msgstr "" #: gajim/gui_menu_builder.py:654 gajim/roster_window.py:5397 #, fuzzy msgid "Execute command" msgstr "_Vykanaj zahad..." #: gajim/gui_menu_builder.py:656 #, fuzzy msgid "Disconnect" msgstr "Kantakt adłučyŭsia" #: gajim/gui_menu_builder.py:685 gajim/gui_menu_builder.py:732 msgid "Join Group Chat" msgstr "Dałučysia da pakoju" #: gajim/gui_menu_builder.py:731 #, fuzzy msgid "Add Contact..." msgstr "_Dadaj kantakt..." #: gajim/gui_menu_builder.py:733 gajim/accounts_window.py:460 #: gajim/accounts_window.py:555 gajim/accounts_window.py:594 #, fuzzy msgid "Profile" msgstr "fajł" #: gajim/gui_menu_builder.py:734 #, fuzzy msgid "Discover Services" msgstr "_Šukaj servisy" #: gajim/gui_menu_builder.py:735 #, fuzzy msgid "Send Single Message..." msgstr "Dašli _asobnaje aviedamleńnie..." #: gajim/gui_menu_builder.py:736 gajim/data/gui/preferences_window.ui:2846 msgid "Advanced" msgstr "Pašyranyja" #: gajim/gui_menu_builder.py:737 #, fuzzy msgid "Archiving Preferences" msgstr "_Nałady" #: gajim/gui_menu_builder.py:738 gajim/history_sync.py:44 #, fuzzy msgid "Synchronise History" msgstr "Pakažy _adłučanyja kantakty" #: gajim/gui_menu_builder.py:739 gajim/dialogs.py:4583 msgid "Privacy Lists" msgstr "Śpisy pryvatnaści" #: gajim/gui_menu_builder.py:740 gajim/server_info.py:37 #, fuzzy msgid "Server Info" msgstr "Server" #: gajim/gui_menu_builder.py:741 gajim/data/gui/xml_console_window.ui:77 msgid "XML Console" msgstr "Kansol XML" #: gajim/gui_menu_builder.py:743 #, fuzzy msgid "Admin" msgstr "_Administratar" #: gajim/gui_menu_builder.py:744 #, fuzzy msgid "Send Server Message..." msgstr "_Dašli paviedamleńnie servera" #: gajim/gui_menu_builder.py:745 #, fuzzy msgid "Set MOTD..." msgstr "Vyznač MOTD" #: gajim/gui_menu_builder.py:746 #, fuzzy msgid "Update MOTD..." msgstr "Aktualizuj MOTD" #: gajim/gui_menu_builder.py:747 #, fuzzy msgid "Delete MOTD..." msgstr "Vydal MOTD" #: gajim/gui_menu_builder.py:787 #, fuzzy msgid "No Accounts available" msgstr "Konty niedastupnyja" #: gajim/gui_menu_builder.py:799 gajim/data/gui/accounts_window.ui:78 #: gajim/data/gui/application_menu.ui:5 gajim/data/gui/application_menu.ui:71 #: gajim/data/gui/shortcuts_window.ui:181 msgid "Accounts" msgstr "Konty" #: gajim/history_manager.py:56 #, fuzzy msgid "Usage:" msgstr "paviedamleńnie" #: gajim/history_manager.py:58 #, fuzzy msgid "Options:" msgstr "Smajliki:" #: gajim/history_manager.py:60 msgid "Show this help message and exit" msgstr "" #: gajim/history_manager.py:61 msgid "Choose folder for logfile" msgstr "" #: gajim/history_manager.py:104 msgid "Cannot find history logs database" msgstr "Niemahčyma znajści bazu žurnałaŭ razmoŭ" #: gajim/history_manager.py:144 gajim/history_manager.py:195 #: gajim/dialogs.py:3848 gajim/config.py:1621 gajim/disco.py:872 msgid "JID" msgstr "JID" #: gajim/history_manager.py:157 gajim/history_manager.py:201 #: gajim/history_window.py:108 msgid "Date" msgstr "Data" #: gajim/history_manager.py:164 gajim/history_manager.py:220 #: gajim/data/gui/join_groupchat_window.ui:131 msgid "Nickname" msgstr "Mianuška" #: gajim/history_manager.py:173 gajim/history_manager.py:208 #: gajim/history_window.py:116 gajim/data/gui/xml_console_window.ui:108 msgid "Message" msgstr "Paviedamleńnie" #: gajim/history_manager.py:181 gajim/history_manager.py:214 msgid "Subject" msgstr "Tema" #: gajim/history_manager.py:243 msgid "" "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " "RUNNING)" msgstr "" "Chočaš ačyścić bazu źviestak? (NIE REKAMENDUJECCA RABIĆ Z AKTYŬNYM GAJIMAM)" #: gajim/history_manager.py:245 #, fuzzy msgid "" "Normally allocated database size will not be freed, it will just become " "reusable. If you really want to reduce database filesize, click YES, else " "click NO.\n" "\n" "In case you click YES, please wait…" msgstr "" "Zvyčajna zaniataja bazaj źviestak prastora nie vyzvalajecca, ale " "rezervujecca dla paźniejšych patrebaŭ prahramy. Kali ty sapraŭdy chočaš " "źmienšyć pamier bazy źviestak, klikni \"Tak\", inakš \"Nie\".\n" "\n" "Kali ty abraŭ \"Tak\", pačakaj..." #: gajim/history_manager.py:250 msgid "Database Cleanup" msgstr "" #: gajim/history_manager.py:464 #, fuzzy msgid "Exporting History Logs…" msgstr "Ekspartavańnie žurnałaŭ..." #: gajim/history_manager.py:540 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "%(who)s a %(time)s napisaŭ: %(message)s\n" #: gajim/history_manager.py:578 #, fuzzy, python-format msgid "Do you wish to delete all correspondence with %(jid)s?" msgstr "Sapraŭdy chočaš vydalić zaznačanaje paviedamleńnie?" #: gajim/history_manager.py:582 #, fuzzy msgid "Do you wish to delete all correspondence with the selected contacts?" msgstr "Sapraŭdy chočaš vydalić žurnał razmoŭ z abranym kantaktam?" #: gajim/history_manager.py:584 #, fuzzy msgid "This can not be undone." msgstr "Niemahčyma znajści servis" #: gajim/history_manager.py:586 gajim/history_manager.py:625 #, fuzzy msgid "Deletion Confirmation" msgstr "Źviestki ab kantakcie" #: gajim/history_manager.py:620 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Sapraŭdy chočaš vydalić zaznačanaje paviedamleńnie?" msgstr[1] "Sapraŭdy chočaš vydalić zaznačanyja paviedamleńni?" msgstr[2] "Sapraŭdy chočaš vydalić zaznačanyja paviedamleńni?" #: gajim/history_manager.py:623 msgid "This is an irreversible operation." msgstr "Vynikaŭ hetaj aperacyi niemahčyma anulavać." #: gajim/profile_window.py:63 #, fuzzy msgid "Retrieving profile…" msgstr "Atrymańnie profilu..." #: gajim/profile_window.py:128 msgid "Could not load image" msgstr "Niemahčyma adčytać vyjavu" #: gajim/profile_window.py:200 #, fuzzy msgid "Wrong date format" msgstr "Źviestki ab kantakcie" #: gajim/profile_window.py:201 #, fuzzy msgid "Format of the date must be YYYY-MM-DD" msgstr "Farmat: HHHH-MM-DD" #: gajim/profile_window.py:261 msgid "Information received" msgstr "Źviestki atrymanyja" #: gajim/profile_window.py:334 gajim/dialogs.py:2562 gajim/dialogs.py:2650 #: gajim/dialogs.py:3105 gajim/disco.py:536 gajim/gui_interface.py:1849 #: gajim/dialog_messages.py:32 msgid "You are not connected to the server" msgstr "Niama złučeńnia z serveram" #: gajim/profile_window.py:335 #, fuzzy msgid "Without a connection, you can not publish your contact information." msgstr "" "Niemahčyma apublikavać asabistyja źviestki, nie dałučyŭšysia da servera." #: gajim/profile_window.py:349 #, fuzzy msgid "Sending profile…" msgstr "Dasyłańnie profilu..." #: gajim/profile_window.py:368 msgid "Information NOT published" msgstr "Źviestki NIE apublikavanyja" #: gajim/profile_window.py:375 msgid "vCard publication failed" msgstr "Pamyłka publikacyi vCard" #: gajim/profile_window.py:376 msgid "" "There was an error while publishing your personal information, try again " "later." msgstr "" "Adbyłasia pamyłka padčas publikacyi asabistych źviestak, pasprabuj paźniej." #: gajim/dialogs.py:90 #, python-format msgid "Contact name: %s" msgstr "Nazva kantaktu: %s" #: gajim/dialogs.py:92 #, fuzzy, python-format msgid "JID: %s" msgstr "JID: %s" #: gajim/dialogs.py:121 gajim/dialogs.py:133 gajim/roster_window.py:2939 #: gajim/roster_window.py:3953 gajim/roster_window.py:5234 #: gajim/accounts_window.py:463 gajim/common/contacts.py:105 #: gajim/common/contacts.py:137 gajim/data/gui/preferences_window.ui:569 #: gajim/data/gui/shortcuts_window.ui:176 msgid "General" msgstr "Ahulnaja" #: gajim/dialogs.py:206 msgid "Group" msgstr "Hrupa" #: gajim/dialogs.py:213 msgid "In the group" msgstr "U hrupie" #: gajim/dialogs.py:308 msgid "KeyID" msgstr "ID kluča" #: gajim/dialogs.py:313 msgid "Contact name" msgstr "Nazva kantaktu" #: gajim/dialogs.py:491 #, fuzzy msgid "Set Mood" msgstr "Vyznač MOTD" #: gajim/dialogs.py:611 #, python-format msgid "%s Status Message" msgstr "Paviedamleńnie statusu %s" #: gajim/dialogs.py:625 msgid "Status Message" msgstr "Paviedamleńnie statusu" #: gajim/dialogs.py:815 #, fuzzy msgid "Overwrite Status Message?" msgstr "Paviedamleńnie statusu" #: gajim/dialogs.py:816 #, fuzzy msgid "" "This name is already used. Do you want to overwrite this status message?" msgstr "Kont z takoj nazvaj užo zaniaty. Kali łaska, abiary inšuju nazvu." #: gajim/dialogs.py:824 msgid "Save as Preset Status Message" msgstr "Zapišy jak šablon paviedamleńnia statusu" #: gajim/dialogs.py:825 msgid "Please type a name for this status message" msgstr "Kali łaska, uviadzi nazvu dla hetaha paviedamleńnia statusu" #: gajim/dialogs.py:852 #, fuzzy msgid "JID:" msgstr "Vaš JID:" #: gajim/dialogs.py:853 msgid "AIM Address:" msgstr "Adras AIM:" #: gajim/dialogs.py:854 msgid "GG Number:" msgstr "Numer GG:" #: gajim/dialogs.py:855 msgid "ICQ Number:" msgstr "Numer ICQ:" #: gajim/dialogs.py:856 msgid "MSN Address:" msgstr "Adras MSN:" #: gajim/dialogs.py:857 msgid "Yahoo! Address:" msgstr "Adras Yahoo!:" #: gajim/dialogs.py:894 #, fuzzy, python-format msgid "" "Please fill in the data of the contact you want to add to your account " "%s" msgstr "" "Kali łaska, zapoŭni źviestki ab kantakcie, kali chočaš dadać kantakt %s" #: gajim/dialogs.py:897 msgid "Please fill in the data of the contact you want to add" msgstr "Kali łaska, zapoŭni źviestki ab kantakcie, jaki chočaš dadać" #: gajim/dialogs.py:1089 gajim/dialogs.py:1095 gajim/dialogs.py:1100 msgid "Invalid User ID" msgstr "Niapravilny identyfikatar karystalnika" #: gajim/dialogs.py:1096 msgid "The user ID must not contain a resource." msgstr "Identyfikatar karystalnika nia moža ŭtrymlivać krynicy." #: gajim/dialogs.py:1101 #, fuzzy msgid "You cannot add yourself to your roster." msgstr "Ja chaču dadać ciabie ŭ svoj śpis kantaktaŭ." #: gajim/dialogs.py:1115 msgid "Contact already in roster" msgstr "Kantakt užo jość u śpisie kantaktaŭ" #: gajim/dialogs.py:1116 msgid "This contact is already listed in your roster." msgstr "Hety kantakt užo jość u tvajim śpisie kantaktaŭ." #: gajim/dialogs.py:1169 gajim/dialogs.py:1203 msgid "User ID:" msgstr "Identyfikatar karystalnika:" #: gajim/dialogs.py:1269 #, fuzzy msgid "Error while adding transport contact" msgstr "Pamyłka dadańnia servisu. %s" #: gajim/dialogs.py:1270 #, python-format msgid "" "This error occured while adding a contact for transport %(transport)s:\n" "\n" "%(error)s" msgstr "" #: gajim/dialogs.py:1302 #, fuzzy msgid "A GTK+ XMPP client" msgstr "Klijent Jabber dla GTK+" #: gajim/dialogs.py:1303 #, fuzzy, python-format msgid "GTK+ Version: %s" msgstr "Versija GTK+:" #: gajim/dialogs.py:1304 #, fuzzy, python-format msgid "PyGObject Version: %s" msgstr "Versija PyGTK:" #: gajim/dialogs.py:1305 #, python-format msgid "python-nbxmpp Version: %s" msgstr "" #: gajim/dialogs.py:1308 #, fuzzy msgid "Current Developers" msgstr "Dziejnyja raspracoŭniki:" #: gajim/dialogs.py:1309 #, fuzzy msgid "Past Developers" msgstr "Byłyja raspracoŭniki:" #: gajim/dialogs.py:1310 msgid "Artists" msgstr "" #: gajim/dialogs.py:1314 msgid "Last but not least" msgstr "" #: gajim/dialogs.py:1315 #, fuzzy msgid "we would like to thank all the package maintainers." msgstr "I ŭrešcie, chočacca padziakavać usim apiekunam pakietaŭ." #: gajim/dialogs.py:1316 msgid "Thanks" msgstr "" #: gajim/dialogs.py:1318 msgid "translator-credits" msgstr "Ihar Hrachyshka " #: gajim/dialogs.py:1503 #, fuzzy, python-format msgid "Dictionary for language \"%s\" not available" msgstr "Słoŭnik dla movy %s niedastupny" #: gajim/dialogs.py:1504 #, fuzzy, python-format msgid "" "You have to install the dictionary \"%s\" to use spellchecking, or choose " "another language by setting the speller_language option.\n" "\n" "Highlighting misspelled words feature will not be used" msgstr "" "Treba zainstalavać słoŭnik %s, kab praviarać pravapis, albo abrać inšuju " "movu ŭ opcyi speller_language." #: gajim/dialogs.py:1851 gajim/dialogs.py:1866 gajim/gui_interface.py:1511 #: gajim/gui_interface.py:1553 #, fuzzy msgid "Insecure connection" msgstr "Złučeńnie" #: gajim/dialogs.py:1852 #, fuzzy, python-format msgid "" "You are about to connect to the account %(account)s (%(server)s) insecurely. " "This means conversations will not be encrypted, and is strongly " "discouraged.\n" "Are you sure you want to do that?" msgstr "Stvarajecca metakantakt. Ty sapraŭdy chočaš praciahnuć?" #: gajim/dialogs.py:1857 gajim/gui_interface.py:1515 #: gajim/gui_interface.py:1556 msgid "Yes, I really want to connect insecurely" msgstr "" #: gajim/dialogs.py:1858 msgid "Gajim will NOT connect unless you check this box" msgstr "" #: gajim/dialogs.py:1859 gajim/groupchat_control.py:2335 #: gajim/roster_window.py:2897 gajim/roster_window.py:3529 #: gajim/roster_window.py:4282 gajim/message_window.py:247 #: gajim/gui_interface.py:725 gajim/gui_interface.py:1516 #: gajim/gui_interface.py:1557 #, fuzzy msgid "_Do not ask me again" msgstr "_Bolš nie pytajsia" #: gajim/dialogs.py:1957 msgid "_Resume" msgstr "" #: gajim/dialogs.py:1965 msgid "Re_place" msgstr "" #: gajim/dialogs.py:2168 gajim/config.py:2169 #: gajim/command_system/implementation/standard.py:261 #, fuzzy msgid "Invalid nickname" msgstr "Niapravilnaje imia karystalnika" #: gajim/dialogs.py:2169 #, fuzzy msgid "The nickname contains invalid characters." msgstr "JID pakoju ŭtrymlivaje niedazvolenyja znaki." #: gajim/dialogs.py:2291 msgid "Subscription Request" msgstr "Zapyt aŭtaryzacyi" #: gajim/dialogs.py:2300 #, fuzzy, python-format msgid "Subscription request for account %(account)s from %(jid)s" msgstr "Zapyt aŭtaryzacyi dla kontu %s ad %s" #: gajim/dialogs.py:2303 #, python-format msgid "Subscription request from %s" msgstr "Zapyt aŭtaryzacyi ad %s" #: gajim/dialogs.py:2375 gajim/data/gui/join_groupchat_window.ui:312 #, fuzzy msgid "Join Groupchat" msgstr "Dałučysia da pakoju" #: gajim/dialogs.py:2531 #, fuzzy msgid "Invalid Room" msgstr "Niapravilny zapis" #: gajim/dialogs.py:2532 msgid "Please choose a room" msgstr "" #: gajim/dialogs.py:2544 gajim/dialogs.py:2551 #, fuzzy msgid "Invalid Nickname" msgstr "Niapravilnaje imia karystalnika" #: gajim/dialogs.py:2545 #, fuzzy msgid "Please choose a nickname" msgstr "Stvary novy zapis" #: gajim/dialogs.py:2557 gajim/dialogs.py:3516 gajim/config.py:2453 #: gajim/dialog_messages.py:37 gajim/dialog_messages.py:42 msgid "Invalid JID" msgstr "Niapravilny JID" #: gajim/dialogs.py:2563 gajim/gui_interface.py:1850 msgid "You can not join a group chat unless you are connected." msgstr "" "Niemahčyma ŭdzielničać u hrupavoj razmovie, nie dałučyŭšysia da servera." #: gajim/dialogs.py:2617 gajim/dialogs.py:2628 #, fuzzy msgid "Wrong server" msgstr "Niapravilnaja spasyłka" #: gajim/dialogs.py:2618 gajim/dialogs.py:2629 #, fuzzy, python-format msgid "%s is not a groupchat server" msgstr "Heta nie pakoj" #: gajim/dialogs.py:2651 #, fuzzy msgid "Without a connection, you can not synchronise your contacts." msgstr "Niemahčyma źmianić parol, nie dałučyŭšysia da servera." #: gajim/dialogs.py:2662 gajim/dialogs.py:2733 gajim/dialogs.py:3851 #: gajim/history_window.py:100 gajim/disco.py:865 gajim/disco.py:1693 #: gajim/disco.py:1978 msgid "Name" msgstr "Nazva" #: gajim/dialogs.py:2665 gajim/data/gui/join_groupchat_window.ui:214 msgid "Server" msgstr "Server" #: gajim/dialogs.py:2701 #, fuzzy msgid "This account is not connected to the server" msgstr "Kont \"%s\" dałučany da servera" #: gajim/dialogs.py:2702 #, fuzzy msgid "You cannot synchronize with an account unless it is connected." msgstr "" "Niemahčyma ŭdzielničać u hrupavoj razmovie, nie dałučyŭšysia da servera." #: gajim/dialogs.py:2731 msgid "Synchronise" msgstr "" #: gajim/dialogs.py:2794 #, fuzzy msgid "Start new Conversation" msgstr "Złučeńnie" #: gajim/dialogs.py:3052 #, fuzzy msgid "New Groupchat" msgstr "Novaja hrupavaja razmova" #: gajim/dialogs.py:3054 #, fuzzy msgid "New Contact" msgstr "Dadaj novy kantakt" #: gajim/dialogs.py:3106 msgid "Without a connection, you can not change your password." msgstr "Niemahčyma źmianić parol, nie dałučyŭšysia da servera." #: gajim/dialogs.py:3126 msgid "Invalid password" msgstr "Niapravilny parol" #: gajim/dialogs.py:3126 msgid "You must enter a password." msgstr "Treba ŭvieści parol." #: gajim/dialogs.py:3130 msgid "Passwords do not match" msgstr "Paroli roźniacca" #: gajim/dialogs.py:3131 msgid "The passwords typed in both fields must be identical." msgstr "Parolu ŭ abodvuch palach nie pavinny roźnicca." #: gajim/dialogs.py:3169 gajim/notify.py:91 #: gajim/common/connection_handlers_events.py:2821 msgid "Contact Signed In" msgstr "Kantakt dałučyŭsia" #: gajim/dialogs.py:3171 gajim/notify.py:91 #: gajim/common/connection_handlers_events.py:2827 msgid "Contact Signed Out" msgstr "Kantakt adłučyŭsia" #: gajim/dialogs.py:3173 gajim/notify.py:92 gajim/notify.py:105 #: gajim/common/connection_handlers_events.py:2641 msgid "New Message" msgstr "Novaje paviedamleńnie" #: gajim/dialogs.py:3173 gajim/notify.py:92 gajim/notify.py:105 #: gajim/common/connection_handlers_events.py:2623 msgid "New Single Message" msgstr "Novaje asobnaje paviedamleńnie" #: gajim/dialogs.py:3174 gajim/notify.py:92 gajim/notify.py:106 #: gajim/common/connection_handlers_events.py:2629 msgid "New Private Message" msgstr "Novaje pryvatnaje paviedamleńnie" #: gajim/dialogs.py:3174 msgid "New E-mail" msgstr "Novy list" #: gajim/dialogs.py:3176 gajim/gui_interface.py:926 gajim/notify.py:93 msgid "File Transfer Request" msgstr "Zapyt na pieradaču fajłu" #: gajim/dialogs.py:3178 gajim/gui_interface.py:861 gajim/gui_interface.py:891 #: gajim/notify.py:94 msgid "File Transfer Error" msgstr "Pamyłka pieradačy fajłu" #: gajim/dialogs.py:3180 gajim/gui_interface.py:1030 #: gajim/gui_interface.py:1059 gajim/gui_interface.py:1080 gajim/notify.py:94 msgid "File Transfer Completed" msgstr "Pieradača fajłu skončana" #: gajim/dialogs.py:3181 gajim/gui_interface.py:1034 #: gajim/gui_interface.py:1063 gajim/gui_interface.py:1084 gajim/notify.py:95 msgid "File Transfer Stopped" msgstr "Pieradača fajłu spyniena" #: gajim/dialogs.py:3183 gajim/dialogs.py:4748 gajim/chat_control.py:1647 #: gajim/gui_interface.py:663 gajim/notify.py:95 msgid "Groupchat Invitation" msgstr "Zaprašeńnie ŭ pakoj" #: gajim/dialogs.py:3185 gajim/notify.py:93 #: gajim/common/connection_handlers_events.py:2815 msgid "Contact Changed Status" msgstr "Kantakt źmianiŭ status" #: gajim/dialogs.py:3404 #, python-format msgid "Single Message using account %s" msgstr "Asobnaje paviedamleńnie z kontu %s" #: gajim/dialogs.py:3406 #, python-format msgid "Single Message in account %s" msgstr "Asobnaje paviedamleńnie z kontu %s" #: gajim/dialogs.py:3408 msgid "Single Message" msgstr "Asobnaje paviedamleńnie" #: gajim/dialogs.py:3411 #, python-format msgid "Send %s" msgstr "Dašli %s" #: gajim/dialogs.py:3434 #, python-format msgid "Received %s" msgstr "Atrymana %s" #: gajim/dialogs.py:3457 #, fuzzy, python-format msgid "Form %s" msgstr "Я %s" #: gajim/dialogs.py:3485 gajim/dialogs.py:3672 msgid "Connection not available" msgstr "Złučeńnia niama" #: gajim/dialogs.py:3486 gajim/dialogs.py:3673 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Kali łaska, pravier, ci jość złučeńnie z \"%s\"." #: gajim/dialogs.py:3517 gajim/dialog_messages.py:43 #, fuzzy, python-format msgid "It is not possible to send a message to %s, this JID is not valid." msgstr "Niemahčyma dasyłać pustyja fajły" #: gajim/dialogs.py:3540 #, python-format msgid "RE: %s" msgstr "RE: %s" #: gajim/dialogs.py:3541 #, python-format msgid "%s wrote:\n" msgstr "%s napisaŭ:\n" #: gajim/dialogs.py:3589 gajim/data/gui/shortcuts_window.ui:113 #, fuzzy msgid "Clear" msgstr "Viečar" #: gajim/dialogs.py:3594 #, fuzzy msgid "Filter" msgstr "Filter:" #: gajim/dialogs.py:3599 #, fuzzy msgid "XML Input" msgstr "Uvod XML" #: gajim/dialogs.py:3603 #, fuzzy msgid "Send" msgstr "_Vyšli" #: gajim/dialogs.py:3794 #, fuzzy msgid "add" msgstr "Zatrymana" #: gajim/dialogs.py:3794 #, fuzzy msgid "modify" msgstr "_Madyfikuj" #: gajim/dialogs.py:3795 #, fuzzy msgid "remove" msgstr "_Vydal" #: gajim/dialogs.py:3824 #, fuzzy, python-format msgid "" "%(jid)s would like you to %(action)s some contacts in your " "roster." msgstr "Ja chaču dadać Vas u svoj śpis kantaktaŭ." #: gajim/dialogs.py:3840 gajim/dialogs.py:3886 gajim/accounts_window.py:44 #, fuzzy msgid "Add" msgstr "Adras" #: gajim/dialogs.py:3842 gajim/dialogs.py:3917 #, fuzzy msgid "Modify" msgstr "_Madyfikuj" #: gajim/dialogs.py:3844 gajim/dialogs.py:3941 msgid "Delete" msgstr "Vydal" #: gajim/dialogs.py:3854 #, fuzzy msgid "Groups" msgstr "Hrupa" #: gajim/dialogs.py:3962 #, fuzzy, python-format msgid "%s suggested me to add you in my roster." msgstr "Ja chaču dadać ciabie ŭ svoj śpis kantaktaŭ." #: gajim/dialogs.py:3976 #, fuzzy, python-format msgid "Added %d contact" msgid_plural "Added %d contacts" msgstr[0] "_Dadaj kantakt" msgstr[1] "_Dadaj kantakt" msgstr[2] "_Dadaj kantakt" #: gajim/dialogs.py:4014 #, fuzzy, python-format msgid "Removed %d contact" msgid_plural "Removed %d contacts" msgstr[0] "Vydalaje kantakt sa śpisu" msgstr[1] "Vydalaje kantakt sa śpisu" msgstr[2] "Vydalaje kantakt sa śpisu" #: gajim/dialogs.py:4040 #, python-format msgid "Archiving Preferences for %s" msgstr "" #: gajim/dialogs.py:4078 msgid "Success!" msgstr "" #: gajim/dialogs.py:4078 #, fuzzy msgid "Your Archiving Preferences have been saved!" msgstr "_Nałady" #: gajim/dialogs.py:4094 msgid "We got no response from the Server" msgstr "" #: gajim/dialogs.py:4096 #, fuzzy msgid "We received an error: {}" msgstr "Atrymaŭ novy zapis:" #: gajim/dialogs.py:4100 #, fuzzy msgid "Error!" msgstr "Pamyłka Avahi" #: gajim/dialogs.py:4159 #, fuzzy msgid "Add JID" msgstr "JID:" #: gajim/dialogs.py:4232 #, python-format msgid "Privacy List %s" msgstr "Śpis pryvatnaści %s" #: gajim/dialogs.py:4236 #, python-format msgid "Privacy List for %s" msgstr "Śpis pryvatnaści dla %s" #: gajim/dialogs.py:4238 gajim/data/gui/privacy_list_window.ui:47 msgid "Privacy List" msgstr "Śpis pryvatnaści" #: gajim/dialogs.py:4309 #, fuzzy, python-format msgid "Order: %(order)s, action: %(action)s, type: %(type)s, value: %(value)s" msgstr "Paradak: %s, dziejańnie: %s, typ: %s, vartaść: %s" #: gajim/dialogs.py:4314 #, fuzzy, python-format msgid "Order: %(order)s, action: %(action)s" msgstr "Paradak: %s, dziejańnie: %s" #: gajim/dialogs.py:4368 msgid "Edit a rule" msgstr "Redahuj praviła" #: gajim/dialogs.py:4480 msgid "Add a rule" msgstr "Dadaj praviła" #: gajim/dialogs.py:4581 #, python-format msgid "Privacy Lists for %s" msgstr "Śpisy pryvatnaści dla %s" #: gajim/dialogs.py:4677 msgid "Invalid List Name" msgstr "Niapravilnaja nazva śpisu" #: gajim/dialogs.py:4678 msgid "You must enter a name to create a privacy list." msgstr "Treba akreślić nazvu dla novaha śpisu pryvatnaści." #: gajim/dialogs.py:4714 #, fuzzy msgid "You are invited to a groupchat" msgstr "Ty nie dałučyŭsia da pakoju." #: gajim/dialogs.py:4717 #, fuzzy msgid "$Contact has invited you to join a discussion" msgstr "$Contact zaprasiŭ ciabie ŭ pakoj %(room_jid)s" #: gajim/dialogs.py:4719 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "$Contact zaprasiŭ ciabie ŭ pakoj %(room_jid)s" #: gajim/dialogs.py:4728 #, python-format msgid "Comment: %s" msgstr "Kamentar: %s" #: gajim/dialogs.py:4730 #, fuzzy msgid "Do you want to accept the invitation?" msgstr "%s choča dasłać tabie fajł:" #: gajim/dialogs.py:4746 msgid "Reason (if you decline):" msgstr "" #: gajim/dialogs.py:4795 msgid "Choose Client Cert #PCKS12" msgstr "" #: gajim/dialogs.py:4811 gajim/accounts_window.py:657 msgid "PKCS12 Files" msgstr "" #: gajim/dialogs.py:4837 msgid "Choose Sound" msgstr "Abiary hukavy fajł" #: gajim/dialogs.py:4853 msgid "Wav Sounds" msgstr "Fajły ŭ Wav" #: gajim/dialogs.py:4883 msgid "Choose Image" msgstr "Abiary vyjavu" #: gajim/dialogs.py:4901 msgid "Images" msgstr "Vyjavy" #: gajim/dialogs.py:4972 #, fuzzy msgid "Choose Archive" msgstr "Abiary vyjavu" #: gajim/dialogs.py:4991 #, fuzzy msgid "Zip files" msgstr "Usie fajły" #: gajim/dialogs.py:5017 #, python-format msgid "When %s becomes:" msgstr "Kali %s maje status:" #: gajim/dialogs.py:5019 #, python-format msgid "Adding Special Notification for %s" msgstr "Dadajecca admysłovaje nahadvańnie dla %s" #: gajim/dialogs.py:5259 msgid "an audio and video" msgstr "" #: gajim/dialogs.py:5261 msgid "an audio" msgstr "" #: gajim/dialogs.py:5263 msgid "a video" msgstr "" #: gajim/dialogs.py:5267 #, python-format msgid "" "%(contact)s wants to start %(type)s session with you. Do you want to answer " "the call?" msgstr "" #: gajim/dialogs.py:5372 gajim/dialogs.py:5408 #, fuzzy, python-format msgid "Certificate for account %s" msgstr "dla kontu %s" #: gajim/dialogs.py:5372 #, python-format msgid "" "Issued to:\n" "Common Name (CN): %(scn)s\n" "Organization (O): %(sorg)s\n" "Organizationl Unit (OU): %(sou)s\n" "Serial Number: %(sn)s\n" "\n" "Issued by:\n" "Common Name (CN): %(icn)s\n" "Organization (O): %(iorg)s\n" "Organizationl Unit (OU): %(iou)s\n" "\n" "Validity:\n" "Issued on: %(io)s\n" "Expires on: %(eo)s\n" "\n" "Fingerprint\n" "SHA-1 Fingerprint: %(sha1)s\n" "\n" "SHA256 Fingerprint: %(sha256)s\n" msgstr "" #: gajim/dialogs.py:5419 gajim/gui_interface.py:1405 #, fuzzy, python-format msgid "SSL Certificate Verification for %s" msgstr "Dadajecca admysłovaje nahadvańnie dla %s" #: gajim/dialogs.py:5420 gajim/dialogs.py:5437 msgid "View cert…" msgstr "" #: gajim/dialogs.py:5453 gajim/data/gui/application_menu.ui:32 #, fuzzy msgid "File Transfer" msgstr "Pieradačy fajłaŭ" #: gajim/dialogs.py:5477 msgid "Requesting HTTP Upload Slot..." msgstr "" #: gajim/dialogs.py:5481 msgid "Uploading file via HTTP File Upload..." msgstr "" #: gajim/dialogs.py:5485 #, fuzzy msgid "Encrypting file..." msgstr "Šyfravańnie adklučanaje" #: gajim/groupchat_control.py:193 gajim/groupchat_control.py:1839 #, fuzzy, python-format msgid "%(nick)s is now known as %(new_nick)s" msgstr "%s ciapier viadomy jak %s" #: gajim/groupchat_control.py:219 gajim/groupchat_control.py:1988 #: gajim/history_window.py:550 gajim/common/connection_handlers_events.py:2811 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s maje ciapier status %(status)s" #: gajim/groupchat_control.py:248 msgid "Sending private message failed" msgstr "Pamyłka dasyłańnia pryvatnaha paviedamleńnia" #: gajim/groupchat_control.py:250 #, fuzzy, python-format msgid "You are no longer in group chat \"%(room)s\" or \"%(nick)s\" has left." msgstr "Ciabie niama ŭ pakoji \"%s\", albo \"%s\" pakinuŭ jaho." #: gajim/groupchat_control.py:640 gajim/chat_control.py:326 #: gajim/chat_control.py:330 msgid "HTTP File Upload" msgstr "" #: gajim/groupchat_control.py:642 #, fuzzy msgid "HTTP File Upload not supported by your server" msgstr "Tvoj server nie padtrymvaje zachoŭvańnia metakantaktaŭ" #: gajim/groupchat_control.py:662 gajim/groupchat_control.py:2370 msgid "Changing Subject" msgstr "Źmianiajecca tema" #: gajim/groupchat_control.py:663 gajim/groupchat_control.py:2371 msgid "Please specify the new subject:" msgstr "Kali łaska, vyznač novuju temu:" #: gajim/groupchat_control.py:670 msgid "Changing Nickname" msgstr "Źmianiajecca mianuška" #: gajim/groupchat_control.py:671 msgid "Please specify the new nickname you want to use:" msgstr "Kali łaska, vyznač dla siabie novuju mianušku:" #: gajim/groupchat_control.py:688 #, fuzzy msgid "Invalid group chat JID" msgstr "Niapravilny JID pakoju" #: gajim/groupchat_control.py:689 #, fuzzy msgid "The group chat JID has not allowed characters." msgstr "JID pakoju ŭtrymlivaje niedazvolenyja znaki." #: gajim/groupchat_control.py:699 #, fuzzy, python-format msgid "Destroying %s" msgstr "Apisańnie: %s" #: gajim/groupchat_control.py:700 msgid "" "You are going to remove this room permanently.\n" "You may specify a reason below:" msgstr "" #: gajim/groupchat_control.py:702 msgid "You may also enter an alternate venue:" msgstr "" #: gajim/groupchat_control.py:880 msgid "Insert Nickname" msgstr "Ustaŭ mianušku" #: gajim/groupchat_control.py:1062 gajim/chat_control.py:803 #, fuzzy msgid "and authenticated" msgstr "Užyvaj aŭtaryzacyju" #: gajim/groupchat_control.py:1066 gajim/chat_control.py:807 #, fuzzy msgid "and NOT authenticated" msgstr "Užyvaj aŭtaryzacyju" #: gajim/groupchat_control.py:1070 gajim/chat_control.py:811 #, python-format msgid "%(type)s encryption is active %(authenticated)s." msgstr "" #: gajim/groupchat_control.py:1113 #, fuzzy msgid "Conversation with " msgstr "Žurnał razmoŭ" #: gajim/groupchat_control.py:1115 #, fuzzy msgid "Continued conversation" msgstr "Złučeńnie" #: gajim/groupchat_control.py:1473 #, fuzzy, python-format msgid "%(nick)s has set the subject to %(subject)s" msgstr "%(nick)s vypchnuty z pakoju: %(reason)s" #: gajim/groupchat_control.py:1496 gajim/groupchat_control.py:1781 msgid "Any occupant is allowed to see your full JID" msgstr "" #: gajim/groupchat_control.py:1499 msgid "Room now shows unavailable members" msgstr "" #: gajim/groupchat_control.py:1501 msgid "Room now does not show unavailable members" msgstr "" #: gajim/groupchat_control.py:1503 msgid "A setting not related to privacy has been changed" msgstr "" #: gajim/groupchat_control.py:1507 msgid "Room logging is now enabled" msgstr "" #: gajim/groupchat_control.py:1509 msgid "Room logging is now disabled" msgstr "" #: gajim/groupchat_control.py:1511 msgid "Room is now non-anonymous" msgstr "" #: gajim/groupchat_control.py:1514 msgid "Room is now semi-anonymous" msgstr "" #: gajim/groupchat_control.py:1517 msgid "Room is now fully anonymous" msgstr "" #: gajim/groupchat_control.py:1557 gajim/chat_control.py:1268 #, python-format msgid "Pong! (%s s.)" msgstr "" #: gajim/groupchat_control.py:1774 gajim/groupchat_control.py:2398 #: gajim/roster_window.py:3129 gajim/gui_interface.py:621 #, fuzzy, python-format msgid "%(jid)s has been invited in this room" msgstr "%(who)s vypchnuŭ %(nick)s: %(reason)s" #: gajim/groupchat_control.py:1786 msgid "Room logging is enabled" msgstr "" #: gajim/groupchat_control.py:1788 #, fuzzy msgid "A new room has been created" msgstr "Aŭtaryzacyja anulavanaja" #: gajim/groupchat_control.py:1791 msgid "The server has assigned or modified your roomnick" msgstr "" #: gajim/groupchat_control.py:1797 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s vypchnuty z pakoju: %(reason)s" #: gajim/groupchat_control.py:1800 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(who)s vypchnuŭ %(nick)s: %(reason)s" #: gajim/groupchat_control.py:1809 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s zablakavany: %(reason)s" #: gajim/groupchat_control.py:1812 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(who)s zablakavaŭ %(nick)s: %(reason)s" #: gajim/groupchat_control.py:1823 gajim/groupchat_control.py:1907 #, python-format msgid "You are now known as %s" msgstr "Ciabie ciapier viedajuć jak %s" #: gajim/groupchat_control.py:1861 gajim/groupchat_control.py:1866 #: gajim/groupchat_control.py:1872 #, fuzzy, python-format msgid "%(nick)s has been removed from the room (%(reason)s)" msgstr "%(who)s vypchnuŭ %(nick)s: %(reason)s" #: gajim/groupchat_control.py:1863 #, fuzzy msgid "affiliation changed" msgstr "Suviaź: " #: gajim/groupchat_control.py:1868 msgid "room configuration changed to members-only" msgstr "" #: gajim/groupchat_control.py:1874 msgid "system shutdown" msgstr "" #: gajim/groupchat_control.py:1928 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s by %(actor)s" msgstr "" #: gajim/groupchat_control.py:1932 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s" msgstr "" #: gajim/groupchat_control.py:1947 #, fuzzy, python-format msgid "** Role of %(nick)s has been set to %(role)s by %(actor)s" msgstr "%(who)s vypchnuŭ %(nick)s: %(reason)s" #: gajim/groupchat_control.py:1951 #, fuzzy, python-format msgid "** Role of %(nick)s has been set to %(role)s" msgstr "%(nick)s vypchnuty z pakoju: %(reason)s" #: gajim/groupchat_control.py:1981 #, python-format msgid "%s has left" msgstr "%s vyjšaŭ" #: gajim/groupchat_control.py:1986 #, python-format msgid "%s has joined the group chat" msgstr "%s dałučyŭsia da pakoju" #: gajim/groupchat_control.py:2329 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Ty sapraŭdy chočaš pakinuć pakoj \"%s\"?" #: gajim/groupchat_control.py:2331 msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "Kali začyniš hetaje akno, adłučyśsia ad pakoju." #: gajim/groupchat_control.py:2550 #, python-format msgid "Kicking %s" msgstr "Vypichvajecca %s" #: gajim/groupchat_control.py:2551 gajim/groupchat_control.py:2847 msgid "You may specify a reason below:" msgstr "Možaš akreślić pryčynu nižej:" #: gajim/groupchat_control.py:2846 #, python-format msgid "Banning %s" msgstr "Blakavańnie %s" #: gajim/chat_control.py:328 gajim/chat_control.py:332 #, fuzzy msgid "Jingle File Transfer" msgstr "Pieradačy fajłaŭ" #: gajim/chat_control.py:334 #, fuzzy msgid "No File Transfer available" msgstr "Pieradačy fajłaŭ" #: gajim/chat_control.py:395 #, fuzzy msgid "Show a list of formattings" msgstr "Klikni, kab ustavić smajlik (Alt+M)" #: gajim/chat_control.py:399 msgid "Formatting is not available so long as GPG is active" msgstr "" #: gajim/chat_control.py:402 #, fuzzy msgid "This contact does not support HTML" msgstr "Śpis dziejnych, skončanych i spynienych pieradačaŭ fajłaŭ" #: gajim/chat_control.py:514 #, python-format msgid "%(type)s state : %(state)s, reason: %(reason)s" msgstr "" #: gajim/chat_control.py:655 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s z pakoju %(room_name)s" #: gajim/chat_control.py:903 msgid "Session negotiation cancelled" msgstr "" #: gajim/chat_control.py:913 msgid "This session WILL be archived on server" msgstr "" #: gajim/chat_control.py:915 msgid "This session WILL NOT be archived on server" msgstr "" #: gajim/chat_control.py:924 #, fuzzy msgid "This session is encrypted" msgstr "[Hetaje paviedamleńnie zašyfravanaje]" #: gajim/chat_control.py:927 msgid " and WILL be logged" msgstr "" #: gajim/chat_control.py:929 msgid " and WILL NOT be logged" msgstr "" #: gajim/chat_control.py:934 msgid "" "Remote contact's identity not verified. Click the shield button for more " "details." msgstr "" #: gajim/chat_control.py:936 #, fuzzy msgid "E2E encryption disabled" msgstr "Šyfravańnie adklučanaje" #: gajim/chat_control.py:1235 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Tolki što atrymanaje paviedamleńnie ad \"%s\"" #: gajim/chat_control.py:1237 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." msgstr "" "Kali ty začyniš hetuju kartku i kali žurnały nie vieducca, to hetaje " "paviedamleńnie źniknie nazaŭždy." #: gajim/chat_control.py:1380 #, fuzzy, python-format msgid "" "Subject: %(subject)s\n" "%(message)s" msgstr "" "Tema: %s\n" "%s" #: gajim/chat_control.py:1494 gajim/gui_interface.py:1197 #, python-format msgid "" "Unable to decrypt message from %s\n" "It may have been tampered with." msgstr "" #: gajim/chat_control.py:1532 #, fuzzy, python-format msgid "%(name)s is now %(status)s" msgstr "%(nick)s maje ciapier status %(status)s" #: gajim/chat_control.py:1591 #, fuzzy msgid "File transfer" msgstr "Pieradačy fajłaŭ" #: gajim/chat_control.py:1594 #, fuzzy msgid "Size" msgstr "Pamier: %s" #: gajim/chat_control.py:1596 #, fuzzy msgid "Accept" msgstr "Dazvol" #: gajim/chat_control.py:1650 gajim/disco.py:1753 msgid "_Join" msgstr "_Dałučysia" #: gajim/chat_control.py:1669 gajim/roster_window.py:1991 #: gajim/gui_interface.py:1013 #, fuzzy msgid "Remote contact stopped transfer" msgstr "Vydalaje kantakt sa śpisu" #: gajim/chat_control.py:1671 gajim/roster_window.py:1993 #: gajim/gui_interface.py:1016 #, fuzzy msgid "Error opening file" msgstr "Pamyłka adčytańnia fajłu:" #: gajim/roster_window.py:273 gajim/roster_window.py:1074 msgid "Merged accounts" msgstr "Abjadnanyja konty" #: gajim/roster_window.py:857 gajim/roster_window.py:1757 #: gajim/roster_window.py:1759 gajim/roster_window.py:2602 #: gajim/roster_window.py:5125 gajim/message_window.py:519 #: gajim/common/contacts.py:133 gajim/common/commands.py:230 #: gajim/common/helpers.py:95 msgid "Groupchats" msgstr "Pakoji" #: gajim/roster_window.py:896 gajim/roster_window.py:1665 #: gajim/roster_window.py:1698 gajim/roster_window.py:1749 #: gajim/roster_window.py:1751 gajim/roster_window.py:1912 #: gajim/roster_window.py:2575 gajim/roster_window.py:5155 gajim/disco.py:130 #: gajim/disco.py:131 gajim/disco.py:1460 gajim/common/contacts.py:135 #: gajim/common/contacts.py:378 gajim/common/helpers.py:95 msgid "Transports" msgstr "Transparty" #: gajim/roster_window.py:2045 #, fuzzy msgid "Authorization sent" msgstr "Aŭtaryzacyja dasłanaja" #: gajim/roster_window.py:2046 #, fuzzy, python-format msgid "\"%s\" will now see your status." msgstr "Ciapier \"%s\" budzie viedać tvoj status." #: gajim/roster_window.py:2069 msgid "Subscription request has been sent" msgstr "Zapyt aŭtaryzacyi dasłany" #: gajim/roster_window.py:2070 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Kali \"%s\" zadavolić tvoj zapyt, ty zmožaš bačyć jahony status." #: gajim/roster_window.py:2084 #, fuzzy msgid "Authorization removed" msgstr "Aŭtaryzacyja anulavanaja" #: gajim/roster_window.py:2085 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Ciapier \"%s\" budzie zaŭsiody bačyć ciabie jak adłučanaha." #: gajim/roster_window.py:2109 #, fuzzy msgid "OpenPGP is not usable" msgstr "Nielha vykarystać OpenPGP na hetym kamputary" #: gajim/roster_window.py:2110 #, python-format msgid "" "Gajim needs python-gnupg >= 0.3.8\n" "Beware there is an incompatible python package called gnupg.\n" "You will be connected to %s without OpenPGP." msgstr "" #: gajim/roster_window.py:2318 gajim/roster_window.py:3625 msgid "You are participating in one or more group chats" msgstr "Ty znachodziśsia ŭ adnym ci niekalkich pakojach" #: gajim/roster_window.py:2319 gajim/roster_window.py:3626 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" msgstr "" "Źmianiŭšy status na niabačny, ty adłučyśsia ad hetych pakojaŭ. Ty sapraŭdy " "chočaš stać niabačnym?" #: gajim/roster_window.py:2346 msgid "desync'ed" msgstr "" #: gajim/roster_window.py:2416 msgid "Really quit Gajim?" msgstr "" #: gajim/roster_window.py:2417 #, fuzzy msgid "Are you sure you want to quit Gajim?" msgstr "Ty sapraŭdy chočaš pakinuć pakoj \"%s\"?" #: gajim/roster_window.py:2418 msgid "Always close Gajim" msgstr "" #: gajim/roster_window.py:2505 #, fuzzy msgid "You have running file transfers" msgstr "Anuluj pieradaču fajła" #: gajim/roster_window.py:2506 msgid "" "If you quit now, the file(s) being transferred will be stopped. Do you still " "want to quit?" msgstr "" #: gajim/roster_window.py:2537 gajim/roster_window.py:2828 msgid "You have unread messages" msgstr "Jość niečytanyja paviedamleńni" #: gajim/roster_window.py:2538 #, fuzzy msgid "" "Messages will only be available for reading them later if you have history " "enabled and contact is in your roster." msgstr "" "Paviedamleńni možna budzie pračytać paźniej, kali ŭklučana viadzieńnie " "žurnałaŭ razmoŭ." #: gajim/roster_window.py:2829 msgid "You must read them before removing this transport." msgstr "Musiš pračytać ich pierad vydaleńniem hetaha transpartu." #: gajim/roster_window.py:2832 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Transpart \"%s\" budzie vydaleny" #: gajim/roster_window.py:2833 msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." msgstr "" "Ty bolš nia zmožaš kamunikavać z kantaktami, jakija karystajucca hetym " "transpartam." #: gajim/roster_window.py:2836 msgid "Transports will be removed" msgstr "Transparty buduć vydalenyja" #: gajim/roster_window.py:2841 #, fuzzy, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " "these transports: %s" msgstr "" "Ty bolš nia zmožaš kamunikavać z kantaktami, jakija karystajucca hetymi " "transpartami:%s" #: gajim/roster_window.py:2892 #, fuzzy msgid "You are about to block a contact. Are you sure you want to continue?" msgstr "Stvarajecca metakantakt. Ty sapraŭdy chočaš praciahnuć?" #: gajim/roster_window.py:2894 msgid "" "This contact will see you offline and you will not receive messages it sends " "you." msgstr "" #: gajim/roster_window.py:2934 msgid "Rename Contact" msgstr "Źmiani nazvu kantaktu" #: gajim/roster_window.py:2935 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Vyznač novuju mianušku dla kantaktu %s." #: gajim/roster_window.py:2942 msgid "Rename Group" msgstr "Źmiani nazvu hrupy" #: gajim/roster_window.py:2943 #, python-format msgid "Enter a new name for group %s" msgstr "Vyznač novuju nazvu dla hrupy %s" #: gajim/roster_window.py:2988 msgid "Remove Group" msgstr "Vydal hrupu" #: gajim/roster_window.py:2989 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Chočaš vydalić hrupu %s sa śpisu kantaktaŭ?" #: gajim/roster_window.py:2990 #, fuzzy msgid "Also remove all contacts in this group from your roster" msgstr "Vydal taksama ŭsie kantakty z hetaj hrupy sa śpisu kantaktaŭ" #: gajim/roster_window.py:3029 msgid "Assign OpenPGP Key" msgstr "Pryznač kluč OpenPGP" #: gajim/roster_window.py:3030 msgid "Select a key to apply to the contact" msgstr "Abiary kluč dla hetaha kantaktu" #: gajim/roster_window.py:3436 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Kantakt \"%s\" budzie vydaleny z tvajho śpisu kantaktaŭ" #: gajim/roster_window.py:3438 #, python-format msgid "You are about to remove \"%(name)s\" (%(jid)s) from your roster.\n" msgstr "" #: gajim/roster_window.py:3443 #, fuzzy msgid "" "By removing this contact you also remove authorization resulting in them " "always seeing you as offline." msgstr "" "Vydaliŭšy hetyja kantakty:%s,\n" "ty taksama anuluješ ichnyja aŭtaryzacyi. U vyniku jany zaŭsiody buduć bačyć " "ciabie adłučanym." #: gajim/roster_window.py:3449 #, fuzzy msgid "Do you want to continue?" msgstr "Što chočaš zrabić?" #: gajim/roster_window.py:3453 #, fuzzy msgid "" "By removing this contact you also by default remove authorization resulting " "in them always seeing you as offline." msgstr "" "Vydaliŭšy hety kantakt, ty zmoŭčana taksama anuluješ jahonuju aŭtaryzacyju. " "U vyniku jon zaŭsiody budzie bačyć ciabie adłučanym." #: gajim/roster_window.py:3456 msgid "I want this contact to know my status after removal" msgstr "Ja chaču, kab hety kantakt moh bačyć moj status paśla vydaleńnia" #: gajim/roster_window.py:3460 msgid "Contacts will be removed from your roster" msgstr "Kantakty buduć vydalenyja z tvajho śpisu kantaktaŭ" #: gajim/roster_window.py:3465 #, python-format msgid "" "By removing these contacts:%s\n" "you also remove authorization resulting in them always seeing you as offline." msgstr "" "Vydaliŭšy hetyja kantakty:%s,\n" "ty taksama anuluješ ichnyja aŭtaryzacyi. U vyniku jany zaŭsiody buduć bačyć " "ciabie adłučanym." #: gajim/roster_window.py:3523 #, fuzzy msgid "" "You are about to send a custom status. Are you sure you want to continue?" msgstr "Stvarajecca metakantakt. Ty sapraŭdy chočaš praciahnuć?" #: gajim/roster_window.py:3525 #, python-format msgid "" "This contact will temporarily see you as %(status)s, but only until you " "change your status. Then they will see your global status." msgstr "" #: gajim/roster_window.py:3544 msgid "No account available" msgstr "Konty niedastupnyja" #: gajim/roster_window.py:3545 msgid "You must create an account before you can chat with other contacts." msgstr "Treba stvaryć kont, kab razmaŭlać ź inšymi kantaktami." #: gajim/roster_window.py:3676 gajim/gui_interface.py:2065 #: gajim/dialog_messages.py:64 msgid "You cannot join a group chat while you are invisible" msgstr "Niemahčyma dałučycca da pakoju, kali ty niabačny" #: gajim/roster_window.py:4178 msgid "Metacontacts storage not supported by your server" msgstr "Tvoj server nie padtrymvaje zachoŭvańnia metakantaktaŭ" #: gajim/roster_window.py:4180 #, fuzzy msgid "" "Your server does not support storing metacontacts information. So this " "information will not be saved on next reconnection." msgstr "" "Tvoj server nie padtrymvaje zachoŭvańnia metakantaktaŭ. Tamu hetyja źviestki " "nia buduć dastupnyja pry nastupnym złučeńni." #: gajim/roster_window.py:4276 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "Stvarajecca metakantakt. Ty sapraŭdy chočaš praciahnuć?" #: gajim/roster_window.py:4278 #, fuzzy msgid "" "Metacontacts are a way to regroup several contacts in one line. Generally it " "is used when the same person has several XMPP accounts or transport accounts." msgstr "" "Metakantakty jość sposabam hrupavańnia niekalkich kantaktaŭ u adnum radku. " "Zvyčajna hetaja mažlivaść vykarystoŭvajecca, kali adzin čałaviek " "karystajecca niekalkimi kontami Jabber albo niekalkimi kontami z transpartaŭ." #: gajim/roster_window.py:4400 #, fuzzy msgid "Invalid file URI:" msgstr "Niapravilny fajł" #: gajim/roster_window.py:4412 #, fuzzy, python-format msgid "Do you want to send this file to %s:" msgid_plural "Do you want to send these files to %s:" msgstr[0] "%s choča dasłać tabie fajł:" msgstr[1] "%s choča dasłać tabie fajł:" msgstr[2] "%s choča dasłać tabie fajł:" #: gajim/roster_window.py:4552 #, fuzzy, python-format msgid "Send %(from)s to %(to)s" msgstr "Dašli %s" #: gajim/roster_window.py:4565 #, fuzzy, python-format msgid "Make %s first contact" msgstr "Zrabi z %s i %s metakantakt" #: gajim/roster_window.py:4570 #, fuzzy, python-format msgid "Make %(contact1)s and %(contact2)s metacontacts" msgstr "Zrabi z %s i %s metakantakt" #: gajim/roster_window.py:4951 gajim/roster_window.py:5049 msgid "_Change Status Message" msgstr "Ź_miani paviedamleńnie statusu" #: gajim/roster_window.py:4971 #, fuzzy msgid "Publish Tune" msgstr "_Абнавіць" #: gajim/roster_window.py:4982 #, fuzzy msgid "Publish Location" msgstr "_Абнавіць" #: gajim/roster_window.py:4994 #, fuzzy msgid "Configure Services…" msgstr "_Šukaj servisy..." #: gajim/roster_window.py:5127 msgid "_Maximize All" msgstr "" #: gajim/roster_window.py:5134 gajim/roster_window.py:5296 msgid "Send Group M_essage" msgstr "_Dašli hrupavoje paviedamleńnie" #: gajim/roster_window.py:5141 msgid "To all users" msgstr "Usim karystalnikam" #: gajim/roster_window.py:5145 msgid "To all online users" msgstr "Usim dałučanym karystalnikam" #: gajim/roster_window.py:5157 gajim/roster_window.py:5302 #: gajim/data/gui/gc_occupants_menu.ui:110 #: gajim/data/gui/contact_context_menu.ui:36 msgid "In_vite to" msgstr "_Zaprasi" #: gajim/roster_window.py:5312 #, fuzzy msgid "_Manage Contacts" msgstr "Źmiani nazvu kantaktu" #: gajim/roster_window.py:5318 #, fuzzy msgid "Edit _Groups…" msgstr "Źmiani _hrupy" #: gajim/roster_window.py:5339 gajim/data/gui/filetransfers.ui:11 #: gajim/data/gui/remove_account_window.ui:137 msgid "_Remove" msgstr "_Vydal" #: gajim/roster_window.py:5377 msgid "_Maximize" msgstr "" #: gajim/roster_window.py:5384 #, fuzzy msgid "_Reconnect" msgstr "Kantakt adłučyŭsia" #: gajim/roster_window.py:5389 gajim/data/gui/gc_control_popup_menu.ui:120 #, fuzzy msgid "_Disconnect" msgstr "Kantakt adłučyŭsia" #: gajim/roster_window.py:5405 gajim/data/gui/gc_occupants_menu.ui:170 #: gajim/data/gui/gc_control_popup_menu.ui:113 #: gajim/data/gui/contact_context_menu.ui:228 msgid "_History" msgstr "_Žurnał razmoŭ" #: gajim/roster_window.py:5481 gajim/data/gui/application_menu.ui:86 msgid "History Manager" msgstr "Kiraŭnik žurnałaŭ" #: gajim/roster_window.py:5489 msgid "_Join New Group Chat" msgstr "_Dałučysia da pakoju" #: gajim/gajim.py:74 #, fuzzy msgid "Show the application's version" msgstr "Pakazvaj _ikonu ŭ poli nahadvańnia" #: gajim/gajim.py:77 #, fuzzy msgid "Show only critical errors" msgstr "Pakazvaj tolki ŭ śpisie _kantaktaŭ" #: gajim/gajim.py:80 msgid "Separate profile files completely (even history db and plugins)" msgstr "" #: gajim/gajim.py:84 msgid "Print XML stanzas and other debug information" msgstr "" #: gajim/gajim.py:88 #, fuzzy msgid "Use defined profile in configuration directory" msgstr "Redaktar dadatkovych naładaŭ" #: gajim/gajim.py:92 #, fuzzy msgid "Set configuration directory" msgstr "Kanfihuracyja pakoju" #: gajim/gajim.py:95 msgid "Configure logging system" msgstr "" #: gajim/gajim.py:98 #, fuzzy msgid "Show all warnings" msgstr "Pakažy ŭsie niahledžanyja _padzieji" #: gajim/gajim.py:101 msgid "Open IPython shell" msgstr "" #: gajim/gajim.py:104 msgid "Pops up a window with the next pending event" msgstr "Adčyniaje akno z nastupnym niečytanym paviedamleńniem" #: gajim/gajim.py:107 gajim/data/gui/shortcuts_window.ui:202 #, fuzzy msgid "Start a new chat" msgstr "Pačni razmovu" #: gajim/gajim.py:180 gajim/gui_interface.py:128 msgid "Database Error" msgstr "" #: gajim/history_sync.py:217 #, fuzzy msgid "How far back do you want to go?" msgstr "Što chočaš zrabić?" #: gajim/history_sync.py:222 msgid "One Month" msgstr "" #: gajim/history_sync.py:223 msgid "Three Months" msgstr "" #: gajim/history_sync.py:224 msgid "One Year" msgstr "" #: gajim/history_sync.py:225 msgid "Everything" msgstr "" #: gajim/history_sync.py:254 #, fuzzy msgid "Connecting..." msgstr "Dałučajusia" #: gajim/history_sync.py:266 #, fuzzy, python-format msgid "%(received)s of %(max)s" msgstr "Pieradača fajłu %(filename)s ad %(name)s spyniena." #: gajim/history_sync.py:270 #, fuzzy, python-format msgid "Downloaded %s Messages" msgstr "%d niečytanaje paviedamleńnie" #: gajim/history_sync.py:290 #, python-brace-format msgid "" "\n" " Finshed synchronising your History.\n" " {received} Messages downloaded.\n" " " msgstr "" #: gajim/history_sync.py:297 msgid "" "\n" " Gajim is fully synchronised\n" " with the Archive.\n" " " msgstr "" #: gajim/history_sync.py:304 msgid "" "\n" " There is already a synchronisation in\n" " progress. Please try later.\n" " " msgstr "" #: gajim/config.py:150 gajim/config.py:156 gajim/config.py:616 #: gajim/data/gui/preferences_window.ui:68 #: gajim/data/gui/preferences_window.ui:85 msgid "Disabled" msgstr "Adklučana" #: gajim/config.py:411 gajim/config.py:415 gajim/config.py:1942 msgid "Default" msgstr "Zmoŭčany" #: gajim/config.py:1128 msgid "status message title" msgstr "zahałovak statusu" #: gajim/config.py:1129 msgid "status message text" msgstr "tekst paviedamleńnia statusu" #: gajim/config.py:1517 #, python-format msgid "Edit %s" msgstr "Źmiani %s" #: gajim/config.py:1519 #, python-format msgid "Register to %s" msgstr "Zarehistrujsia na %s" #: gajim/config.py:1555 msgid "Ban List" msgstr "Śpis zablakavanych kantaktaŭ" #: gajim/config.py:1556 msgid "Member List" msgstr "Śpis udzielnikaŭ" #: gajim/config.py:1556 msgid "Owner List" msgstr "Śpis ułaśnikaŭ" #: gajim/config.py:1557 msgid "Administrator List" msgstr "Śpis administrataraŭ" #: gajim/config.py:1631 msgid "Reason" msgstr "Pryčyna" #: gajim/config.py:1638 msgid "Nick" msgstr "Mianuška" #: gajim/config.py:1644 msgid "Role" msgstr "Funkcyja" #: gajim/config.py:1670 #, fuzzy msgid "Banning…" msgstr "Blakavańnie..." #: gajim/config.py:1672 msgid "" "Whom do you want to ban?\n" "\n" msgstr "" "Kaho chočaš zablakavać?\n" "\n" #: gajim/config.py:1674 #, fuzzy msgid "Adding Member…" msgstr "Dadajecca ŭdzielnik..." #: gajim/config.py:1675 msgid "" "Whom do you want to make a member?\n" "\n" msgstr "" "Kaho chočaš zrabić udzielnikam?\n" "\n" #: gajim/config.py:1677 #, fuzzy msgid "Adding Owner…" msgstr "Dadajecca ŭłaśnik..." #: gajim/config.py:1678 msgid "" "Whom do you want to make an owner?\n" "\n" msgstr "" "Kaho chočaš zrabić ułaśnikam?\n" "\n" #: gajim/config.py:1680 #, fuzzy msgid "Adding Administrator…" msgstr "Dadajecca administratar..." #: gajim/config.py:1681 msgid "" "Whom do you want to make an administrator?\n" "\n" msgstr "" "Kaho chočaš zrabić administrataram?\n" "\n" #: gajim/config.py:1682 #, fuzzy msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" "2. user@domain (any resource matches).\n" "3. domain/resource (only that resource matches).\n" "4. domain (the domain itself matches, as does any user@domain,\n" "domain/resource, or address containing a subdomain)." msgstr "" "Mahčymyja varyjanty:\n" "1. karystalnik@damen/krynica (tolki hetaja krynica).\n" "2. karystalnik@damen (usiakaja krynica).\n" "3. damen/krynica (tolki hetaja krynica).\n" "4. damen (adpaviadaje damen, jak karystalnik@damen,\n" "damen/krynica ci paddamen)." #: gajim/config.py:1783 #, python-format msgid "Removing %s account" msgstr "Vydalajecca kont %s" #: gajim/config.py:1798 #, fuzzy msgid "Account is disabled" msgstr "Šyfravańnie adklučanaje" #: gajim/config.py:1799 msgid "To unregister from a server, account must be enabled." msgstr "" #: gajim/config.py:1813 gajim/gui_interface.py:314 gajim/gui_interface.py:748 msgid "Password Required" msgstr "Vymahaje parolu" #: gajim/config.py:1814 gajim/gui_interface.py:733 #, python-format msgid "Enter your password for account %s" msgstr "Uviadzi parol dla kontu %s" #: gajim/config.py:1815 gajim/gui_interface.py:748 msgid "Save password" msgstr "Zachavaj parol" #: gajim/config.py:1826 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Kont \"%s\" dałučany da servera" #: gajim/config.py:1827 msgid "If you remove it, the connection will be lost." msgstr "Kali ty vydališ jaho, złučeńnie razarviecca." #: gajim/config.py:1842 #, fuzzy, python-format msgid "Connection to server %s failed" msgstr "Niemahvyma dałučycca" #: gajim/config.py:1843 #, fuzzy msgid "What would you like to do?" msgstr "Što chočaš zrabić?" #: gajim/config.py:1844 #, fuzzy msgid "Remove only from Gajim" msgstr "Vydal kont _tolki dla Gajim" #: gajim/config.py:1845 msgid "Don't remove anything. I'll try again later" msgstr "" #: gajim/config.py:1942 msgid "?print_status:All" msgstr "?print_status:Usie" #: gajim/config.py:1943 msgid "Enter and leave only" msgstr "Tolki ŭvachod i vychad" #: gajim/config.py:1944 msgid "?print_status:None" msgstr "?print_status:Niama" #: gajim/config.py:2010 msgid "New Group Chat" msgstr "Novaja hrupavaja razmova" #: gajim/config.py:2046 msgid "This bookmark has invalid data" msgstr "Hetaja zakładka źmiaščaje niapravilnyja źviestki" #: gajim/config.py:2047 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "" "Kali łaska, pravier, ci vyznačanyja pali servera i pakoju, albo vydal hetuju " "zakładku." #: gajim/config.py:2170 gajim/config.py:2186 gajim/config.py:2197 #: gajim/config.py:2225 #, fuzzy msgid "Character not allowed" msgstr "Mianuška nie dazvolenaja: %s" #: gajim/config.py:2185 gajim/config.py:2196 gajim/config.py:2475 #, fuzzy msgid "Invalid server" msgstr "Niapravilnaje imia karystalnika" #: gajim/config.py:2224 #, fuzzy msgid "Invalid room" msgstr "Niapravilny zapis" #: gajim/config.py:2389 msgid "Account has been added successfully" msgstr "Kont paśpiachova dadany" #: gajim/config.py:2390 gajim/config.py:2396 #, fuzzy msgid "" "You can set advanced account options by pressing the Advanced button, or " "later by choosing the Accounts menu item under the Edit menu from the main " "window." msgstr "" "Možaš źmianić dadatkovyja nałady kontu, nacisnuŭšy zaraz knopku \"Dadatkovyja" "\", albo paźniej, abraŭšy \"Źmianić\"->\"Konty\" ŭ menu hałoŭnaha akna." #: gajim/config.py:2395 msgid "Your new account has been created successfully" msgstr "Novy kont paśpiachova stvorany" #: gajim/config.py:2433 msgid "Invalid username" msgstr "Niapravilnaje imia karystalnika" #: gajim/config.py:2435 msgid "You must provide a username to configure this account." msgstr "Treba vyznačyć imia karystalnika, kab skanfihuravać hety kont." #: gajim/config.py:2476 #, fuzzy msgid "Please provide a server on which you want to register." msgstr "Kali łaska, vyznač dla siabie novuju mianušku:" #: gajim/config.py:2499 msgid "Invalid entry" msgstr "Niapravilny zapis" #: gajim/config.py:2500 msgid "Custom port must be a port number." msgstr "Abrany port musić być numeram portu." #: gajim/config.py:2532 gajim/gui_interface.py:1360 #, fuzzy msgid "Certificate Already in File" msgstr "Kantakt užo jość u śpisie kantaktaŭ" #: gajim/config.py:2533 gajim/gui_interface.py:1361 #, python-format msgid "This certificate is already in file %s, so it's not added again." msgstr "" #: gajim/config.py:2626 #, python-format msgid "" "Security Warning\n" "\n" "The authenticity of the %(hostname)s SSL certificate could be invalid.\n" "SSL Error: %(error)s\n" "Do you still want to connect to this server?" msgstr "" #: gajim/config.py:2632 #, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA-1 fingerprint of the certificate:\n" "%(sha1)s\n" "SHA-256 fingerprint of the certificate:\n" "%(sha256)s" msgstr "" #: gajim/config.py:2666 gajim/config.py:2700 msgid "An error occurred during account creation" msgstr "Adbyłasia pamyłka padčas stvareńnia kontu" #: gajim/config.py:2763 msgid "Account name is in use" msgstr "Nazva kontu ŭžo vykarystoŭvajecca" #: gajim/config.py:2764 msgid "You already have an account using this name." msgstr "Kont z takoj nazvaj užo isnuje." #: gajim/config.py:2896 msgid "PEP node was not removed" msgstr "" #: gajim/config.py:2897 #, python-format msgid "PEP node %(node)s was not removed: %(message)s" msgstr "" #: gajim/config.py:2925 #, fuzzy, python-format msgid "Configure %s" msgstr "_Praciahni" #: gajim/config.py:2942 gajim/plugins/gui.py:95 msgid "Active" msgstr "Dziejny" #: gajim/config.py:2950 msgid "Event" msgstr "Padzieja" #: gajim/config.py:2984 #, fuzzy msgid "Attention Message Received" msgstr "Atrymanaje pieršaje paviedamleńnie" #: gajim/config.py:2985 msgid "First Message Received" msgstr "Atrymanaje pieršaje paviedamleńnie" #: gajim/config.py:2986 #, fuzzy msgid "Next Message Received Focused" msgstr "Atrymanaje novaje paviedamleńnie" #: gajim/config.py:2988 #, fuzzy msgid "Next Message Received Unfocused" msgstr "Atrymanaje novaje paviedamleńnie" #: gajim/config.py:2989 msgid "Contact Connected" msgstr "Kantakt dałučyŭsia" #: gajim/config.py:2990 msgid "Contact Disconnected" msgstr "Kantakt adłučyŭsia" #: gajim/config.py:2991 msgid "Message Sent" msgstr "Paviedamleńnie dasłanaje" #: gajim/config.py:2992 msgid "Group Chat Message Highlight" msgstr "Padśviatleńnie paviedamleńnia ŭ pakoji" #: gajim/config.py:2993 msgid "Group Chat Message Received" msgstr "Novaje paviedamleńnie ŭ pakoji" #: gajim/tooltips.py:240 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s hetaha pakoju" #: gajim/tooltips.py:269 gajim/common/helpers.py:473 msgid "?Group Chat Contact Affiliation:None" msgstr "?Suviaź udzielnikaŭ pakoju:Niama" #: gajim/tooltips.py:271 gajim/common/helpers.py:479 msgid "Member" msgstr "Udzielnik" #: gajim/tooltips.py:273 gajim/common/helpers.py:477 msgid "Administrator" msgstr "Administratar" #: gajim/tooltips.py:275 gajim/common/helpers.py:475 msgid "Owner" msgstr "Ułaśnik" #: gajim/tooltips.py:433 msgid " [blocked]" msgstr "" #: gajim/tooltips.py:437 msgid " [minimized]" msgstr "" #: gajim/tooltips.py:609 #, fuzzy msgid "Connected" msgstr "Złučeńnie" #: gajim/tooltips.py:611 #, fuzzy msgid "Disconnected" msgstr "Kantakt adłučyŭsia" #: gajim/tooltips.py:660 #, fuzzy msgid "?Noun:Download" msgstr "Ściahni" #: gajim/tooltips.py:666 #, fuzzy msgid "?Noun:Upload" msgstr "Zaciahni na server" #: gajim/tooltips.py:673 msgid "Type: " msgstr "Typ: " #: gajim/tooltips.py:679 msgid "Transferred: " msgstr "Pierasłany: " #: gajim/tooltips.py:682 gajim/tooltips.py:699 msgid "Not started" msgstr "Nie pačata" #: gajim/tooltips.py:684 msgid "Stopped" msgstr "Spyniena" #: gajim/tooltips.py:686 gajim/tooltips.py:689 msgid "Completed" msgstr "Zavieršana" #: gajim/tooltips.py:692 msgid "?transfer status:Paused" msgstr "?status pieradačy:Prypyniena" #: gajim/tooltips.py:695 msgid "Stalled" msgstr "Zatrymana" #: gajim/tooltips.py:697 msgid "Transferring" msgstr "Pieradajecca" #: gajim/tooltips.py:700 msgid "Status: " msgstr "Status: " #: gajim/tooltips.py:732 gajim/common/helpers.py:389 #, fuzzy msgid "?user status:Available" msgstr "?status pieradačy:Prypyniena" #: gajim/tooltips.py:734 gajim/common/helpers.py:384 msgid "Free for Chat" msgstr "Achvotna parazmaŭlaju" #: gajim/tooltips.py:736 gajim/common/commands.py:117 #: gajim/common/helpers.py:396 #: gajim/command_system/implementation/standard.py:138 msgid "Away" msgstr "Adyjšoŭ" #: gajim/tooltips.py:738 gajim/common/helpers.py:374 msgid "Busy" msgstr "Zaniaty" #: gajim/tooltips.py:740 gajim/common/helpers.py:379 msgid "Not Available" msgstr "Niedastupny" #: gajim/tooltips.py:742 gajim/common/helpers.py:401 msgid "Offline" msgstr "Adłučany" #: gajim/advanced_configuration_window.py:88 msgid "Activated" msgstr "Dziejny" #: gajim/advanced_configuration_window.py:88 msgid "Deactivated" msgstr "Niadziejny" #: gajim/advanced_configuration_window.py:90 msgid "Boolean" msgstr "Lahičnaja źmiennaja" #: gajim/advanced_configuration_window.py:91 msgid "Integer" msgstr "Cely lik" #: gajim/advanced_configuration_window.py:92 msgid "Text" msgstr "Tekst" #: gajim/advanced_configuration_window.py:93 #: gajim/data/gui/groupchat_control.ui:54 gajim/data/gui/chat_control.ui:334 msgid "Color" msgstr "Koler" #: gajim/advanced_configuration_window.py:104 msgid "Preference Name" msgstr "Nazva nałady" #: gajim/advanced_configuration_window.py:111 msgid "Value" msgstr "Vartaść" #: gajim/advanced_configuration_window.py:120 msgid "Type" msgstr "Typ" #: gajim/advanced_configuration_window.py:176 msgid "(None)" msgstr "(Niama)" #: gajim/advanced_configuration_window.py:307 msgid "Hidden" msgstr "Schavany" #: gajim/logind_listener.py:58 msgid "Machine going to sleep" msgstr "" #: gajim/logind_listener.py:90 msgid "Disconnect from the network" msgstr "" #: gajim/history_window.py:339 #, python-format msgid "Conversation History with %s" msgstr "Žurnał razmoŭ z %s" #: gajim/history_window.py:361 gajim/data/gui/history_window.ui:7 msgid "Conversation History" msgstr "Žurnał razmoŭ" #: gajim/history_window.py:390 gajim/history_window.py:443 msgid "Disk Error" msgstr "" #: gajim/history_window.py:546 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s maje ciapier status %(status)s: %(status_msg)s" #: gajim/history_window.py:557 #, fuzzy, python-format msgid "Error: %s" msgstr "Tekst pamyłki: %s" #: gajim/history_window.py:559 msgid "Error" msgstr "" #: gajim/history_window.py:561 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Dziejny status: %(status)s: %(status_msg)s" #: gajim/history_window.py:564 #, python-format msgid "Status is now: %(status)s" msgstr "Dziejny status: %(status)s" #: gajim/history_window.py:585 gajim/conversation_textview.py:1338 #, python-format msgid "Subject: %s\n" msgstr "Tema: %s\n" #: gajim/statusicon.py:215 #, fuzzy msgid "_Change Status Message…" msgstr "Ź_miani paviedamleńnie statusu" #: gajim/statusicon.py:252 gajim/statusicon.py:302 gajim/statusicon.py:309 #, python-format msgid "using account %s" msgstr "praz kont %s" #: gajim/statusicon.py:319 #, fuzzy msgid "_Manage Bookmarks…" msgstr "Kiruj zakładkami" #: gajim/statusicon.py:332 #, fuzzy msgid "Hide _Roster" msgstr "Niama ŭ śpisie kantaktaŭ" #: gajim/statusicon.py:336 msgid "Show _Roster" msgstr "Pakažy _śpis kantaktaŭ" #: gajim/statusicon.py:344 msgid "Hide this menu" msgstr "Schavaj hetaje menu" #: gajim/dataforms_widget.py:587 #, fuzzy msgid "Unable to load image" msgstr "Niemahčyma adčytać modulu idle" #: gajim/dataforms_widget.py:589 #, fuzzy, python-format msgid "Media type not supported: %s" msgstr "Pašyreńnie nie padtrymvajecca" #: gajim/dataforms_widget.py:604 msgid "This field is required" msgstr "" #: gajim/dataforms_widget.py:658 msgid "new@jabber.id" msgstr "" #: gajim/dataforms_widget.py:661 gajim/dataforms_widget.py:663 #, python-format msgid "new%d@jabber.id" msgstr "" #: gajim/server_info.py:130 #, python-format msgid "%(days)s days, %(hours)s hours" msgstr "" #: gajim/server_info.py:187 gajim/accounts_window.py:537 #: gajim/accounts_window.py:638 #, fuzzy msgid "Hostname" msgstr "Nazva hosta: " #: gajim/server_info.py:188 #, fuzzy msgid "Server Software" msgstr "Zdolnaści serveraŭ" #: gajim/server_info.py:189 #, fuzzy msgid "Server Uptime" msgstr "Zapisany ŭ: %s" #: gajim/server_info.py:227 msgid "" "\n" "Disabled in config" msgstr "" #: gajim/disco.py:69 msgid "This service has not yet responded with detailed information" msgstr "Hety servis dahetul nie adkazaŭ na zapyt padrabiaznych źviestak" #: gajim/disco.py:70 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" msgstr "" "Hety servis nia zmoh adkazać na zapyt padrabiaznych źviestak.\n" "Servis sastareły albo złamany" #: gajim/disco.py:129 msgid "Others" msgstr "Inšyja" #: gajim/disco.py:133 msgid "Conference" msgstr "Kanferencyja" #: gajim/disco.py:537 msgid "Without a connection, you can not browse available services" msgstr "Nia možaš prahladać najaŭnyja servisy, nie dałučyŭšysia da servera" #: gajim/disco.py:626 #, python-format msgid "Service Discovery using account %s" msgstr "Prahlad servisaŭ dla kontu %s" #: gajim/disco.py:628 msgid "Service Discovery" msgstr "Prahlad servisaŭ" #: gajim/disco.py:732 msgid "The service could not be found" msgstr "Niemahčyma znajści servis" #: gajim/disco.py:733 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." msgstr "" "Niama servisu z akreślenym adrasam, albo jon nie adkazvaje. Pravier adras i " "pasprabuj znoŭ." #: gajim/disco.py:739 gajim/disco.py:1091 msgid "The service is not browsable" msgstr "Niemahčyma ahladać hety servis" #: gajim/disco.py:740 msgid "This type of service does not contain any items to browse." msgstr "Taki servis nia ŭtrymlivaje elementaŭ dla ahladańnia." #: gajim/disco.py:781 gajim/disco.py:791 #, fuzzy msgid "Invalid Server Name" msgstr "Niapravilnaje imia karystalnika" #: gajim/disco.py:849 #, fuzzy, python-format msgid "Browsing %(address)s using account %(account)s" msgstr "Prahlad %s dla kontu %s" #: gajim/disco.py:896 #, fuzzy msgid "Browse" msgstr "_Prahladaj" #: gajim/disco.py:1092 msgid "This service does not contain any items to browse." msgstr "Hety servis nia ŭtrymlivaje elementaŭ dla prahladu." #: gajim/disco.py:1304 #, fuzzy msgid "Execute Command" msgstr "_Vykanaj zahad..." #: gajim/disco.py:1308 gajim/disco.py:1466 msgid "Re_gister" msgstr "_Zarehistrujsia" #: gajim/disco.py:1317 gajim/data/gui/join_groupchat_window.ui:186 #: gajim/data/gui/join_groupchat_window.ui:325 #, fuzzy msgid "Join" msgstr "_Dałučysia" #: gajim/disco.py:1326 gajim/data/gui/search_window.ui:23 msgid "Search" msgstr "Šukaj" #: gajim/disco.py:1464 msgid "_Edit" msgstr "_Źmianić" #: gajim/disco.py:1507 #, fuzzy, python-format msgid "Scanning %(current)d / %(total)d.." msgstr "Skanavańnie %d / %d.." #: gajim/disco.py:1703 msgid "Users" msgstr "Karystalniki" #: gajim/disco.py:1711 msgid "Description" msgstr "Apisańnie" #: gajim/disco.py:1719 msgid "Id" msgstr "Identyfikatar" #: gajim/disco.py:1749 gajim/data/gui/gc_control_popup_menu.ui:99 #, fuzzy msgid "_Bookmark" msgstr "_Stvary zakładku dla hetaja pakoju" #: gajim/disco.py:1783 msgid "Bookmark already set" msgstr "Zakładka ŭžo dadana" #: gajim/disco.py:1784 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Pakoj \"%s\" užo jość u tvajich zakładkach." #: gajim/disco.py:1794 msgid "Bookmark has been added successfully" msgstr "Zakładka paśpiachova dadanaja" #: gajim/disco.py:1795 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "" "Možaš kiravać svajimi zakładkami praz menu \"Dziejańni\" śpisu kantaktaŭ." #: gajim/disco.py:1987 msgid "Subscribed" msgstr "Aŭtaryzavany" #: gajim/disco.py:1996 #, fuzzy msgid "Node" msgstr "Nijaki" #: gajim/disco.py:2063 msgid "New post" msgstr "Novy zapis" #: gajim/disco.py:2069 msgid "_Subscribe" msgstr "_Aŭtaryzuj" #: gajim/disco.py:2075 msgid "_Unsubscribe" msgstr "_Anuluj aŭtaryzacyju" #: gajim/conversation_textview.py:329 #, fuzzy msgid "" "Text below this line is what has been said since the\n" "last time you paid attention to this group chat" msgstr "" "Tekst pad hetaj rysaj addzialaje toj tekst, jaki ty jašče nia bačyŭ/nia " "bačyła" #: gajim/conversation_textview.py:550 #, fuzzy msgid "_Quote" msgstr "_Skonč pracu" #: gajim/conversation_textview.py:558 #, python-format msgid "_Actions for \"%s\"" msgstr "_Dziejańni dla \"%s\"" #: gajim/conversation_textview.py:572 msgid "Read _Wikipedia Article" msgstr "Pračytać artykuł u _Wikipedii" #: gajim/conversation_textview.py:577 msgid "Look it up in _Dictionary" msgstr "Šukaj u _słoŭniku" #: gajim/conversation_textview.py:594 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "U adrasie słoŭnika nie staje \"%s\", i heta nia Wiktionary" #: gajim/conversation_textview.py:608 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "U adrasie dla web-pošuku nie staje \"%s\"" #: gajim/conversation_textview.py:611 msgid "Web _Search for it" msgstr "_Šukaj u Web" #: gajim/conversation_textview.py:617 msgid "Open as _Link" msgstr "Adčyni jak _spasyłku" #: gajim/conversation_textview.py:847 msgid "URL:" msgstr "" #: gajim/conversation_textview.py:1021 #, fuzzy msgid "Invalid URL" msgstr "Niapravilny JID" #: gajim/conversation_textview.py:1106 msgid "" "Message corrected. Original message:\n" "{}" msgstr "" #: gajim/conversation_textview.py:1250 #, fuzzy, python-format msgid "Yesterday" msgid_plural "%(nb_days)i days ago" msgstr[0] "Učora" msgstr[1] "Učora" msgstr[2] "Učora" #: gajim/message_textview.py:43 #, fuzzy msgid "Write a message.." msgstr "Novaje pryvatnaje paviedamleńnie" #: gajim/message_window.py:245 #, fuzzy msgid "You are going to close several tabs" msgstr "Niama złučeńnia z serveram" #: gajim/message_window.py:246 #, fuzzy msgid "Do you really want to close them all?" msgstr "Sapraŭdy chočaš vydalić zaznačanaje paviedamleńnie?" #: gajim/message_window.py:517 #, fuzzy msgid "?Noun:Chats" msgstr "Pakoji" #: gajim/message_window.py:521 msgid "Private Chats" msgstr "Pryvatnyja razmovy" #: gajim/message_window.py:527 msgid "Messages" msgstr "Paviedamleńni" #: gajim/gui_interface.py:158 gajim/gui_interface.py:329 #: gajim/gui_interface.py:338 gajim/gui_interface.py:345 #: gajim/gui_interface.py:349 gajim/gui_interface.py:352 #: gajim/gui_interface.py:360 msgid "Unable to join group chat" msgstr "Niemahčyma dałučycca da pakoju" #: gajim/gui_interface.py:159 #, fuzzy, python-format msgid "" "Your desired nickname in group chat\n" "%s\n" "is in use or registered by another occupant.\n" "Please specify another nickname below:" msgstr "" "Hetaja mianuška vykarystoŭvajecca ci zarehistravanaja na inšuju asobu.\n" "Kali łaska, vyznač inšuju mianušku nižej:" #: gajim/gui_interface.py:163 msgid "Always use this nickname when there is a conflict" msgstr "" #: gajim/gui_interface.py:181 msgid "Do you accept this request?" msgstr "Prymaješ hety zapyt?" #: gajim/gui_interface.py:183 #, fuzzy, python-format msgid "Do you accept this request on account %s?" msgstr "Prymaješ hety zapyt?" #: gajim/gui_interface.py:186 #, fuzzy, python-format msgid "HTTP (%(method)s) Authorization for %(url)s (ID: %(id)s)" msgstr "Aŭtaryzacyja HTTP (%s) dla %s (id: %s)" #: gajim/gui_interface.py:230 gajim/notify.py:96 msgid "Connection Failed" msgstr "Niemahvyma dałučycca" #: gajim/gui_interface.py:315 #, fuzzy, python-format msgid "A Password is required to join the room %s. Please type it." msgstr "Treba ŭvieści parol, kab dałučycca da pakoju." #: gajim/gui_interface.py:330 #, fuzzy, python-format msgid "%s is full" msgstr "Huki" #: gajim/gui_interface.py:339 #, fuzzy, python-format msgid "You are banned from group chat %s." msgstr "Ty zablakavany ŭ hetym pakoji." #: gajim/gui_interface.py:346 #, fuzzy, python-format msgid "Remote server %s does not exist." msgstr "Takoha pakoju niama." #: gajim/gui_interface.py:350 #, fuzzy, python-format msgid "Group chat %s does not exist." msgstr "Takoha pakoju niama." #: gajim/gui_interface.py:353 #, fuzzy msgid "Group chat creation is not permitted." msgstr "Stvareńnie pakojaŭ abmiežavanaje." #: gajim/gui_interface.py:355 #, fuzzy msgid "Unable to join groupchat" msgstr "Niemahčyma dałučycca da pakoju" #: gajim/gui_interface.py:356 #, fuzzy, python-format msgid "You must use your registered nickname in %s." msgstr "Treba karystacca zarehistravanaj na siabie mianuškaj." #: gajim/gui_interface.py:361 #, fuzzy, python-format msgid "You are not in the members list in groupchat %s." msgstr "Ciabie niama ŭ śpisie ŭdzielnikaŭ." #: gajim/gui_interface.py:455 gajim/gui_interface.py:459 #, fuzzy, python-format msgid "Error %(code)s: %(msg)s" msgstr "%(nickname)s: %(message)s" #: gajim/gui_interface.py:470 gajim/gui_interface.py:486 #: gajim/common/connection_handlers_events.py:1430 #, fuzzy, python-format msgid "error while sending %(message)s ( %(error)s )" msgstr "pamyłka dasyłańnia %s ( %s )" #: gajim/gui_interface.py:513 gajim/notify.py:96 #, fuzzy msgid "Subscription request" msgstr "Zapyt aŭtaryzacyi" #: gajim/gui_interface.py:524 gajim/common/contacts.py:131 #: gajim/common/helpers.py:95 msgid "Observers" msgstr "Naziralniki" #: gajim/gui_interface.py:538 msgid "Authorization accepted" msgstr "Aŭtaryzacyja pryniataja" #: gajim/gui_interface.py:539 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "" "Kantakt \"%s\" aŭtaryzavaŭ ciabie, i ciapier ty možaš bačyć jaho status." #: gajim/gui_interface.py:547 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Kantakt \"%s\" anulavaŭ tvaju aŭtaryzacyju" #: gajim/gui_interface.py:548 msgid "" "You will always see them as offline.\n" "Do you want to remove them from your contact list?" msgstr "" #: gajim/gui_interface.py:570 gajim/notify.py:96 #, fuzzy msgid "Unsubscribed" msgstr "_Anuluj aŭtaryzacyju" #: gajim/gui_interface.py:582 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Niemahčyma złučycca z \"%s\"" #: gajim/gui_interface.py:583 gajim/common/connection.py:1288 #: gajim/common/connection.py:1474 msgid "Check your connection or try again later." msgstr "Pravier złučeńnie albo pasprabuj paźniej." #: gajim/gui_interface.py:641 #, python-format msgid "%(jid)s declined the invitation: %(reason)s" msgstr "" #: gajim/gui_interface.py:645 #, python-format msgid "%(jid)s declined the invitation" msgstr "" #: gajim/gui_interface.py:675 msgid "" "You configured Gajim to use OpenPGP agent, but there is no OpenPGP agent " "running or it returned a wrong passphrase.\n" msgstr "" #: gajim/gui_interface.py:678 gajim/gui_interface.py:686 msgid "You are currently connected without your OpenPGP key." msgstr "Dałučany biez kluča OpenPGP." #: gajim/gui_interface.py:680 #, fuzzy msgid "Wrong passphrase" msgstr "Niapravilny parol" #: gajim/gui_interface.py:685 #, fuzzy msgid "Wrong OpenPGP passphrase" msgstr "Niapravilny parol" #: gajim/gui_interface.py:699 #, fuzzy msgid "Certificate Passphrase Required" msgstr "Musiš vyznačyć parol" #: gajim/gui_interface.py:700 #, fuzzy, python-format msgid "Enter the certificate passphrase for account %s" msgstr "Vyznač parol GPG dla kontu %s." #: gajim/gui_interface.py:723 #, fuzzy msgid "Untrusted OpenPGP key" msgstr "Abiary svoj kluč OpenPGP" #: gajim/gui_interface.py:723 msgid "" "The OpenPGP key used to encrypt this chat is not trusted. Do you really want " "to encrypt this message?" msgstr "" #: gajim/gui_interface.py:769 msgid "" "Please copy / paste the refresh token from the website that has just been " "opened." msgstr "" #: gajim/gui_interface.py:772 msgid "Oauth2 Credentials" msgstr "" #: gajim/gui_interface.py:924 #, python-format msgid "%s wants to send you a file." msgstr "%s choča dasłać tabie fajł." #: gajim/gui_interface.py:1021 gajim/gui_interface.py:1433 msgid "SSL certificate error" msgstr "" #: gajim/gui_interface.py:1038 #, fuzzy msgid "File Transfer Failed" msgstr "Pieradačy fajłaŭ" #: gajim/gui_interface.py:1060 #, fuzzy, python-format msgid "%(filename)s received from %(name)s." msgstr "Pieradača fajłu %(filename)s ad %(name)s spyniena." #: gajim/gui_interface.py:1064 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Pieradača fajłu %(filename)s ad %(name)s spyniena." #: gajim/gui_interface.py:1068 #, fuzzy, python-format msgid "File transfer of %(filename)s from %(name)s failed." msgstr "Pieradača fajłu %(filename)s ad %(name)s spyniena." #: gajim/gui_interface.py:1081 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "Fajł %(filename)s paśpiachova dasłany da %(name)s." #: gajim/gui_interface.py:1085 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "Pieradača fajłu %(filename)s da %(name)s spynienaja." #: gajim/gui_interface.py:1089 #, fuzzy, python-format msgid "File transfer of %(filename)s to %(name)s failed." msgstr "Pieradača fajłu %(filename)s da %(name)s spynienaja." #: gajim/gui_interface.py:1153 #, fuzzy msgid "Choose file to send" msgstr "Abiary fajł dla adsyłańnia..." #: gajim/gui_interface.py:1199 #, fuzzy msgid "Unable to decrypt message" msgstr "Dla kožnaha _paviedamleńnia" #: gajim/gui_interface.py:1211 msgid "Username Conflict" msgstr "Kanflikt imionaŭ karystalnikaŭ" #: gajim/gui_interface.py:1212 msgid "Please type a new username for your local account" msgstr "Kali łaska, akreśli novaje imia karystalnika dla lakalnaha kontu" #: gajim/gui_interface.py:1235 #, fuzzy msgid "Resource Conflict" msgstr "Kanflikt imionaŭ karystalnikaŭ" #: gajim/gui_interface.py:1236 msgid "" "You are already connected to this account with the same resource. Please " "type a new one" msgstr "" #: gajim/gui_interface.py:1293 #, fuzzy, python-format msgid "%s wants to start a voice chat." msgstr "%s choča dasłać tabie fajł." #: gajim/gui_interface.py:1296 #, fuzzy msgid "Voice Chat Request" msgstr "Zapyt na pieradaču fajłu" #: gajim/gui_interface.py:1386 msgid "Error verifying SSL certificate" msgstr "" #: gajim/gui_interface.py:1387 #, python-format msgid "" "There was an error verifying the SSL certificate of your XMPP server: " "%(error)s\n" "Do you still want to connect to this server?" msgstr "" #: gajim/gui_interface.py:1391 #, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA-1 fingerprint of the certificate:\n" "%(sha1)s\n" "SHA256 fingerprint of the certificate:\n" "%(sha256)s" msgstr "" #: gajim/gui_interface.py:1397 msgid "Ignore this error for this certificate." msgstr "" #: gajim/gui_interface.py:1410 msgid "Non Anonymous Server" msgstr "" #: gajim/gui_interface.py:1434 #, python-format msgid "" "It seems the SSL certificate of account %(account)s has changed and is not " "valid or your connection is being compromised.\n" "\n" "Old SHA-1 fingerprint: %(old_sha1)s\n" "Old SHA-256 fingerprint: %(old_sha256)s\n" "\n" "New SHA-1 fingerprint: %(new_sha1)s\n" "New SHA-256 fingerprint: %(new_sha256)s\n" "\n" "Do you still want to connect and update the fingerprint of the certificate?" msgstr "" #: gajim/gui_interface.py:1512 msgid "" "You are about to send your password on an insecure connection. You should " "install PyOpenSSL to prevent that. Are you sure you want to do that?" msgstr "" #: gajim/gui_interface.py:1554 #, fuzzy msgid "" "You are about to send your password unencrypted on an insecure connection. " "Are you sure you want to do that?" msgstr "Stvarajecca metakantakt. Ty sapraŭdy chočaš praciahnuć?" #: gajim/gui_interface.py:1856 #, fuzzy msgid "JID is not a Groupchat" msgstr "Heta nie pakoj" #: gajim/gui_interface.py:2020 #, fuzzy msgid "Emoticons disabled" msgstr "Šyfravańnie adklučanaje" #: gajim/gui_interface.py:2021 msgid "" "Your configured emoticons theme could not be loaded. See the log for more " "details." msgstr "" #: gajim/gui_interface.py:2039 msgid "This is not a group chat" msgstr "Heta nie pakoj" #: gajim/gui_interface.py:2040 #, python-format msgid "" "%(room_jid)s is already in your roster. Please check if %(room_jid)s is a " "correct group chat name. If it is, delete it from your roster and try " "joining the group chat again." msgstr "" #: gajim/gui_interface.py:2418 msgid "Could not save your settings and preferences" msgstr "Niemahčyma zapisać tvaje nałady i opcyi" #: gajim/gui_interface.py:2828 gajim/common/config.py:117 #: gajim/common/config.py:532 gajim/common/optparser.py:343 #: gajim/common/optparser.py:511 gajim/common/optparser.py:534 #, fuzzy msgid "default" msgstr "Zmoŭčany" #: gajim/gui_interface.py:3014 msgid "Passphrase Required" msgstr "Musiš vyznačyć parol" #: gajim/gui_interface.py:3015 #, fuzzy, python-format msgid "Enter OpenPGP key passphrase for key %(keyid)s (account %(account)s)." msgstr "Vyznač parol GPG dla kontu %s." #: gajim/gui_interface.py:3029 #, fuzzy msgid "OpenPGP key expired" msgstr "Vybar kluča OpenPGP" #: gajim/gui_interface.py:3030 #, fuzzy, python-format msgid "" "Your OpenPGP key has expired, you will be connected to %s without OpenPGP." msgstr "Ty dałučyśsia da %s biaz OpenPGP." #: gajim/gui_interface.py:3039 msgid "Wrong Passphrase" msgstr "Niapravilny parol" #: gajim/gui_interface.py:3040 #, fuzzy msgid "Please retype your OpenPGP passphrase or press Cancel." msgstr "Kali łaska, vyznač parol GPG znoŭ albo naciśni knopku \"Anuluj\"." #: gajim/search_window.py:108 msgid "Waiting for results" msgstr "" #: gajim/search_window.py:146 gajim/search_window.py:224 msgid "Error in received dataform" msgstr "" #: gajim/search_window.py:181 gajim/search_window.py:216 msgid "No result" msgstr "" #: gajim/htmltextview.py:559 #, fuzzy msgid "Loading" msgstr "Uvod paviedamleńnia" #: gajim/atom_window.py:123 #, fuzzy, python-format msgid "You have received new entries (and %d not displayed):" msgid_plural "You have received new entries (and %d not displayed):" msgstr[0] "Atrymaŭ novy zapis:" msgstr[1] "Atrymaŭ novy zapis:" msgstr[2] "Atrymaŭ novy zapis:" #: gajim/atom_window.py:128 gajim/data/gui/atom_entry_window.ui:20 msgid "You have received new entry:" msgstr "Atrymaŭ novy zapis:" #: gajim/adhoc_commands.py:111 gajim/data/gui/adhoc_commands_window.ui:9 msgid "Ad-hoc Commands - Gajim" msgstr "Zahady ad-hoc - Gajim" #: gajim/adhoc_commands.py:320 #, fuzzy msgid "Cancel confirmation" msgstr "Źviestki ab kantakcie" #: gajim/adhoc_commands.py:321 msgid "" "You are in process of executing command. Do you really want to cancel it?" msgstr "" #: gajim/adhoc_commands.py:387 gajim/adhoc_commands.py:411 msgid "Service sent malformed data" msgstr "" #: gajim/adhoc_commands.py:396 msgid "Service changed the session identifier." msgstr "" #: gajim/adhoc_commands.py:416 #, fuzzy, python-format msgid "%s - Ad-hoc Commands - Gajim" msgstr "Zahady ad-hoc - Gajim" #: gajim/adhoc_commands.py:510 msgid "Service returned an error." msgstr "" #: gajim/negotiation.py:34 msgid "- messages will be logged" msgstr "" #: gajim/negotiation.py:36 msgid "- messages will not be logged" msgstr "" #: gajim/notify.py:103 #, fuzzy msgid "Open" msgstr "OpenPGP: " #: gajim/dialog_messages.py:33 #, fuzzy msgid "You can not start a new conversation unless you are connected." msgstr "" "Niemahčyma ŭdzielničać u hrupavoj razmovie, nie dałučyŭšysia da servera." #: gajim/dialog_messages.py:48 msgid "Unread events" msgstr "Niepračytanyja paviedamleńni" #: gajim/dialog_messages.py:49 msgid "Read all pending events before removing this account." msgstr "Pračytaj usie novyja paviedamleńni pierad vydaleńniem kontu." #: gajim/dialog_messages.py:53 msgid "You are currently connected to the server" msgstr "Prahrama dałučanaja da servera" #: gajim/dialog_messages.py:54 #, fuzzy msgid "To disable the account, you must be disconnected." msgstr "Kab źmianić nazvu kontu, treba pieradałučycca." #: gajim/dialog_messages.py:58 #, fuzzy msgid "Invalid Form" msgstr "Niapravilny zapis" #: gajim/dialog_messages.py:59 #, fuzzy msgid "The form is not filled correctly." msgstr "JID pakoju ŭtrymlivaje niedazvolenyja znaki." #: gajim/dialog_messages.py:63 gajim/common/helpers.py:406 msgid "Invisible" msgstr "Niabačny" #: gajim/dialog_messages.py:68 msgid "A connection is not available" msgstr "Złučeńnie niemahčymaje" #: gajim/dialog_messages.py:69 msgid "Your message can not be sent until you are connected." msgstr "Ty nia možaš dasłać paviedamleńnie, pakul nia złučyśsia z serveram." #: gajim/dialog_messages.py:73 #, fuzzy msgid "JID already in list" msgstr "Klijent kamunikacyi dla Jabber" #: gajim/dialog_messages.py:74 msgid "The JID you entered is already in the list. Choose another one." msgstr "" #: gajim/dialog_messages.py:78 msgid "Invalid answer" msgstr "Niapravilny adkaz" #: gajim/dialog_messages.py:79 #, fuzzy, python-format msgid "Transport %(name)s answered wrongly to register request: %(error)s" msgstr "Transpart %s niapravilna adkazaŭ na zapyt rehistracyi: %s" #: gajim/dialog_messages.py:84 #, fuzzy msgid "Wrong Custom Hostname" msgstr "Skarystaj admysłovy host/port" #: gajim/dialog_messages.py:85 #, fuzzy, python-format msgid "Wrong custom hostname \"%s\". Ignoring it." msgstr "Skarystaj admysłovy host/port" #: gajim/dialog_messages.py:89 msgid "Error while removing privacy list" msgstr "Pamyłka vydaleńnia śpisu pryvatnaści" #: gajim/dialog_messages.py:90 #, fuzzy, python-format msgid "" "Privacy list %s has not been removed. It is maybe active in one of your " "connected resources. Deactivate it and try again." msgstr "" "Śpis pryvatnaści %s nia vydaleny. Jon vykarystoŭvajecca adnoj z dałučanych " "krynic. Adklučy jaje i paŭtary znoŭ." #: gajim/dialog_messages.py:96 #, fuzzy msgid "Invisibility not supported" msgstr "Pašyreńnie nie padtrymvajecca" #: gajim/dialog_messages.py:97 #, python-format msgid "Account %s doesn't support invisibility." msgstr "" #: gajim/dialog_messages.py:101 #, fuzzy msgid "Unregister failed" msgstr "Niemahvyma dałučycca" #: gajim/dialog_messages.py:102 #, python-format msgid "Unregistration with server %(server)s failed: %(error)s" msgstr "" #: gajim/dialog_messages.py:106 #, fuzzy msgid "Registration succeeded" msgstr "Zarehistrujsia na %s" #: gajim/dialog_messages.py:107 #, python-format msgid "Registration with agent %s succeeded" msgstr "" #: gajim/dialog_messages.py:111 #, fuzzy msgid "Registration failed" msgstr "Niemahvyma dałučycca" #: gajim/dialog_messages.py:112 #, python-format msgid "" "Registration with agent %(agent)s failed with error %(error)s: %(error_msg)s" msgstr "" #: gajim/dialog_messages.py:117 #, fuzzy msgid "Unable to join Groupchat" msgstr "Niemahčyma dałučycca da pakoju" #: gajim/dialog_messages.py:122 msgid "GStreamer error" msgstr "" #: gajim/dialog_messages.py:123 #, fuzzy, python-format msgid "" "Error: %(error)s\n" "Debug: %(debug)s" msgstr "Tekst pamyłki: %s" #: gajim/dialog_messages.py:127 msgid "Wrong host" msgstr "Niapravilny host" #: gajim/dialog_messages.py:128 msgid "Invalid local address? :-O" msgstr "" #: gajim/dialog_messages.py:132 msgid "Avahi error" msgstr "Pamyłka Avahi" #: gajim/dialog_messages.py:133 #, python-format msgid "" "%s\n" "Link-local messaging might not work properly." msgstr "" "%s\n" "Lakalnyja paviedamleńni mohuć pracavać pamyłkova." #: gajim/dialog_messages.py:137 gajim/dialog_messages.py:142 #, fuzzy msgid "Could not request upload slot" msgstr "Niemahčyma ŭruchomić lakalny servis" #: gajim/dialog_messages.py:143 msgid "Got unexpected response from server (see log)" msgstr "" #: gajim/dialog_messages.py:147 gajim/dialog_messages.py:152 #, fuzzy msgid "Could not open file" msgstr "Niemahčyma adčytać vyjavu" #: gajim/dialog_messages.py:148 msgid "Exception raised while opening file (see log)" msgstr "" #: gajim/dialog_messages.py:157 msgid "Unsecure" msgstr "" #: gajim/dialog_messages.py:158 msgid "Server returned unsecure transport (http)" msgstr "" #: gajim/dialog_messages.py:162 #, fuzzy msgid "Could not upload file" msgstr "Niemahčyma adčytać vyjavu" #: gajim/dialog_messages.py:163 #, python-format msgid "HTTP response code from server: %s" msgstr "" #: gajim/dialog_messages.py:167 msgid "Upload Error" msgstr "" #: gajim/dialog_messages.py:172 #, fuzzy msgid "Encryption Error" msgstr "Šyfravańnie ŭklučanaje" #: gajim/dialog_messages.py:173 #, fuzzy msgid "For the choosen encryption is no encryption method available" msgstr "Złučeńnie niemahčymaje" #: gajim/gajim_themes_window.py:61 msgid "Theme" msgstr "Tema" #: gajim/gajim_themes_window.py:98 #, fuzzy msgid "You cannot make changes to the default theme" msgstr "Niemahčyma vydalić dziejnuju temu" #: gajim/gajim_themes_window.py:99 #, fuzzy msgid "Please create a new clean theme." msgstr "Stvary novy zapis" #: gajim/gajim_themes_window.py:170 msgid "theme name" msgstr "nazva temy" #: gajim/gajim_themes_window.py:187 msgid "You cannot delete your current theme" msgstr "Niemahčyma vydalić dziejnuju temu" #: gajim/gajim_themes_window.py:188 msgid "Pick another theme to use first." msgstr "" #: gajim/accounts_window.py:40 #, fuzzy msgid "Merge Accounts" msgstr "Abjadnanyja konty" #: gajim/accounts_window.py:41 msgid "Use PGP Agent" msgstr "" #: gajim/accounts_window.py:153 gajim/common/config.py:511 msgid "Be right back." msgstr "Chutka viarnusia." #: gajim/accounts_window.py:157 msgid "Relogin now?" msgstr "Pieradałučycca?" #: gajim/accounts_window.py:158 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "Kali chočaš zadziejničać źmieny, treba pieradałučycca." #: gajim/accounts_window.py:211 #, python-format msgid "You have opened chat in account %s" msgstr "Akno razmovy adčynienaje dla kontu %s" #: gajim/accounts_window.py:212 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "Usie adčynienyja vokny razmovy buduć začynienyja. Praciahnuć?" #: gajim/accounts_window.py:345 #, fuzzy msgid "Remove" msgstr "_Vydal" #: gajim/accounts_window.py:388 #, fuzzy msgid "Rename account label" msgstr "Kiruj kontami" #: gajim/accounts_window.py:457 msgid "Login" msgstr "" #: gajim/accounts_window.py:466 msgid "Connection" msgstr "Złučeńnie" #: gajim/accounts_window.py:469 #, fuzzy msgid "Import Contacts" msgstr "Kantakty" #: gajim/accounts_window.py:472 gajim/accounts_window.py:655 #, fuzzy msgid "Client Certificate" msgstr "Niapravilnaje imia karystalnika" #: gajim/accounts_window.py:475 gajim/accounts_window.py:570 #, fuzzy msgid "OpenPGP Key" msgstr "Pryznač kluč OpenPGP" #: gajim/accounts_window.py:486 gajim/accounts_window.py:558 #, fuzzy msgid "Connect on startup" msgstr "_Zlučajsia pry starcie Gajim" #: gajim/accounts_window.py:489 #, fuzzy msgid "Reconnect when connection is lost" msgstr "Aŭtamatyčna pieradałučajsia pry abryvie złučeńnia" #: gajim/accounts_window.py:492 gajim/accounts_window.py:562 #, fuzzy msgid "Save conversations for all contacts" msgstr "Zachoŭvaj _žurnały razmoŭ dla ŭsich kantaktaŭ" #: gajim/accounts_window.py:494 gajim/accounts_window.py:564 msgid "Store conversations on the harddrive" msgstr "" #: gajim/accounts_window.py:496 #, fuzzy msgid "Server Message Archive" msgstr "_Dašli paviedamleńnie servera" #: gajim/accounts_window.py:498 msgid "" "Messages get stored on the server.\n" "The archive is used to sync messages\n" "between multiple devices.\n" "XEP-0313" msgstr "" #: gajim/accounts_window.py:503 gajim/accounts_window.py:566 #, fuzzy msgid "Global Status" msgstr "Usie statusy" #: gajim/accounts_window.py:505 #, fuzzy msgid "Synchronise the status of all accounts" msgstr "Źmianiaje status kontu albo kontaŭ" #: gajim/accounts_window.py:507 #, fuzzy msgid "Message Carbons" msgstr "Paviedamleńni" #: gajim/accounts_window.py:509 msgid "" "All your other online devices get copies\n" "of sent and received messages.\n" "XEP-0280" msgstr "" #: gajim/accounts_window.py:513 msgid "Use file transfer proxies" msgstr "Skarystaj proxy dla pieradačy fajłaŭ" #: gajim/accounts_window.py:525 gajim/accounts_window.py:560 #, fuzzy msgid "Use environment variable" msgstr "Złučeńnia niama" #: gajim/accounts_window.py:527 #, fuzzy msgid "Proxy" msgstr "Proxy:" #: gajim/accounts_window.py:530 #, fuzzy msgid "Warn on insecure connection" msgstr "Złučeńnie" #: gajim/accounts_window.py:534 msgid "Send keep-alive packets" msgstr "Dasyłaj pravieračnyja infarmacyjnyja pakiety" #: gajim/accounts_window.py:538 msgid "Manually set the hostname for the server" msgstr "" #: gajim/accounts_window.py:541 #, fuzzy msgid "Resource" msgstr "Krynica:" #: gajim/accounts_window.py:544 gajim/accounts_window.py:612 #: gajim/accounts_window.py:617 #, fuzzy msgid "Priority" msgstr "Pryjary_tet:" #: gajim/accounts_window.py:568 #, fuzzy msgid "Synchronize the status of all accounts" msgstr "Źmianiaje status kontu albo kontaŭ" #: gajim/accounts_window.py:581 #, fuzzy msgid "First Name" msgstr "Imia:" #: gajim/accounts_window.py:584 #, fuzzy msgid "Last Name" msgstr "Proźvišča:" #: gajim/accounts_window.py:587 #: gajim/data/gui/archiving_313_preferences_window.ui:71 #, fuzzy msgid "Jabber ID" msgstr "JID:" #: gajim/accounts_window.py:590 #, fuzzy msgid "Email" msgstr "Novy list" #: gajim/accounts_window.py:608 #, fuzzy msgid "Adjust to status" msgstr "_Dastasuj da statusu" #: gajim/accounts_window.py:635 msgid "Enable" msgstr "Ukluč" #: gajim/accounts_window.py:642 #, fuzzy msgid "Port" msgstr "_Port:" #: gajim/accounts_window.py:647 #, fuzzy msgid "Connection Options" msgstr "Złučeńnie" #: gajim/accounts_window.py:659 #, fuzzy msgid "Encrypted Certificate" msgstr "Niapravilnaje imia karystalnika" #: gajim/accounts_window.py:663 #, fuzzy msgid "Certificate Options" msgstr "Niapravilnaje imia karystalnika" #: gajim/accounts_window.py:671 gajim/data/gui/join_groupchat_window.ui:143 #, fuzzy msgid "Password" msgstr "Parol:" #: gajim/accounts_window.py:675 #, fuzzy msgid "Save Password" msgstr "Zachavaj parol" #: gajim/accounts_window.py:678 gajim/data/gui/change_password_dialog.ui:8 msgid "Change Password" msgstr "Źmiani parol" #: gajim/accounts_window.py:683 #, fuzzy msgid "Login Options" msgstr "Smajliki:" #: gajim/gajim_remote.py:59 gajim/common/exceptions.py:71 msgid "D-Bus is not present on this machine or python module is missing" msgstr "D-Busu niama na hetym kamputary, albo nie staje modula Python" #: gajim/gajim_remote.py:81 msgid "Shows a help on specific command" msgstr "Pakazvaje daviedku pa akreślenym zahadzie" #: gajim/gajim_remote.py:84 msgid "command" msgstr "zahad" #: gajim/gajim_remote.py:85 msgid "show help on command" msgstr "pakažy daviedku pa zahadzie" #: gajim/gajim_remote.py:89 #, fuzzy msgid "Lists all contacts in roster, one for each line" msgstr "" "Pakazvaje śpis usich kantaktaŭ sa śpisu kantaktaŭ. Źviestki ab kožnym " "kantakcie źjaŭlajucca na novym radku" #: gajim/gajim_remote.py:91 gajim/gajim_remote.py:106 gajim/gajim_remote.py:116 #: gajim/gajim_remote.py:130 gajim/gajim_remote.py:144 #: gajim/gajim_remote.py:153 gajim/gajim_remote.py:174 #: gajim/gajim_remote.py:204 gajim/gajim_remote.py:213 #: gajim/gajim_remote.py:220 #, fuzzy msgid "?CLI:account" msgstr "kont" #: gajim/gajim_remote.py:91 msgid "show only contacts of the given account" msgstr "pakažy kantakty akreślenaha kontu" #: gajim/gajim_remote.py:97 msgid "Prints a list of registered accounts" msgstr "Pakazvaje śpis zarehistravanych kontaŭ" #: gajim/gajim_remote.py:101 #, fuzzy msgid "Changes the status of account(s)" msgstr "Źmianiaje status kontu albo kontaŭ" #: gajim/gajim_remote.py:104 #, fuzzy msgid "?CLI:status" msgstr "status" #: gajim/gajim_remote.py:104 #, fuzzy msgid "" "one of: offline, online, chat, away, xa, dnd, invisible. If not set, use " "account's previous status" msgstr "adno z: offline, online, chat, away, xa, dnd, invisible " #: gajim/gajim_remote.py:105 gajim/gajim_remote.py:127 #: gajim/gajim_remote.py:141 gajim/gajim_remote.py:152 #, fuzzy msgid "?CLI:message" msgstr "paviedamleńnie" #: gajim/gajim_remote.py:105 msgid "status message" msgstr "paviedamlennie statusu" #: gajim/gajim_remote.py:106 msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" msgstr "" "źmiani status kontu \"kont\". Kali nie akreślena, pasprabuj źmianić statusy " "dla ŭsich kontaŭ, dla jakich vystaŭlenaja opcyja \"Synchranizuj z hlabalnym " "statusam\"" #: gajim/gajim_remote.py:112 #, fuzzy msgid "Changes the priority of account(s)" msgstr "Źmianiaje status kontu albo kontaŭ" #: gajim/gajim_remote.py:114 #, fuzzy msgid "?CLI:priority" msgstr "Pryjary_tet:" #: gajim/gajim_remote.py:114 #, fuzzy msgid "priority you want to give to the account" msgstr "Ja chaču za_rehistravać novy kont" #: gajim/gajim_remote.py:116 #, fuzzy msgid "" "change the priority of the given account. If not specified, change status of " "all accounts that have \"sync with global status\" option set" msgstr "" "źmiani status kontu \"kont\". Kali nie akreślena, pasprabuj źmianić statusy " "dla ŭsich kontaŭ, dla jakich vystaŭlenaja opcyja \"Synchranizuj z hlabalnym " "statusam\"" #: gajim/gajim_remote.py:122 msgid "" "Sends new chat message to a contact in the roster. Both OpenPGP key and " "account are optional. If you want to set only 'account', without 'OpenPGP " "key', just set 'OpenPGP key' to ''." msgstr "" "Dasyłaje novaje paviedamleńnie kantaktu sa śpisu kantaktaŭ. Kluč OpenPGP i " "kont nie abaviazkovyja dla akreśleńnia. Kali chočaš akreślić tolki 'kont', " "biez 'kluča OpenPGP', tady prosta akreśli 'kluč OpenPGP' jak ''." #: gajim/gajim_remote.py:126 gajim/gajim_remote.py:139 msgid "JID of the contact that will receive the message" msgstr "JID kantaktu, jaki atrymaje paviedamleńnie" #: gajim/gajim_remote.py:127 gajim/gajim_remote.py:141 #: gajim/gajim_remote.py:152 msgid "message contents" msgstr "źmiest paviedamleńnia" #: gajim/gajim_remote.py:128 gajim/gajim_remote.py:142 msgid "PGP key" msgstr "" #: gajim/gajim_remote.py:128 gajim/gajim_remote.py:142 msgid "if specified, the message will be encrypted using this public key" msgstr "" "Kali akreślena, paviedamleńnie budzie zašyfravana hetym publičnym klučom" #: gajim/gajim_remote.py:130 gajim/gajim_remote.py:144 #: gajim/gajim_remote.py:153 msgid "if specified, the message will be sent using this account" msgstr "Kali akreślena, paviedamleńnie budzie dasłanaje z hetaha kontu" #: gajim/gajim_remote.py:135 #, fuzzy msgid "" "Sends a chat message to someone on your roster. Optionally with OpenPGP key " "and account. If you want to only set the latter, set OpenPGP key to \"\"." msgstr "" "Dasyłaje novaje paviedamleńnie kantaktu sa śpisu kantaktaŭ. Kluč OpenPGP i " "kont nie abaviazkovyja dla akreśleńnia. Kali chočaš akreślić tolki 'kont', " "biez 'kluča OpenPGP', tady prosta akreśli 'kluč OpenPGP' jak ''." #: gajim/gajim_remote.py:140 msgid "subject" msgstr "tema" #: gajim/gajim_remote.py:140 msgid "message subject" msgstr "tema paviedamleńnia" #: gajim/gajim_remote.py:149 msgid "Sends new message to a groupchat you've joined." msgstr "" #: gajim/gajim_remote.py:151 #, fuzzy msgid "JID of the room that will receive the message" msgstr "JID kantaktu, jaki atrymaje paviedamleńnie" #: gajim/gajim_remote.py:158 msgid "Gets detailed info on a contact" msgstr "Atrymvaje padrabiaznyja źviestki ab kantakcie" #: gajim/gajim_remote.py:160 gajim/gajim_remote.py:173 #: gajim/gajim_remote.py:203 msgid "JID of the contact" msgstr "JID kantaktu" #: gajim/gajim_remote.py:164 msgid "Gets detailed info on a account" msgstr "Atrymvaje padrabiaznyja źviestki ab kantakcie" #: gajim/gajim_remote.py:166 msgid "Name of the account" msgstr "Nazva kontu" #: gajim/gajim_remote.py:170 msgid "Sends file to a contact" msgstr "Dasyłaje kantaktu fajł" #: gajim/gajim_remote.py:172 msgid "file" msgstr "fajł" #: gajim/gajim_remote.py:172 msgid "File path" msgstr "Ściežka da fajłu" #: gajim/gajim_remote.py:174 msgid "if specified, file will be sent using this account" msgstr "Kali akreślena, fajł budzie dasłany z hetaha kontu" #: gajim/gajim_remote.py:179 msgid "Lists all preferences and their values" msgstr "Pakazvaje ŭsie nałady i ichnyja vartaści" #: gajim/gajim_remote.py:183 msgid "Sets value of 'key' to 'value'." msgstr "Akreślivaje dla 'kluča' 'vartaść'" #: gajim/gajim_remote.py:185 msgid "key=value" msgstr "kluč=vartaść" #: gajim/gajim_remote.py:185 #, fuzzy msgid "'key' is the name of the preference, 'value' is what to set it to" msgstr "'kluč' jość nazvaj nałady, 'vartaść' jość vartaściu hetaj nałady" #: gajim/gajim_remote.py:190 msgid "Deletes a preference item" msgstr "Vydalaje naładu" #: gajim/gajim_remote.py:192 msgid "key" msgstr "kluč" #: gajim/gajim_remote.py:192 msgid "name of the preference to be deleted" msgstr "nazva vydalenaj nałady" #: gajim/gajim_remote.py:196 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "Zapisvaje dziejnyja nałady Gajima ŭ fajł .config" #: gajim/gajim_remote.py:201 msgid "Removes contact from roster" msgstr "Vydalaje kantakt sa śpisu" #: gajim/gajim_remote.py:204 msgid "if specified, contact is taken from the contact list of this account" msgstr "Kali akreślena, kantakt biarecca sa śpisu kantaktaŭ hetaha kontu" #: gajim/gajim_remote.py:211 msgid "Returns current status (the global one unless account is specified)" msgstr "Viartaje dziejny status (hlabalny, kali nie akreśleny kont)" #: gajim/gajim_remote.py:218 msgid "" "Returns current status message (the global one unless account is specified)" msgstr "" "Viartaje dziejnaje paviedamleńnie statusu (hlabalnaha, kali nie akreśleny " "kont)" #: gajim/gajim_remote.py:225 msgid "Returns number of unread messages" msgstr "Viartaje kolkaść niečytanych paviedamleńniaŭ" #: gajim/gajim_remote.py:230 msgid "Sends custom XML" msgstr "Dasyłaje svoj XML" #: gajim/gajim_remote.py:232 msgid "XML to send" msgstr "XML dla dasyłańnia" #: gajim/gajim_remote.py:233 #, fuzzy msgid "" "Account to which the XML will be sent; if not specified, XML will be sent to " "all accounts" msgstr "" "Kont, na jaki budzie dasłany XML; kali kont nie akreśleny, XML budzie " "dasłany na ŭsie konty" #: gajim/gajim_remote.py:239 #, fuzzy msgid "Change the avatar" msgstr "Źmiani status" #: gajim/gajim_remote.py:241 #, fuzzy msgid "Picture to use" msgstr "Mianuška nia znojdziena: %s" #: gajim/gajim_remote.py:242 #, fuzzy msgid "" "Account in which the avatar will be set; if not specified, the avatar will " "be set for all accounts" msgstr "" "Kont, na jaki budzie dasłany XML; kali kont nie akreśleny, XML budzie " "dasłany na ŭsie konty" #: gajim/gajim_remote.py:249 #, fuzzy msgid "Check if Gajim is running" msgstr "Kali łaska, pravier, ci pracuje avahi-daemon." #: gajim/gajim_remote.py:275 msgid "Missing argument \"contact_jid\"" msgstr "Nie staje arhumenta \"contact_jid\"" #: gajim/gajim_remote.py:295 #, python-format msgid "" "'%s' is not in your roster.\n" "Please specify account for sending the message." msgstr "" "'%s' niama ŭ tvajim śpisie kantaktaŭ.\n" "Kali łaska, akreśli kont dla dasyłańnia paviedamleńnia." #: gajim/gajim_remote.py:298 msgid "You have no active account" msgstr "Nivodny kont nia dziejny" #: gajim/gajim_remote.py:346 msgid "It seems Gajim is not running. So you can't use gajim-remote." msgstr "" #: gajim/gajim_remote.py:373 #, python-format msgid "" "Usage: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" msgstr "" #: gajim/gajim_remote.py:377 msgid "Arguments:" msgstr "Arhumenty:" #: gajim/gajim_remote.py:381 #, python-format msgid "%s not found" msgstr "%s nia znojdzieny" #: gajim/gajim_remote.py:387 #, fuzzy, python-format msgid "" "Usage:\n" " %s command [arguments]\n" "\n" "Command is one of:\n" msgstr "" "Užyvańnie: %s zahad [arhumenty]\n" "Zahadam moža być adzin z nastupnych vyrazaŭ:\n" #: gajim/gajim_remote.py:457 #, fuzzy, python-format msgid "" "Too many arguments. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" "Nadta šmat arhumentaŭ. \n" "Vykanaj \"%s help %s\" dla padrabiaźniejšych źviestak" #: gajim/gajim_remote.py:462 #, fuzzy, python-format msgid "" "Argument \"%(arg)s\" is not specified. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" "Arhument \"%s\" nie akreśleny. \n" "Vykanaj \"%s help %s\" dla padrabiaźniejšych źviestak" #: gajim/common/app.py:264 msgid "Unable to load idle module" msgstr "Niemahčyma adčytać modulu idle" #: gajim/common/fuzzyclock.py:37 msgid "twelve" msgstr "dvanaccataja" #: gajim/common/fuzzyclock.py:37 msgid "one" msgstr "pieršaja" #: gajim/common/fuzzyclock.py:37 msgid "two" msgstr "druhaja" #: gajim/common/fuzzyclock.py:37 msgid "three" msgstr "treciaja" #: gajim/common/fuzzyclock.py:37 msgid "four" msgstr "čaćviortaja" #: gajim/common/fuzzyclock.py:38 msgid "five" msgstr "piataja" #: gajim/common/fuzzyclock.py:38 msgid "six" msgstr "šostaja" #: gajim/common/fuzzyclock.py:38 msgid "seven" msgstr "siomaja" #: gajim/common/fuzzyclock.py:38 msgid "eight" msgstr "vośmaja" #: gajim/common/fuzzyclock.py:38 msgid "nine" msgstr "dziaviataja" #: gajim/common/fuzzyclock.py:38 msgid "ten" msgstr "dziasiataja" #: gajim/common/fuzzyclock.py:39 msgid "eleven" msgstr "adzinaccataja" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "%(0)s o'clock" msgstr "%(0)s hadzinaŭ" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "five past %(0)s" msgstr "piać chvilinaŭ na %(0)s" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "ten past %(0)s" msgstr "dziesiać chvilinaŭ na %(0)s" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "quarter past %(0)s" msgstr "čverć na %(0)s" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "twenty past %(0)s" msgstr "dvaccać chvilinaŭ na %(0)s" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "twenty five past %(0)s" msgstr "dvaccać piać chvilinaŭ na %(0)s" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "half past %(0)s" msgstr "pałova na %(0)s" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "twenty five to %(1)s" msgstr "biez dvaccaci piaci chvilinaŭ %(1)s" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "twenty to %(1)s" msgstr "biez dvaccaci chvilinaŭ %(1)s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "quarter to %(1)s" msgstr "biaz čverći %(1)s" #: gajim/common/fuzzyclock.py:46 #, fuzzy, python-format msgid "ten to %(1)s" msgstr "bieź dziesiaci chvilinaŭ $s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "five to %(1)s" msgstr "bieź piaci chvilinaŭ %(1)s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "%(1)s o'clock" msgstr "%(1)s hadzinaŭ" #: gajim/common/fuzzyclock.py:48 gajim/common/fuzzyclock.py:50 msgid "Night" msgstr "Noč" #: gajim/common/fuzzyclock.py:48 msgid "Early morning" msgstr "Śvitanak" #: gajim/common/fuzzyclock.py:48 msgid "Morning" msgstr "Ranica" #: gajim/common/fuzzyclock.py:49 msgid "Almost noon" msgstr "Amal poŭdzień" #: gajim/common/fuzzyclock.py:49 msgid "Noon" msgstr "Poŭdzień" #: gajim/common/fuzzyclock.py:49 msgid "Afternoon" msgstr "Papoŭdni" #: gajim/common/fuzzyclock.py:49 msgid "Evening" msgstr "Viečar" #: gajim/common/fuzzyclock.py:50 msgid "Late evening" msgstr "Poźni viečar" #: gajim/common/fuzzyclock.py:52 msgid "Start of week" msgstr "Pačatak tydnia" #: gajim/common/fuzzyclock.py:52 gajim/common/fuzzyclock.py:53 msgid "Middle of week" msgstr "Siaredzina tydnia" #: gajim/common/fuzzyclock.py:53 msgid "End of week" msgstr "Kaniec tydnia" #: gajim/common/fuzzyclock.py:53 msgid "Weekend!" msgstr "Vychodny!" #: gajim/common/connection_handlers_events.py:369 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " "management tools such as http://jru.jabberstudio.org/ to remove it" msgstr "" "JID %s nie adpaviadaje standartu RFC. Jon nia budzie dadany da tvajho śpisu " "kantaktaŭ. Vydal jaho z dapamohaj pryłady kiravańnia śpisam kantaktaŭ, " "naprykład, http://jru.jabberstudio.org/" #: gajim/common/connection_handlers_events.py:852 #, python-format msgid "unsubscribe request from %s" msgstr "zapyt adpiski ad %s" #: gajim/common/connection_handlers_events.py:952 #, fuzzy msgid "Room has been destroyed" msgstr "Aŭtaryzacyja anulavanaja" #: gajim/common/connection_handlers_events.py:960 #, python-format msgid "You can join this room instead: %s" msgstr "" #: gajim/common/connection_handlers_events.py:1979 #, python-format msgid "Unknown SSL error: %d" msgstr "" #: gajim/common/connection_handlers_events.py:2625 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Novaje asobnaje paviedamleńnie ad %(nickname)s" #: gajim/common/connection_handlers_events.py:2631 #, python-format msgid "New Private Message from group chat %s" msgstr "Novaje pryvatnaje paviedamleńnie ŭ pakoji %s" #: gajim/common/connection_handlers_events.py:2634 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" #: gajim/common/connection_handlers_events.py:2637 #, fuzzy, python-format msgid "Messaged by %(nickname)s" msgstr "Novaje paviedamleńnie ad %(nickname)s" #: gajim/common/connection_handlers_events.py:2643 #, python-format msgid "New Message from %(nickname)s" msgstr "Novaje paviedamleńnie ad %(nickname)s" #: gajim/common/connection_handlers_events.py:2809 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s źmianiŭ status" #: gajim/common/connection_handlers_events.py:2817 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s dałučyŭsia" #: gajim/common/connection_handlers_events.py:2823 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s adłučyŭsia" #: gajim/common/contacts.py:386 msgid "Not in roster" msgstr "Niama ŭ śpisie kantaktaŭ" #: gajim/common/config.py:76 msgid "" "Show desktop notification even when a chat window is opened for this contact " "and does not have focus" msgstr "" #: gajim/common/config.py:77 msgid "Play sound when user is busy" msgstr "" #: gajim/common/config.py:79 msgid "Show only online and free for chat contacts in roster." msgstr "" #: gajim/common/config.py:82 msgid "Time in minutes, after which your status changes to away." msgstr "Čas u chvilinach, paśla katoraha tvoj status źmienicca na \"Adyjšoŭ\"." #: gajim/common/config.py:83 #, fuzzy msgid "$S (Away as a result of being idle more than $T min)" msgstr "Status \"Adyjšoŭ\" jak vynik biaździejnaści prahramy" #: gajim/common/config.py:83 msgid "$S will be replaced by current status message, $T by autoawaytime." msgstr "" #: gajim/common/config.py:85 msgid "Time in minutes, after which your status changes to not available." msgstr "" "Čas u chvilinach, paśla katoraha tvoj status źmienicca na \"Niedastupny\"." #: gajim/common/config.py:86 #, fuzzy msgid "$S (Not available as a result of being idle more than $T min)" msgstr "Status \"Niedastupny\" jak vynik biaździejnaści prahramy" #: gajim/common/config.py:86 msgid "$S will be replaced by current status message, $T by autoxatime." msgstr "" #: gajim/common/config.py:89 msgid "" "When to show notification area icon. Can be 'never', 'on_event', 'always'." msgstr "" #: gajim/common/config.py:90 msgid "Allow to hide the roster window even if the tray icon is not shown." msgstr "" #: gajim/common/config.py:95 #, fuzzy msgid "Incoming nickname color." msgstr "Niapravilnaje imia karystalnika" #: gajim/common/config.py:96 msgid "Outgoing nickname color." msgstr "" #: gajim/common/config.py:97 msgid "Incoming text color." msgstr "" #: gajim/common/config.py:98 msgid "Outgoing text color." msgstr "" #: gajim/common/config.py:99 #, fuzzy msgid "Status message text color." msgstr "tekst paviedamleńnia statusu" #: gajim/common/config.py:102 #, fuzzy msgid "Contact signed in notification color." msgstr "_Pakazvaj padzieju ŭ śpisie kantaktaŭ" #: gajim/common/config.py:103 #, fuzzy msgid "Contact signout notification color" msgstr "_Pakazvaj padzieju ŭ śpisie kantaktaŭ" #: gajim/common/config.py:104 #, fuzzy msgid "New message notification color." msgstr "_Pakazvaj padzieju ŭ śpisie kantaktaŭ" #: gajim/common/config.py:105 #, fuzzy msgid "File transfer request notification color." msgstr "Zapyt na pieradaču fajłu" #: gajim/common/config.py:106 #, fuzzy msgid "File transfer error notification color." msgstr "Pieradača fajłu anulavana" #: gajim/common/config.py:107 #, fuzzy msgid "File transfer complete or stopped notification color." msgstr "Pakažy nahadvańnie ŭ vypłyŭnym aknie pa zakančeńni pieradačy fajła" #: gajim/common/config.py:108 #, fuzzy msgid "Groupchat invitation notification color" msgstr "Zaprašeńnie ŭ pakoj" #: gajim/common/config.py:109 #, fuzzy msgid "Background color of status changed notification" msgstr "Fonavy koler kantaktaŭ, kali jany tolki dałučylisia." #: gajim/common/config.py:110 msgid "Other dialogs color." msgstr "" #: gajim/common/config.py:111 #, fuzzy msgid "Incoming nickname font." msgstr "Niapravilnaje imia karystalnika" #: gajim/common/config.py:112 #, fuzzy msgid "Outgoing nickname font." msgstr "Źmianiajecca mianuška" #: gajim/common/config.py:113 msgid "Incoming text font." msgstr "" #: gajim/common/config.py:114 msgid "Outgoing text font." msgstr "" #: gajim/common/config.py:115 #, fuzzy msgid "Status message text font." msgstr "tekst paviedamleńnia statusu" #: gajim/common/config.py:116 msgid "" "List (space separated) of rows (accounts and groups) that are collapsed." msgstr "Śpis (padzielenych prabiełami) zhornutych radkoŭ (kontaŭ i hrupaŭ)." #: gajim/common/config.py:123 msgid "Language used by speller" msgstr "Mova pravierki pravapisu" #: gajim/common/config.py:124 msgid "" "'always' - print time for every message.\n" "'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" "'never' - never print time." msgstr "" "'always' - pakazvaj čas dla kožnaha paviedamleńnia.\n" "'sometimes' - pakazvaj čas praz kolkaść chvilinaŭ, akreślenuju ŭ opcyi " "print_ichat_every_foo_minutes.\n" "'never' - nie pakazvaj času." #: gajim/common/config.py:125 msgid "" "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " "to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " "This is used only if print_time is 'sometimes'." msgstr "" "Pakazvaj niedakładny čas. Vartaść niedakładnaści ad 1 da 4 albo 0, kab " "adklučyć niedakładnaść. 1 akreślivaje samy dakładny čas, 4 akreślivaje samy " "niedakładny. Zadziejničana, kali opcyja print_time maje vartaść 'sometimes'." #: gajim/common/config.py:127 msgid "Enable ASCII emoticons" msgstr "" #: gajim/common/config.py:129 msgid "Treat * / _ pairs as possible formatting characters." msgstr "Traktuj pary znakaŭ * / _ jak znaki farmatavańnia." #: gajim/common/config.py:130 msgid "" "If True, do not remove */_ . So *abc* will be bold but with * * not removed." msgstr "" "Kali maje vartaść True, nie vydalaj */_ . Takim čynam *abc* budzie tłustym, " "ale i znaki * * nia vydalacca." #: gajim/common/config.py:133 msgid "" "Uses ReStructured text markup to send HTML, plus ascii formatting if " "selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" "restructuredtext.html (If you want to use this, install docutils)" msgstr "" "Užyvaje restrukturavanuju movu tekstavaj raźmietki dla dasyłańnia HTML, a " "taksama farmatavańnie ASCII, kali zadziejničana adpaviednaja opcyja. Hladzi " "syntaksyčnyja praviły pa adrasie: http://docutils.sourceforge.net/docs/ref/" "rst/restructuredtext.html (Kali chočaš karystacca hetaj mahčymaściu, " "zainstaluj docutils)" #: gajim/common/config.py:142 msgid "" "Character to add after nickname when using nick completion (tab) in group " "chat." msgstr "" "Znak, jaki dadajecca paśla mianuški pry dapaŭnieńni (klavišaj TAB) u pakoji." #: gajim/common/config.py:143 msgid "" "Character to propose to add after desired nickname when desired nickname is " "used by someone else in group chat." msgstr "" "Znak, jaki dadajecca paśla mianuški, kali akreślenaja mianuška ŭžyvajecca ŭ " "movie inšaha ŭdzielnika pakoju." #: gajim/common/config.py:165 msgid "" "If True, Gajim will save roster position when hiding roster, and restore it " "when showing roster." msgstr "" #: gajim/common/config.py:171 msgid "Place the roster on the right in single window mode" msgstr "" #: gajim/common/config.py:177 msgid "" "This option let you customize timestamp that is printed in conversation. For " "exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " "strftime for full documentation: http://docs.python.org/lib/module-time.html" msgstr "" "Hetaja opcyja dazvalaje tabie akreślić farmat miecin času ŭ razmovie. " "Naprykład, \"[%H:%M] \" akreślaje, što treba pakazvać \"[hadziny:chviliny] " "\". Hladzi padrabiaznyja źviestki ŭ dakumentacyi dla Pythonu pa funkcyi " "strftime: http://docs.python.org/lib/module-time.html" #: gajim/common/config.py:178 msgid "Characters that are printed before the nickname in conversations" msgstr "Znaki, što pakazvajucca ŭ razmovie pierad mianuškaj" #: gajim/common/config.py:179 msgid "Characters that are printed after the nickname in conversations" msgstr "Znaki, što pakazvajucca ŭ razmovie paśla mianuški" #: gajim/common/config.py:181 msgid "Add * and [n] in roster title?" msgstr "Dadać * i [n] u zahałovak śpisu kantaktaŭ?" #: gajim/common/config.py:182 #, fuzzy msgid "" "How many history messages should be restored when a chat tab/window is " "reopened?" msgstr "" "Kolki radkoŭ z apošniaj razmovy zapaminać i pakazvać u znoŭ adčynienym aknie." #: gajim/common/config.py:183 msgid "How far back in time (minutes) history is restored. -1 means no limit." msgstr "" #: gajim/common/config.py:184 msgid "" "How many lines to request from server when entering a groupchat. -1 means no " "limit" msgstr "" #: gajim/common/config.py:185 msgid "" "Minutes of backlog to request when entering a groupchat. -1 means no limit" msgstr "" #: gajim/common/config.py:186 msgid "" "How many seconds to wait before trying to autorejoin to a conference you are " "being disconnected from. Set to 0 to disable autorejoining." msgstr "" #: gajim/common/config.py:187 msgid "" "Should autorejoin be activated when we are being kicked from a conference?" msgstr "" #: gajim/common/config.py:188 msgid "" "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " "Client default behaviour)." msgstr "" "Dasyłaj paviedamleńnie praz Ctrl+Enter, a Enteram stvaraj novy radok " "(zmoŭčanyja pavodziny Mirabilis ICQ)." #: gajim/common/config.py:190 msgid "How many lines to store for Ctrl+KeyUP." msgstr "Kolki radkoŭ zachoŭvać dla Ctrl+KeyUP." #: gajim/common/config.py:193 #, fuzzy, python-format msgid "" "Either custom url with %%s in it where %%s is the word/phrase or " "'WIKTIONARY' which means use wiktionary." msgstr "" "Albo specyjalny adrasm jaki ŭtrymlivaje %s, dzie %s jość słovam/vyrazam, " "albo radok 'WIKTIONARY', što aznačaje vykarystańnie Wiktionary." #: gajim/common/config.py:196 msgid "If checked, Gajim can be controlled remotely using gajim-remote." msgstr "" "Kali hetaja opcyja ŭklučanaja, Gajimam možna kiravać praz gajim-remote." #: gajim/common/config.py:197 msgid "" "Sent chat state notifications. Can be one of all, composing_only, disabled." msgstr "" "Dasyłaj nahadvańni ab stanie razmovy. Musić być adnoj z nastupnych " "vartaściaŭ: all, composing_only, disabled." #: gajim/common/config.py:198 msgid "" "Displayed chat state notifications in chat windows. Can be one of all, " "composing_only, disabled." msgstr "" "Pakazanyja nahadvańni stanu razmovy ŭ voknach. Musić być adnoj z nastupnych " "vartaściaŭ: all, composing_only, disabled." #: gajim/common/config.py:200 msgid "" "When not printing time for every message (print_time==sometimes), print it " "every x minutes." msgstr "" "Kali čas pakazvajecca nie dla kožnaha paviedamleńnia " "(print_time==sometimes), pakazvaj jaho kožnyja x chvilinaŭ." #: gajim/common/config.py:201 msgid "Ask before closing a group chat tab/window." msgstr "Pytajsia paćvierdžańnia pierad začynieńniem kartki/akna razmovy." #: gajim/common/config.py:202 #, fuzzy msgid "" "Always ask for confirmation before closing groupchats with any of the JIDs " "on this space separated list." msgstr "" "Zaŭsiody pytajsia paćvierdžańnia pierad začynieńniem kartki/akna razmovy z " "hetaha śpisu padzielenych prabiełami nazvaŭ pakojaŭ." #: gajim/common/config.py:203 #, fuzzy msgid "" "Never ask for confirmation before closing groupchats with any of the JIDs on " "this space separated list." msgstr "" "Nikoli nie pytajsia paćvierdžańnia pierad začynieńniem kartki/akna razmovy z " "hetaha śpisu padzielenych prabiełami nazvaŭ pakojaŭ." #: gajim/common/config.py:204 msgid "" "Ask before closing tabbed chat window if there are controls that can lose " "data (chat, private chat, groupchat that will not be minimized)" msgstr "" #: gajim/common/config.py:207 #, fuzzy msgid "" "Comma separated list of hosts that we send, in addition of local interfaces, " "for File Transfer in case of address translation/port forwarding." msgstr "" "Nadpisvaje host, jaki vysyłajecca dla Pieradačy fajłaŭ, u vypadku tranślacyi " "adrasoŭ/pieranakiravańnia partoŭ." #: gajim/common/config.py:209 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." msgstr "Standart IEC vyznačaje, što KiB = 1024 bajtaŭ, KB = 1000 bajtaŭ." #: gajim/common/config.py:211 #, fuzzy msgid "Notify of events in the notification area." msgstr "Nahadvaj ab padziejach ikonaj pola nahadvańnia." #: gajim/common/config.py:212 msgid "" "If False, Gajim will display a static event icon instead of the blinking " "status icon in the notification area when notifying on event." msgstr "" #: gajim/common/config.py:218 msgid "Show tab when only one conversation?" msgstr "Pakazvać kartku, kali dziejnaja tolki adna razmova?" #: gajim/common/config.py:219 msgid "Show tabbed notebook border in chat windows?" msgstr "Pakazvać padzieł kartak u voknach razmovy?" #: gajim/common/config.py:220 msgid "Show close button in tab?" msgstr "Pakazvać knopki začynieńnia na kartkach?" #: gajim/common/config.py:221 msgid "" "A list of modp groups to use in a Diffie-Hellman, highest preference first, " "separated by commas. Valid groups are 1, 2, 5, 14, 15, 16, 17 and 18. Higher " "numbers are more secure, but take longer to calculate when you start a " "session." msgstr "" #: gajim/common/config.py:234 msgid "Preview new messages in notification popup?" msgstr "" #: gajim/common/config.py:237 msgid "" "A semicolon-separated list of words that will be highlighted in group chats." msgstr "" "Śpis padzielenych kropkaj z koskaj słovaŭ, jakija treba padśviatlać u " "pakojach." #: gajim/common/config.py:238 #, fuzzy msgid "" "If True, quits Gajim when X button of Window Manager is clicked. This " "setting is taken into account only if notification icon is used." msgstr "" "Kali opcyja maje vartaść True, Gajim zaviaršaje vykanańnie pa nacisku knopki " "X Kiraŭnika voknaŭ. Hetaja nałada dziejničaje tolki ź dziejnaj ikonaj pola " "nahadvańnia." #: gajim/common/config.py:239 msgid "" "If True, Gajim hides the Roster window on pressing the X button instead of " "minimizing into the Dock." msgstr "" #: gajim/common/config.py:240 msgid "" "If True, Gajim will display an icon on each tab containing unread messages. " "Depending on the theme, this icon may be animated." msgstr "" "Kali opcyja maje vartaść True, Gajim pakazvaje ikonu na kožnaj kartcy ź " "niečytanymi paviedamleńniami. U zaležnaści ad matyvu, hetaja ikona moža być " "animavanaj." #: gajim/common/config.py:241 msgid "" "If True, Gajim will display the status message, if not empty, for every " "contact under the contact name in roster window." msgstr "" "Kali opcyja maje vartaść True, Gajim pakazvaje status kožnaha kantaktu, kali " "jon nie pusty, dla kožnaha elementu śpisu kantaktaŭ." #: gajim/common/config.py:247 msgid "Define the position of the avatar in roster. Can be left or right" msgstr "" #: gajim/common/config.py:248 msgid "" "If False, Gajim will no longer print status line in chats when a contact " "changes his or her status and/or his or her status message." msgstr "" "Kali opcyja maje vartaść False, Gajim nie budzie pakazvać radki stanu, kali " "surazmoŭca źmianiaje status i/ci paviedamleńnie statusu." #: gajim/common/config.py:249 #, fuzzy msgid "" "Can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " "longer print status line in groupchats when a member changes his or her " "status and/or his or her status message. If \"all\" Gajim will print all " "status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " "group chat." msgstr "" "moža mieć vartaść: \"none\", \"all\" albo \"in_and_out\". Kali opcyja maje " "vartaść \"none\", Gajim nia budzie pakazvać paviedamleńni statusu ŭ " "pakojach, kali surazmoŭca źmianiaje status. Kali opcyja maje vartaść \"all" "\", Gajim budzie pakazvać usie takija paviedamleńni. Kali opcyja maje " "vartaść \"in_and_out\", Gajim budzie pakazvać tolki paviedamleńni ab " "dałučeńni/adłučeńni surazmoŭcaŭ." #: gajim/common/config.py:251 msgid "Log XHTML messages instead of plain text messages." msgstr "" #: gajim/common/config.py:252 msgid "Background color of contacts when they just signed in." msgstr "Fonavy koler kantaktaŭ, kali jany tolki dałučylisia." #: gajim/common/config.py:253 msgid "Background color of contacts when they just signed out." msgstr "Fonavy koler kantaktaŭ, kali jany tolki adłučylisia." #: gajim/common/config.py:255 msgid "" "If True, restored messages will use a smaller font than the default one." msgstr "" "Kali opcyja maje vartaść True, adnoŭlenyja paviedamleńni buduć pakazvacca " "mienšym za zmoŭčany šryftam." #: gajim/common/config.py:256 msgid "Don't show avatar for the transport itself." msgstr "Nie pakazvaj avatara dla transpartu." #: gajim/common/config.py:257 msgid "Don't show roster in the system taskbar." msgstr "Nie pakazvaj śpis kantaktaŭ na paneli zadańniaŭ." #: gajim/common/config.py:258 msgid "" "If True and installed GTK+ and PyGTK versions are at least 2.8, make the " "window flash (the default behaviour in most Window Managers) when holding " "pending events." msgstr "" "Kali opcyja maje vartaść True i kali instalavanyja GTK+ i PyGTK versii 2.8 " "albo paźniejšaj, mirhaj aknom (zmoŭčanyja pavodziny akna ŭ bolšaści " "Kiraŭnikoŭ voknaŭ) pry najaŭnaści niečytanych paviedamleńniaŭ." #: gajim/common/config.py:260 msgid "" "Jabberd1.4 does not like sha info when one join a password protected group " "chat. Turn this option to False to stop sending sha info in group chat " "presences." msgstr "" "Jabberd1.4 nia lubić danych SHA pry sprobie dałučeńnia da pakoju, " "abaronienaha parolem. Źmiani vartaść hetaj opcyi na False, kab pierastać " "słać takija danyja SHA." #: gajim/common/config.py:263 #, fuzzy msgid "" "Controls the window where new messages are placed.\n" "'always' - All messages are sent to a single window.\n" "'always_with_roster' - Like 'always' but the messages are in a single window " "along with the roster.\n" "'never' - All messages get their own window.\n" "'peracct' - Messages for each account are sent to a specific window.\n" "'pertype' - Each message type (e.g. chats vs. groupchats) is sent to a " "specific window." msgstr "" "Kiruje aknom, u jakim pakazvajucca novyja paviedamleńni.\n" "'always' - Usie paviedamleńni pakazvajucca ŭ adnym aknie.\n" "'never' - Usie paviedamleńni pakazvajucca ŭ asobnych voknach.\n" "'peracct' - Paviedamleńnia z adnaho kontu pakazvajucca ŭ adnym aknie.\n" "'pertype' - Paviedamleńni adnaho typu (naprykład, pryvatnyja albo hrupavyja) " "pakazvajucca ŭ asobnych voknach. Zvažaj, što kab ubačyć źmieny, treba " "ŭruchomić Gajima nanoŭ." #: gajim/common/config.py:264 msgid "" "Show roster on startup.\n" "'always' - Always show roster.\n" "'never' - Never show roster.\n" "'last_state' - Restore the last state roster." msgstr "" #: gajim/common/config.py:265 msgid "If False, you will no longer see the avatar in the chat window." msgstr "" "Kali opcyja maje vartaść False, ty bolš nia ŭbačyš avatara ŭ aknie razmovy." #: gajim/common/config.py:266 msgid "If True, pressing the escape key closes a tab/window." msgstr "" "Kali opcyja maje vartaść True, nacisk klavišy Escape začyniaje kartku/akno." #: gajim/common/config.py:267 msgid "Hides the banner in a group chat window" msgstr "Chavaje baner u aknie pakoju" #: gajim/common/config.py:268 msgid "Hides the banner in two persons chat window" msgstr "Chavaje baner u aknie pryvatnaj razmovy" #: gajim/common/config.py:269 msgid "Hides the group chat occupants list in group chat window." msgstr "Chavaje śpis naviednikaŭ pakoju." #: gajim/common/config.py:270 msgid "" "In a chat, show the nickname at the beginning of a line only when it's not " "the same person talking than in previous message." msgstr "" "U pakoji pakazvaj mianušku pierad paviedamleńniem, tolki kali jaho napisała " "nia taja asoba, što napisała papiaredniaje paviedamleńnie." #: gajim/common/config.py:271 msgid "Indentation when using merge consecutive nickname." msgstr "Vodstup pry šmatmetavym pryznačeńni paviedamleńnia." #: gajim/common/config.py:272 #, fuzzy msgid "" "List of colors, separated by \":\", that will be used to color nicknames in " "group chats." msgstr "Śpis koleraŭ dla farbavańnia mianušak u pakojach." #: gajim/common/config.py:273 msgid "Ctrl-Tab go to next composing tab when none is unread." msgstr "" "Ctrl-Tab pierachodzić na nastupnuju kartku, kali na dziejnaj niama " "niečytanych paviedamleńniaŭ." #: gajim/common/config.py:274 msgid "" "Should we show the confirm metacontacts creation dialog or not? Empty string " "means we never show the dialog." msgstr "" "Ci treba pakazvać akno paćvierdžańnia pry stvareńni metakantaktu? Pusty " "radok aznačaje, što hetaje akno nikoli nia budzie pakazvacca." #: gajim/common/config.py:275 #, fuzzy msgid "" "Should we show the confirm block contact dialog or not? Empty string means " "we never show the dialog." msgstr "" "Ci treba pakazvać akno paćvierdžańnia pry stvareńni metakantaktu? Pusty " "radok aznačaje, što hetaje akno nikoli nia budzie pakazvacca." #: gajim/common/config.py:276 #, fuzzy msgid "" "Should we show the confirm custom status dialog or not? Empty string means " "we never show the dialog." msgstr "" "Ci treba pakazvać akno paćvierdžańnia pry stvareńni metakantaktu? Pusty " "radok aznačaje, što hetaje akno nikoli nia budzie pakazvacca." #: gajim/common/config.py:277 msgid "" "If True, you will be able to set a negative priority to your account in " "account modification window. BE CAREFUL, when you are logged in with a " "negative priority, you will NOT receive any message from your server." msgstr "" "Kali opcyja maje vartaść True, ty zmožaš akreślić admoŭny pryjarytet ŭ aknie " "madyfikacyi kontu. UHAVA: kali ty dałučajeśsia z admoŭnym pryjarytetam, to " "nia budzieš atrymvać paviedamleńniaŭ z servera." #: gajim/common/config.py:278 msgid "" "If True, Gajim will show number of online and total contacts in account and " "group rows." msgstr "" "Kali opcyja maje vartaść True, Gajim budzie pakazvać kolkaść dałučanych " "kantaktaŭ i ahulnuju kolkaść kantaktaŭ u radkach kontaŭ i hrupaŭ." #: gajim/common/config.py:279 msgid "" "Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " "as if they were of this type" msgstr "" "Moža być pustym albo mieć vartaść 'chat' ci 'normal'. Kali vartaść nie " "pustaja, traktuj usie ŭvachodnyja paviedamleńni jak paviedamleńni hetaha typu" #: gajim/common/config.py:280 msgid "" "If True, Gajim will scroll and select the contact who sent you the last " "message, if chat window is not already opened." msgstr "" #: gajim/common/config.py:281 msgid "Time of inactivity needed before the change status window closes down." msgstr "" #: gajim/common/config.py:282 msgid "" "Maximum number of lines that are printed in conversations. Oldest lines are " "cleared." msgstr "" #: gajim/common/config.py:283 msgid "" "If True, notification windows from notification-daemon will be attached to " "notification icon." msgstr "" #: gajim/common/config.py:284 msgid "Choose interval between 2 checks of idleness." msgstr "" #: gajim/common/config.py:285 msgid "" "Valid uri schemes. Only schemes in this list will be accepted as \"real\" " "uri. (mailto and xmpp are handled separately)" msgstr "" #: gajim/common/config.py:286 msgid "If True, completion in groupchats will be like a shell auto-completion" msgstr "" #: gajim/common/config.py:287 msgid "" "When is self contact row displayed. Can be \"always\", \"when_other_resource" "\" or \"never\"" msgstr "" #: gajim/common/config.py:292 msgid "Optionally fix jingle output video framerate. Example: 10/1 or 25/2" msgstr "" #: gajim/common/config.py:293 msgid "Optionally resize jingle output video. Example: 320x240" msgstr "" #: gajim/common/config.py:294 msgid "If True, You will also see your webcam" msgstr "" #: gajim/common/config.py:297 msgid "" "If True, Gajim will try to use a STUN server when using Jingle. The one in " "\"stun_server\" option, or the one given by the XMPP server." msgstr "" #: gajim/common/config.py:298 msgid "STUN server to use when using Jingle" msgstr "" #: gajim/common/config.py:299 msgid "" "If True, Gajim will show affiliation of groupchat occupants by adding a " "colored square to the status icon" msgstr "" #: gajim/common/config.py:300 msgid "" "Proxy used for all outgoing connections if the account does not have a " "specific proxy configured" msgstr "" #: gajim/common/config.py:301 msgid "If True, Gajim will ignore incoming attention requestd (\"wizz\")." msgstr "" #: gajim/common/config.py:302 msgid "" "If enabled, Gajim will reopen chat windows that were opened last time Gajim " "was closed." msgstr "" #: gajim/common/config.py:303 msgid "" "If enabled, Gajim will show an icon to show that sent message has been " "received by your contact" msgstr "" #: gajim/common/config.py:304 msgid "Show a mini avatar in chat window tabs and in window icon" msgstr "" #: gajim/common/config.py:305 #, fuzzy msgid "If True, Gajim will use the Systems Keyring to store account passwords." msgstr "" "Kali opcyja maje vartaść True, Gajim budzie zachoŭvać paroli z dapamohaj " "Kiraŭnika parolaŭ GNOME (kali jość mahčymaść)." #: gajim/common/config.py:306 msgid "Sets the encoding used by python-gnupg" msgstr "" #: gajim/common/config.py:307 msgid "If True, Gajim will execute XEP-0146 Commands." msgstr "" #: gajim/common/config.py:308 msgid "All non-compliant MAM Groupchats" msgstr "" #: gajim/common/config.py:324 msgid "" "Priority will change automatically according to your status. Priorities are " "defined in autopriority_* options." msgstr "" "Pryjarytet budzie aŭtamatyčna źmianiacca zhodna tvajmu statusu. Pryjarytety " "akreślivajucca ŭ opcyjach autopriority_*." #: gajim/common/config.py:332 msgid "" "Status used to autoconnect as. Can be online, chat, away, xa, dnd, " "invisible. NOTE: this option is used only if restore_last_status is disabled" msgstr "" #: gajim/common/config.py:333 msgid "If enabled, restore the last status that was used." msgstr "" #: gajim/common/config.py:335 msgid "" "If True, Contacts requesting authorization will be automatically accepted." msgstr "" #: gajim/common/config.py:336 #, fuzzy msgid "" "If False, this account will be disabled and will not appear in roster window." msgstr "" "Kali opcyja maje vartaść False, ty bolš nia ŭbačyš avatara ŭ aknie razmovy." #: gajim/common/config.py:339 msgid "" "If disabled, don't sign presences with GPG key, even if GPG is configured." msgstr "" #: gajim/common/config.py:341 msgid "Enable ESessions encryption for this account." msgstr "" #: gajim/common/config.py:342 msgid "Should Gajim automatically start an encrypted session when possible?" msgstr "" #: gajim/common/config.py:343 msgid "Allow plaintext connections" msgstr "" #: gajim/common/config.py:346 msgid "" "List (space separated) of authentication mechanisms to try. Can contain " "ANONYMOUS, EXTERNAL, GSSAPI, SCRAM-SHA-1-PLUS, SCRAM-SHA-1, DIGEST-MD5, " "PLAIN, X-MESSENGER-OAUTH2 or XEP-0078" msgstr "" #: gajim/common/config.py:347 msgid "" "Show a warning dialog before sending password on an plaintext connection. " "Can be 'warn', 'connect', 'disconnect'" msgstr "" #: gajim/common/config.py:348 msgid "Show a warning dialog before using standard SSL library." msgstr "" #: gajim/common/config.py:349 msgid "" "Show a warning dialog before sending PLAIN password over a plain connection." msgstr "" #: gajim/common/config.py:352 msgid "Space separated list of ssl errors to ignore." msgstr "" #: gajim/common/config.py:358 msgid "" "Space separated list of JIDs for which you do not want to store logs. You " "can also add account name to log nothing for this account." msgstr "" #: gajim/common/config.py:359 msgid "" "On startup, Gajim will download logs stored on server, provided the server " "supports XEP-0313" msgstr "" #: gajim/common/config.py:360 msgid "" "Space separated list of JIDs for which you accept to not log conversations " "if he does not want to." msgstr "" #: gajim/common/config.py:363 msgid "Whitespace sent after inactivity" msgstr "" #: gajim/common/config.py:364 msgid "XMPP ping sent after inactivity" msgstr "" #: gajim/common/config.py:368 msgid "" "How many seconds to wait for the answer of ping alive packet before we try " "to reconnect?" msgstr "" #: gajim/common/config.py:372 msgid "Jabberd2 workaround" msgstr "Abychod dla Jabberd2" #: gajim/common/config.py:375 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." msgstr "" "Kali hetaja opcyja ŭklučanaja, Gajim budzie pieradavać fajły z akreślenym " "adrasam IP i proxy-serveram z opcyi file_transfer_proxies." #: gajim/common/config.py:376 msgid "" "If True, Gajim will test file transfer proxies on startup to be sure it " "works. Openfire's proxies are known to fail this test even if they work." msgstr "" #: gajim/common/config.py:389 msgid "Answer to receipt requests" msgstr "" #: gajim/common/config.py:390 msgid "Sent receipt requests" msgstr "" #: gajim/common/config.py:399 #, fuzzy msgid "" "Allow Gajim to send information about the operating system you are running." msgstr "" "Kali ŭklučanaja hetaja opcyja, Gajim budzie dałučacca da hetaha pakoju pry " "starcie" #: gajim/common/config.py:400 #, fuzzy msgid "Allow Gajim to send your local time." msgstr "%s choča dasłać tabie fajł." #: gajim/common/config.py:401 msgid "" "When negotiating an encrypted session, should Gajim assume you want your " "messages to be logged?" msgstr "" #: gajim/common/config.py:404 #, fuzzy msgid "Message that is sent to contacts you want to add" msgstr "Kali łaska, zapoŭni źviestki ab kantakcie, jaki chočaš dadać" #: gajim/common/config.py:405 msgid "" "If enabled and if server supports this feature, Gajim will receive messages " "sent and received by other resources." msgstr "" #: gajim/common/config.py:406 msgid "" "If enabled, Gajim will send your local IPs so your contact can connect to " "your machine to transfer files." msgstr "" #: gajim/common/config.py:407 #, fuzzy msgid "Latest token for OAuth 2.0 authentication." msgstr "Užyvaj aŭtaryzacyju" #: gajim/common/config.py:408 #, fuzzy msgid "client_id for OAuth 2.0 authentication." msgstr "Užyvaj aŭtaryzacyju" #: gajim/common/config.py:409 #, fuzzy msgid "redirect_url for OAuth 2.0 authentication." msgstr "Užyvaj aŭtaryzacyju" #: gajim/common/config.py:410 msgid "" "Space separated list of JIDs for which we want to re-open a chat window on " "next startup." msgstr "" #: gajim/common/config.py:412 msgid "HTTP Upload: Enable HTTPS Verification" msgstr "" #: gajim/common/config.py:413 msgid "" "Preferred file transfer mechanism for file drag&drop on chat window. Can be " "'httpupload' (default) or 'jingle'" msgstr "" #: gajim/common/config.py:476 gajim/common/config.py:481 msgid "Language for which we want to check misspelled words" msgstr "Mova, dla jakoj treba praviarać pravapis" #: gajim/common/config.py:478 msgid "The currently active encryption for that contact" msgstr "" #: gajim/common/config.py:482 msgid "" "How many lines to request from server when entering a groupchat. -1 means no " "limit, -2 means global value" msgstr "" #: gajim/common/config.py:483 msgid "" "Minutes of backlog to request when entering a groupchat. -1 means no limit, " "-2 means global value" msgstr "" #: gajim/common/config.py:484 msgid "State whether we want a notification for every message in this room" msgstr "" #: gajim/common/config.py:487 msgid "" "State whether plugins should be activated on startup (this is saved on Gajim " "exit). This option SHOULD NOT be used to (de)activate plug-ins. Use GUI " "instead." msgstr "" #: gajim/common/config.py:492 gajim/common/pep.py:157 msgid "Sleeping" msgstr "Splu" #: gajim/common/config.py:493 msgid "Back soon" msgstr "Chutka viarnusia" #: gajim/common/config.py:493 msgid "Back in some minutes." msgstr "Viarnusia praz paru chvilinaŭ." #: gajim/common/config.py:494 gajim/common/pep.py:127 msgid "Eating" msgstr "Jem" #: gajim/common/config.py:494 msgid "I'm eating, so leave me a message." msgstr "Ja jem, možaš pakinuć mnie paviedamleńnie." #: gajim/common/config.py:495 msgid "Movie" msgstr "Film" #: gajim/common/config.py:495 msgid "I'm watching a movie." msgstr "Hladžu film." #: gajim/common/config.py:496 gajim/common/pep.py:186 msgid "Working" msgstr "Pracuju" #: gajim/common/config.py:496 msgid "I'm working." msgstr "Ja pracuju." #: gajim/common/config.py:497 msgid "Phone" msgstr "Telefon" #: gajim/common/config.py:497 msgid "I'm on the phone." msgstr "Ja razmaŭlaju pa telefonie." #: gajim/common/config.py:498 msgid "Out" msgstr "Vyjšaŭ" #: gajim/common/config.py:498 msgid "I'm out enjoying life." msgstr "Vyjšaŭ ciešycca z žyćcia." #: gajim/common/config.py:509 msgid "I'm available." msgstr "Dastupny." #: gajim/common/config.py:510 msgid "I'm free for chat." msgstr "Achvotna parazmaŭlaju." #: gajim/common/config.py:512 msgid "I'm not available." msgstr "Niedastupny." #: gajim/common/config.py:513 msgid "Do not disturb." msgstr "Nie turbavać." #: gajim/common/config.py:514 gajim/common/config.py:515 msgid "Bye!" msgstr "Byvaj!" #: gajim/common/config.py:526 msgid "" "Sound to play when a group chat message contains one of the words in " "muc_highlight_words, or when a group chat message contains your nickname." msgstr "" "Hukm jaki treba hrać, kali paviedamleńnie ŭ pakoji ŭtrymlivaje adno sa " "słovaŭ, akreślenych u opcyi muc_highlight_words, albo tvaju mianušku." #: gajim/common/config.py:527 msgid "Sound to play when any MUC message arrives." msgstr "Huk, jaki treba hrać pry atrymańni novaha hrupavoha paviedamleńnia." #: gajim/common/config.py:535 gajim/common/optparser.py:357 msgid "green" msgstr "zialony" #: gajim/common/config.py:539 gajim/common/optparser.py:343 msgid "grocery" msgstr "bakaleja" #: gajim/common/config.py:543 msgid "human" msgstr "čałaviek" #: gajim/common/config.py:547 msgid "marine" msgstr "marski" #: gajim/common/config.py:554 #, fuzzy msgid "Tor" msgstr "Da" #: gajim/common/commands.py:86 msgid "Change status information" msgstr "Źmiani infarmacyju statusu" #: gajim/common/commands.py:108 msgid "Change status" msgstr "Źmiani status" #: gajim/common/commands.py:109 msgid "Set the presence type and description" msgstr "Akreśli typ bačnaści i apisańnie" #: gajim/common/commands.py:115 msgid "Free for chat" msgstr "Achvotna parazmaŭlaju" #: gajim/common/commands.py:116 msgid "Online" msgstr "Dałučany" #: gajim/common/commands.py:118 msgid "Extended away" msgstr "Adyjšoŭ" #: gajim/common/commands.py:119 msgid "Do not disturb" msgstr "Nie turbavać" #: gajim/common/commands.py:120 msgid "Offline - disconnect" msgstr "Niabačny - adłučany" #: gajim/common/commands.py:125 msgid "Presence description:" msgstr "Apisańnie statusu:" #: gajim/common/commands.py:160 gajim/common/commands.py:343 msgid "The status has been changed." msgstr "Status źmianiŭsia." #: gajim/common/commands.py:192 gajim/common/commands.py:225 msgid "Leave Groupchats" msgstr "Pakiń pakoji" #: gajim/common/commands.py:215 #, python-format msgid "%(nickname)s on %(room_jid)s" msgstr "%(nickname)s z pakoju %(room_jid)s" #: gajim/common/commands.py:219 msgid "You have not joined a groupchat." msgstr "Ty nie dałučyŭsia da pakoju." #: gajim/common/commands.py:226 msgid "Choose the groupchats you want to leave" msgstr "Zaznač pakoji, jakija chočaš pakinuć" #: gajim/common/commands.py:271 #, fuzzy msgid "You left the following groupchats:" msgstr "Ty pakinuŭ nastupnyja pakoji:" #: gajim/common/commands.py:283 #, fuzzy msgid "Forward unread messages" msgstr "%d niečytanaje paviedamleńnie" #: gajim/common/commands.py:310 msgid "All unread messages have been forwarded." msgstr "" #: gajim/common/commands.py:318 #, fuzzy msgid "Forward unread message then disconnect" msgstr "%d niečytanaje paviedamleńnie" #: gajim/common/httpupload.py:137 #, fuzzy msgid "File is empty" msgstr "Ściežka da fajłu" #: gajim/common/httpupload.py:140 #, fuzzy msgid "File does not exist" msgstr "Takoha pakoju niama." #: gajim/common/httpupload.py:147 gajim/common/httpupload.py:204 #, python-format msgid "File is too large, maximum allowed file size is: %s" msgstr "" #: gajim/common/check_paths.py:37 msgid "creating logs database" msgstr "stvarajecca baza žurnałaŭ" #: gajim/common/check_paths.py:98 #, fuzzy msgid "creating cache database" msgstr "stvarajecca baza žurnałaŭ" #: gajim/common/check_paths.py:261 #, fuzzy, python-format msgid "moving %(src)s to %(dst)s" msgstr "Dašli %s" #: gajim/common/check_paths.py:287 gajim/common/check_paths.py:294 #: gajim/common/check_paths.py:301 gajim/common/check_paths.py:308 #: gajim/common/check_paths.py:315 gajim/common/check_paths.py:322 #: gajim/common/check_paths.py:329 gajim/common/check_paths.py:336 #, python-format msgid "%s is a file but it should be a directory" msgstr "%s jość fajłam, ale musiŭ być kataloh" #: gajim/common/check_paths.py:288 gajim/common/check_paths.py:295 #: gajim/common/check_paths.py:302 gajim/common/check_paths.py:309 #: gajim/common/check_paths.py:316 gajim/common/check_paths.py:323 #: gajim/common/check_paths.py:330 gajim/common/check_paths.py:337 #: gajim/common/check_paths.py:349 gajim/common/check_paths.py:357 msgid "Gajim will now exit" msgstr "Gajim zaviaršaje vykanańnie" #: gajim/common/check_paths.py:348 gajim/common/check_paths.py:356 #, python-format msgid "%s is a directory but should be a file" msgstr "%s jość kataloham, ale musiŭ być fajł" #: gajim/common/optparser.py:55 #, python-format msgid "Error: cannot open %s for reading" msgstr "Pamyłka: niemahčyma adčytać %s" #: gajim/common/optparser.py:352 gajim/common/optparser.py:353 msgid "cyan" msgstr "cyan" #: gajim/common/optparser.py:421 msgid "migrating logs database to indices" msgstr "indeksavańnie bazy razmoŭ" #: gajim/common/logging_helpers.py:34 #, python-format msgid "%s is not a valid loglevel" msgstr "" #: gajim/common/connection.py:83 msgid "Unable to get issuer certificate" msgstr "" #: gajim/common/connection.py:84 msgid "Unable to get certificate CRL" msgstr "" #: gajim/common/connection.py:85 msgid "Unable to decrypt certificate's signature" msgstr "" #: gajim/common/connection.py:86 msgid "Unable to decrypt CRL's signature" msgstr "" #: gajim/common/connection.py:87 #, fuzzy msgid "Unable to decode issuer public key" msgstr "Niemahčyma adčytać modulu idle" #: gajim/common/connection.py:88 msgid "Certificate signature failure" msgstr "" #: gajim/common/connection.py:89 msgid "CRL signature failure" msgstr "" #: gajim/common/connection.py:90 msgid "Certificate is not yet valid" msgstr "" #: gajim/common/connection.py:91 msgid "Certificate has expired" msgstr "" #: gajim/common/connection.py:92 msgid "CRL is not yet valid" msgstr "" #: gajim/common/connection.py:93 msgid "CRL has expired" msgstr "" #: gajim/common/connection.py:94 msgid "Format error in certificate's notBefore field" msgstr "" #: gajim/common/connection.py:95 msgid "Format error in certificate's notAfter field" msgstr "" #: gajim/common/connection.py:96 msgid "Format error in CRL's lastUpdate field" msgstr "" #: gajim/common/connection.py:97 msgid "Format error in CRL's nextUpdate field" msgstr "" #: gajim/common/connection.py:98 msgid "Out of memory" msgstr "" #: gajim/common/connection.py:99 msgid "Self signed certificate" msgstr "" #: gajim/common/connection.py:100 msgid "Self signed certificate in certificate chain" msgstr "" #: gajim/common/connection.py:101 msgid "Unable to get local issuer certificate" msgstr "" #: gajim/common/connection.py:102 msgid "Unable to verify the first certificate" msgstr "" #: gajim/common/connection.py:103 msgid "Certificate chain too long" msgstr "" #: gajim/common/connection.py:104 msgid "Certificate revoked" msgstr "" #: gajim/common/connection.py:105 #, fuzzy msgid "Invalid CA certificate" msgstr "Niapravilnaje imia karystalnika" #: gajim/common/connection.py:106 msgid "Path length constraint exceeded" msgstr "" #: gajim/common/connection.py:107 msgid "Unsupported certificate purpose" msgstr "" #: gajim/common/connection.py:108 msgid "Certificate not trusted" msgstr "" #: gajim/common/connection.py:109 msgid "Certificate rejected" msgstr "" #: gajim/common/connection.py:110 msgid "Subject issuer mismatch" msgstr "" #: gajim/common/connection.py:111 msgid "Authority and subject key identifier mismatch" msgstr "" #: gajim/common/connection.py:112 msgid "Authority and issuer serial number mismatch" msgstr "" #: gajim/common/connection.py:113 msgid "Key usage does not include certificate signing" msgstr "" #: gajim/common/connection.py:114 msgid "Application verification failure" msgstr "" #: gajim/common/connection.py:876 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Złučeńnie dla kontu \"%s\" zhubiłasia" #: gajim/common/connection.py:877 msgid "Reconnect manually." msgstr "Pieradałučysia samastojna." #: gajim/common/connection.py:888 #, fuzzy, python-format msgid "Server %(name)s answered wrongly to register request: %(error)s" msgstr "Transpart %s niapravilna adkazaŭ na zapyt rehistracyi: %s" #: gajim/common/connection.py:930 #, python-format msgid "Server %s provided a different registration form" msgstr "" #: gajim/common/connection.py:1283 #, fuzzy, python-format msgid "Could not connect to \"%(host)s\" via proxy \"%(proxy)s\"" msgstr "Niemahčyma złučycca z \"%s\"" #: gajim/common/connection.py:1286 #, fuzzy, python-format msgid "Could not connect to \"%(host)s\"" msgstr "Niemahčyma złučycca z \"%s\"" #: gajim/common/connection.py:1293 #, fuzzy, python-format msgid "Server replied: %s" msgstr "Zapisany ŭ: %s" #: gajim/common/connection.py:1308 #, fuzzy msgid "Connection to proxy failed" msgstr "Niemahvyma dałučycca" #: gajim/common/connection.py:1346 gajim/common/connection.py:1449 #, fuzzy, python-format msgid "Could not connect to account %s" msgstr "Niemahčyma złučycca z \"%s\"" #: gajim/common/connection.py:1347 gajim/common/connection.py:1450 #, fuzzy, python-format msgid "Connection with account %s has been lost. Retry connecting." msgstr "Złučeńnie dla kontu \"%s\" zhubiłasia" #: gajim/common/connection.py:1372 #, python-format msgid "The authenticity of the %s certificate could be invalid" msgstr "" #: gajim/common/connection.py:1375 #, python-format msgid "" "\n" "SSL Error: %s" msgstr "" #: gajim/common/connection.py:1377 #, python-format msgid "" "\n" "Unknown SSL error: %d" msgstr "" #: gajim/common/connection.py:1423 #, python-format msgid "" "The authenticity of the %s certificate could be invalid.\n" "The certificate does not cover this domain." msgstr "" #: gajim/common/connection.py:1473 gajim/common/connection.py:2238 #: gajim/common/zeroconf/connection_zeroconf.py:192 #, python-format msgid "Could not connect to \"%s\"" msgstr "Niemahčyma złučycca z \"%s\"" #: gajim/common/connection.py:1512 #, python-format msgid "Authentication failed with \"%s\"" msgstr "Pamyłka aŭtaryzacyi z \"%s\"" #: gajim/common/connection.py:1513 msgid "Please check your login and password for correctness." msgstr "Kali łaska, pravier pravilnaść loginu i parolu." #: gajim/common/connection.py:2097 #, python-format msgid "Sent contact: \"%(jid)s\" (%(name)s)" msgstr "" #: gajim/common/connection.py:2101 #, fuzzy msgid "Sent contacts:" msgstr "Kantakty" #: gajim/common/connection.py:2255 gajim/common/connection.py:2277 msgid "Not fetched because of invisible status" msgstr "Nia ściahnuta z-za niabačnaha statusu" #: gajim/common/dbus_support.py:44 msgid "D-Bus python bindings are missing in this computer" msgstr "Nie staje fajłaŭ padtrymki Python dla D-Bus na hetym kamputary" #: gajim/common/dbus_support.py:45 gajim/common/dbus_support.py:56 msgid "D-Bus capabilities of Gajim cannot be used" msgstr "Niemahčyma vykarystać mahčymaści D-Bus dla Gajima" #: gajim/common/dbus_support.py:55 msgid "D-Bus does not run correctly on this machine" msgstr "" #: gajim/common/dbus_support.py:58 #, fuzzy msgid "D-Bus does not run correctly on this machine: system bus not present" msgstr "D-Busu niama na hetym kamputary, albo nie staje modula Python" #: gajim/common/dbus_support.py:61 #, fuzzy msgid "D-Bus does not run correctly on this machine: session bus not present" msgstr "D-Busu niama na hetym kamputary, albo nie staje modula Python" #: gajim/common/multimedia_helpers.py:45 #, fuzzy msgid "Default device" msgstr "Standartnyja šablony paviedamleńniaŭ statusu" #: gajim/common/multimedia_helpers.py:66 msgid "Audio test" msgstr "" #: gajim/common/multimedia_helpers.py:69 gajim/common/multimedia_helpers.py:85 #: gajim/common/multimedia_helpers.py:99 gajim/common/multimedia_helpers.py:117 msgid "Autodetect" msgstr "" #: gajim/common/multimedia_helpers.py:72 gajim/common/multimedia_helpers.py:87 #, fuzzy, python-format msgid "ALSA: %s" msgstr "Pamier: %s" #: gajim/common/multimedia_helpers.py:75 gajim/common/multimedia_helpers.py:89 #, fuzzy, python-format msgid "Pulse: %s" msgstr "Fajł: %s" #: gajim/common/multimedia_helpers.py:83 msgid "Fake audio output" msgstr "" #: gajim/common/multimedia_helpers.py:96 msgid "Video test" msgstr "" #: gajim/common/multimedia_helpers.py:101 #, python-format msgid "V4L2: %s" msgstr "" #: gajim/common/multimedia_helpers.py:104 #, fuzzy msgid "Screen" msgstr "zialony" #: gajim/common/multimedia_helpers.py:111 msgid "Fake video output" msgstr "" #: gajim/common/multimedia_helpers.py:114 #, python-format msgid "X Window System (X11/XShm/Xv): %s" msgstr "" #: gajim/common/multimedia_helpers.py:116 msgid "X Window System (without Xv)" msgstr "" #: gajim/common/pep.py:27 msgid "Afraid" msgstr "" #: gajim/common/pep.py:28 msgid "Amazed" msgstr "" #: gajim/common/pep.py:29 msgid "Amorous" msgstr "" #: gajim/common/pep.py:30 msgid "Angry" msgstr "" #: gajim/common/pep.py:31 msgid "Annoyed" msgstr "" #: gajim/common/pep.py:32 msgid "Anxious" msgstr "" #: gajim/common/pep.py:33 #, fuzzy msgid "Aroused" msgstr "Prypynienaja" #: gajim/common/pep.py:34 msgid "Ashamed" msgstr "" #: gajim/common/pep.py:35 #, fuzzy msgid "Bored" msgstr "Tłusty" #: gajim/common/pep.py:36 #, fuzzy msgid "Brave" msgstr "Nie razmaŭlaju " #: gajim/common/pep.py:37 msgid "Calm" msgstr "" #: gajim/common/pep.py:38 #, fuzzy msgid "Cautious" msgstr "Razmovy" #: gajim/common/pep.py:39 #, fuzzy msgid "Cold" msgstr "Tłusty" #: gajim/common/pep.py:40 #, fuzzy msgid "Confident" msgstr "_Źmiest" #: gajim/common/pep.py:41 msgid "Confused" msgstr "" #: gajim/common/pep.py:42 #, fuzzy msgid "Contemplative" msgstr "Zavieršana" #: gajim/common/pep.py:43 #, fuzzy msgid "Contented" msgstr "_Źmiest" #: gajim/common/pep.py:44 msgid "Cranky" msgstr "" #: gajim/common/pep.py:45 msgid "Crazy" msgstr "" #: gajim/common/pep.py:46 #, fuzzy msgid "Creative" msgstr "Niadziejny" #: gajim/common/pep.py:47 #, fuzzy msgid "Curious" msgstr "uri" #: gajim/common/pep.py:48 #, fuzzy msgid "Dejected" msgstr "Vydal" #: gajim/common/pep.py:49 msgid "Depressed" msgstr "" #: gajim/common/pep.py:50 #, fuzzy msgid "Disappointed" msgstr "Adklučana" #: gajim/common/pep.py:51 msgid "Disgusted" msgstr "" #: gajim/common/pep.py:52 #, fuzzy msgid "Dismayed" msgstr "Adklučana" #: gajim/common/pep.py:53 #, fuzzy msgid "Distracted" msgstr "Adklučana" #: gajim/common/pep.py:54 msgid "Embarrassed" msgstr "" #: gajim/common/pep.py:55 msgid "Envious" msgstr "" #: gajim/common/pep.py:56 #, fuzzy msgid "Excited" msgstr "Dziejny" #: gajim/common/pep.py:57 msgid "Flirtatious" msgstr "" #: gajim/common/pep.py:58 msgid "Frustrated" msgstr "" #: gajim/common/pep.py:59 msgid "Grateful" msgstr "" #: gajim/common/pep.py:60 msgid "Grieving" msgstr "" #: gajim/common/pep.py:61 #, fuzzy msgid "Grumpy" msgstr "Hrupa" #: gajim/common/pep.py:62 msgid "Guilty" msgstr "" #: gajim/common/pep.py:63 msgid "Happy" msgstr "" #: gajim/common/pep.py:64 msgid "Hopeful" msgstr "" #: gajim/common/pep.py:65 #, fuzzy msgid "Hot" msgstr "_Host:" #: gajim/common/pep.py:66 msgid "Humbled" msgstr "" #: gajim/common/pep.py:67 msgid "Humiliated" msgstr "" #: gajim/common/pep.py:68 msgid "Hungry" msgstr "" #: gajim/common/pep.py:69 msgid "Hurt" msgstr "" #: gajim/common/pep.py:70 #, fuzzy msgid "Impressed" msgstr "paviedamleńnie" #: gajim/common/pep.py:71 msgid "In Awe" msgstr "" #: gajim/common/pep.py:72 msgid "In Love" msgstr "" #: gajim/common/pep.py:73 msgid "Indignant" msgstr "" #: gajim/common/pep.py:74 msgid "Interested" msgstr "" #: gajim/common/pep.py:75 #, fuzzy msgid "Intoxicated" msgstr "Dziejny" #: gajim/common/pep.py:76 #, fuzzy msgid "Invincible" msgstr "Niabačny" #: gajim/common/pep.py:77 msgid "Jealous" msgstr "" #: gajim/common/pep.py:78 #, fuzzy msgid "Lonely" msgstr "pieršaja" #: gajim/common/pep.py:79 #, fuzzy msgid "Lost" msgstr "_Host:" #: gajim/common/pep.py:80 msgid "Lucky" msgstr "" #: gajim/common/pep.py:81 #, fuzzy msgid "Mean" msgstr "Niamieckaja" #: gajim/common/pep.py:82 #, fuzzy msgid "Moody" msgstr "_Madyfikuj" #: gajim/common/pep.py:83 msgid "Nervous" msgstr "" #: gajim/common/pep.py:84 msgid "Neutral" msgstr "" #: gajim/common/pep.py:85 #, fuzzy msgid "Offended" msgstr "Adłučany" #: gajim/common/pep.py:86 msgid "Outraged" msgstr "" #: gajim/common/pep.py:87 msgid "Playful" msgstr "" #: gajim/common/pep.py:88 #, fuzzy msgid "Proud" msgstr "Hrupa" #: gajim/common/pep.py:89 msgid "Relaxed" msgstr "" #: gajim/common/pep.py:90 #, fuzzy msgid "Relieved" msgstr "adzinaccataja" #: gajim/common/pep.py:91 msgid "Remorseful" msgstr "" #: gajim/common/pep.py:92 msgid "Restless" msgstr "" #: gajim/common/pep.py:93 #, fuzzy msgid "Sad" msgstr "Zatrymana" #: gajim/common/pep.py:94 msgid "Sarcastic" msgstr "" #: gajim/common/pep.py:95 #, fuzzy msgid "Satisfied" msgstr "Apošniaja źmiena:" #: gajim/common/pep.py:96 msgid "Serious" msgstr "" #: gajim/common/pep.py:97 msgid "Shocked" msgstr "" #: gajim/common/pep.py:98 msgid "Shy" msgstr "" #: gajim/common/pep.py:99 #, fuzzy msgid "Sick" msgstr "Mianuška" #: gajim/common/pep.py:100 #, fuzzy msgid "Sleepy" msgstr "Splu" #: gajim/common/pep.py:101 msgid "Spontaneous" msgstr "" #: gajim/common/pep.py:102 #, fuzzy msgid "Stressed" msgstr "Vulica:" #: gajim/common/pep.py:103 msgid "Strong" msgstr "" #: gajim/common/pep.py:104 #, fuzzy msgid "Surprised" msgstr "Aŭtaryzavany" #: gajim/common/pep.py:105 msgid "Thankful" msgstr "" #: gajim/common/pep.py:106 msgid "Thirsty" msgstr "" #: gajim/common/pep.py:107 #, fuzzy msgid "Tired" msgstr "Čas" #: gajim/common/pep.py:108 #, fuzzy msgid "Undefined" msgstr "dziaviataja" #: gajim/common/pep.py:109 msgid "Weak" msgstr "" #: gajim/common/pep.py:110 msgid "Worried" msgstr "" #: gajim/common/pep.py:113 #, fuzzy msgid "Doing Chores" msgstr "Niapravilny host" #: gajim/common/pep.py:114 msgid "Buying Groceries" msgstr "" #: gajim/common/pep.py:115 #, fuzzy msgid "Cleaning" msgstr "Viečar" #: gajim/common/pep.py:116 #, fuzzy msgid "Cooking" msgstr "Uvod paviedamleńnia" #: gajim/common/pep.py:117 msgid "Doing Maintenance" msgstr "" #: gajim/common/pep.py:118 msgid "Doing the Dishes" msgstr "" #: gajim/common/pep.py:119 msgid "Doing the Laundry" msgstr "" #: gajim/common/pep.py:120 #, fuzzy msgid "Gardening" msgstr "Ranica" #: gajim/common/pep.py:121 msgid "Running an Errand" msgstr "" #: gajim/common/pep.py:122 #, fuzzy msgid "Walking the Dog" msgstr "pavodle hrupy" #: gajim/common/pep.py:123 #, fuzzy msgid "Drinking" msgstr "Pracuju" #: gajim/common/pep.py:124 msgid "Having a Beer" msgstr "" #: gajim/common/pep.py:125 msgid "Having Coffee" msgstr "" #: gajim/common/pep.py:126 msgid "Having Tea" msgstr "" #: gajim/common/pep.py:128 msgid "Having a Snack" msgstr "" #: gajim/common/pep.py:129 msgid "Having Breakfast" msgstr "" #: gajim/common/pep.py:130 msgid "Having Dinner" msgstr "" #: gajim/common/pep.py:131 msgid "Having Lunch" msgstr "" #: gajim/common/pep.py:132 msgid "Exercising" msgstr "" #: gajim/common/pep.py:133 gajim/common/pep.py:178 msgid "Cycling" msgstr "" #: gajim/common/pep.py:134 #, fuzzy msgid "Dancing" msgstr "Viečar" #: gajim/common/pep.py:135 #, fuzzy msgid "Hiking" msgstr "Vypichvajecca %s" #: gajim/common/pep.py:136 #, fuzzy msgid "Jogging" msgstr "_Dałučysia" #: gajim/common/pep.py:137 msgid "Playing Sports" msgstr "" #: gajim/common/pep.py:138 msgid "Running" msgstr "" #: gajim/common/pep.py:139 #, fuzzy msgid "Skiing" msgstr "Pracuju" #: gajim/common/pep.py:140 msgid "Swimming" msgstr "" #: gajim/common/pep.py:141 #, fuzzy msgid "Working out" msgstr "Pracuju" #: gajim/common/pep.py:142 #, fuzzy msgid "Grooming" msgstr "pakoj" #: gajim/common/pep.py:143 msgid "At the Spa" msgstr "" #: gajim/common/pep.py:144 msgid "Brushing Teeth" msgstr "" #: gajim/common/pep.py:145 msgid "Getting a Haircut" msgstr "" #: gajim/common/pep.py:146 #, fuzzy msgid "Shaving" msgstr "Jem" #: gajim/common/pep.py:147 msgid "Taking a Bath" msgstr "" #: gajim/common/pep.py:148 msgid "Taking a Shower" msgstr "" #: gajim/common/pep.py:149 msgid "Having an Appointment" msgstr "" #: gajim/common/pep.py:150 gajim/data/gui/gajim_themes_window.ui:363 msgid "Inactive" msgstr "Pasiŭny" #: gajim/common/pep.py:151 msgid "Day Off" msgstr "" #: gajim/common/pep.py:152 #, fuzzy msgid "Hanging out" msgstr "Źmianiajecca tema" #: gajim/common/pep.py:153 #, fuzzy msgid "Hiding" msgstr "Vypichvajecca %s" #: gajim/common/pep.py:154 msgid "On Vacation" msgstr "" #: gajim/common/pep.py:155 #, fuzzy msgid "Praying" msgstr "Jem" #: gajim/common/pep.py:156 msgid "Scheduled Holiday" msgstr "" #: gajim/common/pep.py:158 #, fuzzy msgid "Thinking" msgstr "Pracuju" #: gajim/common/pep.py:159 msgid "Relaxing" msgstr "" #: gajim/common/pep.py:160 #, fuzzy msgid "Fishing" msgstr "Vypichvajecca %s" #: gajim/common/pep.py:161 #, fuzzy msgid "Gaming" msgstr "Jem" #: gajim/common/pep.py:162 #, fuzzy msgid "Going out" msgstr "_Adłučajusia" #: gajim/common/pep.py:163 #, fuzzy msgid "Partying" msgstr "Jem" #: gajim/common/pep.py:164 #, fuzzy msgid "Reading" msgstr "Pryčyna" #: gajim/common/pep.py:165 #, fuzzy msgid "Rehearsing" msgstr "Pryčyna" #: gajim/common/pep.py:166 #, fuzzy msgid "Shopping" msgstr "Splu" #: gajim/common/pep.py:167 #, fuzzy msgid "Smoking" msgstr "Pracuju" #: gajim/common/pep.py:168 msgid "Socializing" msgstr "" #: gajim/common/pep.py:169 #, fuzzy msgid "Sunbathing" msgstr "Jem" #: gajim/common/pep.py:170 msgid "Watching TV" msgstr "" #: gajim/common/pep.py:171 #, fuzzy msgid "Watching a Movie" msgstr "Hladžu film." #: gajim/common/pep.py:172 #, fuzzy msgid "Talking" msgstr "Jem" #: gajim/common/pep.py:173 msgid "In Real Life" msgstr "" #: gajim/common/pep.py:174 #, fuzzy msgid "On the Phone" msgstr "Ja razmaŭlaju pa telefonie." #: gajim/common/pep.py:175 msgid "On Video Phone" msgstr "" #: gajim/common/pep.py:176 #, fuzzy msgid "Traveling" msgstr "Pieradajecca" #: gajim/common/pep.py:177 #, fuzzy msgid "Commuting" msgstr "Uvod paviedamleńnia" #: gajim/common/pep.py:179 msgid "Driving" msgstr "" #: gajim/common/pep.py:180 msgid "In a Car" msgstr "" #: gajim/common/pep.py:181 msgid "On a Bus" msgstr "" #: gajim/common/pep.py:182 #, fuzzy msgid "On a Plane" msgstr "Dałučany" #: gajim/common/pep.py:183 #, fuzzy msgid "On a Train" msgstr "Adčyni jak _spasyłku" #: gajim/common/pep.py:184 msgid "On a Trip" msgstr "" #: gajim/common/pep.py:185 #, fuzzy msgid "Walking" msgstr "Pracuju" #: gajim/common/pep.py:187 #, fuzzy msgid "Coding" msgstr "Uvod paviedamleńnia" #: gajim/common/pep.py:188 msgid "In a Meeting" msgstr "" #: gajim/common/pep.py:189 msgid "Studying" msgstr "" #: gajim/common/pep.py:190 #, fuzzy msgid "Writing" msgstr "Pracuju" #: gajim/common/pep.py:195 msgid "accuracy" msgstr "" #: gajim/common/pep.py:196 #, fuzzy msgid "alt" msgstr "Zmoŭčany" #: gajim/common/pep.py:197 msgid "area" msgstr "" #: gajim/common/pep.py:198 #, fuzzy msgid "bearing" msgstr "marski" #: gajim/common/pep.py:199 #, fuzzy msgid "building" msgstr "Vypichvajecca %s" #: gajim/common/pep.py:200 #, fuzzy msgid "country" msgstr "Krajina:" #: gajim/common/pep.py:201 #, fuzzy msgid "countrycode" msgstr "Kont" #: gajim/common/pep.py:202 msgid "datum" msgstr "" #: gajim/common/pep.py:203 #, fuzzy msgid "description" msgstr "Apisańnie" #: gajim/common/pep.py:204 #, fuzzy msgid "error" msgstr "Pamyłka Avahi" #: gajim/common/pep.py:205 msgid "floor" msgstr "" #: gajim/common/pep.py:206 msgid "lat" msgstr "" #: gajim/common/pep.py:207 msgid "locality" msgstr "" #: gajim/common/pep.py:208 #, fuzzy msgid "lon" msgstr "pieršaja" #: gajim/common/pep.py:209 msgid "postalcode" msgstr "" #: gajim/common/pep.py:210 msgid "region" msgstr "" #: gajim/common/pep.py:211 msgid "room" msgstr "pakoj" #: gajim/common/pep.py:212 msgid "speed" msgstr "" #: gajim/common/pep.py:213 msgid "street" msgstr "" #: gajim/common/pep.py:214 msgid "text" msgstr "" #: gajim/common/pep.py:215 msgid "timestamp" msgstr "" #: gajim/common/pep.py:216 msgid "uri" msgstr "uri" #: gajim/common/pep.py:343 msgid "Unknown Artist" msgstr "" #: gajim/common/pep.py:346 msgid "Unknown Title" msgstr "" #: gajim/common/pep.py:349 msgid "Unknown Source" msgstr "" #: gajim/common/pep.py:352 #, python-format msgid "" "\"%(title)s\" by %(artist)s\n" "from %(source)s" msgstr "" #: gajim/common/stanza_session.py:422 msgid "" "[This is part of an encrypted session. If you see this message, something " "went wrong.]" msgstr "" #: gajim/common/jingle_rtp.py:123 #, fuzzy, python-format msgid "%s configuration error" msgstr "Kanfihuracyja pakoju" #: gajim/common/jingle_rtp.py:124 #, python-format msgid "" "Couldn’t setup %(text)s. Check your configuration.\n" "\n" "Pipeline was:\n" "%(pipeline)s\n" "\n" "Error was:\n" "%(error)s" msgstr "" #: gajim/common/jingle_rtp.py:371 msgid "audio input" msgstr "" #: gajim/common/jingle_rtp.py:375 msgid "audio output" msgstr "" #: gajim/common/jingle_rtp.py:433 msgid "video input" msgstr "" #: gajim/common/jingle_rtp.py:440 msgid "video output" msgstr "" #: gajim/common/helpers.py:296 msgid "Server must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:304 msgid "Invalid character in hostname." msgstr "Niapravilny znak u naźvie hostu." #: gajim/common/helpers.py:306 msgid "Server address required." msgstr "Patrabujecca adras servera." #: gajim/common/helpers.py:310 msgid "Username must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:318 msgid "Invalid character in username." msgstr "Niapravilny znak u imiani karystalnika." #: gajim/common/helpers.py:324 msgid "Resource must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:332 msgid "Invalid character in resource." msgstr "Niapravilny znak u naźvie krynicy." #: gajim/common/helpers.py:372 msgid "_Busy" msgstr "_Zaniaty" #: gajim/common/helpers.py:377 msgid "_Not Available" msgstr "_Niedastupny" #: gajim/common/helpers.py:382 msgid "_Free for Chat" msgstr "_Achvotna parazmaŭlaju" #: gajim/common/helpers.py:387 #, fuzzy msgid "?user status:_Available" msgstr "?status pieradačy:Prypyniena" #: gajim/common/helpers.py:391 msgid "Connecting" msgstr "Dałučajusia" #: gajim/common/helpers.py:394 msgid "A_way" msgstr "_Adyjšoŭ" #: gajim/common/helpers.py:399 msgid "_Offline" msgstr "Adł_učany" #: gajim/common/helpers.py:404 msgid "_Invisible" msgstr "N_iabačny" #: gajim/common/helpers.py:410 msgid "?contact has status:Unknown" msgstr "?kantakt maje status:Nieviadomy" #: gajim/common/helpers.py:412 msgid "?contact has status:Has errors" msgstr "?kantakt maje status:Jość pamyłki" #: gajim/common/helpers.py:427 msgid "?Subscription we already have:None" msgstr "?Najaŭnaja aŭtaryzacyja:Niama" #: gajim/common/helpers.py:429 msgid "To" msgstr "Da" #: gajim/common/helpers.py:431 msgid "From" msgstr "Ad" #: gajim/common/helpers.py:433 msgid "Both" msgstr "Dvuchbakovaja" #: gajim/common/helpers.py:435 #, fuzzy msgid "Unknown" msgstr "?AS:Nieviadomaja" #: gajim/common/helpers.py:441 msgid "?Ask (for Subscription):None" msgstr "?Zapyt (aŭtaryzacyi):Niama" #: gajim/common/helpers.py:443 msgid "Subscribe" msgstr "Aŭtaryzuj" #: gajim/common/helpers.py:452 msgid "?Group Chat Contact Role:None" msgstr "?Funkcyja kantaktu ŭ pakoji:Niama" #: gajim/common/helpers.py:455 msgid "Moderators" msgstr "Maderatary" #: gajim/common/helpers.py:457 msgid "Moderator" msgstr "Maderatar" #: gajim/common/helpers.py:460 msgid "Participants" msgstr "Udzielniki" #: gajim/common/helpers.py:462 msgid "Participant" msgstr "Udzielnik" #: gajim/common/helpers.py:465 msgid "Visitors" msgstr "Naviedniki" #: gajim/common/helpers.py:467 msgid "Visitor" msgstr "Naviednik" #: gajim/common/helpers.py:518 msgid "is paying attention to the conversation" msgstr "sočyć za razmovaj" #: gajim/common/helpers.py:520 msgid "is doing something else" msgstr "robić štości inšaje" #: gajim/common/helpers.py:522 #, fuzzy msgid "is composing a message…" msgstr "piša paviedamleńnie..." #: gajim/common/helpers.py:525 msgid "paused composing a message" msgstr "pierastaŭ pisać" #: gajim/common/helpers.py:527 msgid "has closed the chat window or tab" msgstr "začyniŭ akno/kartku razmovy" #: gajim/common/helpers.py:754 #, python-format msgid "%s GiB" msgstr "%s GiB" #: gajim/common/helpers.py:757 #, python-format msgid "%s GB" msgstr "%s GB" #: gajim/common/helpers.py:761 #, python-format msgid "%s MiB" msgstr "%s MiB" #: gajim/common/helpers.py:764 #, python-format msgid "%s MB" msgstr "%s MB" #: gajim/common/helpers.py:768 #, python-format msgid "%s KiB" msgstr "%s KiB" #: gajim/common/helpers.py:771 #, python-format msgid "%s KB" msgstr "%s KB" #: gajim/common/helpers.py:774 #, python-format msgid "%s B" msgstr "%s B" #: gajim/common/helpers.py:1141 gajim/common/helpers.py:1148 #, fuzzy, python-format msgid "%d message pending" msgid_plural "%d messages pending" msgstr[0] "Dašli paviedamleńnie" msgstr[1] "Dašli paviedamleńnie" msgstr[2] "Dašli paviedamleńnie" #: gajim/common/helpers.py:1155 #, fuzzy, python-format msgid "from room %s" msgstr "Я %s" #: gajim/common/helpers.py:1158 gajim/common/helpers.py:1175 #, python-format msgid "from user %s" msgstr "" #: gajim/common/helpers.py:1160 #, fuzzy, python-format msgid "from %s" msgstr "Ad" #: gajim/common/helpers.py:1167 gajim/common/helpers.py:1173 #, python-format msgid "%d event pending" msgid_plural "%d events pending" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: gajim/common/helpers.py:1191 gajim/common/helpers.py:1203 #: gajim/data/gui/roster_window.ui:85 data/org.gajim.Gajim.desktop.in:4 #: data/org.gajim.Gajim.appdata.xml.in:9 msgid "Gajim" msgstr "Gajim" #: gajim/common/helpers.py:1205 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" #: gajim/common/helpers.py:1392 gajim/data/gui/add_new_contact_window.ui:24 msgid "I would like to add you to my contact list." msgstr "Ja chaču dadać Vas u svoj śpis kantaktaŭ." #: gajim/common/helpers.py:1394 msgid "Hello, I am $name." msgstr "" #: gajim/common/helpers.py:1508 gajim/common/helpers.py:1517 #: gajim/common/helpers.py:1576 #, fuzzy msgid "Timeout loading image" msgstr "Niemahčyma adčytać vyjavu" #: gajim/common/helpers.py:1527 gajim/common/helpers.py:1574 msgid "Image is too big" msgstr "" #: gajim/common/helpers.py:1538 msgid "PyCURL is not installed" msgstr "" #: gajim/common/helpers.py:1578 #, fuzzy msgid "Error loading image" msgstr "Niemahčyma adčytać vyjavu" #: gajim/common/connection_handlers.py:133 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "Źviestki rehistracyi dla transpartu %s nie pryjšli ŭ čas" #: gajim/common/connection_handlers.py:979 msgid "This message was encrypted with OTR and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:982 msgid "" "This message was encrypted with Legacy OpenPGP and could not be decrypted. " "You can install the PGP plugin to handle those messages." msgstr "" #: gajim/common/connection_handlers.py:986 msgid "" "This message was encrypted with OpenPGP for XMPP and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:992 #, python-format msgid "This message was encrypted with %s and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:1060 msgid "message" msgstr "paviedamleńnie" #: gajim/common/connection_handlers.py:1863 msgid "I would like to add you to my roster." msgstr "Ja chaču dadać ciabie ŭ svoj śpis kantaktaŭ." #: gajim/common/exceptions.py:46 #, python-format msgid "" "The database file (%s) cannot be read. Try to repair it (see https://dev." "gajim.org/gajim/gajim/wikis/help/DatabaseBackup) or remove it (all history " "will be lost)." msgstr "" #: gajim/common/exceptions.py:60 msgid "Service not available: Gajim is not running, or remote_control is False" msgstr "" "Servis niedastupny: Gajim nie vykonvajecca, albo opcyja remote_control maje " "vartaść False" #: gajim/common/exceptions.py:82 #, fuzzy, python-format msgid "" "Session bus is not available.\n" "Try reading %(url)s" msgstr "" "Interfejs sesijaŭ niedastupny.\n" "Pasprabuj pračytać: http://trac.gajim.org/wiki/GajimDBus" #: gajim/common/exceptions.py:94 #, fuzzy, python-format msgid "" "System bus is not available.\n" "Try reading %(url)s" msgstr "" "Interfejs sesijaŭ niedastupny.\n" "Pasprabuj pračytać: http://trac.gajim.org/wiki/GajimDBus" #: gajim/common/zeroconf/connection_zeroconf.py:193 #, fuzzy msgid "Please check if Avahi or Bonjour is installed." msgstr "Kali łaska, pravier instalacyju Avahi." #: gajim/common/zeroconf/connection_zeroconf.py:203 #: gajim/common/zeroconf/connection_zeroconf.py:207 msgid "Could not start local service" msgstr "Niemahčyma ŭruchomić lakalny servis" #: gajim/common/zeroconf/connection_zeroconf.py:204 #, python-format msgid "Unable to bind to port %d." msgstr "Niemahčyma dałučycca da portu %d." #: gajim/common/zeroconf/connection_zeroconf.py:208 #: gajim/common/zeroconf/connection_zeroconf.py:293 #: gajim/common/zeroconf/connection_zeroconf.py:306 #: gajim/common/zeroconf/connection_zeroconf.py:322 msgid "Please check if avahi-daemon is running." msgstr "Kali łaska, pravier, ci pracuje avahi-daemon." #: gajim/common/zeroconf/connection_zeroconf.py:292 #: gajim/common/zeroconf/connection_zeroconf.py:305 #: gajim/common/zeroconf/connection_zeroconf.py:321 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Niemahčyma źmianić status kontu \"%s\"" #: gajim/common/zeroconf/connection_zeroconf.py:337 #, fuzzy msgid "Your message could not be sent." msgstr "Kantakt adłučany. Niemahčyma dasłać paviedamleńnie." #: gajim/common/zeroconf/connection_zeroconf.py:352 msgid "Contact is offline. Your message could not be sent." msgstr "Kantakt adłučany. Niemahčyma dasłać paviedamleńnie." #: gajim/common/zeroconf/connection_zeroconf.py:374 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "" "Niemahčyma złučycca z hostam: pieravyšany termin čakańnia padčas adsyłańnia " "źviestak." #: gajim/common/zeroconf/zeroconf_bonjour.py:197 #: gajim/common/zeroconf/zeroconf_avahi.py:220 #, python-format msgid "Error while adding service. %s" msgstr "Pamyłka dadańnia servisu. %s" #: gajim/data/gui/blocked_contacts_window.ui:13 #, fuzzy msgid "Blocked Contacts" msgstr "Kantakty" #: gajim/data/gui/advanced_configuration_window.ui:13 msgid "Advanced Configuration Editor" msgstr "Redaktar dadatkovych naładaŭ" #: gajim/data/gui/advanced_configuration_window.ui:35 msgid "Filter:" msgstr "Filter:" #: gajim/data/gui/advanced_configuration_window.ui:107 #: gajim/data/gui/features_window.ui:111 msgid "Description" msgstr "Apisańnie" #: gajim/data/gui/advanced_configuration_window.ui:136 msgid "NOTE: You should restart Gajim for some settings to take effect" msgstr "UVAHA: Kab ubačyć niekatoryja źmieny, uruchom Gajim" #: gajim/data/gui/advanced_configuration_window.ui:161 #, fuzzy msgid "_Reset to default" msgstr "_Viarni zvyčajnyja kolery" #: gajim/data/gui/join_groupchat_window.ui:34 #, fuzzy msgid "Bookmark this Groupchat" msgstr "_Stvary zakładku dla hetaja pakoju" #: gajim/data/gui/join_groupchat_window.ui:51 msgid "Join this Groupchat everytime Gajim is started" msgstr "" #: gajim/data/gui/join_groupchat_window.ui:69 #, fuzzy msgid "Bookmark" msgstr "_Stvary zakładku dla hetaja pakoju" #: gajim/data/gui/join_groupchat_window.ui:82 #, fuzzy msgid "Autojoin" msgstr "Aŭtamatyčna dałučajsia" #: gajim/data/gui/join_groupchat_window.ui:119 msgid "Account" msgstr "Kont" #: gajim/data/gui/join_groupchat_window.ui:226 #, fuzzy msgid "Room" msgstr "Pakoj:" #: gajim/data/gui/join_groupchat_window.ui:238 #, fuzzy msgid "Recently" msgstr "Niadaŭna:" #: gajim/data/gui/join_groupchat_window.ui:290 msgid "Search the rooms on this server" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:12 #, fuzzy msgid "HTTP Connect" msgstr "Złučeńnie HTTP" #: gajim/data/gui/manage_proxies_window.ui:15 msgid "SOCKS5" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:18 msgid "BOSH" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:25 msgid "Manage Proxy Profiles" msgstr "Kiruj profilami proxy" #: gajim/data/gui/manage_proxies_window.ui:148 msgid "_Name:" msgstr "_Imia:" #: gajim/data/gui/manage_proxies_window.ui:161 #, fuzzy msgid "_Type:" msgstr "Typ:" #: gajim/data/gui/manage_proxies_window.ui:205 msgid "Properties" msgstr "Ułaścivaści" #: gajim/data/gui/manage_proxies_window.ui:234 #, fuzzy msgid "_BOSH URL:" msgstr "_URL:" #: gajim/data/gui/manage_proxies_window.ui:258 #, fuzzy msgid "Proxy _Host:" msgstr "Proxy:" #: gajim/data/gui/manage_proxies_window.ui:269 #, fuzzy msgid "Use HTTP prox_y" msgstr "S_karystaj proxy" #: gajim/data/gui/manage_proxies_window.ui:288 #, fuzzy msgid "Proxy _Port:" msgstr "_Port:" #: gajim/data/gui/manage_proxies_window.ui:299 #, fuzzy msgid "Use proxy auth_entication" msgstr "Užyvaj aŭtaryzacyju" #: gajim/data/gui/manage_proxies_window.ui:318 msgid "_Username:" msgstr "_Imia karystalnika:" #: gajim/data/gui/manage_proxies_window.ui:331 msgid "Pass_word:" msgstr "_Parol:" #: gajim/data/gui/manage_proxies_window.ui:391 msgid "Settings" msgstr "Nałady" #: gajim/data/gui/change_password_dialog.ui:89 msgid "Enter new password:" msgstr "Uviadzi novy parol:" #: gajim/data/gui/change_password_dialog.ui:115 msgid "Enter it again for confirmation:" msgstr "Paŭtary parol dla paćvierdžańnia:" #: gajim/data/gui/zeroconf_information_window.ui:8 #: gajim/data/gui/vcard_information_window.ui:8 msgid "Contact Information" msgstr "Źviestki ab kantakcie" #: gajim/data/gui/zeroconf_information_window.ui:54 msgid "Local jid:" msgstr "Lakalny JID:" #: gajim/data/gui/zeroconf_information_window.ui:67 #: gajim/data/gui/tooltip_roster_contact.ui:55 #: gajim/data/gui/tooltip_gc_contact.ui:75 msgid "Resource:" msgstr "Krynica:" #: gajim/data/gui/zeroconf_information_window.ui:80 #: gajim/data/gui/tooltip_roster_contact.ui:110 msgid "Status:" msgstr "Status:" #: gajim/data/gui/zeroconf_information_window.ui:89 #: gajim/data/gui/history_window.ui:290 msgid "_Log conversation history" msgstr "_Zachoŭvaj žurnał razmoŭ" #: gajim/data/gui/zeroconf_information_window.ui:215 #: gajim/data/gui/vcard_information_window.ui:360 msgid "Contact" msgstr "Kantakt" #: gajim/data/gui/zeroconf_information_window.ui:234 msgid "First Name:" msgstr "Imia:" #: gajim/data/gui/zeroconf_information_window.ui:247 msgid "Last Name:" msgstr "Proźvišča:" #: gajim/data/gui/zeroconf_information_window.ui:260 #: gajim/data/gui/archiving_313_preferences_item.ui:84 #: gajim/data/gui/tooltip_roster_contact.ui:30 #: gajim/data/gui/tooltip_gc_contact.ui:50 msgid "Jabber ID:" msgstr "JID:" #: gajim/data/gui/zeroconf_information_window.ui:273 msgid "E-Mail:" msgstr "E-mail:" #: gajim/data/gui/zeroconf_information_window.ui:354 msgid "Personal" msgstr "Asabistyja źviestki" #: gajim/data/gui/gc_occupants_menu.ui:12 msgid "_Send Private Message" msgstr "_Dasłać pryvatnaje paviedamleńnie" #: gajim/data/gui/gc_occupants_menu.ui:21 msgid "Send _File" msgstr "Vyšli _fajł" #: gajim/data/gui/gc_occupants_menu.ui:29 #, fuzzy msgid "Occupant Actions" msgstr "_Dziejańni haspadara" #: gajim/data/gui/gc_occupants_menu.ui:38 msgid "_Voice" msgstr "_Daj hołas" #: gajim/data/gui/gc_occupants_menu.ui:46 msgid "Mo_derator" msgstr "Ma_deratar" #: gajim/data/gui/gc_occupants_menu.ui:60 msgid "_Member" msgstr "_Udzielnik" #: gajim/data/gui/gc_occupants_menu.ui:68 msgid "_Admin" msgstr "_Administratar" #: gajim/data/gui/gc_occupants_menu.ui:76 msgid "_Owner" msgstr "_Uładalnik" #: gajim/data/gui/gc_occupants_menu.ui:90 msgid "_Kick" msgstr "_Vypchni" #: gajim/data/gui/gc_occupants_menu.ui:98 msgid "_Ban" msgstr "Za_blakuj" #: gajim/data/gui/gc_occupants_menu.ui:124 msgid "_Add to Roster" msgstr "_Dadaj u śpis kantaktaŭ" #: gajim/data/gui/gc_occupants_menu.ui:132 #, fuzzy msgid "_Execute command" msgstr "_Vykanaj zahad..." #: gajim/data/gui/archiving_313_preferences_item.ui:12 #: gajim/data/gui/preferences_window.ui:102 #: gajim/data/gui/preferences_window.ui:153 #: gajim/data/gui/archiving_313_preferences_window.ui:25 #, fuzzy msgid "Always" msgstr "Adyjšoŭ" #: gajim/data/gui/archiving_313_preferences_item.ui:15 #: gajim/data/gui/preferences_window.ui:96 #: gajim/data/gui/preferences_window.ui:156 #: gajim/data/gui/archiving_313_preferences_window.ui:31 #, fuzzy msgid "Never" msgstr "_Nikoli" #: gajim/data/gui/archiving_313_preferences_item.ui:96 #, fuzzy msgid "Preference:" msgstr "Nałady" #: gajim/data/gui/tooltip_roster_contact.ui:125 #, fuzzy msgid "Idle since:" msgstr " ad %s" #: gajim/data/gui/tooltip_roster_contact.ui:151 #: gajim/data/gui/change_status_message_dialog.ui:191 #, fuzzy msgid "Mood:" msgstr "Pakoj:" #: gajim/data/gui/tooltip_roster_contact.ui:164 #: gajim/data/gui/change_status_message_dialog.ui:179 #, fuzzy msgid "Activity:" msgstr "Dziejny" #: gajim/data/gui/tooltip_roster_contact.ui:178 #, fuzzy msgid "Tune:" msgstr "Typ:" #: gajim/data/gui/tooltip_roster_contact.ui:191 #, fuzzy msgid "Location:" msgstr "Madyfikacyja kontu" #: gajim/data/gui/tooltip_roster_contact.ui:255 #, fuzzy msgid "OpenPGP:" msgstr "OpenPGP: " #: gajim/data/gui/tooltip_roster_contact.ui:281 msgid "Subscription:" msgstr "Aŭtaryzacyja:" #: gajim/data/gui/zeroconf_context_menu.ui:11 #: gajim/data/gui/account_context_menu.ui:11 msgid "_Status" msgstr "_Status" #: gajim/data/gui/zeroconf_context_menu.ui:26 #: gajim/data/gui/account_context_menu.ui:79 msgid "_Modify Account..." msgstr "_Madyfikuj kont..." #: gajim/data/gui/atom_entry_window.ui:8 msgid "New entry received" msgstr "Atrymaŭ novy zapis" #: gajim/data/gui/atom_entry_window.ui:92 msgid "Feed name:" msgstr "Nazva kanału:" #: gajim/data/gui/atom_entry_window.ui:119 msgid "Entry:" msgstr "Zapis:" #: gajim/data/gui/atom_entry_window.ui:131 msgid "Last modified:" msgstr "Apošniaja źmiena:" #: gajim/data/gui/atom_entry_window.ui:196 msgid "Next entry" msgstr "" #: gajim/data/gui/gc_control_popup_menu.ui:11 #, fuzzy msgid "Change _Nickname..." msgstr "Źmiani _mianušku" #: gajim/data/gui/gc_control_popup_menu.ui:20 #, fuzzy msgid "_Manage Room" msgstr "Kiruj zakładkami" #: gajim/data/gui/gc_control_popup_menu.ui:31 #, fuzzy msgid "Change _Subject..." msgstr "Źmiani _temu" #: gajim/data/gui/gc_control_popup_menu.ui:38 #, fuzzy msgid "Configure _Room..." msgstr "Kanfihuruj _pakoj" #: gajim/data/gui/gc_control_popup_menu.ui:52 #, fuzzy msgid "_Destroy Room" msgstr "Apisańnie: %s" #: gajim/data/gui/gc_control_popup_menu.ui:64 msgid "_Minimize on close" msgstr "" #: gajim/data/gui/gc_control_popup_menu.ui:85 #, fuzzy msgid "_Request Voice" msgstr "_Daj hołas" #: gajim/data/gui/profile_window.ui:7 msgid "Personal Information" msgstr "Asabistyja źviestki" #: gajim/data/gui/profile_window.ui:35 #: gajim/data/gui/vcard_information_window.ui:382 #, fuzzy msgid "Name:" msgstr "Asablivy" #: gajim/data/gui/profile_window.ui:59 #: gajim/data/gui/vcard_information_window.ui:410 #, fuzzy msgid "Nickname:" msgstr "Mianuška:" #. Family Name #: gajim/data/gui/profile_window.ui:94 #: gajim/data/gui/vcard_information_window.ui:740 #, fuzzy msgid "Family:" msgstr "Proźvišča:" #. Given Name #: gajim/data/gui/profile_window.ui:118 #: gajim/data/gui/vcard_information_window.ui:822 #, fuzzy msgid "Given:" msgstr "OpenPGP" #. Middle Name #: gajim/data/gui/profile_window.ui:142 #: gajim/data/gui/vcard_information_window.ui:753 #, fuzzy msgid "Middle:" msgstr "Dadaj praviła" #. Prefix in Name #: gajim/data/gui/profile_window.ui:156 #: gajim/data/gui/vcard_information_window.ui:766 #, fuzzy msgid "Prefix:" msgstr "Ułaścivaści" #. Suffix in Name #: gajim/data/gui/profile_window.ui:190 #: gajim/data/gui/vcard_information_window.ui:835 #, fuzzy msgid "Suffix:" msgstr "Huki" #: gajim/data/gui/profile_window.ui:222 #: gajim/data/gui/vcard_information_window.ui:878 #, fuzzy msgid "Full Name" msgstr "Asablivy" #: gajim/data/gui/profile_window.ui:250 gajim/data/gui/profile_window.ui:724 #: gajim/data/gui/vcard_information_window.ui:454 #: gajim/data/gui/vcard_information_window.ui:1087 #, fuzzy msgid "Street:" msgstr "Nałady" #: gajim/data/gui/profile_window.ui:274 gajim/data/gui/profile_window.ui:748 #: gajim/data/gui/vcard_information_window.ui:535 #: gajim/data/gui/vcard_information_window.ui:1126 #, fuzzy msgid "Extra Address:" msgstr "Dadatkovy adras:" #: gajim/data/gui/profile_window.ui:298 gajim/data/gui/profile_window.ui:772 #: gajim/data/gui/vcard_information_window.ui:467 #: gajim/data/gui/vcard_information_window.ui:1100 #, fuzzy msgid "City:" msgstr "Asablivy" #: gajim/data/gui/profile_window.ui:322 gajim/data/gui/profile_window.ui:796 #: gajim/data/gui/vcard_information_window.ui:548 #: gajim/data/gui/vcard_information_window.ui:1140 #, fuzzy msgid "Postal Code:" msgstr "Paštovy indeks:" #: gajim/data/gui/profile_window.ui:346 gajim/data/gui/profile_window.ui:820 #: gajim/data/gui/vcard_information_window.ui:480 #: gajim/data/gui/vcard_information_window.ui:1113 #, fuzzy msgid "State:" msgstr "Nałady" #: gajim/data/gui/profile_window.ui:370 gajim/data/gui/profile_window.ui:844 #: gajim/data/gui/vcard_information_window.ui:561 #: gajim/data/gui/vcard_information_window.ui:1153 #, fuzzy msgid "Country:" msgstr "Huki" #: gajim/data/gui/profile_window.ui:396 gajim/data/gui/profile_window.ui:870 #: gajim/data/gui/vcard_information_window.ui:618 #: gajim/data/gui/vcard_information_window.ui:1253 #, fuzzy msgid "Address" msgstr "Dadaj praviła" #: gajim/data/gui/profile_window.ui:413 #: gajim/data/gui/vcard_information_window.ui:635 #, fuzzy msgid "Homepage:" msgstr "Chatniaja staronka:" #: gajim/data/gui/profile_window.ui:437 gajim/data/gui/profile_window.ui:887 #: gajim/data/gui/vcard_information_window.ui:648 #: gajim/data/gui/vcard_information_window.ui:1270 #, fuzzy msgid "E-Mail:" msgstr "E-mail:" #: gajim/data/gui/profile_window.ui:462 gajim/data/gui/profile_window.ui:912 #: gajim/data/gui/vcard_information_window.ui:661 #: gajim/data/gui/vcard_information_window.ui:1283 #, fuzzy msgid "Phone No.:" msgstr "Telefon:" #: gajim/data/gui/profile_window.ui:497 #, fuzzy msgid "Avatar:" msgstr "Avatar:" #: gajim/data/gui/profile_window.ui:540 msgid "Click to set your avatar" msgstr "Klikni, kab vystavić svoj avatar" #: gajim/data/gui/profile_window.ui:566 #: gajim/data/gui/vcard_information_window.ui:702 msgid "Format: YYYY-MM-DD" msgstr "Farmat: HHHH-MM-DD" #: gajim/data/gui/profile_window.ui:574 #: gajim/data/gui/vcard_information_window.ui:708 #, fuzzy msgid "Birthday:" msgstr "Narodziny:" #: gajim/data/gui/profile_window.ui:598 #: gajim/data/gui/vcard_information_window.ui:937 msgid "Personal Info" msgstr "Asabistyja źviestki" #: gajim/data/gui/profile_window.ui:617 #: gajim/data/gui/vcard_information_window.ui:960 #, fuzzy msgid "Company:" msgstr "Asablivy" #: gajim/data/gui/profile_window.ui:641 #: gajim/data/gui/vcard_information_window.ui:990 #, fuzzy msgid "Department:" msgstr "Addzieł:" #: gajim/data/gui/profile_window.ui:665 #: gajim/data/gui/vcard_information_window.ui:1018 #, fuzzy msgid "Position:" msgstr "Umovy" #: gajim/data/gui/profile_window.ui:689 #: gajim/data/gui/vcard_information_window.ui:1045 #, fuzzy msgid "Role:" msgstr "Huki" #: gajim/data/gui/profile_window.ui:947 #: gajim/data/gui/vcard_information_window.ui:1336 msgid "Work" msgstr "Praca" #. "About" is the text of a tab of vcard window #: gajim/data/gui/profile_window.ui:979 #: gajim/data/gui/vcard_information_window.ui:1368 #: gajim/data/gui/application_menu.ui:62 msgid "About" msgstr "Pra siabie" #: gajim/data/gui/filetransfers.ui:20 #, fuzzy msgid "Con_tinue" msgstr "_Praciahni" #: gajim/data/gui/filetransfers.ui:28 gajim/data/gui/filetransfers.ui:156 msgid "_Pause" msgstr "_Prypyni" #: gajim/data/gui/filetransfers.ui:36 gajim/data/gui/filetransfers.ui:174 #: gajim/data/gui/service_registration_window.ui:53 msgid "_Cancel" msgstr "_Anuluj" #: gajim/data/gui/filetransfers.ui:50 msgid "_Open Containing Folder" msgstr "_Adčyni kataloh z fajłam" #: gajim/data/gui/filetransfers.ui:79 gajim/data/gui/filetransfers.ui:253 msgid "File Transfers" msgstr "Pieradačy fajłaŭ" #: gajim/data/gui/filetransfers.ui:110 msgid "file transfers list" msgstr "śpis pieradačaŭ fajłaŭ" #: gajim/data/gui/filetransfers.ui:111 msgid "A list of active, completed and stopped file transfers" msgstr "Śpis dziejnych, skončanych i spynienych pieradačaŭ fajłaŭ" #: gajim/data/gui/filetransfers.ui:131 msgid "Clean _up" msgstr "Pry_biarysia" #: gajim/data/gui/filetransfers.ui:137 msgid "Removes completed, cancelled and failed file transfers from the list" msgstr "Vydal skončanyja, anulavanyja i chibnyja pieradačy fajłaŭ ź śpisa" #: gajim/data/gui/filetransfers.ui:143 msgid "Remove file transfer from the list." msgstr "Vydal pieradaču fajła ź śpisu." #: gajim/data/gui/filetransfers.ui:144 msgid "" "This action removes single file transfer from the list. If the transfer is " "active, it is first stopped and then removed" msgstr "Hetaje dziejańnie anuluje pieradaču fajła i vydalić jaje ź śpisu." #: gajim/data/gui/filetransfers.ui:180 #, fuzzy msgid "Cancels the selected file transfer and removes incomplete files" msgstr "Anuluj abranuju pieradaču fajła i vydal niedaciahnuty fajł" #: gajim/data/gui/filetransfers.ui:186 msgid "Cancel file transfer" msgstr "Anuluj pieradaču fajła" #: gajim/data/gui/filetransfers.ui:187 msgid "Cancels the selected file transfer" msgstr "Anuluj abranuju pieradaču fajła" #: gajim/data/gui/filetransfers.ui:199 #, fuzzy msgid "_Close" msgstr "_Dašli i začyni" #: gajim/data/gui/filetransfers.ui:205 msgid "Hides the window" msgstr "Schavaj akno" #: gajim/data/gui/filetransfers.ui:226 msgid "_Notify me when a file transfer is complete" msgstr "_Nahadaj mnie ab zakančeńni pieradačy fajła" #: gajim/data/gui/filetransfers.ui:236 msgid "When a file transfer is complete show a popup notification" msgstr "Pakažy nahadvańnie ŭ vypłyŭnym aknie pa zakančeńni pieradačy fajła" #: gajim/data/gui/filetransfers.ui:254 msgid "Shows a list of file transfers between you and others" msgstr "Pakažy śpis pieradačaŭ fajłaŭ" #: gajim/data/gui/service_registration_window.ui:18 msgid "Register to" msgstr "Zarehistrujsia na" #: gajim/data/gui/service_registration_window.ui:70 #: gajim/data/gui/roster_item_exchange_window.ui:126 msgid "_OK" msgstr "_Tak" #: gajim/data/gui/groupchat_control.ui:13 gajim/data/gui/chat_control.ui:293 #: gajim/data/gui/gajim_themes_window.ui:264 msgid "Bold" msgstr "Tłusty" #: gajim/data/gui/groupchat_control.ui:22 gajim/data/gui/chat_control.ui:302 #: gajim/data/gui/gajim_themes_window.ui:284 msgid "Italic" msgstr "Nachileny" #: gajim/data/gui/groupchat_control.ui:31 gajim/data/gui/chat_control.ui:311 #, fuzzy msgid "Underline" msgstr "dziaviataja" #: gajim/data/gui/groupchat_control.ui:40 gajim/data/gui/chat_control.ui:320 #, fuzzy msgid "Strike" msgstr "Mianuška" #: gajim/data/gui/groupchat_control.ui:62 gajim/data/gui/chat_control.ui:342 #, fuzzy msgid "Font" msgstr "_Šryft:" #: gajim/data/gui/groupchat_control.ui:76 gajim/data/gui/chat_control.ui:356 #, fuzzy msgid "Clear formatting" msgstr "Źviestki ab kantakcie" #: gajim/data/gui/groupchat_control.ui:283 gajim/data/gui/chat_control.ui:805 #, fuzzy msgid "Choose an encryption" msgstr "Abiary fajł dla adsyłańnia..." #: gajim/data/gui/groupchat_control.ui:329 gajim/data/gui/chat_control.ui:853 #, fuzzy msgid "Show a list of emoticons (Alt+M)" msgstr "Klikni, kab ustavić smajlik (Alt+M)" #: gajim/data/gui/popup_notification_window.ui:55 #, fuzzy msgid "Event Type" msgstr "Padzieja" #: gajim/data/gui/popup_notification_window.ui:100 #, fuzzy msgid "Event desc" msgstr "Padzieji" #: gajim/data/gui/chat_control.ui:41 #, fuzzy msgid "1" msgstr "Huki" #: gajim/data/gui/chat_control.ui:63 #, fuzzy msgid "2 abc" msgstr "Huki" #: gajim/data/gui/chat_control.ui:84 #, fuzzy msgid "3 def" msgstr "Huki" #: gajim/data/gui/chat_control.ui:105 #, fuzzy msgid "4 ghi" msgstr "Huki" #: gajim/data/gui/chat_control.ui:126 #, fuzzy msgid "5 jkl" msgstr "Huki" #: gajim/data/gui/chat_control.ui:147 #, fuzzy msgid "6 mno" msgstr "Huki" #: gajim/data/gui/chat_control.ui:167 msgid "7 pqrs" msgstr "" #: gajim/data/gui/chat_control.ui:188 #, fuzzy msgid "8 tuv" msgstr "Huki" #: gajim/data/gui/chat_control.ui:209 msgid "9 wxyz" msgstr "" #: gajim/data/gui/chat_control.ui:229 #, fuzzy msgid "*" msgstr "Huki" #: gajim/data/gui/chat_control.ui:249 #, fuzzy msgid "0" msgstr "Huki" #: gajim/data/gui/chat_control.ui:269 #, fuzzy msgid "#" msgstr "Huki" #: gajim/data/gui/chat_control.ui:729 msgid "#" msgstr "№" #: gajim/data/gui/vcard_information_window.ui:55 #, fuzzy msgid "Jabber ID:" msgstr "JID:" #: gajim/data/gui/vcard_information_window.ui:69 #, fuzzy msgid "Resource:" msgstr "Krynica:" #: gajim/data/gui/vcard_information_window.ui:83 #, fuzzy msgid "Status:" msgstr "Nałady" #: gajim/data/gui/vcard_information_window.ui:97 #, fuzzy msgid "Client:" msgstr "Asablivy" #: gajim/data/gui/vcard_information_window.ui:111 #, fuzzy msgid "System:" msgstr "Asablivy" #: gajim/data/gui/vcard_information_window.ui:125 #, fuzzy msgid "Contact time:" msgstr "Nałady" #: gajim/data/gui/vcard_information_window.ui:222 #, fuzzy msgid "User avatar:" msgstr "Avatar:" #: gajim/data/gui/vcard_information_window.ui:234 #, fuzzy msgid "Configured avatar:" msgstr "Kanfihuruj _pakoj" #. Given Name #: gajim/data/gui/vcard_information_window.ui:263 #, fuzzy msgid "Ask:" msgstr "Dziejańni" #. Family Name #: gajim/data/gui/vcard_information_window.ui:277 #, fuzzy msgid "Subscription:" msgstr "Apisańnie" #: gajim/data/gui/vcard_information_window.ui:893 #: gajim/data/gui/vcard_information_window.ui:912 #: gajim/data/gui/vcard_information_window.ui:1310 msgid "button" msgstr "" #: gajim/data/gui/vcard_information_window.ui:1398 msgid "Comments" msgstr "Kamentary" #: gajim/data/gui/gajim_themes_window.ui:12 #, fuzzy msgid "Account row" msgstr "Kont" #: gajim/data/gui/gajim_themes_window.ui:15 #, fuzzy msgid "Group row" msgstr "Hrupa" #: gajim/data/gui/gajim_themes_window.ui:18 #, fuzzy msgid "Contact row" msgstr "Kantakt" #: gajim/data/gui/gajim_themes_window.ui:21 msgid "Chat Banner" msgstr "" #: gajim/data/gui/gajim_themes_window.ui:28 msgid "Gajim Themes Customization" msgstr "Kanfihuracyja temy Gajim" #: gajim/data/gui/gajim_themes_window.ui:157 msgid "Text _color:" msgstr "Koler _tekstu:" #: gajim/data/gui/gajim_themes_window.ui:173 msgid "_Background:" msgstr "_Fon:" #: gajim/data/gui/gajim_themes_window.ui:189 msgid "Text _font:" msgstr "_Šryft:" #: gajim/data/gui/gajim_themes_window.ui:207 msgid "Font style:" msgstr "Styl šryftu:" #: gajim/data/gui/gajim_themes_window.ui:375 msgid "Composing" msgstr "Uvod paviedamleńnia" #: gajim/data/gui/gajim_themes_window.ui:387 msgid "Paused" msgstr "Prypynienaja" #: gajim/data/gui/gajim_themes_window.ui:399 msgid "Gone" msgstr "Vyjšaŭ" #: gajim/data/gui/gajim_themes_window.ui:411 msgid "" "MUC\n" "Messages" msgstr "" "MUC\n" "Paviedamleńni" #: gajim/data/gui/gajim_themes_window.ui:424 msgid "" "MUC Directed\n" "Messages" msgstr "" "Razmova\n" "Paviedamleńni" #: gajim/data/gui/gajim_themes_window.ui:510 msgid "Chatstate Tab Colors" msgstr "Kolery kartak u aknie razmoŭ" #: gajim/data/gui/preferences_window.ui:48 msgid "Use default applications" msgstr "" #: gajim/data/gui/preferences_window.ui:51 #, fuzzy msgid "Custom" msgstr "Asablivy" #: gajim/data/gui/preferences_window.ui:62 #: gajim/data/gui/preferences_window.ui:79 #, fuzzy msgid "All chat states" msgstr "Usie statusy" #: gajim/data/gui/preferences_window.ui:65 #: gajim/data/gui/preferences_window.ui:82 #, fuzzy msgid "Composing only" msgstr "Uvod paviedamleńnia" #: gajim/data/gui/preferences_window.ui:99 msgid "Only when pending events" msgstr "" #: gajim/data/gui/preferences_window.ui:113 #, fuzzy msgid "Pop it up" msgstr "_Vynyrni" #: gajim/data/gui/preferences_window.ui:116 #, fuzzy msgid "Notify me about it" msgstr "_Paviedam mnie pra heta" #: gajim/data/gui/preferences_window.ui:119 #, fuzzy msgid "Show only in roster" msgstr "Pakazvaj tolki ŭ śpisie _kantaktaŭ" #: gajim/data/gui/preferences_window.ui:130 msgid "Detached roster with detached chats" msgstr "" #: gajim/data/gui/preferences_window.ui:133 msgid "Detached roster with single chat" msgstr "" #: gajim/data/gui/preferences_window.ui:136 msgid "Single window for everything" msgstr "" #: gajim/data/gui/preferences_window.ui:139 msgid "Detached roster with chat grouped by account" msgstr "" #: gajim/data/gui/preferences_window.ui:142 msgid "Detached roster with chat grouped by type" msgstr "" #: gajim/data/gui/preferences_window.ui:159 #, fuzzy msgid "Last state" msgstr "Apošni status: %s" #: gajim/data/gui/preferences_window.ui:195 #: gajim/data/gui/application_menu.ui:94 gajim/data/gui/shortcuts_window.ui:188 msgid "Preferences" msgstr "Nałady" #: gajim/data/gui/preferences_window.ui:237 msgid "Display a_vatars of contacts in roster" msgstr "Pakazvaj a_vatary kantaktaŭ u śpisie kantaktaŭ" #: gajim/data/gui/preferences_window.ui:241 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" msgstr "" "Kali ŭklučanaja hetaja opcyja, Gajim budzie pakazvać avatary kantaktaŭ u " "śpisie kantaktaŭ i ŭ pakojach" #: gajim/data/gui/preferences_window.ui:255 msgid "Display status _messages of contacts in roster" msgstr "Pakazvaj paviedamleńni _statusu kantaktaŭ u śpisie kantaktaŭ" #: gajim/data/gui/preferences_window.ui:259 #, fuzzy msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name, in roster window and in group chats" msgstr "" "Kali ŭklučanaja hetaja opcyja, Gajim budzie pakazvać paviedamleńni statusu " "kantaktaŭ u śpisie kantaktaŭ i ŭ pakojach" #: gajim/data/gui/preferences_window.ui:273 #, fuzzy msgid "Display e_xtra information of contacts in roster (mood, activity, ...)" msgstr "Pakazvaj a_vatary kantaktaŭ u śpisie kantaktaŭ" #: gajim/data/gui/preferences_window.ui:277 #, fuzzy msgid "" "If checked, Gajim will display the mood of contacts in the roster window" msgstr "" "Kali ŭklučanaja hetaja opcyja, Gajim budzie pakazvać avatary kantaktaŭ u " "śpisie kantaktaŭ i ŭ pakojach" #: gajim/data/gui/preferences_window.ui:298 #, fuzzy msgid "Sort contacts by status" msgstr "_Paradkuj kantakty pa statusie" #: gajim/data/gui/preferences_window.ui:308 #, fuzzy msgid "in _roster" msgstr "Niama ŭ śpisie kantaktaŭ" #: gajim/data/gui/preferences_window.ui:325 #, fuzzy msgid "in _group chats" msgstr "Dałučysia da _pakoju" #: gajim/data/gui/preferences_window.ui:354 msgid "Roster Appearance" msgstr "" #: gajim/data/gui/preferences_window.ui:384 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" msgstr "" "Kali ŭklučanaja hetaja opcyja, Gajim budzie zamianiać ascii-smajliki " "(naprykład, ':)' ) na adpaviednyja hrafičnyja smajliki" #: gajim/data/gui/preferences_window.ui:390 #, fuzzy msgid "_Emoticons:" msgstr "Smajliki:" #: gajim/data/gui/preferences_window.ui:406 msgid "_Window behavior:" msgstr "" #: gajim/data/gui/preferences_window.ui:420 #, fuzzy msgid "_Show roster on startup:" msgstr "Pakažy _śpis kantaktaŭ" #: gajim/data/gui/preferences_window.ui:431 #, fuzzy msgid "_Ignore rich content in incoming messages" msgstr "Ihnaruj afarmleńnie ŭvachodnych paviedamleńniaŭ" #: gajim/data/gui/preferences_window.ui:435 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." msgstr "" "Niekatoryja paviedamleńni źmiaščajuć afarmleńnie tekstu (farmatavańnie, " "kolery i h.d.). Kali ŭklučanaja hetaja opcyja, Gajim budzie pakazvać tekst " "biez afarmleńnia." #: gajim/data/gui/preferences_window.ui:449 msgid "_Highlight misspelled words" msgstr "_Padśviatlaj słovy z pamyłkami" #: gajim/data/gui/preferences_window.ui:452 msgid "" "If checked, Gajim will highlight spelling errors in input fields of chat " "windows. If no language is explicitly set via right click on the input " "field, the default language will be used for this contact or group chat." msgstr "" #: gajim/data/gui/preferences_window.ui:466 #, fuzzy msgid "Notify by icon when your messages are received" msgstr "Huk, jaki treba hrać pry atrymańni novaha hrupavoha paviedamleńnia." #: gajim/data/gui/preferences_window.ui:520 msgid "Show avatar in chat tabs" msgstr "" #: gajim/data/gui/preferences_window.ui:552 #, fuzzy msgid "Chat Appearance" msgstr "Redahuj praviła" #: gajim/data/gui/preferences_window.ui:607 #, fuzzy msgid "When new event is received:" msgstr "Kali ŭčyniajecca novaja padzieja" #: gajim/data/gui/preferences_window.ui:645 #, fuzzy msgid "Notify me about contacts that sign _in" msgstr "Paviedamlaj mnie ab kantaktach, jakija źmianiajuć status na: " #: gajim/data/gui/preferences_window.ui:663 #, fuzzy msgid "Notify me about contacts that sign _out" msgstr "Paviedamlaj mnie ab kantaktach, jakija źmianiajuć status na: " #: gajim/data/gui/preferences_window.ui:667 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" msgstr "" "Gajim budzie paviedamlać ab adłučeńni kantaktaŭ ad servera ŭ pravym nižnim " "kucie ekranu" #: gajim/data/gui/preferences_window.ui:681 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" msgstr "" "Pakazvaj vypłyŭnyja vokny i nahadvańni, kali ja ŭ stanie _Adyjšoŭ/" "Niedastupny/Zaniaty/Niabačny" #: gajim/data/gui/preferences_window.ui:698 #, fuzzy msgid "Allow popup/notifications when a chat window is opened" msgstr "" "Pakazvaj vypłyŭnyja vokny i nahadvańni, kali ja ŭ stanie _Adyjšoŭ/" "Niedastupny/Zaniaty/Niabačny" #: gajim/data/gui/preferences_window.ui:722 #, fuzzy msgid "Show notification area icon:" msgstr "Pakazvaj _ikonu ŭ poli nahadvańnia" #: gajim/data/gui/preferences_window.ui:762 msgid "Visual Notifications" msgstr "Vizualnyja nahadvańni" #: gajim/data/gui/preferences_window.ui:795 msgid "Play _sounds" msgstr "_Ahučvaj" #: gajim/data/gui/preferences_window.ui:812 #: gajim/data/gui/preferences_window.ui:1656 msgid "Ma_nage..." msgstr "_Kiruj..." #: gajim/data/gui/preferences_window.ui:834 msgid "Allow sound when I'm _busy" msgstr "" #: gajim/data/gui/preferences_window.ui:856 msgid "Sounds" msgstr "Huki" #: gajim/data/gui/preferences_window.ui:877 #, fuzzy msgid "Notifications" msgstr "Madyfikacyja kontu" #: gajim/data/gui/preferences_window.ui:911 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " "display in chat windows." msgstr "" "Gajim umieje vysyłać i atrymvać metaźviestki, źviazanyja z razmovaj z peŭnym " "kantaktam. Tut ty možaš vyznačyć, jakija paviedamleńni statusu treba " "pakazvać u voknach razmoŭ." #: gajim/data/gui/preferences_window.ui:916 #, fuzzy msgid "_Display chat state notifications:" msgstr "Pakazanyja nahadvańni statusu ŭ časie razmovy:" #: gajim/data/gui/preferences_window.ui:967 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " "send to the other party." msgstr "" "Gajim umieje vysyłać i atrymvać metaźviestki, źviazanyja z razmovaj z peŭnym " "kantaktam. Tut ty možaš vyznačyć, jakija paviedamleńni statusu treba dasyłać " "surazmoŭcam." #: gajim/data/gui/preferences_window.ui:972 #, fuzzy msgid "_Send chat state notifications:" msgstr "Pakazanyja nahadvańni statusu ŭ časie razmovy:" #: gajim/data/gui/preferences_window.ui:990 #, fuzzy msgid "Chat state notifications" msgstr "Vizualnyja nahadvańni" #: gajim/data/gui/preferences_window.ui:1012 #, fuzzy msgid "Personal Events" msgstr "Asabistyja źviestki" #: gajim/data/gui/preferences_window.ui:1043 #, fuzzy msgid "_Away after:" msgstr "Aŭtamatyčna źmianiać stan na \"_Adyjšoŭ\" praz:" #: gajim/data/gui/preferences_window.ui:1047 msgid "" "If checked, Gajim will change status to Away when the computer is unused." msgstr "" #: gajim/data/gui/preferences_window.ui:1060 #, fuzzy msgid "_Not available after:" msgstr "Aŭtamatyčna źmianiać stan na \"_Niedastupny\" praz:" #: gajim/data/gui/preferences_window.ui:1064 msgid "" "If checked, Gajim will change status to Not Available when the computer has " "not been used even longer" msgstr "" #: gajim/data/gui/preferences_window.ui:1079 #: gajim/data/gui/preferences_window.ui:1091 msgid "minutes" msgstr "chvilinaŭ" #: gajim/data/gui/preferences_window.ui:1103 msgid "" "The auto away status message. If empty, Gajim will not change the current " "status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-away timeout" msgstr "" #: gajim/data/gui/preferences_window.ui:1117 msgid "" "The auto not available status message. If empty, Gajim will not change the " "current status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-not-available timeout" msgstr "" #: gajim/data/gui/preferences_window.ui:1165 #, fuzzy msgid "Auto Status" msgstr "Dziejańni" #: gajim/data/gui/preferences_window.ui:1200 msgid "Ask status message when I:" msgstr "Spytaj paviedamleńnia statusu, kali ja:" #: gajim/data/gui/preferences_window.ui:1215 msgid "Sign _in" msgstr "_Dałučajusia" #: gajim/data/gui/preferences_window.ui:1232 msgid "Sign _out" msgstr "_Adłučajusia" #: gajim/data/gui/preferences_window.ui:1265 msgid "" "If enabled, Gajim will not ask for a status message. The specified default " "message will be used instead." msgstr "" #: gajim/data/gui/preferences_window.ui:1277 #: gajim/data/gui/preferences_window.ui:1479 msgid "Status" msgstr "Status" #: gajim/data/gui/preferences_window.ui:1288 #, fuzzy msgid "Default Message" msgstr "Standartnyja šablony paviedamleńniaŭ statusu" #: gajim/data/gui/preferences_window.ui:1303 #, fuzzy msgid "Enabled" msgstr "Ukluč" #: gajim/data/gui/preferences_window.ui:1329 #, fuzzy msgid "Status Messages" msgstr "Šablony paviedamleńniaŭ statusu" #: gajim/data/gui/preferences_window.ui:1459 msgid "Preset Status Messages" msgstr "Šablony paviedamleńniaŭ statusu" #: gajim/data/gui/preferences_window.ui:1512 #, fuzzy msgid "Chat message:" msgstr "Pa_viedamleńnie statusu:" #: gajim/data/gui/preferences_window.ui:1537 msgid "Use system _default" msgstr "Užyvaj _zmoŭčany dla systemy" #: gajim/data/gui/preferences_window.ui:1560 #, fuzzy msgid "Font" msgstr "Huki" #: gajim/data/gui/preferences_window.ui:1590 msgid "T_heme:" msgstr "T_ema:" #: gajim/data/gui/preferences_window.ui:1603 #, fuzzy msgid "Status _iconset:" msgstr "Standartny zbor _ikon statusu:" #: gajim/data/gui/preferences_window.ui:1614 #, fuzzy msgid "Use _transports icons" msgstr "Užyvaj _ikony transpartaŭ" #: gajim/data/gui/preferences_window.ui:1618 #, fuzzy msgid "" "If checked, Gajim will use protocol-specific status icons. (e.g. A contact " "from ICQ will have the equivalent ICQ icon for status online, away, busy, " "etc...)" msgstr "" "Kali ŭklučanaja hetaja opcyja, Gajim budzie pakazvać admysłovyja ikony dla " "kožnaha pratakołu (naprykład, kantaktu z MSN buduć adpaviadać ikony statusu " "MSN)" #: gajim/data/gui/preferences_window.ui:1660 msgid "Configure color and font of the interface" msgstr "Kanfihuruj koler i šryft interfejsu" #: gajim/data/gui/preferences_window.ui:1682 #, fuzzy msgid "Themes" msgstr "Ułaścivaści" #: gajim/data/gui/preferences_window.ui:1712 #, fuzzy msgid "Contact's nickname:" msgstr "Nazva kantaktu" #: gajim/data/gui/preferences_window.ui:1726 #, fuzzy msgid "Contact's message:" msgstr "Pa_viedamleńnie statusu:" #: gajim/data/gui/preferences_window.ui:1738 msgid "_Status message:" msgstr "Pa_viedamleńnie statusu:" #: gajim/data/gui/preferences_window.ui:1752 #, fuzzy msgid "Group chat highlight:" msgstr "Padśviatleńnie paviedamleńnia ŭ pakoji" #: gajim/data/gui/preferences_window.ui:1890 #, fuzzy msgid "Your nickname:" msgstr "П_ерад мянушкай:" #: gajim/data/gui/preferences_window.ui:1904 #, fuzzy msgid "Your message:" msgstr "Tekst pamyłki: %s" #: gajim/data/gui/preferences_window.ui:1916 msgid "_URL highlight:" msgstr "" #: gajim/data/gui/preferences_window.ui:2041 msgid "_Reset to Default Colors" msgstr "_Viarni zvyčajnyja kolery" #: gajim/data/gui/preferences_window.ui:2075 #, fuzzy msgid "Chat Line Colors" msgstr "Kolery kartak u aknie razmoŭ" #: gajim/data/gui/preferences_window.ui:2095 #, fuzzy msgid "Style" msgstr "Zatrymana" #: gajim/data/gui/preferences_window.ui:2128 msgid "Audio input device" msgstr "" #: gajim/data/gui/preferences_window.ui:2140 msgid "Audio output device" msgstr "" #: gajim/data/gui/preferences_window.ui:2176 #, fuzzy msgid "Audio" msgstr "Dziejańni" #: gajim/data/gui/preferences_window.ui:2206 msgid "Video input device" msgstr "" #: gajim/data/gui/preferences_window.ui:2218 msgid "Video output device" msgstr "" #: gajim/data/gui/preferences_window.ui:2230 msgid "Video framerate" msgstr "" #: gajim/data/gui/preferences_window.ui:2242 msgid "Video size" msgstr "" #: gajim/data/gui/preferences_window.ui:2252 msgid "View own video source" msgstr "" #: gajim/data/gui/preferences_window.ui:2316 #, fuzzy msgid "Video" msgstr "Dadaj praviła" #: gajim/data/gui/preferences_window.ui:2346 #, fuzzy msgid "STUN server:" msgstr "Server:" #: gajim/data/gui/preferences_window.ui:2372 msgid "" "STUN server hostname. If none given, Gajim will try\n" "to discover one from server." msgstr "" #: gajim/data/gui/preferences_window.ui:2386 msgid "(example: stun.iptel.org)" msgstr "" #: gajim/data/gui/preferences_window.ui:2400 #, fuzzy msgid "Connection" msgstr "Umovy" #: gajim/data/gui/preferences_window.ui:2485 msgid "_Mail client:" msgstr "_Paštovaja prahrama:" #: gajim/data/gui/preferences_window.ui:2498 msgid "_Browser:" msgstr "_Hartač:" #: gajim/data/gui/preferences_window.ui:2511 msgid "_File manager:" msgstr "_Kiraŭnik fajłaŭ:" #. a header for custom browser/client/file manager. so translate sth like: Custom Settings #: gajim/data/gui/preferences_window.ui:2559 msgid "Custom" msgstr "Asablivy" #: gajim/data/gui/preferences_window.ui:2576 msgid "Applications" msgstr "Aplikacyi" #: gajim/data/gui/preferences_window.ui:2604 msgid "_Ignore events from contacts not in the roster" msgstr "_Ihnaruj padzieji ad kantaktaŭ, jakich niama ŭ śpisie kantaktaŭ" #: gajim/data/gui/preferences_window.ui:2608 #, fuzzy msgid "" "If checked, Gajim will ignore incoming events from unauthorized contacts. " "Use with caution, because it blocks all messages from any contact that is " "not in the roster" msgstr "" "Uklučy hetuju opcyju, kali tabie nadakučvaje ci zakidvaje niepatrebnymi " "paviedamleńniami chtości, kaho navat niama ŭ śpisie kantaktaŭ. Ale zvažaj, " "što ŭ takim razie nichto, akramia kantaktaŭ z tvajho śpisu, nia zmoža dasłać " "tabie paviedamleńnie" #: gajim/data/gui/preferences_window.ui:2622 #, fuzzy msgid "Allow client / _OS information to be sent" msgstr "Raskryj źviestki pra _aperacyjnuju systemu" #: gajim/data/gui/preferences_window.ui:2626 #, fuzzy msgid "" "If checked, Gajim will allow others to detect the operation system you are " "using" msgstr "" "Kali ŭklučanaja hetaja opcyja, Gajim budzie dałučacca da hetaha pakoju pry " "starcie" #: gajim/data/gui/preferences_window.ui:2640 #, fuzzy msgid "Allow local system time information to be sent" msgstr "Raskryj źviestki pra _aperacyjnuju systemu" #: gajim/data/gui/preferences_window.ui:2644 #, fuzzy msgid "If checked, Gajim will allow others to detect the time on your system" msgstr "" "Kali ŭklučanaja hetaja opcyja, Gajim budzie dałučacca da hetaha pakoju pry " "starcie" #: gajim/data/gui/preferences_window.ui:2658 msgid "Log _encrypted chat session" msgstr "" #: gajim/data/gui/preferences_window.ui:2662 msgid "" "If checked, Gajim will keep logs for encrypted messages. Please note that " "when using End-to-End encryption the remote party has to agree on logging, " "else the messages will not be logged." msgstr "" #: gajim/data/gui/preferences_window.ui:2676 #, fuzzy msgid "Allow my _idle time to be sent" msgstr "Raskryj źviestki pra _aperacyjnuju systemu" #: gajim/data/gui/preferences_window.ui:2695 msgid "Global proxy:" msgstr "" #: gajim/data/gui/preferences_window.ui:2724 #, fuzzy msgid "_Manage..." msgstr "Kiruj..." #: gajim/data/gui/preferences_window.ui:2743 #, fuzzy msgid "Privacy" msgstr "Śpis pryvatnaści" #: gajim/data/gui/preferences_window.ui:2770 msgid "_Log status changes of contacts" msgstr "_Zachoŭvać u žurnale źmieny statusu kantaktaŭ" #: gajim/data/gui/preferences_window.ui:2791 msgid "Miscellaneous" msgstr "Roznaje" #: gajim/data/gui/preferences_window.ui:2810 msgid "_Open..." msgstr "_Adčyni..." #: gajim/data/gui/preferences_window.ui:2826 msgid "Advanced Configuration Editor" msgstr "Redaktar dadatkovych naładaŭ" #: gajim/data/gui/contact_context_menu.ui:12 msgid "Start _Chat" msgstr "Pačni _razmovu" #: gajim/data/gui/contact_context_menu.ui:20 #: gajim/data/gui/systray_context_menu.ui:36 msgid "Send Single _Message..." msgstr "Dašli _asobnaje aviedamleńnie..." #: gajim/data/gui/contact_context_menu.ui:28 #, fuzzy msgid "Send _File..." msgstr "Vyšli _fajł" #: gajim/data/gui/contact_context_menu.ui:44 #, fuzzy msgid "Invite _Contacts" msgstr "Kantakty" #: gajim/data/gui/contact_context_menu.ui:73 #, fuzzy msgid "E_xecute Command..." msgstr "Vykanaj zahad..." #: gajim/data/gui/contact_context_menu.ui:82 #, fuzzy msgid "M_anage Contact" msgstr "Źmiani nazvu kantaktu" #: gajim/data/gui/contact_context_menu.ui:92 #, fuzzy msgid "_Rename..." msgstr "Źmiani _nazvu" #: gajim/data/gui/contact_context_menu.ui:99 #, fuzzy msgid "Edit _Groups..." msgstr "Źmiani _hrupy" #: gajim/data/gui/contact_context_menu.ui:106 #, fuzzy msgid "Assign Open_PGP Key..." msgstr "Pryznač kluč Open_PGP" #: gajim/data/gui/contact_context_menu.ui:115 #, fuzzy msgid "Add Special _Notification..." msgstr "Dadaj admysłovaje _nahadvańnie" #: gajim/data/gui/contact_context_menu.ui:129 msgid "_Subscription" msgstr "_Aŭtaryzacyja" #: gajim/data/gui/contact_context_menu.ui:138 #, fuzzy msgid "_Allow contact to see my status" msgstr "_Dazvol hetamu kantaktu bačyć moj status" #: gajim/data/gui/contact_context_menu.ui:146 #, fuzzy msgid "A_sk to see contact status" msgstr "Spytaj _dazvołu bačyć jahony/jejny status" #: gajim/data/gui/contact_context_menu.ui:154 #, fuzzy msgid "_Forbid contact to see my status" msgstr "Za_barani jamu/joj bačyć moj status" #: gajim/data/gui/contact_context_menu.ui:182 #, fuzzy msgid "_Unignore" msgstr "dziaviataja" #: gajim/data/gui/contact_context_menu.ui:190 msgid "_Ignore" msgstr "" #: gajim/data/gui/contact_context_menu.ui:197 #: gajim/data/gui/chat_context_menu.ui:66 #, fuzzy msgid "_Add to Roster..." msgstr "_Dadaj u śpis kantaktaŭ" #: gajim/data/gui/account_creation_wizard_window.ui:43 msgid "Gajim: Account Creation Wizard" msgstr "Gajim: Stvareńnie kontu" #: gajim/data/gui/account_creation_wizard_window.ui:70 msgid "" "You need to have an account in order to connect\n" "to the Jabber network." msgstr "" "Ty musiš mieć kont, kab dałučycca da sietki\n" "Jabber." #: gajim/data/gui/account_creation_wizard_window.ui:95 #, fuzzy msgid "I already have an account I want to _use" msgstr "Ja ŭžo maju patrebny kont" #: gajim/data/gui/account_creation_wizard_window.ui:112 msgid "I want to _register for a new account" msgstr "Ja chaču za_rehistravać novy kont" #: gajim/data/gui/account_creation_wizard_window.ui:133 msgid "Please choose one of the options below:" msgstr "Kali łaska, abiary adnu z nastupnych opcyjaŭ:" #: gajim/data/gui/account_creation_wizard_window.ui:167 #, fuzzy msgid "Please fill in the data for your existing account" msgstr "Kali łaska, zapoŭni kartku źviestak dla novaha kontu" #: gajim/data/gui/account_creation_wizard_window.ui:187 msgid "_Jabber ID:" msgstr "_Jabber ID:" #: gajim/data/gui/account_creation_wizard_window.ui:239 #: gajim/data/gui/account_creation_wizard_window.ui:394 #, fuzzy msgid "Anon_ymous authentication" msgstr "Užyvaj aŭtaryzacyju" #: gajim/data/gui/account_creation_wizard_window.ui:259 #: gajim/data/gui/manage_bookmarks_window.ui:172 msgid "_Password:" msgstr "_Parol:" #: gajim/data/gui/account_creation_wizard_window.ui:281 msgid "Save pass_word" msgstr "Zachavaj _parol" #: gajim/data/gui/account_creation_wizard_window.ui:285 msgid "If checked, Gajim will remember the password for this account" msgstr "Kali ŭklučanaja hetaja opcyja, Gajim zapomnić parol dla hetaha kontu" #: gajim/data/gui/account_creation_wizard_window.ui:339 msgid "Please select a server" msgstr "" #: gajim/data/gui/account_creation_wizard_window.ui:358 #: gajim/data/gui/manage_bookmarks_window.ui:159 msgid "_Server:" msgstr "_Server:" #: gajim/data/gui/account_creation_wizard_window.ui:423 #, fuzzy msgid "Prox_y:" msgstr "Proxy:" #: gajim/data/gui/account_creation_wizard_window.ui:450 msgid "Manage..." msgstr "Kiruj..." #: gajim/data/gui/account_creation_wizard_window.ui:465 msgid "Use custom hostname/port" msgstr "Skarystaj admysłovy host/port" #: gajim/data/gui/account_creation_wizard_window.ui:491 #, fuzzy msgid "_Hostname:" msgstr "Nazva hosta: " #: gajim/data/gui/account_creation_wizard_window.ui:517 msgid "_Port:" msgstr "_Port:" #: gajim/data/gui/account_creation_wizard_window.ui:553 #: gajim/data/gui/account_creation_wizard_window.ui:884 msgid "_Advanced" msgstr "_Dadatkovyja" #: gajim/data/gui/account_creation_wizard_window.ui:624 msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA1 fingerprint of the certificate:\n" msgstr "" #: gajim/data/gui/account_creation_wizard_window.ui:687 #, fuzzy msgid "" "Connecting to server\n" "\n" "Please wait..." msgstr "" "Stvarajecca kont\n" "\n" "Kali łaska, pačakaj..." #: gajim/data/gui/account_creation_wizard_window.ui:772 msgid "Connect when I press Finish" msgstr "Dałučysia pa nacisku knopki \"Skonč\"" #: gajim/data/gui/account_creation_wizard_window.ui:789 msgid "Set my profile when I connect" msgstr "Nastaŭ profil paśla złučeńnia" #: gajim/data/gui/account_creation_wizard_window.ui:901 msgid "_Finish" msgstr "_Skonč" #: gajim/data/gui/privacy_lists_window.ui:34 msgid "Privacy Lists:" msgstr "Śpisy pryvatnaści:" #: gajim/data/gui/service_discovery_window.ui:84 msgid "_Address:" msgstr "_Adras:" #: gajim/data/gui/service_discovery_window.ui:115 msgid "G_o" msgstr "_Pierajdzi" #: gajim/data/gui/synchronise_select_contacts_dialog.ui:8 msgid "Synchronise : select contacts" msgstr "" #: gajim/data/gui/synchronise_select_contacts_dialog.ui:67 #, fuzzy msgid "Select the contacts you want to synchronise" msgstr "JID kantaktu, ź jakim chočaš parazmaŭlać" #: gajim/data/gui/edit_groups_dialog.ui:8 msgid "Edit Groups" msgstr "Źmiani hrupy" #: gajim/data/gui/search_window.ui:42 #, fuzzy msgid "Please wait while retrieving search form..." msgstr "Kali łaska, pačakaj kanca atrymańnia śpisu zahadaŭ..." #: gajim/data/gui/search_window.ui:80 #, fuzzy msgid "_Add contact" msgstr "_Dadaj kantakt" #: gajim/data/gui/search_window.ui:116 msgid "_Search" msgstr "Š_ukaj" #: gajim/data/gui/chat_context_menu.ui:11 msgid "_Copy Link Location" msgstr "S_kapijuj adras spasyłki" #: gajim/data/gui/chat_context_menu.ui:19 msgid "_Open Link in Browser" msgstr "_Adčyni spasyłku ŭ hartačy" #: gajim/data/gui/chat_context_menu.ui:27 msgid "_Copy JID/Email Address" msgstr "S_kapijuj JID/Email" #: gajim/data/gui/chat_context_menu.ui:35 msgid "_Open Email Composer" msgstr "_Adčyni paštovuju prahramu" #: gajim/data/gui/chat_context_menu.ui:49 #: gajim/data/gui/subscription_request_window.ui:12 msgid "_Start Chat" msgstr "_Pačni razmovu" #: gajim/data/gui/chat_context_menu.ui:57 #: gajim/data/gui/account_context_menu.ui:35 #: gajim/data/gui/systray_context_menu.ui:28 msgid "Join _Group Chat" msgstr "Dałučysia da _pakoju" #: gajim/data/gui/change_status_message_dialog.ui:131 msgid "Save as Preset..." msgstr "Zachavaj jak šablon..." #: gajim/data/gui/change_status_message_dialog.ui:167 msgid "Preset messages:" msgstr "Šablony paviedamleńniaŭ statusu:" #: gajim/data/gui/change_status_message_dialog.ui:313 msgid "Type your new status message" msgstr "Uviadzi novaje paviedamleńnie statusu" #: gajim/data/gui/synchronise_select_account_dialog.ui:8 #, fuzzy msgid "Synchronise contacts" msgstr "Pakažy _adłučanyja kantakty" #: gajim/data/gui/synchronise_select_account_dialog.ui:68 msgid "Select the account with which you want to synchronise" msgstr "" #: gajim/data/gui/archiving_313_preferences_window.ui:28 #, fuzzy msgid "Roster" msgstr "Pakažy _śpis kantaktaŭ" #: gajim/data/gui/archiving_313_preferences_window.ui:85 #, fuzzy msgid "Preference" msgstr "Nałady" #: gajim/data/gui/archiving_313_preferences_window.ui:159 #, fuzzy msgid "Default:" msgstr "Zmoŭčany" #: gajim/data/gui/voip_call_received_dialog.ui:15 msgid "Incoming call" msgstr "" #: gajim/data/gui/add_new_contact_window.ui:29 msgid "Add New Contact" msgstr "Dadaj novy kantakt" #: gajim/data/gui/add_new_contact_window.ui:62 msgid "A_ccount:" msgstr "_Kont:" #: gajim/data/gui/add_new_contact_window.ui:110 msgid "_Protocol:" msgstr "_Pratakoł:" #: gajim/data/gui/add_new_contact_window.ui:169 msgid "_User ID:" msgstr "_ID karystalnika:" #: gajim/data/gui/add_new_contact_window.ui:182 #: gajim/data/gui/manage_bookmarks_window.ui:133 msgid "_Nickname:" msgstr "_Mianuška:" #: gajim/data/gui/add_new_contact_window.ui:195 msgid "_Group:" msgstr "_Hrupa:" #: gajim/data/gui/add_new_contact_window.ui:210 #, fuzzy msgid "Type User ID" msgstr "Identyfikatar karystalnika:" #: gajim/data/gui/add_new_contact_window.ui:223 #, fuzzy msgid "Type Nickname" msgstr "Mianuška" #: gajim/data/gui/add_new_contact_window.ui:239 msgid "Choose a group of type a new group" msgstr "" #: gajim/data/gui/add_new_contact_window.ui:257 msgid "A_llow this contact to view my status" msgstr "_Dazvol hetamu kantaktu bačyć moj status" #: gajim/data/gui/add_new_contact_window.ui:300 #, fuzzy msgid "_Save subscription message" msgstr "_Aŭtaryzacyja" #: gajim/data/gui/add_new_contact_window.ui:325 #, fuzzy msgid "" "You have to register with this transport\n" "to be able to add a contact from this\n" "protocol. Click on Register button to\n" "proceed." msgstr "" "Treba zarehistravacca na hetym šluzie,\n" "kab dadać kantakt z hetaha pratakołu.\n" "Klikni pa knopcy rehistracyi\n" "dla praciahu." #: gajim/data/gui/add_new_contact_window.ui:340 msgid "_Register" msgstr "_Rehistruj" #: gajim/data/gui/add_new_contact_window.ui:369 msgid "" "You must be connected to the transport to be able\n" "to add a contact from this protocol." msgstr "" "Treba złučycca z šluzam, kab mahčy dadavać kantakty\n" "z hetaha pratakołu." #: gajim/data/gui/roster_window.ui:61 #, fuzzy msgid "Change Status Message…" msgstr "Ź_miani paviedamleńnie statusu" #: gajim/data/gui/change_mood_dialog.ui:73 #, fuzzy msgid "Mood:" msgstr "Huki" #: gajim/data/gui/change_mood_dialog.ui:85 #, fuzzy msgid "Message:" msgstr "Šablony paviedamleńniaŭ statusu" #: gajim/data/gui/plugins_window.ui:25 gajim/data/gui/application_menu.ui:90 msgid "Plugins" msgstr "" #: gajim/data/gui/plugins_window.ui:78 msgid "Install from zip" msgstr "" #: gajim/data/gui/plugins_window.ui:109 msgid "<empty>" msgstr "" #: gajim/data/gui/plugins_window.ui:131 #, fuzzy msgid "Version:" msgstr "Versija GTK+:" #: gajim/data/gui/plugins_window.ui:169 #, fuzzy msgid "Authors:" msgstr "_Aŭtaryzuj" #: gajim/data/gui/plugins_window.ui:210 #, fuzzy msgid "Homepage:" msgstr "Chatniaja staronka:" #: gajim/data/gui/plugins_window.ui:253 #, fuzzy msgid "Description:" msgstr "Apisańnie: %s" #: gajim/data/gui/plugins_window.ui:301 msgid "Uninstall" msgstr "" #: gajim/data/gui/plugins_window.ui:316 #, fuzzy msgid "Configure" msgstr "_Praciahni" #: gajim/data/gui/plugins_window.ui:348 #, fuzzy msgid "Installed" msgstr "Zatrymana" #: gajim/data/gui/plugins_window.ui:399 msgid "" "Plug-in decription should be displayed here. This text will be erased during " "PluginsWindow initialization." msgstr "" #: gajim/data/gui/privacy_list_window.ui:18 #, fuzzy msgid "none" msgstr "pieršaja" #: gajim/data/gui/privacy_list_window.ui:21 #, fuzzy msgid "both" msgstr "Dvuchbakovaja" #: gajim/data/gui/privacy_list_window.ui:24 #, fuzzy msgid "from" msgstr "Ad" #: gajim/data/gui/privacy_list_window.ui:27 #, fuzzy msgid "to" msgstr "druhaja" #: gajim/data/gui/privacy_list_window.ui:66 msgid "Privacy List" msgstr "Śpis pryvatnaści" #: gajim/data/gui/privacy_list_window.ui:77 msgid "Active for this session" msgstr "Dziejny dla hetaj sesii" #: gajim/data/gui/privacy_list_window.ui:94 msgid "Active on each startup" msgstr "Dziejny pry kožnym starcie" #: gajim/data/gui/privacy_list_window.ui:132 msgid "List of rules" msgstr "Śpis praviłaŭ" #: gajim/data/gui/privacy_list_window.ui:244 msgid "Add / Edit a rule" msgstr "Dadaj / Źmiani praviła" #: gajim/data/gui/privacy_list_window.ui:266 msgid "Allow" msgstr "Dazvol" #: gajim/data/gui/privacy_list_window.ui:282 msgid "Deny" msgstr "Admoŭ" #: gajim/data/gui/privacy_list_window.ui:317 msgid "JabberID" msgstr "JID" #: gajim/data/gui/privacy_list_window.ui:358 msgid "all in the group" msgstr "pavodle hrupy" #: gajim/data/gui/privacy_list_window.ui:407 msgid "all by subscription" msgstr "pavodle aŭtaryzacyi" #: gajim/data/gui/privacy_list_window.ui:456 msgid "All" msgstr "usim" #: gajim/data/gui/privacy_list_window.ui:493 msgid "to send me messages" msgstr "dasyłać mnie paviedamleńni" #: gajim/data/gui/privacy_list_window.ui:509 msgid "to send me queries" msgstr "dasyłać mnie apytańni" #: gajim/data/gui/privacy_list_window.ui:525 msgid "to view my status" msgstr "bačyć moj status" #: gajim/data/gui/privacy_list_window.ui:541 msgid "to send me status" msgstr "dasyłać mnie paviedamleńni statusu" #: gajim/data/gui/privacy_list_window.ui:557 #, fuzzy msgid "All (including subscription)" msgstr "pavodle aŭtaryzacyi" #: gajim/data/gui/privacy_list_window.ui:598 msgid "Order:" msgstr "Paradak:" #: gajim/data/gui/manage_sounds_window.ui:10 #, fuzzy msgid "Manage sounds" msgstr "Kiruj kontami" #: gajim/data/gui/remove_account_window.ui:56 msgid "Remove account _only from Gajim" msgstr "Vydal kont _tolki dla Gajim" #: gajim/data/gui/remove_account_window.ui:73 msgid "Remove account from Gajim and from _server" msgstr "Vydal kont i dla Gajim, i na _servery" #: gajim/data/gui/remove_account_window.ui:94 msgid "What do you want to do?" msgstr "Što chočaš zrabić?" #: gajim/data/gui/adhoc_commands_window.ui:35 msgid "Please wait while retrieving command list..." msgstr "Kali łaska, pačakaj kanca atrymańnia śpisu zahadaŭ..." #: gajim/data/gui/adhoc_commands_window.ui:93 msgid "Choose command to execute:" msgstr "Abiary zahad dla vykanańnia:" #: gajim/data/gui/adhoc_commands_window.ui:136 #: gajim/data/gui/adhoc_commands_window.ui:277 msgid "Check once more" msgstr "Spraŭdź nanoŭ" #: gajim/data/gui/adhoc_commands_window.ui:194 #, fuzzy msgid "Please wait while the command is being sent..." msgstr "Kali łaska, pačakaj kanca dasyłańnia zahadu..." #: gajim/data/gui/adhoc_commands_window.ui:211 msgid "Please wait..." msgstr "Kali łaska, pačakaj..." #: gajim/data/gui/adhoc_commands_window.ui:257 msgid "This jabber entity does not expose any commands." msgstr "Hety abjekt Jabber nia maje dastupnych zahadaŭ." #: gajim/data/gui/adhoc_commands_window.ui:336 msgid "An error has occurred:" msgstr "Adbyłasia pamyłka:" #: gajim/data/gui/adhoc_commands_window.ui:465 #, fuzzy msgid "F_inish" msgstr "_Skonč" #: gajim/data/gui/account_context_menu.ui:20 #, fuzzy msgid "_Personal Events" msgstr "Asabistyja źviestki" #: gajim/data/gui/account_context_menu.ui:49 msgid "_Add Contact..." msgstr "_Dadaj kantakt..." #: gajim/data/gui/account_context_menu.ui:57 msgid "_Discover Services" msgstr "_Šukaj servisy" #: gajim/data/gui/account_context_menu.ui:65 msgid "_Execute Command..." msgstr "_Vykanaj zahad..." #: gajim/data/gui/esession_info_window.ui:50 msgid "_Verify" msgstr "" #: gajim/data/gui/esession_info_window.ui:137 #, fuzzy msgid "(ESession info)" msgstr "Apisańnie" #: gajim/data/gui/application_menu.ui:8 #, fuzzy msgid "View" msgstr "_Vyhlad" #: gajim/data/gui/application_menu.ui:11 #, fuzzy msgid "Show Roster" msgstr "Pakažy _śpis kantaktaŭ" #: gajim/data/gui/application_menu.ui:16 #, fuzzy msgid "Show Offline Contacts" msgstr "Pakažy _adłučanyja kantakty" #: gajim/data/gui/application_menu.ui:21 #, fuzzy msgid "Show Active Contacts" msgstr "Pakažy _adłučanyja kantakty" #: gajim/data/gui/application_menu.ui:26 #, fuzzy msgid "Show Transports" msgstr "Pakažy _transparty" #: gajim/data/gui/application_menu.ui:43 #, fuzzy msgid "Help" msgstr "_Dapamoha" #: gajim/data/gui/application_menu.ui:46 #, fuzzy msgid "Contents" msgstr "_Źmiest" #: gajim/data/gui/application_menu.ui:50 #, fuzzy msgid "FAQ" msgstr "_Častyja pytańni" #: gajim/data/gui/application_menu.ui:54 msgid "Keyboard Shortcuts" msgstr "" #: gajim/data/gui/application_menu.ui:58 gajim/data/gui/features_window.ui:9 #, fuzzy msgid "Features" msgstr "Zdolnaści serveraŭ" #: gajim/data/gui/application_menu.ui:76 msgid "Start Chat" msgstr "Pačni razmovu" #: gajim/data/gui/application_menu.ui:81 #, fuzzy msgid "Bookmarks" msgstr "_Stvary zakładku dla hetaja pakoju" #: gajim/data/gui/application_menu.ui:99 #, fuzzy msgid "Quit" msgstr "_Skonč pracu" #: gajim/data/gui/features_window.ui:26 msgid "List of possible features in Gajim:" msgstr "" #: gajim/data/gui/manage_bookmarks_window.ui:14 msgid "Manage Bookmarks" msgstr "Kiruj zakładkami" #: gajim/data/gui/manage_bookmarks_window.ui:120 #, fuzzy msgid "_Title:" msgstr "Zahałovak:" #: gajim/data/gui/manage_bookmarks_window.ui:146 msgid "Roo_m:" msgstr "" #: gajim/data/gui/manage_bookmarks_window.ui:188 #, fuzzy msgid "A_uto join" msgstr "Aŭtamatyčna dałučajsia" #: gajim/data/gui/manage_bookmarks_window.ui:193 msgid "If checked, Gajim will join this group chat on startup" msgstr "" "Kali ŭklučanaja hetaja opcyja, Gajim budzie dałučacca da hetaha pakoju pry " "starcie" #: gajim/data/gui/manage_bookmarks_window.ui:207 msgid "Minimi_ze on Auto Join" msgstr "" #: gajim/data/gui/manage_bookmarks_window.ui:235 #, fuzzy msgid "Pr_int status:" msgstr "Pakazvaj status:" #: gajim/data/gui/exception_dialog.ui:45 #, fuzzy msgid "" "A programming error has been detected. It probably is not fatal, but should " "be reported to the developers nonetheless." msgstr "" "Heta nie fatalna, ale ŭsio roŭna varta paviedamić pra takuju sytuacyju " "raspracoŭnikam." #: gajim/data/gui/exception_dialog.ui:115 #, fuzzy msgid "Report Bug" msgstr "_Paviedam pra pamyłku" #: gajim/data/gui/subscription_request_window.ui:95 msgid "_Deny" msgstr "_Admoŭ" #: gajim/data/gui/subscription_request_window.ui:100 msgid "" "Deny authorization from contact so he or she cannot know when you're " "connected" msgstr "" "Admoŭ na zapyt aŭtaryzacyi kantaktu, kab jon/jana nie mahli bačyć, kali ja " "dałučany" #: gajim/data/gui/subscription_request_window.ui:133 msgid "Au_thorize" msgstr "_Aŭtaryzuj" #: gajim/data/gui/subscription_request_window.ui:138 msgid "Authorize contact so he or she can know when you're connected" msgstr "" "Aŭtaryzuj kantakt, kab jon/jana mahli bačyć, kali ja dałučany da servera" #: gajim/data/gui/xml_console_window.ui:121 #, fuzzy msgid "Presence" msgstr "P_rysutnaść" #: gajim/data/gui/xml_console_window.ui:134 msgid "Iq" msgstr "" #: gajim/data/gui/xml_console_window.ui:149 #, fuzzy msgid "Presets" msgstr "P_rysutnaść" #: gajim/data/gui/chat_to_muc_window.ui:24 msgid "Invite Friends!" msgstr "" #: gajim/data/gui/chat_to_muc_window.ui:39 #, fuzzy msgid "" "You are now entering a groupchat.\n" "Select the contacts you want to invite" msgstr "JID kantaktu, ź jakim chočaš parazmaŭlać" #: gajim/data/gui/chat_to_muc_window.ui:67 #: gajim/data/gui/chat_to_muc_window.ui:78 msgid "column" msgstr "" #: gajim/data/gui/chat_to_muc_window.ui:112 msgid "Please select a MUC server." msgstr "" #: gajim/data/gui/chat_to_muc_window.ui:141 #, fuzzy msgid "MUC server" msgstr "Naziralniki" #: gajim/data/gui/chat_to_muc_window.ui:176 #, fuzzy msgid "In_vite" msgstr "_Zaprasi" #: gajim/data/gui/history_manager.ui:11 #, fuzzy msgid "_Export" msgstr "Ekspartuj" #: gajim/data/gui/history_manager.ui:97 msgid "Gajim History Logs Manager" msgstr "Kiraŭnik žurnałaŭ razmoŭ Gajim" #: gajim/data/gui/history_manager.ui:154 #, fuzzy msgid "Welcome to Gajim History Logs Manager" msgstr "Kiraŭnik žurnałaŭ razmoŭ Gajim" #: gajim/data/gui/history_manager.ui:168 msgid "" "This log manager is not intended for log viewing. If you are looking for " "such functionality, use the history window instead.\n" "\n" "Use this program to delete or export logs. You can select logs from the left " "and/or search database from below." msgstr "" #: gajim/data/gui/history_manager.ui:184 #, fuzzy msgid "" "WARNING:\n" "If you plan to do massive deletions, please make sure Gajim is not running. " "Generally avoid deletions with contacts you currently chat with." msgstr "" "Vas vitaje Kiraŭnik žurnałaŭ razmoŭ Gajim\n" "\n" "Možaš vybrać adzin z žurnałaŭ u levaj paneli albo pasprabavać znajści " "patrebny tekst u bazie žurnałaŭ.\n" "\n" "UVAHA:\n" "Kali chočaš ździejśnić masavuju čystku žurnałaŭ, to začyni Gajim. Nie " "vydalaj žurnały razmoŭ ź ludźmi, ź jakimi ŭ hety čas razmaŭlaješ." #: gajim/data/gui/history_manager.ui:283 msgid "_Search Database" msgstr "_Šukaj u bazie žurnałaŭ" #: gajim/data/gui/shortcuts_window.ui:8 msgid "Chat Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:12 #, fuzzy msgid "Message composition" msgstr "źmiest paviedamleńnia" #: gajim/data/gui/shortcuts_window.ui:17 #, fuzzy msgid "Send the message" msgstr "Dašli paviedamleńnie" #: gajim/data/gui/shortcuts_window.ui:24 #, fuzzy msgid "Create a new line" msgstr "Stvary novy zapis" #: gajim/data/gui/shortcuts_window.ui:31 msgid "Select an emoticon" msgstr "" #: gajim/data/gui/shortcuts_window.ui:38 msgid "Complete a command or a nick" msgstr "" #: gajim/data/gui/shortcuts_window.ui:45 #, fuzzy msgid "Previous sent message" msgstr "Šablony paviedamleńniaŭ statusu:" #: gajim/data/gui/shortcuts_window.ui:52 #, fuzzy msgid "Next sent messages" msgstr "Šablony paviedamleńniaŭ statusu:" #: gajim/data/gui/shortcuts_window.ui:59 #, fuzzy msgid "Quote previous message" msgstr "paviedamlennie statusu" #: gajim/data/gui/shortcuts_window.ui:66 #, fuzzy msgid "Quote next message" msgstr "Dašli paviedamleńnie" #: gajim/data/gui/shortcuts_window.ui:73 #, fuzzy msgid "Clear message entry" msgstr "Paviedamleńnie dasłanaje" #: gajim/data/gui/shortcuts_window.ui:81 gajim/data/gui/shortcuts_window.ui:231 #, fuzzy msgid "Appearance" msgstr "Redahuj praviła" #: gajim/data/gui/shortcuts_window.ui:86 msgid "Toggle full / compact view" msgstr "" #: gajim/data/gui/shortcuts_window.ui:94 #, fuzzy msgid "Recent history" msgstr "Niadaŭna:" #: gajim/data/gui/shortcuts_window.ui:99 msgid "Scroll up" msgstr "" #: gajim/data/gui/shortcuts_window.ui:106 msgid "Scroll down" msgstr "" #: gajim/data/gui/shortcuts_window.ui:121 msgid "Tabs" msgstr "" #: gajim/data/gui/shortcuts_window.ui:126 msgid "Switch to the previous tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:133 msgid "Switch to the next tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:140 msgid "Switch to the first - ninth tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:147 msgid "Switch to the previous unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:154 msgid "Switch to the next unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:161 msgid "Close chat" msgstr "" #: gajim/data/gui/shortcuts_window.ui:172 msgid "Roster Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:195 #, fuzzy msgid "File transfers" msgstr "Pieradačy fajłaŭ" #: gajim/data/gui/shortcuts_window.ui:209 #, fuzzy msgid "Join a group chat" msgstr "Dałučysia da _pakoju" #: gajim/data/gui/shortcuts_window.ui:216 #, fuzzy msgid "Set the status message" msgstr "paviedamlennie statusu" #: gajim/data/gui/shortcuts_window.ui:223 #, fuzzy msgid "Quit Gajim" msgstr "Gajim" #: gajim/data/gui/shortcuts_window.ui:236 #, fuzzy msgid "Show offline contacts" msgstr "Pakažy _adłučanyja kantakty" #: gajim/data/gui/shortcuts_window.ui:243 #, fuzzy msgid "Show only active contacts" msgstr "Pakažy _adłučanyja kantakty" #: gajim/data/gui/shortcuts_window.ui:250 msgid "Enable roster filtering" msgstr "" #: gajim/data/gui/shortcuts_window.ui:258 msgid "Contacts" msgstr "Kantakty" #: gajim/data/gui/shortcuts_window.ui:263 #, fuzzy msgid "Contact information" msgstr "Źviestki ab kantakcie" #: gajim/data/gui/shortcuts_window.ui:270 #, fuzzy msgid "Rename contact" msgstr "Źmiani nazvu kantaktu" #: gajim/data/gui/shortcuts_window.ui:277 #, fuzzy msgid "Delete contact" msgstr "Kantakty" #: gajim/data/gui/passphrase_dialog.ui:8 msgid "Passphrase" msgstr "Parol" #: gajim/data/gui/history_window.ui:38 #, fuzzy msgid "Enter name / JID of contact or groupchat" msgstr "Nazva kantaktu" #: gajim/data/gui/history_window.ui:51 #, fuzzy msgid "Search:" msgstr "Šukaj" #: gajim/data/gui/history_window.ui:75 msgid "_In date search" msgstr "" #: gajim/data/gui/history_window.ui:79 msgid "Only searching within selected day" msgstr "" #: gajim/data/gui/history_window.ui:306 #, fuzzy msgid "_Show status changes" msgstr "_Zachoŭvać u žurnale źmieny statusu kantaktaŭ" #: gajim/data/gui/manage_pep_services_window.ui:13 #, fuzzy msgid "PEP Service Configuration" msgstr "Kanfihuracyja pakoju" #: gajim/data/gui/manage_pep_services_window.ui:69 #, fuzzy msgid "_Configure" msgstr "_Praciahni" #: gajim/data/gui/groups_post_window.ui:9 msgid "Create new post" msgstr "Stvary novy zapis" #: gajim/data/gui/groups_post_window.ui:29 #: gajim/data/gui/single_message_window.ui:46 msgid "From:" msgstr "Ad:" #: gajim/data/gui/groups_post_window.ui:41 #: gajim/data/gui/single_message_window.ui:70 msgid "Subject:" msgstr "Tema:" #: gajim/data/gui/data_form_window.ui:19 msgid "Fill in the form." msgstr "Zapoŭni formu." #: gajim/data/gui/data_form_window.ui:274 msgid "Room Configuration" msgstr "Kanfihuracyja pakoju" #: gajim/data/gui/roster_item_exchange_window.ui:8 msgid "Roster Item Exchange" msgstr "" #: gajim/data/gui/systray_context_menu.ui:12 msgid "Sta_tus" msgstr "Sta_tus" #: gajim/data/gui/systray_context_menu.ui:20 #, fuzzy msgid "_Start Chat..." msgstr "_Pačni razmovu" #: gajim/data/gui/systray_context_menu.ui:50 msgid "Show All Pending _Events" msgstr "Pakažy ŭsie niahledžanyja _padzieji" #: gajim/data/gui/systray_context_menu.ui:59 msgid "Mute Sounds" msgstr "Ściš huki" #: gajim/data/gui/systray_context_menu.ui:75 #, fuzzy msgid "_Preferences" msgstr "Nałady" #: gajim/data/gui/systray_context_menu.ui:90 #, fuzzy msgid "_Quit" msgstr "_Skonč pracu" #: gajim/data/gui/single_message_window.ui:59 msgid "To:" msgstr "Da:" #: gajim/data/gui/single_message_window.ui:118 msgid "0" msgstr "0" #: gajim/data/gui/single_message_window.ui:210 msgid "Sen_d" msgstr "_Dašli" #: gajim/data/gui/single_message_window.ui:216 msgid "Send message" msgstr "Dašli paviedamleńnie" #: gajim/data/gui/single_message_window.ui:229 msgid "_Reply" msgstr "_Adkažy" #: gajim/data/gui/single_message_window.ui:235 msgid "Reply to this message" msgstr "Adkažy na hetaje paviedamleńnie" #: gajim/data/gui/single_message_window.ui:248 msgid "_Send & Close" msgstr "_Dašli i začyni" #: gajim/data/gui/single_message_window.ui:254 msgid "Send message and close window" msgstr "Dašli paviedamleńnie i začyni akno" #: gajim/data/gui/change_activity_dialog.ui:8 msgid "Set Activity" msgstr "" #: gajim/data/gui/change_activity_dialog.ui:65 msgid "Set an activity" msgstr "" #: gajim/data/gui/change_activity_dialog.ui:337 #, fuzzy msgid "Message: " msgstr "Šablony paviedamleńniaŭ statusu" #: gajim/command_system/mapping.py:164 gajim/command_system/mapping.py:174 #: gajim/command_system/mapping.py:194 #, fuzzy msgid "Missing arguments" msgstr "Nie staje arhumenta \"contact_jid\"" #: gajim/command_system/mapping.py:261 #, fuzzy msgid "Too many arguments" msgstr "Nie staje arhumenta \"contact_jid\"" #: gajim/command_system/implementation/execute.py:53 msgid "Execute expression inside a shell, show output" msgstr "" #: gajim/command_system/implementation/execute.py:109 msgid "Execute expression inside a shell, send output" msgstr "" #: gajim/command_system/implementation/standard.py:45 msgid "" "Show help on a given command or a list of available commands if -a is given" msgstr "" #: gajim/command_system/implementation/standard.py:72 #, fuzzy msgid "Send a message to the contact" msgstr "Užyvańnie: /%s, chavaje knopki razmovy." #: gajim/command_system/implementation/standard.py:77 msgid "Send action (in the third person) to the current chat" msgstr "" #: gajim/command_system/implementation/standard.py:82 msgid "Show logged messages which mention given text" msgstr "" #: gajim/command_system/implementation/standard.py:87 #, fuzzy, python-format msgid "%s: Nothing found" msgstr "%s nia znojdzieny" #: gajim/command_system/implementation/standard.py:93 msgid "Limit must be an integer" msgstr "" #: gajim/command_system/implementation/standard.py:117 msgid "" "\n" " Set the current status\n" "\n" " Status can be given as one of the following values:\n" " online, away, chat, xa, dnd.\n" " " msgstr "" #: gajim/command_system/implementation/standard.py:135 msgid "Set the current status to away" msgstr "" #: gajim/command_system/implementation/standard.py:149 msgid "Set the current status to online" msgstr "" #: gajim/command_system/implementation/standard.py:152 #, fuzzy msgid "Available" msgstr "_Dastupny" #: gajim/command_system/implementation/standard.py:172 #: gajim/command_system/implementation/standard.py:249 #, fuzzy msgid "Clear the text window" msgstr "Užyvańnie: /%s, ačyščaje akno ad tekstu." #: gajim/command_system/implementation/standard.py:177 #: gajim/command_system/implementation/standard.py:389 #, fuzzy msgid "Send a ping to the contact" msgstr "Dasyłaje kantaktu fajł" #: gajim/command_system/implementation/standard.py:180 #: gajim/command_system/implementation/standard.py:392 msgid "Command is not supported for zeroconf accounts" msgstr "" #: gajim/command_system/implementation/standard.py:184 msgid "Send DTMF sequence through an open audio session" msgstr "" #: gajim/command_system/implementation/standard.py:187 #, fuzzy msgid "No open audio sessions with the contact" msgstr "Klikni, kab pahladzieć tekt papiarednich razmoŭ z hetym kantaktam" #: gajim/command_system/implementation/standard.py:190 #, python-format msgid "%s is not a valid tone" msgstr "" #: gajim/command_system/implementation/standard.py:197 msgid "Toggle audio session" msgstr "" #: gajim/command_system/implementation/standard.py:200 #, fuzzy msgid "Audio sessions are not available" msgstr "Złučeńnie niemahčymaje" #: gajim/command_system/implementation/standard.py:207 msgid "Toggle video session" msgstr "" #: gajim/command_system/implementation/standard.py:210 #, fuzzy msgid "Video sessions are not available" msgstr "Złučeńnia niama" #: gajim/command_system/implementation/standard.py:217 msgid "Send a message to the contact that will attract his (her) attention" msgstr "" #: gajim/command_system/implementation/standard.py:256 #, fuzzy msgid "Change your nickname in a group chat" msgstr "Źmiani _mianušku" #: gajim/command_system/implementation/standard.py:266 #, fuzzy msgid "Open a private chat window with a specified occupant" msgstr "" "Užyvańnie: /%s , adčyniaje akno pryvatnaj razmovy z akreślenaj " "asobaj." #: gajim/command_system/implementation/standard.py:272 #: gajim/command_system/implementation/standard.py:281 #: gajim/command_system/implementation/standard.py:327 #: gajim/command_system/implementation/standard.py:339 #: gajim/command_system/implementation/standard.py:351 #, fuzzy msgid "Nickname not found" msgstr "Mianuška nia znojdziena: %s" #: gajim/command_system/implementation/standard.py:275 #, fuzzy msgid "" "Open a private chat window with a specified occupant and send him a message" msgstr "" "Užyvańnie: /%s , adčyniaje akno pryvatnaj razmovy z akreślenaj " "asobaj." #: gajim/command_system/implementation/standard.py:284 #, fuzzy msgid "Display or change a group chat topic" msgstr "Pytajsia paćvierdžańnia pierad začynieńniem kartki/akna razmovy." #: gajim/command_system/implementation/standard.py:292 msgid "Invite a user to a room for a reason" msgstr "" #: gajim/command_system/implementation/standard.py:295 #, fuzzy, python-format msgid "Invited %(jid)s to %(room_jid)s" msgstr "%(contact_jid)s zaprošany ŭ %(room_jid)s." #: gajim/command_system/implementation/standard.py:299 #, fuzzy msgid "Join a group chat given by a jid" msgstr "Dałučysia da _pakoju" #: gajim/command_system/implementation/standard.py:307 msgid "" "Leave the groupchat, optionally giving a reason, and close tab or window" msgstr "" #: gajim/command_system/implementation/standard.py:312 msgid "" "\n" " Ban user by a nick or a jid from a groupchat\n" "\n" " If given nickname is not found it will be treated as a jid.\n" " " msgstr "" #: gajim/command_system/implementation/standard.py:324 #, fuzzy msgid "Kick user by a nick from a groupchat" msgstr "Ty nie dałučyŭsia da pakoju." #: gajim/command_system/implementation/standard.py:332 msgid "" "Set occupant role in group chat.\n" " Role can be given as one of the following values:\n" " moderator, participant, visitor, none" msgstr "" #: gajim/command_system/implementation/standard.py:337 #, fuzzy msgid "Invalid role given" msgstr "Niapravilnaje imia karystalnika" #: gajim/command_system/implementation/standard.py:344 msgid "" "Set occupant affiliation in group chat.\n" " Affiliation can be given as one of the following values:\n" " owner, admin, member, outcast, none" msgstr "" #: gajim/command_system/implementation/standard.py:349 #, fuzzy msgid "Invalid affiliation given" msgstr "Suviaź: " #: gajim/command_system/implementation/standard.py:357 #, fuzzy msgid "Display names of all group chat occupants" msgstr "Užyvańnie: /%s, pakazvaje imiony naviednikaŭ pakoju." #: gajim/command_system/implementation/standard.py:379 msgid "Forbid an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/standard.py:384 msgid "Allow an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/middleware.py:72 msgid "Error during command execution!" msgstr "" #: gajim/command_system/implementation/custom.py:106 msgid "The same as using a doc-string, except it supports translation" msgstr "" #: gajim/plugins/pluginmanager.py:611 gajim/plugins/pluginmanager.py:617 msgid "Archive corrupted" msgstr "" #: gajim/plugins/pluginmanager.py:613 #, fuzzy msgid "Archive empty" msgstr "Ściežka da fajłu" #: gajim/plugins/pluginmanager.py:625 gajim/plugins/pluginmanager.py:633 #: gajim/plugins/gui.py:264 msgid "Archive is malformed" msgstr "" #: gajim/plugins/pluginmanager.py:641 gajim/plugins/gui.py:288 #: gajim/plugins/gui.py:296 #, fuzzy msgid "Plugin already exists" msgstr "Hety fajł užo isnuje" #: gajim/plugins/gui.py:84 msgid "Plugin" msgstr "" #: gajim/plugins/gui.py:156 #, fuzzy, python-format msgid "Warning: %s" msgstr "Blakavańnie %s" #: gajim/plugins/gui.py:213 #, fuzzy msgid "Plugin failed" msgstr "Niemahvyma dałučycca" #: gajim/plugins/gui.py:256 msgid "Unable to properly remove the plugin" msgstr "" #: gajim/plugins/gui.py:288 msgid "Overwrite?" msgstr "" #: gajim/plugins/gui.py:320 #, fuzzy msgid "Configuration" msgstr "Kanfihuracyja pakoju" #: data/org.gajim.Gajim.desktop.in:5 msgid "Jabber IM Client" msgstr "Klijent kamunikacyi dla Jabber" #: data/org.gajim.Gajim.desktop.in:6 data/org.gajim.Gajim.appdata.xml.in:10 msgid "A GTK+ Jabber client" msgstr "Klijent Jabber dla GTK+" #: data/org.gajim.Gajim.desktop.in:8 msgid "chat;messaging;im;xmpp;bonjour;voip;" msgstr "" #: data/org.gajim.Gajim.desktop.in:12 msgid "org.gajim.Gajim" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:12 msgid "" "Gajim is a chat client to be used with Jabber.org, Live Journal Talk, " "Nimbuzz, Ovi, Talkonaut, and thousands of other services run by companies " "and ISPs, and volunteers around the world." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:16 msgid "" "If you have a few accounts on different servers, if you want to be in " "contact with your friends and family all the time, then Gajim is for you." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:19 #, fuzzy msgid "Features:" msgstr "Zdolnaści serveraŭ" #: data/org.gajim.Gajim.appdata.xml.in:21 msgid "Tabbed chat window and single window modes" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:22 msgid "" "Group chat support (with Multi-User Chat protocol), invitation, chat to " "group chat transformation" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:23 msgid "Emoticons, avatars, PEP (user activity, mood and tune)" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:24 msgid "Audio / video conferences" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:25 #, fuzzy msgid "File transfer, room bookmarks" msgstr "Pamyłka pieradačy fajłu" #: data/org.gajim.Gajim.appdata.xml.in:26 msgid "Metacontacts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:27 msgid "Trayicon, speller, extended chat history functionalities" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:28 msgid "TLS, GPG and End-To-End encryption support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:29 msgid "Transport registration support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:30 #, fuzzy msgid "Service discovery including nodes, user search" msgstr "Prahlad servisaŭ dla kontu %s" #: data/org.gajim.Gajim.appdata.xml.in:31 msgid "Wikipedia, dictionary and search engine lookup" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:32 msgid "Multiple accounts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:33 #, fuzzy msgid "XML console interface" msgstr "Kansol XML" #: data/org.gajim.Gajim.appdata.xml.in:34 msgid "Link local (bonjour / zeroconf), BOSH" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:35 msgid "Other features via plugins" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:47 #, fuzzy msgid "Roster, list of contacts" msgstr "_Zachoŭvać u žurnale źmieny statusu kantaktaŭ" #: data/org.gajim.Gajim.appdata.xml.in:51 msgid "Tabbed chat window" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:55 #, fuzzy msgid "Group chat support" msgstr "Pakoji" #: data/org.gajim.Gajim.appdata.xml.in:59 #, fuzzy msgid "Chat history" msgstr "Niadaŭna:" #: data/org.gajim.Gajim.appdata.xml.in:63 #, fuzzy msgid "Plugin manager" msgstr "Niemahvyma dałučycca" #, fuzzy #~ msgid "" #~ "Install /\n" #~ "Upgrade" #~ msgstr "Zatrymana" #, fuzzy #~ msgid "Install/Upgrade" #~ msgstr "Zatrymana" #, fuzzy #~ msgid "Install and Upgrade Plugins" #~ msgstr "Zatrymana" #, fuzzy #~ msgid "Plugins updates" #~ msgstr "Niemahvyma dałučycca" #, fuzzy #~ msgid "Security error during download" #~ msgstr "Niemahčyma złučycca z \"%s\"" #, fuzzy #~ msgid "Error in download" #~ msgstr "Niemahčyma złučycca z \"%s\"" #~ msgid "Shows or hides the roster window" #~ msgstr "Pakazvaje / chavaje śpis kantaktaŭ" #, fuzzy #~ msgid "Shows or hides the ipython window" #~ msgstr "Pakazvaje / chavaje śpis kantaktaŭ" #, fuzzy #~ msgid "XMPP account %s" #~ msgstr "kontu %s" #, fuzzy #~ msgid "Exception" #~ msgstr "Apisańnie" #, fuzzy #~ msgid "" #~ "someone@somewhere.com would like you to add some contacts " #~ "in your roster." #~ msgstr "Ja chaču dadać Vas u svoj śpis kantaktaŭ." #~ msgid "_Actions" #~ msgstr "_Dziejańni" #, fuzzy #~ msgid "Start Chat..." #~ msgstr "_Pačni razmovu" #~ msgid "You are already in group chat %s" #~ msgstr "Užo ŭdzielničaješ u razmovie ŭ pakoji %s" #~ msgid "Join Group Chat with account %s" #~ msgstr "Dałučysia da pakoju dla kontu %s" #, fuzzy #~ msgid "Invalid Account" #~ msgstr "Niapravilnaja nazva kontu" #, fuzzy #~ msgid "" #~ "You have to choose an account from which you want to join the groupchat." #~ msgstr "Treba stvaryć kont, kab razmaŭlać ź inšymi kantaktami." #, fuzzy #~ msgid "Please enter the group chat JID as room@server." #~ msgstr "JID pakoju ŭtrymlivaje niedazvolenyja znaki." #, fuzzy #~ msgid "The group chat JID contains invalid characters." #~ msgstr "JID pakoju ŭtrymlivaje niedazvolenyja znaki." #~ msgid "Start Chat with account %s" #~ msgstr "Pačni razmovu dla kontu %s" #, fuzzy #~ msgid "" #~ "Fill in the nickname or the JID of the contact you would like\n" #~ "to send a chat message to:" #~ msgstr "" #~ "Vyznač mianušku albo JID kantakta, jakomu chočaš dasłać\n" #~ "paviedamleńnie:" #, fuzzy #~ msgid "Nickname / JID" #~ msgstr "Taki JID užo vykarystoŭvajecca" #~ msgid "Unable to parse \"%s\"." #~ msgstr "Niemahčyma razabrać \"%s\"." #~ msgid "Shows the chat dialog so that you can send messages to a contact" #~ msgstr "Pakazvaje akno razmovy, kab dasyłać paviedamleńni kantaktu" #~ msgid "JID of the contact that you want to chat with" #~ msgstr "JID kantaktu, ź jakim chočaš parazmaŭlać" #~ msgid "Adds contact to roster" #~ msgstr "Dadaje kantakt u śpis kantaktaŭ" #~ msgid "jid" #~ msgstr "jid" #~ msgid "Adds new contact to this account" #~ msgstr "Dadaje novy kantakt dla hetaha kontu" #~ msgid "Opens 'Start Chat' dialog" #~ msgstr "Adčyniaje akno 'Pačni razmovu'" #~ msgid "Starts chat, using this account" #~ msgstr "Pačynaje razmovu dla hetaha kontu" #, fuzzy #~ msgid "Handle a xmpp:/ URI" #~ msgstr "Absłuhoŭvaj spasyłki xmpp:/" #, fuzzy #~ msgid "Message content" #~ msgstr "źmiest paviedamleńnia" #~ msgid "Join a MUC room" #~ msgstr "Dałučysia da pakoju" #, fuzzy #~ msgid "Room JID" #~ msgstr "Pakoj:" #, fuzzy #~ msgid "Nickname to use" #~ msgstr "Mianuška nia znojdziena: %s" #, fuzzy #~ msgid "Password to enter the room" #~ msgstr "Paroli roźniacca" #, fuzzy #~ msgid "Wrong URI" #~ msgstr "Niapravilnaja spasyłka" #~ msgid "Nickname:" #~ msgstr "Mianuška:" #~ msgid "Server:" #~ msgstr "Server:" #~ msgid "Password:" #~ msgstr "Parol:" #, fuzzy #~ msgid "Join this room _automatically when I connect" #~ msgstr "Dałučajsia da hetaha pakoju aŭtamatyčna pry kožnym złučeńni" #, fuzzy #~ msgid "Bro_wse Rooms" #~ msgstr "_Prahladaj" #, fuzzy #~ msgid "Network-Watcher" #~ msgstr "Kiraŭnik žurnałaŭ" #, fuzzy #~ msgid "Requires gnome-network-manager" #~ msgstr "Kiraŭnik žurnałaŭ" #, fuzzy #~ msgid "Feature not available, see Help->Features" #~ msgstr "Aŭtamatyčnaje paviedamleńnie statusu \"Niedastupny\"" #, fuzzy #~ msgid "Send files" #~ msgstr "Vyšli _fajł" #, fuzzy #~ msgid "This contact does not support file transfer." #~ msgstr "Śpis dziejnych, skončanych i spynienych pieradačaŭ fajłaŭ" #~ msgid "" #~ "You have to install %s dictionary to use spellchecking, or choose another " #~ "language by setting the speller_language option." #~ msgstr "" #~ "Treba zainstalavać słoŭnik %s, kab praviarać pravapis, albo abrać inšuju " #~ "movu ŭ opcyi speller_language." #, fuzzy #~ msgid "Hides the buttons in chat windows." #~ msgstr "Chavaje knopki ŭ aknie pakoju." #, fuzzy #~ msgid "Change your nickname (Ctrl+N)" #~ msgstr "Źmiani _mianušku" #, fuzzy #~ msgid "Bookmark this room (Ctrl+B)" #~ msgstr "_Stvary zakładku dla hetaja pakoju" #, fuzzy #~ msgid "Show advanced functions (Alt+D)" #~ msgstr "Klikni, kab ustavić smajlik (Alt+M)" #, fuzzy #~ msgid "Add this contact to roster (Ctrl+D)" #~ msgstr "Dadaje kantakt u śpis kantaktaŭ" #, fuzzy #~ msgid "Invite contacts to the conversation (Ctrl+G)" #~ msgstr "sočyć za razmovaj" #, fuzzy #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Dadaje kantakt u śpis kantaktaŭ" #, fuzzy #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Dadaje kantakt u śpis kantaktaŭ" #, fuzzy #~ msgid "Ma_ke message windows compact" #~ msgstr "_Hrupuj vokny:" #, fuzzy #~ msgid "Hide all buttons in chat windows" #~ msgstr "Chavaje knopki ŭ aknie pakoju." #, fuzzy #~ msgid "Hide the chat buttons" #~ msgstr "Užyvańnie: /%s, chavaje knopki razmovy." #~ msgid "" #~ "If True, Gajim will ask for avatar each contact that did not have an " #~ "avatar last time or has one cached that is too old." #~ msgstr "" #~ "Kali opcyja maje vartaść True, Gajim budzie pytać avatary ŭ kožnaha " #~ "kantaktu, jaki nia mieŭ avatara byłym razam, albo kali buferavany avatar " #~ "sastareje." #, fuzzy #~ msgid "?CLI:room" #~ msgstr "pakoj" #, fuzzy #~ msgid "?CLI:nick" #~ msgstr "mianuška" #, fuzzy #~ msgid "?CLI:password" #~ msgstr "parol" #~ msgid "Use D-Bus and Notification-Daemon to show notifications" #~ msgstr "Pakazvaj nahadvańni z dapamohaj DBus i Notification-Daemon" #, fuzzy #~ msgid "Notification" #~ msgstr "Madyfikacyja kontu" #, fuzzy #~ msgid "Ignore" #~ msgstr "dziaviataja" #~ msgid "_Open Gmail Inbox" #~ msgstr "_Adčyni poštu Gmail" #~ msgid "Notify on new _GMail email" #~ msgstr "Paviedamlaj mnie ab novych listach u skryni _Gmail" #, fuzzy #~ msgid "" #~ "If checked, Gajim will show a notification when a new e-mail is received " #~ "via GMail" #~ msgstr "" #~ "Kali ŭklučanaja hetaja opcyja, Gajim taksama budzie paviedamlać " #~ "dadatkovyja źviestki pra aŭtaraŭ novych listoŭ" #~ msgid "Display _extra email details" #~ msgstr "Pakazvaj dadatkovyja _padrabiaznaści ab emaiłu" #, fuzzy #~ msgid "" #~ "If checked, Gajim will also include information about the sender of new " #~ "emails" #~ msgstr "" #~ "Kali ŭklučanaja hetaja opcyja, Gajim taksama budzie paviedamlać " #~ "dadatkovyja źviestki pra aŭtaraŭ novych listoŭ" #~ msgid "GMail Options" #~ msgstr "Opcyi GMail" #, fuzzy #~ msgid "20" #~ msgstr "0" #, fuzzy #~ msgid "Invited %s to %s" #~ msgstr "Dašli %s" #~ msgid "GMail Email Received" #~ msgstr "Novy list na skryncy GMail" #, fuzzy #~ msgid "New e-mail on %(gmail_mail_address)s" #~ msgstr "Novaja pošta ŭ skryncy %(gmail_mail_address)s" #, fuzzy #~ msgid "You have %d new e-mail conversation" #~ msgid_plural "You have %d new e-mail conversations" #~ msgstr[0] "%d novy list" #~ msgstr[1] "%d novyja listy" #~ msgstr[2] "%d novych listoŭ" #~ msgid "Re_name" #~ msgstr "_Źmiani nazvu" #~ msgid "Resour_ce:" #~ msgstr "_Krynica:" #~ msgid "" #~ "Resource is sent to the Jabber server in order to separate the same JID " #~ "in two or more parts depending on the number of the clients connected in " #~ "the same server with the same account. So you might be connected in the " #~ "same account with resource 'Home' and 'Work' at the same time. The " #~ "resource which has the highest priority will get the events. (see below)" #~ msgstr "" #~ "Nazva krynicy paviedamlajecca serveru, kab toj moh adroźnić niekalki " #~ "prahram, dałučanych da adnaho kontu. Tak ty možaš dałučycca da adnaho " #~ "kontu i z domu, i z pracy. Paviedamleńni buduć skiroŭvacca na krynicu z " #~ "najvyšejšym pryjarytetam. (hladzi nižej)" #, fuzzy #~ msgid "A_djust to status" #~ msgstr "_Dastasuj da statusu" #~ msgid "Priority will change automatically according to your status." #~ msgstr "Źmianiaj pryjarytet aŭtamatyčna zhodna z statusam." #, fuzzy #~ msgid "Anonymous authentication" #~ msgstr "Užyvaj aŭtaryzacyju" #~ msgid "" #~ "Priority is used in Jabber to determine who gets the events from the " #~ "jabber server when two or more clients are connected using the same " #~ "account; The client with the highest priority gets the events" #~ msgstr "" #~ "Pryjarytet vyznačaje, jakaja prahrama atrymvaje paviedamleńni z servera, " #~ "kali niekalki prahram dałučanyja praz adzin kont. Prahrama z najvyšejšym " #~ "pryjarytetam budzie atrymvać paviedamleńni" #, fuzzy #~ msgid "Synchronize contacts" #~ msgstr "Pakažy _adłučanyja kantakty" #~ msgid "Chan_ge Password" #~ msgstr "Ź_miani parol" #~ msgid "Click to change account's password" #~ msgstr "Klikni, kab źmianić parol dla kontu" #, fuzzy #~ msgid "Administration operations" #~ msgstr "Śpis administrataraŭ" #, fuzzy #~ msgid "Browse..." #~ msgstr "_Prahladaj" #, fuzzy #~ msgid "Certificate is e_ncrypted" #~ msgstr "[Hetaje paviedamleńnie zašyfravanaje]" #~ msgid "" #~ "If checked, Gajim, when launched, will automatically connect to jabber " #~ "using this account" #~ msgstr "" #~ "Kali ŭklučanaja hetaja opcyja, Gajim budzie aŭtamatyčna dałučacca da " #~ "servera praz hety kont" #, fuzzy #~ msgid "Synchronize logs with server" #~ msgstr "Pakažy _adłučanyja kantakty" #~ msgid "Synch_ronize account status with global status" #~ msgstr "_Synchranizuj status kontu z glabalnym statusam" #~ msgid "" #~ "If checked, any change to the global status (handled by the combobox at " #~ "the bottom of the roster window) will change the status of this account " #~ "accordingly" #~ msgstr "" #~ "Kali ŭklučanaja hetaja opcyja, to źmieny glabalnaha statusu (z menu " #~ "ŭnizie śpisu kantaktaŭ) buduć upłyvać na status hetaha kontu" #~ msgid "" #~ "If checked, Gajim will also broadcast some more IPs except from just your " #~ "IP, so file transfer has higher chances of working." #~ msgstr "" #~ "Kali ŭklučanaja hetaja opcyja, Gajim zojmie dadatkovyja adrasy IP, kab " #~ "pieradača fajłaŭ było šparčejšym." #, fuzzy #~ msgid "Proxy" #~ msgstr "Ułaścivaści" #, fuzzy #~ msgid "Send _keep-alive packets" #~ msgstr "Dasyłaj pravieračnyja infarmacyjnyja pakiety" #~ msgid "" #~ "If checked, Gajim will send keep-alive packets to prevent connection " #~ "timeout which results in disconnection" #~ msgstr "" #~ "Kali ŭklučanaja hetaja opcyja, Gajim budzie dasyłać infarmacyjnyja " #~ "pakiety dziela zapeŭnivańnia servera ŭ tym, što złučeńnie " #~ "vykarystoŭvajecca" #, fuzzy #~ msgid "Use cust_om hostname/port" #~ msgstr "Skarystaj admysłovy host/port" #, fuzzy #~ msgid "_Hostname: " #~ msgstr "Nazva hosta: " #, fuzzy #~ msgid "_Port: " #~ msgstr "_Port:" #~ msgid "No key selected" #~ msgstr "Kluč nie abrany" #~ msgid "Choose _Key..." #~ msgstr "Abiary _kluč..." #, fuzzy #~ msgid "" #~ "If checked, Gajim will get the password from a GPG agent like seahorse" #~ msgstr "" #~ "Kali ŭklučanaja hetaja opcyja, Gajim zapomnić parol dla hetaha kontu" #~ msgid "OpenPGP" #~ msgstr "OpenPGP" #, fuzzy #~ msgid "_Edit Personal Information..." #~ msgstr "Źmiani asabistyja źviestki..." #~ msgid "Information about you, as stored in the server" #~ msgstr "Źviestki pra ciabie, jakija zachoŭvajucca na servery" #~ msgid "Personal Information" #~ msgstr "Asabistyja źviestki" #, fuzzy #~ msgid "Co_nnect on Gajim startup" #~ msgstr "_Zlučajsia pry starcie Gajim" #, fuzzy #~ msgid "Synchroni_ze account status with global status" #~ msgstr "_Synchranizuj status kontu z glabalnym statusam" #, fuzzy #~ msgid "Use cust_om port:" #~ msgstr "Užyvaj admysłovy port:" #~ msgid "" #~ "If the default port that is used for incoming messages is unfitting for " #~ "your setup you can select another one here.\n" #~ "You might consider to change possible firewall settings." #~ msgstr "" #~ "Kali zvyčajny port dla ŭvachodnych paviedamleńniaŭ nie pasuje, možaš " #~ "vybrać inšy.\n" #~ "Taksama moža spatrebicca źmianić nałady firewalla." #~ msgid "Mer_ge accounts" #~ msgstr "_Źlej konty ŭ adno" #, fuzzy #~ msgid "OpenPGP is not usable on this computer" #~ msgstr "Nielha vykarystać OpenPGP na hetym kamputary" #~ msgid "To change the account name, you must be disconnected." #~ msgstr "Kab źmianić nazvu kontu, treba pieradałučycca." #~ msgid "To change the account name, you must read all pending events." #~ msgstr "Kab źmianić nazvu kontu, treba pračytać usie novyja paviedamleńni." #~ msgid "Account Name Already Used" #~ msgstr "Taki kont užo zaniaty" #~ msgid "" #~ "This name is already used by another of your accounts. Please choose " #~ "another name." #~ msgstr "Kont z takoj nazvaj užo zaniaty. Kali łaska, abiary inšuju nazvu." #~ msgid "Invalid account name" #~ msgstr "Niapravilnaja nazva kontu" #~ msgid "Account name cannot be empty." #~ msgstr "Nazva kontu nia moža być pustoj." #~ msgid "Account name cannot contain spaces." #~ msgstr "Nazva kontu nia moža ŭtrymlivać prabiełaŭ." #, fuzzy #~ msgid "Enter a new name for account %s" #~ msgstr "Vyznač novuju nazvu dla hrupy %s" #, fuzzy #~ msgid "A JID must be in the form \"user@servername\"." #~ msgstr "JID musić mieć formu \"user@servername\"." #~ msgid "No such account available" #~ msgstr "Takoha kontu niama" #~ msgid "" #~ "You must create your account before editing your personal information." #~ msgstr "Treba stvaryć kont, kab redahavać asabistyja źviestki." #~ msgid "Without a connection, you can not edit your personal information." #~ msgstr "" #~ "Nie złučyŭšysia z serveram, niemahčyma źmianiać asabistyja źviestki." #, fuzzy #~ msgid "Your server does not have vCard support" #~ msgstr "Server nie padtrymvaje Vcard" #~ msgid "Your server can't save your personal information." #~ msgstr "Server nia moža zachoŭvać asabistyja źviestki." #~ msgid "Account Local already exists." #~ msgstr "Kont Local užo isnuje." #~ msgid "Please rename or remove it before enabling link-local messaging." #~ msgstr "" #~ "Kali łaska, źmiani nazvu albo vydal jaho pierad uklučeńniem miascovych " #~ "paviedamleńniaŭ." #~ msgid "THANKS:" #~ msgstr "PADZIAKI:" #~ msgid "Could not write to %s. Session Management support will not work" #~ msgstr "Niemahčyma zapisać u %s. Kiravańnie sesijami nia budzie dziejničać" #~ msgid "Jabber Traffic" #~ msgstr "Trafik Jabber" #, fuzzy #~ msgid "_Enable" #~ msgstr "Ukluč" #, fuzzy #~ msgid "Filter" #~ msgstr "Huki" #~ msgid "_IQ" #~ msgstr "_IQ" #~ msgid "Info/Query" #~ msgstr "Źviestki/Apytańnie (Info/Query)" #~ msgid "_Message" #~ msgstr "_Paviedamleńnie" #~ msgid "XML Input" #~ msgstr "Uvod XML" #~ msgid "XML Console for %s" #~ msgstr "Kansol XML dla %s" #, fuzzy #~ msgid "Idle for:" #~ msgstr "Kansol XML dla %s" #~ msgid "Last status: %s" #~ msgstr "Apošni status: %s" #~ msgid " since %s" #~ msgstr " ad %s" #~ msgid "since %s" #~ msgstr "ad %s" #, fuzzy #~ msgid "No" #~ msgstr "Nijaki" #, fuzzy #~ msgid "Prefer" #~ msgstr "Nałady" #, fuzzy #~ msgid "Auto" #~ msgstr "Aŭtamatyčna dałučajsia" #, fuzzy #~ msgid "otr" #~ msgstr "_Host:" #, fuzzy #~ msgid "Invalid expire value" #~ msgstr "Niapravilnaje imia karystalnika" #~ msgid "How many minutes should last lines from previous conversation last." #~ msgstr "" #~ "Kolki chvilinaŭ z apošniaj razmovy zapaminać i pakazvać u znoŭ adčynienym " #~ "aknie." #~ msgid "You will be connected to %s without OpenPGP." #~ msgstr "Ty dałučyśsia da %s biaz OpenPGP." #, fuzzy #~ msgid "The following message was NOT encrypted" #~ msgstr "[Hetaje paviedamleńnie zašyfravanaje]" #, fuzzy #~ msgid "Encryption used for this contact." #~ msgstr "Ci vykarystoŭvajecca šyfravańnie OpenPGP dla hetaha kantaktu?" #~ msgid "Toggle Open_PGP Encryption" #~ msgstr "Uklučy/Adklučy šyfravańnie Open_PGP" #, fuzzy #~ msgid "Toggle End to End Encryption" #~ msgstr "Uklučy/Adklučy šyfravańnie Open_PGP" #, fuzzy #~ msgid "OpenPGP encryption enabled" #~ msgstr "Šyfravańnie ŭklučanaje" #, fuzzy #~ msgid "OpenPGP encryption disabled" #~ msgstr "Šyfravańnie adklučanaje" #, fuzzy #~ msgid "The following message was encrypted" #~ msgstr "[Hetaje paviedamleńnie zašyfravanaje]" #, fuzzy #~ msgid "Toggle the OpenPGP encryption" #~ msgstr "Uklučy/Adklučy šyfravańnie Open_PGP" #, fuzzy #~ msgid "[This message is *encrypted* (See :XEP:`27`]" #~ msgstr "[Hetaje paviedamleńnie *zašyfravanaje* (Hladzi :JEP:`27`]" #~ msgid "" #~ "If True, listen to D-Bus signals from NetworkManager and change the " #~ "status of accounts (provided they do not have listen_to_network_manager " #~ "set to False and they sync with global status) based upon the status of " #~ "the network connection." #~ msgstr "" #~ "Kali hetaja opcyja maje vartaść True, čakaj syhnałaŭ D-Bus ad " #~ "NetworkManager i źmianiaj status kontaŭ (dla jakich opcyja " #~ "listen_to_network_manager nia maje vartaści False i jakija " #~ "synchranizujucca z hlabalnym stanam) zhodna statusu sietkavaha złučeńnia." #, fuzzy #~ msgid "Database cannot be read." #~ msgstr "Nazva kontu nia moža być pustoj." #, fuzzy #~ msgid "Smooth scroll message in conversation window" #~ msgstr "Dašli paviedamleńnie i začyni akno" #~ msgid "Show _XML Console" #~ msgstr "Pakažy _kansol XML" #, fuzzy #~ msgid "Edit _Privacy Lists..." #~ msgstr "_Śpisy pryvatnaści" #~ msgid "_Administrator" #~ msgstr "_Administratar" #~ msgid "Sends a message to users currently connected to this server" #~ msgstr "Dašli paviedamleńnie karystalnikam, dałučanym da servera" #~ msgid "Sets Message of the Day" #~ msgstr "Vyznač paviedamleńnie dniu" #~ msgid "Updates Message of the Day" #~ msgstr "Aktualizuj paviedamleńnie dniu" #~ msgid "Deletes Message of the Day" #~ msgstr "Vydal paviedamleńnie dniu" #, fuzzy #~ msgid "Add _Contact..." #~ msgstr "_Dadaj kantakt..." #, fuzzy #~ msgid "_Accounts" #~ msgstr "Konty" #~ msgid "Profile, A_vatar" #~ msgstr "Profil, a_vatar" #~ msgid "File _Transfers" #~ msgstr "Pieradačy _fajłaŭ" #~ msgid "Help online" #~ msgstr "Dapamoha online" #~ msgid "Frequently Asked Questions (online)" #~ msgstr "Častyja pytańni (online)" #, fuzzy #~ msgid "Fea_tures" #~ msgstr "Zdolnaści serveraŭ" #~ msgid "to %s account" #~ msgstr "da kontu %s" #~ msgid "using %s account" #~ msgstr "praz kont %s" #~ msgid "of account %s" #~ msgstr "kontu %s" #~ msgid "for account %s" #~ msgstr "dla kontu %s" #~ msgid "" #~ "By removing this contact you also remove authorization resulting in him " #~ "or her always seeing you as offline." #~ msgstr "" #~ "Vydaliŭšy hety kantakt, ty taksama anuluješ jahonuju aŭtaryzacyju. U " #~ "vyniku jon zaŭsiody budzie bačyć ciabie adłučanym." #~ msgid "Invalid Jabber ID" #~ msgstr "Niapravilny JID" #~ msgid "This file is being used by another process." #~ msgstr "Hety fajł vykarystoŭvajecca inšym pracesam." #~ msgid "pgp key" #~ msgstr "kluč pgp" #~ msgid "" #~ "Sends new single message to a contact in the roster. Both OpenPGP key and " #~ "account are optional. If you want to set only 'account', without 'OpenPGP " #~ "key', just set 'OpenPGP key' to ''." #~ msgstr "" #~ "Dasyłaje novaje asobnaje paviedamleńnie kantaktu sa śpisu kantaktaŭ. Kluč " #~ "OpenPGP i kont nie abaviazkovyja dla akreśleńnia. Kali chočaš akreślić " #~ "tolki 'kont', biez 'kluča OpenPGP', tady prosta akreśli 'kluč OpenPGP' " #~ "jak ''." #, fuzzy #~ msgid "Please first choose another theme as your current theme." #~ msgstr "Kali łaska, zadziejničaj spačatku inšuju temu." #~ msgid "Your passphrase is incorrect" #~ msgstr "Parol niapravilny" #, fuzzy #~ msgid "OpenPGP Passphrase Incorrect" #~ msgstr "Parol niapravilny" #~ msgid "You successfully received %(filename)s from %(name)s." #~ msgstr "Atrymany fajł %(filename)s ad %(name)s." #, fuzzy #~ msgid "Set logs directory" #~ msgstr "stvarajecca kataloh %s" #~ msgid "Chats" #~ msgstr "Razmovy" #~ msgid "_Manage Bookmarks..." #~ msgstr "_Kiruj zakładkami..." #~ msgid "Change Status Message..." #~ msgstr "Źmiani paviedamleńnie statusu..." #~ msgid "_Change Status Message..." #~ msgstr "Ź_miani paviedamleńnie statusu..." #~ msgid "" #~ "You are not interested in the contact's presence, and neither he/she is " #~ "interested in yours" #~ msgstr "Ty i hety kantakt nie cikaviciesia statusam adno adnaho" #~ msgid "Error description..." #~ msgstr "Apisańnie pamyłki..." #, fuzzy #~ msgid "View contact information (Ctrl+I)" #~ msgstr "sočyć za razmovaj" #, fuzzy #~ msgid "Groupchat Histories" #~ msgstr "Pakoji" #, fuzzy #~ msgid "All Chat Histories" #~ msgstr "Старыя казкі" #~ msgid "More" #~ msgstr "Bolš" #~ msgid "creating %s directory" #~ msgstr "stvarajecca kataloh %s" #, fuzzy #~ msgid "" #~ "If True, Gajim will use KDE Wallet (if kwalletcli is available) to store " #~ "account passwords." #~ msgstr "" #~ "Kali opcyja maje vartaść True, Gajim budzie zachoŭvać paroli z dapamohaj " #~ "Kiraŭnika parolaŭ GNOME (kali jość mahčymaść)." #, fuzzy #~ msgid "Please check if avahi/bonjour-daemon is running." #~ msgstr "Kali łaska, pravier, ci pracuje avahi-daemon." #~ msgid "%s is not the name of a group chat." #~ msgstr "Naźvie %s nie adpaviadaje nivodny pakoj." #, fuzzy #~ msgid "Session Management" #~ msgstr "Paviedamleńnie dasłanaje" #~ msgid "Gajim needs X server to run. Quiting..." #~ msgstr "Gajimu patrebny X-server. Vychad..." #, fuzzy #~ msgid "Gajim needs PyGTK 2.22 or above" #~ msgstr "Gajimu treba PyGTK 2.6 albo paźniejšaj versii" #, fuzzy #~ msgid "Gajim needs PyGTK 2.22 or above to run. Quiting..." #~ msgstr "Gajimu treba PyGTK 2.6 albo paźniejšaj versii. Vychad..." #, fuzzy #~ msgid "Gajim needs GTK 2.22 or above" #~ msgstr "Gajimu treba GTK 2.6 albo paźniejšaj versii" #, fuzzy #~ msgid "Gajim needs GTK 2.22 or above to run. Quiting..." #~ msgstr "Gajimu treba GTK 2.6 albo paźniejšaj versii. Vychad..." #~ msgid "Gajim needs pywin32 to run" #~ msgstr "Gajimu treba pywin32" #~ msgid "" #~ "Please make sure that Pywin32 is installed on your system. You can get it " #~ "at %s" #~ msgstr "" #~ "kali łaska, pravier, ci instalavanaja biblijateka Pywin32. Jaje možna " #~ "ściahnuć z %s" #~ msgid "Gajim is already running" #~ msgstr "Gajim užo vykonvajecca" #~ msgid "" #~ "Another instance of Gajim seems to be running\n" #~ "Run anyway?" #~ msgstr "" #~ "Gajim užo vykonvajecca\n" #~ "Usio adno ŭruchomić?" #~ msgid "A programming error has been detected" #~ msgstr "Znojdziena pamyłka prahramistaŭ" #~ msgid "Details" #~ msgstr "Padrabiaznaści" #, fuzzy #~ msgid "" #~ "Gnome Keyring is installed but not correctly started (environment " #~ "variable probably not correctly set)" #~ msgstr "" #~ "Kiraŭnik parolaŭ GNOME instalavany, ale niapravilna vykonvajecca " #~ "(mahčyma, źmiennaja asiarodździa niapravilna akreślenaja)" #~ msgid "Jabber ID: " #~ msgstr "JID:" #~ msgid "Resource: " #~ msgstr "Krynica: " #~ msgid "Subscription: " #~ msgstr "Aŭtaryzacyja: " #, fuzzy #~ msgid "Mood: " #~ msgstr "Pakoj:" #, fuzzy #~ msgid "Activity: " #~ msgstr "Dziejny" #, fuzzy #~ msgid "Join _Group Chat..." #~ msgstr "Dałučysia da _pakoju" #, fuzzy #~ msgid "_Modify Account" #~ msgstr "Madyfikuj kont" #, fuzzy #~ msgid "Check on startup if Gajim is the _default Jabber client" #~ msgstr "" #~ "Zaŭsiody pry starcie praviaraj, ci pryznačany Gajim _zmoŭčanym klijentam " #~ "Jabber" #~ msgid "_Group Chat" #~ msgstr "_Pakoj" #~ msgid "" #~ "If True, Gajim will check if it's the default jabber client on each " #~ "startup." #~ msgstr "" #~ "Kali opcyja maje vartaść True, Gajim budzie praviarać, ci akreśleny jon " #~ "jak zmoŭčany klijent Jabber." #~ msgid "Gajim is not the default Jabber client" #~ msgstr "Gajim nie akreśleny jak zmoŭčany klijent Jabber" #~ msgid "Would you like to make Gajim the default Jabber client?" #~ msgstr "Chočaš zrabić Gajim zmoŭčanym klijentam Jabber?" #~ msgid "Always check to see if Gajim is the default Jabber client on startup" #~ msgstr "Zaŭsiody praviaraj, ci akreśleny Gajim jak zmoŭčany klijent Jabber" #, fuzzy #~ msgid "Send Single Message" #~ msgstr "_Dašli asobnaje paviedamleńnie" #~ msgid "Execute Command..." #~ msgstr "Vykanaj zahad..." #~ msgid " a window/tab opened with that contact " #~ msgstr " akno/kartka razmovy z hetym kantaktam adčynienaja " #~ msgid "Actions" #~ msgstr "Dziejańni" #~ msgid "Conditions" #~ msgstr "Umovy" #~ msgid "Advanced Actions" #~ msgstr "Admysłovyja dziejańni" #~ msgid "Advanced Notifications Control" #~ msgstr "Pašyranyja nałady nahadvańnia" #~ msgid "Busy " #~ msgstr "Zaniaty" #, fuzzy #~ msgid "Contact Change Status " #~ msgstr "Kantakt źmianiŭ status" #, fuzzy #~ msgid "Contact Disconnected " #~ msgstr "Kantakt adłučyŭsia" #~ msgid "Don't have " #~ msgstr "Razmaŭlaju " #, fuzzy #~ msgid "File Transfer Started " #~ msgstr "Pieradača fajłu spyniena" #, fuzzy #~ msgid "Group Chat Message Highlight " #~ msgstr "Padśviatleńnie paviedamleńnia ŭ pakoji" #, fuzzy #~ msgid "Group Chat Message Received " #~ msgstr "Novaje paviedamleńnie ŭ pakoji" #~ msgid "Launch a command" #~ msgstr "Vykanaj zahad" #~ msgid "One or more special statuses..." #~ msgstr "Adzin ci niekalki admysłovych statusaŭ..." #~ msgid "Online / Free For Chat" #~ msgstr "Dałučany / Achvotna parazmaŭlaju" #~ msgid "Play a sound" #~ msgstr "Ahuč" #~ msgid "When " #~ msgstr "Kali " #~ msgid "" #~ "_Activate window manager's UrgencyHint to make chat window in taskbar " #~ "flash" #~ msgstr "_Mirgaj vyjavaj na paneli zadańniaŭ" #~ msgid "_Disable auto opening chat window" #~ msgstr "_Nie adčyniaj aŭtamatyčna voknaŭ razmovy" #~ msgid "_Disable existing popup window" #~ msgstr "_Nie pakazvaj vypłyŭnych voknaŭ" #~ msgid "_Disable existing sound for this event" #~ msgstr "_Nie ahučvaj hetaj padzieji" #, fuzzy #~ msgid "_Disable showing event in notification area" #~ msgstr "_Nie pakazvać paviedamleńniaŭ u śpisie kantaktaŭ" #~ msgid "_Disable showing event in roster" #~ msgstr "_Nie pakazvać paviedamleńniaŭ u śpisie kantaktaŭ" #~ msgid "_Inform me with a popup window" #~ msgstr "_Paviedam mnie ŭ vypłyŭnym aknie" #~ msgid "_Open chat window with user" #~ msgstr "_Adčyni akno razmovy z karystalnikam" #~ msgid "_Show event in roster" #~ msgstr "_Pakazvaj padzieju ŭ śpisie kantaktaŭ" #~ msgid "and I " #~ msgstr "u časie, kali " #, fuzzy #~ msgid "contact(s)" #~ msgstr "Kantakty" #~ msgid "for " #~ msgstr "dla " #, fuzzy #~ msgid "group(s)" #~ msgstr "Hrupa" #~ msgid "when I'm in" #~ msgstr "kali maju " #~ msgid "_Allow him/her to see my status" #~ msgstr "Dazvol jamu/joj _bačyć moj status" #, fuzzy #~ msgid "Descrition:" #~ msgstr "Apisańnie: %s" #, fuzzy #~ msgid "Advanced..." #~ msgstr "Pašyranyja" #, fuzzy #~ msgid "Display _activity of contacts in roster" #~ msgstr "Pakazvaj a_vatary kantaktaŭ u śpisie kantaktaŭ" #, fuzzy #~ msgid "Display _tunes of contacts in roster" #~ msgstr "Pakazvaj a_vatary kantaktaŭ u śpisie kantaktaŭ" #, fuzzy #~ msgid "Display m_ood of contacts in roster" #~ msgstr "Pakazvaj a_vatary kantaktaŭ u śpisie kantaktaŭ" #, fuzzy #~ msgid "" #~ "If checked, Gajim will display the activity of contacts in the roster " #~ "window" #~ msgstr "" #~ "Kali ŭklučanaja hetaja opcyja, Gajim budzie pakazvać avatary kantaktaŭ u " #~ "śpisie kantaktaŭ i ŭ pakojach" #, fuzzy #~ msgid "" #~ "If checked, Gajim will display the location of contacts in the roster " #~ "window" #~ msgstr "" #~ "Kali ŭklučanaja hetaja opcyja, Gajim budzie pakazvać avatary kantaktaŭ u " #~ "śpisie kantaktaŭ i ŭ pakojach" #, fuzzy #~ msgid "" #~ "If checked, Gajim will display the tunes of contacts in the roster window" #~ msgstr "" #~ "Kali ŭklučanaja hetaja opcyja, Gajim budzie pakazvać avatary kantaktaŭ u " #~ "śpisie kantaktaŭ i ŭ pakojach" #, fuzzy #~ msgid "User avatar:" #~ msgstr "Avatar:" #~ msgid "Gajim Instant Messenger" #~ msgstr "Kamunikatar Gajim" #~ msgid "English" #~ msgstr "Anhielskaja" #~ msgid "Belarusian" #~ msgstr "Biełaruskaja" #~ msgid "Bulgarian" #~ msgstr "Baŭharskaja" #, fuzzy #~ msgid "Breton" #~ msgstr "Brytonskaja" #~ msgid "Czech" #~ msgstr "Českaja" #~ msgid "German" #~ msgstr "Niamieckaja" #~ msgid "Greek" #~ msgstr "Hreckaja" #~ msgid "British" #~ msgstr "Brytanskaja" #~ msgid "Esperanto" #~ msgstr "Esperanto" #~ msgid "Spanish" #~ msgstr "Hišpanskaja" #~ msgid "French" #~ msgstr "Francuzkaja" #~ msgid "Croatian" #~ msgstr "Charvackaja" #~ msgid "Italian" #~ msgstr "Italijskaja" #~ msgid "Norwegian (b)" #~ msgstr "Narveskaja (b)" #~ msgid "Dutch" #~ msgstr "Halandzkaja" #~ msgid "Norwegian" #~ msgstr "Narveskaja" #~ msgid "Polish" #~ msgstr "Polskaja" #~ msgid "Portuguese" #~ msgstr "Partuhalskaja" #~ msgid "Brazilian Portuguese" #~ msgstr "Brazilskaja partuhalskaja" #~ msgid "Russian" #~ msgstr "Rasiejskaja" #~ msgid "Serbian" #~ msgstr "Serbskaja" #~ msgid "Slovak" #~ msgstr "Słavackaja" #~ msgid "Swedish" #~ msgstr "Švedzkaja" #~ msgid "Chinese (Ch)" #~ msgstr "Kitajskaja (Ch)" #~ msgid "Spelling language" #~ msgstr "Mova spraŭdžvańnia pravapisu" #~ msgid "all or space separated status" #~ msgstr "\"all\" albo statusy, padzielenyja prabiełami" #~ msgid "'yes', 'no', or 'both'" #~ msgstr "'yes', 'no' albo 'both'" #~ msgid "'yes', 'no' or ''" #~ msgstr "'yes', 'no' albo ''" #~ msgid "Check your connection or try again later" #~ msgstr "Pravier złučeńnie albo paŭtary paźniej" #~ msgid "error: cannot open %s for reading" #~ msgstr "pamyłka: niemahčyma adčynić %s, kab adčytać" #~ msgid "Unable to bind to port %s." #~ msgstr "Niemahčyma dałučycca da portu %s." #~ msgid "" #~ "Maybe you have another running instance of Gajim. File Transfer will be " #~ "cancelled." #~ msgstr "" #~ "Mahčyma, inšaja kopija Gajim užo vykonvajecca. Pieradača fajłaŭ " #~ "anulavanaja." #~ msgid "A GTK+ jabber client" #~ msgstr "Jabber-klijent dla GTK+" #~ msgid "Condition" #~ msgstr "Umova" #~ msgid "when I am " #~ msgstr "kali maju " #, fuzzy #~ msgid "one of: offline, online, chat, away, xa, dnd, invisible " #~ msgstr "adno z: offline, online, chat, away, xa, dnd, invisible " #, fuzzy #~ msgid "" #~ "Returns current status message(the global one unless account is specified)" #~ msgstr "" #~ "Viartaje dziejnaje paviedamleńnie statusu (hlabalnaha, kali nie akreśleny " #~ "kont)" #~ msgid "" #~ "Usage: %s %s %s \n" #~ "\t %s" #~ msgstr "" #~ "Užyvańnie: %s %s %s \n" #~ "\t %s" #, fuzzy #~ msgid "" #~ "Too many arguments. \n" #~ "Type \"%s help %s\" for more info" #~ msgstr "" #~ "Nadta šmat arhumentaŭ. \n" #~ "Vykanaj \"%s help %s\" dla padrabiaźniejšych źviestak" #, fuzzy #~ msgid "" #~ "Argument \"%s\" is not specified. \n" #~ "Type \"%s help %s\" for more info" #~ msgstr "" #~ "Arhument \"%s\" nie akreśleny. \n" #~ "Vykanaj \"%s help %s\" dla padrabiaźniejšych źviestak" #~ msgid "Subject: %s" #~ msgstr "Tema: %s" #, fuzzy #~ msgid "Mood: %s" #~ msgstr "Pakoj:" #, fuzzy #~ msgid "Activity: %s" #~ msgstr "Dziejny" #~ msgid "_Disable showing event in systray" #~ msgstr "_Nie pakazvać padziejaŭ u poli nahadvańnia" #~ msgid "_Show event in systray" #~ msgstr "_Pakazvaj padzieju ŭ poli nahadvańnia" #, fuzzy #~ msgid "Autodetect on every Gajim startup" #~ msgstr "_Zlučajsia pry starcie Gajim" #, fuzzy #~ msgid "Show systray:" #~ msgstr "_Pakazvaj padzieju ŭ poli nahadvańnia" #~ msgid "Nickname not allowed: %s" #~ msgstr "Mianuška nie dazvolenaja: %s" #~ msgid "we are now subscribed to %s" #~ msgstr "padpisany na %s" #~ msgid "we are now unsubscribed from %s" #~ msgstr "ciapier adpisany ad %s" #~ msgid "Account Modification" #~ msgstr "Madyfikacyja kontu" #~ msgid "" #~ "Check this so Gajim will connect in port 5223 where legacy servers are " #~ "expected to have SSL capabilities. Note that Gajim uses TLS encryption by " #~ "default if broadcasted by the server, and with this option enabled TLS " #~ "will be disabled" #~ msgstr "" #~ "Paznač hetuju opcyju, kali chočaš, kab Gajim złučaŭsia z serveram praz " #~ "port 5223, praź jaki staryja servery dajuć mažlivaść vykarystańnia SSL. " #~ "Zvažaj: Gajim zvyčajna vykarystoŭvaje šyfravańnie TLS, kali źviartajecca " #~ "da servera, a hetaja opcyja adklučaje vykarystańnie TLS" #~ msgid "Edit Personal Information..." #~ msgstr "Źmiani asabistyja źviestki..." #~ msgid "Hostname: " #~ msgstr "Nazva hosta: " #~ msgid "" #~ "If checked, Gajim will store the password in ~/.gajim/config with 'read' " #~ "permission only for you" #~ msgstr "" #~ "Kali ŭklučanaja hetaja opcyja, Gajim budzie zachoŭvać parol u fajle ~/." #~ "gajim/config z pravami na čytańnie tolki dla ciabie" #~ msgid "Port: " #~ msgstr "Port: " #~ msgid "Save _passphrase (insecure)" #~ msgstr "Zachavaj _parol (niebiaśpiečna)" #~ msgid "Use _SSL (legacy)" #~ msgstr "Skarystaj _SSL (zastarełaja opcyja)" #~ msgid "" #~ "Receive a Message\n" #~ "Contact Disconnected \n" #~ "Contact Change Status \n" #~ "Group Chat Message Highlight \n" #~ "Group Chat Message Received \n" #~ "File Transfer Request \n" #~ "File Transfer Started \n" #~ "File Transfer Finished" #~ msgstr "" #~ "Atrymaŭ paviedamleńnie\n" #~ "Kantakt adłučyŭsia \n" #~ "Kantakt źmianiŭ status \n" #~ "Padśvietlenaje paviedamleńnie ŭ hrupavoj razmovie \n" #~ "Atrymaŭ hrupavoje paviedamleńnie \n" #~ "Zapyt na pieradaču fajłu \n" #~ "Pieradača fajłu pačałosia \n" #~ "Pieradača fajłu skončyłasia" #~ msgid "" #~ "contact(s)\n" #~ "group(s)\n" #~ "everybody" #~ msgstr "" #~ "kantakt(y)\n" #~ "hrupa(y)\n" #~ "kožny" #~ msgid "" #~ "Account row\n" #~ "Group row\n" #~ "Contact row\n" #~ "Chat Banner" #~ msgstr "" #~ "Kont\n" #~ "Hrupa\n" #~ "Kantakt\n" #~ "Baner" #, fuzzy #~ msgid "gtk-delete" #~ msgstr "Vydal" #~ msgid "" #~ "All chat states\n" #~ "Composing only\n" #~ "Disabled" #~ msgstr "" #~ "Usie stany razmovy\n" #~ "Tolki datyčnyja pisańnia\n" #~ "Adklučana" #, fuzzy #~ msgid "" #~ "Autodetect on every Gajim startup\n" #~ "Always use GNOME default applications\n" #~ "Always use KDE default applications\n" #~ "Always use Xfce default applications\n" #~ "Custom" #~ msgstr "" #~ "Aŭtamatyčna vyznačać pry kožnym starcie Gajim\n" #~ "Zaŭsiody karystacca prahramami, pryznačanymi dla GNOME\n" #~ "Zaŭsiody karystacca prahramami, pryznačanymi dla KDE\n" #~ "Inšyja" #~ msgid "" #~ "none\n" #~ "both\n" #~ "from\n" #~ "to" #~ msgstr "" #~ "niama\n" #~ "abiedźvie\n" #~ "ad\n" #~ "da" #, fuzzy #~ msgid "gtk-cancel" #~ msgstr "Vydal" #~ msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." #~ msgstr "Nie staje pysqlite2 (python-pysqlite2) dla vykananaja. Vychad..." #~ msgid "GTK+ runtime is missing libglade support" #~ msgstr "Biblijateka GTK+ nie padtrymvaje libglade" #~ msgid "" #~ "Please remove your current GTK+ runtime and install the latest stable " #~ "version from %s" #~ msgstr "" #~ "Kali łaska, vydal biblijateku GTK+ i zainstaluj najnoŭšuju stabilnuju " #~ "versiju z %s" #~ msgid "" #~ "Please make sure that GTK+ and PyGTK have libglade support in your system." #~ msgstr "" #~ "Kali łaska, pravier, ci padtrymvajuć srodki libpango biblijateki GTK+ i " #~ "PyGTK." #~ msgid "Gajim needs PySQLite2 to run" #~ msgstr "Gajimu treba PySQLite2" #~ msgid "_Incoming message:" #~ msgstr "_Uvachodnaje paviedamleńnie:" #~ msgid "_Outgoing message:" #~ msgstr "_Zychodnaje paviedamleńnie:" #, fuzzy #~ msgid "gtk-ok" #~ msgstr "gtk+" #, fuzzy #~ msgid "" #~ "The host %s you configured as the ft_add_hosts_to_send advanced option is " #~ "not valid, so ignored." #~ msgstr "" #~ "Host, akreśleny ŭ opcyi ft_override_host_to_send, niapravilny, tamu " #~ "ihnarujecca." #~ msgid "OpenPGP passphrase was not given" #~ msgstr "Parol OpenPGP nia vyznačany" #~ msgid "" #~ "To continue sending and receiving messages, you will need to reconnect." #~ msgstr "Kab paciahnuć kamunikacyju, treba ŭruchomić Gajim nanoŭ." #~ msgid "" #~ "You are not connected or not visible to others. Your message could not be " #~ "sent." #~ msgstr "Ty nie dałučany albo niebačny. Ty nia možaš dasyłać paviedamleńni." #~ msgid "%i days ago" #~ msgstr "%i dzion tamu" #~ msgid "Add Special _Notification" #~ msgstr "Dadaj admysłovaje _nahadvańnie" #~ msgid "Assign Open_PGP Key" #~ msgstr "Pryznač kluč Open_PGP" #~ msgid "Commands: %s" #~ msgstr "Zahady: %s" #, fuzzy #~ msgid "" #~ "Usage: /%(command)s , sends action to the current group chat. Use " #~ "third person. (e.g. /%(command)s explodes.)" #~ msgstr "" #~ "Užyvańnie: /%s , dasyłaje dziejańnie ŭ dziejny pakoj (ad " #~ "treciaj asoby). (naprykład, /%s rahoča, jak koń.)" #~ msgid "No help info for /%s" #~ msgstr "Niama daviedki pa /%s" #~ msgid "Enable link-local/zeroconf messaging" #~ msgstr "Uklučy lakalnyja paviedamleńni praz Zeroconf" #~ msgid "Nickname not found: %s" #~ msgstr "Mianuška nia znojdziena: %s" #~ msgid "This group chat has no subject" #~ msgstr "Dla hetaha pakoju nie akreślena tema" #, fuzzy #~ msgid "" #~ "Usage: /%s [reason], bans the JID from the group chat. The " #~ "nickname of an occupant may be substituted, but not if it contains \"@\". " #~ "If the JID is currently in the group chat, he/she/it will also be kicked." #~ msgstr "" #~ "Užyvańnie: /%s [pryčyna], blakuje JID dla pakoju. Mianušku " #~ "možna źmianić, kali jana nia ŭtrymlivaje znaka \"@\". Kali JID jašče " #~ "znachodzicca ŭ pakoji, jon budzie vypchnuty preč. Prabieły ŭ mianuškach " #~ "nie padtrymvajucca." #~ msgid "" #~ "Usage: /%s [reason], closes the current window or tab, displaying reason " #~ "if specified." #~ msgstr "" #~ "Užyvańnie: /%s [pryčyna], začyniaje dziejnaje akno albo kartku, pakazaŭšy " #~ "akreślenuju pryčynu." #~ msgid "" #~ "Usage: /%s [reason], invites JID to the current group chat, " #~ "optionally providing a reason." #~ msgstr "" #~ "Užyvańnie: /%s [pryčyna], zaprašaje JID u dziejny pakoj, z " #~ "akreślenym tłumačeńniem." #~ msgid "" #~ "Usage: /%s @[/nickname], offers to join room@server " #~ "optionally using specified nickname." #~ msgstr "" #~ "Užyvańnie: /%s @[/mianuška], dałučajecca da pakoju " #~ "pakoj@server z akreślenaj mianuškaj." #, fuzzy #~ msgid "" #~ "Usage: /%s [reason], removes the occupant specified by " #~ "nickname from the group chat and optionally displays a reason." #~ msgstr "" #~ "Užyvańnie: /%s [pryčyna], vypichvaje asobu z takoj mianuškaj z " #~ "pakoju z akreślenaj pryčynaj. Prabieły ŭ mianuškach nie padtrymvajucca." #~ msgid "" #~ "Usage: /%s [message], opens a private message window and sends " #~ "message to the occupant specified by nickname." #~ msgstr "" #~ "Užyvańnie: /%s [paviedamleńnie], adčyniaje akno pryvatnaj " #~ "razmovy i dasyłaje paviedamleńnie asobie z akreślenaj mianuškaj." #~ msgid "Usage: /%s , changes your nickname in current group chat." #~ msgstr "" #~ "Užyvańnie: /%s , źmianiaje tvaju mianušku dla dziejnaja pakoju." #~ msgid "" #~ "Usage: /%s [topic], displays or updates the current group chat topic." #~ msgstr "" #~ "Užyvańnie: /%s [tema], pakazvaje albo aktualizuje dziejnuju temu pakoju." #~ msgid "" #~ "Usage: /%s , sends a message without looking for other commands." #~ msgstr "" #~ "Užyvańnie: /%s , dasyłaje paviedamleńnie, nie šukajučy " #~ "inšych zahadaŭ." #, fuzzy #~ msgid "" #~ "Usage: /%s , allow to send you messages and private " #~ "messages." #~ msgstr "" #~ "Užyvańnie: /%s , źmianiaje tvaju mianušku dla dziejnaja pakoju." #~ msgid "Click to see features (like MSN, ICQ transports) of jabber servers" #~ msgstr "" #~ "Pstykni, kab pahladzieć zdolnaści serveraŭ Jabber (naprykład, šluzy MSN, " #~ "ICQ)" #~ msgid "Name:" #~ msgstr "Nazva:" #~ msgid "_Host:" #~ msgstr "_Host:" #~ msgid "Modify Account" #~ msgstr "Madyfikuj kont" #, fuzzy #~ msgid "" #~ "%(title)s by %(artist)s\n" #~ "from %(source)s" #~ msgstr "\"%(title)s\" ŭ vykanańni %(artist)s" #~ msgid "Gajim account %s" #~ msgstr "Kont Gajim %s" #~ msgid "This account is already configured in Gajim." #~ msgstr "Hety kont užo naładžany dla Gajim." #, fuzzy #~ msgid "Idle" #~ msgstr "Identyfikatar" #~ msgid "File transfer stopped by the contact at the other end" #~ msgstr "Pieradača fajłu spyniena inšym bokam" #, fuzzy #~ msgid "Generic" #~ msgstr "Ahulnaja" #, fuzzy #~ msgid "Activity" #~ msgstr "Dziejny" #~ msgid "%s has not broadcast an OpenPGP key, nor has one been assigned" #~ msgstr "" #~ "%s nie dasłaŭ svajho kluča OpenPGP, a ty taksama nie pryznačyŭ na jaho " #~ "kluča" #~ msgid "No such command: /%s (if you want to send this, prefix it with /say)" #~ msgstr "" #~ "Takoha zahadu niama: /%s (kali chočaš dasłać hety tekst jak " #~ "paviedamleńnie, ustaŭ pierad im \"/say\")" #~ msgid "" #~ "Usage: /%s , sends action to the current group chat. Use third " #~ "person. (e.g. /%s explodes.)" #~ msgstr "" #~ "Užyvańnie: /%s , dasyłaje dziejańnie ŭ dziejny pakoj (ad " #~ "treciaj asoby). (naprykład, /%s rahoča, jak koń.)" #~ msgid "_Retype Password:" #~ msgstr "Paŭta_ry parol:" #~ msgid "" #~ "If checked, all local contacts that use a Bonjour compatible chat client " #~ "(like iChat, Trillian or Gaim) will be shown in roster. You don't need to " #~ "be connected to a jabber server for it to work.\n" #~ "This is only available if python-avahi is installed and avahi-daemon is " #~ "running." #~ msgstr "" #~ "Kali ŭklučanaja hetaja opcyja, usie lakalnyja kantakty, jakija " #~ "karystajucca prahramaj z zdolnaściami pratakołu Bonjour (naprykład, " #~ "iChat, Trillian, Gaim), buduć pakazanyja ŭ śpisie kantaktaŭ. Dla hetaha " #~ "tabie nia treba navat złučacca z serveram Jabber.\n" #~ "Hetaja zdolnaść budzie pracavać tolki z ustalavanym python-avahi i " #~ "servisam avahi-daemon." #~ msgid "" #~ "If you have 2 or more accounts and this is checked, Gajim will list all " #~ "contacts as if you had one account" #~ msgstr "" #~ "Kali ŭ ciabie niekalki kontaŭ, Gajim budzie pakazvać usie kantakty ŭ " #~ "adzinym śpisie" #~ msgid "_Enable link-local messaging" #~ msgstr "_Uklučy miascovyja paviedamleńni" #~ msgid "_Compact View Alt+C" #~ msgstr "_Kampaktny vyhlad Alt+K" #~ msgid "Click to see past conversation in this room" #~ msgstr "Klikni, kab pahladzieć tekst minułych razmoŭ u hetym pakoji" #~ msgid "Build custom query" #~ msgstr "Stvary admysłovy zapyt" #~ msgid "Query Builder..." #~ msgstr "Stvaralnik zapytaŭ..." #~ msgid "Invitation Received" #~ msgstr "Atrymanaje zaprašeńnie" #~ msgid "Format of a line" #~ msgstr "Farmat radka" #~ msgid "Interface Customization" #~ msgstr "Asabistaja kanfihuracyja interfejsu" #~ msgid "Also known as iChat style" #~ msgstr "Taksama viadomy jak styl iChat" #~ msgid "" #~ "An example: If you have enabled status message for away, Gajim won't ask " #~ "you anymore for a status message when you change your status to away; it " #~ "will use the default one set here" #~ msgstr "" #~ "Naprykład, kali ty ŭžo ŭklučyŭ paviedamleńnie statusu dla stany Adyjšoŭ, " #~ "tady Gajim bolš nia budzie pytacca paćvierdžańnia hetaha tekstu" #~ msgid "Chat" #~ msgstr "Razmova" #~ msgid "" #~ "Determined by sender\n" #~ "Chat message\n" #~ "Single message" #~ msgstr "" #~ "Vyznačaje adpraŭnik\n" #~ "Razmova\n" #~ "Asobnaje paviedamleńnie" #~ msgid "E_very 5 minutes" #~ msgstr "_Kožnyja 5 chvilinaŭ" #, fuzzy #~ msgid "" #~ "Gajim will automatically show new events by popping up the relevant window" #~ msgstr "" #~ "Gajim budzie aŭtamatyčna pakazvać novyja paviedamleńni ŭ adpaviednym aknie" #~ msgid "" #~ "Gajim will notify you for new events via a popup in the bottom right of " #~ "the screen" #~ msgstr "" #~ "Gajim budzie nahadvać ab novych padziejach u vypłyŭnym aknie ŭ pravym " #~ "nižnim kucie ekranu" #~ msgid "" #~ "Gajim will notify you via a popup window in the bottom right of the " #~ "screen about contacts that just signed in" #~ msgstr "" #~ "Gajim budzie paviedamlać ab dałučeńni kantaktaŭ da servera ŭ pravym " #~ "nižnim kucie ekranu" #~ msgid "" #~ "Gajim will only change the icon of the contact that triggered the new " #~ "event" #~ msgstr "Gajim tolki źmienić ikonu kantakta, jaki ŭčyniŭ novuju padzieju" #~ msgid "" #~ "If checked, Gajim will remember the roster and chat window positions in " #~ "the screen and the sizes of them next time you run it" #~ msgstr "" #~ "Kali ŭklučanaja hetaja opcyja, Gajim budzie zapaminać pazycyju i pamiery " #~ "śpisu kantaktaŭ i voknaŭ razmoŭ i adnaŭlać ich pry nastupnym starcie" #~ msgid "" #~ "Never\n" #~ "Always\n" #~ "Per account\n" #~ "Per type" #~ msgstr "" #~ "Nikoli\n" #~ "Zaŭsiody\n" #~ "Dla kožnaha konta\n" #~ "Dla kožnaha typu" #~ msgid "Outgoing Chat state noti_fications:" #~ msgstr "Vysyłańnie paviedamleńnia ab stanie _razmovy:" #~ msgid "Print time:" #~ msgstr "Pakazvaj čas:" #~ msgid "Save _position and size for roster and chat windows" #~ msgstr "Zachoŭvaj _pazycyju i pamiery śpisu kantaktaŭ i voknaŭ razmovy" #~ msgid "Set status message to reflect currently playing _music track" #~ msgstr "" #~ "Vystaŭlaj paviedamleńnie statusu jak nazvu hranaj _muzyčnaj kampazycyi" #~ msgid "The auto away status message" #~ msgstr "Aŭtamatyčnaje paviedamleńnie statusu \"Adyjšoŭ\"" #~ msgid "Treat all incoming messages as:" #~ msgstr "Traktuj usie ŭvachodnyja paviedamleńni jak:" #~ msgid "" #~ "When a new event (message, file transfer request etc..) is received, the " #~ "following methods may be used to inform you about it. Please note that " #~ "events about new messages only occur if it is a new message from a " #~ "contact you are not already chatting with" #~ msgstr "" #~ "Mahčymyja nastupnyja varyjanty nahadvańnia ab ździajśnieńni novych " #~ "padziejaŭ (ab paviedamleńniach, zapytach na pieradaču fajłaŭ i h.d.). " #~ "Zvažaj, što atrymańnie novaha paviedamleńnia adbyvajecca tolki tady, kali " #~ "ty atrymvaješ paviedamleńnie ad kantakta, ź jakim jašče na toj momant nia " #~ "vioŭ razmovy" #~ msgid "" #~ "Works for Rhythmbox and Muine players. For more players, please visit " #~ "http://trac.gajim.org/wiki/GajimAndMusicPlayer" #~ msgstr "" #~ "Pracuje dla Rhythmbox i Muine. Dla inšych prahram hladzicie staronku " #~ "http://trac.gajim.org/wiki/GajimAndMusicPlayer" #~ msgid "_Advanced Notifications Control..." #~ msgstr "_Pašyranaje kiravańnie nahadvańniami..." #~ msgid "_Player:" #~ msgstr "_Player:" #~ msgid "City:" #~ msgstr "Horad:" #~ msgid "Company:" #~ msgstr "Firma:" #~ msgid "Given:" #~ msgstr "Imia:" #~ msgid "Middle:" #~ msgstr "Druhoje imia:" #~ msgid "Position:" #~ msgstr "Stanovišča:" #~ msgid "Prefix:" #~ msgstr "Prefiks:" #~ msgid "Role:" #~ msgstr "Funkcyja:" #~ msgid "State:" #~ msgstr "Štat:" #~ msgid "Suffix:" #~ msgstr "Sufiks:" #~ msgid "_Remove from Roster" #~ msgstr "_Vydal ź śpisu kantaktaŭ" #~ msgid "A_ccounts" #~ msgstr "_Konty" #~ msgid "_Filter:" #~ msgstr "_Filter:" #~ msgid "Ask:" #~ msgstr "Pytaj:" #~ msgid "Client:" #~ msgstr "Prahrama:" #~ msgid "OS:" #~ msgstr "Aperacyjnaja systema:" #~ msgid "" #~ "If that is not your language for which you want to highlight misspelled " #~ "words, then please set your $LANG as appropriate. Eg. for French do " #~ "export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to " #~ "make it global in /etc/profile.\n" #~ "\n" #~ "Highlighting misspelled words feature will not be used" #~ msgstr "" #~ "Kali heta nia taja mova, dla jakoj treba padśviatlać słovy z pamyłkami, " #~ "vystaŭcie źmiennuju $LANG adpaviedna patrebam. naprykład, dla biełaruskaj " #~ "movy źmiaścicie zahad export LANG=be_BY.UTF-8 u fajle ~/.bash_profile, " #~ "albo hlabalna ŭ /etc/profile.\n" #~ "\n" #~ "Słovy z pamyłkami nie padśviatlajucca" #~ msgid "Every %s _minutes" #~ msgstr "Praz kožnyja %s _chvilinaŭ" #~ msgid "You must enter a password for the new account." #~ msgstr "Treba ŭvieści parol dla novaha kontu." #~ msgid "You will always see him or her as offline." #~ msgstr "" #~ "Ciapier ty zaŭsiody budzieš bačyć status hetaha kantaktu jak adłučany." #~ msgid "%s is now %s (%s)" #~ msgstr "%s maje ciapier status %s (%s)" #~ msgid "%s is now %s" #~ msgstr "%s maje ciapier status %s" #~ msgid "" #~ "\n" #~ "From: %(from_address)s" #~ msgstr "" #~ "\n" #~ "Ad: %(from_address)s" #~ msgid "Network Manager support not available" #~ msgstr "Nie staje padtrymki Network Manager" #~ msgid "Session Management support not available (missing gnome.ui module)" #~ msgstr "Nie staje padtrymki kiravańnia sesijami (nie staje modulu gnome.ui)" #~ msgid "%s does not appear to be a valid JID" #~ msgstr "%s nia jość pravilnym JIDam" #~ msgid "%s - Gajim" #~ msgstr "%s - Gajim" #~ msgid "_New group chat" #~ msgstr "_Novy pakoj" #~ msgid "_Log on" #~ msgstr "_Dałučysia" #~ msgid "Log _off" #~ msgstr "_Adłučysia" #~ msgid "Save passphrase" #~ msgstr "Zachavaj parol" #~ msgid "Drop %s in group %s" #~ msgstr "Pieraniasi %s u hrupu %s" #~ msgid "Hides the buttons in two persons chat window." #~ msgstr "Chavaje knopki ŭ aknie pryvatnaj razmovy." #~ msgid "Connected to server %s:%s with %s" #~ msgstr "Dałučany da servera %s:%s z %s" #~ msgid " %d unread single message" #~ msgid_plural " %d unread single messages" #~ msgstr[0] "%d niečytanaje asobnaje paviedamleńnie" #~ msgstr[1] "%d niečytanyja asobnyja paviedamleńni" #~ msgstr[2] "%d niečytanych asobnych paviedamleńniaŭ" #~ msgid " %d unread group chat message" #~ msgid_plural " %d unread group chat messages" #~ msgstr[0] "%d niečytanaje hrupavoje paviedamleńnie" #~ msgstr[1] "%d niečytanyja hrupavyja paviedamleńni" #~ msgstr[2] "%d niečytanych hrupavych paviedamleńniaŭ" #~ msgid " %d unread private message" #~ msgid_plural " %d unread private messages" #~ msgstr[0] "%d niečytanaje pryvatnaje paviedamleńnie" #~ msgstr[1] "%d niečytanyja pryvatnyja paviedamleńni" #~ msgstr[2] "%d niečytanych pryvatnych paviedamleńniaŭ" #~ msgid "" #~ "Connection to host could not be established: Incorrect answer from server." #~ msgstr "Niemahčyma złučycca z hostam: Niapravilny adkaz servera." #~ msgid "Connection to host could not be established" #~ msgstr "Niemahčyma złučycca z hostam" #~ msgid "Basc" #~ msgstr "Basckaja" #~ msgid "Private Chat" #~ msgstr "Прыватная размова" #~ msgid "Group Chat" #~ msgstr "Групавая размова" #~ msgid "invisible" #~ msgstr "нябачны" #~ msgid "offline" #~ msgstr "адключаны" #~ msgid "2003-12-13T18:30:02Z" #~ msgstr "2003-12-13T18:30:02Z" #~ msgid "Romeo and Juliet" #~ msgstr "Рамэа і Джульета" #~ msgid "Soliloquy" #~ msgstr "Маналог" #~ msgid "A_fter nickname:" #~ msgstr "_Пасля мянушкі:" #~ msgid "_After time:" #~ msgstr "_Праз пэўны час:" #~ msgid "_Before time:" #~ msgstr "_За пэўны час да:" #~ msgid "_Retrieve" #~ msgstr "_Атрымаць" #~ msgid "Information published" #~ msgstr "Звесткі абноўлены" #~ msgid "Without a connection, you can not get your contact information." #~ msgstr "Вы не можаце атрымаць звесткі аб сабе, не злучыўшыся з сэрвэрам." gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/po/bg.po000066400000000000000000014325021326020644600222600ustar00rootroot00000000000000# Bulgarian translation of Gajim. # Copyright (C) 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This file is distributed under the same license as the Gajim package. # # # Yavor Doganov , 2005, 2006, 2007, 2008, 2009. msgid "" msgstr "" "Project-Id-Version: Gajim 0.12\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-03-31 02:05+0000\n" "PO-Revision-Date: 2009-08-19 23:43+0200\n" "Last-Translator: Yavor Doganov \n" "Language-Team: Bulgarian \n" "Language: bg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: gajim/chat_control_base.py:199 msgid "Ping?" msgstr "Пинг?" #: gajim/chat_control_base.py:204 msgid "Error." msgstr "Грешка." #: gajim/chat_control_base.py:571 msgid "_Undo" msgstr "" #: gajim/chat_control_base.py:579 gajim/profile_window.py:181 #: gajim/conversation_textview.py:539 msgid "_Clear" msgstr "" #: gajim/chat_control_base.py:1172 msgid "Really send file?" msgstr "Наистина ли да се изпрати файла?" #: gajim/chat_control_base.py:1173 #, fuzzy, python-format msgid "If you send a file to %s, he/she will know your real JID." msgstr "Ако изпратите файл на %s, той/тя ще разбере истинския ви Jabber ID." #: gajim/session.py:451 gajim/session.py:511 msgid "Confirm these session options" msgstr "Потвърждение на тези настройки на сесията" #: gajim/session.py:453 #, fuzzy, python-format msgid "" "The remote client wants to negotiate a session with these features:\n" "\n" "%s\n" "\n" "Are these options acceptable?" msgstr "" "Отдалеченият клиент иска да договори сесия с тези параметри:\n" "\n" "\t%s\n" "\n" "\tДопустими ли са тези настройки?" #: gajim/session.py:513 #, python-format msgid "" "The remote client selected these options:\n" "\n" "%s\n" "\n" "Continue with the session?" msgstr "" "Отдалеченият клиент избра тези настройки:\n" "\n" "%s\n" "\n" "Продължаване с тази сесия?" #: gajim/session.py:516 #, fuzzy msgid "Always accept for this contact" msgstr "Активиран ли е OpenPGP за този контакт?" #: gajim/filetransfers_window.py:89 msgid "File" msgstr "Файл:" #: gajim/filetransfers_window.py:104 msgid "Time" msgstr "Време" #: gajim/filetransfers_window.py:116 msgid "Progress" msgstr "Напредък" #: gajim/filetransfers_window.py:223 gajim/filetransfers_window.py:279 #, python-format msgid "Filename: %s" msgstr "Име на файл: %s" #: gajim/filetransfers_window.py:224 gajim/filetransfers_window.py:486 #, python-format msgid "Size: %s" msgstr "Размер: %s" #: gajim/filetransfers_window.py:233 gajim/filetransfers_window.py:243 #: gajim/history_manager.py:528 msgid "You" msgstr "Вие" #: gajim/filetransfers_window.py:234 #, python-format msgid "Sender: %s" msgstr "Изпращач: %s" #: gajim/filetransfers_window.py:235 gajim/filetransfers_window.py:763 #: gajim/tooltips.py:667 msgid "Recipient: " msgstr "Получател: " #: gajim/filetransfers_window.py:246 #, python-format msgid "Saved in: %s" msgstr "Запазен в: %s" #: gajim/filetransfers_window.py:248 gajim/chat_control.py:1617 msgid "File transfer completed" msgstr "Файловият трансфер завърши" #: gajim/filetransfers_window.py:250 gajim/chat_control.py:1621 #, fuzzy msgid "Open _Containing Folder" msgstr "_Отваряне на папката" #: gajim/filetransfers_window.py:263 gajim/filetransfers_window.py:270 #: gajim/chat_control.py:1676 msgid "File transfer cancelled" msgstr "Файловият трансфер е прекъснат" #: gajim/filetransfers_window.py:263 gajim/filetransfers_window.py:271 #: gajim/chat_control.py:1677 msgid "Connection with peer cannot be established." msgstr "Не може да бъде установен контакт с отсрещната машина." #: gajim/filetransfers_window.py:280 #, python-format msgid "Recipient: %s" msgstr "Получател: %s" #: gajim/filetransfers_window.py:282 #, python-format msgid "Error message: %s" msgstr "Грешка: %s" #: gajim/filetransfers_window.py:283 gajim/chat_control.py:1673 #, fuzzy msgid "File transfer stopped" msgstr "Файловият трансфер е преустановен" #: gajim/filetransfers_window.py:319 #, python-format msgid "" "The file %(file)s has been received, but it seems to have been damaged along " "the way.\n" "Do you want to download it again?" msgstr "" #: gajim/filetransfers_window.py:345 #, fuzzy msgid "Choose File to Send…" msgstr "Избор на файл за изпращане…" #: gajim/filetransfers_window.py:356 msgid "_Send" msgstr "_Изпращане" #: gajim/filetransfers_window.py:363 gajim/tooltips.py:702 msgid "Description: " msgstr "Описание: " #: gajim/filetransfers_window.py:376 #, fuzzy msgid "Gajim can not read this file" msgstr "Неуспех при достъпа до този файл" #: gajim/filetransfers_window.py:377 msgid "Another process is using this file." msgstr "" #: gajim/filetransfers_window.py:422 gajim/gtkgui_helpers.py:492 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Неуспех при презаписването на съществуващия файл „%s“" #: gajim/filetransfers_window.py:423 gajim/gtkgui_helpers.py:493 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." msgstr "Вече съществува файл с това име и нямате права да го презапишете." #: gajim/filetransfers_window.py:440 gajim/gtkgui_helpers.py:497 msgid "This file already exists" msgstr "Този файл вече съществува" #: gajim/filetransfers_window.py:440 gajim/gtkgui_helpers.py:497 msgid "What do you want to do?" msgstr "Какво искате да направите?" #: gajim/filetransfers_window.py:451 gajim/gtkgui_helpers.py:504 #, python-format msgid "Directory \"%s\" is not writable" msgstr "Папката „%s“ не е разрешена за запис" #: gajim/filetransfers_window.py:452 gajim/gtkgui_helpers.py:505 msgid "You do not have permission to create files in this directory." msgstr "Нямата права да създавате файлове в тази папка." #: gajim/filetransfers_window.py:463 #, fuzzy msgid "Save File as…" msgstr "Запазване на файла като…" #: gajim/filetransfers_window.py:483 #, python-format msgid "File: %s" msgstr "Файл: %s" #: gajim/filetransfers_window.py:489 #, python-format msgid "Type: %s" msgstr "Тип: %s" #: gajim/filetransfers_window.py:491 #, python-format msgid "Description: %s" msgstr "Описание: %s" #: gajim/filetransfers_window.py:492 #, python-format msgid "%s wants to send you a file:" msgstr "%s иска да ви изпрати файл:" #: gajim/filetransfers_window.py:533 #, fuzzy msgid "Checking file…" msgstr "Изпращане на профила…" #: gajim/filetransfers_window.py:547 #, fuzzy msgid "File error" msgstr "Грешка при файловия трансфер" #: gajim/filetransfers_window.py:584 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" #: gajim/filetransfers_window.py:677 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/сек)" #: gajim/filetransfers_window.py:730 gajim/filetransfers_window.py:733 msgid "Invalid File" msgstr "Невалиден файл" #: gajim/filetransfers_window.py:730 msgid "File: " msgstr "Файл: " #: gajim/filetransfers_window.py:734 msgid "It is not possible to send empty files" msgstr "Не е възможно да бъдат изпращани празни файлове" #: gajim/filetransfers_window.py:759 gajim/tooltips.py:658 msgid "Name: " msgstr "Име: " #: gajim/filetransfers_window.py:761 gajim/tooltips.py:661 msgid "Sender: " msgstr "Изпращач: " #: gajim/filetransfers_window.py:889 msgid "Pause" msgstr "Пауза" #: gajim/filetransfers_window.py:900 msgid "_Continue" msgstr "П_родължаване" #: gajim/features_window.py:48 msgid "Bonjour / Zeroconf" msgstr "Bonjour / Zeroconf" #: gajim/features_window.py:49 msgid "Serverless chatting with autodetected clients in a local network." msgstr "" "Разговори с автоматично открити контакти в локалната мрежа (без сървър)." #: gajim/features_window.py:50 msgid "Requires python-avahi." msgstr "Изисква python-avahi." #: gajim/features_window.py:51 msgid "" "Requires pybonjour and bonjour SDK running (http://developer.apple.com/" "opensource/)." msgstr "" #: gajim/features_window.py:52 #, fuzzy msgid "Command line" msgstr "Команди: %s" #: gajim/features_window.py:53 msgid "A script to control Gajim via commandline." msgstr "Скрипт за управление на Gajim от командния ред." #: gajim/features_window.py:54 msgid "Requires python-dbus." msgstr "Изисква python-dbus." #: gajim/features_window.py:55 gajim/features_window.py:83 #: gajim/features_window.py:87 msgid "Feature not available under Windows." msgstr "" #: gajim/features_window.py:56 #, fuzzy msgid "OpenPGP message encryption" msgstr "Избор на ключ на OpenPGP" #: gajim/features_window.py:57 #, fuzzy msgid "Ability to encrypting chat messages with OpenPGP." msgstr "Шифриране на съобщения с ключове на GPG." #: gajim/features_window.py:58 msgid "Requires gpg and python-gnupg (http://code.google.com/p/python-gnupg/)." msgstr "" #: gajim/features_window.py:59 msgid "Requires gpg.exe in PATH." msgstr "" #: gajim/features_window.py:60 #, fuzzy msgid "Password encryption" msgstr "Парола за влизане в стаята" #: gajim/features_window.py:61 msgid "Passwords can be stored securely and not just in plaintext." msgstr "" "Паролите могат да се съхраняват по сигурен начин, вместо в обикновен текст." #: gajim/features_window.py:62 msgid "" "Requires libsecret and a provider (such as GNOME Keyring and KSecretService)." msgstr "" #: gajim/features_window.py:63 msgid "On Windows the Windows Credential Vault is used." msgstr "" #: gajim/features_window.py:64 msgid "Spell Checker" msgstr "Проверка на правописа" #: gajim/features_window.py:65 msgid "Spellchecking of composed messages." msgstr "Проверка на изходящите съобщения за правописни грешки." #: gajim/features_window.py:66 gajim/features_window.py:67 #, fuzzy msgid "Requires Gspell" msgstr "Изисква python-sexy." #: gajim/features_window.py:68 #, fuzzy msgid "Automatic status" msgstr "_Съгласуване спрямо състоянието" #: gajim/features_window.py:69 msgid "Ability to measure idle time, in order to set auto status." msgstr "" "Възможност за измерване на времето на бездействие, с цел да се установи " "автоматично съобщение за състояние." #: gajim/features_window.py:70 msgid "Requires libxss library." msgstr "" #: gajim/features_window.py:71 #, fuzzy msgid "Requires python2.5." msgstr "Изисква python-gnome2." #: gajim/features_window.py:72 #, fuzzy msgid "End to End message encryption" msgstr "Шифриране тип „End to End“" #: gajim/features_window.py:73 #, fuzzy msgid "Encrypting chat messages." msgstr "Шифриране на разговорите." #: gajim/features_window.py:74 gajim/features_window.py:75 msgid "Requires python-crypto." msgstr "Изисква python-crypto." #: gajim/features_window.py:76 msgid "RST Generator" msgstr "Генератор на RST" #: gajim/features_window.py:77 msgid "" "Generate XHTML output from RST code (see http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." msgstr "" "Генериране на изход в XHTML от RST (вижте http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." #: gajim/features_window.py:78 gajim/features_window.py:79 msgid "Requires python-docutils." msgstr "Изисква python-docutils." #: gajim/features_window.py:80 gajim/data/gui/preferences_window.ui:2421 msgid "Audio / Video" msgstr "" #: gajim/features_window.py:81 msgid "Ability to start audio and video chat." msgstr "" #: gajim/features_window.py:82 msgid "" "Requires gir1.2-farstream-0.2, gir1.2-gstreamer-1.0, gstreamer1.0-libav and " "gstreamer1.0-plugins-ugly." msgstr "" #: gajim/features_window.py:84 msgid "UPnP-IGD" msgstr "" #: gajim/features_window.py:85 msgid "Ability to request your router to forward port for file transfer." msgstr "" #: gajim/features_window.py:86 #, fuzzy msgid "Requires gir1.2-gupnpigd-1.0." msgstr "Изисква python-gnome2." #: gajim/features_window.py:94 #, fuzzy msgid "?features:Available" msgstr "На линия" #: gajim/features_window.py:101 msgid "Feature" msgstr "Функционалност" #: gajim/gtkgui_helpers.py:255 msgid "Error reading file:" msgstr "Грешка при четене на файл:" #: gajim/gtkgui_helpers.py:258 msgid "Error parsing file:" msgstr "Грешка при анализиране на файл:" #: gajim/gtkgui_helpers.py:478 msgid "Extension not supported" msgstr "Разширението не се поддържа" #: gajim/gtkgui_helpers.py:479 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "" "Изображението не може да бъде запазено във формат %(type)s. Запазване като " "%(new_filename)s?" #: gajim/gtkgui_helpers.py:514 #, fuzzy msgid "Save Image as…" msgstr "Запазване на изображението като…" #: gajim/vcard.py:166 gajim/vcard.py:513 gajim/profile_window.py:175 #: gajim/chat_control.py:581 #, fuzzy msgid "Save _As" msgstr "имам " #: gajim/vcard.py:289 gajim/vcard.py:296 msgid "?Client:Unknown" msgstr "Неизвестен" #: gajim/vcard.py:293 gajim/vcard.py:298 msgid "?OS:Unknown" msgstr "Неизвестна" #: gajim/vcard.py:327 gajim/vcard.py:330 #, fuzzy msgid "?Time:Unknown" msgstr "Неизвестен" #: gajim/vcard.py:381 msgid "?Role in Group Chat:Role:" msgstr "" #: gajim/vcard.py:385 msgid "Affiliation:" msgstr "Ранг:" #: gajim/vcard.py:392 #, fuzzy msgid "" "This contact is interested in your presence information, but you are not " "interested in their presence" msgstr "" "Този контакт се интересува от информацията за вашето състояние, но вие не се " "интересувате от неговото" #: gajim/vcard.py:394 #, fuzzy msgid "" "You are interested in the contact's presence information, but it is not " "mutual" msgstr "" "Вие с интересувате от информацията за състоянието на този контакт, но той не " "се интересува от вашето" #: gajim/vcard.py:396 #, fuzzy msgid "The contact and you want to exchange presence information" msgstr "" "Вие и контакта се интересувате взаимно от информацията за състоянията си" #: gajim/vcard.py:398 #, fuzzy msgid "" "You and the contact have a mutual disinterest in each-others presence " "information" msgstr "" "Вие и контакта се интересувате взаимно от информацията за състоянията си" #: gajim/vcard.py:404 msgid "You are waiting contact's answer about your subscription request" msgstr "Чакате отговора на контакта относно запитването ви за записване" #: gajim/vcard.py:406 msgid "There is no pending subscription request." msgstr "Няма чакащо запитване за записване." #: gajim/vcard.py:411 gajim/vcard.py:455 gajim/vcard.py:568 msgid " resource with priority " msgstr " ресурс с приоритет " #: gajim/options_dialog.py:383 gajim/dialogs.py:4806 gajim/dialogs.py:4848 #: gajim/dialogs.py:4896 gajim/dialogs.py:4986 msgid "All files" msgstr "Всички файлове" #: gajim/options_dialog.py:392 #, fuzzy msgid "Clear File" msgstr "Чистя" #: gajim/options_dialog.py:474 #, fuzzy msgid "Manage Proxies" msgstr "Настройки на сървъра-посредник" #: gajim/options_dialog.py:484 gajim/options_dialog.py:552 #: gajim/options_dialog.py:573 gajim/dialogs.py:326 gajim/dialogs.py:328 #: gajim/dialogs.py:536 gajim/dialogs.py:549 gajim/roster_window.py:2997 #: gajim/roster_window.py:3003 gajim/roster_window.py:3008 gajim/config.py:1162 #: gajim/config.py:1177 gajim/config.py:1182 gajim/config.py:1230 #: gajim/config.py:1340 gajim/config.py:2489 gajim/config.py:2566 #: gajim/data/gui/account_creation_wizard_window.ui:22 #: gajim/data/gui/change_mood_dialog.ui:98 msgid "None" msgstr "Няма" #: gajim/options_dialog.py:506 #, fuzzy msgid "Adjust to Status" msgstr "_Съгласуване спрямо състоянието" #: gajim/options_dialog.py:518 msgid "On" msgstr "" #: gajim/options_dialog.py:518 #, fuzzy msgid "Off" msgstr "Изключен" #: gajim/options_dialog.py:556 msgid "Failed to get secret keys" msgstr "Неуспех при извличането на частните ключове" #: gajim/options_dialog.py:557 #, fuzzy msgid "There is no OpenPGP secret key available." msgstr "Възникна проблем при извличането на частните ви OpenPGP ключове." #: gajim/options_dialog.py:562 msgid "OpenPGP Key Selection" msgstr "Избор на ключ на OpenPGP" #: gajim/options_dialog.py:562 msgid "Choose your OpenPGP key" msgstr "Изберете вашия ключ на OpenPGP" #: gajim/gui_menu_builder.py:100 msgid "_New Group Chat" msgstr "_Нова стая" #: gajim/gui_menu_builder.py:292 gajim/gui_menu_builder.py:416 #: gajim/dialogs.py:1114 gajim/dialogs.py:2333 gajim/dialogs.py:2362 #: gajim/dialogs.py:3867 gajim/chat_control.py:284 gajim/roster_window.py:804 #: gajim/roster_window.py:1753 gajim/roster_window.py:1755 #: gajim/roster_window.py:2068 gajim/roster_window.py:3419 #: gajim/roster_window.py:3446 gajim/gui_interface.py:524 #: gajim/common/contacts.py:154 gajim/common/contacts.py:280 #: gajim/common/helpers.py:95 gajim/common/helpers.py:408 msgid "Not in Roster" msgstr "Не е в списъка" #: gajim/gui_menu_builder.py:431 msgid "I would like to add you to my roster" msgstr "" "Бих искал(а) да Ви добавя към списъка си. I would like to add you to my " "roster." #: gajim/gui_menu_builder.py:508 #, fuzzy msgid "Send Single _Message…" msgstr "Изпращане на _еднократно съобщение" #: gajim/gui_menu_builder.py:521 gajim/roster_window.py:5165 #: gajim/data/gui/contact_context_menu.ui:58 msgid "Send Cus_tom Status" msgstr "Изпращане на _специфично състояние" #: gajim/gui_menu_builder.py:541 #, fuzzy msgid "E_xecute Command…" msgstr "_Изпълнение на команда" #: gajim/gui_menu_builder.py:549 msgid "_Manage Transport" msgstr "Управление на _транспорт" #: gajim/gui_menu_builder.py:555 msgid "_Modify Transport" msgstr "Промяна на т_ранспорт" #: gajim/gui_menu_builder.py:562 gajim/roster_window.py:5195 #, fuzzy msgid "_Rename…" msgstr "_Преименуване" #: gajim/gui_menu_builder.py:573 gajim/roster_window.py:5212 #: gajim/roster_window.py:5327 gajim/data/gui/blocked_contacts_window.ui:52 #: gajim/data/gui/gc_occupants_menu.ui:148 #: gajim/data/gui/contact_context_menu.ui:166 msgid "_Unblock" msgstr "_Деблокиране" #: gajim/gui_menu_builder.py:576 gajim/roster_window.py:5217 #: gajim/roster_window.py:5331 gajim/data/gui/gc_occupants_menu.ui:140 #: gajim/data/gui/contact_context_menu.ui:174 msgid "_Block" msgstr "_Блокиране" #: gajim/gui_menu_builder.py:584 gajim/roster_window.py:5224 #: gajim/data/gui/contact_context_menu.ui:204 msgid "Remo_ve" msgstr "П_ремахване" #: gajim/gui_menu_builder.py:594 gajim/data/gui/search_window.ui:98 msgid "_Information" msgstr "_Информация" #: gajim/gui_menu_builder.py:611 #, fuzzy msgid "Send File..." msgstr "Изпращане на _файл…" #: gajim/gui_menu_builder.py:615 #, fuzzy msgid "Invite Contacts" msgstr "Покана на _контакти" #: gajim/gui_menu_builder.py:616 #, fuzzy msgid "Add to Roster" msgstr "Добавяне към _списъка…" #: gajim/gui_menu_builder.py:617 msgid "Audio Session" msgstr "" #: gajim/gui_menu_builder.py:618 msgid "Video Session" msgstr "" #: gajim/gui_menu_builder.py:619 #, fuzzy msgid "Information" msgstr "_Информация" #: gajim/gui_menu_builder.py:620 gajim/gui_menu_builder.py:655 #: gajim/data/gui/application_menu.ui:37 #, fuzzy msgid "History" msgstr "Ист_ория" #: gajim/gui_menu_builder.py:644 #, fuzzy msgid "Manage Room" msgstr "_Управление на стаята" #: gajim/gui_menu_builder.py:645 #, fuzzy msgid "Change Subject" msgstr "Промяна на _темата…" #: gajim/gui_menu_builder.py:646 #, fuzzy msgid "Configure Room" msgstr "Настройки на _стаята…" #: gajim/gui_menu_builder.py:647 #, fuzzy msgid "Destroy Room" msgstr "_Унищожаване на стаята" #: gajim/gui_menu_builder.py:649 #, fuzzy msgid "Change Nick" msgstr "Смяна на псе_вдоним…" #: gajim/gui_menu_builder.py:650 #, fuzzy msgid "Bookmark Room" msgstr "_Добавяне на стаята към отметките (Ctrl+B)" #: gajim/gui_menu_builder.py:651 #, fuzzy msgid "Request Voice" msgstr "_Глас" #: gajim/gui_menu_builder.py:652 gajim/data/gui/gc_control_popup_menu.ui:72 #, fuzzy msgid "Notify on all messages" msgstr "Настроени съобщения:" #: gajim/gui_menu_builder.py:653 #, fuzzy msgid "Minimize on close" msgstr "_Минимизиране при затваряне" #: gajim/gui_menu_builder.py:654 gajim/roster_window.py:5397 #, fuzzy msgid "Execute command" msgstr "_Изпълнение на команда" #: gajim/gui_menu_builder.py:656 #, fuzzy msgid "Disconnect" msgstr "_Изключване" #: gajim/gui_menu_builder.py:685 gajim/gui_menu_builder.py:732 msgid "Join Group Chat" msgstr "Влизане в стая" #: gajim/gui_menu_builder.py:731 #, fuzzy msgid "Add Contact..." msgstr "_Добавяне на контакт…" #: gajim/gui_menu_builder.py:733 gajim/accounts_window.py:460 #: gajim/accounts_window.py:555 gajim/accounts_window.py:594 #, fuzzy msgid "Profile" msgstr "файл" #: gajim/gui_menu_builder.py:734 #, fuzzy msgid "Discover Services" msgstr "_Откриване на услуги" #: gajim/gui_menu_builder.py:735 #, fuzzy msgid "Send Single Message..." msgstr "Изпращане на _еднократно съобщение…" #: gajim/gui_menu_builder.py:736 gajim/data/gui/preferences_window.ui:2846 msgid "Advanced" msgstr "Напреднали" #: gajim/gui_menu_builder.py:737 #, fuzzy msgid "Archiving Preferences" msgstr "_Настройки" #: gajim/gui_menu_builder.py:738 gajim/history_sync.py:44 #, fuzzy msgid "Synchronise History" msgstr "Синхронизиране" #: gajim/gui_menu_builder.py:739 gajim/dialogs.py:4583 msgid "Privacy Lists" msgstr "Филтри за уединение" #: gajim/gui_menu_builder.py:740 gajim/server_info.py:37 #, fuzzy msgid "Server Info" msgstr "Сървър" #: gajim/gui_menu_builder.py:741 gajim/data/gui/xml_console_window.ui:77 msgid "XML Console" msgstr "XML конзола" #: gajim/gui_menu_builder.py:743 #, fuzzy msgid "Admin" msgstr "_Администратор" #: gajim/gui_menu_builder.py:744 #, fuzzy msgid "Send Server Message..." msgstr "_Изпращане на съобщение от сървъра…" #: gajim/gui_menu_builder.py:745 msgid "Set MOTD..." msgstr "Настройване на MOTD…" #: gajim/gui_menu_builder.py:746 msgid "Update MOTD..." msgstr "Актуализиране на MOTD…" #: gajim/gui_menu_builder.py:747 #, fuzzy msgid "Delete MOTD..." msgstr "Изтриване на MOTD" #: gajim/gui_menu_builder.py:787 #, fuzzy msgid "No Accounts available" msgstr "Няма наличен акаунт" #: gajim/gui_menu_builder.py:799 gajim/data/gui/accounts_window.ui:78 #: gajim/data/gui/application_menu.ui:5 gajim/data/gui/application_menu.ui:71 #: gajim/data/gui/shortcuts_window.ui:181 msgid "Accounts" msgstr "Акаунти" #: gajim/history_manager.py:56 #, fuzzy msgid "Usage:" msgstr "съобщение" #: gajim/history_manager.py:58 #, fuzzy msgid "Options:" msgstr "_Емотикони:" #: gajim/history_manager.py:60 msgid "Show this help message and exit" msgstr "" #: gajim/history_manager.py:61 msgid "Choose folder for logfile" msgstr "" #: gajim/history_manager.py:104 msgid "Cannot find history logs database" msgstr "Неуспех при откриването на базата от данни за разговорите" #: gajim/history_manager.py:144 gajim/history_manager.py:195 #: gajim/dialogs.py:3848 gajim/config.py:1621 gajim/disco.py:872 msgid "JID" msgstr "JID" #: gajim/history_manager.py:157 gajim/history_manager.py:201 #: gajim/history_window.py:108 msgid "Date" msgstr "Дата" #: gajim/history_manager.py:164 gajim/history_manager.py:220 #: gajim/data/gui/join_groupchat_window.ui:131 msgid "Nickname" msgstr "Псевдоним" #: gajim/history_manager.py:173 gajim/history_manager.py:208 #: gajim/history_window.py:116 gajim/data/gui/xml_console_window.ui:108 msgid "Message" msgstr "Съобщение" #: gajim/history_manager.py:181 gajim/history_manager.py:214 msgid "Subject" msgstr "Тема" #: gajim/history_manager.py:243 msgid "" "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " "RUNNING)" msgstr "" "Искате ли да изчистите базата от данни? (ИЗОБЩО НЕ СЕ ПРЕПОРЪЧВА АКО GAJIM Е " "СТАРТИРАН)" #: gajim/history_manager.py:245 #, fuzzy msgid "" "Normally allocated database size will not be freed, it will just become " "reusable. If you really want to reduce database filesize, click YES, else " "click NO.\n" "\n" "In case you click YES, please wait…" msgstr "" "Разпределеното пространство на базата от данни няма да бъде освободено, а ще " "стане наново използваемо. Ако наистина искате да намалите файловия размер на " "базата от данни, изберете „Да“; в противен случай изберете „Не“.\n" "\n" "В случай, че изберете „Да“, изчакайте…" #: gajim/history_manager.py:250 #, fuzzy msgid "Database Cleanup" msgstr "Грешка в базата от данни" #: gajim/history_manager.py:464 #, fuzzy msgid "Exporting History Logs…" msgstr "Изнасяне на записите на разговорите…" #: gajim/history_manager.py:540 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "%(who)s каза в %(time)s: %(message)s\n" #: gajim/history_manager.py:578 #, fuzzy, python-format msgid "Do you wish to delete all correspondence with %(jid)s?" msgstr "Наистина ли искате да изтриете избраното съобщение?" #: gajim/history_manager.py:582 #, fuzzy msgid "Do you wish to delete all correspondence with the selected contacts?" msgstr "Наистина ли искате да изтриете дневниците на избрания контакт?" #: gajim/history_manager.py:584 #, fuzzy msgid "This can not be undone." msgstr "Услугата не може да бъде намерена" #: gajim/history_manager.py:586 gajim/history_manager.py:625 #, fuzzy msgid "Deletion Confirmation" msgstr "Отмяна на потвърждението" #: gajim/history_manager.py:620 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Наистина ли искате да изтриете избраното съобщение?" msgstr[1] "Наистина ли искате да изтриете избраните съобщения?" #: gajim/history_manager.py:623 msgid "This is an irreversible operation." msgstr "Това е необратима операция." #: gajim/profile_window.py:63 #, fuzzy msgid "Retrieving profile…" msgstr "Извличане на профила…" #: gajim/profile_window.py:128 msgid "Could not load image" msgstr "Неуспех при зареждането на изображението" #: gajim/profile_window.py:200 #, fuzzy msgid "Wrong date format" msgstr "Информация за контакта" #: gajim/profile_window.py:201 #, fuzzy msgid "Format of the date must be YYYY-MM-DD" msgstr "Формат: гггг-мм-дд" #: gajim/profile_window.py:261 msgid "Information received" msgstr "Получена информация" #: gajim/profile_window.py:334 gajim/dialogs.py:2562 gajim/dialogs.py:2650 #: gajim/dialogs.py:3105 gajim/disco.py:536 gajim/gui_interface.py:1849 #: gajim/dialog_messages.py:32 msgid "You are not connected to the server" msgstr "Не сте свързани към сървъра." #: gajim/profile_window.py:335 #, fuzzy msgid "Without a connection, you can not publish your contact information." msgstr "Трябва да сте свързани, за да публикувате визитката." #: gajim/profile_window.py:349 #, fuzzy msgid "Sending profile…" msgstr "Изпращане на профила…" #: gajim/profile_window.py:368 msgid "Information NOT published" msgstr "Информацията НЕ Е публикувана" #: gajim/profile_window.py:375 msgid "vCard publication failed" msgstr "Неуспех при публикуването на визитката" #: gajim/profile_window.py:376 msgid "" "There was an error while publishing your personal information, try again " "later." msgstr "" "Възникна грешка при публикуване на личните данни, опитайте отново по-късно." #: gajim/dialogs.py:90 #, python-format msgid "Contact name: %s" msgstr "Име на контакта: %s" #: gajim/dialogs.py:92 #, fuzzy, python-format msgid "JID: %s" msgstr "Jabber ID: %s" #: gajim/dialogs.py:121 gajim/dialogs.py:133 gajim/roster_window.py:2939 #: gajim/roster_window.py:3953 gajim/roster_window.py:5234 #: gajim/accounts_window.py:463 gajim/common/contacts.py:105 #: gajim/common/contacts.py:137 gajim/data/gui/preferences_window.ui:569 #: gajim/data/gui/shortcuts_window.ui:176 msgid "General" msgstr "Общи" #: gajim/dialogs.py:206 msgid "Group" msgstr "Група" #: gajim/dialogs.py:213 msgid "In the group" msgstr "В групата" #: gajim/dialogs.py:308 msgid "KeyID" msgstr "Идентификатор на ключ" #: gajim/dialogs.py:313 msgid "Contact name" msgstr "Име на контакта" #: gajim/dialogs.py:491 msgid "Set Mood" msgstr "Задаване на настроение" #: gajim/dialogs.py:611 #, python-format msgid "%s Status Message" msgstr "Съобщение за състояние „%s“" #: gajim/dialogs.py:625 msgid "Status Message" msgstr "Съобщение за състояние" #: gajim/dialogs.py:815 msgid "Overwrite Status Message?" msgstr "Презаписване на съобщението за състояние?" #: gajim/dialogs.py:816 msgid "" "This name is already used. Do you want to overwrite this status message?" msgstr "" "Това име вече се използва. Искате ли да презапишете това съобщение за " "състояние?" #: gajim/dialogs.py:824 msgid "Save as Preset Status Message" msgstr "Запазване като настроено съобщение за състояние" #: gajim/dialogs.py:825 msgid "Please type a name for this status message" msgstr "Напишете име за това съобщение за състояние" #: gajim/dialogs.py:852 #, fuzzy msgid "JID:" msgstr "Вашия JID:" #: gajim/dialogs.py:853 msgid "AIM Address:" msgstr "Адрес на AIM:" #: gajim/dialogs.py:854 msgid "GG Number:" msgstr "Номер на GG:" #: gajim/dialogs.py:855 msgid "ICQ Number:" msgstr "Номер на ICQ:" #: gajim/dialogs.py:856 msgid "MSN Address:" msgstr "Адрес на MSN:" #: gajim/dialogs.py:857 msgid "Yahoo! Address:" msgstr "Адрес на Yahoo!:" #: gajim/dialogs.py:894 #, fuzzy, python-format msgid "" "Please fill in the data of the contact you want to add to your account " "%s" msgstr "" "Попълнете данните за контакта, който искате да добавите към акаунт „%s“" #: gajim/dialogs.py:897 msgid "Please fill in the data of the contact you want to add" msgstr "Попълнете данните за контакта, който искате да добавите" #: gajim/dialogs.py:1089 gajim/dialogs.py:1095 gajim/dialogs.py:1100 msgid "Invalid User ID" msgstr "Невалиден идентификатор" #: gajim/dialogs.py:1096 msgid "The user ID must not contain a resource." msgstr "Потребителският идентификатор не трябва да съдържа ресурс." #: gajim/dialogs.py:1101 msgid "You cannot add yourself to your roster." msgstr "Не може да добавите себе си към списъка." #: gajim/dialogs.py:1115 msgid "Contact already in roster" msgstr "Контактът вече е в списъка" #: gajim/dialogs.py:1116 msgid "This contact is already listed in your roster." msgstr "Контактът вече съществува в списъка." #: gajim/dialogs.py:1169 gajim/dialogs.py:1203 msgid "User ID:" msgstr "Идентификатор на потребител:" #: gajim/dialogs.py:1269 #, fuzzy msgid "Error while adding transport contact" msgstr "Грешка при добавянето на услугата. %s" #: gajim/dialogs.py:1270 #, python-format msgid "" "This error occured while adding a contact for transport %(transport)s:\n" "\n" "%(error)s" msgstr "" #: gajim/dialogs.py:1302 #, fuzzy msgid "A GTK+ XMPP client" msgstr "Джабър клиент за GTK+" #: gajim/dialogs.py:1303 #, fuzzy, python-format msgid "GTK+ Version: %s" msgstr "Версия на GTK+:" #: gajim/dialogs.py:1304 #, fuzzy, python-format msgid "PyGObject Version: %s" msgstr "Версия на PyGTK:" #: gajim/dialogs.py:1305 #, python-format msgid "python-nbxmpp Version: %s" msgstr "" #: gajim/dialogs.py:1308 #, fuzzy msgid "Current Developers" msgstr "Текущи разработчици:" #: gajim/dialogs.py:1309 #, fuzzy msgid "Past Developers" msgstr "Бивши разработчици:" #: gajim/dialogs.py:1310 msgid "Artists" msgstr "" #: gajim/dialogs.py:1314 msgid "Last but not least" msgstr "" #: gajim/dialogs.py:1315 #, fuzzy msgid "we would like to thank all the package maintainers." msgstr "" "И не на последно място, бихме искали да благодарим на всички, които " "поддържат пакетите." #: gajim/dialogs.py:1316 #, fuzzy msgid "Thanks" msgstr "Благодарен" #: gajim/dialogs.py:1318 msgid "translator-credits" msgstr "" "Явор Доганов \n" "\n" "Проектът за превод на GNOME има нужда от подкрепа.\n" "Научете повече за нас на http://gnome.cult.bg\n" "Докладвайте за грешки на http://gnome.cult.bg/bugs" #: gajim/dialogs.py:1503 #, fuzzy, python-format msgid "Dictionary for language \"%s\" not available" msgstr "Няма наличен речник за %s език" #: gajim/dialogs.py:1504 #, fuzzy, python-format msgid "" "You have to install the dictionary \"%s\" to use spellchecking, or choose " "another language by setting the speller_language option.\n" "\n" "Highlighting misspelled words feature will not be used" msgstr "" "За да използвате проверката за правопис, трябва да инсталирате речник за %s " "или да изберете друг език чрез настройването на опцията „speller_language“.\n" "\n" "Функционалността за осветяване на сгрешени думи ще е изключена" #: gajim/dialogs.py:1851 gajim/dialogs.py:1866 gajim/gui_interface.py:1511 #: gajim/gui_interface.py:1553 msgid "Insecure connection" msgstr "Несигурна връзка" #: gajim/dialogs.py:1852 #, fuzzy, python-format msgid "" "You are about to connect to the account %(account)s (%(server)s) insecurely. " "This means conversations will not be encrypted, and is strongly " "discouraged.\n" "Are you sure you want to do that?" msgstr "" "На път сте да изпратите паролата си чрез несигурна връзка. Трябва да " "инсталирате PyOpenSSL, за да предотвратите това. Сигурни ли сте, че искате " "да го направите?" #: gajim/dialogs.py:1857 gajim/gui_interface.py:1515 #: gajim/gui_interface.py:1556 msgid "Yes, I really want to connect insecurely" msgstr "Да, наистина искам да се свържа по несигурен начин" #: gajim/dialogs.py:1858 msgid "Gajim will NOT connect unless you check this box" msgstr "" #: gajim/dialogs.py:1859 gajim/groupchat_control.py:2335 #: gajim/roster_window.py:2897 gajim/roster_window.py:3529 #: gajim/roster_window.py:4282 gajim/message_window.py:247 #: gajim/gui_interface.py:725 gajim/gui_interface.py:1516 #: gajim/gui_interface.py:1557 #, fuzzy msgid "_Do not ask me again" msgstr "Да _не се задава този въпрос отново" #: gajim/dialogs.py:1957 msgid "_Resume" msgstr "" #: gajim/dialogs.py:1965 msgid "Re_place" msgstr "" #: gajim/dialogs.py:2168 gajim/config.py:2169 #: gajim/command_system/implementation/standard.py:261 msgid "Invalid nickname" msgstr "Невалиден псевдоним" #: gajim/dialogs.py:2169 #, fuzzy msgid "The nickname contains invalid characters." msgstr "Псевдонимът съдържа непозволени знаци." #: gajim/dialogs.py:2291 msgid "Subscription Request" msgstr "Искане за записване" #: gajim/dialogs.py:2300 #, python-format msgid "Subscription request for account %(account)s from %(jid)s" msgstr "Искане за записване за акаунт „%(account)s“ от %(jid)s" #: gajim/dialogs.py:2303 #, python-format msgid "Subscription request from %s" msgstr "Искане за записване от %s" #: gajim/dialogs.py:2375 gajim/data/gui/join_groupchat_window.ui:312 #, fuzzy msgid "Join Groupchat" msgstr "Влизане в стая" #: gajim/dialogs.py:2531 #, fuzzy msgid "Invalid Room" msgstr "Невалиден формат" #: gajim/dialogs.py:2532 msgid "Please choose a room" msgstr "" #: gajim/dialogs.py:2544 gajim/dialogs.py:2551 msgid "Invalid Nickname" msgstr "Невалиден псевдоним" #: gajim/dialogs.py:2545 #, fuzzy msgid "Please choose a nickname" msgstr "Създайте нова тема с желаното име." #: gajim/dialogs.py:2557 gajim/dialogs.py:3516 gajim/config.py:2453 #: gajim/dialog_messages.py:37 gajim/dialog_messages.py:42 msgid "Invalid JID" msgstr "Невалиден JID" #: gajim/dialogs.py:2563 gajim/gui_interface.py:1850 msgid "You can not join a group chat unless you are connected." msgstr "Трябва да сте свързани, за да влезете в стая." #: gajim/dialogs.py:2617 gajim/dialogs.py:2628 #, fuzzy msgid "Wrong server" msgstr "Грешен адрес" #: gajim/dialogs.py:2618 gajim/dialogs.py:2629 #, fuzzy, python-format msgid "%s is not a groupchat server" msgstr "Това не е стая" #: gajim/dialogs.py:2651 msgid "Without a connection, you can not synchronise your contacts." msgstr "Трябва да сте свързани, за да синхронизирате контактите си." #: gajim/dialogs.py:2662 gajim/dialogs.py:2733 gajim/dialogs.py:3851 #: gajim/history_window.py:100 gajim/disco.py:865 gajim/disco.py:1693 #: gajim/disco.py:1978 msgid "Name" msgstr "Име" #: gajim/dialogs.py:2665 gajim/data/gui/join_groupchat_window.ui:214 msgid "Server" msgstr "Сървър" #: gajim/dialogs.py:2701 msgid "This account is not connected to the server" msgstr "Този акаунт не е свързан към сървъра" #: gajim/dialogs.py:2702 msgid "You cannot synchronize with an account unless it is connected." msgstr "Не може да се синхронизирате с акаунт, ако не е свързан." #: gajim/dialogs.py:2731 msgid "Synchronise" msgstr "Синхронизиране" #: gajim/dialogs.py:2794 #, fuzzy msgid "Start new Conversation" msgstr "Продължен разговор" #: gajim/dialogs.py:3052 #, fuzzy msgid "New Groupchat" msgstr "Нова стая" #: gajim/dialogs.py:3054 #, fuzzy msgid "New Contact" msgstr "Добавяне на нов контакт" #: gajim/dialogs.py:3106 msgid "Without a connection, you can not change your password." msgstr "Трябва да сте свързани, за да променяте паролата." #: gajim/dialogs.py:3126 msgid "Invalid password" msgstr "Невалидна парола" #: gajim/dialogs.py:3126 msgid "You must enter a password." msgstr "Трябва да въведете парола." #: gajim/dialogs.py:3130 msgid "Passwords do not match" msgstr "Паролите не съвпадат" #: gajim/dialogs.py:3131 msgid "The passwords typed in both fields must be identical." msgstr "Паролите, написани в двете полета, трябва да са едни и същи." #: gajim/dialogs.py:3169 gajim/notify.py:91 #: gajim/common/connection_handlers_events.py:2821 msgid "Contact Signed In" msgstr "Включи се контакт" #: gajim/dialogs.py:3171 gajim/notify.py:91 #: gajim/common/connection_handlers_events.py:2827 msgid "Contact Signed Out" msgstr "Изключи се контакт" #: gajim/dialogs.py:3173 gajim/notify.py:92 gajim/notify.py:105 #: gajim/common/connection_handlers_events.py:2641 msgid "New Message" msgstr "Ново съобщение" #: gajim/dialogs.py:3173 gajim/notify.py:92 gajim/notify.py:105 #: gajim/common/connection_handlers_events.py:2623 msgid "New Single Message" msgstr "Ново еднократно съобщение" #: gajim/dialogs.py:3174 gajim/notify.py:92 gajim/notify.py:106 #: gajim/common/connection_handlers_events.py:2629 msgid "New Private Message" msgstr "Ново лично съобщение" #: gajim/dialogs.py:3174 msgid "New E-mail" msgstr "Нова е-поща" #: gajim/dialogs.py:3176 gajim/gui_interface.py:926 gajim/notify.py:93 msgid "File Transfer Request" msgstr "Запитване за файлов трансфер" #: gajim/dialogs.py:3178 gajim/gui_interface.py:861 gajim/gui_interface.py:891 #: gajim/notify.py:94 msgid "File Transfer Error" msgstr "Грешка при файловия трансфер" #: gajim/dialogs.py:3180 gajim/gui_interface.py:1030 #: gajim/gui_interface.py:1059 gajim/gui_interface.py:1080 gajim/notify.py:94 msgid "File Transfer Completed" msgstr "Файловият трансфер е приключен" #: gajim/dialogs.py:3181 gajim/gui_interface.py:1034 #: gajim/gui_interface.py:1063 gajim/gui_interface.py:1084 gajim/notify.py:95 msgid "File Transfer Stopped" msgstr "Файловият трансфер е преустановен" #: gajim/dialogs.py:3183 gajim/dialogs.py:4748 gajim/chat_control.py:1647 #: gajim/gui_interface.py:663 gajim/notify.py:95 msgid "Groupchat Invitation" msgstr "Покана за разговор в стая" #: gajim/dialogs.py:3185 gajim/notify.py:93 #: gajim/common/connection_handlers_events.py:2815 msgid "Contact Changed Status" msgstr "Контактът промени състоянието си" #: gajim/dialogs.py:3404 #, python-format msgid "Single Message using account %s" msgstr "Еднократно съобщение с акаунт „%s“" #: gajim/dialogs.py:3406 #, python-format msgid "Single Message in account %s" msgstr "Еднократно съобщение за акаунт „%s“" #: gajim/dialogs.py:3408 msgid "Single Message" msgstr "Еднократно съобщение" #: gajim/dialogs.py:3411 #, python-format msgid "Send %s" msgstr "Изпращане на %s" #: gajim/dialogs.py:3434 #, python-format msgid "Received %s" msgstr "Получено %s" #: gajim/dialogs.py:3457 #, python-format msgid "Form %s" msgstr "От %s" #: gajim/dialogs.py:3485 gajim/dialogs.py:3672 msgid "Connection not available" msgstr "В момента няма връзка" #: gajim/dialogs.py:3486 gajim/dialogs.py:3673 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Уверете се, че сте свързани към „%s“." #: gajim/dialogs.py:3517 gajim/dialog_messages.py:43 #, fuzzy, python-format msgid "It is not possible to send a message to %s, this JID is not valid." msgstr "Не е възможно да бъдат изпращани празни файлове" #: gajim/dialogs.py:3540 #, python-format msgid "RE: %s" msgstr "Относно: %s" #: gajim/dialogs.py:3541 #, python-format msgid "%s wrote:\n" msgstr "%s написа:\n" #: gajim/dialogs.py:3589 gajim/data/gui/shortcuts_window.ui:113 #, fuzzy msgid "Clear" msgstr "Чистя" #: gajim/dialogs.py:3594 #, fuzzy msgid "Filter" msgstr "Филтър:" #: gajim/dialogs.py:3599 #, fuzzy msgid "XML Input" msgstr "Вход в XML формат" #: gajim/dialogs.py:3603 #, fuzzy msgid "Send" msgstr "_Изпращане" #: gajim/dialogs.py:3794 #, fuzzy msgid "add" msgstr "Тъжен" #: gajim/dialogs.py:3794 #, fuzzy msgid "modify" msgstr "Унил" #: gajim/dialogs.py:3795 #, fuzzy msgid "remove" msgstr "П_ремахване" #: gajim/dialogs.py:3824 #, fuzzy, python-format msgid "" "%(jid)s would like you to %(action)s some contacts in your " "roster." msgstr "Бих искал(а) да ви добавя към списъка си." #: gajim/dialogs.py:3840 gajim/dialogs.py:3886 gajim/accounts_window.py:44 msgid "Add" msgstr "" #: gajim/dialogs.py:3842 gajim/dialogs.py:3917 #, fuzzy msgid "Modify" msgstr "Унил" #: gajim/dialogs.py:3844 gajim/dialogs.py:3941 msgid "Delete" msgstr "Изтриване" #: gajim/dialogs.py:3854 #, fuzzy msgid "Groups" msgstr "Група" #: gajim/dialogs.py:3962 #, fuzzy, python-format msgid "%s suggested me to add you in my roster." msgstr "" "Бих искал(а) да ви добавя към списъка си. I would like to add you to my " "roster." #: gajim/dialogs.py:3976 #, fuzzy, python-format msgid "Added %d contact" msgid_plural "Added %d contacts" msgstr[0] "Добавяне на _контакт" msgstr[1] "Добавяне на _контакт" #: gajim/dialogs.py:4014 #, fuzzy, python-format msgid "Removed %d contact" msgid_plural "Removed %d contacts" msgstr[0] "Премахване на контакт от списъка" msgstr[1] "Премахване на контакт от списъка" #: gajim/dialogs.py:4040 #, python-format msgid "Archiving Preferences for %s" msgstr "" #: gajim/dialogs.py:4078 msgid "Success!" msgstr "" #: gajim/dialogs.py:4078 #, fuzzy msgid "Your Archiving Preferences have been saved!" msgstr "_Настройки" #: gajim/dialogs.py:4094 msgid "We got no response from the Server" msgstr "" #: gajim/dialogs.py:4096 #, fuzzy msgid "We received an error: {}" msgstr "Услугата върна грешка." #: gajim/dialogs.py:4100 #, fuzzy msgid "Error!" msgstr "Грешка." #: gajim/dialogs.py:4159 #, fuzzy msgid "Add JID" msgstr "Jabber ID:" #: gajim/dialogs.py:4232 #, python-format msgid "Privacy List %s" msgstr "Филтър за уединение %s" #: gajim/dialogs.py:4236 #, python-format msgid "Privacy List for %s" msgstr "Филтър за уединение за %s" #: gajim/dialogs.py:4238 gajim/data/gui/privacy_list_window.ui:47 msgid "Privacy List" msgstr "Филтър за уединение" #: gajim/dialogs.py:4309 #, python-format msgid "Order: %(order)s, action: %(action)s, type: %(type)s, value: %(value)s" msgstr "" "Ред: %(order)s, действие: %(action)s, вид: %(type)s, стойност: %(value)s" #: gajim/dialogs.py:4314 #, python-format msgid "Order: %(order)s, action: %(action)s" msgstr "Ред: %(order)s, действие: %(action)s" #: gajim/dialogs.py:4368 msgid "Edit a rule" msgstr "Редактиране на правило" #: gajim/dialogs.py:4480 msgid "Add a rule" msgstr "Добавяне на правило" #: gajim/dialogs.py:4581 #, python-format msgid "Privacy Lists for %s" msgstr "Филтри за уединение за %s" #: gajim/dialogs.py:4677 msgid "Invalid List Name" msgstr "Невалидно име на филтър" #: gajim/dialogs.py:4678 msgid "You must enter a name to create a privacy list." msgstr "Трябва да въведете име, за да се създаде филтър за уединение." #: gajim/dialogs.py:4714 msgid "You are invited to a groupchat" msgstr "Поканени сте в стая." #: gajim/dialogs.py:4717 msgid "$Contact has invited you to join a discussion" msgstr "$Contact ви покани да се присъедините към дискусия" #: gajim/dialogs.py:4719 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "$Contact ви покани в стая %(room_jid)s." #: gajim/dialogs.py:4728 #, python-format msgid "Comment: %s" msgstr "Коментар: %s" #: gajim/dialogs.py:4730 msgid "Do you want to accept the invitation?" msgstr "Искате ли да приемете поканата?" #: gajim/dialogs.py:4746 msgid "Reason (if you decline):" msgstr "" #: gajim/dialogs.py:4795 msgid "Choose Client Cert #PCKS12" msgstr "" #: gajim/dialogs.py:4811 gajim/accounts_window.py:657 msgid "PKCS12 Files" msgstr "" #: gajim/dialogs.py:4837 msgid "Choose Sound" msgstr "Избор на звук" #: gajim/dialogs.py:4853 msgid "Wav Sounds" msgstr "Формат WAV" #: gajim/dialogs.py:4883 msgid "Choose Image" msgstr "Избор на изображение" #: gajim/dialogs.py:4901 msgid "Images" msgstr "Изображения" #: gajim/dialogs.py:4972 #, fuzzy msgid "Choose Archive" msgstr "Избор на изображение" #: gajim/dialogs.py:4991 #, fuzzy msgid "Zip files" msgstr "Всички файлове" #: gajim/dialogs.py:5017 #, python-format msgid "When %s becomes:" msgstr "Когато %s стане:" #: gajim/dialogs.py:5019 #, python-format msgid "Adding Special Notification for %s" msgstr "Добавяне на специално уведомление за %s" #: gajim/dialogs.py:5259 msgid "an audio and video" msgstr "" #: gajim/dialogs.py:5261 msgid "an audio" msgstr "" #: gajim/dialogs.py:5263 msgid "a video" msgstr "" #: gajim/dialogs.py:5267 #, python-format msgid "" "%(contact)s wants to start %(type)s session with you. Do you want to answer " "the call?" msgstr "" #: gajim/dialogs.py:5372 gajim/dialogs.py:5408 #, fuzzy, python-format msgid "Certificate for account %s" msgstr "за акаунт „%s“" #: gajim/dialogs.py:5372 #, python-format msgid "" "Issued to:\n" "Common Name (CN): %(scn)s\n" "Organization (O): %(sorg)s\n" "Organizationl Unit (OU): %(sou)s\n" "Serial Number: %(sn)s\n" "\n" "Issued by:\n" "Common Name (CN): %(icn)s\n" "Organization (O): %(iorg)s\n" "Organizationl Unit (OU): %(iou)s\n" "\n" "Validity:\n" "Issued on: %(io)s\n" "Expires on: %(eo)s\n" "\n" "Fingerprint\n" "SHA-1 Fingerprint: %(sha1)s\n" "\n" "SHA256 Fingerprint: %(sha256)s\n" msgstr "" #: gajim/dialogs.py:5419 gajim/gui_interface.py:1405 #, fuzzy, python-format msgid "SSL Certificate Verification for %s" msgstr "Грешка в сертификата на SSL" #: gajim/dialogs.py:5420 gajim/dialogs.py:5437 msgid "View cert…" msgstr "" #: gajim/dialogs.py:5453 gajim/data/gui/application_menu.ui:32 #, fuzzy msgid "File Transfer" msgstr "Файлови трансфери" #: gajim/dialogs.py:5477 msgid "Requesting HTTP Upload Slot..." msgstr "" #: gajim/dialogs.py:5481 msgid "Uploading file via HTTP File Upload..." msgstr "" #: gajim/dialogs.py:5485 #, fuzzy msgid "Encrypting file..." msgstr "Шифрирането чрез E2E е изключено" #: gajim/groupchat_control.py:193 gajim/groupchat_control.py:1839 #, python-format msgid "%(nick)s is now known as %(new_nick)s" msgstr "%(nick)s вече е познат като %(new_nick)s" #: gajim/groupchat_control.py:219 gajim/groupchat_control.py:1988 #: gajim/history_window.py:550 gajim/common/connection_handlers_events.py:2811 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s вече е %(status)s" #: gajim/groupchat_control.py:248 msgid "Sending private message failed" msgstr "Неуспех при изпращането на лично съобщение" #: gajim/groupchat_control.py:250 #, python-format msgid "You are no longer in group chat \"%(room)s\" or \"%(nick)s\" has left." msgstr "Вече не сте в стая „%(room)s“ или „%(nick)s“ е напуснал(а)." #: gajim/groupchat_control.py:640 gajim/chat_control.py:326 #: gajim/chat_control.py:330 msgid "HTTP File Upload" msgstr "" #: gajim/groupchat_control.py:642 #, fuzzy msgid "HTTP File Upload not supported by your server" msgstr "Сървърът ви няма поддръжка за мета-контакти" #: gajim/groupchat_control.py:662 gajim/groupchat_control.py:2370 msgid "Changing Subject" msgstr "Промяна на темата" #: gajim/groupchat_control.py:663 gajim/groupchat_control.py:2371 msgid "Please specify the new subject:" msgstr "Въведете новата тема:" #: gajim/groupchat_control.py:670 msgid "Changing Nickname" msgstr "Промяна на псевдонима" #: gajim/groupchat_control.py:671 msgid "Please specify the new nickname you want to use:" msgstr "Въведете новия псевдоним, който искате да използвате:" #: gajim/groupchat_control.py:688 #, fuzzy msgid "Invalid group chat JID" msgstr "Невалиден Jabber ID на стая" #: gajim/groupchat_control.py:689 #, fuzzy msgid "The group chat JID has not allowed characters." msgstr "Jabber ID на стаята съдържа непозволени знаци." #: gajim/groupchat_control.py:699 #, python-format msgid "Destroying %s" msgstr "Унищожаване на %s" #: gajim/groupchat_control.py:700 #, fuzzy msgid "" "You are going to remove this room permanently.\n" "You may specify a reason below:" msgstr "" "Определено сте на път да унищожите тази стая.\n" "Може да укажете причина по-долу:" #: gajim/groupchat_control.py:702 msgid "You may also enter an alternate venue:" msgstr "Може да въведете и друго място за срещи:" #: gajim/groupchat_control.py:880 msgid "Insert Nickname" msgstr "Въведете псевдоним" #: gajim/groupchat_control.py:1062 gajim/chat_control.py:803 msgid "and authenticated" msgstr "и удостоверяването е успешно" #: gajim/groupchat_control.py:1066 gajim/chat_control.py:807 msgid "and NOT authenticated" msgstr "и удостоверяването НЕ Е успешно" #: gajim/groupchat_control.py:1070 gajim/chat_control.py:811 #, fuzzy, python-format msgid "%(type)s encryption is active %(authenticated)s." msgstr "" "Шифрирането чрез %(type)s %(status)s включено %(authenticated)s.\n" "%(logged)s се запазва дневник за сесията." #: gajim/groupchat_control.py:1113 msgid "Conversation with " msgstr "Разговор с " #: gajim/groupchat_control.py:1115 msgid "Continued conversation" msgstr "Продължен разговор" #: gajim/groupchat_control.py:1473 #, fuzzy, python-format msgid "%(nick)s has set the subject to %(subject)s" msgstr "%(jid)s зададе темата на %(subject)s" #: gajim/groupchat_control.py:1496 gajim/groupchat_control.py:1781 msgid "Any occupant is allowed to see your full JID" msgstr "На всеки участник е позволено да вижда вашия JID" #: gajim/groupchat_control.py:1499 #, fuzzy msgid "Room now shows unavailable members" msgstr "Стаята показва отсъстващ член" #: gajim/groupchat_control.py:1501 #, fuzzy msgid "Room now does not show unavailable members" msgstr "Стаята не показва отсъстващи членове" #: gajim/groupchat_control.py:1503 msgid "A setting not related to privacy has been changed" msgstr "" #: gajim/groupchat_control.py:1507 msgid "Room logging is now enabled" msgstr "Воденето на дневник на стаята е включено" #: gajim/groupchat_control.py:1509 msgid "Room logging is now disabled" msgstr "Воденето на дневник на стаята е изключено" #: gajim/groupchat_control.py:1511 msgid "Room is now non-anonymous" msgstr "Стаята не е анонимна" #: gajim/groupchat_control.py:1514 msgid "Room is now semi-anonymous" msgstr "Стаята е полу-анонимна" #: gajim/groupchat_control.py:1517 #, fuzzy msgid "Room is now fully anonymous" msgstr "Стаята е напълно анонимна" #: gajim/groupchat_control.py:1557 gajim/chat_control.py:1268 #, python-format msgid "Pong! (%s s.)" msgstr "Понг! (%s сек)" #: gajim/groupchat_control.py:1774 gajim/groupchat_control.py:2398 #: gajim/roster_window.py:3129 gajim/gui_interface.py:621 #, fuzzy, python-format msgid "%(jid)s has been invited in this room" msgstr "%(nick)s беше изритан от стаята (%(reason)s)" #: gajim/groupchat_control.py:1786 msgid "Room logging is enabled" msgstr "Воденето на дневник на стаята е включено" #: gajim/groupchat_control.py:1788 msgid "A new room has been created" msgstr "Беше създадена нова стая" #: gajim/groupchat_control.py:1791 msgid "The server has assigned or modified your roomnick" msgstr "Сървърът назначи или промени псевдонима ви в стаята" #: gajim/groupchat_control.py:1797 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s беше изритан: %(reason)s" #: gajim/groupchat_control.py:1800 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(nick)s беше изритан от %(who)s: %(reason)s" #: gajim/groupchat_control.py:1809 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s беше отлъчен: %(reason)s" #: gajim/groupchat_control.py:1812 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(nick)s беше отлъчен от %(who)s: %(reason)s" #: gajim/groupchat_control.py:1823 gajim/groupchat_control.py:1907 #, python-format msgid "You are now known as %s" msgstr "Вече сте познати като %s" #: gajim/groupchat_control.py:1861 gajim/groupchat_control.py:1866 #: gajim/groupchat_control.py:1872 #, python-format msgid "%(nick)s has been removed from the room (%(reason)s)" msgstr "%(nick)s беше изритан от стаята (%(reason)s)" #: gajim/groupchat_control.py:1863 msgid "affiliation changed" msgstr "рангът е променен" #: gajim/groupchat_control.py:1868 msgid "room configuration changed to members-only" msgstr "Конфигурацията на стаята бе променена на „само за членове“" #: gajim/groupchat_control.py:1874 msgid "system shutdown" msgstr "Изключване на системата" #: gajim/groupchat_control.py:1928 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s by %(actor)s" msgstr "** Рангът на %(nick)s бе зададен на %(affiliation)s от %(actor)s" #: gajim/groupchat_control.py:1932 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s" msgstr "** Рангът на %(nick)s бе зададен на %(affiliation)s" #: gajim/groupchat_control.py:1947 #, python-format msgid "** Role of %(nick)s has been set to %(role)s by %(actor)s" msgstr "** Ролята на %(nick)s бе зададена на %(role)s от %(actor)s" #: gajim/groupchat_control.py:1951 #, python-format msgid "** Role of %(nick)s has been set to %(role)s" msgstr "** Ролята на %(nick)s бе зададена на %(role)s" #: gajim/groupchat_control.py:1981 #, python-format msgid "%s has left" msgstr "%s напусна" #: gajim/groupchat_control.py:1986 #, python-format msgid "%s has joined the group chat" msgstr "%s влезе в стаята" #: gajim/groupchat_control.py:2329 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Сигурни ли сте, че искате да напуснете стаята „%s“?" #: gajim/groupchat_control.py:2331 msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "Ако затворите този прозорец, връзката със стаята ще бъде прекъсната." #: gajim/groupchat_control.py:2550 #, python-format msgid "Kicking %s" msgstr "Изритване на %s" #: gajim/groupchat_control.py:2551 gajim/groupchat_control.py:2847 msgid "You may specify a reason below:" msgstr "Може да уточните причина по-долу:" #: gajim/groupchat_control.py:2846 #, python-format msgid "Banning %s" msgstr "Отлъчване на %s" #: gajim/chat_control.py:328 gajim/chat_control.py:332 #, fuzzy msgid "Jingle File Transfer" msgstr "Файлови трансфери" #: gajim/chat_control.py:334 #, fuzzy msgid "No File Transfer available" msgstr "Файлови трансфери" #: gajim/chat_control.py:395 #, fuzzy msgid "Show a list of formattings" msgstr "Списък с емотикони (Alt+M)" #: gajim/chat_control.py:399 msgid "Formatting is not available so long as GPG is active" msgstr "" #: gajim/chat_control.py:402 #, fuzzy msgid "This contact does not support HTML" msgstr "Списък с активни, завършили и прекъснати файлови трансфери" #: gajim/chat_control.py:514 #, python-format msgid "%(type)s state : %(state)s, reason: %(reason)s" msgstr "" #: gajim/chat_control.py:655 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s от стая %(room_name)s" #: gajim/chat_control.py:903 msgid "Session negotiation cancelled" msgstr "Договорката за сесията отменена" #: gajim/chat_control.py:913 msgid "This session WILL be archived on server" msgstr "" #: gajim/chat_control.py:915 #, fuzzy msgid "This session WILL NOT be archived on server" msgstr "НЯМА да се запазва дневник за сесията" #: gajim/chat_control.py:924 msgid "This session is encrypted" msgstr "Тази сесия е шифрирана" #: gajim/chat_control.py:927 msgid " and WILL be logged" msgstr " и ЩЕ СЕ запазва дневник" #: gajim/chat_control.py:929 msgid " and WILL NOT be logged" msgstr " и НЯМА да се запазва дневник" #: gajim/chat_control.py:934 msgid "" "Remote contact's identity not verified. Click the shield button for more " "details." msgstr "" "Идентичността на отсрещния контакт не е потвърдена. Натиснете бутона със " "щита за повече информация." #: gajim/chat_control.py:936 msgid "E2E encryption disabled" msgstr "Шифрирането чрез E2E е изключено" #: gajim/chat_control.py:1235 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Току-що получихте ново съобщение от „%s“" #: gajim/chat_control.py:1237 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." msgstr "" "Ако затворите този прозорец и нямате включена опция за запазване на " "историята, съобщението ще бъде загубено." #: gajim/chat_control.py:1380 #, python-format msgid "" "Subject: %(subject)s\n" "%(message)s" msgstr "" "Тема: %(subject)s\n" "%(message)s" #: gajim/chat_control.py:1494 gajim/gui_interface.py:1197 #, python-format msgid "" "Unable to decrypt message from %s\n" "It may have been tampered with." msgstr "" "Неуспех при дешифрирането на съобщение от %s\n" "Възможно е да е било фалшифицирано." #: gajim/chat_control.py:1532 #, python-format msgid "%(name)s is now %(status)s" msgstr "%(name)s вече е %(status)s" #: gajim/chat_control.py:1591 #, fuzzy msgid "File transfer" msgstr "Файлови трансфери" #: gajim/chat_control.py:1594 #, fuzzy msgid "Size" msgstr "Размер: %s" #: gajim/chat_control.py:1596 #, fuzzy msgid "Accept" msgstr "_Акаунти" #: gajim/chat_control.py:1650 gajim/disco.py:1753 msgid "_Join" msgstr "_Влизане" #: gajim/chat_control.py:1669 gajim/roster_window.py:1991 #: gajim/gui_interface.py:1013 #, fuzzy msgid "Remote contact stopped transfer" msgstr "Премахване на контакт от списъка" #: gajim/chat_control.py:1671 gajim/roster_window.py:1993 #: gajim/gui_interface.py:1016 #, fuzzy msgid "Error opening file" msgstr "Грешка при четене на файл:" #: gajim/roster_window.py:273 gajim/roster_window.py:1074 msgid "Merged accounts" msgstr "Смесени акаунти" #: gajim/roster_window.py:857 gajim/roster_window.py:1757 #: gajim/roster_window.py:1759 gajim/roster_window.py:2602 #: gajim/roster_window.py:5125 gajim/message_window.py:519 #: gajim/common/contacts.py:133 gajim/common/commands.py:230 #: gajim/common/helpers.py:95 msgid "Groupchats" msgstr "Стаи" #: gajim/roster_window.py:896 gajim/roster_window.py:1665 #: gajim/roster_window.py:1698 gajim/roster_window.py:1749 #: gajim/roster_window.py:1751 gajim/roster_window.py:1912 #: gajim/roster_window.py:2575 gajim/roster_window.py:5155 gajim/disco.py:130 #: gajim/disco.py:131 gajim/disco.py:1460 gajim/common/contacts.py:135 #: gajim/common/contacts.py:378 gajim/common/helpers.py:95 msgid "Transports" msgstr "Транспорти" #: gajim/roster_window.py:2045 #, fuzzy msgid "Authorization sent" msgstr "Упълномощаването беше изпратено" #: gajim/roster_window.py:2046 #, fuzzy, python-format msgid "\"%s\" will now see your status." msgstr "„%s“ вече ще знае състоянието ви." #: gajim/roster_window.py:2069 msgid "Subscription request has been sent" msgstr "Искането за записване беше изпратено" #: gajim/roster_window.py:2070 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Ако „%s“ приеме това запитване, ще знаете за състоянието му." #: gajim/roster_window.py:2084 #, fuzzy msgid "Authorization removed" msgstr "Упълномощаването беше прекратено" #: gajim/roster_window.py:2085 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "„%s“ винаги ще ви вижда като изключен." #: gajim/roster_window.py:2109 #, fuzzy msgid "OpenPGP is not usable" msgstr "GPG не е използваем" #: gajim/roster_window.py:2110 #, python-format msgid "" "Gajim needs python-gnupg >= 0.3.8\n" "Beware there is an incompatible python package called gnupg.\n" "You will be connected to %s without OpenPGP." msgstr "" #: gajim/roster_window.py:2318 gajim/roster_window.py:3625 msgid "You are participating in one or more group chats" msgstr "Участвате в една или повече стаи" #: gajim/roster_window.py:2319 gajim/roster_window.py:3626 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" msgstr "" "Промяната на състоянието до „Невидим“ ще ви изключи от тези стаи. Сигурни ли " "сте, че искате да станете „Невидим“?" #: gajim/roster_window.py:2346 msgid "desync'ed" msgstr "без синхронизация" #: gajim/roster_window.py:2416 msgid "Really quit Gajim?" msgstr "" #: gajim/roster_window.py:2417 #, fuzzy msgid "Are you sure you want to quit Gajim?" msgstr "Сигурни ли сте, че искате да напуснете стаята „%s“?" #: gajim/roster_window.py:2418 msgid "Always close Gajim" msgstr "" #: gajim/roster_window.py:2505 #, fuzzy msgid "You have running file transfers" msgstr "Отменя файловия трансфер" #: gajim/roster_window.py:2506 msgid "" "If you quit now, the file(s) being transferred will be stopped. Do you still " "want to quit?" msgstr "" #: gajim/roster_window.py:2537 gajim/roster_window.py:2828 msgid "You have unread messages" msgstr "Имате непрочетени съобщения" #: gajim/roster_window.py:2538 msgid "" "Messages will only be available for reading them later if you have history " "enabled and contact is in your roster." msgstr "" "Може да преглеждате съобщенията по-късно само ако е активирана опцията за " "историята и контактът е в списъка." #: gajim/roster_window.py:2829 msgid "You must read them before removing this transport." msgstr "Трябва да ги прочетете преди да премахнете този транспорт." #: gajim/roster_window.py:2832 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Транспортът „%s“ ще бъде премахнат" #: gajim/roster_window.py:2833 msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." msgstr "" "Вече няма да можете да получавате и изпращате съобщения до контакти чрез " "този транспорт." #: gajim/roster_window.py:2836 msgid "Transports will be removed" msgstr "Ще бъдат премахнати транспорти" #: gajim/roster_window.py:2841 #, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " "these transports: %s" msgstr "" "Вече няма да можете да получавате и изпращате съобщения до контакти чрез " "тези транспорти: %s" #: gajim/roster_window.py:2892 #, fuzzy msgid "You are about to block a contact. Are you sure you want to continue?" msgstr "" "На път сте да създадете мета-контакт. Сигурни ли сте, че искате да " "продължите?" #: gajim/roster_window.py:2894 msgid "" "This contact will see you offline and you will not receive messages it sends " "you." msgstr "" #: gajim/roster_window.py:2934 msgid "Rename Contact" msgstr "Преименуване на контакт" #: gajim/roster_window.py:2935 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Въведете нов псевдоним за контакт „%s“" #: gajim/roster_window.py:2942 msgid "Rename Group" msgstr "Преименуване на група" #: gajim/roster_window.py:2943 #, python-format msgid "Enter a new name for group %s" msgstr "Въведете ново име за група „%s“" #: gajim/roster_window.py:2988 msgid "Remove Group" msgstr "Премахване на група" #: gajim/roster_window.py:2989 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Искате ли да премахнете групата „%s“ от списъка?" #: gajim/roster_window.py:2990 msgid "Also remove all contacts in this group from your roster" msgstr "Премахване от списъка и на всички контакти в тази група" #: gajim/roster_window.py:3029 msgid "Assign OpenPGP Key" msgstr "Задаване на OpenPGP ключ" #: gajim/roster_window.py:3030 msgid "Select a key to apply to the contact" msgstr "Изберете ключ за този контакт" #: gajim/roster_window.py:3436 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Контактът „%s“ ще бъде премахнат от списъка ви" #: gajim/roster_window.py:3438 #, python-format msgid "You are about to remove \"%(name)s\" (%(jid)s) from your roster.\n" msgstr "" #: gajim/roster_window.py:3443 #, fuzzy msgid "" "By removing this contact you also remove authorization resulting in them " "always seeing you as offline." msgstr "" "Премахвайки тези контакти: %s\n" "прекратявате и упълномощаването, така че винаги ще ви виждат изключен(а)." #: gajim/roster_window.py:3449 msgid "Do you want to continue?" msgstr "Искате ли да продължите?" #: gajim/roster_window.py:3453 #, fuzzy msgid "" "By removing this contact you also by default remove authorization resulting " "in them always seeing you as offline." msgstr "" "Премахвайки този контакт, прекратявате и упълномощаването. Контактът винаги " "ще ви вижда изключен." #: gajim/roster_window.py:3456 msgid "I want this contact to know my status after removal" msgstr "Искам този контакт да вижда състоянието ми след премахването" #: gajim/roster_window.py:3460 msgid "Contacts will be removed from your roster" msgstr "Ще бъдат премахнати контакти от списъка" #: gajim/roster_window.py:3465 #, python-format msgid "" "By removing these contacts:%s\n" "you also remove authorization resulting in them always seeing you as offline." msgstr "" "Премахвайки тези контакти: %s\n" "прекратявате и упълномощаването, така че винаги ще ви виждат изключен(а)." #: gajim/roster_window.py:3523 #, fuzzy msgid "" "You are about to send a custom status. Are you sure you want to continue?" msgstr "" "На път сте да създадете мета-контакт. Сигурни ли сте, че искате да " "продължите?" #: gajim/roster_window.py:3525 #, python-format msgid "" "This contact will temporarily see you as %(status)s, but only until you " "change your status. Then they will see your global status." msgstr "" #: gajim/roster_window.py:3544 msgid "No account available" msgstr "Няма наличен акаунт" #: gajim/roster_window.py:3545 msgid "You must create an account before you can chat with other contacts." msgstr "" "За да разговаряте с други контакти, първо трябва да създадете Джабър акаунт." #: gajim/roster_window.py:3676 gajim/gui_interface.py:2065 #: gajim/dialog_messages.py:64 msgid "You cannot join a group chat while you are invisible" msgstr "Не може да влезете в стая, докато сте невидими." #: gajim/roster_window.py:4178 msgid "Metacontacts storage not supported by your server" msgstr "Сървърът ви няма поддръжка за мета-контакти" #: gajim/roster_window.py:4180 #, fuzzy msgid "" "Your server does not support storing metacontacts information. So this " "information will not be saved on next reconnection." msgstr "" "Вашият сървър не поддържа съхраняването на информация за мета-контакти, така " "че тази информация няма да се запази при следващото свързване." #: gajim/roster_window.py:4276 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "" "На път сте да създадете мета-контакт. Сигурни ли сте, че искате да " "продължите?" #: gajim/roster_window.py:4278 #, fuzzy msgid "" "Metacontacts are a way to regroup several contacts in one line. Generally it " "is used when the same person has several XMPP accounts or transport accounts." msgstr "" "Мета-контактите са начин за прегрупиране на няколко контакта на един ред. " "Основно се използва, когато един и същ потребител има няколко акаунта за " "Джабър или акаунти за транспорти." #: gajim/roster_window.py:4400 msgid "Invalid file URI:" msgstr "Невалиден адрес на файл:" #: gajim/roster_window.py:4412 #, python-format msgid "Do you want to send this file to %s:" msgid_plural "Do you want to send these files to %s:" msgstr[0] "Искате ли да изпратите този файл на %s:" msgstr[1] "Искате ли да изпратите тези файлове на %s:" #: gajim/roster_window.py:4552 #, fuzzy, python-format msgid "Send %(from)s to %(to)s" msgstr "Изпращане на %s" #: gajim/roster_window.py:4565 #, fuzzy, python-format msgid "Make %s first contact" msgstr "Изпращане на файл до контакт" #: gajim/roster_window.py:4570 #, fuzzy, python-format msgid "Make %(contact1)s and %(contact2)s metacontacts" msgstr "Изпращане на файл до контакт" #: gajim/roster_window.py:4951 gajim/roster_window.py:5049 msgid "_Change Status Message" msgstr "Пром_яна на съобщението за състояние" #: gajim/roster_window.py:4971 msgid "Publish Tune" msgstr "Публикуване на мелодия" #: gajim/roster_window.py:4982 #, fuzzy msgid "Publish Location" msgstr "Публикуване на мелодия" #: gajim/roster_window.py:4994 #, fuzzy msgid "Configure Services…" msgstr "Настройване на услуги…" #: gajim/roster_window.py:5127 msgid "_Maximize All" msgstr "_Максимизиране на всички" #: gajim/roster_window.py:5134 gajim/roster_window.py:5296 msgid "Send Group M_essage" msgstr "_Изпращане на групово съобщение" #: gajim/roster_window.py:5141 msgid "To all users" msgstr "До всички потребители" #: gajim/roster_window.py:5145 msgid "To all online users" msgstr "До всички включени потребители" #: gajim/roster_window.py:5157 gajim/roster_window.py:5302 #: gajim/data/gui/gc_occupants_menu.ui:110 #: gajim/data/gui/contact_context_menu.ui:36 msgid "In_vite to" msgstr "По_кана в" #: gajim/roster_window.py:5312 msgid "_Manage Contacts" msgstr "_Управление на контакти" #: gajim/roster_window.py:5318 #, fuzzy msgid "Edit _Groups…" msgstr "Редактиране на _групи" #: gajim/roster_window.py:5339 gajim/data/gui/filetransfers.ui:11 #: gajim/data/gui/remove_account_window.ui:137 msgid "_Remove" msgstr "_Премахване" #: gajim/roster_window.py:5377 msgid "_Maximize" msgstr "_Максимизиране" #: gajim/roster_window.py:5384 #, fuzzy msgid "_Reconnect" msgstr "_Изключване" #: gajim/roster_window.py:5389 gajim/data/gui/gc_control_popup_menu.ui:120 msgid "_Disconnect" msgstr "_Изключване" #: gajim/roster_window.py:5405 gajim/data/gui/gc_occupants_menu.ui:170 #: gajim/data/gui/gc_control_popup_menu.ui:113 #: gajim/data/gui/contact_context_menu.ui:228 msgid "_History" msgstr "Ист_ория" #: gajim/roster_window.py:5481 gajim/data/gui/application_menu.ui:86 msgid "History Manager" msgstr "Мениджър на историята" #: gajim/roster_window.py:5489 msgid "_Join New Group Chat" msgstr "_Влизане в нова стая" #: gajim/gajim.py:74 #, fuzzy msgid "Show the application's version" msgstr "Демон за уведомления" #: gajim/gajim.py:77 #, fuzzy msgid "Show only critical errors" msgstr "Показване на събитието в спис_ъка" #: gajim/gajim.py:80 msgid "Separate profile files completely (even history db and plugins)" msgstr "" #: gajim/gajim.py:84 msgid "Print XML stanzas and other debug information" msgstr "" #: gajim/gajim.py:88 #, fuzzy msgid "Use defined profile in configuration directory" msgstr "Редактор на настройки за напреднали" #: gajim/gajim.py:92 #, fuzzy msgid "Set configuration directory" msgstr "Настройки на стаята" #: gajim/gajim.py:95 msgid "Configure logging system" msgstr "" #: gajim/gajim.py:98 #, fuzzy msgid "Show all warnings" msgstr "Показване на всички _чакащи събития" #: gajim/gajim.py:101 msgid "Open IPython shell" msgstr "" #: gajim/gajim.py:104 msgid "Pops up a window with the next pending event" msgstr "Показва следващото чакащо събитие в изскачащ прозорец" #: gajim/gajim.py:107 gajim/data/gui/shortcuts_window.ui:202 #, fuzzy msgid "Start a new chat" msgstr "Започване на разговор" #: gajim/gajim.py:180 gajim/gui_interface.py:128 msgid "Database Error" msgstr "Грешка в базата от данни" #: gajim/history_sync.py:217 #, fuzzy msgid "How far back do you want to go?" msgstr "Какво искате да направите?" #: gajim/history_sync.py:222 msgid "One Month" msgstr "" #: gajim/history_sync.py:223 msgid "Three Months" msgstr "" #: gajim/history_sync.py:224 msgid "One Year" msgstr "" #: gajim/history_sync.py:225 msgid "Everything" msgstr "" #: gajim/history_sync.py:254 #, fuzzy msgid "Connecting..." msgstr "Свързване" #: gajim/history_sync.py:266 #, fuzzy, python-format msgid "%(received)s of %(max)s" msgstr "Файловият трансфер на %(filename)s от %(name)s прекъсна." #: gajim/history_sync.py:270 #, fuzzy, python-format msgid "Downloaded %s Messages" msgstr "Препращане на непрочетени съобщения" #: gajim/history_sync.py:290 #, python-brace-format msgid "" "\n" " Finshed synchronising your History.\n" " {received} Messages downloaded.\n" " " msgstr "" #: gajim/history_sync.py:297 msgid "" "\n" " Gajim is fully synchronised\n" " with the Archive.\n" " " msgstr "" #: gajim/history_sync.py:304 msgid "" "\n" " There is already a synchronisation in\n" " progress. Please try later.\n" " " msgstr "" #: gajim/config.py:150 gajim/config.py:156 gajim/config.py:616 #: gajim/data/gui/preferences_window.ui:68 #: gajim/data/gui/preferences_window.ui:85 msgid "Disabled" msgstr "Изключени" #: gajim/config.py:411 gajim/config.py:415 gajim/config.py:1942 msgid "Default" msgstr "По подразбиране" #: gajim/config.py:1128 msgid "status message title" msgstr "заглавие на съобщението за състояние" #: gajim/config.py:1129 msgid "status message text" msgstr "текст на съобщението за състояние" #: gajim/config.py:1517 #, python-format msgid "Edit %s" msgstr "Редактиране на %s" #: gajim/config.py:1519 #, python-format msgid "Register to %s" msgstr "Регистриране в %s" #: gajim/config.py:1555 msgid "Ban List" msgstr "Списък с отлъчени" #: gajim/config.py:1556 msgid "Member List" msgstr "Списък с членове" #: gajim/config.py:1556 msgid "Owner List" msgstr "Списък със собственици" #: gajim/config.py:1557 msgid "Administrator List" msgstr "Списък с администратори" #: gajim/config.py:1631 msgid "Reason" msgstr "Причина" #: gajim/config.py:1638 msgid "Nick" msgstr "Псевдоним" #: gajim/config.py:1644 msgid "Role" msgstr "Роля" #: gajim/config.py:1670 #, fuzzy msgid "Banning…" msgstr "Отлъчване…" #: gajim/config.py:1672 msgid "" "Whom do you want to ban?\n" "\n" msgstr "" "Кого искате да отлъчите?\n" "\n" #: gajim/config.py:1674 #, fuzzy msgid "Adding Member…" msgstr "Добавяне на член…" #: gajim/config.py:1675 msgid "" "Whom do you want to make a member?\n" "\n" msgstr "" "Кого искате да направите член?\n" "\n" #: gajim/config.py:1677 #, fuzzy msgid "Adding Owner…" msgstr "Добавяне на собственик…" #: gajim/config.py:1678 msgid "" "Whom do you want to make an owner?\n" "\n" msgstr "" "Кого искате да направите собственик?\n" "\n" #: gajim/config.py:1680 #, fuzzy msgid "Adding Administrator…" msgstr "Добавяне на администратор…" #: gajim/config.py:1681 msgid "" "Whom do you want to make an administrator?\n" "\n" msgstr "" "Кого искате да направите администратор?\n" "\n" #: gajim/config.py:1682 #, fuzzy msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" "2. user@domain (any resource matches).\n" "3. domain/resource (only that resource matches).\n" "4. domain (the domain itself matches, as does any user@domain,\n" "domain/resource, or address containing a subdomain)." msgstr "" "Може да бъде едно от следните:\n" "1. потребител@домейн/ресурс (само този ресурс съвпада).\n" "2. потребител@домейн (всеки ресурс съвпада).\n" "3. домейн/ресурс (само този ресурс съвпада).\n" "4. домейн (домейна съвпада, както и всеки потребител@домейн,\n" "домейн/ресурс или адрес, съдържащ под-домейн." #: gajim/config.py:1783 #, python-format msgid "Removing %s account" msgstr "Премахване на акаунт „%s“" #: gajim/config.py:1798 #, fuzzy msgid "Account is disabled" msgstr "Емотиконите са изключени" #: gajim/config.py:1799 msgid "To unregister from a server, account must be enabled." msgstr "" #: gajim/config.py:1813 gajim/gui_interface.py:314 gajim/gui_interface.py:748 msgid "Password Required" msgstr "Необходима е парола" #: gajim/config.py:1814 gajim/gui_interface.py:733 #, python-format msgid "Enter your password for account %s" msgstr "Въведете парола за акаунт „%s“" #: gajim/config.py:1815 gajim/gui_interface.py:748 msgid "Save password" msgstr "Запазване на паролата" #: gajim/config.py:1826 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Акаунт „%s“ е свързан към сървъра" #: gajim/config.py:1827 msgid "If you remove it, the connection will be lost." msgstr "Ако го премахнете, връзката ще се разпадне." #: gajim/config.py:1842 #, fuzzy, python-format msgid "Connection to server %s failed" msgstr "Неуспех при свързването със сървъра-посредник" #: gajim/config.py:1843 #, fuzzy msgid "What would you like to do?" msgstr "Какво искате да направите?" #: gajim/config.py:1844 #, fuzzy msgid "Remove only from Gajim" msgstr "Премахване на акаунт _само от Gajim" #: gajim/config.py:1845 msgid "Don't remove anything. I'll try again later" msgstr "" #: gajim/config.py:1942 msgid "?print_status:All" msgstr "Всички" #: gajim/config.py:1943 msgid "Enter and leave only" msgstr "Само влизащи и излизащи" #: gajim/config.py:1944 msgid "?print_status:None" msgstr "Без" #: gajim/config.py:2010 msgid "New Group Chat" msgstr "Нова стая" #: gajim/config.py:2046 msgid "This bookmark has invalid data" msgstr "Тази отметка съдържа невалидни данни" #: gajim/config.py:2047 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "Попълнете полетата за сървър и стая или изтрийте тази отметка." #: gajim/config.py:2170 gajim/config.py:2186 gajim/config.py:2197 #: gajim/config.py:2225 #, fuzzy msgid "Character not allowed" msgstr "Псевдонимът не е позволен: %s" #: gajim/config.py:2185 gajim/config.py:2196 gajim/config.py:2475 msgid "Invalid server" msgstr "Невалиден сървър" #: gajim/config.py:2224 #, fuzzy msgid "Invalid room" msgstr "Невалиден формат" #: gajim/config.py:2389 msgid "Account has been added successfully" msgstr "Акаунтът беше добавен успешно" #: gajim/config.py:2390 gajim/config.py:2396 #, fuzzy msgid "" "You can set advanced account options by pressing the Advanced button, or " "later by choosing the Accounts menu item under the Edit menu from the main " "window." msgstr "" "Може да настроите допълнителните опции, като натиснете бутона „Напреднали“ " "или по-късно от менюто „Редактиране“->„Акаунти“ в основния прозорец." #: gajim/config.py:2395 msgid "Your new account has been created successfully" msgstr "Новият акаунт беше създаден успешно" #: gajim/config.py:2433 msgid "Invalid username" msgstr "Невалидно потребителско име" #: gajim/config.py:2435 msgid "You must provide a username to configure this account." msgstr "Трябва да въведете име на потребител за новия акаунт." #: gajim/config.py:2476 msgid "Please provide a server on which you want to register." msgstr "Задайте сървър, където искате да се регистрирате." #: gajim/config.py:2499 msgid "Invalid entry" msgstr "Невалиден формат" #: gajim/config.py:2500 msgid "Custom port must be a port number." msgstr "Портът по избор трябва все пак да е номер на порт." #: gajim/config.py:2532 gajim/gui_interface.py:1360 msgid "Certificate Already in File" msgstr "Сертификатът вече е във файла" #: gajim/config.py:2533 gajim/gui_interface.py:1361 #, python-format msgid "This certificate is already in file %s, so it's not added again." msgstr "" "Този сертификат вече е във файла „%s“, така че няма да бъде добавен наново." #: gajim/config.py:2626 #, python-format msgid "" "Security Warning\n" "\n" "The authenticity of the %(hostname)s SSL certificate could be invalid.\n" "SSL Error: %(error)s\n" "Do you still want to connect to this server?" msgstr "" "Предупреждение за сигурността\n" "\n" "Автентичността на сертификата на %(hostname)s е под въпрос.\n" "Грешка на SSL: %(error)s\n" "Все още ли искате да се свържете с този сървър?" #: gajim/config.py:2632 #, fuzzy, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA-1 fingerprint of the certificate:\n" "%(sha1)s\n" "SHA-256 fingerprint of the certificate:\n" "%(sha256)s" msgstr "" "Добавяне на този сертификат към списъка с доверени сертификати.\n" "Отпечатък тип SHA1 на сертификата:\n" "%s" #: gajim/config.py:2666 gajim/config.py:2700 msgid "An error occurred during account creation" msgstr "Възникна грешка при създаването на акаунта" #: gajim/config.py:2763 msgid "Account name is in use" msgstr "Името на акаунта се използва" #: gajim/config.py:2764 msgid "You already have an account using this name." msgstr "Вече има регистриран акаунт с това име." #: gajim/config.py:2896 msgid "PEP node was not removed" msgstr "Възелът на PEP не беше премахнат" #: gajim/config.py:2897 #, python-format msgid "PEP node %(node)s was not removed: %(message)s" msgstr "Възелът на PEP %(node)s не беше премахнат: %(message)s" #: gajim/config.py:2925 #, fuzzy, python-format msgid "Configure %s" msgstr "_Настройване" #: gajim/config.py:2942 gajim/plugins/gui.py:95 msgid "Active" msgstr "Активен" #: gajim/config.py:2950 msgid "Event" msgstr "Събитие" #: gajim/config.py:2984 #, fuzzy msgid "Attention Message Received" msgstr "Първо получено съобщение" #: gajim/config.py:2985 msgid "First Message Received" msgstr "Първо получено съобщение" #: gajim/config.py:2986 msgid "Next Message Received Focused" msgstr "Следващо получено съобщение в прозорец на фокус" #: gajim/config.py:2988 msgid "Next Message Received Unfocused" msgstr "Следващо получено съобщение в прозорец без фокус" #: gajim/config.py:2989 msgid "Contact Connected" msgstr "Включване на контакт" #: gajim/config.py:2990 msgid "Contact Disconnected" msgstr "Изключване на контакт" #: gajim/config.py:2991 msgid "Message Sent" msgstr "Изпратено съобщение" #: gajim/config.py:2992 msgid "Group Chat Message Highlight" msgstr "Осветено съобщение в стая" #: gajim/config.py:2993 msgid "Group Chat Message Received" msgstr "Получено съобщение в стая" #: gajim/tooltips.py:240 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s на тази стая" #: gajim/tooltips.py:269 gajim/common/helpers.py:473 msgid "?Group Chat Contact Affiliation:None" msgstr "Няма" #: gajim/tooltips.py:271 gajim/common/helpers.py:479 msgid "Member" msgstr "Член" #: gajim/tooltips.py:273 gajim/common/helpers.py:477 msgid "Administrator" msgstr "Администратор" #: gajim/tooltips.py:275 gajim/common/helpers.py:475 msgid "Owner" msgstr "Собственик" #: gajim/tooltips.py:433 msgid " [blocked]" msgstr " [блокиран]" #: gajim/tooltips.py:437 msgid " [minimized]" msgstr " [минимизиран]" #: gajim/tooltips.py:609 msgid "Connected" msgstr "Свързан" #: gajim/tooltips.py:611 msgid "Disconnected" msgstr "Изключен" #: gajim/tooltips.py:660 #, fuzzy msgid "?Noun:Download" msgstr "Изтегляне" #: gajim/tooltips.py:666 #, fuzzy msgid "?Noun:Upload" msgstr "Качване" #: gajim/tooltips.py:673 msgid "Type: " msgstr "Тип: " #: gajim/tooltips.py:679 msgid "Transferred: " msgstr "Прехвърлени: " #: gajim/tooltips.py:682 gajim/tooltips.py:699 msgid "Not started" msgstr "Не е започнал" #: gajim/tooltips.py:684 msgid "Stopped" msgstr "Преустановен" #: gajim/tooltips.py:686 gajim/tooltips.py:689 msgid "Completed" msgstr "Завършил" #: gajim/tooltips.py:692 msgid "?transfer status:Paused" msgstr "Временно прекъснат" #: gajim/tooltips.py:695 msgid "Stalled" msgstr "Блокирал" #: gajim/tooltips.py:697 msgid "Transferring" msgstr "Прехвърляне" #: gajim/tooltips.py:700 msgid "Status: " msgstr "Състояние: " #: gajim/tooltips.py:732 gajim/common/helpers.py:389 #, fuzzy msgid "?user status:Available" msgstr "Временно прекъснат" #: gajim/tooltips.py:734 gajim/common/helpers.py:384 msgid "Free for Chat" msgstr "Свободен за разговор" #: gajim/tooltips.py:736 gajim/common/commands.py:117 #: gajim/common/helpers.py:396 #: gajim/command_system/implementation/standard.py:138 msgid "Away" msgstr "Отсъствам" #: gajim/tooltips.py:738 gajim/common/helpers.py:374 msgid "Busy" msgstr "Зает" #: gajim/tooltips.py:740 gajim/common/helpers.py:379 msgid "Not Available" msgstr "Не съм на разположение" #: gajim/tooltips.py:742 gajim/common/helpers.py:401 msgid "Offline" msgstr "Изключен" #: gajim/advanced_configuration_window.py:88 msgid "Activated" msgstr "Активирана" #: gajim/advanced_configuration_window.py:88 msgid "Deactivated" msgstr "Изключена" #: gajim/advanced_configuration_window.py:90 msgid "Boolean" msgstr "Булев израз" #: gajim/advanced_configuration_window.py:91 msgid "Integer" msgstr "Число" #: gajim/advanced_configuration_window.py:92 msgid "Text" msgstr "Текст" #: gajim/advanced_configuration_window.py:93 #: gajim/data/gui/groupchat_control.ui:54 gajim/data/gui/chat_control.ui:334 msgid "Color" msgstr "Цвят" #: gajim/advanced_configuration_window.py:104 msgid "Preference Name" msgstr "Име на опцията" #: gajim/advanced_configuration_window.py:111 msgid "Value" msgstr "Стойност" #: gajim/advanced_configuration_window.py:120 msgid "Type" msgstr "Тип" #: gajim/advanced_configuration_window.py:176 msgid "(None)" msgstr "(Няма)" #: gajim/advanced_configuration_window.py:307 msgid "Hidden" msgstr "Скрита" #: gajim/logind_listener.py:58 msgid "Machine going to sleep" msgstr "" #: gajim/logind_listener.py:90 msgid "Disconnect from the network" msgstr "" #: gajim/history_window.py:339 #, python-format msgid "Conversation History with %s" msgstr "История на разговорите с %s" #: gajim/history_window.py:361 gajim/data/gui/history_window.ui:7 msgid "Conversation History" msgstr "История на разговорите" #: gajim/history_window.py:390 gajim/history_window.py:443 msgid "Disk Error" msgstr "Грешка при запис/четене от диска" #: gajim/history_window.py:546 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s вече е %(status)s: %(status_msg)s" #: gajim/history_window.py:557 #, fuzzy, python-format msgid "Error: %s" msgstr "Грешка: %s" #: gajim/history_window.py:559 #, fuzzy msgid "Error" msgstr "Грешка." #: gajim/history_window.py:561 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Сегашното състояние е: %(status)s: %(status_msg)s" #: gajim/history_window.py:564 #, python-format msgid "Status is now: %(status)s" msgstr "Сегашното състояние е: %(status)s" #: gajim/history_window.py:585 gajim/conversation_textview.py:1338 #, python-format msgid "Subject: %s\n" msgstr "Тема: %s\n" #: gajim/statusicon.py:215 #, fuzzy msgid "_Change Status Message…" msgstr "Пром_яна на съобщението за състояние" #: gajim/statusicon.py:252 gajim/statusicon.py:302 gajim/statusicon.py:309 #, python-format msgid "using account %s" msgstr "от акаунт „%s“" #: gajim/statusicon.py:319 #, fuzzy msgid "_Manage Bookmarks…" msgstr "Управление на отметките" #: gajim/statusicon.py:332 #, fuzzy msgid "Hide _Roster" msgstr "в с_писъка" #: gajim/statusicon.py:336 msgid "Show _Roster" msgstr "П_оказване на списъка" #: gajim/statusicon.py:344 msgid "Hide this menu" msgstr "Скриване на това меню" #: gajim/dataforms_widget.py:587 #, fuzzy msgid "Unable to load image" msgstr "Неуспех при зареждането на модула „idle“" #: gajim/dataforms_widget.py:589 #, fuzzy, python-format msgid "Media type not supported: %s" msgstr "Състоянието „Невидим“ не се поддържа." #: gajim/dataforms_widget.py:604 msgid "This field is required" msgstr "" #: gajim/dataforms_widget.py:658 msgid "new@jabber.id" msgstr "new@jabber.id" #: gajim/dataforms_widget.py:661 gajim/dataforms_widget.py:663 #, python-format msgid "new%d@jabber.id" msgstr "new%d@jabber.id" #: gajim/server_info.py:130 #, python-format msgid "%(days)s days, %(hours)s hours" msgstr "" #: gajim/server_info.py:187 gajim/accounts_window.py:537 #: gajim/accounts_window.py:638 #, fuzzy msgid "Hostname" msgstr "_Хост:" #: gajim/server_info.py:188 #, fuzzy msgid "Server Software" msgstr "Функционалности на сървърите" #: gajim/server_info.py:189 #, fuzzy msgid "Server Uptime" msgstr "Запазен в: %s" #: gajim/server_info.py:227 msgid "" "\n" "Disabled in config" msgstr "" #: gajim/disco.py:69 msgid "This service has not yet responded with detailed information" msgstr "Тази услуга все още не е отговорила с подробна информация" #: gajim/disco.py:70 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" msgstr "" "Тази услуга не можа да отговори с подробна информация.\n" "Най-вероятно е извън употреба или повредена" #: gajim/disco.py:129 msgid "Others" msgstr "Други" #: gajim/disco.py:133 msgid "Conference" msgstr "Стаи за разговор" #: gajim/disco.py:537 msgid "Without a connection, you can not browse available services" msgstr "Трябва да сте свързани, за да разглеждате наличните услуги" #: gajim/disco.py:626 #, python-format msgid "Service Discovery using account %s" msgstr "Откриване на налични услуги за акаунт „%s“" #: gajim/disco.py:628 msgid "Service Discovery" msgstr "Откриване на услуги" #: gajim/disco.py:732 msgid "The service could not be found" msgstr "Услугата не може да бъде намерена" #: gajim/disco.py:733 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." msgstr "" "Няма услуга на въведения адрес или не отговаря. Проверете адреса и опитайте " "отново." #: gajim/disco.py:739 gajim/disco.py:1091 msgid "The service is not browsable" msgstr "Услугата не е достъпна" #: gajim/disco.py:740 msgid "This type of service does not contain any items to browse." msgstr "Този вид услуга не съдържа обекти за показване." #: gajim/disco.py:781 gajim/disco.py:791 msgid "Invalid Server Name" msgstr "Невалидно име на сървър" #: gajim/disco.py:849 #, python-format msgid "Browsing %(address)s using account %(account)s" msgstr "Търсене в %(address)s от акаунт „%(account)s“" #: gajim/disco.py:896 #, fuzzy msgid "Browse" msgstr "_Търсене" #: gajim/disco.py:1092 msgid "This service does not contain any items to browse." msgstr "Тази услуга не съдържа обекти за показване." #: gajim/disco.py:1304 #, fuzzy msgid "Execute Command" msgstr "_Изпълнение на команда" #: gajim/disco.py:1308 gajim/disco.py:1466 msgid "Re_gister" msgstr "_Регистриране" #: gajim/disco.py:1317 gajim/data/gui/join_groupchat_window.ui:186 #: gajim/data/gui/join_groupchat_window.ui:325 #, fuzzy msgid "Join" msgstr "_Влизане" #: gajim/disco.py:1326 gajim/data/gui/search_window.ui:23 msgid "Search" msgstr "Търсене" #: gajim/disco.py:1464 msgid "_Edit" msgstr "_Редактиране" #: gajim/disco.py:1507 #, python-format msgid "Scanning %(current)d / %(total)d.." msgstr "Сканиране на %(current)d / %(total)d…" #: gajim/disco.py:1703 msgid "Users" msgstr "Потребители" #: gajim/disco.py:1711 msgid "Description" msgstr "Описание" #: gajim/disco.py:1719 msgid "Id" msgstr "Идентификатор" #: gajim/disco.py:1749 gajim/data/gui/gc_control_popup_menu.ui:99 msgid "_Bookmark" msgstr "_Добавяне на стаята към отметките" #: gajim/disco.py:1783 msgid "Bookmark already set" msgstr "Отметката вече е установена" #: gajim/disco.py:1784 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Стаята „%s“ вече присъства в отметките." #: gajim/disco.py:1794 msgid "Bookmark has been added successfully" msgstr "Отметката беше добавена успешно" #: gajim/disco.py:1795 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "Може да организирате отметките чрез менюто „Действия“." #: gajim/disco.py:1987 msgid "Subscribed" msgstr "Записан" #: gajim/disco.py:1996 msgid "Node" msgstr "Възел" #: gajim/disco.py:2063 msgid "New post" msgstr "Ново съобщение" #: gajim/disco.py:2069 msgid "_Subscribe" msgstr "_Записване" #: gajim/disco.py:2075 msgid "_Unsubscribe" msgstr "_Отписване" #: gajim/conversation_textview.py:329 msgid "" "Text below this line is what has been said since the\n" "last time you paid attention to this group chat" msgstr "" "Текстът под този ред е последното, което е казано откакто\n" "за последен път сте обърнали внимание на тази стая" #: gajim/conversation_textview.py:550 #, fuzzy msgid "_Quote" msgstr "_Изход" #: gajim/conversation_textview.py:558 #, python-format msgid "_Actions for \"%s\"" msgstr "_Действия за „%s“" #: gajim/conversation_textview.py:572 msgid "Read _Wikipedia Article" msgstr "Четене на статия от _Уикипедия" #: gajim/conversation_textview.py:577 msgid "Look it up in _Dictionary" msgstr "Проверка в _речника" #: gajim/conversation_textview.py:594 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "Липсва „%s“ в адреса на речника и не е WIKTIONARY" #: gajim/conversation_textview.py:608 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "Липсва „%s“ в адреса за търсене" #: gajim/conversation_textview.py:611 msgid "Web _Search for it" msgstr "_Търсене в уеб" #: gajim/conversation_textview.py:617 msgid "Open as _Link" msgstr "Отваряне като _връзка" #: gajim/conversation_textview.py:847 msgid "URL:" msgstr "" #: gajim/conversation_textview.py:1021 #, fuzzy msgid "Invalid URL" msgstr "Невалиден JID" #: gajim/conversation_textview.py:1106 msgid "" "Message corrected. Original message:\n" "{}" msgstr "" #: gajim/conversation_textview.py:1250 #, fuzzy, python-format msgid "Yesterday" msgid_plural "%(nb_days)i days ago" msgstr[0] "Вчера" msgstr[1] "Вчера" #: gajim/message_textview.py:43 #, fuzzy msgid "Write a message.." msgstr "Ново лично съобщение" #: gajim/message_window.py:245 #, fuzzy msgid "You are going to close several tabs" msgstr "Не сте свързани към сървъра." #: gajim/message_window.py:246 #, fuzzy msgid "Do you really want to close them all?" msgstr "Наистина ли искате да изтриете избраното съобщение?" #: gajim/message_window.py:517 #, fuzzy msgid "?Noun:Chats" msgstr "Стаи" #: gajim/message_window.py:521 msgid "Private Chats" msgstr "Лични разговори" #: gajim/message_window.py:527 msgid "Messages" msgstr "Съобщения" #: gajim/gui_interface.py:158 gajim/gui_interface.py:329 #: gajim/gui_interface.py:338 gajim/gui_interface.py:345 #: gajim/gui_interface.py:349 gajim/gui_interface.py:352 #: gajim/gui_interface.py:360 msgid "Unable to join group chat" msgstr "Неуспех при влизането в стаята" #: gajim/gui_interface.py:159 #, fuzzy, python-format msgid "" "Your desired nickname in group chat\n" "%s\n" "is in use or registered by another occupant.\n" "Please specify another nickname below:" msgstr "" "Желаният от вас псевдоним за стая %s се използва или е регистриран от друг " "участник.\n" "Укажете друг псевдоним по-долу:" #: gajim/gui_interface.py:163 msgid "Always use this nickname when there is a conflict" msgstr "" #: gajim/gui_interface.py:181 msgid "Do you accept this request?" msgstr "Приемате ли това запитване?" #: gajim/gui_interface.py:183 #, python-format msgid "Do you accept this request on account %s?" msgstr "Приемате ли това запитване за акаунт %s?" #: gajim/gui_interface.py:186 #, fuzzy, python-format msgid "HTTP (%(method)s) Authorization for %(url)s (ID: %(id)s)" msgstr "Упълномощаване по HTTP (%(method)s) за „%(url)s“ (id: %(id)s)" #: gajim/gui_interface.py:230 gajim/notify.py:96 msgid "Connection Failed" msgstr "Неуспех при свързването" #: gajim/gui_interface.py:315 #, python-format msgid "A Password is required to join the room %s. Please type it." msgstr "Необходима е парола за влизане в стаята „%s“. Въведете я." #: gajim/gui_interface.py:330 #, fuzzy, python-format msgid "%s is full" msgstr "Шрифт" #: gajim/gui_interface.py:339 #, fuzzy, python-format msgid "You are banned from group chat %s." msgstr "Вие сте отлъчени от стаята %s." #: gajim/gui_interface.py:346 #, fuzzy, python-format msgid "Remote server %s does not exist." msgstr "Стаята %s не съществува." #: gajim/gui_interface.py:350 #, fuzzy, python-format msgid "Group chat %s does not exist." msgstr "Стаята %s не съществува." #: gajim/gui_interface.py:353 #, fuzzy msgid "Group chat creation is not permitted." msgstr "Създаването на стаи е ограничено." #: gajim/gui_interface.py:355 #, fuzzy msgid "Unable to join groupchat" msgstr "Неуспех при влизането в стаята" #: gajim/gui_interface.py:356 #, fuzzy, python-format msgid "You must use your registered nickname in %s." msgstr "Трябва да се използва регистрирания ви псевдоним в стаята %s." #: gajim/gui_interface.py:361 #, python-format msgid "You are not in the members list in groupchat %s." msgstr "Не сте в списъка с членове на стаята %s." #: gajim/gui_interface.py:455 gajim/gui_interface.py:459 #, python-format msgid "Error %(code)s: %(msg)s" msgstr "Грешка %(code)s: %(msg)s" #: gajim/gui_interface.py:470 gajim/gui_interface.py:486 #: gajim/common/connection_handlers_events.py:1430 #, python-format msgid "error while sending %(message)s ( %(error)s )" msgstr "грешка при изпращане на %(message)s ( %(error)s )" #: gajim/gui_interface.py:513 gajim/notify.py:96 #, fuzzy msgid "Subscription request" msgstr "Искане за записване" #: gajim/gui_interface.py:524 gajim/common/contacts.py:131 #: gajim/common/helpers.py:95 msgid "Observers" msgstr "Наблюдатели" #: gajim/gui_interface.py:538 msgid "Authorization accepted" msgstr "Упълномощаването е прието" #: gajim/gui_interface.py:539 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "Контактът „%s“ ви упълномощи да виждате състоянието му." #: gajim/gui_interface.py:547 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Контактът „%s“ премахна записването за вас" #: gajim/gui_interface.py:548 #, fuzzy msgid "" "You will always see them as offline.\n" "Do you want to remove them from your contact list?" msgstr "" "Винаги ще го виждате като изключен.\n" "Искате ли да го премахнете от списъка с контакти?" #: gajim/gui_interface.py:570 gajim/notify.py:96 #, fuzzy msgid "Unsubscribed" msgstr "_Отписване" #: gajim/gui_interface.py:582 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Неуспех при установяването на контакт с „%s“" #: gajim/gui_interface.py:583 gajim/common/connection.py:1288 #: gajim/common/connection.py:1474 msgid "Check your connection or try again later." msgstr "Проверете връзката или опитайте отново по-късно." #: gajim/gui_interface.py:641 #, python-format msgid "%(jid)s declined the invitation: %(reason)s" msgstr "" #: gajim/gui_interface.py:645 #, python-format msgid "%(jid)s declined the invitation" msgstr "" #: gajim/gui_interface.py:675 #, fuzzy msgid "" "You configured Gajim to use OpenPGP agent, but there is no OpenPGP agent " "running or it returned a wrong passphrase.\n" msgstr "" "Конфигурирали сте Gajim да използва агент на GPG, но такъв не е стартиран " "или е предоставил грешна парола.\n" #: gajim/gui_interface.py:678 gajim/gui_interface.py:686 msgid "You are currently connected without your OpenPGP key." msgstr "В момента сте свързани без OpenPGP ключ." #: gajim/gui_interface.py:680 #, fuzzy msgid "Wrong passphrase" msgstr "Грешна парола" #: gajim/gui_interface.py:685 #, fuzzy msgid "Wrong OpenPGP passphrase" msgstr "Грешна парола" #: gajim/gui_interface.py:699 #, fuzzy msgid "Certificate Passphrase Required" msgstr "Валидността на сертификата е изтекла" #: gajim/gui_interface.py:700 #, fuzzy, python-format msgid "Enter the certificate passphrase for account %s" msgstr "Въведете парола за ключ на GPG %(keyid)s (акаунт „%(account)s“)." #: gajim/gui_interface.py:723 #, fuzzy msgid "Untrusted OpenPGP key" msgstr "Изберете вашия ключ на OpenPGP" #: gajim/gui_interface.py:723 #, fuzzy msgid "" "The OpenPGP key used to encrypt this chat is not trusted. Do you really want " "to encrypt this message?" msgstr "" "Няма зададен ключ на GPG за този контакт, така че не може да шифрирате " "съобщения." #: gajim/gui_interface.py:769 msgid "" "Please copy / paste the refresh token from the website that has just been " "opened." msgstr "" #: gajim/gui_interface.py:772 msgid "Oauth2 Credentials" msgstr "" #: gajim/gui_interface.py:924 #, python-format msgid "%s wants to send you a file." msgstr "%s иска да ви изпрати файл." #: gajim/gui_interface.py:1021 gajim/gui_interface.py:1433 msgid "SSL certificate error" msgstr "Грешка в сертификата на SSL" #: gajim/gui_interface.py:1038 #, fuzzy msgid "File Transfer Failed" msgstr "Файлови трансфери" #: gajim/gui_interface.py:1060 #, fuzzy, python-format msgid "%(filename)s received from %(name)s." msgstr "Файловият трансфер на %(filename)s от %(name)s прекъсна." #: gajim/gui_interface.py:1064 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Файловият трансфер на %(filename)s от %(name)s прекъсна." #: gajim/gui_interface.py:1068 #, fuzzy, python-format msgid "File transfer of %(filename)s from %(name)s failed." msgstr "Файловият трансфер на %(filename)s от %(name)s прекъсна." #: gajim/gui_interface.py:1081 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "Успешно изпратихте %(filename)s на %(name)s." #: gajim/gui_interface.py:1085 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "Файловият трансфер на %(filename)s до %(name)s прекъсна." #: gajim/gui_interface.py:1089 #, fuzzy, python-format msgid "File transfer of %(filename)s to %(name)s failed." msgstr "Файловият трансфер на %(filename)s до %(name)s прекъсна." #: gajim/gui_interface.py:1153 #, fuzzy msgid "Choose file to send" msgstr "Избор на файл за изпращане…" #: gajim/gui_interface.py:1199 msgid "Unable to decrypt message" msgstr "Неуспех при дешифриране на съобщението" #: gajim/gui_interface.py:1211 msgid "Username Conflict" msgstr "Конфликт с имената на потребители" #: gajim/gui_interface.py:1212 msgid "Please type a new username for your local account" msgstr "Укажете ново потребителско име за локалния ви акаунт" #: gajim/gui_interface.py:1235 msgid "Resource Conflict" msgstr "Конфликт на ресурсите" #: gajim/gui_interface.py:1236 msgid "" "You are already connected to this account with the same resource. Please " "type a new one" msgstr "Вече сте свързани към този акаунт със същия ресурс. Въведете нов." #: gajim/gui_interface.py:1293 #, fuzzy, python-format msgid "%s wants to start a voice chat." msgstr "%s иска да ви изпрати файл." #: gajim/gui_interface.py:1296 #, fuzzy msgid "Voice Chat Request" msgstr "Запитване за файлов трансфер" #: gajim/gui_interface.py:1386 msgid "Error verifying SSL certificate" msgstr "Грешка при проверка на сертификата на SSL" #: gajim/gui_interface.py:1387 #, fuzzy, python-format msgid "" "There was an error verifying the SSL certificate of your XMPP server: " "%(error)s\n" "Do you still want to connect to this server?" msgstr "" "Възникна грешка при проверката на сертификата за вашия сървър на Джабър: " "%(error)s\n" "Все още ли искате да се свържете със сървъра?" #: gajim/gui_interface.py:1391 #, fuzzy, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA-1 fingerprint of the certificate:\n" "%(sha1)s\n" "SHA256 fingerprint of the certificate:\n" "%(sha256)s" msgstr "" "Добавяне на този сертификат към списъка с доверени сертификати.\n" "Отпечатък тип SHA1 на сертификата:\n" "%s" #: gajim/gui_interface.py:1397 msgid "Ignore this error for this certificate." msgstr "Пренебрегване на грешката за този сертификат." #: gajim/gui_interface.py:1410 msgid "Non Anonymous Server" msgstr "" #: gajim/gui_interface.py:1434 #, fuzzy, python-format msgid "" "It seems the SSL certificate of account %(account)s has changed and is not " "valid or your connection is being compromised.\n" "\n" "Old SHA-1 fingerprint: %(old_sha1)s\n" "Old SHA-256 fingerprint: %(old_sha256)s\n" "\n" "New SHA-1 fingerprint: %(new_sha1)s\n" "New SHA-256 fingerprint: %(new_sha256)s\n" "\n" "Do you still want to connect and update the fingerprint of the certificate?" msgstr "" "Изглежда сертификатът на SSL е бил променен или връзката е взломена.\n" "Стар отпечатък: %(old)s\n" "Нов отпечатък: %(new)s\n" "\n" "Все още ли искате да се свържете и да обновите отпечатъка на сертификата?" #: gajim/gui_interface.py:1512 msgid "" "You are about to send your password on an insecure connection. You should " "install PyOpenSSL to prevent that. Are you sure you want to do that?" msgstr "" "На път сте да изпратите паролата си чрез несигурна връзка. Трябва да " "инсталирате PyOpenSSL, за да предотвратите това. Сигурни ли сте, че искате " "да го направите?" #: gajim/gui_interface.py:1554 #, fuzzy msgid "" "You are about to send your password unencrypted on an insecure connection. " "Are you sure you want to do that?" msgstr "" "На път сте да изпратите паролата си чрез нешифрирана връзка. Сигурни ли сте, " "че искате да го направите?" #: gajim/gui_interface.py:1856 #, fuzzy msgid "JID is not a Groupchat" msgstr "Това не е стая" #: gajim/gui_interface.py:2020 msgid "Emoticons disabled" msgstr "Емотиконите са изключени" #: gajim/gui_interface.py:2021 #, fuzzy msgid "" "Your configured emoticons theme could not be loaded. See the log for more " "details." msgstr "Темата с емотикони не беше намерена, така че са изключени." #: gajim/gui_interface.py:2039 msgid "This is not a group chat" msgstr "Това не е стая" #: gajim/gui_interface.py:2040 #, python-format msgid "" "%(room_jid)s is already in your roster. Please check if %(room_jid)s is a " "correct group chat name. If it is, delete it from your roster and try " "joining the group chat again." msgstr "" #: gajim/gui_interface.py:2418 msgid "Could not save your settings and preferences" msgstr "Неуспех при запазването на настройките" #: gajim/gui_interface.py:2828 gajim/common/config.py:117 #: gajim/common/config.py:532 gajim/common/optparser.py:343 #: gajim/common/optparser.py:511 gajim/common/optparser.py:534 msgid "default" msgstr "по подразбиране" #: gajim/gui_interface.py:3014 msgid "Passphrase Required" msgstr "Необходима е парола" #: gajim/gui_interface.py:3015 #, fuzzy, python-format msgid "Enter OpenPGP key passphrase for key %(keyid)s (account %(account)s)." msgstr "Въведете парола за ключ на GPG %(keyid)s (акаунт „%(account)s“)." #: gajim/gui_interface.py:3029 #, fuzzy msgid "OpenPGP key expired" msgstr "Няма зададен ключ на GPG" #: gajim/gui_interface.py:3030 #, fuzzy, python-format msgid "" "Your OpenPGP key has expired, you will be connected to %s without OpenPGP." msgstr "Ще бъдете свързани към „%s“ без OpenPGP." #: gajim/gui_interface.py:3039 msgid "Wrong Passphrase" msgstr "Грешна парола" #: gajim/gui_interface.py:3040 #, fuzzy msgid "Please retype your OpenPGP passphrase or press Cancel." msgstr "Въведете паролата за GPG ключа наново или натиснете „Отказване“." #: gajim/search_window.py:108 msgid "Waiting for results" msgstr "Изчакване на резултатите" #: gajim/search_window.py:146 gajim/search_window.py:224 msgid "Error in received dataform" msgstr "Грешка в получените данни" #: gajim/search_window.py:181 gajim/search_window.py:216 msgid "No result" msgstr "Няма резултати" #: gajim/htmltextview.py:559 #, fuzzy msgid "Loading" msgstr "Програмирам" #: gajim/atom_window.py:123 #, fuzzy, python-format msgid "You have received new entries (and %d not displayed):" msgid_plural "You have received new entries (and %d not displayed):" msgstr[0] "Получихте нов запис:" msgstr[1] "Получихте нов запис:" #: gajim/atom_window.py:128 gajim/data/gui/atom_entry_window.ui:20 msgid "You have received new entry:" msgstr "Получихте нов запис:" #: gajim/adhoc_commands.py:111 gajim/data/gui/adhoc_commands_window.ui:9 msgid "Ad-hoc Commands - Gajim" msgstr "Специални команди - Gajim" #: gajim/adhoc_commands.py:320 msgid "Cancel confirmation" msgstr "Отмяна на потвърждението" #: gajim/adhoc_commands.py:321 msgid "" "You are in process of executing command. Do you really want to cancel it?" msgstr "На път сте да изпълните команда. Наистина ли искате да я отмените?" #: gajim/adhoc_commands.py:387 gajim/adhoc_commands.py:411 msgid "Service sent malformed data" msgstr "Услугата изпрати лошо форматирани данни" #: gajim/adhoc_commands.py:396 msgid "Service changed the session identifier." msgstr "Услугата промени идентификатора на сесията." #: gajim/adhoc_commands.py:416 #, fuzzy, python-format msgid "%s - Ad-hoc Commands - Gajim" msgstr "Специални команди - Gajim" #: gajim/adhoc_commands.py:510 msgid "Service returned an error." msgstr "Услугата върна грешка." #: gajim/negotiation.py:34 msgid "- messages will be logged" msgstr "— ще бъде воден дневник за съобщенията" #: gajim/negotiation.py:36 msgid "- messages will not be logged" msgstr "— няма да бъде воден дневник за съобщенията" #: gajim/notify.py:103 #, fuzzy msgid "Open" msgstr "OpenGPG" #: gajim/dialog_messages.py:33 #, fuzzy msgid "You can not start a new conversation unless you are connected." msgstr "Трябва да сте свързани, за да влезете в стая." #: gajim/dialog_messages.py:48 msgid "Unread events" msgstr "Непрочетени събития" #: gajim/dialog_messages.py:49 msgid "Read all pending events before removing this account." msgstr "Преди да премахнете този акаунт, прочетете всички чакащи събития." #: gajim/dialog_messages.py:53 msgid "You are currently connected to the server" msgstr "В момента сте свързани със сървъра" #: gajim/dialog_messages.py:54 #, fuzzy msgid "To disable the account, you must be disconnected." msgstr "Трябва да сте изключени, за да смените името на акаунта." #: gajim/dialog_messages.py:58 #, fuzzy msgid "Invalid Form" msgstr "Невалиден формат" #: gajim/dialog_messages.py:59 #, fuzzy msgid "The form is not filled correctly." msgstr "Псевдонимът съдържа непозволени знаци." #: gajim/dialog_messages.py:63 gajim/common/helpers.py:406 msgid "Invisible" msgstr "Невидим" #: gajim/dialog_messages.py:68 msgid "A connection is not available" msgstr "В момента няма връзка" #: gajim/dialog_messages.py:69 msgid "Your message can not be sent until you are connected." msgstr "Съобщението не може да бъде изпратено, докато не се свържете." #: gajim/dialog_messages.py:73 #, fuzzy msgid "JID already in list" msgstr "В списъка вече има такъв Jabber ID" #: gajim/dialog_messages.py:74 #, fuzzy msgid "The JID you entered is already in the list. Choose another one." msgstr "Въведеният Jabber ID вече съществува в списъка. Изберете друг." #: gajim/dialog_messages.py:78 msgid "Invalid answer" msgstr "Невалиден отговор" #: gajim/dialog_messages.py:79 #, python-format msgid "Transport %(name)s answered wrongly to register request: %(error)s" msgstr "" "Транспортът „%(name)s“ отговори погрешно на запитването за регистрация: " "%(error)s" #: gajim/dialog_messages.py:84 #, fuzzy msgid "Wrong Custom Hostname" msgstr "Използване на нестандартен хост/порт" #: gajim/dialog_messages.py:85 #, fuzzy, python-format msgid "Wrong custom hostname \"%s\". Ignoring it." msgstr "Използване на нестандартен хост/порт" #: gajim/dialog_messages.py:89 msgid "Error while removing privacy list" msgstr "Грешка при премахването на списъка за уединение" #: gajim/dialog_messages.py:90 #, python-format msgid "" "Privacy list %s has not been removed. It is maybe active in one of your " "connected resources. Deactivate it and try again." msgstr "" "Списъкът за уединение „%s“ не беше премахнат. Навярно е активен в някой от " "свързаните ви ресурси. Изключете го и опитайте отново." #: gajim/dialog_messages.py:96 msgid "Invisibility not supported" msgstr "Състоянието „Невидим“ не се поддържа." #: gajim/dialog_messages.py:97 #, python-format msgid "Account %s doesn't support invisibility." msgstr "Акаунтът „%s“ не поддържа невидимост." #: gajim/dialog_messages.py:101 #, fuzzy msgid "Unregister failed" msgstr "Неуспех при свързването" #: gajim/dialog_messages.py:102 #, python-format msgid "Unregistration with server %(server)s failed: %(error)s" msgstr "" #: gajim/dialog_messages.py:106 #, fuzzy msgid "Registration succeeded" msgstr "Регистриране в %s" #: gajim/dialog_messages.py:107 #, python-format msgid "Registration with agent %s succeeded" msgstr "" #: gajim/dialog_messages.py:111 #, fuzzy msgid "Registration failed" msgstr "Неуспех при свързването" #: gajim/dialog_messages.py:112 #, python-format msgid "" "Registration with agent %(agent)s failed with error %(error)s: %(error_msg)s" msgstr "" #: gajim/dialog_messages.py:117 #, fuzzy msgid "Unable to join Groupchat" msgstr "Неуспех при влизането в стаята" #: gajim/dialog_messages.py:122 msgid "GStreamer error" msgstr "" #: gajim/dialog_messages.py:123 #, fuzzy, python-format msgid "" "Error: %(error)s\n" "Debug: %(debug)s" msgstr "Грешка: %s" #: gajim/dialog_messages.py:127 msgid "Wrong host" msgstr "Грешен хост" #: gajim/dialog_messages.py:128 msgid "Invalid local address? :-O" msgstr "Невалиден локален адрес? :-O" #: gajim/dialog_messages.py:132 msgid "Avahi error" msgstr "Грешка на Avahi" #: gajim/dialog_messages.py:133 #, python-format msgid "" "%s\n" "Link-local messaging might not work properly." msgstr "" "%s\n" "Изпращането и получаването на съобщения тип „link-local“ може и да не " "функционира правилно." #: gajim/dialog_messages.py:137 gajim/dialog_messages.py:142 #, fuzzy msgid "Could not request upload slot" msgstr "Неуспех при стартирането на локална услуга" #: gajim/dialog_messages.py:143 msgid "Got unexpected response from server (see log)" msgstr "" #: gajim/dialog_messages.py:147 gajim/dialog_messages.py:152 #, fuzzy msgid "Could not open file" msgstr "Неуспех при зареждането на изображението" #: gajim/dialog_messages.py:148 msgid "Exception raised while opening file (see log)" msgstr "" #: gajim/dialog_messages.py:157 msgid "Unsecure" msgstr "" #: gajim/dialog_messages.py:158 #, fuzzy msgid "Server returned unsecure transport (http)" msgstr "Услугата върна грешка." #: gajim/dialog_messages.py:162 #, fuzzy msgid "Could not upload file" msgstr "Неуспех при зареждането на изображението" #: gajim/dialog_messages.py:163 #, python-format msgid "HTTP response code from server: %s" msgstr "" #: gajim/dialog_messages.py:167 msgid "Upload Error" msgstr "" #: gajim/dialog_messages.py:172 msgid "Encryption Error" msgstr "" #: gajim/dialog_messages.py:173 #, fuzzy msgid "For the choosen encryption is no encryption method available" msgstr "В момента няма връзка" #: gajim/gajim_themes_window.py:61 msgid "Theme" msgstr "Тема" #: gajim/gajim_themes_window.py:98 msgid "You cannot make changes to the default theme" msgstr "Не може да правите промени по стандартната тема" #: gajim/gajim_themes_window.py:99 #, fuzzy msgid "Please create a new clean theme." msgstr "Създайте нова тема с желаното име." #: gajim/gajim_themes_window.py:170 msgid "theme name" msgstr "име на тема" #: gajim/gajim_themes_window.py:187 msgid "You cannot delete your current theme" msgstr "Не може да изтриете текущата тема" #: gajim/gajim_themes_window.py:188 msgid "Pick another theme to use first." msgstr "" #: gajim/accounts_window.py:40 #, fuzzy msgid "Merge Accounts" msgstr "Смесени акаунти" #: gajim/accounts_window.py:41 #, fuzzy msgid "Use PGP Agent" msgstr "Използване на агент на _GPG" #: gajim/accounts_window.py:153 gajim/common/config.py:511 msgid "Be right back." msgstr "Сега се връщам." #: gajim/accounts_window.py:157 msgid "Relogin now?" msgstr "Свързване наново?" #: gajim/accounts_window.py:158 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "" "Ако искате всички промени да влязат в сила веднага, трябва да се свържете " "наново." #: gajim/accounts_window.py:211 #, python-format msgid "You have opened chat in account %s" msgstr "Имате активни разговори за акаунт „%s“" #: gajim/accounts_window.py:212 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "" "Всички прозорци за разговори и стаи ще бъдат затворени. Искате ли да " "продължите?" #: gajim/accounts_window.py:345 #, fuzzy msgid "Remove" msgstr "_Премахване" #: gajim/accounts_window.py:388 #, fuzzy msgid "Rename account label" msgstr "Преименуване на акаунт" #: gajim/accounts_window.py:457 msgid "Login" msgstr "" #: gajim/accounts_window.py:466 msgid "Connection" msgstr "Свързване" #: gajim/accounts_window.py:469 #, fuzzy msgid "Import Contacts" msgstr "Покана на _контакти" #: gajim/accounts_window.py:472 gajim/accounts_window.py:655 #, fuzzy msgid "Client Certificate" msgstr "Само-подписан сертификат" #: gajim/accounts_window.py:475 gajim/accounts_window.py:570 #, fuzzy msgid "OpenPGP Key" msgstr "Задаване на OpenPGP ключ" #: gajim/accounts_window.py:486 gajim/accounts_window.py:558 #, fuzzy msgid "Connect on startup" msgstr "С_вързване при стартиране" #: gajim/accounts_window.py:489 #, fuzzy msgid "Reconnect when connection is lost" msgstr "Автоматично свързване при разпадане на връзката" #: gajim/accounts_window.py:492 gajim/accounts_window.py:562 #, fuzzy msgid "Save conversations for all contacts" msgstr "Запазване на история на _разговорите за всички контакти" #: gajim/accounts_window.py:494 gajim/accounts_window.py:564 msgid "Store conversations on the harddrive" msgstr "" #: gajim/accounts_window.py:496 #, fuzzy msgid "Server Message Archive" msgstr "_Изпращане на съобщение от сървъра…" #: gajim/accounts_window.py:498 msgid "" "Messages get stored on the server.\n" "The archive is used to sync messages\n" "between multiple devices.\n" "XEP-0313" msgstr "" #: gajim/accounts_window.py:503 gajim/accounts_window.py:566 #, fuzzy msgid "Global Status" msgstr "Всички състояния" #: gajim/accounts_window.py:505 #, fuzzy msgid "Synchronise the status of all accounts" msgstr "Промяна на състоянието на акаунта или акаунтите" #: gajim/accounts_window.py:507 #, fuzzy msgid "Message Carbons" msgstr "Съобщения" #: gajim/accounts_window.py:509 msgid "" "All your other online devices get copies\n" "of sent and received messages.\n" "XEP-0280" msgstr "" #: gajim/accounts_window.py:513 msgid "Use file transfer proxies" msgstr "Използване на сървъри-посредници за файлови трансфери" #: gajim/accounts_window.py:525 gajim/accounts_window.py:560 #, fuzzy msgid "Use environment variable" msgstr "Използване на променливата на обкръжението „HTTP_PROXY“" #: gajim/accounts_window.py:527 #, fuzzy msgid "Proxy" msgstr "Сървър-посредник:" #: gajim/accounts_window.py:530 #, fuzzy msgid "Warn on insecure connection" msgstr "Предупре_ждаване преди използване на несигурна връзка" #: gajim/accounts_window.py:534 msgid "Send keep-alive packets" msgstr "Изпращане на пакети за поддържане на връзката" #: gajim/accounts_window.py:538 msgid "Manually set the hostname for the server" msgstr "" #: gajim/accounts_window.py:541 #, fuzzy msgid "Resource" msgstr "Ресурс:" #: gajim/accounts_window.py:544 gajim/accounts_window.py:612 #: gajim/accounts_window.py:617 #, fuzzy msgid "Priority" msgstr "Приори_тет:" #: gajim/accounts_window.py:568 #, fuzzy msgid "Synchronize the status of all accounts" msgstr "Промяна на състоянието на акаунта или акаунтите" #: gajim/accounts_window.py:581 #, fuzzy msgid "First Name" msgstr "Собствено име:" #: gajim/accounts_window.py:584 #, fuzzy msgid "Last Name" msgstr "Фамилия:" #: gajim/accounts_window.py:587 #: gajim/data/gui/archiving_313_preferences_window.ui:71 #, fuzzy msgid "Jabber ID" msgstr "Jabber ID:" #: gajim/accounts_window.py:590 #, fuzzy msgid "Email" msgstr "Нова е-поща" #: gajim/accounts_window.py:608 #, fuzzy msgid "Adjust to status" msgstr "_Съгласуване спрямо състоянието" #: gajim/accounts_window.py:635 msgid "Enable" msgstr "Активиране" #: gajim/accounts_window.py:642 #, fuzzy msgid "Port" msgstr "По_рт:" #: gajim/accounts_window.py:647 #, fuzzy msgid "Connection Options" msgstr "Свързване" #: gajim/accounts_window.py:659 #, fuzzy msgid "Encrypted Certificate" msgstr "Само-подписан сертификат" #: gajim/accounts_window.py:663 #, fuzzy msgid "Certificate Options" msgstr "Само-подписан сертификат" #: gajim/accounts_window.py:671 gajim/data/gui/join_groupchat_window.ui:143 #, fuzzy msgid "Password" msgstr "Парола:" #: gajim/accounts_window.py:675 #, fuzzy msgid "Save Password" msgstr "Запазване на паролата" #: gajim/accounts_window.py:678 gajim/data/gui/change_password_dialog.ui:8 msgid "Change Password" msgstr "Промяна на парола" #: gajim/accounts_window.py:683 #, fuzzy msgid "Login Options" msgstr "_Емотикони:" #: gajim/gajim_remote.py:59 gajim/common/exceptions.py:71 msgid "D-Bus is not present on this machine or python module is missing" msgstr "На тази машина няма инсталиран D-Bus или липсва модула за Питон" #: gajim/gajim_remote.py:81 msgid "Shows a help on specific command" msgstr "Показва помощ за специфична команда" #: gajim/gajim_remote.py:84 msgid "command" msgstr "команда" #: gajim/gajim_remote.py:85 msgid "show help on command" msgstr "показване на помощ за команда" #: gajim/gajim_remote.py:89 #, fuzzy msgid "Lists all contacts in roster, one for each line" msgstr "" "Показване на списък с всички контакти. Всеки контакт се появява на отделен " "ред" #: gajim/gajim_remote.py:91 gajim/gajim_remote.py:106 gajim/gajim_remote.py:116 #: gajim/gajim_remote.py:130 gajim/gajim_remote.py:144 #: gajim/gajim_remote.py:153 gajim/gajim_remote.py:174 #: gajim/gajim_remote.py:204 gajim/gajim_remote.py:213 #: gajim/gajim_remote.py:220 #, fuzzy msgid "?CLI:account" msgstr "акаунт" #: gajim/gajim_remote.py:91 msgid "show only contacts of the given account" msgstr "показва само контактите на дадения акаунт" #: gajim/gajim_remote.py:97 msgid "Prints a list of registered accounts" msgstr "Показване на списък с регистрираните акаунти" #: gajim/gajim_remote.py:101 #, fuzzy msgid "Changes the status of account(s)" msgstr "Промяна на състоянието на акаунта или акаунтите" #: gajim/gajim_remote.py:104 #, fuzzy msgid "?CLI:status" msgstr "състояние" #: gajim/gajim_remote.py:104 #, fuzzy msgid "" "one of: offline, online, chat, away, xa, dnd, invisible. If not set, use " "account's previous status" msgstr "" "едно от: offline (изключен), online (на линия), chat (свободен за разговор), " "away (отсъствам), xa (не съм на разположение), dnd (зает), invisible " "(невидим)" #: gajim/gajim_remote.py:105 gajim/gajim_remote.py:127 #: gajim/gajim_remote.py:141 gajim/gajim_remote.py:152 #, fuzzy msgid "?CLI:message" msgstr "съобщение" #: gajim/gajim_remote.py:105 msgid "status message" msgstr "съобщение за състояние" #: gajim/gajim_remote.py:106 msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" msgstr "" "променя състоянието на акаунта. Ако не е указано се прави опит за смяна на " "състоянието на всички акаунти, които имат настроена опция „синхронизиране с " "общото състояние“" #: gajim/gajim_remote.py:112 #, fuzzy msgid "Changes the priority of account(s)" msgstr "Промяна на състоянието на акаунта или акаунтите" #: gajim/gajim_remote.py:114 #, fuzzy msgid "?CLI:priority" msgstr "Приори_тет:" #: gajim/gajim_remote.py:114 #, fuzzy msgid "priority you want to give to the account" msgstr "_Искам да регистрирам нов акаунт" #: gajim/gajim_remote.py:116 #, fuzzy msgid "" "change the priority of the given account. If not specified, change status of " "all accounts that have \"sync with global status\" option set" msgstr "" "променя състоянието на акаунта. Ако не е указано се прави опит за смяна на " "състоянието на всички акаунти, които имат настроена опция „синхронизиране с " "общото състояние“" #: gajim/gajim_remote.py:122 msgid "" "Sends new chat message to a contact in the roster. Both OpenPGP key and " "account are optional. If you want to set only 'account', without 'OpenPGP " "key', just set 'OpenPGP key' to ''." msgstr "" "Изпращане на ново съобщение до контакт от списъка. Опциите „account“ и " "„OpenPGP key“ са по избор. Ако искате да настроите само „account“ без " "“OpenPGP key“, настройте „OpenPGP key“ на „“." #: gajim/gajim_remote.py:126 gajim/gajim_remote.py:139 msgid "JID of the contact that will receive the message" msgstr "JID на контакта, който ще получи съобщението" #: gajim/gajim_remote.py:127 gajim/gajim_remote.py:141 #: gajim/gajim_remote.py:152 msgid "message contents" msgstr "текст на съобщението" #: gajim/gajim_remote.py:128 gajim/gajim_remote.py:142 msgid "PGP key" msgstr "" #: gajim/gajim_remote.py:128 gajim/gajim_remote.py:142 msgid "if specified, the message will be encrypted using this public key" msgstr "" "ако е указано, съобщението ще се шифрира, използвайки този публичен ключ" #: gajim/gajim_remote.py:130 gajim/gajim_remote.py:144 #: gajim/gajim_remote.py:153 msgid "if specified, the message will be sent using this account" msgstr "ако е указано, съобщението ще бъде изпратено от този акаунт" #: gajim/gajim_remote.py:135 #, fuzzy msgid "" "Sends a chat message to someone on your roster. Optionally with OpenPGP key " "and account. If you want to only set the latter, set OpenPGP key to \"\"." msgstr "" "Изпращане на ново съобщение до контакт от списъка. Опциите „account“ и " "„OpenPGP key“ са по избор. Ако искате да настроите само „account“ без " "“OpenPGP key“, настройте „OpenPGP key“ на „“." #: gajim/gajim_remote.py:140 msgid "subject" msgstr "тема" #: gajim/gajim_remote.py:140 msgid "message subject" msgstr "тема на съобщението" #: gajim/gajim_remote.py:149 msgid "Sends new message to a groupchat you've joined." msgstr "Изпраща ново съобщение до стаята, в която сте влезли." #: gajim/gajim_remote.py:151 msgid "JID of the room that will receive the message" msgstr "JID на стаята, която ще получи съобщението" #: gajim/gajim_remote.py:158 msgid "Gets detailed info on a contact" msgstr "Получаване на подробна информация за контакта" #: gajim/gajim_remote.py:160 gajim/gajim_remote.py:173 #: gajim/gajim_remote.py:203 msgid "JID of the contact" msgstr "JID на контакта" #: gajim/gajim_remote.py:164 msgid "Gets detailed info on a account" msgstr "Получаване на подробна информация за акаунта" #: gajim/gajim_remote.py:166 msgid "Name of the account" msgstr "Име на акаунта" #: gajim/gajim_remote.py:170 msgid "Sends file to a contact" msgstr "Изпращане на файл до контакт" #: gajim/gajim_remote.py:172 msgid "file" msgstr "файл" #: gajim/gajim_remote.py:172 msgid "File path" msgstr "Път до файл" #: gajim/gajim_remote.py:174 msgid "if specified, file will be sent using this account" msgstr "ако е указано, файлът бъде изпратен от този акаунт" #: gajim/gajim_remote.py:179 msgid "Lists all preferences and their values" msgstr "Показва всички настройки и техните стойности" #: gajim/gajim_remote.py:183 msgid "Sets value of 'key' to 'value'." msgstr "Настройва стойността на „ключ“ на „стойност“." #: gajim/gajim_remote.py:185 msgid "key=value" msgstr "ключ=стойност" #: gajim/gajim_remote.py:185 #, fuzzy msgid "'key' is the name of the preference, 'value' is what to set it to" msgstr "" "„ключ“ е името на настройката, „стойност“ е стойността, която се задава" #: gajim/gajim_remote.py:190 msgid "Deletes a preference item" msgstr "Изтрива обект от настройките" #: gajim/gajim_remote.py:192 msgid "key" msgstr "ключ" #: gajim/gajim_remote.py:192 msgid "name of the preference to be deleted" msgstr "име на настройката за изтриване" #: gajim/gajim_remote.py:196 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "Запазва текущото състояние на настройките във файла .config" #: gajim/gajim_remote.py:201 msgid "Removes contact from roster" msgstr "Премахване на контакт от списъка" #: gajim/gajim_remote.py:204 msgid "if specified, contact is taken from the contact list of this account" msgstr "ако е указано, контактът се взима от списъка с контакти на този акаунт" #: gajim/gajim_remote.py:211 msgid "Returns current status (the global one unless account is specified)" msgstr "Връща текущото състояние (общото, в случай, че не е указан акаунт)" #: gajim/gajim_remote.py:218 msgid "" "Returns current status message (the global one unless account is specified)" msgstr "" "Връща текущото съобщение за състояние (общото, в случай, че не е указан " "акаунт)" #: gajim/gajim_remote.py:225 msgid "Returns number of unread messages" msgstr "Връща броя непрочетени съобщения" #: gajim/gajim_remote.py:230 msgid "Sends custom XML" msgstr "Изпраща указан XML" #: gajim/gajim_remote.py:232 msgid "XML to send" msgstr "XML за изпращане" #: gajim/gajim_remote.py:233 #, fuzzy msgid "" "Account to which the XML will be sent; if not specified, XML will be sent to " "all accounts" msgstr "" "Акаунт, до който да се изпраща XML; ако не е указан, ще се изпрати до всички " "акаунти" #: gajim/gajim_remote.py:239 #, fuzzy msgid "Change the avatar" msgstr "Промяна на състоянието" #: gajim/gajim_remote.py:241 #, fuzzy msgid "Picture to use" msgstr "Псевдоним" #: gajim/gajim_remote.py:242 #, fuzzy msgid "" "Account in which the avatar will be set; if not specified, the avatar will " "be set for all accounts" msgstr "" "Акаунт, до който да се изпраща XML; ако не е указан, ще се изпрати до всички " "акаунти" #: gajim/gajim_remote.py:249 msgid "Check if Gajim is running" msgstr "Проверка дали Gajim е стартиран" #: gajim/gajim_remote.py:275 msgid "Missing argument \"contact_jid\"" msgstr "Липсващ аргумент „contact_jid“" #: gajim/gajim_remote.py:295 #, python-format msgid "" "'%s' is not in your roster.\n" "Please specify account for sending the message." msgstr "" "„%s“ не е в списъка ви.\n" "Укажете акаунт за изпращането на това съобщение." #: gajim/gajim_remote.py:298 msgid "You have no active account" msgstr "Нямате активен акаунт" #: gajim/gajim_remote.py:346 msgid "It seems Gajim is not running. So you can't use gajim-remote." msgstr "" "Изглежда Gajim не е стартиран, така че не може да ползвате gajim-remote." #: gajim/gajim_remote.py:373 #, python-format msgid "" "Usage: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" msgstr "" "Употреба: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" #: gajim/gajim_remote.py:377 msgid "Arguments:" msgstr "Аргументи:" #: gajim/gajim_remote.py:381 #, python-format msgid "%s not found" msgstr "%s не е намерен" #: gajim/gajim_remote.py:387 #, fuzzy, python-format msgid "" "Usage:\n" " %s command [arguments]\n" "\n" "Command is one of:\n" msgstr "" "Употреба: %s команда [аргументи]\n" "Командата е една от:\n" #: gajim/gajim_remote.py:457 #, python-format msgid "" "Too many arguments. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" "Твърде много аргументи. \n" "Напишете „%(basename)s help %(command)s“ за повече информация" #: gajim/gajim_remote.py:462 #, python-format msgid "" "Argument \"%(arg)s\" is not specified. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" "Не е указан аргумент „%(arg)s“.\n" "Напишете „%(basename)s help %(command)s“ за повече информация" #: gajim/common/app.py:264 msgid "Unable to load idle module" msgstr "Неуспех при зареждането на модула „idle“" #: gajim/common/fuzzyclock.py:37 msgid "twelve" msgstr "дванадесет" #: gajim/common/fuzzyclock.py:37 msgid "one" msgstr "един" #: gajim/common/fuzzyclock.py:37 msgid "two" msgstr "два" #: gajim/common/fuzzyclock.py:37 msgid "three" msgstr "три" #: gajim/common/fuzzyclock.py:37 msgid "four" msgstr "четири" #: gajim/common/fuzzyclock.py:38 msgid "five" msgstr "пет" #: gajim/common/fuzzyclock.py:38 msgid "six" msgstr "шест" #: gajim/common/fuzzyclock.py:38 msgid "seven" msgstr "седем" #: gajim/common/fuzzyclock.py:38 msgid "eight" msgstr "осем" #: gajim/common/fuzzyclock.py:38 msgid "nine" msgstr "девет" #: gajim/common/fuzzyclock.py:38 msgid "ten" msgstr "десет" #: gajim/common/fuzzyclock.py:39 msgid "eleven" msgstr "единадесет" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "%(0)s o'clock" msgstr "%(0)s часа" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "five past %(0)s" msgstr "%(0)s и пет" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "ten past %(0)s" msgstr "%(0)s и десет" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "quarter past %(0)s" msgstr "%(0)s и петнадесет" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "twenty past %(0)s" msgstr "%(0)s и двадесет" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "twenty five past %(0)s" msgstr "%(0)s и двадесет и пет" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "half past %(0)s" msgstr "%(0)s и половина" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "twenty five to %(1)s" msgstr "%(1)s без двадесет и пет" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "twenty to %(1)s" msgstr "%(1)s без двадесет" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "quarter to %(1)s" msgstr "%(1)s без петнадесет" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "ten to %(1)s" msgstr "%(1)s без десет" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "five to %(1)s" msgstr "%(1)s без пет" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "%(1)s o'clock" msgstr "%(1)s часа" #: gajim/common/fuzzyclock.py:48 gajim/common/fuzzyclock.py:50 msgid "Night" msgstr "Нощ" #: gajim/common/fuzzyclock.py:48 msgid "Early morning" msgstr "Рано сутрин" #: gajim/common/fuzzyclock.py:48 msgid "Morning" msgstr "Сутрин" #: gajim/common/fuzzyclock.py:49 msgid "Almost noon" msgstr "Почти обед" #: gajim/common/fuzzyclock.py:49 msgid "Noon" msgstr "Обед" #: gajim/common/fuzzyclock.py:49 msgid "Afternoon" msgstr "Следобед" #: gajim/common/fuzzyclock.py:49 msgid "Evening" msgstr "Вечер" #: gajim/common/fuzzyclock.py:50 msgid "Late evening" msgstr "Късно вечер" #: gajim/common/fuzzyclock.py:52 msgid "Start of week" msgstr "Началото на седмицата" #: gajim/common/fuzzyclock.py:52 gajim/common/fuzzyclock.py:53 msgid "Middle of week" msgstr "Средата на седмицата" #: gajim/common/fuzzyclock.py:53 msgid "End of week" msgstr "Края на седмицата" #: gajim/common/fuzzyclock.py:53 msgid "Weekend!" msgstr "Събота и неделя!" #: gajim/common/connection_handlers_events.py:369 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " "management tools such as http://jru.jabberstudio.org/ to remove it" msgstr "" "JID %s не е съгласно стандарта по RFC. Няма да бъде добавен към списъка. " "Използвайте инструменти за управление на списък като http://jru.jabberstudio." "org/, за да го премахнете." #: gajim/common/connection_handlers_events.py:852 #, python-format msgid "unsubscribe request from %s" msgstr "искане за отписване от %s" #: gajim/common/connection_handlers_events.py:952 msgid "Room has been destroyed" msgstr "Стаята е била унищожена" #: gajim/common/connection_handlers_events.py:960 #, python-format msgid "You can join this room instead: %s" msgstr "Вместо това може да влезете в тази стая: %s" #: gajim/common/connection_handlers_events.py:1979 #, python-format msgid "Unknown SSL error: %d" msgstr "Неизвестна грешка на SSL: %d" #: gajim/common/connection_handlers_events.py:2625 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Ново еднократно съобщение от %(nickname)s" #: gajim/common/connection_handlers_events.py:2631 #, python-format msgid "New Private Message from group chat %s" msgstr "Ново лично съобщение от стая „%s“" #: gajim/common/connection_handlers_events.py:2634 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" #: gajim/common/connection_handlers_events.py:2637 #, python-format msgid "Messaged by %(nickname)s" msgstr "Съобщение от %(nickname)s" #: gajim/common/connection_handlers_events.py:2643 #, python-format msgid "New Message from %(nickname)s" msgstr "Ново съобщение от %(nickname)s" #: gajim/common/connection_handlers_events.py:2809 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s промени състоянието си" #: gajim/common/connection_handlers_events.py:2817 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s се включи" #: gajim/common/connection_handlers_events.py:2823 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s се изключи" #: gajim/common/contacts.py:386 msgid "Not in roster" msgstr "Не е в списъка" #: gajim/common/config.py:76 msgid "" "Show desktop notification even when a chat window is opened for this contact " "and does not have focus" msgstr "" #: gajim/common/config.py:77 msgid "Play sound when user is busy" msgstr "" #: gajim/common/config.py:79 msgid "Show only online and free for chat contacts in roster." msgstr "" #: gajim/common/config.py:82 msgid "Time in minutes, after which your status changes to away." msgstr "Време в минути, след което състоянието да се променя на „Отсъствам“." #: gajim/common/config.py:83 msgid "$S (Away as a result of being idle more than $T min)" msgstr "$S (Отсъствам поради липса на активност над $T мин)" #: gajim/common/config.py:83 #, fuzzy msgid "$S will be replaced by current status message, $T by autoawaytime." msgstr "" "$S ще бъде заменено от текущото съобщение за състояние, а $T от времето на " "отсъствие." #: gajim/common/config.py:85 msgid "Time in minutes, after which your status changes to not available." msgstr "" "Време в минути, след което състоянието да се променя на „Не съм на " "разположение“." #: gajim/common/config.py:86 msgid "$S (Not available as a result of being idle more than $T min)" msgstr "$S (Не съм на разположение поради липса на активност над $T мин)" #: gajim/common/config.py:86 #, fuzzy msgid "$S will be replaced by current status message, $T by autoxatime." msgstr "" "$S ще бъде заменено от текущото съобщение за състояние, а $T от времето на " "отсъствие." #: gajim/common/config.py:89 msgid "" "When to show notification area icon. Can be 'never', 'on_event', 'always'." msgstr "" #: gajim/common/config.py:90 msgid "Allow to hide the roster window even if the tray icon is not shown." msgstr "" #: gajim/common/config.py:95 #, fuzzy msgid "Incoming nickname color." msgstr "Невалиден псевдоним" #: gajim/common/config.py:96 msgid "Outgoing nickname color." msgstr "" #: gajim/common/config.py:97 msgid "Incoming text color." msgstr "" #: gajim/common/config.py:98 msgid "Outgoing text color." msgstr "" #: gajim/common/config.py:99 #, fuzzy msgid "Status message text color." msgstr "текст на съобщението за състояние" #: gajim/common/config.py:102 #, fuzzy msgid "Contact signed in notification color." msgstr "Показване на събитието в спис_ъка" #: gajim/common/config.py:103 #, fuzzy msgid "Contact signout notification color" msgstr "Показване на събитието в спис_ъка" #: gajim/common/config.py:104 #, fuzzy msgid "New message notification color." msgstr "Показване на нови съобщения в изскачащ прозорец?" #: gajim/common/config.py:105 #, fuzzy msgid "File transfer request notification color." msgstr "Запитване за файлов трансфер" #: gajim/common/config.py:106 #, fuzzy msgid "File transfer error notification color." msgstr "Файловият трансфер е прекъснат" #: gajim/common/config.py:107 #, fuzzy msgid "File transfer complete or stopped notification color." msgstr "Уведомяване чрез изскачащ прозорец при завършване на файловия трансфер" #: gajim/common/config.py:108 #, fuzzy msgid "Groupchat invitation notification color" msgstr "Покана за разговор в стая" #: gajim/common/config.py:109 #, fuzzy msgid "Background color of status changed notification" msgstr "Цвят на фона на контактите, които се включват." #: gajim/common/config.py:110 msgid "Other dialogs color." msgstr "" #: gajim/common/config.py:111 #, fuzzy msgid "Incoming nickname font." msgstr "Невалиден псевдоним" #: gajim/common/config.py:112 #, fuzzy msgid "Outgoing nickname font." msgstr "Промяна на псевдонима" #: gajim/common/config.py:113 msgid "Incoming text font." msgstr "" #: gajim/common/config.py:114 msgid "Outgoing text font." msgstr "" #: gajim/common/config.py:115 #, fuzzy msgid "Status message text font." msgstr "текст на съобщението за състояние" #: gajim/common/config.py:116 msgid "" "List (space separated) of rows (accounts and groups) that are collapsed." msgstr "" "Списък (разделен с интервали) на редове (акаунти и групи), които да се " "свиват автоматично." #: gajim/common/config.py:123 msgid "Language used by speller" msgstr "Език, който да се използва за проверката на правописа" #: gajim/common/config.py:124 msgid "" "'always' - print time for every message.\n" "'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" "'never' - never print time." msgstr "" "„always“ - изписване на часа при всяко съобщение.\n" "„sometimes“ - изписване на часа през интервал, указан в " "„print_ichat_every_foo_minutes“.\n" "„never“ - никога да не се изписва часа." #: gajim/common/config.py:125 msgid "" "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " "to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " "This is used only if print_time is 'sometimes'." msgstr "" "Изписване на часа при разговорите чрез „Относителен часовник“. Стойността на " "относителността е от 1 до 4, или 0 за премахването на относителния часовник. " "1 е най-прецизния часовник, 4 е най-относителния. Това е в сила само ако " "опцията „print_time“ е настроена на „sometimes“." #: gajim/common/config.py:127 msgid "Enable ASCII emoticons" msgstr "" #: gajim/common/config.py:129 msgid "Treat * / _ pairs as possible formatting characters." msgstr "Тълкуване на двойки от „* / _“ като възможни символи за форматиране." #: gajim/common/config.py:130 msgid "" "If True, do not remove */_ . So *abc* will be bold but with * * not removed." msgstr "" "Ако е активирана, не се премахват */_. Така *абв* ще е в получер стил, но " "със символите * *." #: gajim/common/config.py:133 msgid "" "Uses ReStructured text markup to send HTML, plus ascii formatting if " "selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" "restructuredtext.html (If you want to use this, install docutils)" msgstr "" "Ако е избрана, използва реструктуриран текст за изпращане на HTML и " "форматиране в ASCII, ако е указано. За синтаксиса, вижте http://docutils." "sourceforge.net/docs/ref/rst/restructuredtext.html (Ако искате да използвате " "това, инсталирайте docutils)" #: gajim/common/config.py:142 msgid "" "Character to add after nickname when using nick completion (tab) in group " "chat." msgstr "" "Знак за добавяне след името на псевдонима при използване на автоматично " "допълване (TAB) в стая." #: gajim/common/config.py:143 msgid "" "Character to propose to add after desired nickname when desired nickname is " "used by someone else in group chat." msgstr "" "Знак, който да се предложи да бъде добавен след желания псевдоним, когато " "той вече е използван от някой в стаята." #: gajim/common/config.py:165 msgid "" "If True, Gajim will save roster position when hiding roster, and restore it " "when showing roster." msgstr "" #: gajim/common/config.py:171 msgid "Place the roster on the right in single window mode" msgstr "" #: gajim/common/config.py:177 msgid "" "This option let you customize timestamp that is printed in conversation. For " "exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " "strftime for full documentation: http://docs.python.org/lib/module-time.html" msgstr "" "Чрез тази опция може да персонализирате начина на изписване на времето в " "разговор. Например „[%H:%M] “ ще показва „час:минути] “. Вижте " "документацията на Питон относно „strftime“ за повече информация: http://docs." "python.org/lib/module-time.html" #: gajim/common/config.py:178 msgid "Characters that are printed before the nickname in conversations" msgstr "Знаци, които се изобразяват в разговори преди псевдонима" #: gajim/common/config.py:179 msgid "Characters that are printed after the nickname in conversations" msgstr "Знаци, които се изобразяват в разговори след псевдонима" #: gajim/common/config.py:181 msgid "Add * and [n] in roster title?" msgstr "Добавяне на * и [n] към заглавието на списъка?" #: gajim/common/config.py:182 #, fuzzy msgid "" "How many history messages should be restored when a chat tab/window is " "reopened?" msgstr "" "Колко реда от предишния разговор да за запомнят при повторното отваряне на " "подпрозорец/прозорец." #: gajim/common/config.py:183 msgid "How far back in time (minutes) history is restored. -1 means no limit." msgstr "" #: gajim/common/config.py:184 msgid "" "How many lines to request from server when entering a groupchat. -1 means no " "limit" msgstr "" #: gajim/common/config.py:185 msgid "" "Minutes of backlog to request when entering a groupchat. -1 means no limit" msgstr "" #: gajim/common/config.py:186 msgid "" "How many seconds to wait before trying to autorejoin to a conference you are " "being disconnected from. Set to 0 to disable autorejoining." msgstr "" #: gajim/common/config.py:187 msgid "" "Should autorejoin be activated when we are being kicked from a conference?" msgstr "" #: gajim/common/config.py:188 msgid "" "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " "Client default behaviour)." msgstr "Изпращане на съобщение при Ctrl+Enter и нов ред с „Enter“." #: gajim/common/config.py:190 msgid "How many lines to store for Ctrl+KeyUP." msgstr "Колко реда да се запазват за Ctrl+горна стрелка." #: gajim/common/config.py:193 #, fuzzy, python-format msgid "" "Either custom url with %%s in it where %%s is the word/phrase or " "'WIKTIONARY' which means use wiktionary." msgstr "" "Или определен адрес, съдържащ %s, където %s е думата/фразата, или " "„WIKTIONARY“, което означава използване на wiktionary." #: gajim/common/config.py:196 msgid "If checked, Gajim can be controlled remotely using gajim-remote." msgstr "" "Ако тази опция е избрана, Gajim може да се контролира отдалечено чрез gajim-" "remote." #: gajim/common/config.py:197 msgid "" "Sent chat state notifications. Can be one of all, composing_only, disabled." msgstr "" "Изпращане на уведомления за състоянието на разговор. Може да бъде „all“, " "„composing_only“, „disabled“." #: gajim/common/config.py:198 msgid "" "Displayed chat state notifications in chat windows. Can be one of all, " "composing_only, disabled." msgstr "" "Показвани уведомления за състоянието на разговора в прозорците за разговор. " "Може да бъде „all“, „composing_only“, „disabled“." #: gajim/common/config.py:200 msgid "" "When not printing time for every message (print_time==sometimes), print it " "every x minutes." msgstr "" "Когато не се изписва часа на всяко съобщение („print_time“ е настроено на " "„sometimes“), да се показва на всеки x минути." #: gajim/common/config.py:201 msgid "Ask before closing a group chat tab/window." msgstr "Питане преди затваряне на подпрозорец/прозорец на стая." #: gajim/common/config.py:202 #, fuzzy msgid "" "Always ask for confirmation before closing groupchats with any of the JIDs " "on this space separated list." msgstr "" "Винаги да се пита преди затваряне на подпрозорец/прозорец на стая от този " "списък с адреси на стаи." #: gajim/common/config.py:203 #, fuzzy msgid "" "Never ask for confirmation before closing groupchats with any of the JIDs on " "this space separated list." msgstr "" "Никога да не се пита преди затваряне на подпрозорец/прозорец на стая от този " "списък с адреси на стаи." #: gajim/common/config.py:204 msgid "" "Ask before closing tabbed chat window if there are controls that can lose " "data (chat, private chat, groupchat that will not be minimized)" msgstr "" #: gajim/common/config.py:207 msgid "" "Comma separated list of hosts that we send, in addition of local interfaces, " "for File Transfer in case of address translation/port forwarding." msgstr "" "Списък от хостове, разделен със запетаи, които се изпращат като допълнение " "към локалните интерфейси за файлов трансфер в случай, че се ползва NAT/" "пренасочване на портове." #: gajim/common/config.py:209 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." msgstr "Според стандарта на IEC KiB = 1024 байта, KB = 1000 байта." #: gajim/common/config.py:211 #, fuzzy msgid "Notify of events in the notification area." msgstr "Уведомяване за събития в областта за уведомяване." #: gajim/common/config.py:212 msgid "" "If False, Gajim will display a static event icon instead of the blinking " "status icon in the notification area when notifying on event." msgstr "" #: gajim/common/config.py:218 msgid "Show tab when only one conversation?" msgstr "Показване на подпрозорец при един разговор?" #: gajim/common/config.py:219 msgid "Show tabbed notebook border in chat windows?" msgstr "Показване на границата на подпрозореца в прозорците за разговор?" #: gajim/common/config.py:220 msgid "Show close button in tab?" msgstr "Показване на бутона за затваряне на подпрозореца?" #: gajim/common/config.py:221 msgid "" "A list of modp groups to use in a Diffie-Hellman, highest preference first, " "separated by commas. Valid groups are 1, 2, 5, 14, 15, 16, 17 and 18. Higher " "numbers are more secure, but take longer to calculate when you start a " "session." msgstr "" "Списък от групи „modp“ за употреба чрез алгоритъма „Дифи-Хелман“, разделени " "чрез запетаи, най-предпочитаните в началото. Валидни групи са 1, 2, 5, 14, " "15, 16, 17 и 18. По-големите числа са по-сигурни, но изчисленията отнемат " "повече време в началото на сесията." #: gajim/common/config.py:234 msgid "Preview new messages in notification popup?" msgstr "Показване на нови съобщения в изскачащ прозорец?" #: gajim/common/config.py:237 msgid "" "A semicolon-separated list of words that will be highlighted in group chats." msgstr "" "Списък с думи, отделени с точка и запетая, които ще се осветяват при " "разговор в стая." #: gajim/common/config.py:238 #, fuzzy msgid "" "If True, quits Gajim when X button of Window Manager is clicked. This " "setting is taken into account only if notification icon is used." msgstr "" "Ако е активирана, се спира програмата при натискане на бутона „X“ на " "администратора на прозорци. Тази настройка е валидна само ако се използва " "иконата в областта за уведомяване." #: gajim/common/config.py:239 msgid "" "If True, Gajim hides the Roster window on pressing the X button instead of " "minimizing into the Dock." msgstr "" #: gajim/common/config.py:240 msgid "" "If True, Gajim will display an icon on each tab containing unread messages. " "Depending on the theme, this icon may be animated." msgstr "" "Ако е активирана, ще се изобразява икона във всеки подпрозорец, съдържащ " "непрочетени съобщения. В зависимост от темата иконата може да бъде анимирана." #: gajim/common/config.py:241 msgid "" "If True, Gajim will display the status message, if not empty, for every " "contact under the contact name in roster window." msgstr "" "Ако е активирана, ще се показва съобщението за състояние, ако има такова, на " "всеки контакт под името му списъка." #: gajim/common/config.py:247 msgid "Define the position of the avatar in roster. Can be left or right" msgstr "" "Позиция на аватара в списъка. Може да е ляво (left) или дясно (right)." #: gajim/common/config.py:248 msgid "" "If False, Gajim will no longer print status line in chats when a contact " "changes his or her status and/or his or her status message." msgstr "" "Ако е изключена, вече няма да виждате реда за състоянието при разговорите, " "когато контактът променя състоянието си." #: gajim/common/config.py:249 #, fuzzy msgid "" "Can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " "longer print status line in groupchats when a member changes his or her " "status and/or his or her status message. If \"all\" Gajim will print all " "status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " "group chat." msgstr "" "Може да бъде „none“, „all“ или „in_and_out“. Ако е „none“, няма да се " "изписват състоянията в стаите, когато някой член сменя съобщението си за " "състояние или влиза/излиза в стаята. Ако е „all“, ще се изписват всички " "съобщения за състояние. Ако е „in_and_out“, ще се изписва само „Сульо влезе " "в стаята“ или „Сульо напусна“." #: gajim/common/config.py:251 msgid "Log XHTML messages instead of plain text messages." msgstr "" #: gajim/common/config.py:252 msgid "Background color of contacts when they just signed in." msgstr "Цвят на фона на контактите, които се включват." #: gajim/common/config.py:253 msgid "Background color of contacts when they just signed out." msgstr "Цвят на фона на контактите, които се изключват." #: gajim/common/config.py:255 msgid "" "If True, restored messages will use a smaller font than the default one." msgstr "" "Ако е активирана, ще се използва по-малък шрифт от стандартния за " "възстановените съобщения." #: gajim/common/config.py:256 msgid "Don't show avatar for the transport itself." msgstr "Да не се показва аватара на транспорта." #: gajim/common/config.py:257 msgid "Don't show roster in the system taskbar." msgstr "Да не се показва списъка в панела." #: gajim/common/config.py:258 msgid "" "If True and installed GTK+ and PyGTK versions are at least 2.8, make the " "window flash (the default behaviour in most Window Managers) when holding " "pending events." msgstr "" "Ако е активирана и инсталираните версии на GTK+ и PyGTK са поне 2.8, " "прозорецът ще мига (стандартното поведение при повечето мениджъри на " "прозорци) при задържане на чакащи събития." #: gajim/common/config.py:260 msgid "" "Jabberd1.4 does not like sha info when one join a password protected group " "chat. Turn this option to False to stop sending sha info in group chat " "presences." msgstr "" "Jabberd1.4 не харесва информация от тип SHA при включване в стая, защитена с " "пароли. Настройте тази опция на „Изключена“, за да спрете да изпращате " "информация от тип SHA при присъствие в стаи." #: gajim/common/config.py:263 #, fuzzy msgid "" "Controls the window where new messages are placed.\n" "'always' - All messages are sent to a single window.\n" "'always_with_roster' - Like 'always' but the messages are in a single window " "along with the roster.\n" "'never' - All messages get their own window.\n" "'peracct' - Messages for each account are sent to a specific window.\n" "'pertype' - Each message type (e.g. chats vs. groupchats) is sent to a " "specific window." msgstr "" "Контролира прозореца, където се отварят нови съобщения.\n" "„always“ — Всички съобщения се отварят в един прозорец.\n" "„always_with_roster“ — Като „always“, но съобщенията са в общ прозорец със " "списъка.\n" "„never“ — Всички съобщения се отварят в собствен прозорец.\n" "„peracct“ — Съобщенията за всеки акаунт се отварят в специфичен прозорец.\n" "„pertype“ — Всеки тип съобщение (т.е. разговор и от стая) се отварят в " "специфичен прозорец." #: gajim/common/config.py:264 msgid "" "Show roster on startup.\n" "'always' - Always show roster.\n" "'never' - Never show roster.\n" "'last_state' - Restore the last state roster." msgstr "" #: gajim/common/config.py:265 msgid "If False, you will no longer see the avatar in the chat window." msgstr "" "Ако е изключена, повече няма да виждате аватар в прозореца за разговор." #: gajim/common/config.py:266 msgid "If True, pressing the escape key closes a tab/window." msgstr "" "Ако е активирана, натискането на клавиша „Escape“ затваря прозореца/" "подпрозореца." #: gajim/common/config.py:267 msgid "Hides the banner in a group chat window" msgstr "Скрива лентата в прозореца на стаята" #: gajim/common/config.py:268 msgid "Hides the banner in two persons chat window" msgstr "Скрива лентата в прозорец за разговор с два контакта" #: gajim/common/config.py:269 msgid "Hides the group chat occupants list in group chat window." msgstr "Скрива списъка на участниците в прозореца на стаята." #: gajim/common/config.py:270 msgid "" "In a chat, show the nickname at the beginning of a line only when it's not " "the same person talking than in previous message." msgstr "" "В разговор, показва псевдонима в началото на реда само ако не е същия човек, " "който е написал предното съобщение." #: gajim/common/config.py:271 msgid "Indentation when using merge consecutive nickname." msgstr "Отстъп, когато се използва смесване на последователен псевдоним." #: gajim/common/config.py:272 msgid "" "List of colors, separated by \":\", that will be used to color nicknames in " "group chats." msgstr "" "Списък с цветове, разделени с „:“, които да се използват за оцветяване на " "псевдонимите в стаите." #: gajim/common/config.py:273 msgid "Ctrl-Tab go to next composing tab when none is unread." msgstr "Ctrl-TAB отива на следващия подпрозорец, когато всички са прочетени." #: gajim/common/config.py:274 msgid "" "Should we show the confirm metacontacts creation dialog or not? Empty string " "means we never show the dialog." msgstr "" "Да се показва ли диалогов прозорец за потвърждение при създаване на мета-" "контакти? Празен низ означава никога да не се показва диалогов прозорец." #: gajim/common/config.py:275 #, fuzzy msgid "" "Should we show the confirm block contact dialog or not? Empty string means " "we never show the dialog." msgstr "" "Да се показва ли диалогов прозорец за потвърждение при създаване на мета-" "контакти? Празен низ означава никога да не се показва диалогов прозорец." #: gajim/common/config.py:276 #, fuzzy msgid "" "Should we show the confirm custom status dialog or not? Empty string means " "we never show the dialog." msgstr "" "Да се показва ли диалогов прозорец за потвърждение при създаване на мета-" "контакти? Празен низ означава никога да не се показва диалогов прозорец." #: gajim/common/config.py:277 msgid "" "If True, you will be able to set a negative priority to your account in " "account modification window. BE CAREFUL, when you are logged in with a " "negative priority, you will NOT receive any message from your server." msgstr "" "Ако е активирана, ще може да настроите отрицателен приоритет за акаунта в " "прозореца за промяна на акаунти. ВНИМАВАЙТЕ, понеже когато сте свързани с " "отрицателен приоритет, НЯМА да получите нито едно съобщение от сървъра." #: gajim/common/config.py:278 msgid "" "If True, Gajim will show number of online and total contacts in account and " "group rows." msgstr "" "Ако е активирана, Gajim ще показва броя на включените контакти и общия брой " "в редовете за акаунти и групи." #: gajim/common/config.py:279 msgid "" "Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " "as if they were of this type" msgstr "" "Може да е празно, „chat“ или „normal“. Ако не е празно, всички входящи " "съобщения се третират като от указания тип." #: gajim/common/config.py:280 msgid "" "If True, Gajim will scroll and select the contact who sent you the last " "message, if chat window is not already opened." msgstr "" "Ако е активирана, Gajim ще прелиства списъка избирайки контакта, който ви е " "изпратил последното съобщение, в случай, че прозорецът за разговор не е вече " "отворен." #: gajim/common/config.py:281 msgid "Time of inactivity needed before the change status window closes down." msgstr "" "Необходимо време без активност преди прозорецът за промяна на състоянието да " "се затвори." #: gajim/common/config.py:282 msgid "" "Maximum number of lines that are printed in conversations. Oldest lines are " "cleared." msgstr "" "Максимален брой редове, които да се показват в разговорите. Най-старите " "редове се изчистват." #: gajim/common/config.py:283 #, fuzzy msgid "" "If True, notification windows from notification-daemon will be attached to " "notification icon." msgstr "" "Ако активирана, прозорците за уведомления от „notification-daemon“ ще бъдат " "прикрепени към иконата в областта за уведомяване." #: gajim/common/config.py:284 msgid "Choose interval between 2 checks of idleness." msgstr "Интервал между две проверки за липса на активност." #: gajim/common/config.py:285 #, fuzzy msgid "" "Valid uri schemes. Only schemes in this list will be accepted as \"real\" " "uri. (mailto and xmpp are handled separately)" msgstr "" "Валидни схеми на адреси. Само схемите в този списък ще бъдат достъпни като " "„истински“ адреси." #: gajim/common/config.py:286 msgid "If True, completion in groupchats will be like a shell auto-completion" msgstr "" #: gajim/common/config.py:287 msgid "" "When is self contact row displayed. Can be \"always\", \"when_other_resource" "\" or \"never\"" msgstr "" #: gajim/common/config.py:292 msgid "Optionally fix jingle output video framerate. Example: 10/1 or 25/2" msgstr "" #: gajim/common/config.py:293 msgid "Optionally resize jingle output video. Example: 320x240" msgstr "" #: gajim/common/config.py:294 msgid "If True, You will also see your webcam" msgstr "" #: gajim/common/config.py:297 msgid "" "If True, Gajim will try to use a STUN server when using Jingle. The one in " "\"stun_server\" option, or the one given by the XMPP server." msgstr "" #: gajim/common/config.py:298 msgid "STUN server to use when using Jingle" msgstr "" #: gajim/common/config.py:299 msgid "" "If True, Gajim will show affiliation of groupchat occupants by adding a " "colored square to the status icon" msgstr "" #: gajim/common/config.py:300 msgid "" "Proxy used for all outgoing connections if the account does not have a " "specific proxy configured" msgstr "" #: gajim/common/config.py:301 msgid "If True, Gajim will ignore incoming attention requestd (\"wizz\")." msgstr "" #: gajim/common/config.py:302 msgid "" "If enabled, Gajim will reopen chat windows that were opened last time Gajim " "was closed." msgstr "" #: gajim/common/config.py:303 #, fuzzy msgid "" "If enabled, Gajim will show an icon to show that sent message has been " "received by your contact" msgstr "" "Ако тази опция е избрана, няма да се пита за съобщение за състояние — ще се " "използва стандартно зададеното." #: gajim/common/config.py:304 msgid "Show a mini avatar in chat window tabs and in window icon" msgstr "" #: gajim/common/config.py:305 #, fuzzy msgid "If True, Gajim will use the Systems Keyring to store account passwords." msgstr "" "Ако е активирана, Gajim ще използва набора на ключове на GNOME (gnome-" "keyring), ако е достъпен, за да запазва информация за паролите на акаунтите." #: gajim/common/config.py:306 msgid "Sets the encoding used by python-gnupg" msgstr "" #: gajim/common/config.py:307 msgid "If True, Gajim will execute XEP-0146 Commands." msgstr "" #: gajim/common/config.py:308 msgid "All non-compliant MAM Groupchats" msgstr "" #: gajim/common/config.py:324 msgid "" "Priority will change automatically according to your status. Priorities are " "defined in autopriority_* options." msgstr "" "Приоритетът ще се променя автоматично в съответствие със състоянието ви. " "Приоритетите се настройват в опциите „autopriority_*“." #: gajim/common/config.py:332 msgid "" "Status used to autoconnect as. Can be online, chat, away, xa, dnd, " "invisible. NOTE: this option is used only if restore_last_status is disabled" msgstr "" "Състояние при автоматично включване. Може да е „online“, „chat“, „away“, " "„xa“, „dnd“ или „invisible“. ЗАБЕЛЕЖКА: Тази опция се използва само ако " "„restore_last_status“ е изключена." #: gajim/common/config.py:333 msgid "If enabled, restore the last status that was used." msgstr "Ако е активирана, възстановява се последното използвано състояние." #: gajim/common/config.py:335 msgid "" "If True, Contacts requesting authorization will be automatically accepted." msgstr "" #: gajim/common/config.py:336 #, fuzzy msgid "" "If False, this account will be disabled and will not appear in roster window." msgstr "" "Ако е изключена, повече няма да виждате аватар в прозореца за разговор." #: gajim/common/config.py:339 msgid "" "If disabled, don't sign presences with GPG key, even if GPG is configured." msgstr "" "Ако е изключена, не се се подписват съобщенията за състояние с ключ на GPG, " "дори и да е конфигуриран." #: gajim/common/config.py:341 msgid "Enable ESessions encryption for this account." msgstr "Активира шифриране тип „ESessions“ за този акаунт." #: gajim/common/config.py:342 msgid "Should Gajim automatically start an encrypted session when possible?" msgstr "Дали Gajim да започва шифрирана сесия автоматично, ако е възможно?" #: gajim/common/config.py:343 msgid "Allow plaintext connections" msgstr "" #: gajim/common/config.py:346 msgid "" "List (space separated) of authentication mechanisms to try. Can contain " "ANONYMOUS, EXTERNAL, GSSAPI, SCRAM-SHA-1-PLUS, SCRAM-SHA-1, DIGEST-MD5, " "PLAIN, X-MESSENGER-OAUTH2 or XEP-0078" msgstr "" #: gajim/common/config.py:347 #, fuzzy msgid "" "Show a warning dialog before sending password on an plaintext connection. " "Can be 'warn', 'connect', 'disconnect'" msgstr "" "Показване на предупреждение преди изпращане на паролата при нешифрирана " "връзка." #: gajim/common/config.py:348 msgid "Show a warning dialog before using standard SSL library." msgstr "" "Показване на предупреждение преди използване на стандартната библиотека на " "SSL." #: gajim/common/config.py:349 #, fuzzy msgid "" "Show a warning dialog before sending PLAIN password over a plain connection." msgstr "" "Показване на предупреждение преди изпращане на паролата при нешифрирана " "връзка." #: gajim/common/config.py:352 msgid "Space separated list of ssl errors to ignore." msgstr "Списък (разделен с шпации) от грешки на SSL, които да се пренебрегват." #: gajim/common/config.py:358 msgid "" "Space separated list of JIDs for which you do not want to store logs. You " "can also add account name to log nothing for this account." msgstr "" #: gajim/common/config.py:359 msgid "" "On startup, Gajim will download logs stored on server, provided the server " "supports XEP-0313" msgstr "" #: gajim/common/config.py:360 msgid "" "Space separated list of JIDs for which you accept to not log conversations " "if he does not want to." msgstr "" #: gajim/common/config.py:363 msgid "Whitespace sent after inactivity" msgstr "" #: gajim/common/config.py:364 msgid "XMPP ping sent after inactivity" msgstr "" #: gajim/common/config.py:368 #, fuzzy msgid "" "How many seconds to wait for the answer of ping alive packet before we try " "to reconnect?" msgstr "" "Колко секунди да се чака за отговор на изпратен пакет за поддържане на " "връзката, преди да да се опита свързване наново." #: gajim/common/config.py:372 msgid "Jabberd2 workaround" msgstr "Заобикалка заради Jabberd2" #: gajim/common/config.py:375 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." msgstr "" "Ако тази опция е избрана, ще се използва вашия IP адрес и сървърите-" "посредници, указани в опцията file_transfer_proxies, за файлови трансфери." #: gajim/common/config.py:376 msgid "" "If True, Gajim will test file transfer proxies on startup to be sure it " "works. Openfire's proxies are known to fail this test even if they work." msgstr "" #: gajim/common/config.py:389 msgid "Answer to receipt requests" msgstr "Отговор на заявки" #: gajim/common/config.py:390 msgid "Sent receipt requests" msgstr "Изпратени заявки" #: gajim/common/config.py:399 #, fuzzy msgid "" "Allow Gajim to send information about the operating system you are running." msgstr "" "Ако тази опция е избрана, контактите ще могат да откриват операционната " "система, която използвате." #: gajim/common/config.py:400 #, fuzzy msgid "Allow Gajim to send your local time." msgstr "%s иска да ви изпрати файл." #: gajim/common/config.py:401 msgid "" "When negotiating an encrypted session, should Gajim assume you want your " "messages to be logged?" msgstr "" "Когато се договаря шифрирана сесия, да се приема ли, че искате собствените " "съобщения да се запазват в дневник?" #: gajim/common/config.py:404 #, fuzzy msgid "Message that is sent to contacts you want to add" msgstr "Попълнете данните за контакта, който искате да добавите" #: gajim/common/config.py:405 msgid "" "If enabled and if server supports this feature, Gajim will receive messages " "sent and received by other resources." msgstr "" #: gajim/common/config.py:406 msgid "" "If enabled, Gajim will send your local IPs so your contact can connect to " "your machine to transfer files." msgstr "" #: gajim/common/config.py:407 #, fuzzy msgid "Latest token for OAuth 2.0 authentication." msgstr "Използване на удостоверяване" #: gajim/common/config.py:408 #, fuzzy msgid "client_id for OAuth 2.0 authentication." msgstr "Използване на удостоверяване" #: gajim/common/config.py:409 #, fuzzy msgid "redirect_url for OAuth 2.0 authentication." msgstr "Използване на удостоверяване" #: gajim/common/config.py:410 msgid "" "Space separated list of JIDs for which we want to re-open a chat window on " "next startup." msgstr "" #: gajim/common/config.py:412 msgid "HTTP Upload: Enable HTTPS Verification" msgstr "" #: gajim/common/config.py:413 msgid "" "Preferred file transfer mechanism for file drag&drop on chat window. Can be " "'httpupload' (default) or 'jingle'" msgstr "" #: gajim/common/config.py:476 gajim/common/config.py:481 msgid "Language for which we want to check misspelled words" msgstr "Език, за който желаете да се проверяват сгрешените думи." #: gajim/common/config.py:478 msgid "The currently active encryption for that contact" msgstr "" #: gajim/common/config.py:482 msgid "" "How many lines to request from server when entering a groupchat. -1 means no " "limit, -2 means global value" msgstr "" #: gajim/common/config.py:483 msgid "" "Minutes of backlog to request when entering a groupchat. -1 means no limit, " "-2 means global value" msgstr "" #: gajim/common/config.py:484 msgid "State whether we want a notification for every message in this room" msgstr "" #: gajim/common/config.py:487 msgid "" "State whether plugins should be activated on startup (this is saved on Gajim " "exit). This option SHOULD NOT be used to (de)activate plug-ins. Use GUI " "instead." msgstr "" #: gajim/common/config.py:492 gajim/common/pep.py:157 msgid "Sleeping" msgstr "Спя" #: gajim/common/config.py:493 msgid "Back soon" msgstr "Връщам се скоро" #: gajim/common/config.py:493 msgid "Back in some minutes." msgstr "Ще се върна след малко." #: gajim/common/config.py:494 gajim/common/pep.py:127 msgid "Eating" msgstr "Хапвам" #: gajim/common/config.py:494 msgid "I'm eating, so leave me a message." msgstr "Хапвам, така че ми оставете съобщение." #: gajim/common/config.py:495 msgid "Movie" msgstr "Филм" #: gajim/common/config.py:495 msgid "I'm watching a movie." msgstr "Гледам филм." #: gajim/common/config.py:496 gajim/common/pep.py:186 msgid "Working" msgstr "Работя" #: gajim/common/config.py:496 msgid "I'm working." msgstr "Работя." #: gajim/common/config.py:497 msgid "Phone" msgstr "Телефон" #: gajim/common/config.py:497 msgid "I'm on the phone." msgstr "Говоря по телефона." #: gajim/common/config.py:498 msgid "Out" msgstr "Навън" #: gajim/common/config.py:498 msgid "I'm out enjoying life." msgstr "Наслаждавам се на живота навън." #: gajim/common/config.py:509 msgid "I'm available." msgstr "На линия съм." #: gajim/common/config.py:510 msgid "I'm free for chat." msgstr "Свободен за разговор." #: gajim/common/config.py:512 msgid "I'm not available." msgstr "Не съм на разположение." #: gajim/common/config.py:513 msgid "Do not disturb." msgstr "Не ме притеснявайте." #: gajim/common/config.py:514 gajim/common/config.py:515 msgid "Bye!" msgstr "Довиждане!" #: gajim/common/config.py:526 msgid "" "Sound to play when a group chat message contains one of the words in " "muc_highlight_words, or when a group chat message contains your nickname." msgstr "" "Звукът, който да се възпроизвежда, когато в стаята се изпише дума от " "„muc_higlighted_words“ или когато съобщение съдържа псевдонима ви." #: gajim/common/config.py:527 msgid "Sound to play when any MUC message arrives." msgstr "Звук за изпълнение при получаване на каквото и да е съобщение в стая." #: gajim/common/config.py:535 gajim/common/optparser.py:357 msgid "green" msgstr "зелена" #: gajim/common/config.py:539 gajim/common/optparser.py:343 msgid "grocery" msgstr "колониална" #: gajim/common/config.py:543 msgid "human" msgstr "хуманна" #: gajim/common/config.py:547 msgid "marine" msgstr "морска" #: gajim/common/config.py:554 #, fuzzy msgid "Tor" msgstr "За" #: gajim/common/commands.py:86 msgid "Change status information" msgstr "Промяна на информацията за състоянието" #: gajim/common/commands.py:108 msgid "Change status" msgstr "Промяна на състоянието" #: gajim/common/commands.py:109 msgid "Set the presence type and description" msgstr "Настройване на съобщението за състояние и описанието му" #: gajim/common/commands.py:115 msgid "Free for chat" msgstr "Свободен за разговор" #: gajim/common/commands.py:116 msgid "Online" msgstr "На линия" #: gajim/common/commands.py:118 msgid "Extended away" msgstr "Не съм на разположение" #: gajim/common/commands.py:119 msgid "Do not disturb" msgstr "Не ме притеснявайте" #: gajim/common/commands.py:120 msgid "Offline - disconnect" msgstr "Изключен - изключване" #: gajim/common/commands.py:125 msgid "Presence description:" msgstr "Описание на състоянието:" #: gajim/common/commands.py:160 gajim/common/commands.py:343 msgid "The status has been changed." msgstr "Състоянието беше променено." #: gajim/common/commands.py:192 gajim/common/commands.py:225 msgid "Leave Groupchats" msgstr "Излизане от стаите" #: gajim/common/commands.py:215 #, python-format msgid "%(nickname)s on %(room_jid)s" msgstr "%(nickname)s от стая %(room_jid)s" #: gajim/common/commands.py:219 msgid "You have not joined a groupchat." msgstr "Не сте влезли в стая." #: gajim/common/commands.py:226 msgid "Choose the groupchats you want to leave" msgstr "Изберете стаите, които искате да напуснете" #: gajim/common/commands.py:271 msgid "You left the following groupchats:" msgstr "Напуснахте следните стаи:" #: gajim/common/commands.py:283 msgid "Forward unread messages" msgstr "Препращане на непрочетени съобщения" #: gajim/common/commands.py:310 msgid "All unread messages have been forwarded." msgstr "Всички непрочетени съобщения бяха препратени." #: gajim/common/commands.py:318 #, fuzzy msgid "Forward unread message then disconnect" msgstr "Препращане на непрочетени съобщения" #: gajim/common/httpupload.py:137 msgid "File is empty" msgstr "Файлът не съдържа нищо" #: gajim/common/httpupload.py:140 msgid "File does not exist" msgstr "Файлът не съществува" #: gajim/common/httpupload.py:147 gajim/common/httpupload.py:204 #, python-format msgid "File is too large, maximum allowed file size is: %s" msgstr "" #: gajim/common/check_paths.py:37 msgid "creating logs database" msgstr "създаване на база от данни за разговорите" #: gajim/common/check_paths.py:98 #, fuzzy msgid "creating cache database" msgstr "създаване на база от данни за разговорите" #: gajim/common/check_paths.py:261 #, fuzzy, python-format msgid "moving %(src)s to %(dst)s" msgstr "Изпращане на %s" #: gajim/common/check_paths.py:287 gajim/common/check_paths.py:294 #: gajim/common/check_paths.py:301 gajim/common/check_paths.py:308 #: gajim/common/check_paths.py:315 gajim/common/check_paths.py:322 #: gajim/common/check_paths.py:329 gajim/common/check_paths.py:336 #, python-format msgid "%s is a file but it should be a directory" msgstr "%s e файл, а би трябвало да е папка" #: gajim/common/check_paths.py:288 gajim/common/check_paths.py:295 #: gajim/common/check_paths.py:302 gajim/common/check_paths.py:309 #: gajim/common/check_paths.py:316 gajim/common/check_paths.py:323 #: gajim/common/check_paths.py:330 gajim/common/check_paths.py:337 #: gajim/common/check_paths.py:349 gajim/common/check_paths.py:357 msgid "Gajim will now exit" msgstr "Спиране на програмата" #: gajim/common/check_paths.py:348 gajim/common/check_paths.py:356 #, python-format msgid "%s is a directory but should be a file" msgstr "%s e папка, а би трябвало да е файл" #: gajim/common/optparser.py:55 #, python-format msgid "Error: cannot open %s for reading" msgstr "Грешка: %s не може да бъде отворен за четене" #: gajim/common/optparser.py:352 gajim/common/optparser.py:353 msgid "cyan" msgstr "синьозелена" #: gajim/common/optparser.py:421 msgid "migrating logs database to indices" msgstr "мигриране на базата от данни с дневници към индекси" #: gajim/common/logging_helpers.py:34 #, python-format msgid "%s is not a valid loglevel" msgstr "%s не е валидно ниво за дневник" #: gajim/common/connection.py:83 msgid "Unable to get issuer certificate" msgstr "Неуспех при получаването на сертификата на издателя" #: gajim/common/connection.py:84 msgid "Unable to get certificate CRL" msgstr "Неуспех при получаването на списъка с отменени сертификати" #: gajim/common/connection.py:85 msgid "Unable to decrypt certificate's signature" msgstr "Неуспех при дешифрирането на подписа на сертификата" #: gajim/common/connection.py:86 msgid "Unable to decrypt CRL's signature" msgstr "Неуспех при дешифрирането на подписа на списъка с отменени сертификати" #: gajim/common/connection.py:87 msgid "Unable to decode issuer public key" msgstr "Неуспех при декодирането на публичния ключ на издателя" #: gajim/common/connection.py:88 msgid "Certificate signature failure" msgstr "Грешка при проверката на подписа на сертификата" #: gajim/common/connection.py:89 msgid "CRL signature failure" msgstr "Грешка при проверката на подписа на списъка с отменени сертификати" #: gajim/common/connection.py:90 msgid "Certificate is not yet valid" msgstr "Сертификатът все още не е валиден" #: gajim/common/connection.py:91 msgid "Certificate has expired" msgstr "Валидността на сертификата е изтекла" #: gajim/common/connection.py:92 msgid "CRL is not yet valid" msgstr "Списъкът с отменени сертификати все още не е валиден" #: gajim/common/connection.py:93 msgid "CRL has expired" msgstr "Валидността на списъка с отменени сертификати е изтекла" #: gajim/common/connection.py:94 msgid "Format error in certificate's notBefore field" msgstr "Грешка при форматирането на полето „notBefore“ на сертификата" #: gajim/common/connection.py:95 msgid "Format error in certificate's notAfter field" msgstr "Грешка при форматирането на полето „notAfter“ на сертификата" #: gajim/common/connection.py:96 msgid "Format error in CRL's lastUpdate field" msgstr "" "Грешка при форматирането на полето „lastUpdate“ на списъка с отменени " "сертификати" #: gajim/common/connection.py:97 msgid "Format error in CRL's nextUpdate field" msgstr "" "Грешка при форматирането на полето „nextUpdate“ на списъка с отменени " "сертификати" #: gajim/common/connection.py:98 msgid "Out of memory" msgstr "Изчерпана памет" #: gajim/common/connection.py:99 msgid "Self signed certificate" msgstr "Само-подписан сертификат" #: gajim/common/connection.py:100 msgid "Self signed certificate in certificate chain" msgstr "Само-подписан сертификат в удостоверителската верига" #: gajim/common/connection.py:101 msgid "Unable to get local issuer certificate" msgstr "Неуспех при получаването на сертификата на издателя" #: gajim/common/connection.py:102 msgid "Unable to verify the first certificate" msgstr "Неуспех при проверката на първия сертификат" #: gajim/common/connection.py:103 msgid "Certificate chain too long" msgstr "Удостоверителската верига е твърде дълга" #: gajim/common/connection.py:104 msgid "Certificate revoked" msgstr "Сертификатът е отменен" #: gajim/common/connection.py:105 msgid "Invalid CA certificate" msgstr "Невалиден сертификат на удостоверителя" #: gajim/common/connection.py:106 msgid "Path length constraint exceeded" msgstr "Максималната дължина на пътя е надвишена" #: gajim/common/connection.py:107 msgid "Unsupported certificate purpose" msgstr "Неподдържана цел на сертификата" #: gajim/common/connection.py:108 msgid "Certificate not trusted" msgstr "Сертификатът не е доверен" #: gajim/common/connection.py:109 msgid "Certificate rejected" msgstr "Сертификатът е отхвърлен" #: gajim/common/connection.py:110 msgid "Subject issuer mismatch" msgstr "Несъответствие на издателя на сертификата" #: gajim/common/connection.py:111 msgid "Authority and subject key identifier mismatch" msgstr "Несъответствие на идентификатора и сертифициращия орган" #: gajim/common/connection.py:112 msgid "Authority and issuer serial number mismatch" msgstr "Несъответствие на серийния номер на издателя и сертифициращия орган" #: gajim/common/connection.py:113 msgid "Key usage does not include certificate signing" msgstr "Основната употреба не включва подписване на сертификати" #: gajim/common/connection.py:114 msgid "Application verification failure" msgstr "Грешка на приложението за проверка" #: gajim/common/connection.py:876 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Връзката на акаунт „%s“ се разпадна" #: gajim/common/connection.py:877 msgid "Reconnect manually." msgstr "Свържете се наново." #: gajim/common/connection.py:888 #, python-format msgid "Server %(name)s answered wrongly to register request: %(error)s" msgstr "" "Сървърът „%(name)s“ отговори погрешно на запитването за регистрация: " "%(error)s" #: gajim/common/connection.py:930 #, python-format msgid "Server %s provided a different registration form" msgstr "Сървърът „%s“ предостави различна форма за регистрация" #: gajim/common/connection.py:1283 #, fuzzy, python-format msgid "Could not connect to \"%(host)s\" via proxy \"%(proxy)s\"" msgstr "Неуспех при свързване с „%s“" #: gajim/common/connection.py:1286 #, fuzzy, python-format msgid "Could not connect to \"%(host)s\"" msgstr "Неуспех при свързване с „%s“" #: gajim/common/connection.py:1293 #, fuzzy, python-format msgid "Server replied: %s" msgstr "Запазен в: %s" #: gajim/common/connection.py:1308 msgid "Connection to proxy failed" msgstr "Неуспех при свързването със сървъра-посредник" #: gajim/common/connection.py:1346 gajim/common/connection.py:1449 #, python-format msgid "Could not connect to account %s" msgstr "Неуспех при свързване с акаунт „%s“" #: gajim/common/connection.py:1347 gajim/common/connection.py:1450 #, python-format msgid "Connection with account %s has been lost. Retry connecting." msgstr "Връзката на акаунт „%s“ се разпадна. Опит за повторно свързване." #: gajim/common/connection.py:1372 #, fuzzy, python-format msgid "The authenticity of the %s certificate could be invalid" msgstr "Автентичността на сертификата на %s може да е под въпрос." #: gajim/common/connection.py:1375 #, python-format msgid "" "\n" "SSL Error: %s" msgstr "" "\n" "Грешка на SSL: %s" #: gajim/common/connection.py:1377 #, python-format msgid "" "\n" "Unknown SSL error: %d" msgstr "" "\n" "Неизвестна грешка на SSL: %d" #: gajim/common/connection.py:1423 #, fuzzy, python-format msgid "" "The authenticity of the %s certificate could be invalid.\n" "The certificate does not cover this domain." msgstr "Автентичността на сертификата на %s може да е под въпрос." #: gajim/common/connection.py:1473 gajim/common/connection.py:2238 #: gajim/common/zeroconf/connection_zeroconf.py:192 #, python-format msgid "Could not connect to \"%s\"" msgstr "Неуспех при свързване с „%s“" #: gajim/common/connection.py:1512 #, python-format msgid "Authentication failed with \"%s\"" msgstr "Неуспех при удостоверяването с „%s“" #: gajim/common/connection.py:1513 msgid "Please check your login and password for correctness." msgstr "Проверете дали името и паролата са правилни." #: gajim/common/connection.py:2097 #, python-format msgid "Sent contact: \"%(jid)s\" (%(name)s)" msgstr "" #: gajim/common/connection.py:2101 #, fuzzy msgid "Sent contacts:" msgstr "Покана на _контакти" #: gajim/common/connection.py:2255 gajim/common/connection.py:2277 msgid "Not fetched because of invisible status" msgstr "Не е изтеглен, понеже е в състояние „Невидим“" #: gajim/common/dbus_support.py:44 msgid "D-Bus python bindings are missing in this computer" msgstr "На този компютър няма инсталиран модул на Питон за D-Bus" #: gajim/common/dbus_support.py:45 gajim/common/dbus_support.py:56 msgid "D-Bus capabilities of Gajim cannot be used" msgstr "Възможностите за D-Bus не могат да бъдат използвани" #: gajim/common/dbus_support.py:55 msgid "D-Bus does not run correctly on this machine" msgstr "" #: gajim/common/dbus_support.py:58 #, fuzzy msgid "D-Bus does not run correctly on this machine: system bus not present" msgstr "На тази машина няма инсталиран D-Bus или липсва модула за Питон" #: gajim/common/dbus_support.py:61 #, fuzzy msgid "D-Bus does not run correctly on this machine: session bus not present" msgstr "На тази машина няма инсталиран D-Bus или липсва модула за Питон" #: gajim/common/multimedia_helpers.py:45 #, fuzzy msgid "Default device" msgstr "Стандартно съобщение" #: gajim/common/multimedia_helpers.py:66 msgid "Audio test" msgstr "" #: gajim/common/multimedia_helpers.py:69 gajim/common/multimedia_helpers.py:85 #: gajim/common/multimedia_helpers.py:99 gajim/common/multimedia_helpers.py:117 msgid "Autodetect" msgstr "" #: gajim/common/multimedia_helpers.py:72 gajim/common/multimedia_helpers.py:87 #, fuzzy, python-format msgid "ALSA: %s" msgstr "Размер: %s" #: gajim/common/multimedia_helpers.py:75 gajim/common/multimedia_helpers.py:89 #, fuzzy, python-format msgid "Pulse: %s" msgstr "Файл: %s" #: gajim/common/multimedia_helpers.py:83 msgid "Fake audio output" msgstr "" #: gajim/common/multimedia_helpers.py:96 msgid "Video test" msgstr "" #: gajim/common/multimedia_helpers.py:101 #, python-format msgid "V4L2: %s" msgstr "" #: gajim/common/multimedia_helpers.py:104 #, fuzzy msgid "Screen" msgstr "зелена" #: gajim/common/multimedia_helpers.py:111 msgid "Fake video output" msgstr "" #: gajim/common/multimedia_helpers.py:114 #, python-format msgid "X Window System (X11/XShm/Xv): %s" msgstr "" #: gajim/common/multimedia_helpers.py:116 msgid "X Window System (without Xv)" msgstr "" #: gajim/common/pep.py:27 msgid "Afraid" msgstr "Уплашен" #: gajim/common/pep.py:28 msgid "Amazed" msgstr "Изумен" #: gajim/common/pep.py:29 msgid "Amorous" msgstr "Страстен" #: gajim/common/pep.py:30 msgid "Angry" msgstr "Ядосан" #: gajim/common/pep.py:31 msgid "Annoyed" msgstr "Раздразнен" #: gajim/common/pep.py:32 msgid "Anxious" msgstr "Обезпокоен" #: gajim/common/pep.py:33 msgid "Aroused" msgstr "Възбуден" #: gajim/common/pep.py:34 msgid "Ashamed" msgstr "Засрамен" #: gajim/common/pep.py:35 msgid "Bored" msgstr "Отегчен" #: gajim/common/pep.py:36 msgid "Brave" msgstr "Смел" #: gajim/common/pep.py:37 msgid "Calm" msgstr "Спокоен" #: gajim/common/pep.py:38 msgid "Cautious" msgstr "Предпазлив" #: gajim/common/pep.py:39 msgid "Cold" msgstr "Бездушен" #: gajim/common/pep.py:40 msgid "Confident" msgstr "Уверен" #: gajim/common/pep.py:41 msgid "Confused" msgstr "Объркан" #: gajim/common/pep.py:42 msgid "Contemplative" msgstr "Замислен" #: gajim/common/pep.py:43 msgid "Contented" msgstr "Спорещ" #: gajim/common/pep.py:44 msgid "Cranky" msgstr "Раздразнителен" #: gajim/common/pep.py:45 msgid "Crazy" msgstr "Луд" #: gajim/common/pep.py:46 msgid "Creative" msgstr "Съзидателен" #: gajim/common/pep.py:47 msgid "Curious" msgstr "Любопитен" #: gajim/common/pep.py:48 msgid "Dejected" msgstr "Обезсърчен" #: gajim/common/pep.py:49 msgid "Depressed" msgstr "Депресиран" #: gajim/common/pep.py:50 msgid "Disappointed" msgstr "Разочарован" #: gajim/common/pep.py:51 msgid "Disgusted" msgstr "Отвратен" #: gajim/common/pep.py:52 msgid "Dismayed" msgstr "Уплашен" #: gajim/common/pep.py:53 msgid "Distracted" msgstr "Шашнат" #: gajim/common/pep.py:54 msgid "Embarrassed" msgstr "Смутен" #: gajim/common/pep.py:55 msgid "Envious" msgstr "Завистлив" #: gajim/common/pep.py:56 msgid "Excited" msgstr "Развълнуван" #: gajim/common/pep.py:57 msgid "Flirtatious" msgstr "Склонен към флиртуване" #: gajim/common/pep.py:58 msgid "Frustrated" msgstr "Разочарован" #: gajim/common/pep.py:59 msgid "Grateful" msgstr "Признателен" #: gajim/common/pep.py:60 msgid "Grieving" msgstr "Опечален" #: gajim/common/pep.py:61 msgid "Grumpy" msgstr "Кисел" #: gajim/common/pep.py:62 msgid "Guilty" msgstr "Виновен" #: gajim/common/pep.py:63 msgid "Happy" msgstr "Щастлив" #: gajim/common/pep.py:64 msgid "Hopeful" msgstr "С надежда" #: gajim/common/pep.py:65 msgid "Hot" msgstr "Сгорещен" #: gajim/common/pep.py:66 msgid "Humbled" msgstr "Скромен" #: gajim/common/pep.py:67 msgid "Humiliated" msgstr "Унизен" #: gajim/common/pep.py:68 msgid "Hungry" msgstr "Гладен" #: gajim/common/pep.py:69 msgid "Hurt" msgstr "Ранен" #: gajim/common/pep.py:70 msgid "Impressed" msgstr "Впечатлен" #: gajim/common/pep.py:71 msgid "In Awe" msgstr "Със страхопочитание" #: gajim/common/pep.py:72 msgid "In Love" msgstr "Влюбен" #: gajim/common/pep.py:73 msgid "Indignant" msgstr "Възмутен" #: gajim/common/pep.py:74 msgid "Interested" msgstr "Заинтересуван" #: gajim/common/pep.py:75 msgid "Intoxicated" msgstr "Пиян" #: gajim/common/pep.py:76 msgid "Invincible" msgstr "Непобедим" #: gajim/common/pep.py:77 msgid "Jealous" msgstr "Ревнив" #: gajim/common/pep.py:78 msgid "Lonely" msgstr "Самотен" #: gajim/common/pep.py:79 msgid "Lost" msgstr "Безпомощен" #: gajim/common/pep.py:80 msgid "Lucky" msgstr "Късметлия" #: gajim/common/pep.py:81 msgid "Mean" msgstr "Подъл" #: gajim/common/pep.py:82 msgid "Moody" msgstr "Унил" #: gajim/common/pep.py:83 msgid "Nervous" msgstr "Нервен" #: gajim/common/pep.py:84 msgid "Neutral" msgstr "Безразличен" #: gajim/common/pep.py:85 msgid "Offended" msgstr "Обиден" #: gajim/common/pep.py:86 msgid "Outraged" msgstr "Оскърбен" #: gajim/common/pep.py:87 msgid "Playful" msgstr "Игрив" #: gajim/common/pep.py:88 msgid "Proud" msgstr "Горд" #: gajim/common/pep.py:89 msgid "Relaxed" msgstr "Отпуснат" #: gajim/common/pep.py:90 msgid "Relieved" msgstr "Облекчен" #: gajim/common/pep.py:91 msgid "Remorseful" msgstr "Разкайващ се" #: gajim/common/pep.py:92 msgid "Restless" msgstr "Неспокоен" #: gajim/common/pep.py:93 msgid "Sad" msgstr "Тъжен" #: gajim/common/pep.py:94 msgid "Sarcastic" msgstr "Саркастичен" #: gajim/common/pep.py:95 msgid "Satisfied" msgstr "Удовлетворен" #: gajim/common/pep.py:96 msgid "Serious" msgstr "Сериозен" #: gajim/common/pep.py:97 msgid "Shocked" msgstr "Шокиран" #: gajim/common/pep.py:98 msgid "Shy" msgstr "Срамежлив" #: gajim/common/pep.py:99 msgid "Sick" msgstr "Болен" #: gajim/common/pep.py:100 msgid "Sleepy" msgstr "Сънен" #: gajim/common/pep.py:101 msgid "Spontaneous" msgstr "Спонтанен" #: gajim/common/pep.py:102 msgid "Stressed" msgstr "Стресиран" #: gajim/common/pep.py:103 msgid "Strong" msgstr "Твърд" #: gajim/common/pep.py:104 msgid "Surprised" msgstr "Изненадан" #: gajim/common/pep.py:105 msgid "Thankful" msgstr "Благодарен" #: gajim/common/pep.py:106 msgid "Thirsty" msgstr "Жаден" #: gajim/common/pep.py:107 msgid "Tired" msgstr "Уморен" #: gajim/common/pep.py:108 msgid "Undefined" msgstr "Неопределен" #: gajim/common/pep.py:109 msgid "Weak" msgstr "Слаб" #: gajim/common/pep.py:110 msgid "Worried" msgstr "Обезпокоен" #: gajim/common/pep.py:113 msgid "Doing Chores" msgstr "Домакинствам" #: gajim/common/pep.py:114 msgid "Buying Groceries" msgstr "Купувам хранителни продукти" #: gajim/common/pep.py:115 msgid "Cleaning" msgstr "Чистя" #: gajim/common/pep.py:116 msgid "Cooking" msgstr "Готвя" #: gajim/common/pep.py:117 msgid "Doing Maintenance" msgstr "Ремонтирам" #: gajim/common/pep.py:118 msgid "Doing the Dishes" msgstr "Мия чиниите" #: gajim/common/pep.py:119 msgid "Doing the Laundry" msgstr "Пера" #: gajim/common/pep.py:120 msgid "Gardening" msgstr "Работя в градината" #: gajim/common/pep.py:121 msgid "Running an Errand" msgstr "Изпълнявам поръчка" #: gajim/common/pep.py:122 msgid "Walking the Dog" msgstr "Разхождам кучето" #: gajim/common/pep.py:123 msgid "Drinking" msgstr "Пия" #: gajim/common/pep.py:124 msgid "Having a Beer" msgstr "Пия бира" #: gajim/common/pep.py:125 msgid "Having Coffee" msgstr "Пия кафе" #: gajim/common/pep.py:126 msgid "Having Tea" msgstr "Пия чай" #: gajim/common/pep.py:128 msgid "Having a Snack" msgstr "Похапвам" #: gajim/common/pep.py:129 msgid "Having Breakfast" msgstr "Закусвам" #: gajim/common/pep.py:130 msgid "Having Dinner" msgstr "Вечерям" #: gajim/common/pep.py:131 msgid "Having Lunch" msgstr "Обядвам" #: gajim/common/pep.py:132 msgid "Exercising" msgstr "Правя упражнения" #: gajim/common/pep.py:133 gajim/common/pep.py:178 msgid "Cycling" msgstr "Карам велосипед" #: gajim/common/pep.py:134 msgid "Dancing" msgstr "Танцувам" #: gajim/common/pep.py:135 msgid "Hiking" msgstr "На поход съм" #: gajim/common/pep.py:136 msgid "Jogging" msgstr "Тичам за здраве" #: gajim/common/pep.py:137 msgid "Playing Sports" msgstr "Спортувам" #: gajim/common/pep.py:138 msgid "Running" msgstr "Бягам" #: gajim/common/pep.py:139 msgid "Skiing" msgstr "Карам ски" #: gajim/common/pep.py:140 msgid "Swimming" msgstr "Плувам" #: gajim/common/pep.py:141 msgid "Working out" msgstr "Тренирам" #: gajim/common/pep.py:142 msgid "Grooming" msgstr "Поддържам се" #: gajim/common/pep.py:143 msgid "At the Spa" msgstr "В Спа-центъра" #: gajim/common/pep.py:144 msgid "Brushing Teeth" msgstr "Мия си зъбите" #: gajim/common/pep.py:145 msgid "Getting a Haircut" msgstr "Подстригвам се" #: gajim/common/pep.py:146 msgid "Shaving" msgstr "Бръсна се" #: gajim/common/pep.py:147 msgid "Taking a Bath" msgstr "Във ваната" #: gajim/common/pep.py:148 msgid "Taking a Shower" msgstr "Взимам си душ" #: gajim/common/pep.py:149 msgid "Having an Appointment" msgstr "На среща" #: gajim/common/pep.py:150 gajim/data/gui/gajim_themes_window.ui:363 msgid "Inactive" msgstr "Бездеен" #: gajim/common/pep.py:151 msgid "Day Off" msgstr "Почивен ден" #: gajim/common/pep.py:152 msgid "Hanging out" msgstr "Вися си" #: gajim/common/pep.py:153 msgid "Hiding" msgstr "Крия се" #: gajim/common/pep.py:154 msgid "On Vacation" msgstr "В отпуск" #: gajim/common/pep.py:155 msgid "Praying" msgstr "Моля се" #: gajim/common/pep.py:156 msgid "Scheduled Holiday" msgstr "Планиран отдих" #: gajim/common/pep.py:158 msgid "Thinking" msgstr "Мисля" #: gajim/common/pep.py:159 msgid "Relaxing" msgstr "Почивам" #: gajim/common/pep.py:160 msgid "Fishing" msgstr "Ловя риба" #: gajim/common/pep.py:161 msgid "Gaming" msgstr "Играя" #: gajim/common/pep.py:162 msgid "Going out" msgstr "Навън съм" #: gajim/common/pep.py:163 msgid "Partying" msgstr "На купон съм" #: gajim/common/pep.py:164 msgid "Reading" msgstr "Чета" #: gajim/common/pep.py:165 msgid "Rehearsing" msgstr "Репетирам" #: gajim/common/pep.py:166 msgid "Shopping" msgstr "На пазар съм" #: gajim/common/pep.py:167 msgid "Smoking" msgstr "Пуша" #: gajim/common/pep.py:168 msgid "Socializing" msgstr "Общувам" #: gajim/common/pep.py:169 msgid "Sunbathing" msgstr "На плаж съм" #: gajim/common/pep.py:170 msgid "Watching TV" msgstr "Гледам телевизия" #: gajim/common/pep.py:171 msgid "Watching a Movie" msgstr "Гледам филм" #: gajim/common/pep.py:172 msgid "Talking" msgstr "Разговарям" #: gajim/common/pep.py:173 msgid "In Real Life" msgstr "На четири очи" #: gajim/common/pep.py:174 msgid "On the Phone" msgstr "Говоря по телефона" #: gajim/common/pep.py:175 msgid "On Video Phone" msgstr "Говоря по видеотелефона" #: gajim/common/pep.py:176 msgid "Traveling" msgstr "Пътувам" #: gajim/common/pep.py:177 msgid "Commuting" msgstr "Пътувам от/до работа" #: gajim/common/pep.py:179 msgid "Driving" msgstr "Карам велосипед" #: gajim/common/pep.py:180 msgid "In a Car" msgstr "В колата" #: gajim/common/pep.py:181 msgid "On a Bus" msgstr "В автобуса" #: gajim/common/pep.py:182 msgid "On a Plane" msgstr "В самолета" #: gajim/common/pep.py:183 msgid "On a Train" msgstr "Във влака" #: gajim/common/pep.py:184 msgid "On a Trip" msgstr "На екскурзия" #: gajim/common/pep.py:185 msgid "Walking" msgstr "Разхождам се" #: gajim/common/pep.py:187 msgid "Coding" msgstr "Програмирам" #: gajim/common/pep.py:188 msgid "In a Meeting" msgstr "На съвещание" #: gajim/common/pep.py:189 msgid "Studying" msgstr "Уча" #: gajim/common/pep.py:190 msgid "Writing" msgstr "Пиша" #: gajim/common/pep.py:195 msgid "accuracy" msgstr "" #: gajim/common/pep.py:196 #, fuzzy msgid "alt" msgstr "по подразбиране" #: gajim/common/pep.py:197 msgid "area" msgstr "" #: gajim/common/pep.py:198 #, fuzzy msgid "bearing" msgstr "морска" #: gajim/common/pep.py:199 #, fuzzy msgid "building" msgstr "Крия се" #: gajim/common/pep.py:200 #, fuzzy msgid "country" msgstr "Акаунт" #: gajim/common/pep.py:201 #, fuzzy msgid "countrycode" msgstr "Акаунт" #: gajim/common/pep.py:202 msgid "datum" msgstr "" #: gajim/common/pep.py:203 #, fuzzy msgid "description" msgstr "Описание" #: gajim/common/pep.py:204 #, fuzzy msgid "error" msgstr "Грешка." #: gajim/common/pep.py:205 msgid "floor" msgstr "" #: gajim/common/pep.py:206 msgid "lat" msgstr "" #: gajim/common/pep.py:207 msgid "locality" msgstr "" #: gajim/common/pep.py:208 #, fuzzy msgid "lon" msgstr "един" #: gajim/common/pep.py:209 msgid "postalcode" msgstr "" #: gajim/common/pep.py:210 msgid "region" msgstr "" #: gajim/common/pep.py:211 msgid "room" msgstr "стая" #: gajim/common/pep.py:212 msgid "speed" msgstr "" #: gajim/common/pep.py:213 msgid "street" msgstr "" #: gajim/common/pep.py:214 msgid "text" msgstr "" #: gajim/common/pep.py:215 msgid "timestamp" msgstr "" #: gajim/common/pep.py:216 msgid "uri" msgstr "адрес" #: gajim/common/pep.py:343 msgid "Unknown Artist" msgstr "Неизвестен изпълнител" #: gajim/common/pep.py:346 msgid "Unknown Title" msgstr "Неизвестно заглавие" #: gajim/common/pep.py:349 msgid "Unknown Source" msgstr "Неизвестен източник" #: gajim/common/pep.py:352 #, python-format msgid "" "\"%(title)s\" by %(artist)s\n" "from %(source)s" msgstr "" "\"%(title)s\" на %(artist)s\n" "от %(source)s" #: gajim/common/stanza_session.py:422 msgid "" "[This is part of an encrypted session. If you see this message, something " "went wrong.]" msgstr "" "[Това е част от шифрирана сесия. Ако виждате това съобщение, нещо не е както " "трябва.]" #: gajim/common/jingle_rtp.py:123 #, fuzzy, python-format msgid "%s configuration error" msgstr "Настройки на стаята" #: gajim/common/jingle_rtp.py:124 #, python-format msgid "" "Couldn’t setup %(text)s. Check your configuration.\n" "\n" "Pipeline was:\n" "%(pipeline)s\n" "\n" "Error was:\n" "%(error)s" msgstr "" #: gajim/common/jingle_rtp.py:371 msgid "audio input" msgstr "" #: gajim/common/jingle_rtp.py:375 msgid "audio output" msgstr "" #: gajim/common/jingle_rtp.py:433 msgid "video input" msgstr "" #: gajim/common/jingle_rtp.py:440 msgid "video output" msgstr "" #: gajim/common/helpers.py:296 msgid "Server must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:304 msgid "Invalid character in hostname." msgstr "Невалиден символ в името на хоста." #: gajim/common/helpers.py:306 msgid "Server address required." msgstr "Необходим е адрес на сървъра." #: gajim/common/helpers.py:310 msgid "Username must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:318 msgid "Invalid character in username." msgstr "Невалиден символ в потребителското име." #: gajim/common/helpers.py:324 msgid "Resource must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:332 msgid "Invalid character in resource." msgstr "Невалиден символ в ресурса." #: gajim/common/helpers.py:372 msgid "_Busy" msgstr "_Зает" #: gajim/common/helpers.py:377 msgid "_Not Available" msgstr "_Не съм на разположение" #: gajim/common/helpers.py:382 msgid "_Free for Chat" msgstr "_Свободен за разговор" #: gajim/common/helpers.py:387 #, fuzzy msgid "?user status:_Available" msgstr "Временно прекъснат" #: gajim/common/helpers.py:391 msgid "Connecting" msgstr "Свързване" #: gajim/common/helpers.py:394 msgid "A_way" msgstr "_Отсъствам" #: gajim/common/helpers.py:399 msgid "_Offline" msgstr "_Изключен" #: gajim/common/helpers.py:404 msgid "_Invisible" msgstr "Не_видим" #: gajim/common/helpers.py:410 msgid "?contact has status:Unknown" msgstr "Неизвестно" #: gajim/common/helpers.py:412 msgid "?contact has status:Has errors" msgstr "Има грешки" #: gajim/common/helpers.py:427 msgid "?Subscription we already have:None" msgstr "Няма" #: gajim/common/helpers.py:429 msgid "To" msgstr "За" #: gajim/common/helpers.py:431 msgid "From" msgstr "От" #: gajim/common/helpers.py:433 msgid "Both" msgstr "Двустранно" #: gajim/common/helpers.py:435 #, fuzzy msgid "Unknown" msgstr "Неизвестна" #: gajim/common/helpers.py:441 msgid "?Ask (for Subscription):None" msgstr "Няма" #: gajim/common/helpers.py:443 msgid "Subscribe" msgstr "Записване" #: gajim/common/helpers.py:452 msgid "?Group Chat Contact Role:None" msgstr "Не е установен" #: gajim/common/helpers.py:455 msgid "Moderators" msgstr "Председатели" #: gajim/common/helpers.py:457 msgid "Moderator" msgstr "Председател" #: gajim/common/helpers.py:460 msgid "Participants" msgstr "Участници" #: gajim/common/helpers.py:462 msgid "Participant" msgstr "Участник" #: gajim/common/helpers.py:465 msgid "Visitors" msgstr "Посетители" #: gajim/common/helpers.py:467 msgid "Visitor" msgstr "Посетител" #: gajim/common/helpers.py:518 msgid "is paying attention to the conversation" msgstr "обръща внимание на разговора" #: gajim/common/helpers.py:520 msgid "is doing something else" msgstr "прави нещо друго" #: gajim/common/helpers.py:522 #, fuzzy msgid "is composing a message…" msgstr "пише съобщение…" #: gajim/common/helpers.py:525 msgid "paused composing a message" msgstr "спря да пише съобщение" #: gajim/common/helpers.py:527 msgid "has closed the chat window or tab" msgstr "затвори прозореца или подпрозореца" #: gajim/common/helpers.py:754 #, python-format msgid "%s GiB" msgstr "%s GiB" #: gajim/common/helpers.py:757 #, python-format msgid "%s GB" msgstr "%s GB" #: gajim/common/helpers.py:761 #, python-format msgid "%s MiB" msgstr "%s MiB" #: gajim/common/helpers.py:764 #, python-format msgid "%s MB" msgstr "%s MB" #: gajim/common/helpers.py:768 #, python-format msgid "%s KiB" msgstr "%s KB" #: gajim/common/helpers.py:771 #, python-format msgid "%s KB" msgstr "%s KB" #: gajim/common/helpers.py:774 #, python-format msgid "%s B" msgstr "%s B" #: gajim/common/helpers.py:1141 gajim/common/helpers.py:1148 #, python-format msgid "%d message pending" msgid_plural "%d messages pending" msgstr[0] "%d непрочетено съобщение" msgstr[1] "%d непрочетени съобщения" #: gajim/common/helpers.py:1155 #, fuzzy, python-format msgid "from room %s" msgstr " от стая %s" #: gajim/common/helpers.py:1158 gajim/common/helpers.py:1175 #, fuzzy, python-format msgid "from user %s" msgstr " от потребител %s" #: gajim/common/helpers.py:1160 #, fuzzy, python-format msgid "from %s" msgstr " от %s" #: gajim/common/helpers.py:1167 gajim/common/helpers.py:1173 #, python-format msgid "%d event pending" msgid_plural "%d events pending" msgstr[0] "%d чакащо събитие" msgstr[1] "%d чакащи събития" #: gajim/common/helpers.py:1191 gajim/common/helpers.py:1203 #: gajim/data/gui/roster_window.ui:85 data/org.gajim.Gajim.desktop.in:4 #: data/org.gajim.Gajim.appdata.xml.in:9 msgid "Gajim" msgstr "Gajim" #: gajim/common/helpers.py:1205 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" #: gajim/common/helpers.py:1392 gajim/data/gui/add_new_contact_window.ui:24 msgid "I would like to add you to my contact list." msgstr "Бих искал(а) да ви добавя към списъка си." #: gajim/common/helpers.py:1394 msgid "Hello, I am $name." msgstr "" #: gajim/common/helpers.py:1508 gajim/common/helpers.py:1517 #: gajim/common/helpers.py:1576 msgid "Timeout loading image" msgstr "Изтече времето за зареждане на изображението" #: gajim/common/helpers.py:1527 gajim/common/helpers.py:1574 msgid "Image is too big" msgstr "Изображението е твърде голямо" #: gajim/common/helpers.py:1538 #, fuzzy msgid "PyCURL is not installed" msgstr "Списъкът с отменени сертификати все още не е валиден" #: gajim/common/helpers.py:1578 #, fuzzy msgid "Error loading image" msgstr "Изтече времето за зареждане на изображението" #: gajim/common/connection_handlers.py:133 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "Информацията за регистрация за транспорт %s не пристигна навреме" #: gajim/common/connection_handlers.py:979 msgid "This message was encrypted with OTR and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:982 msgid "" "This message was encrypted with Legacy OpenPGP and could not be decrypted. " "You can install the PGP plugin to handle those messages." msgstr "" #: gajim/common/connection_handlers.py:986 msgid "" "This message was encrypted with OpenPGP for XMPP and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:992 #, python-format msgid "This message was encrypted with %s and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:1060 msgid "message" msgstr "съобщение" #: gajim/common/connection_handlers.py:1863 msgid "I would like to add you to my roster." msgstr "" "Бих искал(а) да ви добавя към списъка си. I would like to add you to my " "roster." #: gajim/common/exceptions.py:46 #, fuzzy, python-format msgid "" "The database file (%s) cannot be read. Try to repair it (see https://dev." "gajim.org/gajim/gajim/wikis/help/DatabaseBackup) or remove it (all history " "will be lost)." msgstr "" "Файлът „%s“ от базата от данни не може да бъде прочетен. Опитайте се да го " "поправите (вижте http://trac.gajim.org/wiki/DatabaseBackup) или изтриете " "(цялата история ще бъде загубена)." #: gajim/common/exceptions.py:60 msgid "Service not available: Gajim is not running, or remote_control is False" msgstr "" "Услугата не е налична: Gajim не е стартиран или „remote_control“ е " "„Изключена“" #: gajim/common/exceptions.py:82 #, fuzzy, python-format msgid "" "Session bus is not available.\n" "Try reading %(url)s" msgstr "" "Липсва „session bus“.\n" "Опитайте се да прочетете http://trac.gajim.org/wiki/GajimDBus" #: gajim/common/exceptions.py:94 #, fuzzy, python-format msgid "" "System bus is not available.\n" "Try reading %(url)s" msgstr "" "Липсва „session bus“.\n" "Опитайте се да прочетете http://trac.gajim.org/wiki/GajimDBus" #: gajim/common/zeroconf/connection_zeroconf.py:193 msgid "Please check if Avahi or Bonjour is installed." msgstr "Проверете дали Avahi или Bonjour е инсталиран." #: gajim/common/zeroconf/connection_zeroconf.py:203 #: gajim/common/zeroconf/connection_zeroconf.py:207 msgid "Could not start local service" msgstr "Неуспех при стартирането на локална услуга" #: gajim/common/zeroconf/connection_zeroconf.py:204 #, python-format msgid "Unable to bind to port %d." msgstr "Неуспех при свързването с порт %d." #: gajim/common/zeroconf/connection_zeroconf.py:208 #: gajim/common/zeroconf/connection_zeroconf.py:293 #: gajim/common/zeroconf/connection_zeroconf.py:306 #: gajim/common/zeroconf/connection_zeroconf.py:322 msgid "Please check if avahi-daemon is running." msgstr "Проверете дали е стартиран avahi-daemon." #: gajim/common/zeroconf/connection_zeroconf.py:292 #: gajim/common/zeroconf/connection_zeroconf.py:305 #: gajim/common/zeroconf/connection_zeroconf.py:321 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Неуспех при промяната на състоянието на акаунт „%s“" #: gajim/common/zeroconf/connection_zeroconf.py:337 msgid "Your message could not be sent." msgstr "Съобщението ви не можа да бъде изпратено." #: gajim/common/zeroconf/connection_zeroconf.py:352 msgid "Contact is offline. Your message could not be sent." msgstr "Контактът е изключен. Съобщението ви не можа да бъде изпратено." #: gajim/common/zeroconf/connection_zeroconf.py:374 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "" "Неуспех при установяването на връзка с хоста: Изтичане на допустимото време " "при изпращането на данните." #: gajim/common/zeroconf/zeroconf_bonjour.py:197 #: gajim/common/zeroconf/zeroconf_avahi.py:220 #, python-format msgid "Error while adding service. %s" msgstr "Грешка при добавянето на услугата. %s" #: gajim/data/gui/blocked_contacts_window.ui:13 msgid "Blocked Contacts" msgstr "Блокирани контакти" #: gajim/data/gui/advanced_configuration_window.ui:13 msgid "Advanced Configuration Editor" msgstr "Редактор на настройки за напреднали" #: gajim/data/gui/advanced_configuration_window.ui:35 msgid "Filter:" msgstr "Филтър:" #: gajim/data/gui/advanced_configuration_window.ui:107 #: gajim/data/gui/features_window.ui:111 msgid "Description" msgstr "Описание" #: gajim/data/gui/advanced_configuration_window.ui:136 msgid "NOTE: You should restart Gajim for some settings to take effect" msgstr "" "ЗАБЕЛЕЖКА: Трябва да рестартирате Gajim, за да влязат в сила някои от " "настройките" #: gajim/data/gui/advanced_configuration_window.ui:161 #, fuzzy msgid "_Reset to default" msgstr "Възстановяване на стандартните _цветове" #: gajim/data/gui/join_groupchat_window.ui:34 #, fuzzy msgid "Bookmark this Groupchat" msgstr "_Добавяне на стаята към отметките (Ctrl+B)" #: gajim/data/gui/join_groupchat_window.ui:51 msgid "Join this Groupchat everytime Gajim is started" msgstr "" #: gajim/data/gui/join_groupchat_window.ui:69 #, fuzzy msgid "Bookmark" msgstr "_Добавяне на стаята към отметките" #: gajim/data/gui/join_groupchat_window.ui:82 #, fuzzy msgid "Autojoin" msgstr "Автоматично влизане" #: gajim/data/gui/join_groupchat_window.ui:119 msgid "Account" msgstr "Акаунт" #: gajim/data/gui/join_groupchat_window.ui:226 #, fuzzy msgid "Room" msgstr "Стая:" #: gajim/data/gui/join_groupchat_window.ui:238 #, fuzzy msgid "Recently" msgstr "Скоро посетени:" #: gajim/data/gui/join_groupchat_window.ui:290 msgid "Search the rooms on this server" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:12 #, fuzzy msgid "HTTP Connect" msgstr "" "Свързване по HTTP\n" "SOCKS5" #: gajim/data/gui/manage_proxies_window.ui:15 msgid "SOCKS5" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:18 msgid "BOSH" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:25 msgid "Manage Proxy Profiles" msgstr "Настройки на сървъра-посредник" #: gajim/data/gui/manage_proxies_window.ui:148 msgid "_Name:" msgstr "_Име:" #: gajim/data/gui/manage_proxies_window.ui:161 #, fuzzy msgid "_Type:" msgstr "Тип:" #: gajim/data/gui/manage_proxies_window.ui:205 msgid "Properties" msgstr "Настройки" #: gajim/data/gui/manage_proxies_window.ui:234 msgid "_BOSH URL:" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:258 #, fuzzy msgid "Proxy _Host:" msgstr "Сървър-посредник:" #: gajim/data/gui/manage_proxies_window.ui:269 msgid "Use HTTP prox_y" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:288 #, fuzzy msgid "Proxy _Port:" msgstr "По_рт:" #: gajim/data/gui/manage_proxies_window.ui:299 #, fuzzy msgid "Use proxy auth_entication" msgstr "Използване на удостоверяване" #: gajim/data/gui/manage_proxies_window.ui:318 msgid "_Username:" msgstr "И_ме на потребител:" #: gajim/data/gui/manage_proxies_window.ui:331 msgid "Pass_word:" msgstr "Паро_ла:" #: gajim/data/gui/manage_proxies_window.ui:391 msgid "Settings" msgstr "Настройки" #: gajim/data/gui/change_password_dialog.ui:89 msgid "Enter new password:" msgstr "Въведете нова парола:" #: gajim/data/gui/change_password_dialog.ui:115 msgid "Enter it again for confirmation:" msgstr "Въведете я отново за потвърждение:" #: gajim/data/gui/zeroconf_information_window.ui:8 #: gajim/data/gui/vcard_information_window.ui:8 msgid "Contact Information" msgstr "Информация за контакта" #: gajim/data/gui/zeroconf_information_window.ui:54 msgid "Local jid:" msgstr "Локален JID:" #: gajim/data/gui/zeroconf_information_window.ui:67 #: gajim/data/gui/tooltip_roster_contact.ui:55 #: gajim/data/gui/tooltip_gc_contact.ui:75 msgid "Resource:" msgstr "Ресурс:" #: gajim/data/gui/zeroconf_information_window.ui:80 #: gajim/data/gui/tooltip_roster_contact.ui:110 msgid "Status:" msgstr "Състояние:" #: gajim/data/gui/zeroconf_information_window.ui:89 #: gajim/data/gui/history_window.ui:290 msgid "_Log conversation history" msgstr "_Запазване на разговорите" #: gajim/data/gui/zeroconf_information_window.ui:215 #: gajim/data/gui/vcard_information_window.ui:360 msgid "Contact" msgstr "Контакт" #: gajim/data/gui/zeroconf_information_window.ui:234 msgid "First Name:" msgstr "Собствено име:" #: gajim/data/gui/zeroconf_information_window.ui:247 msgid "Last Name:" msgstr "Фамилия:" #: gajim/data/gui/zeroconf_information_window.ui:260 #: gajim/data/gui/archiving_313_preferences_item.ui:84 #: gajim/data/gui/tooltip_roster_contact.ui:30 #: gajim/data/gui/tooltip_gc_contact.ui:50 msgid "Jabber ID:" msgstr "Jabber ID:" #: gajim/data/gui/zeroconf_information_window.ui:273 msgid "E-Mail:" msgstr "Е-поща:" #: gajim/data/gui/zeroconf_information_window.ui:354 msgid "Personal" msgstr "Лични данни" #: gajim/data/gui/gc_occupants_menu.ui:12 msgid "_Send Private Message" msgstr "_Изпращане на лично съобщение" #: gajim/data/gui/gc_occupants_menu.ui:21 msgid "Send _File" msgstr "Изпращане на _файл" #: gajim/data/gui/gc_occupants_menu.ui:29 msgid "Occupant Actions" msgstr "_Действия на участника" #: gajim/data/gui/gc_occupants_menu.ui:38 msgid "_Voice" msgstr "_Глас" #: gajim/data/gui/gc_occupants_menu.ui:46 msgid "Mo_derator" msgstr "_Председател" #: gajim/data/gui/gc_occupants_menu.ui:60 msgid "_Member" msgstr "_Член" #: gajim/data/gui/gc_occupants_menu.ui:68 msgid "_Admin" msgstr "_Администратор" #: gajim/data/gui/gc_occupants_menu.ui:76 msgid "_Owner" msgstr "Со_бственик" #: gajim/data/gui/gc_occupants_menu.ui:90 msgid "_Kick" msgstr "_Изритване" #: gajim/data/gui/gc_occupants_menu.ui:98 msgid "_Ban" msgstr "_Забраняване на достъпа" #: gajim/data/gui/gc_occupants_menu.ui:124 msgid "_Add to Roster" msgstr "Добавяне към _списъка…" #: gajim/data/gui/gc_occupants_menu.ui:132 #, fuzzy msgid "_Execute command" msgstr "_Изпълнение на команда" #: gajim/data/gui/archiving_313_preferences_item.ui:12 #: gajim/data/gui/preferences_window.ui:102 #: gajim/data/gui/preferences_window.ui:153 #: gajim/data/gui/archiving_313_preferences_window.ui:25 #, fuzzy msgid "Always" msgstr "Отсъствам" #: gajim/data/gui/archiving_313_preferences_item.ui:15 #: gajim/data/gui/preferences_window.ui:96 #: gajim/data/gui/preferences_window.ui:156 #: gajim/data/gui/archiving_313_preferences_window.ui:31 #, fuzzy msgid "Never" msgstr "Сървър" #: gajim/data/gui/archiving_313_preferences_item.ui:96 #, fuzzy msgid "Preference:" msgstr "Настройки" #: gajim/data/gui/tooltip_roster_contact.ui:125 #, fuzzy msgid "Idle since:" msgstr " от %s" #: gajim/data/gui/tooltip_roster_contact.ui:151 #: gajim/data/gui/change_status_message_dialog.ui:191 msgid "Mood:" msgstr "Настроение:" #: gajim/data/gui/tooltip_roster_contact.ui:164 #: gajim/data/gui/change_status_message_dialog.ui:179 msgid "Activity:" msgstr "Дейност:" #: gajim/data/gui/tooltip_roster_contact.ui:178 #, fuzzy msgid "Tune:" msgstr "Песен:" #: gajim/data/gui/tooltip_roster_contact.ui:191 #, fuzzy msgid "Location:" msgstr "Уведомления" #: gajim/data/gui/tooltip_roster_contact.ui:255 #, fuzzy msgid "OpenPGP:" msgstr "OpenPGP: " #: gajim/data/gui/tooltip_roster_contact.ui:281 #, fuzzy msgid "Subscription:" msgstr "Записване: " #: gajim/data/gui/zeroconf_context_menu.ui:11 #: gajim/data/gui/account_context_menu.ui:11 msgid "_Status" msgstr "_Състояние" #: gajim/data/gui/zeroconf_context_menu.ui:26 #: gajim/data/gui/account_context_menu.ui:79 msgid "_Modify Account..." msgstr "_Промяна на акаунт…" #: gajim/data/gui/atom_entry_window.ui:8 msgid "New entry received" msgstr "Получен е нов запис" #: gajim/data/gui/atom_entry_window.ui:92 msgid "Feed name:" msgstr "Име на емисията:" #: gajim/data/gui/atom_entry_window.ui:119 msgid "Entry:" msgstr "Запис:" #: gajim/data/gui/atom_entry_window.ui:131 msgid "Last modified:" msgstr "Последно променена:" #: gajim/data/gui/atom_entry_window.ui:196 msgid "Next entry" msgstr "" #: gajim/data/gui/gc_control_popup_menu.ui:11 msgid "Change _Nickname..." msgstr "Смяна на псе_вдоним…" #: gajim/data/gui/gc_control_popup_menu.ui:20 msgid "_Manage Room" msgstr "_Управление на стаята" #: gajim/data/gui/gc_control_popup_menu.ui:31 msgid "Change _Subject..." msgstr "Промяна на _темата…" #: gajim/data/gui/gc_control_popup_menu.ui:38 msgid "Configure _Room..." msgstr "Настройки на _стаята…" #: gajim/data/gui/gc_control_popup_menu.ui:52 msgid "_Destroy Room" msgstr "_Унищожаване на стаята" #: gajim/data/gui/gc_control_popup_menu.ui:64 msgid "_Minimize on close" msgstr "_Минимизиране при затваряне" #: gajim/data/gui/gc_control_popup_menu.ui:85 #, fuzzy msgid "_Request Voice" msgstr "_Глас" #: gajim/data/gui/profile_window.ui:7 msgid "Personal Information" msgstr "Лични данни" #: gajim/data/gui/profile_window.ui:35 #: gajim/data/gui/vcard_information_window.ui:382 msgid "Name:" msgstr "Име:" #: gajim/data/gui/profile_window.ui:59 #: gajim/data/gui/vcard_information_window.ui:410 msgid "Nickname:" msgstr "Псевдоним:" #. Family Name #: gajim/data/gui/profile_window.ui:94 #: gajim/data/gui/vcard_information_window.ui:740 msgid "Family:" msgstr "Фамилия:" #. Given Name #: gajim/data/gui/profile_window.ui:118 #: gajim/data/gui/vcard_information_window.ui:822 msgid "Given:" msgstr "Собствено:" #. Middle Name #: gajim/data/gui/profile_window.ui:142 #: gajim/data/gui/vcard_information_window.ui:753 msgid "Middle:" msgstr "Презиме:" #. Prefix in Name #: gajim/data/gui/profile_window.ui:156 #: gajim/data/gui/vcard_information_window.ui:766 msgid "Prefix:" msgstr "Представка:" #. Suffix in Name #: gajim/data/gui/profile_window.ui:190 #: gajim/data/gui/vcard_information_window.ui:835 msgid "Suffix:" msgstr "Наставка:" #: gajim/data/gui/profile_window.ui:222 #: gajim/data/gui/vcard_information_window.ui:878 msgid "Full Name" msgstr "Име" #: gajim/data/gui/profile_window.ui:250 gajim/data/gui/profile_window.ui:724 #: gajim/data/gui/vcard_information_window.ui:454 #: gajim/data/gui/vcard_information_window.ui:1087 msgid "Street:" msgstr "Улица:" #: gajim/data/gui/profile_window.ui:274 gajim/data/gui/profile_window.ui:748 #: gajim/data/gui/vcard_information_window.ui:535 #: gajim/data/gui/vcard_information_window.ui:1126 msgid "Extra Address:" msgstr "Допълнителен адрес:" #: gajim/data/gui/profile_window.ui:298 gajim/data/gui/profile_window.ui:772 #: gajim/data/gui/vcard_information_window.ui:467 #: gajim/data/gui/vcard_information_window.ui:1100 msgid "City:" msgstr "Град:" #: gajim/data/gui/profile_window.ui:322 gajim/data/gui/profile_window.ui:796 #: gajim/data/gui/vcard_information_window.ui:548 #: gajim/data/gui/vcard_information_window.ui:1140 msgid "Postal Code:" msgstr "Пощенски код:" #: gajim/data/gui/profile_window.ui:346 gajim/data/gui/profile_window.ui:820 #: gajim/data/gui/vcard_information_window.ui:480 #: gajim/data/gui/vcard_information_window.ui:1113 msgid "State:" msgstr "Област/Щат:" #: gajim/data/gui/profile_window.ui:370 gajim/data/gui/profile_window.ui:844 #: gajim/data/gui/vcard_information_window.ui:561 #: gajim/data/gui/vcard_information_window.ui:1153 msgid "Country:" msgstr "Държава:" #: gajim/data/gui/profile_window.ui:396 gajim/data/gui/profile_window.ui:870 #: gajim/data/gui/vcard_information_window.ui:618 #: gajim/data/gui/vcard_information_window.ui:1253 msgid "Address" msgstr "Адрес" #: gajim/data/gui/profile_window.ui:413 #: gajim/data/gui/vcard_information_window.ui:635 msgid "Homepage:" msgstr "Страница в Интернет:" #: gajim/data/gui/profile_window.ui:437 gajim/data/gui/profile_window.ui:887 #: gajim/data/gui/vcard_information_window.ui:648 #: gajim/data/gui/vcard_information_window.ui:1270 msgid "E-Mail:" msgstr "Е-поща:" #: gajim/data/gui/profile_window.ui:462 gajim/data/gui/profile_window.ui:912 #: gajim/data/gui/vcard_information_window.ui:661 #: gajim/data/gui/vcard_information_window.ui:1283 msgid "Phone No.:" msgstr "Телефон:" #: gajim/data/gui/profile_window.ui:497 msgid "Avatar:" msgstr "Аватар:" #: gajim/data/gui/profile_window.ui:540 msgid "Click to set your avatar" msgstr "Натиснете, за да настроите аватара си" #: gajim/data/gui/profile_window.ui:566 #: gajim/data/gui/vcard_information_window.ui:702 msgid "Format: YYYY-MM-DD" msgstr "Формат: гггг-мм-дд" #: gajim/data/gui/profile_window.ui:574 #: gajim/data/gui/vcard_information_window.ui:708 msgid "Birthday:" msgstr "Рожден ден:" #: gajim/data/gui/profile_window.ui:598 #: gajim/data/gui/vcard_information_window.ui:937 msgid "Personal Info" msgstr "Лични данни" #: gajim/data/gui/profile_window.ui:617 #: gajim/data/gui/vcard_information_window.ui:960 msgid "Company:" msgstr "Фирма:" #: gajim/data/gui/profile_window.ui:641 #: gajim/data/gui/vcard_information_window.ui:990 msgid "Department:" msgstr "Отдел:" #: gajim/data/gui/profile_window.ui:665 #: gajim/data/gui/vcard_information_window.ui:1018 msgid "Position:" msgstr "Дейност:" #: gajim/data/gui/profile_window.ui:689 #: gajim/data/gui/vcard_information_window.ui:1045 msgid "Role:" msgstr "Роля:" #: gajim/data/gui/profile_window.ui:947 #: gajim/data/gui/vcard_information_window.ui:1336 msgid "Work" msgstr "Работа" #. "About" is the text of a tab of vcard window #: gajim/data/gui/profile_window.ui:979 #: gajim/data/gui/vcard_information_window.ui:1368 #: gajim/data/gui/application_menu.ui:62 msgid "About" msgstr "Относно" #: gajim/data/gui/filetransfers.ui:20 #, fuzzy msgid "Con_tinue" msgstr "П_родължаване" #: gajim/data/gui/filetransfers.ui:28 gajim/data/gui/filetransfers.ui:156 msgid "_Pause" msgstr "П_ауза" #: gajim/data/gui/filetransfers.ui:36 gajim/data/gui/filetransfers.ui:174 #: gajim/data/gui/service_registration_window.ui:53 msgid "_Cancel" msgstr "_Отказ" #: gajim/data/gui/filetransfers.ui:50 msgid "_Open Containing Folder" msgstr "_Отваряне на папката" #: gajim/data/gui/filetransfers.ui:79 gajim/data/gui/filetransfers.ui:253 msgid "File Transfers" msgstr "Файлови трансфери" #: gajim/data/gui/filetransfers.ui:110 msgid "file transfers list" msgstr "списък с файлови трансфери" #: gajim/data/gui/filetransfers.ui:111 msgid "A list of active, completed and stopped file transfers" msgstr "Списък с активни, завършили и прекъснати файлови трансфери" #: gajim/data/gui/filetransfers.ui:131 msgid "Clean _up" msgstr "Из_чистване" #: gajim/data/gui/filetransfers.ui:137 msgid "Removes completed, cancelled and failed file transfers from the list" msgstr "" "Премахва завършилите, прекъснатите или провалени файлови трансфери от списъка" #: gajim/data/gui/filetransfers.ui:143 msgid "Remove file transfer from the list." msgstr "Премахване на файловия трансфер от списъка." #: gajim/data/gui/filetransfers.ui:144 msgid "" "This action removes single file transfer from the list. If the transfer is " "active, it is first stopped and then removed" msgstr "" "Това действие премахва файлов трансфер от списъка. Ако трансферът е активен, " "първо се прекъсва и след това се премахва." #: gajim/data/gui/filetransfers.ui:180 #, fuzzy msgid "Cancels the selected file transfer and removes incomplete files" msgstr "Отменя избрания файлов трансфер и изтрива непълния файл" #: gajim/data/gui/filetransfers.ui:186 msgid "Cancel file transfer" msgstr "Отменя файловия трансфер" #: gajim/data/gui/filetransfers.ui:187 msgid "Cancels the selected file transfer" msgstr "Отменя избрания файлов трансфер" #: gajim/data/gui/filetransfers.ui:199 #, fuzzy msgid "_Close" msgstr "Изпра_щане и затваряне" #: gajim/data/gui/filetransfers.ui:205 msgid "Hides the window" msgstr "Скрива прозореца" #: gajim/data/gui/filetransfers.ui:226 msgid "_Notify me when a file transfer is complete" msgstr "_Уведомяване при завършване на файловия трансфер" #: gajim/data/gui/filetransfers.ui:236 msgid "When a file transfer is complete show a popup notification" msgstr "Уведомяване чрез изскачащ прозорец при завършване на файловия трансфер" #: gajim/data/gui/filetransfers.ui:254 msgid "Shows a list of file transfers between you and others" msgstr "Показва списък с файловите трансфери между вас и останалите" #: gajim/data/gui/service_registration_window.ui:18 msgid "Register to" msgstr "Регистриране към" #: gajim/data/gui/service_registration_window.ui:70 #: gajim/data/gui/roster_item_exchange_window.ui:126 msgid "_OK" msgstr "_Да" #: gajim/data/gui/groupchat_control.ui:13 gajim/data/gui/chat_control.ui:293 #: gajim/data/gui/gajim_themes_window.ui:264 msgid "Bold" msgstr "Получер" #: gajim/data/gui/groupchat_control.ui:22 gajim/data/gui/chat_control.ui:302 #: gajim/data/gui/gajim_themes_window.ui:284 msgid "Italic" msgstr "Курсив" #: gajim/data/gui/groupchat_control.ui:31 gajim/data/gui/chat_control.ui:311 #, fuzzy msgid "Underline" msgstr "Неопределен" #: gajim/data/gui/groupchat_control.ui:40 gajim/data/gui/chat_control.ui:320 #, fuzzy msgid "Strike" msgstr "Болен" #: gajim/data/gui/groupchat_control.ui:62 gajim/data/gui/chat_control.ui:342 msgid "Font" msgstr "" #: gajim/data/gui/groupchat_control.ui:76 gajim/data/gui/chat_control.ui:356 #, fuzzy msgid "Clear formatting" msgstr "Информация за контакта" #: gajim/data/gui/groupchat_control.ui:283 gajim/data/gui/chat_control.ui:805 #, fuzzy msgid "Choose an encryption" msgstr "Избор на файл за изпращане…" #: gajim/data/gui/groupchat_control.ui:329 gajim/data/gui/chat_control.ui:853 msgid "Show a list of emoticons (Alt+M)" msgstr "Списък с емотикони (Alt+M)" #: gajim/data/gui/popup_notification_window.ui:55 #, fuzzy msgid "Event Type" msgstr "Събитие" #: gajim/data/gui/popup_notification_window.ui:100 #, fuzzy msgid "Event desc" msgstr "Събитие" #: gajim/data/gui/chat_control.ui:41 #, fuzzy msgid "1" msgstr "Шрифт" #: gajim/data/gui/chat_control.ui:63 #, fuzzy msgid "2 abc" msgstr "Шрифт" #: gajim/data/gui/chat_control.ui:84 #, fuzzy msgid "3 def" msgstr "Шрифт" #: gajim/data/gui/chat_control.ui:105 #, fuzzy msgid "4 ghi" msgstr "Шрифт" #: gajim/data/gui/chat_control.ui:126 #, fuzzy msgid "5 jkl" msgstr "Шрифт" #: gajim/data/gui/chat_control.ui:147 #, fuzzy msgid "6 mno" msgstr "Шрифт" #: gajim/data/gui/chat_control.ui:167 msgid "7 pqrs" msgstr "" #: gajim/data/gui/chat_control.ui:188 #, fuzzy msgid "8 tuv" msgstr "Шрифт" #: gajim/data/gui/chat_control.ui:209 msgid "9 wxyz" msgstr "" #: gajim/data/gui/chat_control.ui:229 #, fuzzy msgid "*" msgstr "Шрифт" #: gajim/data/gui/chat_control.ui:249 #, fuzzy msgid "0" msgstr "Шрифт" #: gajim/data/gui/chat_control.ui:269 #, fuzzy msgid "#" msgstr "Шрифт" #: gajim/data/gui/chat_control.ui:729 msgid "#" msgstr "№" #: gajim/data/gui/vcard_information_window.ui:55 msgid "Jabber ID:" msgstr "Jabber ID:" #: gajim/data/gui/vcard_information_window.ui:69 msgid "Resource:" msgstr "Ресурс:" #: gajim/data/gui/vcard_information_window.ui:83 msgid "Status:" msgstr "Състояние:" #: gajim/data/gui/vcard_information_window.ui:97 msgid "Client:" msgstr "Клиент:" #: gajim/data/gui/vcard_information_window.ui:111 msgid "System:" msgstr "Система:" #: gajim/data/gui/vcard_information_window.ui:125 #, fuzzy msgid "Contact time:" msgstr "Област/Щат:" #: gajim/data/gui/vcard_information_window.ui:222 #, fuzzy msgid "User avatar:" msgstr "Аватар:" #: gajim/data/gui/vcard_information_window.ui:234 #, fuzzy msgid "Configured avatar:" msgstr "Настроен аватар:" #. Given Name #: gajim/data/gui/vcard_information_window.ui:263 msgid "Ask:" msgstr "Запитване:" #. Family Name #: gajim/data/gui/vcard_information_window.ui:277 msgid "Subscription:" msgstr "Записване:" #: gajim/data/gui/vcard_information_window.ui:893 #: gajim/data/gui/vcard_information_window.ui:912 #: gajim/data/gui/vcard_information_window.ui:1310 msgid "button" msgstr "" #: gajim/data/gui/vcard_information_window.ui:1398 msgid "Comments" msgstr "Коментари" #: gajim/data/gui/gajim_themes_window.ui:12 #, fuzzy msgid "Account row" msgstr "Акаунт" #: gajim/data/gui/gajim_themes_window.ui:15 #, fuzzy msgid "Group row" msgstr "Група" #: gajim/data/gui/gajim_themes_window.ui:18 #, fuzzy msgid "Contact row" msgstr "Контакт" #: gajim/data/gui/gajim_themes_window.ui:21 msgid "Chat Banner" msgstr "" #: gajim/data/gui/gajim_themes_window.ui:28 msgid "Gajim Themes Customization" msgstr "Персонализиране на темите на Gajim" #: gajim/data/gui/gajim_themes_window.ui:157 msgid "Text _color:" msgstr "_Цвят на текста:" #: gajim/data/gui/gajim_themes_window.ui:173 msgid "_Background:" msgstr "_Фон:" #: gajim/data/gui/gajim_themes_window.ui:189 msgid "Text _font:" msgstr "_Шрифт на текста:" #: gajim/data/gui/gajim_themes_window.ui:207 msgid "Font style:" msgstr "Стил на шрифта:" #: gajim/data/gui/gajim_themes_window.ui:375 msgid "Composing" msgstr "Пише" #: gajim/data/gui/gajim_themes_window.ui:387 msgid "Paused" msgstr "Временно преустановен" #: gajim/data/gui/gajim_themes_window.ui:399 msgid "Gone" msgstr "Отсъства" #: gajim/data/gui/gajim_themes_window.ui:411 msgid "" "MUC\n" "Messages" msgstr "" "Съобщения\n" "в стая" #: gajim/data/gui/gajim_themes_window.ui:424 msgid "" "MUC Directed\n" "Messages" msgstr "" "Съобщения\n" "за стая" #: gajim/data/gui/gajim_themes_window.ui:510 msgid "Chatstate Tab Colors" msgstr "Цветове на подпрозорците" #: gajim/data/gui/preferences_window.ui:48 msgid "Use default applications" msgstr "" #: gajim/data/gui/preferences_window.ui:51 msgid "Custom" msgstr "Персонални" #: gajim/data/gui/preferences_window.ui:62 #: gajim/data/gui/preferences_window.ui:79 #, fuzzy msgid "All chat states" msgstr "Всички състояния" #: gajim/data/gui/preferences_window.ui:65 #: gajim/data/gui/preferences_window.ui:82 #, fuzzy msgid "Composing only" msgstr "Пише" #: gajim/data/gui/preferences_window.ui:99 msgid "Only when pending events" msgstr "" #: gajim/data/gui/preferences_window.ui:113 msgid "Pop it up" msgstr "" #: gajim/data/gui/preferences_window.ui:116 #, fuzzy msgid "Notify me about it" msgstr "Уведомяване за _изключващи се контакти" #: gajim/data/gui/preferences_window.ui:119 #, fuzzy msgid "Show only in roster" msgstr "Показване на събитието в спис_ъка" #: gajim/data/gui/preferences_window.ui:130 msgid "Detached roster with detached chats" msgstr "" #: gajim/data/gui/preferences_window.ui:133 msgid "Detached roster with single chat" msgstr "" #: gajim/data/gui/preferences_window.ui:136 msgid "Single window for everything" msgstr "" #: gajim/data/gui/preferences_window.ui:139 msgid "Detached roster with chat grouped by account" msgstr "" #: gajim/data/gui/preferences_window.ui:142 msgid "Detached roster with chat grouped by type" msgstr "" #: gajim/data/gui/preferences_window.ui:159 #, fuzzy msgid "Last state" msgstr "Последно състояние: %s" #: gajim/data/gui/preferences_window.ui:195 #: gajim/data/gui/application_menu.ui:94 gajim/data/gui/shortcuts_window.ui:188 msgid "Preferences" msgstr "Настройки" #: gajim/data/gui/preferences_window.ui:237 msgid "Display a_vatars of contacts in roster" msgstr "Показване на _аватари на контактите в списъка" #: gajim/data/gui/preferences_window.ui:241 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" msgstr "" "Ако тази опция е избрана, Gajim ще изобразява аватари на контакти в списъка " "и стаите" #: gajim/data/gui/preferences_window.ui:255 msgid "Display status _messages of contacts in roster" msgstr "Показване на _съобщенията за състояние на контактите в списъка" #: gajim/data/gui/preferences_window.ui:259 #, fuzzy msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name, in roster window and in group chats" msgstr "" "Ако тази опция е избрана, съобщенията за състояние на контактите ще се " "показват под имената им в списъка и в стаите" #: gajim/data/gui/preferences_window.ui:273 #, fuzzy msgid "Display e_xtra information of contacts in roster (mood, activity, ...)" msgstr "Показване на _настроенията на контактите в списъка" #: gajim/data/gui/preferences_window.ui:277 msgid "" "If checked, Gajim will display the mood of contacts in the roster window" msgstr "" "Ако тази опция е избрана, Gajim ще изобразява настроението на контактите в " "списъка." #: gajim/data/gui/preferences_window.ui:298 msgid "Sort contacts by status" msgstr "Подреждане на контактите по състояние" #: gajim/data/gui/preferences_window.ui:308 msgid "in _roster" msgstr "в с_писъка" #: gajim/data/gui/preferences_window.ui:325 msgid "in _group chats" msgstr "в _стаи" #: gajim/data/gui/preferences_window.ui:354 msgid "Roster Appearance" msgstr "Изглед на списъка" #: gajim/data/gui/preferences_window.ui:384 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" msgstr "" "Ако тази опция е избрана, усмивките в ASCII като „:)“ ще се изобразяват със " "съответните анимирани или статични емотикони." #: gajim/data/gui/preferences_window.ui:390 msgid "_Emoticons:" msgstr "_Емотикони:" #: gajim/data/gui/preferences_window.ui:406 msgid "_Window behavior:" msgstr "_Поведение на прозорците:" #: gajim/data/gui/preferences_window.ui:420 #, fuzzy msgid "_Show roster on startup:" msgstr "П_оказване на списъка" #: gajim/data/gui/preferences_window.ui:431 msgid "_Ignore rich content in incoming messages" msgstr "_Пренебрегване на излишно форматиране на входящите съобщения" #: gajim/data/gui/preferences_window.ui:435 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." msgstr "" "Някои съобщения могат да включват „rich content“ (форматиране, цветове и т." "н.). Ако тази опция е избрана, Gajim ще изобразява само обикновения текст." #: gajim/data/gui/preferences_window.ui:449 msgid "_Highlight misspelled words" msgstr "_Осветяване на неправилно изписаните думи" #: gajim/data/gui/preferences_window.ui:452 msgid "" "If checked, Gajim will highlight spelling errors in input fields of chat " "windows. If no language is explicitly set via right click on the input " "field, the default language will be used for this contact or group chat." msgstr "" "Ако тази опция е избрана, ще се осветяват правописни грешки в полетата за " "въвеждане на текст в прозорците за разговор. Ако не е избран език чрез " "натискане с десния бутон на мишката в полето за въвеждане, ще се използва " "езикът по подразбиране." #: gajim/data/gui/preferences_window.ui:466 #, fuzzy msgid "Notify by icon when your messages are received" msgstr "Звук за изпълнение при получаване на каквото и да е съобщение в стая." #: gajim/data/gui/preferences_window.ui:520 msgid "Show avatar in chat tabs" msgstr "" #: gajim/data/gui/preferences_window.ui:552 msgid "Chat Appearance" msgstr "Изглед на разговорите" #: gajim/data/gui/preferences_window.ui:607 msgid "When new event is received:" msgstr "При получаване на ново събитие:" #: gajim/data/gui/preferences_window.ui:645 msgid "Notify me about contacts that sign _in" msgstr "Уведомяване за _включващи се контакти" #: gajim/data/gui/preferences_window.ui:663 msgid "Notify me about contacts that sign _out" msgstr "Уведомяване за _изключващи се контакти" #: gajim/data/gui/preferences_window.ui:667 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" msgstr "" "Ще се появява съобщение за уведомяване в долния десен ъгъл на екрана при " "изключване на контакти" #: gajim/data/gui/preferences_window.ui:681 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" msgstr "" "Позволяване на прозорци/уведомления при _Отсъствам/Не съм на разположение/" "Зает/Невидим" #: gajim/data/gui/preferences_window.ui:698 #, fuzzy msgid "Allow popup/notifications when a chat window is opened" msgstr "" "Позволяване на прозорци/уведомления при _Отсъствам/Не съм на разположение/" "Зает/Невидим" #: gajim/data/gui/preferences_window.ui:722 #, fuzzy msgid "Show notification area icon:" msgstr "Демон за уведомления" #: gajim/data/gui/preferences_window.ui:762 msgid "Visual Notifications" msgstr "Зрителни уведомления" #: gajim/data/gui/preferences_window.ui:795 msgid "Play _sounds" msgstr "Изпълнение на з_вуци" #: gajim/data/gui/preferences_window.ui:812 #: gajim/data/gui/preferences_window.ui:1656 msgid "Ma_nage..." msgstr "_Управление…" #: gajim/data/gui/preferences_window.ui:834 msgid "Allow sound when I'm _busy" msgstr "" #: gajim/data/gui/preferences_window.ui:856 msgid "Sounds" msgstr "Звуци" #: gajim/data/gui/preferences_window.ui:877 msgid "Notifications" msgstr "Уведомления" #: gajim/data/gui/preferences_window.ui:911 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " "display in chat windows." msgstr "" "Gajim може да изпраща и получава мета-информация, свързана с разговора с " "даден контакт. Тук може да укажете кои състояния бихте искали да се показват " "в прозорците за разговор." #: gajim/data/gui/preferences_window.ui:916 msgid "_Display chat state notifications:" msgstr "Показване на уведомления при _разговор:" #: gajim/data/gui/preferences_window.ui:967 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " "send to the other party." msgstr "" "Gajim може да изпраща и получава мета-информация, свързана с разговора с " "даден контакт. Тук може да укажете кои състояния бихте искали да изпращате." #: gajim/data/gui/preferences_window.ui:972 msgid "_Send chat state notifications:" msgstr "Изпращане на уведомления при _разговор:" #: gajim/data/gui/preferences_window.ui:990 msgid "Chat state notifications" msgstr "Уведомления за състояния на разговора" #: gajim/data/gui/preferences_window.ui:1012 msgid "Personal Events" msgstr "Лични събития" #: gajim/data/gui/preferences_window.ui:1043 msgid "_Away after:" msgstr "„_Отсъствам“ след:" #: gajim/data/gui/preferences_window.ui:1047 msgid "" "If checked, Gajim will change status to Away when the computer is unused." msgstr "" "Ако тази опция е избрана, Gajim ще променя състоянието на „Отсъствам“ когато " "компютърът не се използва." #: gajim/data/gui/preferences_window.ui:1060 msgid "_Not available after:" msgstr "„Не съм на _разположение“ след:" #: gajim/data/gui/preferences_window.ui:1064 msgid "" "If checked, Gajim will change status to Not Available when the computer has " "not been used even longer" msgstr "" "Ако тази опция е избрана, Gajim ще променя състоянието на „Не съм на " "разположение“ когато компютърът не се използва по-дълго време." #: gajim/data/gui/preferences_window.ui:1079 #: gajim/data/gui/preferences_window.ui:1091 msgid "minutes" msgstr "минути" #: gajim/data/gui/preferences_window.ui:1103 #, fuzzy msgid "" "The auto away status message. If empty, Gajim will not change the current " "status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-away timeout" msgstr "" "Съобщение за автоматично състояние „Отсъствам“. Ако е празно, няма да се " "сменя текущото съобщение." #: gajim/data/gui/preferences_window.ui:1117 #, fuzzy msgid "" "The auto not available status message. If empty, Gajim will not change the " "current status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-not-available timeout" msgstr "" "Съобщение за автоматично състояние „Не съм на разположение“. Ако е празно, " "няма да се сменя текущото съобщение." #: gajim/data/gui/preferences_window.ui:1165 msgid "Auto Status" msgstr "Автоматично състояние" #: gajim/data/gui/preferences_window.ui:1200 msgid "Ask status message when I:" msgstr "Питане за съобщение за състояние при преминаване в режим:" #: gajim/data/gui/preferences_window.ui:1215 msgid "Sign _in" msgstr "_Включване" #: gajim/data/gui/preferences_window.ui:1232 msgid "Sign _out" msgstr "Изкл_ючване" #: gajim/data/gui/preferences_window.ui:1265 msgid "" "If enabled, Gajim will not ask for a status message. The specified default " "message will be used instead." msgstr "" "Ако тази опция е избрана, няма да се пита за съобщение за състояние — ще се " "използва стандартно зададеното." #: gajim/data/gui/preferences_window.ui:1277 #: gajim/data/gui/preferences_window.ui:1479 msgid "Status" msgstr "Състояние" #: gajim/data/gui/preferences_window.ui:1288 msgid "Default Message" msgstr "Стандартно съобщение" #: gajim/data/gui/preferences_window.ui:1303 msgid "Enabled" msgstr "Включено" #: gajim/data/gui/preferences_window.ui:1329 msgid "Status Messages" msgstr "Съобщения за състояние" #: gajim/data/gui/preferences_window.ui:1459 msgid "Preset Status Messages" msgstr "Настроени съобщения за състояние" #: gajim/data/gui/preferences_window.ui:1512 msgid "Chat message:" msgstr "Съобщение от разговор:" #: gajim/data/gui/preferences_window.ui:1537 msgid "Use system _default" msgstr "Използване на стан_дартните за системата" #: gajim/data/gui/preferences_window.ui:1560 msgid "Font" msgstr "Шрифт" #: gajim/data/gui/preferences_window.ui:1590 msgid "T_heme:" msgstr "_Тема:" #: gajim/data/gui/preferences_window.ui:1603 msgid "Status _iconset:" msgstr "_Набор икони за състояние:" #: gajim/data/gui/preferences_window.ui:1614 msgid "Use _transports icons" msgstr "Използване на и_кони за транспортите" #: gajim/data/gui/preferences_window.ui:1618 #, fuzzy msgid "" "If checked, Gajim will use protocol-specific status icons. (e.g. A contact " "from ICQ will have the equivalent ICQ icon for status online, away, busy, " "etc...)" msgstr "" "Ако тази опция е избрана, ще се използват специфични за протокола икони за " "състояние (т.е. контакт от MSN ще има еквивалентната за MSN икона за " "състоянията „На линия“, „Отсъствам“, „Зает“ и т.н.)." #: gajim/data/gui/preferences_window.ui:1660 msgid "Configure color and font of the interface" msgstr "Настройване на цвят и шрифт на интерфейса" #: gajim/data/gui/preferences_window.ui:1682 msgid "Themes" msgstr "Теми" #: gajim/data/gui/preferences_window.ui:1712 #, fuzzy msgid "Contact's nickname:" msgstr "Име на контакта" #: gajim/data/gui/preferences_window.ui:1726 #, fuzzy msgid "Contact's message:" msgstr "Съобщение от разговор:" #: gajim/data/gui/preferences_window.ui:1738 msgid "_Status message:" msgstr "С_ъобщение за състояние:" #: gajim/data/gui/preferences_window.ui:1752 #, fuzzy msgid "Group chat highlight:" msgstr "Осветено съобщение в стая" #: gajim/data/gui/preferences_window.ui:1890 #, fuzzy msgid "Your nickname:" msgstr "Псевдоним:" #: gajim/data/gui/preferences_window.ui:1904 #, fuzzy msgid "Your message:" msgstr "Грешка: %s" #: gajim/data/gui/preferences_window.ui:1916 msgid "_URL highlight:" msgstr "_Адреси:" #: gajim/data/gui/preferences_window.ui:2041 msgid "_Reset to Default Colors" msgstr "Възстановяване на стандартните _цветове" #: gajim/data/gui/preferences_window.ui:2075 msgid "Chat Line Colors" msgstr "Цветове за разговорите" #: gajim/data/gui/preferences_window.ui:2095 msgid "Style" msgstr "Стил" #: gajim/data/gui/preferences_window.ui:2128 msgid "Audio input device" msgstr "" #: gajim/data/gui/preferences_window.ui:2140 msgid "Audio output device" msgstr "" #: gajim/data/gui/preferences_window.ui:2176 #, fuzzy msgid "Audio" msgstr "Действия" #: gajim/data/gui/preferences_window.ui:2206 msgid "Video input device" msgstr "" #: gajim/data/gui/preferences_window.ui:2218 msgid "Video output device" msgstr "" #: gajim/data/gui/preferences_window.ui:2230 msgid "Video framerate" msgstr "" #: gajim/data/gui/preferences_window.ui:2242 msgid "Video size" msgstr "" #: gajim/data/gui/preferences_window.ui:2252 msgid "View own video source" msgstr "" #: gajim/data/gui/preferences_window.ui:2316 #, fuzzy msgid "Video" msgstr "Презиме:" #: gajim/data/gui/preferences_window.ui:2346 #, fuzzy msgid "STUN server:" msgstr "Сървър:" #: gajim/data/gui/preferences_window.ui:2372 msgid "" "STUN server hostname. If none given, Gajim will try\n" "to discover one from server." msgstr "" #: gajim/data/gui/preferences_window.ui:2386 msgid "(example: stun.iptel.org)" msgstr "" #: gajim/data/gui/preferences_window.ui:2400 #, fuzzy msgid "Connection" msgstr "Условия" #: gajim/data/gui/preferences_window.ui:2485 msgid "_Mail client:" msgstr "_Програма за е-поща:" #: gajim/data/gui/preferences_window.ui:2498 msgid "_Browser:" msgstr "Интернет _браузър:" #: gajim/data/gui/preferences_window.ui:2511 msgid "_File manager:" msgstr "_Файлов мениджър:" #. a header for custom browser/client/file manager. so translate sth like: Custom Settings #: gajim/data/gui/preferences_window.ui:2559 msgid "Custom" msgstr "Персонални" #: gajim/data/gui/preferences_window.ui:2576 msgid "Applications" msgstr "Програми" #: gajim/data/gui/preferences_window.ui:2604 msgid "_Ignore events from contacts not in the roster" msgstr "Прене_брегване на събития от контакти, които не са в списъка" #: gajim/data/gui/preferences_window.ui:2608 msgid "" "If checked, Gajim will ignore incoming events from unauthorized contacts. " "Use with caution, because it blocks all messages from any contact that is " "not in the roster" msgstr "" "Ако тази опция е избрана, Gajim ще игнорира входящи събития от " "неупълномощени контакти. Използвайте я внимателно, тъй като блокира всички " "съобщения от всеки контакт, който не е в списъка." #: gajim/data/gui/preferences_window.ui:2622 #, fuzzy msgid "Allow client / _OS information to be sent" msgstr "Позволяване изпращането на _информация за ОС" #: gajim/data/gui/preferences_window.ui:2626 msgid "" "If checked, Gajim will allow others to detect the operation system you are " "using" msgstr "" "Ако тази опция е избрана, контактите ще могат да откриват операционната " "система, която използвате." #: gajim/data/gui/preferences_window.ui:2640 #, fuzzy msgid "Allow local system time information to be sent" msgstr "Позволяване изпращането на _информация за ОС" #: gajim/data/gui/preferences_window.ui:2644 #, fuzzy msgid "If checked, Gajim will allow others to detect the time on your system" msgstr "" "Ако тази опция е избрана, контактите ще могат да откриват операционната " "система, която използвате." #: gajim/data/gui/preferences_window.ui:2658 msgid "Log _encrypted chat session" msgstr "Запазване на дневник на _шифрираната сесия" #: gajim/data/gui/preferences_window.ui:2662 #, fuzzy msgid "" "If checked, Gajim will keep logs for encrypted messages. Please note that " "when using End-to-End encryption the remote party has to agree on logging, " "else the messages will not be logged." msgstr "" "Ако тази опция е избрана, Gajim ще запазва дневници за шифрираните " "съобщение. Забележете, че при шифриране тип „E2E“ другата страна трябва да " "се съгласи, иначе съобщенията няма да бъдат запазвани." #: gajim/data/gui/preferences_window.ui:2676 #, fuzzy msgid "Allow my _idle time to be sent" msgstr "Позволяване изпращането на _информация за ОС" #: gajim/data/gui/preferences_window.ui:2695 msgid "Global proxy:" msgstr "" #: gajim/data/gui/preferences_window.ui:2724 #, fuzzy msgid "_Manage..." msgstr "Управление на…" #: gajim/data/gui/preferences_window.ui:2743 msgid "Privacy" msgstr "Уединение" #: gajim/data/gui/preferences_window.ui:2770 msgid "_Log status changes of contacts" msgstr "Запазване на промените на _състоянията на контактите" #: gajim/data/gui/preferences_window.ui:2791 msgid "Miscellaneous" msgstr "Разни" #: gajim/data/gui/preferences_window.ui:2810 msgid "_Open..." msgstr "_Отваряне…" #: gajim/data/gui/preferences_window.ui:2826 msgid "Advanced Configuration Editor" msgstr "Редактор на настройките за напреднали" #: gajim/data/gui/contact_context_menu.ui:12 msgid "Start _Chat" msgstr "Започване на _разговор" #: gajim/data/gui/contact_context_menu.ui:20 #: gajim/data/gui/systray_context_menu.ui:36 msgid "Send Single _Message..." msgstr "Изпращане на _еднократно съобщение…" #: gajim/data/gui/contact_context_menu.ui:28 msgid "Send _File..." msgstr "Изпращане на _файл…" #: gajim/data/gui/contact_context_menu.ui:44 msgid "Invite _Contacts" msgstr "Покана на _контакти" #: gajim/data/gui/contact_context_menu.ui:73 #, fuzzy msgid "E_xecute Command..." msgstr "Изпълнение на команда…" #: gajim/data/gui/contact_context_menu.ui:82 #, fuzzy msgid "M_anage Contact" msgstr "_Управление на контакт" #: gajim/data/gui/contact_context_menu.ui:92 msgid "_Rename..." msgstr "_Преименуване…" #: gajim/data/gui/contact_context_menu.ui:99 msgid "Edit _Groups..." msgstr "Редактиране на _групи…" #: gajim/data/gui/contact_context_menu.ui:106 msgid "Assign Open_PGP Key..." msgstr "Задаване на ключ Open_PGP…" #: gajim/data/gui/contact_context_menu.ui:115 msgid "Add Special _Notification..." msgstr "Добавяне на специално _уведомление…" #: gajim/data/gui/contact_context_menu.ui:129 msgid "_Subscription" msgstr "_Записване" #: gajim/data/gui/contact_context_menu.ui:138 #, fuzzy msgid "_Allow contact to see my status" msgstr "_Позволяване на този контакт да вижда състоянието ми" #: gajim/data/gui/contact_context_menu.ui:146 #, fuzzy msgid "A_sk to see contact status" msgstr "_Запитване за виждане на състоянието на контакта" #: gajim/data/gui/contact_context_menu.ui:154 #, fuzzy msgid "_Forbid contact to see my status" msgstr "За_брана за виждане на състоянието ми" #: gajim/data/gui/contact_context_menu.ui:182 msgid "_Unignore" msgstr "_Премахване на игнорирането" #: gajim/data/gui/contact_context_menu.ui:190 msgid "_Ignore" msgstr "_Игнориране" #: gajim/data/gui/contact_context_menu.ui:197 #: gajim/data/gui/chat_context_menu.ui:66 msgid "_Add to Roster..." msgstr "Добавяне към _списъка…" #: gajim/data/gui/account_creation_wizard_window.ui:43 msgid "Gajim: Account Creation Wizard" msgstr "Gajim: Помощник за създаване на акаунт" #: gajim/data/gui/account_creation_wizard_window.ui:70 msgid "" "You need to have an account in order to connect\n" "to the Jabber network." msgstr "" "Трябва да имате акаунт, за да се свържете с\n" "мрежата на Джабър." #: gajim/data/gui/account_creation_wizard_window.ui:95 msgid "I already have an account I want to _use" msgstr "_Вече имам регистриран акаунт, който искам да използвам" #: gajim/data/gui/account_creation_wizard_window.ui:112 msgid "I want to _register for a new account" msgstr "_Искам да регистрирам нов акаунт" #: gajim/data/gui/account_creation_wizard_window.ui:133 msgid "Please choose one of the options below:" msgstr "Изберете една от опциите по-долу:" #: gajim/data/gui/account_creation_wizard_window.ui:167 msgid "Please fill in the data for your existing account" msgstr "Попълнете данните за съществуващия ви акаунт" #: gajim/data/gui/account_creation_wizard_window.ui:187 msgid "_Jabber ID:" msgstr "_Jabber ID:" #: gajim/data/gui/account_creation_wizard_window.ui:239 #: gajim/data/gui/account_creation_wizard_window.ui:394 #, fuzzy msgid "Anon_ymous authentication" msgstr "Използване на удостоверяване" #: gajim/data/gui/account_creation_wizard_window.ui:259 #: gajim/data/gui/manage_bookmarks_window.ui:172 msgid "_Password:" msgstr "_Парола:" #: gajim/data/gui/account_creation_wizard_window.ui:281 msgid "Save pass_word" msgstr "Запазване на паро_ла" #: gajim/data/gui/account_creation_wizard_window.ui:285 msgid "If checked, Gajim will remember the password for this account" msgstr "Ако тази опция е избрана, ще се запомни паролата за този акаунт." #: gajim/data/gui/account_creation_wizard_window.ui:339 msgid "Please select a server" msgstr "Изберете сървър" #: gajim/data/gui/account_creation_wizard_window.ui:358 #: gajim/data/gui/manage_bookmarks_window.ui:159 msgid "_Server:" msgstr "С_ървър:" #: gajim/data/gui/account_creation_wizard_window.ui:423 msgid "Prox_y:" msgstr "_Сървър-посредник:" #: gajim/data/gui/account_creation_wizard_window.ui:450 msgid "Manage..." msgstr "Управление на…" #: gajim/data/gui/account_creation_wizard_window.ui:465 msgid "Use custom hostname/port" msgstr "Използване на нестандартен хост/порт" #: gajim/data/gui/account_creation_wizard_window.ui:491 msgid "_Hostname:" msgstr "_Хост:" #: gajim/data/gui/account_creation_wizard_window.ui:517 msgid "_Port:" msgstr "По_рт:" #: gajim/data/gui/account_creation_wizard_window.ui:553 #: gajim/data/gui/account_creation_wizard_window.ui:884 msgid "_Advanced" msgstr "На_преднали" #: gajim/data/gui/account_creation_wizard_window.ui:624 msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA1 fingerprint of the certificate:\n" msgstr "" "Добавяне на този сертификат към списъка с доверени сертификати.\n" "Отпечатък тип SHA1 на сертификата:\n" #: gajim/data/gui/account_creation_wizard_window.ui:687 msgid "" "Connecting to server\n" "\n" "Please wait..." msgstr "" "Свързване със сървъра\n" "\n" "Изчакайте…" #: gajim/data/gui/account_creation_wizard_window.ui:772 msgid "Connect when I press Finish" msgstr "Свързване при натискане на бутона „Приключване“" #: gajim/data/gui/account_creation_wizard_window.ui:789 msgid "Set my profile when I connect" msgstr "Настройване на профила при свързване" #: gajim/data/gui/account_creation_wizard_window.ui:901 msgid "_Finish" msgstr "_Приключване" #: gajim/data/gui/privacy_lists_window.ui:34 msgid "Privacy Lists:" msgstr "Филтри за уединение:" #: gajim/data/gui/service_discovery_window.ui:84 msgid "_Address:" msgstr "_Адрес:" #: gajim/data/gui/service_discovery_window.ui:115 msgid "G_o" msgstr "_Отиване" #: gajim/data/gui/synchronise_select_contacts_dialog.ui:8 msgid "Synchronise : select contacts" msgstr "Синхронизиране: избор на контакти" #: gajim/data/gui/synchronise_select_contacts_dialog.ui:67 msgid "Select the contacts you want to synchronise" msgstr "Изберете контактите, които искате да синхронизирате" #: gajim/data/gui/edit_groups_dialog.ui:8 msgid "Edit Groups" msgstr "Редактиране на групи" #: gajim/data/gui/search_window.ui:42 msgid "Please wait while retrieving search form..." msgstr "Изчакайте, докато се извлече формуляра за търсене…" #: gajim/data/gui/search_window.ui:80 msgid "_Add contact" msgstr "Добавяне на _контакт" #: gajim/data/gui/search_window.ui:116 msgid "_Search" msgstr "_Търсене" #: gajim/data/gui/chat_context_menu.ui:11 msgid "_Copy Link Location" msgstr "_Копиране на адреса на връзката" #: gajim/data/gui/chat_context_menu.ui:19 msgid "_Open Link in Browser" msgstr "_Отваряне на връзката в браузър" #: gajim/data/gui/chat_context_menu.ui:27 msgid "_Copy JID/Email Address" msgstr "Копиране на _JID/Е-поща" #: gajim/data/gui/chat_context_menu.ui:35 msgid "_Open Email Composer" msgstr "_Отваряне на пощенската програма" #: gajim/data/gui/chat_context_menu.ui:49 #: gajim/data/gui/subscription_request_window.ui:12 msgid "_Start Chat" msgstr "_Започване на разговор" #: gajim/data/gui/chat_context_menu.ui:57 #: gajim/data/gui/account_context_menu.ui:35 #: gajim/data/gui/systray_context_menu.ui:28 msgid "Join _Group Chat" msgstr "_Влизане в стая" #: gajim/data/gui/change_status_message_dialog.ui:131 msgid "Save as Preset..." msgstr "Запазване като настроено…" #: gajim/data/gui/change_status_message_dialog.ui:167 msgid "Preset messages:" msgstr "Настроени съобщения:" #: gajim/data/gui/change_status_message_dialog.ui:313 msgid "Type your new status message" msgstr "Напишете новото съобщение за състояние" #: gajim/data/gui/synchronise_select_account_dialog.ui:8 msgid "Synchronise contacts" msgstr "Синхронизиране на контакти" #: gajim/data/gui/synchronise_select_account_dialog.ui:68 msgid "Select the account with which you want to synchronise" msgstr "Изберете акаунт, с който искате да синхронизирате" #: gajim/data/gui/archiving_313_preferences_window.ui:28 #, fuzzy msgid "Roster" msgstr "П_оказване на списъка" #: gajim/data/gui/archiving_313_preferences_window.ui:85 #, fuzzy msgid "Preference" msgstr "Настройки" #: gajim/data/gui/archiving_313_preferences_window.ui:159 #, fuzzy msgid "Default:" msgstr "По подразбиране" #: gajim/data/gui/voip_call_received_dialog.ui:15 msgid "Incoming call" msgstr "" #: gajim/data/gui/add_new_contact_window.ui:29 msgid "Add New Contact" msgstr "Добавяне на нов контакт" #: gajim/data/gui/add_new_contact_window.ui:62 msgid "A_ccount:" msgstr "_Акаунт:" #: gajim/data/gui/add_new_contact_window.ui:110 msgid "_Protocol:" msgstr "П_ротокол:" #: gajim/data/gui/add_new_contact_window.ui:169 msgid "_User ID:" msgstr "_Идентификатор на потребител:" #: gajim/data/gui/add_new_contact_window.ui:182 #: gajim/data/gui/manage_bookmarks_window.ui:133 msgid "_Nickname:" msgstr "Псе_вдоним:" #: gajim/data/gui/add_new_contact_window.ui:195 msgid "_Group:" msgstr "_Група:" #: gajim/data/gui/add_new_contact_window.ui:210 #, fuzzy msgid "Type User ID" msgstr "Идентификатор на потребител:" #: gajim/data/gui/add_new_contact_window.ui:223 #, fuzzy msgid "Type Nickname" msgstr "Псевдоним" #: gajim/data/gui/add_new_contact_window.ui:239 msgid "Choose a group of type a new group" msgstr "" #: gajim/data/gui/add_new_contact_window.ui:257 msgid "A_llow this contact to view my status" msgstr "_Позволяване на този контакт да вижда състоянието ми" #: gajim/data/gui/add_new_contact_window.ui:300 #, fuzzy msgid "_Save subscription message" msgstr "_Записване" #: gajim/data/gui/add_new_contact_window.ui:325 #, fuzzy msgid "" "You have to register with this transport\n" "to be able to add a contact from this\n" "protocol. Click on Register button to\n" "proceed." msgstr "" "Трябва да регистрирате този транспорт,\n" "за да може да добавите контакт от този\n" "протокол. Натиснете бутона „Регистриране“,\n" "за да продължите." #: gajim/data/gui/add_new_contact_window.ui:340 msgid "_Register" msgstr "_Регистриране" #: gajim/data/gui/add_new_contact_window.ui:369 msgid "" "You must be connected to the transport to be able\n" "to add a contact from this protocol." msgstr "" "Трябва да сте свързани към транспорта, за да може\n" "да добавите контакт от този протокол." #: gajim/data/gui/roster_window.ui:61 #, fuzzy msgid "Change Status Message…" msgstr "Пром_яна на съобщението за състояние" #: gajim/data/gui/change_mood_dialog.ui:73 msgid "Mood:" msgstr "Настроение:" #: gajim/data/gui/change_mood_dialog.ui:85 msgid "Message:" msgstr "Съобщение:" #: gajim/data/gui/plugins_window.ui:25 gajim/data/gui/application_menu.ui:90 msgid "Plugins" msgstr "" #: gajim/data/gui/plugins_window.ui:78 msgid "Install from zip" msgstr "" #: gajim/data/gui/plugins_window.ui:109 msgid "<empty>" msgstr "" #: gajim/data/gui/plugins_window.ui:131 #, fuzzy msgid "Version:" msgstr "Версия на GTK+:" #: gajim/data/gui/plugins_window.ui:169 #, fuzzy msgid "Authors:" msgstr "_Упълномощаване" #: gajim/data/gui/plugins_window.ui:210 #, fuzzy msgid "Homepage:" msgstr "Страница в Интернет:" #: gajim/data/gui/plugins_window.ui:253 #, fuzzy msgid "Description:" msgstr "Описание: " #: gajim/data/gui/plugins_window.ui:301 msgid "Uninstall" msgstr "" #: gajim/data/gui/plugins_window.ui:316 #, fuzzy msgid "Configure" msgstr "_Настройване" #: gajim/data/gui/plugins_window.ui:348 #, fuzzy msgid "Installed" msgstr "Блокирал" #: gajim/data/gui/plugins_window.ui:399 msgid "" "Plug-in decription should be displayed here. This text will be erased during " "PluginsWindow initialization." msgstr "" #: gajim/data/gui/privacy_list_window.ui:18 #, fuzzy msgid "none" msgstr "един" #: gajim/data/gui/privacy_list_window.ui:21 #, fuzzy msgid "both" msgstr "Двустранно" #: gajim/data/gui/privacy_list_window.ui:24 #, fuzzy msgid "from" msgstr "От" #: gajim/data/gui/privacy_list_window.ui:27 #, fuzzy msgid "to" msgstr "два" #: gajim/data/gui/privacy_list_window.ui:66 msgid "Privacy List" msgstr "Филтър за уединение" #: gajim/data/gui/privacy_list_window.ui:77 msgid "Active for this session" msgstr "Активен за тази сесия" #: gajim/data/gui/privacy_list_window.ui:94 msgid "Active on each startup" msgstr "Активен при всяко стартиране" #: gajim/data/gui/privacy_list_window.ui:132 msgid "List of rules" msgstr "Списък с правила" #: gajim/data/gui/privacy_list_window.ui:244 msgid "Add / Edit a rule" msgstr "Добавяне / Редактиране на правило" #: gajim/data/gui/privacy_list_window.ui:266 msgid "Allow" msgstr "Позволяване на" #: gajim/data/gui/privacy_list_window.ui:282 msgid "Deny" msgstr "Отказване" #: gajim/data/gui/privacy_list_window.ui:317 msgid "JabberID" msgstr "Jabber ID" #: gajim/data/gui/privacy_list_window.ui:358 msgid "all in the group" msgstr "всички в групата" #: gajim/data/gui/privacy_list_window.ui:407 msgid "all by subscription" msgstr "всички със записване" #: gajim/data/gui/privacy_list_window.ui:456 msgid "All" msgstr "Всички" #: gajim/data/gui/privacy_list_window.ui:493 msgid "to send me messages" msgstr "да ми изпраща съобщения" #: gajim/data/gui/privacy_list_window.ui:509 msgid "to send me queries" msgstr "да ми изпращат лични съобщения" #: gajim/data/gui/privacy_list_window.ui:525 msgid "to view my status" msgstr "да виждат състоянието ми" #: gajim/data/gui/privacy_list_window.ui:541 msgid "to send me status" msgstr "да ми изпращат състоянието си" #: gajim/data/gui/privacy_list_window.ui:557 #, fuzzy msgid "All (including subscription)" msgstr "всички със записване" #: gajim/data/gui/privacy_list_window.ui:598 msgid "Order:" msgstr "Ред:" #: gajim/data/gui/manage_sounds_window.ui:10 #, fuzzy msgid "Manage sounds" msgstr "Управление на акаунти" #: gajim/data/gui/remove_account_window.ui:56 msgid "Remove account _only from Gajim" msgstr "Премахване на акаунт _само от Gajim" #: gajim/data/gui/remove_account_window.ui:73 msgid "Remove account from Gajim and from _server" msgstr "Премахване на акаунт от Gajim и от с_ървъра" #: gajim/data/gui/remove_account_window.ui:94 msgid "What do you want to do?" msgstr "Какво искате да направите?" #: gajim/data/gui/adhoc_commands_window.ui:35 msgid "Please wait while retrieving command list..." msgstr "Изчакайте, докато се извлече списъка с команди…" #: gajim/data/gui/adhoc_commands_window.ui:93 msgid "Choose command to execute:" msgstr "Изберете команда за изпълнение:" #: gajim/data/gui/adhoc_commands_window.ui:136 #: gajim/data/gui/adhoc_commands_window.ui:277 msgid "Check once more" msgstr "Проверка наново" #: gajim/data/gui/adhoc_commands_window.ui:194 #, fuzzy msgid "Please wait while the command is being sent..." msgstr "Изчакайте, докато командата се изпраща…" #: gajim/data/gui/adhoc_commands_window.ui:211 msgid "Please wait..." msgstr "Изчакайте…" #: gajim/data/gui/adhoc_commands_window.ui:257 msgid "This jabber entity does not expose any commands." msgstr "Този Джабър контакт не предлага никакви команди." #: gajim/data/gui/adhoc_commands_window.ui:336 msgid "An error has occurred:" msgstr "Възникна грешка:" #: gajim/data/gui/adhoc_commands_window.ui:465 #, fuzzy msgid "F_inish" msgstr "_Приключване" #: gajim/data/gui/account_context_menu.ui:20 msgid "_Personal Events" msgstr "_Лични събития" #: gajim/data/gui/account_context_menu.ui:49 msgid "_Add Contact..." msgstr "_Добавяне на контакт…" #: gajim/data/gui/account_context_menu.ui:57 msgid "_Discover Services" msgstr "_Откриване на услуги" #: gajim/data/gui/account_context_menu.ui:65 msgid "_Execute Command..." msgstr "_Изпълнение на команда…" #: gajim/data/gui/esession_info_window.ui:50 msgid "_Verify" msgstr "_Проверка" #: gajim/data/gui/esession_info_window.ui:137 msgid "(ESession info)" msgstr "(Информация за Е-сесия)" #: gajim/data/gui/application_menu.ui:8 #, fuzzy msgid "View" msgstr "_Изглед" #: gajim/data/gui/application_menu.ui:11 #, fuzzy msgid "Show Roster" msgstr "П_оказване на списъка" #: gajim/data/gui/application_menu.ui:16 #, fuzzy msgid "Show Offline Contacts" msgstr "Показване на изкл_ючените контакти" #: gajim/data/gui/application_menu.ui:21 #, fuzzy msgid "Show Active Contacts" msgstr "Показване на изкл_ючените контакти" #: gajim/data/gui/application_menu.ui:26 #, fuzzy msgid "Show Transports" msgstr "Показване на т_ранспорти" #: gajim/data/gui/application_menu.ui:43 #, fuzzy msgid "Help" msgstr "Помо_щ" #: gajim/data/gui/application_menu.ui:46 #, fuzzy msgid "Contents" msgstr "_Ръководства" #: gajim/data/gui/application_menu.ui:50 #, fuzzy msgid "FAQ" msgstr "_ЧЗВ" #: gajim/data/gui/application_menu.ui:54 msgid "Keyboard Shortcuts" msgstr "" #: gajim/data/gui/application_menu.ui:58 gajim/data/gui/features_window.ui:9 msgid "Features" msgstr "Възможности" #: gajim/data/gui/application_menu.ui:76 msgid "Start Chat" msgstr "Започване на разговор" #: gajim/data/gui/application_menu.ui:81 #, fuzzy msgid "Bookmarks" msgstr "_Добавяне на стаята към отметките" #: gajim/data/gui/application_menu.ui:99 #, fuzzy msgid "Quit" msgstr "_Изход" #: gajim/data/gui/features_window.ui:26 msgid "List of possible features in Gajim:" msgstr "Списък с възможни функционалности на Gajim:" #: gajim/data/gui/manage_bookmarks_window.ui:14 msgid "Manage Bookmarks" msgstr "Управление на отметките" #: gajim/data/gui/manage_bookmarks_window.ui:120 #, fuzzy msgid "_Title:" msgstr "Заглавие:" #: gajim/data/gui/manage_bookmarks_window.ui:146 msgid "Roo_m:" msgstr "" #: gajim/data/gui/manage_bookmarks_window.ui:188 #, fuzzy msgid "A_uto join" msgstr "Автоматично влизане" #: gajim/data/gui/manage_bookmarks_window.ui:193 msgid "If checked, Gajim will join this group chat on startup" msgstr "Ако тази опция е избрана, ще влизате в тази стая при стартиране." #: gajim/data/gui/manage_bookmarks_window.ui:207 #, fuzzy msgid "Minimi_ze on Auto Join" msgstr "Минимизиране при автоматично влизане" #: gajim/data/gui/manage_bookmarks_window.ui:235 #, fuzzy msgid "Pr_int status:" msgstr "Изписване на състоянията:" #: gajim/data/gui/exception_dialog.ui:45 #, fuzzy msgid "" "A programming error has been detected. It probably is not fatal, but should " "be reported to the developers nonetheless." msgstr "" "Вероятно не е фатална, но би трябвало да се докладва на разработчиците." #: gajim/data/gui/exception_dialog.ui:115 #, fuzzy msgid "Report Bug" msgstr "_Докладване на грешка" #: gajim/data/gui/subscription_request_window.ui:95 msgid "_Deny" msgstr "_Отказване" #: gajim/data/gui/subscription_request_window.ui:100 msgid "" "Deny authorization from contact so he or she cannot know when you're " "connected" msgstr "" "Отказване на упълномощаване на контакт, така че да не знае кога сте свързани" #: gajim/data/gui/subscription_request_window.ui:133 msgid "Au_thorize" msgstr "_Упълномощаване" #: gajim/data/gui/subscription_request_window.ui:138 msgid "Authorize contact so he or she can know when you're connected" msgstr "Упълномощаване на контакта, така че да знае кога сте свързани" #: gajim/data/gui/xml_console_window.ui:121 #, fuzzy msgid "Presence" msgstr "С_ъстояние" #: gajim/data/gui/xml_console_window.ui:134 msgid "Iq" msgstr "" #: gajim/data/gui/xml_console_window.ui:149 #, fuzzy msgid "Presets" msgstr "С_ъстояние" #: gajim/data/gui/chat_to_muc_window.ui:24 msgid "Invite Friends!" msgstr "Поканете приятели!" #: gajim/data/gui/chat_to_muc_window.ui:39 #, fuzzy msgid "" "You are now entering a groupchat.\n" "Select the contacts you want to invite" msgstr "" "На път сте да започнете разговор в стая.\n" "Изберете контактите, които искате да поканите." #: gajim/data/gui/chat_to_muc_window.ui:67 #: gajim/data/gui/chat_to_muc_window.ui:78 msgid "column" msgstr "" #: gajim/data/gui/chat_to_muc_window.ui:112 msgid "Please select a MUC server." msgstr "Изберете сървър за стаи." #: gajim/data/gui/chat_to_muc_window.ui:141 msgid "MUC server" msgstr "Сървър за стаи" #: gajim/data/gui/chat_to_muc_window.ui:176 msgid "In_vite" msgstr "По_кана" #: gajim/data/gui/history_manager.ui:11 #, fuzzy msgid "_Export" msgstr "Изнасяне" #: gajim/data/gui/history_manager.ui:97 msgid "Gajim History Logs Manager" msgstr "Мениджър на историята на разговорите" #: gajim/data/gui/history_manager.ui:154 msgid "Welcome to Gajim History Logs Manager" msgstr "Добре дошли в мениджъра на историята на разговорите" #: gajim/data/gui/history_manager.ui:168 msgid "" "This log manager is not intended for log viewing. If you are looking for " "such functionality, use the history window instead.\n" "\n" "Use this program to delete or export logs. You can select logs from the left " "and/or search database from below." msgstr "" "Този мениджър не е предназначен за преглед на историята на разговорите. Ако " "търсите такава функционалност, използвайте прозореца за история.\n" "\n" "Използвайте тази програма за изтриване или изнасяне на дневници. Може да ги " "избирате от списъка вляво и/или да търсите в базата от данни по-долу." #: gajim/data/gui/history_manager.ui:184 msgid "" "WARNING:\n" "If you plan to do massive deletions, please make sure Gajim is not running. " "Generally avoid deletions with contacts you currently chat with." msgstr "" "ПРЕДУПРЕЖДЕНИЕ:\n" "Ако планирате да изтривате масово, уверете се, че Gajim не е стартиран. По " "принцип избягвайте да изтривате история за контакти, с които разговаряте в " "момента." #: gajim/data/gui/history_manager.ui:283 msgid "_Search Database" msgstr "_Търсене в базата от данни" #: gajim/data/gui/shortcuts_window.ui:8 msgid "Chat Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:12 #, fuzzy msgid "Message composition" msgstr "текст на съобщението" #: gajim/data/gui/shortcuts_window.ui:17 #, fuzzy msgid "Send the message" msgstr "Изпращане на съобщение" #: gajim/data/gui/shortcuts_window.ui:24 #, fuzzy msgid "Create a new line" msgstr "Създаване на ново съобщение" #: gajim/data/gui/shortcuts_window.ui:31 msgid "Select an emoticon" msgstr "" #: gajim/data/gui/shortcuts_window.ui:38 msgid "Complete a command or a nick" msgstr "" #: gajim/data/gui/shortcuts_window.ui:45 #, fuzzy msgid "Previous sent message" msgstr "Настроени съобщения:" #: gajim/data/gui/shortcuts_window.ui:52 #, fuzzy msgid "Next sent messages" msgstr "Настроени съобщения:" #: gajim/data/gui/shortcuts_window.ui:59 #, fuzzy msgid "Quote previous message" msgstr "съобщение за състояние" #: gajim/data/gui/shortcuts_window.ui:66 #, fuzzy msgid "Quote next message" msgstr "Изпращане на съобщение" #: gajim/data/gui/shortcuts_window.ui:73 #, fuzzy msgid "Clear message entry" msgstr "Изпратено съобщение" #: gajim/data/gui/shortcuts_window.ui:81 gajim/data/gui/shortcuts_window.ui:231 #, fuzzy msgid "Appearance" msgstr "Изглед на разговорите" #: gajim/data/gui/shortcuts_window.ui:86 msgid "Toggle full / compact view" msgstr "" #: gajim/data/gui/shortcuts_window.ui:94 #, fuzzy msgid "Recent history" msgstr "Скоро посетени:" #: gajim/data/gui/shortcuts_window.ui:99 msgid "Scroll up" msgstr "" #: gajim/data/gui/shortcuts_window.ui:106 msgid "Scroll down" msgstr "" #: gajim/data/gui/shortcuts_window.ui:121 msgid "Tabs" msgstr "" #: gajim/data/gui/shortcuts_window.ui:126 msgid "Switch to the previous tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:133 msgid "Switch to the next tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:140 msgid "Switch to the first - ninth tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:147 msgid "Switch to the previous unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:154 msgid "Switch to the next unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:161 msgid "Close chat" msgstr "" #: gajim/data/gui/shortcuts_window.ui:172 msgid "Roster Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:195 #, fuzzy msgid "File transfers" msgstr "Файлови трансфери" #: gajim/data/gui/shortcuts_window.ui:209 #, fuzzy msgid "Join a group chat" msgstr "в _стаи" #: gajim/data/gui/shortcuts_window.ui:216 #, fuzzy msgid "Set the status message" msgstr "съобщение за състояние" #: gajim/data/gui/shortcuts_window.ui:223 #, fuzzy msgid "Quit Gajim" msgstr "Gajim" #: gajim/data/gui/shortcuts_window.ui:236 #, fuzzy msgid "Show offline contacts" msgstr "Показване на изкл_ючените контакти" #: gajim/data/gui/shortcuts_window.ui:243 #, fuzzy msgid "Show only active contacts" msgstr "Показване на изкл_ючените контакти" #: gajim/data/gui/shortcuts_window.ui:250 msgid "Enable roster filtering" msgstr "" #: gajim/data/gui/shortcuts_window.ui:258 msgid "Contacts" msgstr "Контакти" #: gajim/data/gui/shortcuts_window.ui:263 #, fuzzy msgid "Contact information" msgstr "Информация за контакта" #: gajim/data/gui/shortcuts_window.ui:270 #, fuzzy msgid "Rename contact" msgstr "Преименуване на контакт" #: gajim/data/gui/shortcuts_window.ui:277 #, fuzzy msgid "Delete contact" msgstr "Покана на _контакти" #: gajim/data/gui/passphrase_dialog.ui:8 msgid "Passphrase" msgstr "Парола" #: gajim/data/gui/history_window.ui:38 #, fuzzy msgid "Enter name / JID of contact or groupchat" msgstr "Име на контакта" #: gajim/data/gui/history_window.ui:51 msgid "Search:" msgstr "Търсене:" #: gajim/data/gui/history_window.ui:75 msgid "_In date search" msgstr "" #: gajim/data/gui/history_window.ui:79 msgid "Only searching within selected day" msgstr "" #: gajim/data/gui/history_window.ui:306 #, fuzzy msgid "_Show status changes" msgstr "Запазване на промените на _състоянията на контактите" #: gajim/data/gui/manage_pep_services_window.ui:13 msgid "PEP Service Configuration" msgstr "Настройки на услугата PEP" #: gajim/data/gui/manage_pep_services_window.ui:69 msgid "_Configure" msgstr "_Настройване" #: gajim/data/gui/groups_post_window.ui:9 msgid "Create new post" msgstr "Създаване на ново съобщение" #: gajim/data/gui/groups_post_window.ui:29 #: gajim/data/gui/single_message_window.ui:46 msgid "From:" msgstr "От:" #: gajim/data/gui/groups_post_window.ui:41 #: gajim/data/gui/single_message_window.ui:70 msgid "Subject:" msgstr "Тема:" #: gajim/data/gui/data_form_window.ui:19 msgid "Fill in the form." msgstr "Попълнете формуляра." #: gajim/data/gui/data_form_window.ui:274 msgid "Room Configuration" msgstr "Настройки на стаята" #: gajim/data/gui/roster_item_exchange_window.ui:8 msgid "Roster Item Exchange" msgstr "" #: gajim/data/gui/systray_context_menu.ui:12 msgid "Sta_tus" msgstr "С_ъстояние" #: gajim/data/gui/systray_context_menu.ui:20 msgid "_Start Chat..." msgstr "_Започване на разговор…" #: gajim/data/gui/systray_context_menu.ui:50 msgid "Show All Pending _Events" msgstr "Показване на всички _чакащи събития" #: gajim/data/gui/systray_context_menu.ui:59 msgid "Mute Sounds" msgstr "Изключване на звука" #: gajim/data/gui/systray_context_menu.ui:75 #, fuzzy msgid "_Preferences" msgstr "Настройки" #: gajim/data/gui/systray_context_menu.ui:90 #, fuzzy msgid "_Quit" msgstr "_Изход" #: gajim/data/gui/single_message_window.ui:59 msgid "To:" msgstr "До:" #: gajim/data/gui/single_message_window.ui:118 msgid "0" msgstr "0" #: gajim/data/gui/single_message_window.ui:210 msgid "Sen_d" msgstr "_Изпращане" #: gajim/data/gui/single_message_window.ui:216 msgid "Send message" msgstr "Изпращане на съобщение" #: gajim/data/gui/single_message_window.ui:229 msgid "_Reply" msgstr "_Отговор" #: gajim/data/gui/single_message_window.ui:235 msgid "Reply to this message" msgstr "Отговор на това съобщение" #: gajim/data/gui/single_message_window.ui:248 msgid "_Send & Close" msgstr "Изпра_щане и затваряне" #: gajim/data/gui/single_message_window.ui:254 msgid "Send message and close window" msgstr "Изпращане на съобщението и затваряне на прозореца" #: gajim/data/gui/change_activity_dialog.ui:8 msgid "Set Activity" msgstr "Задаване на дейност" #: gajim/data/gui/change_activity_dialog.ui:65 msgid "Set an activity" msgstr "Задаване на дейност" #: gajim/data/gui/change_activity_dialog.ui:337 msgid "Message: " msgstr "Съобщение:" #: gajim/command_system/mapping.py:164 gajim/command_system/mapping.py:174 #: gajim/command_system/mapping.py:194 #, fuzzy msgid "Missing arguments" msgstr "Липсващ аргумент „contact_jid“" #: gajim/command_system/mapping.py:261 #, fuzzy msgid "Too many arguments" msgstr "Липсващ аргумент „contact_jid“" #: gajim/command_system/implementation/execute.py:53 msgid "Execute expression inside a shell, show output" msgstr "" #: gajim/command_system/implementation/execute.py:109 msgid "Execute expression inside a shell, send output" msgstr "" #: gajim/command_system/implementation/standard.py:45 msgid "" "Show help on a given command or a list of available commands if -a is given" msgstr "" #: gajim/command_system/implementation/standard.py:72 #, fuzzy msgid "Send a message to the contact" msgstr "Употреба: /%s, изпраща съобщение до контакта." #: gajim/command_system/implementation/standard.py:77 msgid "Send action (in the third person) to the current chat" msgstr "" #: gajim/command_system/implementation/standard.py:82 msgid "Show logged messages which mention given text" msgstr "" #: gajim/command_system/implementation/standard.py:87 #, fuzzy, python-format msgid "%s: Nothing found" msgstr "%s не е намерен" #: gajim/command_system/implementation/standard.py:93 msgid "Limit must be an integer" msgstr "" #: gajim/command_system/implementation/standard.py:117 msgid "" "\n" " Set the current status\n" "\n" " Status can be given as one of the following values:\n" " online, away, chat, xa, dnd.\n" " " msgstr "" #: gajim/command_system/implementation/standard.py:135 msgid "Set the current status to away" msgstr "" #: gajim/command_system/implementation/standard.py:149 msgid "Set the current status to online" msgstr "" #: gajim/command_system/implementation/standard.py:152 #, fuzzy msgid "Available" msgstr "На _линия" #: gajim/command_system/implementation/standard.py:172 #: gajim/command_system/implementation/standard.py:249 #, fuzzy msgid "Clear the text window" msgstr "Употреба: /%s, изчиства текстовия прозорец." #: gajim/command_system/implementation/standard.py:177 #: gajim/command_system/implementation/standard.py:389 #, fuzzy msgid "Send a ping to the contact" msgstr "Употреба: /%s, изпраща „ping“ до контакта." #: gajim/command_system/implementation/standard.py:180 #: gajim/command_system/implementation/standard.py:392 #, fuzzy msgid "Command is not supported for zeroconf accounts" msgstr "Командата не се поддържа за акаунт тип „zeroconf“." #: gajim/command_system/implementation/standard.py:184 msgid "Send DTMF sequence through an open audio session" msgstr "" #: gajim/command_system/implementation/standard.py:187 msgid "No open audio sessions with the contact" msgstr "" #: gajim/command_system/implementation/standard.py:190 #, fuzzy, python-format msgid "%s is not a valid tone" msgstr "%s не е валидно ниво за дневник" #: gajim/command_system/implementation/standard.py:197 msgid "Toggle audio session" msgstr "" #: gajim/command_system/implementation/standard.py:200 #, fuzzy msgid "Audio sessions are not available" msgstr "В момента няма връзка" #: gajim/command_system/implementation/standard.py:207 msgid "Toggle video session" msgstr "" #: gajim/command_system/implementation/standard.py:210 #, fuzzy msgid "Video sessions are not available" msgstr "В момента няма връзка" #: gajim/command_system/implementation/standard.py:217 msgid "Send a message to the contact that will attract his (her) attention" msgstr "" #: gajim/command_system/implementation/standard.py:256 #, fuzzy msgid "Change your nickname in a group chat" msgstr "Смяна на псевдоним (Ctrl+N)" #: gajim/command_system/implementation/standard.py:266 #, fuzzy msgid "Open a private chat window with a specified occupant" msgstr "" "Употреба: /%s <псевдоним>, отваря прозорец за лично съобщение със съответния " "участник." #: gajim/command_system/implementation/standard.py:272 #: gajim/command_system/implementation/standard.py:281 #: gajim/command_system/implementation/standard.py:327 #: gajim/command_system/implementation/standard.py:339 #: gajim/command_system/implementation/standard.py:351 #, fuzzy msgid "Nickname not found" msgstr "Псевдонимът не е намерен: %s" #: gajim/command_system/implementation/standard.py:275 #, fuzzy msgid "" "Open a private chat window with a specified occupant and send him a message" msgstr "" "Употреба: /%s <псевдоним>, отваря прозорец за лично съобщение със съответния " "участник." #: gajim/command_system/implementation/standard.py:284 #, fuzzy msgid "Display or change a group chat topic" msgstr "Питане преди затваряне на подпрозорец/прозорец на стая." #: gajim/command_system/implementation/standard.py:292 msgid "Invite a user to a room for a reason" msgstr "" #: gajim/command_system/implementation/standard.py:295 #, fuzzy, python-format msgid "Invited %(jid)s to %(room_jid)s" msgstr "%(contact_jid)s е поканен в %(room_jid)s." #: gajim/command_system/implementation/standard.py:299 #, fuzzy msgid "Join a group chat given by a jid" msgstr "в _стаи" #: gajim/command_system/implementation/standard.py:307 msgid "" "Leave the groupchat, optionally giving a reason, and close tab or window" msgstr "" #: gajim/command_system/implementation/standard.py:312 msgid "" "\n" " Ban user by a nick or a jid from a groupchat\n" "\n" " If given nickname is not found it will be treated as a jid.\n" " " msgstr "" #: gajim/command_system/implementation/standard.py:324 #, fuzzy msgid "Kick user by a nick from a groupchat" msgstr "Поканени сте в стая." #: gajim/command_system/implementation/standard.py:332 msgid "" "Set occupant role in group chat.\n" " Role can be given as one of the following values:\n" " moderator, participant, visitor, none" msgstr "" #: gajim/command_system/implementation/standard.py:337 #, fuzzy msgid "Invalid role given" msgstr "Невалиден сървър" #: gajim/command_system/implementation/standard.py:344 msgid "" "Set occupant affiliation in group chat.\n" " Affiliation can be given as one of the following values:\n" " owner, admin, member, outcast, none" msgstr "" #: gajim/command_system/implementation/standard.py:349 #, fuzzy msgid "Invalid affiliation given" msgstr "рангът е променен" #: gajim/command_system/implementation/standard.py:357 #, fuzzy msgid "Display names of all group chat occupants" msgstr "Употреба: /%s, показва имената на участниците в стаята." #: gajim/command_system/implementation/standard.py:379 msgid "Forbid an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/standard.py:384 msgid "Allow an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/middleware.py:72 msgid "Error during command execution!" msgstr "" #: gajim/command_system/implementation/custom.py:106 msgid "The same as using a doc-string, except it supports translation" msgstr "" #: gajim/plugins/pluginmanager.py:611 gajim/plugins/pluginmanager.py:617 msgid "Archive corrupted" msgstr "" #: gajim/plugins/pluginmanager.py:613 #, fuzzy msgid "Archive empty" msgstr "Файлът не съдържа нищо" #: gajim/plugins/pluginmanager.py:625 gajim/plugins/pluginmanager.py:633 #: gajim/plugins/gui.py:264 #, fuzzy msgid "Archive is malformed" msgstr "Услугата изпрати лошо форматирани данни" #: gajim/plugins/pluginmanager.py:641 gajim/plugins/gui.py:288 #: gajim/plugins/gui.py:296 #, fuzzy msgid "Plugin already exists" msgstr "Този файл вече съществува" #: gajim/plugins/gui.py:84 msgid "Plugin" msgstr "" #: gajim/plugins/gui.py:156 #, fuzzy, python-format msgid "Warning: %s" msgstr "Отлъчване на %s" #: gajim/plugins/gui.py:213 #, fuzzy msgid "Plugin failed" msgstr "Неуспех при свързването" #: gajim/plugins/gui.py:256 msgid "Unable to properly remove the plugin" msgstr "" #: gajim/plugins/gui.py:288 msgid "Overwrite?" msgstr "" #: gajim/plugins/gui.py:320 #, fuzzy msgid "Configuration" msgstr "Настройки на стаята" #: data/org.gajim.Gajim.desktop.in:5 msgid "Jabber IM Client" msgstr "Джабър клиент за бързи съобщения" #: data/org.gajim.Gajim.desktop.in:6 data/org.gajim.Gajim.appdata.xml.in:10 msgid "A GTK+ Jabber client" msgstr "Джабър клиент за GTK+" #: data/org.gajim.Gajim.desktop.in:8 msgid "chat;messaging;im;xmpp;bonjour;voip;" msgstr "" #: data/org.gajim.Gajim.desktop.in:12 msgid "org.gajim.Gajim" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:12 msgid "" "Gajim is a chat client to be used with Jabber.org, Live Journal Talk, " "Nimbuzz, Ovi, Talkonaut, and thousands of other services run by companies " "and ISPs, and volunteers around the world." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:16 msgid "" "If you have a few accounts on different servers, if you want to be in " "contact with your friends and family all the time, then Gajim is for you." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:19 #, fuzzy msgid "Features:" msgstr "Възможности" #: data/org.gajim.Gajim.appdata.xml.in:21 msgid "Tabbed chat window and single window modes" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:22 msgid "" "Group chat support (with Multi-User Chat protocol), invitation, chat to " "group chat transformation" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:23 msgid "Emoticons, avatars, PEP (user activity, mood and tune)" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:24 msgid "Audio / video conferences" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:25 #, fuzzy msgid "File transfer, room bookmarks" msgstr "Грешка при файловия трансфер" #: data/org.gajim.Gajim.appdata.xml.in:26 msgid "Metacontacts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:27 msgid "Trayicon, speller, extended chat history functionalities" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:28 msgid "TLS, GPG and End-To-End encryption support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:29 msgid "Transport registration support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:30 #, fuzzy msgid "Service discovery including nodes, user search" msgstr "Откриване на налични услуги за акаунт „%s“" #: data/org.gajim.Gajim.appdata.xml.in:31 msgid "Wikipedia, dictionary and search engine lookup" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:32 msgid "Multiple accounts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:33 #, fuzzy msgid "XML console interface" msgstr "XML конзола" #: data/org.gajim.Gajim.appdata.xml.in:34 msgid "Link local (bonjour / zeroconf), BOSH" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:35 msgid "Other features via plugins" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:47 #, fuzzy msgid "Roster, list of contacts" msgstr "Запазване на промените на _състоянията на контактите" #: data/org.gajim.Gajim.appdata.xml.in:51 msgid "Tabbed chat window" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:55 #, fuzzy msgid "Group chat support" msgstr "Стаи" #: data/org.gajim.Gajim.appdata.xml.in:59 #, fuzzy msgid "Chat history" msgstr "Скоро посетени:" #: data/org.gajim.Gajim.appdata.xml.in:63 #, fuzzy msgid "Plugin manager" msgstr "Неуспех при свързването" #, fuzzy #~ msgid "" #~ "Install /\n" #~ "Upgrade" #~ msgstr "Блокирал" #, fuzzy #~ msgid "Install/Upgrade" #~ msgstr "Блокирал" #, fuzzy #~ msgid "Install and Upgrade Plugins" #~ msgstr "Блокирал" #, fuzzy #~ msgid "Plugins updates" #~ msgstr "Неуспех при свързването" #~ msgid "" #~ "Your configured emoticons theme has not been found, so emoticons have " #~ "been disabled." #~ msgstr "Темата с емотикони не беше намерена, така че са изключени." #~ msgid "Shows or hides the roster window" #~ msgstr "Показва или скрива списъка" #~ msgid "Shows or hides the ipython window" #~ msgstr "Показва или скрива прозореца на IPython" #, fuzzy #~ msgid "XMPP account %s" #~ msgstr "за акаунт „%s“" #, fuzzy #~ msgid "Exception" #~ msgstr "Описание" #, fuzzy #~ msgid "" #~ "someone@somewhere.com would like you to add some contacts " #~ "in your roster." #~ msgstr "Бих искал(а) да ви добавя към списъка си." #~ msgid "" #~ "Ordered list (space separated) of connection type to try. Can contain " #~ "tls, ssl or plain" #~ msgstr "" #~ "Списък (разделен с шпации) на видове свързвания. Може да съдържа „tls“, " #~ "„ssl“ или „plain“." #~ msgid "_Actions" #~ msgstr "_Действия" #, fuzzy #~ msgid "Requires upower and python-dbus." #~ msgstr "Изисква python-dbus." #, fuzzy #~ msgid "Start Chat..." #~ msgstr "_Започване на разговор…" #~ msgid "You are already in group chat %s" #~ msgstr "Вече сте в стая „%s“" #~ msgid "Join Group Chat with account %s" #~ msgstr "Влизане в стая с акаунт „%s“" #, fuzzy #~ msgid "Invalid Account" #~ msgstr "Невалидно име на акаунт" #, fuzzy #~ msgid "" #~ "You have to choose an account from which you want to join the groupchat." #~ msgstr "Акаунт, от който искате да влезете в стаята" #, fuzzy #~ msgid "Please enter the group chat JID as room@server." #~ msgstr "Jabber ID на стаята съдържа непозволени знаци." #, fuzzy #~ msgid "The group chat JID contains invalid characters." #~ msgstr "Jabber ID на стаята съдържа непозволени знаци." #~ msgid "Start Chat with account %s" #~ msgstr "Започване на разговор с акаунт „%s“" #, fuzzy #~ msgid "" #~ "Fill in the nickname or the JID of the contact you would like\n" #~ "to send a chat message to:" #~ msgstr "" #~ "Въведете JID или псевдоним на контакта, до който\n" #~ "искате да изпратите съобщение:" #, fuzzy #~ msgid "Nickname / JID" #~ msgstr "Дублиран Jabber ID" #~ msgid "Unable to parse \"%s\"." #~ msgstr "Неуспех при анализирането на „%s“." #~ msgid "Shows the chat dialog so that you can send messages to a contact" #~ msgstr "" #~ "Показване на диалогов прозорец за разговор, за да може да се изпрати " #~ "съобщение до контакта" #~ msgid "JID of the contact that you want to chat with" #~ msgstr "JID на контакта, с който искате да разговаряте" #~ msgid "Adds contact to roster" #~ msgstr "Добавяне на контакт към списъка" #~ msgid "jid" #~ msgstr "JID" #~ msgid "Adds new contact to this account" #~ msgstr "Добавяне на нов контакт към този акаунт" #~ msgid "Opens 'Start Chat' dialog" #~ msgstr "Отваря прозореца „Започване на разговор“" #~ msgid "Starts chat, using this account" #~ msgstr "Започване на разговор, като се използва този акаунт" #, fuzzy #~ msgid "Handle a xmpp:/ URI" #~ msgstr "Обработка на адрес тип xmpp://" #~ msgid "URI to handle" #~ msgstr "Адрес за обработка" #~ msgid "Account in which you want to handle it" #~ msgstr "Акаунт, за който искате да го обработите" #, fuzzy #~ msgid "Message content" #~ msgstr "текст на съобщението" #~ msgid "Join a MUC room" #~ msgstr "Влизане в стая" #~ msgid "Room JID" #~ msgstr "JID на стая" #~ msgid "Nickname to use" #~ msgstr "Псевдоним" #~ msgid "Password to enter the room" #~ msgstr "Парола за влизане в стаята" #~ msgid "Account from which you want to enter the room" #~ msgstr "Акаунт, от който искате да влезете в стаята" #, fuzzy #~ msgid "Wrong URI" #~ msgstr "Грешен адрес" #~ msgid "Nickname:" #~ msgstr "Псевдоним:" #~ msgid "Server:" #~ msgstr "Сървър:" #~ msgid "Password:" #~ msgstr "Парола:" #, fuzzy #~ msgid "Join this room _automatically when I connect" #~ msgstr "Влизане в тази стая автоматично при свързване" #, fuzzy #~ msgid "Bro_wse Rooms" #~ msgstr "_Търсене" #, fuzzy #~ msgid "Requires libgtkspell and libenchant." #~ msgstr "Изисква python-sexy." #, fuzzy #~ msgid "Network-Watcher" #~ msgstr "network-manager" #~ msgid "Autodetection of network status." #~ msgstr "Автоматично засичане на състоянието на мрежата." #, fuzzy #~ msgid "Requires gnome-network-manager" #~ msgstr "Изисква gnome-network-manager и python-dbus." #, fuzzy #~ msgid "Send files" #~ msgstr "Изпращане на _файл" #, fuzzy #~ msgid "This contact does not support file transfer." #~ msgstr "Списък с активни, завършили и прекъснати файлови трансфери" #~ msgid "" #~ "You have to install %s dictionary to use spellchecking, or choose another " #~ "language by setting the speller_language option." #~ msgstr "" #~ "За да използвате проверката за правопис, трябва да инсталирате %s речник " #~ "или да изберете друг език чрез настройването на опцията " #~ "„speller_language“." #~ msgid "Hides the buttons in chat windows." #~ msgstr "Скрива бутоните в прозорците за разговор." #~ msgid "Change your nickname (Ctrl+N)" #~ msgstr "Смяна на псевдоним (Ctrl+N)" #~ msgid "Change the room's subject (Alt+T)" #~ msgstr "Смяна на темата на стаята (Alt+T)" #~ msgid "Bookmark this room (Ctrl+B)" #~ msgstr "_Добавяне на стаята към отметките (Ctrl+B)" #~ msgid "Browse the chat history (Ctrl+H)" #~ msgstr "Разглеждане на историята на разговорите (Ctrl+H)" #, fuzzy #~ msgid "Show advanced functions (Alt+D)" #~ msgstr "Меню с функции за напреднали (Ctrl+A)" #~ msgid "Add this contact to roster (Ctrl+D)" #~ msgstr "Добавяне на контакт към списъка (Ctrl+D)" #~ msgid "Invite contacts to the conversation (Ctrl+G)" #~ msgstr "Покана на контакти в разговора (Ctrl+G)" #, fuzzy #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Показване на профила на контакта (Ctrl+I)" #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Показване на профила на контакта (Ctrl+I)" #~ msgid "Ma_ke message windows compact" #~ msgstr "_Компактни прозорци за разговор" #~ msgid "Hide all buttons in chat windows" #~ msgstr "Скриване на всички бутони в прозорците за разговор." #, fuzzy #~ msgid "Hide the chat buttons" #~ msgstr "Употреба: /%s, скрива бутоните за разговор." #~ msgid "" #~ "If True, Gajim will ask for avatar each contact that did not have an " #~ "avatar last time or has one cached that is too old." #~ msgstr "" #~ "Ако е активирана, ще се изпраща запитване за аватар до всеки контакт, " #~ "който е нямал такъв последния път или пък има остарял кеширан аватар." #~ msgid "Disk Write Error" #~ msgstr "Грешка при запис" #~ msgid "Set Custom _Avatar..." #~ msgstr "Задаване на друг _аватар…" #, fuzzy #~ msgid "SSL certificate validation" #~ msgstr "Грешка в сертификата на SSL" #~ msgid "" #~ "A library used to validate server certificates to ensure a secure " #~ "connection." #~ msgstr "" #~ "Библиотека за проверка на валидността на сертификатите на сървърите. " #~ "Използва се за установяване на сигурна връзка." #, fuzzy #~ msgid "Requires python-pyopenssl > 0.12 and pyasn1." #~ msgstr "Изисква python-pyopenssl." #, fuzzy #~ msgid "?CLI:room" #~ msgstr "стая" #, fuzzy #~ msgid "?CLI:nick" #~ msgstr "псевдоним" #, fuzzy #~ msgid "?CLI:password" #~ msgstr "парола" #~ msgid "Use D-Bus and Notification-Daemon to show notifications" #~ msgstr "" #~ "Използване на DBus и Notification-Daemon за показване на уведомленията" #, fuzzy #~ msgid "Notification" #~ msgstr "Уведомления" #~ msgid "Passive popups notifying for new events." #~ msgstr "Изскачащи прозорци с уведомления за нови събития." #~ msgid "" #~ "Requires python-notify or instead python-dbus in conjunction with " #~ "notification-daemon." #~ msgstr "Изисква python-notify или python-dbus заедно с notification-daemon." #, fuzzy #~ msgid "Ignore" #~ msgstr "_Игнориране" #~ msgid "_Open Gmail Inbox" #~ msgstr "_Отваряне на пощенската кутия на Gmail" #~ msgid "Notify on new _GMail email" #~ msgstr "Уведомяване при нова поща от _GMail" #~ msgid "" #~ "If checked, Gajim will show a notification when a new e-mail is received " #~ "via GMail" #~ msgstr "" #~ "Ако тази опция е избрана, Gajim ще показва уведомление при получаването " #~ "на ново писмо чрез GMail." #~ msgid "Display _extra email details" #~ msgstr "Показване на _допълнителни данни за е-поща" #, fuzzy #~ msgid "" #~ "If checked, Gajim will also include information about the sender of new " #~ "emails" #~ msgstr "" #~ "Ако тази опция е избрана, Gajim ще включва информация за подателя на " #~ "новите писма." #~ msgid "GMail Options" #~ msgstr "Настройки за GMail" #, fuzzy #~ msgid "20" #~ msgstr "0" #, fuzzy #~ msgid "Invited %s to %s" #~ msgstr "Изпращане на %s" #~ msgid "GMail Email Received" #~ msgstr "Получена поща от Gmail" #, fuzzy #~ msgid "New e-mail on %(gmail_mail_address)s" #~ msgstr "Ново писмо за %(gmail_mail_address)s" #, fuzzy #~ msgid "You have %d new e-mail conversation" #~ msgid_plural "You have %d new e-mail conversations" #~ msgstr[0] "Имате %d ново писмо" #~ msgstr[1] "Имате %d нови писма" #~ msgid "" #~ "\n" #~ "\n" #~ "From: %(from_address)s\n" #~ "Subject: %(subject)s\n" #~ "%(snippet)s" #~ msgstr "" #~ "\n" #~ "\n" #~ "От: %(from_address)s\n" #~ "Тема: %(subject)s\n" #~ "%(snippet)s" #~ msgid "Re_name" #~ msgstr "Пре_именуване" #~ msgid "Resour_ce:" #~ msgstr "_Ресурс:" #~ msgid "" #~ "Resource is sent to the Jabber server in order to separate the same JID " #~ "in two or more parts depending on the number of the clients connected in " #~ "the same server with the same account. So you might be connected in the " #~ "same account with resource 'Home' and 'Work' at the same time. The " #~ "resource which has the highest priority will get the events. (see below)" #~ msgstr "" #~ "Ресурсът се изпраща до Джабър сървъра, за да „раздели“ един и същи JID на " #~ "две или повече части в зависимост от броя на клиентите, свързани с един " #~ "сървър и един и същ акаунт. Така може да сте свързани със същия акаунт и " #~ "ресурси „Вкъщи“ и „На работа“ по едно и също време. Ресурсът с най-голям " #~ "приоритет ще получава събитията. (вижте по-долу)" #, fuzzy #~ msgid "A_djust to status" #~ msgstr "_Съгласуване спрямо състоянието" #~ msgid "Priority will change automatically according to your status." #~ msgstr "Приоритетът ще се сменя автоматично в зависимост от състоянието ви." #, fuzzy #~ msgid "Anonymous authentication" #~ msgstr "Използване на удостоверяване" #~ msgid "" #~ "Priority is used in Jabber to determine who gets the events from the " #~ "jabber server when two or more clients are connected using the same " #~ "account; The client with the highest priority gets the events" #~ msgstr "" #~ "Приоритетът в Джабър се използва, за да се определи кой да получава " #~ "събитията от Джабър сървър, когато два или повече клиента са свързани с " #~ "един и същ акаунт. Клиентът с най-голям приоритет ще получава събитията." #, fuzzy #~ msgid "Synchronize contacts" #~ msgstr "Синхронизиране на контакти" #~ msgid "Click to request authorization to all contacts of another account" #~ msgstr "" #~ "Натиснете, за да изискате упълномощаване от всички контакти на друг акаунт" #~ msgid "Chan_ge Password" #~ msgstr "Пром_яна на парола" #~ msgid "Click to change account's password" #~ msgstr "Натиснете, за да смените паролата на акаунта" #~ msgid "Administration operations" #~ msgstr "Административни операции" #, fuzzy #~ msgid "Browse..." #~ msgstr "_Търсене" #, fuzzy #~ msgid "Certificate is e_ncrypted" #~ msgstr "Сертификатът е отхвърлен" #~ msgid "" #~ "If checked, Gajim, when launched, will automatically connect to jabber " #~ "using this account" #~ msgstr "" #~ "Ако тази опция е избрана, при стартиране Gajim ще се свързва автоматично, " #~ "използвайки този акаунт." #, fuzzy #~ msgid "Synchronize logs with server" #~ msgstr "Синхронизиране на контакти" #~ msgid "Synch_ronize account status with global status" #~ msgstr "Син_хронизиране на състоянието на акаунта с общото състояние" #~ msgid "" #~ "If checked, any change to the global status (handled by the combobox at " #~ "the bottom of the roster window) will change the status of this account " #~ "accordingly" #~ msgstr "" #~ "Ако тази опция е избрана, всяка промяна на общото състояние (от списъка в " #~ "долната част на главния прозорец) ще променя и състоянието на този акаунт." #~ msgid "" #~ "If checked, Gajim will also broadcast some more IPs except from just your " #~ "IP, so file transfer has higher chances of working." #~ msgstr "" #~ "Ако тази опция е избрана, Gajim ще излъчва повече IP адреси освен вашия " #~ "собствен, така че файловият трансфер има повече шансове да работи добре." #~ msgid "Proxy" #~ msgstr "Сървър-посредник" #~ msgid "" #~ "Check this so Gajim will ask you before sending your password over an " #~ "insecure connection." #~ msgstr "" #~ "Ако тази опция е избрана, ще се изисква потвърждение преди изпращането на " #~ "паролата ви чрез несигурна връзка." #, fuzzy #~ msgid "Send _keep-alive packets" #~ msgstr "Изпращане на пакети за поддържане на връзката" #~ msgid "" #~ "If checked, Gajim will send keep-alive packets to prevent connection " #~ "timeout which results in disconnection" #~ msgstr "" #~ "Ако тази опция е избрана, Gajim ще изпраща пакети за поддържане на " #~ "връзката с цел избягване на разпадането ѝ." #, fuzzy #~ msgid "Use cust_om hostname/port" #~ msgstr "Използване на нестандартен хост/порт" #, fuzzy #~ msgid "_Hostname: " #~ msgstr "_Хост:" #, fuzzy #~ msgid "_Port: " #~ msgstr "По_рт:" #~ msgid "No key selected" #~ msgstr "Няма избран ключ" #~ msgid "Choose _Key..." #~ msgstr "Избор на _ключ…" #~ msgid "" #~ "If checked, Gajim will get the password from a GPG agent like seahorse" #~ msgstr "" #~ "Ако тази опция е избрана, паролата ще се взима от агент на GPG като " #~ "Seahorse." #~ msgid "OpenPGP" #~ msgstr "OpenPGP" #, fuzzy #~ msgid "_Edit Personal Information..." #~ msgstr "Редактиране на личните данни…" #~ msgid "Information about you, as stored in the server" #~ msgstr "Вашите лични данни, както са запазени на сървъра" #~ msgid "Personal Information" #~ msgstr "Лични данни" #, fuzzy #~ msgid "Co_nnect on Gajim startup" #~ msgstr "С_вързване при стартиране" #, fuzzy #~ msgid "Synchroni_ze account status with global status" #~ msgstr "Син_хронизиране на състоянието на акаунта с общото състояние" #, fuzzy #~ msgid "Use cust_om port:" #~ msgstr "Използване на нестандартен порт:" #~ msgid "" #~ "If the default port that is used for incoming messages is unfitting for " #~ "your setup you can select another one here.\n" #~ "You might consider to change possible firewall settings." #~ msgstr "" #~ "Ако стандартния порт за входящи съобщения е неудобен за настройките ви, " #~ "може да изберете друг тук.\n" #~ "Може да помислите и да промените настройките на огнената стена, " #~ "евентуално." #~ msgid "Mer_ge accounts" #~ msgstr "_Смесване на акаунти" #, fuzzy #~ msgid "OpenPGP is not usable on this computer" #~ msgstr "OpenPGP не може да бъде използван на този компютър" #~ msgid "To change the account name, you must be disconnected." #~ msgstr "Трябва да сте изключени, за да смените името на акаунта." #~ msgid "To change the account name, you must read all pending events." #~ msgstr "" #~ "За да смените името на акаунта, трябва да прочетете всички чакащи събития." #~ msgid "Account Name Already Used" #~ msgstr "Името на акаунта вече се използва" #~ msgid "" #~ "This name is already used by another of your accounts. Please choose " #~ "another name." #~ msgstr "Това име вече се използва от друг акаунт. Изберете друго име." #~ msgid "Invalid account name" #~ msgstr "Невалидно име на акаунт" #~ msgid "Account name cannot be empty." #~ msgstr "Трябва да посочите някакво име на акаунта." #~ msgid "Account name cannot contain spaces." #~ msgstr "Името на акаунта не може да съдържа интервали." #~ msgid "Enter a new name for account %s" #~ msgstr "Въведете ново име за акаунт „%s“" #, fuzzy #~ msgid "A JID must be in the form \"user@servername\"." #~ msgstr "Jabber ID трябва да бъде във формат „user@server“." #~ msgid "No such account available" #~ msgstr "Няма такъв наличен акаунт" #~ msgid "" #~ "You must create your account before editing your personal information." #~ msgstr "" #~ "Трябва първо да създадете акаунт и след това да редактирате личните данни." #~ msgid "Without a connection, you can not edit your personal information." #~ msgstr "Трябва да сте свързани, за да редактирате личните данни." #, fuzzy #~ msgid "Your server does not have vCard support" #~ msgstr "Сървърът ви не поддържа визитки" #~ msgid "Your server can't save your personal information." #~ msgstr "Сървърът ви не може да запази личната ви информация." #~ msgid "Account Local already exists." #~ msgstr "Името на акаунта вече се използва." #~ msgid "Please rename or remove it before enabling link-local messaging." #~ msgstr "" #~ "Преименувайте го или го премахнете преди да активирате съобщения от/за " #~ "локални контакти." #~ msgid "THANKS:" #~ msgstr "БЛАГОДАРНОСТИ:" #~ msgid "Could not write to %s. Session Management support will not work" #~ msgstr "" #~ "Неуспех при запис на %s. Поддръжката за управление на сесиите няма да " #~ "работи" #~ msgid "Jabber Traffic" #~ msgstr "Джабър трафик" #, fuzzy #~ msgid "_Enable" #~ msgstr "Активиране" #, fuzzy #~ msgid "Filter" #~ msgstr "Шрифт" #~ msgid "_IQ" #~ msgstr "I_Q" #~ msgid "Info/Query" #~ msgstr "Информация/запитване (Info/Query)" #~ msgid "_Message" #~ msgstr "_Съобщение" #~ msgid "XML Input" #~ msgstr "Вход в XML формат" #~ msgid "XML Console for %s" #~ msgstr "XML конзола за %s" #, fuzzy #~ msgid "Idle for:" #~ msgstr "XML конзола за %s" #~ msgid "Last status: %s" #~ msgstr "Последно състояние: %s" #~ msgid " since %s" #~ msgstr " от %s" #~ msgid "since %s" #~ msgstr "от %s" #, fuzzy #~ msgid "No" #~ msgstr "Няма" #, fuzzy #~ msgid "Prefer" #~ msgstr "Настройки" #, fuzzy #~ msgid "Auto" #~ msgstr "Автоматично влизане" #, fuzzy #~ msgid "otr" #~ msgstr "Сгорещен" #, fuzzy #~ msgid "Invalid expire value" #~ msgstr "Невалидно име на сървър" #, fuzzy #~ msgid "There is an error" #~ msgstr "Услугата върна грешка." #~ msgid "How many minutes should last lines from previous conversation last." #~ msgstr "Колко минути да отделят последните редове от предишния разговор." #~ msgid "" #~ "Your configured emoticons theme cannot been loaded. You maybe need to " #~ "update the format of emoticons.py file. See http://trac.gajim.org/wiki/" #~ "Emoticons for more details." #~ msgstr "" #~ "Темата с емотикони не можа да бъде заредена. Навярно трябва да обновите " #~ "формата на файла emoticons.py. Вижте http://trac.gajim.org/wiki/Emoticons " #~ "за повече подробности." #~ msgid "You will be connected to %s without OpenPGP." #~ msgstr "Ще бъдете свързани към „%s“ без OpenPGP." #~ msgid "The following message was NOT encrypted" #~ msgstr "Следното съобщение НЕ БЕШЕ шифрирано" #, fuzzy #~ msgid "Encryption used for this contact." #~ msgstr "Активира шифриране тип „ESessions“ за този акаунт." #~ msgid "Toggle Open_PGP Encryption" #~ msgstr "Превключване на шифриране тип „Open_PGP“" #~ msgid "Toggle End to End Encryption" #~ msgstr "Превключване на шифриране тип „End to End“" #, fuzzy #~ msgid "OpenPGP encryption enabled" #~ msgstr "Шифрирането чрез GPG е включено" #, fuzzy #~ msgid "No OpenPGP key assigned" #~ msgstr "Няма зададен ключ на GPG" #, fuzzy #~ msgid "" #~ "No OpenPGP key is assigned to this contact. So you cannot encrypt " #~ "messages with OpenPGP." #~ msgstr "" #~ "Няма зададен ключ на GPG за този контакт, така че не може да шифрирате " #~ "съобщенията с GPG." #, fuzzy #~ msgid "OpenPGP encryption disabled" #~ msgstr "Шифрирането чрез GPG е изключено" #~ msgid "Session WILL be logged" #~ msgstr "ЩЕ СЕ запазва дневник за сесията" #~ msgid "Session WILL NOT be logged" #~ msgstr "НЯМА да се запазва дневник за сесията" #~ msgid "is" #~ msgstr "е" #~ msgid "is NOT" #~ msgstr "НЕ е" #~ msgid "will" #~ msgstr "Ще" #~ msgid "will NOT" #~ msgstr "НЯМА да" #~ msgid "The following message was encrypted" #~ msgstr "Следното съобщение беше шифрирано" #, fuzzy #~ msgid "Toggle the OpenPGP encryption" #~ msgstr "Превключване на шифриране тип „Open_PGP“" #~ msgid "Is OpenPGP enabled for this contact?" #~ msgstr "Активиран ли е OpenPGP за този контакт?" #~ msgid "" #~ "Should Gajim automatically start an encrypted session with this contact " #~ "when possible?" #~ msgstr "Да се започва ли шифрирана сесия с този контакт, когато е възможно?" #~ msgid "Neither the remote presence is signed, nor a key was assigned." #~ msgstr "Нито отдалеченото присъствие е подписано, нито има зададен ключ." #~ msgid "The contact's key (%s) does not match the key assigned in Gajim." #~ msgstr "Ключът на контакта (%s) не съвпада със зададения в Gajim." #~ msgid "[This message is *encrypted* (See :XEP:`27`]" #~ msgstr "[Това съобщение е *шифрирано* (вижте XEP:„27“)]" #~ msgid "" #~ "Your chat session with %(jid)s is encrypted.\n" #~ "\n" #~ "This session's Short Authentication String is %(sas)s." #~ msgstr "" #~ "Сесията ви с %(jid)s е шифрирана.\n" #~ "\n" #~ "Краткият удостоверителен низ (SAS) на сесията е %(sas)s." #~ msgid "You have already verified this contact's identity." #~ msgstr "Вече се проверили идентичността на този контакт." #~ msgid "Contact's identity verified" #~ msgstr "Идентичността на контакта проверена" #, fuzzy #~ msgid "Verify again…" #~ msgstr "Проверка наново…" #~ msgid "" #~ "To be certain that only the expected person can read your messages " #~ "or send you messages, you need to verify their identity by clicking the " #~ "button below." #~ msgstr "" #~ "За да се сигурни, че само очакваният човек може да чете ваши " #~ "съобщения или да ви изпраща такива, е необходимо да проверите " #~ "идентичността му като натиснете бутона по-долу." #~ msgid "Contact's identity NOT verified" #~ msgstr "Идентичността на контакта НЕ Е проверена" #, fuzzy #~ msgid "Verify…" #~ msgstr "_Проверка" #~ msgid "Have you verified the contact's identity?" #~ msgstr "Проверихте ли идентичността на контакта?" #~ msgid "" #~ "To prevent talking to an unknown person, you should speak to %(jid)s directly (in person or on the phone) and verify that they see the same " #~ "Short Authentication String (SAS) as you.\n" #~ "\n" #~ "This session's Short Authentication String is %(sas)s." #~ msgstr "" #~ "За да избегнете разговор с непознат човек, трябва да говорите с " #~ "%(jid)s директно (лично или по телефона) и да проверите дали вижда " #~ "същия Кратък удостоверителен низ (SAS) като вас.\n" #~ "\n" #~ "Краткият удостоверителен низ на тази сесия е %(sas)s." #~ msgid "Did you talk to the remote contact and verify the SAS?" #~ msgstr "Говорихте ли с отдалечение контакт за проверка на SAS?" #~ msgid "" #~ "The contact's key (%s) does not match the key assigned in Gajim." #~ msgstr "Ключът на контакта (%s) не съвпада с този, зададен в Gajim." #, fuzzy #~ msgid "" #~ "No OpenPGP key is assigned to this contact. So you cannot encrypt " #~ "messages." #~ msgstr "" #~ "Няма зададен ключ на GPG за този контакт, така че не може да шифрирате " #~ "съобщения." #, fuzzy #~ msgid "" #~ "OpenPGP key is assigned to this contact, but you do not trust their " #~ "key, so message cannot be encrypted. Use your OpenPGP client " #~ "to trust their key." #~ msgstr "" #~ "Има зададен ключ на GPG за този контакт, но вие не му се доверявате, така че съобщенията не могат да се шифрират. За да се доверите " #~ "на този ключ, използвайте клиент на GPG." #, fuzzy #~ msgid "" #~ "OpenPGP Key is assigned to this contact, and you trust their key, so " #~ "messages will be encrypted." #~ msgstr "" #~ "Има зададен ключ на GPG за този контакт и вие му се доверявате, така че " #~ "съобщенията ще бъдат шифрирани." #~ msgid "" #~ "This icon indicates that this message has not yet\n" #~ "been received by the remote end. If this icon stays\n" #~ "for a long time, it's likely the message got lost." #~ msgstr "" #~ "Тази икона показва, че съобщението все още не е\n" #~ "получено от отсрещния контакт. Ако иконата остане\n" #~ "дълго време, най-вероятно съобщението е било изгубено." #~ msgid "" #~ "If True, listen to D-Bus signals from NetworkManager and change the " #~ "status of accounts (provided they do not have listen_to_network_manager " #~ "set to False and they sync with global status) based upon the status of " #~ "the network connection." #~ msgstr "" #~ "Ако е активирана, слуша за сигнали по DBus от NetworkManager и променя " #~ "състоянието на акаунтите (при положение, че нямат изключена " #~ "„listen_to_network_manager“ и се синхронизират с общото състояние) в " #~ "зависимост от състоянието на мрежовата връзка." #~ msgid "" #~ "The database file (%s) cannot be read. Try to repair it or remove it (all " #~ "history will be lost)." #~ msgstr "" #~ "Файлът „%s“ от базата от данни не може да бъде прочетен. Опитайте се да " #~ "го поправите или изтриете (цялата история ще бъде загубена)." #~ msgid "Database cannot be read." #~ msgstr "Неуспех при четенето на базата от данни." #~ msgid "Smooth scroll message in conversation window" #~ msgstr "Плавно прелистване на съобщение в прозореца за разговор" #~ msgid "Show _XML Console" #~ msgstr "Показване на _XML конзола" #~ msgid "Edit _Privacy Lists..." #~ msgstr "_Филтри за уединение…" #~ msgid "_Administrator" #~ msgstr "_Администратор" #~ msgid "Sends a message to users currently connected to this server" #~ msgstr "" #~ "Изпраща съобщение на всички потребители, свързани със сървъра в момента" #~ msgid "Sets Message of the Day" #~ msgstr "Настройване на съобщение за деня" #~ msgid "Updates Message of the Day" #~ msgstr "Актуализиране на съобщението за деня" #~ msgid "Deletes Message of the Day" #~ msgstr "Изтрива съобщението за деня" #~ msgid "Add _Contact..." #~ msgstr "_Добавяне на контакт…" #~ msgid "_Accounts" #~ msgstr "_Акаунти" #~ msgid "Profile, A_vatar" #~ msgstr "_Профил, аватар" #~ msgid "File _Transfers" #~ msgstr "_Файлови трансфери" #~ msgid "Help online" #~ msgstr "Помощ в Интернет" #~ msgid "Frequently Asked Questions (online)" #~ msgstr "Често задавани въпроси (в Интернет)" #~ msgid "Fea_tures" #~ msgstr "_Възможности" #~ msgid "to %s account" #~ msgstr "към акаунт „%s“" #~ msgid "using %s account" #~ msgstr "за акаунт „%s“" #~ msgid "of account %s" #~ msgstr "за акаунт „%s“" #~ msgid "for account %s" #~ msgstr "за акаунт „%s“" #~ msgid "" #~ "By removing this contact you also remove authorization resulting in him " #~ "or her always seeing you as offline." #~ msgstr "" #~ "Премахвайки този контакт, прекратявате и упълномощаването. Контактът " #~ "винаги ще ви вижда изключен." #~ msgid "Invalid Jabber ID" #~ msgstr "Невалиден Jabber ID" #~ msgid "Verify..." #~ msgstr "Проверка…" #~ msgid "This file is being used by another process." #~ msgstr "Този файл се използва от друг процес." #~ msgid "pgp key" #~ msgstr "ключ на OpenPGP" #~ msgid "" #~ "Sends new single message to a contact in the roster. Both OpenPGP key and " #~ "account are optional. If you want to set only 'account', without 'OpenPGP " #~ "key', just set 'OpenPGP key' to ''." #~ msgstr "" #~ "Изпращане на ново съобщение до контакт от списъка. Опциите „account“ и " #~ "„OpenPGP key“ са по избор. Ако искате да настроите само „account“ без " #~ "“OpenPGP key“, настройте „OpenPGP key“ на „“." #, fuzzy #~ msgid "Please first choose another theme as your current theme." #~ msgstr "Първо изберете друга като текуща тема." #~ msgid "A non-privacy-related room configuration change has occurred" #~ msgstr "" #~ "Възникна промяна в конфигурацията на стаята (не е свързана с настройки за " #~ "уединение)" #~ msgid "Your passphrase is incorrect" #~ msgstr "Паролата е грешна" #, fuzzy #~ msgid "OpenPGP Passphrase Incorrect" #~ msgstr "Паролата е грешна" #, fuzzy #~ msgid "OpenPGP key not trusted" #~ msgstr "GPG не е използваем" #~ msgid "You successfully received %(filename)s from %(name)s." #~ msgstr "Успешно получихте %(filename)s от %(name)s." #, fuzzy #~ msgid "Set logs directory" #~ msgstr "създаване на папка %s" #~ msgid "Chats" #~ msgstr "Разговори" #~ msgid "_Manage Bookmarks..." #~ msgstr "_Управление на отметките…" #~ msgid "Change Status Message..." #~ msgstr "Промяна на съобщението за състояние…" #~ msgid "_Change Status Message..." #~ msgstr "_Промяна на съобщението за състояние…" #~ msgid "" #~ "You are not interested in the contact's presence, and neither he/she is " #~ "interested in yours" #~ msgstr "" #~ "Вие не се интересувате от информацията за състоянието на контакта, както " #~ "и той от вашата" #~ msgid "Error description..." #~ msgstr "Описание на грешката…" #, fuzzy #~ msgid "View contact information (Ctrl+I)" #~ msgstr "Покана на контакти в разговора (Ctrl+G)" #, fuzzy #~ msgid "Groupchat Histories" #~ msgstr "Стаи" #, fuzzy #~ msgid "All Chat Histories" #~ msgstr "Всички състояния" #~ msgid "More" #~ msgstr "Още" #~ msgid "creating %s directory" #~ msgstr "създаване на папка %s" #, fuzzy #~ msgid "" #~ "If True, Gajim will use KDE Wallet (if kwalletcli is available) to store " #~ "account passwords." #~ msgstr "" #~ "Ако е активирана, Gajim ще използва набора на ключове на GNOME (gnome-" #~ "keyring), ако е достъпен, за да запазва информация за паролите на " #~ "акаунтите." #, fuzzy #~ msgid "Please check if avahi/bonjour-daemon is running." #~ msgstr "Проверете дали е стартиран avahi-daemon." #~ msgid "%s is not the name of a group chat." #~ msgstr "%s не е име на стая." #~ msgid "Session Management" #~ msgstr "Управление на сесии" #~ msgid "Gajim session is stored on logout and restored on login." #~ msgstr "Запазва сесията на Gajim при излизане и я възстановява при влизане." #~ msgid "Requires python-gnome2." #~ msgstr "Изисква python-gnome2." #, fuzzy #~ msgid "Requires gnome-keyring and python-gnome2-desktop, or kwalletcli." #~ msgstr "Изисква gnome-keyring и python-gnome2-desktop." #~ msgid "SRV" #~ msgstr "SRV" #~ msgid "Ability to connect to servers which are using SRV records." #~ msgstr "Възможност за свързване към сървъри, които използват записи SRV." #~ msgid "Requires dnsutils." #~ msgstr "Изисква dnsutils." #~ msgid "Gajim needs X server to run. Quiting..." #~ msgstr "Необходим е X сървър. Спиране на програмата…" #, fuzzy #~ msgid "Gajim needs PyGTK 2.22 or above" #~ msgstr "Gajim изисква PyGTK 2.8 или по-нова версия" #, fuzzy #~ msgid "Gajim needs PyGTK 2.22 or above to run. Quiting..." #~ msgstr "Gajim изисква PyGTK 2.8 или по-нова версия. Спиране на програмата…" #, fuzzy #~ msgid "Gajim needs GTK 2.22 or above" #~ msgstr "Gajim изисква GTK 2.8 или по-нова версия" #, fuzzy #~ msgid "Gajim needs GTK 2.22 or above to run. Quiting..." #~ msgstr "Gajim изисква GTK 2.8 или по-нова версия. Спиране на програмата…" #~ msgid "Gajim needs pywin32 to run" #~ msgstr "Gajim изисква pywin32" #~ msgid "" #~ "Please make sure that Pywin32 is installed on your system. You can get it " #~ "at %s" #~ msgstr "" #~ "Уверете се, че Pywin32 е инсталиран на системата. Може да го изтеглите от " #~ "%s" #~ msgid "Gajim is already running" #~ msgstr "Gajim вече е стартиран" #~ msgid "" #~ "Another instance of Gajim seems to be running\n" #~ "Run anyway?" #~ msgstr "" #~ "Изглежда вече е стартирана друга инстанция на Gajim\n" #~ "Продължаване въпреки това?" #~ msgid "A programming error has been detected" #~ msgstr "Беше открита програмна грешка" #~ msgid "Details" #~ msgstr "Подробности" #, fuzzy #~ msgid "" #~ "Gnome Keyring is installed but not correctly started (environment " #~ "variable probably not correctly set)" #~ msgstr "" #~ "Наборът с ключове на GNOME е инсталиран, но не е стартиран правилно " #~ "(навярно променливата на обкръжението не е настроена)" #~ msgid "Jabber ID: " #~ msgstr "Jabber ID: " #~ msgid "Resource: " #~ msgstr "Ресурс: " #, fuzzy #~ msgid "Mood: " #~ msgstr "Настроение:" #, fuzzy #~ msgid "Activity: " #~ msgstr "Дейност:" #, fuzzy #~ msgid "Gajim Remote" #~ msgstr "gajim-remote" #~ msgid "Join _Group Chat..." #~ msgstr "_Влизане в стая…" #~ msgid "_Modify Account" #~ msgstr "_Промяна на акаунт" #~ msgid "Check on startup if Gajim is the _default Jabber client" #~ msgstr "" #~ "_Да се проверява дали Gajim е стандартния Джабър клиент при стартиране" #~ msgid "_Group Chat" #~ msgstr "С_тая" #~ msgid "" #~ "If True, Gajim will check if it's the default jabber client on each " #~ "startup." #~ msgstr "" #~ "Ако е активирана, Gajim ще проверява дали е стандартния Джабър клиент при " #~ "всяко стартиране." #~ msgid "Gajim is not the default Jabber client" #~ msgstr "Gajim не е стандартния Джабър клиент" #~ msgid "Would you like to make Gajim the default Jabber client?" #~ msgstr "Искате ли Gajim да бъде стандартния Джабър клиент?" #~ msgid "Always check to see if Gajim is the default Jabber client on startup" #~ msgstr "" #~ "Винаги да се проверява дали Gajim е стандартния Джабър клиент при всяко " #~ "стартиране" #~ msgid "Send Single Message" #~ msgstr "Изпращане на еднократно съобщение" #~ msgid "Execute Command..." #~ msgstr "Изпълнение на команда…" #~ msgid " a window/tab opened with that contact " #~ msgstr " отворен прозорец/подпрозорец с този контакт " #~ msgid "Actions" #~ msgstr "Действия" #~ msgid "Conditions" #~ msgstr "Условия" #~ msgid "Advanced Actions" #~ msgstr "Действия за напреднали" #~ msgid "Advanced Notifications Control" #~ msgstr "Контрол на уведомления за напреднали" #~ msgid "Busy " #~ msgstr "Зает " #, fuzzy #~ msgid "Contact Change Status " #~ msgstr "Контактът промени състоянието си" #, fuzzy #~ msgid "Contact Disconnected " #~ msgstr "Изключване на контакт" #~ msgid "Don't have " #~ msgstr "нямам " #, fuzzy #~ msgid "File Transfer Started " #~ msgstr "Файловият трансфер е преустановен" #, fuzzy #~ msgid "Group Chat Message Highlight " #~ msgstr "Осветено съобщение в стая" #, fuzzy #~ msgid "Group Chat Message Received " #~ msgstr "Получено съобщение в стая" #~ msgid "Launch a command" #~ msgstr "Изпълнение на команда" #~ msgid "One or more special statuses..." #~ msgstr "Едно или повече определени състояния…" #~ msgid "Online / Free For Chat" #~ msgstr "На линия / Свободен за разговор" #~ msgid "Play a sound" #~ msgstr "Изпълнение на звук" #~ msgid "When " #~ msgstr "Когато " #~ msgid "" #~ "_Activate window manager's UrgencyHint to make chat window in taskbar " #~ "flash" #~ msgstr "" #~ "_Активиране на подсказката за спешност на мениджъра на прозорци, за да " #~ "мига прозореца в панела" #~ msgid "_Disable auto opening chat window" #~ msgstr "_Изключване на автоматичното появяване на прозорец за разговор" #~ msgid "_Disable existing popup window" #~ msgstr "_Изключване на съществуващ изскачащ прозорец" #~ msgid "_Disable existing sound for this event" #~ msgstr "_Изключване на съществуващ звук за това събитие" #, fuzzy #~ msgid "_Disable showing event in notification area" #~ msgstr "_Изключване на показване на събитието в списъка" #~ msgid "_Disable showing event in roster" #~ msgstr "_Изключване на показване на събитието в списъка" #~ msgid "_Inform me with a popup window" #~ msgstr "_Информиране с изскачащ прозорец" #~ msgid "_Open chat window with user" #~ msgstr "_Отваряне на прозорец за разговор с потребителя" #~ msgid "_Show event in roster" #~ msgstr "Показване на събитието в спис_ъка" #~ msgid "and I " #~ msgstr "и аз " #, fuzzy #~ msgid "contact(s)" #~ msgstr "Контакти" #~ msgid "for " #~ msgstr "за " #, fuzzy #~ msgid "group(s)" #~ msgstr "Група" #~ msgid "when I'm in" #~ msgstr "когато съм" #~ msgid "_Allow him/her to see my status" #~ msgstr "_Позволение за виждане на състоянието ми" #, fuzzy #~ msgid "Descrition:" #~ msgstr "Описание: " #~ msgid "Advanced..." #~ msgstr "Напреднали…" #~ msgid "Display _activity of contacts in roster" #~ msgstr "Показване на _дейност на контактите в списъка" #~ msgid "Display _tunes of contacts in roster" #~ msgstr "Показване на _слушаната от контактите музика в списъка" #~ msgid "Display m_ood of contacts in roster" #~ msgstr "Показване на _настроенията на контактите в списъка" #~ msgid "" #~ "If checked, Gajim will display the activity of contacts in the roster " #~ "window" #~ msgstr "" #~ "Ако тази опция е избрана, Gajim ще изобразява дейността на контактите в " #~ "списъка." #, fuzzy #~ msgid "" #~ "If checked, Gajim will display the location of contacts in the roster " #~ "window" #~ msgstr "" #~ "Ако тази опция е избрана, Gajim ще изобразява настроението на контактите " #~ "в списъка." #~ msgid "" #~ "If checked, Gajim will display the tunes of contacts in the roster window" #~ msgstr "" #~ "Ако тази опция е избрана, Gajim ще изобразява слушаната от контактите " #~ "музика в списъка." #~ msgid "User avatar:" #~ msgstr "Аватар:" #~ msgid "Gajim Instant Messenger" #~ msgstr "Моментни съобщения (Gajim)" #~ msgid "English" #~ msgstr "английски" #~ msgid "Belarusian" #~ msgstr "белоруски" #~ msgid "Bulgarian" #~ msgstr "български" #~ msgid "Breton" #~ msgstr "бретонски" #~ msgid "Czech" #~ msgstr "чешки" #~ msgid "German" #~ msgstr "немски" #~ msgid "Greek" #~ msgstr "гръцки" #~ msgid "British" #~ msgstr "британски английски" #~ msgid "Esperanto" #~ msgstr "есперанто" #~ msgid "Spanish" #~ msgstr "испански" #~ msgid "Basque" #~ msgstr "баски" #~ msgid "French" #~ msgstr "френски" #~ msgid "Croatian" #~ msgstr "хърватски" #~ msgid "Italian" #~ msgstr "италиански" #~ msgid "Norwegian (b)" #~ msgstr "норвежки (Bokmål)" #~ msgid "Dutch" #~ msgstr "холандски" #~ msgid "Norwegian" #~ msgstr "норвежки (Nynorsk)" #~ msgid "Polish" #~ msgstr "полски" #~ msgid "Portuguese" #~ msgstr "португалски" #~ msgid "Brazilian Portuguese" #~ msgstr "бразилски португалски" #~ msgid "Russian" #~ msgstr "руски" #~ msgid "Serbian" #~ msgstr "сръбски" #~ msgid "Slovak" #~ msgstr "словашки" #~ msgid "Swedish" #~ msgstr "шведски" #~ msgid "Chinese (Ch)" #~ msgstr "китайски" #~ msgid "Spelling language" #~ msgstr "Език за проверка на правописа" #~ msgid "" #~ "If True, Gajim will convert string between $$ and $$ to an image using " #~ "dvips and convert before insterting it in chat window." #~ msgstr "" #~ "Ако е активирана, Gajim ще преобразува чрез „dvips“ низа между $$ и $$ в " #~ "изображение преди да го вмъкне в прозореца за разговор." #~ msgid "" #~ "Change the value to change the size of latex formulas displayed. The " #~ "higher is larger." #~ msgstr "" #~ "Променете стойността за увеличаване или намаляване размера на " #~ "изобразените формули на LaTeX. По-голяма стойност означава по-голям " #~ "размер." #~ msgid "all or space separated status" #~ msgstr "„all“ или състояния, разделени с интервал" #~ msgid "'yes', 'no', or 'both'" #~ msgstr "„yes“, „no“ или „both“" #~ msgid "'yes', 'no' or ''" #~ msgstr "„yes“, „no“ или „“" #~ msgid "Check your connection or try again later" #~ msgstr "Проверете връзката или опитайте отново по-късно" #~ msgid "Error executing \"%(command)s\": %(error)s" #~ msgstr "Грешка при изпълнение на „%(command)s“: %(error)s" #~ msgid "error: cannot open %s for reading" #~ msgstr "грешка: %s не може да бъде отворен за четене" #~ msgid "Unable to bind to port %s." #~ msgstr "Неуспех при свързването с порт %s." #~ msgid "" #~ "Maybe you have another running instance of Gajim. File Transfer will be " #~ "cancelled." #~ msgstr "" #~ "Навярно имате стартирана друга инстанция на Gajim. Файловият трансфер ще " #~ "бъде отменен." #~ msgid "A GTK+ jabber client" #~ msgstr "Джабър клиент за GTK+" #~ msgid "Condition" #~ msgstr "Условие" #~ msgid "when I am " #~ msgstr "когато съм " #~ msgid "Requires gpg and python-GnuPGInterface." #~ msgstr "Изисква gpg и python-GnuPGInterface." #~ msgid "LaTeX" #~ msgstr "LaTeX" #~ msgid "Transform LaTeX expressions between $$ $$." #~ msgstr "Трансформира изрази на LaTex, разграничени с $$ $$." #, fuzzy #~ msgid "" #~ "Requires texlive-latex-base and (dvipng or ImageMagick). You have to set " #~ "'use_latex' to True in the Advanced Configuration Editor." #~ msgstr "" #~ "Изисква texlive-latex-base и dvipng. Трябва да активирате опцията " #~ "„use_latex“ в редактора на настройки за напреднали." #, fuzzy #~ msgid "" #~ "Requires texlive-latex-base and (dvipng or ImageMagick) (All is in " #~ "MikTeX). You have to set 'use_latex' to True in the Advanced " #~ "Configuration Editor." #~ msgstr "" #~ "Изисква texlive-latex-base и dvipng. Трябва да активирате опцията " #~ "„use_latex“ в редактора на настройки за напреднали." #, fuzzy #~ msgid "Requires python-farsight." #~ msgstr "Изисква python-avahi." #, fuzzy #~ msgid "one of: offline, online, chat, away, xa, dnd, invisible " #~ msgstr "" #~ "едно от: offline (изключен), online (на линия), chat (свободен за " #~ "разговор), away (отсъствам), xa (не съм на разположение), dnd (зает), " #~ "invisible (невидим)" #, fuzzy #~ msgid "" #~ "Returns current status message(the global one unless account is specified)" #~ msgstr "" #~ "Връща текущото съобщение за състояние (общото, в случай, че не е указан " #~ "акаунт)" #, fuzzy #~ msgid "" #~ "Too many arguments. \n" #~ "Type \"%s help %s\" for more info" #~ msgstr "" #~ "Твърде много аргументи. \n" #~ "Напишете „%(basename)s help %(command)s“ за повече информация" #, fuzzy #~ msgid "" #~ "Argument \"%s\" is not specified. \n" #~ "Type \"%s help %s\" for more info" #~ msgstr "" #~ "Не е указан аргумент „%(arg)s“.\n" #~ "Напишете „%(basename)s help %(command)s“ за повече информация" #~ msgid "Disk WriteError" #~ msgstr "Грешка при запис на диска" #~ msgid "Subject: %s" #~ msgstr "Тема: %s" #, fuzzy #~ msgid "Mood: %s" #~ msgstr "Настроение:" #, fuzzy #~ msgid "Activity: %s" #~ msgstr "Дейност:" #~ msgid "_Disable showing event in systray" #~ msgstr "_Изключване на показване на събитието в областта за уведомяване" #~ msgid "_Show event in systray" #~ msgstr "Показване на събитието в областта за _уведомяване" #, fuzzy #~ msgid "Autodetect on every Gajim startup" #~ msgstr "С_вързване при стартиране" #, fuzzy #~ msgid "Show systray:" #~ msgstr "Показване на събитието в областта за _уведомяване" #~ msgid "Nickname not allowed: %s" #~ msgstr "Псевдонимът не е позволен: %s" #~ msgid "we are now subscribed to %s" #~ msgstr "вече сме записани за %s" #~ msgid "we are now unsubscribed from %s" #~ msgstr "вече сме отписани от %s" #~ msgid "Account Modification" #~ msgstr "Промяна на акаунт" #~ msgid "" #~ "Check this so Gajim will connect in port 5223 where legacy servers are " #~ "expected to have SSL capabilities. Note that Gajim uses TLS encryption by " #~ "default if broadcasted by the server, and with this option enabled TLS " #~ "will be disabled" #~ msgstr "" #~ "Изберете тази опция, за да може Gajim да се свързва по порт 5223, където " #~ "се очаква сървърите да предоставят възможности по SSL. Забележете, че " #~ "Gajim използва шифриране тип TLS по подразбиране и избирайки тази опция, " #~ "изключвате TLS." #~ msgid "Edit Personal Information..." #~ msgstr "Редактиране на личните данни…" #~ msgid "Hostname: " #~ msgstr "Хост: " #~ msgid "" #~ "If checked, Gajim will store the password in ~/.gajim/config with 'read' " #~ "permission only for you" #~ msgstr "" #~ "Ако тази опция е избрана, паролата ще се запази в ~/.gajim/config с права " #~ "за четене само за потребителя." #~ msgid "Port: " #~ msgstr "Порт: " #~ msgid "Save _passphrase (insecure)" #~ msgstr "Запазване на _паролата (рисковано за сигурността)" #~ msgid "Use _SSL (legacy)" #~ msgstr "Използване на _SSL (извън употреба)" #~ msgid "gtk-add" #~ msgstr "gtk-add" #~ msgid "gtk-close" #~ msgstr "gtk-close" #~ msgid "gtk-remove" #~ msgstr "gtk-remove" #~ msgid "" #~ "Receive a Message\n" #~ "Contact Disconnected \n" #~ "Contact Change Status \n" #~ "Group Chat Message Highlight \n" #~ "Group Chat Message Received \n" #~ "File Transfer Request \n" #~ "File Transfer Started \n" #~ "File Transfer Finished" #~ msgstr "" #~ "се получава съобщение\n" #~ "контактът се изключва \n" #~ "контактът сменя състоянието си \n" #~ "се осветява съобщение в стая \n" #~ "се получава съобщение в стая \n" #~ "се получава запитване за файлов трансфер \n" #~ "започва файлов трансфер \n" #~ "завършва файлов трансфер" #~ msgid "" #~ "contact(s)\n" #~ "group(s)\n" #~ "everybody" #~ msgstr "" #~ "контакт(и)\n" #~ "група/и\n" #~ "всички" #~ msgid "" #~ "Account row\n" #~ "Group row\n" #~ "Contact row\n" #~ "Chat Banner" #~ msgstr "" #~ "Ред за акаунт\n" #~ "Ред за група\n" #~ "Ред за контакт\n" #~ "Лента за разговор" #~ msgid "" #~ "Enter JID or Contact name\n" #~ "Groupchat Histories\n" #~ "All Chat Histories" #~ msgstr "" #~ "Въведете JID или име на контакт\n" #~ "История на разговори в стаи\n" #~ "История на всички разговори" #~ msgid "gtk-delete" #~ msgstr "gtk-delete" #~ msgid "Send a file (Ctrl+F)" #~ msgstr "Изпращане на файл (Ctrl+F)" #~ msgid "" #~ "All chat states\n" #~ "Composing only\n" #~ "Disabled" #~ msgstr "" #~ "Всички състояния\n" #~ "Само при писане\n" #~ "Изключено" #~ msgid "" #~ "Autodetect on every Gajim startup\n" #~ "Always use GNOME default applications\n" #~ "Always use KDE default applications\n" #~ "Always use Xfce default applications\n" #~ "Custom" #~ msgstr "" #~ "Автоматично определяне при всяко стартиране на Gajim\n" #~ "Винаги да се използват стандартните програми на GNOME\n" #~ "Винаги да се използват стандартните програми на KDE\n" #~ "Винаги да се използват стандартните програми на Xfce\n" #~ "Персонални" #~ msgid "" #~ "Detached roster with detached chats\n" #~ "Detached roster with single chat\n" #~ "Single window for everything\n" #~ "Detached roster with chat grouped by account\n" #~ "Detached roster with chat grouped by type" #~ msgstr "" #~ "Отделен списък и прозорци за разговори\n" #~ "Отделен списък и един прозорец за разговори\n" #~ "Един прозорец за всичко\n" #~ "Отделен списък и разговори, групирани по акаунт\n" #~ "Отделен списък и разговори, групирани по вид" #~ msgid "" #~ "Pop it up\n" #~ "Notify me about it\n" #~ "Show only in roster" #~ msgstr "" #~ "Показване в изскачащ прозорец\n" #~ "Уведомяване\n" #~ "Показване само в списъка" #~ msgid "" #~ "none\n" #~ "both\n" #~ "from\n" #~ "to" #~ msgstr "" #~ "без\n" #~ "двустранно\n" #~ "от\n" #~ "за" #, fuzzy #~ msgid "gtk-cancel" #~ msgstr "gtk-close" #~ msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." #~ msgstr "" #~ "Липсва зависимостта pysqlite2 (също познато и като python-pysqlite2). " #~ "Спиране на програмата…" #~ msgid "Ability to have clickable URLs in chat and groupchat window banners." #~ msgstr "" #~ "Възможност за натискане с мишката върху адреси в заглавните части на " #~ "прозорците." #~ msgid "Requires python-sexy." #~ msgstr "Изисква python-sexy." #~ msgid "GTK+ runtime is missing libglade support" #~ msgstr "Липсва поддръжка на libglade за библиотеката GTK+" #~ msgid "" #~ "Please remove your current GTK+ runtime and install the latest stable " #~ "version from %s" #~ msgstr "" #~ "Премахнете текущата версия на библиотеката GTK+ и инсталирайте последната " #~ "стабилна от %s" #~ msgid "" #~ "Please make sure that GTK+ and PyGTK have libglade support in your system." #~ msgstr "" #~ "Уверете се, че версиите на GTK+ и PyGTK на системата ви имат поддръжка за " #~ "libglade." #~ msgid "Gajim needs PySQLite2 to run" #~ msgstr "Gajim изисква PySQLite2" #~ msgid "_Incoming message:" #~ msgstr "В_ходящо съобщение:" #~ msgid "_Outgoing message:" #~ msgstr "_Изходящо съобщение:" #, fuzzy #~ msgid "gtk-ok" #~ msgstr "gtk-close" #~ msgid "" #~ "The host %s you configured as the ft_add_hosts_to_send advanced option is " #~ "not valid, so ignored." #~ msgstr "" #~ "Хостът „%s“, който сте конфигурирали в опцията „ft_add_hosts_to_send“, не " #~ "е валиден, така че се пренебрегва." #~ msgid "OpenPGP passphrase was not given" #~ msgstr "Не беше зададена парола за OpenPGP" #~ msgid "" #~ "To continue sending and receiving messages, you will need to reconnect." #~ msgstr "" #~ "За да продължите да изпращате и получавате съобщения, трябва да се " #~ "свържете наново." #~ msgid "" #~ "You are not connected or not visible to others. Your message could not be " #~ "sent." #~ msgstr "" #~ "Не сте свързани и не сте видими за другите. Съобщението ви не можа да " #~ "бъде изпратено." #~ msgid "[This message is encrypted]" #~ msgstr "[Това съобщение е шифрирано]" #~ msgid "%i days ago" #~ msgstr "Преди %i дни" #~ msgid "Trayicon" #~ msgstr "Икона в областта за уведомяване" #~ msgid "A icon in systemtray reflecting the current presence." #~ msgstr "Икона в областта за уведомяване, отразяваща текущото състояние." #~ msgid "" #~ "Requires python-gnome2-extras or compiled trayicon module from Gajim " #~ "sources." #~ msgstr "" #~ "Изисква python-gnome2-extras или компилиран модул „trayicon“ от изходния " #~ "код на Gajim." #~ msgid "Add Special _Notification" #~ msgstr "Добавяне на специално _уведомление" #~ msgid "Assign Open_PGP Key" #~ msgstr "Задаване на ключ на Open_PGP" #~ msgid "Commands: %s" #~ msgstr "Команди: %s" #~ msgid "" #~ "Usage: /%(command)s , sends action to the current group chat. Use " #~ "third person. (e.g. /%(command)s explodes.)" #~ msgstr "" #~ "Употреба: /%(command)s <действие>, изпраща действие до текущата стая. " #~ "Използва се трето лице (напр. „/%(command)s експлодира“)." #~ msgid "No help info for /%s" #~ msgstr "Няма помощна информация за /%s" #~ msgid "Enable link-local/zeroconf messaging" #~ msgstr "" #~ "Активиране на съобщения от/за локални потребители (link-local/zeroconf)" #~ msgid "Nickname not found: %s" #~ msgstr "Псевдонимът не е намерен: %s" #~ msgid "This group chat has no subject" #~ msgstr "Тази стая няма тема" #, fuzzy #~ msgid "" #~ "Usage: /%s [reason], bans the JID from the group chat. The " #~ "nickname of an occupant may be substituted, but not if it contains \"@\". " #~ "If the JID is currently in the group chat, he/she/it will also be kicked." #~ msgstr "" #~ "Употреба: /%s <псевдоним|JID> [причина], отлъчва контакта от стаята. " #~ "Псевдонимът може да се замества, но не и ако съдържа „@“. Ако контактът е " #~ "в стаята, той също ще бъде изритан. Не се поддържат интервали в " #~ "псевдонима." #~ msgid "" #~ "Usage: /%s [reason], closes the current window or tab, displaying reason " #~ "if specified." #~ msgstr "" #~ "Употреба: /%s [причина], затваря текущия прозорец или подпрозорец и " #~ "показва причина, ако е указана." #~ msgid "" #~ "Usage: /%s [reason], invites JID to the current group chat, " #~ "optionally providing a reason." #~ msgstr "" #~ "Употреба: /%s [причина], кани JID в текущата стая, причината е по " #~ "избор." #~ msgid "" #~ "Usage: /%s @[/nickname], offers to join room@server " #~ "optionally using specified nickname." #~ msgstr "" #~ "Употреба: /%s <стая>@<сървър>[/псевдоним], предлага влизане в " #~ "стая@сървър, използването на указания псевдоним е по избор." #, fuzzy #~ msgid "" #~ "Usage: /%s [reason], removes the occupant specified by " #~ "nickname from the group chat and optionally displays a reason." #~ msgstr "" #~ "Употреба: /%s <псевдоним> [причина], премахва указания с псевдоним " #~ "участник от стаята и евентуално показва причина. Не се поддържат " #~ "интервали в псевдонима." #~ msgid "" #~ "Usage: /%s [message], opens a private message window and sends " #~ "message to the occupant specified by nickname." #~ msgstr "" #~ "Употреба: /%s <псевдоним> [съобщение], отваря прозорец за лично съобщение " #~ "и изпраща съобщение до участника, указан с псевдонима." #~ msgid "Usage: /%s , changes your nickname in current group chat." #~ msgstr "Употреба: /%s <псевдоним>, сменя псевдонима ви в текущата стая." #~ msgid "" #~ "Usage: /%s [topic], displays or updates the current group chat topic." #~ msgstr "" #~ "Употреба: /%s [тема], показва или актуализира текущата тема на стаята." #~ msgid "" #~ "Usage: /%s , sends a message without looking for other commands." #~ msgstr "" #~ "Употреба: /%s <съобщение>, изпраща съобщение без да се имат предвид други " #~ "команди." #, fuzzy #~ msgid "" #~ "Usage: /%s , allow to send you messages and private " #~ "messages." #~ msgstr "Употреба: /%s <псевдоним>, сменя псевдонима ви в текущата стая." #~ msgid "Click to see features (like MSN, ICQ transports) of jabber servers" #~ msgstr "" #~ "Натиснете, за да видите функционалностите (като MSN, ICQ транспорти) на " #~ "Джабър сървърите" #~ msgid "Name:" #~ msgstr "Име:" #~ msgid "_Host:" #~ msgstr "_Хост:" #, fuzzy #~ msgid "Select the account with which to synchronise" #~ msgstr "Изберете акаунт, с който искате да синхронизирате" #~ msgid "Modify Account" #~ msgstr "Промяна на акаунт" #~ msgid "" #~ "%(title)s by %(artist)s\n" #~ "from %(source)s" #~ msgstr "" #~ "%(title)s на %(artist)s\n" #~ "от %(source)s" #~ msgid "Gajim account %s" #~ msgstr "Акаунт „%s“" #~ msgid "This account is already configured in Gajim." #~ msgstr "Този акаунт вече е конфигуриран в Gajim." #~ msgid "PyOpenSSL" #~ msgstr "PyOpenSSL" #~ msgid "gnome-keyring" #~ msgstr "gnome-keyring" #~ msgid "" #~ "Requires python-gnome2-extras or compilation of gtkspell module from " #~ "Gajim sources." #~ msgstr "" #~ "Изисква python-gnome2-extras и компилация на модула „gtkspell“ от " #~ "изходния код на Gajim." #~ msgid "Idle" #~ msgstr "Време на бездействие" #~ msgid "Requires compilation of the idle module from Gajim sources." #~ msgstr "Изисква компилация на модула „idle“ от изходния код на Gajim." #~ msgid "libsexy" #~ msgstr "libsexy" #~ msgid "File transfer stopped by the contact at the other end" #~ msgstr "Файловият трансфер е преустановен от отсрещната страна" #~ msgid "Mood" #~ msgstr "Настроение" #~ msgid "Activity" #~ msgstr "Дейност" gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/po/br.po000066400000000000000000011320301326020644600222640ustar00rootroot00000000000000# translation of gajim.po to # French translations for gajim package # Traduction anglaise du package gajim. # Copyright (C) 2004 THE gajim'S COPYRIGHT HOLDER # This file is distributed under the same license as the gajim package. # Automatically generated, 2004. # , 2005. # # msgid "" msgstr "" "Project-Id-Version: gajim 0.10\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-03-31 02:05+0000\n" "PO-Revision-Date: 2006-06-05 19:14+0100\n" "Last-Translator: Giulia Fraboulet \n" "Language-Team: \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Poedit-Language: French\n" "X-Poedit-Country: FRANCE\n" #: gajim/chat_control_base.py:199 msgid "Ping?" msgstr "" #: gajim/chat_control_base.py:204 #, fuzzy msgid "Error." msgstr "Fazi en ur lenn ar restr:" #: gajim/chat_control_base.py:571 msgid "_Undo" msgstr "" #: gajim/chat_control_base.py:579 gajim/profile_window.py:181 #: gajim/conversation_textview.py:539 msgid "_Clear" msgstr "" #: gajim/chat_control_base.py:1172 msgid "Really send file?" msgstr "" #: gajim/chat_control_base.py:1173 #, python-format msgid "If you send a file to %s, he/she will know your real JID." msgstr "" #: gajim/session.py:451 gajim/session.py:511 msgid "Confirm these session options" msgstr "" #: gajim/session.py:453 #, python-format msgid "" "The remote client wants to negotiate a session with these features:\n" "\n" "%s\n" "\n" "Are these options acceptable?" msgstr "" #: gajim/session.py:513 #, python-format msgid "" "The remote client selected these options:\n" "\n" "%s\n" "\n" "Continue with the session?" msgstr "" #: gajim/session.py:516 #, fuzzy msgid "Always accept for this contact" msgstr "N'eus ket tu da implij OpenPGP war an urzhiataer-mañ" #: gajim/filetransfers_window.py:89 msgid "File" msgstr "Restr" #: gajim/filetransfers_window.py:104 msgid "Time" msgstr "Mare" #: gajim/filetransfers_window.py:116 msgid "Progress" msgstr "Araokadur" #: gajim/filetransfers_window.py:223 gajim/filetransfers_window.py:279 #, python-format msgid "Filename: %s" msgstr "Anv ar restr: %s" #: gajim/filetransfers_window.py:224 gajim/filetransfers_window.py:486 #, python-format msgid "Size: %s" msgstr "Ment: %s" #: gajim/filetransfers_window.py:233 gajim/filetransfers_window.py:243 #: gajim/history_manager.py:528 msgid "You" msgstr "C'hwi" #: gajim/filetransfers_window.py:234 #, python-format msgid "Sender: %s" msgstr "Kaser: %s" #: gajim/filetransfers_window.py:235 gajim/filetransfers_window.py:763 #: gajim/tooltips.py:667 msgid "Recipient: " msgstr "Resever:" #: gajim/filetransfers_window.py:246 #, python-format msgid "Saved in: %s" msgstr "Enrollet e-barzh: %s" #: gajim/filetransfers_window.py:248 gajim/chat_control.py:1617 msgid "File transfer completed" msgstr "Echu eo an treuzkas" #: gajim/filetransfers_window.py:250 gajim/chat_control.py:1621 #, fuzzy msgid "Open _Containing Folder" msgstr "_Digeriñ ar renkell pal" #: gajim/filetransfers_window.py:263 gajim/filetransfers_window.py:270 #: gajim/chat_control.py:1676 #, fuzzy msgid "File transfer cancelled" msgstr "Nullet eo bet an treuzkas" #: gajim/filetransfers_window.py:263 gajim/filetransfers_window.py:271 #: gajim/chat_control.py:1677 msgid "Connection with peer cannot be established." msgstr "N'eus ket tu seveniñ al lugadenn gant an darempred." #: gajim/filetransfers_window.py:280 #, fuzzy, python-format msgid "Recipient: %s" msgstr "Resever:" #: gajim/filetransfers_window.py:282 #, fuzzy, python-format msgid "Error message: %s" msgstr "Fazi en ur lenn ar restr:" #: gajim/filetransfers_window.py:283 gajim/chat_control.py:1673 #, fuzzy msgid "File transfer stopped" msgstr "Sac'het an treuzkas" #: gajim/filetransfers_window.py:319 #, python-format msgid "" "The file %(file)s has been received, but it seems to have been damaged along " "the way.\n" "Do you want to download it again?" msgstr "" #: gajim/filetransfers_window.py:345 #, fuzzy msgid "Choose File to Send…" msgstr "Dibabit ur restr da gas..." #: gajim/filetransfers_window.py:356 msgid "_Send" msgstr "_Kas" #: gajim/filetransfers_window.py:363 gajim/tooltips.py:702 #, fuzzy msgid "Description: " msgstr "Taolennadur: %s" #: gajim/filetransfers_window.py:376 #, fuzzy msgid "Gajim can not read this file" msgstr "N'hell ket Gajim tizhout ar restr-mañ" #: gajim/filetransfers_window.py:377 msgid "Another process is using this file." msgstr "" #: gajim/filetransfers_window.py:422 gajim/gtkgui_helpers.py:492 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "" #: gajim/filetransfers_window.py:423 gajim/gtkgui_helpers.py:493 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." msgstr "" #: gajim/filetransfers_window.py:440 gajim/gtkgui_helpers.py:497 msgid "This file already exists" msgstr "Bez ez eus eus ar restr-mañ dija" #: gajim/filetransfers_window.py:440 gajim/gtkgui_helpers.py:497 msgid "What do you want to do?" msgstr "Petra a fell deoc'h ober?" #: gajim/filetransfers_window.py:451 gajim/gtkgui_helpers.py:504 #, python-format msgid "Directory \"%s\" is not writable" msgstr "" #: gajim/filetransfers_window.py:452 gajim/gtkgui_helpers.py:505 msgid "You do not have permission to create files in this directory." msgstr "" #: gajim/filetransfers_window.py:463 #, fuzzy msgid "Save File as…" msgstr "Enrollañ ar restr dindan..." #: gajim/filetransfers_window.py:483 #, python-format msgid "File: %s" msgstr "Restr: %s" #: gajim/filetransfers_window.py:489 #, python-format msgid "Type: %s" msgstr "Doare: %s" #: gajim/filetransfers_window.py:491 #, python-format msgid "Description: %s" msgstr "Taolennadur: %s" #: gajim/filetransfers_window.py:492 #, python-format msgid "%s wants to send you a file:" msgstr "Fellout a ra da %s kas deoc'h ur restr:" #: gajim/filetransfers_window.py:533 #, fuzzy msgid "Checking file…" msgstr "Kas ur _restr" #: gajim/filetransfers_window.py:547 #, fuzzy msgid "File error" msgstr "Fazi treuzkas" #: gajim/filetransfers_window.py:584 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" #: gajim/filetransfers_window.py:677 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" #: gajim/filetransfers_window.py:730 gajim/filetransfers_window.py:733 msgid "Invalid File" msgstr "Restr direizh" #: gajim/filetransfers_window.py:730 msgid "File: " msgstr "Restr:" #: gajim/filetransfers_window.py:734 msgid "It is not possible to send empty files" msgstr "N'eus ket tu da gas restroù goullo" #: gajim/filetransfers_window.py:759 gajim/tooltips.py:658 msgid "Name: " msgstr "Anv:" #: gajim/filetransfers_window.py:761 gajim/tooltips.py:661 msgid "Sender: " msgstr "Kaser:" #: gajim/filetransfers_window.py:889 msgid "Pause" msgstr "Ehan" #: gajim/filetransfers_window.py:900 msgid "_Continue" msgstr "_Kenderc'hel" #: gajim/features_window.py:48 msgid "Bonjour / Zeroconf" msgstr "" #: gajim/features_window.py:49 msgid "Serverless chatting with autodetected clients in a local network." msgstr "" #: gajim/features_window.py:50 msgid "Requires python-avahi." msgstr "" #: gajim/features_window.py:51 msgid "" "Requires pybonjour and bonjour SDK running (http://developer.apple.com/" "opensource/)." msgstr "" #: gajim/features_window.py:52 #, fuzzy msgid "Command line" msgstr "Urzhioù: %s" #: gajim/features_window.py:53 msgid "A script to control Gajim via commandline." msgstr "" #: gajim/features_window.py:54 msgid "Requires python-dbus." msgstr "" #: gajim/features_window.py:55 gajim/features_window.py:83 #: gajim/features_window.py:87 msgid "Feature not available under Windows." msgstr "" #: gajim/features_window.py:56 #, fuzzy msgid "OpenPGP message encryption" msgstr "Encryption OpenPGP" #: gajim/features_window.py:57 #, fuzzy msgid "Ability to encrypting chat messages with OpenPGP." msgstr "Kemennadenn o _tegouezhout:" #: gajim/features_window.py:58 msgid "Requires gpg and python-gnupg (http://code.google.com/p/python-gnupg/)." msgstr "" #: gajim/features_window.py:59 msgid "Requires gpg.exe in PATH." msgstr "" #: gajim/features_window.py:60 #, fuzzy msgid "Password encryption" msgstr "Ne glot ket ar gerioù-kuzh" #: gajim/features_window.py:61 msgid "Passwords can be stored securely and not just in plaintext." msgstr "" #: gajim/features_window.py:62 msgid "" "Requires libsecret and a provider (such as GNOME Keyring and KSecretService)." msgstr "" #: gajim/features_window.py:63 msgid "On Windows the Windows Credential Vault is used." msgstr "" #: gajim/features_window.py:64 msgid "Spell Checker" msgstr "" #: gajim/features_window.py:65 msgid "Spellchecking of composed messages." msgstr "" #: gajim/features_window.py:66 gajim/features_window.py:67 msgid "Requires Gspell" msgstr "" #: gajim/features_window.py:68 #, fuzzy msgid "Automatic status" msgstr "Goulenn evit gwelet e/he stad" #: gajim/features_window.py:69 msgid "Ability to measure idle time, in order to set auto status." msgstr "" #: gajim/features_window.py:70 msgid "Requires libxss library." msgstr "" #: gajim/features_window.py:71 msgid "Requires python2.5." msgstr "" #: gajim/features_window.py:72 #, fuzzy msgid "End to End message encryption" msgstr "Encryption OpenPGP" #: gajim/features_window.py:73 #, fuzzy msgid "Encrypting chat messages." msgstr "Kemennadenn o _tegouezhout:" #: gajim/features_window.py:74 gajim/features_window.py:75 msgid "Requires python-crypto." msgstr "" #: gajim/features_window.py:76 #, fuzzy msgid "RST Generator" msgstr "Hollek" #: gajim/features_window.py:77 msgid "" "Generate XHTML output from RST code (see http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." msgstr "" #: gajim/features_window.py:78 gajim/features_window.py:79 msgid "Requires python-docutils." msgstr "" #: gajim/features_window.py:80 gajim/data/gui/preferences_window.ui:2421 msgid "Audio / Video" msgstr "" #: gajim/features_window.py:81 msgid "Ability to start audio and video chat." msgstr "" #: gajim/features_window.py:82 msgid "" "Requires gir1.2-farstream-0.2, gir1.2-gstreamer-1.0, gstreamer1.0-libav and " "gstreamer1.0-plugins-ugly." msgstr "" #: gajim/features_window.py:84 msgid "UPnP-IGD" msgstr "" #: gajim/features_window.py:85 msgid "Ability to request your router to forward port for file transfer." msgstr "" #: gajim/features_window.py:86 msgid "Requires gir1.2-gupnpigd-1.0." msgstr "" #: gajim/features_window.py:94 #, fuzzy msgid "?features:Available" msgstr "Hegerz" #: gajim/features_window.py:101 #, fuzzy msgid "Feature" msgstr "Perzhioù ar servijerien" #: gajim/gtkgui_helpers.py:255 msgid "Error reading file:" msgstr "Fazi en ur lenn ar restr:" #: gajim/gtkgui_helpers.py:258 msgid "Error parsing file:" msgstr "" #: gajim/gtkgui_helpers.py:478 msgid "Extension not supported" msgstr "" #: gajim/gtkgui_helpers.py:479 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "" #: gajim/gtkgui_helpers.py:514 #, fuzzy msgid "Save Image as…" msgstr "Enrollañ ar restr dindan..." #: gajim/vcard.py:166 gajim/vcard.py:513 gajim/profile_window.py:175 #: gajim/chat_control.py:581 #, fuzzy msgid "Save _As" msgstr "Enrollet e-barzh: %s" #: gajim/vcard.py:289 gajim/vcard.py:296 msgid "?Client:Unknown" msgstr "Dianav" #: gajim/vcard.py:293 gajim/vcard.py:298 msgid "?OS:Unknown" msgstr "Dianav" #: gajim/vcard.py:327 gajim/vcard.py:330 #, fuzzy msgid "?Time:Unknown" msgstr "Dianav" #: gajim/vcard.py:381 msgid "?Role in Group Chat:Role:" msgstr "" #: gajim/vcard.py:385 #, fuzzy msgid "Affiliation:" msgstr "Poelladoù" #: gajim/vcard.py:392 #, fuzzy msgid "" "This contact is interested in your presence information, but you are not " "interested in their presence" msgstr "" "Dedennet eo an darempred-mañ gant ho pezañs, met n'oc'h ket gant he/e hini" #: gajim/vcard.py:394 #, fuzzy msgid "" "You are interested in the contact's presence information, but it is not " "mutual" msgstr "" "Dedennet oc'h gant bezañs an darempred-mañ, met hennezh/hounnez n'eo ket " "gant ho hini" #: gajim/vcard.py:396 #, fuzzy msgid "The contact and you want to exchange presence information" msgstr "Dedennet hoc'h an eil gant bezañs egile/eben" #: gajim/vcard.py:398 #, fuzzy msgid "" "You and the contact have a mutual disinterest in each-others presence " "information" msgstr "Dedennet hoc'h an eil gant bezañs egile/eben" #: gajim/vcard.py:404 msgid "You are waiting contact's answer about your subscription request" msgstr "Emaoc'h o c'hortoz respont an darempred d'ho koulenn koumanantiñ" #: gajim/vcard.py:406 msgid "There is no pending subscription request." msgstr "" #: gajim/vcard.py:411 gajim/vcard.py:455 gajim/vcard.py:568 msgid " resource with priority " msgstr "" #: gajim/options_dialog.py:383 gajim/dialogs.py:4806 gajim/dialogs.py:4848 #: gajim/dialogs.py:4896 gajim/dialogs.py:4986 msgid "All files" msgstr "An holl restroù" #: gajim/options_dialog.py:392 #, fuzzy msgid "Clear File" msgstr "Darvoud" #: gajim/options_dialog.py:474 #, fuzzy msgid "Manage Proxies" msgstr "Merañ an aeladoù proksi" #: gajim/options_dialog.py:484 gajim/options_dialog.py:552 #: gajim/options_dialog.py:573 gajim/dialogs.py:326 gajim/dialogs.py:328 #: gajim/dialogs.py:536 gajim/dialogs.py:549 gajim/roster_window.py:2997 #: gajim/roster_window.py:3003 gajim/roster_window.py:3008 gajim/config.py:1162 #: gajim/config.py:1177 gajim/config.py:1182 gajim/config.py:1230 #: gajim/config.py:1340 gajim/config.py:2489 gajim/config.py:2566 #: gajim/data/gui/account_creation_wizard_window.ui:22 #: gajim/data/gui/change_mood_dialog.ui:98 msgid "None" msgstr "Hini ebet" #: gajim/options_dialog.py:506 #, fuzzy msgid "Adjust to Status" msgstr "Goulenn evit gwelet e/he stad" #: gajim/options_dialog.py:518 msgid "On" msgstr "" #: gajim/options_dialog.py:518 #, fuzzy msgid "Off" msgstr "Ezlinenn" #: gajim/options_dialog.py:556 msgid "Failed to get secret keys" msgstr "Fazi en ur dapout an alc'hwezhioù kuzh" #: gajim/options_dialog.py:557 #, fuzzy msgid "There is no OpenPGP secret key available." msgstr "Bez ez eus bet ur gudenn en ur gargañ hoc'h alc'hwezhioù-kuzh OpenPGP." #: gajim/options_dialog.py:562 msgid "OpenPGP Key Selection" msgstr "Dibab un alc'hwezh OpenPGP" #: gajim/options_dialog.py:562 msgid "Choose your OpenPGP key" msgstr "Dibabit hoc'h alc'hwezh OpenPGP" #: gajim/gui_menu_builder.py:100 #, fuzzy msgid "_New Group Chat" msgstr "Flap a-stroll" #: gajim/gui_menu_builder.py:292 gajim/gui_menu_builder.py:416 #: gajim/dialogs.py:1114 gajim/dialogs.py:2333 gajim/dialogs.py:2362 #: gajim/dialogs.py:3867 gajim/chat_control.py:284 gajim/roster_window.py:804 #: gajim/roster_window.py:1753 gajim/roster_window.py:1755 #: gajim/roster_window.py:2068 gajim/roster_window.py:3419 #: gajim/roster_window.py:3446 gajim/gui_interface.py:524 #: gajim/common/contacts.py:154 gajim/common/contacts.py:280 #: gajim/common/helpers.py:95 gajim/common/helpers.py:408 msgid "Not in Roster" msgstr "Ket er roll" #: gajim/gui_menu_builder.py:431 msgid "I would like to add you to my roster" msgstr "Laouen 'vefen d'az ouzhpennañ em roll-darempredoù" #: gajim/gui_menu_builder.py:508 #, fuzzy msgid "Send Single _Message…" msgstr "Kas ur gemennadenn _simpl" #: gajim/gui_menu_builder.py:521 gajim/roster_window.py:5165 #: gajim/data/gui/contact_context_menu.ui:58 #, fuzzy msgid "Send Cus_tom Status" msgstr "Goulenn evit gwelet e/he stad" #: gajim/gui_menu_builder.py:541 #, fuzzy msgid "E_xecute Command…" msgstr "urzhiad" #: gajim/gui_menu_builder.py:549 #, fuzzy msgid "_Manage Transport" msgstr "Dorioù" #: gajim/gui_menu_builder.py:555 #, fuzzy msgid "_Modify Transport" msgstr "Dorioù" #: gajim/gui_menu_builder.py:562 gajim/roster_window.py:5195 #, fuzzy msgid "_Rename…" msgstr "_Adenvel" #: gajim/gui_menu_builder.py:573 gajim/roster_window.py:5212 #: gajim/roster_window.py:5327 gajim/data/gui/blocked_contacts_window.ui:52 #: gajim/data/gui/gc_occupants_menu.ui:148 #: gajim/data/gui/contact_context_menu.ui:166 msgid "_Unblock" msgstr "" #: gajim/gui_menu_builder.py:576 gajim/roster_window.py:5217 #: gajim/roster_window.py:5331 gajim/data/gui/gc_occupants_menu.ui:140 #: gajim/data/gui/contact_context_menu.ui:174 msgid "_Block" msgstr "" #: gajim/gui_menu_builder.py:584 gajim/roster_window.py:5224 #: gajim/data/gui/contact_context_menu.ui:204 #, fuzzy msgid "Remo_ve" msgstr "_Dilemel" #: gajim/gui_menu_builder.py:594 gajim/data/gui/search_window.ui:98 #, fuzzy msgid "_Information" msgstr "Titouroù" #: gajim/gui_menu_builder.py:611 #, fuzzy msgid "Send File..." msgstr "Kas ur _restr" #: gajim/gui_menu_builder.py:615 #, fuzzy msgid "Invite Contacts" msgstr "Darempredoù" #: gajim/gui_menu_builder.py:616 #, fuzzy msgid "Add to Roster" msgstr "_Ouzhpennañ er roll" #: gajim/gui_menu_builder.py:617 msgid "Audio Session" msgstr "" #: gajim/gui_menu_builder.py:618 msgid "Video Session" msgstr "" #: gajim/gui_menu_builder.py:619 #, fuzzy msgid "Information" msgstr "Titouroù" #: gajim/gui_menu_builder.py:620 gajim/gui_menu_builder.py:655 #: gajim/data/gui/application_menu.ui:37 #, fuzzy msgid "History" msgstr "_Istoradur" #: gajim/gui_menu_builder.py:644 #, fuzzy msgid "Manage Room" msgstr "Merañ ar sinedoù" #: gajim/gui_menu_builder.py:645 #, fuzzy msgid "Change Subject" msgstr "Kemmañ ar _sujed" #: gajim/gui_menu_builder.py:646 #, fuzzy msgid "Configure Room" msgstr "Ke_fluniañ ar flap" #: gajim/gui_menu_builder.py:647 #, fuzzy msgid "Destroy Room" msgstr "Taolennadur: %s" #: gajim/gui_menu_builder.py:649 #, fuzzy msgid "Change Nick" msgstr "Cheñch _lesanv" #: gajim/gui_menu_builder.py:650 #, fuzzy msgid "Bookmark Room" msgstr "_Ouzhpennañ ar webgaoz d'ar sinedoù" #: gajim/gui_menu_builder.py:651 msgid "Request Voice" msgstr "" #: gajim/gui_menu_builder.py:652 gajim/data/gui/gc_control_popup_menu.ui:72 #, fuzzy msgid "Notify on all messages" msgstr "Kemennadennoù raklakaet:" #: gajim/gui_menu_builder.py:653 msgid "Minimize on close" msgstr "" #: gajim/gui_menu_builder.py:654 gajim/roster_window.py:5397 #, fuzzy msgid "Execute command" msgstr "urzhiad" #: gajim/gui_menu_builder.py:656 #, fuzzy msgid "Disconnect" msgstr "Darempred diluget" #: gajim/gui_menu_builder.py:685 gajim/gui_menu_builder.py:732 msgid "Join Group Chat" msgstr "Ebarzhiñ ur sal-flapiñ" #: gajim/gui_menu_builder.py:731 #, fuzzy msgid "Add Contact..." msgstr "_Ouzhpennañ un darempred..." #: gajim/gui_menu_builder.py:733 gajim/accounts_window.py:460 #: gajim/accounts_window.py:555 gajim/accounts_window.py:594 #, fuzzy msgid "Profile" msgstr "restr" #: gajim/gui_menu_builder.py:734 #, fuzzy msgid "Discover Services" msgstr "_Dizoleiñ ar servijoù" #: gajim/gui_menu_builder.py:735 #, fuzzy msgid "Send Single Message..." msgstr "Kas ur gemennadenn _simpl..." #: gajim/gui_menu_builder.py:736 gajim/data/gui/preferences_window.ui:2846 msgid "Advanced" msgstr "Dre ar munut" #: gajim/gui_menu_builder.py:737 #, fuzzy msgid "Archiving Preferences" msgstr "_Penndibaboù" #: gajim/gui_menu_builder.py:738 gajim/history_sync.py:44 #, fuzzy msgid "Synchronise History" msgstr "Diskouez an darempredoù _ezlinenn" #: gajim/gui_menu_builder.py:739 gajim/dialogs.py:4583 #, fuzzy msgid "Privacy Lists" msgstr "Flapoù prevez" #: gajim/gui_menu_builder.py:740 gajim/server_info.py:37 #, fuzzy msgid "Server Info" msgstr "Servijer" #: gajim/gui_menu_builder.py:741 gajim/data/gui/xml_console_window.ui:77 msgid "XML Console" msgstr "" #: gajim/gui_menu_builder.py:743 #, fuzzy msgid "Admin" msgstr "_Merour-ez" #: gajim/gui_menu_builder.py:744 #, fuzzy msgid "Send Server Message..." msgstr "_Kas ur gemennadenn d'ar servijer" #: gajim/gui_menu_builder.py:745 #, fuzzy msgid "Set MOTD..." msgstr "Lakaat MOTD" #: gajim/gui_menu_builder.py:746 #, fuzzy msgid "Update MOTD..." msgstr "Hizivaat MOTD" #: gajim/gui_menu_builder.py:747 #, fuzzy msgid "Delete MOTD..." msgstr "Dilemel MOTD" #: gajim/gui_menu_builder.py:787 #, fuzzy msgid "No Accounts available" msgstr "Kont ebet hegerz" #: gajim/gui_menu_builder.py:799 gajim/data/gui/accounts_window.ui:78 #: gajim/data/gui/application_menu.ui:5 gajim/data/gui/application_menu.ui:71 #: gajim/data/gui/shortcuts_window.ui:181 msgid "Accounts" msgstr "Kontoù" #: gajim/history_manager.py:56 #, fuzzy msgid "Usage:" msgstr "kemennadenn" #: gajim/history_manager.py:58 #, fuzzy msgid "Options:" msgstr "Boulomelloù:" #: gajim/history_manager.py:60 msgid "Show this help message and exit" msgstr "" #: gajim/history_manager.py:61 msgid "Choose folder for logfile" msgstr "" #: gajim/history_manager.py:104 msgid "Cannot find history logs database" msgstr "Dibosupl eo kavout titourva an istoradur" #: gajim/history_manager.py:144 gajim/history_manager.py:195 #: gajim/dialogs.py:3848 gajim/config.py:1621 gajim/disco.py:872 msgid "JID" msgstr "JID" #: gajim/history_manager.py:157 gajim/history_manager.py:201 #: gajim/history_window.py:108 msgid "Date" msgstr "Deiziad" #: gajim/history_manager.py:164 gajim/history_manager.py:220 #: gajim/data/gui/join_groupchat_window.ui:131 msgid "Nickname" msgstr "Lesanv" #: gajim/history_manager.py:173 gajim/history_manager.py:208 #: gajim/history_window.py:116 gajim/data/gui/xml_console_window.ui:108 msgid "Message" msgstr "Kemennadenn" #: gajim/history_manager.py:181 gajim/history_manager.py:214 msgid "Subject" msgstr "Titl" #: gajim/history_manager.py:243 msgid "" "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " "RUNNING)" msgstr "" "Ha fellout a ra deoc'h naetaat an titourva? (DIALIET GROÑS M'EMAÑ GAJIM O " "VONT EN-DRO)" #: gajim/history_manager.py:245 msgid "" "Normally allocated database size will not be freed, it will just become " "reusable. If you really want to reduce database filesize, click YES, else " "click NO.\n" "\n" "In case you click YES, please wait…" msgstr "" #: gajim/history_manager.py:250 msgid "Database Cleanup" msgstr "" #: gajim/history_manager.py:464 #, fuzzy msgid "Exporting History Logs…" msgstr "Oc'h ezporzhiañ an istoradur..." #: gajim/history_manager.py:540 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "%(time)s e lâras %(who)s: %(message)s\n" #: gajim/history_manager.py:578 #, fuzzy, python-format msgid "Do you wish to delete all correspondence with %(jid)s?" msgstr "Ha fellout a ra deoc'h da vat diverkañ ar gemennadenn ziuzet?" #: gajim/history_manager.py:582 #, fuzzy msgid "Do you wish to delete all correspondence with the selected contacts?" msgstr "Ha sur oc'h e fell deoc'h diverkañ istoradur an darempred-mañ?" #: gajim/history_manager.py:584 #, fuzzy msgid "This can not be undone." msgstr "N'eo ket bet kavet ar servij" #: gajim/history_manager.py:586 gajim/history_manager.py:625 #, fuzzy msgid "Deletion Confirmation" msgstr "Titouroù" #: gajim/history_manager.py:620 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Ha fellout a ra deoc'h da vat diverkañ ar gemennadenn ziuzet?" msgstr[1] "Ha fellout a ra deoc'h da vat diverkañ ar c'hemennadennoù diuzet?" #: gajim/history_manager.py:623 #, fuzzy msgid "This is an irreversible operation." msgstr "Setu un ober n'eus ket tu da vont war e giz." #: gajim/profile_window.py:63 msgid "Retrieving profile…" msgstr "" #: gajim/profile_window.py:128 msgid "Could not load image" msgstr "Dibosupl eo kargañ ar skeudenn" #: gajim/profile_window.py:200 #, fuzzy msgid "Wrong date format" msgstr "Titouroù" #: gajim/profile_window.py:201 #, fuzzy msgid "Format of the date must be YYYY-MM-DD" msgstr "Stumm : BBBB-MM-DD" #: gajim/profile_window.py:261 #, fuzzy msgid "Information received" msgstr "Resevet ar bedadenn" #: gajim/profile_window.py:334 gajim/dialogs.py:2562 gajim/dialogs.py:2650 #: gajim/dialogs.py:3105 gajim/disco.py:536 gajim/gui_interface.py:1849 #: gajim/dialog_messages.py:32 msgid "You are not connected to the server" msgstr "N'oc'h ket luget d'ar servijer" #: gajim/profile_window.py:335 #, fuzzy msgid "Without a connection, you can not publish your contact information." msgstr "Rankout a rit bezaén luget evit embann ho titouroù hiniennel." #: gajim/profile_window.py:349 #, fuzzy msgid "Sending profile…" msgstr "Kas ur restr" #: gajim/profile_window.py:368 msgid "Information NOT published" msgstr "" #: gajim/profile_window.py:375 msgid "vCard publication failed" msgstr "C'hwitet eo embannadur ar vCard" #: gajim/profile_window.py:376 msgid "" "There was an error while publishing your personal information, try again " "later." msgstr "" "Bez ez eus bet ur fazi en ur embann ho titouroù hiniennel, klaskit en-dro " "diwezhatoc'h." #: gajim/dialogs.py:90 #, fuzzy, python-format msgid "Contact name: %s" msgstr "Anv an darempred: %s" #: gajim/dialogs.py:92 #, fuzzy, python-format msgid "JID: %s" msgstr "JID: %s" #: gajim/dialogs.py:121 gajim/dialogs.py:133 gajim/roster_window.py:2939 #: gajim/roster_window.py:3953 gajim/roster_window.py:5234 #: gajim/accounts_window.py:463 gajim/common/contacts.py:105 #: gajim/common/contacts.py:137 gajim/data/gui/preferences_window.ui:569 #: gajim/data/gui/shortcuts_window.ui:176 msgid "General" msgstr "Hollek" #: gajim/dialogs.py:206 msgid "Group" msgstr "Strollad" #: gajim/dialogs.py:213 msgid "In the group" msgstr "Er strollad" #: gajim/dialogs.py:308 msgid "KeyID" msgstr "KeyID" #: gajim/dialogs.py:313 msgid "Contact name" msgstr "Anv an darempred" #: gajim/dialogs.py:491 #, fuzzy msgid "Set Mood" msgstr "Lakaat MOTD" #: gajim/dialogs.py:611 #, python-format msgid "%s Status Message" msgstr "Titour-stad %s" #: gajim/dialogs.py:625 msgid "Status Message" msgstr "Titour-stad" #: gajim/dialogs.py:815 #, fuzzy msgid "Overwrite Status Message?" msgstr "Titour-stad" #: gajim/dialogs.py:816 #, fuzzy msgid "" "This name is already used. Do you want to overwrite this status message?" msgstr "" "Implijet e vez an anv-mañ gant unan eus ho kontoù dija. Dibabit un anv all " "marplij." #: gajim/dialogs.py:824 msgid "Save as Preset Status Message" msgstr "Enrollañ evel titour-stad rakenrollet" #: gajim/dialogs.py:825 msgid "Please type a name for this status message" msgstr "Roit un anv d'an titour-stad-mañ" #: gajim/dialogs.py:852 #, fuzzy msgid "JID:" msgstr "Ho JID:" #: gajim/dialogs.py:853 #, fuzzy msgid "AIM Address:" msgstr "_Chomlec'h:" #: gajim/dialogs.py:854 msgid "GG Number:" msgstr "" #: gajim/dialogs.py:855 msgid "ICQ Number:" msgstr "" #: gajim/dialogs.py:856 #, fuzzy msgid "MSN Address:" msgstr "_Chomlec'h:" #: gajim/dialogs.py:857 #, fuzzy msgid "Yahoo! Address:" msgstr "Chomlec'h 2:" #: gajim/dialogs.py:894 #, fuzzy, python-format msgid "" "Please fill in the data of the contact you want to add to your account " "%s" msgstr "Leuniit titouroù an darempred a zo da vezañ ouzhpennet er gont %s" #: gajim/dialogs.py:897 msgid "Please fill in the data of the contact you want to add" msgstr "Leuniit an titouroù diwar-benn an darempred da ouzhpennañ" #: gajim/dialogs.py:1089 gajim/dialogs.py:1095 gajim/dialogs.py:1100 msgid "Invalid User ID" msgstr "ID-arveriad-ez direizh" #: gajim/dialogs.py:1096 msgid "The user ID must not contain a resource." msgstr "" #: gajim/dialogs.py:1101 #, fuzzy msgid "You cannot add yourself to your roster." msgstr "Laouen 'vefen d'ho ouzhpennañ em roll-darempredoù." #: gajim/dialogs.py:1115 msgid "Contact already in roster" msgstr "Darempred er roll dija" #: gajim/dialogs.py:1116 msgid "This contact is already listed in your roster." msgstr "Emañ an darempred en ho roll-darempredoù dija." #: gajim/dialogs.py:1169 gajim/dialogs.py:1203 #, fuzzy msgid "User ID:" msgstr "ID arveriad-ez:" #: gajim/dialogs.py:1269 #, fuzzy msgid "Error while adding transport contact" msgstr "fazi en ur gas %s ( %s )" #: gajim/dialogs.py:1270 #, python-format msgid "" "This error occured while adding a contact for transport %(transport)s:\n" "\n" "%(error)s" msgstr "" #: gajim/dialogs.py:1302 #, fuzzy msgid "A GTK+ XMPP client" msgstr "Ur flaperez Jabber e GTK+" #: gajim/dialogs.py:1303 #, python-format msgid "GTK+ Version: %s" msgstr "" #: gajim/dialogs.py:1304 #, python-format msgid "PyGObject Version: %s" msgstr "" #: gajim/dialogs.py:1305 #, python-format msgid "python-nbxmpp Version: %s" msgstr "" #: gajim/dialogs.py:1308 #, fuzzy msgid "Current Developers" msgstr "Diorroerien kent:" #: gajim/dialogs.py:1309 #, fuzzy msgid "Past Developers" msgstr "Diorroerien kent:" #: gajim/dialogs.py:1310 msgid "Artists" msgstr "" #: gajim/dialogs.py:1314 msgid "Last but not least" msgstr "" #: gajim/dialogs.py:1315 #, fuzzy msgid "we would like to thank all the package maintainers." msgstr "Evit echuiñ, e fell deomp trugarekaat holl gempennerien ar pakad." #: gajim/dialogs.py:1316 msgid "Thanks" msgstr "" #: gajim/dialogs.py:1318 msgid "translator-credits" msgstr "" "Troet e brezhoneg gant\n" "Giulia Fraboulet " #: gajim/dialogs.py:1503 #, fuzzy, python-format msgid "Dictionary for language \"%s\" not available" msgstr "N'eus ket tu da gevreañ" #: gajim/dialogs.py:1504 #, python-format msgid "" "You have to install the dictionary \"%s\" to use spellchecking, or choose " "another language by setting the speller_language option.\n" "\n" "Highlighting misspelled words feature will not be used" msgstr "" #: gajim/dialogs.py:1851 gajim/dialogs.py:1866 gajim/gui_interface.py:1511 #: gajim/gui_interface.py:1553 #, fuzzy msgid "Insecure connection" msgstr "Kevreadenn" #: gajim/dialogs.py:1852 #, fuzzy, python-format msgid "" "You are about to connect to the account %(account)s (%(server)s) insecurely. " "This means conversations will not be encrypted, and is strongly " "discouraged.\n" "Are you sure you want to do that?" msgstr "Rankout a rit krouiñ ur gont a-raok gellout flapiñ gant tud all." #: gajim/dialogs.py:1857 gajim/gui_interface.py:1515 #: gajim/gui_interface.py:1556 msgid "Yes, I really want to connect insecurely" msgstr "" #: gajim/dialogs.py:1858 msgid "Gajim will NOT connect unless you check this box" msgstr "" #: gajim/dialogs.py:1859 gajim/groupchat_control.py:2335 #: gajim/roster_window.py:2897 gajim/roster_window.py:3529 #: gajim/roster_window.py:4282 gajim/message_window.py:247 #: gajim/gui_interface.py:725 gajim/gui_interface.py:1516 #: gajim/gui_interface.py:1557 #, fuzzy msgid "_Do not ask me again" msgstr "_Chom hep goulenn ket" #: gajim/dialogs.py:1957 msgid "_Resume" msgstr "" #: gajim/dialogs.py:1965 msgid "Re_place" msgstr "" #: gajim/dialogs.py:2168 gajim/config.py:2169 #: gajim/command_system/implementation/standard.py:261 #, fuzzy msgid "Invalid nickname" msgstr "Anv-arveriad-ez direizh" #: gajim/dialogs.py:2169 #, fuzzy msgid "The nickname contains invalid characters." msgstr "Bez ez eus arouezioù difennet en anv ar sal pe hini ar servijer." #: gajim/dialogs.py:2291 msgid "Subscription Request" msgstr "Goulenn koumanantiñ" #: gajim/dialogs.py:2300 #, fuzzy, python-format msgid "Subscription request for account %(account)s from %(jid)s" msgstr "Goulenn enskrivañ evit ar gont %s digant %s" #: gajim/dialogs.py:2303 #, python-format msgid "Subscription request from %s" msgstr "Goulenn enskrivañ digant %s" #: gajim/dialogs.py:2375 gajim/data/gui/join_groupchat_window.ui:312 #, fuzzy msgid "Join Groupchat" msgstr "Ebarzhiñ ur sal-flapiñ" #: gajim/dialogs.py:2531 #, fuzzy msgid "Invalid Room" msgstr "Road direizh" #: gajim/dialogs.py:2532 msgid "Please choose a room" msgstr "" #: gajim/dialogs.py:2544 gajim/dialogs.py:2551 #, fuzzy msgid "Invalid Nickname" msgstr "Anv-arveriad-ez direizh" #: gajim/dialogs.py:2545 msgid "Please choose a nickname" msgstr "" #: gajim/dialogs.py:2557 gajim/dialogs.py:3516 gajim/config.py:2453 #: gajim/dialog_messages.py:37 gajim/dialog_messages.py:42 #, fuzzy msgid "Invalid JID" msgstr "ID jabber direizh" #: gajim/dialogs.py:2563 gajim/gui_interface.py:1850 msgid "You can not join a group chat unless you are connected." msgstr "N'hellit ket ebarzhiñ ur sal-flapiñ keit ha ma n'oc'h ket luget." #: gajim/dialogs.py:2617 gajim/dialogs.py:2628 #, fuzzy msgid "Wrong server" msgstr "Ger-kuzh faos" #: gajim/dialogs.py:2618 gajim/dialogs.py:2629 #, fuzzy, python-format msgid "%s is not a groupchat server" msgstr "A guzha an nozelennoù er prenestr flapiñ" #: gajim/dialogs.py:2651 #, fuzzy msgid "Without a connection, you can not synchronise your contacts." msgstr "Rankout a rit bezañ luget evit cheñch ger-kuzh." #: gajim/dialogs.py:2662 gajim/dialogs.py:2733 gajim/dialogs.py:3851 #: gajim/history_window.py:100 gajim/disco.py:865 gajim/disco.py:1693 #: gajim/disco.py:1978 msgid "Name" msgstr "Anv" #: gajim/dialogs.py:2665 gajim/data/gui/join_groupchat_window.ui:214 msgid "Server" msgstr "Servijer" #: gajim/dialogs.py:2701 #, fuzzy msgid "This account is not connected to the server" msgstr "Luget eo ar gont \"%s\" d'ar servijer" #: gajim/dialogs.py:2702 #, fuzzy msgid "You cannot synchronize with an account unless it is connected." msgstr "N'hellit ket ebarzhiñ ur sal-flapiñ keit ha ma n'oc'h ket luget." #: gajim/dialogs.py:2731 msgid "Synchronise" msgstr "" #: gajim/dialogs.py:2794 #, fuzzy msgid "Start new Conversation" msgstr "Kevreadenn" #: gajim/dialogs.py:3052 #, fuzzy msgid "New Groupchat" msgstr "Flap a-stroll" #: gajim/dialogs.py:3054 #, fuzzy msgid "New Contact" msgstr "Ouzhpennañ un darempred nevez" #: gajim/dialogs.py:3106 msgid "Without a connection, you can not change your password." msgstr "Rankout a rit bezañ luget evit cheñch ger-kuzh." #: gajim/dialogs.py:3126 msgid "Invalid password" msgstr "Ger-kuzh direizh" #: gajim/dialogs.py:3126 msgid "You must enter a password." msgstr "Rankout a rit reiñ ur ger-kuzh." #: gajim/dialogs.py:3130 msgid "Passwords do not match" msgstr "Ne glot ket ar gerioù-kuzh" #: gajim/dialogs.py:3131 msgid "The passwords typed in both fields must be identical." msgstr "Rankout a ra an daou c'her-kuzh bezañ heñvel en daou dakad." #: gajim/dialogs.py:3169 gajim/notify.py:91 #: gajim/common/connection_handlers_events.py:2821 msgid "Contact Signed In" msgstr "Darempred luget" #: gajim/dialogs.py:3171 gajim/notify.py:91 #: gajim/common/connection_handlers_events.py:2827 msgid "Contact Signed Out" msgstr "Darempred diluget" #: gajim/dialogs.py:3173 gajim/notify.py:92 gajim/notify.py:105 #: gajim/common/connection_handlers_events.py:2641 msgid "New Message" msgstr "Kemennadenn nevez" #: gajim/dialogs.py:3173 gajim/notify.py:92 gajim/notify.py:105 #: gajim/common/connection_handlers_events.py:2623 msgid "New Single Message" msgstr "Kemennadenn simpl nevez" #: gajim/dialogs.py:3174 gajim/notify.py:92 gajim/notify.py:106 #: gajim/common/connection_handlers_events.py:2629 msgid "New Private Message" msgstr "Kemennadenn hiniennel nevez" #: gajim/dialogs.py:3174 msgid "New E-mail" msgstr "Postel nevez" #: gajim/dialogs.py:3176 gajim/gui_interface.py:926 gajim/notify.py:93 msgid "File Transfer Request" msgstr "Goulenn treuzkas" #: gajim/dialogs.py:3178 gajim/gui_interface.py:861 gajim/gui_interface.py:891 #: gajim/notify.py:94 msgid "File Transfer Error" msgstr "Fazi treuzkas" #: gajim/dialogs.py:3180 gajim/gui_interface.py:1030 #: gajim/gui_interface.py:1059 gajim/gui_interface.py:1080 gajim/notify.py:94 msgid "File Transfer Completed" msgstr "Echu an treuzkasadenn" #: gajim/dialogs.py:3181 gajim/gui_interface.py:1034 #: gajim/gui_interface.py:1063 gajim/gui_interface.py:1084 gajim/notify.py:95 msgid "File Transfer Stopped" msgstr "Sac'het an treuzkas" #: gajim/dialogs.py:3183 gajim/dialogs.py:4748 gajim/chat_control.py:1647 #: gajim/gui_interface.py:663 gajim/notify.py:95 msgid "Groupchat Invitation" msgstr "Pedadenn evit ur sal-flapiñ" #: gajim/dialogs.py:3185 gajim/notify.py:93 #: gajim/common/connection_handlers_events.py:2815 #, fuzzy msgid "Contact Changed Status" msgstr "Darempred diluget" #: gajim/dialogs.py:3404 #, fuzzy, python-format msgid "Single Message using account %s" msgstr "Kemennadenn simpl gant ar gont %s" #: gajim/dialogs.py:3406 #, fuzzy, python-format msgid "Single Message in account %s" msgstr "Kemennadenn simpl gant ar gont %s" #: gajim/dialogs.py:3408 msgid "Single Message" msgstr "Kemennadenn simpl" #: gajim/dialogs.py:3411 #, python-format msgid "Send %s" msgstr "Kas %s" #: gajim/dialogs.py:3434 #, python-format msgid "Received %s" msgstr "%s resevet" #: gajim/dialogs.py:3457 #, fuzzy, python-format msgid "Form %s" msgstr "De %s" #: gajim/dialogs.py:3485 gajim/dialogs.py:3672 msgid "Connection not available" msgstr "N'eus ket tu en em lugañ" #: gajim/dialogs.py:3486 gajim/dialogs.py:3673 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Gwiriekait oc'h luget gant \"%s\"." #: gajim/dialogs.py:3517 gajim/dialog_messages.py:43 #, fuzzy, python-format msgid "It is not possible to send a message to %s, this JID is not valid." msgstr "N'eus ket tu da gas restroù goullo" #: gajim/dialogs.py:3540 #, python-format msgid "RE: %s" msgstr "RE: %s" #: gajim/dialogs.py:3541 #, python-format msgid "%s wrote:\n" msgstr "%s a skrivas:\n" #: gajim/dialogs.py:3589 gajim/data/gui/shortcuts_window.ui:113 #, fuzzy msgid "Clear" msgstr "Darvoud" #: gajim/dialogs.py:3594 #, fuzzy msgid "Filter" msgstr "Sil:" #: gajim/dialogs.py:3599 msgid "XML Input" msgstr "" #: gajim/dialogs.py:3603 msgid "Send" msgstr "Envoyer" #: gajim/dialogs.py:3794 #, fuzzy msgid "add" msgstr "Chomlec'h" #: gajim/dialogs.py:3794 #, fuzzy msgid "modify" msgstr "_Kemmañ" #: gajim/dialogs.py:3795 #, fuzzy msgid "remove" msgstr "_Dilemel" #: gajim/dialogs.py:3824 #, fuzzy, python-format msgid "" "%(jid)s would like you to %(action)s some contacts in your " "roster." msgstr "Me blijfe din ouzhpennañ ac'hanoc'h em roll-darempredoù." #: gajim/dialogs.py:3840 gajim/dialogs.py:3886 gajim/accounts_window.py:44 #, fuzzy msgid "Add" msgstr "Chomlec'h" #: gajim/dialogs.py:3842 gajim/dialogs.py:3917 #, fuzzy msgid "Modify" msgstr "_Kemmañ" #: gajim/dialogs.py:3844 gajim/dialogs.py:3941 msgid "Delete" msgstr "Dilemel" #: gajim/dialogs.py:3854 #, fuzzy msgid "Groups" msgstr "Strollad" #: gajim/dialogs.py:3962 #, fuzzy, python-format msgid "%s suggested me to add you in my roster." msgstr "Laouen 'vefen d'ho ouzhpennañ em roll-darempredoù." #: gajim/dialogs.py:3976 #, fuzzy, python-format msgid "Added %d contact" msgid_plural "Added %d contacts" msgstr[0] "Ouzhpennañ un _darempred" msgstr[1] "Ouzhpennañ un _darempred" #: gajim/dialogs.py:4014 #, fuzzy, python-format msgid "Removed %d contact" msgid_plural "Removed %d contacts" msgstr[0] "Dilemel an darempred diouzh ar roll" msgstr[1] "Dilemel an darempred diouzh ar roll" #: gajim/dialogs.py:4040 #, python-format msgid "Archiving Preferences for %s" msgstr "" #: gajim/dialogs.py:4078 msgid "Success!" msgstr "" #: gajim/dialogs.py:4078 #, fuzzy msgid "Your Archiving Preferences have been saved!" msgstr "_Penndibaboù" #: gajim/dialogs.py:4094 msgid "We got no response from the Server" msgstr "" #: gajim/dialogs.py:4096 msgid "We received an error: {}" msgstr "" #: gajim/dialogs.py:4100 #, fuzzy msgid "Error!" msgstr "Fazi en ur lenn ar restr:" #: gajim/dialogs.py:4159 #, fuzzy msgid "Add JID" msgstr "ID Jabber:" #: gajim/dialogs.py:4232 #, python-format msgid "Privacy List %s" msgstr "" #: gajim/dialogs.py:4236 #, python-format msgid "Privacy List for %s" msgstr "" #: gajim/dialogs.py:4238 gajim/data/gui/privacy_list_window.ui:47 #, fuzzy msgid "Privacy List" msgstr "Roll argas" #: gajim/dialogs.py:4309 #, python-format msgid "Order: %(order)s, action: %(action)s, type: %(type)s, value: %(value)s" msgstr "" #: gajim/dialogs.py:4314 #, fuzzy, python-format msgid "Order: %(order)s, action: %(action)s" msgstr "Taolennadur: %s" #: gajim/dialogs.py:4368 #, fuzzy msgid "Edit a rule" msgstr "Furmad ul linenn" #: gajim/dialogs.py:4480 #, fuzzy msgid "Add a rule" msgstr "Furmad ul linenn" #: gajim/dialogs.py:4581 #, python-format msgid "Privacy Lists for %s" msgstr "" #: gajim/dialogs.py:4677 #, fuzzy msgid "Invalid List Name" msgstr "Anv-arveriad-ez direizh" #: gajim/dialogs.py:4678 #, fuzzy msgid "You must enter a name to create a privacy list." msgstr "Rankout a rit reiñ ur ger-kuzh evit enrollañ ar gont nevez." #: gajim/dialogs.py:4714 #, fuzzy msgid "You are invited to a groupchat" msgstr "Vous êtes banni de ce salon." #: gajim/dialogs.py:4717 #, fuzzy msgid "$Contact has invited you to join a discussion" msgstr "Pedet oc'h bet gant %(contact_jid)s er sal-flapiñ %(room_jid)s" #: gajim/dialogs.py:4719 #, fuzzy, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "Pedet oc'h bet gant %(contact_jid)s er sal-flapiñ %(room_jid)s" #: gajim/dialogs.py:4728 #, python-format msgid "Comment: %s" msgstr "Evezhiadenn: %s" #: gajim/dialogs.py:4730 msgid "Do you want to accept the invitation?" msgstr "" #: gajim/dialogs.py:4746 msgid "Reason (if you decline):" msgstr "" #: gajim/dialogs.py:4795 msgid "Choose Client Cert #PCKS12" msgstr "" #: gajim/dialogs.py:4811 gajim/accounts_window.py:657 msgid "PKCS12 Files" msgstr "" #: gajim/dialogs.py:4837 msgid "Choose Sound" msgstr "Dibabit ur son" #: gajim/dialogs.py:4853 msgid "Wav Sounds" msgstr "Sonioù wav" #: gajim/dialogs.py:4883 msgid "Choose Image" msgstr "Dibabit ur skeudenn" #: gajim/dialogs.py:4901 msgid "Images" msgstr "Skeudennoù" #: gajim/dialogs.py:4972 #, fuzzy msgid "Choose Archive" msgstr "Dibabit ur skeudenn" #: gajim/dialogs.py:4991 #, fuzzy msgid "Zip files" msgstr "An holl restroù" #: gajim/dialogs.py:5017 #, python-format msgid "When %s becomes:" msgstr "Pa teu %s da vezañ:" #: gajim/dialogs.py:5019 #, python-format msgid "Adding Special Notification for %s" msgstr "Oc'h ouzhpennañ ur gelaouenn nevez evit %s" #: gajim/dialogs.py:5259 msgid "an audio and video" msgstr "" #: gajim/dialogs.py:5261 msgid "an audio" msgstr "" #: gajim/dialogs.py:5263 msgid "a video" msgstr "" #: gajim/dialogs.py:5267 #, python-format msgid "" "%(contact)s wants to start %(type)s session with you. Do you want to answer " "the call?" msgstr "" #: gajim/dialogs.py:5372 gajim/dialogs.py:5408 #, fuzzy, python-format msgid "Certificate for account %s" msgstr "evit ar gont %s" #: gajim/dialogs.py:5372 #, python-format msgid "" "Issued to:\n" "Common Name (CN): %(scn)s\n" "Organization (O): %(sorg)s\n" "Organizationl Unit (OU): %(sou)s\n" "Serial Number: %(sn)s\n" "\n" "Issued by:\n" "Common Name (CN): %(icn)s\n" "Organization (O): %(iorg)s\n" "Organizationl Unit (OU): %(iou)s\n" "\n" "Validity:\n" "Issued on: %(io)s\n" "Expires on: %(eo)s\n" "\n" "Fingerprint\n" "SHA-1 Fingerprint: %(sha1)s\n" "\n" "SHA256 Fingerprint: %(sha256)s\n" msgstr "" #: gajim/dialogs.py:5419 gajim/gui_interface.py:1405 #, fuzzy, python-format msgid "SSL Certificate Verification for %s" msgstr "Oc'h ouzhpennañ ur gelaouenn nevez evit %s" #: gajim/dialogs.py:5420 gajim/dialogs.py:5437 msgid "View cert…" msgstr "" #: gajim/dialogs.py:5453 gajim/data/gui/application_menu.ui:32 #, fuzzy msgid "File Transfer" msgstr "Treuzkasoù" #: gajim/dialogs.py:5477 msgid "Requesting HTTP Upload Slot..." msgstr "" #: gajim/dialogs.py:5481 msgid "Uploading file via HTTP File Upload..." msgstr "" #: gajim/dialogs.py:5485 #, fuzzy msgid "Encrypting file..." msgstr "Lazhet eo ar sifrañ" #: gajim/groupchat_control.py:193 gajim/groupchat_control.py:1839 #, fuzzy, python-format msgid "%(nick)s is now known as %(new_nick)s" msgstr "%s a zo bremañ %s" #: gajim/groupchat_control.py:219 gajim/groupchat_control.py:1988 #: gajim/history_window.py:550 gajim/common/connection_handlers_events.py:2811 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s a zo bremañ %(status)s" #: gajim/groupchat_control.py:248 msgid "Sending private message failed" msgstr "Kas ar gemennadenn brevez c'hwitet" #: gajim/groupchat_control.py:250 #, fuzzy, python-format msgid "You are no longer in group chat \"%(room)s\" or \"%(nick)s\" has left." msgstr "N'emaoc'h ket er webgaoz \"%s\" ken, pe neuze eo aet kuit \"%s\"." #: gajim/groupchat_control.py:640 gajim/chat_control.py:326 #: gajim/chat_control.py:330 msgid "HTTP File Upload" msgstr "" #: gajim/groupchat_control.py:642 msgid "HTTP File Upload not supported by your server" msgstr "" #: gajim/groupchat_control.py:662 gajim/groupchat_control.py:2370 msgid "Changing Subject" msgstr "Cheñch ar sujed" #: gajim/groupchat_control.py:663 gajim/groupchat_control.py:2371 msgid "Please specify the new subject:" msgstr "Skrivit ar sujed nevez:" #: gajim/groupchat_control.py:670 msgid "Changing Nickname" msgstr "Cheñch lesanv" #: gajim/groupchat_control.py:671 msgid "Please specify the new nickname you want to use:" msgstr "Skrivit al lesanv nevez a fell deoc'h implij:" #: gajim/groupchat_control.py:688 #, fuzzy msgid "Invalid group chat JID" msgstr "ID jabber direizh" #: gajim/groupchat_control.py:689 #, fuzzy msgid "The group chat JID has not allowed characters." msgstr "Bez ez eus arouezioù difennet en anv ar sal pe hini ar servijer." #: gajim/groupchat_control.py:699 #, fuzzy, python-format msgid "Destroying %s" msgstr "Taolennadur: %s" #: gajim/groupchat_control.py:700 msgid "" "You are going to remove this room permanently.\n" "You may specify a reason below:" msgstr "" #: gajim/groupchat_control.py:702 msgid "You may also enter an alternate venue:" msgstr "" #: gajim/groupchat_control.py:880 #, fuzzy msgid "Insert Nickname" msgstr "Cheñch _lesanv" #: gajim/groupchat_control.py:1062 gajim/chat_control.py:803 #, fuzzy msgid "and authenticated" msgstr "Implij an diskleriañ" #: gajim/groupchat_control.py:1066 gajim/chat_control.py:807 #, fuzzy msgid "and NOT authenticated" msgstr "Implij an diskleriañ" #: gajim/groupchat_control.py:1070 gajim/chat_control.py:811 #, python-format msgid "%(type)s encryption is active %(authenticated)s." msgstr "" #: gajim/groupchat_control.py:1113 #, fuzzy msgid "Conversation with " msgstr "Istoradur ar gaoz" #: gajim/groupchat_control.py:1115 #, fuzzy msgid "Continued conversation" msgstr "Kevreadenn" #: gajim/groupchat_control.py:1473 #, fuzzy, python-format msgid "%(nick)s has set the subject to %(subject)s" msgstr "%(nick)s a zo bet skarzhet : %(reason)s" #: gajim/groupchat_control.py:1496 gajim/groupchat_control.py:1781 msgid "Any occupant is allowed to see your full JID" msgstr "" #: gajim/groupchat_control.py:1499 msgid "Room now shows unavailable members" msgstr "" #: gajim/groupchat_control.py:1501 msgid "Room now does not show unavailable members" msgstr "" #: gajim/groupchat_control.py:1503 msgid "A setting not related to privacy has been changed" msgstr "" #: gajim/groupchat_control.py:1507 msgid "Room logging is now enabled" msgstr "" #: gajim/groupchat_control.py:1509 msgid "Room logging is now disabled" msgstr "" #: gajim/groupchat_control.py:1511 msgid "Room is now non-anonymous" msgstr "" #: gajim/groupchat_control.py:1514 msgid "Room is now semi-anonymous" msgstr "" #: gajim/groupchat_control.py:1517 msgid "Room is now fully anonymous" msgstr "" #: gajim/groupchat_control.py:1557 gajim/chat_control.py:1268 #, python-format msgid "Pong! (%s s.)" msgstr "" #: gajim/groupchat_control.py:1774 gajim/groupchat_control.py:2398 #: gajim/roster_window.py:3129 gajim/gui_interface.py:621 #, fuzzy, python-format msgid "%(jid)s has been invited in this room" msgstr "%(nick)s a zo bet skarzhet gant %(who)s : %(reason)s" #: gajim/groupchat_control.py:1786 msgid "Room logging is enabled" msgstr "" #: gajim/groupchat_control.py:1788 #, fuzzy msgid "A new room has been created" msgstr "Gant berzh eo bet krouet ho kont nevez!" #: gajim/groupchat_control.py:1791 msgid "The server has assigned or modified your roomnick" msgstr "" #: gajim/groupchat_control.py:1797 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s a zo bet skarzhet : %(reason)s" #: gajim/groupchat_control.py:1800 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(nick)s a zo bet skarzhet gant %(who)s : %(reason)s" #: gajim/groupchat_control.py:1809 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s a zo argaset : %(reason)s" #: gajim/groupchat_control.py:1812 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(nick)s a zo argaset gant %(who)s : %(reason)s" #: gajim/groupchat_control.py:1823 gajim/groupchat_control.py:1907 #, python-format msgid "You are now known as %s" msgstr "Anavezet oc'h bremañ gant an anv %s" #: gajim/groupchat_control.py:1861 gajim/groupchat_control.py:1866 #: gajim/groupchat_control.py:1872 #, fuzzy, python-format msgid "%(nick)s has been removed from the room (%(reason)s)" msgstr "%(nick)s a zo bet skarzhet gant %(who)s : %(reason)s" #: gajim/groupchat_control.py:1863 msgid "affiliation changed" msgstr "" #: gajim/groupchat_control.py:1868 msgid "room configuration changed to members-only" msgstr "" #: gajim/groupchat_control.py:1874 msgid "system shutdown" msgstr "" #: gajim/groupchat_control.py:1928 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s by %(actor)s" msgstr "" #: gajim/groupchat_control.py:1932 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s" msgstr "" #: gajim/groupchat_control.py:1947 #, fuzzy, python-format msgid "** Role of %(nick)s has been set to %(role)s by %(actor)s" msgstr "%(nick)s a zo bet skarzhet gant %(who)s : %(reason)s" #: gajim/groupchat_control.py:1951 #, fuzzy, python-format msgid "** Role of %(nick)s has been set to %(role)s" msgstr "%(nick)s a zo bet skarzhet : %(reason)s" #: gajim/groupchat_control.py:1981 #, python-format msgid "%s has left" msgstr "Aet eo kuit %s" #: gajim/groupchat_control.py:1986 #, fuzzy, python-format msgid "%s has joined the group chat" msgstr "Er strollad" #: gajim/groupchat_control.py:2329 #, fuzzy, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Ha sur oc'h e fell deoc'h kuitaat ar flap \"%s\"?" #: gajim/groupchat_control.py:2331 #, fuzzy msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "Ma serrit ar prenestr-mañ, e tigevreoc'h diouzh ar flap-mañ." #: gajim/groupchat_control.py:2550 #, python-format msgid "Kicking %s" msgstr "Skarzhañ %s" #: gajim/groupchat_control.py:2551 gajim/groupchat_control.py:2847 msgid "You may specify a reason below:" msgstr "Bez e c'hellit reiñ un abeg amañ dindan:" #: gajim/groupchat_control.py:2846 #, python-format msgid "Banning %s" msgstr "Argas %s" #: gajim/chat_control.py:328 gajim/chat_control.py:332 #, fuzzy msgid "Jingle File Transfer" msgstr "Treuzkasoù" #: gajim/chat_control.py:334 #, fuzzy msgid "No File Transfer available" msgstr "Treuzkasoù" #: gajim/chat_control.py:395 #, fuzzy msgid "Show a list of formattings" msgstr "Klikit evit enlakaat ur boulomell (Alt+M)" #: gajim/chat_control.py:399 msgid "Formatting is not available so long as GPG is active" msgstr "" #: gajim/chat_control.py:402 #, fuzzy msgid "This contact does not support HTML" msgstr "Ur roll eus an treuzkasoù oberiant, echu pe arsavet" #: gajim/chat_control.py:514 #, python-format msgid "%(type)s state : %(state)s, reason: %(reason)s" msgstr "" #: gajim/chat_control.py:655 #, fuzzy, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s : %(message)s" #: gajim/chat_control.py:903 msgid "Session negotiation cancelled" msgstr "" #: gajim/chat_control.py:913 msgid "This session WILL be archived on server" msgstr "" #: gajim/chat_control.py:915 msgid "This session WILL NOT be archived on server" msgstr "" #: gajim/chat_control.py:924 #, fuzzy msgid "This session is encrypted" msgstr "[Sifret eo ar gemennadenn-mañ]" #: gajim/chat_control.py:927 msgid " and WILL be logged" msgstr "" #: gajim/chat_control.py:929 msgid " and WILL NOT be logged" msgstr "" #: gajim/chat_control.py:934 msgid "" "Remote contact's identity not verified. Click the shield button for more " "details." msgstr "" #: gajim/chat_control.py:936 #, fuzzy msgid "E2E encryption disabled" msgstr "Lazhet eo ar sifrañ" #: gajim/chat_control.py:1235 #, python-format msgid "You just received a new message from \"%s\"" msgstr "O paouez resev ur gemennadenn nevez digant \"%s\" emaoc'h" #: gajim/chat_control.py:1237 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." msgstr "" "Ma serrit ar prenestr-mañ ha n'eo ket enaouet an istoradur, e vo kollet ar " "gemennadenn." #: gajim/chat_control.py:1380 #, fuzzy, python-format msgid "" "Subject: %(subject)s\n" "%(message)s" msgstr "" "Titl : %s\n" "%s" #: gajim/chat_control.py:1494 gajim/gui_interface.py:1197 #, python-format msgid "" "Unable to decrypt message from %s\n" "It may have been tampered with." msgstr "" #: gajim/chat_control.py:1532 #, fuzzy, python-format msgid "%(name)s is now %(status)s" msgstr "%(nick)s a zo bremañ %(status)s" #: gajim/chat_control.py:1591 #, fuzzy msgid "File transfer" msgstr "Treuzkasoù" #: gajim/chat_control.py:1594 #, fuzzy msgid "Size" msgstr "Taille : " #: gajim/chat_control.py:1596 #, fuzzy msgid "Accept" msgstr "Asantiñ" #: gajim/chat_control.py:1650 gajim/disco.py:1753 msgid "_Join" msgstr "E_barzhiñ" #: gajim/chat_control.py:1669 gajim/roster_window.py:1991 #: gajim/gui_interface.py:1013 #, fuzzy msgid "Remote contact stopped transfer" msgstr "Dilemel an darempred diouzh ar roll" #: gajim/chat_control.py:1671 gajim/roster_window.py:1993 #: gajim/gui_interface.py:1016 #, fuzzy msgid "Error opening file" msgstr "Fazi en ur lenn ar restr:" #: gajim/roster_window.py:273 gajim/roster_window.py:1074 msgid "Merged accounts" msgstr "Kontoù strollet" #: gajim/roster_window.py:857 gajim/roster_window.py:1757 #: gajim/roster_window.py:1759 gajim/roster_window.py:2602 #: gajim/roster_window.py:5125 gajim/message_window.py:519 #: gajim/common/contacts.py:133 gajim/common/commands.py:230 #: gajim/common/helpers.py:95 #, fuzzy msgid "Groupchats" msgstr "Flapoù a-stroll" #: gajim/roster_window.py:896 gajim/roster_window.py:1665 #: gajim/roster_window.py:1698 gajim/roster_window.py:1749 #: gajim/roster_window.py:1751 gajim/roster_window.py:1912 #: gajim/roster_window.py:2575 gajim/roster_window.py:5155 gajim/disco.py:130 #: gajim/disco.py:131 gajim/disco.py:1460 gajim/common/contacts.py:135 #: gajim/common/contacts.py:378 gajim/common/helpers.py:95 msgid "Transports" msgstr "Dorioù" #: gajim/roster_window.py:2045 #, fuzzy msgid "Authorization sent" msgstr "Kaset eo bet an aotre" #: gajim/roster_window.py:2046 #, fuzzy, python-format msgid "\"%s\" will now see your status." msgstr "Anavezout a raio \"%s\" ho stad adalek bremañ." #: gajim/roster_window.py:2069 msgid "Subscription request has been sent" msgstr "Kaset eo bet ar goulenn goumanantiñ" #: gajim/roster_window.py:2070 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Ma asant \"%s\" ar c'houmanant e weloc'h he/e stad." #: gajim/roster_window.py:2084 #, fuzzy msgid "Authorization removed" msgstr "Dilamet eo bet an aotre" #: gajim/roster_window.py:2085 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Adalek bremañ e welo ac'hanoc'h \"%s\" atav evel pa vefec'h ezlinenn." #: gajim/roster_window.py:2109 #, fuzzy msgid "OpenPGP is not usable" msgstr "N'eus ket tu da implij OpenPGP war an urzhiataer-mañ" #: gajim/roster_window.py:2110 #, python-format msgid "" "Gajim needs python-gnupg >= 0.3.8\n" "Beware there is an incompatible python package called gnupg.\n" "You will be connected to %s without OpenPGP." msgstr "" #: gajim/roster_window.py:2318 gajim/roster_window.py:3625 msgid "You are participating in one or more group chats" msgstr "Kemer a rit perzh e unan pe meur a webgaoz" #: gajim/roster_window.py:2319 gajim/roster_window.py:3626 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" msgstr "" "Tremen d'ar stad diwelus a lakao ac'hanoc'h da zilugañ diouzh ar webkaozioù-" "se. Ha sur oc'h e fell deoc'h bezañ diwelus?" #: gajim/roster_window.py:2346 msgid "desync'ed" msgstr "" #: gajim/roster_window.py:2416 msgid "Really quit Gajim?" msgstr "" #: gajim/roster_window.py:2417 #, fuzzy msgid "Are you sure you want to quit Gajim?" msgstr "Êtes-vous sûr de vouloir quitter les salons \"%s\" ?" #: gajim/roster_window.py:2418 msgid "Always close Gajim" msgstr "" #: gajim/roster_window.py:2505 #, fuzzy msgid "You have running file transfers" msgstr "Nullañ an treuzkas" #: gajim/roster_window.py:2506 msgid "" "If you quit now, the file(s) being transferred will be stopped. Do you still " "want to quit?" msgstr "" #: gajim/roster_window.py:2537 gajim/roster_window.py:2828 msgid "You have unread messages" msgstr "Kemennadennoù nevez ho peus" #: gajim/roster_window.py:2538 #, fuzzy msgid "" "Messages will only be available for reading them later if you have history " "enabled and contact is in your roster." msgstr "" "Posubl e vo lenn ar gemennadennoù diwezhatoc'h m'emañ an istoradur war enaou." #: gajim/roster_window.py:2829 #, fuzzy msgid "You must read them before removing this transport." msgstr "Lennit an holl zarvoudoù a-raok lemel ar gont-mañ." #: gajim/roster_window.py:2832 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Dilamet e vo an nor \"%s\"" #: gajim/roster_window.py:2833 #, fuzzy msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." msgstr "" "N'helloc'h ket mui kas pe resev kemennadennoù d'an darempredoù liammet gant " "an nor-mañ." #: gajim/roster_window.py:2836 #, fuzzy msgid "Transports will be removed" msgstr "Dilamet e vo an nor \"%s\"" #: gajim/roster_window.py:2841 #, fuzzy, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " "these transports: %s" msgstr "" "N'helloc'h ket mui kas pe resev kemennadennoù d'an darempredoù liammet gant " "an nor-mañ." #: gajim/roster_window.py:2892 #, fuzzy msgid "You are about to block a contact. Are you sure you want to continue?" msgstr "Rankout a rit krouiñ ur gont a-raok gellout flapiñ gant tud all." #: gajim/roster_window.py:2894 msgid "" "This contact will see you offline and you will not receive messages it sends " "you." msgstr "" #: gajim/roster_window.py:2934 #, fuzzy msgid "Rename Contact" msgstr "Darempredoù" #: gajim/roster_window.py:2935 #, fuzzy, python-format msgid "Enter a new nickname for contact %s" msgstr "Roit ho ker-kuzh GPG evit ar gont %s." #: gajim/roster_window.py:2942 #, fuzzy msgid "Rename Group" msgstr "_Adenvel" #: gajim/roster_window.py:2943 #, fuzzy, python-format msgid "Enter a new name for group %s" msgstr "Roit ho ker-kuzh GPG evit ar gont %s." #: gajim/roster_window.py:2988 #, fuzzy msgid "Remove Group" msgstr "_Dilemel" #: gajim/roster_window.py:2989 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "" #: gajim/roster_window.py:2990 #, fuzzy msgid "Also remove all contacts in this group from your roster" msgstr "Dilemel an darempred diouzh ar roll" #: gajim/roster_window.py:3029 msgid "Assign OpenPGP Key" msgstr "Assigner une clé OpenPGP" #: gajim/roster_window.py:3030 #, fuzzy msgid "Select a key to apply to the contact" msgstr "Dibabit un alc'hwezh da" #: gajim/roster_window.py:3436 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Dilamet e vo an darempred \"%s\" diouzh ar roll" #: gajim/roster_window.py:3438 #, python-format msgid "You are about to remove \"%(name)s\" (%(jid)s) from your roster.\n" msgstr "" #: gajim/roster_window.py:3443 #, fuzzy msgid "" "By removing this contact you also remove authorization resulting in them " "always seeing you as offline." msgstr "" "En ur zilemel an darempred-mañ, e tilamit ivez e/he aotre. Atav e welo " "ac'hanoc'h evel pa vefec'h ezlinenn." #: gajim/roster_window.py:3449 #, fuzzy msgid "Do you want to continue?" msgstr "Petra a fell deoc'h ober?" #: gajim/roster_window.py:3453 #, fuzzy msgid "" "By removing this contact you also by default remove authorization resulting " "in them always seeing you as offline." msgstr "" "En ur zilemel an darempred-mañ, e tilamit dre-ziouer he/e aotre. Atav e welo " "ac'hanoc'h evel pa vefec'h ezlinenn." #: gajim/roster_window.py:3456 msgid "I want this contact to know my status after removal" msgstr "Aotreañ an darempred-mañ da welout ma stad war-lerc'h e zilam" #: gajim/roster_window.py:3460 #, fuzzy msgid "Contacts will be removed from your roster" msgstr "Dilamet e vo an darempred \"%s\" diouzh ar roll" #: gajim/roster_window.py:3465 #, fuzzy, python-format msgid "" "By removing these contacts:%s\n" "you also remove authorization resulting in them always seeing you as offline." msgstr "" "En ur zilemel an darempred-mañ, e tilamit ivez e/he aotre. Atav e welo " "ac'hanoc'h evel pa vefec'h ezlinenn." #: gajim/roster_window.py:3523 #, fuzzy msgid "" "You are about to send a custom status. Are you sure you want to continue?" msgstr "Rankout a rit krouiñ ur gont a-raok gellout flapiñ gant tud all." #: gajim/roster_window.py:3525 #, python-format msgid "" "This contact will temporarily see you as %(status)s, but only until you " "change your status. Then they will see your global status." msgstr "" #: gajim/roster_window.py:3544 msgid "No account available" msgstr "Kont ebet hegerz" #: gajim/roster_window.py:3545 msgid "You must create an account before you can chat with other contacts." msgstr "Rankout a rit krouiñ ur gont a-raok gellout flapiñ gant tud all." #: gajim/roster_window.py:3676 gajim/gui_interface.py:2065 #: gajim/dialog_messages.py:64 #, fuzzy msgid "You cannot join a group chat while you are invisible" msgstr "N'hellit ket ebarzhiñ ur webgaoz keit ha m'emaoc'h diwelus." #: gajim/roster_window.py:4178 msgid "Metacontacts storage not supported by your server" msgstr "" #: gajim/roster_window.py:4180 msgid "" "Your server does not support storing metacontacts information. So this " "information will not be saved on next reconnection." msgstr "" #: gajim/roster_window.py:4276 #, fuzzy msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "Rankout a rit krouiñ ur gont a-raok gellout flapiñ gant tud all." #: gajim/roster_window.py:4278 msgid "" "Metacontacts are a way to regroup several contacts in one line. Generally it " "is used when the same person has several XMPP accounts or transport accounts." msgstr "" #: gajim/roster_window.py:4400 #, fuzzy msgid "Invalid file URI:" msgstr "Restr direizh" #: gajim/roster_window.py:4412 #, fuzzy, python-format msgid "Do you want to send this file to %s:" msgid_plural "Do you want to send these files to %s:" msgstr[0] "Fellout a ra da %s kas deoc'h ur restr:" msgstr[1] "Fellout a ra da %s kas deoc'h ur restr:" #: gajim/roster_window.py:4552 #, fuzzy, python-format msgid "Send %(from)s to %(to)s" msgstr "Kas %s" #: gajim/roster_window.py:4565 #, fuzzy, python-format msgid "Make %s first contact" msgstr "Strollañ %s ha %s" #: gajim/roster_window.py:4570 #, fuzzy, python-format msgid "Make %(contact1)s and %(contact2)s metacontacts" msgstr "Strollañ %s ha %s" #: gajim/roster_window.py:4951 gajim/roster_window.py:5049 msgid "_Change Status Message" msgstr "_Kemmañ an titour-stad" #: gajim/roster_window.py:4971 #, fuzzy msgid "Publish Tune" msgstr "_Embann" #: gajim/roster_window.py:4982 #, fuzzy msgid "Publish Location" msgstr "_Embann" #: gajim/roster_window.py:4994 #, fuzzy msgid "Configure Services…" msgstr "_Dizoleiñ ar servijoù..." #: gajim/roster_window.py:5127 msgid "_Maximize All" msgstr "" #: gajim/roster_window.py:5134 gajim/roster_window.py:5296 #, fuzzy msgid "Send Group M_essage" msgstr "_Kas ur gemennadenn d'ar servijer" #: gajim/roster_window.py:5141 msgid "To all users" msgstr "" #: gajim/roster_window.py:5145 #, fuzzy msgid "To all online users" msgstr "Utilisateurs En _Ligne" #: gajim/roster_window.py:5157 gajim/roster_window.py:5302 #: gajim/data/gui/gc_occupants_menu.ui:110 #: gajim/data/gui/contact_context_menu.ui:36 msgid "In_vite to" msgstr "" #: gajim/roster_window.py:5312 #, fuzzy msgid "_Manage Contacts" msgstr "Darempredoù" #: gajim/roster_window.py:5318 #, fuzzy msgid "Edit _Groups…" msgstr "Kemmañ ar _strolladoù" #: gajim/roster_window.py:5339 gajim/data/gui/filetransfers.ui:11 #: gajim/data/gui/remove_account_window.ui:137 msgid "_Remove" msgstr "_Dilemel" #: gajim/roster_window.py:5377 msgid "_Maximize" msgstr "" #: gajim/roster_window.py:5384 #, fuzzy msgid "_Reconnect" msgstr "Darempred diluget" #: gajim/roster_window.py:5389 gajim/data/gui/gc_control_popup_menu.ui:120 #, fuzzy msgid "_Disconnect" msgstr "Darempred diluget" #: gajim/roster_window.py:5405 gajim/data/gui/gc_occupants_menu.ui:170 #: gajim/data/gui/gc_control_popup_menu.ui:113 #: gajim/data/gui/contact_context_menu.ui:228 msgid "_History" msgstr "_Istoradur" #: gajim/roster_window.py:5481 gajim/data/gui/application_menu.ui:86 msgid "History Manager" msgstr "Merour an istoradur" #: gajim/roster_window.py:5489 #, fuzzy msgid "_Join New Group Chat" msgstr "Ebarzhiñ ur sal-flapiñ" #: gajim/gajim.py:74 #, fuzzy msgid "Show the application's version" msgstr "_Implij an arlun-gelaouiñ (trayicon)" #: gajim/gajim.py:77 #, fuzzy msgid "Show only critical errors" msgstr "Diskouez er _roll hepken" #: gajim/gajim.py:80 msgid "Separate profile files completely (even history db and plugins)" msgstr "" #: gajim/gajim.py:84 msgid "Print XML stanzas and other debug information" msgstr "" #: gajim/gajim.py:88 #, fuzzy msgid "Use defined profile in configuration directory" msgstr "Aozer kefluniañ dre ar munut" #: gajim/gajim.py:92 #, fuzzy msgid "Set configuration directory" msgstr "Kefluniañ ar webgaoz" #: gajim/gajim.py:95 msgid "Configure logging system" msgstr "" #: gajim/gajim.py:98 #, fuzzy msgid "Show all warnings" msgstr "Diskouez an holl _zarvoudoù o c'hortoz" #: gajim/gajim.py:101 msgid "Open IPython shell" msgstr "" #: gajim/gajim.py:104 #, fuzzy msgid "Pops up a window with the next pending event" msgstr "A zifoup ur prenestr gant ar gemennadenn dilenn da-heul" #: gajim/gajim.py:107 gajim/data/gui/shortcuts_window.ui:202 #, fuzzy msgid "Start a new chat" msgstr "Kregiñ da flapiñ" #: gajim/gajim.py:180 gajim/gui_interface.py:128 msgid "Database Error" msgstr "" #: gajim/history_sync.py:217 #, fuzzy msgid "How far back do you want to go?" msgstr "Petra a fell deoc'h ober?" #: gajim/history_sync.py:222 msgid "One Month" msgstr "" #: gajim/history_sync.py:223 msgid "Three Months" msgstr "" #: gajim/history_sync.py:224 msgid "One Year" msgstr "" #: gajim/history_sync.py:225 msgid "Everything" msgstr "" #: gajim/history_sync.py:254 #, fuzzy msgid "Connecting..." msgstr "O lugañ" #: gajim/history_sync.py:266 #, fuzzy, python-format msgid "%(received)s of %(max)s" msgstr "Arsavet eo an treuskas eus %(filename)s digant %(name)s." #: gajim/history_sync.py:270 #, fuzzy, python-format msgid "Downloaded %s Messages" msgstr "Gajim - %d gemennadenn nevez" #: gajim/history_sync.py:290 #, python-brace-format msgid "" "\n" " Finshed synchronising your History.\n" " {received} Messages downloaded.\n" " " msgstr "" #: gajim/history_sync.py:297 msgid "" "\n" " Gajim is fully synchronised\n" " with the Archive.\n" " " msgstr "" #: gajim/history_sync.py:304 msgid "" "\n" " There is already a synchronisation in\n" " progress. Please try later.\n" " " msgstr "" #: gajim/config.py:150 gajim/config.py:156 gajim/config.py:616 #: gajim/data/gui/preferences_window.ui:68 #: gajim/data/gui/preferences_window.ui:85 msgid "Disabled" msgstr "Dizoberiant" #: gajim/config.py:411 gajim/config.py:415 gajim/config.py:1942 #, fuzzy msgid "Default" msgstr "Dilemel" #: gajim/config.py:1128 msgid "status message title" msgstr "titl ar gemennadenn stad" #: gajim/config.py:1129 msgid "status message text" msgstr "korf ar gemennadenn stad" #: gajim/config.py:1517 #, python-format msgid "Edit %s" msgstr "Kemmañ %s" #: gajim/config.py:1519 #, python-format msgid "Register to %s" msgstr "Emezelañ war %s" #: gajim/config.py:1555 msgid "Ban List" msgstr "Roll argas" #: gajim/config.py:1556 msgid "Member List" msgstr "Roll an izili" #: gajim/config.py:1556 msgid "Owner List" msgstr "Roll ar perc'hennerien" #: gajim/config.py:1557 msgid "Administrator List" msgstr "Roll ar verourien" #: gajim/config.py:1631 msgid "Reason" msgstr "Abeg" #: gajim/config.py:1638 msgid "Nick" msgstr "Lesanv" #: gajim/config.py:1644 msgid "Role" msgstr "Perzh" #: gajim/config.py:1670 #, fuzzy msgid "Banning…" msgstr "Oc'h argas..." #: gajim/config.py:1672 msgid "" "Whom do you want to ban?\n" "\n" msgstr "" "Piv a fell deoc'h argas ?\n" "\n" #: gajim/config.py:1674 #, fuzzy msgid "Adding Member…" msgstr "Oc'h ouzhpennañ un ezel..." #: gajim/config.py:1675 msgid "" "Whom do you want to make a member?\n" "\n" msgstr "" "Piv a fell deoc'h lakaat da ezel ?\n" "\n" #: gajim/config.py:1677 #, fuzzy msgid "Adding Owner…" msgstr "Oc'h ouzhpennañ ur perc'henn..." #: gajim/config.py:1678 #, fuzzy msgid "" "Whom do you want to make an owner?\n" "\n" msgstr "" "Piv a fell deoc'h lakaat da berc'henn ?\n" "\n" #: gajim/config.py:1680 #, fuzzy msgid "Adding Administrator…" msgstr "Oc'h ouzhpennañ ur v-merour-ez..." #: gajim/config.py:1681 msgid "" "Whom do you want to make an administrator?\n" "\n" msgstr "" "Piv a fell deoc'h lakaat da verour-ez ?\n" "\n" #: gajim/config.py:1682 #, fuzzy msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" "2. user@domain (any resource matches).\n" "3. domain/resource (only that resource matches).\n" "4. domain (the domain itself matches, as does any user@domain,\n" "domain/resource, or address containing a subdomain)." msgstr "" "A c'hell bezañ unan eus ar stummoù da heul :\n" "1. lesanv@domani/resource(seulement cette ressource correspond).\n" "2. pseudo@domaine (toutes les ressources correspondent).\n" "3. domaine/ressources (seulement cette ressource correspond).\n" "4. domaine (le domaine complet correspond, incluant tous les " "pseudo@domaine,\n" "domaine/ressource, ou les adresses comprenant un sous-domaine)." #: gajim/config.py:1783 #, python-format msgid "Removing %s account" msgstr "Lemel ar gont %s" #: gajim/config.py:1798 #, fuzzy msgid "Account is disabled" msgstr "Lazhet eo ar sifrañ" #: gajim/config.py:1799 msgid "To unregister from a server, account must be enabled." msgstr "" #: gajim/config.py:1813 gajim/gui_interface.py:314 gajim/gui_interface.py:748 msgid "Password Required" msgstr "Ger-kuzh ret" #: gajim/config.py:1814 gajim/gui_interface.py:733 #, python-format msgid "Enter your password for account %s" msgstr "Roit ho ker-kuzh evit ar gont %s" #: gajim/config.py:1815 gajim/gui_interface.py:748 msgid "Save password" msgstr "Enrollañ ar ger-kuzh" #: gajim/config.py:1826 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Luget eo ar gont \"%s\" d'ar servijer" #: gajim/config.py:1827 msgid "If you remove it, the connection will be lost." msgstr "Ma tilamit anezhañ, e voc'h diluget." #: gajim/config.py:1842 #, fuzzy, python-format msgid "Connection to server %s failed" msgstr "Kevreadenn" #: gajim/config.py:1843 #, fuzzy msgid "What would you like to do?" msgstr "Petra a fell deoc'h ober?" #: gajim/config.py:1844 #, fuzzy msgid "Remove only from Gajim" msgstr "Dilemel ar gont diwar Gajim _hepken" #: gajim/config.py:1845 msgid "Don't remove anything. I'll try again later" msgstr "" #: gajim/config.py:1942 #, fuzzy msgid "?print_status:All" msgstr "Diskouez an eur:" #: gajim/config.py:1943 msgid "Enter and leave only" msgstr "" #: gajim/config.py:1944 #, fuzzy msgid "?print_status:None" msgstr "Diskouez an eur:" #: gajim/config.py:2010 #, fuzzy msgid "New Group Chat" msgstr "Flap a-stroll" #: gajim/config.py:2046 msgid "This bookmark has invalid data" msgstr "Bez ez eus titouroù direizh er sined-mañ" #: gajim/config.py:2047 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "" "Gwiriekait ho peus leuniet an takadoù servijer ha sal-flapiñ pe lamit ar " "sined-mañ." #: gajim/config.py:2170 gajim/config.py:2186 gajim/config.py:2197 #: gajim/config.py:2225 #, fuzzy msgid "Character not allowed" msgstr "N'eus ket bet kavet al lesanv : %s" #: gajim/config.py:2185 gajim/config.py:2196 gajim/config.py:2475 #, fuzzy msgid "Invalid server" msgstr "Anv-arveriad-ez direizh" #: gajim/config.py:2224 #, fuzzy msgid "Invalid room" msgstr "Road direizh" #: gajim/config.py:2389 msgid "Account has been added successfully" msgstr "Gant berzh eo bet ouzhpennet ar gont!" #: gajim/config.py:2390 gajim/config.py:2396 #, fuzzy msgid "" "You can set advanced account options by pressing the Advanced button, or " "later by choosing the Accounts menu item under the Edit menu from the main " "window." msgstr "" "Bez e c'hellit aozañ dibaboù araoket ar gont en ur pouezañ war an nozelenn " "Araoket, pe hen ober diwezhatoc'h en ur glikañ war Kontoù er meuziad Aozañ " "eus ar prenestr pennañ." #: gajim/config.py:2395 msgid "Your new account has been created successfully" msgstr "Gant berzh eo bet krouet ho kont nevez!" #: gajim/config.py:2433 msgid "Invalid username" msgstr "Anv-arveriad-ez direizh" #: gajim/config.py:2435 msgid "You must provide a username to configure this account." msgstr "Rankout a rit reiñ un anv-arveriad-ez evit kefluniañ ar gont-mañ." #: gajim/config.py:2476 #, fuzzy msgid "Please provide a server on which you want to register." msgstr "Skrivit al lesanv nevez a fell deoc'h implij:" #: gajim/config.py:2499 msgid "Invalid entry" msgstr "Road direizh" #: gajim/config.py:2500 msgid "Custom port must be a port number." msgstr "Ar porzh personelaet a rank bezañ un niverenn borzh" #: gajim/config.py:2532 gajim/gui_interface.py:1360 #, fuzzy msgid "Certificate Already in File" msgstr "Darempred er roll dija" #: gajim/config.py:2533 gajim/gui_interface.py:1361 #, python-format msgid "This certificate is already in file %s, so it's not added again." msgstr "" #: gajim/config.py:2626 #, python-format msgid "" "Security Warning\n" "\n" "The authenticity of the %(hostname)s SSL certificate could be invalid.\n" "SSL Error: %(error)s\n" "Do you still want to connect to this server?" msgstr "" #: gajim/config.py:2632 #, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA-1 fingerprint of the certificate:\n" "%(sha1)s\n" "SHA-256 fingerprint of the certificate:\n" "%(sha256)s" msgstr "" #: gajim/config.py:2666 gajim/config.py:2700 #, fuzzy msgid "An error occurred during account creation" msgstr "Bez ez eus bet ur fazi en ur grouiñ ar gont" #: gajim/config.py:2763 msgid "Account name is in use" msgstr "Implijet eo an anv-kont dija" #: gajim/config.py:2764 msgid "You already have an account using this name." msgstr "Bez ho peus ur gont gant an anv-se dija." #: gajim/config.py:2896 msgid "PEP node was not removed" msgstr "" #: gajim/config.py:2897 #, python-format msgid "PEP node %(node)s was not removed: %(message)s" msgstr "" #: gajim/config.py:2925 #, fuzzy, python-format msgid "Configure %s" msgstr "_Kenderc'hel" #: gajim/config.py:2942 gajim/plugins/gui.py:95 msgid "Active" msgstr "Oberiant" #: gajim/config.py:2950 msgid "Event" msgstr "Darvoud" #: gajim/config.py:2984 #, fuzzy msgid "Attention Message Received" msgstr "Kemennadenn gentañ" #: gajim/config.py:2985 msgid "First Message Received" msgstr "Kemennadenn gentañ" #: gajim/config.py:2986 #, fuzzy msgid "Next Message Received Focused" msgstr "Kemennadenn da-heul" #: gajim/config.py:2988 #, fuzzy msgid "Next Message Received Unfocused" msgstr "Kemennadenn da-heul" #: gajim/config.py:2989 msgid "Contact Connected" msgstr "Darempred luget" #: gajim/config.py:2990 msgid "Contact Disconnected" msgstr "Darempred diluget" #: gajim/config.py:2991 msgid "Message Sent" msgstr "Kemennadenn gaset" #: gajim/config.py:2992 msgid "Group Chat Message Highlight" msgstr "Message d'un Salon mis en Sur-brillance" #: gajim/config.py:2993 msgid "Group Chat Message Received" msgstr "Kemennadenn digant ur sal-flapiñ" #: gajim/tooltips.py:240 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "" #: gajim/tooltips.py:269 gajim/common/helpers.py:473 #, fuzzy msgid "?Group Chat Contact Affiliation:None" msgstr "Hini ebet" #: gajim/tooltips.py:271 gajim/common/helpers.py:479 #, fuzzy msgid "Member" msgstr "_Ezel" #: gajim/tooltips.py:273 gajim/common/helpers.py:477 #, fuzzy msgid "Administrator" msgstr "_Merour-ez" #: gajim/tooltips.py:275 gajim/common/helpers.py:475 #, fuzzy msgid "Owner" msgstr "_Perc'hener-ez" #: gajim/tooltips.py:433 msgid " [blocked]" msgstr "" #: gajim/tooltips.py:437 msgid " [minimized]" msgstr "" #: gajim/tooltips.py:609 #, fuzzy msgid "Connected" msgstr "Kevreadenn" #: gajim/tooltips.py:611 #, fuzzy msgid "Disconnected" msgstr "Darempred diluget" #: gajim/tooltips.py:660 #, fuzzy msgid "?Noun:Download" msgstr "Pellgargañ" #: gajim/tooltips.py:666 #, fuzzy msgid "?Noun:Upload" msgstr "Kas" #: gajim/tooltips.py:673 msgid "Type: " msgstr "Doare:" #: gajim/tooltips.py:679 msgid "Transferred: " msgstr "Treuzkaset:" #: gajim/tooltips.py:682 gajim/tooltips.py:699 msgid "Not started" msgstr "N'eo ket kroget" #: gajim/tooltips.py:684 msgid "Stopped" msgstr "Arsavet" #: gajim/tooltips.py:686 gajim/tooltips.py:689 msgid "Completed" msgstr "Echu" #: gajim/tooltips.py:692 #, fuzzy msgid "?transfer status:Paused" msgstr "Diskouez an eur:" #: gajim/tooltips.py:695 msgid "Stalled" msgstr "" #: gajim/tooltips.py:697 msgid "Transferring" msgstr "O treuzkas" #: gajim/tooltips.py:700 msgid "Status: " msgstr "Stad:" #: gajim/tooltips.py:732 gajim/common/helpers.py:389 #, fuzzy msgid "?user status:Available" msgstr "Diskouez an eur:" #: gajim/tooltips.py:734 gajim/common/helpers.py:384 msgid "Free for Chat" msgstr "Prest da flapiñ" #: gajim/tooltips.py:736 gajim/common/commands.py:117 #: gajim/common/helpers.py:396 #: gajim/command_system/implementation/standard.py:138 msgid "Away" msgstr "Ezvezant" #: gajim/tooltips.py:738 gajim/common/helpers.py:374 msgid "Busy" msgstr "" #: gajim/tooltips.py:740 gajim/common/helpers.py:379 msgid "Not Available" msgstr "Dihegerz" #: gajim/tooltips.py:742 gajim/common/helpers.py:401 msgid "Offline" msgstr "Ezlinenn" #: gajim/advanced_configuration_window.py:88 #, fuzzy msgid "Activated" msgstr "Oberiant" #: gajim/advanced_configuration_window.py:88 #, fuzzy msgid "Deactivated" msgstr "Dizoberiant" #: gajim/advanced_configuration_window.py:90 msgid "Boolean" msgstr "" #: gajim/advanced_configuration_window.py:91 #, fuzzy msgid "Integer" msgstr "Er strollad" #: gajim/advanced_configuration_window.py:92 msgid "Text" msgstr "Texte" #: gajim/advanced_configuration_window.py:93 #: gajim/data/gui/groupchat_control.ui:54 gajim/data/gui/chat_control.ui:334 msgid "Color" msgstr "" #: gajim/advanced_configuration_window.py:104 msgid "Preference Name" msgstr "Dibab" #: gajim/advanced_configuration_window.py:111 msgid "Value" msgstr "Talvoud" #: gajim/advanced_configuration_window.py:120 msgid "Type" msgstr "Doare" #: gajim/advanced_configuration_window.py:176 msgid "(None)" msgstr "(Hini ebet)" #: gajim/advanced_configuration_window.py:307 msgid "Hidden" msgstr "Elfennoù kuzh" #: gajim/logind_listener.py:58 msgid "Machine going to sleep" msgstr "" #: gajim/logind_listener.py:90 msgid "Disconnect from the network" msgstr "" #: gajim/history_window.py:339 #, python-format msgid "Conversation History with %s" msgstr "Istoradur flapiñ gant %s" #: gajim/history_window.py:361 gajim/data/gui/history_window.ui:7 msgid "Conversation History" msgstr "Istoradur ar gaoz" #: gajim/history_window.py:390 gajim/history_window.py:443 msgid "Disk Error" msgstr "" #: gajim/history_window.py:546 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s a zo bremañ %(status)s : %(status_msg)s" #: gajim/history_window.py:557 #, fuzzy, python-format msgid "Error: %s" msgstr "Fazi en ur lenn ar restr:" #: gajim/history_window.py:559 msgid "Error" msgstr "" #: gajim/history_window.py:561 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Ar stad a zo bremañ: %(status)s: %(status_msg)s" #: gajim/history_window.py:564 #, python-format msgid "Status is now: %(status)s" msgstr "Ar stad a zo bremañ: %(status)s" #: gajim/history_window.py:585 gajim/conversation_textview.py:1338 #, python-format msgid "Subject: %s\n" msgstr "Sujed: %s\n" #: gajim/statusicon.py:215 #, fuzzy msgid "_Change Status Message…" msgstr "_Kemmañ an titour-stad" #: gajim/statusicon.py:252 gajim/statusicon.py:302 gajim/statusicon.py:309 #, python-format msgid "using account %s" msgstr "en ur implij ar gont %s" #: gajim/statusicon.py:319 #, fuzzy msgid "_Manage Bookmarks…" msgstr "Merañ ar sinedoù" #: gajim/statusicon.py:332 #, fuzzy msgid "Hide _Roster" msgstr "Ket er roll" #: gajim/statusicon.py:336 msgid "Show _Roster" msgstr "Diskouez ar _roll-darempredoù" #: gajim/statusicon.py:344 msgid "Hide this menu" msgstr "Kuzhat ar meuziad-mañ" #: gajim/dataforms_widget.py:587 #, fuzzy msgid "Unable to load image" msgstr "Impossible de rejoindre le salon" #: gajim/dataforms_widget.py:589 #, python-format msgid "Media type not supported: %s" msgstr "" #: gajim/dataforms_widget.py:604 msgid "This field is required" msgstr "" #: gajim/dataforms_widget.py:658 msgid "new@jabber.id" msgstr "" #: gajim/dataforms_widget.py:661 gajim/dataforms_widget.py:663 #, python-format msgid "new%d@jabber.id" msgstr "" #: gajim/server_info.py:130 #, python-format msgid "%(days)s days, %(hours)s hours" msgstr "" #: gajim/server_info.py:187 gajim/accounts_window.py:537 #: gajim/accounts_window.py:638 #, fuzzy msgid "Hostname" msgstr "Servijer:" #: gajim/server_info.py:188 #, fuzzy msgid "Server Software" msgstr "Perzhioù ar servijerien" #: gajim/server_info.py:189 #, fuzzy msgid "Server Uptime" msgstr "Enrollet e-barzh: %s" #: gajim/server_info.py:227 msgid "" "\n" "Disabled in config" msgstr "" #: gajim/disco.py:69 msgid "This service has not yet responded with detailed information" msgstr "N'eus ket bet kaset titouroù munut gant ar servij-mañ c'hoazh" #: gajim/disco.py:70 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" msgstr "" "N'eus ket bet kaset titouroù munut gant ar servij-mañ.\n" "Sur 'walc'h eo torr pe kamm" #: gajim/disco.py:129 msgid "Others" msgstr "Traoù all" #: gajim/disco.py:133 msgid "Conference" msgstr "Kendiviz" #: gajim/disco.py:537 msgid "Without a connection, you can not browse available services" msgstr "Rankout a rit bezañ luget evit gellout furchal er servijoù hegerz" #: gajim/disco.py:626 #, python-format msgid "Service Discovery using account %s" msgstr "Merañ servijoù ar gont %s" #: gajim/disco.py:628 msgid "Service Discovery" msgstr "Merañ ar servijoù" #: gajim/disco.py:732 msgid "The service could not be found" msgstr "N'eo ket bet kavet ar servij" #: gajim/disco.py:733 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." msgstr "" "N'eus servij ebet er chomlec'h roet, pe ne respont ket. Gwiriekait ar " "chomlec'h ha klaskit en-dro." #: gajim/disco.py:739 gajim/disco.py:1091 msgid "The service is not browsable" msgstr "N'eus ket tu furchal er servij" #: gajim/disco.py:740 msgid "This type of service does not contain any items to browse." msgstr "N'eus elfenn ebet da furchal e seurt servijoù." #: gajim/disco.py:781 gajim/disco.py:791 #, fuzzy msgid "Invalid Server Name" msgstr "Anv-arveriad-ez direizh" #: gajim/disco.py:849 #, fuzzy, python-format msgid "Browsing %(address)s using account %(account)s" msgstr "O furchal e-barzh %s oc'h implij ar gont %s" #: gajim/disco.py:896 #, fuzzy msgid "Browse" msgstr "_Furchal" #: gajim/disco.py:1092 msgid "This service does not contain any items to browse." msgstr "N'eus elfenn ebet da furchal er servij-mañ." #: gajim/disco.py:1304 #, fuzzy msgid "Execute Command" msgstr "urzhiad" #: gajim/disco.py:1308 gajim/disco.py:1466 msgid "Re_gister" msgstr "_Emezelañ" #: gajim/disco.py:1317 gajim/data/gui/join_groupchat_window.ui:186 #: gajim/data/gui/join_groupchat_window.ui:325 #, fuzzy msgid "Join" msgstr "E_barzhiñ" #: gajim/disco.py:1326 gajim/data/gui/search_window.ui:23 msgid "Search" msgstr "Klask" #: gajim/disco.py:1464 msgid "_Edit" msgstr "_Aozañ" #: gajim/disco.py:1507 #, python-format msgid "Scanning %(current)d / %(total)d.." msgstr "" #: gajim/disco.py:1703 msgid "Users" msgstr "Arveridi" #: gajim/disco.py:1711 msgid "Description" msgstr "Taolennadur" #: gajim/disco.py:1719 msgid "Id" msgstr "" #: gajim/disco.py:1749 gajim/data/gui/gc_control_popup_menu.ui:99 #, fuzzy msgid "_Bookmark" msgstr "_Ouzhpennañ ar webgaoz d'ar sinedoù" #: gajim/disco.py:1783 msgid "Bookmark already set" msgstr "Sined lakaet dija" #: gajim/disco.py:1784 #, fuzzy, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Emañ ar flap \"%s\" en ho sinedoù dija." #: gajim/disco.py:1794 msgid "Bookmark has been added successfully" msgstr "Gant berzh eo bet ouzhpennet ar sined" #: gajim/disco.py:1795 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "" "Bez e c'hellit merañ ho sinedoù dre ar meuziad Oberoù er roll-darempredoù." #: gajim/disco.py:1987 #, fuzzy msgid "Subscribed" msgstr "Emezelañ" #: gajim/disco.py:1996 #, fuzzy msgid "Node" msgstr "Hini ebet" #: gajim/disco.py:2063 msgid "New post" msgstr "" #: gajim/disco.py:2069 msgid "_Subscribe" msgstr "_Koumanantiñ" #: gajim/disco.py:2075 #, fuzzy msgid "_Unsubscribe" msgstr "_Koumanantiñ" #: gajim/conversation_textview.py:329 #, fuzzy msgid "" "Text below this line is what has been said since the\n" "last time you paid attention to this group chat" msgstr "" "Dindan al linenn e welit ar pezh a zo bet lâret er sal-flapiñ dibaoe ar wech " "diwezhañ ho peus taolet ur sell ennañ." #: gajim/conversation_textview.py:550 #, fuzzy msgid "_Quote" msgstr "_Kuitaat" #: gajim/conversation_textview.py:558 #, fuzzy, python-format msgid "_Actions for \"%s\"" msgstr "Oberoù evit \"%s\"" #: gajim/conversation_textview.py:572 msgid "Read _Wikipedia Article" msgstr "Lenn pennad _Wikipedia" #: gajim/conversation_textview.py:577 msgid "Look it up in _Dictionary" msgstr "Klask er _geriadur" #: gajim/conversation_textview.py:594 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "" "Mankout a ra un \"%s\" e-barzh URL ar geriaoueg, ha n'eo ket WIKTIONARY" #: gajim/conversation_textview.py:608 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "Mankout a ra un \"%s\" e-barzh URL ar webklask" #: gajim/conversation_textview.py:611 msgid "Web _Search for it" msgstr "Web_klask" #: gajim/conversation_textview.py:617 msgid "Open as _Link" msgstr "" #: gajim/conversation_textview.py:847 msgid "URL:" msgstr "" #: gajim/conversation_textview.py:1021 #, fuzzy msgid "Invalid URL" msgstr "ID jabber direizh" #: gajim/conversation_textview.py:1106 msgid "" "Message corrected. Original message:\n" "{}" msgstr "" #: gajim/conversation_textview.py:1250 #, fuzzy, python-format msgid "Yesterday" msgid_plural "%(nb_days)i days ago" msgstr[0] "Dec'h" msgstr[1] "Dec'h" #: gajim/message_textview.py:43 #, fuzzy msgid "Write a message.." msgstr "Kemennadenn hiniennel nevez" #: gajim/message_window.py:245 #, fuzzy msgid "You are going to close several tabs" msgstr "N'oc'h ket luget d'ar servijer" #: gajim/message_window.py:246 #, fuzzy msgid "Do you really want to close them all?" msgstr "Ha fellout a ra deoc'h da vat diverkañ ar gemennadenn ziuzet?" #: gajim/message_window.py:517 #, fuzzy msgid "?Noun:Chats" msgstr "Flapoù a-stroll" #: gajim/message_window.py:521 msgid "Private Chats" msgstr "Flapoù prevez" #: gajim/message_window.py:527 msgid "Messages" msgstr "Kemennadennoù" #: gajim/gui_interface.py:158 gajim/gui_interface.py:329 #: gajim/gui_interface.py:338 gajim/gui_interface.py:345 #: gajim/gui_interface.py:349 gajim/gui_interface.py:352 #: gajim/gui_interface.py:360 #, fuzzy msgid "Unable to join group chat" msgstr "Impossible de rejoindre le salon" #: gajim/gui_interface.py:159 #, fuzzy, python-format msgid "" "Your desired nickname in group chat\n" "%s\n" "is in use or registered by another occupant.\n" "Please specify another nickname below:" msgstr "" "Le surnom que vous vouliez utiliser est actuellement utilisé ou enregistré " "par un autre occupant.\n" "Veuillez entrer un autre surnom ci-dessous :" #: gajim/gui_interface.py:163 msgid "Always use this nickname when there is a conflict" msgstr "" #: gajim/gui_interface.py:181 msgid "Do you accept this request?" msgstr "Degemer a rit ar goulenn-mañ?" #: gajim/gui_interface.py:183 #, fuzzy, python-format msgid "Do you accept this request on account %s?" msgstr "Degemer a rit ar goulenn-mañ?" #: gajim/gui_interface.py:186 #, fuzzy, python-format msgid "HTTP (%(method)s) Authorization for %(url)s (ID: %(id)s)" msgstr "Aotre HTTP (%s) evit %s (id : %s)" #: gajim/gui_interface.py:230 gajim/notify.py:96 #, fuzzy msgid "Connection Failed" msgstr "Kevreadenn" #: gajim/gui_interface.py:315 #, fuzzy, python-format msgid "A Password is required to join the room %s. Please type it." msgstr "Un mot de passe est requis pour rejoindre ce salon." #: gajim/gui_interface.py:330 #, fuzzy, python-format msgid "%s is full" msgstr "Sonioù" #: gajim/gui_interface.py:339 #, fuzzy, python-format msgid "You are banned from group chat %s." msgstr "Vous êtes banni de ce salon." #: gajim/gui_interface.py:346 #, fuzzy, python-format msgid "Remote server %s does not exist." msgstr "Ce salon n'existe pas." #: gajim/gui_interface.py:350 #, fuzzy, python-format msgid "Group chat %s does not exist." msgstr "Ce salon n'existe pas." #: gajim/gui_interface.py:353 #, fuzzy msgid "Group chat creation is not permitted." msgstr "La création de salon est réservée aux administrateurs." #: gajim/gui_interface.py:355 #, fuzzy msgid "Unable to join groupchat" msgstr "Impossible de rejoindre le salon" #: gajim/gui_interface.py:356 #, fuzzy, python-format msgid "You must use your registered nickname in %s." msgstr "Vous devez utiliser le surnom donné lors de l'enregistrement." #: gajim/gui_interface.py:361 #, fuzzy, python-format msgid "You are not in the members list in groupchat %s." msgstr "Vous n'êtes pas dans la liste des membres." #: gajim/gui_interface.py:455 gajim/gui_interface.py:459 #, fuzzy, python-format msgid "Error %(code)s: %(msg)s" msgstr "%(nickname)s : %(message)s" #: gajim/gui_interface.py:470 gajim/gui_interface.py:486 #: gajim/common/connection_handlers_events.py:1430 #, fuzzy, python-format msgid "error while sending %(message)s ( %(error)s )" msgstr "fazi en ur gas %s ( %s )" #: gajim/gui_interface.py:513 gajim/notify.py:96 #, fuzzy msgid "Subscription request" msgstr "Goulenn koumanantiñ" #: gajim/gui_interface.py:524 gajim/common/contacts.py:131 #: gajim/common/helpers.py:95 msgid "Observers" msgstr "Sellerien" #: gajim/gui_interface.py:538 msgid "Authorization accepted" msgstr "Aotre degmeret" #: gajim/gui_interface.py:539 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "Aotreet oc'h bet gant \"%s\" da welet e stad." #: gajim/gui_interface.py:547 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Dilamet eo bet ho aotre digant \"%s\"" #: gajim/gui_interface.py:548 msgid "" "You will always see them as offline.\n" "Do you want to remove them from your contact list?" msgstr "" #: gajim/gui_interface.py:570 gajim/notify.py:96 #, fuzzy msgid "Unsubscribed" msgstr "_Koumanantiñ" #: gajim/gui_interface.py:582 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "N'eus ket tu da dizhout \"%s\"" #: gajim/gui_interface.py:583 gajim/common/connection.py:1288 #: gajim/common/connection.py:1474 msgid "Check your connection or try again later." msgstr "Gwiriekait ho lugadenn pe klaskit diwezhatoc'h." #: gajim/gui_interface.py:641 #, python-format msgid "%(jid)s declined the invitation: %(reason)s" msgstr "" #: gajim/gui_interface.py:645 #, python-format msgid "%(jid)s declined the invitation" msgstr "" #: gajim/gui_interface.py:675 msgid "" "You configured Gajim to use OpenPGP agent, but there is no OpenPGP agent " "running or it returned a wrong passphrase.\n" msgstr "" #: gajim/gui_interface.py:678 gajim/gui_interface.py:686 msgid "You are currently connected without your OpenPGP key." msgstr "Luget oc'h hep hoc'h alc'hwezh OpenPGP." #: gajim/gui_interface.py:680 #, fuzzy msgid "Wrong passphrase" msgstr "Ger-kuzh faos" #: gajim/gui_interface.py:685 #, fuzzy msgid "Wrong OpenPGP passphrase" msgstr "Ger-kuzh faos" #: gajim/gui_interface.py:699 #, fuzzy msgid "Certificate Passphrase Required" msgstr "Ger-kuzh ret" #: gajim/gui_interface.py:700 #, fuzzy, python-format msgid "Enter the certificate passphrase for account %s" msgstr "Roit ho ker-kuzh GPG evit ar gont %s." #: gajim/gui_interface.py:723 #, fuzzy msgid "Untrusted OpenPGP key" msgstr "Dibabit hoc'h alc'hwezh OpenPGP" #: gajim/gui_interface.py:723 msgid "" "The OpenPGP key used to encrypt this chat is not trusted. Do you really want " "to encrypt this message?" msgstr "" #: gajim/gui_interface.py:769 msgid "" "Please copy / paste the refresh token from the website that has just been " "opened." msgstr "" #: gajim/gui_interface.py:772 msgid "Oauth2 Credentials" msgstr "" #: gajim/gui_interface.py:924 #, python-format msgid "%s wants to send you a file." msgstr "Fellout a ra da %s kas deoc'h ur restr." #: gajim/gui_interface.py:1021 gajim/gui_interface.py:1433 msgid "SSL certificate error" msgstr "" #: gajim/gui_interface.py:1038 #, fuzzy msgid "File Transfer Failed" msgstr "Treuzkasoù" #: gajim/gui_interface.py:1060 #, fuzzy, python-format msgid "%(filename)s received from %(name)s." msgstr "Arsavet eo an treuskas eus %(filename)s digant %(name)s." #: gajim/gui_interface.py:1064 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Arsavet eo an treuskas eus %(filename)s digant %(name)s." #: gajim/gui_interface.py:1068 #, fuzzy, python-format msgid "File transfer of %(filename)s from %(name)s failed." msgstr "Arsavet eo an treuskas eus %(filename)s digant %(name)s." #: gajim/gui_interface.py:1081 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "Gant berzh ho peus kaset %(filename)s da %(name)s." #: gajim/gui_interface.py:1085 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "Arsavet eo an treuzkas eus %(filename)s da %(name)s." #: gajim/gui_interface.py:1089 #, fuzzy, python-format msgid "File transfer of %(filename)s to %(name)s failed." msgstr "Arsavet eo an treuzkas eus %(filename)s da %(name)s." #: gajim/gui_interface.py:1153 #, fuzzy msgid "Choose file to send" msgstr "Dibabit ur restr da gas..." #: gajim/gui_interface.py:1199 #, fuzzy msgid "Unable to decrypt message" msgstr "Da _bep kemennadenn:" #: gajim/gui_interface.py:1211 msgid "Username Conflict" msgstr "" #: gajim/gui_interface.py:1212 #, fuzzy msgid "Please type a new username for your local account" msgstr "Leuniit an titouroù evit ho kont nevez" #: gajim/gui_interface.py:1235 msgid "Resource Conflict" msgstr "" #: gajim/gui_interface.py:1236 msgid "" "You are already connected to this account with the same resource. Please " "type a new one" msgstr "" #: gajim/gui_interface.py:1293 #, fuzzy, python-format msgid "%s wants to start a voice chat." msgstr "Fellout a ra da %s kas deoc'h ur restr." #: gajim/gui_interface.py:1296 #, fuzzy msgid "Voice Chat Request" msgstr "Goulenn treuzkas" #: gajim/gui_interface.py:1386 msgid "Error verifying SSL certificate" msgstr "" #: gajim/gui_interface.py:1387 #, python-format msgid "" "There was an error verifying the SSL certificate of your XMPP server: " "%(error)s\n" "Do you still want to connect to this server?" msgstr "" #: gajim/gui_interface.py:1391 #, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA-1 fingerprint of the certificate:\n" "%(sha1)s\n" "SHA256 fingerprint of the certificate:\n" "%(sha256)s" msgstr "" #: gajim/gui_interface.py:1397 msgid "Ignore this error for this certificate." msgstr "" #: gajim/gui_interface.py:1410 msgid "Non Anonymous Server" msgstr "" #: gajim/gui_interface.py:1434 #, python-format msgid "" "It seems the SSL certificate of account %(account)s has changed and is not " "valid or your connection is being compromised.\n" "\n" "Old SHA-1 fingerprint: %(old_sha1)s\n" "Old SHA-256 fingerprint: %(old_sha256)s\n" "\n" "New SHA-1 fingerprint: %(new_sha1)s\n" "New SHA-256 fingerprint: %(new_sha256)s\n" "\n" "Do you still want to connect and update the fingerprint of the certificate?" msgstr "" #: gajim/gui_interface.py:1512 msgid "" "You are about to send your password on an insecure connection. You should " "install PyOpenSSL to prevent that. Are you sure you want to do that?" msgstr "" #: gajim/gui_interface.py:1554 #, fuzzy msgid "" "You are about to send your password unencrypted on an insecure connection. " "Are you sure you want to do that?" msgstr "Rankout a rit krouiñ ur gont a-raok gellout flapiñ gant tud all." #: gajim/gui_interface.py:1856 #, fuzzy msgid "JID is not a Groupchat" msgstr "A guzha an nozelennoù er prenestr flapiñ" #: gajim/gui_interface.py:2020 #, fuzzy msgid "Emoticons disabled" msgstr "Lazhet eo ar sifrañ" #: gajim/gui_interface.py:2021 msgid "" "Your configured emoticons theme could not be loaded. See the log for more " "details." msgstr "" #: gajim/gui_interface.py:2039 msgid "This is not a group chat" msgstr "" #: gajim/gui_interface.py:2040 #, python-format msgid "" "%(room_jid)s is already in your roster. Please check if %(room_jid)s is a " "correct group chat name. If it is, delete it from your roster and try " "joining the group chat again." msgstr "" #: gajim/gui_interface.py:2418 msgid "Could not save your settings and preferences" msgstr "Dibosupl eo enrollañ ho tibarzhioù ha dibaboù" #: gajim/gui_interface.py:2828 gajim/common/config.py:117 #: gajim/common/config.py:532 gajim/common/optparser.py:343 #: gajim/common/optparser.py:511 gajim/common/optparser.py:534 #, fuzzy msgid "default" msgstr "Dilemel" #: gajim/gui_interface.py:3014 msgid "Passphrase Required" msgstr "Ger-kuzh ret" #: gajim/gui_interface.py:3015 #, fuzzy, python-format msgid "Enter OpenPGP key passphrase for key %(keyid)s (account %(account)s)." msgstr "Roit ho ker-kuzh GPG evit ar gont %s." #: gajim/gui_interface.py:3029 #, fuzzy msgid "OpenPGP key expired" msgstr "Dibab un alc'hwezh OpenPGP" #: gajim/gui_interface.py:3030 #, fuzzy, python-format msgid "" "Your OpenPGP key has expired, you will be connected to %s without OpenPGP." msgstr "Luget e voc'h da %s hep OpenPGP." #: gajim/gui_interface.py:3039 msgid "Wrong Passphrase" msgstr "Ger-kuzh faos" #: gajim/gui_interface.py:3040 #, fuzzy msgid "Please retype your OpenPGP passphrase or press Cancel." msgstr "Adroit ho ker-kuzh GPG pe pouezit war Nullañ." #: gajim/search_window.py:108 msgid "Waiting for results" msgstr "" #: gajim/search_window.py:146 gajim/search_window.py:224 msgid "Error in received dataform" msgstr "" #: gajim/search_window.py:181 gajim/search_window.py:216 msgid "No result" msgstr "" #: gajim/htmltextview.py:559 #, fuzzy msgid "Loading" msgstr "O skrivañ" #: gajim/atom_window.py:123 #, python-format msgid "You have received new entries (and %d not displayed):" msgid_plural "You have received new entries (and %d not displayed):" msgstr[0] "" msgstr[1] "" #: gajim/atom_window.py:128 gajim/data/gui/atom_entry_window.ui:20 msgid "You have received new entry:" msgstr "" #: gajim/adhoc_commands.py:111 gajim/data/gui/adhoc_commands_window.ui:9 msgid "Ad-hoc Commands - Gajim" msgstr "" #: gajim/adhoc_commands.py:320 #, fuzzy msgid "Cancel confirmation" msgstr "Titouroù" #: gajim/adhoc_commands.py:321 msgid "" "You are in process of executing command. Do you really want to cancel it?" msgstr "" #: gajim/adhoc_commands.py:387 gajim/adhoc_commands.py:411 msgid "Service sent malformed data" msgstr "" #: gajim/adhoc_commands.py:396 msgid "Service changed the session identifier." msgstr "" #: gajim/adhoc_commands.py:416 #, python-format msgid "%s - Ad-hoc Commands - Gajim" msgstr "" #: gajim/adhoc_commands.py:510 msgid "Service returned an error." msgstr "" #: gajim/negotiation.py:34 msgid "- messages will be logged" msgstr "" #: gajim/negotiation.py:36 msgid "- messages will not be logged" msgstr "" #: gajim/notify.py:103 #, fuzzy msgid "Open" msgstr "OpenPGP : " #: gajim/dialog_messages.py:33 #, fuzzy msgid "You can not start a new conversation unless you are connected." msgstr "N'hellit ket ebarzhiñ ur sal-flapiñ keit ha ma n'oc'h ket luget." #: gajim/dialog_messages.py:48 msgid "Unread events" msgstr "Darvoudoù chomet dilenn" #: gajim/dialog_messages.py:49 msgid "Read all pending events before removing this account." msgstr "Lennit an holl zarvoudoù a-raok lemel ar gont-mañ." #: gajim/dialog_messages.py:53 msgid "You are currently connected to the server" msgstr "Luget oc'h d'ar servijer" #: gajim/dialog_messages.py:54 #, fuzzy msgid "To disable the account, you must be disconnected." msgstr "Rankout a rit bezañ diluget evit cheñch anv ar gont." #: gajim/dialog_messages.py:58 #, fuzzy msgid "Invalid Form" msgstr "Road direizh" #: gajim/dialog_messages.py:59 #, fuzzy msgid "The form is not filled correctly." msgstr "Bez ez eus arouezioù difennet en anv ar sal pe hini ar servijer." #: gajim/dialog_messages.py:63 gajim/common/helpers.py:406 msgid "Invisible" msgstr "Diwelus" #: gajim/dialog_messages.py:68 msgid "A connection is not available" msgstr "N'eus ket tu da gevreañ" #: gajim/dialog_messages.py:69 msgid "Your message can not be sent until you are connected." msgstr "N'eus ket tu da gas ho kemennadenn keit ha ma n'oc'h ket luget." #: gajim/dialog_messages.py:73 #, fuzzy msgid "JID already in list" msgstr "Flaperez Jabber" #: gajim/dialog_messages.py:74 msgid "The JID you entered is already in the list. Choose another one." msgstr "" #: gajim/dialog_messages.py:78 msgid "Invalid answer" msgstr "Respont direizh" #: gajim/dialog_messages.py:79 #, fuzzy, python-format msgid "Transport %(name)s answered wrongly to register request: %(error)s" msgstr "Respontet fall he deus an nor %s d'ar goulenn emezelañ." #: gajim/dialog_messages.py:84 #, fuzzy msgid "Wrong Custom Hostname" msgstr "Implij un anv ostiz/porzh personelaet" #: gajim/dialog_messages.py:85 #, fuzzy, python-format msgid "Wrong custom hostname \"%s\". Ignoring it." msgstr "Implij un anv ostiz/porzh personelaet" #: gajim/dialog_messages.py:89 #, fuzzy msgid "Error while removing privacy list" msgstr "fazi en ur gas %s ( %s )" #: gajim/dialog_messages.py:90 #, python-format msgid "" "Privacy list %s has not been removed. It is maybe active in one of your " "connected resources. Deactivate it and try again." msgstr "" #: gajim/dialog_messages.py:96 msgid "Invisibility not supported" msgstr "" #: gajim/dialog_messages.py:97 #, python-format msgid "Account %s doesn't support invisibility." msgstr "" #: gajim/dialog_messages.py:101 #, fuzzy msgid "Unregister failed" msgstr "échec lors de la publication de votre vCard" #: gajim/dialog_messages.py:102 #, python-format msgid "Unregistration with server %(server)s failed: %(error)s" msgstr "" #: gajim/dialog_messages.py:106 #, fuzzy msgid "Registration succeeded" msgstr "Gant berzh eo bet embannet ar vCard" #: gajim/dialog_messages.py:107 #, python-format msgid "Registration with agent %s succeeded" msgstr "" #: gajim/dialog_messages.py:111 #, fuzzy msgid "Registration failed" msgstr "échec lors de la publication de votre vCard" #: gajim/dialog_messages.py:112 #, python-format msgid "" "Registration with agent %(agent)s failed with error %(error)s: %(error_msg)s" msgstr "" #: gajim/dialog_messages.py:117 #, fuzzy msgid "Unable to join Groupchat" msgstr "Impossible de rejoindre le salon" #: gajim/dialog_messages.py:122 msgid "GStreamer error" msgstr "" #: gajim/dialog_messages.py:123 #, fuzzy, python-format msgid "" "Error: %(error)s\n" "Debug: %(debug)s" msgstr "Fazi en ur lenn ar restr:" #: gajim/dialog_messages.py:127 #, fuzzy msgid "Wrong host" msgstr "Ger-kuzh faos" #: gajim/dialog_messages.py:128 msgid "Invalid local address? :-O" msgstr "" #: gajim/dialog_messages.py:132 msgid "Avahi error" msgstr "" #: gajim/dialog_messages.py:133 #, python-format msgid "" "%s\n" "Link-local messaging might not work properly." msgstr "" #: gajim/dialog_messages.py:137 gajim/dialog_messages.py:142 #, fuzzy msgid "Could not request upload slot" msgstr "Dibosupl eo kargañ ar skeudenn" #: gajim/dialog_messages.py:143 msgid "Got unexpected response from server (see log)" msgstr "" #: gajim/dialog_messages.py:147 gajim/dialog_messages.py:152 #, fuzzy msgid "Could not open file" msgstr "Dibosupl eo kargañ ar skeudenn" #: gajim/dialog_messages.py:148 msgid "Exception raised while opening file (see log)" msgstr "" #: gajim/dialog_messages.py:157 msgid "Unsecure" msgstr "" #: gajim/dialog_messages.py:158 msgid "Server returned unsecure transport (http)" msgstr "" #: gajim/dialog_messages.py:162 #, fuzzy msgid "Could not upload file" msgstr "Dibosupl eo kargañ ar skeudenn" #: gajim/dialog_messages.py:163 #, python-format msgid "HTTP response code from server: %s" msgstr "" #: gajim/dialog_messages.py:167 msgid "Upload Error" msgstr "" #: gajim/dialog_messages.py:172 #, fuzzy msgid "Encryption Error" msgstr "War enaou emañ ar sifrañ" #: gajim/dialog_messages.py:173 #, fuzzy msgid "For the choosen encryption is no encryption method available" msgstr "N'eus ket tu da gevreañ" #: gajim/gajim_themes_window.py:61 msgid "Theme" msgstr "Gwiskadur" #: gajim/gajim_themes_window.py:98 #, fuzzy msgid "You cannot make changes to the default theme" msgstr "N'hellit ket dilemel ar gwiskadur red" #: gajim/gajim_themes_window.py:99 msgid "Please create a new clean theme." msgstr "" #: gajim/gajim_themes_window.py:170 msgid "theme name" msgstr "anv ar gwiskadur" #: gajim/gajim_themes_window.py:187 msgid "You cannot delete your current theme" msgstr "N'hellit ket dilemel ar gwiskadur red" #: gajim/gajim_themes_window.py:188 msgid "Pick another theme to use first." msgstr "" #: gajim/accounts_window.py:40 #, fuzzy msgid "Merge Accounts" msgstr "Kontoù strollet" #: gajim/accounts_window.py:41 msgid "Use PGP Agent" msgstr "" #: gajim/accounts_window.py:153 gajim/common/config.py:511 msgid "Be right back." msgstr "Distro a-benn nebeut." #: gajim/accounts_window.py:157 msgid "Relogin now?" msgstr "Adlugañ bremañ?" #: gajim/accounts_window.py:158 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "Ret eo deoc'h adlugañ evit ma vo sevenet an holl gemmoù diouzhtu." #: gajim/accounts_window.py:211 #, fuzzy, python-format msgid "You have opened chat in account %s" msgstr "N'ho peus kont bev ebet" #: gajim/accounts_window.py:212 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "" #: gajim/accounts_window.py:345 #, fuzzy msgid "Remove" msgstr "_Dilemel" #: gajim/accounts_window.py:388 #, fuzzy msgid "Rename account label" msgstr "Merañ ar c'hontoù" #: gajim/accounts_window.py:457 msgid "Login" msgstr "" #: gajim/accounts_window.py:466 msgid "Connection" msgstr "Kevreadenn" #: gajim/accounts_window.py:469 #, fuzzy msgid "Import Contacts" msgstr "Darempredoù" #: gajim/accounts_window.py:472 gajim/accounts_window.py:655 #, fuzzy msgid "Client Certificate" msgstr "Anv-arveriad-ez direizh" #: gajim/accounts_window.py:475 gajim/accounts_window.py:570 #, fuzzy msgid "OpenPGP Key" msgstr "Assigner une clé OpenPGP" #: gajim/accounts_window.py:486 gajim/accounts_window.py:558 #, fuzzy msgid "Connect on startup" msgstr "K_evreañ en ur loc'hañ Gajim" #: gajim/accounts_window.py:489 #, fuzzy msgid "Reconnect when connection is lost" msgstr "Adkevreañ war-eeun pa vez kollet ar gevreadenn" #: gajim/accounts_window.py:492 gajim/accounts_window.py:562 #, fuzzy msgid "Save conversations for all contacts" msgstr "Enrollaén an _istoradur-flapiñ evit an holl zarempredoù" #: gajim/accounts_window.py:494 gajim/accounts_window.py:564 msgid "Store conversations on the harddrive" msgstr "" #: gajim/accounts_window.py:496 #, fuzzy msgid "Server Message Archive" msgstr "_Kas ur gemennadenn d'ar servijer" #: gajim/accounts_window.py:498 msgid "" "Messages get stored on the server.\n" "The archive is used to sync messages\n" "between multiple devices.\n" "XEP-0313" msgstr "" #: gajim/accounts_window.py:503 gajim/accounts_window.py:566 #, fuzzy msgid "Global Status" msgstr "Stad:" #: gajim/accounts_window.py:505 #, fuzzy msgid "Synchronise the status of all accounts" msgstr "A cheñch stad ar gont pe ar c'hontoù" #: gajim/accounts_window.py:507 #, fuzzy msgid "Message Carbons" msgstr "Kemennadennoù" #: gajim/accounts_window.py:509 msgid "" "All your other online devices get copies\n" "of sent and received messages.\n" "XEP-0280" msgstr "" #: gajim/accounts_window.py:513 msgid "Use file transfer proxies" msgstr "Implij ar proksioù evit treuzkas restroù" #: gajim/accounts_window.py:525 gajim/accounts_window.py:560 #, fuzzy msgid "Use environment variable" msgstr "N'eus ket tu en em lugañ" #: gajim/accounts_window.py:527 #, fuzzy msgid "Proxy" msgstr "Proksi:" #: gajim/accounts_window.py:530 #, fuzzy msgid "Warn on insecure connection" msgstr "Kevreadenn" #: gajim/accounts_window.py:534 msgid "Send keep-alive packets" msgstr "Kas ar pakadoù derc'hel al lugadenn vev" #: gajim/accounts_window.py:538 msgid "Manually set the hostname for the server" msgstr "" #: gajim/accounts_window.py:541 #, fuzzy msgid "Resource" msgstr "Une erreur de protocole s'est produite :" #: gajim/accounts_window.py:544 gajim/accounts_window.py:612 #: gajim/accounts_window.py:617 msgid "Priority" msgstr "" #: gajim/accounts_window.py:568 #, fuzzy msgid "Synchronize the status of all accounts" msgstr "A cheñch stad ar gont pe ar c'hontoù" #: gajim/accounts_window.py:581 #, fuzzy msgid "First Name" msgstr "Anv:" #: gajim/accounts_window.py:584 #, fuzzy msgid "Last Name" msgstr "Anv:" #: gajim/accounts_window.py:587 #: gajim/data/gui/archiving_313_preferences_window.ui:71 #, fuzzy msgid "Jabber ID" msgstr "ID Jabber:" #: gajim/accounts_window.py:590 #, fuzzy msgid "Email" msgstr "Postel nevez" #: gajim/accounts_window.py:608 #, fuzzy msgid "Adjust to status" msgstr "Goulenn evit gwelet e/he stad" #: gajim/accounts_window.py:635 msgid "Enable" msgstr "Enaouiñ" #: gajim/accounts_window.py:642 #, fuzzy msgid "Port" msgstr "_Porzh:" #: gajim/accounts_window.py:647 #, fuzzy msgid "Connection Options" msgstr "Kevreadenn" #: gajim/accounts_window.py:659 #, fuzzy msgid "Encrypted Certificate" msgstr "Anv-arveriad-ez direizh" #: gajim/accounts_window.py:663 #, fuzzy msgid "Certificate Options" msgstr "Anv-arveriad-ez direizh" #: gajim/accounts_window.py:671 gajim/data/gui/join_groupchat_window.ui:143 #, fuzzy msgid "Password" msgstr "Ger-kuzh:" #: gajim/accounts_window.py:675 #, fuzzy msgid "Save Password" msgstr "Enrollañ ar ger-kuzh" #: gajim/accounts_window.py:678 gajim/data/gui/change_password_dialog.ui:8 msgid "Change Password" msgstr "Cheñch ar ger-kuzh" #: gajim/accounts_window.py:683 #, fuzzy msgid "Login Options" msgstr "Boulomelloù:" #: gajim/gajim_remote.py:59 gajim/common/exceptions.py:71 msgid "D-Bus is not present on this machine or python module is missing" msgstr "" "N'eus ket eus D-Bus war an urzhiataer-mañ, pe mankout a ra ur mollad python" #: gajim/gajim_remote.py:81 #, fuzzy msgid "Shows a help on specific command" msgstr "diskouez ar skoazell evit un urzhiad resis" #: gajim/gajim_remote.py:84 msgid "command" msgstr "urzhiad" #: gajim/gajim_remote.py:85 msgid "show help on command" msgstr "diskouez ar skoazell evit an urzhiad" #: gajim/gajim_remote.py:89 #, fuzzy msgid "Lists all contacts in roster, one for each line" msgstr "" "A ziskouez ur roll eus an holl zarempredoù, pep darempred war ul linenn." #: gajim/gajim_remote.py:91 gajim/gajim_remote.py:106 gajim/gajim_remote.py:116 #: gajim/gajim_remote.py:130 gajim/gajim_remote.py:144 #: gajim/gajim_remote.py:153 gajim/gajim_remote.py:174 #: gajim/gajim_remote.py:204 gajim/gajim_remote.py:213 #: gajim/gajim_remote.py:220 #, fuzzy msgid "?CLI:account" msgstr "kont" #: gajim/gajim_remote.py:91 msgid "show only contacts of the given account" msgstr "diskouez darempredoù ar gont roet hepken" #: gajim/gajim_remote.py:97 msgid "Prints a list of registered accounts" msgstr "A ziskouez roll ar c'hontoù enrollet" #: gajim/gajim_remote.py:101 #, fuzzy msgid "Changes the status of account(s)" msgstr "A cheñch stad ar gont pe ar c'hontoù" #: gajim/gajim_remote.py:104 #, fuzzy msgid "?CLI:status" msgstr "stad" #: gajim/gajim_remote.py:104 #, fuzzy msgid "" "one of: offline, online, chat, away, xa, dnd, invisible. If not set, use " "account's previous status" msgstr "unan eus: offline, online, chat, away, xa, dnd, invisible " #: gajim/gajim_remote.py:105 gajim/gajim_remote.py:127 #: gajim/gajim_remote.py:141 gajim/gajim_remote.py:152 #, fuzzy msgid "?CLI:message" msgstr "kemennadenn" #: gajim/gajim_remote.py:105 msgid "status message" msgstr "titour stad" #: gajim/gajim_remote.py:106 msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" msgstr "" "A cheñch stad ar gont \"kont\". Ma n'eus hini ebet roet, klaskit cheñch stad " "an holl gontoù o deus an dibab \"sync with global status\" enaouet" #: gajim/gajim_remote.py:112 #, fuzzy msgid "Changes the priority of account(s)" msgstr "A cheñch stad ar gont pe ar c'hontoù" #: gajim/gajim_remote.py:114 #, fuzzy msgid "?CLI:priority" msgstr "Digant" #: gajim/gajim_remote.py:114 #, fuzzy msgid "priority you want to give to the account" msgstr "Fellout a ra din emezelañ evit krouiñ ur gont" #: gajim/gajim_remote.py:116 #, fuzzy msgid "" "change the priority of the given account. If not specified, change status of " "all accounts that have \"sync with global status\" option set" msgstr "" "A cheñch stad ar gont \"kont\". Ma n'eus hini ebet roet, klaskit cheñch stad " "an holl gontoù o deus an dibab \"sync with global status\" enaouet" #: gajim/gajim_remote.py:122 #, fuzzy msgid "" "Sends new chat message to a contact in the roster. Both OpenPGP key and " "account are optional. If you want to set only 'account', without 'OpenPGP " "key', just set 'OpenPGP key' to ''." msgstr "" "Envoyer un nouveau message à un contact dans la liste. La clé OpenPGP et le " "compte sont facultatifs. Si vous voulez renseigner seulement le paramètre " "'compte' sans 'clé pgp', mettez simple la valeur '' pour 'clé pgp'." #: gajim/gajim_remote.py:126 gajim/gajim_remote.py:139 msgid "JID of the contact that will receive the message" msgstr "JID an darempred hag a resevo ar gemennadenn" #: gajim/gajim_remote.py:127 gajim/gajim_remote.py:141 #: gajim/gajim_remote.py:152 msgid "message contents" msgstr "korf ar gemennadenn" #: gajim/gajim_remote.py:128 gajim/gajim_remote.py:142 msgid "PGP key" msgstr "" #: gajim/gajim_remote.py:128 gajim/gajim_remote.py:142 msgid "if specified, the message will be encrypted using this public key" msgstr "" #: gajim/gajim_remote.py:130 gajim/gajim_remote.py:144 #: gajim/gajim_remote.py:153 msgid "if specified, the message will be sent using this account" msgstr "Ma vez resisaet, e vo kaset ar gemennadenn en ur implij ar gont-mañ" #: gajim/gajim_remote.py:135 #, fuzzy msgid "" "Sends a chat message to someone on your roster. Optionally with OpenPGP key " "and account. If you want to only set the latter, set OpenPGP key to \"\"." msgstr "" "Envoyer un nouveau message à un contact dans la liste. La clé OpenPGP et le " "compte sont facultatifs. Si vous voulez renseigner seulement le paramètre " "'compte' sans 'clé pgp', mettez simple la valeur '' pour 'clé pgp'." #: gajim/gajim_remote.py:140 #, fuzzy msgid "subject" msgstr "Titl" #: gajim/gajim_remote.py:140 #, fuzzy msgid "message subject" msgstr "Kemennadenn gaset" #: gajim/gajim_remote.py:149 msgid "Sends new message to a groupchat you've joined." msgstr "" #: gajim/gajim_remote.py:151 #, fuzzy msgid "JID of the room that will receive the message" msgstr "JID an darempred hag a resevo ar gemennadenn" #: gajim/gajim_remote.py:158 msgid "Gets detailed info on a contact" msgstr "Evit kargañ titouroù-munut un darempred" #: gajim/gajim_remote.py:160 gajim/gajim_remote.py:173 #: gajim/gajim_remote.py:203 msgid "JID of the contact" msgstr "JID an darempred" #: gajim/gajim_remote.py:164 msgid "Gets detailed info on a account" msgstr "Evit kargañ titouroù-munut ur gont" #: gajim/gajim_remote.py:166 msgid "Name of the account" msgstr "Anv ar gont" #: gajim/gajim_remote.py:170 msgid "Sends file to a contact" msgstr "Kas ur restr d'un darempred" #: gajim/gajim_remote.py:172 msgid "file" msgstr "restr" #: gajim/gajim_remote.py:172 msgid "File path" msgstr "Treug ar restr" #: gajim/gajim_remote.py:174 msgid "if specified, file will be sent using this account" msgstr "m'eo resisaet, e vo kaset ar rest en ur implij ar gont-mañ" #: gajim/gajim_remote.py:179 msgid "Lists all preferences and their values" msgstr "Roll an holl zibaboù hag o zalvoudoù" #: gajim/gajim_remote.py:183 msgid "Sets value of 'key' to 'value'." msgstr "A laka talvoud an 'alc'hwezh' da 'dalvoud'." #: gajim/gajim_remote.py:185 msgid "key=value" msgstr "alc'hwezh=talvoud" #: gajim/gajim_remote.py:185 #, fuzzy msgid "'key' is the name of the preference, 'value' is what to set it to" msgstr "'alc'hwezh' eo anv an dibab, 'talvoud' eo an talvoud da lakaat dezhañ" #: gajim/gajim_remote.py:190 msgid "Deletes a preference item" msgstr "A zilam un elfenn dibab" #: gajim/gajim_remote.py:192 msgid "key" msgstr "touchenn" #: gajim/gajim_remote.py:192 msgid "name of the preference to be deleted" msgstr "anv an dibab da zilemel" #: gajim/gajim_remote.py:196 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "A skriv stad red dibaboù Gajim er restr .config" #: gajim/gajim_remote.py:201 msgid "Removes contact from roster" msgstr "Dilemel an darempred diouzh ar roll" #: gajim/gajim_remote.py:204 msgid "if specified, contact is taken from the contact list of this account" msgstr "Si spécifié, le contact est pris dans la liste de contact de ce compte" #: gajim/gajim_remote.py:211 msgid "Returns current status (the global one unless account is specified)" msgstr "" "A ro ar stad red (an hini hollek, nemet ez eus bet resisaet ur gont bennak)" #: gajim/gajim_remote.py:218 msgid "" "Returns current status message (the global one unless account is specified)" msgstr "" "A gas an titour-stad red (an hini hollek, nemet ez eus bet resisaet ur gont " "bennak)" #: gajim/gajim_remote.py:225 #, fuzzy msgid "Returns number of unread messages" msgstr "A ro an niver a gemennadennoù chomet dilenn" #: gajim/gajim_remote.py:230 msgid "Sends custom XML" msgstr "" #: gajim/gajim_remote.py:232 msgid "XML to send" msgstr "" #: gajim/gajim_remote.py:233 msgid "" "Account to which the XML will be sent; if not specified, XML will be sent to " "all accounts" msgstr "" #: gajim/gajim_remote.py:239 #, fuzzy msgid "Change the avatar" msgstr "Darempred diluget" #: gajim/gajim_remote.py:241 #, fuzzy msgid "Picture to use" msgstr "N'eus ket bet kavet al lesanv : %s" #: gajim/gajim_remote.py:242 msgid "" "Account in which the avatar will be set; if not specified, the avatar will " "be set for all accounts" msgstr "" #: gajim/gajim_remote.py:249 msgid "Check if Gajim is running" msgstr "" #: gajim/gajim_remote.py:275 msgid "Missing argument \"contact_jid\"" msgstr "" #: gajim/gajim_remote.py:295 #, python-format msgid "" "'%s' is not in your roster.\n" "Please specify account for sending the message." msgstr "" "N'emañ ket '%s' en hor roll darempredoù.\n" "Resisait ar gont evit kas ur gemennadenn." #: gajim/gajim_remote.py:298 msgid "You have no active account" msgstr "N'ho peus kont bev ebet" #: gajim/gajim_remote.py:346 msgid "It seems Gajim is not running. So you can't use gajim-remote." msgstr "" #: gajim/gajim_remote.py:373 #, python-format msgid "" "Usage: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" msgstr "" #: gajim/gajim_remote.py:377 msgid "Arguments:" msgstr "Arguments :" #: gajim/gajim_remote.py:381 #, python-format msgid "%s not found" msgstr "N'eo ket bet kavet %s" #: gajim/gajim_remote.py:387 #, fuzzy, python-format msgid "" "Usage:\n" " %s command [arguments]\n" "\n" "Command is one of:\n" msgstr "" "Implij: %s urzhiad [arguments]\n" "urzhiad eo unan eus :\n" #: gajim/gajim_remote.py:457 #, python-format msgid "" "Too many arguments. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" #: gajim/gajim_remote.py:462 #, python-format msgid "" "Argument \"%(arg)s\" is not specified. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" #: gajim/common/app.py:264 #, fuzzy msgid "Unable to load idle module" msgstr "Impossible de rejoindre le salon" #: gajim/common/fuzzyclock.py:37 msgid "twelve" msgstr "" #: gajim/common/fuzzyclock.py:37 #, fuzzy msgid "one" msgstr "Hini ebet" #: gajim/common/fuzzyclock.py:37 #, fuzzy msgid "two" msgstr "piv" #: gajim/common/fuzzyclock.py:37 #, fuzzy msgid "three" msgstr "Straed:" #: gajim/common/fuzzyclock.py:37 #, fuzzy msgid "four" msgstr "Porzh:" #: gajim/common/fuzzyclock.py:38 #, fuzzy msgid "five" msgstr "restr" #: gajim/common/fuzzyclock.py:38 msgid "six" msgstr "" #: gajim/common/fuzzyclock.py:38 #, fuzzy msgid "seven" msgstr "Darvoud" #: gajim/common/fuzzyclock.py:38 msgid "eight" msgstr "" #: gajim/common/fuzzyclock.py:38 #, fuzzy msgid "nine" msgstr "_Kenderc'hel" #: gajim/common/fuzzyclock.py:38 msgid "ten" msgstr "" #: gajim/common/fuzzyclock.py:39 #, fuzzy msgid "eleven" msgstr "Dilemel" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "%(0)s o'clock" msgstr "" #: gajim/common/fuzzyclock.py:43 #, fuzzy, python-format msgid "five past %(0)s" msgstr "Emezelañ war %s" #: gajim/common/fuzzyclock.py:43 #, fuzzy, python-format msgid "ten past %(0)s" msgstr "Emezelañ war %s" #: gajim/common/fuzzyclock.py:44 #, fuzzy, python-format msgid "quarter past %(0)s" msgstr "Emezelañ war %s" #: gajim/common/fuzzyclock.py:44 #, fuzzy, python-format msgid "twenty past %(0)s" msgstr "Emezelañ war %s" #: gajim/common/fuzzyclock.py:44 #, fuzzy, python-format msgid "twenty five past %(0)s" msgstr "Emezelañ war %s" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "half past %(0)s" msgstr "" #: gajim/common/fuzzyclock.py:45 #, fuzzy, python-format msgid "twenty five to %(1)s" msgstr "Emezelañ war %s" #: gajim/common/fuzzyclock.py:45 #, fuzzy, python-format msgid "twenty to %(1)s" msgstr "Emezelañ war %s" #: gajim/common/fuzzyclock.py:46 #, fuzzy, python-format msgid "quarter to %(1)s" msgstr "Emezelañ war %s" #: gajim/common/fuzzyclock.py:46 #, fuzzy, python-format msgid "ten to %(1)s" msgstr "Emezelañ war %s" #: gajim/common/fuzzyclock.py:46 #, fuzzy, python-format msgid "five to %(1)s" msgstr "Emezelañ war %s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "%(1)s o'clock" msgstr "" #: gajim/common/fuzzyclock.py:48 gajim/common/fuzzyclock.py:50 msgid "Night" msgstr "" #: gajim/common/fuzzyclock.py:48 msgid "Early morning" msgstr "" #: gajim/common/fuzzyclock.py:48 #, fuzzy msgid "Morning" msgstr "O labourat" #: gajim/common/fuzzyclock.py:49 msgid "Almost noon" msgstr "" #: gajim/common/fuzzyclock.py:49 #, fuzzy msgid "Noon" msgstr "Hini ebet" #: gajim/common/fuzzyclock.py:49 msgid "Afternoon" msgstr "" #: gajim/common/fuzzyclock.py:49 #, fuzzy msgid "Evening" msgstr "Darvoud" #: gajim/common/fuzzyclock.py:50 msgid "Late evening" msgstr "" #: gajim/common/fuzzyclock.py:52 msgid "Start of week" msgstr "" #: gajim/common/fuzzyclock.py:52 gajim/common/fuzzyclock.py:53 msgid "Middle of week" msgstr "" #: gajim/common/fuzzyclock.py:53 msgid "End of week" msgstr "" #: gajim/common/fuzzyclock.py:53 msgid "Weekend!" msgstr "" #: gajim/common/connection_handlers_events.py:369 #, fuzzy, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " "management tools such as http://jru.jabberstudio.org/ to remove it" msgstr "" "je Jid %s ne respecte pas la norma RFC. Il ne sera pas ajouté a votre liste " "de contact. Utiliser un outil de gestion de liste de contact tel que http://" "jru.jabberstudio.org/ pour le supprimer" #: gajim/common/connection_handlers_events.py:852 #, python-format msgid "unsubscribe request from %s" msgstr "Requête de désinscription de la part de %s" #: gajim/common/connection_handlers_events.py:952 #, fuzzy msgid "Room has been destroyed" msgstr "Dilamet eo bet an aotre" #: gajim/common/connection_handlers_events.py:960 #, python-format msgid "You can join this room instead: %s" msgstr "" #: gajim/common/connection_handlers_events.py:1979 #, fuzzy, python-format msgid "Unknown SSL error: %d" msgstr "Aozadur D-Bus dianav: %s" #: gajim/common/connection_handlers_events.py:2625 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Kemennadenn simpl nevez digant %(nickname)s" #: gajim/common/connection_handlers_events.py:2631 #, fuzzy, python-format msgid "New Private Message from group chat %s" msgstr "Kemennadenn hiniennel nevez digant ar sal %s" #: gajim/common/connection_handlers_events.py:2634 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s : %(message)s" #: gajim/common/connection_handlers_events.py:2637 #, fuzzy, python-format msgid "Messaged by %(nickname)s" msgstr "Kemennadenn nevez digant %(nickname)s" #: gajim/common/connection_handlers_events.py:2643 #, python-format msgid "New Message from %(nickname)s" msgstr "Kemennadenn nevez digant %(nickname)s" #: gajim/common/connection_handlers_events.py:2809 #, fuzzy, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s a zo bremañ %(status)s" #: gajim/common/connection_handlers_events.py:2817 #, python-format msgid "%(nickname)s Signed In" msgstr "Emañ %(nickname)s o paouez lugañ" #: gajim/common/connection_handlers_events.py:2823 #, python-format msgid "%(nickname)s Signed Out" msgstr "Emañ %(nickname)s o paouez dilugañ" #: gajim/common/contacts.py:386 #, fuzzy msgid "Not in roster" msgstr "Ket er roll" #: gajim/common/config.py:76 msgid "" "Show desktop notification even when a chat window is opened for this contact " "and does not have focus" msgstr "" #: gajim/common/config.py:77 msgid "Play sound when user is busy" msgstr "" #: gajim/common/config.py:79 msgid "Show only online and free for chat contacts in roster." msgstr "" #: gajim/common/config.py:82 msgid "Time in minutes, after which your status changes to away." msgstr "War-lerc'h pet munutenn e vo lakaet ho stad evel ezvezant." #: gajim/common/config.py:83 #, fuzzy msgid "$S (Away as a result of being idle more than $T min)" msgstr "Ezvezant rak dizoberiant" #: gajim/common/config.py:83 msgid "$S will be replaced by current status message, $T by autoawaytime." msgstr "" #: gajim/common/config.py:85 msgid "Time in minutes, after which your status changes to not available." msgstr "War-lerc'h pet munutenn e vo lakaet ho stad evel dihegerz." #: gajim/common/config.py:86 #, fuzzy msgid "$S (Not available as a result of being idle more than $T min)" msgstr "Dihegerz rak dizoberiant." #: gajim/common/config.py:86 msgid "$S will be replaced by current status message, $T by autoxatime." msgstr "" #: gajim/common/config.py:89 msgid "" "When to show notification area icon. Can be 'never', 'on_event', 'always'." msgstr "" #: gajim/common/config.py:90 msgid "Allow to hide the roster window even if the tray icon is not shown." msgstr "" #: gajim/common/config.py:95 #, fuzzy msgid "Incoming nickname color." msgstr "Anv-arveriad-ez direizh" #: gajim/common/config.py:96 msgid "Outgoing nickname color." msgstr "" #: gajim/common/config.py:97 msgid "Incoming text color." msgstr "" #: gajim/common/config.py:98 msgid "Outgoing text color." msgstr "" #: gajim/common/config.py:99 #, fuzzy msgid "Status message text color." msgstr "korf ar gemennadenn stad" #: gajim/common/config.py:102 #, fuzzy msgid "Contact signed in notification color." msgstr "Diskouez er _roll hepken" #: gajim/common/config.py:103 #, fuzzy msgid "Contact signout notification color" msgstr "Diskouez er _roll hepken" #: gajim/common/config.py:104 #, fuzzy msgid "New message notification color." msgstr "Noti_fications d'état de discussion" #: gajim/common/config.py:105 #, fuzzy msgid "File transfer request notification color." msgstr "Goulenn treuzkas" #: gajim/common/config.py:106 #, fuzzy msgid "File transfer error notification color." msgstr "Nullet eo bet an treuzkas" #: gajim/common/config.py:107 #, fuzzy msgid "File transfer complete or stopped notification color." msgstr "P'eo echu un treuzkas, diskouez ur gemennadenn gelaouiñ difoupus" #: gajim/common/config.py:108 #, fuzzy msgid "Groupchat invitation notification color" msgstr "Pedadenn evit ur sal-flapiñ" #: gajim/common/config.py:109 msgid "Background color of status changed notification" msgstr "" #: gajim/common/config.py:110 msgid "Other dialogs color." msgstr "" #: gajim/common/config.py:111 #, fuzzy msgid "Incoming nickname font." msgstr "Anv-arveriad-ez direizh" #: gajim/common/config.py:112 #, fuzzy msgid "Outgoing nickname font." msgstr "Cheñch lesanv" #: gajim/common/config.py:113 msgid "Incoming text font." msgstr "" #: gajim/common/config.py:114 msgid "Outgoing text font." msgstr "" #: gajim/common/config.py:115 #, fuzzy msgid "Status message text font." msgstr "korf ar gemennadenn stad" #: gajim/common/config.py:116 msgid "" "List (space separated) of rows (accounts and groups) that are collapsed." msgstr "" #: gajim/common/config.py:123 msgid "Language used by speller" msgstr "" #: gajim/common/config.py:124 msgid "" "'always' - print time for every message.\n" "'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" "'never' - never print time." msgstr "" #: gajim/common/config.py:125 msgid "" "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " "to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " "This is used only if print_time is 'sometimes'." msgstr "" #: gajim/common/config.py:127 #, fuzzy msgid "Enable ASCII emoticons" msgstr "Gérer les frimousses" #: gajim/common/config.py:129 msgid "Treat * / _ pairs as possible formatting characters." msgstr "Implij ur re */_ evel arouezioù neuziañ an destenn." #: gajim/common/config.py:130 msgid "" "If True, do not remove */_ . So *abc* will be bold but with * * not removed." msgstr "" "M'eo gwir, ne vo ket dilamet */_. Neuze e vo *abc* tev ma ne vez ket dilamet " "* *." #: gajim/common/config.py:133 msgid "" "Uses ReStructured text markup to send HTML, plus ascii formatting if " "selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" "restructuredtext.html (If you want to use this, install docutils)" msgstr "" #: gajim/common/config.py:142 msgid "" "Character to add after nickname when using nick completion (tab) in group " "chat." msgstr "" #: gajim/common/config.py:143 msgid "" "Character to propose to add after desired nickname when desired nickname is " "used by someone else in group chat." msgstr "" #: gajim/common/config.py:165 msgid "" "If True, Gajim will save roster position when hiding roster, and restore it " "when showing roster." msgstr "" #: gajim/common/config.py:171 msgid "Place the roster on the right in single window mode" msgstr "" #: gajim/common/config.py:177 msgid "" "This option let you customize timestamp that is printed in conversation. For " "exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " "strftime for full documentation: http://docs.python.org/lib/module-time.html" msgstr "" #: gajim/common/config.py:178 msgid "Characters that are printed before the nickname in conversations" msgstr "" #: gajim/common/config.py:179 msgid "Characters that are printed after the nickname in conversations" msgstr "" #: gajim/common/config.py:181 msgid "Add * and [n] in roster title?" msgstr "Ouzhpennañ * hag [n] da ditl ar roll darempredoù?" #: gajim/common/config.py:182 #, fuzzy msgid "" "How many history messages should be restored when a chat tab/window is " "reopened?" msgstr "" "Niver a linennoù da vemoriñ diouzh ar gaozeadenn gent pa vez addigoret un " "ivinell pe ur prenestr." #: gajim/common/config.py:183 msgid "How far back in time (minutes) history is restored. -1 means no limit." msgstr "" #: gajim/common/config.py:184 msgid "" "How many lines to request from server when entering a groupchat. -1 means no " "limit" msgstr "" #: gajim/common/config.py:185 msgid "" "Minutes of backlog to request when entering a groupchat. -1 means no limit" msgstr "" #: gajim/common/config.py:186 msgid "" "How many seconds to wait before trying to autorejoin to a conference you are " "being disconnected from. Set to 0 to disable autorejoining." msgstr "" #: gajim/common/config.py:187 msgid "" "Should autorejoin be activated when we are being kicked from a conference?" msgstr "" #: gajim/common/config.py:188 msgid "" "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " "Client default behaviour)." msgstr "" "Kas ar gemennadenn gant Ctrl+Kas ha mont d'al linenn gant Kas (emzalc'h dre-" "ziouer ar poellad ICQ Mirabilis)." #: gajim/common/config.py:190 msgid "How many lines to store for Ctrl+KeyUP." msgstr "Niver a linennoù da zerc'hel soñj evit Ctrl+BirLaez" #: gajim/common/config.py:193 #, fuzzy, python-format msgid "" "Either custom url with %%s in it where %%s is the word/phrase or " "'WIKTIONARY' which means use wiktionary." msgstr "" "Pe un url personelaet gant %s ennañ, %s o vezañ ar ger-kuzh pe 'WIKTIONARY' " "hag a dalvez implij wiktionary." #: gajim/common/config.py:196 msgid "If checked, Gajim can be controlled remotely using gajim-remote." msgstr "" "M'eo diuzet, e vo tu da sturiañ Gajim a-bell en ur implij gajim-remote." #: gajim/common/config.py:197 msgid "" "Sent chat state notifications. Can be one of all, composing_only, disabled." msgstr "" #: gajim/common/config.py:198 msgid "" "Displayed chat state notifications in chat windows. Can be one of all, " "composing_only, disabled." msgstr "" #: gajim/common/config.py:200 msgid "" "When not printing time for every message (print_time==sometimes), print it " "every x minutes." msgstr "" #: gajim/common/config.py:201 msgid "Ask before closing a group chat tab/window." msgstr "Goulenn a-raok serriñ un ivinell pe ur prenestr." #: gajim/common/config.py:202 #, fuzzy msgid "" "Always ask for confirmation before closing groupchats with any of the JIDs " "on this space separated list." msgstr "" "Goulenn atav a-raok serriñ ar webgaozioù dispartiet gant un esaouenn ar roll-" "mañ." #: gajim/common/config.py:203 #, fuzzy msgid "" "Never ask for confirmation before closing groupchats with any of the JIDs on " "this space separated list." msgstr "" "Chom hep goulenn morse a-raok serriñ ar webgaozioù dispartiet gant un " "esaouenn er roll-mañ." #: gajim/common/config.py:204 msgid "" "Ask before closing tabbed chat window if there are controls that can lose " "data (chat, private chat, groupchat that will not be minimized)" msgstr "" #: gajim/common/config.py:207 msgid "" "Comma separated list of hosts that we send, in addition of local interfaces, " "for File Transfer in case of address translation/port forwarding." msgstr "" #: gajim/common/config.py:209 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." msgstr "Hervez ar standard IEC, KiB = 1024 byte, KB = 1000 byte." #: gajim/common/config.py:211 msgid "Notify of events in the notification area." msgstr "" #: gajim/common/config.py:212 msgid "" "If False, Gajim will display a static event icon instead of the blinking " "status icon in the notification area when notifying on event." msgstr "" #: gajim/common/config.py:218 msgid "Show tab when only one conversation?" msgstr "Diskouez an ivinell pa 'z eus ur gaoz hepken?" #: gajim/common/config.py:219 #, fuzzy msgid "Show tabbed notebook border in chat windows?" msgstr "Diskouez an ivinell pa 'z eus ur gaoz hepken?" #: gajim/common/config.py:220 msgid "Show close button in tab?" msgstr "Diskouez an nozelenn-serriñ war an ivinell?" #: gajim/common/config.py:221 msgid "" "A list of modp groups to use in a Diffie-Hellman, highest preference first, " "separated by commas. Valid groups are 1, 2, 5, 14, 15, 16, 17 and 18. Higher " "numbers are more secure, but take longer to calculate when you start a " "session." msgstr "" #: gajim/common/config.py:234 #, fuzzy msgid "Preview new messages in notification popup?" msgstr "Noti_fications d'état de discussion" #: gajim/common/config.py:237 msgid "" "A semicolon-separated list of words that will be highlighted in group chats." msgstr "" #: gajim/common/config.py:238 msgid "" "If True, quits Gajim when X button of Window Manager is clicked. This " "setting is taken into account only if notification icon is used." msgstr "" #: gajim/common/config.py:239 msgid "" "If True, Gajim hides the Roster window on pressing the X button instead of " "minimizing into the Dock." msgstr "" #: gajim/common/config.py:240 msgid "" "If True, Gajim will display an icon on each tab containing unread messages. " "Depending on the theme, this icon may be animated." msgstr "" #: gajim/common/config.py:241 #, fuzzy msgid "" "If True, Gajim will display the status message, if not empty, for every " "contact under the contact name in roster window." msgstr "" "Si cette case est cochée, Gajim affichera le message d'état, sous le nom de " "chaque contact dans la fenêtre principale et les salons" #: gajim/common/config.py:247 msgid "Define the position of the avatar in roster. Can be left or right" msgstr "" #: gajim/common/config.py:248 msgid "" "If False, Gajim will no longer print status line in chats when a contact " "changes his or her status and/or his or her status message." msgstr "" #: gajim/common/config.py:249 msgid "" "Can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " "longer print status line in groupchats when a member changes his or her " "status and/or his or her status message. If \"all\" Gajim will print all " "status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " "group chat." msgstr "" #: gajim/common/config.py:251 msgid "Log XHTML messages instead of plain text messages." msgstr "" #: gajim/common/config.py:252 msgid "Background color of contacts when they just signed in." msgstr "" #: gajim/common/config.py:253 msgid "Background color of contacts when they just signed out." msgstr "" #: gajim/common/config.py:255 msgid "" "If True, restored messages will use a smaller font than the default one." msgstr "" #: gajim/common/config.py:256 msgid "Don't show avatar for the transport itself." msgstr "" #: gajim/common/config.py:257 msgid "Don't show roster in the system taskbar." msgstr "" #: gajim/common/config.py:258 msgid "" "If True and installed GTK+ and PyGTK versions are at least 2.8, make the " "window flash (the default behaviour in most Window Managers) when holding " "pending events." msgstr "" #: gajim/common/config.py:260 #, fuzzy msgid "" "Jabberd1.4 does not like sha info when one join a password protected group " "chat. Turn this option to False to stop sending sha info in group chat " "presences." msgstr "" "Jabberd1.4 n'aime pas l'information sha quand on rejoint un salon protégé " "par un mot de passe. Passer cette option a Faux pour ne plus envoyer " "l'information sha dans les présences des salons" #: gajim/common/config.py:263 #, fuzzy msgid "" "Controls the window where new messages are placed.\n" "'always' - All messages are sent to a single window.\n" "'always_with_roster' - Like 'always' but the messages are in a single window " "along with the roster.\n" "'never' - All messages get their own window.\n" "'peracct' - Messages for each account are sent to a specific window.\n" "'pertype' - Each message type (e.g. chats vs. groupchats) is sent to a " "specific window." msgstr "" "A reolia ar prenestr a vez lakaet ar c'hemennadennoù nevez enni.\n" "'always' - An holl gaozioù en hevelep prenestr.\n" "'never' - An holl gaozioù e prenestroù disheñvel.\n" "'peracct' - An holl gaozioù en ur prenestr hervez ar gont.\n" "'pertype' - Bep a brenestr gant ur stumm flapiñ (webgaoz/flap)." #: gajim/common/config.py:264 msgid "" "Show roster on startup.\n" "'always' - Always show roster.\n" "'never' - Never show roster.\n" "'last_state' - Restore the last state roster." msgstr "" #: gajim/common/config.py:265 #, fuzzy msgid "If False, you will no longer see the avatar in the chat window." msgstr "M'eo faos, ne weloc'h ket an avatar er prenestr-flapiñ ken" #: gajim/common/config.py:266 #, fuzzy msgid "If True, pressing the escape key closes a tab/window." msgstr "" "M'eo gwir, klikit war an douchenn Echap evit serriñ un ivinell/prenestr" #: gajim/common/config.py:267 msgid "Hides the banner in a group chat window" msgstr "A guzha an nozelennoù er prenestr flapiñ" #: gajim/common/config.py:268 msgid "Hides the banner in two persons chat window" msgstr "" #: gajim/common/config.py:269 #, fuzzy msgid "Hides the group chat occupants list in group chat window." msgstr "A guzha roll ar berzhidi en ur prenestr webgaoz" #: gajim/common/config.py:270 msgid "" "In a chat, show the nickname at the beginning of a line only when it's not " "the same person talking than in previous message." msgstr "" #: gajim/common/config.py:271 msgid "Indentation when using merge consecutive nickname." msgstr "" #: gajim/common/config.py:272 msgid "" "List of colors, separated by \":\", that will be used to color nicknames in " "group chats." msgstr "" #: gajim/common/config.py:273 msgid "Ctrl-Tab go to next composing tab when none is unread." msgstr "" #: gajim/common/config.py:274 msgid "" "Should we show the confirm metacontacts creation dialog or not? Empty string " "means we never show the dialog." msgstr "" #: gajim/common/config.py:275 msgid "" "Should we show the confirm block contact dialog or not? Empty string means " "we never show the dialog." msgstr "" #: gajim/common/config.py:276 msgid "" "Should we show the confirm custom status dialog or not? Empty string means " "we never show the dialog." msgstr "" #: gajim/common/config.py:277 msgid "" "If True, you will be able to set a negative priority to your account in " "account modification window. BE CAREFUL, when you are logged in with a " "negative priority, you will NOT receive any message from your server." msgstr "" #: gajim/common/config.py:278 msgid "" "If True, Gajim will show number of online and total contacts in account and " "group rows." msgstr "" #: gajim/common/config.py:279 msgid "" "Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " "as if they were of this type" msgstr "" #: gajim/common/config.py:280 msgid "" "If True, Gajim will scroll and select the contact who sent you the last " "message, if chat window is not already opened." msgstr "" #: gajim/common/config.py:281 msgid "Time of inactivity needed before the change status window closes down." msgstr "" #: gajim/common/config.py:282 msgid "" "Maximum number of lines that are printed in conversations. Oldest lines are " "cleared." msgstr "" #: gajim/common/config.py:283 msgid "" "If True, notification windows from notification-daemon will be attached to " "notification icon." msgstr "" #: gajim/common/config.py:284 msgid "Choose interval between 2 checks of idleness." msgstr "" #: gajim/common/config.py:285 msgid "" "Valid uri schemes. Only schemes in this list will be accepted as \"real\" " "uri. (mailto and xmpp are handled separately)" msgstr "" #: gajim/common/config.py:286 msgid "If True, completion in groupchats will be like a shell auto-completion" msgstr "" #: gajim/common/config.py:287 msgid "" "When is self contact row displayed. Can be \"always\", \"when_other_resource" "\" or \"never\"" msgstr "" #: gajim/common/config.py:292 msgid "Optionally fix jingle output video framerate. Example: 10/1 or 25/2" msgstr "" #: gajim/common/config.py:293 msgid "Optionally resize jingle output video. Example: 320x240" msgstr "" #: gajim/common/config.py:294 msgid "If True, You will also see your webcam" msgstr "" #: gajim/common/config.py:297 msgid "" "If True, Gajim will try to use a STUN server when using Jingle. The one in " "\"stun_server\" option, or the one given by the XMPP server." msgstr "" #: gajim/common/config.py:298 msgid "STUN server to use when using Jingle" msgstr "" #: gajim/common/config.py:299 msgid "" "If True, Gajim will show affiliation of groupchat occupants by adding a " "colored square to the status icon" msgstr "" #: gajim/common/config.py:300 msgid "" "Proxy used for all outgoing connections if the account does not have a " "specific proxy configured" msgstr "" #: gajim/common/config.py:301 msgid "If True, Gajim will ignore incoming attention requestd (\"wizz\")." msgstr "" #: gajim/common/config.py:302 msgid "" "If enabled, Gajim will reopen chat windows that were opened last time Gajim " "was closed." msgstr "" #: gajim/common/config.py:303 msgid "" "If enabled, Gajim will show an icon to show that sent message has been " "received by your contact" msgstr "" #: gajim/common/config.py:304 msgid "Show a mini avatar in chat window tabs and in window icon" msgstr "" #: gajim/common/config.py:305 msgid "If True, Gajim will use the Systems Keyring to store account passwords." msgstr "" #: gajim/common/config.py:306 msgid "Sets the encoding used by python-gnupg" msgstr "" #: gajim/common/config.py:307 msgid "If True, Gajim will execute XEP-0146 Commands." msgstr "" #: gajim/common/config.py:308 msgid "All non-compliant MAM Groupchats" msgstr "" #: gajim/common/config.py:324 msgid "" "Priority will change automatically according to your status. Priorities are " "defined in autopriority_* options." msgstr "" #: gajim/common/config.py:332 msgid "" "Status used to autoconnect as. Can be online, chat, away, xa, dnd, " "invisible. NOTE: this option is used only if restore_last_status is disabled" msgstr "" #: gajim/common/config.py:333 msgid "If enabled, restore the last status that was used." msgstr "" #: gajim/common/config.py:335 msgid "" "If True, Contacts requesting authorization will be automatically accepted." msgstr "" #: gajim/common/config.py:336 #, fuzzy msgid "" "If False, this account will be disabled and will not appear in roster window." msgstr "M'eo faos, ne weloc'h ket an avatar er prenestr-flapiñ ken" #: gajim/common/config.py:339 msgid "" "If disabled, don't sign presences with GPG key, even if GPG is configured." msgstr "" #: gajim/common/config.py:341 msgid "Enable ESessions encryption for this account." msgstr "" #: gajim/common/config.py:342 msgid "Should Gajim automatically start an encrypted session when possible?" msgstr "" #: gajim/common/config.py:343 msgid "Allow plaintext connections" msgstr "" #: gajim/common/config.py:346 msgid "" "List (space separated) of authentication mechanisms to try. Can contain " "ANONYMOUS, EXTERNAL, GSSAPI, SCRAM-SHA-1-PLUS, SCRAM-SHA-1, DIGEST-MD5, " "PLAIN, X-MESSENGER-OAUTH2 or XEP-0078" msgstr "" #: gajim/common/config.py:347 msgid "" "Show a warning dialog before sending password on an plaintext connection. " "Can be 'warn', 'connect', 'disconnect'" msgstr "" #: gajim/common/config.py:348 msgid "Show a warning dialog before using standard SSL library." msgstr "" #: gajim/common/config.py:349 msgid "" "Show a warning dialog before sending PLAIN password over a plain connection." msgstr "" #: gajim/common/config.py:352 msgid "Space separated list of ssl errors to ignore." msgstr "" #: gajim/common/config.py:358 msgid "" "Space separated list of JIDs for which you do not want to store logs. You " "can also add account name to log nothing for this account." msgstr "" #: gajim/common/config.py:359 msgid "" "On startup, Gajim will download logs stored on server, provided the server " "supports XEP-0313" msgstr "" #: gajim/common/config.py:360 msgid "" "Space separated list of JIDs for which you accept to not log conversations " "if he does not want to." msgstr "" #: gajim/common/config.py:363 msgid "Whitespace sent after inactivity" msgstr "" #: gajim/common/config.py:364 msgid "XMPP ping sent after inactivity" msgstr "" #: gajim/common/config.py:368 msgid "" "How many seconds to wait for the answer of ping alive packet before we try " "to reconnect?" msgstr "" #: gajim/common/config.py:372 msgid "Jabberd2 workaround" msgstr "" #: gajim/common/config.py:375 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." msgstr "" #: gajim/common/config.py:376 msgid "" "If True, Gajim will test file transfer proxies on startup to be sure it " "works. Openfire's proxies are known to fail this test even if they work." msgstr "" #: gajim/common/config.py:389 msgid "Answer to receipt requests" msgstr "" #: gajim/common/config.py:390 msgid "Sent receipt requests" msgstr "" #: gajim/common/config.py:399 #, fuzzy msgid "" "Allow Gajim to send information about the operating system you are running." msgstr "Si cette case est cochée, Gajim se connectera à ce salon au démarrage" #: gajim/common/config.py:400 #, fuzzy msgid "Allow Gajim to send your local time." msgstr "Fellout a ra da %s kas deoc'h ur restr." #: gajim/common/config.py:401 msgid "" "When negotiating an encrypted session, should Gajim assume you want your " "messages to be logged?" msgstr "" #: gajim/common/config.py:404 #, fuzzy msgid "Message that is sent to contacts you want to add" msgstr "Leuniit an titouroù diwar-benn an darempred da ouzhpennañ" #: gajim/common/config.py:405 msgid "" "If enabled and if server supports this feature, Gajim will receive messages " "sent and received by other resources." msgstr "" #: gajim/common/config.py:406 msgid "" "If enabled, Gajim will send your local IPs so your contact can connect to " "your machine to transfer files." msgstr "" #: gajim/common/config.py:407 #, fuzzy msgid "Latest token for OAuth 2.0 authentication." msgstr "Implij an diskleriañ" #: gajim/common/config.py:408 #, fuzzy msgid "client_id for OAuth 2.0 authentication." msgstr "Implij an diskleriañ" #: gajim/common/config.py:409 #, fuzzy msgid "redirect_url for OAuth 2.0 authentication." msgstr "Implij an diskleriañ" #: gajim/common/config.py:410 msgid "" "Space separated list of JIDs for which we want to re-open a chat window on " "next startup." msgstr "" #: gajim/common/config.py:412 msgid "HTTP Upload: Enable HTTPS Verification" msgstr "" #: gajim/common/config.py:413 msgid "" "Preferred file transfer mechanism for file drag&drop on chat window. Can be " "'httpupload' (default) or 'jingle'" msgstr "" #: gajim/common/config.py:476 gajim/common/config.py:481 msgid "Language for which we want to check misspelled words" msgstr "" #: gajim/common/config.py:478 msgid "The currently active encryption for that contact" msgstr "" #: gajim/common/config.py:482 msgid "" "How many lines to request from server when entering a groupchat. -1 means no " "limit, -2 means global value" msgstr "" #: gajim/common/config.py:483 msgid "" "Minutes of backlog to request when entering a groupchat. -1 means no limit, " "-2 means global value" msgstr "" #: gajim/common/config.py:484 msgid "State whether we want a notification for every message in this room" msgstr "" #: gajim/common/config.py:487 msgid "" "State whether plugins should be activated on startup (this is saved on Gajim " "exit). This option SHOULD NOT be used to (de)activate plug-ins. Use GUI " "instead." msgstr "" #: gajim/common/config.py:492 gajim/common/pep.py:157 msgid "Sleeping" msgstr "O kousket" #: gajim/common/config.py:493 msgid "Back soon" msgstr "Distro 'benn nebeut" #: gajim/common/config.py:493 msgid "Back in some minutes." msgstr "Distro 'vin a-benn un nebeut munutennoù.." #: gajim/common/config.py:494 gajim/common/pep.py:127 msgid "Eating" msgstr "O tebriñ" #: gajim/common/config.py:494 msgid "I'm eating, so leave me a message." msgstr "O tebriñ 'maon, neuze laoskit ur gemennadenn." #: gajim/common/config.py:495 msgid "Movie" msgstr "Film" #: gajim/common/config.py:495 msgid "I'm watching a movie." msgstr "O sellout ouzh ur film 'maon." #: gajim/common/config.py:496 gajim/common/pep.py:186 msgid "Working" msgstr "O labourat" #: gajim/common/config.py:496 msgid "I'm working." msgstr "O labourat 'maon." #: gajim/common/config.py:497 msgid "Phone" msgstr "Pellgomz" #: gajim/common/config.py:497 msgid "I'm on the phone." msgstr "Ouzh ar pellgomz emaon." #: gajim/common/config.py:498 msgid "Out" msgstr "Er-maez" #: gajim/common/config.py:498 #, fuzzy msgid "I'm out enjoying life." msgstr "Er-maez emaon o profitañ eus ar vuhez" #: gajim/common/config.py:509 #, fuzzy msgid "I'm available." msgstr "Hegerz" #: gajim/common/config.py:510 #, fuzzy msgid "I'm free for chat." msgstr "Prest da flapiñ" #: gajim/common/config.py:512 #, fuzzy msgid "I'm not available." msgstr "Dihegerz" #: gajim/common/config.py:513 msgid "Do not disturb." msgstr "" #: gajim/common/config.py:514 gajim/common/config.py:515 msgid "Bye!" msgstr "" #: gajim/common/config.py:526 msgid "" "Sound to play when a group chat message contains one of the words in " "muc_highlight_words, or when a group chat message contains your nickname." msgstr "" #: gajim/common/config.py:527 msgid "Sound to play when any MUC message arrives." msgstr "" #: gajim/common/config.py:535 gajim/common/optparser.py:357 msgid "green" msgstr "Glas" #: gajim/common/config.py:539 gajim/common/optparser.py:343 msgid "grocery" msgstr "" #: gajim/common/config.py:543 msgid "human" msgstr "Mab-den" #: gajim/common/config.py:547 msgid "marine" msgstr "Glas-mor" #: gajim/common/config.py:554 #, fuzzy msgid "Tor" msgstr "Da" #: gajim/common/commands.py:86 #, fuzzy msgid "Change status information" msgstr "Titouroù" #: gajim/common/commands.py:108 #, fuzzy msgid "Change status" msgstr "Darempred diluget" #: gajim/common/commands.py:109 msgid "Set the presence type and description" msgstr "" #: gajim/common/commands.py:115 #, fuzzy msgid "Free for chat" msgstr "Prest da flapiñ" #: gajim/common/commands.py:116 #, fuzzy msgid "Online" msgstr "_Kenderc'hel" #: gajim/common/commands.py:118 msgid "Extended away" msgstr "" #: gajim/common/commands.py:119 msgid "Do not disturb" msgstr "" #: gajim/common/commands.py:120 msgid "Offline - disconnect" msgstr "" #: gajim/common/commands.py:125 #, fuzzy msgid "Presence description:" msgstr "Taolennadur" #: gajim/common/commands.py:160 gajim/common/commands.py:343 msgid "The status has been changed." msgstr "" #: gajim/common/commands.py:192 gajim/common/commands.py:225 #, fuzzy msgid "Leave Groupchats" msgstr "Flap a-stroll" #: gajim/common/commands.py:215 #, fuzzy, python-format msgid "%(nickname)s on %(room_jid)s" msgstr "%(nickname)s : %(message)s" #: gajim/common/commands.py:219 #, fuzzy msgid "You have not joined a groupchat." msgstr "Er strollad" #: gajim/common/commands.py:226 msgid "Choose the groupchats you want to leave" msgstr "" #: gajim/common/commands.py:271 #, fuzzy msgid "You left the following groupchats:" msgstr "Emaoc'h er webgaoz %s dija" #: gajim/common/commands.py:283 #, fuzzy msgid "Forward unread messages" msgstr "Gajim - %d gemennadenn nevez" #: gajim/common/commands.py:310 msgid "All unread messages have been forwarded." msgstr "" #: gajim/common/commands.py:318 #, fuzzy msgid "Forward unread message then disconnect" msgstr "Gajim - %d gemennadenn nevez" #: gajim/common/httpupload.py:137 #, fuzzy msgid "File is empty" msgstr "Treug ar restr" #: gajim/common/httpupload.py:140 #, fuzzy msgid "File does not exist" msgstr "Ce salon n'existe pas." #: gajim/common/httpupload.py:147 gajim/common/httpupload.py:204 #, python-format msgid "File is too large, maximum allowed file size is: %s" msgstr "" #: gajim/common/check_paths.py:37 msgid "creating logs database" msgstr "o krouiñ titourva an istoradur" #: gajim/common/check_paths.py:98 #, fuzzy msgid "creating cache database" msgstr "o krouiñ titourva an istoradur" #: gajim/common/check_paths.py:261 #, fuzzy, python-format msgid "moving %(src)s to %(dst)s" msgstr "Kas %s" #: gajim/common/check_paths.py:287 gajim/common/check_paths.py:294 #: gajim/common/check_paths.py:301 gajim/common/check_paths.py:308 #: gajim/common/check_paths.py:315 gajim/common/check_paths.py:322 #: gajim/common/check_paths.py:329 gajim/common/check_paths.py:336 #, fuzzy, python-format msgid "%s is a file but it should be a directory" msgstr "ur restr eo %s met rankout a rafe bezañ ur renkell" #: gajim/common/check_paths.py:288 gajim/common/check_paths.py:295 #: gajim/common/check_paths.py:302 gajim/common/check_paths.py:309 #: gajim/common/check_paths.py:316 gajim/common/check_paths.py:323 #: gajim/common/check_paths.py:330 gajim/common/check_paths.py:337 #: gajim/common/check_paths.py:349 gajim/common/check_paths.py:357 msgid "Gajim will now exit" msgstr "Emañ Gajim o vont da guitaat diouzhtu" #: gajim/common/check_paths.py:348 gajim/common/check_paths.py:356 #, fuzzy, python-format msgid "%s is a directory but should be a file" msgstr "ur renkell eo %s met rankout a rafe bezañ ur restr" #: gajim/common/optparser.py:55 #, python-format msgid "Error: cannot open %s for reading" msgstr "Fazi: dibosupl eo digeriñ %s evit e lenn" #: gajim/common/optparser.py:352 gajim/common/optparser.py:353 msgid "cyan" msgstr "Cyan" #: gajim/common/optparser.py:421 #, fuzzy msgid "migrating logs database to indices" msgstr "o krouiñ titourva an istoradur" #: gajim/common/logging_helpers.py:34 #, python-format msgid "%s is not a valid loglevel" msgstr "" #: gajim/common/connection.py:83 msgid "Unable to get issuer certificate" msgstr "" #: gajim/common/connection.py:84 msgid "Unable to get certificate CRL" msgstr "" #: gajim/common/connection.py:85 msgid "Unable to decrypt certificate's signature" msgstr "" #: gajim/common/connection.py:86 msgid "Unable to decrypt CRL's signature" msgstr "" #: gajim/common/connection.py:87 #, fuzzy msgid "Unable to decode issuer public key" msgstr "Impossible de rejoindre le salon" #: gajim/common/connection.py:88 msgid "Certificate signature failure" msgstr "" #: gajim/common/connection.py:89 msgid "CRL signature failure" msgstr "" #: gajim/common/connection.py:90 msgid "Certificate is not yet valid" msgstr "" #: gajim/common/connection.py:91 msgid "Certificate has expired" msgstr "" #: gajim/common/connection.py:92 msgid "CRL is not yet valid" msgstr "" #: gajim/common/connection.py:93 msgid "CRL has expired" msgstr "" #: gajim/common/connection.py:94 msgid "Format error in certificate's notBefore field" msgstr "" #: gajim/common/connection.py:95 msgid "Format error in certificate's notAfter field" msgstr "" #: gajim/common/connection.py:96 msgid "Format error in CRL's lastUpdate field" msgstr "" #: gajim/common/connection.py:97 msgid "Format error in CRL's nextUpdate field" msgstr "" #: gajim/common/connection.py:98 msgid "Out of memory" msgstr "" #: gajim/common/connection.py:99 msgid "Self signed certificate" msgstr "" #: gajim/common/connection.py:100 msgid "Self signed certificate in certificate chain" msgstr "" #: gajim/common/connection.py:101 msgid "Unable to get local issuer certificate" msgstr "" #: gajim/common/connection.py:102 msgid "Unable to verify the first certificate" msgstr "" #: gajim/common/connection.py:103 msgid "Certificate chain too long" msgstr "" #: gajim/common/connection.py:104 msgid "Certificate revoked" msgstr "" #: gajim/common/connection.py:105 #, fuzzy msgid "Invalid CA certificate" msgstr "Anv-arveriad-ez direizh" #: gajim/common/connection.py:106 msgid "Path length constraint exceeded" msgstr "" #: gajim/common/connection.py:107 msgid "Unsupported certificate purpose" msgstr "" #: gajim/common/connection.py:108 msgid "Certificate not trusted" msgstr "" #: gajim/common/connection.py:109 msgid "Certificate rejected" msgstr "" #: gajim/common/connection.py:110 msgid "Subject issuer mismatch" msgstr "" #: gajim/common/connection.py:111 msgid "Authority and subject key identifier mismatch" msgstr "" #: gajim/common/connection.py:112 msgid "Authority and issuer serial number mismatch" msgstr "" #: gajim/common/connection.py:113 msgid "Key usage does not include certificate signing" msgstr "" #: gajim/common/connection.py:114 msgid "Application verification failure" msgstr "" #: gajim/common/connection.py:876 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Kollet eo bet al lugadenn gant ar gont \"%s\"" #: gajim/common/connection.py:877 msgid "Reconnect manually." msgstr "" #: gajim/common/connection.py:888 #, fuzzy, python-format msgid "Server %(name)s answered wrongly to register request: %(error)s" msgstr "Respontet fall he deus an nor %s d'ar goulenn emezelañ." #: gajim/common/connection.py:930 #, python-format msgid "Server %s provided a different registration form" msgstr "" #: gajim/common/connection.py:1283 #, fuzzy, python-format msgid "Could not connect to \"%(host)s\" via proxy \"%(proxy)s\"" msgstr "Dibosupl eo en em lugañ da \"%s\"" #: gajim/common/connection.py:1286 #, fuzzy, python-format msgid "Could not connect to \"%(host)s\"" msgstr "Dibosupl eo en em lugañ da \"%s\"" #: gajim/common/connection.py:1293 #, fuzzy, python-format msgid "Server replied: %s" msgstr "Enrollet e-barzh: %s" #: gajim/common/connection.py:1308 #, fuzzy msgid "Connection to proxy failed" msgstr "Kevreadenn" #: gajim/common/connection.py:1346 gajim/common/connection.py:1449 #, fuzzy, python-format msgid "Could not connect to account %s" msgstr "Dibosupl eo en em lugañ da \"%s\"" #: gajim/common/connection.py:1347 gajim/common/connection.py:1450 #, fuzzy, python-format msgid "Connection with account %s has been lost. Retry connecting." msgstr "Kollet eo bet al lugadenn gant ar gont \"%s\"" #: gajim/common/connection.py:1372 #, python-format msgid "The authenticity of the %s certificate could be invalid" msgstr "" #: gajim/common/connection.py:1375 #, python-format msgid "" "\n" "SSL Error: %s" msgstr "" #: gajim/common/connection.py:1377 #, fuzzy, python-format msgid "" "\n" "Unknown SSL error: %d" msgstr "Aozadur D-Bus dianav: %s" #: gajim/common/connection.py:1423 #, python-format msgid "" "The authenticity of the %s certificate could be invalid.\n" "The certificate does not cover this domain." msgstr "" #: gajim/common/connection.py:1473 gajim/common/connection.py:2238 #: gajim/common/zeroconf/connection_zeroconf.py:192 #, python-format msgid "Could not connect to \"%s\"" msgstr "Dibosupl eo en em lugañ da \"%s\"" #: gajim/common/connection.py:1512 #, python-format msgid "Authentication failed with \"%s\"" msgstr "C'hwitet an diskleriadenn gant \"%s\"" #: gajim/common/connection.py:1513 msgid "Please check your login and password for correctness." msgstr "Gwiriekait ho ker-kuzh hag anv-lugañ." #: gajim/common/connection.py:2097 #, python-format msgid "Sent contact: \"%(jid)s\" (%(name)s)" msgstr "" #: gajim/common/connection.py:2101 #, fuzzy msgid "Sent contacts:" msgstr "Darempredoù" #: gajim/common/connection.py:2255 gajim/common/connection.py:2277 msgid "Not fetched because of invisible status" msgstr "" # Traduction moins mauvaise mais pas terrible: binding=lier, attacher #: gajim/common/dbus_support.py:44 msgid "D-Bus python bindings are missing in this computer" msgstr "" #: gajim/common/dbus_support.py:45 gajim/common/dbus_support.py:56 msgid "D-Bus capabilities of Gajim cannot be used" msgstr "" #: gajim/common/dbus_support.py:55 msgid "D-Bus does not run correctly on this machine" msgstr "" #: gajim/common/dbus_support.py:58 #, fuzzy msgid "D-Bus does not run correctly on this machine: system bus not present" msgstr "" "N'eus ket eus D-Bus war an urzhiataer-mañ, pe mankout a ra ur mollad python" #: gajim/common/dbus_support.py:61 #, fuzzy msgid "D-Bus does not run correctly on this machine: session bus not present" msgstr "" "N'eus ket eus D-Bus war an urzhiataer-mañ, pe mankout a ra ur mollad python" #: gajim/common/multimedia_helpers.py:45 #, fuzzy msgid "Default device" msgstr "Titour-stad" #: gajim/common/multimedia_helpers.py:66 msgid "Audio test" msgstr "" #: gajim/common/multimedia_helpers.py:69 gajim/common/multimedia_helpers.py:85 #: gajim/common/multimedia_helpers.py:99 gajim/common/multimedia_helpers.py:117 msgid "Autodetect" msgstr "" #: gajim/common/multimedia_helpers.py:72 gajim/common/multimedia_helpers.py:87 #, fuzzy, python-format msgid "ALSA: %s" msgstr "Ment: %s" #: gajim/common/multimedia_helpers.py:75 gajim/common/multimedia_helpers.py:89 #, fuzzy, python-format msgid "Pulse: %s" msgstr "Restr: %s" #: gajim/common/multimedia_helpers.py:83 msgid "Fake audio output" msgstr "" #: gajim/common/multimedia_helpers.py:96 msgid "Video test" msgstr "" #: gajim/common/multimedia_helpers.py:101 #, python-format msgid "V4L2: %s" msgstr "" #: gajim/common/multimedia_helpers.py:104 #, fuzzy msgid "Screen" msgstr "Glas" #: gajim/common/multimedia_helpers.py:111 msgid "Fake video output" msgstr "" #: gajim/common/multimedia_helpers.py:114 #, python-format msgid "X Window System (X11/XShm/Xv): %s" msgstr "" #: gajim/common/multimedia_helpers.py:116 msgid "X Window System (without Xv)" msgstr "" #: gajim/common/pep.py:27 msgid "Afraid" msgstr "" #: gajim/common/pep.py:28 msgid "Amazed" msgstr "" #: gajim/common/pep.py:29 msgid "Amorous" msgstr "" #: gajim/common/pep.py:30 msgid "Angry" msgstr "" #: gajim/common/pep.py:31 msgid "Annoyed" msgstr "" #: gajim/common/pep.py:32 msgid "Anxious" msgstr "" #: gajim/common/pep.py:33 #, fuzzy msgid "Aroused" msgstr "Ehan" #: gajim/common/pep.py:34 msgid "Ashamed" msgstr "" #: gajim/common/pep.py:35 #, fuzzy msgid "Bored" msgstr "Tev" #: gajim/common/pep.py:36 msgid "Brave" msgstr "" #: gajim/common/pep.py:37 msgid "Calm" msgstr "" #: gajim/common/pep.py:38 #, fuzzy msgid "Cautious" msgstr "Flapoù" #: gajim/common/pep.py:39 #, fuzzy msgid "Cold" msgstr "Tev" #: gajim/common/pep.py:40 #, fuzzy msgid "Confident" msgstr "_Endalc'hadoù" #: gajim/common/pep.py:41 msgid "Confused" msgstr "" #: gajim/common/pep.py:42 #, fuzzy msgid "Contemplative" msgstr "Echu" #: gajim/common/pep.py:43 #, fuzzy msgid "Contented" msgstr "_Endalc'hadoù" #: gajim/common/pep.py:44 msgid "Cranky" msgstr "" #: gajim/common/pep.py:45 msgid "Crazy" msgstr "" #: gajim/common/pep.py:46 #, fuzzy msgid "Creative" msgstr "Dizoberiant" #: gajim/common/pep.py:47 msgid "Curious" msgstr "" #: gajim/common/pep.py:48 #, fuzzy msgid "Dejected" msgstr "Dilemel" #: gajim/common/pep.py:49 msgid "Depressed" msgstr "" #: gajim/common/pep.py:50 #, fuzzy msgid "Disappointed" msgstr "Dizoberiant" #: gajim/common/pep.py:51 msgid "Disgusted" msgstr "" #: gajim/common/pep.py:52 #, fuzzy msgid "Dismayed" msgstr "Dizoberiant" #: gajim/common/pep.py:53 #, fuzzy msgid "Distracted" msgstr "Dizoberiant" #: gajim/common/pep.py:54 msgid "Embarrassed" msgstr "" #: gajim/common/pep.py:55 msgid "Envious" msgstr "" #: gajim/common/pep.py:56 msgid "Excited" msgstr "" #: gajim/common/pep.py:57 msgid "Flirtatious" msgstr "" #: gajim/common/pep.py:58 msgid "Frustrated" msgstr "" #: gajim/common/pep.py:59 msgid "Grateful" msgstr "" #: gajim/common/pep.py:60 msgid "Grieving" msgstr "" #: gajim/common/pep.py:61 #, fuzzy msgid "Grumpy" msgstr "Strollad" #: gajim/common/pep.py:62 msgid "Guilty" msgstr "" #: gajim/common/pep.py:63 msgid "Happy" msgstr "" #: gajim/common/pep.py:64 msgid "Hopeful" msgstr "" #: gajim/common/pep.py:65 #, fuzzy msgid "Hot" msgstr "_Ostiz:" #: gajim/common/pep.py:66 msgid "Humbled" msgstr "" #: gajim/common/pep.py:67 msgid "Humiliated" msgstr "" #: gajim/common/pep.py:68 msgid "Hungry" msgstr "" #: gajim/common/pep.py:69 msgid "Hurt" msgstr "" #: gajim/common/pep.py:70 #, fuzzy msgid "Impressed" msgstr "kemennadenn" #: gajim/common/pep.py:71 msgid "In Awe" msgstr "" #: gajim/common/pep.py:72 msgid "In Love" msgstr "" #: gajim/common/pep.py:73 msgid "Indignant" msgstr "" #: gajim/common/pep.py:74 msgid "Interested" msgstr "" #: gajim/common/pep.py:75 msgid "Intoxicated" msgstr "" #: gajim/common/pep.py:76 #, fuzzy msgid "Invincible" msgstr "Diwelus" #: gajim/common/pep.py:77 msgid "Jealous" msgstr "" #: gajim/common/pep.py:78 #, fuzzy msgid "Lonely" msgstr "Hini ebet" #: gajim/common/pep.py:79 #, fuzzy msgid "Lost" msgstr "_Ostiz:" #: gajim/common/pep.py:80 msgid "Lucky" msgstr "" #: gajim/common/pep.py:81 #, fuzzy msgid "Mean" msgstr "Hollek" #: gajim/common/pep.py:82 #, fuzzy msgid "Moody" msgstr "_Kemmañ" #: gajim/common/pep.py:83 msgid "Nervous" msgstr "" #: gajim/common/pep.py:84 msgid "Neutral" msgstr "" #: gajim/common/pep.py:85 #, fuzzy msgid "Offended" msgstr "Ezlinenn" #: gajim/common/pep.py:86 msgid "Outraged" msgstr "" #: gajim/common/pep.py:87 msgid "Playful" msgstr "" #: gajim/common/pep.py:88 #, fuzzy msgid "Proud" msgstr "Strollad" #: gajim/common/pep.py:89 msgid "Relaxed" msgstr "" #: gajim/common/pep.py:90 #, fuzzy msgid "Relieved" msgstr "Dilemel" #: gajim/common/pep.py:91 msgid "Remorseful" msgstr "" #: gajim/common/pep.py:92 msgid "Restless" msgstr "" #: gajim/common/pep.py:93 msgid "Sad" msgstr "" #: gajim/common/pep.py:94 msgid "Sarcastic" msgstr "" #: gajim/common/pep.py:95 #, fuzzy msgid "Satisfied" msgstr "Anv:" #: gajim/common/pep.py:96 msgid "Serious" msgstr "" #: gajim/common/pep.py:97 msgid "Shocked" msgstr "" #: gajim/common/pep.py:98 msgid "Shy" msgstr "" #: gajim/common/pep.py:99 #, fuzzy msgid "Sick" msgstr "Lesanv" #: gajim/common/pep.py:100 #, fuzzy msgid "Sleepy" msgstr "O kousket" #: gajim/common/pep.py:101 msgid "Spontaneous" msgstr "" #: gajim/common/pep.py:102 #, fuzzy msgid "Stressed" msgstr "Straed:" #: gajim/common/pep.py:103 msgid "Strong" msgstr "" #: gajim/common/pep.py:104 #, fuzzy msgid "Surprised" msgstr "Emezelañ" #: gajim/common/pep.py:105 msgid "Thankful" msgstr "" #: gajim/common/pep.py:106 msgid "Thirsty" msgstr "" #: gajim/common/pep.py:107 #, fuzzy msgid "Tired" msgstr "Mare" #: gajim/common/pep.py:108 #, fuzzy msgid "Undefined" msgstr "Islinennañ" #: gajim/common/pep.py:109 msgid "Weak" msgstr "" #: gajim/common/pep.py:110 msgid "Worried" msgstr "" #: gajim/common/pep.py:113 #, fuzzy msgid "Doing Chores" msgstr "Ger-kuzh faos" #: gajim/common/pep.py:114 msgid "Buying Groceries" msgstr "" #: gajim/common/pep.py:115 #, fuzzy msgid "Cleaning" msgstr "Darvoud" #: gajim/common/pep.py:116 #, fuzzy msgid "Cooking" msgstr "O skrivañ" #: gajim/common/pep.py:117 msgid "Doing Maintenance" msgstr "" #: gajim/common/pep.py:118 msgid "Doing the Dishes" msgstr "" #: gajim/common/pep.py:119 msgid "Doing the Laundry" msgstr "" #: gajim/common/pep.py:120 #, fuzzy msgid "Gardening" msgstr "O labourat" #: gajim/common/pep.py:121 msgid "Running an Errand" msgstr "" #: gajim/common/pep.py:122 #, fuzzy msgid "Walking the Dog" msgstr "Er strollad" #: gajim/common/pep.py:123 #, fuzzy msgid "Drinking" msgstr "O labourat" #: gajim/common/pep.py:124 msgid "Having a Beer" msgstr "" #: gajim/common/pep.py:125 msgid "Having Coffee" msgstr "" #: gajim/common/pep.py:126 msgid "Having Tea" msgstr "" #: gajim/common/pep.py:128 msgid "Having a Snack" msgstr "" #: gajim/common/pep.py:129 msgid "Having Breakfast" msgstr "" #: gajim/common/pep.py:130 msgid "Having Dinner" msgstr "" #: gajim/common/pep.py:131 msgid "Having Lunch" msgstr "" #: gajim/common/pep.py:132 msgid "Exercising" msgstr "" #: gajim/common/pep.py:133 gajim/common/pep.py:178 msgid "Cycling" msgstr "" #: gajim/common/pep.py:134 #, fuzzy msgid "Dancing" msgstr "Darvoud" #: gajim/common/pep.py:135 #, fuzzy msgid "Hiking" msgstr "Skarzhañ %s" #: gajim/common/pep.py:136 #, fuzzy msgid "Jogging" msgstr "E_barzhiñ" #: gajim/common/pep.py:137 msgid "Playing Sports" msgstr "" #: gajim/common/pep.py:138 msgid "Running" msgstr "" #: gajim/common/pep.py:139 #, fuzzy msgid "Skiing" msgstr "O labourat" #: gajim/common/pep.py:140 msgid "Swimming" msgstr "" #: gajim/common/pep.py:141 #, fuzzy msgid "Working out" msgstr "O labourat" #: gajim/common/pep.py:142 msgid "Grooming" msgstr "" #: gajim/common/pep.py:143 msgid "At the Spa" msgstr "" #: gajim/common/pep.py:144 msgid "Brushing Teeth" msgstr "" #: gajim/common/pep.py:145 msgid "Getting a Haircut" msgstr "" #: gajim/common/pep.py:146 #, fuzzy msgid "Shaving" msgstr "O tebriñ" #: gajim/common/pep.py:147 msgid "Taking a Bath" msgstr "" #: gajim/common/pep.py:148 msgid "Taking a Shower" msgstr "" #: gajim/common/pep.py:149 msgid "Having an Appointment" msgstr "" #: gajim/common/pep.py:150 gajim/data/gui/gajim_themes_window.ui:363 msgid "Inactive" msgstr "Dizoberiant" #: gajim/common/pep.py:151 msgid "Day Off" msgstr "" #: gajim/common/pep.py:152 #, fuzzy msgid "Hanging out" msgstr "Cheñch ar sujed" #: gajim/common/pep.py:153 #, fuzzy msgid "Hiding" msgstr "Skarzhañ %s" #: gajim/common/pep.py:154 msgid "On Vacation" msgstr "" #: gajim/common/pep.py:155 #, fuzzy msgid "Praying" msgstr "O tebriñ" #: gajim/common/pep.py:156 msgid "Scheduled Holiday" msgstr "" #: gajim/common/pep.py:158 #, fuzzy msgid "Thinking" msgstr "O labourat" #: gajim/common/pep.py:159 #, fuzzy msgid "Relaxing" msgstr "Standard" #: gajim/common/pep.py:160 #, fuzzy msgid "Fishing" msgstr "Skarzhañ %s" #: gajim/common/pep.py:161 #, fuzzy msgid "Gaming" msgstr "O tebriñ" #: gajim/common/pep.py:162 #, fuzzy msgid "Going out" msgstr "_Dilugañ" #: gajim/common/pep.py:163 #, fuzzy msgid "Partying" msgstr "O tebriñ" #: gajim/common/pep.py:164 #, fuzzy msgid "Reading" msgstr "Abeg" #: gajim/common/pep.py:165 #, fuzzy msgid "Rehearsing" msgstr "Abeg" #: gajim/common/pep.py:166 #, fuzzy msgid "Shopping" msgstr "O kousket" #: gajim/common/pep.py:167 #, fuzzy msgid "Smoking" msgstr "O labourat" #: gajim/common/pep.py:168 msgid "Socializing" msgstr "" #: gajim/common/pep.py:169 #, fuzzy msgid "Sunbathing" msgstr "O tebriñ" #: gajim/common/pep.py:170 msgid "Watching TV" msgstr "" #: gajim/common/pep.py:171 #, fuzzy msgid "Watching a Movie" msgstr "O sellout ouzh ur film 'maon." #: gajim/common/pep.py:172 #, fuzzy msgid "Talking" msgstr "O tebriñ" #: gajim/common/pep.py:173 msgid "In Real Life" msgstr "" #: gajim/common/pep.py:174 #, fuzzy msgid "On the Phone" msgstr "Ouzh ar pellgomz emaon." #: gajim/common/pep.py:175 msgid "On Video Phone" msgstr "" #: gajim/common/pep.py:176 #, fuzzy msgid "Traveling" msgstr "O treuzkas" #: gajim/common/pep.py:177 #, fuzzy msgid "Commuting" msgstr "O skrivañ" #: gajim/common/pep.py:179 msgid "Driving" msgstr "" #: gajim/common/pep.py:180 msgid "In a Car" msgstr "" #: gajim/common/pep.py:181 msgid "On a Bus" msgstr "" #: gajim/common/pep.py:182 msgid "On a Plane" msgstr "" #: gajim/common/pep.py:183 msgid "On a Train" msgstr "" #: gajim/common/pep.py:184 msgid "On a Trip" msgstr "" #: gajim/common/pep.py:185 #, fuzzy msgid "Walking" msgstr "O labourat" #: gajim/common/pep.py:187 #, fuzzy msgid "Coding" msgstr "O skrivañ" #: gajim/common/pep.py:188 msgid "In a Meeting" msgstr "" #: gajim/common/pep.py:189 msgid "Studying" msgstr "" #: gajim/common/pep.py:190 #, fuzzy msgid "Writing" msgstr "O labourat" #: gajim/common/pep.py:195 msgid "accuracy" msgstr "" #: gajim/common/pep.py:196 #, fuzzy msgid "alt" msgstr "Dilemel" #: gajim/common/pep.py:197 msgid "area" msgstr "" #: gajim/common/pep.py:198 #, fuzzy msgid "bearing" msgstr "Glas-mor" #: gajim/common/pep.py:199 #, fuzzy msgid "building" msgstr "Skarzhañ %s" #: gajim/common/pep.py:200 #, fuzzy msgid "country" msgstr "Bro:" #: gajim/common/pep.py:201 #, fuzzy msgid "countrycode" msgstr "Kont" #: gajim/common/pep.py:202 msgid "datum" msgstr "" #: gajim/common/pep.py:203 #, fuzzy msgid "description" msgstr "Taolennadur" #: gajim/common/pep.py:204 msgid "error" msgstr "" #: gajim/common/pep.py:205 msgid "floor" msgstr "" #: gajim/common/pep.py:206 msgid "lat" msgstr "" #: gajim/common/pep.py:207 msgid "locality" msgstr "" #: gajim/common/pep.py:208 #, fuzzy msgid "lon" msgstr "Hini ebet" #: gajim/common/pep.py:209 msgid "postalcode" msgstr "" #: gajim/common/pep.py:210 msgid "region" msgstr "" #: gajim/common/pep.py:211 #, fuzzy msgid "room" msgstr "Digant" #: gajim/common/pep.py:212 msgid "speed" msgstr "" #: gajim/common/pep.py:213 msgid "street" msgstr "" #: gajim/common/pep.py:214 msgid "text" msgstr "" #: gajim/common/pep.py:215 msgid "timestamp" msgstr "" #: gajim/common/pep.py:216 msgid "uri" msgstr "" #: gajim/common/pep.py:343 msgid "Unknown Artist" msgstr "" #: gajim/common/pep.py:346 msgid "Unknown Title" msgstr "" #: gajim/common/pep.py:349 msgid "Unknown Source" msgstr "" #: gajim/common/pep.py:352 #, python-format msgid "" "\"%(title)s\" by %(artist)s\n" "from %(source)s" msgstr "" #: gajim/common/stanza_session.py:422 msgid "" "[This is part of an encrypted session. If you see this message, something " "went wrong.]" msgstr "" #: gajim/common/jingle_rtp.py:123 #, fuzzy, python-format msgid "%s configuration error" msgstr "Kefluniañ ar webgaoz" #: gajim/common/jingle_rtp.py:124 #, python-format msgid "" "Couldn’t setup %(text)s. Check your configuration.\n" "\n" "Pipeline was:\n" "%(pipeline)s\n" "\n" "Error was:\n" "%(error)s" msgstr "" #: gajim/common/jingle_rtp.py:371 msgid "audio input" msgstr "" #: gajim/common/jingle_rtp.py:375 msgid "audio output" msgstr "" #: gajim/common/jingle_rtp.py:433 msgid "video input" msgstr "" #: gajim/common/jingle_rtp.py:440 msgid "video output" msgstr "" #: gajim/common/helpers.py:296 msgid "Server must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:304 msgid "Invalid character in hostname." msgstr "Arouezenn zireizh en anv-ostiz." #: gajim/common/helpers.py:306 msgid "Server address required." msgstr "Chomlec'h ar servijer dre ret" #: gajim/common/helpers.py:310 msgid "Username must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:318 msgid "Invalid character in username." msgstr "Arouezenn ziereizh en anv-arveriad-ez" #: gajim/common/helpers.py:324 msgid "Resource must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:332 msgid "Invalid character in resource." msgstr "" #: gajim/common/helpers.py:372 msgid "_Busy" msgstr "" #: gajim/common/helpers.py:377 msgid "_Not Available" msgstr "D_ihegerz" #: gajim/common/helpers.py:382 msgid "_Free for Chat" msgstr "_Prest da flapiñ" #: gajim/common/helpers.py:387 #, fuzzy msgid "?user status:_Available" msgstr "_Hegerz" #: gajim/common/helpers.py:391 msgid "Connecting" msgstr "O lugañ" #: gajim/common/helpers.py:394 msgid "A_way" msgstr "E_zvezant" #: gajim/common/helpers.py:399 msgid "_Offline" msgstr "_Ezlinenn" #: gajim/common/helpers.py:404 msgid "_Invisible" msgstr "_Diwelus" #: gajim/common/helpers.py:410 msgid "?contact has status:Unknown" msgstr "Dianav" #: gajim/common/helpers.py:412 msgid "?contact has status:Has errors" msgstr "fazi" #: gajim/common/helpers.py:427 msgid "?Subscription we already have:None" msgstr "Hini ebet" #: gajim/common/helpers.py:429 msgid "To" msgstr "Da" #: gajim/common/helpers.py:431 msgid "From" msgstr "Digant" #: gajim/common/helpers.py:433 msgid "Both" msgstr "An daou" #: gajim/common/helpers.py:435 #, fuzzy msgid "Unknown" msgstr "Dianav" #: gajim/common/helpers.py:441 msgid "?Ask (for Subscription):None" msgstr "Hini ebet" #: gajim/common/helpers.py:443 msgid "Subscribe" msgstr "Emezelañ" #: gajim/common/helpers.py:452 msgid "?Group Chat Contact Role:None" msgstr "Hini ebet" #: gajim/common/helpers.py:455 msgid "Moderators" msgstr "Kasourien" #: gajim/common/helpers.py:457 msgid "Moderator" msgstr "Kasour-ez" #: gajim/common/helpers.py:460 msgid "Participants" msgstr "Perzhidi" #: gajim/common/helpers.py:462 msgid "Participant" msgstr "Perzhiad-ez" #: gajim/common/helpers.py:465 msgid "Visitors" msgstr "Gweladennerien" #: gajim/common/helpers.py:467 msgid "Visitor" msgstr "Gweladenner-ez" #: gajim/common/helpers.py:518 msgid "is paying attention to the conversation" msgstr "a zo aketus d'ar gaozeadenn" #: gajim/common/helpers.py:520 msgid "is doing something else" msgstr "a ra un dra bennak all" #: gajim/common/helpers.py:522 #, fuzzy msgid "is composing a message…" msgstr "a skriv ur gemennadenn..." #: gajim/common/helpers.py:525 msgid "paused composing a message" msgstr "a zo paouezet da skrivañ ar gemennadenn" #: gajim/common/helpers.py:527 msgid "has closed the chat window or tab" msgstr "he/en deus serret ar prenestr-flapiñ pe an ivinell" #: gajim/common/helpers.py:754 #, python-format msgid "%s GiB" msgstr "%s Go" #: gajim/common/helpers.py:757 #, python-format msgid "%s GB" msgstr "%s Go" #: gajim/common/helpers.py:761 #, python-format msgid "%s MiB" msgstr "%s Mo" #: gajim/common/helpers.py:764 #, python-format msgid "%s MB" msgstr "%s Mo" #: gajim/common/helpers.py:768 #, python-format msgid "%s KiB" msgstr "%s Ko" #: gajim/common/helpers.py:771 #, python-format msgid "%s KB" msgstr "%s Ko" #: gajim/common/helpers.py:774 #, python-format msgid "%s B" msgstr "%s o" #: gajim/common/helpers.py:1141 gajim/common/helpers.py:1148 #, fuzzy, python-format msgid "%d message pending" msgid_plural "%d messages pending" msgstr[0] "Kas ur gemennadenn" msgstr[1] "Kas ur gemennadenn" #: gajim/common/helpers.py:1155 #, fuzzy, python-format msgid "from room %s" msgstr "De %s" #: gajim/common/helpers.py:1158 gajim/common/helpers.py:1175 #, fuzzy, python-format msgid "from user %s" msgstr "De %s" #: gajim/common/helpers.py:1160 #, fuzzy, python-format msgid "from %s" msgstr "De %s" #: gajim/common/helpers.py:1167 gajim/common/helpers.py:1173 #, python-format msgid "%d event pending" msgid_plural "%d events pending" msgstr[0] "" msgstr[1] "" #: gajim/common/helpers.py:1191 gajim/common/helpers.py:1203 #: gajim/data/gui/roster_window.ui:85 data/org.gajim.Gajim.desktop.in:4 #: data/org.gajim.Gajim.appdata.xml.in:9 msgid "Gajim" msgstr "Gajim" #: gajim/common/helpers.py:1205 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" #: gajim/common/helpers.py:1392 gajim/data/gui/add_new_contact_window.ui:24 msgid "I would like to add you to my contact list." msgstr "Me blijfe din ouzhpennañ ac'hanoc'h em roll-darempredoù." #: gajim/common/helpers.py:1394 msgid "Hello, I am $name." msgstr "" #: gajim/common/helpers.py:1508 gajim/common/helpers.py:1517 #: gajim/common/helpers.py:1576 #, fuzzy msgid "Timeout loading image" msgstr "Dibosupl eo kargañ ar skeudenn" #: gajim/common/helpers.py:1527 gajim/common/helpers.py:1574 msgid "Image is too big" msgstr "L'image est trop grande" #: gajim/common/helpers.py:1538 msgid "PyCURL is not installed" msgstr "" #: gajim/common/helpers.py:1578 #, fuzzy msgid "Error loading image" msgstr "Dibosupl eo kargañ ar skeudenn" #: gajim/common/connection_handlers.py:133 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "" "L'information d'enregistrement pour la passerelle %s n'est pas arrivée à " "temps" #: gajim/common/connection_handlers.py:979 msgid "This message was encrypted with OTR and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:982 msgid "" "This message was encrypted with Legacy OpenPGP and could not be decrypted. " "You can install the PGP plugin to handle those messages." msgstr "" #: gajim/common/connection_handlers.py:986 msgid "" "This message was encrypted with OpenPGP for XMPP and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:992 #, python-format msgid "This message was encrypted with %s and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:1060 msgid "message" msgstr "kemennadenn" #: gajim/common/connection_handlers.py:1863 msgid "I would like to add you to my roster." msgstr "Laouen 'vefen d'ho ouzhpennañ em roll-darempredoù." #: gajim/common/exceptions.py:46 #, python-format msgid "" "The database file (%s) cannot be read. Try to repair it (see https://dev." "gajim.org/gajim/gajim/wikis/help/DatabaseBackup) or remove it (all history " "will be lost)." msgstr "" #: gajim/common/exceptions.py:60 msgid "Service not available: Gajim is not running, or remote_control is False" msgstr "" "Servij dihegerz: n'eo ket loc'het Gajim, pe lakaet eo bet remote_control war " "False" #: gajim/common/exceptions.py:82 #, fuzzy, python-format msgid "" "Session bus is not available.\n" "Try reading %(url)s" msgstr "Le bus de session n'est pas disponible" #: gajim/common/exceptions.py:94 #, fuzzy, python-format msgid "" "System bus is not available.\n" "Try reading %(url)s" msgstr "" "Dihegerz eo bus an estez.\n" "Klaskit o lenn http://trac.gajim.org/wiki/GajimDBus" #: gajim/common/zeroconf/connection_zeroconf.py:193 msgid "Please check if Avahi or Bonjour is installed." msgstr "" #: gajim/common/zeroconf/connection_zeroconf.py:203 #: gajim/common/zeroconf/connection_zeroconf.py:207 #, fuzzy msgid "Could not start local service" msgstr "Dibosupl eo kargañ ar skeudenn" #: gajim/common/zeroconf/connection_zeroconf.py:204 #, fuzzy, python-format msgid "Unable to bind to port %d." msgstr "Impossible de rejoindre le salon" #: gajim/common/zeroconf/connection_zeroconf.py:208 #: gajim/common/zeroconf/connection_zeroconf.py:293 #: gajim/common/zeroconf/connection_zeroconf.py:306 #: gajim/common/zeroconf/connection_zeroconf.py:322 msgid "Please check if avahi-daemon is running." msgstr "" #: gajim/common/zeroconf/connection_zeroconf.py:292 #: gajim/common/zeroconf/connection_zeroconf.py:305 #: gajim/common/zeroconf/connection_zeroconf.py:321 #, fuzzy, python-format msgid "Could not change status of account \"%s\"" msgstr "Dibosupl eo en em lugañ da \"%s\"" #: gajim/common/zeroconf/connection_zeroconf.py:337 #, fuzzy msgid "Your message could not be sent." msgstr "N'eus ket tu da gas ho kemennadenn keit ha ma n'oc'h ket luget." #: gajim/common/zeroconf/connection_zeroconf.py:352 msgid "Contact is offline. Your message could not be sent." msgstr "" #: gajim/common/zeroconf/connection_zeroconf.py:374 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "" #: gajim/common/zeroconf/zeroconf_bonjour.py:197 #: gajim/common/zeroconf/zeroconf_avahi.py:220 #, fuzzy, python-format msgid "Error while adding service. %s" msgstr "fazi en ur gas %s ( %s )" #: gajim/data/gui/blocked_contacts_window.ui:13 #, fuzzy msgid "Blocked Contacts" msgstr "Darempredoù" #: gajim/data/gui/advanced_configuration_window.ui:13 msgid "Advanced Configuration Editor" msgstr "Aozer kefluniañ dre ar munut" #: gajim/data/gui/advanced_configuration_window.ui:35 msgid "Filter:" msgstr "Sil:" #: gajim/data/gui/advanced_configuration_window.ui:107 #: gajim/data/gui/features_window.ui:111 msgid "Description" msgstr "Taolennadur" #: gajim/data/gui/advanced_configuration_window.ui:136 #, fuzzy msgid "NOTE: You should restart Gajim for some settings to take effect" msgstr "" "NOTENN : Dav eo deoc'h adloc'hañ Gajim evit ma vo efedus kemmoù 'zo" #: gajim/data/gui/advanced_configuration_window.ui:161 #, fuzzy msgid "_Reset to default" msgstr "_Distreiñ gant al livioù dre-ziouer" #: gajim/data/gui/join_groupchat_window.ui:34 #, fuzzy msgid "Bookmark this Groupchat" msgstr "_Ouzhpennañ ar webgaoz d'ar sinedoù" #: gajim/data/gui/join_groupchat_window.ui:51 msgid "Join this Groupchat everytime Gajim is started" msgstr "" #: gajim/data/gui/join_groupchat_window.ui:69 #, fuzzy msgid "Bookmark" msgstr "_Ouzhpennañ ar webgaoz d'ar sinedoù" #: gajim/data/gui/join_groupchat_window.ui:82 msgid "Autojoin" msgstr "" #: gajim/data/gui/join_groupchat_window.ui:119 msgid "Account" msgstr "Kont" #: gajim/data/gui/join_groupchat_window.ui:226 #, fuzzy msgid "Room" msgstr "Webgaoz:" #: gajim/data/gui/join_groupchat_window.ui:238 #, fuzzy msgid "Recently" msgstr "Nevez 'zo:" #: gajim/data/gui/join_groupchat_window.ui:290 msgid "Search the rooms on this server" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:12 #, fuzzy msgid "HTTP Connect" msgstr "Kevreadenn HTTP" #: gajim/data/gui/manage_proxies_window.ui:15 msgid "SOCKS5" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:18 msgid "BOSH" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:25 msgid "Manage Proxy Profiles" msgstr "Merañ an aeladoù proksi" #: gajim/data/gui/manage_proxies_window.ui:148 #, fuzzy msgid "_Name:" msgstr "_Anv:" #: gajim/data/gui/manage_proxies_window.ui:161 #, fuzzy msgid "_Type:" msgstr "Doare:" #: gajim/data/gui/manage_proxies_window.ui:205 msgid "Properties" msgstr "Perzhioù" #: gajim/data/gui/manage_proxies_window.ui:234 #, fuzzy msgid "_BOSH URL:" msgstr "_URL :" #: gajim/data/gui/manage_proxies_window.ui:258 #, fuzzy msgid "Proxy _Host:" msgstr "Proksi:" #: gajim/data/gui/manage_proxies_window.ui:269 #, fuzzy msgid "Use HTTP prox_y" msgstr "_Implij ur proxy" #: gajim/data/gui/manage_proxies_window.ui:288 #, fuzzy msgid "Proxy _Port:" msgstr "_Porzh:" #: gajim/data/gui/manage_proxies_window.ui:299 #, fuzzy msgid "Use proxy auth_entication" msgstr "Implij an diskleriañ" #: gajim/data/gui/manage_proxies_window.ui:318 msgid "_Username:" msgstr "_Anv:" #: gajim/data/gui/manage_proxies_window.ui:331 msgid "Pass_word:" msgstr "_Ger-kuzh:" #: gajim/data/gui/manage_proxies_window.ui:391 msgid "Settings" msgstr "Dibarzhioù" #: gajim/data/gui/change_password_dialog.ui:89 msgid "Enter new password:" msgstr "Roit ur ger-kuzh nevez:" #: gajim/data/gui/change_password_dialog.ui:115 msgid "Enter it again for confirmation:" msgstr "Roit anezhañ en-dro evit kadarnaat:" #: gajim/data/gui/zeroconf_information_window.ui:8 #: gajim/data/gui/vcard_information_window.ui:8 msgid "Contact Information" msgstr "Titouroù" #: gajim/data/gui/zeroconf_information_window.ui:54 msgid "Local jid:" msgstr "" #: gajim/data/gui/zeroconf_information_window.ui:67 #: gajim/data/gui/tooltip_roster_contact.ui:55 #: gajim/data/gui/tooltip_gc_contact.ui:75 msgid "Resource:" msgstr "" #: gajim/data/gui/zeroconf_information_window.ui:80 #: gajim/data/gui/tooltip_roster_contact.ui:110 msgid "Status:" msgstr "Stad:" #: gajim/data/gui/zeroconf_information_window.ui:89 #: gajim/data/gui/history_window.ui:290 msgid "_Log conversation history" msgstr "_Istoradur flapiñ" #: gajim/data/gui/zeroconf_information_window.ui:215 #: gajim/data/gui/vcard_information_window.ui:360 #, fuzzy msgid "Contact" msgstr "Darempredoù" #: gajim/data/gui/zeroconf_information_window.ui:234 #, fuzzy msgid "First Name:" msgstr "Anv:" #: gajim/data/gui/zeroconf_information_window.ui:247 #, fuzzy msgid "Last Name:" msgstr "Anv:" #: gajim/data/gui/zeroconf_information_window.ui:260 #: gajim/data/gui/archiving_313_preferences_item.ui:84 #: gajim/data/gui/tooltip_roster_contact.ui:30 #: gajim/data/gui/tooltip_gc_contact.ui:50 msgid "Jabber ID:" msgstr "ID Jabber:" #: gajim/data/gui/zeroconf_information_window.ui:273 msgid "E-Mail:" msgstr "Postel:" #: gajim/data/gui/zeroconf_information_window.ui:354 #, fuzzy msgid "Personal" msgstr "Titouroù hiniennel" #: gajim/data/gui/gc_occupants_menu.ui:12 msgid "_Send Private Message" msgstr "_Kas ur gemennadenn brevez" #: gajim/data/gui/gc_occupants_menu.ui:21 msgid "Send _File" msgstr "Kas ur _restr" #: gajim/data/gui/gc_occupants_menu.ui:29 #, fuzzy msgid "Occupant Actions" msgstr "_Galloudoù an darempred" #: gajim/data/gui/gc_occupants_menu.ui:38 msgid "_Voice" msgstr "" #: gajim/data/gui/gc_occupants_menu.ui:46 msgid "Mo_derator" msgstr "Ka_sour-ez" #: gajim/data/gui/gc_occupants_menu.ui:60 msgid "_Member" msgstr "_Ezel" #: gajim/data/gui/gc_occupants_menu.ui:68 msgid "_Admin" msgstr "_Merour-ez" #: gajim/data/gui/gc_occupants_menu.ui:76 msgid "_Owner" msgstr "_Perc'hener-ez" #: gajim/data/gui/gc_occupants_menu.ui:90 msgid "_Kick" msgstr "_Ermaeziañ" #: gajim/data/gui/gc_occupants_menu.ui:98 msgid "_Ban" msgstr "_Argas" #: gajim/data/gui/gc_occupants_menu.ui:124 msgid "_Add to Roster" msgstr "_Ouzhpennañ er roll" #: gajim/data/gui/gc_occupants_menu.ui:132 #, fuzzy msgid "_Execute command" msgstr "urzhiad" #: gajim/data/gui/archiving_313_preferences_item.ui:12 #: gajim/data/gui/preferences_window.ui:102 #: gajim/data/gui/preferences_window.ui:153 #: gajim/data/gui/archiving_313_preferences_window.ui:25 #, fuzzy msgid "Always" msgstr "Ezvezant" #: gajim/data/gui/archiving_313_preferences_item.ui:15 #: gajim/data/gui/preferences_window.ui:96 #: gajim/data/gui/preferences_window.ui:156 #: gajim/data/gui/archiving_313_preferences_window.ui:31 #, fuzzy msgid "Never" msgstr "_Morse" #: gajim/data/gui/archiving_313_preferences_item.ui:96 #, fuzzy msgid "Preference:" msgstr "Penndibaboù" #: gajim/data/gui/tooltip_roster_contact.ui:125 #, fuzzy msgid "Idle since:" msgstr "dibaoe %s" #: gajim/data/gui/tooltip_roster_contact.ui:151 #: gajim/data/gui/change_status_message_dialog.ui:191 #, fuzzy msgid "Mood:" msgstr "Webgaoz:" #: gajim/data/gui/tooltip_roster_contact.ui:164 #: gajim/data/gui/change_status_message_dialog.ui:179 #, fuzzy msgid "Activity:" msgstr "Oberiant" #: gajim/data/gui/tooltip_roster_contact.ui:178 #, fuzzy msgid "Tune:" msgstr "Doare:" #: gajim/data/gui/tooltip_roster_contact.ui:191 #, fuzzy msgid "Location:" msgstr "Kemmañ ar gont" #: gajim/data/gui/tooltip_roster_contact.ui:255 #, fuzzy msgid "OpenPGP:" msgstr "OpenPGP : " #: gajim/data/gui/tooltip_roster_contact.ui:281 msgid "Subscription:" msgstr "Koumanant:" #: gajim/data/gui/zeroconf_context_menu.ui:11 #: gajim/data/gui/account_context_menu.ui:11 msgid "_Status" msgstr "_Stad" #: gajim/data/gui/zeroconf_context_menu.ui:26 #: gajim/data/gui/account_context_menu.ui:79 msgid "_Modify Account..." msgstr "_Kemmañ ar gont..." #: gajim/data/gui/atom_entry_window.ui:8 #, fuzzy msgid "New entry received" msgstr "Pa resever un darvoud nevez" #: gajim/data/gui/atom_entry_window.ui:92 #, fuzzy msgid "Feed name:" msgstr "anv ar gwiskadur" #: gajim/data/gui/atom_entry_window.ui:119 #, fuzzy msgid "Entry:" msgstr "Bro:" #: gajim/data/gui/atom_entry_window.ui:131 #, fuzzy msgid "Last modified:" msgstr "Anv:" #: gajim/data/gui/atom_entry_window.ui:196 msgid "Next entry" msgstr "" #: gajim/data/gui/gc_control_popup_menu.ui:11 #, fuzzy msgid "Change _Nickname..." msgstr "Cheñch _lesanv" #: gajim/data/gui/gc_control_popup_menu.ui:20 #, fuzzy msgid "_Manage Room" msgstr "Merañ ar sinedoù" #: gajim/data/gui/gc_control_popup_menu.ui:31 #, fuzzy msgid "Change _Subject..." msgstr "Kemmañ ar _sujed" #: gajim/data/gui/gc_control_popup_menu.ui:38 #, fuzzy msgid "Configure _Room..." msgstr "Ke_fluniañ ar flap" #: gajim/data/gui/gc_control_popup_menu.ui:52 #, fuzzy msgid "_Destroy Room" msgstr "Taolennadur: %s" #: gajim/data/gui/gc_control_popup_menu.ui:64 msgid "_Minimize on close" msgstr "" #: gajim/data/gui/gc_control_popup_menu.ui:85 msgid "_Request Voice" msgstr "" #: gajim/data/gui/profile_window.ui:7 msgid "Personal Information" msgstr "Titouroù hiniennel" #: gajim/data/gui/profile_window.ui:35 #: gajim/data/gui/vcard_information_window.ui:382 #, fuzzy msgid "Name:" msgstr "Personelaet" #: gajim/data/gui/profile_window.ui:59 #: gajim/data/gui/vcard_information_window.ui:410 #, fuzzy msgid "Nickname:" msgstr "Lesanv:" #. Family Name #: gajim/data/gui/profile_window.ui:94 #: gajim/data/gui/vcard_information_window.ui:740 #, fuzzy msgid "Family:" msgstr "Familh:" #. Given Name #: gajim/data/gui/profile_window.ui:118 #: gajim/data/gui/vcard_information_window.ui:822 #, fuzzy msgid "Given:" msgstr "OpenPGP" #. Middle Name #: gajim/data/gui/profile_window.ui:142 #: gajim/data/gui/vcard_information_window.ui:753 #, fuzzy msgid "Middle:" msgstr "Furmad ul linenn" #. Prefix in Name #: gajim/data/gui/profile_window.ui:156 #: gajim/data/gui/vcard_information_window.ui:766 #, fuzzy msgid "Prefix:" msgstr "Perzhioù" #. Suffix in Name #: gajim/data/gui/profile_window.ui:190 #: gajim/data/gui/vcard_information_window.ui:835 #, fuzzy msgid "Suffix:" msgstr "Sonioù" #: gajim/data/gui/profile_window.ui:222 #: gajim/data/gui/vcard_information_window.ui:878 #, fuzzy msgid "Full Name" msgstr "Personelaet" #: gajim/data/gui/profile_window.ui:250 gajim/data/gui/profile_window.ui:724 #: gajim/data/gui/vcard_information_window.ui:454 #: gajim/data/gui/vcard_information_window.ui:1087 #, fuzzy msgid "Street:" msgstr "Dibarzhioù" #: gajim/data/gui/profile_window.ui:274 gajim/data/gui/profile_window.ui:748 #: gajim/data/gui/vcard_information_window.ui:535 #: gajim/data/gui/vcard_information_window.ui:1126 #, fuzzy msgid "Extra Address:" msgstr "Chomlec'h 2:" #: gajim/data/gui/profile_window.ui:298 gajim/data/gui/profile_window.ui:772 #: gajim/data/gui/vcard_information_window.ui:467 #: gajim/data/gui/vcard_information_window.ui:1100 #, fuzzy msgid "City:" msgstr "Personelaet" #: gajim/data/gui/profile_window.ui:322 gajim/data/gui/profile_window.ui:796 #: gajim/data/gui/vcard_information_window.ui:548 #: gajim/data/gui/vcard_information_window.ui:1140 #, fuzzy msgid "Postal Code:" msgstr "Kod postel:" #: gajim/data/gui/profile_window.ui:346 gajim/data/gui/profile_window.ui:820 #: gajim/data/gui/vcard_information_window.ui:480 #: gajim/data/gui/vcard_information_window.ui:1113 #, fuzzy msgid "State:" msgstr "Dibarzhioù" #: gajim/data/gui/profile_window.ui:370 gajim/data/gui/profile_window.ui:844 #: gajim/data/gui/vcard_information_window.ui:561 #: gajim/data/gui/vcard_information_window.ui:1153 #, fuzzy msgid "Country:" msgstr "Sonioù" #: gajim/data/gui/profile_window.ui:396 gajim/data/gui/profile_window.ui:870 #: gajim/data/gui/vcard_information_window.ui:618 #: gajim/data/gui/vcard_information_window.ui:1253 #, fuzzy msgid "Address" msgstr "Furmad ul linenn" #: gajim/data/gui/profile_window.ui:413 #: gajim/data/gui/vcard_information_window.ui:635 #, fuzzy msgid "Homepage:" msgstr "Lec'hienn hiniennel:" #: gajim/data/gui/profile_window.ui:437 gajim/data/gui/profile_window.ui:887 #: gajim/data/gui/vcard_information_window.ui:648 #: gajim/data/gui/vcard_information_window.ui:1270 #, fuzzy msgid "E-Mail:" msgstr "Postel:" #: gajim/data/gui/profile_window.ui:462 gajim/data/gui/profile_window.ui:912 #: gajim/data/gui/vcard_information_window.ui:661 #: gajim/data/gui/vcard_information_window.ui:1283 #, fuzzy msgid "Phone No.:" msgstr "Pellgomz:" #: gajim/data/gui/profile_window.ui:497 #, fuzzy msgid "Avatar:" msgstr "Dibab ur _skeudenn" #: gajim/data/gui/profile_window.ui:540 msgid "Click to set your avatar" msgstr "" #: gajim/data/gui/profile_window.ui:566 #: gajim/data/gui/vcard_information_window.ui:702 msgid "Format: YYYY-MM-DD" msgstr "Stumm : BBBB-MM-DD" #: gajim/data/gui/profile_window.ui:574 #: gajim/data/gui/vcard_information_window.ui:708 #, fuzzy msgid "Birthday:" msgstr "Deiz-ha-bloaz:" #: gajim/data/gui/profile_window.ui:598 #: gajim/data/gui/vcard_information_window.ui:937 #, fuzzy msgid "Personal Info" msgstr "Titouroù hiniennel" #: gajim/data/gui/profile_window.ui:617 #: gajim/data/gui/vcard_information_window.ui:960 #, fuzzy msgid "Company:" msgstr "Personelaet" #: gajim/data/gui/profile_window.ui:641 #: gajim/data/gui/vcard_information_window.ui:990 #, fuzzy msgid "Department:" msgstr "Departamant:" #: gajim/data/gui/profile_window.ui:665 #: gajim/data/gui/vcard_information_window.ui:1018 #, fuzzy msgid "Position:" msgstr "Sonioù" #: gajim/data/gui/profile_window.ui:689 #: gajim/data/gui/vcard_information_window.ui:1045 #, fuzzy msgid "Role:" msgstr "Sonioù" #: gajim/data/gui/profile_window.ui:947 #: gajim/data/gui/vcard_information_window.ui:1336 msgid "Work" msgstr "Labour" #. "About" is the text of a tab of vcard window #: gajim/data/gui/profile_window.ui:979 #: gajim/data/gui/vcard_information_window.ui:1368 #: gajim/data/gui/application_menu.ui:62 msgid "About" msgstr "Diwar-benn" #: gajim/data/gui/filetransfers.ui:20 #, fuzzy msgid "Con_tinue" msgstr "_Kenderc'hel" #: gajim/data/gui/filetransfers.ui:28 gajim/data/gui/filetransfers.ui:156 msgid "_Pause" msgstr "_Ehan" #: gajim/data/gui/filetransfers.ui:36 gajim/data/gui/filetransfers.ui:174 #: gajim/data/gui/service_registration_window.ui:53 msgid "_Cancel" msgstr "_Nullañ" #: gajim/data/gui/filetransfers.ui:50 msgid "_Open Containing Folder" msgstr "_Digeriñ ar renkell pal" #: gajim/data/gui/filetransfers.ui:79 gajim/data/gui/filetransfers.ui:253 msgid "File Transfers" msgstr "Treuzkasoù" #: gajim/data/gui/filetransfers.ui:110 msgid "file transfers list" msgstr "roll an treuzkasadoù" #: gajim/data/gui/filetransfers.ui:111 msgid "A list of active, completed and stopped file transfers" msgstr "Ur roll eus an treuzkasoù oberiant, echu pe arsavet" #: gajim/data/gui/filetransfers.ui:131 msgid "Clean _up" msgstr "_Naetaat" #: gajim/data/gui/filetransfers.ui:137 #, fuzzy msgid "Removes completed, cancelled and failed file transfers from the list" msgstr "Diverkañ an treuzkasadoù echu, nullaet pe sac'het" #: gajim/data/gui/filetransfers.ui:143 msgid "Remove file transfer from the list." msgstr "Dilemel an treuzkas restroù diwar ar roll" #: gajim/data/gui/filetransfers.ui:144 msgid "" "This action removes single file transfer from the list. If the transfer is " "active, it is first stopped and then removed" msgstr "" "An ober-mañ a zilam an treuzkasoù diouzh ar roll. Ma 'z eus un treuzkas " "oberiant, e vo arsavet anezhañ ha dilamet da c'houde" #: gajim/data/gui/filetransfers.ui:180 #, fuzzy msgid "Cancels the selected file transfer and removes incomplete files" msgstr "A nulla an treuzkas dibabet hag a zilam ar restr diglok" #: gajim/data/gui/filetransfers.ui:186 msgid "Cancel file transfer" msgstr "Nullañ an treuzkas" #: gajim/data/gui/filetransfers.ui:187 msgid "Cancels the selected file transfer" msgstr "A nulla an treuzkas dibabet" #: gajim/data/gui/filetransfers.ui:199 #, fuzzy msgid "_Close" msgstr "_Kas & Serriñ" #: gajim/data/gui/filetransfers.ui:205 msgid "Hides the window" msgstr "A guzha ar prenestr" #: gajim/data/gui/filetransfers.ui:226 msgid "_Notify me when a file transfer is complete" msgstr "_Kelaouiñ ac'hanon p'eo echu un treuzkas" #: gajim/data/gui/filetransfers.ui:236 msgid "When a file transfer is complete show a popup notification" msgstr "P'eo echu un treuzkas, diskouez ur gemennadenn gelaouiñ difoupus" #: gajim/data/gui/filetransfers.ui:254 #, fuzzy msgid "Shows a list of file transfers between you and others" msgstr "A ziskouez ur roll eus an dreuzkasoù etrezoc'h hag ar re all" #: gajim/data/gui/service_registration_window.ui:18 msgid "Register to" msgstr "En em enrollañ war" #: gajim/data/gui/service_registration_window.ui:70 #: gajim/data/gui/roster_item_exchange_window.ui:126 msgid "_OK" msgstr "_Mat eo" #: gajim/data/gui/groupchat_control.ui:13 gajim/data/gui/chat_control.ui:293 #: gajim/data/gui/gajim_themes_window.ui:264 msgid "Bold" msgstr "Tev" #: gajim/data/gui/groupchat_control.ui:22 gajim/data/gui/chat_control.ui:302 #: gajim/data/gui/gajim_themes_window.ui:284 msgid "Italic" msgstr "Stouet" #: gajim/data/gui/groupchat_control.ui:31 gajim/data/gui/chat_control.ui:311 #, fuzzy msgid "Underline" msgstr "Islinennañ" #: gajim/data/gui/groupchat_control.ui:40 gajim/data/gui/chat_control.ui:320 #, fuzzy msgid "Strike" msgstr "Lesanv" #: gajim/data/gui/groupchat_control.ui:62 gajim/data/gui/chat_control.ui:342 #, fuzzy msgid "Font" msgstr "_Nodrezh:" #: gajim/data/gui/groupchat_control.ui:76 gajim/data/gui/chat_control.ui:356 #, fuzzy msgid "Clear formatting" msgstr "Titouroù" #: gajim/data/gui/groupchat_control.ui:283 gajim/data/gui/chat_control.ui:805 #, fuzzy msgid "Choose an encryption" msgstr "Dibabit ur restr da gas..." #: gajim/data/gui/groupchat_control.ui:329 gajim/data/gui/chat_control.ui:853 #, fuzzy msgid "Show a list of emoticons (Alt+M)" msgstr "Klikit evit enlakaat ur boulomell (Alt+M)" #: gajim/data/gui/popup_notification_window.ui:55 #, fuzzy msgid "Event Type" msgstr "Darvoud" #: gajim/data/gui/popup_notification_window.ui:100 #, fuzzy msgid "Event desc" msgstr "Darvoudoù" #: gajim/data/gui/chat_control.ui:41 #, fuzzy msgid "1" msgstr "Sonioù" #: gajim/data/gui/chat_control.ui:63 #, fuzzy msgid "2 abc" msgstr "Sonioù" #: gajim/data/gui/chat_control.ui:84 #, fuzzy msgid "3 def" msgstr "Sonioù" #: gajim/data/gui/chat_control.ui:105 #, fuzzy msgid "4 ghi" msgstr "Sonioù" #: gajim/data/gui/chat_control.ui:126 #, fuzzy msgid "5 jkl" msgstr "Sonioù" #: gajim/data/gui/chat_control.ui:147 #, fuzzy msgid "6 mno" msgstr "Sonioù" #: gajim/data/gui/chat_control.ui:167 msgid "7 pqrs" msgstr "" #: gajim/data/gui/chat_control.ui:188 #, fuzzy msgid "8 tuv" msgstr "Sonioù" #: gajim/data/gui/chat_control.ui:209 msgid "9 wxyz" msgstr "" #: gajim/data/gui/chat_control.ui:229 #, fuzzy msgid "*" msgstr "Sonioù" #: gajim/data/gui/chat_control.ui:249 #, fuzzy msgid "0" msgstr "Sonioù" #: gajim/data/gui/chat_control.ui:269 #, fuzzy msgid "#" msgstr "Sonioù" #: gajim/data/gui/chat_control.ui:729 msgid "#" msgstr "" #: gajim/data/gui/vcard_information_window.ui:55 #, fuzzy msgid "Jabber ID:" msgstr "ID Jabber:" #: gajim/data/gui/vcard_information_window.ui:69 #, fuzzy msgid "Resource:" msgstr "Une erreur de protocole s'est produite :" #: gajim/data/gui/vcard_information_window.ui:83 #, fuzzy msgid "Status:" msgstr "Dibarzhioù" #: gajim/data/gui/vcard_information_window.ui:97 #, fuzzy msgid "Client:" msgstr "Personelaet" #: gajim/data/gui/vcard_information_window.ui:111 #, fuzzy msgid "System:" msgstr "Personelaet" #: gajim/data/gui/vcard_information_window.ui:125 #, fuzzy msgid "Contact time:" msgstr "Dibarzhioù" #: gajim/data/gui/vcard_information_window.ui:222 #, fuzzy msgid "User avatar:" msgstr "Dibab ur _skeudenn" #: gajim/data/gui/vcard_information_window.ui:234 #, fuzzy msgid "Configured avatar:" msgstr "Ke_fluniañ ar flap" #. Given Name #: gajim/data/gui/vcard_information_window.ui:263 #, fuzzy msgid "Ask:" msgstr "Poelladoù" #. Family Name #: gajim/data/gui/vcard_information_window.ui:277 #, fuzzy msgid "Subscription:" msgstr "Taolennadur" #: gajim/data/gui/vcard_information_window.ui:893 #: gajim/data/gui/vcard_information_window.ui:912 #: gajim/data/gui/vcard_information_window.ui:1310 msgid "button" msgstr "" #: gajim/data/gui/vcard_information_window.ui:1398 #, fuzzy msgid "Comments" msgstr "Evezhiadenn: %s" #: gajim/data/gui/gajim_themes_window.ui:12 #, fuzzy msgid "Account row" msgstr "Kont" #: gajim/data/gui/gajim_themes_window.ui:15 #, fuzzy msgid "Group row" msgstr "Strollad" #: gajim/data/gui/gajim_themes_window.ui:18 #, fuzzy msgid "Contact row" msgstr "Darempredoù" #: gajim/data/gui/gajim_themes_window.ui:21 msgid "Chat Banner" msgstr "" #: gajim/data/gui/gajim_themes_window.ui:28 msgid "Gajim Themes Customization" msgstr "Personelaat gwiskadurioù Gajim" #: gajim/data/gui/gajim_themes_window.ui:157 msgid "Text _color:" msgstr "_Liv ar skrid:" #: gajim/data/gui/gajim_themes_window.ui:173 msgid "_Background:" msgstr "_Drekleur:" #: gajim/data/gui/gajim_themes_window.ui:189 msgid "Text _font:" msgstr "_Nodrezh ar skrid:" #: gajim/data/gui/gajim_themes_window.ui:207 msgid "Font style:" msgstr "Neuz an nodrezh:" #: gajim/data/gui/gajim_themes_window.ui:375 msgid "Composing" msgstr "O skrivañ" #: gajim/data/gui/gajim_themes_window.ui:387 msgid "Paused" msgstr "Ehan" #: gajim/data/gui/gajim_themes_window.ui:399 msgid "Gone" msgstr "Aet kuit" #: gajim/data/gui/gajim_themes_window.ui:411 msgid "" "MUC\n" "Messages" msgstr "" "Kemennadennoù\n" "webgaoz" #: gajim/data/gui/gajim_themes_window.ui:424 msgid "" "MUC Directed\n" "Messages" msgstr "" "Kemennadennoù\n" "kaset davet\n" "webkaozioù" #: gajim/data/gui/gajim_themes_window.ui:510 msgid "Chatstate Tab Colors" msgstr "Liv-stad an ivinelloù" #: gajim/data/gui/preferences_window.ui:48 msgid "Use default applications" msgstr "" #: gajim/data/gui/preferences_window.ui:51 #, fuzzy msgid "Custom" msgstr "Personelaet" #: gajim/data/gui/preferences_window.ui:62 #: gajim/data/gui/preferences_window.ui:79 #, fuzzy msgid "All chat states" msgstr "Stad:" #: gajim/data/gui/preferences_window.ui:65 #: gajim/data/gui/preferences_window.ui:82 #, fuzzy msgid "Composing only" msgstr "O skrivañ" #: gajim/data/gui/preferences_window.ui:99 msgid "Only when pending events" msgstr "" #: gajim/data/gui/preferences_window.ui:113 #, fuzzy msgid "Pop it up" msgstr "Di_foupañ" #: gajim/data/gui/preferences_window.ui:116 #, fuzzy msgid "Notify me about it" msgstr "_Kelaouiñ ac'hanon" #: gajim/data/gui/preferences_window.ui:119 #, fuzzy msgid "Show only in roster" msgstr "Diskouez er _roll hepken" #: gajim/data/gui/preferences_window.ui:130 msgid "Detached roster with detached chats" msgstr "" #: gajim/data/gui/preferences_window.ui:133 msgid "Detached roster with single chat" msgstr "" #: gajim/data/gui/preferences_window.ui:136 msgid "Single window for everything" msgstr "" #: gajim/data/gui/preferences_window.ui:139 msgid "Detached roster with chat grouped by account" msgstr "" #: gajim/data/gui/preferences_window.ui:142 msgid "Detached roster with chat grouped by type" msgstr "" #: gajim/data/gui/preferences_window.ui:159 #, fuzzy msgid "Last state" msgstr "Stad diwezhañ: %s" #: gajim/data/gui/preferences_window.ui:195 #: gajim/data/gui/application_menu.ui:94 gajim/data/gui/shortcuts_window.ui:188 msgid "Preferences" msgstr "Penndibaboù" #: gajim/data/gui/preferences_window.ui:237 msgid "Display a_vatars of contacts in roster" msgstr "Diskouez _skeudennigoù an darempredoù er roll" #: gajim/data/gui/preferences_window.ui:241 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" msgstr "" "Si cette case est cochée, Gajim affichera l'avatar de chaque contact dans la " "fenêtre principale et les salons" #: gajim/data/gui/preferences_window.ui:255 msgid "Display status _messages of contacts in roster" msgstr "Diskouez titouroù-stad an darempredoù e-barzh ar roll" #: gajim/data/gui/preferences_window.ui:259 #, fuzzy msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name, in roster window and in group chats" msgstr "" "Si cette case est cochée, Gajim affichera le message d'état, sous le nom de " "chaque contact dans la fenêtre principale et les salons" #: gajim/data/gui/preferences_window.ui:273 #, fuzzy msgid "Display e_xtra information of contacts in roster (mood, activity, ...)" msgstr "Diskouez _skeudennigoù an darempredoù er roll" #: gajim/data/gui/preferences_window.ui:277 #, fuzzy msgid "" "If checked, Gajim will display the mood of contacts in the roster window" msgstr "" "Si cette case est cochée, Gajim affichera l'avatar de chaque contact dans la " "fenêtre principale et les salons" #: gajim/data/gui/preferences_window.ui:298 #, fuzzy msgid "Sort contacts by status" msgstr "_Urzhiañ an darempredoù hervez o stad" #: gajim/data/gui/preferences_window.ui:308 #, fuzzy msgid "in _roster" msgstr "Ket er roll" #: gajim/data/gui/preferences_window.ui:325 #, fuzzy msgid "in _group chats" msgstr "Ebarzhiñ ur _webgaoz" #: gajim/data/gui/preferences_window.ui:354 msgid "Roster Appearance" msgstr "" #: gajim/data/gui/preferences_window.ui:384 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" msgstr "" "M'eo lazhet, ne vo ket erlec'hiet ar voulomelloù ascii doare ':)' gant " "boulomelloù grafikel fiñv pe difiñv" #: gajim/data/gui/preferences_window.ui:390 #, fuzzy msgid "_Emoticons:" msgstr "Boulomelloù:" #: gajim/data/gui/preferences_window.ui:406 msgid "_Window behavior:" msgstr "" #: gajim/data/gui/preferences_window.ui:420 #, fuzzy msgid "_Show roster on startup:" msgstr "Diskouez ar _roll-darempredoù" #: gajim/data/gui/preferences_window.ui:431 msgid "_Ignore rich content in incoming messages" msgstr "" #: gajim/data/gui/preferences_window.ui:435 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." msgstr "" #: gajim/data/gui/preferences_window.ui:449 msgid "_Highlight misspelled words" msgstr "_Islinennañ ar fazioù reizhskrivañ" #: gajim/data/gui/preferences_window.ui:452 msgid "" "If checked, Gajim will highlight spelling errors in input fields of chat " "windows. If no language is explicitly set via right click on the input " "field, the default language will be used for this contact or group chat." msgstr "" #: gajim/data/gui/preferences_window.ui:466 msgid "Notify by icon when your messages are received" msgstr "" #: gajim/data/gui/preferences_window.ui:520 msgid "Show avatar in chat tabs" msgstr "" #: gajim/data/gui/preferences_window.ui:552 #, fuzzy msgid "Chat Appearance" msgstr "Furmad ul linenn" #: gajim/data/gui/preferences_window.ui:607 #, fuzzy msgid "When new event is received:" msgstr "Pa resever un darvoud nevez" #: gajim/data/gui/preferences_window.ui:645 #, fuzzy msgid "Notify me about contacts that sign _in" msgstr "Ma c'helaouiñ pa c'hoarvez gant un darempred:" #: gajim/data/gui/preferences_window.ui:663 #, fuzzy msgid "Notify me about contacts that sign _out" msgstr "Ma c'helaouiñ pa c'hoarvez gant un darempred:" #: gajim/data/gui/preferences_window.ui:667 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" msgstr "" "Gajim vous signalera par une fenêtre de notification en bas à droite de " "l'écran qu'un contact s'est déconnecté" #: gajim/data/gui/preferences_window.ui:681 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" msgstr "Aotren ar c'helaouennoù p'emaon _ezvezant/dihegerz/busy/diwelus" #: gajim/data/gui/preferences_window.ui:698 #, fuzzy msgid "Allow popup/notifications when a chat window is opened" msgstr "Aotren ar c'helaouennoù p'emaon _ezvezant/dihegerz/busy/diwelus" #: gajim/data/gui/preferences_window.ui:722 #, fuzzy msgid "Show notification area icon:" msgstr "_Implij an arlun-gelaouiñ (trayicon)" #: gajim/data/gui/preferences_window.ui:762 msgid "Visual Notifications" msgstr "Kelaouennoù dre welet" #: gajim/data/gui/preferences_window.ui:795 msgid "Play _sounds" msgstr "_Seniñ" #: gajim/data/gui/preferences_window.ui:812 #: gajim/data/gui/preferences_window.ui:1656 msgid "Ma_nage..." msgstr "Me_rañ..." #: gajim/data/gui/preferences_window.ui:834 msgid "Allow sound when I'm _busy" msgstr "" #: gajim/data/gui/preferences_window.ui:856 msgid "Sounds" msgstr "Sonioù" #: gajim/data/gui/preferences_window.ui:877 #, fuzzy msgid "Notifications" msgstr "Kemmañ ar gont" #: gajim/data/gui/preferences_window.ui:911 #, fuzzy msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " "display in chat windows." msgstr "" "Gajim peut envoyer et recevoir des meta-informations concernant les " "conversations que vous pouvez avoir avec un contact. Vous pouvez ici " "spécifier quel état de conversation vous voulez envoyer à vos contacts" #: gajim/data/gui/preferences_window.ui:916 #, fuzzy msgid "_Display chat state notifications:" msgstr "Titou_roù-stad ar flap:" #: gajim/data/gui/preferences_window.ui:967 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " "send to the other party." msgstr "" "Gajim peut envoyer et recevoir des meta-informations concernant les " "conversations que vous pouvez avoir avec un contact. Vous pouvez ici " "spécifier quel état de conversation vous voulez envoyer à vos contacts" #: gajim/data/gui/preferences_window.ui:972 #, fuzzy msgid "_Send chat state notifications:" msgstr "Titou_roù-stad ar flap:" #: gajim/data/gui/preferences_window.ui:990 #, fuzzy msgid "Chat state notifications" msgstr "Kelaouennoù dre welet" #: gajim/data/gui/preferences_window.ui:1012 #, fuzzy msgid "Personal Events" msgstr "Titouroù hiniennel" #: gajim/data/gui/preferences_window.ui:1043 #, fuzzy msgid "_Away after:" msgstr "Bezañ lakaet da _ezvezant war-lerc'h:" #: gajim/data/gui/preferences_window.ui:1047 #, fuzzy msgid "" "If checked, Gajim will change status to Away when the computer is unused." msgstr "" "Si cette case est cochée, Gajim placera une icône dans la zone de " "notification" #: gajim/data/gui/preferences_window.ui:1060 #, fuzzy msgid "_Not available after:" msgstr "Bezañ lakaet evel _dihegerz war-lerc'h:" #: gajim/data/gui/preferences_window.ui:1064 msgid "" "If checked, Gajim will change status to Not Available when the computer has " "not been used even longer" msgstr "" #: gajim/data/gui/preferences_window.ui:1079 #: gajim/data/gui/preferences_window.ui:1091 msgid "minutes" msgstr "munutenn" #: gajim/data/gui/preferences_window.ui:1103 msgid "" "The auto away status message. If empty, Gajim will not change the current " "status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-away timeout" msgstr "" #: gajim/data/gui/preferences_window.ui:1117 msgid "" "The auto not available status message. If empty, Gajim will not change the " "current status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-not-available timeout" msgstr "" #: gajim/data/gui/preferences_window.ui:1165 #, fuzzy msgid "Auto Status" msgstr "Poelladoù" #: gajim/data/gui/preferences_window.ui:1200 msgid "Ask status message when I:" msgstr "Goulenn an titour-stad pa:" #: gajim/data/gui/preferences_window.ui:1215 msgid "Sign _in" msgstr "_Lugañ" #: gajim/data/gui/preferences_window.ui:1232 msgid "Sign _out" msgstr "_Dilugañ" #: gajim/data/gui/preferences_window.ui:1265 msgid "" "If enabled, Gajim will not ask for a status message. The specified default " "message will be used instead." msgstr "" #: gajim/data/gui/preferences_window.ui:1277 #: gajim/data/gui/preferences_window.ui:1479 msgid "Status" msgstr "Stad" #: gajim/data/gui/preferences_window.ui:1288 #, fuzzy msgid "Default Message" msgstr "Titour-stad" #: gajim/data/gui/preferences_window.ui:1303 #, fuzzy msgid "Enabled" msgstr "Enaouiñ" #: gajim/data/gui/preferences_window.ui:1329 #, fuzzy msgid "Status Messages" msgstr "Titouroù-stad raklakaet" #: gajim/data/gui/preferences_window.ui:1459 msgid "Preset Status Messages" msgstr "Titouroù-stad raklakaet" #: gajim/data/gui/preferences_window.ui:1512 #, fuzzy msgid "Chat message:" msgstr "_Titour-stad:" #: gajim/data/gui/preferences_window.ui:1537 msgid "Use system _default" msgstr "" #: gajim/data/gui/preferences_window.ui:1560 #, fuzzy msgid "Font" msgstr "Sonioù" #: gajim/data/gui/preferences_window.ui:1590 msgid "T_heme:" msgstr "_Gwiskadur:" #: gajim/data/gui/preferences_window.ui:1603 #, fuzzy msgid "Status _iconset:" msgstr "_Arlunioù-stad dre-ziouer:" #: gajim/data/gui/preferences_window.ui:1614 #, fuzzy msgid "Use _transports icons" msgstr "Implij arlunioù an _dorioù" #: gajim/data/gui/preferences_window.ui:1618 #, fuzzy msgid "" "If checked, Gajim will use protocol-specific status icons. (e.g. A contact " "from ICQ will have the equivalent ICQ icon for status online, away, busy, " "etc...)" msgstr "" "Si cette case est cochée, Gajim utilisera des icônes d'état spécifiques aux " "protocoles. (Par ex. un contact MSN aura les icônes de MSN pour les états " "disponible, absent, occupé, etc)" #: gajim/data/gui/preferences_window.ui:1660 msgid "Configure color and font of the interface" msgstr "" #: gajim/data/gui/preferences_window.ui:1682 #, fuzzy msgid "Themes" msgstr "Perzhioù" #: gajim/data/gui/preferences_window.ui:1712 #, fuzzy msgid "Contact's nickname:" msgstr "Anv an darempred" #: gajim/data/gui/preferences_window.ui:1726 #, fuzzy msgid "Contact's message:" msgstr "_Titour-stad:" #: gajim/data/gui/preferences_window.ui:1738 msgid "_Status message:" msgstr "_Titour-stad:" #: gajim/data/gui/preferences_window.ui:1752 #, fuzzy msgid "Group chat highlight:" msgstr "Message d'un Salon mis en Sur-brillance" #: gajim/data/gui/preferences_window.ui:1890 #, fuzzy msgid "Your nickname:" msgstr "_A-raok al lesanv:" #: gajim/data/gui/preferences_window.ui:1904 #, fuzzy msgid "Your message:" msgstr "Fazi en ur lenn ar restr:" #: gajim/data/gui/preferences_window.ui:1916 msgid "_URL highlight:" msgstr "" #: gajim/data/gui/preferences_window.ui:2041 msgid "_Reset to Default Colors" msgstr "_Distreiñ gant al livioù dre-ziouer" #: gajim/data/gui/preferences_window.ui:2075 #, fuzzy msgid "Chat Line Colors" msgstr "Liv-stad an ivinelloù" #: gajim/data/gui/preferences_window.ui:2095 msgid "Style" msgstr "" #: gajim/data/gui/preferences_window.ui:2128 msgid "Audio input device" msgstr "" #: gajim/data/gui/preferences_window.ui:2140 msgid "Audio output device" msgstr "" #: gajim/data/gui/preferences_window.ui:2176 #, fuzzy msgid "Audio" msgstr "Poelladoù" #: gajim/data/gui/preferences_window.ui:2206 msgid "Video input device" msgstr "" #: gajim/data/gui/preferences_window.ui:2218 msgid "Video output device" msgstr "" #: gajim/data/gui/preferences_window.ui:2230 msgid "Video framerate" msgstr "" #: gajim/data/gui/preferences_window.ui:2242 msgid "Video size" msgstr "" #: gajim/data/gui/preferences_window.ui:2252 msgid "View own video source" msgstr "" #: gajim/data/gui/preferences_window.ui:2316 #, fuzzy msgid "Video" msgstr "Furmad ul linenn" #: gajim/data/gui/preferences_window.ui:2346 #, fuzzy msgid "STUN server:" msgstr "Servijer:" #: gajim/data/gui/preferences_window.ui:2372 msgid "" "STUN server hostname. If none given, Gajim will try\n" "to discover one from server." msgstr "" #: gajim/data/gui/preferences_window.ui:2386 msgid "(example: stun.iptel.org)" msgstr "" #: gajim/data/gui/preferences_window.ui:2400 #, fuzzy msgid "Connection" msgstr "Sonioù" #: gajim/data/gui/preferences_window.ui:2485 msgid "_Mail client:" msgstr "_Meziant posteliñ:" #: gajim/data/gui/preferences_window.ui:2498 msgid "_Browser:" msgstr "_Furcher web:" #: gajim/data/gui/preferences_window.ui:2511 msgid "_File manager:" msgstr "Merour _restroù:" #. a header for custom browser/client/file manager. so translate sth like: Custom Settings #: gajim/data/gui/preferences_window.ui:2559 msgid "Custom" msgstr "Personelaet" #: gajim/data/gui/preferences_window.ui:2576 msgid "Applications" msgstr "Poelladoù" #: gajim/data/gui/preferences_window.ui:2604 msgid "_Ignore events from contacts not in the roster" msgstr "_Chom hep teurel pled eus ar c'hemennadennoù kaset gant tud dianav" #: gajim/data/gui/preferences_window.ui:2608 #, fuzzy msgid "" "If checked, Gajim will ignore incoming events from unauthorized contacts. " "Use with caution, because it blocks all messages from any contact that is " "not in the roster" msgstr "" "Cochez cette option seulement si quelqu'un n'appartenant pas à votre liste " "vous spamme/ennuie. Utilisez la avec précaution, car elle bloque tous les " "messages des contacts qui ne sont pas dans votre liste" #: gajim/data/gui/preferences_window.ui:2622 #, fuzzy msgid "Allow client / _OS information to be sent" msgstr "Aotren e vefe kaset titouroù diwar-benn an _OS" #: gajim/data/gui/preferences_window.ui:2626 #, fuzzy msgid "" "If checked, Gajim will allow others to detect the operation system you are " "using" msgstr "Si cette case est cochée, Gajim se connectera à ce salon au démarrage" #: gajim/data/gui/preferences_window.ui:2640 #, fuzzy msgid "Allow local system time information to be sent" msgstr "Aotren e vefe kaset titouroù diwar-benn an _OS" #: gajim/data/gui/preferences_window.ui:2644 #, fuzzy msgid "If checked, Gajim will allow others to detect the time on your system" msgstr "Si cette case est cochée, Gajim se connectera à ce salon au démarrage" #: gajim/data/gui/preferences_window.ui:2658 msgid "Log _encrypted chat session" msgstr "" #: gajim/data/gui/preferences_window.ui:2662 msgid "" "If checked, Gajim will keep logs for encrypted messages. Please note that " "when using End-to-End encryption the remote party has to agree on logging, " "else the messages will not be logged." msgstr "" #: gajim/data/gui/preferences_window.ui:2676 #, fuzzy msgid "Allow my _idle time to be sent" msgstr "Aotren e vefe kaset titouroù diwar-benn an _OS" #: gajim/data/gui/preferences_window.ui:2695 msgid "Global proxy:" msgstr "" #: gajim/data/gui/preferences_window.ui:2724 #, fuzzy msgid "_Manage..." msgstr "Kemmañ..." #: gajim/data/gui/preferences_window.ui:2743 #, fuzzy msgid "Privacy" msgstr "Perzhioù" #: gajim/data/gui/preferences_window.ui:2770 msgid "_Log status changes of contacts" msgstr "_Menegiñ kemmoù stad an darempredoù e-barzh an istoradur" #: gajim/data/gui/preferences_window.ui:2791 msgid "Miscellaneous" msgstr "A bep seurt" #: gajim/data/gui/preferences_window.ui:2810 msgid "_Open..." msgstr "_Digeriñ..." #: gajim/data/gui/preferences_window.ui:2826 msgid "Advanced Configuration Editor" msgstr "Aozer kefluniañ munut" #: gajim/data/gui/contact_context_menu.ui:12 msgid "Start _Chat" msgstr "Kregiñ da _flapiñ" #: gajim/data/gui/contact_context_menu.ui:20 #: gajim/data/gui/systray_context_menu.ui:36 msgid "Send Single _Message..." msgstr "Kas ur gemennadenn _simpl..." #: gajim/data/gui/contact_context_menu.ui:28 #, fuzzy msgid "Send _File..." msgstr "Kas ur _restr" #: gajim/data/gui/contact_context_menu.ui:44 #, fuzzy msgid "Invite _Contacts" msgstr "Darempredoù" #: gajim/data/gui/contact_context_menu.ui:73 #, fuzzy msgid "E_xecute Command..." msgstr "urzhiad" #: gajim/data/gui/contact_context_menu.ui:82 #, fuzzy msgid "M_anage Contact" msgstr "Darempredoù" #: gajim/data/gui/contact_context_menu.ui:92 #, fuzzy msgid "_Rename..." msgstr "_Adenvel" #: gajim/data/gui/contact_context_menu.ui:99 #, fuzzy msgid "Edit _Groups..." msgstr "Kemmañ ar _strolladoù" #: gajim/data/gui/contact_context_menu.ui:106 #, fuzzy msgid "Assign Open_PGP Key..." msgstr "Assigner une clé OpenPGP" #: gajim/data/gui/contact_context_menu.ui:115 #, fuzzy msgid "Add Special _Notification..." msgstr "Ouzhpennañ ur gelaouenn _ispisial" #: gajim/data/gui/contact_context_menu.ui:129 msgid "_Subscription" msgstr "_Koumanant" #: gajim/data/gui/contact_context_menu.ui:138 #, fuzzy msgid "_Allow contact to see my status" msgstr "He/E aotren da welet ma stad" #: gajim/data/gui/contact_context_menu.ui:146 #, fuzzy msgid "A_sk to see contact status" msgstr "Goulenn evit gwelet e/he stad" #: gajim/data/gui/contact_context_menu.ui:154 #, fuzzy msgid "_Forbid contact to see my status" msgstr "Difenn dezhañ/dezhi gwelet ma stad" #: gajim/data/gui/contact_context_menu.ui:182 #, fuzzy msgid "_Unignore" msgstr "_Kenderc'hel" #: gajim/data/gui/contact_context_menu.ui:190 msgid "_Ignore" msgstr "" #: gajim/data/gui/contact_context_menu.ui:197 #: gajim/data/gui/chat_context_menu.ui:66 #, fuzzy msgid "_Add to Roster..." msgstr "_Ouzhpennañ er roll" #: gajim/data/gui/account_creation_wizard_window.ui:43 msgid "Gajim: Account Creation Wizard" msgstr "Gajim : Assistant de création de compte" #: gajim/data/gui/account_creation_wizard_window.ui:70 msgid "" "You need to have an account in order to connect\n" "to the Jabber network." msgstr "" "Rankout a rit kaout ur gont evit en em lugañ\n" "d'ar rouedad Jabber." #: gajim/data/gui/account_creation_wizard_window.ui:95 #, fuzzy msgid "I already have an account I want to _use" msgstr "Bez em eus ur gont a fell din implij" #: gajim/data/gui/account_creation_wizard_window.ui:112 msgid "I want to _register for a new account" msgstr "Fellout a ra din emezelañ evit krouiñ ur gont" #: gajim/data/gui/account_creation_wizard_window.ui:133 msgid "Please choose one of the options below:" msgstr "Diuzit unan eus an dibaboù dindan :" #: gajim/data/gui/account_creation_wizard_window.ui:167 #, fuzzy msgid "Please fill in the data for your existing account" msgstr "Leuniit an titouroù evit ho kont nevez" #: gajim/data/gui/account_creation_wizard_window.ui:187 msgid "_Jabber ID:" msgstr "ID _Jabber:" #: gajim/data/gui/account_creation_wizard_window.ui:239 #: gajim/data/gui/account_creation_wizard_window.ui:394 #, fuzzy msgid "Anon_ymous authentication" msgstr "Implij an diskleriañ" #: gajim/data/gui/account_creation_wizard_window.ui:259 #: gajim/data/gui/manage_bookmarks_window.ui:172 msgid "_Password:" msgstr "_Ger-kuzh:" #: gajim/data/gui/account_creation_wizard_window.ui:281 msgid "Save pass_word" msgstr "Enrollañ ar _ger-kuzh" #: gajim/data/gui/account_creation_wizard_window.ui:285 msgid "If checked, Gajim will remember the password for this account" msgstr "" "Si cette case est cochée, Gajim va retenir le mot de passe pour ce compte" #: gajim/data/gui/account_creation_wizard_window.ui:339 msgid "Please select a server" msgstr "" #: gajim/data/gui/account_creation_wizard_window.ui:358 #: gajim/data/gui/manage_bookmarks_window.ui:159 msgid "_Server:" msgstr "_Servijer:" #: gajim/data/gui/account_creation_wizard_window.ui:423 #, fuzzy msgid "Prox_y:" msgstr "Proksi:" #: gajim/data/gui/account_creation_wizard_window.ui:450 msgid "Manage..." msgstr "Kemmañ..." #: gajim/data/gui/account_creation_wizard_window.ui:465 msgid "Use custom hostname/port" msgstr "Implij un anv ostiz/porzh personelaet" #: gajim/data/gui/account_creation_wizard_window.ui:491 #, fuzzy msgid "_Hostname:" msgstr "Servijer:" #: gajim/data/gui/account_creation_wizard_window.ui:517 msgid "_Port:" msgstr "_Porzh:" #: gajim/data/gui/account_creation_wizard_window.ui:553 #: gajim/data/gui/account_creation_wizard_window.ui:884 msgid "_Advanced" msgstr "_Mont pelloc'h" #: gajim/data/gui/account_creation_wizard_window.ui:624 msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA1 fingerprint of the certificate:\n" msgstr "" #: gajim/data/gui/account_creation_wizard_window.ui:687 #, fuzzy msgid "" "Connecting to server\n" "\n" "Please wait..." msgstr "" "O krouiñ ar gont\n" "\n" "Gortozit marplij..." #: gajim/data/gui/account_creation_wizard_window.ui:772 msgid "Connect when I press Finish" msgstr "Kevreañ pa bouezan war Echuiñ" #: gajim/data/gui/account_creation_wizard_window.ui:789 msgid "Set my profile when I connect" msgstr "Aozañ ma aelad pa lugan" #: gajim/data/gui/account_creation_wizard_window.ui:901 msgid "_Finish" msgstr "_Echuiñ" #: gajim/data/gui/privacy_lists_window.ui:34 #, fuzzy msgid "Privacy Lists:" msgstr "Flapoù prevez" #: gajim/data/gui/service_discovery_window.ui:84 msgid "_Address:" msgstr "_Chomlec'h:" #: gajim/data/gui/service_discovery_window.ui:115 msgid "G_o" msgstr "_Mont" #: gajim/data/gui/synchronise_select_contacts_dialog.ui:8 msgid "Synchronise : select contacts" msgstr "" #: gajim/data/gui/synchronise_select_contacts_dialog.ui:67 #, fuzzy msgid "Select the contacts you want to synchronise" msgstr "JID an darempred ho peus c'hoant flapiñ gantañ" #: gajim/data/gui/edit_groups_dialog.ui:8 msgid "Edit Groups" msgstr "Kemmañ ar strolladoù" #: gajim/data/gui/search_window.ui:42 #, fuzzy msgid "Please wait while retrieving search form..." msgstr "Gortozit marplij e keit ma vez dilec'hiet an istoradur..." #: gajim/data/gui/search_window.ui:80 #, fuzzy msgid "_Add contact" msgstr "Ouzhpennañ un _darempred" #: gajim/data/gui/search_window.ui:116 msgid "_Search" msgstr "_Klask" #: gajim/data/gui/chat_context_menu.ui:11 msgid "_Copy Link Location" msgstr "_Kopiañ chomlec'h an ere" #: gajim/data/gui/chat_context_menu.ui:19 msgid "_Open Link in Browser" msgstr "_Digerién an ere er furcher web" #: gajim/data/gui/chat_context_menu.ui:27 msgid "_Copy JID/Email Address" msgstr "_Kopiañ ar JID/Chomlec'h postel" #: gajim/data/gui/chat_context_menu.ui:35 msgid "_Open Email Composer" msgstr "_Digeriñ ar bostelerez" #: gajim/data/gui/chat_context_menu.ui:49 #: gajim/data/gui/subscription_request_window.ui:12 msgid "_Start Chat" msgstr "_Kregiñ da flapiñ" #: gajim/data/gui/chat_context_menu.ui:57 #: gajim/data/gui/account_context_menu.ui:35 #: gajim/data/gui/systray_context_menu.ui:28 msgid "Join _Group Chat" msgstr "Ebarzhiñ ur _webgaoz" #: gajim/data/gui/change_status_message_dialog.ui:131 #, fuzzy msgid "Save as Preset..." msgstr "Enrollañ evel raklakaet..." #: gajim/data/gui/change_status_message_dialog.ui:167 msgid "Preset messages:" msgstr "Kemennadennoù raklakaet:" #: gajim/data/gui/change_status_message_dialog.ui:313 msgid "Type your new status message" msgstr "Roit un titour-stad nevez" #: gajim/data/gui/synchronise_select_account_dialog.ui:8 #, fuzzy msgid "Synchronise contacts" msgstr "Diskouez an darempredoù _ezlinenn" #: gajim/data/gui/synchronise_select_account_dialog.ui:68 msgid "Select the account with which you want to synchronise" msgstr "" #: gajim/data/gui/archiving_313_preferences_window.ui:28 #, fuzzy msgid "Roster" msgstr "Diskouez ar _roll-darempredoù" #: gajim/data/gui/archiving_313_preferences_window.ui:85 #, fuzzy msgid "Preference" msgstr "Penndibaboù" #: gajim/data/gui/archiving_313_preferences_window.ui:159 #, fuzzy msgid "Default:" msgstr "Dilemel" #: gajim/data/gui/voip_call_received_dialog.ui:15 msgid "Incoming call" msgstr "" #: gajim/data/gui/add_new_contact_window.ui:29 msgid "Add New Contact" msgstr "Ouzhpennañ un darempred nevez" #: gajim/data/gui/add_new_contact_window.ui:62 #, fuzzy msgid "A_ccount:" msgstr "Kont" #: gajim/data/gui/add_new_contact_window.ui:110 #, fuzzy msgid "_Protocol:" msgstr "Protokol:" #: gajim/data/gui/add_new_contact_window.ui:169 #, fuzzy msgid "_User ID:" msgstr "ID arveriad-ez:" #: gajim/data/gui/add_new_contact_window.ui:182 #: gajim/data/gui/manage_bookmarks_window.ui:133 #, fuzzy msgid "_Nickname:" msgstr "Lesanv:" #: gajim/data/gui/add_new_contact_window.ui:195 #, fuzzy msgid "_Group:" msgstr "Strollad:" #: gajim/data/gui/add_new_contact_window.ui:210 #, fuzzy msgid "Type User ID" msgstr "ID arveriad-ez:" #: gajim/data/gui/add_new_contact_window.ui:223 #, fuzzy msgid "Type Nickname" msgstr "Lesanv" #: gajim/data/gui/add_new_contact_window.ui:239 msgid "Choose a group of type a new group" msgstr "" #: gajim/data/gui/add_new_contact_window.ui:257 #, fuzzy msgid "A_llow this contact to view my status" msgstr "He/E aotren da welet ma stad" #: gajim/data/gui/add_new_contact_window.ui:300 #, fuzzy msgid "_Save subscription message" msgstr "_Koumanant" #: gajim/data/gui/add_new_contact_window.ui:325 msgid "" "You have to register with this transport\n" "to be able to add a contact from this\n" "protocol. Click on Register button to\n" "proceed." msgstr "" #: gajim/data/gui/add_new_contact_window.ui:340 #, fuzzy msgid "_Register" msgstr "_Emezelañ" #: gajim/data/gui/add_new_contact_window.ui:369 msgid "" "You must be connected to the transport to be able\n" "to add a contact from this protocol." msgstr "" #: gajim/data/gui/roster_window.ui:61 #, fuzzy msgid "Change Status Message…" msgstr "_Kemmañ an titour-stad" #: gajim/data/gui/change_mood_dialog.ui:73 #, fuzzy msgid "Mood:" msgstr "Sonioù" #: gajim/data/gui/change_mood_dialog.ui:85 #, fuzzy msgid "Message:" msgstr "Titouroù-stad raklakaet" #: gajim/data/gui/plugins_window.ui:25 gajim/data/gui/application_menu.ui:90 msgid "Plugins" msgstr "" #: gajim/data/gui/plugins_window.ui:78 msgid "Install from zip" msgstr "" #: gajim/data/gui/plugins_window.ui:109 msgid "<empty>" msgstr "" #: gajim/data/gui/plugins_window.ui:131 msgid "Version:" msgstr "" #: gajim/data/gui/plugins_window.ui:169 #, fuzzy msgid "Authors:" msgstr "_Aotren" #: gajim/data/gui/plugins_window.ui:210 #, fuzzy msgid "Homepage:" msgstr "Lec'hienn hiniennel:" #: gajim/data/gui/plugins_window.ui:253 #, fuzzy msgid "Description:" msgstr "Taolennadur: %s" #: gajim/data/gui/plugins_window.ui:301 msgid "Uninstall" msgstr "" #: gajim/data/gui/plugins_window.ui:316 #, fuzzy msgid "Configure" msgstr "_Kenderc'hel" #: gajim/data/gui/plugins_window.ui:348 msgid "Installed" msgstr "" #: gajim/data/gui/plugins_window.ui:399 msgid "" "Plug-in decription should be displayed here. This text will be erased during " "PluginsWindow initialization." msgstr "" #: gajim/data/gui/privacy_list_window.ui:18 #, fuzzy msgid "none" msgstr "Hini ebet" #: gajim/data/gui/privacy_list_window.ui:21 #, fuzzy msgid "both" msgstr "An daou" #: gajim/data/gui/privacy_list_window.ui:24 #, fuzzy msgid "from" msgstr "Digant" #: gajim/data/gui/privacy_list_window.ui:27 #, fuzzy msgid "to" msgstr "piv" #: gajim/data/gui/privacy_list_window.ui:66 msgid "Privacy List" msgstr "" #: gajim/data/gui/privacy_list_window.ui:77 msgid "Active for this session" msgstr "" #: gajim/data/gui/privacy_list_window.ui:94 #, fuzzy msgid "Active on each startup" msgstr "K_evreañ en ur loc'hañ Gajim" #: gajim/data/gui/privacy_list_window.ui:132 #, fuzzy msgid "List of rules" msgstr "Furmad ul linenn" #: gajim/data/gui/privacy_list_window.ui:244 msgid "Add / Edit a rule" msgstr "" #: gajim/data/gui/privacy_list_window.ui:266 msgid "Allow" msgstr "" #: gajim/data/gui/privacy_list_window.ui:282 msgid "Deny" msgstr "Nac'hañ" #: gajim/data/gui/privacy_list_window.ui:317 #, fuzzy msgid "JabberID" msgstr "ID Jabber:" #: gajim/data/gui/privacy_list_window.ui:358 #, fuzzy msgid "all in the group" msgstr "Er strollad" #: gajim/data/gui/privacy_list_window.ui:407 #, fuzzy msgid "all by subscription" msgstr "_Koumanant" #: gajim/data/gui/privacy_list_window.ui:456 msgid "All" msgstr "" #: gajim/data/gui/privacy_list_window.ui:493 #, fuzzy msgid "to send me messages" msgstr "Kas ur gemennadenn" #: gajim/data/gui/privacy_list_window.ui:509 msgid "to send me queries" msgstr "" #: gajim/data/gui/privacy_list_window.ui:525 #, fuzzy msgid "to view my status" msgstr "He/E aotren da welet ma stad" #: gajim/data/gui/privacy_list_window.ui:541 #, fuzzy msgid "to send me status" msgstr "Goulenn evit gwelet e/he stad" #: gajim/data/gui/privacy_list_window.ui:557 #, fuzzy msgid "All (including subscription)" msgstr "_Koumanant" #: gajim/data/gui/privacy_list_window.ui:598 #, fuzzy msgid "Order:" msgstr "Servijer:" #: gajim/data/gui/manage_sounds_window.ui:10 #, fuzzy msgid "Manage sounds" msgstr "Merañ ar c'hontoù" #: gajim/data/gui/remove_account_window.ui:56 msgid "Remove account _only from Gajim" msgstr "Dilemel ar gont diwar Gajim _hepken" #: gajim/data/gui/remove_account_window.ui:73 msgid "Remove account from Gajim and from _server" msgstr "Dilemel ar gont diwar Gajim ha diwar ar _servijer" #: gajim/data/gui/remove_account_window.ui:94 msgid "What do you want to do?" msgstr "Petra 'fell deoc'h ober ?" #: gajim/data/gui/adhoc_commands_window.ui:35 #, fuzzy msgid "Please wait while retrieving command list..." msgstr "Gortozit marplij e keit ma vez dilec'hiet an istoradur..." #: gajim/data/gui/adhoc_commands_window.ui:93 msgid "Choose command to execute:" msgstr "" #: gajim/data/gui/adhoc_commands_window.ui:136 #: gajim/data/gui/adhoc_commands_window.ui:277 msgid "Check once more" msgstr "" #: gajim/data/gui/adhoc_commands_window.ui:194 #, fuzzy msgid "Please wait while the command is being sent..." msgstr "Gortozit marplij e keit ma vez dilec'hiet an istoradur..." #: gajim/data/gui/adhoc_commands_window.ui:211 msgid "Please wait..." msgstr "" #: gajim/data/gui/adhoc_commands_window.ui:257 msgid "This jabber entity does not expose any commands." msgstr "" #: gajim/data/gui/adhoc_commands_window.ui:336 #, fuzzy msgid "An error has occurred:" msgstr "Une erreur de protocole s'est produite :" #: gajim/data/gui/adhoc_commands_window.ui:465 #, fuzzy msgid "F_inish" msgstr "_Echuiñ" #: gajim/data/gui/account_context_menu.ui:20 #, fuzzy msgid "_Personal Events" msgstr "Titouroù hiniennel" #: gajim/data/gui/account_context_menu.ui:49 msgid "_Add Contact..." msgstr "_Ouzhpennañ un darempred..." #: gajim/data/gui/account_context_menu.ui:57 msgid "_Discover Services" msgstr "_Dizoleiñ ar servijoù" #: gajim/data/gui/account_context_menu.ui:65 #, fuzzy msgid "_Execute Command..." msgstr "urzhiad" #: gajim/data/gui/esession_info_window.ui:50 msgid "_Verify" msgstr "" #: gajim/data/gui/esession_info_window.ui:137 #, fuzzy msgid "(ESession info)" msgstr "Taolennadur" #: gajim/data/gui/application_menu.ui:8 msgid "View" msgstr "" #: gajim/data/gui/application_menu.ui:11 #, fuzzy msgid "Show Roster" msgstr "Diskouez ar _roll-darempredoù" #: gajim/data/gui/application_menu.ui:16 #, fuzzy msgid "Show Offline Contacts" msgstr "Diskouez an darempredoù _ezlinenn" #: gajim/data/gui/application_menu.ui:21 #, fuzzy msgid "Show Active Contacts" msgstr "Diskouez an darempredoù _ezlinenn" #: gajim/data/gui/application_menu.ui:26 #, fuzzy msgid "Show Transports" msgstr "Dorioù" #: gajim/data/gui/application_menu.ui:43 #, fuzzy msgid "Help" msgstr "_Skoazell" #: gajim/data/gui/application_menu.ui:46 #, fuzzy msgid "Contents" msgstr "_Endalc'hadoù" #: gajim/data/gui/application_menu.ui:50 #, fuzzy msgid "FAQ" msgstr "_FAQ" #: gajim/data/gui/application_menu.ui:54 msgid "Keyboard Shortcuts" msgstr "" #: gajim/data/gui/application_menu.ui:58 gajim/data/gui/features_window.ui:9 #, fuzzy msgid "Features" msgstr "Perzhioù ar servijerien" #: gajim/data/gui/application_menu.ui:76 msgid "Start Chat" msgstr "Kregiñ da flapiñ" #: gajim/data/gui/application_menu.ui:81 #, fuzzy msgid "Bookmarks" msgstr "_Ouzhpennañ ar webgaoz d'ar sinedoù" #: gajim/data/gui/application_menu.ui:99 #, fuzzy msgid "Quit" msgstr "_Kuitaat" #: gajim/data/gui/features_window.ui:26 msgid "List of possible features in Gajim:" msgstr "" #: gajim/data/gui/manage_bookmarks_window.ui:14 msgid "Manage Bookmarks" msgstr "Merañ ar sinedoù" #: gajim/data/gui/manage_bookmarks_window.ui:120 #, fuzzy msgid "_Title:" msgstr "Titl:" #: gajim/data/gui/manage_bookmarks_window.ui:146 msgid "Roo_m:" msgstr "" #: gajim/data/gui/manage_bookmarks_window.ui:188 msgid "A_uto join" msgstr "" #: gajim/data/gui/manage_bookmarks_window.ui:193 msgid "If checked, Gajim will join this group chat on startup" msgstr "Si cette case est cochée, Gajim se connectera à ce salon au démarrage" #: gajim/data/gui/manage_bookmarks_window.ui:207 msgid "Minimi_ze on Auto Join" msgstr "" #: gajim/data/gui/manage_bookmarks_window.ui:235 #, fuzzy msgid "Pr_int status:" msgstr "Diskouez an eur:" #: gajim/data/gui/exception_dialog.ui:45 msgid "" "A programming error has been detected. It probably is not fatal, but should " "be reported to the developers nonetheless." msgstr "" #: gajim/data/gui/exception_dialog.ui:115 #, fuzzy msgid "Report Bug" msgstr "_Diskleriañ ar Bug" #: gajim/data/gui/subscription_request_window.ui:95 msgid "_Deny" msgstr "_Nac'hañ" #: gajim/data/gui/subscription_request_window.ui:100 #, fuzzy msgid "" "Deny authorization from contact so he or she cannot know when you're " "connected" msgstr "" "Nac'hañ aotre an darempred evit ma ne welo ket hag eñ oc'h kevreet pe get" #: gajim/data/gui/subscription_request_window.ui:133 #, fuzzy msgid "Au_thorize" msgstr "_Aotren" #: gajim/data/gui/subscription_request_window.ui:138 #, fuzzy msgid "Authorize contact so he or she can know when you're connected" msgstr "Aotren an darempred da welet hag emaon kevreet pe get" #: gajim/data/gui/xml_console_window.ui:121 #, fuzzy msgid "Presence" msgstr "_Bezañs" #: gajim/data/gui/xml_console_window.ui:134 msgid "Iq" msgstr "" #: gajim/data/gui/xml_console_window.ui:149 #, fuzzy msgid "Presets" msgstr "_Bezañs" #: gajim/data/gui/chat_to_muc_window.ui:24 msgid "Invite Friends!" msgstr "" #: gajim/data/gui/chat_to_muc_window.ui:39 #, fuzzy msgid "" "You are now entering a groupchat.\n" "Select the contacts you want to invite" msgstr "JID an darempred ho peus c'hoant flapiñ gantañ" #: gajim/data/gui/chat_to_muc_window.ui:67 #: gajim/data/gui/chat_to_muc_window.ui:78 msgid "column" msgstr "" #: gajim/data/gui/chat_to_muc_window.ui:112 msgid "Please select a MUC server." msgstr "" #: gajim/data/gui/chat_to_muc_window.ui:141 #, fuzzy msgid "MUC server" msgstr "Sellerien" #: gajim/data/gui/chat_to_muc_window.ui:176 #, fuzzy msgid "In_vite" msgstr "Diwelus" #: gajim/data/gui/history_manager.ui:11 #, fuzzy msgid "_Export" msgstr "Ezporzhiañ" #: gajim/data/gui/history_manager.ui:97 msgid "Gajim History Logs Manager" msgstr "Merour istoradur Gajim" #: gajim/data/gui/history_manager.ui:154 #, fuzzy msgid "Welcome to Gajim History Logs Manager" msgstr "Merour istoradur Gajim" #: gajim/data/gui/history_manager.ui:168 msgid "" "This log manager is not intended for log viewing. If you are looking for " "such functionality, use the history window instead.\n" "\n" "Use this program to delete or export logs. You can select logs from the left " "and/or search database from below." msgstr "" #: gajim/data/gui/history_manager.ui:184 msgid "" "WARNING:\n" "If you plan to do massive deletions, please make sure Gajim is not running. " "Generally avoid deletions with contacts you currently chat with." msgstr "" #: gajim/data/gui/history_manager.ui:283 msgid "_Search Database" msgstr "_Klask en titourva" #: gajim/data/gui/shortcuts_window.ui:8 msgid "Chat Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:12 #, fuzzy msgid "Message composition" msgstr "korf ar gemennadenn" #: gajim/data/gui/shortcuts_window.ui:17 #, fuzzy msgid "Send the message" msgstr "Kas ur gemennadenn" #: gajim/data/gui/shortcuts_window.ui:24 msgid "Create a new line" msgstr "" #: gajim/data/gui/shortcuts_window.ui:31 #, fuzzy msgid "Select an emoticon" msgstr "Utiliser les _frimousses" #: gajim/data/gui/shortcuts_window.ui:38 msgid "Complete a command or a nick" msgstr "" #: gajim/data/gui/shortcuts_window.ui:45 #, fuzzy msgid "Previous sent message" msgstr "Kemennadennoù raklakaet:" #: gajim/data/gui/shortcuts_window.ui:52 #, fuzzy msgid "Next sent messages" msgstr "Kemennadennoù raklakaet:" #: gajim/data/gui/shortcuts_window.ui:59 #, fuzzy msgid "Quote previous message" msgstr "Ou choisissez votre message :" #: gajim/data/gui/shortcuts_window.ui:66 #, fuzzy msgid "Quote next message" msgstr "Kas ur gemennadenn" #: gajim/data/gui/shortcuts_window.ui:73 #, fuzzy msgid "Clear message entry" msgstr "Kemennadenn gaset" #: gajim/data/gui/shortcuts_window.ui:81 gajim/data/gui/shortcuts_window.ui:231 #, fuzzy msgid "Appearance" msgstr "Furmad ul linenn" #: gajim/data/gui/shortcuts_window.ui:86 msgid "Toggle full / compact view" msgstr "" #: gajim/data/gui/shortcuts_window.ui:94 #, fuzzy msgid "Recent history" msgstr "Nevez 'zo:" #: gajim/data/gui/shortcuts_window.ui:99 msgid "Scroll up" msgstr "" #: gajim/data/gui/shortcuts_window.ui:106 msgid "Scroll down" msgstr "" #: gajim/data/gui/shortcuts_window.ui:121 msgid "Tabs" msgstr "" #: gajim/data/gui/shortcuts_window.ui:126 msgid "Switch to the previous tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:133 msgid "Switch to the next tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:140 msgid "Switch to the first - ninth tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:147 msgid "Switch to the previous unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:154 msgid "Switch to the next unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:161 msgid "Close chat" msgstr "" #: gajim/data/gui/shortcuts_window.ui:172 msgid "Roster Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:195 #, fuzzy msgid "File transfers" msgstr "Treuzkasoù" #: gajim/data/gui/shortcuts_window.ui:209 #, fuzzy msgid "Join a group chat" msgstr "Ebarzhiñ ur _webgaoz" #: gajim/data/gui/shortcuts_window.ui:216 #, fuzzy msgid "Set the status message" msgstr "titour stad" #: gajim/data/gui/shortcuts_window.ui:223 #, fuzzy msgid "Quit Gajim" msgstr "Gajim" #: gajim/data/gui/shortcuts_window.ui:236 #, fuzzy msgid "Show offline contacts" msgstr "Diskouez an darempredoù _ezlinenn" #: gajim/data/gui/shortcuts_window.ui:243 #, fuzzy msgid "Show only active contacts" msgstr "Diskouez an darempredoù _ezlinenn" #: gajim/data/gui/shortcuts_window.ui:250 msgid "Enable roster filtering" msgstr "" #: gajim/data/gui/shortcuts_window.ui:258 msgid "Contacts" msgstr "Darempredoù" #: gajim/data/gui/shortcuts_window.ui:263 #, fuzzy msgid "Contact information" msgstr "Titouroù" #: gajim/data/gui/shortcuts_window.ui:270 #, fuzzy msgid "Rename contact" msgstr "Darempredoù" #: gajim/data/gui/shortcuts_window.ui:277 #, fuzzy msgid "Delete contact" msgstr "Darempredoù" #: gajim/data/gui/passphrase_dialog.ui:8 msgid "Passphrase" msgstr "Ger-kuzh" #: gajim/data/gui/history_window.ui:38 #, fuzzy msgid "Enter name / JID of contact or groupchat" msgstr "Anv an darempred" #: gajim/data/gui/history_window.ui:51 #, fuzzy msgid "Search:" msgstr "Klask" #: gajim/data/gui/history_window.ui:75 msgid "_In date search" msgstr "" #: gajim/data/gui/history_window.ui:79 msgid "Only searching within selected day" msgstr "" #: gajim/data/gui/history_window.ui:306 #, fuzzy msgid "_Show status changes" msgstr "_Menegiñ kemmoù stad an darempredoù e-barzh an istoradur" #: gajim/data/gui/manage_pep_services_window.ui:13 #, fuzzy msgid "PEP Service Configuration" msgstr "Kefluniañ ar webgaoz" #: gajim/data/gui/manage_pep_services_window.ui:69 #, fuzzy msgid "_Configure" msgstr "_Kenderc'hel" #: gajim/data/gui/groups_post_window.ui:9 msgid "Create new post" msgstr "" #: gajim/data/gui/groups_post_window.ui:29 #: gajim/data/gui/single_message_window.ui:46 msgid "From:" msgstr "Digant:" #: gajim/data/gui/groups_post_window.ui:41 #: gajim/data/gui/single_message_window.ui:70 msgid "Subject:" msgstr "Titl:" #: gajim/data/gui/data_form_window.ui:19 #, fuzzy msgid "Fill in the form." msgstr "Er strollad" #: gajim/data/gui/data_form_window.ui:274 msgid "Room Configuration" msgstr "Kefluniañ ar webgaoz" #: gajim/data/gui/roster_item_exchange_window.ui:8 msgid "Roster Item Exchange" msgstr "" #: gajim/data/gui/systray_context_menu.ui:12 msgid "Sta_tus" msgstr "S_tad" #: gajim/data/gui/systray_context_menu.ui:20 #, fuzzy msgid "_Start Chat..." msgstr "_Kregiñ da flapiñ" #: gajim/data/gui/systray_context_menu.ui:50 msgid "Show All Pending _Events" msgstr "Diskouez an holl _zarvoudoù o c'hortoz" #: gajim/data/gui/systray_context_menu.ui:59 #, fuzzy msgid "Mute Sounds" msgstr "Sonioù wav" #: gajim/data/gui/systray_context_menu.ui:75 #, fuzzy msgid "_Preferences" msgstr "Penndibaboù" #: gajim/data/gui/systray_context_menu.ui:90 #, fuzzy msgid "_Quit" msgstr "_Kuitaat" #: gajim/data/gui/single_message_window.ui:59 msgid "To:" msgstr "Da:" #: gajim/data/gui/single_message_window.ui:118 msgid "0" msgstr "0" #: gajim/data/gui/single_message_window.ui:210 msgid "Sen_d" msgstr "_Kas" #: gajim/data/gui/single_message_window.ui:216 msgid "Send message" msgstr "Kas ur gemennadenn" #: gajim/data/gui/single_message_window.ui:229 msgid "_Reply" msgstr "_Respont" #: gajim/data/gui/single_message_window.ui:235 msgid "Reply to this message" msgstr "Respont d'ar gemennadenn-mañ" #: gajim/data/gui/single_message_window.ui:248 msgid "_Send & Close" msgstr "_Kas & Serriñ" #: gajim/data/gui/single_message_window.ui:254 msgid "Send message and close window" msgstr "Kas ar gemennadenn ha serriñ ar prenestr" #: gajim/data/gui/change_activity_dialog.ui:8 msgid "Set Activity" msgstr "" #: gajim/data/gui/change_activity_dialog.ui:65 msgid "Set an activity" msgstr "" #: gajim/data/gui/change_activity_dialog.ui:337 #, fuzzy msgid "Message: " msgstr "Titouroù-stad raklakaet" #: gajim/command_system/mapping.py:164 gajim/command_system/mapping.py:174 #: gajim/command_system/mapping.py:194 #, fuzzy msgid "Missing arguments" msgstr "Kemennadenn gaset" #: gajim/command_system/mapping.py:261 #, fuzzy msgid "Too many arguments" msgstr "Kemennadenn gaset" #: gajim/command_system/implementation/execute.py:53 msgid "Execute expression inside a shell, show output" msgstr "" #: gajim/command_system/implementation/execute.py:109 msgid "Execute expression inside a shell, send output" msgstr "" #: gajim/command_system/implementation/standard.py:45 msgid "" "Show help on a given command or a list of available commands if -a is given" msgstr "" #: gajim/command_system/implementation/standard.py:72 #, fuzzy msgid "Send a message to the contact" msgstr "Usage: /%s, cache les boutons de discussion." #: gajim/command_system/implementation/standard.py:77 msgid "Send action (in the third person) to the current chat" msgstr "" #: gajim/command_system/implementation/standard.py:82 msgid "Show logged messages which mention given text" msgstr "" #: gajim/command_system/implementation/standard.py:87 #, fuzzy, python-format msgid "%s: Nothing found" msgstr "N'eo ket bet kavet %s" #: gajim/command_system/implementation/standard.py:93 msgid "Limit must be an integer" msgstr "" #: gajim/command_system/implementation/standard.py:117 msgid "" "\n" " Set the current status\n" "\n" " Status can be given as one of the following values:\n" " online, away, chat, xa, dnd.\n" " " msgstr "" #: gajim/command_system/implementation/standard.py:135 msgid "Set the current status to away" msgstr "" #: gajim/command_system/implementation/standard.py:149 msgid "Set the current status to online" msgstr "" #: gajim/command_system/implementation/standard.py:152 #, fuzzy msgid "Available" msgstr "Dihegerz" #: gajim/command_system/implementation/standard.py:172 #: gajim/command_system/implementation/standard.py:249 #, fuzzy msgid "Clear the text window" msgstr "Usage : /%s, nettoie la fenêtre." #: gajim/command_system/implementation/standard.py:177 #: gajim/command_system/implementation/standard.py:389 #, fuzzy msgid "Send a ping to the contact" msgstr "Usage : /%s, passe la fenêtre de salon de discussion en vue compacte." #: gajim/command_system/implementation/standard.py:180 #: gajim/command_system/implementation/standard.py:392 msgid "Command is not supported for zeroconf accounts" msgstr "" #: gajim/command_system/implementation/standard.py:184 msgid "Send DTMF sequence through an open audio session" msgstr "" #: gajim/command_system/implementation/standard.py:187 #, fuzzy msgid "No open audio sessions with the contact" msgstr "Klikit amañ evit gwelout kaozioù kent gant an darempred-mañ" #: gajim/command_system/implementation/standard.py:190 #, python-format msgid "%s is not a valid tone" msgstr "" #: gajim/command_system/implementation/standard.py:197 msgid "Toggle audio session" msgstr "" #: gajim/command_system/implementation/standard.py:200 #, fuzzy msgid "Audio sessions are not available" msgstr "N'eus ket tu da gevreañ" #: gajim/command_system/implementation/standard.py:207 msgid "Toggle video session" msgstr "" #: gajim/command_system/implementation/standard.py:210 #, fuzzy msgid "Video sessions are not available" msgstr "N'eus ket tu en em lugañ" #: gajim/command_system/implementation/standard.py:217 msgid "Send a message to the contact that will attract his (her) attention" msgstr "" #: gajim/command_system/implementation/standard.py:256 #, fuzzy msgid "Change your nickname in a group chat" msgstr "Cheñch _lesanv" #: gajim/command_system/implementation/standard.py:266 #, fuzzy msgid "Open a private chat window with a specified occupant" msgstr "" "Usage : /%s , ouvre une fenêtre de discussion privée avec l'occupant " "spécifié." #: gajim/command_system/implementation/standard.py:272 #: gajim/command_system/implementation/standard.py:281 #: gajim/command_system/implementation/standard.py:327 #: gajim/command_system/implementation/standard.py:339 #: gajim/command_system/implementation/standard.py:351 #, fuzzy msgid "Nickname not found" msgstr "N'eus ket bet kavet al lesanv : %s" #: gajim/command_system/implementation/standard.py:275 #, fuzzy msgid "" "Open a private chat window with a specified occupant and send him a message" msgstr "" "Usage : /%s , ouvre une fenêtre de discussion privée avec l'occupant " "spécifié." #: gajim/command_system/implementation/standard.py:284 #, fuzzy msgid "Display or change a group chat topic" msgstr "Goulenn a-raok serriñ un ivinell pe ur prenestr." #: gajim/command_system/implementation/standard.py:292 msgid "Invite a user to a room for a reason" msgstr "" #: gajim/command_system/implementation/standard.py:295 #, fuzzy, python-format msgid "Invited %(jid)s to %(room_jid)s" msgstr "Darempred %(contact_jid)s bet pedet e-barzh %(room_jid)s." #: gajim/command_system/implementation/standard.py:299 #, fuzzy msgid "Join a group chat given by a jid" msgstr "Ebarzhiñ ur _webgaoz" #: gajim/command_system/implementation/standard.py:307 msgid "" "Leave the groupchat, optionally giving a reason, and close tab or window" msgstr "" #: gajim/command_system/implementation/standard.py:312 msgid "" "\n" " Ban user by a nick or a jid from a groupchat\n" "\n" " If given nickname is not found it will be treated as a jid.\n" " " msgstr "" #: gajim/command_system/implementation/standard.py:324 #, fuzzy msgid "Kick user by a nick from a groupchat" msgstr "Vous êtes banni de ce salon." #: gajim/command_system/implementation/standard.py:332 msgid "" "Set occupant role in group chat.\n" " Role can be given as one of the following values:\n" " moderator, participant, visitor, none" msgstr "" #: gajim/command_system/implementation/standard.py:337 #, fuzzy msgid "Invalid role given" msgstr "Anv-arveriad-ez direizh" #: gajim/command_system/implementation/standard.py:344 msgid "" "Set occupant affiliation in group chat.\n" " Affiliation can be given as one of the following values:\n" " owner, admin, member, outcast, none" msgstr "" #: gajim/command_system/implementation/standard.py:349 msgid "Invalid affiliation given" msgstr "" #: gajim/command_system/implementation/standard.py:357 #, fuzzy msgid "Display names of all group chat occupants" msgstr "Usage : /%s [sujet], affiche ou met à jour le sujet actuel du salon." #: gajim/command_system/implementation/standard.py:379 msgid "Forbid an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/standard.py:384 msgid "Allow an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/middleware.py:72 msgid "Error during command execution!" msgstr "" #: gajim/command_system/implementation/custom.py:106 msgid "The same as using a doc-string, except it supports translation" msgstr "" #: gajim/plugins/pluginmanager.py:611 gajim/plugins/pluginmanager.py:617 msgid "Archive corrupted" msgstr "" #: gajim/plugins/pluginmanager.py:613 #, fuzzy msgid "Archive empty" msgstr "Treug ar restr" #: gajim/plugins/pluginmanager.py:625 gajim/plugins/pluginmanager.py:633 #: gajim/plugins/gui.py:264 msgid "Archive is malformed" msgstr "" #: gajim/plugins/pluginmanager.py:641 gajim/plugins/gui.py:288 #: gajim/plugins/gui.py:296 #, fuzzy msgid "Plugin already exists" msgstr "Bez ez eus eus ar restr-mañ dija" #: gajim/plugins/gui.py:84 msgid "Plugin" msgstr "" #: gajim/plugins/gui.py:156 #, fuzzy, python-format msgid "Warning: %s" msgstr "Argas %s" #: gajim/plugins/gui.py:213 #, fuzzy msgid "Plugin failed" msgstr "échec lors de la publication de votre vCard" #: gajim/plugins/gui.py:256 msgid "Unable to properly remove the plugin" msgstr "" #: gajim/plugins/gui.py:288 msgid "Overwrite?" msgstr "" #: gajim/plugins/gui.py:320 #, fuzzy msgid "Configuration" msgstr "Kefluniañ ar webgaoz" #: data/org.gajim.Gajim.desktop.in:5 msgid "Jabber IM Client" msgstr "Flaperez Jabber" #: data/org.gajim.Gajim.desktop.in:6 data/org.gajim.Gajim.appdata.xml.in:10 msgid "A GTK+ Jabber client" msgstr "Ur flaperez Jabber e GTK+" #: data/org.gajim.Gajim.desktop.in:8 msgid "chat;messaging;im;xmpp;bonjour;voip;" msgstr "" #: data/org.gajim.Gajim.desktop.in:12 msgid "org.gajim.Gajim" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:12 msgid "" "Gajim is a chat client to be used with Jabber.org, Live Journal Talk, " "Nimbuzz, Ovi, Talkonaut, and thousands of other services run by companies " "and ISPs, and volunteers around the world." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:16 msgid "" "If you have a few accounts on different servers, if you want to be in " "contact with your friends and family all the time, then Gajim is for you." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:19 #, fuzzy msgid "Features:" msgstr "Perzhioù ar servijerien" #: data/org.gajim.Gajim.appdata.xml.in:21 msgid "Tabbed chat window and single window modes" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:22 msgid "" "Group chat support (with Multi-User Chat protocol), invitation, chat to " "group chat transformation" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:23 msgid "Emoticons, avatars, PEP (user activity, mood and tune)" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:24 msgid "Audio / video conferences" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:25 #, fuzzy msgid "File transfer, room bookmarks" msgstr "Fazi treuzkas" #: data/org.gajim.Gajim.appdata.xml.in:26 msgid "Metacontacts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:27 msgid "Trayicon, speller, extended chat history functionalities" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:28 msgid "TLS, GPG and End-To-End encryption support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:29 msgid "Transport registration support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:30 #, fuzzy msgid "Service discovery including nodes, user search" msgstr "Merañ servijoù ar gont %s" #: data/org.gajim.Gajim.appdata.xml.in:31 msgid "Wikipedia, dictionary and search engine lookup" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:32 msgid "Multiple accounts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:33 #, fuzzy msgid "XML console interface" msgstr "Console _XML..." #: data/org.gajim.Gajim.appdata.xml.in:34 msgid "Link local (bonjour / zeroconf), BOSH" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:35 msgid "Other features via plugins" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:47 #, fuzzy msgid "Roster, list of contacts" msgstr "_Menegiñ kemmoù stad an darempredoù e-barzh an istoradur" #: data/org.gajim.Gajim.appdata.xml.in:51 msgid "Tabbed chat window" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:55 #, fuzzy msgid "Group chat support" msgstr "Flapoù a-stroll" #: data/org.gajim.Gajim.appdata.xml.in:59 #, fuzzy msgid "Chat history" msgstr "Nevez 'zo:" #: data/org.gajim.Gajim.appdata.xml.in:63 #, fuzzy msgid "Plugin manager" msgstr "échec lors de la publication de votre vCard" #, fuzzy #~ msgid "Plugins updates" #~ msgstr "échec lors de la publication de votre vCard" #~ msgid "Shows or hides the roster window" #~ msgstr "Diskouez pe kuzhat ar prenestr pennañ" #, fuzzy #~ msgid "Shows or hides the ipython window" #~ msgstr "Diskouez pe kuzhat ar prenestr pennañ" #, fuzzy #~ msgid "XMPP account %s" #~ msgstr "eus ar gont %s" #, fuzzy #~ msgid "Exception" #~ msgstr "Taolennadur" #, fuzzy #~ msgid "" #~ "someone@somewhere.com would like you to add some contacts " #~ "in your roster." #~ msgstr "Me blijfe din ouzhpennañ ac'hanoc'h em roll-darempredoù." #~ msgid "_Actions" #~ msgstr "_Oberoù" #, fuzzy #~ msgid "Start Chat..." #~ msgstr "_Kregiñ da flapiñ" #, fuzzy #~ msgid "You are already in group chat %s" #~ msgstr "Emaoc'h er webgaoz %s dija" #~ msgid "Join Group Chat with account %s" #~ msgstr "Ebarzhiñ ur sal-flapiñ gant ar gont %s" #, fuzzy #~ msgid "Invalid Account" #~ msgstr "Anv-kont direizh" #, fuzzy #~ msgid "" #~ "You have to choose an account from which you want to join the groupchat." #~ msgstr "Rankout a rit krouiñ ur gont a-raok gellout flapiñ gant tud all." #, fuzzy #~ msgid "Please enter the group chat JID as room@server." #~ msgstr "Bez ez eus arouezioù difennet en anv ar sal pe hini ar servijer." #, fuzzy #~ msgid "The group chat JID contains invalid characters." #~ msgstr "Bez ez eus arouezioù difennet en anv ar sal pe hini ar servijer." #~ msgid "Start Chat with account %s" #~ msgstr "Kregiñ da flapiñ gant ar gont %s" #, fuzzy #~ msgid "" #~ "Fill in the nickname or the JID of the contact you would like\n" #~ "to send a chat message to:" #~ msgstr "" #~ "Roit ID an darempred a fell deoc'h kas ur gemennadenn\n" #~ "dezhañ:" #, fuzzy #~ msgid "Nickname / JID" #~ msgstr "Eilañ an ID Jabber" #~ msgid "Shows the chat dialog so that you can send messages to a contact" #~ msgstr "" #~ "A ziskouez ar prenestr flapiñ evit ma c'hellfec'h kas ur gemennadenn d'un " #~ "darempred" #~ msgid "JID of the contact that you want to chat with" #~ msgstr "JID an darempred ho peus c'hoant flapiñ gantañ" #~ msgid "Adds contact to roster" #~ msgstr "Ouzhennañ an darempred d'ar roll" #, fuzzy #~ msgid "Adds new contact to this account" #~ msgstr "Ouzhpennañ un darempred nevez d'ar gont-mañ." #, fuzzy #~ msgid "Starts chat, using this account" #~ msgstr "Kregiñ da flapiñ gant ar gont %s" #, fuzzy #~ msgid "Message content" #~ msgstr "korf ar gemennadenn" #, fuzzy #~ msgid "Join a MUC room" #~ msgstr "_Ebarzhiñ ur webgaoz nevez" #, fuzzy #~ msgid "Room JID" #~ msgstr "Webgaoz:" #, fuzzy #~ msgid "Nickname to use" #~ msgstr "N'eus ket bet kavet al lesanv : %s" #, fuzzy #~ msgid "Password to enter the room" #~ msgstr "Ne glot ket ar gerioù-kuzh" #, fuzzy #~ msgid "Wrong URI" #~ msgstr "Ger-kuzh faos" #~ msgid "Nickname:" #~ msgstr "Lesanv:" #~ msgid "Server:" #~ msgstr "Servijer:" #~ msgid "Password:" #~ msgstr "Ger-kuzh:" #, fuzzy #~ msgid "Join this room _automatically when I connect" #~ msgstr "Aozañ ma aelad pa lugan" #, fuzzy #~ msgid "Bro_wse Rooms" #~ msgstr "_Furchal" #, fuzzy #~ msgid "Network-Watcher" #~ msgstr "Merour an istoradur" #, fuzzy #~ msgid "Requires gnome-network-manager" #~ msgstr "Merour an istoradur" #, fuzzy #~ msgid "Feature not available, see Help->Features" #~ msgstr "An emc'hemennadenn evit ar stad \"Dihegerz\"" #, fuzzy #~ msgid "Send files" #~ msgstr "Kas ur restr" #, fuzzy #~ msgid "This contact does not support file transfer." #~ msgstr "Ur roll eus an treuzkasoù oberiant, echu pe arsavet" #, fuzzy #~ msgid "Hides the buttons in chat windows." #~ msgstr "A guzha an nozelennoù er prenestroù webgaoz" #, fuzzy #~ msgid "Change your nickname (Ctrl+N)" #~ msgstr "Cheñch _lesanv" #, fuzzy #~ msgid "Bookmark this room (Ctrl+B)" #~ msgstr "_Ouzhpennañ ar webgaoz d'ar sinedoù" #, fuzzy #~ msgid "Show advanced functions (Alt+D)" #~ msgstr "Klikit evit enlakaat ur boulomell (Alt+M)" #, fuzzy #~ msgid "Add this contact to roster (Ctrl+D)" #~ msgstr "Ouzhennañ an darempred d'ar roll" #, fuzzy #~ msgid "Invite contacts to the conversation (Ctrl+G)" #~ msgstr "a zo aketus d'ar gaozeadenn" #, fuzzy #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Ouzhennañ an darempred d'ar roll" #, fuzzy #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Ouzhennañ an darempred d'ar roll" #, fuzzy #~ msgid "Ma_ke message windows compact" #~ msgstr "Ur prenestr-flapiñ:" #, fuzzy #~ msgid "Hide all buttons in chat windows" #~ msgstr "A guzha an nozelennoù er prenestroù webgaoz" #, fuzzy #~ msgid "Hide the chat buttons" #~ msgstr "Usage: /%s, cache les boutons de discussion." #, fuzzy #~ msgid "?CLI:nick" #~ msgstr "Lesanv" #, fuzzy #~ msgid "?CLI:password" #~ msgstr "Ger-kuzh:" #, fuzzy #~ msgid "Use D-Bus and Notification-Daemon to show notifications" #~ msgstr "" #~ "Implij DBus ha Notification-Daemon evit diskouez ar c'hemennadennoù-" #~ "kelaouiñ" #, fuzzy #~ msgid "Notification" #~ msgstr "Kemmañ ar gont" #, fuzzy #~ msgid "Ignore" #~ msgstr "_Kenderc'hel" #, fuzzy #~ msgid "_Open Gmail Inbox" #~ msgstr "_Digeriñ ar bostelerez" #, fuzzy #~ msgid "Notify on new _GMail email" #~ msgstr "Ma c'helaouiñ evit ar c'hemennadennoù _Gmail nevez" #, fuzzy #~ msgid "" #~ "If checked, Gajim will also include information about the sender of new " #~ "emails" #~ msgstr "" #~ "Si cette case est cochée, Gajim affichera l'avatar de chaque contact dans " #~ "la fenêtre principale et les salons" #, fuzzy #~ msgid "GMail Options" #~ msgstr "Poelladoù" #, fuzzy #~ msgid "20" #~ msgstr "0" #, fuzzy #~ msgid "Invited %s to %s" #~ msgstr "Kas %s" #, fuzzy #~ msgid "GMail Email Received" #~ msgstr "Resevet ar bedadenn" #, fuzzy #~ msgid "New e-mail on %(gmail_mail_address)s" #~ msgstr "Postel nevez war %(gmail_mail_address)s" #, fuzzy #~ msgid "You have %d new e-mail conversation" #~ msgid_plural "You have %d new e-mail conversations" #~ msgstr[0] "Bez ho peus %d postel nevez" #~ msgstr[1] "Bez ho peus %d postel nevez" #~ msgid "Re_name" #~ msgstr "_Adenvel" #, fuzzy #~ msgid "Anonymous authentication" #~ msgstr "Implij an diskleriañ" #, fuzzy #~ msgid "Synchronize contacts" #~ msgstr "Diskouez an darempredoù _ezlinenn" #~ msgid "Chan_ge Password" #~ msgstr "C_heñch ar ger-kuzh" #~ msgid "Click to change account's password" #~ msgstr "Klikit evit cheñch ger-kuzh ar gont" #, fuzzy #~ msgid "Administration operations" #~ msgstr "Roll ar verourien" #, fuzzy #~ msgid "Browse..." #~ msgstr "_Furchal" #, fuzzy #~ msgid "Certificate is e_ncrypted" #~ msgstr "[Sifret eo ar gemennadenn-mañ]" #~ msgid "" #~ "If checked, Gajim, when launched, will automatically connect to jabber " #~ "using this account" #~ msgstr "" #~ "M'eo diuzet, ec'h emlugo Gajim da jabber en ur implij ar gont-mañ en ur " #~ "loc'hañ" #, fuzzy #~ msgid "Synchronize logs with server" #~ msgstr "Diskouez an darempredoù _ezlinenn" #~ msgid "" #~ "If checked, any change to the global status (handled by the combobox at " #~ "the bottom of the roster window) will change the status of this account " #~ "accordingly" #~ msgstr "" #~ "M'eo enaouet, kement cheñchamant graet war ar stad hollek (meret gant ar " #~ "voestig e traoñ ar roll-darempredoù) a gemmo stad ar gont-mañ ivez" #, fuzzy #~ msgid "" #~ "If checked, Gajim will also broadcast some more IPs except from just your " #~ "IP, so file transfer has higher chances of working." #~ msgstr "" #~ "Si cette case est cochée, Gajim va diffuser des adresses IP en plus de la " #~ "votre, les transferts de fichiers ont ainsi plus de chance de fonctionner." #, fuzzy #~ msgid "Proxy" #~ msgstr "Perzhioù" #, fuzzy #~ msgid "Send _keep-alive packets" #~ msgstr "Kas ar pakadoù derc'hel al lugadenn vev" #, fuzzy #~ msgid "" #~ "If checked, Gajim will send keep-alive packets to prevent connection " #~ "timeout which results in disconnection" #~ msgstr "" #~ "Si cette case est cochée, Gajim enverra des paquets de maintien de " #~ "connexion pour prévenir des temps de latence pouvant entraîner des " #~ "déconnexions" #, fuzzy #~ msgid "Use cust_om hostname/port" #~ msgstr "Implij un anv ostiz/porzh personelaet" #, fuzzy #~ msgid "_Hostname: " #~ msgstr "Servijer:" #, fuzzy #~ msgid "_Port: " #~ msgstr "_Porzh:" #~ msgid "No key selected" #~ msgstr "Alc'hwez ebet diuzet" #~ msgid "Choose _Key..." #~ msgstr "Dibabit un _alc'hwezh..." #, fuzzy #~ msgid "" #~ "If checked, Gajim will get the password from a GPG agent like seahorse" #~ msgstr "" #~ "Si cette case est cochée, Gajim va retenir le mot de passe pour ce compte" #~ msgid "OpenPGP" #~ msgstr "OpenPGP" #, fuzzy #~ msgid "_Edit Personal Information..." #~ msgstr "Kemmañ an titouroù hiniennel..." #~ msgid "Information about you, as stored in the server" #~ msgstr "Titouroù diwar ho penn, miret war ar servijer" #~ msgid "Personal Information" #~ msgstr "Titouroù hiniennel" #, fuzzy #~ msgid "Co_nnect on Gajim startup" #~ msgstr "K_evreañ en ur loc'hañ Gajim" #, fuzzy #~ msgid "Use cust_om port:" #~ msgstr "Implij un anv ostiz/porzh personelaet" #, fuzzy #~ msgid "Mer_ge accounts" #~ msgstr "_Strollañ ar c'hontoù" #, fuzzy #~ msgid "OpenPGP is not usable on this computer" #~ msgstr "N'eus ket tu da implij OpenPGP war an urzhiataer-mañ" #~ msgid "To change the account name, you must be disconnected." #~ msgstr "Rankout a rit bezañ diluget evit cheñch anv ar gont." #~ msgid "To change the account name, you must read all pending events." #~ msgstr "" #~ "Rankout a rit lenn an holl zarvoudoù-mañ evit gellout cheñch anv ar gont." #~ msgid "Account Name Already Used" #~ msgstr "Anv-kont implijet dija" #~ msgid "" #~ "This name is already used by another of your accounts. Please choose " #~ "another name." #~ msgstr "" #~ "Implijet e vez an anv-mañ gant unan eus ho kontoù dija. Dibabit un anv " #~ "all marplij." #~ msgid "Invalid account name" #~ msgstr "Anv-kont direizh" #~ msgid "Account name cannot be empty." #~ msgstr "N'hell ket anv ar gont chom goullo." #~ msgid "Account name cannot contain spaces." #~ msgstr "N'hell ket anv ar gont kaout esaouennoù." #, fuzzy #~ msgid "Enter a new name for account %s" #~ msgstr "Roit ho ker-kuzh GPG evit ar gont %s." #, fuzzy #~ msgid "A JID must be in the form \"user@servername\"." #~ msgstr "Un ID Jabber a rank bezañ er stumm \"anv@anvservijer\"." #~ msgid "No such account available" #~ msgstr "Kont dihegerz" #~ msgid "" #~ "You must create your account before editing your personal information." #~ msgstr "Rankout a rit krouiñ ho kont a-raok kemmañ an titouroù hiniennel." #~ msgid "Without a connection, you can not edit your personal information." #~ msgstr "Rankout a rit bezañ luget evit kemmañ ho titouroù hiniennel." #, fuzzy #~ msgid "Your server can't save your personal information." #~ msgstr "Rankout a rit krouiñ ho kont a-raok kemmañ an titouroù hiniennel." #, fuzzy #~ msgid "Account Local already exists." #~ msgstr "Anv-kont implijet dija" #~ msgid "THANKS:" #~ msgstr "TRUGAREZ DA:" #, fuzzy #~ msgid "Could not write to %s. Session Management support will not work" #~ msgstr "N'eus ket bet tu skrivañ e-barzh %s." #, fuzzy #~ msgid "_Enable" #~ msgstr "Enaouiñ" #, fuzzy #~ msgid "Filter" #~ msgstr "Sonioù" #~ msgid "_IQ" #~ msgstr "_IQ" #~ msgid "Info/Query" #~ msgstr "Titour/Goulenn" #~ msgid "_Message" #~ msgstr "_Kemennadenn" #, fuzzy #~ msgid "Last status: %s" #~ msgstr "Stad diwezhañ: %s" #, fuzzy #~ msgid " since %s" #~ msgstr "dibaoe %s" #~ msgid "since %s" #~ msgstr "dibaoe %s" #, fuzzy #~ msgid "No" #~ msgstr "Hini ebet" #, fuzzy #~ msgid "Prefer" #~ msgstr "Penndibaboù" #, fuzzy #~ msgid "otr" #~ msgstr "_Ostiz:" #, fuzzy #~ msgid "Invalid expire value" #~ msgstr "Anv-arveriad-ez direizh" #~ msgid "How many minutes should last lines from previous conversation last." #~ msgstr "" #~ "E-pad pet munutenn e rank linennoù diwezhañ ar gaozeadenn kent bezañ " #~ "gwarezet." #~ msgid "You will be connected to %s without OpenPGP." #~ msgstr "Luget e voc'h da %s hep OpenPGP." #, fuzzy #~ msgid "The following message was NOT encrypted" #~ msgstr "[Sifret eo ar gemennadenn-mañ]" #, fuzzy #~ msgid "Encryption used for this contact." #~ msgstr "N'eus ket tu da implij OpenPGP war an urzhiataer-mañ" #, fuzzy #~ msgid "OpenPGP encryption enabled" #~ msgstr "War enaou emañ ar sifrañ" #, fuzzy #~ msgid "OpenPGP encryption disabled" #~ msgstr "Lazhet eo ar sifrañ" #, fuzzy #~ msgid "The following message was encrypted" #~ msgstr "[Sifret eo ar gemennadenn-mañ]" #, fuzzy #~ msgid "Toggle the OpenPGP encryption" #~ msgstr "Encryption OpenPGP" #, fuzzy #~ msgid "[This message is *encrypted* (See :XEP:`27`]" #~ msgstr "[Sifret eo ar gemennadenn-mañ]" #, fuzzy #~ msgid "Database cannot be read." #~ msgstr "N'hell ket anv ar gont chom goullo." #, fuzzy #~ msgid "Smooth scroll message in conversation window" #~ msgstr "Kas ar gemennadenn ha serriñ ar prenestr" #, fuzzy #~ msgid "Show _XML Console" #~ msgstr "Diskouez ar gonsol _XML" #, fuzzy #~ msgid "Edit _Privacy Lists..." #~ msgstr "Flapoù prevez" #~ msgid "_Administrator" #~ msgstr "_Merour-ez" #, fuzzy #~ msgid "Sends a message to users currently connected to this server" #~ msgstr "A gas ur gemennadenn d'an arveridi luget war ar servijer-mañ" #~ msgid "Sets Message of the Day" #~ msgstr "A laka kemennadenn an devezh" #~ msgid "Updates Message of the Day" #~ msgstr "A hiziva kemennadenn an devez" #~ msgid "Deletes Message of the Day" #~ msgstr "A zilam kemennadenn an devezh" #, fuzzy #~ msgid "Add _Contact..." #~ msgstr "_Ouzhpennañ un darempred..." #, fuzzy #~ msgid "_Accounts" #~ msgstr "Kontoù" #, fuzzy #~ msgid "Profile, A_vatar" #~ msgstr "Aelad, Avatar" #~ msgid "File _Transfers" #~ msgstr "_Treuzkasoù" #~ msgid "Help online" #~ msgstr "Skoazell enlinenn" #~ msgid "Frequently Asked Questions (online)" #~ msgstr "Marc'had Ar Goulennoù (FAQ enlinenn)" #, fuzzy #~ msgid "Fea_tures" #~ msgstr "Perzhioù ar servijerien" #~ msgid "to %s account" #~ msgstr "d'ar gont %s" #~ msgid "using %s account" #~ msgstr "en ur implij ar gont %s" #~ msgid "of account %s" #~ msgstr "eus ar gont %s" #~ msgid "for account %s" #~ msgstr "evit ar gont %s" #~ msgid "" #~ "By removing this contact you also remove authorization resulting in him " #~ "or her always seeing you as offline." #~ msgstr "" #~ "En ur zilemel an darempred-mañ, e tilamit ivez e/he aotre. Atav e welo " #~ "ac'hanoc'h evel pa vefec'h ezlinenn." #~ msgid "Invalid Jabber ID" #~ msgstr "ID jabber direizh" #~ msgid "This file is being used by another process." #~ msgstr "Implijet eo ar restr-mañ gant ur poellad all." #~ msgid "pgp key" #~ msgstr "alc'hwezh pgp" #, fuzzy #~ msgid "" #~ "Sends new single message to a contact in the roster. Both OpenPGP key and " #~ "account are optional. If you want to set only 'account', without 'OpenPGP " #~ "key', just set 'OpenPGP key' to ''." #~ msgstr "" #~ "Envoyer un nouveau message à un contact dans la liste. La clé OpenPGP et " #~ "le compte sont facultatifs. Si vous voulez renseigner seulement le " #~ "paramètre 'compte' sans 'clé pgp', mettez simple la valeur '' pour 'clé " #~ "pgp'." #, fuzzy #~ msgid "Please first choose another theme as your current theme." #~ msgstr "Dibabit ur gwiskadur all da gentañ." #~ msgid "Your passphrase is incorrect" #~ msgstr "Direizh eo ho ker-kuzh" #, fuzzy #~ msgid "OpenPGP Passphrase Incorrect" #~ msgstr "Direizh eo ho ker-kuzh" #~ msgid "You successfully received %(filename)s from %(name)s." #~ msgstr "Gant berzh ho peus resevet %(filename)s digant %(name)s." #, fuzzy #~ msgid "Set logs directory" #~ msgstr "a grou ar renkell %s" #~ msgid "Chats" #~ msgstr "Flapoù" #, fuzzy #~ msgid "_Manage Bookmarks..." #~ msgstr "Merañ ar sinedoù..." #~ msgid "Change Status Message..." #~ msgstr "Kemmañ an titour-stad..." #~ msgid "_Change Status Message..." #~ msgstr "_Kemmañ an titour-stad..." #~ msgid "" #~ "You are not interested in the contact's presence, and neither he/she is " #~ "interested in yours" #~ msgstr "" #~ "N'oc'h ket dedennet gant bezañs an darempred-mañ, nag eñ/hi gant ho hini" #, fuzzy #~ msgid "Error description..." #~ msgstr "Taolennadur" #, fuzzy #~ msgid "View contact information (Ctrl+I)" #~ msgstr "a zo aketus d'ar gaozeadenn" #, fuzzy #~ msgid "Groupchat Histories" #~ msgstr "Flapoù a-stroll" #, fuzzy #~ msgid "All Chat Histories" #~ msgstr "Stad:" #~ msgid "More" #~ msgstr "Muioc'h" #~ msgid "creating %s directory" #~ msgstr "a grou ar renkell %s" #, fuzzy #~ msgid "%s is not the name of a group chat." #~ msgstr "A guzha an nozelennoù er prenestr flapiñ" #, fuzzy #~ msgid "Session Management" #~ msgstr "Kemennadenn gaset" #, fuzzy #~ msgid "Gajim needs X server to run. Quiting..." #~ msgstr "Ezhomm en deus Gajim eus ur servijer X evit labourat. O kuitaat..." #, fuzzy #~ msgid "Gajim needs PyGTK 2.22 or above" #~ msgstr "Ezhomm en deus Gajim eus PyGTK 2.6 pe uheloc'h" #, fuzzy #~ msgid "Gajim needs PyGTK 2.22 or above to run. Quiting..." #~ msgstr "" #~ "Ezhomm en deus Gajim eus PyGTK 2.6 pe uheloc'h evit labourat. O kuitaat..." #, fuzzy #~ msgid "Gajim needs GTK 2.22 or above" #~ msgstr "Ezhomm en deus Gajim eus GTK 2.6 pe uheloc'h" #, fuzzy #~ msgid "Gajim needs GTK 2.22 or above to run. Quiting..." #~ msgstr "" #~ "Ezhomm en deus Gajim eus GTK 2.6 pe uheloc'h evit labourat. O kuitaat..." #, fuzzy #~ msgid "Gajim needs pywin32 to run" #~ msgstr "Ezhomm en deus Gajim eus PySQLite evit labourat" #~ msgid "A programming error has been detected" #~ msgstr "Ur fazi gouleviñ (programmiñ) ez eus bet kavet" #~ msgid "Details" #~ msgstr "Munudoù" #, fuzzy #~ msgid "Jabber ID: " #~ msgstr "ID Jabber:" #~ msgid "Subscription: " #~ msgstr "Koumanant:" #, fuzzy #~ msgid "Mood: " #~ msgstr "Webgaoz:" #, fuzzy #~ msgid "Activity: " #~ msgstr "Oberiant" #, fuzzy #~ msgid "Join _Group Chat..." #~ msgstr "Ebarzhiñ ur _webgaoz" #, fuzzy #~ msgid "_Modify Account" #~ msgstr "_Kemmañ ar gont..." #~ msgid "_Group Chat" #~ msgstr "_Webkaozioù" #, fuzzy #~ msgid "Would you like to make Gajim the default Jabber client?" #~ msgstr "Voulez-vous l'écraser ?" #, fuzzy #~ msgid "Send Single Message" #~ msgstr "_Kas ur gemennadenn simpl" #, fuzzy #~ msgid "Actions" #~ msgstr "Poelladoù" #, fuzzy #~ msgid "Conditions" #~ msgstr "Sonioù" #, fuzzy #~ msgid "Advanced Actions" #~ msgstr "Actions a_vancées" #, fuzzy #~ msgid "Advanced Notifications Control" #~ msgstr "Aozer kefluniañ dre ar munut" #, fuzzy #~ msgid "Contact Change Status " #~ msgstr "Darempred diluget" #, fuzzy #~ msgid "Contact Disconnected " #~ msgstr "Darempred diluget" #, fuzzy #~ msgid "File Transfer Started " #~ msgstr "Sac'het an treuzkas" #, fuzzy #~ msgid "Group Chat Message Highlight " #~ msgstr "Message d'un Salon mis en Sur-brillance" #, fuzzy #~ msgid "Group Chat Message Received " #~ msgstr "Kemennadenn digant ur sal-flapiñ" #, fuzzy #~ msgid "Launch a command" #~ msgstr "urzhiad" #, fuzzy #~ msgid "Online / Free For Chat" #~ msgstr "Prest da flapiñ" #, fuzzy #~ msgid "Play a sound" #~ msgstr "_Seniñ" #, fuzzy #~ msgid "_Disable auto opening chat window" #~ msgstr "A guzha an nozelennoù er prenestroù webgaoz" #, fuzzy #~ msgid "_Open chat window with user" #~ msgstr "Utiliser une seule fenê_tre de discussion avec des onglets" #, fuzzy #~ msgid "_Show event in roster" #~ msgstr "Diskouez er _roll hepken" #, fuzzy #~ msgid "contact(s)" #~ msgstr "Darempredoù" #, fuzzy #~ msgid "for " #~ msgstr "Porzh:" #, fuzzy #~ msgid "group(s)" #~ msgstr "Strollad" #, fuzzy #~ msgid "_Allow him/her to see my status" #~ msgstr "He/E aotren da welet ma stad" #, fuzzy #~ msgid "Descrition:" #~ msgstr "Taolennadur: %s" #, fuzzy #~ msgid "Advanced..." #~ msgstr "Dre ar munut" #, fuzzy #~ msgid "Display _activity of contacts in roster" #~ msgstr "Diskouez _skeudennigoù an darempredoù er roll" #, fuzzy #~ msgid "Display _tunes of contacts in roster" #~ msgstr "Diskouez _skeudennigoù an darempredoù er roll" #, fuzzy #~ msgid "Display m_ood of contacts in roster" #~ msgstr "Diskouez _skeudennigoù an darempredoù er roll" #, fuzzy #~ msgid "" #~ "If checked, Gajim will display the activity of contacts in the roster " #~ "window" #~ msgstr "" #~ "Si cette case est cochée, Gajim affichera l'avatar de chaque contact dans " #~ "la fenêtre principale et les salons" #, fuzzy #~ msgid "" #~ "If checked, Gajim will display the tunes of contacts in the roster window" #~ msgstr "" #~ "Si cette case est cochée, Gajim affichera l'avatar de chaque contact dans " #~ "la fenêtre principale et les salons" #, fuzzy #~ msgid "User avatar:" #~ msgstr "Choisissez un Avatar" #~ msgid "Gajim Instant Messenger" #~ msgstr "Flaperez Gajim" #, fuzzy #~ msgid "German" #~ msgstr "Hollek" #, fuzzy #~ msgid "Greek" #~ msgstr "Glas" #, fuzzy #~ msgid "Croatian" #~ msgstr "Chomlec'h" #, fuzzy #~ msgid "Italian" #~ msgstr "Stouet" #, fuzzy #~ msgid "Polish" #~ msgstr "_Embann" #, fuzzy #~ msgid "Serbian" #~ msgstr "Hollek" #~ msgid "Check your connection or try again later" #~ msgstr "Gwiriekait ho lugadenn pe klaskit en-dro diwezhatoc'h" #~ msgid "error: cannot open %s for reading" #~ msgstr "fazi: dibosupl eo digeriñ %s evit lenn" #, fuzzy #~ msgid "Unable to bind to port %s." #~ msgstr "Impossible de rejoindre le salon" #~ msgid "A GTK+ jabber client" #~ msgstr "Ur flaperez jabber e GTK+" #, fuzzy #~ msgid "Condition" #~ msgstr "Kevreadenn" #, fuzzy #~ msgid "one of: offline, online, chat, away, xa, dnd, invisible " #~ msgstr "unan eus: offline, online, chat, away, xa, dnd, invisible " #, fuzzy #~ msgid "" #~ "Returns current status message(the global one unless account is specified)" #~ msgstr "" #~ "A gas an titour-stad red (an hini hollek, nemet ez eus bet resisaet ur " #~ "gont bennak)" #~ msgid "" #~ "Usage: %s %s %s \n" #~ "\t %s" #~ msgstr "" #~ "Implij: %s %s %s \n" #~ "\t %s" #, fuzzy #~ msgid "Subject: %s" #~ msgstr "Sujed: %s\n" #, fuzzy #~ msgid "Mood: %s" #~ msgstr "Webgaoz:" #, fuzzy #~ msgid "Activity: %s" #~ msgstr "Oberiant" #, fuzzy #~ msgid "_Show event in systray" #~ msgstr "Diskouez er _roll hepken" #, fuzzy #~ msgid "Autodetect on every Gajim startup" #~ msgstr "K_evreañ en ur loc'hañ Gajim" #, fuzzy #~ msgid "Show systray:" #~ msgstr "Diskouez er _roll hepken" #, fuzzy #~ msgid "Nickname not allowed: %s" #~ msgstr "N'eus ket bet kavet al lesanv : %s" #~ msgid "we are now subscribed to %s" #~ msgstr "nous sommes maintenant inscrits chez %s" #~ msgid "we are now unsubscribed from %s" #~ msgstr "nous ne sommes plus dans la liste de %s" #~ msgid "Account Modification" #~ msgstr "Kemmañ ar gont" #~ msgid "" #~ "Check this so Gajim will connect in port 5223 where legacy servers are " #~ "expected to have SSL capabilities. Note that Gajim uses TLS encryption by " #~ "default if broadcasted by the server, and with this option enabled TLS " #~ "will be disabled" #~ msgstr "" #~ "Si vous cochez cette case, Gajim se connectera sur le port 5223, sur " #~ "lequel les serveurs sont supposés gérer le SSL. Notez que Gajim utilise " #~ "le cryptage TLS par défaut si le serveur annonce qu'il le supporte, et " #~ "avec cette option vous désactivez le TLS" #~ msgid "Edit Personal Information..." #~ msgstr "Kemmañ an titouroù hiniennel..." #~ msgid "Hostname: " #~ msgstr "Servijer:" #~ msgid "" #~ "If checked, Gajim will store the password in ~/.gajim/config with 'read' " #~ "permission only for you" #~ msgstr "" #~ "Si cette case est cochée, Gajim va sauvegarder le mot de passe dans ~/." #~ "gajim/config avec accès en lecture pour vous uniquement" #~ msgid "Port: " #~ msgstr "Porzh:" #~ msgid "Save _passphrase (insecure)" #~ msgstr "_Enrollañ ar ger-kuzh (diasur)" #~ msgid "Use _SSL (legacy)" #~ msgstr "Implij _SSL" #, fuzzy #~ msgid "" #~ "Account row\n" #~ "Group row\n" #~ "Contact row\n" #~ "Chat Banner" #~ msgstr "" #~ "Kont\n" #~ "Strollad\n" #~ "Darempred\n" #~ "Titl" #, fuzzy #~ msgid "gtk-delete" #~ msgstr "Dilemel" #~ msgid "" #~ "All chat states\n" #~ "Composing only\n" #~ "Disabled" #~ msgstr "" #~ "An holl stadoù\n" #~ "O skrivañ hepken\n" #~ "Lazhet" #, fuzzy #~ msgid "" #~ "Autodetect on every Gajim startup\n" #~ "Always use GNOME default applications\n" #~ "Always use KDE default applications\n" #~ "Always use Xfce default applications\n" #~ "Custom" #~ msgstr "" #~ "Détection automatique à chaque démarrage\n" #~ "Toujours utiliser les applications par défaut de GNOME\n" #~ "Toujours utiliser les applications par défaut de KDE\n" #~ "Personnalisé" #, fuzzy #~ msgid "gtk-cancel" #~ msgstr "Dilemel" #~ msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." #~ msgstr "pysqlite2 (ou python-pysqlite2) n'eo ket staliet. O kuitaat..." #~ msgid "" #~ "Please remove your current GTK+ runtime and install the latest stable " #~ "version from %s" #~ msgstr "" #~ "Dilamit al levraoueg red eus GTK+runtime ha staliit an aozadur stabil " #~ "diwezhañ diwar %s" #~ msgid "Gajim needs PySQLite2 to run" #~ msgstr "Ezhomm en deus Gajim eus PySQLite evit labourat" #~ msgid "_Incoming message:" #~ msgstr "Kemennadenn o _tegouezhout:" #~ msgid "_Outgoing message:" #~ msgstr "Kemennadenn o _vont 'maez:" #, fuzzy #~ msgid "gtk-ok" #~ msgstr "gtk+" #~ msgid "OpenPGP passphrase was not given" #~ msgstr "N'eo ket bet roet ar ger-kuzh OpenPGP" #~ msgid "" #~ "To continue sending and receiving messages, you will need to reconnect." #~ msgstr "" #~ "Evit kenderc'hel da gas ha da resev kemennadennoù, e rankit lugañ en-dro." #~ msgid "%i days ago" #~ msgstr "%i devezh 'zo" #~ msgid "Add Special _Notification" #~ msgstr "Ouzhpennañ ur gelaouenn _ispisial" #~ msgid "Commands: %s" #~ msgstr "Urzhioù: %s" #, fuzzy #~ msgid "" #~ "Usage: /%(command)s , sends action to the current group chat. Use " #~ "third person. (e.g. /%(command)s explodes.)" #~ msgstr "" #~ "Usage : /%s , envoie l'action au salon actuel. Utilise la " #~ "troisième personne. (ex : /%s explose.)" #~ msgid "No help info for /%s" #~ msgstr "N'eus skoazell hegerz ebet evit /%s" #~ msgid "Nickname not found: %s" #~ msgstr "N'eus ket bet kavet al lesanv : %s" #, fuzzy #~ msgid "This group chat has no subject" #~ msgstr "N'eus sujed ebet gant ar webgaoz-mañ" #, fuzzy #~ msgid "" #~ "Usage: /%s [reason], bans the JID from the group chat. The " #~ "nickname of an occupant may be substituted, but not if it contains \"@\". " #~ "If the JID is currently in the group chat, he/she/it will also be kicked." #~ msgstr "" #~ "Usage : /%s [raison], bannit le JID du salon. Le surnom de " #~ "l'occupant peut être utilisé s'il ne contient pas de \"@\". Si le JID est " #~ "actuellement dans le salon il sera également éjecté. Ne supporte pas les " #~ "espaces dans le surnom." #~ msgid "" #~ "Usage: /%s [reason], closes the current window or tab, displaying reason " #~ "if specified." #~ msgstr "" #~ "Usage : /%s [raison], ferme la fenêtre ou l'onglet courrant en affichant " #~ "la raison si spécifiée." #, fuzzy #~ msgid "" #~ "Usage: /%s [reason], invites JID to the current group chat, " #~ "optionally providing a reason." #~ msgstr "" #~ "Usage : /%s [raison], invite le JID dans le salon actuel, la raison " #~ "est optionnelle." #~ msgid "" #~ "Usage: /%s @[/nickname], offers to join room@server " #~ "optionally using specified nickname." #~ msgstr "" #~ "Usage : /%s @[/surnom], propose de rejoindre " #~ "salon@serveur en option on peut spécifier le surnom utilisé." #, fuzzy #~ msgid "" #~ "Usage: /%s [reason], removes the occupant specified by " #~ "nickname from the group chat and optionally displays a reason." #~ msgstr "" #~ "Usage : /%s [raison], supprime l'occupant portant le surnom " #~ "spécifié du salon et affiche en option la raison. Le surnom ne doit pas " #~ "contenir d'espaces !" #, fuzzy #~ msgid "" #~ "Usage: /%s [message], opens a private message window and sends " #~ "message to the occupant specified by nickname." #~ msgstr "" #~ "Usage : /%s [message], ouvre une fenêtre de discussion privée et " #~ "envoie le message à l'occupant(e) spécifié(e) par le surnom." #, fuzzy #~ msgid "Usage: /%s , changes your nickname in current group chat." #~ msgstr "Usage : /%s , change votre surnom dans ce salon." #, fuzzy #~ msgid "" #~ "Usage: /%s [topic], displays or updates the current group chat topic." #~ msgstr "" #~ "Usage : /%s [sujet], affiche ou met à jour le sujet actuel du salon." #~ msgid "" #~ "Usage: /%s , sends a message without looking for other commands." #~ msgstr "" #~ "Usage : /%s , envoie un message sans chercher d'autres commandes." #, fuzzy #~ msgid "" #~ "Usage: /%s , allow to send you messages and private " #~ "messages." #~ msgstr "Usage : /%s , change votre surnom dans ce salon." #~ msgid "Name:" #~ msgstr "Anv:" #~ msgid "_Host:" #~ msgstr "_Ostiz:" #, fuzzy #~ msgid "Modify Account" #~ msgstr "_Kemmañ ar gont..." #, fuzzy #~ msgid "Gajim account %s" #~ msgstr "eus ar gont %s" #~ msgid "This account is already configured in Gajim." #~ msgstr "Kefluniet eo bet ar gont-mañ e-barzh Gajim dija." #, fuzzy #~ msgid "File transfer stopped by the contact at the other end" #~ msgstr "Arsavet eo bet an treuzkas gant ho tarempred" #, fuzzy #~ msgid "Generic" #~ msgstr "Hollek" #, fuzzy #~ msgid "Activity" #~ msgstr "Oberiant" #~ msgid "%s has not broadcast an OpenPGP key, nor has one been assigned" #~ msgstr "" #~ "N'eus bet kaset alc'hwezh OpenPGP ebet gant %s, ha n'o peus roet hini " #~ "ebet dezhañ" #~ msgid "No such command: /%s (if you want to send this, prefix it with /say)" #~ msgstr "" #~ "N'eus ket eus an urzhiad: /%s (lakait /say araozañ ma fell deoc'h e gas)" #, fuzzy #~ msgid "" #~ "Usage: /%s , sends action to the current group chat. Use third " #~ "person. (e.g. /%s explodes.)" #~ msgstr "" #~ "Usage : /%s , envoie l'action au salon actuel. Utilise la " #~ "troisième personne. (ex : /%s explose.)" #~ msgid "_Retype Password:" #~ msgstr "_Adroit ho ker-kuzh" #~ msgid "" #~ "If you have 2 or more accounts and it is checked, Gajim will list all " #~ "contacts as if you had one account" #~ msgstr "" #~ "M'ho peus daou gont pe ouzhpenn hag eo diuzet, e vo strollet an holl " #~ "zarempredoù evel pa vefe ur gont hepken" #~ msgid "Click to see past conversation in this room" #~ msgstr "Klikit amañ evit gwelout kaozioù kent ar flap-mañ" #~ msgid "Build custom query" #~ msgstr "Krouiñ ur goulenn personelaet" #~ msgid "Query Builder..." #~ msgstr "Krouiñ ur goulenn..." #~ msgid "Invitation Received" #~ msgstr "Resevet ar bedadenn" #~ msgid "Format of a line" #~ msgstr "Furmad ul linenn" #~ msgid "Interface Customization" #~ msgstr "Personelaat an etrefas" #~ msgid "A_fter nickname:" #~ msgstr "Da _heul al lesanv:" #~ msgid "Also known as iChat style" #~ msgstr "Anvet ivez stil iChat" #~ msgid "Chat" #~ msgstr "Flap" #~ msgid "E_very 5 minutes" #~ msgstr "_Bep 5 munutenn" #~ msgid "" #~ "Gajim will automatically show new events by poping up the relative window" #~ msgstr "" #~ "Gajim montrera automatiquement les nouveaux évènements reçus en montrant " #~ "la fenêtre correspondante" #~ msgid "" #~ "Gajim will notify you for new events via a popup in the bottom right of " #~ "the screen" #~ msgstr "" #~ "Gajim vous signalera les nouveaux évènements dans une fenêtre en bas à " #~ "droite de l'écran" #~ msgid "" #~ "Gajim will notify you via a popup window in the bottom right of the " #~ "screen about contacts that just signed in" #~ msgstr "" #~ "Gajim vous signalera par une fenêtre de notification en bas à droite de " #~ "l'écran qu'un contact s'est connecté" #~ msgid "" #~ "Gajim will only change the icon of the contact that triggered the new " #~ "event" #~ msgstr "" #~ "Gajim ne fera que changer l'icône du contact qui a envoyé le nouvel " #~ "évènement" #~ msgid "" #~ "If checked, Gajim will remember the roster and chat window positions in " #~ "the screen and the sizes of them next time you run it" #~ msgstr "" #~ "Si cette case est cochée, Gajim va retenir la position de votre liste " #~ "decontacts et des fenêtres de discussion pour vos prochaines utilisations" #~ msgid "" #~ "Never\n" #~ "Always\n" #~ "Per account\n" #~ "Per type" #~ msgstr "" #~ "Morse\n" #~ "Atav\n" #~ "Dre gont\n" #~ "Dre zoare" #, fuzzy #~ msgid "Outgoing Chat state noti_fications:" #~ msgstr "Titou_roù-stad ar flap:" #~ msgid "Print time:" #~ msgstr "Diskouez an eur:" #~ msgid "Save _position and size for roster and chat windows" #~ msgstr "_Mirout lec'hiadur ha ment ar roll hag ar prenistri-flapiñ" #~ msgid "The auto away status message" #~ msgstr "An emc'hemennadenn evit ar stad \"Ezvezant\"" #~ msgid "" #~ "When a new event (message, file transfer request etc..) is received, the " #~ "following methods may be used to inform you about it. Please note that " #~ "events about new messages only occur if it is a new message from a " #~ "contact you are not already chatting with" #~ msgstr "" #~ "Pa resevit un darvoud nevez (kemennadenn, goulenn treuzkas h.a.), ez eus " #~ "tu implij an doareoù da heul evit kelaouién ac'hanoc'h. Deoc'h da " #~ "c'houzout, ec'h erru darvoudoù evit kemennadennoù nevez m'int bet kaset " #~ "gant un darempred n'emaoc'h ket o flapién gant-añ/-i." #, fuzzy #~ msgid "_Advanced Notifications Control..." #~ msgstr "Aozer kefluniañ dre ar munut" #~ msgid "_After time:" #~ msgstr "_War-lerc'h an eur:" #~ msgid "_Before time:" #~ msgstr "_A-raok an eur:" #~ msgid "_Player:" #~ msgstr "_Soner:" #~ msgid "Address" #~ msgstr "Chomlec'h" #~ msgid "City:" #~ msgstr "Kêr:" #~ msgid "Company:" #~ msgstr "Embregerezh:" #~ msgid "Given:" #~ msgstr "Anv bihan:" #~ msgid "Middle:" #~ msgstr "Eil anv bihan:" #~ msgid "Position:" #~ msgstr "Plas:" #~ msgid "Prefix:" #~ msgstr "Rakger:" #~ msgid "Role:" #~ msgstr "Perzh:" #~ msgid "State:" #~ msgstr "Stad:" #~ msgid "Suffix:" #~ msgstr "Lostger:" #~ msgid "_Retrieve" #~ msgstr "_Kargañ" #~ msgid "_Remove from Roster" #~ msgstr "_Dilemel diouzh ar roll" #~ msgid "A_ccounts" #~ msgstr "_Kontoù" #~ msgid "_Filter:" #~ msgstr "_Sil:" #~ msgid "Ask:" #~ msgstr "Goulenn:" #~ msgid "Client:" #~ msgstr "Poellad:" #~ msgid "OS:" #~ msgstr "OS:" #~ msgid "Every %s _minutes" #~ msgstr "Bep %s _munutenn" #~ msgid "You must enter a password for the new account." #~ msgstr "Rankout a rit reiñ ur ger-kuzh evit enrollañ ar gont nevez." #~ msgid "You will always see him or her as offline." #~ msgstr "Atav e weloc'h anezhañ ezlinenn." #~ msgid "%s is now %s (%s)" #~ msgstr "%s a zo bremañ %s (%s)" #, fuzzy #~ msgid "Network Manager support not available" #~ msgstr "N'eus ket tu da gevreañ" #~ msgid "Session Management support not available (missing gnome.ui module)" #~ msgstr "" #~ "Support du gestionnaire de sessions indisponible (module gnome.ui " #~ "manquant)" #~ msgid "Private Chat" #~ msgstr "Flap prevez" #~ msgid "Group Chat" #~ msgstr "Flap a-stroll" #~ msgid "%s is now %s" #~ msgstr "%s a zo bremañ %s" #~ msgid "%s does not appear to be a valid JID" #~ msgstr "%s ne seblant ket bezañ ur JID a-feson" #~ msgid "%s - Gajim" #~ msgstr "%s - Gajim" #~ msgid "Without a connection, you can not get your contact information." #~ msgstr "Rankout a rit bezañ luget evit kaout titouroù an darempred." #, fuzzy #~ msgid "_New group chat" #~ msgstr "Flap a-stroll" #~ msgid "_Log on" #~ msgstr "_Lugañ" #~ msgid "Log _off" #~ msgstr "_Dilugañ" #~ msgid "Save passphrase" #~ msgstr "Enrollañ ar ger-kuzh" #~ msgid "Drop %s in group %s" #~ msgstr "Kas %s er strollad %s" #, fuzzy #~ msgid "Hides the buttons in two persons chat window." #~ msgstr "A guzha an nozelennoù er prenestroù-flapiñ" #~ msgid "Connected to server %s:%s with %s" #~ msgstr "Luget d'ar servijer %s:%s gant %s" #~ msgid "invisible" #~ msgstr "Diwelus" #~ msgid "offline" #~ msgstr "Ezlinenn" #~ msgid "I'm %s" #~ msgstr "%s on" #, fuzzy #~ msgid " %d unread single message" #~ msgid_plural " %d unread single messages" #~ msgstr[0] "Gajim - %d gemennadenn simpl nevez" #~ msgstr[1] "Gajim - kemennadennoù simpl nevez: %d" #, fuzzy #~ msgid " %d unread group chat message" #~ msgid_plural " %d unread group chat messages" #~ msgstr[0] "Gajim - %d gemennadenn webgaoz nevez" #~ msgstr[1] "Gajim - kemennadennoù webgaoz nevez: %d" #, fuzzy #~ msgid " %d unread private message" #~ msgid_plural " %d unread private messages" #~ msgstr[0] "Gajim - %d gemennadenn brevez nevez" #~ msgstr[1] "Gajim - kemennadennoù prevez nevez: %d" #, fuzzy #~ msgid "Connection to host could not be established" #~ msgstr "N'eus ket tu seveniñ al lugadenn gant an darempred." #, fuzzy #~ msgid "_New room" #~ msgstr "Sal-flapiñ nevez" #~ msgid "Role: " #~ msgstr "Perzh:" #, fuzzy #~ msgid "Away " #~ msgstr "Ezvezant" #, fuzzy #~ msgid "Down" #~ msgstr "Pellgargañ" #, fuzzy #~ msgid "List of special notifications settings" #~ msgstr "Oc'h ouzhpennañ ur gelaouenn nevez evit %s" #, fuzzy #~ msgid "Not Available " #~ msgstr "Dihegerz" #~ msgid "Contact _Info" #~ msgstr "_Titouroù" #~ msgid "Jabber" #~ msgstr "Jabber" #~ msgid "Invalid room or server name" #~ msgstr "Anv sal pe servijer direizh" #~ msgid "Your personal information has been published successfully." #~ msgstr "Gant berzh eo bet embannet ho titouroù hiniennel." #~ msgid "Migrating Logs..." #~ msgstr "O tilec'hiañ an istoradur..." #~ msgid "Gajim - %d unread message" #~ msgid_plural "Gajim - %d unread messages" #~ msgstr[0] "Gajim - %d gemennadenn nevez" #~ msgstr[1] "Gajim - kemennadennoù nevez: %d" #~ msgid "Since %s" #~ msgstr "Dibaoe %s" #~ msgid "Automatically authorize contact" #~ msgstr "Aotren war-eeun an darempred" #~ msgid "_Join New Room..." #~ msgstr "Re_joindre un nouveau salon..." #, fuzzy #~ msgid "Please modify your special notification below" #~ msgstr "Choisissez une des options suivantes :" #~ msgid "Delete Message of the Day" #~ msgstr "Supprimer le message du jour" #, fuzzy #~ msgid "I want to listen to:" #~ msgstr "%s souhaite vous envoyer un fichier :" #~ msgid "Send _New Message..." #~ msgstr "Envoyer un _nouveau message..." #~ msgid "Set Message of the Day" #~ msgstr "Définir un message du jour" #~ msgid "Update Message of the Day" #~ msgstr "Mettre à jour le message du jour" #~ msgid "Use compact view when you open a chat window" #~ msgstr "" #~ "Utiliser la vue compacte quand vous ouvrez une fenêtre de discussion" #~ msgid "Use compact view when you open a group chat window" #~ msgstr "Utiliser la vue compacte quand vous ouvrez une fenêtre de salon" #~ msgid "%(nickname)s in room %(room_name)s has sent you a new message." #~ msgstr "" #~ "%(nickname)s du salon %(room_name)s vous a envoyé un nouveau message." #~ msgid "%s has sent you a new message." #~ msgstr "%s vous a envoyé un nouveau message." #~ msgid "Logs have been successfully migrated to the database." #~ msgstr "L'historique a été corectement récupéré." #, fuzzy #~ msgid "Start Chat with Contact" #~ msgstr "Commencer une discussion avec le compte %s" #~ msgid "All contacts in this group are offline or have errors" #~ msgstr "Tous les contacts de ce groupe sont déconnectés ou ont des erreurs" #~ msgid "Sound" #~ msgstr "Son" #~ msgid "Image" #~ msgstr "Image" #~ msgid "To %s" #~ msgstr "À %s" #~ msgid "You have been invited to the %(room_jid)s room by %(contact_jid)s" #~ msgstr "Vous avez été invité dans le salon %(room_jid)s par %(contact_jid)s" #~ msgid "_Set Image..." #~ msgstr "_Choisir une image..." #~ msgid "Switch to %s" #~ msgstr "Basculer vers %s" #~ msgid "using account " #~ msgstr "en utilisant le compte " #~ msgid "The filesize of image \"%s\" is too large" #~ msgstr "Le taille du fichier de l'image \"%s\" est trop importante" #~ msgid "The file must not be more than 32 kilobytes." #~ msgstr "Le fichier ne doit pas excéder les 32 kilobytes." #~ msgid "Timeout" #~ msgstr "Dépassement de temps" #~ msgid "account: " #~ msgstr "compte : " #~ msgid "If you close this window, you will be disconnected from these rooms." #~ msgstr "Si vous fermer cette fenêtre, vous serez déconnecté de ces salons." #~ msgid "Activate/Disable notification for when a file transfer is complete" #~ msgstr "Active/Désactive la notification de fin de transfert" #~ msgid "Removing selected file transfer" #~ msgstr "Supprime le transfert du fichier sélectionné" #~ msgid "Stoping selected file transfer" #~ msgstr "Arrête le transfert de fichier sélectionné" #~ msgid "" #~ "If you close this tab and you have history disabled, the message will be " #~ "lost." #~ msgstr "" #~ "Si vous fermez cet onglet et que l'historique n'est pas activé, le " #~ "message sera perdu." #~ msgid "Cannot remove last group" #~ msgstr "Impossible d'enlever le dernier groupe" #~ msgid "At least one contact group must be present." #~ msgstr "Au moins un groupe de contacts doit exister." #~ msgid "" #~ "pysqlite2 (aka python-pysqlite2) dependency is missing. After you install " #~ "pysqlite3, if you want to migrate your logs to the new database, please " #~ "read: http://trac.gajim.org/wiki/MigrateLogToDot9DB Exiting..." #~ msgstr "" #~ "pysqlite2 (ou python-pysqlite2) n'est pas installé. Aprés avoir installé " #~ "pysqlite2, si vous voulez migrer votre historique dans la nouvelle base " #~ "de donnée, lisez http://trac.gajim.org/wiki/MigrateLogToDot9DB. Quitte..." #~ msgid "" #~ "Image for emoticon has to be less than or equal to 24 pixels in width and " #~ "24 in height." #~ msgstr "" #~ "L'image pour l'émoticône doit être inférieure ou égale à 24 points en " #~ "largeur et 24 points en hauteur." gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/po/ca.po000066400000000000000000007150031326020644600222520ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-03-31 02:05+0000\n" "PO-Revision-Date: 2017-08-01 14:04+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.11\n" #: gajim/chat_control_base.py:199 msgid "Ping?" msgstr "" #: gajim/chat_control_base.py:204 msgid "Error." msgstr "" #: gajim/chat_control_base.py:571 msgid "_Undo" msgstr "" #: gajim/chat_control_base.py:579 gajim/profile_window.py:181 #: gajim/conversation_textview.py:539 msgid "_Clear" msgstr "" #: gajim/chat_control_base.py:1172 msgid "Really send file?" msgstr "" #: gajim/chat_control_base.py:1173 #, python-format msgid "If you send a file to %s, he/she will know your real JID." msgstr "" #: gajim/session.py:451 gajim/session.py:511 msgid "Confirm these session options" msgstr "" #: gajim/session.py:453 #, python-format msgid "" "The remote client wants to negotiate a session with these features:\n" "\n" "%s\n" "\n" "Are these options acceptable?" msgstr "" #: gajim/session.py:513 #, python-format msgid "" "The remote client selected these options:\n" "\n" "%s\n" "\n" "Continue with the session?" msgstr "" #: gajim/session.py:516 msgid "Always accept for this contact" msgstr "" #: gajim/filetransfers_window.py:89 msgid "File" msgstr "" #: gajim/filetransfers_window.py:104 msgid "Time" msgstr "" #: gajim/filetransfers_window.py:116 msgid "Progress" msgstr "" #: gajim/filetransfers_window.py:223 gajim/filetransfers_window.py:279 #, python-format msgid "Filename: %s" msgstr "" #: gajim/filetransfers_window.py:224 gajim/filetransfers_window.py:486 #, python-format msgid "Size: %s" msgstr "" #: gajim/filetransfers_window.py:233 gajim/filetransfers_window.py:243 #: gajim/history_manager.py:528 msgid "You" msgstr "" #: gajim/filetransfers_window.py:234 #, python-format msgid "Sender: %s" msgstr "" #: gajim/filetransfers_window.py:235 gajim/filetransfers_window.py:763 #: gajim/tooltips.py:667 msgid "Recipient: " msgstr "" #: gajim/filetransfers_window.py:246 #, python-format msgid "Saved in: %s" msgstr "" #: gajim/filetransfers_window.py:248 gajim/chat_control.py:1617 msgid "File transfer completed" msgstr "" #: gajim/filetransfers_window.py:250 gajim/chat_control.py:1621 msgid "Open _Containing Folder" msgstr "" #: gajim/filetransfers_window.py:263 gajim/filetransfers_window.py:270 #: gajim/chat_control.py:1676 msgid "File transfer cancelled" msgstr "" #: gajim/filetransfers_window.py:263 gajim/filetransfers_window.py:271 #: gajim/chat_control.py:1677 msgid "Connection with peer cannot be established." msgstr "" #: gajim/filetransfers_window.py:280 #, python-format msgid "Recipient: %s" msgstr "" #: gajim/filetransfers_window.py:282 #, python-format msgid "Error message: %s" msgstr "" #: gajim/filetransfers_window.py:283 gajim/chat_control.py:1673 msgid "File transfer stopped" msgstr "" #: gajim/filetransfers_window.py:319 #, python-format msgid "" "The file %(file)s has been received, but it seems to have been damaged along " "the way.\n" "Do you want to download it again?" msgstr "" #: gajim/filetransfers_window.py:345 msgid "Choose File to Send…" msgstr "" #: gajim/filetransfers_window.py:356 msgid "_Send" msgstr "Envia" #: gajim/filetransfers_window.py:363 gajim/tooltips.py:702 msgid "Description: " msgstr "" #: gajim/filetransfers_window.py:376 msgid "Gajim can not read this file" msgstr "" #: gajim/filetransfers_window.py:377 msgid "Another process is using this file." msgstr "" #: gajim/filetransfers_window.py:422 gajim/gtkgui_helpers.py:492 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "" #: gajim/filetransfers_window.py:423 gajim/gtkgui_helpers.py:493 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." msgstr "" #: gajim/filetransfers_window.py:440 gajim/gtkgui_helpers.py:497 msgid "This file already exists" msgstr "" #: gajim/filetransfers_window.py:440 gajim/gtkgui_helpers.py:497 msgid "What do you want to do?" msgstr "" #: gajim/filetransfers_window.py:451 gajim/gtkgui_helpers.py:504 #, python-format msgid "Directory \"%s\" is not writable" msgstr "" #: gajim/filetransfers_window.py:452 gajim/gtkgui_helpers.py:505 msgid "You do not have permission to create files in this directory." msgstr "" #: gajim/filetransfers_window.py:463 msgid "Save File as…" msgstr "" #: gajim/filetransfers_window.py:483 #, python-format msgid "File: %s" msgstr "" #: gajim/filetransfers_window.py:489 #, python-format msgid "Type: %s" msgstr "" #: gajim/filetransfers_window.py:491 #, python-format msgid "Description: %s" msgstr "" #: gajim/filetransfers_window.py:492 #, python-format msgid "%s wants to send you a file:" msgstr "" #: gajim/filetransfers_window.py:533 msgid "Checking file…" msgstr "" #: gajim/filetransfers_window.py:547 msgid "File error" msgstr "" #: gajim/filetransfers_window.py:584 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "" #: gajim/filetransfers_window.py:677 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "" #: gajim/filetransfers_window.py:730 gajim/filetransfers_window.py:733 msgid "Invalid File" msgstr "" #: gajim/filetransfers_window.py:730 msgid "File: " msgstr "" #: gajim/filetransfers_window.py:734 msgid "It is not possible to send empty files" msgstr "" #: gajim/filetransfers_window.py:759 gajim/tooltips.py:658 msgid "Name: " msgstr "" #: gajim/filetransfers_window.py:761 gajim/tooltips.py:661 msgid "Sender: " msgstr "" #: gajim/filetransfers_window.py:889 msgid "Pause" msgstr "" #: gajim/filetransfers_window.py:900 msgid "_Continue" msgstr "" #: gajim/features_window.py:48 msgid "Bonjour / Zeroconf" msgstr "" #: gajim/features_window.py:49 msgid "Serverless chatting with autodetected clients in a local network." msgstr "" #: gajim/features_window.py:50 msgid "Requires python-avahi." msgstr "" #: gajim/features_window.py:51 msgid "" "Requires pybonjour and bonjour SDK running (http://developer.apple.com/" "opensource/)." msgstr "" #: gajim/features_window.py:52 msgid "Command line" msgstr "" #: gajim/features_window.py:53 msgid "A script to control Gajim via commandline." msgstr "" #: gajim/features_window.py:54 msgid "Requires python-dbus." msgstr "" #: gajim/features_window.py:55 gajim/features_window.py:83 #: gajim/features_window.py:87 msgid "Feature not available under Windows." msgstr "" #: gajim/features_window.py:56 msgid "OpenPGP message encryption" msgstr "" #: gajim/features_window.py:57 msgid "Ability to encrypting chat messages with OpenPGP." msgstr "" #: gajim/features_window.py:58 msgid "Requires gpg and python-gnupg (http://code.google.com/p/python-gnupg/)." msgstr "" #: gajim/features_window.py:59 msgid "Requires gpg.exe in PATH." msgstr "" #: gajim/features_window.py:60 msgid "Password encryption" msgstr "" #: gajim/features_window.py:61 msgid "Passwords can be stored securely and not just in plaintext." msgstr "" #: gajim/features_window.py:62 msgid "" "Requires libsecret and a provider (such as GNOME Keyring and KSecretService)." msgstr "" #: gajim/features_window.py:63 msgid "On Windows the Windows Credential Vault is used." msgstr "" #: gajim/features_window.py:64 msgid "Spell Checker" msgstr "" #: gajim/features_window.py:65 msgid "Spellchecking of composed messages." msgstr "" #: gajim/features_window.py:66 gajim/features_window.py:67 msgid "Requires Gspell" msgstr "" #: gajim/features_window.py:68 msgid "Automatic status" msgstr "" #: gajim/features_window.py:69 msgid "Ability to measure idle time, in order to set auto status." msgstr "" #: gajim/features_window.py:70 msgid "Requires libxss library." msgstr "" #: gajim/features_window.py:71 msgid "Requires python2.5." msgstr "" #: gajim/features_window.py:72 msgid "End to End message encryption" msgstr "" #: gajim/features_window.py:73 msgid "Encrypting chat messages." msgstr "" #: gajim/features_window.py:74 gajim/features_window.py:75 msgid "Requires python-crypto." msgstr "" #: gajim/features_window.py:76 msgid "RST Generator" msgstr "" #: gajim/features_window.py:77 msgid "" "Generate XHTML output from RST code (see http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." msgstr "" #: gajim/features_window.py:78 gajim/features_window.py:79 msgid "Requires python-docutils." msgstr "" #: gajim/features_window.py:80 gajim/data/gui/preferences_window.ui:2421 msgid "Audio / Video" msgstr "" #: gajim/features_window.py:81 msgid "Ability to start audio and video chat." msgstr "" #: gajim/features_window.py:82 msgid "" "Requires gir1.2-farstream-0.2, gir1.2-gstreamer-1.0, gstreamer1.0-libav and " "gstreamer1.0-plugins-ugly." msgstr "" #: gajim/features_window.py:84 msgid "UPnP-IGD" msgstr "" #: gajim/features_window.py:85 msgid "Ability to request your router to forward port for file transfer." msgstr "" #: gajim/features_window.py:86 msgid "Requires gir1.2-gupnpigd-1.0." msgstr "" #: gajim/features_window.py:94 #, fuzzy msgid "?features:Available" msgstr "?user status:_Disponible" #: gajim/features_window.py:101 msgid "Feature" msgstr "" #: gajim/gtkgui_helpers.py:255 msgid "Error reading file:" msgstr "" #: gajim/gtkgui_helpers.py:258 msgid "Error parsing file:" msgstr "" #: gajim/gtkgui_helpers.py:478 msgid "Extension not supported" msgstr "" #: gajim/gtkgui_helpers.py:479 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "" #: gajim/gtkgui_helpers.py:514 msgid "Save Image as…" msgstr "" #: gajim/vcard.py:166 gajim/vcard.py:513 gajim/profile_window.py:175 #: gajim/chat_control.py:581 msgid "Save _As" msgstr "" #: gajim/vcard.py:289 gajim/vcard.py:296 msgid "?Client:Unknown" msgstr "" #: gajim/vcard.py:293 gajim/vcard.py:298 msgid "?OS:Unknown" msgstr "" #: gajim/vcard.py:327 gajim/vcard.py:330 msgid "?Time:Unknown" msgstr "" #: gajim/vcard.py:381 msgid "?Role in Group Chat:Role:" msgstr "" #: gajim/vcard.py:385 msgid "Affiliation:" msgstr "" #: gajim/vcard.py:392 msgid "" "This contact is interested in your presence information, but you are not " "interested in their presence" msgstr "" #: gajim/vcard.py:394 msgid "" "You are interested in the contact's presence information, but it is not " "mutual" msgstr "" #: gajim/vcard.py:396 msgid "The contact and you want to exchange presence information" msgstr "" #: gajim/vcard.py:398 msgid "" "You and the contact have a mutual disinterest in each-others presence " "information" msgstr "" #: gajim/vcard.py:404 msgid "You are waiting contact's answer about your subscription request" msgstr "" #: gajim/vcard.py:406 msgid "There is no pending subscription request." msgstr "" #: gajim/vcard.py:411 gajim/vcard.py:455 gajim/vcard.py:568 msgid " resource with priority " msgstr "" #: gajim/options_dialog.py:383 gajim/dialogs.py:4806 gajim/dialogs.py:4848 #: gajim/dialogs.py:4896 gajim/dialogs.py:4986 msgid "All files" msgstr "" #: gajim/options_dialog.py:392 #, fuzzy msgid "Clear File" msgstr "Fitxer de Certificat de Client:" #: gajim/options_dialog.py:474 #, fuzzy msgid "Manage Proxies" msgstr "Gestió de perfils de proxy" #: gajim/options_dialog.py:484 gajim/options_dialog.py:552 #: gajim/options_dialog.py:573 gajim/dialogs.py:326 gajim/dialogs.py:328 #: gajim/dialogs.py:536 gajim/dialogs.py:549 gajim/roster_window.py:2997 #: gajim/roster_window.py:3003 gajim/roster_window.py:3008 gajim/config.py:1162 #: gajim/config.py:1177 gajim/config.py:1182 gajim/config.py:1230 #: gajim/config.py:1340 gajim/config.py:2489 gajim/config.py:2566 #: gajim/data/gui/account_creation_wizard_window.ui:22 #: gajim/data/gui/change_mood_dialog.ui:98 msgid "None" msgstr "Cap" #: gajim/options_dialog.py:506 #, fuzzy msgid "Adjust to Status" msgstr "Ajustar a estat" #: gajim/options_dialog.py:518 msgid "On" msgstr "" #: gajim/options_dialog.py:518 #, fuzzy msgid "Off" msgstr "Desconnectat" #: gajim/options_dialog.py:556 msgid "Failed to get secret keys" msgstr "" #: gajim/options_dialog.py:557 msgid "There is no OpenPGP secret key available." msgstr "" #: gajim/options_dialog.py:562 msgid "OpenPGP Key Selection" msgstr "" #: gajim/options_dialog.py:562 msgid "Choose your OpenPGP key" msgstr "" #: gajim/gui_menu_builder.py:100 msgid "_New Group Chat" msgstr "" #: gajim/gui_menu_builder.py:292 gajim/gui_menu_builder.py:416 #: gajim/dialogs.py:1114 gajim/dialogs.py:2333 gajim/dialogs.py:2362 #: gajim/dialogs.py:3867 gajim/chat_control.py:284 gajim/roster_window.py:804 #: gajim/roster_window.py:1753 gajim/roster_window.py:1755 #: gajim/roster_window.py:2068 gajim/roster_window.py:3419 #: gajim/roster_window.py:3446 gajim/gui_interface.py:524 #: gajim/common/contacts.py:154 gajim/common/contacts.py:280 #: gajim/common/helpers.py:95 gajim/common/helpers.py:408 msgid "Not in Roster" msgstr "" #: gajim/gui_menu_builder.py:431 msgid "I would like to add you to my roster" msgstr "" #: gajim/gui_menu_builder.py:508 msgid "Send Single _Message…" msgstr "" #: gajim/gui_menu_builder.py:521 gajim/roster_window.py:5165 #: gajim/data/gui/contact_context_menu.ui:58 msgid "Send Cus_tom Status" msgstr "Envia Estat" #: gajim/gui_menu_builder.py:541 msgid "E_xecute Command…" msgstr "" #: gajim/gui_menu_builder.py:549 msgid "_Manage Transport" msgstr "" #: gajim/gui_menu_builder.py:555 msgid "_Modify Transport" msgstr "" #: gajim/gui_menu_builder.py:562 gajim/roster_window.py:5195 msgid "_Rename…" msgstr "" #: gajim/gui_menu_builder.py:573 gajim/roster_window.py:5212 #: gajim/roster_window.py:5327 gajim/data/gui/blocked_contacts_window.ui:52 #: gajim/data/gui/gc_occupants_menu.ui:148 #: gajim/data/gui/contact_context_menu.ui:166 msgid "_Unblock" msgstr "_Desbloquejar" #: gajim/gui_menu_builder.py:576 gajim/roster_window.py:5217 #: gajim/roster_window.py:5331 gajim/data/gui/gc_occupants_menu.ui:140 #: gajim/data/gui/contact_context_menu.ui:174 msgid "_Block" msgstr "_Bloca" #: gajim/gui_menu_builder.py:584 gajim/roster_window.py:5224 #: gajim/data/gui/contact_context_menu.ui:204 msgid "Remo_ve" msgstr "Esborra" #: gajim/gui_menu_builder.py:594 gajim/data/gui/search_window.ui:98 msgid "_Information" msgstr "" #: gajim/gui_menu_builder.py:611 #, fuzzy msgid "Send File..." msgstr "Envia un _fitxer..." #: gajim/gui_menu_builder.py:615 #, fuzzy msgid "Invite Contacts" msgstr "Convida _Contactes" #: gajim/gui_menu_builder.py:616 #, fuzzy msgid "Add to Roster" msgstr "_Afegeix a llista de contactes" #: gajim/gui_menu_builder.py:617 msgid "Audio Session" msgstr "" #: gajim/gui_menu_builder.py:618 msgid "Video Session" msgstr "" #: gajim/gui_menu_builder.py:619 #, fuzzy msgid "Information" msgstr "Informació personal" #: gajim/gui_menu_builder.py:620 gajim/gui_menu_builder.py:655 #: gajim/data/gui/application_menu.ui:37 msgid "History" msgstr "Historial" #: gajim/gui_menu_builder.py:644 #, fuzzy msgid "Manage Room" msgstr "Gestiona Sala" #: gajim/gui_menu_builder.py:645 #, fuzzy msgid "Change Subject" msgstr "Canvia Tema..." #: gajim/gui_menu_builder.py:646 #, fuzzy msgid "Configure Room" msgstr "Configura Sala..." #: gajim/gui_menu_builder.py:647 #, fuzzy msgid "Destroy Room" msgstr "_Destrueix Sala" #: gajim/gui_menu_builder.py:649 #, fuzzy msgid "Change Nick" msgstr "Canvia _Nick..." #: gajim/gui_menu_builder.py:650 #, fuzzy msgid "Bookmark Room" msgstr "Afegeix aquesta sala a les adreces d'interès" #: gajim/gui_menu_builder.py:651 #, fuzzy msgid "Request Voice" msgstr "Sol.licita Veu" #: gajim/gui_menu_builder.py:652 gajim/data/gui/gc_control_popup_menu.ui:72 msgid "Notify on all messages" msgstr "" #: gajim/gui_menu_builder.py:653 #, fuzzy msgid "Minimize on close" msgstr "_Minimitza en tancar" #: gajim/gui_menu_builder.py:654 gajim/roster_window.py:5397 #, fuzzy msgid "Execute command" msgstr "_Executa Comanda...." #: gajim/gui_menu_builder.py:656 #, fuzzy msgid "Disconnect" msgstr "_Desconnecta" #: gajim/gui_menu_builder.py:685 gajim/gui_menu_builder.py:732 msgid "Join Group Chat" msgstr "Uneix-te al xat en grup" #: gajim/gui_menu_builder.py:731 msgid "Add Contact..." msgstr "" #: gajim/gui_menu_builder.py:733 gajim/accounts_window.py:460 #: gajim/accounts_window.py:555 gajim/accounts_window.py:594 msgid "Profile" msgstr "Perfil" #: gajim/gui_menu_builder.py:734 msgid "Discover Services" msgstr "" #: gajim/gui_menu_builder.py:735 msgid "Send Single Message..." msgstr "" #: gajim/gui_menu_builder.py:736 gajim/data/gui/preferences_window.ui:2846 msgid "Advanced" msgstr "Avançat" #: gajim/gui_menu_builder.py:737 msgid "Archiving Preferences" msgstr "" #: gajim/gui_menu_builder.py:738 gajim/history_sync.py:44 #, fuzzy msgid "Synchronise History" msgstr "Sincronitza els contactes" #: gajim/gui_menu_builder.py:739 gajim/dialogs.py:4583 msgid "Privacy Lists" msgstr "" #: gajim/gui_menu_builder.py:740 gajim/server_info.py:37 #, fuzzy msgid "Server Info" msgstr "Servidor:" #: gajim/gui_menu_builder.py:741 gajim/data/gui/xml_console_window.ui:77 msgid "XML Console" msgstr "" #: gajim/gui_menu_builder.py:743 #, fuzzy msgid "Admin" msgstr "_Administra" #: gajim/gui_menu_builder.py:744 msgid "Send Server Message..." msgstr "" #: gajim/gui_menu_builder.py:745 msgid "Set MOTD..." msgstr "" #: gajim/gui_menu_builder.py:746 msgid "Update MOTD..." msgstr "" #: gajim/gui_menu_builder.py:747 msgid "Delete MOTD..." msgstr "" #: gajim/gui_menu_builder.py:787 msgid "No Accounts available" msgstr "" #: gajim/gui_menu_builder.py:799 gajim/data/gui/accounts_window.ui:78 #: gajim/data/gui/application_menu.ui:5 gajim/data/gui/application_menu.ui:71 #: gajim/data/gui/shortcuts_window.ui:181 msgid "Accounts" msgstr "Comptes" #: gajim/history_manager.py:56 msgid "Usage:" msgstr "" #: gajim/history_manager.py:58 msgid "Options:" msgstr "" #: gajim/history_manager.py:60 msgid "Show this help message and exit" msgstr "" #: gajim/history_manager.py:61 msgid "Choose folder for logfile" msgstr "" #: gajim/history_manager.py:104 msgid "Cannot find history logs database" msgstr "" #: gajim/history_manager.py:144 gajim/history_manager.py:195 #: gajim/dialogs.py:3848 gajim/config.py:1621 gajim/disco.py:872 msgid "JID" msgstr "" #: gajim/history_manager.py:157 gajim/history_manager.py:201 #: gajim/history_window.py:108 msgid "Date" msgstr "" #: gajim/history_manager.py:164 gajim/history_manager.py:220 #: gajim/data/gui/join_groupchat_window.ui:131 msgid "Nickname" msgstr "" #: gajim/history_manager.py:173 gajim/history_manager.py:208 #: gajim/history_window.py:116 gajim/data/gui/xml_console_window.ui:108 msgid "Message" msgstr "" #: gajim/history_manager.py:181 gajim/history_manager.py:214 msgid "Subject" msgstr "" #: gajim/history_manager.py:243 msgid "" "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " "RUNNING)" msgstr "" #: gajim/history_manager.py:245 msgid "" "Normally allocated database size will not be freed, it will just become " "reusable. If you really want to reduce database filesize, click YES, else " "click NO.\n" "\n" "In case you click YES, please wait…" msgstr "" #: gajim/history_manager.py:250 msgid "Database Cleanup" msgstr "" #: gajim/history_manager.py:464 msgid "Exporting History Logs…" msgstr "" #: gajim/history_manager.py:540 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "" #: gajim/history_manager.py:578 #, python-format msgid "Do you wish to delete all correspondence with %(jid)s?" msgstr "" #: gajim/history_manager.py:582 msgid "Do you wish to delete all correspondence with the selected contacts?" msgstr "" #: gajim/history_manager.py:584 msgid "This can not be undone." msgstr "" #: gajim/history_manager.py:586 gajim/history_manager.py:625 msgid "Deletion Confirmation" msgstr "" #: gajim/history_manager.py:620 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "" msgstr[1] "" #: gajim/history_manager.py:623 msgid "This is an irreversible operation." msgstr "" #: gajim/profile_window.py:63 msgid "Retrieving profile…" msgstr "" #: gajim/profile_window.py:128 msgid "Could not load image" msgstr "" #: gajim/profile_window.py:200 msgid "Wrong date format" msgstr "" #: gajim/profile_window.py:201 msgid "Format of the date must be YYYY-MM-DD" msgstr "" #: gajim/profile_window.py:261 msgid "Information received" msgstr "" #: gajim/profile_window.py:334 gajim/dialogs.py:2562 gajim/dialogs.py:2650 #: gajim/dialogs.py:3105 gajim/disco.py:536 gajim/gui_interface.py:1849 #: gajim/dialog_messages.py:32 msgid "You are not connected to the server" msgstr "" #: gajim/profile_window.py:335 msgid "Without a connection, you can not publish your contact information." msgstr "" #: gajim/profile_window.py:349 msgid "Sending profile…" msgstr "" #: gajim/profile_window.py:368 msgid "Information NOT published" msgstr "" #: gajim/profile_window.py:375 msgid "vCard publication failed" msgstr "" #: gajim/profile_window.py:376 msgid "" "There was an error while publishing your personal information, try again " "later." msgstr "" #: gajim/dialogs.py:90 #, python-format msgid "Contact name: %s" msgstr "" #: gajim/dialogs.py:92 #, python-format msgid "JID: %s" msgstr "" #: gajim/dialogs.py:121 gajim/dialogs.py:133 gajim/roster_window.py:2939 #: gajim/roster_window.py:3953 gajim/roster_window.py:5234 #: gajim/accounts_window.py:463 gajim/common/contacts.py:105 #: gajim/common/contacts.py:137 gajim/data/gui/preferences_window.ui:569 #: gajim/data/gui/shortcuts_window.ui:176 msgid "General" msgstr "General" #: gajim/dialogs.py:206 msgid "Group" msgstr "" #: gajim/dialogs.py:213 msgid "In the group" msgstr "" #: gajim/dialogs.py:308 msgid "KeyID" msgstr "" #: gajim/dialogs.py:313 msgid "Contact name" msgstr "" #: gajim/dialogs.py:491 msgid "Set Mood" msgstr "" #: gajim/dialogs.py:611 #, python-format msgid "%s Status Message" msgstr "" #: gajim/dialogs.py:625 msgid "Status Message" msgstr "" #: gajim/dialogs.py:815 msgid "Overwrite Status Message?" msgstr "" #: gajim/dialogs.py:816 msgid "" "This name is already used. Do you want to overwrite this status message?" msgstr "" #: gajim/dialogs.py:824 msgid "Save as Preset Status Message" msgstr "" #: gajim/dialogs.py:825 msgid "Please type a name for this status message" msgstr "" #: gajim/dialogs.py:852 msgid "JID:" msgstr "" #: gajim/dialogs.py:853 msgid "AIM Address:" msgstr "" #: gajim/dialogs.py:854 msgid "GG Number:" msgstr "" #: gajim/dialogs.py:855 msgid "ICQ Number:" msgstr "" #: gajim/dialogs.py:856 msgid "MSN Address:" msgstr "" #: gajim/dialogs.py:857 msgid "Yahoo! Address:" msgstr "" #: gajim/dialogs.py:894 #, fuzzy, python-format msgid "" "Please fill in the data of the contact you want to add to your account " "%s" msgstr "Si us plau ompli les dades del seu compte existent" #: gajim/dialogs.py:897 msgid "Please fill in the data of the contact you want to add" msgstr "" #: gajim/dialogs.py:1089 gajim/dialogs.py:1095 gajim/dialogs.py:1100 msgid "Invalid User ID" msgstr "" #: gajim/dialogs.py:1096 msgid "The user ID must not contain a resource." msgstr "" #: gajim/dialogs.py:1101 msgid "You cannot add yourself to your roster." msgstr "" #: gajim/dialogs.py:1115 msgid "Contact already in roster" msgstr "" #: gajim/dialogs.py:1116 msgid "This contact is already listed in your roster." msgstr "" #: gajim/dialogs.py:1169 gajim/dialogs.py:1203 msgid "User ID:" msgstr "" #: gajim/dialogs.py:1269 msgid "Error while adding transport contact" msgstr "" #: gajim/dialogs.py:1270 #, python-format msgid "" "This error occured while adding a contact for transport %(transport)s:\n" "\n" "%(error)s" msgstr "" #: gajim/dialogs.py:1302 msgid "A GTK+ XMPP client" msgstr "" #: gajim/dialogs.py:1303 #, fuzzy, python-format msgid "GTK+ Version: %s" msgstr "Versió:" #: gajim/dialogs.py:1304 #, python-format msgid "PyGObject Version: %s" msgstr "" #: gajim/dialogs.py:1305 #, python-format msgid "python-nbxmpp Version: %s" msgstr "" #: gajim/dialogs.py:1308 msgid "Current Developers" msgstr "" #: gajim/dialogs.py:1309 msgid "Past Developers" msgstr "" #: gajim/dialogs.py:1310 msgid "Artists" msgstr "" #: gajim/dialogs.py:1314 msgid "Last but not least" msgstr "" #: gajim/dialogs.py:1315 msgid "we would like to thank all the package maintainers." msgstr "" #: gajim/dialogs.py:1316 msgid "Thanks" msgstr "" #: gajim/dialogs.py:1318 msgid "translator-credits" msgstr "" #: gajim/dialogs.py:1503 #, python-format msgid "Dictionary for language \"%s\" not available" msgstr "" #: gajim/dialogs.py:1504 #, python-format msgid "" "You have to install the dictionary \"%s\" to use spellchecking, or choose " "another language by setting the speller_language option.\n" "\n" "Highlighting misspelled words feature will not be used" msgstr "" #: gajim/dialogs.py:1851 gajim/dialogs.py:1866 gajim/gui_interface.py:1511 #: gajim/gui_interface.py:1553 msgid "Insecure connection" msgstr "" #: gajim/dialogs.py:1852 #, python-format msgid "" "You are about to connect to the account %(account)s (%(server)s) insecurely. " "This means conversations will not be encrypted, and is strongly " "discouraged.\n" "Are you sure you want to do that?" msgstr "" #: gajim/dialogs.py:1857 gajim/gui_interface.py:1515 #: gajim/gui_interface.py:1556 msgid "Yes, I really want to connect insecurely" msgstr "" #: gajim/dialogs.py:1858 msgid "Gajim will NOT connect unless you check this box" msgstr "" #: gajim/dialogs.py:1859 gajim/groupchat_control.py:2335 #: gajim/roster_window.py:2897 gajim/roster_window.py:3529 #: gajim/roster_window.py:4282 gajim/message_window.py:247 #: gajim/gui_interface.py:725 gajim/gui_interface.py:1516 #: gajim/gui_interface.py:1557 msgid "_Do not ask me again" msgstr "" #: gajim/dialogs.py:1957 msgid "_Resume" msgstr "" #: gajim/dialogs.py:1965 msgid "Re_place" msgstr "" #: gajim/dialogs.py:2168 gajim/config.py:2169 #: gajim/command_system/implementation/standard.py:261 msgid "Invalid nickname" msgstr "" #: gajim/dialogs.py:2169 msgid "The nickname contains invalid characters." msgstr "" #: gajim/dialogs.py:2291 msgid "Subscription Request" msgstr "" #: gajim/dialogs.py:2300 #, python-format msgid "Subscription request for account %(account)s from %(jid)s" msgstr "" #: gajim/dialogs.py:2303 #, python-format msgid "Subscription request from %s" msgstr "" #: gajim/dialogs.py:2375 gajim/data/gui/join_groupchat_window.ui:312 #, fuzzy msgid "Join Groupchat" msgstr "Uneix-te al xat en grup" #: gajim/dialogs.py:2531 #, fuzzy msgid "Invalid Room" msgstr "Gestiona Sala" #: gajim/dialogs.py:2532 msgid "Please choose a room" msgstr "" #: gajim/dialogs.py:2544 gajim/dialogs.py:2551 msgid "Invalid Nickname" msgstr "" #: gajim/dialogs.py:2545 msgid "Please choose a nickname" msgstr "" #: gajim/dialogs.py:2557 gajim/dialogs.py:3516 gajim/config.py:2453 #: gajim/dialog_messages.py:37 gajim/dialog_messages.py:42 msgid "Invalid JID" msgstr "" #: gajim/dialogs.py:2563 gajim/gui_interface.py:1850 msgid "You can not join a group chat unless you are connected." msgstr "" #: gajim/dialogs.py:2617 gajim/dialogs.py:2628 msgid "Wrong server" msgstr "" #: gajim/dialogs.py:2618 gajim/dialogs.py:2629 #, python-format msgid "%s is not a groupchat server" msgstr "" #: gajim/dialogs.py:2651 msgid "Without a connection, you can not synchronise your contacts." msgstr "" #: gajim/dialogs.py:2662 gajim/dialogs.py:2733 gajim/dialogs.py:3851 #: gajim/history_window.py:100 gajim/disco.py:865 gajim/disco.py:1693 #: gajim/disco.py:1978 msgid "Name" msgstr "" #: gajim/dialogs.py:2665 gajim/data/gui/join_groupchat_window.ui:214 msgid "Server" msgstr "" #: gajim/dialogs.py:2701 msgid "This account is not connected to the server" msgstr "" #: gajim/dialogs.py:2702 msgid "You cannot synchronize with an account unless it is connected." msgstr "" #: gajim/dialogs.py:2731 msgid "Synchronise" msgstr "" #: gajim/dialogs.py:2794 msgid "Start new Conversation" msgstr "" #: gajim/dialogs.py:3052 #, fuzzy msgid "New Groupchat" msgstr "Grups de xat" #: gajim/dialogs.py:3054 #, fuzzy msgid "New Contact" msgstr "Afegeix un contacte nou" #: gajim/dialogs.py:3106 msgid "Without a connection, you can not change your password." msgstr "" #: gajim/dialogs.py:3126 msgid "Invalid password" msgstr "" #: gajim/dialogs.py:3126 msgid "You must enter a password." msgstr "" #: gajim/dialogs.py:3130 msgid "Passwords do not match" msgstr "" #: gajim/dialogs.py:3131 msgid "The passwords typed in both fields must be identical." msgstr "" #: gajim/dialogs.py:3169 gajim/notify.py:91 #: gajim/common/connection_handlers_events.py:2821 msgid "Contact Signed In" msgstr "El Contacte ha entrat" #: gajim/dialogs.py:3171 gajim/notify.py:91 #: gajim/common/connection_handlers_events.py:2827 msgid "Contact Signed Out" msgstr "" #: gajim/dialogs.py:3173 gajim/notify.py:92 gajim/notify.py:105 #: gajim/common/connection_handlers_events.py:2641 msgid "New Message" msgstr "" #: gajim/dialogs.py:3173 gajim/notify.py:92 gajim/notify.py:105 #: gajim/common/connection_handlers_events.py:2623 msgid "New Single Message" msgstr "" #: gajim/dialogs.py:3174 gajim/notify.py:92 gajim/notify.py:106 #: gajim/common/connection_handlers_events.py:2629 msgid "New Private Message" msgstr "" #: gajim/dialogs.py:3174 msgid "New E-mail" msgstr "" #: gajim/dialogs.py:3176 gajim/gui_interface.py:926 gajim/notify.py:93 msgid "File Transfer Request" msgstr "" #: gajim/dialogs.py:3178 gajim/gui_interface.py:861 gajim/gui_interface.py:891 #: gajim/notify.py:94 msgid "File Transfer Error" msgstr "" #: gajim/dialogs.py:3180 gajim/gui_interface.py:1030 #: gajim/gui_interface.py:1059 gajim/gui_interface.py:1080 gajim/notify.py:94 msgid "File Transfer Completed" msgstr "" #: gajim/dialogs.py:3181 gajim/gui_interface.py:1034 #: gajim/gui_interface.py:1063 gajim/gui_interface.py:1084 gajim/notify.py:95 msgid "File Transfer Stopped" msgstr "" #: gajim/dialogs.py:3183 gajim/dialogs.py:4748 gajim/chat_control.py:1647 #: gajim/gui_interface.py:663 gajim/notify.py:95 msgid "Groupchat Invitation" msgstr "" #: gajim/dialogs.py:3185 gajim/notify.py:93 #: gajim/common/connection_handlers_events.py:2815 msgid "Contact Changed Status" msgstr "" #: gajim/dialogs.py:3404 #, python-format msgid "Single Message using account %s" msgstr "" #: gajim/dialogs.py:3406 #, python-format msgid "Single Message in account %s" msgstr "" #: gajim/dialogs.py:3408 msgid "Single Message" msgstr "" #: gajim/dialogs.py:3411 #, python-format msgid "Send %s" msgstr "" #: gajim/dialogs.py:3434 #, python-format msgid "Received %s" msgstr "" #: gajim/dialogs.py:3457 #, python-format msgid "Form %s" msgstr "" #: gajim/dialogs.py:3485 gajim/dialogs.py:3672 msgid "Connection not available" msgstr "" #: gajim/dialogs.py:3486 gajim/dialogs.py:3673 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "" #: gajim/dialogs.py:3517 gajim/dialog_messages.py:43 #, python-format msgid "It is not possible to send a message to %s, this JID is not valid." msgstr "" #: gajim/dialogs.py:3540 #, python-format msgid "RE: %s" msgstr "" #: gajim/dialogs.py:3541 #, python-format msgid "%s wrote:\n" msgstr "" #: gajim/dialogs.py:3589 gajim/data/gui/shortcuts_window.ui:113 msgid "Clear" msgstr "" #: gajim/dialogs.py:3594 #, fuzzy msgid "Filter" msgstr "Filtra:" #: gajim/dialogs.py:3599 msgid "XML Input" msgstr "" #: gajim/dialogs.py:3603 #, fuzzy msgid "Send" msgstr "Envia" #: gajim/dialogs.py:3794 msgid "add" msgstr "" #: gajim/dialogs.py:3794 msgid "modify" msgstr "" #: gajim/dialogs.py:3795 msgid "remove" msgstr "" #: gajim/dialogs.py:3824 #, python-format msgid "" "%(jid)s would like you to %(action)s some contacts in your " "roster." msgstr "" #: gajim/dialogs.py:3840 gajim/dialogs.py:3886 gajim/accounts_window.py:44 msgid "Add" msgstr "Afegeix" #: gajim/dialogs.py:3842 gajim/dialogs.py:3917 msgid "Modify" msgstr "" #: gajim/dialogs.py:3844 gajim/dialogs.py:3941 msgid "Delete" msgstr "Suprimeix" #: gajim/dialogs.py:3854 msgid "Groups" msgstr "" #: gajim/dialogs.py:3962 #, python-format msgid "%s suggested me to add you in my roster." msgstr "" #: gajim/dialogs.py:3976 #, python-format msgid "Added %d contact" msgid_plural "Added %d contacts" msgstr[0] "" msgstr[1] "" #: gajim/dialogs.py:4014 #, python-format msgid "Removed %d contact" msgid_plural "Removed %d contacts" msgstr[0] "" msgstr[1] "" #: gajim/dialogs.py:4040 #, python-format msgid "Archiving Preferences for %s" msgstr "" #: gajim/dialogs.py:4078 msgid "Success!" msgstr "" #: gajim/dialogs.py:4078 msgid "Your Archiving Preferences have been saved!" msgstr "" #: gajim/dialogs.py:4094 msgid "We got no response from the Server" msgstr "" #: gajim/dialogs.py:4096 msgid "We received an error: {}" msgstr "" #: gajim/dialogs.py:4100 msgid "Error!" msgstr "" #: gajim/dialogs.py:4159 msgid "Add JID" msgstr "" #: gajim/dialogs.py:4232 #, python-format msgid "Privacy List %s" msgstr "" #: gajim/dialogs.py:4236 #, python-format msgid "Privacy List for %s" msgstr "" #: gajim/dialogs.py:4238 gajim/data/gui/privacy_list_window.ui:47 msgid "Privacy List" msgstr "" #: gajim/dialogs.py:4309 #, python-format msgid "Order: %(order)s, action: %(action)s, type: %(type)s, value: %(value)s" msgstr "" #: gajim/dialogs.py:4314 #, python-format msgid "Order: %(order)s, action: %(action)s" msgstr "" #: gajim/dialogs.py:4368 msgid "Edit a rule" msgstr "" #: gajim/dialogs.py:4480 msgid "Add a rule" msgstr "" #: gajim/dialogs.py:4581 #, python-format msgid "Privacy Lists for %s" msgstr "" #: gajim/dialogs.py:4677 msgid "Invalid List Name" msgstr "" #: gajim/dialogs.py:4678 msgid "You must enter a name to create a privacy list." msgstr "" #: gajim/dialogs.py:4714 msgid "You are invited to a groupchat" msgstr "" #: gajim/dialogs.py:4717 msgid "$Contact has invited you to join a discussion" msgstr "" #: gajim/dialogs.py:4719 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "" #: gajim/dialogs.py:4728 #, python-format msgid "Comment: %s" msgstr "" #: gajim/dialogs.py:4730 msgid "Do you want to accept the invitation?" msgstr "" #: gajim/dialogs.py:4746 msgid "Reason (if you decline):" msgstr "" #: gajim/dialogs.py:4795 msgid "Choose Client Cert #PCKS12" msgstr "" #: gajim/dialogs.py:4811 gajim/accounts_window.py:657 msgid "PKCS12 Files" msgstr "" #: gajim/dialogs.py:4837 msgid "Choose Sound" msgstr "" #: gajim/dialogs.py:4853 msgid "Wav Sounds" msgstr "" #: gajim/dialogs.py:4883 msgid "Choose Image" msgstr "" #: gajim/dialogs.py:4901 msgid "Images" msgstr "" #: gajim/dialogs.py:4972 msgid "Choose Archive" msgstr "" #: gajim/dialogs.py:4991 msgid "Zip files" msgstr "" #: gajim/dialogs.py:5017 #, python-format msgid "When %s becomes:" msgstr "" #: gajim/dialogs.py:5019 #, python-format msgid "Adding Special Notification for %s" msgstr "" #: gajim/dialogs.py:5259 msgid "an audio and video" msgstr "" #: gajim/dialogs.py:5261 msgid "an audio" msgstr "" #: gajim/dialogs.py:5263 msgid "a video" msgstr "" #: gajim/dialogs.py:5267 #, python-format msgid "" "%(contact)s wants to start %(type)s session with you. Do you want to answer " "the call?" msgstr "" #: gajim/dialogs.py:5372 gajim/dialogs.py:5408 #, python-format msgid "Certificate for account %s" msgstr "" #: gajim/dialogs.py:5372 #, python-format msgid "" "Issued to:\n" "Common Name (CN): %(scn)s\n" "Organization (O): %(sorg)s\n" "Organizationl Unit (OU): %(sou)s\n" "Serial Number: %(sn)s\n" "\n" "Issued by:\n" "Common Name (CN): %(icn)s\n" "Organization (O): %(iorg)s\n" "Organizationl Unit (OU): %(iou)s\n" "\n" "Validity:\n" "Issued on: %(io)s\n" "Expires on: %(eo)s\n" "\n" "Fingerprint\n" "SHA-1 Fingerprint: %(sha1)s\n" "\n" "SHA256 Fingerprint: %(sha256)s\n" msgstr "" #: gajim/dialogs.py:5419 gajim/gui_interface.py:1405 #, python-format msgid "SSL Certificate Verification for %s" msgstr "" #: gajim/dialogs.py:5420 gajim/dialogs.py:5437 msgid "View cert…" msgstr "" #: gajim/dialogs.py:5453 gajim/data/gui/application_menu.ui:32 msgid "File Transfer" msgstr "Transferència de Fitxers" #: gajim/dialogs.py:5477 msgid "Requesting HTTP Upload Slot..." msgstr "" #: gajim/dialogs.py:5481 msgid "Uploading file via HTTP File Upload..." msgstr "" #: gajim/dialogs.py:5485 msgid "Encrypting file..." msgstr "" #: gajim/groupchat_control.py:193 gajim/groupchat_control.py:1839 #, python-format msgid "%(nick)s is now known as %(new_nick)s" msgstr "" #: gajim/groupchat_control.py:219 gajim/groupchat_control.py:1988 #: gajim/history_window.py:550 gajim/common/connection_handlers_events.py:2811 #, python-format msgid "%(nick)s is now %(status)s" msgstr "" #: gajim/groupchat_control.py:248 msgid "Sending private message failed" msgstr "" #: gajim/groupchat_control.py:250 #, python-format msgid "You are no longer in group chat \"%(room)s\" or \"%(nick)s\" has left." msgstr "" #: gajim/groupchat_control.py:640 gajim/chat_control.py:326 #: gajim/chat_control.py:330 msgid "HTTP File Upload" msgstr "" #: gajim/groupchat_control.py:642 msgid "HTTP File Upload not supported by your server" msgstr "" #: gajim/groupchat_control.py:662 gajim/groupchat_control.py:2370 msgid "Changing Subject" msgstr "" #: gajim/groupchat_control.py:663 gajim/groupchat_control.py:2371 msgid "Please specify the new subject:" msgstr "" #: gajim/groupchat_control.py:670 msgid "Changing Nickname" msgstr "" #: gajim/groupchat_control.py:671 msgid "Please specify the new nickname you want to use:" msgstr "" #: gajim/groupchat_control.py:688 msgid "Invalid group chat JID" msgstr "" #: gajim/groupchat_control.py:689 msgid "The group chat JID has not allowed characters." msgstr "" #: gajim/groupchat_control.py:699 #, python-format msgid "Destroying %s" msgstr "" #: gajim/groupchat_control.py:700 msgid "" "You are going to remove this room permanently.\n" "You may specify a reason below:" msgstr "" #: gajim/groupchat_control.py:702 msgid "You may also enter an alternate venue:" msgstr "" #: gajim/groupchat_control.py:880 msgid "Insert Nickname" msgstr "" #: gajim/groupchat_control.py:1062 gajim/chat_control.py:803 msgid "and authenticated" msgstr "" #: gajim/groupchat_control.py:1066 gajim/chat_control.py:807 msgid "and NOT authenticated" msgstr "" #: gajim/groupchat_control.py:1070 gajim/chat_control.py:811 #, python-format msgid "%(type)s encryption is active %(authenticated)s." msgstr "" #: gajim/groupchat_control.py:1113 msgid "Conversation with " msgstr "" #: gajim/groupchat_control.py:1115 msgid "Continued conversation" msgstr "" #: gajim/groupchat_control.py:1473 #, python-format msgid "%(nick)s has set the subject to %(subject)s" msgstr "" #: gajim/groupchat_control.py:1496 gajim/groupchat_control.py:1781 msgid "Any occupant is allowed to see your full JID" msgstr "Qualsevol membre pot veure el teu JID" #: gajim/groupchat_control.py:1499 msgid "Room now shows unavailable members" msgstr "" #: gajim/groupchat_control.py:1501 msgid "Room now does not show unavailable members" msgstr "" #: gajim/groupchat_control.py:1503 msgid "A setting not related to privacy has been changed" msgstr "" #: gajim/groupchat_control.py:1507 msgid "Room logging is now enabled" msgstr "" #: gajim/groupchat_control.py:1509 msgid "Room logging is now disabled" msgstr "" #: gajim/groupchat_control.py:1511 msgid "Room is now non-anonymous" msgstr "" #: gajim/groupchat_control.py:1514 msgid "Room is now semi-anonymous" msgstr "" #: gajim/groupchat_control.py:1517 msgid "Room is now fully anonymous" msgstr "" #: gajim/groupchat_control.py:1557 gajim/chat_control.py:1268 #, python-format msgid "Pong! (%s s.)" msgstr "" #: gajim/groupchat_control.py:1774 gajim/groupchat_control.py:2398 #: gajim/roster_window.py:3129 gajim/gui_interface.py:621 #, python-format msgid "%(jid)s has been invited in this room" msgstr "" #: gajim/groupchat_control.py:1786 msgid "Room logging is enabled" msgstr "" #: gajim/groupchat_control.py:1788 msgid "A new room has been created" msgstr "" #: gajim/groupchat_control.py:1791 msgid "The server has assigned or modified your roomnick" msgstr "" #: gajim/groupchat_control.py:1797 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "" #: gajim/groupchat_control.py:1800 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "" #: gajim/groupchat_control.py:1809 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "" #: gajim/groupchat_control.py:1812 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "" #: gajim/groupchat_control.py:1823 gajim/groupchat_control.py:1907 #, python-format msgid "You are now known as %s" msgstr "" #: gajim/groupchat_control.py:1861 gajim/groupchat_control.py:1866 #: gajim/groupchat_control.py:1872 #, python-format msgid "%(nick)s has been removed from the room (%(reason)s)" msgstr "" #: gajim/groupchat_control.py:1863 msgid "affiliation changed" msgstr "" #: gajim/groupchat_control.py:1868 msgid "room configuration changed to members-only" msgstr "" #: gajim/groupchat_control.py:1874 msgid "system shutdown" msgstr "" #: gajim/groupchat_control.py:1928 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s by %(actor)s" msgstr "" #: gajim/groupchat_control.py:1932 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s" msgstr "" #: gajim/groupchat_control.py:1947 #, python-format msgid "** Role of %(nick)s has been set to %(role)s by %(actor)s" msgstr "" #: gajim/groupchat_control.py:1951 #, python-format msgid "** Role of %(nick)s has been set to %(role)s" msgstr "" #: gajim/groupchat_control.py:1981 #, python-format msgid "%s has left" msgstr "" #: gajim/groupchat_control.py:1986 #, python-format msgid "%s has joined the group chat" msgstr "" #: gajim/groupchat_control.py:2329 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "" #: gajim/groupchat_control.py:2331 msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "" #: gajim/groupchat_control.py:2550 #, python-format msgid "Kicking %s" msgstr "" #: gajim/groupchat_control.py:2551 gajim/groupchat_control.py:2847 msgid "You may specify a reason below:" msgstr "" #: gajim/groupchat_control.py:2846 #, python-format msgid "Banning %s" msgstr "" #: gajim/chat_control.py:328 gajim/chat_control.py:332 #, fuzzy msgid "Jingle File Transfer" msgstr "Transferència de Fitxers" #: gajim/chat_control.py:334 #, fuzzy msgid "No File Transfer available" msgstr "Transferència de Fitxers" #: gajim/chat_control.py:395 msgid "Show a list of formattings" msgstr "Mostra una llista de formats" #: gajim/chat_control.py:399 msgid "Formatting is not available so long as GPG is active" msgstr "" #: gajim/chat_control.py:402 msgid "This contact does not support HTML" msgstr "" #: gajim/chat_control.py:514 #, python-format msgid "%(type)s state : %(state)s, reason: %(reason)s" msgstr "" #: gajim/chat_control.py:655 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "" #: gajim/chat_control.py:903 msgid "Session negotiation cancelled" msgstr "" #: gajim/chat_control.py:913 msgid "This session WILL be archived on server" msgstr "" #: gajim/chat_control.py:915 msgid "This session WILL NOT be archived on server" msgstr "" #: gajim/chat_control.py:924 msgid "This session is encrypted" msgstr "" #: gajim/chat_control.py:927 msgid " and WILL be logged" msgstr "" #: gajim/chat_control.py:929 msgid " and WILL NOT be logged" msgstr "" #: gajim/chat_control.py:934 msgid "" "Remote contact's identity not verified. Click the shield button for more " "details." msgstr "" #: gajim/chat_control.py:936 msgid "E2E encryption disabled" msgstr "" #: gajim/chat_control.py:1235 #, python-format msgid "You just received a new message from \"%s\"" msgstr "" #: gajim/chat_control.py:1237 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." msgstr "" #: gajim/chat_control.py:1380 #, python-format msgid "" "Subject: %(subject)s\n" "%(message)s" msgstr "" #: gajim/chat_control.py:1494 gajim/gui_interface.py:1197 #, python-format msgid "" "Unable to decrypt message from %s\n" "It may have been tampered with." msgstr "" #: gajim/chat_control.py:1532 #, python-format msgid "%(name)s is now %(status)s" msgstr "" #: gajim/chat_control.py:1591 msgid "File transfer" msgstr "" #: gajim/chat_control.py:1594 msgid "Size" msgstr "" #: gajim/chat_control.py:1596 msgid "Accept" msgstr "" #: gajim/chat_control.py:1650 gajim/disco.py:1753 msgid "_Join" msgstr "_Entra-hi" #: gajim/chat_control.py:1669 gajim/roster_window.py:1991 #: gajim/gui_interface.py:1013 msgid "Remote contact stopped transfer" msgstr "" #: gajim/chat_control.py:1671 gajim/roster_window.py:1993 #: gajim/gui_interface.py:1016 msgid "Error opening file" msgstr "" #: gajim/roster_window.py:273 gajim/roster_window.py:1074 msgid "Merged accounts" msgstr "" #: gajim/roster_window.py:857 gajim/roster_window.py:1757 #: gajim/roster_window.py:1759 gajim/roster_window.py:2602 #: gajim/roster_window.py:5125 gajim/message_window.py:519 #: gajim/common/contacts.py:133 gajim/common/commands.py:230 #: gajim/common/helpers.py:95 msgid "Groupchats" msgstr "Grups de xat" #: gajim/roster_window.py:896 gajim/roster_window.py:1665 #: gajim/roster_window.py:1698 gajim/roster_window.py:1749 #: gajim/roster_window.py:1751 gajim/roster_window.py:1912 #: gajim/roster_window.py:2575 gajim/roster_window.py:5155 gajim/disco.py:130 #: gajim/disco.py:131 gajim/disco.py:1460 gajim/common/contacts.py:135 #: gajim/common/contacts.py:378 gajim/common/helpers.py:95 msgid "Transports" msgstr "" #: gajim/roster_window.py:2045 msgid "Authorization sent" msgstr "" #: gajim/roster_window.py:2046 #, python-format msgid "\"%s\" will now see your status." msgstr "" #: gajim/roster_window.py:2069 msgid "Subscription request has been sent" msgstr "" #: gajim/roster_window.py:2070 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "" #: gajim/roster_window.py:2084 msgid "Authorization removed" msgstr "" #: gajim/roster_window.py:2085 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "" #: gajim/roster_window.py:2109 msgid "OpenPGP is not usable" msgstr "" #: gajim/roster_window.py:2110 #, python-format msgid "" "Gajim needs python-gnupg >= 0.3.8\n" "Beware there is an incompatible python package called gnupg.\n" "You will be connected to %s without OpenPGP." msgstr "" #: gajim/roster_window.py:2318 gajim/roster_window.py:3625 msgid "You are participating in one or more group chats" msgstr "" #: gajim/roster_window.py:2319 gajim/roster_window.py:3626 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" msgstr "" #: gajim/roster_window.py:2346 msgid "desync'ed" msgstr "" #: gajim/roster_window.py:2416 msgid "Really quit Gajim?" msgstr "" #: gajim/roster_window.py:2417 msgid "Are you sure you want to quit Gajim?" msgstr "" #: gajim/roster_window.py:2418 msgid "Always close Gajim" msgstr "" #: gajim/roster_window.py:2505 msgid "You have running file transfers" msgstr "" #: gajim/roster_window.py:2506 msgid "" "If you quit now, the file(s) being transferred will be stopped. Do you still " "want to quit?" msgstr "" #: gajim/roster_window.py:2537 gajim/roster_window.py:2828 msgid "You have unread messages" msgstr "" #: gajim/roster_window.py:2538 msgid "" "Messages will only be available for reading them later if you have history " "enabled and contact is in your roster." msgstr "" #: gajim/roster_window.py:2829 msgid "You must read them before removing this transport." msgstr "" #: gajim/roster_window.py:2832 #, python-format msgid "Transport \"%s\" will be removed" msgstr "" #: gajim/roster_window.py:2833 msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." msgstr "" #: gajim/roster_window.py:2836 msgid "Transports will be removed" msgstr "" #: gajim/roster_window.py:2841 #, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " "these transports: %s" msgstr "" #: gajim/roster_window.py:2892 msgid "You are about to block a contact. Are you sure you want to continue?" msgstr "" #: gajim/roster_window.py:2894 msgid "" "This contact will see you offline and you will not receive messages it sends " "you." msgstr "" #: gajim/roster_window.py:2934 msgid "Rename Contact" msgstr "" #: gajim/roster_window.py:2935 #, python-format msgid "Enter a new nickname for contact %s" msgstr "" #: gajim/roster_window.py:2942 msgid "Rename Group" msgstr "" #: gajim/roster_window.py:2943 #, python-format msgid "Enter a new name for group %s" msgstr "" #: gajim/roster_window.py:2988 msgid "Remove Group" msgstr "" #: gajim/roster_window.py:2989 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "" #: gajim/roster_window.py:2990 msgid "Also remove all contacts in this group from your roster" msgstr "" #: gajim/roster_window.py:3029 msgid "Assign OpenPGP Key" msgstr "" #: gajim/roster_window.py:3030 msgid "Select a key to apply to the contact" msgstr "" #: gajim/roster_window.py:3436 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "" #: gajim/roster_window.py:3438 #, python-format msgid "You are about to remove \"%(name)s\" (%(jid)s) from your roster.\n" msgstr "" #: gajim/roster_window.py:3443 msgid "" "By removing this contact you also remove authorization resulting in them " "always seeing you as offline." msgstr "" #: gajim/roster_window.py:3449 msgid "Do you want to continue?" msgstr "" #: gajim/roster_window.py:3453 msgid "" "By removing this contact you also by default remove authorization resulting " "in them always seeing you as offline." msgstr "" #: gajim/roster_window.py:3456 msgid "I want this contact to know my status after removal" msgstr "" #: gajim/roster_window.py:3460 msgid "Contacts will be removed from your roster" msgstr "" #: gajim/roster_window.py:3465 #, python-format msgid "" "By removing these contacts:%s\n" "you also remove authorization resulting in them always seeing you as offline." msgstr "" #: gajim/roster_window.py:3523 msgid "" "You are about to send a custom status. Are you sure you want to continue?" msgstr "" #: gajim/roster_window.py:3525 #, python-format msgid "" "This contact will temporarily see you as %(status)s, but only until you " "change your status. Then they will see your global status." msgstr "" #: gajim/roster_window.py:3544 msgid "No account available" msgstr "" #: gajim/roster_window.py:3545 msgid "You must create an account before you can chat with other contacts." msgstr "" #: gajim/roster_window.py:3676 gajim/gui_interface.py:2065 #: gajim/dialog_messages.py:64 msgid "You cannot join a group chat while you are invisible" msgstr "" #: gajim/roster_window.py:4178 msgid "Metacontacts storage not supported by your server" msgstr "" #: gajim/roster_window.py:4180 msgid "" "Your server does not support storing metacontacts information. So this " "information will not be saved on next reconnection." msgstr "" #: gajim/roster_window.py:4276 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "" #: gajim/roster_window.py:4278 msgid "" "Metacontacts are a way to regroup several contacts in one line. Generally it " "is used when the same person has several XMPP accounts or transport accounts." msgstr "" #: gajim/roster_window.py:4400 msgid "Invalid file URI:" msgstr "" #: gajim/roster_window.py:4412 #, python-format msgid "Do you want to send this file to %s:" msgid_plural "Do you want to send these files to %s:" msgstr[0] "" msgstr[1] "" #: gajim/roster_window.py:4552 #, python-format msgid "Send %(from)s to %(to)s" msgstr "" #: gajim/roster_window.py:4565 #, python-format msgid "Make %s first contact" msgstr "" #: gajim/roster_window.py:4570 #, python-format msgid "Make %(contact1)s and %(contact2)s metacontacts" msgstr "" #: gajim/roster_window.py:4951 gajim/roster_window.py:5049 msgid "_Change Status Message" msgstr "_Canvia Missatge d'Estat" #: gajim/roster_window.py:4971 msgid "Publish Tune" msgstr "" #: gajim/roster_window.py:4982 msgid "Publish Location" msgstr "" #: gajim/roster_window.py:4994 msgid "Configure Services…" msgstr "" #: gajim/roster_window.py:5127 msgid "_Maximize All" msgstr "" #: gajim/roster_window.py:5134 gajim/roster_window.py:5296 msgid "Send Group M_essage" msgstr "" #: gajim/roster_window.py:5141 msgid "To all users" msgstr "" #: gajim/roster_window.py:5145 msgid "To all online users" msgstr "" #: gajim/roster_window.py:5157 gajim/roster_window.py:5302 #: gajim/data/gui/gc_occupants_menu.ui:110 #: gajim/data/gui/contact_context_menu.ui:36 msgid "In_vite to" msgstr "Con_vida a" #: gajim/roster_window.py:5312 msgid "_Manage Contacts" msgstr "" #: gajim/roster_window.py:5318 msgid "Edit _Groups…" msgstr "" #: gajim/roster_window.py:5339 gajim/data/gui/filetransfers.ui:11 #: gajim/data/gui/remove_account_window.ui:137 msgid "_Remove" msgstr "" #: gajim/roster_window.py:5377 msgid "_Maximize" msgstr "" #: gajim/roster_window.py:5384 msgid "_Reconnect" msgstr "" #: gajim/roster_window.py:5389 gajim/data/gui/gc_control_popup_menu.ui:120 msgid "_Disconnect" msgstr "_Desconnecta" #: gajim/roster_window.py:5405 gajim/data/gui/gc_occupants_menu.ui:170 #: gajim/data/gui/gc_control_popup_menu.ui:113 #: gajim/data/gui/contact_context_menu.ui:228 msgid "_History" msgstr "_Historial" #: gajim/roster_window.py:5481 gajim/data/gui/application_menu.ui:86 msgid "History Manager" msgstr "Gestor d'Històric" #: gajim/roster_window.py:5489 msgid "_Join New Group Chat" msgstr "" #: gajim/gajim.py:74 msgid "Show the application's version" msgstr "" #: gajim/gajim.py:77 msgid "Show only critical errors" msgstr "" #: gajim/gajim.py:80 msgid "Separate profile files completely (even history db and plugins)" msgstr "" #: gajim/gajim.py:84 msgid "Print XML stanzas and other debug information" msgstr "" #: gajim/gajim.py:88 msgid "Use defined profile in configuration directory" msgstr "" #: gajim/gajim.py:92 msgid "Set configuration directory" msgstr "" #: gajim/gajim.py:95 msgid "Configure logging system" msgstr "" #: gajim/gajim.py:98 msgid "Show all warnings" msgstr "" #: gajim/gajim.py:101 msgid "Open IPython shell" msgstr "" #: gajim/gajim.py:104 msgid "Pops up a window with the next pending event" msgstr "" #: gajim/gajim.py:107 gajim/data/gui/shortcuts_window.ui:202 msgid "Start a new chat" msgstr "" #: gajim/gajim.py:180 gajim/gui_interface.py:128 msgid "Database Error" msgstr "" #: gajim/history_sync.py:217 msgid "How far back do you want to go?" msgstr "" #: gajim/history_sync.py:222 msgid "One Month" msgstr "" #: gajim/history_sync.py:223 msgid "Three Months" msgstr "" #: gajim/history_sync.py:224 msgid "One Year" msgstr "" #: gajim/history_sync.py:225 msgid "Everything" msgstr "" #: gajim/history_sync.py:254 #, fuzzy msgid "Connecting..." msgstr "Connexió" #: gajim/history_sync.py:266 #, python-format msgid "%(received)s of %(max)s" msgstr "" #: gajim/history_sync.py:270 #, python-format msgid "Downloaded %s Messages" msgstr "" #: gajim/history_sync.py:290 #, python-brace-format msgid "" "\n" " Finshed synchronising your History.\n" " {received} Messages downloaded.\n" " " msgstr "" #: gajim/history_sync.py:297 msgid "" "\n" " Gajim is fully synchronised\n" " with the Archive.\n" " " msgstr "" #: gajim/history_sync.py:304 msgid "" "\n" " There is already a synchronisation in\n" " progress. Please try later.\n" " " msgstr "" #: gajim/config.py:150 gajim/config.py:156 gajim/config.py:616 #: gajim/data/gui/preferences_window.ui:68 #: gajim/data/gui/preferences_window.ui:85 msgid "Disabled" msgstr "Inhabilitat" #: gajim/config.py:411 gajim/config.py:415 gajim/config.py:1942 msgid "Default" msgstr "" #: gajim/config.py:1128 msgid "status message title" msgstr "" #: gajim/config.py:1129 msgid "status message text" msgstr "" #: gajim/config.py:1517 #, python-format msgid "Edit %s" msgstr "" #: gajim/config.py:1519 #, python-format msgid "Register to %s" msgstr "" #: gajim/config.py:1555 msgid "Ban List" msgstr "" #: gajim/config.py:1556 msgid "Member List" msgstr "" #: gajim/config.py:1556 msgid "Owner List" msgstr "" #: gajim/config.py:1557 msgid "Administrator List" msgstr "" #: gajim/config.py:1631 msgid "Reason" msgstr "" #: gajim/config.py:1638 msgid "Nick" msgstr "" #: gajim/config.py:1644 msgid "Role" msgstr "" #: gajim/config.py:1670 msgid "Banning…" msgstr "" #: gajim/config.py:1672 msgid "" "Whom do you want to ban?\n" "\n" msgstr "" #: gajim/config.py:1674 msgid "Adding Member…" msgstr "" #: gajim/config.py:1675 msgid "" "Whom do you want to make a member?\n" "\n" msgstr "" #: gajim/config.py:1677 msgid "Adding Owner…" msgstr "" #: gajim/config.py:1678 msgid "" "Whom do you want to make an owner?\n" "\n" msgstr "" #: gajim/config.py:1680 msgid "Adding Administrator…" msgstr "" #: gajim/config.py:1681 msgid "" "Whom do you want to make an administrator?\n" "\n" msgstr "" #: gajim/config.py:1682 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" "2. user@domain (any resource matches).\n" "3. domain/resource (only that resource matches).\n" "4. domain (the domain itself matches, as does any user@domain,\n" "domain/resource, or address containing a subdomain)." msgstr "" #: gajim/config.py:1783 #, python-format msgid "Removing %s account" msgstr "" #: gajim/config.py:1798 msgid "Account is disabled" msgstr "" #: gajim/config.py:1799 msgid "To unregister from a server, account must be enabled." msgstr "" #: gajim/config.py:1813 gajim/gui_interface.py:314 gajim/gui_interface.py:748 msgid "Password Required" msgstr "" #: gajim/config.py:1814 gajim/gui_interface.py:733 #, python-format msgid "Enter your password for account %s" msgstr "Escriu la teva contrasenya per al compte %s" #: gajim/config.py:1815 gajim/gui_interface.py:748 msgid "Save password" msgstr "Desa la contrasenya" #: gajim/config.py:1826 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "" #: gajim/config.py:1827 msgid "If you remove it, the connection will be lost." msgstr "" #: gajim/config.py:1842 #, python-format msgid "Connection to server %s failed" msgstr "" #: gajim/config.py:1843 msgid "What would you like to do?" msgstr "" #: gajim/config.py:1844 msgid "Remove only from Gajim" msgstr "" #: gajim/config.py:1845 msgid "Don't remove anything. I'll try again later" msgstr "" #: gajim/config.py:1942 #, fuzzy msgid "?print_status:All" msgstr "Estat d'impressió:" #: gajim/config.py:1943 msgid "Enter and leave only" msgstr "" #: gajim/config.py:1944 #, fuzzy msgid "?print_status:None" msgstr "Estat d'impressió:" #: gajim/config.py:2010 msgid "New Group Chat" msgstr "" #: gajim/config.py:2046 msgid "This bookmark has invalid data" msgstr "" #: gajim/config.py:2047 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "" #: gajim/config.py:2170 gajim/config.py:2186 gajim/config.py:2197 #: gajim/config.py:2225 msgid "Character not allowed" msgstr "" #: gajim/config.py:2185 gajim/config.py:2196 gajim/config.py:2475 msgid "Invalid server" msgstr "" #: gajim/config.py:2224 msgid "Invalid room" msgstr "" #: gajim/config.py:2389 msgid "Account has been added successfully" msgstr "El compte s'ha configurat correctament" #: gajim/config.py:2390 gajim/config.py:2396 msgid "" "You can set advanced account options by pressing the Advanced button, or " "later by choosing the Accounts menu item under the Edit menu from the main " "window." msgstr "" "Pots configurar opcions avançades amb el botó Avançat, o més tard amb el " "submenú Comptes del menú Edita de la finestra principal." #: gajim/config.py:2395 msgid "Your new account has been created successfully" msgstr "" #: gajim/config.py:2433 msgid "Invalid username" msgstr "" #: gajim/config.py:2435 msgid "You must provide a username to configure this account." msgstr "" #: gajim/config.py:2476 msgid "Please provide a server on which you want to register." msgstr "" #: gajim/config.py:2499 msgid "Invalid entry" msgstr "" #: gajim/config.py:2500 msgid "Custom port must be a port number." msgstr "" #: gajim/config.py:2532 gajim/gui_interface.py:1360 msgid "Certificate Already in File" msgstr "" #: gajim/config.py:2533 gajim/gui_interface.py:1361 #, python-format msgid "This certificate is already in file %s, so it's not added again." msgstr "" #: gajim/config.py:2626 #, python-format msgid "" "Security Warning\n" "\n" "The authenticity of the %(hostname)s SSL certificate could be invalid.\n" "SSL Error: %(error)s\n" "Do you still want to connect to this server?" msgstr "" #: gajim/config.py:2632 #, fuzzy, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA-1 fingerprint of the certificate:\n" "%(sha1)s\n" "SHA-256 fingerprint of the certificate:\n" "%(sha256)s" msgstr "" "Afegir aquest certificat a la llista de certificats confiables.\n" "Hash SHA1 del certificat:\n" #: gajim/config.py:2666 gajim/config.py:2700 msgid "An error occurred during account creation" msgstr "" #: gajim/config.py:2763 msgid "Account name is in use" msgstr "" #: gajim/config.py:2764 msgid "You already have an account using this name." msgstr "" #: gajim/config.py:2896 msgid "PEP node was not removed" msgstr "" #: gajim/config.py:2897 #, python-format msgid "PEP node %(node)s was not removed: %(message)s" msgstr "" #: gajim/config.py:2925 #, python-format msgid "Configure %s" msgstr "" #: gajim/config.py:2942 gajim/plugins/gui.py:95 msgid "Active" msgstr "Activa" #: gajim/config.py:2950 msgid "Event" msgstr "" #: gajim/config.py:2984 msgid "Attention Message Received" msgstr "" #: gajim/config.py:2985 msgid "First Message Received" msgstr "" #: gajim/config.py:2986 msgid "Next Message Received Focused" msgstr "" #: gajim/config.py:2988 msgid "Next Message Received Unfocused" msgstr "" #: gajim/config.py:2989 msgid "Contact Connected" msgstr "" #: gajim/config.py:2990 msgid "Contact Disconnected" msgstr "" #: gajim/config.py:2991 msgid "Message Sent" msgstr "" #: gajim/config.py:2992 msgid "Group Chat Message Highlight" msgstr "" #: gajim/config.py:2993 msgid "Group Chat Message Received" msgstr "" #: gajim/tooltips.py:240 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "" #: gajim/tooltips.py:269 gajim/common/helpers.py:473 msgid "?Group Chat Contact Affiliation:None" msgstr "" #: gajim/tooltips.py:271 gajim/common/helpers.py:479 msgid "Member" msgstr "" #: gajim/tooltips.py:273 gajim/common/helpers.py:477 msgid "Administrator" msgstr "" #: gajim/tooltips.py:275 gajim/common/helpers.py:475 msgid "Owner" msgstr "" #: gajim/tooltips.py:433 msgid " [blocked]" msgstr "" #: gajim/tooltips.py:437 msgid " [minimized]" msgstr "" #: gajim/tooltips.py:609 msgid "Connected" msgstr "" #: gajim/tooltips.py:611 msgid "Disconnected" msgstr "Desconnectat" #: gajim/tooltips.py:660 msgid "?Noun:Download" msgstr "" #: gajim/tooltips.py:666 msgid "?Noun:Upload" msgstr "" #: gajim/tooltips.py:673 msgid "Type: " msgstr "" #: gajim/tooltips.py:679 msgid "Transferred: " msgstr "" #: gajim/tooltips.py:682 gajim/tooltips.py:699 msgid "Not started" msgstr "" #: gajim/tooltips.py:684 msgid "Stopped" msgstr "" #: gajim/tooltips.py:686 gajim/tooltips.py:689 msgid "Completed" msgstr "" #: gajim/tooltips.py:692 #, fuzzy msgid "?transfer status:Paused" msgstr "?user status:_Disponible" #: gajim/tooltips.py:695 msgid "Stalled" msgstr "" #: gajim/tooltips.py:697 msgid "Transferring" msgstr "" #: gajim/tooltips.py:700 msgid "Status: " msgstr "" #: gajim/tooltips.py:732 gajim/common/helpers.py:389 #, fuzzy msgid "?user status:Available" msgstr "?user status:_Disponible" #: gajim/tooltips.py:734 gajim/common/helpers.py:384 msgid "Free for Chat" msgstr "Disponible per parlar" #: gajim/tooltips.py:736 gajim/common/commands.py:117 #: gajim/common/helpers.py:396 #: gajim/command_system/implementation/standard.py:138 msgid "Away" msgstr "Absent" #: gajim/tooltips.py:738 gajim/common/helpers.py:374 msgid "Busy" msgstr "Ocupat" #: gajim/tooltips.py:740 gajim/common/helpers.py:379 msgid "Not Available" msgstr "" #: gajim/tooltips.py:742 gajim/common/helpers.py:401 msgid "Offline" msgstr "Desconnectat" #: gajim/advanced_configuration_window.py:88 msgid "Activated" msgstr "" #: gajim/advanced_configuration_window.py:88 msgid "Deactivated" msgstr "" #: gajim/advanced_configuration_window.py:90 msgid "Boolean" msgstr "" #: gajim/advanced_configuration_window.py:91 msgid "Integer" msgstr "" #: gajim/advanced_configuration_window.py:92 msgid "Text" msgstr "" #: gajim/advanced_configuration_window.py:93 #: gajim/data/gui/groupchat_control.ui:54 gajim/data/gui/chat_control.ui:334 msgid "Color" msgstr "Color" #: gajim/advanced_configuration_window.py:104 msgid "Preference Name" msgstr "" #: gajim/advanced_configuration_window.py:111 msgid "Value" msgstr "" #: gajim/advanced_configuration_window.py:120 msgid "Type" msgstr "" #: gajim/advanced_configuration_window.py:176 msgid "(None)" msgstr "" #: gajim/advanced_configuration_window.py:307 msgid "Hidden" msgstr "" #: gajim/logind_listener.py:58 msgid "Machine going to sleep" msgstr "" #: gajim/logind_listener.py:90 msgid "Disconnect from the network" msgstr "" #: gajim/history_window.py:339 #, python-format msgid "Conversation History with %s" msgstr "" #: gajim/history_window.py:361 gajim/data/gui/history_window.ui:7 msgid "Conversation History" msgstr "Històric de converses" #: gajim/history_window.py:390 gajim/history_window.py:443 msgid "Disk Error" msgstr "" #: gajim/history_window.py:546 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "" #: gajim/history_window.py:557 #, python-format msgid "Error: %s" msgstr "" #: gajim/history_window.py:559 msgid "Error" msgstr "" #: gajim/history_window.py:561 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "" #: gajim/history_window.py:564 #, python-format msgid "Status is now: %(status)s" msgstr "" #: gajim/history_window.py:585 gajim/conversation_textview.py:1338 #, python-format msgid "Subject: %s\n" msgstr "" #: gajim/statusicon.py:215 msgid "_Change Status Message…" msgstr "_Canvia Missatge d'Estat..." #: gajim/statusicon.py:252 gajim/statusicon.py:302 gajim/statusicon.py:309 #, python-format msgid "using account %s" msgstr "" #: gajim/statusicon.py:319 msgid "_Manage Bookmarks…" msgstr "" #: gajim/statusicon.py:332 msgid "Hide _Roster" msgstr "" #: gajim/statusicon.py:336 msgid "Show _Roster" msgstr "" #: gajim/statusicon.py:344 msgid "Hide this menu" msgstr "" #: gajim/dataforms_widget.py:587 msgid "Unable to load image" msgstr "" #: gajim/dataforms_widget.py:589 #, python-format msgid "Media type not supported: %s" msgstr "" #: gajim/dataforms_widget.py:604 msgid "This field is required" msgstr "" #: gajim/dataforms_widget.py:658 msgid "new@jabber.id" msgstr "" #: gajim/dataforms_widget.py:661 gajim/dataforms_widget.py:663 #, python-format msgid "new%d@jabber.id" msgstr "" #: gajim/server_info.py:130 #, python-format msgid "%(days)s days, %(hours)s hours" msgstr "" #: gajim/server_info.py:187 gajim/accounts_window.py:537 #: gajim/accounts_window.py:638 #, fuzzy msgid "Hostname" msgstr "Nom del servidor:" #: gajim/server_info.py:188 msgid "Server Software" msgstr "" #: gajim/server_info.py:189 #, fuzzy msgid "Server Uptime" msgstr "Servidor:" #: gajim/server_info.py:227 msgid "" "\n" "Disabled in config" msgstr "" #: gajim/disco.py:69 msgid "This service has not yet responded with detailed information" msgstr "" #: gajim/disco.py:70 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" msgstr "" #: gajim/disco.py:129 msgid "Others" msgstr "" #: gajim/disco.py:133 msgid "Conference" msgstr "" #: gajim/disco.py:537 msgid "Without a connection, you can not browse available services" msgstr "" #: gajim/disco.py:626 #, python-format msgid "Service Discovery using account %s" msgstr "" #: gajim/disco.py:628 msgid "Service Discovery" msgstr "" #: gajim/disco.py:732 msgid "The service could not be found" msgstr "" #: gajim/disco.py:733 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." msgstr "" #: gajim/disco.py:739 gajim/disco.py:1091 msgid "The service is not browsable" msgstr "" #: gajim/disco.py:740 msgid "This type of service does not contain any items to browse." msgstr "" #: gajim/disco.py:781 gajim/disco.py:791 msgid "Invalid Server Name" msgstr "" #: gajim/disco.py:849 #, python-format msgid "Browsing %(address)s using account %(account)s" msgstr "" #: gajim/disco.py:896 msgid "Browse" msgstr "" #: gajim/disco.py:1092 msgid "This service does not contain any items to browse." msgstr "" #: gajim/disco.py:1304 msgid "Execute Command" msgstr "" #: gajim/disco.py:1308 gajim/disco.py:1466 msgid "Re_gister" msgstr "" #: gajim/disco.py:1317 gajim/data/gui/join_groupchat_window.ui:186 #: gajim/data/gui/join_groupchat_window.ui:325 msgid "Join" msgstr "" #: gajim/disco.py:1326 gajim/data/gui/search_window.ui:23 msgid "Search" msgstr "" #: gajim/disco.py:1464 msgid "_Edit" msgstr "_Edita" #: gajim/disco.py:1507 #, python-format msgid "Scanning %(current)d / %(total)d.." msgstr "" #: gajim/disco.py:1703 msgid "Users" msgstr "" #: gajim/disco.py:1711 msgid "Description" msgstr "" #: gajim/disco.py:1719 msgid "Id" msgstr "" #: gajim/disco.py:1749 gajim/data/gui/gc_control_popup_menu.ui:99 msgid "_Bookmark" msgstr "Adreça d'interès" #: gajim/disco.py:1783 msgid "Bookmark already set" msgstr "" #: gajim/disco.py:1784 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "" #: gajim/disco.py:1794 msgid "Bookmark has been added successfully" msgstr "" #: gajim/disco.py:1795 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "" #: gajim/disco.py:1987 msgid "Subscribed" msgstr "" #: gajim/disco.py:1996 msgid "Node" msgstr "" #: gajim/disco.py:2063 msgid "New post" msgstr "" #: gajim/disco.py:2069 msgid "_Subscribe" msgstr "" #: gajim/disco.py:2075 msgid "_Unsubscribe" msgstr "" #: gajim/conversation_textview.py:329 msgid "" "Text below this line is what has been said since the\n" "last time you paid attention to this group chat" msgstr "" #: gajim/conversation_textview.py:550 msgid "_Quote" msgstr "" #: gajim/conversation_textview.py:558 #, python-format msgid "_Actions for \"%s\"" msgstr "" #: gajim/conversation_textview.py:572 msgid "Read _Wikipedia Article" msgstr "" #: gajim/conversation_textview.py:577 msgid "Look it up in _Dictionary" msgstr "" #: gajim/conversation_textview.py:594 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "" #: gajim/conversation_textview.py:608 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "" #: gajim/conversation_textview.py:611 msgid "Web _Search for it" msgstr "" #: gajim/conversation_textview.py:617 msgid "Open as _Link" msgstr "" #: gajim/conversation_textview.py:847 msgid "URL:" msgstr "" #: gajim/conversation_textview.py:1021 msgid "Invalid URL" msgstr "" #: gajim/conversation_textview.py:1106 msgid "" "Message corrected. Original message:\n" "{}" msgstr "" #: gajim/conversation_textview.py:1250 #, python-format msgid "Yesterday" msgid_plural "%(nb_days)i days ago" msgstr[0] "" msgstr[1] "" #: gajim/message_textview.py:43 #, fuzzy msgid "Write a message.." msgstr "Envia missatge" #: gajim/message_window.py:245 msgid "You are going to close several tabs" msgstr "" #: gajim/message_window.py:246 msgid "Do you really want to close them all?" msgstr "" #: gajim/message_window.py:517 msgid "?Noun:Chats" msgstr "" #: gajim/message_window.py:521 msgid "Private Chats" msgstr "" #: gajim/message_window.py:527 msgid "Messages" msgstr "" #: gajim/gui_interface.py:158 gajim/gui_interface.py:329 #: gajim/gui_interface.py:338 gajim/gui_interface.py:345 #: gajim/gui_interface.py:349 gajim/gui_interface.py:352 #: gajim/gui_interface.py:360 msgid "Unable to join group chat" msgstr "" #: gajim/gui_interface.py:159 #, python-format msgid "" "Your desired nickname in group chat\n" "%s\n" "is in use or registered by another occupant.\n" "Please specify another nickname below:" msgstr "" #: gajim/gui_interface.py:163 msgid "Always use this nickname when there is a conflict" msgstr "" #: gajim/gui_interface.py:181 msgid "Do you accept this request?" msgstr "" #: gajim/gui_interface.py:183 #, python-format msgid "Do you accept this request on account %s?" msgstr "" #: gajim/gui_interface.py:186 #, python-format msgid "HTTP (%(method)s) Authorization for %(url)s (ID: %(id)s)" msgstr "" #: gajim/gui_interface.py:230 gajim/notify.py:96 msgid "Connection Failed" msgstr "" #: gajim/gui_interface.py:315 #, python-format msgid "A Password is required to join the room %s. Please type it." msgstr "" #: gajim/gui_interface.py:330 #, python-format msgid "%s is full" msgstr "" #: gajim/gui_interface.py:339 #, python-format msgid "You are banned from group chat %s." msgstr "" #: gajim/gui_interface.py:346 #, python-format msgid "Remote server %s does not exist." msgstr "" #: gajim/gui_interface.py:350 #, python-format msgid "Group chat %s does not exist." msgstr "" #: gajim/gui_interface.py:353 msgid "Group chat creation is not permitted." msgstr "" #: gajim/gui_interface.py:355 msgid "Unable to join groupchat" msgstr "" #: gajim/gui_interface.py:356 #, python-format msgid "You must use your registered nickname in %s." msgstr "" #: gajim/gui_interface.py:361 #, python-format msgid "You are not in the members list in groupchat %s." msgstr "" #: gajim/gui_interface.py:455 gajim/gui_interface.py:459 #, python-format msgid "Error %(code)s: %(msg)s" msgstr "" #: gajim/gui_interface.py:470 gajim/gui_interface.py:486 #: gajim/common/connection_handlers_events.py:1430 #, python-format msgid "error while sending %(message)s ( %(error)s )" msgstr "" #: gajim/gui_interface.py:513 gajim/notify.py:96 msgid "Subscription request" msgstr "" #: gajim/gui_interface.py:524 gajim/common/contacts.py:131 #: gajim/common/helpers.py:95 msgid "Observers" msgstr "" #: gajim/gui_interface.py:538 msgid "Authorization accepted" msgstr "" #: gajim/gui_interface.py:539 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "" #: gajim/gui_interface.py:547 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "" #: gajim/gui_interface.py:548 msgid "" "You will always see them as offline.\n" "Do you want to remove them from your contact list?" msgstr "" #: gajim/gui_interface.py:570 gajim/notify.py:96 msgid "Unsubscribed" msgstr "" #: gajim/gui_interface.py:582 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "" #: gajim/gui_interface.py:583 gajim/common/connection.py:1288 #: gajim/common/connection.py:1474 msgid "Check your connection or try again later." msgstr "" #: gajim/gui_interface.py:641 #, python-format msgid "%(jid)s declined the invitation: %(reason)s" msgstr "" #: gajim/gui_interface.py:645 #, python-format msgid "%(jid)s declined the invitation" msgstr "" #: gajim/gui_interface.py:675 msgid "" "You configured Gajim to use OpenPGP agent, but there is no OpenPGP agent " "running or it returned a wrong passphrase.\n" msgstr "" #: gajim/gui_interface.py:678 gajim/gui_interface.py:686 msgid "You are currently connected without your OpenPGP key." msgstr "" #: gajim/gui_interface.py:680 msgid "Wrong passphrase" msgstr "" #: gajim/gui_interface.py:685 msgid "Wrong OpenPGP passphrase" msgstr "" #: gajim/gui_interface.py:699 msgid "Certificate Passphrase Required" msgstr "" #: gajim/gui_interface.py:700 #, python-format msgid "Enter the certificate passphrase for account %s" msgstr "" #: gajim/gui_interface.py:723 msgid "Untrusted OpenPGP key" msgstr "" #: gajim/gui_interface.py:723 msgid "" "The OpenPGP key used to encrypt this chat is not trusted. Do you really want " "to encrypt this message?" msgstr "" #: gajim/gui_interface.py:769 msgid "" "Please copy / paste the refresh token from the website that has just been " "opened." msgstr "" #: gajim/gui_interface.py:772 msgid "Oauth2 Credentials" msgstr "" #: gajim/gui_interface.py:924 #, python-format msgid "%s wants to send you a file." msgstr "" #: gajim/gui_interface.py:1021 gajim/gui_interface.py:1433 msgid "SSL certificate error" msgstr "" #: gajim/gui_interface.py:1038 msgid "File Transfer Failed" msgstr "" #: gajim/gui_interface.py:1060 #, python-format msgid "%(filename)s received from %(name)s." msgstr "" #: gajim/gui_interface.py:1064 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "" #: gajim/gui_interface.py:1068 #, python-format msgid "File transfer of %(filename)s from %(name)s failed." msgstr "" #: gajim/gui_interface.py:1081 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "" #: gajim/gui_interface.py:1085 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "" #: gajim/gui_interface.py:1089 #, python-format msgid "File transfer of %(filename)s to %(name)s failed." msgstr "" #: gajim/gui_interface.py:1153 msgid "Choose file to send" msgstr "" #: gajim/gui_interface.py:1199 msgid "Unable to decrypt message" msgstr "" #: gajim/gui_interface.py:1211 msgid "Username Conflict" msgstr "" #: gajim/gui_interface.py:1212 msgid "Please type a new username for your local account" msgstr "" #: gajim/gui_interface.py:1235 msgid "Resource Conflict" msgstr "" #: gajim/gui_interface.py:1236 msgid "" "You are already connected to this account with the same resource. Please " "type a new one" msgstr "" #: gajim/gui_interface.py:1293 #, python-format msgid "%s wants to start a voice chat." msgstr "" #: gajim/gui_interface.py:1296 msgid "Voice Chat Request" msgstr "" #: gajim/gui_interface.py:1386 msgid "Error verifying SSL certificate" msgstr "" #: gajim/gui_interface.py:1387 #, python-format msgid "" "There was an error verifying the SSL certificate of your XMPP server: " "%(error)s\n" "Do you still want to connect to this server?" msgstr "" #: gajim/gui_interface.py:1391 #, fuzzy, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA-1 fingerprint of the certificate:\n" "%(sha1)s\n" "SHA256 fingerprint of the certificate:\n" "%(sha256)s" msgstr "" "Afegir aquest certificat a la llista de certificats confiables.\n" "Hash SHA1 del certificat:\n" #: gajim/gui_interface.py:1397 msgid "Ignore this error for this certificate." msgstr "" #: gajim/gui_interface.py:1410 msgid "Non Anonymous Server" msgstr "" #: gajim/gui_interface.py:1434 #, python-format msgid "" "It seems the SSL certificate of account %(account)s has changed and is not " "valid or your connection is being compromised.\n" "\n" "Old SHA-1 fingerprint: %(old_sha1)s\n" "Old SHA-256 fingerprint: %(old_sha256)s\n" "\n" "New SHA-1 fingerprint: %(new_sha1)s\n" "New SHA-256 fingerprint: %(new_sha256)s\n" "\n" "Do you still want to connect and update the fingerprint of the certificate?" msgstr "" #: gajim/gui_interface.py:1512 msgid "" "You are about to send your password on an insecure connection. You should " "install PyOpenSSL to prevent that. Are you sure you want to do that?" msgstr "" #: gajim/gui_interface.py:1554 msgid "" "You are about to send your password unencrypted on an insecure connection. " "Are you sure you want to do that?" msgstr "" #: gajim/gui_interface.py:1856 #, fuzzy msgid "JID is not a Groupchat" msgstr "Uneix-te al xat en grup" #: gajim/gui_interface.py:2020 msgid "Emoticons disabled" msgstr "" #: gajim/gui_interface.py:2021 msgid "" "Your configured emoticons theme could not be loaded. See the log for more " "details." msgstr "" #: gajim/gui_interface.py:2039 msgid "This is not a group chat" msgstr "" #: gajim/gui_interface.py:2040 #, python-format msgid "" "%(room_jid)s is already in your roster. Please check if %(room_jid)s is a " "correct group chat name. If it is, delete it from your roster and try " "joining the group chat again." msgstr "" #: gajim/gui_interface.py:2418 msgid "Could not save your settings and preferences" msgstr "" #: gajim/gui_interface.py:2828 gajim/common/config.py:117 #: gajim/common/config.py:532 gajim/common/optparser.py:343 #: gajim/common/optparser.py:511 gajim/common/optparser.py:534 msgid "default" msgstr "" #: gajim/gui_interface.py:3014 msgid "Passphrase Required" msgstr "" #: gajim/gui_interface.py:3015 #, python-format msgid "Enter OpenPGP key passphrase for key %(keyid)s (account %(account)s)." msgstr "" #: gajim/gui_interface.py:3029 msgid "OpenPGP key expired" msgstr "" #: gajim/gui_interface.py:3030 #, python-format msgid "" "Your OpenPGP key has expired, you will be connected to %s without OpenPGP." msgstr "" #: gajim/gui_interface.py:3039 msgid "Wrong Passphrase" msgstr "" #: gajim/gui_interface.py:3040 msgid "Please retype your OpenPGP passphrase or press Cancel." msgstr "" #: gajim/search_window.py:108 msgid "Waiting for results" msgstr "" #: gajim/search_window.py:146 gajim/search_window.py:224 msgid "Error in received dataform" msgstr "" #: gajim/search_window.py:181 gajim/search_window.py:216 msgid "No result" msgstr "" #: gajim/htmltextview.py:559 msgid "Loading" msgstr "" #: gajim/atom_window.py:123 #, python-format msgid "You have received new entries (and %d not displayed):" msgid_plural "You have received new entries (and %d not displayed):" msgstr[0] "" msgstr[1] "" #: gajim/atom_window.py:128 gajim/data/gui/atom_entry_window.ui:20 msgid "You have received new entry:" msgstr "Has rebut una nova entrada:" #: gajim/adhoc_commands.py:111 gajim/data/gui/adhoc_commands_window.ui:9 msgid "Ad-hoc Commands - Gajim" msgstr "Comandes Ad-Hoc - Gajim" #: gajim/adhoc_commands.py:320 msgid "Cancel confirmation" msgstr "" #: gajim/adhoc_commands.py:321 msgid "" "You are in process of executing command. Do you really want to cancel it?" msgstr "" #: gajim/adhoc_commands.py:387 gajim/adhoc_commands.py:411 msgid "Service sent malformed data" msgstr "" #: gajim/adhoc_commands.py:396 msgid "Service changed the session identifier." msgstr "" #: gajim/adhoc_commands.py:416 #, python-format msgid "%s - Ad-hoc Commands - Gajim" msgstr "" #: gajim/adhoc_commands.py:510 msgid "Service returned an error." msgstr "" #: gajim/negotiation.py:34 msgid "- messages will be logged" msgstr "" #: gajim/negotiation.py:36 msgid "- messages will not be logged" msgstr "" #: gajim/notify.py:103 msgid "Open" msgstr "" #: gajim/dialog_messages.py:33 msgid "You can not start a new conversation unless you are connected." msgstr "" #: gajim/dialog_messages.py:48 msgid "Unread events" msgstr "" #: gajim/dialog_messages.py:49 msgid "Read all pending events before removing this account." msgstr "" #: gajim/dialog_messages.py:53 msgid "You are currently connected to the server" msgstr "" #: gajim/dialog_messages.py:54 msgid "To disable the account, you must be disconnected." msgstr "" #: gajim/dialog_messages.py:58 msgid "Invalid Form" msgstr "" #: gajim/dialog_messages.py:59 msgid "The form is not filled correctly." msgstr "" #: gajim/dialog_messages.py:63 gajim/common/helpers.py:406 msgid "Invisible" msgstr "Invisible" #: gajim/dialog_messages.py:68 msgid "A connection is not available" msgstr "" #: gajim/dialog_messages.py:69 msgid "Your message can not be sent until you are connected." msgstr "" #: gajim/dialog_messages.py:73 msgid "JID already in list" msgstr "" #: gajim/dialog_messages.py:74 msgid "The JID you entered is already in the list. Choose another one." msgstr "" #: gajim/dialog_messages.py:78 msgid "Invalid answer" msgstr "" #: gajim/dialog_messages.py:79 #, python-format msgid "Transport %(name)s answered wrongly to register request: %(error)s" msgstr "" #: gajim/dialog_messages.py:84 msgid "Wrong Custom Hostname" msgstr "" #: gajim/dialog_messages.py:85 #, python-format msgid "Wrong custom hostname \"%s\". Ignoring it." msgstr "" #: gajim/dialog_messages.py:89 msgid "Error while removing privacy list" msgstr "" #: gajim/dialog_messages.py:90 #, python-format msgid "" "Privacy list %s has not been removed. It is maybe active in one of your " "connected resources. Deactivate it and try again." msgstr "" #: gajim/dialog_messages.py:96 msgid "Invisibility not supported" msgstr "" #: gajim/dialog_messages.py:97 #, python-format msgid "Account %s doesn't support invisibility." msgstr "" #: gajim/dialog_messages.py:101 msgid "Unregister failed" msgstr "" #: gajim/dialog_messages.py:102 #, python-format msgid "Unregistration with server %(server)s failed: %(error)s" msgstr "" #: gajim/dialog_messages.py:106 msgid "Registration succeeded" msgstr "" #: gajim/dialog_messages.py:107 #, python-format msgid "Registration with agent %s succeeded" msgstr "" #: gajim/dialog_messages.py:111 msgid "Registration failed" msgstr "" #: gajim/dialog_messages.py:112 #, python-format msgid "" "Registration with agent %(agent)s failed with error %(error)s: %(error_msg)s" msgstr "" #: gajim/dialog_messages.py:117 #, fuzzy msgid "Unable to join Groupchat" msgstr "Uneix-te al xat en grup" #: gajim/dialog_messages.py:122 msgid "GStreamer error" msgstr "" #: gajim/dialog_messages.py:123 #, python-format msgid "" "Error: %(error)s\n" "Debug: %(debug)s" msgstr "" #: gajim/dialog_messages.py:127 msgid "Wrong host" msgstr "" #: gajim/dialog_messages.py:128 msgid "Invalid local address? :-O" msgstr "" #: gajim/dialog_messages.py:132 msgid "Avahi error" msgstr "" #: gajim/dialog_messages.py:133 #, python-format msgid "" "%s\n" "Link-local messaging might not work properly." msgstr "" #: gajim/dialog_messages.py:137 gajim/dialog_messages.py:142 msgid "Could not request upload slot" msgstr "" #: gajim/dialog_messages.py:143 msgid "Got unexpected response from server (see log)" msgstr "" #: gajim/dialog_messages.py:147 gajim/dialog_messages.py:152 msgid "Could not open file" msgstr "" #: gajim/dialog_messages.py:148 msgid "Exception raised while opening file (see log)" msgstr "" #: gajim/dialog_messages.py:157 msgid "Unsecure" msgstr "" #: gajim/dialog_messages.py:158 msgid "Server returned unsecure transport (http)" msgstr "" #: gajim/dialog_messages.py:162 msgid "Could not upload file" msgstr "" #: gajim/dialog_messages.py:163 #, python-format msgid "HTTP response code from server: %s" msgstr "" #: gajim/dialog_messages.py:167 msgid "Upload Error" msgstr "" #: gajim/dialog_messages.py:172 msgid "Encryption Error" msgstr "" #: gajim/dialog_messages.py:173 msgid "For the choosen encryption is no encryption method available" msgstr "" #: gajim/gajim_themes_window.py:61 msgid "Theme" msgstr "" #: gajim/gajim_themes_window.py:98 msgid "You cannot make changes to the default theme" msgstr "" #: gajim/gajim_themes_window.py:99 msgid "Please create a new clean theme." msgstr "" #: gajim/gajim_themes_window.py:170 msgid "theme name" msgstr "" #: gajim/gajim_themes_window.py:187 msgid "You cannot delete your current theme" msgstr "" #: gajim/gajim_themes_window.py:188 msgid "Pick another theme to use first." msgstr "" #: gajim/accounts_window.py:40 #, fuzzy msgid "Merge Accounts" msgstr "Comptes" #: gajim/accounts_window.py:41 #, fuzzy msgid "Use PGP Agent" msgstr "Fes ús d'Agent G_PG" #: gajim/accounts_window.py:153 gajim/common/config.py:511 msgid "Be right back." msgstr "" #: gajim/accounts_window.py:157 msgid "Relogin now?" msgstr "" #: gajim/accounts_window.py:158 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "" #: gajim/accounts_window.py:211 #, python-format msgid "You have opened chat in account %s" msgstr "" #: gajim/accounts_window.py:212 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "" #: gajim/accounts_window.py:345 #, fuzzy msgid "Remove" msgstr "Esborra" #: gajim/accounts_window.py:388 msgid "Rename account label" msgstr "" #: gajim/accounts_window.py:457 msgid "Login" msgstr "" #: gajim/accounts_window.py:466 msgid "Connection" msgstr "Connexió" #: gajim/accounts_window.py:469 #, fuzzy msgid "Import Contacts" msgstr "Convida _Contactes" #: gajim/accounts_window.py:472 gajim/accounts_window.py:655 #, fuzzy msgid "Client Certificate" msgstr "Certificat de client" #: gajim/accounts_window.py:475 gajim/accounts_window.py:570 #, fuzzy msgid "OpenPGP Key" msgstr "Assigna Clau Open_PGP..." #: gajim/accounts_window.py:486 gajim/accounts_window.py:558 #, fuzzy msgid "Connect on startup" msgstr "C_onecta al servidor quan s'inicia" #: gajim/accounts_window.py:489 #, fuzzy msgid "Reconnect when connection is lost" msgstr "Reconnexió automàtica quan es perd la connexió" #: gajim/accounts_window.py:492 gajim/accounts_window.py:562 #, fuzzy msgid "Save conversations for all contacts" msgstr "Guarda registre de les converses amb tots els contactes" #: gajim/accounts_window.py:494 gajim/accounts_window.py:564 msgid "Store conversations on the harddrive" msgstr "" #: gajim/accounts_window.py:496 #, fuzzy msgid "Server Message Archive" msgstr "Envia Missatge Privat" #: gajim/accounts_window.py:498 msgid "" "Messages get stored on the server.\n" "The archive is used to sync messages\n" "between multiple devices.\n" "XEP-0313" msgstr "" #: gajim/accounts_window.py:503 gajim/accounts_window.py:566 #, fuzzy msgid "Global Status" msgstr "Estat" #: gajim/accounts_window.py:505 #, fuzzy msgid "Synchronise the status of all accounts" msgstr "Sincronit_za l'estat del compte amb l'estat global" #: gajim/accounts_window.py:507 msgid "Message Carbons" msgstr "" #: gajim/accounts_window.py:509 msgid "" "All your other online devices get copies\n" "of sent and received messages.\n" "XEP-0280" msgstr "" #: gajim/accounts_window.py:513 msgid "Use file transfer proxies" msgstr "Fer ús de proxis per a transferència de fitxers" #: gajim/accounts_window.py:525 gajim/accounts_window.py:560 #, fuzzy msgid "Use environment variable" msgstr "fa ús de la variable d'entorn HTTP__PROXY" #: gajim/accounts_window.py:527 #, fuzzy msgid "Proxy" msgstr "Prox_y:" #: gajim/accounts_window.py:530 #, fuzzy msgid "Warn on insecure connection" msgstr "Avís abans d'una connexió insegura" #: gajim/accounts_window.py:534 #, fuzzy msgid "Send keep-alive packets" msgstr "Enviar paquets _keep-alive" #: gajim/accounts_window.py:538 msgid "Manually set the hostname for the server" msgstr "" #: gajim/accounts_window.py:541 #, fuzzy msgid "Resource" msgstr "Recurs:" #: gajim/accounts_window.py:544 gajim/accounts_window.py:612 #: gajim/accounts_window.py:617 #, fuzzy msgid "Priority" msgstr "Priori_tat:" #: gajim/accounts_window.py:568 #, fuzzy msgid "Synchronize the status of all accounts" msgstr "Sinc_ronitza l'estat del compte amb l'estat global" #: gajim/accounts_window.py:581 #, fuzzy msgid "First Name" msgstr "Nom:" #: gajim/accounts_window.py:584 #, fuzzy msgid "Last Name" msgstr "Cognom:" #: gajim/accounts_window.py:587 #: gajim/data/gui/archiving_313_preferences_window.ui:71 msgid "Jabber ID" msgstr "ID de Jabber" #: gajim/accounts_window.py:590 msgid "Email" msgstr "" #: gajim/accounts_window.py:608 #, fuzzy msgid "Adjust to status" msgstr "Ajustar a estat" #: gajim/accounts_window.py:635 msgid "Enable" msgstr "" #: gajim/accounts_window.py:642 #, fuzzy msgid "Port" msgstr "_Port:" #: gajim/accounts_window.py:647 #, fuzzy msgid "Connection Options" msgstr "Connexió" #: gajim/accounts_window.py:659 #, fuzzy msgid "Encrypted Certificate" msgstr "Certificat de client" #: gajim/accounts_window.py:663 #, fuzzy msgid "Certificate Options" msgstr "El Certificat està xifrat" #: gajim/accounts_window.py:671 gajim/data/gui/join_groupchat_window.ui:143 #, fuzzy msgid "Password" msgstr "Contrasenya:" #: gajim/accounts_window.py:675 #, fuzzy msgid "Save Password" msgstr "Desa la contrasenya" #: gajim/accounts_window.py:678 gajim/data/gui/change_password_dialog.ui:8 msgid "Change Password" msgstr "Canviar contrasenya" #: gajim/accounts_window.py:683 msgid "Login Options" msgstr "" #: gajim/gajim_remote.py:59 gajim/common/exceptions.py:71 msgid "D-Bus is not present on this machine or python module is missing" msgstr "" #: gajim/gajim_remote.py:81 msgid "Shows a help on specific command" msgstr "" #: gajim/gajim_remote.py:84 msgid "command" msgstr "" #: gajim/gajim_remote.py:85 msgid "show help on command" msgstr "" #: gajim/gajim_remote.py:89 msgid "Lists all contacts in roster, one for each line" msgstr "" #: gajim/gajim_remote.py:91 gajim/gajim_remote.py:106 gajim/gajim_remote.py:116 #: gajim/gajim_remote.py:130 gajim/gajim_remote.py:144 #: gajim/gajim_remote.py:153 gajim/gajim_remote.py:174 #: gajim/gajim_remote.py:204 gajim/gajim_remote.py:213 #: gajim/gajim_remote.py:220 #, fuzzy msgid "?CLI:account" msgstr "Compte" #: gajim/gajim_remote.py:91 msgid "show only contacts of the given account" msgstr "" #: gajim/gajim_remote.py:97 msgid "Prints a list of registered accounts" msgstr "" #: gajim/gajim_remote.py:101 msgid "Changes the status of account(s)" msgstr "" #: gajim/gajim_remote.py:104 msgid "?CLI:status" msgstr "" #: gajim/gajim_remote.py:104 msgid "" "one of: offline, online, chat, away, xa, dnd, invisible. If not set, use " "account's previous status" msgstr "" #: gajim/gajim_remote.py:105 gajim/gajim_remote.py:127 #: gajim/gajim_remote.py:141 gajim/gajim_remote.py:152 #, fuzzy msgid "?CLI:message" msgstr "missatge" #: gajim/gajim_remote.py:105 msgid "status message" msgstr "" #: gajim/gajim_remote.py:106 msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" msgstr "" #: gajim/gajim_remote.py:112 msgid "Changes the priority of account(s)" msgstr "" #: gajim/gajim_remote.py:114 #, fuzzy msgid "?CLI:priority" msgstr "Priori_tat:" #: gajim/gajim_remote.py:114 msgid "priority you want to give to the account" msgstr "" #: gajim/gajim_remote.py:116 msgid "" "change the priority of the given account. If not specified, change status of " "all accounts that have \"sync with global status\" option set" msgstr "" #: gajim/gajim_remote.py:122 msgid "" "Sends new chat message to a contact in the roster. Both OpenPGP key and " "account are optional. If you want to set only 'account', without 'OpenPGP " "key', just set 'OpenPGP key' to ''." msgstr "" #: gajim/gajim_remote.py:126 gajim/gajim_remote.py:139 msgid "JID of the contact that will receive the message" msgstr "" #: gajim/gajim_remote.py:127 gajim/gajim_remote.py:141 #: gajim/gajim_remote.py:152 msgid "message contents" msgstr "" #: gajim/gajim_remote.py:128 gajim/gajim_remote.py:142 msgid "PGP key" msgstr "" #: gajim/gajim_remote.py:128 gajim/gajim_remote.py:142 msgid "if specified, the message will be encrypted using this public key" msgstr "" #: gajim/gajim_remote.py:130 gajim/gajim_remote.py:144 #: gajim/gajim_remote.py:153 msgid "if specified, the message will be sent using this account" msgstr "" #: gajim/gajim_remote.py:135 msgid "" "Sends a chat message to someone on your roster. Optionally with OpenPGP key " "and account. If you want to only set the latter, set OpenPGP key to \"\"." msgstr "" #: gajim/gajim_remote.py:140 msgid "subject" msgstr "" #: gajim/gajim_remote.py:140 msgid "message subject" msgstr "" #: gajim/gajim_remote.py:149 msgid "Sends new message to a groupchat you've joined." msgstr "" #: gajim/gajim_remote.py:151 msgid "JID of the room that will receive the message" msgstr "" #: gajim/gajim_remote.py:158 msgid "Gets detailed info on a contact" msgstr "" #: gajim/gajim_remote.py:160 gajim/gajim_remote.py:173 #: gajim/gajim_remote.py:203 msgid "JID of the contact" msgstr "" #: gajim/gajim_remote.py:164 msgid "Gets detailed info on a account" msgstr "" #: gajim/gajim_remote.py:166 msgid "Name of the account" msgstr "" #: gajim/gajim_remote.py:170 msgid "Sends file to a contact" msgstr "" #: gajim/gajim_remote.py:172 msgid "file" msgstr "" #: gajim/gajim_remote.py:172 msgid "File path" msgstr "" #: gajim/gajim_remote.py:174 msgid "if specified, file will be sent using this account" msgstr "" #: gajim/gajim_remote.py:179 msgid "Lists all preferences and their values" msgstr "" #: gajim/gajim_remote.py:183 msgid "Sets value of 'key' to 'value'." msgstr "" #: gajim/gajim_remote.py:185 msgid "key=value" msgstr "" #: gajim/gajim_remote.py:185 msgid "'key' is the name of the preference, 'value' is what to set it to" msgstr "" #: gajim/gajim_remote.py:190 msgid "Deletes a preference item" msgstr "" #: gajim/gajim_remote.py:192 msgid "key" msgstr "" #: gajim/gajim_remote.py:192 msgid "name of the preference to be deleted" msgstr "" #: gajim/gajim_remote.py:196 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "" #: gajim/gajim_remote.py:201 msgid "Removes contact from roster" msgstr "" #: gajim/gajim_remote.py:204 msgid "if specified, contact is taken from the contact list of this account" msgstr "" #: gajim/gajim_remote.py:211 msgid "Returns current status (the global one unless account is specified)" msgstr "" #: gajim/gajim_remote.py:218 msgid "" "Returns current status message (the global one unless account is specified)" msgstr "" #: gajim/gajim_remote.py:225 msgid "Returns number of unread messages" msgstr "" #: gajim/gajim_remote.py:230 msgid "Sends custom XML" msgstr "" #: gajim/gajim_remote.py:232 msgid "XML to send" msgstr "" #: gajim/gajim_remote.py:233 msgid "" "Account to which the XML will be sent; if not specified, XML will be sent to " "all accounts" msgstr "" #: gajim/gajim_remote.py:239 msgid "Change the avatar" msgstr "" #: gajim/gajim_remote.py:241 msgid "Picture to use" msgstr "" #: gajim/gajim_remote.py:242 msgid "" "Account in which the avatar will be set; if not specified, the avatar will " "be set for all accounts" msgstr "" #: gajim/gajim_remote.py:249 msgid "Check if Gajim is running" msgstr "" #: gajim/gajim_remote.py:275 msgid "Missing argument \"contact_jid\"" msgstr "" #: gajim/gajim_remote.py:295 #, python-format msgid "" "'%s' is not in your roster.\n" "Please specify account for sending the message." msgstr "" #: gajim/gajim_remote.py:298 msgid "You have no active account" msgstr "" #: gajim/gajim_remote.py:346 msgid "It seems Gajim is not running. So you can't use gajim-remote." msgstr "" #: gajim/gajim_remote.py:373 #, python-format msgid "" "Usage: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" msgstr "" #: gajim/gajim_remote.py:377 msgid "Arguments:" msgstr "" #: gajim/gajim_remote.py:381 #, python-format msgid "%s not found" msgstr "" #: gajim/gajim_remote.py:387 #, python-format msgid "" "Usage:\n" " %s command [arguments]\n" "\n" "Command is one of:\n" msgstr "" #: gajim/gajim_remote.py:457 #, python-format msgid "" "Too many arguments. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" #: gajim/gajim_remote.py:462 #, python-format msgid "" "Argument \"%(arg)s\" is not specified. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" #: gajim/common/app.py:264 msgid "Unable to load idle module" msgstr "" #: gajim/common/fuzzyclock.py:37 msgid "twelve" msgstr "" #: gajim/common/fuzzyclock.py:37 msgid "one" msgstr "" #: gajim/common/fuzzyclock.py:37 msgid "two" msgstr "" #: gajim/common/fuzzyclock.py:37 msgid "three" msgstr "" #: gajim/common/fuzzyclock.py:37 msgid "four" msgstr "" #: gajim/common/fuzzyclock.py:38 msgid "five" msgstr "" #: gajim/common/fuzzyclock.py:38 msgid "six" msgstr "" #: gajim/common/fuzzyclock.py:38 msgid "seven" msgstr "" #: gajim/common/fuzzyclock.py:38 msgid "eight" msgstr "" #: gajim/common/fuzzyclock.py:38 msgid "nine" msgstr "" #: gajim/common/fuzzyclock.py:38 msgid "ten" msgstr "" #: gajim/common/fuzzyclock.py:39 msgid "eleven" msgstr "" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "%(0)s o'clock" msgstr "" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "five past %(0)s" msgstr "" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "ten past %(0)s" msgstr "" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "quarter past %(0)s" msgstr "" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "twenty past %(0)s" msgstr "" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "twenty five past %(0)s" msgstr "" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "half past %(0)s" msgstr "" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "twenty five to %(1)s" msgstr "" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "twenty to %(1)s" msgstr "" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "quarter to %(1)s" msgstr "" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "ten to %(1)s" msgstr "" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "five to %(1)s" msgstr "" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "%(1)s o'clock" msgstr "" #: gajim/common/fuzzyclock.py:48 gajim/common/fuzzyclock.py:50 msgid "Night" msgstr "" #: gajim/common/fuzzyclock.py:48 msgid "Early morning" msgstr "" #: gajim/common/fuzzyclock.py:48 msgid "Morning" msgstr "" #: gajim/common/fuzzyclock.py:49 msgid "Almost noon" msgstr "" #: gajim/common/fuzzyclock.py:49 msgid "Noon" msgstr "" #: gajim/common/fuzzyclock.py:49 msgid "Afternoon" msgstr "" #: gajim/common/fuzzyclock.py:49 msgid "Evening" msgstr "" #: gajim/common/fuzzyclock.py:50 msgid "Late evening" msgstr "" #: gajim/common/fuzzyclock.py:52 msgid "Start of week" msgstr "" #: gajim/common/fuzzyclock.py:52 gajim/common/fuzzyclock.py:53 msgid "Middle of week" msgstr "" #: gajim/common/fuzzyclock.py:53 msgid "End of week" msgstr "" #: gajim/common/fuzzyclock.py:53 msgid "Weekend!" msgstr "" #: gajim/common/connection_handlers_events.py:369 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " "management tools such as http://jru.jabberstudio.org/ to remove it" msgstr "" #: gajim/common/connection_handlers_events.py:852 #, python-format msgid "unsubscribe request from %s" msgstr "" #: gajim/common/connection_handlers_events.py:952 msgid "Room has been destroyed" msgstr "" #: gajim/common/connection_handlers_events.py:960 #, python-format msgid "You can join this room instead: %s" msgstr "" #: gajim/common/connection_handlers_events.py:1979 #, python-format msgid "Unknown SSL error: %d" msgstr "" #: gajim/common/connection_handlers_events.py:2625 #, python-format msgid "New Single Message from %(nickname)s" msgstr "" #: gajim/common/connection_handlers_events.py:2631 #, python-format msgid "New Private Message from group chat %s" msgstr "" #: gajim/common/connection_handlers_events.py:2634 #, python-format msgid "%(nickname)s: %(message)s" msgstr "" #: gajim/common/connection_handlers_events.py:2637 #, python-format msgid "Messaged by %(nickname)s" msgstr "" #: gajim/common/connection_handlers_events.py:2643 #, python-format msgid "New Message from %(nickname)s" msgstr "" #: gajim/common/connection_handlers_events.py:2809 #, python-format msgid "%(nick)s Changed Status" msgstr "" #: gajim/common/connection_handlers_events.py:2817 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s han entrat" #: gajim/common/connection_handlers_events.py:2823 #, python-format msgid "%(nickname)s Signed Out" msgstr "" #: gajim/common/contacts.py:386 msgid "Not in roster" msgstr "" #: gajim/common/config.py:76 msgid "" "Show desktop notification even when a chat window is opened for this contact " "and does not have focus" msgstr "" #: gajim/common/config.py:77 msgid "Play sound when user is busy" msgstr "" #: gajim/common/config.py:79 msgid "Show only online and free for chat contacts in roster." msgstr "" #: gajim/common/config.py:82 msgid "Time in minutes, after which your status changes to away." msgstr "" #: gajim/common/config.py:83 msgid "$S (Away as a result of being idle more than $T min)" msgstr "" #: gajim/common/config.py:83 msgid "$S will be replaced by current status message, $T by autoawaytime." msgstr "" #: gajim/common/config.py:85 msgid "Time in minutes, after which your status changes to not available." msgstr "" #: gajim/common/config.py:86 msgid "$S (Not available as a result of being idle more than $T min)" msgstr "" #: gajim/common/config.py:86 msgid "$S will be replaced by current status message, $T by autoxatime." msgstr "" #: gajim/common/config.py:89 msgid "" "When to show notification area icon. Can be 'never', 'on_event', 'always'." msgstr "" #: gajim/common/config.py:90 msgid "Allow to hide the roster window even if the tray icon is not shown." msgstr "" #: gajim/common/config.py:95 msgid "Incoming nickname color." msgstr "" #: gajim/common/config.py:96 msgid "Outgoing nickname color." msgstr "" #: gajim/common/config.py:97 msgid "Incoming text color." msgstr "" #: gajim/common/config.py:98 msgid "Outgoing text color." msgstr "" #: gajim/common/config.py:99 msgid "Status message text color." msgstr "" #: gajim/common/config.py:102 msgid "Contact signed in notification color." msgstr "" #: gajim/common/config.py:103 msgid "Contact signout notification color" msgstr "" #: gajim/common/config.py:104 msgid "New message notification color." msgstr "" #: gajim/common/config.py:105 msgid "File transfer request notification color." msgstr "" #: gajim/common/config.py:106 msgid "File transfer error notification color." msgstr "" #: gajim/common/config.py:107 msgid "File transfer complete or stopped notification color." msgstr "" #: gajim/common/config.py:108 msgid "Groupchat invitation notification color" msgstr "" #: gajim/common/config.py:109 msgid "Background color of status changed notification" msgstr "" #: gajim/common/config.py:110 msgid "Other dialogs color." msgstr "" #: gajim/common/config.py:111 msgid "Incoming nickname font." msgstr "" #: gajim/common/config.py:112 msgid "Outgoing nickname font." msgstr "" #: gajim/common/config.py:113 msgid "Incoming text font." msgstr "" #: gajim/common/config.py:114 msgid "Outgoing text font." msgstr "" #: gajim/common/config.py:115 msgid "Status message text font." msgstr "" #: gajim/common/config.py:116 msgid "" "List (space separated) of rows (accounts and groups) that are collapsed." msgstr "" #: gajim/common/config.py:123 msgid "Language used by speller" msgstr "" #: gajim/common/config.py:124 msgid "" "'always' - print time for every message.\n" "'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" "'never' - never print time." msgstr "" #: gajim/common/config.py:125 msgid "" "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " "to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " "This is used only if print_time is 'sometimes'." msgstr "" #: gajim/common/config.py:127 msgid "Enable ASCII emoticons" msgstr "" #: gajim/common/config.py:129 msgid "Treat * / _ pairs as possible formatting characters." msgstr "" #: gajim/common/config.py:130 msgid "" "If True, do not remove */_ . So *abc* will be bold but with * * not removed." msgstr "" #: gajim/common/config.py:133 msgid "" "Uses ReStructured text markup to send HTML, plus ascii formatting if " "selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" "restructuredtext.html (If you want to use this, install docutils)" msgstr "" #: gajim/common/config.py:142 msgid "" "Character to add after nickname when using nick completion (tab) in group " "chat." msgstr "" #: gajim/common/config.py:143 msgid "" "Character to propose to add after desired nickname when desired nickname is " "used by someone else in group chat." msgstr "" #: gajim/common/config.py:165 msgid "" "If True, Gajim will save roster position when hiding roster, and restore it " "when showing roster." msgstr "" #: gajim/common/config.py:171 msgid "Place the roster on the right in single window mode" msgstr "" #: gajim/common/config.py:177 msgid "" "This option let you customize timestamp that is printed in conversation. For " "exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " "strftime for full documentation: http://docs.python.org/lib/module-time.html" msgstr "" #: gajim/common/config.py:178 msgid "Characters that are printed before the nickname in conversations" msgstr "" #: gajim/common/config.py:179 msgid "Characters that are printed after the nickname in conversations" msgstr "" #: gajim/common/config.py:181 msgid "Add * and [n] in roster title?" msgstr "" #: gajim/common/config.py:182 msgid "" "How many history messages should be restored when a chat tab/window is " "reopened?" msgstr "" #: gajim/common/config.py:183 msgid "How far back in time (minutes) history is restored. -1 means no limit." msgstr "" #: gajim/common/config.py:184 msgid "" "How many lines to request from server when entering a groupchat. -1 means no " "limit" msgstr "" #: gajim/common/config.py:185 msgid "" "Minutes of backlog to request when entering a groupchat. -1 means no limit" msgstr "" #: gajim/common/config.py:186 msgid "" "How many seconds to wait before trying to autorejoin to a conference you are " "being disconnected from. Set to 0 to disable autorejoining." msgstr "" #: gajim/common/config.py:187 msgid "" "Should autorejoin be activated when we are being kicked from a conference?" msgstr "" #: gajim/common/config.py:188 msgid "" "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " "Client default behaviour)." msgstr "" #: gajim/common/config.py:190 msgid "How many lines to store for Ctrl+KeyUP." msgstr "" #: gajim/common/config.py:193 #, python-format msgid "" "Either custom url with %%s in it where %%s is the word/phrase or " "'WIKTIONARY' which means use wiktionary." msgstr "" #: gajim/common/config.py:196 msgid "If checked, Gajim can be controlled remotely using gajim-remote." msgstr "" #: gajim/common/config.py:197 msgid "" "Sent chat state notifications. Can be one of all, composing_only, disabled." msgstr "" #: gajim/common/config.py:198 msgid "" "Displayed chat state notifications in chat windows. Can be one of all, " "composing_only, disabled." msgstr "" #: gajim/common/config.py:200 msgid "" "When not printing time for every message (print_time==sometimes), print it " "every x minutes." msgstr "" #: gajim/common/config.py:201 msgid "Ask before closing a group chat tab/window." msgstr "" #: gajim/common/config.py:202 msgid "" "Always ask for confirmation before closing groupchats with any of the JIDs " "on this space separated list." msgstr "" #: gajim/common/config.py:203 msgid "" "Never ask for confirmation before closing groupchats with any of the JIDs on " "this space separated list." msgstr "" #: gajim/common/config.py:204 msgid "" "Ask before closing tabbed chat window if there are controls that can lose " "data (chat, private chat, groupchat that will not be minimized)" msgstr "" #: gajim/common/config.py:207 msgid "" "Comma separated list of hosts that we send, in addition of local interfaces, " "for File Transfer in case of address translation/port forwarding." msgstr "" #: gajim/common/config.py:209 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." msgstr "" #: gajim/common/config.py:211 msgid "Notify of events in the notification area." msgstr "" #: gajim/common/config.py:212 msgid "" "If False, Gajim will display a static event icon instead of the blinking " "status icon in the notification area when notifying on event." msgstr "" #: gajim/common/config.py:218 msgid "Show tab when only one conversation?" msgstr "" #: gajim/common/config.py:219 msgid "Show tabbed notebook border in chat windows?" msgstr "" #: gajim/common/config.py:220 msgid "Show close button in tab?" msgstr "" #: gajim/common/config.py:221 msgid "" "A list of modp groups to use in a Diffie-Hellman, highest preference first, " "separated by commas. Valid groups are 1, 2, 5, 14, 15, 16, 17 and 18. Higher " "numbers are more secure, but take longer to calculate when you start a " "session." msgstr "" #: gajim/common/config.py:234 msgid "Preview new messages in notification popup?" msgstr "" #: gajim/common/config.py:237 msgid "" "A semicolon-separated list of words that will be highlighted in group chats." msgstr "" #: gajim/common/config.py:238 msgid "" "If True, quits Gajim when X button of Window Manager is clicked. This " "setting is taken into account only if notification icon is used." msgstr "" #: gajim/common/config.py:239 msgid "" "If True, Gajim hides the Roster window on pressing the X button instead of " "minimizing into the Dock." msgstr "" #: gajim/common/config.py:240 msgid "" "If True, Gajim will display an icon on each tab containing unread messages. " "Depending on the theme, this icon may be animated." msgstr "" #: gajim/common/config.py:241 msgid "" "If True, Gajim will display the status message, if not empty, for every " "contact under the contact name in roster window." msgstr "" #: gajim/common/config.py:247 msgid "Define the position of the avatar in roster. Can be left or right" msgstr "" #: gajim/common/config.py:248 msgid "" "If False, Gajim will no longer print status line in chats when a contact " "changes his or her status and/or his or her status message." msgstr "" #: gajim/common/config.py:249 msgid "" "Can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " "longer print status line in groupchats when a member changes his or her " "status and/or his or her status message. If \"all\" Gajim will print all " "status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " "group chat." msgstr "" #: gajim/common/config.py:251 msgid "Log XHTML messages instead of plain text messages." msgstr "" #: gajim/common/config.py:252 msgid "Background color of contacts when they just signed in." msgstr "" #: gajim/common/config.py:253 msgid "Background color of contacts when they just signed out." msgstr "" #: gajim/common/config.py:255 msgid "" "If True, restored messages will use a smaller font than the default one." msgstr "" #: gajim/common/config.py:256 msgid "Don't show avatar for the transport itself." msgstr "" #: gajim/common/config.py:257 msgid "Don't show roster in the system taskbar." msgstr "" #: gajim/common/config.py:258 msgid "" "If True and installed GTK+ and PyGTK versions are at least 2.8, make the " "window flash (the default behaviour in most Window Managers) when holding " "pending events." msgstr "" #: gajim/common/config.py:260 msgid "" "Jabberd1.4 does not like sha info when one join a password protected group " "chat. Turn this option to False to stop sending sha info in group chat " "presences." msgstr "" #: gajim/common/config.py:263 msgid "" "Controls the window where new messages are placed.\n" "'always' - All messages are sent to a single window.\n" "'always_with_roster' - Like 'always' but the messages are in a single window " "along with the roster.\n" "'never' - All messages get their own window.\n" "'peracct' - Messages for each account are sent to a specific window.\n" "'pertype' - Each message type (e.g. chats vs. groupchats) is sent to a " "specific window." msgstr "" #: gajim/common/config.py:264 msgid "" "Show roster on startup.\n" "'always' - Always show roster.\n" "'never' - Never show roster.\n" "'last_state' - Restore the last state roster." msgstr "" #: gajim/common/config.py:265 msgid "If False, you will no longer see the avatar in the chat window." msgstr "" #: gajim/common/config.py:266 msgid "If True, pressing the escape key closes a tab/window." msgstr "" #: gajim/common/config.py:267 msgid "Hides the banner in a group chat window" msgstr "" #: gajim/common/config.py:268 msgid "Hides the banner in two persons chat window" msgstr "" #: gajim/common/config.py:269 msgid "Hides the group chat occupants list in group chat window." msgstr "" #: gajim/common/config.py:270 msgid "" "In a chat, show the nickname at the beginning of a line only when it's not " "the same person talking than in previous message." msgstr "" #: gajim/common/config.py:271 msgid "Indentation when using merge consecutive nickname." msgstr "" #: gajim/common/config.py:272 msgid "" "List of colors, separated by \":\", that will be used to color nicknames in " "group chats." msgstr "" #: gajim/common/config.py:273 msgid "Ctrl-Tab go to next composing tab when none is unread." msgstr "" #: gajim/common/config.py:274 msgid "" "Should we show the confirm metacontacts creation dialog or not? Empty string " "means we never show the dialog." msgstr "" #: gajim/common/config.py:275 msgid "" "Should we show the confirm block contact dialog or not? Empty string means " "we never show the dialog." msgstr "" #: gajim/common/config.py:276 msgid "" "Should we show the confirm custom status dialog or not? Empty string means " "we never show the dialog." msgstr "" #: gajim/common/config.py:277 msgid "" "If True, you will be able to set a negative priority to your account in " "account modification window. BE CAREFUL, when you are logged in with a " "negative priority, you will NOT receive any message from your server." msgstr "" #: gajim/common/config.py:278 msgid "" "If True, Gajim will show number of online and total contacts in account and " "group rows." msgstr "" #: gajim/common/config.py:279 msgid "" "Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " "as if they were of this type" msgstr "" #: gajim/common/config.py:280 msgid "" "If True, Gajim will scroll and select the contact who sent you the last " "message, if chat window is not already opened." msgstr "" #: gajim/common/config.py:281 msgid "Time of inactivity needed before the change status window closes down." msgstr "" #: gajim/common/config.py:282 msgid "" "Maximum number of lines that are printed in conversations. Oldest lines are " "cleared." msgstr "" #: gajim/common/config.py:283 msgid "" "If True, notification windows from notification-daemon will be attached to " "notification icon." msgstr "" #: gajim/common/config.py:284 msgid "Choose interval between 2 checks of idleness." msgstr "" #: gajim/common/config.py:285 msgid "" "Valid uri schemes. Only schemes in this list will be accepted as \"real\" " "uri. (mailto and xmpp are handled separately)" msgstr "" #: gajim/common/config.py:286 msgid "If True, completion in groupchats will be like a shell auto-completion" msgstr "" #: gajim/common/config.py:287 msgid "" "When is self contact row displayed. Can be \"always\", \"when_other_resource" "\" or \"never\"" msgstr "" #: gajim/common/config.py:292 msgid "Optionally fix jingle output video framerate. Example: 10/1 or 25/2" msgstr "" #: gajim/common/config.py:293 msgid "Optionally resize jingle output video. Example: 320x240" msgstr "" #: gajim/common/config.py:294 msgid "If True, You will also see your webcam" msgstr "" #: gajim/common/config.py:297 msgid "" "If True, Gajim will try to use a STUN server when using Jingle. The one in " "\"stun_server\" option, or the one given by the XMPP server." msgstr "" #: gajim/common/config.py:298 msgid "STUN server to use when using Jingle" msgstr "" #: gajim/common/config.py:299 msgid "" "If True, Gajim will show affiliation of groupchat occupants by adding a " "colored square to the status icon" msgstr "" #: gajim/common/config.py:300 msgid "" "Proxy used for all outgoing connections if the account does not have a " "specific proxy configured" msgstr "" #: gajim/common/config.py:301 msgid "If True, Gajim will ignore incoming attention requestd (\"wizz\")." msgstr "" #: gajim/common/config.py:302 msgid "" "If enabled, Gajim will reopen chat windows that were opened last time Gajim " "was closed." msgstr "" #: gajim/common/config.py:303 msgid "" "If enabled, Gajim will show an icon to show that sent message has been " "received by your contact" msgstr "" #: gajim/common/config.py:304 msgid "Show a mini avatar in chat window tabs and in window icon" msgstr "" #: gajim/common/config.py:305 msgid "If True, Gajim will use the Systems Keyring to store account passwords." msgstr "" #: gajim/common/config.py:306 msgid "Sets the encoding used by python-gnupg" msgstr "" #: gajim/common/config.py:307 msgid "If True, Gajim will execute XEP-0146 Commands." msgstr "" #: gajim/common/config.py:308 msgid "All non-compliant MAM Groupchats" msgstr "" #: gajim/common/config.py:324 msgid "" "Priority will change automatically according to your status. Priorities are " "defined in autopriority_* options." msgstr "" #: gajim/common/config.py:332 msgid "" "Status used to autoconnect as. Can be online, chat, away, xa, dnd, " "invisible. NOTE: this option is used only if restore_last_status is disabled" msgstr "" #: gajim/common/config.py:333 msgid "If enabled, restore the last status that was used." msgstr "" #: gajim/common/config.py:335 msgid "" "If True, Contacts requesting authorization will be automatically accepted." msgstr "" #: gajim/common/config.py:336 msgid "" "If False, this account will be disabled and will not appear in roster window." msgstr "" #: gajim/common/config.py:339 msgid "" "If disabled, don't sign presences with GPG key, even if GPG is configured." msgstr "" #: gajim/common/config.py:341 msgid "Enable ESessions encryption for this account." msgstr "" #: gajim/common/config.py:342 msgid "Should Gajim automatically start an encrypted session when possible?" msgstr "" #: gajim/common/config.py:343 msgid "Allow plaintext connections" msgstr "" #: gajim/common/config.py:346 msgid "" "List (space separated) of authentication mechanisms to try. Can contain " "ANONYMOUS, EXTERNAL, GSSAPI, SCRAM-SHA-1-PLUS, SCRAM-SHA-1, DIGEST-MD5, " "PLAIN, X-MESSENGER-OAUTH2 or XEP-0078" msgstr "" #: gajim/common/config.py:347 msgid "" "Show a warning dialog before sending password on an plaintext connection. " "Can be 'warn', 'connect', 'disconnect'" msgstr "" #: gajim/common/config.py:348 msgid "Show a warning dialog before using standard SSL library." msgstr "" #: gajim/common/config.py:349 msgid "" "Show a warning dialog before sending PLAIN password over a plain connection." msgstr "" #: gajim/common/config.py:352 msgid "Space separated list of ssl errors to ignore." msgstr "" #: gajim/common/config.py:358 msgid "" "Space separated list of JIDs for which you do not want to store logs. You " "can also add account name to log nothing for this account." msgstr "" #: gajim/common/config.py:359 msgid "" "On startup, Gajim will download logs stored on server, provided the server " "supports XEP-0313" msgstr "" #: gajim/common/config.py:360 msgid "" "Space separated list of JIDs for which you accept to not log conversations " "if he does not want to." msgstr "" #: gajim/common/config.py:363 msgid "Whitespace sent after inactivity" msgstr "" #: gajim/common/config.py:364 msgid "XMPP ping sent after inactivity" msgstr "" #: gajim/common/config.py:368 msgid "" "How many seconds to wait for the answer of ping alive packet before we try " "to reconnect?" msgstr "" #: gajim/common/config.py:372 msgid "Jabberd2 workaround" msgstr "" #: gajim/common/config.py:375 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." msgstr "" #: gajim/common/config.py:376 msgid "" "If True, Gajim will test file transfer proxies on startup to be sure it " "works. Openfire's proxies are known to fail this test even if they work." msgstr "" #: gajim/common/config.py:389 msgid "Answer to receipt requests" msgstr "" #: gajim/common/config.py:390 msgid "Sent receipt requests" msgstr "" #: gajim/common/config.py:399 msgid "" "Allow Gajim to send information about the operating system you are running." msgstr "" #: gajim/common/config.py:400 msgid "Allow Gajim to send your local time." msgstr "" #: gajim/common/config.py:401 msgid "" "When negotiating an encrypted session, should Gajim assume you want your " "messages to be logged?" msgstr "" #: gajim/common/config.py:404 msgid "Message that is sent to contacts you want to add" msgstr "" #: gajim/common/config.py:405 msgid "" "If enabled and if server supports this feature, Gajim will receive messages " "sent and received by other resources." msgstr "" #: gajim/common/config.py:406 msgid "" "If enabled, Gajim will send your local IPs so your contact can connect to " "your machine to transfer files." msgstr "" #: gajim/common/config.py:407 msgid "Latest token for OAuth 2.0 authentication." msgstr "" #: gajim/common/config.py:408 msgid "client_id for OAuth 2.0 authentication." msgstr "" #: gajim/common/config.py:409 msgid "redirect_url for OAuth 2.0 authentication." msgstr "" #: gajim/common/config.py:410 msgid "" "Space separated list of JIDs for which we want to re-open a chat window on " "next startup." msgstr "" #: gajim/common/config.py:412 msgid "HTTP Upload: Enable HTTPS Verification" msgstr "" #: gajim/common/config.py:413 msgid "" "Preferred file transfer mechanism for file drag&drop on chat window. Can be " "'httpupload' (default) or 'jingle'" msgstr "" #: gajim/common/config.py:476 gajim/common/config.py:481 msgid "Language for which we want to check misspelled words" msgstr "" #: gajim/common/config.py:478 msgid "The currently active encryption for that contact" msgstr "" #: gajim/common/config.py:482 msgid "" "How many lines to request from server when entering a groupchat. -1 means no " "limit, -2 means global value" msgstr "" #: gajim/common/config.py:483 msgid "" "Minutes of backlog to request when entering a groupchat. -1 means no limit, " "-2 means global value" msgstr "" #: gajim/common/config.py:484 msgid "State whether we want a notification for every message in this room" msgstr "" #: gajim/common/config.py:487 msgid "" "State whether plugins should be activated on startup (this is saved on Gajim " "exit). This option SHOULD NOT be used to (de)activate plug-ins. Use GUI " "instead." msgstr "" #: gajim/common/config.py:492 gajim/common/pep.py:157 msgid "Sleeping" msgstr "" #: gajim/common/config.py:493 msgid "Back soon" msgstr "" #: gajim/common/config.py:493 msgid "Back in some minutes." msgstr "" #: gajim/common/config.py:494 gajim/common/pep.py:127 msgid "Eating" msgstr "" #: gajim/common/config.py:494 msgid "I'm eating, so leave me a message." msgstr "" #: gajim/common/config.py:495 msgid "Movie" msgstr "" #: gajim/common/config.py:495 msgid "I'm watching a movie." msgstr "" #: gajim/common/config.py:496 gajim/common/pep.py:186 msgid "Working" msgstr "" #: gajim/common/config.py:496 msgid "I'm working." msgstr "" #: gajim/common/config.py:497 msgid "Phone" msgstr "" #: gajim/common/config.py:497 msgid "I'm on the phone." msgstr "" #: gajim/common/config.py:498 msgid "Out" msgstr "" #: gajim/common/config.py:498 msgid "I'm out enjoying life." msgstr "" #: gajim/common/config.py:509 msgid "I'm available." msgstr "" #: gajim/common/config.py:510 msgid "I'm free for chat." msgstr "" #: gajim/common/config.py:512 msgid "I'm not available." msgstr "" #: gajim/common/config.py:513 msgid "Do not disturb." msgstr "" #: gajim/common/config.py:514 gajim/common/config.py:515 msgid "Bye!" msgstr "" #: gajim/common/config.py:526 msgid "" "Sound to play when a group chat message contains one of the words in " "muc_highlight_words, or when a group chat message contains your nickname." msgstr "" #: gajim/common/config.py:527 msgid "Sound to play when any MUC message arrives." msgstr "" #: gajim/common/config.py:535 gajim/common/optparser.py:357 msgid "green" msgstr "" #: gajim/common/config.py:539 gajim/common/optparser.py:343 msgid "grocery" msgstr "" #: gajim/common/config.py:543 msgid "human" msgstr "" #: gajim/common/config.py:547 msgid "marine" msgstr "" #: gajim/common/config.py:554 msgid "Tor" msgstr "" #: gajim/common/commands.py:86 msgid "Change status information" msgstr "" #: gajim/common/commands.py:108 msgid "Change status" msgstr "" #: gajim/common/commands.py:109 msgid "Set the presence type and description" msgstr "" #: gajim/common/commands.py:115 msgid "Free for chat" msgstr "Lliure per xatejar" #: gajim/common/commands.py:116 msgid "Online" msgstr "Connectat" #: gajim/common/commands.py:118 msgid "Extended away" msgstr "" #: gajim/common/commands.py:119 msgid "Do not disturb" msgstr "" #: gajim/common/commands.py:120 msgid "Offline - disconnect" msgstr "" #: gajim/common/commands.py:125 msgid "Presence description:" msgstr "" #: gajim/common/commands.py:160 gajim/common/commands.py:343 msgid "The status has been changed." msgstr "" #: gajim/common/commands.py:192 gajim/common/commands.py:225 msgid "Leave Groupchats" msgstr "" #: gajim/common/commands.py:215 #, python-format msgid "%(nickname)s on %(room_jid)s" msgstr "" #: gajim/common/commands.py:219 msgid "You have not joined a groupchat." msgstr "" #: gajim/common/commands.py:226 msgid "Choose the groupchats you want to leave" msgstr "" #: gajim/common/commands.py:271 msgid "You left the following groupchats:" msgstr "" #: gajim/common/commands.py:283 msgid "Forward unread messages" msgstr "" #: gajim/common/commands.py:310 msgid "All unread messages have been forwarded." msgstr "" #: gajim/common/commands.py:318 msgid "Forward unread message then disconnect" msgstr "" #: gajim/common/httpupload.py:137 msgid "File is empty" msgstr "" #: gajim/common/httpupload.py:140 msgid "File does not exist" msgstr "" #: gajim/common/httpupload.py:147 gajim/common/httpupload.py:204 #, python-format msgid "File is too large, maximum allowed file size is: %s" msgstr "" #: gajim/common/check_paths.py:37 msgid "creating logs database" msgstr "" #: gajim/common/check_paths.py:98 msgid "creating cache database" msgstr "" #: gajim/common/check_paths.py:261 #, python-format msgid "moving %(src)s to %(dst)s" msgstr "" #: gajim/common/check_paths.py:287 gajim/common/check_paths.py:294 #: gajim/common/check_paths.py:301 gajim/common/check_paths.py:308 #: gajim/common/check_paths.py:315 gajim/common/check_paths.py:322 #: gajim/common/check_paths.py:329 gajim/common/check_paths.py:336 #, python-format msgid "%s is a file but it should be a directory" msgstr "" #: gajim/common/check_paths.py:288 gajim/common/check_paths.py:295 #: gajim/common/check_paths.py:302 gajim/common/check_paths.py:309 #: gajim/common/check_paths.py:316 gajim/common/check_paths.py:323 #: gajim/common/check_paths.py:330 gajim/common/check_paths.py:337 #: gajim/common/check_paths.py:349 gajim/common/check_paths.py:357 msgid "Gajim will now exit" msgstr "" #: gajim/common/check_paths.py:348 gajim/common/check_paths.py:356 #, python-format msgid "%s is a directory but should be a file" msgstr "" #: gajim/common/optparser.py:55 #, python-format msgid "Error: cannot open %s for reading" msgstr "" #: gajim/common/optparser.py:352 gajim/common/optparser.py:353 msgid "cyan" msgstr "" #: gajim/common/optparser.py:421 msgid "migrating logs database to indices" msgstr "" #: gajim/common/logging_helpers.py:34 #, python-format msgid "%s is not a valid loglevel" msgstr "" #: gajim/common/connection.py:83 msgid "Unable to get issuer certificate" msgstr "" #: gajim/common/connection.py:84 msgid "Unable to get certificate CRL" msgstr "" #: gajim/common/connection.py:85 msgid "Unable to decrypt certificate's signature" msgstr "" #: gajim/common/connection.py:86 msgid "Unable to decrypt CRL's signature" msgstr "" #: gajim/common/connection.py:87 msgid "Unable to decode issuer public key" msgstr "" #: gajim/common/connection.py:88 msgid "Certificate signature failure" msgstr "" #: gajim/common/connection.py:89 msgid "CRL signature failure" msgstr "" #: gajim/common/connection.py:90 msgid "Certificate is not yet valid" msgstr "" #: gajim/common/connection.py:91 msgid "Certificate has expired" msgstr "" #: gajim/common/connection.py:92 msgid "CRL is not yet valid" msgstr "" #: gajim/common/connection.py:93 msgid "CRL has expired" msgstr "" #: gajim/common/connection.py:94 msgid "Format error in certificate's notBefore field" msgstr "" #: gajim/common/connection.py:95 msgid "Format error in certificate's notAfter field" msgstr "" #: gajim/common/connection.py:96 msgid "Format error in CRL's lastUpdate field" msgstr "" #: gajim/common/connection.py:97 msgid "Format error in CRL's nextUpdate field" msgstr "" #: gajim/common/connection.py:98 msgid "Out of memory" msgstr "" #: gajim/common/connection.py:99 msgid "Self signed certificate" msgstr "" #: gajim/common/connection.py:100 msgid "Self signed certificate in certificate chain" msgstr "" #: gajim/common/connection.py:101 msgid "Unable to get local issuer certificate" msgstr "" #: gajim/common/connection.py:102 msgid "Unable to verify the first certificate" msgstr "" #: gajim/common/connection.py:103 msgid "Certificate chain too long" msgstr "" #: gajim/common/connection.py:104 msgid "Certificate revoked" msgstr "" #: gajim/common/connection.py:105 msgid "Invalid CA certificate" msgstr "" #: gajim/common/connection.py:106 msgid "Path length constraint exceeded" msgstr "" #: gajim/common/connection.py:107 msgid "Unsupported certificate purpose" msgstr "" #: gajim/common/connection.py:108 msgid "Certificate not trusted" msgstr "" #: gajim/common/connection.py:109 msgid "Certificate rejected" msgstr "" #: gajim/common/connection.py:110 msgid "Subject issuer mismatch" msgstr "" #: gajim/common/connection.py:111 msgid "Authority and subject key identifier mismatch" msgstr "" #: gajim/common/connection.py:112 msgid "Authority and issuer serial number mismatch" msgstr "" #: gajim/common/connection.py:113 msgid "Key usage does not include certificate signing" msgstr "" #: gajim/common/connection.py:114 msgid "Application verification failure" msgstr "" #: gajim/common/connection.py:876 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "" #: gajim/common/connection.py:877 msgid "Reconnect manually." msgstr "" #: gajim/common/connection.py:888 #, python-format msgid "Server %(name)s answered wrongly to register request: %(error)s" msgstr "" #: gajim/common/connection.py:930 #, python-format msgid "Server %s provided a different registration form" msgstr "" #: gajim/common/connection.py:1283 #, python-format msgid "Could not connect to \"%(host)s\" via proxy \"%(proxy)s\"" msgstr "" #: gajim/common/connection.py:1286 #, python-format msgid "Could not connect to \"%(host)s\"" msgstr "" #: gajim/common/connection.py:1293 #, python-format msgid "Server replied: %s" msgstr "" #: gajim/common/connection.py:1308 msgid "Connection to proxy failed" msgstr "" #: gajim/common/connection.py:1346 gajim/common/connection.py:1449 #, python-format msgid "Could not connect to account %s" msgstr "" #: gajim/common/connection.py:1347 gajim/common/connection.py:1450 #, python-format msgid "Connection with account %s has been lost. Retry connecting." msgstr "" #: gajim/common/connection.py:1372 #, python-format msgid "The authenticity of the %s certificate could be invalid" msgstr "" #: gajim/common/connection.py:1375 #, python-format msgid "" "\n" "SSL Error: %s" msgstr "" #: gajim/common/connection.py:1377 #, python-format msgid "" "\n" "Unknown SSL error: %d" msgstr "" #: gajim/common/connection.py:1423 #, python-format msgid "" "The authenticity of the %s certificate could be invalid.\n" "The certificate does not cover this domain." msgstr "" #: gajim/common/connection.py:1473 gajim/common/connection.py:2238 #: gajim/common/zeroconf/connection_zeroconf.py:192 #, python-format msgid "Could not connect to \"%s\"" msgstr "" #: gajim/common/connection.py:1512 #, python-format msgid "Authentication failed with \"%s\"" msgstr "" #: gajim/common/connection.py:1513 msgid "Please check your login and password for correctness." msgstr "" #: gajim/common/connection.py:2097 #, python-format msgid "Sent contact: \"%(jid)s\" (%(name)s)" msgstr "" #: gajim/common/connection.py:2101 msgid "Sent contacts:" msgstr "" #: gajim/common/connection.py:2255 gajim/common/connection.py:2277 msgid "Not fetched because of invisible status" msgstr "" #: gajim/common/dbus_support.py:44 msgid "D-Bus python bindings are missing in this computer" msgstr "" #: gajim/common/dbus_support.py:45 gajim/common/dbus_support.py:56 msgid "D-Bus capabilities of Gajim cannot be used" msgstr "" #: gajim/common/dbus_support.py:55 msgid "D-Bus does not run correctly on this machine" msgstr "" #: gajim/common/dbus_support.py:58 msgid "D-Bus does not run correctly on this machine: system bus not present" msgstr "" #: gajim/common/dbus_support.py:61 msgid "D-Bus does not run correctly on this machine: session bus not present" msgstr "" #: gajim/common/multimedia_helpers.py:45 msgid "Default device" msgstr "" #: gajim/common/multimedia_helpers.py:66 msgid "Audio test" msgstr "" #: gajim/common/multimedia_helpers.py:69 gajim/common/multimedia_helpers.py:85 #: gajim/common/multimedia_helpers.py:99 gajim/common/multimedia_helpers.py:117 msgid "Autodetect" msgstr "" #: gajim/common/multimedia_helpers.py:72 gajim/common/multimedia_helpers.py:87 #, python-format msgid "ALSA: %s" msgstr "" #: gajim/common/multimedia_helpers.py:75 gajim/common/multimedia_helpers.py:89 #, python-format msgid "Pulse: %s" msgstr "" #: gajim/common/multimedia_helpers.py:83 msgid "Fake audio output" msgstr "" #: gajim/common/multimedia_helpers.py:96 msgid "Video test" msgstr "" #: gajim/common/multimedia_helpers.py:101 #, python-format msgid "V4L2: %s" msgstr "" #: gajim/common/multimedia_helpers.py:104 msgid "Screen" msgstr "" #: gajim/common/multimedia_helpers.py:111 msgid "Fake video output" msgstr "" #: gajim/common/multimedia_helpers.py:114 #, python-format msgid "X Window System (X11/XShm/Xv): %s" msgstr "" #: gajim/common/multimedia_helpers.py:116 msgid "X Window System (without Xv)" msgstr "" #: gajim/common/pep.py:27 msgid "Afraid" msgstr "" #: gajim/common/pep.py:28 msgid "Amazed" msgstr "" #: gajim/common/pep.py:29 msgid "Amorous" msgstr "" #: gajim/common/pep.py:30 msgid "Angry" msgstr "" #: gajim/common/pep.py:31 msgid "Annoyed" msgstr "" #: gajim/common/pep.py:32 msgid "Anxious" msgstr "" #: gajim/common/pep.py:33 msgid "Aroused" msgstr "" #: gajim/common/pep.py:34 msgid "Ashamed" msgstr "" #: gajim/common/pep.py:35 msgid "Bored" msgstr "" #: gajim/common/pep.py:36 msgid "Brave" msgstr "" #: gajim/common/pep.py:37 msgid "Calm" msgstr "" #: gajim/common/pep.py:38 msgid "Cautious" msgstr "" #: gajim/common/pep.py:39 msgid "Cold" msgstr "" #: gajim/common/pep.py:40 msgid "Confident" msgstr "" #: gajim/common/pep.py:41 msgid "Confused" msgstr "" #: gajim/common/pep.py:42 msgid "Contemplative" msgstr "" #: gajim/common/pep.py:43 msgid "Contented" msgstr "" #: gajim/common/pep.py:44 msgid "Cranky" msgstr "" #: gajim/common/pep.py:45 msgid "Crazy" msgstr "" #: gajim/common/pep.py:46 msgid "Creative" msgstr "" #: gajim/common/pep.py:47 msgid "Curious" msgstr "" #: gajim/common/pep.py:48 msgid "Dejected" msgstr "" #: gajim/common/pep.py:49 msgid "Depressed" msgstr "" #: gajim/common/pep.py:50 msgid "Disappointed" msgstr "" #: gajim/common/pep.py:51 msgid "Disgusted" msgstr "" #: gajim/common/pep.py:52 msgid "Dismayed" msgstr "" #: gajim/common/pep.py:53 msgid "Distracted" msgstr "" #: gajim/common/pep.py:54 msgid "Embarrassed" msgstr "" #: gajim/common/pep.py:55 msgid "Envious" msgstr "" #: gajim/common/pep.py:56 msgid "Excited" msgstr "" #: gajim/common/pep.py:57 msgid "Flirtatious" msgstr "" #: gajim/common/pep.py:58 msgid "Frustrated" msgstr "" #: gajim/common/pep.py:59 msgid "Grateful" msgstr "" #: gajim/common/pep.py:60 msgid "Grieving" msgstr "" #: gajim/common/pep.py:61 msgid "Grumpy" msgstr "" #: gajim/common/pep.py:62 msgid "Guilty" msgstr "" #: gajim/common/pep.py:63 msgid "Happy" msgstr "" #: gajim/common/pep.py:64 msgid "Hopeful" msgstr "" #: gajim/common/pep.py:65 msgid "Hot" msgstr "" #: gajim/common/pep.py:66 msgid "Humbled" msgstr "" #: gajim/common/pep.py:67 msgid "Humiliated" msgstr "" #: gajim/common/pep.py:68 msgid "Hungry" msgstr "" #: gajim/common/pep.py:69 msgid "Hurt" msgstr "" #: gajim/common/pep.py:70 msgid "Impressed" msgstr "" #: gajim/common/pep.py:71 msgid "In Awe" msgstr "" #: gajim/common/pep.py:72 msgid "In Love" msgstr "" #: gajim/common/pep.py:73 msgid "Indignant" msgstr "" #: gajim/common/pep.py:74 msgid "Interested" msgstr "" #: gajim/common/pep.py:75 msgid "Intoxicated" msgstr "" #: gajim/common/pep.py:76 msgid "Invincible" msgstr "" #: gajim/common/pep.py:77 msgid "Jealous" msgstr "" #: gajim/common/pep.py:78 msgid "Lonely" msgstr "" #: gajim/common/pep.py:79 msgid "Lost" msgstr "" #: gajim/common/pep.py:80 msgid "Lucky" msgstr "" #: gajim/common/pep.py:81 msgid "Mean" msgstr "" #: gajim/common/pep.py:82 msgid "Moody" msgstr "" #: gajim/common/pep.py:83 msgid "Nervous" msgstr "" #: gajim/common/pep.py:84 msgid "Neutral" msgstr "" #: gajim/common/pep.py:85 msgid "Offended" msgstr "" #: gajim/common/pep.py:86 msgid "Outraged" msgstr "" #: gajim/common/pep.py:87 msgid "Playful" msgstr "" #: gajim/common/pep.py:88 msgid "Proud" msgstr "" #: gajim/common/pep.py:89 msgid "Relaxed" msgstr "" #: gajim/common/pep.py:90 msgid "Relieved" msgstr "" #: gajim/common/pep.py:91 msgid "Remorseful" msgstr "" #: gajim/common/pep.py:92 msgid "Restless" msgstr "" #: gajim/common/pep.py:93 msgid "Sad" msgstr "" #: gajim/common/pep.py:94 msgid "Sarcastic" msgstr "" #: gajim/common/pep.py:95 msgid "Satisfied" msgstr "" #: gajim/common/pep.py:96 msgid "Serious" msgstr "" #: gajim/common/pep.py:97 msgid "Shocked" msgstr "" #: gajim/common/pep.py:98 msgid "Shy" msgstr "" #: gajim/common/pep.py:99 msgid "Sick" msgstr "" #: gajim/common/pep.py:100 msgid "Sleepy" msgstr "" #: gajim/common/pep.py:101 msgid "Spontaneous" msgstr "" #: gajim/common/pep.py:102 msgid "Stressed" msgstr "" #: gajim/common/pep.py:103 msgid "Strong" msgstr "" #: gajim/common/pep.py:104 msgid "Surprised" msgstr "" #: gajim/common/pep.py:105 msgid "Thankful" msgstr "" #: gajim/common/pep.py:106 msgid "Thirsty" msgstr "" #: gajim/common/pep.py:107 msgid "Tired" msgstr "" #: gajim/common/pep.py:108 msgid "Undefined" msgstr "" #: gajim/common/pep.py:109 msgid "Weak" msgstr "" #: gajim/common/pep.py:110 msgid "Worried" msgstr "" #: gajim/common/pep.py:113 msgid "Doing Chores" msgstr "" #: gajim/common/pep.py:114 msgid "Buying Groceries" msgstr "" #: gajim/common/pep.py:115 msgid "Cleaning" msgstr "" #: gajim/common/pep.py:116 msgid "Cooking" msgstr "" #: gajim/common/pep.py:117 msgid "Doing Maintenance" msgstr "" #: gajim/common/pep.py:118 msgid "Doing the Dishes" msgstr "" #: gajim/common/pep.py:119 msgid "Doing the Laundry" msgstr "" #: gajim/common/pep.py:120 msgid "Gardening" msgstr "" #: gajim/common/pep.py:121 msgid "Running an Errand" msgstr "" #: gajim/common/pep.py:122 msgid "Walking the Dog" msgstr "" #: gajim/common/pep.py:123 msgid "Drinking" msgstr "" #: gajim/common/pep.py:124 msgid "Having a Beer" msgstr "" #: gajim/common/pep.py:125 msgid "Having Coffee" msgstr "" #: gajim/common/pep.py:126 msgid "Having Tea" msgstr "" #: gajim/common/pep.py:128 msgid "Having a Snack" msgstr "" #: gajim/common/pep.py:129 msgid "Having Breakfast" msgstr "" #: gajim/common/pep.py:130 msgid "Having Dinner" msgstr "" #: gajim/common/pep.py:131 msgid "Having Lunch" msgstr "" #: gajim/common/pep.py:132 msgid "Exercising" msgstr "" #: gajim/common/pep.py:133 gajim/common/pep.py:178 msgid "Cycling" msgstr "" #: gajim/common/pep.py:134 msgid "Dancing" msgstr "" #: gajim/common/pep.py:135 msgid "Hiking" msgstr "" #: gajim/common/pep.py:136 msgid "Jogging" msgstr "" #: gajim/common/pep.py:137 msgid "Playing Sports" msgstr "" #: gajim/common/pep.py:138 msgid "Running" msgstr "" #: gajim/common/pep.py:139 msgid "Skiing" msgstr "" #: gajim/common/pep.py:140 msgid "Swimming" msgstr "" #: gajim/common/pep.py:141 msgid "Working out" msgstr "" #: gajim/common/pep.py:142 msgid "Grooming" msgstr "" #: gajim/common/pep.py:143 msgid "At the Spa" msgstr "" #: gajim/common/pep.py:144 msgid "Brushing Teeth" msgstr "" #: gajim/common/pep.py:145 msgid "Getting a Haircut" msgstr "" #: gajim/common/pep.py:146 msgid "Shaving" msgstr "" #: gajim/common/pep.py:147 msgid "Taking a Bath" msgstr "" #: gajim/common/pep.py:148 msgid "Taking a Shower" msgstr "" #: gajim/common/pep.py:149 msgid "Having an Appointment" msgstr "" #: gajim/common/pep.py:150 gajim/data/gui/gajim_themes_window.ui:363 msgid "Inactive" msgstr "Inactiva" #: gajim/common/pep.py:151 msgid "Day Off" msgstr "" #: gajim/common/pep.py:152 msgid "Hanging out" msgstr "" #: gajim/common/pep.py:153 msgid "Hiding" msgstr "" #: gajim/common/pep.py:154 msgid "On Vacation" msgstr "" #: gajim/common/pep.py:155 msgid "Praying" msgstr "" #: gajim/common/pep.py:156 msgid "Scheduled Holiday" msgstr "" #: gajim/common/pep.py:158 msgid "Thinking" msgstr "" #: gajim/common/pep.py:159 msgid "Relaxing" msgstr "" #: gajim/common/pep.py:160 msgid "Fishing" msgstr "" #: gajim/common/pep.py:161 msgid "Gaming" msgstr "" #: gajim/common/pep.py:162 msgid "Going out" msgstr "" #: gajim/common/pep.py:163 msgid "Partying" msgstr "" #: gajim/common/pep.py:164 msgid "Reading" msgstr "" #: gajim/common/pep.py:165 msgid "Rehearsing" msgstr "" #: gajim/common/pep.py:166 msgid "Shopping" msgstr "" #: gajim/common/pep.py:167 msgid "Smoking" msgstr "" #: gajim/common/pep.py:168 msgid "Socializing" msgstr "" #: gajim/common/pep.py:169 msgid "Sunbathing" msgstr "" #: gajim/common/pep.py:170 msgid "Watching TV" msgstr "" #: gajim/common/pep.py:171 msgid "Watching a Movie" msgstr "" #: gajim/common/pep.py:172 msgid "Talking" msgstr "" #: gajim/common/pep.py:173 msgid "In Real Life" msgstr "" #: gajim/common/pep.py:174 msgid "On the Phone" msgstr "" #: gajim/common/pep.py:175 msgid "On Video Phone" msgstr "" #: gajim/common/pep.py:176 msgid "Traveling" msgstr "" #: gajim/common/pep.py:177 msgid "Commuting" msgstr "" #: gajim/common/pep.py:179 msgid "Driving" msgstr "" #: gajim/common/pep.py:180 msgid "In a Car" msgstr "" #: gajim/common/pep.py:181 msgid "On a Bus" msgstr "" #: gajim/common/pep.py:182 msgid "On a Plane" msgstr "" #: gajim/common/pep.py:183 msgid "On a Train" msgstr "" #: gajim/common/pep.py:184 msgid "On a Trip" msgstr "" #: gajim/common/pep.py:185 msgid "Walking" msgstr "" #: gajim/common/pep.py:187 msgid "Coding" msgstr "" #: gajim/common/pep.py:188 msgid "In a Meeting" msgstr "" #: gajim/common/pep.py:189 msgid "Studying" msgstr "" #: gajim/common/pep.py:190 msgid "Writing" msgstr "" #: gajim/common/pep.py:195 msgid "accuracy" msgstr "" #: gajim/common/pep.py:196 msgid "alt" msgstr "" #: gajim/common/pep.py:197 msgid "area" msgstr "" #: gajim/common/pep.py:198 msgid "bearing" msgstr "" #: gajim/common/pep.py:199 msgid "building" msgstr "" #: gajim/common/pep.py:200 msgid "country" msgstr "" #: gajim/common/pep.py:201 msgid "countrycode" msgstr "" #: gajim/common/pep.py:202 msgid "datum" msgstr "" #: gajim/common/pep.py:203 msgid "description" msgstr "" #: gajim/common/pep.py:204 msgid "error" msgstr "" #: gajim/common/pep.py:205 msgid "floor" msgstr "" #: gajim/common/pep.py:206 msgid "lat" msgstr "" #: gajim/common/pep.py:207 msgid "locality" msgstr "" #: gajim/common/pep.py:208 msgid "lon" msgstr "" #: gajim/common/pep.py:209 msgid "postalcode" msgstr "" #: gajim/common/pep.py:210 msgid "region" msgstr "" #: gajim/common/pep.py:211 msgid "room" msgstr "" #: gajim/common/pep.py:212 msgid "speed" msgstr "" #: gajim/common/pep.py:213 msgid "street" msgstr "" #: gajim/common/pep.py:214 msgid "text" msgstr "" #: gajim/common/pep.py:215 msgid "timestamp" msgstr "" #: gajim/common/pep.py:216 msgid "uri" msgstr "" #: gajim/common/pep.py:343 msgid "Unknown Artist" msgstr "" #: gajim/common/pep.py:346 msgid "Unknown Title" msgstr "" #: gajim/common/pep.py:349 msgid "Unknown Source" msgstr "" #: gajim/common/pep.py:352 #, python-format msgid "" "\"%(title)s\" by %(artist)s\n" "from %(source)s" msgstr "" #: gajim/common/stanza_session.py:422 msgid "" "[This is part of an encrypted session. If you see this message, something " "went wrong.]" msgstr "" #: gajim/common/jingle_rtp.py:123 #, python-format msgid "%s configuration error" msgstr "" #: gajim/common/jingle_rtp.py:124 #, python-format msgid "" "Couldn’t setup %(text)s. Check your configuration.\n" "\n" "Pipeline was:\n" "%(pipeline)s\n" "\n" "Error was:\n" "%(error)s" msgstr "" #: gajim/common/jingle_rtp.py:371 msgid "audio input" msgstr "" #: gajim/common/jingle_rtp.py:375 msgid "audio output" msgstr "" #: gajim/common/jingle_rtp.py:433 msgid "video input" msgstr "" #: gajim/common/jingle_rtp.py:440 msgid "video output" msgstr "" #: gajim/common/helpers.py:296 msgid "Server must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:304 msgid "Invalid character in hostname." msgstr "" #: gajim/common/helpers.py:306 msgid "Server address required." msgstr "" #: gajim/common/helpers.py:310 msgid "Username must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:318 msgid "Invalid character in username." msgstr "" #: gajim/common/helpers.py:324 msgid "Resource must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:332 msgid "Invalid character in resource." msgstr "" #: gajim/common/helpers.py:372 msgid "_Busy" msgstr "Ocupat" #: gajim/common/helpers.py:377 msgid "_Not Available" msgstr "_No Disponible" #: gajim/common/helpers.py:382 msgid "_Free for Chat" msgstr "" #: gajim/common/helpers.py:387 msgid "?user status:_Available" msgstr "?user status:_Disponible" #: gajim/common/helpers.py:391 msgid "Connecting" msgstr "" #: gajim/common/helpers.py:394 msgid "A_way" msgstr "" #: gajim/common/helpers.py:399 msgid "_Offline" msgstr "Desconnectat" #: gajim/common/helpers.py:404 msgid "_Invisible" msgstr "_Invisible" #: gajim/common/helpers.py:410 msgid "?contact has status:Unknown" msgstr "" #: gajim/common/helpers.py:412 msgid "?contact has status:Has errors" msgstr "" #: gajim/common/helpers.py:427 msgid "?Subscription we already have:None" msgstr "" #: gajim/common/helpers.py:429 msgid "To" msgstr "" #: gajim/common/helpers.py:431 msgid "From" msgstr "" #: gajim/common/helpers.py:433 msgid "Both" msgstr "" #: gajim/common/helpers.py:435 msgid "Unknown" msgstr "" #: gajim/common/helpers.py:441 msgid "?Ask (for Subscription):None" msgstr "" #: gajim/common/helpers.py:443 msgid "Subscribe" msgstr "" #: gajim/common/helpers.py:452 msgid "?Group Chat Contact Role:None" msgstr "" #: gajim/common/helpers.py:455 msgid "Moderators" msgstr "Moderadors" #: gajim/common/helpers.py:457 msgid "Moderator" msgstr "" #: gajim/common/helpers.py:460 msgid "Participants" msgstr "" #: gajim/common/helpers.py:462 msgid "Participant" msgstr "" #: gajim/common/helpers.py:465 msgid "Visitors" msgstr "" #: gajim/common/helpers.py:467 msgid "Visitor" msgstr "" #: gajim/common/helpers.py:518 msgid "is paying attention to the conversation" msgstr "" #: gajim/common/helpers.py:520 msgid "is doing something else" msgstr "" #: gajim/common/helpers.py:522 msgid "is composing a message…" msgstr "" #: gajim/common/helpers.py:525 msgid "paused composing a message" msgstr "" #: gajim/common/helpers.py:527 msgid "has closed the chat window or tab" msgstr "" #: gajim/common/helpers.py:754 #, python-format msgid "%s GiB" msgstr "" #: gajim/common/helpers.py:757 #, python-format msgid "%s GB" msgstr "" #: gajim/common/helpers.py:761 #, python-format msgid "%s MiB" msgstr "" #: gajim/common/helpers.py:764 #, python-format msgid "%s MB" msgstr "" #: gajim/common/helpers.py:768 #, python-format msgid "%s KiB" msgstr "" #: gajim/common/helpers.py:771 #, python-format msgid "%s KB" msgstr "" #: gajim/common/helpers.py:774 #, python-format msgid "%s B" msgstr "" #: gajim/common/helpers.py:1141 gajim/common/helpers.py:1148 #, python-format msgid "%d message pending" msgid_plural "%d messages pending" msgstr[0] "" msgstr[1] "" #: gajim/common/helpers.py:1155 #, python-format msgid "from room %s" msgstr "" #: gajim/common/helpers.py:1158 gajim/common/helpers.py:1175 #, python-format msgid "from user %s" msgstr "" #: gajim/common/helpers.py:1160 #, python-format msgid "from %s" msgstr "" #: gajim/common/helpers.py:1167 gajim/common/helpers.py:1173 #, python-format msgid "%d event pending" msgid_plural "%d events pending" msgstr[0] "" msgstr[1] "" #: gajim/common/helpers.py:1191 gajim/common/helpers.py:1203 #: gajim/data/gui/roster_window.ui:85 data/org.gajim.Gajim.desktop.in:4 #: data/org.gajim.Gajim.appdata.xml.in:9 msgid "Gajim" msgstr "Gajim" #: gajim/common/helpers.py:1205 #, python-format msgid "Gajim - %s" msgstr "" #: gajim/common/helpers.py:1392 gajim/data/gui/add_new_contact_window.ui:24 msgid "I would like to add you to my contact list." msgstr "Voldria afegir-te a la meva llista de contactes." #: gajim/common/helpers.py:1394 msgid "Hello, I am $name." msgstr "" #: gajim/common/helpers.py:1508 gajim/common/helpers.py:1517 #: gajim/common/helpers.py:1576 msgid "Timeout loading image" msgstr "" #: gajim/common/helpers.py:1527 gajim/common/helpers.py:1574 msgid "Image is too big" msgstr "" #: gajim/common/helpers.py:1538 msgid "PyCURL is not installed" msgstr "" #: gajim/common/helpers.py:1578 msgid "Error loading image" msgstr "" #: gajim/common/connection_handlers.py:133 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "" #: gajim/common/connection_handlers.py:979 msgid "This message was encrypted with OTR and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:982 msgid "" "This message was encrypted with Legacy OpenPGP and could not be decrypted. " "You can install the PGP plugin to handle those messages." msgstr "" #: gajim/common/connection_handlers.py:986 msgid "" "This message was encrypted with OpenPGP for XMPP and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:992 #, python-format msgid "This message was encrypted with %s and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:1060 msgid "message" msgstr "missatge" #: gajim/common/connection_handlers.py:1863 msgid "I would like to add you to my roster." msgstr "" #: gajim/common/exceptions.py:46 #, python-format msgid "" "The database file (%s) cannot be read. Try to repair it (see https://dev." "gajim.org/gajim/gajim/wikis/help/DatabaseBackup) or remove it (all history " "will be lost)." msgstr "" #: gajim/common/exceptions.py:60 msgid "Service not available: Gajim is not running, or remote_control is False" msgstr "" #: gajim/common/exceptions.py:82 #, python-format msgid "" "Session bus is not available.\n" "Try reading %(url)s" msgstr "" #: gajim/common/exceptions.py:94 #, python-format msgid "" "System bus is not available.\n" "Try reading %(url)s" msgstr "" #: gajim/common/zeroconf/connection_zeroconf.py:193 msgid "Please check if Avahi or Bonjour is installed." msgstr "" #: gajim/common/zeroconf/connection_zeroconf.py:203 #: gajim/common/zeroconf/connection_zeroconf.py:207 msgid "Could not start local service" msgstr "" #: gajim/common/zeroconf/connection_zeroconf.py:204 #, python-format msgid "Unable to bind to port %d." msgstr "" #: gajim/common/zeroconf/connection_zeroconf.py:208 #: gajim/common/zeroconf/connection_zeroconf.py:293 #: gajim/common/zeroconf/connection_zeroconf.py:306 #: gajim/common/zeroconf/connection_zeroconf.py:322 msgid "Please check if avahi-daemon is running." msgstr "" #: gajim/common/zeroconf/connection_zeroconf.py:292 #: gajim/common/zeroconf/connection_zeroconf.py:305 #: gajim/common/zeroconf/connection_zeroconf.py:321 #, python-format msgid "Could not change status of account \"%s\"" msgstr "" #: gajim/common/zeroconf/connection_zeroconf.py:337 msgid "Your message could not be sent." msgstr "" #: gajim/common/zeroconf/connection_zeroconf.py:352 msgid "Contact is offline. Your message could not be sent." msgstr "" #: gajim/common/zeroconf/connection_zeroconf.py:374 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "" #: gajim/common/zeroconf/zeroconf_bonjour.py:197 #: gajim/common/zeroconf/zeroconf_avahi.py:220 #, python-format msgid "Error while adding service. %s" msgstr "" #: gajim/data/gui/blocked_contacts_window.ui:13 msgid "Blocked Contacts" msgstr "Contactes blocats" #: gajim/data/gui/advanced_configuration_window.ui:13 msgid "Advanced Configuration Editor" msgstr "Editor de Configuració Avançada" #: gajim/data/gui/advanced_configuration_window.ui:35 msgid "Filter:" msgstr "Filtra:" #: gajim/data/gui/advanced_configuration_window.ui:107 #: gajim/data/gui/features_window.ui:111 msgid "Description" msgstr "Descripció" #: gajim/data/gui/advanced_configuration_window.ui:136 msgid "NOTE: You should restart Gajim for some settings to take effect" msgstr "" "NOTA: Hauries de reiniciar Gajim per a que la configuració tingui " "efecte" #: gajim/data/gui/advanced_configuration_window.ui:161 msgid "_Reset to default" msgstr "_Reinicia a configuració per defecte" #: gajim/data/gui/join_groupchat_window.ui:34 #, fuzzy msgid "Bookmark this Groupchat" msgstr "Afegeix aquesta sala a les adreces d'interès" #: gajim/data/gui/join_groupchat_window.ui:51 msgid "Join this Groupchat everytime Gajim is started" msgstr "" #: gajim/data/gui/join_groupchat_window.ui:69 #, fuzzy msgid "Bookmark" msgstr "Adreça d'interès" #: gajim/data/gui/join_groupchat_window.ui:82 #, fuzzy msgid "Autojoin" msgstr "Entra automàticament" #: gajim/data/gui/join_groupchat_window.ui:119 msgid "Account" msgstr "Compte" #: gajim/data/gui/join_groupchat_window.ui:226 #, fuzzy msgid "Room" msgstr "Sala:" #: gajim/data/gui/join_groupchat_window.ui:238 #, fuzzy msgid "Recently" msgstr "Recentment:" #: gajim/data/gui/join_groupchat_window.ui:290 msgid "Search the rooms on this server" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:12 msgid "HTTP Connect" msgstr "Connecta HTTP" #: gajim/data/gui/manage_proxies_window.ui:15 msgid "SOCKS5" msgstr "SOCKS5" #: gajim/data/gui/manage_proxies_window.ui:18 msgid "BOSH" msgstr "BOSH" #: gajim/data/gui/manage_proxies_window.ui:25 msgid "Manage Proxy Profiles" msgstr "Gestió de perfils de proxy" #: gajim/data/gui/manage_proxies_window.ui:148 msgid "_Name:" msgstr "_Nom:" #: gajim/data/gui/manage_proxies_window.ui:161 msgid "_Type:" msgstr "_Tipus:" #: gajim/data/gui/manage_proxies_window.ui:205 msgid "Properties" msgstr "Propietats" #: gajim/data/gui/manage_proxies_window.ui:234 msgid "_BOSH URL:" msgstr "URL BOSH:" #: gajim/data/gui/manage_proxies_window.ui:258 msgid "Proxy _Host:" msgstr "Servidor intermediari:" #: gajim/data/gui/manage_proxies_window.ui:269 msgid "Use HTTP prox_y" msgstr "Utilitza un servidor intermediari d'HTTP" #: gajim/data/gui/manage_proxies_window.ui:288 msgid "Proxy _Port:" msgstr "Port del servidor intermediari:" #: gajim/data/gui/manage_proxies_window.ui:299 msgid "Use proxy auth_entication" msgstr "Fa ús d'autenticació proxy" #: gajim/data/gui/manage_proxies_window.ui:318 msgid "_Username:" msgstr "_Nom d'usuari:" #: gajim/data/gui/manage_proxies_window.ui:331 msgid "Pass_word:" msgstr "Contrasenya:" #: gajim/data/gui/manage_proxies_window.ui:391 msgid "Settings" msgstr "Configuració" #: gajim/data/gui/change_password_dialog.ui:89 msgid "Enter new password:" msgstr "Escriu nova contrasenya:" #: gajim/data/gui/change_password_dialog.ui:115 msgid "Enter it again for confirmation:" msgstr "Torna-ho a escriure per a confirmació:" #: gajim/data/gui/zeroconf_information_window.ui:8 #: gajim/data/gui/vcard_information_window.ui:8 msgid "Contact Information" msgstr "" #: gajim/data/gui/zeroconf_information_window.ui:54 msgid "Local jid:" msgstr "" #: gajim/data/gui/zeroconf_information_window.ui:67 #: gajim/data/gui/tooltip_roster_contact.ui:55 #: gajim/data/gui/tooltip_gc_contact.ui:75 msgid "Resource:" msgstr "" #: gajim/data/gui/zeroconf_information_window.ui:80 #: gajim/data/gui/tooltip_roster_contact.ui:110 msgid "Status:" msgstr "" #: gajim/data/gui/zeroconf_information_window.ui:89 #: gajim/data/gui/history_window.ui:290 msgid "_Log conversation history" msgstr "Registra _les converses" #: gajim/data/gui/zeroconf_information_window.ui:215 #: gajim/data/gui/vcard_information_window.ui:360 msgid "Contact" msgstr "" #: gajim/data/gui/zeroconf_information_window.ui:234 msgid "First Name:" msgstr "Nom:" #: gajim/data/gui/zeroconf_information_window.ui:247 msgid "Last Name:" msgstr "Cognom:" #: gajim/data/gui/zeroconf_information_window.ui:260 #: gajim/data/gui/archiving_313_preferences_item.ui:84 #: gajim/data/gui/tooltip_roster_contact.ui:30 #: gajim/data/gui/tooltip_gc_contact.ui:50 msgid "Jabber ID:" msgstr "ID de Jabber:" #: gajim/data/gui/zeroconf_information_window.ui:273 msgid "E-Mail:" msgstr "Correu electrònic:" #: gajim/data/gui/zeroconf_information_window.ui:354 msgid "Personal" msgstr "" #: gajim/data/gui/gc_occupants_menu.ui:12 msgid "_Send Private Message" msgstr "Envia Missatge Privat" #: gajim/data/gui/gc_occupants_menu.ui:21 msgid "Send _File" msgstr "Envia _Fitxer" #: gajim/data/gui/gc_occupants_menu.ui:29 msgid "Occupant Actions" msgstr "Accions Ocupant" #: gajim/data/gui/gc_occupants_menu.ui:38 msgid "_Voice" msgstr "_Veu" #: gajim/data/gui/gc_occupants_menu.ui:46 msgid "Mo_derator" msgstr "Mo_derador" #: gajim/data/gui/gc_occupants_menu.ui:60 msgid "_Member" msgstr "_Membre" #: gajim/data/gui/gc_occupants_menu.ui:68 msgid "_Admin" msgstr "_Administra" #: gajim/data/gui/gc_occupants_menu.ui:76 msgid "_Owner" msgstr "Propietari" #: gajim/data/gui/gc_occupants_menu.ui:90 msgid "_Kick" msgstr "Fes fora" #: gajim/data/gui/gc_occupants_menu.ui:98 msgid "_Ban" msgstr "_Bandeja" #: gajim/data/gui/gc_occupants_menu.ui:124 msgid "_Add to Roster" msgstr "_Afegeix a llista de contactes" #: gajim/data/gui/gc_occupants_menu.ui:132 #, fuzzy msgid "_Execute command" msgstr "_Executa Comanda...." #: gajim/data/gui/archiving_313_preferences_item.ui:12 #: gajim/data/gui/preferences_window.ui:102 #: gajim/data/gui/preferences_window.ui:153 #: gajim/data/gui/archiving_313_preferences_window.ui:25 msgid "Always" msgstr "Sempre" #: gajim/data/gui/archiving_313_preferences_item.ui:15 #: gajim/data/gui/preferences_window.ui:96 #: gajim/data/gui/preferences_window.ui:156 #: gajim/data/gui/archiving_313_preferences_window.ui:31 msgid "Never" msgstr "Mai" #: gajim/data/gui/archiving_313_preferences_item.ui:96 msgid "Preference:" msgstr "Preferència:" #: gajim/data/gui/tooltip_roster_contact.ui:125 msgid "Idle since:" msgstr "" #: gajim/data/gui/tooltip_roster_contact.ui:151 #: gajim/data/gui/change_status_message_dialog.ui:191 msgid "Mood:" msgstr "Estat d'Ànim:" #: gajim/data/gui/tooltip_roster_contact.ui:164 #: gajim/data/gui/change_status_message_dialog.ui:179 msgid "Activity:" msgstr "Activitat:" #: gajim/data/gui/tooltip_roster_contact.ui:178 msgid "Tune:" msgstr "" #: gajim/data/gui/tooltip_roster_contact.ui:191 msgid "Location:" msgstr "" #: gajim/data/gui/tooltip_roster_contact.ui:255 msgid "OpenPGP:" msgstr "" #: gajim/data/gui/tooltip_roster_contact.ui:281 msgid "Subscription:" msgstr "" #: gajim/data/gui/zeroconf_context_menu.ui:11 #: gajim/data/gui/account_context_menu.ui:11 msgid "_Status" msgstr "Estat" #: gajim/data/gui/zeroconf_context_menu.ui:26 #: gajim/data/gui/account_context_menu.ui:79 msgid "_Modify Account..." msgstr "_Modifica Compte..." #: gajim/data/gui/atom_entry_window.ui:8 msgid "New entry received" msgstr "S'ha rebut una nova entrada" #: gajim/data/gui/atom_entry_window.ui:92 msgid "Feed name:" msgstr "Nom de feed:" #: gajim/data/gui/atom_entry_window.ui:119 msgid "Entry:" msgstr "Entrada:" #: gajim/data/gui/atom_entry_window.ui:131 msgid "Last modified:" msgstr "Última modificació:" #: gajim/data/gui/atom_entry_window.ui:196 msgid "Next entry" msgstr "Entrada següent" #: gajim/data/gui/gc_control_popup_menu.ui:11 msgid "Change _Nickname..." msgstr "Canvia _Nick..." #: gajim/data/gui/gc_control_popup_menu.ui:20 msgid "_Manage Room" msgstr "Gestiona Sala" #: gajim/data/gui/gc_control_popup_menu.ui:31 msgid "Change _Subject..." msgstr "Canvia Tema..." #: gajim/data/gui/gc_control_popup_menu.ui:38 msgid "Configure _Room..." msgstr "Configura Sala..." #: gajim/data/gui/gc_control_popup_menu.ui:52 msgid "_Destroy Room" msgstr "_Destrueix Sala" #: gajim/data/gui/gc_control_popup_menu.ui:64 msgid "_Minimize on close" msgstr "_Minimitza en tancar" #: gajim/data/gui/gc_control_popup_menu.ui:85 msgid "_Request Voice" msgstr "Sol.licita Veu" #: gajim/data/gui/profile_window.ui:7 msgid "Personal Information" msgstr "Informació personal" #: gajim/data/gui/profile_window.ui:35 #: gajim/data/gui/vcard_information_window.ui:382 msgid "Name:" msgstr "" #: gajim/data/gui/profile_window.ui:59 #: gajim/data/gui/vcard_information_window.ui:410 msgid "Nickname:" msgstr "" #. Family Name #: gajim/data/gui/profile_window.ui:94 #: gajim/data/gui/vcard_information_window.ui:740 msgid "Family:" msgstr "" #. Given Name #: gajim/data/gui/profile_window.ui:118 #: gajim/data/gui/vcard_information_window.ui:822 msgid "Given:" msgstr "" #. Middle Name #: gajim/data/gui/profile_window.ui:142 #: gajim/data/gui/vcard_information_window.ui:753 msgid "Middle:" msgstr "" #. Prefix in Name #: gajim/data/gui/profile_window.ui:156 #: gajim/data/gui/vcard_information_window.ui:766 msgid "Prefix:" msgstr "" #. Suffix in Name #: gajim/data/gui/profile_window.ui:190 #: gajim/data/gui/vcard_information_window.ui:835 msgid "Suffix:" msgstr "" #: gajim/data/gui/profile_window.ui:222 #: gajim/data/gui/vcard_information_window.ui:878 msgid "Full Name" msgstr "" #: gajim/data/gui/profile_window.ui:250 gajim/data/gui/profile_window.ui:724 #: gajim/data/gui/vcard_information_window.ui:454 #: gajim/data/gui/vcard_information_window.ui:1087 msgid "Street:" msgstr "" #: gajim/data/gui/profile_window.ui:274 gajim/data/gui/profile_window.ui:748 #: gajim/data/gui/vcard_information_window.ui:535 #: gajim/data/gui/vcard_information_window.ui:1126 msgid "Extra Address:" msgstr "" #: gajim/data/gui/profile_window.ui:298 gajim/data/gui/profile_window.ui:772 #: gajim/data/gui/vcard_information_window.ui:467 #: gajim/data/gui/vcard_information_window.ui:1100 msgid "City:" msgstr "" #: gajim/data/gui/profile_window.ui:322 gajim/data/gui/profile_window.ui:796 #: gajim/data/gui/vcard_information_window.ui:548 #: gajim/data/gui/vcard_information_window.ui:1140 msgid "Postal Code:" msgstr "" #: gajim/data/gui/profile_window.ui:346 gajim/data/gui/profile_window.ui:820 #: gajim/data/gui/vcard_information_window.ui:480 #: gajim/data/gui/vcard_information_window.ui:1113 msgid "State:" msgstr "" #: gajim/data/gui/profile_window.ui:370 gajim/data/gui/profile_window.ui:844 #: gajim/data/gui/vcard_information_window.ui:561 #: gajim/data/gui/vcard_information_window.ui:1153 msgid "Country:" msgstr "" #: gajim/data/gui/profile_window.ui:396 gajim/data/gui/profile_window.ui:870 #: gajim/data/gui/vcard_information_window.ui:618 #: gajim/data/gui/vcard_information_window.ui:1253 msgid "Address" msgstr "" #: gajim/data/gui/profile_window.ui:413 #: gajim/data/gui/vcard_information_window.ui:635 msgid "Homepage:" msgstr "" #: gajim/data/gui/profile_window.ui:437 gajim/data/gui/profile_window.ui:887 #: gajim/data/gui/vcard_information_window.ui:648 #: gajim/data/gui/vcard_information_window.ui:1270 msgid "E-Mail:" msgstr "" #: gajim/data/gui/profile_window.ui:462 gajim/data/gui/profile_window.ui:912 #: gajim/data/gui/vcard_information_window.ui:661 #: gajim/data/gui/vcard_information_window.ui:1283 msgid "Phone No.:" msgstr "" #: gajim/data/gui/profile_window.ui:497 msgid "Avatar:" msgstr "" #: gajim/data/gui/profile_window.ui:540 msgid "Click to set your avatar" msgstr "" #: gajim/data/gui/profile_window.ui:566 #: gajim/data/gui/vcard_information_window.ui:702 msgid "Format: YYYY-MM-DD" msgstr "" #: gajim/data/gui/profile_window.ui:574 #: gajim/data/gui/vcard_information_window.ui:708 msgid "Birthday:" msgstr "" #: gajim/data/gui/profile_window.ui:598 #: gajim/data/gui/vcard_information_window.ui:937 msgid "Personal Info" msgstr "" #: gajim/data/gui/profile_window.ui:617 #: gajim/data/gui/vcard_information_window.ui:960 msgid "Company:" msgstr "" #: gajim/data/gui/profile_window.ui:641 #: gajim/data/gui/vcard_information_window.ui:990 msgid "Department:" msgstr "" #: gajim/data/gui/profile_window.ui:665 #: gajim/data/gui/vcard_information_window.ui:1018 msgid "Position:" msgstr "" #: gajim/data/gui/profile_window.ui:689 #: gajim/data/gui/vcard_information_window.ui:1045 msgid "Role:" msgstr "" #: gajim/data/gui/profile_window.ui:947 #: gajim/data/gui/vcard_information_window.ui:1336 msgid "Work" msgstr "" #. "About" is the text of a tab of vcard window #: gajim/data/gui/profile_window.ui:979 #: gajim/data/gui/vcard_information_window.ui:1368 #: gajim/data/gui/application_menu.ui:62 msgid "About" msgstr "Sobre l'aplicació" #: gajim/data/gui/filetransfers.ui:20 msgid "Con_tinue" msgstr "Con_tinua" #: gajim/data/gui/filetransfers.ui:28 gajim/data/gui/filetransfers.ui:156 msgid "_Pause" msgstr "_Pausa" #: gajim/data/gui/filetransfers.ui:36 gajim/data/gui/filetransfers.ui:174 #: gajim/data/gui/service_registration_window.ui:53 msgid "_Cancel" msgstr "_Cancel·la" #: gajim/data/gui/filetransfers.ui:50 msgid "_Open Containing Folder" msgstr "_Obre Carpeta Contenidora" #: gajim/data/gui/filetransfers.ui:79 gajim/data/gui/filetransfers.ui:253 msgid "File Transfers" msgstr "Transferències de fitxers" #: gajim/data/gui/filetransfers.ui:110 msgid "file transfers list" msgstr "llista de trasferència de fitxers" #: gajim/data/gui/filetransfers.ui:111 msgid "A list of active, completed and stopped file transfers" msgstr "" "Una llista de les transferències de fitxers actives, completades i aturades" #: gajim/data/gui/filetransfers.ui:131 msgid "Clean _up" msgstr "Neteja" #: gajim/data/gui/filetransfers.ui:137 msgid "Removes completed, cancelled and failed file transfers from the list" msgstr "" "Esborra de la llista les transferències completades, cancel.lades o fallides" #: gajim/data/gui/filetransfers.ui:143 msgid "Remove file transfer from the list." msgstr "Esborra transferència de fitxer de la llista." #: gajim/data/gui/filetransfers.ui:144 msgid "" "This action removes single file transfer from the list. If the transfer is " "active, it is first stopped and then removed" msgstr "" "Aquesta acció esborra una única transferència de fitxer de la llista. Si " "està activa, primer s'atura i després s'esborra." #: gajim/data/gui/filetransfers.ui:180 msgid "Cancels the selected file transfer and removes incomplete files" msgstr "" "Cancel.la la transferència seleccionada i esborra els fitxers incomplets." #: gajim/data/gui/filetransfers.ui:186 msgid "Cancel file transfer" msgstr "Cancel.la la transferència de fitxer." #: gajim/data/gui/filetransfers.ui:187 msgid "Cancels the selected file transfer" msgstr "Cancel.la la transferència de fitxer seleccionada." #: gajim/data/gui/filetransfers.ui:199 msgid "_Close" msgstr "" #: gajim/data/gui/filetransfers.ui:205 msgid "Hides the window" msgstr "Amaga la finestra" #: gajim/data/gui/filetransfers.ui:226 msgid "_Notify me when a file transfer is complete" msgstr "_Notifica'm quan una transferència de fitxer ha acabat" #: gajim/data/gui/filetransfers.ui:236 msgid "When a file transfer is complete show a popup notification" msgstr "Quan una transferència de fitxer acabi mostra una notificació (popup)" #: gajim/data/gui/filetransfers.ui:254 msgid "Shows a list of file transfers between you and others" msgstr "Mostra una llista de transferències de fitxers entre tu i els altres" #: gajim/data/gui/service_registration_window.ui:18 msgid "Register to" msgstr "" #: gajim/data/gui/service_registration_window.ui:70 #: gajim/data/gui/roster_item_exchange_window.ui:126 msgid "_OK" msgstr "" #: gajim/data/gui/groupchat_control.ui:13 gajim/data/gui/chat_control.ui:293 #: gajim/data/gui/gajim_themes_window.ui:264 msgid "Bold" msgstr "Negreta" #: gajim/data/gui/groupchat_control.ui:22 gajim/data/gui/chat_control.ui:302 #: gajim/data/gui/gajim_themes_window.ui:284 msgid "Italic" msgstr "Cursiva" #: gajim/data/gui/groupchat_control.ui:31 gajim/data/gui/chat_control.ui:311 msgid "Underline" msgstr "Subratllat" #: gajim/data/gui/groupchat_control.ui:40 gajim/data/gui/chat_control.ui:320 msgid "Strike" msgstr "Ratllat" #: gajim/data/gui/groupchat_control.ui:62 gajim/data/gui/chat_control.ui:342 msgid "Font" msgstr "Tipus de lletra" #: gajim/data/gui/groupchat_control.ui:76 gajim/data/gui/chat_control.ui:356 msgid "Clear formatting" msgstr "Neteja el format" #: gajim/data/gui/groupchat_control.ui:283 gajim/data/gui/chat_control.ui:805 #, fuzzy msgid "Choose an encryption" msgstr "Connexió" #: gajim/data/gui/groupchat_control.ui:329 gajim/data/gui/chat_control.ui:853 msgid "Show a list of emoticons (Alt+M)" msgstr "Mostra una llista d'emoticones (Alt+M)" #: gajim/data/gui/popup_notification_window.ui:55 msgid "Event Type" msgstr "Tipus d'esdeveniment" #: gajim/data/gui/popup_notification_window.ui:100 msgid "Event desc" msgstr "Descripció d'esdeveniment" #: gajim/data/gui/chat_control.ui:41 msgid "1" msgstr "1" #: gajim/data/gui/chat_control.ui:63 msgid "2 abc" msgstr "2 abc" #: gajim/data/gui/chat_control.ui:84 msgid "3 def" msgstr "3 def" #: gajim/data/gui/chat_control.ui:105 msgid "4 ghi" msgstr "4 ghi" #: gajim/data/gui/chat_control.ui:126 msgid "5 jkl" msgstr "5 jkl" #: gajim/data/gui/chat_control.ui:147 msgid "6 mno" msgstr "6 mno" #: gajim/data/gui/chat_control.ui:167 msgid "7 pqrs" msgstr "7 pqrs" #: gajim/data/gui/chat_control.ui:188 msgid "8 tuv" msgstr "8 tuv" #: gajim/data/gui/chat_control.ui:209 msgid "9 wxyz" msgstr "9 wxyz" #: gajim/data/gui/chat_control.ui:229 msgid "*" msgstr "*" #: gajim/data/gui/chat_control.ui:249 msgid "0" msgstr "0" #: gajim/data/gui/chat_control.ui:269 msgid "#" msgstr "#" #: gajim/data/gui/chat_control.ui:729 msgid "#" msgstr "#" #: gajim/data/gui/vcard_information_window.ui:55 msgid "Jabber ID:" msgstr "" #: gajim/data/gui/vcard_information_window.ui:69 msgid "Resource:" msgstr "" #: gajim/data/gui/vcard_information_window.ui:83 msgid "Status:" msgstr "" #: gajim/data/gui/vcard_information_window.ui:97 msgid "Client:" msgstr "" #: gajim/data/gui/vcard_information_window.ui:111 msgid "System:" msgstr "" #: gajim/data/gui/vcard_information_window.ui:125 msgid "Contact time:" msgstr "" #: gajim/data/gui/vcard_information_window.ui:222 msgid "User avatar:" msgstr "" #: gajim/data/gui/vcard_information_window.ui:234 msgid "Configured avatar:" msgstr "" #. Given Name #: gajim/data/gui/vcard_information_window.ui:263 msgid "Ask:" msgstr "" #. Family Name #: gajim/data/gui/vcard_information_window.ui:277 msgid "Subscription:" msgstr "" #: gajim/data/gui/vcard_information_window.ui:893 #: gajim/data/gui/vcard_information_window.ui:912 #: gajim/data/gui/vcard_information_window.ui:1310 msgid "button" msgstr "" #: gajim/data/gui/vcard_information_window.ui:1398 msgid "Comments" msgstr "" #: gajim/data/gui/gajim_themes_window.ui:12 msgid "Account row" msgstr "Fila del compte " #: gajim/data/gui/gajim_themes_window.ui:15 msgid "Group row" msgstr "Fila del grup" #: gajim/data/gui/gajim_themes_window.ui:18 msgid "Contact row" msgstr "Fila del contacte" #: gajim/data/gui/gajim_themes_window.ui:21 msgid "Chat Banner" msgstr "Banner del Xat" #: gajim/data/gui/gajim_themes_window.ui:28 msgid "Gajim Themes Customization" msgstr "Personalització Temes Gajim" #: gajim/data/gui/gajim_themes_window.ui:157 msgid "Text _color:" msgstr "_Color del text:" #: gajim/data/gui/gajim_themes_window.ui:173 msgid "_Background:" msgstr "Fons:" #: gajim/data/gui/gajim_themes_window.ui:189 msgid "Text _font:" msgstr "Tipus de lletra:" #: gajim/data/gui/gajim_themes_window.ui:207 msgid "Font style:" msgstr "Estil de lletra:" #: gajim/data/gui/gajim_themes_window.ui:375 msgid "Composing" msgstr "S'està creant la composició" #: gajim/data/gui/gajim_themes_window.ui:387 msgid "Paused" msgstr "Aturat" #: gajim/data/gui/gajim_themes_window.ui:399 msgid "Gone" msgstr "Desaparegut" #: gajim/data/gui/gajim_themes_window.ui:411 msgid "" "MUC\n" "Messages" msgstr "" "Missatges\n" "MUC" #: gajim/data/gui/gajim_themes_window.ui:424 msgid "" "MUC Directed\n" "Messages" msgstr "" "Missatges\n" "MUC Dirigits" #: gajim/data/gui/gajim_themes_window.ui:510 msgid "Chatstate Tab Colors" msgstr "Colors Pestanya Estat de Xat" #: gajim/data/gui/preferences_window.ui:48 msgid "Use default applications" msgstr "Aplicacions per defecte" #: gajim/data/gui/preferences_window.ui:51 msgid "Custom" msgstr "Personalitzat" #: gajim/data/gui/preferences_window.ui:62 #: gajim/data/gui/preferences_window.ui:79 msgid "All chat states" msgstr "Tots els estats del xat" #: gajim/data/gui/preferences_window.ui:65 #: gajim/data/gui/preferences_window.ui:82 msgid "Composing only" msgstr "Component només" #: gajim/data/gui/preferences_window.ui:99 msgid "Only when pending events" msgstr "Només en esdeveniments pendents" #: gajim/data/gui/preferences_window.ui:113 msgid "Pop it up" msgstr "" #: gajim/data/gui/preferences_window.ui:116 msgid "Notify me about it" msgstr "" #: gajim/data/gui/preferences_window.ui:119 msgid "Show only in roster" msgstr "" #: gajim/data/gui/preferences_window.ui:130 msgid "Detached roster with detached chats" msgstr "" #: gajim/data/gui/preferences_window.ui:133 msgid "Detached roster with single chat" msgstr "" #: gajim/data/gui/preferences_window.ui:136 msgid "Single window for everything" msgstr "" #: gajim/data/gui/preferences_window.ui:139 msgid "Detached roster with chat grouped by account" msgstr "" #: gajim/data/gui/preferences_window.ui:142 msgid "Detached roster with chat grouped by type" msgstr "" #: gajim/data/gui/preferences_window.ui:159 msgid "Last state" msgstr "" #: gajim/data/gui/preferences_window.ui:195 #: gajim/data/gui/application_menu.ui:94 gajim/data/gui/shortcuts_window.ui:188 msgid "Preferences" msgstr "Preferències" #: gajim/data/gui/preferences_window.ui:237 msgid "Display a_vatars of contacts in roster" msgstr "" #: gajim/data/gui/preferences_window.ui:241 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" msgstr "" #: gajim/data/gui/preferences_window.ui:255 msgid "Display status _messages of contacts in roster" msgstr "" #: gajim/data/gui/preferences_window.ui:259 msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name, in roster window and in group chats" msgstr "" #: gajim/data/gui/preferences_window.ui:273 msgid "Display e_xtra information of contacts in roster (mood, activity, ...)" msgstr "" #: gajim/data/gui/preferences_window.ui:277 msgid "" "If checked, Gajim will display the mood of contacts in the roster window" msgstr "" #: gajim/data/gui/preferences_window.ui:298 msgid "Sort contacts by status" msgstr "" #: gajim/data/gui/preferences_window.ui:308 msgid "in _roster" msgstr "" #: gajim/data/gui/preferences_window.ui:325 msgid "in _group chats" msgstr "" #: gajim/data/gui/preferences_window.ui:354 msgid "Roster Appearance" msgstr "" #: gajim/data/gui/preferences_window.ui:384 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" msgstr "" #: gajim/data/gui/preferences_window.ui:390 msgid "_Emoticons:" msgstr "" #: gajim/data/gui/preferences_window.ui:406 msgid "_Window behavior:" msgstr "" #: gajim/data/gui/preferences_window.ui:420 msgid "_Show roster on startup:" msgstr "" #: gajim/data/gui/preferences_window.ui:431 msgid "_Ignore rich content in incoming messages" msgstr "" #: gajim/data/gui/preferences_window.ui:435 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." msgstr "" #: gajim/data/gui/preferences_window.ui:449 msgid "_Highlight misspelled words" msgstr "" #: gajim/data/gui/preferences_window.ui:452 msgid "" "If checked, Gajim will highlight spelling errors in input fields of chat " "windows. If no language is explicitly set via right click on the input " "field, the default language will be used for this contact or group chat." msgstr "" #: gajim/data/gui/preferences_window.ui:466 msgid "Notify by icon when your messages are received" msgstr "" #: gajim/data/gui/preferences_window.ui:520 msgid "Show avatar in chat tabs" msgstr "" #: gajim/data/gui/preferences_window.ui:552 msgid "Chat Appearance" msgstr "" #: gajim/data/gui/preferences_window.ui:607 msgid "When new event is received:" msgstr "" #: gajim/data/gui/preferences_window.ui:645 msgid "Notify me about contacts that sign _in" msgstr "" #: gajim/data/gui/preferences_window.ui:663 msgid "Notify me about contacts that sign _out" msgstr "" #: gajim/data/gui/preferences_window.ui:667 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" msgstr "" #: gajim/data/gui/preferences_window.ui:681 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" msgstr "" #: gajim/data/gui/preferences_window.ui:698 msgid "Allow popup/notifications when a chat window is opened" msgstr "" #: gajim/data/gui/preferences_window.ui:722 msgid "Show notification area icon:" msgstr "" #: gajim/data/gui/preferences_window.ui:762 msgid "Visual Notifications" msgstr "" #: gajim/data/gui/preferences_window.ui:795 msgid "Play _sounds" msgstr "" #: gajim/data/gui/preferences_window.ui:812 #: gajim/data/gui/preferences_window.ui:1656 msgid "Ma_nage..." msgstr "" #: gajim/data/gui/preferences_window.ui:834 msgid "Allow sound when I'm _busy" msgstr "" #: gajim/data/gui/preferences_window.ui:856 msgid "Sounds" msgstr "" #: gajim/data/gui/preferences_window.ui:877 msgid "Notifications" msgstr "" #: gajim/data/gui/preferences_window.ui:911 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " "display in chat windows." msgstr "" #: gajim/data/gui/preferences_window.ui:916 msgid "_Display chat state notifications:" msgstr "" #: gajim/data/gui/preferences_window.ui:967 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " "send to the other party." msgstr "" #: gajim/data/gui/preferences_window.ui:972 msgid "_Send chat state notifications:" msgstr "" #: gajim/data/gui/preferences_window.ui:990 msgid "Chat state notifications" msgstr "" #: gajim/data/gui/preferences_window.ui:1012 msgid "Personal Events" msgstr "" #: gajim/data/gui/preferences_window.ui:1043 msgid "_Away after:" msgstr "" #: gajim/data/gui/preferences_window.ui:1047 msgid "" "If checked, Gajim will change status to Away when the computer is unused." msgstr "" #: gajim/data/gui/preferences_window.ui:1060 msgid "_Not available after:" msgstr "" #: gajim/data/gui/preferences_window.ui:1064 msgid "" "If checked, Gajim will change status to Not Available when the computer has " "not been used even longer" msgstr "" #: gajim/data/gui/preferences_window.ui:1079 #: gajim/data/gui/preferences_window.ui:1091 msgid "minutes" msgstr "" #: gajim/data/gui/preferences_window.ui:1103 msgid "" "The auto away status message. If empty, Gajim will not change the current " "status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-away timeout" msgstr "" #: gajim/data/gui/preferences_window.ui:1117 msgid "" "The auto not available status message. If empty, Gajim will not change the " "current status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-not-available timeout" msgstr "" #: gajim/data/gui/preferences_window.ui:1165 msgid "Auto Status" msgstr "" #: gajim/data/gui/preferences_window.ui:1200 msgid "Ask status message when I:" msgstr "" #: gajim/data/gui/preferences_window.ui:1215 msgid "Sign _in" msgstr "" #: gajim/data/gui/preferences_window.ui:1232 msgid "Sign _out" msgstr "" #: gajim/data/gui/preferences_window.ui:1265 msgid "" "If enabled, Gajim will not ask for a status message. The specified default " "message will be used instead." msgstr "" #: gajim/data/gui/preferences_window.ui:1277 #: gajim/data/gui/preferences_window.ui:1479 msgid "Status" msgstr "" #: gajim/data/gui/preferences_window.ui:1288 msgid "Default Message" msgstr "" #: gajim/data/gui/preferences_window.ui:1303 msgid "Enabled" msgstr "" #: gajim/data/gui/preferences_window.ui:1329 msgid "Status Messages" msgstr "" #: gajim/data/gui/preferences_window.ui:1459 msgid "Preset Status Messages" msgstr "" #: gajim/data/gui/preferences_window.ui:1512 msgid "Chat message:" msgstr "" #: gajim/data/gui/preferences_window.ui:1537 msgid "Use system _default" msgstr "" #: gajim/data/gui/preferences_window.ui:1560 msgid "Font" msgstr "" #: gajim/data/gui/preferences_window.ui:1590 msgid "T_heme:" msgstr "" #: gajim/data/gui/preferences_window.ui:1603 msgid "Status _iconset:" msgstr "" #: gajim/data/gui/preferences_window.ui:1614 msgid "Use _transports icons" msgstr "" #: gajim/data/gui/preferences_window.ui:1618 msgid "" "If checked, Gajim will use protocol-specific status icons. (e.g. A contact " "from ICQ will have the equivalent ICQ icon for status online, away, busy, " "etc...)" msgstr "" #: gajim/data/gui/preferences_window.ui:1660 msgid "Configure color and font of the interface" msgstr "" #: gajim/data/gui/preferences_window.ui:1682 msgid "Themes" msgstr "" #: gajim/data/gui/preferences_window.ui:1712 msgid "Contact's nickname:" msgstr "" #: gajim/data/gui/preferences_window.ui:1726 msgid "Contact's message:" msgstr "" #: gajim/data/gui/preferences_window.ui:1738 msgid "_Status message:" msgstr "" #: gajim/data/gui/preferences_window.ui:1752 msgid "Group chat highlight:" msgstr "" #: gajim/data/gui/preferences_window.ui:1890 msgid "Your nickname:" msgstr "" #: gajim/data/gui/preferences_window.ui:1904 msgid "Your message:" msgstr "" #: gajim/data/gui/preferences_window.ui:1916 msgid "_URL highlight:" msgstr "" #: gajim/data/gui/preferences_window.ui:2041 msgid "_Reset to Default Colors" msgstr "" #: gajim/data/gui/preferences_window.ui:2075 msgid "Chat Line Colors" msgstr "" #: gajim/data/gui/preferences_window.ui:2095 msgid "Style" msgstr "" #: gajim/data/gui/preferences_window.ui:2128 msgid "Audio input device" msgstr "" #: gajim/data/gui/preferences_window.ui:2140 msgid "Audio output device" msgstr "" #: gajim/data/gui/preferences_window.ui:2176 msgid "Audio" msgstr "" #: gajim/data/gui/preferences_window.ui:2206 msgid "Video input device" msgstr "" #: gajim/data/gui/preferences_window.ui:2218 msgid "Video output device" msgstr "" #: gajim/data/gui/preferences_window.ui:2230 msgid "Video framerate" msgstr "" #: gajim/data/gui/preferences_window.ui:2242 msgid "Video size" msgstr "" #: gajim/data/gui/preferences_window.ui:2252 msgid "View own video source" msgstr "" #: gajim/data/gui/preferences_window.ui:2316 msgid "Video" msgstr "" #: gajim/data/gui/preferences_window.ui:2346 msgid "STUN server:" msgstr "" #: gajim/data/gui/preferences_window.ui:2372 msgid "" "STUN server hostname. If none given, Gajim will try\n" "to discover one from server." msgstr "" #: gajim/data/gui/preferences_window.ui:2386 msgid "(example: stun.iptel.org)" msgstr "" #: gajim/data/gui/preferences_window.ui:2400 msgid "Connection" msgstr "" #: gajim/data/gui/preferences_window.ui:2485 msgid "_Mail client:" msgstr "" #: gajim/data/gui/preferences_window.ui:2498 msgid "_Browser:" msgstr "" #: gajim/data/gui/preferences_window.ui:2511 msgid "_File manager:" msgstr "" #. a header for custom browser/client/file manager. so translate sth like: Custom Settings #: gajim/data/gui/preferences_window.ui:2559 msgid "Custom" msgstr "" #: gajim/data/gui/preferences_window.ui:2576 msgid "Applications" msgstr "" #: gajim/data/gui/preferences_window.ui:2604 msgid "_Ignore events from contacts not in the roster" msgstr "" #: gajim/data/gui/preferences_window.ui:2608 msgid "" "If checked, Gajim will ignore incoming events from unauthorized contacts. " "Use with caution, because it blocks all messages from any contact that is " "not in the roster" msgstr "" #: gajim/data/gui/preferences_window.ui:2622 msgid "Allow client / _OS information to be sent" msgstr "" #: gajim/data/gui/preferences_window.ui:2626 msgid "" "If checked, Gajim will allow others to detect the operation system you are " "using" msgstr "" #: gajim/data/gui/preferences_window.ui:2640 msgid "Allow local system time information to be sent" msgstr "" #: gajim/data/gui/preferences_window.ui:2644 msgid "If checked, Gajim will allow others to detect the time on your system" msgstr "" #: gajim/data/gui/preferences_window.ui:2658 msgid "Log _encrypted chat session" msgstr "" #: gajim/data/gui/preferences_window.ui:2662 msgid "" "If checked, Gajim will keep logs for encrypted messages. Please note that " "when using End-to-End encryption the remote party has to agree on logging, " "else the messages will not be logged." msgstr "" #: gajim/data/gui/preferences_window.ui:2676 msgid "Allow my _idle time to be sent" msgstr "" #: gajim/data/gui/preferences_window.ui:2695 msgid "Global proxy:" msgstr "" #: gajim/data/gui/preferences_window.ui:2724 msgid "_Manage..." msgstr "Administra..." #: gajim/data/gui/preferences_window.ui:2743 msgid "Privacy" msgstr "" #: gajim/data/gui/preferences_window.ui:2770 msgid "_Log status changes of contacts" msgstr "" #: gajim/data/gui/preferences_window.ui:2791 msgid "Miscellaneous" msgstr "Miscel·lània" #: gajim/data/gui/preferences_window.ui:2810 msgid "_Open..." msgstr "" #: gajim/data/gui/preferences_window.ui:2826 msgid "Advanced Configuration Editor" msgstr "" #: gajim/data/gui/contact_context_menu.ui:12 msgid "Start _Chat" msgstr "Comença Xat" #: gajim/data/gui/contact_context_menu.ui:20 #: gajim/data/gui/systray_context_menu.ui:36 msgid "Send Single _Message..." msgstr "Envia un _Missatge únic..." #: gajim/data/gui/contact_context_menu.ui:28 msgid "Send _File..." msgstr "Envia un _fitxer..." #: gajim/data/gui/contact_context_menu.ui:44 msgid "Invite _Contacts" msgstr "Convida _Contactes" #: gajim/data/gui/contact_context_menu.ui:73 msgid "E_xecute Command..." msgstr "E_xecuta Comanda..." #: gajim/data/gui/contact_context_menu.ui:82 msgid "M_anage Contact" msgstr "Gestiona Contacte" #: gajim/data/gui/contact_context_menu.ui:92 msgid "_Rename..." msgstr "Canvia el nom..." #: gajim/data/gui/contact_context_menu.ui:99 msgid "Edit _Groups..." msgstr "Edita els _Grups..." #: gajim/data/gui/contact_context_menu.ui:106 msgid "Assign Open_PGP Key..." msgstr "Assigna Clau Open_PGP..." #: gajim/data/gui/contact_context_menu.ui:115 msgid "Add Special _Notification..." msgstr "Afegeix _Notificació Especial..." #: gajim/data/gui/contact_context_menu.ui:129 msgid "_Subscription" msgstr "_Subscripció" #: gajim/data/gui/contact_context_menu.ui:138 msgid "_Allow contact to see my status" msgstr "Permet el contacte veure el meu estat" #: gajim/data/gui/contact_context_menu.ui:146 msgid "A_sk to see contact status" msgstr "Demana veure l'estat del contacte" #: gajim/data/gui/contact_context_menu.ui:154 msgid "_Forbid contact to see my status" msgstr "Prohibeix el contacte veure el meu estat" #: gajim/data/gui/contact_context_menu.ui:182 msgid "_Unignore" msgstr "No ignora" #: gajim/data/gui/contact_context_menu.ui:190 msgid "_Ignore" msgstr "_Ignora" #: gajim/data/gui/contact_context_menu.ui:197 #: gajim/data/gui/chat_context_menu.ui:66 msgid "_Add to Roster..." msgstr "Afegeix a la llista de contactes..." #: gajim/data/gui/account_creation_wizard_window.ui:43 msgid "Gajim: Account Creation Wizard" msgstr "Gaim: Ajuda a Creació de Compte" #: gajim/data/gui/account_creation_wizard_window.ui:70 msgid "" "You need to have an account in order to connect\n" "to the Jabber network." msgstr "" "Necessites un compte per a connectar-te\n" "a la xarxa Jabber." #: gajim/data/gui/account_creation_wizard_window.ui:95 msgid "I already have an account I want to _use" msgstr "Ja tinc un compte que vull _usar" #: gajim/data/gui/account_creation_wizard_window.ui:112 msgid "I want to _register for a new account" msgstr "Vull _registrar-me amb un nou compte" #: gajim/data/gui/account_creation_wizard_window.ui:133 msgid "Please choose one of the options below:" msgstr "Si us plau esculli una de les següents opcions:" #: gajim/data/gui/account_creation_wizard_window.ui:167 msgid "Please fill in the data for your existing account" msgstr "Si us plau ompli les dades del seu compte existent" #: gajim/data/gui/account_creation_wizard_window.ui:187 msgid "_Jabber ID:" msgstr "ID _Jabber:" #: gajim/data/gui/account_creation_wizard_window.ui:239 #: gajim/data/gui/account_creation_wizard_window.ui:394 msgid "Anon_ymous authentication" msgstr "Autenticació Anònima" #: gajim/data/gui/account_creation_wizard_window.ui:259 #: gajim/data/gui/manage_bookmarks_window.ui:172 msgid "_Password:" msgstr "_Contrasenya:" #: gajim/data/gui/account_creation_wizard_window.ui:281 msgid "Save pass_word" msgstr "Guarda contrasenya" #: gajim/data/gui/account_creation_wizard_window.ui:285 msgid "If checked, Gajim will remember the password for this account" msgstr "Si està marcat, Gajim recordarà la contrasenya d'aquest compte" #: gajim/data/gui/account_creation_wizard_window.ui:339 msgid "Please select a server" msgstr "Si us plau seleccioni un servidor" #: gajim/data/gui/account_creation_wizard_window.ui:358 #: gajim/data/gui/manage_bookmarks_window.ui:159 msgid "_Server:" msgstr "_Servidor:" #: gajim/data/gui/account_creation_wizard_window.ui:423 msgid "Prox_y:" msgstr "Prox_y:" #: gajim/data/gui/account_creation_wizard_window.ui:450 msgid "Manage..." msgstr "Gestiona..." #: gajim/data/gui/account_creation_wizard_window.ui:465 msgid "Use custom hostname/port" msgstr "Fa servir nomdeservidor/port" #: gajim/data/gui/account_creation_wizard_window.ui:491 msgid "_Hostname:" msgstr "Nom del servidor:" #: gajim/data/gui/account_creation_wizard_window.ui:517 msgid "_Port:" msgstr "_Port:" #: gajim/data/gui/account_creation_wizard_window.ui:553 #: gajim/data/gui/account_creation_wizard_window.ui:884 msgid "_Advanced" msgstr "_Avançat" #: gajim/data/gui/account_creation_wizard_window.ui:624 msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA1 fingerprint of the certificate:\n" msgstr "" "Afegir aquest certificat a la llista de certificats confiables.\n" "Hash SHA1 del certificat:\n" #: gajim/data/gui/account_creation_wizard_window.ui:687 msgid "" "Connecting to server\n" "\n" "Please wait..." msgstr "" "Connectant al servidor\n" "\n" "Si us plau esperi..." #: gajim/data/gui/account_creation_wizard_window.ui:772 msgid "Connect when I press Finish" msgstr "Connecta quan jo cliqui Acabar" #: gajim/data/gui/account_creation_wizard_window.ui:789 msgid "Set my profile when I connect" msgstr "Estableix el meu perfil quan jo connecti" #: gajim/data/gui/account_creation_wizard_window.ui:901 msgid "_Finish" msgstr "Acaba" #: gajim/data/gui/privacy_lists_window.ui:34 msgid "Privacy Lists:" msgstr "" #: gajim/data/gui/service_discovery_window.ui:84 msgid "_Address:" msgstr "" #: gajim/data/gui/service_discovery_window.ui:115 msgid "G_o" msgstr "" #: gajim/data/gui/synchronise_select_contacts_dialog.ui:8 msgid "Synchronise : select contacts" msgstr "" #: gajim/data/gui/synchronise_select_contacts_dialog.ui:67 msgid "Select the contacts you want to synchronise" msgstr "" #: gajim/data/gui/edit_groups_dialog.ui:8 msgid "Edit Groups" msgstr "Edita els grups" #: gajim/data/gui/search_window.ui:42 msgid "Please wait while retrieving search form..." msgstr "" #: gajim/data/gui/search_window.ui:80 msgid "_Add contact" msgstr "" #: gajim/data/gui/search_window.ui:116 msgid "_Search" msgstr "" #: gajim/data/gui/chat_context_menu.ui:11 msgid "_Copy Link Location" msgstr "_Copia la ubicació de l'enllaç" #: gajim/data/gui/chat_context_menu.ui:19 msgid "_Open Link in Browser" msgstr "_Obri l'enllaç al navegador" #: gajim/data/gui/chat_context_menu.ui:27 msgid "_Copy JID/Email Address" msgstr "_Copia adreça JID/Email" #: gajim/data/gui/chat_context_menu.ui:35 msgid "_Open Email Composer" msgstr "_Obre Editor de Correu" #: gajim/data/gui/chat_context_menu.ui:49 #: gajim/data/gui/subscription_request_window.ui:12 msgid "_Start Chat" msgstr "Inicia Xat" #: gajim/data/gui/chat_context_menu.ui:57 #: gajim/data/gui/account_context_menu.ui:35 #: gajim/data/gui/systray_context_menu.ui:28 msgid "Join _Group Chat" msgstr "Inicia Xat de _Grup" #: gajim/data/gui/change_status_message_dialog.ui:131 msgid "Save as Preset..." msgstr "Guardar com a Configuració..." #: gajim/data/gui/change_status_message_dialog.ui:167 msgid "Preset messages:" msgstr "Missatges preconfigurats:" #: gajim/data/gui/change_status_message_dialog.ui:313 msgid "Type your new status message" msgstr "Escriu el teu nou missatge d'estat" #: gajim/data/gui/synchronise_select_account_dialog.ui:8 msgid "Synchronise contacts" msgstr "" #: gajim/data/gui/synchronise_select_account_dialog.ui:68 msgid "Select the account with which you want to synchronise" msgstr "" #: gajim/data/gui/archiving_313_preferences_window.ui:28 msgid "Roster" msgstr "Llista" #: gajim/data/gui/archiving_313_preferences_window.ui:85 msgid "Preference" msgstr "Preferència" #: gajim/data/gui/archiving_313_preferences_window.ui:159 msgid "Default:" msgstr "Per defecte:" #: gajim/data/gui/voip_call_received_dialog.ui:15 msgid "Incoming call" msgstr "" #: gajim/data/gui/add_new_contact_window.ui:29 msgid "Add New Contact" msgstr "Afegeix un contacte nou" #: gajim/data/gui/add_new_contact_window.ui:62 msgid "A_ccount:" msgstr "Compte:" #: gajim/data/gui/add_new_contact_window.ui:110 msgid "_Protocol:" msgstr "_Protocol:" #: gajim/data/gui/add_new_contact_window.ui:169 msgid "_User ID:" msgstr "ID d'_Usuari:" #: gajim/data/gui/add_new_contact_window.ui:182 #: gajim/data/gui/manage_bookmarks_window.ui:133 msgid "_Nickname:" msgstr "Sobrenom:" #: gajim/data/gui/add_new_contact_window.ui:195 msgid "_Group:" msgstr "_Grup:" #: gajim/data/gui/add_new_contact_window.ui:210 #, fuzzy msgid "Type User ID" msgstr "ID d'_Usuari:" #: gajim/data/gui/add_new_contact_window.ui:223 #, fuzzy msgid "Type Nickname" msgstr "Sobrenom:" #: gajim/data/gui/add_new_contact_window.ui:239 msgid "Choose a group of type a new group" msgstr "Escull un grup o escriu-ne un de nou" #: gajim/data/gui/add_new_contact_window.ui:257 msgid "A_llow this contact to view my status" msgstr "Permet a aquest contacte de veure el meu estat" #: gajim/data/gui/add_new_contact_window.ui:300 msgid "_Save subscription message" msgstr "Guarda missatge de subscripció" #: gajim/data/gui/add_new_contact_window.ui:325 msgid "" "You have to register with this transport\n" "to be able to add a contact from this\n" "protocol. Click on Register button to\n" "proceed." msgstr "" "Has de registrar-te amb aquest transport\n" "per a poder afegir un contacte des\n" "d'aquest protocol. Clica al botó Registra\n" "per a seguir." #: gajim/data/gui/add_new_contact_window.ui:340 msgid "_Register" msgstr "_Registra" #: gajim/data/gui/add_new_contact_window.ui:369 msgid "" "You must be connected to the transport to be able\n" "to add a contact from this protocol." msgstr "" "Has d'estar connectat al transport per a poder\n" "afegir un contacte des d'aquest protocol." #: gajim/data/gui/roster_window.ui:61 msgid "Change Status Message…" msgstr "Canvia Missatge d'Estat..." #: gajim/data/gui/change_mood_dialog.ui:73 msgid "Mood:" msgstr "Estat d'ànim:" #: gajim/data/gui/change_mood_dialog.ui:85 msgid "Message:" msgstr "Missatge:" #: gajim/data/gui/plugins_window.ui:25 gajim/data/gui/application_menu.ui:90 msgid "Plugins" msgstr "Connectors" #: gajim/data/gui/plugins_window.ui:78 msgid "Install from zip" msgstr "Instal·la des d'un zip" #: gajim/data/gui/plugins_window.ui:109 msgid "<empty>" msgstr "<buit>" #: gajim/data/gui/plugins_window.ui:131 msgid "Version:" msgstr "Versió:" #: gajim/data/gui/plugins_window.ui:169 msgid "Authors:" msgstr "Autors:" #: gajim/data/gui/plugins_window.ui:210 msgid "Homepage:" msgstr "Pàgina d'inici:" #: gajim/data/gui/plugins_window.ui:253 msgid "Description:" msgstr "Descripció:" #: gajim/data/gui/plugins_window.ui:301 msgid "Uninstall" msgstr "Desinstal·la" #: gajim/data/gui/plugins_window.ui:316 msgid "Configure" msgstr "Configura" #: gajim/data/gui/plugins_window.ui:348 msgid "Installed" msgstr "Instal·lat" #: gajim/data/gui/plugins_window.ui:399 msgid "" "Plug-in decription should be displayed here. This text will be erased during " "PluginsWindow initialization." msgstr "" "La descripció del plugin s'hauria de mostrar aquí. Aquest text s'esborrarà " "durant la inicialització PluginsWindow." #: gajim/data/gui/privacy_list_window.ui:18 msgid "none" msgstr "" #: gajim/data/gui/privacy_list_window.ui:21 msgid "both" msgstr "" #: gajim/data/gui/privacy_list_window.ui:24 msgid "from" msgstr "" #: gajim/data/gui/privacy_list_window.ui:27 msgid "to" msgstr "" #: gajim/data/gui/privacy_list_window.ui:66 msgid "Privacy List" msgstr "" #: gajim/data/gui/privacy_list_window.ui:77 msgid "Active for this session" msgstr "" #: gajim/data/gui/privacy_list_window.ui:94 msgid "Active on each startup" msgstr "" #: gajim/data/gui/privacy_list_window.ui:132 msgid "List of rules" msgstr "" #: gajim/data/gui/privacy_list_window.ui:244 msgid "Add / Edit a rule" msgstr "" #: gajim/data/gui/privacy_list_window.ui:266 msgid "Allow" msgstr "" #: gajim/data/gui/privacy_list_window.ui:282 msgid "Deny" msgstr "" #: gajim/data/gui/privacy_list_window.ui:317 msgid "JabberID" msgstr "" #: gajim/data/gui/privacy_list_window.ui:358 msgid "all in the group" msgstr "" #: gajim/data/gui/privacy_list_window.ui:407 msgid "all by subscription" msgstr "" #: gajim/data/gui/privacy_list_window.ui:456 msgid "All" msgstr "" #: gajim/data/gui/privacy_list_window.ui:493 msgid "to send me messages" msgstr "" #: gajim/data/gui/privacy_list_window.ui:509 msgid "to send me queries" msgstr "" #: gajim/data/gui/privacy_list_window.ui:525 msgid "to view my status" msgstr "" #: gajim/data/gui/privacy_list_window.ui:541 msgid "to send me status" msgstr "" #: gajim/data/gui/privacy_list_window.ui:557 msgid "All (including subscription)" msgstr "" #: gajim/data/gui/privacy_list_window.ui:598 msgid "Order:" msgstr "" #: gajim/data/gui/manage_sounds_window.ui:10 msgid "Manage sounds" msgstr "Gestiona sons" #: gajim/data/gui/remove_account_window.ui:56 msgid "Remove account _only from Gajim" msgstr "" #: gajim/data/gui/remove_account_window.ui:73 msgid "Remove account from Gajim and from _server" msgstr "" #: gajim/data/gui/remove_account_window.ui:94 msgid "What do you want to do?" msgstr "" #: gajim/data/gui/adhoc_commands_window.ui:35 msgid "Please wait while retrieving command list..." msgstr "Si us plau espera mentre es recupera la llista de comandes..." #: gajim/data/gui/adhoc_commands_window.ui:93 msgid "Choose command to execute:" msgstr "Escull la comanda per executar:" #: gajim/data/gui/adhoc_commands_window.ui:136 #: gajim/data/gui/adhoc_commands_window.ui:277 msgid "Check once more" msgstr "Comprova una vegada més" #: gajim/data/gui/adhoc_commands_window.ui:194 msgid "Please wait while the command is being sent..." msgstr "Si us plau espera mentre la comanda s'envia..." #: gajim/data/gui/adhoc_commands_window.ui:211 msgid "Please wait..." msgstr "Espereu…" #: gajim/data/gui/adhoc_commands_window.ui:257 msgid "This jabber entity does not expose any commands." msgstr "Aquesta entitat jabber no exposa cap comanda." #: gajim/data/gui/adhoc_commands_window.ui:336 msgid "An error has occurred:" msgstr "Hi ha hagut un error:" #: gajim/data/gui/adhoc_commands_window.ui:465 msgid "F_inish" msgstr "Acabar" #: gajim/data/gui/account_context_menu.ui:20 msgid "_Personal Events" msgstr "Events _Personals" #: gajim/data/gui/account_context_menu.ui:49 msgid "_Add Contact..." msgstr "_Afegeix Contacte..." #: gajim/data/gui/account_context_menu.ui:57 msgid "_Discover Services" msgstr "_Descobreix Serveis" #: gajim/data/gui/account_context_menu.ui:65 msgid "_Execute Command..." msgstr "_Executa Comanda...." #: gajim/data/gui/esession_info_window.ui:50 msgid "_Verify" msgstr "_Verifica" #: gajim/data/gui/esession_info_window.ui:137 #, fuzzy msgid "(ESession info)" msgstr "Descripció" #: gajim/data/gui/application_menu.ui:8 msgid "View" msgstr "Veure" #: gajim/data/gui/application_menu.ui:11 msgid "Show Roster" msgstr "Mostra Roster" #: gajim/data/gui/application_menu.ui:16 msgid "Show Offline Contacts" msgstr "Mostra els contactes desconnectats" #: gajim/data/gui/application_menu.ui:21 msgid "Show Active Contacts" msgstr "Mostra Contactes Actius" #: gajim/data/gui/application_menu.ui:26 msgid "Show Transports" msgstr "Mostra Transports" #: gajim/data/gui/application_menu.ui:43 msgid "Help" msgstr "Ajuda" #: gajim/data/gui/application_menu.ui:46 msgid "Contents" msgstr "Contingut" #: gajim/data/gui/application_menu.ui:50 msgid "FAQ" msgstr "PMF (Preguntes més freqüents)" #: gajim/data/gui/application_menu.ui:54 msgid "Keyboard Shortcuts" msgstr "Dreceres de teclat" #: gajim/data/gui/application_menu.ui:58 gajim/data/gui/features_window.ui:9 msgid "Features" msgstr "Característiques" #: gajim/data/gui/application_menu.ui:76 msgid "Start Chat" msgstr "" #: gajim/data/gui/application_menu.ui:81 msgid "Bookmarks" msgstr "Adreces d'interès" #: gajim/data/gui/application_menu.ui:99 msgid "Quit" msgstr "Surt" #: gajim/data/gui/features_window.ui:26 msgid "List of possible features in Gajim:" msgstr "Llista de possibles prestacions a Gajim:" #: gajim/data/gui/manage_bookmarks_window.ui:14 msgid "Manage Bookmarks" msgstr "Gestiona els marcadors" #: gajim/data/gui/manage_bookmarks_window.ui:120 msgid "_Title:" msgstr "_Títol:" #: gajim/data/gui/manage_bookmarks_window.ui:146 msgid "Roo_m:" msgstr "Sala:" #: gajim/data/gui/manage_bookmarks_window.ui:188 msgid "A_uto join" msgstr "Entra automàticament" #: gajim/data/gui/manage_bookmarks_window.ui:193 msgid "If checked, Gajim will join this group chat on startup" msgstr "Si està marcat, Gajim entrarà en aquest xat de grup a l'inici" #: gajim/data/gui/manage_bookmarks_window.ui:207 msgid "Minimi_ze on Auto Join" msgstr "Minimitza quan es connecta automàticament" #: gajim/data/gui/manage_bookmarks_window.ui:235 msgid "Pr_int status:" msgstr "Estat d'impressió:" #: gajim/data/gui/exception_dialog.ui:45 #, fuzzy msgid "" "A programming error has been detected. It probably is not fatal, but should " "be reported to the developers nonetheless." msgstr "" "S'ha detectat un error de programació.\n" "Probablement no és fatal, però caldria\n" "informar-ne els desenvolupadors." #: gajim/data/gui/exception_dialog.ui:115 msgid "Report Bug" msgstr "Informa de l'error" #: gajim/data/gui/subscription_request_window.ui:95 msgid "_Deny" msgstr "" #: gajim/data/gui/subscription_request_window.ui:100 msgid "" "Deny authorization from contact so he or she cannot know when you're " "connected" msgstr "" #: gajim/data/gui/subscription_request_window.ui:133 msgid "Au_thorize" msgstr "" #: gajim/data/gui/subscription_request_window.ui:138 msgid "Authorize contact so he or she can know when you're connected" msgstr "" #: gajim/data/gui/xml_console_window.ui:121 #, fuzzy msgid "Presence" msgstr "Preferència" #: gajim/data/gui/xml_console_window.ui:134 msgid "Iq" msgstr "" #: gajim/data/gui/xml_console_window.ui:149 #, fuzzy msgid "Presets" msgstr "Missatges preconfigurats:" #: gajim/data/gui/chat_to_muc_window.ui:24 msgid "Invite Friends!" msgstr "Convida Amics!" #: gajim/data/gui/chat_to_muc_window.ui:39 msgid "" "You are now entering a groupchat.\n" "Select the contacts you want to invite" msgstr "" "Estàs entrant a un xat de grup.\n" "Selecciona els contactes que vols convidar" #: gajim/data/gui/chat_to_muc_window.ui:67 #: gajim/data/gui/chat_to_muc_window.ui:78 msgid "column" msgstr "" #: gajim/data/gui/chat_to_muc_window.ui:112 msgid "Please select a MUC server." msgstr "Si us plau selecciona un servidor MUC." #: gajim/data/gui/chat_to_muc_window.ui:141 msgid "MUC server" msgstr "Servidor MUC" #: gajim/data/gui/chat_to_muc_window.ui:176 msgid "In_vite" msgstr "Con_vida" #: gajim/data/gui/history_manager.ui:11 msgid "_Export" msgstr "_Exporta" #: gajim/data/gui/history_manager.ui:97 msgid "Gajim History Logs Manager" msgstr "Gajim Gestor Històric Registres" #: gajim/data/gui/history_manager.ui:154 msgid "Welcome to Gajim History Logs Manager" msgstr "Benvinguts al Gestor Gajim d'Històric de Registres" #: gajim/data/gui/history_manager.ui:168 msgid "" "This log manager is not intended for log viewing. If you are looking for " "such functionality, use the history window instead.\n" "\n" "Use this program to delete or export logs. You can select logs from the left " "and/or search database from below." msgstr "" "Aquest gestor de registres no està dissenyat com a visor. Si vols aquesta " "funcionalitat, fes ús de la finestra d'històric.\n" "\n" "Des servir aquest gestor per a esborrar o exportar registres. Pots " "seleccionarlos a l'esquerra i/o cercar abaix." #: gajim/data/gui/history_manager.ui:184 msgid "" "WARNING:\n" "If you plan to do massive deletions, please make sure Gajim is not running. " "Generally avoid deletions with contacts you currently chat with." msgstr "" "AVÍS:\n" "Si preveus esborrats massius, assegura't que Gajim no està en execució. " "Evita esborrats amb contactes amb els quals estàs parlant." #: gajim/data/gui/history_manager.ui:283 msgid "_Search Database" msgstr "Cerca Base de Dades" #: gajim/data/gui/shortcuts_window.ui:8 msgid "Chat Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:12 msgid "Message composition" msgstr "" #: gajim/data/gui/shortcuts_window.ui:17 msgid "Send the message" msgstr "" #: gajim/data/gui/shortcuts_window.ui:24 msgid "Create a new line" msgstr "" #: gajim/data/gui/shortcuts_window.ui:31 msgid "Select an emoticon" msgstr "" #: gajim/data/gui/shortcuts_window.ui:38 msgid "Complete a command or a nick" msgstr "" #: gajim/data/gui/shortcuts_window.ui:45 msgid "Previous sent message" msgstr "" #: gajim/data/gui/shortcuts_window.ui:52 msgid "Next sent messages" msgstr "" #: gajim/data/gui/shortcuts_window.ui:59 msgid "Quote previous message" msgstr "" #: gajim/data/gui/shortcuts_window.ui:66 msgid "Quote next message" msgstr "" #: gajim/data/gui/shortcuts_window.ui:73 msgid "Clear message entry" msgstr "" #: gajim/data/gui/shortcuts_window.ui:81 gajim/data/gui/shortcuts_window.ui:231 msgid "Appearance" msgstr "" #: gajim/data/gui/shortcuts_window.ui:86 msgid "Toggle full / compact view" msgstr "" #: gajim/data/gui/shortcuts_window.ui:94 msgid "Recent history" msgstr "" #: gajim/data/gui/shortcuts_window.ui:99 msgid "Scroll up" msgstr "" #: gajim/data/gui/shortcuts_window.ui:106 msgid "Scroll down" msgstr "" #: gajim/data/gui/shortcuts_window.ui:121 msgid "Tabs" msgstr "" #: gajim/data/gui/shortcuts_window.ui:126 msgid "Switch to the previous tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:133 msgid "Switch to the next tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:140 msgid "Switch to the first - ninth tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:147 msgid "Switch to the previous unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:154 msgid "Switch to the next unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:161 msgid "Close chat" msgstr "" #: gajim/data/gui/shortcuts_window.ui:172 msgid "Roster Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:195 msgid "File transfers" msgstr "" #: gajim/data/gui/shortcuts_window.ui:209 msgid "Join a group chat" msgstr "" #: gajim/data/gui/shortcuts_window.ui:216 msgid "Set the status message" msgstr "" #: gajim/data/gui/shortcuts_window.ui:223 msgid "Quit Gajim" msgstr "" #: gajim/data/gui/shortcuts_window.ui:236 msgid "Show offline contacts" msgstr "Mostra els contactes desconnectats" #: gajim/data/gui/shortcuts_window.ui:243 msgid "Show only active contacts" msgstr "Mostra només contactes actius" #: gajim/data/gui/shortcuts_window.ui:250 msgid "Enable roster filtering" msgstr "" #: gajim/data/gui/shortcuts_window.ui:258 msgid "Contacts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:263 msgid "Contact information" msgstr "" #: gajim/data/gui/shortcuts_window.ui:270 msgid "Rename contact" msgstr "" #: gajim/data/gui/shortcuts_window.ui:277 msgid "Delete contact" msgstr "" #: gajim/data/gui/passphrase_dialog.ui:8 msgid "Passphrase" msgstr "Contrasenya" #: gajim/data/gui/history_window.ui:38 msgid "Enter name / JID of contact or groupchat" msgstr "" #: gajim/data/gui/history_window.ui:51 msgid "Search:" msgstr "Cerca:" #: gajim/data/gui/history_window.ui:75 msgid "_In date search" msgstr "Creca en data" #: gajim/data/gui/history_window.ui:79 msgid "Only searching within selected day" msgstr "Nomes cerca al dia seleccionat" #: gajim/data/gui/history_window.ui:306 msgid "_Show status changes" msgstr "Mostra els canvis d'estat" #: gajim/data/gui/manage_pep_services_window.ui:13 msgid "PEP Service Configuration" msgstr "Configuració Servei PEP:" #: gajim/data/gui/manage_pep_services_window.ui:69 msgid "_Configure" msgstr "_Configura" #: gajim/data/gui/groups_post_window.ui:9 msgid "Create new post" msgstr "Crea nou missatge" #: gajim/data/gui/groups_post_window.ui:29 #: gajim/data/gui/single_message_window.ui:46 msgid "From:" msgstr "Des de:" #: gajim/data/gui/groups_post_window.ui:41 #: gajim/data/gui/single_message_window.ui:70 msgid "Subject:" msgstr "Assumpte:" #: gajim/data/gui/data_form_window.ui:19 msgid "Fill in the form." msgstr "Omple el formulari." #: gajim/data/gui/data_form_window.ui:274 msgid "Room Configuration" msgstr "Configuració de Sala" #: gajim/data/gui/roster_item_exchange_window.ui:8 msgid "Roster Item Exchange" msgstr "" #: gajim/data/gui/systray_context_menu.ui:12 msgid "Sta_tus" msgstr "" #: gajim/data/gui/systray_context_menu.ui:20 msgid "_Start Chat..." msgstr "Inicia Xat..." #: gajim/data/gui/systray_context_menu.ui:50 msgid "Show All Pending _Events" msgstr "" #: gajim/data/gui/systray_context_menu.ui:59 msgid "Mute Sounds" msgstr "" #: gajim/data/gui/systray_context_menu.ui:75 #, fuzzy msgid "_Preferences" msgstr "Preferències" #: gajim/data/gui/systray_context_menu.ui:90 #, fuzzy msgid "_Quit" msgstr "Surt" #: gajim/data/gui/single_message_window.ui:59 msgid "To:" msgstr "" #: gajim/data/gui/single_message_window.ui:118 msgid "0" msgstr "" #: gajim/data/gui/single_message_window.ui:210 msgid "Sen_d" msgstr "" #: gajim/data/gui/single_message_window.ui:216 msgid "Send message" msgstr "Envia missatge" #: gajim/data/gui/single_message_window.ui:229 msgid "_Reply" msgstr "" #: gajim/data/gui/single_message_window.ui:235 msgid "Reply to this message" msgstr "" #: gajim/data/gui/single_message_window.ui:248 msgid "_Send & Close" msgstr "" #: gajim/data/gui/single_message_window.ui:254 msgid "Send message and close window" msgstr "" #: gajim/data/gui/change_activity_dialog.ui:8 msgid "Set Activity" msgstr "Estableix Activitat" #: gajim/data/gui/change_activity_dialog.ui:65 msgid "Set an activity" msgstr "Estableix una activitat" #: gajim/data/gui/change_activity_dialog.ui:337 msgid "Message: " msgstr "Missatge:" #: gajim/command_system/mapping.py:164 gajim/command_system/mapping.py:174 #: gajim/command_system/mapping.py:194 msgid "Missing arguments" msgstr "" #: gajim/command_system/mapping.py:261 msgid "Too many arguments" msgstr "" #: gajim/command_system/implementation/execute.py:53 msgid "Execute expression inside a shell, show output" msgstr "" #: gajim/command_system/implementation/execute.py:109 msgid "Execute expression inside a shell, send output" msgstr "" #: gajim/command_system/implementation/standard.py:45 msgid "" "Show help on a given command or a list of available commands if -a is given" msgstr "" #: gajim/command_system/implementation/standard.py:72 msgid "Send a message to the contact" msgstr "" #: gajim/command_system/implementation/standard.py:77 msgid "Send action (in the third person) to the current chat" msgstr "" #: gajim/command_system/implementation/standard.py:82 msgid "Show logged messages which mention given text" msgstr "" #: gajim/command_system/implementation/standard.py:87 #, python-format msgid "%s: Nothing found" msgstr "" #: gajim/command_system/implementation/standard.py:93 msgid "Limit must be an integer" msgstr "" #: gajim/command_system/implementation/standard.py:117 msgid "" "\n" " Set the current status\n" "\n" " Status can be given as one of the following values:\n" " online, away, chat, xa, dnd.\n" " " msgstr "" #: gajim/command_system/implementation/standard.py:135 msgid "Set the current status to away" msgstr "" #: gajim/command_system/implementation/standard.py:149 msgid "Set the current status to online" msgstr "" #: gajim/command_system/implementation/standard.py:152 msgid "Available" msgstr "Disponible" #: gajim/command_system/implementation/standard.py:172 #: gajim/command_system/implementation/standard.py:249 msgid "Clear the text window" msgstr "" #: gajim/command_system/implementation/standard.py:177 #: gajim/command_system/implementation/standard.py:389 msgid "Send a ping to the contact" msgstr "" #: gajim/command_system/implementation/standard.py:180 #: gajim/command_system/implementation/standard.py:392 msgid "Command is not supported for zeroconf accounts" msgstr "" #: gajim/command_system/implementation/standard.py:184 msgid "Send DTMF sequence through an open audio session" msgstr "" #: gajim/command_system/implementation/standard.py:187 msgid "No open audio sessions with the contact" msgstr "" #: gajim/command_system/implementation/standard.py:190 #, python-format msgid "%s is not a valid tone" msgstr "" #: gajim/command_system/implementation/standard.py:197 msgid "Toggle audio session" msgstr "" #: gajim/command_system/implementation/standard.py:200 msgid "Audio sessions are not available" msgstr "" #: gajim/command_system/implementation/standard.py:207 msgid "Toggle video session" msgstr "" #: gajim/command_system/implementation/standard.py:210 msgid "Video sessions are not available" msgstr "" #: gajim/command_system/implementation/standard.py:217 msgid "Send a message to the contact that will attract his (her) attention" msgstr "" #: gajim/command_system/implementation/standard.py:256 msgid "Change your nickname in a group chat" msgstr "" #: gajim/command_system/implementation/standard.py:266 msgid "Open a private chat window with a specified occupant" msgstr "" #: gajim/command_system/implementation/standard.py:272 #: gajim/command_system/implementation/standard.py:281 #: gajim/command_system/implementation/standard.py:327 #: gajim/command_system/implementation/standard.py:339 #: gajim/command_system/implementation/standard.py:351 msgid "Nickname not found" msgstr "" #: gajim/command_system/implementation/standard.py:275 msgid "" "Open a private chat window with a specified occupant and send him a message" msgstr "" #: gajim/command_system/implementation/standard.py:284 msgid "Display or change a group chat topic" msgstr "" #: gajim/command_system/implementation/standard.py:292 msgid "Invite a user to a room for a reason" msgstr "" #: gajim/command_system/implementation/standard.py:295 #, python-format msgid "Invited %(jid)s to %(room_jid)s" msgstr "" #: gajim/command_system/implementation/standard.py:299 msgid "Join a group chat given by a jid" msgstr "" #: gajim/command_system/implementation/standard.py:307 msgid "" "Leave the groupchat, optionally giving a reason, and close tab or window" msgstr "" #: gajim/command_system/implementation/standard.py:312 msgid "" "\n" " Ban user by a nick or a jid from a groupchat\n" "\n" " If given nickname is not found it will be treated as a jid.\n" " " msgstr "" #: gajim/command_system/implementation/standard.py:324 msgid "Kick user by a nick from a groupchat" msgstr "" #: gajim/command_system/implementation/standard.py:332 msgid "" "Set occupant role in group chat.\n" " Role can be given as one of the following values:\n" " moderator, participant, visitor, none" msgstr "" #: gajim/command_system/implementation/standard.py:337 msgid "Invalid role given" msgstr "" #: gajim/command_system/implementation/standard.py:344 msgid "" "Set occupant affiliation in group chat.\n" " Affiliation can be given as one of the following values:\n" " owner, admin, member, outcast, none" msgstr "" #: gajim/command_system/implementation/standard.py:349 msgid "Invalid affiliation given" msgstr "" #: gajim/command_system/implementation/standard.py:357 msgid "Display names of all group chat occupants" msgstr "" #: gajim/command_system/implementation/standard.py:379 msgid "Forbid an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/standard.py:384 msgid "Allow an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/middleware.py:72 msgid "Error during command execution!" msgstr "" #: gajim/command_system/implementation/custom.py:106 msgid "The same as using a doc-string, except it supports translation" msgstr "" #: gajim/plugins/pluginmanager.py:611 gajim/plugins/pluginmanager.py:617 msgid "Archive corrupted" msgstr "" #: gajim/plugins/pluginmanager.py:613 msgid "Archive empty" msgstr "" #: gajim/plugins/pluginmanager.py:625 gajim/plugins/pluginmanager.py:633 #: gajim/plugins/gui.py:264 msgid "Archive is malformed" msgstr "" #: gajim/plugins/pluginmanager.py:641 gajim/plugins/gui.py:288 #: gajim/plugins/gui.py:296 msgid "Plugin already exists" msgstr "" #: gajim/plugins/gui.py:84 msgid "Plugin" msgstr "" #: gajim/plugins/gui.py:156 #, python-format msgid "Warning: %s" msgstr "" #: gajim/plugins/gui.py:213 msgid "Plugin failed" msgstr "" #: gajim/plugins/gui.py:256 msgid "Unable to properly remove the plugin" msgstr "" #: gajim/plugins/gui.py:288 msgid "Overwrite?" msgstr "" #: gajim/plugins/gui.py:320 msgid "Configuration" msgstr "" #: data/org.gajim.Gajim.desktop.in:5 msgid "Jabber IM Client" msgstr "" #: data/org.gajim.Gajim.desktop.in:6 data/org.gajim.Gajim.appdata.xml.in:10 msgid "A GTK+ Jabber client" msgstr "" #: data/org.gajim.Gajim.desktop.in:8 msgid "chat;messaging;im;xmpp;bonjour;voip;" msgstr "" #: data/org.gajim.Gajim.desktop.in:12 msgid "org.gajim.Gajim" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:12 msgid "" "Gajim is a chat client to be used with Jabber.org, Live Journal Talk, " "Nimbuzz, Ovi, Talkonaut, and thousands of other services run by companies " "and ISPs, and volunteers around the world." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:16 msgid "" "If you have a few accounts on different servers, if you want to be in " "contact with your friends and family all the time, then Gajim is for you." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:19 #, fuzzy msgid "Features:" msgstr "Característiques" #: data/org.gajim.Gajim.appdata.xml.in:21 msgid "Tabbed chat window and single window modes" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:22 msgid "" "Group chat support (with Multi-User Chat protocol), invitation, chat to " "group chat transformation" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:23 msgid "Emoticons, avatars, PEP (user activity, mood and tune)" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:24 msgid "Audio / video conferences" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:25 #, fuzzy msgid "File transfer, room bookmarks" msgstr "Transferències de fitxers" #: data/org.gajim.Gajim.appdata.xml.in:26 msgid "Metacontacts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:27 msgid "Trayicon, speller, extended chat history functionalities" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:28 msgid "TLS, GPG and End-To-End encryption support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:29 msgid "Transport registration support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:30 msgid "Service discovery including nodes, user search" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:31 msgid "Wikipedia, dictionary and search engine lookup" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:32 msgid "Multiple accounts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:33 msgid "XML console interface" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:34 msgid "Link local (bonjour / zeroconf), BOSH" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:35 msgid "Other features via plugins" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:47 msgid "Roster, list of contacts" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:51 msgid "Tabbed chat window" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:55 #, fuzzy msgid "Group chat support" msgstr "Grups de xat" #: data/org.gajim.Gajim.appdata.xml.in:59 #, fuzzy msgid "Chat history" msgstr "Historial" #: data/org.gajim.Gajim.appdata.xml.in:63 msgid "Plugin manager" msgstr "" #, fuzzy #~ msgid "" #~ "Install /\n" #~ "Upgrade" #~ msgstr "Instal·lat" #, fuzzy #~ msgid "Install/Upgrade" #~ msgstr "Instal·lat" #, fuzzy #~ msgid "Install and Upgrade Plugins" #~ msgstr "Instal·lat" #, fuzzy #~ msgid "Plugins updates" #~ msgstr "Connectors" #, fuzzy #~ msgid "XMPP account %s" #~ msgstr "Fusiona comptes" #~ msgid "Exception" #~ msgstr "Excepció" #~ msgid "_Actions" #~ msgstr "_Accions" #~ msgid "jid" #~ msgstr "jid" #~ msgid "Server:" #~ msgstr "Servidor:" #~ msgid "Password:" #~ msgstr "Contrasenya:" #~ msgid "Join this room _automatically when I connect" #~ msgstr "Entra a aquesta sala _automàticament quan em connecto" #~ msgid "Bro_wse Rooms" #~ msgstr "Navega per les sales" #~ msgid "Change your nickname (Ctrl+N)" #~ msgstr "Canvia el teu nick (Ctrl+N)" #~ msgid "Change the room's subject (Alt+T)" #~ msgstr "Canvia el tema de la sala (Alt+T)" #~ msgid "Bookmark this room (Ctrl+B)" #~ msgstr "Afegeix la sala a llista de preferits (Ctrl+B)" #~ msgid "Browse the chat history (Ctrl+H)" #~ msgstr "Navega per l'historial de xat (Ctrl+H)" #~ msgid "Show advanced functions (Alt+D)" #~ msgstr "Mostra funcions avançades (Alt+D)" #~ msgid "Add this contact to roster (Ctrl+D)" #~ msgstr "Afegeix aquest contacte a la llista de contactes (Ctrl+D)" #~ msgid "Invite contacts to the conversation (Ctrl+G)" #~ msgstr "Convida contactes a la conversa (Ctrl+G)" #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Mostra el perfil del contacte (Ctrl+I)" #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Mostra el perfil del contacte (Ctrl+I)" #~ msgid "Set Custom _Avatar..." #~ msgstr "Estableix _Avatar..." #~ msgid "_Open Gmail Inbox" #~ msgstr "_Obre Safata d'entrada Gmail" #~ msgid "Re_name" #~ msgstr "Reescriu" #~ msgid "" #~ "Resource is sent to the Jabber server in order to separate the same JID " #~ "in two or more parts depending on the number of the clients connected in " #~ "the same server with the same account. So you might be connected in the " #~ "same account with resource 'Home' and 'Work' at the same time. The " #~ "resource which has the highest priority will get the events. (see below)" #~ msgstr "" #~ "El recurs s'envia al servidor per a diferenciar el mateix JID en dos o " #~ "més parts depenent del nombre de clients connectats al mateix servidor " #~ "amb el mateix compte. Per exemple podria estar connectat amb el mateix " #~ "compte alhora amb recursos 'Casa' i 'Feina'. El recurs que tingui la " #~ "prioritat més alta rebrà els events. (veure a baix)" #~ msgid "Priority will change automatically according to your status." #~ msgstr "La prioritat canviarà automàticament d'acord amb l'estat." #~ msgid "Anonymous authentication" #~ msgstr "Autenticació Anònima." #~ msgid "" #~ "Priority is used in Jabber to determine who gets the events from the " #~ "jabber server when two or more clients are connected using the same " #~ "account; The client with the highest priority gets the events" #~ msgstr "" #~ "La prioritat es fa servir per a determinar qui rep els events del " #~ "servidor quan dos o més clients estan connectats amb el mateix compte; El " #~ "client amb la prioritat més alta rep els events" #~ msgid "Click to request authorization to all contacts of another account" #~ msgstr "" #~ "Cliqui per a demanar autorització a tots els contactes d'un altre compte" #~ msgid "Chan_ge Password" #~ msgstr "Canvia Contrasenya" #~ msgid "Click to change account's password" #~ msgstr "Cliqui per a canviar la contrasenya del compte" #~ msgid "Administration operations" #~ msgstr "Operacions d'Administració" #~ msgid "Browse..." #~ msgstr "Navega..." #~ msgid "" #~ "If checked, Gajim, when launched, will automatically connect to jabber " #~ "using this account" #~ msgstr "" #~ "Si està marcat, Gajim, quan s'iniciï, es connectarà automàticament al " #~ "servidor amb aquest compte" #~ msgid "Synchronize logs with server" #~ msgstr "Sincronitza els registres amb el servidor" #~ msgid "" #~ "If checked, any change to the global status (handled by the combobox at " #~ "the bottom of the roster window) will change the status of this account " #~ "accordingly" #~ msgstr "" #~ "Si està marcat, qualsevol canvi a l'estat global (indicat pel control al " #~ "final de la finestra de la llista) canviarà l'estat del compte" #~ msgid "" #~ "Receive conversations from other resources (provided the server has " #~ "support for it)" #~ msgstr "Rep converses des d'altres recursos (si el servidor ho suporta)" #~ msgid "" #~ "If checked, Gajim will also broadcast some more IPs except from just your " #~ "IP, so file transfer has higher chances of working." #~ msgstr "" #~ "Si està marcat, Gajim també publicarà algunes IPs més a part de la teva, " #~ "per a que les transferències de fitxers tinguin més possibilitat de " #~ "funcionar." #~ msgid "Proxy" #~ msgstr "Servidor intermediari" #~ msgid "" #~ "Check this so Gajim will ask you before sending your password over an " #~ "insecure connection." #~ msgstr "" #~ "Marcar per a que se't demani confirmació abans d'enviar la contrasenya " #~ "sobre una connexió insegura." #~ msgid "" #~ "If checked, Gajim will send keep-alive packets to prevent connection " #~ "timeout which results in disconnection" #~ msgstr "" #~ "Si està marcat, Gajim enviarà paquets keep-alive per a evitar " #~ "desconnexions per timeout" #~ msgid "Use cust_om hostname/port" #~ msgstr "Fa ús de nomdeservidor/port" #~ msgid "_Hostname: " #~ msgstr "Nom de servidor:" #~ msgid "_Port: " #~ msgstr "_Port:" #~ msgid "No key selected" #~ msgstr "No s'ha seleccionat cap clau" #~ msgid "Choose _Key..." #~ msgstr "Escull Clau..." #~ msgid "" #~ "If checked, Gajim will get the password from a GPG agent like seahorse" #~ msgstr "" #~ "Si està marcat, Gajim obtindrà la contrasenya d'un agent GPG com seahorse" #~ msgid "OpenPGP" #~ msgstr "OpenPGP" #~ msgid "_Edit Personal Information..." #~ msgstr "_Edita Informació Personal..." #~ msgid "Information about you, as stored in the server" #~ msgstr "Informació sobre tu, tal i com està guardada al servidor" #~ msgid "Personal Information" #~ msgstr "Informació Personal" #~ msgid "Co_nnect on Gajim startup" #~ msgstr "Co_nnecta a l'inici" #~ msgid "Use cust_om port:" #~ msgstr "Fes ús de port especificat:" #~ msgid "" #~ "If the default port that is used for incoming messages is unfitting for " #~ "your setup you can select another one here.\n" #~ "You might consider to change possible firewall settings." #~ msgstr "" #~ "Si el port per defecte que es fa servir per a missatges d'entrada no està " #~ "disponible aquí pots seleccionar-ne un altre.\n" #~ "Hauries de considerar possibles canvis al tallafocs." #~ msgid "No" #~ msgstr "No" #~ msgid "Yes" #~ msgstr "Sí" #~ msgid "Prefer" #~ msgstr "Prefereix" #~ msgid "Concede" #~ msgstr "Dóna permís" #~ msgid "Forbid" #~ msgstr "Prohibeix" #~ msgid "Auto" #~ msgstr "Automàtic" #~ msgid "Method Auto" #~ msgstr "Mètode Automàtic" #~ msgid "Method Local" #~ msgstr "Mètode Local" #~ msgid "Method Manual" #~ msgstr "Mètode Manual" #~ msgid "body" #~ msgstr "cos" #~ msgid "false" #~ msgstr "fals" #~ msgid "stream" #~ msgstr "Flux de dades" #~ msgid "approve" #~ msgstr "Aprova" #~ msgid "concede" #~ msgstr "dóna permís" #~ msgid "forbid" #~ msgstr "prohibeix" #~ msgid "oppose" #~ msgstr "oposa" #~ msgid "prefer" #~ msgstr "prefereix" #~ msgid "require" #~ msgstr "requereix" #~ msgid "expire" #~ msgstr "expira" #~ msgid "otr" #~ msgstr "otr" #~ msgid "save" #~ msgstr "desa" gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/po/cs.po000066400000000000000000012563531326020644600223050ustar00rootroot00000000000000# translation of gajim.po to Czech # Czech translations for Gajim package. # Copyright (C) 2003-2005 Gajim Team # # 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; version 2 only. # # 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. # This file is distributed under the same license as the Gajim package. # Petr Mensik , 2005. # Pihhan , 2005, 2006. # Pihhan , 2008. # scippio , 2008. # Pihhan , 2009. # msgid "" msgstr "" "Project-Id-Version: gajim\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-03-31 02:05+0000\n" "PO-Revision-Date: 2010-01-22 14:35+0100\n" "Last-Translator: Petr Menšík \n" "Language-Team: <>\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Poedit-Language: Czech\n" "X-Poedit-Country: CZECH REPUBLIC\n" #: gajim/chat_control_base.py:199 msgid "Ping?" msgstr "Ping?" #: gajim/chat_control_base.py:204 msgid "Error." msgstr "Chyba." #: gajim/chat_control_base.py:571 msgid "_Undo" msgstr "" #: gajim/chat_control_base.py:579 gajim/profile_window.py:181 #: gajim/conversation_textview.py:539 msgid "_Clear" msgstr "" #: gajim/chat_control_base.py:1172 msgid "Really send file?" msgstr "Opravdu odeslat soubor?" #: gajim/chat_control_base.py:1173 #, fuzzy, python-format msgid "If you send a file to %s, he/she will know your real JID." msgstr "Pokud odešlete soubor %s, tak bude znát vaše skutečné Jabber ID." #: gajim/session.py:451 gajim/session.py:511 msgid "Confirm these session options" msgstr "Potvrdit volby pro toto sezení" #: gajim/session.py:453 #, fuzzy, python-format msgid "" "The remote client wants to negotiate a session with these features:\n" "\n" "%s\n" "\n" "Are these options acceptable?" msgstr "" "Vzdálený klient chce navázat sezení s těmito volbamy:\n" "\n" "\t%s\n" "\n" "\tJsou tyto volby přijatelné?" #: gajim/session.py:513 #, python-format msgid "" "The remote client selected these options:\n" "\n" "%s\n" "\n" "Continue with the session?" msgstr "" "Vzdálený klient vybral tyto volby:\n" "\n" "%s\n" "\n" "Pokračovat v komunikaci?" #: gajim/session.py:516 #, fuzzy msgid "Always accept for this contact" msgstr "Je OpenPGP povoleno pro tento kontakt?" #: gajim/filetransfers_window.py:89 msgid "File" msgstr "Soubor" #: gajim/filetransfers_window.py:104 msgid "Time" msgstr "Čas" #: gajim/filetransfers_window.py:116 msgid "Progress" msgstr "Průběh" #: gajim/filetransfers_window.py:223 gajim/filetransfers_window.py:279 #, python-format msgid "Filename: %s" msgstr "Soubor: %s" #: gajim/filetransfers_window.py:224 gajim/filetransfers_window.py:486 #, python-format msgid "Size: %s" msgstr "Velikost: %s" #: gajim/filetransfers_window.py:233 gajim/filetransfers_window.py:243 #: gajim/history_manager.py:528 msgid "You" msgstr "Vy" #: gajim/filetransfers_window.py:234 #, python-format msgid "Sender: %s" msgstr "Odesílatel: %s" #: gajim/filetransfers_window.py:235 gajim/filetransfers_window.py:763 #: gajim/tooltips.py:667 msgid "Recipient: " msgstr "Příjemce: " #: gajim/filetransfers_window.py:246 #, python-format msgid "Saved in: %s" msgstr "Uloženo do: %s" #: gajim/filetransfers_window.py:248 gajim/chat_control.py:1617 msgid "File transfer completed" msgstr "Přenos soubor dokončen" #: gajim/filetransfers_window.py:250 gajim/chat_control.py:1621 #, fuzzy msgid "Open _Containing Folder" msgstr "_Otevřít obsahující složku" #: gajim/filetransfers_window.py:263 gajim/filetransfers_window.py:270 #: gajim/chat_control.py:1676 msgid "File transfer cancelled" msgstr "Přenos souboru zrušen" #: gajim/filetransfers_window.py:263 gajim/filetransfers_window.py:271 #: gajim/chat_control.py:1677 msgid "Connection with peer cannot be established." msgstr "Spojení s protistranou se nepodařilo navázat." #: gajim/filetransfers_window.py:280 #, python-format msgid "Recipient: %s" msgstr "Příjemce: %s" #: gajim/filetransfers_window.py:282 #, python-format msgid "Error message: %s" msgstr "Chybová zpráva: %s" #: gajim/filetransfers_window.py:283 gajim/chat_control.py:1673 msgid "File transfer stopped" msgstr "Přenos souboru zastaven" #: gajim/filetransfers_window.py:319 #, python-format msgid "" "The file %(file)s has been received, but it seems to have been damaged along " "the way.\n" "Do you want to download it again?" msgstr "" #: gajim/filetransfers_window.py:345 #, fuzzy msgid "Choose File to Send…" msgstr "Vyber soubor k odeslání..." #: gajim/filetransfers_window.py:356 msgid "_Send" msgstr "Ode_slat" #: gajim/filetransfers_window.py:363 gajim/tooltips.py:702 msgid "Description: " msgstr "Popis:" #: gajim/filetransfers_window.py:376 #, fuzzy msgid "Gajim can not read this file" msgstr "Gajim nemůže otevřít tento soubor" #: gajim/filetransfers_window.py:377 msgid "Another process is using this file." msgstr "" #: gajim/filetransfers_window.py:422 gajim/gtkgui_helpers.py:492 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Nemohu přepsat existující soubor \"%s\"" #: gajim/filetransfers_window.py:423 gajim/gtkgui_helpers.py:493 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." msgstr "Soubor tohoto jména již existuje a ty nemáš oprávnění k jeho přepsání." #: gajim/filetransfers_window.py:440 gajim/gtkgui_helpers.py:497 msgid "This file already exists" msgstr "Tento soubor už existuje" #: gajim/filetransfers_window.py:440 gajim/gtkgui_helpers.py:497 msgid "What do you want to do?" msgstr "Co by jste rád(a) dělal(a)?" #: gajim/filetransfers_window.py:451 gajim/gtkgui_helpers.py:504 #, python-format msgid "Directory \"%s\" is not writable" msgstr "Adresář \"%s\" není zapisovatelný" #: gajim/filetransfers_window.py:452 gajim/gtkgui_helpers.py:505 msgid "You do not have permission to create files in this directory." msgstr "Nemáš oprávnění k vytváření souborů v tomto adresáři." #: gajim/filetransfers_window.py:463 #, fuzzy msgid "Save File as…" msgstr "Uložit jako..." #: gajim/filetransfers_window.py:483 #, python-format msgid "File: %s" msgstr "Soubor: %s" #: gajim/filetransfers_window.py:489 #, python-format msgid "Type: %s" msgstr "Typ: %s" #: gajim/filetransfers_window.py:491 #, python-format msgid "Description: %s" msgstr "Popis: %s" # #: ../src/filetransfers_window.py:309 # #, python-format # msgid "Description: %s" # msgstr "Popis: %s" #: gajim/filetransfers_window.py:492 #, python-format msgid "%s wants to send you a file:" msgstr "%s Vám chce poslat soubor:" #: gajim/filetransfers_window.py:533 #, fuzzy msgid "Checking file…" msgstr "Odesílám profil..." #: gajim/filetransfers_window.py:547 #, fuzzy msgid "File error" msgstr "Chyba přenosu souboru" #: gajim/filetransfers_window.py:584 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" #: gajim/filetransfers_window.py:677 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" #: gajim/filetransfers_window.py:730 gajim/filetransfers_window.py:733 msgid "Invalid File" msgstr "Neplatný soubor" #: gajim/filetransfers_window.py:730 msgid "File: " msgstr "Soubor: " #: gajim/filetransfers_window.py:734 msgid "It is not possible to send empty files" msgstr "Není možné posílat prázdné soubory" #: gajim/filetransfers_window.py:759 gajim/tooltips.py:658 msgid "Name: " msgstr "Jméno: " #: gajim/filetransfers_window.py:761 gajim/tooltips.py:661 msgid "Sender: " msgstr "Odesílatel: " #: gajim/filetransfers_window.py:889 msgid "Pause" msgstr "Pauza" #: gajim/filetransfers_window.py:900 msgid "_Continue" msgstr "_Pokračovat" #: gajim/features_window.py:48 msgid "Bonjour / Zeroconf" msgstr "Bonjour / Zeroconf" #: gajim/features_window.py:49 msgid "Serverless chatting with autodetected clients in a local network." msgstr "" "Serverless automaticky komunikuje s klienty detekovanými v místní síti." #: gajim/features_window.py:50 msgid "Requires python-avahi." msgstr "Je potřeba python-avahi." #: gajim/features_window.py:51 msgid "" "Requires pybonjour and bonjour SDK running (http://developer.apple.com/" "opensource/)." msgstr "" #: gajim/features_window.py:52 msgid "Command line" msgstr "Příkazový řádek" #: gajim/features_window.py:53 msgid "A script to control Gajim via commandline." msgstr "Skript, který ovládá Gajim z příkazové řádky." #: gajim/features_window.py:54 msgid "Requires python-dbus." msgstr "Je potřeba python-dbus." #: gajim/features_window.py:55 gajim/features_window.py:83 #: gajim/features_window.py:87 msgid "Feature not available under Windows." msgstr "Vlastnost není k dispozici pod Windows." #: gajim/features_window.py:56 #, fuzzy msgid "OpenPGP message encryption" msgstr "Šifrování zpráv OpenGPG " #: gajim/features_window.py:57 #, fuzzy msgid "Ability to encrypting chat messages with OpenPGP." msgstr "Šifruji zprávy gpg klíči." #: gajim/features_window.py:58 msgid "Requires gpg and python-gnupg (http://code.google.com/p/python-gnupg/)." msgstr "" #: gajim/features_window.py:59 msgid "Requires gpg.exe in PATH." msgstr "" #: gajim/features_window.py:60 msgid "Password encryption" msgstr "Šifrování hesla" #: gajim/features_window.py:61 msgid "Passwords can be stored securely and not just in plaintext." msgstr "Heslo může být bezpečně uloženo." #: gajim/features_window.py:62 msgid "" "Requires libsecret and a provider (such as GNOME Keyring and KSecretService)." msgstr "" #: gajim/features_window.py:63 msgid "On Windows the Windows Credential Vault is used." msgstr "" #: gajim/features_window.py:64 msgid "Spell Checker" msgstr "Kontrola Pravopisu" #: gajim/features_window.py:65 msgid "Spellchecking of composed messages." msgstr "Kontrola Pravopisu psaných zpráv." #: gajim/features_window.py:66 gajim/features_window.py:67 #, fuzzy msgid "Requires Gspell" msgstr "Vyžaduje libgtkspell." #: gajim/features_window.py:68 msgid "Automatic status" msgstr "Automatický stav" #: gajim/features_window.py:69 msgid "Ability to measure idle time, in order to set auto status." msgstr "Funkce pro měření času nečinnosti pro nastavení automatického stavu." #: gajim/features_window.py:70 msgid "Requires libxss library." msgstr "Vyžaduje knihovnu libxss." #: gajim/features_window.py:71 msgid "Requires python2.5." msgstr "Je potřeba python2.5." #: gajim/features_window.py:72 msgid "End to End message encryption" msgstr "End to End šifrování zpráv" #: gajim/features_window.py:73 msgid "Encrypting chat messages." msgstr "Šifruji zprávy." #: gajim/features_window.py:74 gajim/features_window.py:75 msgid "Requires python-crypto." msgstr "Je potřeba python-crypto." #: gajim/features_window.py:76 msgid "RST Generator" msgstr "RST Generátor" #: gajim/features_window.py:77 msgid "" "Generate XHTML output from RST code (see http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." msgstr "" "Generuje XHTML výstup pro RST kód (viz.: http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." #: gajim/features_window.py:78 gajim/features_window.py:79 msgid "Requires python-docutils." msgstr "Je potřeba python-docutils." #: gajim/features_window.py:80 gajim/data/gui/preferences_window.ui:2421 msgid "Audio / Video" msgstr "Audio / Video" #: gajim/features_window.py:81 msgid "Ability to start audio and video chat." msgstr "Schopnost zahájit audio a video rozhovor." #: gajim/features_window.py:82 msgid "" "Requires gir1.2-farstream-0.2, gir1.2-gstreamer-1.0, gstreamer1.0-libav and " "gstreamer1.0-plugins-ugly." msgstr "" #: gajim/features_window.py:84 msgid "UPnP-IGD" msgstr "" #: gajim/features_window.py:85 msgid "Ability to request your router to forward port for file transfer." msgstr "" #: gajim/features_window.py:86 #, fuzzy msgid "Requires gir1.2-gupnpigd-1.0." msgstr "Je potřeba python-gnome2." #: gajim/features_window.py:94 #, fuzzy msgid "?features:Available" msgstr "Připojen" #: gajim/features_window.py:101 msgid "Feature" msgstr "Vlastnost" #: gajim/gtkgui_helpers.py:255 msgid "Error reading file:" msgstr "Chyba při čtení souboru:" #: gajim/gtkgui_helpers.py:258 msgid "Error parsing file:" msgstr "Chyba parsování souboru:" #: gajim/gtkgui_helpers.py:478 msgid "Extension not supported" msgstr "Rozšíření není podporováno" #: gajim/gtkgui_helpers.py:479 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "" "Obrázek nelze uložit ve formátu %(type)s. Uložit jako %(new_filename)s?" #: gajim/gtkgui_helpers.py:514 #, fuzzy msgid "Save Image as…" msgstr "Uložit obrázek jako..." #: gajim/vcard.py:166 gajim/vcard.py:513 gajim/profile_window.py:175 #: gajim/chat_control.py:581 #, fuzzy msgid "Save _As" msgstr "Má" #: gajim/vcard.py:289 gajim/vcard.py:296 msgid "?Client:Unknown" msgstr "?Client:Neznámý" #: gajim/vcard.py:293 gajim/vcard.py:298 msgid "?OS:Unknown" msgstr "?OS:Neznámý" #: gajim/vcard.py:327 gajim/vcard.py:330 msgid "?Time:Unknown" msgstr "?Time:Neznámý" #: gajim/vcard.py:381 msgid "?Role in Group Chat:Role:" msgstr "" #: gajim/vcard.py:385 msgid "Affiliation:" msgstr "Vztah" #: gajim/vcard.py:392 #, fuzzy msgid "" "This contact is interested in your presence information, but you are not " "interested in their presence" msgstr "Tento kontakt zajímá Váš stav, ale Vy se nezajímate o jeho stav" #: gajim/vcard.py:394 #, fuzzy msgid "" "You are interested in the contact's presence information, but it is not " "mutual" msgstr "Vy se zajímáte o stav kontaktu, ale on se nezajímá o Váš stav" #: gajim/vcard.py:396 #, fuzzy msgid "The contact and you want to exchange presence information" msgstr "Vy i kontakt se zajímáte o stav toho druhého" #: gajim/vcard.py:398 #, fuzzy msgid "" "You and the contact have a mutual disinterest in each-others presence " "information" msgstr "Vy i kontakt se zajímáte o stav toho druhého" #: gajim/vcard.py:404 msgid "You are waiting contact's answer about your subscription request" msgstr "Čekáte na odpověď kontaktu na vaši žádost o autorizaci" #: gajim/vcard.py:406 msgid "There is no pending subscription request." msgstr "Není zde žádný nevyřízený požadavek." #: gajim/vcard.py:411 gajim/vcard.py:455 gajim/vcard.py:568 msgid " resource with priority " msgstr "zdroj s prioritou " #: gajim/options_dialog.py:383 gajim/dialogs.py:4806 gajim/dialogs.py:4848 #: gajim/dialogs.py:4896 gajim/dialogs.py:4986 msgid "All files" msgstr "Všechny soubory" #: gajim/options_dialog.py:392 #, fuzzy msgid "Clear File" msgstr "Uklízím" #: gajim/options_dialog.py:474 #, fuzzy msgid "Manage Proxies" msgstr "Spravovat profily Proxy" #: gajim/options_dialog.py:484 gajim/options_dialog.py:552 #: gajim/options_dialog.py:573 gajim/dialogs.py:326 gajim/dialogs.py:328 #: gajim/dialogs.py:536 gajim/dialogs.py:549 gajim/roster_window.py:2997 #: gajim/roster_window.py:3003 gajim/roster_window.py:3008 gajim/config.py:1162 #: gajim/config.py:1177 gajim/config.py:1182 gajim/config.py:1230 #: gajim/config.py:1340 gajim/config.py:2489 gajim/config.py:2566 #: gajim/data/gui/account_creation_wizard_window.ui:22 #: gajim/data/gui/change_mood_dialog.ui:98 msgid "None" msgstr "Žádný" #: gajim/options_dialog.py:506 #, fuzzy msgid "Adjust to Status" msgstr "N_astavit podle stavu" #: gajim/options_dialog.py:518 msgid "On" msgstr "" #: gajim/options_dialog.py:518 #, fuzzy msgid "Off" msgstr "Odpojen" #: gajim/options_dialog.py:556 msgid "Failed to get secret keys" msgstr "Selhalo získání privátního klíče" #: gajim/options_dialog.py:557 msgid "There is no OpenPGP secret key available." msgstr "Není dostupný tajný klíč OpenPGP." #: gajim/options_dialog.py:562 msgid "OpenPGP Key Selection" msgstr "Výběr OpenPGP klíče" #: gajim/options_dialog.py:562 msgid "Choose your OpenPGP key" msgstr "Vyberte Váš OpenPGP klíč" #: gajim/gui_menu_builder.py:100 msgid "_New Group Chat" msgstr "_Nová diskuze" #: gajim/gui_menu_builder.py:292 gajim/gui_menu_builder.py:416 #: gajim/dialogs.py:1114 gajim/dialogs.py:2333 gajim/dialogs.py:2362 #: gajim/dialogs.py:3867 gajim/chat_control.py:284 gajim/roster_window.py:804 #: gajim/roster_window.py:1753 gajim/roster_window.py:1755 #: gajim/roster_window.py:2068 gajim/roster_window.py:3419 #: gajim/roster_window.py:3446 gajim/gui_interface.py:524 #: gajim/common/contacts.py:154 gajim/common/contacts.py:280 #: gajim/common/helpers.py:95 gajim/common/helpers.py:408 msgid "Not in Roster" msgstr "Není v Rosteru" #: gajim/gui_menu_builder.py:431 msgid "I would like to add you to my roster" msgstr "Rád bych si Vás přidal(a) do svého seznamu" #: gajim/gui_menu_builder.py:508 #, fuzzy msgid "Send Single _Message…" msgstr "Odeslat jednoduchou _zprávu" #: gajim/gui_menu_builder.py:521 gajim/roster_window.py:5165 #: gajim/data/gui/contact_context_menu.ui:58 msgid "Send Cus_tom Status" msgstr "Poslat vlastní stav" #: gajim/gui_menu_builder.py:541 #, fuzzy msgid "E_xecute Command…" msgstr "Spustit _příkaz..." #: gajim/gui_menu_builder.py:549 msgid "_Manage Transport" msgstr "Transporty" #: gajim/gui_menu_builder.py:555 msgid "_Modify Transport" msgstr "_Upravit transport" #: gajim/gui_menu_builder.py:562 gajim/roster_window.py:5195 #, fuzzy msgid "_Rename…" msgstr "_Přejmenovat" #: gajim/gui_menu_builder.py:573 gajim/roster_window.py:5212 #: gajim/roster_window.py:5327 gajim/data/gui/blocked_contacts_window.ui:52 #: gajim/data/gui/gc_occupants_menu.ui:148 #: gajim/data/gui/contact_context_menu.ui:166 msgid "_Unblock" msgstr "_Odblokovat" #: gajim/gui_menu_builder.py:576 gajim/roster_window.py:5217 #: gajim/roster_window.py:5331 gajim/data/gui/gc_occupants_menu.ui:140 #: gajim/data/gui/contact_context_menu.ui:174 msgid "_Block" msgstr "_Blokovat" #: gajim/gui_menu_builder.py:584 gajim/roster_window.py:5224 #: gajim/data/gui/contact_context_menu.ui:204 msgid "Remo_ve" msgstr "Odst_ranit" #: gajim/gui_menu_builder.py:594 gajim/data/gui/search_window.ui:98 msgid "_Information" msgstr "Informace o kontaktu" #: gajim/gui_menu_builder.py:611 #, fuzzy msgid "Send File..." msgstr "Odeslat _Soubor" #: gajim/gui_menu_builder.py:615 #, fuzzy msgid "Invite Contacts" msgstr "Pozvat kontakt" #: gajim/gui_menu_builder.py:616 #, fuzzy msgid "Add to Roster" msgstr "Přid_at do Seznamu" #: gajim/gui_menu_builder.py:617 #, fuzzy msgid "Audio Session" msgstr "Audio / Video" #: gajim/gui_menu_builder.py:618 #, fuzzy msgid "Video Session" msgstr "Velikost videa" #: gajim/gui_menu_builder.py:619 #, fuzzy msgid "Information" msgstr "Informace o kontaktu" #: gajim/gui_menu_builder.py:620 gajim/gui_menu_builder.py:655 #: gajim/data/gui/application_menu.ui:37 #, fuzzy msgid "History" msgstr "_Historie" #: gajim/gui_menu_builder.py:644 #, fuzzy msgid "Manage Room" msgstr "Spravuj Místnost" #: gajim/gui_menu_builder.py:645 #, fuzzy msgid "Change Subject" msgstr "Změnit _předmět" #: gajim/gui_menu_builder.py:646 #, fuzzy msgid "Configure Room" msgstr "Nastavit _místnost" #: gajim/gui_menu_builder.py:647 #, fuzzy msgid "Destroy Room" msgstr "_Zničit místnost" #: gajim/gui_menu_builder.py:649 #, fuzzy msgid "Change Nick" msgstr "Změ_nit přezdívku" #: gajim/gui_menu_builder.py:650 #, fuzzy msgid "Bookmark Room" msgstr "Přidat tuto místnost do záložek" #: gajim/gui_menu_builder.py:651 #, fuzzy msgid "Request Voice" msgstr "_Hlas" #: gajim/gui_menu_builder.py:652 gajim/data/gui/gc_control_popup_menu.ui:72 #, fuzzy msgid "Notify on all messages" msgstr "Uložené stavy:" #: gajim/gui_menu_builder.py:653 #, fuzzy msgid "Minimize on close" msgstr "_Minimalizovat při zavření" #: gajim/gui_menu_builder.py:654 gajim/roster_window.py:5397 #, fuzzy msgid "Execute command" msgstr "Spustit _příkaz..." #: gajim/gui_menu_builder.py:656 #, fuzzy msgid "Disconnect" msgstr "_Odpojit" #: gajim/gui_menu_builder.py:685 gajim/gui_menu_builder.py:732 msgid "Join Group Chat" msgstr "Připojit se do diskuze" #: gajim/gui_menu_builder.py:731 #, fuzzy msgid "Add Contact..." msgstr "Přid_at kontakt..." #: gajim/gui_menu_builder.py:733 gajim/accounts_window.py:460 #: gajim/accounts_window.py:555 gajim/accounts_window.py:594 #, fuzzy msgid "Profile" msgstr "soubor" # FIXME: chtelo by to cesky vyraz pro service discovery #: gajim/gui_menu_builder.py:734 #, fuzzy msgid "Discover Services" msgstr "_Prohlížet služby" #: gajim/gui_menu_builder.py:735 #, fuzzy msgid "Send Single Message..." msgstr "Odeslat jednoduchou _zprávu..." #: gajim/gui_menu_builder.py:736 gajim/data/gui/preferences_window.ui:2846 msgid "Advanced" msgstr "Rozšířené" #: gajim/gui_menu_builder.py:737 #, fuzzy msgid "Archiving Preferences" msgstr "_Nastavení" #: gajim/gui_menu_builder.py:738 gajim/history_sync.py:44 #, fuzzy msgid "Synchronise History" msgstr "Synchronizovat" #: gajim/gui_menu_builder.py:739 gajim/dialogs.py:4583 msgid "Privacy Lists" msgstr "Soukromý Seznam" #: gajim/gui_menu_builder.py:740 gajim/server_info.py:37 #, fuzzy msgid "Server Info" msgstr "Server" #: gajim/gui_menu_builder.py:741 gajim/data/gui/xml_console_window.ui:77 msgid "XML Console" msgstr "XML Konzole" #: gajim/gui_menu_builder.py:743 #, fuzzy msgid "Admin" msgstr "_Správce" #: gajim/gui_menu_builder.py:744 #, fuzzy msgid "Send Server Message..." msgstr "Ode_slat zprávu serveru" #: gajim/gui_menu_builder.py:745 msgid "Set MOTD..." msgstr "Nastavit MOTD" #: gajim/gui_menu_builder.py:746 msgid "Update MOTD..." msgstr "Upravit MOTD" #: gajim/gui_menu_builder.py:747 #, fuzzy msgid "Delete MOTD..." msgstr "Smazat MOTD" #: gajim/gui_menu_builder.py:787 #, fuzzy msgid "No Accounts available" msgstr "Žádný účet není dostupný" #: gajim/gui_menu_builder.py:799 gajim/data/gui/accounts_window.ui:78 #: gajim/data/gui/application_menu.ui:5 gajim/data/gui/application_menu.ui:71 #: gajim/data/gui/shortcuts_window.ui:181 msgid "Accounts" msgstr "Účty" #: gajim/history_manager.py:56 #, fuzzy msgid "Usage:" msgstr "zpráva" #: gajim/history_manager.py:58 #, fuzzy msgid "Options:" msgstr "_Smajlíky:" #: gajim/history_manager.py:60 msgid "Show this help message and exit" msgstr "" #: gajim/history_manager.py:61 msgid "Choose folder for logfile" msgstr "" #: gajim/history_manager.py:104 msgid "Cannot find history logs database" msgstr "Nemůžu nalézt databázi s historií" #: gajim/history_manager.py:144 gajim/history_manager.py:195 #: gajim/dialogs.py:3848 gajim/config.py:1621 gajim/disco.py:872 msgid "JID" msgstr "JID" #: gajim/history_manager.py:157 gajim/history_manager.py:201 #: gajim/history_window.py:108 msgid "Date" msgstr "Datum" #: gajim/history_manager.py:164 gajim/history_manager.py:220 #: gajim/data/gui/join_groupchat_window.ui:131 msgid "Nickname" msgstr "Přezdívka" #: gajim/history_manager.py:173 gajim/history_manager.py:208 #: gajim/history_window.py:116 gajim/data/gui/xml_console_window.ui:108 msgid "Message" msgstr "Zpráva" #: gajim/history_manager.py:181 gajim/history_manager.py:214 msgid "Subject" msgstr "Předmět" #: gajim/history_manager.py:243 msgid "" "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " "RUNNING)" msgstr "Chcete pročistit databázi? (VELICE NEDOPORUČUJEME POKUD GAJIM BĚŽÍ)" #: gajim/history_manager.py:245 #, fuzzy msgid "" "Normally allocated database size will not be freed, it will just become " "reusable. If you really want to reduce database filesize, click YES, else " "click NO.\n" "\n" "In case you click YES, please wait…" msgstr "" "Běžně se velikost alokovaná databází neuvolňuje, pouze se označí k novému " "použití. Pokud opravdu chcete snížit velikost databáze, klikněte ANO, jinak " "NE.\n" "\n" "V případě kliknutí na ANO prosím vyčkejte..." #: gajim/history_manager.py:250 #, fuzzy msgid "Database Cleanup" msgstr "Chyba Databáze" #: gajim/history_manager.py:464 #, fuzzy msgid "Exporting History Logs…" msgstr "Exportuji záznamy historie..." #: gajim/history_manager.py:540 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "%(who)s v %(time)s řekl(a): %(message)s\n" #: gajim/history_manager.py:578 #, fuzzy, python-format msgid "Do you wish to delete all correspondence with %(jid)s?" msgstr "Vážně chcete smazat vybranou zprávu?" #: gajim/history_manager.py:582 #, fuzzy msgid "Do you wish to delete all correspondence with the selected contacts?" msgstr "Vážně chcete smazat všechny záznamy historie vybraného kontaktu?" #: gajim/history_manager.py:584 #, fuzzy msgid "This can not be undone." msgstr "Tato služba nebyla nalezena" #: gajim/history_manager.py:586 gajim/history_manager.py:625 #, fuzzy msgid "Deletion Confirmation" msgstr "Zrušit ověření" #: gajim/history_manager.py:620 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Vážně chcete smazat vybranou zprávu?" msgstr[1] "Vážně chcete smazat vybrané zprávy?" msgstr[2] "Vážně chcete smazat vybrané zprávy?" #: gajim/history_manager.py:623 msgid "This is an irreversible operation." msgstr "Tato operace je nevratná." #: gajim/profile_window.py:63 #, fuzzy msgid "Retrieving profile…" msgstr "Stahuji profil..." #: gajim/profile_window.py:128 msgid "Could not load image" msgstr "Nezdařilo se načtení obrázku" #: gajim/profile_window.py:200 #, fuzzy msgid "Wrong date format" msgstr "Informace o kontaktu" #: gajim/profile_window.py:201 #, fuzzy msgid "Format of the date must be YYYY-MM-DD" msgstr "Formát: RRRR-MM-DD" #: gajim/profile_window.py:261 msgid "Information received" msgstr "Informace přijata" #: gajim/profile_window.py:334 gajim/dialogs.py:2562 gajim/dialogs.py:2650 #: gajim/dialogs.py:3105 gajim/disco.py:536 gajim/gui_interface.py:1849 #: gajim/dialog_messages.py:32 msgid "You are not connected to the server" msgstr "Nejste připojen(a) k serveru" #: gajim/profile_window.py:335 #, fuzzy msgid "Without a connection, you can not publish your contact information." msgstr "Bez opětovného připojení nemůžete zveřejnit Vaše osobní údaje." #: gajim/profile_window.py:349 #, fuzzy msgid "Sending profile…" msgstr "Odesílám profil..." #: gajim/profile_window.py:368 msgid "Information NOT published" msgstr "Informace NEBYLY zveřejněny" #: gajim/profile_window.py:375 msgid "vCard publication failed" msgstr "publikování vizitky se nezdařilo" #: gajim/profile_window.py:376 msgid "" "There was an error while publishing your personal information, try again " "later." msgstr "" "Nastala chyba při publikování Vašich osobních údajů, zkuste to později znovu." #: gajim/dialogs.py:90 #, python-format msgid "Contact name: %s" msgstr "Jméno kontaktu: %s" #: gajim/dialogs.py:92 #, fuzzy, python-format msgid "JID: %s" msgstr "Jabber ID: %s" #: gajim/dialogs.py:121 gajim/dialogs.py:133 gajim/roster_window.py:2939 #: gajim/roster_window.py:3953 gajim/roster_window.py:5234 #: gajim/accounts_window.py:463 gajim/common/contacts.py:105 #: gajim/common/contacts.py:137 gajim/data/gui/preferences_window.ui:569 #: gajim/data/gui/shortcuts_window.ui:176 msgid "General" msgstr "Obecné" #: gajim/dialogs.py:206 msgid "Group" msgstr "Skupina" #: gajim/dialogs.py:213 msgid "In the group" msgstr "Ve skupině" #: gajim/dialogs.py:308 msgid "KeyID" msgstr "ID klíče" #: gajim/dialogs.py:313 msgid "Contact name" msgstr "Jméno kontaktu" #: gajim/dialogs.py:491 msgid "Set Mood" msgstr "Nastavit Náladu" #: gajim/dialogs.py:611 #, python-format msgid "%s Status Message" msgstr "Text stavu %s" #: gajim/dialogs.py:625 msgid "Status Message" msgstr "Text stavu" #: gajim/dialogs.py:815 msgid "Overwrite Status Message?" msgstr "Přepsat Text stavu?" #: gajim/dialogs.py:816 msgid "" "This name is already used. Do you want to overwrite this status message?" msgstr "Toto jméno je již použito. Chcete přepsat text stavu?" #: gajim/dialogs.py:824 msgid "Save as Preset Status Message" msgstr "Uložit jako přednastavený stav" #: gajim/dialogs.py:825 msgid "Please type a name for this status message" msgstr "Napište jméno pro tento stav" #: gajim/dialogs.py:852 #, fuzzy msgid "JID:" msgstr "Vaše JID:" #: gajim/dialogs.py:853 msgid "AIM Address:" msgstr "AIM adresa:" #: gajim/dialogs.py:854 msgid "GG Number:" msgstr "GG číslo: " #: gajim/dialogs.py:855 msgid "ICQ Number:" msgstr "ICQ číslo: " #: gajim/dialogs.py:856 msgid "MSN Address:" msgstr "MSN adresa:" #: gajim/dialogs.py:857 msgid "Yahoo! Address:" msgstr "Yahoo! adresa:" #: gajim/dialogs.py:894 #, fuzzy, python-format msgid "" "Please fill in the data of the contact you want to add to your account " "%s" msgstr "Prosím vyplňte údaje kontaktu, který chcete přidat do účtu %s" #: gajim/dialogs.py:897 msgid "Please fill in the data of the contact you want to add" msgstr "Prosím vyplňte údaje o kontaktu, který chcete přidat" #: gajim/dialogs.py:1089 gajim/dialogs.py:1095 gajim/dialogs.py:1100 msgid "Invalid User ID" msgstr "Neplatný identifikátor uživatele" #: gajim/dialogs.py:1096 msgid "The user ID must not contain a resource." msgstr "User ID nesmí obsahovat zdroj." #: gajim/dialogs.py:1101 msgid "You cannot add yourself to your roster." msgstr "Rád(a) bych si tě přidal(a) do seznamu." #: gajim/dialogs.py:1115 msgid "Contact already in roster" msgstr "Kontakt už je v Seznamu" #: gajim/dialogs.py:1116 msgid "This contact is already listed in your roster." msgstr "Tento kontakt už je obsažen ve Vašem seznamu." #: gajim/dialogs.py:1169 gajim/dialogs.py:1203 msgid "User ID:" msgstr "Uživatel:" #: gajim/dialogs.py:1269 #, fuzzy msgid "Error while adding transport contact" msgstr "Chyba při přidávání služby. %s" #: gajim/dialogs.py:1270 #, python-format msgid "" "This error occured while adding a contact for transport %(transport)s:\n" "\n" "%(error)s" msgstr "" #: gajim/dialogs.py:1302 #, fuzzy msgid "A GTK+ XMPP client" msgstr "GTK+ Jabber klient" #: gajim/dialogs.py:1303 #, fuzzy, python-format msgid "GTK+ Version: %s" msgstr "GTK+ verze: " #: gajim/dialogs.py:1304 #, fuzzy, python-format msgid "PyGObject Version: %s" msgstr "PyGTK verze: " #: gajim/dialogs.py:1305 #, python-format msgid "python-nbxmpp Version: %s" msgstr "" #: gajim/dialogs.py:1308 #, fuzzy msgid "Current Developers" msgstr "Aktivní vývojáři:" #: gajim/dialogs.py:1309 #, fuzzy msgid "Past Developers" msgstr "Vysloužilí vývojáři:" #: gajim/dialogs.py:1310 msgid "Artists" msgstr "" #: gajim/dialogs.py:1314 msgid "Last but not least" msgstr "" #: gajim/dialogs.py:1315 #, fuzzy msgid "we would like to thank all the package maintainers." msgstr "" "Poslední, nikoliv nejmenší, poděkování patří všem správcům instalačních " "balíčků." #: gajim/dialogs.py:1316 #, fuzzy msgid "Thanks" msgstr "Děkovný" #: gajim/dialogs.py:1318 msgid "translator-credits" msgstr "" "Petr Menšík \n" "scippio " #: gajim/dialogs.py:1503 #, fuzzy, python-format msgid "Dictionary for language \"%s\" not available" msgstr "Slovník pro jazyk %s není dostupný" #: gajim/dialogs.py:1504 #, fuzzy, python-format msgid "" "You have to install the dictionary \"%s\" to use spellchecking, or choose " "another language by setting the speller_language option.\n" "\n" "Highlighting misspelled words feature will not be used" msgstr "" "Musíš nainstalovat %s slovník k použití kontroly pravopisu, nebo vybrat jiný " "jazyk nastavením volby speller_language." #: gajim/dialogs.py:1851 gajim/dialogs.py:1866 gajim/gui_interface.py:1511 #: gajim/gui_interface.py:1553 msgid "Insecure connection" msgstr "Nezabezpečené Spojení" #: gajim/dialogs.py:1852 #, fuzzy, python-format msgid "" "You are about to connect to the account %(account)s (%(server)s) insecurely. " "This means conversations will not be encrypted, and is strongly " "discouraged.\n" "Are you sure you want to do that?" msgstr "" "Abyste nemuseli posílat heslo nezabezpečeným připojením nainstalujte si " "PyOpenSSL. Jste si jisti, že to chcete udělat?" #: gajim/dialogs.py:1857 gajim/gui_interface.py:1515 #: gajim/gui_interface.py:1556 msgid "Yes, I really want to connect insecurely" msgstr "Ano, chci se připojit nezabezpečeně" #: gajim/dialogs.py:1858 msgid "Gajim will NOT connect unless you check this box" msgstr "" #: gajim/dialogs.py:1859 gajim/groupchat_control.py:2335 #: gajim/roster_window.py:2897 gajim/roster_window.py:3529 #: gajim/roster_window.py:4282 gajim/message_window.py:247 #: gajim/gui_interface.py:725 gajim/gui_interface.py:1516 #: gajim/gui_interface.py:1557 #, fuzzy msgid "_Do not ask me again" msgstr "Příště _nezobrazovat" #: gajim/dialogs.py:1957 msgid "_Resume" msgstr "" #: gajim/dialogs.py:1965 msgid "Re_place" msgstr "" #: gajim/dialogs.py:2168 gajim/config.py:2169 #: gajim/command_system/implementation/standard.py:261 msgid "Invalid nickname" msgstr "Neplatné uživatelské jméno" #: gajim/dialogs.py:2169 #, fuzzy msgid "The nickname contains invalid characters." msgstr "Jabber ID diskuze obsahuje nepřijatelné znaky." #: gajim/dialogs.py:2291 msgid "Subscription Request" msgstr "Žádost o autorizaci" #: gajim/dialogs.py:2300 #, python-format msgid "Subscription request for account %(account)s from %(jid)s" msgstr "Žádost o autorizaci na účtu %(account)s od %(jid)s" #: gajim/dialogs.py:2303 #, python-format msgid "Subscription request from %s" msgstr "Žádost o autorizaci od %s" #: gajim/dialogs.py:2375 gajim/data/gui/join_groupchat_window.ui:312 #, fuzzy msgid "Join Groupchat" msgstr "Připojit se do diskuze" #: gajim/dialogs.py:2531 #, fuzzy msgid "Invalid Room" msgstr "Neplatná místnost" #: gajim/dialogs.py:2532 msgid "Please choose a room" msgstr "" #: gajim/dialogs.py:2544 gajim/dialogs.py:2551 msgid "Invalid Nickname" msgstr "Neplatné uživatelské jméno" #: gajim/dialogs.py:2545 #, fuzzy msgid "Please choose a nickname" msgstr "Vytvořte vaše nové téma." #: gajim/dialogs.py:2557 gajim/dialogs.py:3516 gajim/config.py:2453 #: gajim/dialog_messages.py:37 gajim/dialog_messages.py:42 msgid "Invalid JID" msgstr "Neplatné JID" #: gajim/dialogs.py:2563 gajim/gui_interface.py:1850 msgid "You can not join a group chat unless you are connected." msgstr "Nemůžete vstoupit do diskuze pokud nejste připojen(a)." #: gajim/dialogs.py:2617 gajim/dialogs.py:2628 #, fuzzy msgid "Wrong server" msgstr "Nesprávné uri" #: gajim/dialogs.py:2618 gajim/dialogs.py:2629 #, fuzzy, python-format msgid "%s is not a groupchat server" msgstr "Tohle není diskuze" #: gajim/dialogs.py:2651 msgid "Without a connection, you can not synchronise your contacts." msgstr "Nemůžete měnit heslo, pokud nejste připojen(a)." #: gajim/dialogs.py:2662 gajim/dialogs.py:2733 gajim/dialogs.py:3851 #: gajim/history_window.py:100 gajim/disco.py:865 gajim/disco.py:1693 #: gajim/disco.py:1978 msgid "Name" msgstr "Jméno" #: gajim/dialogs.py:2665 gajim/data/gui/join_groupchat_window.ui:214 msgid "Server" msgstr "Server" #: gajim/dialogs.py:2701 msgid "This account is not connected to the server" msgstr "Tento účet není připojen k serveru" #: gajim/dialogs.py:2702 msgid "You cannot synchronize with an account unless it is connected." msgstr "Nemůžete synchronyzovat účet pokud nění připojen." #: gajim/dialogs.py:2731 msgid "Synchronise" msgstr "Synchronizovat" #: gajim/dialogs.py:2794 #, fuzzy msgid "Start new Conversation" msgstr "Pokračování v rozhovoru" #: gajim/dialogs.py:3052 #, fuzzy msgid "New Groupchat" msgstr "Nová diskuze" #: gajim/dialogs.py:3054 #, fuzzy msgid "New Contact" msgstr "Přidat nový kontakt" #: gajim/dialogs.py:3106 msgid "Without a connection, you can not change your password." msgstr "Nemůžete měnit heslo, pokud nejste připojen(a)." #: gajim/dialogs.py:3126 msgid "Invalid password" msgstr "Neplatné heslo" #: gajim/dialogs.py:3126 msgid "You must enter a password." msgstr "Musíte zadat heslo." #: gajim/dialogs.py:3130 msgid "Passwords do not match" msgstr "Hesla se neshodují" #: gajim/dialogs.py:3131 msgid "The passwords typed in both fields must be identical." msgstr "Hesla zadaná v obou políčkách musí být identická." #: gajim/dialogs.py:3169 gajim/notify.py:91 #: gajim/common/connection_handlers_events.py:2821 msgid "Contact Signed In" msgstr "Kontakt se přihlásil" #: gajim/dialogs.py:3171 gajim/notify.py:91 #: gajim/common/connection_handlers_events.py:2827 msgid "Contact Signed Out" msgstr "Kontakt se odhlásil" #: gajim/dialogs.py:3173 gajim/notify.py:92 gajim/notify.py:105 #: gajim/common/connection_handlers_events.py:2641 msgid "New Message" msgstr "Nová zpráva" #: gajim/dialogs.py:3173 gajim/notify.py:92 gajim/notify.py:105 #: gajim/common/connection_handlers_events.py:2623 msgid "New Single Message" msgstr "Nová jednoduché zpráva" #: gajim/dialogs.py:3174 gajim/notify.py:92 gajim/notify.py:106 #: gajim/common/connection_handlers_events.py:2629 msgid "New Private Message" msgstr "Nová soukromá zpráva" #: gajim/dialogs.py:3174 msgid "New E-mail" msgstr "Nový E-mail" #: gajim/dialogs.py:3176 gajim/gui_interface.py:926 gajim/notify.py:93 msgid "File Transfer Request" msgstr "Žádost o přenos souboru" #: gajim/dialogs.py:3178 gajim/gui_interface.py:861 gajim/gui_interface.py:891 #: gajim/notify.py:94 msgid "File Transfer Error" msgstr "Chyba přenosu souboru" #: gajim/dialogs.py:3180 gajim/gui_interface.py:1030 #: gajim/gui_interface.py:1059 gajim/gui_interface.py:1080 gajim/notify.py:94 msgid "File Transfer Completed" msgstr "Přenos souboru dokončen" #: gajim/dialogs.py:3181 gajim/gui_interface.py:1034 #: gajim/gui_interface.py:1063 gajim/gui_interface.py:1084 gajim/notify.py:95 msgid "File Transfer Stopped" msgstr "Přenos souboru zastaven" #: gajim/dialogs.py:3183 gajim/dialogs.py:4748 gajim/chat_control.py:1647 #: gajim/gui_interface.py:663 gajim/notify.py:95 msgid "Groupchat Invitation" msgstr "Skupinová pozvánka" #: gajim/dialogs.py:3185 gajim/notify.py:93 #: gajim/common/connection_handlers_events.py:2815 msgid "Contact Changed Status" msgstr "Kontakt změnil stav" #: gajim/dialogs.py:3404 #, python-format msgid "Single Message using account %s" msgstr "Jednoduchá zpráva z účtu %s" #: gajim/dialogs.py:3406 #, python-format msgid "Single Message in account %s" msgstr "Jednoduchá zpráva z účtu %s" #: gajim/dialogs.py:3408 msgid "Single Message" msgstr "Jednoduchá zpráva" #: gajim/dialogs.py:3411 #, python-format msgid "Send %s" msgstr "Odeslat %s" #: gajim/dialogs.py:3434 #, python-format msgid "Received %s" msgstr "Přijaté %s" #: gajim/dialogs.py:3457 #, python-format msgid "Form %s" msgstr "Od %s" #: gajim/dialogs.py:3485 gajim/dialogs.py:3672 msgid "Connection not available" msgstr "Spojení není dostupné" #: gajim/dialogs.py:3486 gajim/dialogs.py:3673 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Prosím ujistěte se že jste připojen s účtem \"%s\"." #: gajim/dialogs.py:3517 gajim/dialog_messages.py:43 #, python-format msgid "It is not possible to send a message to %s, this JID is not valid." msgstr "Není možné poslat zprávu kontaktu %s, takové JID není platné." #: gajim/dialogs.py:3540 #, python-format msgid "RE: %s" msgstr "RE: %s" #: gajim/dialogs.py:3541 #, python-format msgid "%s wrote:\n" msgstr "%s napsal(a):\n" #: gajim/dialogs.py:3589 gajim/data/gui/shortcuts_window.ui:113 #, fuzzy msgid "Clear" msgstr "Uklízím" #: gajim/dialogs.py:3594 #, fuzzy msgid "Filter" msgstr "Filtr:" #: gajim/dialogs.py:3599 #, fuzzy msgid "XML Input" msgstr "Vstup XML" #: gajim/dialogs.py:3603 #, fuzzy msgid "Send" msgstr "Ode_slat" #: gajim/dialogs.py:3794 msgid "add" msgstr "přidat" #: gajim/dialogs.py:3794 msgid "modify" msgstr "upravit" #: gajim/dialogs.py:3795 msgid "remove" msgstr "odebrat" #: gajim/dialogs.py:3824 #, python-format msgid "" "%(jid)s would like you to %(action)s some contacts in your " "roster." msgstr "" "%(jid)s by chtěl(a), aby jste %(action)s některé kontakty z " "vašeho rosteru." #: gajim/dialogs.py:3840 gajim/dialogs.py:3886 gajim/accounts_window.py:44 msgid "Add" msgstr "Přidat" #: gajim/dialogs.py:3842 gajim/dialogs.py:3917 msgid "Modify" msgstr "Upravit" #: gajim/dialogs.py:3844 gajim/dialogs.py:3941 msgid "Delete" msgstr "Smazat" #: gajim/dialogs.py:3854 msgid "Groups" msgstr "Skupiny" #: gajim/dialogs.py:3962 #, python-format msgid "%s suggested me to add you in my roster." msgstr "%s mi doporučila přidat si Vás od mého rosteru." #: gajim/dialogs.py:3976 #, fuzzy, python-format msgid "Added %d contact" msgid_plural "Added %d contacts" msgstr[0] "Přidáno %s kontaktů" msgstr[1] "Přidáno %s kontaktů" msgstr[2] "Přidáno %s kontaktů" #: gajim/dialogs.py:4014 #, fuzzy, python-format msgid "Removed %d contact" msgid_plural "Removed %d contacts" msgstr[0] "Odstraněno %s kontaktů" msgstr[1] "Odstraněno %s kontaktů" msgstr[2] "Odstraněno %s kontaktů" #: gajim/dialogs.py:4040 #, python-format msgid "Archiving Preferences for %s" msgstr "" #: gajim/dialogs.py:4078 msgid "Success!" msgstr "" #: gajim/dialogs.py:4078 #, fuzzy msgid "Your Archiving Preferences have been saved!" msgstr "_Nastavení" #: gajim/dialogs.py:4094 msgid "We got no response from the Server" msgstr "" #: gajim/dialogs.py:4096 #, fuzzy msgid "We received an error: {}" msgstr "Služba vrátila chybu." #: gajim/dialogs.py:4100 #, fuzzy msgid "Error!" msgstr "Chyba" #: gajim/dialogs.py:4159 #, fuzzy msgid "Add JID" msgstr "Jabber ID" #: gajim/dialogs.py:4232 #, python-format msgid "Privacy List %s" msgstr "Soukromý seznam %s" #: gajim/dialogs.py:4236 #, python-format msgid "Privacy List for %s" msgstr "Soukromý seznam pro %s" #: gajim/dialogs.py:4238 gajim/data/gui/privacy_list_window.ui:47 msgid "Privacy List" msgstr "Nastavení Soukromí" #: gajim/dialogs.py:4309 #, python-format msgid "Order: %(order)s, action: %(action)s, type: %(type)s, value: %(value)s" msgstr "Pořadí: %(order)s, akce: %(action)s, typ: %(type)s, hodnota: %(value)s" #: gajim/dialogs.py:4314 #, python-format msgid "Order: %(order)s, action: %(action)s" msgstr "Pořadí: %(order)s, akce: %(action)s" #: gajim/dialogs.py:4368 msgid "Edit a rule" msgstr "Upravit pravidlo" #: gajim/dialogs.py:4480 msgid "Add a rule" msgstr "Přidat pravidlo" #: gajim/dialogs.py:4581 #, python-format msgid "Privacy Lists for %s" msgstr "Soukromý seznam pro %s" #: gajim/dialogs.py:4677 msgid "Invalid List Name" msgstr "Neplatné jméno seznamu" #: gajim/dialogs.py:4678 msgid "You must enter a name to create a privacy list." msgstr "Musíte zadat jméno pro vytvoření privacy listu." #: gajim/dialogs.py:4714 msgid "You are invited to a groupchat" msgstr "Jste pozván do diskuze" #: gajim/dialogs.py:4717 msgid "$Contact has invited you to join a discussion" msgstr "$Contact Vás pozval(a) do místnosti %(room_jid)s" #: gajim/dialogs.py:4719 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "$Contact Vás pozval(a) do místnosti %(room_jid)s" #: gajim/dialogs.py:4728 #, python-format msgid "Comment: %s" msgstr "Komentář: %s" #: gajim/dialogs.py:4730 msgid "Do you want to accept the invitation?" msgstr "Chcete přijmout pozvání?" #: gajim/dialogs.py:4746 msgid "Reason (if you decline):" msgstr "" #: gajim/dialogs.py:4795 msgid "Choose Client Cert #PCKS12" msgstr "" #: gajim/dialogs.py:4811 gajim/accounts_window.py:657 msgid "PKCS12 Files" msgstr "" #: gajim/dialogs.py:4837 msgid "Choose Sound" msgstr "Vyberte zvuk" #: gajim/dialogs.py:4853 msgid "Wav Sounds" msgstr "Waw soubory" #: gajim/dialogs.py:4883 msgid "Choose Image" msgstr "Vyberte obrázek" #: gajim/dialogs.py:4901 msgid "Images" msgstr "Obrázky" #: gajim/dialogs.py:4972 #, fuzzy msgid "Choose Archive" msgstr "Vyberte obrázek" #: gajim/dialogs.py:4991 #, fuzzy msgid "Zip files" msgstr "Všechny soubory" #: gajim/dialogs.py:5017 #, python-format msgid "When %s becomes:" msgstr "Kdy %s může být:" #: gajim/dialogs.py:5019 #, python-format msgid "Adding Special Notification for %s" msgstr "Přidávám zvláštní notifikaci pro %s" #: gajim/dialogs.py:5259 msgid "an audio and video" msgstr "audio a video" #: gajim/dialogs.py:5261 msgid "an audio" msgstr "audio" #: gajim/dialogs.py:5263 msgid "a video" msgstr "video" #: gajim/dialogs.py:5267 #, python-format msgid "" "%(contact)s wants to start %(type)s session with you. Do you want to answer " "the call?" msgstr "%(contact)s chce zahájit %(type) sezení. Chcete na volání odpovědět?" #: gajim/dialogs.py:5372 gajim/dialogs.py:5408 #, fuzzy, python-format msgid "Certificate for account %s" msgstr "pro účet %s" #: gajim/dialogs.py:5372 #, python-format msgid "" "Issued to:\n" "Common Name (CN): %(scn)s\n" "Organization (O): %(sorg)s\n" "Organizationl Unit (OU): %(sou)s\n" "Serial Number: %(sn)s\n" "\n" "Issued by:\n" "Common Name (CN): %(icn)s\n" "Organization (O): %(iorg)s\n" "Organizationl Unit (OU): %(iou)s\n" "\n" "Validity:\n" "Issued on: %(io)s\n" "Expires on: %(eo)s\n" "\n" "Fingerprint\n" "SHA-1 Fingerprint: %(sha1)s\n" "\n" "SHA256 Fingerprint: %(sha256)s\n" msgstr "" #: gajim/dialogs.py:5419 gajim/gui_interface.py:1405 #, fuzzy, python-format msgid "SSL Certificate Verification for %s" msgstr "Chyba SSL certifikátu" #: gajim/dialogs.py:5420 gajim/dialogs.py:5437 msgid "View cert…" msgstr "" #: gajim/dialogs.py:5453 gajim/data/gui/application_menu.ui:32 #, fuzzy msgid "File Transfer" msgstr "Přenosy souborů" #: gajim/dialogs.py:5477 msgid "Requesting HTTP Upload Slot..." msgstr "" #: gajim/dialogs.py:5481 msgid "Uploading file via HTTP File Upload..." msgstr "" #: gajim/dialogs.py:5485 #, fuzzy msgid "Encrypting file..." msgstr "E2E Šifrování vypnuto" #: gajim/groupchat_control.py:193 gajim/groupchat_control.py:1839 #, python-format msgid "%(nick)s is now known as %(new_nick)s" msgstr "%(nick)s se přejmenoval na %(new_nick)s" #: gajim/groupchat_control.py:219 gajim/groupchat_control.py:1988 #: gajim/history_window.py:550 gajim/common/connection_handlers_events.py:2811 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s je nyní %(status)s" #: gajim/groupchat_control.py:248 msgid "Sending private message failed" msgstr "Odesílání soukromé zprávy selhalo" #: gajim/groupchat_control.py:250 #, python-format msgid "You are no longer in group chat \"%(room)s\" or \"%(nick)s\" has left." msgstr "Už nejsi v místnosti \"%(room)s\" nebo \"%(nick)s\" odešel(a)." #: gajim/groupchat_control.py:640 gajim/chat_control.py:326 #: gajim/chat_control.py:330 msgid "HTTP File Upload" msgstr "" #: gajim/groupchat_control.py:642 #, fuzzy msgid "HTTP File Upload not supported by your server" msgstr "Uložení metakontaktů není podporováno serverem" #: gajim/groupchat_control.py:662 gajim/groupchat_control.py:2370 msgid "Changing Subject" msgstr "Měním Téma" #: gajim/groupchat_control.py:663 gajim/groupchat_control.py:2371 msgid "Please specify the new subject:" msgstr "Prosím zadejte nové téma:" #: gajim/groupchat_control.py:670 msgid "Changing Nickname" msgstr "Měním přezdívku" #: gajim/groupchat_control.py:671 msgid "Please specify the new nickname you want to use:" msgstr "Prosím zadejte novou přezdívku, kterou chcete používat:" #: gajim/groupchat_control.py:688 #, fuzzy msgid "Invalid group chat JID" msgstr "Neplatné Jabber ID diskuzní místnosti" #: gajim/groupchat_control.py:689 #, fuzzy msgid "The group chat JID has not allowed characters." msgstr "Jabber ID diskuze obsahuje nepřijatelné znaky." #: gajim/groupchat_control.py:699 #, python-format msgid "Destroying %s" msgstr "Likviduji: %s" #: gajim/groupchat_control.py:700 #, fuzzy msgid "" "You are going to remove this room permanently.\n" "You may specify a reason below:" msgstr "" "Místnost bude s konečnou platností zničena.\n" "Můžete specifikovat důvod zničení:" #: gajim/groupchat_control.py:702 msgid "You may also enter an alternate venue:" msgstr "Také můžete specifikovat náhradní místo:" #: gajim/groupchat_control.py:880 msgid "Insert Nickname" msgstr "Vložit přezdívku" #: gajim/groupchat_control.py:1062 gajim/chat_control.py:803 msgid "and authenticated" msgstr "a autentizovaný" #: gajim/groupchat_control.py:1066 gajim/chat_control.py:807 msgid "and NOT authenticated" msgstr "a NEautentizovaný" #: gajim/groupchat_control.py:1070 gajim/chat_control.py:811 #, fuzzy, python-format msgid "%(type)s encryption is active %(authenticated)s." msgstr "" "Šifrování %(type)s %(status)s aktivní %(authenticated)s.\n" "Váš rozhovor %(logged)s zaznamenáván." #: gajim/groupchat_control.py:1113 msgid "Conversation with " msgstr "Rozhovor s" #: gajim/groupchat_control.py:1115 msgid "Continued conversation" msgstr "Pokračování v rozhovoru" #: gajim/groupchat_control.py:1473 #, fuzzy, python-format msgid "%(nick)s has set the subject to %(subject)s" msgstr "%(jid)s nastavil předmět na %(subject)s" #: gajim/groupchat_control.py:1496 gajim/groupchat_control.py:1781 msgid "Any occupant is allowed to see your full JID" msgstr "Každý návštěvník uvidí váš úplný JID" #: gajim/groupchat_control.py:1499 #, fuzzy msgid "Room now shows unavailable members" msgstr "Místnost nyní zobrazuje nedostupné členy" #: gajim/groupchat_control.py:1501 #, fuzzy msgid "Room now does not show unavailable members" msgstr "místnost nyní nezobrazuje nedostupné členy" #: gajim/groupchat_control.py:1503 msgid "A setting not related to privacy has been changed" msgstr "" #: gajim/groupchat_control.py:1507 msgid "Room logging is now enabled" msgstr "Zaznamenávání historie je zapnuto" #: gajim/groupchat_control.py:1509 msgid "Room logging is now disabled" msgstr "Zaznamenávání historie je vypnuto" #: gajim/groupchat_control.py:1511 msgid "Room is now non-anonymous" msgstr "Místnost není anonymní" #: gajim/groupchat_control.py:1514 msgid "Room is now semi-anonymous" msgstr "Místnost je částečně anonymní" #: gajim/groupchat_control.py:1517 #, fuzzy msgid "Room is now fully anonymous" msgstr "Místnost je plně anonymní" #: gajim/groupchat_control.py:1557 gajim/chat_control.py:1268 #, python-format msgid "Pong! (%s s.)" msgstr "Pong! (%s s.)" #: gajim/groupchat_control.py:1774 gajim/groupchat_control.py:2398 #: gajim/roster_window.py:3129 gajim/gui_interface.py:621 #, fuzzy, python-format msgid "%(jid)s has been invited in this room" msgstr "%(nick)s byli vyhozeni z místnosti: %(reason)s" #: gajim/groupchat_control.py:1786 msgid "Room logging is enabled" msgstr "Zaznamenávání historie je povoleno" #: gajim/groupchat_control.py:1788 msgid "A new room has been created" msgstr "Nová místnost byla vytvořena" #: gajim/groupchat_control.py:1791 msgid "The server has assigned or modified your roomnick" msgstr "Server přidělil nebo změnil název vaší místnosti" #: gajim/groupchat_control.py:1797 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s byli vyhozeni: %(reason)s" #: gajim/groupchat_control.py:1800 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(nick)s byli vyhozeni od %(who)s: %(reason)s" # FIXME: preklad pro ban? zabanovani je hnusne #: gajim/groupchat_control.py:1809 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s byli zakázáni: %(reason)s" #: gajim/groupchat_control.py:1812 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(nick)s byl zakázán od %(who)s: %(reason)s" #: gajim/groupchat_control.py:1823 gajim/groupchat_control.py:1907 #, python-format msgid "You are now known as %s" msgstr "Jste nyní znám(a) jako %s" #: gajim/groupchat_control.py:1861 gajim/groupchat_control.py:1866 #: gajim/groupchat_control.py:1872 #, python-format msgid "%(nick)s has been removed from the room (%(reason)s)" msgstr "%(nick)s byli vyhozeni z místnosti: %(reason)s" #: gajim/groupchat_control.py:1863 msgid "affiliation changed" msgstr "Příslušnost:" #: gajim/groupchat_control.py:1868 msgid "room configuration changed to members-only" msgstr "nastavení místnosti se změnilo na vstup pouze členům" #: gajim/groupchat_control.py:1874 msgid "system shutdown" msgstr "vypnout systém" #: gajim/groupchat_control.py:1928 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s by %(actor)s" msgstr "** %(actor)s nastavil(a) vztah %(nick)s na %(affiliation)s" #: gajim/groupchat_control.py:1932 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s" msgstr "** Vztah %(nick)s byl nastaven na %(affiliation)s" #: gajim/groupchat_control.py:1947 #, python-format msgid "** Role of %(nick)s has been set to %(role)s by %(actor)s" msgstr "** %(actor)s nastavil(a) postavení %(nick)s na %(role)s" #: gajim/groupchat_control.py:1951 #, python-format msgid "** Role of %(nick)s has been set to %(role)s" msgstr "** Postavení %(nick)s bylo nastaveno na %(role)s" #: gajim/groupchat_control.py:1981 #, python-format msgid "%s has left" msgstr "%s odešel(a)" #: gajim/groupchat_control.py:1986 #, python-format msgid "%s has joined the group chat" msgstr "%s vstoupil do místnosti" #: gajim/groupchat_control.py:2329 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Jste si jistý(á), že chcete opustit místnost \"%s\"?" #: gajim/groupchat_control.py:2331 msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "Pokud zavřete toto okno, budete odpojen(a) z této místnosti." #: gajim/groupchat_control.py:2550 #, python-format msgid "Kicking %s" msgstr "Vyhazuji %s" #: gajim/groupchat_control.py:2551 gajim/groupchat_control.py:2847 msgid "You may specify a reason below:" msgstr "Můžete uvést důvod níže:" #: gajim/groupchat_control.py:2846 #, python-format msgid "Banning %s" msgstr "Zakazuji %s" #: gajim/chat_control.py:328 gajim/chat_control.py:332 #, fuzzy msgid "Jingle File Transfer" msgstr "Přenosy souborů" #: gajim/chat_control.py:334 #, fuzzy msgid "No File Transfer available" msgstr "Přenos souboru dokončen" #: gajim/chat_control.py:395 msgid "Show a list of formattings" msgstr "Zobrazit seznam formátování" #: gajim/chat_control.py:399 msgid "Formatting is not available so long as GPG is active" msgstr "" #: gajim/chat_control.py:402 #, fuzzy msgid "This contact does not support HTML" msgstr "Tento kontakt nepodporuje přenos souborů." #: gajim/chat_control.py:514 #, python-format msgid "%(type)s state : %(state)s, reason: %(reason)s" msgstr "%(type)s stav: %(state)s, důvod: %(reason)s" #: gajim/chat_control.py:655 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s z diskuze %(room_name)s" #: gajim/chat_control.py:903 msgid "Session negotiation cancelled" msgstr "Sezení bylo zrušeno" #: gajim/chat_control.py:913 msgid "This session WILL be archived on server" msgstr "" #: gajim/chat_control.py:915 #, fuzzy msgid "This session WILL NOT be archived on server" msgstr "Sezení NEBUDE logováno" #: gajim/chat_control.py:924 msgid "This session is encrypted" msgstr "Toto sezení je šifrované" #: gajim/chat_control.py:927 msgid " and WILL be logged" msgstr "a BUDE zaznamenáváno" #: gajim/chat_control.py:929 msgid " and WILL NOT be logged" msgstr "a NEBUDE zaznamenáváno" #: gajim/chat_control.py:934 msgid "" "Remote contact's identity not verified. Click the shield button for more " "details." msgstr "Kontakt nebyl ověřen. Klikněte na tlačítko štítu pro více informací." #: gajim/chat_control.py:936 msgid "E2E encryption disabled" msgstr "E2E Šifrování vypnuto" #: gajim/chat_control.py:1235 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Právě jsi obdržela novou zprávu od \"%s\"" #: gajim/chat_control.py:1237 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." msgstr "" "Pokud zavřete toto okno a historie je vypnutá, tato zpráva bude ztracena." #: gajim/chat_control.py:1380 #, python-format msgid "" "Subject: %(subject)s\n" "%(message)s" msgstr "" "Předmět: %(subject)s\n" "%(message)s" #: gajim/chat_control.py:1494 gajim/gui_interface.py:1197 #, python-format msgid "" "Unable to decrypt message from %s\n" "It may have been tampered with." msgstr "" "Nepodařilo se dešifrovat zprávu od %s\n" "Možná je falešná." #: gajim/chat_control.py:1532 #, python-format msgid "%(name)s is now %(status)s" msgstr "%(name)s je nyní %(status)s" #: gajim/chat_control.py:1591 #, fuzzy msgid "File transfer" msgstr "Přenosy souborů" #: gajim/chat_control.py:1594 #, fuzzy msgid "Size" msgstr "Velikost: %s" #: gajim/chat_control.py:1596 #, fuzzy msgid "Accept" msgstr "Přijmi" #: gajim/chat_control.py:1650 gajim/disco.py:1753 msgid "_Join" msgstr "_Vstoupit" #: gajim/chat_control.py:1669 gajim/roster_window.py:1991 #: gajim/gui_interface.py:1013 msgid "Remote contact stopped transfer" msgstr "Protějšek zastavil přenos" #: gajim/chat_control.py:1671 gajim/roster_window.py:1993 #: gajim/gui_interface.py:1016 msgid "Error opening file" msgstr "Chyba při čtení souboru" #: gajim/roster_window.py:273 gajim/roster_window.py:1074 msgid "Merged accounts" msgstr "Spojené účty" #: gajim/roster_window.py:857 gajim/roster_window.py:1757 #: gajim/roster_window.py:1759 gajim/roster_window.py:2602 #: gajim/roster_window.py:5125 gajim/message_window.py:519 #: gajim/common/contacts.py:133 gajim/common/commands.py:230 #: gajim/common/helpers.py:95 msgid "Groupchats" msgstr "Diskuze" #: gajim/roster_window.py:896 gajim/roster_window.py:1665 #: gajim/roster_window.py:1698 gajim/roster_window.py:1749 #: gajim/roster_window.py:1751 gajim/roster_window.py:1912 #: gajim/roster_window.py:2575 gajim/roster_window.py:5155 gajim/disco.py:130 #: gajim/disco.py:131 gajim/disco.py:1460 gajim/common/contacts.py:135 #: gajim/common/contacts.py:378 gajim/common/helpers.py:95 msgid "Transports" msgstr "Transporty" #: gajim/roster_window.py:2045 #, fuzzy msgid "Authorization sent" msgstr "Autorizace byla odeslána" #: gajim/roster_window.py:2046 #, fuzzy, python-format msgid "\"%s\" will now see your status." msgstr "Nyní bude \"%s\" znát váš stav." #: gajim/roster_window.py:2069 msgid "Subscription request has been sent" msgstr "Žádost o autorizaci byla odeslána" #: gajim/roster_window.py:2070 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Pokud \"%s\" povolí Vaši žádost o autorizaci, budete vidět jeho stav." #: gajim/roster_window.py:2084 #, fuzzy msgid "Authorization removed" msgstr "Autorizace byla zrušena" #: gajim/roster_window.py:2085 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Nyní Vás \"%s\" uvidí vždy jako odpojeného." #: gajim/roster_window.py:2109 #, fuzzy msgid "OpenPGP is not usable" msgstr "GPG je nepoužitelné" #: gajim/roster_window.py:2110 #, python-format msgid "" "Gajim needs python-gnupg >= 0.3.8\n" "Beware there is an incompatible python package called gnupg.\n" "You will be connected to %s without OpenPGP." msgstr "" #: gajim/roster_window.py:2318 gajim/roster_window.py:3625 msgid "You are participating in one or more group chats" msgstr "Účinkujete v jedné nebo více diskuzích" #: gajim/roster_window.py:2319 gajim/roster_window.py:3626 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" msgstr "" "Změna vašeho stavu na neviditelný způsobí odpojení od těchto diskuzí. Jste " "si jistý(á), že se chcete stát neviditelným(ou)?" # FIXME: mozna nejak lepe? :/ #: gajim/roster_window.py:2346 msgid "desync'ed" msgstr "nesynchronizováno" #: gajim/roster_window.py:2416 msgid "Really quit Gajim?" msgstr "Opravdu ukončit Gajim?" #: gajim/roster_window.py:2417 msgid "Are you sure you want to quit Gajim?" msgstr "Opravdu chcete ukončit Gajim?" #: gajim/roster_window.py:2418 msgid "Always close Gajim" msgstr "Vždy zavřít Gajim" #: gajim/roster_window.py:2505 #, fuzzy msgid "You have running file transfers" msgstr "Zrušit přenos souboru" #: gajim/roster_window.py:2506 #, fuzzy msgid "" "If you quit now, the file(s) being transferred will be stopped. Do you still " "want to quit?" msgstr "" "Pokud chcete teď odejít, veškeré právě probíhající přenosy budou zastaveny. " "Opravdu chcete odejít?" #: gajim/roster_window.py:2537 gajim/roster_window.py:2828 msgid "You have unread messages" msgstr "Máte nepřečtené zprávy" #: gajim/roster_window.py:2538 msgid "" "Messages will only be available for reading them later if you have history " "enabled and contact is in your roster." msgstr "" "Zprávy bude možné číst později, pokud máte povolený záznam historie a " "kontakt je v rosteru." #: gajim/roster_window.py:2829 msgid "You must read them before removing this transport." msgstr "Musíš si je přečíst před smazáním transportu." #: gajim/roster_window.py:2832 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Transport \"%s\" bude smazán" #: gajim/roster_window.py:2833 msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." msgstr "" "Už více nebudete moci posílat i přijímat zprávy od kontaktů z tohoto " "transportu." #: gajim/roster_window.py:2836 msgid "Transports will be removed" msgstr "Transport bude smazán" #: gajim/roster_window.py:2841 #, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " "these transports: %s" msgstr "" "Už více nebudete moci posílat ani přijímat zprávy od kontaktů z těchto " "transportů:%s" #: gajim/roster_window.py:2892 msgid "You are about to block a contact. Are you sure you want to continue?" msgstr "Chystáte se zablokovat kontakt. Určitě chcete pokračovat?" #: gajim/roster_window.py:2894 #, fuzzy msgid "" "This contact will see you offline and you will not receive messages it sends " "you." msgstr "" "Tento kontakt vás uvidí jako odpojeného a nebudete dostávat zprávy, které " "vám pošle." #: gajim/roster_window.py:2934 msgid "Rename Contact" msgstr "Přejmenovat kontakt" #: gajim/roster_window.py:2935 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Zadej novou přezdívku pro kontakt %s." #: gajim/roster_window.py:2942 msgid "Rename Group" msgstr "Přejmenovat skupinu" #: gajim/roster_window.py:2943 #, python-format msgid "Enter a new name for group %s" msgstr "Zadej nové jméno pro skupinu %s." #: gajim/roster_window.py:2988 msgid "Remove Group" msgstr "Odstranit skupinu" #: gajim/roster_window.py:2989 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Chceš smazat skupinu %s z rosteru?" #: gajim/roster_window.py:2990 msgid "Also remove all contacts in this group from your roster" msgstr "Odstranit také všechny kontakty v této skupině z Vašeho rosteru" #: gajim/roster_window.py:3029 msgid "Assign OpenPGP Key" msgstr "Přiřadit OpenPGP klíč" #: gajim/roster_window.py:3030 msgid "Select a key to apply to the contact" msgstr "Vybrat klíč k použítí s kontaktem" #: gajim/roster_window.py:3436 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Kontakt \"%s\" bude smazán z Vašeho rosteru" #: gajim/roster_window.py:3438 #, python-format msgid "You are about to remove \"%(name)s\" (%(jid)s) from your roster.\n" msgstr "Chystáte se smazat \"%(name)s\" (%(jid)s) z vašeho rosteru.\n" #: gajim/roster_window.py:3443 #, fuzzy msgid "" "By removing this contact you also remove authorization resulting in them " "always seeing you as offline." msgstr "" "Smazáním těchto kontaktů:%s\n" "také zrušíte autorizaci. Kontakty Vás tak vždy uvidí jako odpojeného." #: gajim/roster_window.py:3449 msgid "Do you want to continue?" msgstr "Chcete pokračovat?" #: gajim/roster_window.py:3453 #, fuzzy msgid "" "By removing this contact you also by default remove authorization resulting " "in them always seeing you as offline." msgstr "" "Smazáním kontaktu také zrušíte autorizaci. Kontakt Vás tak vždy uvidí jako " "odpojeného." #: gajim/roster_window.py:3456 msgid "I want this contact to know my status after removal" msgstr "Chci aby tento kontakt věděl o mém stavu i po odstranění" #: gajim/roster_window.py:3460 msgid "Contacts will be removed from your roster" msgstr "Kontakty budou smazány z Vašeho rosteru" #: gajim/roster_window.py:3465 #, python-format msgid "" "By removing these contacts:%s\n" "you also remove authorization resulting in them always seeing you as offline." msgstr "" "Smazáním těchto kontaktů:%s\n" "také zrušíte autorizaci. Kontakty Vás tak vždy uvidí jako odpojeného." #: gajim/roster_window.py:3523 #, fuzzy msgid "" "You are about to send a custom status. Are you sure you want to continue?" msgstr "Chystáte se poslat vlastní stav. Určitě chcete pokračovat?" #: gajim/roster_window.py:3525 #, fuzzy, python-format msgid "" "This contact will temporarily see you as %(status)s, but only until you " "change your status. Then they will see your global status." msgstr "" "Tento kontakt váš dočasně uvidí jako %(status)s, ale pouze do první změny " "vašeho stavu. Poté uvidí váš globální stav." #: gajim/roster_window.py:3544 msgid "No account available" msgstr "Žádný účet není dostupný" #: gajim/roster_window.py:3545 msgid "You must create an account before you can chat with other contacts." msgstr "" "Musíte vytvořit účet před tím, než budete moci hovořit s jinými uživateli." #: gajim/roster_window.py:3676 gajim/gui_interface.py:2065 #: gajim/dialog_messages.py:64 msgid "You cannot join a group chat while you are invisible" msgstr "Nemůžete vstoupit do diskuze, pokud jste neviditelný(á)" #: gajim/roster_window.py:4178 msgid "Metacontacts storage not supported by your server" msgstr "Uložení metakontaktů není podporováno serverem" #: gajim/roster_window.py:4180 #, fuzzy msgid "" "Your server does not support storing metacontacts information. So this " "information will not be saved on next reconnection." msgstr "" "Tvůj server nepodporuje ukládání metakontaktů. Tyto informace nebudou při " "přístím připojení uloženy." #: gajim/roster_window.py:4276 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "Chystáte se vytvořit metacontact. Určitě chcete pokračovat?" #: gajim/roster_window.py:4278 #, fuzzy msgid "" "Metacontacts are a way to regroup several contacts in one line. Generally it " "is used when the same person has several XMPP accounts or transport accounts." msgstr "" "Metakontakty jsou způsob k organizaci několika kontaktů do jednoho. Obecně " "jsou užitečné, když jeden člověk má víc účtů v síti Jabber nebo účty v " "transportech." #: gajim/roster_window.py:4400 msgid "Invalid file URI:" msgstr "Neplatná cesta k souboru:" #: gajim/roster_window.py:4412 #, python-format msgid "Do you want to send this file to %s:" msgid_plural "Do you want to send these files to %s:" msgstr[0] "Chcete poslat %s tento soubor:" msgstr[1] "Chcete poslat %s tyto soubory:" msgstr[2] "Chcete poslat %s tyto soubory:" #: gajim/roster_window.py:4552 #, fuzzy, python-format msgid "Send %(from)s to %(to)s" msgstr "Odeslat %s %s" #: gajim/roster_window.py:4565 #, fuzzy, python-format msgid "Make %s first contact" msgstr "Udělej %s a %s metakontaktem" #: gajim/roster_window.py:4570 #, fuzzy, python-format msgid "Make %(contact1)s and %(contact2)s metacontacts" msgstr "Udělej %s a %s metakontaktem" #: gajim/roster_window.py:4951 gajim/roster_window.py:5049 msgid "_Change Status Message" msgstr "Z_měnit popis stavu" #: gajim/roster_window.py:4971 msgid "Publish Tune" msgstr "_Zveřejnit hudbu" #: gajim/roster_window.py:4982 #, fuzzy msgid "Publish Location" msgstr "_Zveřejnit hudbu" #: gajim/roster_window.py:4994 #, fuzzy msgid "Configure Services…" msgstr "_Nastavit služby..." #: gajim/roster_window.py:5127 msgid "_Maximize All" msgstr "_Maximalizovat Vše" #: gajim/roster_window.py:5134 gajim/roster_window.py:5296 msgid "Send Group M_essage" msgstr "Ode_slat skupinovou zprávu" #: gajim/roster_window.py:5141 msgid "To all users" msgstr "Všem uživatelům" #: gajim/roster_window.py:5145 msgid "To all online users" msgstr "Všem dostupným uživatelům" #: gajim/roster_window.py:5157 gajim/roster_window.py:5302 #: gajim/data/gui/gc_occupants_menu.ui:110 #: gajim/data/gui/contact_context_menu.ui:36 msgid "In_vite to" msgstr "_Pozvat do" #: gajim/roster_window.py:5312 msgid "_Manage Contacts" msgstr "_Spravovat kontakty" #: gajim/roster_window.py:5318 #, fuzzy msgid "Edit _Groups…" msgstr "Upravit _skupiny" #: gajim/roster_window.py:5339 gajim/data/gui/filetransfers.ui:11 #: gajim/data/gui/remove_account_window.ui:137 msgid "_Remove" msgstr "Odst_ranit" #: gajim/roster_window.py:5377 msgid "_Maximize" msgstr "_Maximalizovat" #: gajim/roster_window.py:5384 msgid "_Reconnect" msgstr "_Znovu připojit" #: gajim/roster_window.py:5389 gajim/data/gui/gc_control_popup_menu.ui:120 msgid "_Disconnect" msgstr "_Odpojit" #: gajim/roster_window.py:5405 gajim/data/gui/gc_occupants_menu.ui:170 #: gajim/data/gui/gc_control_popup_menu.ui:113 #: gajim/data/gui/contact_context_menu.ui:228 msgid "_History" msgstr "_Historie" #: gajim/roster_window.py:5481 gajim/data/gui/application_menu.ui:86 msgid "History Manager" msgstr "Správce historie" #: gajim/roster_window.py:5489 msgid "_Join New Group Chat" msgstr "_Připojit se do diskuze" #: gajim/gajim.py:74 #, fuzzy msgid "Show the application's version" msgstr "Notification-daemon" #: gajim/gajim.py:77 #, fuzzy msgid "Show only critical errors" msgstr "_Zobrazit událost v rosteru" #: gajim/gajim.py:80 msgid "Separate profile files completely (even history db and plugins)" msgstr "" #: gajim/gajim.py:84 msgid "Print XML stanzas and other debug information" msgstr "" #: gajim/gajim.py:88 #, fuzzy msgid "Use defined profile in configuration directory" msgstr "Editor rozšířeného nastavení" #: gajim/gajim.py:92 #, fuzzy msgid "Set configuration directory" msgstr "Nastavení místnosti" #: gajim/gajim.py:95 msgid "Configure logging system" msgstr "" #: gajim/gajim.py:98 #, fuzzy msgid "Show all warnings" msgstr "Zobrazit všechny čekající _události" #: gajim/gajim.py:101 msgid "Open IPython shell" msgstr "" #: gajim/gajim.py:104 msgid "Pops up a window with the next pending event" msgstr "Zobrazí okno s další nepřečtenou událostí" #: gajim/gajim.py:107 gajim/data/gui/shortcuts_window.ui:202 #, fuzzy msgid "Start a new chat" msgstr "Začít rozhovor" #: gajim/gajim.py:180 gajim/gui_interface.py:128 msgid "Database Error" msgstr "Chyba Databáze" #: gajim/history_sync.py:217 #, fuzzy msgid "How far back do you want to go?" msgstr "Co by jste rád(a) dělal(a)?" #: gajim/history_sync.py:222 msgid "One Month" msgstr "" #: gajim/history_sync.py:223 msgid "Three Months" msgstr "" #: gajim/history_sync.py:224 msgid "One Year" msgstr "" #: gajim/history_sync.py:225 msgid "Everything" msgstr "" #: gajim/history_sync.py:254 #, fuzzy msgid "Connecting..." msgstr "Připojuji se" #: gajim/history_sync.py:266 #, fuzzy, python-format msgid "%(received)s of %(max)s" msgstr "Přenos souboru %(filename)s od %(name)s byl zastaven." #: gajim/history_sync.py:270 #, fuzzy, python-format msgid "Downloaded %s Messages" msgstr "Přeposlat nepřečtené zprávy" #: gajim/history_sync.py:290 #, python-brace-format msgid "" "\n" " Finshed synchronising your History.\n" " {received} Messages downloaded.\n" " " msgstr "" #: gajim/history_sync.py:297 msgid "" "\n" " Gajim is fully synchronised\n" " with the Archive.\n" " " msgstr "" #: gajim/history_sync.py:304 msgid "" "\n" " There is already a synchronisation in\n" " progress. Please try later.\n" " " msgstr "" #: gajim/config.py:150 gajim/config.py:156 gajim/config.py:616 #: gajim/data/gui/preferences_window.ui:68 #: gajim/data/gui/preferences_window.ui:85 msgid "Disabled" msgstr "Vypnuto" #: gajim/config.py:411 gajim/config.py:415 gajim/config.py:1942 msgid "Default" msgstr "Výchozí" #: gajim/config.py:1128 msgid "status message title" msgstr "titulek stavu" #: gajim/config.py:1129 msgid "status message text" msgstr "text stavu" #: gajim/config.py:1517 #, python-format msgid "Edit %s" msgstr "Uprav %s" #: gajim/config.py:1519 #, python-format msgid "Register to %s" msgstr "Registrovat k %s" #: gajim/config.py:1555 msgid "Ban List" msgstr "Ban List" #: gajim/config.py:1556 msgid "Member List" msgstr "Seznam členů" #: gajim/config.py:1556 msgid "Owner List" msgstr "Seznam vlastníků" #: gajim/config.py:1557 msgid "Administrator List" msgstr "Seznam správců" #: gajim/config.py:1631 msgid "Reason" msgstr "Důvod" #: gajim/config.py:1638 msgid "Nick" msgstr "Přezdívka" #: gajim/config.py:1644 msgid "Role" msgstr "Postavení" #: gajim/config.py:1670 #, fuzzy msgid "Banning…" msgstr "Zakazuji..." #: gajim/config.py:1672 msgid "" "Whom do you want to ban?\n" "\n" msgstr "" "Koho chcete zakázat?\n" "\n" #: gajim/config.py:1674 #, fuzzy msgid "Adding Member…" msgstr "Přidávám člena..." #: gajim/config.py:1675 msgid "" "Whom do you want to make a member?\n" "\n" msgstr "Kdo se má stát členem?\n" #: gajim/config.py:1677 #, fuzzy msgid "Adding Owner…" msgstr "Přidávám vlastníka..." #: gajim/config.py:1678 msgid "" "Whom do you want to make an owner?\n" "\n" msgstr "Kdo se má stát vlastníkem?\n" #: gajim/config.py:1680 #, fuzzy msgid "Adding Administrator…" msgstr "Přidávám správce..." #: gajim/config.py:1681 msgid "" "Whom do you want to make an administrator?\n" "\n" msgstr "Kdo se má stát správcem?\n" #: gajim/config.py:1682 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" "2. user@domain (any resource matches).\n" "3. domain/resource (only that resource matches).\n" "4. domain (the domain itself matches, as does any user@domain,\n" "domain/resource, or address containing a subdomain)." msgstr "" "Může být jedno z následujících:\n" "1. uživatel@doména/zdroj (pouze zdroji, který je uveden).\n" "2. uživatel@doména (kterýkoliv zdroj odpovídá).\n" "3. doména/zdroj (pouze zdroji, který je uveden).\n" "4. doména (doména samotná odpovídá, stejně jako kterýkoliv uživatel@doména,\n" "doména/zdroj, nebo adresa obsahující poddoménu)." #: gajim/config.py:1783 #, python-format msgid "Removing %s account" msgstr "Odstraňuju účet %s" #: gajim/config.py:1798 #, fuzzy msgid "Account is disabled" msgstr "Smajlíci byly vypnuty" #: gajim/config.py:1799 msgid "To unregister from a server, account must be enabled." msgstr "" #: gajim/config.py:1813 gajim/gui_interface.py:314 gajim/gui_interface.py:748 msgid "Password Required" msgstr "Vyžadováno heslo" #: gajim/config.py:1814 gajim/gui_interface.py:733 #, python-format msgid "Enter your password for account %s" msgstr "Zadejte heslo pro účet %s" #: gajim/config.py:1815 gajim/gui_interface.py:748 msgid "Save password" msgstr "Uložit heslo" #: gajim/config.py:1826 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Účet \"%s\" se připojil k serveru" #: gajim/config.py:1827 msgid "If you remove it, the connection will be lost." msgstr "Pokud jej smažete, připojení bude ztraceno." #: gajim/config.py:1842 #, fuzzy, python-format msgid "Connection to server %s failed" msgstr "Spojení s proxy selhalo" #: gajim/config.py:1843 #, fuzzy msgid "What would you like to do?" msgstr "Co by jste rád(a) dělal(a)?" #: gajim/config.py:1844 #, fuzzy msgid "Remove only from Gajim" msgstr "Odstranit účet _pouze z Gajimu" #: gajim/config.py:1845 msgid "Don't remove anything. I'll try again later" msgstr "" #: gajim/config.py:1942 msgid "?print_status:All" msgstr "?print_status:Všechny" #: gajim/config.py:1943 msgid "Enter and leave only" msgstr "Pouze při vstupu a výstupu" #: gajim/config.py:1944 msgid "?print_status:None" msgstr "?print_status:Žádný" #: gajim/config.py:2010 msgid "New Group Chat" msgstr "Nová diskuze" #: gajim/config.py:2046 msgid "This bookmark has invalid data" msgstr "Tato záložka má neplatná data" #: gajim/config.py:2047 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "" "Prosím nezapomeňte vyplnit políčka server a místnost, nebo smažte tuto " "záložku." #: gajim/config.py:2170 gajim/config.py:2186 gajim/config.py:2197 #: gajim/config.py:2225 msgid "Character not allowed" msgstr "Znak nebyl povolen" #: gajim/config.py:2185 gajim/config.py:2196 gajim/config.py:2475 msgid "Invalid server" msgstr "Neplatný server" #: gajim/config.py:2224 msgid "Invalid room" msgstr "Neplatná místnost" #: gajim/config.py:2389 msgid "Account has been added successfully" msgstr "Účet byl úspěšně přidán" #: gajim/config.py:2390 gajim/config.py:2396 #, fuzzy msgid "" "You can set advanced account options by pressing the Advanced button, or " "later by choosing the Accounts menu item under the Edit menu from the main " "window." msgstr "" "Můžete nastavit rozšířené volby účtu po stisknutí tlačítka Rozšířené, nebo " "později stisknutím v položce menu Účty v nabídce Úpravy hlavního okna." #: gajim/config.py:2395 msgid "Your new account has been created successfully" msgstr "Váš účet byl úspěšně vytvořen" #: gajim/config.py:2433 msgid "Invalid username" msgstr "Neplatné uživatelské jméno" #: gajim/config.py:2435 msgid "You must provide a username to configure this account." msgstr "Musíte zadat uživatelské jméno před nastavením tohoto účtu." #: gajim/config.py:2476 msgid "Please provide a server on which you want to register." msgstr "Prosím zadejte server u kterého se chcete zaregistrovat." #: gajim/config.py:2499 msgid "Invalid entry" msgstr "Neplatný záznam" #: gajim/config.py:2500 msgid "Custom port must be a port number." msgstr "Vlastní port musí být číslo portu." #: gajim/config.py:2532 gajim/gui_interface.py:1360 msgid "Certificate Already in File" msgstr "Certifikát je již v souboru" #: gajim/config.py:2533 gajim/gui_interface.py:1361 #, python-format msgid "This certificate is already in file %s, so it's not added again." msgstr "Tento certifikát je již v souboru %s, takže nebude znova přidán." #: gajim/config.py:2626 #, python-format msgid "" "Security Warning\n" "\n" "The authenticity of the %(hostname)s SSL certificate could be invalid.\n" "SSL Error: %(error)s\n" "Do you still want to connect to this server?" msgstr "" "Bezpečnostní Varování\n" "\n" "SSL certifikát pro %(hostname)s nemusí být pravý.\n" "SSL Chyba: %(error)s\n" "Přesto se chcete k serveru připojit?" #: gajim/config.py:2632 #, fuzzy, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA-1 fingerprint of the certificate:\n" "%(sha1)s\n" "SHA-256 fingerprint of the certificate:\n" "%(sha256)s" msgstr "" "Přidat tento certifikát do důvěryhodných.\n" "SHA1 otisk certifikátu:\n" "%s" #: gajim/config.py:2666 gajim/config.py:2700 msgid "An error occurred during account creation" msgstr "Nastala chyba při vytváření účtu" #: gajim/config.py:2763 msgid "Account name is in use" msgstr "Jméno účtu se používá" #: gajim/config.py:2764 msgid "You already have an account using this name." msgstr "Již máte účet s tímto jménem." #: gajim/config.py:2896 msgid "PEP node was not removed" msgstr "PEP uzel nebyl smazán" #: gajim/config.py:2897 #, python-format msgid "PEP node %(node)s was not removed: %(message)s" msgstr "PEP uzel %(node)s se nepodařilo odstranit: %(message)s" #: gajim/config.py:2925 #, fuzzy, python-format msgid "Configure %s" msgstr "_Nastavit" #: gajim/config.py:2942 gajim/plugins/gui.py:95 msgid "Active" msgstr "Aktivní" #: gajim/config.py:2950 msgid "Event" msgstr "Událost" #: gajim/config.py:2984 #, fuzzy msgid "Attention Message Received" msgstr "První zpráva přijata" #: gajim/config.py:2985 msgid "First Message Received" msgstr "První zpráva přijata" #: gajim/config.py:2986 msgid "Next Message Received Focused" msgstr "Další zpráva přijata zvýrazněná" #: gajim/config.py:2988 msgid "Next Message Received Unfocused" msgstr "Další zpráva přijata nezvýrazněná" #: gajim/config.py:2989 msgid "Contact Connected" msgstr "Kontakt se připojil" #: gajim/config.py:2990 msgid "Contact Disconnected" msgstr "Kontakt se odpojil" #: gajim/config.py:2991 msgid "Message Sent" msgstr "Zpráva odeslána" #: gajim/config.py:2992 msgid "Group Chat Message Highlight" msgstr "Zvýraznění zprávy v diskuzi" #: gajim/config.py:2993 msgid "Group Chat Message Received" msgstr "Přijetí zprávy v diskuzi" #: gajim/tooltips.py:240 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s této diskuze" #: gajim/tooltips.py:269 gajim/common/helpers.py:473 msgid "?Group Chat Contact Affiliation:None" msgstr "?Group Chat Contact Affiliation:Žádná" #: gajim/tooltips.py:271 gajim/common/helpers.py:479 msgid "Member" msgstr "Člen" #: gajim/tooltips.py:273 gajim/common/helpers.py:477 msgid "Administrator" msgstr "Správce" #: gajim/tooltips.py:275 gajim/common/helpers.py:475 msgid "Owner" msgstr "Vlastník" #: gajim/tooltips.py:433 msgid " [blocked]" msgstr "[blokováno]" #: gajim/tooltips.py:437 msgid " [minimized]" msgstr "[minimalizováno]" #: gajim/tooltips.py:609 msgid "Connected" msgstr "Spojeno" #: gajim/tooltips.py:611 msgid "Disconnected" msgstr "Odpojenol" #: gajim/tooltips.py:660 #, fuzzy msgid "?Noun:Download" msgstr "Stáhnout" #: gajim/tooltips.py:666 #, fuzzy msgid "?Noun:Upload" msgstr "Nahrát" #: gajim/tooltips.py:673 msgid "Type: " msgstr "Typ: " #: gajim/tooltips.py:679 msgid "Transferred: " msgstr "Přeneseno: " #: gajim/tooltips.py:682 gajim/tooltips.py:699 msgid "Not started" msgstr "Nespuštěno" #: gajim/tooltips.py:684 msgid "Stopped" msgstr "Zastaveno" #: gajim/tooltips.py:686 gajim/tooltips.py:689 msgid "Completed" msgstr "Dokončeno" #: gajim/tooltips.py:692 msgid "?transfer status:Paused" msgstr "?transfer status:Pozastaveno" #: gajim/tooltips.py:695 msgid "Stalled" msgstr "Stagnuje" #: gajim/tooltips.py:697 msgid "Transferring" msgstr "Přenáším" #: gajim/tooltips.py:700 msgid "Status: " msgstr "Stav: " #: gajim/tooltips.py:732 gajim/common/helpers.py:389 #, fuzzy msgid "?user status:Available" msgstr "?transfer status:Pozastaveno" #: gajim/tooltips.py:734 gajim/common/helpers.py:384 msgid "Free for Chat" msgstr "Ukecaný" #: gajim/tooltips.py:736 gajim/common/commands.py:117 #: gajim/common/helpers.py:396 #: gajim/command_system/implementation/standard.py:138 msgid "Away" msgstr "Pryč" #: gajim/tooltips.py:738 gajim/common/helpers.py:374 msgid "Busy" msgstr "Nerušit" #: gajim/tooltips.py:740 gajim/common/helpers.py:379 msgid "Not Available" msgstr "Nedostupný" #: gajim/tooltips.py:742 gajim/common/helpers.py:401 msgid "Offline" msgstr "Odpojen" #: gajim/advanced_configuration_window.py:88 msgid "Activated" msgstr "Aktivní" #: gajim/advanced_configuration_window.py:88 msgid "Deactivated" msgstr "Neaktivní" #: gajim/advanced_configuration_window.py:90 msgid "Boolean" msgstr "Boolean" #: gajim/advanced_configuration_window.py:91 msgid "Integer" msgstr "Číslo" #: gajim/advanced_configuration_window.py:92 msgid "Text" msgstr "Text" #: gajim/advanced_configuration_window.py:93 #: gajim/data/gui/groupchat_control.ui:54 gajim/data/gui/chat_control.ui:334 msgid "Color" msgstr "Barva" #: gajim/advanced_configuration_window.py:104 msgid "Preference Name" msgstr "Název volby" #: gajim/advanced_configuration_window.py:111 msgid "Value" msgstr "Hodnota" #: gajim/advanced_configuration_window.py:120 msgid "Type" msgstr "Typ" #: gajim/advanced_configuration_window.py:176 msgid "(None)" msgstr "(Žádný)" #: gajim/advanced_configuration_window.py:307 msgid "Hidden" msgstr "Skryté" #: gajim/logind_listener.py:58 msgid "Machine going to sleep" msgstr "" #: gajim/logind_listener.py:90 msgid "Disconnect from the network" msgstr "" #: gajim/history_window.py:339 #, python-format msgid "Conversation History with %s" msgstr "Historie rozhovorů s %s" #: gajim/history_window.py:361 gajim/data/gui/history_window.ui:7 msgid "Conversation History" msgstr "Historie konverzace" #: gajim/history_window.py:390 gajim/history_window.py:443 msgid "Disk Error" msgstr "Chyba disku" #: gajim/history_window.py:546 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s je nyní %(status)s: %(status_msg)s" #: gajim/history_window.py:557 #, python-format msgid "Error: %s" msgstr "Chyba: %s" #: gajim/history_window.py:559 msgid "Error" msgstr "Chyba" #: gajim/history_window.py:561 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Stav je nyní %(status)s: %(status_msg)s" #: gajim/history_window.py:564 #, python-format msgid "Status is now: %(status)s" msgstr "Stav je nyní %(status)s" #: gajim/history_window.py:585 gajim/conversation_textview.py:1338 #, python-format msgid "Subject: %s\n" msgstr "Předmět: %s\n" #: gajim/statusicon.py:215 #, fuzzy msgid "_Change Status Message…" msgstr "Z_měnit popis stavu" #: gajim/statusicon.py:252 gajim/statusicon.py:302 gajim/statusicon.py:309 #, python-format msgid "using account %s" msgstr "pomocí účtu %s" #: gajim/statusicon.py:319 #, fuzzy msgid "_Manage Bookmarks…" msgstr "Spravovat záložky" #: gajim/statusicon.py:332 #, fuzzy msgid "Hide _Roster" msgstr "v _rosteru" #: gajim/statusicon.py:336 msgid "Show _Roster" msgstr "Zobrazit _Seznam" #: gajim/statusicon.py:344 msgid "Hide this menu" msgstr "Skryje toto menu" #: gajim/dataforms_widget.py:587 #, fuzzy msgid "Unable to load image" msgstr "Nelze nahrát idle modul" #: gajim/dataforms_widget.py:589 #, fuzzy, python-format msgid "Media type not supported: %s" msgstr "Neviditelnost není podporována" #: gajim/dataforms_widget.py:604 msgid "This field is required" msgstr "Toto pole je povinné" #: gajim/dataforms_widget.py:658 msgid "new@jabber.id" msgstr "new@jabber.id" #: gajim/dataforms_widget.py:661 gajim/dataforms_widget.py:663 #, python-format msgid "new%d@jabber.id" msgstr "new%d@jabber.id" #: gajim/server_info.py:130 #, python-format msgid "%(days)s days, %(hours)s hours" msgstr "" #: gajim/server_info.py:187 gajim/accounts_window.py:537 #: gajim/accounts_window.py:638 #, fuzzy msgid "Hostname" msgstr "Počítač: " #: gajim/server_info.py:188 #, fuzzy msgid "Server Software" msgstr "Vlastnosti serveru" #: gajim/server_info.py:189 #, fuzzy msgid "Server Uptime" msgstr "Server odpověděl: %s" #: gajim/server_info.py:227 msgid "" "\n" "Disabled in config" msgstr "" #: gajim/disco.py:69 msgid "This service has not yet responded with detailed information" msgstr "Tato služba dosud neodpověděla s detaily" #: gajim/disco.py:70 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" msgstr "" "Tato služba nemůže odpovědět s více podrobnostmi.\n" "Pravděpodobně je stará nebo rozbitá" #: gajim/disco.py:129 msgid "Others" msgstr "Ostatní" #: gajim/disco.py:133 msgid "Conference" msgstr "Diskuze" #: gajim/disco.py:537 msgid "Without a connection, you can not browse available services" msgstr "Bez spojení nemůžete prohlížet dostupné služby" #: gajim/disco.py:626 #, python-format msgid "Service Discovery using account %s" msgstr "Procházení služeb s použitím účtu %s" #: gajim/disco.py:628 msgid "Service Discovery" msgstr "Service Discovery" #: gajim/disco.py:732 msgid "The service could not be found" msgstr "Tato služba nebyla nalezena" #: gajim/disco.py:733 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." msgstr "" "Služba na zadané adrese neexistuje, nebo neodpovídá. Zkontrolujte adresu a " "opakujte znovu." #: gajim/disco.py:739 gajim/disco.py:1091 msgid "The service is not browsable" msgstr "Službu nelze prohlížet" #: gajim/disco.py:740 msgid "This type of service does not contain any items to browse." msgstr "Tento typ služby neobsahuje žádné položky, které je možné prohlížet." #: gajim/disco.py:781 gajim/disco.py:791 msgid "Invalid Server Name" msgstr "Neplatné jméno serveru" #: gajim/disco.py:849 #, python-format msgid "Browsing %(address)s using account %(account)s" msgstr "Procházím %(address)s pomocí účtu %(account)s" #: gajim/disco.py:896 #, fuzzy msgid "Browse" msgstr "_Prohlížet" #: gajim/disco.py:1092 msgid "This service does not contain any items to browse." msgstr "Tato služba neobsahuje žádné položky, které je možno prohlížet." #: gajim/disco.py:1304 #, fuzzy msgid "Execute Command" msgstr "Spustit _příkaz..." #: gajim/disco.py:1308 gajim/disco.py:1466 msgid "Re_gister" msgstr "Re_gistrace" #: gajim/disco.py:1317 gajim/data/gui/join_groupchat_window.ui:186 #: gajim/data/gui/join_groupchat_window.ui:325 #, fuzzy msgid "Join" msgstr "_Vstoupit" #: gajim/disco.py:1326 gajim/data/gui/search_window.ui:23 msgid "Search" msgstr "Najít" #: gajim/disco.py:1464 msgid "_Edit" msgstr "_Úpravy" #: gajim/disco.py:1507 #, python-format msgid "Scanning %(current)d / %(total)d.." msgstr "Skenuji %(current)d / %(total)d.." #: gajim/disco.py:1703 msgid "Users" msgstr "Uživatelé" #: gajim/disco.py:1711 msgid "Description" msgstr "Popis" #: gajim/disco.py:1719 msgid "Id" msgstr "č." #: gajim/disco.py:1749 gajim/data/gui/gc_control_popup_menu.ui:99 msgid "_Bookmark" msgstr "_Záložky" #: gajim/disco.py:1783 msgid "Bookmark already set" msgstr "Záložka je už nastavena" #: gajim/disco.py:1784 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Diskuze \"%s\" už je ve Vašich záložkách." #: gajim/disco.py:1794 msgid "Bookmark has been added successfully" msgstr "Záložka byla úspěšně přidána" #: gajim/disco.py:1795 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "Můžete spravovat Vaše záložky přes menu Akce ve vašem Seznamu." #: gajim/disco.py:1987 msgid "Subscribed" msgstr "Autorizován" #: gajim/disco.py:1996 msgid "Node" msgstr "Uzel" #: gajim/disco.py:2063 msgid "New post" msgstr "Nový záznam" #: gajim/disco.py:2069 msgid "_Subscribe" msgstr "_Žádat autorizaci" #: gajim/disco.py:2075 msgid "_Unsubscribe" msgstr "_Zrušit autorizaci" #: gajim/conversation_textview.py:329 msgid "" "Text below this line is what has been said since the\n" "last time you paid attention to this group chat" msgstr "" "Text pod touto čarou označuje to, co bylo řečeno \n" "po posledním čtení této diskuze" #: gajim/conversation_textview.py:550 #, fuzzy msgid "_Quote" msgstr "_Konec" #: gajim/conversation_textview.py:558 #, python-format msgid "_Actions for \"%s\"" msgstr "_Akce pro \"%s\"" #: gajim/conversation_textview.py:572 msgid "Read _Wikipedia Article" msgstr "Číst článkek na _Wikipedia" #: gajim/conversation_textview.py:577 msgid "Look it up in _Dictionary" msgstr "Vyhledat ve _slovníku" #: gajim/conversation_textview.py:594 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "URL slovníku chybí \"%s\" a není to WIKTIONARY" #: gajim/conversation_textview.py:608 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "URL pro hledání na webu chybí \"%s\"" #: gajim/conversation_textview.py:611 msgid "Web _Search for it" msgstr "_Hledat na Webu" #: gajim/conversation_textview.py:617 msgid "Open as _Link" msgstr "Otevřít jako _Odkaz" #: gajim/conversation_textview.py:847 msgid "URL:" msgstr "" #: gajim/conversation_textview.py:1021 #, fuzzy msgid "Invalid URL" msgstr "Neplatné JID" #: gajim/conversation_textview.py:1106 msgid "" "Message corrected. Original message:\n" "{}" msgstr "" #: gajim/conversation_textview.py:1250 #, fuzzy, python-format msgid "Yesterday" msgid_plural "%(nb_days)i days ago" msgstr[0] "Včera" msgstr[1] "před %i dny" msgstr[2] "před %i dny" #: gajim/message_textview.py:43 #, fuzzy msgid "Write a message.." msgstr "Nová soukromá zpráva" #: gajim/message_window.py:245 msgid "You are going to close several tabs" msgstr "Chystáte se zavřít několik panelů" #: gajim/message_window.py:246 msgid "Do you really want to close them all?" msgstr "Opravdu je chcete všechny zavřít?" #: gajim/message_window.py:517 #, fuzzy msgid "?Noun:Chats" msgstr "Diskuze" #: gajim/message_window.py:521 msgid "Private Chats" msgstr "Soukromé rozhovory" #: gajim/message_window.py:527 msgid "Messages" msgstr "Zprávy" #: gajim/gui_interface.py:158 gajim/gui_interface.py:329 #: gajim/gui_interface.py:338 gajim/gui_interface.py:345 #: gajim/gui_interface.py:349 gajim/gui_interface.py:352 #: gajim/gui_interface.py:360 msgid "Unable to join group chat" msgstr "Nelze se připojit se do diskuze" #: gajim/gui_interface.py:159 #, fuzzy, python-format msgid "" "Your desired nickname in group chat\n" "%s\n" "is in use or registered by another occupant.\n" "Please specify another nickname below:" msgstr "" "Tebou požadované přezdívka se již používá v diskuzi %s nebo je " "zaregistrována někým jiným.\n" "Níže vyber jinou přezdívku:" #: gajim/gui_interface.py:163 msgid "Always use this nickname when there is a conflict" msgstr "Vždy při konfliktu použij tuto přezdívku." #: gajim/gui_interface.py:181 msgid "Do you accept this request?" msgstr "Chcete přijmout tuto žádost?" #: gajim/gui_interface.py:183 #, python-format msgid "Do you accept this request on account %s?" msgstr "Chcete přijmout tuto žádost na účtě %s?" #: gajim/gui_interface.py:186 #, fuzzy, python-format msgid "HTTP (%(method)s) Authorization for %(url)s (ID: %(id)s)" msgstr "HTTP (%(method)s) Autorizace pro %(url)s (id: %(id)s)" #: gajim/gui_interface.py:230 gajim/notify.py:96 msgid "Connection Failed" msgstr "Spojení selhalo" #: gajim/gui_interface.py:315 #, python-format msgid "A Password is required to join the room %s. Please type it." msgstr "Pro připojení do místnosti %s je vyžadováno heslo. Zadejte, prosím." #: gajim/gui_interface.py:330 #, fuzzy, python-format msgid "%s is full" msgstr "Písmo" #: gajim/gui_interface.py:339 #, fuzzy, python-format msgid "You are banned from group chat %s." msgstr "Máš zakázán přístup do diskuze %s." #: gajim/gui_interface.py:346 #, fuzzy, python-format msgid "Remote server %s does not exist." msgstr "Diskuze %s neexistuje." #: gajim/gui_interface.py:350 #, fuzzy, python-format msgid "Group chat %s does not exist." msgstr "Diskuze %s neexistuje." #: gajim/gui_interface.py:353 #, fuzzy msgid "Group chat creation is not permitted." msgstr "Vytváření místností není povoleno." #: gajim/gui_interface.py:355 #, fuzzy msgid "Unable to join groupchat" msgstr "Nelze se připojit se do diskuze" #: gajim/gui_interface.py:356 #, fuzzy, python-format msgid "You must use your registered nickname in %s." msgstr "Musí být použita přezdívka, jež máte zaregistrovánu v diskuzi %s." #: gajim/gui_interface.py:361 #, python-format msgid "You are not in the members list in groupchat %s." msgstr "Nejsi v seznamu členů diskuze %s." #: gajim/gui_interface.py:455 gajim/gui_interface.py:459 #, python-format msgid "Error %(code)s: %(msg)s" msgstr "Chyba %(code)s: %(msg)s" #: gajim/gui_interface.py:470 gajim/gui_interface.py:486 #: gajim/common/connection_handlers_events.py:1430 #, fuzzy, python-format msgid "error while sending %(message)s ( %(error)s )" msgstr "chyba při odesílání %s ( %s )" #: gajim/gui_interface.py:513 gajim/notify.py:96 msgid "Subscription request" msgstr "Žádost o autorizaci" #: gajim/gui_interface.py:524 gajim/common/contacts.py:131 #: gajim/common/helpers.py:95 msgid "Observers" msgstr "Přihlížející" #: gajim/gui_interface.py:538 msgid "Authorization accepted" msgstr "Autorizace přijata" #: gajim/gui_interface.py:539 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "Kontakt \"%s\" Vás autorizoval k zobrazení jeho stavu." #: gajim/gui_interface.py:547 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Kontakt \"%s\" Vám odebral autorizaci" #: gajim/gui_interface.py:548 #, fuzzy msgid "" "You will always see them as offline.\n" "Do you want to remove them from your contact list?" msgstr "" "Vždy uvidíte jeho nebo ji odpojeného/odpojenou.\n" "Opravdu jeho/ji chcete odstrani ze seznamu kontaktů?" #: gajim/gui_interface.py:570 gajim/notify.py:96 msgid "Unsubscribed" msgstr "Autorizace zrušena" #: gajim/gui_interface.py:582 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Kontakt s \"%s\" nebyl navázán" #: gajim/gui_interface.py:583 gajim/common/connection.py:1288 #: gajim/common/connection.py:1474 msgid "Check your connection or try again later." msgstr "Ověřte spojení nebo zkuste později." #: gajim/gui_interface.py:641 #, python-format msgid "%(jid)s declined the invitation: %(reason)s" msgstr "" #: gajim/gui_interface.py:645 #, python-format msgid "%(jid)s declined the invitation" msgstr "" #: gajim/gui_interface.py:675 #, fuzzy msgid "" "You configured Gajim to use OpenPGP agent, but there is no OpenPGP agent " "running or it returned a wrong passphrase.\n" msgstr "" "Nastavily jste Gajim aby používal GPG agenta, ale žádný GPG agent není " "spuštěný nebo vrátil chybné heslo.\n" #: gajim/gui_interface.py:678 gajim/gui_interface.py:686 msgid "You are currently connected without your OpenPGP key." msgstr "Momentálně jste připojen(a) bez vašeho OpenPGP klíče." #: gajim/gui_interface.py:680 #, fuzzy msgid "Wrong passphrase" msgstr "Nesprávné heslo" #: gajim/gui_interface.py:685 #, fuzzy msgid "Wrong OpenPGP passphrase" msgstr "Nesprávné heslo" #: gajim/gui_interface.py:699 #, fuzzy msgid "Certificate Passphrase Required" msgstr "Platnost certifikátu vypršela" #: gajim/gui_interface.py:700 #, fuzzy, python-format msgid "Enter the certificate passphrase for account %s" msgstr "Zadej heslo GPG klíče pro účet %(keyid)s (účet %(account)s)." #: gajim/gui_interface.py:723 #, fuzzy msgid "Untrusted OpenPGP key" msgstr "Vyberte Váš OpenPGP klíč" #: gajim/gui_interface.py:723 #, fuzzy msgid "" "The OpenPGP key used to encrypt this chat is not trusted. Do you really want " "to encrypt this message?" msgstr "" "GPG klíč použitý k šifrování rozhovoru není důvěryhodný. Opravdu chcete " "šifrovat tuto zprávu?" #: gajim/gui_interface.py:769 msgid "" "Please copy / paste the refresh token from the website that has just been " "opened." msgstr "" #: gajim/gui_interface.py:772 msgid "Oauth2 Credentials" msgstr "" #: gajim/gui_interface.py:924 #, python-format msgid "%s wants to send you a file." msgstr "%s Vám chce poslat soubor." #: gajim/gui_interface.py:1021 gajim/gui_interface.py:1433 msgid "SSL certificate error" msgstr "Chyba SSL certifikátu" #: gajim/gui_interface.py:1038 #, fuzzy msgid "File Transfer Failed" msgstr "Přenos souboru dokončen" #: gajim/gui_interface.py:1060 #, fuzzy, python-format msgid "%(filename)s received from %(name)s." msgstr "Přenos souboru %(filename)s od %(name)s byl zastaven." #: gajim/gui_interface.py:1064 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Přenos souboru %(filename)s od %(name)s byl zastaven." #: gajim/gui_interface.py:1068 #, fuzzy, python-format msgid "File transfer of %(filename)s from %(name)s failed." msgstr "Přenos souboru %(filename)s od %(name)s byl zastaven." #: gajim/gui_interface.py:1081 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "Soubor %(filename)s byl uspěšně odeslán %(name)s." #: gajim/gui_interface.py:1085 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "Přenos souboru %(filename)s pro %(name)s byl zastaven." #: gajim/gui_interface.py:1089 #, fuzzy, python-format msgid "File transfer of %(filename)s to %(name)s failed." msgstr "Přenos souboru %(filename)s pro %(name)s byl zastaven." #: gajim/gui_interface.py:1153 #, fuzzy msgid "Choose file to send" msgstr "Vyber soubor k odeslání..." #: gajim/gui_interface.py:1199 msgid "Unable to decrypt message" msgstr "Nepodařilo se dešifrovat zprávu" #: gajim/gui_interface.py:1211 msgid "Username Conflict" msgstr "Konflikt uživatelských jmen" #: gajim/gui_interface.py:1212 msgid "Please type a new username for your local account" msgstr "Prosím zadejte nové uživatelské jméno pro lokální účet" #: gajim/gui_interface.py:1235 msgid "Resource Conflict" msgstr "Konflikt Zdrojů" #: gajim/gui_interface.py:1236 msgid "" "You are already connected to this account with the same resource. Please " "type a new one" msgstr "Už jsi připojen(a) k tomuto účtu se stejným zdrojem. Prosím zadej nový" #: gajim/gui_interface.py:1293 #, python-format msgid "%s wants to start a voice chat." msgstr "%s chce zahájit hlasový rozhovor. " #: gajim/gui_interface.py:1296 msgid "Voice Chat Request" msgstr "Žádost o hlasový rozhovor" #: gajim/gui_interface.py:1386 msgid "Error verifying SSL certificate" msgstr "Chyba ověřování SSL certifikátu" #: gajim/gui_interface.py:1387 #, fuzzy, python-format msgid "" "There was an error verifying the SSL certificate of your XMPP server: " "%(error)s\n" "Do you still want to connect to this server?" msgstr "" "Chyba při ověřování SSL vertifikátu na vašem jabber serveru: %(error)s\n" "Chcete se přesto připojit?" #: gajim/gui_interface.py:1391 #, fuzzy, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA-1 fingerprint of the certificate:\n" "%(sha1)s\n" "SHA256 fingerprint of the certificate:\n" "%(sha256)s" msgstr "" "Přidat tento certifikát do důvěryhodných.\n" "SHA1 otisk certifikátu:\n" "%s" #: gajim/gui_interface.py:1397 msgid "Ignore this error for this certificate." msgstr "Ignorovat tuto chybu certifikátu." #: gajim/gui_interface.py:1410 msgid "Non Anonymous Server" msgstr "" #: gajim/gui_interface.py:1434 #, fuzzy, python-format msgid "" "It seems the SSL certificate of account %(account)s has changed and is not " "valid or your connection is being compromised.\n" "\n" "Old SHA-1 fingerprint: %(old_sha1)s\n" "Old SHA-256 fingerprint: %(old_sha256)s\n" "\n" "New SHA-1 fingerprint: %(new_sha1)s\n" "New SHA-256 fingerprint: %(new_sha256)s\n" "\n" "Do you still want to connect and update the fingerprint of the certificate?" msgstr "" "Vypadá to, že se SSL certifikát účtu %(account)s změnil nebo někdo hackuje " "vaše spojení.\n" "Starý otisk: %(old)s\n" "Nový otisk: %(new)s\n" "\n" "Chcete se stále připojit a aktualizovat otisk certifikátu?" #: gajim/gui_interface.py:1512 msgid "" "You are about to send your password on an insecure connection. You should " "install PyOpenSSL to prevent that. Are you sure you want to do that?" msgstr "" "Abyste nemuseli posílat heslo nezabezpečeným připojením nainstalujte si " "PyOpenSSL. Jste si jisti, že to chcete udělat?" #: gajim/gui_interface.py:1554 #, fuzzy msgid "" "You are about to send your password unencrypted on an insecure connection. " "Are you sure you want to do that?" msgstr "" "Chystáte se poslat vaše heslo nezabezpečeným spojením. Jste si jistý(á), že " "to skutečně chcete udělat?" #: gajim/gui_interface.py:1856 #, fuzzy msgid "JID is not a Groupchat" msgstr "Tohle není diskuze" #: gajim/gui_interface.py:2020 msgid "Emoticons disabled" msgstr "Smajlíci byly vypnuty" #: gajim/gui_interface.py:2021 #, fuzzy msgid "" "Your configured emoticons theme could not be loaded. See the log for more " "details." msgstr "" "Vámi nastavené téma pro smajlíky nebylo nalezeno, proto budou smajlíci " "vypnuty " #: gajim/gui_interface.py:2039 msgid "This is not a group chat" msgstr "Tohle není diskuze" #: gajim/gui_interface.py:2040 #, python-format msgid "" "%(room_jid)s is already in your roster. Please check if %(room_jid)s is a " "correct group chat name. If it is, delete it from your roster and try " "joining the group chat again." msgstr "" # FIXME: jaky je rozdil mezi settings a preferences? - kdo vi :) #: gajim/gui_interface.py:2418 msgid "Could not save your settings and preferences" msgstr "Nelze uložit Vaše nastavení" #: gajim/gui_interface.py:2828 gajim/common/config.py:117 #: gajim/common/config.py:532 gajim/common/optparser.py:343 #: gajim/common/optparser.py:511 gajim/common/optparser.py:534 msgid "default" msgstr "výchozí" #: gajim/gui_interface.py:3014 msgid "Passphrase Required" msgstr "Heslo Vyžadováno" #: gajim/gui_interface.py:3015 #, fuzzy, python-format msgid "Enter OpenPGP key passphrase for key %(keyid)s (account %(account)s)." msgstr "Zadej heslo GPG klíče pro účet %(keyid)s (účet %(account)s)." #: gajim/gui_interface.py:3029 #, fuzzy msgid "OpenPGP key expired" msgstr "GPG klíč vypršel" #: gajim/gui_interface.py:3030 #, fuzzy, python-format msgid "" "Your OpenPGP key has expired, you will be connected to %s without OpenPGP." msgstr "Váš GPG klíč vypršel, k %s budete připojen(a) bez OpenPGP." #: gajim/gui_interface.py:3039 msgid "Wrong Passphrase" msgstr "Nesprávné heslo" #: gajim/gui_interface.py:3040 #, fuzzy msgid "Please retype your OpenPGP passphrase or press Cancel." msgstr "Prosím zopakujte Vaše heslo pro GPG klíč, nebo stiskněte Zrušit." # FIXME: hmm kdovi co to je.. #: gajim/search_window.py:108 msgid "Waiting for results" msgstr "Čekání na výsledky" #: gajim/search_window.py:146 gajim/search_window.py:224 msgid "Error in received dataform" msgstr "Chyba v příchozím datagramu" #: gajim/search_window.py:181 gajim/search_window.py:216 msgid "No result" msgstr "Žádný výsledek" #: gajim/htmltextview.py:559 #, fuzzy msgid "Loading" msgstr "Programuji" #: gajim/atom_window.py:123 #, fuzzy, python-format msgid "You have received new entries (and %d not displayed):" msgid_plural "You have received new entries (and %d not displayed):" msgstr[0] "Dostal(a) jste novou položku: " msgstr[1] "Dostal(a) jste novou položku: " msgstr[2] "Dostal(a) jste novou položku: " #: gajim/atom_window.py:128 gajim/data/gui/atom_entry_window.ui:20 msgid "You have received new entry:" msgstr "Dostal(a) jste novou položku: " #: gajim/adhoc_commands.py:111 gajim/data/gui/adhoc_commands_window.ui:9 msgid "Ad-hoc Commands - Gajim" msgstr "Ad-hoc příkazy - Gajim" #: gajim/adhoc_commands.py:320 msgid "Cancel confirmation" msgstr "Zrušit ověření" #: gajim/adhoc_commands.py:321 msgid "" "You are in process of executing command. Do you really want to cancel it?" msgstr "Právě se provadí příkaz. Chcete ho skutečně přerušit?" #: gajim/adhoc_commands.py:387 gajim/adhoc_commands.py:411 msgid "Service sent malformed data" msgstr "Služba odeslala chybné data" #: gajim/adhoc_commands.py:396 msgid "Service changed the session identifier." msgstr "Služba změnila identifikátor sezení." #: gajim/adhoc_commands.py:416 #, fuzzy, python-format msgid "%s - Ad-hoc Commands - Gajim" msgstr "Ad-hoc příkazy - Gajim" #: gajim/adhoc_commands.py:510 msgid "Service returned an error." msgstr "Služba vrátila chybu." #: gajim/negotiation.py:34 msgid "- messages will be logged" msgstr "- zprávy budou zaznamenány" #: gajim/negotiation.py:36 msgid "- messages will not be logged" msgstr "- zprvý nebudou zaznamenány" #: gajim/notify.py:103 #, fuzzy msgid "Open" msgstr "OpenGPG" #: gajim/dialog_messages.py:33 #, fuzzy msgid "You can not start a new conversation unless you are connected." msgstr "Nemůžete vstoupit do diskuze pokud nejste připojen(a)." #: gajim/dialog_messages.py:48 msgid "Unread events" msgstr "Nepřečtené zprávy" #: gajim/dialog_messages.py:49 msgid "Read all pending events before removing this account." msgstr "Přečtěte si všechny čekající zprávy, než smažete tento účet." #: gajim/dialog_messages.py:53 msgid "You are currently connected to the server" msgstr "Nejste přávě připojen(a) k serveru" #: gajim/dialog_messages.py:54 msgid "To disable the account, you must be disconnected." msgstr "Chcete-li deaktivovat účet, musíte se nejdříve odpojit." #: gajim/dialog_messages.py:58 #, fuzzy msgid "Invalid Form" msgstr "Neplatná místnost" #: gajim/dialog_messages.py:59 #, fuzzy msgid "The form is not filled correctly." msgstr "Jabber ID diskuze obsahuje nepřijatelné znaky." #: gajim/dialog_messages.py:63 gajim/common/helpers.py:406 msgid "Invisible" msgstr "Neviditelný" #: gajim/dialog_messages.py:68 msgid "A connection is not available" msgstr "Spojení není dostupné" #: gajim/dialog_messages.py:69 msgid "Your message can not be sent until you are connected." msgstr "Va¹e zpráva nemù¾e být odeslána dokud se nepøipojíte." #: gajim/dialog_messages.py:73 #, fuzzy msgid "JID already in list" msgstr "Jabber ID je již na seznamu" #: gajim/dialog_messages.py:74 #, fuzzy msgid "The JID you entered is already in the list. Choose another one." msgstr "Jabber ID je již na seznamu. Vyberte jiné." #: gajim/dialog_messages.py:78 msgid "Invalid answer" msgstr "Neplatná odpověď" #: gajim/dialog_messages.py:79 #, python-format msgid "Transport %(name)s answered wrongly to register request: %(error)s" msgstr "Transport %(name)s odpověděl chybně na požadavek registrace: %(error)s" #: gajim/dialog_messages.py:84 #, fuzzy msgid "Wrong Custom Hostname" msgstr "Použít vlastní jméno počítače/port" #: gajim/dialog_messages.py:85 #, fuzzy, python-format msgid "Wrong custom hostname \"%s\". Ignoring it." msgstr "Použít vlastní jméno počítače/port" #: gajim/dialog_messages.py:89 msgid "Error while removing privacy list" msgstr "Chyba při odebírání privacy listu" #: gajim/dialog_messages.py:90 #, python-format msgid "" "Privacy list %s has not been removed. It is maybe active in one of your " "connected resources. Deactivate it and try again." msgstr "" "Privacy list %s nebyl odstraněn. Možná je aktivní v jednom z připojených " "zdrojů. Zruště jeho používání a zkuste znovu." #: gajim/dialog_messages.py:96 msgid "Invisibility not supported" msgstr "Neviditelnost není podporována" #: gajim/dialog_messages.py:97 #, python-format msgid "Account %s doesn't support invisibility." msgstr "Účet %s nepodporuje neviditelnost." #: gajim/dialog_messages.py:101 msgid "Unregister failed" msgstr "Odregistrace selhala" #: gajim/dialog_messages.py:102 #, python-format msgid "Unregistration with server %(server)s failed: %(error)s" msgstr "Zrušení registrace ze serveru %(server)s selhalo: %(error)s" #: gajim/dialog_messages.py:106 msgid "Registration succeeded" msgstr "Registrace úspěšná" #: gajim/dialog_messages.py:107 #, python-format msgid "Registration with agent %s succeeded" msgstr "Registrace k agentu %s uspěla" #: gajim/dialog_messages.py:111 msgid "Registration failed" msgstr "Registrace selhala" #: gajim/dialog_messages.py:112 #, python-format msgid "" "Registration with agent %(agent)s failed with error %(error)s: %(error_msg)s" msgstr "" "Registrace s agentem %(agent)s failed with error %(error)s: %(error_msg)s" #: gajim/dialog_messages.py:117 #, fuzzy msgid "Unable to join Groupchat" msgstr "Nelze se připojit se do diskuze" #: gajim/dialog_messages.py:122 msgid "GStreamer error" msgstr "" #: gajim/dialog_messages.py:123 #, fuzzy, python-format msgid "" "Error: %(error)s\n" "Debug: %(debug)s" msgstr "Chybová zpráva: %s" #: gajim/dialog_messages.py:127 msgid "Wrong host" msgstr "Nesprávné jméno počítače" #: gajim/dialog_messages.py:128 msgid "Invalid local address? :-O" msgstr "Neplatná místní adresa? :-O" #: gajim/dialog_messages.py:132 msgid "Avahi error" msgstr "Chyba Avahi" #: gajim/dialog_messages.py:133 #, python-format msgid "" "%s\n" "Link-local messaging might not work properly." msgstr "" "%s\n" "Zasílání lokálních zpráv nemusí fungovat správně." #: gajim/dialog_messages.py:137 gajim/dialog_messages.py:142 #, fuzzy msgid "Could not request upload slot" msgstr "Nepodařilo se spustit lokální službu" #: gajim/dialog_messages.py:143 msgid "Got unexpected response from server (see log)" msgstr "" #: gajim/dialog_messages.py:147 gajim/dialog_messages.py:152 #, fuzzy msgid "Could not open file" msgstr "Nezdařilo se načtení obrázku" #: gajim/dialog_messages.py:148 msgid "Exception raised while opening file (see log)" msgstr "" #: gajim/dialog_messages.py:157 msgid "Unsecure" msgstr "" #: gajim/dialog_messages.py:158 #, fuzzy msgid "Server returned unsecure transport (http)" msgstr "Služba vrátila chybu." #: gajim/dialog_messages.py:162 #, fuzzy msgid "Could not upload file" msgstr "Nezdařilo se načtení obrázku" #: gajim/dialog_messages.py:163 #, python-format msgid "HTTP response code from server: %s" msgstr "" #: gajim/dialog_messages.py:167 msgid "Upload Error" msgstr "" #: gajim/dialog_messages.py:172 #, fuzzy msgid "Encryption Error" msgstr "E2E Šifrování vypnuto" #: gajim/dialog_messages.py:173 #, fuzzy msgid "For the choosen encryption is no encryption method available" msgstr "Spojení není dostupné" #: gajim/gajim_themes_window.py:61 msgid "Theme" msgstr "Téma" #: gajim/gajim_themes_window.py:98 msgid "You cannot make changes to the default theme" msgstr "Nemůžete měnit výchozí téma" #: gajim/gajim_themes_window.py:99 #, fuzzy msgid "Please create a new clean theme." msgstr "Vytvořte vaše nové téma." #: gajim/gajim_themes_window.py:170 msgid "theme name" msgstr "jméno tématu" #: gajim/gajim_themes_window.py:187 msgid "You cannot delete your current theme" msgstr "Nemůžete smazat právě používané téma" #: gajim/gajim_themes_window.py:188 msgid "Pick another theme to use first." msgstr "" #: gajim/accounts_window.py:40 #, fuzzy msgid "Merge Accounts" msgstr "Spojené účty" #: gajim/accounts_window.py:41 #, fuzzy msgid "Use PGP Agent" msgstr "Použít GPG _Agenta" #: gajim/accounts_window.py:153 gajim/common/config.py:511 msgid "Be right back." msgstr "Hned jsem zpět." #: gajim/accounts_window.py:157 msgid "Relogin now?" msgstr "Připojit se teď znovu?" #: gajim/accounts_window.py:158 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "Pokud chcete, aby se změny projevily ihned, musíte se znovu přihlásit." #: gajim/accounts_window.py:211 #, python-format msgid "You have opened chat in account %s" msgstr "Otevřel(a) jsi rozhovor z účtu %s" #: gajim/accounts_window.py:212 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "" "Všechna okna rozhovorů a diskuzí budou zavřena. Opravdu chceš pokračovat?" #: gajim/accounts_window.py:345 #, fuzzy msgid "Remove" msgstr "Odst_ranit" #: gajim/accounts_window.py:388 #, fuzzy msgid "Rename account label" msgstr "Přejmenovat účet" #: gajim/accounts_window.py:457 msgid "Login" msgstr "" #: gajim/accounts_window.py:466 msgid "Connection" msgstr "Spojení" #: gajim/accounts_window.py:469 #, fuzzy msgid "Import Contacts" msgstr "Pozvat kontakt" #: gajim/accounts_window.py:472 gajim/accounts_window.py:655 #, fuzzy msgid "Client Certificate" msgstr "Sám sebou podepsaný certifikát" #: gajim/accounts_window.py:475 gajim/accounts_window.py:570 #, fuzzy msgid "OpenPGP Key" msgstr "Přiřadit OpenPGP klíč" #: gajim/accounts_window.py:486 gajim/accounts_window.py:558 #, fuzzy msgid "Connect on startup" msgstr "_Připojit po startu Gajimu" #: gajim/accounts_window.py:489 #, fuzzy msgid "Reconnect when connection is lost" msgstr "Automaticky se znovu připojit při ztrátě spojení" #: gajim/accounts_window.py:492 gajim/accounts_window.py:562 #, fuzzy msgid "Save conversations for all contacts" msgstr "Uložit _historii pro všechny kontakty" #: gajim/accounts_window.py:494 gajim/accounts_window.py:564 msgid "Store conversations on the harddrive" msgstr "" #: gajim/accounts_window.py:496 #, fuzzy msgid "Server Message Archive" msgstr "Ode_slat zprávu serveru" #: gajim/accounts_window.py:498 msgid "" "Messages get stored on the server.\n" "The archive is used to sync messages\n" "between multiple devices.\n" "XEP-0313" msgstr "" #: gajim/accounts_window.py:503 gajim/accounts_window.py:566 #, fuzzy msgid "Global Status" msgstr "Všechny stavy" #: gajim/accounts_window.py:505 #, fuzzy msgid "Synchronise the status of all accounts" msgstr "Změní stav účtu nebo účtů" #: gajim/accounts_window.py:507 #, fuzzy msgid "Message Carbons" msgstr "Zprávy" #: gajim/accounts_window.py:509 msgid "" "All your other online devices get copies\n" "of sent and received messages.\n" "XEP-0280" msgstr "" #: gajim/accounts_window.py:513 msgid "Use file transfer proxies" msgstr "Použij proxy při přenosu souborů" #: gajim/accounts_window.py:525 gajim/accounts_window.py:560 #, fuzzy msgid "Use environment variable" msgstr "_použít proměnnou prostředí HTTP_PROXY" #: gajim/accounts_window.py:527 #, fuzzy msgid "Proxy" msgstr "Proxy:" #: gajim/accounts_window.py:530 #, fuzzy msgid "Warn on insecure connection" msgstr "_Varovat před použitím nezabezpečeného spojení" #: gajim/accounts_window.py:534 msgid "Send keep-alive packets" msgstr "Odesílat keep-alive pakety" #: gajim/accounts_window.py:538 msgid "Manually set the hostname for the server" msgstr "" #: gajim/accounts_window.py:541 #, fuzzy msgid "Resource" msgstr "Zdroj:" #: gajim/accounts_window.py:544 gajim/accounts_window.py:612 #: gajim/accounts_window.py:617 #, fuzzy msgid "Priority" msgstr "Priori_ta:" #: gajim/accounts_window.py:568 #, fuzzy msgid "Synchronize the status of all accounts" msgstr "Změní stav účtu nebo účtů" #: gajim/accounts_window.py:581 #, fuzzy msgid "First Name" msgstr "Křestní:" #: gajim/accounts_window.py:584 #, fuzzy msgid "Last Name" msgstr "Příjmení:" #: gajim/accounts_window.py:587 #: gajim/data/gui/archiving_313_preferences_window.ui:71 msgid "Jabber ID" msgstr "Jabber ID" #: gajim/accounts_window.py:590 #, fuzzy msgid "Email" msgstr "Nový E-mail" #: gajim/accounts_window.py:608 #, fuzzy msgid "Adjust to status" msgstr "N_astavit podle stavu" #: gajim/accounts_window.py:635 msgid "Enable" msgstr "Povolit" #: gajim/accounts_window.py:642 #, fuzzy msgid "Port" msgstr "_Port:" #: gajim/accounts_window.py:647 #, fuzzy msgid "Connection Options" msgstr "Spojení" #: gajim/accounts_window.py:659 #, fuzzy msgid "Encrypted Certificate" msgstr "Sám sebou podepsaný certifikát" #: gajim/accounts_window.py:663 #, fuzzy msgid "Certificate Options" msgstr "Sám sebou podepsaný certifikát" #: gajim/accounts_window.py:671 gajim/data/gui/join_groupchat_window.ui:143 #, fuzzy msgid "Password" msgstr "Heslo:" #: gajim/accounts_window.py:675 #, fuzzy msgid "Save Password" msgstr "Uložit heslo" #: gajim/accounts_window.py:678 gajim/data/gui/change_password_dialog.ui:8 msgid "Change Password" msgstr "Změnit heslo" #: gajim/accounts_window.py:683 #, fuzzy msgid "Login Options" msgstr "_Smajlíky:" #: gajim/gajim_remote.py:59 gajim/common/exceptions.py:71 msgid "D-Bus is not present on this machine or python module is missing" msgstr "D-Bus není přítomna na tohto stroji nebo modul pythonu chybí" #: gajim/gajim_remote.py:81 msgid "Shows a help on specific command" msgstr "Zobrazí nápovědu pro konkrétní příkaz" #: gajim/gajim_remote.py:84 msgid "command" msgstr "příkaz" #: gajim/gajim_remote.py:85 msgid "show help on command" msgstr "zobraz nápovědu k příkazu" #: gajim/gajim_remote.py:89 #, fuzzy msgid "Lists all contacts in roster, one for each line" msgstr "" "Vytiskne seznam všech kontaktů v rosteru. Každý kontakt se objeví na " "samostatném řádku" #: gajim/gajim_remote.py:91 gajim/gajim_remote.py:106 gajim/gajim_remote.py:116 #: gajim/gajim_remote.py:130 gajim/gajim_remote.py:144 #: gajim/gajim_remote.py:153 gajim/gajim_remote.py:174 #: gajim/gajim_remote.py:204 gajim/gajim_remote.py:213 #: gajim/gajim_remote.py:220 #, fuzzy msgid "?CLI:account" msgstr "účet" #: gajim/gajim_remote.py:91 msgid "show only contacts of the given account" msgstr "zobraz pouze kontakty zadaného účtu" #: gajim/gajim_remote.py:97 msgid "Prints a list of registered accounts" msgstr "Vypíše seznam registrovaných účtů" #: gajim/gajim_remote.py:101 #, fuzzy msgid "Changes the status of account(s)" msgstr "Změní stav účtu nebo účtů" #: gajim/gajim_remote.py:104 #, fuzzy msgid "?CLI:status" msgstr "stav" #: gajim/gajim_remote.py:104 #, fuzzy msgid "" "one of: offline, online, chat, away, xa, dnd, invisible. If not set, use " "account's previous status" msgstr "" "jeden z: odpojen, připojen, ukecaný, pryč, nedostupný, nerušit, neviditelný " #: gajim/gajim_remote.py:105 gajim/gajim_remote.py:127 #: gajim/gajim_remote.py:141 gajim/gajim_remote.py:152 #, fuzzy msgid "?CLI:message" msgstr "zpráva" #: gajim/gajim_remote.py:105 msgid "status message" msgstr "text stavu" #: gajim/gajim_remote.py:106 msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" msgstr "" "změnit stav účtu \"account\". Pokud není uveden, zkuste změnit stav všech " "účtů které mají povolenu volbu \"sync with global status\" " #: gajim/gajim_remote.py:112 #, fuzzy msgid "Changes the priority of account(s)" msgstr "Změní prioritu jednoho nebo více účtů" #: gajim/gajim_remote.py:114 #, fuzzy msgid "?CLI:priority" msgstr "priorita" #: gajim/gajim_remote.py:114 msgid "priority you want to give to the account" msgstr "priorita vámi přidělená účtu" #: gajim/gajim_remote.py:116 #, fuzzy msgid "" "change the priority of the given account. If not specified, change status of " "all accounts that have \"sync with global status\" option set" msgstr "" "změnit stav účtu \"account\". Pokud není uveden, zkuste změnit stav všech " "účtů které mají povolenu volbu \"sync with global status\" " #: gajim/gajim_remote.py:122 msgid "" "Sends new chat message to a contact in the roster. Both OpenPGP key and " "account are optional. If you want to set only 'account', without 'OpenPGP " "key', just set 'OpenPGP key' to ''." msgstr "" "Poslat nový rozhovor kontaktu v Seznamu. Obojí OpenPGP klíč a účet jsou " "volitelné. Pokud chcete nastavit pouze 'account' bez 'OpenPGP key', nastavte " "prostě 'OpenPGP key' na ''." #: gajim/gajim_remote.py:126 gajim/gajim_remote.py:139 msgid "JID of the contact that will receive the message" msgstr "JID kontaktu, který obdrží zprávu" #: gajim/gajim_remote.py:127 gajim/gajim_remote.py:141 #: gajim/gajim_remote.py:152 msgid "message contents" msgstr "Tělo zprávy" #: gajim/gajim_remote.py:128 gajim/gajim_remote.py:142 msgid "PGP key" msgstr "" #: gajim/gajim_remote.py:128 gajim/gajim_remote.py:142 msgid "if specified, the message will be encrypted using this public key" msgstr "pokud bude uvedeno, zpráva bude zašifrována tímto veřejným klíčem" #: gajim/gajim_remote.py:130 gajim/gajim_remote.py:144 #: gajim/gajim_remote.py:153 msgid "if specified, the message will be sent using this account" msgstr "pokud bude uvedeno, zpráva bude odeslána z tohoto účtu" #: gajim/gajim_remote.py:135 #, fuzzy msgid "" "Sends a chat message to someone on your roster. Optionally with OpenPGP key " "and account. If you want to only set the latter, set OpenPGP key to \"\"." msgstr "" "Poslat nový rozhovor kontaktu v Seznamu. Obojí OpenPGP klíč a účet jsou " "volitelné. Pokud chcete nastavit pouze 'account' bez 'OpenPGP key', nastavte " "prostě 'OpenPGP key' na ''." #: gajim/gajim_remote.py:140 msgid "subject" msgstr "předmět" #: gajim/gajim_remote.py:140 msgid "message subject" msgstr "předmět zprávy" #: gajim/gajim_remote.py:149 msgid "Sends new message to a groupchat you've joined." msgstr "Poslat novou zprávu do diskuze ke které jste připojeni." #: gajim/gajim_remote.py:151 msgid "JID of the room that will receive the message" msgstr "JID diskuze do které přijde zpráva" #: gajim/gajim_remote.py:158 msgid "Gets detailed info on a contact" msgstr "Získej detailní informace o kontaktu" #: gajim/gajim_remote.py:160 gajim/gajim_remote.py:173 #: gajim/gajim_remote.py:203 msgid "JID of the contact" msgstr "JID kontaktu" #: gajim/gajim_remote.py:164 msgid "Gets detailed info on a account" msgstr "Získej detailní informace o účtu" #: gajim/gajim_remote.py:166 msgid "Name of the account" msgstr "Jméno účtu" #: gajim/gajim_remote.py:170 msgid "Sends file to a contact" msgstr "Pošle soubor kontaktu" #: gajim/gajim_remote.py:172 msgid "file" msgstr "soubor" #: gajim/gajim_remote.py:172 msgid "File path" msgstr "Cesta k souboru" #: gajim/gajim_remote.py:174 msgid "if specified, file will be sent using this account" msgstr "pokud bude uvedeno, zpráva bude odeslána z tohoto účtu" #: gajim/gajim_remote.py:179 msgid "Lists all preferences and their values" msgstr "Vypíše všechna nastavení a jejich hodnoty" # FIXME: opravit, pokud je mozne prekladat i key & value #: gajim/gajim_remote.py:183 msgid "Sets value of 'key' to 'value'." msgstr "Nastaví hodnotu klíče 'key' na hodnotu 'value'" #: gajim/gajim_remote.py:185 msgid "key=value" msgstr "klíč=hodnota" # FIXME: opet #: gajim/gajim_remote.py:185 #, fuzzy msgid "'key' is the name of the preference, 'value' is what to set it to" msgstr "'klíč' je jméno volby, 'hodnota' je hodnota která se nastavuje" #: gajim/gajim_remote.py:190 msgid "Deletes a preference item" msgstr "Smaže položku nastavení" #: gajim/gajim_remote.py:192 msgid "key" msgstr "klíč" #: gajim/gajim_remote.py:192 msgid "name of the preference to be deleted" msgstr "jméno volby, která bude smazána" #: gajim/gajim_remote.py:196 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "Zapíše aktuální nastavení do souboru .config" #: gajim/gajim_remote.py:201 msgid "Removes contact from roster" msgstr "Odstraní kontakt ze Seznamu" #: gajim/gajim_remote.py:204 msgid "if specified, contact is taken from the contact list of this account" msgstr "pokud uvedeno, kontakt bude vzít ze seznamu kontaktů pro tento účet" #: gajim/gajim_remote.py:211 msgid "Returns current status (the global one unless account is specified)" msgstr "Vrátí aktuální stav (globální, pokud není uveden účet)" #: gajim/gajim_remote.py:218 msgid "" "Returns current status message (the global one unless account is specified)" msgstr "Vrací aktuální popis stavu (globální, pokud není uveden účet)" #: gajim/gajim_remote.py:225 msgid "Returns number of unread messages" msgstr "Vrací počet nepřečtených zpráv" #: gajim/gajim_remote.py:230 msgid "Sends custom XML" msgstr "Poslat vlastní XML" #: gajim/gajim_remote.py:232 msgid "XML to send" msgstr "XML k odeslání" #: gajim/gajim_remote.py:233 #, fuzzy msgid "" "Account to which the XML will be sent; if not specified, XML will be sent to " "all accounts" msgstr "" "Účet, ze kterého bude xml odesláno; pokud nebude uvedeno, xml bude odeslání " "ze všech účtů" #: gajim/gajim_remote.py:239 #, fuzzy msgid "Change the avatar" msgstr "Změnit stav" #: gajim/gajim_remote.py:241 #, fuzzy msgid "Picture to use" msgstr "Přezdívka kterou chete použít" #: gajim/gajim_remote.py:242 #, fuzzy msgid "" "Account in which the avatar will be set; if not specified, the avatar will " "be set for all accounts" msgstr "" "Účet, ze kterého bude xml odesláno; pokud nebude uvedeno, xml bude odeslání " "ze všech účtů" #: gajim/gajim_remote.py:249 msgid "Check if Gajim is running" msgstr "Zkontrolujte, zda Gajim již běží." #: gajim/gajim_remote.py:275 msgid "Missing argument \"contact_jid\"" msgstr "Chybí parametry \"contact_jid\"" #: gajim/gajim_remote.py:295 #, python-format msgid "" "'%s' is not in your roster.\n" "Please specify account for sending the message." msgstr "" "'%s' není ve vašem Seznamu.\n" "Prosím uveďte účet, přes který bude odeslána zpráva." #: gajim/gajim_remote.py:298 msgid "You have no active account" msgstr "Nemáte aktivní účet" #: gajim/gajim_remote.py:346 msgid "It seems Gajim is not running. So you can't use gajim-remote." msgstr "Vypadá to, že Gajim neběží. Proto nemůžete použít gajim-remote" #: gajim/gajim_remote.py:373 #, python-format msgid "" "Usage: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" msgstr "" "Použití: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" #: gajim/gajim_remote.py:377 msgid "Arguments:" msgstr "Parametry:" #: gajim/gajim_remote.py:381 #, python-format msgid "%s not found" msgstr "%s nebyl nalezen" #: gajim/gajim_remote.py:387 #, fuzzy, python-format msgid "" "Usage:\n" " %s command [arguments]\n" "\n" "Command is one of:\n" msgstr "" "Použití: %s příkaz [parametry]\n" "Příkaz je jeden z:\n" #: gajim/gajim_remote.py:457 #, python-format msgid "" "Too many arguments. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" "Příliš mnoho parametrů. \n" "Napište \"%(basename)s help %(command)s\" pro více informací" #: gajim/gajim_remote.py:462 #, python-format msgid "" "Argument \"%(arg)s\" is not specified. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" "Parametr \"%(arg)s\" nebyl uveden. \n" "Napište \"%(basename)s help %(command)s\" pro více informací" #: gajim/common/app.py:264 msgid "Unable to load idle module" msgstr "Nelze nahrát idle modul" #: gajim/common/fuzzyclock.py:37 msgid "twelve" msgstr "dvanáct" #: gajim/common/fuzzyclock.py:37 msgid "one" msgstr "jeden" #: gajim/common/fuzzyclock.py:37 msgid "two" msgstr "dva" #: gajim/common/fuzzyclock.py:37 msgid "three" msgstr "tři" #: gajim/common/fuzzyclock.py:37 msgid "four" msgstr "čtyři" #: gajim/common/fuzzyclock.py:38 msgid "five" msgstr "pět" #: gajim/common/fuzzyclock.py:38 msgid "six" msgstr "šest" #: gajim/common/fuzzyclock.py:38 msgid "seven" msgstr "sedm" #: gajim/common/fuzzyclock.py:38 msgid "eight" msgstr "osm" #: gajim/common/fuzzyclock.py:38 msgid "nine" msgstr "devět" #: gajim/common/fuzzyclock.py:38 msgid "ten" msgstr "deset" #: gajim/common/fuzzyclock.py:39 msgid "eleven" msgstr "jedenáct" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "%(0)s o'clock" msgstr "%(0)s hodin" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "five past %(0)s" msgstr "pět po %(0)s" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "ten past %(0)s" msgstr "deset po %(0)s" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "quarter past %(0)s" msgstr "čtvrt po %(0)s" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "twenty past %(0)s" msgstr "dvacet po %(0)s" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "twenty five past %(0)s" msgstr "dvacet pět po %(0)s" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "half past %(0)s" msgstr "půl %(0)s" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "twenty five to %(1)s" msgstr "dvacet pět do %(1)s" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "twenty to %(1)s" msgstr "dvacet do %(1)s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "quarter to %(1)s" msgstr "tři čtvrtě na %(1)s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "ten to %(1)s" msgstr "za deset %(1)s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "five to %(1)s" msgstr "za pět %(1)s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "%(1)s o'clock" msgstr "%(1)s hodin" #: gajim/common/fuzzyclock.py:48 gajim/common/fuzzyclock.py:50 msgid "Night" msgstr "Noc" #: gajim/common/fuzzyclock.py:48 msgid "Early morning" msgstr "Brzy ráno" #: gajim/common/fuzzyclock.py:48 msgid "Morning" msgstr "Ráno" #: gajim/common/fuzzyclock.py:49 msgid "Almost noon" msgstr "Skoro poledne" #: gajim/common/fuzzyclock.py:49 msgid "Noon" msgstr "Poledne" #: gajim/common/fuzzyclock.py:49 msgid "Afternoon" msgstr "Odpoledne" #: gajim/common/fuzzyclock.py:49 msgid "Evening" msgstr "Večer" #: gajim/common/fuzzyclock.py:50 msgid "Late evening" msgstr "Pozdě večer" #: gajim/common/fuzzyclock.py:52 msgid "Start of week" msgstr "Začátek týdne" #: gajim/common/fuzzyclock.py:52 gajim/common/fuzzyclock.py:53 msgid "Middle of week" msgstr "Uprostřed týdne" #: gajim/common/fuzzyclock.py:53 msgid "End of week" msgstr "Konec týdne" #: gajim/common/fuzzyclock.py:53 msgid "Weekend!" msgstr "Víkend!" #: gajim/common/connection_handlers_events.py:369 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " "management tools such as http://jru.jabberstudio.org/ to remove it" msgstr "" "JID %s neodpovídá RFC. Nebude přidáno do tvého rosteru. Použij nástroje pro " "správu rosteru jako je http://jru.jabberstudio.org/ k jeho odstranění" #: gajim/common/connection_handlers_events.py:852 #, python-format msgid "unsubscribe request from %s" msgstr "Žádost o zrušení autorizace od %s" #: gajim/common/connection_handlers_events.py:952 msgid "Room has been destroyed" msgstr "Místnost byla zničena" #: gajim/common/connection_handlers_events.py:960 #, python-format msgid "You can join this room instead: %s" msgstr "Můžete se připojit do této místnosti: %s" #: gajim/common/connection_handlers_events.py:1979 #, python-format msgid "Unknown SSL error: %d" msgstr "Neznámá SSL chyba: %d" #: gajim/common/connection_handlers_events.py:2625 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Nová jednoduché zpráva od %(nickname)s" #: gajim/common/connection_handlers_events.py:2631 #, python-format msgid "New Private Message from group chat %s" msgstr "Nová soukromá zpráva z místnosti %s" #: gajim/common/connection_handlers_events.py:2634 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" #: gajim/common/connection_handlers_events.py:2637 #, python-format msgid "Messaged by %(nickname)s" msgstr "Nová zpráva od %(nickname)s" #: gajim/common/connection_handlers_events.py:2643 #, python-format msgid "New Message from %(nickname)s" msgstr "Nová zpráva od %(nickname)s" #: gajim/common/connection_handlers_events.py:2809 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s Změnil(a) stav" #: gajim/common/connection_handlers_events.py:2817 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s se přihlásil" #: gajim/common/connection_handlers_events.py:2823 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s se odhlásil" #: gajim/common/contacts.py:386 msgid "Not in roster" msgstr "Není v rosteru" #: gajim/common/config.py:76 msgid "" "Show desktop notification even when a chat window is opened for this contact " "and does not have focus" msgstr "" #: gajim/common/config.py:77 msgid "Play sound when user is busy" msgstr "Přehrávat zvuk, je-li uživatel zaneprázdněn" #: gajim/common/config.py:79 msgid "Show only online and free for chat contacts in roster." msgstr "Zobraz v rosteru pouze online kontakty nebo kontakty hledající pokec." #: gajim/common/config.py:82 msgid "Time in minutes, after which your status changes to away." msgstr "Čas v minutách, po kterém se Váš stav přepne na pryč." #: gajim/common/config.py:83 msgid "$S (Away as a result of being idle more than $T min)" msgstr "$S (Pryč z důvodu nečinosti po více než $T minut)" # FIXME: asi blbe #: gajim/common/config.py:83 #, fuzzy msgid "$S will be replaced by current status message, $T by autoawaytime." msgstr "$S bude změněn na aktuální stav, čas: $T" #: gajim/common/config.py:85 msgid "Time in minutes, after which your status changes to not available." msgstr "Čas v minutách, po kterém se Váš stav přepne na nedostupný." #: gajim/common/config.py:86 msgid "$S (Not available as a result of being idle more than $T min)" msgstr "$S (Nedostupný z důvodu nečinosti po více než $T minut)" # FIXME: asi blbe #: gajim/common/config.py:86 #, fuzzy msgid "$S will be replaced by current status message, $T by autoxatime." msgstr "$S bude změněn na aktuální stav, čas: $T" #: gajim/common/config.py:89 #, fuzzy msgid "" "When to show notification area icon. Can be 'never', 'on_event', 'always'." msgstr "" "Kdy zobrazit ikonu v oznamovací oblasti. Může být jedno z nikdy='never', při " "události='on_event', vždy='always'." #: gajim/common/config.py:90 msgid "Allow to hide the roster window even if the tray icon is not shown." msgstr "" #: gajim/common/config.py:95 msgid "Incoming nickname color." msgstr "Barva příchozí přezdívky." #: gajim/common/config.py:96 msgid "Outgoing nickname color." msgstr "Barva odchozí přezdívky." #: gajim/common/config.py:97 msgid "Incoming text color." msgstr "Barva příchozího textu." #: gajim/common/config.py:98 msgid "Outgoing text color." msgstr "Barva odchozího textu." #: gajim/common/config.py:99 msgid "Status message text color." msgstr "Barva stavové zprávy." #: gajim/common/config.py:102 #, fuzzy msgid "Contact signed in notification color." msgstr "_Zobrazit událost v rosteru" #: gajim/common/config.py:103 #, fuzzy msgid "Contact signout notification color" msgstr "_Zobrazit událost v rosteru" #: gajim/common/config.py:104 #, fuzzy msgid "New message notification color." msgstr "Zobrazit náhled nové zprávy ve vyskakovacím okně?" #: gajim/common/config.py:105 #, fuzzy msgid "File transfer request notification color." msgstr "Požadavek přenosu souboru" #: gajim/common/config.py:106 #, fuzzy msgid "File transfer error notification color." msgstr "Přenos souboru zrušen" #: gajim/common/config.py:107 #, fuzzy msgid "File transfer complete or stopped notification color." msgstr "Zobraz upozornění, až bude přenos souboru dokončen" #: gajim/common/config.py:108 #, fuzzy msgid "Groupchat invitation notification color" msgstr "Skupinová pozvánka" #: gajim/common/config.py:109 #, fuzzy msgid "Background color of status changed notification" msgstr "Barva pozadí kontaktů, jež se zrovna přihlásili." #: gajim/common/config.py:110 msgid "Other dialogs color." msgstr "" #: gajim/common/config.py:111 msgid "Incoming nickname font." msgstr "Písmo příchozí přezdívky." #: gajim/common/config.py:112 msgid "Outgoing nickname font." msgstr "Písmo odchozí přezdívky." #: gajim/common/config.py:113 msgid "Incoming text font." msgstr "Písmo příchozího textu." #: gajim/common/config.py:114 msgid "Outgoing text font." msgstr "Písmo odchozího textu." #: gajim/common/config.py:115 msgid "Status message text font." msgstr "Písmo stavové zprávy." #: gajim/common/config.py:116 msgid "" "List (space separated) of rows (accounts and groups) that are collapsed." msgstr "" "Seznam (oddělené mezerami) řádků (účtů a skupin), které budou \"zhroucené\"." #: gajim/common/config.py:123 msgid "Language used by speller" msgstr "Jazyk použitý kontrolou pravopisu" #: gajim/common/config.py:124 msgid "" "'always' - print time for every message.\n" "'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" "'never' - never print time." msgstr "" "'vždy' - vypiš čas pro každou zprávu.\n" "'někdy' - vypiš čas každou print_ichat_every_foo_minutes minutu.\n" "'nikdy' - nevypisuj čas." #: gajim/common/config.py:125 msgid "" "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " "to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " "This is used only if print_time is 'sometimes'." msgstr "" "Vypiš čas v rozhovorech s použitím Fuzzy Clock. Hodnota náhodnosti je od 1 " "to 4, nebo 0 pro vypnutí Fuzzy Clock. 1 je nejpřesnější čas, 4 nejméně " "přesný. Toto se použije jenom při print_time nastaveném na 'někdy'." #: gajim/common/config.py:127 msgid "Enable ASCII emoticons" msgstr "" #: gajim/common/config.py:129 msgid "Treat * / _ pairs as possible formatting characters." msgstr "Ber * / _ páry jako možné formátovací znaky." #: gajim/common/config.py:130 msgid "" "If True, do not remove */_ . So *abc* will be bold but with * * not removed." msgstr "" "Pokud zapnuto, nemažte */_ . Potom *abc* bude tučně ale s * * neodstraněnými." #: gajim/common/config.py:133 msgid "" "Uses ReStructured text markup to send HTML, plus ascii formatting if " "selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" "restructuredtext.html (If you want to use this, install docutils)" msgstr "" "Pokud je vybráno, použije ReStructured text markup k odeslání HTML, navíc s " "ascii formátování. Pro syntaxi navštivte http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html (Pokud si to chcete prohlédnout, " "nainstalujte docutils)" #: gajim/common/config.py:142 msgid "" "Character to add after nickname when using nick completion (tab) in group " "chat." msgstr "" "Znak, který se přidá za přezdívku po použití doplňování jména tabulátorem v " "diskuzi." #: gajim/common/config.py:143 msgid "" "Character to propose to add after desired nickname when desired nickname is " "used by someone else in group chat." msgstr "" "Znak navržený pro přidání za zamýšlenou přezdívku, pokud už ji používá někdo " "jiný v diskuzi." #: gajim/common/config.py:165 msgid "" "If True, Gajim will save roster position when hiding roster, and restore it " "when showing roster." msgstr "" #: gajim/common/config.py:171 msgid "Place the roster on the right in single window mode" msgstr "" #: gajim/common/config.py:177 msgid "" "This option let you customize timestamp that is printed in conversation. For " "exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " "strftime for full documentation: http://docs.python.org/lib/module-time.html" msgstr "" "Tato volba umožní vlastní formátování času, který je zobrazován v " "rozhovorech. Například \"[%H:%M]\" zobrazí \"[hodina:minuta]\". Pro víc " "informací shlédněte dokumentaci pythonu funkce strftime na: http://docs." "python.org/lib/module-time.html" #: gajim/common/config.py:178 msgid "Characters that are printed before the nickname in conversations" msgstr "Znaky, které budou vypisovány před přezdívkou v rozhovorech" #: gajim/common/config.py:179 msgid "Characters that are printed after the nickname in conversations" msgstr "Znaky, které budou vypisovány za přezdívkou v rozhovorech" #: gajim/common/config.py:181 msgid "Add * and [n] in roster title?" msgstr "Přidat * a [n] k titulku Seznamu?" #: gajim/common/config.py:182 #, fuzzy msgid "" "How many history messages should be restored when a chat tab/window is " "reopened?" msgstr "" "Jak moc řádků si pamatovat z předchozího rozhovoru, když je okno/záložka " "rozhovoru znovu otevřena." #: gajim/common/config.py:183 msgid "How far back in time (minutes) history is restored. -1 means no limit." msgstr "" #: gajim/common/config.py:184 #, fuzzy msgid "" "How many lines to request from server when entering a groupchat. -1 means no " "limit" msgstr "Kolik řádek požadovat od serveru při připojení k diskuzi." #: gajim/common/config.py:185 #, fuzzy msgid "" "Minutes of backlog to request when entering a groupchat. -1 means no limit" msgstr "Kolik minut zpátky do historie při připojení k diskuzi." #: gajim/common/config.py:186 msgid "" "How many seconds to wait before trying to autorejoin to a conference you are " "being disconnected from. Set to 0 to disable autorejoining." msgstr "" "Kolik vteřin čekat před automatickým znovu vstoupením do diskuze, ze které " "jste odpojován(a). Nastavte na 0 pro vypnutí automatického znovu vstoupení." #: gajim/common/config.py:187 msgid "" "Should autorejoin be activated when we are being kicked from a conference?" msgstr "" #: gajim/common/config.py:188 msgid "" "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " "Client default behaviour)." msgstr "" "Odeslat zprávu při Ctrl+Enter a při Enter přejít na nový řádek (výchozí " "chování klienta Mirabilis ICQ)." #: gajim/common/config.py:190 msgid "How many lines to store for Ctrl+KeyUP." msgstr "Kolik řádků uložit pro Ctrl+Šipka nahoru." #: gajim/common/config.py:193 #, fuzzy, python-format msgid "" "Either custom url with %%s in it where %%s is the word/phrase or " "'WIKTIONARY' which means use wiktionary." msgstr "" "Buď vlastní url s %s v těle, kde %s je slovo nebo fráze, nebo 'WIKTIONARY', " "která znamená že se použije wiktionary." #: gajim/common/config.py:196 msgid "If checked, Gajim can be controlled remotely using gajim-remote." msgstr "Pokud zaškrtnuta, Gajim může být ovládán vzdáleně pomocí gajim-remote." #: gajim/common/config.py:197 msgid "" "Sent chat state notifications. Can be one of all, composing_only, disabled." msgstr "" "Odešílat události stavu rozhovoru. Může být pouze jediná, composing_only, " "vypnutá." #: gajim/common/config.py:198 msgid "" "Displayed chat state notifications in chat windows. Can be one of all, " "composing_only, disabled." msgstr "" "Zobraz stavy rozhovoru v okně rozhovoru. Může být jedno z all, " "composing_only nebo disabled." #: gajim/common/config.py:200 msgid "" "When not printing time for every message (print_time==sometimes), print it " "every x minutes." msgstr "" "Když nevypisuji čas pro každou zprávu (print_time=='někdy'), vypisuj ji " "každých x minut." #: gajim/common/config.py:201 msgid "Ask before closing a group chat tab/window." msgstr "Ptát se před zavřením oken/záložek diskuzí." #: gajim/common/config.py:202 #, fuzzy msgid "" "Always ask for confirmation before closing groupchats with any of the JIDs " "on this space separated list." msgstr "" "Vždy se ptát před zavřením oken/panelů diskuzí uvedených v tomto seznamu " "mezerami oddělením Jabber ID místností." #: gajim/common/config.py:203 #, fuzzy msgid "" "Never ask for confirmation before closing groupchats with any of the JIDs on " "this space separated list." msgstr "" "Nikdy se neptát před zavřením oken/záložek diskuzí uvedených v tomto seznamu " "mezerami oddělenými Jabber ID místností." #: gajim/common/config.py:204 #, fuzzy msgid "" "Ask before closing tabbed chat window if there are controls that can lose " "data (chat, private chat, groupchat that will not be minimized)" msgstr "" "Ptát se před zavřením okna s panely rozhovorů, jsou-li tam prvky, které " "mohou ztratit data (rozhovor, soukromý rozhovor, diskuze které nebudou " "minimalizovány)" #: gajim/common/config.py:207 msgid "" "Comma separated list of hosts that we send, in addition of local interfaces, " "for File Transfer in case of address translation/port forwarding." msgstr "" "Čárkami oddělený seznam počítačů kterým posíláme, navíc k lokálním síťovým " "rozhraním, pro přenos souborů v případě překladu adres nebo přesměrováním " "portů." #: gajim/common/config.py:209 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." msgstr "IEC standard říká KiB = 1024 bytů, KB = 1000 bytů." #: gajim/common/config.py:211 #, fuzzy msgid "Notify of events in the notification area." msgstr "Upozorni na události v systémovém trayi." #: gajim/common/config.py:212 msgid "" "If False, Gajim will display a static event icon instead of the blinking " "status icon in the notification area when notifying on event." msgstr "" #: gajim/common/config.py:218 msgid "Show tab when only one conversation?" msgstr "Zobrazit záložku při jediném rozhovoru?" #: gajim/common/config.py:219 msgid "Show tabbed notebook border in chat windows?" msgstr "Zobrazit okraj panelu v oknech rozhovorů?" #: gajim/common/config.py:220 msgid "Show close button in tab?" msgstr "Zobrazit tlačitko zavřít v záložce?" #: gajim/common/config.py:221 msgid "" "A list of modp groups to use in a Diffie-Hellman, highest preference first, " "separated by commas. Valid groups are 1, 2, 5, 14, 15, 16, 17 and 18. Higher " "numbers are more secure, but take longer to calculate when you start a " "session." msgstr "" "Seznam modp skupin pro použití s Diffie-Hellman, první jsou nejvyšší, " "oddělené čárkami. Povolené skupiny jsou 1, 2, 5, 14, 15, 16, 17 a 18. Vyšší " "čísla jsou více bezpečná, ale vyžadují delší dobu výpočtu při startu sezení." #: gajim/common/config.py:234 msgid "Preview new messages in notification popup?" msgstr "Zobrazit náhled nové zprávy ve vyskakovacím okně?" #: gajim/common/config.py:237 msgid "" "A semicolon-separated list of words that will be highlighted in group chats." msgstr "Středníkem oddělený seznam slov, které budou zvýrazněny v diskuzích." #: gajim/common/config.py:238 #, fuzzy msgid "" "If True, quits Gajim when X button of Window Manager is clicked. This " "setting is taken into account only if notification icon is used." msgstr "" "Pokud zapnuto, ukonči Gajim když bude stisknuto tlačítko X v titulku okna. " "Toto nastavení se použije pouze tehdy, pokud je použita ikona v trayi." #: gajim/common/config.py:239 msgid "" "If True, Gajim hides the Roster window on pressing the X button instead of " "minimizing into the Dock." msgstr "" #: gajim/common/config.py:240 msgid "" "If True, Gajim will display an icon on each tab containing unread messages. " "Depending on the theme, this icon may be animated." msgstr "" "Pokud zapnuto, Gajim zobrazí ikonu v každé záložce obsahující nepřečtené " "zprávy. V závislosti na tématu, tato ikona může být animovaná." #: gajim/common/config.py:241 msgid "" "If True, Gajim will display the status message, if not empty, for every " "contact under the contact name in roster window." msgstr "" "Pokud zapnuto, Gajim zobrazí popis stavu, pokud není prázdný, pro každý " "kontakt pod jménem v okně Seznamu." #: gajim/common/config.py:247 msgid "Define the position of the avatar in roster. Can be left or right" msgstr "Nastavení pozice avatara v rosteru. Může být vlevo nebo vpravo" #: gajim/common/config.py:248 msgid "" "If False, Gajim will no longer print status line in chats when a contact " "changes his or her status and/or his or her status message." msgstr "" "Pokud vypnuto, Gajim nebude zobrazovat stavové řádky v rozhovorech, když " "kontakt změní jeho stav a/nebo jeho stavovou zprávu." #: gajim/common/config.py:249 #, fuzzy msgid "" "Can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " "longer print status line in groupchats when a member changes his or her " "status and/or his or her status message. If \"all\" Gajim will print all " "status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " "group chat." msgstr "" "může být \"none\", \"all\", \"in_and_out\". Pokud je \"none\", Gajim nebude " "nadále vypisovat stavy v diskuzích když účastník změní svůj stav nebo " "stavovou zprávu. Pokud je \"all\", Gajim bude vypisovat všechny změny stavů. " "Při \"in_and_out\" Gajim vypíše stav jenom při vstupu a odchodu z místnosti." #: gajim/common/config.py:251 msgid "Log XHTML messages instead of plain text messages." msgstr "" #: gajim/common/config.py:252 msgid "Background color of contacts when they just signed in." msgstr "Barva pozadí kontaktů, jež se zrovna přihlásili." #: gajim/common/config.py:253 msgid "Background color of contacts when they just signed out." msgstr "Barva pozadí kontaktů, jež se přávě odhlásili." #: gajim/common/config.py:255 msgid "" "If True, restored messages will use a smaller font than the default one." msgstr "" "Pokud je povoleno, minulé zprávy budou vypsány menším písmem, než je výchozí." #: gajim/common/config.py:256 msgid "Don't show avatar for the transport itself." msgstr "Nezobrazuj avatara pro transport samotný." #: gajim/common/config.py:257 msgid "Don't show roster in the system taskbar." msgstr "Nezobrazuj roster v liště úloh." #: gajim/common/config.py:258 msgid "" "If True and installed GTK+ and PyGTK versions are at least 2.8, make the " "window flash (the default behaviour in most Window Managers) when holding " "pending events." msgstr "" "Pokud je True a instalované GTK+ a PyGTK verze jsou alespoň 2.8, blikej " "oknem (výchozí chování ve většině Window Managerů) pokud čekají nové " "události." #: gajim/common/config.py:260 msgid "" "Jabberd1.4 does not like sha info when one join a password protected group " "chat. Turn this option to False to stop sending sha info in group chat " "presences." msgstr "" "Jabberd1.4 nemá rád sha informaci, pokud někdo vstupuje do místnosti " "chráněné heslem. Zaškrtněte tuto volbu na False, aby se sha informace " "neposílala v presenci u diskuzí." #: gajim/common/config.py:263 #, fuzzy msgid "" "Controls the window where new messages are placed.\n" "'always' - All messages are sent to a single window.\n" "'always_with_roster' - Like 'always' but the messages are in a single window " "along with the roster.\n" "'never' - All messages get their own window.\n" "'peracct' - Messages for each account are sent to a specific window.\n" "'pertype' - Each message type (e.g. chats vs. groupchats) is sent to a " "specific window." msgstr "" "Řídí okno, kam budou doručeny nové zprávy.\n" "'vždy' - Všechny zprávy jsou odeslány do jediného okna.\n" "'nikdy' - Všechny zprávy dostanou svoje vlastní okno.\n" "'peracct' - Zprávy pro každý účet jsou doručeny do zvláštních oken.\n" "'pertype' - Každý typ zprávy (např. rohovor vs diskuze) jsou odeslány do " "zvláštního okna. Vězte, že změna této volby vyžaduje restartování Gajimu, " "aby se projevila" #: gajim/common/config.py:264 msgid "" "Show roster on startup.\n" "'always' - Always show roster.\n" "'never' - Never show roster.\n" "'last_state' - Restore the last state roster." msgstr "" #: gajim/common/config.py:265 msgid "If False, you will no longer see the avatar in the chat window." msgstr "Pokud je False, nebudete nadále vidět avatary v okně rozhovoru" #: gajim/common/config.py:266 msgid "If True, pressing the escape key closes a tab/window." msgstr "Pokud je True, stiskem escape zavřete panel nebo okno" #: gajim/common/config.py:267 msgid "Hides the banner in a group chat window" msgstr "Skryje nadpis v okně diskuze" #: gajim/common/config.py:268 msgid "Hides the banner in two persons chat window" msgstr "Skryje nadpis v okně rozhovoru dvou lidí" #: gajim/common/config.py:269 msgid "Hides the group chat occupants list in group chat window." msgstr "Skryje seznam lidí místnosti v okně diskuze." #: gajim/common/config.py:270 msgid "" "In a chat, show the nickname at the beginning of a line only when it's not " "the same person talking than in previous message." msgstr "" "V rozhovoru zobraz přezdívku na začátku řádku pouze v případě, když to není " "stejný člověk, jako v předchozí zprávě." # FIXME: netusim co to je... najit #: gajim/common/config.py:271 msgid "Indentation when using merge consecutive nickname." msgstr "Odsazení při použítí spojení po sobě jdoucích přezdívek." #: gajim/common/config.py:272 msgid "" "List of colors, separated by \":\", that will be used to color nicknames in " "group chats." msgstr "" "Seznam barev, oddělený pomocí \":\", použitý k obarvení přezdívek v " "diskuzích." #: gajim/common/config.py:273 msgid "Ctrl-Tab go to next composing tab when none is unread." msgstr "Ctrl-Tab jde na další rozepsanou záložku, když žádný není nepřečtená." #: gajim/common/config.py:274 msgid "" "Should we show the confirm metacontacts creation dialog or not? Empty string " "means we never show the dialog." msgstr "" "Mám zobrazit dialog vytvoření metakontaktu nebo ne? Prázdný řetezec znamená " "nikdy nezobrazovat dialog." #: gajim/common/config.py:275 msgid "" "Should we show the confirm block contact dialog or not? Empty string means " "we never show the dialog." msgstr "" "Mám zobrazit dialog potvrzení blokace, nebo ne? Prázdný řetezec znamená " "nikdy nezobrazovat dialog." #: gajim/common/config.py:276 msgid "" "Should we show the confirm custom status dialog or not? Empty string means " "we never show the dialog." msgstr "" "Mám zobrazit dialog vlastního stavu nebo ne? Prázdný řetezec znamená nikdy " "nezobrazovat dialog." #: gajim/common/config.py:277 msgid "" "If True, you will be able to set a negative priority to your account in " "account modification window. BE CAREFUL, when you are logged in with a " "negative priority, you will NOT receive any message from your server." msgstr "" "Je-li povoleno, bude možné použít zápornou prioritu účtu v okně úprava účtu. " "BUĎ OPATRNÝ, když jsi přihlášen se zápornou prioritou, nedostaneš od serveru " "žádnou zprávu." #: gajim/common/config.py:278 msgid "" "If True, Gajim will show number of online and total contacts in account and " "group rows." msgstr "" "Je-li povoleno, Gajim zobrazí počet dostupných a všech kontaktů v účtu a u " "řádků skupin." #: gajim/common/config.py:279 msgid "" "Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " "as if they were of this type" msgstr "" "Může být prázdný, 'chat' nebo 'message'. Není-lí prázdné, považuj všechny " "příchozí zprávy jako uvedený typ" #: gajim/common/config.py:280 msgid "" "If True, Gajim will scroll and select the contact who sent you the last " "message, if chat window is not already opened." msgstr "" "Je-li povoleno, Gajim bude posune a vybere kontakt, který vám poslal " "poslední zprávu, pokud již okno rozhovoru není otevřené." #: gajim/common/config.py:281 msgid "Time of inactivity needed before the change status window closes down." msgstr "Čas neaktivity před zavřením okna změny stavu." #: gajim/common/config.py:282 msgid "" "Maximum number of lines that are printed in conversations. Oldest lines are " "cleared." msgstr "" "Maximální počet řádků, které se vypíší v konverzacích. Nejstarší řádky jsou " "smazány." #: gajim/common/config.py:283 #, fuzzy msgid "" "If True, notification windows from notification-daemon will be attached to " "notification icon." msgstr "" "Je-li povoleno, Upozorňovací démon přidá upozornění do systémové lišty." #: gajim/common/config.py:284 msgid "Choose interval between 2 checks of idleness." msgstr "Vyberte interval mezi dvěma stavy nečinnosti." #: gajim/common/config.py:285 msgid "" "Valid uri schemes. Only schemes in this list will be accepted as \"real\" " "uri. (mailto and xmpp are handled separately)" msgstr "" "Platná uri schémata. Pouze schémata v tomto seznamu budou akceptována jako " "\"skutečné\" URI. (mailto a xmpp jsou obsluhovány zvlášť)" #: gajim/common/config.py:286 msgid "If True, completion in groupchats will be like a shell auto-completion" msgstr "" "Je-li True, doplňování přezdívek v diskuzích bude porobné doplňování shellu" #: gajim/common/config.py:287 msgid "" "When is self contact row displayed. Can be \"always\", \"when_other_resource" "\" or \"never\"" msgstr "" "Kdy bude zobrazena řádka vlastního kontaktu. Může být \"always\", " "\"when_other_resource\" nebo \"never\"" #: gajim/common/config.py:292 msgid "Optionally fix jingle output video framerate. Example: 10/1 or 25/2" msgstr "" #: gajim/common/config.py:293 msgid "Optionally resize jingle output video. Example: 320x240" msgstr "" #: gajim/common/config.py:294 msgid "If True, You will also see your webcam" msgstr "" #: gajim/common/config.py:297 msgid "" "If True, Gajim will try to use a STUN server when using Jingle. The one in " "\"stun_server\" option, or the one given by the XMPP server." msgstr "" #: gajim/common/config.py:298 msgid "STUN server to use when using Jingle" msgstr "" #: gajim/common/config.py:299 msgid "" "If True, Gajim will show affiliation of groupchat occupants by adding a " "colored square to the status icon" msgstr "" #: gajim/common/config.py:300 msgid "" "Proxy used for all outgoing connections if the account does not have a " "specific proxy configured" msgstr "" #: gajim/common/config.py:301 msgid "If True, Gajim will ignore incoming attention requestd (\"wizz\")." msgstr "" #: gajim/common/config.py:302 msgid "" "If enabled, Gajim will reopen chat windows that were opened last time Gajim " "was closed." msgstr "" #: gajim/common/config.py:303 #, fuzzy msgid "" "If enabled, Gajim will show an icon to show that sent message has been " "received by your contact" msgstr "" "Pokud zaškrtnuto, Gajim se nebude pokáždé ptát na zprávu stavu. Místo toho " "použije výchozí nadefinovanou zprávu." #: gajim/common/config.py:304 msgid "Show a mini avatar in chat window tabs and in window icon" msgstr "" #: gajim/common/config.py:305 #, fuzzy msgid "If True, Gajim will use the Systems Keyring to store account passwords." msgstr "" "Je-li povoleno, Gajim použije Gnome Keyring (je-li dostupný) k uložení hesel " "k účtům." #: gajim/common/config.py:306 msgid "Sets the encoding used by python-gnupg" msgstr "" #: gajim/common/config.py:307 msgid "If True, Gajim will execute XEP-0146 Commands." msgstr "" #: gajim/common/config.py:308 msgid "All non-compliant MAM Groupchats" msgstr "" #: gajim/common/config.py:324 msgid "" "Priority will change automatically according to your status. Priorities are " "defined in autopriority_* options." msgstr "" "Priorita se změní automaticky podle tvého stavu. Priority jsou definovány v " "nastavení jako položky autopriority_*." #: gajim/common/config.py:332 msgid "" "Status used to autoconnect as. Can be online, chat, away, xa, dnd, " "invisible. NOTE: this option is used only if restore_last_status is disabled" msgstr "" "Stav použitý při auto-připojení. Může být 'připojen', 'ukecaný', 'pryč', " "'nedostupný', 'nerušit', 'neviditelný'. POZNÁMKA: toto nastavení může být " "použito pouze pokud restore_last_status je vypnutý" #: gajim/common/config.py:333 msgid "If enabled, restore the last status that was used." msgstr "Je-li povoleno, nastaví se vždy poslední použitý stav." #: gajim/common/config.py:335 msgid "" "If True, Contacts requesting authorization will be automatically accepted." msgstr "Je-li True, kontakty požadující autorizaci budou automaticky přijaty." #: gajim/common/config.py:336 msgid "" "If False, this account will be disabled and will not appear in roster window." msgstr "" "Pokud je False, účet bude deaktivován a nebude zobrazen v okně rosteru." #: gajim/common/config.py:339 msgid "" "If disabled, don't sign presences with GPG key, even if GPG is configured." msgstr "" "Je-li zakázáno, spojení nebude podepsané GPG klíčem, pokud je GPG klíč " "nastavený." #: gajim/common/config.py:341 msgid "Enable ESessions encryption for this account." msgstr "Povolit ESessions šifrování pro tento účet." #: gajim/common/config.py:342 msgid "Should Gajim automatically start an encrypted session when possible?" msgstr "Má se Gajim automaticky připojovat šifrovaným spojením je-li to možné?" #: gajim/common/config.py:343 msgid "Allow plaintext connections" msgstr "" #: gajim/common/config.py:346 msgid "" "List (space separated) of authentication mechanisms to try. Can contain " "ANONYMOUS, EXTERNAL, GSSAPI, SCRAM-SHA-1-PLUS, SCRAM-SHA-1, DIGEST-MD5, " "PLAIN, X-MESSENGER-OAUTH2 or XEP-0078" msgstr "" #: gajim/common/config.py:347 #, fuzzy msgid "" "Show a warning dialog before sending password on an plaintext connection. " "Can be 'warn', 'connect', 'disconnect'" msgstr "Zobrazit varování před odesláním hesla přes nezabezpečené spojení." #: gajim/common/config.py:348 msgid "Show a warning dialog before using standard SSL library." msgstr "Zobrazit varování před použitím standartní SSL knihovny." #: gajim/common/config.py:349 #, fuzzy msgid "" "Show a warning dialog before sending PLAIN password over a plain connection." msgstr "Zobrazit varování před odesláním hesla přes nezabezpečené spojení." #: gajim/common/config.py:352 msgid "Space separated list of ssl errors to ignore." msgstr "Mezerami oddělovaný seznam ssl chyb, které se mají ignorovat." #: gajim/common/config.py:358 msgid "" "Space separated list of JIDs for which you do not want to store logs. You " "can also add account name to log nothing for this account." msgstr "" #: gajim/common/config.py:359 msgid "" "On startup, Gajim will download logs stored on server, provided the server " "supports XEP-0313" msgstr "" #: gajim/common/config.py:360 msgid "" "Space separated list of JIDs for which you accept to not log conversations " "if he does not want to." msgstr "" #: gajim/common/config.py:363 msgid "Whitespace sent after inactivity" msgstr "Při neaktivitě odeslán bílý znak" #: gajim/common/config.py:364 msgid "XMPP ping sent after inactivity" msgstr "XMPP ping zaslán při neaktivitě" #: gajim/common/config.py:368 #, fuzzy msgid "" "How many seconds to wait for the answer of ping alive packet before we try " "to reconnect?" msgstr "" "Kolik sekund se má čekat na odpověď pingu před tím, než se znovu pokusit o " "připojení." #: gajim/common/config.py:372 msgid "Jabberd2 workaround" msgstr "Jabberd2 workaround" #: gajim/common/config.py:375 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." msgstr "" "Pokud je zaškrtnuto, Gajim použije Vaší IP a proxy servery definované ve " "volbě pro přenos souborů file_transfer_proxies." #: gajim/common/config.py:376 msgid "" "If True, Gajim will test file transfer proxies on startup to be sure it " "works. Openfire's proxies are known to fail this test even if they work." msgstr "" #: gajim/common/config.py:389 msgid "Answer to receipt requests" msgstr "Odpověď na doručení žádosti" #: gajim/common/config.py:390 msgid "Sent receipt requests" msgstr "Poslat žádost" #: gajim/common/config.py:399 #, fuzzy msgid "" "Allow Gajim to send information about the operating system you are running." msgstr "Pokud je zaškrtnuto, Gajim se připojí do této místnosti při spuštění" #: gajim/common/config.py:400 #, fuzzy msgid "Allow Gajim to send your local time." msgstr "%s Vám chce poslat soubor." #: gajim/common/config.py:401 msgid "" "When negotiating an encrypted session, should Gajim assume you want your " "messages to be logged?" msgstr "" "Pokud sestavuji šifrované sezení, má Gajim přepokládat povolení " "zaznamenávání zpráv?" #: gajim/common/config.py:404 #, fuzzy msgid "Message that is sent to contacts you want to add" msgstr "Prosím vyplňte údaje o kontaktu, který chcete přidat" #: gajim/common/config.py:405 msgid "" "If enabled and if server supports this feature, Gajim will receive messages " "sent and received by other resources." msgstr "" #: gajim/common/config.py:406 msgid "" "If enabled, Gajim will send your local IPs so your contact can connect to " "your machine to transfer files." msgstr "" #: gajim/common/config.py:407 #, fuzzy msgid "Latest token for OAuth 2.0 authentication." msgstr "Anonymní autentizace" #: gajim/common/config.py:408 #, fuzzy msgid "client_id for OAuth 2.0 authentication." msgstr "Anon_ymní autentizace" #: gajim/common/config.py:409 #, fuzzy msgid "redirect_url for OAuth 2.0 authentication." msgstr "Anon_ymní autentizace" #: gajim/common/config.py:410 msgid "" "Space separated list of JIDs for which we want to re-open a chat window on " "next startup." msgstr "" #: gajim/common/config.py:412 msgid "HTTP Upload: Enable HTTPS Verification" msgstr "" #: gajim/common/config.py:413 msgid "" "Preferred file transfer mechanism for file drag&drop on chat window. Can be " "'httpupload' (default) or 'jingle'" msgstr "" #: gajim/common/config.py:476 gajim/common/config.py:481 msgid "Language for which we want to check misspelled words" msgstr "Jazyk, pro který chcete kontrolovat překlepy ve slovech" #: gajim/common/config.py:478 msgid "The currently active encryption for that contact" msgstr "" #: gajim/common/config.py:482 #, fuzzy msgid "" "How many lines to request from server when entering a groupchat. -1 means no " "limit, -2 means global value" msgstr "Kolik řádek požadovat od serveru při připojení k diskuzi." #: gajim/common/config.py:483 #, fuzzy msgid "" "Minutes of backlog to request when entering a groupchat. -1 means no limit, " "-2 means global value" msgstr "Kolik minut zpátky do historie při připojení k diskuzi." #: gajim/common/config.py:484 msgid "State whether we want a notification for every message in this room" msgstr "" #: gajim/common/config.py:487 msgid "" "State whether plugins should be activated on startup (this is saved on Gajim " "exit). This option SHOULD NOT be used to (de)activate plug-ins. Use GUI " "instead." msgstr "" #: gajim/common/config.py:492 gajim/common/pep.py:157 msgid "Sleeping" msgstr "Spím" #: gajim/common/config.py:493 msgid "Back soon" msgstr "Hned jsem zpět" #: gajim/common/config.py:493 msgid "Back in some minutes." msgstr "Jsem zpátky za pár minut." #: gajim/common/config.py:494 gajim/common/pep.py:127 msgid "Eating" msgstr "Jím" #: gajim/common/config.py:494 msgid "I'm eating, so leave me a message." msgstr "Právě jím, prosím zanechte mi zprávu." #: gajim/common/config.py:495 msgid "Movie" msgstr "Film" #: gajim/common/config.py:495 msgid "I'm watching a movie." msgstr "Dívám se na film." #: gajim/common/config.py:496 gajim/common/pep.py:186 msgid "Working" msgstr "Pracuji" #: gajim/common/config.py:496 msgid "I'm working." msgstr "Právě pracuji." #: gajim/common/config.py:497 msgid "Phone" msgstr "Telefon" #: gajim/common/config.py:497 msgid "I'm on the phone." msgstr "Zrovna telefonuji." #: gajim/common/config.py:498 msgid "Out" msgstr "Venku" #: gajim/common/config.py:498 msgid "I'm out enjoying life." msgstr "Užívám si života venku." #: gajim/common/config.py:509 msgid "I'm available." msgstr "Jsem dostupný." #: gajim/common/config.py:510 msgid "I'm free for chat." msgstr "Hledám někoho na pokec." #: gajim/common/config.py:512 msgid "I'm not available." msgstr "Nejsem dostupný." #: gajim/common/config.py:513 msgid "Do not disturb." msgstr "Nerušit." #: gajim/common/config.py:514 gajim/common/config.py:515 msgid "Bye!" msgstr "Zdar!" #: gajim/common/config.py:526 msgid "" "Sound to play when a group chat message contains one of the words in " "muc_highlight_words, or when a group chat message contains your nickname." msgstr "" "Zvuk, který bude přehrán, pokud zpráva diskuze obsahuje jedno ze slov v " "muc_highlight_words, nebo když obsahuje Vaši přezdívku." #: gajim/common/config.py:527 msgid "Sound to play when any MUC message arrives." msgstr "Přehraný zvuk při příchodu jakékoliv MUC zprávy." #: gajim/common/config.py:535 gajim/common/optparser.py:357 msgid "green" msgstr "zelený" #: gajim/common/config.py:539 gajim/common/optparser.py:343 msgid "grocery" msgstr "potraviny" #: gajim/common/config.py:543 msgid "human" msgstr "člověk" #: gajim/common/config.py:547 msgid "marine" msgstr "mariňák" #: gajim/common/config.py:554 #, fuzzy msgid "Tor" msgstr "Příjemce" #: gajim/common/commands.py:86 msgid "Change status information" msgstr "Informace o změně stavu" #: gajim/common/commands.py:108 msgid "Change status" msgstr "Změnit stav" #: gajim/common/commands.py:109 msgid "Set the presence type and description" msgstr "Nastav typ přítomnosti a popisek" #: gajim/common/commands.py:115 msgid "Free for chat" msgstr "Ukecaný" #: gajim/common/commands.py:116 msgid "Online" msgstr "Připojen" #: gajim/common/commands.py:118 msgid "Extended away" msgstr "Dlouho pryč" #: gajim/common/commands.py:119 msgid "Do not disturb" msgstr "Nerušit" #: gajim/common/commands.py:120 msgid "Offline - disconnect" msgstr "Odpojený - odpojit" #: gajim/common/commands.py:125 msgid "Presence description:" msgstr "Popis stavu: " #: gajim/common/commands.py:160 gajim/common/commands.py:343 msgid "The status has been changed." msgstr "Stav se změnil." #: gajim/common/commands.py:192 gajim/common/commands.py:225 msgid "Leave Groupchats" msgstr "Opustit diskuzi" #: gajim/common/commands.py:215 #, python-format msgid "%(nickname)s on %(room_jid)s" msgstr "%(nickname)s v %(room_jid)s" #: gajim/common/commands.py:219 msgid "You have not joined a groupchat." msgstr "Nepřipojil jsi se k diskuzi." #: gajim/common/commands.py:226 msgid "Choose the groupchats you want to leave" msgstr "Vyber diskuze, které chceš opustit" #: gajim/common/commands.py:271 msgid "You left the following groupchats:" msgstr "Opustil(a) jste následující diskuze:" #: gajim/common/commands.py:283 msgid "Forward unread messages" msgstr "Přeposlat nepřečtené zprávy" #: gajim/common/commands.py:310 msgid "All unread messages have been forwarded." msgstr "Všechny nepřečtené zprávy byly přeposlány." #: gajim/common/commands.py:318 #, fuzzy msgid "Forward unread message then disconnect" msgstr "Přeposlat nepřečtené zprávy" #: gajim/common/httpupload.py:137 msgid "File is empty" msgstr "Soubor je prázdný" #: gajim/common/httpupload.py:140 msgid "File does not exist" msgstr "Soubor neexistuje" #: gajim/common/httpupload.py:147 gajim/common/httpupload.py:204 #, python-format msgid "File is too large, maximum allowed file size is: %s" msgstr "" #: gajim/common/check_paths.py:37 msgid "creating logs database" msgstr "vytvářím databázi historie" #: gajim/common/check_paths.py:98 #, fuzzy msgid "creating cache database" msgstr "vytvářím databázi historie" #: gajim/common/check_paths.py:261 #, fuzzy, python-format msgid "moving %(src)s to %(dst)s" msgstr "Odeslat %s %s" #: gajim/common/check_paths.py:287 gajim/common/check_paths.py:294 #: gajim/common/check_paths.py:301 gajim/common/check_paths.py:308 #: gajim/common/check_paths.py:315 gajim/common/check_paths.py:322 #: gajim/common/check_paths.py:329 gajim/common/check_paths.py:336 #, python-format msgid "%s is a file but it should be a directory" msgstr "%s je soubor, ale měl by být adresář" #: gajim/common/check_paths.py:288 gajim/common/check_paths.py:295 #: gajim/common/check_paths.py:302 gajim/common/check_paths.py:309 #: gajim/common/check_paths.py:316 gajim/common/check_paths.py:323 #: gajim/common/check_paths.py:330 gajim/common/check_paths.py:337 #: gajim/common/check_paths.py:349 gajim/common/check_paths.py:357 msgid "Gajim will now exit" msgstr "Gajim se nyní ukončí" #: gajim/common/check_paths.py:348 gajim/common/check_paths.py:356 #, python-format msgid "%s is a directory but should be a file" msgstr "%s je adresář, ale měl by to být soubor" #: gajim/common/optparser.py:55 #, python-format msgid "Error: cannot open %s for reading" msgstr "Chyba: nemůžu otevřít %s pro čtení" #: gajim/common/optparser.py:352 gajim/common/optparser.py:353 msgid "cyan" msgstr "azurová" #: gajim/common/optparser.py:421 msgid "migrating logs database to indices" msgstr "převádím záznamy historie k použítí indexů" #: gajim/common/logging_helpers.py:34 #, python-format msgid "%s is not a valid loglevel" msgstr "%s není platný loglevel" #: gajim/common/connection.py:83 msgid "Unable to get issuer certificate" msgstr "Nepodařilo se získat certifikát vydavatele" #: gajim/common/connection.py:84 msgid "Unable to get certificate CRL" msgstr "Nepodařilo se získat certifikát CRL" #: gajim/common/connection.py:85 msgid "Unable to decrypt certificate's signature" msgstr "Nepodařilo se dešifrovat podpis certifikátu" #: gajim/common/connection.py:86 msgid "Unable to decrypt CRL's signature" msgstr "Nepodařilo se dešifrovat podpis CRL certifikátu" #: gajim/common/connection.py:87 msgid "Unable to decode issuer public key" msgstr "Nepodařilo se dešifrovat veřejný klíč vydavatele" #: gajim/common/connection.py:88 msgid "Certificate signature failure" msgstr "Chyba podpisu certifikátu" #: gajim/common/connection.py:89 msgid "CRL signature failure" msgstr "Chyba podpisu CRL certifikátu" #: gajim/common/connection.py:90 msgid "Certificate is not yet valid" msgstr "Certifikát není správný" #: gajim/common/connection.py:91 msgid "Certificate has expired" msgstr "Platnost certifikátu vypršela" #: gajim/common/connection.py:92 msgid "CRL is not yet valid" msgstr "CRL certifikát není správný" #: gajim/common/connection.py:93 msgid "CRL has expired" msgstr "Platnost CRL certifikátu vypršela" #: gajim/common/connection.py:94 msgid "Format error in certificate's notBefore field" msgstr "Chyba certifikátu v poli: platnost před" #: gajim/common/connection.py:95 msgid "Format error in certificate's notAfter field" msgstr "Chyba certifikátu v poli: platnost po" #: gajim/common/connection.py:96 msgid "Format error in CRL's lastUpdate field" msgstr "Chyba CRL certifikátu v poli: poslední aktualizace" #: gajim/common/connection.py:97 msgid "Format error in CRL's nextUpdate field" msgstr "Chyba CRL certifikátu v poli: příští aktualizace" #: gajim/common/connection.py:98 msgid "Out of memory" msgstr "Nedostatek paměti" #: gajim/common/connection.py:99 msgid "Self signed certificate" msgstr "Sám sebou podepsaný certifikát" #: gajim/common/connection.py:100 msgid "Self signed certificate in certificate chain" msgstr "Sám sebou podepsaný certifikát v certifikačním řetězci " #: gajim/common/connection.py:101 msgid "Unable to get local issuer certificate" msgstr "Nepodařilo se získat certifikát lokálního vydavatele" #: gajim/common/connection.py:102 msgid "Unable to verify the first certificate" msgstr "Nepodařilo se ověřit první certifikát" #: gajim/common/connection.py:103 msgid "Certificate chain too long" msgstr "Certifikační řetězec je přiliš dlouhý" #: gajim/common/connection.py:104 msgid "Certificate revoked" msgstr "Certifikát je zrušený" #: gajim/common/connection.py:105 msgid "Invalid CA certificate" msgstr "Neplatný CA certifikát" #: gajim/common/connection.py:106 msgid "Path length constraint exceeded" msgstr "Překročena delká cesty" #: gajim/common/connection.py:107 msgid "Unsupported certificate purpose" msgstr "Nepodporované osvědčení certifikátu" #: gajim/common/connection.py:108 msgid "Certificate not trusted" msgstr "Certifikát je nedůvěryhodný" #: gajim/common/connection.py:109 msgid "Certificate rejected" msgstr "Certifikát odmítnut" #: gajim/common/connection.py:110 msgid "Subject issuer mismatch" msgstr "Neshoduje se název vydavatele" #: gajim/common/connection.py:111 msgid "Authority and subject key identifier mismatch" msgstr "Název klíče se neshoduje s Autoritou" #: gajim/common/connection.py:112 msgid "Authority and issuer serial number mismatch" msgstr "Vydavatelovo sériové číslo se neshoduje s Autoritou" #: gajim/common/connection.py:113 msgid "Key usage does not include certificate signing" msgstr "Použítý klíč neobsahuje podpis certifikátu" #: gajim/common/connection.py:114 msgid "Application verification failure" msgstr "Ověřování aplikace skončilo neúspěchem" #: gajim/common/connection.py:876 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Spojení s účtem \"%s\" bylo ztraceno" #: gajim/common/connection.py:877 msgid "Reconnect manually." msgstr "Znovu připojit ručně." #: gajim/common/connection.py:888 #, fuzzy, python-format msgid "Server %(name)s answered wrongly to register request: %(error)s" msgstr "Server %s odpověděl chybně na požadavek regisrace: %s" #: gajim/common/connection.py:930 #, python-format msgid "Server %s provided a different registration form" msgstr "Server %s poskytnul rozdílný registrační formulář" #: gajim/common/connection.py:1283 #, fuzzy, python-format msgid "Could not connect to \"%(host)s\" via proxy \"%(proxy)s\"" msgstr "Nemůžu se připojit k \"%s\"" #: gajim/common/connection.py:1286 #, fuzzy, python-format msgid "Could not connect to \"%(host)s\"" msgstr "Nemůžu se připojit k \"%s\"" #: gajim/common/connection.py:1293 #, python-format msgid "Server replied: %s" msgstr "Server odpověděl: %s" #: gajim/common/connection.py:1308 msgid "Connection to proxy failed" msgstr "Spojení s proxy selhalo" #: gajim/common/connection.py:1346 gajim/common/connection.py:1449 #, python-format msgid "Could not connect to account %s" msgstr "Selhalo připojení k účti %s" #: gajim/common/connection.py:1347 gajim/common/connection.py:1450 #, python-format msgid "Connection with account %s has been lost. Retry connecting." msgstr "Spojení s účtem %s bylo ztraceno. Opět se připojte." #: gajim/common/connection.py:1372 #, fuzzy, python-format msgid "The authenticity of the %s certificate could be invalid" msgstr "Autentizace certifikátu %s je neplatná." #: gajim/common/connection.py:1375 #, python-format msgid "" "\n" "SSL Error: %s" msgstr "" "\n" "SSL Error: %s" #: gajim/common/connection.py:1377 #, python-format msgid "" "\n" "Unknown SSL error: %d" msgstr "" "\n" "Neznámá SSL chyba: %d" #: gajim/common/connection.py:1423 #, fuzzy, python-format msgid "" "The authenticity of the %s certificate could be invalid.\n" "The certificate does not cover this domain." msgstr "Autentizace certifikátu %s je neplatná." #: gajim/common/connection.py:1473 gajim/common/connection.py:2238 #: gajim/common/zeroconf/connection_zeroconf.py:192 #, python-format msgid "Could not connect to \"%s\"" msgstr "Nemůžu se připojit k \"%s\"" #: gajim/common/connection.py:1512 #, python-format msgid "Authentication failed with \"%s\"" msgstr "Autentizace selhala s \"%s\"" #: gajim/common/connection.py:1513 msgid "Please check your login and password for correctness." msgstr "Prosím zkontrolujte správnost jména a hesla." #: gajim/common/connection.py:2097 #, fuzzy, python-format msgid "Sent contact: \"%(jid)s\" (%(name)s)" msgstr "Odeslán kontakt: \"%s\" (%s)" #: gajim/common/connection.py:2101 msgid "Sent contacts:" msgstr "Odeslány kontakty:" #: gajim/common/connection.py:2255 gajim/common/connection.py:2277 msgid "Not fetched because of invisible status" msgstr "Nestáhnuto z důvodu stavu neviditelnosti" #: gajim/common/dbus_support.py:44 msgid "D-Bus python bindings are missing in this computer" msgstr "D-Bus python bindings chybí na tomto počítači" #: gajim/common/dbus_support.py:45 gajim/common/dbus_support.py:56 msgid "D-Bus capabilities of Gajim cannot be used" msgstr "Možnosti D-Bus nemohou být použity" #: gajim/common/dbus_support.py:55 msgid "D-Bus does not run correctly on this machine" msgstr "na tomto stroji neběží D-Bus korektně" #: gajim/common/dbus_support.py:58 #, fuzzy msgid "D-Bus does not run correctly on this machine: system bus not present" msgstr "na tomto stroji neběží D-Bus korektně" #: gajim/common/dbus_support.py:61 #, fuzzy msgid "D-Bus does not run correctly on this machine: session bus not present" msgstr "na tomto stroji neběží D-Bus korektně" #: gajim/common/multimedia_helpers.py:45 #, fuzzy msgid "Default device" msgstr "Výchozí Zpráva" #: gajim/common/multimedia_helpers.py:66 #, fuzzy msgid "Audio test" msgstr "Audio / Video" #: gajim/common/multimedia_helpers.py:69 gajim/common/multimedia_helpers.py:85 #: gajim/common/multimedia_helpers.py:99 gajim/common/multimedia_helpers.py:117 msgid "Autodetect" msgstr "" #: gajim/common/multimedia_helpers.py:72 gajim/common/multimedia_helpers.py:87 #, fuzzy, python-format msgid "ALSA: %s" msgstr "Velikost: %s" #: gajim/common/multimedia_helpers.py:75 gajim/common/multimedia_helpers.py:89 #, fuzzy, python-format msgid "Pulse: %s" msgstr "Soubor: %s" #: gajim/common/multimedia_helpers.py:83 msgid "Fake audio output" msgstr "" #: gajim/common/multimedia_helpers.py:96 msgid "Video test" msgstr "" #: gajim/common/multimedia_helpers.py:101 #, python-format msgid "V4L2: %s" msgstr "" #: gajim/common/multimedia_helpers.py:104 #, fuzzy msgid "Screen" msgstr "zelený" #: gajim/common/multimedia_helpers.py:111 #, fuzzy msgid "Fake video output" msgstr "video výstup" #: gajim/common/multimedia_helpers.py:114 #, python-format msgid "X Window System (X11/XShm/Xv): %s" msgstr "" #: gajim/common/multimedia_helpers.py:116 msgid "X Window System (without Xv)" msgstr "" #: gajim/common/pep.py:27 msgid "Afraid" msgstr "Vylekaný" #: gajim/common/pep.py:28 msgid "Amazed" msgstr "Užaslý" #: gajim/common/pep.py:29 msgid "Amorous" msgstr "Milující" #: gajim/common/pep.py:30 msgid "Angry" msgstr "Rozzlobený" #: gajim/common/pep.py:31 msgid "Annoyed" msgstr "Mrzutý" #: gajim/common/pep.py:32 msgid "Anxious" msgstr "Znepokojený" #: gajim/common/pep.py:33 msgid "Aroused" msgstr "Vzrušený" #: gajim/common/pep.py:34 msgid "Ashamed" msgstr "Zahanbený" #: gajim/common/pep.py:35 msgid "Bored" msgstr "Znuděný" #: gajim/common/pep.py:36 msgid "Brave" msgstr "Statečný" #: gajim/common/pep.py:37 msgid "Calm" msgstr "Klidný" #: gajim/common/pep.py:38 msgid "Cautious" msgstr "Opatrný" #: gajim/common/pep.py:39 msgid "Cold" msgstr "Chladný" #: gajim/common/pep.py:40 msgid "Confident" msgstr "Sebevědomý" #: gajim/common/pep.py:41 msgid "Confused" msgstr "Zmatený" #: gajim/common/pep.py:42 msgid "Contemplative" msgstr "Zamyšlený" #: gajim/common/pep.py:43 msgid "Contented" msgstr "Spokojený" #: gajim/common/pep.py:44 msgid "Cranky" msgstr "Potrhlý" #: gajim/common/pep.py:45 msgid "Crazy" msgstr "Šílený" #: gajim/common/pep.py:46 msgid "Creative" msgstr "Tvořivý" #: gajim/common/pep.py:47 msgid "Curious" msgstr "Zvědavý" #: gajim/common/pep.py:48 msgid "Dejected" msgstr "Odmítnutý" #: gajim/common/pep.py:49 msgid "Depressed" msgstr "Deprimovaný" #: gajim/common/pep.py:50 msgid "Disappointed" msgstr "Zklamaný" #: gajim/common/pep.py:51 msgid "Disgusted" msgstr "Znechucený" #: gajim/common/pep.py:52 msgid "Dismayed" msgstr "Zděšený" #: gajim/common/pep.py:53 msgid "Distracted" msgstr "Roztržitý" #: gajim/common/pep.py:54 #, fuzzy msgid "Embarrassed" msgstr "Rozpačitý" #: gajim/common/pep.py:55 msgid "Envious" msgstr "Závidějící" #: gajim/common/pep.py:56 msgid "Excited" msgstr "Nadšený" #: gajim/common/pep.py:57 msgid "Flirtatious" msgstr "Záletný" #: gajim/common/pep.py:58 #, fuzzy msgid "Frustrated" msgstr "Rozčarovaný" #: gajim/common/pep.py:59 msgid "Grateful" msgstr "Vděčný" #: gajim/common/pep.py:60 msgid "Grieving" msgstr "Truchlící" #: gajim/common/pep.py:61 #, fuzzy msgid "Grumpy" msgstr "Nevrlý" #: gajim/common/pep.py:62 msgid "Guilty" msgstr "Provinilý" #: gajim/common/pep.py:63 msgid "Happy" msgstr "Šťastný" #: gajim/common/pep.py:64 msgid "Hopeful" msgstr "Doufající" #: gajim/common/pep.py:65 msgid "Hot" msgstr "Rozpálený" #: gajim/common/pep.py:66 msgid "Humbled" msgstr "Pokorný" #: gajim/common/pep.py:67 msgid "Humiliated" msgstr "Ponížený" #: gajim/common/pep.py:68 msgid "Hungry" msgstr "Hladový" #: gajim/common/pep.py:69 msgid "Hurt" msgstr "Raněný" #: gajim/common/pep.py:70 #, fuzzy msgid "Impressed" msgstr "Ohromený" #: gajim/common/pep.py:71 msgid "In Awe" msgstr "S respektem" #: gajim/common/pep.py:72 msgid "In Love" msgstr "Zamilovaný" #: gajim/common/pep.py:73 msgid "Indignant" msgstr "Rozhořčený" #: gajim/common/pep.py:74 msgid "Interested" msgstr "Zaujatý" #: gajim/common/pep.py:75 #, fuzzy msgid "Intoxicated" msgstr "Opilý/Zfetovaný" #: gajim/common/pep.py:76 msgid "Invincible" msgstr "Nepřekonatelný" #: gajim/common/pep.py:77 msgid "Jealous" msgstr "Žárlivý" #: gajim/common/pep.py:78 msgid "Lonely" msgstr "Osamělý" #: gajim/common/pep.py:79 msgid "Lost" msgstr "Ztracený" #: gajim/common/pep.py:80 msgid "Lucky" msgstr "Šťastný" #: gajim/common/pep.py:81 msgid "Mean" msgstr "Nízký" #: gajim/common/pep.py:82 msgid "Moody" msgstr "Náladový" #: gajim/common/pep.py:83 msgid "Nervous" msgstr "Nervózní" #: gajim/common/pep.py:84 msgid "Neutral" msgstr "Bez emocí" #: gajim/common/pep.py:85 msgid "Offended" msgstr "Uražený" #: gajim/common/pep.py:86 msgid "Outraged" msgstr "Rozčílený" #: gajim/common/pep.py:87 msgid "Playful" msgstr "Hravý" #: gajim/common/pep.py:88 msgid "Proud" msgstr "Hrdý" #: gajim/common/pep.py:89 #, fuzzy msgid "Relaxed" msgstr "Uvolněný" #: gajim/common/pep.py:90 #, fuzzy msgid "Relieved" msgstr "Uvolněný" #: gajim/common/pep.py:91 msgid "Remorseful" msgstr "Kajícný" #: gajim/common/pep.py:92 msgid "Restless" msgstr "Netrpělivý" #: gajim/common/pep.py:93 msgid "Sad" msgstr "Smutný" #: gajim/common/pep.py:94 msgid "Sarcastic" msgstr "Jízlivý" #: gajim/common/pep.py:95 msgid "Satisfied" msgstr "Spokojený" #: gajim/common/pep.py:96 msgid "Serious" msgstr "Vážný" #: gajim/common/pep.py:97 msgid "Shocked" msgstr "Šokovaný" #: gajim/common/pep.py:98 msgid "Shy" msgstr "Plachý" #: gajim/common/pep.py:99 msgid "Sick" msgstr "Nemocný" #: gajim/common/pep.py:100 msgid "Sleepy" msgstr "Ospalý" #: gajim/common/pep.py:101 msgid "Spontaneous" msgstr "Spontánní" #: gajim/common/pep.py:102 msgid "Stressed" msgstr "Stresovaný" #: gajim/common/pep.py:103 msgid "Strong" msgstr "Silný" #: gajim/common/pep.py:104 msgid "Surprised" msgstr "Překvapený" #: gajim/common/pep.py:105 msgid "Thankful" msgstr "Děkovný" #: gajim/common/pep.py:106 msgid "Thirsty" msgstr "Žíznivý" #: gajim/common/pep.py:107 msgid "Tired" msgstr "Unavený" #: gajim/common/pep.py:108 msgid "Undefined" msgstr "Nedefinováno" #: gajim/common/pep.py:109 msgid "Weak" msgstr "Slabý" #: gajim/common/pep.py:110 msgid "Worried" msgstr "Ustaraný" #: gajim/common/pep.py:113 msgid "Doing Chores" msgstr "Domácí práce" #: gajim/common/pep.py:114 msgid "Buying Groceries" msgstr "Nakupuji potraviny" #: gajim/common/pep.py:115 msgid "Cleaning" msgstr "Uklízím" #: gajim/common/pep.py:116 msgid "Cooking" msgstr "Vařím" #: gajim/common/pep.py:117 msgid "Doing Maintenance" msgstr "Dělám údržbu" #: gajim/common/pep.py:118 msgid "Doing the Dishes" msgstr "Umývám nádobí" #: gajim/common/pep.py:119 msgid "Doing the Laundry" msgstr "Peru" #: gajim/common/pep.py:120 msgid "Gardening" msgstr "Zahradničím" #: gajim/common/pep.py:121 msgid "Running an Errand" msgstr "Vyřizuji" #: gajim/common/pep.py:122 msgid "Walking the Dog" msgstr "Venčím psa" #: gajim/common/pep.py:123 #, fuzzy msgid "Drinking" msgstr "Piju" #: gajim/common/pep.py:124 msgid "Having a Beer" msgstr "Piju pivo" #: gajim/common/pep.py:125 msgid "Having Coffee" msgstr "Na kávě" #: gajim/common/pep.py:126 msgid "Having Tea" msgstr "Dávám si čaj" #: gajim/common/pep.py:128 msgid "Having a Snack" msgstr "Svačím" #: gajim/common/pep.py:129 #, fuzzy msgid "Having Breakfast" msgstr "Snídám" #: gajim/common/pep.py:130 msgid "Having Dinner" msgstr "Večeřím" #: gajim/common/pep.py:131 msgid "Having Lunch" msgstr "Obědvám" #: gajim/common/pep.py:132 msgid "Exercising" msgstr "Cvičím" #: gajim/common/pep.py:133 gajim/common/pep.py:178 msgid "Cycling" msgstr "Jedu na kole" #: gajim/common/pep.py:134 msgid "Dancing" msgstr "Tančím" #: gajim/common/pep.py:135 msgid "Hiking" msgstr "Na výšlapu" #: gajim/common/pep.py:136 msgid "Jogging" msgstr "Běhám" #: gajim/common/pep.py:137 msgid "Playing Sports" msgstr "Sportuji" #: gajim/common/pep.py:138 msgid "Running" msgstr "Běhám" #: gajim/common/pep.py:139 msgid "Skiing" msgstr "Lyžuji" #: gajim/common/pep.py:140 msgid "Swimming" msgstr "Plavu" #: gajim/common/pep.py:141 msgid "Working out" msgstr "Posiluji" #: gajim/common/pep.py:142 #, fuzzy msgid "Grooming" msgstr "Pečuji o sebe" #: gajim/common/pep.py:143 msgid "At the Spa" msgstr "V lázních" #: gajim/common/pep.py:144 msgid "Brushing Teeth" msgstr "Čistím si zuby" #: gajim/common/pep.py:145 msgid "Getting a Haircut" msgstr "U holiče" #: gajim/common/pep.py:146 msgid "Shaving" msgstr "Holím se" #: gajim/common/pep.py:147 msgid "Taking a Bath" msgstr "Koupu se" #: gajim/common/pep.py:148 msgid "Taking a Shower" msgstr "Sprchuji se" #: gajim/common/pep.py:149 msgid "Having an Appointment" msgstr "Mám schůzku" #: gajim/common/pep.py:150 gajim/data/gui/gajim_themes_window.ui:363 msgid "Inactive" msgstr "Neaktivní" #: gajim/common/pep.py:151 msgid "Day Off" msgstr "Den volna" #: gajim/common/pep.py:152 #, fuzzy msgid "Hanging out" msgstr "Venku za zábavou" #: gajim/common/pep.py:153 msgid "Hiding" msgstr "Skrývám se" #: gajim/common/pep.py:154 msgid "On Vacation" msgstr "Na dovolené" #: gajim/common/pep.py:155 msgid "Praying" msgstr "Modlím se" #: gajim/common/pep.py:156 msgid "Scheduled Holiday" msgstr "Plánovaná dovolená" #: gajim/common/pep.py:158 msgid "Thinking" msgstr "Přemýšlím" #: gajim/common/pep.py:159 #, fuzzy msgid "Relaxing" msgstr "Relaxuji" #: gajim/common/pep.py:160 msgid "Fishing" msgstr "Rybařím" #: gajim/common/pep.py:161 msgid "Gaming" msgstr "Hraji hry" #: gajim/common/pep.py:162 #, fuzzy msgid "Going out" msgstr "Venku" #: gajim/common/pep.py:163 msgid "Partying" msgstr "Na párty" #: gajim/common/pep.py:164 msgid "Reading" msgstr "Čtu si" #: gajim/common/pep.py:165 #, fuzzy msgid "Rehearsing" msgstr "Nacvičuji" #: gajim/common/pep.py:166 msgid "Shopping" msgstr "Nakupuji" #: gajim/common/pep.py:167 msgid "Smoking" msgstr "Kouřím" #: gajim/common/pep.py:168 msgid "Socializing" msgstr "Ve společnosti" #: gajim/common/pep.py:169 msgid "Sunbathing" msgstr "Opaluji se" #: gajim/common/pep.py:170 msgid "Watching TV" msgstr "Sleduji TV" #: gajim/common/pep.py:171 msgid "Watching a Movie" msgstr "Dívám se na film" #: gajim/common/pep.py:172 msgid "Talking" msgstr "Povídám si" #: gajim/common/pep.py:173 msgid "In Real Life" msgstr "Ve skutečném světě" #: gajim/common/pep.py:174 msgid "On the Phone" msgstr "Telefonuji" #: gajim/common/pep.py:175 msgid "On Video Phone" msgstr "Mám videohovor" #: gajim/common/pep.py:176 msgid "Traveling" msgstr "Cestuji" #: gajim/common/pep.py:177 msgid "Commuting" msgstr "Dojíždím" #: gajim/common/pep.py:179 msgid "Driving" msgstr "Řídím" #: gajim/common/pep.py:180 msgid "In a Car" msgstr "V autě" #: gajim/common/pep.py:181 msgid "On a Bus" msgstr "V autobuse" #: gajim/common/pep.py:182 msgid "On a Plane" msgstr "V letadle" #: gajim/common/pep.py:183 msgid "On a Train" msgstr "Ve vlaku" #: gajim/common/pep.py:184 msgid "On a Trip" msgstr "Na výletě" #: gajim/common/pep.py:185 msgid "Walking" msgstr "Na procházce" #: gajim/common/pep.py:187 msgid "Coding" msgstr "Programuji" #: gajim/common/pep.py:188 msgid "In a Meeting" msgstr "Na setkání" #: gajim/common/pep.py:189 msgid "Studying" msgstr "Učím se" #: gajim/common/pep.py:190 msgid "Writing" msgstr "Píši" #: gajim/common/pep.py:195 msgid "accuracy" msgstr "" #: gajim/common/pep.py:196 #, fuzzy msgid "alt" msgstr "výchozí" #: gajim/common/pep.py:197 msgid "area" msgstr "" #: gajim/common/pep.py:198 #, fuzzy msgid "bearing" msgstr "mariňák" #: gajim/common/pep.py:199 #, fuzzy msgid "building" msgstr "Skrývám se" #: gajim/common/pep.py:200 #, fuzzy msgid "country" msgstr "Země:" #: gajim/common/pep.py:201 #, fuzzy msgid "countrycode" msgstr "Účet" #: gajim/common/pep.py:202 msgid "datum" msgstr "" #: gajim/common/pep.py:203 #, fuzzy msgid "description" msgstr "Popis" #: gajim/common/pep.py:204 #, fuzzy msgid "error" msgstr "Chyba" #: gajim/common/pep.py:205 msgid "floor" msgstr "" #: gajim/common/pep.py:206 msgid "lat" msgstr "" #: gajim/common/pep.py:207 msgid "locality" msgstr "" #: gajim/common/pep.py:208 #, fuzzy msgid "lon" msgstr "jeden" #: gajim/common/pep.py:209 msgid "postalcode" msgstr "" #: gajim/common/pep.py:210 msgid "region" msgstr "" #: gajim/common/pep.py:211 msgid "room" msgstr "místnost" #: gajim/common/pep.py:212 msgid "speed" msgstr "" #: gajim/common/pep.py:213 msgid "street" msgstr "" #: gajim/common/pep.py:214 msgid "text" msgstr "" #: gajim/common/pep.py:215 msgid "timestamp" msgstr "" #: gajim/common/pep.py:216 msgid "uri" msgstr "uri" #: gajim/common/pep.py:343 msgid "Unknown Artist" msgstr "Neznámý Umělec" #: gajim/common/pep.py:346 msgid "Unknown Title" msgstr "Neznámý Název" #: gajim/common/pep.py:349 msgid "Unknown Source" msgstr "Neznámý Zdroj" #: gajim/common/pep.py:352 #, python-format msgid "" "\"%(title)s\" by %(artist)s\n" "from %(source)s" msgstr "" "\"%(title)s\" od %(artist)s\n" "z %(source)s" #: gajim/common/stanza_session.py:422 msgid "" "[This is part of an encrypted session. If you see this message, something " "went wrong.]" msgstr "" "[Tato zpráva je součástí šifrovaného sezení. Pokud vidíte tuto zprávu, tak " "je něco špatně.]" #: gajim/common/jingle_rtp.py:123 #, fuzzy, python-format msgid "%s configuration error" msgstr "Nastavení místnosti" #: gajim/common/jingle_rtp.py:124 #, python-format msgid "" "Couldn’t setup %(text)s. Check your configuration.\n" "\n" "Pipeline was:\n" "%(pipeline)s\n" "\n" "Error was:\n" "%(error)s" msgstr "" #: gajim/common/jingle_rtp.py:371 #, fuzzy msgid "audio input" msgstr "audio vstup" #: gajim/common/jingle_rtp.py:375 #, fuzzy msgid "audio output" msgstr "audio výstup" #: gajim/common/jingle_rtp.py:433 #, fuzzy msgid "video input" msgstr "video vstup" #: gajim/common/jingle_rtp.py:440 #, fuzzy msgid "video output" msgstr "video výstup" #: gajim/common/helpers.py:296 msgid "Server must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:304 msgid "Invalid character in hostname." msgstr "Neplatný znak v hostname." #: gajim/common/helpers.py:306 msgid "Server address required." msgstr "Je potřeba adresa serveru." #: gajim/common/helpers.py:310 msgid "Username must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:318 msgid "Invalid character in username." msgstr "Neplatný znak v uživatelském jméně." #: gajim/common/helpers.py:324 msgid "Resource must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:332 msgid "Invalid character in resource." msgstr "Neplatný znak ve zdroji." #: gajim/common/helpers.py:372 msgid "_Busy" msgstr "_Nerušit" #: gajim/common/helpers.py:377 msgid "_Not Available" msgstr "Ne_dostupný" #: gajim/common/helpers.py:382 msgid "_Free for Chat" msgstr "_Ukecaný" #: gajim/common/helpers.py:387 #, fuzzy msgid "?user status:_Available" msgstr "?transfer status:Pozastaveno" #: gajim/common/helpers.py:391 msgid "Connecting" msgstr "Připojuji se" #: gajim/common/helpers.py:394 msgid "A_way" msgstr "_Pryč" #: gajim/common/helpers.py:399 msgid "_Offline" msgstr "_Odpojen" #: gajim/common/helpers.py:404 msgid "_Invisible" msgstr "Ne_viditelný" #: gajim/common/helpers.py:410 msgid "?contact has status:Unknown" msgstr "?contact has status:Neznámý" #: gajim/common/helpers.py:412 msgid "?contact has status:Has errors" msgstr "stav" #: gajim/common/helpers.py:427 msgid "?Subscription we already have:None" msgstr "?Subscription we already have:Žádná" #: gajim/common/helpers.py:429 msgid "To" msgstr "Příjemce" #: gajim/common/helpers.py:431 msgid "From" msgstr "Odesílatel" #: gajim/common/helpers.py:433 msgid "Both" msgstr "Oboustranná" #: gajim/common/helpers.py:435 #, fuzzy msgid "Unknown" msgstr "?OS:Neznámý" #: gajim/common/helpers.py:441 msgid "?Ask (for Subscription):None" msgstr "?Ask (for Subscription):Není" #: gajim/common/helpers.py:443 msgid "Subscribe" msgstr "Žádat autorizaci" #: gajim/common/helpers.py:452 msgid "?Group Chat Contact Role:None" msgstr "?Group Chat Contact Role:Žádná" #: gajim/common/helpers.py:455 msgid "Moderators" msgstr "Moderátoři" #: gajim/common/helpers.py:457 msgid "Moderator" msgstr "Moderátor" #: gajim/common/helpers.py:460 msgid "Participants" msgstr "Účastníci" #: gajim/common/helpers.py:462 msgid "Participant" msgstr "Účastník" #: gajim/common/helpers.py:465 msgid "Visitors" msgstr "Návštěvníci" #: gajim/common/helpers.py:467 msgid "Visitor" msgstr "Návštěvník" #: gajim/common/helpers.py:518 msgid "is paying attention to the conversation" msgstr "věnuje pozornost rozhovoru" #: gajim/common/helpers.py:520 msgid "is doing something else" msgstr "dělá něco jiného" #: gajim/common/helpers.py:522 #, fuzzy msgid "is composing a message…" msgstr "píše zprávu..." #: gajim/common/helpers.py:525 msgid "paused composing a message" msgstr "pozastavil(a) psaní zprávy" #: gajim/common/helpers.py:527 msgid "has closed the chat window or tab" msgstr "zavřel(a) okno zprávy" #: gajim/common/helpers.py:754 #, python-format msgid "%s GiB" msgstr "%s GiB" #: gajim/common/helpers.py:757 #, python-format msgid "%s GB" msgstr "%s GB" #: gajim/common/helpers.py:761 #, python-format msgid "%s MiB" msgstr "%s MiB" #: gajim/common/helpers.py:764 #, python-format msgid "%s MB" msgstr "%s MB" #: gajim/common/helpers.py:768 #, python-format msgid "%s KiB" msgstr "%s KiB" #: gajim/common/helpers.py:771 #, python-format msgid "%s KB" msgstr "%s KB" #: gajim/common/helpers.py:774 #, python-format msgid "%s B" msgstr "%s B" #: gajim/common/helpers.py:1141 gajim/common/helpers.py:1148 #, python-format msgid "%d message pending" msgid_plural "%d messages pending" msgstr[0] "Čeká %d zpráva" msgstr[1] "Čekají %d zprávy" msgstr[2] "Čeká %d zpráv" #: gajim/common/helpers.py:1155 #, fuzzy, python-format msgid "from room %s" msgstr "z místností %s" #: gajim/common/helpers.py:1158 gajim/common/helpers.py:1175 #, fuzzy, python-format msgid "from user %s" msgstr "od uživatele %s" #: gajim/common/helpers.py:1160 #, fuzzy, python-format msgid "from %s" msgstr "od %s" #: gajim/common/helpers.py:1167 gajim/common/helpers.py:1173 #, python-format msgid "%d event pending" msgid_plural "%d events pending" msgstr[0] "Čeká %d událost" msgstr[1] "Čekají %d události" msgstr[2] "Čeká %d událostí" #: gajim/common/helpers.py:1191 gajim/common/helpers.py:1203 #: gajim/data/gui/roster_window.ui:85 data/org.gajim.Gajim.desktop.in:4 #: data/org.gajim.Gajim.appdata.xml.in:9 msgid "Gajim" msgstr "Gajim" #: gajim/common/helpers.py:1205 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" #: gajim/common/helpers.py:1392 gajim/data/gui/add_new_contact_window.ui:24 msgid "I would like to add you to my contact list." msgstr "Chtěl(a) bych si Vás přidat do mého Seznamu." #: gajim/common/helpers.py:1394 #, fuzzy msgid "Hello, I am $name." msgstr "Ahoj, já jsem $name" #: gajim/common/helpers.py:1508 gajim/common/helpers.py:1517 #: gajim/common/helpers.py:1576 msgid "Timeout loading image" msgstr "Nezdařilo se načtení obrázku" #: gajim/common/helpers.py:1527 gajim/common/helpers.py:1574 msgid "Image is too big" msgstr "Obrázek je příliš veliký" #: gajim/common/helpers.py:1538 #, fuzzy msgid "PyCURL is not installed" msgstr "CRL certifikát není správný" #: gajim/common/helpers.py:1578 #, fuzzy msgid "Error loading image" msgstr "Nezdařilo se načtení obrázku" #: gajim/common/connection_handlers.py:133 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "Registrační informace pro transport %s nedorazily včas" #: gajim/common/connection_handlers.py:979 msgid "This message was encrypted with OTR and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:982 msgid "" "This message was encrypted with Legacy OpenPGP and could not be decrypted. " "You can install the PGP plugin to handle those messages." msgstr "" #: gajim/common/connection_handlers.py:986 msgid "" "This message was encrypted with OpenPGP for XMPP and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:992 #, python-format msgid "This message was encrypted with %s and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:1060 msgid "message" msgstr "zpráva" #: gajim/common/connection_handlers.py:1863 msgid "I would like to add you to my roster." msgstr "Rád(a) bych si tě přidal(a) do seznamu." #: gajim/common/exceptions.py:46 #, fuzzy, python-format msgid "" "The database file (%s) cannot be read. Try to repair it (see https://dev." "gajim.org/gajim/gajim/wikis/help/DatabaseBackup) or remove it (all history " "will be lost)." msgstr "" "Nelze přečíst soubor databáze (%s). Opravte ho (viz http://trac.gajim.org/" "wiki/DatabaseBackup) nebo smažte (tím ztratítu všechny zprávy v historii)." #: gajim/common/exceptions.py:60 msgid "Service not available: Gajim is not running, or remote_control is False" msgstr "Služba není dostupná. Gajim neběží, nebo remote_control je vypnutý" #: gajim/common/exceptions.py:82 #, fuzzy, python-format msgid "" "Session bus is not available.\n" "Try reading %(url)s" msgstr "" "Session bus není k dispozici.\n" "Zkuste přečíst http://trac.gajim.org/wiki/GajimDBus" #: gajim/common/exceptions.py:94 #, fuzzy, python-format msgid "" "System bus is not available.\n" "Try reading %(url)s" msgstr "" "Session bus není k dispozici.\n" "Zkuste přečíst http://trac.gajim.org/wiki/GajimDBus" #: gajim/common/zeroconf/connection_zeroconf.py:193 msgid "Please check if Avahi or Bonjour is installed." msgstr "Zkontrolujte zda je Avahi nebo Bonjour nainstalováno." #: gajim/common/zeroconf/connection_zeroconf.py:203 #: gajim/common/zeroconf/connection_zeroconf.py:207 msgid "Could not start local service" msgstr "Nepodařilo se spustit lokální službu" #: gajim/common/zeroconf/connection_zeroconf.py:204 #, python-format msgid "Unable to bind to port %d." msgstr "Nemůžu naslouchat na portu %d." #: gajim/common/zeroconf/connection_zeroconf.py:208 #: gajim/common/zeroconf/connection_zeroconf.py:293 #: gajim/common/zeroconf/connection_zeroconf.py:306 #: gajim/common/zeroconf/connection_zeroconf.py:322 msgid "Please check if avahi-daemon is running." msgstr "Zkontrolujte, zda avahi-daemon běží." #: gajim/common/zeroconf/connection_zeroconf.py:292 #: gajim/common/zeroconf/connection_zeroconf.py:305 #: gajim/common/zeroconf/connection_zeroconf.py:321 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Nemůžu změnit stav účtu \"%s\"" #: gajim/common/zeroconf/connection_zeroconf.py:337 msgid "Your message could not be sent." msgstr "Vaše zpráva nemohla být odeslána." #: gajim/common/zeroconf/connection_zeroconf.py:352 msgid "Contact is offline. Your message could not be sent." msgstr "Kontakt je offline. Vaše zpráva nemohla být odeslána." #: gajim/common/zeroconf/connection_zeroconf.py:374 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "Spojení k počítači nebylo navázáno:Vypršel čas při odesílání dat." #: gajim/common/zeroconf/zeroconf_bonjour.py:197 #: gajim/common/zeroconf/zeroconf_avahi.py:220 #, python-format msgid "Error while adding service. %s" msgstr "Chyba při přidávání služby. %s" #: gajim/data/gui/blocked_contacts_window.ui:13 msgid "Blocked Contacts" msgstr "Blokované Kontakty" #: gajim/data/gui/advanced_configuration_window.ui:13 msgid "Advanced Configuration Editor" msgstr "Editor rozšířeného nastavení" #: gajim/data/gui/advanced_configuration_window.ui:35 msgid "Filter:" msgstr "Filtr:" #: gajim/data/gui/advanced_configuration_window.ui:107 #: gajim/data/gui/features_window.ui:111 msgid "Description" msgstr "Popis" #: gajim/data/gui/advanced_configuration_window.ui:136 msgid "NOTE: You should restart Gajim for some settings to take effect" msgstr "" "POZNÁMKA: Měl(a) by jste restartovat gajim, aby se projevila všechna " "nastavení" #: gajim/data/gui/advanced_configuration_window.ui:161 #, fuzzy msgid "_Reset to default" msgstr "_Vrátit k výchozím barvám" #: gajim/data/gui/join_groupchat_window.ui:34 #, fuzzy msgid "Bookmark this Groupchat" msgstr "Přidat tuto místnost do záložek" #: gajim/data/gui/join_groupchat_window.ui:51 msgid "Join this Groupchat everytime Gajim is started" msgstr "" #: gajim/data/gui/join_groupchat_window.ui:69 #, fuzzy msgid "Bookmark" msgstr "_Záložky" #: gajim/data/gui/join_groupchat_window.ui:82 #, fuzzy msgid "Autojoin" msgstr "Automaticky vstoupit" #: gajim/data/gui/join_groupchat_window.ui:119 msgid "Account" msgstr "Účet" #: gajim/data/gui/join_groupchat_window.ui:226 #, fuzzy msgid "Room" msgstr "Místnost:" #: gajim/data/gui/join_groupchat_window.ui:238 #, fuzzy msgid "Recently" msgstr "Nedávno:" #: gajim/data/gui/join_groupchat_window.ui:290 msgid "Search the rooms on this server" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:12 #, fuzzy msgid "HTTP Connect" msgstr "" "HTTP Connect\n" "SOCKS5\n" "BOSH" #: gajim/data/gui/manage_proxies_window.ui:15 msgid "SOCKS5" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:18 msgid "BOSH" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:25 msgid "Manage Proxy Profiles" msgstr "Spravovat profily Proxy" #: gajim/data/gui/manage_proxies_window.ui:148 msgid "_Name:" msgstr "_Jméno: " #: gajim/data/gui/manage_proxies_window.ui:161 msgid "_Type:" msgstr "_Typ:" #: gajim/data/gui/manage_proxies_window.ui:205 msgid "Properties" msgstr "Vlastnosti" #: gajim/data/gui/manage_proxies_window.ui:234 msgid "_BOSH URL:" msgstr "_BOSH URL:" #: gajim/data/gui/manage_proxies_window.ui:258 msgid "Proxy _Host:" msgstr "P_očítač Proxy:" #: gajim/data/gui/manage_proxies_window.ui:269 msgid "Use HTTP prox_y" msgstr "Použij HTTP prox_y" #: gajim/data/gui/manage_proxies_window.ui:288 msgid "Proxy _Port:" msgstr "_Port Proxy:" #: gajim/data/gui/manage_proxies_window.ui:299 msgid "Use proxy auth_entication" msgstr "Použít při_hlášení k proxy" #: gajim/data/gui/manage_proxies_window.ui:318 msgid "_Username:" msgstr "_Uživatel:" #: gajim/data/gui/manage_proxies_window.ui:331 msgid "Pass_word:" msgstr "He_slo:" #: gajim/data/gui/manage_proxies_window.ui:391 msgid "Settings" msgstr "Nastavení" #: gajim/data/gui/change_password_dialog.ui:89 msgid "Enter new password:" msgstr "Zadejte heslo:" #: gajim/data/gui/change_password_dialog.ui:115 msgid "Enter it again for confirmation:" msgstr "Zadejte znovu pro ověření:" #: gajim/data/gui/zeroconf_information_window.ui:8 #: gajim/data/gui/vcard_information_window.ui:8 msgid "Contact Information" msgstr "Informace o kontaktu" #: gajim/data/gui/zeroconf_information_window.ui:54 msgid "Local jid:" msgstr "Lokální jid: " #: gajim/data/gui/zeroconf_information_window.ui:67 #: gajim/data/gui/tooltip_roster_contact.ui:55 #: gajim/data/gui/tooltip_gc_contact.ui:75 msgid "Resource:" msgstr "Zdroj:" #: gajim/data/gui/zeroconf_information_window.ui:80 #: gajim/data/gui/tooltip_roster_contact.ui:110 msgid "Status:" msgstr "Stav:" #: gajim/data/gui/zeroconf_information_window.ui:89 #: gajim/data/gui/history_window.ui:290 msgid "_Log conversation history" msgstr "_Zaznamenat historii konverzace" #: gajim/data/gui/zeroconf_information_window.ui:215 #: gajim/data/gui/vcard_information_window.ui:360 msgid "Contact" msgstr "Kontakt" #: gajim/data/gui/zeroconf_information_window.ui:234 msgid "First Name:" msgstr "Křestní:" #: gajim/data/gui/zeroconf_information_window.ui:247 msgid "Last Name:" msgstr "Příjmení:" #: gajim/data/gui/zeroconf_information_window.ui:260 #: gajim/data/gui/archiving_313_preferences_item.ui:84 #: gajim/data/gui/tooltip_roster_contact.ui:30 #: gajim/data/gui/tooltip_gc_contact.ui:50 msgid "Jabber ID:" msgstr "Jabber ID:" #: gajim/data/gui/zeroconf_information_window.ui:273 msgid "E-Mail:" msgstr "E-Mail:" #: gajim/data/gui/zeroconf_information_window.ui:354 msgid "Personal" msgstr "Osobní" #: gajim/data/gui/gc_occupants_menu.ui:12 msgid "_Send Private Message" msgstr "_Odeslat soukromou zprávu" #: gajim/data/gui/gc_occupants_menu.ui:21 msgid "Send _File" msgstr "Odeslat _Soubor" #: gajim/data/gui/gc_occupants_menu.ui:29 msgid "Occupant Actions" msgstr "_Akce účastníků" #: gajim/data/gui/gc_occupants_menu.ui:38 msgid "_Voice" msgstr "_Hlas" #: gajim/data/gui/gc_occupants_menu.ui:46 msgid "Mo_derator" msgstr "Mo_derátor" #: gajim/data/gui/gc_occupants_menu.ui:60 msgid "_Member" msgstr "Č_len" #: gajim/data/gui/gc_occupants_menu.ui:68 msgid "_Admin" msgstr "_Správce" #: gajim/data/gui/gc_occupants_menu.ui:76 msgid "_Owner" msgstr "_Vlastník" #: gajim/data/gui/gc_occupants_menu.ui:90 msgid "_Kick" msgstr "Vy_kopnout" #: gajim/data/gui/gc_occupants_menu.ui:98 msgid "_Ban" msgstr "_Zakázat" #: gajim/data/gui/gc_occupants_menu.ui:124 msgid "_Add to Roster" msgstr "Přid_at do Seznamu" #: gajim/data/gui/gc_occupants_menu.ui:132 #, fuzzy msgid "_Execute command" msgstr "Spustit _příkaz..." #: gajim/data/gui/archiving_313_preferences_item.ui:12 #: gajim/data/gui/preferences_window.ui:102 #: gajim/data/gui/preferences_window.ui:153 #: gajim/data/gui/archiving_313_preferences_window.ui:25 #, fuzzy msgid "Always" msgstr "Pryč" #: gajim/data/gui/archiving_313_preferences_item.ui:15 #: gajim/data/gui/preferences_window.ui:96 #: gajim/data/gui/preferences_window.ui:156 #: gajim/data/gui/archiving_313_preferences_window.ui:31 #, fuzzy msgid "Never" msgstr "Server" #: gajim/data/gui/archiving_313_preferences_item.ui:96 #, fuzzy msgid "Preference:" msgstr "Nastavení" #: gajim/data/gui/tooltip_roster_contact.ui:125 #, fuzzy msgid "Idle since:" msgstr " od %s" #: gajim/data/gui/tooltip_roster_contact.ui:151 #: gajim/data/gui/change_status_message_dialog.ui:191 msgid "Mood:" msgstr "Nálada:" #: gajim/data/gui/tooltip_roster_contact.ui:164 #: gajim/data/gui/change_status_message_dialog.ui:179 msgid "Activity:" msgstr "Činnost:" #: gajim/data/gui/tooltip_roster_contact.ui:178 #, fuzzy msgid "Tune:" msgstr "Hudba:" #: gajim/data/gui/tooltip_roster_contact.ui:191 #, fuzzy msgid "Location:" msgstr "Upozornění" #: gajim/data/gui/tooltip_roster_contact.ui:255 #, fuzzy msgid "OpenPGP:" msgstr "OpenPGP: " #: gajim/data/gui/tooltip_roster_contact.ui:281 msgid "Subscription:" msgstr "Autorizace: " #: gajim/data/gui/zeroconf_context_menu.ui:11 #: gajim/data/gui/account_context_menu.ui:11 msgid "_Status" msgstr "_Stav" #: gajim/data/gui/zeroconf_context_menu.ui:26 #: gajim/data/gui/account_context_menu.ui:79 msgid "_Modify Account..." msgstr "Upravit úč_et..." #: gajim/data/gui/atom_entry_window.ui:8 msgid "New entry received" msgstr "Přijat nový záznam" #: gajim/data/gui/atom_entry_window.ui:92 msgid "Feed name:" msgstr "Jméno kanálu:" #: gajim/data/gui/atom_entry_window.ui:119 msgid "Entry:" msgstr "Položka:" #: gajim/data/gui/atom_entry_window.ui:131 msgid "Last modified:" msgstr "Naposledy upraveno:" #: gajim/data/gui/atom_entry_window.ui:196 msgid "Next entry" msgstr "" #: gajim/data/gui/gc_control_popup_menu.ui:11 msgid "Change _Nickname..." msgstr "Změ_nit přezdívku" #: gajim/data/gui/gc_control_popup_menu.ui:20 msgid "_Manage Room" msgstr "Spravuj Místnost" #: gajim/data/gui/gc_control_popup_menu.ui:31 msgid "Change _Subject..." msgstr "Změnit _předmět" #: gajim/data/gui/gc_control_popup_menu.ui:38 msgid "Configure _Room..." msgstr "Nastavit _místnost" #: gajim/data/gui/gc_control_popup_menu.ui:52 msgid "_Destroy Room" msgstr "_Zničit místnost" #: gajim/data/gui/gc_control_popup_menu.ui:64 msgid "_Minimize on close" msgstr "_Minimalizovat při zavření" #: gajim/data/gui/gc_control_popup_menu.ui:85 #, fuzzy msgid "_Request Voice" msgstr "_Hlas" #: gajim/data/gui/profile_window.ui:7 msgid "Personal Information" msgstr "Osobní údaje" #: gajim/data/gui/profile_window.ui:35 #: gajim/data/gui/vcard_information_window.ui:382 msgid "Name:" msgstr "Jméno:" #: gajim/data/gui/profile_window.ui:59 #: gajim/data/gui/vcard_information_window.ui:410 msgid "Nickname:" msgstr "Přezdívka:" #. Family Name #: gajim/data/gui/profile_window.ui:94 #: gajim/data/gui/vcard_information_window.ui:740 msgid "Family:" msgstr "Příjmení:" #. Given Name #: gajim/data/gui/profile_window.ui:118 #: gajim/data/gui/vcard_information_window.ui:822 msgid "Given:" msgstr "Křestní:" #. Middle Name #: gajim/data/gui/profile_window.ui:142 #: gajim/data/gui/vcard_information_window.ui:753 msgid "Middle:" msgstr "Prostřední:" #. Prefix in Name #: gajim/data/gui/profile_window.ui:156 #: gajim/data/gui/vcard_information_window.ui:766 msgid "Prefix:" msgstr "Před jménem" #. Suffix in Name #: gajim/data/gui/profile_window.ui:190 #: gajim/data/gui/vcard_information_window.ui:835 msgid "Suffix:" msgstr "Za jménem:" #: gajim/data/gui/profile_window.ui:222 #: gajim/data/gui/vcard_information_window.ui:878 msgid "Full Name" msgstr "Celé jméno:" #: gajim/data/gui/profile_window.ui:250 gajim/data/gui/profile_window.ui:724 #: gajim/data/gui/vcard_information_window.ui:454 #: gajim/data/gui/vcard_information_window.ui:1087 msgid "Street:" msgstr "Ulice:" #: gajim/data/gui/profile_window.ui:274 gajim/data/gui/profile_window.ui:748 #: gajim/data/gui/vcard_information_window.ui:535 #: gajim/data/gui/vcard_information_window.ui:1126 msgid "Extra Address:" msgstr "Další adresa:" #: gajim/data/gui/profile_window.ui:298 gajim/data/gui/profile_window.ui:772 #: gajim/data/gui/vcard_information_window.ui:467 #: gajim/data/gui/vcard_information_window.ui:1100 msgid "City:" msgstr "Město:" #: gajim/data/gui/profile_window.ui:322 gajim/data/gui/profile_window.ui:796 #: gajim/data/gui/vcard_information_window.ui:548 #: gajim/data/gui/vcard_information_window.ui:1140 msgid "Postal Code:" msgstr "PSČ:" #: gajim/data/gui/profile_window.ui:346 gajim/data/gui/profile_window.ui:820 #: gajim/data/gui/vcard_information_window.ui:480 #: gajim/data/gui/vcard_information_window.ui:1113 msgid "State:" msgstr "Stát:" #: gajim/data/gui/profile_window.ui:370 gajim/data/gui/profile_window.ui:844 #: gajim/data/gui/vcard_information_window.ui:561 #: gajim/data/gui/vcard_information_window.ui:1153 msgid "Country:" msgstr "Stát:" #: gajim/data/gui/profile_window.ui:396 gajim/data/gui/profile_window.ui:870 #: gajim/data/gui/vcard_information_window.ui:618 #: gajim/data/gui/vcard_information_window.ui:1253 msgid "Address" msgstr "Adresa" #: gajim/data/gui/profile_window.ui:413 #: gajim/data/gui/vcard_information_window.ui:635 msgid "Homepage:" msgstr "Domovská stránka:" #: gajim/data/gui/profile_window.ui:437 gajim/data/gui/profile_window.ui:887 #: gajim/data/gui/vcard_information_window.ui:648 #: gajim/data/gui/vcard_information_window.ui:1270 msgid "E-Mail:" msgstr "E-Mail:" #: gajim/data/gui/profile_window.ui:462 gajim/data/gui/profile_window.ui:912 #: gajim/data/gui/vcard_information_window.ui:661 #: gajim/data/gui/vcard_information_window.ui:1283 msgid "Phone No.:" msgstr "Telefon:" #: gajim/data/gui/profile_window.ui:497 msgid "Avatar:" msgstr "Avatar:" #: gajim/data/gui/profile_window.ui:540 msgid "Click to set your avatar" msgstr "Klikni pro nastavení tvého avatara" #: gajim/data/gui/profile_window.ui:566 #: gajim/data/gui/vcard_information_window.ui:702 msgid "Format: YYYY-MM-DD" msgstr "Formát: RRRR-MM-DD" #: gajim/data/gui/profile_window.ui:574 #: gajim/data/gui/vcard_information_window.ui:708 msgid "Birthday:" msgstr "Narozeniny:" #: gajim/data/gui/profile_window.ui:598 #: gajim/data/gui/vcard_information_window.ui:937 msgid "Personal Info" msgstr "Osobní údaje" #: gajim/data/gui/profile_window.ui:617 #: gajim/data/gui/vcard_information_window.ui:960 msgid "Company:" msgstr "Společnost:" #: gajim/data/gui/profile_window.ui:641 #: gajim/data/gui/vcard_information_window.ui:990 msgid "Department:" msgstr "Oddělení:" #: gajim/data/gui/profile_window.ui:665 #: gajim/data/gui/vcard_information_window.ui:1018 msgid "Position:" msgstr "Pozice:" #: gajim/data/gui/profile_window.ui:689 #: gajim/data/gui/vcard_information_window.ui:1045 msgid "Role:" msgstr "Postavení:" #: gajim/data/gui/profile_window.ui:947 #: gajim/data/gui/vcard_information_window.ui:1336 msgid "Work" msgstr "Práce" #. "About" is the text of a tab of vcard window #: gajim/data/gui/profile_window.ui:979 #: gajim/data/gui/vcard_information_window.ui:1368 #: gajim/data/gui/application_menu.ui:62 msgid "About" msgstr "Komentář" #: gajim/data/gui/filetransfers.ui:20 #, fuzzy msgid "Con_tinue" msgstr "_Pokračovat" #: gajim/data/gui/filetransfers.ui:28 gajim/data/gui/filetransfers.ui:156 msgid "_Pause" msgstr "_Pauza" #: gajim/data/gui/filetransfers.ui:36 gajim/data/gui/filetransfers.ui:174 #: gajim/data/gui/service_registration_window.ui:53 msgid "_Cancel" msgstr "_Zrušit" #: gajim/data/gui/filetransfers.ui:50 msgid "_Open Containing Folder" msgstr "_Otevřít obsahující složku" #: gajim/data/gui/filetransfers.ui:79 gajim/data/gui/filetransfers.ui:253 msgid "File Transfers" msgstr "Přenosy souborů" #: gajim/data/gui/filetransfers.ui:110 msgid "file transfers list" msgstr "výpis přenosů souborů" #: gajim/data/gui/filetransfers.ui:111 msgid "A list of active, completed and stopped file transfers" msgstr "Seznam aktivních, dokončených a zastavených přenosů souborů" #: gajim/data/gui/filetransfers.ui:131 msgid "Clean _up" msgstr "_Vymazat" #: gajim/data/gui/filetransfers.ui:137 msgid "Removes completed, cancelled and failed file transfers from the list" msgstr "Odstraní dokončené, zrušené nebo přenosy které selhaly, z výpisu" #: gajim/data/gui/filetransfers.ui:143 msgid "Remove file transfer from the list." msgstr "Odstranit přenos souboru ze výpisu." #: gajim/data/gui/filetransfers.ui:144 msgid "" "This action removes single file transfer from the list. If the transfer is " "active, it is first stopped and then removed" msgstr "" "Tato akce smaže jeden přenos souboru z výpisu. Pokud je přenos aktivní, bude " "nejdříve zastaven a potom smazán" #: gajim/data/gui/filetransfers.ui:180 #, fuzzy msgid "Cancels the selected file transfer and removes incomplete files" msgstr "Zruší vybraný přenos souboru a smaže nedokončený soubor" #: gajim/data/gui/filetransfers.ui:186 msgid "Cancel file transfer" msgstr "Zrušit přenos souboru" #: gajim/data/gui/filetransfers.ui:187 msgid "Cancels the selected file transfer" msgstr "Zruší vybraný přenos souboru" #: gajim/data/gui/filetransfers.ui:199 #, fuzzy msgid "_Close" msgstr "Ode_slat a zavřít" #: gajim/data/gui/filetransfers.ui:205 msgid "Hides the window" msgstr "Skryje okno" #: gajim/data/gui/filetransfers.ui:226 msgid "_Notify me when a file transfer is complete" msgstr "_Upozornit mě po dokončení přenosu souboru" #: gajim/data/gui/filetransfers.ui:236 msgid "When a file transfer is complete show a popup notification" msgstr "Zobraz upozornění, až bude přenos souboru dokončen" #: gajim/data/gui/filetransfers.ui:254 msgid "Shows a list of file transfers between you and others" msgstr "Zobrazí výpis přenosů souborů mezi Vámi a ostatními" #: gajim/data/gui/service_registration_window.ui:18 msgid "Register to" msgstr "Zaregistrovat" #: gajim/data/gui/service_registration_window.ui:70 #: gajim/data/gui/roster_item_exchange_window.ui:126 msgid "_OK" msgstr "_OK" #: gajim/data/gui/groupchat_control.ui:13 gajim/data/gui/chat_control.ui:293 #: gajim/data/gui/gajim_themes_window.ui:264 msgid "Bold" msgstr "Tučné" #: gajim/data/gui/groupchat_control.ui:22 gajim/data/gui/chat_control.ui:302 #: gajim/data/gui/gajim_themes_window.ui:284 msgid "Italic" msgstr "Latinka" #: gajim/data/gui/groupchat_control.ui:31 gajim/data/gui/chat_control.ui:311 msgid "Underline" msgstr "Podtrhnout" #: gajim/data/gui/groupchat_control.ui:40 gajim/data/gui/chat_control.ui:320 msgid "Strike" msgstr "Přeškrtnout" #: gajim/data/gui/groupchat_control.ui:62 gajim/data/gui/chat_control.ui:342 msgid "Font" msgstr "Font" #: gajim/data/gui/groupchat_control.ui:76 gajim/data/gui/chat_control.ui:356 #, fuzzy msgid "Clear formatting" msgstr "Smazat formátování" #: gajim/data/gui/groupchat_control.ui:283 gajim/data/gui/chat_control.ui:805 #, fuzzy msgid "Choose an encryption" msgstr "Vyber soubor k odeslání..." #: gajim/data/gui/groupchat_control.ui:329 gajim/data/gui/chat_control.ui:853 msgid "Show a list of emoticons (Alt+M)" msgstr "Zobraz seznam smajlíků (Alt+M)" #: gajim/data/gui/popup_notification_window.ui:55 #, fuzzy msgid "Event Type" msgstr "Událost" #: gajim/data/gui/popup_notification_window.ui:100 #, fuzzy msgid "Event desc" msgstr "Událost" #: gajim/data/gui/chat_control.ui:41 #, fuzzy msgid "1" msgstr "Písmo" #: gajim/data/gui/chat_control.ui:63 #, fuzzy msgid "2 abc" msgstr "Písmo" #: gajim/data/gui/chat_control.ui:84 #, fuzzy msgid "3 def" msgstr "Písmo" #: gajim/data/gui/chat_control.ui:105 #, fuzzy msgid "4 ghi" msgstr "Písmo" #: gajim/data/gui/chat_control.ui:126 #, fuzzy msgid "5 jkl" msgstr "Písmo" #: gajim/data/gui/chat_control.ui:147 #, fuzzy msgid "6 mno" msgstr "Písmo" #: gajim/data/gui/chat_control.ui:167 msgid "7 pqrs" msgstr "" #: gajim/data/gui/chat_control.ui:188 #, fuzzy msgid "8 tuv" msgstr "Písmo" #: gajim/data/gui/chat_control.ui:209 msgid "9 wxyz" msgstr "" #: gajim/data/gui/chat_control.ui:229 #, fuzzy msgid "*" msgstr "Písmo" #: gajim/data/gui/chat_control.ui:249 #, fuzzy msgid "0" msgstr "Písmo" #: gajim/data/gui/chat_control.ui:269 #, fuzzy msgid "#" msgstr "Písmo" #: gajim/data/gui/chat_control.ui:729 msgid "#" msgstr "č." #: gajim/data/gui/vcard_information_window.ui:55 msgid "Jabber ID:" msgstr "Jabber ID:" #: gajim/data/gui/vcard_information_window.ui:69 msgid "Resource:" msgstr "Zdroj:" #: gajim/data/gui/vcard_information_window.ui:83 msgid "Status:" msgstr "Stav:" #: gajim/data/gui/vcard_information_window.ui:97 msgid "Client:" msgstr "Klient:" #: gajim/data/gui/vcard_information_window.ui:111 msgid "System:" msgstr "Systému:" #: gajim/data/gui/vcard_information_window.ui:125 msgid "Contact time:" msgstr "Čas kontaktu:" #: gajim/data/gui/vcard_information_window.ui:222 #, fuzzy msgid "User avatar:" msgstr "Avatar:" #: gajim/data/gui/vcard_information_window.ui:234 #, fuzzy msgid "Configured avatar:" msgstr "Nastavit avatara" #. Given Name #: gajim/data/gui/vcard_information_window.ui:263 msgid "Ask:" msgstr "Žádá:" #. Family Name #: gajim/data/gui/vcard_information_window.ui:277 msgid "Subscription:" msgstr "Autorizace:" #: gajim/data/gui/vcard_information_window.ui:893 #: gajim/data/gui/vcard_information_window.ui:912 #: gajim/data/gui/vcard_information_window.ui:1310 msgid "button" msgstr "" #: gajim/data/gui/vcard_information_window.ui:1398 msgid "Comments" msgstr "Vlastní poznámky" #: gajim/data/gui/gajim_themes_window.ui:12 #, fuzzy msgid "Account row" msgstr "Účet" #: gajim/data/gui/gajim_themes_window.ui:15 #, fuzzy msgid "Group row" msgstr "Skupina" #: gajim/data/gui/gajim_themes_window.ui:18 #, fuzzy msgid "Contact row" msgstr "Kontakt" #: gajim/data/gui/gajim_themes_window.ui:21 msgid "Chat Banner" msgstr "" #: gajim/data/gui/gajim_themes_window.ui:28 msgid "Gajim Themes Customization" msgstr "Úprava témat Gajimu" #: gajim/data/gui/gajim_themes_window.ui:157 msgid "Text _color:" msgstr "_Barva textu:" #: gajim/data/gui/gajim_themes_window.ui:173 msgid "_Background:" msgstr "_Pozadí:" #: gajim/data/gui/gajim_themes_window.ui:189 msgid "Text _font:" msgstr "Písmo textu:" #: gajim/data/gui/gajim_themes_window.ui:207 msgid "Font style:" msgstr "Styly písma:" #: gajim/data/gui/gajim_themes_window.ui:375 msgid "Composing" msgstr "Píšu zprávu" #: gajim/data/gui/gajim_themes_window.ui:387 msgid "Paused" msgstr "Pozastaveno" #: gajim/data/gui/gajim_themes_window.ui:399 msgid "Gone" msgstr "Pryč" #: gajim/data/gui/gajim_themes_window.ui:411 msgid "" "MUC\n" "Messages" msgstr "" "Zprávy\n" "z MUC" # FIXME: I dont really know what this is and where it is #: gajim/data/gui/gajim_themes_window.ui:424 msgid "" "MUC Directed\n" "Messages" msgstr "" "MUC Directed\n" "Messages" # FIXME: better czech translation #: gajim/data/gui/gajim_themes_window.ui:510 msgid "Chatstate Tab Colors" msgstr "Barvy stavů u záložek rozhovoru" #: gajim/data/gui/preferences_window.ui:48 #, fuzzy msgid "Use default applications" msgstr "Vždy použít OS/X výchozí aplikace" #: gajim/data/gui/preferences_window.ui:51 msgid "Custom" msgstr "Vlastní" #: gajim/data/gui/preferences_window.ui:62 #: gajim/data/gui/preferences_window.ui:79 #, fuzzy msgid "All chat states" msgstr "Všechny stavy" #: gajim/data/gui/preferences_window.ui:65 #: gajim/data/gui/preferences_window.ui:82 #, fuzzy msgid "Composing only" msgstr "Píšu zprávu" #: gajim/data/gui/preferences_window.ui:99 #, fuzzy msgid "Only when pending events" msgstr "" "Nikdy\n" "Pouze při čekajících událostech\n" "Vždy" #: gajim/data/gui/preferences_window.ui:113 msgid "Pop it up" msgstr "" #: gajim/data/gui/preferences_window.ui:116 #, fuzzy msgid "Notify me about it" msgstr "Upozorni mě na kontakty které se odhlásí" #: gajim/data/gui/preferences_window.ui:119 #, fuzzy msgid "Show only in roster" msgstr "_Zobrazit událost v rosteru" #: gajim/data/gui/preferences_window.ui:130 msgid "Detached roster with detached chats" msgstr "" #: gajim/data/gui/preferences_window.ui:133 msgid "Detached roster with single chat" msgstr "" #: gajim/data/gui/preferences_window.ui:136 msgid "Single window for everything" msgstr "" #: gajim/data/gui/preferences_window.ui:139 msgid "Detached roster with chat grouped by account" msgstr "" #: gajim/data/gui/preferences_window.ui:142 msgid "Detached roster with chat grouped by type" msgstr "" #: gajim/data/gui/preferences_window.ui:159 #, fuzzy msgid "Last state" msgstr "Poslední stav: %s" #: gajim/data/gui/preferences_window.ui:195 #: gajim/data/gui/application_menu.ui:94 gajim/data/gui/shortcuts_window.ui:188 msgid "Preferences" msgstr "Nastavení" #: gajim/data/gui/preferences_window.ui:237 msgid "Display a_vatars of contacts in roster" msgstr "Zobrazovat a_vatary kontaktů v seznamu" #: gajim/data/gui/preferences_window.ui:241 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" msgstr "" "Pokud zaškrtnuto, Gajim bude zobrazovat avatary kontaktů v okně Seznamu a v " "diskuzích" #: gajim/data/gui/preferences_window.ui:255 msgid "Display status _messages of contacts in roster" msgstr "Zobrazovat p_opis stavu kontaktů v Seznamu" #: gajim/data/gui/preferences_window.ui:259 #, fuzzy msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name, in roster window and in group chats" msgstr "" "Pokud zaškrtnuto, Gajim bude zobrazovat popisy stavů kontaktů pod jménem v " "okně Seznamu a v diskuzích" #: gajim/data/gui/preferences_window.ui:273 #, fuzzy msgid "Display e_xtra information of contacts in roster (mood, activity, ...)" msgstr "Zobrazovat _nálady kontaktů v seznamu" #: gajim/data/gui/preferences_window.ui:277 msgid "" "If checked, Gajim will display the mood of contacts in the roster window" msgstr "" "Pokud zaškrtnuto, Gajim bude zobrazovat avatary kontaktů v okně Seznamu a v " "diskuzích" #: gajim/data/gui/preferences_window.ui:298 msgid "Sort contacts by status" msgstr "Seřadit podle stavu" #: gajim/data/gui/preferences_window.ui:308 msgid "in _roster" msgstr "v _rosteru" #: gajim/data/gui/preferences_window.ui:325 msgid "in _group chats" msgstr "v _diskuzích" #: gajim/data/gui/preferences_window.ui:354 msgid "Roster Appearance" msgstr "Vzhled Rosteru" #: gajim/data/gui/preferences_window.ui:384 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" msgstr "" "Pokud zaškrtnuto, Gajim nahradí ascii smajlíky jako ':)' za ekvivalentní " "animované nebo statické grafické smajlíky" #: gajim/data/gui/preferences_window.ui:390 msgid "_Emoticons:" msgstr "_Smajlíky:" #: gajim/data/gui/preferences_window.ui:406 msgid "_Window behavior:" msgstr "Chování _okna" #: gajim/data/gui/preferences_window.ui:420 #, fuzzy msgid "_Show roster on startup:" msgstr "Zobrazit _Seznam" #: gajim/data/gui/preferences_window.ui:431 msgid "_Ignore rich content in incoming messages" msgstr "_Ignoruj formátování v příchozích zprávách" #: gajim/data/gui/preferences_window.ui:435 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." msgstr "" "Některé zprávy mohou obsahovat formátování (odsazení, barvy aj.). Pokud je " "zaškrtnuto, Gajim zobrazí pouze čistý text." #: gajim/data/gui/preferences_window.ui:449 msgid "_Highlight misspelled words" msgstr "Zvýrazňovat _slova s překlepy" #: gajim/data/gui/preferences_window.ui:452 msgid "" "If checked, Gajim will highlight spelling errors in input fields of chat " "windows. If no language is explicitly set via right click on the input " "field, the default language will be used for this contact or group chat." msgstr "" "Pokud je zaškrtnuto, Gajim zvýrazní překlepy při psaní zprávy.Pokud není " "nastavení jazyk přes pravé tlačítko na vstupním poli, tak se použije výchozí " "jazyk pro tento kontakt nebo diskuzi." #: gajim/data/gui/preferences_window.ui:466 #, fuzzy msgid "Notify by icon when your messages are received" msgstr "Přehraný zvuk při příchodu jakékoliv MUC zprávy." #: gajim/data/gui/preferences_window.ui:520 msgid "Show avatar in chat tabs" msgstr "" #: gajim/data/gui/preferences_window.ui:552 msgid "Chat Appearance" msgstr "Vzhled diskuze" #: gajim/data/gui/preferences_window.ui:607 msgid "When new event is received:" msgstr "Když je přijata nová zpráva" #: gajim/data/gui/preferences_window.ui:645 msgid "Notify me about contacts that sign _in" msgstr "Upozorni mě na kontakty které se přihlásí" #: gajim/data/gui/preferences_window.ui:663 msgid "Notify me about contacts that sign _out" msgstr "Upozorni mě na kontakty které se odhlásí" #: gajim/data/gui/preferences_window.ui:667 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" msgstr "" "Gajim Vás upozorní o přávě odpojených kontaktech pomocí popupu v pravém " "dolním rohu obrazovky" #: gajim/data/gui/preferences_window.ui:681 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" msgstr "" "Povolit popup/upozornění pokud jsem _pryč/nedostupný/nerušit/neviditelný" #: gajim/data/gui/preferences_window.ui:698 #, fuzzy msgid "Allow popup/notifications when a chat window is opened" msgstr "" "Povolit popup/upozornění pokud jsem _pryč/nedostupný/nerušit/neviditelný" #: gajim/data/gui/preferences_window.ui:722 #, fuzzy msgid "Show notification area icon:" msgstr "Notification-daemon" #: gajim/data/gui/preferences_window.ui:762 msgid "Visual Notifications" msgstr "Vizuální upozornění" #: gajim/data/gui/preferences_window.ui:795 msgid "Play _sounds" msgstr "Přehrávat _zvuky" #: gajim/data/gui/preferences_window.ui:812 #: gajim/data/gui/preferences_window.ui:1656 msgid "Ma_nage..." msgstr "Sp_ravovat..." #: gajim/data/gui/preferences_window.ui:834 msgid "Allow sound when I'm _busy" msgstr "Povolit zvuk, když jsem zaneprázněn" #: gajim/data/gui/preferences_window.ui:856 msgid "Sounds" msgstr "Zvuky" #: gajim/data/gui/preferences_window.ui:877 msgid "Notifications" msgstr "Upozornění" #: gajim/data/gui/preferences_window.ui:911 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " "display in chat windows." msgstr "" "Gajim umí ohlašovat svoji schopnost posílat a přijímat meta-informace " "vztahující se k rozhovoru. Tady můžete nastavit, které stavy rozhovoru " "chcete zobrazovat v oknech rozhovoru." #: gajim/data/gui/preferences_window.ui:916 msgid "_Display chat state notifications:" msgstr "Zobrazovat _události stavu rozhovoru:" #: gajim/data/gui/preferences_window.ui:967 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " "send to the other party." msgstr "" "Gajim umí ohlašovat svoji schopnost posílat a přijímat meta-informace " "vztahující se k rozhovoru. Tady můžete nastavit, které stavy rozhovoru " "chcete posílat svému protějšku." #: gajim/data/gui/preferences_window.ui:972 msgid "_Send chat state notifications:" msgstr "Zobrazovat _události stavu rozhovoru:" #: gajim/data/gui/preferences_window.ui:990 msgid "Chat state notifications" msgstr "Vizuální upozornění" # FIXME: snad je to ok? #: gajim/data/gui/preferences_window.ui:1012 msgid "Personal Events" msgstr "Moje události" #: gajim/data/gui/preferences_window.ui:1043 msgid "_Away after:" msgstr "_Automaticky pryč po:" #: gajim/data/gui/preferences_window.ui:1047 msgid "" "If checked, Gajim will change status to Away when the computer is unused." msgstr "" "Pokud je zaškrtnuto, Gajim změnít stav na 'Pryč' pokud je počítač nepoužíván." #: gajim/data/gui/preferences_window.ui:1060 msgid "_Not available after:" msgstr "Automaticky _nedostupný po:" #: gajim/data/gui/preferences_window.ui:1064 msgid "" "If checked, Gajim will change status to Not Available when the computer has " "not been used even longer" msgstr "" "Pokud je zaškrtnuto, Gajim změní stav na 'Nedostupný' pokud se počítač " "nepoužívá delší dobu" #: gajim/data/gui/preferences_window.ui:1079 #: gajim/data/gui/preferences_window.ui:1091 msgid "minutes" msgstr "minutách" #: gajim/data/gui/preferences_window.ui:1103 msgid "" "The auto away status message. If empty, Gajim will not change the current " "status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-away timeout" msgstr "" "Popis stavu automatického stavu 'Pryč'. Pokud je prázdná, tak Gajim nezmění " "současný popis stavu\n" "$S se nahradí za předchozí popis stavu\n" "$T se nahradí dobou nečinnosti před zapnutím stavu Pryč" #: gajim/data/gui/preferences_window.ui:1117 msgid "" "The auto not available status message. If empty, Gajim will not change the " "current status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-not-available timeout" msgstr "" "Automatická popia stavu 'Nedostupný'. Pokud je prázdná, tak Gajim nezmění " "současný popis stavu\n" "$S se nahradí za předchozí popis stavu\n" "$T se nahradí dobou nečinnosti před zapnutím stavu Nedostupný" #: gajim/data/gui/preferences_window.ui:1165 msgid "Auto Status" msgstr "Automatický Stav" #: gajim/data/gui/preferences_window.ui:1200 msgid "Ask status message when I:" msgstr "Ptej se na stav při:" #: gajim/data/gui/preferences_window.ui:1215 msgid "Sign _in" msgstr "_Přihlásí" #: gajim/data/gui/preferences_window.ui:1232 msgid "Sign _out" msgstr "_Odhlásí" #: gajim/data/gui/preferences_window.ui:1265 msgid "" "If enabled, Gajim will not ask for a status message. The specified default " "message will be used instead." msgstr "" "Pokud zaškrtnuto, Gajim se nebude pokáždé ptát na zprávu stavu. Místo toho " "použije výchozí nadefinovanou zprávu." #: gajim/data/gui/preferences_window.ui:1277 #: gajim/data/gui/preferences_window.ui:1479 msgid "Status" msgstr "Stav" #: gajim/data/gui/preferences_window.ui:1288 msgid "Default Message" msgstr "Výchozí Zpráva" #: gajim/data/gui/preferences_window.ui:1303 msgid "Enabled" msgstr "Povolit" #: gajim/data/gui/preferences_window.ui:1329 msgid "Status Messages" msgstr "Přednastavené stavy" #: gajim/data/gui/preferences_window.ui:1459 msgid "Preset Status Messages" msgstr "Přednastavené stavy" #: gajim/data/gui/preferences_window.ui:1512 msgid "Chat message:" msgstr "Zpráva diskuze:" #: gajim/data/gui/preferences_window.ui:1537 msgid "Use system _default" msgstr "Použij nastavení _systému" #: gajim/data/gui/preferences_window.ui:1560 msgid "Font" msgstr "Písmo" #: gajim/data/gui/preferences_window.ui:1590 msgid "T_heme:" msgstr "_Téma:" #: gajim/data/gui/preferences_window.ui:1603 msgid "Status _iconset:" msgstr "Výchozí _ikony stavů:" #: gajim/data/gui/preferences_window.ui:1614 msgid "Use _transports icons" msgstr "Používat ikony _transportů" #: gajim/data/gui/preferences_window.ui:1618 #, fuzzy msgid "" "If checked, Gajim will use protocol-specific status icons. (e.g. A contact " "from ICQ will have the equivalent ICQ icon for status online, away, busy, " "etc...)" msgstr "" "Pokud zaškrtnuto, Gajim použije ikony specifické pro protokol (např. kontakt " "z MSN bude mít odpovídající ikonu msn pro stavy připojen, pryč, nerušit, " "atd...)" #: gajim/data/gui/preferences_window.ui:1660 msgid "Configure color and font of the interface" msgstr "Nastav barvu a písmo uživatelského rozhraní" #: gajim/data/gui/preferences_window.ui:1682 msgid "Themes" msgstr "Témata" #: gajim/data/gui/preferences_window.ui:1712 msgid "Contact's nickname:" msgstr "Přezdívka kontaktu:" #: gajim/data/gui/preferences_window.ui:1726 msgid "Contact's message:" msgstr "Zpráva kontaktu:" #: gajim/data/gui/preferences_window.ui:1738 msgid "_Status message:" msgstr "_Stav:" #: gajim/data/gui/preferences_window.ui:1752 #, fuzzy msgid "Group chat highlight:" msgstr "Zvýraznění zprávy v diskuzi" #: gajim/data/gui/preferences_window.ui:1890 msgid "Your nickname:" msgstr "Vaše přezdívka:" #: gajim/data/gui/preferences_window.ui:1904 msgid "Your message:" msgstr "Vaše zpráva:" #: gajim/data/gui/preferences_window.ui:1916 msgid "_URL highlight:" msgstr "Zvýraznění _URL:" #: gajim/data/gui/preferences_window.ui:2041 msgid "_Reset to Default Colors" msgstr "_Vrátit k výchozím barvám" # FIXME: better czech translation -co takhle? #: gajim/data/gui/preferences_window.ui:2075 msgid "Chat Line Colors" msgstr "Barvy Řádků V Diskuzi" #: gajim/data/gui/preferences_window.ui:2095 msgid "Style" msgstr "Styl" #: gajim/data/gui/preferences_window.ui:2128 #, fuzzy msgid "Audio input device" msgstr "Audio vstupní zařízení" #: gajim/data/gui/preferences_window.ui:2140 #, fuzzy msgid "Audio output device" msgstr "Audio výstupní zařízení" #: gajim/data/gui/preferences_window.ui:2176 #, fuzzy msgid "Audio" msgstr "Akce" #: gajim/data/gui/preferences_window.ui:2206 #, fuzzy msgid "Video input device" msgstr "Video vstupní zařízení" #: gajim/data/gui/preferences_window.ui:2218 #, fuzzy msgid "Video output device" msgstr "Video výstupní zařízení" #: gajim/data/gui/preferences_window.ui:2230 msgid "Video framerate" msgstr "" #: gajim/data/gui/preferences_window.ui:2242 #, fuzzy msgid "Video size" msgstr "Velikost videa" #: gajim/data/gui/preferences_window.ui:2252 msgid "View own video source" msgstr "" #: gajim/data/gui/preferences_window.ui:2316 #, fuzzy msgid "Video" msgstr "Prostřední:" #: gajim/data/gui/preferences_window.ui:2346 #, fuzzy msgid "STUN server:" msgstr "Server:" #: gajim/data/gui/preferences_window.ui:2372 msgid "" "STUN server hostname. If none given, Gajim will try\n" "to discover one from server." msgstr "" #: gajim/data/gui/preferences_window.ui:2386 #, fuzzy msgid "(example: stun.iptel.org)" msgstr "(například: stunserver.org)" #: gajim/data/gui/preferences_window.ui:2400 #, fuzzy msgid "Connection" msgstr "Podmínky" #: gajim/data/gui/preferences_window.ui:2485 msgid "_Mail client:" msgstr "E-_mailový klient:" #: gajim/data/gui/preferences_window.ui:2498 msgid "_Browser:" msgstr "_Prohlížeč:" #: gajim/data/gui/preferences_window.ui:2511 msgid "_File manager:" msgstr "_Správce souborů:" #. a header for custom browser/client/file manager. so translate sth like: Custom Settings #: gajim/data/gui/preferences_window.ui:2559 msgid "Custom" msgstr "Vlastní" #: gajim/data/gui/preferences_window.ui:2576 msgid "Applications" msgstr "Aplikace" #: gajim/data/gui/preferences_window.ui:2604 msgid "_Ignore events from contacts not in the roster" msgstr "_Ignorovat události od kontaktů mimo můj Seznam" #: gajim/data/gui/preferences_window.ui:2608 msgid "" "If checked, Gajim will ignore incoming events from unauthorized contacts. " "Use with caution, because it blocks all messages from any contact that is " "not in the roster" msgstr "" "Zaškrtněte pouze pokud Vás obtěžuje někdo, koho nemáte v rosteru. Použijte s " "rozvahou, protože tato volba zakáže všechny zprávy od kontaktů, které ještě " "nemáte v rosteru" #: gajim/data/gui/preferences_window.ui:2622 #, fuzzy msgid "Allow client / _OS information to be sent" msgstr "Povolit odeslání informace o _OS" #: gajim/data/gui/preferences_window.ui:2626 msgid "" "If checked, Gajim will allow others to detect the operation system you are " "using" msgstr "Pokud je zaškrtnuto, Gajim se připojí do této místnosti při spuštění" #: gajim/data/gui/preferences_window.ui:2640 #, fuzzy msgid "Allow local system time information to be sent" msgstr "Povolit odeslání informace o _OS" #: gajim/data/gui/preferences_window.ui:2644 #, fuzzy msgid "If checked, Gajim will allow others to detect the time on your system" msgstr "Pokud je zaškrtnuto, Gajim se připojí do této místnosti při spuštění" #: gajim/data/gui/preferences_window.ui:2658 msgid "Log _encrypted chat session" msgstr "Logovat šifrované rozhovory" #: gajim/data/gui/preferences_window.ui:2662 #, fuzzy msgid "" "If checked, Gajim will keep logs for encrypted messages. Please note that " "when using End-to-End encryption the remote party has to agree on logging, " "else the messages will not be logged." msgstr "" "Pokud je zaškrtnuto, Gajim ponechá záznamy šifrovaných zpráv. Avšak při " "použití E2E musí protějšek souhlasit se záznamem, jinak zprávy nebudou " "zaznamenávány." #: gajim/data/gui/preferences_window.ui:2676 #, fuzzy msgid "Allow my _idle time to be sent" msgstr "Povolit odeslání informace o _OS" #: gajim/data/gui/preferences_window.ui:2695 msgid "Global proxy:" msgstr "" #: gajim/data/gui/preferences_window.ui:2724 msgid "_Manage..." msgstr "_Spravovat..." #: gajim/data/gui/preferences_window.ui:2743 msgid "Privacy" msgstr "Soukromí" #: gajim/data/gui/preferences_window.ui:2770 msgid "_Log status changes of contacts" msgstr "Zaznamenávat změny _stavu kontaktů" #: gajim/data/gui/preferences_window.ui:2791 msgid "Miscellaneous" msgstr "Příslušenství" #: gajim/data/gui/preferences_window.ui:2810 msgid "_Open..." msgstr "_Otevřít..." #: gajim/data/gui/preferences_window.ui:2826 msgid "Advanced Configuration Editor" msgstr "Editor rozšířeného nastavení" #: gajim/data/gui/contact_context_menu.ui:12 msgid "Start _Chat" msgstr "Začít _rozhovor" #: gajim/data/gui/contact_context_menu.ui:20 #: gajim/data/gui/systray_context_menu.ui:36 msgid "Send Single _Message..." msgstr "Odeslat jednoduchou _zprávu..." #: gajim/data/gui/contact_context_menu.ui:28 msgid "Send _File..." msgstr "Odeslat _Soubor" #: gajim/data/gui/contact_context_menu.ui:44 msgid "Invite _Contacts" msgstr "Pozvat kontakt" #: gajim/data/gui/contact_context_menu.ui:73 msgid "E_xecute Command..." msgstr "P_rovést příkaz..." #: gajim/data/gui/contact_context_menu.ui:82 #, fuzzy msgid "M_anage Contact" msgstr "_Spravovat kontakt" #: gajim/data/gui/contact_context_menu.ui:92 msgid "_Rename..." msgstr "_Přejmenovat" #: gajim/data/gui/contact_context_menu.ui:99 msgid "Edit _Groups..." msgstr "Upravit _skupiny" #: gajim/data/gui/contact_context_menu.ui:106 msgid "Assign Open_PGP Key..." msgstr "Přiřadit Open_PGP Klíč..." #: gajim/data/gui/contact_context_menu.ui:115 msgid "Add Special _Notification..." msgstr "Přidat zvláštní _upozornění" #: gajim/data/gui/contact_context_menu.ui:129 msgid "_Subscription" msgstr "_Autorizace" #: gajim/data/gui/contact_context_menu.ui:138 #, fuzzy msgid "_Allow contact to see my status" msgstr "Dovol kontaktu vidět můj stav" #: gajim/data/gui/contact_context_menu.ui:146 #, fuzzy msgid "A_sk to see contact status" msgstr "Požádat o zobrazení je(jí)ho _stavu" #: gajim/data/gui/contact_context_menu.ui:154 #, fuzzy msgid "_Forbid contact to see my status" msgstr "_Zakaž mu/jí vidět můj stav" #: gajim/data/gui/contact_context_menu.ui:182 msgid "_Unignore" msgstr "_Neignorovat" #: gajim/data/gui/contact_context_menu.ui:190 msgid "_Ignore" msgstr "_Ignorovat" #: gajim/data/gui/contact_context_menu.ui:197 #: gajim/data/gui/chat_context_menu.ui:66 msgid "_Add to Roster..." msgstr "Přid_at do Seznamu" #: gajim/data/gui/account_creation_wizard_window.ui:43 msgid "Gajim: Account Creation Wizard" msgstr "Gajim: Průvodce vytváření účtu" #: gajim/data/gui/account_creation_wizard_window.ui:70 msgid "" "You need to have an account in order to connect\n" "to the Jabber network." msgstr "Potřebujete mít účet pro připojení k síti Jabber." #: gajim/data/gui/account_creation_wizard_window.ui:95 msgid "I already have an account I want to _use" msgstr "Už mám účet který bych rád(a) použil(a)" #: gajim/data/gui/account_creation_wizard_window.ui:112 msgid "I want to _register for a new account" msgstr "Chtěl(a) bych za_registrovat nový účet" #: gajim/data/gui/account_creation_wizard_window.ui:133 msgid "Please choose one of the options below:" msgstr "Prosím zvolte z následujících možností:" #: gajim/data/gui/account_creation_wizard_window.ui:167 msgid "Please fill in the data for your existing account" msgstr "Prosím vyplňte údaje pro Váš nový účet" #: gajim/data/gui/account_creation_wizard_window.ui:187 msgid "_Jabber ID:" msgstr "_Jabber ID:" #: gajim/data/gui/account_creation_wizard_window.ui:239 #: gajim/data/gui/account_creation_wizard_window.ui:394 msgid "Anon_ymous authentication" msgstr "Anon_ymní autentizace" #: gajim/data/gui/account_creation_wizard_window.ui:259 #: gajim/data/gui/manage_bookmarks_window.ui:172 msgid "_Password:" msgstr "_Heslo:" #: gajim/data/gui/account_creation_wizard_window.ui:281 msgid "Save pass_word" msgstr "Uložit _heslo" #: gajim/data/gui/account_creation_wizard_window.ui:285 msgid "If checked, Gajim will remember the password for this account" msgstr "Pokud bude zaškrtnuto, Gajim si bude pamatovat heslo pro tento účet" #: gajim/data/gui/account_creation_wizard_window.ui:339 msgid "Please select a server" msgstr "Prosím Vyberte server" #: gajim/data/gui/account_creation_wizard_window.ui:358 #: gajim/data/gui/manage_bookmarks_window.ui:159 msgid "_Server:" msgstr "_Server:" #: gajim/data/gui/account_creation_wizard_window.ui:423 msgid "Prox_y:" msgstr "Prox_y:" #: gajim/data/gui/account_creation_wizard_window.ui:450 msgid "Manage..." msgstr "Spravovat..." #: gajim/data/gui/account_creation_wizard_window.ui:465 msgid "Use custom hostname/port" msgstr "Použít vlastní jméno počítače/port" #: gajim/data/gui/account_creation_wizard_window.ui:491 msgid "_Hostname:" msgstr "Počítač: " #: gajim/data/gui/account_creation_wizard_window.ui:517 msgid "_Port:" msgstr "_Port:" #: gajim/data/gui/account_creation_wizard_window.ui:553 #: gajim/data/gui/account_creation_wizard_window.ui:884 msgid "_Advanced" msgstr "_Rozšířené" #: gajim/data/gui/account_creation_wizard_window.ui:624 msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA1 fingerprint of the certificate:\n" msgstr "" "Přidat tento certifikát do důvěryhodných.\n" "SHA1 otisk certifikátu:\n" #: gajim/data/gui/account_creation_wizard_window.ui:687 msgid "" "Connecting to server\n" "\n" "Please wait..." msgstr "" "Vytváří se účet\n" "\n" "Prosím čekejte..." #: gajim/data/gui/account_creation_wizard_window.ui:772 msgid "Connect when I press Finish" msgstr "Připojit když stisknu Dokončit" #: gajim/data/gui/account_creation_wizard_window.ui:789 msgid "Set my profile when I connect" msgstr "Nastavit profil, když se připojuji" #: gajim/data/gui/account_creation_wizard_window.ui:901 msgid "_Finish" msgstr "_Dokončit" #: gajim/data/gui/privacy_lists_window.ui:34 msgid "Privacy Lists:" msgstr "Nastavení Soukromí:" #: gajim/data/gui/service_discovery_window.ui:84 msgid "_Address:" msgstr "_Adresa:" #: gajim/data/gui/service_discovery_window.ui:115 msgid "G_o" msgstr "_Jdi" #: gajim/data/gui/synchronise_select_contacts_dialog.ui:8 msgid "Synchronise : select contacts" msgstr "Synchronizace: vybrat kontakty" #: gajim/data/gui/synchronise_select_contacts_dialog.ui:67 msgid "Select the contacts you want to synchronise" msgstr "JID kontaktu, se kterým chcete komunikovat" #: gajim/data/gui/edit_groups_dialog.ui:8 msgid "Edit Groups" msgstr "Upravit skupiny" #: gajim/data/gui/search_window.ui:42 msgid "Please wait while retrieving search form..." msgstr "Prosím vyčkejte než stáhnu seznam příkazů..." #: gajim/data/gui/search_window.ui:80 msgid "_Add contact" msgstr "Přidat _kontakt" #: gajim/data/gui/search_window.ui:116 msgid "_Search" msgstr "_Najít" #: gajim/data/gui/chat_context_menu.ui:11 msgid "_Copy Link Location" msgstr "_Kopírovat odkaz" #: gajim/data/gui/chat_context_menu.ui:19 msgid "_Open Link in Browser" msgstr "_Otevřít v prohlížeči" #: gajim/data/gui/chat_context_menu.ui:27 msgid "_Copy JID/Email Address" msgstr "_Kopírovat JID/Emailovou adresu" #: gajim/data/gui/chat_context_menu.ui:35 msgid "_Open Email Composer" msgstr "_Otevři Emailový editor" #: gajim/data/gui/chat_context_menu.ui:49 #: gajim/data/gui/subscription_request_window.ui:12 msgid "_Start Chat" msgstr "_Začít rozhovor" #: gajim/data/gui/chat_context_menu.ui:57 #: gajim/data/gui/account_context_menu.ui:35 #: gajim/data/gui/systray_context_menu.ui:28 msgid "Join _Group Chat" msgstr "Vstoupit do _Diskuze" # FIXME: not accurate #: gajim/data/gui/change_status_message_dialog.ui:131 msgid "Save as Preset..." msgstr "Uložit stav..." #: gajim/data/gui/change_status_message_dialog.ui:167 msgid "Preset messages:" msgstr "Uložené stavy:" #: gajim/data/gui/change_status_message_dialog.ui:313 msgid "Type your new status message" msgstr "Napište nový popis stavu" #: gajim/data/gui/synchronise_select_account_dialog.ui:8 msgid "Synchronise contacts" msgstr "Synchronizovat kontakty" #: gajim/data/gui/synchronise_select_account_dialog.ui:68 msgid "Select the account with which you want to synchronise" msgstr "Vybrat účet pro synchronizaci" #: gajim/data/gui/archiving_313_preferences_window.ui:28 #, fuzzy msgid "Roster" msgstr "Zobrazit _Seznam" #: gajim/data/gui/archiving_313_preferences_window.ui:85 #, fuzzy msgid "Preference" msgstr "Nastavení" #: gajim/data/gui/archiving_313_preferences_window.ui:159 #, fuzzy msgid "Default:" msgstr "Výchozí" #: gajim/data/gui/voip_call_received_dialog.ui:15 msgid "Incoming call" msgstr "" #: gajim/data/gui/add_new_contact_window.ui:29 msgid "Add New Contact" msgstr "Přidat nový kontakt" #: gajim/data/gui/add_new_contact_window.ui:62 msgid "A_ccount:" msgstr "Úče_t: " #: gajim/data/gui/add_new_contact_window.ui:110 msgid "_Protocol:" msgstr "P_rotokol:" #: gajim/data/gui/add_new_contact_window.ui:169 msgid "_User ID:" msgstr "_Uživatel:" #: gajim/data/gui/add_new_contact_window.ui:182 #: gajim/data/gui/manage_bookmarks_window.ui:133 msgid "_Nickname:" msgstr "_Přezdívka:" #: gajim/data/gui/add_new_contact_window.ui:195 msgid "_Group:" msgstr "_Skupina:" #: gajim/data/gui/add_new_contact_window.ui:210 #, fuzzy msgid "Type User ID" msgstr "Uživatel:" #: gajim/data/gui/add_new_contact_window.ui:223 #, fuzzy msgid "Type Nickname" msgstr "Přezdívka" #: gajim/data/gui/add_new_contact_window.ui:239 msgid "Choose a group of type a new group" msgstr "" #: gajim/data/gui/add_new_contact_window.ui:257 msgid "A_llow this contact to view my status" msgstr "Dovol kontaktu vidět můj stav" #: gajim/data/gui/add_new_contact_window.ui:300 #, fuzzy msgid "_Save subscription message" msgstr "_Autorizace" #: gajim/data/gui/add_new_contact_window.ui:325 #, fuzzy msgid "" "You have to register with this transport\n" "to be able to add a contact from this\n" "protocol. Click on Register button to\n" "proceed." msgstr "" "Musíš se zaregistrovat s tímto transportem,\n" "abys mohl(a) přidat kontakty z tohoto protokolu.\n" "Klikni na tlačítko registrovat pro pokračování." #: gajim/data/gui/add_new_contact_window.ui:340 msgid "_Register" msgstr "_Registrovat" #: gajim/data/gui/add_new_contact_window.ui:369 msgid "" "You must be connected to the transport to be able\n" "to add a contact from this protocol." msgstr "" "Musíš být připojen(á) k trasportu před přidáním\n" " kontaktu z tohoto protokolu." #: gajim/data/gui/roster_window.ui:61 #, fuzzy msgid "Change Status Message…" msgstr "Z_měnit popis stavu" #: gajim/data/gui/change_mood_dialog.ui:73 msgid "Mood:" msgstr "Nálada:" #: gajim/data/gui/change_mood_dialog.ui:85 msgid "Message:" msgstr "Zpráva:" #: gajim/data/gui/plugins_window.ui:25 gajim/data/gui/application_menu.ui:90 msgid "Plugins" msgstr "" #: gajim/data/gui/plugins_window.ui:78 msgid "Install from zip" msgstr "" #: gajim/data/gui/plugins_window.ui:109 msgid "<empty>" msgstr "" #: gajim/data/gui/plugins_window.ui:131 #, fuzzy msgid "Version:" msgstr "GTK+ verze: " #: gajim/data/gui/plugins_window.ui:169 #, fuzzy msgid "Authors:" msgstr "Au_torizuj" #: gajim/data/gui/plugins_window.ui:210 msgid "Homepage:" msgstr "Dom. stránka:" #: gajim/data/gui/plugins_window.ui:253 #, fuzzy msgid "Description:" msgstr "Popis:" #: gajim/data/gui/plugins_window.ui:301 msgid "Uninstall" msgstr "" #: gajim/data/gui/plugins_window.ui:316 #, fuzzy msgid "Configure" msgstr "_Nastavit" #: gajim/data/gui/plugins_window.ui:348 #, fuzzy msgid "Installed" msgstr "Stagnuje" #: gajim/data/gui/plugins_window.ui:399 msgid "" "Plug-in decription should be displayed here. This text will be erased during " "PluginsWindow initialization." msgstr "" #: gajim/data/gui/privacy_list_window.ui:18 #, fuzzy msgid "none" msgstr "jeden" #: gajim/data/gui/privacy_list_window.ui:21 #, fuzzy msgid "both" msgstr "Oboustranná" #: gajim/data/gui/privacy_list_window.ui:24 #, fuzzy msgid "from" msgstr "Odesílatel" #: gajim/data/gui/privacy_list_window.ui:27 #, fuzzy msgid "to" msgstr "dva" #: gajim/data/gui/privacy_list_window.ui:66 msgid "Privacy List" msgstr "Nastavení Soukromí" #: gajim/data/gui/privacy_list_window.ui:77 msgid "Active for this session" msgstr "Aktivní pro toto sezení" #: gajim/data/gui/privacy_list_window.ui:94 msgid "Active on each startup" msgstr "Aktivní při každém startu" #: gajim/data/gui/privacy_list_window.ui:132 msgid "List of rules" msgstr "Seznam pravidel" #: gajim/data/gui/privacy_list_window.ui:244 msgid "Add / Edit a rule" msgstr "Přidej / Uprav pravidlo" #: gajim/data/gui/privacy_list_window.ui:266 msgid "Allow" msgstr "Povolit" #: gajim/data/gui/privacy_list_window.ui:282 msgid "Deny" msgstr "Odmítnout" #: gajim/data/gui/privacy_list_window.ui:317 msgid "JabberID" msgstr "Jabber ID" #: gajim/data/gui/privacy_list_window.ui:358 msgid "all in the group" msgstr "všem ve skupině" #: gajim/data/gui/privacy_list_window.ui:407 msgid "all by subscription" msgstr "všechny podle autorizace" #: gajim/data/gui/privacy_list_window.ui:456 msgid "All" msgstr "Vše" #: gajim/data/gui/privacy_list_window.ui:493 msgid "to send me messages" msgstr "odeslat zprávu" #: gajim/data/gui/privacy_list_window.ui:509 msgid "to send me queries" msgstr "pro zaslání dotazu" #: gajim/data/gui/privacy_list_window.ui:525 msgid "to view my status" msgstr "Dovol mu/jí vidět můj stav" #: gajim/data/gui/privacy_list_window.ui:541 msgid "to send me status" msgstr "Požádat o zobrazení je(jí)ho stavu" #: gajim/data/gui/privacy_list_window.ui:557 msgid "All (including subscription)" msgstr "Všechno (včetně autorizací)" #: gajim/data/gui/privacy_list_window.ui:598 msgid "Order:" msgstr "Pořadí:" #: gajim/data/gui/manage_sounds_window.ui:10 #, fuzzy msgid "Manage sounds" msgstr "Spravovat účty" #: gajim/data/gui/remove_account_window.ui:56 msgid "Remove account _only from Gajim" msgstr "Odstranit účet _pouze z Gajimu" #: gajim/data/gui/remove_account_window.ui:73 msgid "Remove account from Gajim and from _server" msgstr "Odstranit účet z Gajimu i ze _serveru" #: gajim/data/gui/remove_account_window.ui:94 msgid "What do you want to do?" msgstr "Co by jste rád(a) dělal(a)?" #: gajim/data/gui/adhoc_commands_window.ui:35 msgid "Please wait while retrieving command list..." msgstr "Prosím vyčkejte než stáhnu seznam příkazů..." #: gajim/data/gui/adhoc_commands_window.ui:93 msgid "Choose command to execute:" msgstr "Vyber příkaz k provedení:" #: gajim/data/gui/adhoc_commands_window.ui:136 #: gajim/data/gui/adhoc_commands_window.ui:277 msgid "Check once more" msgstr "Zkontroluj ještě jednou" #: gajim/data/gui/adhoc_commands_window.ui:194 #, fuzzy msgid "Please wait while the command is being sent..." msgstr "Prosím vyčkejte než bude příkaz odeslán..." #: gajim/data/gui/adhoc_commands_window.ui:211 msgid "Please wait..." msgstr "Prosím čekejte..." #: gajim/data/gui/adhoc_commands_window.ui:257 msgid "This jabber entity does not expose any commands." msgstr "Tento kontakt neobsahuje žádné příkazy." #: gajim/data/gui/adhoc_commands_window.ui:336 msgid "An error has occurred:" msgstr "Nastala chyba:" #: gajim/data/gui/adhoc_commands_window.ui:465 #, fuzzy msgid "F_inish" msgstr "_Dokončit" #: gajim/data/gui/account_context_menu.ui:20 msgid "_Personal Events" msgstr "Osobní údaje" #: gajim/data/gui/account_context_menu.ui:49 msgid "_Add Contact..." msgstr "Přid_at kontakt..." # FIXME: chtelo by to cesky vyraz pro service discovery #: gajim/data/gui/account_context_menu.ui:57 msgid "_Discover Services" msgstr "_Prohlížet služby" #: gajim/data/gui/account_context_menu.ui:65 msgid "_Execute Command..." msgstr "Provést příkaz..." #: gajim/data/gui/esession_info_window.ui:50 msgid "_Verify" msgstr "_Kontroluj" #: gajim/data/gui/esession_info_window.ui:137 msgid "(ESession info)" msgstr "(ESession informace)" #: gajim/data/gui/application_menu.ui:8 #, fuzzy msgid "View" msgstr "_Zobraz" #: gajim/data/gui/application_menu.ui:11 #, fuzzy msgid "Show Roster" msgstr "Zobrazit _Seznam" #: gajim/data/gui/application_menu.ui:16 #, fuzzy msgid "Show Offline Contacts" msgstr "Zobrazit _odpojené kontakty" #: gajim/data/gui/application_menu.ui:21 #, fuzzy msgid "Show Active Contacts" msgstr "Zobrazit pouze _aktivní kontakty" #: gajim/data/gui/application_menu.ui:26 #, fuzzy msgid "Show Transports" msgstr "Zobrazuj trans_porty" #: gajim/data/gui/application_menu.ui:43 #, fuzzy msgid "Help" msgstr "_Nápověda" #: gajim/data/gui/application_menu.ui:46 #, fuzzy msgid "Contents" msgstr "_Obsah" #: gajim/data/gui/application_menu.ui:50 #, fuzzy msgid "FAQ" msgstr "_FAQ" #: gajim/data/gui/application_menu.ui:54 msgid "Keyboard Shortcuts" msgstr "" #: gajim/data/gui/application_menu.ui:58 gajim/data/gui/features_window.ui:9 msgid "Features" msgstr "Vlastnosti serveru" #: gajim/data/gui/application_menu.ui:76 msgid "Start Chat" msgstr "Začít rozhovor" #: gajim/data/gui/application_menu.ui:81 #, fuzzy msgid "Bookmarks" msgstr "_Záložky" #: gajim/data/gui/application_menu.ui:99 #, fuzzy msgid "Quit" msgstr "_Konec" #: gajim/data/gui/features_window.ui:26 msgid "List of possible features in Gajim:" msgstr "Seznam dostupných vlastností v Gajimu: " #: gajim/data/gui/manage_bookmarks_window.ui:14 msgid "Manage Bookmarks" msgstr "Spravovat záložky" #: gajim/data/gui/manage_bookmarks_window.ui:120 #, fuzzy msgid "_Title:" msgstr "Titul:" #: gajim/data/gui/manage_bookmarks_window.ui:146 msgid "Roo_m:" msgstr "" #: gajim/data/gui/manage_bookmarks_window.ui:188 #, fuzzy msgid "A_uto join" msgstr "Automaticky vstoupit" #: gajim/data/gui/manage_bookmarks_window.ui:193 msgid "If checked, Gajim will join this group chat on startup" msgstr "Pokud je zaškrtnuto, Gajim se připojí do této místnosti při spuštění" #: gajim/data/gui/manage_bookmarks_window.ui:207 #, fuzzy msgid "Minimi_ze on Auto Join" msgstr "Minimalizovat po připojení" #: gajim/data/gui/manage_bookmarks_window.ui:235 #, fuzzy msgid "Pr_int status:" msgstr "Vypiš stav:" #: gajim/data/gui/exception_dialog.ui:45 #, fuzzy msgid "" "A programming error has been detected. It probably is not fatal, but should " "be reported to the developers nonetheless." msgstr "Pravděpodobně není fatální, ale přesto by měla být ohlášena vývojářům." #: gajim/data/gui/exception_dialog.ui:115 #, fuzzy msgid "Report Bug" msgstr "_Ohlásit chybu" #: gajim/data/gui/subscription_request_window.ui:95 msgid "_Deny" msgstr "O_dmítnout" #: gajim/data/gui/subscription_request_window.ui:100 msgid "" "Deny authorization from contact so he or she cannot know when you're " "connected" msgstr "Odmítne autorizaci od kontaktu, takže nezjistí kdy jste připojen(a)" #: gajim/data/gui/subscription_request_window.ui:133 msgid "Au_thorize" msgstr "Au_torizuj" #: gajim/data/gui/subscription_request_window.ui:138 msgid "Authorize contact so he or she can know when you're connected" msgstr "Autorizovat kontakt, aby věděl kdy jsi připojený(á)" #: gajim/data/gui/xml_console_window.ui:121 #, fuzzy msgid "Presence" msgstr "_Stav" #: gajim/data/gui/xml_console_window.ui:134 msgid "Iq" msgstr "" #: gajim/data/gui/xml_console_window.ui:149 #, fuzzy msgid "Presets" msgstr "_Stav" #: gajim/data/gui/chat_to_muc_window.ui:24 msgid "Invite Friends!" msgstr "Pozvat přátele !" #: gajim/data/gui/chat_to_muc_window.ui:39 #, fuzzy msgid "" "You are now entering a groupchat.\n" "Select the contacts you want to invite" msgstr "" "Začátek Více-uživatelského rozhovoru.\n" "Vyberte kontakty, které chcete pozvat" #: gajim/data/gui/chat_to_muc_window.ui:67 #: gajim/data/gui/chat_to_muc_window.ui:78 msgid "column" msgstr "" #: gajim/data/gui/chat_to_muc_window.ui:112 msgid "Please select a MUC server." msgstr "Prosím, vyberte MUC server." #: gajim/data/gui/chat_to_muc_window.ui:141 msgid "MUC server" msgstr "MUC server" #: gajim/data/gui/chat_to_muc_window.ui:176 msgid "In_vite" msgstr "_Pozvat do" #: gajim/data/gui/history_manager.ui:11 #, fuzzy msgid "_Export" msgstr "Export" #: gajim/data/gui/history_manager.ui:97 msgid "Gajim History Logs Manager" msgstr "Gajimův Správce Historie" #: gajim/data/gui/history_manager.ui:154 msgid "Welcome to Gajim History Logs Manager" msgstr "Vítejte do Gajimova Správce Historie" #: gajim/data/gui/history_manager.ui:168 msgid "" "This log manager is not intended for log viewing. If you are looking for " "such functionality, use the history window instead.\n" "\n" "Use this program to delete or export logs. You can select logs from the left " "and/or search database from below." msgstr "" "Tento správce logů není určený pro jejich prohlížení. Místo toho použijte " "okno s historií.\n" "\n" "Použijte tento program pro mazání nebo export zpráv. Můžete vybrat logy " "vlevo a/nebo je dole vyhledat v databázi." #: gajim/data/gui/history_manager.ui:184 msgid "" "WARNING:\n" "If you plan to do massive deletions, please make sure Gajim is not running. " "Generally avoid deletions with contacts you currently chat with." msgstr "" "VAROVÁNÍ:\n" "Pokud plánujete rozsáhlé promazání, ujistěte se, že Gajim neběží. Obecně se " "vyvarujte mazání historie kontaktu, se kterým si právě píšete." #: gajim/data/gui/history_manager.ui:283 msgid "_Search Database" msgstr "_Hledat v databázi" #: gajim/data/gui/shortcuts_window.ui:8 msgid "Chat Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:12 #, fuzzy msgid "Message composition" msgstr "Obsah zprávy" #: gajim/data/gui/shortcuts_window.ui:17 #, fuzzy msgid "Send the message" msgstr "Odeslat zprávu" #: gajim/data/gui/shortcuts_window.ui:24 #, fuzzy msgid "Create a new line" msgstr "Vytvoř nový zápis" #: gajim/data/gui/shortcuts_window.ui:31 msgid "Select an emoticon" msgstr "" #: gajim/data/gui/shortcuts_window.ui:38 msgid "Complete a command or a nick" msgstr "" #: gajim/data/gui/shortcuts_window.ui:45 #, fuzzy msgid "Previous sent message" msgstr "Uložené stavy:" #: gajim/data/gui/shortcuts_window.ui:52 #, fuzzy msgid "Next sent messages" msgstr "Uložené stavy:" #: gajim/data/gui/shortcuts_window.ui:59 #, fuzzy msgid "Quote previous message" msgstr "text stavu" #: gajim/data/gui/shortcuts_window.ui:66 #, fuzzy msgid "Quote next message" msgstr "Odeslat zprávu" #: gajim/data/gui/shortcuts_window.ui:73 #, fuzzy msgid "Clear message entry" msgstr "Zpráva odeslána" #: gajim/data/gui/shortcuts_window.ui:81 gajim/data/gui/shortcuts_window.ui:231 #, fuzzy msgid "Appearance" msgstr "Vzhled diskuze" #: gajim/data/gui/shortcuts_window.ui:86 msgid "Toggle full / compact view" msgstr "" #: gajim/data/gui/shortcuts_window.ui:94 #, fuzzy msgid "Recent history" msgstr "Nedávno:" #: gajim/data/gui/shortcuts_window.ui:99 msgid "Scroll up" msgstr "" #: gajim/data/gui/shortcuts_window.ui:106 msgid "Scroll down" msgstr "" #: gajim/data/gui/shortcuts_window.ui:121 msgid "Tabs" msgstr "" #: gajim/data/gui/shortcuts_window.ui:126 msgid "Switch to the previous tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:133 msgid "Switch to the next tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:140 msgid "Switch to the first - ninth tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:147 msgid "Switch to the previous unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:154 msgid "Switch to the next unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:161 #, fuzzy msgid "Close chat" msgstr "Zavřít" #: gajim/data/gui/shortcuts_window.ui:172 msgid "Roster Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:195 #, fuzzy msgid "File transfers" msgstr "Přenosy souborů" #: gajim/data/gui/shortcuts_window.ui:209 #, fuzzy msgid "Join a group chat" msgstr "v _diskuzích" #: gajim/data/gui/shortcuts_window.ui:216 #, fuzzy msgid "Set the status message" msgstr "text stavu" #: gajim/data/gui/shortcuts_window.ui:223 #, fuzzy msgid "Quit Gajim" msgstr "Gajim" #: gajim/data/gui/shortcuts_window.ui:236 #, fuzzy msgid "Show offline contacts" msgstr "Zobrazit _odpojené kontakty" #: gajim/data/gui/shortcuts_window.ui:243 #, fuzzy msgid "Show only active contacts" msgstr "Zobrazit pouze _aktivní kontakty" #: gajim/data/gui/shortcuts_window.ui:250 msgid "Enable roster filtering" msgstr "" #: gajim/data/gui/shortcuts_window.ui:258 msgid "Contacts" msgstr "Kontakty" #: gajim/data/gui/shortcuts_window.ui:263 #, fuzzy msgid "Contact information" msgstr "Informace o kontaktu" #: gajim/data/gui/shortcuts_window.ui:270 #, fuzzy msgid "Rename contact" msgstr "Přejmenovat kontakt" #: gajim/data/gui/shortcuts_window.ui:277 #, fuzzy msgid "Delete contact" msgstr "Odeslány kontakty:" #: gajim/data/gui/passphrase_dialog.ui:8 msgid "Passphrase" msgstr "Heslo" #: gajim/data/gui/history_window.ui:38 #, fuzzy msgid "Enter name / JID of contact or groupchat" msgstr "Jméno kontaktu" #: gajim/data/gui/history_window.ui:51 msgid "Search:" msgstr "Najít:" #: gajim/data/gui/history_window.ui:75 msgid "_In date search" msgstr "" #: gajim/data/gui/history_window.ui:79 msgid "Only searching within selected day" msgstr "" #: gajim/data/gui/history_window.ui:306 #, fuzzy msgid "_Show status changes" msgstr "Zaznamenávat změny _stavu kontaktů" #: gajim/data/gui/manage_pep_services_window.ui:13 msgid "PEP Service Configuration" msgstr "Nastavení PEP služby" #: gajim/data/gui/manage_pep_services_window.ui:69 msgid "_Configure" msgstr "_Nastavit" #: gajim/data/gui/groups_post_window.ui:9 msgid "Create new post" msgstr "Vytvoř nový zápis" #: gajim/data/gui/groups_post_window.ui:29 #: gajim/data/gui/single_message_window.ui:46 msgid "From:" msgstr "Odesílatel:" #: gajim/data/gui/groups_post_window.ui:41 #: gajim/data/gui/single_message_window.ui:70 msgid "Subject:" msgstr "Předmět:" #: gajim/data/gui/data_form_window.ui:19 msgid "Fill in the form." msgstr "Vyplňte formulář." #: gajim/data/gui/data_form_window.ui:274 msgid "Room Configuration" msgstr "Nastavení místnosti" #: gajim/data/gui/roster_item_exchange_window.ui:8 msgid "Roster Item Exchange" msgstr "Výměna položky rosteru" #: gajim/data/gui/systray_context_menu.ui:12 msgid "Sta_tus" msgstr "S_tav" #: gajim/data/gui/systray_context_menu.ui:20 msgid "_Start Chat..." msgstr "_Začít rozhovor" #: gajim/data/gui/systray_context_menu.ui:50 msgid "Show All Pending _Events" msgstr "Zobrazit všechny čekající _události" #: gajim/data/gui/systray_context_menu.ui:59 msgid "Mute Sounds" msgstr "Vypnout zvuky" #: gajim/data/gui/systray_context_menu.ui:75 #, fuzzy msgid "_Preferences" msgstr "Nastavení" #: gajim/data/gui/systray_context_menu.ui:90 #, fuzzy msgid "_Quit" msgstr "_Konec" #: gajim/data/gui/single_message_window.ui:59 msgid "To:" msgstr "Příjemce:" #: gajim/data/gui/single_message_window.ui:118 msgid "0" msgstr "0" #: gajim/data/gui/single_message_window.ui:210 msgid "Sen_d" msgstr "O_deslat" #: gajim/data/gui/single_message_window.ui:216 msgid "Send message" msgstr "Odeslat zprávu" #: gajim/data/gui/single_message_window.ui:229 msgid "_Reply" msgstr "_Odpovědět" #: gajim/data/gui/single_message_window.ui:235 msgid "Reply to this message" msgstr "Odpovědět na tuto zprávu" #: gajim/data/gui/single_message_window.ui:248 msgid "_Send & Close" msgstr "Ode_slat a zavřít" #: gajim/data/gui/single_message_window.ui:254 msgid "Send message and close window" msgstr "Odeslat zprávu a zavřít okno" #: gajim/data/gui/change_activity_dialog.ui:8 msgid "Set Activity" msgstr "Nastavit Činnosti" #: gajim/data/gui/change_activity_dialog.ui:65 msgid "Set an activity" msgstr "Nastavit činnost" #: gajim/data/gui/change_activity_dialog.ui:337 msgid "Message: " msgstr "Zpráva:" #: gajim/command_system/mapping.py:164 gajim/command_system/mapping.py:174 #: gajim/command_system/mapping.py:194 #, fuzzy msgid "Missing arguments" msgstr "Chybí parametry \"contact_jid\"" #: gajim/command_system/mapping.py:261 #, fuzzy msgid "Too many arguments" msgstr "Chybí parametry \"contact_jid\"" #: gajim/command_system/implementation/execute.py:53 msgid "Execute expression inside a shell, show output" msgstr "" #: gajim/command_system/implementation/execute.py:109 msgid "Execute expression inside a shell, send output" msgstr "" #: gajim/command_system/implementation/standard.py:45 msgid "" "Show help on a given command or a list of available commands if -a is given" msgstr "" #: gajim/command_system/implementation/standard.py:72 #, fuzzy msgid "Send a message to the contact" msgstr "Použití: /%s, pošle zprávu kontaktu" #: gajim/command_system/implementation/standard.py:77 msgid "Send action (in the third person) to the current chat" msgstr "" #: gajim/command_system/implementation/standard.py:82 msgid "Show logged messages which mention given text" msgstr "" #: gajim/command_system/implementation/standard.py:87 #, fuzzy, python-format msgid "%s: Nothing found" msgstr "%s nebyl nalezen" #: gajim/command_system/implementation/standard.py:93 msgid "Limit must be an integer" msgstr "" #: gajim/command_system/implementation/standard.py:117 msgid "" "\n" " Set the current status\n" "\n" " Status can be given as one of the following values:\n" " online, away, chat, xa, dnd.\n" " " msgstr "" #: gajim/command_system/implementation/standard.py:135 msgid "Set the current status to away" msgstr "" #: gajim/command_system/implementation/standard.py:149 msgid "Set the current status to online" msgstr "" #: gajim/command_system/implementation/standard.py:152 #, fuzzy msgid "Available" msgstr "Přip_ojen" #: gajim/command_system/implementation/standard.py:172 #: gajim/command_system/implementation/standard.py:249 #, fuzzy msgid "Clear the text window" msgstr "Použití: /%s, smaže zprávy v okně." #: gajim/command_system/implementation/standard.py:177 #: gajim/command_system/implementation/standard.py:389 #, fuzzy msgid "Send a ping to the contact" msgstr "Použití: /%s, pošle ping kontaktu" #: gajim/command_system/implementation/standard.py:180 #: gajim/command_system/implementation/standard.py:392 #, fuzzy msgid "Command is not supported for zeroconf accounts" msgstr "Příkaz není podporován pro zeroconf účet." #: gajim/command_system/implementation/standard.py:184 msgid "Send DTMF sequence through an open audio session" msgstr "" #: gajim/command_system/implementation/standard.py:187 #, fuzzy msgid "No open audio sessions with the contact" msgstr "Kliknutím zobraz staré rozhovory s tímto kontaktem" #: gajim/command_system/implementation/standard.py:190 #, fuzzy, python-format msgid "%s is not a valid tone" msgstr "%s není platný loglevel" #: gajim/command_system/implementation/standard.py:197 msgid "Toggle audio session" msgstr "Přepnout audio" #: gajim/command_system/implementation/standard.py:200 #, fuzzy msgid "Audio sessions are not available" msgstr "Spojení není dostupné" #: gajim/command_system/implementation/standard.py:207 msgid "Toggle video session" msgstr "Přepnout video" #: gajim/command_system/implementation/standard.py:210 #, fuzzy msgid "Video sessions are not available" msgstr "Spojení není dostupné" #: gajim/command_system/implementation/standard.py:217 msgid "Send a message to the contact that will attract his (her) attention" msgstr "" #: gajim/command_system/implementation/standard.py:256 #, fuzzy msgid "Change your nickname in a group chat" msgstr "Změ_nit přezdívku" #: gajim/command_system/implementation/standard.py:266 #, fuzzy msgid "Open a private chat window with a specified occupant" msgstr "" "Použití: /%s , otevře okno soukromého rozhovoru uvedenému " "nájemníkovi." #: gajim/command_system/implementation/standard.py:272 #: gajim/command_system/implementation/standard.py:281 #: gajim/command_system/implementation/standard.py:327 #: gajim/command_system/implementation/standard.py:339 #: gajim/command_system/implementation/standard.py:351 msgid "Nickname not found" msgstr "Přezdívka nenalezena: %s" #: gajim/command_system/implementation/standard.py:275 #, fuzzy msgid "" "Open a private chat window with a specified occupant and send him a message" msgstr "" "Použití: /%s , otevře okno soukromého rozhovoru uvedenému " "nájemníkovi." #: gajim/command_system/implementation/standard.py:284 #, fuzzy msgid "Display or change a group chat topic" msgstr "Ptát se před zavřením oken/záložek diskuzí." #: gajim/command_system/implementation/standard.py:292 msgid "Invite a user to a room for a reason" msgstr "" #: gajim/command_system/implementation/standard.py:295 #, fuzzy, python-format msgid "Invited %(jid)s to %(room_jid)s" msgstr "Pozval(a) %(contact_jid)s do %(room_jid)s." #: gajim/command_system/implementation/standard.py:299 #, fuzzy msgid "Join a group chat given by a jid" msgstr "v _diskuzích" #: gajim/command_system/implementation/standard.py:307 msgid "" "Leave the groupchat, optionally giving a reason, and close tab or window" msgstr "" #: gajim/command_system/implementation/standard.py:312 msgid "" "\n" " Ban user by a nick or a jid from a groupchat\n" "\n" " If given nickname is not found it will be treated as a jid.\n" " " msgstr "" #: gajim/command_system/implementation/standard.py:324 #, fuzzy msgid "Kick user by a nick from a groupchat" msgstr "Jste pozván do diskuze" #: gajim/command_system/implementation/standard.py:332 msgid "" "Set occupant role in group chat.\n" " Role can be given as one of the following values:\n" " moderator, participant, visitor, none" msgstr "" #: gajim/command_system/implementation/standard.py:337 #, fuzzy msgid "Invalid role given" msgstr "Neplatný server" #: gajim/command_system/implementation/standard.py:344 msgid "" "Set occupant affiliation in group chat.\n" " Affiliation can be given as one of the following values:\n" " owner, admin, member, outcast, none" msgstr "" #: gajim/command_system/implementation/standard.py:349 #, fuzzy msgid "Invalid affiliation given" msgstr "Příslušnost:" #: gajim/command_system/implementation/standard.py:357 #, fuzzy msgid "Display names of all group chat occupants" msgstr "Použití: /%s , zobrazí jména nájemníků v místnosti." #: gajim/command_system/implementation/standard.py:379 msgid "Forbid an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/standard.py:384 msgid "Allow an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/middleware.py:72 msgid "Error during command execution!" msgstr "" #: gajim/command_system/implementation/custom.py:106 msgid "The same as using a doc-string, except it supports translation" msgstr "" #: gajim/plugins/pluginmanager.py:611 gajim/plugins/pluginmanager.py:617 msgid "Archive corrupted" msgstr "" #: gajim/plugins/pluginmanager.py:613 #, fuzzy msgid "Archive empty" msgstr "Soubor je prázdný" #: gajim/plugins/pluginmanager.py:625 gajim/plugins/pluginmanager.py:633 #: gajim/plugins/gui.py:264 #, fuzzy msgid "Archive is malformed" msgstr "Služba odeslala chybné data" #: gajim/plugins/pluginmanager.py:641 gajim/plugins/gui.py:288 #: gajim/plugins/gui.py:296 #, fuzzy msgid "Plugin already exists" msgstr "Tento soubor už existuje" #: gajim/plugins/gui.py:84 #, fuzzy msgid "Plugin" msgstr "P_luginy" #: gajim/plugins/gui.py:156 #, fuzzy, python-format msgid "Warning: %s" msgstr "Zakazuji %s" #: gajim/plugins/gui.py:213 #, fuzzy msgid "Plugin failed" msgstr "Registrace selhala" #: gajim/plugins/gui.py:256 msgid "Unable to properly remove the plugin" msgstr "" #: gajim/plugins/gui.py:288 msgid "Overwrite?" msgstr "" #: gajim/plugins/gui.py:320 #, fuzzy msgid "Configuration" msgstr "Nastavení místnosti" #: data/org.gajim.Gajim.desktop.in:5 msgid "Jabber IM Client" msgstr "Jabber IM klient" #: data/org.gajim.Gajim.desktop.in:6 data/org.gajim.Gajim.appdata.xml.in:10 msgid "A GTK+ Jabber client" msgstr "GTK+ Jabber klient" #: data/org.gajim.Gajim.desktop.in:8 msgid "chat;messaging;im;xmpp;bonjour;voip;" msgstr "" #: data/org.gajim.Gajim.desktop.in:12 msgid "org.gajim.Gajim" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:12 msgid "" "Gajim is a chat client to be used with Jabber.org, Live Journal Talk, " "Nimbuzz, Ovi, Talkonaut, and thousands of other services run by companies " "and ISPs, and volunteers around the world." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:16 msgid "" "If you have a few accounts on different servers, if you want to be in " "contact with your friends and family all the time, then Gajim is for you." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:19 #, fuzzy msgid "Features:" msgstr "Vlastnosti serveru" #: data/org.gajim.Gajim.appdata.xml.in:21 msgid "Tabbed chat window and single window modes" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:22 msgid "" "Group chat support (with Multi-User Chat protocol), invitation, chat to " "group chat transformation" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:23 msgid "Emoticons, avatars, PEP (user activity, mood and tune)" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:24 #, fuzzy msgid "Audio / video conferences" msgstr "Audio / Video" #: data/org.gajim.Gajim.appdata.xml.in:25 #, fuzzy msgid "File transfer, room bookmarks" msgstr "Chyba přenosu souboru" #: data/org.gajim.Gajim.appdata.xml.in:26 msgid "Metacontacts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:27 msgid "Trayicon, speller, extended chat history functionalities" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:28 msgid "TLS, GPG and End-To-End encryption support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:29 msgid "Transport registration support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:30 #, fuzzy msgid "Service discovery including nodes, user search" msgstr "Procházení služeb s použitím účtu %s" #: data/org.gajim.Gajim.appdata.xml.in:31 msgid "Wikipedia, dictionary and search engine lookup" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:32 msgid "Multiple accounts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:33 #, fuzzy msgid "XML console interface" msgstr "XML Konzole" #: data/org.gajim.Gajim.appdata.xml.in:34 msgid "Link local (bonjour / zeroconf), BOSH" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:35 msgid "Other features via plugins" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:47 #, fuzzy msgid "Roster, list of contacts" msgstr "Zaznamenávat změny _stavu kontaktů" #: data/org.gajim.Gajim.appdata.xml.in:51 msgid "Tabbed chat window" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:55 #, fuzzy msgid "Group chat support" msgstr "Diskuze" #: data/org.gajim.Gajim.appdata.xml.in:59 #, fuzzy msgid "Chat history" msgstr "Nedávno:" #: data/org.gajim.Gajim.appdata.xml.in:63 #, fuzzy msgid "Plugin manager" msgstr "Registrace selhala" #, fuzzy #~ msgid "" #~ "Install /\n" #~ "Upgrade" #~ msgstr "Stagnuje" #, fuzzy #~ msgid "Install/Upgrade" #~ msgstr "Stagnuje" #, fuzzy #~ msgid "Install and Upgrade Plugins" #~ msgstr "Stagnuje" #, fuzzy #~ msgid "Plugins updates" #~ msgstr "Registrace selhala" #~ msgid "" #~ "Your configured emoticons theme has not been found, so emoticons have " #~ "been disabled." #~ msgstr "" #~ "Vámi nastavené téma pro smajlíky nebylo nalezeno, proto budou smajlíci " #~ "vypnuty " #~ msgid "Shows or hides the roster window" #~ msgstr "Zobrazí nebo skryje okno Seznamu" #~ msgid "Shows or hides the ipython window" #~ msgstr "Zobrazí nebo skryje okno ipythonu" #, fuzzy #~ msgid "XMPP account %s" #~ msgstr "XMPP účet %s@%s" #, fuzzy #~ msgid "Exception" #~ msgstr "Popis" #, fuzzy #~ msgid "" #~ "someone@somewhere.com would like you to add some contacts " #~ "in your roster." #~ msgstr "" #~ "%(jid)s by chtěl(a), aby jste %(action)s některé kontakty " #~ "z vašeho rosteru." #~ msgid "" #~ "Ordered list (space separated) of connection type to try. Can contain " #~ "tls, ssl or plain" #~ msgstr "" #~ "Řazený seznam (oddělený mezerami) spojení, která má Gajim zkusit. " #~ "Možnosti jsou: tls, ssl nebo plain" #~ msgid "_Actions" #~ msgstr "_Akce" #, fuzzy #~ msgid "Requires upower and python-dbus." #~ msgstr "Je potřeba python-dbus." #, fuzzy #~ msgid "Start Chat..." #~ msgstr "_Začít rozhovor" #~ msgid "You are already in group chat %s" #~ msgstr "Už jsi v místnosti %s" #~ msgid "Join Group Chat with account %s" #~ msgstr "Vstoupit do diskuze z účtu %s" #~ msgid "Invalid Account" #~ msgstr "Neplatný účtu" #~ msgid "" #~ "You have to choose an account from which you want to join the groupchat." #~ msgstr "Musíte vybrat účet, ze kterého chcete vstoupit do diskuze." #, fuzzy #~ msgid "Please enter the group chat JID as room@server." #~ msgstr "JProsím zadejte Jabber ID diskuze ve formě místnost@server." #, fuzzy #~ msgid "The group chat JID contains invalid characters." #~ msgstr "Jabber ID diskuze obsahuje nepřijatelné znaky." #~ msgid "Start Chat with account %s" #~ msgstr "Začít rozhovor z účtu %s" #, fuzzy #~ msgid "" #~ "Fill in the nickname or the JID of the contact you would like\n" #~ "to send a chat message to:" #~ msgstr "" #~ "Vyplňte Jabber ID nebo přezdívku kontaktu, se kterým chcete začít " #~ "rozhovor:" #, fuzzy #~ msgid "Nickname / JID" #~ msgstr "Dvakrát použité Jabber ID" #~ msgid "Unable to parse \"%s\"." #~ msgstr "Nemůžu dekódovat \"%s\"." #~ msgid "Shows the chat dialog so that you can send messages to a contact" #~ msgstr "Zobrazte okno rozhovoru, aby jste mohl(a) poslat zprávu kontaktu" #~ msgid "JID of the contact that you want to chat with" #~ msgstr "JID kontaktu, se kterým chcete komunikovat" #~ msgid "message content. The account must be specified or \"\"" #~ msgstr "obsah zprávy. Účet musí být uveden, nebo prázdné \"\"" #~ msgid "Adds contact to roster" #~ msgstr "Přidat kontakt do Seznamu" #~ msgid "jid" #~ msgstr "jid" #~ msgid "Adds new contact to this account" #~ msgstr "Přidá nový kontakt do tohoto účtu" #~ msgid "Opens 'Start Chat' dialog" #~ msgstr "Otevře dialog 'Začít rozhovor'" #~ msgid "Starts chat, using this account" #~ msgstr "Začít rozhovor z tohoto účtu" #, fuzzy #~ msgid "Handle a xmpp:/ URI" #~ msgstr "Obsluhovat xmpp:/ uri" #~ msgid "URI to handle" #~ msgstr "URI k obsluze" #~ msgid "Account in which you want to handle it" #~ msgstr "Účet s kterým chcete manipulovat" #~ msgid "Message content" #~ msgstr "Obsah zprávy" #~ msgid "Join a MUC room" #~ msgstr "_Vstoupit do místnosti MUC" #~ msgid "Room JID" #~ msgstr "JID Místnosti" #~ msgid "Nickname to use" #~ msgstr "Přezdívka kterou chete použít" #~ msgid "Password to enter the room" #~ msgstr "Heslo pro vstup do místnosti" #~ msgid "Account from which you want to enter the room" #~ msgstr "Účet z kterého chcete vstoupit do místnosti" #, fuzzy #~ msgid "Wrong URI" #~ msgstr "Nesprávné uri" #~ msgid "Nickname:" #~ msgstr "Přezdívka:" #~ msgid "Server:" #~ msgstr "Server:" #~ msgid "Password:" #~ msgstr "Heslo:" #, fuzzy #~ msgid "Join this room _automatically when I connect" #~ msgstr "Připoj se do této místnosti automaticky po připojení" #, fuzzy #~ msgid "Bro_wse Rooms" #~ msgstr "_Prohlížet" #, fuzzy #~ msgid "Requires libgtkspell and libenchant." #~ msgstr "Vyžaduje libgtkspell." #, fuzzy #~ msgid "Network-Watcher" #~ msgstr "Správce sítě (network-manager)" #~ msgid "Autodetection of network status." #~ msgstr "Autodetekce stavu sítě." #, fuzzy #~ msgid "Requires gnome-network-manager" #~ msgstr "Je potřeba gnome-network-manager a python-dbus." #, fuzzy #~ msgid "Feature not available, see Help->Features" #~ msgstr "Vlastnost není k dispozici pod Windows." #, fuzzy #~ msgid "Send files" #~ msgstr "Odeslat _Soubor" #~ msgid "This contact does not support file transfer." #~ msgstr "Tento kontakt nepodporuje přenos souborů." #, fuzzy #~ msgid "You need to know the real JID of the contact to send them a file." #~ msgstr "" #~ "Musíš znát skutečné JID kontaktu, aby mu bylo možné poslat souboru." #~ msgid "" #~ "You have to install %s dictionary to use spellchecking, or choose another " #~ "language by setting the speller_language option." #~ msgstr "" #~ "Musíš nainstalovat %s slovník k použití kontroly pravopisu, nebo vybrat " #~ "jiný jazyk nastavením volby speller_language." #~ msgid "Hides the buttons in chat windows." #~ msgstr "Skryje tlačítka v okně diskuze." #~ msgid "Change your nickname (Ctrl+N)" #~ msgstr "Změ_nit přezdívku" #~ msgid "Change the room's subject (Alt+T)" #~ msgstr "Změnit téma místnosti (Alt+T)" #~ msgid "Bookmark this room (Ctrl+B)" #~ msgstr "Přidat tuto místnost do záložek" #~ msgid "Browse the chat history (Ctrl+H)" #~ msgstr "Procházet historii diskuze (Ctrl+H)" #, fuzzy #~ msgid "Show advanced functions (Alt+D)" #~ msgstr "Zobrazit nabídku rozšířených funkcí (Alt+D)" #~ msgid "Add this contact to roster (Ctrl+D)" #~ msgstr "Přidat kontakt do Seznamu (Ctrl+D)" #~ msgid "Invite contacts to the conversation (Ctrl+G)" #~ msgstr "Pozvat kontakty k rozhovoru (Ctrl+G)" #, fuzzy #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Zobrazit profil kontaktu (Ctrl+I)" #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Zobrazit profil kontaktu (Ctrl+I)" #~ msgid "Ma_ke message windows compact" #~ msgstr "Udělej o_kna zpráv kompaktní" #~ msgid "Hide all buttons in chat windows" #~ msgstr "Skryje tlačítka v okně diskuze." #, fuzzy #~ msgid "Hide the chat buttons" #~ msgstr "Použití: /%s, skryje tlačítka rozhovoru." #~ msgid "" #~ "If True, Gajim will ask for avatar each contact that did not have an " #~ "avatar last time or has one cached that is too old." #~ msgstr "" #~ "pokud zapnuto, Gajim se zeptá na avatara každého kontaktu který neměl " #~ "naposledy avatara nebo kterého uložený je příliš starý." #~ msgid "Disk Write Error" #~ msgstr "Chyba zápisu na disk (možná je plný?)" #~ msgid "Set Custom _Avatar..." #~ msgstr "Nastavit vlastní Avatar" #, fuzzy #~ msgid "SSL certificate validation" #~ msgstr "Validace SSL certifikátu" #~ msgid "" #~ "A library used to validate server certificates to ensure a secure " #~ "connection." #~ msgstr "" #~ "Knihovna se používá k ověření certifikátu serveru pro zabezpečené spojení." #, fuzzy #~ msgid "Requires python-pyopenssl > 0.12 and pyasn1." #~ msgstr "Je potřeba python-pyopenssl." #, fuzzy #~ msgid "?CLI:room" #~ msgstr "místnost" #, fuzzy #~ msgid "?CLI:nick" #~ msgstr "přezdívka" #, fuzzy #~ msgid "?CLI:password" #~ msgstr "heslo" #~ msgid "Use D-Bus and Notification-Daemon to show notifications" #~ msgstr "Používej DBus a Notifikačního démona k zobrazování notifikací" #~ msgid "Notification" #~ msgstr "Upozornění" #~ msgid "Passive popups notifying for new events." #~ msgstr "Pasivní okna oznamující nové události." #~ msgid "" #~ "Requires python-notify or instead python-dbus in conjunction with " #~ "notification-daemon." #~ msgstr "" #~ " Je potřeba python-notify nebo python-dbus ve spojení s notification-" #~ "daemon." #~ msgid "Ignore" #~ msgstr "Ignorovat" #~ msgid "_Open Gmail Inbox" #~ msgstr "_Otevři schránku Gmailu" #~ msgid "Notify on new _GMail email" #~ msgstr "Upozorni při novém _GMail emailu" #~ msgid "" #~ "If checked, Gajim will show a notification when a new e-mail is received " #~ "via GMail" #~ msgstr "" #~ "Pokud zaškrtnuto, Gajim uvede také informaci o odesilateli zprávy nového " #~ "emailu" #~ msgid "Display _extra email details" #~ msgstr "Zobraz _podrobnosti emailu" #, fuzzy #~ msgid "" #~ "If checked, Gajim will also include information about the sender of new " #~ "emails" #~ msgstr "" #~ "Pokud zaškrtnuto, Gajim uvede také informaci o odesilateli zprávy nového " #~ "emailu" #~ msgid "GMail Options" #~ msgstr "Volby GMail" #, fuzzy #~ msgid "12" #~ msgstr "1" #, fuzzy #~ msgid "20" #~ msgstr "2" #, fuzzy #~ msgid "Invited %s to %s" #~ msgstr "Odeslat %s %s" #~ msgid "GMail Email Received" #~ msgstr "Přišel GMail Email" #, fuzzy #~ msgid "New e-mail on %(gmail_mail_address)s" #~ msgstr "Nový E-mail pro %(gmail_mail_address)s" #, fuzzy #~ msgid "You have %d new e-mail conversation" #~ msgid_plural "You have %d new e-mail conversations" #~ msgstr[0] "Máte %d nepřečtený E-mail" #~ msgstr[1] "Máte %d nepřečtené E-maily" #~ msgstr[2] "Máte %d nepřečtených E-mailů" #~ msgid "" #~ "\n" #~ "\n" #~ "From: %(from_address)s\n" #~ "Subject: %(subject)s\n" #~ "%(snippet)s" #~ msgstr "" #~ "\n" #~ "\n" #~ "Od: %(from_address)s\n" #~ "Předmět: %(subject)s\n" #~ "%(snippet)s" #~ msgid "Re_name" #~ msgstr "Přejme_novat" #~ msgid "Resour_ce:" #~ msgstr "Zd_roj: " #~ msgid "" #~ "Resource is sent to the Jabber server in order to separate the same JID " #~ "in two or more parts depending on the number of the clients connected in " #~ "the same server with the same account. So you might be connected in the " #~ "same account with resource 'Home' and 'Work' at the same time. The " #~ "resource which has the highest priority will get the events. (see below)" #~ msgstr "" #~ "Zdroj je odeslán Jabber serveru pro oddělení stejné JID na dvě nebo více " #~ "částí závisejících na počtu připojených klientů na stejný server se " #~ "stejným účtem. Takže můžete být připojeni ke stejnému účtu se zdroji " #~ "'Domov' a 'Práce' zároveň. Zdroj, který má nejvyšší prioritu obdrží " #~ "zprávy. (více následuje)" #~ msgid "A_djust to status" #~ msgstr "_Nastavit podle stavu" #~ msgid "Priority will change automatically according to your status." #~ msgstr "Priorita se automaticky změní podle vašeho stavu." #~ msgid "Anonymous authentication" #~ msgstr "Anonymní autentizace" #~ msgid "" #~ "Priority is used in Jabber to determine who gets the events from the " #~ "jabber server when two or more clients are connected using the same " #~ "account; The client with the highest priority gets the events" #~ msgstr "" #~ "Priorita je v Jabberu použita ke zjištění, kdo obdrží zprávu od jabber " #~ "serveru, pokud je připojeno více klientů přes stejný účet. Zprávu obdrží " #~ "klient s vyšší prioritou" #, fuzzy #~ msgid "Synchronize contacts" #~ msgstr "Synchronizovat kontakty" #~ msgid "Click to request authorization to all contacts of another account" #~ msgstr "Klikněte k vyžádání autorizace od všech kontaktů jiného účtu" #~ msgid "Chan_ge Password" #~ msgstr "_Změnit heslo" #~ msgid "Click to change account's password" #~ msgstr "Klikněte pro změnu hesla k účtu" #~ msgid "Administration operations" #~ msgstr "Seznam správců" #~ msgid "Browse..." #~ msgstr "Procházet..." #, fuzzy #~ msgid "Certificate is e_ncrypted" #~ msgstr "Certifikát odmítnut" #~ msgid "" #~ "If checked, Gajim, when launched, will automatically connect to jabber " #~ "using this account" #~ msgstr "" #~ "Pokud zaškrtnuto, Gajim po spuštění se automaticky připojí pomocí tohoto " #~ "účtu" #, fuzzy #~ msgid "Synchronize logs with server" #~ msgstr "Synchronizovat kontakty" #~ msgid "Synch_ronize account status with global status" #~ msgstr "Synch_ronizovat stav účtu s globálním stavem" #~ msgid "" #~ "If checked, any change to the global status (handled by the combobox at " #~ "the bottom of the roster window) will change the status of this account " #~ "accordingly" #~ msgstr "" #~ "Pokud zaškrtnuto, jakákoliv změna globálního stavu (pomocí comboboxu na " #~ "spodní straně Seznamu) změní stav tohoto účtu také" #~ msgid "" #~ "If checked, Gajim will also broadcast some more IPs except from just your " #~ "IP, so file transfer has higher chances of working." #~ msgstr "" #~ "Pokud je zaškrtnuto, Gajim ohlásí navíc několik dalších IP kromě Vaší IP, " #~ "takže přenos souboru má větší šanci správného fungování." #~ msgid "Proxy" #~ msgstr "Proxy" #~ msgid "" #~ "Check this so Gajim will ask you before sending your password over an " #~ "insecure connection." #~ msgstr "" #~ "Zaškrtněte pokud se má Gajim ptát předtím než odešlete vaše heslo přes " #~ "nezabezpečené připojení." #~ msgid "Send _keep-alive packets" #~ msgstr "Odesílat keep-alive pakety" #~ msgid "" #~ "If checked, Gajim will send keep-alive packets to prevent connection " #~ "timeout which results in disconnection" #~ msgstr "" #~ "Pokud zaškrtnuto, Gajim bude posílat keep-alive pakety, aby předešel " #~ "ztrátě spojení způsobeném vypršením spojení" #~ msgid "Use cust_om hostname/port" #~ msgstr "Použít vlastní _jméno počítače/port" #~ msgid "_Hostname: " #~ msgstr "_Počítač: " #~ msgid "_Port: " #~ msgstr "_Port:" #~ msgid "No key selected" #~ msgstr "Není zvolen žádný klíč" #~ msgid "Choose _Key..." #~ msgstr "Vyberte _klíč..." #~ msgid "" #~ "If checked, Gajim will get the password from a GPG agent like seahorse" #~ msgstr "Pokud bude zaškrtnuto, Gajim si bude pamatovat heslo pro tento účet" #~ msgid "OpenPGP" #~ msgstr "OpenPGP" #~ msgid "_Edit Personal Information..." #~ msgstr "_Upravit osobní informace..." #~ msgid "Information about you, as stored in the server" #~ msgstr "Informace o Vás, jak jsou uloženy na serveru" #~ msgid "Personal Information" #~ msgstr "Osobní údaje" #~ msgid "Co_nnect on Gajim startup" #~ msgstr "_Připojit po startu Gajimu" #~ msgid "Synchroni_ze account status with global status" #~ msgstr "Synch_ronizovat stav účtu s globálním stavem" #~ msgid "Use cust_om port:" #~ msgstr "Použít _vlastní port:" #~ msgid "" #~ "If the default port that is used for incoming messages is unfitting for " #~ "your setup you can select another one here.\n" #~ "You might consider to change possible firewall settings." #~ msgstr "" #~ "Pokud výchozí port použitý k přijímání zpráv nevyhovuje tvému nastavení, " #~ "můžeš si zvolit jiný.\n" #~ "Můžeš také zvážit změnu nastavení firewallu." #~ msgid "Mer_ge accounts" #~ msgstr "_Spojit účty" #~ msgid "OpenPGP is not usable on this computer" #~ msgstr "OpenPGP na tomto počítači není použitelné" #~ msgid "To change the account name, you must be disconnected." #~ msgstr "Ke změně jména účtu se musite odpojit." #~ msgid "To change the account name, you must read all pending events." #~ msgstr "Před změnou jména účtu si musíte přečíst všechny čekající zprávy." #~ msgid "Account Name Already Used" #~ msgstr "Jméno účtu už existuje" #~ msgid "" #~ "This name is already used by another of your accounts. Please choose " #~ "another name." #~ msgstr "Toto jméno je už použito pro jiný účet. Zvolte jiné, prosím." #~ msgid "Invalid account name" #~ msgstr "Neplatné jméno účtu" #~ msgid "Account name cannot be empty." #~ msgstr "Jméno účtu nemůže být prázdné." #~ msgid "Account name cannot contain spaces." #~ msgstr "Jméno účtu nesmí obsahovat mezery." #~ msgid "Enter a new name for account %s" #~ msgstr "Zadej nové jméno pro účet %s." #, fuzzy #~ msgid "A JID must be in the form \"user@servername\"." #~ msgstr "Jabber ID musí být ve tvaru \"uživatel@jménoserveru\"." #~ msgid "No such account available" #~ msgstr "Takový účet není dostupný" #~ msgid "" #~ "You must create your account before editing your personal information." #~ msgstr "Musíte vytvořit účet před úpravou vašich osobních údajů." #~ msgid "Without a connection, you can not edit your personal information." #~ msgstr "Bez připojení nemůžete upravovat osobní údaje." #, fuzzy #~ msgid "Your server does not have vCard support" #~ msgstr "Váš server nepodporuje vizitky." #~ msgid "Your server can't save your personal information." #~ msgstr "Váš server neumí uložit Vaše osobní informace." #~ msgid "Account Local already exists." #~ msgstr "Účet Local už existuje." #~ msgid "Please rename or remove it before enabling link-local messaging." #~ msgstr "Prosím přejmenujte nebo odstraňte před povolením lokálních zpráv." #~ msgid "THANKS:" #~ msgstr "DÍKY:" #~ msgid "Could not write to %s. Session Management support will not work" #~ msgstr "Nemůžu zapsat do %s. Podpora správy sezení nebude fungovat" #~ msgid "Jabber Traffic" #~ msgstr "Provoz Jabberu" #~ msgid "_Enable" #~ msgstr "_Povolit" #, fuzzy #~ msgid "Filter" #~ msgstr "Písmo" #~ msgid "_IQ" #~ msgstr "_IQ" #~ msgid "Info/Query" #~ msgstr "Info/Query" #~ msgid "_Message" #~ msgstr "_Zpráva" #~ msgid "XML Input" #~ msgstr "Vstup XML" #~ msgid "XML Console for %s" #~ msgstr "XML Konzole pro %s" #, fuzzy #~ msgid "Idle for:" #~ msgstr "XML Konzole pro %s" #~ msgid "Last status: %s" #~ msgstr "Poslední stav: %s" #~ msgid " since %s" #~ msgstr " od %s" #~ msgid "since %s" #~ msgstr "od %s" #, fuzzy #~ msgid "No" #~ msgstr "Žádný" #~ msgid "Yes" #~ msgstr "Ano" #, fuzzy #~ msgid "Prefer" #~ msgstr "Nastavení" #, fuzzy #~ msgid "Forbid" #~ msgstr "Zakázat" #, fuzzy #~ msgid "Auto" #~ msgstr "Automaticky vstoupit" #, fuzzy #~ msgid "body" #~ msgstr "tělo" #, fuzzy #~ msgid "approve" #~ msgstr "schválit" #, fuzzy #~ msgid "otr" #~ msgstr "Ostatní" #, fuzzy #~ msgid "Invalid expire value" #~ msgstr "Neplatné jméno serveru" #, fuzzy #~ msgid "There is an error" #~ msgstr "Služba vrátila chybu." #~ msgid "How many minutes should last lines from previous conversation last." #~ msgstr "Kolik minut by měly řádky z předchozího rozhovoru zůstat." #~ msgid "" #~ "Your configured emoticons theme cannot been loaded. You maybe need to " #~ "update the format of emoticons.py file. See http://trac.gajim.org/wiki/" #~ "Emoticons for more details." #~ msgstr "" #~ "Vámi nastavené téma smajlíků se nepodařilo načíst. Možná je potřeba " #~ "aktualizovat formát v souboru emoticons.py. Viz.: http://trac.gajim.org/" #~ "wiki/Emoticons " #~ msgid "You will be connected to %s without OpenPGP." #~ msgstr "Budete připojen(a) k %s bez OpenPGP." #~ msgid "The following message was NOT encrypted" #~ msgstr "Následující zpráva NEBYLA šifrovaná" #, fuzzy #~ msgid "Encryption used for this contact." #~ msgstr "Povolit ESessions šifrování pro tento účet." #~ msgid "Toggle Open_PGP Encryption" #~ msgstr "Přepnout Open_PGP šifrování" #~ msgid "Toggle End to End Encryption" #~ msgstr "Přepnout šifrování mezi uživateli" #, fuzzy #~ msgid "OpenPGP encryption enabled" #~ msgstr "GPG Šifrování zapnuto" #, fuzzy #~ msgid "No OpenPGP key assigned" #~ msgstr "Nepřiřazen GPG klíč" #, fuzzy #~ msgid "" #~ "No OpenPGP key is assigned to this contact. So you cannot encrypt " #~ "messages with OpenPGP." #~ msgstr "" #~ "Tento kontakt nemá přiřazen GPG klíč. Proto nemůžeš šifrovat pomocí GPG " #~ "zprávy." #, fuzzy #~ msgid "OpenPGP encryption disabled" #~ msgstr "GPG Šifrování vypnuto" #~ msgid "Session WILL be logged" #~ msgstr "Sezení BUDE logováno" #~ msgid "Session WILL NOT be logged" #~ msgstr "Sezení NEBUDE logováno" #~ msgid "is" #~ msgstr "je" #~ msgid "is NOT" #~ msgstr "NENÍ" #~ msgid "will" #~ msgstr "bude" #~ msgid "will NOT" #~ msgstr "NEBUDE" #~ msgid "The following message was encrypted" #~ msgstr "Následující zpráva byla šifrovaná" #, fuzzy #~ msgid "Toggle the OpenPGP encryption" #~ msgstr "Přepnout Open_PGP šifrování" #~ msgid "Is OpenPGP enabled for this contact?" #~ msgstr "Je OpenPGP povoleno pro tento kontakt?" #~ msgid "" #~ "Should Gajim automatically start an encrypted session with this contact " #~ "when possible?" #~ msgstr "" #~ "Má Gajim uskutečnit šifrované spojení s tímto kontaktem je-li k dispozici?" # FIXME: co to je? #~ msgid "Neither the remote presence is signed, nor a key was assigned." #~ msgstr "Není podepsaná přítomnost ani není přiřazen klíč." #~ msgid "The contact's key (%s) does not match the key assigned in Gajim." #~ msgstr "Klíč kontaktu (%s) se neshoduje s klíčem v Gajimu." #~ msgid "[This message is *encrypted* (See :XEP:`27`]" #~ msgstr "[Tato zpráva je *zašifrovaná* (Viz :XEP:\"27\")]" #~ msgid "" #~ "Your chat session with %(jid)s is encrypted.\n" #~ "\n" #~ "This session's Short Authentication String is %(sas)s." #~ msgstr "" #~ "Vaš rozhovor s %(jid)s je šifrovaný.\n" #~ "\n" #~ "Krátký Autentizační řetězec pro toto sezení je: %(sas)s" #~ msgid "You have already verified this contact's identity." #~ msgstr "Už jste prověřoval identitu tohoto kontaktu." #~ msgid "Contact's identity verified" #~ msgstr "Identita kontaktu ověřena" #, fuzzy #~ msgid "Verify again…" #~ msgstr "Ověřit znovu" #~ msgid "" #~ "To be certain that only the expected person can read your messages " #~ "or send you messages, you need to verify their identity by clicking the " #~ "button below." #~ msgstr "" #~ "Chcete-li mít jistotu, že pouze důvěryhodné osoby mohou číst vaše " #~ "zprávy nebo vám poslat zprávu, je potřeba ověřit jejich identitu kliknutí " #~ "na tlačítko dole." #~ msgid "Contact's identity NOT verified" #~ msgstr "Identita kontaktu NENÍ ověřena" #, fuzzy #~ msgid "Verify…" #~ msgstr "_Kontroluj" #~ msgid "Have you verified the contact's identity?" #~ msgstr "Ověřil(a) jste identitu kontaktu?" #~ msgid "" #~ "To prevent talking to an unknown person, you should speak to %(jid)s directly (in person or on the phone) and verify that they see the same " #~ "Short Authentication String (SAS) as you.\n" #~ "\n" #~ "This session's Short Authentication String is %(sas)s." #~ msgstr "" #~ "Pro zabránění man-in-the-middle útoku, si promluvte přímo s %(jid)s (například osobně nebo po telefonu) a ověřte zda vidí stejný Krátký " #~ "Autentizační řetězec (SAS) jako vy.\n" #~ "Krátký Autentizační řetězec: %(sas)s" #~ msgid "Did you talk to the remote contact and verify the SAS?" #~ msgstr "Mluvily jste se vzdáleným kontaktem a ověřil s ním SAS?" #~ msgid "" #~ "The contact's key (%s) does not match the key assigned in Gajim." #~ msgstr "" #~ "Klíč kontaktu (%s) se neshoduje s klíčem přiřazeným v Gajimu." #, fuzzy #~ msgid "" #~ "No OpenPGP key is assigned to this contact. So you cannot encrypt " #~ "messages." #~ msgstr "" #~ "Tomuto kontaktu není přiřazen GPG klíč. Proto nemůžete šifrovat zprávy." #, fuzzy #~ msgid "" #~ "OpenPGP key is assigned to this contact, but you do not trust their " #~ "key, so message cannot be encrypted. Use your OpenPGP client " #~ "to trust their key." #~ msgstr "" #~ "Tomuto kontaktu je přiřazen GPG klíč, ale Vy nedůvěřujete jeho klíči, proto zpráva nemůže být zašifrovaná. Použijte Váš GPG klient " #~ "pro nastavení důvěry." #, fuzzy #~ msgid "" #~ "OpenPGP Key is assigned to this contact, and you trust their key, so " #~ "messages will be encrypted." #~ msgstr "" #~ "Tento kontakt má přiřazen GPG klíč a tomuto klíči důvěřujete, zprávy tedy " #~ "budou šifrované." #~ msgid "" #~ "This icon indicates that this message has not yet\n" #~ "been received by the remote end. If this icon stays\n" #~ "for a long time, it's likely the message got lost." #~ msgstr "" #~ "Tato ikona indikuje, že zpráva ještě nebyla přijata protější\n" #~ "stranou. Pokud zůstává dlouho, zpráva je pravděpodobně\n" #~ "ztracena." #~ msgid "" #~ "If True, listen to D-Bus signals from NetworkManager and change the " #~ "status of accounts (provided they do not have listen_to_network_manager " #~ "set to False and they sync with global status) based upon the status of " #~ "the network connection." #~ msgstr "" #~ "Je-li povoleno, čeká na D-Bus signál z NetworkManager a změní stav účtů " #~ "(pokud nemají nastaveno listen_to_network_manager nastavený na False a " #~ "synchronizují se s globálním stavem) v závislosti na stavu síťového " #~ "připojení." #~ msgid "" #~ "The database file (%s) cannot be read. Try to repair it or remove it (all " #~ "history will be lost)." #~ msgstr "" #~ "Nelze přečíst soubor databáze (%s). Opravte ho nebo smažte (tím ztratíte " #~ "všechny zprávy v historii)." #~ msgid "Database cannot be read." #~ msgstr "Nemohu číst z databáze." #~ msgid "A message from a non-valid JID arrived, it has been ignored." #~ msgstr "Přišla zpráva od neplatného JID a byla ignorována." #~ msgid "Smooth scroll message in conversation window" #~ msgstr "Jemné posouvání v okně diskuze" #~ msgid "Show _XML Console" #~ msgstr "Zobrazit _XML konzoli" #~ msgid "Edit _Privacy Lists..." #~ msgstr "Upravit kontrolu soukromí..." #~ msgid "_Administrator" #~ msgstr "_Správce" #~ msgid "Sends a message to users currently connected to this server" #~ msgstr "Poslat zprávu momentálně připojeným uživatelům tohoto serveru" #~ msgid "Sets Message of the Day" #~ msgstr "Nastaví Zprávu dne" #~ msgid "Updates Message of the Day" #~ msgstr "Upraví Zprávu dne" #~ msgid "Deletes Message of the Day" #~ msgstr "Smaže zprávu dne" #~ msgid "Add _Contact..." #~ msgstr "Přid_at Kontakt..." #~ msgid "_Accounts" #~ msgstr "Úč_ty" #~ msgid "Profile, A_vatar" #~ msgstr "Profil, A_vatar" #, fuzzy #~ msgid "P_lugins" #~ msgstr "P_luginy" #~ msgid "File _Transfers" #~ msgstr "_Přenosy souborů" #~ msgid "Help online" #~ msgstr "Nápověda online" #~ msgid "Frequently Asked Questions (online)" #~ msgstr "Často kladené dotazy - FAQ (online)" #~ msgid "Fea_tures" #~ msgstr "Vlastnosti serveru" #~ msgid "to %s account" #~ msgstr "do účtu %s" #~ msgid "using %s account" #~ msgstr "pomocí účtu %s" #~ msgid "of account %s" #~ msgstr "účtu %s" #~ msgid "for account %s" #~ msgstr "pro účet %s" #~ msgid "" #~ "By removing this contact you also remove authorization resulting in him " #~ "or her always seeing you as offline." #~ msgstr "" #~ "Smazáním kontaktu také zrušíte autorizaci. Kontakt Vás tak vždy uvidí " #~ "jako odpojeného." #~ msgid "Invalid Jabber ID" #~ msgstr "Neplatné Jabber ID" #~ msgid "Verify..." #~ msgstr "Ověřit..." #~ msgid "This file is being used by another process." #~ msgstr "Tento soubor je používán jiným procesem." #~ msgid "pgp key" #~ msgstr "pgp klíč" #~ msgid "" #~ "Sends new single message to a contact in the roster. Both OpenPGP key and " #~ "account are optional. If you want to set only 'account', without 'OpenPGP " #~ "key', just set 'OpenPGP key' to ''." #~ msgstr "" #~ "Poslat novou prostou zprávu kontaktu v Seznamu. Obojí OpenPGP klíč a účet " #~ "jsou volitelné. Pokud chcete nastavit pouze 'account' bez 'OpenPGP key', " #~ "nastavte prostě 'OpenPGP key' na ''." #, fuzzy #~ msgid "Please first choose another theme as your current theme." #~ msgstr "Vyberte prosím napřed jiné téma." #~ msgid "A non-privacy-related room configuration change has occurred" #~ msgstr "Nastala změna nastavení netýkající se soukromí" #, fuzzy #~ msgid "Maximum number of users for %s has been reached" #~ msgstr "V %s byl dosažen maximální počet uživatelů" #~ msgid "Your passphrase is incorrect" #~ msgstr "Vaše heslo je neplatné" #, fuzzy #~ msgid "OpenPGP Passphrase Incorrect" #~ msgstr "Heslo OpenGPG není platné" #, fuzzy #~ msgid "OpenPGP key not trusted" #~ msgstr "GPG klíč není důvěryhodný" #~ msgid "You successfully received %(filename)s from %(name)s." #~ msgstr "Soubor %(filename)s od %(name)s byl úspěsně přijat." #, fuzzy #~ msgid "Set logs directory" #~ msgstr "vytvářím adresář %s " #~ msgid "Chats" #~ msgstr "Rozhovory" #~ msgid "_Manage Bookmarks..." #~ msgstr "Spravovat _záložky..." # FIXME: nejak divne, asi spatne prelozene -ne myslim ze to je ok #~ msgid "Change Status Message..." #~ msgstr "Změnit popis stavu..." #~ msgid "_Change Status Message..." #~ msgstr "_Změnit popis stavu..." #~ msgid "" #~ "You are not interested in the contact's presence, and neither he/she is " #~ "interested in yours" #~ msgstr "Vy ani kontakt se nezajímáte o stav toho druhého" #~ msgid "Error description..." #~ msgstr "Popis chyby..." #, fuzzy #~ msgid "View contact information (Ctrl+I)" #~ msgstr "Pozvat kontakty k rozhovoru (Ctrl+G)" #~ msgid "3" #~ msgstr "3" #~ msgid "4" #~ msgstr "4" #~ msgid "5" #~ msgstr "5" #~ msgid "6" #~ msgstr "6" #~ msgid "7" #~ msgstr "7" #~ msgid "8" #~ msgstr "8" #~ msgid "9" #~ msgstr "9" #~ msgid "*" #~ msgstr "*" #, fuzzy #~ msgid "Groupchat Histories" #~ msgstr "Diskuze" #, fuzzy #~ msgid "All Chat Histories" #~ msgstr "Všechny stavy" #, fuzzy #~ msgid "homepage url" #~ msgstr "Dom. stránka:" #~ msgid "More" #~ msgstr "Více" #~ msgid "creating %s directory" #~ msgstr "vytvářím adresář %s " #~ msgid "" #~ "If True, Gajim will use KDE Wallet (if kwalletcli is available) to store " #~ "account passwords." #~ msgstr "" #~ "Je-li povoleno, Gajim použije KDE Wallet (je-li dostupný kwalletcli) k " #~ "uložení hesel účtů." #, fuzzy #~ msgid "Please check if avahi/bonjour-daemon is running." #~ msgstr "Zkontrolujte, zda avahi-daemon běží." #~ msgid "%s is not the name of a group chat." #~ msgstr "%s není jméno diskuze." #~ msgid "Session Management" #~ msgstr "Správa Sezení" #~ msgid "Gajim session is stored on logout and restored on login." #~ msgstr "" #~ "Sezení Gajimu je uloženo při odhlášení a znovu načteno při přihlášení." #~ msgid "Requires python-gnome2." #~ msgstr "Je potřeba python-gnome2." #~ msgid "Requires gnome-keyring and python-gnome2-desktop, or kwalletcli." #~ msgstr "Je potřeba gnome-keyring a python-gnome2-desktop, nebo kwalletcli." #~ msgid "SRV" #~ msgstr "SRV" #~ msgid "Ability to connect to servers which are using SRV records." #~ msgstr "Schopnost připojit se na servery používající SRV záznamy." #~ msgid "Requires dnsutils." #~ msgstr "Je potřeba dnsutils." #~ msgid "Requires nslookup to use SRV records." #~ msgstr "Je potřeba nslookup pro použití SRV záznamů." #~ msgid "Gajim needs X server to run. Quiting..." #~ msgstr "Gajim vyžaduje k běhu X server. Končím..." #~ msgid "importing PyGTK failed: %s" #~ msgstr "import PyGTK selhal: %s" #, fuzzy #~ msgid "Gajim needs PyGTK 2.22 or above" #~ msgstr "Gajim vyžaduje PyGTK 2.12 nebo novější" #, fuzzy #~ msgid "Gajim needs PyGTK 2.22 or above to run. Quiting..." #~ msgstr "Gajim vyžaduje PyGTK 2.12 nebo novější. Končím..." #, fuzzy #~ msgid "Gajim needs GTK 2.22 or above" #~ msgstr "Gajim potřebuje GTK 2.12 nebo novější" #, fuzzy #~ msgid "Gajim needs GTK 2.22 or above to run. Quiting..." #~ msgstr "Gajim vyžaduje GTK 2.12 nebo novější. Končím..." #~ msgid "Gajim needs pywin32 to run" #~ msgstr "Gajim potřebuje k běhu pywin32" #~ msgid "" #~ "Please make sure that Pywin32 is installed on your system. You can get it " #~ "at %s" #~ msgstr "" #~ "Prosím ujistěte se, že Pywin32 je nainstalován na vašem počítači. Můžete " #~ "jej získat na %s" #~ msgid "Gajim is already running" #~ msgstr "Gajim již běží" #~ msgid "" #~ "Another instance of Gajim seems to be running\n" #~ "Run anyway?" #~ msgstr "" #~ "Jiná instance Gajimu pravděpodobně již běží\n" #~ "Přesto spustit?" # FIXME: neni presne #~ msgid "A programming error has been detected" #~ msgstr "Byla objevena chyba v programu" #~ msgid "Details" #~ msgstr "Detaily" #, fuzzy #~ msgid "" #~ "Gnome Keyring is installed but not correctly started (environment " #~ "variable probably not correctly set)" #~ msgstr "" #~ "Gnome Keyring je nainstalován ale není správně spuštěn (proměná prostředí " #~ "není asi správně nastavena)" #~ msgid "Jabber ID: " #~ msgstr "Jabber ID:" #~ msgid "Resource: " #~ msgstr "Zdroj: " #~ msgid "Subscription: " #~ msgstr "Autorizace: " #, fuzzy #~ msgid "Mood: " #~ msgstr "Nálada:" #, fuzzy #~ msgid "Activity: " #~ msgstr "Činnost:" #, fuzzy #~ msgid "Gajim Remote" #~ msgstr "gajim-remote" #~ msgid "Join _Group Chat..." #~ msgstr "Vstoupit do _Diskuze" #~ msgid "_Modify Account" #~ msgstr "Upravit účet" #~ msgid "Check on startup if Gajim is the _default Jabber client" #~ msgstr "Vždy při startu zkontroluj, zda je Gajim _výchozí Jabber klient" #~ msgid "_Group Chat" #~ msgstr "_Diskuze" #~ msgid "" #~ "If True, Gajim will check if it's the default jabber client on each " #~ "startup." #~ msgstr "" #~ "Pokud zapnuto, Gajim zkontroluje, zda je výchozí jabber klient, při " #~ "každém startu." #~ msgid "Gajim is not the default Jabber client" #~ msgstr "Gajim není výchozí Jabber klient" #~ msgid "Would you like to make Gajim the default Jabber client?" #~ msgstr "Chcete nastavit Gajim jako výchozí Jabber klient?" #~ msgid "Always check to see if Gajim is the default Jabber client on startup" #~ msgstr "Vždy zkontroluj při startu, zda je Gajim výchozí Jabber klient." #~ msgid "Send Single Message" #~ msgstr "Ode_slat jednoduchou zprávu" #~ msgid "Execute Command..." #~ msgstr "Provést příkaz..." #~ msgid " a window/tab opened with that contact " #~ msgstr "okno/žáložka otevřená s tímto kontaktem" #~ msgid "Actions" #~ msgstr "Akce" #~ msgid "Conditions" #~ msgstr "Podmínky" #~ msgid "Advanced Actions" #~ msgstr "Pokročilé akce" #~ msgid "Advanced Notifications Control" #~ msgstr "Pokročilá správa upozorňování" #~ msgid "Busy " #~ msgstr "Nerušit" #, fuzzy #~ msgid "Contact Change Status " #~ msgstr "Kontakt změnil stav" #, fuzzy #~ msgid "Contact Disconnected " #~ msgstr "Kontakt se odpojil" #~ msgid "Don't have " #~ msgstr "Nemá" #~ msgid "File Transfer Started " #~ msgstr "Přenos souboru zahájen" #, fuzzy #~ msgid "Group Chat Message Highlight " #~ msgstr "Zvýraznění zprávy v diskuzi" #, fuzzy #~ msgid "Group Chat Message Received " #~ msgstr "Přijetí zprávy v diskuzi" #~ msgid "Launch a command" #~ msgstr "Provést příkaz" #~ msgid "One or more special statuses..." #~ msgstr "Jeden nebo více zvláštních stavů..." #~ msgid "Online / Free For Chat" #~ msgstr "Připojen / Ukecaný" #~ msgid "Play a sound" #~ msgstr "Přehrát zvuk" #~ msgid "When " #~ msgstr "Když" #~ msgid "" #~ "_Activate window manager's UrgencyHint to make chat window in taskbar " #~ "flash" #~ msgstr "" #~ "_Aktivuj UrgencyHint window manageru pro blikání okna rozhovoru v liště " #~ "úloh" #~ msgid "_Disable auto opening chat window" #~ msgstr "_Vypnout automatické otevírání okna rozhovoru" #~ msgid "_Disable existing popup window" #~ msgstr "_Vypnout vyskakování existujících oken" #~ msgid "_Disable existing sound for this event" #~ msgstr "_Vypnout existující zvuky pro tuto událost" #, fuzzy #~ msgid "_Disable showing event in notification area" #~ msgstr "_Vypnout zobrazování události v rosteru" #~ msgid "_Disable showing event in roster" #~ msgstr "_Vypnout zobrazování události v rosteru" #~ msgid "_Inform me with a popup window" #~ msgstr "_Upozorni mě vyskočením okna" #~ msgid "_Open chat window with user" #~ msgstr "_Otevři okno rozhovoru s uživatelem" #~ msgid "_Show event in roster" #~ msgstr "_Zobrazit událost v rosteru" #~ msgid "and I " #~ msgstr "a já" #~ msgid "contact(s)" #~ msgstr "kontakt(y)" #~ msgid "everybody" #~ msgstr "každý" #~ msgid "for " #~ msgstr "pro" #, fuzzy #~ msgid "group(s)" #~ msgstr "Skupiny" #~ msgid "when I'm in" #~ msgstr "když jsem v " #, fuzzy #~ msgid "label" #~ msgstr "označit" #~ msgid "_Allow him/her to see my status" #~ msgstr "_Dovol kontaktu vidět můj stav" #, fuzzy #~ msgid "Descrition:" #~ msgstr "Popis:" #~ msgid "Advanced..." #~ msgstr "Rozšířené..." #~ msgid "Display _activity of contacts in roster" #~ msgstr "Zobrazovat čin_nosti kontaktů v seznamu" #~ msgid "Display _tunes of contacts in roster" #~ msgstr "Zobrazovat _hudbu kontaktů v seznamu" #~ msgid "Display m_ood of contacts in roster" #~ msgstr "Zobrazovat _nálady kontaktů v seznamu" #~ msgid "" #~ "If checked, Gajim will display the activity of contacts in the roster " #~ "window" #~ msgstr "" #~ "Pokud zaškrtnuto, Gajim bude zobrazovat avatary kontaktů v okně Seznamu a " #~ "v diskuzích" #, fuzzy #~ msgid "" #~ "If checked, Gajim will display the location of contacts in the roster " #~ "window" #~ msgstr "" #~ "Pokud zaškrtnuto, Gajim bude zobrazovat avatary kontaktů v okně Seznamu a " #~ "v diskuzích" #~ msgid "" #~ "If checked, Gajim will display the tunes of contacts in the roster window" #~ msgstr "" #~ "Pokud zaškrtnuto, Gajim bude zobrazovat avatary kontaktů v okně Seznamu a " #~ "v diskuzích" #~ msgid "User avatar:" #~ msgstr "Avatar:" #~ msgid "Gajim Instant Messenger" #~ msgstr "Gajim Instant Messenger" #~ msgid "English" #~ msgstr "Angličtina" #~ msgid "Belarusian" #~ msgstr "Běloruština" #~ msgid "Bulgarian" #~ msgstr "Bulharština" #~ msgid "Breton" #~ msgstr "Bretonština" #~ msgid "Czech" #~ msgstr "Čeština" #~ msgid "German" #~ msgstr "Němčina" #~ msgid "Greek" #~ msgstr "Řečtina" #~ msgid "British" #~ msgstr "Britština" #~ msgid "Esperanto" #~ msgstr "Esperanto" #~ msgid "Spanish" #~ msgstr "Španělština" #~ msgid "Basque" #~ msgstr "Baskičtina" #~ msgid "French" #~ msgstr "Francouzština" #~ msgid "Croatian" #~ msgstr "Chorvatština" #~ msgid "Italian" #~ msgstr "Italština" #~ msgid "Norwegian (b)" #~ msgstr "Norština (b)" #~ msgid "Dutch" #~ msgstr "Holandština" #~ msgid "Norwegian" #~ msgstr "Norština" #~ msgid "Polish" #~ msgstr "Polština" #~ msgid "Portuguese" #~ msgstr "Portugalština" #~ msgid "Brazilian Portuguese" #~ msgstr "Brazilská portugalština" #~ msgid "Russian" #~ msgstr "Ruština" #~ msgid "Serbian" #~ msgstr "Srbština" #~ msgid "Slovak" #~ msgstr "Slovenština" #~ msgid "Swedish" #~ msgstr "Švédština" #~ msgid "Chinese (Ch)" #~ msgstr "Čínština" #~ msgid "Spelling language" #~ msgstr "Kontrola jazyka" #~ msgid "" #~ "If True, Gajim will convert string between $$ and $$ to an image using " #~ "dvips and convert before insterting it in chat window." #~ msgstr "" #~ "Je-li povoleno, Gajim převede řetězec mezi $$ a $$ na obrázek pomocí " #~ "dvips a převede před vložením do okna rozhovoru." #~ msgid "" #~ "Change the value to change the size of latex formulas displayed. The " #~ "higher is larger." #~ msgstr "" #~ "Změnou hodnoty změníte velikost zobrazovaných formulí latexu. Vyšší " #~ "znamená větší." #~ msgid "all or space separated status" #~ msgstr "všechny nebo mezerou oddělené stavy" #~ msgid "'yes', 'no', or 'both'" #~ msgstr "'yes', 'no', nebo 'both'" #~ msgid "'yes', 'no' or ''" #~ msgstr "'yes', 'no' nebo ''" #~ msgid "Check your connection or try again later" #~ msgstr "Ověřte připojení nebo zkuste později" #~ msgid "Error executing \"%(command)s\": %(error)s" #~ msgstr "chyba při spouštění \"%(command)s\": %(error)s" #~ msgid "error: cannot open %s for reading" #~ msgstr "chyba: nemůžu otevřít %s pro čtení" #~ msgid "Unable to bind to port %s." #~ msgstr "Nemohu naslouchat na portu %s." #~ msgid "" #~ "Maybe you have another running instance of Gajim. File Transfer will be " #~ "cancelled." #~ msgstr "" #~ "Možná máš puštěnou jinou instanci Gajimu. Přenos souborů bude zrušen." #~ msgid "A GTK+ jabber client" #~ msgstr "GTK+ Jabber client" #~ msgid "Condition" #~ msgstr "Podmínka" #~ msgid "when I am " #~ msgstr "když jsem " #~ msgid "Requires pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." #~ msgstr "Je potřeba pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." #~ msgid "Requires gpg and python-GnuPGInterface." #~ msgstr "Je potřeba gpg a python-GnuPGInterface." #~ msgid "LaTeX" #~ msgstr "LaTeX" #~ msgid "Transform LaTeX expressions between $$ $$." #~ msgstr "Převede LaTeX výraz mezi $$ $$." #, fuzzy #~ msgid "" #~ "Requires texlive-latex-base and (dvipng or ImageMagick). You have to set " #~ "'use_latex' to True in the Advanced Configuration Editor." #~ msgstr "" #~ "Je potřeba texlive-latex-base a dvipng. Dále musíte nastavit 'use_latex' " #~ "na True v Editoru rozšířeného nastavení." #, fuzzy #~ msgid "" #~ "Requires texlive-latex-base and (dvipng or ImageMagick) (All is in " #~ "MikTeX). You have to set 'use_latex' to True in the Advanced " #~ "Configuration Editor." #~ msgstr "" #~ "Je potřeba texlive-latex-base a dvipng (vše je v MikTeXu). Dále musíte " #~ "nastavit 'use_latex' na True v Editoru rozšířeného nastavení." #~ msgid "Requires python-farsight." #~ msgstr "Je potřeba python-farsight." #, fuzzy #~ msgid "one of: offline, online, chat, away, xa, dnd, invisible " #~ msgstr "" #~ "jeden z: odpojen, připojen, ukecaný, pryč, nedostupný, nerušit, " #~ "neviditelný " #, fuzzy #~ msgid "" #~ "Returns current status message(the global one unless account is specified)" #~ msgstr "Vrací aktuální popis stavu (globální, pokud není uveden účet)" #~ msgid "" #~ "Usage: %s %s %s \n" #~ "\t %s" #~ msgstr "" #~ "Použití: %s %s %s \n" #~ "\t %s" #, fuzzy #~ msgid "" #~ "Too many arguments. \n" #~ "Type \"%s help %s\" for more info" #~ msgstr "" #~ "Příliš mnoho parametrů. \n" #~ "Napište \"%(basename)s help %(command)s\" pro více informací" #, fuzzy #~ msgid "" #~ "Argument \"%s\" is not specified. \n" #~ "Type \"%s help %s\" for more info" #~ msgstr "" #~ "Parametr \"%(arg)s\" nebyl uveden. \n" #~ "Napište \"%(basename)s help %(command)s\" pro více informací" #~ msgid "Disk WriteError" #~ msgstr "Chyba zápisu na disk" #~ msgid "Subject: %s" #~ msgstr "Předmět: %s" #, fuzzy #~ msgid "Mood: %s" #~ msgstr "Nálada:" #, fuzzy #~ msgid "Activity: %s" #~ msgstr "Činnost:" #~ msgid "_Disable showing event in systray" #~ msgstr "_Vypnout zobrazování události vy systrayi" #~ msgid "_Show event in systray" #~ msgstr "_Zobrazit událost v systrayi" #~ msgid "Always use GNOME default applications" #~ msgstr "Vždy použít OS/X výchozí aplikace" #~ msgid "Always use Xfce default applications" #~ msgstr "Vždy použít OS/X výchozí aplikace" #~ msgid "Autodetect on every Gajim startup" #~ msgstr "_Připojit po startu Gajimu" #~ msgid "Show systray:" #~ msgstr "Zobraz oznamovací oblast:" #~ msgid "Nickname not allowed: %s" #~ msgstr "Přezdívka nepovolena: %s" #~ msgid "we are now subscribed to %s" #~ msgstr "jsme nyní zapsáni k %s" #~ msgid "we are now unsubscribed from %s" #~ msgstr "byla nám zrušena autorizace od %s" #~ msgid "Account Modification" #~ msgstr "Úprava účtu" #~ msgid "" #~ "Check this so Gajim will connect in port 5223 where legacy servers are " #~ "expected to have SSL capabilities. Note that Gajim uses TLS encryption by " #~ "default if broadcasted by the server, and with this option enabled TLS " #~ "will be disabled" #~ msgstr "" #~ "Zaškrtněte pokud se má Gajim připojit na port 5223, kde obvykle nabízejí " #~ "starší servery SSL. Pozor- Gajim použije TLS šifrování standardně, pokud " #~ "server ohlásí jeho podporu. Touto volbou bude TLS vypnuto" #~ msgid "Edit Personal Information..." #~ msgstr "Upravit osobní informace..." #~ msgid "Hostname: " #~ msgstr "Počítač: " #~ msgid "" #~ "If checked, Gajim will store the password in ~/.gajim/config with 'read' " #~ "permission only for you" #~ msgstr "" #~ "Pokud zaškrtnuto, Gajim uloží heslo v ~/.gajim/config s právem čtení " #~ "pouze pro Vás" #~ msgid "Port: " #~ msgstr "Port: " #~ msgid "Save _passphrase (insecure)" #~ msgstr "Uložit _heslo (nebezpečné)" #~ msgid "Use _SSL (legacy)" #~ msgstr "Použít _SSL (staré)" #~ msgid "gtk-add" #~ msgstr "gtk-add" #~ msgid "gtk-close" #~ msgstr "gtk-close" #~ msgid "gtk-remove" #~ msgstr "gtk-remove" #~ msgid "" #~ "Receive a Message\n" #~ "Contact Disconnected \n" #~ "Contact Change Status \n" #~ "Group Chat Message Highlight \n" #~ "Group Chat Message Received \n" #~ "File Transfer Request \n" #~ "File Transfer Started \n" #~ "File Transfer Finished" #~ msgstr "" #~ "Obdržet zprávu \n" #~ "Kontakt odpojen \n" #~ "Kontakt změnil stav \n" #~ "Zvýraznění zprávy z diskuze \n" #~ "Obdržení zprávy z diskuze \n" #~ "Žádost o přenos souboru \n" #~ "Začátek přenosu souboru \n" #~ "Ukončení přenosu souboru" #~ msgid "" #~ "contact(s)\n" #~ "group(s)\n" #~ "everybody" #~ msgstr "" #~ "kontakty\n" #~ "skupiny\n" #~ "všichni" #~ msgid "" #~ "Account row\n" #~ "Group row\n" #~ "Contact row\n" #~ "Chat Banner" #~ msgstr "" #~ "Řádek účtu\n" #~ "Řádek skupiny\n" #~ "Řádek kontaktu\n" #~ "Nadpis rozhovoru" #~ msgid "" #~ "Enter JID or Contact name\n" #~ "Groupchat Histories\n" #~ "All Chat Histories" #~ msgstr "" #~ "Zadej JID nebo jméno kontaktu\n" #~ "Historie diskuzí\n" #~ "Historie všech rozhovorů" #~ msgid "gtk-delete" #~ msgstr "gtk-delete" #~ msgid "Send a file (Ctrl+F)" #~ msgstr "Poslat soubor (Ctrl+F)" #~ msgid "" #~ "All chat states\n" #~ "Composing only\n" #~ "Disabled" #~ msgstr "" #~ "Všechny stavy rozhovoru\n" #~ "Pouze píšu zprávu\n" #~ "Vypnuto" #~ msgid "" #~ "Autodetect on every Gajim startup\n" #~ "Always use GNOME default applications\n" #~ "Always use KDE default applications\n" #~ "Always use Xfce default applications\n" #~ "Custom" #~ msgstr "" #~ "Automaticky zjistit při každém startu aplikace\n" #~ "Vždy použít výchozí aplikace z GNOME\n" #~ "Vždy použít výchozí aplikace z KDE\n" #~ "Vždy použít výchozí aplikace z Xfce\n" #~ "Vlastní" #~ msgid "" #~ "Detached roster with detached chats\n" #~ "Detached roster with single chat\n" #~ "Single window for everything\n" #~ "Detached roster with chat grouped by account\n" #~ "Detached roster with chat grouped by type" #~ msgstr "" #~ "Samostatný roster a samostatná okna pro diskuze\n" #~ "Samostatný roster s jedním diskuzním oknem\n" #~ "Samostatné okno pro všechno\n" #~ "Samostatný roster a samostatná okna pro diskuze pro každý účet\n" #~ "Samostatný roster s diskuzními okny podle typu" #~ msgid "" #~ "Pop it up\n" #~ "Notify me about it\n" #~ "Show only in roster" #~ msgstr "" #~ "Upozorni mě aktivací okna\n" #~ "Upozorni mě\n" #~ "Zobrazit pouze v rosteru" #~ msgid "" #~ "none\n" #~ "both\n" #~ "from\n" #~ "to" #~ msgstr "" #~ "žádná\n" #~ "oboustranná\n" #~ "ode mě\n" #~ "ke mě" #~ msgid "gtk-cancel" #~ msgstr "gtk-close" #~ msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." #~ msgstr "" #~ "Závislost na pysqlite2 (neboli python-pysqlite2) není splněna. Končím..." #~ msgid "Banners and clickable links" #~ msgstr "Bannery a klikatelné odkazy" #~ msgid "Ability to have clickable URLs in chat and groupchat window banners." #~ msgstr "" #~ "Funkce umožňující mít klikatelné URL odkazy v rozhovoru a předmětu " #~ "diskuze." #~ msgid "Requires python-sexy." #~ msgstr "Je potřeba python-sexy." #~ msgid "GTK+ runtime is missing libglade support" #~ msgstr "GTK+ runtime vyžaduje podporu libglade" #~ msgid "" #~ "Please remove your current GTK+ runtime and install the latest stable " #~ "version from %s" #~ msgstr "" #~ "Prosím odinstalujte stávající GTK+ runtime a nainstalujte poslední " #~ "stabilní verzi z %s" #~ msgid "" #~ "Please make sure that GTK+ and PyGTK have libglade support in your system." #~ msgstr "" #~ "Ujistěte se prosím, že GTK+ a PyGTK ve Vašem systému podporují libglade." #~ msgid "Gajim needs PySQLite2 to run" #~ msgstr "Gajim vyžaduje PySQLite2" #~ msgid "_Incoming message:" #~ msgstr "_Příchozí zpráva:" #~ msgid "_Outgoing message:" #~ msgstr "_Odchozí zpráva:" #~ msgid "gtk-ok" #~ msgstr "gtk-close" #~ msgid "" #~ "The host %s you configured as the ft_add_hosts_to_send advanced option is " #~ "not valid, so ignored." #~ msgstr "" #~ "Host %s nastevený jako ft_add_hosts_to_send má rozšířenou volbu chybnou, " #~ "bude ignorována." #~ msgid "OpenPGP passphrase was not given" #~ msgstr "OpenPGP heslo nebylo zadáno" #~ msgid "" #~ "To continue sending and receiving messages, you will need to reconnect." #~ msgstr "" #~ "Pro pokračování v přijímání a odesílání zpráv se musíte znovu připojit." #~ msgid "" #~ "You are not connected or not visible to others. Your message could not be " #~ "sent." #~ msgstr "" #~ "Nejsi připojen nebo viditelný pro ostatní. Tvoje zpráva nemůže být " #~ "odeslána." #~ msgid "[This message is encrypted]" #~ msgstr "[Tato zpráva je zašifrovaná]" #~ msgid "%i days ago" #~ msgstr "před %i dny" #~ msgid "Trayicon" #~ msgstr "Tray ikona" #~ msgid "A icon in systemtray reflecting the current presence." #~ msgstr "Ikona v systémové liště zobrazující aktuální stav." #~ msgid "" #~ "Requires python-gnome2-extras or compiled trayicon module from Gajim " #~ "sources." #~ msgstr "" #~ "Je potřeba python-gnome2-extras nebo zkompilovaný trayicon modul ze " #~ "zdrojáků Gajima." #~ msgid "Requires PyGTK >= 2.10." #~ msgstr "Je potřeba PyGTK verze 2.10. nebo vyšší." #~ msgid "Add Special _Notification" #~ msgstr "Přidat zvláštní _upozornění" #~ msgid "Assign Open_PGP Key" #~ msgstr "Přiřadit Open_PGP klíč" #~ msgid "Commands: %s" #~ msgstr "Příkazy: %s" #~ msgid "" #~ "Usage: /%(command)s , sends action to the current group chat. Use " #~ "third person. (e.g. /%(command)s explodes.)" #~ msgstr "" #~ "Použití: /%(command)s , pošle akci do aktuální místnosti. Použijte " #~ "třetí osobu (například /%(command)s explodoval.)" #~ msgid "No help info for /%s" #~ msgstr "Žádná další nápověda pro /%s" #~ msgid "Enable link-local/zeroconf messaging" #~ msgstr "Povolit lokální zprávy typu zeroconf" #~ msgid "Nickname not found: %s" #~ msgstr "Přezdívka nenalezena: %s" #~ msgid "This group chat has no subject" #~ msgstr "Místnost nemá žádné téma" #~ msgid "" #~ "Usage: /%s [reason], bans the JID from the group chat. The " #~ "nickname of an occupant may be substituted, but not if it contains \"@\". " #~ "If the JID is currently in the group chat, he/she/it will also be kicked." #~ msgstr "" #~ "Použití: /%s [důvod], zakáže JID přístup do místnosti. " #~ "Přezdívka nájemníka může být nahrazena, pokud neobsahuje \"@\". Pokud je " #~ "JID právě v místnosti, bude vyhozen. NEpodporuje mezery v přezdívce." #~ msgid "" #~ "Usage: /%s [reason], closes the current window or tab, displaying reason " #~ "if specified." #~ msgstr "" #~ "Použití: /%s [důvod], uzavře toto okno nebo záložku, a vypíše důvod, " #~ "pokud byl uveden." #~ msgid "" #~ "Usage: /%s [reason], invites JID to the current group chat, " #~ "optionally providing a reason." #~ msgstr "" #~ "Použití: /%s [důvod], pozve JID do této místnosti, případně s " #~ "uvedeným důvodem." #~ msgid "" #~ "Usage: /%s @[/nickname], offers to join room@server " #~ "optionally using specified nickname." #~ msgstr "" #~ "Použití: /%s @[/přezdívka], nabízí vstup do místnosti " #~ "místnost@server, případně s uvedenou přezdívkou." #~ msgid "" #~ "Usage: /%s [reason], removes the occupant specified by " #~ "nickname from the group chat and optionally displays a reason." #~ msgstr "" #~ "Použití: /%s [důvod], odstraní nájemníka určeného přezdívkou " #~ "z místnosti a případně zobrazí důvod. NEpodporuje mezery v přezdívce." #~ msgid "" #~ "Usage: /%s [message], opens a private message window and sends " #~ "message to the occupant specified by nickname." #~ msgstr "" #~ "Použití: /%s [zpráva], otevře okno se soukromou zprávou a " #~ "odešle zprávu nájemníkovi určeném přezdívkou." #~ msgid "Usage: /%s , changes your nickname in current group chat." #~ msgstr "Použití: /%s , změní Vaši přezdívku v aktuální místnosti" #~ msgid "" #~ "Usage: /%s [topic], displays or updates the current group chat topic." #~ msgstr "" #~ "Použití: /%s [téma], zobrazí nebo aktualizuje téma v aktuální místnosti." #~ msgid "" #~ "Usage: /%s , sends a message without looking for other commands." #~ msgstr "Použití: /%s , odešle zprávu bez hledání jiných příkazů." #~ msgid "" #~ "Usage: /%s , allow to send you messages and private " #~ "messages." #~ msgstr "Použití: /%s , změní Vaši přezdívku v aktuální místnosti" #~ msgid "B_OSH Port:" #~ msgstr "B_OSH Port:" #~ msgid "Select the account with which to synchronise" #~ msgstr "Vybrat účet pro synchronizaci" #~ msgid "File transfer stopped by the contact at the other end" #~ msgstr "Přenos souboru byl ukončen protistranou" #~ msgid "Generic" #~ msgstr "Obecné" #~ msgid "" #~ "%(title)s by %(artist)s\n" #~ "from %(source)s" #~ msgstr "" #~ "%(title)s od %(artist)s\n" #~ "z %(source)s" #~ msgid "This account is already configured in Gajim." #~ msgstr "Tento účet už je nastaven v Gajimu." #~ msgid "Mood" #~ msgstr "Nálada" #~ msgid "Activity" #~ msgstr "Činnost" #~ msgid "Click to see features (like MSN, ICQ transports) of jabber servers" #~ msgstr "" #~ "Klikněte pro seznam vlastností (jako MSN, ICQ transporty) jabber serverů" #~ msgid "Click to see past conversation in this room" #~ msgstr "Kliknutím zobraz historii konverzace v této místnosti" #~ msgid "History Viewer" #~ msgstr "Prohlížeč historie" #~ msgid "JID Selection" #~ msgstr "Výběr JID" #~ msgid "" #~ "Choose the chatlog you want to view. \n" #~ "Enter the jid of a groupchat or a contact here. For online accounts you " #~ "can even enter a a contact's nickname." #~ msgstr "" #~ "Vyber záznam rozhovoru pro zobrazení.\n" #~ "Zadej jid diskuze nebo kontaktu. Pro připojené účty můžeš zadat také " #~ "přezdívku kontaktu." #~ msgid "in" #~ msgstr "v" #~ msgid "Invitation Received" #~ msgstr "Přišlo pozvání" #~ msgid "Name:" #~ msgstr "Jméno:" #~ msgid "Publish and Subscribe" #~ msgstr "Zveřejni a odebírej" #~ msgid "Allow others to see your:" #~ msgstr "Povol ostatním vidět tvůj:" #~ msgid "" #~ "If checked, Gajim will sort contacts in roster window and groupcahts by " #~ "their status and not by the shown name" #~ msgstr "" #~ "Pokud zaškrtnuto, Gajim bude řadit kontakty v okně rosteru podle stavu, " #~ "nikoliv zobrazeného jména" #~ msgid "Receive your contact's:" #~ msgstr "Přijmi tvé kontakty:" #~ msgid "Tune" #~ msgstr "Píseň" #~ msgid "Avatar:" #~ msgstr "Avatar:" #~ msgid "Birthday:" #~ msgstr "Narozeniny:" #~ msgid "City:" #~ msgstr "Město:" #~ msgid "Company:" #~ msgstr "Společnost:" #~ msgid "Family:" #~ msgstr "Příjmení:" #~ msgid "Full Name" #~ msgstr "Celé jméno" #~ msgid "Given:" #~ msgstr "Křestní:" #~ msgid "Middle:" #~ msgstr "Prostřední:" #~ msgid "Position:" #~ msgstr "Pozice:" #~ msgid "Prefix:" #~ msgstr "Titul:" #~ msgid "Role:" #~ msgstr "Postavení:" #~ msgid "State:" #~ msgstr "Stát:" #~ msgid "Suffix:" #~ msgstr "Za jménem:" #~ msgid "A_ccounts" #~ msgstr "Úč_ty" #~ msgid "_Services" #~ msgstr "_Služby" #~ msgid "Ask:" #~ msgstr "Oslovení:" #~ msgid "Client:" #~ msgstr "Klient:" #~ msgid "OS:" #~ msgstr "OS:" #~ msgid "Modify Account" #~ msgstr "Upravit účet" #~ msgid "eating" #~ msgstr "Jím" #~ msgid "inactive" #~ msgstr "Neaktivní" #~ msgid "working" #~ msgstr "Pracuji" #~ msgid "day_off" #~ msgstr "volný den" #~ msgid "having_a_beer" #~ msgstr "Na pivě" #~ msgid "having_tea" #~ msgstr "Holím se" #~ msgid "in_a_car" #~ msgstr "v autě" #~ msgid "in_real_life" #~ msgstr "v reálném životě" #~ msgid "on_a_bus" #~ msgstr "v autobuse" #~ msgid "on_a_plane" #~ msgstr "V letadle" #~ msgid "on_a_train" #~ msgstr "Ve vlaku" #~ msgid "on_a_trip" #~ msgstr "na cestě" #~ msgid "on_the_phone" #~ msgstr "Zrovna telefonuji." #~ msgid "sleeping" #~ msgstr "Spím" #~ msgid "walking" #~ msgstr "Procházím se" #~ msgid "watching_tv" #~ msgstr "Sleduji TV" #~ msgid "watching_a_movie" #~ msgstr "Dívám se na film." #~ msgid "cold" #~ msgstr "Tučné" #~ msgid "hot" #~ msgstr "Vášnivý" #~ msgid "in_awe" #~ msgstr "devět" #~ msgid "in_love" #~ msgstr "zamilovaný" #~ msgid "moody" #~ msgstr "Náladový" #~ msgid "sick" #~ msgstr "Nemocný" #~ msgid "PyOpenSSL" #~ msgstr "PyOpenSSL" #~ msgid "gnome-keyring" #~ msgstr "gnome-keyring" #~ msgid "" #~ "Requires python-gnome2-extras or compilation of gtkspell module from " #~ "Gajim sources." #~ msgstr "" #~ "Je potřeba python-gnome2-extras nebo zkompilovaný gtkspell modul ze " #~ "zdrojáků Gajima." #~ msgid "Idle" #~ msgstr "Nečinný" #~ msgid "Requires compilation of the idle module from Gajim sources." #~ msgstr "Je potřeba zkompilovat idle modul ze zdrojáků Gajima." #~ msgid "" #~ "Requires texlive-latex-base, dvips and imagemagick. You have to set " #~ "'use_latex' to True in the Advanced Configuration Editor." #~ msgstr "" #~ "Vyžaduje texlive-latex-base, dvips a imagemagick. Dále musíte nastavit " #~ "'use_latex' na True v Editoru rozšířeného nastavení." #~ msgid "libsexy" #~ msgstr "libsexy" #~ msgid "%s is now known as %s" #~ msgstr "%s se nyní nazývá %s" #~ msgid "%s is now %s (%s)" #~ msgstr "%s je nyní %s (%s)" #~ msgid "%s is now %s" #~ msgstr "%s je nyní %s" #~ msgid "" #~ "\n" #~ "From: %(from_address)s" #~ msgstr "" #~ "\n" #~ "Odesílatel: %(from_address)s" #~ msgid "Network Manager support not available" #~ msgstr "Podpora Network Manageru není dostupná" #~ msgid "Session Management support not available (missing gnome.ui module)" #~ msgstr "Podpora Správce sezení není dostupná (schází gnome.ui modul)" #~ msgid "No such command: /%s (if you want to send this, prefix it with /say)" #~ msgstr "" #~ "Neexistující příkaz: /%s (chceš-li poslat tohle, napiš před to /say)" #~ msgid "" #~ "Usage: /%s , sends action to the current group chat. Use third " #~ "person. (e.g. /%s explodes.)" #~ msgstr "" #~ "Použití: /%s , pošle akci do aktuální místnosti. Použijte třetí " #~ "osobu (například /%s explodoval.)" #~ msgid "E2E encryption enabled" #~ msgstr "E2E šifrování zapnuto" #~ msgid "OK to continue with negotiation?" #~ msgstr "Pokračovat s dohadováním?" #~ msgid "" #~ "You've begun an encrypted session with %s, but it can't be guaranteed " #~ "that you're talking directly to the person you think you are.\n" #~ "\n" #~ "You should speak with them directly (in person or on the phone) and " #~ "confirm that their Short Authentication String is identical to this one: " #~ "%s\n" #~ "\n" #~ "Would you like to continue with the encrypted session?" #~ msgstr "" #~ "Započal(a) jsi šifrované sezení s %s, ale nemůžu zaručit, že mluvíš přímo " #~ "se zamýšleným člověkem.\n" #~ "Měl(a) by sis s ním promluvit přímo (tváří v tvář nebo telefonicky) a " #~ "ujistit se, zda je jeho Short Authentication String identická s tímto: " #~ "%s\n" #~ "\n" #~ "Přejete si pokračovat s šifrovaném sezení?" #~ msgid "Yes, I verified the Short Authentication String" #~ msgstr "Ano, ověřil(a) jsem Short Authentication String" #~ msgid "\"%(title)s\" by %(artist)s" #~ msgstr "\"%(title)s\" od %(artist)s" #~ msgid "" #~ "To continue, Gajim needs to access your stored secrets. Enter your " #~ "passphrase" #~ msgstr "Pro pokračování potřebuje Gajim uložená tajemství.Zadej heslo" #~ msgid "Confirm Passphrase" #~ msgstr "Potvrďte heslo" #~ msgid "Enter your new passphrase again for confirmation" #~ msgstr "Zadejte nové heslo znovu pro ověření" #~ msgid "Create Passphrase" #~ msgstr "Vytvořit heslo" #~ msgid "Passphrases did not match.\n" #~ msgstr "Hesla se neshodují.\n" #~ msgid "Gajim needs you to create a passphrase to encrypt stored secrets" #~ msgstr "Gajim potřebuje vytvořit heslo pro zašifrování uložených tajemství" #~ msgid "Affiliation:" #~ msgstr "Vztah:" #~ msgid "" #~ "If checked, Gajim can regularly poll a Last.fm account and adjust the " #~ "status message to reflect recently played songs. " #~ "set_status_msg_from_current_music_track option must be False." #~ msgstr "" #~ "Při zaškrtnutí bude Gajim pravidelně kontrolovat Last.fm účet a " #~ "nastavovat stavovou zprávu podle posledních přehrávaných skladeb.Volba " #~ "set_status_msg_from_current_track musí být False" #~ msgid "The username used to identify the Last.fm account." #~ msgstr "Uživatelské jméno pro Last.gm účet." #~ msgid "" #~ "When negotiating an encrypted session, should Gajim prefer to use public " #~ "keys for identification?" #~ msgstr "" #~ "Pokud sestavuji šifrované sezení, má Gajim upřednostnit použití veřejných " #~ "klíčů k identifikaci?" #~ msgid "" #~ "Subject: %s\n" #~ "%s" #~ msgstr "" #~ "Předmět: %s\n" #~ "%s" #~ msgid "Gajim account %s" #~ msgstr "Gajim účet %s" #~ msgid "Connection to host could not be established" #~ msgstr "Spojení s počítačem se nepodařilo navázat." #~ msgid "" #~ "Connection to host could not be established: Incorrect answer from server." #~ msgstr "Spojení k počítači nebylo navázáno: Neplatná odpověd od serveru" #~ msgid "Verify remote identity" #~ msgstr "Ověřit identitu" #~ msgid "\"%(title)s\" by " #~ msgstr "\"%(title)s\" od" #~ msgid "Thoughtful" #~ msgstr "Zamyšlený" gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/po/da.po000066400000000000000000012212721326020644600222540ustar00rootroot00000000000000# Danish translations for Gajim package. # Copyright (C) 2007 GAJIM'S COPYRIGHT HOLDER # This file is distributed under the same license as the Gajim package. # # Niels Felsted Thorsen , 2007, 2009. msgid "" msgstr "" "Project-Id-Version: Gajim 0.13\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-03-31 02:05+0000\n" "PO-Revision-Date: 2009-11-18 19:33+0100\n" "Last-Translator: Niels Felsted Thorsen \n" "Language-Team: <>\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Emacs 22.1.50.1, po-mode 2.02+0.4\n" #: gajim/chat_control_base.py:199 msgid "Ping?" msgstr "Ping?" #: gajim/chat_control_base.py:204 msgid "Error." msgstr "Fejl." #: gajim/chat_control_base.py:571 msgid "_Undo" msgstr "" #: gajim/chat_control_base.py:579 gajim/profile_window.py:181 #: gajim/conversation_textview.py:539 msgid "_Clear" msgstr "" #: gajim/chat_control_base.py:1172 msgid "Really send file?" msgstr "Virkelig send denne fil?" #: gajim/chat_control_base.py:1173 #, fuzzy, python-format msgid "If you send a file to %s, he/she will know your real JID." msgstr "" "Hvis du sender en fil til %s, vil han eller hun få at vide dit rigtige " "Jabber ID." #: gajim/session.py:451 gajim/session.py:511 msgid "Confirm these session options" msgstr "Bekræft disse sessions indstillinger" #: gajim/session.py:453 #, fuzzy, python-format msgid "" "The remote client wants to negotiate a session with these features:\n" "\n" "%s\n" "\n" "Are these options acceptable?" msgstr "" "Den fjerne klient vil forhandle en session med disse egenskaber:\n" "\n" "\t%s\n" "\n" "\tKan disse indstillinger godkendes?" #: gajim/session.py:513 #, python-format msgid "" "The remote client selected these options:\n" "\n" "%s\n" "\n" "Continue with the session?" msgstr "" "Den fjerne klient valgte disse indstillinger:\n" "\n" "%s\n" "\n" "Fortsæt med sessionen?" #: gajim/session.py:516 #, fuzzy msgid "Always accept for this contact" msgstr "Er OpenPGP aktiveret for denne kontakt?" #: gajim/filetransfers_window.py:89 msgid "File" msgstr "Fil" #: gajim/filetransfers_window.py:104 msgid "Time" msgstr "Tid" #: gajim/filetransfers_window.py:116 msgid "Progress" msgstr "Fremgang" #: gajim/filetransfers_window.py:223 gajim/filetransfers_window.py:279 #, python-format msgid "Filename: %s" msgstr "Filnavn: %s" #: gajim/filetransfers_window.py:224 gajim/filetransfers_window.py:486 #, python-format msgid "Size: %s" msgstr "Størrelse: %s" #: gajim/filetransfers_window.py:233 gajim/filetransfers_window.py:243 #: gajim/history_manager.py:528 msgid "You" msgstr "Du" #: gajim/filetransfers_window.py:234 #, python-format msgid "Sender: %s" msgstr "Afsender: %s" #: gajim/filetransfers_window.py:235 gajim/filetransfers_window.py:763 #: gajim/tooltips.py:667 msgid "Recipient: " msgstr "Modtager: " #: gajim/filetransfers_window.py:246 #, python-format msgid "Saved in: %s" msgstr "Gemt i: %s" #: gajim/filetransfers_window.py:248 gajim/chat_control.py:1617 msgid "File transfer completed" msgstr "Filoverførsel er fuldført" #: gajim/filetransfers_window.py:250 gajim/chat_control.py:1621 #, fuzzy msgid "Open _Containing Folder" msgstr "_Åbn folderen med filen" #: gajim/filetransfers_window.py:263 gajim/filetransfers_window.py:270 #: gajim/chat_control.py:1676 msgid "File transfer cancelled" msgstr "Filoverførsel er afbrudt" #: gajim/filetransfers_window.py:263 gajim/filetransfers_window.py:271 #: gajim/chat_control.py:1677 msgid "Connection with peer cannot be established." msgstr "Tilslutning til ligeværdige kan ikke oprettes." #: gajim/filetransfers_window.py:280 #, python-format msgid "Recipient: %s" msgstr "Modtager: %s" #: gajim/filetransfers_window.py:282 #, python-format msgid "Error message: %s" msgstr "Fejl besked: %s" #: gajim/filetransfers_window.py:283 gajim/chat_control.py:1673 msgid "File transfer stopped" msgstr "Filoverførsel stoppede" #: gajim/filetransfers_window.py:319 #, python-format msgid "" "The file %(file)s has been received, but it seems to have been damaged along " "the way.\n" "Do you want to download it again?" msgstr "" #: gajim/filetransfers_window.py:345 #, fuzzy msgid "Choose File to Send…" msgstr "Vælg en Fil at Sende..." #: gajim/filetransfers_window.py:356 msgid "_Send" msgstr "_Send" #: gajim/filetransfers_window.py:363 gajim/tooltips.py:702 msgid "Description: " msgstr "Beskrivelse: " #: gajim/filetransfers_window.py:376 #, fuzzy msgid "Gajim can not read this file" msgstr "Gajim kan ikke tilgå denne fil" #: gajim/filetransfers_window.py:377 msgid "Another process is using this file." msgstr "" #: gajim/filetransfers_window.py:422 gajim/gtkgui_helpers.py:492 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Kan ikke overskrive den eksisterende fil \"%s\"" #: gajim/filetransfers_window.py:423 gajim/gtkgui_helpers.py:493 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." msgstr "" "En fil med dette navn eksisterer allerede og du har ikke rettigheder til at " "overskrive den." #: gajim/filetransfers_window.py:440 gajim/gtkgui_helpers.py:497 msgid "This file already exists" msgstr "Denne fil eksisterer allerede" #: gajim/filetransfers_window.py:440 gajim/gtkgui_helpers.py:497 msgid "What do you want to do?" msgstr "Hvad vil du gøre?" #: gajim/filetransfers_window.py:451 gajim/gtkgui_helpers.py:504 #, python-format msgid "Directory \"%s\" is not writable" msgstr "Kataloget \"%s\" er ikke skrivbart" #: gajim/filetransfers_window.py:452 gajim/gtkgui_helpers.py:505 msgid "You do not have permission to create files in this directory." msgstr "Du har ikke rettigheder til at oprette filer i dette katalog." #: gajim/filetransfers_window.py:463 #, fuzzy msgid "Save File as…" msgstr "Gem Fil som..." #: gajim/filetransfers_window.py:483 #, python-format msgid "File: %s" msgstr "Fil: %s" #: gajim/filetransfers_window.py:489 #, python-format msgid "Type: %s" msgstr "Type: %s" #: gajim/filetransfers_window.py:491 #, python-format msgid "Description: %s" msgstr "Beskrivelse: %s" #: gajim/filetransfers_window.py:492 #, python-format msgid "%s wants to send you a file:" msgstr "%s vil gerne sende dig en fil:" #: gajim/filetransfers_window.py:533 #, fuzzy msgid "Checking file…" msgstr "Sender profil..." #: gajim/filetransfers_window.py:547 #, fuzzy msgid "File error" msgstr "Filoverførsel Fejl" #: gajim/filetransfers_window.py:584 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" #: gajim/filetransfers_window.py:677 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" #: gajim/filetransfers_window.py:730 gajim/filetransfers_window.py:733 msgid "Invalid File" msgstr "Ugyldig Fil" #: gajim/filetransfers_window.py:730 msgid "File: " msgstr "Fil: " #: gajim/filetransfers_window.py:734 msgid "It is not possible to send empty files" msgstr "Det er ikke mulig at sende tomme filer" #: gajim/filetransfers_window.py:759 gajim/tooltips.py:658 msgid "Name: " msgstr "Navn: " #: gajim/filetransfers_window.py:761 gajim/tooltips.py:661 msgid "Sender: " msgstr "Afsender: " #: gajim/filetransfers_window.py:889 msgid "Pause" msgstr "Pause" #: gajim/filetransfers_window.py:900 msgid "_Continue" msgstr "_Fortsæt" #: gajim/features_window.py:48 msgid "Bonjour / Zeroconf" msgstr "Bonjour / Zeroconf" #: gajim/features_window.py:49 msgid "Serverless chatting with autodetected clients in a local network." msgstr "" "Serverløs samtale med automatisk opdagede klienter i et lokalt netværk." #: gajim/features_window.py:50 msgid "Requires python-avahi." msgstr "Kræver python-avahi." #: gajim/features_window.py:51 msgid "" "Requires pybonjour and bonjour SDK running (http://developer.apple.com/" "opensource/)." msgstr "" #: gajim/features_window.py:52 msgid "Command line" msgstr "Kommandolinje" #: gajim/features_window.py:53 msgid "A script to control Gajim via commandline." msgstr "Et script til at kontrollere Gajim via kommandolinjen." #: gajim/features_window.py:54 msgid "Requires python-dbus." msgstr "Kræver python-dbus." #: gajim/features_window.py:55 gajim/features_window.py:83 #: gajim/features_window.py:87 msgid "Feature not available under Windows." msgstr "Egenskab ikke tilgængelig under Windows." #: gajim/features_window.py:56 #, fuzzy msgid "OpenPGP message encryption" msgstr "OpenPGP besked kryptering" #: gajim/features_window.py:57 #, fuzzy msgid "Ability to encrypting chat messages with OpenPGP." msgstr "Krypterer samtale beskeder med gpg nøgler." #: gajim/features_window.py:58 msgid "Requires gpg and python-gnupg (http://code.google.com/p/python-gnupg/)." msgstr "" #: gajim/features_window.py:59 msgid "Requires gpg.exe in PATH." msgstr "" #: gajim/features_window.py:60 msgid "Password encryption" msgstr "Adgangskodekryptering" #: gajim/features_window.py:61 msgid "Passwords can be stored securely and not just in plaintext." msgstr "Adgangskoder kan blive gemt sikkert og ikke bare i ren tekst." #: gajim/features_window.py:62 msgid "" "Requires libsecret and a provider (such as GNOME Keyring and KSecretService)." msgstr "" #: gajim/features_window.py:63 msgid "On Windows the Windows Credential Vault is used." msgstr "" #: gajim/features_window.py:64 msgid "Spell Checker" msgstr "Stavekontrol" #: gajim/features_window.py:65 msgid "Spellchecking of composed messages." msgstr "Stavekontrol af forfattede beskeder." #: gajim/features_window.py:66 gajim/features_window.py:67 #, fuzzy msgid "Requires Gspell" msgstr "Kræver libgtkspell." #: gajim/features_window.py:68 msgid "Automatic status" msgstr "Automatisk status" #: gajim/features_window.py:69 msgid "Ability to measure idle time, in order to set auto status." msgstr "Evnen til at måle tomgangs tid, for at kunne sætte automatisk status." #: gajim/features_window.py:70 msgid "Requires libxss library." msgstr "Biblioteket libxss kræves" #: gajim/features_window.py:71 msgid "Requires python2.5." msgstr "Kræver python2.5." #: gajim/features_window.py:72 msgid "End to End message encryption" msgstr "Ende til Ende besked kryptering" #: gajim/features_window.py:73 msgid "Encrypting chat messages." msgstr "Krypterer samtale beskeder." #: gajim/features_window.py:74 gajim/features_window.py:75 msgid "Requires python-crypto." msgstr "Kræver python-crypto." #: gajim/features_window.py:76 msgid "RST Generator" msgstr "RST Generator" #: gajim/features_window.py:77 msgid "" "Generate XHTML output from RST code (see http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." msgstr "" "Generer XHTML uddata fra RST kode (se http://docutils.sourceforge.net/docs/" "ref/rst/restructuredtext.html)." #: gajim/features_window.py:78 gajim/features_window.py:79 msgid "Requires python-docutils." msgstr "Kræver python-docutils." #: gajim/features_window.py:80 gajim/data/gui/preferences_window.ui:2421 msgid "Audio / Video" msgstr "" #: gajim/features_window.py:81 msgid "Ability to start audio and video chat." msgstr "" #: gajim/features_window.py:82 msgid "" "Requires gir1.2-farstream-0.2, gir1.2-gstreamer-1.0, gstreamer1.0-libav and " "gstreamer1.0-plugins-ugly." msgstr "" #: gajim/features_window.py:84 msgid "UPnP-IGD" msgstr "" #: gajim/features_window.py:85 msgid "Ability to request your router to forward port for file transfer." msgstr "" #: gajim/features_window.py:86 #, fuzzy msgid "Requires gir1.2-gupnpigd-1.0." msgstr "Kræver python-gnome2." #: gajim/features_window.py:94 #, fuzzy msgid "?features:Available" msgstr "Tilgængelig" #: gajim/features_window.py:101 msgid "Feature" msgstr "Egenskab" #: gajim/gtkgui_helpers.py:255 msgid "Error reading file:" msgstr "Fejl ved læsning af fil:" #: gajim/gtkgui_helpers.py:258 msgid "Error parsing file:" msgstr "Fejl ved fortolkning af fil:" #: gajim/gtkgui_helpers.py:478 msgid "Extension not supported" msgstr "Udvidelse er ikke understøttet" #: gajim/gtkgui_helpers.py:479 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "Billede kan ikke gemmes i formatet %(type)s. Gem som %(new_filename)s?" #: gajim/gtkgui_helpers.py:514 #, fuzzy msgid "Save Image as…" msgstr "Gem Billede som..." #: gajim/vcard.py:166 gajim/vcard.py:513 gajim/profile_window.py:175 #: gajim/chat_control.py:581 #, fuzzy msgid "Save _As" msgstr "Har" #: gajim/vcard.py:289 gajim/vcard.py:296 msgid "?Client:Unknown" msgstr "?Client:Ukendt" #: gajim/vcard.py:293 gajim/vcard.py:298 msgid "?OS:Unknown" msgstr "?OS:Ukendt" #: gajim/vcard.py:327 gajim/vcard.py:330 msgid "?Time:Unknown" msgstr "?Tid:Ukendt" #: gajim/vcard.py:381 msgid "?Role in Group Chat:Role:" msgstr "" #: gajim/vcard.py:385 msgid "Affiliation:" msgstr "Tilknytning:" #: gajim/vcard.py:392 #, fuzzy msgid "" "This contact is interested in your presence information, but you are not " "interested in their presence" msgstr "" "Denne kontakt er interesseret i din tilstedeværelses information, men du er " "ikke interesseret i hans/hendes tilstedeværelse" #: gajim/vcard.py:394 #, fuzzy msgid "" "You are interested in the contact's presence information, but it is not " "mutual" msgstr "" "Du er interesseret i kontaktens tilstedeværelses information, men han/hun er " "ikke interesseret i din" #: gajim/vcard.py:396 #, fuzzy msgid "The contact and you want to exchange presence information" msgstr "" "Du og kontakten er begge interessered i hinandens tilstedeværelses " "information" #: gajim/vcard.py:398 #, fuzzy msgid "" "You and the contact have a mutual disinterest in each-others presence " "information" msgstr "" "Du og kontakten er begge interessered i hinandens tilstedeværelses " "information" #: gajim/vcard.py:404 msgid "You are waiting contact's answer about your subscription request" msgstr "Du venter på kontaktens svar om din abonnements forespørsel" #: gajim/vcard.py:406 msgid "There is no pending subscription request." msgstr "Der er ikke nogen ventende abbonerings forespørgsler." #: gajim/vcard.py:411 gajim/vcard.py:455 gajim/vcard.py:568 msgid " resource with priority " msgstr " ressource med prioritet " #: gajim/options_dialog.py:383 gajim/dialogs.py:4806 gajim/dialogs.py:4848 #: gajim/dialogs.py:4896 gajim/dialogs.py:4986 msgid "All files" msgstr "Alle filer" #: gajim/options_dialog.py:392 #, fuzzy msgid "Clear File" msgstr "Gør Rent" #: gajim/options_dialog.py:474 #, fuzzy msgid "Manage Proxies" msgstr "Håndter Proxy Profiler" #: gajim/options_dialog.py:484 gajim/options_dialog.py:552 #: gajim/options_dialog.py:573 gajim/dialogs.py:326 gajim/dialogs.py:328 #: gajim/dialogs.py:536 gajim/dialogs.py:549 gajim/roster_window.py:2997 #: gajim/roster_window.py:3003 gajim/roster_window.py:3008 gajim/config.py:1162 #: gajim/config.py:1177 gajim/config.py:1182 gajim/config.py:1230 #: gajim/config.py:1340 gajim/config.py:2489 gajim/config.py:2566 #: gajim/data/gui/account_creation_wizard_window.ui:22 #: gajim/data/gui/change_mood_dialog.ui:98 msgid "None" msgstr "Ingen" #: gajim/options_dialog.py:506 #, fuzzy msgid "Adjust to Status" msgstr "_Tilpas til status" #: gajim/options_dialog.py:518 msgid "On" msgstr "" #: gajim/options_dialog.py:518 #, fuzzy msgid "Off" msgstr "Afkoblet" #: gajim/options_dialog.py:556 msgid "Failed to get secret keys" msgstr "Forsøg på at hente krypteringsnøgler mislykkedes" #: gajim/options_dialog.py:557 msgid "There is no OpenPGP secret key available." msgstr "Der er ikke nogen hemmelig OpenPGP nøgle tilgængelig." #: gajim/options_dialog.py:562 msgid "OpenPGP Key Selection" msgstr "OpenPGP Nøgle Valg" #: gajim/options_dialog.py:562 msgid "Choose your OpenPGP key" msgstr "Vælg din OpenPGP Nøgle" #: gajim/gui_menu_builder.py:100 msgid "_New Group Chat" msgstr "_Ny Gruppe Samtale" #: gajim/gui_menu_builder.py:292 gajim/gui_menu_builder.py:416 #: gajim/dialogs.py:1114 gajim/dialogs.py:2333 gajim/dialogs.py:2362 #: gajim/dialogs.py:3867 gajim/chat_control.py:284 gajim/roster_window.py:804 #: gajim/roster_window.py:1753 gajim/roster_window.py:1755 #: gajim/roster_window.py:2068 gajim/roster_window.py:3419 #: gajim/roster_window.py:3446 gajim/gui_interface.py:524 #: gajim/common/contacts.py:154 gajim/common/contacts.py:280 #: gajim/common/helpers.py:95 gajim/common/helpers.py:408 msgid "Not in Roster" msgstr "Ikke i Kontaktvinduet" #: gajim/gui_menu_builder.py:431 msgid "I would like to add you to my roster" msgstr "Jeg vil gerne tilføje dig til mit kontaktvindue" #: gajim/gui_menu_builder.py:508 #, fuzzy msgid "Send Single _Message…" msgstr "Send en Enkel _Besked" #: gajim/gui_menu_builder.py:521 gajim/roster_window.py:5165 #: gajim/data/gui/contact_context_menu.ui:58 msgid "Send Cus_tom Status" msgstr "Send _Tilpasset Status" #: gajim/gui_menu_builder.py:541 #, fuzzy msgid "E_xecute Command…" msgstr "_Kør Kommando" #: gajim/gui_menu_builder.py:549 msgid "_Manage Transport" msgstr "Hå_ndter Transport" #: gajim/gui_menu_builder.py:555 msgid "_Modify Transport" msgstr "_Modificer Transport" #: gajim/gui_menu_builder.py:562 gajim/roster_window.py:5195 #, fuzzy msgid "_Rename…" msgstr "_Omdøb" #: gajim/gui_menu_builder.py:573 gajim/roster_window.py:5212 #: gajim/roster_window.py:5327 gajim/data/gui/blocked_contacts_window.ui:52 #: gajim/data/gui/gc_occupants_menu.ui:148 #: gajim/data/gui/contact_context_menu.ui:166 msgid "_Unblock" msgstr "_Fjern blokering" #: gajim/gui_menu_builder.py:576 gajim/roster_window.py:5217 #: gajim/roster_window.py:5331 gajim/data/gui/gc_occupants_menu.ui:140 #: gajim/data/gui/contact_context_menu.ui:174 msgid "_Block" msgstr "_Bloker" #: gajim/gui_menu_builder.py:584 gajim/roster_window.py:5224 #: gajim/data/gui/contact_context_menu.ui:204 msgid "Remo_ve" msgstr "_Fjern" #: gajim/gui_menu_builder.py:594 gajim/data/gui/search_window.ui:98 msgid "_Information" msgstr "_Information" #: gajim/gui_menu_builder.py:611 #, fuzzy msgid "Send File..." msgstr "Send _Fil..." #: gajim/gui_menu_builder.py:615 #, fuzzy msgid "Invite Contacts" msgstr "Inviter _Kontakter" #: gajim/gui_menu_builder.py:616 #, fuzzy msgid "Add to Roster" msgstr "_Tilføj til Kontaktliste" #: gajim/gui_menu_builder.py:617 msgid "Audio Session" msgstr "" #: gajim/gui_menu_builder.py:618 msgid "Video Session" msgstr "" #: gajim/gui_menu_builder.py:619 #, fuzzy msgid "Information" msgstr "_Information" #: gajim/gui_menu_builder.py:620 gajim/gui_menu_builder.py:655 #: gajim/data/gui/application_menu.ui:37 #, fuzzy msgid "History" msgstr "_Historie" #: gajim/gui_menu_builder.py:644 #, fuzzy msgid "Manage Room" msgstr "Håndter Ru_m" #: gajim/gui_menu_builder.py:645 #, fuzzy msgid "Change Subject" msgstr "Ændre _Emne..." #: gajim/gui_menu_builder.py:646 #, fuzzy msgid "Configure Room" msgstr "Tilpas _Rum..." #: gajim/gui_menu_builder.py:647 #, fuzzy msgid "Destroy Room" msgstr "_Slet rum" #: gajim/gui_menu_builder.py:649 #, fuzzy msgid "Change Nick" msgstr "Ændre _Kælenavn..." #: gajim/gui_menu_builder.py:650 #, fuzzy msgid "Bookmark Room" msgstr "Bogmærk dette rom" #: gajim/gui_menu_builder.py:651 #, fuzzy msgid "Request Voice" msgstr "_Stemme" #: gajim/gui_menu_builder.py:652 gajim/data/gui/gc_control_popup_menu.ui:72 #, fuzzy msgid "Notify on all messages" msgstr "Forvalgte beskeder:" #: gajim/gui_menu_builder.py:653 #, fuzzy msgid "Minimize on close" msgstr "_Minimer ved lukning" #: gajim/gui_menu_builder.py:654 gajim/roster_window.py:5397 #, fuzzy msgid "Execute command" msgstr "_Kør Kommando" #: gajim/gui_menu_builder.py:656 #, fuzzy msgid "Disconnect" msgstr "Afbry_d tilslutningen" #: gajim/gui_menu_builder.py:685 gajim/gui_menu_builder.py:732 msgid "Join Group Chat" msgstr "Bliv med i en Gruppe Samtale" #: gajim/gui_menu_builder.py:731 #, fuzzy msgid "Add Contact..." msgstr "_Tilføj Kontakt..." #: gajim/gui_menu_builder.py:733 gajim/accounts_window.py:460 #: gajim/accounts_window.py:555 gajim/accounts_window.py:594 #, fuzzy msgid "Profile" msgstr "fil" #: gajim/gui_menu_builder.py:734 #, fuzzy msgid "Discover Services" msgstr "Op_dag Tjenester" #: gajim/gui_menu_builder.py:735 #, fuzzy msgid "Send Single Message..." msgstr "Send en Enkel _Besked..." #: gajim/gui_menu_builder.py:736 gajim/data/gui/preferences_window.ui:2846 msgid "Advanced" msgstr "Avanceret" #: gajim/gui_menu_builder.py:737 #, fuzzy msgid "Archiving Preferences" msgstr "_Indstillinger" #: gajim/gui_menu_builder.py:738 gajim/history_sync.py:44 #, fuzzy msgid "Synchronise History" msgstr "Synkroniser" #: gajim/gui_menu_builder.py:739 gajim/dialogs.py:4583 msgid "Privacy Lists" msgstr "Privatlivs lister" #: gajim/gui_menu_builder.py:740 gajim/server_info.py:37 #, fuzzy msgid "Server Info" msgstr "Server" #: gajim/gui_menu_builder.py:741 gajim/data/gui/xml_console_window.ui:77 msgid "XML Console" msgstr "XML Konsol" #: gajim/gui_menu_builder.py:743 #, fuzzy msgid "Admin" msgstr "_Administrator" #: gajim/gui_menu_builder.py:744 #, fuzzy msgid "Send Server Message..." msgstr "_Send Server Besked..." #: gajim/gui_menu_builder.py:745 msgid "Set MOTD..." msgstr "Sæt MOTD..." #: gajim/gui_menu_builder.py:746 msgid "Update MOTD..." msgstr "Opdater MOTD..." #: gajim/gui_menu_builder.py:747 #, fuzzy msgid "Delete MOTD..." msgstr "Slet MOTD" #: gajim/gui_menu_builder.py:787 #, fuzzy msgid "No Accounts available" msgstr "Ingen konto tilgængelig" #: gajim/gui_menu_builder.py:799 gajim/data/gui/accounts_window.ui:78 #: gajim/data/gui/application_menu.ui:5 gajim/data/gui/application_menu.ui:71 #: gajim/data/gui/shortcuts_window.ui:181 msgid "Accounts" msgstr "Konti" #: gajim/history_manager.py:56 #, fuzzy msgid "Usage:" msgstr "besked" #: gajim/history_manager.py:58 #, fuzzy msgid "Options:" msgstr "Føl_elsesikoner:" #: gajim/history_manager.py:60 msgid "Show this help message and exit" msgstr "" #: gajim/history_manager.py:61 msgid "Choose folder for logfile" msgstr "" #: gajim/history_manager.py:104 msgid "Cannot find history logs database" msgstr "Kan ikke finde historik log databasen" #: gajim/history_manager.py:144 gajim/history_manager.py:195 #: gajim/dialogs.py:3848 gajim/config.py:1621 gajim/disco.py:872 msgid "JID" msgstr "JID" #: gajim/history_manager.py:157 gajim/history_manager.py:201 #: gajim/history_window.py:108 msgid "Date" msgstr "Dato" #: gajim/history_manager.py:164 gajim/history_manager.py:220 #: gajim/data/gui/join_groupchat_window.ui:131 msgid "Nickname" msgstr "Kælenavn" #: gajim/history_manager.py:173 gajim/history_manager.py:208 #: gajim/history_window.py:116 gajim/data/gui/xml_console_window.ui:108 msgid "Message" msgstr "Besked" #: gajim/history_manager.py:181 gajim/history_manager.py:214 msgid "Subject" msgstr "Emne" #: gajim/history_manager.py:243 msgid "" "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " "RUNNING)" msgstr "" "Vil du rydde op i databasen? (DETTE ER IKKE ANBEFALET HVIS GAJIM KØRER)" #: gajim/history_manager.py:245 #, fuzzy msgid "" "Normally allocated database size will not be freed, it will just become " "reusable. If you really want to reduce database filesize, click YES, else " "click NO.\n" "\n" "In case you click YES, please wait…" msgstr "" "Normalt vil den allokerede database størrelse ikke blive frigjort, den vil " "bare kunne genbruges. Hvis du virkelig vil reducere database filstørrelsen, " "tryk JA, eller tryk NEJ.\n" "\n" "I tilfælde du trykker JA, venligst vent..." #: gajim/history_manager.py:250 #, fuzzy msgid "Database Cleanup" msgstr "Database Fejl" #: gajim/history_manager.py:464 #, fuzzy msgid "Exporting History Logs…" msgstr "Eksporter Historik Log..." #: gajim/history_manager.py:540 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "%(who)s klokken %(time)s sagde: %(message)s\n" #: gajim/history_manager.py:578 #, fuzzy, python-format msgid "Do you wish to delete all correspondence with %(jid)s?" msgstr "Vil du virkelig slette den valgte besked?" #: gajim/history_manager.py:582 #, fuzzy msgid "Do you wish to delete all correspondence with the selected contacts?" msgstr "Vil du virkelig slette loggen for den valgte kontakt?" #: gajim/history_manager.py:584 #, fuzzy msgid "This can not be undone." msgstr "Tjenesten findes ikke" #: gajim/history_manager.py:586 gajim/history_manager.py:625 #, fuzzy msgid "Deletion Confirmation" msgstr "Annuller bekræftelse" #: gajim/history_manager.py:620 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Vil du virkelig slette den valgte besked?" msgstr[1] "Vil du virkelig slette de valgte beskeder?" #: gajim/history_manager.py:623 msgid "This is an irreversible operation." msgstr "Dette er en irreversibel handling." #: gajim/profile_window.py:63 #, fuzzy msgid "Retrieving profile…" msgstr "Henter profil..." #: gajim/profile_window.py:128 msgid "Could not load image" msgstr "Kunne ikke laste billede" #: gajim/profile_window.py:200 #, fuzzy msgid "Wrong date format" msgstr "Kontakt Information" #: gajim/profile_window.py:201 #, fuzzy msgid "Format of the date must be YYYY-MM-DD" msgstr "Format: YYYY-MM-DD" #: gajim/profile_window.py:261 msgid "Information received" msgstr "Information modtaget" #: gajim/profile_window.py:334 gajim/dialogs.py:2562 gajim/dialogs.py:2650 #: gajim/dialogs.py:3105 gajim/disco.py:536 gajim/gui_interface.py:1849 #: gajim/dialog_messages.py:32 msgid "You are not connected to the server" msgstr "Du er ikke tilsluttet til serveren" #: gajim/profile_window.py:335 #, fuzzy msgid "Without a connection, you can not publish your contact information." msgstr "Uden en tilslutning kan du ikke publicere din kontakt information." #: gajim/profile_window.py:349 #, fuzzy msgid "Sending profile…" msgstr "Sender profil..." #: gajim/profile_window.py:368 msgid "Information NOT published" msgstr "Information er IKKE publiceret" #: gajim/profile_window.py:375 msgid "vCard publication failed" msgstr "vCard publicering fejlede" #: gajim/profile_window.py:376 msgid "" "There was an error while publishing your personal information, try again " "later." msgstr "" "Der var en fejl under publicering af din personlige information, prøv igen " "senere." #: gajim/dialogs.py:90 #, python-format msgid "Contact name: %s" msgstr "Kontakt navn: %s" #: gajim/dialogs.py:92 #, fuzzy, python-format msgid "JID: %s" msgstr "Jabber ID: %s" #: gajim/dialogs.py:121 gajim/dialogs.py:133 gajim/roster_window.py:2939 #: gajim/roster_window.py:3953 gajim/roster_window.py:5234 #: gajim/accounts_window.py:463 gajim/common/contacts.py:105 #: gajim/common/contacts.py:137 gajim/data/gui/preferences_window.ui:569 #: gajim/data/gui/shortcuts_window.ui:176 msgid "General" msgstr "General" #: gajim/dialogs.py:206 msgid "Group" msgstr "Gruppe" #: gajim/dialogs.py:213 msgid "In the group" msgstr "I gruppen" #: gajim/dialogs.py:308 msgid "KeyID" msgstr "Nøgle ID" #: gajim/dialogs.py:313 msgid "Contact name" msgstr "Kontakt navn" #: gajim/dialogs.py:491 msgid "Set Mood" msgstr "Sæt Humørstemning" #: gajim/dialogs.py:611 #, python-format msgid "%s Status Message" msgstr "%s Status Besked" #: gajim/dialogs.py:625 msgid "Status Message" msgstr "Status Besked" #: gajim/dialogs.py:815 msgid "Overwrite Status Message?" msgstr "Overskriv Status Besked?" #: gajim/dialogs.py:816 msgid "" "This name is already used. Do you want to overwrite this status message?" msgstr "Dette navn er allerede i brug. Vil du overskrive denne status besked?" #: gajim/dialogs.py:824 msgid "Save as Preset Status Message" msgstr "Gem som Forvalgt Status Besked" #: gajim/dialogs.py:825 msgid "Please type a name for this status message" msgstr "Skriv et navn for denne status besked" #: gajim/dialogs.py:852 msgid "JID:" msgstr "" #: gajim/dialogs.py:853 msgid "AIM Address:" msgstr "AIM Adresse:" #: gajim/dialogs.py:854 msgid "GG Number:" msgstr "GG Nummer:" #: gajim/dialogs.py:855 msgid "ICQ Number:" msgstr "ICQ Nummer:" #: gajim/dialogs.py:856 msgid "MSN Address:" msgstr "MSN Adresse:" #: gajim/dialogs.py:857 msgid "Yahoo! Address:" msgstr "Yahoo! Adresse:" #: gajim/dialogs.py:894 #, fuzzy, python-format msgid "" "Please fill in the data of the contact you want to add to your account " "%s" msgstr "Fyld ind data for den kontakt som du vil tilføje kontoen med navnet %s" #: gajim/dialogs.py:897 msgid "Please fill in the data of the contact you want to add" msgstr "Fyld ind data for den kontakt som du vil tilføje" #: gajim/dialogs.py:1089 gajim/dialogs.py:1095 gajim/dialogs.py:1100 msgid "Invalid User ID" msgstr "Ugyldig Bruger ID" #: gajim/dialogs.py:1096 msgid "The user ID must not contain a resource." msgstr "Bruger ID'en må ikke indeholde en resource." #: gajim/dialogs.py:1101 msgid "You cannot add yourself to your roster." msgstr "Du kan ikke tilføje dig selv til kontaktvinduet." #: gajim/dialogs.py:1115 msgid "Contact already in roster" msgstr "Kontakten er allerede i kontaktvinduet" #: gajim/dialogs.py:1116 msgid "This contact is already listed in your roster." msgstr "Denne kontakt er allered i dit kontaktvindue" #: gajim/dialogs.py:1169 gajim/dialogs.py:1203 msgid "User ID:" msgstr "Bruger ID:" #: gajim/dialogs.py:1269 #, fuzzy msgid "Error while adding transport contact" msgstr "Fejl ved tilføjelse af tjeneste. %s" #: gajim/dialogs.py:1270 #, python-format msgid "" "This error occured while adding a contact for transport %(transport)s:\n" "\n" "%(error)s" msgstr "" #: gajim/dialogs.py:1302 #, fuzzy msgid "A GTK+ XMPP client" msgstr "En GTK+ Jabber klient" #: gajim/dialogs.py:1303 #, fuzzy, python-format msgid "GTK+ Version: %s" msgstr "GTK+ Version:" #: gajim/dialogs.py:1304 #, fuzzy, python-format msgid "PyGObject Version: %s" msgstr "PyGTK Version:" #: gajim/dialogs.py:1305 #, python-format msgid "python-nbxmpp Version: %s" msgstr "" #: gajim/dialogs.py:1308 #, fuzzy msgid "Current Developers" msgstr "Nuværende Programudviklere:" #: gajim/dialogs.py:1309 #, fuzzy msgid "Past Developers" msgstr "Tidligere Programudviklerer:" #: gajim/dialogs.py:1310 msgid "Artists" msgstr "" #: gajim/dialogs.py:1314 msgid "Last but not least" msgstr "" #: gajim/dialogs.py:1315 #, fuzzy msgid "we would like to thank all the package maintainers." msgstr "Sidst men ikke mindst, vil vi gerne takke alle pakke vedligeholdere." #: gajim/dialogs.py:1316 #, fuzzy msgid "Thanks" msgstr "Taknemlig" #: gajim/dialogs.py:1318 msgid "translator-credits" msgstr "Niels Felsted Thorsen " #: gajim/dialogs.py:1503 #, fuzzy, python-format msgid "Dictionary for language \"%s\" not available" msgstr "Ordbog for sproget %s er ikke tilgængelig" #: gajim/dialogs.py:1504 #, fuzzy, python-format msgid "" "You have to install the dictionary \"%s\" to use spellchecking, or choose " "another language by setting the speller_language option.\n" "\n" "Highlighting misspelled words feature will not be used" msgstr "" "Du må installere en %s ordbog for at bruge stavekontrol, eller vælge et " "andet sprog med stavekontrol sprog indstillingen.\n" "\n" "Egenskaben med at fremhæve stavefejl vil ikke blive brugt" #: gajim/dialogs.py:1851 gajim/dialogs.py:1866 gajim/gui_interface.py:1511 #: gajim/gui_interface.py:1553 msgid "Insecure connection" msgstr "Ikke sikker forbindelse" #: gajim/dialogs.py:1852 #, fuzzy, python-format msgid "" "You are about to connect to the account %(account)s (%(server)s) insecurely. " "This means conversations will not be encrypted, and is strongly " "discouraged.\n" "Are you sure you want to do that?" msgstr "" "Du er ved at sende din adgangskode på en usikker forbindelse. Du bør " "installere PyOpenSSL for at forhindre dette. Er du sikker på du vil gøre " "dette?" #: gajim/dialogs.py:1857 gajim/gui_interface.py:1515 #: gajim/gui_interface.py:1556 msgid "Yes, I really want to connect insecurely" msgstr "Ja, jeg vil virkelig gerne tilslutte mig uden sikkerhed" #: gajim/dialogs.py:1858 msgid "Gajim will NOT connect unless you check this box" msgstr "" #: gajim/dialogs.py:1859 gajim/groupchat_control.py:2335 #: gajim/roster_window.py:2897 gajim/roster_window.py:3529 #: gajim/roster_window.py:4282 gajim/message_window.py:247 #: gajim/gui_interface.py:725 gajim/gui_interface.py:1516 #: gajim/gui_interface.py:1557 #, fuzzy msgid "_Do not ask me again" msgstr "Ikke spørg mig ige_n" #: gajim/dialogs.py:1957 msgid "_Resume" msgstr "" #: gajim/dialogs.py:1965 msgid "Re_place" msgstr "" #: gajim/dialogs.py:2168 gajim/config.py:2169 #: gajim/command_system/implementation/standard.py:261 msgid "Invalid nickname" msgstr "Ugyldigt kælenavn" #: gajim/dialogs.py:2169 #, fuzzy msgid "The nickname contains invalid characters." msgstr "Kælenavnet har ikke tilladte tegn." #: gajim/dialogs.py:2291 msgid "Subscription Request" msgstr "Abonnement Forespørgsel" #: gajim/dialogs.py:2300 #, python-format msgid "Subscription request for account %(account)s from %(jid)s" msgstr "Forespørgsel på abonnering for konto %(account)s fra %(jid)s" #: gajim/dialogs.py:2303 #, python-format msgid "Subscription request from %s" msgstr "Forespørgsel om abonnering fra %s" #: gajim/dialogs.py:2375 gajim/data/gui/join_groupchat_window.ui:312 #, fuzzy msgid "Join Groupchat" msgstr "Bliv med i en Gruppe Samtale" #: gajim/dialogs.py:2531 #, fuzzy msgid "Invalid Room" msgstr "Ugyldig rum" #: gajim/dialogs.py:2532 msgid "Please choose a room" msgstr "" #: gajim/dialogs.py:2544 gajim/dialogs.py:2551 msgid "Invalid Nickname" msgstr "Ugyldig Kælenavn" #: gajim/dialogs.py:2545 #, fuzzy msgid "Please choose a nickname" msgstr "Opret et nyt tema med dit ønskede navn." #: gajim/dialogs.py:2557 gajim/dialogs.py:3516 gajim/config.py:2453 #: gajim/dialog_messages.py:37 gajim/dialog_messages.py:42 msgid "Invalid JID" msgstr "Ugyldig JID" #: gajim/dialogs.py:2563 gajim/gui_interface.py:1850 msgid "You can not join a group chat unless you are connected." msgstr "Du kan kun deltage i en gruppe samtale hvis du er tilsluttet." #: gajim/dialogs.py:2617 gajim/dialogs.py:2628 #, fuzzy msgid "Wrong server" msgstr "Forkert uri" #: gajim/dialogs.py:2618 gajim/dialogs.py:2629 #, fuzzy, python-format msgid "%s is not a groupchat server" msgstr "Dette er ikke en gruppe samtale" #: gajim/dialogs.py:2651 msgid "Without a connection, you can not synchronise your contacts." msgstr "Du kan kun synkronisere dine kontakter når du er tilsluttet." #: gajim/dialogs.py:2662 gajim/dialogs.py:2733 gajim/dialogs.py:3851 #: gajim/history_window.py:100 gajim/disco.py:865 gajim/disco.py:1693 #: gajim/disco.py:1978 msgid "Name" msgstr "Navn" #: gajim/dialogs.py:2665 gajim/data/gui/join_groupchat_window.ui:214 msgid "Server" msgstr "Server" #: gajim/dialogs.py:2701 msgid "This account is not connected to the server" msgstr "Denne konto er ikke tilsluttet til serveren" #: gajim/dialogs.py:2702 msgid "You cannot synchronize with an account unless it is connected." msgstr "Du kan kun synkronisere med en konto hvis du er tilsluttet." #: gajim/dialogs.py:2731 msgid "Synchronise" msgstr "Synkroniser" #: gajim/dialogs.py:2794 #, fuzzy msgid "Start new Conversation" msgstr "Fortsat samtale" #: gajim/dialogs.py:3052 #, fuzzy msgid "New Groupchat" msgstr "Ny Gruppe Samtale" #: gajim/dialogs.py:3054 #, fuzzy msgid "New Contact" msgstr "Tilføj Ny Kontakt" #: gajim/dialogs.py:3106 msgid "Without a connection, you can not change your password." msgstr "Du kan kun ændre din adgangskode hvis du er tilsluttet." #: gajim/dialogs.py:3126 msgid "Invalid password" msgstr "Ugyldig adgangskode" #: gajim/dialogs.py:3126 msgid "You must enter a password." msgstr "Du må indtaste en adgangskode." #: gajim/dialogs.py:3130 msgid "Passwords do not match" msgstr "Adgangskoderne er ikke ens" #: gajim/dialogs.py:3131 msgid "The passwords typed in both fields must be identical." msgstr "Adgangskoderene i de to tekstindtastningsfelter må være identiske." #: gajim/dialogs.py:3169 gajim/notify.py:91 #: gajim/common/connection_handlers_events.py:2821 msgid "Contact Signed In" msgstr "Kontakt Loggede Ind" #: gajim/dialogs.py:3171 gajim/notify.py:91 #: gajim/common/connection_handlers_events.py:2827 msgid "Contact Signed Out" msgstr "Kontakt Loggede Ud" #: gajim/dialogs.py:3173 gajim/notify.py:92 gajim/notify.py:105 #: gajim/common/connection_handlers_events.py:2641 msgid "New Message" msgstr "Ny Besked" #: gajim/dialogs.py:3173 gajim/notify.py:92 gajim/notify.py:105 #: gajim/common/connection_handlers_events.py:2623 msgid "New Single Message" msgstr "Ny Enkel Besked" #: gajim/dialogs.py:3174 gajim/notify.py:92 gajim/notify.py:106 #: gajim/common/connection_handlers_events.py:2629 msgid "New Private Message" msgstr "Ny Privat Besked" #: gajim/dialogs.py:3174 msgid "New E-mail" msgstr "Ny E-post" #: gajim/dialogs.py:3176 gajim/gui_interface.py:926 gajim/notify.py:93 msgid "File Transfer Request" msgstr "Filoverførsel Forespørgsel" #: gajim/dialogs.py:3178 gajim/gui_interface.py:861 gajim/gui_interface.py:891 #: gajim/notify.py:94 msgid "File Transfer Error" msgstr "Filoverførsel Fejl" #: gajim/dialogs.py:3180 gajim/gui_interface.py:1030 #: gajim/gui_interface.py:1059 gajim/gui_interface.py:1080 gajim/notify.py:94 msgid "File Transfer Completed" msgstr "Filoverførsel er Fuldført" #: gajim/dialogs.py:3181 gajim/gui_interface.py:1034 #: gajim/gui_interface.py:1063 gajim/gui_interface.py:1084 gajim/notify.py:95 msgid "File Transfer Stopped" msgstr "Filoverførsel Stoppede" #: gajim/dialogs.py:3183 gajim/dialogs.py:4748 gajim/chat_control.py:1647 #: gajim/gui_interface.py:663 gajim/notify.py:95 msgid "Groupchat Invitation" msgstr "Gruppesamtale Invitation" #: gajim/dialogs.py:3185 gajim/notify.py:93 #: gajim/common/connection_handlers_events.py:2815 msgid "Contact Changed Status" msgstr "Kontakt Ændrede Status" #: gajim/dialogs.py:3404 #, python-format msgid "Single Message using account %s" msgstr "Enkel Besked med konto %s" #: gajim/dialogs.py:3406 #, python-format msgid "Single Message in account %s" msgstr "Enkel Besked i konto %s" #: gajim/dialogs.py:3408 msgid "Single Message" msgstr "Enkel Besked" #: gajim/dialogs.py:3411 #, python-format msgid "Send %s" msgstr "Send %s" #: gajim/dialogs.py:3434 #, python-format msgid "Received %s" msgstr "Modtaget %s" #: gajim/dialogs.py:3457 #, python-format msgid "Form %s" msgstr "Formular %s" #: gajim/dialogs.py:3485 gajim/dialogs.py:3672 msgid "Connection not available" msgstr "Tilslutning er ikke tilgængelig" #: gajim/dialogs.py:3486 gajim/dialogs.py:3673 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Vær venligst sikker på at du er tilsluttet med \"%s\"." #: gajim/dialogs.py:3517 gajim/dialog_messages.py:43 #, python-format msgid "It is not possible to send a message to %s, this JID is not valid." msgstr "Det er ikke mulig at sende en besked til %s, denne JID er ikke gyldig." #: gajim/dialogs.py:3540 #, python-format msgid "RE: %s" msgstr "SV: %s" #: gajim/dialogs.py:3541 #, python-format msgid "%s wrote:\n" msgstr "%s skrev:\n" #: gajim/dialogs.py:3589 gajim/data/gui/shortcuts_window.ui:113 #, fuzzy msgid "Clear" msgstr "Gør Rent" #: gajim/dialogs.py:3594 #, fuzzy msgid "Filter" msgstr "Filter:" #: gajim/dialogs.py:3599 #, fuzzy msgid "XML Input" msgstr "XML Inddata" #: gajim/dialogs.py:3603 #, fuzzy msgid "Send" msgstr "_Send" #: gajim/dialogs.py:3794 #, fuzzy msgid "add" msgstr "Trist" #: gajim/dialogs.py:3794 #, fuzzy msgid "modify" msgstr "Ændre" #: gajim/dialogs.py:3795 #, fuzzy msgid "remove" msgstr "_Fjern" #: gajim/dialogs.py:3824 #, fuzzy, python-format msgid "" "%(jid)s would like you to %(action)s some contacts in your " "roster." msgstr "" "%s vil gerne at du %s nogle kontakter i dit kontaktvindue." #: gajim/dialogs.py:3840 gajim/dialogs.py:3886 gajim/accounts_window.py:44 msgid "Add" msgstr "Tilføj" #: gajim/dialogs.py:3842 gajim/dialogs.py:3917 msgid "Modify" msgstr "Ændre" #: gajim/dialogs.py:3844 gajim/dialogs.py:3941 msgid "Delete" msgstr "Slet" #: gajim/dialogs.py:3854 msgid "Groups" msgstr "Grupper" #: gajim/dialogs.py:3962 #, python-format msgid "%s suggested me to add you in my roster." msgstr "%s foreslog mig at tilføje dig til min kontaktliste." #: gajim/dialogs.py:3976 #, fuzzy, python-format msgid "Added %d contact" msgid_plural "Added %d contacts" msgstr[0] "Tilføj Kont_akt" msgstr[1] "Tilføj Kont_akt" #: gajim/dialogs.py:4014 #, fuzzy, python-format msgid "Removed %d contact" msgid_plural "Removed %d contacts" msgstr[0] "Fjerner kontakt fra kontaktvinduet" msgstr[1] "Fjerner kontakt fra kontaktvinduet" #: gajim/dialogs.py:4040 #, python-format msgid "Archiving Preferences for %s" msgstr "" #: gajim/dialogs.py:4078 msgid "Success!" msgstr "" #: gajim/dialogs.py:4078 #, fuzzy msgid "Your Archiving Preferences have been saved!" msgstr "_Indstillinger" #: gajim/dialogs.py:4094 msgid "We got no response from the Server" msgstr "" #: gajim/dialogs.py:4096 #, fuzzy msgid "We received an error: {}" msgstr "Tjeneste returnerede en fejl." #: gajim/dialogs.py:4100 #, fuzzy msgid "Error!" msgstr "Fejl" #: gajim/dialogs.py:4159 #, fuzzy msgid "Add JID" msgstr "Jabber ID" #: gajim/dialogs.py:4232 #, python-format msgid "Privacy List %s" msgstr "Privatlivs Liste %s" #: gajim/dialogs.py:4236 #, python-format msgid "Privacy List for %s" msgstr "Privatlivs Liste for %s" #: gajim/dialogs.py:4238 gajim/data/gui/privacy_list_window.ui:47 msgid "Privacy List" msgstr "Privatlivs Liste" #: gajim/dialogs.py:4309 #, python-format msgid "Order: %(order)s, action: %(action)s, type: %(type)s, value: %(value)s" msgstr "" "Rækkefølge: %(order)s, handling: %(action)s, type: %(type)s, værdi: %(value)s" #: gajim/dialogs.py:4314 #, python-format msgid "Order: %(order)s, action: %(action)s" msgstr "Rækkefølge: %(order)s, handling: %(action)s" #: gajim/dialogs.py:4368 msgid "Edit a rule" msgstr "Rediger en regel" #: gajim/dialogs.py:4480 msgid "Add a rule" msgstr "Tilføj en regel" #: gajim/dialogs.py:4581 #, python-format msgid "Privacy Lists for %s" msgstr "Privatlivs Liste for %s" #: gajim/dialogs.py:4677 msgid "Invalid List Name" msgstr "Ugyldig Listenavn" #: gajim/dialogs.py:4678 msgid "You must enter a name to create a privacy list." msgstr "Du må indtaste et navn for at skabe en privatlivs liste." #: gajim/dialogs.py:4714 msgid "You are invited to a groupchat" msgstr "Du er inviteret til en gruppesamtale." #: gajim/dialogs.py:4717 msgid "$Contact has invited you to join a discussion" msgstr "$Contact har inviteret dig til at deltage i en diskussion" #: gajim/dialogs.py:4719 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "" "$Contact har inviteret dig til at deltage i en gruppe samtale %(room_jid)s" #: gajim/dialogs.py:4728 #, python-format msgid "Comment: %s" msgstr "Kommentar: %s" #: gajim/dialogs.py:4730 msgid "Do you want to accept the invitation?" msgstr "Vil du acceptere denne invitation?" #: gajim/dialogs.py:4746 msgid "Reason (if you decline):" msgstr "" #: gajim/dialogs.py:4795 msgid "Choose Client Cert #PCKS12" msgstr "" #: gajim/dialogs.py:4811 gajim/accounts_window.py:657 msgid "PKCS12 Files" msgstr "" #: gajim/dialogs.py:4837 msgid "Choose Sound" msgstr "Vælg Lyd" #: gajim/dialogs.py:4853 msgid "Wav Sounds" msgstr "Wav Lyde" #: gajim/dialogs.py:4883 msgid "Choose Image" msgstr "Vælg Billede" #: gajim/dialogs.py:4901 msgid "Images" msgstr "Billeder" #: gajim/dialogs.py:4972 #, fuzzy msgid "Choose Archive" msgstr "Vælg Billede" #: gajim/dialogs.py:4991 #, fuzzy msgid "Zip files" msgstr "Alle filer" #: gajim/dialogs.py:5017 #, python-format msgid "When %s becomes:" msgstr "Når %s bliver:" #: gajim/dialogs.py:5019 #, python-format msgid "Adding Special Notification for %s" msgstr "Tilføj Speciel Påmindelse for %s" #: gajim/dialogs.py:5259 msgid "an audio and video" msgstr "" #: gajim/dialogs.py:5261 msgid "an audio" msgstr "" #: gajim/dialogs.py:5263 msgid "a video" msgstr "" #: gajim/dialogs.py:5267 #, python-format msgid "" "%(contact)s wants to start %(type)s session with you. Do you want to answer " "the call?" msgstr "" #: gajim/dialogs.py:5372 gajim/dialogs.py:5408 #, fuzzy, python-format msgid "Certificate for account %s" msgstr "for konto %s" #: gajim/dialogs.py:5372 #, python-format msgid "" "Issued to:\n" "Common Name (CN): %(scn)s\n" "Organization (O): %(sorg)s\n" "Organizationl Unit (OU): %(sou)s\n" "Serial Number: %(sn)s\n" "\n" "Issued by:\n" "Common Name (CN): %(icn)s\n" "Organization (O): %(iorg)s\n" "Organizationl Unit (OU): %(iou)s\n" "\n" "Validity:\n" "Issued on: %(io)s\n" "Expires on: %(eo)s\n" "\n" "Fingerprint\n" "SHA-1 Fingerprint: %(sha1)s\n" "\n" "SHA256 Fingerprint: %(sha256)s\n" msgstr "" #: gajim/dialogs.py:5419 gajim/gui_interface.py:1405 #, fuzzy, python-format msgid "SSL Certificate Verification for %s" msgstr "SSL certifikat fejl" #: gajim/dialogs.py:5420 gajim/dialogs.py:5437 msgid "View cert…" msgstr "" #: gajim/dialogs.py:5453 gajim/data/gui/application_menu.ui:32 #, fuzzy msgid "File Transfer" msgstr "Filoverførsler" #: gajim/dialogs.py:5477 msgid "Requesting HTTP Upload Slot..." msgstr "" #: gajim/dialogs.py:5481 msgid "Uploading file via HTTP File Upload..." msgstr "" #: gajim/dialogs.py:5485 #, fuzzy msgid "Encrypting file..." msgstr "E2E kryptering ikke aktiveret" #: gajim/groupchat_control.py:193 gajim/groupchat_control.py:1839 #, python-format msgid "%(nick)s is now known as %(new_nick)s" msgstr "%(nick)s er nu kendt som %(new_nick)s" #: gajim/groupchat_control.py:219 gajim/groupchat_control.py:1988 #: gajim/history_window.py:550 gajim/common/connection_handlers_events.py:2811 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s er nu %(status)s" #: gajim/groupchat_control.py:248 msgid "Sending private message failed" msgstr "Sending af privat besked fejlede" #: gajim/groupchat_control.py:250 #, python-format msgid "You are no longer in group chat \"%(room)s\" or \"%(nick)s\" has left." msgstr "" "Du er ikke længere i gruppe samtale \"%(room)s\" eller \"%(nick)s\" har " "forladt rummet." #: gajim/groupchat_control.py:640 gajim/chat_control.py:326 #: gajim/chat_control.py:330 msgid "HTTP File Upload" msgstr "" #: gajim/groupchat_control.py:642 #, fuzzy msgid "HTTP File Upload not supported by your server" msgstr "Metakontakt lagring er ikke understøttet af din server" #: gajim/groupchat_control.py:662 gajim/groupchat_control.py:2370 msgid "Changing Subject" msgstr "Ændre emne" #: gajim/groupchat_control.py:663 gajim/groupchat_control.py:2371 msgid "Please specify the new subject:" msgstr "Anfør et nyt emne:" #: gajim/groupchat_control.py:670 msgid "Changing Nickname" msgstr "Ændre kælenavn" #: gajim/groupchat_control.py:671 msgid "Please specify the new nickname you want to use:" msgstr "Anfør dit nye kælenavn:" #: gajim/groupchat_control.py:688 #, fuzzy msgid "Invalid group chat JID" msgstr "Ugyldig gruppe samtale Jabber ID" #: gajim/groupchat_control.py:689 #, fuzzy msgid "The group chat JID has not allowed characters." msgstr "Gruppe samtale Jabber ID'en indeholder ikke tilladte tegn." #: gajim/groupchat_control.py:699 #, python-format msgid "Destroying %s" msgstr "Fjern %s" #: gajim/groupchat_control.py:700 #, fuzzy msgid "" "You are going to remove this room permanently.\n" "You may specify a reason below:" msgstr "" "Du er ved at definitivt fjerne dette rum.\n" "Du kan anføre en grund herunder:" #: gajim/groupchat_control.py:702 msgid "You may also enter an alternate venue:" msgstr "Du kan også indtaste et alternativt mødested:" #: gajim/groupchat_control.py:880 msgid "Insert Nickname" msgstr "Indsæt Kælenavn" #: gajim/groupchat_control.py:1062 gajim/chat_control.py:803 msgid "and authenticated" msgstr "og godkendt" #: gajim/groupchat_control.py:1066 gajim/chat_control.py:807 msgid "and NOT authenticated" msgstr "og IKKE godkendt" #: gajim/groupchat_control.py:1070 gajim/chat_control.py:811 #, fuzzy, python-format msgid "%(type)s encryption is active %(authenticated)s." msgstr "" "%(type)s kryptering %(status)s aktiv %(authenticated)s.\n" "Din samtale session %(logged)s blive logget." #: gajim/groupchat_control.py:1113 msgid "Conversation with " msgstr "Samtale med " #: gajim/groupchat_control.py:1115 msgid "Continued conversation" msgstr "Fortsat samtale" #: gajim/groupchat_control.py:1473 #, fuzzy, python-format msgid "%(nick)s has set the subject to %(subject)s" msgstr "%(jid)s har sat emnet til %(subject)s" #: gajim/groupchat_control.py:1496 gajim/groupchat_control.py:1781 msgid "Any occupant is allowed to see your full JID" msgstr "En hvilken som helst deltager har lov til at se din fulde JID" #: gajim/groupchat_control.py:1499 #, fuzzy msgid "Room now shows unavailable members" msgstr "Rummet viser nu; ikke tilgængelige medlemmer" #: gajim/groupchat_control.py:1501 #, fuzzy msgid "Room now does not show unavailable members" msgstr "Rummet viser nu ikke; ikke tilgængelige medlemmer" #: gajim/groupchat_control.py:1503 msgid "A setting not related to privacy has been changed" msgstr "" #: gajim/groupchat_control.py:1507 msgid "Room logging is now enabled" msgstr "Rum logging er nu aktiveret" #: gajim/groupchat_control.py:1509 msgid "Room logging is now disabled" msgstr "Rum logging er nu deaktiveret" #: gajim/groupchat_control.py:1511 msgid "Room is now non-anonymous" msgstr "Rummet er nu ikke-anonymt" #: gajim/groupchat_control.py:1514 msgid "Room is now semi-anonymous" msgstr "Rummet er nu semi-anonymt" #: gajim/groupchat_control.py:1517 #, fuzzy msgid "Room is now fully anonymous" msgstr "Rummet er nu helt anonymt" #: gajim/groupchat_control.py:1557 gajim/chat_control.py:1268 #, python-format msgid "Pong! (%s s.)" msgstr "Pong! (%s .s)" #: gajim/groupchat_control.py:1774 gajim/groupchat_control.py:2398 #: gajim/roster_window.py:3129 gajim/gui_interface.py:621 #, fuzzy, python-format msgid "%(jid)s has been invited in this room" msgstr "%(nick)s er blevet fjernet fra rummet %(reason)s" #: gajim/groupchat_control.py:1786 msgid "Room logging is enabled" msgstr "Rum logging er aktiveret" #: gajim/groupchat_control.py:1788 msgid "A new room has been created" msgstr "Et nyt rum er blevet oprettet" #: gajim/groupchat_control.py:1791 msgid "The server has assigned or modified your roomnick" msgstr "Serveren har fastsat eller ændret dit kælenavn for rummet" #: gajim/groupchat_control.py:1797 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s er blevet udvist: %(reason)s" #: gajim/groupchat_control.py:1800 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(nick)s er blevet udvist af %(who)s: %(reason)s" #: gajim/groupchat_control.py:1809 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s er blevet uønsket: %(reason)s" #: gajim/groupchat_control.py:1812 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(nick)s er blevet uønsket af %(who)s: %(reason)s" #: gajim/groupchat_control.py:1823 gajim/groupchat_control.py:1907 #, python-format msgid "You are now known as %s" msgstr "Du er nu kendt som %s" #: gajim/groupchat_control.py:1861 gajim/groupchat_control.py:1866 #: gajim/groupchat_control.py:1872 #, python-format msgid "%(nick)s has been removed from the room (%(reason)s)" msgstr "%(nick)s er blevet fjernet fra rummet %(reason)s" #: gajim/groupchat_control.py:1863 msgid "affiliation changed" msgstr "tilknytning ændret" #: gajim/groupchat_control.py:1868 msgid "room configuration changed to members-only" msgstr "Rum konfiguration er blevet ændret til 'kun for medlemmer'" #: gajim/groupchat_control.py:1874 msgid "system shutdown" msgstr "computeren slukkes" #: gajim/groupchat_control.py:1928 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s by %(actor)s" msgstr "" "** Tilhørsforholdet for %(nick)s er blevet sat til %(affiliation)s af " "%(actor)s" #: gajim/groupchat_control.py:1932 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s" msgstr "** Tilhørsforholdet for %(nick)s er blevet sat til %(affiliation)s" #: gajim/groupchat_control.py:1947 #, python-format msgid "** Role of %(nick)s has been set to %(role)s by %(actor)s" msgstr "** %(nick)s rolle er blevet sat til %(role)s af %(actor)s" #: gajim/groupchat_control.py:1951 #, python-format msgid "** Role of %(nick)s has been set to %(role)s" msgstr "** %(nick)s rolle er blevet sat til %(role)s" #: gajim/groupchat_control.py:1981 #, python-format msgid "%s has left" msgstr "%s har forladt samtalen" #: gajim/groupchat_control.py:1986 #, python-format msgid "%s has joined the group chat" msgstr "%s deltager nu i gruppe samtalen" #: gajim/groupchat_control.py:2329 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Er du sikker på du vil forlade gruppe samtalen \"%s\"?" #: gajim/groupchat_control.py:2331 msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "" "Hvis du lukker dette vindue vil du blive frakoblet fra denne gruppe samtale." #: gajim/groupchat_control.py:2550 #, python-format msgid "Kicking %s" msgstr "Sparker %s" #: gajim/groupchat_control.py:2551 gajim/groupchat_control.py:2847 msgid "You may specify a reason below:" msgstr "Du kan anføre en begrundelse under:" #: gajim/groupchat_control.py:2846 #, python-format msgid "Banning %s" msgstr "Udeluk %s" #: gajim/chat_control.py:328 gajim/chat_control.py:332 #, fuzzy msgid "Jingle File Transfer" msgstr "Filoverførsler" #: gajim/chat_control.py:334 #, fuzzy msgid "No File Transfer available" msgstr "Filoverførsler" #: gajim/chat_control.py:395 msgid "Show a list of formattings" msgstr "Hvis en liste over følelsesikoner" #: gajim/chat_control.py:399 msgid "Formatting is not available so long as GPG is active" msgstr "" #: gajim/chat_control.py:402 #, fuzzy msgid "This contact does not support HTML" msgstr "Denne kontakt understøtter ikke fil overførsler." #: gajim/chat_control.py:514 #, python-format msgid "%(type)s state : %(state)s, reason: %(reason)s" msgstr "" #: gajim/chat_control.py:655 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s fra gruppesamtale %(room_name)s" #: gajim/chat_control.py:903 msgid "Session negotiation cancelled" msgstr "Session forhandling annulleret" #: gajim/chat_control.py:913 msgid "This session WILL be archived on server" msgstr "" #: gajim/chat_control.py:915 #, fuzzy msgid "This session WILL NOT be archived on server" msgstr "Session VIL IKKE blive logget" #: gajim/chat_control.py:924 msgid "This session is encrypted" msgstr "Denne session er krypteret" #: gajim/chat_control.py:927 msgid " and WILL be logged" msgstr " og VIL blive logget" #: gajim/chat_control.py:929 msgid " and WILL NOT be logged" msgstr " og VIL IKKE blive logget" #: gajim/chat_control.py:934 msgid "" "Remote contact's identity not verified. Click the shield button for more " "details." msgstr "" "Kontaktens identitet er ikke verificeret Tryk på skjold knappen for flere " "detaljer." #: gajim/chat_control.py:936 msgid "E2E encryption disabled" msgstr "E2E kryptering ikke aktiveret" #: gajim/chat_control.py:1235 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Du har netop modtaget en besked fra \"%s\"" #: gajim/chat_control.py:1237 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." msgstr "" "Hvis du lukker dette faneblad og ikke har aktiveret historie loggen, vil du\n" "miste denne besked." #: gajim/chat_control.py:1380 #, python-format msgid "" "Subject: %(subject)s\n" "%(message)s" msgstr "" "Emne: %(subject)s\n" "%(message)s" #: gajim/chat_control.py:1494 gajim/gui_interface.py:1197 #, python-format msgid "" "Unable to decrypt message from %s\n" "It may have been tampered with." msgstr "" "Ikke i stand til at dekryptere beskeden fra %s\n" "Det er mulig den er blevet forfalsket." #: gajim/chat_control.py:1532 #, python-format msgid "%(name)s is now %(status)s" msgstr "%(name)s er nu %(status)s" #: gajim/chat_control.py:1591 #, fuzzy msgid "File transfer" msgstr "Filoverførsler" #: gajim/chat_control.py:1594 #, fuzzy msgid "Size" msgstr "Størrelse: %s" #: gajim/chat_control.py:1596 #, fuzzy msgid "Accept" msgstr "K_ontoer" #: gajim/chat_control.py:1650 gajim/disco.py:1753 msgid "_Join" msgstr "_Bliv med:" #: gajim/chat_control.py:1669 gajim/roster_window.py:1991 #: gajim/gui_interface.py:1013 msgid "Remote contact stopped transfer" msgstr "Den fjerne kontakt stoppede filoverførslen" #: gajim/chat_control.py:1671 gajim/roster_window.py:1993 #: gajim/gui_interface.py:1016 msgid "Error opening file" msgstr "Fejl ved åbning af fil" #: gajim/roster_window.py:273 gajim/roster_window.py:1074 msgid "Merged accounts" msgstr "Flettede konti" #: gajim/roster_window.py:857 gajim/roster_window.py:1757 #: gajim/roster_window.py:1759 gajim/roster_window.py:2602 #: gajim/roster_window.py:5125 gajim/message_window.py:519 #: gajim/common/contacts.py:133 gajim/common/commands.py:230 #: gajim/common/helpers.py:95 msgid "Groupchats" msgstr "Gruppesamtaler" #: gajim/roster_window.py:896 gajim/roster_window.py:1665 #: gajim/roster_window.py:1698 gajim/roster_window.py:1749 #: gajim/roster_window.py:1751 gajim/roster_window.py:1912 #: gajim/roster_window.py:2575 gajim/roster_window.py:5155 gajim/disco.py:130 #: gajim/disco.py:131 gajim/disco.py:1460 gajim/common/contacts.py:135 #: gajim/common/contacts.py:378 gajim/common/helpers.py:95 msgid "Transports" msgstr "Transporter" #: gajim/roster_window.py:2045 #, fuzzy msgid "Authorization sent" msgstr "Godkendelse er blevet sendt" #: gajim/roster_window.py:2046 #, fuzzy, python-format msgid "\"%s\" will now see your status." msgstr "Nu vil %s vide din status." #: gajim/roster_window.py:2069 msgid "Subscription request has been sent" msgstr "Forespørgsel på abonnering er blevet sendt" #: gajim/roster_window.py:2070 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "" "Hvis %s accepterer denne forespørsel vil du kunne se hans eller hendes " "status." #: gajim/roster_window.py:2084 #, fuzzy msgid "Authorization removed" msgstr "Godkendelse er blevet fjernet" #: gajim/roster_window.py:2085 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Nu vil %s altid se dig som offline." #: gajim/roster_window.py:2109 #, fuzzy msgid "OpenPGP is not usable" msgstr "GPG er ikke brugbar" #: gajim/roster_window.py:2110 #, python-format msgid "" "Gajim needs python-gnupg >= 0.3.8\n" "Beware there is an incompatible python package called gnupg.\n" "You will be connected to %s without OpenPGP." msgstr "" #: gajim/roster_window.py:2318 gajim/roster_window.py:3625 msgid "You are participating in one or more group chats" msgstr "Du deltager i en eller flere gruppesamtaler" #: gajim/roster_window.py:2319 gajim/roster_window.py:3626 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" msgstr "" "Hvis du ændrer din status til usynlig vil det resultere i at du bliver " "frakoblet fra disse gruppesamtaler. Er du sikker på du vil gøre dig usynlig?" #: gajim/roster_window.py:2346 msgid "desync'ed" msgstr "ikke synkroniseret" #: gajim/roster_window.py:2416 msgid "Really quit Gajim?" msgstr "Skal Gajim afsluttes?" #: gajim/roster_window.py:2417 msgid "Are you sure you want to quit Gajim?" msgstr "Er du sikker på du vil afslutte Gajim?" #: gajim/roster_window.py:2418 msgid "Always close Gajim" msgstr "Altid afslut Gajim" #: gajim/roster_window.py:2505 #, fuzzy msgid "You have running file transfers" msgstr "Annuller filoverførsel" #: gajim/roster_window.py:2506 msgid "" "If you quit now, the file(s) being transferred will be stopped. Do you still " "want to quit?" msgstr "" #: gajim/roster_window.py:2537 gajim/roster_window.py:2828 msgid "You have unread messages" msgstr "Du har ulæste beskeder" #: gajim/roster_window.py:2538 msgid "" "Messages will only be available for reading them later if you have history " "enabled and contact is in your roster." msgstr "" "Beskeder vil kun være tilgængelige for læsning senere hvis du har historik " "aktiveret og kontakten er i dit kontaktvindue." #: gajim/roster_window.py:2829 msgid "You must read them before removing this transport." msgstr "Du må læse dem før du fjerner denne transport." #: gajim/roster_window.py:2832 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Transport \"%s\" vil blive fjernet" #: gajim/roster_window.py:2833 msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." msgstr "" "Du vil ikke længere være i stand til at sende og modtage beskeder fra " "kontakter som bruger denne transport." #: gajim/roster_window.py:2836 msgid "Transports will be removed" msgstr "Transporter vil blive fjernet" #: gajim/roster_window.py:2841 #, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " "these transports: %s" msgstr "" "Du vil ikke længere være i stand til at sende og modtage beskeder fra " "kontakter som bruger disse transporter: %s" #: gajim/roster_window.py:2892 msgid "You are about to block a contact. Are you sure you want to continue?" msgstr "Du er ved at blokere en kontakt. Er du sikker på du vil fortsætte?" #: gajim/roster_window.py:2894 #, fuzzy msgid "" "This contact will see you offline and you will not receive messages it sends " "you." msgstr "" "Denne kontakt vil se dig offline og du vil ikke modtage beskeder han sender " "dig." #: gajim/roster_window.py:2934 msgid "Rename Contact" msgstr "Omdøb Kontakt" #: gajim/roster_window.py:2935 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Indtast et nyt kælenavn for kontakt %s" #: gajim/roster_window.py:2942 msgid "Rename Group" msgstr "Omdøb Gruppe" #: gajim/roster_window.py:2943 #, python-format msgid "Enter a new name for group %s" msgstr "Indtast et nyt navn for gruppen %s" #: gajim/roster_window.py:2988 msgid "Remove Group" msgstr "Fjern Gruppen" #: gajim/roster_window.py:2989 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Vil du fjerne gruppen %s fra kontaktvinduet?" #: gajim/roster_window.py:2990 msgid "Also remove all contacts in this group from your roster" msgstr "Fjern også alle kontakter i denne gruppe fra kontaktvinduet" #: gajim/roster_window.py:3029 msgid "Assign OpenPGP Key" msgstr "Tildel OpenPGP Nøgle" #: gajim/roster_window.py:3030 msgid "Select a key to apply to the contact" msgstr "Vælg den nøgle du vil anvende til kontakten" #: gajim/roster_window.py:3436 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Kontakt %s vil blive fjernet fra dit kontaktvindue" #: gajim/roster_window.py:3438 #, python-format msgid "You are about to remove \"%(name)s\" (%(jid)s) from your roster.\n" msgstr "Du er ved at fjerne \"%(name)s\" (%(jid)s) fra dit kontaktvindue.\n" #: gajim/roster_window.py:3443 #, fuzzy msgid "" "By removing this contact you also remove authorization resulting in them " "always seeing you as offline." msgstr "" "Ved at fjerne disse kontakter:%s\n" "fjerner du også godkendelsen, hvilket medfører at de altid vil se dig som " "offline." #: gajim/roster_window.py:3449 msgid "Do you want to continue?" msgstr "Vil du fortsætte?" #: gajim/roster_window.py:3453 #, fuzzy msgid "" "By removing this contact you also by default remove authorization resulting " "in them always seeing you as offline." msgstr "" "Ved at fjerne denne kontakt fjerner du også samtidig godkendelsen, så han " "eller hun altid vil se dig som offline." #: gajim/roster_window.py:3456 msgid "I want this contact to know my status after removal" msgstr "Jeg vil at denne kontakt kan se min status efter den er blevet fjernet" #: gajim/roster_window.py:3460 msgid "Contacts will be removed from your roster" msgstr "Kontakter vil blive fjernet fra dit kontaktvindue" #: gajim/roster_window.py:3465 #, python-format msgid "" "By removing these contacts:%s\n" "you also remove authorization resulting in them always seeing you as offline." msgstr "" "Ved at fjerne disse kontakter:%s\n" "fjerner du også godkendelsen, hvilket medfører at de altid vil se dig som " "offline." #: gajim/roster_window.py:3523 #, fuzzy msgid "" "You are about to send a custom status. Are you sure you want to continue?" msgstr "" "Du er ved at sende en personlig status. Er du sikker på du vil fortsætte?" #: gajim/roster_window.py:3525 #, fuzzy, python-format msgid "" "This contact will temporarily see you as %(status)s, but only until you " "change your status. Then they will see your global status." msgstr "" "Denne kontakt vil midlertidig se dig som %(status)s, men kun indtil du " "ændrer din status. Da vil han se din globale status." #: gajim/roster_window.py:3544 msgid "No account available" msgstr "Ingen konto tilgængelig" #: gajim/roster_window.py:3545 msgid "You must create an account before you can chat with other contacts." msgstr "" "Du må oprette en konto før du kan begynde en samtale med andre kontakter." #: gajim/roster_window.py:3676 gajim/gui_interface.py:2065 #: gajim/dialog_messages.py:64 msgid "You cannot join a group chat while you are invisible" msgstr "Du kan ikke deltage i en gruppe samtale mens du er usynlig" #: gajim/roster_window.py:4178 msgid "Metacontacts storage not supported by your server" msgstr "Metakontakt lagring er ikke understøttet af din server" #: gajim/roster_window.py:4180 #, fuzzy msgid "" "Your server does not support storing metacontacts information. So this " "information will not be saved on next reconnection." msgstr "" "Din server understøtter ikke muligheden for at gemme metakontakt " "information. Så denne information vil ikke blive gemt til næste gang du " "tilslutter dig." #: gajim/roster_window.py:4276 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "Du er ved at oprette en metakontakt. Er du sikker på du vil fortsætte?" #: gajim/roster_window.py:4278 msgid "" "Metacontacts are a way to regroup several contacts in one line. Generally it " "is used when the same person has several XMPP accounts or transport accounts." msgstr "" "Metakontakter er en måde at gruppere flere kontakter på en linie. Oftest " "bruges det når den samme person har flere Jabber eller transport konti." #: gajim/roster_window.py:4400 msgid "Invalid file URI:" msgstr "Ugyldig Fil URI:" #: gajim/roster_window.py:4412 #, python-format msgid "Do you want to send this file to %s:" msgid_plural "Do you want to send these files to %s:" msgstr[0] "Vil du sende denne fil til %s:" msgstr[1] "Vil du sende disse filer til %s:" #: gajim/roster_window.py:4552 #, fuzzy, python-format msgid "Send %(from)s to %(to)s" msgstr "Send %s til %s" #: gajim/roster_window.py:4565 #, fuzzy, python-format msgid "Make %s first contact" msgstr "Lav %s og %s til metakontakter" #: gajim/roster_window.py:4570 #, fuzzy, python-format msgid "Make %(contact1)s and %(contact2)s metacontacts" msgstr "Lav %s og %s til metakontakter" #: gajim/roster_window.py:4951 gajim/roster_window.py:5049 msgid "_Change Status Message" msgstr "_Ændre Status Besked" #: gajim/roster_window.py:4971 msgid "Publish Tune" msgstr "Publicer Melodi" #: gajim/roster_window.py:4982 #, fuzzy msgid "Publish Location" msgstr "Publicer Melodi" #: gajim/roster_window.py:4994 #, fuzzy msgid "Configure Services…" msgstr "Tilpas Tjenester..." #: gajim/roster_window.py:5127 msgid "_Maximize All" msgstr "_Maksimer alt" #: gajim/roster_window.py:5134 gajim/roster_window.py:5296 msgid "Send Group M_essage" msgstr "Send Gruppeb_esked" #: gajim/roster_window.py:5141 msgid "To all users" msgstr "Til alle brugere" #: gajim/roster_window.py:5145 msgid "To all online users" msgstr "Til alle brugere på net" #: gajim/roster_window.py:5157 gajim/roster_window.py:5302 #: gajim/data/gui/gc_occupants_menu.ui:110 #: gajim/data/gui/contact_context_menu.ui:36 msgid "In_vite to" msgstr "In_viter til" #: gajim/roster_window.py:5312 msgid "_Manage Contacts" msgstr "_Håndter Kontakter" #: gajim/roster_window.py:5318 #, fuzzy msgid "Edit _Groups…" msgstr "Ændre _Grupper" #: gajim/roster_window.py:5339 gajim/data/gui/filetransfers.ui:11 #: gajim/data/gui/remove_account_window.ui:137 msgid "_Remove" msgstr "_Kan fjernes" #: gajim/roster_window.py:5377 msgid "_Maximize" msgstr "_Maksimer" #: gajim/roster_window.py:5384 msgid "_Reconnect" msgstr "_Tilslut igen" #: gajim/roster_window.py:5389 gajim/data/gui/gc_control_popup_menu.ui:120 msgid "_Disconnect" msgstr "Afbry_d tilslutningen" #: gajim/roster_window.py:5405 gajim/data/gui/gc_occupants_menu.ui:170 #: gajim/data/gui/gc_control_popup_menu.ui:113 #: gajim/data/gui/contact_context_menu.ui:228 msgid "_History" msgstr "_Historie" #: gajim/roster_window.py:5481 gajim/data/gui/application_menu.ui:86 msgid "History Manager" msgstr "Historik Håndterer" #: gajim/roster_window.py:5489 msgid "_Join New Group Chat" msgstr "_Deltag i Ny Gruppe Samtale" #: gajim/gajim.py:74 #, fuzzy msgid "Show the application's version" msgstr "Vis et faneblad når der kun er en samtale?" #: gajim/gajim.py:77 #, fuzzy msgid "Show only critical errors" msgstr "_Vis hændelse i kontaktvindue" #: gajim/gajim.py:80 msgid "Separate profile files completely (even history db and plugins)" msgstr "" #: gajim/gajim.py:84 msgid "Print XML stanzas and other debug information" msgstr "" #: gajim/gajim.py:88 #, fuzzy msgid "Use defined profile in configuration directory" msgstr "Avanceret Konfigurations Behandler" #: gajim/gajim.py:92 #, fuzzy msgid "Set configuration directory" msgstr "Rum Konfigurering" #: gajim/gajim.py:95 msgid "Configure logging system" msgstr "" #: gajim/gajim.py:98 #, fuzzy msgid "Show all warnings" msgstr "Vis Alle Ventende Hænd_elser" #: gajim/gajim.py:101 msgid "Open IPython shell" msgstr "" #: gajim/gajim.py:104 msgid "Pops up a window with the next pending event" msgstr "Popper op et vindue ved næste hændelse" #: gajim/gajim.py:107 gajim/data/gui/shortcuts_window.ui:202 #, fuzzy msgid "Start a new chat" msgstr "Start Samtale" #: gajim/gajim.py:180 gajim/gui_interface.py:128 msgid "Database Error" msgstr "Database Fejl" #: gajim/history_sync.py:217 #, fuzzy msgid "How far back do you want to go?" msgstr "Hvad vil du gøre?" #: gajim/history_sync.py:222 msgid "One Month" msgstr "" #: gajim/history_sync.py:223 msgid "Three Months" msgstr "" #: gajim/history_sync.py:224 msgid "One Year" msgstr "" #: gajim/history_sync.py:225 msgid "Everything" msgstr "" #: gajim/history_sync.py:254 #, fuzzy msgid "Connecting..." msgstr "Tilslutter" #: gajim/history_sync.py:266 #, fuzzy, python-format msgid "%(received)s of %(max)s" msgstr "Filoverførsel af %(filename)s fra %(name)s er stoppet." #: gajim/history_sync.py:270 #, fuzzy, python-format msgid "Downloaded %s Messages" msgstr "Videresend ulæste beskeder" #: gajim/history_sync.py:290 #, python-brace-format msgid "" "\n" " Finshed synchronising your History.\n" " {received} Messages downloaded.\n" " " msgstr "" #: gajim/history_sync.py:297 msgid "" "\n" " Gajim is fully synchronised\n" " with the Archive.\n" " " msgstr "" #: gajim/history_sync.py:304 msgid "" "\n" " There is already a synchronisation in\n" " progress. Please try later.\n" " " msgstr "" #: gajim/config.py:150 gajim/config.py:156 gajim/config.py:616 #: gajim/data/gui/preferences_window.ui:68 #: gajim/data/gui/preferences_window.ui:85 msgid "Disabled" msgstr "Ikke aktiveret" #: gajim/config.py:411 gajim/config.py:415 gajim/config.py:1942 msgid "Default" msgstr "Standard" #: gajim/config.py:1128 msgid "status message title" msgstr "status besked Titel" #: gajim/config.py:1129 msgid "status message text" msgstr "status besked tekst" #: gajim/config.py:1517 #, python-format msgid "Edit %s" msgstr "Rediger %s" #: gajim/config.py:1519 #, python-format msgid "Register to %s" msgstr "Registrer til %s" #: gajim/config.py:1555 msgid "Ban List" msgstr "Liste over bandlyste" #: gajim/config.py:1556 msgid "Member List" msgstr "Medlems Liste" #: gajim/config.py:1556 msgid "Owner List" msgstr "Ejer Liste" #: gajim/config.py:1557 msgid "Administrator List" msgstr "Administrator Liste" #: gajim/config.py:1631 msgid "Reason" msgstr "Grund" #: gajim/config.py:1638 msgid "Nick" msgstr "Kælenavne" #: gajim/config.py:1644 msgid "Role" msgstr "Rolle" #: gajim/config.py:1670 #, fuzzy msgid "Banning…" msgstr "Bandlysning..." #: gajim/config.py:1672 msgid "" "Whom do you want to ban?\n" "\n" msgstr "" "Hvem vil du bandlyse?\n" "\n" #: gajim/config.py:1674 #, fuzzy msgid "Adding Member…" msgstr "Tilføj Medlem..." #: gajim/config.py:1675 msgid "" "Whom do you want to make a member?\n" "\n" msgstr "" "Hvem vil du gøre til medlem?\n" "\n" #: gajim/config.py:1677 #, fuzzy msgid "Adding Owner…" msgstr "Tilføj Ejer..." #: gajim/config.py:1678 msgid "" "Whom do you want to make an owner?\n" "\n" msgstr "" "Hvem vil du gøre til ejer?\n" "\n" #: gajim/config.py:1680 #, fuzzy msgid "Adding Administrator…" msgstr "Tilføj Administrator..." #: gajim/config.py:1681 msgid "" "Whom do you want to make an administrator?\n" "\n" msgstr "" "Hvem vil du gøre til administrator?\n" "\n" #: gajim/config.py:1682 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" "2. user@domain (any resource matches).\n" "3. domain/resource (only that resource matches).\n" "4. domain (the domain itself matches, as does any user@domain,\n" "domain/resource, or address containing a subdomain)." msgstr "" "Kan være en af de følgende:\n" "1. bruger@domæne/resource (kun denne resource træffer).\n" "2. bruger@domæne (en hvilket som helst resource træffer).\n" "3. domæne/resource (kun denne resource træffer).\n" "4. domæne (domænet træffer, ligeledes et hvilken som helst bruger@domæne,\n" "domæne/resource, eller adresse indeholdende et subdomæne." #: gajim/config.py:1783 #, python-format msgid "Removing %s account" msgstr "Fjerne kontoen med navnet %s" #: gajim/config.py:1798 #, fuzzy msgid "Account is disabled" msgstr "Følelsesikoner er ikke aktiveret" #: gajim/config.py:1799 msgid "To unregister from a server, account must be enabled." msgstr "" #: gajim/config.py:1813 gajim/gui_interface.py:314 gajim/gui_interface.py:748 msgid "Password Required" msgstr "Adgangskode er Påkrævet" #: gajim/config.py:1814 gajim/gui_interface.py:733 #, python-format msgid "Enter your password for account %s" msgstr "Skriv din adgangskode for kontoen %s" #: gajim/config.py:1815 gajim/gui_interface.py:748 msgid "Save password" msgstr "Gem adgangskode" #: gajim/config.py:1826 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Kontoen \"%s\" er tilsluttet til serveren" #: gajim/config.py:1827 msgid "If you remove it, the connection will be lost." msgstr "Hvis du fjerne den vil tilslutningen tabes." #: gajim/config.py:1842 #, fuzzy, python-format msgid "Connection to server %s failed" msgstr "Tilslutning til proxy fejlede" #: gajim/config.py:1843 #, fuzzy msgid "What would you like to do?" msgstr "Hvad vil du gøre?" #: gajim/config.py:1844 #, fuzzy msgid "Remove only from Gajim" msgstr "Fjern kun k_ontoen fra Gajim" #: gajim/config.py:1845 msgid "Don't remove anything. I'll try again later" msgstr "" #: gajim/config.py:1942 msgid "?print_status:All" msgstr "?print_status:Alle" #: gajim/config.py:1943 msgid "Enter and leave only" msgstr "Gå kun ind og ud" #: gajim/config.py:1944 msgid "?print_status:None" msgstr "?print_status:Ingen" #: gajim/config.py:2010 msgid "New Group Chat" msgstr "Ny Gruppe Samtale" #: gajim/config.py:2046 msgid "This bookmark has invalid data" msgstr "Dette bogmærke er ugyldigt" #: gajim/config.py:2047 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "" "Fyld ud server og rum tekstindtastningsfelterne eller fjern dette bogmærke." #: gajim/config.py:2170 gajim/config.py:2186 gajim/config.py:2197 #: gajim/config.py:2225 msgid "Character not allowed" msgstr "Tegn ikke tilladt: %s" #: gajim/config.py:2185 gajim/config.py:2196 gajim/config.py:2475 msgid "Invalid server" msgstr "Ugyldigt server" #: gajim/config.py:2224 msgid "Invalid room" msgstr "Ugyldig rum" #: gajim/config.py:2389 msgid "Account has been added successfully" msgstr "Kontoen er blevet tilføjet med succes" #: gajim/config.py:2390 gajim/config.py:2396 msgid "" "You can set advanced account options by pressing the Advanced button, or " "later by choosing the Accounts menu item under the Edit menu from the main " "window." msgstr "" "Du kan sætte avancerede konto indstillinger ved at trykke Avanceret knappen, " "eller senere ved at vælge kontoens menupunkt under Rediger menuen fra " "hovedvinduet." #: gajim/config.py:2395 msgid "Your new account has been created successfully" msgstr "Din nye konto er blevet oprettet med succes" #: gajim/config.py:2433 msgid "Invalid username" msgstr "Ugyldigt brugernavn" #: gajim/config.py:2435 msgid "You must provide a username to configure this account." msgstr "Du må give et brugernavn for at konfigurere denne konto." #: gajim/config.py:2476 msgid "Please provide a server on which you want to register." msgstr "Anfør en server som du vil registrere dig ved." #: gajim/config.py:2499 msgid "Invalid entry" msgstr "Ugyldig indgang" #: gajim/config.py:2500 msgid "Custom port must be a port number." msgstr "Personlig port må være et port nummer." #: gajim/config.py:2532 gajim/gui_interface.py:1360 msgid "Certificate Already in File" msgstr "Certifikatet er allerede i filen" #: gajim/config.py:2533 gajim/gui_interface.py:1361 #, python-format msgid "This certificate is already in file %s, so it's not added again." msgstr "" "Dette certifikat er allerede i filen %s, så det bliver ikke tilføjet igen." #: gajim/config.py:2626 #, python-format msgid "" "Security Warning\n" "\n" "The authenticity of the %(hostname)s SSL certificate could be invalid.\n" "SSL Error: %(error)s\n" "Do you still want to connect to this server?" msgstr "" "Sikkerhedsadvarsel\n" "\n" "Pålideligheden af %(hostname)s SSL certifikat kan være ugyldig\n" "SSL Fejl: %(error)s\n" "Vil du stadig prøve at forbinde til denne server?" #: gajim/config.py:2632 #, fuzzy, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA-1 fingerprint of the certificate:\n" "%(sha1)s\n" "SHA-256 fingerprint of the certificate:\n" "%(sha256)s" msgstr "" "Tilføj dette certifikat til listen af certifikater du har tillid til.\n" "Certifikatets SHA1 fingeraftryk:\n" "%s" #: gajim/config.py:2666 gajim/config.py:2700 msgid "An error occurred during account creation" msgstr "Under oprettelsen af kontoen opstod der en fejl" #: gajim/config.py:2763 msgid "Account name is in use" msgstr "Kontonavnet er i brug" #: gajim/config.py:2764 msgid "You already have an account using this name." msgstr "Du har allered en konto med dette navn." #: gajim/config.py:2896 msgid "PEP node was not removed" msgstr "PEP knude blev ikke fjernet" #: gajim/config.py:2897 #, python-format msgid "PEP node %(node)s was not removed: %(message)s" msgstr "PEP knude %(node)s blev ikke fjernet: %(message)s" #: gajim/config.py:2925 #, fuzzy, python-format msgid "Configure %s" msgstr "_Konfigurere" #: gajim/config.py:2942 gajim/plugins/gui.py:95 msgid "Active" msgstr "Aktiv" #: gajim/config.py:2950 msgid "Event" msgstr "Hændelse" #: gajim/config.py:2984 #, fuzzy msgid "Attention Message Received" msgstr "Første Besked er Modtaget" #: gajim/config.py:2985 msgid "First Message Received" msgstr "Første Besked er Modtaget" #: gajim/config.py:2986 msgid "Next Message Received Focused" msgstr "Næste Besked Modtages i Fokus" #: gajim/config.py:2988 msgid "Next Message Received Unfocused" msgstr "Næste Besked Modtages uden Fokus" #: gajim/config.py:2989 msgid "Contact Connected" msgstr "Kontakt er Tilsluttet" #: gajim/config.py:2990 msgid "Contact Disconnected" msgstr "Kontakt er ikke Tilsluttet" #: gajim/config.py:2991 msgid "Message Sent" msgstr "Besked er Sendt" #: gajim/config.py:2992 msgid "Group Chat Message Highlight" msgstr "Gruppe Samtale Besked Fremhævning" #: gajim/config.py:2993 msgid "Group Chat Message Received" msgstr "Gruppe Samtale Besked Modtaget" #: gajim/tooltips.py:240 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s af denne gruppe samtale" #: gajim/tooltips.py:269 gajim/common/helpers.py:473 msgid "?Group Chat Contact Affiliation:None" msgstr "?Group Chat Contact Affiliation:Ingen" #: gajim/tooltips.py:271 gajim/common/helpers.py:479 msgid "Member" msgstr "Medlem" #: gajim/tooltips.py:273 gajim/common/helpers.py:477 msgid "Administrator" msgstr "Administrator" #: gajim/tooltips.py:275 gajim/common/helpers.py:475 msgid "Owner" msgstr "Ejer" #: gajim/tooltips.py:433 msgid " [blocked]" msgstr " [blokeret]" #: gajim/tooltips.py:437 msgid " [minimized]" msgstr " [minimeret]" #: gajim/tooltips.py:609 msgid "Connected" msgstr "Tilsluttet" #: gajim/tooltips.py:611 msgid "Disconnected" msgstr "Tilslutning afbrudt" #: gajim/tooltips.py:660 #, fuzzy msgid "?Noun:Download" msgstr "Hent" #: gajim/tooltips.py:666 #, fuzzy msgid "?Noun:Upload" msgstr "Send" #: gajim/tooltips.py:673 msgid "Type: " msgstr "Type: " #: gajim/tooltips.py:679 msgid "Transferred: " msgstr "Overført: " #: gajim/tooltips.py:682 gajim/tooltips.py:699 msgid "Not started" msgstr "Ikke startet" #: gajim/tooltips.py:684 msgid "Stopped" msgstr "Stoppet" #: gajim/tooltips.py:686 gajim/tooltips.py:689 msgid "Completed" msgstr "Fuldført" #: gajim/tooltips.py:692 msgid "?transfer status:Paused" msgstr "?transfer status:Midlertidig stoppet" #: gajim/tooltips.py:695 msgid "Stalled" msgstr "Hænger" #: gajim/tooltips.py:697 msgid "Transferring" msgstr "Overfører" #: gajim/tooltips.py:700 msgid "Status: " msgstr "Status: " #: gajim/tooltips.py:732 gajim/common/helpers.py:389 #, fuzzy msgid "?user status:Available" msgstr "?transfer status:Midlertidig stoppet" #: gajim/tooltips.py:734 gajim/common/helpers.py:384 msgid "Free for Chat" msgstr "Tilgængelig for samtale" #: gajim/tooltips.py:736 gajim/common/commands.py:117 #: gajim/common/helpers.py:396 #: gajim/command_system/implementation/standard.py:138 msgid "Away" msgstr "Borte" #: gajim/tooltips.py:738 gajim/common/helpers.py:374 msgid "Busy" msgstr "Travlt" #: gajim/tooltips.py:740 gajim/common/helpers.py:379 msgid "Not Available" msgstr "Ikke Tilgængelig" #: gajim/tooltips.py:742 gajim/common/helpers.py:401 msgid "Offline" msgstr "Afkoblet" #: gajim/advanced_configuration_window.py:88 msgid "Activated" msgstr "Aktiveret" #: gajim/advanced_configuration_window.py:88 msgid "Deactivated" msgstr "Ikke aktiveret" #: gajim/advanced_configuration_window.py:90 msgid "Boolean" msgstr "Boolean" #: gajim/advanced_configuration_window.py:91 msgid "Integer" msgstr "Heltal" #: gajim/advanced_configuration_window.py:92 msgid "Text" msgstr "Tekst" #: gajim/advanced_configuration_window.py:93 #: gajim/data/gui/groupchat_control.ui:54 gajim/data/gui/chat_control.ui:334 msgid "Color" msgstr "Farve" #: gajim/advanced_configuration_window.py:104 msgid "Preference Name" msgstr "Foretrukket Navn" #: gajim/advanced_configuration_window.py:111 msgid "Value" msgstr "Værdi" #: gajim/advanced_configuration_window.py:120 msgid "Type" msgstr "Type" #: gajim/advanced_configuration_window.py:176 msgid "(None)" msgstr "(Ingen)" #: gajim/advanced_configuration_window.py:307 msgid "Hidden" msgstr "Skjult" #: gajim/logind_listener.py:58 msgid "Machine going to sleep" msgstr "" #: gajim/logind_listener.py:90 msgid "Disconnect from the network" msgstr "" #: gajim/history_window.py:339 #, python-format msgid "Conversation History with %s" msgstr "Konversations Historik med %s" #: gajim/history_window.py:361 gajim/data/gui/history_window.ui:7 msgid "Conversation History" msgstr "Samtale Historie" #: gajim/history_window.py:390 gajim/history_window.py:443 msgid "Disk Error" msgstr "Disk Skrivefejl" #: gajim/history_window.py:546 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s er nu %(status)s: %(status_msg)s" #: gajim/history_window.py:557 #, python-format msgid "Error: %s" msgstr "Fejl: %s" #: gajim/history_window.py:559 msgid "Error" msgstr "Fejl" #: gajim/history_window.py:561 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Status er nu: %(status)s: %(status_msg)s" #: gajim/history_window.py:564 #, python-format msgid "Status is now: %(status)s" msgstr "Status er nu: %(status)s" #: gajim/history_window.py:585 gajim/conversation_textview.py:1338 #, python-format msgid "Subject: %s\n" msgstr "Emne: %s\n" #: gajim/statusicon.py:215 #, fuzzy msgid "_Change Status Message…" msgstr "_Ændre Status Besked" #: gajim/statusicon.py:252 gajim/statusicon.py:302 gajim/statusicon.py:309 #, python-format msgid "using account %s" msgstr "med konto %s" #: gajim/statusicon.py:319 #, fuzzy msgid "_Manage Bookmarks…" msgstr "Håndter Bogmærker" #: gajim/statusicon.py:332 #, fuzzy msgid "Hide _Roster" msgstr "i _kontaktvinduet" #: gajim/statusicon.py:336 msgid "Show _Roster" msgstr "Vis _Kontaktvindue" #: gajim/statusicon.py:344 msgid "Hide this menu" msgstr "Skjul denne menu" #: gajim/dataforms_widget.py:587 #, fuzzy msgid "Unable to load image" msgstr "Ikke i stand til at indlæse tomgangs modulet" #: gajim/dataforms_widget.py:589 #, fuzzy, python-format msgid "Media type not supported: %s" msgstr "Usynlighed er ikke understøttet" #: gajim/dataforms_widget.py:604 msgid "This field is required" msgstr "" #: gajim/dataforms_widget.py:658 msgid "new@jabber.id" msgstr "ny@jabber.id" #: gajim/dataforms_widget.py:661 gajim/dataforms_widget.py:663 #, python-format msgid "new%d@jabber.id" msgstr "ny%d@jabber.id" #: gajim/server_info.py:130 #, python-format msgid "%(days)s days, %(hours)s hours" msgstr "" #: gajim/server_info.py:187 gajim/accounts_window.py:537 #: gajim/accounts_window.py:638 #, fuzzy msgid "Hostname" msgstr "_Værtsnavn:" #: gajim/server_info.py:188 msgid "Server Software" msgstr "" #: gajim/server_info.py:189 #, fuzzy msgid "Server Uptime" msgstr "Server svarede: %s" #: gajim/server_info.py:227 msgid "" "\n" "Disabled in config" msgstr "" #: gajim/disco.py:69 msgid "This service has not yet responded with detailed information" msgstr "Denne tjeneste har endnu ikke svaret med detaljeret information" #: gajim/disco.py:70 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" msgstr "" "Denne tjeneste kunne ikke svare med detaljeret information.\n" "Den er højst sandsynlig ikke fungerende" #: gajim/disco.py:129 msgid "Others" msgstr "Andre" #: gajim/disco.py:133 msgid "Conference" msgstr "Konference" #: gajim/disco.py:537 msgid "Without a connection, you can not browse available services" msgstr "Du kan kun gennemse tilgængelige tjenester hvis du er tilsluttet" #: gajim/disco.py:626 #, python-format msgid "Service Discovery using account %s" msgstr "Opdag Tjenester med kontoen %s" #: gajim/disco.py:628 msgid "Service Discovery" msgstr "Opdag Tjenester" #: gajim/disco.py:732 msgid "The service could not be found" msgstr "Tjenesten findes ikke" #: gajim/disco.py:733 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." msgstr "" "Der er ikke nogen tjenester på den adresse som du indtastede, eller serveren " "gav intet svar. Kontroller adressen og prøv igen." #: gajim/disco.py:739 gajim/disco.py:1091 msgid "The service is not browsable" msgstr "Det er ikke mulig at gennemse denne tjeneste" #: gajim/disco.py:740 msgid "This type of service does not contain any items to browse." msgstr "Denne type tjeneste har ingen elementer som kan gennemses." #: gajim/disco.py:781 gajim/disco.py:791 msgid "Invalid Server Name" msgstr "Ikke gyldigt server navn" #: gajim/disco.py:849 #, python-format msgid "Browsing %(address)s using account %(account)s" msgstr "Gennemse %(address)s med konto %(account)s" #: gajim/disco.py:896 #, fuzzy msgid "Browse" msgstr "_Gennemse" #: gajim/disco.py:1092 msgid "This service does not contain any items to browse." msgstr "Denne tjeneste har ingen elementer som kan gennemses." #: gajim/disco.py:1304 #, fuzzy msgid "Execute Command" msgstr "_Kør Kommando" #: gajim/disco.py:1308 gajim/disco.py:1466 msgid "Re_gister" msgstr "Re_gistrer" #: gajim/disco.py:1317 gajim/data/gui/join_groupchat_window.ui:186 #: gajim/data/gui/join_groupchat_window.ui:325 #, fuzzy msgid "Join" msgstr "_Bliv med:" #: gajim/disco.py:1326 gajim/data/gui/search_window.ui:23 msgid "Search" msgstr "Søg" #: gajim/disco.py:1464 msgid "_Edit" msgstr "R_ediger" #: gajim/disco.py:1507 #, python-format msgid "Scanning %(current)d / %(total)d.." msgstr "Skanner %(current)d / %(total)d.." #: gajim/disco.py:1703 msgid "Users" msgstr "Brugere" #: gajim/disco.py:1711 msgid "Description" msgstr "Beskrivelse" #: gajim/disco.py:1719 msgid "Id" msgstr "Id" #: gajim/disco.py:1749 gajim/data/gui/gc_control_popup_menu.ui:99 msgid "_Bookmark" msgstr "_Bogmærke" #: gajim/disco.py:1783 msgid "Bookmark already set" msgstr "Bogmærke er allerede sat" #: gajim/disco.py:1784 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Gruppe samtale \"%s\" er allerede i dine bogmærker." #: gajim/disco.py:1794 msgid "Bookmark has been added successfully" msgstr "Bogmærket er blevet tilføjet succesfuldt" #: gajim/disco.py:1795 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "" "De kan håndtere dine bogmærker via Handlings menuen i dit kontaktvindue." #: gajim/disco.py:1987 msgid "Subscribed" msgstr "Abonnerede" #: gajim/disco.py:1996 msgid "Node" msgstr "Knude" #: gajim/disco.py:2063 msgid "New post" msgstr "Ny post" #: gajim/disco.py:2069 msgid "_Subscribe" msgstr "_Abonner" #: gajim/disco.py:2075 msgid "_Unsubscribe" msgstr "_Frameld abonnement" #: gajim/conversation_textview.py:329 msgid "" "Text below this line is what has been said since the\n" "last time you paid attention to this group chat" msgstr "" "Teksten under denne linje er hvad der er blevet sagt siden\n" "sidste gang du var opmærksom på denne gruppe samtale" #: gajim/conversation_textview.py:550 msgid "_Quote" msgstr "_Citat" #: gajim/conversation_textview.py:558 #, python-format msgid "_Actions for \"%s\"" msgstr "_Handlinger for \"%s\"" #: gajim/conversation_textview.py:572 msgid "Read _Wikipedia Article" msgstr "Læs _Wikipedia Artikel" #: gajim/conversation_textview.py:577 msgid "Look it up in _Dictionary" msgstr "Slå dette op i Or_dbogen" #: gajim/conversation_textview.py:594 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "Ordbogens URL mangler en \"%s\" og det må ikke være WIKTIONARY" #: gajim/conversation_textview.py:608 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "Web søge URL'en mangler en \"%s\"" #: gajim/conversation_textview.py:611 msgid "Web _Search for it" msgstr "Søg på nettet efter det" #: gajim/conversation_textview.py:617 msgid "Open as _Link" msgstr "Åbn som et _Link" #: gajim/conversation_textview.py:847 msgid "URL:" msgstr "" #: gajim/conversation_textview.py:1021 #, fuzzy msgid "Invalid URL" msgstr "Ugyldig JID" #: gajim/conversation_textview.py:1106 msgid "" "Message corrected. Original message:\n" "{}" msgstr "" #: gajim/conversation_textview.py:1250 #, fuzzy, python-format msgid "Yesterday" msgid_plural "%(nb_days)i days ago" msgstr[0] "I går" msgstr[1] "I går" #: gajim/message_textview.py:43 #, fuzzy msgid "Write a message.." msgstr "Ny Privat Besked" #: gajim/message_window.py:245 msgid "You are going to close several tabs" msgstr "Du er ved at lukke flere faneblade" #: gajim/message_window.py:246 msgid "Do you really want to close them all?" msgstr "Vil du virkelig lukke dem alle?" #: gajim/message_window.py:517 #, fuzzy msgid "?Noun:Chats" msgstr "Gruppe Samtaler" #: gajim/message_window.py:521 msgid "Private Chats" msgstr "Private Samtaler" #: gajim/message_window.py:527 msgid "Messages" msgstr "Beskeder" #: gajim/gui_interface.py:158 gajim/gui_interface.py:329 #: gajim/gui_interface.py:338 gajim/gui_interface.py:345 #: gajim/gui_interface.py:349 gajim/gui_interface.py:352 #: gajim/gui_interface.py:360 msgid "Unable to join group chat" msgstr "Ikke i stand til at deltage i gruppesamtale." #: gajim/gui_interface.py:159 #, fuzzy, python-format msgid "" "Your desired nickname in group chat\n" "%s\n" "is in use or registered by another occupant.\n" "Please specify another nickname below:" msgstr "" "Dit ønskede kælenavn i gruppesamtalen %s er i brug eller registreret af en " "anden indehaver.\n" "Specificer venligst et andet kælenavn under:" #: gajim/gui_interface.py:163 msgid "Always use this nickname when there is a conflict" msgstr "Altid brug dette kælenavn når der er en konflikt" #: gajim/gui_interface.py:181 msgid "Do you accept this request?" msgstr "Accepterer du denne forespørsel?" #: gajim/gui_interface.py:183 #, python-format msgid "Do you accept this request on account %s?" msgstr "Accepterer du denne forespørgsel for konto %s?" #: gajim/gui_interface.py:186 #, fuzzy, python-format msgid "HTTP (%(method)s) Authorization for %(url)s (ID: %(id)s)" msgstr "HTTP (%(method)s) Autorisering for %(url)s (id: %(id)s)" #: gajim/gui_interface.py:230 gajim/notify.py:96 msgid "Connection Failed" msgstr "Tilslutning Fejlede" #: gajim/gui_interface.py:315 #, python-format msgid "A Password is required to join the room %s. Please type it." msgstr "" "En adgangskode er påkrævet for at deltage i rummet %s. Venligst skriv den." #: gajim/gui_interface.py:330 #, fuzzy, python-format msgid "%s is full" msgstr "Skrifttype" #: gajim/gui_interface.py:339 #, fuzzy, python-format msgid "You are banned from group chat %s." msgstr "Du er bandlyst fra gruppesamtalen %s." #: gajim/gui_interface.py:346 #, fuzzy, python-format msgid "Remote server %s does not exist." msgstr "Gruppesamtalen %s eksisterer ikke." #: gajim/gui_interface.py:350 #, fuzzy, python-format msgid "Group chat %s does not exist." msgstr "Gruppesamtalen %s eksisterer ikke." #: gajim/gui_interface.py:353 #, fuzzy msgid "Group chat creation is not permitted." msgstr "Gruppesamtale oprettelse er begrænset." #: gajim/gui_interface.py:355 #, fuzzy msgid "Unable to join groupchat" msgstr "Ikke i stand til at deltage i gruppesamtale." #: gajim/gui_interface.py:356 #, fuzzy, python-format msgid "You must use your registered nickname in %s." msgstr "Dit registrerede kælenavn skal bruges i gruppesamtalen %s." #: gajim/gui_interface.py:361 #, python-format msgid "You are not in the members list in groupchat %s." msgstr "Du er ikke i medlemslisten for gruppesamtalen %s." #: gajim/gui_interface.py:455 gajim/gui_interface.py:459 #, python-format msgid "Error %(code)s: %(msg)s" msgstr "Fejl %(code)s: %(msg)s" #: gajim/gui_interface.py:470 gajim/gui_interface.py:486 #: gajim/common/connection_handlers_events.py:1430 #, python-format msgid "error while sending %(message)s ( %(error)s )" msgstr "fejl opstod under sending %(message)s ( %(error)s )" #: gajim/gui_interface.py:513 gajim/notify.py:96 msgid "Subscription request" msgstr "Abonnement forespørgsel" #: gajim/gui_interface.py:524 gajim/common/contacts.py:131 #: gajim/common/helpers.py:95 msgid "Observers" msgstr "Iagttagere" #: gajim/gui_interface.py:538 msgid "Authorization accepted" msgstr "Autorisering accepteret" #: gajim/gui_interface.py:539 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "Kontakten \"%s\" har godkendt dig til at se hans eller hendes status." #: gajim/gui_interface.py:547 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Kontakt \"%s\" har fjernet abonneringen på dig" #: gajim/gui_interface.py:548 #, fuzzy msgid "" "You will always see them as offline.\n" "Do you want to remove them from your contact list?" msgstr "" "Du vil altid se ham eller hende som offline.\n" "Vil du fjerne ham eller hende fra din kontakt liste?" #: gajim/gui_interface.py:570 gajim/notify.py:96 msgid "Unsubscribed" msgstr "Frameldt abonnement" #: gajim/gui_interface.py:582 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Kontakt med \"%s\" kan ikke blive etableret" #: gajim/gui_interface.py:583 gajim/common/connection.py:1288 #: gajim/common/connection.py:1474 msgid "Check your connection or try again later." msgstr "Kontroller din tilslutning eller forsøg igen senere." #: gajim/gui_interface.py:641 #, python-format msgid "%(jid)s declined the invitation: %(reason)s" msgstr "" #: gajim/gui_interface.py:645 #, python-format msgid "%(jid)s declined the invitation" msgstr "" #: gajim/gui_interface.py:675 #, fuzzy msgid "" "You configured Gajim to use OpenPGP agent, but there is no OpenPGP agent " "running or it returned a wrong passphrase.\n" msgstr "" "Du har konfigureret Gajim til at bruge GPG agenten, men der er ingen GPG " "agent som kører eller den returnerede en forkert gpg-løsen.\n" #: gajim/gui_interface.py:678 gajim/gui_interface.py:686 msgid "You are currently connected without your OpenPGP key." msgstr "Du er for øjeblikket tilsluttet uden din OpenPGP nøgle." #: gajim/gui_interface.py:680 #, fuzzy msgid "Wrong passphrase" msgstr "Forkert Adgangskode" #: gajim/gui_interface.py:685 #, fuzzy msgid "Wrong OpenPGP passphrase" msgstr "Forkert Adgangskode" #: gajim/gui_interface.py:699 #, fuzzy msgid "Certificate Passphrase Required" msgstr "Certifikatet er udløbet" #: gajim/gui_interface.py:700 #, fuzzy, python-format msgid "Enter the certificate passphrase for account %s" msgstr "Indtast adgangskoden til GPG nøglen %(keyid)s (Konto %(account)s)." #: gajim/gui_interface.py:723 #, fuzzy msgid "Untrusted OpenPGP key" msgstr "Vælg din OpenPGP Nøgle" #: gajim/gui_interface.py:723 #, fuzzy msgid "" "The OpenPGP key used to encrypt this chat is not trusted. Do you really want " "to encrypt this message?" msgstr "" "GPG nøglen brugt til at kryptere den samtale er ikke til at stole på. Vil du " "virkelig kryptere den besked?" #: gajim/gui_interface.py:769 msgid "" "Please copy / paste the refresh token from the website that has just been " "opened." msgstr "" #: gajim/gui_interface.py:772 msgid "Oauth2 Credentials" msgstr "" #: gajim/gui_interface.py:924 #, python-format msgid "%s wants to send you a file." msgstr "%s vil gerne sende dig en fil." #: gajim/gui_interface.py:1021 gajim/gui_interface.py:1433 msgid "SSL certificate error" msgstr "SSL certifikat fejl" #: gajim/gui_interface.py:1038 #, fuzzy msgid "File Transfer Failed" msgstr "Filoverførsler" #: gajim/gui_interface.py:1060 #, fuzzy, python-format msgid "%(filename)s received from %(name)s." msgstr "Filoverførsel af %(filename)s fra %(name)s er stoppet." #: gajim/gui_interface.py:1064 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Filoverførsel af %(filename)s fra %(name)s er stoppet." #: gajim/gui_interface.py:1068 #, fuzzy, python-format msgid "File transfer of %(filename)s from %(name)s failed." msgstr "Filoverførsel af %(filename)s fra %(name)s er stoppet." #: gajim/gui_interface.py:1081 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "Du har succesfuldt sendt %(filename)s til %(name)s." #: gajim/gui_interface.py:1085 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "Filoverførsel af %(filename)s til %(name)s er stoppet." #: gajim/gui_interface.py:1089 #, fuzzy, python-format msgid "File transfer of %(filename)s to %(name)s failed." msgstr "Filoverførsel af %(filename)s til %(name)s er stoppet." #: gajim/gui_interface.py:1153 #, fuzzy msgid "Choose file to send" msgstr "Vælg en Fil at Sende..." #: gajim/gui_interface.py:1199 msgid "Unable to decrypt message" msgstr "Ikke i stand til at dekryptere beskeden" #: gajim/gui_interface.py:1211 msgid "Username Conflict" msgstr "Brugernavns Konflikt" #: gajim/gui_interface.py:1212 msgid "Please type a new username for your local account" msgstr "Skriv et nyt brugernavn for din lokale konto" #: gajim/gui_interface.py:1235 msgid "Resource Conflict" msgstr "Ressource Konflikt" #: gajim/gui_interface.py:1236 msgid "" "You are already connected to this account with the same resource. Please " "type a new one" msgstr "" "Du er allerede tilsluttet til denne konto med den samme ressource. Skriv " "venligst en ny" #: gajim/gui_interface.py:1293 #, fuzzy, python-format msgid "%s wants to start a voice chat." msgstr "%s vil gerne sende dig en fil." #: gajim/gui_interface.py:1296 #, fuzzy msgid "Voice Chat Request" msgstr "Filoverførsel Forespørgsel" #: gajim/gui_interface.py:1386 msgid "Error verifying SSL certificate" msgstr "Fejl under verificering af SSL certifikat" #: gajim/gui_interface.py:1387 #, fuzzy, python-format msgid "" "There was an error verifying the SSL certificate of your XMPP server: " "%(error)s\n" "Do you still want to connect to this server?" msgstr "" "Der var en fejl under verificeringen af SSL certifikatet fra din jabber " "server: %(error)s\n" "Vil du stadig prøve på at forbinde til denne server?" #: gajim/gui_interface.py:1391 #, fuzzy, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA-1 fingerprint of the certificate:\n" "%(sha1)s\n" "SHA256 fingerprint of the certificate:\n" "%(sha256)s" msgstr "" "Tilføj dette certifikat til listen af certifikater du har tillid til.\n" "Certifikatets SHA1 fingeraftryk:\n" "%s" #: gajim/gui_interface.py:1397 msgid "Ignore this error for this certificate." msgstr "Ignorer denne fejl for dette certifikat." #: gajim/gui_interface.py:1410 msgid "Non Anonymous Server" msgstr "" #: gajim/gui_interface.py:1434 #, fuzzy, python-format msgid "" "It seems the SSL certificate of account %(account)s has changed and is not " "valid or your connection is being compromised.\n" "\n" "Old SHA-1 fingerprint: %(old_sha1)s\n" "Old SHA-256 fingerprint: %(old_sha256)s\n" "\n" "New SHA-1 fingerprint: %(new_sha1)s\n" "New SHA-256 fingerprint: %(new_sha256)s\n" "\n" "Do you still want to connect and update the fingerprint of the certificate?" msgstr "" "Det ser ud til at SSL certifikatet for kontoen %(account)s er blevet ændret " "eller din forbindelse er blevet kompromitteret\n" "Gammelt fingeraftryk: %(old)s\n" "Nyt fingeraftryk: %(new)s\n" "\n" "Vil du stadig forbinde og opdatere fingeraftrykket for certifikatet?" #: gajim/gui_interface.py:1512 msgid "" "You are about to send your password on an insecure connection. You should " "install PyOpenSSL to prevent that. Are you sure you want to do that?" msgstr "" "Du er ved at sende din adgangskode på en usikker forbindelse. Du bør " "installere PyOpenSSL for at forhindre dette. Er du sikker på du vil gøre " "dette?" #: gajim/gui_interface.py:1554 #, fuzzy msgid "" "You are about to send your password unencrypted on an insecure connection. " "Are you sure you want to do that?" msgstr "" "Du er ved at sende din adgangskode over en ikke krypteret forbindelse. Er du " "sikker på du vil gøre dette?" #: gajim/gui_interface.py:1856 #, fuzzy msgid "JID is not a Groupchat" msgstr "Dette er ikke en gruppe samtale" #: gajim/gui_interface.py:2020 msgid "Emoticons disabled" msgstr "Følelsesikoner er ikke aktiveret" #: gajim/gui_interface.py:2021 #, fuzzy msgid "" "Your configured emoticons theme could not be loaded. See the log for more " "details." msgstr "" "Dit konfigurerede følelsesikon tema blev ikke fundet, så følelsesikoner er " "blevet deaktiveret." #: gajim/gui_interface.py:2039 msgid "This is not a group chat" msgstr "Dette er ikke en gruppe samtale" #: gajim/gui_interface.py:2040 #, python-format msgid "" "%(room_jid)s is already in your roster. Please check if %(room_jid)s is a " "correct group chat name. If it is, delete it from your roster and try " "joining the group chat again." msgstr "" #: gajim/gui_interface.py:2418 msgid "Could not save your settings and preferences" msgstr "Kunne ikke gemme din opsætning og indstillinger" #: gajim/gui_interface.py:2828 gajim/common/config.py:117 #: gajim/common/config.py:532 gajim/common/optparser.py:343 #: gajim/common/optparser.py:511 gajim/common/optparser.py:534 msgid "default" msgstr "standard" #: gajim/gui_interface.py:3014 msgid "Passphrase Required" msgstr "Adgangskode Påkrævet" #: gajim/gui_interface.py:3015 #, fuzzy, python-format msgid "Enter OpenPGP key passphrase for key %(keyid)s (account %(account)s)." msgstr "Indtast adgangskoden til GPG nøglen %(keyid)s (Konto %(account)s)." #: gajim/gui_interface.py:3029 #, fuzzy msgid "OpenPGP key expired" msgstr "GPG nøgle er udløbet" #: gajim/gui_interface.py:3030 #, fuzzy, python-format msgid "" "Your OpenPGP key has expired, you will be connected to %s without OpenPGP." msgstr "Din GPG nøgle er udløbet, du vil blive tilsuttet til %s uden OpenPGP." #: gajim/gui_interface.py:3039 msgid "Wrong Passphrase" msgstr "Forkert Adgangskode" #: gajim/gui_interface.py:3040 #, fuzzy msgid "Please retype your OpenPGP passphrase or press Cancel." msgstr "Indtast din GPG adgangskode igen eller annuller." #: gajim/search_window.py:108 msgid "Waiting for results" msgstr "Venter på resultater" #: gajim/search_window.py:146 gajim/search_window.py:224 msgid "Error in received dataform" msgstr "Fejl i modtaget dataform" #: gajim/search_window.py:181 gajim/search_window.py:216 msgid "No result" msgstr "Intet resultat" #: gajim/htmltextview.py:559 #, fuzzy msgid "Loading" msgstr "Koder" #: gajim/atom_window.py:123 #, fuzzy, python-format msgid "You have received new entries (and %d not displayed):" msgid_plural "You have received new entries (and %d not displayed):" msgstr[0] "Du har modtaget en nye hændelser (og %(count)d er ikke vist):" msgstr[1] "Du har modtaget en nye hændelser (og %(count)d er ikke vist):" #: gajim/atom_window.py:128 gajim/data/gui/atom_entry_window.ui:20 msgid "You have received new entry:" msgstr "Du har modtaget en ny hændelse:" #: gajim/adhoc_commands.py:111 gajim/data/gui/adhoc_commands_window.ui:9 msgid "Ad-hoc Commands - Gajim" msgstr "Ad-hoc Kommandoer - Gajim" #: gajim/adhoc_commands.py:320 msgid "Cancel confirmation" msgstr "Annuller bekræftelse" #: gajim/adhoc_commands.py:321 msgid "" "You are in process of executing command. Do you really want to cancel it?" msgstr "" "Du er i færd med at køre en kommando. Er du sikker på du vil afbryde den?" #: gajim/adhoc_commands.py:387 gajim/adhoc_commands.py:411 msgid "Service sent malformed data" msgstr "Tjeneste sendte malformeret data" #: gajim/adhoc_commands.py:396 msgid "Service changed the session identifier." msgstr "Tjeneste ændrede sessionsnøglen." #: gajim/adhoc_commands.py:416 #, fuzzy, python-format msgid "%s - Ad-hoc Commands - Gajim" msgstr "Ad-hoc Kommandoer - Gajim" #: gajim/adhoc_commands.py:510 msgid "Service returned an error." msgstr "Tjeneste returnerede en fejl." #: gajim/negotiation.py:34 msgid "- messages will be logged" msgstr "- beskeder vil blive logget" #: gajim/negotiation.py:36 msgid "- messages will not be logged" msgstr "- beskeder vil ikke blive logget" #: gajim/notify.py:103 #, fuzzy msgid "Open" msgstr "OpenPGP: " #: gajim/dialog_messages.py:33 #, fuzzy msgid "You can not start a new conversation unless you are connected." msgstr "Du kan kun deltage i en gruppe samtale hvis du er tilsluttet." #: gajim/dialog_messages.py:48 msgid "Unread events" msgstr "Ulæste hændelser" #: gajim/dialog_messages.py:49 msgid "Read all pending events before removing this account." msgstr "Læs alle ventende hændelser før denne konto fjernes." #: gajim/dialog_messages.py:53 msgid "You are currently connected to the server" msgstr "Du er for øjeblikket tilsluttet til serveren" #: gajim/dialog_messages.py:54 msgid "To disable the account, you must be disconnected." msgstr "For at deaktivere din konto må du afbryde din tilslutning." #: gajim/dialog_messages.py:58 #, fuzzy msgid "Invalid Form" msgstr "Ugyldig rum" #: gajim/dialog_messages.py:59 #, fuzzy msgid "The form is not filled correctly." msgstr "Kælenavnet har ikke tilladte tegn." #: gajim/dialog_messages.py:63 gajim/common/helpers.py:406 msgid "Invisible" msgstr "Usynlig" #: gajim/dialog_messages.py:68 msgid "A connection is not available" msgstr "En tilslutning er ikke tilgængelig" #: gajim/dialog_messages.py:69 msgid "Your message can not be sent until you are connected." msgstr "Din besked kan ikke blive sendt før du er tilsluttet." #: gajim/dialog_messages.py:73 #, fuzzy msgid "JID already in list" msgstr "Jabber ID er allerede i listen" #: gajim/dialog_messages.py:74 #, fuzzy msgid "The JID you entered is already in the list. Choose another one." msgstr "Den Jabber ID som de skrev er allerede i listen. Vælg en anden." #: gajim/dialog_messages.py:78 msgid "Invalid answer" msgstr "Forkert svar" #: gajim/dialog_messages.py:79 #, python-format msgid "Transport %(name)s answered wrongly to register request: %(error)s" msgstr "" "Transport %(name)s svarede forkert på indskrivnings forespørgslen: %(error)s" #: gajim/dialog_messages.py:84 #, fuzzy msgid "Wrong Custom Hostname" msgstr "Brug tilpasset værtsnavn/port" #: gajim/dialog_messages.py:85 #, fuzzy, python-format msgid "Wrong custom hostname \"%s\". Ignoring it." msgstr "Brug tilpasset værtsnavn/port" #: gajim/dialog_messages.py:89 msgid "Error while removing privacy list" msgstr "Fejl under fjernelse af privatlivs liste" #: gajim/dialog_messages.py:90 #, python-format msgid "" "Privacy list %s has not been removed. It is maybe active in one of your " "connected resources. Deactivate it and try again." msgstr "" "Privatlivs liste %s er ikke blevet fjernet. Den er måske aktiv i en af dine " "tilsluttede ressourcer. Deaktivér den og prøv igen." #: gajim/dialog_messages.py:96 msgid "Invisibility not supported" msgstr "Usynlighed er ikke understøttet" #: gajim/dialog_messages.py:97 #, python-format msgid "Account %s doesn't support invisibility." msgstr "Konto %s understøtter ikke usynlighed." #: gajim/dialog_messages.py:101 msgid "Unregister failed" msgstr "Tilslutning fejlede" #: gajim/dialog_messages.py:102 #, python-format msgid "Unregistration with server %(server)s failed: %(error)s" msgstr "Frakobling fra serveren %(server)s mislykkedes: %(error)s" #: gajim/dialog_messages.py:106 msgid "Registration succeeded" msgstr "Tilslutning lykkedes" #: gajim/dialog_messages.py:107 #, python-format msgid "Registration with agent %s succeeded" msgstr "Tilslutning med agenten %s lykkedes" #: gajim/dialog_messages.py:111 msgid "Registration failed" msgstr "Tilslutning fejlede" #: gajim/dialog_messages.py:112 #, python-format msgid "" "Registration with agent %(agent)s failed with error %(error)s: %(error_msg)s" msgstr "" "Tilslutning med agenten %(agent)s mislykkedes med fejlen %(error)s: " "%(error_msg)s" #: gajim/dialog_messages.py:117 #, fuzzy msgid "Unable to join Groupchat" msgstr "Ikke i stand til at deltage i gruppesamtale." #: gajim/dialog_messages.py:122 msgid "GStreamer error" msgstr "" #: gajim/dialog_messages.py:123 #, fuzzy, python-format msgid "" "Error: %(error)s\n" "Debug: %(debug)s" msgstr "Fejl besked: %s" #: gajim/dialog_messages.py:127 msgid "Wrong host" msgstr "Forkert vært" #: gajim/dialog_messages.py:128 msgid "Invalid local address? :-O" msgstr "Invalid local address? :-O" #: gajim/dialog_messages.py:132 msgid "Avahi error" msgstr "Avahi fejl" #: gajim/dialog_messages.py:133 #, python-format msgid "" "%s\n" "Link-local messaging might not work properly." msgstr "" "%s\n" "Link-local beskeder vil sandsynligvis ikke virke ordentligt." #: gajim/dialog_messages.py:137 gajim/dialog_messages.py:142 #, fuzzy msgid "Could not request upload slot" msgstr "Kunne ikke starte lokal tjeneste" #: gajim/dialog_messages.py:143 msgid "Got unexpected response from server (see log)" msgstr "" #: gajim/dialog_messages.py:147 gajim/dialog_messages.py:152 #, fuzzy msgid "Could not open file" msgstr "Kunne ikke laste billede" #: gajim/dialog_messages.py:148 msgid "Exception raised while opening file (see log)" msgstr "" #: gajim/dialog_messages.py:157 msgid "Unsecure" msgstr "" #: gajim/dialog_messages.py:158 #, fuzzy msgid "Server returned unsecure transport (http)" msgstr "Tjeneste returnerede en fejl." #: gajim/dialog_messages.py:162 #, fuzzy msgid "Could not upload file" msgstr "Kunne ikke laste billede" #: gajim/dialog_messages.py:163 #, python-format msgid "HTTP response code from server: %s" msgstr "" #: gajim/dialog_messages.py:167 msgid "Upload Error" msgstr "" #: gajim/dialog_messages.py:172 msgid "Encryption Error" msgstr "" #: gajim/dialog_messages.py:173 #, fuzzy msgid "For the choosen encryption is no encryption method available" msgstr "En tilslutning er ikke tilgængelig" #: gajim/gajim_themes_window.py:61 msgid "Theme" msgstr "Tema" #: gajim/gajim_themes_window.py:98 msgid "You cannot make changes to the default theme" msgstr "Du kan ikke lave ændringer til standard temaet" #: gajim/gajim_themes_window.py:99 #, fuzzy msgid "Please create a new clean theme." msgstr "Opret et nyt tema med dit ønskede navn." #: gajim/gajim_themes_window.py:170 msgid "theme name" msgstr "Tema navn" #: gajim/gajim_themes_window.py:187 msgid "You cannot delete your current theme" msgstr "Du kan ikke slette det nuværende tema" #: gajim/gajim_themes_window.py:188 msgid "Pick another theme to use first." msgstr "" #: gajim/accounts_window.py:40 #, fuzzy msgid "Merge Accounts" msgstr "Flettede konti" #: gajim/accounts_window.py:41 #, fuzzy msgid "Use PGP Agent" msgstr "Brug G_PG Agenten" #: gajim/accounts_window.py:153 gajim/common/config.py:511 msgid "Be right back." msgstr "Er straks tilbage." #: gajim/accounts_window.py:157 msgid "Relogin now?" msgstr "Log ind igen nu?" #: gajim/accounts_window.py:158 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "" "Hvis du vil at alle ændringerne skal træde i kraft nu, må du logge ind igen." #: gajim/accounts_window.py:211 #, python-format msgid "You have opened chat in account %s" msgstr "Du har en åben samtale med kontonavnet %s" #: gajim/accounts_window.py:212 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "" "Alle samtale og gruppesamtale vinduer vil blive lukket. Vil du fortsætte?" #: gajim/accounts_window.py:345 #, fuzzy msgid "Remove" msgstr "_Kan fjernes" #: gajim/accounts_window.py:388 #, fuzzy msgid "Rename account label" msgstr "Omdøb Konto" #: gajim/accounts_window.py:457 msgid "Login" msgstr "" #: gajim/accounts_window.py:466 msgid "Connection" msgstr "Tilslutning" #: gajim/accounts_window.py:469 #, fuzzy msgid "Import Contacts" msgstr "Inviter _Kontakter" #: gajim/accounts_window.py:472 gajim/accounts_window.py:655 #, fuzzy msgid "Client Certificate" msgstr "Selvsigneret certifikat" #: gajim/accounts_window.py:475 gajim/accounts_window.py:570 #, fuzzy msgid "OpenPGP Key" msgstr "Tildel OpenPGP Nøgle" #: gajim/accounts_window.py:486 gajim/accounts_window.py:558 #, fuzzy msgid "Connect on startup" msgstr "T_ilslut når Gajim startes" #: gajim/accounts_window.py:489 #, fuzzy msgid "Reconnect when connection is lost" msgstr "Tilslut automatisk hvis tilslutningen tabes" #: gajim/accounts_window.py:492 gajim/accounts_window.py:562 #, fuzzy msgid "Save conversations for all contacts" msgstr "Gem konversations _logger for alle kontakter" #: gajim/accounts_window.py:494 gajim/accounts_window.py:564 msgid "Store conversations on the harddrive" msgstr "" #: gajim/accounts_window.py:496 #, fuzzy msgid "Server Message Archive" msgstr "_Send Server Besked..." #: gajim/accounts_window.py:498 msgid "" "Messages get stored on the server.\n" "The archive is used to sync messages\n" "between multiple devices.\n" "XEP-0313" msgstr "" #: gajim/accounts_window.py:503 gajim/accounts_window.py:566 #, fuzzy msgid "Global Status" msgstr "Status For Alle" #: gajim/accounts_window.py:505 #, fuzzy msgid "Synchronise the status of all accounts" msgstr "Ændrer status for kontoen eller konti" #: gajim/accounts_window.py:507 #, fuzzy msgid "Message Carbons" msgstr "Beskeder" #: gajim/accounts_window.py:509 msgid "" "All your other online devices get copies\n" "of sent and received messages.\n" "XEP-0280" msgstr "" #: gajim/accounts_window.py:513 msgid "Use file transfer proxies" msgstr "Brug fil transport proxy" #: gajim/accounts_window.py:525 gajim/accounts_window.py:560 #, fuzzy msgid "Use environment variable" msgstr "br_ug HTTP__PROXY miljøvariablen" #: gajim/accounts_window.py:527 #, fuzzy msgid "Proxy" msgstr "Proxy:" #: gajim/accounts_window.py:530 #, fuzzy msgid "Warn on insecure connection" msgstr "Ad_var mig før jeg bruger en usikker forbindelse" #: gajim/accounts_window.py:534 msgid "Send keep-alive packets" msgstr "Send hold-i-live pakker" #: gajim/accounts_window.py:538 msgid "Manually set the hostname for the server" msgstr "" #: gajim/accounts_window.py:541 #, fuzzy msgid "Resource" msgstr "Resource:" #: gajim/accounts_window.py:544 gajim/accounts_window.py:612 #: gajim/accounts_window.py:617 #, fuzzy msgid "Priority" msgstr "Priori_tet:" #: gajim/accounts_window.py:568 #, fuzzy msgid "Synchronize the status of all accounts" msgstr "Ændrer status for kontoen eller konti" #: gajim/accounts_window.py:581 #, fuzzy msgid "First Name" msgstr "Fornavn:" #: gajim/accounts_window.py:584 #, fuzzy msgid "Last Name" msgstr "Efternavn:" #: gajim/accounts_window.py:587 #: gajim/data/gui/archiving_313_preferences_window.ui:71 msgid "Jabber ID" msgstr "Jabber ID" #: gajim/accounts_window.py:590 #, fuzzy msgid "Email" msgstr "Ny E-post" #: gajim/accounts_window.py:608 #, fuzzy msgid "Adjust to status" msgstr "_Tilpas til status" #: gajim/accounts_window.py:635 msgid "Enable" msgstr "Aktiver" #: gajim/accounts_window.py:642 #, fuzzy msgid "Port" msgstr "_Port:" #: gajim/accounts_window.py:647 #, fuzzy msgid "Connection Options" msgstr "Tilslutning" #: gajim/accounts_window.py:659 #, fuzzy msgid "Encrypted Certificate" msgstr "Selvsigneret certifikat" #: gajim/accounts_window.py:663 #, fuzzy msgid "Certificate Options" msgstr "Selvsigneret certifikat" #: gajim/accounts_window.py:671 gajim/data/gui/join_groupchat_window.ui:143 #, fuzzy msgid "Password" msgstr "Adgangskode:" #: gajim/accounts_window.py:675 #, fuzzy msgid "Save Password" msgstr "Gem adgangskode" #: gajim/accounts_window.py:678 gajim/data/gui/change_password_dialog.ui:8 msgid "Change Password" msgstr "Ændre Adgangskode" #: gajim/accounts_window.py:683 #, fuzzy msgid "Login Options" msgstr "Føl_elsesikoner:" #: gajim/gajim_remote.py:59 gajim/common/exceptions.py:71 msgid "D-Bus is not present on this machine or python module is missing" msgstr "" "D-Bus er ikke tilgængelig på denne maskine eller et python modul mangler" #: gajim/gajim_remote.py:81 msgid "Shows a help on specific command" msgstr "Viser hjælp for en specifik kommando" #: gajim/gajim_remote.py:84 msgid "command" msgstr "Kommando" #: gajim/gajim_remote.py:85 msgid "show help on command" msgstr "Vis hjælp for kommando" #: gajim/gajim_remote.py:89 #, fuzzy msgid "Lists all contacts in roster, one for each line" msgstr "" "Udskriver en liste af alle kontakter i kontaktvinduet. Hver kontakt placeres " "på en separat linie" #: gajim/gajim_remote.py:91 gajim/gajim_remote.py:106 gajim/gajim_remote.py:116 #: gajim/gajim_remote.py:130 gajim/gajim_remote.py:144 #: gajim/gajim_remote.py:153 gajim/gajim_remote.py:174 #: gajim/gajim_remote.py:204 gajim/gajim_remote.py:213 #: gajim/gajim_remote.py:220 #, fuzzy msgid "?CLI:account" msgstr "Konto" #: gajim/gajim_remote.py:91 msgid "show only contacts of the given account" msgstr "viser kun kontakter for den givne konto" #: gajim/gajim_remote.py:97 msgid "Prints a list of registered accounts" msgstr "Udskriver en liste af registrerede konti" #: gajim/gajim_remote.py:101 msgid "Changes the status of account(s)" msgstr "Ændrer status for kontoen eller konti" #: gajim/gajim_remote.py:104 #, fuzzy msgid "?CLI:status" msgstr "status" #: gajim/gajim_remote.py:104 #, fuzzy msgid "" "one of: offline, online, chat, away, xa, dnd, invisible. If not set, use " "account's previous status" msgstr "en af: offline, online, chat, away, xa, dnd, invisible" #: gajim/gajim_remote.py:105 gajim/gajim_remote.py:127 #: gajim/gajim_remote.py:141 gajim/gajim_remote.py:152 #, fuzzy msgid "?CLI:message" msgstr "besked" #: gajim/gajim_remote.py:105 msgid "status message" msgstr "status besked" #: gajim/gajim_remote.py:106 msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" msgstr "" "Ændre status for konto \"konto\". Hvis ikke specificeret, prøv at ændre " "status for alle konti der har sat \"synkroniser med generel status\" " "indstillingen" #: gajim/gajim_remote.py:112 msgid "Changes the priority of account(s)" msgstr "Ændrer prioriteringen for kontoen eller konti" #: gajim/gajim_remote.py:114 #, fuzzy msgid "?CLI:priority" msgstr "prioritet" #: gajim/gajim_remote.py:114 msgid "priority you want to give to the account" msgstr "prioriteten du vil give til kontoen" #: gajim/gajim_remote.py:116 msgid "" "change the priority of the given account. If not specified, change status of " "all accounts that have \"sync with global status\" option set" msgstr "" "ændre prioritet for en given konto. Hvis ikke specificeret, ændrer status " "for alle konti der har sat \"synkroniser med generel status\" indstillingen" #: gajim/gajim_remote.py:122 msgid "" "Sends new chat message to a contact in the roster. Both OpenPGP key and " "account are optional. If you want to set only 'account', without 'OpenPGP " "key', just set 'OpenPGP key' to ''." msgstr "" "Sender en ny besked til en kontakt i kontaktvinduet. Både OpenPGP nøgle og " "konto er valgfri. Hvis du ønsker at sætte en 'konto' uden 'OpenPGP nøgle', " "bare set 'OpenPGP nøgle' til ''." #: gajim/gajim_remote.py:126 gajim/gajim_remote.py:139 msgid "JID of the contact that will receive the message" msgstr "JID på den kontakt som skal modtage beskeden" #: gajim/gajim_remote.py:127 gajim/gajim_remote.py:141 #: gajim/gajim_remote.py:152 msgid "message contents" msgstr "besked indhold" #: gajim/gajim_remote.py:128 gajim/gajim_remote.py:142 msgid "PGP key" msgstr "" #: gajim/gajim_remote.py:128 gajim/gajim_remote.py:142 msgid "if specified, the message will be encrypted using this public key" msgstr "hvis specificeret vil beskeden blive krypteret med denne nøgle" #: gajim/gajim_remote.py:130 gajim/gajim_remote.py:144 #: gajim/gajim_remote.py:153 msgid "if specified, the message will be sent using this account" msgstr "hvis specificeret vil beskeden blive sendt med denne konto" #: gajim/gajim_remote.py:135 #, fuzzy msgid "" "Sends a chat message to someone on your roster. Optionally with OpenPGP key " "and account. If you want to only set the latter, set OpenPGP key to \"\"." msgstr "" "Sender en ny besked til en kontakt i kontaktvinduet. Både OpenPGP nøgle og " "konto er valgfri. Hvis du ønsker at sætte en 'konto' uden 'OpenPGP nøgle', " "bare set 'OpenPGP nøgle' til ''." #: gajim/gajim_remote.py:140 msgid "subject" msgstr "emne" #: gajim/gajim_remote.py:140 msgid "message subject" msgstr "emne på besked" #: gajim/gajim_remote.py:149 msgid "Sends new message to a groupchat you've joined." msgstr "Send en ny besked til en gruppesamtale du deltager i." #: gajim/gajim_remote.py:151 msgid "JID of the room that will receive the message" msgstr "JID på den rum som skal modtage beskeden" #: gajim/gajim_remote.py:158 msgid "Gets detailed info on a contact" msgstr "Få detaljeret information om kontakten" #: gajim/gajim_remote.py:160 gajim/gajim_remote.py:173 #: gajim/gajim_remote.py:203 msgid "JID of the contact" msgstr "Kontaktens JID" #: gajim/gajim_remote.py:164 msgid "Gets detailed info on a account" msgstr "Få detaljeret information om kontoen" #: gajim/gajim_remote.py:166 msgid "Name of the account" msgstr "Navn på kontoen" #: gajim/gajim_remote.py:170 msgid "Sends file to a contact" msgstr "Send en fil til en kontakt" #: gajim/gajim_remote.py:172 msgid "file" msgstr "fil" #: gajim/gajim_remote.py:172 msgid "File path" msgstr "Filsti" #: gajim/gajim_remote.py:174 msgid "if specified, file will be sent using this account" msgstr "hvis specificeret vil filen blive sendt med denne konto" #: gajim/gajim_remote.py:179 msgid "Lists all preferences and their values" msgstr "Hvis alle indstillinger og deres værdier" #: gajim/gajim_remote.py:183 msgid "Sets value of 'key' to 'value'." msgstr "Sætter værdien for 'nøglen' til 'værdi'." #: gajim/gajim_remote.py:185 msgid "key=value" msgstr "nøgle=værdi" #: gajim/gajim_remote.py:185 #, fuzzy msgid "'key' is the name of the preference, 'value' is what to set it to" msgstr "" "'nøgle' er navnet for indstillingen, 'værdi' er den værdi den er sat til" #: gajim/gajim_remote.py:190 msgid "Deletes a preference item" msgstr "Sletter et indstillingspunkt" #: gajim/gajim_remote.py:192 msgid "key" msgstr "nøgle" #: gajim/gajim_remote.py:192 msgid "name of the preference to be deleted" msgstr "navn på den indstilling som skal slettes" #: gajim/gajim_remote.py:196 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "" "Skriver den nuværende tilstand af Gajims indstillinger til .config filen" #: gajim/gajim_remote.py:201 msgid "Removes contact from roster" msgstr "Fjerner kontakt fra kontaktvinduet" #: gajim/gajim_remote.py:204 msgid "if specified, contact is taken from the contact list of this account" msgstr "" "hvis specificeret vil kontakten tages fra kontaktlisten fra denne konto" #: gajim/gajim_remote.py:211 msgid "Returns current status (the global one unless account is specified)" msgstr "" "Returnere den nuværende status (den globale status hvis ikke en konto er " "valgt)" #: gajim/gajim_remote.py:218 msgid "" "Returns current status message (the global one unless account is specified)" msgstr "" "Returnere den nuværende statusbesked (den globale status besked hvis ikke en " "konto er valgt)" #: gajim/gajim_remote.py:225 msgid "Returns number of unread messages" msgstr "Returnerer antal ikke læste beskeder" #: gajim/gajim_remote.py:230 msgid "Sends custom XML" msgstr "Sender tilpasset XML" #: gajim/gajim_remote.py:232 msgid "XML to send" msgstr "XML som skal sendes" #: gajim/gajim_remote.py:233 msgid "" "Account to which the XML will be sent; if not specified, XML will be sent to " "all accounts" msgstr "" "Den konto hvor XML vil blive sendt; hvis ikke den er specificeret, vil XML " "blive sendt til alle konti" #: gajim/gajim_remote.py:239 #, fuzzy msgid "Change the avatar" msgstr "Ændre status" #: gajim/gajim_remote.py:241 #, fuzzy msgid "Picture to use" msgstr "Kælenavn som skal bruges" #: gajim/gajim_remote.py:242 msgid "" "Account in which the avatar will be set; if not specified, the avatar will " "be set for all accounts" msgstr "" "Den konto hvor XML vil blive sendt; hvis ikke den er specificeret, vil XML " "blive sendt til alle konti" #: gajim/gajim_remote.py:249 msgid "Check if Gajim is running" msgstr "Kontroller om Gajim kører" #: gajim/gajim_remote.py:275 msgid "Missing argument \"contact_jid\"" msgstr "Manglende argument \"contact_jid\"" #: gajim/gajim_remote.py:295 #, python-format msgid "" "'%s' is not in your roster.\n" "Please specify account for sending the message." msgstr "" "'%s' er ikke i dit kontaktvindue.\n" "Specificer venligst en konto for at sende beskeden." #: gajim/gajim_remote.py:298 msgid "You have no active account" msgstr "Du har ingen aktiv konto" #: gajim/gajim_remote.py:346 msgid "It seems Gajim is not running. So you can't use gajim-remote." msgstr "Det ser ud til at Gajim ikke kører. Så du kan ikke bruge gajim-remote." #: gajim/gajim_remote.py:373 #, python-format msgid "" "Usage: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" msgstr "" "Brug: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" #: gajim/gajim_remote.py:377 msgid "Arguments:" msgstr "Argumenter:" #: gajim/gajim_remote.py:381 #, python-format msgid "%s not found" msgstr "%s ikke fundet" #: gajim/gajim_remote.py:387 #, fuzzy, python-format msgid "" "Usage:\n" " %s command [arguments]\n" "\n" "Command is one of:\n" msgstr "" "Brug: %s kommando [argumenter]\n" "Kommando er en af:\n" #: gajim/gajim_remote.py:457 #, python-format msgid "" "Too many arguments. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" "For mange argumenter. \n" "Skriv \"%(basename)s help %(command)s\" for mere information" #: gajim/gajim_remote.py:462 #, python-format msgid "" "Argument \"%(arg)s\" is not specified. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" "Argument \"%(arg)s\" er ikke specificeret. \n" "Skriv \"%(basename)s help %(command)s\" for mere information" #: gajim/common/app.py:264 msgid "Unable to load idle module" msgstr "Ikke i stand til at indlæse tomgangs modulet" #: gajim/common/fuzzyclock.py:37 msgid "twelve" msgstr "tolv" #: gajim/common/fuzzyclock.py:37 msgid "one" msgstr "en" #: gajim/common/fuzzyclock.py:37 msgid "two" msgstr "to" #: gajim/common/fuzzyclock.py:37 msgid "three" msgstr "tre" #: gajim/common/fuzzyclock.py:37 msgid "four" msgstr "fire" #: gajim/common/fuzzyclock.py:38 msgid "five" msgstr "fem" #: gajim/common/fuzzyclock.py:38 msgid "six" msgstr "seks" #: gajim/common/fuzzyclock.py:38 msgid "seven" msgstr "syv" #: gajim/common/fuzzyclock.py:38 msgid "eight" msgstr "otte" #: gajim/common/fuzzyclock.py:38 msgid "nine" msgstr "ni" #: gajim/common/fuzzyclock.py:38 msgid "ten" msgstr "ti" #: gajim/common/fuzzyclock.py:39 msgid "eleven" msgstr "elleve" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "%(0)s o'clock" msgstr "klokken %(0)s" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "five past %(0)s" msgstr "fem over %(0)s" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "ten past %(0)s" msgstr "ti over %(0)s" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "quarter past %(0)s" msgstr "kvart over %(0)s" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "twenty past %(0)s" msgstr "tyve over %(0)s" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "twenty five past %(0)s" msgstr "femogtyve over %(0)s" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "half past %(0)s" msgstr "halv %(1)s" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "twenty five to %(1)s" msgstr "femogtyve minutter i %(1)s" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "twenty to %(1)s" msgstr "tyve minutter i %(1)s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "quarter to %(1)s" msgstr "kvart på %(1)s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "ten to %(1)s" msgstr "ti på %(1)s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "five to %(1)s" msgstr "fem på %(1)s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "%(1)s o'clock" msgstr "klokken %(1)s" #: gajim/common/fuzzyclock.py:48 gajim/common/fuzzyclock.py:50 msgid "Night" msgstr "Nat" #: gajim/common/fuzzyclock.py:48 msgid "Early morning" msgstr "Tidlig morgen" #: gajim/common/fuzzyclock.py:48 msgid "Morning" msgstr "Morgen" #: gajim/common/fuzzyclock.py:49 msgid "Almost noon" msgstr "Næsten middag" #: gajim/common/fuzzyclock.py:49 msgid "Noon" msgstr "Middag" #: gajim/common/fuzzyclock.py:49 msgid "Afternoon" msgstr "Eftermiddag" #: gajim/common/fuzzyclock.py:49 msgid "Evening" msgstr "Aften" #: gajim/common/fuzzyclock.py:50 msgid "Late evening" msgstr "Sen aften" #: gajim/common/fuzzyclock.py:52 msgid "Start of week" msgstr "Ugestart" #: gajim/common/fuzzyclock.py:52 gajim/common/fuzzyclock.py:53 msgid "Middle of week" msgstr "Midten af ugen" #: gajim/common/fuzzyclock.py:53 msgid "End of week" msgstr "Slutten af ugen" #: gajim/common/fuzzyclock.py:53 msgid "Weekend!" msgstr "Weekend!" #: gajim/common/connection_handlers_events.py:369 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " "management tools such as http://jru.jabberstudio.org/ to remove it" msgstr "" "JID %s er ikke RFC føjelig. Den vil ikke blive tilføjet til dit " "kontaktvindue. Brug kontaktvindue håndterings redskaber som http://jru." "jabberstudio.org/ til at fjerne det." #: gajim/common/connection_handlers_events.py:852 #, python-format msgid "unsubscribe request from %s" msgstr "forespørsel om ophør på abonnement fra %s" #: gajim/common/connection_handlers_events.py:952 msgid "Room has been destroyed" msgstr "Rummet er blevet ødelagt" #: gajim/common/connection_handlers_events.py:960 #, python-format msgid "You can join this room instead: %s" msgstr "Du kan deltage i dette rum i stedet: %s" #: gajim/common/connection_handlers_events.py:1979 #, python-format msgid "Unknown SSL error: %d" msgstr "Ukendt SSL fejl: %d" #: gajim/common/connection_handlers_events.py:2625 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Ny Besked fra %(nickname)s" #: gajim/common/connection_handlers_events.py:2631 #, python-format msgid "New Private Message from group chat %s" msgstr "Ny Privat Besked fra gruppe samtale %s" #: gajim/common/connection_handlers_events.py:2634 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" #: gajim/common/connection_handlers_events.py:2637 #, python-format msgid "Messaged by %(nickname)s" msgstr "Besked fra %(nickname)s" #: gajim/common/connection_handlers_events.py:2643 #, python-format msgid "New Message from %(nickname)s" msgstr "Ny Besked fra %(nickname)s" #: gajim/common/connection_handlers_events.py:2809 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s Ændrede Status" #: gajim/common/connection_handlers_events.py:2817 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s Loggede Ind" #: gajim/common/connection_handlers_events.py:2823 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s Loggede Ud" #: gajim/common/contacts.py:386 msgid "Not in roster" msgstr "Ikke i kontaktvindue" #: gajim/common/config.py:76 msgid "" "Show desktop notification even when a chat window is opened for this contact " "and does not have focus" msgstr "" #: gajim/common/config.py:77 msgid "Play sound when user is busy" msgstr "Spil en lyd når brugeren er optaget" #: gajim/common/config.py:79 msgid "Show only online and free for chat contacts in roster." msgstr "" "Vis kun brugere på net og brugere klar for en samtale i kontaktvinduet." #: gajim/common/config.py:82 msgid "Time in minutes, after which your status changes to away." msgstr "Tid i minutter før din status ændres til borte." #: gajim/common/config.py:83 msgid "$S (Away as a result of being idle more than $T min)" msgstr "$S (Væk som et resultat af at være inaktiv i mere end $T minutter)" #: gajim/common/config.py:83 #, fuzzy msgid "$S will be replaced by current status message, $T by autoawaytime." msgstr "" "$S vil blive ombyttet med den nuværende status besked, $T ved automatisk væk " "tid." #: gajim/common/config.py:85 msgid "Time in minutes, after which your status changes to not available." msgstr "Tid i minutter før din status ændres til ikke tilgængelig." #: gajim/common/config.py:86 msgid "$S (Not available as a result of being idle more than $T min)" msgstr "" "$S (Ikke tilgængelig som et resultat af at være inaktiv i mere end $T " "minutter)" #: gajim/common/config.py:86 #, fuzzy msgid "$S will be replaced by current status message, $T by autoxatime." msgstr "" "$S vil blive erstattet med den nuværende status besked, $T ved ikke " "tilgængelig tid." #: gajim/common/config.py:89 #, fuzzy msgid "" "When to show notification area icon. Can be 'never', 'on_event', 'always'." msgstr "" "Når skal systembakke ikonet vises? Kan være 'never', 'on_event', 'always'." #: gajim/common/config.py:90 msgid "Allow to hide the roster window even if the tray icon is not shown." msgstr "" #: gajim/common/config.py:95 msgid "Incoming nickname color." msgstr "Indgående farve på kælenavn." #: gajim/common/config.py:96 msgid "Outgoing nickname color." msgstr "Farve på udgående kælenavn." #: gajim/common/config.py:97 msgid "Incoming text color." msgstr "Indgående farve på tekst." #: gajim/common/config.py:98 msgid "Outgoing text color." msgstr "Udgående farve på tekst." #: gajim/common/config.py:99 msgid "Status message text color." msgstr "Status besked farve på tekst." #: gajim/common/config.py:102 #, fuzzy msgid "Contact signed in notification color." msgstr "_Vis hændelse i kontaktvindue" #: gajim/common/config.py:103 #, fuzzy msgid "Contact signout notification color" msgstr "_Vis hændelse i kontaktvindue" #: gajim/common/config.py:104 #, fuzzy msgid "New message notification color." msgstr "Forhåndsvis nye beskeder i et påmindelses pop op vinduer?" #: gajim/common/config.py:105 #, fuzzy msgid "File transfer request notification color." msgstr "Filoverførsel Forespørgsel" #: gajim/common/config.py:106 #, fuzzy msgid "File transfer error notification color." msgstr "Filoverførsel er afbrudt" #: gajim/common/config.py:107 #, fuzzy msgid "File transfer complete or stopped notification color." msgstr "Når en filoverførsel er færdig, vis en pop op påmindelse" #: gajim/common/config.py:108 #, fuzzy msgid "Groupchat invitation notification color" msgstr "Gruppesamtale Invitation" #: gajim/common/config.py:109 #, fuzzy msgid "Background color of status changed notification" msgstr "Baggrundsfarve på kontakter når de netop har tilsluttet sig." #: gajim/common/config.py:110 msgid "Other dialogs color." msgstr "" #: gajim/common/config.py:111 msgid "Incoming nickname font." msgstr "Udgående farve på kælenavn." #: gajim/common/config.py:112 msgid "Outgoing nickname font." msgstr "Udgående font på kælenavn." #: gajim/common/config.py:113 msgid "Incoming text font." msgstr "Indgående font på tekst." #: gajim/common/config.py:114 msgid "Outgoing text font." msgstr "Udgående font på tekst." #: gajim/common/config.py:115 msgid "Status message text font." msgstr "Status besked font på tekst" #: gajim/common/config.py:116 msgid "" "List (space separated) of rows (accounts and groups) that are collapsed." msgstr "" "Liste (separeret med mellemrum) af rækker (konti og grupper) som er " "kollapset." #: gajim/common/config.py:123 msgid "Language used by speller" msgstr "Sprog brugt af stavelseskontrollen" #: gajim/common/config.py:124 msgid "" "'always' - print time for every message.\n" "'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" "'never' - never print time." msgstr "" "'altid' - skriv tid for hver besked.\n" "'nogen ganger' - skriv tid for hver print_ichat_every_foo_minutes minutter.\n" "'aldrig' - skriv aldrig tiden." #: gajim/common/config.py:125 msgid "" "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " "to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " "This is used only if print_time is 'sometimes'." msgstr "" "Print tiden i samtaler med en upræcis klokke. Værdien for hvor upræcis " "klokken skal være kan rangere fra 1 til 4, eller 0 for at deaktivere den " "upræcise klokke. 1 er den mest præcise klokke, 4 den mindst præcise. Dette " "bruges kun hvis print_time er 'nogen ganger'." #: gajim/common/config.py:127 msgid "Enable ASCII emoticons" msgstr "" #: gajim/common/config.py:129 msgid "Treat * / _ pairs as possible formatting characters." msgstr "Behandle * / _ par som mulige formaterings tegn." #: gajim/common/config.py:130 msgid "" "If True, do not remove */_ . So *abc* will be bold but with * * not removed." msgstr "" "Hvis sandt, ikke fjern */_. Således at *abc* bliver skrevet med fed skrift " "men * * bliver ikke fjernet." #: gajim/common/config.py:133 msgid "" "Uses ReStructured text markup to send HTML, plus ascii formatting if " "selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" "restructuredtext.html (If you want to use this, install docutils)" msgstr "" "Bruger ReStruktureret tekst redigering til at sende HTML, plus ascii " "formatering hvis valgt. For syntaks, se http://docutils.sourceforge.net/docs/" "ref/rst/restructuredtext.html (Hvis du vil bruge dette, installer docutils)" #: gajim/common/config.py:142 msgid "" "Character to add after nickname when using nick completion (tab) in group " "chat." msgstr "" "Tegn som tilføjes efter kælenavn når der bruges kælenavnsfuldførelse (tab) i " "en gruppesamtale." #: gajim/common/config.py:143 msgid "" "Character to propose to add after desired nickname when desired nickname is " "used by someone else in group chat." msgstr "" "Tegnforslag til at tilføje efter det ønskede kælenavn, når det ønskede " "kælenavn er i brug af en anden i gruppesamtalen." #: gajim/common/config.py:165 msgid "" "If True, Gajim will save roster position when hiding roster, and restore it " "when showing roster." msgstr "" #: gajim/common/config.py:171 msgid "Place the roster on the right in single window mode" msgstr "" #: gajim/common/config.py:177 msgid "" "This option let you customize timestamp that is printed in conversation. For " "exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " "strftime for full documentation: http://docs.python.org/lib/module-time.html" msgstr "" "Denne valgmulighed giver dig muligheden for at tilpasse hvordan " "klokkeslettet bliver skrevet i en samtale. For eksempel [%H:%M] vil vise " "[timer:minutter]. Se python dokumentationen for strftime: http://docs.python." "org/lib/module-time.html" #: gajim/common/config.py:178 msgid "Characters that are printed before the nickname in conversations" msgstr "Tegn som bliver skrevet før kælenavnet i samtaler" #: gajim/common/config.py:179 msgid "Characters that are printed after the nickname in conversations" msgstr "Tegn som bliver skrevet efter kælenavnet i samtaler" #: gajim/common/config.py:181 msgid "Add * and [n] in roster title?" msgstr "Tilføj * og [n] i tittelen på kontaktvinduet?" #: gajim/common/config.py:182 #, fuzzy msgid "" "How many history messages should be restored when a chat tab/window is " "reopened?" msgstr "" "Hvor mange linjer skal huskes fra forrige samtale når et samtale vindue/" "faneblad genåbnes." #: gajim/common/config.py:183 msgid "How far back in time (minutes) history is restored. -1 means no limit." msgstr "" #: gajim/common/config.py:184 #, fuzzy msgid "" "How many lines to request from server when entering a groupchat. -1 means no " "limit" msgstr "" "Hvor mange linjer skal hentes fra serveren når man deltager i en " "gruppesamtale." #: gajim/common/config.py:185 #, fuzzy msgid "" "Minutes of backlog to request when entering a groupchat. -1 means no limit" msgstr "" "Hvor mange minutter tilbage skal der hentes log fra når man deltager i en " "gruppesamtale." #: gajim/common/config.py:186 msgid "" "How many seconds to wait before trying to autorejoin to a conference you are " "being disconnected from. Set to 0 to disable autorejoining." msgstr "" "Hvor mange sekunder skal der ventes før der prøves at oprette en ny " "forbindelse til en konference som du er blevet afbrudt fra. Sæt værdien til " "0 for at forhindre at der prøves at oprette ny forbindelse." #: gajim/common/config.py:187 msgid "" "Should autorejoin be activated when we are being kicked from a conference?" msgstr "" #: gajim/common/config.py:188 msgid "" "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " "Client default behaviour)." msgstr "" "Send besked med Ctrl+Enter og lave en ny linie med Enter (standard Mirabilis " "ICQ klient adfærd)." #: gajim/common/config.py:190 msgid "How many lines to store for Ctrl+KeyUP." msgstr "Hvor mange linjer skal gemmes for Ctrl+KeyUP." #: gajim/common/config.py:193 #, fuzzy, python-format msgid "" "Either custom url with %%s in it where %%s is the word/phrase or " "'WIKTIONARY' which means use wiktionary." msgstr "" "Enten en tilpasset url som indeholder %s hvor %s er ordet/frasen, eller " "'WIKTIONARY' som betyder brug wiktionary." #: gajim/common/config.py:196 msgid "If checked, Gajim can be controlled remotely using gajim-remote." msgstr "" "Hvis valgt kan Gajim blive kontrolleret eksternt ved hjælp af gajim-remote." #: gajim/common/config.py:197 msgid "" "Sent chat state notifications. Can be one of all, composing_only, disabled." msgstr "" "Send samtale status påmindelser. Kan være en af disse: all, composing_only, " "disabled." #: gajim/common/config.py:198 msgid "" "Displayed chat state notifications in chat windows. Can be one of all, " "composing_only, disabled." msgstr "" "Vis samtale status påmindelser i samtale vinduer. Kan være en af disse: all, " "composing_only, disabled." #: gajim/common/config.py:200 msgid "" "When not printing time for every message (print_time==sometimes), print it " "every x minutes." msgstr "" "Når der ikke skrives tid for hver besked (print_time==sometimes), skriv " "tiden for hver x minutter." #: gajim/common/config.py:201 msgid "Ask before closing a group chat tab/window." msgstr "Spørg før et gruppesamtale vindue/faneblad lukkes." #: gajim/common/config.py:202 #, fuzzy msgid "" "Always ask for confirmation before closing groupchats with any of the JIDs " "on this space separated list." msgstr "" "Altid spørg før et gruppesamtale vindue/faneblad lukkes, hvis den findes i " "denne mellemrums separerede liste af gruppesamtale jids." #: gajim/common/config.py:203 #, fuzzy msgid "" "Never ask for confirmation before closing groupchats with any of the JIDs on " "this space separated list." msgstr "" "Aldrig spørg før et gruppesamtale vindue/faneblad lukkes, hvis den findes i " "denne mellemrums separerede liste af gruppesamtale jids." #: gajim/common/config.py:204 #, fuzzy msgid "" "Ask before closing tabbed chat window if there are controls that can lose " "data (chat, private chat, groupchat that will not be minimized)" msgstr "" "Spørg før et faneblad i samtale vinduet lukkes hvis der kan mistes dat " "(samtale, privat samtale, gruppe samtale som ikke vil minimere)" #: gajim/common/config.py:207 msgid "" "Comma separated list of hosts that we send, in addition of local interfaces, " "for File Transfer in case of address translation/port forwarding." msgstr "" "Komma separeret liste af værter som vi sender, i tillæg til lokale " "grænseflader, for filoverførsler i tilfælde af adresse omskrivning/port " "videresending." #: gajim/common/config.py:209 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." msgstr "IEC standard siger KiB = 1024 byte, KB = 1000 byte." #: gajim/common/config.py:211 #, fuzzy msgid "Notify of events in the notification area." msgstr "Vis påmindelse af hændelser i statusfelt ikonet." #: gajim/common/config.py:212 msgid "" "If False, Gajim will display a static event icon instead of the blinking " "status icon in the notification area when notifying on event." msgstr "" #: gajim/common/config.py:218 msgid "Show tab when only one conversation?" msgstr "Vis et faneblad når der kun er en samtale?" #: gajim/common/config.py:219 msgid "Show tabbed notebook border in chat windows?" msgstr "Vis faneblade i samtalevinduer?" #: gajim/common/config.py:220 msgid "Show close button in tab?" msgstr "Vis lukke knap i faneblad?" #: gajim/common/config.py:221 msgid "" "A list of modp groups to use in a Diffie-Hellman, highest preference first, " "separated by commas. Valid groups are 1, 2, 5, 14, 15, 16, 17 and 18. Higher " "numbers are more secure, but take longer to calculate when you start a " "session." msgstr "" "En liste af modp grupper til at bruges i en Diffie-Hellman, højest " "præference først, adskilt af kommaer. Gyldige grupper er 1, 2, 5, 14, 15, " "16, 17 og 18. Højere tal er mere sikre, men tager længere tid at udregne når " "du starter en session." #: gajim/common/config.py:234 msgid "Preview new messages in notification popup?" msgstr "Forhåndsvis nye beskeder i et påmindelses pop op vinduer?" #: gajim/common/config.py:237 msgid "" "A semicolon-separated list of words that will be highlighted in group chats." msgstr "" "En semikolon-separeret liste af ord som vil blive fremhævet i gruppesamtaler." #: gajim/common/config.py:238 #, fuzzy msgid "" "If True, quits Gajim when X button of Window Manager is clicked. This " "setting is taken into account only if notification icon is used." msgstr "" "Hvis Sandt, lukker Gajim når X knappen fra vindueshåndteringen klikkes. " "Denne indstilling tages der kun hensyn til hvis et statusfelt ikon bruges." #: gajim/common/config.py:239 msgid "" "If True, Gajim hides the Roster window on pressing the X button instead of " "minimizing into the Dock." msgstr "" #: gajim/common/config.py:240 msgid "" "If True, Gajim will display an icon on each tab containing unread messages. " "Depending on the theme, this icon may be animated." msgstr "" "Hvis Sandt, vil Gajim vise et ikon på hvert faneblad som indeholder ulæste " "beskeder. Afhængig af temaet, kan dette ikon være animeret." #: gajim/common/config.py:241 msgid "" "If True, Gajim will display the status message, if not empty, for every " "contact under the contact name in roster window." msgstr "" "Hvis Sandt, vil Gajim vise status beskeder, hvis ikke tomme, for hver " "kontakt under kontaktnavnet i kontaktvinduet." #: gajim/common/config.py:247 msgid "Define the position of the avatar in roster. Can be left or right" msgstr "" "Definer positionen af avataren i kontaktvinduet. Kan være venstre eller højre" #: gajim/common/config.py:248 msgid "" "If False, Gajim will no longer print status line in chats when a contact " "changes his or her status and/or his or her status message." msgstr "" "Hvis Falsk, vil Gajim ikke længere skrive statuslinjer i samtaler når en " "kontakt ændrer hans eller hendes status og/eller hans eller hendes status " "besked." #: gajim/common/config.py:249 #, fuzzy msgid "" "Can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " "longer print status line in groupchats when a member changes his or her " "status and/or his or her status message. If \"all\" Gajim will print all " "status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " "group chat." msgstr "" "kan være \"none\", \"all\" eller \"in_and_out\". Hvis \"nono\" vil Gajim " "ikke længere skrive statuslinier i gruppesamtaler når et medlem ændrer hans " "eller hendes status og/eller hans eller hendes status besked. Hvis \"all\" " "vil Gajim skrive alle status beskeder. Hvis \"in_and_out\" vil Gajim kun " "skrive FOO kommer/forlader gruppesamtalen." #: gajim/common/config.py:251 msgid "Log XHTML messages instead of plain text messages." msgstr "" #: gajim/common/config.py:252 msgid "Background color of contacts when they just signed in." msgstr "Baggrundsfarve på kontakter når de netop har tilsluttet sig." #: gajim/common/config.py:253 msgid "Background color of contacts when they just signed out." msgstr "Baggrundsfarve på kontakter når de netop har afbrudt tilslutningen." #: gajim/common/config.py:255 msgid "" "If True, restored messages will use a smaller font than the default one." msgstr "" "Hvis Sandt vil gamle beskeder fra forrige samtale bruge en mindre skrifttype " "end den som er standard." #: gajim/common/config.py:256 msgid "Don't show avatar for the transport itself." msgstr "Ikke vis en avatar for selve transporten." #: gajim/common/config.py:257 msgid "Don't show roster in the system taskbar." msgstr "Ikke hvis kontaktvindue i vindueslisten." #: gajim/common/config.py:258 msgid "" "If True and installed GTK+ and PyGTK versions are at least 2.8, make the " "window flash (the default behaviour in most Window Managers) when holding " "pending events." msgstr "" "Hvis Sandt og GTK+ og PyGTK installerede versioner er mindst 2.8, blink med " "vinduet (standard adfærd i de fleste vindueshåndterere) når det indeholder " "ventende begivenheder." #: gajim/common/config.py:260 msgid "" "Jabberd1.4 does not like sha info when one join a password protected group " "chat. Turn this option to False to stop sending sha info in group chat " "presences." msgstr "" "Jabberd1.4 kan ikke lide sha information når man deltager i en adgangskode " "beskyttet gruppesamtale. Sæt dette valg til Falsk for at stoppe med at sende " "sha information i gruppesamtaler." #: gajim/common/config.py:263 #, fuzzy msgid "" "Controls the window where new messages are placed.\n" "'always' - All messages are sent to a single window.\n" "'always_with_roster' - Like 'always' but the messages are in a single window " "along with the roster.\n" "'never' - All messages get their own window.\n" "'peracct' - Messages for each account are sent to a specific window.\n" "'pertype' - Each message type (e.g. chats vs. groupchats) is sent to a " "specific window." msgstr "" "Kontrollerer vinduet hvor nye beskeder er placeret.\n" "'always' - Alle beskeder bliver vist i et enkelt vindue.\n" "'always_with_roster' - Som 'always' men beskederne er i et enkelt vindue " "sammen med kontaktvinduet.\n" "'never' - Alle beskeder får deres eget vindue.\n" "'peracct' - Beskeder for den enkelte konto bliver sendt til specifikke " "vinduer.\n" "'pertype' - Hver besked type (for eks. samtaler versus gruppesamtaler) " "bliver sendt til et specifikt vindue." #: gajim/common/config.py:264 msgid "" "Show roster on startup.\n" "'always' - Always show roster.\n" "'never' - Never show roster.\n" "'last_state' - Restore the last state roster." msgstr "" #: gajim/common/config.py:265 msgid "If False, you will no longer see the avatar in the chat window." msgstr "Hvis Falsk vil du ikke længere se en avatar i samtale vinduet." #: gajim/common/config.py:266 msgid "If True, pressing the escape key closes a tab/window." msgstr "Hvis Sandt vil tryk på escape tasten lukke et vindue/faneblad." #: gajim/common/config.py:267 msgid "Hides the banner in a group chat window" msgstr "Skjuler banneret i et gruppesamtale vindue" #: gajim/common/config.py:268 msgid "Hides the banner in two persons chat window" msgstr "Skjuler banneret i et to personers samtalevindue" #: gajim/common/config.py:269 msgid "Hides the group chat occupants list in group chat window." msgstr "Skjuler gruppesamtale deltagerlisten i gruppesamtale vinduer." #: gajim/common/config.py:270 msgid "" "In a chat, show the nickname at the beginning of a line only when it's not " "the same person talking than in previous message." msgstr "" "I en samtale, vis kælenavn i begyndelsen af en linie kun når det ikke er den " "samme person som snakker som i forrige besked." #: gajim/common/config.py:271 msgid "Indentation when using merge consecutive nickname." msgstr "Indrykning når man fletter ens kælenavne." #: gajim/common/config.py:272 msgid "" "List of colors, separated by \":\", that will be used to color nicknames in " "group chats." msgstr "" "Liste af farver, separeret med \":\", som vil blive brugt til at farve " "kælenavne i gruppesamtaler." #: gajim/common/config.py:273 msgid "Ctrl-Tab go to next composing tab when none is unread." msgstr "Ctrl-Tab gå til næste faneblad når ingen er ulæste." #: gajim/common/config.py:274 msgid "" "Should we show the confirm metacontacts creation dialog or not? Empty string " "means we never show the dialog." msgstr "" "Skal vi vise bekræftelses vinduet for oprettelse af metakontakter? Tom " "streng betyder at vi aldrig viser vinduet." #: gajim/common/config.py:275 msgid "" "Should we show the confirm block contact dialog or not? Empty string means " "we never show the dialog." msgstr "" "Skal vi vise bekræftelses vinduet for blokering af kontakter? Tom streng " "betyder at vi aldrig viser vinduet." #: gajim/common/config.py:276 msgid "" "Should we show the confirm custom status dialog or not? Empty string means " "we never show the dialog." msgstr "" "Skal vi vise bekræftelses vinduet for ændring af personlig status? Tom " "streng betyder at vi aldrig viser vinduet." #: gajim/common/config.py:277 msgid "" "If True, you will be able to set a negative priority to your account in " "account modification window. BE CAREFUL, when you are logged in with a " "negative priority, you will NOT receive any message from your server." msgstr "" "Hvis Sandt vil du være i stand til at sætte en negativ prioritet til din " "konto i kontoændrings vinduet. VÆR FORSIGTIG, når du er logget med en " "negativ prioritet vil du IKKE modtage nogen beskeder fra din server." #: gajim/common/config.py:278 msgid "" "If True, Gajim will show number of online and total contacts in account and " "group rows." msgstr "" "Hvis Sandt vil Gajim vise antallet af online og totale kontakter i konto og " "gruppe rækker." #: gajim/common/config.py:279 msgid "" "Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " "as if they were of this type" msgstr "" "Kan være tom, 'chat' eller 'normal'. Hvis ikke tom, behandl alle indkommende " "beskeder som om de var af denne type" #: gajim/common/config.py:280 msgid "" "If True, Gajim will scroll and select the contact who sent you the last " "message, if chat window is not already opened." msgstr "" "Hvis Sandt vil Gajim rulle ned/op og vælge den kontakt som sendte dig den " "sidste besked, hvis ikke allerede kontaktvinduet er åbent." #: gajim/common/config.py:281 msgid "Time of inactivity needed before the change status window closes down." msgstr "" "Tid med inaktivitet der skal gå før vinduet til at ændre status lukkes." #: gajim/common/config.py:282 msgid "" "Maximum number of lines that are printed in conversations. Oldest lines are " "cleared." msgstr "" "Maksimum antal linjer som bliver skrevet i samtaler. De ældste linjer bliver " "slettet." #: gajim/common/config.py:283 #, fuzzy msgid "" "If True, notification windows from notification-daemon will be attached to " "notification icon." msgstr "" "Hvis sandt vil påmindelses vinduer fra påmindelses dæmonen blive fæstet til " "ikonet i systembakken." #: gajim/common/config.py:284 msgid "Choose interval between 2 checks of idleness." msgstr "Vælg interval mellem 2 kontroller for ingen aktivitet." #: gajim/common/config.py:285 msgid "" "Valid uri schemes. Only schemes in this list will be accepted as \"real\" " "uri. (mailto and xmpp are handled separately)" msgstr "" "Gyldige uri skemaer. Kun skemaer i denne liste vil blive accepteret som " "\"rigtige\" uri. (mailto og xmpp bliver behandlet separat)" #: gajim/common/config.py:286 msgid "If True, completion in groupchats will be like a shell auto-completion" msgstr "" "Hvis sandt, vil færdiggørelse i gruppe samtaler fungere på samme måde som " "færdiggørelse i kommandolinjen" #: gajim/common/config.py:287 msgid "" "When is self contact row displayed. Can be \"always\", \"when_other_resource" "\" or \"never\"" msgstr "" "Når bliver selv kontakt rækken vist. Kan være \"always\", " "\"when_other_resource\" eller \"never\"" #: gajim/common/config.py:292 msgid "Optionally fix jingle output video framerate. Example: 10/1 or 25/2" msgstr "" #: gajim/common/config.py:293 msgid "Optionally resize jingle output video. Example: 320x240" msgstr "" #: gajim/common/config.py:294 msgid "If True, You will also see your webcam" msgstr "" #: gajim/common/config.py:297 msgid "" "If True, Gajim will try to use a STUN server when using Jingle. The one in " "\"stun_server\" option, or the one given by the XMPP server." msgstr "" #: gajim/common/config.py:298 msgid "STUN server to use when using Jingle" msgstr "" #: gajim/common/config.py:299 msgid "" "If True, Gajim will show affiliation of groupchat occupants by adding a " "colored square to the status icon" msgstr "" #: gajim/common/config.py:300 msgid "" "Proxy used for all outgoing connections if the account does not have a " "specific proxy configured" msgstr "" #: gajim/common/config.py:301 msgid "If True, Gajim will ignore incoming attention requestd (\"wizz\")." msgstr "" #: gajim/common/config.py:302 msgid "" "If enabled, Gajim will reopen chat windows that were opened last time Gajim " "was closed." msgstr "" #: gajim/common/config.py:303 #, fuzzy msgid "" "If enabled, Gajim will show an icon to show that sent message has been " "received by your contact" msgstr "" "Hvis aktiveret vil Gajim i spørge for en status besked. Den valgte standard " "besked vil blive brugt i stedet." #: gajim/common/config.py:304 msgid "Show a mini avatar in chat window tabs and in window icon" msgstr "" #: gajim/common/config.py:305 #, fuzzy msgid "If True, Gajim will use the Systems Keyring to store account passwords." msgstr "" "Hvis Sandt vil Gajim bruge Gnome Nøglering (hvis tilgængelig) til at gemme " "konto adgangskoder." #: gajim/common/config.py:306 msgid "Sets the encoding used by python-gnupg" msgstr "" #: gajim/common/config.py:307 msgid "If True, Gajim will execute XEP-0146 Commands." msgstr "" #: gajim/common/config.py:308 msgid "All non-compliant MAM Groupchats" msgstr "" #: gajim/common/config.py:324 msgid "" "Priority will change automatically according to your status. Priorities are " "defined in autopriority_* options." msgstr "" "Prioriteten vil ændres automatisk ifølge din status. Prioriteter er " "defineret i autopriority_* indstillingerne." #: gajim/common/config.py:332 msgid "" "Status used to autoconnect as. Can be online, chat, away, xa, dnd, " "invisible. NOTE: this option is used only if restore_last_status is disabled" msgstr "" "Din status som bruges når du automatisk forbindes. Kan være online, samtale, " "væk, ikke tilgængelig, vil ikke forstyrres, usynlig. NOTE: denne " "valgmulighed bliver kun brugt hvis restore_last_status er deaktiveret" #: gajim/common/config.py:333 msgid "If enabled, restore the last status that was used." msgstr "Hvis valgt, gendan den sidste status som var brugt." #: gajim/common/config.py:335 msgid "" "If True, Contacts requesting authorization will be automatically accepted." msgstr "" "Hvis sandt, kontakter som beder om autorisering vil automatisk blive " "accepteret." #: gajim/common/config.py:336 msgid "" "If False, this account will be disabled and will not appear in roster window." msgstr "" "Hvis Falsk vil denne konto blive deaktiveret og vil ikke vises i " "kontaktvinduet." #: gajim/common/config.py:339 msgid "" "If disabled, don't sign presences with GPG key, even if GPG is configured." msgstr "" "Hvis deaktiveret, ikke signer tilstedeværelser med GPG nøgle, selvom GPG er " "konfigureret." #: gajim/common/config.py:341 msgid "Enable ESessions encryption for this account." msgstr "Aktiver ESessions kryptering for denne konto." #: gajim/common/config.py:342 msgid "Should Gajim automatically start an encrypted session when possible?" msgstr "Skal Gajim automatisk starte en krypteret session når det er muligt?" #: gajim/common/config.py:343 msgid "Allow plaintext connections" msgstr "" #: gajim/common/config.py:346 msgid "" "List (space separated) of authentication mechanisms to try. Can contain " "ANONYMOUS, EXTERNAL, GSSAPI, SCRAM-SHA-1-PLUS, SCRAM-SHA-1, DIGEST-MD5, " "PLAIN, X-MESSENGER-OAUTH2 or XEP-0078" msgstr "" #: gajim/common/config.py:347 #, fuzzy msgid "" "Show a warning dialog before sending password on an plaintext connection. " "Can be 'warn', 'connect', 'disconnect'" msgstr "" "Hvis en advarsels dialog før en adgangskode sendes over en forbindelse i " "klar tekst." #: gajim/common/config.py:348 msgid "Show a warning dialog before using standard SSL library." msgstr "Hvis en advarsels dialog før brugen af standard SSL biblioteket." #: gajim/common/config.py:349 #, fuzzy msgid "" "Show a warning dialog before sending PLAIN password over a plain connection." msgstr "" "Hvis en advarsels dialog før en adgangskode sendes over en forbindelse i " "klar tekst." #: gajim/common/config.py:352 msgid "Space separated list of ssl errors to ignore." msgstr "Mellemrums adskilt liste af ssl fejl som skal ignoreres." #: gajim/common/config.py:358 msgid "" "Space separated list of JIDs for which you do not want to store logs. You " "can also add account name to log nothing for this account." msgstr "" #: gajim/common/config.py:359 msgid "" "On startup, Gajim will download logs stored on server, provided the server " "supports XEP-0313" msgstr "" #: gajim/common/config.py:360 msgid "" "Space separated list of JIDs for which you accept to not log conversations " "if he does not want to." msgstr "" #: gajim/common/config.py:363 msgid "Whitespace sent after inactivity" msgstr "Mellemrum sendt efter inaktivitet" #: gajim/common/config.py:364 msgid "XMPP ping sent after inactivity" msgstr "XMPP ping sendt efter inaktivitet" #: gajim/common/config.py:368 #, fuzzy msgid "" "How many seconds to wait for the answer of ping alive packet before we try " "to reconnect?" msgstr "" "Hvor mange sekunder skal der ventes på svaret af en holdilive pakke, før vi " "prøver at forbinde igen." #: gajim/common/config.py:372 msgid "Jabberd2 workaround" msgstr "Jabberd2 tilpasning" #: gajim/common/config.py:375 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." msgstr "" "Hvis valgt vil Gajim bruge din IP og proxy defineret i file_transfer_proxies " "indstillingen for filoverførsler." #: gajim/common/config.py:376 msgid "" "If True, Gajim will test file transfer proxies on startup to be sure it " "works. Openfire's proxies are known to fail this test even if they work." msgstr "" #: gajim/common/config.py:389 msgid "Answer to receipt requests" msgstr "Svar til modtagelses forespørgsel" #: gajim/common/config.py:390 msgid "Sent receipt requests" msgstr "Sendte modtagelses forespørgsler" #: gajim/common/config.py:399 #, fuzzy msgid "" "Allow Gajim to send information about the operating system you are running." msgstr "" "Hvis valgt vil Gajim tillade andre at kunne se det operativ system du bruger" #: gajim/common/config.py:400 #, fuzzy msgid "Allow Gajim to send your local time." msgstr "%s vil gerne sende dig en fil." #: gajim/common/config.py:401 msgid "" "When negotiating an encrypted session, should Gajim assume you want your " "messages to be logged?" msgstr "" "Ved forhandling af en krypteret session, skal Gajim da antage at du vil have " "dine beskeder logget?" #: gajim/common/config.py:404 #, fuzzy msgid "Message that is sent to contacts you want to add" msgstr "Fyld ind data for den kontakt som du vil tilføje" #: gajim/common/config.py:405 msgid "" "If enabled and if server supports this feature, Gajim will receive messages " "sent and received by other resources." msgstr "" #: gajim/common/config.py:406 msgid "" "If enabled, Gajim will send your local IPs so your contact can connect to " "your machine to transfer files." msgstr "" #: gajim/common/config.py:407 #, fuzzy msgid "Latest token for OAuth 2.0 authentication." msgstr "Anonym godkendelse" #: gajim/common/config.py:408 #, fuzzy msgid "client_id for OAuth 2.0 authentication." msgstr "Anonym godkendelse" #: gajim/common/config.py:409 #, fuzzy msgid "redirect_url for OAuth 2.0 authentication." msgstr "Anonym godkendelse" #: gajim/common/config.py:410 msgid "" "Space separated list of JIDs for which we want to re-open a chat window on " "next startup." msgstr "" #: gajim/common/config.py:412 msgid "HTTP Upload: Enable HTTPS Verification" msgstr "" #: gajim/common/config.py:413 msgid "" "Preferred file transfer mechanism for file drag&drop on chat window. Can be " "'httpupload' (default) or 'jingle'" msgstr "" #: gajim/common/config.py:476 gajim/common/config.py:481 msgid "Language for which we want to check misspelled words" msgstr "Sprog som vi vil bruge til at kontrollere for stavefejl" #: gajim/common/config.py:478 msgid "The currently active encryption for that contact" msgstr "" #: gajim/common/config.py:482 #, fuzzy msgid "" "How many lines to request from server when entering a groupchat. -1 means no " "limit, -2 means global value" msgstr "" "Hvor mange linjer skal hentes fra serveren når man deltager i en " "gruppesamtale." #: gajim/common/config.py:483 #, fuzzy msgid "" "Minutes of backlog to request when entering a groupchat. -1 means no limit, " "-2 means global value" msgstr "" "Hvor mange minutter tilbage skal der hentes log fra når man deltager i en " "gruppesamtale." #: gajim/common/config.py:484 msgid "State whether we want a notification for every message in this room" msgstr "" #: gajim/common/config.py:487 msgid "" "State whether plugins should be activated on startup (this is saved on Gajim " "exit). This option SHOULD NOT be used to (de)activate plug-ins. Use GUI " "instead." msgstr "" #: gajim/common/config.py:492 gajim/common/pep.py:157 msgid "Sleeping" msgstr "Sover" #: gajim/common/config.py:493 msgid "Back soon" msgstr "Snart tilbage" #: gajim/common/config.py:493 msgid "Back in some minutes." msgstr "Tilbage om få minutter." #: gajim/common/config.py:494 gajim/common/pep.py:127 msgid "Eating" msgstr "Spiser" #: gajim/common/config.py:494 msgid "I'm eating, so leave me a message." msgstr "Jeg spiser, så læg en besked." #: gajim/common/config.py:495 msgid "Movie" msgstr "Film" #: gajim/common/config.py:495 msgid "I'm watching a movie." msgstr "Jeg ser en film." #: gajim/common/config.py:496 gajim/common/pep.py:186 msgid "Working" msgstr "Arbejder" #: gajim/common/config.py:496 msgid "I'm working." msgstr "Jeg arbejder." #: gajim/common/config.py:497 msgid "Phone" msgstr "Telefon" #: gajim/common/config.py:497 msgid "I'm on the phone." msgstr "Jeg snakker i telefon." #: gajim/common/config.py:498 msgid "Out" msgstr "Ude" #: gajim/common/config.py:498 msgid "I'm out enjoying life." msgstr "Jeg er ude og nyder livet." #: gajim/common/config.py:509 msgid "I'm available." msgstr "Jeg er tilgængelig." #: gajim/common/config.py:510 msgid "I'm free for chat." msgstr "Jeg er tilgængelig for en samtale." #: gajim/common/config.py:512 msgid "I'm not available." msgstr "Jeg er ikke tilgængelig." #: gajim/common/config.py:513 msgid "Do not disturb." msgstr "Ikke forstyr." #: gajim/common/config.py:514 gajim/common/config.py:515 msgid "Bye!" msgstr "Farvel!" #: gajim/common/config.py:526 msgid "" "Sound to play when a group chat message contains one of the words in " "muc_highlight_words, or when a group chat message contains your nickname." msgstr "" "Lyd som spilles når en gruppesamtale besked indeholder en af følgende ord i " "muc_highlight_words, eller når en gruppesamtale besked indeholder dit " "kælenavn." #: gajim/common/config.py:527 msgid "Sound to play when any MUC message arrives." msgstr "Lyd som spilles når en hvilken som helst MUC besked ankommer." #: gajim/common/config.py:535 gajim/common/optparser.py:357 msgid "green" msgstr "grøn" #: gajim/common/config.py:539 gajim/common/optparser.py:343 msgid "grocery" msgstr "købmandsvarer" #: gajim/common/config.py:543 msgid "human" msgstr "menneske" #: gajim/common/config.py:547 msgid "marine" msgstr "marint" #: gajim/common/config.py:554 #, fuzzy msgid "Tor" msgstr "Til" #: gajim/common/commands.py:86 msgid "Change status information" msgstr "Ændre status information" #: gajim/common/commands.py:108 msgid "Change status" msgstr "Ændre status" #: gajim/common/commands.py:109 msgid "Set the presence type and description" msgstr "Sæt tilstedeværelses type og beskrivelse" #: gajim/common/commands.py:115 msgid "Free for chat" msgstr "Åben for samtaler" #: gajim/common/commands.py:116 msgid "Online" msgstr "Online" #: gajim/common/commands.py:118 msgid "Extended away" msgstr "Udvidet borte" #: gajim/common/commands.py:119 msgid "Do not disturb" msgstr "Forstyr ikke" #: gajim/common/commands.py:120 msgid "Offline - disconnect" msgstr "Ofline - ikke tilsluttet" #: gajim/common/commands.py:125 msgid "Presence description:" msgstr "Tilstedeværelses beskrivelse:" #: gajim/common/commands.py:160 gajim/common/commands.py:343 msgid "The status has been changed." msgstr "Din status er blevet ændret." #: gajim/common/commands.py:192 gajim/common/commands.py:225 msgid "Leave Groupchats" msgstr "Forlad Gruppesamtaler" #: gajim/common/commands.py:215 #, python-format msgid "%(nickname)s on %(room_jid)s" msgstr "%(nickname)s i %(room_jid)s" #: gajim/common/commands.py:219 msgid "You have not joined a groupchat." msgstr "Du detlager ikke i en gruppesamtale." #: gajim/common/commands.py:226 msgid "Choose the groupchats you want to leave" msgstr "Vælg de gruppesamtaler du vil forlade" #: gajim/common/commands.py:271 msgid "You left the following groupchats:" msgstr "Du forlod de følgende gruppesamtaler:" #: gajim/common/commands.py:283 msgid "Forward unread messages" msgstr "Videresend ulæste beskeder" #: gajim/common/commands.py:310 msgid "All unread messages have been forwarded." msgstr "Alle ulæste beskeder er blevet videresendt." #: gajim/common/commands.py:318 #, fuzzy msgid "Forward unread message then disconnect" msgstr "Videresend ulæste beskeder" #: gajim/common/httpupload.py:137 msgid "File is empty" msgstr "Filen er tom" #: gajim/common/httpupload.py:140 msgid "File does not exist" msgstr "Filen eksisterer ikke" #: gajim/common/httpupload.py:147 gajim/common/httpupload.py:204 #, python-format msgid "File is too large, maximum allowed file size is: %s" msgstr "" #: gajim/common/check_paths.py:37 msgid "creating logs database" msgstr "opretter log database" #: gajim/common/check_paths.py:98 #, fuzzy msgid "creating cache database" msgstr "opretter log database" #: gajim/common/check_paths.py:261 #, fuzzy, python-format msgid "moving %(src)s to %(dst)s" msgstr "Send %s til %s" #: gajim/common/check_paths.py:287 gajim/common/check_paths.py:294 #: gajim/common/check_paths.py:301 gajim/common/check_paths.py:308 #: gajim/common/check_paths.py:315 gajim/common/check_paths.py:322 #: gajim/common/check_paths.py:329 gajim/common/check_paths.py:336 #, python-format msgid "%s is a file but it should be a directory" msgstr "%s er en fil, men burde være et katalog" #: gajim/common/check_paths.py:288 gajim/common/check_paths.py:295 #: gajim/common/check_paths.py:302 gajim/common/check_paths.py:309 #: gajim/common/check_paths.py:316 gajim/common/check_paths.py:323 #: gajim/common/check_paths.py:330 gajim/common/check_paths.py:337 #: gajim/common/check_paths.py:349 gajim/common/check_paths.py:357 msgid "Gajim will now exit" msgstr "Gajim vil nu slutte" #: gajim/common/check_paths.py:348 gajim/common/check_paths.py:356 #, python-format msgid "%s is a directory but should be a file" msgstr "%s er et katalog men burde være en fil" #: gajim/common/optparser.py:55 #, python-format msgid "Error: cannot open %s for reading" msgstr "Fejl: kan ikke åbne %s for læsning" #: gajim/common/optparser.py:352 gajim/common/optparser.py:353 msgid "cyan" msgstr "cyan" #: gajim/common/optparser.py:421 msgid "migrating logs database to indices" msgstr "flytter log databasen til flere indeks" #: gajim/common/logging_helpers.py:34 #, python-format msgid "%s is not a valid loglevel" msgstr "%s er ikke et gyldigt logniveau" #: gajim/common/connection.py:83 msgid "Unable to get issuer certificate" msgstr "Ikke i stand til at skaffer udstedelses certifikat" #: gajim/common/connection.py:84 msgid "Unable to get certificate CRL" msgstr "Ikke i stand til at skaffe certifikat CRL" #: gajim/common/connection.py:85 msgid "Unable to decrypt certificate's signature" msgstr "Ikke i stand til at dekryptere certifikatets signatur" #: gajim/common/connection.py:86 msgid "Unable to decrypt CRL's signature" msgstr "Ikke i stand til at dekryptere CRL's signatur" #: gajim/common/connection.py:87 msgid "Unable to decode issuer public key" msgstr "Ikke i stand til at dekode udstederens offentlige nøgle" #: gajim/common/connection.py:88 msgid "Certificate signature failure" msgstr "Certifikat signaturen fejlede" #: gajim/common/connection.py:89 msgid "CRL signature failure" msgstr "CRL signatur fejl" #: gajim/common/connection.py:90 msgid "Certificate is not yet valid" msgstr "Certifikatet er ikke gyldigt endnu" #: gajim/common/connection.py:91 msgid "Certificate has expired" msgstr "Certifikatet er udløbet" #: gajim/common/connection.py:92 msgid "CRL is not yet valid" msgstr "CRL er endnu ikke gyldigt" #: gajim/common/connection.py:93 msgid "CRL has expired" msgstr "CRL er udløbet" #: gajim/common/connection.py:94 msgid "Format error in certificate's notBefore field" msgstr "Formateringsfejl i certifikatets notBefore felt" #: gajim/common/connection.py:95 msgid "Format error in certificate's notAfter field" msgstr "Formateringsfejl i certifikatets notAfter felt" #: gajim/common/connection.py:96 msgid "Format error in CRL's lastUpdate field" msgstr "Formateringsfejl i CRL's lastUpdate felt" #: gajim/common/connection.py:97 msgid "Format error in CRL's nextUpdate field" msgstr "Formateringsfejl i CRL's nextUpdate felt" #: gajim/common/connection.py:98 msgid "Out of memory" msgstr "Ikke mere hukommelse" #: gajim/common/connection.py:99 msgid "Self signed certificate" msgstr "Selvsigneret certifikat" #: gajim/common/connection.py:100 msgid "Self signed certificate in certificate chain" msgstr "Selvsigneret certifikat i certifikats kæden" #: gajim/common/connection.py:101 msgid "Unable to get local issuer certificate" msgstr "Ikke i stand til at skaffe lokalt udstedelses certifikat" #: gajim/common/connection.py:102 msgid "Unable to verify the first certificate" msgstr "Ikke i stand til at verificere det første certifikat" #: gajim/common/connection.py:103 msgid "Certificate chain too long" msgstr "Certifikat kæde er for lang" #: gajim/common/connection.py:104 msgid "Certificate revoked" msgstr "Certifikat tilbagekaldt" #: gajim/common/connection.py:105 msgid "Invalid CA certificate" msgstr "Ugyldig CA certifikat" #: gajim/common/connection.py:106 msgid "Path length constraint exceeded" msgstr "Sti længde begrænsning overskredet" #: gajim/common/connection.py:107 msgid "Unsupported certificate purpose" msgstr "Ikke understøttet formål for certifikatet" #: gajim/common/connection.py:108 msgid "Certificate not trusted" msgstr "Certifikatet er ikke til at stole på" #: gajim/common/connection.py:109 msgid "Certificate rejected" msgstr "Certifikatet afvist" #: gajim/common/connection.py:110 msgid "Subject issuer mismatch" msgstr "Emne udsteder uoverensstemmelse" #: gajim/common/connection.py:111 msgid "Authority and subject key identifier mismatch" msgstr "Autoritet og emne nøgle identifikations uoverensstemmelse" #: gajim/common/connection.py:112 msgid "Authority and issuer serial number mismatch" msgstr "Autoritet og udstedelses serie nummer uoverensstemmelse" #: gajim/common/connection.py:113 msgid "Key usage does not include certificate signing" msgstr "Nøglebrug indeholder ikke certifikat signering" #: gajim/common/connection.py:114 msgid "Application verification failure" msgstr "Kunne ikke verificere programmet" #: gajim/common/connection.py:876 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Tilslutning til konto \"%s\" er blevet afbrudt" #: gajim/common/connection.py:877 msgid "Reconnect manually." msgstr "Tilslut manuelt." #: gajim/common/connection.py:888 #, python-format msgid "Server %(name)s answered wrongly to register request: %(error)s" msgstr "" "Server %(name)s svarede forkert på indskrivnings forespørgslen: %(error)s" #: gajim/common/connection.py:930 #, python-format msgid "Server %s provided a different registration form" msgstr "Serveren %s gav en anderledes registreringsform" #: gajim/common/connection.py:1283 #, fuzzy, python-format msgid "Could not connect to \"%(host)s\" via proxy \"%(proxy)s\"" msgstr "Kunne ikke tilslutte til \"%s\"" #: gajim/common/connection.py:1286 #, fuzzy, python-format msgid "Could not connect to \"%(host)s\"" msgstr "Kunne ikke tilslutte til \"%s\"" #: gajim/common/connection.py:1293 #, python-format msgid "Server replied: %s" msgstr "Server svarede: %s" #: gajim/common/connection.py:1308 msgid "Connection to proxy failed" msgstr "Tilslutning til proxy fejlede" #: gajim/common/connection.py:1346 gajim/common/connection.py:1449 #, python-format msgid "Could not connect to account %s" msgstr "Kunne ikke tilslutte til kontoen %s" #: gajim/common/connection.py:1347 gajim/common/connection.py:1450 #, python-format msgid "Connection with account %s has been lost. Retry connecting." msgstr "" "Tilslutning til kontoen \"%s\" er blevet afbrudt. Prøv at tilslutte igen." #: gajim/common/connection.py:1372 #, fuzzy, python-format msgid "The authenticity of the %s certificate could be invalid" msgstr "Ægtheden af %s certifikatet kan være ugyldig." #: gajim/common/connection.py:1375 #, python-format msgid "" "\n" "SSL Error: %s" msgstr "" "\n" "SSL Fejl: %s" #: gajim/common/connection.py:1377 #, python-format msgid "" "\n" "Unknown SSL error: %d" msgstr "" "\n" "Ukendt SSL fejl: %d" #: gajim/common/connection.py:1423 #, fuzzy, python-format msgid "" "The authenticity of the %s certificate could be invalid.\n" "The certificate does not cover this domain." msgstr "Ægtheden af %s certifikatet kan være ugyldig." #: gajim/common/connection.py:1473 gajim/common/connection.py:2238 #: gajim/common/zeroconf/connection_zeroconf.py:192 #, python-format msgid "Could not connect to \"%s\"" msgstr "Kunne ikke tilslutte til \"%s\"" #: gajim/common/connection.py:1512 #, python-format msgid "Authentication failed with \"%s\"" msgstr "Godkendelse fejlede med \"%s\"" #: gajim/common/connection.py:1513 msgid "Please check your login and password for correctness." msgstr "Venligst kontroller om dit logind og adgangskode er korrekt." #: gajim/common/connection.py:2097 #, fuzzy, python-format msgid "Sent contact: \"%(jid)s\" (%(name)s)" msgstr "Sendt kontakt: \"%s\" (%s)" #: gajim/common/connection.py:2101 msgid "Sent contacts:" msgstr "Sendte kontakter:" #: gajim/common/connection.py:2255 gajim/common/connection.py:2277 msgid "Not fetched because of invisible status" msgstr "Ikke hentet på grund af usynlig status" #: gajim/common/dbus_support.py:44 msgid "D-Bus python bindings are missing in this computer" msgstr "D-Bus python bindinger mangler på denne computer" #: gajim/common/dbus_support.py:45 gajim/common/dbus_support.py:56 msgid "D-Bus capabilities of Gajim cannot be used" msgstr "Gajims D-Bus evner kan ikke bruges" #: gajim/common/dbus_support.py:55 msgid "D-Bus does not run correctly on this machine" msgstr "D-Bus kører ikke korrekt på denne maskine" #: gajim/common/dbus_support.py:58 #, fuzzy msgid "D-Bus does not run correctly on this machine: system bus not present" msgstr "D-Bus kører ikke korrekt på denne maskine" #: gajim/common/dbus_support.py:61 #, fuzzy msgid "D-Bus does not run correctly on this machine: session bus not present" msgstr "D-Bus kører ikke korrekt på denne maskine" #: gajim/common/multimedia_helpers.py:45 #, fuzzy msgid "Default device" msgstr "Standard Besked" #: gajim/common/multimedia_helpers.py:66 msgid "Audio test" msgstr "" #: gajim/common/multimedia_helpers.py:69 gajim/common/multimedia_helpers.py:85 #: gajim/common/multimedia_helpers.py:99 gajim/common/multimedia_helpers.py:117 msgid "Autodetect" msgstr "" #: gajim/common/multimedia_helpers.py:72 gajim/common/multimedia_helpers.py:87 #, fuzzy, python-format msgid "ALSA: %s" msgstr "Størrelse: %s" #: gajim/common/multimedia_helpers.py:75 gajim/common/multimedia_helpers.py:89 #, fuzzy, python-format msgid "Pulse: %s" msgstr "Fil: %s" #: gajim/common/multimedia_helpers.py:83 msgid "Fake audio output" msgstr "" #: gajim/common/multimedia_helpers.py:96 msgid "Video test" msgstr "" #: gajim/common/multimedia_helpers.py:101 #, python-format msgid "V4L2: %s" msgstr "" #: gajim/common/multimedia_helpers.py:104 #, fuzzy msgid "Screen" msgstr "grøn" #: gajim/common/multimedia_helpers.py:111 msgid "Fake video output" msgstr "" #: gajim/common/multimedia_helpers.py:114 #, python-format msgid "X Window System (X11/XShm/Xv): %s" msgstr "" #: gajim/common/multimedia_helpers.py:116 msgid "X Window System (without Xv)" msgstr "" #: gajim/common/pep.py:27 msgid "Afraid" msgstr "Bange for" #: gajim/common/pep.py:28 msgid "Amazed" msgstr "Forbavset" #: gajim/common/pep.py:29 msgid "Amorous" msgstr "Erotisk" #: gajim/common/pep.py:30 msgid "Angry" msgstr "Gal" #: gajim/common/pep.py:31 msgid "Annoyed" msgstr "Misfornøjet" #: gajim/common/pep.py:32 msgid "Anxious" msgstr "Ængstelig" #: gajim/common/pep.py:33 msgid "Aroused" msgstr "Vækket" #: gajim/common/pep.py:34 msgid "Ashamed" msgstr "Skamfuld" #: gajim/common/pep.py:35 msgid "Bored" msgstr "Keder mig" #: gajim/common/pep.py:36 msgid "Brave" msgstr "Modig" #: gajim/common/pep.py:37 msgid "Calm" msgstr "Rolig" #: gajim/common/pep.py:38 msgid "Cautious" msgstr "Forsigtig" #: gajim/common/pep.py:39 msgid "Cold" msgstr "Fryser" #: gajim/common/pep.py:40 msgid "Confident" msgstr "Sikker" #: gajim/common/pep.py:41 msgid "Confused" msgstr "Forvirret" #: gajim/common/pep.py:42 msgid "Contemplative" msgstr "Dybsindig" #: gajim/common/pep.py:43 msgid "Contented" msgstr "Tilfreds" #: gajim/common/pep.py:44 msgid "Cranky" msgstr "Forskruet" #: gajim/common/pep.py:45 msgid "Crazy" msgstr "Vanvittig" #: gajim/common/pep.py:46 msgid "Creative" msgstr "Kreativ" #: gajim/common/pep.py:47 msgid "Curious" msgstr "Nysgerrig" #: gajim/common/pep.py:48 msgid "Dejected" msgstr "Nedslået" #: gajim/common/pep.py:49 msgid "Depressed" msgstr "Deprimeret" #: gajim/common/pep.py:50 msgid "Disappointed" msgstr "Skuffet" #: gajim/common/pep.py:51 msgid "Disgusted" msgstr "Væmmes" #: gajim/common/pep.py:52 msgid "Dismayed" msgstr "Forfærdet" #: gajim/common/pep.py:53 msgid "Distracted" msgstr "Forstyrret" #: gajim/common/pep.py:54 msgid "Embarrassed" msgstr "Forlegen" #: gajim/common/pep.py:55 msgid "Envious" msgstr "Misundelig" #: gajim/common/pep.py:56 msgid "Excited" msgstr "Spændt" #: gajim/common/pep.py:57 msgid "Flirtatious" msgstr "Flirtende" #: gajim/common/pep.py:58 msgid "Frustrated" msgstr "Frustreret" #: gajim/common/pep.py:59 msgid "Grateful" msgstr "Taknemlig" #: gajim/common/pep.py:60 msgid "Grieving" msgstr "Sørge" #: gajim/common/pep.py:61 msgid "Grumpy" msgstr "Gnaven" #: gajim/common/pep.py:62 msgid "Guilty" msgstr "Skyldig" #: gajim/common/pep.py:63 msgid "Happy" msgstr "Glad" #: gajim/common/pep.py:64 msgid "Hopeful" msgstr "Håbefuld" #: gajim/common/pep.py:65 msgid "Hot" msgstr "Varm" #: gajim/common/pep.py:66 msgid "Humbled" msgstr "Ydmyg" #: gajim/common/pep.py:67 msgid "Humiliated" msgstr "Ydmyget" #: gajim/common/pep.py:68 msgid "Hungry" msgstr "Sulten" #: gajim/common/pep.py:69 msgid "Hurt" msgstr "Såret" #: gajim/common/pep.py:70 msgid "Impressed" msgstr "Imponeret" #: gajim/common/pep.py:71 msgid "In Awe" msgstr "Ærefrygt" #: gajim/common/pep.py:72 msgid "In Love" msgstr "Forelsket" #: gajim/common/pep.py:73 msgid "Indignant" msgstr "Indigneret" #: gajim/common/pep.py:74 msgid "Interested" msgstr "Interesseret" #: gajim/common/pep.py:75 msgid "Intoxicated" msgstr "Beruset" #: gajim/common/pep.py:76 msgid "Invincible" msgstr "Uovervindelig" #: gajim/common/pep.py:77 msgid "Jealous" msgstr "Jaloux" #: gajim/common/pep.py:78 msgid "Lonely" msgstr "Ensom" #: gajim/common/pep.py:79 msgid "Lost" msgstr "Tabt" #: gajim/common/pep.py:80 msgid "Lucky" msgstr "Heldig" #: gajim/common/pep.py:81 msgid "Mean" msgstr "Ondskabsfuld" #: gajim/common/pep.py:82 msgid "Moody" msgstr "Gnaven" #: gajim/common/pep.py:83 msgid "Nervous" msgstr "Nervøs" #: gajim/common/pep.py:84 msgid "Neutral" msgstr "Neutral" #: gajim/common/pep.py:85 msgid "Offended" msgstr "Fornærmet" #: gajim/common/pep.py:86 msgid "Outraged" msgstr "Oprørt" #: gajim/common/pep.py:87 msgid "Playful" msgstr "Spøgefuld" #: gajim/common/pep.py:88 msgid "Proud" msgstr "Stolt" #: gajim/common/pep.py:89 msgid "Relaxed" msgstr "Afslappet" #: gajim/common/pep.py:90 msgid "Relieved" msgstr "Lettet" #: gajim/common/pep.py:91 msgid "Remorseful" msgstr "Angrende" #: gajim/common/pep.py:92 msgid "Restless" msgstr "Hvileløs" #: gajim/common/pep.py:93 msgid "Sad" msgstr "Trist" #: gajim/common/pep.py:94 msgid "Sarcastic" msgstr "Sarkastisk" #: gajim/common/pep.py:95 msgid "Satisfied" msgstr "Tilfreds" #: gajim/common/pep.py:96 msgid "Serious" msgstr "Seriøs" #: gajim/common/pep.py:97 msgid "Shocked" msgstr "Sjokeret" #: gajim/common/pep.py:98 msgid "Shy" msgstr "Genert" #: gajim/common/pep.py:99 msgid "Sick" msgstr "Syg" #: gajim/common/pep.py:100 msgid "Sleepy" msgstr "Søvnig" #: gajim/common/pep.py:101 msgid "Spontaneous" msgstr "Spontan" #: gajim/common/pep.py:102 msgid "Stressed" msgstr "Stresset" #: gajim/common/pep.py:103 msgid "Strong" msgstr "Stærk" #: gajim/common/pep.py:104 msgid "Surprised" msgstr "Overrasket" #: gajim/common/pep.py:105 msgid "Thankful" msgstr "Taknemlig" #: gajim/common/pep.py:106 msgid "Thirsty" msgstr "Tørstig" #: gajim/common/pep.py:107 msgid "Tired" msgstr "Træt" #: gajim/common/pep.py:108 msgid "Undefined" msgstr "Uforklaret" #: gajim/common/pep.py:109 msgid "Weak" msgstr "Svag" #: gajim/common/pep.py:110 msgid "Worried" msgstr "Bekymret" #: gajim/common/pep.py:113 msgid "Doing Chores" msgstr "Laver Husarbejde" #: gajim/common/pep.py:114 msgid "Buying Groceries" msgstr "Køber ind" #: gajim/common/pep.py:115 msgid "Cleaning" msgstr "Gør Rent" #: gajim/common/pep.py:116 msgid "Cooking" msgstr "Laver Mad" #: gajim/common/pep.py:117 msgid "Doing Maintenance" msgstr "Gør Vedligeholdsarbejde" #: gajim/common/pep.py:118 msgid "Doing the Dishes" msgstr "Vasker op" #: gajim/common/pep.py:119 msgid "Doing the Laundry" msgstr "Vasker Tøj" #: gajim/common/pep.py:120 msgid "Gardening" msgstr "Laver Havearbejde" #: gajim/common/pep.py:121 msgid "Running an Errand" msgstr "Løber et Ærinde" #: gajim/common/pep.py:122 msgid "Walking the Dog" msgstr "Går tur med hunden" #: gajim/common/pep.py:123 msgid "Drinking" msgstr "Drikker" #: gajim/common/pep.py:124 msgid "Having a Beer" msgstr "Drikker en Øl" #: gajim/common/pep.py:125 msgid "Having Coffee" msgstr "Drikke Kaffe" #: gajim/common/pep.py:126 msgid "Having Tea" msgstr "Drikker Te" #: gajim/common/pep.py:128 msgid "Having a Snack" msgstr "Spiser et lille Mellemmåltid" #: gajim/common/pep.py:129 msgid "Having Breakfast" msgstr "Spiser Morgenmad" #: gajim/common/pep.py:130 msgid "Having Dinner" msgstr "Spiser Middag" #: gajim/common/pep.py:131 msgid "Having Lunch" msgstr "Spiser Frokost" #: gajim/common/pep.py:132 msgid "Exercising" msgstr "Træner" #: gajim/common/pep.py:133 gajim/common/pep.py:178 msgid "Cycling" msgstr "Cykler" #: gajim/common/pep.py:134 msgid "Dancing" msgstr "Danser" #: gajim/common/pep.py:135 msgid "Hiking" msgstr "Vandrer" #: gajim/common/pep.py:136 msgid "Jogging" msgstr "Jogger" #: gajim/common/pep.py:137 msgid "Playing Sports" msgstr "Dyrker Sport" #: gajim/common/pep.py:138 msgid "Running" msgstr "Løber" #: gajim/common/pep.py:139 msgid "Skiing" msgstr "Står på ski" #: gajim/common/pep.py:140 msgid "Swimming" msgstr "Svømmer" #: gajim/common/pep.py:141 msgid "Working out" msgstr "Træner" #: gajim/common/pep.py:142 msgid "Grooming" msgstr "Plejer" #: gajim/common/pep.py:143 msgid "At the Spa" msgstr "I Spabad" #: gajim/common/pep.py:144 msgid "Brushing Teeth" msgstr "Børster Tænder" #: gajim/common/pep.py:145 msgid "Getting a Haircut" msgstr "Bliver Klippet" #: gajim/common/pep.py:146 msgid "Shaving" msgstr "Barberer" #: gajim/common/pep.py:147 msgid "Taking a Bath" msgstr "Tager et Bad" #: gajim/common/pep.py:148 msgid "Taking a Shower" msgstr "Tager et Brusebad" #: gajim/common/pep.py:149 msgid "Having an Appointment" msgstr "Har en Aftale" #: gajim/common/pep.py:150 gajim/data/gui/gajim_themes_window.ui:363 msgid "Inactive" msgstr "Ikke aktiv" #: gajim/common/pep.py:151 msgid "Day Off" msgstr "Fridag" #: gajim/common/pep.py:152 msgid "Hanging out" msgstr "Hænge ud" #: gajim/common/pep.py:153 msgid "Hiding" msgstr "Skjult" #: gajim/common/pep.py:154 msgid "On Vacation" msgstr "Få Ferie" #: gajim/common/pep.py:155 msgid "Praying" msgstr "Ber" #: gajim/common/pep.py:156 msgid "Scheduled Holiday" msgstr "Planlagt Ferie" #: gajim/common/pep.py:158 msgid "Thinking" msgstr "Tænker" #: gajim/common/pep.py:159 msgid "Relaxing" msgstr "Slapper af" #: gajim/common/pep.py:160 msgid "Fishing" msgstr "Fisker" #: gajim/common/pep.py:161 msgid "Gaming" msgstr "Spiller" #: gajim/common/pep.py:162 msgid "Going out" msgstr "Går ud" #: gajim/common/pep.py:163 msgid "Partying" msgstr "Fester" #: gajim/common/pep.py:164 msgid "Reading" msgstr "Læser" #: gajim/common/pep.py:165 msgid "Rehearsing" msgstr "Øver" #: gajim/common/pep.py:166 msgid "Shopping" msgstr "Køber ind" #: gajim/common/pep.py:167 msgid "Smoking" msgstr "Ryger" #: gajim/common/pep.py:168 msgid "Socializing" msgstr "Socialiserer" #: gajim/common/pep.py:169 msgid "Sunbathing" msgstr "Solbader" #: gajim/common/pep.py:170 msgid "Watching TV" msgstr "Ser TV" #: gajim/common/pep.py:171 msgid "Watching a Movie" msgstr "Ser en film." #: gajim/common/pep.py:172 msgid "Talking" msgstr "Taler" #: gajim/common/pep.py:173 msgid "In Real Life" msgstr "I det virkelige liv" #: gajim/common/pep.py:174 msgid "On the Phone" msgstr "Snakker i telefon." #: gajim/common/pep.py:175 msgid "On Video Phone" msgstr "Taler i Video Telefon" #: gajim/common/pep.py:176 msgid "Traveling" msgstr "Rejser" #: gajim/common/pep.py:177 msgid "Commuting" msgstr "Pendler" #: gajim/common/pep.py:179 msgid "Driving" msgstr "Kører" #: gajim/common/pep.py:180 msgid "In a Car" msgstr "I en Bil" #: gajim/common/pep.py:181 msgid "On a Bus" msgstr "På en Bus" #: gajim/common/pep.py:182 msgid "On a Plane" msgstr "Flyver" #: gajim/common/pep.py:183 msgid "On a Train" msgstr "Kører i tog" #: gajim/common/pep.py:184 msgid "On a Trip" msgstr "På Rejse" #: gajim/common/pep.py:185 msgid "Walking" msgstr "Går" #: gajim/common/pep.py:187 msgid "Coding" msgstr "Koder" #: gajim/common/pep.py:188 msgid "In a Meeting" msgstr "I et Møde" #: gajim/common/pep.py:189 msgid "Studying" msgstr "Studerer" #: gajim/common/pep.py:190 msgid "Writing" msgstr "Skriver" #: gajim/common/pep.py:195 msgid "accuracy" msgstr "" #: gajim/common/pep.py:196 #, fuzzy msgid "alt" msgstr "standard" #: gajim/common/pep.py:197 msgid "area" msgstr "" #: gajim/common/pep.py:198 #, fuzzy msgid "bearing" msgstr "marint" #: gajim/common/pep.py:199 #, fuzzy msgid "building" msgstr "Skjult" #: gajim/common/pep.py:200 #, fuzzy msgid "country" msgstr "Konto" #: gajim/common/pep.py:201 #, fuzzy msgid "countrycode" msgstr "Konto" #: gajim/common/pep.py:202 msgid "datum" msgstr "" #: gajim/common/pep.py:203 #, fuzzy msgid "description" msgstr "Beskrivelse" #: gajim/common/pep.py:204 #, fuzzy msgid "error" msgstr "Fejl" #: gajim/common/pep.py:205 msgid "floor" msgstr "" #: gajim/common/pep.py:206 msgid "lat" msgstr "" #: gajim/common/pep.py:207 msgid "locality" msgstr "" #: gajim/common/pep.py:208 #, fuzzy msgid "lon" msgstr "en" #: gajim/common/pep.py:209 msgid "postalcode" msgstr "" #: gajim/common/pep.py:210 msgid "region" msgstr "" #: gajim/common/pep.py:211 msgid "room" msgstr "rum" #: gajim/common/pep.py:212 msgid "speed" msgstr "" #: gajim/common/pep.py:213 msgid "street" msgstr "" #: gajim/common/pep.py:214 msgid "text" msgstr "" #: gajim/common/pep.py:215 msgid "timestamp" msgstr "" #: gajim/common/pep.py:216 msgid "uri" msgstr "uri" #: gajim/common/pep.py:343 msgid "Unknown Artist" msgstr "Ukendt Artist" #: gajim/common/pep.py:346 msgid "Unknown Title" msgstr "Ukendt Titel" #: gajim/common/pep.py:349 msgid "Unknown Source" msgstr "Ukendt Kilde" #: gajim/common/pep.py:352 #, python-format msgid "" "\"%(title)s\" by %(artist)s\n" "from %(source)s" msgstr "" "\"%(title)s\" af %(artist)s\n" "fra %(source)s" #: gajim/common/stanza_session.py:422 msgid "" "[This is part of an encrypted session. If you see this message, something " "went wrong.]" msgstr "" "[Dette er en del af en krypteret session. Hvis du ser denne besked gik noget " "galt.]" #: gajim/common/jingle_rtp.py:123 #, fuzzy, python-format msgid "%s configuration error" msgstr "Rum Konfigurering" #: gajim/common/jingle_rtp.py:124 #, python-format msgid "" "Couldn’t setup %(text)s. Check your configuration.\n" "\n" "Pipeline was:\n" "%(pipeline)s\n" "\n" "Error was:\n" "%(error)s" msgstr "" #: gajim/common/jingle_rtp.py:371 msgid "audio input" msgstr "" #: gajim/common/jingle_rtp.py:375 msgid "audio output" msgstr "" #: gajim/common/jingle_rtp.py:433 msgid "video input" msgstr "" #: gajim/common/jingle_rtp.py:440 msgid "video output" msgstr "" #: gajim/common/helpers.py:296 msgid "Server must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:304 msgid "Invalid character in hostname." msgstr "Ugyldig karakter i værtsnavn." #: gajim/common/helpers.py:306 msgid "Server address required." msgstr "Server adresse påkrævet." #: gajim/common/helpers.py:310 msgid "Username must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:318 msgid "Invalid character in username." msgstr "Ugyldig karakter i brugernavn." #: gajim/common/helpers.py:324 msgid "Resource must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:332 msgid "Invalid character in resource." msgstr "Ugyldig karakter i ressource." #: gajim/common/helpers.py:372 msgid "_Busy" msgstr "_Travlt" #: gajim/common/helpers.py:377 msgid "_Not Available" msgstr "_Ikke tilgængelig" #: gajim/common/helpers.py:382 msgid "_Free for Chat" msgstr "_Tilgængelig for samtale" #: gajim/common/helpers.py:387 #, fuzzy msgid "?user status:_Available" msgstr "?transfer status:Midlertidig stoppet" #: gajim/common/helpers.py:391 msgid "Connecting" msgstr "Tilslutter" #: gajim/common/helpers.py:394 msgid "A_way" msgstr "_Væk" #: gajim/common/helpers.py:399 msgid "_Offline" msgstr "_Afkoblet" #: gajim/common/helpers.py:404 msgid "_Invisible" msgstr "_Usynlig" #: gajim/common/helpers.py:410 msgid "?contact has status:Unknown" msgstr "?contact has status:Ukendt" #: gajim/common/helpers.py:412 msgid "?contact has status:Has errors" msgstr "?contact has status:Har fejl" #: gajim/common/helpers.py:427 msgid "?Subscription we already have:None" msgstr "?Subscription we already have:Intet" #: gajim/common/helpers.py:429 msgid "To" msgstr "Til" #: gajim/common/helpers.py:431 msgid "From" msgstr "Fra" #: gajim/common/helpers.py:433 msgid "Both" msgstr "Begge" #: gajim/common/helpers.py:435 #, fuzzy msgid "Unknown" msgstr "?OS:Ukendt" #: gajim/common/helpers.py:441 msgid "?Ask (for Subscription):None" msgstr "?Ask (for Subscription):Intet" #: gajim/common/helpers.py:443 msgid "Subscribe" msgstr "Abonner" #: gajim/common/helpers.py:452 msgid "?Group Chat Contact Role:None" msgstr "?Group Chat Contact Role:Ingen" #: gajim/common/helpers.py:455 msgid "Moderators" msgstr "Moderatorer" #: gajim/common/helpers.py:457 msgid "Moderator" msgstr "Moderator" #: gajim/common/helpers.py:460 msgid "Participants" msgstr "Deltagere" #: gajim/common/helpers.py:462 msgid "Participant" msgstr "Deltager" #: gajim/common/helpers.py:465 msgid "Visitors" msgstr "Besøgende" #: gajim/common/helpers.py:467 msgid "Visitor" msgstr "Besøgende" #: gajim/common/helpers.py:518 msgid "is paying attention to the conversation" msgstr "er opmærksom på samtalen" #: gajim/common/helpers.py:520 msgid "is doing something else" msgstr "gør noget andet" #: gajim/common/helpers.py:522 #, fuzzy msgid "is composing a message…" msgstr "komponerer en besked..." #: gajim/common/helpers.py:525 msgid "paused composing a message" msgstr "holder pause med at komponere en besked" #: gajim/common/helpers.py:527 msgid "has closed the chat window or tab" msgstr "har lukket samtalevinduet eller fanebladet" #: gajim/common/helpers.py:754 #, python-format msgid "%s GiB" msgstr "%s GiB" #: gajim/common/helpers.py:757 #, python-format msgid "%s GB" msgstr "%s GB" #: gajim/common/helpers.py:761 #, python-format msgid "%s MiB" msgstr "%s MiB" #: gajim/common/helpers.py:764 #, python-format msgid "%s MB" msgstr "%s MB" #: gajim/common/helpers.py:768 #, python-format msgid "%s KiB" msgstr "%s KiB" #: gajim/common/helpers.py:771 #, python-format msgid "%s KB" msgstr "%s KB" #: gajim/common/helpers.py:774 #, python-format msgid "%s B" msgstr "%s B" #: gajim/common/helpers.py:1141 gajim/common/helpers.py:1148 #, python-format msgid "%d message pending" msgid_plural "%d messages pending" msgstr[0] "%d besked venter" msgstr[1] "%d beskeder venter" #: gajim/common/helpers.py:1155 #, fuzzy, python-format msgid "from room %s" msgstr "fra rum %s" #: gajim/common/helpers.py:1158 gajim/common/helpers.py:1175 #, fuzzy, python-format msgid "from user %s" msgstr "fra bruger %s" #: gajim/common/helpers.py:1160 #, fuzzy, python-format msgid "from %s" msgstr " fra %s" #: gajim/common/helpers.py:1167 gajim/common/helpers.py:1173 #, python-format msgid "%d event pending" msgid_plural "%d events pending" msgstr[0] "%d hændelse venter" msgstr[1] "%d hændelser venter" #: gajim/common/helpers.py:1191 gajim/common/helpers.py:1203 #: gajim/data/gui/roster_window.ui:85 data/org.gajim.Gajim.desktop.in:4 #: data/org.gajim.Gajim.appdata.xml.in:9 msgid "Gajim" msgstr "Gajim" #: gajim/common/helpers.py:1205 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" #: gajim/common/helpers.py:1392 gajim/data/gui/add_new_contact_window.ui:24 msgid "I would like to add you to my contact list." msgstr "Jeg vil gerne tilføje dig til min kontakt liste." #: gajim/common/helpers.py:1394 msgid "Hello, I am $name." msgstr "" #: gajim/common/helpers.py:1508 gajim/common/helpers.py:1517 #: gajim/common/helpers.py:1576 msgid "Timeout loading image" msgstr "Tidsudløb nået for at laste billede" #: gajim/common/helpers.py:1527 gajim/common/helpers.py:1574 msgid "Image is too big" msgstr "Billede er for stort" #: gajim/common/helpers.py:1538 #, fuzzy msgid "PyCURL is not installed" msgstr "CRL er endnu ikke gyldigt" #: gajim/common/helpers.py:1578 #, fuzzy msgid "Error loading image" msgstr "Tidsudløb nået for at laste billede" #: gajim/common/connection_handlers.py:133 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "Registrerings information for transporten %s har ikke ankommet i tide" #: gajim/common/connection_handlers.py:979 msgid "This message was encrypted with OTR and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:982 msgid "" "This message was encrypted with Legacy OpenPGP and could not be decrypted. " "You can install the PGP plugin to handle those messages." msgstr "" #: gajim/common/connection_handlers.py:986 msgid "" "This message was encrypted with OpenPGP for XMPP and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:992 #, python-format msgid "This message was encrypted with %s and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:1060 msgid "message" msgstr "besked" #: gajim/common/connection_handlers.py:1863 msgid "I would like to add you to my roster." msgstr "Jeg vil gerne tilføje dig til min kontaktliste." #: gajim/common/exceptions.py:46 #, fuzzy, python-format msgid "" "The database file (%s) cannot be read. Try to repair it (see https://dev." "gajim.org/gajim/gajim/wikis/help/DatabaseBackup) or remove it (all history " "will be lost)." msgstr "" "Database filen (%s) kan ikke læses. Prøv at reparere den (se http://trac." "gajim.org/wiki/DatabaseBackup) eller fjerne den (hele historikken vil tabes)." #: gajim/common/exceptions.py:60 msgid "Service not available: Gajim is not running, or remote_control is False" msgstr "" "Tjeneste ikke tilgængelig: Gajim kører ikke, eller remote_control er Falsk" #: gajim/common/exceptions.py:82 #, fuzzy, python-format msgid "" "Session bus is not available.\n" "Try reading %(url)s" msgstr "" "Sessions bussen er ikke tilgængelig.\n" "Prøv at læse http://trac.gajim.org/wiki/GajimDBus" #: gajim/common/exceptions.py:94 #, fuzzy, python-format msgid "" "System bus is not available.\n" "Try reading %(url)s" msgstr "" "Sessions bussen er ikke tilgængelig.\n" "Prøv at læse http://trac.gajim.org/wiki/GajimDBus" #: gajim/common/zeroconf/connection_zeroconf.py:193 msgid "Please check if Avahi or Bonjour is installed." msgstr "Kontroller venligst om Avahi eller Bonjour er installeret." #: gajim/common/zeroconf/connection_zeroconf.py:203 #: gajim/common/zeroconf/connection_zeroconf.py:207 msgid "Could not start local service" msgstr "Kunne ikke starte lokal tjeneste" #: gajim/common/zeroconf/connection_zeroconf.py:204 #, python-format msgid "Unable to bind to port %d." msgstr "Ikke i stand til at tildele port %d." #: gajim/common/zeroconf/connection_zeroconf.py:208 #: gajim/common/zeroconf/connection_zeroconf.py:293 #: gajim/common/zeroconf/connection_zeroconf.py:306 #: gajim/common/zeroconf/connection_zeroconf.py:322 msgid "Please check if avahi-daemon is running." msgstr "Kontroller venligst om avahi-dæmonen kører." #: gajim/common/zeroconf/connection_zeroconf.py:292 #: gajim/common/zeroconf/connection_zeroconf.py:305 #: gajim/common/zeroconf/connection_zeroconf.py:321 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Kunne ikke ændre status på kontoen \"%s\"" #: gajim/common/zeroconf/connection_zeroconf.py:337 msgid "Your message could not be sent." msgstr "Din besked kunne ikke sendes." #: gajim/common/zeroconf/connection_zeroconf.py:352 msgid "Contact is offline. Your message could not be sent." msgstr "Kontakt er afkoblet. Din besked kunne ikke sendes." #: gajim/common/zeroconf/connection_zeroconf.py:374 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "" "Tilslutning til vært kunne ikke etableres: Tidsudløb mens data var blevet " "sendt." #: gajim/common/zeroconf/zeroconf_bonjour.py:197 #: gajim/common/zeroconf/zeroconf_avahi.py:220 #, python-format msgid "Error while adding service. %s" msgstr "Fejl ved tilføjelse af tjeneste. %s" #: gajim/data/gui/blocked_contacts_window.ui:13 msgid "Blocked Contacts" msgstr "Blokerede Kontakter" #: gajim/data/gui/advanced_configuration_window.ui:13 msgid "Advanced Configuration Editor" msgstr "Avanceret Konfigurations Behandler" #: gajim/data/gui/advanced_configuration_window.ui:35 msgid "Filter:" msgstr "Filter:" #: gajim/data/gui/advanced_configuration_window.ui:107 #: gajim/data/gui/features_window.ui:111 msgid "Description" msgstr "Beskrivelse" #: gajim/data/gui/advanced_configuration_window.ui:136 msgid "NOTE: You should restart Gajim for some settings to take effect" msgstr "" "NOTE: Du skal genstarte Gajim for at nogle af ændringerne kan træde i " "kraft" #: gajim/data/gui/advanced_configuration_window.ui:161 #, fuzzy msgid "_Reset to default" msgstr "_Nulstil til Standard Farver" #: gajim/data/gui/join_groupchat_window.ui:34 #, fuzzy msgid "Bookmark this Groupchat" msgstr "Bogmærk dette rom" #: gajim/data/gui/join_groupchat_window.ui:51 msgid "Join this Groupchat everytime Gajim is started" msgstr "" #: gajim/data/gui/join_groupchat_window.ui:69 #, fuzzy msgid "Bookmark" msgstr "_Bogmærke" #: gajim/data/gui/join_groupchat_window.ui:82 #, fuzzy msgid "Autojoin" msgstr "Bliv automatisk med" #: gajim/data/gui/join_groupchat_window.ui:119 msgid "Account" msgstr "Konto" #: gajim/data/gui/join_groupchat_window.ui:226 #, fuzzy msgid "Room" msgstr "Rum:" #: gajim/data/gui/join_groupchat_window.ui:238 #, fuzzy msgid "Recently" msgstr "For nylig:" #: gajim/data/gui/join_groupchat_window.ui:290 msgid "Search the rooms on this server" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:12 #, fuzzy msgid "HTTP Connect" msgstr "" "HTTP Tilslutning\n" "SOCKS5\n" "BOSH" #: gajim/data/gui/manage_proxies_window.ui:15 msgid "SOCKS5" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:18 msgid "BOSH" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:25 msgid "Manage Proxy Profiles" msgstr "Håndter Proxy Profiler" #: gajim/data/gui/manage_proxies_window.ui:148 msgid "_Name:" msgstr "_Navn:" #: gajim/data/gui/manage_proxies_window.ui:161 msgid "_Type:" msgstr "_Type:" #: gajim/data/gui/manage_proxies_window.ui:205 msgid "Properties" msgstr "Egenskaber" #: gajim/data/gui/manage_proxies_window.ui:234 msgid "_BOSH URL:" msgstr "_BOSH URL:" #: gajim/data/gui/manage_proxies_window.ui:258 msgid "Proxy _Host:" msgstr "Proxy _vært:" #: gajim/data/gui/manage_proxies_window.ui:269 msgid "Use HTTP prox_y" msgstr "Brug HTTP prox_y" #: gajim/data/gui/manage_proxies_window.ui:288 msgid "Proxy _Port:" msgstr "Proxy _Port:" #: gajim/data/gui/manage_proxies_window.ui:299 msgid "Use proxy auth_entication" msgstr "Brug proxy godkendelse" #: gajim/data/gui/manage_proxies_window.ui:318 msgid "_Username:" msgstr "_Brugernavn:" #: gajim/data/gui/manage_proxies_window.ui:331 msgid "Pass_word:" msgstr "Adgangs_kode" #: gajim/data/gui/manage_proxies_window.ui:391 msgid "Settings" msgstr "Opsætning" #: gajim/data/gui/change_password_dialog.ui:89 msgid "Enter new password:" msgstr "Skriv en ny adgangskode:" #: gajim/data/gui/change_password_dialog.ui:115 msgid "Enter it again for confirmation:" msgstr "Skriv adgangskoden igen for at bekræfte:" #: gajim/data/gui/zeroconf_information_window.ui:8 #: gajim/data/gui/vcard_information_window.ui:8 msgid "Contact Information" msgstr "Kontakt Information" #: gajim/data/gui/zeroconf_information_window.ui:54 msgid "Local jid:" msgstr "Lokal jid:" #: gajim/data/gui/zeroconf_information_window.ui:67 #: gajim/data/gui/tooltip_roster_contact.ui:55 #: gajim/data/gui/tooltip_gc_contact.ui:75 msgid "Resource:" msgstr "Resource:" #: gajim/data/gui/zeroconf_information_window.ui:80 #: gajim/data/gui/tooltip_roster_contact.ui:110 msgid "Status:" msgstr "Status:" #: gajim/data/gui/zeroconf_information_window.ui:89 #: gajim/data/gui/history_window.ui:290 msgid "_Log conversation history" msgstr "_Log samtale historie" #: gajim/data/gui/zeroconf_information_window.ui:215 #: gajim/data/gui/vcard_information_window.ui:360 msgid "Contact" msgstr "Kontakt" #: gajim/data/gui/zeroconf_information_window.ui:234 msgid "First Name:" msgstr "Fornavn:" #: gajim/data/gui/zeroconf_information_window.ui:247 msgid "Last Name:" msgstr "Efternavn:" #: gajim/data/gui/zeroconf_information_window.ui:260 #: gajim/data/gui/archiving_313_preferences_item.ui:84 #: gajim/data/gui/tooltip_roster_contact.ui:30 #: gajim/data/gui/tooltip_gc_contact.ui:50 msgid "Jabber ID:" msgstr "Jabber ID:" #: gajim/data/gui/zeroconf_information_window.ui:273 msgid "E-Mail:" msgstr "Epost:" #: gajim/data/gui/zeroconf_information_window.ui:354 msgid "Personal" msgstr "Personlig" #: gajim/data/gui/gc_occupants_menu.ui:12 msgid "_Send Private Message" msgstr "_Send en Privat Besked" #: gajim/data/gui/gc_occupants_menu.ui:21 msgid "Send _File" msgstr "Send _Fil" #: gajim/data/gui/gc_occupants_menu.ui:29 msgid "Occupant Actions" msgstr "Beboer Handlinger" #: gajim/data/gui/gc_occupants_menu.ui:38 msgid "_Voice" msgstr "_Stemme" #: gajim/data/gui/gc_occupants_menu.ui:46 msgid "Mo_derator" msgstr "Or_dstyrer" #: gajim/data/gui/gc_occupants_menu.ui:60 msgid "_Member" msgstr "_Medlem" #: gajim/data/gui/gc_occupants_menu.ui:68 msgid "_Admin" msgstr "_Administrator" #: gajim/data/gui/gc_occupants_menu.ui:76 msgid "_Owner" msgstr "_Ejer" #: gajim/data/gui/gc_occupants_menu.ui:90 msgid "_Kick" msgstr "_Kast ud" #: gajim/data/gui/gc_occupants_menu.ui:98 msgid "_Ban" msgstr "_Udvis" #: gajim/data/gui/gc_occupants_menu.ui:124 msgid "_Add to Roster" msgstr "_Tilføj til Kontaktliste" #: gajim/data/gui/gc_occupants_menu.ui:132 #, fuzzy msgid "_Execute command" msgstr "_Kør Kommando" #: gajim/data/gui/archiving_313_preferences_item.ui:12 #: gajim/data/gui/preferences_window.ui:102 #: gajim/data/gui/preferences_window.ui:153 #: gajim/data/gui/archiving_313_preferences_window.ui:25 #, fuzzy msgid "Always" msgstr "Borte" #: gajim/data/gui/archiving_313_preferences_item.ui:15 #: gajim/data/gui/preferences_window.ui:96 #: gajim/data/gui/preferences_window.ui:156 #: gajim/data/gui/archiving_313_preferences_window.ui:31 #, fuzzy msgid "Never" msgstr "Server" #: gajim/data/gui/archiving_313_preferences_item.ui:96 #, fuzzy msgid "Preference:" msgstr "Indstillinger" #: gajim/data/gui/tooltip_roster_contact.ui:125 #, fuzzy msgid "Idle since:" msgstr " siden %s" #: gajim/data/gui/tooltip_roster_contact.ui:151 #: gajim/data/gui/change_status_message_dialog.ui:191 msgid "Mood:" msgstr "Humør:" #: gajim/data/gui/tooltip_roster_contact.ui:164 #: gajim/data/gui/change_status_message_dialog.ui:179 msgid "Activity:" msgstr "Aktivitet:" #: gajim/data/gui/tooltip_roster_contact.ui:178 #, fuzzy msgid "Tune:" msgstr "Melodi:" #: gajim/data/gui/tooltip_roster_contact.ui:191 #, fuzzy msgid "Location:" msgstr "Påmindelse" #: gajim/data/gui/tooltip_roster_contact.ui:255 #, fuzzy msgid "OpenPGP:" msgstr "OpenPGP: " #: gajim/data/gui/tooltip_roster_contact.ui:281 #, fuzzy msgid "Subscription:" msgstr "Abonnering: " #: gajim/data/gui/zeroconf_context_menu.ui:11 #: gajim/data/gui/account_context_menu.ui:11 msgid "_Status" msgstr "_Status" #: gajim/data/gui/zeroconf_context_menu.ui:26 #: gajim/data/gui/account_context_menu.ui:79 msgid "_Modify Account..." msgstr "_Ændre Konto" #: gajim/data/gui/atom_entry_window.ui:8 msgid "New entry received" msgstr "Ny hændelse modtaget" #: gajim/data/gui/atom_entry_window.ui:92 msgid "Feed name:" msgstr "Feed navn:" #: gajim/data/gui/atom_entry_window.ui:119 msgid "Entry:" msgstr "Indgang:" #: gajim/data/gui/atom_entry_window.ui:131 msgid "Last modified:" msgstr "Sidst ændret:" #: gajim/data/gui/atom_entry_window.ui:196 msgid "Next entry" msgstr "" #: gajim/data/gui/gc_control_popup_menu.ui:11 msgid "Change _Nickname..." msgstr "Ændre _Kælenavn..." #: gajim/data/gui/gc_control_popup_menu.ui:20 msgid "_Manage Room" msgstr "Håndter Ru_m" #: gajim/data/gui/gc_control_popup_menu.ui:31 msgid "Change _Subject..." msgstr "Ændre _Emne..." #: gajim/data/gui/gc_control_popup_menu.ui:38 msgid "Configure _Room..." msgstr "Tilpas _Rum..." #: gajim/data/gui/gc_control_popup_menu.ui:52 msgid "_Destroy Room" msgstr "_Slet rum" #: gajim/data/gui/gc_control_popup_menu.ui:64 msgid "_Minimize on close" msgstr "_Minimer ved lukning" #: gajim/data/gui/gc_control_popup_menu.ui:85 #, fuzzy msgid "_Request Voice" msgstr "_Stemme" #: gajim/data/gui/profile_window.ui:7 msgid "Personal Information" msgstr "Personlig Information" #: gajim/data/gui/profile_window.ui:35 #: gajim/data/gui/vcard_information_window.ui:382 msgid "Name:" msgstr "Navn:" #: gajim/data/gui/profile_window.ui:59 #: gajim/data/gui/vcard_information_window.ui:410 msgid "Nickname:" msgstr "Kælenavn:" #. Family Name #: gajim/data/gui/profile_window.ui:94 #: gajim/data/gui/vcard_information_window.ui:740 msgid "Family:" msgstr "Efternavn:" #. Given Name #: gajim/data/gui/profile_window.ui:118 #: gajim/data/gui/vcard_information_window.ui:822 msgid "Given:" msgstr "Fornavn:" #. Middle Name #: gajim/data/gui/profile_window.ui:142 #: gajim/data/gui/vcard_information_window.ui:753 msgid "Middle:" msgstr "Mellemnavn:" #. Prefix in Name #: gajim/data/gui/profile_window.ui:156 #: gajim/data/gui/vcard_information_window.ui:766 msgid "Prefix:" msgstr "Titel:" #. Suffix in Name #: gajim/data/gui/profile_window.ui:190 #: gajim/data/gui/vcard_information_window.ui:835 msgid "Suffix:" msgstr "Endetillæg:" #: gajim/data/gui/profile_window.ui:222 #: gajim/data/gui/vcard_information_window.ui:878 msgid "Full Name" msgstr "Fuldt Navn" #: gajim/data/gui/profile_window.ui:250 gajim/data/gui/profile_window.ui:724 #: gajim/data/gui/vcard_information_window.ui:454 #: gajim/data/gui/vcard_information_window.ui:1087 msgid "Street:" msgstr "Gade:" #: gajim/data/gui/profile_window.ui:274 gajim/data/gui/profile_window.ui:748 #: gajim/data/gui/vcard_information_window.ui:535 #: gajim/data/gui/vcard_information_window.ui:1126 msgid "Extra Address:" msgstr "Ekstra Adresse:" #: gajim/data/gui/profile_window.ui:298 gajim/data/gui/profile_window.ui:772 #: gajim/data/gui/vcard_information_window.ui:467 #: gajim/data/gui/vcard_information_window.ui:1100 msgid "City:" msgstr "By:" #: gajim/data/gui/profile_window.ui:322 gajim/data/gui/profile_window.ui:796 #: gajim/data/gui/vcard_information_window.ui:548 #: gajim/data/gui/vcard_information_window.ui:1140 msgid "Postal Code:" msgstr "Postnummer:" #: gajim/data/gui/profile_window.ui:346 gajim/data/gui/profile_window.ui:820 #: gajim/data/gui/vcard_information_window.ui:480 #: gajim/data/gui/vcard_information_window.ui:1113 msgid "State:" msgstr "Stat:" #: gajim/data/gui/profile_window.ui:370 gajim/data/gui/profile_window.ui:844 #: gajim/data/gui/vcard_information_window.ui:561 #: gajim/data/gui/vcard_information_window.ui:1153 msgid "Country:" msgstr "Land:" #: gajim/data/gui/profile_window.ui:396 gajim/data/gui/profile_window.ui:870 #: gajim/data/gui/vcard_information_window.ui:618 #: gajim/data/gui/vcard_information_window.ui:1253 msgid "Address" msgstr "Adresse" #: gajim/data/gui/profile_window.ui:413 #: gajim/data/gui/vcard_information_window.ui:635 msgid "Homepage:" msgstr "Hjemmeside:" #: gajim/data/gui/profile_window.ui:437 gajim/data/gui/profile_window.ui:887 #: gajim/data/gui/vcard_information_window.ui:648 #: gajim/data/gui/vcard_information_window.ui:1270 msgid "E-Mail:" msgstr "E-post:" #: gajim/data/gui/profile_window.ui:462 gajim/data/gui/profile_window.ui:912 #: gajim/data/gui/vcard_information_window.ui:661 #: gajim/data/gui/vcard_information_window.ui:1283 msgid "Phone No.:" msgstr "Telefonnr.:" #: gajim/data/gui/profile_window.ui:497 msgid "Avatar:" msgstr "Avatar:" #: gajim/data/gui/profile_window.ui:540 msgid "Click to set your avatar" msgstr "Tryk for at se din avatar" #: gajim/data/gui/profile_window.ui:566 #: gajim/data/gui/vcard_information_window.ui:702 msgid "Format: YYYY-MM-DD" msgstr "Format: YYYY-MM-DD" #: gajim/data/gui/profile_window.ui:574 #: gajim/data/gui/vcard_information_window.ui:708 msgid "Birthday:" msgstr "Fødselsdag:" #: gajim/data/gui/profile_window.ui:598 #: gajim/data/gui/vcard_information_window.ui:937 msgid "Personal Info" msgstr "Personlig Information" #: gajim/data/gui/profile_window.ui:617 #: gajim/data/gui/vcard_information_window.ui:960 msgid "Company:" msgstr "Firma:" #: gajim/data/gui/profile_window.ui:641 #: gajim/data/gui/vcard_information_window.ui:990 msgid "Department:" msgstr "Afdeling:" #: gajim/data/gui/profile_window.ui:665 #: gajim/data/gui/vcard_information_window.ui:1018 msgid "Position:" msgstr "Stilling:" #: gajim/data/gui/profile_window.ui:689 #: gajim/data/gui/vcard_information_window.ui:1045 msgid "Role:" msgstr "Rolle:" #: gajim/data/gui/profile_window.ui:947 #: gajim/data/gui/vcard_information_window.ui:1336 msgid "Work" msgstr "Arbejde" #. "About" is the text of a tab of vcard window #: gajim/data/gui/profile_window.ui:979 #: gajim/data/gui/vcard_information_window.ui:1368 #: gajim/data/gui/application_menu.ui:62 msgid "About" msgstr "Om" #: gajim/data/gui/filetransfers.ui:20 #, fuzzy msgid "Con_tinue" msgstr "_Fortsæt" #: gajim/data/gui/filetransfers.ui:28 gajim/data/gui/filetransfers.ui:156 msgid "_Pause" msgstr "_Pause" #: gajim/data/gui/filetransfers.ui:36 gajim/data/gui/filetransfers.ui:174 #: gajim/data/gui/service_registration_window.ui:53 msgid "_Cancel" msgstr "_Afbryd" #: gajim/data/gui/filetransfers.ui:50 msgid "_Open Containing Folder" msgstr "_Åbn folderen med filen" #: gajim/data/gui/filetransfers.ui:79 gajim/data/gui/filetransfers.ui:253 msgid "File Transfers" msgstr "Filoverførsler" #: gajim/data/gui/filetransfers.ui:110 msgid "file transfers list" msgstr "filoverførsel liste" #: gajim/data/gui/filetransfers.ui:111 msgid "A list of active, completed and stopped file transfers" msgstr "En liste over aktive, færdige og stoppede filoverførsler" #: gajim/data/gui/filetransfers.ui:131 msgid "Clean _up" msgstr "Ryd _op" #: gajim/data/gui/filetransfers.ui:137 msgid "Removes completed, cancelled and failed file transfers from the list" msgstr "Fjerner færdige, annullerede og mislykkede filoverførsler fra listen" #: gajim/data/gui/filetransfers.ui:143 msgid "Remove file transfer from the list." msgstr "Fjern filoverførsler fra listen." #: gajim/data/gui/filetransfers.ui:144 msgid "" "This action removes single file transfer from the list. If the transfer is " "active, it is first stopped and then removed" msgstr "" "Denne handling fjerner en enkelt filoverførsel fra listen. Hvis overførslen " "er i gang, bliver den først stoppet og derefter fjernet" #: gajim/data/gui/filetransfers.ui:180 #, fuzzy msgid "Cancels the selected file transfer and removes incomplete files" msgstr "Annullerer den valgte filoverførsel og fjerner den ikke fuldførte fil" #: gajim/data/gui/filetransfers.ui:186 msgid "Cancel file transfer" msgstr "Annuller filoverførsel" #: gajim/data/gui/filetransfers.ui:187 msgid "Cancels the selected file transfer" msgstr "Annullerer den valgte filoverførsel" #: gajim/data/gui/filetransfers.ui:199 #, fuzzy msgid "_Close" msgstr "_Send & Luk" #: gajim/data/gui/filetransfers.ui:205 msgid "Hides the window" msgstr "Skjuler vinduet" #: gajim/data/gui/filetransfers.ui:226 msgid "_Notify me when a file transfer is complete" msgstr "_Påmind mig når en filoverførsel er færdig" #: gajim/data/gui/filetransfers.ui:236 msgid "When a file transfer is complete show a popup notification" msgstr "Når en filoverførsel er færdig, vis en pop op påmindelse" #: gajim/data/gui/filetransfers.ui:254 msgid "Shows a list of file transfers between you and others" msgstr "Viser en liste over filoverførsler mellem dig og andre" #: gajim/data/gui/service_registration_window.ui:18 msgid "Register to" msgstr "Registrer til" #: gajim/data/gui/service_registration_window.ui:70 #: gajim/data/gui/roster_item_exchange_window.ui:126 msgid "_OK" msgstr "_OK" #: gajim/data/gui/groupchat_control.ui:13 gajim/data/gui/chat_control.ui:293 #: gajim/data/gui/gajim_themes_window.ui:264 msgid "Bold" msgstr "Fed" #: gajim/data/gui/groupchat_control.ui:22 gajim/data/gui/chat_control.ui:302 #: gajim/data/gui/gajim_themes_window.ui:284 msgid "Italic" msgstr "Kursiv" #: gajim/data/gui/groupchat_control.ui:31 gajim/data/gui/chat_control.ui:311 msgid "Underline" msgstr "Understregning" #: gajim/data/gui/groupchat_control.ui:40 gajim/data/gui/chat_control.ui:320 msgid "Strike" msgstr "Streg" #: gajim/data/gui/groupchat_control.ui:62 gajim/data/gui/chat_control.ui:342 msgid "Font" msgstr "Font" #: gajim/data/gui/groupchat_control.ui:76 gajim/data/gui/chat_control.ui:356 #, fuzzy msgid "Clear formatting" msgstr "Fjern formatering" #: gajim/data/gui/groupchat_control.ui:283 gajim/data/gui/chat_control.ui:805 #, fuzzy msgid "Choose an encryption" msgstr "Vælg en Fil at Sende..." #: gajim/data/gui/groupchat_control.ui:329 gajim/data/gui/chat_control.ui:853 msgid "Show a list of emoticons (Alt+M)" msgstr "Hvis en liste over følelsesikoner (Alt+M)" #: gajim/data/gui/popup_notification_window.ui:55 #, fuzzy msgid "Event Type" msgstr "Hændelse" #: gajim/data/gui/popup_notification_window.ui:100 #, fuzzy msgid "Event desc" msgstr "Hændelse" #: gajim/data/gui/chat_control.ui:41 #, fuzzy msgid "1" msgstr "Skrifttype" #: gajim/data/gui/chat_control.ui:63 #, fuzzy msgid "2 abc" msgstr "Skrifttype" #: gajim/data/gui/chat_control.ui:84 #, fuzzy msgid "3 def" msgstr "Skrifttype" #: gajim/data/gui/chat_control.ui:105 #, fuzzy msgid "4 ghi" msgstr "Skrifttype" #: gajim/data/gui/chat_control.ui:126 #, fuzzy msgid "5 jkl" msgstr "Skrifttype" #: gajim/data/gui/chat_control.ui:147 #, fuzzy msgid "6 mno" msgstr "Skrifttype" #: gajim/data/gui/chat_control.ui:167 msgid "7 pqrs" msgstr "" #: gajim/data/gui/chat_control.ui:188 #, fuzzy msgid "8 tuv" msgstr "Skrifttype" #: gajim/data/gui/chat_control.ui:209 msgid "9 wxyz" msgstr "" #: gajim/data/gui/chat_control.ui:229 #, fuzzy msgid "*" msgstr "Skrifttype" #: gajim/data/gui/chat_control.ui:249 #, fuzzy msgid "0" msgstr "Skrifttype" #: gajim/data/gui/chat_control.ui:269 #, fuzzy msgid "#" msgstr "Skrifttype" #: gajim/data/gui/chat_control.ui:729 msgid "#" msgstr "#" #: gajim/data/gui/vcard_information_window.ui:55 msgid "Jabber ID:" msgstr "Jabber ID:" #: gajim/data/gui/vcard_information_window.ui:69 msgid "Resource:" msgstr "Ressource:" #: gajim/data/gui/vcard_information_window.ui:83 msgid "Status:" msgstr "Status:" #: gajim/data/gui/vcard_information_window.ui:97 msgid "Client:" msgstr "Klient:" #: gajim/data/gui/vcard_information_window.ui:111 msgid "System:" msgstr "System:" #: gajim/data/gui/vcard_information_window.ui:125 msgid "Contact time:" msgstr "Kontakt tid:" #: gajim/data/gui/vcard_information_window.ui:222 #, fuzzy msgid "User avatar:" msgstr "Avatar:" #: gajim/data/gui/vcard_information_window.ui:234 #, fuzzy msgid "Configured avatar:" msgstr "Konfigureret avatar:" #. Given Name #: gajim/data/gui/vcard_information_window.ui:263 msgid "Ask:" msgstr "Spørg:" #. Family Name #: gajim/data/gui/vcard_information_window.ui:277 msgid "Subscription:" msgstr "Abonnering:" #: gajim/data/gui/vcard_information_window.ui:893 #: gajim/data/gui/vcard_information_window.ui:912 #: gajim/data/gui/vcard_information_window.ui:1310 msgid "button" msgstr "" #: gajim/data/gui/vcard_information_window.ui:1398 msgid "Comments" msgstr "Kommentarer" #: gajim/data/gui/gajim_themes_window.ui:12 #, fuzzy msgid "Account row" msgstr "Konto" #: gajim/data/gui/gajim_themes_window.ui:15 #, fuzzy msgid "Group row" msgstr "Gruppe" #: gajim/data/gui/gajim_themes_window.ui:18 #, fuzzy msgid "Contact row" msgstr "Kontakt" #: gajim/data/gui/gajim_themes_window.ui:21 msgid "Chat Banner" msgstr "" #: gajim/data/gui/gajim_themes_window.ui:28 msgid "Gajim Themes Customization" msgstr "Gajim Tema Tilpasning" #: gajim/data/gui/gajim_themes_window.ui:157 msgid "Text _color:" msgstr "Tekst _farve:" #: gajim/data/gui/gajim_themes_window.ui:173 msgid "_Background:" msgstr "_Baggrund:" #: gajim/data/gui/gajim_themes_window.ui:189 msgid "Text _font:" msgstr "Tekst _font:" #: gajim/data/gui/gajim_themes_window.ui:207 msgid "Font style:" msgstr "Font stil:" #: gajim/data/gui/gajim_themes_window.ui:375 msgid "Composing" msgstr "Komponere" #: gajim/data/gui/gajim_themes_window.ui:387 msgid "Paused" msgstr "Sat på pause" #: gajim/data/gui/gajim_themes_window.ui:399 msgid "Gone" msgstr "Borte" #: gajim/data/gui/gajim_themes_window.ui:411 msgid "" "MUC\n" "Messages" msgstr "" "MUC\n" "Beskeder" #: gajim/data/gui/gajim_themes_window.ui:424 msgid "" "MUC Directed\n" "Messages" msgstr "" "MUC Sendte\n" "Meldinger" #: gajim/data/gui/gajim_themes_window.ui:510 msgid "Chatstate Tab Colors" msgstr "Samtalestatus Fane Farver" #: gajim/data/gui/preferences_window.ui:48 msgid "Use default applications" msgstr "" #: gajim/data/gui/preferences_window.ui:51 #, fuzzy msgid "Custom" msgstr "Tilpasset Opsætning" #: gajim/data/gui/preferences_window.ui:62 #: gajim/data/gui/preferences_window.ui:79 #, fuzzy msgid "All chat states" msgstr "Status For Alle" #: gajim/data/gui/preferences_window.ui:65 #: gajim/data/gui/preferences_window.ui:82 #, fuzzy msgid "Composing only" msgstr "Komponere" #: gajim/data/gui/preferences_window.ui:99 #, fuzzy msgid "Only when pending events" msgstr "" "Aldrig\n" "Kun ved ventende hændelser\n" "Altid" #: gajim/data/gui/preferences_window.ui:113 msgid "Pop it up" msgstr "" #: gajim/data/gui/preferences_window.ui:116 #, fuzzy msgid "Notify me about it" msgstr "Påmind mig om kontakter som logger u_d" #: gajim/data/gui/preferences_window.ui:119 #, fuzzy msgid "Show only in roster" msgstr "_Vis hændelse i kontaktvindue" #: gajim/data/gui/preferences_window.ui:130 msgid "Detached roster with detached chats" msgstr "" #: gajim/data/gui/preferences_window.ui:133 msgid "Detached roster with single chat" msgstr "" #: gajim/data/gui/preferences_window.ui:136 msgid "Single window for everything" msgstr "" #: gajim/data/gui/preferences_window.ui:139 msgid "Detached roster with chat grouped by account" msgstr "" #: gajim/data/gui/preferences_window.ui:142 msgid "Detached roster with chat grouped by type" msgstr "" #: gajim/data/gui/preferences_window.ui:159 #, fuzzy msgid "Last state" msgstr "Sidste status: %s" #: gajim/data/gui/preferences_window.ui:195 #: gajim/data/gui/application_menu.ui:94 gajim/data/gui/shortcuts_window.ui:188 msgid "Preferences" msgstr "Indstillinger" #: gajim/data/gui/preferences_window.ui:237 msgid "Display a_vatars of contacts in roster" msgstr "Vis kontakternes a_vatarer i kontaktvinduet" #: gajim/data/gui/preferences_window.ui:241 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" msgstr "" "Hvis valgt vil Gajim vise avatarer af kontakter i kontaktvinduet og i gruppe " "samtaler" #: gajim/data/gui/preferences_window.ui:255 msgid "Display status _messages of contacts in roster" msgstr "Vis status _beskeder for kontakter i kontaktvinduet" #: gajim/data/gui/preferences_window.ui:259 #, fuzzy msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name, in roster window and in group chats" msgstr "" "Hvis valgt vil Gajim vise status beskeder af kontakter under kontaktnavnet i " "kontaktvinduet og i gruppe samtaler" #: gajim/data/gui/preferences_window.ui:273 #, fuzzy msgid "Display e_xtra information of contacts in roster (mood, activity, ...)" msgstr "Vis kontakternes humør i kontaktvinduet" #: gajim/data/gui/preferences_window.ui:277 msgid "" "If checked, Gajim will display the mood of contacts in the roster window" msgstr "Hvis valgt vil Gajim vise kontakternes humør i kontaktvinduet" #: gajim/data/gui/preferences_window.ui:298 msgid "Sort contacts by status" msgstr "Sorter kontakter efter status" #: gajim/data/gui/preferences_window.ui:308 msgid "in _roster" msgstr "i _kontaktvinduet" #: gajim/data/gui/preferences_window.ui:325 msgid "in _group chats" msgstr "i _gruppe samtaler" #: gajim/data/gui/preferences_window.ui:354 msgid "Roster Appearance" msgstr "Kontaktvinduets Udseende" #: gajim/data/gui/preferences_window.ui:384 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" msgstr "" "Hvis valgt vil Gajim erstatte tekst smileys som denne ':)' med den " "tilsvarende animerede eller statiske grafiske følelsesikon" #: gajim/data/gui/preferences_window.ui:390 msgid "_Emoticons:" msgstr "Føl_elsesikoner:" #: gajim/data/gui/preferences_window.ui:406 msgid "_Window behavior:" msgstr "_Vinduets adfærd:" #: gajim/data/gui/preferences_window.ui:420 msgid "_Show roster on startup:" msgstr "" #: gajim/data/gui/preferences_window.ui:431 msgid "_Ignore rich content in incoming messages" msgstr "_Ignorer rigt indhold i indkommende beskeder" #: gajim/data/gui/preferences_window.ui:435 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." msgstr "" "Nogle beskeder kan indeholde rigt indhold (formatering, farver osv.). Hvis " "valgt\n" "vil Gajim kun vise den rå tekst." #: gajim/data/gui/preferences_window.ui:449 msgid "_Highlight misspelled words" msgstr "Frem_hæv stavefejl" #: gajim/data/gui/preferences_window.ui:452 msgid "" "If checked, Gajim will highlight spelling errors in input fields of chat " "windows. If no language is explicitly set via right click on the input " "field, the default language will be used for this contact or group chat." msgstr "" "Hvis valgt vil Gajim fremhæve stavefejl i tekstbokse i samtale vinduet. Hvis " "intet sprog er valgt ved at højreklikke i indtastningsfeltet, vil standard " "sproget blive brugt for denne kontakt eller gruppe samtale." #: gajim/data/gui/preferences_window.ui:466 #, fuzzy msgid "Notify by icon when your messages are received" msgstr "Lyd som spilles når en hvilken som helst MUC besked ankommer." #: gajim/data/gui/preferences_window.ui:520 msgid "Show avatar in chat tabs" msgstr "" #: gajim/data/gui/preferences_window.ui:552 msgid "Chat Appearance" msgstr "Samtale udseende" #: gajim/data/gui/preferences_window.ui:607 msgid "When new event is received:" msgstr "Når en ny hændelse er modtaget:" #: gajim/data/gui/preferences_window.ui:645 msgid "Notify me about contacts that sign _in" msgstr "Påmind mig om kontakter logger _ind" #: gajim/data/gui/preferences_window.ui:663 msgid "Notify me about contacts that sign _out" msgstr "Påmind mig om kontakter som logger u_d" #: gajim/data/gui/preferences_window.ui:667 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" msgstr "" "Gajim vil påminde dig med et pop op vindue i højre bund af skærmen når en " "kontakt logger af" #: gajim/data/gui/preferences_window.ui:681 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" msgstr "" "Tillad pop op påmindelser når jeg er _borte/ikke tilgængelig/travel/usynlig" #: gajim/data/gui/preferences_window.ui:698 #, fuzzy msgid "Allow popup/notifications when a chat window is opened" msgstr "" "Tillad pop op påmindelser når jeg er _borte/ikke tilgængelig/travel/usynlig" #: gajim/data/gui/preferences_window.ui:722 msgid "Show notification area icon:" msgstr "" #: gajim/data/gui/preferences_window.ui:762 msgid "Visual Notifications" msgstr "Synlige Påmindelser" #: gajim/data/gui/preferences_window.ui:795 msgid "Play _sounds" msgstr "Afspil _lyde" #: gajim/data/gui/preferences_window.ui:812 #: gajim/data/gui/preferences_window.ui:1656 msgid "Ma_nage..." msgstr "Hå_ndtere..." #: gajim/data/gui/preferences_window.ui:834 msgid "Allow sound when I'm _busy" msgstr "Tillad lyde når jeg er o_ptaget" #: gajim/data/gui/preferences_window.ui:856 msgid "Sounds" msgstr "Lyde" #: gajim/data/gui/preferences_window.ui:877 msgid "Notifications" msgstr "Påmindelser" #: gajim/data/gui/preferences_window.ui:911 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " "display in chat windows." msgstr "" "Gajim kan sende og modtage meta-information relateret til en samtale du har " "med en kontakt. Her kan du specificere hvilke typer samtalestatus du vil " "vise i samtalevinduerne." #: gajim/data/gui/preferences_window.ui:916 msgid "_Display chat state notifications:" msgstr "Vis samtalestatus påmin_delser:" #: gajim/data/gui/preferences_window.ui:967 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " "send to the other party." msgstr "" "Gajim kan sende og modtage meta-information relateret til en samtale du har " "med en kontakt. Her kan du specificere hvilke typer samtalestatus du vil " "sende til modparten." #: gajim/data/gui/preferences_window.ui:972 msgid "_Send chat state notifications:" msgstr "_Send samtalestatus påmindelser:" #: gajim/data/gui/preferences_window.ui:990 msgid "Chat state notifications" msgstr "Samtalestatus påmindelser" #: gajim/data/gui/preferences_window.ui:1012 msgid "Personal Events" msgstr "Personlig Hændelser" #: gajim/data/gui/preferences_window.ui:1043 msgid "_Away after:" msgstr "_Væk efter:" #: gajim/data/gui/preferences_window.ui:1047 msgid "" "If checked, Gajim will change status to Away when the computer is unused." msgstr "" "Hvis valgt vil Gajim ændre status til Væk når computeren ikke bliver brugt." #: gajim/data/gui/preferences_window.ui:1060 msgid "_Not available after:" msgstr "Ikke tilgæ_ngelig efter:" #: gajim/data/gui/preferences_window.ui:1064 msgid "" "If checked, Gajim will change status to Not Available when the computer has " "not been used even longer" msgstr "" "Hvis valgt vil Gajim ændre status til Ikke Tilgængelig når computeren ikke " "har været brugt i endnu længere tid" #: gajim/data/gui/preferences_window.ui:1079 #: gajim/data/gui/preferences_window.ui:1091 msgid "minutes" msgstr "minutter" #: gajim/data/gui/preferences_window.ui:1103 msgid "" "The auto away status message. If empty, Gajim will not change the current " "status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-away timeout" msgstr "" "Den automatiske jeg er væk status besked. Hvis tom vil Gajim ikke ændre den " "nuværende status besked\n" "$S vil blive erstattet med den forrige status besked\n" "$T vil blive erstattet med auto-away tidsudløb" #: gajim/data/gui/preferences_window.ui:1117 msgid "" "The auto not available status message. If empty, Gajim will not change the " "current status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-not-available timeout" msgstr "" "Den automatiske jeg er ikke tilgængelig status besked. Hvis tom vil Gajim " "ikke ændre den nuværende status besked\n" "$S vil blive erstattet med den forrige status besked\n" "$T vil blive erstattet med auto-not-available timeout" #: gajim/data/gui/preferences_window.ui:1165 msgid "Auto Status" msgstr "Automatisk Status" #: gajim/data/gui/preferences_window.ui:1200 msgid "Ask status message when I:" msgstr "Spørg om status besked når jeg:" #: gajim/data/gui/preferences_window.ui:1215 msgid "Sign _in" msgstr "Logge _ind" #: gajim/data/gui/preferences_window.ui:1232 msgid "Sign _out" msgstr "Log _af" #: gajim/data/gui/preferences_window.ui:1265 msgid "" "If enabled, Gajim will not ask for a status message. The specified default " "message will be used instead." msgstr "" "Hvis aktiveret vil Gajim i spørge for en status besked. Den valgte standard " "besked vil blive brugt i stedet." #: gajim/data/gui/preferences_window.ui:1277 #: gajim/data/gui/preferences_window.ui:1479 msgid "Status" msgstr "Status" #: gajim/data/gui/preferences_window.ui:1288 msgid "Default Message" msgstr "Standard Besked" #: gajim/data/gui/preferences_window.ui:1303 msgid "Enabled" msgstr "Aktiveret" #: gajim/data/gui/preferences_window.ui:1329 msgid "Status Messages" msgstr "Status Beskeder" #: gajim/data/gui/preferences_window.ui:1459 msgid "Preset Status Messages" msgstr "Nuværende Status Beskeder" #: gajim/data/gui/preferences_window.ui:1512 msgid "Chat message:" msgstr "Samtale besked:" #: gajim/data/gui/preferences_window.ui:1537 msgid "Use system _default" msgstr "Brug system stan_dard" #: gajim/data/gui/preferences_window.ui:1560 msgid "Font" msgstr "Skrifttype" #: gajim/data/gui/preferences_window.ui:1590 msgid "T_heme:" msgstr "T_ema:" #: gajim/data/gui/preferences_window.ui:1603 msgid "Status _iconset:" msgstr "Status _ikonsæt:" #: gajim/data/gui/preferences_window.ui:1614 msgid "Use _transports icons" msgstr "Brug _transportens ikonsæt" #: gajim/data/gui/preferences_window.ui:1618 #, fuzzy msgid "" "If checked, Gajim will use protocol-specific status icons. (e.g. A contact " "from ICQ will have the equivalent ICQ icon for status online, away, busy, " "etc...)" msgstr "" "Hvis valgt vil Gajim bruge protokol specifikke status ikoner. (F.eks. En " "kontakt fra MSN vil have det tilsvarende msn ikon for status tilsluttet, " "borte, Travlt, etc...)" #: gajim/data/gui/preferences_window.ui:1660 msgid "Configure color and font of the interface" msgstr "Konfigurér farve og skrifttyper for brugergrænsefladen" #: gajim/data/gui/preferences_window.ui:1682 msgid "Themes" msgstr "Temaer" #: gajim/data/gui/preferences_window.ui:1712 #, fuzzy msgid "Contact's nickname:" msgstr "Kontakt navn" #: gajim/data/gui/preferences_window.ui:1726 #, fuzzy msgid "Contact's message:" msgstr "Samtale besked:" #: gajim/data/gui/preferences_window.ui:1738 msgid "_Status message:" msgstr "_Status besked:" #: gajim/data/gui/preferences_window.ui:1752 #, fuzzy msgid "Group chat highlight:" msgstr "Gruppe Samtale Besked Fremhævning" #: gajim/data/gui/preferences_window.ui:1890 #, fuzzy msgid "Your nickname:" msgstr "Kælenavn:" #: gajim/data/gui/preferences_window.ui:1904 #, fuzzy msgid "Your message:" msgstr "Fejl besked: %s" #: gajim/data/gui/preferences_window.ui:1916 msgid "_URL highlight:" msgstr "_URL fremhævning:" #: gajim/data/gui/preferences_window.ui:2041 msgid "_Reset to Default Colors" msgstr "_Nulstil til Standard Farver" #: gajim/data/gui/preferences_window.ui:2075 msgid "Chat Line Colors" msgstr "Samtalelinie Farver" #: gajim/data/gui/preferences_window.ui:2095 msgid "Style" msgstr "Stil" #: gajim/data/gui/preferences_window.ui:2128 msgid "Audio input device" msgstr "" #: gajim/data/gui/preferences_window.ui:2140 msgid "Audio output device" msgstr "" #: gajim/data/gui/preferences_window.ui:2176 #, fuzzy msgid "Audio" msgstr "Handlinger" #: gajim/data/gui/preferences_window.ui:2206 msgid "Video input device" msgstr "" #: gajim/data/gui/preferences_window.ui:2218 msgid "Video output device" msgstr "" #: gajim/data/gui/preferences_window.ui:2230 msgid "Video framerate" msgstr "" #: gajim/data/gui/preferences_window.ui:2242 msgid "Video size" msgstr "" #: gajim/data/gui/preferences_window.ui:2252 msgid "View own video source" msgstr "" #: gajim/data/gui/preferences_window.ui:2316 #, fuzzy msgid "Video" msgstr "Mellemnavn:" #: gajim/data/gui/preferences_window.ui:2346 #, fuzzy msgid "STUN server:" msgstr "Server:" #: gajim/data/gui/preferences_window.ui:2372 msgid "" "STUN server hostname. If none given, Gajim will try\n" "to discover one from server." msgstr "" #: gajim/data/gui/preferences_window.ui:2386 msgid "(example: stun.iptel.org)" msgstr "" #: gajim/data/gui/preferences_window.ui:2400 #, fuzzy msgid "Connection" msgstr "Betingelser" #: gajim/data/gui/preferences_window.ui:2485 msgid "_Mail client:" msgstr "_E-post klient:" #: gajim/data/gui/preferences_window.ui:2498 msgid "_Browser:" msgstr "_Netlæser:" #: gajim/data/gui/preferences_window.ui:2511 msgid "_File manager:" msgstr "_Filhåndterer:" #. a header for custom browser/client/file manager. so translate sth like: Custom Settings #: gajim/data/gui/preferences_window.ui:2559 msgid "Custom" msgstr "Tilpasset Opsætning" #: gajim/data/gui/preferences_window.ui:2576 msgid "Applications" msgstr "Programmer" #: gajim/data/gui/preferences_window.ui:2604 msgid "_Ignore events from contacts not in the roster" msgstr "_Ignorer hændelser fra kontakter som ikke er i kontaktvinduet" #: gajim/data/gui/preferences_window.ui:2608 msgid "" "If checked, Gajim will ignore incoming events from unauthorized contacts. " "Use with caution, because it blocks all messages from any contact that is " "not in the roster" msgstr "" "Hvis valgt vil Gajim ignorere indkommende hændelser fra uautoriserede " "kontakter. Brug med forsigtighed fordi det vil blokere alle beskeder fra " "alle kontakter som ikke er i kontaktvinduet." #: gajim/data/gui/preferences_window.ui:2622 #, fuzzy msgid "Allow client / _OS information to be sent" msgstr "Tillad _OS information at blive sendt" #: gajim/data/gui/preferences_window.ui:2626 msgid "" "If checked, Gajim will allow others to detect the operation system you are " "using" msgstr "" "Hvis valgt vil Gajim tillade andre at kunne se det operativ system du bruger" #: gajim/data/gui/preferences_window.ui:2640 #, fuzzy msgid "Allow local system time information to be sent" msgstr "Tillad _OS information at blive sendt" #: gajim/data/gui/preferences_window.ui:2644 #, fuzzy msgid "If checked, Gajim will allow others to detect the time on your system" msgstr "" "Hvis valgt vil Gajim tillade andre at kunne se det operativ system du bruger" #: gajim/data/gui/preferences_window.ui:2658 msgid "Log _encrypted chat session" msgstr "Log krypt_eret samtale session" #: gajim/data/gui/preferences_window.ui:2662 #, fuzzy msgid "" "If checked, Gajim will keep logs for encrypted messages. Please note that " "when using End-to-End encryption the remote party has to agree on logging, " "else the messages will not be logged." msgstr "" "Hvis valgt vil Gajim gemme en log for krypterede beskeder. Vær venligst " "opmærksom på når der bruges E2E kryptering må den anden i samtalen godkende " "evt. logning, ellers vil samtalen i blive logget." #: gajim/data/gui/preferences_window.ui:2676 #, fuzzy msgid "Allow my _idle time to be sent" msgstr "Tillad _OS information at blive sendt" #: gajim/data/gui/preferences_window.ui:2695 msgid "Global proxy:" msgstr "" #: gajim/data/gui/preferences_window.ui:2724 msgid "_Manage..." msgstr "Hå_ndter..." #: gajim/data/gui/preferences_window.ui:2743 msgid "Privacy" msgstr "Privatliv" #: gajim/data/gui/preferences_window.ui:2770 msgid "_Log status changes of contacts" msgstr "_Log status ændringer hos kontakter" #: gajim/data/gui/preferences_window.ui:2791 msgid "Miscellaneous" msgstr "Diverse" #: gajim/data/gui/preferences_window.ui:2810 msgid "_Open..." msgstr "_Åbn..." #: gajim/data/gui/preferences_window.ui:2826 msgid "Advanced Configuration Editor" msgstr "Avanceret Konfigurations Behandler" #: gajim/data/gui/contact_context_menu.ui:12 msgid "Start _Chat" msgstr "Start _samtale" #: gajim/data/gui/contact_context_menu.ui:20 #: gajim/data/gui/systray_context_menu.ui:36 msgid "Send Single _Message..." msgstr "Send en Enkel _Besked" #: gajim/data/gui/contact_context_menu.ui:28 msgid "Send _File..." msgstr "Send _Fil..." #: gajim/data/gui/contact_context_menu.ui:44 msgid "Invite _Contacts" msgstr "Inviter _Kontakter" #: gajim/data/gui/contact_context_menu.ui:73 msgid "E_xecute Command..." msgstr "Kør K_ommando..." #: gajim/data/gui/contact_context_menu.ui:82 #, fuzzy msgid "M_anage Contact" msgstr "_Håndter Kontakt" #: gajim/data/gui/contact_context_menu.ui:92 msgid "_Rename..." msgstr "_Omdøb..." #: gajim/data/gui/contact_context_menu.ui:99 msgid "Edit _Groups..." msgstr "Ændre _Grupper..." #: gajim/data/gui/contact_context_menu.ui:106 msgid "Assign Open_PGP Key..." msgstr "Tilskriv Open_PGP Nøgle..." #: gajim/data/gui/contact_context_menu.ui:115 msgid "Add Special _Notification..." msgstr "Tilføj Speciel Påmi_ndelse..." #: gajim/data/gui/contact_context_menu.ui:129 msgid "_Subscription" msgstr "_Abonnement" #: gajim/data/gui/contact_context_menu.ui:138 #, fuzzy msgid "_Allow contact to see my status" msgstr "Ti_llad denne kontakt at se min status" #: gajim/data/gui/contact_context_menu.ui:146 #, fuzzy msgid "A_sk to see contact status" msgstr "_Spørg om at kunne se hans/hendes status" #: gajim/data/gui/contact_context_menu.ui:154 #, fuzzy msgid "_Forbid contact to see my status" msgstr "_Nægt ham/hende at se min status" #: gajim/data/gui/contact_context_menu.ui:182 msgid "_Unignore" msgstr "Ikke ign_orer" #: gajim/data/gui/contact_context_menu.ui:190 msgid "_Ignore" msgstr "_Ignorer" #: gajim/data/gui/contact_context_menu.ui:197 #: gajim/data/gui/chat_context_menu.ui:66 msgid "_Add to Roster..." msgstr "_Tilføj til Kontaktliste..." #: gajim/data/gui/account_creation_wizard_window.ui:43 msgid "Gajim: Account Creation Wizard" msgstr "Gajim: Konto Oprettelses Guide" #: gajim/data/gui/account_creation_wizard_window.ui:70 msgid "" "You need to have an account in order to connect\n" "to the Jabber network." msgstr "" "Du behøver en konto for at tilslutte dig\n" "til Jabber netværket" #: gajim/data/gui/account_creation_wizard_window.ui:95 msgid "I already have an account I want to _use" msgstr "Jeg har allerede en konto jeg vil br_uge" #: gajim/data/gui/account_creation_wizard_window.ui:112 msgid "I want to _register for a new account" msgstr "Jeg vil _registrere en ny konto" #: gajim/data/gui/account_creation_wizard_window.ui:133 msgid "Please choose one of the options below:" msgstr "Vælg en af mulighederne under:" #: gajim/data/gui/account_creation_wizard_window.ui:167 msgid "Please fill in the data for your existing account" msgstr "Fyld ind data for din eksisterende konto" #: gajim/data/gui/account_creation_wizard_window.ui:187 msgid "_Jabber ID:" msgstr "_Jabber ID:" #: gajim/data/gui/account_creation_wizard_window.ui:239 #: gajim/data/gui/account_creation_wizard_window.ui:394 msgid "Anon_ymous authentication" msgstr "Anonym godkendelse" #: gajim/data/gui/account_creation_wizard_window.ui:259 #: gajim/data/gui/manage_bookmarks_window.ui:172 msgid "_Password:" msgstr "_Adgangskode" #: gajim/data/gui/account_creation_wizard_window.ui:281 msgid "Save pass_word" msgstr "Gem adgangs_kode" #: gajim/data/gui/account_creation_wizard_window.ui:285 msgid "If checked, Gajim will remember the password for this account" msgstr "Hvis valgt vil Gajim huske adgangskoden for denne konto" #: gajim/data/gui/account_creation_wizard_window.ui:339 msgid "Please select a server" msgstr "Vælg venligst en server" #: gajim/data/gui/account_creation_wizard_window.ui:358 #: gajim/data/gui/manage_bookmarks_window.ui:159 msgid "_Server:" msgstr "_Server:" #: gajim/data/gui/account_creation_wizard_window.ui:423 msgid "Prox_y:" msgstr "Pro_xy:" #: gajim/data/gui/account_creation_wizard_window.ui:450 msgid "Manage..." msgstr "Håndter..." #: gajim/data/gui/account_creation_wizard_window.ui:465 msgid "Use custom hostname/port" msgstr "Brug tilpasset værtsnavn/port" #: gajim/data/gui/account_creation_wizard_window.ui:491 msgid "_Hostname:" msgstr "_Værtsnavn:" #: gajim/data/gui/account_creation_wizard_window.ui:517 msgid "_Port:" msgstr "_Port:" #: gajim/data/gui/account_creation_wizard_window.ui:553 #: gajim/data/gui/account_creation_wizard_window.ui:884 msgid "_Advanced" msgstr "_Avanceret" #: gajim/data/gui/account_creation_wizard_window.ui:624 msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA1 fingerprint of the certificate:\n" msgstr "" "Tilføj dette certifikat til listen af certifikater du stoler på.\n" "SHA1 fingeraftryk af certifikatet:\n" #: gajim/data/gui/account_creation_wizard_window.ui:687 msgid "" "Connecting to server\n" "\n" "Please wait..." msgstr "" "Tilslutter til server\n" "\n" "Vent venligst..." #: gajim/data/gui/account_creation_wizard_window.ui:772 msgid "Connect when I press Finish" msgstr "Tilslut når jeg trykke Færdig" #: gajim/data/gui/account_creation_wizard_window.ui:789 msgid "Set my profile when I connect" msgstr "Sæt min profil når jeg tilslutter" #: gajim/data/gui/account_creation_wizard_window.ui:901 msgid "_Finish" msgstr "_Færdig" #: gajim/data/gui/privacy_lists_window.ui:34 msgid "Privacy Lists:" msgstr "Privatlivs Lister:" #: gajim/data/gui/service_discovery_window.ui:84 msgid "_Address:" msgstr "_Adresse:" #: gajim/data/gui/service_discovery_window.ui:115 msgid "G_o" msgstr "N_aviger" #: gajim/data/gui/synchronise_select_contacts_dialog.ui:8 msgid "Synchronise : select contacts" msgstr "Synkronisering : vælg kontakter" #: gajim/data/gui/synchronise_select_contacts_dialog.ui:67 msgid "Select the contacts you want to synchronise" msgstr "Vælg de kontakter som du vil synkronisere" #: gajim/data/gui/edit_groups_dialog.ui:8 msgid "Edit Groups" msgstr "Rediger Grupper" #: gajim/data/gui/search_window.ui:42 msgid "Please wait while retrieving search form..." msgstr "Vent mens en søge form hentes..." #: gajim/data/gui/search_window.ui:80 msgid "_Add contact" msgstr "Tilføj Kont_akt" #: gajim/data/gui/search_window.ui:116 msgid "_Search" msgstr "_Søg" #: gajim/data/gui/chat_context_menu.ui:11 msgid "_Copy Link Location" msgstr "_Kopier Henvisning" #: gajim/data/gui/chat_context_menu.ui:19 msgid "_Open Link in Browser" msgstr "_Åbn Henvisning i Netlæser" #: gajim/data/gui/chat_context_menu.ui:27 msgid "_Copy JID/Email Address" msgstr "_Kopier JID/E-post Adresse" #: gajim/data/gui/chat_context_menu.ui:35 msgid "_Open Email Composer" msgstr "_Åbn E-post Program" #: gajim/data/gui/chat_context_menu.ui:49 #: gajim/data/gui/subscription_request_window.ui:12 msgid "_Start Chat" msgstr "_Start Samtale" #: gajim/data/gui/chat_context_menu.ui:57 #: gajim/data/gui/account_context_menu.ui:35 #: gajim/data/gui/systray_context_menu.ui:28 msgid "Join _Group Chat" msgstr "Bliv med i en _Gruppe Samtale" #: gajim/data/gui/change_status_message_dialog.ui:131 msgid "Save as Preset..." msgstr "Gem som Forvalgt..." #: gajim/data/gui/change_status_message_dialog.ui:167 msgid "Preset messages:" msgstr "Forvalgte beskeder:" #: gajim/data/gui/change_status_message_dialog.ui:313 msgid "Type your new status message" msgstr "Skriv din nye status besked" #: gajim/data/gui/synchronise_select_account_dialog.ui:8 msgid "Synchronise contacts" msgstr "Synkroniser kontakter" #: gajim/data/gui/synchronise_select_account_dialog.ui:68 msgid "Select the account with which you want to synchronise" msgstr "Vælg den konto som du vil synkronisere med" #: gajim/data/gui/archiving_313_preferences_window.ui:28 #, fuzzy msgid "Roster" msgstr "Vis _Kontaktvindue" #: gajim/data/gui/archiving_313_preferences_window.ui:85 #, fuzzy msgid "Preference" msgstr "Indstillinger" #: gajim/data/gui/archiving_313_preferences_window.ui:159 #, fuzzy msgid "Default:" msgstr "Standard" #: gajim/data/gui/voip_call_received_dialog.ui:15 msgid "Incoming call" msgstr "" #: gajim/data/gui/add_new_contact_window.ui:29 msgid "Add New Contact" msgstr "Tilføj Ny Kontakt" #: gajim/data/gui/add_new_contact_window.ui:62 msgid "A_ccount:" msgstr "K_onto:" #: gajim/data/gui/add_new_contact_window.ui:110 msgid "_Protocol:" msgstr "_Protokol:" #: gajim/data/gui/add_new_contact_window.ui:169 msgid "_User ID:" msgstr "_Bruger ID:" #: gajim/data/gui/add_new_contact_window.ui:182 #: gajim/data/gui/manage_bookmarks_window.ui:133 msgid "_Nickname:" msgstr "_Kælenavn:" #: gajim/data/gui/add_new_contact_window.ui:195 msgid "_Group:" msgstr "_Gruppe:" #: gajim/data/gui/add_new_contact_window.ui:210 #, fuzzy msgid "Type User ID" msgstr "Bruger ID:" #: gajim/data/gui/add_new_contact_window.ui:223 #, fuzzy msgid "Type Nickname" msgstr "Kælenavn" #: gajim/data/gui/add_new_contact_window.ui:239 msgid "Choose a group of type a new group" msgstr "" #: gajim/data/gui/add_new_contact_window.ui:257 msgid "A_llow this contact to view my status" msgstr "Ti_llad denne kontakt at se min status" #: gajim/data/gui/add_new_contact_window.ui:300 #, fuzzy msgid "_Save subscription message" msgstr "_Abonnement" #: gajim/data/gui/add_new_contact_window.ui:325 #, fuzzy msgid "" "You have to register with this transport\n" "to be able to add a contact from this\n" "protocol. Click on Register button to\n" "proceed." msgstr "" "Du må registrere dig for denne transport\n" "for at være i stand til at tilføje kontakter fra denne\n" "protokol. Klik på registrer knappen for at\n" "fortsætte." #: gajim/data/gui/add_new_contact_window.ui:340 msgid "_Register" msgstr "Kan _registreres" #: gajim/data/gui/add_new_contact_window.ui:369 msgid "" "You must be connected to the transport to be able\n" "to add a contact from this protocol." msgstr "" "Du må være tilsluttet til transporten for at kunne\n" "tilføje en kontakt for denne protokol." #: gajim/data/gui/roster_window.ui:61 #, fuzzy msgid "Change Status Message…" msgstr "_Ændre Status Besked" #: gajim/data/gui/change_mood_dialog.ui:73 msgid "Mood:" msgstr "Humør:" #: gajim/data/gui/change_mood_dialog.ui:85 msgid "Message:" msgstr "Besked:" #: gajim/data/gui/plugins_window.ui:25 gajim/data/gui/application_menu.ui:90 msgid "Plugins" msgstr "" #: gajim/data/gui/plugins_window.ui:78 msgid "Install from zip" msgstr "" #: gajim/data/gui/plugins_window.ui:109 msgid "<empty>" msgstr "" #: gajim/data/gui/plugins_window.ui:131 #, fuzzy msgid "Version:" msgstr "GTK+ Version:" #: gajim/data/gui/plugins_window.ui:169 #, fuzzy msgid "Authors:" msgstr "Au_torisere" #: gajim/data/gui/plugins_window.ui:210 #, fuzzy msgid "Homepage:" msgstr "Hjemmeside:" #: gajim/data/gui/plugins_window.ui:253 #, fuzzy msgid "Description:" msgstr "Beskrivelse: " #: gajim/data/gui/plugins_window.ui:301 msgid "Uninstall" msgstr "" #: gajim/data/gui/plugins_window.ui:316 #, fuzzy msgid "Configure" msgstr "_Konfigurere" #: gajim/data/gui/plugins_window.ui:348 #, fuzzy msgid "Installed" msgstr "Hænger" #: gajim/data/gui/plugins_window.ui:399 msgid "" "Plug-in decription should be displayed here. This text will be erased during " "PluginsWindow initialization." msgstr "" #: gajim/data/gui/privacy_list_window.ui:18 #, fuzzy msgid "none" msgstr "en" #: gajim/data/gui/privacy_list_window.ui:21 #, fuzzy msgid "both" msgstr "Begge" #: gajim/data/gui/privacy_list_window.ui:24 #, fuzzy msgid "from" msgstr "Fra" #: gajim/data/gui/privacy_list_window.ui:27 #, fuzzy msgid "to" msgstr "to" #: gajim/data/gui/privacy_list_window.ui:66 msgid "Privacy List" msgstr "Privatlivs Liste" #: gajim/data/gui/privacy_list_window.ui:77 msgid "Active for this session" msgstr "Aktiv i denne session" #: gajim/data/gui/privacy_list_window.ui:94 msgid "Active on each startup" msgstr "Aktiv efter hver start" #: gajim/data/gui/privacy_list_window.ui:132 msgid "List of rules" msgstr "Liste af regler" #: gajim/data/gui/privacy_list_window.ui:244 msgid "Add / Edit a rule" msgstr "Tilføj / Ændre en regel" #: gajim/data/gui/privacy_list_window.ui:266 msgid "Allow" msgstr "Tillad" #: gajim/data/gui/privacy_list_window.ui:282 msgid "Deny" msgstr "Nægt" #: gajim/data/gui/privacy_list_window.ui:317 msgid "JabberID" msgstr "Jabber ID" #: gajim/data/gui/privacy_list_window.ui:358 msgid "all in the group" msgstr "Alle i gruppen" #: gajim/data/gui/privacy_list_window.ui:407 msgid "all by subscription" msgstr "Alle efter abonnering" #: gajim/data/gui/privacy_list_window.ui:456 msgid "All" msgstr "Alle" #: gajim/data/gui/privacy_list_window.ui:493 msgid "to send me messages" msgstr "at sende mig beskeder" #: gajim/data/gui/privacy_list_window.ui:509 msgid "to send me queries" msgstr "at sende mig forespørgsler" #: gajim/data/gui/privacy_list_window.ui:525 msgid "to view my status" msgstr "at se min status" #: gajim/data/gui/privacy_list_window.ui:541 msgid "to send me status" msgstr "at sende mig status" #: gajim/data/gui/privacy_list_window.ui:557 msgid "All (including subscription)" msgstr "Alle (inkluderende abonnering)" #: gajim/data/gui/privacy_list_window.ui:598 msgid "Order:" msgstr "Bestil:" #: gajim/data/gui/manage_sounds_window.ui:10 msgid "Manage sounds" msgstr "Håndter lyde" #: gajim/data/gui/remove_account_window.ui:56 msgid "Remove account _only from Gajim" msgstr "Fjern kun k_ontoen fra Gajim" #: gajim/data/gui/remove_account_window.ui:73 msgid "Remove account from Gajim and from _server" msgstr "Fjern konto fra Gajim og fra _serveren" #: gajim/data/gui/remove_account_window.ui:94 msgid "What do you want to do?" msgstr "Hvad vil du gøre?" #: gajim/data/gui/adhoc_commands_window.ui:35 msgid "Please wait while retrieving command list..." msgstr "Vent mens kommandolisten bliver modtaget..." #: gajim/data/gui/adhoc_commands_window.ui:93 msgid "Choose command to execute:" msgstr "Vælg kommando som skal udføres:" #: gajim/data/gui/adhoc_commands_window.ui:136 #: gajim/data/gui/adhoc_commands_window.ui:277 msgid "Check once more" msgstr "Kontroller en gang til" #: gajim/data/gui/adhoc_commands_window.ui:194 #, fuzzy msgid "Please wait while the command is being sent..." msgstr "Vent mens kommandoen bliver sendt..." #: gajim/data/gui/adhoc_commands_window.ui:211 msgid "Please wait..." msgstr "Vent venligst..." #: gajim/data/gui/adhoc_commands_window.ui:257 msgid "This jabber entity does not expose any commands." msgstr "Denne jabber enhed eksponerer ikke nogen kommandoer." #: gajim/data/gui/adhoc_commands_window.ui:336 msgid "An error has occurred:" msgstr "En fejl er opstået:" #: gajim/data/gui/adhoc_commands_window.ui:465 #, fuzzy msgid "F_inish" msgstr "_Færdig" #: gajim/data/gui/account_context_menu.ui:20 msgid "_Personal Events" msgstr "_Personlige hændelser" #: gajim/data/gui/account_context_menu.ui:49 msgid "_Add Contact..." msgstr "_Tilføj Kontakt..." #: gajim/data/gui/account_context_menu.ui:57 msgid "_Discover Services" msgstr "Op_dag Tjenester" #: gajim/data/gui/account_context_menu.ui:65 msgid "_Execute Command..." msgstr "_Udfør Kommando..." #: gajim/data/gui/esession_info_window.ui:50 msgid "_Verify" msgstr "Efterprø_v" #: gajim/data/gui/esession_info_window.ui:137 msgid "(ESession info)" msgstr "(ESession info)" #: gajim/data/gui/application_menu.ui:8 #, fuzzy msgid "View" msgstr "_Vis" #: gajim/data/gui/application_menu.ui:11 #, fuzzy msgid "Show Roster" msgstr "Vis _Kontaktvindue" #: gajim/data/gui/application_menu.ui:16 #, fuzzy msgid "Show Offline Contacts" msgstr "Vis _Afkoblede Kontakter" #: gajim/data/gui/application_menu.ui:21 #, fuzzy msgid "Show Active Contacts" msgstr "Vis Kun _Aktive Kontakter" #: gajim/data/gui/application_menu.ui:26 #, fuzzy msgid "Show Transports" msgstr "Vis Trans_porter" #: gajim/data/gui/application_menu.ui:43 #, fuzzy msgid "Help" msgstr "_Hjælp" #: gajim/data/gui/application_menu.ui:46 #, fuzzy msgid "Contents" msgstr "_Indhold" #: gajim/data/gui/application_menu.ui:50 #, fuzzy msgid "FAQ" msgstr "_OSS" #: gajim/data/gui/application_menu.ui:54 msgid "Keyboard Shortcuts" msgstr "" #: gajim/data/gui/application_menu.ui:58 gajim/data/gui/features_window.ui:9 msgid "Features" msgstr "Egenskaber" #: gajim/data/gui/application_menu.ui:76 msgid "Start Chat" msgstr "Start Samtale" #: gajim/data/gui/application_menu.ui:81 #, fuzzy msgid "Bookmarks" msgstr "_Bogmærke" #: gajim/data/gui/application_menu.ui:99 #, fuzzy msgid "Quit" msgstr "_Afslut" #: gajim/data/gui/features_window.ui:26 msgid "List of possible features in Gajim:" msgstr "Liste over mulige egenskaber i Gajim: " #: gajim/data/gui/manage_bookmarks_window.ui:14 msgid "Manage Bookmarks" msgstr "Håndter Bogmærker" #: gajim/data/gui/manage_bookmarks_window.ui:120 #, fuzzy msgid "_Title:" msgstr "Titel:" #: gajim/data/gui/manage_bookmarks_window.ui:146 msgid "Roo_m:" msgstr "" #: gajim/data/gui/manage_bookmarks_window.ui:188 #, fuzzy msgid "A_uto join" msgstr "Bliv automatisk med" #: gajim/data/gui/manage_bookmarks_window.ui:193 msgid "If checked, Gajim will join this group chat on startup" msgstr "Hvis valgt vil Gajim deltage i denne gruppe samtale ved start" #: gajim/data/gui/manage_bookmarks_window.ui:207 #, fuzzy msgid "Minimi_ze on Auto Join" msgstr "Minimer ved Automatisk Deltagelse" #: gajim/data/gui/manage_bookmarks_window.ui:235 #, fuzzy msgid "Pr_int status:" msgstr "Skriv status:" #: gajim/data/gui/exception_dialog.ui:45 #, fuzzy msgid "" "A programming error has been detected. It probably is not fatal, but should " "be reported to the developers nonetheless." msgstr "" "Den er sikkert ikke kritisk, men bør alligevel rapporteres til udviklerne." #: gajim/data/gui/exception_dialog.ui:115 #, fuzzy msgid "Report Bug" msgstr "_Rapporter Fejl" #: gajim/data/gui/subscription_request_window.ui:95 msgid "_Deny" msgstr "_Nægt" #: gajim/data/gui/subscription_request_window.ui:100 msgid "" "Deny authorization from contact so he or she cannot know when you're " "connected" msgstr "" "Nægt autorisation fra kontakter så han eller hun ikke kan opnå information " "om at du er tilsluttet" #: gajim/data/gui/subscription_request_window.ui:133 msgid "Au_thorize" msgstr "Au_torisere" #: gajim/data/gui/subscription_request_window.ui:138 msgid "Authorize contact so he or she can know when you're connected" msgstr "" "Autoriser kontakt så han eller hun kan opnå information om at du er " "tilsluttet" #: gajim/data/gui/xml_console_window.ui:121 #, fuzzy msgid "Presence" msgstr "_Tilstedeværelse" #: gajim/data/gui/xml_console_window.ui:134 msgid "Iq" msgstr "" #: gajim/data/gui/xml_console_window.ui:149 #, fuzzy msgid "Presets" msgstr "_Tilstedeværelse" #: gajim/data/gui/chat_to_muc_window.ui:24 msgid "Invite Friends!" msgstr "Inviter Venner!" #: gajim/data/gui/chat_to_muc_window.ui:39 #, fuzzy msgid "" "You are now entering a groupchat.\n" "Select the contacts you want to invite" msgstr "" "Du er ved at begynde en Multibruger samtale.\n" "Vælg de kontakter du vil invitere" #: gajim/data/gui/chat_to_muc_window.ui:67 #: gajim/data/gui/chat_to_muc_window.ui:78 msgid "column" msgstr "" #: gajim/data/gui/chat_to_muc_window.ui:112 msgid "Please select a MUC server." msgstr "Vælg en MUC server." #: gajim/data/gui/chat_to_muc_window.ui:141 msgid "MUC server" msgstr "MUC server" #: gajim/data/gui/chat_to_muc_window.ui:176 msgid "In_vite" msgstr "In_viter" #: gajim/data/gui/history_manager.ui:11 #, fuzzy msgid "_Export" msgstr "Eksporter" #: gajim/data/gui/history_manager.ui:97 msgid "Gajim History Logs Manager" msgstr "Gajim Loghistorie Håndterer" #: gajim/data/gui/history_manager.ui:154 msgid "Welcome to Gajim History Logs Manager" msgstr "Velkommen til Gajims Loghistorie Håndterer" #: gajim/data/gui/history_manager.ui:168 msgid "" "This log manager is not intended for log viewing. If you are looking for " "such functionality, use the history window instead.\n" "\n" "Use this program to delete or export logs. You can select logs from the left " "and/or search database from below." msgstr "" "Denne loghåndterer er ikke ment til at gennemse loggene. Hvis du leder efter " "den funktionalitet, brug historik vinduet i stedet.\n" "\n" "Brug dette program til at slette eller eksportere logger. Du kan selektere " "logger fra venstre og/eller søge databasen under. " #: gajim/data/gui/history_manager.ui:184 msgid "" "WARNING:\n" "If you plan to do massive deletions, please make sure Gajim is not running. " "Generally avoid deletions with contacts you currently chat with." msgstr "" "ADVARSEL:\n" "Hvis du planlægger at gøre massive sletninger, vær sikker på at Gajim ikke " "kører. \n" "Generelt undgå at slette logger fra kontakter du samtidig snakker med." #: gajim/data/gui/history_manager.ui:283 msgid "_Search Database" msgstr "_Søg Database" #: gajim/data/gui/shortcuts_window.ui:8 msgid "Chat Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:12 #, fuzzy msgid "Message composition" msgstr "Besked indhold" #: gajim/data/gui/shortcuts_window.ui:17 #, fuzzy msgid "Send the message" msgstr "Send besked" #: gajim/data/gui/shortcuts_window.ui:24 #, fuzzy msgid "Create a new line" msgstr "Lav en ny post" #: gajim/data/gui/shortcuts_window.ui:31 msgid "Select an emoticon" msgstr "" #: gajim/data/gui/shortcuts_window.ui:38 msgid "Complete a command or a nick" msgstr "" #: gajim/data/gui/shortcuts_window.ui:45 #, fuzzy msgid "Previous sent message" msgstr "Forvalgte beskeder:" #: gajim/data/gui/shortcuts_window.ui:52 #, fuzzy msgid "Next sent messages" msgstr "Forvalgte beskeder:" #: gajim/data/gui/shortcuts_window.ui:59 #, fuzzy msgid "Quote previous message" msgstr "status besked" #: gajim/data/gui/shortcuts_window.ui:66 #, fuzzy msgid "Quote next message" msgstr "Send besked" #: gajim/data/gui/shortcuts_window.ui:73 #, fuzzy msgid "Clear message entry" msgstr "Besked er Sendt" #: gajim/data/gui/shortcuts_window.ui:81 gajim/data/gui/shortcuts_window.ui:231 #, fuzzy msgid "Appearance" msgstr "Samtale udseende" #: gajim/data/gui/shortcuts_window.ui:86 msgid "Toggle full / compact view" msgstr "" #: gajim/data/gui/shortcuts_window.ui:94 #, fuzzy msgid "Recent history" msgstr "For nylig:" #: gajim/data/gui/shortcuts_window.ui:99 msgid "Scroll up" msgstr "" #: gajim/data/gui/shortcuts_window.ui:106 msgid "Scroll down" msgstr "" #: gajim/data/gui/shortcuts_window.ui:121 msgid "Tabs" msgstr "" #: gajim/data/gui/shortcuts_window.ui:126 msgid "Switch to the previous tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:133 msgid "Switch to the next tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:140 msgid "Switch to the first - ninth tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:147 msgid "Switch to the previous unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:154 msgid "Switch to the next unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:161 msgid "Close chat" msgstr "" #: gajim/data/gui/shortcuts_window.ui:172 msgid "Roster Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:195 #, fuzzy msgid "File transfers" msgstr "Filoverførsler" #: gajim/data/gui/shortcuts_window.ui:209 #, fuzzy msgid "Join a group chat" msgstr "i _gruppe samtaler" #: gajim/data/gui/shortcuts_window.ui:216 #, fuzzy msgid "Set the status message" msgstr "status besked" #: gajim/data/gui/shortcuts_window.ui:223 #, fuzzy msgid "Quit Gajim" msgstr "Gajim" #: gajim/data/gui/shortcuts_window.ui:236 #, fuzzy msgid "Show offline contacts" msgstr "Vis _Afkoblede Kontakter" #: gajim/data/gui/shortcuts_window.ui:243 #, fuzzy msgid "Show only active contacts" msgstr "Vis Kun _Aktive Kontakter" #: gajim/data/gui/shortcuts_window.ui:250 msgid "Enable roster filtering" msgstr "" #: gajim/data/gui/shortcuts_window.ui:258 msgid "Contacts" msgstr "Kontakter" #: gajim/data/gui/shortcuts_window.ui:263 #, fuzzy msgid "Contact information" msgstr "Kontakt Information" #: gajim/data/gui/shortcuts_window.ui:270 #, fuzzy msgid "Rename contact" msgstr "Omdøb Kontakt" #: gajim/data/gui/shortcuts_window.ui:277 #, fuzzy msgid "Delete contact" msgstr "Sendte kontakter:" #: gajim/data/gui/passphrase_dialog.ui:8 msgid "Passphrase" msgstr "PGP-løsen" #: gajim/data/gui/history_window.ui:38 #, fuzzy msgid "Enter name / JID of contact or groupchat" msgstr "Kontakt navn" #: gajim/data/gui/history_window.ui:51 msgid "Search:" msgstr "Søg:" #: gajim/data/gui/history_window.ui:75 msgid "_In date search" msgstr "" #: gajim/data/gui/history_window.ui:79 msgid "Only searching within selected day" msgstr "" #: gajim/data/gui/history_window.ui:306 #, fuzzy msgid "_Show status changes" msgstr "_Log status ændringer hos kontakter" #: gajim/data/gui/manage_pep_services_window.ui:13 msgid "PEP Service Configuration" msgstr "PEP Tjeneste Konfigurering" #: gajim/data/gui/manage_pep_services_window.ui:69 msgid "_Configure" msgstr "_Konfigurere" #: gajim/data/gui/groups_post_window.ui:9 msgid "Create new post" msgstr "Lav en ny post" #: gajim/data/gui/groups_post_window.ui:29 #: gajim/data/gui/single_message_window.ui:46 msgid "From:" msgstr "Fra:" #: gajim/data/gui/groups_post_window.ui:41 #: gajim/data/gui/single_message_window.ui:70 msgid "Subject:" msgstr "Emne:" #: gajim/data/gui/data_form_window.ui:19 msgid "Fill in the form." msgstr "Udfyld formen." #: gajim/data/gui/data_form_window.ui:274 msgid "Room Configuration" msgstr "Rum Konfigurering" #: gajim/data/gui/roster_item_exchange_window.ui:8 msgid "Roster Item Exchange" msgstr "Bytte af punkt i kontaktvinduet" #: gajim/data/gui/systray_context_menu.ui:12 msgid "Sta_tus" msgstr "Sta_tus" #: gajim/data/gui/systray_context_menu.ui:20 msgid "_Start Chat..." msgstr "_Start Samtale..." #: gajim/data/gui/systray_context_menu.ui:50 msgid "Show All Pending _Events" msgstr "Vis Alle Ventende Hænd_elser" #: gajim/data/gui/systray_context_menu.ui:59 msgid "Mute Sounds" msgstr "Slå lyden af" #: gajim/data/gui/systray_context_menu.ui:75 #, fuzzy msgid "_Preferences" msgstr "Indstillinger" #: gajim/data/gui/systray_context_menu.ui:90 #, fuzzy msgid "_Quit" msgstr "_Afslut" #: gajim/data/gui/single_message_window.ui:59 msgid "To:" msgstr "Til:" #: gajim/data/gui/single_message_window.ui:118 msgid "0" msgstr "0" #: gajim/data/gui/single_message_window.ui:210 msgid "Sen_d" msgstr "Sen_d" #: gajim/data/gui/single_message_window.ui:216 msgid "Send message" msgstr "Send besked" #: gajim/data/gui/single_message_window.ui:229 msgid "_Reply" msgstr "Sva_r" #: gajim/data/gui/single_message_window.ui:235 msgid "Reply to this message" msgstr "Send et svar til denne besked" #: gajim/data/gui/single_message_window.ui:248 msgid "_Send & Close" msgstr "_Send & Luk" #: gajim/data/gui/single_message_window.ui:254 msgid "Send message and close window" msgstr "Send besked og luk vinduet" #: gajim/data/gui/change_activity_dialog.ui:8 msgid "Set Activity" msgstr "Sæt Aktivitet" #: gajim/data/gui/change_activity_dialog.ui:65 msgid "Set an activity" msgstr "Sæt en aktivitet" #: gajim/data/gui/change_activity_dialog.ui:337 msgid "Message: " msgstr "Besked:" #: gajim/command_system/mapping.py:164 gajim/command_system/mapping.py:174 #: gajim/command_system/mapping.py:194 #, fuzzy msgid "Missing arguments" msgstr "Manglende argument \"contact_jid\"" #: gajim/command_system/mapping.py:261 #, fuzzy msgid "Too many arguments" msgstr "Manglende argument \"contact_jid\"" #: gajim/command_system/implementation/execute.py:53 msgid "Execute expression inside a shell, show output" msgstr "" #: gajim/command_system/implementation/execute.py:109 msgid "Execute expression inside a shell, send output" msgstr "" #: gajim/command_system/implementation/standard.py:45 msgid "" "Show help on a given command or a list of available commands if -a is given" msgstr "" #: gajim/command_system/implementation/standard.py:72 #, fuzzy msgid "Send a message to the contact" msgstr "Send en fil til en kontakt" #: gajim/command_system/implementation/standard.py:77 msgid "Send action (in the third person) to the current chat" msgstr "" #: gajim/command_system/implementation/standard.py:82 msgid "Show logged messages which mention given text" msgstr "" #: gajim/command_system/implementation/standard.py:87 #, fuzzy, python-format msgid "%s: Nothing found" msgstr "%s ikke fundet" #: gajim/command_system/implementation/standard.py:93 msgid "Limit must be an integer" msgstr "" #: gajim/command_system/implementation/standard.py:117 msgid "" "\n" " Set the current status\n" "\n" " Status can be given as one of the following values:\n" " online, away, chat, xa, dnd.\n" " " msgstr "" #: gajim/command_system/implementation/standard.py:135 msgid "Set the current status to away" msgstr "" #: gajim/command_system/implementation/standard.py:149 msgid "Set the current status to online" msgstr "" #: gajim/command_system/implementation/standard.py:152 #, fuzzy msgid "Available" msgstr "Ti_lgængelig" #: gajim/command_system/implementation/standard.py:172 #: gajim/command_system/implementation/standard.py:249 #, fuzzy msgid "Clear the text window" msgstr "Skjuler vinduet" #: gajim/command_system/implementation/standard.py:177 #: gajim/command_system/implementation/standard.py:389 #, fuzzy msgid "Send a ping to the contact" msgstr "Send en fil til en kontakt" #: gajim/command_system/implementation/standard.py:180 #: gajim/command_system/implementation/standard.py:392 msgid "Command is not supported for zeroconf accounts" msgstr "" #: gajim/command_system/implementation/standard.py:184 msgid "Send DTMF sequence through an open audio session" msgstr "" #: gajim/command_system/implementation/standard.py:187 msgid "No open audio sessions with the contact" msgstr "" #: gajim/command_system/implementation/standard.py:190 #, fuzzy, python-format msgid "%s is not a valid tone" msgstr "%s er ikke et gyldigt logniveau" #: gajim/command_system/implementation/standard.py:197 msgid "Toggle audio session" msgstr "" #: gajim/command_system/implementation/standard.py:200 #, fuzzy msgid "Audio sessions are not available" msgstr "En tilslutning er ikke tilgængelig" #: gajim/command_system/implementation/standard.py:207 msgid "Toggle video session" msgstr "" #: gajim/command_system/implementation/standard.py:210 #, fuzzy msgid "Video sessions are not available" msgstr "Tilslutning er ikke tilgængelig" #: gajim/command_system/implementation/standard.py:217 msgid "Send a message to the contact that will attract his (her) attention" msgstr "" #: gajim/command_system/implementation/standard.py:256 #, fuzzy msgid "Change your nickname in a group chat" msgstr "Ændre dit kælenavn (Ctrl+N)" #: gajim/command_system/implementation/standard.py:266 #, fuzzy msgid "Open a private chat window with a specified occupant" msgstr "_Åbn samtale vindue med bruger" #: gajim/command_system/implementation/standard.py:272 #: gajim/command_system/implementation/standard.py:281 #: gajim/command_system/implementation/standard.py:327 #: gajim/command_system/implementation/standard.py:339 #: gajim/command_system/implementation/standard.py:351 #, fuzzy msgid "Nickname not found" msgstr "Kælenavn som skal bruges" #: gajim/command_system/implementation/standard.py:275 msgid "" "Open a private chat window with a specified occupant and send him a message" msgstr "" #: gajim/command_system/implementation/standard.py:284 #, fuzzy msgid "Display or change a group chat topic" msgstr "Spørg før et gruppesamtale vindue/faneblad lukkes." #: gajim/command_system/implementation/standard.py:292 msgid "Invite a user to a room for a reason" msgstr "" #: gajim/command_system/implementation/standard.py:295 #, fuzzy, python-format msgid "Invited %(jid)s to %(room_jid)s" msgstr "Send %s til %s" #: gajim/command_system/implementation/standard.py:299 #, fuzzy msgid "Join a group chat given by a jid" msgstr "i _gruppe samtaler" #: gajim/command_system/implementation/standard.py:307 msgid "" "Leave the groupchat, optionally giving a reason, and close tab or window" msgstr "" #: gajim/command_system/implementation/standard.py:312 msgid "" "\n" " Ban user by a nick or a jid from a groupchat\n" "\n" " If given nickname is not found it will be treated as a jid.\n" " " msgstr "" #: gajim/command_system/implementation/standard.py:324 #, fuzzy msgid "Kick user by a nick from a groupchat" msgstr "Du er inviteret til en gruppesamtale." #: gajim/command_system/implementation/standard.py:332 msgid "" "Set occupant role in group chat.\n" " Role can be given as one of the following values:\n" " moderator, participant, visitor, none" msgstr "" #: gajim/command_system/implementation/standard.py:337 #, fuzzy msgid "Invalid role given" msgstr "Ugyldigt server" #: gajim/command_system/implementation/standard.py:344 msgid "" "Set occupant affiliation in group chat.\n" " Affiliation can be given as one of the following values:\n" " owner, admin, member, outcast, none" msgstr "" #: gajim/command_system/implementation/standard.py:349 #, fuzzy msgid "Invalid affiliation given" msgstr "tilknytning ændret" #: gajim/command_system/implementation/standard.py:357 #, fuzzy msgid "Display names of all group chat occupants" msgstr "%s er ikke navnet på en gruppe samtale." #: gajim/command_system/implementation/standard.py:379 msgid "Forbid an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/standard.py:384 msgid "Allow an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/middleware.py:72 msgid "Error during command execution!" msgstr "" #: gajim/command_system/implementation/custom.py:106 msgid "The same as using a doc-string, except it supports translation" msgstr "" #: gajim/plugins/pluginmanager.py:611 gajim/plugins/pluginmanager.py:617 msgid "Archive corrupted" msgstr "" #: gajim/plugins/pluginmanager.py:613 #, fuzzy msgid "Archive empty" msgstr "Filen er tom" #: gajim/plugins/pluginmanager.py:625 gajim/plugins/pluginmanager.py:633 #: gajim/plugins/gui.py:264 #, fuzzy msgid "Archive is malformed" msgstr "Tjeneste sendte malformeret data" #: gajim/plugins/pluginmanager.py:641 gajim/plugins/gui.py:288 #: gajim/plugins/gui.py:296 #, fuzzy msgid "Plugin already exists" msgstr "Denne fil eksisterer allerede" #: gajim/plugins/gui.py:84 msgid "Plugin" msgstr "" #: gajim/plugins/gui.py:156 #, fuzzy, python-format msgid "Warning: %s" msgstr "Udeluk %s" #: gajim/plugins/gui.py:213 #, fuzzy msgid "Plugin failed" msgstr "Tilslutning fejlede" #: gajim/plugins/gui.py:256 msgid "Unable to properly remove the plugin" msgstr "" #: gajim/plugins/gui.py:288 msgid "Overwrite?" msgstr "" #: gajim/plugins/gui.py:320 #, fuzzy msgid "Configuration" msgstr "Rum Konfigurering" #: data/org.gajim.Gajim.desktop.in:5 msgid "Jabber IM Client" msgstr "Jabber IM Klient" #: data/org.gajim.Gajim.desktop.in:6 data/org.gajim.Gajim.appdata.xml.in:10 msgid "A GTK+ Jabber client" msgstr "En GTK+ Jabber klient" #: data/org.gajim.Gajim.desktop.in:8 msgid "chat;messaging;im;xmpp;bonjour;voip;" msgstr "" #: data/org.gajim.Gajim.desktop.in:12 msgid "org.gajim.Gajim" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:12 msgid "" "Gajim is a chat client to be used with Jabber.org, Live Journal Talk, " "Nimbuzz, Ovi, Talkonaut, and thousands of other services run by companies " "and ISPs, and volunteers around the world." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:16 msgid "" "If you have a few accounts on different servers, if you want to be in " "contact with your friends and family all the time, then Gajim is for you." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:19 #, fuzzy msgid "Features:" msgstr "Egenskaber" #: data/org.gajim.Gajim.appdata.xml.in:21 msgid "Tabbed chat window and single window modes" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:22 msgid "" "Group chat support (with Multi-User Chat protocol), invitation, chat to " "group chat transformation" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:23 msgid "Emoticons, avatars, PEP (user activity, mood and tune)" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:24 msgid "Audio / video conferences" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:25 #, fuzzy msgid "File transfer, room bookmarks" msgstr "Filoverførsel Fejl" #: data/org.gajim.Gajim.appdata.xml.in:26 msgid "Metacontacts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:27 msgid "Trayicon, speller, extended chat history functionalities" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:28 msgid "TLS, GPG and End-To-End encryption support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:29 msgid "Transport registration support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:30 #, fuzzy msgid "Service discovery including nodes, user search" msgstr "Opdag Tjenester med kontoen %s" #: data/org.gajim.Gajim.appdata.xml.in:31 msgid "Wikipedia, dictionary and search engine lookup" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:32 msgid "Multiple accounts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:33 #, fuzzy msgid "XML console interface" msgstr "XML Konsol" #: data/org.gajim.Gajim.appdata.xml.in:34 msgid "Link local (bonjour / zeroconf), BOSH" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:35 msgid "Other features via plugins" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:47 #, fuzzy msgid "Roster, list of contacts" msgstr "_Log status ændringer hos kontakter" #: data/org.gajim.Gajim.appdata.xml.in:51 msgid "Tabbed chat window" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:55 #, fuzzy msgid "Group chat support" msgstr "Gruppesamtaler" #: data/org.gajim.Gajim.appdata.xml.in:59 #, fuzzy msgid "Chat history" msgstr "For nylig:" #: data/org.gajim.Gajim.appdata.xml.in:63 #, fuzzy msgid "Plugin manager" msgstr "Tilslutning fejlede" #, fuzzy #~ msgid "" #~ "Install /\n" #~ "Upgrade" #~ msgstr "Hænger" #, fuzzy #~ msgid "Install/Upgrade" #~ msgstr "Hænger" #, fuzzy #~ msgid "Install and Upgrade Plugins" #~ msgstr "Hænger" #, fuzzy #~ msgid "Plugins updates" #~ msgstr "Tilslutning fejlede" #~ msgid "" #~ "Your configured emoticons theme has not been found, so emoticons have " #~ "been disabled." #~ msgstr "" #~ "Dit konfigurerede følelsesikon tema blev ikke fundet, så følelsesikoner " #~ "er blevet deaktiveret." #~ msgid "Shows or hides the roster window" #~ msgstr "Viser eller gemmer kontaktvinduet" #~ msgid "Shows or hides the ipython window" #~ msgstr "Viser eller gemmer ipython vinduet" #, fuzzy #~ msgid "XMPP account %s" #~ msgstr "XMPP konto %s@%s" #, fuzzy #~ msgid "Exception" #~ msgstr "Beskrivelse" #~ msgid "" #~ "someone@somewhere.com would like you to add some contacts " #~ "in your roster." #~ msgstr "" #~ "nogen@etsted.com vil gerne at du tilføjer nogen kontakter i " #~ "dit kontaktvindue." #~ msgid "" #~ "Ordered list (space separated) of connection type to try. Can contain " #~ "tls, ssl or plain" #~ msgstr "" #~ "En ordnet liste (adskilt af mellemrum) af forbindelses typer som skal " #~ "prøves. Kan indeholde tls, ssl eller plain" #~ msgid "_Actions" #~ msgstr "_Handlinger" #, fuzzy #~ msgid "Requires upower and python-dbus." #~ msgstr "Kræver python-dbus." #, fuzzy #~ msgid "Start Chat..." #~ msgstr "_Start Samtale..." #~ msgid "You are already in group chat %s" #~ msgstr "Du er allerede i en gruppe samtale %s" #~ msgid "Join Group Chat with account %s" #~ msgstr "Deltag i Gruppe Samtale med kontoen %s" #~ msgid "Invalid Account" #~ msgstr "Ugyldig Konto" #~ msgid "" #~ "You have to choose an account from which you want to join the groupchat." #~ msgstr "" #~ "Du må vælge en konto som du vil bruge til at tilslutte gruppe samtalen " #~ "med." #, fuzzy #~ msgid "Please enter the group chat JID as room@server." #~ msgstr "Gruppe samtale Jabber ID'en indeholder ikke tilladte tegn." #, fuzzy #~ msgid "The group chat JID contains invalid characters." #~ msgstr "Gruppe samtale Jabber ID'en indeholder ikke tilladte tegn." #~ msgid "Start Chat with account %s" #~ msgstr "Start en samtale med konto %s" #, fuzzy #~ msgid "" #~ "Fill in the nickname or the JID of the contact you would like\n" #~ "to send a chat message to:" #~ msgstr "" #~ "Udfyld kælenavnet eller Jabber ID'en for den kontakt du vil sende\n" #~ "en besked til:" #, fuzzy #~ msgid "Nickname / JID" #~ msgstr "Ugyldigt Jabber ID" #~ msgid "Unable to parse \"%s\"." #~ msgstr "Kan ikke fortolke \"%s\"." #~ msgid "Shows the chat dialog so that you can send messages to a contact" #~ msgstr "Vis samtale vinduet så du kan sende beskeder til en kontakt" #~ msgid "JID of the contact that you want to chat with" #~ msgstr "Kontaktens JID som du vil samtale med" #~ msgid "message content. The account must be specified or \"\"" #~ msgstr "besked indhold. Kontoen må specificeres eller \"\"" #~ msgid "Adds contact to roster" #~ msgstr "Tilføjer kontakt til kontaktvinduet" #~ msgid "jid" #~ msgstr "jid" #~ msgid "Adds new contact to this account" #~ msgstr "Tilføjer ny kontakt til denne konto" #~ msgid "Opens 'Start Chat' dialog" #~ msgstr "Åbner 'Start Samtale' vinduet" #~ msgid "Starts chat, using this account" #~ msgstr "Starter en samtale med denne konto" #, fuzzy #~ msgid "Handle a xmpp:/ URI" #~ msgstr "Håndter en xmpp:/ uri" #~ msgid "URI to handle" #~ msgstr "URI som skal håndteres" #~ msgid "Account in which you want to handle it" #~ msgstr "Den konto som du vil håndtere det med" #~ msgid "Message content" #~ msgstr "Besked indhold" #~ msgid "Join a MUC room" #~ msgstr "Deltag i et MUC rum" #~ msgid "Room JID" #~ msgstr "Rum JID" #~ msgid "Nickname to use" #~ msgstr "Kælenavn som skal bruges" #~ msgid "Password to enter the room" #~ msgstr "Adgangskode for at slutte sig til rummet" #~ msgid "Account from which you want to enter the room" #~ msgstr "Vælg den konto som du vil slutte dig til rummet med" #, fuzzy #~ msgid "Wrong URI" #~ msgstr "Forkert uri" #~ msgid "Nickname:" #~ msgstr "Kælenavn:" #~ msgid "Server:" #~ msgstr "Server:" #~ msgid "Password:" #~ msgstr "Adgangskode:" #, fuzzy #~ msgid "Join this room _automatically when I connect" #~ msgstr "Bliv med i dette rum automatisk når jeg tilsutter" #, fuzzy #~ msgid "Bro_wse Rooms" #~ msgstr "_Gennemse" #, fuzzy #~ msgid "Requires libgtkspell and libenchant." #~ msgstr "Kræver libgtkspell." #, fuzzy #~ msgid "Network-Watcher" #~ msgstr "Network-manager" #~ msgid "Autodetection of network status." #~ msgstr "Automatisk opdagelse af netværksstatus." #, fuzzy #~ msgid "Requires gnome-network-manager" #~ msgstr "Kræver gnome-network-manager og python-dbus." #, fuzzy #~ msgid "Feature not available, see Help->Features" #~ msgstr "Egenskab ikke tilgængelig under Windows." #, fuzzy #~ msgid "Send files" #~ msgstr "Send _Fil" #~ msgid "This contact does not support file transfer." #~ msgstr "Denne kontakt understøtter ikke fil overførsler." #, fuzzy #~ msgid "You need to know the real JID of the contact to send them a file." #~ msgstr "" #~ "Du trænger den rigtige JID fra kontakten for at kunne sende ham eller " #~ "hende en fil." #~ msgid "" #~ "You have to install %s dictionary to use spellchecking, or choose another " #~ "language by setting the speller_language option." #~ msgstr "" #~ "For at bruge stavekontrollen må du installer en %s ordbog, eller vælge et " #~ "andet sprog ved indstillingen for sprog til stavekontrollen." #~ msgid "Hides the buttons in chat windows." #~ msgstr "Skjuler knapperne i samtale vinduer." #~ msgid "Change your nickname (Ctrl+N)" #~ msgstr "Ændre dit kælenavn (Ctrl+N)" #~ msgid "Change the room's subject (Alt+T)" #~ msgstr "Ændre emne for rummet (Alt+T)" #~ msgid "Bookmark this room (Ctrl+B)" #~ msgstr "Bogmærk dette rom (Ctrl+B)" #~ msgid "Browse the chat history (Ctrl+H)" #~ msgstr "Gennemse samtale historik (Ctrl+H)" #, fuzzy #~ msgid "Show advanced functions (Alt+D)" #~ msgstr "Vis en menu med avancerede funktioner (Alt+A)" #~ msgid "Add this contact to roster (Ctrl+D)" #~ msgstr "Tilføj denne kontakt til kontaktvinduet (Ctrl+D)" #~ msgid "Invite contacts to the conversation (Ctrl+G)" #~ msgstr "Inviter kontakter til samtalen (Ctrl+G)" #, fuzzy #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Vis kontaktens profil (Ctrl+I)" #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Vis kontaktens profil (Ctrl+I)" #~ msgid "Ma_ke message windows compact" #~ msgstr "Gør samtalevinduer _kompakte" #~ msgid "Hide all buttons in chat windows" #~ msgstr "Skjul alle knapperne i samtale vinduer." #~ msgid "" #~ "If True, Gajim will ask for avatar each contact that did not have an " #~ "avatar last time or has one cached that is too old." #~ msgstr "" #~ "Hvis Sandt, vil Gajim spørge for en avatar for hver kontakt som ikke " #~ "havde en avatar sidste gang eller har en gemt som er for gammel." #~ msgid "Disk Write Error" #~ msgstr "Disk skrivefejl" #~ msgid "Set Custom _Avatar..." #~ msgstr "Angiv Personlig _Avatar..." #, fuzzy #~ msgid "SSL certificate validation" #~ msgstr "SSL certifikat validering" #~ msgid "" #~ "A library used to validate server certificates to ensure a secure " #~ "connection." #~ msgstr "" #~ "Et bibliotek brugt til at validere server certifikater for at sikre en " #~ "sikker forbindelse." #, fuzzy #~ msgid "Requires python-pyopenssl > 0.12 and pyasn1." #~ msgstr "Kræver python-pyopenssl." #, fuzzy #~ msgid "?CLI:room" #~ msgstr "rum" #, fuzzy #~ msgid "?CLI:nick" #~ msgstr "kælenavn" #, fuzzy #~ msgid "?CLI:password" #~ msgstr "adgangskode" #~ msgid "Use D-Bus and Notification-Daemon to show notifications" #~ msgstr "" #~ "Brug D-Bus og Påmindelses-dæmonen (Notification-Daemon) til at vise " #~ "påmindelser" #~ msgid "Notification" #~ msgstr "Påmindelse" #~ msgid "Passive popups notifying for new events." #~ msgstr "Passive pop op vinduer som påminder om nye hændelser." #~ msgid "" #~ "Requires python-notify or instead python-dbus in conjunction with " #~ "notification-daemon." #~ msgstr "" #~ "Kræver python-notify eller python-dbus i forbindelse med påmindelses-" #~ "dæmonen." #~ msgid "Ignore" #~ msgstr "Ignorer" #~ msgid "_Open Gmail Inbox" #~ msgstr "_Åbn Gmail Indboks" #~ msgid "Notify on new _GMail email" #~ msgstr "Påmind mig ved ny _GMail e-post" #~ msgid "" #~ "If checked, Gajim will show a notification when a new e-mail is received " #~ "via GMail" #~ msgstr "" #~ "Hvis valgt vil Gajim vise en påmindelse når en ny e-post er modtaget via " #~ "Gmail" #~ msgid "Display _extra email details" #~ msgstr "Vis _ekstra e-post detaljer" #, fuzzy #~ msgid "" #~ "If checked, Gajim will also include information about the sender of new " #~ "emails" #~ msgstr "" #~ "Hvis valgt vil Gajim også inkludere information om senderen af den nye e-" #~ "post" #~ msgid "GMail Options" #~ msgstr "GMail Indstillinger" #, fuzzy #~ msgid "20" #~ msgstr "0" #~ msgid "GMail Email Received" #~ msgstr "GMail E-post Modtaget" #, fuzzy #~ msgid "New e-mail on %(gmail_mail_address)s" #~ msgstr "Ny e-post på %(gmail_mail_address)s" #, fuzzy #~ msgid "You have %d new e-mail conversation" #~ msgid_plural "You have %d new e-mail conversations" #~ msgstr[0] "Du har %d ny e-post samtale" #~ msgstr[1] "Du har %d nye e-post samtaler" #~ msgid "" #~ "\n" #~ "\n" #~ "From: %(from_address)s\n" #~ "Subject: %(subject)s\n" #~ "%(snippet)s" #~ msgstr "" #~ "\n" #~ "\n" #~ "Fra: %(from_address)s\n" #~ "Emne: %(subject)s\n" #~ "%(snippet)s" #~ msgid "Re_name" #~ msgstr "Om_døb" #~ msgid "Resour_ce:" #~ msgstr "Ressour_ce:" #~ msgid "" #~ "Resource is sent to the Jabber server in order to separate the same JID " #~ "in two or more parts depending on the number of the clients connected in " #~ "the same server with the same account. So you might be connected in the " #~ "same account with resource 'Home' and 'Work' at the same time. The " #~ "resource which has the highest priority will get the events. (see below)" #~ msgstr "" #~ "Ressource bliver sendt til Jabber serveren for at separere den samme JID " #~ "i to eller flere dele afhængig af antallet klienter som tilsluttet til " #~ "den samme server med den samme konto. Det vil sige du kan være tilsluttet " #~ "med denne samme konto med ressourcerne 'Hjemme' og 'Arbejde' på den samme " #~ "tid. Ressourcen med den højeste prioritet vil få hændelserne. (se under)" #~ msgid "A_djust to status" #~ msgstr "_Tilpas til status" #~ msgid "Priority will change automatically according to your status." #~ msgstr "Prioritet vil automatisk ændres ifølge din status." #~ msgid "Anonymous authentication" #~ msgstr "Anonym godkendelse" #~ msgid "" #~ "Priority is used in Jabber to determine who gets the events from the " #~ "jabber server when two or more clients are connected using the same " #~ "account; The client with the highest priority gets the events" #~ msgstr "" #~ "Prioritet er brugt i Jabber for at bestemme hvem som får hændelser fra " #~ "jabber serveren når to eller flere klienter er tilsluttet med den samme " #~ "konto: Klienten med den højeste prioritet får hændelserne" #, fuzzy #~ msgid "Synchronize contacts" #~ msgstr "Synkroniser kontakter" #~ msgid "Click to request authorization to all contacts of another account" #~ msgstr "" #~ "Tryk for at forespørge om autorisering for alle kontakter af en anden " #~ "konto" #~ msgid "Chan_ge Password" #~ msgstr "Ænd_re Adgangskode" #~ msgid "Click to change account's password" #~ msgstr "Tryk for at ændre kontoens adgangskode" #~ msgid "Administration operations" #~ msgstr "Administrative handlinger" #, fuzzy #~ msgid "Browse..." #~ msgstr "_Gennemse" #, fuzzy #~ msgid "Certificate is e_ncrypted" #~ msgstr "Certifikatet afvist" #~ msgid "" #~ "If checked, Gajim, when launched, will automatically connect to jabber " #~ "using this account" #~ msgstr "" #~ "Hvis valgt vil Gajim vil Gajim, når den startes, automatisk tilslutte sig " #~ "til jabber med denne konto" #, fuzzy #~ msgid "Synchronize logs with server" #~ msgstr "Synkroniser kontakter" #~ msgid "Synch_ronize account status with global status" #~ msgstr "Synk_roniser konto status med global status" #~ msgid "" #~ "If checked, any change to the global status (handled by the combobox at " #~ "the bottom of the roster window) will change the status of this account " #~ "accordingly" #~ msgstr "" #~ "Hvis valgt vil en hvilket som helst ændring til den globale status " #~ "(håndteret med kombinationsfeltet i bunden af kontaktvinduet) ændre " #~ "status på denne konto" #~ msgid "" #~ "If checked, Gajim will also broadcast some more IPs except from just your " #~ "IP, so file transfer has higher chances of working." #~ msgstr "" #~ "Hvis valgt vil Gajim rundsende flere IP adresser udover din egen IP " #~ "adresse, filoverførsler har en større chance for at lykkes." #~ msgid "Proxy" #~ msgstr "Proxy" #~ msgid "" #~ "Check this so Gajim will ask you before sending your password over an " #~ "insecure connection." #~ msgstr "" #~ "Hvis valgt vil Gajim spørge dig før din adgangskode bliver sendt over en " #~ "usikker forbindelse." #~ msgid "Send _keep-alive packets" #~ msgstr "Send hold-i-live pa_kker" #~ msgid "" #~ "If checked, Gajim will send keep-alive packets to prevent connection " #~ "timeout which results in disconnection" #~ msgstr "" #~ "Hvis valgt vil Gajim sende hold-i-live pakker for at forhindre at " #~ "tilslutningen afbrydes pga et tidsudløb" #~ msgid "Use cust_om hostname/port" #~ msgstr "Brug tilpasset værtsnavn/p_ort" #~ msgid "_Hostname: " #~ msgstr "_Værtsnavn:" #~ msgid "_Port: " #~ msgstr "_Port: " #~ msgid "No key selected" #~ msgstr "Ingen nøgle er valgt" #~ msgid "Choose _Key..." #~ msgstr "Vælg _Nøgle..." #~ msgid "" #~ "If checked, Gajim will get the password from a GPG agent like seahorse" #~ msgstr "" #~ "Hvis valgt vil Gajim hente adgangskoden fra en GPG agent som seahorse" #~ msgid "OpenPGP" #~ msgstr "OpenPGP" #~ msgid "_Edit Personal Information..." #~ msgstr "R_ediger Personlig Information..." #~ msgid "Information about you, as stored in the server" #~ msgstr "Information om dig, som er gemt på serveren" #~ msgid "Personal Information" #~ msgstr "Personlig Information" #~ msgid "Co_nnect on Gajim startup" #~ msgstr "Tilslut _når Gajim startes" #~ msgid "Synchroni_ze account status with global status" #~ msgstr "Synk_roniser konto status med global status" #~ msgid "Use cust_om port:" #~ msgstr "Brug pers_onlig port:" #~ msgid "" #~ "If the default port that is used for incoming messages is unfitting for " #~ "your setup you can select another one here.\n" #~ "You might consider to change possible firewall settings." #~ msgstr "" #~ "Hvis den standard port der bruges til indkomne beskeder ikke passer dig " #~ "eller\n" #~ "din opsætning kan du vælge en anden her.\n" #~ "Du bør også ændre opsætning tilsvarende på en evt. brandmur." #~ msgid "Mer_ge accounts" #~ msgstr "Fle_t konti" #~ msgid "OpenPGP is not usable on this computer" #~ msgstr "Det er ikke muligt at bruge OpenPGP på denne computer" #~ msgid "To change the account name, you must be disconnected." #~ msgstr "For at ændre kontonavnet må du afbryde din tilslutning" #~ msgid "To change the account name, you must read all pending events." #~ msgstr "For at ændre kontonavnet må du læse alle ventende hændelser." #~ msgid "Account Name Already Used" #~ msgstr "Kontonavnet er allerede i brug" #~ msgid "" #~ "This name is already used by another of your accounts. Please choose " #~ "another name." #~ msgstr "" #~ "Dette navn er allerede brugt til en af dine andre konti. Vælg venligst et " #~ "andet navn." #~ msgid "Invalid account name" #~ msgstr "Ugyldigt kontonavn" #~ msgid "Account name cannot be empty." #~ msgstr "Kontonavnet kan ikke være tomt." #~ msgid "Account name cannot contain spaces." #~ msgstr "Kontonavnet kan ikke indeholde mellemrom." #~ msgid "Enter a new name for account %s" #~ msgstr "Indtast et nyt navn for kontoen %s" #, fuzzy #~ msgid "A JID must be in the form \"user@servername\"." #~ msgstr "Et Jabber ID må være på formen \"bruger@servernavn\"." #~ msgid "No such account available" #~ msgstr "Ingen konto ved det navn er tilgængelig" #~ msgid "" #~ "You must create your account before editing your personal information." #~ msgstr "" #~ "Du må oprette en konto før du kan redigere din personlige information." #~ msgid "Without a connection, you can not edit your personal information." #~ msgstr "" #~ "Uden en tilslutning kan du ikke redigere din personlige information." #, fuzzy #~ msgid "Your server does not have vCard support" #~ msgstr "Din server understøtter ikke Vcard" #~ msgid "Your server can't save your personal information." #~ msgstr "Din server kan ikke gemme din personlige information." #~ msgid "Account Local already exists." #~ msgstr "Den Lokale Konto eksisterer allerede." #~ msgid "Please rename or remove it before enabling link-local messaging." #~ msgstr "Omdøb eller fjern den før du aktiverer link-local beskeder." #~ msgid "THANKS:" #~ msgstr "TAK:" #~ msgid "Could not write to %s. Session Management support will not work" #~ msgstr "" #~ "Kunne ikke skrive til %s. Sessions håndterings understøttelse vil ikke " #~ "virke" #~ msgid "Jabber Traffic" #~ msgstr "Jabber Trafik" #~ msgid "_Enable" #~ msgstr "Aktiv_er" #, fuzzy #~ msgid "Filter" #~ msgstr "Skrifttype" #~ msgid "_IQ" #~ msgstr "_IQ" #~ msgid "Info/Query" #~ msgstr "Information/Forespørgsel (Info/Query)" #~ msgid "_Message" #~ msgstr "_Besked" #~ msgid "XML Input" #~ msgstr "XML Inddata" #~ msgid "XML Console for %s" #~ msgstr "XML Konsol for %s" #, fuzzy #~ msgid "Idle for:" #~ msgstr "XML Konsol for %s" #, fuzzy #~ msgid "" #~ "Request offline status messages from all contacts upon connecting. " #~ "WARNING: This causes a lot of requests to be sent!" #~ msgstr "" #~ "Spørg om offline status beskeder til alle offline kontakter når en " #~ "forbindelse til en konto bliver etableret. ADVARSEL: Dette forårsager en " #~ "masse forespørgsler!" #~ msgid "Last status: %s" #~ msgstr "Sidste status: %s" #~ msgid " since %s" #~ msgstr " siden %s" #~ msgid "since %s" #~ msgstr "siden %s" #, fuzzy #~ msgid "No" #~ msgstr "Ingen" #, fuzzy #~ msgid "Prefer" #~ msgstr "Indstillinger" #, fuzzy #~ msgid "Auto" #~ msgstr "Bliv automatisk med" #, fuzzy #~ msgid "otr" #~ msgstr "Varm" #, fuzzy #~ msgid "Invalid expire value" #~ msgstr "Ikke gyldigt server navn" #, fuzzy #~ msgid "There is an error" #~ msgstr "Tjeneste returnerede en fejl." #~ msgid "How many minutes should last lines from previous conversation last." #~ msgstr "Hvor mange minutter skal sidste linjer fra forrige samtale vare." #~ msgid "" #~ "Your configured emoticons theme cannot been loaded. You maybe need to " #~ "update the format of emoticons.py file. See http://trac.gajim.org/wiki/" #~ "Emoticons for more details." #~ msgstr "" #~ "Dit konfigurerede følelsesikon tema kan ikke findes. Du er måske nød til " #~ "at opdatere formatet for filen emoticons.py. Se http://trac.gajim.org/" #~ "wiki/Emoticons for flere detaljer." #~ msgid "You will be connected to %s without OpenPGP." #~ msgstr "Du vil blive tilsluttet til %s uden OpenPGP." #~ msgid "The following message was NOT encrypted" #~ msgstr "Den følgende besked var IKKE krypteret" #, fuzzy #~ msgid "Encryption used for this contact." #~ msgstr "Aktiver ESessions kryptering for denne konto." #~ msgid "Toggle Open_PGP Encryption" #~ msgstr "Slå til/fra Open_PGP Kryptering" #~ msgid "Toggle End to End Encryption" #~ msgstr "Slå til/fra ende til ende Kryptering" #, fuzzy #~ msgid "OpenPGP encryption enabled" #~ msgstr "GPG kryptering aktiveret" #, fuzzy #~ msgid "No OpenPGP key assigned" #~ msgstr "Ingen GPG nøgle valgt" #, fuzzy #~ msgid "" #~ "No OpenPGP key is assigned to this contact. So you cannot encrypt " #~ "messages with OpenPGP." #~ msgstr "" #~ "Ingen GPG nøgle er valgt for denne kontakt. Derfor kan du ikke kryptere " #~ "beskeder med GPG." #, fuzzy #~ msgid "OpenPGP encryption disabled" #~ msgstr "GPG kryptering ikke aktiveret" #~ msgid "Session WILL be logged" #~ msgstr "Session VIL blive logget" #~ msgid "Session WILL NOT be logged" #~ msgstr "Session VIL IKKE blive logget" #~ msgid "is" #~ msgstr "er" #~ msgid "is NOT" #~ msgstr "er IKKE" #~ msgid "will" #~ msgstr "vil" #~ msgid "will NOT" #~ msgstr "vil IKKE" #~ msgid "The following message was encrypted" #~ msgstr "Den følgende besked var krypteret" #, fuzzy #~ msgid "Toggle the OpenPGP encryption" #~ msgstr "Slå til/fra Open_PGP Kryptering" #~ msgid "Is OpenPGP enabled for this contact?" #~ msgstr "Er OpenPGP aktiveret for denne kontakt?" #~ msgid "" #~ "Should Gajim automatically start an encrypted session with this contact " #~ "when possible?" #~ msgstr "" #~ "Skal Gajim automatisk starte en krypteret session med denne kontakt når " #~ "det er muligt?" #~ msgid "Neither the remote presence is signed, nor a key was assigned." #~ msgstr "" #~ "Den fjerne tilstedeværelse er ikke signeret og en nøgle blev ikke angivet." #~ msgid "The contact's key (%s) does not match the key assigned in Gajim." #~ msgstr "Kontaktens nøgle (%s) passer ikke til den angivne nøgle i Gajim." #~ msgid "[This message is *encrypted* (See :XEP:`27`]" #~ msgstr "[Denne besked er *krypteret* (Se :XEP:`27`]" #~ msgid "" #~ "Your chat session with %(jid)s is encrypted.\n" #~ "\n" #~ "This session's Short Authentication String is %(sas)s." #~ msgstr "" #~ "Din samtale session med %(jid)s er krypteret.\n" #~ "\n" #~ "Denne sessions Korte Ægtheds Streng er: %(sas)s" #~ msgid "You have already verified this contact's identity." #~ msgstr "Du har allerede verificeret denne kontakts identitet." #~ msgid "Contact's identity verified" #~ msgstr "Kontaktens identitet er verificeret" #, fuzzy #~ msgid "Verify again…" #~ msgstr "Verificer igen..." #~ msgid "" #~ "To be certain that only the expected person can read your messages " #~ "or send you messages, you need to verify their identity by clicking the " #~ "button below." #~ msgstr "" #~ "For at være sikker på at kun den person du forventer kan læse dine " #~ "beskeder eller sende dig beskeder, må du verificere deres identitet ved " #~ "at trykke på knappen under." #~ msgid "Contact's identity NOT verified" #~ msgstr "Kontaktens identitet er IKKE verificeret" #, fuzzy #~ msgid "Verify…" #~ msgstr "Efterprø_v" #~ msgid "Have you verified the contact's identity?" #~ msgstr "Har du bekræftet den kontaktens identitet?" #~ msgid "" #~ "To prevent talking to an unknown person, you should speak to %(jid)s directly (in person or on the phone) and verify that they see the same " #~ "Short Authentication String (SAS) as you.\n" #~ "\n" #~ "This session's Short Authentication String is %(sas)s." #~ msgstr "" #~ "For at forhindre at du snakker til en ukendt person, bør du snakke " #~ "direkte til %(jid)s (person til person, eller på telefonen) og " #~ "verificere at de ser den samme Korte Ægtheds Streng (KÆS) som dig.\n" #~ "\n" #~ "Denne sessions Korte Ægtheds Streng: %(sas)s" #~ msgid "Did you talk to the remote contact and verify the SAS?" #~ msgstr "Har du snakket med den fjerne kontakt og verificeret KÆS?" #~ msgid "" #~ "The contact's key (%s) does not match the key assigned in Gajim." #~ msgstr "" #~ "Kontaktens nøgle (%s) passer ikke til den angivne nøgle i Gajim." #, fuzzy #~ msgid "" #~ "No OpenPGP key is assigned to this contact. So you cannot encrypt " #~ "messages." #~ msgstr "" #~ "Ingen GPG nøgle er tildelt denne kontakt. Derfor kan du ikke kryptere " #~ "beskeder." #, fuzzy #~ msgid "" #~ "OpenPGP key is assigned to this contact, but you do not trust their " #~ "key, so message cannot be encrypted. Use your OpenPGP client " #~ "to trust their key." #~ msgstr "" #~ "GPG nøgle er tildelt til denne kontakt, men du stoler ikke på denne " #~ "nøgle, så beskeder kan ikke krypteres. Brug din GPG klient til " #~ "at ændre dette." #, fuzzy #~ msgid "" #~ "OpenPGP Key is assigned to this contact, and you trust their key, so " #~ "messages will be encrypted." #~ msgstr "" #~ "GPG Nøgle er tildet til denne kontakt, og du stoler på denne nøgle, så " #~ "beskeder vil blive krypteret." #~ msgid "" #~ "This icon indicates that this message has not yet\n" #~ "been received by the remote end. If this icon stays\n" #~ "for a long time, it's likely the message got lost." #~ msgstr "" #~ "Dette ikon indikerer at denne besked endnu ikke\n" #~ "er blevet modtaget i den anden ende. Hvis dette\n" #~ "ikon forbliver på skærmen længe er det sandsynlig\n" #~ "at beskeden gik tabt." #~ msgid "" #~ "If True, listen to D-Bus signals from NetworkManager and change the " #~ "status of accounts (provided they do not have listen_to_network_manager " #~ "set to False and they sync with global status) based upon the status of " #~ "the network connection." #~ msgstr "" #~ "Hvis Sandt, lyt til D-Bus signaler fra NetworkManager og ændre status på " #~ "konti (forudsat at de ikke har listen_to_network_manager sat til Falsk og " #~ "de synkroniserer med global status) baseret på status af " #~ "netværksforbindelsen." #~ msgid "" #~ "The database file (%s) cannot be read. Try to repair it or remove it (all " #~ "history will be lost)." #~ msgstr "" #~ "Database filen (%s) kan ikke læses. Prøv at reparere den eller fjerne den " #~ "(hele historikken vil tabes)." #~ msgid "Database cannot be read." #~ msgstr "Database kan ikke læses." #~ msgid "A message from a non-valid JID arrived, it has been ignored." #~ msgstr "" #~ "En besked fra en ugyldig JID blev modtaget, den er blevet ignoreret." #~ msgid "Smooth scroll message in conversation window" #~ msgstr "Udglattet rulning af beskeder i samtale vinduet" #~ msgid "Show _XML Console" #~ msgstr "Vis _XML Konsol" #~ msgid "Edit _Privacy Lists..." #~ msgstr "Rediger _Privatlivs Liste..." #~ msgid "_Administrator" #~ msgstr "_Administrator" #~ msgid "Sends a message to users currently connected to this server" #~ msgstr "Send en besked til brugere som er tilsluttet denne server" #~ msgid "Sets Message of the Day" #~ msgstr "Sæt Dagens Besked" #~ msgid "Updates Message of the Day" #~ msgstr "Opdater Dagens Besked" #~ msgid "Deletes Message of the Day" #~ msgstr "Slet Dagens Besked" #~ msgid "Add _Contact..." #~ msgstr "_Tilføj Kontakt..." #~ msgid "_Accounts" #~ msgstr "K_ontoer" #~ msgid "Profile, A_vatar" #~ msgstr "Profil, A_vatar" #~ msgid "File _Transfers" #~ msgstr "Filover_førsler" #~ msgid "Help online" #~ msgstr "Hjælp på net" #~ msgid "Frequently Asked Questions (online)" #~ msgstr "Ofte Stillede Spørgsmål (på net)" #~ msgid "Fea_tures" #~ msgstr "_Egenskaber" #~ msgid "to %s account" #~ msgstr "til %s konto" #~ msgid "using %s account" #~ msgstr "bruger %s konto" #~ msgid "of account %s" #~ msgstr "fra konto %s" #~ msgid "for account %s" #~ msgstr "for konto %s" #~ msgid "" #~ "By removing this contact you also remove authorization resulting in him " #~ "or her always seeing you as offline." #~ msgstr "" #~ "Ved at fjerne denne kontakt fjerner du også godkendelsen, så han eller " #~ "hun vil altid se dig som offline." #~ msgid "Message Body

Lista prywatności" #: gajim/data/gui/privacy_list_window.ui:77 msgid "Active for this session" msgstr "Aktywny w tej sesji" #: gajim/data/gui/privacy_list_window.ui:94 msgid "Active on each startup" msgstr "P_ołącz przy starcie programu" #: gajim/data/gui/privacy_list_window.ui:132 msgid "List of rules" msgstr "Lista reguł" #: gajim/data/gui/privacy_list_window.ui:244 msgid "Add / Edit a rule" msgstr "Dodaj / Edytuj regułę" #: gajim/data/gui/privacy_list_window.ui:266 msgid "Allow" msgstr "Zezwól" #: gajim/data/gui/privacy_list_window.ui:282 msgid "Deny" msgstr "Odmów" #: gajim/data/gui/privacy_list_window.ui:317 msgid "JabberID" msgstr "JID" #: gajim/data/gui/privacy_list_window.ui:358 msgid "all in the group" msgstr "według grupy" #: gajim/data/gui/privacy_list_window.ui:407 msgid "all by subscription" msgstr "według autoryzacji" #: gajim/data/gui/privacy_list_window.ui:456 msgid "All" msgstr "wszystkim" #: gajim/data/gui/privacy_list_window.ui:493 msgid "to send me messages" msgstr "wysyłać mi wiadomości" #: gajim/data/gui/privacy_list_window.ui:509 msgid "to send me queries" msgstr "wysyłać kwerendy" #: gajim/data/gui/privacy_list_window.ui:525 msgid "to view my status" msgstr "widzieć mój status" #: gajim/data/gui/privacy_list_window.ui:541 msgid "to send me status" msgstr "wysyłać mi status" #: gajim/data/gui/privacy_list_window.ui:557 msgid "All (including subscription)" msgstr "Wszystko (łącznie z zubskrypcją)" #: gajim/data/gui/privacy_list_window.ui:598 msgid "Order:" msgstr "Kolejność:" #: gajim/data/gui/manage_sounds_window.ui:10 msgid "Manage sounds" msgstr "Zarządzaj dźwiękami" #: gajim/data/gui/remove_account_window.ui:56 msgid "Remove account _only from Gajim" msgstr "Usuń konto _tylko z Gajima" #: gajim/data/gui/remove_account_window.ui:73 msgid "Remove account from Gajim and from _server" msgstr "Usuń konto z Gajima i z _serwera" #: gajim/data/gui/remove_account_window.ui:94 msgid "What do you want to do?" msgstr "Co chcesz zrobić?" #: gajim/data/gui/adhoc_commands_window.ui:35 msgid "Please wait while retrieving command list..." msgstr "Proszę czekać, trwa pobieranie listy komend..." #: gajim/data/gui/adhoc_commands_window.ui:93 msgid "Choose command to execute:" msgstr "Wybierz komendę do wykonania:" #: gajim/data/gui/adhoc_commands_window.ui:136 #: gajim/data/gui/adhoc_commands_window.ui:277 msgid "Check once more" msgstr "Sprawdź ponownie" #: gajim/data/gui/adhoc_commands_window.ui:194 #, fuzzy msgid "Please wait while the command is being sent..." msgstr "Proszę czekać, trwa wysyłanie komendy..." #: gajim/data/gui/adhoc_commands_window.ui:211 msgid "Please wait..." msgstr "Proszę czekać..." #: gajim/data/gui/adhoc_commands_window.ui:257 msgid "This jabber entity does not expose any commands." msgstr "Ten obiekt Jabbera nie udostępnia żadnych komend." #: gajim/data/gui/adhoc_commands_window.ui:336 msgid "An error has occurred:" msgstr "Wystąpił błąd:" #: gajim/data/gui/adhoc_commands_window.ui:465 #, fuzzy msgid "F_inish" msgstr "_Zakończ" #: gajim/data/gui/account_context_menu.ui:20 msgid "_Personal Events" msgstr "_Zdarzenia" #: gajim/data/gui/account_context_menu.ui:49 msgid "_Add Contact..." msgstr "_Dodaj kontakt..." #: gajim/data/gui/account_context_menu.ui:57 msgid "_Discover Services" msgstr "_Wyszukuj usługi" #: gajim/data/gui/account_context_menu.ui:65 msgid "_Execute Command..." msgstr "_Wykonaj komendę" #: gajim/data/gui/esession_info_window.ui:50 msgid "_Verify" msgstr "_Weryfikuj" #: gajim/data/gui/esession_info_window.ui:137 msgid "(ESession info)" msgstr "Opis" #: gajim/data/gui/application_menu.ui:8 #, fuzzy msgid "View" msgstr "_Widok" #: gajim/data/gui/application_menu.ui:11 #, fuzzy msgid "Show Roster" msgstr "Pokaż _listę kontaktów" #: gajim/data/gui/application_menu.ui:16 #, fuzzy msgid "Show Offline Contacts" msgstr "Pokaż kontakty _niepołączone" #: gajim/data/gui/application_menu.ui:21 #, fuzzy msgid "Show Active Contacts" msgstr "Pokaż kontakty _połączone" #: gajim/data/gui/application_menu.ui:26 #, fuzzy msgid "Show Transports" msgstr "Pokaż trans_porty" #: gajim/data/gui/application_menu.ui:43 #, fuzzy msgid "Help" msgstr "_Pomoc" #: gajim/data/gui/application_menu.ui:46 #, fuzzy msgid "Contents" msgstr "_Zawartość" #: gajim/data/gui/application_menu.ui:50 #, fuzzy msgid "FAQ" msgstr "_FAQ" #: gajim/data/gui/application_menu.ui:54 msgid "Keyboard Shortcuts" msgstr "" #: gajim/data/gui/application_menu.ui:58 gajim/data/gui/features_window.ui:9 msgid "Features" msgstr "Możliwości programu" #: gajim/data/gui/application_menu.ui:76 msgid "Start Chat" msgstr "Rozpocznij rozmowę" #: gajim/data/gui/application_menu.ui:81 #, fuzzy msgid "Bookmarks" msgstr "Dodaj _zakładkę dla tego pokoju" #: gajim/data/gui/application_menu.ui:99 #, fuzzy msgid "Quit" msgstr "_Zakończ" #: gajim/data/gui/features_window.ui:26 msgid "List of possible features in Gajim:" msgstr "Lista możliwych funkcjonalności Gajima:" #: gajim/data/gui/manage_bookmarks_window.ui:14 msgid "Manage Bookmarks" msgstr "Zarządzaj zakładkami" #: gajim/data/gui/manage_bookmarks_window.ui:120 #, fuzzy msgid "_Title:" msgstr "Tytuł:" #: gajim/data/gui/manage_bookmarks_window.ui:146 msgid "Roo_m:" msgstr "_Pokój" #: gajim/data/gui/manage_bookmarks_window.ui:188 #, fuzzy msgid "A_uto join" msgstr "Połącz automatycznie" #: gajim/data/gui/manage_bookmarks_window.ui:193 msgid "If checked, Gajim will join this group chat on startup" msgstr "Zaznaczenie spowoduje łączenie z tym pokojem przy starcie programu" #: gajim/data/gui/manage_bookmarks_window.ui:207 #, fuzzy msgid "Minimi_ze on Auto Join" msgstr "Minimalizuj po automatycznym wejściu" #: gajim/data/gui/manage_bookmarks_window.ui:235 #, fuzzy msgid "Pr_int status:" msgstr "Wyświetlaj status:" #: gajim/data/gui/exception_dialog.ui:45 #, fuzzy msgid "" "A programming error has been detected. It probably is not fatal, but should " "be reported to the developers nonetheless." msgstr "" "Nie jest prawdopodnie krytyczny, ale powinien zostać mimo to zgłoszony " "deweloperom." #: gajim/data/gui/exception_dialog.ui:115 #, fuzzy msgid "Report Bug" msgstr "_Zgłoś Błąd" #: gajim/data/gui/subscription_request_window.ui:95 msgid "_Deny" msgstr "O_dmów" #: gajim/data/gui/subscription_request_window.ui:100 msgid "" "Deny authorization from contact so he or she cannot know when you're " "connected" msgstr "" "Odmów autoryzacji kontaktowi, nie będzie on wówczas wiedział kiedy jesteś " "połączony" #: gajim/data/gui/subscription_request_window.ui:133 msgid "Au_thorize" msgstr "_Autoryzuj" #: gajim/data/gui/subscription_request_window.ui:138 msgid "Authorize contact so he or she can know when you're connected" msgstr "Autoryzuj kontakt - będzie wówczas wiedział, kiedy jesteś połączony" #: gajim/data/gui/xml_console_window.ui:121 #, fuzzy msgid "Presence" msgstr "_Obecność" #: gajim/data/gui/xml_console_window.ui:134 msgid "Iq" msgstr "" #: gajim/data/gui/xml_console_window.ui:149 #, fuzzy msgid "Presets" msgstr "_Obecność" #: gajim/data/gui/chat_to_muc_window.ui:24 msgid "Invite Friends!" msgstr "Zaproś przyjaciół!" #: gajim/data/gui/chat_to_muc_window.ui:39 #, fuzzy msgid "" "You are now entering a groupchat.\n" "Select the contacts you want to invite" msgstr "" "Zamierzasz rozpocząć czat.\n" "Wybierz kontakty, które chcesz do niego zaprosić" #: gajim/data/gui/chat_to_muc_window.ui:67 #: gajim/data/gui/chat_to_muc_window.ui:78 msgid "column" msgstr "" #: gajim/data/gui/chat_to_muc_window.ui:112 msgid "Please select a MUC server." msgstr "Proszę wybrać serwer MUC." #: gajim/data/gui/chat_to_muc_window.ui:141 msgid "MUC server" msgstr "Serwer MUC" #: gajim/data/gui/chat_to_muc_window.ui:176 msgid "In_vite" msgstr "_Zaproś" #: gajim/data/gui/history_manager.ui:11 #, fuzzy msgid "_Export" msgstr "Eksport" #: gajim/data/gui/history_manager.ui:97 msgid "Gajim History Logs Manager" msgstr "Historia rozmów" #: gajim/data/gui/history_manager.ui:154 msgid "Welcome to Gajim History Logs Manager" msgstr "Witaj w menedżerze historii rozmów Gajima" #: gajim/data/gui/history_manager.ui:168 msgid "" "This log manager is not intended for log viewing. If you are looking for " "such functionality, use the history window instead.\n" "\n" "Use this program to delete or export logs. You can select logs from the left " "and/or search database from below." msgstr "" "Menedżer logów nie powinien być używany do przeglądania logów. Jeżeli " "szukasz tej funkcjonalności, użyj okna historii rozmów.\n" "\n" "Programu tego używać należy do usuwania lub eksportowania logów. Możesz " "wskazać logi po lewej stronie okna lub przeszukać ich bazę używając " "poniższego pola." #: gajim/data/gui/history_manager.ui:184 msgid "" "WARNING:\n" "If you plan to do massive deletions, please make sure Gajim is not running. " "Generally avoid deletions with contacts you currently chat with." msgstr "" "UWAGA:\n" "Jeżeli chcesz usuwać wiele danych, upewnij się najpierw że Gajim nie jest " "uruchomiony. Unikaj też usuwania historii rozmów kontaktów, z którymi " "właśnie rozmawiasz." #: gajim/data/gui/history_manager.ui:283 msgid "_Search Database" msgstr "_Szukaj w bazie" #: gajim/data/gui/shortcuts_window.ui:8 msgid "Chat Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:12 #, fuzzy msgid "Message composition" msgstr "Treść wiadomości" #: gajim/data/gui/shortcuts_window.ui:17 #, fuzzy msgid "Send the message" msgstr "Wyślij wiadomość" #: gajim/data/gui/shortcuts_window.ui:24 #, fuzzy msgid "Create a new line" msgstr "Utwórz nowy wpis" #: gajim/data/gui/shortcuts_window.ui:31 msgid "Select an emoticon" msgstr "" #: gajim/data/gui/shortcuts_window.ui:38 msgid "Complete a command or a nick" msgstr "" #: gajim/data/gui/shortcuts_window.ui:45 #, fuzzy msgid "Previous sent message" msgstr "Szablony opisów:" #: gajim/data/gui/shortcuts_window.ui:52 #, fuzzy msgid "Next sent messages" msgstr "Szablony opisów:" #: gajim/data/gui/shortcuts_window.ui:59 #, fuzzy msgid "Quote previous message" msgstr "informacja o statusie" #: gajim/data/gui/shortcuts_window.ui:66 #, fuzzy msgid "Quote next message" msgstr "Wyślij wiadomość" #: gajim/data/gui/shortcuts_window.ui:73 #, fuzzy msgid "Clear message entry" msgstr "Wiadomość została wysłana" #: gajim/data/gui/shortcuts_window.ui:81 gajim/data/gui/shortcuts_window.ui:231 #, fuzzy msgid "Appearance" msgstr "Tożsamość na czacie" #: gajim/data/gui/shortcuts_window.ui:86 msgid "Toggle full / compact view" msgstr "" #: gajim/data/gui/shortcuts_window.ui:94 #, fuzzy msgid "Recent history" msgstr "Ostatnio:" #: gajim/data/gui/shortcuts_window.ui:99 msgid "Scroll up" msgstr "" #: gajim/data/gui/shortcuts_window.ui:106 msgid "Scroll down" msgstr "" #: gajim/data/gui/shortcuts_window.ui:121 msgid "Tabs" msgstr "" #: gajim/data/gui/shortcuts_window.ui:126 msgid "Switch to the previous tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:133 msgid "Switch to the next tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:140 msgid "Switch to the first - ninth tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:147 msgid "Switch to the previous unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:154 msgid "Switch to the next unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:161 #, fuzzy msgid "Close chat" msgstr "Zamknij" #: gajim/data/gui/shortcuts_window.ui:172 msgid "Roster Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:195 #, fuzzy msgid "File transfers" msgstr "Przesyłane pliki" #: gajim/data/gui/shortcuts_window.ui:209 #, fuzzy msgid "Join a group chat" msgstr "w _konferencji" #: gajim/data/gui/shortcuts_window.ui:216 #, fuzzy msgid "Set the status message" msgstr "informacja o statusie" #: gajim/data/gui/shortcuts_window.ui:223 #, fuzzy msgid "Quit Gajim" msgstr "Gajim" #: gajim/data/gui/shortcuts_window.ui:236 #, fuzzy msgid "Show offline contacts" msgstr "Pokaż kontakty _niepołączone" #: gajim/data/gui/shortcuts_window.ui:243 #, fuzzy msgid "Show only active contacts" msgstr "Pokaż kontakty _połączone" #: gajim/data/gui/shortcuts_window.ui:250 msgid "Enable roster filtering" msgstr "" #: gajim/data/gui/shortcuts_window.ui:258 msgid "Contacts" msgstr "Kontakty" #: gajim/data/gui/shortcuts_window.ui:263 #, fuzzy msgid "Contact information" msgstr "Informacje o kontakcie" #: gajim/data/gui/shortcuts_window.ui:270 #, fuzzy msgid "Rename contact" msgstr "Zmień nazwę dla kontaktu" #: gajim/data/gui/shortcuts_window.ui:277 #, fuzzy msgid "Delete contact" msgstr "Wyślij kontakty:" #: gajim/data/gui/passphrase_dialog.ui:8 msgid "Passphrase" msgstr "Hasło" #: gajim/data/gui/history_window.ui:38 #, fuzzy msgid "Enter name / JID of contact or groupchat" msgstr "Wpisz JID lub nazwę kontaktu" #: gajim/data/gui/history_window.ui:51 msgid "Search:" msgstr "Szukaj" #: gajim/data/gui/history_window.ui:75 msgid "_In date search" msgstr "" #: gajim/data/gui/history_window.ui:79 msgid "Only searching within selected day" msgstr "" #: gajim/data/gui/history_window.ui:306 #, fuzzy msgid "_Show status changes" msgstr "_Zapisuj w logach zmiany statusów kontaktów" #: gajim/data/gui/manage_pep_services_window.ui:13 msgid "PEP Service Configuration" msgstr "Konfiguracja usługi PEP" #: gajim/data/gui/manage_pep_services_window.ui:69 msgid "_Configure" msgstr "_Konfiguruj" #: gajim/data/gui/groups_post_window.ui:9 msgid "Create new post" msgstr "Utwórz nowy wpis" #: gajim/data/gui/groups_post_window.ui:29 #: gajim/data/gui/single_message_window.ui:46 msgid "From:" msgstr "Od:" #: gajim/data/gui/groups_post_window.ui:41 #: gajim/data/gui/single_message_window.ui:70 msgid "Subject:" msgstr "Temat:" #: gajim/data/gui/data_form_window.ui:19 msgid "Fill in the form." msgstr "Wypełnij formularz." #: gajim/data/gui/data_form_window.ui:274 msgid "Room Configuration" msgstr "Konfiguracja pokoju" #: gajim/data/gui/roster_item_exchange_window.ui:8 msgid "Roster Item Exchange" msgstr "" #: gajim/data/gui/systray_context_menu.ui:12 msgid "Sta_tus" msgstr "Sta_tus" #: gajim/data/gui/systray_context_menu.ui:20 msgid "_Start Chat..." msgstr "_Rozpocznij rozmowę" #: gajim/data/gui/systray_context_menu.ui:50 msgid "Show All Pending _Events" msgstr "Pokaż wszystkie oczekujące _zdarzenia" #: gajim/data/gui/systray_context_menu.ui:59 msgid "Mute Sounds" msgstr "Wyłącz dźwięki" #: gajim/data/gui/systray_context_menu.ui:75 #, fuzzy msgid "_Preferences" msgstr "Ustawienia" #: gajim/data/gui/systray_context_menu.ui:90 #, fuzzy msgid "_Quit" msgstr "_Zakończ" #: gajim/data/gui/single_message_window.ui:59 msgid "To:" msgstr "Do:" #: gajim/data/gui/single_message_window.ui:118 msgid "0" msgstr "0" #: gajim/data/gui/single_message_window.ui:210 msgid "Sen_d" msgstr "_Wyślij" #: gajim/data/gui/single_message_window.ui:216 msgid "Send message" msgstr "Wyślij wiadomość" #: gajim/data/gui/single_message_window.ui:229 msgid "_Reply" msgstr "_Odpowiedz" #: gajim/data/gui/single_message_window.ui:235 msgid "Reply to this message" msgstr "Odpowiedz na tę wiadomość" #: gajim/data/gui/single_message_window.ui:248 msgid "_Send & Close" msgstr "_Wyślij i zamknij" #: gajim/data/gui/single_message_window.ui:254 msgid "Send message and close window" msgstr "Wyślij wiadomość i zamknij okno" #: gajim/data/gui/change_activity_dialog.ui:8 msgid "Set Activity" msgstr "Ustaw Aktywność" #: gajim/data/gui/change_activity_dialog.ui:65 msgid "Set an activity" msgstr "Ustaw Aktywność" #: gajim/data/gui/change_activity_dialog.ui:337 msgid "Message: " msgstr "Wiadomość:" #: gajim/command_system/mapping.py:164 gajim/command_system/mapping.py:174 #: gajim/command_system/mapping.py:194 #, fuzzy msgid "Missing arguments" msgstr "Brak argumentu \"contact_jid\"" #: gajim/command_system/mapping.py:261 #, fuzzy msgid "Too many arguments" msgstr "Brak argumentu \"contact_jid\"" #: gajim/command_system/implementation/execute.py:53 msgid "Execute expression inside a shell, show output" msgstr "" #: gajim/command_system/implementation/execute.py:109 msgid "Execute expression inside a shell, send output" msgstr "" #: gajim/command_system/implementation/standard.py:45 msgid "" "Show help on a given command or a list of available commands if -a is given" msgstr "" #: gajim/command_system/implementation/standard.py:72 #, fuzzy msgid "Send a message to the contact" msgstr "Użycie: /%s wysyła wiadomość do kontaktu" #: gajim/command_system/implementation/standard.py:77 msgid "Send action (in the third person) to the current chat" msgstr "" #: gajim/command_system/implementation/standard.py:82 msgid "Show logged messages which mention given text" msgstr "" #: gajim/command_system/implementation/standard.py:87 #, fuzzy, python-format msgid "%s: Nothing found" msgstr "Nie znaleziono %s" #: gajim/command_system/implementation/standard.py:93 msgid "Limit must be an integer" msgstr "Limit musi być wartością integer" #: gajim/command_system/implementation/standard.py:117 msgid "" "\n" " Set the current status\n" "\n" " Status can be given as one of the following values:\n" " online, away, chat, xa, dnd.\n" " " msgstr "" "\n" " Ustaw obecny status\n" "\n" " Status może otrzymać następujące wartości:\n" " online, away, chat, xa, dnd.\n" " " #: gajim/command_system/implementation/standard.py:135 msgid "Set the current status to away" msgstr "" #: gajim/command_system/implementation/standard.py:149 msgid "Set the current status to online" msgstr "" #: gajim/command_system/implementation/standard.py:152 #, fuzzy msgid "Available" msgstr "Dostępny" #: gajim/command_system/implementation/standard.py:172 #: gajim/command_system/implementation/standard.py:249 #, fuzzy msgid "Clear the text window" msgstr "Użycie: /%s czyście okno tekstowe." #: gajim/command_system/implementation/standard.py:177 #: gajim/command_system/implementation/standard.py:389 #, fuzzy msgid "Send a ping to the contact" msgstr "Uzycie: /%s, wysyła sygnał ping do kontaktu" #: gajim/command_system/implementation/standard.py:180 #: gajim/command_system/implementation/standard.py:392 #, fuzzy msgid "Command is not supported for zeroconf accounts" msgstr "Komenda nie jest wspierana dla konta zeroconf." #: gajim/command_system/implementation/standard.py:184 msgid "Send DTMF sequence through an open audio session" msgstr "" #: gajim/command_system/implementation/standard.py:187 #, fuzzy msgid "No open audio sessions with the contact" msgstr "Kliknij by zobaczyć poprzednie rozmowy z tym kontaktem" #: gajim/command_system/implementation/standard.py:190 #, fuzzy, python-format msgid "%s is not a valid tone" msgstr "%s nie jest prawidłowym poziomem logowania" #: gajim/command_system/implementation/standard.py:197 msgid "Toggle audio session" msgstr "Przełącz sesję audio" #: gajim/command_system/implementation/standard.py:200 #, fuzzy msgid "Audio sessions are not available" msgstr "Połączenie jest niemożliwe" #: gajim/command_system/implementation/standard.py:207 msgid "Toggle video session" msgstr "Przełącz sesję wideo" #: gajim/command_system/implementation/standard.py:210 #, fuzzy msgid "Video sessions are not available" msgstr "Połączenie jest niedostępne" #: gajim/command_system/implementation/standard.py:217 msgid "Send a message to the contact that will attract his (her) attention" msgstr "" #: gajim/command_system/implementation/standard.py:256 #, fuzzy msgid "Change your nickname in a group chat" msgstr "Zmień swoją nazwę (Ctrl+N)" #: gajim/command_system/implementation/standard.py:266 #, fuzzy msgid "Open a private chat window with a specified occupant" msgstr "Użycie: /%s , otwiera okno prywatnej rozmowy z tą osobą." #: gajim/command_system/implementation/standard.py:272 #: gajim/command_system/implementation/standard.py:281 #: gajim/command_system/implementation/standard.py:327 #: gajim/command_system/implementation/standard.py:339 #: gajim/command_system/implementation/standard.py:351 #, fuzzy msgid "Nickname not found" msgstr "Pseudonim nie został odnaleziony: %s" #: gajim/command_system/implementation/standard.py:275 #, fuzzy msgid "" "Open a private chat window with a specified occupant and send him a message" msgstr "Użycie: /%s , otwiera okno prywatnej rozmowy z tą osobą." #: gajim/command_system/implementation/standard.py:284 #, fuzzy msgid "Display or change a group chat topic" msgstr "Zapytaj przed zamknięciem karty/okna rozmowy grupowej." #: gajim/command_system/implementation/standard.py:292 msgid "Invite a user to a room for a reason" msgstr "" #: gajim/command_system/implementation/standard.py:295 #, fuzzy, python-format msgid "Invited %(jid)s to %(room_jid)s" msgstr "%(contact_jid)s zaproszony do %(room_jid)s." #: gajim/command_system/implementation/standard.py:299 #, fuzzy msgid "Join a group chat given by a jid" msgstr "w _konferencji" #: gajim/command_system/implementation/standard.py:307 msgid "" "Leave the groupchat, optionally giving a reason, and close tab or window" msgstr "" #: gajim/command_system/implementation/standard.py:312 msgid "" "\n" " Ban user by a nick or a jid from a groupchat\n" "\n" " If given nickname is not found it will be treated as a jid.\n" " " msgstr "" #: gajim/command_system/implementation/standard.py:324 #, fuzzy msgid "Kick user by a nick from a groupchat" msgstr "Jestes zaproszony do rozmowy grupowej" #: gajim/command_system/implementation/standard.py:332 msgid "" "Set occupant role in group chat.\n" " Role can be given as one of the following values:\n" " moderator, participant, visitor, none" msgstr "" #: gajim/command_system/implementation/standard.py:337 #, fuzzy msgid "Invalid role given" msgstr "Niepoprawna nazwa serwera" #: gajim/command_system/implementation/standard.py:344 msgid "" "Set occupant affiliation in group chat.\n" " Affiliation can be given as one of the following values:\n" " owner, admin, member, outcast, none" msgstr "" #: gajim/command_system/implementation/standard.py:349 #, fuzzy msgid "Invalid affiliation given" msgstr "afiliacja została zmieniona " #: gajim/command_system/implementation/standard.py:357 #, fuzzy msgid "Display names of all group chat occupants" msgstr "Użycie: /%s , wyświetla osoby obecne w danym pokoju." #: gajim/command_system/implementation/standard.py:379 msgid "Forbid an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/standard.py:384 msgid "Allow an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/middleware.py:72 msgid "Error during command execution!" msgstr "Błąd podczas wykonywania polecenia" #: gajim/command_system/implementation/custom.py:106 msgid "The same as using a doc-string, except it supports translation" msgstr "" #: gajim/plugins/pluginmanager.py:611 gajim/plugins/pluginmanager.py:617 msgid "Archive corrupted" msgstr "" #: gajim/plugins/pluginmanager.py:613 #, fuzzy msgid "Archive empty" msgstr "Plik jest pusty" #: gajim/plugins/pluginmanager.py:625 gajim/plugins/pluginmanager.py:633 #: gajim/plugins/gui.py:264 #, fuzzy msgid "Archive is malformed" msgstr "Usługa wysłała niepoprawne dane" #: gajim/plugins/pluginmanager.py:641 gajim/plugins/gui.py:288 #: gajim/plugins/gui.py:296 #, fuzzy msgid "Plugin already exists" msgstr "Ten plik już istnieje" #: gajim/plugins/gui.py:84 #, fuzzy msgid "Plugin" msgstr "_Wtyczki" #: gajim/plugins/gui.py:156 #, fuzzy, python-format msgid "Warning: %s" msgstr "Zabanuj %s" #: gajim/plugins/gui.py:213 #, fuzzy msgid "Plugin failed" msgstr "Rejestracja nie powiodła się" #: gajim/plugins/gui.py:256 msgid "Unable to properly remove the plugin" msgstr "Nie można poprawnie usunąć wtyczki" #: gajim/plugins/gui.py:288 msgid "Overwrite?" msgstr "Nadpisać?" #: gajim/plugins/gui.py:320 #, fuzzy msgid "Configuration" msgstr "Konfiguracja pokoju" #: data/org.gajim.Gajim.desktop.in:5 msgid "Jabber IM Client" msgstr "Klient komunikatora Jabber" #: data/org.gajim.Gajim.desktop.in:6 data/org.gajim.Gajim.appdata.xml.in:10 msgid "A GTK+ Jabber client" msgstr "Klient Jabbera w GTK+" #: data/org.gajim.Gajim.desktop.in:8 msgid "chat;messaging;im;xmpp;bonjour;voip;" msgstr "" #: data/org.gajim.Gajim.desktop.in:12 msgid "org.gajim.Gajim" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:12 msgid "" "Gajim is a chat client to be used with Jabber.org, Live Journal Talk, " "Nimbuzz, Ovi, Talkonaut, and thousands of other services run by companies " "and ISPs, and volunteers around the world." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:16 msgid "" "If you have a few accounts on different servers, if you want to be in " "contact with your friends and family all the time, then Gajim is for you." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:19 #, fuzzy msgid "Features:" msgstr "Możliwości programu" #: data/org.gajim.Gajim.appdata.xml.in:21 msgid "Tabbed chat window and single window modes" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:22 msgid "" "Group chat support (with Multi-User Chat protocol), invitation, chat to " "group chat transformation" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:23 msgid "Emoticons, avatars, PEP (user activity, mood and tune)" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:24 #, fuzzy msgid "Audio / video conferences" msgstr "Audio / Video" #: data/org.gajim.Gajim.appdata.xml.in:25 #, fuzzy msgid "File transfer, room bookmarks" msgstr "Błąd przesyłania pliku" #: data/org.gajim.Gajim.appdata.xml.in:26 msgid "Metacontacts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:27 msgid "Trayicon, speller, extended chat history functionalities" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:28 msgid "TLS, GPG and End-To-End encryption support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:29 msgid "Transport registration support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:30 #, fuzzy msgid "Service discovery including nodes, user search" msgstr "Przeglądanie usług przy użyciu konta %s" #: data/org.gajim.Gajim.appdata.xml.in:31 msgid "Wikipedia, dictionary and search engine lookup" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:32 msgid "Multiple accounts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:33 #, fuzzy msgid "XML console interface" msgstr "Konsola XML" #: data/org.gajim.Gajim.appdata.xml.in:34 msgid "Link local (bonjour / zeroconf), BOSH" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:35 msgid "Other features via plugins" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:47 #, fuzzy msgid "Roster, list of contacts" msgstr "_Zapisuj w logach zmiany statusów kontaktów" #: data/org.gajim.Gajim.appdata.xml.in:51 msgid "Tabbed chat window" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:55 #, fuzzy msgid "Group chat support" msgstr "Pokoje" #: data/org.gajim.Gajim.appdata.xml.in:59 #, fuzzy msgid "Chat history" msgstr "Ostatnio:" #: data/org.gajim.Gajim.appdata.xml.in:63 #, fuzzy msgid "Plugin manager" msgstr "Rejestracja nie powiodła się" #, fuzzy #~ msgid "" #~ "Install /\n" #~ "Upgrade" #~ msgstr "Zainstalowany" #, fuzzy #~ msgid "Install/Upgrade" #~ msgstr "Zainstalowany" #, fuzzy #~ msgid "Install and Upgrade Plugins" #~ msgstr "Zainstalowany" #, fuzzy #~ msgid "Plugins updates" #~ msgstr "Rejestracja nie powiodła się" #, fuzzy #~ msgid "Security error during download" #~ msgstr "Błąd zabezpieczeń przy połączeniu z \"%s\"" #, fuzzy #~ msgid "Error in download" #~ msgstr "Błąd zabezpieczeń przy połączeniu z \"%s\"" #~ msgid "" #~ "Your configured emoticons theme has not been found, so emoticons have " #~ "been disabled." #~ msgstr "" #~ "Wybrany przez ciebie styl emotikonów nie został znaleziony, emotikony " #~ "będą wyłączone." #~ msgid "Shows or hides the roster window" #~ msgstr "Pokazuje lub ukrywa okno listy kontaktów" #~ msgid "Shows or hides the ipython window" #~ msgstr "Pokazuje lub ukrywa okno iptyhon" #, fuzzy #~ msgid "XMPP account %s" #~ msgstr "Konto XMPP %s@%s" #, fuzzy #~ msgid "Exception" #~ msgstr "Opis" #, fuzzy #~ msgid "" #~ "someone@somewhere.com would like you to add some contacts " #~ "in your roster." #~ msgstr "" #~ "%(jid)s chciałby %(action)s kilka kontaktów w Twoim " #~ "rosterze." #~ msgid "" #~ "Ordered list (space separated) of connection type to try. Can contain " #~ "tls, ssl or plain" #~ msgstr "" #~ "Lista połączeń (rozdzielona spacjami) zawierająca wykaz rodzajów " #~ "połączeń. Może zawierać tls, ssl lub plain" #~ msgid "_Actions" #~ msgstr "_Działania" #, fuzzy #~ msgid "Requires upower and python-dbus." #~ msgstr "Wymaga python-dbus" #, fuzzy #~ msgid "Start Chat..." #~ msgstr "_Rozpocznij rozmowę" #~ msgid "You are already in group chat %s" #~ msgstr "Już jesteś w pokoju %s" #~ msgid "Join Group Chat with account %s" #~ msgstr "Dołącz do pokoju z konta %s" #~ msgid "Invalid Account" #~ msgstr "Niepoprawne konto" #~ msgid "" #~ "You have to choose an account from which you want to join the groupchat." #~ msgstr "Wskaż konto, z którym chcesz wejść do pokoju" #, fuzzy #~ msgid "Please enter the group chat JID as room@server." #~ msgstr "Proszę wprowadzić JID konferencji w postaci pokój@serwer." #, fuzzy #~ msgid "The group chat JID contains invalid characters." #~ msgstr "Używane przez ciebie Jabber ID zawiera niedozwolone znaki." #~ msgid "Start Chat with account %s" #~ msgstr "Rozpocznij rozmowę z konta %s" #, fuzzy #~ msgid "" #~ "Fill in the nickname or the JID of the contact you would like\n" #~ "to send a chat message to:" #~ msgstr "" #~ "Wpisz JID lub nazwę użytkownika kontaktu, któremu chcesz\n" #~ "wysłać wiadomość:" #, fuzzy #~ msgid "Nickname / JID" #~ msgstr "Taki Jabber ID już istnieje!" #~ msgid "Unable to parse \"%s\"." #~ msgstr "Nie można sparsować \"%s\"." #~ msgid "Shows the chat dialog so that you can send messages to a contact" #~ msgstr "" #~ "Pokazuje okno dialogowe umożliwiające wysłanie wiadomości do kontaktu" #~ msgid "JID of the contact that you want to chat with" #~ msgstr "JID osoby, z którą chcesz porozmawiać" #~ msgid "Adds contact to roster" #~ msgstr "Dodaje kontakt do listy kontaktów" #~ msgid "jid" #~ msgstr "jid" #~ msgid "Adds new contact to this account" #~ msgstr "Dodaje nowy kontakt do tego konta" #~ msgid "Opens 'Start Chat' dialog" #~ msgstr "Otwiera okno dialogowe 'Rozpocznij rozmowę'" #~ msgid "Starts chat, using this account" #~ msgstr "Rozpocznij rozmowę z tego konta" #, fuzzy #~ msgid "Handle a xmpp:/ URI" #~ msgstr "Obsługuj URI xmpp:/" #~ msgid "URI to handle" #~ msgstr "URI do obsługi" #~ msgid "Account in which you want to handle it" #~ msgstr "Wskaż konto, z którym chcesz zsynchronizować kontakty" #~ msgid "Message content" #~ msgstr "Treść wiadomości" #~ msgid "Join a MUC room" #~ msgstr "Dołącz do nowego pokoju" #~ msgid "Room JID" #~ msgstr "Pokój:" #~ msgid "Nickname to use" #~ msgstr "Nick" #~ msgid "Password to enter the room" #~ msgstr "Hasło do pokoju" #~ msgid "Account from which you want to enter the room" #~ msgstr "Wskaż konto, z którym chcesz wejść do pokoju" #, fuzzy #~ msgid "No URI given" #~ msgstr "Nie podano uri" #, fuzzy #~ msgid "Wrong URI" #~ msgstr "Błędny adres URI" #~ msgid "Nickname:" #~ msgstr "Pseudonim:" #~ msgid "Server:" #~ msgstr "Serwer:" #~ msgid "Password:" #~ msgstr "Hasło:" #~ msgid "Join this room _automatically when I connect" #~ msgstr "_Automatycznie dołącz do tego pokoju po uzyskaniu połączenia" #~ msgid "Bro_wse Rooms" #~ msgstr "Prze_glądaj pokoje" #, fuzzy #~ msgid "Requires libgtkspell and libenchant." #~ msgstr "Wymaga libgtkspell" #, fuzzy #~ msgid "Last MAM id we are syncronized with" #~ msgstr "Czas ostatniej synchronizacji logów z serwerem" #, fuzzy #~ msgid "Network-Watcher" #~ msgstr "Menedżer sieci" #~ msgid "Autodetection of network status." #~ msgstr "Automatyczne wykrywanie stanu sieci." #, fuzzy #~ msgid "Requires gnome-network-manager" #~ msgstr "Wymaga gnome-network-manager oraz python-dbus." #, fuzzy #~ msgid "Feature not available, see Help->Features" #~ msgstr "Funkcjonalność niedostępna dla systemu Windows." #, fuzzy #~ msgid "Send files" #~ msgstr "Wyślij _plik" #~ msgid "This contact does not support file transfer." #~ msgstr "Ten kontakt nie może przesyłać i odbierać plików." #, fuzzy #~ msgid "You need to know the real JID of the contact to send them a file." #~ msgstr "Ty musisz znać prawdziwy JID kontaktu, aby wysłać jej/jemu plik." #~ msgid "" #~ "You have to install %s dictionary to use spellchecking, or choose another " #~ "language by setting the speller_language option." #~ msgstr "" #~ "Musisz zainstalować słownik %s aby aktywować sprawdzanie pisowni lub " #~ "wybrać inny język korzystać z opcji speller_langugage." #~ msgid "Hides the buttons in chat windows." #~ msgstr "Ukrywa przyciski w oknie czatu." #~ msgid "Change your nickname (Ctrl+N)" #~ msgstr "Zmień swoją nazwę (Ctrl+N)" #~ msgid "Change the room's subject (Alt+T)" #~ msgstr "Zmień temat pokoju (Ctrl+T)" #~ msgid "Bookmark this room (Ctrl+B)" #~ msgstr "Dodaj pokój do zakładek (Ctrl+B)" #~ msgid "Browse the chat history (Ctrl+H)" #~ msgstr "Historia wiadomości (Ctrl+H)" #, fuzzy #~ msgid "Show advanced functions (Alt+D)" #~ msgstr "Pokaż menu zaawansowanych funkcji (Alt+D)" #~ msgid "Add this contact to roster (Ctrl+D)" #~ msgstr "Dodaje kontakt do listy kontaktów (Ctrl+D)" #~ msgid "Invite contacts to the conversation (Ctrl+G)" #~ msgstr "Zaproś kontakt do rozmowy (Ctrl+G)" #, fuzzy #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Pokaż profil kontaktu (Ctrl+I)" #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Pokaż profil kontaktu (Ctrl+I)" #~ msgid "Ma_ke message windows compact" #~ msgstr "_Spraw by okna rozmowy były zwarte" #~ msgid "Hide all buttons in chat windows" #~ msgstr "Ukryj przyciski w oknie rozmowy" #, fuzzy #~ msgid "Hide the chat buttons" #~ msgstr "Użycie: /%s ukrywa przyciski czatu." #~ msgid "" #~ "If True, Gajim will ask for avatar each contact that did not have an " #~ "avatar last time or has one cached that is too old." #~ msgstr "" #~ "Jeśli ma wartość True, Gajim wyśle zapytanie o awatar każdego kontaktu, " #~ "który ostatnio nie miał awatara lub ma zapisany jedynie stary." #~ msgid "Disk Write Error" #~ msgstr "Błąd zapisu na dysk" #~ msgid "Set Custom _Avatar..." #~ msgstr "Ustaw własny _avatar..." #, fuzzy #~ msgid "SSL certificate validation" #~ msgstr "Sprawdzanie certyfikatu SSL" #~ msgid "" #~ "A library used to validate server certificates to ensure a secure " #~ "connection." #~ msgstr "" #~ "Biblioteka używana do weryfikacji certyfikatów w celu zapewnienia " #~ "bezpiecznego połączenia." #, fuzzy #~ msgid "Requires python-pyopenssl > 0.12 and pyasn1." #~ msgstr "Wymaga python-pyopenssl" #~ msgid "?CLI:uri" #~ msgstr "?CLI:uri" #, fuzzy #~ msgid "?CLI:room" #~ msgstr "pokój" #, fuzzy #~ msgid "?CLI:nick" #~ msgstr "nick" #, fuzzy #~ msgid "?CLI:password" #~ msgstr "hasło" #~ msgid "Use D-Bus and Notification-Daemon to show notifications" #~ msgstr "Korzystaj z DBus i Demona Powiadomień aby wyświetlać powiadomienia" #~ msgid "Notification" #~ msgstr "Powiadomienia" #~ msgid "Passive popups notifying for new events." #~ msgstr "Wyświetla okna informujące o nowych zdarzeniach." #~ msgid "" #~ "Requires python-notify or instead python-dbus in conjunction with " #~ "notification-daemon." #~ msgstr "" #~ "Wymaga python-notify lub python-dbus w połączeniu z notification-daemon." #~ msgid "Ignore" #~ msgstr "Ignoruj" #~ msgid "_Open Gmail Inbox" #~ msgstr "_Otwórz skrzynkę Gmail" #~ msgid "Notify on new _GMail email" #~ msgstr "Powiadamiaj o nowej poczcie na koncie _Gmail" #~ msgid "" #~ "If checked, Gajim will show a notification when a new e-mail is received " #~ "via GMail" #~ msgstr "" #~ "Jeżeli opcja ta zostanie uaktywniona, Gajim będzie również wyświetlał " #~ "informacje o nowej poczty w twojej skrzynce GMail" #~ msgid "Display _extra email details" #~ msgstr "Wyświetlaj _dodatkowe informacje o poczcie e-mail" #, fuzzy #~ msgid "" #~ "If checked, Gajim will also include information about the sender of new " #~ "emails" #~ msgstr "" #~ "Jeżeli opcja ta zostanie uaktywniona, Gajim będzie również wyświetlał " #~ "informacje o nadawcach nowej poczty w twojej skrzynce" #~ msgid "GMail Options" #~ msgstr "Opcje konta Gmail" #, fuzzy #~ msgid "12" #~ msgstr "1" #, fuzzy #~ msgid "20" #~ msgstr "2" #, fuzzy #~ msgid "Invited %s to %s" #~ msgstr "Wyślij %s do %s" #~ msgid "GMail Email Received" #~ msgstr "Nowa poczta na koncie Gmail" #, fuzzy #~ msgid "New e-mail on %(gmail_mail_address)s" #~ msgstr "Nowa poczta w skrzynce %(gmail_mail_address)s" #, fuzzy #~ msgid "You have %d new e-mail conversation" #~ msgid_plural "You have %d new e-mail conversations" #~ msgstr[0] "Masz %d nieprzeczytaną wiadomość pocztową" #~ msgstr[1] "Masz %d nieprzeczytane wiadomości pocztowe" #~ msgstr[2] "Masz %d nieprzeczytane wiadomości pocztowe" #~ msgid "" #~ "\n" #~ "\n" #~ "From: %(from_address)s\n" #~ "Subject: %(subject)s\n" #~ "%(snippet)s" #~ msgstr "" #~ "\n" #~ "\n" #~ "Od: %(from_address)s\n" #~ "Temat: %(subject)s\n" #~ "%(snippet)s" #~ msgid "Re_name" #~ msgstr "_Zmień nazwę" #~ msgid "Resour_ce:" #~ msgstr "Za_sób: " #~ msgid "" #~ "Resource is sent to the Jabber server in order to separate the same JID " #~ "in two or more parts depending on the number of the clients connected in " #~ "the same server with the same account. So you might be connected in the " #~ "same account with resource 'Home' and 'Work' at the same time. The " #~ "resource which has the highest priority will get the events. (see below)" #~ msgstr "" #~ "Informację wysłano do serwera w celu rozdzielenia tego samego JID na dwie " #~ "lub więcej części, w zależności od liczby klientów połączonych z serwerem " #~ "z tego samego konta. Możesz być połączony z z tym samym kontem z " #~ "informacjami 'Dom' i 'Praca' w tym samym czasie. Klient o najwyższym " #~ "będzie odbierał wiadomości (patrz niżej)" #~ msgid "A_djust to status" #~ msgstr "D_ostosuj do statusu" #~ msgid "Priority will change automatically according to your status." #~ msgstr "" #~ "Priorytet ulegnie zmianie automatycznie, stosownie do twojego statusu." #~ msgid "Anonymous authentication" #~ msgstr "Używaj autoryzacji serwera proxy" #~ msgid "" #~ "Priority is used in Jabber to determine who gets the events from the " #~ "jabber server when two or more clients are connected using the same " #~ "account; The client with the highest priority gets the events" #~ msgstr "" #~ "Priorytet służy do określenia, który program ma odbierać wiadomości z " #~ "serwera gdy dwa klienty (lub więcej) są połączone z tym samym kontem. Ten " #~ "który ma wyższy priorytet, będzie odbierał wiadomości" #, fuzzy #~ msgid "Synchronize contacts" #~ msgstr "Synchronizuj kontakty" #~ msgid "Click to request authorization to all contacts of another account" #~ msgstr "" #~ "Kliknij aby poprosić o autoryzację od wszystkich kontaktów z innego konta" #~ msgid "Chan_ge Password" #~ msgstr "Z_mień hasło" #~ msgid "Click to change account's password" #~ msgstr "Kliknij, aby zmienić hasło dla konta" #~ msgid "Administration operations" #~ msgstr "Operacje administracyjne" #~ msgid "_Client Cert File:" #~ msgstr "Plik _certyfikatu klienta" #~ msgid "Browse..." #~ msgstr "Prze_glądaj..." #, fuzzy #~ msgid "Certificate is e_ncrypted" #~ msgstr "Certyfikat odrzucony" #~ msgid "" #~ "If checked, Gajim, when launched, will automatically connect to jabber " #~ "using this account" #~ msgstr "" #~ "Zaznaczanie tej opcji spowoduje automatyczne łączenie z siecią Jabber z " #~ "wykorzystaniem tego konta" #, fuzzy #~ msgid "Synchronize logs with server" #~ msgstr "Synchronizuj kontakty" #~ msgid "Synch_ronize account status with global status" #~ msgstr "Synch_ronizuj status konta z globalnym statusem" #~ msgid "" #~ "If checked, any change to the global status (handled by the combobox at " #~ "the bottom of the roster window) will change the status of this account " #~ "accordingly" #~ msgstr "" #~ "Jeśli jest zaznaczone, to każda zmiana statusu globalnego (ustawianego z " #~ "menu na dole okna listy kontaktów) wpłynie odpowiednio na status tego " #~ "konta" #~ msgid "" #~ "If checked, Gajim will also broadcast some more IPs except from just your " #~ "IP, so file transfer has higher chances of working." #~ msgstr "" #~ "Jeżeli opcja jest aktywna, Gajim roześle kilka dodatkowych adresów IP " #~ "poza Twoim, tak aby przesyłanie plików przebiegało sprawniej." #~ msgid "Proxy" #~ msgstr "Proxy" #~ msgid "" #~ "Check this so Gajim will ask you before sending your password over an " #~ "insecure connection." #~ msgstr "" #~ "Po uaktywnieniu tej opcji Gajim zapyta przed wysłaniem hasła przez " #~ "nieszyfrowane połączenie." #~ msgid "Send _keep-alive packets" #~ msgstr "Wysyłaj pakiety _podtrzymujące" #~ msgid "" #~ "If checked, Gajim will send keep-alive packets to prevent connection " #~ "timeout which results in disconnection" #~ msgstr "" #~ "Zaznaczenie tej opcji spowoduje wysyłanie pakietów podtrzymujących " #~ "połączenie, co zapobiega rozłączaniu" #~ msgid "Use cust_om hostname/port" #~ msgstr "Użyj wła_snej nazwy hosta/portu" #~ msgid "_Hostname: " #~ msgstr "_Nazwa hosta: " #~ msgid "_Port: " #~ msgstr "_Port:" #~ msgid "No key selected" #~ msgstr "Nie wybrano żadnego klucza" #~ msgid "Choose _Key..." #~ msgstr "Wybierz _klucz..." #~ msgid "" #~ "If checked, Gajim will get the password from a GPG agent like seahorse" #~ msgstr "" #~ "Zaznaczenie tej opcji spowoduje pobieranie hasła z agenta GPG, np. " #~ "Seahorse" #~ msgid "OpenPGP" #~ msgstr "OpenPGP" #~ msgid "_Edit Personal Information..." #~ msgstr "_Zmień informacje o sobie..." #~ msgid "Information about you, as stored in the server" #~ msgstr "Informacje o Tobie, takie jakie są przechowywane na serwerze" #~ msgid "Personal Information" #~ msgstr "Informacje o sobie" #~ msgid "Co_nnect on Gajim startup" #~ msgstr "P_ołącz przy starcie programu" #~ msgid "Synchroni_ze account status with global status" #~ msgstr "Synch_ronizuj status konta z globalnym statusem" #~ msgid "Use cust_om port:" #~ msgstr "Użyj inn_ego portu:" #~ msgid "" #~ "If the default port that is used for incoming messages is unfitting for " #~ "your setup you can select another one here.\n" #~ "You might consider to change possible firewall settings." #~ msgstr "" #~ "Jeżeli domyślny port, na którym przyjmowane są nadchodzące wiadomości nie " #~ "odpowiada ci, możesz wskazać numer portu, jakiego chcesz używać.\n" #~ "Konieczna stać się może ponowna konfiguracja firewalla." #~ msgid "Mer_ge accounts" #~ msgstr "_Połącz konta" #~ msgid "OpenPGP is not usable on this computer" #~ msgstr "Nie można używać OpenPGP na tym komputerze" #~ msgid "To change the account name, you must be disconnected." #~ msgstr "Aby zmienić nazwę konta, musisz być rozłączony." #~ msgid "To change the account name, you must read all pending events." #~ msgstr "" #~ "Aby zmienić nazwę konta, musisz przeczytać wszystkie zaległe wiadomości." #~ msgid "Account Name Already Used" #~ msgstr "Konto o takiej nazwie już istnieje" #~ msgid "" #~ "This name is already used by another of your accounts. Please choose " #~ "another name." #~ msgstr "Posiadasz już konto o tej nazwie. Zmień nazwę konta na unikalną." #~ msgid "Invalid account name" #~ msgstr "Niepoprawna nazwa konta" #~ msgid "Account name cannot be empty." #~ msgstr "Nazwa konta nie może być pusta." #~ msgid "Account name cannot contain spaces." #~ msgstr "Nazwa konta nie może zawierać spacji." #~ msgid "Enter a new name for account %s" #~ msgstr "Wpisz nową nazwę dla kontaktu %s." #, fuzzy #~ msgid "A JID must be in the form \"user@servername\"." #~ msgstr "Jabber ID musi być postaci \"użytkownik@nazwaserwera\"." #~ msgid "No such account available" #~ msgstr "Takie konto nie jest dostępne" #~ msgid "" #~ "You must create your account before editing your personal information." #~ msgstr "Musisz najpierw stworzyć konto by móc edytować informacje o sobie." #~ msgid "Without a connection, you can not edit your personal information." #~ msgstr "Musisz być połączony, aby móc zmieniać informacje o sobie." #, fuzzy #~ msgid "Your server does not have vCard support" #~ msgstr "Twój serwer nie akceptuje Vcard" #~ msgid "Your server can't save your personal information." #~ msgstr "Twój serwer nie potrafi zapisać informacji osobistych." #~ msgid "Account Local already exists." #~ msgstr "Konto o takiej nazwie już istnieje." #~ msgid "Please rename or remove it before enabling link-local messaging." #~ msgstr "" #~ "Proszę go zmienić lub usunąć przed uaktywnieniem komunikacji link-local." #~ msgid "THANKS:" #~ msgstr "Podziękowania:" #~ msgid "Could not write to %s. Session Management support will not work" #~ msgstr "" #~ "Nie można zapisywać do %s. Wsparcie dla Menadżera Sesji nie będzie działać" #~ msgid "Jabber Traffic" #~ msgstr "Jabber Traffic" #~ msgid "_Enable" #~ msgstr "_Włącz" #, fuzzy #~ msgid "Filter" #~ msgstr "Filtr" #~ msgid "_IQ" #~ msgstr "_IQ" #~ msgid "Info/Query" #~ msgstr "Informacje/Zapytanie" #~ msgid "_Message" #~ msgstr "Wiado_mość" #~ msgid "XML Input" #~ msgstr "Wejście XML" #~ msgid "XML Console for %s" #~ msgstr "Kosola XML dla %s" #, fuzzy #~ msgid "Idle for:" #~ msgstr "Bezczynny przez %s" #, fuzzy #~ msgid "" #~ "Request offline status messages from all contacts upon connecting. " #~ "WARNING: This causes a lot of requests to be sent!" #~ msgstr "" #~ "Pytaj o opis statusu \"Niepołączony\" wszystkich niepołączonych " #~ "kontaktów, kiedy jest połączenie z kontem. OSTRZEŻENIE: To może być " #~ "przyczyną wysyłania wielu zapytań!" #~ msgid "Last status: %s" #~ msgstr "Ostatni status %s" #~ msgid " since %s" #~ msgstr " od %s" #~ msgid "since %s" #~ msgstr "od %s" #, fuzzy #~ msgid "No" #~ msgstr "Żaden" #, fuzzy #~ msgid "Prefer" #~ msgstr "Ustawienia" #, fuzzy #~ msgid "Auto" #~ msgstr "Połącz automatycznie" #~ msgid "false" #~ msgstr "fałszywe" #~ msgid "stream" #~ msgstr "strumieniowane" #~ msgid "approve" #~ msgstr "zaakceptowane" #~ msgid "concede" #~ msgstr "przyznane" #~ msgid "forbid" #~ msgstr "zabronione" #~ msgid "prefer" #~ msgstr "zalecane" #~ msgid "require" #~ msgstr "wymagane" #~ msgid "expire" #~ msgstr "przedawnione" #~ msgid "otr" #~ msgstr "otr" #~ msgid "save" #~ msgstr "zapamiętane" #~ msgid "Last time we syncronized with logs from server." #~ msgstr "Czas ostatniej synchronizacji logów z serwerem" #, fuzzy #~ msgid "Invalid expire value" #~ msgstr "Niepoprawna nazwa serwera" #, fuzzy #~ msgid "There is an error" #~ msgstr "Wystąpił błąd" #~ msgid "How many minutes should last lines from previous conversation last." #~ msgstr "Ile minut powinny być widoczne linie z poprzedniej rozmowy." #~ msgid "" #~ "Your configured emoticons theme cannot been loaded. You maybe need to " #~ "update the format of emoticons.py file. See http://trac.gajim.org/wiki/" #~ "Emoticons for more details." #~ msgstr "" #~ "Ustawiony przez ciebie styl emotikonów nie mógł zostać załadowany. Ty " #~ "możesz potrzebować aktualizacji formatu pliku emoticons.file. Aby poznać " #~ "więcej szczegółów, zobacz http://trac.gajim.org/wiki/Emoticons." #~ msgid "You will be connected to %s without OpenPGP." #~ msgstr "Zostanie połączony z %s bez obsługi OpenPGP." #~ msgid "The following message was NOT encrypted" #~ msgstr "Ta wiadomość NIE została zaszyfrowana" #, fuzzy #~ msgid "Encryption used for this contact." #~ msgstr "Włączono szyfrowanie ESession dla tego konta." #~ msgid "Toggle Open_PGP Encryption" #~ msgstr "Włącz/wyłącz szyfrowanie Open_PGP" #~ msgid "Toggle End to End Encryption" #~ msgstr "Włącz/wyłącz _szyfrowanie połączenia" #, fuzzy #~ msgid "OpenPGP encryption enabled" #~ msgstr "Szyfrowanie GPG włączone" #, fuzzy #~ msgid "No OpenPGP key assigned" #~ msgstr "Nie ma przypisanego klucza GPG" #, fuzzy #~ msgid "" #~ "No OpenPGP key is assigned to this contact. So you cannot encrypt " #~ "messages with OpenPGP." #~ msgstr "" #~ "Nie ma klucza GPG przypisanego do tego kontaktu. Więc nie możesz " #~ "szyfrować wiadomości do tego kontaktu, używając GPG." #, fuzzy #~ msgid "OpenPGP encryption disabled" #~ msgstr "Szyfrowanie GPG wyłączone" #~ msgid "Session WILL be logged" #~ msgstr "Sesja BĘDZIE logowana" #~ msgid "Session WILL NOT be logged" #~ msgstr "Sesja NIE BĘDZIE logowana" #~ msgid "is" #~ msgstr "jest" #~ msgid "is NOT" #~ msgstr "NIE jest" #~ msgid "will" #~ msgstr "będzie" #~ msgid "will NOT" #~ msgstr "NIE będzie" #~ msgid "The following message was encrypted" #~ msgstr "Ta wiadomość została zaszyfrowana" #, fuzzy #~ msgid "Toggle the OpenPGP encryption" #~ msgstr "Włącz/wyłącz szyfrowanie Open_PGP" #~ msgid "Is OpenPGP enabled for this contact?" #~ msgstr "Czy OpenPGP jest włączone dla tego kontaktu?" #~ msgid "" #~ "Should Gajim automatically start an encrypted session with this contact " #~ "when possible?" #~ msgstr "" #~ "Czy Gajim powinien automatycznie rozpoczynać zaszyfrowana sesję z tym " #~ "kontaktem, jeśli to możliwe?" #~ msgid "Neither the remote presence is signed, nor a key was assigned." #~ msgstr "" #~ "Komunikat o statusie obecności nie jest podpisany, nie przypisano mu też " #~ "klucza." #~ msgid "The contact's key (%s) does not match the key assigned in Gajim." #~ msgstr "Klucz kontaktu (%s) nie pasuje do klucza przypisanego w Gajimie." #~ msgid "[This message is *encrypted* (See :XEP:`27`]" #~ msgstr "[Ta wiadomość jest zaszyfrowana (Zobacz :XEP: '27']" #~ msgid "" #~ "Your chat session with %(jid)s is encrypted.\n" #~ "\n" #~ "This session's Short Authentication String is %(sas)s." #~ msgstr "" #~ "Twoja rozmowa z %(jid)s jest szyfrowana.\n" #~ "\n" #~ "This session's Short Authentication String is %(sas)s." #~ msgid "You have already verified this contact's identity." #~ msgstr "Już zweryfikowałeś tożsamość tego kontaktu." #~ msgid "Contact's identity verified" #~ msgstr "Tożsamość rozmówcy zweryfikowana" #, fuzzy #~ msgid "Verify again…" #~ msgstr "Ponowna weryfikacja..." #~ msgid "" #~ "To be certain that only the expected person can read your messages " #~ "or send you messages, you need to verify their identity by clicking the " #~ "button below." #~ msgstr "" #~ "Aby być pewnym, że tylko oczekiwane osoby będą mogły czytać twoje " #~ "wiadomości lub wysyłać wiadomości do ciebie, powinieneś zweryfikować ich " #~ "tożsamość poprzez kliknięcie przycisku poniżej." #~ msgid "Contact's identity NOT verified" #~ msgstr "Tożsamość rozmówcy NIE zweryfikowana" #, fuzzy #~ msgid "Verify…" #~ msgstr "_Weryfikuj" #~ msgid "Have you verified the contact's identity?" #~ msgstr "Czy zweryfikowałeś/zweryfikowałaś tożsamość zdalnego rozmówcy?" #~ msgid "" #~ "To prevent talking to an unknown person, you should speak to %(jid)s directly (in person or on the phone) and verify that they see the same " #~ "Short Authentication String (SAS) as you.\n" #~ "\n" #~ "This session's Short Authentication String is %(sas)s." #~ msgstr "" #~ "Aby uniemożliwić rozmowę z nieznaną osobą, powinieneś porozmawiać z " #~ "%(jid)s bezpośrednio(np. przez telefon) i zweryfikować jej tożsamość, " #~ "ta osoba zobaczy ten sam Short Authentication String (SAS) jak ty.\n" #~ "Tej sesji Short Authentication String to %(sas)s." #~ msgid "Did you talk to the remote contact and verify the SAS?" #~ msgstr "Czy rozmawiałeś(aś) ze zdalnym rozmówcą i zweryfikowałeś(aś) SAS?" #~ msgid "" #~ "The contact's key (%s) does not match the key assigned in Gajim." #~ msgstr "" #~ "Klucz kontaktu (%s) nie pasuje do klucza przypisanego w Gajimie." #, fuzzy #~ msgid "" #~ "No OpenPGP key is assigned to this contact. So you cannot encrypt " #~ "messages." #~ msgstr "" #~ "Nie ma klucza GPG przypisanego do tego kontaktu. Więc nie możesz " #~ "szyfrować wiadomości do niego, używając GPG." #, fuzzy #~ msgid "" #~ "OpenPGP key is assigned to this contact, but you do not trust their " #~ "key, so message cannot be encrypted. Use your OpenPGP client " #~ "to trust their key." #~ msgstr "" #~ "Klucz GPG jest przypisany do tego kontaktu, lecz ty nie importowałeś " #~ "tego klucza, więc wiadomość nie będzie odszyfrowana. Użyj " #~ "twojego klienta GPG, aby importować klucz." #, fuzzy #~ msgid "" #~ "OpenPGP Key is assigned to this contact, and you trust their key, so " #~ "messages will be encrypted." #~ msgstr "" #~ "Ten użytkownik ma przypisany klucz, zweryfikowałeś ten klucz, więc " #~ "wiadomości będą szyfrowane" #~ msgid "" #~ "This icon indicates that this message has not yet\n" #~ "been received by the remote end. If this icon stays\n" #~ "for a long time, it's likely the message got lost." #~ msgstr "" #~ "Ta ikona wskazuje, że ta wiadomość jeszcze nie została\n" #~ "odebrana. Jeśli ta ikona zostanie przez długi czas,\n" #~ "może oznaczać, że wiadomości została zgubiona." #~ msgid "" #~ "If True, listen to D-Bus signals from NetworkManager and change the " #~ "status of accounts (provided they do not have listen_to_network_manager " #~ "set to False and they sync with global status) based upon the status of " #~ "the network connection." #~ msgstr "" #~ "Jeżeli opcja ustawiona jest na True, Gajim nasłuchuje komunikatów D-Bus " #~ "wysyłanych przez NetworkManagera i zmienia status poszczególnych kont (o " #~ "ile nie mają ustawionej opcji listen_to_network_manager) na False i " #~ "synchronizują się ze statusem globalnym) w oparciu o status " #~ "wykorzystywanego połączenia sieciowego." #~ msgid "" #~ "The database file (%s) cannot be read. Try to repair it or remove it (all " #~ "history will be lost)." #~ msgstr "" #~ "Plik (%s) bazy danych nie może zostać odczytany. Spróbuj to naprawić lub " #~ "usunąć ten plik (cała historia rozmów będzie usunięta)." #~ msgid "Database cannot be read." #~ msgstr "Baza danych nie może zostać odczytana." #~ msgid "A message from a non-valid JID arrived, it has been ignored." #~ msgstr "Doszła wiadomość od nieprawidłowego JID, będzie zignorowana" #~ msgid "Smooth scroll message in conversation window" #~ msgstr "Płynne przewijanie w oknie rozmowy" #~ msgid "Show _XML Console" #~ msgstr "Konsola _XML" #~ msgid "Edit _Privacy Lists..." #~ msgstr "_Edytuj listy prywatności" #~ msgid "_Administrator" #~ msgstr "_Administrator" #~ msgid "Sends a message to users currently connected to this server" #~ msgstr "" #~ "Wysyła wiadomość do użytkowników aktualnie połączonych z tym serwerem" #~ msgid "Sets Message of the Day" #~ msgstr "Ustawia Wiadomość Dnia" #~ msgid "Updates Message of the Day" #~ msgstr "Uaktualnia Wiadomość Dnia" #~ msgid "Deletes Message of the Day" #~ msgstr "Usuwa Wiadomość Dnia" #~ msgid "Add _Contact..." #~ msgstr "Dodaj _kontakt..." #~ msgid "_Accounts" #~ msgstr "_Konta" #~ msgid "Profile, A_vatar" #~ msgstr "Profil, _Awatar" #~ msgid "P_lugins" #~ msgstr "_Wtyczki" #~ msgid "File _Transfers" #~ msgstr "_Przesyłanie plików" #~ msgid "Help online" #~ msgstr "Pomoc w sieci" #~ msgid "Frequently Asked Questions (online)" #~ msgstr "Najczęściej Zadawane Pytania (w sieci)" #~ msgid "Fea_tures" #~ msgstr "_Możliwości programu" #~ msgid "to %s account" #~ msgstr "do konta %s" #~ msgid "using %s account" #~ msgstr "używając konta %s" #~ msgid "of account %s" #~ msgstr "dla konta %s" #~ msgid "for account %s" #~ msgstr "dla konta %s" #~ msgid "" #~ "By removing this contact you also remove authorization resulting in him " #~ "or her always seeing you as offline." #~ msgstr "" #~ "Usuwając kontakt cofniesz mu również autoryzację, co spowoduje, że " #~ "kontakt będzie zawsze widział Cię jako rozłączonego." #~ msgid "Invalid Jabber ID" #~ msgstr "Niepoprawny Jabber ID" #~ msgid "Verify..." #~ msgstr "Weryfikowanie..." #~ msgid "This file is being used by another process." #~ msgstr "Ten plik jest używany przez inny proces." #~ msgid "pgp key" #~ msgstr "klucz pgp" #~ msgid "" #~ "Sends new single message to a contact in the roster. Both OpenPGP key and " #~ "account are optional. If you want to set only 'account', without 'OpenPGP " #~ "key', just set 'OpenPGP key' to ''." #~ msgstr "" #~ "Wysyła nową wiadomość do kontaktu z listy. Zarówno klucz OpenPGP jak i " #~ "konto nie są wymagane. Jeśli chcesz ustawić jedynie 'konto' bez 'klucza " #~ "OpenPGP', to ustaw 'klucz OpenPGP' na ''." #, fuzzy #~ msgid "Please first choose another theme as your current theme." #~ msgstr "Ustaw najpierw inny motyw." #~ msgid "A non-privacy-related room configuration change has occurred" #~ msgstr "Nastąpiła zmiana konfiguracji pokoju (nie powiązana z prywatnością)" #, fuzzy #~ msgid "Maximum number of users for %s has been reached" #~ msgstr "Osiągnięto maksymalną liczbę użytkowników dla %s" #~ msgid "Your passphrase is incorrect" #~ msgstr "Twoje hasło jest niepoprawne" #, fuzzy #~ msgid "OpenPGP Passphrase Incorrect" #~ msgstr "Niepoprawne hasło OpenPGP" #, fuzzy #~ msgid "OpenPGP key not trusted" #~ msgstr "GPG nie jest zaufany" #~ msgid "You successfully received %(filename)s from %(name)s." #~ msgstr "Otrzymałeś plik %(filename)s od %(name)s." #, fuzzy #~ msgid "Set logs directory" #~ msgstr "tworzenie katalogu %s" #~ msgid "Chats" #~ msgstr "Rozmowy" #~ msgid "_Manage Bookmarks..." #~ msgstr "_Zarządzaj zakładkami..." #~ msgid "Change Status Message..." #~ msgstr "Zmień opis statusu..." #~ msgid "_Change Status Message..." #~ msgstr "_Zmień opis statusu..." #~ msgid "" #~ "You are not interested in the contact's presence, and neither he/she is " #~ "interested in yours" #~ msgstr "" #~ "Nie jesteś zainteresowany informacjami o statusie kontaktu i on również " #~ "nie jest zainteresowany twoim" #~ msgid "Error description..." #~ msgstr "Opis błędu..." #, fuzzy #~ msgid "View contact information (Ctrl+I)" #~ msgstr "Zaproś kontakt do rozmowy (Ctrl+G)" #~ msgid "3" #~ msgstr "3" #~ msgid "4" #~ msgstr "4" #~ msgid "5" #~ msgstr "5" #~ msgid "6" #~ msgstr "6" #~ msgid "7" #~ msgstr "7" #~ msgid "8" #~ msgstr "8" #~ msgid "9" #~ msgstr "9" #, fuzzy #~ msgid "Groupchat Histories" #~ msgstr "Pokoje" #, fuzzy #~ msgid "All Chat Histories" #~ msgstr "Stare historie" #~ msgid "" #~ msgstr "" #~ msgid "homepage url" #~ msgstr "adres strony domowej" #~ msgid "More" #~ msgstr "Więcej" #~ msgid "creating %s directory" #~ msgstr "tworzenie katalogu %s" #~ msgid "" #~ "If True, Gajim will use KDE Wallet (if kwalletcli is available) to store " #~ "account passwords." #~ msgstr "" #~ "Po włączeniu Gajim użyje aplikacji KDE Wallet do przechowywania haseł (o " #~ "ile biblioteka kwalletcli jest zainstalowana)." #, fuzzy #~ msgid "Please check if avahi/bonjour-daemon is running." #~ msgstr "Proszę sprawdzić czy uruchomiony jest demon Avahi." #~ msgid "%s is not the name of a group chat." #~ msgstr "%s nie jest nazwą czatu." #~ msgid "Session Management" #~ msgstr "Zarządzanie sesją" #~ msgid "Gajim session is stored on logout and restored on login." #~ msgstr "" #~ "Sesja jest zapisywana przy wylogowaniu z serwera i przywracana przy " #~ "logowaniu." #~ msgid "Requires python-gnome2." #~ msgstr "Wymaga python-gnome2." #~ msgid "Requires gnome-keyring and python-gnome2-desktop, or kwalletcli." #~ msgstr "Wymaga gnome-keyring oraz python-gnome2-desktop albo kwalletcli." #~ msgid "SRV" #~ msgstr "SRV" #~ msgid "Ability to connect to servers which are using SRV records." #~ msgstr "Możliwość połączenia z serwerami, które używają rekordów SRV." #~ msgid "Requires dnsutils." #~ msgstr "Wymaga dnsutils." #~ msgid "Requires nslookup to use SRV records." #~ msgstr "Wymaga nslookup." #~ msgid "Gajim needs X server to run. Quiting..." #~ msgstr "Gajim wymaga do działania serwera X. Zamykanie programu..." #~ msgid "importing PyGTK failed: %s" #~ msgstr "import PyGTK nie powiódł się: %s" #, fuzzy #~ msgid "Gajim needs PyGTK 2.22 or above" #~ msgstr "Gajim wymaga PyGTK w wersji 2.16 lub wyższej" #, fuzzy #~ msgid "Gajim needs PyGTK 2.22 or above to run. Quiting..." #~ msgstr "" #~ "Gajim wymaga do działania PyGTK w wersji 2.16 lub wyższej. Zamykanie " #~ "programu..." #, fuzzy #~ msgid "Gajim needs GTK 2.22 or above" #~ msgstr "Gajim wymaga GTK w wersji 2.16 lub wyższej" #, fuzzy #~ msgid "Gajim needs GTK 2.22 or above to run. Quiting..." #~ msgstr "" #~ "Gajim wymaga do działania GTK w wersji 2.16 lub wyższej. Zamykanie " #~ "programu..." #~ msgid "Gajim needs pywin32 to run" #~ msgstr "Gajim wymaga do działania pakietu pywin32" #~ msgid "" #~ "Please make sure that Pywin32 is installed on your system. You can get it " #~ "at %s" #~ msgstr "" #~ "Proszę upewnić się, że zainstalowany jest pakiet Pywin32. Możesz go " #~ "pobrać spod adresu %s" #~ msgid "Gajim is already running" #~ msgstr "Gajim jest już uruchomiony" #~ msgid "" #~ "Another instance of Gajim seems to be running\n" #~ "Run anyway?" #~ msgstr "" #~ "Wydaje się, że w tle działa już inna kopia Gajima.\n" #~ "Czy mimo to chcesz uruchomić program?" #~ msgid "A programming error has been detected" #~ msgstr "Wykryto błąd programistyczny" #~ msgid "Details" #~ msgstr "Szczegóły" #, fuzzy #~ msgid "" #~ "Gnome Keyring is installed but not correctly started (environment " #~ "variable probably not correctly set)" #~ msgstr "" #~ "Menedżer bazy kluczy GNOME jest zainstalowany, ale nie został \t\t\t" #~ "\tprawidłowo uruchomiony(zmienna środowiskowa prawdopodobnie nie jest \t\t" #~ "\t\t właściwie ustawiona)" #~ msgid "Jabber ID: " #~ msgstr "Jabber ID:" #~ msgid "Resource: " #~ msgstr "Zasoby: " #~ msgid "Subscription: " #~ msgstr "Autoryzacja: " #, fuzzy #~ msgid "Mood: " #~ msgstr "Nastrój:" #, fuzzy #~ msgid "Activity: " #~ msgstr "Aktywność:" #, fuzzy #~ msgid "Gajim Remote" #~ msgstr "gajim-remote" #~ msgid "Join _Group Chat..." #~ msgstr "Dołącz do _pokoju" #~ msgid "_Modify Account" #~ msgstr "_Modyfikuj konto" #~ msgid "Check on startup if Gajim is the _default Jabber client" #~ msgstr "" #~ "Przy starcie zawsze sprawdzaj czy Gajim jest _domyślnym klientem Jabbera" #~ msgid "_Group Chat" #~ msgstr "_Pokój" #~ msgid "" #~ "If True, Gajim will check if it's the default jabber client on each " #~ "startup." #~ msgstr "" #~ "Jeśli ma wartość True, Gajim sprawdzi przy każdym uruchomieniu czy jest " #~ "domyślnym klientem Jabbera." #~ msgid "Gajim is not the default Jabber client" #~ msgstr "Gajim nie jest domyślnym klinetem Jabbera" #~ msgid "Would you like to make Gajim the default Jabber client?" #~ msgstr "Czy chciałbyś by Gajim stał się klientem domyślnym?" #~ msgid "Always check to see if Gajim is the default Jabber client on startup" #~ msgstr "Przy starcie sprawdzaj czy Gajim jest domyślnym klinetem Jabbera" #~ msgid "Send Single Message" #~ msgstr "Wyślij wiadomość" #~ msgid "Execute Command..." #~ msgstr "Wykonaj komendę..." #~ msgid " a window/tab opened with that contact " #~ msgstr "z tym kontaktem " #~ msgid "Actions" #~ msgstr "Akcje" #~ msgid "Conditions" #~ msgstr "Warunki" #~ msgid "Advanced Actions" #~ msgstr "Opcje zaawansowane" #~ msgid "Advanced Notifications Control" #~ msgstr "Edytor ustawień zaawansowanych" #~ msgid "Busy " #~ msgstr "Zajęty " #, fuzzy #~ msgid "Contact Change Status " #~ msgstr "Kontakt zmienił status" #, fuzzy #~ msgid "Contact Disconnected " #~ msgstr "Kontakt rozłączył się" #~ msgid "Don't have " #~ msgstr "nie rozmawiam " #, fuzzy #~ msgid "File Transfer Started " #~ msgstr "Przesyłanie pliku zatrzymane" #, fuzzy #~ msgid "Group Chat Message Highlight " #~ msgstr "Podświetlenie wiadomości z czatu" #, fuzzy #~ msgid "Group Chat Message Received " #~ msgstr "Otrzymano wiadomość na czacie" #~ msgid "Launch a command" #~ msgstr "Wykonaj komendę" #~ msgid "One or more special statuses..." #~ msgstr "Jeden bądź więcej określonych statusów..." #~ msgid "Online / Free For Chat" #~ msgstr "Dostępny / Chętny do rozmowy" #~ msgid "Play a sound" #~ msgstr "Odtwórz dźwięk" #~ msgid "When " #~ msgstr "Jeżeli " #~ msgid "" #~ "_Activate window manager's UrgencyHint to make chat window in taskbar " #~ "flash" #~ msgstr "_Migaj obramowaniem zminimalizowanego okna rozmowy" #~ msgid "_Disable auto opening chat window" #~ msgstr "Wyłącz _automatyczne otwieranie okna czatu" #~ msgid "_Disable existing popup window" #~ msgstr "_Wyłącz wyskakujące okienka" #~ msgid "_Disable existing sound for this event" #~ msgstr "_Wyłącz dźwięki dla tego zdarzenia" #, fuzzy #~ msgid "_Disable showing event in notification area" #~ msgstr "Wyłącz _pokazywanie zdarzenia na liście kontaktów" #~ msgid "_Disable showing event in roster" #~ msgstr "Wyłącz _pokazywanie zdarzenia na liście kontaktów" #~ msgid "_Inform me with a popup window" #~ msgstr "_Powiadom mnie wyskakującym okienkiem" #~ msgid "_Open chat window with user" #~ msgstr "_Otwórz okno rozmowy z kontaktem" #~ msgid "_Show event in roster" #~ msgstr "_Pokaż zdarzenie na liście kontaktów" #~ msgid "and I " #~ msgstr "podczas, gdy " #~ msgid "contact(s)" #~ msgstr "kontakt(y)" #~ msgid "for " #~ msgstr "dla " #~ msgid "group(s)" #~ msgstr "grupa/y" #~ msgid "when I'm in" #~ msgstr "kiedy jestem obecny" #~ msgid "_Allow him/her to see my status" #~ msgstr "_Pozwól mu/jej widzieć swój status" #~ msgid "Descrition:" #~ msgstr "Opis:" #~ msgid "Advanced..." #~ msgstr "Zaawansowane..." #~ msgid "Display _activity of contacts in roster" #~ msgstr "Wyświetlaj aktywność kontaktów z listy" #~ msgid "Display _tunes of contacts in roster" #~ msgstr "Wyświetlaj muzyczne ikonki kontaktów z listy" #~ msgid "Display m_ood of contacts in roster" #~ msgstr "Wyświetlaj nastroje kontaktów z listy" #~ msgid "" #~ "If checked, Gajim will display the activity of contacts in the roster " #~ "window" #~ msgstr "" #~ "Zaznaczenie tej opcji spowoduje wyświetlanie aktywności kontaktów z listy " #~ "kontaktów" #, fuzzy #~ msgid "" #~ "If checked, Gajim will display the location of contacts in the roster " #~ "window" #~ msgstr "" #~ "Zaznaczenie tej opcji spowoduje wyświetlanie nastrojów w oknie listy " #~ "kontaktów (roster oraz okno czatu)" #~ msgid "" #~ "If checked, Gajim will display the tunes of contacts in the roster window" #~ msgstr "" #~ "Zaznaczenie tej opcji spowoduje wyświetlanie muzycznych ikonek w oknie " #~ "listy kontaktów (roster oraz okno czatu)" #~ msgid "User avatar:" #~ msgstr "Używany avatar" #~ msgid "Gajim Instant Messenger" #~ msgstr "Komunikator Gajim" #~ msgid "English" #~ msgstr "angielski" #~ msgid "Belarusian" #~ msgstr "bułgarski" #~ msgid "Bulgarian" #~ msgstr "bułgarski" #~ msgid "Breton" #~ msgstr "bretoński" #~ msgid "Czech" #~ msgstr "czeski" #~ msgid "German" #~ msgstr "niemiecki" #~ msgid "Greek" #~ msgstr "grecki" #~ msgid "British" #~ msgstr "brytyjski" #~ msgid "Esperanto" #~ msgstr "esperanto" #~ msgid "Spanish" #~ msgstr "hiszpański" #~ msgid "Basque" #~ msgstr "baskijski" #~ msgid "French" #~ msgstr "francuski" #~ msgid "Croatian" #~ msgstr "chorwacki" #~ msgid "Italian" #~ msgstr "włoski" #~ msgid "Norwegian (b)" #~ msgstr "norweski (b)" #~ msgid "Dutch" #~ msgstr "holenderski" #~ msgid "Norwegian" #~ msgstr "norweski" #~ msgid "Polish" #~ msgstr "polski" #~ msgid "Portuguese" #~ msgstr "portugalski" #~ msgid "Brazilian Portuguese" #~ msgstr "portugalski (Brazylia)" #~ msgid "Russian" #~ msgstr "rosyjski" #~ msgid "Serbian" #~ msgstr "serbski" #~ msgid "Slovak" #~ msgstr "słowacki" #~ msgid "Swedish" #~ msgstr "szwedzki" #~ msgid "Chinese (Ch)" #~ msgstr "chiński (Ch)" #~ msgid "Spelling language" #~ msgstr "Wybierz słownik" #~ msgid "Requires python-farsight." #~ msgstr "Wymaga python-farsight." #~ msgid "" #~ "If True, Gajim will convert string between $$ and $$ to an image using " #~ "dvips and convert before insterting it in chat window." #~ msgstr "" #~ "Jeżeli ustawiono na 'True', Gajim dokona konwersji ciągów zawartych " #~ "pomiędzy $$ i $$ do postaci obrazu (z wykorzystaniem dvips) przed " #~ "wstawieniem ich do okna rozmowy." #~ msgid "" #~ "Change the value to change the size of latex formulas displayed. The " #~ "higher is larger." #~ msgstr "Zmień rozmiar pokazywanych formuł latex-a." #~ msgid "all or space separated status" #~ msgstr "all lub komunikaty stanu rozdzielone spacjami" #~ msgid "'yes', 'no', or 'both'" #~ msgstr "'yes', 'no' lub 'both'" #~ msgid "'yes', 'no' or ''" #~ msgstr "'yes', 'no' lub \"" #~ msgid "Check your connection or try again later" #~ msgstr "Sprawdź swoje połączenie lub spróbuj później" #~ msgid "Error executing \"%(command)s\": %(error)s" #~ msgstr "Błąd przy wykonywaniu \"%(command)s\": %(error)s" #~ msgid "error: cannot open %s for reading" #~ msgstr "błąd: nie można otworzyć %s do odczytu" #~ msgid "Unable to bind to port %s." #~ msgstr "Nie można podłączyć się do portu %s." #~ msgid "" #~ "Maybe you have another running instance of Gajim. File Transfer will be " #~ "cancelled." #~ msgstr "" #~ "Być może masz już uruchomioną inną kopię Gajima. Przesyłanie plików " #~ "zostanie anulowane." #~ msgid "A GTK+ jabber client" #~ msgstr "Klient jabbera w GTK+." #~ msgid "Condition" #~ msgstr "Warunek" #~ msgid "when I am " #~ msgstr "kiedy mam " #~ msgid "Requires pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." #~ msgstr "Wymaga pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)" #~ msgid "LaTeX" #~ msgstr "LaTeX" #~ msgid "Transform LaTeX expressions between $$ $$." #~ msgstr "Przekształcanie wyrażeń jezyka LaTeX pomiędzy $$ $$." #, fuzzy #~ msgid "" #~ "Requires texlive-latex-base and (dvipng or ImageMagick). You have to set " #~ "'use_latex' to True in the Advanced Configuration Editor." #~ msgstr "" #~ "Wymaga texlive-latex-base, dvipng. Musisz ustawić zmienną 'use_latex' na " #~ "'True' w Zaawansowanym Edytorze Ustawień." #, fuzzy #~ msgid "" #~ "Requires texlive-latex-base and (dvipng or ImageMagick) (All is in " #~ "MikTeX). You have to set 'use_latex' to True in the Advanced " #~ "Configuration Editor." #~ msgstr "" #~ "Wymaga texlive-latex-base, dvipng (Wszystko jest w MikTeX). Musisz " #~ "ustawić zmienną 'use_latex' na 'True' w Zaawansowanym Edytorze Ustawień." #~ msgid "one of: offline, online, chat, away, xa, dnd, invisible " #~ msgstr "" #~ "jeden z: rozłączony, dostępny, chętny do rozmowy, zaraz wracam, " #~ "nieobecny, zajęty, niewidoczny " #, fuzzy #~ msgid "" #~ "Returns current status message(the global one unless account is specified)" #~ msgstr "Zwraca obecny status (globalny, chyba że zostało wskazane konto)." #~ msgid "" #~ "Usage: %s %s %s \n" #~ "\t %s" #~ msgstr "" #~ "Użycie: %s %s %s \n" #~ "\t %s" #, fuzzy #~ msgid "" #~ "Too many arguments. \n" #~ "Type \"%s help %s\" for more info" #~ msgstr "" #~ "Za dużo argumentów. \n" #~ "Wpisz \"%(basename)s help %(command)s\" aby uzyskać więcej informacji" #, fuzzy #~ msgid "" #~ "Argument \"%s\" is not specified. \n" #~ "Type \"%s help %s\" for more info" #~ msgstr "" #~ "Argument \"%(arg)s\" nie jest określony. \n" #~ "Wpisz \"%(basename)s help %(command)s\" aby uzyskać więcej informacji" #~ msgid "Disk WriteError" #~ msgstr "Błąd zapisu na dysk" #~ msgid "Subject: %s" #~ msgstr "Temat: %s" #~ msgid "Mood: %s" #~ msgstr "Nastrój: %s" #, fuzzy #~ msgid "Activity: %s" #~ msgstr "Aktywność:" #~ msgid "Requires gpg and python-GnuPGInterface." #~ msgstr "Wymaga GPG oraz python-GnuPGInterface." #~ msgid "@" #~ msgstr "@" #~ msgid "_Disable showing event in systray" #~ msgstr "Wyłącz pokazywanie _zdarzenia w obszarze powiadamiania" #~ msgid "_Show event in systray" #~ msgstr "Pokaż _zdarzenie w obszarze powiadamiania" #, fuzzy #~ msgid "Always use GNOME default applications" #~ msgstr "Zawsze używaj domyślnych apikacji OS X" #, fuzzy #~ msgid "Always use Xfce default applications" #~ msgstr "Zawsze używaj domyślnych apikacji OS X" #, fuzzy #~ msgid "Autodetect on every Gajim startup" #~ msgstr "P_ołącz przy starcie programu" #~ msgid "Show systray:" #~ msgstr "Pokaż _zdarzenie w obszarze powiadamiania" #~ msgid "Nickname not allowed: %s" #~ msgstr "Pseudonim jest niedozwolony: %s" #~ msgid "we are now subscribed to %s" #~ msgstr "Zapisaliśmy się do %s" #~ msgid "we are now unsubscribed from %s" #~ msgstr "Wypisaliśmy się z %s" #~ msgid "Account Modification" #~ msgstr "Modyfikacja konta" #~ msgid "" #~ "Check this so Gajim will connect in port 5223 where legacy servers are " #~ "expected to have SSL capabilities. Note that Gajim uses TLS encryption by " #~ "default if broadcasted by the server, and with this option enabled TLS " #~ "will be disabled" #~ msgstr "" #~ "Zaznaczenie tej opcji spowoduje łączenia na porcie 5223 gdzie większość " #~ "serwerów udostępnia usługę SSL. Gajim używa szyfrowania TLS domyślnie, " #~ "jeśli tylko serwer daje taką możliwość. Ta opcja wyłącza TLS" #~ msgid "Edit Personal Information..." #~ msgstr "Zmień informacje o sobie..." #~ msgid "Hostname: " #~ msgstr "Nazwa hosta: " #~ msgid "" #~ "If checked, Gajim will store the password in ~/.gajim/config with 'read' " #~ "permission only for you" #~ msgstr "" #~ "Zaznaczanie tej opcji spowoduje przechowywanie hasła w pliku ~/.gajim/" #~ "config z prawem do odczytu tylko dla ciebie" #~ msgid "Port: " #~ msgstr "Port: " #~ msgid "Save _passphrase (insecure)" #~ msgstr "Zapisz _hasło (nie jest to bezpieczne)" #~ msgid "Use _SSL (legacy)" #~ msgstr "Korzystaj z _SSL" #~ msgid "gtk-add" #~ msgstr "gtk-add" #~ msgid "gtk-close" #~ msgstr "gtk-close" #~ msgid "gtk-remove" #~ msgstr "gtk-remove" #~ msgid "" #~ "Receive a Message\n" #~ "Contact Disconnected \n" #~ "Contact Change Status \n" #~ "Group Chat Message Highlight \n" #~ "Group Chat Message Received \n" #~ "File Transfer Request \n" #~ "File Transfer Started \n" #~ "File Transfer Finished" #~ msgstr "" #~ "otrzymam wiadomość\n" #~ "kontakt się rozłączy \n" #~ "kontakt zmieni status \n" #~ "na czacie pojawi się słowo kluczowe \n" #~ "otrzymam wiadomość na czacie \n" #~ "pojawi się żądanie przesłania pliku \n" #~ "rozpocznie się transfer pliku \n" #~ "zakończy się transfer pliku" #~ msgid "" #~ "contact(s)\n" #~ "group(s)\n" #~ "everybody" #~ msgstr "" #~ "kontaktu(-ów)\n" #~ "grupy(grup)\n" #~ "wszystkich" #~ msgid "" #~ "Account row\n" #~ "Group row\n" #~ "Contact row\n" #~ "Chat Banner" #~ msgstr "" #~ "Konto\n" #~ "Grupa\n" #~ "Kontakt\n" #~ "Banner" #~ msgid "" #~ "Enter JID or Contact name\n" #~ "Groupchat Histories\n" #~ "All Chat Histories" #~ msgstr "" #~ "Wpisz JID lub nazwe kontaktu\n" #~ "Historia rozmów grupowych\n" #~ "Wszystkie historie rozmów" #~ msgid "gtk-delete" #~ msgstr "gtk-delete" #~ msgid "Send a file (Ctrl+F)" #~ msgstr "Wyślij plik (Ctrl+F)" #~ msgid "" #~ "All chat states\n" #~ "Composing only\n" #~ "Disabled" #~ msgstr "" #~ "Wszystkie stany rozmowy\n" #~ "Tylko dotyczące pisania\n" #~ "Wyłączone" #~ msgid "" #~ "Autodetect on every Gajim startup\n" #~ "Always use GNOME default applications\n" #~ "Always use KDE default applications\n" #~ "Always use Xfce default applications\n" #~ "Custom" #~ msgstr "" #~ "Automatyczne wykrywanie przy każdym uruchomieniu Gajima\n" #~ "Zawsze używaj domyślnych aplikacji GNOME\n" #~ "Zawsze używaj domyślnych aplikacji KDE\n" #~ "Zawsze używaj domyślnych aplikacji Xfce\n" #~ "Własne" #~ msgid "" #~ "Detached roster with detached chats\n" #~ "Detached roster with single chat\n" #~ "Single window for everything\n" #~ "Detached roster with chat grouped by account\n" #~ "Detached roster with chat grouped by type" #~ msgstr "" #~ "Oddzielne okno rostera, oddzielne okna czatów\n" #~ "Oddzielne okno rostera, wspólne okno rozmów\n" #~ "Jedno, wspólne okno dla rostera i rozmów\n" #~ "Oddzielne okno rostera, rozmowy grupowane według konta\n" #~ "Oddzielne okno rostera, rozmowy grupowane według typu" #~ msgid "" #~ "Pop it up\n" #~ "Notify me about it\n" #~ "Show only in roster" #~ msgstr "" #~ "Otwórz okno\n" #~ "Powiadom mnie o tym\n" #~ "Pokaż tylko w rosterze" #~ msgid "" #~ "none\n" #~ "both\n" #~ "from\n" #~ "to" #~ msgstr "" #~ "brak\n" #~ "obie\n" #~ "od\n" #~ "do" #~ msgid "gtk-cancel" #~ msgstr "gtk-cancel" #~ msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." #~ msgstr "" #~ "Nie znaleziono biblioteki pysqlite2 (lub python-pysqlite2). Kończenie " #~ "pracy programu..." #~ msgid "Banners and clickable links" #~ msgstr "Banery i klikalne linki" #~ msgid "Ability to have clickable URLs in chat and groupchat window banners." #~ msgstr "Dodaje możliwość wyświetlania aktywnych ('klikalnych') adresów URL." #~ msgid "Requires python-sexy." #~ msgstr "Wymaga python-sexy" #~ msgid "GTK+ runtime is missing libglade support" #~ msgstr "W GTK+ brakuje wsparcia dla libglade" #~ msgid "" #~ "Please remove your current GTK+ runtime and install the latest stable " #~ "version from %s" #~ msgstr "" #~ "Proszę usunąć obecną wersje GTK+ i zainstalować najnowszą stabilną wesję " #~ "z %s" #~ msgid "" #~ "Please make sure that GTK+ and PyGTK have libglade support in your system." #~ msgstr "" #~ "Sprawdź, czy GTK+ oraz PyGTK posiadają w twoim systemie wsparcie dla " #~ "libglade." #~ msgid "Gajim needs PySQLite2 to run" #~ msgstr "Gajim wymaga do działania PySQLite2" #~ msgid "_Incoming message:" #~ msgstr "Wiadomość _otrzymana:" #~ msgid "_Outgoing message:" #~ msgstr "Wysłana wiadomość :" #, fuzzy #~ msgid "gtk-ok" #~ msgstr "gtk-close" #~ msgid "" #~ "The host %s you configured as the ft_add_hosts_to_send advanced option is " #~ "not valid, so ignored." #~ msgstr "" #~ "Nazwa hosta %s, którą określiłeś w opcji ft_add_hosts_to_send jest " #~ "niepoprawna, będzie więc ignorowana." #~ msgid "OpenPGP passphrase was not given" #~ msgstr "Nie podano klucza OpenPGP" #~ msgid "" #~ "To continue sending and receiving messages, you will need to reconnect." #~ msgstr "" #~ "Aby dalej wysyłać i odbierać wiadomości musisz się ponownie połączyć." #~ msgid "" #~ "You are not connected or not visible to others. Your message could not be " #~ "sent." #~ msgstr "" #~ "Nie jesteś połączony, lub masz status 'niewidoczny'. Twoja wiadomość nie " #~ "mogła zostać wysłana." #~ msgid "[This message is encrypted]" #~ msgstr "[Ta wiadomość jest zaszyfrowana]" #~ msgid "%i days ago" #~ msgstr "%i dni temu" #~ msgid "Trayicon" #~ msgstr "Ikona w obszarze powiadamiania" #~ msgid "A icon in systemtray reflecting the current presence." #~ msgstr "Ikona w obszarze powiadamiania odzwierciedla aktualny status." #~ msgid "" #~ "Requires python-gnome2-extras or compiled trayicon module from Gajim " #~ "sources." #~ msgstr "" #~ "Wymaga python-gnome2-extras lub skompilowanego modułu trayicon ze źródeł " #~ "Gajima." #~ msgid "Requires PyGTK >= 2.10." #~ msgstr "Wymaga PyGTK >= 2.10." #~ msgid "Add Special _Notification" #~ msgstr "Dodaj powiadomienia _specjalne" #~ msgid "Assign Open_PGP Key" #~ msgstr "Przypisz klucz Open_PGP" #~ msgid "Commands: %s" #~ msgstr "Polecenia: %s" #~ msgid "" #~ "Usage: /%(command)s , sends action to the current group chat. Use " #~ "third person. (e.g. /%(command)s explodes.)" #~ msgstr "" #~ "Użycie: /%(command)s spowoduje wysłanie działania do " #~ "aktualnego pokoju. Używaj w trzeciej osobie. (np. /%(command)s " #~ "eksploduje.)" #~ msgid "No help info for /%s" #~ msgstr "Brak informacji o pomocy dla /%s" #~ msgid "Enable link-local/zeroconf messaging" #~ msgstr "Uaktywnij komunikację link-local/zeroconf" #~ msgid "Nickname not found: %s" #~ msgstr "Pseudonim nie został odnaleziony: %s" #~ msgid "This group chat has no subject" #~ msgstr "Ten pokój nie ma tematu" #, fuzzy #~ msgid "" #~ "Usage: /%s [reason], bans the JID from the group chat. The " #~ "nickname of an occupant may be substituted, but not if it contains \"@\". " #~ "If the JID is currently in the group chat, he/she/it will also be kicked." #~ msgstr "" #~ "Użycie: /%s [powód] banuje JID w pokoju. Pseudonim osoby " #~ "może zostać zmieniony o ile nie zawiera \"@\". Jeśli JID jest obecnie w " #~ "pokoju, to zostanie z niego wyrzucony. NIE toleruje spacji w pseudonimie." #~ msgid "" #~ "Usage: /%s [reason], closes the current window or tab, displaying reason " #~ "if specified." #~ msgstr "" #~ "Użycie: /%s [powód] zamyka aktualne okno lub kartę i wyświetla powóc, " #~ "jeśli został podany." #~ msgid "" #~ "Usage: /%s [reason], invites JID to the current group chat, " #~ "optionally providing a reason." #~ msgstr "" #~ "Użycie: /%s [powód] zaprasza JID do aktualnego pokoju, opcjonalnie " #~ "wyświetlając powód." #~ msgid "" #~ "Usage: /%s @[/nickname], offers to join room@server " #~ "optionally using specified nickname." #~ msgstr "" #~ "Użycie: /%s @[/pseudonim] oferuje przyłączenie się do " #~ "pokój@serwer opcjonalnie z wykorzystaniem podanego psedonimu." #, fuzzy #~ msgid "" #~ "Usage: /%s [reason], removes the occupant specified by " #~ "nickname from the group chat and optionally displays a reason." #~ msgstr "" #~ "Użycie: /%s [powód] usuwa podaną poprzez pseudonim osobę z " #~ "pokoju i opcjonalnie wyświetla powód. NIE wspiera spacji w pseudonimie." #~ msgid "" #~ "Usage: /%s [message], opens a private message window and sends " #~ "message to the occupant specified by nickname." #~ msgstr "" #~ "Użycie: /%s [wiadomość] otwiera okno prywatnej wiadomości i " #~ "wysyła ją do osoby o takim pseudonimie." #~ msgid "Usage: /%s , changes your nickname in current group chat." #~ msgstr "Użycie: /%s zmienia twój pseudonim w aktualnym pokoju." #~ msgid "" #~ "Usage: /%s [topic], displays or updates the current group chat topic." #~ msgstr "" #~ "Użycie: /%s [temat] wyświetla lub aktualizuje temat aktualnego pokoju." #~ msgid "" #~ "Usage: /%s , sends a message without looking for other commands." #~ msgstr "" #~ "Użycie: /%s wysyła wiadomość bez sprawdzania innych poleceń." #, fuzzy #~ msgid "" #~ "Usage: /%s , allow to send you messages and private " #~ "messages." #~ msgstr "Użycie: /%s zmienia twój pseudonim w aktualnym pokoju." #~ msgid "B_OSH Port:" #~ msgstr "B_OSH Port:" #~ msgid "File transfer stopped by the contact at the other end" #~ msgstr "Przesyłanie pliku zostało zatrzymane przez drugą osobę" #~ msgid "Generic" #~ msgstr "Ogólne" #~ msgid "Select the account with which to synchronise" #~ msgstr "Wskaż konto, z którym chcesz zsynchronizować kontakty" #~ msgid "" #~ "%(title)s by %(artist)s\n" #~ "from %(source)s" #~ msgstr "\"%(title)s\" w wykonaniu %(artist)sz %(source)s" #~ msgid "Click to see features (like MSN, ICQ transports) of jabber servers" #~ msgstr "" #~ "Kliknij by zobaczyć możliwości serwerów jabbera (np. transporty MSN czy " #~ "ICQ)" #~ msgid "Your JID:" #~ msgstr "Twój JID:" #~ msgid "Name:" #~ msgstr "Nazwa:" #~ msgid "_Host:" #~ msgstr "_Host:" #~ msgid "Modify Account" #~ msgstr "Modyfikuj konto" #~ msgid "Gajim account %s" #~ msgstr "Konto Gajim'a %s" #~ msgid "This account is already configured in Gajim." #~ msgstr "Konto o takiej nazwie jest już skonfigurowane." #~ msgid "PyOpenSSL" #~ msgstr "PyOpenSSL" #~ msgid "gnome-keyring" #~ msgstr "Baza kluczy GNOME" #~ msgid "" #~ "Requires python-gnome2-extras or compilation of gtkspell module from " #~ "Gajim sources." #~ msgstr "" #~ "Wymaga python-gnome2-extras lub kompilacji gtkspell ze źródeł Gajima." #~ msgid "Notification-daemon" #~ msgstr "Powiadamianie o zdarzeniach" #~ msgid "Idle" #~ msgstr "Stan bezczynności" #~ msgid "Requires compilation of the idle module from Gajim sources." #~ msgstr "Wymaga kompilacji modułu idle ze źródeł Gajima." #~ msgid "libsexy" #~ msgstr "libsexy" #~ msgid "Mood" #~ msgstr "Nastrój" #~ msgid "Activity" #~ msgstr "Aktywność" #~ msgid "%s has not broadcast an OpenPGP key, nor has one been assigned" #~ msgstr "" #~ "Ani %s nie przesyła swojego klucza OpenPGP, ani Ty nie przypisałeś mu " #~ "żadnego klucza" #~ msgid "No such command: /%s (if you want to send this, prefix it with /say)" #~ msgstr "" #~ "Nie ma takiego polecenia: /%s (jeśli chcesz je wysłać, poprzedź je " #~ "znakami: /say)" #, fuzzy #~ msgid "" #~ "Usage: /%s , sends action to the current group chat. Use third " #~ "person. (e.g. /%s explodes.)" #~ msgstr "" #~ "Użycie: /%s wysyła działanie do aktualnego pokoju. Używaj w " #~ "trzeciej osobie (np. /%s eksploduje.)" #~ msgid "" #~ "If checked, Gajim will sort contacts in roster window and groupchats by " #~ "their status and not by the shown name" #~ msgstr "" #~ "Zaznaczenie tej opcji spowoduje posortowanie listy kontaktów według ich " #~ "statusu a nie według nazw" #~ msgid "The username used to identify the Last.fm account." #~ msgstr "Nazwa użytkownika serwisu Last.fm." #~ msgid "Network Manager support not available" #~ msgstr "Brak wsparcia dla Network Managera" #~ msgid "Session Management support not available (missing gnome.ui module)" #~ msgstr "Wsparcie dla Menadżera Sesji jest niedostępne (brak modułu gnome.ui" #~ msgid "E2E encryption enabled" #~ msgstr "Szyfrowanie E2E włączone" #~ msgid "General:" #~ msgstr "Ogólne" #~ msgid "_Make message windows compact" #~ msgstr "_Spraw, by okna wiadomości były zwarte" #~ msgid "A_ccounts" #~ msgstr "_Konta" #, fuzzy #~ msgid "\"%(title)s\" by " #~ msgstr "\"%(title)s\" w wykonaniu %(artist)s" #, fuzzy #~ msgid "The following message was " #~ msgstr "Ta wiadomość została jest zaszyfrowana" #~ msgid "%s is now %s" #~ msgstr "%s ma teraz status %s" #~ msgid "cold" #~ msgstr "Zziębnięty" #~ msgid "hot" #~ msgstr "napalony" #~ msgid "moody" #~ msgstr "markotny" #~ msgid "working" #~ msgstr "pracuję" #~ msgid "eating" #~ msgstr "jem" #~ msgid "inactive" #~ msgstr "nieaktywny" #~ msgid "walking" #~ msgstr "Spaceruję" #~ msgid "sleeping" #~ msgstr "Śpię" #, fuzzy #~ msgid "mood" #~ msgstr "markotny" #~ msgid "%s - %s" #~ msgstr "%s - %s" #~ msgid "Click to see past conversation in this room" #~ msgstr "Kliknij by zobaczyć poprzednie rozmowy w tym pokoju" #~ msgid "History Viewer" #~ msgstr "Przeglądanie historii" #~ msgid "JID Selection" #~ msgstr "Wybór JID-a" #~ msgid "" #~ "Choose the chatlog you want to view. \n" #~ "Enter the jid of a groupchat or a contact here. For online accounts you " #~ "can even enter a a contact's nickname." #~ msgstr "" #~ "Wybierz katalog, który chcesz przejrzeć. \n" #~ "Tu wpisz JID czatu lub kontaktu. Jeżeli kontakt jest online, możesz podać " #~ "sam nick." #~ msgid "in" #~ msgstr "w" #~ msgid "Invitation Received" #~ msgstr "Zaproszenie Odebrane" #~ msgid "Publish and Subscribe" #~ msgstr "Publikuj i subskrybuj" #~ msgid "Allow others to see your:" #~ msgstr "_Pozwól innym widzieć swój:" #~ msgid "Receive your contact's:" #~ msgstr "Odbieraj powiadomomienia o zmianie:" #~ msgid "Tune" #~ msgstr "Muzyka" #~ msgid "" #~ "\n" #~ "From: %(from_address)s" #~ msgstr "" #~ "\n" #~ "Od: %(from_address)s" #~ msgid "OK to continue with negotiation?" #~ msgstr "Czy kontynuować negocjację?" #~ msgid "" #~ "You've begun an encrypted session with %s, but it can't be guaranteed " #~ "that you're talking directly to the person you think you are.\n" #~ "\n" #~ "You should speak with them directly (in person or on the phone) and " #~ "confirm that their Short Authentication String is identical to this one: " #~ "%s\n" #~ "\n" #~ "Would you like to continue with the encrypted session?" #~ msgstr "" #~ "Rozpocząłeś szyfrowaną sesję z %s, ale nie można zagwarantować, że " #~ "rozmawiasz bezpośrednio z odpowiednią osobą.\n" #~ "\n" #~ "Powienieneś(-winnaś) porozmawiać z nią w cztery osobiście lub za " #~ "pośrednictwem telefonu i potwierdzić, że jej SAS (Short Authentication " #~ "String) jest identyczny z poniższym: %s\n" #~ "Czy chcesz kontynuować tą sesję?" #~ msgid "Yes, I verified the Short Authentication String" #~ msgstr "Tak, SAS został zweryfikowany." #~ msgid "" #~ "To continue, Gajim needs to access your stored secrets. Enter your " #~ "passphrase" #~ msgstr "" #~ "Aby kontynuować, Gajim musi uzyskać dostęp do Twoich haseł. Proszę podać " #~ "hasło główne" #~ msgid "Confirm Passphrase" #~ msgstr "Potwierdź hasło" #~ msgid "Enter your new passphrase again for confirmation" #~ msgstr "Wpisz ponownie nowe hasło" #~ msgid "Create Passphrase" #~ msgstr "Utwórz hasło" #~ msgid "Passphrases did not match.\n" #~ msgstr "Hasła nie zgadzają się.\n" #~ msgid "Gajim needs you to create a passphrase to encrypt stored secrets" #~ msgstr "Proszę podać hasło główne służące do zaszyfrowania danych poufnych" #~ msgid "Role:" #~ msgstr "Funkcja:" #~ msgid "Affiliation:" #~ msgstr "Afiliacja: " #~ msgid "" #~ "If checked, Gajim can regularly poll a Last.fm account and sends recently " #~ "played songs through PEP." #~ msgstr "" #~ "Po zaznaczeniu tej opcji Gajim będzie wysyłał (via PEP) do serwisu Last." #~ "fm informacje o odtwarzanych utworach." #~ msgid "" #~ "When negotiating an encrypted session, should Gajim prefer to use public " #~ "keys for identification?" #~ msgstr "" #~ "Czy podczas negocjowania szyfrowanej sesji Gajim ma kluczy publicznych?" #~ msgid "Connection to host could not be established" #~ msgstr "Nie można ustanowić połączenia z hostem" #~ msgid "" #~ "Connection to host could not be established: Incorrect answer from server." #~ msgstr "Nie można ustanowić połączenia z hostem. Nieprawidłowa odpowiedź." #~ msgid "Format of a line" #~ msgstr "Format linii" #~ msgid "" #~ "An example: If you have enabled status message for away, Gajim won't ask " #~ "you anymore for a status message when you change your status to away; it " #~ "will use the default one set here" #~ msgstr "" #~ "Przykład: jeżeli ustawiłeś status opisowy dla stanu 'nieobecny', Gajim " #~ "zapamięta go i nie będzie prosił o jego zmianę po ponownym ustawieniu " #~ "takiego stanu" #~ msgid "" #~ "Determined by sender\n" #~ "Chat message\n" #~ "Single message" #~ msgstr "" #~ "Określa nadawca\n" #~ "Rozmowę\n" #~ "Pojedynczą wiadomość" #~ msgid "Hides buttons in chatwindows to " #~ msgstr "Ukrywa przyciski w oknie czatu " #~ msgid "" #~ "Never\n" #~ "Always\n" #~ "Per account\n" #~ "Per type" #~ msgstr "" #~ "Nigdy\n" #~ "Zawsze\n" #~ "Według konta\n" #~ "Według typu" #~ msgid "Privacy" #~ msgstr "Prywatność" #~ msgid "Set status message to reflect currently playing _music track" #~ msgstr "Wyświetlaj informacje o odtwarzanej _muzyce w statusie opisowym" #~ msgid "The auto away status message" #~ msgstr "Automatyczny status \"Zaraz wracam\"" #~ msgid "The auto not available status message" #~ msgstr "Automatyczny status \"Nieobecny\"" #~ msgid "Treat all incoming messages as:" #~ msgstr "Traktuj wszystkie otrzymane wiadomości jako:" #~ msgid "Use only one message _window:" #~ msgstr "_Grupuj okna:" #~ msgid "" #~ "Works for Rhythmbox and Muine players. For more players, please visit " #~ "http://trac.gajim.org/wiki/GajimAndMusicPlayer" #~ msgstr "" #~ "Funkcja ta działa z programami Rhythmbox oraz Muine. Jeżeli zależy ci na " #~ "obsłudze innego oprogramowania, odwiedź stronę http://trac.gajim.org/wiki/" #~ "GajimAndMusicPlayer" #~ msgid "_Advanced Notifications Control..." #~ msgstr "_Edytor zaawansowanych ustawień" #~ msgid "_Player:" #~ msgstr "_Program odtwarzający dźwięk:" #~ msgid "City:" #~ msgstr "Miasto:" #~ msgid "Company:" #~ msgstr "Firma:" #~ msgid "Given:" #~ msgstr "Imię:" #~ msgid "Middle:" #~ msgstr "Drugie imię:" #~ msgid "Position:" #~ msgstr "Stanowisko:" #~ msgid "Prefix:" #~ msgstr "Prefiks:" #~ msgid "State:" #~ msgstr "Stan/Województwo:" #~ msgid "Suffix:" #~ msgstr "Sufiks:" #~ msgid "Ask:" #~ msgstr "Pytaj:" #~ msgid "Client:" #~ msgstr "Klient:" #~ msgid "OS:" #~ msgstr "System operacyjny:" #~ msgid "You will always see him or her as offline." #~ msgstr "Zawsze będziesz widział ten kontakt jako niepołączony." #~ msgid "%s is now %s (%s)" #~ msgstr "%s ma teraz status %s (%s)" #~ msgid "%s - Gajim" #~ msgstr "%s - Gajim" #~ msgid "_New group chat" #~ msgstr "_Nowa rozmowa grupowa" #~ msgid "_Log off" #~ msgstr "R_ozłącz" #~ msgid "_Log on" #~ msgstr "_Połącz" #~ msgid "Save passphrase" #~ msgstr "Zapisz hasło" #~ msgid "Connected to server %s:%s with %s" #~ msgstr "Połączony z serwerem %s: %s z %s" #~ msgid "Build custom query" #~ msgstr "Stwórz własne zapytanie" #~ msgid "" #~ "Enter a contact jid or MUC jid here to view its history.\n" #~ "If a contact is connected you can even enter his nick name.\n" #~ msgstr "" #~ "Wprowadź nazwę użytkownika z rostera lub czatu aby przejrzeć historię " #~ "rozmów.\n" #~ "Jeżeli jest połączony, możesz podać jego nazwę.\n" #~ msgid "Query Builder..." #~ msgstr "Kreator zapytań..." #~ msgid "_Discover Services..." #~ msgstr "_Wyszukuj usługi..." #~ msgid "_Retype Password:" #~ msgstr "_Powtórz hasło:" #~ msgid "" #~ "If checked, all local contacts that use a Bonjour compatible chat client " #~ "(like iChat, Trillian or Gaim) will be shown in roster. You don't need to " #~ "be connected to a jabber server for it to work.\n" #~ "This is only available if python-avahi is installed and avahi-daemon is " #~ "running." #~ msgstr "" #~ "Jeżeli opcja ta zostanie uaktywniona, znajdujące się w twojej sieci " #~ "lokalnej kontakty używające klienta wykorzystującego technologię Bonjour " #~ "(jak iChat, Trillian czy Gaim) pojawią się na rosterze. Nie musisz łączyć " #~ "się z serwerem Jabbera, by z nimi rozmawiać." #~ msgid "" #~ "If you have 2 or more accounts and this is checked, Gajim will list all " #~ "contacts as if you had one account" #~ msgstr "" #~ "Jeśli masz dwa konta lub więcej, to dzięki tej opcji Gajim pokaże " #~ "wszystkie kontakty w taki sposób, jakby było to jedno konto" #~ msgid "_Enable link-local messaging" #~ msgstr "_Uaktywnij przesyłanie wiadomości do adresów link-local" #~ msgid "_Blocked Contacts" #~ msgstr "_Kontakty zablokowane" #~ msgid "_Compact View Alt+C" #~ msgstr "Widok _zwarty Alt+C" #~ msgid "Interface Customization" #~ msgstr "Własne ustawienia interfejsu" #~ msgid "Also known as iChat style" #~ msgstr "Znany także jako styl iChat" #~ msgid "Chat" #~ msgstr "Rozmowa" #~ msgid "E_very 5 minutes" #~ msgstr "Co 5 _minut" #~ msgid "" #~ "Gajim will automatically show new events by popping up the relevant window" #~ msgstr "" #~ "Gajim automatycznie wyświetli nową wiadomość w nowym oknie lub w nowej " #~ "karcie otwartego okna rozmowy" #~ msgid "" #~ "Gajim will notify you for new events via a popup in the bottom right of " #~ "the screen" #~ msgstr "" #~ "Gajim powiadomi Cię o nadejściu nowej wiadomości wyświetlając okienko w " #~ "prawym dolnym rogu ekranu" #~ msgid "" #~ "Gajim will notify you via a popup window in the bottom right of the " #~ "screen about contacts that just signed in" #~ msgstr "" #~ "Gajim powiadomi automatycznie przy pomocy okna w prawym dolnym rogu o " #~ "kontaktach, które zmieniają status na Dostępny" #~ msgid "" #~ "Gajim will only change the icon of the contact that triggered the new " #~ "event" #~ msgstr "Gajim zmieni jedynie ikonę kontaktu, który przysłał nową wiadomość" #~ msgid "" #~ "If checked, Gajim will remember the roster and chat window positions in " #~ "the screen and the sizes of them next time you run it" #~ msgstr "" #~ "Zaznaczenie tej opcji spowoduje zapamiętanie położenia głównego okna " #~ "programu na ekranie oraz jego rozmiaru" #~ msgid "On every _message" #~ msgstr "W każdej _wiadomości" #~ msgid "Outgoing Chat state noti_fications:" #~ msgstr "Wysyłanie powiadomienia o stanie _rozmowy:" #~ msgid "Print time:" #~ msgstr "Wyświetlaj czas:" #~ msgid "Save _position and size for roster and chat windows" #~ msgstr "Zapisz _pozycję i rozmiar okna kontaktów i okna rozmowy" #~ msgid "" #~ "When a new event (message, file transfer request etc..) is received, the " #~ "following methods may be used to inform you about it. Please note that " #~ "events about new messages only occur if it is a new message from a " #~ "contact you are not already chatting with" #~ msgstr "" #~ "Kiedy pojawi się nowe zdarzenie (wiadomość, prośba o przesłanie pliku " #~ "itp.), możesz zostać o tym powiadomiony na takie sposoby. UWAGA: Nowa " #~ "wiadomość pojawia się jeśli nie pochodzi od osoby, z którą aktualnie " #~ "rozmawiasz" #~ msgid "Send cus_tom status" #~ msgstr "Wyślij _odrębny status" #~ msgid "_Remove from Roster" #~ msgstr "_Usuń z listy kontaktów" #~ msgid "_Filter:" #~ msgstr "_Filtr:" #~ msgid "Click to force avatar" #~ msgstr "Kliknij aby ustawić avatar" #~ msgid "" #~ "If that is not your language for which you want to highlight misspelled " #~ "words, then please set your $LANG as appropriate. Eg. for French do " #~ "export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to " #~ "make it global in /etc/profile.\n" #~ "\n" #~ "Highlighting misspelled words feature will not be used" #~ msgstr "" #~ "Jeśli podświetlanie błędów w pisowni działa dla niewłaściwego języka, to " #~ "ustaw odpowiednio zmienną środowiskową $LANG. Np. dla języka polskiego " #~ "wpisz export LANG=pl_PL do pliku ~/.bash_profile lub globalnie do pliku " #~ "in /etc/profile.\n" #~ "\n" #~ "Podświedlanie błędów w pisowni nie będzie używane" #~ msgid "Every %s _minutes" #~ msgstr "Co %s _minut" #~ msgid "You must enter a password for the new account." #~ msgstr "Musisz wpisać hasło dla nowego konta." #~ msgid "Blocked Contacts for %s" #~ msgstr "Kontakty zablokowane (dla %s)" #~ msgid "%s does not appear to be a valid JID" #~ msgstr "%s nie wygląda na poprawny JID" #~ msgid "Drop %s in group %s" #~ msgstr "Usuń %s z grupy %s" #~ msgid "Hides the buttons in two persons chat window." #~ msgstr "Ukrywa przyciski podczas rozmowy dwóch osób." #~ msgid "" #~ "The server's key has changed, or someone is trying to hack your " #~ "connection." #~ msgstr "" #~ "Zmienił się klucz twojego serwera lub ktoś próbuje podsłuchać połączenie." #~ msgid "Unable to check fingerprint for %s. Connection could be insecure." #~ msgstr "" #~ "Nie można sprawdzić odcisku klucza %s. Połączenie może nie być bezpieczne" #~ msgid "Missing fingerprint in SSL connection to %s" #~ msgstr "Brak odcisku klucza w połączeniu SSL z %s" #~ msgid "Fingerprint mismatch for %s: Got %s, expected %s" #~ msgstr "Niezgodność odcisku klucza %s. Oczekiwano %s, otrzymano %s" #~ msgid " %d unread single message" #~ msgid_plural " %d unread single messages" #~ msgstr[0] "%d nieprzeczytana wiadomość" #~ msgstr[1] "%d nieprzeczytane wiadomości" #~ msgstr[2] "Gajim - %d nieprzeczytane wiadomości" #~ msgid " %d unread group chat message" #~ msgid_plural " %d unread group chat messages" #~ msgstr[0] "%d nieprzeczytana wiadomość z czatu" #~ msgstr[1] "%d nieprzeczytane wiadomości z czatu" #~ msgstr[2] "Gajim - %d nieprzeczytane wiadomości" #~ msgid " %d unread private message" #~ msgid_plural " %d unread private messages" #~ msgstr[0] "%d nieprzeczytana wiadomość prywatna" #~ msgstr[1] "%d nieprzeczytane wiadomości prywatne" #~ msgstr[2] "Gajim - %d nieprzeczytane wiadomości" #~ msgid "gtk+" #~ msgstr "gtk+" #~ msgid "2003-12-13T18:30:02Z" #~ msgstr "2003-12-13T18:30:02Z" #~ msgid "Romeo and Juliet" #~ msgstr "Romeo i Julia" #~ msgid "Soliloquy" #~ msgstr "Monolog" #~ msgid "Private Chat" #~ msgstr "Rozmowa prywatna" #~ msgid "Group Chat" #~ msgstr "Pokój" #~ msgid "I'm %s" #~ msgstr "Jestem %s" #~ msgid "A_fter nickname:" #~ msgstr "_Za pseudonimem:" #~ msgid "_After time:" #~ msgstr "_Po czasie:" #~ msgid "_Before time:" #~ msgstr "P_rzed czasem:" #~ msgid "_Retrieve" #~ msgstr "_Przywróć" #~ msgid "Information published" #~ msgstr "Informacja została opublikowana" #~ msgid "Without a connection, you can not get your contact information." #~ msgstr "Musisz być połączony by uzyskać informacje o kontakcie." #~ msgid "This is result of query." #~ msgstr "Oto wynik zapytania." #~ msgid "Edit items on the list" #~ msgstr "Edytuj obiekty na liście" #~ msgid "Merge consecutive nickname in chat window." #~ msgstr "Łącz następujące po sobie te same nicki w oknie czata." #~ msgid "Role: " #~ msgstr "Funkcja: " #~ msgid "" #~ "Sound to play when any MUC message arrives. (This setting is taken into " #~ "account only if notify_on_all_muc_messages is True)" #~ msgstr "" #~ "Dźwięk, który zostanie odtworzony, gdy nadejdzie wiadomość MUC. (Ta opcja " #~ "jest brana pod uwagę jedynie gdy zmienna notify_on_all_muc_messages ma " #~ "wartość True)" #~ msgid "Away " #~ msgstr "Zaraz wracam " #~ msgid "Down" #~ msgstr "W dół" #~ msgid "List of special notifications settings" #~ msgstr "Lista akcji dla powiadomień" #~ msgid "Not Available " #~ msgstr "Nieobecny " #~ msgid "Up" #~ msgstr "Do góry" #~ msgid "Create your own Privacy Lists" #~ msgstr "Stwórz własną listę prywatności" #~ msgid "Server-based Privacy Lists" #~ msgstr "Listy prywatności po stronie serwera" #~ msgid "Contact _Info" #~ msgstr "_Informacje o kontakcie" #~ msgid "Jabber" #~ msgstr "Jabber" #~ msgid "Invalid room or server name" #~ msgstr "Niepoprawna nazwa pokoju lub serwera" #~ msgid "Your personal information has been published successfully." #~ msgstr "Informacje o tobie zostały opublikowane." #~ msgid "Migrating Logs..." #~ msgstr "Przenoszenie logów..." #~ msgid "Gajim - %d unread message" #~ msgid_plural "Gajim - %d unread messages" #~ msgstr[0] "Gajim - %d nieprzeczytana wiadomość" #~ msgstr[1] "Gajim - %d nieprzeczytane wiadomości" #~ msgstr[2] "Gajim - %d nieprzeczytane wiadomości" #~ msgid "Since %s" #~ msgstr "Od %s" gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/po/pt.po000066400000000000000000011540171326020644600223150ustar00rootroot00000000000000# Portuguese translations for Gajim package. # Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the Gajim package. # msgid "" msgstr "" "Project-Id-Version: Gajim 0.6\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-03-31 02:05+0000\n" "PO-Revision-Date: 2005-08-18 18:21-0300\n" "Last-Translator: Miguel Fonseca \n" "Language-Team: none\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: gajim/chat_control_base.py:199 msgid "Ping?" msgstr "" #: gajim/chat_control_base.py:204 #, fuzzy msgid "Error." msgstr "Erro:" #: gajim/chat_control_base.py:571 msgid "_Undo" msgstr "" #: gajim/chat_control_base.py:579 gajim/profile_window.py:181 #: gajim/conversation_textview.py:539 msgid "_Clear" msgstr "" #: gajim/chat_control_base.py:1172 msgid "Really send file?" msgstr "" #: gajim/chat_control_base.py:1173 #, python-format msgid "If you send a file to %s, he/she will know your real JID." msgstr "" #: gajim/session.py:451 gajim/session.py:511 msgid "Confirm these session options" msgstr "" #: gajim/session.py:453 #, python-format msgid "" "The remote client wants to negotiate a session with these features:\n" "\n" "%s\n" "\n" "Are these options acceptable?" msgstr "" #: gajim/session.py:513 #, python-format msgid "" "The remote client selected these options:\n" "\n" "%s\n" "\n" "Continue with the session?" msgstr "" #: gajim/session.py:516 #, fuzzy msgid "Always accept for this contact" msgstr "Não é possível usar OpenPGP neste computador" #: gajim/filetransfers_window.py:89 msgid "File" msgstr "Ficheiro" #: gajim/filetransfers_window.py:104 msgid "Time" msgstr "Tempo" #: gajim/filetransfers_window.py:116 msgid "Progress" msgstr "Progresso" #: gajim/filetransfers_window.py:223 gajim/filetransfers_window.py:279 #, python-format msgid "Filename: %s" msgstr "Nome do ficheiro: %s" #: gajim/filetransfers_window.py:224 gajim/filetransfers_window.py:486 #, python-format msgid "Size: %s" msgstr "Tamanho: %s" #: gajim/filetransfers_window.py:233 gajim/filetransfers_window.py:243 #: gajim/history_manager.py:528 msgid "You" msgstr "Você" #: gajim/filetransfers_window.py:234 #, python-format msgid "Sender: %s" msgstr "Remetente: %s" #: gajim/filetransfers_window.py:235 gajim/filetransfers_window.py:763 #: gajim/tooltips.py:667 msgid "Recipient: " msgstr "Destinatário: " #: gajim/filetransfers_window.py:246 #, python-format msgid "Saved in: %s" msgstr "Guardado em: %s" #: gajim/filetransfers_window.py:248 gajim/chat_control.py:1617 msgid "File transfer completed" msgstr "Transferência de ficheiro completa" #: gajim/filetransfers_window.py:250 gajim/chat_control.py:1621 #, fuzzy msgid "Open _Containing Folder" msgstr "_Abrir Pasta" #: gajim/filetransfers_window.py:263 gajim/filetransfers_window.py:270 #: gajim/chat_control.py:1676 #, fuzzy msgid "File transfer cancelled" msgstr "Transferência de ficheiro cancelada" #: gajim/filetransfers_window.py:263 gajim/filetransfers_window.py:271 #: gajim/chat_control.py:1677 msgid "Connection with peer cannot be established." msgstr "Ligação ao peer não pode ser estabelecida." #: gajim/filetransfers_window.py:280 #, fuzzy, python-format msgid "Recipient: %s" msgstr "Destinatário: " #: gajim/filetransfers_window.py:282 #, fuzzy, python-format msgid "Error message: %s" msgstr "Introduza a sua mensagem :" #: gajim/filetransfers_window.py:283 gajim/chat_control.py:1673 #, fuzzy msgid "File transfer stopped" msgstr "Transferência de Ficheiro Parada" #: gajim/filetransfers_window.py:319 #, python-format msgid "" "The file %(file)s has been received, but it seems to have been damaged along " "the way.\n" "Do you want to download it again?" msgstr "" #: gajim/filetransfers_window.py:345 #, fuzzy msgid "Choose File to Send…" msgstr "Escolher Ficheiro para Enviar" #: gajim/filetransfers_window.py:356 msgid "_Send" msgstr "E_nviar" #: gajim/filetransfers_window.py:363 gajim/tooltips.py:702 #, fuzzy msgid "Description: " msgstr "Descrição: %s" #: gajim/filetransfers_window.py:376 #, fuzzy msgid "Gajim can not read this file" msgstr "Gajim não consegue aceder a este ficheiro" #: gajim/filetransfers_window.py:377 msgid "Another process is using this file." msgstr "" #: gajim/filetransfers_window.py:422 gajim/gtkgui_helpers.py:492 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "" #: gajim/filetransfers_window.py:423 gajim/gtkgui_helpers.py:493 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." msgstr "" #: gajim/filetransfers_window.py:440 gajim/gtkgui_helpers.py:497 msgid "This file already exists" msgstr "Este ficheiro já existe" #: gajim/filetransfers_window.py:440 gajim/gtkgui_helpers.py:497 #, fuzzy msgid "What do you want to do?" msgstr "O que pretende fazer?" #: gajim/filetransfers_window.py:451 gajim/gtkgui_helpers.py:504 #, python-format msgid "Directory \"%s\" is not writable" msgstr "" #: gajim/filetransfers_window.py:452 gajim/gtkgui_helpers.py:505 msgid "You do not have permission to create files in this directory." msgstr "" #: gajim/filetransfers_window.py:463 #, fuzzy msgid "Save File as…" msgstr "Guardar Ficheiro como..." #: gajim/filetransfers_window.py:483 #, python-format msgid "File: %s" msgstr "Ficheiro: %s" #: gajim/filetransfers_window.py:489 #, python-format msgid "Type: %s" msgstr "Tipo: %s" #: gajim/filetransfers_window.py:491 #, python-format msgid "Description: %s" msgstr "Descrição: %s" #: gajim/filetransfers_window.py:492 #, python-format msgid "%s wants to send you a file:" msgstr "%s quer enviar-lhe um ficheiro:" #: gajim/filetransfers_window.py:533 #, fuzzy msgid "Checking file…" msgstr "Enviar _Ficheiro" #: gajim/filetransfers_window.py:547 #, fuzzy msgid "File error" msgstr "Erro na Transferência de Ficheiro" #: gajim/filetransfers_window.py:584 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" #: gajim/filetransfers_window.py:677 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" #: gajim/filetransfers_window.py:730 gajim/filetransfers_window.py:733 msgid "Invalid File" msgstr "Ficheiro Inválido" #: gajim/filetransfers_window.py:730 msgid "File: " msgstr "Ficheiro: " #: gajim/filetransfers_window.py:734 msgid "It is not possible to send empty files" msgstr "Não é possível enviar ficheiros vazios" #: gajim/filetransfers_window.py:759 gajim/tooltips.py:658 msgid "Name: " msgstr "Nome: " #: gajim/filetransfers_window.py:761 gajim/tooltips.py:661 msgid "Sender: " msgstr "Remetente: " #: gajim/filetransfers_window.py:889 msgid "Pause" msgstr "Pausa" #: gajim/filetransfers_window.py:900 msgid "_Continue" msgstr "_Continuar" #: gajim/features_window.py:48 msgid "Bonjour / Zeroconf" msgstr "" #: gajim/features_window.py:49 msgid "Serverless chatting with autodetected clients in a local network." msgstr "" #: gajim/features_window.py:50 msgid "Requires python-avahi." msgstr "" #: gajim/features_window.py:51 msgid "" "Requires pybonjour and bonjour SDK running (http://developer.apple.com/" "opensource/)." msgstr "" #: gajim/features_window.py:52 #, fuzzy msgid "Command line" msgstr "Comandos: %s" #: gajim/features_window.py:53 msgid "A script to control Gajim via commandline." msgstr "" #: gajim/features_window.py:54 msgid "Requires python-dbus." msgstr "" #: gajim/features_window.py:55 gajim/features_window.py:83 #: gajim/features_window.py:87 msgid "Feature not available under Windows." msgstr "" #: gajim/features_window.py:56 #, fuzzy msgid "OpenPGP message encryption" msgstr "Encriptação OpenPGP" #: gajim/features_window.py:57 #, fuzzy msgid "Ability to encrypting chat messages with OpenPGP." msgstr "Mensagem recebida:" #: gajim/features_window.py:58 msgid "Requires gpg and python-gnupg (http://code.google.com/p/python-gnupg/)." msgstr "" #: gajim/features_window.py:59 msgid "Requires gpg.exe in PATH." msgstr "" #: gajim/features_window.py:60 #, fuzzy msgid "Password encryption" msgstr "As senhas não conferem" #: gajim/features_window.py:61 msgid "Passwords can be stored securely and not just in plaintext." msgstr "" #: gajim/features_window.py:62 msgid "" "Requires libsecret and a provider (such as GNOME Keyring and KSecretService)." msgstr "" #: gajim/features_window.py:63 msgid "On Windows the Windows Credential Vault is used." msgstr "" #: gajim/features_window.py:64 msgid "Spell Checker" msgstr "" #: gajim/features_window.py:65 msgid "Spellchecking of composed messages." msgstr "" #: gajim/features_window.py:66 gajim/features_window.py:67 msgid "Requires Gspell" msgstr "" #: gajim/features_window.py:68 #, fuzzy msgid "Automatic status" msgstr "Pedir para ver o estado dele/dela" #: gajim/features_window.py:69 msgid "Ability to measure idle time, in order to set auto status." msgstr "" #: gajim/features_window.py:70 msgid "Requires libxss library." msgstr "" #: gajim/features_window.py:71 msgid "Requires python2.5." msgstr "" #: gajim/features_window.py:72 #, fuzzy msgid "End to End message encryption" msgstr "Encriptação OpenPGP" #: gajim/features_window.py:73 #, fuzzy msgid "Encrypting chat messages." msgstr "Mensagem recebida:" #: gajim/features_window.py:74 gajim/features_window.py:75 msgid "Requires python-crypto." msgstr "" #: gajim/features_window.py:76 #, fuzzy msgid "RST Generator" msgstr "Geral" #: gajim/features_window.py:77 msgid "" "Generate XHTML output from RST code (see http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." msgstr "" #: gajim/features_window.py:78 gajim/features_window.py:79 msgid "Requires python-docutils." msgstr "" #: gajim/features_window.py:80 gajim/data/gui/preferences_window.ui:2421 msgid "Audio / Video" msgstr "" #: gajim/features_window.py:81 msgid "Ability to start audio and video chat." msgstr "" #: gajim/features_window.py:82 msgid "" "Requires gir1.2-farstream-0.2, gir1.2-gstreamer-1.0, gstreamer1.0-libav and " "gstreamer1.0-plugins-ugly." msgstr "" #: gajim/features_window.py:84 msgid "UPnP-IGD" msgstr "" #: gajim/features_window.py:85 msgid "Ability to request your router to forward port for file transfer." msgstr "" #: gajim/features_window.py:86 msgid "Requires gir1.2-gupnpigd-1.0." msgstr "" #: gajim/features_window.py:94 #, fuzzy msgid "?features:Available" msgstr "Disponível" #: gajim/features_window.py:101 #, fuzzy msgid "Feature" msgstr "Recursos dos Servidores" #: gajim/gtkgui_helpers.py:255 msgid "Error reading file:" msgstr "Erro na leitura do ficheiro:" #: gajim/gtkgui_helpers.py:258 msgid "Error parsing file:" msgstr "Erro na interpretação (parsing) do ficheiro:" #: gajim/gtkgui_helpers.py:478 msgid "Extension not supported" msgstr "" #: gajim/gtkgui_helpers.py:479 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "" #: gajim/gtkgui_helpers.py:514 #, fuzzy msgid "Save Image as…" msgstr "Guardar Ficheiro como..." #: gajim/vcard.py:166 gajim/vcard.py:513 gajim/profile_window.py:175 #: gajim/chat_control.py:581 #, fuzzy msgid "Save _As" msgstr "Guardado em: %s" #: gajim/vcard.py:289 gajim/vcard.py:296 msgid "?Client:Unknown" msgstr "?Cliente:Desconhecido" #: gajim/vcard.py:293 gajim/vcard.py:298 msgid "?OS:Unknown" msgstr "?SO:Desconhecido" #: gajim/vcard.py:327 gajim/vcard.py:330 #, fuzzy msgid "?Time:Unknown" msgstr "?Cliente:Desconhecido" #: gajim/vcard.py:381 msgid "?Role in Group Chat:Role:" msgstr "" #: gajim/vcard.py:385 #, fuzzy msgid "Affiliation:" msgstr "Aplicações" #: gajim/vcard.py:392 #, fuzzy msgid "" "This contact is interested in your presence information, but you are not " "interested in their presence" msgstr "" "Este contacto está interessado/a na suas informações de presença, mas você " "não está interessado na dele/a" #: gajim/vcard.py:394 #, fuzzy msgid "" "You are interested in the contact's presence information, but it is not " "mutual" msgstr "" "Está interessado nas informações de presença do contacto, mas ele/ela não " "está na sua" #: gajim/vcard.py:396 #, fuzzy msgid "The contact and you want to exchange presence information" msgstr "" "Você e o contacto estão interessados nas informações de presença um do outro" #: gajim/vcard.py:398 #, fuzzy msgid "" "You and the contact have a mutual disinterest in each-others presence " "information" msgstr "" "Você e o contacto estão interessados nas informações de presença um do outro" #: gajim/vcard.py:404 msgid "You are waiting contact's answer about your subscription request" msgstr "Está à espera da resposta do contacto sobre o seu pedido de subscrição" #: gajim/vcard.py:406 msgid "There is no pending subscription request." msgstr "" #: gajim/vcard.py:411 gajim/vcard.py:455 gajim/vcard.py:568 msgid " resource with priority " msgstr " recurso com prioridade " #: gajim/options_dialog.py:383 gajim/dialogs.py:4806 gajim/dialogs.py:4848 #: gajim/dialogs.py:4896 gajim/dialogs.py:4986 msgid "All files" msgstr "Todos os ficheiros" #: gajim/options_dialog.py:392 #, fuzzy msgid "Clear File" msgstr "Evento" #: gajim/options_dialog.py:474 #, fuzzy msgid "Manage Proxies" msgstr "Gerir Perfis de Proxy" #: gajim/options_dialog.py:484 gajim/options_dialog.py:552 #: gajim/options_dialog.py:573 gajim/dialogs.py:326 gajim/dialogs.py:328 #: gajim/dialogs.py:536 gajim/dialogs.py:549 gajim/roster_window.py:2997 #: gajim/roster_window.py:3003 gajim/roster_window.py:3008 gajim/config.py:1162 #: gajim/config.py:1177 gajim/config.py:1182 gajim/config.py:1230 #: gajim/config.py:1340 gajim/config.py:2489 gajim/config.py:2566 #: gajim/data/gui/account_creation_wizard_window.ui:22 #: gajim/data/gui/change_mood_dialog.ui:98 msgid "None" msgstr "Nenhum" #: gajim/options_dialog.py:506 #, fuzzy msgid "Adjust to Status" msgstr "Pedir para ver o estado dele/dela" #: gajim/options_dialog.py:518 msgid "On" msgstr "" #: gajim/options_dialog.py:518 #, fuzzy msgid "Off" msgstr "Offline" #: gajim/options_dialog.py:556 msgid "Failed to get secret keys" msgstr "Erro ao receber as chaves secretas" #: gajim/options_dialog.py:557 #, fuzzy msgid "There is no OpenPGP secret key available." msgstr "Houve um problema ao receber as suas chaves secretas OpenPGP." #: gajim/options_dialog.py:562 #, fuzzy msgid "OpenPGP Key Selection" msgstr "Encriptação OpenPGP" #: gajim/options_dialog.py:562 msgid "Choose your OpenPGP key" msgstr "Escolha sua chave OpenPGP" #: gajim/gui_menu_builder.py:100 #, fuzzy msgid "_New Group Chat" msgstr "Chat" #: gajim/gui_menu_builder.py:292 gajim/gui_menu_builder.py:416 #: gajim/dialogs.py:1114 gajim/dialogs.py:2333 gajim/dialogs.py:2362 #: gajim/dialogs.py:3867 gajim/chat_control.py:284 gajim/roster_window.py:804 #: gajim/roster_window.py:1753 gajim/roster_window.py:1755 #: gajim/roster_window.py:2068 gajim/roster_window.py:3419 #: gajim/roster_window.py:3446 gajim/gui_interface.py:524 #: gajim/common/contacts.py:154 gajim/common/contacts.py:280 #: gajim/common/helpers.py:95 gajim/common/helpers.py:408 msgid "Not in Roster" msgstr "Fora da lista" #: gajim/gui_menu_builder.py:431 msgid "I would like to add you to my roster" msgstr "Eu gostaria de o adicionar à minha lista" #: gajim/gui_menu_builder.py:508 #, fuzzy msgid "Send Single _Message…" msgstr "Enviar _Mensagem Simples" #: gajim/gui_menu_builder.py:521 gajim/roster_window.py:5165 #: gajim/data/gui/contact_context_menu.ui:58 #, fuzzy msgid "Send Cus_tom Status" msgstr "Pedir para ver o estado dele/dela" #: gajim/gui_menu_builder.py:541 #, fuzzy msgid "E_xecute Command…" msgstr "comando" #: gajim/gui_menu_builder.py:549 #, fuzzy msgid "_Manage Transport" msgstr "Transportes" #: gajim/gui_menu_builder.py:555 #, fuzzy msgid "_Modify Transport" msgstr "Transportes" #: gajim/gui_menu_builder.py:562 gajim/roster_window.py:5195 #, fuzzy msgid "_Rename…" msgstr "_Renomear" #: gajim/gui_menu_builder.py:573 gajim/roster_window.py:5212 #: gajim/roster_window.py:5327 gajim/data/gui/blocked_contacts_window.ui:52 #: gajim/data/gui/gc_occupants_menu.ui:148 #: gajim/data/gui/contact_context_menu.ui:166 msgid "_Unblock" msgstr "" #: gajim/gui_menu_builder.py:576 gajim/roster_window.py:5217 #: gajim/roster_window.py:5331 gajim/data/gui/gc_occupants_menu.ui:140 #: gajim/data/gui/contact_context_menu.ui:174 msgid "_Block" msgstr "" #: gajim/gui_menu_builder.py:584 gajim/roster_window.py:5224 #: gajim/data/gui/contact_context_menu.ui:204 #, fuzzy msgid "Remo_ve" msgstr "_Remover" #: gajim/gui_menu_builder.py:594 gajim/data/gui/search_window.ui:98 #, fuzzy msgid "_Information" msgstr "Informações do Contacto" #: gajim/gui_menu_builder.py:611 #, fuzzy msgid "Send File..." msgstr "Enviar _Ficheiro" #: gajim/gui_menu_builder.py:615 #, fuzzy msgid "Invite Contacts" msgstr "Contacto:" #: gajim/gui_menu_builder.py:616 #, fuzzy msgid "Add to Roster" msgstr "_Adicionar à Lista" #: gajim/gui_menu_builder.py:617 msgid "Audio Session" msgstr "" #: gajim/gui_menu_builder.py:618 msgid "Video Session" msgstr "" #: gajim/gui_menu_builder.py:619 #, fuzzy msgid "Information" msgstr "Informações do Contacto" #: gajim/gui_menu_builder.py:620 gajim/gui_menu_builder.py:655 #: gajim/data/gui/application_menu.ui:37 #, fuzzy msgid "History" msgstr "_Histórico" #: gajim/gui_menu_builder.py:644 #, fuzzy msgid "Manage Room" msgstr "Gerir Bookmarks" #: gajim/gui_menu_builder.py:645 #, fuzzy msgid "Change Subject" msgstr "Muda A_ssunto" #: gajim/gui_menu_builder.py:646 #, fuzzy msgid "Configure Room" msgstr "Configurar _Sala" #: gajim/gui_menu_builder.py:647 #, fuzzy msgid "Destroy Room" msgstr "Descrição: %s" #: gajim/gui_menu_builder.py:649 #, fuzzy msgid "Change Nick" msgstr "Muda Alcu_nha" #: gajim/gui_menu_builder.py:650 #, fuzzy msgid "Bookmark Room" msgstr "Adicionar esta Sala aos _Bookmarks" #: gajim/gui_menu_builder.py:651 #, fuzzy msgid "Request Voice" msgstr "_Voz" #: gajim/gui_menu_builder.py:652 gajim/data/gui/gc_control_popup_menu.ui:72 #, fuzzy msgid "Notify on all messages" msgstr "mensagem de estado:" #: gajim/gui_menu_builder.py:653 msgid "Minimize on close" msgstr "" #: gajim/gui_menu_builder.py:654 gajim/roster_window.py:5397 #, fuzzy msgid "Execute command" msgstr "comando" #: gajim/gui_menu_builder.py:656 #, fuzzy msgid "Disconnect" msgstr "Contacto Entrou" #: gajim/gui_menu_builder.py:685 gajim/gui_menu_builder.py:732 msgid "Join Group Chat" msgstr "Entrar num Chat" #: gajim/gui_menu_builder.py:731 #, fuzzy msgid "Add Contact..." msgstr "_Adicionar Contacto" #: gajim/gui_menu_builder.py:733 gajim/accounts_window.py:460 #: gajim/accounts_window.py:555 gajim/accounts_window.py:594 #, fuzzy msgid "Profile" msgstr "Ficheiro" #: gajim/gui_menu_builder.py:734 #, fuzzy msgid "Discover Services" msgstr "_Descobrir Recursos" #: gajim/gui_menu_builder.py:735 #, fuzzy msgid "Send Single Message..." msgstr "Enviar _Mensagem Simples" #: gajim/gui_menu_builder.py:736 gajim/data/gui/preferences_window.ui:2846 msgid "Advanced" msgstr "Avançado" #: gajim/gui_menu_builder.py:737 #, fuzzy msgid "Archiving Preferences" msgstr "_Preferências" #: gajim/gui_menu_builder.py:738 gajim/history_sync.py:44 #, fuzzy msgid "Synchronise History" msgstr "Mostrar Contactos _Offline" #: gajim/gui_menu_builder.py:739 gajim/dialogs.py:4583 #, fuzzy msgid "Privacy Lists" msgstr "Iniciar Conversa" #: gajim/gui_menu_builder.py:740 gajim/server_info.py:37 #, fuzzy msgid "Server Info" msgstr "Servidor" #: gajim/gui_menu_builder.py:741 gajim/data/gui/xml_console_window.ui:77 msgid "XML Console" msgstr "Consola XML" #: gajim/gui_menu_builder.py:743 #, fuzzy msgid "Admin" msgstr "_Admin" #: gajim/gui_menu_builder.py:744 #, fuzzy msgid "Send Server Message..." msgstr "E_nviar Mensagem de Servidor" #: gajim/gui_menu_builder.py:745 #, fuzzy msgid "Set MOTD..." msgstr "Definir MOTD" #: gajim/gui_menu_builder.py:746 #, fuzzy msgid "Update MOTD..." msgstr "Actualizar MOTD" #: gajim/gui_menu_builder.py:747 #, fuzzy msgid "Delete MOTD..." msgstr "Apagar MOTD" #: gajim/gui_menu_builder.py:787 #, fuzzy msgid "No Accounts available" msgstr "Nenhuma conta disponível" #: gajim/gui_menu_builder.py:799 gajim/data/gui/accounts_window.ui:78 #: gajim/data/gui/application_menu.ui:5 gajim/data/gui/application_menu.ui:71 #: gajim/data/gui/shortcuts_window.ui:181 msgid "Accounts" msgstr "Contas" #: gajim/history_manager.py:56 #, fuzzy msgid "Usage:" msgstr "mensagem" #: gajim/history_manager.py:58 #, fuzzy msgid "Options:" msgstr "Gerir Emoticons" #: gajim/history_manager.py:60 msgid "Show this help message and exit" msgstr "" #: gajim/history_manager.py:61 msgid "Choose folder for logfile" msgstr "" #: gajim/history_manager.py:104 #, fuzzy msgid "Cannot find history logs database" msgstr "a criar base de dados dos logs" #: gajim/history_manager.py:144 gajim/history_manager.py:195 #: gajim/dialogs.py:3848 gajim/config.py:1621 gajim/disco.py:872 msgid "JID" msgstr "JID" #: gajim/history_manager.py:157 gajim/history_manager.py:201 #: gajim/history_window.py:108 msgid "Date" msgstr "Data:" #: gajim/history_manager.py:164 gajim/history_manager.py:220 #: gajim/data/gui/join_groupchat_window.ui:131 #, fuzzy msgid "Nickname" msgstr "Alcunha:" #: gajim/history_manager.py:173 gajim/history_manager.py:208 #: gajim/history_window.py:116 gajim/data/gui/xml_console_window.ui:108 msgid "Message" msgstr "Mensagem" #: gajim/history_manager.py:181 gajim/history_manager.py:214 #, fuzzy msgid "Subject" msgstr "Assunto:" #: gajim/history_manager.py:243 msgid "" "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " "RUNNING)" msgstr "" #: gajim/history_manager.py:245 msgid "" "Normally allocated database size will not be freed, it will just become " "reusable. If you really want to reduce database filesize, click YES, else " "click NO.\n" "\n" "In case you click YES, please wait…" msgstr "" #: gajim/history_manager.py:250 msgid "Database Cleanup" msgstr "" #: gajim/history_manager.py:464 #, fuzzy msgid "Exporting History Logs…" msgstr "Fazendo a 'migração' dos logs..." #: gajim/history_manager.py:540 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "" #: gajim/history_manager.py:578 #, fuzzy, python-format msgid "Do you wish to delete all correspondence with %(jid)s?" msgstr "O que pretende fazer?" #: gajim/history_manager.py:582 #, fuzzy msgid "Do you wish to delete all correspondence with the selected contacts?" msgstr "O que pretende fazer?" #: gajim/history_manager.py:584 #, fuzzy msgid "This can not be undone." msgstr "O serviço não pôde ser encontrado" #: gajim/history_manager.py:586 gajim/history_manager.py:625 #, fuzzy msgid "Deletion Confirmation" msgstr "Informações do Contacto" #: gajim/history_manager.py:620 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "" msgstr[1] "" #: gajim/history_manager.py:623 msgid "This is an irreversible operation." msgstr "" #: gajim/profile_window.py:63 msgid "Retrieving profile…" msgstr "" #: gajim/profile_window.py:128 msgid "Could not load image" msgstr "" #: gajim/profile_window.py:200 #, fuzzy msgid "Wrong date format" msgstr "Informações do Contacto" #: gajim/profile_window.py:201 #, fuzzy msgid "Format of the date must be YYYY-MM-DD" msgstr "Formato: AAAA-MM-DD" #: gajim/profile_window.py:261 #, fuzzy msgid "Information received" msgstr "Convite Recebido" #: gajim/profile_window.py:334 gajim/dialogs.py:2562 gajim/dialogs.py:2650 #: gajim/dialogs.py:3105 gajim/disco.py:536 gajim/gui_interface.py:1849 #: gajim/dialog_messages.py:32 msgid "You are not connected to the server" msgstr "Não está ligado ao servidor" #: gajim/profile_window.py:335 #, fuzzy msgid "Without a connection, you can not publish your contact information." msgstr "" "É necessária uma ligação para poder publicar as suas informações de contacto." #: gajim/profile_window.py:349 #, fuzzy msgid "Sending profile…" msgstr "Enviar Ficheiro" #: gajim/profile_window.py:368 msgid "Information NOT published" msgstr "" #: gajim/profile_window.py:375 msgid "vCard publication failed" msgstr "Publicação vCard falhou" #: gajim/profile_window.py:376 msgid "" "There was an error while publishing your personal information, try again " "later." msgstr "" "Ocorreu um erro na publicação das suas informações pessoais. Tenta novamente " "mais tarde." #: gajim/dialogs.py:90 #, fuzzy, python-format msgid "Contact name: %s" msgstr "Nome do Contacto %s" #: gajim/dialogs.py:92 #, fuzzy, python-format msgid "JID: %s" msgstr "JID: %s" #: gajim/dialogs.py:121 gajim/dialogs.py:133 gajim/roster_window.py:2939 #: gajim/roster_window.py:3953 gajim/roster_window.py:5234 #: gajim/accounts_window.py:463 gajim/common/contacts.py:105 #: gajim/common/contacts.py:137 gajim/data/gui/preferences_window.ui:569 #: gajim/data/gui/shortcuts_window.ui:176 msgid "General" msgstr "Geral" #: gajim/dialogs.py:206 msgid "Group" msgstr "Grupo" #: gajim/dialogs.py:213 msgid "In the group" msgstr "Neste grupo" #: gajim/dialogs.py:308 msgid "KeyID" msgstr "KeyID" #: gajim/dialogs.py:313 msgid "Contact name" msgstr "Nome do Contacto" #: gajim/dialogs.py:491 #, fuzzy msgid "Set Mood" msgstr "Definir MOTD" #: gajim/dialogs.py:611 #, python-format msgid "%s Status Message" msgstr "Mensagem de Estado de %s" #: gajim/dialogs.py:625 msgid "Status Message" msgstr "Mensagem de Estado" #: gajim/dialogs.py:815 #, fuzzy msgid "Overwrite Status Message?" msgstr "Mensagem de Estado" #: gajim/dialogs.py:816 msgid "" "This name is already used. Do you want to overwrite this status message?" msgstr "" #: gajim/dialogs.py:824 msgid "Save as Preset Status Message" msgstr "Guardar como Mensagem de Estado Pré-definida" #: gajim/dialogs.py:825 #, fuzzy msgid "Please type a name for this status message" msgstr "Escreva a sua nova mensagem de estado:" #: gajim/dialogs.py:852 #, fuzzy msgid "JID:" msgstr "O seu JID:" #: gajim/dialogs.py:853 #, fuzzy msgid "AIM Address:" msgstr "_Endereço:" #: gajim/dialogs.py:854 msgid "GG Number:" msgstr "" #: gajim/dialogs.py:855 msgid "ICQ Number:" msgstr "" #: gajim/dialogs.py:856 #, fuzzy msgid "MSN Address:" msgstr "_Endereço:" #: gajim/dialogs.py:857 #, fuzzy msgid "Yahoo! Address:" msgstr "Complemento:" #: gajim/dialogs.py:894 #, fuzzy, python-format msgid "" "Please fill in the data of the contact you want to add to your account " "%s" msgstr "" "Por favor preencha os dados do contacto que deseja adicionar na conta %s" #: gajim/dialogs.py:897 msgid "Please fill in the data of the contact you want to add" msgstr "Por favor preencha os dados do contacto que deseja adicionar" #: gajim/dialogs.py:1089 gajim/dialogs.py:1095 gajim/dialogs.py:1100 msgid "Invalid User ID" msgstr "ID de Utilizador inválido" #: gajim/dialogs.py:1096 #, fuzzy msgid "The user ID must not contain a resource." msgstr "Este serviço não contém quaisquer itens para explorar" #: gajim/dialogs.py:1101 #, fuzzy msgid "You cannot add yourself to your roster." msgstr "Eu gostaria de o adicionar à minha lista" #: gajim/dialogs.py:1115 msgid "Contact already in roster" msgstr "Contacto já se encontra na lista" #: gajim/dialogs.py:1116 msgid "This contact is already listed in your roster." msgstr "Este contacto já se encontra na sua lista de contactos." #: gajim/dialogs.py:1169 gajim/dialogs.py:1203 #, fuzzy msgid "User ID:" msgstr "ID do Utilizador:" #: gajim/dialogs.py:1269 #, fuzzy msgid "Error while adding transport contact" msgstr "erro ao enviar" #: gajim/dialogs.py:1270 #, python-format msgid "" "This error occured while adding a contact for transport %(transport)s:\n" "\n" "%(error)s" msgstr "" #: gajim/dialogs.py:1302 #, fuzzy msgid "A GTK+ XMPP client" msgstr "Cliente Jabber GTK+" #: gajim/dialogs.py:1303 #, python-format msgid "GTK+ Version: %s" msgstr "" #: gajim/dialogs.py:1304 #, python-format msgid "PyGObject Version: %s" msgstr "" #: gajim/dialogs.py:1305 #, python-format msgid "python-nbxmpp Version: %s" msgstr "" #: gajim/dialogs.py:1308 msgid "Current Developers" msgstr "" #: gajim/dialogs.py:1309 msgid "Past Developers" msgstr "" #: gajim/dialogs.py:1310 msgid "Artists" msgstr "" #: gajim/dialogs.py:1314 msgid "Last but not least" msgstr "" #: gajim/dialogs.py:1315 msgid "we would like to thank all the package maintainers." msgstr "" #: gajim/dialogs.py:1316 msgid "Thanks" msgstr "" #: gajim/dialogs.py:1318 msgid "translator-credits" msgstr "Miguel Fonseca " #: gajim/dialogs.py:1503 #, fuzzy, python-format msgid "Dictionary for language \"%s\" not available" msgstr "Uma ligação não está disponível" #: gajim/dialogs.py:1504 #, python-format msgid "" "You have to install the dictionary \"%s\" to use spellchecking, or choose " "another language by setting the speller_language option.\n" "\n" "Highlighting misspelled words feature will not be used" msgstr "" #: gajim/dialogs.py:1851 gajim/dialogs.py:1866 gajim/gui_interface.py:1511 #: gajim/gui_interface.py:1553 #, fuzzy msgid "Insecure connection" msgstr "Ligação" #: gajim/dialogs.py:1852 #, fuzzy, python-format msgid "" "You are about to connect to the account %(account)s (%(server)s) insecurely. " "This means conversations will not be encrypted, and is strongly " "discouraged.\n" "Are you sure you want to do that?" msgstr "Tem de criar uma conta antes de poder conversar com outros contactos." #: gajim/dialogs.py:1857 gajim/gui_interface.py:1515 #: gajim/gui_interface.py:1556 msgid "Yes, I really want to connect insecurely" msgstr "" #: gajim/dialogs.py:1858 msgid "Gajim will NOT connect unless you check this box" msgstr "" #: gajim/dialogs.py:1859 gajim/groupchat_control.py:2335 #: gajim/roster_window.py:2897 gajim/roster_window.py:3529 #: gajim/roster_window.py:4282 gajim/message_window.py:247 #: gajim/gui_interface.py:725 gajim/gui_interface.py:1516 #: gajim/gui_interface.py:1557 #, fuzzy msgid "_Do not ask me again" msgstr "_Não voltar a perguntar" #: gajim/dialogs.py:1957 msgid "_Resume" msgstr "" #: gajim/dialogs.py:1965 msgid "Re_place" msgstr "" #: gajim/dialogs.py:2168 gajim/config.py:2169 #: gajim/command_system/implementation/standard.py:261 #, fuzzy msgid "Invalid nickname" msgstr "Nome de utilizador inválido" #: gajim/dialogs.py:2169 #, fuzzy msgid "The nickname contains invalid characters." msgstr "Alcunha não encontrada: %s" #: gajim/dialogs.py:2291 msgid "Subscription Request" msgstr "Pedido de Subscrição" #: gajim/dialogs.py:2300 #, fuzzy, python-format msgid "Subscription request for account %(account)s from %(jid)s" msgstr "Pedido de subscrição para a conta %s por parte de %s" #: gajim/dialogs.py:2303 #, python-format msgid "Subscription request from %s" msgstr "Pedido de subscrição de %s" #: gajim/dialogs.py:2375 gajim/data/gui/join_groupchat_window.ui:312 #, fuzzy msgid "Join Groupchat" msgstr "Entrar num Chat" #: gajim/dialogs.py:2531 #, fuzzy msgid "Invalid Room" msgstr "Entrada inválida" #: gajim/dialogs.py:2532 msgid "Please choose a room" msgstr "" #: gajim/dialogs.py:2544 gajim/dialogs.py:2551 #, fuzzy msgid "Invalid Nickname" msgstr "Nome de utilizador inválido" #: gajim/dialogs.py:2545 msgid "Please choose a nickname" msgstr "" #: gajim/dialogs.py:2557 gajim/dialogs.py:3516 gajim/config.py:2453 #: gajim/dialog_messages.py:37 gajim/dialog_messages.py:42 #, fuzzy msgid "Invalid JID" msgstr "Jabber ID Inválido" #: gajim/dialogs.py:2563 gajim/gui_interface.py:1850 msgid "You can not join a group chat unless you are connected." msgstr "Não pode entrar num chat sem estar ligado." #: gajim/dialogs.py:2617 gajim/dialogs.py:2628 #, fuzzy msgid "Wrong server" msgstr "Frase de acesso" #: gajim/dialogs.py:2618 gajim/dialogs.py:2629 #, fuzzy, python-format msgid "%s is not a groupchat server" msgstr "Perguntar antes de fechar uma janela/aba de chat." #: gajim/dialogs.py:2651 #, fuzzy msgid "Without a connection, you can not synchronise your contacts." msgstr "Tem de estar ligado para poder mudar a sua senha." #: gajim/dialogs.py:2662 gajim/dialogs.py:2733 gajim/dialogs.py:3851 #: gajim/history_window.py:100 gajim/disco.py:865 gajim/disco.py:1693 #: gajim/disco.py:1978 msgid "Name" msgstr "Nome" #: gajim/dialogs.py:2665 gajim/data/gui/join_groupchat_window.ui:214 msgid "Server" msgstr "Servidor" #: gajim/dialogs.py:2701 #, fuzzy msgid "This account is not connected to the server" msgstr "Conta \"%s\" está ligada ao servidor" #: gajim/dialogs.py:2702 #, fuzzy msgid "You cannot synchronize with an account unless it is connected." msgstr "Não pode entrar num chat sem estar ligado." #: gajim/dialogs.py:2731 msgid "Synchronise" msgstr "" #: gajim/dialogs.py:2794 #, fuzzy msgid "Start new Conversation" msgstr "Ligação" #: gajim/dialogs.py:3052 #, fuzzy msgid "New Groupchat" msgstr "Chat" #: gajim/dialogs.py:3054 #, fuzzy msgid "New Contact" msgstr "Adicionar Novo Contacto" #: gajim/dialogs.py:3106 msgid "Without a connection, you can not change your password." msgstr "Tem de estar ligado para poder mudar a sua senha." #: gajim/dialogs.py:3126 msgid "Invalid password" msgstr "Senha Inválida" #: gajim/dialogs.py:3126 msgid "You must enter a password." msgstr "Deve introduzir uma senha." #: gajim/dialogs.py:3130 msgid "Passwords do not match" msgstr "As senhas não conferem" #: gajim/dialogs.py:3131 msgid "The passwords typed in both fields must be identical." msgstr "As senhas introduzidas em ambos os campos devem ser idênticas." #: gajim/dialogs.py:3169 gajim/notify.py:91 #: gajim/common/connection_handlers_events.py:2821 msgid "Contact Signed In" msgstr "Contacto Entrou" #: gajim/dialogs.py:3171 gajim/notify.py:91 #: gajim/common/connection_handlers_events.py:2827 msgid "Contact Signed Out" msgstr "Contacto Saiu" #: gajim/dialogs.py:3173 gajim/notify.py:92 gajim/notify.py:105 #: gajim/common/connection_handlers_events.py:2641 msgid "New Message" msgstr "Nova Mensagem" #: gajim/dialogs.py:3173 gajim/notify.py:92 gajim/notify.py:105 #: gajim/common/connection_handlers_events.py:2623 msgid "New Single Message" msgstr "Nova Mensagem Instantânea" #: gajim/dialogs.py:3174 gajim/notify.py:92 gajim/notify.py:106 #: gajim/common/connection_handlers_events.py:2629 msgid "New Private Message" msgstr "Nova Mensagem Privada" #: gajim/dialogs.py:3174 #, fuzzy msgid "New E-mail" msgstr "E-Mail" #: gajim/dialogs.py:3176 gajim/gui_interface.py:926 gajim/notify.py:93 msgid "File Transfer Request" msgstr "Pedido de Transferência de Ficheiro" #: gajim/dialogs.py:3178 gajim/gui_interface.py:861 gajim/gui_interface.py:891 #: gajim/notify.py:94 msgid "File Transfer Error" msgstr "Erro na Transferência de Ficheiro" #: gajim/dialogs.py:3180 gajim/gui_interface.py:1030 #: gajim/gui_interface.py:1059 gajim/gui_interface.py:1080 gajim/notify.py:94 msgid "File Transfer Completed" msgstr "Transferência de Ficheiro Completa" #: gajim/dialogs.py:3181 gajim/gui_interface.py:1034 #: gajim/gui_interface.py:1063 gajim/gui_interface.py:1084 gajim/notify.py:95 msgid "File Transfer Stopped" msgstr "Transferência de Ficheiro Parada" #: gajim/dialogs.py:3183 gajim/dialogs.py:4748 gajim/chat_control.py:1647 #: gajim/gui_interface.py:663 gajim/notify.py:95 #, fuzzy msgid "Groupchat Invitation" msgstr "?Função do Contacto no Chat:Nenhuma" #: gajim/dialogs.py:3185 gajim/notify.py:93 #: gajim/common/connection_handlers_events.py:2815 #, fuzzy msgid "Contact Changed Status" msgstr "Contacto Saiu" #: gajim/dialogs.py:3404 #, fuzzy, python-format msgid "Single Message using account %s" msgstr "Mensagem Simples com a conta %s" #: gajim/dialogs.py:3406 #, fuzzy, python-format msgid "Single Message in account %s" msgstr "Mensagem Simples com a conta %s" #: gajim/dialogs.py:3408 msgid "Single Message" msgstr "Mensagem Simples" #: gajim/dialogs.py:3411 #, python-format msgid "Send %s" msgstr "Enviar %s" #: gajim/dialogs.py:3434 #, python-format msgid "Received %s" msgstr "Recebido %s" #: gajim/dialogs.py:3457 #, fuzzy, python-format msgid "Form %s" msgstr "De %s" #: gajim/dialogs.py:3485 gajim/dialogs.py:3672 msgid "Connection not available" msgstr "Ligação indisponível" #: gajim/dialogs.py:3486 gajim/dialogs.py:3673 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Por favor, verifique se está ligado com \"%s\"." #: gajim/dialogs.py:3517 gajim/dialog_messages.py:43 #, fuzzy, python-format msgid "It is not possible to send a message to %s, this JID is not valid." msgstr "Não é possível enviar ficheiros vazios" #: gajim/dialogs.py:3540 #, python-format msgid "RE: %s" msgstr "RE: %s" #: gajim/dialogs.py:3541 #, python-format msgid "%s wrote:\n" msgstr "%s escreveu:\n" #: gajim/dialogs.py:3589 gajim/data/gui/shortcuts_window.ui:113 #, fuzzy msgid "Clear" msgstr "Evento" #: gajim/dialogs.py:3594 #, fuzzy msgid "Filter" msgstr "Filtro:" #: gajim/dialogs.py:3599 #, fuzzy msgid "XML Input" msgstr "Entrada XML" #: gajim/dialogs.py:3603 msgid "Send" msgstr "Enviar" #: gajim/dialogs.py:3794 #, fuzzy msgid "add" msgstr "Interrompida" #: gajim/dialogs.py:3794 #, fuzzy msgid "modify" msgstr "_Modificar" #: gajim/dialogs.py:3795 #, fuzzy msgid "remove" msgstr "_Remover" #: gajim/dialogs.py:3824 #, fuzzy, python-format msgid "" "%(jid)s would like you to %(action)s some contacts in your " "roster." msgstr "Gostaria de o adicionar à minha lista de contactos." #: gajim/dialogs.py:3840 gajim/dialogs.py:3886 gajim/accounts_window.py:44 #, fuzzy msgid "Add" msgstr "Endereço" #: gajim/dialogs.py:3842 gajim/dialogs.py:3917 #, fuzzy msgid "Modify" msgstr "_Modificar" #: gajim/dialogs.py:3844 gajim/dialogs.py:3941 #, fuzzy msgid "Delete" msgstr "Apagar MOTD" #: gajim/dialogs.py:3854 #, fuzzy msgid "Groups" msgstr "Grupo" #: gajim/dialogs.py:3962 #, fuzzy, python-format msgid "%s suggested me to add you in my roster." msgstr "Eu gostaria de o adicionar à minha lista" #: gajim/dialogs.py:3976 #, fuzzy, python-format msgid "Added %d contact" msgid_plural "Added %d contacts" msgstr[0] "Adicionar _Contacto" msgstr[1] "Adicionar _Contacto" #: gajim/dialogs.py:4014 #, fuzzy, python-format msgid "Removed %d contact" msgid_plural "Removed %d contacts" msgstr[0] "Remove o contacto da lista" msgstr[1] "Remove o contacto da lista" #: gajim/dialogs.py:4040 #, python-format msgid "Archiving Preferences for %s" msgstr "" #: gajim/dialogs.py:4078 msgid "Success!" msgstr "" #: gajim/dialogs.py:4078 #, fuzzy msgid "Your Archiving Preferences have been saved!" msgstr "_Preferências" #: gajim/dialogs.py:4094 msgid "We got no response from the Server" msgstr "" #: gajim/dialogs.py:4096 msgid "We received an error: {}" msgstr "" #: gajim/dialogs.py:4100 #, fuzzy msgid "Error!" msgstr "Erro:" #: gajim/dialogs.py:4159 #, fuzzy msgid "Add JID" msgstr "Jabber ID:" #: gajim/dialogs.py:4232 #, python-format msgid "Privacy List %s" msgstr "" #: gajim/dialogs.py:4236 #, python-format msgid "Privacy List for %s" msgstr "" #: gajim/dialogs.py:4238 gajim/data/gui/privacy_list_window.ui:47 msgid "Privacy List" msgstr "" #: gajim/dialogs.py:4309 #, python-format msgid "Order: %(order)s, action: %(action)s, type: %(type)s, value: %(value)s" msgstr "" #: gajim/dialogs.py:4314 #, fuzzy, python-format msgid "Order: %(order)s, action: %(action)s" msgstr "Descrição: %s" #: gajim/dialogs.py:4368 #, fuzzy msgid "Edit a rule" msgstr "Formato de uma linha" #: gajim/dialogs.py:4480 #, fuzzy msgid "Add a rule" msgstr "Formato de uma linha" #: gajim/dialogs.py:4581 #, python-format msgid "Privacy Lists for %s" msgstr "" #: gajim/dialogs.py:4677 #, fuzzy msgid "Invalid List Name" msgstr "Nome de utilizador inválido" #: gajim/dialogs.py:4678 #, fuzzy msgid "You must enter a name to create a privacy list." msgstr "Deve indicar uma palavra-passe à qual a nova conta será associada" #: gajim/dialogs.py:4714 #, fuzzy msgid "You are invited to a groupchat" msgstr "Está banido/a desta sala." #: gajim/dialogs.py:4717 #, fuzzy msgid "$Contact has invited you to join a discussion" msgstr "%(contact_jid)s foi convidado(a) para %(room_jid)s." #: gajim/dialogs.py:4719 #, fuzzy, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "%(contact_jid)s foi convidado(a) para %(room_jid)s." #: gajim/dialogs.py:4728 #, python-format msgid "Comment: %s" msgstr "Comentário: %s" #: gajim/dialogs.py:4730 msgid "Do you want to accept the invitation?" msgstr "" #: gajim/dialogs.py:4746 msgid "Reason (if you decline):" msgstr "" #: gajim/dialogs.py:4795 msgid "Choose Client Cert #PCKS12" msgstr "" #: gajim/dialogs.py:4811 gajim/accounts_window.py:657 msgid "PKCS12 Files" msgstr "" #: gajim/dialogs.py:4837 msgid "Choose Sound" msgstr "Escolher Som" #: gajim/dialogs.py:4853 msgid "Wav Sounds" msgstr "Sons Wav" #: gajim/dialogs.py:4883 msgid "Choose Image" msgstr "Escolha chave" #: gajim/dialogs.py:4901 msgid "Images" msgstr "Imagens" #: gajim/dialogs.py:4972 #, fuzzy msgid "Choose Archive" msgstr "Escolha chave" #: gajim/dialogs.py:4991 #, fuzzy msgid "Zip files" msgstr "Todos os ficheiros" #: gajim/dialogs.py:5017 #, python-format msgid "When %s becomes:" msgstr "" #: gajim/dialogs.py:5019 #, python-format msgid "Adding Special Notification for %s" msgstr "" #: gajim/dialogs.py:5259 msgid "an audio and video" msgstr "" #: gajim/dialogs.py:5261 msgid "an audio" msgstr "" #: gajim/dialogs.py:5263 msgid "a video" msgstr "" #: gajim/dialogs.py:5267 #, python-format msgid "" "%(contact)s wants to start %(type)s session with you. Do you want to answer " "the call?" msgstr "" #: gajim/dialogs.py:5372 gajim/dialogs.py:5408 #, fuzzy, python-format msgid "Certificate for account %s" msgstr "para conta %s" #: gajim/dialogs.py:5372 #, python-format msgid "" "Issued to:\n" "Common Name (CN): %(scn)s\n" "Organization (O): %(sorg)s\n" "Organizationl Unit (OU): %(sou)s\n" "Serial Number: %(sn)s\n" "\n" "Issued by:\n" "Common Name (CN): %(icn)s\n" "Organization (O): %(iorg)s\n" "Organizationl Unit (OU): %(iou)s\n" "\n" "Validity:\n" "Issued on: %(io)s\n" "Expires on: %(eo)s\n" "\n" "Fingerprint\n" "SHA-1 Fingerprint: %(sha1)s\n" "\n" "SHA256 Fingerprint: %(sha256)s\n" msgstr "" #: gajim/dialogs.py:5419 gajim/gui_interface.py:1405 #, python-format msgid "SSL Certificate Verification for %s" msgstr "" #: gajim/dialogs.py:5420 gajim/dialogs.py:5437 msgid "View cert…" msgstr "" #: gajim/dialogs.py:5453 gajim/data/gui/application_menu.ui:32 #, fuzzy msgid "File Transfer" msgstr "Transferências de Ficheiros" #: gajim/dialogs.py:5477 msgid "Requesting HTTP Upload Slot..." msgstr "" #: gajim/dialogs.py:5481 msgid "Uploading file via HTTP File Upload..." msgstr "" #: gajim/dialogs.py:5485 #, fuzzy msgid "Encrypting file..." msgstr "Encriptação desactivada" #: gajim/groupchat_control.py:193 gajim/groupchat_control.py:1839 #, fuzzy, python-format msgid "%(nick)s is now known as %(new_nick)s" msgstr "%s agora é conhecido como %s" #: gajim/groupchat_control.py:219 gajim/groupchat_control.py:1988 #: gajim/history_window.py:550 gajim/common/connection_handlers_events.py:2811 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s está agora %(status)s" #: gajim/groupchat_control.py:248 msgid "Sending private message failed" msgstr "Falha ao enviar uma mensagem privada" #: gajim/groupchat_control.py:250 #, fuzzy, python-format msgid "You are no longer in group chat \"%(room)s\" or \"%(nick)s\" has left." msgstr "Já não se encontra na sala \"%s\" ou \"%s\" saiu." #: gajim/groupchat_control.py:640 gajim/chat_control.py:326 #: gajim/chat_control.py:330 msgid "HTTP File Upload" msgstr "" #: gajim/groupchat_control.py:642 msgid "HTTP File Upload not supported by your server" msgstr "" #: gajim/groupchat_control.py:662 gajim/groupchat_control.py:2370 msgid "Changing Subject" msgstr "Mudar Assunto" #: gajim/groupchat_control.py:663 gajim/groupchat_control.py:2371 msgid "Please specify the new subject:" msgstr "Por favor, especifique o novo assunto:" #: gajim/groupchat_control.py:670 msgid "Changing Nickname" msgstr "Mudar Alcunha" #: gajim/groupchat_control.py:671 msgid "Please specify the new nickname you want to use:" msgstr "Por favor, especifique a nova alcunha a usar:" #: gajim/groupchat_control.py:688 #, fuzzy msgid "Invalid group chat JID" msgstr "Jabber ID Inválido" #: gajim/groupchat_control.py:689 #, fuzzy msgid "The group chat JID has not allowed characters." msgstr "Esta sala não tem assunto" #: gajim/groupchat_control.py:699 #, fuzzy, python-format msgid "Destroying %s" msgstr "Descrição: %s" #: gajim/groupchat_control.py:700 msgid "" "You are going to remove this room permanently.\n" "You may specify a reason below:" msgstr "" #: gajim/groupchat_control.py:702 msgid "You may also enter an alternate venue:" msgstr "" #: gajim/groupchat_control.py:880 #, fuzzy msgid "Insert Nickname" msgstr "Muda Alcu_nha" #: gajim/groupchat_control.py:1062 gajim/chat_control.py:803 #, fuzzy msgid "and authenticated" msgstr "Usar autenticação" #: gajim/groupchat_control.py:1066 gajim/chat_control.py:807 #, fuzzy msgid "and NOT authenticated" msgstr "Usar autenticação" #: gajim/groupchat_control.py:1070 gajim/chat_control.py:811 #, python-format msgid "%(type)s encryption is active %(authenticated)s." msgstr "" #: gajim/groupchat_control.py:1113 #, fuzzy msgid "Conversation with " msgstr "Histórico das Conversas" #: gajim/groupchat_control.py:1115 #, fuzzy msgid "Continued conversation" msgstr "Ligação" #: gajim/groupchat_control.py:1473 #, fuzzy, python-format msgid "%(nick)s has set the subject to %(subject)s" msgstr "%(nick)s foi expulso: %(reason)s" #: gajim/groupchat_control.py:1496 gajim/groupchat_control.py:1781 msgid "Any occupant is allowed to see your full JID" msgstr "" #: gajim/groupchat_control.py:1499 msgid "Room now shows unavailable members" msgstr "" #: gajim/groupchat_control.py:1501 msgid "Room now does not show unavailable members" msgstr "" #: gajim/groupchat_control.py:1503 msgid "A setting not related to privacy has been changed" msgstr "" #: gajim/groupchat_control.py:1507 msgid "Room logging is now enabled" msgstr "" #: gajim/groupchat_control.py:1509 msgid "Room logging is now disabled" msgstr "" #: gajim/groupchat_control.py:1511 msgid "Room is now non-anonymous" msgstr "" #: gajim/groupchat_control.py:1514 msgid "Room is now semi-anonymous" msgstr "" #: gajim/groupchat_control.py:1517 msgid "Room is now fully anonymous" msgstr "" #: gajim/groupchat_control.py:1557 gajim/chat_control.py:1268 #, python-format msgid "Pong! (%s s.)" msgstr "" #: gajim/groupchat_control.py:1774 gajim/groupchat_control.py:2398 #: gajim/roster_window.py:3129 gajim/gui_interface.py:621 #, fuzzy, python-format msgid "%(jid)s has been invited in this room" msgstr "%(nick)s foi expulso por %(who)s: %(reason)s" #: gajim/groupchat_control.py:1786 msgid "Room logging is enabled" msgstr "" #: gajim/groupchat_control.py:1788 #, fuzzy msgid "A new room has been created" msgstr "A sua nova conta foi criada com sucesso" #: gajim/groupchat_control.py:1791 msgid "The server has assigned or modified your roomnick" msgstr "" #: gajim/groupchat_control.py:1797 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s foi expulso: %(reason)s" #: gajim/groupchat_control.py:1800 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(nick)s foi expulso por %(who)s: %(reason)s" #: gajim/groupchat_control.py:1809 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s foi banido: %(reason)s" #: gajim/groupchat_control.py:1812 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(nick)s foi banido por %(who)s: %(reason)s" #: gajim/groupchat_control.py:1823 gajim/groupchat_control.py:1907 #, python-format msgid "You are now known as %s" msgstr "É agora conhecido como %s" #: gajim/groupchat_control.py:1861 gajim/groupchat_control.py:1866 #: gajim/groupchat_control.py:1872 #, fuzzy, python-format msgid "%(nick)s has been removed from the room (%(reason)s)" msgstr "%(nick)s foi expulso por %(who)s: %(reason)s" #: gajim/groupchat_control.py:1863 #, fuzzy msgid "affiliation changed" msgstr "Filiação: " #: gajim/groupchat_control.py:1868 msgid "room configuration changed to members-only" msgstr "" #: gajim/groupchat_control.py:1874 msgid "system shutdown" msgstr "" #: gajim/groupchat_control.py:1928 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s by %(actor)s" msgstr "" #: gajim/groupchat_control.py:1932 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s" msgstr "" #: gajim/groupchat_control.py:1947 #, fuzzy, python-format msgid "** Role of %(nick)s has been set to %(role)s by %(actor)s" msgstr "%(nick)s foi expulso por %(who)s: %(reason)s" #: gajim/groupchat_control.py:1951 #, fuzzy, python-format msgid "** Role of %(nick)s has been set to %(role)s" msgstr "%(nick)s foi expulso: %(reason)s" #: gajim/groupchat_control.py:1981 #, python-format msgid "%s has left" msgstr "%s saiu da sala" #: gajim/groupchat_control.py:1986 #, fuzzy, python-format msgid "%s has joined the group chat" msgstr "Neste grupo" #: gajim/groupchat_control.py:2329 #, fuzzy, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Tem a certeza de que deseja sair da sala \"%s\"?" #: gajim/groupchat_control.py:2331 #, fuzzy msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "Se fechar esta janela, perder-se-á a ligação a esta sala." #: gajim/groupchat_control.py:2550 #, python-format msgid "Kicking %s" msgstr "Expulsando %s" #: gajim/groupchat_control.py:2551 gajim/groupchat_control.py:2847 msgid "You may specify a reason below:" msgstr "Pode especificar uma razão em baixo:" #: gajim/groupchat_control.py:2846 #, python-format msgid "Banning %s" msgstr "Banindo %s" #: gajim/chat_control.py:328 gajim/chat_control.py:332 #, fuzzy msgid "Jingle File Transfer" msgstr "Transferências de Ficheiros" #: gajim/chat_control.py:334 #, fuzzy msgid "No File Transfer available" msgstr "Transferências de Ficheiros" #: gajim/chat_control.py:395 #, fuzzy msgid "Show a list of formattings" msgstr "Clique para inserir um emoticon (Alt+E)" #: gajim/chat_control.py:399 msgid "Formatting is not available so long as GPG is active" msgstr "" #: gajim/chat_control.py:402 #, fuzzy msgid "This contact does not support HTML" msgstr "Uma lista de transferências de ficheiros activas, completas e paradas" #: gajim/chat_control.py:514 #, python-format msgid "%(type)s state : %(state)s, reason: %(reason)s" msgstr "" #: gajim/chat_control.py:655 #, fuzzy, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s na sala %(room_name)s enviou-lhe uma nova mensagem." #: gajim/chat_control.py:903 msgid "Session negotiation cancelled" msgstr "" #: gajim/chat_control.py:913 msgid "This session WILL be archived on server" msgstr "" #: gajim/chat_control.py:915 msgid "This session WILL NOT be archived on server" msgstr "" #: gajim/chat_control.py:924 #, fuzzy msgid "This session is encrypted" msgstr "[Esta mensagem é encriptada]" #: gajim/chat_control.py:927 msgid " and WILL be logged" msgstr "" #: gajim/chat_control.py:929 msgid " and WILL NOT be logged" msgstr "" #: gajim/chat_control.py:934 msgid "" "Remote contact's identity not verified. Click the shield button for more " "details." msgstr "" #: gajim/chat_control.py:936 #, fuzzy msgid "E2E encryption disabled" msgstr "Encriptação desactivada" #: gajim/chat_control.py:1235 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Recebeu uma nova mensagem de \"%s\"" #: gajim/chat_control.py:1237 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." msgstr "" "Se fechar esta aba e o histórico estiver desactivado, esta mensagem será " "perdida." #: gajim/chat_control.py:1380 #, fuzzy, python-format msgid "" "Subject: %(subject)s\n" "%(message)s" msgstr "" "Assunto: %s\n" "%s" #: gajim/chat_control.py:1494 gajim/gui_interface.py:1197 #, python-format msgid "" "Unable to decrypt message from %s\n" "It may have been tampered with." msgstr "" #: gajim/chat_control.py:1532 #, fuzzy, python-format msgid "%(name)s is now %(status)s" msgstr "%(nick)s está agora %(status)s" #: gajim/chat_control.py:1591 #, fuzzy msgid "File transfer" msgstr "Transferências de Ficheiros" #: gajim/chat_control.py:1594 #, fuzzy msgid "Size" msgstr "Tamanho: " #: gajim/chat_control.py:1596 #, fuzzy msgid "Accept" msgstr "Aceitar" #: gajim/chat_control.py:1650 gajim/disco.py:1753 msgid "_Join" msgstr "_Entrar" #: gajim/chat_control.py:1669 gajim/roster_window.py:1991 #: gajim/gui_interface.py:1013 #, fuzzy msgid "Remote contact stopped transfer" msgstr "Remove o contacto da lista" #: gajim/chat_control.py:1671 gajim/roster_window.py:1993 #: gajim/gui_interface.py:1016 #, fuzzy msgid "Error opening file" msgstr "Erro na leitura do ficheiro:" #: gajim/roster_window.py:273 gajim/roster_window.py:1074 msgid "Merged accounts" msgstr "Contas fundidas" #: gajim/roster_window.py:857 gajim/roster_window.py:1757 #: gajim/roster_window.py:1759 gajim/roster_window.py:2602 #: gajim/roster_window.py:5125 gajim/message_window.py:519 #: gajim/common/contacts.py:133 gajim/common/commands.py:230 #: gajim/common/helpers.py:95 #, fuzzy msgid "Groupchats" msgstr "Chat" #: gajim/roster_window.py:896 gajim/roster_window.py:1665 #: gajim/roster_window.py:1698 gajim/roster_window.py:1749 #: gajim/roster_window.py:1751 gajim/roster_window.py:1912 #: gajim/roster_window.py:2575 gajim/roster_window.py:5155 gajim/disco.py:130 #: gajim/disco.py:131 gajim/disco.py:1460 gajim/common/contacts.py:135 #: gajim/common/contacts.py:378 gajim/common/helpers.py:95 msgid "Transports" msgstr "Transportes" #: gajim/roster_window.py:2045 #, fuzzy msgid "Authorization sent" msgstr "Autorização foi enviada" #: gajim/roster_window.py:2046 #, fuzzy, python-format msgid "\"%s\" will now see your status." msgstr "Agora \"%s\" saberá o seu estado." #: gajim/roster_window.py:2069 msgid "Subscription request has been sent" msgstr "Pedido de subscrição foi enviado" #: gajim/roster_window.py:2070 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Se \"%s\" aceitar este pedido, você passará a saber o seu estado." #: gajim/roster_window.py:2084 #, fuzzy msgid "Authorization removed" msgstr "Autorização foi removida" #: gajim/roster_window.py:2085 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Doravante, \"%s\" vê-lo-á sempre como estando offline." #: gajim/roster_window.py:2109 #, fuzzy msgid "OpenPGP is not usable" msgstr "Não é possível usar OpenPGP neste computador" #: gajim/roster_window.py:2110 #, python-format msgid "" "Gajim needs python-gnupg >= 0.3.8\n" "Beware there is an incompatible python package called gnupg.\n" "You will be connected to %s without OpenPGP." msgstr "" #: gajim/roster_window.py:2318 gajim/roster_window.py:3625 msgid "You are participating in one or more group chats" msgstr "Está a participar num ou mais chats" #: gajim/roster_window.py:2319 gajim/roster_window.py:3626 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" msgstr "" "Mudar o seu estado para invisível fará com que seja desligado desses chats. " "De certeza que deseja tornar-se invisível?" #: gajim/roster_window.py:2346 msgid "desync'ed" msgstr "" #: gajim/roster_window.py:2416 msgid "Really quit Gajim?" msgstr "" #: gajim/roster_window.py:2417 #, fuzzy msgid "Are you sure you want to quit Gajim?" msgstr "Tem a certeza de que deseja sair das salas \"%s\"?" #: gajim/roster_window.py:2418 msgid "Always close Gajim" msgstr "" #: gajim/roster_window.py:2505 #, fuzzy msgid "You have running file transfers" msgstr "Cancelar transferência de ficheiro" #: gajim/roster_window.py:2506 msgid "" "If you quit now, the file(s) being transferred will be stopped. Do you still " "want to quit?" msgstr "" #: gajim/roster_window.py:2537 gajim/roster_window.py:2828 msgid "You have unread messages" msgstr "Tem mensagens não lidas" #: gajim/roster_window.py:2538 #, fuzzy msgid "" "Messages will only be available for reading them later if you have history " "enabled and contact is in your roster." msgstr "" "As mensagens só poderão ser lidas mais tarde caso tenha o histórico activado." #: gajim/roster_window.py:2829 msgid "You must read them before removing this transport." msgstr "" #: gajim/roster_window.py:2832 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Transporte \"%s\" será removido" #: gajim/roster_window.py:2833 #, fuzzy msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." msgstr "" "Deixará de poder enviar e receber mensagens aos contactos desde este " "transport." #: gajim/roster_window.py:2836 #, fuzzy msgid "Transports will be removed" msgstr "Transporte \"%s\" será removido" #: gajim/roster_window.py:2841 #, fuzzy, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " "these transports: %s" msgstr "" "Deixará de poder enviar e receber mensagens aos contactos desde este " "transport." #: gajim/roster_window.py:2892 #, fuzzy msgid "You are about to block a contact. Are you sure you want to continue?" msgstr "Tem de criar uma conta antes de poder conversar com outros contactos." #: gajim/roster_window.py:2894 msgid "" "This contact will see you offline and you will not receive messages it sends " "you." msgstr "" #: gajim/roster_window.py:2934 #, fuzzy msgid "Rename Contact" msgstr "Contacto:" #: gajim/roster_window.py:2935 #, fuzzy, python-format msgid "Enter a new nickname for contact %s" msgstr "Introduza a chave GPG para a conta %s" #: gajim/roster_window.py:2942 #, fuzzy msgid "Rename Group" msgstr "_Renomear" #: gajim/roster_window.py:2943 #, fuzzy, python-format msgid "Enter a new name for group %s" msgstr "Introduza a chave GPG para a conta %s" #: gajim/roster_window.py:2988 #, fuzzy msgid "Remove Group" msgstr "_Remover" #: gajim/roster_window.py:2989 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "" #: gajim/roster_window.py:2990 #, fuzzy msgid "Also remove all contacts in this group from your roster" msgstr "Remove o contacto da lista" #: gajim/roster_window.py:3029 msgid "Assign OpenPGP Key" msgstr "Atribuir chave OpenPGP" #: gajim/roster_window.py:3030 msgid "Select a key to apply to the contact" msgstr "Selecione uma chave para aplicar ao contacto" #: gajim/roster_window.py:3436 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Contacto \"%s\" será removido de sua lista" #: gajim/roster_window.py:3438 #, python-format msgid "You are about to remove \"%(name)s\" (%(jid)s) from your roster.\n" msgstr "" #: gajim/roster_window.py:3443 #, fuzzy msgid "" "By removing this contact you also remove authorization resulting in them " "always seeing you as offline." msgstr "" "Ao remover este contacto, também remove a autorização. O contacto vê-lo-á " "sempre como offline." #: gajim/roster_window.py:3449 #, fuzzy msgid "Do you want to continue?" msgstr "O que pretende fazer?" #: gajim/roster_window.py:3453 #, fuzzy msgid "" "By removing this contact you also by default remove authorization resulting " "in them always seeing you as offline." msgstr "" "Ao remover este contacto, também remove a autorização. O contacto vê-lo-á " "sempre como offline." #: gajim/roster_window.py:3456 msgid "I want this contact to know my status after removal" msgstr "Quero que este contacto saiba o meu estado depois da remoção" #: gajim/roster_window.py:3460 #, fuzzy msgid "Contacts will be removed from your roster" msgstr "Contacto \"%s\" será removido de sua lista" #: gajim/roster_window.py:3465 #, fuzzy, python-format msgid "" "By removing these contacts:%s\n" "you also remove authorization resulting in them always seeing you as offline." msgstr "" "Ao remover este contacto, também remove a autorização. O contacto vê-lo-á " "sempre como offline." #: gajim/roster_window.py:3523 #, fuzzy msgid "" "You are about to send a custom status. Are you sure you want to continue?" msgstr "Tem de criar uma conta antes de poder conversar com outros contactos." #: gajim/roster_window.py:3525 #, python-format msgid "" "This contact will temporarily see you as %(status)s, but only until you " "change your status. Then they will see your global status." msgstr "" #: gajim/roster_window.py:3544 msgid "No account available" msgstr "Nenhuma conta disponível" #: gajim/roster_window.py:3545 msgid "You must create an account before you can chat with other contacts." msgstr "Tem de criar uma conta antes de poder conversar com outros contactos." #: gajim/roster_window.py:3676 gajim/gui_interface.py:2065 #: gajim/dialog_messages.py:64 #, fuzzy msgid "You cannot join a group chat while you are invisible" msgstr "Não pode entrar numa sala quando está invisível" #: gajim/roster_window.py:4178 msgid "Metacontacts storage not supported by your server" msgstr "" #: gajim/roster_window.py:4180 msgid "" "Your server does not support storing metacontacts information. So this " "information will not be saved on next reconnection." msgstr "" #: gajim/roster_window.py:4276 #, fuzzy msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "Tem de criar uma conta antes de poder conversar com outros contactos." #: gajim/roster_window.py:4278 msgid "" "Metacontacts are a way to regroup several contacts in one line. Generally it " "is used when the same person has several XMPP accounts or transport accounts." msgstr "" #: gajim/roster_window.py:4400 #, fuzzy msgid "Invalid file URI:" msgstr "Ficheiro Inválido" #: gajim/roster_window.py:4412 #, fuzzy, python-format msgid "Do you want to send this file to %s:" msgid_plural "Do you want to send these files to %s:" msgstr[0] "%s quer enviar-lhe um ficheiro:" msgstr[1] "%s quer enviar-lhe um ficheiro:" #: gajim/roster_window.py:4552 #, fuzzy, python-format msgid "Send %(from)s to %(to)s" msgstr "Enviar %s" #: gajim/roster_window.py:4565 #, fuzzy, python-format msgid "Make %s first contact" msgstr "Envia um ficheiro a um contacto" #: gajim/roster_window.py:4570 #, fuzzy, python-format msgid "Make %(contact1)s and %(contact2)s metacontacts" msgstr "Envia um ficheiro a um contacto" #: gajim/roster_window.py:4951 gajim/roster_window.py:5049 msgid "_Change Status Message" msgstr "_Mudar Mensagem de Estado" #: gajim/roster_window.py:4971 #, fuzzy msgid "Publish Tune" msgstr "_Publicar" #: gajim/roster_window.py:4982 #, fuzzy msgid "Publish Location" msgstr "_Publicar" #: gajim/roster_window.py:4994 #, fuzzy msgid "Configure Services…" msgstr "_Descobrir Recursos..." #: gajim/roster_window.py:5127 msgid "_Maximize All" msgstr "" #: gajim/roster_window.py:5134 gajim/roster_window.py:5296 #, fuzzy msgid "Send Group M_essage" msgstr "Nova Mensagem" #: gajim/roster_window.py:5141 msgid "To all users" msgstr "" #: gajim/roster_window.py:5145 #, fuzzy msgid "To all online users" msgstr "Utilizadores _Online" #: gajim/roster_window.py:5157 gajim/roster_window.py:5302 #: gajim/data/gui/gc_occupants_menu.ui:110 #: gajim/data/gui/contact_context_menu.ui:36 msgid "In_vite to" msgstr "" #: gajim/roster_window.py:5312 #, fuzzy msgid "_Manage Contacts" msgstr "Contacto:" #: gajim/roster_window.py:5318 #, fuzzy msgid "Edit _Groups…" msgstr "Editar _Grupos" #: gajim/roster_window.py:5339 gajim/data/gui/filetransfers.ui:11 #: gajim/data/gui/remove_account_window.ui:137 msgid "_Remove" msgstr "_Remover" #: gajim/roster_window.py:5377 msgid "_Maximize" msgstr "" #: gajim/roster_window.py:5384 #, fuzzy msgid "_Reconnect" msgstr "Contacto Entrou" #: gajim/roster_window.py:5389 gajim/data/gui/gc_control_popup_menu.ui:120 #, fuzzy msgid "_Disconnect" msgstr "Contacto Entrou" #: gajim/roster_window.py:5405 gajim/data/gui/gc_occupants_menu.ui:170 #: gajim/data/gui/gc_control_popup_menu.ui:113 #: gajim/data/gui/contact_context_menu.ui:228 msgid "_History" msgstr "_Histórico" #: gajim/roster_window.py:5481 gajim/data/gui/application_menu.ui:86 #, fuzzy msgid "History Manager" msgstr "_Histórico" #: gajim/roster_window.py:5489 #, fuzzy msgid "_Join New Group Chat" msgstr "_Entrar num Chat" #: gajim/gajim.py:74 #, fuzzy msgid "Show the application's version" msgstr "_Ícone na bandeja (também conhecido por área de notificação)" #: gajim/gajim.py:77 #, fuzzy msgid "Show only critical errors" msgstr "Mostrar apenas na _lista" #: gajim/gajim.py:80 msgid "Separate profile files completely (even history db and plugins)" msgstr "" #: gajim/gajim.py:84 msgid "Print XML stanzas and other debug information" msgstr "" #: gajim/gajim.py:88 #, fuzzy msgid "Use defined profile in configuration directory" msgstr "Editor de Configuração Avançada" #: gajim/gajim.py:92 #, fuzzy msgid "Set configuration directory" msgstr "Configuração da Sala" #: gajim/gajim.py:95 msgid "Configure logging system" msgstr "" #: gajim/gajim.py:98 #, fuzzy msgid "Show all warnings" msgstr "Mostrar Todos os _Eventos Pedentes" #: gajim/gajim.py:101 msgid "Open IPython shell" msgstr "" #: gajim/gajim.py:104 #, fuzzy msgid "Pops up a window with the next pending event" msgstr "Abre uma janela com a próxima mensagem não lida" #: gajim/gajim.py:107 gajim/data/gui/shortcuts_window.ui:202 #, fuzzy msgid "Start a new chat" msgstr "Iniciar Conversa" #: gajim/gajim.py:180 gajim/gui_interface.py:128 msgid "Database Error" msgstr "" #: gajim/history_sync.py:217 #, fuzzy msgid "How far back do you want to go?" msgstr "O que pretende fazer?" #: gajim/history_sync.py:222 msgid "One Month" msgstr "" #: gajim/history_sync.py:223 msgid "Three Months" msgstr "" #: gajim/history_sync.py:224 msgid "One Year" msgstr "" #: gajim/history_sync.py:225 msgid "Everything" msgstr "" #: gajim/history_sync.py:254 #, fuzzy msgid "Connecting..." msgstr "Ligando" #: gajim/history_sync.py:266 #, fuzzy, python-format msgid "%(received)s of %(max)s" msgstr "Transferência de %(filename)s de %(name)s interrompida." #: gajim/history_sync.py:270 #, fuzzy, python-format msgid "Downloaded %s Messages" msgstr "Gajim - %d mensagem não lida" #: gajim/history_sync.py:290 #, python-brace-format msgid "" "\n" " Finshed synchronising your History.\n" " {received} Messages downloaded.\n" " " msgstr "" #: gajim/history_sync.py:297 msgid "" "\n" " Gajim is fully synchronised\n" " with the Archive.\n" " " msgstr "" #: gajim/history_sync.py:304 msgid "" "\n" " There is already a synchronisation in\n" " progress. Please try later.\n" " " msgstr "" #: gajim/config.py:150 gajim/config.py:156 gajim/config.py:616 #: gajim/data/gui/preferences_window.ui:68 #: gajim/data/gui/preferences_window.ui:85 msgid "Disabled" msgstr "" #: gajim/config.py:411 gajim/config.py:415 gajim/config.py:1942 #, fuzzy msgid "Default" msgstr "Apagar MOTD" #: gajim/config.py:1128 msgid "status message title" msgstr "título da mensagem de estado" #: gajim/config.py:1129 msgid "status message text" msgstr "texto da mensagem de estado" #: gajim/config.py:1517 #, python-format msgid "Edit %s" msgstr "_Editar %s" #: gajim/config.py:1519 #, python-format msgid "Register to %s" msgstr "Registar para %s" #: gajim/config.py:1555 msgid "Ban List" msgstr "" #: gajim/config.py:1556 #, fuzzy msgid "Member List" msgstr "_Membro" #: gajim/config.py:1556 #, fuzzy msgid "Owner List" msgstr "_Dono" #: gajim/config.py:1557 #, fuzzy msgid "Administrator List" msgstr "_Administrador" #: gajim/config.py:1631 msgid "Reason" msgstr "" #: gajim/config.py:1638 #, fuzzy msgid "Nick" msgstr "_Expulsar" #: gajim/config.py:1644 #, fuzzy msgid "Role" msgstr "Função:" #: gajim/config.py:1670 msgid "Banning…" msgstr "Banindo..." #: gajim/config.py:1672 msgid "" "Whom do you want to ban?\n" "\n" msgstr "" "Quem pretende banir?\n" "\n" #: gajim/config.py:1674 msgid "Adding Member…" msgstr "" #: gajim/config.py:1675 msgid "" "Whom do you want to make a member?\n" "\n" msgstr "" "Quem quer tornar membro?\n" "\n" #: gajim/config.py:1677 msgid "Adding Owner…" msgstr "" #: gajim/config.py:1678 #, fuzzy msgid "" "Whom do you want to make an owner?\n" "\n" msgstr "O que pretende fazer?" #: gajim/config.py:1680 #, fuzzy msgid "Adding Administrator…" msgstr "_Administrador" #: gajim/config.py:1681 msgid "" "Whom do you want to make an administrator?\n" "\n" msgstr "" "Quem quer eleger como administrador?\n" "\n" #: gajim/config.py:1682 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" "2. user@domain (any resource matches).\n" "3. domain/resource (only that resource matches).\n" "4. domain (the domain itself matches, as does any user@domain,\n" "domain/resource, or address containing a subdomain)." msgstr "" #: gajim/config.py:1783 #, python-format msgid "Removing %s account" msgstr "Removendo %s conta" #: gajim/config.py:1798 #, fuzzy msgid "Account is disabled" msgstr "Encriptação desactivada" #: gajim/config.py:1799 msgid "To unregister from a server, account must be enabled." msgstr "" #: gajim/config.py:1813 gajim/gui_interface.py:314 gajim/gui_interface.py:748 msgid "Password Required" msgstr "Senha Necessária" #: gajim/config.py:1814 gajim/gui_interface.py:733 #, python-format msgid "Enter your password for account %s" msgstr "Introduza a sua senha para a conta %s" #: gajim/config.py:1815 gajim/gui_interface.py:748 msgid "Save password" msgstr "Guardar senha" #: gajim/config.py:1826 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Conta \"%s\" está ligada ao servidor" #: gajim/config.py:1827 msgid "If you remove it, the connection will be lost." msgstr "Se remover isto, a ligação será perdida." #: gajim/config.py:1842 #, python-format msgid "Connection to server %s failed" msgstr "A ligação ao servidor %s falhou" #: gajim/config.py:1843 msgid "What would you like to do?" msgstr "O que pretende fazer?" #: gajim/config.py:1844 #, fuzzy msgid "Remove only from Gajim" msgstr "Remover conta _apenas do Gajim" #: gajim/config.py:1845 msgid "Don't remove anything. I'll try again later" msgstr "" #: gajim/config.py:1942 #, fuzzy msgid "?print_status:All" msgstr "Mostrar hora:" #: gajim/config.py:1943 msgid "Enter and leave only" msgstr "" #: gajim/config.py:1944 #, fuzzy msgid "?print_status:None" msgstr "Mostrar hora:" #: gajim/config.py:2010 #, fuzzy msgid "New Group Chat" msgstr "Chat" #: gajim/config.py:2046 msgid "This bookmark has invalid data" msgstr "Este bookmark tem dados inválidos" #: gajim/config.py:2047 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "" "Por favor, verifique se preencheu os campos servidor e sala ou remova este " "bookmark" #: gajim/config.py:2170 gajim/config.py:2186 gajim/config.py:2197 #: gajim/config.py:2225 msgid "Character not allowed" msgstr "Carácter não permitido" #: gajim/config.py:2185 gajim/config.py:2196 gajim/config.py:2475 #, fuzzy msgid "Invalid server" msgstr "Nome de utilizador inválido" #: gajim/config.py:2224 #, fuzzy msgid "Invalid room" msgstr "Entrada inválida" #: gajim/config.py:2389 msgid "Account has been added successfully" msgstr "A conta foi adicionada com sucesso" #: gajim/config.py:2390 gajim/config.py:2396 #, fuzzy msgid "" "You can set advanced account options by pressing the Advanced button, or " "later by choosing the Accounts menu item under the Edit menu from the main " "window." msgstr "" "Pode ajustar opções de conta avançadas clicando no botão Avançadas, ou mais " "tarde clicando no item de menu Contas dentro do menu Editar a partir da " "janela principal." #: gajim/config.py:2395 msgid "Your new account has been created successfully" msgstr "A sua nova conta foi criada com sucesso" #: gajim/config.py:2433 msgid "Invalid username" msgstr "Nome de utilizador inválido" #: gajim/config.py:2435 msgid "You must provide a username to configure this account." msgstr "Deve introduzir um nome de utilizador para configurar esta conta." #: gajim/config.py:2476 #, fuzzy msgid "Please provide a server on which you want to register." msgstr "Por favor, especifique a nova alcunha a usar:" #: gajim/config.py:2499 msgid "Invalid entry" msgstr "Entrada inválida" #: gajim/config.py:2500 msgid "Custom port must be a port number." msgstr "A porta do proxy deve ser um número de porta" #: gajim/config.py:2532 gajim/gui_interface.py:1360 #, fuzzy msgid "Certificate Already in File" msgstr "Contacto já se encontra na lista" #: gajim/config.py:2533 gajim/gui_interface.py:1361 #, python-format msgid "This certificate is already in file %s, so it's not added again." msgstr "" #: gajim/config.py:2626 #, python-format msgid "" "Security Warning\n" "\n" "The authenticity of the %(hostname)s SSL certificate could be invalid.\n" "SSL Error: %(error)s\n" "Do you still want to connect to this server?" msgstr "" #: gajim/config.py:2632 #, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA-1 fingerprint of the certificate:\n" "%(sha1)s\n" "SHA-256 fingerprint of the certificate:\n" "%(sha256)s" msgstr "" #: gajim/config.py:2666 gajim/config.py:2700 #, fuzzy msgid "An error occurred during account creation" msgstr "Ocorreu um erro ao criar a conta" #: gajim/config.py:2763 msgid "Account name is in use" msgstr "Nome de conta em uso" #: gajim/config.py:2764 msgid "You already have an account using this name." msgstr "Já tem uma conta usando este nome." #: gajim/config.py:2896 msgid "PEP node was not removed" msgstr "" #: gajim/config.py:2897 #, python-format msgid "PEP node %(node)s was not removed: %(message)s" msgstr "" #: gajim/config.py:2925 #, python-format msgid "Configure %s" msgstr "Configurar %s" #: gajim/config.py:2942 gajim/plugins/gui.py:95 msgid "Active" msgstr "Activo" #: gajim/config.py:2950 msgid "Event" msgstr "Evento" #: gajim/config.py:2984 #, fuzzy msgid "Attention Message Received" msgstr "Nova Mensagem" #: gajim/config.py:2985 msgid "First Message Received" msgstr "" #: gajim/config.py:2986 #, fuzzy msgid "Next Message Received Focused" msgstr "Nova Mensagem" #: gajim/config.py:2988 #, fuzzy msgid "Next Message Received Unfocused" msgstr "Nova Mensagem" #: gajim/config.py:2989 #, fuzzy msgid "Contact Connected" msgstr "Nome do Contacto" #: gajim/config.py:2990 #, fuzzy msgid "Contact Disconnected" msgstr "Contacto Entrou" #: gajim/config.py:2991 #, fuzzy msgid "Message Sent" msgstr "Mensagem" #: gajim/config.py:2992 msgid "Group Chat Message Highlight" msgstr "" #: gajim/config.py:2993 msgid "Group Chat Message Received" msgstr "" #: gajim/tooltips.py:240 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "" #: gajim/tooltips.py:269 gajim/common/helpers.py:473 #, fuzzy msgid "?Group Chat Contact Affiliation:None" msgstr "?Função do Contacto no Chat:Nenhuma" #: gajim/tooltips.py:271 gajim/common/helpers.py:479 #, fuzzy msgid "Member" msgstr "_Membro" #: gajim/tooltips.py:273 gajim/common/helpers.py:477 #, fuzzy msgid "Administrator" msgstr "_Administrador" #: gajim/tooltips.py:275 gajim/common/helpers.py:475 #, fuzzy msgid "Owner" msgstr "_Dono" #: gajim/tooltips.py:433 msgid " [blocked]" msgstr "" #: gajim/tooltips.py:437 msgid " [minimized]" msgstr "" #: gajim/tooltips.py:609 #, fuzzy msgid "Connected" msgstr "Ligação" #: gajim/tooltips.py:611 #, fuzzy msgid "Disconnected" msgstr "Contacto Entrou" #: gajim/tooltips.py:660 #, fuzzy msgid "?Noun:Download" msgstr "Download" #: gajim/tooltips.py:666 #, fuzzy msgid "?Noun:Upload" msgstr "Upload" #: gajim/tooltips.py:673 msgid "Type: " msgstr "Tipo: " #: gajim/tooltips.py:679 msgid "Transferred: " msgstr "Transferido: " #: gajim/tooltips.py:682 gajim/tooltips.py:699 msgid "Not started" msgstr "Não iniciada" #: gajim/tooltips.py:684 msgid "Stopped" msgstr "Parada" #: gajim/tooltips.py:686 gajim/tooltips.py:689 msgid "Completed" msgstr "Completa" #: gajim/tooltips.py:692 #, fuzzy msgid "?transfer status:Paused" msgstr "Mostrar hora:" #: gajim/tooltips.py:695 msgid "Stalled" msgstr "Interrompida" #: gajim/tooltips.py:697 msgid "Transferring" msgstr "A transferir" #: gajim/tooltips.py:700 msgid "Status: " msgstr "Estado: " #: gajim/tooltips.py:732 gajim/common/helpers.py:389 #, fuzzy msgid "?user status:Available" msgstr "Mostrar hora:" #: gajim/tooltips.py:734 gajim/common/helpers.py:384 msgid "Free for Chat" msgstr "Livre para conversar" #: gajim/tooltips.py:736 gajim/common/commands.py:117 #: gajim/common/helpers.py:396 #: gajim/command_system/implementation/standard.py:138 msgid "Away" msgstr "Ausente" #: gajim/tooltips.py:738 gajim/common/helpers.py:374 msgid "Busy" msgstr "Ocupado" #: gajim/tooltips.py:740 gajim/common/helpers.py:379 msgid "Not Available" msgstr "Indisponível" #: gajim/tooltips.py:742 gajim/common/helpers.py:401 msgid "Offline" msgstr "Offline" #: gajim/advanced_configuration_window.py:88 #, fuzzy msgid "Activated" msgstr "Activo" #: gajim/advanced_configuration_window.py:88 #, fuzzy msgid "Deactivated" msgstr "Activo" #: gajim/advanced_configuration_window.py:90 msgid "Boolean" msgstr "" #: gajim/advanced_configuration_window.py:91 #, fuzzy msgid "Integer" msgstr "Neste grupo" #: gajim/advanced_configuration_window.py:92 msgid "Text" msgstr "Texto" #: gajim/advanced_configuration_window.py:93 #: gajim/data/gui/groupchat_control.ui:54 gajim/data/gui/chat_control.ui:334 msgid "Color" msgstr "" #: gajim/advanced_configuration_window.py:104 msgid "Preference Name" msgstr "Nome Preferencial" #: gajim/advanced_configuration_window.py:111 msgid "Value" msgstr "Valor" #: gajim/advanced_configuration_window.py:120 msgid "Type" msgstr "Tipo" #: gajim/advanced_configuration_window.py:176 msgid "(None)" msgstr "(Nenhum)" #: gajim/advanced_configuration_window.py:307 msgid "Hidden" msgstr "Escondida" #: gajim/logind_listener.py:58 msgid "Machine going to sleep" msgstr "" #: gajim/logind_listener.py:90 msgid "Disconnect from the network" msgstr "" #: gajim/history_window.py:339 #, python-format msgid "Conversation History with %s" msgstr "Histórico de Conversas com %s" #: gajim/history_window.py:361 gajim/data/gui/history_window.ui:7 msgid "Conversation History" msgstr "Histórico das Conversas" #: gajim/history_window.py:390 gajim/history_window.py:443 #, fuzzy msgid "Disk Error" msgstr "Erro:" #: gajim/history_window.py:546 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s está agora %(status)s: %(status_msg)s" #: gajim/history_window.py:557 #, fuzzy, python-format msgid "Error: %s" msgstr "Introduza a sua mensagem :" #: gajim/history_window.py:559 #, fuzzy msgid "Error" msgstr "Erro:" #: gajim/history_window.py:561 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "O estado é agora: %(status)s: %(status_msg)s" #: gajim/history_window.py:564 #, python-format msgid "Status is now: %(status)s" msgstr "Estado é agora: %(status)s" #: gajim/history_window.py:585 gajim/conversation_textview.py:1338 #, python-format msgid "Subject: %s\n" msgstr "Assunto: %s\n" #: gajim/statusicon.py:215 #, fuzzy msgid "_Change Status Message…" msgstr "_Mudar Mensagem de Estado" #: gajim/statusicon.py:252 gajim/statusicon.py:302 gajim/statusicon.py:309 #, python-format msgid "using account %s" msgstr "usando a conta %s" #: gajim/statusicon.py:319 #, fuzzy msgid "_Manage Bookmarks…" msgstr "Gerir Bookmarks" #: gajim/statusicon.py:332 #, fuzzy msgid "Hide _Roster" msgstr "Fora da lista" #: gajim/statusicon.py:336 msgid "Show _Roster" msgstr "Mostrar _Lista de Contactos" #: gajim/statusicon.py:344 msgid "Hide this menu" msgstr "Esconder este menú" #: gajim/dataforms_widget.py:587 #, fuzzy msgid "Unable to load image" msgstr "Impossível entrar na sala" #: gajim/dataforms_widget.py:589 #, python-format msgid "Media type not supported: %s" msgstr "" #: gajim/dataforms_widget.py:604 msgid "This field is required" msgstr "" #: gajim/dataforms_widget.py:658 msgid "new@jabber.id" msgstr "" #: gajim/dataforms_widget.py:661 gajim/dataforms_widget.py:663 #, python-format msgid "new%d@jabber.id" msgstr "" #: gajim/server_info.py:130 #, python-format msgid "%(days)s days, %(hours)s hours" msgstr "" #: gajim/server_info.py:187 gajim/accounts_window.py:537 #: gajim/accounts_window.py:638 #, fuzzy msgid "Hostname" msgstr "Nome do Host:" #: gajim/server_info.py:188 #, fuzzy msgid "Server Software" msgstr "Recursos dos Servidores" #: gajim/server_info.py:189 #, fuzzy msgid "Server Uptime" msgstr "Guardado em: %s" #: gajim/server_info.py:227 msgid "" "\n" "Disabled in config" msgstr "" #: gajim/disco.py:69 msgid "This service has not yet responded with detailed information" msgstr "Este serviço/recurso ainda não respondeu com informações detalhadas" #: gajim/disco.py:70 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" msgstr "" "Este serviço/recurso não pôde responder com informações detalhadas.\n" "Provavelmente está legacy ou broken" #: gajim/disco.py:129 msgid "Others" msgstr "Outros" #: gajim/disco.py:133 msgid "Conference" msgstr "Conferência" #: gajim/disco.py:537 msgid "Without a connection, you can not browse available services" msgstr "Tem de estar ligado para ver os serviços" #: gajim/disco.py:626 #, fuzzy, python-format msgid "Service Discovery using account %s" msgstr "Buscar Serviço usando conta %s" #: gajim/disco.py:628 msgid "Service Discovery" msgstr "Buscar Serviço" #: gajim/disco.py:732 msgid "The service could not be found" msgstr "O serviço não pôde ser encontrado" #: gajim/disco.py:733 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." msgstr "" "Não há serviço/recurso no endereço que introduziu, ou pelo menos não " "responde. Verifique o endereço e tente novamente." #: gajim/disco.py:739 gajim/disco.py:1091 msgid "The service is not browsable" msgstr "Serviço não explorável" #: gajim/disco.py:740 msgid "This type of service does not contain any items to browse." msgstr "Este tipo de serviço/recurso não contém itens para explorar." #: gajim/disco.py:781 gajim/disco.py:791 #, fuzzy msgid "Invalid Server Name" msgstr "Nome de utilizador inválido" #: gajim/disco.py:849 #, fuzzy, python-format msgid "Browsing %(address)s using account %(account)s" msgstr "usando a conta %s" #: gajim/disco.py:896 #, fuzzy msgid "Browse" msgstr "_Explorar" #: gajim/disco.py:1092 msgid "This service does not contain any items to browse." msgstr "Este serviço não contém quaisquer itens para explorar" #: gajim/disco.py:1304 #, fuzzy msgid "Execute Command" msgstr "comando" #: gajim/disco.py:1308 gajim/disco.py:1466 msgid "Re_gister" msgstr "Re_gistar" #: gajim/disco.py:1317 gajim/data/gui/join_groupchat_window.ui:186 #: gajim/data/gui/join_groupchat_window.ui:325 #, fuzzy msgid "Join" msgstr "_Entrar" #: gajim/disco.py:1326 gajim/data/gui/search_window.ui:23 #, fuzzy msgid "Search" msgstr "_Pesquisar" #: gajim/disco.py:1464 msgid "_Edit" msgstr "_Editar" #: gajim/disco.py:1507 #, fuzzy, python-format msgid "Scanning %(current)d / %(total)d.." msgstr "Buscando %d / %d.." #: gajim/disco.py:1703 msgid "Users" msgstr "Utilizadores" #: gajim/disco.py:1711 msgid "Description" msgstr "Descrição" #: gajim/disco.py:1719 msgid "Id" msgstr "" #: gajim/disco.py:1749 gajim/data/gui/gc_control_popup_menu.ui:99 #, fuzzy msgid "_Bookmark" msgstr "Adicionar esta Sala aos _Bookmarks" #: gajim/disco.py:1783 msgid "Bookmark already set" msgstr "Bookmark já está configurado" #: gajim/disco.py:1784 #, fuzzy, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Sala \"%s\" já existe nos seus bookmarks." #: gajim/disco.py:1794 msgid "Bookmark has been added successfully" msgstr "Bookmark foi adicionado com sucesso" #: gajim/disco.py:1795 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "Pode gerir os seus bookmarks pelo menu de Acções na sua janela." #: gajim/disco.py:1987 #, fuzzy msgid "Subscribed" msgstr "Subscrição" #: gajim/disco.py:1996 msgid "Node" msgstr "Nó" #: gajim/disco.py:2063 msgid "New post" msgstr "" #: gajim/disco.py:2069 msgid "_Subscribe" msgstr "_Subscrever" #: gajim/disco.py:2075 #, fuzzy msgid "_Unsubscribe" msgstr "_Subscrever" #: gajim/conversation_textview.py:329 #, fuzzy msgid "" "Text below this line is what has been said since the\n" "last time you paid attention to this group chat" msgstr "" "O texto abaixo desta linha é o que foi dito desde que prestou atenção a este " "chat pela última vez." #: gajim/conversation_textview.py:550 #, fuzzy msgid "_Quote" msgstr "_Sair" #: gajim/conversation_textview.py:558 #, fuzzy, python-format msgid "_Actions for \"%s\"" msgstr "Acções para \"%s\"" #: gajim/conversation_textview.py:572 msgid "Read _Wikipedia Article" msgstr "Ler Artigo _Wikipedia" #: gajim/conversation_textview.py:577 msgid "Look it up in _Dictionary" msgstr "Procurar no _Dicionário" #: gajim/conversation_textview.py:594 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "Falta um \"%s\" no URL do Dicionário e como tal não é WIKTIONARY" #: gajim/conversation_textview.py:608 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "URL de Procura na Web não existe \"%s\"" #: gajim/conversation_textview.py:611 msgid "Web _Search for it" msgstr "_Pesquisar na Web sobre o assunto" #: gajim/conversation_textview.py:617 msgid "Open as _Link" msgstr "" #: gajim/conversation_textview.py:847 msgid "URL:" msgstr "" #: gajim/conversation_textview.py:1021 #, fuzzy msgid "Invalid URL" msgstr "Jabber ID Inválido" #: gajim/conversation_textview.py:1106 msgid "" "Message corrected. Original message:\n" "{}" msgstr "" #: gajim/conversation_textview.py:1250 #, fuzzy, python-format msgid "Yesterday" msgid_plural "%(nb_days)i days ago" msgstr[0] "Ontem" msgstr[1] "Ontem" #: gajim/message_textview.py:43 #, fuzzy msgid "Write a message.." msgstr "Nova Mensagem Privada" #: gajim/message_window.py:245 #, fuzzy msgid "You are going to close several tabs" msgstr "Não está ligado ao servidor" #: gajim/message_window.py:246 #, fuzzy msgid "Do you really want to close them all?" msgstr "O que pretende fazer?" #: gajim/message_window.py:517 #, fuzzy msgid "?Noun:Chats" msgstr "Chat" #: gajim/message_window.py:521 #, fuzzy msgid "Private Chats" msgstr "Iniciar Conversa" #: gajim/message_window.py:527 #, fuzzy msgid "Messages" msgstr "Mensagem" #: gajim/gui_interface.py:158 gajim/gui_interface.py:329 #: gajim/gui_interface.py:338 gajim/gui_interface.py:345 #: gajim/gui_interface.py:349 gajim/gui_interface.py:352 #: gajim/gui_interface.py:360 #, fuzzy msgid "Unable to join group chat" msgstr "Impossível entrar na sala" #: gajim/gui_interface.py:159 #, fuzzy, python-format msgid "" "Your desired nickname in group chat\n" "%s\n" "is in use or registered by another occupant.\n" "Please specify another nickname below:" msgstr "" "A alcunha que deseja encontra-se em uso ou registado por outro ocupante.\n" "Por favor, introduza outra alcunha em baixo:" #: gajim/gui_interface.py:163 msgid "Always use this nickname when there is a conflict" msgstr "" #: gajim/gui_interface.py:181 msgid "Do you accept this request?" msgstr "Aceita este pedido?" #: gajim/gui_interface.py:183 #, fuzzy, python-format msgid "Do you accept this request on account %s?" msgstr "Aceita este pedido?" #: gajim/gui_interface.py:186 #, fuzzy, python-format msgid "HTTP (%(method)s) Authorization for %(url)s (ID: %(id)s)" msgstr "HTTP (%s) Autorização para %s (id: %s)" #: gajim/gui_interface.py:230 gajim/notify.py:96 #, fuzzy msgid "Connection Failed" msgstr "Ligação" #: gajim/gui_interface.py:315 #, fuzzy, python-format msgid "A Password is required to join the room %s. Please type it." msgstr "É necessária uma palavra-passe para esta sala." #: gajim/gui_interface.py:330 #, fuzzy, python-format msgid "%s is full" msgstr "Registos" #: gajim/gui_interface.py:339 #, fuzzy, python-format msgid "You are banned from group chat %s." msgstr "Está banido/a desta sala." #: gajim/gui_interface.py:346 #, fuzzy, python-format msgid "Remote server %s does not exist." msgstr "Tal sala não existe." #: gajim/gui_interface.py:350 #, fuzzy, python-format msgid "Group chat %s does not exist." msgstr "Tal sala não existe." #: gajim/gui_interface.py:353 #, fuzzy msgid "Group chat creation is not permitted." msgstr "Criação de salas encontra-se restrita." #: gajim/gui_interface.py:355 #, fuzzy msgid "Unable to join groupchat" msgstr "Impossível entrar na sala" #: gajim/gui_interface.py:356 #, fuzzy, python-format msgid "You must use your registered nickname in %s." msgstr "A sua alcunha registada tem de ser usada." #: gajim/gui_interface.py:361 #, fuzzy, python-format msgid "You are not in the members list in groupchat %s." msgstr "Não está na lista de membros." #: gajim/gui_interface.py:455 gajim/gui_interface.py:459 #, fuzzy, python-format msgid "Error %(code)s: %(msg)s" msgstr "Introduza a sua mensagem :" #: gajim/gui_interface.py:470 gajim/gui_interface.py:486 #: gajim/common/connection_handlers_events.py:1430 #, fuzzy, python-format msgid "error while sending %(message)s ( %(error)s )" msgstr "erro ao enviar" #: gajim/gui_interface.py:513 gajim/notify.py:96 #, fuzzy msgid "Subscription request" msgstr "Pedido de Subscrição" #: gajim/gui_interface.py:524 gajim/common/contacts.py:131 #: gajim/common/helpers.py:95 #, fuzzy msgid "Observers" msgstr "Servidor" #: gajim/gui_interface.py:538 msgid "Authorization accepted" msgstr "Autorização aceite" #: gajim/gui_interface.py:539 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "O contacto \"%s\" autorizou-o a ver o seu estado." #: gajim/gui_interface.py:547 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Contacto \"%s\" removeu a sua subscrição para si" #: gajim/gui_interface.py:548 msgid "" "You will always see them as offline.\n" "Do you want to remove them from your contact list?" msgstr "" #: gajim/gui_interface.py:570 gajim/notify.py:96 #, fuzzy msgid "Unsubscribed" msgstr "_Subscrever" #: gajim/gui_interface.py:582 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Contacto com \"%s\" não pode ser estabelecido" #: gajim/gui_interface.py:583 gajim/common/connection.py:1288 #: gajim/common/connection.py:1474 msgid "Check your connection or try again later." msgstr "Verifique a sua ligação ou tente novamente mais tarde." #: gajim/gui_interface.py:641 #, python-format msgid "%(jid)s declined the invitation: %(reason)s" msgstr "" #: gajim/gui_interface.py:645 #, python-format msgid "%(jid)s declined the invitation" msgstr "" #: gajim/gui_interface.py:675 msgid "" "You configured Gajim to use OpenPGP agent, but there is no OpenPGP agent " "running or it returned a wrong passphrase.\n" msgstr "" #: gajim/gui_interface.py:678 gajim/gui_interface.py:686 msgid "You are currently connected without your OpenPGP key." msgstr "Está neste momento ligado sem a sua chave OpenPGP." #: gajim/gui_interface.py:680 #, fuzzy msgid "Wrong passphrase" msgstr "Frase de acesso" #: gajim/gui_interface.py:685 #, fuzzy msgid "Wrong OpenPGP passphrase" msgstr "Frase de acesso" #: gajim/gui_interface.py:699 #, fuzzy msgid "Certificate Passphrase Required" msgstr "Frase de acesso Necessária" #: gajim/gui_interface.py:700 #, fuzzy, python-format msgid "Enter the certificate passphrase for account %s" msgstr "Introduza a chave GPG para a conta %s" #: gajim/gui_interface.py:723 #, fuzzy msgid "Untrusted OpenPGP key" msgstr "Escolha sua chave OpenPGP" #: gajim/gui_interface.py:723 msgid "" "The OpenPGP key used to encrypt this chat is not trusted. Do you really want " "to encrypt this message?" msgstr "" #: gajim/gui_interface.py:769 msgid "" "Please copy / paste the refresh token from the website that has just been " "opened." msgstr "" #: gajim/gui_interface.py:772 msgid "Oauth2 Credentials" msgstr "" #: gajim/gui_interface.py:924 #, python-format msgid "%s wants to send you a file." msgstr "%s quer enviar-lhe um ficheiro." #: gajim/gui_interface.py:1021 gajim/gui_interface.py:1433 msgid "SSL certificate error" msgstr "" #: gajim/gui_interface.py:1038 #, fuzzy msgid "File Transfer Failed" msgstr "Transferências de Ficheiros" #: gajim/gui_interface.py:1060 #, fuzzy, python-format msgid "%(filename)s received from %(name)s." msgstr "Transferência de %(filename)s de %(name)s interrompida." #: gajim/gui_interface.py:1064 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Transferência de %(filename)s de %(name)s interrompida." #: gajim/gui_interface.py:1068 #, fuzzy, python-format msgid "File transfer of %(filename)s from %(name)s failed." msgstr "Transferência de %(filename)s de %(name)s interrompida." #: gajim/gui_interface.py:1081 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "Enviou com sucesso %(filename)s para %(name)s." #: gajim/gui_interface.py:1085 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "Transferência de %(filename)s para %(name)s interrompida." #: gajim/gui_interface.py:1089 #, fuzzy, python-format msgid "File transfer of %(filename)s to %(name)s failed." msgstr "Transferência de %(filename)s para %(name)s interrompida." #: gajim/gui_interface.py:1153 #, fuzzy msgid "Choose file to send" msgstr "Escolher Ficheiro para Enviar" #: gajim/gui_interface.py:1199 #, fuzzy msgid "Unable to decrypt message" msgstr "Em todas as _mensagens" #: gajim/gui_interface.py:1211 msgid "Username Conflict" msgstr "" #: gajim/gui_interface.py:1212 #, fuzzy msgid "Please type a new username for your local account" msgstr "Por favor preencha os dados para a sua nova conta" #: gajim/gui_interface.py:1235 #, fuzzy msgid "Resource Conflict" msgstr "Recurso: " #: gajim/gui_interface.py:1236 msgid "" "You are already connected to this account with the same resource. Please " "type a new one" msgstr "" #: gajim/gui_interface.py:1293 #, fuzzy, python-format msgid "%s wants to start a voice chat." msgstr "%s quer enviar-lhe um ficheiro." #: gajim/gui_interface.py:1296 #, fuzzy msgid "Voice Chat Request" msgstr "Pedido de Transferência de Ficheiro" #: gajim/gui_interface.py:1386 msgid "Error verifying SSL certificate" msgstr "" #: gajim/gui_interface.py:1387 #, python-format msgid "" "There was an error verifying the SSL certificate of your XMPP server: " "%(error)s\n" "Do you still want to connect to this server?" msgstr "" #: gajim/gui_interface.py:1391 #, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA-1 fingerprint of the certificate:\n" "%(sha1)s\n" "SHA256 fingerprint of the certificate:\n" "%(sha256)s" msgstr "" #: gajim/gui_interface.py:1397 msgid "Ignore this error for this certificate." msgstr "" #: gajim/gui_interface.py:1410 msgid "Non Anonymous Server" msgstr "" #: gajim/gui_interface.py:1434 #, python-format msgid "" "It seems the SSL certificate of account %(account)s has changed and is not " "valid or your connection is being compromised.\n" "\n" "Old SHA-1 fingerprint: %(old_sha1)s\n" "Old SHA-256 fingerprint: %(old_sha256)s\n" "\n" "New SHA-1 fingerprint: %(new_sha1)s\n" "New SHA-256 fingerprint: %(new_sha256)s\n" "\n" "Do you still want to connect and update the fingerprint of the certificate?" msgstr "" #: gajim/gui_interface.py:1512 msgid "" "You are about to send your password on an insecure connection. You should " "install PyOpenSSL to prevent that. Are you sure you want to do that?" msgstr "" #: gajim/gui_interface.py:1554 #, fuzzy msgid "" "You are about to send your password unencrypted on an insecure connection. " "Are you sure you want to do that?" msgstr "Tem de criar uma conta antes de poder conversar com outros contactos." #: gajim/gui_interface.py:1856 #, fuzzy msgid "JID is not a Groupchat" msgstr "Perguntar antes de fechar uma janela/aba de chat." #: gajim/gui_interface.py:2020 #, fuzzy msgid "Emoticons disabled" msgstr "Encriptação desactivada" #: gajim/gui_interface.py:2021 msgid "" "Your configured emoticons theme could not be loaded. See the log for more " "details." msgstr "" #: gajim/gui_interface.py:2039 msgid "This is not a group chat" msgstr "" #: gajim/gui_interface.py:2040 #, python-format msgid "" "%(room_jid)s is already in your roster. Please check if %(room_jid)s is a " "correct group chat name. If it is, delete it from your roster and try " "joining the group chat again." msgstr "" #: gajim/gui_interface.py:2418 msgid "Could not save your settings and preferences" msgstr "Impossível salvar as suas definições e preferências" #: gajim/gui_interface.py:2828 gajim/common/config.py:117 #: gajim/common/config.py:532 gajim/common/optparser.py:343 #: gajim/common/optparser.py:511 gajim/common/optparser.py:534 #, fuzzy msgid "default" msgstr "Apagar MOTD" #: gajim/gui_interface.py:3014 msgid "Passphrase Required" msgstr "Frase de acesso Necessária" #: gajim/gui_interface.py:3015 #, fuzzy, python-format msgid "Enter OpenPGP key passphrase for key %(keyid)s (account %(account)s)." msgstr "Introduza a chave GPG para a conta %s" #: gajim/gui_interface.py:3029 #, fuzzy msgid "OpenPGP key expired" msgstr "Encriptação OpenPGP" #: gajim/gui_interface.py:3030 #, fuzzy, python-format msgid "" "Your OpenPGP key has expired, you will be connected to %s without OpenPGP." msgstr "O utilizador será ligado a %s sem OpenPGP." #: gajim/gui_interface.py:3039 #, fuzzy msgid "Wrong Passphrase" msgstr "Frase de acesso" #: gajim/gui_interface.py:3040 msgid "Please retype your OpenPGP passphrase or press Cancel." msgstr "" #: gajim/search_window.py:108 msgid "Waiting for results" msgstr "" #: gajim/search_window.py:146 gajim/search_window.py:224 msgid "Error in received dataform" msgstr "" #: gajim/search_window.py:181 gajim/search_window.py:216 msgid "No result" msgstr "" #: gajim/htmltextview.py:559 #, fuzzy msgid "Loading" msgstr "Ligação" #: gajim/atom_window.py:123 #, python-format msgid "You have received new entries (and %d not displayed):" msgid_plural "You have received new entries (and %d not displayed):" msgstr[0] "" msgstr[1] "" #: gajim/atom_window.py:128 gajim/data/gui/atom_entry_window.ui:20 msgid "You have received new entry:" msgstr "" #: gajim/adhoc_commands.py:111 gajim/data/gui/adhoc_commands_window.ui:9 msgid "Ad-hoc Commands - Gajim" msgstr "" #: gajim/adhoc_commands.py:320 #, fuzzy msgid "Cancel confirmation" msgstr "Informações do Contacto" #: gajim/adhoc_commands.py:321 msgid "" "You are in process of executing command. Do you really want to cancel it?" msgstr "" #: gajim/adhoc_commands.py:387 gajim/adhoc_commands.py:411 msgid "Service sent malformed data" msgstr "" #: gajim/adhoc_commands.py:396 msgid "Service changed the session identifier." msgstr "" #: gajim/adhoc_commands.py:416 #, python-format msgid "%s - Ad-hoc Commands - Gajim" msgstr "" #: gajim/adhoc_commands.py:510 msgid "Service returned an error." msgstr "" #: gajim/negotiation.py:34 msgid "- messages will be logged" msgstr "" #: gajim/negotiation.py:36 msgid "- messages will not be logged" msgstr "" #: gajim/notify.py:103 #, fuzzy msgid "Open" msgstr "OpenPGP: " #: gajim/dialog_messages.py:33 #, fuzzy msgid "You can not start a new conversation unless you are connected." msgstr "Não pode entrar num chat sem estar ligado." #: gajim/dialog_messages.py:48 msgid "Unread events" msgstr "" #: gajim/dialog_messages.py:49 msgid "Read all pending events before removing this account." msgstr "" #: gajim/dialog_messages.py:53 msgid "You are currently connected to the server" msgstr "Está neste momento ligado ao servidor" #: gajim/dialog_messages.py:54 #, fuzzy msgid "To disable the account, you must be disconnected." msgstr "Para mudar o nome da conta, deve estar disconectado." #: gajim/dialog_messages.py:58 #, fuzzy msgid "Invalid Form" msgstr "Entrada inválida" #: gajim/dialog_messages.py:59 msgid "The form is not filled correctly." msgstr "O formulário não foi preenchido correctamente" #: gajim/dialog_messages.py:63 gajim/common/helpers.py:406 msgid "Invisible" msgstr "Invisível" #: gajim/dialog_messages.py:68 msgid "A connection is not available" msgstr "Uma ligação não está disponível" #: gajim/dialog_messages.py:69 msgid "Your message can not be sent until you are connected." msgstr "A sua mensagem não pode ser enviada enquanto não estiver ligado." #: gajim/dialog_messages.py:73 #, fuzzy msgid "JID already in list" msgstr "Cliente de IM Jabber" #: gajim/dialog_messages.py:74 msgid "The JID you entered is already in the list. Choose another one." msgstr "" #: gajim/dialog_messages.py:78 #, fuzzy msgid "Invalid answer" msgstr "Senha Inválida" #: gajim/dialog_messages.py:79 #, python-format msgid "Transport %(name)s answered wrongly to register request: %(error)s" msgstr "" #: gajim/dialog_messages.py:84 #, fuzzy msgid "Wrong Custom Hostname" msgstr "Usar hostname/porta personalizados" #: gajim/dialog_messages.py:85 #, fuzzy, python-format msgid "Wrong custom hostname \"%s\". Ignoring it." msgstr "Usar hostname/porta personalizados" #: gajim/dialog_messages.py:89 #, fuzzy msgid "Error while removing privacy list" msgstr "erro ao enviar" #: gajim/dialog_messages.py:90 #, python-format msgid "" "Privacy list %s has not been removed. It is maybe active in one of your " "connected resources. Deactivate it and try again." msgstr "" #: gajim/dialog_messages.py:96 msgid "Invisibility not supported" msgstr "" #: gajim/dialog_messages.py:97 #, python-format msgid "Account %s doesn't support invisibility." msgstr "" #: gajim/dialog_messages.py:101 #, fuzzy msgid "Unregister failed" msgstr "Publicação vCard falhou" #: gajim/dialog_messages.py:102 #, python-format msgid "Unregistration with server %(server)s failed: %(error)s" msgstr "" #: gajim/dialog_messages.py:106 #, fuzzy msgid "Registration succeeded" msgstr "Publicação vCard deu-se com sucesso" #: gajim/dialog_messages.py:107 #, python-format msgid "Registration with agent %s succeeded" msgstr "" #: gajim/dialog_messages.py:111 #, fuzzy msgid "Registration failed" msgstr "Publicação vCard falhou" #: gajim/dialog_messages.py:112 #, python-format msgid "" "Registration with agent %(agent)s failed with error %(error)s: %(error_msg)s" msgstr "" #: gajim/dialog_messages.py:117 #, fuzzy msgid "Unable to join Groupchat" msgstr "Impossível entrar na sala" #: gajim/dialog_messages.py:122 msgid "GStreamer error" msgstr "" #: gajim/dialog_messages.py:123 #, fuzzy, python-format msgid "" "Error: %(error)s\n" "Debug: %(debug)s" msgstr "Introduza a sua mensagem :" #: gajim/dialog_messages.py:127 #, fuzzy msgid "Wrong host" msgstr "Frase de acesso" #: gajim/dialog_messages.py:128 msgid "Invalid local address? :-O" msgstr "" #: gajim/dialog_messages.py:132 msgid "Avahi error" msgstr "" #: gajim/dialog_messages.py:133 #, python-format msgid "" "%s\n" "Link-local messaging might not work properly." msgstr "" #: gajim/dialog_messages.py:137 gajim/dialog_messages.py:142 msgid "Could not request upload slot" msgstr "" #: gajim/dialog_messages.py:143 msgid "Got unexpected response from server (see log)" msgstr "" #: gajim/dialog_messages.py:147 gajim/dialog_messages.py:152 msgid "Could not open file" msgstr "" #: gajim/dialog_messages.py:148 msgid "Exception raised while opening file (see log)" msgstr "" #: gajim/dialog_messages.py:157 msgid "Unsecure" msgstr "" #: gajim/dialog_messages.py:158 msgid "Server returned unsecure transport (http)" msgstr "" #: gajim/dialog_messages.py:162 msgid "Could not upload file" msgstr "" #: gajim/dialog_messages.py:163 #, python-format msgid "HTTP response code from server: %s" msgstr "" #: gajim/dialog_messages.py:167 msgid "Upload Error" msgstr "" #: gajim/dialog_messages.py:172 #, fuzzy msgid "Encryption Error" msgstr "Encriptação activada" #: gajim/dialog_messages.py:173 #, fuzzy msgid "For the choosen encryption is no encryption method available" msgstr "Uma ligação não está disponível" #: gajim/gajim_themes_window.py:61 msgid "Theme" msgstr "Tema" #: gajim/gajim_themes_window.py:98 #, fuzzy msgid "You cannot make changes to the default theme" msgstr "Não pode apagar o seu tema actual" #: gajim/gajim_themes_window.py:99 msgid "Please create a new clean theme." msgstr "" #: gajim/gajim_themes_window.py:170 msgid "theme name" msgstr "nome do tema" #: gajim/gajim_themes_window.py:187 msgid "You cannot delete your current theme" msgstr "Não pode apagar o seu tema actual" #: gajim/gajim_themes_window.py:188 msgid "Pick another theme to use first." msgstr "" #: gajim/accounts_window.py:40 #, fuzzy msgid "Merge Accounts" msgstr "Contas fundidas" #: gajim/accounts_window.py:41 msgid "Use PGP Agent" msgstr "" #: gajim/accounts_window.py:153 gajim/common/config.py:511 msgid "Be right back." msgstr "" #: gajim/accounts_window.py:157 msgid "Relogin now?" msgstr "" #: gajim/accounts_window.py:158 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "" #: gajim/accounts_window.py:211 #, fuzzy, python-format msgid "You have opened chat in account %s" msgstr "Não tem nenhuma conta activa" #: gajim/accounts_window.py:212 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "" #: gajim/accounts_window.py:345 #, fuzzy msgid "Remove" msgstr "_Remover" #: gajim/accounts_window.py:388 #, fuzzy msgid "Rename account label" msgstr "Gerir Contas" #: gajim/accounts_window.py:457 msgid "Login" msgstr "" #: gajim/accounts_window.py:466 msgid "Connection" msgstr "Ligação" #: gajim/accounts_window.py:469 #, fuzzy msgid "Import Contacts" msgstr "Contacto:" #: gajim/accounts_window.py:472 gajim/accounts_window.py:655 #, fuzzy msgid "Client Certificate" msgstr "Nome de utilizador inválido" #: gajim/accounts_window.py:475 gajim/accounts_window.py:570 #, fuzzy msgid "OpenPGP Key" msgstr "Atribuir chave OpenPGP" #: gajim/accounts_window.py:486 gajim/accounts_window.py:558 #, fuzzy msgid "Connect on startup" msgstr "_Ligar ao arranque" #: gajim/accounts_window.py:489 #, fuzzy msgid "Reconnect when connection is lost" msgstr "Religar automaticamente em caso de perda de ligação." #: gajim/accounts_window.py:492 gajim/accounts_window.py:562 #, fuzzy msgid "Save conversations for all contacts" msgstr "Guardar _históricos das conversas para todos os contactos" #: gajim/accounts_window.py:494 gajim/accounts_window.py:564 msgid "Store conversations on the harddrive" msgstr "" #: gajim/accounts_window.py:496 #, fuzzy msgid "Server Message Archive" msgstr "E_nviar Mensagem de Servidor" #: gajim/accounts_window.py:498 msgid "" "Messages get stored on the server.\n" "The archive is used to sync messages\n" "between multiple devices.\n" "XEP-0313" msgstr "" #: gajim/accounts_window.py:503 gajim/accounts_window.py:566 #, fuzzy msgid "Global Status" msgstr "Estado: " #: gajim/accounts_window.py:505 #, fuzzy msgid "Synchronise the status of all accounts" msgstr "Muda o estado de uma ou várias contas" #: gajim/accounts_window.py:507 #, fuzzy msgid "Message Carbons" msgstr "Mensagem" #: gajim/accounts_window.py:509 msgid "" "All your other online devices get copies\n" "of sent and received messages.\n" "XEP-0280" msgstr "" #: gajim/accounts_window.py:513 #, fuzzy msgid "Use file transfer proxies" msgstr "lista de transferências de ficheiros" #: gajim/accounts_window.py:525 gajim/accounts_window.py:560 #, fuzzy msgid "Use environment variable" msgstr "Sessão bus não está disponível" #: gajim/accounts_window.py:527 #, fuzzy msgid "Proxy" msgstr "Proxy:" #: gajim/accounts_window.py:530 #, fuzzy msgid "Warn on insecure connection" msgstr "Ligação" #: gajim/accounts_window.py:534 msgid "Send keep-alive packets" msgstr "Enviar pacotes keep-alive" #: gajim/accounts_window.py:538 msgid "Manually set the hostname for the server" msgstr "" #: gajim/accounts_window.py:541 #, fuzzy msgid "Resource" msgstr "Recurso:" #: gajim/accounts_window.py:544 gajim/accounts_window.py:612 #: gajim/accounts_window.py:617 #, fuzzy msgid "Priority" msgstr "_Prioridade" #: gajim/accounts_window.py:568 #, fuzzy msgid "Synchronize the status of all accounts" msgstr "Muda o estado de uma ou várias contas" #: gajim/accounts_window.py:581 #, fuzzy msgid "First Name" msgstr "Nome:" #: gajim/accounts_window.py:584 #, fuzzy msgid "Last Name" msgstr "Nome:" #: gajim/accounts_window.py:587 #: gajim/data/gui/archiving_313_preferences_window.ui:71 #, fuzzy msgid "Jabber ID" msgstr "Jabber ID:" #: gajim/accounts_window.py:590 #, fuzzy msgid "Email" msgstr "E-Mail" #: gajim/accounts_window.py:608 #, fuzzy msgid "Adjust to status" msgstr "Pedir para ver o estado dele/dela" #: gajim/accounts_window.py:635 msgid "Enable" msgstr "Activar" #: gajim/accounts_window.py:642 #, fuzzy msgid "Port" msgstr "_Porta:" #: gajim/accounts_window.py:647 #, fuzzy msgid "Connection Options" msgstr "Ligação" #: gajim/accounts_window.py:659 #, fuzzy msgid "Encrypted Certificate" msgstr "Nome de utilizador inválido" #: gajim/accounts_window.py:663 #, fuzzy msgid "Certificate Options" msgstr "Nome de utilizador inválido" #: gajim/accounts_window.py:671 gajim/data/gui/join_groupchat_window.ui:143 #, fuzzy msgid "Password" msgstr "Senha:" #: gajim/accounts_window.py:675 #, fuzzy msgid "Save Password" msgstr "Guardar senha" #: gajim/accounts_window.py:678 gajim/data/gui/change_password_dialog.ui:8 msgid "Change Password" msgstr "Mudar Senha" #: gajim/accounts_window.py:683 #, fuzzy msgid "Login Options" msgstr "Gerir Emoticons" #: gajim/gajim_remote.py:59 gajim/common/exceptions.py:71 msgid "D-Bus is not present on this machine or python module is missing" msgstr "D-Bus não está presente nesta máquina, ou falta módulo python" #: gajim/gajim_remote.py:81 #, fuzzy msgid "Shows a help on specific command" msgstr "Exibe ajuda acerca de um comando específico" #: gajim/gajim_remote.py:84 msgid "command" msgstr "comando" #: gajim/gajim_remote.py:85 msgid "show help on command" msgstr "mostrar ajuda sobre comando" #: gajim/gajim_remote.py:89 #, fuzzy msgid "Lists all contacts in roster, one for each line" msgstr "" "Mostra uma lista de todos os contactos na lista. Cada contacto aparece numa " "linha separada" #: gajim/gajim_remote.py:91 gajim/gajim_remote.py:106 gajim/gajim_remote.py:116 #: gajim/gajim_remote.py:130 gajim/gajim_remote.py:144 #: gajim/gajim_remote.py:153 gajim/gajim_remote.py:174 #: gajim/gajim_remote.py:204 gajim/gajim_remote.py:213 #: gajim/gajim_remote.py:220 #, fuzzy msgid "?CLI:account" msgstr "conta" #: gajim/gajim_remote.py:91 msgid "show only contacts of the given account" msgstr "mostrar apenas contactos da conta indicada" #: gajim/gajim_remote.py:97 msgid "Prints a list of registered accounts" msgstr "Mostra uma lista de contas registadas" #: gajim/gajim_remote.py:101 #, fuzzy msgid "Changes the status of account(s)" msgstr "Muda o estado de uma ou várias contas" #: gajim/gajim_remote.py:104 #, fuzzy msgid "?CLI:status" msgstr "estado" #: gajim/gajim_remote.py:104 #, fuzzy msgid "" "one of: offline, online, chat, away, xa, dnd, invisible. If not set, use " "account's previous status" msgstr "" "um de: offline, disponível, livre para conversar, ausente, indisponível, " "ocupado, invisível" #: gajim/gajim_remote.py:105 gajim/gajim_remote.py:127 #: gajim/gajim_remote.py:141 gajim/gajim_remote.py:152 #, fuzzy msgid "?CLI:message" msgstr "mensagem" #: gajim/gajim_remote.py:105 msgid "status message" msgstr "mensagem de estado:" #: gajim/gajim_remote.py:106 msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" msgstr "" "mudar estado da conta \"account\". Se não especificado, tentará mudar o " "estado de todas as contas que têm a opção \"sincronizar com estado global\" " "activada" #: gajim/gajim_remote.py:112 #, fuzzy msgid "Changes the priority of account(s)" msgstr "Muda o estado de uma ou várias contas" #: gajim/gajim_remote.py:114 #, fuzzy msgid "?CLI:priority" msgstr "_Prioridade" #: gajim/gajim_remote.py:114 #, fuzzy msgid "priority you want to give to the account" msgstr "Quero _registar uma nova conta" #: gajim/gajim_remote.py:116 #, fuzzy msgid "" "change the priority of the given account. If not specified, change status of " "all accounts that have \"sync with global status\" option set" msgstr "" "mudar estado da conta \"account\". Se não especificado, tentará mudar o " "estado de todas as contas que têm a opção \"sincronizar com estado global\" " "activada" #: gajim/gajim_remote.py:122 #, fuzzy msgid "" "Sends new chat message to a contact in the roster. Both OpenPGP key and " "account are optional. If you want to set only 'account', without 'OpenPGP " "key', just set 'OpenPGP key' to ''." msgstr "" "Envia uma nova mensagem a um contacto da lista. Ambas a chave OpenPGP e a " "conta são opcionais. Se quiser definir apenas 'conta', sem 'chave OpenPGP', " "basta definir 'chave OpenPGP' para ''." #: gajim/gajim_remote.py:126 gajim/gajim_remote.py:139 msgid "JID of the contact that will receive the message" msgstr "JID do destinatário da mensagem" #: gajim/gajim_remote.py:127 gajim/gajim_remote.py:141 #: gajim/gajim_remote.py:152 msgid "message contents" msgstr "conteúdo da mensagem" #: gajim/gajim_remote.py:128 gajim/gajim_remote.py:142 msgid "PGP key" msgstr "" #: gajim/gajim_remote.py:128 gajim/gajim_remote.py:142 msgid "if specified, the message will be encrypted using this public key" msgstr "se especificado, a mensagem será encriptada usando esta chave pública" #: gajim/gajim_remote.py:130 gajim/gajim_remote.py:144 #: gajim/gajim_remote.py:153 msgid "if specified, the message will be sent using this account" msgstr "se especificado, a mensagem será enviada usadando esta conta" #: gajim/gajim_remote.py:135 #, fuzzy msgid "" "Sends a chat message to someone on your roster. Optionally with OpenPGP key " "and account. If you want to only set the latter, set OpenPGP key to \"\"." msgstr "" "Envia uma nova mensagem a um contacto da lista. Ambas a chave OpenPGP e a " "conta são opcionais. Se quiser definir apenas 'conta', sem 'chave OpenPGP', " "basta definir 'chave OpenPGP' para ''." #: gajim/gajim_remote.py:140 #, fuzzy msgid "subject" msgstr "Assunto:" #: gajim/gajim_remote.py:140 #, fuzzy msgid "message subject" msgstr "Mensagem" #: gajim/gajim_remote.py:149 msgid "Sends new message to a groupchat you've joined." msgstr "" #: gajim/gajim_remote.py:151 #, fuzzy msgid "JID of the room that will receive the message" msgstr "JID do destinatário da mensagem" #: gajim/gajim_remote.py:158 msgid "Gets detailed info on a contact" msgstr "Busca informações detalhadas sobre um contacto" #: gajim/gajim_remote.py:160 gajim/gajim_remote.py:173 #: gajim/gajim_remote.py:203 msgid "JID of the contact" msgstr "JID do contacto" #: gajim/gajim_remote.py:164 #, fuzzy msgid "Gets detailed info on a account" msgstr "Busca informações detalhadas sobre um contacto" #: gajim/gajim_remote.py:166 #, fuzzy msgid "Name of the account" msgstr "Não tem nenhuma conta activa" #: gajim/gajim_remote.py:170 msgid "Sends file to a contact" msgstr "Envia um ficheiro a um contacto" #: gajim/gajim_remote.py:172 msgid "file" msgstr "Ficheiro" #: gajim/gajim_remote.py:172 msgid "File path" msgstr "Localização do ficheiro" #: gajim/gajim_remote.py:174 msgid "if specified, file will be sent using this account" msgstr "se especificado, a mensagem será enviada usadando esta conta" #: gajim/gajim_remote.py:179 msgid "Lists all preferences and their values" msgstr "Exibe todas as preferências e os seus valores" #: gajim/gajim_remote.py:183 msgid "Sets value of 'key' to 'value'." msgstr "Define o valor de 'chave' para 'valor'." #: gajim/gajim_remote.py:185 msgid "key=value" msgstr "chave=valor" #: gajim/gajim_remote.py:185 #, fuzzy msgid "'key' is the name of the preference, 'value' is what to set it to" msgstr "" "'chave' é o nome da preferência, 'valor' é o valor da qual se pretende " "definir" #: gajim/gajim_remote.py:190 msgid "Deletes a preference item" msgstr "Apaga um item das preferências" #: gajim/gajim_remote.py:192 msgid "key" msgstr "chave" #: gajim/gajim_remote.py:192 msgid "name of the preference to be deleted" msgstr "nome da preferência a apagar" #: gajim/gajim_remote.py:196 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "" "Escreve o estado actual das preferências do Gajim para o ficheiro .config" #: gajim/gajim_remote.py:201 msgid "Removes contact from roster" msgstr "Remove o contacto da lista" #: gajim/gajim_remote.py:204 msgid "if specified, contact is taken from the contact list of this account" msgstr "" "se especificado, o contacto é escolhido da lista de contactos desta conta" #: gajim/gajim_remote.py:211 msgid "Returns current status (the global one unless account is specified)" msgstr "" "Indica o estado actual (o estado global, a não ser que uma conta seja " "especificada)." #: gajim/gajim_remote.py:218 #, fuzzy msgid "" "Returns current status message (the global one unless account is specified)" msgstr "" "Indica o estado actual (o estado global, a não ser que uma conta seja " "especificada)." #: gajim/gajim_remote.py:225 #, fuzzy msgid "Returns number of unread messages" msgstr "Tem mensagens não lidas" #: gajim/gajim_remote.py:230 msgid "Sends custom XML" msgstr "" #: gajim/gajim_remote.py:232 #, fuzzy msgid "XML to send" msgstr "Consola XML" #: gajim/gajim_remote.py:233 msgid "" "Account to which the XML will be sent; if not specified, XML will be sent to " "all accounts" msgstr "" #: gajim/gajim_remote.py:239 #, fuzzy msgid "Change the avatar" msgstr "Contacto Saiu" #: gajim/gajim_remote.py:241 #, fuzzy msgid "Picture to use" msgstr "Alcunha não encontrada: %s" #: gajim/gajim_remote.py:242 msgid "" "Account in which the avatar will be set; if not specified, the avatar will " "be set for all accounts" msgstr "" #: gajim/gajim_remote.py:249 msgid "Check if Gajim is running" msgstr "" #: gajim/gajim_remote.py:275 msgid "Missing argument \"contact_jid\"" msgstr "Argumento em falta \"contacto_jid\"" #: gajim/gajim_remote.py:295 #, python-format msgid "" "'%s' is not in your roster.\n" "Please specify account for sending the message." msgstr "" "'%s' não está na sua lista.\n" "Por favor, especifique a conta para enviar a mensagem" #: gajim/gajim_remote.py:298 msgid "You have no active account" msgstr "Não tem nenhuma conta activa" #: gajim/gajim_remote.py:346 msgid "It seems Gajim is not running. So you can't use gajim-remote." msgstr "" #: gajim/gajim_remote.py:373 #, python-format msgid "" "Usage: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" msgstr "" #: gajim/gajim_remote.py:377 msgid "Arguments:" msgstr "Argumentos:" #: gajim/gajim_remote.py:381 #, python-format msgid "%s not found" msgstr "%s não encontrado" #: gajim/gajim_remote.py:387 #, fuzzy, python-format msgid "" "Usage:\n" " %s command [arguments]\n" "\n" "Command is one of:\n" msgstr "" "Uso: %s comando [argumentos]\n" "Comando é um de:\n" #: gajim/gajim_remote.py:457 #, fuzzy, python-format msgid "" "Too many arguments. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" "Argumento \"%s\" não está especificado. \n" "Escreva \"%s help %s\" para mais informações" #: gajim/gajim_remote.py:462 #, fuzzy, python-format msgid "" "Argument \"%(arg)s\" is not specified. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" "Argumento \"%s\" não está especificado. \n" "Escreva \"%s help %s\" para mais informações" #: gajim/common/app.py:264 #, fuzzy msgid "Unable to load idle module" msgstr "Impossível entrar na sala" #: gajim/common/fuzzyclock.py:37 msgid "twelve" msgstr "" #: gajim/common/fuzzyclock.py:37 #, fuzzy msgid "one" msgstr "Nenhum" #: gajim/common/fuzzyclock.py:37 msgid "two" msgstr "" #: gajim/common/fuzzyclock.py:37 #, fuzzy msgid "three" msgstr "Rua:" #: gajim/common/fuzzyclock.py:37 #, fuzzy msgid "four" msgstr "Porta:" #: gajim/common/fuzzyclock.py:38 #, fuzzy msgid "five" msgstr "Ficheiro" #: gajim/common/fuzzyclock.py:38 msgid "six" msgstr "" #: gajim/common/fuzzyclock.py:38 #, fuzzy msgid "seven" msgstr "Evento" #: gajim/common/fuzzyclock.py:38 msgid "eight" msgstr "" #: gajim/common/fuzzyclock.py:38 #, fuzzy msgid "nine" msgstr "_Continuar" #: gajim/common/fuzzyclock.py:38 msgid "ten" msgstr "" #: gajim/common/fuzzyclock.py:39 #, fuzzy msgid "eleven" msgstr "Apagar MOTD" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "%(0)s o'clock" msgstr "" #: gajim/common/fuzzyclock.py:43 #, fuzzy, python-format msgid "five past %(0)s" msgstr "Registar para %s" #: gajim/common/fuzzyclock.py:43 #, fuzzy, python-format msgid "ten past %(0)s" msgstr "Registar para %s" #: gajim/common/fuzzyclock.py:44 #, fuzzy, python-format msgid "quarter past %(0)s" msgstr "Registar para %s" #: gajim/common/fuzzyclock.py:44 #, fuzzy, python-format msgid "twenty past %(0)s" msgstr "Registar para %s" #: gajim/common/fuzzyclock.py:44 #, fuzzy, python-format msgid "twenty five past %(0)s" msgstr "Registar para %s" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "half past %(0)s" msgstr "" #: gajim/common/fuzzyclock.py:45 #, fuzzy, python-format msgid "twenty five to %(1)s" msgstr "Registar para %s" #: gajim/common/fuzzyclock.py:45 #, fuzzy, python-format msgid "twenty to %(1)s" msgstr "Registar para %s" #: gajim/common/fuzzyclock.py:46 #, fuzzy, python-format msgid "quarter to %(1)s" msgstr "Registar para %s" #: gajim/common/fuzzyclock.py:46 #, fuzzy, python-format msgid "ten to %(1)s" msgstr "Registar para %s" #: gajim/common/fuzzyclock.py:46 #, fuzzy, python-format msgid "five to %(1)s" msgstr "Registar para %s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "%(1)s o'clock" msgstr "" #: gajim/common/fuzzyclock.py:48 gajim/common/fuzzyclock.py:50 msgid "Night" msgstr "" #: gajim/common/fuzzyclock.py:48 msgid "Early morning" msgstr "" #: gajim/common/fuzzyclock.py:48 #, fuzzy msgid "Morning" msgstr "A trabalhar" #: gajim/common/fuzzyclock.py:49 msgid "Almost noon" msgstr "" #: gajim/common/fuzzyclock.py:49 #, fuzzy msgid "Noon" msgstr "Nenhum" #: gajim/common/fuzzyclock.py:49 msgid "Afternoon" msgstr "" #: gajim/common/fuzzyclock.py:49 #, fuzzy msgid "Evening" msgstr "Evento" #: gajim/common/fuzzyclock.py:50 msgid "Late evening" msgstr "" #: gajim/common/fuzzyclock.py:52 msgid "Start of week" msgstr "" #: gajim/common/fuzzyclock.py:52 gajim/common/fuzzyclock.py:53 msgid "Middle of week" msgstr "" #: gajim/common/fuzzyclock.py:53 msgid "End of week" msgstr "" #: gajim/common/fuzzyclock.py:53 msgid "Weekend!" msgstr "" #: gajim/common/connection_handlers_events.py:369 #, fuzzy, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " "management tools such as http://jru.jabberstudio.org/ to remove it" msgstr "" "JID %s não é compatível com RFC. Não será adicionado à sua lista. Utilize " "ferramentas de gestão de lista (roster) tais como http://jru.jabberstudio." "org/ para o remover." #: gajim/common/connection_handlers_events.py:852 #, python-format msgid "unsubscribe request from %s" msgstr "pedido de remoção de subscrição por %s" #: gajim/common/connection_handlers_events.py:952 #, fuzzy msgid "Room has been destroyed" msgstr "Autorização foi removida" #: gajim/common/connection_handlers_events.py:960 #, python-format msgid "You can join this room instead: %s" msgstr "" #: gajim/common/connection_handlers_events.py:1979 #, fuzzy, python-format msgid "Unknown SSL error: %d" msgstr "Versão D-Bus desconhecida: %s" #: gajim/common/connection_handlers_events.py:2625 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Nova Mensagem Única de %(nickname)s" #: gajim/common/connection_handlers_events.py:2631 #, python-format msgid "New Private Message from group chat %s" msgstr "Nova Mensagem Privada da conversa de grupo %s" #: gajim/common/connection_handlers_events.py:2634 #, python-format msgid "%(nickname)s: %(message)s" msgstr "" #: gajim/common/connection_handlers_events.py:2637 #, fuzzy, python-format msgid "Messaged by %(nickname)s" msgstr "Nova Mensagem como %s" #: gajim/common/connection_handlers_events.py:2643 #, fuzzy, python-format msgid "New Message from %(nickname)s" msgstr "Nova Mensagem como %s" #: gajim/common/connection_handlers_events.py:2809 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s Mudou de Estado" #: gajim/common/connection_handlers_events.py:2817 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s Iniciou Sessão" #: gajim/common/connection_handlers_events.py:2823 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s Terminou Sessão" #: gajim/common/contacts.py:386 #, fuzzy msgid "Not in roster" msgstr "Fora da lista" #: gajim/common/config.py:76 msgid "" "Show desktop notification even when a chat window is opened for this contact " "and does not have focus" msgstr "" #: gajim/common/config.py:77 msgid "Play sound when user is busy" msgstr "" #: gajim/common/config.py:79 msgid "Show only online and free for chat contacts in roster." msgstr "" #: gajim/common/config.py:82 msgid "Time in minutes, after which your status changes to away." msgstr "Tempo, em minutos, após o qual o seu estado muda para Ausente." #: gajim/common/config.py:83 #, fuzzy msgid "$S (Away as a result of being idle more than $T min)" msgstr "Ausente por estar inactivo" #: gajim/common/config.py:83 msgid "$S will be replaced by current status message, $T by autoawaytime." msgstr "" #: gajim/common/config.py:85 msgid "Time in minutes, after which your status changes to not available." msgstr "Tempo, em minutos, após o qual o seu estado muda para Indisponível." #: gajim/common/config.py:86 #, fuzzy msgid "$S (Not available as a result of being idle more than $T min)" msgstr "Indisponível por estar inactivo" #: gajim/common/config.py:86 msgid "$S will be replaced by current status message, $T by autoxatime." msgstr "" #: gajim/common/config.py:89 msgid "" "When to show notification area icon. Can be 'never', 'on_event', 'always'." msgstr "" #: gajim/common/config.py:90 msgid "Allow to hide the roster window even if the tray icon is not shown." msgstr "" #: gajim/common/config.py:95 #, fuzzy msgid "Incoming nickname color." msgstr "Nome de utilizador inválido" #: gajim/common/config.py:96 msgid "Outgoing nickname color." msgstr "" #: gajim/common/config.py:97 msgid "Incoming text color." msgstr "" #: gajim/common/config.py:98 msgid "Outgoing text color." msgstr "" #: gajim/common/config.py:99 #, fuzzy msgid "Status message text color." msgstr "texto da mensagem de estado" #: gajim/common/config.py:102 #, fuzzy msgid "Contact signed in notification color." msgstr "Mostrar apenas na _lista" #: gajim/common/config.py:103 #, fuzzy msgid "Contact signout notification color" msgstr "Mostrar apenas na _lista" #: gajim/common/config.py:104 #, fuzzy msgid "New message notification color." msgstr "Noti_ficação do estado da conversa:" #: gajim/common/config.py:105 #, fuzzy msgid "File transfer request notification color." msgstr "Pedido de Transferência de Ficheiro" #: gajim/common/config.py:106 #, fuzzy msgid "File transfer error notification color." msgstr "Transferência de ficheiro cancelada" #: gajim/common/config.py:107 #, fuzzy msgid "File transfer complete or stopped notification color." msgstr "" "Quando uma transferência de ficheiro é concluida, exibir um popup de " "notificação" #: gajim/common/config.py:108 #, fuzzy msgid "Groupchat invitation notification color" msgstr "?Função do Contacto no Chat:Nenhuma" #: gajim/common/config.py:109 msgid "Background color of status changed notification" msgstr "" #: gajim/common/config.py:110 msgid "Other dialogs color." msgstr "" #: gajim/common/config.py:111 #, fuzzy msgid "Incoming nickname font." msgstr "Nome de utilizador inválido" #: gajim/common/config.py:112 #, fuzzy msgid "Outgoing nickname font." msgstr "Mudar Alcunha" #: gajim/common/config.py:113 msgid "Incoming text font." msgstr "" #: gajim/common/config.py:114 msgid "Outgoing text font." msgstr "" #: gajim/common/config.py:115 #, fuzzy msgid "Status message text font." msgstr "texto da mensagem de estado" #: gajim/common/config.py:116 msgid "" "List (space separated) of rows (accounts and groups) that are collapsed." msgstr "" #: gajim/common/config.py:123 msgid "Language used by speller" msgstr "" #: gajim/common/config.py:124 msgid "" "'always' - print time for every message.\n" "'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" "'never' - never print time." msgstr "" #: gajim/common/config.py:125 msgid "" "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " "to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " "This is used only if print_time is 'sometimes'." msgstr "" #: gajim/common/config.py:127 #, fuzzy msgid "Enable ASCII emoticons" msgstr "Gerir Emoticons" #: gajim/common/config.py:129 msgid "Treat * / _ pairs as possible formatting characters." msgstr "" #: gajim/common/config.py:130 msgid "" "If True, do not remove */_ . So *abc* will be bold but with * * not removed." msgstr "" "Se Verdadeiro (True), não remover */_ . Para que *abc* fique em negrito " "(bold) mas * * não seja removido." #: gajim/common/config.py:133 msgid "" "Uses ReStructured text markup to send HTML, plus ascii formatting if " "selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" "restructuredtext.html (If you want to use this, install docutils)" msgstr "" #: gajim/common/config.py:142 msgid "" "Character to add after nickname when using nick completion (tab) in group " "chat." msgstr "" #: gajim/common/config.py:143 msgid "" "Character to propose to add after desired nickname when desired nickname is " "used by someone else in group chat." msgstr "" #: gajim/common/config.py:165 msgid "" "If True, Gajim will save roster position when hiding roster, and restore it " "when showing roster." msgstr "" #: gajim/common/config.py:171 msgid "Place the roster on the right in single window mode" msgstr "" #: gajim/common/config.py:177 msgid "" "This option let you customize timestamp that is printed in conversation. For " "exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " "strftime for full documentation: http://docs.python.org/lib/module-time.html" msgstr "" #: gajim/common/config.py:178 msgid "Characters that are printed before the nickname in conversations" msgstr "" #: gajim/common/config.py:179 msgid "Characters that are printed after the nickname in conversations" msgstr "" #: gajim/common/config.py:181 msgid "Add * and [n] in roster title?" msgstr "Adicionar * e [n] no título da lista de contactos?" #: gajim/common/config.py:182 #, fuzzy msgid "" "How many history messages should be restored when a chat tab/window is " "reopened?" msgstr "" "Número de linhas, da conversa anterior, a lembrar para quando uma janela/aba " "de conversa seja reaberta." #: gajim/common/config.py:183 msgid "How far back in time (minutes) history is restored. -1 means no limit." msgstr "" #: gajim/common/config.py:184 msgid "" "How many lines to request from server when entering a groupchat. -1 means no " "limit" msgstr "" #: gajim/common/config.py:185 msgid "" "Minutes of backlog to request when entering a groupchat. -1 means no limit" msgstr "" #: gajim/common/config.py:186 msgid "" "How many seconds to wait before trying to autorejoin to a conference you are " "being disconnected from. Set to 0 to disable autorejoining." msgstr "" #: gajim/common/config.py:187 msgid "" "Should autorejoin be activated when we are being kicked from a conference?" msgstr "" #: gajim/common/config.py:188 msgid "" "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " "Client default behaviour)." msgstr "" "Enviar mensagem ao premir Ctrl+Enter e fazer nova linha com Enter " "(Comportamento por defeito do cliente ICQ Mirabilis)." #: gajim/common/config.py:190 msgid "How many lines to store for Ctrl+KeyUP." msgstr "Número de linhas a guardar ao premir Ctrl+TeclaCIMA." #: gajim/common/config.py:193 #, fuzzy, python-format msgid "" "Either custom url with %%s in it where %%s is the word/phrase or " "'WIKTIONARY' which means use wiktionary." msgstr "" "Ou um endereço URL personalizado contendo %s, onde %s é a palavra ou frase, " "ou 'WIKTIONARY', que significa que será usado o Wiktionary." #: gajim/common/config.py:196 msgid "If checked, Gajim can be controlled remotely using gajim-remote." msgstr "Se marcado, Gajim pode ser controlado à distância usando gajim-remote." #: gajim/common/config.py:197 msgid "" "Sent chat state notifications. Can be one of all, composing_only, disabled." msgstr "" #: gajim/common/config.py:198 msgid "" "Displayed chat state notifications in chat windows. Can be one of all, " "composing_only, disabled." msgstr "" #: gajim/common/config.py:200 msgid "" "When not printing time for every message (print_time==sometimes), print it " "every x minutes." msgstr "" #: gajim/common/config.py:201 msgid "Ask before closing a group chat tab/window." msgstr "Perguntar antes de fechar uma janela/aba de chat." #: gajim/common/config.py:202 #, fuzzy msgid "" "Always ask for confirmation before closing groupchats with any of the JIDs " "on this space separated list." msgstr "Perguntar antes de fechar uma janela/aba de chat." #: gajim/common/config.py:203 #, fuzzy msgid "" "Never ask for confirmation before closing groupchats with any of the JIDs on " "this space separated list." msgstr "Perguntar antes de fechar uma janela/aba de chat." #: gajim/common/config.py:204 msgid "" "Ask before closing tabbed chat window if there are controls that can lose " "data (chat, private chat, groupchat that will not be minimized)" msgstr "" #: gajim/common/config.py:207 #, fuzzy msgid "" "Comma separated list of hosts that we send, in addition of local interfaces, " "for File Transfer in case of address translation/port forwarding." msgstr "" "Overrides the host we send for File Transfer in case of address translation/" "port forwarding." #: gajim/common/config.py:209 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." msgstr "O standart IEC diz: KiB = 1024 bytes, KB = 1000 bytes." #: gajim/common/config.py:211 msgid "Notify of events in the notification area." msgstr "" #: gajim/common/config.py:212 msgid "" "If False, Gajim will display a static event icon instead of the blinking " "status icon in the notification area when notifying on event." msgstr "" #: gajim/common/config.py:218 msgid "Show tab when only one conversation?" msgstr "Mostrar aba quando apenas numa conversa?" #: gajim/common/config.py:219 #, fuzzy msgid "Show tabbed notebook border in chat windows?" msgstr "Mostrar borda da aba quando apenas numa conversa?" #: gajim/common/config.py:220 msgid "Show close button in tab?" msgstr "Mostrar botão de fechar na aba?" #: gajim/common/config.py:221 msgid "" "A list of modp groups to use in a Diffie-Hellman, highest preference first, " "separated by commas. Valid groups are 1, 2, 5, 14, 15, 16, 17 and 18. Higher " "numbers are more secure, but take longer to calculate when you start a " "session." msgstr "" #: gajim/common/config.py:234 #, fuzzy msgid "Preview new messages in notification popup?" msgstr "Noti_ficação do estado da conversa:" #: gajim/common/config.py:237 #, fuzzy msgid "" "A semicolon-separated list of words that will be highlighted in group chats." msgstr "" "Uma lista de palavras separadas por ponto-e-vírgula e que serão sublinhadas " "num chat de vários utilizadores." #: gajim/common/config.py:238 #, fuzzy msgid "" "If True, quits Gajim when X button of Window Manager is clicked. This " "setting is taken into account only if notification icon is used." msgstr "" "Se Verdadeiro (True), sai do Gajim quando o botão X do Window Manager for " "clicado. Esta definição só será aplicada se o trayicon estiver a ser usado." #: gajim/common/config.py:239 msgid "" "If True, Gajim hides the Roster window on pressing the X button instead of " "minimizing into the Dock." msgstr "" #: gajim/common/config.py:240 msgid "" "If True, Gajim will display an icon on each tab containing unread messages. " "Depending on the theme, this icon may be animated." msgstr "" "Se Verdadeiro (True), Gajim mostrará um ícone em cada aba contendo mensagens " "não lidas. Dependendo do tema, este ícone poderá ser animado." #: gajim/common/config.py:241 #, fuzzy msgid "" "If True, Gajim will display the status message, if not empty, for every " "contact under the contact name in roster window." msgstr "" "Se Verdadeiro (True), Gajim exibirá a mensagem de estado, caso houver, de " "cada contacto debaixo do nome de cada um deles na lista" #: gajim/common/config.py:247 msgid "Define the position of the avatar in roster. Can be left or right" msgstr "" #: gajim/common/config.py:248 #, fuzzy msgid "" "If False, Gajim will no longer print status line in chats when a contact " "changes his or her status and/or his or her status message." msgstr "" "Se Falso (False), deixará de ver a linha de estados em conversas quando um " "contacto mudar de estado ou de mensagem de estado." #: gajim/common/config.py:249 msgid "" "Can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " "longer print status line in groupchats when a member changes his or her " "status and/or his or her status message. If \"all\" Gajim will print all " "status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " "group chat." msgstr "" #: gajim/common/config.py:251 msgid "Log XHTML messages instead of plain text messages." msgstr "" #: gajim/common/config.py:252 msgid "Background color of contacts when they just signed in." msgstr "" #: gajim/common/config.py:253 msgid "Background color of contacts when they just signed out." msgstr "" #: gajim/common/config.py:255 msgid "" "If True, restored messages will use a smaller font than the default one." msgstr "" #: gajim/common/config.py:256 msgid "Don't show avatar for the transport itself." msgstr "" #: gajim/common/config.py:257 msgid "Don't show roster in the system taskbar." msgstr "" #: gajim/common/config.py:258 msgid "" "If True and installed GTK+ and PyGTK versions are at least 2.8, make the " "window flash (the default behaviour in most Window Managers) when holding " "pending events." msgstr "" #: gajim/common/config.py:260 msgid "" "Jabberd1.4 does not like sha info when one join a password protected group " "chat. Turn this option to False to stop sending sha info in group chat " "presences." msgstr "" #: gajim/common/config.py:263 msgid "" "Controls the window where new messages are placed.\n" "'always' - All messages are sent to a single window.\n" "'always_with_roster' - Like 'always' but the messages are in a single window " "along with the roster.\n" "'never' - All messages get their own window.\n" "'peracct' - Messages for each account are sent to a specific window.\n" "'pertype' - Each message type (e.g. chats vs. groupchats) is sent to a " "specific window." msgstr "" #: gajim/common/config.py:264 msgid "" "Show roster on startup.\n" "'always' - Always show roster.\n" "'never' - Never show roster.\n" "'last_state' - Restore the last state roster." msgstr "" #: gajim/common/config.py:265 msgid "If False, you will no longer see the avatar in the chat window." msgstr "" #: gajim/common/config.py:266 msgid "If True, pressing the escape key closes a tab/window." msgstr "" #: gajim/common/config.py:267 #, fuzzy msgid "Hides the banner in a group chat window" msgstr "Perguntar antes de fechar uma janela/aba de chat." #: gajim/common/config.py:268 msgid "Hides the banner in two persons chat window" msgstr "" #: gajim/common/config.py:269 #, fuzzy msgid "Hides the group chat occupants list in group chat window." msgstr "Perguntar antes de fechar uma janela/aba de chat." #: gajim/common/config.py:270 msgid "" "In a chat, show the nickname at the beginning of a line only when it's not " "the same person talking than in previous message." msgstr "" #: gajim/common/config.py:271 msgid "Indentation when using merge consecutive nickname." msgstr "" #: gajim/common/config.py:272 #, fuzzy msgid "" "List of colors, separated by \":\", that will be used to color nicknames in " "group chats." msgstr "" "Uma lista de palavras separadas por ponto-e-vírgula e que serão sublinhadas " "num chat de vários utilizadores." #: gajim/common/config.py:273 msgid "Ctrl-Tab go to next composing tab when none is unread." msgstr "" #: gajim/common/config.py:274 msgid "" "Should we show the confirm metacontacts creation dialog or not? Empty string " "means we never show the dialog." msgstr "" #: gajim/common/config.py:275 msgid "" "Should we show the confirm block contact dialog or not? Empty string means " "we never show the dialog." msgstr "" #: gajim/common/config.py:276 msgid "" "Should we show the confirm custom status dialog or not? Empty string means " "we never show the dialog." msgstr "" #: gajim/common/config.py:277 msgid "" "If True, you will be able to set a negative priority to your account in " "account modification window. BE CAREFUL, when you are logged in with a " "negative priority, you will NOT receive any message from your server." msgstr "" #: gajim/common/config.py:278 msgid "" "If True, Gajim will show number of online and total contacts in account and " "group rows." msgstr "" #: gajim/common/config.py:279 msgid "" "Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " "as if they were of this type" msgstr "" #: gajim/common/config.py:280 msgid "" "If True, Gajim will scroll and select the contact who sent you the last " "message, if chat window is not already opened." msgstr "" #: gajim/common/config.py:281 msgid "Time of inactivity needed before the change status window closes down." msgstr "" #: gajim/common/config.py:282 msgid "" "Maximum number of lines that are printed in conversations. Oldest lines are " "cleared." msgstr "" #: gajim/common/config.py:283 msgid "" "If True, notification windows from notification-daemon will be attached to " "notification icon." msgstr "" #: gajim/common/config.py:284 msgid "Choose interval between 2 checks of idleness." msgstr "" #: gajim/common/config.py:285 msgid "" "Valid uri schemes. Only schemes in this list will be accepted as \"real\" " "uri. (mailto and xmpp are handled separately)" msgstr "" #: gajim/common/config.py:286 msgid "If True, completion in groupchats will be like a shell auto-completion" msgstr "" #: gajim/common/config.py:287 msgid "" "When is self contact row displayed. Can be \"always\", \"when_other_resource" "\" or \"never\"" msgstr "" #: gajim/common/config.py:292 msgid "Optionally fix jingle output video framerate. Example: 10/1 or 25/2" msgstr "" #: gajim/common/config.py:293 msgid "Optionally resize jingle output video. Example: 320x240" msgstr "" #: gajim/common/config.py:294 msgid "If True, You will also see your webcam" msgstr "" #: gajim/common/config.py:297 msgid "" "If True, Gajim will try to use a STUN server when using Jingle. The one in " "\"stun_server\" option, or the one given by the XMPP server." msgstr "" #: gajim/common/config.py:298 msgid "STUN server to use when using Jingle" msgstr "" #: gajim/common/config.py:299 msgid "" "If True, Gajim will show affiliation of groupchat occupants by adding a " "colored square to the status icon" msgstr "" #: gajim/common/config.py:300 msgid "" "Proxy used for all outgoing connections if the account does not have a " "specific proxy configured" msgstr "" #: gajim/common/config.py:301 msgid "If True, Gajim will ignore incoming attention requestd (\"wizz\")." msgstr "" #: gajim/common/config.py:302 msgid "" "If enabled, Gajim will reopen chat windows that were opened last time Gajim " "was closed." msgstr "" #: gajim/common/config.py:303 msgid "" "If enabled, Gajim will show an icon to show that sent message has been " "received by your contact" msgstr "" #: gajim/common/config.py:304 msgid "Show a mini avatar in chat window tabs and in window icon" msgstr "" #: gajim/common/config.py:305 msgid "If True, Gajim will use the Systems Keyring to store account passwords." msgstr "" #: gajim/common/config.py:306 msgid "Sets the encoding used by python-gnupg" msgstr "" #: gajim/common/config.py:307 msgid "If True, Gajim will execute XEP-0146 Commands." msgstr "" #: gajim/common/config.py:308 msgid "All non-compliant MAM Groupchats" msgstr "" #: gajim/common/config.py:324 msgid "" "Priority will change automatically according to your status. Priorities are " "defined in autopriority_* options." msgstr "" #: gajim/common/config.py:332 msgid "" "Status used to autoconnect as. Can be online, chat, away, xa, dnd, " "invisible. NOTE: this option is used only if restore_last_status is disabled" msgstr "" #: gajim/common/config.py:333 msgid "If enabled, restore the last status that was used." msgstr "" #: gajim/common/config.py:335 msgid "" "If True, Contacts requesting authorization will be automatically accepted." msgstr "" #: gajim/common/config.py:336 msgid "" "If False, this account will be disabled and will not appear in roster window." msgstr "" #: gajim/common/config.py:339 msgid "" "If disabled, don't sign presences with GPG key, even if GPG is configured." msgstr "" #: gajim/common/config.py:341 msgid "Enable ESessions encryption for this account." msgstr "" #: gajim/common/config.py:342 msgid "Should Gajim automatically start an encrypted session when possible?" msgstr "" #: gajim/common/config.py:343 msgid "Allow plaintext connections" msgstr "" #: gajim/common/config.py:346 msgid "" "List (space separated) of authentication mechanisms to try. Can contain " "ANONYMOUS, EXTERNAL, GSSAPI, SCRAM-SHA-1-PLUS, SCRAM-SHA-1, DIGEST-MD5, " "PLAIN, X-MESSENGER-OAUTH2 or XEP-0078" msgstr "" #: gajim/common/config.py:347 msgid "" "Show a warning dialog before sending password on an plaintext connection. " "Can be 'warn', 'connect', 'disconnect'" msgstr "" #: gajim/common/config.py:348 msgid "Show a warning dialog before using standard SSL library." msgstr "" #: gajim/common/config.py:349 msgid "" "Show a warning dialog before sending PLAIN password over a plain connection." msgstr "" #: gajim/common/config.py:352 msgid "Space separated list of ssl errors to ignore." msgstr "" #: gajim/common/config.py:358 msgid "" "Space separated list of JIDs for which you do not want to store logs. You " "can also add account name to log nothing for this account." msgstr "" #: gajim/common/config.py:359 msgid "" "On startup, Gajim will download logs stored on server, provided the server " "supports XEP-0313" msgstr "" #: gajim/common/config.py:360 msgid "" "Space separated list of JIDs for which you accept to not log conversations " "if he does not want to." msgstr "" #: gajim/common/config.py:363 msgid "Whitespace sent after inactivity" msgstr "" #: gajim/common/config.py:364 msgid "XMPP ping sent after inactivity" msgstr "" #: gajim/common/config.py:368 msgid "" "How many seconds to wait for the answer of ping alive packet before we try " "to reconnect?" msgstr "" #: gajim/common/config.py:372 msgid "Jabberd2 workaround" msgstr "" #: gajim/common/config.py:375 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." msgstr "" #: gajim/common/config.py:376 msgid "" "If True, Gajim will test file transfer proxies on startup to be sure it " "works. Openfire's proxies are known to fail this test even if they work." msgstr "" #: gajim/common/config.py:389 msgid "Answer to receipt requests" msgstr "" #: gajim/common/config.py:390 msgid "Sent receipt requests" msgstr "" #: gajim/common/config.py:399 #, fuzzy msgid "" "Allow Gajim to send information about the operating system you are running." msgstr "Se marcado, o Gajim juntar-se-á a este chat no arranque" #: gajim/common/config.py:400 msgid "Allow Gajim to send your local time." msgstr "Permitir que o Gajim envie a sua hora local." #: gajim/common/config.py:401 msgid "" "When negotiating an encrypted session, should Gajim assume you want your " "messages to be logged?" msgstr "" #: gajim/common/config.py:404 #, fuzzy msgid "Message that is sent to contacts you want to add" msgstr "Por favor preencha os dados do contacto que deseja adicionar" #: gajim/common/config.py:405 msgid "" "If enabled and if server supports this feature, Gajim will receive messages " "sent and received by other resources." msgstr "" #: gajim/common/config.py:406 msgid "" "If enabled, Gajim will send your local IPs so your contact can connect to " "your machine to transfer files." msgstr "" #: gajim/common/config.py:407 #, fuzzy msgid "Latest token for OAuth 2.0 authentication." msgstr "Usar autenticação" #: gajim/common/config.py:408 #, fuzzy msgid "client_id for OAuth 2.0 authentication." msgstr "Usar autenticação" #: gajim/common/config.py:409 #, fuzzy msgid "redirect_url for OAuth 2.0 authentication." msgstr "Usar autenticação" #: gajim/common/config.py:410 msgid "" "Space separated list of JIDs for which we want to re-open a chat window on " "next startup." msgstr "" #: gajim/common/config.py:412 msgid "HTTP Upload: Enable HTTPS Verification" msgstr "" #: gajim/common/config.py:413 msgid "" "Preferred file transfer mechanism for file drag&drop on chat window. Can be " "'httpupload' (default) or 'jingle'" msgstr "" #: gajim/common/config.py:476 gajim/common/config.py:481 msgid "Language for which we want to check misspelled words" msgstr "" #: gajim/common/config.py:478 msgid "The currently active encryption for that contact" msgstr "" #: gajim/common/config.py:482 msgid "" "How many lines to request from server when entering a groupchat. -1 means no " "limit, -2 means global value" msgstr "" #: gajim/common/config.py:483 msgid "" "Minutes of backlog to request when entering a groupchat. -1 means no limit, " "-2 means global value" msgstr "" #: gajim/common/config.py:484 msgid "State whether we want a notification for every message in this room" msgstr "" #: gajim/common/config.py:487 msgid "" "State whether plugins should be activated on startup (this is saved on Gajim " "exit). This option SHOULD NOT be used to (de)activate plug-ins. Use GUI " "instead." msgstr "" #: gajim/common/config.py:492 gajim/common/pep.py:157 msgid "Sleeping" msgstr "A dormir" #: gajim/common/config.py:493 msgid "Back soon" msgstr "Volto logo" #: gajim/common/config.py:493 msgid "Back in some minutes." msgstr "Volto daqui a alguns minutos" #: gajim/common/config.py:494 gajim/common/pep.py:127 msgid "Eating" msgstr "A comer" #: gajim/common/config.py:494 msgid "I'm eating, so leave me a message." msgstr "Estou a comer, por isso deixe-me uma mensagem" #: gajim/common/config.py:495 msgid "Movie" msgstr "Filme" #: gajim/common/config.py:495 msgid "I'm watching a movie." msgstr "Estou a ver um filme." #: gajim/common/config.py:496 gajim/common/pep.py:186 msgid "Working" msgstr "A trabalhar" #: gajim/common/config.py:496 msgid "I'm working." msgstr "Estou a trabalhar" #: gajim/common/config.py:497 msgid "Phone" msgstr "Telefone" #: gajim/common/config.py:497 msgid "I'm on the phone." msgstr "Estou ao telefone." #: gajim/common/config.py:498 msgid "Out" msgstr "Estou fora" #: gajim/common/config.py:498 #, fuzzy msgid "I'm out enjoying life." msgstr "Estou fora, fui apreciar a vida" #: gajim/common/config.py:509 #, fuzzy msgid "I'm available." msgstr "Disponível" #: gajim/common/config.py:510 #, fuzzy msgid "I'm free for chat." msgstr "Livre para conversar" #: gajim/common/config.py:512 #, fuzzy msgid "I'm not available." msgstr "Serviço não disponível" #: gajim/common/config.py:513 msgid "Do not disturb." msgstr "" #: gajim/common/config.py:514 gajim/common/config.py:515 msgid "Bye!" msgstr "" #: gajim/common/config.py:526 #, fuzzy msgid "" "Sound to play when a group chat message contains one of the words in " "muc_highlight_words, or when a group chat message contains your nickname." msgstr "" "Som a tocar quando uma mensagem de chat conter uma das palavras da lista " "muc_highlight_words, or quando uma mensagem conter a sua alcunha." #: gajim/common/config.py:527 msgid "Sound to play when any MUC message arrives." msgstr "" #: gajim/common/config.py:535 gajim/common/optparser.py:357 msgid "green" msgstr "green" #: gajim/common/config.py:539 gajim/common/optparser.py:343 msgid "grocery" msgstr "grocery" #: gajim/common/config.py:543 msgid "human" msgstr "human" #: gajim/common/config.py:547 msgid "marine" msgstr "marine" #: gajim/common/config.py:554 #, fuzzy msgid "Tor" msgstr "Para" #: gajim/common/commands.py:86 #, fuzzy msgid "Change status information" msgstr "Informações do Contacto" #: gajim/common/commands.py:108 #, fuzzy msgid "Change status" msgstr "Contacto Saiu" #: gajim/common/commands.py:109 msgid "Set the presence type and description" msgstr "" #: gajim/common/commands.py:115 #, fuzzy msgid "Free for chat" msgstr "Livre para conversar" #: gajim/common/commands.py:116 #, fuzzy msgid "Online" msgstr "_Continuar" #: gajim/common/commands.py:118 msgid "Extended away" msgstr "" #: gajim/common/commands.py:119 msgid "Do not disturb" msgstr "" #: gajim/common/commands.py:120 msgid "Offline - disconnect" msgstr "" #: gajim/common/commands.py:125 #, fuzzy msgid "Presence description:" msgstr "Descrição" #: gajim/common/commands.py:160 gajim/common/commands.py:343 msgid "The status has been changed." msgstr "" #: gajim/common/commands.py:192 gajim/common/commands.py:225 #, fuzzy msgid "Leave Groupchats" msgstr "Chat" #: gajim/common/commands.py:215 #, fuzzy, python-format msgid "%(nickname)s on %(room_jid)s" msgstr "%(nickname)s na sala %(room_name)s enviou-lhe uma nova mensagem." #: gajim/common/commands.py:219 #, fuzzy msgid "You have not joined a groupchat." msgstr "Neste grupo" #: gajim/common/commands.py:226 msgid "Choose the groupchats you want to leave" msgstr "" #: gajim/common/commands.py:271 msgid "You left the following groupchats:" msgstr "Saiu das seguintes conversas de grupo:" #: gajim/common/commands.py:283 #, fuzzy msgid "Forward unread messages" msgstr "Gajim - %d mensagem não lida" #: gajim/common/commands.py:310 msgid "All unread messages have been forwarded." msgstr "" #: gajim/common/commands.py:318 #, fuzzy msgid "Forward unread message then disconnect" msgstr "Gajim - %d mensagem não lida" #: gajim/common/httpupload.py:137 #, fuzzy msgid "File is empty" msgstr "Localização do ficheiro" #: gajim/common/httpupload.py:140 #, fuzzy msgid "File does not exist" msgstr "Tal sala não existe." #: gajim/common/httpupload.py:147 gajim/common/httpupload.py:204 #, python-format msgid "File is too large, maximum allowed file size is: %s" msgstr "" #: gajim/common/check_paths.py:37 msgid "creating logs database" msgstr "a criar base de dados dos logs" #: gajim/common/check_paths.py:98 #, fuzzy msgid "creating cache database" msgstr "a criar base de dados dos logs" #: gajim/common/check_paths.py:261 #, fuzzy, python-format msgid "moving %(src)s to %(dst)s" msgstr "Enviar %s" #: gajim/common/check_paths.py:287 gajim/common/check_paths.py:294 #: gajim/common/check_paths.py:301 gajim/common/check_paths.py:308 #: gajim/common/check_paths.py:315 gajim/common/check_paths.py:322 #: gajim/common/check_paths.py:329 gajim/common/check_paths.py:336 #, fuzzy, python-format msgid "%s is a file but it should be a directory" msgstr "%s é um ficheiro, mas deveria ser um directório" #: gajim/common/check_paths.py:288 gajim/common/check_paths.py:295 #: gajim/common/check_paths.py:302 gajim/common/check_paths.py:309 #: gajim/common/check_paths.py:316 gajim/common/check_paths.py:323 #: gajim/common/check_paths.py:330 gajim/common/check_paths.py:337 #: gajim/common/check_paths.py:349 gajim/common/check_paths.py:357 msgid "Gajim will now exit" msgstr "Gajim irá agora sair" #: gajim/common/check_paths.py:348 gajim/common/check_paths.py:356 #, fuzzy, python-format msgid "%s is a directory but should be a file" msgstr "%s é um directório, mas deveria ser um ficheiro" #: gajim/common/optparser.py:55 #, python-format msgid "Error: cannot open %s for reading" msgstr "Erro: impossível abrir %s para leitura" #: gajim/common/optparser.py:352 gajim/common/optparser.py:353 msgid "cyan" msgstr "cyan" #: gajim/common/optparser.py:421 #, fuzzy msgid "migrating logs database to indices" msgstr "a criar base de dados dos logs" #: gajim/common/logging_helpers.py:34 #, python-format msgid "%s is not a valid loglevel" msgstr "" #: gajim/common/connection.py:83 msgid "Unable to get issuer certificate" msgstr "" #: gajim/common/connection.py:84 msgid "Unable to get certificate CRL" msgstr "" #: gajim/common/connection.py:85 msgid "Unable to decrypt certificate's signature" msgstr "" #: gajim/common/connection.py:86 msgid "Unable to decrypt CRL's signature" msgstr "" #: gajim/common/connection.py:87 #, fuzzy msgid "Unable to decode issuer public key" msgstr "Impossível entrar na sala" #: gajim/common/connection.py:88 msgid "Certificate signature failure" msgstr "" #: gajim/common/connection.py:89 msgid "CRL signature failure" msgstr "" #: gajim/common/connection.py:90 msgid "Certificate is not yet valid" msgstr "" #: gajim/common/connection.py:91 msgid "Certificate has expired" msgstr "" #: gajim/common/connection.py:92 msgid "CRL is not yet valid" msgstr "" #: gajim/common/connection.py:93 msgid "CRL has expired" msgstr "" #: gajim/common/connection.py:94 msgid "Format error in certificate's notBefore field" msgstr "" #: gajim/common/connection.py:95 msgid "Format error in certificate's notAfter field" msgstr "" #: gajim/common/connection.py:96 msgid "Format error in CRL's lastUpdate field" msgstr "" #: gajim/common/connection.py:97 msgid "Format error in CRL's nextUpdate field" msgstr "" #: gajim/common/connection.py:98 msgid "Out of memory" msgstr "" #: gajim/common/connection.py:99 msgid "Self signed certificate" msgstr "" #: gajim/common/connection.py:100 msgid "Self signed certificate in certificate chain" msgstr "" #: gajim/common/connection.py:101 msgid "Unable to get local issuer certificate" msgstr "" #: gajim/common/connection.py:102 msgid "Unable to verify the first certificate" msgstr "" #: gajim/common/connection.py:103 msgid "Certificate chain too long" msgstr "" #: gajim/common/connection.py:104 msgid "Certificate revoked" msgstr "" #: gajim/common/connection.py:105 #, fuzzy msgid "Invalid CA certificate" msgstr "Nome de utilizador inválido" #: gajim/common/connection.py:106 msgid "Path length constraint exceeded" msgstr "" #: gajim/common/connection.py:107 msgid "Unsupported certificate purpose" msgstr "" #: gajim/common/connection.py:108 msgid "Certificate not trusted" msgstr "" #: gajim/common/connection.py:109 msgid "Certificate rejected" msgstr "" #: gajim/common/connection.py:110 msgid "Subject issuer mismatch" msgstr "" #: gajim/common/connection.py:111 msgid "Authority and subject key identifier mismatch" msgstr "" #: gajim/common/connection.py:112 msgid "Authority and issuer serial number mismatch" msgstr "" #: gajim/common/connection.py:113 msgid "Key usage does not include certificate signing" msgstr "" #: gajim/common/connection.py:114 msgid "Application verification failure" msgstr "" #: gajim/common/connection.py:876 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Ligação com conta \"%s\" foi perdida" #: gajim/common/connection.py:877 msgid "Reconnect manually." msgstr "" #: gajim/common/connection.py:888 #, python-format msgid "Server %(name)s answered wrongly to register request: %(error)s" msgstr "" #: gajim/common/connection.py:930 #, python-format msgid "Server %s provided a different registration form" msgstr "" #: gajim/common/connection.py:1283 #, fuzzy, python-format msgid "Could not connect to \"%(host)s\" via proxy \"%(proxy)s\"" msgstr "Impossível ligar a \"%s\"" #: gajim/common/connection.py:1286 #, fuzzy, python-format msgid "Could not connect to \"%(host)s\"" msgstr "Impossível ligar a \"%s\"" #: gajim/common/connection.py:1293 #, fuzzy, python-format msgid "Server replied: %s" msgstr "Guardado em: %s" #: gajim/common/connection.py:1308 #, fuzzy msgid "Connection to proxy failed" msgstr "Ligação" #: gajim/common/connection.py:1346 gajim/common/connection.py:1449 #, fuzzy, python-format msgid "Could not connect to account %s" msgstr "Impossível ligar a \"%s\"" #: gajim/common/connection.py:1347 gajim/common/connection.py:1450 #, fuzzy, python-format msgid "Connection with account %s has been lost. Retry connecting." msgstr "Ligação com conta \"%s\" foi perdida" #: gajim/common/connection.py:1372 #, python-format msgid "The authenticity of the %s certificate could be invalid" msgstr "" #: gajim/common/connection.py:1375 #, python-format msgid "" "\n" "SSL Error: %s" msgstr "" #: gajim/common/connection.py:1377 #, fuzzy, python-format msgid "" "\n" "Unknown SSL error: %d" msgstr "Versão D-Bus desconhecida: %s" #: gajim/common/connection.py:1423 #, python-format msgid "" "The authenticity of the %s certificate could be invalid.\n" "The certificate does not cover this domain." msgstr "" #: gajim/common/connection.py:1473 gajim/common/connection.py:2238 #: gajim/common/zeroconf/connection_zeroconf.py:192 #, python-format msgid "Could not connect to \"%s\"" msgstr "Impossível ligar a \"%s\"" #: gajim/common/connection.py:1512 #, python-format msgid "Authentication failed with \"%s\"" msgstr "Falha na autenticação com \"%s\"" #: gajim/common/connection.py:1513 msgid "Please check your login and password for correctness." msgstr "Por favor, verifique se o seu login e senha estão correctos." #: gajim/common/connection.py:2097 #, python-format msgid "Sent contact: \"%(jid)s\" (%(name)s)" msgstr "" #: gajim/common/connection.py:2101 #, fuzzy msgid "Sent contacts:" msgstr "Contacto:" #: gajim/common/connection.py:2255 gajim/common/connection.py:2277 msgid "Not fetched because of invisible status" msgstr "" #: gajim/common/dbus_support.py:44 msgid "D-Bus python bindings are missing in this computer" msgstr "Bindings do python D-Bus estão em falta neste computador" #: gajim/common/dbus_support.py:45 gajim/common/dbus_support.py:56 msgid "D-Bus capabilities of Gajim cannot be used" msgstr "As potencialidades do D-Bus no Gajim não podem ser usadas" #: gajim/common/dbus_support.py:55 msgid "D-Bus does not run correctly on this machine" msgstr "" #: gajim/common/dbus_support.py:58 #, fuzzy msgid "D-Bus does not run correctly on this machine: system bus not present" msgstr "D-Bus não está presente nesta máquina, ou falta módulo python" #: gajim/common/dbus_support.py:61 #, fuzzy msgid "D-Bus does not run correctly on this machine: session bus not present" msgstr "D-Bus não está presente nesta máquina, ou falta módulo python" #: gajim/common/multimedia_helpers.py:45 #, fuzzy msgid "Default device" msgstr "Mensagem de Estado" #: gajim/common/multimedia_helpers.py:66 msgid "Audio test" msgstr "" #: gajim/common/multimedia_helpers.py:69 gajim/common/multimedia_helpers.py:85 #: gajim/common/multimedia_helpers.py:99 gajim/common/multimedia_helpers.py:117 msgid "Autodetect" msgstr "" #: gajim/common/multimedia_helpers.py:72 gajim/common/multimedia_helpers.py:87 #, fuzzy, python-format msgid "ALSA: %s" msgstr "Tamanho: %s" #: gajim/common/multimedia_helpers.py:75 gajim/common/multimedia_helpers.py:89 #, fuzzy, python-format msgid "Pulse: %s" msgstr "Ficheiro: %s" #: gajim/common/multimedia_helpers.py:83 msgid "Fake audio output" msgstr "" #: gajim/common/multimedia_helpers.py:96 msgid "Video test" msgstr "" #: gajim/common/multimedia_helpers.py:101 #, python-format msgid "V4L2: %s" msgstr "" #: gajim/common/multimedia_helpers.py:104 #, fuzzy msgid "Screen" msgstr "green" #: gajim/common/multimedia_helpers.py:111 msgid "Fake video output" msgstr "" #: gajim/common/multimedia_helpers.py:114 #, python-format msgid "X Window System (X11/XShm/Xv): %s" msgstr "" #: gajim/common/multimedia_helpers.py:116 msgid "X Window System (without Xv)" msgstr "" #: gajim/common/pep.py:27 msgid "Afraid" msgstr "" #: gajim/common/pep.py:28 msgid "Amazed" msgstr "" #: gajim/common/pep.py:29 msgid "Amorous" msgstr "" #: gajim/common/pep.py:30 msgid "Angry" msgstr "" #: gajim/common/pep.py:31 msgid "Annoyed" msgstr "" #: gajim/common/pep.py:32 msgid "Anxious" msgstr "" #: gajim/common/pep.py:33 #, fuzzy msgid "Aroused" msgstr "Pausada" #: gajim/common/pep.py:34 msgid "Ashamed" msgstr "" #: gajim/common/pep.py:35 #, fuzzy msgid "Bored" msgstr "Negrito" #: gajim/common/pep.py:36 msgid "Brave" msgstr "" #: gajim/common/pep.py:37 msgid "Calm" msgstr "" #: gajim/common/pep.py:38 #, fuzzy msgid "Cautious" msgstr "Conversa" #: gajim/common/pep.py:39 #, fuzzy msgid "Cold" msgstr "Negrito" #: gajim/common/pep.py:40 #, fuzzy msgid "Confident" msgstr "_Conteúdo" #: gajim/common/pep.py:41 msgid "Confused" msgstr "" #: gajim/common/pep.py:42 #, fuzzy msgid "Contemplative" msgstr "Completa" #: gajim/common/pep.py:43 #, fuzzy msgid "Contented" msgstr "_Conteúdo" #: gajim/common/pep.py:44 msgid "Cranky" msgstr "" #: gajim/common/pep.py:45 msgid "Crazy" msgstr "" #: gajim/common/pep.py:46 #, fuzzy msgid "Creative" msgstr "Activo" #: gajim/common/pep.py:47 #, fuzzy msgid "Curious" msgstr "_Anterior" #: gajim/common/pep.py:48 #, fuzzy msgid "Dejected" msgstr "Apagar MOTD" #: gajim/common/pep.py:49 msgid "Depressed" msgstr "" #: gajim/common/pep.py:50 msgid "Disappointed" msgstr "" #: gajim/common/pep.py:51 msgid "Disgusted" msgstr "" #: gajim/common/pep.py:52 msgid "Dismayed" msgstr "" #: gajim/common/pep.py:53 msgid "Distracted" msgstr "" #: gajim/common/pep.py:54 msgid "Embarrassed" msgstr "" #: gajim/common/pep.py:55 #, fuzzy msgid "Envious" msgstr "_Anterior" #: gajim/common/pep.py:56 msgid "Excited" msgstr "" #: gajim/common/pep.py:57 msgid "Flirtatious" msgstr "" #: gajim/common/pep.py:58 msgid "Frustrated" msgstr "" #: gajim/common/pep.py:59 msgid "Grateful" msgstr "" #: gajim/common/pep.py:60 msgid "Grieving" msgstr "" #: gajim/common/pep.py:61 #, fuzzy msgid "Grumpy" msgstr "Grupo" #: gajim/common/pep.py:62 msgid "Guilty" msgstr "" #: gajim/common/pep.py:63 msgid "Happy" msgstr "" #: gajim/common/pep.py:64 msgid "Hopeful" msgstr "" #: gajim/common/pep.py:65 #, fuzzy msgid "Hot" msgstr "_Host:" #: gajim/common/pep.py:66 msgid "Humbled" msgstr "" #: gajim/common/pep.py:67 msgid "Humiliated" msgstr "" #: gajim/common/pep.py:68 msgid "Hungry" msgstr "" #: gajim/common/pep.py:69 msgid "Hurt" msgstr "" #: gajim/common/pep.py:70 #, fuzzy msgid "Impressed" msgstr "mensagem" #: gajim/common/pep.py:71 msgid "In Awe" msgstr "" #: gajim/common/pep.py:72 msgid "In Love" msgstr "" #: gajim/common/pep.py:73 msgid "Indignant" msgstr "" #: gajim/common/pep.py:74 msgid "Interested" msgstr "" #: gajim/common/pep.py:75 msgid "Intoxicated" msgstr "" #: gajim/common/pep.py:76 #, fuzzy msgid "Invincible" msgstr "Invisível" #: gajim/common/pep.py:77 msgid "Jealous" msgstr "" #: gajim/common/pep.py:78 #, fuzzy msgid "Lonely" msgstr "Nenhum" #: gajim/common/pep.py:79 #, fuzzy msgid "Lost" msgstr "_Host:" #: gajim/common/pep.py:80 msgid "Lucky" msgstr "" #: gajim/common/pep.py:81 #, fuzzy msgid "Mean" msgstr "Geral" #: gajim/common/pep.py:82 #, fuzzy msgid "Moody" msgstr "_Modificar" #: gajim/common/pep.py:83 #, fuzzy msgid "Nervous" msgstr "_Anterior" #: gajim/common/pep.py:84 msgid "Neutral" msgstr "" #: gajim/common/pep.py:85 #, fuzzy msgid "Offended" msgstr "Offline" #: gajim/common/pep.py:86 msgid "Outraged" msgstr "" #: gajim/common/pep.py:87 msgid "Playful" msgstr "" #: gajim/common/pep.py:88 #, fuzzy msgid "Proud" msgstr "Grupo" #: gajim/common/pep.py:89 msgid "Relaxed" msgstr "" #: gajim/common/pep.py:90 #, fuzzy msgid "Relieved" msgstr "Apagar MOTD" #: gajim/common/pep.py:91 msgid "Remorseful" msgstr "" #: gajim/common/pep.py:92 msgid "Restless" msgstr "" #: gajim/common/pep.py:93 #, fuzzy msgid "Sad" msgstr "Interrompida" #: gajim/common/pep.py:94 msgid "Sarcastic" msgstr "" #: gajim/common/pep.py:95 #, fuzzy msgid "Satisfied" msgstr "Nome:" #: gajim/common/pep.py:96 #, fuzzy msgid "Serious" msgstr "_Anterior" #: gajim/common/pep.py:97 msgid "Shocked" msgstr "" #: gajim/common/pep.py:98 msgid "Shy" msgstr "" #: gajim/common/pep.py:99 #, fuzzy msgid "Sick" msgstr "_Expulsar" #: gajim/common/pep.py:100 #, fuzzy msgid "Sleepy" msgstr "A dormir" #: gajim/common/pep.py:101 msgid "Spontaneous" msgstr "" #: gajim/common/pep.py:102 #, fuzzy msgid "Stressed" msgstr "Rua:" #: gajim/common/pep.py:103 msgid "Strong" msgstr "" #: gajim/common/pep.py:104 #, fuzzy msgid "Surprised" msgstr "Subscrição" #: gajim/common/pep.py:105 msgid "Thankful" msgstr "" #: gajim/common/pep.py:106 msgid "Thirsty" msgstr "" #: gajim/common/pep.py:107 #, fuzzy msgid "Tired" msgstr "Tempo" #: gajim/common/pep.py:108 #, fuzzy msgid "Undefined" msgstr "Sublinhar" #: gajim/common/pep.py:109 msgid "Weak" msgstr "" #: gajim/common/pep.py:110 msgid "Worried" msgstr "" #: gajim/common/pep.py:113 #, fuzzy msgid "Doing Chores" msgstr "Frase de acesso" #: gajim/common/pep.py:114 msgid "Buying Groceries" msgstr "" #: gajim/common/pep.py:115 #, fuzzy msgid "Cleaning" msgstr "Evento" #: gajim/common/pep.py:116 #, fuzzy msgid "Cooking" msgstr "A trabalhar" #: gajim/common/pep.py:117 msgid "Doing Maintenance" msgstr "" #: gajim/common/pep.py:118 msgid "Doing the Dishes" msgstr "" #: gajim/common/pep.py:119 msgid "Doing the Laundry" msgstr "" #: gajim/common/pep.py:120 #, fuzzy msgid "Gardening" msgstr "A trabalhar" #: gajim/common/pep.py:121 msgid "Running an Errand" msgstr "" #: gajim/common/pep.py:122 #, fuzzy msgid "Walking the Dog" msgstr "Neste grupo" #: gajim/common/pep.py:123 #, fuzzy msgid "Drinking" msgstr "A trabalhar" #: gajim/common/pep.py:124 msgid "Having a Beer" msgstr "" #: gajim/common/pep.py:125 msgid "Having Coffee" msgstr "" #: gajim/common/pep.py:126 msgid "Having Tea" msgstr "" #: gajim/common/pep.py:128 msgid "Having a Snack" msgstr "" #: gajim/common/pep.py:129 msgid "Having Breakfast" msgstr "" #: gajim/common/pep.py:130 msgid "Having Dinner" msgstr "" #: gajim/common/pep.py:131 msgid "Having Lunch" msgstr "" #: gajim/common/pep.py:132 msgid "Exercising" msgstr "" #: gajim/common/pep.py:133 gajim/common/pep.py:178 msgid "Cycling" msgstr "" #: gajim/common/pep.py:134 #, fuzzy msgid "Dancing" msgstr "Evento" #: gajim/common/pep.py:135 #, fuzzy msgid "Hiking" msgstr "Expulsando %s" #: gajim/common/pep.py:136 #, fuzzy msgid "Jogging" msgstr "_Entrar" #: gajim/common/pep.py:137 msgid "Playing Sports" msgstr "" #: gajim/common/pep.py:138 msgid "Running" msgstr "" #: gajim/common/pep.py:139 #, fuzzy msgid "Skiing" msgstr "A trabalhar" #: gajim/common/pep.py:140 msgid "Swimming" msgstr "" #: gajim/common/pep.py:141 #, fuzzy msgid "Working out" msgstr "A trabalhar" #: gajim/common/pep.py:142 msgid "Grooming" msgstr "" #: gajim/common/pep.py:143 msgid "At the Spa" msgstr "" #: gajim/common/pep.py:144 msgid "Brushing Teeth" msgstr "" #: gajim/common/pep.py:145 msgid "Getting a Haircut" msgstr "" #: gajim/common/pep.py:146 #, fuzzy msgid "Shaving" msgstr "A comer" #: gajim/common/pep.py:147 msgid "Taking a Bath" msgstr "" #: gajim/common/pep.py:148 msgid "Taking a Shower" msgstr "" #: gajim/common/pep.py:149 msgid "Having an Appointment" msgstr "" #: gajim/common/pep.py:150 gajim/data/gui/gajim_themes_window.ui:363 #, fuzzy msgid "Inactive" msgstr "Activo" #: gajim/common/pep.py:151 msgid "Day Off" msgstr "" #: gajim/common/pep.py:152 #, fuzzy msgid "Hanging out" msgstr "Mudar Assunto" #: gajim/common/pep.py:153 #, fuzzy msgid "Hiding" msgstr "Expulsando %s" #: gajim/common/pep.py:154 msgid "On Vacation" msgstr "" #: gajim/common/pep.py:155 #, fuzzy msgid "Praying" msgstr "A comer" #: gajim/common/pep.py:156 msgid "Scheduled Holiday" msgstr "" #: gajim/common/pep.py:158 #, fuzzy msgid "Thinking" msgstr "A trabalhar" #: gajim/common/pep.py:159 #, fuzzy msgid "Relaxing" msgstr "simples" #: gajim/common/pep.py:160 #, fuzzy msgid "Fishing" msgstr "Expulsando %s" #: gajim/common/pep.py:161 #, fuzzy msgid "Gaming" msgstr "A comer" #: gajim/common/pep.py:162 #, fuzzy msgid "Going out" msgstr "_Desligar" #: gajim/common/pep.py:163 #, fuzzy msgid "Partying" msgstr "A comer" #: gajim/common/pep.py:164 #, fuzzy msgid "Reading" msgstr "A comer" #: gajim/common/pep.py:165 msgid "Rehearsing" msgstr "" #: gajim/common/pep.py:166 #, fuzzy msgid "Shopping" msgstr "A dormir" #: gajim/common/pep.py:167 #, fuzzy msgid "Smoking" msgstr "A trabalhar" #: gajim/common/pep.py:168 msgid "Socializing" msgstr "" #: gajim/common/pep.py:169 #, fuzzy msgid "Sunbathing" msgstr "A comer" #: gajim/common/pep.py:170 msgid "Watching TV" msgstr "" #: gajim/common/pep.py:171 #, fuzzy msgid "Watching a Movie" msgstr "Estou a ver um filme." #: gajim/common/pep.py:172 #, fuzzy msgid "Talking" msgstr "A comer" #: gajim/common/pep.py:173 msgid "In Real Life" msgstr "" #: gajim/common/pep.py:174 #, fuzzy msgid "On the Phone" msgstr "Estou ao telefone." #: gajim/common/pep.py:175 msgid "On Video Phone" msgstr "" #: gajim/common/pep.py:176 #, fuzzy msgid "Traveling" msgstr "A transferir" #: gajim/common/pep.py:177 #, fuzzy msgid "Commuting" msgstr "Ligando" #: gajim/common/pep.py:179 msgid "Driving" msgstr "" #: gajim/common/pep.py:180 msgid "In a Car" msgstr "" #: gajim/common/pep.py:181 msgid "On a Bus" msgstr "" #: gajim/common/pep.py:182 msgid "On a Plane" msgstr "" #: gajim/common/pep.py:183 msgid "On a Train" msgstr "" #: gajim/common/pep.py:184 msgid "On a Trip" msgstr "" #: gajim/common/pep.py:185 #, fuzzy msgid "Walking" msgstr "A trabalhar" #: gajim/common/pep.py:187 #, fuzzy msgid "Coding" msgstr "Ligação" #: gajim/common/pep.py:188 msgid "In a Meeting" msgstr "" #: gajim/common/pep.py:189 msgid "Studying" msgstr "" #: gajim/common/pep.py:190 #, fuzzy msgid "Writing" msgstr "A trabalhar" #: gajim/common/pep.py:195 msgid "accuracy" msgstr "" #: gajim/common/pep.py:196 #, fuzzy msgid "alt" msgstr "Apagar MOTD" #: gajim/common/pep.py:197 msgid "area" msgstr "" #: gajim/common/pep.py:198 #, fuzzy msgid "bearing" msgstr "marine" #: gajim/common/pep.py:199 #, fuzzy msgid "building" msgstr "Expulsando %s" #: gajim/common/pep.py:200 #, fuzzy msgid "country" msgstr "País:" #: gajim/common/pep.py:201 #, fuzzy msgid "countrycode" msgstr "Conta" #: gajim/common/pep.py:202 msgid "datum" msgstr "" #: gajim/common/pep.py:203 #, fuzzy msgid "description" msgstr "Descrição" #: gajim/common/pep.py:204 #, fuzzy msgid "error" msgstr "Erro:" #: gajim/common/pep.py:205 msgid "floor" msgstr "" #: gajim/common/pep.py:206 msgid "lat" msgstr "" #: gajim/common/pep.py:207 msgid "locality" msgstr "" #: gajim/common/pep.py:208 #, fuzzy msgid "lon" msgstr "Nenhum" #: gajim/common/pep.py:209 msgid "postalcode" msgstr "" #: gajim/common/pep.py:210 msgid "region" msgstr "" #: gajim/common/pep.py:211 #, fuzzy msgid "room" msgstr "De" #: gajim/common/pep.py:212 msgid "speed" msgstr "" #: gajim/common/pep.py:213 msgid "street" msgstr "" #: gajim/common/pep.py:214 msgid "text" msgstr "" #: gajim/common/pep.py:215 msgid "timestamp" msgstr "" #: gajim/common/pep.py:216 msgid "uri" msgstr "" #: gajim/common/pep.py:343 msgid "Unknown Artist" msgstr "Artista Desconhecido" #: gajim/common/pep.py:346 msgid "Unknown Title" msgstr "Título Desconhecido" #: gajim/common/pep.py:349 msgid "Unknown Source" msgstr "Fonte Desconhecida" #: gajim/common/pep.py:352 #, python-format msgid "" "\"%(title)s\" by %(artist)s\n" "from %(source)s" msgstr "" #: gajim/common/stanza_session.py:422 msgid "" "[This is part of an encrypted session. If you see this message, something " "went wrong.]" msgstr "" #: gajim/common/jingle_rtp.py:123 #, python-format msgid "%s configuration error" msgstr "%s erro de configuração" #: gajim/common/jingle_rtp.py:124 #, python-format msgid "" "Couldn’t setup %(text)s. Check your configuration.\n" "\n" "Pipeline was:\n" "%(pipeline)s\n" "\n" "Error was:\n" "%(error)s" msgstr "" #: gajim/common/jingle_rtp.py:371 msgid "audio input" msgstr "" #: gajim/common/jingle_rtp.py:375 msgid "audio output" msgstr "" #: gajim/common/jingle_rtp.py:433 msgid "video input" msgstr "" #: gajim/common/jingle_rtp.py:440 msgid "video output" msgstr "" #: gajim/common/helpers.py:296 msgid "Server must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:304 msgid "Invalid character in hostname." msgstr "Caractere inválido no hostname." #: gajim/common/helpers.py:306 msgid "Server address required." msgstr "Endereço de servidor necessário." #: gajim/common/helpers.py:310 msgid "Username must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:318 msgid "Invalid character in username." msgstr "Caractere inválido no nome de utilizador" #: gajim/common/helpers.py:324 msgid "Resource must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:332 msgid "Invalid character in resource." msgstr "Caractere inválido no recurso." #: gajim/common/helpers.py:372 msgid "_Busy" msgstr "_Ocupado" #: gajim/common/helpers.py:377 msgid "_Not Available" msgstr "_Indisponível" #: gajim/common/helpers.py:382 msgid "_Free for Chat" msgstr "_Livre para conversar" #: gajim/common/helpers.py:387 #, fuzzy msgid "?user status:_Available" msgstr "_Disponível" #: gajim/common/helpers.py:391 msgid "Connecting" msgstr "Ligando" #: gajim/common/helpers.py:394 msgid "A_way" msgstr "A_usente" #: gajim/common/helpers.py:399 msgid "_Offline" msgstr "_Offline" #: gajim/common/helpers.py:404 msgid "_Invisible" msgstr "In_visível" #: gajim/common/helpers.py:410 msgid "?contact has status:Unknown" msgstr "Desconhecido" #: gajim/common/helpers.py:412 msgid "?contact has status:Has errors" msgstr "Contém erros" #: gajim/common/helpers.py:427 msgid "?Subscription we already have:None" msgstr "Nenhuma" #: gajim/common/helpers.py:429 msgid "To" msgstr "Para" #: gajim/common/helpers.py:431 msgid "From" msgstr "De" #: gajim/common/helpers.py:433 msgid "Both" msgstr "Ambos" #: gajim/common/helpers.py:435 #, fuzzy msgid "Unknown" msgstr "?SO:Desconhecido" #: gajim/common/helpers.py:441 msgid "?Ask (for Subscription):None" msgstr "Nenhum" #: gajim/common/helpers.py:443 msgid "Subscribe" msgstr "Subscrição" #: gajim/common/helpers.py:452 msgid "?Group Chat Contact Role:None" msgstr "?Função do Contacto no Chat:Nenhuma" #: gajim/common/helpers.py:455 msgid "Moderators" msgstr "Moderadores" #: gajim/common/helpers.py:457 msgid "Moderator" msgstr "Moderador" #: gajim/common/helpers.py:460 msgid "Participants" msgstr "Participantes" #: gajim/common/helpers.py:462 msgid "Participant" msgstr "Participante" #: gajim/common/helpers.py:465 msgid "Visitors" msgstr "Visitantes" #: gajim/common/helpers.py:467 msgid "Visitor" msgstr "Visitante" #: gajim/common/helpers.py:518 msgid "is paying attention to the conversation" msgstr "está a prestar atenção à conversa" #: gajim/common/helpers.py:520 msgid "is doing something else" msgstr "está a fazer outra coisa qualquer" #: gajim/common/helpers.py:522 #, fuzzy msgid "is composing a message…" msgstr "está a escrever uma mensagem..." #: gajim/common/helpers.py:525 msgid "paused composing a message" msgstr "pausa na composição da mensagem" #: gajim/common/helpers.py:527 msgid "has closed the chat window or tab" msgstr "fechou a janela de conversa ou aba" #: gajim/common/helpers.py:754 #, python-format msgid "%s GiB" msgstr "%s GiB" #: gajim/common/helpers.py:757 #, python-format msgid "%s GB" msgstr "%s GB" #: gajim/common/helpers.py:761 #, python-format msgid "%s MiB" msgstr "%s MiB" #: gajim/common/helpers.py:764 #, python-format msgid "%s MB" msgstr "%s MB" #: gajim/common/helpers.py:768 #, python-format msgid "%s KiB" msgstr "%s KiB" #: gajim/common/helpers.py:771 #, python-format msgid "%s KB" msgstr "%s KB" #: gajim/common/helpers.py:774 #, python-format msgid "%s B" msgstr "%s B" #: gajim/common/helpers.py:1141 gajim/common/helpers.py:1148 #, python-format msgid "%d message pending" msgid_plural "%d messages pending" msgstr[0] "%d mensagem pendente" msgstr[1] "%d mensagens pendentes" #: gajim/common/helpers.py:1155 #, fuzzy, python-format msgid "from room %s" msgstr "De %s" #: gajim/common/helpers.py:1158 gajim/common/helpers.py:1175 #, fuzzy, python-format msgid "from user %s" msgstr "De %s" #: gajim/common/helpers.py:1160 #, fuzzy, python-format msgid "from %s" msgstr "De %s" #: gajim/common/helpers.py:1167 gajim/common/helpers.py:1173 #, python-format msgid "%d event pending" msgid_plural "%d events pending" msgstr[0] "" msgstr[1] "" #: gajim/common/helpers.py:1191 gajim/common/helpers.py:1203 #: gajim/data/gui/roster_window.ui:85 data/org.gajim.Gajim.desktop.in:4 #: data/org.gajim.Gajim.appdata.xml.in:9 msgid "Gajim" msgstr "Gajim" #: gajim/common/helpers.py:1205 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" #: gajim/common/helpers.py:1392 gajim/data/gui/add_new_contact_window.ui:24 msgid "I would like to add you to my contact list." msgstr "Gostaria de o adicionar à minha lista de contactos." #: gajim/common/helpers.py:1394 msgid "Hello, I am $name." msgstr "" #: gajim/common/helpers.py:1508 gajim/common/helpers.py:1517 #: gajim/common/helpers.py:1576 msgid "Timeout loading image" msgstr "" #: gajim/common/helpers.py:1527 gajim/common/helpers.py:1574 msgid "Image is too big" msgstr "Imagem é muito grande" #: gajim/common/helpers.py:1538 msgid "PyCURL is not installed" msgstr "" #: gajim/common/helpers.py:1578 #, fuzzy msgid "Error loading image" msgstr "Erro na leitura do ficheiro:" #: gajim/common/connection_handlers.py:133 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "Informação de registo para o transport %s não chegou a tempo" #: gajim/common/connection_handlers.py:979 msgid "This message was encrypted with OTR and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:982 msgid "" "This message was encrypted with Legacy OpenPGP and could not be decrypted. " "You can install the PGP plugin to handle those messages." msgstr "" #: gajim/common/connection_handlers.py:986 msgid "" "This message was encrypted with OpenPGP for XMPP and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:992 #, python-format msgid "This message was encrypted with %s and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:1060 msgid "message" msgstr "mensagem" #: gajim/common/connection_handlers.py:1863 msgid "I would like to add you to my roster." msgstr "Eu gostaria de o adicionar à minha lista" #: gajim/common/exceptions.py:46 #, python-format msgid "" "The database file (%s) cannot be read. Try to repair it (see https://dev." "gajim.org/gajim/gajim/wikis/help/DatabaseBackup) or remove it (all history " "will be lost)." msgstr "" #: gajim/common/exceptions.py:60 msgid "Service not available: Gajim is not running, or remote_control is False" msgstr "" "Serviço/Recurso indisponível: Gajim não está a correr, ou remote_control é " "False" #: gajim/common/exceptions.py:82 #, fuzzy, python-format msgid "" "Session bus is not available.\n" "Try reading %(url)s" msgstr "Bus da sessão não está disponível." #: gajim/common/exceptions.py:94 #, fuzzy, python-format msgid "" "System bus is not available.\n" "Try reading %(url)s" msgstr "Bus da sessão não está disponível." #: gajim/common/zeroconf/connection_zeroconf.py:193 msgid "Please check if Avahi or Bonjour is installed." msgstr "" #: gajim/common/zeroconf/connection_zeroconf.py:203 #: gajim/common/zeroconf/connection_zeroconf.py:207 msgid "Could not start local service" msgstr "" #: gajim/common/zeroconf/connection_zeroconf.py:204 #, fuzzy, python-format msgid "Unable to bind to port %d." msgstr "Impossível entrar na sala" #: gajim/common/zeroconf/connection_zeroconf.py:208 #: gajim/common/zeroconf/connection_zeroconf.py:293 #: gajim/common/zeroconf/connection_zeroconf.py:306 #: gajim/common/zeroconf/connection_zeroconf.py:322 msgid "Please check if avahi-daemon is running." msgstr "" #: gajim/common/zeroconf/connection_zeroconf.py:292 #: gajim/common/zeroconf/connection_zeroconf.py:305 #: gajim/common/zeroconf/connection_zeroconf.py:321 #, fuzzy, python-format msgid "Could not change status of account \"%s\"" msgstr "Impossível ligar a \"%s\"" #: gajim/common/zeroconf/connection_zeroconf.py:337 #, fuzzy msgid "Your message could not be sent." msgstr "A sua mensagem não pode ser enviada enquanto não estiver ligado." #: gajim/common/zeroconf/connection_zeroconf.py:352 msgid "Contact is offline. Your message could not be sent." msgstr "" #: gajim/common/zeroconf/connection_zeroconf.py:374 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "" #: gajim/common/zeroconf/zeroconf_bonjour.py:197 #: gajim/common/zeroconf/zeroconf_avahi.py:220 #, fuzzy, python-format msgid "Error while adding service. %s" msgstr "erro ao enviar" #: gajim/data/gui/blocked_contacts_window.ui:13 #, fuzzy msgid "Blocked Contacts" msgstr "Contacto:" #: gajim/data/gui/advanced_configuration_window.ui:13 msgid "Advanced Configuration Editor" msgstr "Editor de Configuração Avançada" #: gajim/data/gui/advanced_configuration_window.ui:35 msgid "Filter:" msgstr "Filtro:" #: gajim/data/gui/advanced_configuration_window.ui:107 #: gajim/data/gui/features_window.ui:111 msgid "Description" msgstr "Descrição" #: gajim/data/gui/advanced_configuration_window.ui:136 msgid "NOTE: You should restart Gajim for some settings to take effect" msgstr "" #: gajim/data/gui/advanced_configuration_window.ui:161 #, fuzzy msgid "_Reset to default" msgstr "Voltar às Cores Padrão" #: gajim/data/gui/join_groupchat_window.ui:34 #, fuzzy msgid "Bookmark this Groupchat" msgstr "Adicionar esta Sala aos _Bookmarks" #: gajim/data/gui/join_groupchat_window.ui:51 msgid "Join this Groupchat everytime Gajim is started" msgstr "" #: gajim/data/gui/join_groupchat_window.ui:69 #, fuzzy msgid "Bookmark" msgstr "Adicionar esta Sala aos _Bookmarks" #: gajim/data/gui/join_groupchat_window.ui:82 #, fuzzy msgid "Autojoin" msgstr "Entrar automaticamente" #: gajim/data/gui/join_groupchat_window.ui:119 msgid "Account" msgstr "Conta" #: gajim/data/gui/join_groupchat_window.ui:226 #, fuzzy msgid "Room" msgstr "Sala:" #: gajim/data/gui/join_groupchat_window.ui:238 #, fuzzy msgid "Recently" msgstr "Recentemente:" #: gajim/data/gui/join_groupchat_window.ui:290 msgid "Search the rooms on this server" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:12 #, fuzzy msgid "HTTP Connect" msgstr "Ligação HTTP" #: gajim/data/gui/manage_proxies_window.ui:15 msgid "SOCKS5" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:18 msgid "BOSH" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:25 msgid "Manage Proxy Profiles" msgstr "Gerir Perfis de Proxy" #: gajim/data/gui/manage_proxies_window.ui:148 #, fuzzy msgid "_Name:" msgstr "_Nome: " #: gajim/data/gui/manage_proxies_window.ui:161 #, fuzzy msgid "_Type:" msgstr "Tipo:" #: gajim/data/gui/manage_proxies_window.ui:205 msgid "Properties" msgstr "Propriedades" #: gajim/data/gui/manage_proxies_window.ui:234 msgid "_BOSH URL:" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:258 #, fuzzy msgid "Proxy _Host:" msgstr "Proxy:" #: gajim/data/gui/manage_proxies_window.ui:269 #, fuzzy msgid "Use HTTP prox_y" msgstr "_Usar proxy" #: gajim/data/gui/manage_proxies_window.ui:288 #, fuzzy msgid "Proxy _Port:" msgstr "_Porta:" #: gajim/data/gui/manage_proxies_window.ui:299 #, fuzzy msgid "Use proxy auth_entication" msgstr "Usar autenticação" #: gajim/data/gui/manage_proxies_window.ui:318 msgid "_Username:" msgstr "Nome de _utilizador" #: gajim/data/gui/manage_proxies_window.ui:331 msgid "Pass_word:" msgstr "_Senha:" #: gajim/data/gui/manage_proxies_window.ui:391 msgid "Settings" msgstr "Definições" #: gajim/data/gui/change_password_dialog.ui:89 msgid "Enter new password:" msgstr "Introduza a nova senha:" #: gajim/data/gui/change_password_dialog.ui:115 msgid "Enter it again for confirmation:" msgstr "Introduza novamente para confirmação" #: gajim/data/gui/zeroconf_information_window.ui:8 #: gajim/data/gui/vcard_information_window.ui:8 msgid "Contact Information" msgstr "Informações do Contacto" #: gajim/data/gui/zeroconf_information_window.ui:54 msgid "Local jid:" msgstr "" #: gajim/data/gui/zeroconf_information_window.ui:67 #: gajim/data/gui/tooltip_roster_contact.ui:55 #: gajim/data/gui/tooltip_gc_contact.ui:75 msgid "Resource:" msgstr "Recurso:" #: gajim/data/gui/zeroconf_information_window.ui:80 #: gajim/data/gui/tooltip_roster_contact.ui:110 msgid "Status:" msgstr "Estado:" #: gajim/data/gui/zeroconf_information_window.ui:89 #: gajim/data/gui/history_window.ui:290 msgid "_Log conversation history" msgstr "_Histórico das Conversas" #: gajim/data/gui/zeroconf_information_window.ui:215 #: gajim/data/gui/vcard_information_window.ui:360 #, fuzzy msgid "Contact" msgstr "Contacto:" #: gajim/data/gui/zeroconf_information_window.ui:234 #, fuzzy msgid "First Name:" msgstr "Nome:" #: gajim/data/gui/zeroconf_information_window.ui:247 #, fuzzy msgid "Last Name:" msgstr "Nome:" #: gajim/data/gui/zeroconf_information_window.ui:260 #: gajim/data/gui/archiving_313_preferences_item.ui:84 #: gajim/data/gui/tooltip_roster_contact.ui:30 #: gajim/data/gui/tooltip_gc_contact.ui:50 msgid "Jabber ID:" msgstr "Jabber ID:" #: gajim/data/gui/zeroconf_information_window.ui:273 msgid "E-Mail:" msgstr "E-Mail:" #: gajim/data/gui/zeroconf_information_window.ui:354 #, fuzzy msgid "Personal" msgstr "Detalhes Pessoais..." #: gajim/data/gui/gc_occupants_menu.ui:12 msgid "_Send Private Message" msgstr "E_nviar Mensagem Privada" #: gajim/data/gui/gc_occupants_menu.ui:21 msgid "Send _File" msgstr "Enviar _Ficheiro" #: gajim/data/gui/gc_occupants_menu.ui:29 #, fuzzy msgid "Occupant Actions" msgstr "Acções de _Ocupantes" #: gajim/data/gui/gc_occupants_menu.ui:38 msgid "_Voice" msgstr "_Voz" #: gajim/data/gui/gc_occupants_menu.ui:46 msgid "Mo_derator" msgstr "Mo_derador" #: gajim/data/gui/gc_occupants_menu.ui:60 msgid "_Member" msgstr "_Membro" #: gajim/data/gui/gc_occupants_menu.ui:68 msgid "_Admin" msgstr "_Admin" #: gajim/data/gui/gc_occupants_menu.ui:76 msgid "_Owner" msgstr "_Dono" #: gajim/data/gui/gc_occupants_menu.ui:90 msgid "_Kick" msgstr "_Expulsar" #: gajim/data/gui/gc_occupants_menu.ui:98 msgid "_Ban" msgstr "_Banir" #: gajim/data/gui/gc_occupants_menu.ui:124 msgid "_Add to Roster" msgstr "_Adicionar à Lista" #: gajim/data/gui/gc_occupants_menu.ui:132 #, fuzzy msgid "_Execute command" msgstr "comando" #: gajim/data/gui/archiving_313_preferences_item.ui:12 #: gajim/data/gui/preferences_window.ui:102 #: gajim/data/gui/preferences_window.ui:153 #: gajim/data/gui/archiving_313_preferences_window.ui:25 #, fuzzy msgid "Always" msgstr "Ausente" #: gajim/data/gui/archiving_313_preferences_item.ui:15 #: gajim/data/gui/preferences_window.ui:96 #: gajim/data/gui/preferences_window.ui:156 #: gajim/data/gui/archiving_313_preferences_window.ui:31 #, fuzzy msgid "Never" msgstr "_Nunca" #: gajim/data/gui/archiving_313_preferences_item.ui:96 #, fuzzy msgid "Preference:" msgstr "Preferências" #: gajim/data/gui/tooltip_roster_contact.ui:125 #, fuzzy msgid "Idle since:" msgstr "Versão %s" #: gajim/data/gui/tooltip_roster_contact.ui:151 #: gajim/data/gui/change_status_message_dialog.ui:191 #, fuzzy msgid "Mood:" msgstr "Sala:" #: gajim/data/gui/tooltip_roster_contact.ui:164 #: gajim/data/gui/change_status_message_dialog.ui:179 #, fuzzy msgid "Activity:" msgstr "Activo" #: gajim/data/gui/tooltip_roster_contact.ui:178 #, fuzzy msgid "Tune:" msgstr "Tipo:" #: gajim/data/gui/tooltip_roster_contact.ui:191 #, fuzzy msgid "Location:" msgstr "Modificação da Conta" #: gajim/data/gui/tooltip_roster_contact.ui:255 #, fuzzy msgid "OpenPGP:" msgstr "OpenPGP: " #: gajim/data/gui/tooltip_roster_contact.ui:281 msgid "Subscription:" msgstr "Subscrição:" #: gajim/data/gui/zeroconf_context_menu.ui:11 #: gajim/data/gui/account_context_menu.ui:11 msgid "_Status" msgstr "E_stado" #: gajim/data/gui/zeroconf_context_menu.ui:26 #: gajim/data/gui/account_context_menu.ui:79 msgid "_Modify Account..." msgstr "_Modificar Conta..." #: gajim/data/gui/atom_entry_window.ui:8 #, fuzzy msgid "New entry received" msgstr "Quando um novo evento é recebido" #: gajim/data/gui/atom_entry_window.ui:92 #, fuzzy msgid "Feed name:" msgstr "nome do tema" #: gajim/data/gui/atom_entry_window.ui:119 #, fuzzy msgid "Entry:" msgstr "País:" #: gajim/data/gui/atom_entry_window.ui:131 #, fuzzy msgid "Last modified:" msgstr "Nome:" #: gajim/data/gui/atom_entry_window.ui:196 msgid "Next entry" msgstr "" #: gajim/data/gui/gc_control_popup_menu.ui:11 #, fuzzy msgid "Change _Nickname..." msgstr "Muda Alcu_nha" #: gajim/data/gui/gc_control_popup_menu.ui:20 #, fuzzy msgid "_Manage Room" msgstr "Gerir Bookmarks" #: gajim/data/gui/gc_control_popup_menu.ui:31 #, fuzzy msgid "Change _Subject..." msgstr "Muda A_ssunto" #: gajim/data/gui/gc_control_popup_menu.ui:38 #, fuzzy msgid "Configure _Room..." msgstr "Configurar _Sala" #: gajim/data/gui/gc_control_popup_menu.ui:52 #, fuzzy msgid "_Destroy Room" msgstr "Descrição: %s" #: gajim/data/gui/gc_control_popup_menu.ui:64 msgid "_Minimize on close" msgstr "" #: gajim/data/gui/gc_control_popup_menu.ui:85 #, fuzzy msgid "_Request Voice" msgstr "_Voz" #: gajim/data/gui/profile_window.ui:7 msgid "Personal Information" msgstr "Detalhes Pessoais..." #: gajim/data/gui/profile_window.ui:35 #: gajim/data/gui/vcard_information_window.ui:382 #, fuzzy msgid "Name:" msgstr "Definições Personalizadas" #: gajim/data/gui/profile_window.ui:59 #: gajim/data/gui/vcard_information_window.ui:410 msgid "Nickname:" msgstr "Alcunha:" #. Family Name #: gajim/data/gui/profile_window.ui:94 #: gajim/data/gui/vcard_information_window.ui:740 msgid "Family:" msgstr "Família:" #. Given Name #: gajim/data/gui/profile_window.ui:118 #: gajim/data/gui/vcard_information_window.ui:822 #, fuzzy msgid "Given:" msgstr "OpenPGP" #. Middle Name #: gajim/data/gui/profile_window.ui:142 #: gajim/data/gui/vcard_information_window.ui:753 #, fuzzy msgid "Middle:" msgstr "Formato de uma linha" #. Prefix in Name #: gajim/data/gui/profile_window.ui:156 #: gajim/data/gui/vcard_information_window.ui:766 #, fuzzy msgid "Prefix:" msgstr "Propriedades" #. Suffix in Name #: gajim/data/gui/profile_window.ui:190 #: gajim/data/gui/vcard_information_window.ui:835 #, fuzzy msgid "Suffix:" msgstr "Sons" #: gajim/data/gui/profile_window.ui:222 #: gajim/data/gui/vcard_information_window.ui:878 #, fuzzy msgid "Full Name" msgstr "Definições Personalizadas" #: gajim/data/gui/profile_window.ui:250 gajim/data/gui/profile_window.ui:724 #: gajim/data/gui/vcard_information_window.ui:454 #: gajim/data/gui/vcard_information_window.ui:1087 #, fuzzy msgid "Street:" msgstr "Definições" #: gajim/data/gui/profile_window.ui:274 gajim/data/gui/profile_window.ui:748 #: gajim/data/gui/vcard_information_window.ui:535 #: gajim/data/gui/vcard_information_window.ui:1126 msgid "Extra Address:" msgstr "Endereço Extra:" #: gajim/data/gui/profile_window.ui:298 gajim/data/gui/profile_window.ui:772 #: gajim/data/gui/vcard_information_window.ui:467 #: gajim/data/gui/vcard_information_window.ui:1100 #, fuzzy msgid "City:" msgstr "Definições Personalizadas" #: gajim/data/gui/profile_window.ui:322 gajim/data/gui/profile_window.ui:796 #: gajim/data/gui/vcard_information_window.ui:548 #: gajim/data/gui/vcard_information_window.ui:1140 msgid "Postal Code:" msgstr "Código Postal:" #: gajim/data/gui/profile_window.ui:346 gajim/data/gui/profile_window.ui:820 #: gajim/data/gui/vcard_information_window.ui:480 #: gajim/data/gui/vcard_information_window.ui:1113 #, fuzzy msgid "State:" msgstr "Definições" #: gajim/data/gui/profile_window.ui:370 gajim/data/gui/profile_window.ui:844 #: gajim/data/gui/vcard_information_window.ui:561 #: gajim/data/gui/vcard_information_window.ui:1153 #, fuzzy msgid "Country:" msgstr "Sons" #: gajim/data/gui/profile_window.ui:396 gajim/data/gui/profile_window.ui:870 #: gajim/data/gui/vcard_information_window.ui:618 #: gajim/data/gui/vcard_information_window.ui:1253 #, fuzzy msgid "Address" msgstr "Formato de uma linha" #: gajim/data/gui/profile_window.ui:413 #: gajim/data/gui/vcard_information_window.ui:635 #, fuzzy msgid "Homepage:" msgstr "Página pessoal:" #: gajim/data/gui/profile_window.ui:437 gajim/data/gui/profile_window.ui:887 #: gajim/data/gui/vcard_information_window.ui:648 #: gajim/data/gui/vcard_information_window.ui:1270 msgid "E-Mail:" msgstr "Correio Electrónico" #: gajim/data/gui/profile_window.ui:462 gajim/data/gui/profile_window.ui:912 #: gajim/data/gui/vcard_information_window.ui:661 #: gajim/data/gui/vcard_information_window.ui:1283 msgid "Phone No.:" msgstr "N.º Telefone:" #: gajim/data/gui/profile_window.ui:497 #, fuzzy msgid "Avatar:" msgstr "Definir _Avatar" #: gajim/data/gui/profile_window.ui:540 msgid "Click to set your avatar" msgstr "" #: gajim/data/gui/profile_window.ui:566 #: gajim/data/gui/vcard_information_window.ui:702 msgid "Format: YYYY-MM-DD" msgstr "Formato: AAAA-MM-DD" #: gajim/data/gui/profile_window.ui:574 #: gajim/data/gui/vcard_information_window.ui:708 #, fuzzy msgid "Birthday:" msgstr "Aniversário" #: gajim/data/gui/profile_window.ui:598 #: gajim/data/gui/vcard_information_window.ui:937 #, fuzzy msgid "Personal Info" msgstr "Detalhes Pessoais..." #: gajim/data/gui/profile_window.ui:617 #: gajim/data/gui/vcard_information_window.ui:960 #, fuzzy msgid "Company:" msgstr "Definições Personalizadas" #: gajim/data/gui/profile_window.ui:641 #: gajim/data/gui/vcard_information_window.ui:990 msgid "Department:" msgstr "Departamento:" #: gajim/data/gui/profile_window.ui:665 #: gajim/data/gui/vcard_information_window.ui:1018 #, fuzzy msgid "Position:" msgstr "Sons" #: gajim/data/gui/profile_window.ui:689 #: gajim/data/gui/vcard_information_window.ui:1045 #, fuzzy msgid "Role:" msgstr "Registos" #: gajim/data/gui/profile_window.ui:947 #: gajim/data/gui/vcard_information_window.ui:1336 msgid "Work" msgstr "Trabalho" #. "About" is the text of a tab of vcard window #: gajim/data/gui/profile_window.ui:979 #: gajim/data/gui/vcard_information_window.ui:1368 #: gajim/data/gui/application_menu.ui:62 msgid "About" msgstr "Sobre" #: gajim/data/gui/filetransfers.ui:20 #, fuzzy msgid "Con_tinue" msgstr "_Continuar" #: gajim/data/gui/filetransfers.ui:28 gajim/data/gui/filetransfers.ui:156 msgid "_Pause" msgstr "_Pausa" #: gajim/data/gui/filetransfers.ui:36 gajim/data/gui/filetransfers.ui:174 #: gajim/data/gui/service_registration_window.ui:53 msgid "_Cancel" msgstr "_Cancelar" #: gajim/data/gui/filetransfers.ui:50 msgid "_Open Containing Folder" msgstr "_Abrir Pasta" #: gajim/data/gui/filetransfers.ui:79 gajim/data/gui/filetransfers.ui:253 msgid "File Transfers" msgstr "Transferências de Ficheiros" #: gajim/data/gui/filetransfers.ui:110 msgid "file transfers list" msgstr "lista de transferências de ficheiros" #: gajim/data/gui/filetransfers.ui:111 msgid "A list of active, completed and stopped file transfers" msgstr "Uma lista de transferências de ficheiros activas, completas e paradas" #: gajim/data/gui/filetransfers.ui:131 msgid "Clean _up" msgstr "_Limpar" #: gajim/data/gui/filetransfers.ui:137 #, fuzzy msgid "Removes completed, cancelled and failed file transfers from the list" msgstr "" "Remove transferências de ficheiros completas, canceladas e falhadas da lista" #: gajim/data/gui/filetransfers.ui:143 msgid "Remove file transfer from the list." msgstr "Remover a transferência de ficheiro da lista." #: gajim/data/gui/filetransfers.ui:144 msgid "" "This action removes single file transfer from the list. If the transfer is " "active, it is first stopped and then removed" msgstr "" "Esta acção remove uma única transferência de ficheiro da lista. Se a " "transferência estiver activa, será primeiro interrompida e depois removida." #: gajim/data/gui/filetransfers.ui:180 #, fuzzy msgid "Cancels the selected file transfer and removes incomplete files" msgstr "" "Cancela a transferência de ficheiro seleccionada e remove o ficheiro " "incompleto" #: gajim/data/gui/filetransfers.ui:186 msgid "Cancel file transfer" msgstr "Cancelar transferência de ficheiro" #: gajim/data/gui/filetransfers.ui:187 msgid "Cancels the selected file transfer" msgstr "Cancela a transferência de ficheiro seleccionada" #: gajim/data/gui/filetransfers.ui:199 #, fuzzy msgid "_Close" msgstr "E_nviar & Fechar" #: gajim/data/gui/filetransfers.ui:205 msgid "Hides the window" msgstr "Esconde a janela" #: gajim/data/gui/filetransfers.ui:226 msgid "_Notify me when a file transfer is complete" msgstr "_Notificar-me quando uma transferência de ficheiro estiver completa" #: gajim/data/gui/filetransfers.ui:236 msgid "When a file transfer is complete show a popup notification" msgstr "" "Quando uma transferência de ficheiro é concluida, exibir um popup de " "notificação" #: gajim/data/gui/filetransfers.ui:254 #, fuzzy msgid "Shows a list of file transfers between you and others" msgstr "" "Mostra uma lista de transferências de ficheiros entre si e outras pessoas" #: gajim/data/gui/service_registration_window.ui:18 msgid "Register to" msgstr "Registar para" #: gajim/data/gui/service_registration_window.ui:70 #: gajim/data/gui/roster_item_exchange_window.ui:126 msgid "_OK" msgstr "_OK" #: gajim/data/gui/groupchat_control.ui:13 gajim/data/gui/chat_control.ui:293 #: gajim/data/gui/gajim_themes_window.ui:264 msgid "Bold" msgstr "Negrito" #: gajim/data/gui/groupchat_control.ui:22 gajim/data/gui/chat_control.ui:302 #: gajim/data/gui/gajim_themes_window.ui:284 msgid "Italic" msgstr "Itálico" #: gajim/data/gui/groupchat_control.ui:31 gajim/data/gui/chat_control.ui:311 #, fuzzy msgid "Underline" msgstr "Sublinhar" #: gajim/data/gui/groupchat_control.ui:40 gajim/data/gui/chat_control.ui:320 #, fuzzy msgid "Strike" msgstr "Serviço" #: gajim/data/gui/groupchat_control.ui:62 gajim/data/gui/chat_control.ui:342 #, fuzzy msgid "Font" msgstr "Letra:" #: gajim/data/gui/groupchat_control.ui:76 gajim/data/gui/chat_control.ui:356 #, fuzzy msgid "Clear formatting" msgstr "Informações do Contacto" #: gajim/data/gui/groupchat_control.ui:283 gajim/data/gui/chat_control.ui:805 #, fuzzy msgid "Choose an encryption" msgstr "Escolher Ficheiro para Enviar" #: gajim/data/gui/groupchat_control.ui:329 gajim/data/gui/chat_control.ui:853 #, fuzzy msgid "Show a list of emoticons (Alt+M)" msgstr "Clique para inserir um emoticon (Alt+E)" #: gajim/data/gui/popup_notification_window.ui:55 #, fuzzy msgid "Event Type" msgstr "Evento" #: gajim/data/gui/popup_notification_window.ui:100 #, fuzzy msgid "Event desc" msgstr "Eventos" #: gajim/data/gui/chat_control.ui:41 #, fuzzy msgid "1" msgstr "Registos" #: gajim/data/gui/chat_control.ui:63 #, fuzzy msgid "2 abc" msgstr "Registos" #: gajim/data/gui/chat_control.ui:84 #, fuzzy msgid "3 def" msgstr "Registos" #: gajim/data/gui/chat_control.ui:105 #, fuzzy msgid "4 ghi" msgstr "Registos" #: gajim/data/gui/chat_control.ui:126 #, fuzzy msgid "5 jkl" msgstr "Registos" #: gajim/data/gui/chat_control.ui:147 #, fuzzy msgid "6 mno" msgstr "Registos" #: gajim/data/gui/chat_control.ui:167 msgid "7 pqrs" msgstr "" #: gajim/data/gui/chat_control.ui:188 #, fuzzy msgid "8 tuv" msgstr "Registos" #: gajim/data/gui/chat_control.ui:209 msgid "9 wxyz" msgstr "" #: gajim/data/gui/chat_control.ui:229 #, fuzzy msgid "*" msgstr "Registos" #: gajim/data/gui/chat_control.ui:249 #, fuzzy msgid "0" msgstr "Registos" #: gajim/data/gui/chat_control.ui:269 #, fuzzy msgid "#" msgstr "Registos" #: gajim/data/gui/chat_control.ui:729 msgid "#" msgstr "" #: gajim/data/gui/vcard_information_window.ui:55 #, fuzzy msgid "Jabber ID:" msgstr "Jabber ID:" #: gajim/data/gui/vcard_information_window.ui:69 msgid "Resource:" msgstr "Recurso:" #: gajim/data/gui/vcard_information_window.ui:83 #, fuzzy msgid "Status:" msgstr "Definições" #: gajim/data/gui/vcard_information_window.ui:97 #, fuzzy msgid "Client:" msgstr "Definições Personalizadas" #: gajim/data/gui/vcard_information_window.ui:111 #, fuzzy msgid "System:" msgstr "Definições Personalizadas" #: gajim/data/gui/vcard_information_window.ui:125 #, fuzzy msgid "Contact time:" msgstr "Definições" #: gajim/data/gui/vcard_information_window.ui:222 #, fuzzy msgid "User avatar:" msgstr "Definir _Avatar" #: gajim/data/gui/vcard_information_window.ui:234 #, fuzzy msgid "Configured avatar:" msgstr "Configurar _Sala" #. Given Name #: gajim/data/gui/vcard_information_window.ui:263 #, fuzzy msgid "Ask:" msgstr "Aplicações" #. Family Name #: gajim/data/gui/vcard_information_window.ui:277 #, fuzzy msgid "Subscription:" msgstr "Descrição" #: gajim/data/gui/vcard_information_window.ui:893 #: gajim/data/gui/vcard_information_window.ui:912 #: gajim/data/gui/vcard_information_window.ui:1310 msgid "button" msgstr "" #: gajim/data/gui/vcard_information_window.ui:1398 msgid "Comments" msgstr "Comentários" #: gajim/data/gui/gajim_themes_window.ui:12 #, fuzzy msgid "Account row" msgstr "Conta" #: gajim/data/gui/gajim_themes_window.ui:15 #, fuzzy msgid "Group row" msgstr "Grupo" #: gajim/data/gui/gajim_themes_window.ui:18 #, fuzzy msgid "Contact row" msgstr "Contacto:" #: gajim/data/gui/gajim_themes_window.ui:21 #, fuzzy msgid "Chat Banner" msgstr "Faixa:" #: gajim/data/gui/gajim_themes_window.ui:28 msgid "Gajim Themes Customization" msgstr "Personalização de Temas do Gajim" #: gajim/data/gui/gajim_themes_window.ui:157 msgid "Text _color:" msgstr "_Cor do texto" #: gajim/data/gui/gajim_themes_window.ui:173 msgid "_Background:" msgstr "Cor _de fundo" #: gajim/data/gui/gajim_themes_window.ui:189 msgid "Text _font:" msgstr "_Letra do texto" #: gajim/data/gui/gajim_themes_window.ui:207 msgid "Font style:" msgstr "Estilo da letra:" #: gajim/data/gui/gajim_themes_window.ui:375 msgid "Composing" msgstr "" #: gajim/data/gui/gajim_themes_window.ui:387 msgid "Paused" msgstr "Pausada" #: gajim/data/gui/gajim_themes_window.ui:399 #, fuzzy msgid "Gone" msgstr "Nenhum" #: gajim/data/gui/gajim_themes_window.ui:411 #, fuzzy msgid "" "MUC\n" "Messages" msgstr "Mensagem" #: gajim/data/gui/gajim_themes_window.ui:424 msgid "" "MUC Directed\n" "Messages" msgstr "" #: gajim/data/gui/gajim_themes_window.ui:510 msgid "Chatstate Tab Colors" msgstr "" #: gajim/data/gui/preferences_window.ui:48 msgid "Use default applications" msgstr "" #: gajim/data/gui/preferences_window.ui:51 msgid "Custom" msgstr "Definições Personalizadas" #: gajim/data/gui/preferences_window.ui:62 #: gajim/data/gui/preferences_window.ui:79 #, fuzzy msgid "All chat states" msgstr "Estado: " #: gajim/data/gui/preferences_window.ui:65 #: gajim/data/gui/preferences_window.ui:82 msgid "Composing only" msgstr "" #: gajim/data/gui/preferences_window.ui:99 msgid "Only when pending events" msgstr "" #: gajim/data/gui/preferences_window.ui:113 #, fuzzy msgid "Pop it up" msgstr "_Mostrar a mensagem como pop-up" #: gajim/data/gui/preferences_window.ui:116 #, fuzzy msgid "Notify me about it" msgstr "_Notificar-me" #: gajim/data/gui/preferences_window.ui:119 #, fuzzy msgid "Show only in roster" msgstr "Mostrar apenas na _lista" #: gajim/data/gui/preferences_window.ui:130 msgid "Detached roster with detached chats" msgstr "" #: gajim/data/gui/preferences_window.ui:133 msgid "Detached roster with single chat" msgstr "" #: gajim/data/gui/preferences_window.ui:136 msgid "Single window for everything" msgstr "" #: gajim/data/gui/preferences_window.ui:139 msgid "Detached roster with chat grouped by account" msgstr "" #: gajim/data/gui/preferences_window.ui:142 msgid "Detached roster with chat grouped by type" msgstr "" #: gajim/data/gui/preferences_window.ui:159 #, fuzzy msgid "Last state" msgstr "Iconset de _estados padrão:" #: gajim/data/gui/preferences_window.ui:195 #: gajim/data/gui/application_menu.ui:94 gajim/data/gui/shortcuts_window.ui:188 msgid "Preferences" msgstr "Preferências" #: gajim/data/gui/preferences_window.ui:237 #, fuzzy msgid "Display a_vatars of contacts in roster" msgstr "Exibir imagens pessoais (avatars) dos contactos na lista" #: gajim/data/gui/preferences_window.ui:241 #, fuzzy msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" msgstr "" "Se marcado, Gajim exibirá imagens pessoais (avatars) dos seus contactos na " "lista" #: gajim/data/gui/preferences_window.ui:255 #, fuzzy msgid "Display status _messages of contacts in roster" msgstr "Exibir mensagens de estado dos contactos na lista" #: gajim/data/gui/preferences_window.ui:259 #, fuzzy msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name, in roster window and in group chats" msgstr "" "Se marcado, Gajim exibirá as mensagens de estado dos contactos debaixo dos " "nomes de cada um na janela principal" #: gajim/data/gui/preferences_window.ui:273 #, fuzzy msgid "Display e_xtra information of contacts in roster (mood, activity, ...)" msgstr "Exibir imagens pessoais (avatars) dos contactos na lista" #: gajim/data/gui/preferences_window.ui:277 #, fuzzy msgid "" "If checked, Gajim will display the mood of contacts in the roster window" msgstr "" "Se marcado, Gajim exibirá imagens pessoais (avatars) dos seus contactos na " "lista" #: gajim/data/gui/preferences_window.ui:298 #, fuzzy msgid "Sort contacts by status" msgstr "Ordenar contactos por estados" #: gajim/data/gui/preferences_window.ui:308 #, fuzzy msgid "in _roster" msgstr "Fora da lista" #: gajim/data/gui/preferences_window.ui:325 #, fuzzy msgid "in _group chats" msgstr "_Entrar num Chat" #: gajim/data/gui/preferences_window.ui:354 msgid "Roster Appearance" msgstr "" #: gajim/data/gui/preferences_window.ui:384 #, fuzzy msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" msgstr "" "Se marcado, o Gajim trocará smilies ASCII tais como ':)' pelos emoticons " "gráficos equivalentes." #: gajim/data/gui/preferences_window.ui:390 #, fuzzy msgid "_Emoticons:" msgstr "Gerir Emoticons" #: gajim/data/gui/preferences_window.ui:406 msgid "_Window behavior:" msgstr "" #: gajim/data/gui/preferences_window.ui:420 #, fuzzy msgid "_Show roster on startup:" msgstr "Mostrar janela principal ao arranque" #: gajim/data/gui/preferences_window.ui:431 msgid "_Ignore rich content in incoming messages" msgstr "" #: gajim/data/gui/preferences_window.ui:435 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." msgstr "" #: gajim/data/gui/preferences_window.ui:449 msgid "_Highlight misspelled words" msgstr "_Destacar palavras mal soletradas" #: gajim/data/gui/preferences_window.ui:452 msgid "" "If checked, Gajim will highlight spelling errors in input fields of chat " "windows. If no language is explicitly set via right click on the input " "field, the default language will be used for this contact or group chat." msgstr "" #: gajim/data/gui/preferences_window.ui:466 msgid "Notify by icon when your messages are received" msgstr "" #: gajim/data/gui/preferences_window.ui:520 msgid "Show avatar in chat tabs" msgstr "" #: gajim/data/gui/preferences_window.ui:552 #, fuzzy msgid "Chat Appearance" msgstr "Formato de uma linha" #: gajim/data/gui/preferences_window.ui:607 #, fuzzy msgid "When new event is received:" msgstr "Quando um novo evento é recebido" #: gajim/data/gui/preferences_window.ui:645 #, fuzzy msgid "Notify me about contacts that sign _in" msgstr "Notificar-me sobre contactos que acabem de se: " #: gajim/data/gui/preferences_window.ui:663 #, fuzzy msgid "Notify me about contacts that sign _out" msgstr "Notificar-me sobre contactos que acabem de se: " #: gajim/data/gui/preferences_window.ui:667 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" msgstr "" "Gajim o notificará através de um popup no canto inferior direito do ecrã " "sobre os contactos que se desligarem" #: gajim/data/gui/preferences_window.ui:681 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" msgstr "" "Permitir popup/notificações quando estou _ausente/indisponível/ocupado/" "invisível" #: gajim/data/gui/preferences_window.ui:698 #, fuzzy msgid "Allow popup/notifications when a chat window is opened" msgstr "" "Permitir popup/notificações quando estou _ausente/indisponível/ocupado/" "invisível" #: gajim/data/gui/preferences_window.ui:722 #, fuzzy msgid "Show notification area icon:" msgstr "_Ícone na bandeja (também conhecido por área de notificação)" #: gajim/data/gui/preferences_window.ui:762 msgid "Visual Notifications" msgstr "Notificações Visuais" #: gajim/data/gui/preferences_window.ui:795 msgid "Play _sounds" msgstr "Tocar _Sons" #: gajim/data/gui/preferences_window.ui:812 #: gajim/data/gui/preferences_window.ui:1656 #, fuzzy msgid "Ma_nage..." msgstr "Gerir..." #: gajim/data/gui/preferences_window.ui:834 msgid "Allow sound when I'm _busy" msgstr "" #: gajim/data/gui/preferences_window.ui:856 msgid "Sounds" msgstr "Sons" #: gajim/data/gui/preferences_window.ui:877 #, fuzzy msgid "Notifications" msgstr "Modificação da Conta" #: gajim/data/gui/preferences_window.ui:911 #, fuzzy msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " "display in chat windows." msgstr "" "Gajim pode enviar e receber meta-informação relativa a uma conversa que " "esteja a ter com um contacto " #: gajim/data/gui/preferences_window.ui:916 #, fuzzy msgid "_Display chat state notifications:" msgstr "Noti_ficação do estado da conversa:" #: gajim/data/gui/preferences_window.ui:967 #, fuzzy msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " "send to the other party." msgstr "" "Gajim pode enviar e receber meta-informação relativa a uma conversa que " "esteja a ter com um contacto " #: gajim/data/gui/preferences_window.ui:972 #, fuzzy msgid "_Send chat state notifications:" msgstr "Noti_ficação do estado da conversa:" #: gajim/data/gui/preferences_window.ui:990 #, fuzzy msgid "Chat state notifications" msgstr "Notificações Visuais" #: gajim/data/gui/preferences_window.ui:1012 #, fuzzy msgid "Personal Events" msgstr "Detalhes Pessoais..." #: gajim/data/gui/preferences_window.ui:1043 #, fuzzy msgid "_Away after:" msgstr "Marcar automaticamente como _ausente depois de:" #: gajim/data/gui/preferences_window.ui:1047 #, fuzzy msgid "" "If checked, Gajim will change status to Away when the computer is unused." msgstr "Se marcado, o Gajim terá também um ícone na área de notificação" #: gajim/data/gui/preferences_window.ui:1060 #, fuzzy msgid "_Not available after:" msgstr "Marcar automaticamente como _indisponível depois de:" #: gajim/data/gui/preferences_window.ui:1064 msgid "" "If checked, Gajim will change status to Not Available when the computer has " "not been used even longer" msgstr "" #: gajim/data/gui/preferences_window.ui:1079 #: gajim/data/gui/preferences_window.ui:1091 msgid "minutes" msgstr "minutos" #: gajim/data/gui/preferences_window.ui:1103 msgid "" "The auto away status message. If empty, Gajim will not change the current " "status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-away timeout" msgstr "" #: gajim/data/gui/preferences_window.ui:1117 msgid "" "The auto not available status message. If empty, Gajim will not change the " "current status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-not-available timeout" msgstr "" #: gajim/data/gui/preferences_window.ui:1165 #, fuzzy msgid "Auto Status" msgstr "Aplicações" #: gajim/data/gui/preferences_window.ui:1200 msgid "Ask status message when I:" msgstr "Pedir a mensagem de estado quando eu me: " #: gajim/data/gui/preferences_window.ui:1215 msgid "Sign _in" msgstr "_Ligar" #: gajim/data/gui/preferences_window.ui:1232 msgid "Sign _out" msgstr "_Desligar" #: gajim/data/gui/preferences_window.ui:1265 msgid "" "If enabled, Gajim will not ask for a status message. The specified default " "message will be used instead." msgstr "" #: gajim/data/gui/preferences_window.ui:1277 #: gajim/data/gui/preferences_window.ui:1479 msgid "Status" msgstr "Estado" #: gajim/data/gui/preferences_window.ui:1288 #, fuzzy msgid "Default Message" msgstr "Mensagem de Estado" #: gajim/data/gui/preferences_window.ui:1303 #, fuzzy msgid "Enabled" msgstr "Activar" #: gajim/data/gui/preferences_window.ui:1329 #, fuzzy msgid "Status Messages" msgstr "Configurar Mensagens de Estado" #: gajim/data/gui/preferences_window.ui:1459 msgid "Preset Status Messages" msgstr "Configurar Mensagens de Estado" #: gajim/data/gui/preferences_window.ui:1512 #, fuzzy msgid "Chat message:" msgstr "Mensagem de estado:" #: gajim/data/gui/preferences_window.ui:1537 msgid "Use system _default" msgstr "" #: gajim/data/gui/preferences_window.ui:1560 #, fuzzy msgid "Font" msgstr "Registos" #: gajim/data/gui/preferences_window.ui:1590 #, fuzzy msgid "T_heme:" msgstr "Tema:" #: gajim/data/gui/preferences_window.ui:1603 #, fuzzy msgid "Status _iconset:" msgstr "Iconset de _estados padrão:" #: gajim/data/gui/preferences_window.ui:1614 #, fuzzy msgid "Use _transports icons" msgstr "Usar iconsets de _transportes" #: gajim/data/gui/preferences_window.ui:1618 #, fuzzy msgid "" "If checked, Gajim will use protocol-specific status icons. (e.g. A contact " "from ICQ will have the equivalent ICQ icon for status online, away, busy, " "etc...)" msgstr "" "Se marcado, o Gajim usará ícones de estado específicos a cada protocolo. " "(Por exemplo, um contacto do MSN terá o ícone msn equivalente para o estado " "disponível, ausente, ocupado, etc...)" #: gajim/data/gui/preferences_window.ui:1660 msgid "Configure color and font of the interface" msgstr "" #: gajim/data/gui/preferences_window.ui:1682 #, fuzzy msgid "Themes" msgstr "Propriedades" #: gajim/data/gui/preferences_window.ui:1712 #, fuzzy msgid "Contact's nickname:" msgstr "Nome do Contacto" #: gajim/data/gui/preferences_window.ui:1726 #, fuzzy msgid "Contact's message:" msgstr "Mensagem de estado:" #: gajim/data/gui/preferences_window.ui:1738 #, fuzzy msgid "_Status message:" msgstr "Mensagem de estado:" #: gajim/data/gui/preferences_window.ui:1752 #, fuzzy msgid "Group chat highlight:" msgstr "Chat" #: gajim/data/gui/preferences_window.ui:1890 #, fuzzy msgid "Your nickname:" msgstr "Antes da alcunha:" #: gajim/data/gui/preferences_window.ui:1904 #, fuzzy msgid "Your message:" msgstr "Introduza a sua mensagem :" #: gajim/data/gui/preferences_window.ui:1916 msgid "_URL highlight:" msgstr "" #: gajim/data/gui/preferences_window.ui:2041 #, fuzzy msgid "_Reset to Default Colors" msgstr "Voltar às Cores Padrão" #: gajim/data/gui/preferences_window.ui:2075 #, fuzzy msgid "Chat Line Colors" msgstr "Mudanças na última versão" #: gajim/data/gui/preferences_window.ui:2095 #, fuzzy msgid "Style" msgstr "Interrompida" #: gajim/data/gui/preferences_window.ui:2128 msgid "Audio input device" msgstr "" #: gajim/data/gui/preferences_window.ui:2140 msgid "Audio output device" msgstr "" #: gajim/data/gui/preferences_window.ui:2176 #, fuzzy msgid "Audio" msgstr "Aplicações" #: gajim/data/gui/preferences_window.ui:2206 msgid "Video input device" msgstr "" #: gajim/data/gui/preferences_window.ui:2218 msgid "Video output device" msgstr "" #: gajim/data/gui/preferences_window.ui:2230 msgid "Video framerate" msgstr "" #: gajim/data/gui/preferences_window.ui:2242 msgid "Video size" msgstr "" #: gajim/data/gui/preferences_window.ui:2252 msgid "View own video source" msgstr "" #: gajim/data/gui/preferences_window.ui:2316 #, fuzzy msgid "Video" msgstr "Formato de uma linha" #: gajim/data/gui/preferences_window.ui:2346 #, fuzzy msgid "STUN server:" msgstr "Servidor:" #: gajim/data/gui/preferences_window.ui:2372 msgid "" "STUN server hostname. If none given, Gajim will try\n" "to discover one from server." msgstr "" #: gajim/data/gui/preferences_window.ui:2386 msgid "(example: stun.iptel.org)" msgstr "" #: gajim/data/gui/preferences_window.ui:2400 #, fuzzy msgid "Connection" msgstr "Sons" #: gajim/data/gui/preferences_window.ui:2485 msgid "_Mail client:" msgstr "Cliente de e_mail:" #: gajim/data/gui/preferences_window.ui:2498 msgid "_Browser:" msgstr "_Navegador:" #: gajim/data/gui/preferences_window.ui:2511 #, fuzzy msgid "_File manager:" msgstr "Gestor de ficheiros:" #. a header for custom browser/client/file manager. so translate sth like: Custom Settings #: gajim/data/gui/preferences_window.ui:2559 msgid "Custom" msgstr "Definições Personalizadas" #: gajim/data/gui/preferences_window.ui:2576 msgid "Applications" msgstr "Aplicações" #: gajim/data/gui/preferences_window.ui:2604 msgid "_Ignore events from contacts not in the roster" msgstr "_Ignorar eventos de contactos que não estão na lista" #: gajim/data/gui/preferences_window.ui:2608 #, fuzzy msgid "" "If checked, Gajim will ignore incoming events from unauthorized contacts. " "Use with caution, because it blocks all messages from any contact that is " "not in the roster" msgstr "" "Marque esta opção apenas se alguem que não está na sua lista o estiver a " "spammar/incomodar. Use com precaução, pois isto bloqueia todas as mensagens " "de qualquer contacto que não estiver na sua lista." #: gajim/data/gui/preferences_window.ui:2622 #, fuzzy msgid "Allow client / _OS information to be sent" msgstr "Permitir o envio de informações do _SO " #: gajim/data/gui/preferences_window.ui:2626 #, fuzzy msgid "" "If checked, Gajim will allow others to detect the operation system you are " "using" msgstr "Se marcado, o Gajim juntar-se-á a este chat no arranque" #: gajim/data/gui/preferences_window.ui:2640 #, fuzzy msgid "Allow local system time information to be sent" msgstr "Permitir o envio de informações do _SO " #: gajim/data/gui/preferences_window.ui:2644 #, fuzzy msgid "If checked, Gajim will allow others to detect the time on your system" msgstr "Se marcado, o Gajim juntar-se-á a este chat no arranque" #: gajim/data/gui/preferences_window.ui:2658 msgid "Log _encrypted chat session" msgstr "" #: gajim/data/gui/preferences_window.ui:2662 msgid "" "If checked, Gajim will keep logs for encrypted messages. Please note that " "when using End-to-End encryption the remote party has to agree on logging, " "else the messages will not be logged." msgstr "" #: gajim/data/gui/preferences_window.ui:2676 #, fuzzy msgid "Allow my _idle time to be sent" msgstr "Permitir o envio de informações do _SO " #: gajim/data/gui/preferences_window.ui:2695 msgid "Global proxy:" msgstr "" #: gajim/data/gui/preferences_window.ui:2724 #, fuzzy msgid "_Manage..." msgstr "Gerir..." #: gajim/data/gui/preferences_window.ui:2743 #, fuzzy msgid "Privacy" msgstr "Propriedades" #: gajim/data/gui/preferences_window.ui:2770 msgid "_Log status changes of contacts" msgstr "_Arquivar mudanças de estado dos contactos" #: gajim/data/gui/preferences_window.ui:2791 msgid "Miscellaneous" msgstr "Diversos" #: gajim/data/gui/preferences_window.ui:2810 #, fuzzy msgid "_Open..." msgstr "Abrir..." #: gajim/data/gui/preferences_window.ui:2826 msgid "Advanced Configuration Editor" msgstr "Editor de Configuração Avançada" #: gajim/data/gui/contact_context_menu.ui:12 msgid "Start _Chat" msgstr "Iniciar _Conversa" #: gajim/data/gui/contact_context_menu.ui:20 #: gajim/data/gui/systray_context_menu.ui:36 #, fuzzy msgid "Send Single _Message..." msgstr "Enviar _Mensagem Simples" #: gajim/data/gui/contact_context_menu.ui:28 #, fuzzy msgid "Send _File..." msgstr "Enviar _Ficheiro" #: gajim/data/gui/contact_context_menu.ui:44 #, fuzzy msgid "Invite _Contacts" msgstr "Contacto:" #: gajim/data/gui/contact_context_menu.ui:73 #, fuzzy msgid "E_xecute Command..." msgstr "comando" #: gajim/data/gui/contact_context_menu.ui:82 #, fuzzy msgid "M_anage Contact" msgstr "Contacto:" #: gajim/data/gui/contact_context_menu.ui:92 #, fuzzy msgid "_Rename..." msgstr "_Renomear" #: gajim/data/gui/contact_context_menu.ui:99 #, fuzzy msgid "Edit _Groups..." msgstr "Editar _Grupos" #: gajim/data/gui/contact_context_menu.ui:106 #, fuzzy msgid "Assign Open_PGP Key..." msgstr "Atribuir chave OpenPGP" #: gajim/data/gui/contact_context_menu.ui:115 #, fuzzy msgid "Add Special _Notification..." msgstr "Notificações Visuais" #: gajim/data/gui/contact_context_menu.ui:129 msgid "_Subscription" msgstr "_Subscrição" #: gajim/data/gui/contact_context_menu.ui:138 #, fuzzy msgid "_Allow contact to see my status" msgstr "Permitir que ele/ela veja o meu estado" #: gajim/data/gui/contact_context_menu.ui:146 #, fuzzy msgid "A_sk to see contact status" msgstr "Pedir para ver o estado dele/dela" #: gajim/data/gui/contact_context_menu.ui:154 #, fuzzy msgid "_Forbid contact to see my status" msgstr "Proibí-lo /-la de ver o meu estado" #: gajim/data/gui/contact_context_menu.ui:182 #, fuzzy msgid "_Unignore" msgstr "_Continuar" #: gajim/data/gui/contact_context_menu.ui:190 msgid "_Ignore" msgstr "" #: gajim/data/gui/contact_context_menu.ui:197 #: gajim/data/gui/chat_context_menu.ui:66 #, fuzzy msgid "_Add to Roster..." msgstr "_Adicionar à Lista" #: gajim/data/gui/account_creation_wizard_window.ui:43 msgid "Gajim: Account Creation Wizard" msgstr "Gajim: Criação Passo-a-passo de uma Conta" #: gajim/data/gui/account_creation_wizard_window.ui:70 msgid "" "You need to have an account in order to connect\n" "to the Jabber network." msgstr "" "Necessita de uma conta para se poder ligar\n" "à rede Jabber." #: gajim/data/gui/account_creation_wizard_window.ui:95 #, fuzzy msgid "I already have an account I want to _use" msgstr "Já tenho uma conta e quero usá-la" #: gajim/data/gui/account_creation_wizard_window.ui:112 msgid "I want to _register for a new account" msgstr "Quero _registar uma nova conta" #: gajim/data/gui/account_creation_wizard_window.ui:133 msgid "Please choose one of the options below:" msgstr "Por favor escolha uma das opções abaixo:" #: gajim/data/gui/account_creation_wizard_window.ui:167 msgid "Please fill in the data for your existing account" msgstr "Por favor preencha os dados para a sua conta existente" #: gajim/data/gui/account_creation_wizard_window.ui:187 msgid "_Jabber ID:" msgstr "_Jabber ID:" #: gajim/data/gui/account_creation_wizard_window.ui:239 #: gajim/data/gui/account_creation_wizard_window.ui:394 #, fuzzy msgid "Anon_ymous authentication" msgstr "Usar autenticação" #: gajim/data/gui/account_creation_wizard_window.ui:259 #: gajim/data/gui/manage_bookmarks_window.ui:172 msgid "_Password:" msgstr "_Senha:" #: gajim/data/gui/account_creation_wizard_window.ui:281 msgid "Save pass_word" msgstr "Guardar _senha" #: gajim/data/gui/account_creation_wizard_window.ui:285 msgid "If checked, Gajim will remember the password for this account" msgstr "Se marcado, o Gajim lembrar-se-á da senha para esta conta" #: gajim/data/gui/account_creation_wizard_window.ui:339 msgid "Please select a server" msgstr "" #: gajim/data/gui/account_creation_wizard_window.ui:358 #: gajim/data/gui/manage_bookmarks_window.ui:159 msgid "_Server:" msgstr "_Servidor:" #: gajim/data/gui/account_creation_wizard_window.ui:423 #, fuzzy msgid "Prox_y:" msgstr "Proxy:" #: gajim/data/gui/account_creation_wizard_window.ui:450 msgid "Manage..." msgstr "Gerir..." #: gajim/data/gui/account_creation_wizard_window.ui:465 msgid "Use custom hostname/port" msgstr "Usar hostname/porta personalizados" #: gajim/data/gui/account_creation_wizard_window.ui:491 #, fuzzy msgid "_Hostname:" msgstr "Nome do Host:" #: gajim/data/gui/account_creation_wizard_window.ui:517 msgid "_Port:" msgstr "_Porta:" #: gajim/data/gui/account_creation_wizard_window.ui:553 #: gajim/data/gui/account_creation_wizard_window.ui:884 msgid "_Advanced" msgstr "Avançado" #: gajim/data/gui/account_creation_wizard_window.ui:624 msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA1 fingerprint of the certificate:\n" msgstr "" #: gajim/data/gui/account_creation_wizard_window.ui:687 #, fuzzy msgid "" "Connecting to server\n" "\n" "Please wait..." msgstr "" "Conta está a ser criada\n" "\n" "Por favor, aguarde..." #: gajim/data/gui/account_creation_wizard_window.ui:772 msgid "Connect when I press Finish" msgstr "Ligar quando eu premir Concluir" #: gajim/data/gui/account_creation_wizard_window.ui:789 #, fuzzy msgid "Set my profile when I connect" msgstr "Definir uma imagem pessoal (avatar) quando me ligo" #: gajim/data/gui/account_creation_wizard_window.ui:901 msgid "_Finish" msgstr "_Terminar" #: gajim/data/gui/privacy_lists_window.ui:34 #, fuzzy msgid "Privacy Lists:" msgstr "Iniciar Conversa" #: gajim/data/gui/service_discovery_window.ui:84 msgid "_Address:" msgstr "_Endereço:" #: gajim/data/gui/service_discovery_window.ui:115 msgid "G_o" msgstr "_Ir" #: gajim/data/gui/synchronise_select_contacts_dialog.ui:8 msgid "Synchronise : select contacts" msgstr "" #: gajim/data/gui/synchronise_select_contacts_dialog.ui:67 #, fuzzy msgid "Select the contacts you want to synchronise" msgstr "JID do contacto com quem deseja conversar" #: gajim/data/gui/edit_groups_dialog.ui:8 msgid "Edit Groups" msgstr "Editar Grupos" #: gajim/data/gui/search_window.ui:42 #, fuzzy msgid "Please wait while retrieving search form..." msgstr "" "Por favor, aguarde enquanto que a migração dos seus registos de conversas é " "feita " #: gajim/data/gui/search_window.ui:80 #, fuzzy msgid "_Add contact" msgstr "Adicionar _Contacto" #: gajim/data/gui/search_window.ui:116 msgid "_Search" msgstr "_Pesquisar" #: gajim/data/gui/chat_context_menu.ui:11 msgid "_Copy Link Location" msgstr "_Copiar Localização do Link" #: gajim/data/gui/chat_context_menu.ui:19 msgid "_Open Link in Browser" msgstr "_Abrir Link no Navegador" #: gajim/data/gui/chat_context_menu.ui:27 msgid "_Copy JID/Email Address" msgstr "_Copiar JID/Endereço de Email" #: gajim/data/gui/chat_context_menu.ui:35 msgid "_Open Email Composer" msgstr "_Abrir Compositor de Email" #: gajim/data/gui/chat_context_menu.ui:49 #: gajim/data/gui/subscription_request_window.ui:12 msgid "_Start Chat" msgstr "_Iniciar Conversa" #: gajim/data/gui/chat_context_menu.ui:57 #: gajim/data/gui/account_context_menu.ui:35 #: gajim/data/gui/systray_context_menu.ui:28 msgid "Join _Group Chat" msgstr "_Entrar num Chat" #: gajim/data/gui/change_status_message_dialog.ui:131 #, fuzzy msgid "Save as Preset..." msgstr "Guardar Ficheiro como..." #: gajim/data/gui/change_status_message_dialog.ui:167 #, fuzzy msgid "Preset messages:" msgstr "mensagem de estado:" #: gajim/data/gui/change_status_message_dialog.ui:313 msgid "Type your new status message" msgstr "Escreva a sua nova mensagem de estado" #: gajim/data/gui/synchronise_select_account_dialog.ui:8 #, fuzzy msgid "Synchronise contacts" msgstr "Mostrar Contactos _Offline" #: gajim/data/gui/synchronise_select_account_dialog.ui:68 msgid "Select the account with which you want to synchronise" msgstr "" #: gajim/data/gui/archiving_313_preferences_window.ui:28 #, fuzzy msgid "Roster" msgstr "Mostrar _Lista de Contactos" #: gajim/data/gui/archiving_313_preferences_window.ui:85 #, fuzzy msgid "Preference" msgstr "Preferências" #: gajim/data/gui/archiving_313_preferences_window.ui:159 #, fuzzy msgid "Default:" msgstr "Apagar MOTD" #: gajim/data/gui/voip_call_received_dialog.ui:15 msgid "Incoming call" msgstr "" #: gajim/data/gui/add_new_contact_window.ui:29 msgid "Add New Contact" msgstr "Adicionar Novo Contacto" #: gajim/data/gui/add_new_contact_window.ui:62 #, fuzzy msgid "A_ccount:" msgstr "Conta:" #: gajim/data/gui/add_new_contact_window.ui:110 #, fuzzy msgid "_Protocol:" msgstr "Protocolo:" #: gajim/data/gui/add_new_contact_window.ui:169 #, fuzzy msgid "_User ID:" msgstr "ID do Utilizador:" #: gajim/data/gui/add_new_contact_window.ui:182 #: gajim/data/gui/manage_bookmarks_window.ui:133 msgid "_Nickname:" msgstr "_Alcunha:" #: gajim/data/gui/add_new_contact_window.ui:195 #, fuzzy msgid "_Group:" msgstr "Grupo:" #: gajim/data/gui/add_new_contact_window.ui:210 #, fuzzy msgid "Type User ID" msgstr "ID do Utilizador:" #: gajim/data/gui/add_new_contact_window.ui:223 #, fuzzy msgid "Type Nickname" msgstr "Alcunha:" #: gajim/data/gui/add_new_contact_window.ui:239 msgid "Choose a group of type a new group" msgstr "" #: gajim/data/gui/add_new_contact_window.ui:257 #, fuzzy msgid "A_llow this contact to view my status" msgstr "Permitir que ele/ela veja o meu estado" #: gajim/data/gui/add_new_contact_window.ui:300 #, fuzzy msgid "_Save subscription message" msgstr "_Subscrição" #: gajim/data/gui/add_new_contact_window.ui:325 msgid "" "You have to register with this transport\n" "to be able to add a contact from this\n" "protocol. Click on Register button to\n" "proceed." msgstr "" #: gajim/data/gui/add_new_contact_window.ui:340 #, fuzzy msgid "_Register" msgstr "Re_gistar" #: gajim/data/gui/add_new_contact_window.ui:369 msgid "" "You must be connected to the transport to be able\n" "to add a contact from this protocol." msgstr "" #: gajim/data/gui/roster_window.ui:61 #, fuzzy msgid "Change Status Message…" msgstr "_Mudar Mensagem de Estado" #: gajim/data/gui/change_mood_dialog.ui:73 #, fuzzy msgid "Mood:" msgstr "Registos" #: gajim/data/gui/change_mood_dialog.ui:85 #, fuzzy msgid "Message:" msgstr "Registos" #: gajim/data/gui/plugins_window.ui:25 gajim/data/gui/application_menu.ui:90 msgid "Plugins" msgstr "" #: gajim/data/gui/plugins_window.ui:78 msgid "Install from zip" msgstr "" #: gajim/data/gui/plugins_window.ui:109 msgid "<empty>" msgstr "" #: gajim/data/gui/plugins_window.ui:131 msgid "Version:" msgstr "" #: gajim/data/gui/plugins_window.ui:169 #, fuzzy msgid "Authors:" msgstr "_Autorizar" #: gajim/data/gui/plugins_window.ui:210 #, fuzzy msgid "Homepage:" msgstr "Página pessoal:" #: gajim/data/gui/plugins_window.ui:253 msgid "Description:" msgstr "Descrição:" #: gajim/data/gui/plugins_window.ui:301 msgid "Uninstall" msgstr "" #: gajim/data/gui/plugins_window.ui:316 #, fuzzy msgid "Configure" msgstr "_Continuar" #: gajim/data/gui/plugins_window.ui:348 #, fuzzy msgid "Installed" msgstr "Interrompida" #: gajim/data/gui/plugins_window.ui:399 msgid "" "Plug-in decription should be displayed here. This text will be erased during " "PluginsWindow initialization." msgstr "" #: gajim/data/gui/privacy_list_window.ui:18 #, fuzzy msgid "none" msgstr "Nenhum" #: gajim/data/gui/privacy_list_window.ui:21 #, fuzzy msgid "both" msgstr "Ambos" #: gajim/data/gui/privacy_list_window.ui:24 #, fuzzy msgid "from" msgstr "De" #: gajim/data/gui/privacy_list_window.ui:27 msgid "to" msgstr "" #: gajim/data/gui/privacy_list_window.ui:66 msgid "Privacy List" msgstr "" #: gajim/data/gui/privacy_list_window.ui:77 msgid "Active for this session" msgstr "" #: gajim/data/gui/privacy_list_window.ui:94 #, fuzzy msgid "Active on each startup" msgstr "_Ligar ao arranque" #: gajim/data/gui/privacy_list_window.ui:132 #, fuzzy msgid "List of rules" msgstr "Formato de uma linha" #: gajim/data/gui/privacy_list_window.ui:244 msgid "Add / Edit a rule" msgstr "" #: gajim/data/gui/privacy_list_window.ui:266 msgid "Allow" msgstr "" #: gajim/data/gui/privacy_list_window.ui:282 msgid "Deny" msgstr "Negar" #: gajim/data/gui/privacy_list_window.ui:317 #, fuzzy msgid "JabberID" msgstr "Jabber ID:" #: gajim/data/gui/privacy_list_window.ui:358 #, fuzzy msgid "all in the group" msgstr "Neste grupo" #: gajim/data/gui/privacy_list_window.ui:407 #, fuzzy msgid "all by subscription" msgstr "_Subscrição" #: gajim/data/gui/privacy_list_window.ui:456 msgid "All" msgstr "" #: gajim/data/gui/privacy_list_window.ui:493 #, fuzzy msgid "to send me messages" msgstr "Enviar mensagem" #: gajim/data/gui/privacy_list_window.ui:509 msgid "to send me queries" msgstr "" #: gajim/data/gui/privacy_list_window.ui:525 #, fuzzy msgid "to view my status" msgstr "Permitir que ele/ela veja o meu estado" #: gajim/data/gui/privacy_list_window.ui:541 #, fuzzy msgid "to send me status" msgstr "Pedir para ver o estado dele/dela" #: gajim/data/gui/privacy_list_window.ui:557 #, fuzzy msgid "All (including subscription)" msgstr "_Subscrição" #: gajim/data/gui/privacy_list_window.ui:598 #, fuzzy msgid "Order:" msgstr "Servidor:" #: gajim/data/gui/manage_sounds_window.ui:10 #, fuzzy msgid "Manage sounds" msgstr "Gerir Contas" #: gajim/data/gui/remove_account_window.ui:56 msgid "Remove account _only from Gajim" msgstr "Remover conta _apenas do Gajim" #: gajim/data/gui/remove_account_window.ui:73 msgid "Remove account from Gajim and from _server" msgstr "Remover conta do Gajim e do _servidor" #: gajim/data/gui/remove_account_window.ui:94 msgid "What do you want to do?" msgstr "O que pretende fazer?" #: gajim/data/gui/adhoc_commands_window.ui:35 #, fuzzy msgid "Please wait while retrieving command list..." msgstr "" "Por favor, aguarde enquanto que a migração dos seus registos de conversas é " "feita " #: gajim/data/gui/adhoc_commands_window.ui:93 msgid "Choose command to execute:" msgstr "" #: gajim/data/gui/adhoc_commands_window.ui:136 #: gajim/data/gui/adhoc_commands_window.ui:277 msgid "Check once more" msgstr "" #: gajim/data/gui/adhoc_commands_window.ui:194 #, fuzzy msgid "Please wait while the command is being sent..." msgstr "" "Por favor, aguarde enquanto que a migração dos seus registos de conversas é " "feita " #: gajim/data/gui/adhoc_commands_window.ui:211 msgid "Please wait..." msgstr "" #: gajim/data/gui/adhoc_commands_window.ui:257 msgid "This jabber entity does not expose any commands." msgstr "" #: gajim/data/gui/adhoc_commands_window.ui:336 msgid "An error has occurred:" msgstr "Ocorreu um erro:" #: gajim/data/gui/adhoc_commands_window.ui:465 #, fuzzy msgid "F_inish" msgstr "_Terminar" #: gajim/data/gui/account_context_menu.ui:20 #, fuzzy msgid "_Personal Events" msgstr "Detalhes Pessoais..." #: gajim/data/gui/account_context_menu.ui:49 msgid "_Add Contact..." msgstr "_Adicionar Contacto" #: gajim/data/gui/account_context_menu.ui:57 msgid "_Discover Services" msgstr "_Descobrir Recursos" #: gajim/data/gui/account_context_menu.ui:65 #, fuzzy msgid "_Execute Command..." msgstr "comando" #: gajim/data/gui/esession_info_window.ui:50 msgid "_Verify" msgstr "" #: gajim/data/gui/esession_info_window.ui:137 #, fuzzy msgid "(ESession info)" msgstr "Descrição" #: gajim/data/gui/application_menu.ui:8 #, fuzzy msgid "View" msgstr "_Voz" #: gajim/data/gui/application_menu.ui:11 #, fuzzy msgid "Show Roster" msgstr "Mostrar _Lista de Contactos" #: gajim/data/gui/application_menu.ui:16 #, fuzzy msgid "Show Offline Contacts" msgstr "Mostrar Contactos _Offline" #: gajim/data/gui/application_menu.ui:21 #, fuzzy msgid "Show Active Contacts" msgstr "Mostrar Contactos _Offline" #: gajim/data/gui/application_menu.ui:26 #, fuzzy msgid "Show Transports" msgstr "Transportes" #: gajim/data/gui/application_menu.ui:43 #, fuzzy msgid "Help" msgstr "_Ajuda" #: gajim/data/gui/application_menu.ui:46 #, fuzzy msgid "Contents" msgstr "_Conteúdo" #: gajim/data/gui/application_menu.ui:50 #, fuzzy msgid "FAQ" msgstr "_FAQ" #: gajim/data/gui/application_menu.ui:54 msgid "Keyboard Shortcuts" msgstr "" #: gajim/data/gui/application_menu.ui:58 gajim/data/gui/features_window.ui:9 #, fuzzy msgid "Features" msgstr "Recursos dos Servidores" #: gajim/data/gui/application_menu.ui:76 msgid "Start Chat" msgstr "Iniciar Conversa" #: gajim/data/gui/application_menu.ui:81 #, fuzzy msgid "Bookmarks" msgstr "Adicionar esta Sala aos _Bookmarks" #: gajim/data/gui/application_menu.ui:99 #, fuzzy msgid "Quit" msgstr "_Sair" #: gajim/data/gui/features_window.ui:26 msgid "List of possible features in Gajim:" msgstr "" #: gajim/data/gui/manage_bookmarks_window.ui:14 msgid "Manage Bookmarks" msgstr "Gerir Bookmarks" #: gajim/data/gui/manage_bookmarks_window.ui:120 #, fuzzy msgid "_Title:" msgstr "Título:" #: gajim/data/gui/manage_bookmarks_window.ui:146 msgid "Roo_m:" msgstr "" #: gajim/data/gui/manage_bookmarks_window.ui:188 #, fuzzy msgid "A_uto join" msgstr "Entrar automaticamente" #: gajim/data/gui/manage_bookmarks_window.ui:193 msgid "If checked, Gajim will join this group chat on startup" msgstr "Se marcado, o Gajim juntar-se-á a este chat no arranque" #: gajim/data/gui/manage_bookmarks_window.ui:207 msgid "Minimi_ze on Auto Join" msgstr "" #: gajim/data/gui/manage_bookmarks_window.ui:235 #, fuzzy msgid "Pr_int status:" msgstr "Mostrar hora:" #: gajim/data/gui/exception_dialog.ui:45 #, fuzzy msgid "" "A programming error has been detected. It probably is not fatal, but should " "be reported to the developers nonetheless." msgstr "" "Foi detectado um erro de programação.\n" "Provavelmente não é fatal, mesmo assim deverá ser comunicado\n" " aos programadores" #: gajim/data/gui/exception_dialog.ui:115 #, fuzzy msgid "Report Bug" msgstr "_Reportar Erro (Bug)" #: gajim/data/gui/subscription_request_window.ui:95 msgid "_Deny" msgstr "_Negar" #: gajim/data/gui/subscription_request_window.ui:100 #, fuzzy msgid "" "Deny authorization from contact so he or she cannot know when you're " "connected" msgstr "" "Recusar autorização do contacto, para que ele não possa saber quando você " "está ligado" #: gajim/data/gui/subscription_request_window.ui:133 #, fuzzy msgid "Au_thorize" msgstr "_Autorizar" #: gajim/data/gui/subscription_request_window.ui:138 #, fuzzy msgid "Authorize contact so he or she can know when you're connected" msgstr "Autorize o contacto para ele saber quando você está ligado" #: gajim/data/gui/xml_console_window.ui:121 #, fuzzy msgid "Presence" msgstr "_Presença" #: gajim/data/gui/xml_console_window.ui:134 msgid "Iq" msgstr "" #: gajim/data/gui/xml_console_window.ui:149 #, fuzzy msgid "Presets" msgstr "_Presença" #: gajim/data/gui/chat_to_muc_window.ui:24 msgid "Invite Friends!" msgstr "" #: gajim/data/gui/chat_to_muc_window.ui:39 msgid "" "You are now entering a groupchat.\n" "Select the contacts you want to invite" msgstr "" "Está neste momento a entrar numa conversa de grupo.\n" "Seleccione os contactos que quer convidar" #: gajim/data/gui/chat_to_muc_window.ui:67 #: gajim/data/gui/chat_to_muc_window.ui:78 msgid "column" msgstr "" #: gajim/data/gui/chat_to_muc_window.ui:112 msgid "Please select a MUC server." msgstr "" #: gajim/data/gui/chat_to_muc_window.ui:141 #, fuzzy msgid "MUC server" msgstr "Servidor" #: gajim/data/gui/chat_to_muc_window.ui:176 #, fuzzy msgid "In_vite" msgstr "Invisível" #: gajim/data/gui/history_manager.ui:11 msgid "_Export" msgstr "" #: gajim/data/gui/history_manager.ui:97 msgid "Gajim History Logs Manager" msgstr "" #: gajim/data/gui/history_manager.ui:154 msgid "Welcome to Gajim History Logs Manager" msgstr "" #: gajim/data/gui/history_manager.ui:168 msgid "" "This log manager is not intended for log viewing. If you are looking for " "such functionality, use the history window instead.\n" "\n" "Use this program to delete or export logs. You can select logs from the left " "and/or search database from below." msgstr "" #: gajim/data/gui/history_manager.ui:184 msgid "" "WARNING:\n" "If you plan to do massive deletions, please make sure Gajim is not running. " "Generally avoid deletions with contacts you currently chat with." msgstr "" #: gajim/data/gui/history_manager.ui:283 #, fuzzy msgid "_Search Database" msgstr "_Pesquisar" #: gajim/data/gui/shortcuts_window.ui:8 msgid "Chat Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:12 #, fuzzy msgid "Message composition" msgstr "conteúdo da mensagem" #: gajim/data/gui/shortcuts_window.ui:17 #, fuzzy msgid "Send the message" msgstr "Enviar mensagem" #: gajim/data/gui/shortcuts_window.ui:24 msgid "Create a new line" msgstr "" #: gajim/data/gui/shortcuts_window.ui:31 #, fuzzy msgid "Select an emoticon" msgstr "Usar _emoticons" #: gajim/data/gui/shortcuts_window.ui:38 msgid "Complete a command or a nick" msgstr "" #: gajim/data/gui/shortcuts_window.ui:45 #, fuzzy msgid "Previous sent message" msgstr "mensagem de estado:" #: gajim/data/gui/shortcuts_window.ui:52 #, fuzzy msgid "Next sent messages" msgstr "mensagem de estado:" #: gajim/data/gui/shortcuts_window.ui:59 #, fuzzy msgid "Quote previous message" msgstr "Ou escolha uma mensagem pré-definida:" #: gajim/data/gui/shortcuts_window.ui:66 #, fuzzy msgid "Quote next message" msgstr "Enviar mensagem" #: gajim/data/gui/shortcuts_window.ui:73 #, fuzzy msgid "Clear message entry" msgstr "Mensagem" #: gajim/data/gui/shortcuts_window.ui:81 gajim/data/gui/shortcuts_window.ui:231 msgid "Appearance" msgstr "Aparência" #: gajim/data/gui/shortcuts_window.ui:86 #, fuzzy msgid "Toggle full / compact view" msgstr "Usar sempre _vista compacta" #: gajim/data/gui/shortcuts_window.ui:94 #, fuzzy msgid "Recent history" msgstr "Histórico dos registos" #: gajim/data/gui/shortcuts_window.ui:99 msgid "Scroll up" msgstr "" #: gajim/data/gui/shortcuts_window.ui:106 msgid "Scroll down" msgstr "" #: gajim/data/gui/shortcuts_window.ui:121 msgid "Tabs" msgstr "" #: gajim/data/gui/shortcuts_window.ui:126 msgid "Switch to the previous tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:133 msgid "Switch to the next tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:140 msgid "Switch to the first - ninth tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:147 msgid "Switch to the previous unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:154 msgid "Switch to the next unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:161 msgid "Close chat" msgstr "" #: gajim/data/gui/shortcuts_window.ui:172 msgid "Roster Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:195 #, fuzzy msgid "File transfers" msgstr "Transferências de Ficheiros" #: gajim/data/gui/shortcuts_window.ui:209 #, fuzzy msgid "Join a group chat" msgstr "_Entrar num Chat" #: gajim/data/gui/shortcuts_window.ui:216 #, fuzzy msgid "Set the status message" msgstr "mensagem de estado:" #: gajim/data/gui/shortcuts_window.ui:223 #, fuzzy msgid "Quit Gajim" msgstr "Gajim" #: gajim/data/gui/shortcuts_window.ui:236 #, fuzzy msgid "Show offline contacts" msgstr "Mostrar Contactos _Offline" #: gajim/data/gui/shortcuts_window.ui:243 #, fuzzy msgid "Show only active contacts" msgstr "Mostrar Contactos _Offline" #: gajim/data/gui/shortcuts_window.ui:250 msgid "Enable roster filtering" msgstr "" #: gajim/data/gui/shortcuts_window.ui:258 #, fuzzy msgid "Contacts" msgstr "Contacto:" #: gajim/data/gui/shortcuts_window.ui:263 #, fuzzy msgid "Contact information" msgstr "Informações do Contacto" #: gajim/data/gui/shortcuts_window.ui:270 #, fuzzy msgid "Rename contact" msgstr "Contacto:" #: gajim/data/gui/shortcuts_window.ui:277 #, fuzzy msgid "Delete contact" msgstr "Contacto:" #: gajim/data/gui/passphrase_dialog.ui:8 msgid "Passphrase" msgstr "Frase de acesso" #: gajim/data/gui/history_window.ui:38 #, fuzzy msgid "Enter name / JID of contact or groupchat" msgstr "Nome do Contacto" #: gajim/data/gui/history_window.ui:51 #, fuzzy msgid "Search:" msgstr "_Pesquisar" #: gajim/data/gui/history_window.ui:75 msgid "_In date search" msgstr "" #: gajim/data/gui/history_window.ui:79 msgid "Only searching within selected day" msgstr "" #: gajim/data/gui/history_window.ui:306 #, fuzzy msgid "_Show status changes" msgstr "_Arquivar mudanças de estado dos contactos" #: gajim/data/gui/manage_pep_services_window.ui:13 #, fuzzy msgid "PEP Service Configuration" msgstr "Configuração da Sala" #: gajim/data/gui/manage_pep_services_window.ui:69 #, fuzzy msgid "_Configure" msgstr "_Continuar" #: gajim/data/gui/groups_post_window.ui:9 msgid "Create new post" msgstr "" #: gajim/data/gui/groups_post_window.ui:29 #: gajim/data/gui/single_message_window.ui:46 msgid "From:" msgstr "De:" #: gajim/data/gui/groups_post_window.ui:41 #: gajim/data/gui/single_message_window.ui:70 msgid "Subject:" msgstr "Assunto:" #: gajim/data/gui/data_form_window.ui:19 #, fuzzy msgid "Fill in the form." msgstr "Neste grupo" #: gajim/data/gui/data_form_window.ui:274 msgid "Room Configuration" msgstr "Configuração da Sala" #: gajim/data/gui/roster_item_exchange_window.ui:8 msgid "Roster Item Exchange" msgstr "" #: gajim/data/gui/systray_context_menu.ui:12 msgid "Sta_tus" msgstr "Es_tado" #: gajim/data/gui/systray_context_menu.ui:20 #, fuzzy msgid "_Start Chat..." msgstr "_Iniciar Conversa" #: gajim/data/gui/systray_context_menu.ui:50 msgid "Show All Pending _Events" msgstr "Mostrar Todos os _Eventos Pedentes" #: gajim/data/gui/systray_context_menu.ui:59 #, fuzzy msgid "Mute Sounds" msgstr "Sons Wav" #: gajim/data/gui/systray_context_menu.ui:75 #, fuzzy msgid "_Preferences" msgstr "Preferências" #: gajim/data/gui/systray_context_menu.ui:90 #, fuzzy msgid "_Quit" msgstr "_Sair" #: gajim/data/gui/single_message_window.ui:59 msgid "To:" msgstr "Para:" #: gajim/data/gui/single_message_window.ui:118 msgid "0" msgstr "0" #: gajim/data/gui/single_message_window.ui:210 msgid "Sen_d" msgstr "_Enviar" #: gajim/data/gui/single_message_window.ui:216 msgid "Send message" msgstr "Enviar mensagem" #: gajim/data/gui/single_message_window.ui:229 msgid "_Reply" msgstr "_Responder" #: gajim/data/gui/single_message_window.ui:235 msgid "Reply to this message" msgstr "Responder a esta mensagem" #: gajim/data/gui/single_message_window.ui:248 msgid "_Send & Close" msgstr "E_nviar & Fechar" #: gajim/data/gui/single_message_window.ui:254 msgid "Send message and close window" msgstr "Enviar mensagem e fechar a janela" #: gajim/data/gui/change_activity_dialog.ui:8 msgid "Set Activity" msgstr "" #: gajim/data/gui/change_activity_dialog.ui:65 msgid "Set an activity" msgstr "" #: gajim/data/gui/change_activity_dialog.ui:337 #, fuzzy msgid "Message: " msgstr "Configurar Mensagens de Estado" #: gajim/command_system/mapping.py:164 gajim/command_system/mapping.py:174 #: gajim/command_system/mapping.py:194 #, fuzzy msgid "Missing arguments" msgstr "Argumento em falta \"contacto_jid\"" #: gajim/command_system/mapping.py:261 #, fuzzy msgid "Too many arguments" msgstr "Argumento em falta \"contacto_jid\"" #: gajim/command_system/implementation/execute.py:53 msgid "Execute expression inside a shell, show output" msgstr "" #: gajim/command_system/implementation/execute.py:109 msgid "Execute expression inside a shell, send output" msgstr "" #: gajim/command_system/implementation/standard.py:45 msgid "" "Show help on a given command or a list of available commands if -a is given" msgstr "" #: gajim/command_system/implementation/standard.py:72 msgid "Send a message to the contact" msgstr "Enviar uma mensagem ao contacto" #: gajim/command_system/implementation/standard.py:77 msgid "Send action (in the third person) to the current chat" msgstr "" #: gajim/command_system/implementation/standard.py:82 msgid "Show logged messages which mention given text" msgstr "" #: gajim/command_system/implementation/standard.py:87 #, fuzzy, python-format msgid "%s: Nothing found" msgstr "%s não encontrado" #: gajim/command_system/implementation/standard.py:93 msgid "Limit must be an integer" msgstr "" #: gajim/command_system/implementation/standard.py:117 msgid "" "\n" " Set the current status\n" "\n" " Status can be given as one of the following values:\n" " online, away, chat, xa, dnd.\n" " " msgstr "" #: gajim/command_system/implementation/standard.py:135 msgid "Set the current status to away" msgstr "" #: gajim/command_system/implementation/standard.py:149 msgid "Set the current status to online" msgstr "" #: gajim/command_system/implementation/standard.py:152 #, fuzzy msgid "Available" msgstr "Indisponível" #: gajim/command_system/implementation/standard.py:172 #: gajim/command_system/implementation/standard.py:249 msgid "Clear the text window" msgstr "Limpar a janela de texto" #: gajim/command_system/implementation/standard.py:177 #: gajim/command_system/implementation/standard.py:389 #, fuzzy msgid "Send a ping to the contact" msgstr "Uso: /%s, muda a janela de chat para o modo compacto." #: gajim/command_system/implementation/standard.py:180 #: gajim/command_system/implementation/standard.py:392 msgid "Command is not supported for zeroconf accounts" msgstr "" #: gajim/command_system/implementation/standard.py:184 msgid "Send DTMF sequence through an open audio session" msgstr "" #: gajim/command_system/implementation/standard.py:187 #, fuzzy msgid "No open audio sessions with the contact" msgstr "Clique para ver conversas anteriores com este contacto" #: gajim/command_system/implementation/standard.py:190 #, python-format msgid "%s is not a valid tone" msgstr "" #: gajim/command_system/implementation/standard.py:197 msgid "Toggle audio session" msgstr "" #: gajim/command_system/implementation/standard.py:200 #, fuzzy msgid "Audio sessions are not available" msgstr "Sessão bus não está disponível" #: gajim/command_system/implementation/standard.py:207 msgid "Toggle video session" msgstr "" #: gajim/command_system/implementation/standard.py:210 #, fuzzy msgid "Video sessions are not available" msgstr "Sessão bus não está disponível" #: gajim/command_system/implementation/standard.py:217 msgid "Send a message to the contact that will attract his (her) attention" msgstr "" #: gajim/command_system/implementation/standard.py:256 #, fuzzy msgid "Change your nickname in a group chat" msgstr "Muda Alcu_nha" #: gajim/command_system/implementation/standard.py:266 msgid "Open a private chat window with a specified occupant" msgstr "Abrir uma janela de conversação privada com um ocupante específico" #: gajim/command_system/implementation/standard.py:272 #: gajim/command_system/implementation/standard.py:281 #: gajim/command_system/implementation/standard.py:327 #: gajim/command_system/implementation/standard.py:339 #: gajim/command_system/implementation/standard.py:351 msgid "Nickname not found" msgstr "Alcunha não encontrada" #: gajim/command_system/implementation/standard.py:275 msgid "" "Open a private chat window with a specified occupant and send him a message" msgstr "" "Abrir uma janela de conversação privada com um ocupante específico e enviar-" "lhe uma mensagem" #: gajim/command_system/implementation/standard.py:284 #, fuzzy msgid "Display or change a group chat topic" msgstr "Perguntar antes de fechar uma janela/aba de chat." #: gajim/command_system/implementation/standard.py:292 msgid "Invite a user to a room for a reason" msgstr "" #: gajim/command_system/implementation/standard.py:295 #, fuzzy, python-format msgid "Invited %(jid)s to %(room_jid)s" msgstr "%(contact_jid)s foi convidado(a) para %(room_jid)s." #: gajim/command_system/implementation/standard.py:299 #, fuzzy msgid "Join a group chat given by a jid" msgstr "_Entrar num Chat" #: gajim/command_system/implementation/standard.py:307 msgid "" "Leave the groupchat, optionally giving a reason, and close tab or window" msgstr "" #: gajim/command_system/implementation/standard.py:312 msgid "" "\n" " Ban user by a nick or a jid from a groupchat\n" "\n" " If given nickname is not found it will be treated as a jid.\n" " " msgstr "" #: gajim/command_system/implementation/standard.py:324 #, fuzzy msgid "Kick user by a nick from a groupchat" msgstr "Está banido/a desta sala." #: gajim/command_system/implementation/standard.py:332 msgid "" "Set occupant role in group chat.\n" " Role can be given as one of the following values:\n" " moderator, participant, visitor, none" msgstr "" #: gajim/command_system/implementation/standard.py:337 #, fuzzy msgid "Invalid role given" msgstr "Nome de utilizador inválido" #: gajim/command_system/implementation/standard.py:344 msgid "" "Set occupant affiliation in group chat.\n" " Affiliation can be given as one of the following values:\n" " owner, admin, member, outcast, none" msgstr "" #: gajim/command_system/implementation/standard.py:349 #, fuzzy msgid "Invalid affiliation given" msgstr "Filiação: " #: gajim/command_system/implementation/standard.py:357 msgid "Display names of all group chat occupants" msgstr "Mostrar nomes de todos os ocupantes da conversa de grupo" #: gajim/command_system/implementation/standard.py:379 msgid "Forbid an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/standard.py:384 msgid "Allow an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/middleware.py:72 msgid "Error during command execution!" msgstr "" #: gajim/command_system/implementation/custom.py:106 msgid "The same as using a doc-string, except it supports translation" msgstr "" #: gajim/plugins/pluginmanager.py:611 gajim/plugins/pluginmanager.py:617 msgid "Archive corrupted" msgstr "" #: gajim/plugins/pluginmanager.py:613 #, fuzzy msgid "Archive empty" msgstr "Localização do ficheiro" #: gajim/plugins/pluginmanager.py:625 gajim/plugins/pluginmanager.py:633 #: gajim/plugins/gui.py:264 msgid "Archive is malformed" msgstr "" #: gajim/plugins/pluginmanager.py:641 gajim/plugins/gui.py:288 #: gajim/plugins/gui.py:296 #, fuzzy msgid "Plugin already exists" msgstr "Este ficheiro já existe" #: gajim/plugins/gui.py:84 msgid "Plugin" msgstr "" #: gajim/plugins/gui.py:156 #, fuzzy, python-format msgid "Warning: %s" msgstr "Banindo %s" #: gajim/plugins/gui.py:213 #, fuzzy msgid "Plugin failed" msgstr "Publicação vCard falhou" #: gajim/plugins/gui.py:256 msgid "Unable to properly remove the plugin" msgstr "" #: gajim/plugins/gui.py:288 msgid "Overwrite?" msgstr "" #: gajim/plugins/gui.py:320 #, fuzzy msgid "Configuration" msgstr "Configuração da Sala" #: data/org.gajim.Gajim.desktop.in:5 msgid "Jabber IM Client" msgstr "Cliente de IM Jabber" #: data/org.gajim.Gajim.desktop.in:6 data/org.gajim.Gajim.appdata.xml.in:10 msgid "A GTK+ Jabber client" msgstr "Cliente Jabber GTK+" #: data/org.gajim.Gajim.desktop.in:8 msgid "chat;messaging;im;xmpp;bonjour;voip;" msgstr "" #: data/org.gajim.Gajim.desktop.in:12 msgid "org.gajim.Gajim" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:12 msgid "" "Gajim is a chat client to be used with Jabber.org, Live Journal Talk, " "Nimbuzz, Ovi, Talkonaut, and thousands of other services run by companies " "and ISPs, and volunteers around the world." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:16 msgid "" "If you have a few accounts on different servers, if you want to be in " "contact with your friends and family all the time, then Gajim is for you." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:19 #, fuzzy msgid "Features:" msgstr "Recursos dos Servidores" #: data/org.gajim.Gajim.appdata.xml.in:21 msgid "Tabbed chat window and single window modes" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:22 msgid "" "Group chat support (with Multi-User Chat protocol), invitation, chat to " "group chat transformation" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:23 msgid "Emoticons, avatars, PEP (user activity, mood and tune)" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:24 msgid "Audio / video conferences" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:25 #, fuzzy msgid "File transfer, room bookmarks" msgstr "Erro na Transferência de Ficheiro" #: data/org.gajim.Gajim.appdata.xml.in:26 msgid "Metacontacts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:27 msgid "Trayicon, speller, extended chat history functionalities" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:28 msgid "TLS, GPG and End-To-End encryption support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:29 msgid "Transport registration support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:30 #, fuzzy msgid "Service discovery including nodes, user search" msgstr "Buscar Serviço usando conta %s" #: data/org.gajim.Gajim.appdata.xml.in:31 msgid "Wikipedia, dictionary and search engine lookup" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:32 msgid "Multiple accounts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:33 #, fuzzy msgid "XML console interface" msgstr "Consola XML" #: data/org.gajim.Gajim.appdata.xml.in:34 msgid "Link local (bonjour / zeroconf), BOSH" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:35 msgid "Other features via plugins" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:47 #, fuzzy msgid "Roster, list of contacts" msgstr "_Arquivar mudanças de estado dos contactos" #: data/org.gajim.Gajim.appdata.xml.in:51 msgid "Tabbed chat window" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:55 #, fuzzy msgid "Group chat support" msgstr "Chat" #: data/org.gajim.Gajim.appdata.xml.in:59 #, fuzzy msgid "Chat history" msgstr "Histórico dos registos" #: data/org.gajim.Gajim.appdata.xml.in:63 #, fuzzy msgid "Plugin manager" msgstr "Publicação vCard falhou" #, fuzzy #~ msgid "" #~ "Install /\n" #~ "Upgrade" #~ msgstr "Interrompida" #, fuzzy #~ msgid "Install/Upgrade" #~ msgstr "Interrompida" #, fuzzy #~ msgid "Install and Upgrade Plugins" #~ msgstr "Interrompida" #, fuzzy #~ msgid "Plugins updates" #~ msgstr "Publicação vCard falhou" #~ msgid "Shows or hides the roster window" #~ msgstr "Mostra ou esconde a janela principal" #, fuzzy #~ msgid "Shows or hides the ipython window" #~ msgstr "Mostra ou esconde a janela principal" #, fuzzy #~ msgid "XMPP account %s" #~ msgstr "para conta %s" #, fuzzy #~ msgid "Exception" #~ msgstr "Descrição" #, fuzzy #~ msgid "" #~ "someone@somewhere.com would like you to add some contacts " #~ "in your roster." #~ msgstr "Gostaria de o adicionar à minha lista de contactos." #~ msgid "_Actions" #~ msgstr "_Acções" #, fuzzy #~ msgid "Start Chat..." #~ msgstr "_Iniciar Conversa" #, fuzzy #~ msgid "You are already in group chat %s" #~ msgstr "Já está na sala %s" #~ msgid "Join Group Chat with account %s" #~ msgstr "Entrar num Chat com a conta %s" #, fuzzy #~ msgid "Invalid Account" #~ msgstr "Nome de conta inválido" #, fuzzy #~ msgid "" #~ "You have to choose an account from which you want to join the groupchat." #~ msgstr "" #~ "Tem de criar uma conta antes de poder conversar com outros contactos." #, fuzzy #~ msgid "The group chat JID contains invalid characters." #~ msgstr "Alcunha não encontrada: %s" #~ msgid "Start Chat with account %s" #~ msgstr "Iniciar conversa com a conta %s" #, fuzzy #~ msgid "" #~ "Fill in the nickname or the JID of the contact you would like\n" #~ "to send a chat message to:" #~ msgstr "" #~ "Introduza o ID do contacto a quem gostaria\n" #~ "de enviar uma mensagem instantânea:" #, fuzzy #~ msgid "Nickname / JID" #~ msgstr "Jabber ID Inválido" #, fuzzy #~ msgid "Unable to parse \"%s\"." #~ msgstr "Impossível escrever ficheiro em %s" #~ msgid "Shows the chat dialog so that you can send messages to a contact" #~ msgstr "" #~ "Mostra uma caixa de conversa para que possa enviar mensagens a um contacto" #~ msgid "JID of the contact that you want to chat with" #~ msgstr "JID do contacto com quem deseja conversar" #~ msgid "Adds contact to roster" #~ msgstr "Adiciona o contacto à lista" #, fuzzy #~ msgid "Adds new contact to this account" #~ msgstr "Adiciona um novo contacto nesta conta." #, fuzzy #~ msgid "Starts chat, using this account" #~ msgstr "Iniciar conversa com a conta %s" #, fuzzy #~ msgid "Message content" #~ msgstr "conteúdo da mensagem" #, fuzzy #~ msgid "Join a MUC room" #~ msgstr "_Juntar-se a uma Nova Sala" #, fuzzy #~ msgid "Room JID" #~ msgstr "Sala:" #, fuzzy #~ msgid "Nickname to use" #~ msgstr "Alcunha não encontrada: %s" #, fuzzy #~ msgid "Password to enter the room" #~ msgstr "As senhas não conferem" #, fuzzy #~ msgid "Wrong URI" #~ msgstr "Frase de acesso" #~ msgid "Nickname:" #~ msgstr "Alcunha:" #~ msgid "Server:" #~ msgstr "Servidor:" #~ msgid "Password:" #~ msgstr "Senha:" #, fuzzy #~ msgid "Join this room _automatically when I connect" #~ msgstr "Definir uma imagem pessoal (avatar) quando me ligo" #, fuzzy #~ msgid "Bro_wse Rooms" #~ msgstr "_Explorar" #, fuzzy #~ msgid "Network-Watcher" #~ msgstr "_Histórico" #, fuzzy #~ msgid "Requires gnome-network-manager" #~ msgstr "_Histórico" #, fuzzy #~ msgid "Feature not available, see Help->Features" #~ msgstr "A mensagem de estado auto-indisponível" #, fuzzy #~ msgid "Send files" #~ msgstr "Enviar Ficheiro" #, fuzzy #~ msgid "This contact does not support file transfer." #~ msgstr "" #~ "Uma lista de transferências de ficheiros activas, completas e paradas" #, fuzzy #~ msgid "Hides the buttons in chat windows." #~ msgstr "Perguntar antes de fechar uma janela/aba de chat." #, fuzzy #~ msgid "Change your nickname (Ctrl+N)" #~ msgstr "Muda Alcu_nha" #, fuzzy #~ msgid "Bookmark this room (Ctrl+B)" #~ msgstr "Adicionar esta Sala aos _Bookmarks" #, fuzzy #~ msgid "Show advanced functions (Alt+D)" #~ msgstr "Clique para inserir um emoticon (Alt+E)" #, fuzzy #~ msgid "Add this contact to roster (Ctrl+D)" #~ msgstr "Adiciona o contacto à lista" #, fuzzy #~ msgid "Invite contacts to the conversation (Ctrl+G)" #~ msgstr "está a prestar atenção à conversa" #, fuzzy #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Adiciona o contacto à lista" #, fuzzy #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Adiciona o contacto à lista" #, fuzzy #~ msgid "Ma_ke message windows compact" #~ msgstr "Enviar mensagem e fechar a janela" #, fuzzy #~ msgid "Hide all buttons in chat windows" #~ msgstr "Perguntar antes de fechar uma janela/aba de chat." #~ msgid "Hide the chat buttons" #~ msgstr "Ocultar os botões da conversa" #~ msgid "" #~ "If True, Gajim will ask for avatar each contact that did not have an " #~ "avatar last time or has one cached that is too old." #~ msgstr "" #~ "Se Verdadeiro (True), Gajim perguntará por um avatar a cada contacto que " #~ "não tinha um da última vez ou tenha um na memória cache há demasiado " #~ "tempo." #, fuzzy #~ msgid "?CLI:room" #~ msgstr "De" #, fuzzy #~ msgid "?CLI:nick" #~ msgstr "_Expulsar" #, fuzzy #~ msgid "?CLI:password" #~ msgstr "Senha:" #, fuzzy #~ msgid "Use D-Bus and Notification-Daemon to show notifications" #~ msgstr "Usar DBus e Notification-Daemon para mostrar notificações" #, fuzzy #~ msgid "Notification" #~ msgstr "Modificação da Conta" #, fuzzy #~ msgid "Ignore" #~ msgstr "_Continuar" #, fuzzy #~ msgid "_Open Gmail Inbox" #~ msgstr "_Abrir Compositor de Email" #, fuzzy #~ msgid "" #~ "If checked, Gajim will also include information about the sender of new " #~ "emails" #~ msgstr "" #~ "Se marcado, Gajim exibirá imagens pessoais (avatars) dos seus contactos " #~ "na lista" #, fuzzy #~ msgid "GMail Options" #~ msgstr "Aplicações" #, fuzzy #~ msgid "20" #~ msgstr "0" #, fuzzy #~ msgid "Invited %s to %s" #~ msgstr "Enviar %s" #, fuzzy #~ msgid "GMail Email Received" #~ msgstr "Convite Recebido" #, fuzzy #~ msgid "You have %d new e-mail conversation" #~ msgid_plural "You have %d new e-mail conversations" #~ msgstr[0] "Tem mensagens não lidas" #~ msgstr[1] "Tem mensagens não lidas" #~ msgid "Re_name" #~ msgstr "Re_nomear" #, fuzzy #~ msgid "Resour_ce:" #~ msgstr "Re_curso: " #~ msgid "" #~ "Resource is sent to the Jabber server in order to separate the same JID " #~ "in two or more parts depending on the number of the clients connected in " #~ "the same server with the same account. So you might be connected in the " #~ "same account with resource 'Home' and 'Work' at the same time. The " #~ "resource which has the highest priority will get the events. (see below)" #~ msgstr "" #~ "O recurso é enviado ao servidor jabber para separar o mesmo JID em duas " #~ "ou mais partes dependentemente do número de clientes ligados ao mesmo " #~ "servidor com as mesma conta. Por exemplo, pode estar ligado à mesma conta " #~ "com os recursos 'Casa' e 'Trabalho' ao mesmo tempo. O recurso com a maior " #~ "prioridade receberá os eventos. (ver em baixo)" #, fuzzy #~ msgid "Anonymous authentication" #~ msgstr "Usar autenticação" #~ msgid "" #~ "Priority is used in Jabber to determine who gets the events from the " #~ "jabber server when two or more clients are connected using the same " #~ "account; The client with the highest priority gets the events" #~ msgstr "" #~ "A prioridade é usada no Jabber para determinar quem recebe os eventos do " #~ "servidor jabber quando dois ou mais clientes estão ligados usando a mesma " #~ "conta; O cliente com a maior prioridade receberá os eventos" #, fuzzy #~ msgid "Synchronize contacts" #~ msgstr "Mostrar Contactos _Offline" #~ msgid "Chan_ge Password" #~ msgstr "Mu_dar Senha" #~ msgid "Click to change account's password" #~ msgstr "Clique para mudar a senha da conta" #, fuzzy #~ msgid "Administration operations" #~ msgstr "_Administrador" #, fuzzy #~ msgid "Browse..." #~ msgstr "_Explorar" #, fuzzy #~ msgid "Certificate is e_ncrypted" #~ msgstr "[Esta mensagem é encriptada]" #~ msgid "" #~ "If checked, Gajim, when launched, will automatically connect to jabber " #~ "using this account" #~ msgstr "" #~ "Se marcado, o Gajim, quando iniciado, ligar-se-á automaticamente ao " #~ "jabber usando esta conta" #, fuzzy #~ msgid "Synchronize logs with server" #~ msgstr "Mostrar Contactos _Offline" #~ msgid "Synch_ronize account status with global status" #~ msgstr "Sinc_ronizar estado da conta com estado global" #~ msgid "" #~ "If checked, any change to the global status (handled by the combobox at " #~ "the bottom of the roster window) will change the status of this account " #~ "accordingly" #~ msgstr "" #~ "Se marcado, qualquer mudança feita ao estado global (gerido pelo combobox " #~ "no fundo da lista de contactos) alterará também o estado desta conta" #, fuzzy #~ msgid "Proxy" #~ msgstr "Registos" #, fuzzy #~ msgid "Send _keep-alive packets" #~ msgstr "Enviar pacotes keep-alive" #, fuzzy #~ msgid "" #~ "If checked, Gajim will send keep-alive packets to prevent connection " #~ "timeout which results in disconnection" #~ msgstr "" #~ "Se marcado, o Gajim enviará pacotes keep-alive para evitar timeouts da " #~ "ligação, os quais resultam na perda dessa ligação" #, fuzzy #~ msgid "Use cust_om hostname/port" #~ msgstr "Usar hostname/porta personalizados" #, fuzzy #~ msgid "_Hostname: " #~ msgstr "Nome do Host:" #, fuzzy #~ msgid "_Port: " #~ msgstr "_Porta:" #~ msgid "No key selected" #~ msgstr "Nenhuma chave seleccionada" #~ msgid "Choose _Key..." #~ msgstr "_Escolha chave..." #, fuzzy #~ msgid "" #~ "If checked, Gajim will get the password from a GPG agent like seahorse" #~ msgstr "Se marcado, o Gajim lembrar-se-á da senha para esta conta" #~ msgid "OpenPGP" #~ msgstr "OpenPGP" #, fuzzy #~ msgid "_Edit Personal Information..." #~ msgstr "Editar Detalhes Pessoais..." #~ msgid "Information about you, as stored in the server" #~ msgstr "Informações sobre si, tal como estão gravadas no servidor" #~ msgid "Personal Information" #~ msgstr "Detalhes Pessoais" #, fuzzy #~ msgid "Co_nnect on Gajim startup" #~ msgstr "_Ligar ao arranque" #, fuzzy #~ msgid "Synchroni_ze account status with global status" #~ msgstr "Sinc_ronizar estado da conta com estado global" #, fuzzy #~ msgid "Use cust_om port:" #~ msgstr "Usar hostname/porta personalizados" #, fuzzy #~ msgid "Mer_ge accounts" #~ msgstr "_Fundir contas" #, fuzzy #~ msgid "OpenPGP is not usable on this computer" #~ msgstr "Não é possível usar OpenPGP neste computador" #~ msgid "To change the account name, you must be disconnected." #~ msgstr "Para mudar o nome da conta, deve estar disconectado." #, fuzzy #~ msgid "To change the account name, you must read all pending events." #~ msgstr "Para mudar o nome da conta, deve estar disconectado." #, fuzzy #~ msgid "Account Name Already Used" #~ msgstr "Nome de conta em uso" #~ msgid "Invalid account name" #~ msgstr "Nome de conta inválido" #~ msgid "Account name cannot be empty." #~ msgstr "Nome da conta não pode ser vazio" #~ msgid "Account name cannot contain spaces." #~ msgstr "Nome da conta não pode conter espaços" #, fuzzy #~ msgid "Enter a new name for account %s" #~ msgstr "Introduza a chave GPG para a conta %s" #, fuzzy #~ msgid "A JID must be in the form \"user@servername\"." #~ msgstr "Um Jabber ID deve estar no formato \"utilizador@nomedoservidor\"." #~ msgid "No such account available" #~ msgstr "Tal conta não está disponível" #~ msgid "" #~ "You must create your account before editing your personal information." #~ msgstr "Deve primeiro criar sua conta antes de editar suas informações" #~ msgid "Without a connection, you can not edit your personal information." #~ msgstr "" #~ "Sem ligação, não lhe é possível editar as suas informações pessoais." #, fuzzy #~ msgid "Your server can't save your personal information." #~ msgstr "Deve primeiro criar sua conta antes de editar suas informações" #, fuzzy #~ msgid "Account Local already exists." #~ msgstr "Nome de conta em uso" #~ msgid "Could not write to %s. Session Management support will not work" #~ msgstr "Impossível escrever para %s. Session Management não será suportado" #~ msgid "Jabber Traffic" #~ msgstr "Tráfego Jabber" #, fuzzy #~ msgid "_Enable" #~ msgstr "Activar" #, fuzzy #~ msgid "Filter" #~ msgstr "Registos" #~ msgid "_IQ" #~ msgstr "_IC" #~ msgid "Info/Query" #~ msgstr "Info/Consulta" #~ msgid "_Message" #~ msgstr "_Mensagem" #~ msgid "XML Input" #~ msgstr "Entrada XML" #~ msgid "XML Console for %s" #~ msgstr "Consola XML para %s" #, fuzzy #~ msgid "Idle for:" #~ msgstr "Consola XML para %s" #, fuzzy #~ msgid "Last status: %s" #~ msgstr "Iconset de _estados padrão:" #, fuzzy #~ msgid " since %s" #~ msgstr "Versão %s" #, fuzzy #~ msgid "since %s" #~ msgstr "Versão %s" #, fuzzy #~ msgid "No" #~ msgstr "Nenhum" #, fuzzy #~ msgid "Prefer" #~ msgstr "Preferências" #, fuzzy #~ msgid "Auto" #~ msgstr "Entrar automaticamente" #, fuzzy #~ msgid "otr" #~ msgstr "_Host:" #, fuzzy #~ msgid "Invalid expire value" #~ msgstr "Nome de utilizador inválido" #~ msgid "How many minutes should last lines from previous conversation last." #~ msgstr "" #~ "Número de minutos que as últimas linhas da conversa anterior devem durar." #~ msgid "You will be connected to %s without OpenPGP." #~ msgstr "O utilizador será ligado a %s sem OpenPGP." #, fuzzy #~ msgid "The following message was NOT encrypted" #~ msgstr "[Esta mensagem é encriptada]" #, fuzzy #~ msgid "Encryption used for this contact." #~ msgstr "Não é possível usar OpenPGP neste computador" #~ msgid "Toggle Open_PGP Encryption" #~ msgstr "Activar/Desactivar Encriptação Open_PGP" #, fuzzy #~ msgid "Toggle End to End Encryption" #~ msgstr "Activar/Desactivar Encriptação Open_PGP" #, fuzzy #~ msgid "OpenPGP encryption enabled" #~ msgstr "Encriptação activada" #, fuzzy #~ msgid "OpenPGP encryption disabled" #~ msgstr "Encriptação desactivada" #, fuzzy #~ msgid "The following message was encrypted" #~ msgstr "[Esta mensagem é encriptada]" #, fuzzy #~ msgid "Toggle the OpenPGP encryption" #~ msgstr "Activar/Desactivar Encriptação Open_PGP" #, fuzzy #~ msgid "[This message is *encrypted* (See :XEP:`27`]" #~ msgstr "[Esta mensagem é encriptada]" #, fuzzy #~ msgid "Database cannot be read." #~ msgstr "Nome da conta não pode ser vazio" #, fuzzy #~ msgid "Smooth scroll message in conversation window" #~ msgstr "Enviar mensagem e fechar a janela" #~ msgid "Show _XML Console" #~ msgstr "Mostrar Consola _XML" #, fuzzy #~ msgid "Edit _Privacy Lists..." #~ msgstr "Iniciar Conversa" #~ msgid "_Administrator" #~ msgstr "_Administrador" #, fuzzy #~ msgid "Sends a message to users currently connected to this server" #~ msgstr "" #~ "Envia uma mensagem aos utilizadores ligados ao servidor neste momento" #~ msgid "Sets Message of the Day" #~ msgstr "Define a Mensagem do Dia" #~ msgid "Updates Message of the Day" #~ msgstr "Actualiza a Mensagem do Dia" #~ msgid "Deletes Message of the Day" #~ msgstr "Apaga a Mensagem do Dia" #, fuzzy #~ msgid "Add _Contact..." #~ msgstr "_Adicionar Contacto" #, fuzzy #~ msgid "_Accounts" #~ msgstr "Contas" #, fuzzy #~ msgid "Profile, A_vatar" #~ msgstr "Perfil, Avatar" #~ msgid "File _Transfers" #~ msgstr "_Transferências de Ficheiros" #~ msgid "Help online" #~ msgstr "Ajuda online" #~ msgid "Frequently Asked Questions (online)" #~ msgstr "Questões Perguntadas Frequentemente (FAQ) (online)" #, fuzzy #~ msgid "Fea_tures" #~ msgstr "Recursos dos Servidores" #~ msgid "to %s account" #~ msgstr "para conta %s" #~ msgid "using %s account" #~ msgstr "usando conta %s" #, fuzzy #~ msgid "of account %s" #~ msgstr "para conta %s" #~ msgid "for account %s" #~ msgstr "para conta %s" #, fuzzy #~ msgid "" #~ "By removing this contact you also remove authorization resulting in him " #~ "or her always seeing you as offline." #~ msgstr "" #~ "Ao remover este contacto, também remove a autorização. O contacto vê-lo-á " #~ "sempre como offline." #~ msgid "Invalid Jabber ID" #~ msgstr "Jabber ID Inválido" #~ msgid "This file is being used by another process." #~ msgstr "Este ficheiro está a ser usado por outro processo." #~ msgid "pgp key" #~ msgstr "chave pgp" #, fuzzy #~ msgid "" #~ "Sends new single message to a contact in the roster. Both OpenPGP key and " #~ "account are optional. If you want to set only 'account', without 'OpenPGP " #~ "key', just set 'OpenPGP key' to ''." #~ msgstr "" #~ "Envia uma nova mensagem a um contacto da lista. Ambas a chave OpenPGP e a " #~ "conta são opcionais. Se quiser definir apenas 'conta', sem 'chave " #~ "OpenPGP', basta definir 'chave OpenPGP' para ''." #, fuzzy #~ msgid "Please first choose another theme as your current theme." #~ msgstr "Por favor, escolha primeiro outro para o seu tema actual." #~ msgid "Your passphrase is incorrect" #~ msgstr "A sua chave de acesso está incorrecta" #, fuzzy #~ msgid "OpenPGP Passphrase Incorrect" #~ msgstr "A sua chave de acesso está incorrecta" #~ msgid "You successfully received %(filename)s from %(name)s." #~ msgstr "Recebeu com sucesso %(filename)s de %(name)s." #, fuzzy #~ msgid "Set logs directory" #~ msgstr "a criar directório %s" #, fuzzy #~ msgid "Chats" #~ msgstr "Conversa" #, fuzzy #~ msgid "_Manage Bookmarks..." #~ msgstr "Gerir Bookmarks..." #~ msgid "Change Status Message..." #~ msgstr "Mudar Mensagem de Estado..." #~ msgid "_Change Status Message..." #~ msgstr "_Mudar Mensagem de Estado..." #~ msgid "" #~ "You are not interested in the contact's presence, and neither he/she is " #~ "interested in yours" #~ msgstr "" #~ "Não está interessado na presença do contacto, nem ele/ela está na sua" #, fuzzy #~ msgid "Error description..." #~ msgstr "Descrição" #, fuzzy #~ msgid "View contact information (Ctrl+I)" #~ msgstr "está a prestar atenção à conversa" #, fuzzy #~ msgid "Groupchat Histories" #~ msgstr "Chat" #, fuzzy #~ msgid "All Chat Histories" #~ msgstr "Estado: " #~ msgid "More" #~ msgstr "Mais" #~ msgid "creating %s directory" #~ msgstr "a criar directório %s" #, fuzzy #~ msgid "%s is not the name of a group chat." #~ msgstr "Perguntar antes de fechar uma janela/aba de chat." #, fuzzy #~ msgid "Session Management" #~ msgstr "Mensagem" #, fuzzy #~ msgid "Gajim needs X server to run. Quiting..." #~ msgstr "Gajim necesita do Xserver para ser executado. Saindo..." #, fuzzy #~ msgid "Gajim needs PyGTK 2.22 or above" #~ msgstr "Gajim necessita do PyGTK versão 2.6 ou acima" #, fuzzy #~ msgid "Gajim needs PyGTK 2.22 or above to run. Quiting..." #~ msgstr "" #~ "Gajim necessita do PyGTK versão 2.6 ou acima para ser executado. Saindo..." #, fuzzy #~ msgid "Gajim needs GTK 2.22 or above" #~ msgstr "Gajim necessita do GTK versão 2.6 ou acima" #, fuzzy #~ msgid "Gajim needs GTK 2.22 or above to run. Quiting..." #~ msgstr "" #~ "Gajim necessita do GTK versão 2.6 ou acima para ser executado. Saindo..." #, fuzzy #~ msgid "Gajim needs pywin32 to run" #~ msgstr "Gajim necessita do PySQLite2 para ser executado" #~ msgid "A programming error has been detected" #~ msgstr "Um erro de programação foi detectado" #~ msgid "Details" #~ msgstr "Detalhes" #, fuzzy #~ msgid "Jabber ID: " #~ msgstr "Jabber ID:" #~ msgid "Resource: " #~ msgstr "Recurso: " #~ msgid "Subscription: " #~ msgstr "Subscrição:" #, fuzzy #~ msgid "Mood: " #~ msgstr "Sala:" #, fuzzy #~ msgid "Activity: " #~ msgstr "Activo" #~ msgid "Join _Group Chat..." #~ msgstr "_Entrar num Chat..." #, fuzzy #~ msgid "_Modify Account" #~ msgstr "_Modificar Conta..." #~ msgid "_Group Chat" #~ msgstr "C_hat" #, fuzzy #~ msgid "" #~ "If True, Gajim will check if it's the default jabber client on each " #~ "startup." #~ msgstr "Se Verdadeiro (True), Gajim registará para xmpp:// a cada arranque." #, fuzzy #~ msgid "Gajim is not the default Jabber client" #~ msgstr "Gajim - Um cliente Jabber GTK+" #, fuzzy #~ msgid "Would you like to make Gajim the default Jabber client?" #~ msgstr "Deseja sobre-escrevê-lo?" #, fuzzy #~ msgid "Send Single Message" #~ msgstr "E_nviar Mensagem Simples" #, fuzzy #~ msgid "Actions" #~ msgstr "Aplicações" #, fuzzy #~ msgid "Conditions" #~ msgstr "Sons" #, fuzzy #~ msgid "Advanced Actions" #~ msgstr "Acções A_vançadas" #, fuzzy #~ msgid "Advanced Notifications Control" #~ msgstr "Editor de Configuração Avançada" #, fuzzy #~ msgid "Busy " #~ msgstr "Ocupado" #, fuzzy #~ msgid "Contact Change Status " #~ msgstr "Contacto Saiu" #, fuzzy #~ msgid "Contact Disconnected " #~ msgstr "Contacto Entrou" #, fuzzy #~ msgid "File Transfer Started " #~ msgstr "Transferência de Ficheiro Parada" #, fuzzy #~ msgid "Group Chat Message Received " #~ msgstr "Nova Mensagem" #, fuzzy #~ msgid "Launch a command" #~ msgstr "comando" #, fuzzy #~ msgid "Online / Free For Chat" #~ msgstr "Livre para conversar" #, fuzzy #~ msgid "Play a sound" #~ msgstr "Tocar _Sons" #, fuzzy #~ msgid "_Disable auto opening chat window" #~ msgstr "Perguntar antes de fechar uma janela/aba de chat." #, fuzzy #~ msgid "_Open chat window with user" #~ msgstr "Usar uma única janela de conversa com _abas" #, fuzzy #~ msgid "_Show event in roster" #~ msgstr "Mostrar apenas na _lista" #, fuzzy #~ msgid "contact(s)" #~ msgstr "Contacto:" #, fuzzy #~ msgid "for " #~ msgstr "Porta:" #, fuzzy #~ msgid "group(s)" #~ msgstr "Grupo" #, fuzzy #~ msgid "_Allow him/her to see my status" #~ msgstr "Permitir que ele/ela veja o meu estado" #, fuzzy #~ msgid "Descrition:" #~ msgstr "Descrição: %s" #, fuzzy #~ msgid "Advanced..." #~ msgstr "Avançado" #, fuzzy #~ msgid "Display _activity of contacts in roster" #~ msgstr "Exibir imagens pessoais (avatars) dos contactos na lista" #, fuzzy #~ msgid "Display _tunes of contacts in roster" #~ msgstr "Exibir imagens pessoais (avatars) dos contactos na lista" #, fuzzy #~ msgid "Display m_ood of contacts in roster" #~ msgstr "Exibir imagens pessoais (avatars) dos contactos na lista" #, fuzzy #~ msgid "" #~ "If checked, Gajim will display the activity of contacts in the roster " #~ "window" #~ msgstr "" #~ "Se marcado, Gajim exibirá imagens pessoais (avatars) dos seus contactos " #~ "na lista" #, fuzzy #~ msgid "" #~ "If checked, Gajim will display the tunes of contacts in the roster window" #~ msgstr "" #~ "Se marcado, Gajim exibirá imagens pessoais (avatars) dos seus contactos " #~ "na lista" #, fuzzy #~ msgid "User avatar:" #~ msgstr "_Escolher Avatar" #, fuzzy #~ msgid "German" #~ msgstr "Geral" #, fuzzy #~ msgid "Greek" #~ msgstr "green" #, fuzzy #~ msgid "Croatian" #~ msgstr "Morada" #, fuzzy #~ msgid "Italian" #~ msgstr "Itálico" #, fuzzy #~ msgid "Polish" #~ msgstr "_Publicar" #, fuzzy #~ msgid "Serbian" #~ msgstr "Geral" #~ msgid "Check your connection or try again later" #~ msgstr "Verifique a sua ligação ou tente novamente mais tarde" #~ msgid "error: cannot open %s for reading" #~ msgstr "erro: impossível abrir %s para leitura" #, fuzzy #~ msgid "Unable to bind to port %s." #~ msgstr "Impossível entrar na sala" #~ msgid "A GTK+ jabber client" #~ msgstr "Um cliente Jabber GTK+" #, fuzzy #~ msgid "Condition" #~ msgstr "Ligação" #, fuzzy #~ msgid "one of: offline, online, chat, away, xa, dnd, invisible " #~ msgstr "" #~ "um de: offline, disponível, livre para conversar, ausente, indisponível, " #~ "ocupado, invisível" #, fuzzy #~ msgid "" #~ "Returns current status message(the global one unless account is specified)" #~ msgstr "" #~ "Indica o estado actual (o estado global, a não ser que uma conta seja " #~ "especificada)." #, fuzzy #~ msgid "" #~ "Usage: %s %s %s \n" #~ "\t %s" #~ msgstr "" #~ "Uso: %s %s %s \n" #~ "\t" #, fuzzy #~ msgid "" #~ "Too many arguments. \n" #~ "Type \"%s help %s\" for more info" #~ msgstr "" #~ "Argumento \"%s\" não está especificado. \n" #~ "Escreva \"%s help %s\" para mais informações" #, fuzzy #~ msgid "" #~ "Argument \"%s\" is not specified. \n" #~ "Type \"%s help %s\" for more info" #~ msgstr "" #~ "Argumento \"%s\" não está especificado. \n" #~ "Escreva \"%s help %s\" para mais informações" #, fuzzy #~ msgid "Subject: %s" #~ msgstr "Assunto: %s\n" #, fuzzy #~ msgid "Mood: %s" #~ msgstr "Sala:" #, fuzzy #~ msgid "Activity: %s" #~ msgstr "Activo" #, fuzzy #~ msgid "_Show event in systray" #~ msgstr "Mostrar apenas na _lista" #, fuzzy #~ msgid "Autodetect on every Gajim startup" #~ msgstr "_Ligar ao arranque" #, fuzzy #~ msgid "Show systray:" #~ msgstr "Mostrar apenas na _lista" #, fuzzy #~ msgid "Nickname not allowed: %s" #~ msgstr "Alcunha não encontrada: %s" #~ msgid "we are now subscribed to %s" #~ msgstr "estamos agora subscritos a %s" #~ msgid "we are now unsubscribed from %s" #~ msgstr "já não estamos subscritos a %s" #~ msgid "Account Modification" #~ msgstr "Modificação da Conta" #~ msgid "" #~ "Check this so Gajim will connect in port 5223 where legacy servers are " #~ "expected to have SSL capabilities. Note that Gajim uses TLS encryption by " #~ "default if broadcasted by the server, and with this option enabled TLS " #~ "will be disabled" #~ msgstr "" #~ "Marque esta opção se quiser que o Gajim se ligue usando a porta 5223, " #~ "onde se espera que servidores específicos possuem capacidades SSL. Note " #~ "que o Gajim usa encriptação TLS por defeito se emitida pelo servidor, e " #~ "que com esta opção marcada o TLS será desactivado." #~ msgid "Edit Personal Information..." #~ msgstr "Editar Detalhes Pessoais..." #~ msgid "Hostname: " #~ msgstr "Nome do Host:" #~ msgid "" #~ "If checked, Gajim will store the password in ~/.gajim/config with 'read' " #~ "permission only for you" #~ msgstr "" #~ "Se marcado, o Gajim guardará a sua senha em ~/.gajim/config com permissão " #~ "de 'leitura' apenas para si" #~ msgid "Port: " #~ msgstr "Porta:" #~ msgid "Save _passphrase (insecure)" #~ msgstr "Guardar _frase de acesso (inseguro)" #~ msgid "Use _SSL (legacy)" #~ msgstr "Usar _SSL (específica)" #, fuzzy #~ msgid "" #~ "Account row\n" #~ "Group row\n" #~ "Contact row\n" #~ "Chat Banner" #~ msgstr "" #~ "Count\n" #~ "Grupo\n" #~ "Contacto\n" #~ "Banner" #, fuzzy #~ msgid "gtk-delete" #~ msgstr "Apagar MOTD" #~ msgid "" #~ "All chat states\n" #~ "Composing only\n" #~ "Disabled" #~ msgstr "" #~ "Todos os estados da conversa\n" #~ "Apenas compondo uma mensagem\n" #~ "Desactivado" #, fuzzy #~ msgid "" #~ "Autodetect on every Gajim startup\n" #~ "Always use GNOME default applications\n" #~ "Always use KDE default applications\n" #~ "Always use Xfce default applications\n" #~ "Custom" #~ msgstr "" #~ "Auto-detectar a cada arranque da aplicação\n" #~ "Usar sempre aplicações GNOME padrão\n" #~ "Usar sempre aplicações KDE padrão\n" #~ "Personalizar" #, fuzzy #~ msgid "gtk-cancel" #~ msgstr "Apagar MOTD" #~ msgid "GTK+ runtime is missing libglade support" #~ msgstr "Falta suporte libglade para o runtime GTK+" #~ msgid "" #~ "Please remove your current GTK+ runtime and install the latest stable " #~ "version from %s" #~ msgstr "" #~ "Por favor remova o seu runtime GTK+ actual e instale a última versão " #~ "estável de %s" #, fuzzy #~ msgid "" #~ "Please make sure that GTK+ and PyGTK have libglade support in your system." #~ msgstr "" #~ "Por favor, certifique-se de que o GTK e o PyGTK têm suporte libglade no " #~ "seu sistema." #~ msgid "Gajim needs PySQLite2 to run" #~ msgstr "Gajim necessita do PySQLite2 para ser executado" #, fuzzy #~ msgid "_Incoming message:" #~ msgstr "Mensagem recebida:" #, fuzzy #~ msgid "_Outgoing message:" #~ msgstr "Mensagem a enviar:" #~ msgid "OpenPGP passphrase was not given" #~ msgstr "Palavra-chave do OpenPGP não foi recebida" #~ msgid "" #~ "To continue sending and receiving messages, you will need to reconnect." #~ msgstr "" #~ "Para continuar a enviar e receber mensagens, precisará de se reconectar." #~ msgid "%i days ago" #~ msgstr "Há %i dias atrás" #, fuzzy #~ msgid "Add Special _Notification" #~ msgstr "Notificações Visuais" #~ msgid "Assign Open_PGP Key" #~ msgstr "Atribuir chave OpenPGP" #~ msgid "Commands: %s" #~ msgstr "Comandos: %s" #, fuzzy #~ msgid "" #~ "Usage: /%(command)s , sends action to the current group chat. Use " #~ "third person. (e.g. /%(command)s explodes.)" #~ msgstr "" #~ "Uso: /%s , envia uma acção para a sala actual. Utilize a terceira " #~ "pessoa. (Por exemplo, /%s explode.)" #~ msgid "No help info for /%s" #~ msgstr "Não há informações de ajuda para /%s" #~ msgid "Nickname not found: %s" #~ msgstr "Alcunha não encontrada: %s" #, fuzzy #~ msgid "" #~ "Usage: /%s [reason], bans the JID from the group chat. The " #~ "nickname of an occupant may be substituted, but not if it contains \"@\". " #~ "If the JID is currently in the group chat, he/she/it will also be kicked." #~ msgstr "" #~ "Uso: /%s [razão], bane o JID da sala. A alcunha de um " #~ "ocupante pode ser substituida, mas não se conter \"@\". Se o JID estiver " #~ "neste momento na sala, este será também expulso. Não suporta espaços numa " #~ "alcunha." #~ msgid "" #~ "Usage: /%s [reason], closes the current window or tab, displaying reason " #~ "if specified." #~ msgstr "" #~ "Uso: /%s [razão], fecha a janela ou aba actual, exibindo a razão se " #~ "especificada." #, fuzzy #~ msgid "" #~ "Usage: /%s [reason], invites JID to the current group chat, " #~ "optionally providing a reason." #~ msgstr "" #~ "Uso: /%s [razão], convida o JID para a sala actual, fornecendo " #~ "opcionalmente uma razão." #~ msgid "" #~ "Usage: /%s @[/nickname], offers to join room@server " #~ "optionally using specified nickname." #~ msgstr "" #~ "Uso: /%s @[/alcunha], convida a juntar-se a " #~ "sala@servidor, usando opcionalmente uma alcunha especificada." #, fuzzy #~ msgid "" #~ "Usage: /%s [reason], removes the occupant specified by " #~ "nickname from the group chat and optionally displays a reason." #~ msgstr "" #~ "Uso: /%s [razão], remove o ocupante especificado pela alcunha " #~ "da sala e opcionalmente exibe uma razão. Não suporta espaços na alcunha." #, fuzzy #~ msgid "" #~ "Usage: /%s [message], opens a private message window and sends " #~ "message to the occupant specified by nickname." #~ msgstr "" #~ "Uso: /%s [mensagem], abre uma janela de mensagem privada e " #~ "envia uma mensagem ao ocupante da sala especificado pela alcunha." #, fuzzy #~ msgid "Usage: /%s , changes your nickname in current group chat." #~ msgstr "Uso: /%s , muda a sua alcunha na sala actual." #, fuzzy #~ msgid "" #~ "Usage: /%s [topic], displays or updates the current group chat topic." #~ msgstr "Uso: /%s [tópico], exibe ou actualiza o tópico da sala actual." #~ msgid "" #~ "Usage: /%s , sends a message without looking for other commands." #~ msgstr "" #~ "Uso: /%s , envia uma mensagem sem procurar por outros comandos." #, fuzzy #~ msgid "" #~ "Usage: /%s , allow to send you messages and private " #~ "messages." #~ msgstr "Uso: /%s , muda a sua alcunha na sala actual." #~ msgid "Click to see features (like MSN, ICQ transports) of jabber servers" #~ msgstr "" #~ "Clique para ver os serviços (tais como transportes MSN e ICQ) dos " #~ "servidores jabber" #~ msgid "Name:" #~ msgstr "Nome:" #~ msgid "_Host:" #~ msgstr "_Host:" #, fuzzy #~ msgid "Show _roster" #~ msgstr "Mostrar _Lista de Contactos" #, fuzzy #~ msgid "Modify Account" #~ msgstr "_Modificar Conta..." #, fuzzy #~ msgid "Gajim account %s" #~ msgstr "para conta %s" #, fuzzy #~ msgid "This account is already configured in Gajim." #~ msgstr "Este contacto já se encontra na sua lista de contactos." #, fuzzy #~ msgid "File transfer stopped by the contact at the other end" #~ msgstr "Transferência de ficheiro parada pelo contacto na outra ponta" #, fuzzy #~ msgid "Generic" #~ msgstr "Geral" #, fuzzy #~ msgid "Activity" #~ msgstr "Activo" #, fuzzy #~ msgid "%s has not broadcast an OpenPGP key, nor has one been assigned" #~ msgstr "%s não emitiu uma chave OpenPGP nem você associou uma" #, fuzzy #~ msgid "No such command: /%s (if you want to send this, prefix it with /say)" #~ msgstr "" #~ "Comando inexistente: /%s (se desejar enviar isto, escreva primeiro /say)" #, fuzzy #~ msgid "" #~ "Usage: /%s , sends action to the current group chat. Use third " #~ "person. (e.g. /%s explodes.)" #~ msgstr "" #~ "Uso: /%s , envia uma acção para a sala actual. Utilize a terceira " #~ "pessoa. (Por exemplo, /%s explode.)" #~ msgid "Please fill in the data for your new account" #~ msgstr "Por favor preencha os dados para a sua nova conta" #, fuzzy #~ msgid "_Retype Password:" #~ msgstr "_Senha:" #~ msgid "" #~ "If you have 2 or more accounts and it is checked, Gajim will list all " #~ "contacts as if you had one account" #~ msgstr "" #~ "Se tem duas ou mais contas e esta opção for marcada, o Gajim listará " #~ "todos os contactos como se tivesse apenas uma conta" #~ msgid "_Compact View Alt+C" #~ msgstr "Vista _Compacta Alt+C" #~ msgid "Click to see past conversation in this room" #~ msgstr "Clique para ver conversas anteriores nesta sala" #~ msgid "Build custom query" #~ msgstr "Build custom query" #~ msgid "Query Builder..." #~ msgstr "Query Builder..." #~ msgid "Invitation Received" #~ msgstr "Convite Recebido" #~ msgid "Format of a line" #~ msgstr "Formato de uma linha" #~ msgid "Interface Customization" #~ msgstr "Personalização da Interface" #, fuzzy #~ msgid "A_fter nickname:" #~ msgstr "Depois da alcunha:" #~ msgid "Also known as iChat style" #~ msgstr "Conhecido também como estilo iChat" #~ msgid "Chat" #~ msgstr "Conversa" #, fuzzy #~ msgid "E_very 5 minutes" #~ msgstr "De 5 em 5 _minutos" #, fuzzy #~ msgid "" #~ "Gajim will automatically show new events by poping up the relative window" #~ msgstr "" #~ "Gajim exibirá automaticamente a nova mensagem recebida numa nova janela " #~ "de conversa ou numa aba numa janela existente" #, fuzzy #~ msgid "" #~ "Gajim will notify you for new events via a popup in the bottom right of " #~ "the screen" #~ msgstr "" #~ "Gajim o notificará a cada nova mensagem através de um popup no canto " #~ "inferior direito do ecrã" #~ msgid "" #~ "Gajim will notify you via a popup window in the bottom right of the " #~ "screen about contacts that just signed in" #~ msgstr "" #~ "Gajim o notificará através de um popup no canto inferior direito do ecrã " #~ "sobre os contactos que se ligarem" #, fuzzy #~ msgid "" #~ "Gajim will only change the icon of the contact that triggered the new " #~ "event" #~ msgstr "Gajim mudará apenas o ícone do contacto que enviou a nova mensagem" #~ msgid "" #~ "If checked, Gajim will remember the roster and chat window positions in " #~ "the screen and the sizes of them next time you run it" #~ msgstr "" #~ "Se marcado, o Gajim lembrar-se-á da posição da janela principal na " #~ "próxima vez que for executado" #, fuzzy #~ msgid "Outgoing Chat state noti_fications:" #~ msgstr "Noti_ficação do estado da conversa:" #~ msgid "Print time:" #~ msgstr "Mostrar hora:" #~ msgid "Save _position and size for roster and chat windows" #~ msgstr "" #~ "Guardar _posição e tamanho das janelas de conversa e lista de contactos" #~ msgid "The auto away status message" #~ msgstr "A mensagem de estado auto-ausente" #, fuzzy #~ msgid "" #~ "When a new event (message, file transfer request etc..) is received, the " #~ "following methods may be used to inform you about it. Please note that " #~ "events about new messages only occur if it is a new message from a " #~ "contact you are not already chatting with" #~ msgstr "" #~ "Quando um novo evento (mensagem, pedido de transferência de ficheiro, " #~ "etc...) é recebido, os métodos seguintes poderão ser usados para o " #~ "informar. NOTA: Eventos de nova mensagem recebida só ocorrem se for uma " #~ "nova mensagem de um contacto com quem ainda não estiver a conversar." #, fuzzy #~ msgid "_Advanced Notifications Control..." #~ msgstr "Editor de Configuração Avançada" #, fuzzy #~ msgid "_After time:" #~ msgstr "Depois da hora:" #, fuzzy #~ msgid "_Before time:" #~ msgstr "Antes da hora:" #~ msgid "_Player:" #~ msgstr "_Tocador de som:" #~ msgid "Address" #~ msgstr "Endereço" #~ msgid "City:" #~ msgstr "Cidade:" #~ msgid "Company:" #~ msgstr "Empresa:" #~ msgid "Given:" #~ msgstr "Nome Dado:" #~ msgid "Middle:" #~ msgstr "Nome do meio:" #~ msgid "Position:" #~ msgstr "Cargo:" #~ msgid "Prefix:" #~ msgstr "Prefixo:" #~ msgid "Role:" #~ msgstr "Função:" #~ msgid "State:" #~ msgstr "Estado:" #~ msgid "Suffix:" #~ msgstr "Sufixo:" #~ msgid "_Retrieve" #~ msgstr "_Recuperar" #~ msgid "_Remove from Roster" #~ msgstr "_Remover da Lista" #~ msgid "A_ccounts" #~ msgstr "_Contas" #~ msgid "_Filter:" #~ msgstr "_Filtro:" #~ msgid "Ask:" #~ msgstr "Perguntar:" #~ msgid "Client:" #~ msgstr "Cliente:" #~ msgid "OS:" #~ msgstr "SO:" #~ msgid "" #~ "If that is not your language for which you want to highlight misspelled " #~ "words, then please set your $LANG as appropriate. Eg. for French do " #~ "export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to " #~ "make it global in /etc/profile.\n" #~ "\n" #~ "Highlighting misspelled words feature will not be used" #~ msgstr "" #~ "Se esta não for a língua para a qual quer destacar palavras mal " #~ "soletradas, ajuste, por favor, o seu $LANG como apropriado. Por " #~ "exemplo, para o francês, faça 'export LANG=fr_FR' ou 'export LANG=fr_FR." #~ "UTF-8' em ~/.bash_profile ou, para o fazer globalmente, em /etc/profile.\n" #~ "\n" #~ "A função de destaque de palavras mal soletradas não será usada" #~ msgid "Every %s _minutes" #~ msgstr "Todos os %s _minutos" #~ msgid "You must enter a password for the new account." #~ msgstr "Deve indicar uma palavra-passe à qual a nova conta será associada" #~ msgid "You will always see him or her as offline." #~ msgstr "Vê-lo-á sempre como estando offline." #~ msgid "%s is now %s (%s)" #~ msgstr "%s está agora %s (%s)" #, fuzzy #~ msgid "Network Manager support not available" #~ msgstr "Uma ligação não está disponível" #~ msgid "Session Management support not available (missing gnome.ui module)" #~ msgstr "Session Management não é suportado (módulo gnome.ui em falta)" #, fuzzy #~ msgid "Private Chat" #~ msgstr "Iniciar Conversa" #~ msgid "Group Chat" #~ msgstr "Chat" #~ msgid "%s is now %s" #~ msgstr "%s está agora %s" #~ msgid "%s does not appear to be a valid JID" #~ msgstr "%s não parece ser um JID válido" #, fuzzy #~ msgid "%s - Gajim" #~ msgstr "Gajim" #~ msgid "Without a connection, you can not get your contact information." #~ msgstr "" #~ "É necessária uma ligação para receber as suas informações de contacto." #, fuzzy #~ msgid "_New group chat" #~ msgstr "Chat" #~ msgid "_Log on" #~ msgstr "_Ligar" #~ msgid "Log _off" #~ msgstr "_Desligar" #~ msgid "Save passphrase" #~ msgstr "Guardar frase de acesso" #, fuzzy #~ msgid "Drop %s in group %s" #~ msgstr "De %s na sala %s" #, fuzzy #~ msgid "Affiliation:" #~ msgstr "Filiação: " #, fuzzy #~ msgid "Hides the buttons in two persons chat window." #~ msgstr "Perguntar antes de fechar uma janela/aba de chat." #~ msgid "Connected to server %s:%s with %s" #~ msgstr "Ligado ao servidor %s:%s com %s" #~ msgid "invisible" #~ msgstr "Invisível" #~ msgid "offline" #~ msgstr "offline" #~ msgid "I'm %s" #~ msgstr "Estou %s" #, fuzzy #~ msgid " %d unread single message" #~ msgid_plural " %d unread single messages" #~ msgstr[0] "Gajim - %d mensagem não lida" #~ msgstr[1] "Gajim - %d mensagens não lidas" #, fuzzy #~ msgid " %d unread group chat message" #~ msgid_plural " %d unread group chat messages" #~ msgstr[0] "Gajim - %d mensagem de chat não lida" #~ msgstr[1] "Gajim - %d mensagens de chat não lidas" #, fuzzy #~ msgid " %d unread private message" #~ msgid_plural " %d unread private messages" #~ msgstr[0] "Gajim - %d mensagem privada não lida" #~ msgstr[1] "Gajim - %d mensagens privadas não lidas" #, fuzzy #~ msgid "Connection to host could not be established" #~ msgstr "Ligação ao peer não pode ser estabelecida." #, fuzzy #~ msgid "_New room" #~ msgstr "Nova Sala" #~ msgid "Role: " #~ msgstr "Função: " #~ msgid "" #~ "Sound to play when any MUC message arrives. (This setting is taken into " #~ "account only if notify_on_all_muc_messages is True)" #~ msgstr "" #~ "Som a tocar quando uma mensagem de chat chegar. (Apenas aplicável se " #~ "notify_on_all_muc_messages estiver definido como Verdadeiro)" #, fuzzy #~ msgid "Away " #~ msgstr "Ausente" #, fuzzy #~ msgid "Down" #~ msgstr "Download" #, fuzzy #~ msgid "List of special notifications settings" #~ msgstr "Notificações Visuais" #, fuzzy #~ msgid "Not Available " #~ msgstr "Indisponível" #~ msgid "Contact _Info" #~ msgstr "_Infos do Contacto" #~ msgid "Jabber" #~ msgstr "Jabber" #, fuzzy #~ msgid "Invalid room or server name" #~ msgstr "Nome de utilizador inválido" #~ msgid "Your personal information has been published successfully." #~ msgstr "As suas informações pessoais foram publicadas com sucesso." #~ msgid "Migrating Logs..." #~ msgstr "Fazendo a 'migração' dos logs..." #~ msgid "Gajim - %d unread message" #~ msgid_plural "Gajim - %d unread messages" #~ msgstr[0] "Gajim - %d mensagem não lida" #~ msgstr[1] "Gajim - %d mensagens não lidas" #, fuzzy #~ msgid "Since %s" #~ msgstr "Tamanho: %s" #~ msgid "Automatically authorize contact" #~ msgstr "Autorizar automaticamente contacto" #~ msgid "_Join New Room..." #~ msgstr "_Juntar-se a uma Nova Sala..." #, fuzzy #~ msgid "Please modify your special notification below" #~ msgstr "Por favor escolha uma das opções abaixo:" #~ msgid "Delete Message of the Day" #~ msgstr "Apagar Mensagem do Dia" #, fuzzy #~ msgid "I want to listen to:" #~ msgstr "%s quer enviar-lhe um ficheiro:" #~ msgid "Send _New Message..." #~ msgstr "Enviar _Nova Mensagem..." #~ msgid "Set Message of the Day" #~ msgstr "Definir a Mensagem do Dia" #~ msgid "Update Message of the Day" #~ msgstr "Actualizar Mensagem do Dia" #~ msgid "_XML Console..." #~ msgstr "Consola _XML..." #~ msgid "Use compact view when you open a chat window" #~ msgstr "Usar vista compacta quando uma janela de conversa é aberta" #~ msgid "Use compact view when you open a group chat window" #~ msgstr "Usar vista compacta quando uma janela de chat é aberta" #~ msgid "%s has sent you a new message." #~ msgstr "%s enviou-lhe uma nova mensagem." #~ msgid "Logs have been successfully migrated to the database." #~ msgstr "A migração dos registos de conversas (logs) deu-se com sucesso." #, fuzzy #~ msgid "Start Chat with Contact" #~ msgstr "Iniciar conversa com a conta %s" #~ msgid "All contacts in this group are offline or have errors" #~ msgstr "Todos os contactos deste grupo estão offline ou têm erros" #~ msgid "Sound" #~ msgstr "Som" #~ msgid "Image" #~ msgstr "Imagem" #~ msgid "To %s" #~ msgstr "Para %s" #~ msgid "You have been invited to the %(room_jid)s room by %(contact_jid)s" #~ msgstr "Foi convidado para a sala %(room_jid)s por %(contact_jid)s" #~ msgid "_Set Image..." #~ msgstr "_Definir Imagem" #~ msgid "Switch to %s" #~ msgstr "Mudar para %s" #~ msgid "using account " #~ msgstr "usando conta " #~ msgid "The filesize of image \"%s\" is too large" #~ msgstr "O tamanho da imagem \"%s\" é muito grande" #~ msgid "The file must not be more than 32 kilobytes." #~ msgstr "O tamanho do ficheiro não deve exceder os 32 kilobytes." #~ msgid "Timeout" #~ msgstr "Timeout" #~ msgid "account: " #~ msgstr "conta: " #~ msgid "If you close this window, you will be disconnected from these rooms." #~ msgstr "Se fechar esta janela, perder-se-á a ligação a estas salas." #~ msgid "Activate/Disable notification for when a file transfer is complete" #~ msgstr "" #~ "Activar/Desactivar notificação para quando uma transferência de ficheiro " #~ "estiver completa" #~ msgid "Removing selected file transfer" #~ msgstr "Removendo transferência de ficheiro seleccionada" #~ msgid "Stoping selected file transfer" #~ msgstr "Parando a transferência de ficheiro seleccionada" #~ msgid "" #~ "If you close this tab and you have history disabled, the message will be " #~ "lost." #~ msgstr "" #~ "Se fechar esta aba e o histórico estiver desactivado, a mensagem será " #~ "perdida." #~ msgid "Cannot remove last group" #~ msgstr "Não é possível remover o último grupo" #~ msgid "At least one contact group must be present." #~ msgstr "Ao menos um grupo do contacto deve estar presente." #~ msgid "" #~ "pysqlite2 (aka python-pysqlite2) dependency is missing. After you install " #~ "pysqlite3, if you want to migrate your logs to the new database, please " #~ "read: http://trac.gajim.org/wiki/MigrateLogToDot9DB Exiting..." #~ msgstr "" #~ "Dependência pysqlite2 (aka python-pysqlite2) em falta. Depois de instalar " #~ "pysqlite3, se quiser migrar os seus logs para a nova base de dados, por " #~ "favor, leia: http://trac.gajim.org/wiki/MigrateLogToDot9DB . Saindo..." #~ msgid "" #~ "Image for emoticon has to be less than or equal to 24 pixels in width and " #~ "24 in height." #~ msgstr "" #~ "Imagem para emoticon tem de ser menor ou igual a 24 pixels em largura e " #~ "24 em altura." #~ msgid "Check for new _version on Gajim startup" #~ msgstr "Procurar por uma nova versão ao arranque" #~ msgid "New version of Gajim available" #~ msgstr "Uma nova versão do Gajim está disponível" #~ msgid "Open Download Page" #~ msgstr "Abrir Página para Download" #, fuzzy #~ msgid "with account " #~ msgstr "conta: " #~ msgid "Chat with" #~ msgstr "Conversa com" #~ msgid "as %s" #~ msgstr "como %s" #~ msgid "as " #~ msgstr "como " #, fuzzy #~ msgid "Send _New Message" #~ msgstr "_Nova Mensagem" #~ msgid "Re_quest Authorization from" #~ msgstr "Pedir Autorização de" #~ msgid "Send Authorization to" #~ msgstr "Enviar Autorização para" #~ msgid "Log presences in _contact's log file" #~ msgstr "Registar as presenças no ficheiro de log do _contacto" #~ msgid "Log presences in an _external file" #~ msgstr "Registar as presenças num ficheiro _externo" #, fuzzy #~ msgid "" #~ "You can set advanced account options by pressing Advanced button,or later " #~ "by clicking in Accounts menuitem under Edit menu from the main window." #~ msgstr "" #~ "Conta foi adicionada com sucesso.\n" #~ "Pode configurar opções avançadas em \"Editar->Contas\" na janela " #~ "principal. " #~ msgid "" #~ "When a new message is received which is not from a contact already in a " #~ "chat window, the three following actions may happen in order for you to " #~ "be informed about it" #~ msgstr "" #~ "Quando uma nova mensagem - cujo remetente não está já numa janela de " #~ "conversa - é recebida, as três seguintes acções podem ocorrer para o " #~ "informar" #~ msgid "_Earliest" #~ msgstr "_Primeiro" #~ msgid "_Latest" #~ msgstr "Ú_ltimo" #~ msgid "%s is now %s: %s" #~ msgstr "%s está agora %s: %s" #~ msgid "" #~ "\n" #~ "\n" #~ "\n" #~ "== Original Message ==\n" #~ "%s" #~ msgstr "" #~ "\n" #~ "\n" #~ "\n" #~ "== Mensagem Original ==\n" #~ "%s" #, fuzzy #~ msgid "" #~ "Your new account has been created successfully.\n" #~ "You can set advanced account options by pressing Advanced button,\n" #~ "or later by clicking in Accounts menuitem under Edit menu from the main " #~ "window." #~ msgstr "" #~ "Conta foi adicionada com sucesso.\n" #~ "Pode configurar opções avançadas em \"Editar->Contas\" na janela " #~ "principal. " #~ msgid "" #~ "Your new account has been created and added to your gajim configuration.\n" #~ "You can set advanced account options using \"Edit->Accounts\" in the main " #~ "window menu." #~ msgstr "" #~ "A sua nova conta foi criada e adicionada às suas configurações do gajim.\n" #~ "Pode configurar opções avançadas em \"Editar->Contas\" na janela " #~ "principal. " #~ msgid "You need to enter a valid server address to add an account." #~ msgstr "" #~ "Deve introduzir um endereço de servidor válido para adicionar uma conta." #~ msgid "Contact names must be of the form \"user@servername\"." #~ msgstr "" #~ "Nomes de contacto devem estar no formato \"utilizador@nomedoservidor\"." #~ msgid "Invalid contact ID" #~ msgstr "ID de contacto inválido" #~ msgid "Contact ID must be of the form \"username@servername\"." #~ msgstr "ID de contacto deve estar no formato \"utilizador@nomedoservidor\"." #~ msgid "Account registration successful" #~ msgstr "Registo da conta efectuado com sucesso" #~ msgid "The account \"%s\" has been registered with the Jabber server." #~ msgstr "A conta \"%s\" foi registada no servidor Jabber." #~ msgid "theme_name" #~ msgstr "nome_do_tema" #~ msgid "Edit" #~ msgstr "Editar" #~ msgid "Check if you want to register for a new jabber account" #~ msgstr "Marque se quiser registar uma nova conta Jabber" #~ msgid "Click to get contact's extended information" #~ msgstr "Clique para receber informações detalhadas do contacto" #~ msgid "_Compact View" #~ msgstr "Vista _Compacta" #~ msgid "_Refresh" #~ msgstr "_Actualizar" #~ msgid "_Register new account" #~ msgstr "_Registar nova conta" #~ msgid "You just received a new message in room \"%s\"" #~ msgstr "Recebeu uma mensagem na sala \"%s\"" #~ msgid "" #~ "If you close this window and you have history disabled, this message will " #~ "be lost." #~ msgstr "" #~ "Se fechar esta janela e o histórico estiver desactivado, esta mensagem " #~ "será perdida." #~ msgid "New _Room" #~ msgstr "Nova _Sala" #~ msgid "" #~ "If checked, all chat and group chat windows will have the information " #~ "area in the top and the buttons area in the bottom hidden. You can quick " #~ "toggle compact view with Alt+C. NOTE: The last state you leave a window/" #~ "tab is not a permanent one" #~ msgstr "" #~ "Se marcado, todas as janelas de conversa e de chat terão a área de " #~ "informação no topo e área dos botões no fundo escondidas. Pode alternar " #~ "entre as vistas normal e compacta premindo Alt+C. NOTA: A última vista " #~ "com a qual fechar a janela/aba não é permanente." #, fuzzy #~ msgid "Inactivate account" #~ msgstr "Não tem nenhuma conta activa" #, fuzzy #~ msgid "Po_sition:" #~ msgstr "Cargo:" #~ msgid "_Service Discovery" #~ msgstr "_Busca de Serviços" #~ msgid "_Service Discovery..." #~ msgstr "_Busca de Serviços..." #~ msgid "error appeared while processing xmpp:" #~ msgstr "erro ocorreu quando processava xmpp:" #~ msgid "" #~ "Cancels the selected file transfer. If there is an incomplete file, kept " #~ "in the file system it will be removed. This operation is not reversable" #~ msgstr "" #~ "Cancela a transferência de ficheiro seleccionada. Se existir um ficheiro " #~ "incompleto, este será removido. Esta operação é irreversível." #~ msgid "Chan_ge" #~ msgstr "_Mudar" #~ msgid "Gajim - one unread message" #~ msgid_plural "Gajim - %d unread messages" #~ msgstr[0] "Gajim - uma mensagem não lida" #~ msgstr[1] "Gajim - %d mensagens não lidas" #~ msgid "Gajim disconnected you from %s" #~ msgstr "Gajim desligou-o de %s" #~ msgid "" #~ "%s seconds have passed and server did not reply to our keep-alive. If you " #~ "believe such disconnection should not have happened, you can disable " #~ "sending keep-alive packets by modifying this account." #~ msgstr "" #~ "Passaram %s segundos e o servidor não respondeu ao nosso keep-alive. Se " #~ "acredita que tal não deve ter acontecido, pode desactivar o envio de " #~ "pacotes keep-alive modificando esta conta." #~ msgid "error: cannot open %s for reading\n" #~ msgstr "erro: impossível abrir %s para leitura\n" #~ msgid "If you close the window, this message will be lost." #~ msgstr "Se fechar esta janela, esta mensagem será perdida." #~ msgid "Stop file transfer" #~ msgstr "Parar a transferência de ficheiro" #~ msgid "_About" #~ msgstr "_Sobre" #~ msgid "paused" #~ msgstr "pausado" gajim-gajim-1.0.1-c4830bd93c6ec68084425c05965ed07706026397/po/pt_BR.po000066400000000000000000013046401326020644600226770ustar00rootroot00000000000000# translation of pt_BR.po to Português Brasileiro # Portuguese translations for Gajim package. # Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the Gajim package. # junix , 2005. # Gajim , 2007. # Djavan Fagundes , 2009, 2010. # msgid "" msgstr "" "Project-Id-Version: pt_BR\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-03-31 02:05+0000\n" "PO-Revision-Date: 2009-12-31 23:22-0300\n" "Last-Translator: Djavan Fagundes \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Virtaal 0.5.0\n" "X-Poedit-Language: Portuguese\n" "X-Poedit-Country: BRAZIL\n" #: gajim/chat_control_base.py:199 msgid "Ping?" msgstr "Ping?" #: gajim/chat_control_base.py:204 msgid "Error." msgstr "Erro." #: gajim/chat_control_base.py:571 msgid "_Undo" msgstr "" #: gajim/chat_control_base.py:579 gajim/profile_window.py:181 #: gajim/conversation_textview.py:539 msgid "_Clear" msgstr "" #: gajim/chat_control_base.py:1172 msgid "Really send file?" msgstr "Realmente enviar o arquivo?" #: gajim/chat_control_base.py:1173 #, fuzzy, python-format msgid "If you send a file to %s, he/she will know your real JID." msgstr "Se você enviar um arquivo para %s, ele(a) saberá o seu Jabber ID real." #: gajim/session.py:451 gajim/session.py:511 msgid "Confirm these session options" msgstr "Confirme essas opções de sessão" #: gajim/session.py:453 #, fuzzy, python-format msgid "" "The remote client wants to negotiate a session with these features:\n" "\n" "%s\n" "\n" "Are these options acceptable?" msgstr "" "O cliente remoto quer negociar uma sessão com esses recursos:\n" "\n" "\t%s\n" "\n" "\tEssas opções são aceitáveis?" #: gajim/session.py:513 #, python-format msgid "" "The remote client selected these options:\n" "\n" "%s\n" "\n" "Continue with the session?" msgstr "" "O cliente remoto selecionou essas opções:\n" "\n" "%s\n" "\n" "Continuar com a sessão?" #: gajim/session.py:516 #, fuzzy msgid "Always accept for this contact" msgstr "O OpenPGP está ativado para este contato?" #: gajim/filetransfers_window.py:89 msgid "File" msgstr "Arquivo" #: gajim/filetransfers_window.py:104 msgid "Time" msgstr "Tempo" #: gajim/filetransfers_window.py:116 msgid "Progress" msgstr "Progresso" #: gajim/filetransfers_window.py:223 gajim/filetransfers_window.py:279 #, python-format msgid "Filename: %s" msgstr "Nome do arquivo: %s" #: gajim/filetransfers_window.py:224 gajim/filetransfers_window.py:486 #, python-format msgid "Size: %s" msgstr "Tamanho: %s" #: gajim/filetransfers_window.py:233 gajim/filetransfers_window.py:243 #: gajim/history_manager.py:528 msgid "You" msgstr "Você" #: gajim/filetransfers_window.py:234 #, python-format msgid "Sender: %s" msgstr "Remetente: %s" #: gajim/filetransfers_window.py:235 gajim/filetransfers_window.py:763 #: gajim/tooltips.py:667 msgid "Recipient: " msgstr "Destinatário: " #: gajim/filetransfers_window.py:246 #, python-format msgid "Saved in: %s" msgstr "Salvo em: %s" #: gajim/filetransfers_window.py:248 gajim/chat_control.py:1617 msgid "File transfer completed" msgstr "Transferência de arquivos completa" #: gajim/filetransfers_window.py:250 gajim/chat_control.py:1621 #, fuzzy msgid "Open _Containing Folder" msgstr "_Abrir pasta do arquivo" #: gajim/filetransfers_window.py:263 gajim/filetransfers_window.py:270 #: gajim/chat_control.py:1676 msgid "File transfer cancelled" msgstr "Transferência de arquivos cancelada" #: gajim/filetransfers_window.py:263 gajim/filetransfers_window.py:271 #: gajim/chat_control.py:1677 msgid "Connection with peer cannot be established." msgstr "Conexão com o par não pode ser estabelecida." #: gajim/filetransfers_window.py:280 #, python-format msgid "Recipient: %s" msgstr "Conteúdo: %s" #: gajim/filetransfers_window.py:282 #, python-format msgid "Error message: %s" msgstr "Mensagem de erro: %s" #: gajim/filetransfers_window.py:283 gajim/chat_control.py:1673 msgid "File transfer stopped" msgstr "Transferência do arquivo parada" #: gajim/filetransfers_window.py:319 #, python-format msgid "" "The file %(file)s has been received, but it seems to have been damaged along " "the way.\n" "Do you want to download it again?" msgstr "" #: gajim/filetransfers_window.py:345 #, fuzzy msgid "Choose File to Send…" msgstr "Escolha o arquivo para enviar..." #: gajim/filetransfers_window.py:356 msgid "_Send" msgstr "_Enviar" #: gajim/filetransfers_window.py:363 gajim/tooltips.py:702 msgid "Description: " msgstr "Descrição: " #: gajim/filetransfers_window.py:376 #, fuzzy msgid "Gajim can not read this file" msgstr "Gajim não pode acessar este arquivo" #: gajim/filetransfers_window.py:377 msgid "Another process is using this file." msgstr "" #: gajim/filetransfers_window.py:422 gajim/gtkgui_helpers.py:492 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Não é possível sobrescrever o arquivo \"%s\"" #: gajim/filetransfers_window.py:423 gajim/gtkgui_helpers.py:493 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." msgstr "" "Um arquivo com este nome já existe e você não tem permissão para sobrescrevê-" "lo." #: gajim/filetransfers_window.py:440 gajim/gtkgui_helpers.py:497 msgid "This file already exists" msgstr "Este arquivo já existe" #: gajim/filetransfers_window.py:440 gajim/gtkgui_helpers.py:497 msgid "What do you want to do?" msgstr "O que você quer fazer?" #: gajim/filetransfers_window.py:451 gajim/gtkgui_helpers.py:504 #, python-format msgid "Directory \"%s\" is not writable" msgstr "O diretório \"%s\" não é gravável" #: gajim/filetransfers_window.py:452 gajim/gtkgui_helpers.py:505 msgid "You do not have permission to create files in this directory." msgstr "Você não tem permissão para criar este diretório." #: gajim/filetransfers_window.py:463 #, fuzzy msgid "Save File as…" msgstr "Salvar arquivo como..." #: gajim/filetransfers_window.py:483 #, python-format msgid "File: %s" msgstr "Arquivo: %s" #: gajim/filetransfers_window.py:489 #, python-format msgid "Type: %s" msgstr "Tipo: %s" #: gajim/filetransfers_window.py:491 #, python-format msgid "Description: %s" msgstr "Descrição: %s" #: gajim/filetransfers_window.py:492 #, python-format msgid "%s wants to send you a file:" msgstr "%s quer te enviar um arquivo:" #: gajim/filetransfers_window.py:533 #, fuzzy msgid "Checking file…" msgstr "Enviando perfil..." #: gajim/filetransfers_window.py:547 #, fuzzy msgid "File error" msgstr "Erro na transferência de arquivos" #: gajim/filetransfers_window.py:584 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" #: gajim/filetransfers_window.py:677 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" #: gajim/filetransfers_window.py:730 gajim/filetransfers_window.py:733 msgid "Invalid File" msgstr "Arquivo inválido" #: gajim/filetransfers_window.py:730 msgid "File: " msgstr "Arquivo: " #: gajim/filetransfers_window.py:734 msgid "It is not possible to send empty files" msgstr "Não é possível enviar arquivos vazios" #: gajim/filetransfers_window.py:759 gajim/tooltips.py:658 msgid "Name: " msgstr "Nome: " #: gajim/filetransfers_window.py:761 gajim/tooltips.py:661 msgid "Sender: " msgstr "Remetente: " #: gajim/filetransfers_window.py:889 msgid "Pause" msgstr "Pausa" #: gajim/filetransfers_window.py:900 msgid "_Continue" msgstr "_Continuar" #: gajim/features_window.py:48 msgid "Bonjour / Zeroconf" msgstr "Bonjour / Zeroconf" #: gajim/features_window.py:49 msgid "Serverless chatting with autodetected clients in a local network." msgstr "" "Conversa sem servidor com clientes detectados automaticamente em uma rede " "local." #: gajim/features_window.py:50 msgid "Requires python-avahi." msgstr "Requer o python-avahi." #: gajim/features_window.py:51 msgid "" "Requires pybonjour and bonjour SDK running (http://developer.apple.com/" "opensource/)." msgstr "" #: gajim/features_window.py:52 msgid "Command line" msgstr "Linha de comando" #: gajim/features_window.py:53 msgid "A script to control Gajim via commandline." msgstr "Um script para controlar o Gajim via linha de comando." #: gajim/features_window.py:54 msgid "Requires python-dbus." msgstr "Requer o python-dbus." #: gajim/features_window.py:55 gajim/features_window.py:83 #: gajim/features_window.py:87 msgid "Feature not available under Windows." msgstr "Recurso não disponível no Windows." #: gajim/features_window.py:56 #, fuzzy msgid "OpenPGP message encryption" msgstr "Criptografia de mensagem OpenPGP" #: gajim/features_window.py:57 #, fuzzy msgid "Ability to encrypting chat messages with OpenPGP." msgstr "Criptografando as mensagens das conversas com chaves gpg." #: gajim/features_window.py:58 msgid "Requires gpg and python-gnupg (http://code.google.com/p/python-gnupg/)." msgstr "" #: gajim/features_window.py:59 msgid "Requires gpg.exe in PATH." msgstr "" #: gajim/features_window.py:60 msgid "Password encryption" msgstr "Criptografia de senha" #: gajim/features_window.py:61 msgid "Passwords can be stored securely and not just in plaintext." msgstr "" "As senhas podem ser armazenadas de maneira segura e não apenas em texto " "plano." #: gajim/features_window.py:62 msgid "" "Requires libsecret and a provider (such as GNOME Keyring and KSecretService)." msgstr "" #: gajim/features_window.py:63 msgid "On Windows the Windows Credential Vault is used." msgstr "" #: gajim/features_window.py:64 msgid "Spell Checker" msgstr "Verificador ortográfico" #: gajim/features_window.py:65 msgid "Spellchecking of composed messages." msgstr "Verificação ortográfica das mensagens escritas." #: gajim/features_window.py:66 gajim/features_window.py:67 #, fuzzy msgid "Requires Gspell" msgstr "Requer libgtkspell." #: gajim/features_window.py:68 msgid "Automatic status" msgstr "Status automático" #: gajim/features_window.py:69 msgid "Ability to measure idle time, in order to set auto status." msgstr "" "Habilidade de medir o tempo de inatividade para definir o status automático." #: gajim/features_window.py:70 msgid "Requires libxss library." msgstr "Requer biblioteca libxss." #: gajim/features_window.py:71 msgid "Requires python2.5." msgstr "Requer python2.5" #: gajim/features_window.py:72 msgid "End to End message encryption" msgstr "Criptografia de mensagem End to End" #: gajim/features_window.py:73 msgid "Encrypting chat messages." msgstr "Criptografando mensagens da conversa." #: gajim/features_window.py:74 gajim/features_window.py:75 msgid "Requires python-crypto." msgstr "Requer python-crypto." #: gajim/features_window.py:76 msgid "RST Generator" msgstr "Gerador RST" #: gajim/features_window.py:77 msgid "" "Generate XHTML output from RST code (see http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." msgstr "" "Gera saída XHTML a partir de código RST (veja http://docutils.sourceforge." "net/docs/ref/rst/restructuredtext.html)." #: gajim/features_window.py:78 gajim/features_window.py:79 msgid "Requires python-docutils." msgstr "Requer python-docutils." #: gajim/features_window.py:80 gajim/data/gui/preferences_window.ui:2421 msgid "Audio / Video" msgstr "Áudio / Vídeo" #: gajim/features_window.py:81 msgid "Ability to start audio and video chat." msgstr "Habilidade para iniciar uma conversa da áudio e vídeo." #: gajim/features_window.py:82 msgid "" "Requires gir1.2-farstream-0.2, gir1.2-gstreamer-1.0, gstreamer1.0-libav and " "gstreamer1.0-plugins-ugly." msgstr "" #: gajim/features_window.py:84 msgid "UPnP-IGD" msgstr "" #: gajim/features_window.py:85 msgid "Ability to request your router to forward port for file transfer." msgstr "" #: gajim/features_window.py:86 #, fuzzy msgid "Requires gir1.2-gupnpigd-1.0." msgstr "Requer python-gnome2." #: gajim/features_window.py:94 #, fuzzy msgid "?features:Available" msgstr "Disponível" #: gajim/features_window.py:101 msgid "Feature" msgstr "Recurso" #: gajim/gtkgui_helpers.py:255 msgid "Error reading file:" msgstr "Erro lendo arquivo:" #: gajim/gtkgui_helpers.py:258 msgid "Error parsing file:" msgstr "Erro ao analisar o arquivo:" #: gajim/gtkgui_helpers.py:478 msgid "Extension not supported" msgstr "Extensão não suportada" #: gajim/gtkgui_helpers.py:479 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "" "A imagem não pode ser salva no formato %(type)s. Salvar como " "%(new_filename)s?" #: gajim/gtkgui_helpers.py:514 #, fuzzy msgid "Save Image as…" msgstr "Salvar imagem como..." #: gajim/vcard.py:166 gajim/vcard.py:513 gajim/profile_window.py:175 #: gajim/chat_control.py:581 #, fuzzy msgid "Save _As" msgstr "Possui " #: gajim/vcard.py:289 gajim/vcard.py:296 msgid "?Client:Unknown" msgstr "?Cliente:Desconhecido" #: gajim/vcard.py:293 gajim/vcard.py:298 msgid "?OS:Unknown" msgstr "?SO:Desconhecido" #: gajim/vcard.py:327 gajim/vcard.py:330 msgid "?Time:Unknown" msgstr "?Tempo:Desconhecido" #: gajim/vcard.py:381 msgid "?Role in Group Chat:Role:" msgstr "" #: gajim/vcard.py:385 msgid "Affiliation:" msgstr "Afiliação:" #: gajim/vcard.py:392 #, fuzzy msgid "" "This contact is interested in your presence information, but you are not " "interested in their presence" msgstr "" "Este contato está interessado em sua informação de presença, mas você não " "está interessado na presença dele/dela" #: gajim/vcard.py:394 #, fuzzy msgid "" "You are interested in the contact's presence information, but it is not " "mutual" msgstr "" "Você está interessado na informação da presença do contato, mas ele/ela não " "está interessado na sua" #: gajim/vcard.py:396 #, fuzzy msgid "The contact and you want to exchange presence information" msgstr "" "Você e o contato estão interessados na informação da presença de cada um" #: gajim/vcard.py:398 #, fuzzy msgid "" "You and the contact have a mutual disinterest in each-others presence " "information" msgstr "" "Você e o contato estão interessados na informação da presença de cada um" #: gajim/vcard.py:404 msgid "You are waiting contact's answer about your subscription request" msgstr "" "Você está esperando a resposta do contato sobre seu pedido de inscrição" #: gajim/vcard.py:406 msgid "There is no pending subscription request." msgstr "Não há requisições de inscrições pendentes." #: gajim/vcard.py:411 gajim/vcard.py:455 gajim/vcard.py:568 msgid " resource with priority " msgstr " recurso com prioridade " #: gajim/options_dialog.py:383 gajim/dialogs.py:4806 gajim/dialogs.py:4848 #: gajim/dialogs.py:4896 gajim/dialogs.py:4986 msgid "All files" msgstr "Todos os arquivos" #: gajim/options_dialog.py:392 #, fuzzy msgid "Clear File" msgstr "Limpando" #: gajim/options_dialog.py:474 #, fuzzy msgid "Manage Proxies" msgstr "Gerenciar perfis de proxy" #: gajim/options_dialog.py:484 gajim/options_dialog.py:552 #: gajim/options_dialog.py:573 gajim/dialogs.py:326 gajim/dialogs.py:328 #: gajim/dialogs.py:536 gajim/dialogs.py:549 gajim/roster_window.py:2997 #: gajim/roster_window.py:3003 gajim/roster_window.py:3008 gajim/config.py:1162 #: gajim/config.py:1177 gajim/config.py:1182 gajim/config.py:1230 #: gajim/config.py:1340 gajim/config.py:2489 gajim/config.py:2566 #: gajim/data/gui/account_creation_wizard_window.ui:22 #: gajim/data/gui/change_mood_dialog.ui:98 msgid "None" msgstr "Nenhum" #: gajim/options_dialog.py:506 #, fuzzy msgid "Adjust to Status" msgstr "_Ajustar para status" #: gajim/options_dialog.py:518 msgid "On" msgstr "" #: gajim/options_dialog.py:518 #, fuzzy msgid "Off" msgstr "Desconectado" #: gajim/options_dialog.py:556 msgid "Failed to get secret keys" msgstr "Falha enquanto recebia as chaves secretas" #: gajim/options_dialog.py:557 msgid "There is no OpenPGP secret key available." msgstr "Não há chave secreta OpenPGP disponível." #: gajim/options_dialog.py:562 msgid "OpenPGP Key Selection" msgstr "Seleção de chave OpenPGP" #: gajim/options_dialog.py:562 msgid "Choose your OpenPGP key" msgstr "Escolha sua chave OpenPGP" #: gajim/gui_menu_builder.py:100 msgid "_New Group Chat" msgstr "_Nova conferência" #: gajim/gui_menu_builder.py:292 gajim/gui_menu_builder.py:416 #: gajim/dialogs.py:1114 gajim/dialogs.py:2333 gajim/dialogs.py:2362 #: gajim/dialogs.py:3867 gajim/chat_control.py:284 gajim/roster_window.py:804 #: gajim/roster_window.py:1753 gajim/roster_window.py:1755 #: gajim/roster_window.py:2068 gajim/roster_window.py:3419 #: gajim/roster_window.py:3446 gajim/gui_interface.py:524 #: gajim/common/contacts.py:154 gajim/common/contacts.py:280 #: gajim/common/helpers.py:95 gajim/common/helpers.py:408 msgid "Not in Roster" msgstr "Fora da lista" #: gajim/gui_menu_builder.py:431 msgid "I would like to add you to my roster" msgstr "Eu gostaria de adiciona-lo à minha lista" #: gajim/gui_menu_builder.py:508 #, fuzzy msgid "Send Single _Message…" msgstr "Enviar _mensagem simples" #: gajim/gui_menu_builder.py:521 gajim/roster_window.py:5165 #: gajim/data/gui/contact_context_menu.ui:58 msgid "Send Cus_tom Status" msgstr "Enviar status perso_nalizado" #: gajim/gui_menu_builder.py:541 #, fuzzy msgid "E_xecute Command…" msgstr "_Executar comando" #: gajim/gui_menu_builder.py:549 msgid "_Manage Transport" msgstr "_Gerenciar transporte" #: gajim/gui_menu_builder.py:555 msgid "_Modify Transport" msgstr "_Modificar transporte" #: gajim/gui_menu_builder.py:562 gajim/roster_window.py:5195 #, fuzzy msgid "_Rename…" msgstr "_Renomear" #: gajim/gui_menu_builder.py:573 gajim/roster_window.py:5212 #: gajim/roster_window.py:5327 gajim/data/gui/blocked_contacts_window.ui:52 #: gajim/data/gui/gc_occupants_menu.ui:148 #: gajim/data/gui/contact_context_menu.ui:166 msgid "_Unblock" msgstr "_Desbloquear" #: gajim/gui_menu_builder.py:576 gajim/roster_window.py:5217 #: gajim/roster_window.py:5331 gajim/data/gui/gc_occupants_menu.ui:140 #: gajim/data/gui/contact_context_menu.ui:174 msgid "_Block" msgstr "_Bloquear" #: gajim/gui_menu_builder.py:584 gajim/roster_window.py:5224 #: gajim/data/gui/contact_context_menu.ui:204 msgid "Remo_ve" msgstr "Remo_ver" #: gajim/gui_menu_builder.py:594 gajim/data/gui/search_window.ui:98 msgid "_Information" msgstr "_Informações" #: gajim/gui_menu_builder.py:611 #, fuzzy msgid "Send File..." msgstr "Enviar _arquivo..." #: gajim/gui_menu_builder.py:615 #, fuzzy msgid "Invite Contacts" msgstr "Convidar _contatos" #: gajim/gui_menu_builder.py:616 #, fuzzy msgid "Add to Roster" msgstr "_Adicionar à lista" #: gajim/gui_menu_builder.py:617 #, fuzzy msgid "Audio Session" msgstr "Áudio / Vídeo" #: gajim/gui_menu_builder.py:618 #, fuzzy msgid "Video Session" msgstr "Alternar sessão de vídeo" #: gajim/gui_menu_builder.py:619 #, fuzzy msgid "Information" msgstr "_Informações" #: gajim/gui_menu_builder.py:620 gajim/gui_menu_builder.py:655 #: gajim/data/gui/application_menu.ui:37 #, fuzzy msgid "History" msgstr "_Histórico" #: gajim/gui_menu_builder.py:644 #, fuzzy msgid "Manage Room" msgstr "_Gerenciar sala" #: gajim/gui_menu_builder.py:645 #, fuzzy msgid "Change Subject" msgstr "Alterar as_sunto..." #: gajim/gui_menu_builder.py:646 #, fuzzy msgid "Configure Room" msgstr "Configurar _sala..." #: gajim/gui_menu_builder.py:647 #, fuzzy msgid "Destroy Room" msgstr "_Excluir sala" #: gajim/gui_menu_builder.py:649 #, fuzzy msgid "Change Nick" msgstr "Alterar _apelido..." #: gajim/gui_menu_builder.py:650 #, fuzzy msgid "Bookmark Room" msgstr "Adicionar esta sala aos marcadores" #: gajim/gui_menu_builder.py:651 #, fuzzy msgid "Request Voice" msgstr "_Voz" #: gajim/gui_menu_builder.py:652 gajim/data/gui/gc_control_popup_menu.ui:72 #, fuzzy msgid "Notify on all messages" msgstr "Modelos de mensagens" #: gajim/gui_menu_builder.py:653 #, fuzzy msgid "Minimize on close" msgstr "_Minimizar ao fechar" #: gajim/gui_menu_builder.py:654 gajim/roster_window.py:5397 #, fuzzy msgid "Execute command" msgstr "_Executar comando" #: gajim/gui_menu_builder.py:656 #, fuzzy msgid "Disconnect" msgstr "_Desconectar" #: gajim/gui_menu_builder.py:685 gajim/gui_menu_builder.py:732 msgid "Join Group Chat" msgstr "Ingressar numa conferência" #: gajim/gui_menu_builder.py:731 #, fuzzy msgid "Add Contact..." msgstr "_Adicionar contato..." #: gajim/gui_menu_builder.py:733 gajim/accounts_window.py:460 #: gajim/accounts_window.py:555 gajim/accounts_window.py:594 #, fuzzy msgid "Profile" msgstr "arquivo" #: gajim/gui_menu_builder.py:734 #, fuzzy msgid "Discover Services" msgstr "_Descubra serviços" #: gajim/gui_menu_builder.py:735 #, fuzzy msgid "Send Single Message..." msgstr "_Enviar mensagem simples..." #: gajim/gui_menu_builder.py:736 gajim/data/gui/preferences_window.ui:2846 msgid "Advanced" msgstr "Avançado" #: gajim/gui_menu_builder.py:737 #, fuzzy msgid "Archiving Preferences" msgstr "_Preferências" #: gajim/gui_menu_builder.py:738 gajim/history_sync.py:44 #, fuzzy msgid "Synchronise History" msgstr "Sincronizar" #: gajim/gui_menu_builder.py:739 gajim/dialogs.py:4583 msgid "Privacy Lists" msgstr "Listas de privacidade" #: gajim/gui_menu_builder.py:740 gajim/server_info.py:37 #, fuzzy msgid "Server Info" msgstr "Servidor" #: gajim/gui_menu_builder.py:741 gajim/data/gui/xml_console_window.ui:77 msgid "XML Console" msgstr "Console XML" #: gajim/gui_menu_builder.py:743 #, fuzzy msgid "Admin" msgstr "_Administração" #: gajim/gui_menu_builder.py:744 #, fuzzy msgid "Send Server Message..." msgstr "_Enviar mensagem de servidor..." #: gajim/gui_menu_builder.py:745 msgid "Set MOTD..." msgstr "Definir MOTD..." #: gajim/gui_menu_builder.py:746 msgid "Update MOTD..." msgstr "Atualizar MOTD..." #: gajim/gui_menu_builder.py:747 #, fuzzy msgid "Delete MOTD..." msgstr "Excluir MOTD" #: gajim/gui_menu_builder.py:787 #, fuzzy msgid "No Accounts available" msgstr "Conta não disponível" #: gajim/gui_menu_builder.py:799 gajim/data/gui/accounts_window.ui:78 #: gajim/data/gui/application_menu.ui:5 gajim/data/gui/application_menu.ui:71 #: gajim/data/gui/shortcuts_window.ui:181 msgid "Accounts" msgstr "Contas" #: gajim/history_manager.py:56 #, fuzzy msgid "Usage:" msgstr "mensagem" #: gajim/history_manager.py:58 #, fuzzy msgid "Options:" msgstr "_Emoticons:" #: gajim/history_manager.py:60 msgid "Show this help message and exit" msgstr "" #: gajim/history_manager.py:61 msgid "Choose folder for logfile" msgstr "" #: gajim/history_manager.py:104 msgid "Cannot find history logs database" msgstr "Não foi encontrado banco de dados do histórico de logs" #: gajim/history_manager.py:144 gajim/history_manager.py:195 #: gajim/dialogs.py:3848 gajim/config.py:1621 gajim/disco.py:872 msgid "JID" msgstr "JID" #: gajim/history_manager.py:157 gajim/history_manager.py:201 #: gajim/history_window.py:108 msgid "Date" msgstr "Data:" #: gajim/history_manager.py:164 gajim/history_manager.py:220 #: gajim/data/gui/join_groupchat_window.ui:131 msgid "Nickname" msgstr "Apelido" #: gajim/history_manager.py:173 gajim/history_manager.py:208 #: gajim/history_window.py:116 gajim/data/gui/xml_console_window.ui:108 msgid "Message" msgstr "Mensagem" #: gajim/history_manager.py:181 gajim/history_manager.py:214 msgid "Subject" msgstr "Assunto" #: gajim/history_manager.py:243 msgid "" "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " "RUNNING)" msgstr "" "Você quer limpar o banco de dados? (ALTAMENTE NÃO RECOMENDADO COM O GAJIM EM " "EXECUÇÃO)" #: gajim/history_manager.py:245 #, fuzzy msgid "" "Normally allocated database size will not be freed, it will just become " "reusable. If you really want to reduce database filesize, click YES, else " "click NO.\n" "\n" "In case you click YES, please wait…" msgstr "" "Normalmente, o tamanho alocado da base de dados não será liberado, ele se " "tornará apenas reusável. Se você quiser realmente reduzir o tamanho do " "arquivo da base de dados, clique SIM, senão do clique NÃO.\n" "\n" "Se caso você clicou SIM, por favor espere... " #: gajim/history_manager.py:250 #, fuzzy msgid "Database Cleanup" msgstr "Erro na base de dados" #: gajim/history_manager.py:464 #, fuzzy msgid "Exporting History Logs…" msgstr "Exportando histórico de logs..." #: gajim/history_manager.py:540 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "%(who)s em %(time)s disse: %(message)s\n" #: gajim/history_manager.py:578 #, fuzzy, python-format msgid "Do you wish to delete all correspondence with %(jid)s?" msgstr "Você realmente quer excluir a mensagem selecionada?" #: gajim/history_manager.py:582 #, fuzzy msgid "Do you wish to delete all correspondence with the selected contacts?" msgstr "Você realmente quer excluir os logs do contato selecionado?" #: gajim/history_manager.py:584 #, fuzzy msgid "This can not be undone." msgstr "O serviço não pode ser encontrado" #: gajim/history_manager.py:586 gajim/history_manager.py:625 #, fuzzy msgid "Deletion Confirmation" msgstr "Cancelar confirmação" #: gajim/history_manager.py:620 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Você realmente quer excluir a mensagem selecionada?" msgstr[1] "Você realmente quer excluir as mensagens selecionadas?" #: gajim/history_manager.py:623 msgid "This is an irreversible operation." msgstr "Esta é uma operação irreversível." #: gajim/profile_window.py:63 #, fuzzy msgid "Retrieving profile…" msgstr "Recuperando perfil..." #: gajim/profile_window.py:128 msgid "Could not load image" msgstr "A imagem não pode ser carregada" #: gajim/profile_window.py:200 #, fuzzy msgid "Wrong date format" msgstr "Informações do contato" #: gajim/profile_window.py:201 #, fuzzy msgid "Format of the date must be YYYY-MM-DD" msgstr "Formato: YYYY-MM-DD" #: gajim/profile_window.py:261 msgid "Information received" msgstr "Informação recebida" #: gajim/profile_window.py:334 gajim/dialogs.py:2562 gajim/dialogs.py:2650 #: gajim/dialogs.py:3105 gajim/disco.py:536 gajim/gui_interface.py:1849 #: gajim/dialog_messages.py:32 msgid "You are not connected to the server" msgstr "Você não está conectado ao servidor" #: gajim/profile_window.py:335 #, fuzzy msgid "Without a connection, you can not publish your contact information." msgstr "Você deve estar conectado para publicar suas informações de contato." #: gajim/profile_window.py:349 #, fuzzy msgid "Sending profile…" msgstr "Enviando perfil..." #: gajim/profile_window.py:368 msgid "Information NOT published" msgstr "Informação NÃO publicada" #: gajim/profile_window.py:375 msgid "vCard publication failed" msgstr "Publicação do vCard falhou" #: gajim/profile_window.py:376 msgid "" "There was an error while publishing your personal information, try again " "later." msgstr "" "Houve um erro ao publicar sua informação pessoal, tente outra vez mais tarde." #: gajim/dialogs.py:90 #, python-format msgid "Contact name: %s" msgstr "Nome do contato: %s" #: gajim/dialogs.py:92 #, fuzzy, python-format msgid "JID: %s" msgstr "Jabber ID: %s" #: gajim/dialogs.py:121 gajim/dialogs.py:133 gajim/roster_window.py:2939 #: gajim/roster_window.py:3953 gajim/roster_window.py:5234 #: gajim/accounts_window.py:463 gajim/common/contacts.py:105 #: gajim/common/contacts.py:137 gajim/data/gui/preferences_window.ui:569 #: gajim/data/gui/shortcuts_window.ui:176 msgid "General" msgstr "Geral" #: gajim/dialogs.py:206 msgid "Group" msgstr "Grupo" #: gajim/dialogs.py:213 msgid "In the group" msgstr "Neste grupo" #: gajim/dialogs.py:308 msgid "KeyID" msgstr "KeyID" #: gajim/dialogs.py:313 msgid "Contact name" msgstr "Nome do contato" #: gajim/dialogs.py:491 msgid "Set Mood" msgstr "Definir humor" #: gajim/dialogs.py:611 #, python-format msgid "%s Status Message" msgstr "%s mensagem de status" #: gajim/dialogs.py:625 msgid "Status Message" msgstr "Mensagem de status" #: gajim/dialogs.py:815 msgid "Overwrite Status Message?" msgstr "Sobrescrever mensagem de status?" #: gajim/dialogs.py:816 msgid "" "This name is already used. Do you want to overwrite this status message?" msgstr "" "Este nome já está sendo usado. Você quer sobrescrever essa mensagem de " "status?" #: gajim/dialogs.py:824 msgid "Save as Preset Status Message" msgstr "Salvar como a mensagem de status pré-configurada" #: gajim/dialogs.py:825 msgid "Please type a name for this status message" msgstr "Por favor, escreva um nome para esta mensagem de status" #: gajim/dialogs.py:852 #, fuzzy msgid "JID:" msgstr "Seu JID:" #: gajim/dialogs.py:853 msgid "AIM Address:" msgstr "Endereço AIM:" #: gajim/dialogs.py:854 msgid "GG Number:" msgstr "Número de GG:" #: gajim/dialogs.py:855 msgid "ICQ Number:" msgstr "Número de ICQ:" #: gajim/dialogs.py:856 msgid "MSN Address:" msgstr "Endereço MSN:" #: gajim/dialogs.py:857 msgid "Yahoo! Address:" msgstr "Endereço Yahoo!:" #: gajim/dialogs.py:894 #, fuzzy, python-format msgid "" "Please fill in the data of the contact you want to add to your account " "%s" msgstr "" "Por favor, preencha os dados do contato se você quer adicionar na conta %s" #: gajim/dialogs.py:897 msgid "Please fill in the data of the contact you want to add" msgstr "Por favor preencha os dados do contato que você quer adicionar" #: gajim/dialogs.py:1089 gajim/dialogs.py:1095 gajim/dialogs.py:1100 msgid "Invalid User ID" msgstr "Inválido ID do usuário" #: gajim/dialogs.py:1096 msgid "The user ID must not contain a resource." msgstr "O ID do usuário não contém um recurso." #: gajim/dialogs.py:1101 msgid "You cannot add yourself to your roster." msgstr "Você não pode adicionar você mesmo na sua lista." #: gajim/dialogs.py:1115 msgid "Contact already in roster" msgstr "Contato já foi adicionado à lista" #: gajim/dialogs.py:1116 msgid "This contact is already listed in your roster." msgstr "Este contato já encontra-se em sua lista." #: gajim/dialogs.py:1169 gajim/dialogs.py:1203 msgid "User ID:" msgstr "ID do usuário:" #: gajim/dialogs.py:1269 #, fuzzy msgid "Error while adding transport contact" msgstr "Erro ao adicionar serviço. %s" #: gajim/dialogs.py:1270 #, python-format msgid "" "This error occured while adding a contact for transport %(transport)s:\n" "\n" "%(error)s" msgstr "" #: gajim/dialogs.py:1302 #, fuzzy msgid "A GTK+ XMPP client" msgstr "Um cliente Jabber GTK+" #: gajim/dialogs.py:1303 #, fuzzy, python-format msgid "GTK+ Version: %s" msgstr "Versão do GTK+:" #: gajim/dialogs.py:1304 #, fuzzy, python-format msgid "PyGObject Version: %s" msgstr "Versão do PyGTK:" #: gajim/dialogs.py:1305 #, python-format msgid "python-nbxmpp Version: %s" msgstr "" #: gajim/dialogs.py:1308 #, fuzzy msgid "Current Developers" msgstr "Desenvolvedores atuais:" #: gajim/dialogs.py:1309 #, fuzzy msgid "Past Developers" msgstr "Desenvolvedores passados:" #: gajim/dialogs.py:1310 msgid "Artists" msgstr "" #: gajim/dialogs.py:1314 msgid "Last but not least" msgstr "" #: gajim/dialogs.py:1315 #, fuzzy msgid "we would like to thank all the package maintainers." msgstr "Nós gostaríamos de agradecer todos os mantedores do pacote." #: gajim/dialogs.py:1316 #, fuzzy msgid "Thanks" msgstr "Agradecido" #: gajim/dialogs.py:1318 msgid "translator-credits" msgstr "" "Alfredo Jr. - Junix \n" "Juracy Filho \n" "Djavan Fagundes \n" "Og Maciel " #: gajim/dialogs.py:1503 #, fuzzy, python-format msgid "Dictionary for language \"%s\" not available" msgstr "O dicionário para o idioma %s não está disponível" #: gajim/dialogs.py:1504 #, fuzzy, python-format msgid "" "You have to install the dictionary \"%s\" to use spellchecking, or choose " "another language by setting the speller_language option.\n" "\n" "Highlighting misspelled words feature will not be used" msgstr "" "Você precisa instalar o dicionário %s para usar a correção ortográfica ou " "selecionar outro idioma definindo a opção speller_language.\n" "\n" "O recurso de destacar palavras grafadas incorretamente não será usado" #: gajim/dialogs.py:1851 gajim/dialogs.py:1866 gajim/gui_interface.py:1511 #: gajim/gui_interface.py:1553 msgid "Insecure connection" msgstr "Conexão não-segura" #: gajim/dialogs.py:1852 #, fuzzy, python-format msgid "" "You are about to connect to the account %(account)s (%(server)s) insecurely. " "This means conversations will not be encrypted, and is strongly " "discouraged.\n" "Are you sure you want to do that?" msgstr "" "Você está enviando sua senha em uma conexão não-segura. Você deve instalar o " "PyOpenSSL para prevenir isto. Você tem certeza que quer fazer isso?" #: gajim/dialogs.py:1857 gajim/gui_interface.py:1515 #: gajim/gui_interface.py:1556 msgid "Yes, I really want to connect insecurely" msgstr "Sim, eu realmente quero me conectar de modo não-seguro" #: gajim/dialogs.py:1858 msgid "Gajim will NOT connect unless you check this box" msgstr "" #: gajim/dialogs.py:1859 gajim/groupchat_control.py:2335 #: gajim/roster_window.py:2897 gajim/roster_window.py:3529 #: gajim/roster_window.py:4282 gajim/message_window.py:247 #: gajim/gui_interface.py:725 gajim/gui_interface.py:1516 #: gajim/gui_interface.py:1557 #, fuzzy msgid "_Do not ask me again" msgstr "_Não me pergunte novamente" #: gajim/dialogs.py:1957 msgid "_Resume" msgstr "" #: gajim/dialogs.py:1965 msgid "Re_place" msgstr "" #: gajim/dialogs.py:2168 gajim/config.py:2169 #: gajim/command_system/implementation/standard.py:261 msgid "Invalid nickname" msgstr "Apelido inválido" #: gajim/dialogs.py:2169 #, fuzzy msgid "The nickname contains invalid characters." msgstr "O apelido possui caracteres não permitidos." #: gajim/dialogs.py:2291 msgid "Subscription Request" msgstr "Solicitação de inscrição" #: gajim/dialogs.py:2300 #, python-format msgid "Subscription request for account %(account)s from %(jid)s" msgstr "Solicitação de inscrição para conta %(account)s de %(jid)s" #: gajim/dialogs.py:2303 #, python-format msgid "Subscription request from %s" msgstr "Solicitação de inscrição de %s" #: gajim/dialogs.py:2375 gajim/data/gui/join_groupchat_window.ui:312 #, fuzzy msgid "Join Groupchat" msgstr "Ingressar numa conferência" #: gajim/dialogs.py:2531 #, fuzzy msgid "Invalid Room" msgstr "Sala inválida" #: gajim/dialogs.py:2532 msgid "Please choose a room" msgstr "" #: gajim/dialogs.py:2544 gajim/dialogs.py:2551 msgid "Invalid Nickname" msgstr "Apelido inválido" #: gajim/dialogs.py:2545 #, fuzzy msgid "Please choose a nickname" msgstr "Crie um novo tema com o nome que você desejar." #: gajim/dialogs.py:2557 gajim/dialogs.py:3516 gajim/config.py:2453 #: gajim/dialog_messages.py:37 gajim/dialog_messages.py:42 msgid "Invalid JID" msgstr "JID inválido:" #: gajim/dialogs.py:2563 gajim/gui_interface.py:1850 msgid "You can not join a group chat unless you are connected." msgstr "" "Você não pode ingressar em uma sala de conferência até que esteja conectado." #: gajim/dialogs.py:2617 gajim/dialogs.py:2628 #, fuzzy msgid "Wrong server" msgstr "URI incorreta" #: gajim/dialogs.py:2618 gajim/dialogs.py:2629 #, fuzzy, python-format msgid "%s is not a groupchat server" msgstr "Isto não é uma conferência" #: gajim/dialogs.py:2651 msgid "Without a connection, you can not synchronise your contacts." msgstr "Sem uma conexão, você pode não sincronizar seus contatos." #: gajim/dialogs.py:2662 gajim/dialogs.py:2733 gajim/dialogs.py:3851 #: gajim/history_window.py:100 gajim/disco.py:865 gajim/disco.py:1693 #: gajim/disco.py:1978 msgid "Name" msgstr "Nome" #: gajim/dialogs.py:2665 gajim/data/gui/join_groupchat_window.ui:214 msgid "Server" msgstr "Servidor" #: gajim/dialogs.py:2701 msgid "This account is not connected to the server" msgstr "Esta conta não está conectada ao servidor" #: gajim/dialogs.py:2702 msgid "You cannot synchronize with an account unless it is connected." msgstr "Você não pode sincronizar com uma conta a menos que esteja conectado." #: gajim/dialogs.py:2731 msgid "Synchronise" msgstr "Sincronizar" #: gajim/dialogs.py:2794 #, fuzzy msgid "Start new Conversation" msgstr "Conversação continuada" #: gajim/dialogs.py:3052 #, fuzzy msgid "New Groupchat" msgstr "Nova conferência" #: gajim/dialogs.py:3054 #, fuzzy msgid "New Contact" msgstr "Adicionar novo contato" #: gajim/dialogs.py:3106 msgid "Without a connection, you can not change your password." msgstr "Você deve estar conectado para mudar sua senha." #: gajim/dialogs.py:3126 msgid "Invalid password" msgstr "Senha inválida" #: gajim/dialogs.py:3126 msgid "You must enter a password." msgstr "Você deve entrar com uma senha." #: gajim/dialogs.py:3130 msgid "Passwords do not match" msgstr "Senhas não conferem" #: gajim/dialogs.py:3131 msgid "The passwords typed in both fields must be identical." msgstr "As senhas digitadas em ambos os campos devem ser idênticas." #: gajim/dialogs.py:3169 gajim/notify.py:91 #: gajim/common/connection_handlers_events.py:2821 msgid "Contact Signed In" msgstr "Contato conectou" #: gajim/dialogs.py:3171 gajim/notify.py:91 #: gajim/common/connection_handlers_events.py:2827 msgid "Contact Signed Out" msgstr "Contato desconectou" #: gajim/dialogs.py:3173 gajim/notify.py:92 gajim/notify.py:105 #: gajim/common/connection_handlers_events.py:2641 msgid "New Message" msgstr "Nova mensagem" #: gajim/dialogs.py:3173 gajim/notify.py:92 gajim/notify.py:105 #: gajim/common/connection_handlers_events.py:2623 msgid "New Single Message" msgstr "Nova mensagem" #: gajim/dialogs.py:3174 gajim/notify.py:92 gajim/notify.py:106 #: gajim/common/connection_handlers_events.py:2629 msgid "New Private Message" msgstr "Enviar mensagem privada" #: gajim/dialogs.py:3174 msgid "New E-mail" msgstr "Novo e-mail" #: gajim/dialogs.py:3176 gajim/gui_interface.py:926 gajim/notify.py:93 msgid "File Transfer Request" msgstr "Solicitação de transferência de arquivos" #: gajim/dialogs.py:3178 gajim/gui_interface.py:861 gajim/gui_interface.py:891 #: gajim/notify.py:94 msgid "File Transfer Error" msgstr "Erro na transferência de arquivos" #: gajim/dialogs.py:3180 gajim/gui_interface.py:1030 #: gajim/gui_interface.py:1059 gajim/gui_interface.py:1080 gajim/notify.py:94 msgid "File Transfer Completed" msgstr "Transferência do arquivo completa" #: gajim/dialogs.py:3181 gajim/gui_interface.py:1034 #: gajim/gui_interface.py:1063 gajim/gui_interface.py:1084 gajim/notify.py:95 msgid "File Transfer Stopped" msgstr "Transferência do arquivo parada" #: gajim/dialogs.py:3183 gajim/dialogs.py:4748 gajim/chat_control.py:1647 #: gajim/gui_interface.py:663 gajim/notify.py:95 msgid "Groupchat Invitation" msgstr "Convite para conferência" #: gajim/dialogs.py:3185 gajim/notify.py:93 #: gajim/common/connection_handlers_events.py:2815 msgid "Contact Changed Status" msgstr "O contato alterou seu status" #: gajim/dialogs.py:3404 #, python-format msgid "Single Message using account %s" msgstr "Mensagem simples usando conta %s" #: gajim/dialogs.py:3406 #, python-format msgid "Single Message in account %s" msgstr "Mensagem simples na conta %s" #: gajim/dialogs.py:3408 msgid "Single Message" msgstr "Mensagem simples" #: gajim/dialogs.py:3411 #, python-format msgid "Send %s" msgstr "Enviar %s" #: gajim/dialogs.py:3434 #, python-format msgid "Received %s" msgstr "Recebido %s" #: gajim/dialogs.py:3457 #, python-format msgid "Form %s" msgstr "Formulário %s" #: gajim/dialogs.py:3485 gajim/dialogs.py:3672 msgid "Connection not available" msgstr "Conexão não disponível" #: gajim/dialogs.py:3486 gajim/dialogs.py:3673 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Por favor, tenha certeza que você está conectado com \"%s\"." #: gajim/dialogs.py:3517 gajim/dialog_messages.py:43 #, python-format msgid "It is not possible to send a message to %s, this JID is not valid." msgstr "Não é possível enviar uma mensagem para %s, este não é um JID válido." #: gajim/dialogs.py:3540 #, python-format msgid "RE: %s" msgstr "RE: %s" #: gajim/dialogs.py:3541 #, python-format msgid "%s wrote:\n" msgstr "%s escreveu:\n" #: gajim/dialogs.py:3589 gajim/data/gui/shortcuts_window.ui:113 #, fuzzy msgid "Clear" msgstr "Limpando" #: gajim/dialogs.py:3594 #, fuzzy msgid "Filter" msgstr "Filtro:" #: gajim/dialogs.py:3599 #, fuzzy msgid "XML Input" msgstr "Entrada XML" #: gajim/dialogs.py:3603 #, fuzzy msgid "Send" msgstr "_Enviar" #: gajim/dialogs.py:3794 msgid "add" msgstr "adicionar" #: gajim/dialogs.py:3794 msgid "modify" msgstr "modificar" #: gajim/dialogs.py:3795 msgid "remove" msgstr "remover" #: gajim/dialogs.py:3824 #, python-format msgid "" "%(jid)s would like you to %(action)s some contacts in your " "roster." msgstr "" "%(jid)s gostaria que você %(action)s alguns contatos na sua " "lista." #: gajim/dialogs.py:3840 gajim/dialogs.py:3886 gajim/accounts_window.py:44 msgid "Add" msgstr "Adicionar" #: gajim/dialogs.py:3842 gajim/dialogs.py:3917 msgid "Modify" msgstr "Modificar" #: gajim/dialogs.py:3844 gajim/dialogs.py:3941 msgid "Delete" msgstr "Deletar" #: gajim/dialogs.py:3854 msgid "Groups" msgstr "Grupos" #: gajim/dialogs.py:3962 #, python-format msgid "%s suggested me to add you in my roster." msgstr "%s me sugeriu adicionar você à minha lista." #: gajim/dialogs.py:3976 #, fuzzy, python-format msgid "Added %d contact" msgid_plural "Added %d contacts" msgstr[0] "Adicionados %s contatos" msgstr[1] "Adicionados %s contatos" #: gajim/dialogs.py:4014 #, fuzzy, python-format msgid "Removed %d contact" msgid_plural "Removed %d contacts" msgstr[0] "Removidos %s contatos" msgstr[1] "Removidos %s contatos" #: gajim/dialogs.py:4040 #, python-format msgid "Archiving Preferences for %s" msgstr "" #: gajim/dialogs.py:4078 msgid "Success!" msgstr "" #: gajim/dialogs.py:4078 #, fuzzy msgid "Your Archiving Preferences have been saved!" msgstr "_Preferências" #: gajim/dialogs.py:4094 msgid "We got no response from the Server" msgstr "" #: gajim/dialogs.py:4096 #, fuzzy msgid "We received an error: {}" msgstr "O serviço retornou um erro." #: gajim/dialogs.py:4100 #, fuzzy msgid "Error!" msgstr "Erro" #: gajim/dialogs.py:4159 #, fuzzy msgid "Add JID" msgstr "Jabber ID" #: gajim/dialogs.py:4232 #, python-format msgid "Privacy List %s" msgstr "Lista de privacidade %s" #: gajim/dialogs.py:4236 #, python-format msgid "Privacy List for %s" msgstr "Lista de privacidade para %s" #: gajim/dialogs.py:4238 gajim/data/gui/privacy_list_window.ui:47 msgid "Privacy List" msgstr "Lista de privacidade" #: gajim/dialogs.py:4309 #, python-format msgid "Order: %(order)s, action: %(action)s, type: %(type)s, value: %(value)s" msgstr "Ordem: %(order)s, ação: %(action)s tipo: %(type)s, valor: %(value)s" #: gajim/dialogs.py:4314 #, python-format msgid "Order: %(order)s, action: %(action)s" msgstr "Ordem: %(order)s, ação: %(action)s" #: gajim/dialogs.py:4368 msgid "Edit a rule" msgstr "Editar uma regra" #: gajim/dialogs.py:4480 msgid "Add a rule" msgstr "Adicionar uma regra" #: gajim/dialogs.py:4581 #, python-format msgid "Privacy Lists for %s" msgstr "Lista de privacidade para %s" #: gajim/dialogs.py:4677 msgid "Invalid List Name" msgstr "Nome de lista inválido" #: gajim/dialogs.py:4678 msgid "You must enter a name to create a privacy list." msgstr "Você deve digitar um nome para criar uma lista de privacidade." #: gajim/dialogs.py:4714 msgid "You are invited to a groupchat" msgstr "Você foi convidado para uma conferência" #: gajim/dialogs.py:4717 msgid "$Contact has invited you to join a discussion" msgstr "$Contact convidou você para ingressar em uma discussão" #: gajim/dialogs.py:4719 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "$Contact convidou você para entrar na conferência %(room_jid)s" #: gajim/dialogs.py:4728 #, python-format msgid "Comment: %s" msgstr "Comentário: %s" #: gajim/dialogs.py:4730 msgid "Do you want to accept the invitation?" msgstr "Você quer aceitar este convite?" #: gajim/dialogs.py:4746 msgid "Reason (if you decline):" msgstr "" #: gajim/dialogs.py:4795 msgid "Choose Client Cert #PCKS12" msgstr "" #: gajim/dialogs.py:4811 gajim/accounts_window.py:657 msgid "PKCS12 Files" msgstr "" #: gajim/dialogs.py:4837 msgid "Choose Sound" msgstr "Escolher som" #: gajim/dialogs.py:4853 msgid "Wav Sounds" msgstr "Sons wav" #: gajim/dialogs.py:4883 msgid "Choose Image" msgstr "Escolha imagem" #: gajim/dialogs.py:4901 msgid "Images" msgstr "Imagens" #: gajim/dialogs.py:4972 #, fuzzy msgid "Choose Archive" msgstr "Escolha imagem" #: gajim/dialogs.py:4991 #, fuzzy msgid "Zip files" msgstr "Todos os arquivos" #: gajim/dialogs.py:5017 #, python-format msgid "When %s becomes:" msgstr "Quando %s chega:" #: gajim/dialogs.py:5019 #, python-format msgid "Adding Special Notification for %s" msgstr "Adicionando notificação especial para %s" #: gajim/dialogs.py:5259 msgid "an audio and video" msgstr "um áudio e vídeo" #: gajim/dialogs.py:5261 msgid "an audio" msgstr "um áudio" #: gajim/dialogs.py:5263 msgid "a video" msgstr "um video" #: gajim/dialogs.py:5267 #, python-format msgid "" "%(contact)s wants to start %(type)s session with you. Do you want to answer " "the call?" msgstr "" "O %(contact)s quer iniciar uma sessão %(type)s com você. Você quer " "responder a chamada?" #: gajim/dialogs.py:5372 gajim/dialogs.py:5408 #, fuzzy, python-format msgid "Certificate for account %s" msgstr "para conta %s" #: gajim/dialogs.py:5372 #, python-format msgid "" "Issued to:\n" "Common Name (CN): %(scn)s\n" "Organization (O): %(sorg)s\n" "Organizationl Unit (OU): %(sou)s\n" "Serial Number: %(sn)s\n" "\n" "Issued by:\n" "Common Name (CN): %(icn)s\n" "Organization (O): %(iorg)s\n" "Organizationl Unit (OU): %(iou)s\n" "\n" "Validity:\n" "Issued on: %(io)s\n" "Expires on: %(eo)s\n" "\n" "Fingerprint\n" "SHA-1 Fingerprint: %(sha1)s\n" "\n" "SHA256 Fingerprint: %(sha256)s\n" msgstr "" #: gajim/dialogs.py:5419 gajim/gui_interface.py:1405 #, fuzzy, python-format msgid "SSL Certificate Verification for %s" msgstr "Erro de certificado SSL" #: gajim/dialogs.py:5420 gajim/dialogs.py:5437 msgid "View cert…" msgstr "" #: gajim/dialogs.py:5453 gajim/data/gui/application_menu.ui:32 #, fuzzy msgid "File Transfer" msgstr "Transferência de arquivos" #: gajim/dialogs.py:5477 msgid "Requesting HTTP Upload Slot..." msgstr "" #: gajim/dialogs.py:5481 msgid "Uploading file via HTTP File Upload..." msgstr "" #: gajim/dialogs.py:5485 #, fuzzy msgid "Encrypting file..." msgstr "Criptografia desabilitada" #: gajim/groupchat_control.py:193 gajim/groupchat_control.py:1839 #, python-format msgid "%(nick)s is now known as %(new_nick)s" msgstr "%(nick)s agora é conhecido como %(new_nick)s" #: gajim/groupchat_control.py:219 gajim/groupchat_control.py:1988 #: gajim/history_window.py:550 gajim/common/connection_handlers_events.py:2811 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s agora está %(status)s" #: gajim/groupchat_control.py:248 msgid "Sending private message failed" msgstr "Falha ao enviar uma mensagem privada" #: gajim/groupchat_control.py:250 #, python-format msgid "You are no longer in group chat \"%(room)s\" or \"%(nick)s\" has left." msgstr "" "Você não está mais na sala da conversa \"%(room)s\" ou \"%(nick)s\" saiu." #: gajim/groupchat_control.py:640 gajim/chat_control.py:326 #: gajim/chat_control.py:330 msgid "HTTP File Upload" msgstr "" #: gajim/groupchat_control.py:642 #, fuzzy msgid "HTTP File Upload not supported by your server" msgstr "O armazenamento de metacontatos não é suportado pelo seu servidor" #: gajim/groupchat_control.py:662 gajim/groupchat_control.py:2370 msgid "Changing Subject" msgstr "Mudando assunto" #: gajim/groupchat_control.py:663 gajim/groupchat_control.py:2371 msgid "Please specify the new subject:" msgstr "Por favor, especifique o novo assunto:" #: gajim/groupchat_control.py:670 msgid "Changing Nickname" msgstr "Mudando apelido" #: gajim/groupchat_control.py:671 msgid "Please specify the new nickname you want to use:" msgstr "Por favor, especifique o novo apelido que você quer usar:" #: gajim/groupchat_control.py:688 #, fuzzy msgid "Invalid group chat JID" msgstr "Jabber ID da conferência inválido:" #: gajim/groupchat_control.py:689 #, fuzzy msgid "The group chat JID has not allowed characters." msgstr "O Jabber ID da conferência possui caracteres não permitidos." #: gajim/groupchat_control.py:699 #, python-format msgid "Destroying %s" msgstr "Excluindo %s" #: gajim/groupchat_control.py:700 #, fuzzy msgid "" "You are going to remove this room permanently.\n" "You may specify a reason below:" msgstr "" "Você está prestes a excluir definitivamente esta sala.\n" "Você deve especificar uma justificativa abaixo:" #: gajim/groupchat_control.py:702 msgid "You may also enter an alternate venue:" msgstr "Você também pode entrar com um ponto de encontro alternativo:" #: gajim/groupchat_control.py:880 msgid "Insert Nickname" msgstr "Inserir apelido" #: gajim/groupchat_control.py:1062 gajim/chat_control.py:803 msgid "and authenticated" msgstr "e autenticada" #: gajim/groupchat_control.py:1066 gajim/chat_control.py:807 msgid "and NOT authenticated" msgstr "e NÃO autenticada" #: gajim/groupchat_control.py:1070 gajim/chat_control.py:811 #, fuzzy, python-format msgid "%(type)s encryption is active %(authenticated)s." msgstr "" "Criptografia%(type)s %(status)s ativa %(authenticated)s.\n" "Sua conversa %(logged)s está sendo gravada." #: gajim/groupchat_control.py:1113 msgid "Conversation with " msgstr "Conversação com " #: gajim/groupchat_control.py:1115 msgid "Continued conversation" msgstr "Conversação continuada" #: gajim/groupchat_control.py:1473 #, fuzzy, python-format msgid "%(nick)s has set the subject to %(subject)s" msgstr "%(jid)s alterou o assunto para %(subject)s" #: gajim/groupchat_control.py:1496 gajim/groupchat_control.py:1781 msgid "Any occupant is allowed to see your full JID" msgstr "Algum ocupante tem permissão de ver o seu JID inteiro" #: gajim/groupchat_control.py:1499 #, fuzzy msgid "Room now shows unavailable members" msgstr "A sala agora exibe membros indisponíveis" #: gajim/groupchat_control.py:1501 #, fuzzy msgid "Room now does not show unavailable members" msgstr "a sala agora não mostra membros indisponíveis" #: gajim/groupchat_control.py:1503 msgid "A setting not related to privacy has been changed" msgstr "" #: gajim/groupchat_control.py:1507 msgid "Room logging is now enabled" msgstr "A gravação das conversas da sala está ativo agora" #: gajim/groupchat_control.py:1509 msgid "Room logging is now disabled" msgstr "A gravação das conversas da sala está desligado agora" #: gajim/groupchat_control.py:1511 msgid "Room is now non-anonymous" msgstr "Agora a sala é não-anônima" #: gajim/groupchat_control.py:1514 msgid "Room is now semi-anonymous" msgstr "Agora a sala é semi-anônima" #: gajim/groupchat_control.py:1517 #, fuzzy msgid "Room is now fully anonymous" msgstr "Agora a sala é totalmente anônima" #: gajim/groupchat_control.py:1557 gajim/chat_control.py:1268 #, python-format msgid "Pong! (%s s.)" msgstr "Pong! (%s s.)" #: gajim/groupchat_control.py:1774 gajim/groupchat_control.py:2398 #: gajim/roster_window.py:3129 gajim/gui_interface.py:621 #, fuzzy, python-format msgid "%(jid)s has been invited in this room" msgstr "%(nick)s foi removido da sala (%(reason)s)" #: gajim/groupchat_control.py:1786 msgid "Room logging is enabled" msgstr "A gravação das conversas da sala está ligado" #: gajim/groupchat_control.py:1788 msgid "A new room has been created" msgstr "Uma nova sala foi criada" #: gajim/groupchat_control.py:1791 msgid "The server has assigned or modified your roomnick" msgstr "O servidor atribuiu ou modificou o apelido da sua sala" #: gajim/groupchat_control.py:1797 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s foi chutado: %(reason)s" #: gajim/groupchat_control.py:1800 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(nick)s foi chutado por %(who)s: %(reason)s" #: gajim/groupchat_control.py:1809 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s foi banido: %(reason)s" #: gajim/groupchat_control.py:1812 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(nick)s foi banido por %(who)s: %(reason)s" #: gajim/groupchat_control.py:1823 gajim/groupchat_control.py:1907 #, python-format msgid "You are now known as %s" msgstr "Você agora é conhecido como %s" #: gajim/groupchat_control.py:1861 gajim/groupchat_control.py:1866 #: gajim/groupchat_control.py:1872 #, python-format msgid "%(nick)s has been removed from the room (%(reason)s)" msgstr "%(nick)s foi removido da sala (%(reason)s)" #: gajim/groupchat_control.py:1863 msgid "affiliation changed" msgstr "filiação alterada" #: gajim/groupchat_control.py:1868 msgid "room configuration changed to members-only" msgstr "a configuração da sala mudou para aceitar apenas membros" #: gajim/groupchat_control.py:1874 msgid "system shutdown" msgstr "desligamento do sistema" #: gajim/groupchat_control.py:1928 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s by %(actor)s" msgstr "" "** A afiliação de %(nick)s foi alterada para %(affiliation)s por %(actor)s" #: gajim/groupchat_control.py:1932 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s" msgstr "** A afiliação de %(nick)s foi alterado para %(affiliation)s" #: gajim/groupchat_control.py:1947 #, python-format msgid "** Role of %(nick)s has been set to %(role)s by %(actor)s" msgstr "** O cargo de %(nick)s foi definido para %(role)s por %(actor)s" #: gajim/groupchat_control.py:1951 #, python-format msgid "** Role of %(nick)s has been set to %(role)s" msgstr "** O cargo de %(nick)s foi definido para %(role)s" #: gajim/groupchat_control.py:1981 #, python-format msgid "%s has left" msgstr "%s saiu da sala" #: gajim/groupchat_control.py:1986 #, python-format msgid "%s has joined the group chat" msgstr "%s entrou na conferência" #: gajim/groupchat_control.py:2329 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Você tem certeza que quer deixar a conferência \"%s\"?" #: gajim/groupchat_control.py:2331 msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "Se você fechar esta janela, será desconectado desta conferência." #: gajim/groupchat_control.py:2550 #, python-format msgid "Kicking %s" msgstr "Chutando %s" #: gajim/groupchat_control.py:2551 gajim/groupchat_control.py:2847 msgid "You may specify a reason below:" msgstr "Você deve especificar uma razão abaixo:" #: gajim/groupchat_control.py:2846 #, python-format msgid "Banning %s" msgstr "Banindo %s" #: gajim/chat_control.py:328 gajim/chat_control.py:332 #, fuzzy msgid "Jingle File Transfer" msgstr "Transferência de arquivos" #: gajim/chat_control.py:334 #, fuzzy msgid "No File Transfer available" msgstr "Transferência de arquivos" #: gajim/chat_control.py:395 msgid "Show a list of formattings" msgstr "Exibe uma lista de formatações" #: gajim/chat_control.py:399 msgid "Formatting is not available so long as GPG is active" msgstr "" #: gajim/chat_control.py:402 #, fuzzy msgid "This contact does not support HTML" msgstr "Este contato não suporta transferência de arquivo." #: gajim/chat_control.py:514 #, python-format msgid "%(type)s state : %(state)s, reason: %(reason)s" msgstr "%(type)s estado: %(state)s, razão: %(reason)s" #: gajim/chat_control.py:655 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s da conferência %(room_name)s" #: gajim/chat_control.py:903 msgid "Session negotiation cancelled" msgstr "Negociação da sessão cancelada" #: gajim/chat_control.py:913 msgid "This session WILL be archived on server" msgstr "" #: gajim/chat_control.py:915 #, fuzzy msgid "This session WILL NOT be archived on server" msgstr "A sessão NÃO SERÁ gravada" #: gajim/chat_control.py:924 msgid "This session is encrypted" msgstr "Esta sessão está criptografada" #: gajim/chat_control.py:927 msgid " and WILL be logged" msgstr " e SERÁ gravada" #: gajim/chat_control.py:929 msgid " and WILL NOT be logged" msgstr " e NÃO SERÁ gravada" #: gajim/chat_control.py:934 msgid "" "Remote contact's identity not verified. Click the shield button for more " "details." msgstr "" "Identidade do contato remoto não verificada. Clique no botão de proteção " "para mais detalhes." #: gajim/chat_control.py:936 msgid "E2E encryption disabled" msgstr "Criptografia E2E desabilitada" #: gajim/chat_control.py:1235 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Você acabou de receber uma nova mensagem de \"%s\"" #: gajim/chat_control.py:1237 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." msgstr "" "Se você fechar esta aba e o histórico estiver desabilitado, esta mensagem " "será perdida." #: gajim/chat_control.py:1380 #, python-format msgid "" "Subject: %(subject)s\n" "%(message)s" msgstr "" "Assunto: %(subject)s\n" "%(message)s" #: gajim/chat_control.py:1494 gajim/gui_interface.py:1197 #, python-format msgid "" "Unable to decrypt message from %s\n" "It may have been tampered with." msgstr "" "Não foi possível descriptografar a mensagem de %s\n" "Ela pode ter sido adulterada." #: gajim/chat_control.py:1532 #, python-format msgid "%(name)s is now %(status)s" msgstr "%(name)s agora está %(status)s" #: gajim/chat_control.py:1591 #, fuzzy msgid "File transfer" msgstr "Transferência de arquivos" #: gajim/chat_control.py:1594 #, fuzzy msgid "Size" msgstr "Tamanho: %s" #: gajim/chat_control.py:1596 #, fuzzy msgid "Accept" msgstr "Aceitar" #: gajim/chat_control.py:1650 gajim/disco.py:1753 msgid "_Join" msgstr "_Ingressar" #: gajim/chat_control.py:1669 gajim/roster_window.py:1991 #: gajim/gui_interface.py:1013 msgid "Remote contact stopped transfer" msgstr "O contato remoto parou a transferência" #: gajim/chat_control.py:1671 gajim/roster_window.py:1993 #: gajim/gui_interface.py:1016 msgid "Error opening file" msgstr "Erro abrindo arquivo" #: gajim/roster_window.py:273 gajim/roster_window.py:1074 msgid "Merged accounts" msgstr "Juntar contas" #: gajim/roster_window.py:857 gajim/roster_window.py:1757 #: gajim/roster_window.py:1759 gajim/roster_window.py:2602 #: gajim/roster_window.py:5125 gajim/message_window.py:519 #: gajim/common/contacts.py:133 gajim/common/commands.py:230 #: gajim/common/helpers.py:95 msgid "Groupchats" msgstr "Salas" #: gajim/roster_window.py:896 gajim/roster_window.py:1665 #: gajim/roster_window.py:1698 gajim/roster_window.py:1749 #: gajim/roster_window.py:1751 gajim/roster_window.py:1912 #: gajim/roster_window.py:2575 gajim/roster_window.py:5155 gajim/disco.py:130 #: gajim/disco.py:131 gajim/disco.py:1460 gajim/common/contacts.py:135 #: gajim/common/contacts.py:378 gajim/common/helpers.py:95 msgid "Transports" msgstr "Transportes" #: gajim/roster_window.py:2045 #, fuzzy msgid "Authorization sent" msgstr "Autorização foi enviada" #: gajim/roster_window.py:2046 #, fuzzy, python-format msgid "\"%s\" will now see your status." msgstr "Agora \"%s\" saberá seu status." #: gajim/roster_window.py:2069 msgid "Subscription request has been sent" msgstr "Solicitação de inscrição foi enviada" #: gajim/roster_window.py:2070 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Se \"%s\" aceitar esta solicitação, você saberá o status dele ou dela." #: gajim/roster_window.py:2084 #, fuzzy msgid "Authorization removed" msgstr "Autorização foi removida" #: gajim/roster_window.py:2085 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Agora \"%s\" você sempre o verá como offline." #: gajim/roster_window.py:2109 #, fuzzy msgid "OpenPGP is not usable" msgstr "GPG não é usável" #: gajim/roster_window.py:2110 #, python-format msgid "" "Gajim needs python-gnupg >= 0.3.8\n" "Beware there is an incompatible python package called gnupg.\n" "You will be connected to %s without OpenPGP." msgstr "" #: gajim/roster_window.py:2318 gajim/roster_window.py:3625 msgid "You are participating in one or more group chats" msgstr "Você está participando em uma ou mais conferências" #: gajim/roster_window.py:2319 gajim/roster_window.py:3626 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" msgstr "" "Mudando seu status para invisível resulta na desconexão daquelas " "conferências. Você tem certeza que quer ir invisível?" #: gajim/roster_window.py:2346 msgid "desync'ed" msgstr "não sincronizado" #: gajim/roster_window.py:2416 msgid "Really quit Gajim?" msgstr "Realmente sair do Gajim?" #: gajim/roster_window.py:2417 msgid "Are you sure you want to quit Gajim?" msgstr "Você tem certeza que deseja sair?" #: gajim/roster_window.py:2418 msgid "Always close Gajim" msgstr "Sempre fechar o Gajim" #: gajim/roster_window.py:2505 #, fuzzy msgid "You have running file transfers" msgstr "Cancelar transferência de arquivo" #: gajim/roster_window.py:2506 msgid "" "If you quit now, the file(s) being transferred will be stopped. Do you still " "want to quit?" msgstr "" #: gajim/roster_window.py:2537 gajim/roster_window.py:2828 msgid "You have unread messages" msgstr "Você tem mensagens não lidas" #: gajim/roster_window.py:2538 msgid "" "Messages will only be available for reading them later if you have history " "enabled and contact is in your roster." msgstr "" "Mensagens somente estarão disponíveis para leitura mais tarde se você tiver " "o histórico habilitado e contato na sua lista." #: gajim/roster_window.py:2829 msgid "You must read them before removing this transport." msgstr "Você precisa lê-los antes de remover este transporte." #: gajim/roster_window.py:2832 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Transporte \"%s\" será removido" #: gajim/roster_window.py:2833 msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." msgstr "" "Você não poderá mais enviar e receber mensagens dos contatos usando este " "transporte." #: gajim/roster_window.py:2836 msgid "Transports will be removed" msgstr "Os transportes serão removidos" #: gajim/roster_window.py:2841 #, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " "these transports: %s" msgstr "" "Você não poderá mais enviar e receber mensagens para contatos destes " "transportes: %s" #: gajim/roster_window.py:2892 msgid "You are about to block a contact. Are you sure you want to continue?" msgstr "" "Você está prestes a bloquear um contato. Tem certeza que quer continuar?" #: gajim/roster_window.py:2894 #, fuzzy msgid "" "This contact will see you offline and you will not receive messages it sends " "you." msgstr "" "Este contato irá ver você desconectado e você não irá receber mensagens que " "ele enviar para você." #: gajim/roster_window.py:2934 msgid "Rename Contact" msgstr "Renomear contato" #: gajim/roster_window.py:2935 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Entre com um novo apelido para o contato %s" #: gajim/roster_window.py:2942 msgid "Rename Group" msgstr "Renomear grupo" #: gajim/roster_window.py:2943 #, python-format msgid "Enter a new name for group %s" msgstr "Entre com um novo nome para o grupo %s" #: gajim/roster_window.py:2988 msgid "Remove Group" msgstr "Remover grupo" #: gajim/roster_window.py:2989 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Você quer remover o grupo %s da lista?" #: gajim/roster_window.py:2990 msgid "Also remove all contacts in this group from your roster" msgstr "Também remove todos os contatos neste grupo da sua lista" #: gajim/roster_window.py:3029 msgid "Assign OpenPGP Key" msgstr "Atribuir chave OpenPGP" #: gajim/roster_window.py:3030 msgid "Select a key to apply to the contact" msgstr "Selecione uma chave para atribuir ao contato" #: gajim/roster_window.py:3436 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Contato \"%s\" será removido de sua lista" #: gajim/roster_window.py:3438 #, python-format msgid "You are about to remove \"%(name)s\" (%(jid)s) from your roster.\n" msgstr "Você realmente deseja remover \"%(name)s\" (%(jid)s) da sua lista.\n" #: gajim/roster_window.py:3443 #, fuzzy msgid "" "By removing this contact you also remove authorization resulting in them " "always seeing you as offline." msgstr "" "Removendo estes contatos:%s\n" "você também remove a autorização fazendo com que eles sempre vejam você " "offline." #: gajim/roster_window.py:3449 msgid "Do you want to continue?" msgstr "Você quer continuar?" #: gajim/roster_window.py:3453 #, fuzzy msgid "" "By removing this contact you also by default remove authorization resulting " "in them always seeing you as offline." msgstr "" "Removendo este contato, você também, por padrão, removerá a autorização, " "resultando em ele ou ela sempre o verá offiline." #: gajim/roster_window.py:3456 msgid "I want this contact to know my status after removal" msgstr "Eu quero que este contato saiba meu status após a remoção" #: gajim/roster_window.py:3460 msgid "Contacts will be removed from your roster" msgstr "Os contatos serão removidos da sua lista" #: gajim/roster_window.py:3465 #, python-format msgid "" "By removing these contacts:%s\n" "you also remove authorization resulting in them always seeing you as offline." msgstr "" "Removendo estes contatos:%s\n" "você também remove a autorização fazendo com que eles sempre vejam você " "offline." #: gajim/roster_window.py:3523 #, fuzzy msgid "" "You are about to send a custom status. Are you sure you want to continue?" msgstr "" "Você está prestes a enviar um status customizado. Tem certeza que quer " "continuar?" #: gajim/roster_window.py:3525 #, fuzzy, python-format msgid "" "This contact will temporarily see you as %(status)s, but only until you " "change your status. Then they will see your global status." msgstr "" "Este contato irá temporariamente ver você como %(status)s, mas somente até " "você alterar o seu status. Então ele irá ver o seu status global." #: gajim/roster_window.py:3544 msgid "No account available" msgstr "Conta não disponível" #: gajim/roster_window.py:3545 msgid "You must create an account before you can chat with other contacts." msgstr "" "Você deve configurar uma conta antes de poder conversar com outros contatos." #: gajim/roster_window.py:3676 gajim/gui_interface.py:2065 #: gajim/dialog_messages.py:64 msgid "You cannot join a group chat while you are invisible" msgstr "Você não pode ingressar em uma sala enquanto estiver invisível" #: gajim/roster_window.py:4178 msgid "Metacontacts storage not supported by your server" msgstr "O armazenamento de metacontatos não é suportado pelo seu servidor" #: gajim/roster_window.py:4180 #, fuzzy msgid "" "Your server does not support storing metacontacts information. So this " "information will not be saved on next reconnection." msgstr "" "O seu servidor não suporta a gravação de informação de metacontatos, então " "essas informações não estarão salvas na próxima vez que você conectar." #: gajim/roster_window.py:4276 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "" "Você está prestes a criar um metacontato. Tem certeza que quer continuar?" #: gajim/roster_window.py:4278 #, fuzzy msgid "" "Metacontacts are a way to regroup several contacts in one line. Generally it " "is used when the same person has several XMPP accounts or transport accounts." msgstr "" "Os metacontatos são uma forma de reagrupar muitos contatos em uma linha. " "Geralmente isso é usado quando a mesma pessoa possui muitas contas de Jabber " "ou transportes." #: gajim/roster_window.py:4400 msgid "Invalid file URI:" msgstr "Arquivo URI inválido:" #: gajim/roster_window.py:4412 #, python-format msgid "Do you want to send this file to %s:" msgid_plural "Do you want to send these files to %s:" msgstr[0] "Você quer enviar este arquivo para %s:" msgstr[1] "Você quer enviar estes arquivos para %s:" #: gajim/roster_window.py:4552 #, fuzzy, python-format msgid "Send %(from)s to %(to)s" msgstr "Enviar %s para %s" #: gajim/roster_window.py:4565 #, fuzzy, python-format msgid "Make %s first contact" msgstr "Fazer %s e %s metacontatos" #: gajim/roster_window.py:4570 #, fuzzy, python-format msgid "Make %(contact1)s and %(contact2)s metacontacts" msgstr "Fazer %s e %s metacontatos" #: gajim/roster_window.py:4951 gajim/roster_window.py:5049 msgid "_Change Status Message" msgstr "_Mudar mensagem de status" #: gajim/roster_window.py:4971 msgid "Publish Tune" msgstr "Publicar sintonia" #: gajim/roster_window.py:4982 #, fuzzy msgid "Publish Location" msgstr "Publicar sintonia" #: gajim/roster_window.py:4994 #, fuzzy msgid "Configure Services…" msgstr "Configurar serviços..." #: gajim/roster_window.py:5127 msgid "_Maximize All" msgstr "_Maximizar tudo" #: gajim/roster_window.py:5134 gajim/roster_window.py:5296 msgid "Send Group M_essage" msgstr "Enviar m_ensagem de grupo" #: gajim/roster_window.py:5141 msgid "To all users" msgstr "Para todos os usuários" #: gajim/roster_window.py:5145 msgid "To all online users" msgstr "Para todos os usuários conectados" #: gajim/roster_window.py:5157 gajim/roster_window.py:5302 #: gajim/data/gui/gc_occupants_menu.ui:110 #: gajim/data/gui/contact_context_menu.ui:36 msgid "In_vite to" msgstr "Con_vidar para" #: gajim/roster_window.py:5312 msgid "_Manage Contacts" msgstr "_Gerenciar contatos" #: gajim/roster_window.py:5318 #, fuzzy msgid "Edit _Groups…" msgstr "Editar _grupos" #: gajim/roster_window.py:5339 gajim/data/gui/filetransfers.ui:11 #: gajim/data/gui/remove_account_window.ui:137 msgid "_Remove" msgstr "_Remover" #: gajim/roster_window.py:5377 msgid "_Maximize" msgstr "_Maximizar" #: gajim/roster_window.py:5384 msgid "_Reconnect" msgstr "_Reconectar" #: gajim/roster_window.py:5389 gajim/data/gui/gc_control_popup_menu.ui:120 msgid "_Disconnect" msgstr "_Desconectar" #: gajim/roster_window.py:5405 gajim/data/gui/gc_occupants_menu.ui:170 #: gajim/data/gui/gc_control_popup_menu.ui:113 #: gajim/data/gui/contact_context_menu.ui:228 msgid "_History" msgstr "_Histórico" #: gajim/roster_window.py:5481 gajim/data/gui/application_menu.ui:86 msgid "History Manager" msgstr "Gerenciador de histórico" #: gajim/roster_window.py:5489 msgid "_Join New Group Chat" msgstr "_Ingressar em uma nova Conferência" #: gajim/gajim.py:74 #, fuzzy msgid "Show the application's version" msgstr "Usar ícone na bandeja (também conhecido por área de notificação)" #: gajim/gajim.py:77 #, fuzzy msgid "Show only critical errors" msgstr "Mostre somente na _lista" #: gajim/gajim.py:80 msgid "Separate profile files completely (even history db and plugins)" msgstr "" #: gajim/gajim.py:84 msgid "Print XML stanzas and other debug information" msgstr "" #: gajim/gajim.py:88 #, fuzzy msgid "Use defined profile in configuration directory" msgstr "Editor de configurações avançado" #: gajim/gajim.py:92 #, fuzzy msgid "Set configuration directory" msgstr "Configuração da sala" #: gajim/gajim.py:95 msgid "Configure logging system" msgstr "" #: gajim/gajim.py:98 #, fuzzy msgid "Show all warnings" msgstr "Exibir todos _eventos pendentes" #: gajim/gajim.py:101 msgid "Open IPython shell" msgstr "" #: gajim/gajim.py:104 msgid "Pops up a window with the next pending event" msgstr "Exibir uma janela popup com o próximo evento pendente" #: gajim/gajim.py:107 gajim/data/gui/shortcuts_window.ui:202 #, fuzzy msgid "Start a new chat" msgstr "Iniciar conversa" #: gajim/gajim.py:180 gajim/gui_interface.py:128 msgid "Database Error" msgstr "Erro na base de dados" #: gajim/history_sync.py:217 #, fuzzy msgid "How far back do you want to go?" msgstr "O que você quer fazer?" #: gajim/history_sync.py:222 msgid "One Month" msgstr "" #: gajim/history_sync.py:223 msgid "Three Months" msgstr "" #: gajim/history_sync.py:224 msgid "One Year" msgstr "" #: gajim/history_sync.py:225 msgid "Everything" msgstr "" #: gajim/history_sync.py:254 #, fuzzy msgid "Connecting..." msgstr "Conectando" #: gajim/history_sync.py:266 #, fuzzy, python-format msgid "%(received)s of %(max)s" msgstr "Transferência de arquivo de %(filename)s de %(name)s parou." #: gajim/history_sync.py:270 #, fuzzy, python-format msgid "Downloaded %s Messages" msgstr "Encaminhar mensagens não lidas" #: gajim/history_sync.py:290 #, python-brace-format msgid "" "\n" " Finshed synchronising your History.\n" " {received} Messages downloaded.\n" " " msgstr "" #: gajim/history_sync.py:297 msgid "" "\n" " Gajim is fully synchronised\n" " with the Archive.\n" " " msgstr "" #: gajim/history_sync.py:304 msgid "" "\n" " There is already a synchronisation in\n" " progress. Please try later.\n" " " msgstr "" #: gajim/config.py:150 gajim/config.py:156 gajim/config.py:616 #: gajim/data/gui/preferences_window.ui:68 #: gajim/data/gui/preferences_window.ui:85 msgid "Disabled" msgstr "Desabilitado" #: gajim/config.py:411 gajim/config.py:415 gajim/config.py:1942 msgid "Default" msgstr "Padrão" #: gajim/config.py:1128 msgid "status message title" msgstr "título da mensagem de status" #: gajim/config.py:1129 msgid "status message text" msgstr "texto da mensagem de status" #: gajim/config.py:1517 #, python-format msgid "Edit %s" msgstr "Editar %s" #: gajim/config.py:1519 #, python-format msgid "Register to %s" msgstr "Registro para %s" #: gajim/config.py:1555 msgid "Ban List" msgstr "Lista de banidos" #: gajim/config.py:1556 msgid "Member List" msgstr "Lista de membros" #: gajim/config.py:1556 msgid "Owner List" msgstr "Lista de proprietários" #: gajim/config.py:1557 msgid "Administrator List" msgstr "Lista de administradores" #: gajim/config.py:1631 msgid "Reason" msgstr "Razão" #: gajim/config.py:1638 msgid "Nick" msgstr "Apelido" #: gajim/config.py:1644 msgid "Role" msgstr "Cargo" #: gajim/config.py:1670 #, fuzzy msgid "Banning…" msgstr "Banindo..." #: gajim/config.py:1672 msgid "" "Whom do you want to ban?\n" "\n" msgstr "" "Quem você quer banir?\n" "\n" #: gajim/config.py:1674 #, fuzzy msgid "Adding Member…" msgstr "Adicionando membro..." #: gajim/config.py:1675 msgid "" "Whom do you want to make a member?\n" "\n" msgstr "" "Quem você quer fazer como membro?\n" "\n" #: gajim/config.py:1677 #, fuzzy msgid "Adding Owner…" msgstr "Adicionando proprietário..." #: gajim/config.py:1678 msgid "" "Whom do you want to make an owner?\n" "\n" msgstr "" "Quem você quer tornar um proprietário?\n" "\n" #: gajim/config.py:1680 #, fuzzy msgid "Adding Administrator…" msgstr "Adicionando administrador..." #: gajim/config.py:1681 msgid "" "Whom do you want to make an administrator?\n" "\n" msgstr "" "Quem você quer tornar um administrador?\n" "\n" #: gajim/config.py:1682 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" "2. user@domain (any resource matches).\n" "3. domain/resource (only that resource matches).\n" "4. domain (the domain itself matches, as does any user@domain,\n" "domain/resource, or address containing a subdomain)." msgstr "" "Pode ser uma dos seguintes:\n" "1. usuario@dominio/recurso (somente este recurso combina).\n" "2. usuario@dominio (qualquer recurso combina).\n" "3. domínio/recurso (somente este recurso combina).\n" "4. domínio (o domínio combina por si com qualquer usuario@dominio,\n" "domínio/recurso, ou endereço contendo um subdomínio." #: gajim/config.py:1783 #, python-format msgid "Removing %s account" msgstr "Removendo %s conta" #: gajim/config.py:1798 #, fuzzy msgid "Account is disabled" msgstr "Emoticons desabilitados" #: gajim/config.py:1799 msgid "To unregister from a server, account must be enabled." msgstr "" #: gajim/config.py:1813 gajim/gui_interface.py:314 gajim/gui_interface.py:748 msgid "Password Required" msgstr "Senha é obrigatória" #: gajim/config.py:1814 gajim/gui_interface.py:733 #, python-format msgid "Enter your password for account %s" msgstr "Entre com a senha para conta %s" #: gajim/config.py:1815 gajim/gui_interface.py:748 msgid "Save password" msgstr "Salvar senha" #: gajim/config.py:1826 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Conta \"%s\" está conectada ao servidor" #: gajim/config.py:1827 msgid "If you remove it, the connection will be lost." msgstr "Se você remover-lo, a conexão será perdida." #: gajim/config.py:1842 #, fuzzy, python-format msgid "Connection to server %s failed" msgstr "Falha na conexão com o proxy" #: gajim/config.py:1843 #, fuzzy msgid "What would you like to do?" msgstr "O que você quer fazer?" #: gajim/config.py:1844 #, fuzzy msgid "Remove only from Gajim" msgstr "Remover conta _somente do Gajim" #: gajim/config.py:1845 msgid "Don't remove anything. I'll try again later" msgstr "" #: gajim/config.py:1942 msgid "?print_status:All" msgstr "?exibir_status:Todos" #: gajim/config.py:1943 msgid "Enter and leave only" msgstr "Apenas entre e saia" #: gajim/config.py:1944 msgid "?print_status:None" msgstr "?exibir_status:Nenhum" #: gajim/config.py:2010 msgid "New Group Chat" msgstr "Nova conferência" #: gajim/config.py:2046 msgid "This bookmark has invalid data" msgstr "Este marcador tem dados inválidos" #: gajim/config.py:2047 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "" "Por favor, tenha certeza que preencheu os campos servidor e sala ou remova " "este marcador." #: gajim/config.py:2170 gajim/config.py:2186 gajim/config.py:2197 #: gajim/config.py:2225 msgid "Character not allowed" msgstr "Caractere não permitido" #: gajim/config.py:2185 gajim/config.py:2196 gajim/config.py:2475 msgid "Invalid server" msgstr "Servidor inválido" #: gajim/config.py:2224 msgid "Invalid room" msgstr "Sala inválida" #: gajim/config.py:2389 msgid "Account has been added successfully" msgstr "Conta foi adicionada com sucesso" #: gajim/config.py:2390 gajim/config.py:2396 msgid "" "You can set advanced account options by pressing the Advanced button, or " "later by choosing the Accounts menu item under the Edit menu from the main " "window." msgstr "" "Você pode configurar as opções avançadas da conta pressionando o botão " "avançado, ou mais tarde clicando em contas no menu editar da janela " "principal." #: gajim/config.py:2395 msgid "Your new account has been created successfully" msgstr "Sua nova conta foi criada com sucesso" #: gajim/config.py:2433 msgid "Invalid username" msgstr "Nome de usuário inválido" #: gajim/config.py:2435 msgid "You must provide a username to configure this account." msgstr "Você deve entrar com um nome para configurar esta conta." #: gajim/config.py:2476 msgid "Please provide a server on which you want to register." msgstr "Por favor, forneça um servidor no qual você queira se registrar." #: gajim/config.py:2499 msgid "Invalid entry" msgstr "Entrada inválida" #: gajim/config.py:2500 msgid "Custom port must be a port number." msgstr "A porta do proxy deve ser um número de porta." #: gajim/config.py:2532 gajim/gui_interface.py:1360 msgid "Certificate Already in File" msgstr "Certificado já está no arquivo" #: gajim/config.py:2533 gajim/gui_interface.py:1361 #, python-format msgid "This certificate is already in file %s, so it's not added again." msgstr "" "Este certificado já está no arquivo %s, então, ele não será adicionado " "novamente." #: gajim/config.py:2626 #, python-format msgid "" "Security Warning\n" "\n" "The authenticity of the %(hostname)s SSL certificate could be invalid.\n" "SSL Error: %(error)s\n" "Do you still want to connect to this server?" msgstr "" "Aviso se segurança\n" "\n" "A autenticidade do certificado SSL do %(hostname)s pode ser inválido.\n" "Erro do SSL: %(error)s\n" "Você ainda quer conectar com este servidor?" #: gajim/config.py:2632 #, fuzzy, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA-1 fingerprint of the certificate:\n" "%(sha1)s\n" "SHA-256 fingerprint of the certificate:\n" "%(sha256)s" msgstr "" "Adicionar este certificado na lista de certificados confiáveis.\n" "SHA1 fingerprint do certificado:\n" "%s" #: gajim/config.py:2666 gajim/config.py:2700 msgid "An error occurred during account creation" msgstr "Um erro ocorreu durante a criação da conta" #: gajim/config.py:2763 msgid "Account name is in use" msgstr "Nome de conta em uso" #: gajim/config.py:2764 msgid "You already have an account using this name." msgstr "Você já tem uma conta usando este nome." #: gajim/config.py:2896 msgid "PEP node was not removed" msgstr "O nó PEP não foi removido" #: gajim/config.py:2897 #, python-format msgid "PEP node %(node)s was not removed: %(message)s" msgstr "O nó PEP %(node)s não foi removido: %(message)s" #: gajim/config.py:2925 #, fuzzy, python-format msgid "Configure %s" msgstr "_Configurar" #: gajim/config.py:2942 gajim/plugins/gui.py:95 msgid "Active" msgstr "Ativo" #: gajim/config.py:2950 msgid "Event" msgstr "Evento" #: gajim/config.py:2984 #, fuzzy msgid "Attention Message Received" msgstr "Primeira mensagem recebida" #: gajim/config.py:2985 msgid "First Message Received" msgstr "Primeira mensagem recebida" #: gajim/config.py:2986 msgid "Next Message Received Focused" msgstr "Nova mensagem recebida com foco" #: gajim/config.py:2988 msgid "Next Message Received Unfocused" msgstr "Nova mensagem recebida sem foco" #: gajim/config.py:2989 msgid "Contact Connected" msgstr "Contato conectado" #: gajim/config.py:2990 msgid "Contact Disconnected" msgstr "Contato desconectou" #: gajim/config.py:2991 msgid "Message Sent" msgstr "Mensagem enviada" #: gajim/config.py:2992 msgid "Group Chat Message Highlight" msgstr "Mensagem destacada de conferência" #: gajim/config.py:2993 msgid "Group Chat Message Received" msgstr "Mensagem de conferência recebida" #: gajim/tooltips.py:240 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s dessa sala" #: gajim/tooltips.py:269 gajim/common/helpers.py:473 msgid "?Group Chat Contact Affiliation:None" msgstr "?Filiação do contato de conferência:Nenhuma" #: gajim/tooltips.py:271 gajim/common/helpers.py:479 msgid "Member" msgstr "Membro" #: gajim/tooltips.py:273 gajim/common/helpers.py:477 msgid "Administrator" msgstr "Administrador" #: gajim/tooltips.py:275 gajim/common/helpers.py:475 msgid "Owner" msgstr "Dono" #: gajim/tooltips.py:433 msgid " [blocked]" msgstr " [bloqueado]" #: gajim/tooltips.py:437 msgid " [minimized]" msgstr " [minimizado]" #: gajim/tooltips.py:609 msgid "Connected" msgstr "Conectado" #: gajim/tooltips.py:611 msgid "Disconnected" msgstr "Desconectado" #: gajim/tooltips.py:660 #, fuzzy msgid "?Noun:Download" msgstr "Download" #: gajim/tooltips.py:666 #, fuzzy msgid "?Noun:Upload" msgstr "Upload" #: gajim/tooltips.py:673 msgid "Type: " msgstr "Tipo: " #: gajim/tooltips.py:679 msgid "Transferred: " msgstr "Transferido: " #: gajim/tooltips.py:682 gajim/tooltips.py:699 msgid "Not started" msgstr "Não iniciado" #: gajim/tooltips.py:684 msgid "Stopped" msgstr "Parado" #: gajim/tooltips.py:686 gajim/tooltips.py:689 msgid "Completed" msgstr "Completo" #: gajim/tooltips.py:692 msgid "?transfer status:Paused" msgstr "?status da transferência:Parado" #: gajim/tooltips.py:695 msgid "Stalled" msgstr "Parado" #: gajim/tooltips.py:697 msgid "Transferring" msgstr "Transferindo" #: gajim/tooltips.py:700 msgid "Status: " msgstr "Status: " #: gajim/tooltips.py:732 gajim/common/helpers.py:389 #, fuzzy msgid "?user status:Available" msgstr "?status da transferência:Parado" #: gajim/tooltips.py:734 gajim/common/helpers.py:384 msgid "Free for Chat" msgstr "Livre para conversa" #: gajim/tooltips.py:736 gajim/common/commands.py:117 #: gajim/common/helpers.py:396 #: gajim/command_system/implementation/standard.py:138 msgid "Away" msgstr "Afastado" #: gajim/tooltips.py:738 gajim/common/helpers.py:374 msgid "Busy" msgstr "Ocupado" #: gajim/tooltips.py:740 gajim/common/helpers.py:379 msgid "Not Available" msgstr "Não disponível" #: gajim/tooltips.py:742 gajim/common/helpers.py:401 msgid "Offline" msgstr "Desconectado" #: gajim/advanced_configuration_window.py:88 msgid "Activated" msgstr "Ativado" #: gajim/advanced_configuration_window.py:88 msgid "Deactivated" msgstr "Desativado" #: gajim/advanced_configuration_window.py:90 msgid "Boolean" msgstr "Booleano" #: gajim/advanced_configuration_window.py:91 msgid "Integer" msgstr "Inteiro" #: gajim/advanced_configuration_window.py:92 msgid "Text" msgstr "Texto" #: gajim/advanced_configuration_window.py:93 #: gajim/data/gui/groupchat_control.ui:54 gajim/data/gui/chat_control.ui:334 msgid "Color" msgstr "Cor" #: gajim/advanced_configuration_window.py:104 msgid "Preference Name" msgstr "Nome da preferência" #: gajim/advanced_configuration_window.py:111 msgid "Value" msgstr "Valor" #: gajim/advanced_configuration_window.py:120 msgid "Type" msgstr "Tipo" #: gajim/advanced_configuration_window.py:176 msgid "(None)" msgstr "(Nada)" #: gajim/advanced_configuration_window.py:307 msgid "Hidden" msgstr "Escondido" #: gajim/logind_listener.py:58 msgid "Machine going to sleep" msgstr "" #: gajim/logind_listener.py:90 msgid "Disconnect from the network" msgstr "" #: gajim/history_window.py:339 #, python-format msgid "Conversation History with %s" msgstr "Histórico de conversação com %s" #: gajim/history_window.py:361 gajim/data/gui/history_window.ui:7 msgid "Conversation History" msgstr "Histórico de conversação" #: gajim/history_window.py:390 gajim/history_window.py:443 msgid "Disk Error" msgstr "Erro de disco" #: gajim/history_window.py:546 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s é agora %(status)s: %(status_msg)s" #: gajim/history_window.py:557 #, python-format msgid "Error: %s" msgstr "Erro: %s" #: gajim/history_window.py:559 msgid "Error" msgstr "Erro" #: gajim/history_window.py:561 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Status agora é: %(status)s: %(status_msg)s" #: gajim/history_window.py:564 #, python-format msgid "Status is now: %(status)s" msgstr "Status agora é: %(status)s" #: gajim/history_window.py:585 gajim/conversation_textview.py:1338 #, python-format msgid "Subject: %s\n" msgstr "Assunto: %s\n" #: gajim/statusicon.py:215 #, fuzzy msgid "_Change Status Message…" msgstr "_Mudar mensagem de status" #: gajim/statusicon.py:252 gajim/statusicon.py:302 gajim/statusicon.py:309 #, python-format msgid "using account %s" msgstr "usando conta %s" #: gajim/statusicon.py:319 #, fuzzy msgid "_Manage Bookmarks…" msgstr "Gerenciar marcadores" #: gajim/statusicon.py:332 #, fuzzy msgid "Hide _Roster" msgstr "na _lista" #: gajim/statusicon.py:336 msgid "Show _Roster" msgstr "Exibir _lista" #: gajim/statusicon.py:344 msgid "Hide this menu" msgstr "Esconder este menu" #: gajim/dataforms_widget.py:587 #, fuzzy msgid "Unable to load image" msgstr "Incapaz de carregar o módulo inativo" #: gajim/dataforms_widget.py:589 #, fuzzy, python-format msgid "Media type not supported: %s" msgstr "Sem suporte a invisibilidade" #: gajim/dataforms_widget.py:604 msgid "This field is required" msgstr "" #: gajim/dataforms_widget.py:658 msgid "new@jabber.id" msgstr "novo@jabber.id" #: gajim/dataforms_widget.py:661 gajim/dataforms_widget.py:663 #, python-format msgid "new%d@jabber.id" msgstr "novo%d@jabber.id" #: gajim/server_info.py:130 #, python-format msgid "%(days)s days, %(hours)s hours" msgstr "" #: gajim/server_info.py:187 gajim/accounts_window.py:537 #: gajim/accounts_window.py:638 #, fuzzy msgid "Hostname" msgstr "_Nome do computador:" #: gajim/server_info.py:188 #, fuzzy msgid "Server Software" msgstr "Recursos dos Servidores" #: gajim/server_info.py:189 #, fuzzy msgid "Server Uptime" msgstr "O servidor respondeu: %s" #: gajim/server_info.py:227 msgid "" "\n" "Disabled in config" msgstr "" #: gajim/disco.py:69 msgid "This service has not yet responded with detailed information" msgstr "Este serviço não respondeu ainda com informação detalhada" #: gajim/disco.py:70 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" msgstr "" "Este serviço não pode responder com informações detalhadas.\n" "É provável que esteja quebrado" #: gajim/disco.py:129 msgid "Others" msgstr "Outros" #: gajim/disco.py:133 msgid "Conference" msgstr "Conferência" #: gajim/disco.py:537 msgid "Without a connection, you can not browse available services" msgstr "Você deve estar conectado para visualizar os serviços disponíveis" #: gajim/disco.py:626 #, python-format msgid "Service Discovery using account %s" msgstr "Buscar serviços usando conta %s" #: gajim/disco.py:628 msgid "Service Discovery" msgstr "Buscar serviços" #: gajim/disco.py:732 msgid "The service could not be found" msgstr "O serviço não pode ser encontrado" #: gajim/disco.py:733 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." msgstr "" "Não existe serviço para o endereço que você entrou, ou não está respondendo. " "Verifique o endereço e tente novamente." #: gajim/disco.py:739 gajim/disco.py:1091 msgid "The service is not browsable" msgstr "Serviço não navegável" #: gajim/disco.py:740 msgid "This type of service does not contain any items to browse." msgstr "Este tipo de serviço não contém nenhum item para navegar." #: gajim/disco.py:781 gajim/disco.py:791 msgid "Invalid Server Name" msgstr "Nome do servidor inválido" #: gajim/disco.py:849 #, python-format msgid "Browsing %(address)s using account %(account)s" msgstr "Explorando %(address)s usando conta %(account)s" #: gajim/disco.py:896 #, fuzzy msgid "Browse" msgstr "_Navegar" #: gajim/disco.py:1092 msgid "This service does not contain any items to browse." msgstr "Este serviço não contém nenhum item para navegar." #: gajim/disco.py:1304 #, fuzzy msgid "Execute Command" msgstr "_Executar comando" #: gajim/disco.py:1308 gajim/disco.py:1466 msgid "Re_gister" msgstr "Re_gistrar" #: gajim/disco.py:1317 gajim/data/gui/join_groupchat_window.ui:186 #: gajim/data/gui/join_groupchat_window.ui:325 #, fuzzy msgid "Join" msgstr "_Ingressar" #: gajim/disco.py:1326 gajim/data/gui/search_window.ui:23 msgid "Search" msgstr "Buscar" #: gajim/disco.py:1464 msgid "_Edit" msgstr "_Editar" #: gajim/disco.py:1507 #, python-format msgid "Scanning %(current)d / %(total)d.." msgstr "Varrendo %(current)d / %(total)d.." #: gajim/disco.py:1703 msgid "Users" msgstr "Usuários" #: gajim/disco.py:1711 msgid "Description" msgstr "Descrição" #: gajim/disco.py:1719 msgid "Id" msgstr "Id" #: gajim/disco.py:1749 gajim/data/gui/gc_control_popup_menu.ui:99 msgid "_Bookmark" msgstr "Ma_rcadores" #: gajim/disco.py:1783 msgid "Bookmark already set" msgstr "Marcador já configurado" #: gajim/disco.py:1784 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "A sala \"%s\" já existe nos marcadores." #: gajim/disco.py:1794 msgid "Bookmark has been added successfully" msgstr "Marcador foi adicionado com sucesso" #: gajim/disco.py:1795 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "" "Você pode gerenciar seus marcadores pelo menu de ações na janela principal." #: gajim/disco.py:1987 msgid "Subscribed" msgstr "Inscrito" #: gajim/disco.py:1996 msgid "Node" msgstr "Nó" #: gajim/disco.py:2063 msgid "New post" msgstr "Nova postagem" #: gajim/disco.py:2069 msgid "_Subscribe" msgstr "_Inscrever" #: gajim/disco.py:2075 msgid "_Unsubscribe" msgstr "_Desinscrever" #: gajim/conversation_textview.py:329 msgid "" "Text below this line is what has been said since the\n" "last time you paid attention to this group chat" msgstr "" "O texto abaixo desta linha é o que foi dito desde a\n" "última vez onde você prestou a atenção a conferência" #: gajim/conversation_textview.py:550 msgid "_Quote" msgstr "_Frase" #: gajim/conversation_textview.py:558 #, python-format msgid "_Actions for \"%s\"" msgstr "_Ações para \"%s\"" #: gajim/conversation_textview.py:572 msgid "Read _Wikipedia Article" msgstr "Ler artigo da _Wikipedia" #: gajim/conversation_textview.py:577 msgid "Look it up in _Dictionary" msgstr "Procurar no _dicionário" #: gajim/conversation_textview.py:594 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "URL do dicionário não existe \"%s\" e isto não é WIKTIONARY" #: gajim/conversation_textview.py:608 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "URL de procura na web não existe \"%s\"" #: gajim/conversation_textview.py:611 msgid "Web _Search for it" msgstr "_Procura na web por isto" #: gajim/conversation_textview.py:617 msgid "Open as _Link" msgstr "Abrir como _link" #: gajim/conversation_textview.py:847 msgid "URL:" msgstr "" #: gajim/conversation_textview.py:1021 #, fuzzy msgid "Invalid URL" msgstr "JID inválido:" #: gajim/conversation_textview.py:1106 msgid "" "Message corrected. Original message:\n" "{}" msgstr "" #: gajim/conversation_textview.py:1250 #, fuzzy, python-format msgid "Yesterday" msgid_plural "%(nb_days)i days ago" msgstr[0] "Ontem" msgstr[1] "Há %i dias" #: gajim/message_textview.py:43 #, fuzzy msgid "Write a message.." msgstr "Enviar mensagem privada" #: gajim/message_window.py:245 msgid "You are going to close several tabs" msgstr "Você está prestes a fechar todas as abas" #: gajim/message_window.py:246 msgid "Do you really want to close them all?" msgstr "Você realmente deseja fechar todas?" #: gajim/message_window.py:517 #, fuzzy msgid "?Noun:Chats" msgstr "Conferências" #: gajim/message_window.py:521 msgid "Private Chats" msgstr "Conversas privadas" #: gajim/message_window.py:527 msgid "Messages" msgstr "Mensagens" #: gajim/gui_interface.py:158 gajim/gui_interface.py:329 #: gajim/gui_interface.py:338 gajim/gui_interface.py:345 #: gajim/gui_interface.py:349 gajim/gui_interface.py:352 #: gajim/gui_interface.py:360 msgid "Unable to join group chat" msgstr "Impossível ingressar na sala" #: gajim/gui_interface.py:159 #, fuzzy, python-format msgid "" "Your desired nickname in group chat\n" "%s\n" "is in use or registered by another occupant.\n" "Please specify another nickname below:" msgstr "" "O apelido que você deseja usar na sala %s está em uso ou registado por um " "outro ocupante.\n" "Por favor, especifique um outro apelido abaixo:" #: gajim/gui_interface.py:163 msgid "Always use this nickname when there is a conflict" msgstr "Sempre usar este apelido quando houver um conflito" #: gajim/gui_interface.py:181 msgid "Do you accept this request?" msgstr "Você aceita a solicitação?" #: gajim/gui_interface.py:183 #, python-format msgid "Do you accept this request on account %s?" msgstr "Você aceita essa requisição na conta %s?" #: gajim/gui_interface.py:186 #, fuzzy, python-format msgid "HTTP (%(method)s) Authorization for %(url)s (ID: %(id)s)" msgstr "Autorização HTTP (%(method)s) para %(url)s (id: %(id)s)" #: gajim/gui_interface.py:230 gajim/notify.py:96 msgid "Connection Failed" msgstr "Falha na conexão" #: gajim/gui_interface.py:315 #, python-format msgid "A Password is required to join the room %s. Please type it." msgstr "Uma senha é requerida para ingressar na sala %s. Por favor, digite-a." #: gajim/gui_interface.py:330 #, fuzzy, python-format msgid "%s is full" msgstr "Fonte" #: gajim/gui_interface.py:339 #, fuzzy, python-format msgid "You are banned from group chat %s." msgstr "Você está banido da sala %s." #: gajim/gui_interface.py:346 #, fuzzy, python-format msgid "Remote server %s does not exist." msgstr "A sala %s não existe." #: gajim/gui_interface.py:350 #, fuzzy, python-format msgid "Group chat %s does not exist." msgstr "A sala %s não existe." #: gajim/gui_interface.py:353 #, fuzzy msgid "Group chat creation is not permitted." msgstr "A criação de sala é restrita." #: gajim/gui_interface.py:355 #, fuzzy msgid "Unable to join groupchat" msgstr "Impossível ingressar na sala" #: gajim/gui_interface.py:356 #, fuzzy, python-format msgid "You must use your registered nickname in %s." msgstr "Seu nickname registado deve ser usado na sala %s." #: gajim/gui_interface.py:361 #, python-format msgid "You are not in the members list in groupchat %s." msgstr "Você não está na lista de membros da sala %s." #: gajim/gui_interface.py:455 gajim/gui_interface.py:459 #, python-format msgid "Error %(code)s: %(msg)s" msgstr "Erro %(code)s: %(msg)s" #: gajim/gui_interface.py:470 gajim/gui_interface.py:486 #: gajim/common/connection_handlers_events.py:1430 #, python-format msgid "error while sending %(message)s ( %(error)s )" msgstr "erro ao enviar %(message)s ( %(error)s )" #: gajim/gui_interface.py:513 gajim/notify.py:96 msgid "Subscription request" msgstr "Solicitação de inscrição" #: gajim/gui_interface.py:524 gajim/common/contacts.py:131 #: gajim/common/helpers.py:95 msgid "Observers" msgstr "Observadores" #: gajim/gui_interface.py:538 msgid "Authorization accepted" msgstr "Autorização aceita" #: gajim/gui_interface.py:539 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "O contato \"%s\" autorizou você para ver seu status." #: gajim/gui_interface.py:547 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Contato \"%s\" removeu sua inscrição" #: gajim/gui_interface.py:548 #, fuzzy msgid "" "You will always see them as offline.\n" "Do you want to remove them from your contact list?" msgstr "" "Você irá sempre ver ele ou ela como desconectado.\n" "Você quer removê-lo ou removê-la da sua lista de contatos?" #: gajim/gui_interface.py:570 gajim/notify.py:96 msgid "Unsubscribed" msgstr "Desinscrever" #: gajim/gui_interface.py:582 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Contato com \"%s\" não pode ser estabelecido" #: gajim/gui_interface.py:583 gajim/common/connection.py:1288 #: gajim/common/connection.py:1474 msgid "Check your connection or try again later." msgstr "Verifique sua conexão ou tente novamente mais tarde." #: gajim/gui_interface.py:641 #, python-format msgid "%(jid)s declined the invitation: %(reason)s" msgstr "" #: gajim/gui_interface.py:645 #, python-format msgid "%(jid)s declined the invitation" msgstr "" #: gajim/gui_interface.py:675 #, fuzzy msgid "" "You configured Gajim to use OpenPGP agent, but there is no OpenPGP agent " "running or it returned a wrong passphrase.\n" msgstr "" "Você configurou o Gajim para usar o agente do GPG, mas não há agente do GPG " "rodando ou então ele retornou uma frase secreta incorreta.\n" #: gajim/gui_interface.py:678 gajim/gui_interface.py:686 msgid "You are currently connected without your OpenPGP key." msgstr "Você está atualmente conectado sem sua chave OpenPGP." #: gajim/gui_interface.py:680 #, fuzzy msgid "Wrong passphrase" msgstr "Frase de acesso errada" #: gajim/gui_interface.py:685 #, fuzzy msgid "Wrong OpenPGP passphrase" msgstr "Frase de acesso errada" #: gajim/gui_interface.py:699 #, fuzzy msgid "Certificate Passphrase Required" msgstr "O certificado expirou" #: gajim/gui_interface.py:700 #, fuzzy, python-format msgid "Enter the certificate passphrase for account %s" msgstr "" "Entre com a frase de acesso da chave GPG %(keyid)s para conta (account " "%(account)s)." #: gajim/gui_interface.py:723 #, fuzzy msgid "Untrusted OpenPGP key" msgstr "Escolha sua chave OpenPGP" #: gajim/gui_interface.py:723 #, fuzzy msgid "" "The OpenPGP key used to encrypt this chat is not trusted. Do you really want " "to encrypt this message?" msgstr "" "A chave GPG usada para criptografar esta conversa não é confiável. Você " "realmente deseja criptografar esta mensagem?" #: gajim/gui_interface.py:769 msgid "" "Please copy / paste the refresh token from the website that has just been " "opened." msgstr "" #: gajim/gui_interface.py:772 msgid "Oauth2 Credentials" msgstr "" #: gajim/gui_interface.py:924 #, python-format msgid "%s wants to send you a file." msgstr "%s quer te enviar um arquivo." #: gajim/gui_interface.py:1021 gajim/gui_interface.py:1433 msgid "SSL certificate error" msgstr "Erro de certificado SSL" #: gajim/gui_interface.py:1038 #, fuzzy msgid "File Transfer Failed" msgstr "Transferência de arquivos" #: gajim/gui_interface.py:1060 #, fuzzy, python-format msgid "%(filename)s received from %(name)s." msgstr "Transferência de arquivo de %(filename)s de %(name)s parou." #: gajim/gui_interface.py:1064 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Transferência de arquivo de %(filename)s de %(name)s parou." #: gajim/gui_interface.py:1068 #, fuzzy, python-format msgid "File transfer of %(filename)s from %(name)s failed." msgstr "Transferência de arquivo de %(filename)s de %(name)s parou." #: gajim/gui_interface.py:1081 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "Você enviou com sucesso o %(filename)s para %(name)s." #: gajim/gui_interface.py:1085 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "Transferência de arquivo de %(filename)s para %(name)s parado." #: gajim/gui_interface.py:1089 #, fuzzy, python-format msgid "File transfer of %(filename)s to %(name)s failed." msgstr "Transferência de arquivo de %(filename)s para %(name)s parado." #: gajim/gui_interface.py:1153 #, fuzzy msgid "Choose file to send" msgstr "Escolha o arquivo para enviar..." #: gajim/gui_interface.py:1199 msgid "Unable to decrypt message" msgstr "Não foi possível descriptografar a mensagem" #: gajim/gui_interface.py:1211 msgid "Username Conflict" msgstr "Conflito de nome de usuário" #: gajim/gui_interface.py:1212 msgid "Please type a new username for your local account" msgstr "Por favor digite um novo nome de usuário para sua conta local" #: gajim/gui_interface.py:1235 msgid "Resource Conflict" msgstr "Conflito de recurso" #: gajim/gui_interface.py:1236 msgid "" "You are already connected to this account with the same resource. Please " "type a new one" msgstr "" "Você já está conectado a essa conta com o mesmo recurso. Por favor digite um " "novo" #: gajim/gui_interface.py:1293 #, python-format msgid "%s wants to start a voice chat." msgstr "%s quer iniciar uma conversa com voz." #: gajim/gui_interface.py:1296 msgid "Voice Chat Request" msgstr "Solicitação de conversa com voz" #: gajim/gui_interface.py:1386 msgid "Error verifying SSL certificate" msgstr "Erro ao verificar o certificado SSL" #: gajim/gui_interface.py:1387 #, fuzzy, python-format msgid "" "There was an error verifying the SSL certificate of your XMPP server: " "%(error)s\n" "Do you still want to connect to this server?" msgstr "" "Ocorreu um erro ao verificar o certificado SSL do seu servidor jabber: " "%(error)s\n" "Você ainda deseja conectar-se a este servidor?" #: gajim/gui_interface.py:1391 #, fuzzy, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA-1 fingerprint of the certificate:\n" "%(sha1)s\n" "SHA256 fingerprint of the certificate:\n" "%(sha256)s" msgstr "" "Adicionar este certificado na lista de certificados confiáveis.\n" "SHA1 fingerprint do certificado:\n" "%s" #: gajim/gui_interface.py:1397 msgid "Ignore this error for this certificate." msgstr "Ignorar este erro para este certificado." #: gajim/gui_interface.py:1410 msgid "Non Anonymous Server" msgstr "" #: gajim/gui_interface.py:1434 #, fuzzy, python-format msgid "" "It seems the SSL certificate of account %(account)s has changed and is not " "valid or your connection is being compromised.\n" "\n" "Old SHA-1 fingerprint: %(old_sha1)s\n" "Old SHA-256 fingerprint: %(old_sha256)s\n" "\n" "New SHA-1 fingerprint: %(new_sha1)s\n" "New SHA-256 fingerprint: %(new_sha256)s\n" "\n" "Do you still want to connect and update the fingerprint of the certificate?" msgstr "" "Parece que o certificado SSL da conta %(account)s foi alterado ou sua " "conexão foi hackeada.\n" "Fingerprint antigo: %(old)s\n" "Novo fingerprint: %(new)s\n" "\n" "Você ainda quer conectar e atualizar o fingerprint do certificado?" #: gajim/gui_interface.py:1512 msgid "" "You are about to send your password on an insecure connection. You should " "install PyOpenSSL to prevent that. Are you sure you want to do that?" msgstr "" "Você está enviando sua senha em uma conexão não-segura. Você deve instalar o " "PyOpenSSL para prevenir isto. Você tem certeza que quer fazer isso?" #: gajim/gui_interface.py:1554 #, fuzzy msgid "" "You are about to send your password unencrypted on an insecure connection. " "Are you sure you want to do that?" msgstr "" "Você está prestes a enviar sua senha em um conexão não-criptografada. Tem " "certeza que quer fazer isto?" #: gajim/gui_interface.py:1856 #, fuzzy msgid "JID is not a Groupchat" msgstr "Isto não é uma conferência" #: gajim/gui_interface.py:2020 msgid "Emoticons disabled" msgstr "Emoticons desabilitados" #: gajim/gui_interface.py:2021 #, fuzzy msgid "" "Your configured emoticons theme could not be loaded. See the log for more " "details." msgstr "" "Você configurou um tema de emoticons que não foi encontrado, então os " "emoticons estão desativados." #: gajim/gui_interface.py:2039 msgid "This is not a group chat" msgstr "Isto não é uma conferência" #: gajim/gui_interface.py:2040 #, python-format msgid "" "%(room_jid)s is already in your roster. Please check if %(room_jid)s is a " "correct group chat name. If it is, delete it from your roster and try " "joining the group chat again." msgstr "" #: gajim/gui_interface.py:2418 msgid "Could not save your settings and preferences" msgstr "Impossível salvar suas preferências" #: gajim/gui_interface.py:2828 gajim/common/config.py:117 #: gajim/common/config.py:532 gajim/common/optparser.py:343 #: gajim/common/optparser.py:511 gajim/common/optparser.py:534 msgid "default" msgstr "padrão" #: gajim/gui_interface.py:3014 msgid "Passphrase Required" msgstr "Frase de acesso é obrigatória" #: gajim/gui_interface.py:3015 #, fuzzy, python-format msgid "Enter OpenPGP key passphrase for key %(keyid)s (account %(account)s)." msgstr "" "Entre com a frase de acesso da chave GPG %(keyid)s para conta (account " "%(account)s)." #: gajim/gui_interface.py:3029 #, fuzzy msgid "OpenPGP key expired" msgstr "A chave GPG expirou" #: gajim/gui_interface.py:3030 #, fuzzy, python-format msgid "" "Your OpenPGP key has expired, you will be connected to %s without OpenPGP." msgstr "Sua chave GPG expirou, você será conectado ao %s sem OpenPGP." #: gajim/gui_interface.py:3039 msgid "Wrong Passphrase" msgstr "Frase de acesso errada" #: gajim/gui_interface.py:3040 #, fuzzy msgid "Please retype your OpenPGP passphrase or press Cancel." msgstr "Por favor, reescreva sua frase secreta de GPG ou pressione Cancelar." #: gajim/search_window.py:108 msgid "Waiting for results" msgstr "Esperando resultados" #: gajim/search_window.py:146 gajim/search_window.py:224 msgid "Error in received dataform" msgstr "Erro no formulário de dados recebido" #: gajim/search_window.py:181 gajim/search_window.py:216 msgid "No result" msgstr "Sem resultados" #: gajim/htmltextview.py:559 #, fuzzy msgid "Loading" msgstr "Codificado" #: gajim/atom_window.py:123 #, python-format msgid "You have received new entries (and %d not displayed):" msgid_plural "You have received new entries (and %d not displayed):" msgstr[0] "Você recebeu novas entradas (e %d não exibida):" msgstr[1] "Você recebeu novas entradas (e %d não exibidas):" #: gajim/atom_window.py:128 gajim/data/gui/atom_entry_window.ui:20 msgid "You have received new entry:" msgstr "Você recebeu uma nova entrada:" #: gajim/adhoc_commands.py:111 gajim/data/gui/adhoc_commands_window.ui:9 msgid "Ad-hoc Commands - Gajim" msgstr "Comandos ad-hoc - Gajim" #: gajim/adhoc_commands.py:320 msgid "Cancel confirmation" msgstr "Cancelar confirmação" #: gajim/adhoc_commands.py:321 msgid "" "You are in process of executing command. Do you really want to cancel it?" msgstr "Você está na execução de um comando. Você realmente deseja cancelar?" #: gajim/adhoc_commands.py:387 gajim/adhoc_commands.py:411 msgid "Service sent malformed data" msgstr "O serviço enviou dados inválidos" #: gajim/adhoc_commands.py:396 msgid "Service changed the session identifier." msgstr "O serviço alterou o identificador da sessão." #: gajim/adhoc_commands.py:416 #, fuzzy, python-format msgid "%s - Ad-hoc Commands - Gajim" msgstr "Comandos ad-hoc - Gajim" #: gajim/adhoc_commands.py:510 msgid "Service returned an error." msgstr "O serviço retornou um erro." #: gajim/negotiation.py:34 msgid "- messages will be logged" msgstr "- as mensagens serão gravadas" #: gajim/negotiation.py:36 msgid "- messages will not be logged" msgstr "- as mensagens não serão gravadas" #: gajim/notify.py:103 #, fuzzy msgid "Open" msgstr "OpenGPG" #: gajim/dialog_messages.py:33 #, fuzzy msgid "You can not start a new conversation unless you are connected." msgstr "" "Você não pode ingressar em uma sala de conferência até que esteja conectado." #: gajim/dialog_messages.py:48 msgid "Unread events" msgstr "Eventos não lidos" #: gajim/dialog_messages.py:49 msgid "Read all pending events before removing this account." msgstr "Ler todos os eventos pendentes antes de remover esta conta." #: gajim/dialog_messages.py:53 msgid "You are currently connected to the server" msgstr "Você está atualmente conectado ao servidor" #: gajim/dialog_messages.py:54 msgid "To disable the account, you must be disconnected." msgstr "Para desativar esta conta, você deve estar desconectado." #: gajim/dialog_messages.py:58 #, fuzzy msgid "Invalid Form" msgstr "Sala inválida" #: gajim/dialog_messages.py:59 #, fuzzy msgid "The form is not filled correctly." msgstr "O apelido possui caracteres não permitidos." #: gajim/dialog_messages.py:63 gajim/common/helpers.py:406 msgid "Invisible" msgstr "Invisível" #: gajim/dialog_messages.py:68 msgid "A connection is not available" msgstr "Uma conexão não está disponível" #: gajim/dialog_messages.py:69 msgid "Your message can not be sent until you are connected." msgstr "Sua mensagem não pode ser enviada até que esteja conectado." #: gajim/dialog_messages.py:73 #, fuzzy msgid "JID already in list" msgstr "Jabber ID já existente na lista" #: gajim/dialog_messages.py:74 #, fuzzy msgid "The JID you entered is already in the list. Choose another one." msgstr "O Jabber ID que você forneceu já está na lista. Escolha outro." #: gajim/dialog_messages.py:78 msgid "Invalid answer" msgstr "Resposta inválida" #: gajim/dialog_messages.py:79 #, python-format msgid "Transport %(name)s answered wrongly to register request: %(error)s" msgstr "" "O transporte %(name)s respondeu erroneamente à requisição de registro do " "pedido: %(error)s" #: gajim/dialog_messages.py:84 #, fuzzy msgid "Wrong Custom Hostname" msgstr "Usa nome de máquina/porta customizados" #: gajim/dialog_messages.py:85 #, fuzzy, python-format msgid "Wrong custom hostname \"%s\". Ignoring it." msgstr "Usa nome de máquina/porta customizados" #: gajim/dialog_messages.py:89 msgid "Error while removing privacy list" msgstr "Erro ao remover lista de privacidade" #: gajim/dialog_messages.py:90 #, python-format msgid "" "Privacy list %s has not been removed. It is maybe active in one of your " "connected resources. Deactivate it and try again." msgstr "" "A lista de privacidade %s não foi removida. Ela pode estar ativa em um ou " "mais recursos conectados. Desative-os e tente novamente." #: gajim/dialog_messages.py:96 msgid "Invisibility not supported" msgstr "Sem suporte a invisibilidade" #: gajim/dialog_messages.py:97 #, python-format msgid "Account %s doesn't support invisibility." msgstr "A conta %s não suporta invisibilidade." #: gajim/dialog_messages.py:101 msgid "Unregister failed" msgstr "Falha ao cancelar registro" #: gajim/dialog_messages.py:102 #, python-format msgid "Unregistration with server %(server)s failed: %(error)s" msgstr "Cancelamento de registro com o servidor %(server)s falhou: %(error)s:" #: gajim/dialog_messages.py:106 msgid "Registration succeeded" msgstr "Registro realizado com sucesso" #: gajim/dialog_messages.py:107 #, python-format msgid "Registration with agent %s succeeded" msgstr "Registro com o agente %s completado com sucesso" #: gajim/dialog_messages.py:111 msgid "Registration failed" msgstr "Falha ao registrar" #: gajim/dialog_messages.py:112 #, python-format msgid "" "Registration with agent %(agent)s failed with error %(error)s: %(error_msg)s" msgstr "" "Registro com o agente %(agent)s falhou com erro %(error)s: %(error_msg)s" #: gajim/dialog_messages.py:117 #, fuzzy msgid "Unable to join Groupchat" msgstr "Impossível ingressar na sala" #: gajim/dialog_messages.py:122 msgid "GStreamer error" msgstr "" #: gajim/dialog_messages.py:123 #, fuzzy, python-format msgid "" "Error: %(error)s\n" "Debug: %(debug)s" msgstr "Mensagem de erro: %s" #: gajim/dialog_messages.py:127 msgid "Wrong host" msgstr "Servidor errado" #: gajim/dialog_messages.py:128 msgid "Invalid local address? :-O" msgstr "Endereço local inválido? :-O" #: gajim/dialog_messages.py:132 msgid "Avahi error" msgstr "Erro do Avahi" #: gajim/dialog_messages.py:133 #, python-format msgid "" "%s\n" "Link-local messaging might not work properly." msgstr "" "%s\n" "Mensagens link-local podem não funcionar adequadamente." #: gajim/dialog_messages.py:137 gajim/dialog_messages.py:142 #, fuzzy msgid "Could not request upload slot" msgstr "Impossível iniciar o serviço local" #: gajim/dialog_messages.py:143 msgid "Got unexpected response from server (see log)" msgstr "" #: gajim/dialog_messages.py:147 gajim/dialog_messages.py:152 #, fuzzy msgid "Could not open file" msgstr "A imagem não pode ser carregada" #: gajim/dialog_messages.py:148 msgid "Exception raised while opening file (see log)" msgstr "" #: gajim/dialog_messages.py:157 msgid "Unsecure" msgstr "" #: gajim/dialog_messages.py:158 #, fuzzy msgid "Server returned unsecure transport (http)" msgstr "O serviço retornou um erro." #: gajim/dialog_messages.py:162 #, fuzzy msgid "Could not upload file" msgstr "A imagem não pode ser carregada" #: gajim/dialog_messages.py:163 #, python-format msgid "HTTP response code from server: %s" msgstr "" #: gajim/dialog_messages.py:167 msgid "Upload Error" msgstr "" #: gajim/dialog_messages.py:172 #, fuzzy msgid "Encryption Error" msgstr "Criptografia habilitada" #: gajim/dialog_messages.py:173 #, fuzzy msgid "For the choosen encryption is no encryption method available" msgstr "Uma conexão não está disponível" #: gajim/gajim_themes_window.py:61 msgid "Theme" msgstr "Tema" #: gajim/gajim_themes_window.py:98 msgid "You cannot make changes to the default theme" msgstr "Você não pode fazer alterações no tema padrão" #: gajim/gajim_themes_window.py:99 #, fuzzy msgid "Please create a new clean theme." msgstr "Crie um novo tema com o nome que você desejar." #: gajim/gajim_themes_window.py:170 msgid "theme name" msgstr "nome do tema" #: gajim/gajim_themes_window.py:187 msgid "You cannot delete your current theme" msgstr "Você não pode apagar o seu tema corrente" #: gajim/gajim_themes_window.py:188 msgid "Pick another theme to use first." msgstr "" #: gajim/accounts_window.py:40 #, fuzzy msgid "Merge Accounts" msgstr "Juntar contas" #: gajim/accounts_window.py:41 #, fuzzy msgid "Use PGP Agent" msgstr "Usar o Agente G_PG" #: gajim/accounts_window.py:153 gajim/common/config.py:511 msgid "Be right back." msgstr "Estou de volta." #: gajim/accounts_window.py:157 msgid "Relogin now?" msgstr "Re-autenticar agora?" #: gajim/accounts_window.py:158 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "Se você quer aplicar todas as mudanças, deve se re-autenticar." #: gajim/accounts_window.py:211 #, python-format msgid "You have opened chat in account %s" msgstr "Você iniciou uma conversa usando a conta %s" #: gajim/accounts_window.py:212 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "Todas as janelas de conversa e conferência serão fechadas. Confirma?" #: gajim/accounts_window.py:345 #, fuzzy msgid "Remove" msgstr "_Remover" #: gajim/accounts_window.py:388 #, fuzzy msgid "Rename account label" msgstr "Renomear conta" #: gajim/accounts_window.py:457 msgid "Login" msgstr "" #: gajim/accounts_window.py:466 msgid "Connection" msgstr "Conexão" #: gajim/accounts_window.py:469 #, fuzzy msgid "Import Contacts" msgstr "Convidar _contatos" #: gajim/accounts_window.py:472 gajim/accounts_window.py:655 #, fuzzy msgid "Client Certificate" msgstr "Certificado próprio" #: gajim/accounts_window.py:475 gajim/accounts_window.py:570 #, fuzzy msgid "OpenPGP Key" msgstr "Atribuir chave OpenPGP" #: gajim/accounts_window.py:486 gajim/accounts_window.py:558 #, fuzzy msgid "Connect on startup" msgstr "C_onectar na inicialização do Gajim" #: gajim/accounts_window.py:489 #, fuzzy msgid "Reconnect when connection is lost" msgstr "Reconectar automaticamente quando a conexão cair" #: gajim/accounts_window.py:492 gajim/accounts_window.py:562 #, fuzzy msgid "Save conversations for all contacts" msgstr "Salvar his_tórico para todos os contatos desta conta" #: gajim/accounts_window.py:494 gajim/accounts_window.py:564 msgid "Store conversations on the harddrive" msgstr "" #: gajim/accounts_window.py:496 #, fuzzy msgid "Server Message Archive" msgstr "_Enviar mensagem de servidor..." #: gajim/accounts_window.py:498 msgid "" "Messages get stored on the server.\n" "The archive is used to sync messages\n" "between multiple devices.\n" "XEP-0313" msgstr "" #: gajim/accounts_window.py:503 gajim/accounts_window.py:566 #, fuzzy msgid "Global Status" msgstr "Totos os status" #: gajim/accounts_window.py:505 #, fuzzy msgid "Synchronise the status of all accounts" msgstr "Mudar o status da conta ou contas" #: gajim/accounts_window.py:507 #, fuzzy msgid "Message Carbons" msgstr "Mensagens" #: gajim/accounts_window.py:509 msgid "" "All your other online devices get copies\n" "of sent and received messages.\n" "XEP-0280" msgstr "" #: gajim/accounts_window.py:513 msgid "Use file transfer proxies" msgstr "Usar proxies de transferência de arquivos" #: gajim/accounts_window.py:525 gajim/accounts_window.py:560 #, fuzzy msgid "Use environment variable" msgstr "_usar variável de ambiente HTTP__PROXY" #: gajim/accounts_window.py:527 #, fuzzy msgid "Proxy" msgstr "Proxy:" #: gajim/accounts_window.py:530 #, fuzzy msgid "Warn on insecure connection" msgstr "A_visar antes de usar uma conexão não-segura" #: gajim/accounts_window.py:534 msgid "Send keep-alive packets" msgstr "Enviar pacotes para manter a conexão (keep-alive)" #: gajim/accounts_window.py:538 msgid "Manually set the hostname for the server" msgstr "" #: gajim/accounts_window.py:541 #, fuzzy msgid "Resource" msgstr "Recurso:" #: gajim/accounts_window.py:544 gajim/accounts_window.py:612 #: gajim/accounts_window.py:617 #, fuzzy msgid "Priority" msgstr "_Prioridade:" #: gajim/accounts_window.py:568 #, fuzzy msgid "Synchronize the status of all accounts" msgstr "Mudar o status da conta ou contas" #: gajim/accounts_window.py:581 #, fuzzy msgid "First Name" msgstr "Primeiro nome:" #: gajim/accounts_window.py:584 #, fuzzy msgid "Last Name" msgstr "Último nome:" #: gajim/accounts_window.py:587 #: gajim/data/gui/archiving_313_preferences_window.ui:71 msgid "Jabber ID" msgstr "Jabber ID" #: gajim/accounts_window.py:590 #, fuzzy msgid "Email" msgstr "Novo e-mail" #: gajim/accounts_window.py:608 #, fuzzy msgid "Adjust to status" msgstr "_Ajustar para status" #: gajim/accounts_window.py:635 msgid "Enable" msgstr "Habilitar" #: gajim/accounts_window.py:642 #, fuzzy msgid "Port" msgstr "_Porta:" #: gajim/accounts_window.py:647 #, fuzzy msgid "Connection Options" msgstr "Conexão" #: gajim/accounts_window.py:659 #, fuzzy msgid "Encrypted Certificate" msgstr "Certificado próprio" #: gajim/accounts_window.py:663 #, fuzzy msgid "Certificate Options" msgstr "Certificado próprio" #: gajim/accounts_window.py:671 gajim/data/gui/join_groupchat_window.ui:143 #, fuzzy msgid "Password" msgstr "Senha:" #: gajim/accounts_window.py:675 #, fuzzy msgid "Save Password" msgstr "Salvar senha" #: gajim/accounts_window.py:678 gajim/data/gui/change_password_dialog.ui:8 msgid "Change Password" msgstr "Alterar senha" #: gajim/accounts_window.py:683 #, fuzzy msgid "Login Options" msgstr "_Emoticons:" #: gajim/gajim_remote.py:59 gajim/common/exceptions.py:71 msgid "D-Bus is not present on this machine or python module is missing" msgstr "" "O D-Bus não está presente nesta máquina ou o módulo do Python está faltando" #: gajim/gajim_remote.py:81 msgid "Shows a help on specific command" msgstr "Mostra uma ajuda para um comando específico" #: gajim/gajim_remote.py:84 msgid "command" msgstr "comando" #: gajim/gajim_remote.py:85 msgid "show help on command" msgstr "exibir ajuda no comando" #: gajim/gajim_remote.py:89 #, fuzzy msgid "Lists all contacts in roster, one for each line" msgstr "" "Exibir uma lista de todos os contatos na lista. Cada contato aparecerá em " "uma linha separada" #: gajim/gajim_remote.py:91 gajim/gajim_remote.py:106 gajim/gajim_remote.py:116 #: gajim/gajim_remote.py:130 gajim/gajim_remote.py:144 #: gajim/gajim_remote.py:153 gajim/gajim_remote.py:174 #: gajim/gajim_remote.py:204 gajim/gajim_remote.py:213 #: gajim/gajim_remote.py:220 #, fuzzy msgid "?CLI:account" msgstr "conta" #: gajim/gajim_remote.py:91 msgid "show only contacts of the given account" msgstr "exibir somente os contatos desta conta" #: gajim/gajim_remote.py:97 msgid "Prints a list of registered accounts" msgstr "Imprimir uma lista das contas registradas" #: gajim/gajim_remote.py:101 #, fuzzy msgid "Changes the status of account(s)" msgstr "Mudar o status da conta ou contas" #: gajim/gajim_remote.py:104 #, fuzzy msgid "?CLI:status" msgstr "status" #: gajim/gajim_remote.py:104 #, fuzzy msgid "" "one of: offline, online, chat, away, xa, dnd, invisible. If not set, use " "account's previous status" msgstr "" "um desses: desconectado, conectado, bate-papo, inativo, fora, np, invisível " #: gajim/gajim_remote.py:105 gajim/gajim_remote.py:127 #: gajim/gajim_remote.py:141 gajim/gajim_remote.py:152 #, fuzzy msgid "?CLI:message" msgstr "mensagem" #: gajim/gajim_remote.py:105 msgid "status message" msgstr "mensagem de status" #: gajim/gajim_remote.py:106 msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" msgstr "" "mudar status da conta \"account\". Se não especificado, tentará mudar o " "status de todas as contas existentes com a opção \"sincronizar com status " "global\" marcada" #: gajim/gajim_remote.py:112 #, fuzzy msgid "Changes the priority of account(s)" msgstr "Mudar a prioridade da conta ou das contas" #: gajim/gajim_remote.py:114 #, fuzzy msgid "?CLI:priority" msgstr "prioridade:" #: gajim/gajim_remote.py:114 msgid "priority you want to give to the account" msgstr "prioridade que deseja dar para a conta" #: gajim/gajim_remote.py:116 msgid "" "change the priority of the given account. If not specified, change status of " "all accounts that have \"sync with global status\" option set" msgstr "" "mudar status da conta. Se não especificado, tentará mudar o status de todas " "as contas existentes com a opção \"sincronizar com status global\" marcada" #: gajim/gajim_remote.py:122 msgid "" "Sends new chat message to a contact in the roster. Both OpenPGP key and " "account are optional. If you want to set only 'account', without 'OpenPGP " "key', just set 'OpenPGP key' to ''." msgstr "" "Envia nova mensagem para um contato na lista. Ambas chave OpenPGP e conta " "são opcionais. Se você quer configurar somente a 'conta', sem a 'chave " "OpenPGP', apenas configure a 'chave para ''." #: gajim/gajim_remote.py:126 gajim/gajim_remote.py:139 msgid "JID of the contact that will receive the message" msgstr "JID do contato que irá receber a mensagem" #: gajim/gajim_remote.py:127 gajim/gajim_remote.py:141 #: gajim/gajim_remote.py:152 msgid "message contents" msgstr "conteúdos da mensagem" #: gajim/gajim_remote.py:128 gajim/gajim_remote.py:142 msgid "PGP key" msgstr "" #: gajim/gajim_remote.py:128 gajim/gajim_remote.py:142 msgid "if specified, the message will be encrypted using this public key" msgstr "" "se especificada, a mensagem será criptografada usando esta chave pública" #: gajim/gajim_remote.py:130 gajim/gajim_remote.py:144 #: gajim/gajim_remote.py:153 msgid "if specified, the message will be sent using this account" msgstr "se especificada, a mensagem será enviada usando esta conta" #: gajim/gajim_remote.py:135 #, fuzzy msgid "" "Sends a chat message to someone on your roster. Optionally with OpenPGP key " "and account. If you want to only set the latter, set OpenPGP key to \"\"." msgstr "" "Envia nova mensagem para um contato na lista. Ambas chave OpenPGP e conta " "são opcionais. Se você quer configurar somente a 'conta', sem a 'chave " "OpenPGP', apenas configure a 'chave para ''." #: gajim/gajim_remote.py:140 msgid "subject" msgstr "assunto" #: gajim/gajim_remote.py:140 msgid "message subject" msgstr "assunto da mensagem" #: gajim/gajim_remote.py:149 msgid "Sends new message to a groupchat you've joined." msgstr "" "Envia uma nova messagem para uma conferência em que você tiver ingressado." #: gajim/gajim_remote.py:151 msgid "JID of the room that will receive the message" msgstr "O JID do contato que receberá a mensagem" #: gajim/gajim_remote.py:158 msgid "Gets detailed info on a contact" msgstr "Informações detalhadas do contato" #: gajim/gajim_remote.py:160 gajim/gajim_remote.py:173 #: gajim/gajim_remote.py:203 msgid "JID of the contact" msgstr "JID do contato" #: gajim/gajim_remote.py:164 msgid "Gets detailed info on a account" msgstr "Informações detalhadas do contato" #: gajim/gajim_remote.py:166 msgid "Name of the account" msgstr "Nome da conta" #: gajim/gajim_remote.py:170 msgid "Sends file to a contact" msgstr "Enviar arquivo para um contato" #: gajim/gajim_remote.py:172 msgid "file" msgstr "arquivo" #: gajim/gajim_remote.py:172 msgid "File path" msgstr "Caminho do arquivo" #: gajim/gajim_remote.py:174 msgid "if specified, file will be sent using this account" msgstr "se especificada, arquivo irá ser enviado usando esta conta" #: gajim/gajim_remote.py:179 msgid "Lists all preferences and their values" msgstr "Lista todas as preferências e seus valores" #: gajim/gajim_remote.py:183 msgid "Sets value of 'key' to 'value'." msgstr "Ajusta o valor da 'chave' ao 'valor '." #: gajim/gajim_remote.py:185 msgid "key=value" msgstr "chave=valor" #: gajim/gajim_remote.py:185 #, fuzzy msgid "'key' is the name of the preference, 'value' is what to set it to" msgstr "'chave' é o nome de preferência, 'valor' é o valor para ajustá-la" #: gajim/gajim_remote.py:190 msgid "Deletes a preference item" msgstr "Deleta um item de preferência" #: gajim/gajim_remote.py:192 msgid "key" msgstr "chave" #: gajim/gajim_remote.py:192 msgid "name of the preference to be deleted" msgstr "nome da preferência a ser deletada" #: gajim/gajim_remote.py:196 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "Escreve o estado atual das preferências do Gajim em um arquivo .config" #: gajim/gajim_remote.py:201 msgid "Removes contact from roster" msgstr "Remover contato da lista" #: gajim/gajim_remote.py:204 msgid "if specified, contact is taken from the contact list of this account" msgstr "se especificado, o contato é feito da lista de contatos desta conta" #: gajim/gajim_remote.py:211 msgid "Returns current status (the global one unless account is specified)" msgstr "Retorna o status atual (global a menos que o cliente for especificado)" #: gajim/gajim_remote.py:218 msgid "" "Returns current status message (the global one unless account is specified)" msgstr "" "Retorna a mensagem de status atual (global a menos que a conta for " "especificada)" #: gajim/gajim_remote.py:225 msgid "Returns number of unread messages" msgstr "Retorna o número das mensagens não lidas" #: gajim/gajim_remote.py:230 msgid "Sends custom XML" msgstr "Envia XML personalizado" #: gajim/gajim_remote.py:232 msgid "XML to send" msgstr "XML a enviar" #: gajim/gajim_remote.py:233 #, fuzzy msgid "" "Account to which the XML will be sent; if not specified, XML will be sent to " "all accounts" msgstr "" "A conta em que o XML será enviado; se não estiver especificado, será enviado " "para todas as contas" #: gajim/gajim_remote.py:239 #, fuzzy msgid "Change the avatar" msgstr "Alterar status" #: gajim/gajim_remote.py:241 #, fuzzy msgid "Picture to use" msgstr "Apelido a ser usado" #: gajim/gajim_remote.py:242 #, fuzzy msgid "" "Account in which the avatar will be set; if not specified, the avatar will " "be set for all accounts" msgstr "" "A conta em que o XML será enviado; se não estiver especificado, será enviado " "para todas as contas" #: gajim/gajim_remote.py:249 msgid "Check if Gajim is running" msgstr "Checar se o Gajim está rodando" #: gajim/gajim_remote.py:275 msgid "Missing argument \"contact_jid\"" msgstr "Argumento não informado \"contact_jid\"" #: gajim/gajim_remote.py:295 #, python-format msgid "" "'%s' is not in your roster.\n" "Please specify account for sending the message." msgstr "" "'%s' não está em sua lista.\n" "Por favor, especifique a conta para enviar a mensagem." #: gajim/gajim_remote.py:298 msgid "You have no active account" msgstr "Você não tem uma conta ativa" #: gajim/gajim_remote.py:346 msgid "It seems Gajim is not running. So you can't use gajim-remote." msgstr "" "Parece que o Gajim não está rodando. Então você não pode usar o gajim-remote." #: gajim/gajim_remote.py:373 #, python-format msgid "" "Usage: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" msgstr "" "Uso: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" #: gajim/gajim_remote.py:377 msgid "Arguments:" msgstr "Argumentos:" #: gajim/gajim_remote.py:381 #, python-format msgid "%s not found" msgstr "%s não encontrado" #: gajim/gajim_remote.py:387 #, fuzzy, python-format msgid "" "Usage:\n" " %s command [arguments]\n" "\n" "Command is one of:\n" msgstr "" "Uso: %s comando [argumentos]\n" "Comando é um desses:\n" #: gajim/gajim_remote.py:457 #, python-format msgid "" "Too many arguments. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" "Muitos argumentos. \n" "Digite \"%(basename)s help %(command)s\" para mais informações" #: gajim/gajim_remote.py:462 #, python-format msgid "" "Argument \"%(arg)s\" is not specified. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "" "Argumento \"%(arg)s\" não está especificado. \n" "Digite\"%(basename)s help %(command)s\" para maiores informações" #: gajim/common/app.py:264 msgid "Unable to load idle module" msgstr "Incapaz de carregar o módulo inativo" #: gajim/common/fuzzyclock.py:37 msgid "twelve" msgstr "doze" #: gajim/common/fuzzyclock.py:37 msgid "one" msgstr "um" #: gajim/common/fuzzyclock.py:37 msgid "two" msgstr "dois" #: gajim/common/fuzzyclock.py:37 msgid "three" msgstr "três" #: gajim/common/fuzzyclock.py:37 msgid "four" msgstr "quatro" #: gajim/common/fuzzyclock.py:38 msgid "five" msgstr "cinco" #: gajim/common/fuzzyclock.py:38 msgid "six" msgstr "seis" #: gajim/common/fuzzyclock.py:38 msgid "seven" msgstr "sete" #: gajim/common/fuzzyclock.py:38 msgid "eight" msgstr "oito" #: gajim/common/fuzzyclock.py:38 msgid "nine" msgstr "nove" #: gajim/common/fuzzyclock.py:38 msgid "ten" msgstr "dez" #: gajim/common/fuzzyclock.py:39 msgid "eleven" msgstr "onze" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "%(0)s o'clock" msgstr "%(0)s horas" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "five past %(0)s" msgstr "%(0)s e cinco" #: gajim/common/fuzzyclock.py:43 #, python-format msgid "ten past %(0)s" msgstr "%(0)s e dez" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "quarter past %(0)s" msgstr "%(0)s e quinze" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "twenty past %(0)s" msgstr "%(0)s e vinte" #: gajim/common/fuzzyclock.py:44 #, python-format msgid "twenty five past %(0)s" msgstr "%(0)s e vinte e cinco" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "half past %(0)s" msgstr "%(0)s e meia" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "twenty five to %(1)s" msgstr "vinte e cinco para as %(1)s" #: gajim/common/fuzzyclock.py:45 #, python-format msgid "twenty to %(1)s" msgstr "vinte para as %(1)s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "quarter to %(1)s" msgstr "quinze para as %(1)s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "ten to %(1)s" msgstr "dez para as %(1)s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "five to %(1)s" msgstr "cinco para %(1)s" #: gajim/common/fuzzyclock.py:46 #, python-format msgid "%(1)s o'clock" msgstr "%(1)s horas" #: gajim/common/fuzzyclock.py:48 gajim/common/fuzzyclock.py:50 msgid "Night" msgstr "Noite" #: gajim/common/fuzzyclock.py:48 msgid "Early morning" msgstr "Madrugada" #: gajim/common/fuzzyclock.py:48 msgid "Morning" msgstr "Manhã" #: gajim/common/fuzzyclock.py:49 msgid "Almost noon" msgstr "Quase meio-dia" #: gajim/common/fuzzyclock.py:49 msgid "Noon" msgstr "Meio-dia" #: gajim/common/fuzzyclock.py:49 msgid "Afternoon" msgstr "Tarde" #: gajim/common/fuzzyclock.py:49 msgid "Evening" msgstr "Noite" #: gajim/common/fuzzyclock.py:50 msgid "Late evening" msgstr "Tarde da noite" #: gajim/common/fuzzyclock.py:52 msgid "Start of week" msgstr "Começo da semana" #: gajim/common/fuzzyclock.py:52 gajim/common/fuzzyclock.py:53 msgid "Middle of week" msgstr "Meio da semana" #: gajim/common/fuzzyclock.py:53 msgid "End of week" msgstr "Fim da semana" #: gajim/common/fuzzyclock.py:53 msgid "Weekend!" msgstr "Final de semana!" #: gajim/common/connection_handlers_events.py:369 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " "management tools such as http://jru.jabberstudio.org/ to remove it" msgstr "" "O JID %s não é uma compilação da RFC. Não se adicionará a sua lista. Use " "ferramentas de gerência da lista como http://jru.jabberstudio.org/ para " "removê-lo" #: gajim/common/connection_handlers_events.py:852 #, python-format msgid "unsubscribe request from %s" msgstr "remoção de inscrição solicitada por %s" #: gajim/common/connection_handlers_events.py:952 msgid "Room has been destroyed" msgstr "A sala foi excluída" #: gajim/common/connection_handlers_events.py:960 #, python-format msgid "You can join this room instead: %s" msgstr "Você pode entrar nessa sala ao invés: %s" #: gajim/common/connection_handlers_events.py:1979 #, python-format msgid "Unknown SSL error: %d" msgstr "Erro de SSL desconhecido: %d" #: gajim/common/connection_handlers_events.py:2625 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Nova mensagem simples de %(nickname)s" #: gajim/common/connection_handlers_events.py:2631 #, python-format msgid "New Private Message from group chat %s" msgstr "Nova mensagem privada da conferência %s" #: gajim/common/connection_handlers_events.py:2634 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" #: gajim/common/connection_handlers_events.py:2637 #, python-format msgid "Messaged by %(nickname)s" msgstr "Mensagem enviada por %(nickname)s" #: gajim/common/connection_handlers_events.py:2643 #, python-format msgid "New Message from %(nickname)s" msgstr "Nova mensagem de %(nickname)s" #: gajim/common/connection_handlers_events.py:2809 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s alterou seu status" #: gajim/common/connection_handlers_events.py:2817 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s conectou" #: gajim/common/connection_handlers_events.py:2823 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s desconectou" #: gajim/common/contacts.py:386 msgid "Not in roster" msgstr "Fora da lista" #: gajim/common/config.py:76 msgid "" "Show desktop notification even when a chat window is opened for this contact " "and does not have focus" msgstr "" #: gajim/common/config.py:77 msgid "Play sound when user is busy" msgstr "Tocar som quando usuário estiver ocupado" #: gajim/common/config.py:79 msgid "Show only online and free for chat contacts in roster." msgstr "Exibir somente contatos disponíveis e livres para conversa na lista." #: gajim/common/config.py:82 msgid "Time in minutes, after which your status changes to away." msgstr "Tempo em minutos, depois do qual seu status muda para a afastado." #: gajim/common/config.py:83 msgid "$S (Away as a result of being idle more than $T min)" msgstr "$S (Afastado em conseqüência de estar inativo há mais de $T min)" #: gajim/common/config.py:83 #, fuzzy msgid "$S will be replaced by current status message, $T by autoawaytime." msgstr "" "$S será substituída pela mensagem de status atual, $T pelo tempo de ausência " "automática." #: gajim/common/config.py:85 msgid "Time in minutes, after which your status changes to not available." msgstr "Tempo em minutos, depois do qual seu status muda para não disponível." #: gajim/common/config.py:86 msgid "$S (Not available as a result of being idle more than $T min)" msgstr "$S (Não disponível em conseqüência de estar inativo há mais de $T min)" #: gajim/common/config.py:86 #, fuzzy msgid "$S will be replaced by current status message, $T by autoxatime." msgstr "" "$S será substituída pela mensagem de status atual, $T pelo tempo de " "indisponibilidade automática." #: gajim/common/config.py:89 #, fuzzy msgid "" "When to show notification area icon. Can be 'never', 'on_event', 'always'." msgstr "" "Quando exibir um ícone na área de notificação. Pode ser \"nunca\", com " "\"eventos\" e \"sempre\"." #: gajim/common/config.py:90 msgid "Allow to hide the roster window even if the tray icon is not shown." msgstr "" #: gajim/common/config.py:95 msgid "Incoming nickname color." msgstr "Cor do apelido de entrada." #: gajim/common/config.py:96 msgid "Outgoing nickname color." msgstr "Cor do apelido de saída." #: gajim/common/config.py:97 msgid "Incoming text color." msgstr "Cor do texto de entrada." #: gajim/common/config.py:98 msgid "Outgoing text color." msgstr "Cor do texto de saída." #: gajim/common/config.py:99 msgid "Status message text color." msgstr "Cor do texto da mensagem de status." #: gajim/common/config.py:102 #, fuzzy msgid "Contact signed in notification color." msgstr "Mo_strar somente na lista" #: gajim/common/config.py:103 #, fuzzy msgid "Contact signout notification color" msgstr "Mo_strar somente na lista" #: gajim/common/config.py:104 #, fuzzy msgid "New message notification color." msgstr "Pré-visualizar novas mensagens em uma janela popup?" #: gajim/common/config.py:105 #, fuzzy msgid "File transfer request notification color." msgstr "Solicitação de transferência de arquivos" #: gajim/common/config.py:106 #, fuzzy msgid "File transfer error notification color." msgstr "Transferência de arquivos cancelada" #: gajim/common/config.py:107 #, fuzzy msgid "File transfer complete or stopped notification color." msgstr "Exibir um alerta visual quanto uma transferência de arquivo terminar" #: gajim/common/config.py:108 #, fuzzy msgid "Groupchat invitation notification color" msgstr "Convite para conferência" #: gajim/common/config.py:109 #, fuzzy msgid "Background color of status changed notification" msgstr "Cor de fundo dos contatos quando eles simplesmente conectarem." #: gajim/common/config.py:110 msgid "Other dialogs color." msgstr "" #: gajim/common/config.py:111 msgid "Incoming nickname font." msgstr "Fonte do apelido de entrada." #: gajim/common/config.py:112 msgid "Outgoing nickname font." msgstr "Fonte do apelido de saída." #: gajim/common/config.py:113 msgid "Incoming text font." msgstr "Fonte do texto de entrada." #: gajim/common/config.py:114 msgid "Outgoing text font." msgstr "Fonte do texto de saída." #: gajim/common/config.py:115 msgid "Status message text font." msgstr "Fonte do texto da mensagem de status." #: gajim/common/config.py:116 msgid "" "List (space separated) of rows (accounts and groups) that are collapsed." msgstr "" "Lista (separada por espaços) de linhas (contas e grupos) que estão agrupados." #: gajim/common/config.py:123 msgid "Language used by speller" msgstr "Idioma usado pelo corretor ortográfico" #: gajim/common/config.py:124 msgid "" "'always' - print time for every message.\n" "'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" "'never' - never print time." msgstr "" "'sempre' - exibir hora para cada mensagem.\n" "'às vezes' - exibir hora a cada print_ichat_every_foo_minutes minutos.\n" "'nunca' - nunca exibir a hora." #: gajim/common/config.py:125 msgid "" "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " "to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " "This is used only if print_time is 'sometimes'." msgstr "" "Exibir a hora nas conversas usando relógio impreciso. O valor de imprecisão " "varia de 1 a 4, 0 desabilita a função. 1 é relógio mais preciso, 4 é o " "menos. Isto é usado apenas se o valor de print_time for 'às vezes'." #: gajim/common/config.py:127 msgid "Enable ASCII emoticons" msgstr "" #: gajim/common/config.py:129 msgid "Treat * / _ pairs as possible formatting characters." msgstr "Aproveite os pare * /_ como caracteres de formatação." #: gajim/common/config.py:130 msgid "" "If True, do not remove */_ . So *abc* will be bold but with * * not removed." msgstr "" "Se verdadeiro, não remova */_. Assim *ABC* será negrito mas com * * não " "removido." #: gajim/common/config.py:133 msgid "" "Uses ReStructured text markup to send HTML, plus ascii formatting if " "selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" "restructuredtext.html (If you want to use this, install docutils)" msgstr "" "Usar marcação de texto ReStructured para HTML, mais formatação ASCII, se " "selecionada. Para informações sobre sintaxe, veja http://docutils." "sourceforge.net/docs/ref/rst/restructuredtext.html (Se você quiser usar " "isso, instale o docutils)" #: gajim/common/config.py:142 msgid "" "Character to add after nickname when using nick completion (tab) in group " "chat." msgstr "" "Caracter a adicionar ao apelido quando se estiver usando o recurso de " "completar apelido (tecla Tab) na conferência." #: gajim/common/config.py:143 msgid "" "Character to propose to add after desired nickname when desired nickname is " "used by someone else in group chat." msgstr "" "O caracter a ser proposto para adicionar ao final do apelido desejado quando " "ele já estiver sendo usado por outra pessoa na conferência." #: gajim/common/config.py:165 msgid "" "If True, Gajim will save roster position when hiding roster, and restore it " "when showing roster." msgstr "" #: gajim/common/config.py:171 msgid "Place the roster on the right in single window mode" msgstr "" #: gajim/common/config.py:177 msgid "" "This option let you customize timestamp that is printed in conversation. For " "exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " "strftime for full documentation: http://docs.python.org/lib/module-time.html" msgstr "" "Esta opção lhe permite personalizar o carimbo de tempo que é exibido na " "conversação. Por exemplo: \"[%H:%M]\" exibirá \"[hora:minuto]\". Procure por " "strftime na documentação do Python: http://docs.python.org/lib/module-time." "html" #: gajim/common/config.py:178 msgid "Characters that are printed before the nickname in conversations" msgstr "Os caracteres que são exibidos antes do apelido nas conversas" #: gajim/common/config.py:179 msgid "Characters that are printed after the nickname in conversations" msgstr "Os caracteres que são exibidos após o apelidos nas conversas" #: gajim/common/config.py:181 msgid "Add * and [n] in roster title?" msgstr "Adicionar * e [n] no título da lista?" #: gajim/common/config.py:182 #, fuzzy msgid "" "How many history messages should be restored when a chat tab/window is " "reopened?" msgstr "" "Quantas linhas lembrar da conversação anterior quando uma aba/janela de bate-" "papo for reaberta." #: gajim/common/config.py:183 msgid "How far back in time (minutes) history is restored. -1 means no limit." msgstr "" #: gajim/common/config.py:184 #, fuzzy msgid "" "How many lines to request from server when entering a groupchat. -1 means no " "limit" msgstr "" "Quantas linhas requisitar ao servidor quando entrar em uma conferência." #: gajim/common/config.py:185 #, fuzzy msgid "" "Minutes of backlog to request when entering a groupchat. -1 means no limit" msgstr "" "Quantos minutos esperar para requisitar registros quando entrar em uma sala." #: gajim/common/config.py:186 msgid "" "How many seconds to wait before trying to autorejoin to a conference you are " "being disconnected from. Set to 0 to disable autorejoining." msgstr "" "Quantos segundos aguardar antes de tentar reconectar a uma conferência que " "você foi desconectado. Definir para 0 irá desabilitar a tentativa de re-" "conexão (autorejoining)." #: gajim/common/config.py:187 msgid "" "Should autorejoin be activated when we are being kicked from a conference?" msgstr "" #: gajim/common/config.py:188 msgid "" "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " "Client default behaviour)." msgstr "" "Enviar a mensagem com Ctrl+Enter e criar uma nova linha com Enter " "(comportamento padrão do cliente ICQ da Mirabilis)." #: gajim/common/config.py:190 msgid "How many lines to store for Ctrl+KeyUP." msgstr "Quantas linhas armazenar com Ctrl+Acima." #: gajim/common/config.py:193 #, fuzzy, python-format msgid "" "Either custom url with %%s in it where %%s is the word/phrase or " "'WIKTIONARY' which means use wiktionary." msgstr "" "Uma ou outra URL costuma vir com %s onde %s é a palvra/frase ou em " "'WIKTIONARY' que significam o uso wiktionary." #: gajim/common/config.py:196 msgid "If checked, Gajim can be controlled remotely using gajim-remote." msgstr "" "Se verificado, Gajim pode ser remotamente controlado usando gajim-remoto." #: gajim/common/config.py:197 msgid "" "Sent chat state notifications. Can be one of all, composing_only, disabled." msgstr "" "Notificações de estado de conversa enviados. Pode ser one of all, " "composing_only, disabled." #: gajim/common/config.py:198 msgid "" "Displayed chat state notifications in chat windows. Can be one of all, " "composing_only, disabled." msgstr "" "Notificações de estado de conversa exibidos nas janelas de conversa. Pode " "ser one of all, composing_only, disabled." #: gajim/common/config.py:200 msgid "" "When not printing time for every message (print_time==sometimes), print it " "every x minutes." msgstr "" "Quando não estiver exibindo a hora para cada mensagem (print_time == " "simetimes), exibi-lo a cada x minutos." #: gajim/common/config.py:201 msgid "Ask before closing a group chat tab/window." msgstr "Perguntar antes de fechar um aba ou janela de conferência." #: gajim/common/config.py:202 #, fuzzy msgid "" "Always ask for confirmation before closing groupchats with any of the JIDs " "on this space separated list." msgstr "" "Sempre perguntar antes de fechar um aba/janela nesta lista separada por " "espaço de JID's de conferências." #: gajim/common/config.py:203 #, fuzzy msgid "" "Never ask for confirmation before closing groupchats with any of the JIDs on " "this space separated list." msgstr "" "Nunca perguntar antes de fechar uma aba/janela de conferência nesta lista " "separada por espaço de salas separadas por jids." #: gajim/common/config.py:204 #, fuzzy msgid "" "Ask before closing tabbed chat window if there are controls that can lose " "data (chat, private chat, groupchat that will not be minimized)" msgstr "" "Perguntar antes de fechar uma aba de janela de conversa se ela puder perder " "dados (conversa, conversa privada, conferências que não podem ser " "minimizadas)" #: gajim/common/config.py:207 msgid "" "Comma separated list of hosts that we send, in addition of local interfaces, " "for File Transfer in case of address translation/port forwarding." msgstr "" "Lista separada por vírgula dos servidores que nós enviaremos, em adição às " "interfaces locais, para Transferência de Arquivo no caso de tradução de " "endereço/encaminhamento de porta." #: gajim/common/config.py:209 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." msgstr "Padrão da IEC diz que KiB = 1024 bytes e KB = 1000 bytes." #: gajim/common/config.py:211 #, fuzzy msgid "Notify of events in the notification area." msgstr "Notificar os eventos no ícone da bandeja do sistema." #: gajim/common/config.py:212 msgid "" "If False, Gajim will display a static event icon instead of the blinking " "status icon in the notification area when notifying on event." msgstr "" #: gajim/common/config.py:218 msgid "Show tab when only one conversation?" msgstr "Exibir aba quando tiver apenas uma bate papo?" #: gajim/common/config.py:219 msgid "Show tabbed notebook border in chat windows?" msgstr "Exibir borda de caderno tabulada nas janelas de conversa?" #: gajim/common/config.py:220 msgid "Show close button in tab?" msgstr "Exibir botão de fechar na aba?" #: gajim/common/config.py:221 msgid "" "A list of modp groups to use in a Diffie-Hellman, highest preference first, " "separated by commas. Valid groups are 1, 2, 5, 14, 15, 16, 17 and 18. Higher " "numbers are more secure, but take longer to calculate when you start a " "session." msgstr "" "Uma lista de grupos modp para usar em uma Diffie-Hellman, preferências " "maiores primeiro, separadas por vírgula. Grupos válidos são 1, 2, 5, 14, 15, " "16, 17 e 18. Números maiores são mais seguros, mas demoram mais para " "calcular quando você inicia uma sessão." #: gajim/common/config.py:234 msgid "Preview new messages in notification popup?" msgstr "Pré-visualizar novas mensagens em uma janela popup?" #: gajim/common/config.py:237 msgid "" "A semicolon-separated list of words that will be highlighted in group chats." msgstr "" "Uma lista separada por ponto-e-vírgula das palavras que serão destacadas nas " "conferências." #: gajim/common/config.py:238 #, fuzzy msgid "" "If True, quits Gajim when X button of Window Manager is clicked. This " "setting is taken into account only if notification icon is used." msgstr "" "Se verdadeiro, o Gajim sairá quando o botão sair da janela for clicado. Esta " "opção só faz sentido quando a opção trayicon está sendo usada." #: gajim/common/config.py:239 msgid "" "If True, Gajim hides the Roster window on pressing the X button instead of " "minimizing into the Dock." msgstr "" #: gajim/common/config.py:240 msgid "" "If True, Gajim will display an icon on each tab containing unread messages. " "Depending on the theme, this icon may be animated." msgstr "" "Se verdadeiro, Gajim exibirá um ícone para cada aba contendo mensagens não " "lidas. Dependendo do tema, este ícone pode ser animado." #: gajim/common/config.py:241 msgid "" "If True, Gajim will display the status message, if not empty, for every " "contact under the contact name in roster window." msgstr "" "Se verdadeiro, o Gajim indicará a mensagem de status, se não estiver vazia, " "para cada contato sob o nome do contato na janela da lista." #: gajim/common/config.py:247 msgid "Define the position of the avatar in roster. Can be left or right" msgstr "Define a posição do avatar na lista. Pode ser esquerda ou direita" #: gajim/common/config.py:248 msgid "" "If False, Gajim will no longer print status line in chats when a contact " "changes his or her status and/or his or her status message." msgstr "" "Se falso, você não verá por mais muito tempo a linha de status nas conversas " "quando um contato alterar seu status e/ou sua mensagem de status." #: gajim/common/config.py:249 #, fuzzy msgid "" "Can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " "longer print status line in groupchats when a member changes his or her " "status and/or his or her status message. If \"all\" Gajim will print all " "status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " "group chat." msgstr "" "pode ser \"none\" (nenhum), \"all\" (todos) ou \"in_and_out\" (dentro e " "fora). Se for \"none\", o Gajim não exibirá mais o status nas conferências " "quando um membro alterar seu status e/ou sua mensagem de status. Se for \"all" "\" o Gajim exibirá todas as mensagens de status. Se for \"in_and_out\" o " "Gajim só exibirá FOO entradas/saídas em conferências." #: gajim/common/config.py:251 msgid "Log XHTML messages instead of plain text messages." msgstr "" #: gajim/common/config.py:252 msgid "Background color of contacts when they just signed in." msgstr "Cor de fundo dos contatos quando eles simplesmente conectarem." #: gajim/common/config.py:253 msgid "Background color of contacts when they just signed out." msgstr "Cor de fundo dos contatos quando eles simplesmente desconectarem." #: gajim/common/config.py:255 msgid "" "If True, restored messages will use a smaller font than the default one." msgstr "" "Se Verdadeiro, as mensagens restauradas usarão uma fonte menor que o padrão." #: gajim/common/config.py:256 msgid "Don't show avatar for the transport itself." msgstr "Não exibir o avatar para o próprio transporte." #: gajim/common/config.py:257 msgid "Don't show roster in the system taskbar." msgstr "Não exibir a lista na bandeja do sistema." #: gajim/common/config.py:258 msgid "" "If True and installed GTK+ and PyGTK versions are at least 2.8, make the " "window flash (the default behaviour in most Window Managers) when holding " "pending events." msgstr "" "Se Verdadeiro e as versões do GTK+ e PyGTK instaladas são menores que 2.8, " "faz a janela piscar (o comportamento padrão na maioria dos Gerenciadores de " "Janela) quando esperam eventos pendentes." #: gajim/common/config.py:260 msgid "" "Jabberd1.4 does not like sha info when one join a password protected group " "chat. Turn this option to False to stop sending sha info in group chat " "presences." msgstr "" "O Jabberd1.4 não trata informações sha quando alguém entra numa sala " "protegida por senha. Mude esta opção para Falso para parar de emitir as " "informações sha na presenças de conferências." #: gajim/common/config.py:263 #, fuzzy msgid "" "Controls the window where new messages are placed.\n" "'always' - All messages are sent to a single window.\n" "'always_with_roster' - Like 'always' but the messages are in a single window " "along with the roster.\n" "'never' - All messages get their own window.\n" "'peracct' - Messages for each account are sent to a specific window.\n" "'pertype' - Each message type (e.g. chats vs. groupchats) is sent to a " "specific window." msgstr "" "Controlar a janela onde novas mensagens são colocadas.\n" "'always' - Todas as mensagens são enviadas para uma única janela.\n" "'always_with_roster' - Tal como 'always' mas as mensagens estão em uma " "janela simples junto com a lista.\n" "'never' - Todas as mensagens recebem sua própria janela.\n" "'peracct' - As mensagens para cada conta são enviadas a uma janela " "específica.\n" "'pertype' - Cada tipo de mensagem (ex. bate-papo vs. conferência) são " "enviadas para uma janela específica." #: gajim/common/config.py:264 msgid "" "Show roster on startup.\n" "'always' - Always show roster.\n" "'never' - Never show roster.\n" "'last_state' - Restore the last state roster." msgstr "" #: gajim/common/config.py:265 msgid "If False, you will no longer see the avatar in the chat window." msgstr "" "Se falso, você não verá por muito tempo o avatar na janela do bate-papo." #: gajim/common/config.py:266 msgid "If True, pressing the escape key closes a tab/window." msgstr "Se verdadeiro, pressionando a tecla Esc fecha a aba/janela." #: gajim/common/config.py:267 msgid "Hides the banner in a group chat window" msgstr "Esconder o banner na janela de conferência" #: gajim/common/config.py:268 msgid "Hides the banner in two persons chat window" msgstr "Esconder o banner na janela de conversa para duas pessoas" #: gajim/common/config.py:269 msgid "Hides the group chat occupants list in group chat window." msgstr "Esconder a lista dos ocupantes da sala na janela da conferência." #: gajim/common/config.py:270 msgid "" "In a chat, show the nickname at the beginning of a line only when it's not " "the same person talking than in previous message." msgstr "" "Em uma conferência, exibir o apelido no começo da linha apenas quando a " "mensagem atual não for da mesma pessoa que mandou a última." #: gajim/common/config.py:271 msgid "Indentation when using merge consecutive nickname." msgstr "Usar identação ao mesclar apelidos consecutivos." #: gajim/common/config.py:272 msgid "" "List of colors, separated by \":\", that will be used to color nicknames in " "group chats." msgstr "" "A lista de cores, separadas por \":\", que serão usadas para colorir os " "apelidos nas salas de conferência." #: gajim/common/config.py:273 msgid "Ctrl-Tab go to next composing tab when none is unread." msgstr "" "Quando nenhum aba tiver uma mensagem não lida, Ctrl + Tab vai para a próxima " "aba." #: gajim/common/config.py:274 msgid "" "Should we show the confirm metacontacts creation dialog or not? Empty string " "means we never show the dialog." msgstr "" "Devemos exibir o diálogo de confirmação de metacontatos ou não? Uma string " "vazia significa que nós nunca devemos exibir o diálogo." #: gajim/common/config.py:275 msgid "" "Should we show the confirm block contact dialog or not? Empty string means " "we never show the dialog." msgstr "" "Devemos exibir o diálogo de confirmação de metacontatos ou não? Uma string " "vazia significa que nós nunca devemos exibir o diálogo." #: gajim/common/config.py:276 msgid "" "Should we show the confirm custom status dialog or not? Empty string means " "we never show the dialog." msgstr "" "Devemos exibir o diálogo de confirmação status customizados ou não? Uma " "string vazia significa que nós nunca devemos exibir o diálogo." #: gajim/common/config.py:277 msgid "" "If True, you will be able to set a negative priority to your account in " "account modification window. BE CAREFUL, when you are logged in with a " "negative priority, you will NOT receive any message from your server." msgstr "" "Se Verdadeiro, você poderá especificar uma prioridade negativa para a sua " "conta na janela de modificação da conta. CUIDADO, quando você estiver " "autenticado com uma prioridade negativa, você NÃO poderá receber nenhuma " "mensagem do seu servidor." #: gajim/common/config.py:278 msgid "" "If True, Gajim will show number of online and total contacts in account and " "group rows." msgstr "" "Se Verdadeiro, o Gajim exibirá o número de contatos online e do total de " "contatos nas linha de conta e grupo." #: gajim/common/config.py:279 msgid "" "Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " "as if they were of this type" msgstr "" "Pode ser vazio, 'chat' ou 'normal'. Se for vazio, trata todas as mensagens " "recebidas como se elas fossem do tipo especificado" #: gajim/common/config.py:280 msgid "" "If True, Gajim will scroll and select the contact who sent you the last " "message, if chat window is not already opened." msgstr "" "Se Verdadeiro, o Gajim irá rolar e selecionar o contato que lhe enviou a " "última mensagem, se a janela de conversa ainda não estiver aberta." #: gajim/common/config.py:281 msgid "Time of inactivity needed before the change status window closes down." msgstr "" "O tempo de inatividade necessário antes de fechar a janela de alteração de " "status." #: gajim/common/config.py:282 msgid "" "Maximum number of lines that are printed in conversations. Oldest lines are " "cleared." msgstr "" "Número máximo de linhas que são exibidas em conversações. As linhas mais " "antigas são apagadas." #: gajim/common/config.py:283 #, fuzzy msgid "" "If True, notification windows from notification-daemon will be attached to " "notification icon." msgstr "" "Se marcado como Verdadeiro as janelas de notificação do notification-daemon " "serão anexadas ao ícone da bandeja do sistema." #: gajim/common/config.py:284 msgid "Choose interval between 2 checks of idleness." msgstr "Escolha intervalo entre 2 verificações de inatividade." #: gajim/common/config.py:285 msgid "" "Valid uri schemes. Only schemes in this list will be accepted as \"real\" " "uri. (mailto and xmpp are handled separately)" msgstr "" "Esquema uri válido. Somente esquemas nesta lista irão ser aceitos como uri " "\"real\". (mailto e xmpp são manipulados separadamente)" #: gajim/common/config.py:286 msgid "If True, completion in groupchats will be like a shell auto-completion" msgstr "" "Se verdadeiro, a ação de auto-completar na conferência irá ser como a do " "shell" #: gajim/common/config.py:287 msgid "" "When is self contact row displayed. Can be \"always\", \"when_other_resource" "\" or \"never\"" msgstr "" "Quando a linha de auto contatos é exibida. Pode ser \"sempre\", " "\"quando_em_outro_recurso\" ou \"nunca\"" #: gajim/common/config.py:292 msgid "Optionally fix jingle output video framerate. Example: 10/1 or 25/2" msgstr "" #: gajim/common/config.py:293 msgid "Optionally resize jingle output video. Example: 320x240" msgstr "" #: gajim/common/config.py:294 msgid "If True, You will also see your webcam" msgstr "" #: gajim/common/config.py:297 msgid "" "If True, Gajim will try to use a STUN server when using Jingle. The one in " "\"stun_server\" option, or the one given by the XMPP server." msgstr "" #: gajim/common/config.py:298 msgid "STUN server to use when using Jingle" msgstr "" #: gajim/common/config.py:299 msgid "" "If True, Gajim will show affiliation of groupchat occupants by adding a " "colored square to the status icon" msgstr "" #: gajim/common/config.py:300 msgid "" "Proxy used for all outgoing connections if the account does not have a " "specific proxy configured" msgstr "" #: gajim/common/config.py:301 msgid "If True, Gajim will ignore incoming attention requestd (\"wizz\")." msgstr "" #: gajim/common/config.py:302 msgid "" "If enabled, Gajim will reopen chat windows that were opened last time Gajim " "was closed." msgstr "" #: gajim/common/config.py:303 #, fuzzy msgid "" "If enabled, Gajim will show an icon to show that sent message has been " "received by your contact" msgstr "" "Se habilitado, o Gajim não irá perguntar por mensagem de status. A mensagem " "padrão especificada será usada neste caso." #: gajim/common/config.py:304 msgid "Show a mini avatar in chat window tabs and in window icon" msgstr "" #: gajim/common/config.py:305 #, fuzzy msgid "If True, Gajim will use the Systems Keyring to store account passwords." msgstr "" "Se verdadeiro, o Gajim usará o Gnome Keyring (se disponível) para armazenar " "as senhas das contas." #: gajim/common/config.py:306 msgid "Sets the encoding used by python-gnupg" msgstr "" #: gajim/common/config.py:307 msgid "If True, Gajim will execute XEP-0146 Commands." msgstr "" #: gajim/common/config.py:308 msgid "All non-compliant MAM Groupchats" msgstr "" #: gajim/common/config.py:324 msgid "" "Priority will change automatically according to your status. Priorities are " "defined in autopriority_* options." msgstr "" "A prioridade será alterada automaticamente de acordo com o seu status. As " "prioridades são definidas nas opções autopriority_*." #: gajim/common/config.py:332 msgid "" "Status used to autoconnect as. Can be online, chat, away, xa, dnd, " "invisible. NOTE: this option is used only if restore_last_status is disabled" msgstr "" "Status usado para conexão automática. Pode ser conectado, bate-papo, " "inativo, fora, np, invisível. NOTA: esta opção é usada somente se a opção " "restore_last_status estiver desativada" #: gajim/common/config.py:333 msgid "If enabled, restore the last status that was used." msgstr "Se habilitado, restaura o último status que foi usado." #: gajim/common/config.py:335 msgid "" "If True, Contacts requesting authorization will be automatically accepted." msgstr "" "Se verdadeiro, requisição de autorização de contatos irão ser " "automaticamente aceitos." #: gajim/common/config.py:336 msgid "" "If False, this account will be disabled and will not appear in roster window." msgstr "" "Se falso, esta conta será desativada e não irá aparecer na lista de contatos." #: gajim/common/config.py:339 msgid "" "If disabled, don't sign presences with GPG key, even if GPG is configured." msgstr "" "Se desativado, não assinar presenças com chaves GPG, se o GPG estiver " "configurado." #: gajim/common/config.py:341 msgid "Enable ESessions encryption for this account." msgstr "Habilitar criptografia ESessions para esta conta." #: gajim/common/config.py:342 msgid "Should Gajim automatically start an encrypted session when possible?" msgstr "" "O Gajim deve iniciar automaticamente em sessão criptografada quando possível?" #: gajim/common/config.py:343 msgid "Allow plaintext connections" msgstr "" #: gajim/common/config.py:346 msgid "" "List (space separated) of authentication mechanisms to try. Can contain " "ANONYMOUS, EXTERNAL, GSSAPI, SCRAM-SHA-1-PLUS, SCRAM-SHA-1, DIGEST-MD5, " "PLAIN, X-MESSENGER-OAUTH2 or XEP-0078" msgstr "" #: gajim/common/config.py:347 #, fuzzy msgid "" "Show a warning dialog before sending password on an plaintext connection. " "Can be 'warn', 'connect', 'disconnect'" msgstr "" "Exibir uma mensagem de alerta antes de enviar uma senha em uma conexão de " "texto puro." #: gajim/common/config.py:348 msgid "Show a warning dialog before using standard SSL library." msgstr "Exibir uma mensagem de alerta antes de usar uma biblioteca padrão SSL." #: gajim/common/config.py:349 #, fuzzy msgid "" "Show a warning dialog before sending PLAIN password over a plain connection." msgstr "" "Exibir uma mensagem de alerta antes de enviar uma senha em uma conexão de " "texto puro." #: gajim/common/config.py:352 msgid "Space separated list of ssl errors to ignore." msgstr "Lista separada por espaços de erros do ssl para ignorar." #: gajim/common/config.py:358 msgid "" "Space separated list of JIDs for which you do not want to store logs. You " "can also add account name to log nothing for this account." msgstr "" #: gajim/common/config.py:359 msgid "" "On startup, Gajim will download logs stored on server, provided the server " "supports XEP-0313" msgstr "" #: gajim/common/config.py:360 msgid "" "Space separated list of JIDs for which you accept to not log conversations " "if he does not want to." msgstr "" #: gajim/common/config.py:363 msgid "Whitespace sent after inactivity" msgstr "Espaço em branco enviado após inatividade" #: gajim/common/config.py:364 msgid "XMPP ping sent after inactivity" msgstr "Ping XMPP enviado após inatividade" #: gajim/common/config.py:368 #, fuzzy msgid "" "How many seconds to wait for the answer of ping alive packet before we try " "to reconnect?" msgstr "" "Quantos segundos aguardar a resposta do pacote de tempo-de-vida antes de " "tentar reconectar." #: gajim/common/config.py:372 msgid "Jabberd2 workaround" msgstr "Jabberd2 rodando" #: gajim/common/config.py:375 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." msgstr "" "Se checado, o Gaijm usará seu IP e proxies definidos no " "file_transfer_proxies, em opções para transferência de arquivos." #: gajim/common/config.py:376 msgid "" "If True, Gajim will test file transfer proxies on startup to be sure it " "works. Openfire's proxies are known to fail this test even if they work." msgstr "" #: gajim/common/config.py:389 msgid "Answer to receipt requests" msgstr "Respostas para requisições recebidas" #: gajim/common/config.py:390 msgid "Sent receipt requests" msgstr "Requisições recebidas enviadas" #: gajim/common/config.py:399 #, fuzzy msgid "" "Allow Gajim to send information about the operating system you are running." msgstr "" "Se marcado, o Gajim irá permitir que os outros detectem qual o sistema " "operacional está usando" #: gajim/common/config.py:400 #, fuzzy msgid "Allow Gajim to send your local time." msgstr "%s quer te enviar um arquivo." #: gajim/common/config.py:401 msgid "" "When negotiating an encrypted session, should Gajim assume you want your " "messages to be logged?" msgstr "" "Ao negociar uma sessão criptografada, o Gajim deve assumir que você quer que " "suas mensagens sejam gravadas?" #: gajim/common/config.py:404 #, fuzzy msgid "Message that is sent to contacts you want to add" msgstr "Por favor preencha os dados do contato que você quer adicionar" #: gajim/common/config.py:405 msgid "" "If enabled and if server supports this feature, Gajim will receive messages " "sent and received by other resources." msgstr "" #: gajim/common/config.py:406 msgid "" "If enabled, Gajim will send your local IPs so your contact can connect to " "your machine to transfer files." msgstr "" #: gajim/common/config.py:407 #, fuzzy msgid "Latest token for OAuth 2.0 authentication." msgstr "Autenticação anônima" #: gajim/common/config.py:408 #, fuzzy msgid "client_id for OAuth 2.0 authentication." msgstr "Autenticação anôn_ima" #: gajim/common/config.py:409 #, fuzzy msgid "redirect_url for OAuth 2.0 authentication." msgstr "Autenticação anôn_ima" #: gajim/common/config.py:410 msgid "" "Space separated list of JIDs for which we want to re-open a chat window on " "next startup." msgstr "" #: gajim/common/config.py:412 msgid "HTTP Upload: Enable HTTPS Verification" msgstr "" #: gajim/common/config.py:413 msgid "" "Preferred file transfer mechanism for file drag&drop on chat window. Can be " "'httpupload' (default) or 'jingle'" msgstr "" #: gajim/common/config.py:476 gajim/common/config.py:481 msgid "Language for which we want to check misspelled words" msgstr "Idioma a usar na verificação ortográficas das palavras" #: gajim/common/config.py:478 msgid "The currently active encryption for that contact" msgstr "" #: gajim/common/config.py:482 #, fuzzy msgid "" "How many lines to request from server when entering a groupchat. -1 means no " "limit, -2 means global value" msgstr "" "Quantas linhas requisitar ao servidor quando entrar em uma conferência." #: gajim/common/config.py:483 #, fuzzy msgid "" "Minutes of backlog to request when entering a groupchat. -1 means no limit, " "-2 means global value" msgstr "" "Quantos minutos esperar para requisitar registros quando entrar em uma sala." #: gajim/common/config.py:484 msgid "State whether we want a notification for every message in this room" msgstr "" #: gajim/common/config.py:487 msgid "" "State whether plugins should be activated on startup (this is saved on Gajim " "exit). This option SHOULD NOT be used to (de)activate plug-ins. Use GUI " "instead." msgstr "" #: gajim/common/config.py:492 gajim/common/pep.py:157 msgid "Sleeping" msgstr "Dormindo" #: gajim/common/config.py:493 msgid "Back soon" msgstr "Volto logo" #: gajim/common/config.py:493 msgid "Back in some minutes." msgstr "Volto em alguns minutos." #: gajim/common/config.py:494 gajim/common/pep.py:127 msgid "Eating" msgstr "Comendo" #: gajim/common/config.py:494 msgid "I'm eating, so leave me a message." msgstr "Eu estou comendo, então deixe-me uma mensagem." #: gajim/common/config.py:495 msgid "Movie" msgstr "Filme" #: gajim/common/config.py:495 msgid "I'm watching a movie." msgstr "Estou assistindo um filme." #: gajim/common/config.py:496 gajim/common/pep.py:186 msgid "Working" msgstr "Trabalhando" #: gajim/common/config.py:496 msgid "I'm working." msgstr "Estou trabalhando." #: gajim/common/config.py:497 msgid "Phone" msgstr "Telefone" #: gajim/common/config.py:497 msgid "I'm on the phone." msgstr "Estou no telefone." #: gajim/common/config.py:498 msgid "Out" msgstr "Estou fora" #: gajim/common/config.py:498 msgid "I'm out enjoying life." msgstr "Estou fora curtindo a vida." #: gajim/common/config.py:509 msgid "I'm available." msgstr "Estou disponível." #: gajim/common/config.py:510 msgid "I'm free for chat." msgstr "Estou livre para conversar." #: gajim/common/config.py:512 msgid "I'm not available." msgstr "Não estou disponível." #: gajim/common/config.py:513 msgid "Do not disturb." msgstr "Não perturbe." #: gajim/common/config.py:514 gajim/common/config.py:515 msgid "Bye!" msgstr "Tchau!" #: gajim/common/config.py:526 msgid "" "Sound to play when a group chat message contains one of the words in " "muc_highlight_words, or when a group chat message contains your nickname." msgstr "" "Som para tocar quando uma mensagem MUC conter uma das palavras no " "muc_hightlight_words, ou quando uma mensagem MUC contiver seu apelido." #: gajim/common/config.py:527 msgid "Sound to play when any MUC message arrives." msgstr "Som a ser tocado quando qualquer mensagem MUC chegar." #: gajim/common/config.py:535 gajim/common/optparser.py:357 msgid "green" msgstr "verde" #: gajim/common/config.py:539 gajim/common/optparser.py:343 msgid "grocery" msgstr "mantimento" #: gajim/common/config.py:543 msgid "human" msgstr "humano" #: gajim/common/config.py:547 msgid "marine" msgstr "marinho" #: gajim/common/config.py:554 #, fuzzy msgid "Tor" msgstr "Para" #: gajim/common/commands.py:86 msgid "Change status information" msgstr "Alterar informação de status" #: gajim/common/commands.py:108 msgid "Change status" msgstr "Alterar status" #: gajim/common/commands.py:109 msgid "Set the presence type and description" msgstr "Definir o tipo e a descrição da presença" #: gajim/common/commands.py:115 msgid "Free for chat" msgstr "Livre para conversa" #: gajim/common/commands.py:116 msgid "Online" msgstr "Conectado" #: gajim/common/commands.py:118 msgid "Extended away" msgstr "Muito afastado" #: gajim/common/commands.py:119 msgid "Do not disturb" msgstr "Não perturbe" #: gajim/common/commands.py:120 msgid "Offline - disconnect" msgstr "Desconectado" #: gajim/common/commands.py:125 msgid "Presence description:" msgstr "Descrição da presença:" #: gajim/common/commands.py:160 gajim/common/commands.py:343 msgid "The status has been changed." msgstr "O status foi alterado." #: gajim/common/commands.py:192 gajim/common/commands.py:225 msgid "Leave Groupchats" msgstr "Sair das salas" #: gajim/common/commands.py:215 #, python-format msgid "%(nickname)s on %(room_jid)s" msgstr "%(nickname)s da sala %(room_jid)s" #: gajim/common/commands.py:219 msgid "You have not joined a groupchat." msgstr "Você não entrou em uma sala." #: gajim/common/commands.py:226 msgid "Choose the groupchats you want to leave" msgstr "Selecione as salas das quais você quer sair" #: gajim/common/commands.py:271 msgid "You left the following groupchats:" msgstr "Você saiu das seguintes salas:" #: gajim/common/commands.py:283 msgid "Forward unread messages" msgstr "Encaminhar mensagens não lidas" #: gajim/common/commands.py:310 msgid "All unread messages have been forwarded." msgstr "Todas as mensagens não lidas foram encaminhadas." #: gajim/common/commands.py:318 #, fuzzy msgid "Forward unread message then disconnect" msgstr "Encaminhar mensagens não lidas" #: gajim/common/httpupload.py:137 msgid "File is empty" msgstr "O arquivo está vazio" #: gajim/common/httpupload.py:140 msgid "File does not exist" msgstr "O arquivo não existe" #: gajim/common/httpupload.py:147 gajim/common/httpupload.py:204 #, python-format msgid "File is too large, maximum allowed file size is: %s" msgstr "" #: gajim/common/check_paths.py:37 msgid "creating logs database" msgstr "criando banco de dados de logs" #: gajim/common/check_paths.py:98 #, fuzzy msgid "creating cache database" msgstr "criando banco de dados de logs" #: gajim/common/check_paths.py:261 #, fuzzy, python-format msgid "moving %(src)s to %(dst)s" msgstr "Enviar %s para %s" #: gajim/common/check_paths.py:287 gajim/common/check_paths.py:294 #: gajim/common/check_paths.py:301 gajim/common/check_paths.py:308 #: gajim/common/check_paths.py:315 gajim/common/check_paths.py:322 #: gajim/common/check_paths.py:329 gajim/common/check_paths.py:336 #, python-format msgid "%s is a file but it should be a directory" msgstr "%s é um arquivo, mas deveria ser um diretório" #: gajim/common/check_paths.py:288 gajim/common/check_paths.py:295 #: gajim/common/check_paths.py:302 gajim/common/check_paths.py:309 #: gajim/common/check_paths.py:316 gajim/common/check_paths.py:323 #: gajim/common/check_paths.py:330 gajim/common/check_paths.py:337 #: gajim/common/check_paths.py:349 gajim/common/check_paths.py:357 msgid "Gajim will now exit" msgstr "Gajim sairá agora" #: gajim/common/check_paths.py:348 gajim/common/check_paths.py:356 #, python-format msgid "%s is a directory but should be a file" msgstr "%s é um diretório, mas deveria ser um arquivo" #: gajim/common/optparser.py:55 #, python-format msgid "Error: cannot open %s for reading" msgstr "Erro: impossível abrir %s para leitura" #: gajim/common/optparser.py:352 gajim/common/optparser.py:353 msgid "cyan" msgstr "azul celeste" #: gajim/common/optparser.py:421 msgid "migrating logs database to indices" msgstr "migrando base de dados de registros para índices" #: gajim/common/logging_helpers.py:34 #, python-format msgid "%s is not a valid loglevel" msgstr "%s não é um nível de gravação (loglevel) válido" #: gajim/common/connection.py:83 msgid "Unable to get issuer certificate" msgstr "Não foi possível obter o certificado do emissor" #: gajim/common/connection.py:84 msgid "Unable to get certificate CRL" msgstr "Não foi possível obter certificado CRL" #: gajim/common/connection.py:85 msgid "Unable to decrypt certificate's signature" msgstr "Não foi possível descriptografar a assinatura do certificado" #: gajim/common/connection.py:86 msgid "Unable to decrypt CRL's signature" msgstr "Não foi possível descriptografar a assinatura CRL" #: gajim/common/connection.py:87 msgid "Unable to decode issuer public key" msgstr "Não foi possível decodificar a chave pública do emissor" #: gajim/common/connection.py:88 msgid "Certificate signature failure" msgstr "Assinatura do certificado falhou" #: gajim/common/connection.py:89 msgid "CRL signature failure" msgstr "Falha na assinatura CRL" #: gajim/common/connection.py:90 msgid "Certificate is not yet valid" msgstr "O certificado ainda não é válido" #: gajim/common/connection.py:91 msgid "Certificate has expired" msgstr "O certificado expirou" #: gajim/common/connection.py:92 msgid "CRL is not yet valid" msgstr "CRL ainda não é válido" #: gajim/common/connection.py:93 msgid "CRL has expired" msgstr "CRL expirou" #: gajim/common/connection.py:94 msgid "Format error in certificate's notBefore field" msgstr "Erro de formato nos certificados no campo notBefore" #: gajim/common/connection.py:95 msgid "Format error in certificate's notAfter field" msgstr "Erro de formato nos certificados no campo notAfter" #: gajim/common/connection.py:96 msgid "Format error in CRL's lastUpdate field" msgstr "Erro de formato no campo lastUpdate do CRL" #: gajim/common/connection.py:97 msgid "Format error in CRL's nextUpdate field" msgstr "Erro de formato no campo nextUpdate do CRL" #: gajim/common/connection.py:98 msgid "Out of memory" msgstr "Memória insuficiente" #: gajim/common/connection.py:99 msgid "Self signed certificate" msgstr "Certificado próprio" #: gajim/common/connection.py:100 msgid "Self signed certificate in certificate chain" msgstr "Certificado próprio na cadeia de certificados" #: gajim/common/connection.py:101 msgid "Unable to get local issuer certificate" msgstr "Não foi possível obter o certificado do emissor local" #: gajim/common/connection.py:102 msgid "Unable to verify the first certificate" msgstr "Não foi possível verificar o primeiro certificado" #: gajim/common/connection.py:103 msgid "Certificate chain too long" msgstr "A cadeia de certificados é muito longa" #: gajim/common/connection.py:104 msgid "Certificate revoked" msgstr "Certificado revocado" #: gajim/common/connection.py:105 msgid "Invalid CA certificate" msgstr "Certificado CA inválido" #: gajim/common/connection.py:106 msgid "Path length constraint exceeded" msgstr "Limite de comprimento do caminho excedido" #: gajim/common/connection.py:107 msgid "Unsupported certificate purpose" msgstr "Certificado de propósito não suportado" #: gajim/common/connection.py:108 msgid "Certificate not trusted" msgstr "Certificado não confiável" #: gajim/common/connection.py:109 msgid "Certificate rejected" msgstr "Certificado rejeitado" #: gajim/common/connection.py:110 msgid "Subject issuer mismatch" msgstr "Assunto do emissor não coincide" #: gajim/common/connection.py:111 msgid "Authority and subject key identifier mismatch" msgstr "Chave identificadora de autoridade e assunto não coincidem" #: gajim/common/connection.py:112 msgid "Authority and issuer serial number mismatch" msgstr "Autoridade e número serial do emissor não coincidem" #: gajim/common/connection.py:113 msgid "Key usage does not include certificate signing" msgstr "O uso das chaves não inclui assinatura de certificado" #: gajim/common/connection.py:114 msgid "Application verification failure" msgstr "Verificação do aplicativo falhou" #: gajim/common/connection.py:876 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Conexão com a conta \"%s\" foi perdida" #: gajim/common/connection.py:877 msgid "Reconnect manually." msgstr "Reconecte manualmente." #: gajim/common/connection.py:888 #, python-format msgid "Server %(name)s answered wrongly to register request: %(error)s" msgstr "" "O servidor %(name)s respondeu erroneamente à requisição de registro: " "%(error)s" #: gajim/common/connection.py:930 #, python-format msgid "Server %s provided a different registration form" msgstr "O servidor %s forneceu um formulário de registro diferente" #: gajim/common/connection.py:1283 #, fuzzy, python-format msgid "Could not connect to \"%(host)s\" via proxy \"%(proxy)s\"" msgstr "Impossível conectar a \"%s\"" #: gajim/common/connection.py:1286 #, fuzzy, python-format msgid "Could not connect to \"%(host)s\"" msgstr "Impossível conectar a \"%s\"" #: gajim/common/connection.py:1293 #, python-format msgid "Server replied: %s" msgstr "O servidor respondeu: %s" #: gajim/common/connection.py:1308 msgid "Connection to proxy failed" msgstr "Falha na conexão com o proxy" #: gajim/common/connection.py:1346 gajim/common/connection.py:1449 #, python-format msgid "Could not connect to account %s" msgstr "Não foi possível conectar a conta %s" #: gajim/common/connection.py:1347 gajim/common/connection.py:1450 #, python-format msgid "Connection with account %s has been lost. Retry connecting." msgstr "A conexão com a conta %s foi perdida. Tentando reconectar." #: gajim/common/connection.py:1372 #, fuzzy, python-format msgid "The authenticity of the %s certificate could be invalid" msgstr "A autenticidade do certificado %s pode ser inválida." #: gajim/common/connection.py:1375 #, python-format msgid "" "\n" "SSL Error: %s" msgstr "" "\n" "Erro de SSL: %s" #: gajim/common/connection.py:1377 #, python-format msgid "" "\n" "Unknown SSL error: %d" msgstr "" "\n" "Erro de SSL desconhecido: %d" #: gajim/common/connection.py:1423 #, fuzzy, python-format msgid "" "The authenticity of the %s certificate could be invalid.\n" "The certificate does not cover this domain." msgstr "A autenticidade do certificado %s pode ser inválida." #: gajim/common/connection.py:1473 gajim/common/connection.py:2238 #: gajim/common/zeroconf/connection_zeroconf.py:192 #, python-format msgid "Could not connect to \"%s\"" msgstr "Impossível conectar a \"%s\"" #: gajim/common/connection.py:1512 #, python-format msgid "Authentication failed with \"%s\"" msgstr "Falha na autenticação com \"%s\"" #: gajim/common/connection.py:1513 msgid "Please check your login and password for correctness." msgstr "Por favor, verifique se seu login e senha estão corretos." #: gajim/common/connection.py:2097 #, fuzzy, python-format msgid "Sent contact: \"%(jid)s\" (%(name)s)" msgstr "Enviar contato: \"%s\" (%s)" #: gajim/common/connection.py:2101 msgid "Sent contacts:" msgstr "Enviar contatos:" #: gajim/common/connection.py:2255 gajim/common/connection.py:2277 msgid "Not fetched because of invisible status" msgstr "Não baixado por causa do status invisível" #: gajim/common/dbus_support.py:44 msgid "D-Bus python bindings are missing in this computer" msgstr "Acesso ao python D-Bus foi perdido neste computador" #: gajim/common/dbus_support.py:45 gajim/common/dbus_support.py:56 msgid "D-Bus capabilities of Gajim cannot be used" msgstr "As potencialidades do D-Bus no Gajim não podem ser usadas" #: gajim/common/dbus_support.py:55 msgid "D-Bus does not run correctly on this machine" msgstr "O D-Bus não está sendo executado corretamente nesta máquina" #: gajim/common/dbus_support.py:58 #, fuzzy msgid "D-Bus does not run correctly on this machine: system bus not present" msgstr "O D-Bus não está sendo executado corretamente nesta máquina" #: gajim/common/dbus_support.py:61 #, fuzzy msgid "D-Bus does not run correctly on this machine: session bus not present" msgstr "O D-Bus não está sendo executado corretamente nesta máquina" #: gajim/common/multimedia_helpers.py:45 #, fuzzy msgid "Default device" msgstr "Mensagem padrão" #: gajim/common/multimedia_helpers.py:66 #, fuzzy msgid "Audio test" msgstr "Áudio / Vídeo" #: gajim/common/multimedia_helpers.py:69 gajim/common/multimedia_helpers.py:85 #: gajim/common/multimedia_helpers.py:99 gajim/common/multimedia_helpers.py:117 msgid "Autodetect" msgstr "" #: gajim/common/multimedia_helpers.py:72 gajim/common/multimedia_helpers.py:87 #, fuzzy, python-format msgid "ALSA: %s" msgstr "Tamanho: %s" #: gajim/common/multimedia_helpers.py:75 gajim/common/multimedia_helpers.py:89 #, fuzzy, python-format msgid "Pulse: %s" msgstr "Arquivo: %s" #: gajim/common/multimedia_helpers.py:83 msgid "Fake audio output" msgstr "" #: gajim/common/multimedia_helpers.py:96 msgid "Video test" msgstr "" #: gajim/common/multimedia_helpers.py:101 #, python-format msgid "V4L2: %s" msgstr "" #: gajim/common/multimedia_helpers.py:104 #, fuzzy msgid "Screen" msgstr "verde" #: gajim/common/multimedia_helpers.py:111 msgid "Fake video output" msgstr "" #: gajim/common/multimedia_helpers.py:114 #, python-format msgid "X Window System (X11/XShm/Xv): %s" msgstr "" #: gajim/common/multimedia_helpers.py:116 msgid "X Window System (without Xv)" msgstr "" #: gajim/common/pep.py:27 msgid "Afraid" msgstr "Amedrontado" #: gajim/common/pep.py:28 msgid "Amazed" msgstr "Surpreso" #: gajim/common/pep.py:29 msgid "Amorous" msgstr "Amoroso" #: gajim/common/pep.py:30 msgid "Angry" msgstr "Irado" #: gajim/common/pep.py:31 msgid "Annoyed" msgstr "Chateado" #: gajim/common/pep.py:32 msgid "Anxious" msgstr "Ansioso" #: gajim/common/pep.py:33 msgid "Aroused" msgstr "Estimulado" #: gajim/common/pep.py:34 msgid "Ashamed" msgstr "Envergonhado" #: gajim/common/pep.py:35 msgid "Bored" msgstr "Entediado" #: gajim/common/pep.py:36 msgid "Brave" msgstr "Corajoso" #: gajim/common/pep.py:37 msgid "Calm" msgstr "Calmo" #: gajim/common/pep.py:38 msgid "Cautious" msgstr "Cauteloso" #: gajim/common/pep.py:39 msgid "Cold" msgstr "Indiferente" #: gajim/common/pep.py:40 msgid "Confident" msgstr "Confidente" #: gajim/common/pep.py:41 msgid "Confused" msgstr "Confuso" #: gajim/common/pep.py:42 msgid "Contemplative" msgstr "Contemplativo" #: gajim/common/pep.py:43 msgid "Contented" msgstr "Contente" #: gajim/common/pep.py:44 msgid "Cranky" msgstr "Nervoso" #: gajim/common/pep.py:45 msgid "Crazy" msgstr "Louco" #: gajim/common/pep.py:46 msgid "Creative" msgstr "Criativo" #: gajim/common/pep.py:47 msgid "Curious" msgstr "Curioso" #: gajim/common/pep.py:48 msgid "Dejected" msgstr "Abatido" #: gajim/common/pep.py:49 msgid "Depressed" msgstr "Deprimido" #: gajim/common/pep.py:50 msgid "Disappointed" msgstr "Desapontado" #: gajim/common/pep.py:51 msgid "Disgusted" msgstr "Enojado" #: gajim/common/pep.py:52 msgid "Dismayed" msgstr "Consternado" #: gajim/common/pep.py:53 msgid "Distracted" msgstr "Distraído" #: gajim/common/pep.py:54 msgid "Embarrassed" msgstr "Envergonhado" #: gajim/common/pep.py:55 msgid "Envious" msgstr "Com inveja" #: gajim/common/pep.py:56 msgid "Excited" msgstr "Excitado" #: gajim/common/pep.py:57 msgid "Flirtatious" msgstr "Paquerador" #: gajim/common/pep.py:58 msgid "Frustrated" msgstr "Frustrado" #: gajim/common/pep.py:59 msgid "Grateful" msgstr "Agradecido" #: gajim/common/pep.py:60 msgid "Grieving" msgstr "Angustiado" #: gajim/common/pep.py:61 msgid "Grumpy" msgstr "Mal-humorado" #: gajim/common/pep.py:62 msgid "Guilty" msgstr "Culpado" #: gajim/common/pep.py:63 msgid "Happy" msgstr "Feliz" #: gajim/common/pep.py:64 msgid "Hopeful" msgstr "Esperançoso" #: gajim/common/pep.py:65 msgid "Hot" msgstr "Quente" #: gajim/common/pep.py:66 msgid "Humbled" msgstr "Humilde" #: gajim/common/pep.py:67 msgid "Humiliated" msgstr "Humilhado" #: gajim/common/pep.py:68 msgid "Hungry" msgstr "Com fome" #: gajim/common/pep.py:69 msgid "Hurt" msgstr "Machucado" #: gajim/common/pep.py:70 msgid "Impressed" msgstr "Impressionado" #: gajim/common/pep.py:71 msgid "In Awe" msgstr "Chocado" #: gajim/common/pep.py:72 msgid "In Love" msgstr "Apaixonado" #: gajim/common/pep.py:73 msgid "Indignant" msgstr "Indignado" #: gajim/common/pep.py:74 msgid "Interested" msgstr "Interessado" #: gajim/common/pep.py:75 msgid "Intoxicated" msgstr "Intoxicado" #: gajim/common/pep.py:76 msgid "Invincible" msgstr "Invencível" #: gajim/common/pep.py:77 msgid "Jealous" msgstr "Envergonhado" #: gajim/common/pep.py:78 msgid "Lonely" msgstr "Sozinho" #: gajim/common/pep.py:79 msgid "Lost" msgstr "Perdido" #: gajim/common/pep.py:80 msgid "Lucky" msgstr "Sortudo" #: gajim/common/pep.py:81 msgid "Mean" msgstr "Mau" #: gajim/common/pep.py:82 msgid "Moody" msgstr "Mal-humorado" #: gajim/common/pep.py:83 msgid "Nervous" msgstr "Nervoso" #: gajim/common/pep.py:84 msgid "Neutral" msgstr "Neutro" #: gajim/common/pep.py:85 msgid "Offended" msgstr "Ofendido" #: gajim/common/pep.py:86 msgid "Outraged" msgstr "Indignado" #: gajim/common/pep.py:87 msgid "Playful" msgstr "Brincalhão" #: gajim/common/pep.py:88 msgid "Proud" msgstr "Orgulhoso" #: gajim/common/pep.py:89 msgid "Relaxed" msgstr "Relaxado" #: gajim/common/pep.py:90 msgid "Relieved" msgstr "Aliviado" #: gajim/common/pep.py:91 msgid "Remorseful" msgstr "Arrependido" #: gajim/common/pep.py:92 msgid "Restless" msgstr "Inquieto" #: gajim/common/pep.py:93 msgid "Sad" msgstr "Triste" #: gajim/common/pep.py:94 msgid "Sarcastic" msgstr "Sarcástico" #: gajim/common/pep.py:95 msgid "Satisfied" msgstr "Satisfeito" #: gajim/common/pep.py:96 msgid "Serious" msgstr "Sério" #: gajim/common/pep.py:97 msgid "Shocked" msgstr "Chocado" #: gajim/common/pep.py:98 msgid "Shy" msgstr "Tímido" #: gajim/common/pep.py:99 msgid "Sick" msgstr "Doente" #: gajim/common/pep.py:100 msgid "Sleepy" msgstr "Com sono" #: gajim/common/pep.py:101 msgid "Spontaneous" msgstr "Espontâneo" #: gajim/common/pep.py:102 msgid "Stressed" msgstr "Estressado" #: gajim/common/pep.py:103 msgid "Strong" msgstr "Forte" #: gajim/common/pep.py:104 msgid "Surprised" msgstr "Surpreso" #: gajim/common/pep.py:105 msgid "Thankful" msgstr "Agradecido" #: gajim/common/pep.py:106 msgid "Thirsty" msgstr "Com sede" #: gajim/common/pep.py:107 msgid "Tired" msgstr "Cansado" #: gajim/common/pep.py:108 msgid "Undefined" msgstr "Indefinido" #: gajim/common/pep.py:109 msgid "Weak" msgstr "Fraco" #: gajim/common/pep.py:110 msgid "Worried" msgstr "Preocupado" #: gajim/common/pep.py:113 msgid "Doing Chores" msgstr "Atarefado" #: gajim/common/pep.py:114 msgid "Buying Groceries" msgstr "Fazendo compras" #: gajim/common/pep.py:115 msgid "Cleaning" msgstr "Limpando" #: gajim/common/pep.py:116 msgid "Cooking" msgstr "Cozinhando" #: gajim/common/pep.py:117 msgid "Doing Maintenance" msgstr "Fazendo manutenção" #: gajim/common/pep.py:118 msgid "Doing the Dishes" msgstr "Lavando a louça" #: gajim/common/pep.py:119 msgid "Doing the Laundry" msgstr "Lavando roupas" #: gajim/common/pep.py:120 msgid "Gardening" msgstr "Fazendo jardinagem" #: gajim/common/pep.py:121 msgid "Running an Errand" msgstr "Realizando uma tarefa" #: gajim/common/pep.py:122 msgid "Walking the Dog" msgstr "Passeando com o cachorro" #: gajim/common/pep.py:123 msgid "Drinking" msgstr "Bebendo" #: gajim/common/pep.py:124 msgid "Having a Beer" msgstr "Bebendo uma cerveja" #: gajim/common/pep.py:125 msgid "Having Coffee" msgstr "Tomando café" #: gajim/common/pep.py:126 msgid "Having Tea" msgstr "Tomando chá" #: gajim/common/pep.py:128 msgid "Having a Snack" msgstr "Fazendo um lanche" #: gajim/common/pep.py:129 msgid "Having Breakfast" msgstr "Tomando café da manhã" #: gajim/common/pep.py:130 msgid "Having Dinner" msgstr "Jantando" #: gajim/common/pep.py:131 msgid "Having Lunch" msgstr "Almoçando" #: gajim/common/pep.py:132 msgid "Exercising" msgstr "Exercitando" #: gajim/common/pep.py:133 gajim/common/pep.py:178 msgid "Cycling" msgstr "Andando de bicicleta" #: gajim/common/pep.py:134 msgid "Dancing" msgstr "Dançando" #: gajim/common/pep.py:135 msgid "Hiking" msgstr "Fazendo caminhada" #: gajim/common/pep.py:136 msgid "Jogging" msgstr "Correndo" #: gajim/common/pep.py:137 msgid "Playing Sports" msgstr "Praticando esportes" #: gajim/common/pep.py:138 msgid "Running" msgstr "Correndo" #: gajim/common/pep.py:139 msgid "Skiing" msgstr "Esquiando" #: gajim/common/pep.py:140 msgid "Swimming" msgstr "Nadando" #: gajim/common/pep.py:141 msgid "Working out" msgstr "Trabalhando fora" #: gajim/common/pep.py:142 msgid "Grooming" msgstr "Afagando" #: gajim/common/pep.py:143 msgid "At the Spa" msgstr "No Spa" #: gajim/common/pep.py:144 msgid "Brushing Teeth" msgstr "Escovando os dentes" #: gajim/common/pep.py:145 msgid "Getting a Haircut" msgstr "Cortando o cabelo" #: gajim/common/pep.py:146 msgid "Shaving" msgstr "Fazendo barba" #: gajim/common/pep.py:147 msgid "Taking a Bath" msgstr "Tomando banho" #: gajim/common/pep.py:148 msgid "Taking a Shower" msgstr "Tomando uma ducha" #: gajim/common/pep.py:149 msgid "Having an Appointment" msgstr "Em um compromisso" #: gajim/common/pep.py:150 gajim/data/gui/gajim_themes_window.ui:363 msgid "Inactive" msgstr "Inativo" #: gajim/common/pep.py:151 msgid "Day Off" msgstr "De folga" #: gajim/common/pep.py:152 msgid "Hanging out" msgstr "Me descontraindo" #: gajim/common/pep.py:153 msgid "Hiding" msgstr "Me escondendo" #: gajim/common/pep.py:154 msgid "On Vacation" msgstr "Em férias" #: gajim/common/pep.py:155 msgid "Praying" msgstr "Orando" #: gajim/common/pep.py:156 msgid "Scheduled Holiday" msgstr "Feriado" #: gajim/common/pep.py:158 msgid "Thinking" msgstr "Pensando" #: gajim/common/pep.py:159 msgid "Relaxing" msgstr "Relaxando" #: gajim/common/pep.py:160 msgid "Fishing" msgstr "Pescando" #: gajim/common/pep.py:161 msgid "Gaming" msgstr "Jogando" #: gajim/common/pep.py:162 msgid "Going out" msgstr "Saindo" #: gajim/common/pep.py:163 msgid "Partying" msgstr "Festejando" #: gajim/common/pep.py:164 msgid "Reading" msgstr "Lendo" #: gajim/common/pep.py:165 msgid "Rehearsing" msgstr "Ensaiando" #: gajim/common/pep.py:166 msgid "Shopping" msgstr "Comprando" #: gajim/common/pep.py:167 msgid "Smoking" msgstr "Fumando" #: gajim/common/pep.py:168 msgid "Socializing" msgstr "Socializando" #: gajim/common/pep.py:169 msgid "Sunbathing" msgstr "Tomando banho de sol" #: gajim/common/pep.py:170 msgid "Watching TV" msgstr "Assitindo TV" #: gajim/common/pep.py:171 msgid "Watching a Movie" msgstr "Assistindo um filme" #: gajim/common/pep.py:172 msgid "Talking" msgstr "Falando" #: gajim/common/pep.py:173 msgid "In Real Life" msgstr "No mundo real" #: gajim/common/pep.py:174 msgid "On the Phone" msgstr "Ao telefone" #: gajim/common/pep.py:175 msgid "On Video Phone" msgstr "Ao telefone" #: gajim/common/pep.py:176 msgid "Traveling" msgstr "Viajando" #: gajim/common/pep.py:177 msgid "Commuting" msgstr "Em trânsito" #: gajim/common/pep.py:179 msgid "Driving" msgstr "Dirigindo" #: gajim/common/pep.py:180 msgid "In a Car" msgstr "Em um carro" #: gajim/common/pep.py:181 msgid "On a Bus" msgstr "Em um ônibus" #: gajim/common/pep.py:182 msgid "On a Plane" msgstr "Em um avião" #: gajim/common/pep.py:183 msgid "On a Train" msgstr "Em um trem" #: gajim/common/pep.py:184 msgid "On a Trip" msgstr "Em um passeio" #: gajim/common/pep.py:185 msgid "Walking" msgstr "Andando" #: gajim/common/pep.py:187 msgid "Coding" msgstr "Codificado" #: gajim/common/pep.py:188 msgid "In a Meeting" msgstr "Em um encontro" #: gajim/common/pep.py:189 msgid "Studying" msgstr "Estudando" #: gajim/common/pep.py:190 msgid "Writing" msgstr "Escrevendo" #: gajim/common/pep.py:195 msgid "accuracy" msgstr "" #: gajim/common/pep.py:196 #, fuzzy msgid "alt" msgstr "padrão" #: gajim/common/pep.py:197 msgid "area" msgstr "" #: gajim/common/pep.py:198 #, fuzzy msgid "bearing" msgstr "marinho" #: gajim/common/pep.py:199 #, fuzzy msgid "building" msgstr "Me escondendo" #: gajim/common/pep.py:200 #, fuzzy msgid "country" msgstr "País:" #: gajim/common/pep.py:201 #, fuzzy msgid "countrycode" msgstr "Conta" #: gajim/common/pep.py:202 msgid "datum" msgstr "" #: gajim/common/pep.py:203 #, fuzzy msgid "description" msgstr "Descrição" #: gajim/common/pep.py:204 #, fuzzy msgid "error" msgstr "Erro" #: gajim/common/pep.py:205 msgid "floor" msgstr "" #: gajim/common/pep.py:206 msgid "lat" msgstr "" #: gajim/common/pep.py:207 msgid "locality" msgstr "" #: gajim/common/pep.py:208 #, fuzzy msgid "lon" msgstr "um" #: gajim/common/pep.py:209 msgid "postalcode" msgstr "" #: gajim/common/pep.py:210 msgid "region" msgstr "" #: gajim/common/pep.py:211 msgid "room" msgstr "sala" #: gajim/common/pep.py:212 msgid "speed" msgstr "" #: gajim/common/pep.py:213 msgid "street" msgstr "" #: gajim/common/pep.py:214 msgid "text" msgstr "" #: gajim/common/pep.py:215 msgid "timestamp" msgstr "" #: gajim/common/pep.py:216 msgid "uri" msgstr "URI" #: gajim/common/pep.py:343 msgid "Unknown Artist" msgstr "Artista desconhecido" #: gajim/common/pep.py:346 msgid "Unknown Title" msgstr "Título desconhecido" #: gajim/common/pep.py:349 msgid "Unknown Source" msgstr "Fonte desconhecida" #: gajim/common/pep.py:352 #, python-format msgid "" "\"%(title)s\" by %(artist)s\n" "from %(source)s" msgstr "" "\"%(title)s\" por %(artist)s\n" "de %(source)s" #: gajim/common/stanza_session.py:422 msgid "" "[This is part of an encrypted session. If you see this message, something " "went wrong.]" msgstr "" "[Isto é parte de uma sessão criptografada. Se você estiver vendo esta " "mensagem, alguma coisa vai errada.]" #: gajim/common/jingle_rtp.py:123 #, fuzzy, python-format msgid "%s configuration error" msgstr "Configuração da sala" #: gajim/common/jingle_rtp.py:124 #, python-format msgid "" "Couldn’t setup %(text)s. Check your configuration.\n" "\n" "Pipeline was:\n" "%(pipeline)s\n" "\n" "Error was:\n" "%(error)s" msgstr "" #: gajim/common/jingle_rtp.py:371 msgid "audio input" msgstr "" #: gajim/common/jingle_rtp.py:375 msgid "audio output" msgstr "" #: gajim/common/jingle_rtp.py:433 msgid "video input" msgstr "" #: gajim/common/jingle_rtp.py:440 msgid "video output" msgstr "" #: gajim/common/helpers.py:296 msgid "Server must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:304 msgid "Invalid character in hostname." msgstr "Caracter inválido no nome do host." #: gajim/common/helpers.py:306 msgid "Server address required." msgstr "Endereço do servidor é requerido." #: gajim/common/helpers.py:310 msgid "Username must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:318 msgid "Invalid character in username." msgstr "Caracter inválido no nome do usuário." #: gajim/common/helpers.py:324 msgid "Resource must be between 1 and 1023 bytes" msgstr "" #: gajim/common/helpers.py:332 msgid "Invalid character in resource." msgstr "Caracter inválido no recurso." #: gajim/common/helpers.py:372 msgid "_Busy" msgstr "_Ocupado" #: gajim/common/helpers.py:377 msgid "_Not Available" msgstr "_Não disponível" #: gajim/common/helpers.py:382 msgid "_Free for Chat" msgstr "Livre para _conversa" #: gajim/common/helpers.py:387 #, fuzzy msgid "?user status:_Available" msgstr "?status da transferência:Parado" #: gajim/common/helpers.py:391 msgid "Connecting" msgstr "Conectando" #: gajim/common/helpers.py:394 msgid "A_way" msgstr "_Afastado" #: gajim/common/helpers.py:399 msgid "_Offline" msgstr "_Desconectado" #: gajim/common/helpers.py:404 msgid "_Invisible" msgstr "_Invisível" #: gajim/common/helpers.py:410 msgid "?contact has status:Unknown" msgstr "?contato tem status:Desconhecido" #: gajim/common/helpers.py:412 msgid "?contact has status:Has errors" msgstr "?contato tem status:Com erros" #: gajim/common/helpers.py:427 msgid "?Subscription we already have:None" msgstr "?Inscrição existente:Nenhuma" #: gajim/common/helpers.py:429 msgid "To" msgstr "Para" #: gajim/common/helpers.py:431 msgid "From" msgstr "De" #: gajim/common/helpers.py:433 msgid "Both" msgstr "Ambos" #: gajim/common/helpers.py:435 #, fuzzy msgid "Unknown" msgstr "?SO:Desconhecido" #: gajim/common/helpers.py:441 msgid "?Ask (for Subscription):None" msgstr "?Pergunta (para inscrição):Nenhuma" #: gajim/common/helpers.py:443 msgid "Subscribe" msgstr "Inscrever" #: gajim/common/helpers.py:452 msgid "?Group Chat Contact Role:None" msgstr "?Regra do contato para conversa em grupo:Nenhuma" #: gajim/common/helpers.py:455 msgid "Moderators" msgstr "Moderadores" #: gajim/common/helpers.py:457 msgid "Moderator" msgstr "Moderador" #: gajim/common/helpers.py:460 msgid "Participants" msgstr "Participantes" #: gajim/common/helpers.py:462 msgid "Participant" msgstr "Participante" #: gajim/common/helpers.py:465 msgid "Visitors" msgstr "Visitantes" #: gajim/common/helpers.py:467 msgid "Visitor" msgstr "Visitante" #: gajim/common/helpers.py:518 msgid "is paying attention to the conversation" msgstr "está prestando a atenção na conversa" #: gajim/common/helpers.py:520 msgid "is doing something else" msgstr "está fazendo outra coisa" #: gajim/common/helpers.py:522 #, fuzzy msgid "is composing a message…" msgstr "está digitando..." #: gajim/common/helpers.py:525 msgid "paused composing a message" msgstr "parou de digitar" #: gajim/common/helpers.py:527 msgid "has closed the chat window or tab" msgstr "fechou a janela de conversa ou aba" #: gajim/common/helpers.py:754 #, python-format msgid "%s GiB" msgstr "%s GiB" #: gajim/common/helpers.py:757 #, python-format msgid "%s GB" msgstr "%s GB" #: gajim/common/helpers.py:761 #, python-format msgid "%s MiB" msgstr "%s MiB" #: gajim/common/helpers.py:764 #, python-format msgid "%s MB" msgstr "%s MB" #: gajim/common/helpers.py:768 #, python-format msgid "%s KiB" msgstr "%s KiB" #: gajim/common/helpers.py:771 #, python-format msgid "%s KB" msgstr "%s KB" #: gajim/common/helpers.py:774 #, python-format msgid "%s B" msgstr "%s B" #: gajim/common/helpers.py:1141 gajim/common/helpers.py:1148 #, python-format msgid "%d message pending" msgid_plural "%d messages pending" msgstr[0] "%d mensagem pendente" msgstr[1] "%d mensagens pendentes" #: gajim/common/helpers.py:1155 #, fuzzy, python-format msgid "from room %s" msgstr " da sala %s" #: gajim/common/helpers.py:1158 gajim/common/helpers.py:1175 #, fuzzy, python-format msgid "from user %s" msgstr " do usuário %s" #: gajim/common/helpers.py:1160 #, fuzzy, python-format msgid "from %s" msgstr " de %s" #: gajim/common/helpers.py:1167 gajim/common/helpers.py:1173 #, python-format msgid "%d event pending" msgid_plural "%d events pending" msgstr[0] "%d evento pendente" msgstr[1] "%d eventos pendentes" #: gajim/common/helpers.py:1191 gajim/common/helpers.py:1203 #: gajim/data/gui/roster_window.ui:85 data/org.gajim.Gajim.desktop.in:4 #: data/org.gajim.Gajim.appdata.xml.in:9 msgid "Gajim" msgstr "Gajim" #: gajim/common/helpers.py:1205 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" #: gajim/common/helpers.py:1392 gajim/data/gui/add_new_contact_window.ui:24 msgid "I would like to add you to my contact list." msgstr "Por favor, eu gostaria de adicioná-lo à minha lista." #: gajim/common/helpers.py:1394 msgid "Hello, I am $name." msgstr "" #: gajim/common/helpers.py:1508 gajim/common/helpers.py:1517 #: gajim/common/helpers.py:1576 msgid "Timeout loading image" msgstr "Tempo esgotado ao carregar a imagem" #: gajim/common/helpers.py:1527 gajim/common/helpers.py:1574 msgid "Image is too big" msgstr "A imagem é grande demais" #: gajim/common/helpers.py:1538 #, fuzzy msgid "PyCURL is not installed" msgstr "CRL ainda não é válido" #: gajim/common/helpers.py:1578 #, fuzzy msgid "Error loading image" msgstr "Tempo esgotado ao carregar a imagem" #: gajim/common/connection_handlers.py:133 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "A informação do registo para o transporte %s não chegou a tempo" #: gajim/common/connection_handlers.py:979 msgid "This message was encrypted with OTR and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:982 msgid "" "This message was encrypted with Legacy OpenPGP and could not be decrypted. " "You can install the PGP plugin to handle those messages." msgstr "" #: gajim/common/connection_handlers.py:986 msgid "" "This message was encrypted with OpenPGP for XMPP and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:992 #, python-format msgid "This message was encrypted with %s and could not be decrypted." msgstr "" #: gajim/common/connection_handlers.py:1060 msgid "message" msgstr "mensagem" #: gajim/common/connection_handlers.py:1863 msgid "I would like to add you to my roster." msgstr "Eu gostaria de adiciona-lo à minha lista." #: gajim/common/exceptions.py:46 #, fuzzy, python-format msgid "" "The database file (%s) cannot be read. Try to repair it (see https://dev." "gajim.org/gajim/gajim/wikis/help/DatabaseBackup) or remove it (all history " "will be lost)." msgstr "" "O arquivo da base de dados (%s) não pôde ser lido. Tente repará-lo (veja " "http://trac.gajim.org/wiki/DatabaseBackup) ou removê-lo (todo o histórico " "será perdido)." #: gajim/common/exceptions.py:60 msgid "Service not available: Gajim is not running, or remote_control is False" msgstr "" "Serviço não disponível: o Gajim não está funcionando ou a opção " "'remote_control' é falsa" #: gajim/common/exceptions.py:82 #, fuzzy, python-format msgid "" "Session bus is not available.\n" "Try reading %(url)s" msgstr "" "O bus de sessão não está disponível.\n" "Veja http://trac.gajim.org/wiki/GajimDBus" #: gajim/common/exceptions.py:94 #, fuzzy, python-format msgid "" "System bus is not available.\n" "Try reading %(url)s" msgstr "" "O bus de sessão não está disponível.\n" "Veja http://trac.gajim.org/wiki/GajimDBus" #: gajim/common/zeroconf/connection_zeroconf.py:193 msgid "Please check if Avahi or Bonjour is installed." msgstr "Por favor verifique se o Avahi ou o Bonjour estão instalados." #: gajim/common/zeroconf/connection_zeroconf.py:203 #: gajim/common/zeroconf/connection_zeroconf.py:207 msgid "Could not start local service" msgstr "Impossível iniciar o serviço local" #: gajim/common/zeroconf/connection_zeroconf.py:204 #, python-format msgid "Unable to bind to port %d." msgstr "Impossível conectar-se à porta %d." #: gajim/common/zeroconf/connection_zeroconf.py:208 #: gajim/common/zeroconf/connection_zeroconf.py:293 #: gajim/common/zeroconf/connection_zeroconf.py:306 #: gajim/common/zeroconf/connection_zeroconf.py:322 msgid "Please check if avahi-daemon is running." msgstr "Por favor verifique se o serviço avahi-daemon está rodando." #: gajim/common/zeroconf/connection_zeroconf.py:292 #: gajim/common/zeroconf/connection_zeroconf.py:305 #: gajim/common/zeroconf/connection_zeroconf.py:321 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Impossível alterar status da conta \"%s\"" #: gajim/common/zeroconf/connection_zeroconf.py:337 msgid "Your message could not be sent." msgstr "Sua mensagem não pode ser enviada." #: gajim/common/zeroconf/connection_zeroconf.py:352 msgid "Contact is offline. Your message could not be sent." msgstr "O contato está offline. Sua mensagem não pode ser enviada." #: gajim/common/zeroconf/connection_zeroconf.py:374 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "" "A conexão ao computador não pode ser estabelecida: tempo excedido ao " "transmitir os dados." #: gajim/common/zeroconf/zeroconf_bonjour.py:197 #: gajim/common/zeroconf/zeroconf_avahi.py:220 #, python-format msgid "Error while adding service. %s" msgstr "Erro ao adicionar serviço. %s" #: gajim/data/gui/blocked_contacts_window.ui:13 msgid "Blocked Contacts" msgstr "Contatos bloqueados" #: gajim/data/gui/advanced_configuration_window.ui:13 msgid "Advanced Configuration Editor" msgstr "Editor de configurações avançado" #: gajim/data/gui/advanced_configuration_window.ui:35 msgid "Filter:" msgstr "Filtro:" #: gajim/data/gui/advanced_configuration_window.ui:107 #: gajim/data/gui/features_window.ui:111 msgid "Description" msgstr "Descrição" #: gajim/data/gui/advanced_configuration_window.ui:136 msgid "NOTE: You should restart Gajim for some settings to take effect" msgstr "" "NOTA: Você deve reiniciar o Gajim para que algumas configurações " "tenham efeito" #: gajim/data/gui/advanced_configuration_window.ui:161 #, fuzzy msgid "_Reset to default" msgstr "Voltar para as cores _padrões" #: gajim/data/gui/join_groupchat_window.ui:34 #, fuzzy msgid "Bookmark this Groupchat" msgstr "Adicionar esta sala aos marcadores" #: gajim/data/gui/join_groupchat_window.ui:51 msgid "Join this Groupchat everytime Gajim is started" msgstr "" #: gajim/data/gui/join_groupchat_window.ui:69 #, fuzzy msgid "Bookmark" msgstr "Ma_rcadores" #: gajim/data/gui/join_groupchat_window.ui:82 #, fuzzy msgid "Autojoin" msgstr "Ingresso automático" #: gajim/data/gui/join_groupchat_window.ui:119 msgid "Account" msgstr "Conta" #: gajim/data/gui/join_groupchat_window.ui:226 #, fuzzy msgid "Room" msgstr "Sala:" #: gajim/data/gui/join_groupchat_window.ui:238 #, fuzzy msgid "Recently" msgstr "Recentemente:" #: gajim/data/gui/join_groupchat_window.ui:290 msgid "Search the rooms on this server" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:12 #, fuzzy msgid "HTTP Connect" msgstr "" "Conexão HTTP\n" "SOCKS5\n" "BOSH" #: gajim/data/gui/manage_proxies_window.ui:15 msgid "SOCKS5" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:18 msgid "BOSH" msgstr "" #: gajim/data/gui/manage_proxies_window.ui:25 msgid "Manage Proxy Profiles" msgstr "Gerenciar perfis de proxy" #: gajim/data/gui/manage_proxies_window.ui:148 msgid "_Name:" msgstr "_Nome:" #: gajim/data/gui/manage_proxies_window.ui:161 msgid "_Type:" msgstr "_Tipo:" #: gajim/data/gui/manage_proxies_window.ui:205 msgid "Properties" msgstr "Propriedades" #: gajim/data/gui/manage_proxies_window.ui:234 msgid "_BOSH URL:" msgstr "URL _BOSH:" #: gajim/data/gui/manage_proxies_window.ui:258 msgid "Proxy _Host:" msgstr "Máqu_ina Proxy:" #: gajim/data/gui/manage_proxies_window.ui:269 msgid "Use HTTP prox_y" msgstr "Usar prox_y HTTP" #: gajim/data/gui/manage_proxies_window.ui:288 msgid "Proxy _Port:" msgstr "_Porta do máquina:" #: gajim/data/gui/manage_proxies_window.ui:299 msgid "Use proxy auth_entication" msgstr "Usar aut_enticação de proxy" #: gajim/data/gui/manage_proxies_window.ui:318 msgid "_Username:" msgstr "Nome de _usuário:" #: gajim/data/gui/manage_proxies_window.ui:331 msgid "Pass_word:" msgstr "_Senha:" #: gajim/data/gui/manage_proxies_window.ui:391 msgid "Settings" msgstr "Configurações" #: gajim/data/gui/change_password_dialog.ui:89 msgid "Enter new password:" msgstr "Digite sua nova senha:" #: gajim/data/gui/change_password_dialog.ui:115 msgid "Enter it again for confirmation:" msgstr "Digite novamente para confirmar:" #: gajim/data/gui/zeroconf_information_window.ui:8 #: gajim/data/gui/vcard_information_window.ui:8 msgid "Contact Information" msgstr "Informações do contato" #: gajim/data/gui/zeroconf_information_window.ui:54 msgid "Local jid:" msgstr "JID local:" #: gajim/data/gui/zeroconf_information_window.ui:67 #: gajim/data/gui/tooltip_roster_contact.ui:55 #: gajim/data/gui/tooltip_gc_contact.ui:75 msgid "Resource:" msgstr "Recurso:" #: gajim/data/gui/zeroconf_information_window.ui:80 #: gajim/data/gui/tooltip_roster_contact.ui:110 msgid "Status:" msgstr "Status:" #: gajim/data/gui/zeroconf_information_window.ui:89 #: gajim/data/gui/history_window.ui:290 msgid "_Log conversation history" msgstr "_Histórico de conversação" #: gajim/data/gui/zeroconf_information_window.ui:215 #: gajim/data/gui/vcard_information_window.ui:360 msgid "Contact" msgstr "Contato" #: gajim/data/gui/zeroconf_information_window.ui:234 msgid "First Name:" msgstr "Primeiro nome:" #: gajim/data/gui/zeroconf_information_window.ui:247 msgid "Last Name:" msgstr "Último nome:" #: gajim/data/gui/zeroconf_information_window.ui:260 #: gajim/data/gui/archiving_313_preferences_item.ui:84 #: gajim/data/gui/tooltip_roster_contact.ui:30 #: gajim/data/gui/tooltip_gc_contact.ui:50 msgid "Jabber ID:" msgstr "Jabber ID:" #: gajim/data/gui/zeroconf_information_window.ui:273 msgid "E-Mail:" msgstr "Email:" #: gajim/data/gui/zeroconf_information_window.ui:354 msgid "Personal" msgstr "Pessoal" #: gajim/data/gui/gc_occupants_menu.ui:12 msgid "_Send Private Message" msgstr "_Enviar mensagem privada" #: gajim/data/gui/gc_occupants_menu.ui:21 msgid "Send _File" msgstr "Enviar _arquivo" #: gajim/data/gui/gc_occupants_menu.ui:29 msgid "Occupant Actions" msgstr "Ações de ocupante" #: gajim/data/gui/gc_occupants_menu.ui:38 msgid "_Voice" msgstr "_Voz" #: gajim/data/gui/gc_occupants_menu.ui:46 msgid "Mo_derator" msgstr "Mo_derador" #: gajim/data/gui/gc_occupants_menu.ui:60 msgid "_Member" msgstr "_Membro" #: gajim/data/gui/gc_occupants_menu.ui:68 msgid "_Admin" msgstr "_Administração" #: gajim/data/gui/gc_occupants_menu.ui:76 msgid "_Owner" msgstr "Proprietári_o" #: gajim/data/gui/gc_occupants_menu.ui:90 msgid "_Kick" msgstr "_Chutar" #: gajim/data/gui/gc_occupants_menu.ui:98 msgid "_Ban" msgstr "_Banir" #: gajim/data/gui/gc_occupants_menu.ui:124 msgid "_Add to Roster" msgstr "_Adicionar à lista" #: gajim/data/gui/gc_occupants_menu.ui:132 #, fuzzy msgid "_Execute command" msgstr "_Executar comando" #: gajim/data/gui/archiving_313_preferences_item.ui:12 #: gajim/data/gui/preferences_window.ui:102 #: gajim/data/gui/preferences_window.ui:153 #: gajim/data/gui/archiving_313_preferences_window.ui:25 #, fuzzy msgid "Always" msgstr "Afastado" #: gajim/data/gui/archiving_313_preferences_item.ui:15 #: gajim/data/gui/preferences_window.ui:96 #: gajim/data/gui/preferences_window.ui:156 #: gajim/data/gui/archiving_313_preferences_window.ui:31 #, fuzzy msgid "Never" msgstr "_Nunca" #: gajim/data/gui/archiving_313_preferences_item.ui:96 #, fuzzy msgid "Preference:" msgstr "Preferências" #: gajim/data/gui/tooltip_roster_contact.ui:125 #, fuzzy msgid "Idle since:" msgstr " desde %s" #: gajim/data/gui/tooltip_roster_contact.ui:151 #: gajim/data/gui/change_status_message_dialog.ui:191 msgid "Mood:" msgstr "Humor:" #: gajim/data/gui/tooltip_roster_contact.ui:164 #: gajim/data/gui/change_status_message_dialog.ui:179 msgid "Activity:" msgstr "Atividade:" #: gajim/data/gui/tooltip_roster_contact.ui:178 #, fuzzy msgid "Tune:" msgstr "Sintonia:" #: gajim/data/gui/tooltip_roster_contact.ui:191 #, fuzzy msgid "Location:" msgstr "Notificação" #: gajim/data/gui/tooltip_roster_contact.ui:255 #, fuzzy msgid "OpenPGP:" msgstr "OpenPGP: " #: gajim/data/gui/tooltip_roster_contact.ui:281 msgid "Subscription:" msgstr "Inscrição:" #: gajim/data/gui/zeroconf_context_menu.ui:11 #: gajim/data/gui/account_context_menu.ui:11 msgid "_Status" msgstr "_Status" #: gajim/data/gui/zeroconf_context_menu.ui:26 #: gajim/data/gui/account_context_menu.ui:79 msgid "_Modify Account..." msgstr "_Alterar conta..." #: gajim/data/gui/atom_entry_window.ui:8 msgid "New entry received" msgstr "Novo evento recebido" #: gajim/data/gui/atom_entry_window.ui:92 msgid "Feed name:" msgstr "Nome do feed:" #: gajim/data/gui/atom_entry_window.ui:119 msgid "Entry:" msgstr "Entrada:" #: gajim/data/gui/atom_entry_window.ui:131 msgid "Last modified:" msgstr "Modificado:" #: gajim/data/gui/atom_entry_window.ui:196 msgid "Next entry" msgstr "" #: gajim/data/gui/gc_control_popup_menu.ui:11 msgid "Change _Nickname..." msgstr "Alterar _apelido..." #: gajim/data/gui/gc_control_popup_menu.ui:20 msgid "_Manage Room" msgstr "_Gerenciar sala" #: gajim/data/gui/gc_control_popup_menu.ui:31 msgid "Change _Subject..." msgstr "Alterar as_sunto..." #: gajim/data/gui/gc_control_popup_menu.ui:38 msgid "Configure _Room..." msgstr "Configurar _sala..." #: gajim/data/gui/gc_control_popup_menu.ui:52 msgid "_Destroy Room" msgstr "_Excluir sala" #: gajim/data/gui/gc_control_popup_menu.ui:64 msgid "_Minimize on close" msgstr "_Minimizar ao fechar" #: gajim/data/gui/gc_control_popup_menu.ui:85 #, fuzzy msgid "_Request Voice" msgstr "_Voz" #: gajim/data/gui/profile_window.ui:7 msgid "Personal Information" msgstr "Informações pessoais" #: gajim/data/gui/profile_window.ui:35 #: gajim/data/gui/vcard_information_window.ui:382 msgid "Name:" msgstr "Nome:" #: gajim/data/gui/profile_window.ui:59 #: gajim/data/gui/vcard_information_window.ui:410 msgid "Nickname:" msgstr "Apelido:" #. Family Name #: gajim/data/gui/profile_window.ui:94 #: gajim/data/gui/vcard_information_window.ui:740 msgid "Family:" msgstr "Família:" #. Given Name #: gajim/data/gui/profile_window.ui:118 #: gajim/data/gui/vcard_information_window.ui:822 msgid "Given:" msgstr "Primeiro nome:" #. Middle Name #: gajim/data/gui/profile_window.ui:142 #: gajim/data/gui/vcard_information_window.ui:753 msgid "Middle:" msgstr "Nome do meio:" #. Prefix in Name #: gajim/data/gui/profile_window.ui:156 #: gajim/data/gui/vcard_information_window.ui:766 msgid "Prefix:" msgstr "Prefixo" #. Suffix in Name #: gajim/data/gui/profile_window.ui:190 #: gajim/data/gui/vcard_information_window.ui:835 msgid "Suffix:" msgstr "Sufixo" #: gajim/data/gui/profile_window.ui:222 #: gajim/data/gui/vcard_information_window.ui:878 msgid "Full Name" msgstr "Nome completo" #: gajim/data/gui/profile_window.ui:250 gajim/data/gui/profile_window.ui:724 #: gajim/data/gui/vcard_information_window.ui:454 #: gajim/data/gui/vcard_information_window.ui:1087 msgid "Street:" msgstr "Rua:" #: gajim/data/gui/profile_window.ui:274 gajim/data/gui/profile_window.ui:748 #: gajim/data/gui/vcard_information_window.ui:535 #: gajim/data/gui/vcard_information_window.ui:1126 msgid "Extra Address:" msgstr "Complemento:" #: gajim/data/gui/profile_window.ui:298 gajim/data/gui/profile_window.ui:772 #: gajim/data/gui/vcard_information_window.ui:467 #: gajim/data/gui/vcard_information_window.ui:1100 msgid "City:" msgstr "Cidade:" #: gajim/data/gui/profile_window.ui:322 gajim/data/gui/profile_window.ui:796 #: gajim/data/gui/vcard_information_window.ui:548 #: gajim/data/gui/vcard_information_window.ui:1140 msgid "Postal Code:" msgstr "Código postal:" #: gajim/data/gui/profile_window.ui:346 gajim/data/gui/profile_window.ui:820 #: gajim/data/gui/vcard_information_window.ui:480 #: gajim/data/gui/vcard_information_window.ui:1113 msgid "State:" msgstr "Estado:" #: gajim/data/gui/profile_window.ui:370 gajim/data/gui/profile_window.ui:844 #: gajim/data/gui/vcard_information_window.ui:561 #: gajim/data/gui/vcard_information_window.ui:1153 msgid "Country:" msgstr "País:" #: gajim/data/gui/profile_window.ui:396 gajim/data/gui/profile_window.ui:870 #: gajim/data/gui/vcard_information_window.ui:618 #: gajim/data/gui/vcard_information_window.ui:1253 msgid "Address" msgstr "Endereço" #: gajim/data/gui/profile_window.ui:413 #: gajim/data/gui/vcard_information_window.ui:635 msgid "Homepage:" msgstr "Página pessoal:" #: gajim/data/gui/profile_window.ui:437 gajim/data/gui/profile_window.ui:887 #: gajim/data/gui/vcard_information_window.ui:648 #: gajim/data/gui/vcard_information_window.ui:1270 msgid "E-Mail:" msgstr "Email:" #: gajim/data/gui/profile_window.ui:462 gajim/data/gui/profile_window.ui:912 #: gajim/data/gui/vcard_information_window.ui:661 #: gajim/data/gui/vcard_information_window.ui:1283 msgid "Phone No.:" msgstr "Telefone:" #: gajim/data/gui/profile_window.ui:497 msgid "Avatar:" msgstr "Avatar:" #: gajim/data/gui/profile_window.ui:540 msgid "Click to set your avatar" msgstr "Clique para definir seu avatar" #: gajim/data/gui/profile_window.ui:566 #: gajim/data/gui/vcard_information_window.ui:702 msgid "Format: YYYY-MM-DD" msgstr "Formato: YYYY-MM-DD" #: gajim/data/gui/profile_window.ui:574 #: gajim/data/gui/vcard_information_window.ui:708 msgid "Birthday:" msgstr "Aniversário:" #: gajim/data/gui/profile_window.ui:598 #: gajim/data/gui/vcard_information_window.ui:937 msgid "Personal Info" msgstr "Informações pessoais" #: gajim/data/gui/profile_window.ui:617 #: gajim/data/gui/vcard_information_window.ui:960 msgid "Company:" msgstr "Empresa:" #: gajim/data/gui/profile_window.ui:641 #: gajim/data/gui/vcard_information_window.ui:990 msgid "Department:" msgstr "Departamento:" #: gajim/data/gui/profile_window.ui:665 #: gajim/data/gui/vcard_information_window.ui:1018 msgid "Position:" msgstr "Posição:" #: gajim/data/gui/profile_window.ui:689 #: gajim/data/gui/vcard_information_window.ui:1045 msgid "Role:" msgstr "Cargo:" #: gajim/data/gui/profile_window.ui:947 #: gajim/data/gui/vcard_information_window.ui:1336 msgid "Work" msgstr "Trabalho" #. "About" is the text of a tab of vcard window #: gajim/data/gui/profile_window.ui:979 #: gajim/data/gui/vcard_information_window.ui:1368 #: gajim/data/gui/application_menu.ui:62 msgid "About" msgstr "Sobre" #: gajim/data/gui/filetransfers.ui:20 #, fuzzy msgid "Con_tinue" msgstr "_Continuar" #: gajim/data/gui/filetransfers.ui:28 gajim/data/gui/filetransfers.ui:156 msgid "_Pause" msgstr "_Pausa" #: gajim/data/gui/filetransfers.ui:36 gajim/data/gui/filetransfers.ui:174 #: gajim/data/gui/service_registration_window.ui:53 msgid "_Cancel" msgstr "_Cancelar" #: gajim/data/gui/filetransfers.ui:50 msgid "_Open Containing Folder" msgstr "_Abrir pasta do arquivo" #: gajim/data/gui/filetransfers.ui:79 gajim/data/gui/filetransfers.ui:253 msgid "File Transfers" msgstr "Transferência de arquivos" #: gajim/data/gui/filetransfers.ui:110 msgid "file transfers list" msgstr "lista de transferência de arquivos" #: gajim/data/gui/filetransfers.ui:111 msgid "A list of active, completed and stopped file transfers" msgstr "Uma lista de transferências de arquivo ativas, completadas e paradas" #: gajim/data/gui/filetransfers.ui:131 msgid "Clean _up" msgstr "_Limpar" #: gajim/data/gui/filetransfers.ui:137 msgid "Removes completed, cancelled and failed file transfers from the list" msgstr "" "Remover da lista as transferências de arquivos completas, canceladas ou " "interrompidas" #: gajim/data/gui/filetransfers.ui:143 msgid "Remove file transfer from the list." msgstr "Remover a transferência de arquivo da lista." #: gajim/data/gui/filetransfers.ui:144 msgid "" "This action removes single file transfer from the list. If the transfer is " "active, it is first stopped and then removed" msgstr "" "Esta ação remove uma única transferência de arquivo da lista. Se a " "transferência está ativa, isto vai pará-la e removê-la" #: gajim/data/gui/filetransfers.ui:180 #, fuzzy msgid "Cancels the selected file transfer and removes incomplete files" msgstr "" "Cancela a transferência de arquivo selecionada e remove o arquivo incompleto" #: gajim/data/gui/filetransfers.ui:186 msgid "Cancel file transfer" msgstr "Cancelar transferência de arquivo" #: gajim/data/gui/filetransfers.ui:187 msgid "Cancels the selected file transfer" msgstr "Cancela a transferência de arquivo selecionada" #: gajim/data/gui/filetransfers.ui:199 #, fuzzy msgid "_Close" msgstr "_Enviar & fechar" #: gajim/data/gui/filetransfers.ui:205 msgid "Hides the window" msgstr "Esconder a janela" #: gajim/data/gui/filetransfers.ui:226 msgid "_Notify me when a file transfer is complete" msgstr "_Notificar-me quando a transmissão do arquivo terminar" #: gajim/data/gui/filetransfers.ui:236 msgid "When a file transfer is complete show a popup notification" msgstr "Exibir um alerta visual quanto uma transferência de arquivo terminar" #: gajim/data/gui/filetransfers.ui:254 msgid "Shows a list of file transfers between you and others" msgstr "Exibe uma lista de transferências de arquivos entre você e os outros" #: gajim/data/gui/service_registration_window.ui:18 msgid "Register to" msgstr "Registrar para" #: gajim/data/gui/service_registration_window.ui:70 #: gajim/data/gui/roster_item_exchange_window.ui:126 msgid "_OK" msgstr "_OK" #: gajim/data/gui/groupchat_control.ui:13 gajim/data/gui/chat_control.ui:293 #: gajim/data/gui/gajim_themes_window.ui:264 msgid "Bold" msgstr "Negrito" #: gajim/data/gui/groupchat_control.ui:22 gajim/data/gui/chat_control.ui:302 #: gajim/data/gui/gajim_themes_window.ui:284 msgid "Italic" msgstr "Itálico" #: gajim/data/gui/groupchat_control.ui:31 gajim/data/gui/chat_control.ui:311 msgid "Underline" msgstr "Sublinhado" #: gajim/data/gui/groupchat_control.ui:40 gajim/data/gui/chat_control.ui:320 msgid "Strike" msgstr "Tachado" #: gajim/data/gui/groupchat_control.ui:62 gajim/data/gui/chat_control.ui:342 msgid "Font" msgstr "Fonte" #: gajim/data/gui/groupchat_control.ui:76 gajim/data/gui/chat_control.ui:356 #, fuzzy msgid "Clear formatting" msgstr "Limpar formatação" #: gajim/data/gui/groupchat_control.ui:283 gajim/data/gui/chat_control.ui:805 #, fuzzy msgid "Choose an encryption" msgstr "Escolha o arquivo para enviar..." #: gajim/data/gui/groupchat_control.ui:329 gajim/data/gui/chat_control.ui:853 msgid "Show a list of emoticons (Alt+M)" msgstr "Exibe uma lista de emoticons (Alt+M)" #: gajim/data/gui/popup_notification_window.ui:55 #, fuzzy msgid "Event Type" msgstr "Evento" #: gajim/data/gui/popup_notification_window.ui:100 #, fuzzy msgid "Event desc" msgstr "Eventos" #: gajim/data/gui/chat_control.ui:41 #, fuzzy msgid "1" msgstr "Fonte" #: gajim/data/gui/chat_control.ui:63 #, fuzzy msgid "2 abc" msgstr "Fonte" #: gajim/data/gui/chat_control.ui:84 #, fuzzy msgid "3 def" msgstr "Fonte" #: gajim/data/gui/chat_control.ui:105 #, fuzzy msgid "4 ghi" msgstr "Fonte" #: gajim/data/gui/chat_control.ui:126 #, fuzzy msgid "5 jkl" msgstr "Fonte" #: gajim/data/gui/chat_control.ui:147 #, fuzzy msgid "6 mno" msgstr "Fonte" #: gajim/data/gui/chat_control.ui:167 msgid "7 pqrs" msgstr "" #: gajim/data/gui/chat_control.ui:188 #, fuzzy msgid "8 tuv" msgstr "Fonte" #: gajim/data/gui/chat_control.ui:209 msgid "9 wxyz" msgstr "" #: gajim/data/gui/chat_control.ui:229 #, fuzzy msgid "*" msgstr "Fonte" #: gajim/data/gui/chat_control.ui:249 #, fuzzy msgid "0" msgstr "Fonte" #: gajim/data/gui/chat_control.ui:269 #, fuzzy msgid "#" msgstr "Fonte" #: gajim/data/gui/chat_control.ui:729 msgid "#" msgstr "#" #: gajim/data/gui/vcard_information_window.ui:55 msgid "Jabber ID:" msgstr "Jabber ID:" #: gajim/data/gui/vcard_information_window.ui:69 msgid "Resource:" msgstr "Recurso:" #: gajim/data/gui/vcard_information_window.ui:83 msgid "Status:" msgstr "Status:" #: gajim/data/gui/vcard_information_window.ui:97 msgid "Client:" msgstr "Cliente:" #: gajim/data/gui/vcard_information_window.ui:111 msgid "System:" msgstr "Sistema:" #: gajim/data/gui/vcard_information_window.ui:125 msgid "Contact time:" msgstr "Tempo do contato:" #: gajim/data/gui/vcard_information_window.ui:222 #, fuzzy msgid "User avatar:" msgstr "Avatar:" #: gajim/data/gui/vcard_information_window.ui:234 #, fuzzy msgid "Configured avatar:" msgstr "Configurar avatar:" #. Given Name #: gajim/data/gui/vcard_information_window.ui:263 msgid "Ask:" msgstr "Pergunta:" #. Family Name #: gajim/data/gui/vcard_information_window.ui:277 msgid "Subscription:" msgstr "Inscrição:" #: gajim/data/gui/vcard_information_window.ui:893 #: gajim/data/gui/vcard_information_window.ui:912 #: gajim/data/gui/vcard_information_window.ui:1310 msgid "button" msgstr "" #: gajim/data/gui/vcard_information_window.ui:1398 msgid "Comments" msgstr "Comentários" #: gajim/data/gui/gajim_themes_window.ui:12 #, fuzzy msgid "Account row" msgstr "Conta" #: gajim/data/gui/gajim_themes_window.ui:15 #, fuzzy msgid "Group row" msgstr "Grupo" #: gajim/data/gui/gajim_themes_window.ui:18 #, fuzzy msgid "Contact row" msgstr "Contato" #: gajim/data/gui/gajim_themes_window.ui:21 msgid "Chat Banner" msgstr "" #: gajim/data/gui/gajim_themes_window.ui:28 msgid "Gajim Themes Customization" msgstr "Customização de temas do Gajim" #: gajim/data/gui/gajim_themes_window.ui:157 msgid "Text _color:" msgstr "_Cor do texto" #: gajim/data/gui/gajim_themes_window.ui:173 msgid "_Background:" msgstr "Cor _de fundo" #: gajim/data/gui/gajim_themes_window.ui:189 msgid "Text _font:" msgstr "_Fonte do texto" #: gajim/data/gui/gajim_themes_window.ui:207 msgid "Font style:" msgstr "Estilo da fonte:" #: gajim/data/gui/gajim_themes_window.ui:375 msgid "Composing" msgstr "Escrevendo" #: gajim/data/gui/gajim_themes_window.ui:387 msgid "Paused" msgstr "Pausado" #: gajim/data/gui/gajim_themes_window.ui:399 msgid "Gone" msgstr "Enviado" #: gajim/data/gui/gajim_themes_window.ui:411 msgid "" "MUC\n" "Messages" msgstr "" "MUC\n" "mensagens" #: gajim/data/gui/gajim_themes_window.ui:424 msgid "" "MUC Directed\n" "Messages" msgstr "" "MUC Direto\n" "mensagens" #: gajim/data/gui/gajim_themes_window.ui:510 msgid "Chatstate Tab Colors" msgstr "Aba de cores do bate-papo" #: gajim/data/gui/preferences_window.ui:48 #, fuzzy msgid "Use default applications" msgstr "Sempre usar as aplicações padrões do OS/X" #: gajim/data/gui/preferences_window.ui:51 msgid "Custom" msgstr "Personalizar" #: gajim/data/gui/preferences_window.ui:62 #: gajim/data/gui/preferences_window.ui:79 #, fuzzy msgid "All chat states" msgstr "Totos os status" #: gajim/data/gui/preferences_window.ui:65 #: gajim/data/gui/preferences_window.ui:82 #, fuzzy msgid "Composing only" msgstr "Escrevendo" #: gajim/data/gui/preferences_window.ui:99 #, fuzzy msgid "Only when pending events" msgstr "" "Nunca\n" "Somente quando houver eventos pendentes\n" "Sempre" #: gajim/data/gui/preferences_window.ui:113 #, fuzzy msgid "Pop it up" msgstr "_Alerta visual" #: gajim/data/gui/preferences_window.ui:116 #, fuzzy msgid "Notify me about it" msgstr "_Notifique-me sobre isto" #: gajim/data/gui/preferences_window.ui:119 #, fuzzy msgid "Show only in roster" msgstr "Mostre somente na _lista" #: gajim/data/gui/preferences_window.ui:130 msgid "Detached roster with detached chats" msgstr "" #: gajim/data/gui/preferences_window.ui:133 msgid "Detached roster with single chat" msgstr "" #: gajim/data/gui/preferences_window.ui:136 msgid "Single window for everything" msgstr "" #: gajim/data/gui/preferences_window.ui:139 msgid "Detached roster with chat grouped by account" msgstr "" #: gajim/data/gui/preferences_window.ui:142 msgid "Detached roster with chat grouped by type" msgstr "" #: gajim/data/gui/preferences_window.ui:159 #, fuzzy msgid "Last state" msgstr "Último status: %s" #: gajim/data/gui/preferences_window.ui:195 #: gajim/data/gui/application_menu.ui:94 gajim/data/gui/shortcuts_window.ui:188 msgid "Preferences" msgstr "Preferências" #: gajim/data/gui/preferences_window.ui:237 msgid "Display a_vatars of contacts in roster" msgstr "Exibir a_vatar dos contatos na lista" #: gajim/data/gui/preferences_window.ui:241 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" msgstr "" "Se marcado, Gajim exibirá avatars dos contatos na janela da lista e na " "conferência" #: gajim/data/gui/preferences_window.ui:255 msgid "Display status _messages of contacts in roster" msgstr "Exibir _mensagem de status da lista de contato" #: gajim/data/gui/preferences_window.ui:259 #, fuzzy msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name, in roster window and in group chats" msgstr "" "Se marcado, Gajim indicará mensagens de status dos contatos sob o nome do " "contato na janela da lista e na conferência" #: gajim/data/gui/preferences_window.ui:273 #, fuzzy msgid "Display e_xtra information of contacts in roster (mood, activity, ...)" msgstr "Exibir hum_or dos contatos na lista" #: gajim/data/gui/preferences_window.ui:277 msgid "" "If checked, Gajim will display the mood of contacts in the roster window" msgstr "Se marcado, Gajim exibirá o humor dos contatos na janela da lista" #: gajim/data/gui/preferences_window.ui:298 msgid "Sort contacts by status" msgstr "Ordena contatos pelo status" #: gajim/data/gui/preferences_window.ui:308 msgid "in _roster" msgstr "na _lista" #: gajim/data/gui/preferences_window.ui:325 msgid "in _group chats" msgstr "em uma c_onferência" #: gajim/data/gui/preferences_window.ui:354 msgid "Roster Appearance" msgstr "Aparência da lista" #: gajim/data/gui/preferences_window.ui:384 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" msgstr "" "Se habilitado, Gajim substituirá o ascii para smilies, como ':)' com a " "animação equivalente ou estático emoticons gráfico" #: gajim/data/gui/preferences_window.ui:390 msgid "_Emoticons:" msgstr "_Emoticons:" #: gajim/data/gui/preferences_window.ui:406 msgid "_Window behavior:" msgstr "Comportamento da jan_ela:" #: gajim/data/gui/preferences_window.ui:420 #, fuzzy msgid "_Show roster on startup:" msgstr "Exibi_r lista" #: gajim/data/gui/preferences_window.ui:431 msgid "_Ignore rich content in incoming messages" msgstr "_Ignorar conteúdo formatado nas mensagens recebidas" #: gajim/data/gui/preferences_window.ui:435 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." msgstr "" "Algumas mensagens podem incluir conteúdo rico (formatação, cores etc). Se " "marcado, o Gajim apenas exibirá as mensagens em texto puro." #: gajim/data/gui/preferences_window.ui:449 msgid "_Highlight misspelled words" msgstr "_Destacar palavras mal escritas" #: gajim/data/gui/preferences_window.ui:452 msgid "" "If checked, Gajim will highlight spelling errors in input fields of chat " "windows. If no language is explicitly set via right click on the input " "field, the default language will be used for this contact or group chat." msgstr "" "Se marcado, o Gajim irá destacar erros de ortografia em campos de entrada " "nas janelas de conversa. Se nenhuma linguagem foi explicitamente definida " "através de um clique com o botão direito no campo de entrada, a linguagem " "padrão será usada para este contato ou conferência." #: gajim/data/gui/preferences_window.ui:466 #, fuzzy msgid "Notify by icon when your messages are received" msgstr "Som a ser tocado quando qualquer mensagem MUC chegar." #: gajim/data/gui/preferences_window.ui:520 msgid "Show avatar in chat tabs" msgstr "" #: gajim/data/gui/preferences_window.ui:552 msgid "Chat Appearance" msgstr "Aparência da conversa" #: gajim/data/gui/preferences_window.ui:607 msgid "When new event is received:" msgstr "Quando novo evento é recebido:" #: gajim/data/gui/preferences_window.ui:645 msgid "Notify me about contacts that sign _in" msgstr "Notifique-me sobre contatos ao _conectar" #: gajim/data/gui/preferences_window.ui:663 msgid "Notify me about contacts that sign _out" msgstr "Notifique-me sobre contatos ao _desconectar" #: gajim/data/gui/preferences_window.ui:667 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" msgstr "" "Gajim notificará você através de um alerta visual na parte inferior direita " "da tela sobre os contatos que se desconectaram" #: gajim/data/gui/preferences_window.ui:681 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" msgstr "" "Permite janela/notificação quando eu estou _afastado/ND/ocupado/invisível" #: gajim/data/gui/preferences_window.ui:698 #, fuzzy msgid "Allow popup/notifications when a chat window is opened" msgstr "" "Permite janela/notificação quando eu estou _afastado/ND/ocupado/invisível" #: gajim/data/gui/preferences_window.ui:722 #, fuzzy msgid "Show notification area icon:" msgstr "Usar ícone na bandeja (também conhecido por área de notificação)" #: gajim/data/gui/preferences_window.ui:762 msgid "Visual Notifications" msgstr "Notificações visuais" #: gajim/data/gui/preferences_window.ui:795 msgid "Play _sounds" msgstr "Tocar _sons" #: gajim/data/gui/preferences_window.ui:812 #: gajim/data/gui/preferences_window.ui:1656 msgid "Ma_nage..." msgstr "Gere_nciar..." #: gajim/data/gui/preferences_window.ui:834 msgid "Allow sound when I'm _busy" msgstr "Permitir som quando eu estiver _ocupado" #: gajim/data/gui/preferences_window.ui:856 msgid "Sounds" msgstr "Sons" #: gajim/data/gui/preferences_window.ui:877 msgid "Notifications" msgstr "Notificações" #: gajim/data/gui/preferences_window.ui:911 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " "display in chat windows." msgstr "" "O Gajim pode enviar e receber meta-informações relacionadas a conversação " "que você pode ter com um contato. Aqui você pode especificar quais " "caracteres você quer para enviar a outra parte." #: gajim/data/gui/preferences_window.ui:916 msgid "_Display chat state notifications:" msgstr "_Exibir notificações de status de conversa:" #: gajim/data/gui/preferences_window.ui:967 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " "send to the other party." msgstr "" "Gajim pode enviar e receber meta-informações relacionadas a conversação que " "você pode ter com um contato. Aqui você pode especificar quais caracteres " "você quer para enviar a outra parte." #: gajim/data/gui/preferences_window.ui:972 msgid "_Send chat state notifications:" msgstr "_Enviar notificações de status de conversa:" #: gajim/data/gui/preferences_window.ui:990 msgid "Chat state notifications" msgstr "Notificações do estado da conversa" #: gajim/data/gui/preferences_window.ui:1012 msgid "Personal Events" msgstr "Eventos pessoais" #: gajim/data/gui/preferences_window.ui:1043 msgid "_Away after:" msgstr "_Afastado depois:" #: gajim/data/gui/preferences_window.ui:1047 msgid "" "If checked, Gajim will change status to Away when the computer is unused." msgstr "" "Se marcado, o Gajim irá alterar o status para Ausente quando o computador " "não estiver em uso." #: gajim/data/gui/preferences_window.ui:1060 msgid "_Not available after:" msgstr "_Não disponível depois:" #: gajim/data/gui/preferences_window.ui:1064 msgid "" "If checked, Gajim will change status to Not Available when the computer has " "not been used even longer" msgstr "" "Se marcado, o Gajim irá alterar o status para Não disponível quando o " "computador não estiver mais em uso" #: gajim/data/gui/preferences_window.ui:1079 #: gajim/data/gui/preferences_window.ui:1091 msgid "minutes" msgstr "minutos" #: gajim/data/gui/preferences_window.ui:1103 msgid "" "The auto away status message. If empty, Gajim will not change the current " "status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-away timeout" msgstr "" "A mensagem de status de ausência automática. Se vazia, o Gajim não irá " "alterar a mensagem de status atual\n" "$S será substituída pela mensagem de status anterior\n" "$T será substituída pela mensagem automática de ausência" #: gajim/data/gui/preferences_window.ui:1117 msgid "" "The auto not available status message. If empty, Gajim will not change the " "current status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-not-available timeout" msgstr "" "A mensagem de status de não disponibilidade automática. Se vazia, o Gajim " "não irá alterar a mensagem de status atual\n" "$S irá ser substituída pela mensagem de status anterior\n" "$T irá ser substituída pela mensagem de ausência automática" #: gajim/data/gui/preferences_window.ui:1165 msgid "Auto Status" msgstr "Status automático" #: gajim/data/gui/preferences_window.ui:1200 msgid "Ask status message when I:" msgstr "Solicite uma mensagem de status quanto eu:" #: gajim/data/gui/preferences_window.ui:1215 msgid "Sign _in" msgstr "_Conectar" #: gajim/data/gui/preferences_window.ui:1232 msgid "Sign _out" msgstr "_Desconectar" #: gajim/data/gui/preferences_window.ui:1265 msgid "" "If enabled, Gajim will not ask for a status message. The specified default " "message will be used instead." msgstr "" "Se habilitado, o Gajim não irá perguntar por mensagem de status. A mensagem " "padrão especificada será usada neste caso." #: gajim/data/gui/preferences_window.ui:1277 #: gajim/data/gui/preferences_window.ui:1479 msgid "Status" msgstr "Status" #: gajim/data/gui/preferences_window.ui:1288 msgid "Default Message" msgstr "Mensagem padrão" #: gajim/data/gui/preferences_window.ui:1303 msgid "Enabled" msgstr "Habilitado" #: gajim/data/gui/preferences_window.ui:1329 msgid "Status Messages" msgstr "Mensagens de status" #: gajim/data/gui/preferences_window.ui:1459 msgid "Preset Status Messages" msgstr "Mensagens de status disponíveis" #: gajim/data/gui/preferences_window.ui:1512 msgid "Chat message:" msgstr "Mensagem da conversa:" #: gajim/data/gui/preferences_window.ui:1537 msgid "Use system _default" msgstr "Usar o _padrão do sistema" #: gajim/data/gui/preferences_window.ui:1560 msgid "Font" msgstr "Fonte" #: gajim/data/gui/preferences_window.ui:1590 msgid "T_heme:" msgstr "_Tema:" #: gajim/data/gui/preferences_window.ui:1603 msgid "Status _iconset:" msgstr "_Conjunto de ícones de status:" #: gajim/data/gui/preferences_window.ui:1614 msgid "Use _transports icons" msgstr "Usar ícones de _transportes" #: gajim/data/gui/preferences_window.ui:1618 #, fuzzy msgid "" "If checked, Gajim will use protocol-specific status icons. (e.g. A contact " "from ICQ will have the equivalent ICQ icon for status online, away, busy, " "etc...)" msgstr "" "Se marcado, o Gajim usará ícones protocolo-específicos do status. (por " "exemplo, um contato do MSN terá o ícone equivalente do MSN para o status " "conectado, ausente, ocupado, etc....)" #: gajim/data/gui/preferences_window.ui:1660 msgid "Configure color and font of the interface" msgstr "Configurar cores e fontes da interface" #: gajim/data/gui/preferences_window.ui:1682 msgid "Themes" msgstr "Tema" #: gajim/data/gui/preferences_window.ui:1712 msgid "Contact's nickname:" msgstr "Apelido do contato:" #: gajim/data/gui/preferences_window.ui:1726 msgid "Contact's message:" msgstr "Mensagem do contato:" #: gajim/data/gui/preferences_window.ui:1738 msgid "_Status message:" msgstr "_Mensagem de status:" #: gajim/data/gui/preferences_window.ui:1752 #, fuzzy msgid "Group chat highlight:" msgstr "Mensagem destacada de conferência" #: gajim/data/gui/preferences_window.ui:1890 msgid "Your nickname:" msgstr "Seu apelido:" #: gajim/data/gui/preferences_window.ui:1904 msgid "Your message:" msgstr "Sua mensagem:" #: gajim/data/gui/preferences_window.ui:1916 msgid "_URL highlight:" msgstr "Destaque de _URL:" #: gajim/data/gui/preferences_window.ui:2041 msgid "_Reset to Default Colors" msgstr "Voltar para as cores _padrões" #: gajim/data/gui/preferences_window.ui:2075 msgid "Chat Line Colors" msgstr "Cores da linha da conversa" #: gajim/data/gui/preferences_window.ui:2095 msgid "Style" msgstr "Estilo" #: gajim/data/gui/preferences_window.ui:2128 msgid "Audio input device" msgstr "" #: gajim/data/gui/preferences_window.ui:2140 msgid "Audio output device" msgstr "" #: gajim/data/gui/preferences_window.ui:2176 #, fuzzy msgid "Audio" msgstr "Ações" #: gajim/data/gui/preferences_window.ui:2206 msgid "Video input device" msgstr "" #: gajim/data/gui/preferences_window.ui:2218 msgid "Video output device" msgstr "" #: gajim/data/gui/preferences_window.ui:2230 msgid "Video framerate" msgstr "" #: gajim/data/gui/preferences_window.ui:2242 msgid "Video size" msgstr "" #: gajim/data/gui/preferences_window.ui:2252 msgid "View own video source" msgstr "" #: gajim/data/gui/preferences_window.ui:2316 #, fuzzy msgid "Video" msgstr "Nome do meio:" #: gajim/data/gui/preferences_window.ui:2346 #, fuzzy msgid "STUN server:" msgstr "Servidor:" #: gajim/data/gui/preferences_window.ui:2372 msgid "" "STUN server hostname. If none given, Gajim will try\n" "to discover one from server." msgstr "" #: gajim/data/gui/preferences_window.ui:2386 msgid "(example: stun.iptel.org)" msgstr "" #: gajim/data/gui/preferences_window.ui:2400 #, fuzzy msgid "Connection" msgstr "Condições" #: gajim/data/gui/preferences_window.ui:2485 msgid "_Mail client:" msgstr "_Cliente de email:" #: gajim/data/gui/preferences_window.ui:2498 msgid "_Browser:" msgstr "_Navegar:" #: gajim/data/gui/preferences_window.ui:2511 msgid "_File manager:" msgstr "_Gerenciamento de arquivos:" #. a header for custom browser/client/file manager. so translate sth like: Custom Settings #: gajim/data/gui/preferences_window.ui:2559 msgid "Custom" msgstr "Customizar" #: gajim/data/gui/preferences_window.ui:2576 msgid "Applications" msgstr "Aplicações" #: gajim/data/gui/preferences_window.ui:2604 msgid "_Ignore events from contacts not in the roster" msgstr "_Ignore eventos de contatos que não estejam na minha lista" #: gajim/data/gui/preferences_window.ui:2608 msgid "" "If checked, Gajim will ignore incoming events from unauthorized contacts. " "Use with caution, because it blocks all messages from any contact that is " "not in the roster" msgstr "" "Se marcado, o Gajim irá ignorar eventos que venham de contatos não " "autorizados. Utilize com cuidado, porque isto bloqueia todas as mensagens de " "qualquer contato que você não possuir na sua lista" #: gajim/data/gui/preferences_window.ui:2622 #, fuzzy msgid "Allow client / _OS information to be sent" msgstr "Permitir o envio de informações do _SO" #: gajim/data/gui/preferences_window.ui:2626 msgid "" "If checked, Gajim will allow others to detect the operation system you are " "using" msgstr "" "Se marcado, o Gajim irá permitir que os outros detectem qual o sistema " "operacional está usando" #: gajim/data/gui/preferences_window.ui:2640 #, fuzzy msgid "Allow local system time information to be sent" msgstr "Permitir o envio de informações do _SO" #: gajim/data/gui/preferences_window.ui:2644 #, fuzzy msgid "If checked, Gajim will allow others to detect the time on your system" msgstr "" "Se marcado, o Gajim irá permitir que os outros detectem qual o sistema " "operacional está usando" #: gajim/data/gui/preferences_window.ui:2658 msgid "Log _encrypted chat session" msgstr "Registrar sessão de conversa _criptografada" #: gajim/data/gui/preferences_window.ui:2662 #, fuzzy msgid "" "If checked, Gajim will keep logs for encrypted messages. Please note that " "when using End-to-End encryption the remote party has to agree on logging, " "else the messages will not be logged." msgstr "" "Se marcado, o Gajim irá manter os logs para mensagens criptografadas. Por " "favor, note que quando estiver usando criptografia E2E o remote party não " "concorda com o registro, então a mensagem não será gravada." #: gajim/data/gui/preferences_window.ui:2676 #, fuzzy msgid "Allow my _idle time to be sent" msgstr "Permitir o envio de informações do _SO" #: gajim/data/gui/preferences_window.ui:2695 msgid "Global proxy:" msgstr "" #: gajim/data/gui/preferences_window.ui:2724 msgid "_Manage..." msgstr "Gere_nciar..." #: gajim/data/gui/preferences_window.ui:2743 msgid "Privacy" msgstr "Privacidade" #: gajim/data/gui/preferences_window.ui:2770 msgid "_Log status changes of contacts" msgstr "_Log mudanças de status dos contatos" #: gajim/data/gui/preferences_window.ui:2791 msgid "Miscellaneous" msgstr "Diversos" #: gajim/data/gui/preferences_window.ui:2810 msgid "_Open..." msgstr "_Abrir..." #: gajim/data/gui/preferences_window.ui:2826 msgid "Advanced Configuration Editor" msgstr "Editor de configurações avançadas" #: gajim/data/gui/contact_context_menu.ui:12 msgid "Start _Chat" msgstr "Iniciar _conversa" #: gajim/data/gui/contact_context_menu.ui:20 #: gajim/data/gui/systray_context_menu.ui:36 msgid "Send Single _Message..." msgstr "Enviar _mensagem simples..." #: gajim/data/gui/contact_context_menu.ui:28 msgid "Send _File..." msgstr "Enviar _arquivo..." #: gajim/data/gui/contact_context_menu.ui:44 msgid "Invite _Contacts" msgstr "Convidar _contatos" #: gajim/data/gui/contact_context_menu.ui:73 msgid "E_xecute Command..." msgstr "E_xecutar comando..." #: gajim/data/gui/contact_context_menu.ui:82 #, fuzzy msgid "M_anage Contact" msgstr "_Gerenciar contato" #: gajim/data/gui/contact_context_menu.ui:92 msgid "_Rename..." msgstr "_Renomear..." #: gajim/data/gui/contact_context_menu.ui:99 msgid "Edit _Groups..." msgstr "Editar _grupos..." #: gajim/data/gui/contact_context_menu.ui:106 msgid "Assign Open_PGP Key..." msgstr "Atribuir chave Open_PGP..." #: gajim/data/gui/contact_context_menu.ui:115 msgid "Add Special _Notification..." msgstr "Adicionar _notificação especial..." #: gajim/data/gui/contact_context_menu.ui:129 msgid "_Subscription" msgstr "_Inscrição" #: gajim/data/gui/contact_context_menu.ui:138 #, fuzzy msgid "_Allow contact to see my status" msgstr "D_eixar este contato ver meu status" #: gajim/data/gui/contact_context_menu.ui:146 #, fuzzy msgid "A_sk to see contact status" msgstr "P_eça para ver o status dele/dela" #: gajim/data/gui/contact_context_menu.ui:154 #, fuzzy msgid "_Forbid contact to see my status" msgstr "_Proibir ele/ela de ver meu status" #: gajim/data/gui/contact_context_menu.ui:182 msgid "_Unignore" msgstr "Nã_o ignorar" #: gajim/data/gui/contact_context_menu.ui:190 msgid "_Ignore" msgstr "_Ignorar" #: gajim/data/gui/contact_context_menu.ui:197 #: gajim/data/gui/chat_context_menu.ui:66 msgid "_Add to Roster..." msgstr "_Adicionar à lista..." #: gajim/data/gui/account_creation_wizard_window.ui:43 msgid "Gajim: Account Creation Wizard" msgstr "Gajim: Assistente de configuração de conta" #: gajim/data/gui/account_creation_wizard_window.ui:70 msgid "" "You need to have an account in order to connect\n" "to the Jabber network." msgstr "" "Você precisa ter uma conta para conectar na\n" "rede Jabber." #: gajim/data/gui/account_creation_wizard_window.ui:95 msgid "I already have an account I want to _use" msgstr "Eu já tenho uma conta e quero _usá-la" #: gajim/data/gui/account_creation_wizard_window.ui:112 msgid "I want to _register for a new account" msgstr "Eu quero _registrar uma nova conta" #: gajim/data/gui/account_creation_wizard_window.ui:133 msgid "Please choose one of the options below:" msgstr "Por favor escolha uma das opções abaixo:" #: gajim/data/gui/account_creation_wizard_window.ui:167 msgid "Please fill in the data for your existing account" msgstr "Por favor, preencha os dados para sua conta existente" #: gajim/data/gui/account_creation_wizard_window.ui:187 msgid "_Jabber ID:" msgstr "_Jabber ID:" #: gajim/data/gui/account_creation_wizard_window.ui:239 #: gajim/data/gui/account_creation_wizard_window.ui:394 msgid "Anon_ymous authentication" msgstr "Autenticação anôn_ima" #: gajim/data/gui/account_creation_wizard_window.ui:259 #: gajim/data/gui/manage_bookmarks_window.ui:172 msgid "_Password:" msgstr "_Senha:" #: gajim/data/gui/account_creation_wizard_window.ui:281 msgid "Save pass_word" msgstr "Salvar sen_ha" #: gajim/data/gui/account_creation_wizard_window.ui:285 msgid "If checked, Gajim will remember the password for this account" msgstr "Se marcado, o Gajim irá memorizar a senha para esta conta" #: gajim/data/gui/account_creation_wizard_window.ui:339 msgid "Please select a server" msgstr "Por favor, selecione um servidor" #: gajim/data/gui/account_creation_wizard_window.ui:358 #: gajim/data/gui/manage_bookmarks_window.ui:159 msgid "_Server:" msgstr "_Servidor:" #: gajim/data/gui/account_creation_wizard_window.ui:423 msgid "Prox_y:" msgstr "Prox_y:" #: gajim/data/gui/account_creation_wizard_window.ui:450 msgid "Manage..." msgstr "Gerenciar..." #: gajim/data/gui/account_creation_wizard_window.ui:465 msgid "Use custom hostname/port" msgstr "Usa nome de máquina/porta customizados" #: gajim/data/gui/account_creation_wizard_window.ui:491 msgid "_Hostname:" msgstr "_Nome do computador:" #: gajim/data/gui/account_creation_wizard_window.ui:517 msgid "_Port:" msgstr "_Porta:" #: gajim/data/gui/account_creation_wizard_window.ui:553 #: gajim/data/gui/account_creation_wizard_window.ui:884 msgid "_Advanced" msgstr "_Avançado" #: gajim/data/gui/account_creation_wizard_window.ui:624 msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA1 fingerprint of the certificate:\n" msgstr "" "Adicionar este certificado na lista de certificados confiáveis.\n" "SHA1 fingerprint do certificado:\n" #: gajim/data/gui/account_creation_wizard_window.ui:687 msgid "" "Connecting to server\n" "\n" "Please wait..." msgstr "" "Conectando ao servidor\n" "\n" "Por favor aguarde..." #: gajim/data/gui/account_creation_wizard_window.ui:772 msgid "Connect when I press Finish" msgstr "Conectar quando eu clicar em Concluir" #: gajim/data/gui/account_creation_wizard_window.ui:789 msgid "Set my profile when I connect" msgstr "Configurar perfil quando eu conectar" #: gajim/data/gui/account_creation_wizard_window.ui:901 msgid "_Finish" msgstr "_Concluir" #: gajim/data/gui/privacy_lists_window.ui:34 msgid "Privacy Lists:" msgstr "Listas de privacidade:" #: gajim/data/gui/service_discovery_window.ui:84 msgid "_Address:" msgstr "_Endereço:" #: gajim/data/gui/service_discovery_window.ui:115 msgid "G_o" msgstr "_Ir" #: gajim/data/gui/synchronise_select_contacts_dialog.ui:8 msgid "Synchronise : select contacts" msgstr "Sincronizar: selecionar contatos" #: gajim/data/gui/synchronise_select_contacts_dialog.ui:67 msgid "Select the contacts you want to synchronise" msgstr "Selecione os contatos que você quer sincronizar" #: gajim/data/gui/edit_groups_dialog.ui:8 msgid "Edit Groups" msgstr "Editar grupos" #: gajim/data/gui/search_window.ui:42 msgid "Please wait while retrieving search form..." msgstr "" "Por favor aguarde enquanto o formulário de pesquisa está sendo obtido..." #: gajim/data/gui/search_window.ui:80 msgid "_Add contact" msgstr "_Adicionar contato" #: gajim/data/gui/search_window.ui:116 msgid "_Search" msgstr "_Buscar" #: gajim/data/gui/chat_context_menu.ui:11 msgid "_Copy Link Location" msgstr "_Copiar URL" #: gajim/data/gui/chat_context_menu.ui:19 msgid "_Open Link in Browser" msgstr "_Visualizar no navegador" #: gajim/data/gui/chat_context_menu.ui:27 msgid "_Copy JID/Email Address" msgstr "_Copiar e-mail/JID" #: gajim/data/gui/chat_context_menu.ui:35 msgid "_Open Email Composer" msgstr "_Abrir cliente de e-mail" #: gajim/data/gui/chat_context_menu.ui:49 #: gajim/data/gui/subscription_request_window.ui:12 msgid "_Start Chat" msgstr "_Iniciar conversa" #: gajim/data/gui/chat_context_menu.ui:57 #: gajim/data/gui/account_context_menu.ui:35 #: gajim/data/gui/systray_context_menu.ui:28 msgid "Join _Group Chat" msgstr "_Entrar em uma conferência" #: gajim/data/gui/change_status_message_dialog.ui:131 msgid "Save as Preset..." msgstr "Salvar como modelos..." #: gajim/data/gui/change_status_message_dialog.ui:167 msgid "Preset messages:" msgstr "Modelos de mensagens" #: gajim/data/gui/change_status_message_dialog.ui:313 msgid "Type your new status message" msgstr "Digite sua nova mensagem de status:" #: gajim/data/gui/synchronise_select_account_dialog.ui:8 msgid "Synchronise contacts" msgstr "Sincronizar contatos" #: gajim/data/gui/synchronise_select_account_dialog.ui:68 msgid "Select the account with which you want to synchronise" msgstr "Selecione a conta que você quer sincronizar" #: gajim/data/gui/archiving_313_preferences_window.ui:28 #, fuzzy msgid "Roster" msgstr "Exibir _lista" #: gajim/data/gui/archiving_313_preferences_window.ui:85 #, fuzzy msgid "Preference" msgstr "Preferências" #: gajim/data/gui/archiving_313_preferences_window.ui:159 #, fuzzy msgid "Default:" msgstr "Padrão" #: gajim/data/gui/voip_call_received_dialog.ui:15 msgid "Incoming call" msgstr "" #: gajim/data/gui/add_new_contact_window.ui:29 msgid "Add New Contact" msgstr "Adicionar novo contato" #: gajim/data/gui/add_new_contact_window.ui:62 msgid "A_ccount:" msgstr "C_onta:" #: gajim/data/gui/add_new_contact_window.ui:110 msgid "_Protocol:" msgstr "_Protocolo:" #: gajim/data/gui/add_new_contact_window.ui:169 msgid "_User ID:" msgstr "_ID do usuário:" #: gajim/data/gui/add_new_contact_window.ui:182 #: gajim/data/gui/manage_bookmarks_window.ui:133 msgid "_Nickname:" msgstr "_Apelido:" #: gajim/data/gui/add_new_contact_window.ui:195 msgid "_Group:" msgstr "_Grupo:" #: gajim/data/gui/add_new_contact_window.ui:210 #, fuzzy msgid "Type User ID" msgstr "ID do usuário:" #: gajim/data/gui/add_new_contact_window.ui:223 #, fuzzy msgid "Type Nickname" msgstr "Apelido" #: gajim/data/gui/add_new_contact_window.ui:239 msgid "Choose a group of type a new group" msgstr "" #: gajim/data/gui/add_new_contact_window.ui:257 msgid "A_llow this contact to view my status" msgstr "D_eixar este contato ver meu status" #: gajim/data/gui/add_new_contact_window.ui:300 #, fuzzy msgid "_Save subscription message" msgstr "_Inscrição" #: gajim/data/gui/add_new_contact_window.ui:325 #, fuzzy msgid "" "You have to register with this transport\n" "to be able to add a contact from this\n" "protocol. Click on Register button to\n" "proceed." msgstr "" "Você deve estar registrado para este \n" "transporte para poder adicionar \n" "contatos deste protocolo. Clique no \n" "botão Registrar para aceitar." #: gajim/data/gui/add_new_contact_window.ui:340 msgid "_Register" msgstr "_Registrar" #: gajim/data/gui/add_new_contact_window.ui:369 msgid "" "You must be connected to the transport to be able\n" "to add a contact from this protocol." msgstr "" "Você deve estar conectado para que o transporte \n" "possa adicionar um contato desse protocolo." #: gajim/data/gui/roster_window.ui:61 #, fuzzy msgid "Change Status Message…" msgstr "_Mudar mensagem de status" #: gajim/data/gui/change_mood_dialog.ui:73 msgid "Mood:" msgstr "Humor:" #: gajim/data/gui/change_mood_dialog.ui:85 msgid "Message:" msgstr "Mensagem:" #: gajim/data/gui/plugins_window.ui:25 gajim/data/gui/application_menu.ui:90 msgid "Plugins" msgstr "" #: gajim/data/gui/plugins_window.ui:78 msgid "Install from zip" msgstr "" #: gajim/data/gui/plugins_window.ui:109 msgid "<empty>" msgstr "" #: gajim/data/gui/plugins_window.ui:131 #, fuzzy msgid "Version:" msgstr "Versão do GTK+:" #: gajim/data/gui/plugins_window.ui:169 #, fuzzy msgid "Authors:" msgstr "Au_torizar" #: gajim/data/gui/plugins_window.ui:210 #, fuzzy msgid "Homepage:" msgstr "Página pessoal:" #: gajim/data/gui/plugins_window.ui:253 #, fuzzy msgid "Description:" msgstr "Descrição: " #: gajim/data/gui/plugins_window.ui:301 msgid "Uninstall" msgstr "" #: gajim/data/gui/plugins_window.ui:316 #, fuzzy msgid "Configure" msgstr "_Configurar" #: gajim/data/gui/plugins_window.ui:348 #, fuzzy msgid "Installed" msgstr "Parado" #: gajim/data/gui/plugins_window.ui:399 msgid "" "Plug-in decription should be displayed here. This text will be erased during " "PluginsWindow initialization." msgstr "" #: gajim/data/gui/privacy_list_window.ui:18 #, fuzzy msgid "none" msgstr "um" #: gajim/data/gui/privacy_list_window.ui:21 #, fuzzy msgid "both" msgstr "Ambos" #: gajim/data/gui/privacy_list_window.ui:24 #, fuzzy msgid "from" msgstr "De" #: gajim/data/gui/privacy_list_window.ui:27 #, fuzzy msgid "to" msgstr "dois" #: gajim/data/gui/privacy_list_window.ui:66 msgid "Privacy List" msgstr "Lista de privacidade" #: gajim/data/gui/privacy_list_window.ui:77 msgid "Active for this session" msgstr "Ativo para esta sessão" #: gajim/data/gui/privacy_list_window.ui:94 msgid "Active on each startup" msgstr "Ativar ao iniciar o programa" #: gajim/data/gui/privacy_list_window.ui:132 msgid "List of rules" msgstr "Lista de regras" #: gajim/data/gui/privacy_list_window.ui:244 msgid "Add / Edit a rule" msgstr "Adicionar / Editar regra" #: gajim/data/gui/privacy_list_window.ui:266 msgid "Allow" msgstr "Permitir" #: gajim/data/gui/privacy_list_window.ui:282 msgid "Deny" msgstr "Negar" #: gajim/data/gui/privacy_list_window.ui:317 msgid "JabberID" msgstr "Jabber ID" #: gajim/data/gui/privacy_list_window.ui:358 msgid "all in the group" msgstr "todos no grupo" #: gajim/data/gui/privacy_list_window.ui:407 msgid "all by subscription" msgstr "todos por inscrição" #: gajim/data/gui/privacy_list_window.ui:456 msgid "All" msgstr "Todos" #: gajim/data/gui/privacy_list_window.ui:493 msgid "to send me messages" msgstr "para me enviar mensagens" #: gajim/data/gui/privacy_list_window.ui:509 msgid "to send me queries" msgstr "para enviar minhas requisições" #: gajim/data/gui/privacy_list_window.ui:525 msgid "to view my status" msgstr "para ver meu status" #: gajim/data/gui/privacy_list_window.ui:541 msgid "to send me status" msgstr "para seu status para mim" #: gajim/data/gui/privacy_list_window.ui:557 msgid "All (including subscription)" msgstr "Todos (incluindo inscrições)" #: gajim/data/gui/privacy_list_window.ui:598 msgid "Order:" msgstr "Ordem:" #: gajim/data/gui/manage_sounds_window.ui:10 #, fuzzy msgid "Manage sounds" msgstr "Gerenciar contas" #: gajim/data/gui/remove_account_window.ui:56 msgid "Remove account _only from Gajim" msgstr "Remover conta _somente do Gajim" #: gajim/data/gui/remove_account_window.ui:73 msgid "Remove account from Gajim and from _server" msgstr "Remover conta do Gajim e do _servidor" #: gajim/data/gui/remove_account_window.ui:94 msgid "What do you want to do?" msgstr "O que você quer fazer?" #: gajim/data/gui/adhoc_commands_window.ui:35 msgid "Please wait while retrieving command list..." msgstr "Por favor aguarde enquanto a lista de comandos é recuperada..." #: gajim/data/gui/adhoc_commands_window.ui:93 msgid "Choose command to execute:" msgstr "Escolha um comando para executar" #: gajim/data/gui/adhoc_commands_window.ui:136 #: gajim/data/gui/adhoc_commands_window.ui:277 msgid "Check once more" msgstr "Verificar novamente" #: gajim/data/gui/adhoc_commands_window.ui:194 #, fuzzy msgid "Please wait while the command is being sent..." msgstr "Por favor aguarde enquanto a lista de comandos é enviada..." #: gajim/data/gui/adhoc_commands_window.ui:211 msgid "Please wait..." msgstr "Por favor aguarde..." #: gajim/data/gui/adhoc_commands_window.ui:257 msgid "This jabber entity does not expose any commands." msgstr "Esta entidade jabber não expõe quaisquer comandos." #: gajim/data/gui/adhoc_commands_window.ui:336 msgid "An error has occurred:" msgstr "Ocorreu um erro:" #: gajim/data/gui/adhoc_commands_window.ui:465 #, fuzzy msgid "F_inish" msgstr "_Concluir" #: gajim/data/gui/account_context_menu.ui:20 msgid "_Personal Events" msgstr "Eventos _pessoais" #: gajim/data/gui/account_context_menu.ui:49 msgid "_Add Contact..." msgstr "_Adicionar contato..." #: gajim/data/gui/account_context_menu.ui:57 msgid "_Discover Services" msgstr "_Descubra serviços" #: gajim/data/gui/account_context_menu.ui:65 msgid "_Execute Command..." msgstr "_Executar comando..." #: gajim/data/gui/esession_info_window.ui:50 msgid "_Verify" msgstr "_Verificar" #: gajim/data/gui/esession_info_window.ui:137 msgid "(ESession info)" msgstr "(Informações ESession)" #: gajim/data/gui/application_menu.ui:8 #, fuzzy msgid "View" msgstr "_Ver" #: gajim/data/gui/application_menu.ui:11 #, fuzzy msgid "Show Roster" msgstr "Exibir _lista" #: gajim/data/gui/application_menu.ui:16 #, fuzzy msgid "Show Offline Contacts" msgstr "Exibir desc_onectados" #: gajim/data/gui/application_menu.ui:21 #, fuzzy msgid "Show Active Contacts" msgstr "Exibir somente _ativos" #: gajim/data/gui/application_menu.ui:26 #, fuzzy msgid "Show Transports" msgstr "Exibir trans_portes" #: gajim/data/gui/application_menu.ui:43 #, fuzzy msgid "Help" msgstr "_Ajuda" #: gajim/data/gui/application_menu.ui:46 #, fuzzy msgid "Contents" msgstr "Índi_ces" #: gajim/data/gui/application_menu.ui:50 #, fuzzy msgid "FAQ" msgstr "_FAQ" #: gajim/data/gui/application_menu.ui:54 msgid "Keyboard Shortcuts" msgstr "" #: gajim/data/gui/application_menu.ui:58 gajim/data/gui/features_window.ui:9 msgid "Features" msgstr "Recursos" #: gajim/data/gui/application_menu.ui:76 msgid "Start Chat" msgstr "Iniciar conversa" #: gajim/data/gui/application_menu.ui:81 #, fuzzy msgid "Bookmarks" msgstr "Ma_rcadores" #: gajim/data/gui/application_menu.ui:99 #, fuzzy msgid "Quit" msgstr "_Sair" #: gajim/data/gui/features_window.ui:26 msgid "List of possible features in Gajim:" msgstr "Listas dos possíveis recursos do Gajim:" #: gajim/data/gui/manage_bookmarks_window.ui:14 msgid "Manage Bookmarks" msgstr "Gerenciar marcadores" #: gajim/data/gui/manage_bookmarks_window.ui:120 #, fuzzy msgid "_Title:" msgstr "Título:" #: gajim/data/gui/manage_bookmarks_window.ui:146 msgid "Roo_m:" msgstr "" #: gajim/data/gui/manage_bookmarks_window.ui:188 #, fuzzy msgid "A_uto join" msgstr "Ingresso automático" #: gajim/data/gui/manage_bookmarks_window.ui:193 msgid "If checked, Gajim will join this group chat on startup" msgstr "" "Se marcado, o Gajim irá ingressar na conferência no ínicio da aplicação" #: gajim/data/gui/manage_bookmarks_window.ui:207 #, fuzzy msgid "Minimi_ze on Auto Join" msgstr "Minimizar ao entrar automaticamente" #: gajim/data/gui/manage_bookmarks_window.ui:235 #, fuzzy msgid "Pr_int status:" msgstr "Imprimir status:" #: gajim/data/gui/exception_dialog.ui:45 #, fuzzy msgid "" "A programming error has been detected. It probably is not fatal, but should " "be reported to the developers nonetheless." msgstr "Não é provavelmente fatal, mas deve ser reportado aos desenvolvedores." #: gajim/data/gui/exception_dialog.ui:115 #, fuzzy msgid "Report Bug" msgstr "_Reportar erro" #: gajim/data/gui/subscription_request_window.ui:95 msgid "_Deny" msgstr "_Negar" #: gajim/data/gui/subscription_request_window.ui:100 msgid "" "Deny authorization from contact so he or she cannot know when you're " "connected" msgstr "" "Negar a autorização do contato, assim ele não poderá saber quando você está " "conectado" #: gajim/data/gui/subscription_request_window.ui:133 msgid "Au_thorize" msgstr "Au_torizar" #: gajim/data/gui/subscription_request_window.ui:138 msgid "Authorize contact so he or she can know when you're connected" msgstr "" "Autorize o contato para que ele ou ela saiba quando você estiver conectado" #: gajim/data/gui/xml_console_window.ui:121 #, fuzzy msgid "Presence" msgstr "_Presença" #: gajim/data/gui/xml_console_window.ui:134 msgid "Iq" msgstr "" #: gajim/data/gui/xml_console_window.ui:149 #, fuzzy msgid "Presets" msgstr "_Presença" #: gajim/data/gui/chat_to_muc_window.ui:24 msgid "Invite Friends!" msgstr "Convidar amigos!" #: gajim/data/gui/chat_to_muc_window.ui:39 #, fuzzy msgid "" "You are now entering a groupchat.\n" "Select the contacts you want to invite" msgstr "" "Você está prestes a iniciar uma Conversa Multi-Usuário (MUC).\n" "Selecione os contatos que você quer convidar" #: gajim/data/gui/chat_to_muc_window.ui:67 #: gajim/data/gui/chat_to_muc_window.ui:78 msgid "column" msgstr "" #: gajim/data/gui/chat_to_muc_window.ui:112 msgid "Please select a MUC server." msgstr "Por favor, selecione um servidor MUC." #: gajim/data/gui/chat_to_muc_window.ui:141 msgid "MUC server" msgstr "Servidor MUC" #: gajim/data/gui/chat_to_muc_window.ui:176 msgid "In_vite" msgstr "Con_vidar" #: gajim/data/gui/history_manager.ui:11 #, fuzzy msgid "_Export" msgstr "Exportar" #: gajim/data/gui/history_manager.ui:97 msgid "Gajim History Logs Manager" msgstr "Gerenciador de histórico de logs do Gajim" #: gajim/data/gui/history_manager.ui:154 msgid "Welcome to Gajim History Logs Manager" msgstr "Gerenciador de histórico de conversas do Gajim" #: gajim/data/gui/history_manager.ui:168 msgid "" "This log manager is not intended for log viewing. If you are looking for " "such functionality, use the history window instead.\n" "\n" "Use this program to delete or export logs. You can select logs from the left " "and/or search database from below." msgstr "" "Este gerenciador de logs não tem a intenção de ser um visualizador de logs. " "Se você está procurando por esta funcionalidade, use a janela de histórico.\n" "\n" "Use este programa para deletar ou exportar logs. Você pode selecionar logs " "ao lado e/ou pesquisar na base de dados abaixo." #: gajim/data/gui/history_manager.ui:184 msgid "" "WARNING:\n" "If you plan to do massive deletions, please make sure Gajim is not running. " "Generally avoid deletions with contacts you currently chat with." msgstr "" "CUIDADO:\n" "Se você planeja fazer apagamentos maciços, certifique-se por favor que o " "Gajim não está executando. Evite apagamentos com contatos que você esteja " "conversando no momento." #: gajim/data/gui/history_manager.ui:283 msgid "_Search Database" msgstr "_Buscar no banco de dados" #: gajim/data/gui/shortcuts_window.ui:8 msgid "Chat Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:12 #, fuzzy msgid "Message composition" msgstr "Conteúdo da mensagem" #: gajim/data/gui/shortcuts_window.ui:17 #, fuzzy msgid "Send the message" msgstr "Enviar mensagem" #: gajim/data/gui/shortcuts_window.ui:24 #, fuzzy msgid "Create a new line" msgstr "Criar nova postagem" #: gajim/data/gui/shortcuts_window.ui:31 msgid "Select an emoticon" msgstr "" #: gajim/data/gui/shortcuts_window.ui:38 msgid "Complete a command or a nick" msgstr "" #: gajim/data/gui/shortcuts_window.ui:45 #, fuzzy msgid "Previous sent message" msgstr "Modelos de mensagens" #: gajim/data/gui/shortcuts_window.ui:52 #, fuzzy msgid "Next sent messages" msgstr "Modelos de mensagens" #: gajim/data/gui/shortcuts_window.ui:59 #, fuzzy msgid "Quote previous message" msgstr "mensagem de status" #: gajim/data/gui/shortcuts_window.ui:66 #, fuzzy msgid "Quote next message" msgstr "Enviar mensagem" #: gajim/data/gui/shortcuts_window.ui:73 #, fuzzy msgid "Clear message entry" msgstr "Mensagem enviada" #: gajim/data/gui/shortcuts_window.ui:81 gajim/data/gui/shortcuts_window.ui:231 #, fuzzy msgid "Appearance" msgstr "Aparência da conversa" #: gajim/data/gui/shortcuts_window.ui:86 msgid "Toggle full / compact view" msgstr "" #: gajim/data/gui/shortcuts_window.ui:94 #, fuzzy msgid "Recent history" msgstr "Recentemente:" #: gajim/data/gui/shortcuts_window.ui:99 msgid "Scroll up" msgstr "" #: gajim/data/gui/shortcuts_window.ui:106 msgid "Scroll down" msgstr "" #: gajim/data/gui/shortcuts_window.ui:121 msgid "Tabs" msgstr "" #: gajim/data/gui/shortcuts_window.ui:126 msgid "Switch to the previous tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:133 msgid "Switch to the next tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:140 msgid "Switch to the first - ninth tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:147 msgid "Switch to the previous unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:154 msgid "Switch to the next unread tab" msgstr "" #: gajim/data/gui/shortcuts_window.ui:161 msgid "Close chat" msgstr "" #: gajim/data/gui/shortcuts_window.ui:172 msgid "Roster Shortcuts" msgstr "" #: gajim/data/gui/shortcuts_window.ui:195 #, fuzzy msgid "File transfers" msgstr "Transferência de arquivos" #: gajim/data/gui/shortcuts_window.ui:209 #, fuzzy msgid "Join a group chat" msgstr "em uma c_onferência" #: gajim/data/gui/shortcuts_window.ui:216 #, fuzzy msgid "Set the status message" msgstr "mensagem de status" #: gajim/data/gui/shortcuts_window.ui:223 #, fuzzy msgid "Quit Gajim" msgstr "Gajim" #: gajim/data/gui/shortcuts_window.ui:236 #, fuzzy msgid "Show offline contacts" msgstr "Exibir desc_onectados" #: gajim/data/gui/shortcuts_window.ui:243 #, fuzzy msgid "Show only active contacts" msgstr "Exibir somente _ativos" #: gajim/data/gui/shortcuts_window.ui:250 msgid "Enable roster filtering" msgstr "" #: gajim/data/gui/shortcuts_window.ui:258 msgid "Contacts" msgstr "Contatos" #: gajim/data/gui/shortcuts_window.ui:263 #, fuzzy msgid "Contact information" msgstr "Informações do contato" #: gajim/data/gui/shortcuts_window.ui:270 #, fuzzy msgid "Rename contact" msgstr "Renomear contato" #: gajim/data/gui/shortcuts_window.ui:277 #, fuzzy msgid "Delete contact" msgstr "Enviar contatos:" #: gajim/data/gui/passphrase_dialog.ui:8 msgid "Passphrase" msgstr "Frase de acesso" #: gajim/data/gui/history_window.ui:38 #, fuzzy msgid "Enter name / JID of contact or groupchat" msgstr "Nome do contato" #: gajim/data/gui/history_window.ui:51 msgid "Search:" msgstr "Pesquisar:" #: gajim/data/gui/history_window.ui:75 msgid "_In date search" msgstr "" #: gajim/data/gui/history_window.ui:79 msgid "Only searching within selected day" msgstr "" #: gajim/data/gui/history_window.ui:306 #, fuzzy msgid "_Show status changes" msgstr "_Log mudanças de status dos contatos" #: gajim/data/gui/manage_pep_services_window.ui:13 msgid "PEP Service Configuration" msgstr "Configuração do serviço PEP" #: gajim/data/gui/manage_pep_services_window.ui:69 msgid "_Configure" msgstr "_Configurar" #: gajim/data/gui/groups_post_window.ui:9 msgid "Create new post" msgstr "Criar nova postagem" #: gajim/data/gui/groups_post_window.ui:29 #: gajim/data/gui/single_message_window.ui:46 msgid "From:" msgstr "De:" #: gajim/data/gui/groups_post_window.ui:41 #: gajim/data/gui/single_message_window.ui:70 msgid "Subject:" msgstr "Assunto:" #: gajim/data/gui/data_form_window.ui:19 msgid "Fill in the form." msgstr "Preencha o formulário." #: gajim/data/gui/data_form_window.ui:274 msgid "Room Configuration" msgstr "Configuração da sala" #: gajim/data/gui/roster_item_exchange_window.ui:8 msgid "Roster Item Exchange" msgstr "Troca de itens na lista de contatos" #: gajim/data/gui/systray_context_menu.ui:12 msgid "Sta_tus" msgstr "Sta_tus" #: gajim/data/gui/systray_context_menu.ui:20 msgid "_Start Chat..." msgstr "_Iniciar conversa..." #: gajim/data/gui/systray_context_menu.ui:50 msgid "Show All Pending _Events" msgstr "Exibir todos _eventos pendentes" #: gajim/data/gui/systray_context_menu.ui:59 msgid "Mute Sounds" msgstr "Sons mudos" #: gajim/data/gui/systray_context_menu.ui:75 #, fuzzy msgid "_Preferences" msgstr "Preferências" #: gajim/data/gui/systray_context_menu.ui:90 #, fuzzy msgid "_Quit" msgstr "_Sair" #: gajim/data/gui/single_message_window.ui:59 msgid "To:" msgstr "Para:" #: gajim/data/gui/single_message_window.ui:118 msgid "0" msgstr "0" #: gajim/data/gui/single_message_window.ui:210 msgid "Sen_d" msgstr "E_nviar" #: gajim/data/gui/single_message_window.ui:216 msgid "Send message" msgstr "Enviar mensagem" #: gajim/data/gui/single_message_window.ui:229 msgid "_Reply" msgstr "_Responder" #: gajim/data/gui/single_message_window.ui:235 msgid "Reply to this message" msgstr "Resposta para esta mensagem" #: gajim/data/gui/single_message_window.ui:248 msgid "_Send & Close" msgstr "_Enviar & fechar" #: gajim/data/gui/single_message_window.ui:254 msgid "Send message and close window" msgstr "Enviar mensagem e fechar a janela" #: gajim/data/gui/change_activity_dialog.ui:8 msgid "Set Activity" msgstr "Definir atividade" #: gajim/data/gui/change_activity_dialog.ui:65 msgid "Set an activity" msgstr "Define uma atividade" #: gajim/data/gui/change_activity_dialog.ui:337 msgid "Message: " msgstr "Mensagem: " #: gajim/command_system/mapping.py:164 gajim/command_system/mapping.py:174 #: gajim/command_system/mapping.py:194 #, fuzzy msgid "Missing arguments" msgstr "Argumento não informado \"contact_jid\"" #: gajim/command_system/mapping.py:261 #, fuzzy msgid "Too many arguments" msgstr "Argumento não informado \"contact_jid\"" #: gajim/command_system/implementation/execute.py:53 msgid "Execute expression inside a shell, show output" msgstr "" #: gajim/command_system/implementation/execute.py:109 msgid "Execute expression inside a shell, send output" msgstr "" #: gajim/command_system/implementation/standard.py:45 msgid "" "Show help on a given command or a list of available commands if -a is given" msgstr "" #: gajim/command_system/implementation/standard.py:72 #, fuzzy msgid "Send a message to the contact" msgstr "Uso: /%s, envia a mensagem para o contato" #: gajim/command_system/implementation/standard.py:77 msgid "Send action (in the third person) to the current chat" msgstr "" #: gajim/command_system/implementation/standard.py:82 msgid "Show logged messages which mention given text" msgstr "" #: gajim/command_system/implementation/standard.py:87 #, fuzzy, python-format msgid "%s: Nothing found" msgstr "%s não encontrado" #: gajim/command_system/implementation/standard.py:93 msgid "Limit must be an integer" msgstr "" #: gajim/command_system/implementation/standard.py:117 msgid "" "\n" " Set the current status\n" "\n" " Status can be given as one of the following values:\n" " online, away, chat, xa, dnd.\n" " " msgstr "" #: gajim/command_system/implementation/standard.py:135 msgid "Set the current status to away" msgstr "" #: gajim/command_system/implementation/standard.py:149 msgid "Set the current status to online" msgstr "" #: gajim/command_system/implementation/standard.py:152 #, fuzzy msgid "Available" msgstr "Dis_ponível" #: gajim/command_system/implementation/standard.py:172 #: gajim/command_system/implementation/standard.py:249 #, fuzzy msgid "Clear the text window" msgstr "Uso: /%s, apaga o texto da janela." #: gajim/command_system/implementation/standard.py:177 #: gajim/command_system/implementation/standard.py:389 #, fuzzy msgid "Send a ping to the contact" msgstr "Uso: /%s, envia um ping para o contato" #: gajim/command_system/implementation/standard.py:180 #: gajim/command_system/implementation/standard.py:392 #, fuzzy msgid "Command is not supported for zeroconf accounts" msgstr "Comando sem suporte para conta zeroconf." #: gajim/command_system/implementation/standard.py:184 msgid "Send DTMF sequence through an open audio session" msgstr "" #: gajim/command_system/implementation/standard.py:187 #, fuzzy msgid "No open audio sessions with the contact" msgstr "Clique para ver o histórico de conversas com este contato" #: gajim/command_system/implementation/standard.py:190 #, fuzzy, python-format msgid "%s is not a valid tone" msgstr "%s não é um nível de gravação (loglevel) válido" #: gajim/command_system/implementation/standard.py:197 msgid "Toggle audio session" msgstr "Alternar sessão de áudio" #: gajim/command_system/implementation/standard.py:200 #, fuzzy msgid "Audio sessions are not available" msgstr "Uma conexão não está disponível" #: gajim/command_system/implementation/standard.py:207 msgid "Toggle video session" msgstr "Alternar sessão de vídeo" #: gajim/command_system/implementation/standard.py:210 #, fuzzy msgid "Video sessions are not available" msgstr "Conexão não disponível" #: gajim/command_system/implementation/standard.py:217 msgid "Send a message to the contact that will attract his (her) attention" msgstr "" #: gajim/command_system/implementation/standard.py:256 #, fuzzy msgid "Change your nickname in a group chat" msgstr "Alterar o seu apelido (Ctrl+N)" #: gajim/command_system/implementation/standard.py:266 #, fuzzy msgid "Open a private chat window with a specified occupant" msgstr "" "Uso: /%s , abre uma janela de conferência privada com um ocupante " "específico." #: gajim/command_system/implementation/standard.py:272 #: gajim/command_system/implementation/standard.py:281 #: gajim/command_system/implementation/standard.py:327 #: gajim/command_system/implementation/standard.py:339 #: gajim/command_system/implementation/standard.py:351 #, fuzzy msgid "Nickname not found" msgstr "Apelido não encontrado: %s" #: gajim/command_system/implementation/standard.py:275 #, fuzzy msgid "" "Open a private chat window with a specified occupant and send him a message" msgstr "" "Uso: /%s , abre uma janela de conferência privada com um ocupante " "específico." #: gajim/command_system/implementation/standard.py:284 #, fuzzy msgid "Display or change a group chat topic" msgstr "Perguntar antes de fechar um aba ou janela de conferência." #: gajim/command_system/implementation/standard.py:292 msgid "Invite a user to a room for a reason" msgstr "" #: gajim/command_system/implementation/standard.py:295 #, fuzzy, python-format msgid "Invited %(jid)s to %(room_jid)s" msgstr "Convidado %(contact_jid)s para %(room_jid)s." #: gajim/command_system/implementation/standard.py:299 #, fuzzy msgid "Join a group chat given by a jid" msgstr "em uma c_onferência" #: gajim/command_system/implementation/standard.py:307 msgid "" "Leave the groupchat, optionally giving a reason, and close tab or window" msgstr "" #: gajim/command_system/implementation/standard.py:312 msgid "" "\n" " Ban user by a nick or a jid from a groupchat\n" "\n" " If given nickname is not found it will be treated as a jid.\n" " " msgstr "" #: gajim/command_system/implementation/standard.py:324 #, fuzzy msgid "Kick user by a nick from a groupchat" msgstr "Você foi convidado para uma conferência" #: gajim/command_system/implementation/standard.py:332 msgid "" "Set occupant role in group chat.\n" " Role can be given as one of the following values:\n" " moderator, participant, visitor, none" msgstr "" #: gajim/command_system/implementation/standard.py:337 #, fuzzy msgid "Invalid role given" msgstr "Servidor inválido" #: gajim/command_system/implementation/standard.py:344 msgid "" "Set occupant affiliation in group chat.\n" " Affiliation can be given as one of the following values:\n" " owner, admin, member, outcast, none" msgstr "" #: gajim/command_system/implementation/standard.py:349 #, fuzzy msgid "Invalid affiliation given" msgstr "filiação alterada" #: gajim/command_system/implementation/standard.py:357 #, fuzzy msgid "Display names of all group chat occupants" msgstr "Uso: /%s , mostra ou atualiza o tópico da sala atual." #: gajim/command_system/implementation/standard.py:379 msgid "Forbid an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/standard.py:384 msgid "Allow an occupant to send you public or private messages" msgstr "" #: gajim/command_system/implementation/middleware.py:72 msgid "Error during command execution!" msgstr "" #: gajim/command_system/implementation/custom.py:106 msgid "The same as using a doc-string, except it supports translation" msgstr "" #: gajim/plugins/pluginmanager.py:611 gajim/plugins/pluginmanager.py:617 msgid "Archive corrupted" msgstr "" #: gajim/plugins/pluginmanager.py:613 #, fuzzy msgid "Archive empty" msgstr "O arquivo está vazio" #: gajim/plugins/pluginmanager.py:625 gajim/plugins/pluginmanager.py:633 #: gajim/plugins/gui.py:264 #, fuzzy msgid "Archive is malformed" msgstr "O serviço enviou dados inválidos" #: gajim/plugins/pluginmanager.py:641 gajim/plugins/gui.py:288 #: gajim/plugins/gui.py:296 #, fuzzy msgid "Plugin already exists" msgstr "Este arquivo já existe" #: gajim/plugins/gui.py:84 msgid "Plugin" msgstr "" #: gajim/plugins/gui.py:156 #, fuzzy, python-format msgid "Warning: %s" msgstr "Banindo %s" #: gajim/plugins/gui.py:213 #, fuzzy msgid "Plugin failed" msgstr "Falha ao registrar" #: gajim/plugins/gui.py:256 msgid "Unable to properly remove the plugin" msgstr "" #: gajim/plugins/gui.py:288 msgid "Overwrite?" msgstr "" #: gajim/plugins/gui.py:320 #, fuzzy msgid "Configuration" msgstr "Configuração da sala" #: data/org.gajim.Gajim.desktop.in:5 msgid "Jabber IM Client" msgstr "Um cliente de IM Jabber" #: data/org.gajim.Gajim.desktop.in:6 data/org.gajim.Gajim.appdata.xml.in:10 msgid "A GTK+ Jabber client" msgstr "Um cliente Jabber GTK+" #: data/org.gajim.Gajim.desktop.in:8 msgid "chat;messaging;im;xmpp;bonjour;voip;" msgstr "" #: data/org.gajim.Gajim.desktop.in:12 msgid "org.gajim.Gajim" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:12 msgid "" "Gajim is a chat client to be used with Jabber.org, Live Journal Talk, " "Nimbuzz, Ovi, Talkonaut, and thousands of other services run by companies " "and ISPs, and volunteers around the world." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:16 msgid "" "If you have a few accounts on different servers, if you want to be in " "contact with your friends and family all the time, then Gajim is for you." msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:19 #, fuzzy msgid "Features:" msgstr "Recursos" #: data/org.gajim.Gajim.appdata.xml.in:21 msgid "Tabbed chat window and single window modes" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:22 msgid "" "Group chat support (with Multi-User Chat protocol), invitation, chat to " "group chat transformation" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:23 msgid "Emoticons, avatars, PEP (user activity, mood and tune)" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:24 #, fuzzy msgid "Audio / video conferences" msgstr "Áudio / Vídeo" #: data/org.gajim.Gajim.appdata.xml.in:25 #, fuzzy msgid "File transfer, room bookmarks" msgstr "Erro na transferência de arquivos" #: data/org.gajim.Gajim.appdata.xml.in:26 msgid "Metacontacts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:27 msgid "Trayicon, speller, extended chat history functionalities" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:28 msgid "TLS, GPG and End-To-End encryption support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:29 msgid "Transport registration support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:30 #, fuzzy msgid "Service discovery including nodes, user search" msgstr "Buscar serviços usando conta %s" #: data/org.gajim.Gajim.appdata.xml.in:31 msgid "Wikipedia, dictionary and search engine lookup" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:32 msgid "Multiple accounts support" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:33 #, fuzzy msgid "XML console interface" msgstr "Console XML" #: data/org.gajim.Gajim.appdata.xml.in:34 msgid "Link local (bonjour / zeroconf), BOSH" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:35 msgid "Other features via plugins" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:47 #, fuzzy msgid "Roster, list of contacts" msgstr "_Log mudanças de status dos contatos" #: data/org.gajim.Gajim.appdata.xml.in:51 msgid "Tabbed chat window" msgstr "" #: data/org.gajim.Gajim.appdata.xml.in:55 #, fuzzy msgid "Group chat support" msgstr "Salas" #: data/org.gajim.Gajim.appdata.xml.in:59 #, fuzzy msgid "Chat history" msgstr "Recentemente:" #: data/org.gajim.Gajim.appdata.xml.in:63 #, fuzzy msgid "Plugin manager" msgstr "Falha ao registrar" #, fuzzy #~ msgid "" #~ "Install /\n" #~ "Upgrade" #~ msgstr "Parado" #, fuzzy #~ msgid "Install/Upgrade" #~ msgstr "Parado" #, fuzzy #~ msgid "Install and Upgrade Plugins" #~ msgstr "Parado" #, fuzzy #~ msgid "Plugins updates" #~ msgstr "Falha ao registrar" #, fuzzy #~ msgid "Security error during download" #~ msgstr "Erro de segurança ao conectar a \"%s\"" #, fuzzy #~ msgid "Error in download" #~ msgstr "Erro de segurança ao conectar a \"%s\"" #~ msgid "" #~ "Your configured emoticons theme has not been found, so emoticons have " #~ "been disabled." #~ msgstr "" #~ "Você configurou um tema de emoticons que não foi encontrado, então os " #~ "emoticons estão desativados." #~ msgid "Shows or hides the roster window" #~ msgstr "exibe ou esconder a janela principal" #~ msgid "Shows or hides the ipython window" #~ msgstr "Exibe ou esconder a janela ipython" #, fuzzy #~ msgid "XMPP account %s" #~ msgstr "Conta XMPP %s@%s" #, fuzzy #~ msgid "Exception" #~ msgstr "Descrição" #~ msgid "" #~ "someone@somewhere.com would like you to add some contacts " #~ "in your roster." #~ msgstr "" #~ "alguem@algumacoisa.com gostaria que você adicionasse alguns " #~ "contatos em sua lista de contatos." #~ msgid "" #~ "Ordered list (space separated) of connection type to try. Can contain " #~ "tls, ssl or plain" #~ msgstr "" #~ "Lista ordenada de tipos de conexão (separada por espaço) para tentar. " #~ "Pode conter tls, ssl ou simples" #~ msgid "_Actions" #~ msgstr "_Ações" #, fuzzy #~ msgid "Requires upower and python-dbus." #~ msgstr "Requer o python-dbus." #, fuzzy #~ msgid "Start Chat..." #~ msgstr "_Iniciar conversa..." #~ msgid "You are already in group chat %s" #~ msgstr "Você já está na conferência %s" #~ msgid "Join Group Chat with account %s" #~ msgstr "Ingressar numa conferência com a conta %s" #~ msgid "Invalid Account" #~ msgstr "Conta inválida" #~ msgid "" #~ "You have to choose an account from which you want to join the groupchat." #~ msgstr "Selecione a conta que você quer usar para para entrar na sala." #, fuzzy #~ msgid "Please enter the group chat JID as room@server." #~ msgstr "Por favor, digite o Jabber ID da conferência como sala@servidor." #, fuzzy #~ msgid "The group chat JID contains invalid characters." #~ msgstr "O Jabber ID da conferência possui caracteres não permitidos." #~ msgid "Start Chat with account %s" #~ msgstr "Iniciar uma conferência com a conta %s" #, fuzzy #~ msgid "" #~ "Fill in the nickname or the JID of the contact you would like\n" #~ "to send a chat message to:" #~ msgstr "" #~ "Digite o apelido ou o Jabber ID do contato para o qual\n" #~ "você quer enviar uma mensagem:" #, fuzzy #~ msgid "Nickname / JID" #~ msgstr "Jabber ID duplicado" #~ msgid "Unable to parse \"%s\"." #~ msgstr "Impossível gravar o arquivo em \"%s\"." #~ msgid "Shows the chat dialog so that you can send messages to a contact" #~ msgstr "" #~ "Exibe o diálogo do bate-papo onde você pode enviar mensagens para um " #~ "contato" #~ msgid "JID of the contact that you want to chat with" #~ msgstr "JID do contato que você quer conversar" #~ msgid "message content. The account must be specified or \"\"" #~ msgstr "conteúdo da mensagem. A conta deve estar especificada ou \"\"" #~ msgid "Adds contact to roster" #~ msgstr "Adicionar contato para a lista" #~ msgid "jid" #~ msgstr "JID" #~ msgid "Adds new contact to this account" #~ msgstr "Adicionar novo contato para esta conta" #~ msgid "Opens 'Start Chat' dialog" #~ msgstr "Abrir o diálogo 'Iniciar Conversa'" #~ msgid "Starts chat, using this account" #~ msgstr "Iniciar conversa, usando esta conta" #, fuzzy #~ msgid "Handle a xmpp:/ URI" #~ msgstr "Manipular uma URI xmpp:/" #~ msgid "URI to handle" #~ msgstr "URI a manipular" #~ msgid "Account in which you want to handle it" #~ msgstr "Selecione a conta na qual você quer manipular isto" #~ msgid "Message content" #~ msgstr "Conteúdo da mensagem" #~ msgid "Join a MUC room" #~ msgstr "Entrar em uma sala MUC" #~ msgid "Room JID" #~ msgstr "Sala JID" #~ msgid "Nickname to use" #~ msgstr "Apelido a ser usado" #~ msgid "Password to enter the room" #~ msgstr "Senhas para entrar na sala" #~ msgid "Account from which you want to enter the room" #~ msgstr "Selecione a conta que você quer para entrar na sala" #, fuzzy #~ msgid "Wrong URI" #~ msgstr "URI incorreta" #~ msgid "Nickname:" #~ msgstr "Apelido:" #~ msgid "Server:" #~ msgstr "Servidor:" #~ msgid "Password:" #~ msgstr "Senha:" #, fuzzy #~ msgid "Join this room _automatically when I connect" #~ msgstr "Entrar nesta sala automaticamente quando eu conectar" #, fuzzy #~ msgid "Bro_wse Rooms" #~ msgstr "_Navegar" #, fuzzy #~ msgid "Requires libgtkspell and libenchant." #~ msgstr "Requer libgtkspell." #, fuzzy #~ msgid "Network-Watcher" #~ msgstr "Network-manager" #~ msgid "Autodetection of network status." #~ msgstr "Detecção automática do status da rede." #, fuzzy #~ msgid "Requires gnome-network-manager" #~ msgstr "Requer gnome-network-manager e python-dbus." #, fuzzy #~ msgid "Feature not available, see Help->Features" #~ msgstr "Recurso não disponível no Windows." #, fuzzy #~ msgid "Send files" #~ msgstr "Enviar _arquivo" #~ msgid "This contact does not support file transfer." #~ msgstr "Este contato não suporta transferência de arquivo." #, fuzzy #~ msgid "You need to know the real JID of the contact to send them a file." #~ msgstr "" #~ "Você precisa saber o JID real do usuário para lhe enviar um arquivo." #~ msgid "" #~ "You have to install %s dictionary to use spellchecking, or choose another " #~ "language by setting the speller_language option." #~ msgstr "" #~ "Você precisa instalar o dicionário %s para usar a correção ortográfica ou " #~ "selecionar outro idioma ajustando a opção 'speller_language'." #~ msgid "Hides the buttons in chat windows." #~ msgstr "Esconder os botões nas janelas de conversa." #~ msgid "Change your nickname (Ctrl+N)" #~ msgstr "Alterar o seu apelido (Ctrl+N)" #~ msgid "Change the room's subject (Alt+T)" #~ msgstr "Alterar o assunto da sala (Alt+T)" #~ msgid "Bookmark this room (Ctrl+B)" #~ msgstr "Adicionar esta sala aos marcadores (Ctrl+B)" #~ msgid "Browse the chat history (Ctrl+H)" #~ msgstr "Pesquisar o histórico de conversas (Ctrl+H)" #, fuzzy #~ msgid "Show advanced functions (Alt+D)" #~ msgstr "Exibir um menu com funções avançadas (Alt+D)" #~ msgid "Add this contact to roster (Ctrl+D)" #~ msgstr "Adicionar este contato para a lista (Ctrl+D)" #~ msgid "Invite contacts to the conversation (Ctrl+G)" #~ msgstr "Convidar contatos para a conversa (Ctrl+G)" #, fuzzy #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Exibir o perfil do contato (Ctrl+I)" #~ msgid "Show the contact's profile (Ctrl+I)" #~ msgstr "Exibir o perfil do contato (Ctrl+I)" #~ msgid "Ma_ke message windows compact" #~ msgstr "T_ornar a janela de mensagem compacta" #~ msgid "Hide all buttons in chat windows" #~ msgstr "Esconder todos os botões nas janelas de conversa" #, fuzzy #~ msgid "Hide the chat buttons" #~ msgstr "Uso: /%s, esconde os botões do bate-papo." #~ msgid "" #~ "If True, Gajim will ask for avatar each contact that did not have an " #~ "avatar last time or has one cached that is too old." #~ msgstr "" #~ "Se verdadeiro, Gajim pedirá por avatar cada contato que não teve um " #~ "avatar ou tem um cache que é velho demais." #~ msgid "Disk Write Error" #~ msgstr "Erro de escrita em disco" #~ msgid "Set Custom _Avatar..." #~ msgstr "Definir _avatar personalizado..." #, fuzzy #~ msgid "SSL certificate validation" #~ msgstr "Validação de certificado SSL" #~ msgid "" #~ "A library used to validate server certificates to ensure a secure " #~ "connection." #~ msgstr "" #~ "Uma biblioteca usada para validar os certificados do servidor para " #~ "garantir uma conexão segura." #, fuzzy #~ msgid "Requires python-pyopenssl > 0.12 and pyasn1." #~ msgstr "Requer o python-pyopenssl." #, fuzzy #~ msgid "?CLI:room" #~ msgstr "sala" #, fuzzy #~ msgid "?CLI:nick" #~ msgstr "apelido" #, fuzzy #~ msgid "?CLI:password" #~ msgstr "senha" #~ msgid "Use D-Bus and Notification-Daemon to show notifications" #~ msgstr "Usar DBus e Notification-Daemon para exibir notificações" #~ msgid "Notification" #~ msgstr "Notificação" #~ msgid "Passive popups notifying for new events." #~ msgstr "Popups passivos notificando novos eventos." #~ msgid "" #~ "Requires python-notify or instead python-dbus in conjunction with " #~ "notification-daemon." #~ msgstr "" #~ "Requer python-notify ou então python-dbus em conjunto com notification-" #~ "daemon." #~ msgid "Ignore" #~ msgstr "Ignorar" #~ msgid "_Open Gmail Inbox" #~ msgstr "_Abrir caixa de entrada do GMail" #~ msgid "Notify on new _GMail email" #~ msgstr "Notificar cada nova mensagem do _GMail" #~ msgid "" #~ "If checked, Gajim will show a notification when a new e-mail is received " #~ "via GMail" #~ msgstr "" #~ "Se marcado, o Gajim irá exibir uma notificação quando um novo email via " #~ "GMail for recebido" #~ msgid "Display _extra email details" #~ msgstr "Exibir detalhes _extras dos emails" #, fuzzy #~ msgid "" #~ "If checked, Gajim will also include information about the sender of new " #~ "emails" #~ msgstr "" #~ "Se marcado, o Gajim também incluirá informação sobre o remetente de novos " #~ "emails" #~ msgid "GMail Options" #~ msgstr "Opções do GMail" #, fuzzy #~ msgid "20" #~ msgstr "0" #, fuzzy #~ msgid "Invited %s to %s" #~ msgstr "Enviar %s para %s" #~ msgid "GMail Email Received" #~ msgstr "Email do GMail recebido" #, fuzzy #~ msgid "New e-mail on %(gmail_mail_address)s" #~ msgstr "Novo email em %(gmail_mail_address)s" #, fuzzy #~ msgid "You have %d new e-mail conversation" #~ msgid_plural "You have %d new e-mail conversations" #~ msgstr[0] "Você tem %d nova mensagem de email" #~ msgstr[1] "Você tem %d novas mensagens de email" #~ msgid "" #~ "\n" #~ "\n" #~ "From: %(from_address)s\n" #~ "Subject: %(subject)s\n" #~ "%(snippet)s" #~ msgstr "" #~ "\n" #~ "\n" #~ "De: %(from_address)s\n" #~ "Assunto: %(subject)s\n" #~ "%(snippet)s" #~ msgid "Re_name" #~ msgstr "Re_nomear" #~ msgid "Resour_ce:" #~ msgstr "Recur_so:" #~ msgid "" #~ "Resource is sent to the Jabber server in order to separate the same JID " #~ "in two or more parts depending on the number of the clients connected in " #~ "the same server with the same account. So you might be connected in the " #~ "same account with resource 'Home' and 'Work' at the same time. The " #~ "resource which has the highest priority will get the events. (see below)" #~ msgstr "" #~ "Um recurso é enviado ao servidor jabber com o objetivo de 'separar' o " #~ "mesmo JID em duas ou mais partes dependendo do número de clientes " #~ "conectados no mesmo servidor com a mesma conta. Então você pode estar " #~ "conectado na mesma conta com o recurso 'Casa' e 'Trabalho' ao mesmo " #~ "tempo. O recurso que possuir a maior prioridade receberá os eventos. " #~ "(veja abaixo)" #~ msgid "A_djust to status" #~ msgstr "Aj_ustar para status" #~ msgid "Priority will change automatically according to your status." #~ msgstr "" #~ "A prioridade será alterada automaticamente de acordo com o seu status." #~ msgid "Anonymous authentication" #~ msgstr "Autenticação anônima" #~ msgid "" #~ "Priority is used in Jabber to determine who gets the events from the " #~ "jabber server when two or more clients are connected using the same " #~ "account; The client with the highest priority gets the events" #~ msgstr "" #~ "A prioridade é usada no Jabber para determinar quem recebe os eventos do " #~ "servidor jabber quando dois ou mais clientes estão conectados usando a " #~ "mesma conta; O cliente com a maior prioridade receberá os eventos" #, fuzzy #~ msgid "Synchronize contacts" #~ msgstr "Sincronizar contatos" #~ msgid "Click to request authorization to all contacts of another account" #~ msgstr "" #~ "Clique para requisitar autorização para todos os contatos de outra conta" #~ msgid "Chan_ge Password" #~ msgstr "A_lterar senha" #~ msgid "Click to change account's password" #~ msgstr "Clique para mudar a senha da conta" #~ msgid "Administration operations" #~ msgstr "Operações de administração" #, fuzzy #~ msgid "Browse..." #~ msgstr "_Navegar" #, fuzzy #~ msgid "Certificate is e_ncrypted" #~ msgstr "Certificado rejeitado" #~ msgid "" #~ "If checked, Gajim, when launched, will automatically connect to jabber " #~ "using this account" #~ msgstr "" #~ "Se marcado, o Gajim, quando carregado, irá conectar automaticamente ao " #~ "jabber usando esta conta" #, fuzzy #~ msgid "Synchronize logs with server" #~ msgstr "Sincronizar contatos" #~ msgid "Synch_ronize account status with global status" #~ msgstr "_Sincronizar status da conta com status global" #~ msgid "" #~ "If checked, any change to the global status (handled by the combobox at " #~ "the bottom of the roster window) will change the status of this account " #~ "accordingly" #~ msgstr "" #~ "Se marcada, o status deste cliente será alterado de acordo com qualquer " #~ "mudança no status global (definido pela caixa no fundo da janela da lista)" #~ msgid "" #~ "If checked, Gajim will also broadcast some more IPs except from just your " #~ "IP, so file transfer has higher chances of working." #~ msgstr "" #~ "Se marcado, o Gajim irá transmitir também alguns outros IP's exceto o " #~ "seu, então a transferência de arquivo tem grandes possibilidades de " #~ "executar corretamente." #~ msgid "Proxy" #~ msgstr "Proxy" #~ msgid "" #~ "Check this so Gajim will ask you before sending your password over an " #~ "insecure connection." #~ msgstr "" #~ "Marcando esta opção, o Gajim irá perguntar você antes de enviar sua senha " #~ "através de uma conexão não-segura." #~ msgid "Send _keep-alive packets" #~ msgstr "Enviar pacotes para manter a conexão (keep-alive)" #~ msgid "" #~ "If checked, Gajim will send keep-alive packets to prevent connection " #~ "timeout which results in disconnection" #~ msgstr "" #~ "Se marcado, o Gajim irá enviar pacotes keep-alive para prevenir timeout " #~ "na conexão, evitando-a cair" #~ msgid "Use cust_om hostname/port" #~ msgstr "Usa nome de máquina/porta personalizad_os" #~ msgid "_Hostname: " #~ msgstr "_Nome do computador:" #~ msgid "_Port: " #~ msgstr "_Porta:" #~ msgid "No key selected" #~ msgstr "Nenhuma chave selecionada" #~ msgid "Choose _Key..." #~ msgstr "_Escolha a chave..." #~ msgid "" #~ "If checked, Gajim will get the password from a GPG agent like seahorse" #~ msgstr "Se marcado, o Gajim obterá a senha de um agente GPG como o Seahorse" #~ msgid "OpenPGP" #~ msgstr "OpenPGP" #~ msgid "_Edit Personal Information..." #~ msgstr "_Editar detalhes pessoais..." #~ msgid "Information about you, as stored in the server" #~ msgstr "Informações sobre você são gravadas no servidor" #~ msgid "Personal Information" #~ msgstr "Informações pessoais" #~ msgid "Co_nnect on Gajim startup" #~ msgstr "Co_nectar na inicialização do Gajim" #~ msgid "Synchroni_ze account status with global status" #~ msgstr "Sincroni_zar status da conta com status global" #~ msgid "Use cust_om port:" #~ msgstr "Usar porta pers_onalizada:" #~ msgid "" #~ "If the default port that is used for incoming messages is unfitting for " #~ "your setup you can select another one here.\n" #~ "You might consider to change possible firewall settings." #~ msgstr "" #~ "Se a porta padrão usada para recebimento de mensagens não for adequada " #~ "você pode selecionar outra aqui.\n" #~ "Considere a possível modificação das regras do seu firewall." #~ msgid "Mer_ge accounts" #~ msgstr "Mes_clar contas" #~ msgid "OpenPGP is not usable on this computer" #~ msgstr "OpenPGP não disponível neste computador" #~ msgid "To change the account name, you must be disconnected." #~ msgstr "Para mudar o nome da conta, você deve estar desconectado." #~ msgid "To change the account name, you must read all pending events." #~ msgstr "" #~ "Para mudar o nome da conta, você deve ler todas os eventos pendentes." #~ msgid "Account Name Already Used" #~ msgstr "Nome de conta já está em uso" #~ msgid "" #~ "This name is already used by another of your accounts. Please choose " #~ "another name." #~ msgstr "" #~ "Este nome já está sendo usado por outra de suas contas. Por favor, " #~ "escolha outro nome." #~ msgid "Invalid account name" #~ msgstr "Nome de conta inválido" #~ msgid "Account name cannot be empty." #~ msgstr "Nome da conta não pode ser vazio." #~ msgid "Account name cannot contain spaces." #~ msgstr "Nome da conta não pode conter espaços." #~ msgid "Enter a new name for account %s" #~ msgstr "Entre com um novo nome para a conta %s" #, fuzzy #~ msgid "A JID must be in the form \"user@servername\"." #~ msgstr "" #~ "Um Jabber ID deve ter o seguinte formato \"usuario@nomedoservidor\"." #~ msgid "No such account available" #~ msgstr "Conta não disponível" #~ msgid "" #~ "You must create your account before editing your personal information." #~ msgstr "" #~ "Você deve primeiro criar sua conta antes de editar suas informações " #~ "pessoais." #~ msgid "Without a connection, you can not edit your personal information." #~ msgstr "Você deve estar conectado para editar suas informações pessoais." #, fuzzy #~ msgid "Your server does not have vCard support" #~ msgstr "Seu servidor não suporta Vcard" #~ msgid "Your server can't save your personal information." #~ msgstr "Seu servidor não pode salvar suas informações pessoais." #~ msgid "Account Local already exists." #~ msgstr "Conta local já existe." #~ msgid "Please rename or remove it before enabling link-local messaging." #~ msgstr "" #~ "Por favor renomeie ou remova-o antes de ativar troca de mensagens \"link-" #~ "local\"." #~ msgid "THANKS:" #~ msgstr "AGRADECIMENTOS:" #~ msgid "Could not write to %s. Session Management support will not work" #~ msgstr "" #~ "Não foi possível escrever em %s. O suporte de gerência da sessão não " #~ "funciona" #~ msgid "Jabber Traffic" #~ msgstr "Trafégo do Jabber" #~ msgid "_Enable" #~ msgstr "Ha_bilitar" #, fuzzy #~ msgid "Filter" #~ msgstr "Fonte" #~ msgid "_IQ" #~ msgstr "_IQ" #~ msgid "Info/Query" #~ msgstr "Info/Consulta" #~ msgid "_Message" #~ msgstr "_Mensagem" #~ msgid "XML Input" #~ msgstr "Entrada XML" #~ msgid "XML Console for %s" #~ msgstr "Console XML para %s" #, fuzzy #~ msgid "Idle for:" #~ msgstr "Console XML para %s" #, fuzzy #~ msgid "" #~ "Request offline status messages from all contacts upon connecting. " #~ "WARNING: This causes a lot of requests to be sent!" #~ msgstr "" #~ "Perguntar a mensagem de status para todos os contatos desconectados " #~ "quando a conexão com uma conta for estabelecida. AVISO: Isto pode " #~ "resultar em muitas requisições a serem enviadas." #~ msgid "Last status: %s" #~ msgstr "Último status: %s" #~ msgid " since %s" #~ msgstr " desde %s" #~ msgid "since %s" #~ msgstr "desde %s" #, fuzzy #~ msgid "No" #~ msgstr "Nenhum" #, fuzzy #~ msgid "Prefer" #~ msgstr "Preferências" #, fuzzy #~ msgid "Auto" #~ msgstr "Ingresso automático" #, fuzzy #~ msgid "otr" #~ msgstr "Quente" #, fuzzy #~ msgid "Invalid expire value" #~ msgstr "Nome do servidor inválido" #, fuzzy #~ msgid "There is an error" #~ msgstr "O serviço retornou um erro." #~ msgid "How many minutes should last lines from previous conversation last." #~ msgstr "Quantos minutos exibir as últimas linhas da conversação anterior." #~ msgid "" #~ "Your configured emoticons theme cannot been loaded. You maybe need to " #~ "update the format of emoticons.py file. See http://trac.gajim.org/wiki/" #~ "Emoticons for more details." #~ msgstr "" #~ "Você configurou um tema de emoticons que não podem ser carregados. Você " #~ "pode precisar atualizar o formato do arquivo emoticons.py. Veja http://" #~ "trac.gajim.org/wiki/Emoticons para mais detalhes." #~ msgid "You will be connected to %s without OpenPGP." #~ msgstr "Você será conectado ao %s sem OpenPGP." #~ msgid "The following message was NOT encrypted" #~ msgstr "A seguinte mensagem NÃO estava criptografada" #, fuzzy #~ msgid "Encryption used for this contact." #~ msgstr "Habilitar criptografia ESessions para esta conta." #~ msgid "Toggle Open_PGP Encryption" #~ msgstr "Ativar criptografia Open_PGP" #~ msgid "Toggle End to End Encryption" #~ msgstr "Alternar para criptografia End to End" #, fuzzy #~ msgid "OpenPGP encryption enabled" #~ msgstr "Criptografia GPG habilitada" #, fuzzy #~ msgid "No OpenPGP key assigned" #~ msgstr "Nenhuma chave GPG atribuída" #, fuzzy #~ msgid "" #~ "No OpenPGP key is assigned to this contact. So you cannot encrypt " #~ "messages with OpenPGP." #~ msgstr "" #~ "Nenhuma chave GPG está atribuída para este contato. Você não poderá " #~ "criptografar mensagem com GPG." #, fuzzy #~ msgid "OpenPGP encryption disabled" #~ msgstr "Criptografia GPG desabilitada" #~ msgid "Session WILL be logged" #~ msgstr "A sessão SERÁ gravada" #~ msgid "Session WILL NOT be logged" #~ msgstr "A sessão NÃO SERÁ gravada" #~ msgid "is" #~ msgstr "está" #~ msgid "is NOT" #~ msgstr "NÃO está" #~ msgid "will" #~ msgstr "será" #~ msgid "will NOT" #~ msgstr "NÃO será" #~ msgid "The following message was encrypted" #~ msgstr "A seguinte mensagem estava criptografada" #, fuzzy #~ msgid "Toggle the OpenPGP encryption" #~ msgstr "Ativar criptografia Open_PGP" #~ msgid "Is OpenPGP enabled for this contact?" #~ msgstr "O OpenPGP está ativado para este contato?" #~ msgid "" #~ "Should Gajim automatically start an encrypted session with this contact " #~ "when possible?" #~ msgstr "" #~ "O Gajim deve iniciar automaticamente uma sessão criptografada com este " #~ "contato quando possível?" #~ msgid "Neither the remote presence is signed, nor a key was assigned." #~ msgstr "Nem a presença remota está assinada, nem uma chave foi atribuída." #~ msgid "The contact's key (%s) does not match the key assigned in Gajim." #~ msgstr "" #~ "A chave do contato (%s) não coincide com a chave atribuída no Gajim." #~ msgid "[This message is *encrypted* (See :XEP:`27`]" #~ msgstr "[Esta mensagem está *criptografada* (Veja :XEP:`27`)]" #~ msgid "" #~ "Your chat session with %(jid)s is encrypted.\n" #~ "\n" #~ "This session's Short Authentication String is %(sas)s." #~ msgstr "" #~ "Sua conversa com %(jid)s será criptografada.\n" #~ "\n" #~ "A String Curta de Autenticação (SAS) da sessão é %(sas)s." #~ msgid "You have already verified this contact's identity." #~ msgstr "Você já verificou a identidade deste contato." #~ msgid "Contact's identity verified" #~ msgstr "Identidade do contato verificada" #, fuzzy #~ msgid "Verify again…" #~ msgstr "Verificar novamente..." #~ msgid "" #~ "To be certain that only the expected person can read your messages " #~ "or send you messages, you need to verify their identity by clicking the " #~ "button below." #~ msgstr "" #~ "Para ter certeza que somente a pessoa esperada pode ler suas " #~ "mensagens e enviar mensagens, você precisa verificar a identidade dela " #~ "clicando no botão abaixo." #~ msgid "Contact's identity NOT verified" #~ msgstr "A identidade do contato NÃO foi verificada" #, fuzzy #~ msgid "Verify…" #~ msgstr "_Verificar" #~ msgid "Have you verified the contact's identity?" #~ msgstr "Você verificou a identidade deste contato?" #~ msgid "" #~ "To prevent talking to an unknown person, you should speak to %(jid)s directly (in person or on the phone) and verify that they see the same " #~ "Short Authentication String (SAS) as you.\n" #~ "\n" #~ "This session's Short Authentication String is %(sas)s." #~ msgstr "" #~ "Para evitar falar com uma pessoa desconhecida, você deve falar com " #~ "%(jid)s diretamente (em pessoa ou por telefone) e verificar se eles " #~ "vêem a mesma String de Autenticação Curta (SAS), como você.\n" #~ "\n" #~ "Esta String de Autenticação Curta é %(sas)s." #~ msgid "Did you talk to the remote contact and verify the SAS?" #~ msgstr "Você quer falar com o contato remoto e verificar a SAS?" #~ msgid "" #~ "The contact's key (%s) does not match the key assigned in Gajim." #~ msgstr "" #~ "A chave do contato (%s) não corresponde com a chave atribuída no " #~ "Gajim." #, fuzzy #~ msgid "" #~ "No OpenPGP key is assigned to this contact. So you cannot encrypt " #~ "messages." #~ msgstr "" #~ "Nenhuma chave GPG está atribuída para este contato. Então, você não pode " #~ "criptografar mensagens." #, fuzzy #~ msgid "" #~ "OpenPGP key is assigned to this contact, but you do not trust their " #~ "key, so message cannot be encrypted. Use your OpenPGP client " #~ "to trust their key." #~ msgstr "" #~ "Uma chave GPG está atribuída para este contato, mas você não validou " #~ "nesta chave, então as mensagens não podem ser criptografadas. " #~ "Use seu cliente de GPG para validar esta chave." #, fuzzy #~ msgid "" #~ "OpenPGP Key is assigned to this contact, and you trust their key, so " #~ "messages will be encrypted." #~ msgstr "" #~ "A chave GPG está atribuída para este contato, e você validou esta chave, " #~ "então as mensagens serão criptografadas." #~ msgid "" #~ "This icon indicates that this message has not yet\n" #~ "been received by the remote end. If this icon stays\n" #~ "for a long time, it's likely the message got lost." #~ msgstr "" #~ "Este ícone indica que esta mensagem ainda não foi \n" #~ "recebida por um fim remoto. Se este ícone continuar\n" #~ "por muito tempo, isso indica que a mensagem foi perdida." #~ msgid "" #~ "If True, listen to D-Bus signals from NetworkManager and change the " #~ "status of accounts (provided they do not have listen_to_network_manager " #~ "set to False and they sync with global status) based upon the status of " #~ "the network connection." #~ msgstr "" #~ "Se verdadeiro, ouve aos sinais do D-Bus do NetworkManager e altera os " #~ "status das contas (fornecido se eles não tiverem a opção " #~ "listen_to_network_manager configurado para Falso e se estiverem " #~ "sincronizadas com o status global) baseado no status da conexão de rede." #~ msgid "" #~ "The database file (%s) cannot be read. Try to repair it or remove it (all " #~ "history will be lost)." #~ msgstr "" #~ "O arquivo da base de dados (%s) não pode ser lido. Tente repará-lo ou " #~ "removê-lo. (todo o histórico será perdido)." #~ msgid "Database cannot be read." #~ msgstr "A base de dados não pôde ser lida." #~ msgid "A message from a non-valid JID arrived, it has been ignored." #~ msgstr "Uma mensagem de um JID não-valido recebida, ela foi ignorada." #~ msgid "Smooth scroll message in conversation window" #~ msgstr "Suavizar a rolagem de mensagens na janela de conversação" #~ msgid "Show _XML Console" #~ msgstr "Exibir console _XML" #~ msgid "Edit _Privacy Lists..." #~ msgstr "Editar listas de _privacidade..." #~ msgid "_Administrator" #~ msgstr "_Administrador" #~ msgid "Sends a message to users currently connected to this server" #~ msgstr "" #~ "Envia uma mensagem para os usuários atualmente conectados a este servidor" #~ msgid "Sets Message of the Day" #~ msgstr "Configurar mensagem do dia" #~ msgid "Updates Message of the Day" #~ msgstr "Atualizar mensagem do dia" #~ msgid "Deletes Message of the Day" #~ msgstr "Excluir mensagem do dia" #~ msgid "Add _Contact..." #~ msgstr "Adicionar _contato..." #~ msgid "_Accounts" #~ msgstr "Cont_as" #~ msgid "Profile, A_vatar" #~ msgstr "Perfil, A_vatar" #~ msgid "File _Transfers" #~ msgstr "Transferência de _arquivos" #~ msgid "Help online" #~ msgstr "Ajuda online" #~ msgid "Frequently Asked Questions (online)" #~ msgstr "Perguntas freqüentes (online)" #~ msgid "Fea_tures" #~ msgstr "Re_cursos" #~ msgid "to %s account" #~ msgstr "para %s conta" #~ msgid "using %s account" #~ msgstr "usando %s conta" #~ msgid "of account %s" #~ msgstr "da conta %s" #~ msgid "for account %s" #~ msgstr "para conta %s" #~ msgid "" #~ "By removing this contact you also remove authorization resulting in him " #~ "or her always seeing you as offline." #~ msgstr "" #~ "Removendo este contato, você também removerá a autorização, resultando em " #~ "ele ou ela sempre o verá offiline." #~ msgid "Message Body